diff options
author | David S. Miller <davem@davemloft.net> | 2008-03-18 02:44:31 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-03-18 02:44:31 -0400 |
commit | 2f633928cbba8a5858bb39b11e7219a41b0fbef5 (patch) | |
tree | 9a82f4b7f2c3afe4b0208d8e44ea61bae90a7d22 | |
parent | 5e226e4d9016daee170699f8a4188a5505021756 (diff) | |
parent | bde4f8fa8db2abd5ac9c542d76012d0fedab050f (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
949 files changed, 15536 insertions, 11533 deletions
diff --git a/.gitignore b/.gitignore index 8363e48cdcdc..fdcce40226d7 100644 --- a/.gitignore +++ b/.gitignore | |||
@@ -53,3 +53,5 @@ cscope.* | |||
53 | 53 | ||
54 | *.orig | 54 | *.orig |
55 | *.rej | 55 | *.rej |
56 | *~ | ||
57 | \#*# | ||
diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index 30b327a116ea..fc8e7c7d182f 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX | |||
@@ -183,8 +183,6 @@ i386/ | |||
183 | - directory with info about Linux on Intel 32 bit architecture. | 183 | - directory with info about Linux on Intel 32 bit architecture. |
184 | ia64/ | 184 | ia64/ |
185 | - directory with info about Linux on Intel 64 bit architecture. | 185 | - directory with info about Linux on Intel 64 bit architecture. |
186 | ide.txt | ||
187 | - important info for users of ATA devices (IDE/EIDE disks and CD-ROMS). | ||
188 | infiniband/ | 186 | infiniband/ |
189 | - directory with documents concerning Linux InfiniBand support. | 187 | - directory with documents concerning Linux InfiniBand support. |
190 | initrd.txt | 188 | initrd.txt |
@@ -227,8 +225,6 @@ kprobes.txt | |||
227 | - documents the kernel probes debugging feature. | 225 | - documents the kernel probes debugging feature. |
228 | kref.txt | 226 | kref.txt |
229 | - docs on adding reference counters (krefs) to kernel objects. | 227 | - docs on adding reference counters (krefs) to kernel objects. |
230 | laptop-mode.txt | ||
231 | - how to conserve battery power using laptop-mode. | ||
232 | laptops/ | 228 | laptops/ |
233 | - directory with laptop related info and laptop driver documentation. | 229 | - directory with laptop related info and laptop driver documentation. |
234 | ldm.txt | 230 | ldm.txt |
@@ -303,12 +299,8 @@ pcmcia/ | |||
303 | - info on the Linux PCMCIA driver. | 299 | - info on the Linux PCMCIA driver. |
304 | pi-futex.txt | 300 | pi-futex.txt |
305 | - documentation on lightweight PI-futexes. | 301 | - documentation on lightweight PI-futexes. |
306 | pm.txt | ||
307 | - info on Linux power management support. | ||
308 | pnp.txt | 302 | pnp.txt |
309 | - Linux Plug and Play documentation. | 303 | - Linux Plug and Play documentation. |
310 | power_supply_class.txt | ||
311 | - Tells userspace about battery, UPS, AC or DC power supply properties | ||
312 | power/ | 304 | power/ |
313 | - directory with info on Linux PCI power management. | 305 | - directory with info on Linux PCI power management. |
314 | powerpc/ | 306 | powerpc/ |
diff --git a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl index f31601e8bd89..dc0f30c3e571 100644 --- a/Documentation/DocBook/kernel-api.tmpl +++ b/Documentation/DocBook/kernel-api.tmpl | |||
@@ -361,12 +361,14 @@ X!Edrivers/pnp/system.c | |||
361 | <chapter id="blkdev"> | 361 | <chapter id="blkdev"> |
362 | <title>Block Devices</title> | 362 | <title>Block Devices</title> |
363 | !Eblock/blk-core.c | 363 | !Eblock/blk-core.c |
364 | !Iblock/blk-core.c | ||
364 | !Eblock/blk-map.c | 365 | !Eblock/blk-map.c |
365 | !Iblock/blk-sysfs.c | 366 | !Iblock/blk-sysfs.c |
366 | !Eblock/blk-settings.c | 367 | !Eblock/blk-settings.c |
367 | !Eblock/blk-exec.c | 368 | !Eblock/blk-exec.c |
368 | !Eblock/blk-barrier.c | 369 | !Eblock/blk-barrier.c |
369 | !Eblock/blk-tag.c | 370 | !Eblock/blk-tag.c |
371 | !Iblock/blk-tag.c | ||
370 | </chapter> | 372 | </chapter> |
371 | 373 | ||
372 | <chapter id="chrdev"> | 374 | <chapter id="chrdev"> |
diff --git a/Documentation/acpi/dsdt-override.txt b/Documentation/acpi/dsdt-override.txt index 5008f256a2db..febbb1ba4d23 100644 --- a/Documentation/acpi/dsdt-override.txt +++ b/Documentation/acpi/dsdt-override.txt | |||
@@ -1,15 +1,7 @@ | |||
1 | Linux supports two methods of overriding the BIOS DSDT: | 1 | Linux supports a method of overriding the BIOS DSDT: |
2 | 2 | ||
3 | CONFIG_ACPI_CUSTOM_DSDT builds the image into the kernel. | 3 | CONFIG_ACPI_CUSTOM_DSDT builds the image into the kernel. |
4 | 4 | ||
5 | CONFIG_ACPI_CUSTOM_DSDT_INITRD adds the image to the initrd. | 5 | When to use this method is described in detail on the |
6 | |||
7 | When to use these methods is described in detail on the | ||
8 | Linux/ACPI home page: | 6 | Linux/ACPI home page: |
9 | http://www.lesswatts.org/projects/acpi/overridingDSDT.php | 7 | http://www.lesswatts.org/projects/acpi/overridingDSDT.php |
10 | |||
11 | Note that if both options are used, the DSDT supplied | ||
12 | by the INITRD method takes precedence. | ||
13 | |||
14 | Documentation/initramfs-add-dsdt.sh is provided for convenience | ||
15 | for use with the CONFIG_ACPI_CUSTOM_DSDT_INITRD method. | ||
diff --git a/Documentation/acpi/initramfs-add-dsdt.sh b/Documentation/acpi/initramfs-add-dsdt.sh deleted file mode 100755 index 17ef6e838e14..000000000000 --- a/Documentation/acpi/initramfs-add-dsdt.sh +++ /dev/null | |||
@@ -1,43 +0,0 @@ | |||
1 | #!/bin/bash | ||
2 | # Adds a DSDT file to the initrd (if it's an initramfs) | ||
3 | # first argument is the name of archive | ||
4 | # second argument is the name of the file to add | ||
5 | # The file will be copied as /DSDT.aml | ||
6 | |||
7 | # 20060126: fix "Premature end of file" with some old cpio (Roland Robic) | ||
8 | # 20060205: this time it should really work | ||
9 | |||
10 | # check the arguments | ||
11 | if [ $# -ne 2 ]; then | ||
12 | program_name=$(basename $0) | ||
13 | echo "\ | ||
14 | $program_name: too few arguments | ||
15 | Usage: $program_name initrd-name.img DSDT-to-add.aml | ||
16 | Adds a DSDT file to an initrd (in initramfs format) | ||
17 | |||
18 | initrd-name.img: filename of the initrd in initramfs format | ||
19 | DSDT-to-add.aml: filename of the DSDT file to add | ||
20 | " 1>&2 | ||
21 | exit 1 | ||
22 | fi | ||
23 | |||
24 | # we should check it's an initramfs | ||
25 | |||
26 | tempcpio=$(mktemp -d) | ||
27 | # cleanup on exit, hangup, interrupt, quit, termination | ||
28 | trap 'rm -rf $tempcpio' 0 1 2 3 15 | ||
29 | |||
30 | # extract the archive | ||
31 | gunzip -c "$1" > "$tempcpio"/initramfs.cpio || exit 1 | ||
32 | |||
33 | # copy the DSDT file at the root of the directory so that we can call it "/DSDT.aml" | ||
34 | cp -f "$2" "$tempcpio"/DSDT.aml | ||
35 | |||
36 | # add the file | ||
37 | cd "$tempcpio" | ||
38 | (echo DSDT.aml | cpio --quiet -H newc -o -A -O "$tempcpio"/initramfs.cpio) || exit 1 | ||
39 | cd "$OLDPWD" | ||
40 | |||
41 | # re-compress the archive | ||
42 | gzip -c "$tempcpio"/initramfs.cpio > "$1" | ||
43 | |||
diff --git a/Documentation/cdrom/ide-cd b/Documentation/cdrom/ide-cd index 29721bfcde12..91c0dcc6fa5c 100644 --- a/Documentation/cdrom/ide-cd +++ b/Documentation/cdrom/ide-cd | |||
@@ -45,7 +45,7 @@ This driver provides the following features: | |||
45 | --------------- | 45 | --------------- |
46 | 46 | ||
47 | 0. The ide-cd relies on the ide disk driver. See | 47 | 0. The ide-cd relies on the ide disk driver. See |
48 | Documentation/ide.txt for up-to-date information on the ide | 48 | Documentation/ide/ide.txt for up-to-date information on the ide |
49 | driver. | 49 | driver. |
50 | 50 | ||
51 | 1. Make sure that the ide and ide-cd drivers are compiled into the | 51 | 1. Make sure that the ide and ide-cd drivers are compiled into the |
@@ -64,7 +64,7 @@ This driver provides the following features: | |||
64 | 64 | ||
65 | Depending on what type of IDE interface you have, you may need to | 65 | Depending on what type of IDE interface you have, you may need to |
66 | specify additional configuration options. See | 66 | specify additional configuration options. See |
67 | Documentation/ide.txt. | 67 | Documentation/ide/ide.txt. |
68 | 68 | ||
69 | 2. You should also ensure that the iso9660 filesystem is either | 69 | 2. You should also ensure that the iso9660 filesystem is either |
70 | compiled into the kernel or available as a loadable module. You | 70 | compiled into the kernel or available as a loadable module. You |
@@ -84,7 +84,7 @@ This driver provides the following features: | |||
84 | on the primary IDE interface are called `hda' and `hdb', | 84 | on the primary IDE interface are called `hda' and `hdb', |
85 | respectively. The drives on the secondary interface are called | 85 | respectively. The drives on the secondary interface are called |
86 | `hdc' and `hdd'. (Interfaces at other locations get other letters | 86 | `hdc' and `hdd'. (Interfaces at other locations get other letters |
87 | in the third position; see Documentation/ide.txt.) | 87 | in the third position; see Documentation/ide/ide.txt.) |
88 | 88 | ||
89 | If you want your CDROM drive to be found automatically by the | 89 | If you want your CDROM drive to be found automatically by the |
90 | driver, you should make sure your IDE interface uses either the | 90 | driver, you should make sure your IDE interface uses either the |
@@ -93,7 +93,7 @@ This driver provides the following features: | |||
93 | be jumpered as `master'. (If for some reason you cannot configure | 93 | be jumpered as `master'. (If for some reason you cannot configure |
94 | your system in this manner, you can probably still use the driver. | 94 | your system in this manner, you can probably still use the driver. |
95 | You may have to pass extra configuration information to the kernel | 95 | You may have to pass extra configuration information to the kernel |
96 | when you boot, however. See Documentation/ide.txt for more | 96 | when you boot, however. See Documentation/ide/ide.txt for more |
97 | information.) | 97 | information.) |
98 | 98 | ||
99 | 4. Boot the system. If the drive is recognized, you should see a | 99 | 4. Boot the system. If the drive is recognized, you should see a |
@@ -201,7 +201,7 @@ TEST | |||
201 | This section discusses some common problems encountered when trying to | 201 | This section discusses some common problems encountered when trying to |
202 | use the driver, and some possible solutions. Note that if you are | 202 | use the driver, and some possible solutions. Note that if you are |
203 | experiencing problems, you should probably also review | 203 | experiencing problems, you should probably also review |
204 | Documentation/ide.txt for current information about the underlying | 204 | Documentation/ide/ide.txt for current information about the underlying |
205 | IDE support code. Some of these items apply only to earlier versions | 205 | IDE support code. Some of these items apply only to earlier versions |
206 | of the driver, but are mentioned here for completeness. | 206 | of the driver, but are mentioned here for completeness. |
207 | 207 | ||
@@ -211,7 +211,7 @@ from the driver. | |||
211 | a. Drive is not detected during booting. | 211 | a. Drive is not detected during booting. |
212 | 212 | ||
213 | - Review the configuration instructions above and in | 213 | - Review the configuration instructions above and in |
214 | Documentation/ide.txt, and check how your hardware is | 214 | Documentation/ide/ide.txt, and check how your hardware is |
215 | configured. | 215 | configured. |
216 | 216 | ||
217 | - If your drive is the only device on an IDE interface, it should | 217 | - If your drive is the only device on an IDE interface, it should |
@@ -219,7 +219,7 @@ a. Drive is not detected during booting. | |||
219 | 219 | ||
220 | - If your IDE interface is not at the standard addresses of 0x170 | 220 | - If your IDE interface is not at the standard addresses of 0x170 |
221 | or 0x1f0, you'll need to explicitly inform the driver using a | 221 | or 0x1f0, you'll need to explicitly inform the driver using a |
222 | lilo option. See Documentation/ide.txt. (This feature was | 222 | lilo option. See Documentation/ide/ide.txt. (This feature was |
223 | added around kernel version 1.3.30.) | 223 | added around kernel version 1.3.30.) |
224 | 224 | ||
225 | - If the autoprobing is not finding your drive, you can tell the | 225 | - If the autoprobing is not finding your drive, you can tell the |
@@ -245,7 +245,7 @@ a. Drive is not detected during booting. | |||
245 | Support for some interfaces needing extra initialization is | 245 | Support for some interfaces needing extra initialization is |
246 | provided in later 1.3.x kernels. You may need to turn on | 246 | provided in later 1.3.x kernels. You may need to turn on |
247 | additional kernel configuration options to get them to work; | 247 | additional kernel configuration options to get them to work; |
248 | see Documentation/ide.txt. | 248 | see Documentation/ide/ide.txt. |
249 | 249 | ||
250 | Even if support is not available for your interface, you may be | 250 | Even if support is not available for your interface, you may be |
251 | able to get it to work with the following procedure. First boot | 251 | able to get it to work with the following procedure. First boot |
@@ -299,7 +299,7 @@ c. System hangups. | |||
299 | be worked around by specifying the `serialize' option when | 299 | be worked around by specifying the `serialize' option when |
300 | booting. Recent kernels should be able to detect the need for | 300 | booting. Recent kernels should be able to detect the need for |
301 | this automatically in most cases, but the detection is not | 301 | this automatically in most cases, but the detection is not |
302 | foolproof. See Documentation/ide.txt for more information | 302 | foolproof. See Documentation/ide/ide.txt for more information |
303 | about the `serialize' option and the CMD640B. | 303 | about the `serialize' option and the CMD640B. |
304 | 304 | ||
305 | - Note that many MS-DOS CDROM drivers will work with such buggy | 305 | - Note that many MS-DOS CDROM drivers will work with such buggy |
diff --git a/Documentation/controllers/memory.txt b/Documentation/controllers/memory.txt index 6015347b41e2..866b9cd9a959 100644 --- a/Documentation/controllers/memory.txt +++ b/Documentation/controllers/memory.txt | |||
@@ -1,4 +1,8 @@ | |||
1 | Memory Controller | 1 | Memory Resource Controller |
2 | |||
3 | NOTE: The Memory Resource Controller has been generically been referred | ||
4 | to as the memory controller in this document. Do not confuse memory controller | ||
5 | used here with the memory controller that is used in hardware. | ||
2 | 6 | ||
3 | Salient features | 7 | Salient features |
4 | 8 | ||
@@ -152,7 +156,7 @@ The memory controller uses the following hierarchy | |||
152 | 156 | ||
153 | a. Enable CONFIG_CGROUPS | 157 | a. Enable CONFIG_CGROUPS |
154 | b. Enable CONFIG_RESOURCE_COUNTERS | 158 | b. Enable CONFIG_RESOURCE_COUNTERS |
155 | c. Enable CONFIG_CGROUP_MEM_CONT | 159 | c. Enable CONFIG_CGROUP_MEM_RES_CTLR |
156 | 160 | ||
157 | 1. Prepare the cgroups | 161 | 1. Prepare the cgroups |
158 | # mkdir -p /cgroups | 162 | # mkdir -p /cgroups |
@@ -164,7 +168,7 @@ c. Enable CONFIG_CGROUP_MEM_CONT | |||
164 | 168 | ||
165 | Since now we're in the 0 cgroup, | 169 | Since now we're in the 0 cgroup, |
166 | We can alter the memory limit: | 170 | We can alter the memory limit: |
167 | # echo -n 4M > /cgroups/0/memory.limit_in_bytes | 171 | # echo 4M > /cgroups/0/memory.limit_in_bytes |
168 | 172 | ||
169 | NOTE: We can use a suffix (k, K, m, M, g or G) to indicate values in kilo, | 173 | NOTE: We can use a suffix (k, K, m, M, g or G) to indicate values in kilo, |
170 | mega or gigabytes. | 174 | mega or gigabytes. |
@@ -185,7 +189,7 @@ number of factors, such as rounding up to page boundaries or the total | |||
185 | availability of memory on the system. The user is required to re-read | 189 | availability of memory on the system. The user is required to re-read |
186 | this file after a write to guarantee the value committed by the kernel. | 190 | this file after a write to guarantee the value committed by the kernel. |
187 | 191 | ||
188 | # echo -n 1 > memory.limit_in_bytes | 192 | # echo 1 > memory.limit_in_bytes |
189 | # cat memory.limit_in_bytes | 193 | # cat memory.limit_in_bytes |
190 | 4096 | 194 | 4096 |
191 | 195 | ||
@@ -197,7 +201,7 @@ caches, RSS and Active pages/Inactive pages are shown. | |||
197 | 201 | ||
198 | The memory.force_empty gives an interface to drop *all* charges by force. | 202 | The memory.force_empty gives an interface to drop *all* charges by force. |
199 | 203 | ||
200 | # echo -n 1 > memory.force_empty | 204 | # echo 1 > memory.force_empty |
201 | 205 | ||
202 | will drop all charges in cgroup. Currently, this is maintained for test. | 206 | will drop all charges in cgroup. Currently, this is maintained for test. |
203 | 207 | ||
diff --git a/Documentation/debugging-via-ohci1394.txt b/Documentation/debugging-via-ohci1394.txt index de4804e8b396..c360d4e91b48 100644 --- a/Documentation/debugging-via-ohci1394.txt +++ b/Documentation/debugging-via-ohci1394.txt | |||
@@ -36,14 +36,15 @@ available (notebooks) or too slow for extensive debug information (like ACPI). | |||
36 | Drivers | 36 | Drivers |
37 | ------- | 37 | ------- |
38 | 38 | ||
39 | The OHCI-1394 drivers in drivers/firewire and drivers/ieee1394 initialize | 39 | The ohci1394 driver in drivers/ieee1394 initializes the OHCI-1394 controllers |
40 | the OHCI-1394 controllers to a working state and can be used to enable | 40 | to a working state and enables physical DMA by default for all remote nodes. |
41 | physical DMA. By default you only have to load the driver, and physical | 41 | This can be turned off by ohci1394's module parameter phys_dma=0. |
42 | DMA access will be granted to all remote nodes, but it can be turned off | 42 | |
43 | when using the ohci1394 driver. | 43 | The alternative firewire-ohci driver in drivers/firewire uses filtered physical |
44 | 44 | DMA, hence is not yet suitable for remote debugging. | |
45 | Because these drivers depend on the PCI enumeration to be completed, an | 45 | |
46 | initialization routine which can runs pretty early (long before console_init(), | 46 | Because ohci1394 depends on the PCI enumeration to be completed, an |
47 | initialization routine which runs pretty early (long before console_init() | ||
47 | which makes the printk buffer appear on the console can be called) was written. | 48 | which makes the printk buffer appear on the console can be called) was written. |
48 | 49 | ||
49 | To activate it, enable CONFIG_PROVIDE_OHCI1394_DMA_INIT (Kernel hacking menu: | 50 | To activate it, enable CONFIG_PROVIDE_OHCI1394_DMA_INIT (Kernel hacking menu: |
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 4d3aa519eadf..c1d1fd0c299b 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -172,6 +172,16 @@ Who: Len Brown <len.brown@intel.com> | |||
172 | 172 | ||
173 | --------------------------- | 173 | --------------------------- |
174 | 174 | ||
175 | What: ide-tape driver | ||
176 | When: July 2008 | ||
177 | Files: drivers/ide/ide-tape.c | ||
178 | Why: This driver might not have any users anymore and maintaining it for no | ||
179 | reason is an effort no one wants to make. | ||
180 | Who: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>, Borislav Petkov | ||
181 | <petkovbb@googlemail.com> | ||
182 | |||
183 | --------------------------- | ||
184 | |||
175 | What: libata spindown skipping and warning | 185 | What: libata spindown skipping and warning |
176 | When: Dec 2008 | 186 | When: Dec 2008 |
177 | Why: Some halt(8) implementations synchronize caches for and spin | 187 | Why: Some halt(8) implementations synchronize caches for and spin |
@@ -306,3 +316,15 @@ Why: Largely unmaintained and almost entirely unused. File system | |||
306 | is largely pointless as without a lot of work only the most | 316 | is largely pointless as without a lot of work only the most |
307 | trivial of Solaris binaries can work with the emulation code. | 317 | trivial of Solaris binaries can work with the emulation code. |
308 | Who: David S. Miller <davem@davemloft.net> | 318 | Who: David S. Miller <davem@davemloft.net> |
319 | |||
320 | --------------------------- | ||
321 | |||
322 | What: init_mm export | ||
323 | When: 2.6.26 | ||
324 | Why: Not used in-tree. The current out-of-tree users used it to | ||
325 | work around problems in the CPA code which should be resolved | ||
326 | by now. One usecase was described to provide verification code | ||
327 | of the CPA operation. That's a good idea in general, but such | ||
328 | code / infrastructure should be in the kernel and not in some | ||
329 | out-of-tree driver. | ||
330 | Who: Thomas Gleixner <tglx@linutronix.de> | ||
diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index 5681e2fa1496..518ebe609e2b 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt | |||
@@ -1506,13 +1506,13 @@ laptop_mode | |||
1506 | ----------- | 1506 | ----------- |
1507 | 1507 | ||
1508 | laptop_mode is a knob that controls "laptop mode". All the things that are | 1508 | laptop_mode is a knob that controls "laptop mode". All the things that are |
1509 | controlled by this knob are discussed in Documentation/laptop-mode.txt. | 1509 | controlled by this knob are discussed in Documentation/laptops/laptop-mode.txt. |
1510 | 1510 | ||
1511 | block_dump | 1511 | block_dump |
1512 | ---------- | 1512 | ---------- |
1513 | 1513 | ||
1514 | block_dump enables block I/O debugging when set to a nonzero value. More | 1514 | block_dump enables block I/O debugging when set to a nonzero value. More |
1515 | information on block I/O debugging is in Documentation/laptop-mode.txt. | 1515 | information on block I/O debugging is in Documentation/laptops/laptop-mode.txt. |
1516 | 1516 | ||
1517 | swap_token_timeout | 1517 | swap_token_timeout |
1518 | ------------------ | 1518 | ------------------ |
diff --git a/Documentation/gpio.txt b/Documentation/gpio.txt index 8da724e2a0ff..54630095aa3c 100644 --- a/Documentation/gpio.txt +++ b/Documentation/gpio.txt | |||
@@ -2,6 +2,9 @@ GPIO Interfaces | |||
2 | 2 | ||
3 | This provides an overview of GPIO access conventions on Linux. | 3 | This provides an overview of GPIO access conventions on Linux. |
4 | 4 | ||
5 | These calls use the gpio_* naming prefix. No other calls should use that | ||
6 | prefix, or the related __gpio_* prefix. | ||
7 | |||
5 | 8 | ||
6 | What is a GPIO? | 9 | What is a GPIO? |
7 | =============== | 10 | =============== |
@@ -69,11 +72,13 @@ in this document, but drivers acting as clients to the GPIO interface must | |||
69 | not care how it's implemented.) | 72 | not care how it's implemented.) |
70 | 73 | ||
71 | That said, if the convention is supported on their platform, drivers should | 74 | That said, if the convention is supported on their platform, drivers should |
72 | use it when possible. Platforms should declare GENERIC_GPIO support in | 75 | use it when possible. Platforms must declare GENERIC_GPIO support in their |
73 | Kconfig (boolean true), which multi-platform drivers can depend on when | 76 | Kconfig (boolean true), and provide an <asm/gpio.h> file. Drivers that can't |
74 | using the include file: | 77 | work without standard GPIO calls should have Kconfig entries which depend |
78 | on GENERIC_GPIO. The GPIO calls are available, either as "real code" or as | ||
79 | optimized-away stubs, when drivers use the include file: | ||
75 | 80 | ||
76 | #include <asm/gpio.h> | 81 | #include <linux/gpio.h> |
77 | 82 | ||
78 | If you stick to this convention then it'll be easier for other developers to | 83 | If you stick to this convention then it'll be easier for other developers to |
79 | see what your code is doing, and help maintain it. | 84 | see what your code is doing, and help maintain it. |
@@ -316,6 +321,9 @@ pulldowns integrated on some platforms. Not all platforms support them, | |||
316 | or support them in the same way; and any given board might use external | 321 | or support them in the same way; and any given board might use external |
317 | pullups (or pulldowns) so that the on-chip ones should not be used. | 322 | pullups (or pulldowns) so that the on-chip ones should not be used. |
318 | (When a circuit needs 5 kOhm, on-chip 100 kOhm resistors won't do.) | 323 | (When a circuit needs 5 kOhm, on-chip 100 kOhm resistors won't do.) |
324 | Likewise drive strength (2 mA vs 20 mA) and voltage (1.8V vs 3.3V) is a | ||
325 | platform-specific issue, as are models like (not) having a one-to-one | ||
326 | correspondence between configurable pins and GPIOs. | ||
319 | 327 | ||
320 | There are other system-specific mechanisms that are not specified here, | 328 | There are other system-specific mechanisms that are not specified here, |
321 | like the aforementioned options for input de-glitching and wire-OR output. | 329 | like the aforementioned options for input de-glitching and wire-OR output. |
diff --git a/Documentation/ide/00-INDEX b/Documentation/ide/00-INDEX new file mode 100644 index 000000000000..d6b778842b75 --- /dev/null +++ b/Documentation/ide/00-INDEX | |||
@@ -0,0 +1,12 @@ | |||
1 | 00-INDEX | ||
2 | - this file | ||
3 | ChangeLog.ide-cd.1994-2004 | ||
4 | - ide-cd changelog | ||
5 | ChangeLog.ide-floppy.1996-2002 | ||
6 | - ide-floppy changelog | ||
7 | ChangeLog.ide-tape.1995-2002 | ||
8 | - ide-tape changelog | ||
9 | ide-tape.txt | ||
10 | - info on the IDE ATAPI streaming tape driver | ||
11 | ide.txt | ||
12 | - important info for users of ATA devices (IDE/EIDE disks and CD-ROMS). | ||
diff --git a/Documentation/ide.txt b/Documentation/ide/ide.txt index 94e2e3b9e77f..e3b3425328b6 100644 --- a/Documentation/ide.txt +++ b/Documentation/ide/ide.txt | |||
@@ -3,11 +3,11 @@ | |||
3 | 3 | ||
4 | ============================================================================== | 4 | ============================================================================== |
5 | 5 | ||
6 | 6 | ||
7 | The hdparm utility can be used to control various IDE features on a | 7 | The hdparm utility can be used to control various IDE features on a |
8 | running system. It is packaged separately. Please Look for it on popular | 8 | running system. It is packaged separately. Please Look for it on popular |
9 | linux FTP sites. | 9 | linux FTP sites. |
10 | 10 | ||
11 | 11 | ||
12 | 12 | ||
13 | *** IMPORTANT NOTICES: BUGGY IDE CHIPSETS CAN CORRUPT DATA!! | 13 | *** IMPORTANT NOTICES: BUGGY IDE CHIPSETS CAN CORRUPT DATA!! |
@@ -51,7 +51,7 @@ Common pitfalls: | |||
51 | 51 | ||
52 | ================================================================================ | 52 | ================================================================================ |
53 | 53 | ||
54 | This is the multiple IDE interface driver, as evolved from hd.c. | 54 | This is the multiple IDE interface driver, as evolved from hd.c. |
55 | 55 | ||
56 | It supports up to 9 IDE interfaces per default, on one or more IRQs (usually | 56 | It supports up to 9 IDE interfaces per default, on one or more IRQs (usually |
57 | 14 & 15). There can be up to two drives per interface, as per the ATA-6 spec. | 57 | 14 & 15). There can be up to two drives per interface, as per the ATA-6 spec. |
@@ -215,17 +215,17 @@ Summary of ide driver parameters for kernel command line | |||
215 | -------------------------------------------------------- | 215 | -------------------------------------------------------- |
216 | 216 | ||
217 | "hdx=" is recognized for all "x" from "a" to "h", such as "hdc". | 217 | "hdx=" is recognized for all "x" from "a" to "h", such as "hdc". |
218 | 218 | ||
219 | "idex=" is recognized for all "x" from "0" to "3", such as "ide1". | 219 | "idex=" is recognized for all "x" from "0" to "3", such as "ide1". |
220 | 220 | ||
221 | "hdx=noprobe" : drive may be present, but do not probe for it | 221 | "hdx=noprobe" : drive may be present, but do not probe for it |
222 | 222 | ||
223 | "hdx=none" : drive is NOT present, ignore cmos and do not probe | 223 | "hdx=none" : drive is NOT present, ignore cmos and do not probe |
224 | 224 | ||
225 | "hdx=nowerr" : ignore the WRERR_STAT bit on this drive | 225 | "hdx=nowerr" : ignore the WRERR_STAT bit on this drive |
226 | 226 | ||
227 | "hdx=cdrom" : drive is present, and is a cdrom drive | 227 | "hdx=cdrom" : drive is present, and is a cdrom drive |
228 | 228 | ||
229 | "hdx=cyl,head,sect" : disk drive is present, with specified geometry | 229 | "hdx=cyl,head,sect" : disk drive is present, with specified geometry |
230 | 230 | ||
231 | "hdx=remap" : remap access of sector 0 to sector 1 (for EZDrive) | 231 | "hdx=remap" : remap access of sector 0 to sector 1 (for EZDrive) |
@@ -258,12 +258,10 @@ Summary of ide driver parameters for kernel command line | |||
258 | As for VLB, it is safest to not specify it. | 258 | As for VLB, it is safest to not specify it. |
259 | Bigger values are safer than smaller ones. | 259 | Bigger values are safer than smaller ones. |
260 | 260 | ||
261 | "idex=noprobe" : do not attempt to access/use this interface | ||
262 | |||
263 | "idex=base" : probe for an interface at the addr specified, | 261 | "idex=base" : probe for an interface at the addr specified, |
264 | where "base" is usually 0x1f0 or 0x170 | 262 | where "base" is usually 0x1f0 or 0x170 |
265 | and "ctl" is assumed to be "base"+0x206 | 263 | and "ctl" is assumed to be "base"+0x206 |
266 | 264 | ||
267 | "idex=base,ctl" : specify both base and ctl | 265 | "idex=base,ctl" : specify both base and ctl |
268 | 266 | ||
269 | "idex=base,ctl,irq" : specify base, ctl, and irq number | 267 | "idex=base,ctl,irq" : specify base, ctl, and irq number |
@@ -274,7 +272,7 @@ Summary of ide driver parameters for kernel command line | |||
274 | to take effect. | 272 | to take effect. |
275 | 273 | ||
276 | "idex=four" : four drives on idex and ide(x^1) share same ports | 274 | "idex=four" : four drives on idex and ide(x^1) share same ports |
277 | 275 | ||
278 | "idex=reset" : reset interface after probe | 276 | "idex=reset" : reset interface after probe |
279 | 277 | ||
280 | "idex=ata66" : informs the interface that it has an 80c cable | 278 | "idex=ata66" : informs the interface that it has an 80c cable |
@@ -309,53 +307,6 @@ are detected automatically). | |||
309 | 307 | ||
310 | ================================================================================ | 308 | ================================================================================ |
311 | 309 | ||
312 | IDE ATAPI streaming tape driver | ||
313 | ------------------------------- | ||
314 | |||
315 | This driver is a part of the Linux ide driver and works in co-operation | ||
316 | with linux/drivers/block/ide.c. | ||
317 | |||
318 | The driver, in co-operation with ide.c, basically traverses the | ||
319 | request-list for the block device interface. The character device | ||
320 | interface, on the other hand, creates new requests, adds them | ||
321 | to the request-list of the block device, and waits for their completion. | ||
322 | |||
323 | Pipelined operation mode is now supported on both reads and writes. | ||
324 | |||
325 | The block device major and minor numbers are determined from the | ||
326 | tape's relative position in the ide interfaces, as explained in ide.c. | ||
327 | |||
328 | The character device interface consists of the following devices: | ||
329 | |||
330 | ht0 major 37, minor 0 first IDE tape, rewind on close. | ||
331 | ht1 major 37, minor 1 second IDE tape, rewind on close. | ||
332 | ... | ||
333 | nht0 major 37, minor 128 first IDE tape, no rewind on close. | ||
334 | nht1 major 37, minor 129 second IDE tape, no rewind on close. | ||
335 | ... | ||
336 | |||
337 | Run /dev/MAKEDEV to create the above entries. | ||
338 | |||
339 | The general magnetic tape commands compatible interface, as defined by | ||
340 | include/linux/mtio.h, is accessible through the character device. | ||
341 | |||
342 | General ide driver configuration options, such as the interrupt-unmask | ||
343 | flag, can be configured by issuing an ioctl to the block device interface, | ||
344 | as any other ide device. | ||
345 | |||
346 | Our own ide-tape ioctl's can be issued to either the block device or | ||
347 | the character device interface. | ||
348 | |||
349 | Maximal throughput with minimal bus load will usually be achieved in the | ||
350 | following scenario: | ||
351 | |||
352 | 1. ide-tape is operating in the pipelined operation mode. | ||
353 | 2. No buffering is performed by the user backup program. | ||
354 | |||
355 | |||
356 | |||
357 | ================================================================================ | ||
358 | |||
359 | Some Terminology | 310 | Some Terminology |
360 | ---------------- | 311 | ---------------- |
361 | IDE = Integrated Drive Electronics, meaning that each drive has a built-in | 312 | IDE = Integrated Drive Electronics, meaning that each drive has a built-in |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 9a5b6658c65e..622f7849edb9 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -138,7 +138,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
138 | strict -- Be less tolerant of platforms that are not | 138 | strict -- Be less tolerant of platforms that are not |
139 | strictly ACPI specification compliant. | 139 | strictly ACPI specification compliant. |
140 | 140 | ||
141 | See also Documentation/pm.txt, pci=noacpi | 141 | See also Documentation/power/pm.txt, pci=noacpi |
142 | 142 | ||
143 | acpi_apic_instance= [ACPI, IOAPIC] | 143 | acpi_apic_instance= [ACPI, IOAPIC] |
144 | Format: <int> | 144 | Format: <int> |
@@ -177,9 +177,6 @@ and is between 256 and 4096 characters. It is defined in the file | |||
177 | 177 | ||
178 | acpi_no_auto_ssdt [HW,ACPI] Disable automatic loading of SSDT | 178 | acpi_no_auto_ssdt [HW,ACPI] Disable automatic loading of SSDT |
179 | 179 | ||
180 | acpi_no_initrd_override [KNL,ACPI] | ||
181 | Disable loading custom ACPI tables from the initramfs | ||
182 | |||
183 | acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS | 180 | acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS |
184 | Format: To spoof as Windows 98: ="Microsoft Windows" | 181 | Format: To spoof as Windows 98: ="Microsoft Windows" |
185 | 182 | ||
@@ -712,7 +709,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
712 | Format: <cyl>,<head>,<sect> | 709 | Format: <cyl>,<head>,<sect> |
713 | 710 | ||
714 | hd?= [HW] (E)IDE subsystem | 711 | hd?= [HW] (E)IDE subsystem |
715 | hd?lun= See Documentation/ide.txt. | 712 | hd?lun= See Documentation/ide/ide.txt. |
716 | 713 | ||
717 | highmem=nn[KMG] [KNL,BOOT] forces the highmem zone to have an exact | 714 | highmem=nn[KMG] [KNL,BOOT] forces the highmem zone to have an exact |
718 | size of <nn>. This works even on boxes that have no | 715 | size of <nn>. This works even on boxes that have no |
@@ -766,14 +763,14 @@ and is between 256 and 4096 characters. It is defined in the file | |||
766 | 763 | ||
767 | ide= [HW] (E)IDE subsystem | 764 | ide= [HW] (E)IDE subsystem |
768 | Format: ide=nodma or ide=doubler or ide=reverse | 765 | Format: ide=nodma or ide=doubler or ide=reverse |
769 | See Documentation/ide.txt. | 766 | See Documentation/ide/ide.txt. |
770 | 767 | ||
771 | ide?= [HW] (E)IDE subsystem | 768 | ide?= [HW] (E)IDE subsystem |
772 | Format: ide?=noprobe or chipset specific parameters. | 769 | Format: ide?=noprobe or chipset specific parameters. |
773 | See Documentation/ide.txt. | 770 | See Documentation/ide/ide.txt. |
774 | 771 | ||
775 | idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed | 772 | idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed |
776 | See Documentation/ide.txt. | 773 | See Documentation/ide/ide.txt. |
777 | 774 | ||
778 | idle= [X86] | 775 | idle= [X86] |
779 | Format: idle=poll or idle=mwait | 776 | Format: idle=poll or idle=mwait |
diff --git a/Documentation/kprobes.txt b/Documentation/kprobes.txt index 83f515c2905a..be89f393274f 100644 --- a/Documentation/kprobes.txt +++ b/Documentation/kprobes.txt | |||
@@ -192,7 +192,8 @@ code mapping. | |||
192 | The Kprobes API includes a "register" function and an "unregister" | 192 | The Kprobes API includes a "register" function and an "unregister" |
193 | function for each type of probe. Here are terse, mini-man-page | 193 | function for each type of probe. Here are terse, mini-man-page |
194 | specifications for these functions and the associated probe handlers | 194 | specifications for these functions and the associated probe handlers |
195 | that you'll write. See the latter half of this document for examples. | 195 | that you'll write. See the files in the samples/kprobes/ sub-directory |
196 | for examples. | ||
196 | 197 | ||
197 | 4.1 register_kprobe | 198 | 4.1 register_kprobe |
198 | 199 | ||
@@ -420,249 +421,15 @@ e. Watchpoint probes (which fire on data references). | |||
420 | 421 | ||
421 | 8. Kprobes Example | 422 | 8. Kprobes Example |
422 | 423 | ||
423 | Here's a sample kernel module showing the use of kprobes to dump a | 424 | See samples/kprobes/kprobe_example.c |
424 | stack trace and selected i386 registers when do_fork() is called. | ||
425 | ----- cut here ----- | ||
426 | /*kprobe_example.c*/ | ||
427 | #include <linux/kernel.h> | ||
428 | #include <linux/module.h> | ||
429 | #include <linux/kprobes.h> | ||
430 | #include <linux/sched.h> | ||
431 | |||
432 | /*For each probe you need to allocate a kprobe structure*/ | ||
433 | static struct kprobe kp; | ||
434 | |||
435 | /*kprobe pre_handler: called just before the probed instruction is executed*/ | ||
436 | int handler_pre(struct kprobe *p, struct pt_regs *regs) | ||
437 | { | ||
438 | printk("pre_handler: p->addr=0x%p, eip=%lx, eflags=0x%lx\n", | ||
439 | p->addr, regs->eip, regs->eflags); | ||
440 | dump_stack(); | ||
441 | return 0; | ||
442 | } | ||
443 | |||
444 | /*kprobe post_handler: called after the probed instruction is executed*/ | ||
445 | void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags) | ||
446 | { | ||
447 | printk("post_handler: p->addr=0x%p, eflags=0x%lx\n", | ||
448 | p->addr, regs->eflags); | ||
449 | } | ||
450 | |||
451 | /* fault_handler: this is called if an exception is generated for any | ||
452 | * instruction within the pre- or post-handler, or when Kprobes | ||
453 | * single-steps the probed instruction. | ||
454 | */ | ||
455 | int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr) | ||
456 | { | ||
457 | printk("fault_handler: p->addr=0x%p, trap #%dn", | ||
458 | p->addr, trapnr); | ||
459 | /* Return 0 because we don't handle the fault. */ | ||
460 | return 0; | ||
461 | } | ||
462 | |||
463 | static int __init kprobe_init(void) | ||
464 | { | ||
465 | int ret; | ||
466 | kp.pre_handler = handler_pre; | ||
467 | kp.post_handler = handler_post; | ||
468 | kp.fault_handler = handler_fault; | ||
469 | kp.symbol_name = "do_fork"; | ||
470 | |||
471 | ret = register_kprobe(&kp); | ||
472 | if (ret < 0) { | ||
473 | printk("register_kprobe failed, returned %d\n", ret); | ||
474 | return ret; | ||
475 | } | ||
476 | printk("kprobe registered\n"); | ||
477 | return 0; | ||
478 | } | ||
479 | |||
480 | static void __exit kprobe_exit(void) | ||
481 | { | ||
482 | unregister_kprobe(&kp); | ||
483 | printk("kprobe unregistered\n"); | ||
484 | } | ||
485 | |||
486 | module_init(kprobe_init) | ||
487 | module_exit(kprobe_exit) | ||
488 | MODULE_LICENSE("GPL"); | ||
489 | ----- cut here ----- | ||
490 | |||
491 | You can build the kernel module, kprobe-example.ko, using the following | ||
492 | Makefile: | ||
493 | ----- cut here ----- | ||
494 | obj-m := kprobe-example.o | ||
495 | KDIR := /lib/modules/$(shell uname -r)/build | ||
496 | PWD := $(shell pwd) | ||
497 | default: | ||
498 | $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules | ||
499 | clean: | ||
500 | rm -f *.mod.c *.ko *.o | ||
501 | ----- cut here ----- | ||
502 | |||
503 | $ make | ||
504 | $ su - | ||
505 | ... | ||
506 | # insmod kprobe-example.ko | ||
507 | |||
508 | You will see the trace data in /var/log/messages and on the console | ||
509 | whenever do_fork() is invoked to create a new process. | ||
510 | 425 | ||
511 | 9. Jprobes Example | 426 | 9. Jprobes Example |
512 | 427 | ||
513 | Here's a sample kernel module showing the use of jprobes to dump | 428 | See samples/kprobes/jprobe_example.c |
514 | the arguments of do_fork(). | ||
515 | ----- cut here ----- | ||
516 | /*jprobe-example.c */ | ||
517 | #include <linux/kernel.h> | ||
518 | #include <linux/module.h> | ||
519 | #include <linux/fs.h> | ||
520 | #include <linux/uio.h> | ||
521 | #include <linux/kprobes.h> | ||
522 | |||
523 | /* | ||
524 | * Jumper probe for do_fork. | ||
525 | * Mirror principle enables access to arguments of the probed routine | ||
526 | * from the probe handler. | ||
527 | */ | ||
528 | |||
529 | /* Proxy routine having the same arguments as actual do_fork() routine */ | ||
530 | long jdo_fork(unsigned long clone_flags, unsigned long stack_start, | ||
531 | struct pt_regs *regs, unsigned long stack_size, | ||
532 | int __user * parent_tidptr, int __user * child_tidptr) | ||
533 | { | ||
534 | printk("jprobe: clone_flags=0x%lx, stack_size=0x%lx, regs=0x%p\n", | ||
535 | clone_flags, stack_size, regs); | ||
536 | /* Always end with a call to jprobe_return(). */ | ||
537 | jprobe_return(); | ||
538 | /*NOTREACHED*/ | ||
539 | return 0; | ||
540 | } | ||
541 | |||
542 | static struct jprobe my_jprobe = { | ||
543 | .entry = jdo_fork | ||
544 | }; | ||
545 | |||
546 | static int __init jprobe_init(void) | ||
547 | { | ||
548 | int ret; | ||
549 | my_jprobe.kp.symbol_name = "do_fork"; | ||
550 | |||
551 | if ((ret = register_jprobe(&my_jprobe)) <0) { | ||
552 | printk("register_jprobe failed, returned %d\n", ret); | ||
553 | return -1; | ||
554 | } | ||
555 | printk("Planted jprobe at %p, handler addr %p\n", | ||
556 | my_jprobe.kp.addr, my_jprobe.entry); | ||
557 | return 0; | ||
558 | } | ||
559 | |||
560 | static void __exit jprobe_exit(void) | ||
561 | { | ||
562 | unregister_jprobe(&my_jprobe); | ||
563 | printk("jprobe unregistered\n"); | ||
564 | } | ||
565 | |||
566 | module_init(jprobe_init) | ||
567 | module_exit(jprobe_exit) | ||
568 | MODULE_LICENSE("GPL"); | ||
569 | ----- cut here ----- | ||
570 | |||
571 | Build and insert the kernel module as shown in the above kprobe | ||
572 | example. You will see the trace data in /var/log/messages and on | ||
573 | the console whenever do_fork() is invoked to create a new process. | ||
574 | (Some messages may be suppressed if syslogd is configured to | ||
575 | eliminate duplicate messages.) | ||
576 | 429 | ||
577 | 10. Kretprobes Example | 430 | 10. Kretprobes Example |
578 | 431 | ||
579 | Here's a sample kernel module showing the use of return probes to | 432 | See samples/kprobes/kretprobe_example.c |
580 | report failed calls to sys_open(). | ||
581 | ----- cut here ----- | ||
582 | /*kretprobe-example.c*/ | ||
583 | #include <linux/kernel.h> | ||
584 | #include <linux/module.h> | ||
585 | #include <linux/kprobes.h> | ||
586 | #include <linux/ktime.h> | ||
587 | |||
588 | /* per-instance private data */ | ||
589 | struct my_data { | ||
590 | ktime_t entry_stamp; | ||
591 | }; | ||
592 | |||
593 | static const char *probed_func = "sys_open"; | ||
594 | |||
595 | /* Timestamp function entry. */ | ||
596 | static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs) | ||
597 | { | ||
598 | struct my_data *data; | ||
599 | |||
600 | if(!current->mm) | ||
601 | return 1; /* skip kernel threads */ | ||
602 | |||
603 | data = (struct my_data *)ri->data; | ||
604 | data->entry_stamp = ktime_get(); | ||
605 | return 0; | ||
606 | } | ||
607 | |||
608 | /* If the probed function failed, log the return value and duration. | ||
609 | * Duration may turn out to be zero consistently, depending upon the | ||
610 | * granularity of time accounting on the platform. */ | ||
611 | static int return_handler(struct kretprobe_instance *ri, struct pt_regs *regs) | ||
612 | { | ||
613 | int retval = regs_return_value(regs); | ||
614 | struct my_data *data = (struct my_data *)ri->data; | ||
615 | s64 delta; | ||
616 | ktime_t now; | ||
617 | |||
618 | if (retval < 0) { | ||
619 | now = ktime_get(); | ||
620 | delta = ktime_to_ns(ktime_sub(now, data->entry_stamp)); | ||
621 | printk("%s: return val = %d (duration = %lld ns)\n", | ||
622 | probed_func, retval, delta); | ||
623 | } | ||
624 | return 0; | ||
625 | } | ||
626 | |||
627 | static struct kretprobe my_kretprobe = { | ||
628 | .handler = return_handler, | ||
629 | .entry_handler = entry_handler, | ||
630 | .data_size = sizeof(struct my_data), | ||
631 | .maxactive = 20, /* probe up to 20 instances concurrently */ | ||
632 | }; | ||
633 | |||
634 | static int __init kretprobe_init(void) | ||
635 | { | ||
636 | int ret; | ||
637 | my_kretprobe.kp.symbol_name = (char *)probed_func; | ||
638 | |||
639 | if ((ret = register_kretprobe(&my_kretprobe)) < 0) { | ||
640 | printk("register_kretprobe failed, returned %d\n", ret); | ||
641 | return -1; | ||
642 | } | ||
643 | printk("Kretprobe active on %s\n", my_kretprobe.kp.symbol_name); | ||
644 | return 0; | ||
645 | } | ||
646 | |||
647 | static void __exit kretprobe_exit(void) | ||
648 | { | ||
649 | unregister_kretprobe(&my_kretprobe); | ||
650 | printk("kretprobe unregistered\n"); | ||
651 | /* nmissed > 0 suggests that maxactive was set too low. */ | ||
652 | printk("Missed probing %d instances of %s\n", | ||
653 | my_kretprobe.nmissed, probed_func); | ||
654 | } | ||
655 | |||
656 | module_init(kretprobe_init) | ||
657 | module_exit(kretprobe_exit) | ||
658 | MODULE_LICENSE("GPL"); | ||
659 | ----- cut here ----- | ||
660 | |||
661 | Build and insert the kernel module as shown in the above kprobe | ||
662 | example. You will see the trace data in /var/log/messages and on the | ||
663 | console whenever sys_open() returns a negative value. (Some messages | ||
664 | may be suppressed if syslogd is configured to eliminate duplicate | ||
665 | messages.) | ||
666 | 433 | ||
667 | For additional information on Kprobes, refer to the following URLs: | 434 | For additional information on Kprobes, refer to the following URLs: |
668 | http://www-106.ibm.com/developerworks/library/l-kprobes.html?ca=dgr-lnxw42Kprobe | 435 | http://www-106.ibm.com/developerworks/library/l-kprobes.html?ca=dgr-lnxw42Kprobe |
diff --git a/Documentation/laptops/00-INDEX b/Documentation/laptops/00-INDEX index 729c2c062e10..ee5692b26dd4 100644 --- a/Documentation/laptops/00-INDEX +++ b/Documentation/laptops/00-INDEX | |||
@@ -2,6 +2,8 @@ | |||
2 | - This file | 2 | - This file |
3 | acer-wmi.txt | 3 | acer-wmi.txt |
4 | - information on the Acer Laptop WMI Extras driver. | 4 | - information on the Acer Laptop WMI Extras driver. |
5 | laptop-mode.txt | ||
6 | - how to conserve battery power using laptop-mode. | ||
5 | sony-laptop.txt | 7 | sony-laptop.txt |
6 | - Sony Notebook Control Driver (SNC) Readme. | 8 | - Sony Notebook Control Driver (SNC) Readme. |
7 | sonypi.txt | 9 | sonypi.txt |
diff --git a/Documentation/laptops/acer-wmi.txt b/Documentation/laptops/acer-wmi.txt index b06696329cff..23df051dbf69 100644 --- a/Documentation/laptops/acer-wmi.txt +++ b/Documentation/laptops/acer-wmi.txt | |||
@@ -48,7 +48,7 @@ DSDT. | |||
48 | 48 | ||
49 | To send me the DSDT, as root/sudo: | 49 | To send me the DSDT, as root/sudo: |
50 | 50 | ||
51 | cat /sys/firmware/acpi/DSDT > dsdt | 51 | cat /sys/firmware/acpi/tables/DSDT > dsdt |
52 | 52 | ||
53 | And send me the resulting 'dsdt' file. | 53 | And send me the resulting 'dsdt' file. |
54 | 54 | ||
@@ -169,7 +169,7 @@ can be added to acer-wmi. | |||
169 | 169 | ||
170 | The LED is exposed through the LED subsystem, and can be found in: | 170 | The LED is exposed through the LED subsystem, and can be found in: |
171 | 171 | ||
172 | /sys/devices/platform/acer-wmi/leds/acer-mail:green/ | 172 | /sys/devices/platform/acer-wmi/leds/acer-wmi::mail/ |
173 | 173 | ||
174 | The mail LED is autodetected, so if you don't have one, the LED device won't | 174 | The mail LED is autodetected, so if you don't have one, the LED device won't |
175 | be registered. | 175 | be registered. |
diff --git a/Documentation/laptop-mode.txt b/Documentation/laptops/laptop-mode.txt index eeedee11c8c2..eeedee11c8c2 100644 --- a/Documentation/laptop-mode.txt +++ b/Documentation/laptops/laptop-mode.txt | |||
diff --git a/Documentation/lguest/lguest.c b/Documentation/lguest/lguest.c index 0f23d67f958f..bec5a32e4095 100644 --- a/Documentation/lguest/lguest.c +++ b/Documentation/lguest/lguest.c | |||
@@ -486,9 +486,12 @@ static void concat(char *dst, char *args[]) | |||
486 | unsigned int i, len = 0; | 486 | unsigned int i, len = 0; |
487 | 487 | ||
488 | for (i = 0; args[i]; i++) { | 488 | for (i = 0; args[i]; i++) { |
489 | if (i) { | ||
490 | strcat(dst+len, " "); | ||
491 | len++; | ||
492 | } | ||
489 | strcpy(dst+len, args[i]); | 493 | strcpy(dst+len, args[i]); |
490 | strcat(dst+len, " "); | 494 | len += strlen(args[i]); |
491 | len += strlen(args[i]) + 1; | ||
492 | } | 495 | } |
493 | /* In case it's empty. */ | 496 | /* In case it's empty. */ |
494 | dst[len] = '\0'; | 497 | dst[len] = '\0'; |
diff --git a/Documentation/pci.txt b/Documentation/pci.txt index 72b20c639596..d2c2e6e2b224 100644 --- a/Documentation/pci.txt +++ b/Documentation/pci.txt | |||
@@ -123,7 +123,8 @@ initialization with a pointer to a structure describing the driver | |||
123 | 123 | ||
124 | 124 | ||
125 | The ID table is an array of struct pci_device_id entries ending with an | 125 | The ID table is an array of struct pci_device_id entries ending with an |
126 | all-zero entry. Each entry consists of: | 126 | all-zero entry; use of the macro DEFINE_PCI_DEVICE_TABLE is the preferred |
127 | method of declaring the table. Each entry consists of: | ||
127 | 128 | ||
128 | vendor,device Vendor and device ID to match (or PCI_ANY_ID) | 129 | vendor,device Vendor and device ID to match (or PCI_ANY_ID) |
129 | 130 | ||
@@ -191,7 +192,8 @@ Tips on when/where to use the above attributes: | |||
191 | 192 | ||
192 | o Do not mark the struct pci_driver. | 193 | o Do not mark the struct pci_driver. |
193 | 194 | ||
194 | o The ID table array should be marked __devinitdata. | 195 | o The ID table array should be marked __devinitconst; this is done |
196 | automatically if the table is declared with DEFINE_PCI_DEVICE_TABLE(). | ||
195 | 197 | ||
196 | o The probe() and remove() functions should be marked __devinit | 198 | o The probe() and remove() functions should be marked __devinit |
197 | and __devexit respectively. All initialization functions | 199 | and __devexit respectively. All initialization functions |
diff --git a/Documentation/power/00-INDEX b/Documentation/power/00-INDEX index 8db4e41a052d..a55d7f1c836d 100644 --- a/Documentation/power/00-INDEX +++ b/Documentation/power/00-INDEX | |||
@@ -14,6 +14,12 @@ notifiers.txt | |||
14 | - Registering suspend notifiers in device drivers | 14 | - Registering suspend notifiers in device drivers |
15 | pci.txt | 15 | pci.txt |
16 | - How the PCI Subsystem Does Power Management | 16 | - How the PCI Subsystem Does Power Management |
17 | pm.txt | ||
18 | - info on Linux power management support. | ||
19 | pm_qos_interface.txt | ||
20 | - info on Linux PM Quality of Service interface | ||
21 | power_supply_class.txt | ||
22 | - Tells userspace about battery, UPS, AC or DC power supply properties | ||
17 | s2ram.txt | 23 | s2ram.txt |
18 | - How to get suspend to ram working (and debug it when it isn't) | 24 | - How to get suspend to ram working (and debug it when it isn't) |
19 | states.txt | 25 | states.txt |
diff --git a/Documentation/pm.txt b/Documentation/power/pm.txt index da8589a0e07d..be841507e43f 100644 --- a/Documentation/pm.txt +++ b/Documentation/power/pm.txt | |||
@@ -108,7 +108,7 @@ void pm_unregister_all(pm_callback cback); | |||
108 | * EINVAL if the request is not supported | 108 | * EINVAL if the request is not supported |
109 | * EBUSY if the device is now busy and cannot handle the request | 109 | * EBUSY if the device is now busy and cannot handle the request |
110 | * ENOMEM if the device was unable to handle the request due to memory | 110 | * ENOMEM if the device was unable to handle the request due to memory |
111 | * | 111 | * |
112 | * Details: The device request callback will be called before the | 112 | * Details: The device request callback will be called before the |
113 | * device/system enters a suspend state (ACPI D1-D3) or | 113 | * device/system enters a suspend state (ACPI D1-D3) or |
114 | * or after the device/system resumes from suspend (ACPI D0). | 114 | * or after the device/system resumes from suspend (ACPI D0). |
diff --git a/Documentation/pm_qos_interface.txt b/Documentation/power/pm_qos_interface.txt index 49adb1a33514..49adb1a33514 100644 --- a/Documentation/pm_qos_interface.txt +++ b/Documentation/power/pm_qos_interface.txt | |||
diff --git a/Documentation/power_supply_class.txt b/Documentation/power/power_supply_class.txt index a8686e5a6857..a8686e5a6857 100644 --- a/Documentation/power_supply_class.txt +++ b/Documentation/power/power_supply_class.txt | |||
diff --git a/Documentation/scheduler/sched-stats.txt b/Documentation/scheduler/sched-stats.txt index 442e14d35dea..01e69404ee5e 100644 --- a/Documentation/scheduler/sched-stats.txt +++ b/Documentation/scheduler/sched-stats.txt | |||
@@ -142,7 +142,7 @@ of idleness (idle, busy, and newly idle): | |||
142 | 142 | ||
143 | /proc/<pid>/schedstat | 143 | /proc/<pid>/schedstat |
144 | ---------------- | 144 | ---------------- |
145 | schedstats also adds a new /proc/<pid/schedstat file to include some of | 145 | schedstats also adds a new /proc/<pid>/schedstat file to include some of |
146 | the same information on a per-process level. There are three fields in | 146 | the same information on a per-process level. There are three fields in |
147 | this file correlating for that process to: | 147 | this file correlating for that process to: |
148 | 1) time spent on the cpu | 148 | 1) time spent on the cpu |
diff --git a/Documentation/scsi/ChangeLog.arcmsr b/Documentation/scsi/ChangeLog.arcmsr index de2bcacfa870..038a3e6ecaa4 100644 --- a/Documentation/scsi/ChangeLog.arcmsr +++ b/Documentation/scsi/ChangeLog.arcmsr | |||
@@ -109,4 +109,10 @@ | |||
109 | ** 8.replace pci_alloc_consistent()/pci_free_consistent() with kmalloc()/kfree() in arcmsr_iop_message_xfer() | 109 | ** 8.replace pci_alloc_consistent()/pci_free_consistent() with kmalloc()/kfree() in arcmsr_iop_message_xfer() |
110 | ** 9. fix the release of dma memory for type B in arcmsr_free_ccb_pool() | 110 | ** 9. fix the release of dma memory for type B in arcmsr_free_ccb_pool() |
111 | ** 10.fix the arcmsr_polling_hbb_ccbdone() | 111 | ** 10.fix the arcmsr_polling_hbb_ccbdone() |
112 | ** 1.20.00.15 02/27/2008 Erich Chen & Nick Cheng | ||
113 | ** 1.arcmsr_iop_message_xfer() is called from atomic context under the | ||
114 | ** queuecommand scsi_host_template handler. James Bottomley pointed out | ||
115 | ** that the current GFP_KERNEL|GFP_DMA flags are wrong: firstly we are in | ||
116 | ** atomic context, secondly this memory is not used for DMA. | ||
117 | ** Also removed some unneeded casts. Thanks to Daniel Drake <dsd@gentoo.org> | ||
112 | ************************************************************************** | 118 | ************************************************************************** |
diff --git a/Documentation/thermal/sysfs-api.txt b/Documentation/thermal/sysfs-api.txt index ba9c2da5a8c2..d9f28be75403 100644 --- a/Documentation/thermal/sysfs-api.txt +++ b/Documentation/thermal/sysfs-api.txt | |||
@@ -143,10 +143,10 @@ type Strings which represent the thermal zone type. | |||
143 | This is given by thermal zone driver as part of registration. | 143 | This is given by thermal zone driver as part of registration. |
144 | Eg: "ACPI thermal zone" indicates it's a ACPI thermal device | 144 | Eg: "ACPI thermal zone" indicates it's a ACPI thermal device |
145 | RO | 145 | RO |
146 | Optional | 146 | Required |
147 | 147 | ||
148 | temp Current temperature as reported by thermal zone (sensor) | 148 | temp Current temperature as reported by thermal zone (sensor) |
149 | Unit: degree Celsius | 149 | Unit: millidegree Celsius |
150 | RO | 150 | RO |
151 | Required | 151 | Required |
152 | 152 | ||
@@ -163,7 +163,7 @@ mode One of the predefined values in [kernel, user] | |||
163 | charge of the thermal management. | 163 | charge of the thermal management. |
164 | 164 | ||
165 | trip_point_[0-*]_temp The temperature above which trip point will be fired | 165 | trip_point_[0-*]_temp The temperature above which trip point will be fired |
166 | Unit: degree Celsius | 166 | Unit: millidegree Celsius |
167 | RO | 167 | RO |
168 | Optional | 168 | Optional |
169 | 169 | ||
@@ -193,7 +193,7 @@ type String which represents the type of device | |||
193 | eg. For memory controller device on intel_menlow platform: | 193 | eg. For memory controller device on intel_menlow platform: |
194 | this should be "Memory controller" | 194 | this should be "Memory controller" |
195 | RO | 195 | RO |
196 | Optional | 196 | Required |
197 | 197 | ||
198 | max_state The maximum permissible cooling state of this cooling device. | 198 | max_state The maximum permissible cooling state of this cooling device. |
199 | RO | 199 | RO |
@@ -219,16 +219,16 @@ the sys I/F structure will be built like this: | |||
219 | 219 | ||
220 | |thermal_zone1: | 220 | |thermal_zone1: |
221 | |-----type: ACPI thermal zone | 221 | |-----type: ACPI thermal zone |
222 | |-----temp: 37 | 222 | |-----temp: 37000 |
223 | |-----mode: kernel | 223 | |-----mode: kernel |
224 | |-----trip_point_0_temp: 100 | 224 | |-----trip_point_0_temp: 100000 |
225 | |-----trip_point_0_type: critical | 225 | |-----trip_point_0_type: critical |
226 | |-----trip_point_1_temp: 80 | 226 | |-----trip_point_1_temp: 80000 |
227 | |-----trip_point_1_type: passive | 227 | |-----trip_point_1_type: passive |
228 | |-----trip_point_2_temp: 70 | 228 | |-----trip_point_2_temp: 70000 |
229 | |-----trip_point_2_type: active[0] | 229 | |-----trip_point_2_type: active0 |
230 | |-----trip_point_3_temp: 60 | 230 | |-----trip_point_3_temp: 60000 |
231 | |-----trip_point_3_type: active[1] | 231 | |-----trip_point_3_type: active1 |
232 | |-----cdev0: --->/sys/class/thermal/cooling_device0 | 232 | |-----cdev0: --->/sys/class/thermal/cooling_device0 |
233 | |-----cdev0_trip_point: 1 /* cdev0 can be used for passive */ | 233 | |-----cdev0_trip_point: 1 /* cdev0 can be used for passive */ |
234 | |-----cdev1: --->/sys/class/thermal/cooling_device3 | 234 | |-----cdev1: --->/sys/class/thermal/cooling_device3 |
diff --git a/Documentation/usb/usb-help.txt b/Documentation/usb/usb-help.txt index a7408593829f..4273ca2b86ba 100644 --- a/Documentation/usb/usb-help.txt +++ b/Documentation/usb/usb-help.txt | |||
@@ -1,5 +1,5 @@ | |||
1 | usb-help.txt | 1 | usb-help.txt |
2 | 2000-July-12 | 2 | 2008-Mar-7 |
3 | 3 | ||
4 | For USB help other than the readme files that are located in | 4 | For USB help other than the readme files that are located in |
5 | Documentation/usb/*, see the following: | 5 | Documentation/usb/*, see the following: |
@@ -10,9 +10,7 @@ Linux-USB project: http://www.linux-usb.org | |||
10 | Linux USB Guide: http://linux-usb.sourceforge.net | 10 | Linux USB Guide: http://linux-usb.sourceforge.net |
11 | Linux-USB device overview (working devices and drivers): | 11 | Linux-USB device overview (working devices and drivers): |
12 | http://www.qbik.ch/usb/devices/ | 12 | http://www.qbik.ch/usb/devices/ |
13 | 13 | ||
14 | The Linux-USB mailing lists are: | 14 | The Linux-USB mailing list is at linux-usb@vger.kernel.org |
15 | linux-usb-users@lists.sourceforge.net for general user help | ||
16 | linux-usb-devel@lists.sourceforge.net for developer discussions | ||
17 | 15 | ||
18 | ### | 16 | ### |
diff --git a/Documentation/vm/slub.txt b/Documentation/vm/slub.txt index dcf8bcf846d6..7c13f22a0c9e 100644 --- a/Documentation/vm/slub.txt +++ b/Documentation/vm/slub.txt | |||
@@ -50,14 +50,14 @@ F.e. in order to boot just with sanity checks and red zoning one would specify: | |||
50 | 50 | ||
51 | Trying to find an issue in the dentry cache? Try | 51 | Trying to find an issue in the dentry cache? Try |
52 | 52 | ||
53 | slub_debug=,dentry_cache | 53 | slub_debug=,dentry |
54 | 54 | ||
55 | to only enable debugging on the dentry cache. | 55 | to only enable debugging on the dentry cache. |
56 | 56 | ||
57 | Red zoning and tracking may realign the slab. We can just apply sanity checks | 57 | Red zoning and tracking may realign the slab. We can just apply sanity checks |
58 | to the dentry cache with | 58 | to the dentry cache with |
59 | 59 | ||
60 | slub_debug=F,dentry_cache | 60 | slub_debug=F,dentry |
61 | 61 | ||
62 | In case you forgot to enable debugging on the kernel command line: It is | 62 | In case you forgot to enable debugging on the kernel command line: It is |
63 | possible to enable debugging manually when the kernel is up. Look at the | 63 | possible to enable debugging manually when the kernel is up. Look at the |
diff --git a/MAINTAINERS b/MAINTAINERS index 93e0de955b4b..6d628fb6ee01 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -266,6 +266,15 @@ L: linux-acpi@vger.kernel.org | |||
266 | W: http://www.lesswatts.org/projects/acpi/ | 266 | W: http://www.lesswatts.org/projects/acpi/ |
267 | S: Maintained | 267 | S: Maintained |
268 | 268 | ||
269 | AD1889 ALSA SOUND DRIVER | ||
270 | P: Kyle McMartin | ||
271 | M: kyle@parisc-linux.org | ||
272 | P: Thibaut Varene | ||
273 | M: T-Bone@parisc-linux.org | ||
274 | W: http://wiki.parisc-linux.org/AD1889 | ||
275 | L: linux-parisc@vger.kernel.org | ||
276 | S: Maintained | ||
277 | |||
269 | ADM1025 HARDWARE MONITOR DRIVER | 278 | ADM1025 HARDWARE MONITOR DRIVER |
270 | P: Jean Delvare | 279 | P: Jean Delvare |
271 | M: khali@linux-fr.org | 280 | M: khali@linux-fr.org |
@@ -767,14 +776,14 @@ S: Maintained | |||
767 | 776 | ||
768 | BLACKFIN ARCHITECTURE | 777 | BLACKFIN ARCHITECTURE |
769 | P: Bryan Wu | 778 | P: Bryan Wu |
770 | M: bryan.wu@analog.com | 779 | M: cooloney@kernel.org |
771 | L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) | 780 | L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) |
772 | W: http://blackfin.uclinux.org | 781 | W: http://blackfin.uclinux.org |
773 | S: Supported | 782 | S: Supported |
774 | 783 | ||
775 | BLACKFIN EMAC DRIVER | 784 | BLACKFIN EMAC DRIVER |
776 | P: Bryan Wu | 785 | P: Bryan Wu |
777 | M: bryan.wu@analog.com | 786 | M: cooloney@kernel.org |
778 | L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) | 787 | L: uclinux-dist-devel@blackfin.uclinux.org (subscribers-only) |
779 | W: http://blackfin.uclinux.org | 788 | W: http://blackfin.uclinux.org |
780 | S: Supported | 789 | S: Supported |
@@ -1138,6 +1147,12 @@ L: accessrunner-general@lists.sourceforge.net | |||
1138 | W: http://accessrunner.sourceforge.net/ | 1147 | W: http://accessrunner.sourceforge.net/ |
1139 | S: Maintained | 1148 | S: Maintained |
1140 | 1149 | ||
1150 | CONTROL GROUPS (CGROUPS) | ||
1151 | P: Paul Menage | ||
1152 | M: menage@google.com | ||
1153 | L: containers@lists.linux-foundation.org | ||
1154 | S: Maintained | ||
1155 | |||
1141 | CORETEMP HARDWARE MONITORING DRIVER | 1156 | CORETEMP HARDWARE MONITORING DRIVER |
1142 | P: Rudolf Marek | 1157 | P: Rudolf Marek |
1143 | M: r.marek@assembler.cz | 1158 | M: r.marek@assembler.cz |
@@ -1589,6 +1604,13 @@ L: linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers) | |||
1589 | W: http://linux-fbdev.sourceforge.net/ | 1604 | W: http://linux-fbdev.sourceforge.net/ |
1590 | S: Maintained | 1605 | S: Maintained |
1591 | 1606 | ||
1607 | FREESCALE DMA DRIVER | ||
1608 | P; Zhang Wei | ||
1609 | M: wei.zhang@freescale.com | ||
1610 | L: linuxppc-embedded@ozlabs.org | ||
1611 | L: linux-kernel@vger.kernel.org | ||
1612 | S: Maintained | ||
1613 | |||
1592 | FREESCALE SOC FS_ENET DRIVER | 1614 | FREESCALE SOC FS_ENET DRIVER |
1593 | P: Pantelis Antoniou | 1615 | P: Pantelis Antoniou |
1594 | M: pantelis.antoniou@gmail.com | 1616 | M: pantelis.antoniou@gmail.com |
@@ -2119,7 +2141,7 @@ L: netdev@vger.kernel.org | |||
2119 | S: Maintained | 2141 | S: Maintained |
2120 | 2142 | ||
2121 | IPATH DRIVER: | 2143 | IPATH DRIVER: |
2122 | P: Arthur Jones | 2144 | P: Ralph Campbell |
2123 | M: infinipath@qlogic.com | 2145 | M: infinipath@qlogic.com |
2124 | L: general@lists.openfabrics.org | 2146 | L: general@lists.openfabrics.org |
2125 | T: git git://git.qlogic.com/ipath-linux-2.6 | 2147 | T: git git://git.qlogic.com/ipath-linux-2.6 |
@@ -2602,6 +2624,17 @@ L: linux-kernel@vger.kernel.org | |||
2602 | W: http://www.linux-mm.org | 2624 | W: http://www.linux-mm.org |
2603 | S: Maintained | 2625 | S: Maintained |
2604 | 2626 | ||
2627 | MEMORY RESOURCE CONTROLLER | ||
2628 | P: Balbir Singh | ||
2629 | M: balbir@linux.vnet.ibm.com | ||
2630 | P: Pavel Emelyanov | ||
2631 | M: xemul@openvz.org | ||
2632 | P: KAMEZAWA Hiroyuki | ||
2633 | M: kamezawa.hiroyu@jp.fujitsu.com | ||
2634 | L: linux-mm@kvack.org | ||
2635 | L: linux-kernel@vger.kernel.org | ||
2636 | S: Maintained | ||
2637 | |||
2605 | MEI MN10300/AM33 PORT | 2638 | MEI MN10300/AM33 PORT |
2606 | P: David Howells | 2639 | P: David Howells |
2607 | M: dhowells@redhat.com | 2640 | M: dhowells@redhat.com |
@@ -2726,6 +2759,8 @@ S: Maintained | |||
2726 | NETEFFECT IWARP RNIC DRIVER (IW_NES) | 2759 | NETEFFECT IWARP RNIC DRIVER (IW_NES) |
2727 | P: Faisal Latif | 2760 | P: Faisal Latif |
2728 | M: flatif@neteffect.com | 2761 | M: flatif@neteffect.com |
2762 | P: Nishi Gupta | ||
2763 | M: ngupta@neteffect.com | ||
2729 | P: Glenn Streiff | 2764 | P: Glenn Streiff |
2730 | M: gstreiff@neteffect.com | 2765 | M: gstreiff@neteffect.com |
2731 | L: general@lists.openfabrics.org | 2766 | L: general@lists.openfabrics.org |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 2 | 1 | VERSION = 2 |
2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
3 | SUBLEVEL = 25 | 3 | SUBLEVEL = 25 |
4 | EXTRAVERSION = -rc3 | 4 | EXTRAVERSION = -rc6 |
5 | NAME = Funky Weasel is Jiggy wit it | 5 | NAME = Funky Weasel is Jiggy wit it |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/Kconfig b/arch/Kconfig index 3d72dc3fc8f5..694c9af520bb 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
@@ -27,5 +27,12 @@ config KPROBES | |||
27 | for kernel debugging, non-intrusive instrumentation and testing. | 27 | for kernel debugging, non-intrusive instrumentation and testing. |
28 | If in doubt, say "N". | 28 | If in doubt, say "N". |
29 | 29 | ||
30 | config KRETPROBES | ||
31 | def_bool y | ||
32 | depends on KPROBES && HAVE_KRETPROBES | ||
33 | |||
30 | config HAVE_KPROBES | 34 | config HAVE_KPROBES |
31 | def_bool n | 35 | def_bool n |
36 | |||
37 | config HAVE_KRETPROBES | ||
38 | def_bool n | ||
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 002703b8c0b0..729cdbdf8036 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -330,6 +330,9 @@ config PCI_DOMAINS | |||
330 | config PCI_SYSCALL | 330 | config PCI_SYSCALL |
331 | def_bool PCI | 331 | def_bool PCI |
332 | 332 | ||
333 | config IOMMU_HELPER | ||
334 | def_bool PCI | ||
335 | |||
333 | config ALPHA_CORE_AGP | 336 | config ALPHA_CORE_AGP |
334 | bool | 337 | bool |
335 | depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL | 338 | depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL |
diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index 26d3789dfdd0..4e1c08636edd 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/scatterlist.h> | 10 | #include <linux/scatterlist.h> |
11 | #include <linux/log2.h> | 11 | #include <linux/log2.h> |
12 | #include <linux/dma-mapping.h> | 12 | #include <linux/dma-mapping.h> |
13 | #include <linux/iommu-helper.h> | ||
13 | 14 | ||
14 | #include <asm/io.h> | 15 | #include <asm/io.h> |
15 | #include <asm/hwrpb.h> | 16 | #include <asm/hwrpb.h> |
@@ -31,7 +32,6 @@ | |||
31 | #endif | 32 | #endif |
32 | 33 | ||
33 | #define DEBUG_NODIRECT 0 | 34 | #define DEBUG_NODIRECT 0 |
34 | #define DEBUG_FORCEDAC 0 | ||
35 | 35 | ||
36 | #define ISA_DMA_MASK 0x00ffffff | 36 | #define ISA_DMA_MASK 0x00ffffff |
37 | 37 | ||
@@ -128,37 +128,55 @@ iommu_arena_new(struct pci_controller *hose, dma_addr_t base, | |||
128 | 128 | ||
129 | /* Must be called with the arena lock held */ | 129 | /* Must be called with the arena lock held */ |
130 | static long | 130 | static long |
131 | iommu_arena_find_pages(struct pci_iommu_arena *arena, long n, long mask) | 131 | iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena, |
132 | long n, long mask) | ||
132 | { | 133 | { |
133 | unsigned long *ptes; | 134 | unsigned long *ptes; |
134 | long i, p, nent; | 135 | long i, p, nent; |
136 | int pass = 0; | ||
137 | unsigned long base; | ||
138 | unsigned long boundary_size; | ||
139 | |||
140 | base = arena->dma_base >> PAGE_SHIFT; | ||
141 | if (dev) { | ||
142 | boundary_size = dma_get_seg_boundary(dev) + 1; | ||
143 | boundary_size >>= PAGE_SHIFT; | ||
144 | } else { | ||
145 | boundary_size = 1UL << (32 - PAGE_SHIFT); | ||
146 | } | ||
135 | 147 | ||
136 | /* Search forward for the first mask-aligned sequence of N free ptes */ | 148 | /* Search forward for the first mask-aligned sequence of N free ptes */ |
137 | ptes = arena->ptes; | 149 | ptes = arena->ptes; |
138 | nent = arena->size >> PAGE_SHIFT; | 150 | nent = arena->size >> PAGE_SHIFT; |
139 | p = (arena->next_entry + mask) & ~mask; | 151 | p = ALIGN(arena->next_entry, mask + 1); |
140 | i = 0; | 152 | i = 0; |
153 | |||
154 | again: | ||
141 | while (i < n && p+i < nent) { | 155 | while (i < n && p+i < nent) { |
156 | if (!i && iommu_is_span_boundary(p, n, base, boundary_size)) { | ||
157 | p = ALIGN(p + 1, mask + 1); | ||
158 | goto again; | ||
159 | } | ||
160 | |||
142 | if (ptes[p+i]) | 161 | if (ptes[p+i]) |
143 | p = (p + i + 1 + mask) & ~mask, i = 0; | 162 | p = ALIGN(p + i + 1, mask + 1), i = 0; |
144 | else | 163 | else |
145 | i = i + 1; | 164 | i = i + 1; |
146 | } | 165 | } |
147 | 166 | ||
148 | if (i < n) { | 167 | if (i < n) { |
149 | /* Reached the end. Flush the TLB and restart the | 168 | if (pass < 1) { |
150 | search from the beginning. */ | 169 | /* |
151 | alpha_mv.mv_pci_tbi(arena->hose, 0, -1); | 170 | * Reached the end. Flush the TLB and restart |
152 | 171 | * the search from the beginning. | |
153 | p = 0, i = 0; | 172 | */ |
154 | while (i < n && p+i < nent) { | 173 | alpha_mv.mv_pci_tbi(arena->hose, 0, -1); |
155 | if (ptes[p+i]) | 174 | |
156 | p = (p + i + 1 + mask) & ~mask, i = 0; | 175 | pass++; |
157 | else | 176 | p = 0; |
158 | i = i + 1; | 177 | i = 0; |
159 | } | 178 | goto again; |
160 | 179 | } else | |
161 | if (i < n) | ||
162 | return -1; | 180 | return -1; |
163 | } | 181 | } |
164 | 182 | ||
@@ -168,7 +186,8 @@ iommu_arena_find_pages(struct pci_iommu_arena *arena, long n, long mask) | |||
168 | } | 186 | } |
169 | 187 | ||
170 | static long | 188 | static long |
171 | iommu_arena_alloc(struct pci_iommu_arena *arena, long n, unsigned int align) | 189 | iommu_arena_alloc(struct device *dev, struct pci_iommu_arena *arena, long n, |
190 | unsigned int align) | ||
172 | { | 191 | { |
173 | unsigned long flags; | 192 | unsigned long flags; |
174 | unsigned long *ptes; | 193 | unsigned long *ptes; |
@@ -179,7 +198,7 @@ iommu_arena_alloc(struct pci_iommu_arena *arena, long n, unsigned int align) | |||
179 | /* Search for N empty ptes */ | 198 | /* Search for N empty ptes */ |
180 | ptes = arena->ptes; | 199 | ptes = arena->ptes; |
181 | mask = max(align, arena->align_entry) - 1; | 200 | mask = max(align, arena->align_entry) - 1; |
182 | p = iommu_arena_find_pages(arena, n, mask); | 201 | p = iommu_arena_find_pages(dev, arena, n, mask); |
183 | if (p < 0) { | 202 | if (p < 0) { |
184 | spin_unlock_irqrestore(&arena->lock, flags); | 203 | spin_unlock_irqrestore(&arena->lock, flags); |
185 | return -1; | 204 | return -1; |
@@ -229,6 +248,7 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size, | |||
229 | unsigned long paddr; | 248 | unsigned long paddr; |
230 | dma_addr_t ret; | 249 | dma_addr_t ret; |
231 | unsigned int align = 0; | 250 | unsigned int align = 0; |
251 | struct device *dev = pdev ? &pdev->dev : NULL; | ||
232 | 252 | ||
233 | paddr = __pa(cpu_addr); | 253 | paddr = __pa(cpu_addr); |
234 | 254 | ||
@@ -276,7 +296,7 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size, | |||
276 | /* Force allocation to 64KB boundary for ISA bridges. */ | 296 | /* Force allocation to 64KB boundary for ISA bridges. */ |
277 | if (pdev && pdev == isa_bridge) | 297 | if (pdev && pdev == isa_bridge) |
278 | align = 8; | 298 | align = 8; |
279 | dma_ofs = iommu_arena_alloc(arena, npages, align); | 299 | dma_ofs = iommu_arena_alloc(dev, arena, npages, align); |
280 | if (dma_ofs < 0) { | 300 | if (dma_ofs < 0) { |
281 | printk(KERN_WARNING "pci_map_single failed: " | 301 | printk(KERN_WARNING "pci_map_single failed: " |
282 | "could not allocate dma page tables\n"); | 302 | "could not allocate dma page tables\n"); |
@@ -563,7 +583,7 @@ sg_fill(struct device *dev, struct scatterlist *leader, struct scatterlist *end, | |||
563 | 583 | ||
564 | paddr &= ~PAGE_MASK; | 584 | paddr &= ~PAGE_MASK; |
565 | npages = calc_npages(paddr + size); | 585 | npages = calc_npages(paddr + size); |
566 | dma_ofs = iommu_arena_alloc(arena, npages, 0); | 586 | dma_ofs = iommu_arena_alloc(dev, arena, npages, 0); |
567 | if (dma_ofs < 0) { | 587 | if (dma_ofs < 0) { |
568 | /* If we attempted a direct map above but failed, die. */ | 588 | /* If we attempted a direct map above but failed, die. */ |
569 | if (leader->dma_address == 0) | 589 | if (leader->dma_address == 0) |
@@ -830,7 +850,7 @@ iommu_reserve(struct pci_iommu_arena *arena, long pg_count, long align_mask) | |||
830 | 850 | ||
831 | /* Search for N empty ptes. */ | 851 | /* Search for N empty ptes. */ |
832 | ptes = arena->ptes; | 852 | ptes = arena->ptes; |
833 | p = iommu_arena_find_pages(arena, pg_count, align_mask); | 853 | p = iommu_arena_find_pages(NULL, arena, pg_count, align_mask); |
834 | if (p < 0) { | 854 | if (p < 0) { |
835 | spin_unlock_irqrestore(&arena->lock, flags); | 855 | spin_unlock_irqrestore(&arena->lock, flags); |
836 | return -1; | 856 | return -1; |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 9619c43783ff..955fc53c1c01 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -12,6 +12,7 @@ config ARM | |||
12 | select SYS_SUPPORTS_APM_EMULATION | 12 | select SYS_SUPPORTS_APM_EMULATION |
13 | select HAVE_OPROFILE | 13 | select HAVE_OPROFILE |
14 | select HAVE_KPROBES if (!XIP_KERNEL) | 14 | select HAVE_KPROBES if (!XIP_KERNEL) |
15 | select HAVE_KRETPROBES if (HAVE_KPROBES) | ||
15 | help | 16 | help |
16 | The ARM series is a line of low-power-consumption RISC chip designs | 17 | The ARM series is a line of low-power-consumption RISC chip designs |
17 | licensed by ARM Ltd and targeted at embedded applications and | 18 | licensed by ARM Ltd and targeted at embedded applications and |
@@ -939,7 +940,8 @@ config KEXEC | |||
939 | 940 | ||
940 | config ATAGS_PROC | 941 | config ATAGS_PROC |
941 | bool "Export atags in procfs" | 942 | bool "Export atags in procfs" |
942 | default n | 943 | depends on KEXEC |
944 | default y | ||
943 | help | 945 | help |
944 | Should the atags used to boot the kernel be exported in an "atags" | 946 | Should the atags used to boot the kernel be exported in an "atags" |
945 | file in procfs. Useful with kexec. | 947 | file in procfs. Useful with kexec. |
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 7b8ff66febe1..1a4649667ec8 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -251,6 +251,7 @@ define archhelp | |||
251 | echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)' | 251 | echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)' |
252 | echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)' | 252 | echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)' |
253 | echo '* xipImage - XIP kernel image, if configured (arch/$(ARCH)/boot/xipImage)' | 253 | echo '* xipImage - XIP kernel image, if configured (arch/$(ARCH)/boot/xipImage)' |
254 | echo ' uImage - U-Boot wrapped zImage' | ||
254 | echo ' bootpImage - Combined zImage and initial RAM disk' | 255 | echo ' bootpImage - Combined zImage and initial RAM disk' |
255 | echo ' (supply initrd image via make variable INITRD=<path>)' | 256 | echo ' (supply initrd image via make variable INITRD=<path>)' |
256 | echo ' install - Install uncompressed kernel' | 257 | echo ' install - Install uncompressed kernel' |
diff --git a/arch/arm/common/it8152.c b/arch/arm/common/it8152.c index 97b7dc13d9aa..538262241483 100644 --- a/arch/arm/common/it8152.c +++ b/arch/arm/common/it8152.c | |||
@@ -274,7 +274,7 @@ static int it8152_pci_platform_notify_remove(struct device *dev) | |||
274 | int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size) | 274 | int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size) |
275 | { | 275 | { |
276 | dev_dbg(dev, "%s: dma_addr %08x, size %08x\n", | 276 | dev_dbg(dev, "%s: dma_addr %08x, size %08x\n", |
277 | __FUNCTION__, dma_addr, size); | 277 | __func__, dma_addr, size); |
278 | return (dev->bus == &pci_bus_type) && | 278 | return (dev->bus == &pci_bus_type) && |
279 | ((dma_addr + size - PHYS_OFFSET) >= SZ_64M); | 279 | ((dma_addr + size - PHYS_OFFSET) >= SZ_64M); |
280 | } | 280 | } |
@@ -289,7 +289,7 @@ int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size) | |||
289 | */ | 289 | */ |
290 | int pci_set_dma_mask(struct pci_dev *dev, u64 mask) | 290 | int pci_set_dma_mask(struct pci_dev *dev, u64 mask) |
291 | { | 291 | { |
292 | dev_dbg(&dev->dev, "%s: %llx\n", __FUNCTION__, mask); | 292 | dev_dbg(&dev->dev, "%s: %llx\n", __func__, mask); |
293 | if (mask >= PHYS_OFFSET + SZ_64M - 1) | 293 | if (mask >= PHYS_OFFSET + SZ_64M - 1) |
294 | return 0; | 294 | return 0; |
295 | 295 | ||
@@ -299,7 +299,7 @@ int pci_set_dma_mask(struct pci_dev *dev, u64 mask) | |||
299 | int | 299 | int |
300 | pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) | 300 | pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) |
301 | { | 301 | { |
302 | dev_dbg(&dev->dev, "%s: %llx\n", __FUNCTION__, mask); | 302 | dev_dbg(&dev->dev, "%s: %llx\n", __func__, mask); |
303 | if (mask >= PHYS_OFFSET + SZ_64M - 1) | 303 | if (mask >= PHYS_OFFSET + SZ_64M - 1) |
304 | return 0; | 304 | return 0; |
305 | 305 | ||
diff --git a/arch/arm/configs/omap_h2_1610_defconfig b/arch/arm/configs/omap_h2_1610_defconfig index c2345af3707a..323c1deeb953 100644 --- a/arch/arm/configs/omap_h2_1610_defconfig +++ b/arch/arm/configs/omap_h2_1610_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.24-rc5 | 3 | # Linux kernel version: 2.6.25-rc3 |
4 | # Mon Dec 17 20:04:38 2007 | 4 | # Mon Mar 3 03:39:48 2008 |
5 | # | 5 | # |
6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y |
@@ -21,6 +21,7 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y | |||
21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
22 | CONFIG_GENERIC_HWEIGHT=y | 22 | CONFIG_GENERIC_HWEIGHT=y |
23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
24 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
24 | CONFIG_ZONE_DMA=y | 25 | CONFIG_ZONE_DMA=y |
25 | CONFIG_VECTORS_BASE=0xffff0000 | 26 | CONFIG_VECTORS_BASE=0xffff0000 |
26 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
@@ -40,17 +41,22 @@ CONFIG_SYSVIPC_SYSCTL=y | |||
40 | # CONFIG_POSIX_MQUEUE is not set | 41 | # CONFIG_POSIX_MQUEUE is not set |
41 | # CONFIG_BSD_PROCESS_ACCT is not set | 42 | # CONFIG_BSD_PROCESS_ACCT is not set |
42 | # CONFIG_TASKSTATS is not set | 43 | # CONFIG_TASKSTATS is not set |
43 | # CONFIG_USER_NS is not set | ||
44 | # CONFIG_PID_NS is not set | ||
45 | # CONFIG_AUDIT is not set | 44 | # CONFIG_AUDIT is not set |
46 | # CONFIG_IKCONFIG is not set | 45 | # CONFIG_IKCONFIG is not set |
47 | CONFIG_LOG_BUF_SHIFT=14 | 46 | CONFIG_LOG_BUF_SHIFT=14 |
48 | # CONFIG_CGROUPS is not set | 47 | # CONFIG_CGROUPS is not set |
48 | CONFIG_GROUP_SCHED=y | ||
49 | CONFIG_FAIR_GROUP_SCHED=y | 49 | CONFIG_FAIR_GROUP_SCHED=y |
50 | CONFIG_FAIR_USER_SCHED=y | 50 | # CONFIG_RT_GROUP_SCHED is not set |
51 | # CONFIG_FAIR_CGROUP_SCHED is not set | 51 | CONFIG_USER_SCHED=y |
52 | # CONFIG_CGROUP_SCHED is not set | ||
52 | # CONFIG_SYSFS_DEPRECATED is not set | 53 | # CONFIG_SYSFS_DEPRECATED is not set |
53 | # CONFIG_RELAY is not set | 54 | # CONFIG_RELAY is not set |
55 | CONFIG_NAMESPACES=y | ||
56 | # CONFIG_UTS_NS is not set | ||
57 | # CONFIG_IPC_NS is not set | ||
58 | # CONFIG_USER_NS is not set | ||
59 | # CONFIG_PID_NS is not set | ||
54 | CONFIG_BLK_DEV_INITRD=y | 60 | CONFIG_BLK_DEV_INITRD=y |
55 | CONFIG_INITRAMFS_SOURCE="" | 61 | CONFIG_INITRAMFS_SOURCE="" |
56 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 62 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
@@ -64,17 +70,26 @@ CONFIG_HOTPLUG=y | |||
64 | CONFIG_PRINTK=y | 70 | CONFIG_PRINTK=y |
65 | CONFIG_BUG=y | 71 | CONFIG_BUG=y |
66 | CONFIG_ELF_CORE=y | 72 | CONFIG_ELF_CORE=y |
73 | CONFIG_COMPAT_BRK=y | ||
67 | CONFIG_BASE_FULL=y | 74 | CONFIG_BASE_FULL=y |
68 | CONFIG_FUTEX=y | 75 | CONFIG_FUTEX=y |
69 | CONFIG_ANON_INODES=y | 76 | CONFIG_ANON_INODES=y |
70 | CONFIG_EPOLL=y | 77 | CONFIG_EPOLL=y |
71 | CONFIG_SIGNALFD=y | 78 | CONFIG_SIGNALFD=y |
79 | CONFIG_TIMERFD=y | ||
72 | CONFIG_EVENTFD=y | 80 | CONFIG_EVENTFD=y |
73 | CONFIG_SHMEM=y | 81 | CONFIG_SHMEM=y |
74 | CONFIG_VM_EVENT_COUNTERS=y | 82 | CONFIG_VM_EVENT_COUNTERS=y |
75 | CONFIG_SLAB=y | 83 | CONFIG_SLAB=y |
76 | # CONFIG_SLUB is not set | 84 | # CONFIG_SLUB is not set |
77 | # CONFIG_SLOB is not set | 85 | # CONFIG_SLOB is not set |
86 | # CONFIG_PROFILING is not set | ||
87 | # CONFIG_MARKERS is not set | ||
88 | CONFIG_HAVE_OPROFILE=y | ||
89 | # CONFIG_KPROBES is not set | ||
90 | CONFIG_HAVE_KPROBES=y | ||
91 | CONFIG_PROC_PAGE_MONITOR=y | ||
92 | CONFIG_SLABINFO=y | ||
78 | CONFIG_RT_MUTEXES=y | 93 | CONFIG_RT_MUTEXES=y |
79 | # CONFIG_TINY_SHMEM is not set | 94 | # CONFIG_TINY_SHMEM is not set |
80 | CONFIG_BASE_SMALL=0 | 95 | CONFIG_BASE_SMALL=0 |
@@ -102,6 +117,8 @@ CONFIG_DEFAULT_AS=y | |||
102 | # CONFIG_DEFAULT_CFQ is not set | 117 | # CONFIG_DEFAULT_CFQ is not set |
103 | # CONFIG_DEFAULT_NOOP is not set | 118 | # CONFIG_DEFAULT_NOOP is not set |
104 | CONFIG_DEFAULT_IOSCHED="anticipatory" | 119 | CONFIG_DEFAULT_IOSCHED="anticipatory" |
120 | CONFIG_CLASSIC_RCU=y | ||
121 | # CONFIG_PREEMPT_RCU is not set | ||
105 | 122 | ||
106 | # | 123 | # |
107 | # System Type | 124 | # System Type |
@@ -130,6 +147,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | |||
130 | # CONFIG_ARCH_KS8695 is not set | 147 | # CONFIG_ARCH_KS8695 is not set |
131 | # CONFIG_ARCH_NS9XXX is not set | 148 | # CONFIG_ARCH_NS9XXX is not set |
132 | # CONFIG_ARCH_MXC is not set | 149 | # CONFIG_ARCH_MXC is not set |
150 | # CONFIG_ARCH_ORION is not set | ||
133 | # CONFIG_ARCH_PNX4008 is not set | 151 | # CONFIG_ARCH_PNX4008 is not set |
134 | # CONFIG_ARCH_PXA is not set | 152 | # CONFIG_ARCH_PXA is not set |
135 | # CONFIG_ARCH_RPC is not set | 153 | # CONFIG_ARCH_RPC is not set |
@@ -139,6 +157,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory" | |||
139 | # CONFIG_ARCH_LH7A40X is not set | 157 | # CONFIG_ARCH_LH7A40X is not set |
140 | # CONFIG_ARCH_DAVINCI is not set | 158 | # CONFIG_ARCH_DAVINCI is not set |
141 | CONFIG_ARCH_OMAP=y | 159 | CONFIG_ARCH_OMAP=y |
160 | # CONFIG_ARCH_MSM7X00A is not set | ||
142 | 161 | ||
143 | # | 162 | # |
144 | # TI OMAP Implementations | 163 | # TI OMAP Implementations |
@@ -155,6 +174,7 @@ CONFIG_OMAP_MUX=y | |||
155 | # CONFIG_OMAP_MUX_DEBUG is not set | 174 | # CONFIG_OMAP_MUX_DEBUG is not set |
156 | CONFIG_OMAP_MUX_WARNINGS=y | 175 | CONFIG_OMAP_MUX_WARNINGS=y |
157 | CONFIG_OMAP_MCBSP=y | 176 | CONFIG_OMAP_MCBSP=y |
177 | # CONFIG_OMAP_MMU_FWK is not set | ||
158 | # CONFIG_OMAP_MPU_TIMER is not set | 178 | # CONFIG_OMAP_MPU_TIMER is not set |
159 | CONFIG_OMAP_32K_TIMER=y | 179 | CONFIG_OMAP_32K_TIMER=y |
160 | CONFIG_OMAP_32K_TIMER_HZ=128 | 180 | CONFIG_OMAP_32K_TIMER_HZ=128 |
@@ -266,6 +286,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0 | |||
266 | CONFIG_CMDLINE="mem=32M console=ttyS0,115200n8 root=0801 ro init=/bin/sh" | 286 | CONFIG_CMDLINE="mem=32M console=ttyS0,115200n8 root=0801 ro init=/bin/sh" |
267 | # CONFIG_XIP_KERNEL is not set | 287 | # CONFIG_XIP_KERNEL is not set |
268 | # CONFIG_KEXEC is not set | 288 | # CONFIG_KEXEC is not set |
289 | # CONFIG_ATAGS_PROC is not set | ||
269 | 290 | ||
270 | # | 291 | # |
271 | # CPU Frequency scaling | 292 | # CPU Frequency scaling |
@@ -311,9 +332,10 @@ CONFIG_PM=y | |||
311 | # CONFIG_PM_LEGACY is not set | 332 | # CONFIG_PM_LEGACY is not set |
312 | # CONFIG_PM_DEBUG is not set | 333 | # CONFIG_PM_DEBUG is not set |
313 | CONFIG_PM_SLEEP=y | 334 | CONFIG_PM_SLEEP=y |
314 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
315 | CONFIG_SUSPEND=y | 335 | CONFIG_SUSPEND=y |
336 | CONFIG_SUSPEND_FREEZER=y | ||
316 | # CONFIG_APM_EMULATION is not set | 337 | # CONFIG_APM_EMULATION is not set |
338 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
317 | 339 | ||
318 | # | 340 | # |
319 | # Networking | 341 | # Networking |
@@ -330,6 +352,7 @@ CONFIG_XFRM=y | |||
330 | # CONFIG_XFRM_USER is not set | 352 | # CONFIG_XFRM_USER is not set |
331 | # CONFIG_XFRM_SUB_POLICY is not set | 353 | # CONFIG_XFRM_SUB_POLICY is not set |
332 | # CONFIG_XFRM_MIGRATE is not set | 354 | # CONFIG_XFRM_MIGRATE is not set |
355 | # CONFIG_XFRM_STATISTICS is not set | ||
333 | # CONFIG_NET_KEY is not set | 356 | # CONFIG_NET_KEY is not set |
334 | CONFIG_INET=y | 357 | CONFIG_INET=y |
335 | # CONFIG_IP_MULTICAST is not set | 358 | # CONFIG_IP_MULTICAST is not set |
@@ -384,6 +407,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
384 | # | 407 | # |
385 | # CONFIG_NET_PKTGEN is not set | 408 | # CONFIG_NET_PKTGEN is not set |
386 | # CONFIG_HAMRADIO is not set | 409 | # CONFIG_HAMRADIO is not set |
410 | # CONFIG_CAN is not set | ||
387 | # CONFIG_IRDA is not set | 411 | # CONFIG_IRDA is not set |
388 | # CONFIG_BT is not set | 412 | # CONFIG_BT is not set |
389 | # CONFIG_AF_RXRPC is not set | 413 | # CONFIG_AF_RXRPC is not set |
@@ -421,11 +445,13 @@ CONFIG_BLK_DEV_LOOP=y | |||
421 | CONFIG_BLK_DEV_RAM=y | 445 | CONFIG_BLK_DEV_RAM=y |
422 | CONFIG_BLK_DEV_RAM_COUNT=16 | 446 | CONFIG_BLK_DEV_RAM_COUNT=16 |
423 | CONFIG_BLK_DEV_RAM_SIZE=8192 | 447 | CONFIG_BLK_DEV_RAM_SIZE=8192 |
424 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 448 | # CONFIG_BLK_DEV_XIP is not set |
425 | # CONFIG_CDROM_PKTCDVD is not set | 449 | # CONFIG_CDROM_PKTCDVD is not set |
426 | CONFIG_ATA_OVER_ETH=m | 450 | CONFIG_ATA_OVER_ETH=m |
427 | CONFIG_MISC_DEVICES=y | 451 | CONFIG_MISC_DEVICES=y |
428 | # CONFIG_EEPROM_93CX6 is not set | 452 | # CONFIG_EEPROM_93CX6 is not set |
453 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
454 | # CONFIG_HAVE_IDE is not set | ||
429 | 455 | ||
430 | # | 456 | # |
431 | # SCSI device support | 457 | # SCSI device support |
@@ -489,6 +515,7 @@ CONFIG_SMC91X=y | |||
489 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 515 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
490 | # CONFIG_B44 is not set | 516 | # CONFIG_B44 is not set |
491 | CONFIG_NETDEV_1000=y | 517 | CONFIG_NETDEV_1000=y |
518 | # CONFIG_E1000E_ENABLED is not set | ||
492 | CONFIG_NETDEV_10000=y | 519 | CONFIG_NETDEV_10000=y |
493 | 520 | ||
494 | # | 521 | # |
@@ -512,7 +539,6 @@ CONFIG_SLIP_COMPRESSED=y | |||
512 | CONFIG_SLHC=y | 539 | CONFIG_SLHC=y |
513 | # CONFIG_SLIP_SMART is not set | 540 | # CONFIG_SLIP_SMART is not set |
514 | # CONFIG_SLIP_MODE_SLIP6 is not set | 541 | # CONFIG_SLIP_MODE_SLIP6 is not set |
515 | # CONFIG_SHAPER is not set | ||
516 | # CONFIG_NETCONSOLE is not set | 542 | # CONFIG_NETCONSOLE is not set |
517 | # CONFIG_NETPOLL is not set | 543 | # CONFIG_NETPOLL is not set |
518 | # CONFIG_NET_POLL_CONTROLLER is not set | 544 | # CONFIG_NET_POLL_CONTROLLER is not set |
@@ -616,12 +642,10 @@ CONFIG_I2C_OMAP=y | |||
616 | # | 642 | # |
617 | # Miscellaneous I2C Chip support | 643 | # Miscellaneous I2C Chip support |
618 | # | 644 | # |
619 | # CONFIG_SENSORS_DS1337 is not set | ||
620 | # CONFIG_SENSORS_DS1374 is not set | ||
621 | # CONFIG_DS1682 is not set | 645 | # CONFIG_DS1682 is not set |
622 | # CONFIG_SENSORS_EEPROM is not set | 646 | # CONFIG_SENSORS_EEPROM is not set |
623 | # CONFIG_SENSORS_PCF8574 is not set | 647 | # CONFIG_SENSORS_PCF8574 is not set |
624 | # CONFIG_SENSORS_PCA9539 is not set | 648 | # CONFIG_PCF8575 is not set |
625 | # CONFIG_SENSORS_PCF8591 is not set | 649 | # CONFIG_SENSORS_PCF8591 is not set |
626 | # CONFIG_ISP1301_OMAP is not set | 650 | # CONFIG_ISP1301_OMAP is not set |
627 | CONFIG_TPS65010=y | 651 | CONFIG_TPS65010=y |
@@ -649,6 +673,7 @@ CONFIG_HWMON=y | |||
649 | # CONFIG_SENSORS_ADM1031 is not set | 673 | # CONFIG_SENSORS_ADM1031 is not set |
650 | # CONFIG_SENSORS_ADM9240 is not set | 674 | # CONFIG_SENSORS_ADM9240 is not set |
651 | # CONFIG_SENSORS_ADT7470 is not set | 675 | # CONFIG_SENSORS_ADT7470 is not set |
676 | # CONFIG_SENSORS_ADT7473 is not set | ||
652 | # CONFIG_SENSORS_ATXP1 is not set | 677 | # CONFIG_SENSORS_ATXP1 is not set |
653 | # CONFIG_SENSORS_DS1621 is not set | 678 | # CONFIG_SENSORS_DS1621 is not set |
654 | # CONFIG_SENSORS_F71805F is not set | 679 | # CONFIG_SENSORS_F71805F is not set |
@@ -676,6 +701,7 @@ CONFIG_HWMON=y | |||
676 | # CONFIG_SENSORS_SMSC47M1 is not set | 701 | # CONFIG_SENSORS_SMSC47M1 is not set |
677 | # CONFIG_SENSORS_SMSC47M192 is not set | 702 | # CONFIG_SENSORS_SMSC47M192 is not set |
678 | # CONFIG_SENSORS_SMSC47B397 is not set | 703 | # CONFIG_SENSORS_SMSC47B397 is not set |
704 | # CONFIG_SENSORS_ADS7828 is not set | ||
679 | # CONFIG_SENSORS_THMC50 is not set | 705 | # CONFIG_SENSORS_THMC50 is not set |
680 | # CONFIG_SENSORS_VT1211 is not set | 706 | # CONFIG_SENSORS_VT1211 is not set |
681 | # CONFIG_SENSORS_W83781D is not set | 707 | # CONFIG_SENSORS_W83781D is not set |
@@ -683,6 +709,7 @@ CONFIG_HWMON=y | |||
683 | # CONFIG_SENSORS_W83792D is not set | 709 | # CONFIG_SENSORS_W83792D is not set |
684 | # CONFIG_SENSORS_W83793 is not set | 710 | # CONFIG_SENSORS_W83793 is not set |
685 | # CONFIG_SENSORS_W83L785TS is not set | 711 | # CONFIG_SENSORS_W83L785TS is not set |
712 | # CONFIG_SENSORS_W83L786NG is not set | ||
686 | # CONFIG_SENSORS_W83627HF is not set | 713 | # CONFIG_SENSORS_W83627HF is not set |
687 | # CONFIG_SENSORS_W83627EHF is not set | 714 | # CONFIG_SENSORS_W83627EHF is not set |
688 | # CONFIG_HWMON_DEBUG_CHIP is not set | 715 | # CONFIG_HWMON_DEBUG_CHIP is not set |
@@ -705,6 +732,7 @@ CONFIG_SSB_POSSIBLE=y | |||
705 | # Multifunction device drivers | 732 | # Multifunction device drivers |
706 | # | 733 | # |
707 | # CONFIG_MFD_SM501 is not set | 734 | # CONFIG_MFD_SM501 is not set |
735 | # CONFIG_MFD_ASIC3 is not set | ||
708 | 736 | ||
709 | # | 737 | # |
710 | # Multimedia devices | 738 | # Multimedia devices |
@@ -802,10 +830,6 @@ CONFIG_USB_ARCH_HAS_OHCI=y | |||
802 | # | 830 | # |
803 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 831 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
804 | # | 832 | # |
805 | |||
806 | # | ||
807 | # USB Gadget Support | ||
808 | # | ||
809 | # CONFIG_USB_GADGET is not set | 833 | # CONFIG_USB_GADGET is not set |
810 | # CONFIG_MMC is not set | 834 | # CONFIG_MMC is not set |
811 | # CONFIG_NEW_LEDS is not set | 835 | # CONFIG_NEW_LEDS is not set |
@@ -826,12 +850,10 @@ CONFIG_EXT2_FS=y | |||
826 | # CONFIG_XFS_FS is not set | 850 | # CONFIG_XFS_FS is not set |
827 | # CONFIG_GFS2_FS is not set | 851 | # CONFIG_GFS2_FS is not set |
828 | # CONFIG_OCFS2_FS is not set | 852 | # CONFIG_OCFS2_FS is not set |
829 | # CONFIG_MINIX_FS is not set | 853 | CONFIG_DNOTIFY=y |
830 | CONFIG_ROMFS_FS=y | ||
831 | CONFIG_INOTIFY=y | 854 | CONFIG_INOTIFY=y |
832 | CONFIG_INOTIFY_USER=y | 855 | CONFIG_INOTIFY_USER=y |
833 | # CONFIG_QUOTA is not set | 856 | # CONFIG_QUOTA is not set |
834 | CONFIG_DNOTIFY=y | ||
835 | # CONFIG_AUTOFS_FS is not set | 857 | # CONFIG_AUTOFS_FS is not set |
836 | # CONFIG_AUTOFS4_FS is not set | 858 | # CONFIG_AUTOFS4_FS is not set |
837 | # CONFIG_FUSE_FS is not set | 859 | # CONFIG_FUSE_FS is not set |
@@ -874,8 +896,10 @@ CONFIG_SYSFS=y | |||
874 | # CONFIG_EFS_FS is not set | 896 | # CONFIG_EFS_FS is not set |
875 | CONFIG_CRAMFS=y | 897 | CONFIG_CRAMFS=y |
876 | # CONFIG_VXFS_FS is not set | 898 | # CONFIG_VXFS_FS is not set |
899 | # CONFIG_MINIX_FS is not set | ||
877 | # CONFIG_HPFS_FS is not set | 900 | # CONFIG_HPFS_FS is not set |
878 | # CONFIG_QNX4FS_FS is not set | 901 | # CONFIG_QNX4FS_FS is not set |
902 | CONFIG_ROMFS_FS=y | ||
879 | # CONFIG_SYSV_FS is not set | 903 | # CONFIG_SYSV_FS is not set |
880 | # CONFIG_UFS_FS is not set | 904 | # CONFIG_UFS_FS is not set |
881 | CONFIG_NETWORK_FILESYSTEMS=y | 905 | CONFIG_NETWORK_FILESYSTEMS=y |
@@ -946,9 +970,6 @@ CONFIG_NLS_ISO8859_1=y | |||
946 | # CONFIG_NLS_KOI8_U is not set | 970 | # CONFIG_NLS_KOI8_U is not set |
947 | # CONFIG_NLS_UTF8 is not set | 971 | # CONFIG_NLS_UTF8 is not set |
948 | # CONFIG_DLM is not set | 972 | # CONFIG_DLM is not set |
949 | CONFIG_INSTRUMENTATION=y | ||
950 | # CONFIG_PROFILING is not set | ||
951 | # CONFIG_MARKERS is not set | ||
952 | 973 | ||
953 | # | 974 | # |
954 | # Kernel hacking | 975 | # Kernel hacking |
@@ -975,6 +996,7 @@ CONFIG_FRAME_POINTER=y | |||
975 | CONFIG_CRYPTO=y | 996 | CONFIG_CRYPTO=y |
976 | CONFIG_CRYPTO_ALGAPI=y | 997 | CONFIG_CRYPTO_ALGAPI=y |
977 | CONFIG_CRYPTO_BLKCIPHER=y | 998 | CONFIG_CRYPTO_BLKCIPHER=y |
999 | # CONFIG_CRYPTO_SEQIV is not set | ||
978 | CONFIG_CRYPTO_MANAGER=y | 1000 | CONFIG_CRYPTO_MANAGER=y |
979 | # CONFIG_CRYPTO_HMAC is not set | 1001 | # CONFIG_CRYPTO_HMAC is not set |
980 | # CONFIG_CRYPTO_XCBC is not set | 1002 | # CONFIG_CRYPTO_XCBC is not set |
@@ -992,6 +1014,9 @@ CONFIG_CRYPTO_CBC=y | |||
992 | CONFIG_CRYPTO_PCBC=m | 1014 | CONFIG_CRYPTO_PCBC=m |
993 | # CONFIG_CRYPTO_LRW is not set | 1015 | # CONFIG_CRYPTO_LRW is not set |
994 | # CONFIG_CRYPTO_XTS is not set | 1016 | # CONFIG_CRYPTO_XTS is not set |
1017 | # CONFIG_CRYPTO_CTR is not set | ||
1018 | # CONFIG_CRYPTO_GCM is not set | ||
1019 | # CONFIG_CRYPTO_CCM is not set | ||
995 | # CONFIG_CRYPTO_CRYPTD is not set | 1020 | # CONFIG_CRYPTO_CRYPTD is not set |
996 | CONFIG_CRYPTO_DES=y | 1021 | CONFIG_CRYPTO_DES=y |
997 | # CONFIG_CRYPTO_FCRYPT is not set | 1022 | # CONFIG_CRYPTO_FCRYPT is not set |
@@ -1006,12 +1031,14 @@ CONFIG_CRYPTO_DES=y | |||
1006 | # CONFIG_CRYPTO_KHAZAD is not set | 1031 | # CONFIG_CRYPTO_KHAZAD is not set |
1007 | # CONFIG_CRYPTO_ANUBIS is not set | 1032 | # CONFIG_CRYPTO_ANUBIS is not set |
1008 | # CONFIG_CRYPTO_SEED is not set | 1033 | # CONFIG_CRYPTO_SEED is not set |
1034 | # CONFIG_CRYPTO_SALSA20 is not set | ||
1009 | # CONFIG_CRYPTO_DEFLATE is not set | 1035 | # CONFIG_CRYPTO_DEFLATE is not set |
1010 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 1036 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
1011 | # CONFIG_CRYPTO_CRC32C is not set | 1037 | # CONFIG_CRYPTO_CRC32C is not set |
1012 | # CONFIG_CRYPTO_CAMELLIA is not set | 1038 | # CONFIG_CRYPTO_CAMELLIA is not set |
1013 | # CONFIG_CRYPTO_TEST is not set | 1039 | # CONFIG_CRYPTO_TEST is not set |
1014 | # CONFIG_CRYPTO_AUTHENC is not set | 1040 | # CONFIG_CRYPTO_AUTHENC is not set |
1041 | # CONFIG_CRYPTO_LZO is not set | ||
1015 | CONFIG_CRYPTO_HW=y | 1042 | CONFIG_CRYPTO_HW=y |
1016 | 1043 | ||
1017 | # | 1044 | # |
diff --git a/arch/arm/configs/omap_osk_5912_defconfig b/arch/arm/configs/omap_osk_5912_defconfig index d592a6487114..d4ca5e6e4ffa 100644 --- a/arch/arm/configs/omap_osk_5912_defconfig +++ b/arch/arm/configs/omap_osk_5912_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.24-rc5 | 3 | # Linux kernel version: 2.6.25-rc3 |
4 | # Mon Dec 17 21:12:45 2007 | 4 | # Mon Mar 3 03:35:17 2008 |
5 | # | 5 | # |
6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | 7 | CONFIG_SYS_SUPPORTS_APM_EMULATION=y |
@@ -21,6 +21,7 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y | |||
21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
22 | CONFIG_GENERIC_HWEIGHT=y | 22 | CONFIG_GENERIC_HWEIGHT=y |
23 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 23 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
24 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
24 | CONFIG_ZONE_DMA=y | 25 | CONFIG_ZONE_DMA=y |
25 | CONFIG_VECTORS_BASE=0xffff0000 | 26 | CONFIG_VECTORS_BASE=0xffff0000 |
26 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 27 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
@@ -39,17 +40,22 @@ CONFIG_SYSVIPC_SYSCTL=y | |||
39 | # CONFIG_POSIX_MQUEUE is not set | 40 | # CONFIG_POSIX_MQUEUE is not set |
40 | # CONFIG_BSD_PROCESS_ACCT is not set | 41 | # CONFIG_BSD_PROCESS_ACCT is not set |
41 | # CONFIG_TASKSTATS is not set | 42 | # CONFIG_TASKSTATS is not set |
42 | # CONFIG_USER_NS is not set | ||
43 | # CONFIG_PID_NS is not set | ||
44 | # CONFIG_AUDIT is not set | 43 | # CONFIG_AUDIT is not set |
45 | # CONFIG_IKCONFIG is not set | 44 | # CONFIG_IKCONFIG is not set |
46 | CONFIG_LOG_BUF_SHIFT=14 | 45 | CONFIG_LOG_BUF_SHIFT=14 |
47 | # CONFIG_CGROUPS is not set | 46 | # CONFIG_CGROUPS is not set |
47 | CONFIG_GROUP_SCHED=y | ||
48 | CONFIG_FAIR_GROUP_SCHED=y | 48 | CONFIG_FAIR_GROUP_SCHED=y |
49 | CONFIG_FAIR_USER_SCHED=y | 49 | # CONFIG_RT_GROUP_SCHED is not set |
50 | # CONFIG_FAIR_CGROUP_SCHED is not set | 50 | CONFIG_USER_SCHED=y |
51 | # CONFIG_CGROUP_SCHED is not set | ||
51 | # CONFIG_SYSFS_DEPRECATED is not set | 52 | # CONFIG_SYSFS_DEPRECATED is not set |
52 | # CONFIG_RELAY is not set | 53 | # CONFIG_RELAY is not set |
54 | CONFIG_NAMESPACES=y | ||
55 | # CONFIG_UTS_NS is not set | ||
56 | # CONFIG_IPC_NS is not set | ||
57 | # CONFIG_USER_NS is not set | ||
58 | # CONFIG_PID_NS is not set | ||
53 | CONFIG_BLK_DEV_INITRD=y | 59 | CONFIG_BLK_DEV_INITRD=y |
54 | CONFIG_INITRAMFS_SOURCE="" | 60 | CONFIG_INITRAMFS_SOURCE="" |
55 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 61 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
@@ -63,17 +69,26 @@ CONFIG_HOTPLUG=y | |||
63 | CONFIG_PRINTK=y | 69 | CONFIG_PRINTK=y |
64 | CONFIG_BUG=y | 70 | CONFIG_BUG=y |
65 | CONFIG_ELF_CORE=y | 71 | CONFIG_ELF_CORE=y |
72 | CONFIG_COMPAT_BRK=y | ||
66 | CONFIG_BASE_FULL=y | 73 | CONFIG_BASE_FULL=y |
67 | CONFIG_FUTEX=y | 74 | CONFIG_FUTEX=y |
68 | CONFIG_ANON_INODES=y | 75 | CONFIG_ANON_INODES=y |
69 | CONFIG_EPOLL=y | 76 | CONFIG_EPOLL=y |
70 | CONFIG_SIGNALFD=y | 77 | CONFIG_SIGNALFD=y |
78 | CONFIG_TIMERFD=y | ||
71 | CONFIG_EVENTFD=y | 79 | CONFIG_EVENTFD=y |
72 | CONFIG_SHMEM=y | 80 | CONFIG_SHMEM=y |
73 | CONFIG_VM_EVENT_COUNTERS=y | 81 | CONFIG_VM_EVENT_COUNTERS=y |
74 | CONFIG_SLAB=y | 82 | CONFIG_SLAB=y |
75 | # CONFIG_SLUB is not set | 83 | # CONFIG_SLUB is not set |
76 | # CONFIG_SLOB is not set | 84 | # CONFIG_SLOB is not set |
85 | # CONFIG_PROFILING is not set | ||
86 | # CONFIG_MARKERS is not set | ||
87 | CONFIG_HAVE_OPROFILE=y | ||
88 | # CONFIG_KPROBES is not set | ||
89 | CONFIG_HAVE_KPROBES=y | ||
90 | CONFIG_PROC_PAGE_MONITOR=y | ||
91 | CONFIG_SLABINFO=y | ||
77 | CONFIG_RT_MUTEXES=y | 92 | CONFIG_RT_MUTEXES=y |
78 | # CONFIG_TINY_SHMEM is not set | 93 | # CONFIG_TINY_SHMEM is not set |
79 | CONFIG_BASE_SMALL=0 | 94 | CONFIG_BASE_SMALL=0 |
@@ -101,6 +116,8 @@ CONFIG_IOSCHED_CFQ=y | |||
101 | CONFIG_DEFAULT_CFQ=y | 116 | CONFIG_DEFAULT_CFQ=y |
102 | # CONFIG_DEFAULT_NOOP is not set | 117 | # CONFIG_DEFAULT_NOOP is not set |
103 | CONFIG_DEFAULT_IOSCHED="cfq" | 118 | CONFIG_DEFAULT_IOSCHED="cfq" |
119 | CONFIG_CLASSIC_RCU=y | ||
120 | # CONFIG_PREEMPT_RCU is not set | ||
104 | 121 | ||
105 | # | 122 | # |
106 | # System Type | 123 | # System Type |
@@ -129,6 +146,7 @@ CONFIG_DEFAULT_IOSCHED="cfq" | |||
129 | # CONFIG_ARCH_KS8695 is not set | 146 | # CONFIG_ARCH_KS8695 is not set |
130 | # CONFIG_ARCH_NS9XXX is not set | 147 | # CONFIG_ARCH_NS9XXX is not set |
131 | # CONFIG_ARCH_MXC is not set | 148 | # CONFIG_ARCH_MXC is not set |
149 | # CONFIG_ARCH_ORION is not set | ||
132 | # CONFIG_ARCH_PNX4008 is not set | 150 | # CONFIG_ARCH_PNX4008 is not set |
133 | # CONFIG_ARCH_PXA is not set | 151 | # CONFIG_ARCH_PXA is not set |
134 | # CONFIG_ARCH_RPC is not set | 152 | # CONFIG_ARCH_RPC is not set |
@@ -138,6 +156,7 @@ CONFIG_DEFAULT_IOSCHED="cfq" | |||
138 | # CONFIG_ARCH_LH7A40X is not set | 156 | # CONFIG_ARCH_LH7A40X is not set |
139 | # CONFIG_ARCH_DAVINCI is not set | 157 | # CONFIG_ARCH_DAVINCI is not set |
140 | CONFIG_ARCH_OMAP=y | 158 | CONFIG_ARCH_OMAP=y |
159 | # CONFIG_ARCH_MSM7X00A is not set | ||
141 | 160 | ||
142 | # | 161 | # |
143 | # TI OMAP Implementations | 162 | # TI OMAP Implementations |
@@ -154,6 +173,7 @@ CONFIG_OMAP_MUX=y | |||
154 | # CONFIG_OMAP_MUX_DEBUG is not set | 173 | # CONFIG_OMAP_MUX_DEBUG is not set |
155 | CONFIG_OMAP_MUX_WARNINGS=y | 174 | CONFIG_OMAP_MUX_WARNINGS=y |
156 | CONFIG_OMAP_MCBSP=y | 175 | CONFIG_OMAP_MCBSP=y |
176 | # CONFIG_OMAP_MMU_FWK is not set | ||
157 | # CONFIG_OMAP_MPU_TIMER is not set | 177 | # CONFIG_OMAP_MPU_TIMER is not set |
158 | CONFIG_OMAP_32K_TIMER=y | 178 | CONFIG_OMAP_32K_TIMER=y |
159 | CONFIG_OMAP_32K_TIMER_HZ=128 | 179 | CONFIG_OMAP_32K_TIMER_HZ=128 |
@@ -173,13 +193,13 @@ CONFIG_ARCH_OMAP16XX=y | |||
173 | # | 193 | # |
174 | # OMAP Board Type | 194 | # OMAP Board Type |
175 | # | 195 | # |
176 | # CONFIG_MACH_OMAP_INNOVATOR is not set | 196 | CONFIG_MACH_OMAP_INNOVATOR=y |
177 | # CONFIG_MACH_OMAP_H2 is not set | 197 | CONFIG_MACH_OMAP_H2=y |
178 | # CONFIG_MACH_OMAP_H3 is not set | 198 | CONFIG_MACH_OMAP_H3=y |
179 | CONFIG_MACH_OMAP_OSK=y | 199 | CONFIG_MACH_OMAP_OSK=y |
180 | # CONFIG_OMAP_OSK_MISTRAL is not set | 200 | # CONFIG_OMAP_OSK_MISTRAL is not set |
181 | # CONFIG_MACH_NOKIA770 is not set | 201 | CONFIG_MACH_NOKIA770=y |
182 | # CONFIG_MACH_OMAP_GENERIC is not set | 202 | CONFIG_MACH_OMAP_GENERIC=y |
183 | 203 | ||
184 | # | 204 | # |
185 | # OMAP CPU Speed | 205 | # OMAP CPU Speed |
@@ -275,6 +295,7 @@ CONFIG_ZBOOT_ROM_BSS=0x0 | |||
275 | CONFIG_CMDLINE="mem=32M console=ttyS0,115200 initrd=0x10400000,8M root=/dev/ram0 rw" | 295 | CONFIG_CMDLINE="mem=32M console=ttyS0,115200 initrd=0x10400000,8M root=/dev/ram0 rw" |
276 | # CONFIG_XIP_KERNEL is not set | 296 | # CONFIG_XIP_KERNEL is not set |
277 | # CONFIG_KEXEC is not set | 297 | # CONFIG_KEXEC is not set |
298 | # CONFIG_ATAGS_PROC is not set | ||
278 | 299 | ||
279 | # | 300 | # |
280 | # CPU Frequency scaling | 301 | # CPU Frequency scaling |
@@ -307,9 +328,10 @@ CONFIG_PM=y | |||
307 | # CONFIG_PM_LEGACY is not set | 328 | # CONFIG_PM_LEGACY is not set |
308 | # CONFIG_PM_DEBUG is not set | 329 | # CONFIG_PM_DEBUG is not set |
309 | CONFIG_PM_SLEEP=y | 330 | CONFIG_PM_SLEEP=y |
310 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
311 | CONFIG_SUSPEND=y | 331 | CONFIG_SUSPEND=y |
332 | CONFIG_SUSPEND_FREEZER=y | ||
312 | # CONFIG_APM_EMULATION is not set | 333 | # CONFIG_APM_EMULATION is not set |
334 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
313 | 335 | ||
314 | # | 336 | # |
315 | # Networking | 337 | # Networking |
@@ -326,6 +348,7 @@ CONFIG_XFRM=y | |||
326 | # CONFIG_XFRM_USER is not set | 348 | # CONFIG_XFRM_USER is not set |
327 | # CONFIG_XFRM_SUB_POLICY is not set | 349 | # CONFIG_XFRM_SUB_POLICY is not set |
328 | # CONFIG_XFRM_MIGRATE is not set | 350 | # CONFIG_XFRM_MIGRATE is not set |
351 | # CONFIG_XFRM_STATISTICS is not set | ||
329 | # CONFIG_NET_KEY is not set | 352 | # CONFIG_NET_KEY is not set |
330 | CONFIG_INET=y | 353 | CONFIG_INET=y |
331 | CONFIG_IP_MULTICAST=y | 354 | CONFIG_IP_MULTICAST=y |
@@ -381,6 +404,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
381 | # | 404 | # |
382 | # CONFIG_NET_PKTGEN is not set | 405 | # CONFIG_NET_PKTGEN is not set |
383 | # CONFIG_HAMRADIO is not set | 406 | # CONFIG_HAMRADIO is not set |
407 | # CONFIG_CAN is not set | ||
384 | # CONFIG_IRDA is not set | 408 | # CONFIG_IRDA is not set |
385 | # CONFIG_BT is not set | 409 | # CONFIG_BT is not set |
386 | # CONFIG_AF_RXRPC is not set | 410 | # CONFIG_AF_RXRPC is not set |
@@ -493,11 +517,13 @@ CONFIG_BLK_DEV_LOOP=y | |||
493 | CONFIG_BLK_DEV_RAM=y | 517 | CONFIG_BLK_DEV_RAM=y |
494 | CONFIG_BLK_DEV_RAM_COUNT=16 | 518 | CONFIG_BLK_DEV_RAM_COUNT=16 |
495 | CONFIG_BLK_DEV_RAM_SIZE=8192 | 519 | CONFIG_BLK_DEV_RAM_SIZE=8192 |
496 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 520 | # CONFIG_BLK_DEV_XIP is not set |
497 | # CONFIG_CDROM_PKTCDVD is not set | 521 | # CONFIG_CDROM_PKTCDVD is not set |
498 | # CONFIG_ATA_OVER_ETH is not set | 522 | # CONFIG_ATA_OVER_ETH is not set |
499 | CONFIG_MISC_DEVICES=y | 523 | CONFIG_MISC_DEVICES=y |
500 | # CONFIG_EEPROM_93CX6 is not set | 524 | # CONFIG_EEPROM_93CX6 is not set |
525 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
526 | CONFIG_HAVE_IDE=y | ||
501 | CONFIG_IDE=m | 527 | CONFIG_IDE=m |
502 | CONFIG_BLK_DEV_IDE=m | 528 | CONFIG_BLK_DEV_IDE=m |
503 | 529 | ||
@@ -519,7 +545,6 @@ CONFIG_IDE_PROC_FS=y | |||
519 | # | 545 | # |
520 | # CONFIG_IDE_GENERIC is not set | 546 | # CONFIG_IDE_GENERIC is not set |
521 | # CONFIG_BLK_DEV_PLATFORM is not set | 547 | # CONFIG_BLK_DEV_PLATFORM is not set |
522 | # CONFIG_IDE_ARM is not set | ||
523 | # CONFIG_BLK_DEV_IDEDMA is not set | 548 | # CONFIG_BLK_DEV_IDEDMA is not set |
524 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y | 549 | CONFIG_IDE_ARCH_OBSOLETE_INIT=y |
525 | # CONFIG_BLK_DEV_HD is not set | 550 | # CONFIG_BLK_DEV_HD is not set |
@@ -553,6 +578,7 @@ CONFIG_SMC91X=y | |||
553 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 578 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
554 | # CONFIG_B44 is not set | 579 | # CONFIG_B44 is not set |
555 | CONFIG_NETDEV_1000=y | 580 | CONFIG_NETDEV_1000=y |
581 | # CONFIG_E1000E_ENABLED is not set | ||
556 | CONFIG_NETDEV_10000=y | 582 | CONFIG_NETDEV_10000=y |
557 | 583 | ||
558 | # | 584 | # |
@@ -574,7 +600,6 @@ CONFIG_PPP_MULTILINK=y | |||
574 | # CONFIG_PPPOL2TP is not set | 600 | # CONFIG_PPPOL2TP is not set |
575 | # CONFIG_SLIP is not set | 601 | # CONFIG_SLIP is not set |
576 | CONFIG_SLHC=y | 602 | CONFIG_SLHC=y |
577 | # CONFIG_SHAPER is not set | ||
578 | # CONFIG_NETCONSOLE is not set | 603 | # CONFIG_NETCONSOLE is not set |
579 | # CONFIG_NETPOLL is not set | 604 | # CONFIG_NETPOLL is not set |
580 | # CONFIG_NET_POLL_CONTROLLER is not set | 605 | # CONFIG_NET_POLL_CONTROLLER is not set |
@@ -671,6 +696,7 @@ CONFIG_HW_RANDOM_OMAP=m | |||
671 | # CONFIG_SYNCLINK_CS is not set | 696 | # CONFIG_SYNCLINK_CS is not set |
672 | # CONFIG_CARDMAN_4000 is not set | 697 | # CONFIG_CARDMAN_4000 is not set |
673 | # CONFIG_CARDMAN_4040 is not set | 698 | # CONFIG_CARDMAN_4040 is not set |
699 | # CONFIG_IPWIRELESS is not set | ||
674 | # CONFIG_RAW_DRIVER is not set | 700 | # CONFIG_RAW_DRIVER is not set |
675 | # CONFIG_TCG_TPM is not set | 701 | # CONFIG_TCG_TPM is not set |
676 | CONFIG_I2C=y | 702 | CONFIG_I2C=y |
@@ -698,12 +724,10 @@ CONFIG_I2C_OMAP=y | |||
698 | # | 724 | # |
699 | # Miscellaneous I2C Chip support | 725 | # Miscellaneous I2C Chip support |
700 | # | 726 | # |
701 | # CONFIG_SENSORS_DS1337 is not set | ||
702 | # CONFIG_SENSORS_DS1374 is not set | ||
703 | # CONFIG_DS1682 is not set | 727 | # CONFIG_DS1682 is not set |
704 | # CONFIG_SENSORS_EEPROM is not set | 728 | # CONFIG_SENSORS_EEPROM is not set |
705 | # CONFIG_SENSORS_PCF8574 is not set | 729 | # CONFIG_SENSORS_PCF8574 is not set |
706 | # CONFIG_SENSORS_PCA9539 is not set | 730 | # CONFIG_PCF8575 is not set |
707 | # CONFIG_SENSORS_PCF8591 is not set | 731 | # CONFIG_SENSORS_PCF8591 is not set |
708 | # CONFIG_ISP1301_OMAP is not set | 732 | # CONFIG_ISP1301_OMAP is not set |
709 | CONFIG_TPS65010=y | 733 | CONFIG_TPS65010=y |
@@ -731,6 +755,7 @@ CONFIG_HWMON=y | |||
731 | # CONFIG_SENSORS_ADM1031 is not set | 755 | # CONFIG_SENSORS_ADM1031 is not set |
732 | # CONFIG_SENSORS_ADM9240 is not set | 756 | # CONFIG_SENSORS_ADM9240 is not set |
733 | # CONFIG_SENSORS_ADT7470 is not set | 757 | # CONFIG_SENSORS_ADT7470 is not set |
758 | # CONFIG_SENSORS_ADT7473 is not set | ||
734 | # CONFIG_SENSORS_ATXP1 is not set | 759 | # CONFIG_SENSORS_ATXP1 is not set |
735 | # CONFIG_SENSORS_DS1621 is not set | 760 | # CONFIG_SENSORS_DS1621 is not set |
736 | # CONFIG_SENSORS_F71805F is not set | 761 | # CONFIG_SENSORS_F71805F is not set |
@@ -758,6 +783,7 @@ CONFIG_HWMON=y | |||
758 | # CONFIG_SENSORS_SMSC47M1 is not set | 783 | # CONFIG_SENSORS_SMSC47M1 is not set |
759 | # CONFIG_SENSORS_SMSC47M192 is not set | 784 | # CONFIG_SENSORS_SMSC47M192 is not set |
760 | # CONFIG_SENSORS_SMSC47B397 is not set | 785 | # CONFIG_SENSORS_SMSC47B397 is not set |
786 | # CONFIG_SENSORS_ADS7828 is not set | ||
761 | # CONFIG_SENSORS_THMC50 is not set | 787 | # CONFIG_SENSORS_THMC50 is not set |
762 | # CONFIG_SENSORS_VT1211 is not set | 788 | # CONFIG_SENSORS_VT1211 is not set |
763 | # CONFIG_SENSORS_W83781D is not set | 789 | # CONFIG_SENSORS_W83781D is not set |
@@ -765,6 +791,7 @@ CONFIG_HWMON=y | |||
765 | # CONFIG_SENSORS_W83792D is not set | 791 | # CONFIG_SENSORS_W83792D is not set |
766 | # CONFIG_SENSORS_W83793 is not set | 792 | # CONFIG_SENSORS_W83793 is not set |
767 | # CONFIG_SENSORS_W83L785TS is not set | 793 | # CONFIG_SENSORS_W83L785TS is not set |
794 | # CONFIG_SENSORS_W83L786NG is not set | ||
768 | # CONFIG_SENSORS_W83627HF is not set | 795 | # CONFIG_SENSORS_W83627HF is not set |
769 | # CONFIG_SENSORS_W83627EHF is not set | 796 | # CONFIG_SENSORS_W83627EHF is not set |
770 | # CONFIG_HWMON_DEBUG_CHIP is not set | 797 | # CONFIG_HWMON_DEBUG_CHIP is not set |
@@ -780,6 +807,7 @@ CONFIG_SSB_POSSIBLE=y | |||
780 | # Multifunction device drivers | 807 | # Multifunction device drivers |
781 | # | 808 | # |
782 | # CONFIG_MFD_SM501 is not set | 809 | # CONFIG_MFD_SM501 is not set |
810 | # CONFIG_MFD_ASIC3 is not set | ||
783 | 811 | ||
784 | # | 812 | # |
785 | # Multimedia devices | 813 | # Multimedia devices |
@@ -865,10 +893,6 @@ CONFIG_USB_ARCH_HAS_OHCI=y | |||
865 | # | 893 | # |
866 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 894 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
867 | # | 895 | # |
868 | |||
869 | # | ||
870 | # USB Gadget Support | ||
871 | # | ||
872 | # CONFIG_USB_GADGET is not set | 896 | # CONFIG_USB_GADGET is not set |
873 | # CONFIG_MMC is not set | 897 | # CONFIG_MMC is not set |
874 | # CONFIG_NEW_LEDS is not set | 898 | # CONFIG_NEW_LEDS is not set |
@@ -889,12 +913,10 @@ CONFIG_EXT2_FS=y | |||
889 | # CONFIG_XFS_FS is not set | 913 | # CONFIG_XFS_FS is not set |
890 | # CONFIG_GFS2_FS is not set | 914 | # CONFIG_GFS2_FS is not set |
891 | # CONFIG_OCFS2_FS is not set | 915 | # CONFIG_OCFS2_FS is not set |
892 | # CONFIG_MINIX_FS is not set | 916 | CONFIG_DNOTIFY=y |
893 | # CONFIG_ROMFS_FS is not set | ||
894 | CONFIG_INOTIFY=y | 917 | CONFIG_INOTIFY=y |
895 | CONFIG_INOTIFY_USER=y | 918 | CONFIG_INOTIFY_USER=y |
896 | # CONFIG_QUOTA is not set | 919 | # CONFIG_QUOTA is not set |
897 | CONFIG_DNOTIFY=y | ||
898 | CONFIG_AUTOFS_FS=y | 920 | CONFIG_AUTOFS_FS=y |
899 | CONFIG_AUTOFS4_FS=y | 921 | CONFIG_AUTOFS4_FS=y |
900 | # CONFIG_FUSE_FS is not set | 922 | # CONFIG_FUSE_FS is not set |
@@ -948,8 +970,10 @@ CONFIG_JFFS2_RTIME=y | |||
948 | # CONFIG_JFFS2_RUBIN is not set | 970 | # CONFIG_JFFS2_RUBIN is not set |
949 | # CONFIG_CRAMFS is not set | 971 | # CONFIG_CRAMFS is not set |
950 | # CONFIG_VXFS_FS is not set | 972 | # CONFIG_VXFS_FS is not set |
973 | # CONFIG_MINIX_FS is not set | ||
951 | # CONFIG_HPFS_FS is not set | 974 | # CONFIG_HPFS_FS is not set |
952 | # CONFIG_QNX4FS_FS is not set | 975 | # CONFIG_QNX4FS_FS is not set |
976 | # CONFIG_ROMFS_FS is not set | ||
953 | # CONFIG_SYSV_FS is not set | 977 | # CONFIG_SYSV_FS is not set |
954 | # CONFIG_UFS_FS is not set | 978 | # CONFIG_UFS_FS is not set |
955 | CONFIG_NETWORK_FILESYSTEMS=y | 979 | CONFIG_NETWORK_FILESYSTEMS=y |
@@ -1019,9 +1043,6 @@ CONFIG_NLS_ISO8859_1=m | |||
1019 | # CONFIG_NLS_KOI8_U is not set | 1043 | # CONFIG_NLS_KOI8_U is not set |
1020 | # CONFIG_NLS_UTF8 is not set | 1044 | # CONFIG_NLS_UTF8 is not set |
1021 | # CONFIG_DLM is not set | 1045 | # CONFIG_DLM is not set |
1022 | CONFIG_INSTRUMENTATION=y | ||
1023 | # CONFIG_PROFILING is not set | ||
1024 | # CONFIG_MARKERS is not set | ||
1025 | 1046 | ||
1026 | # | 1047 | # |
1027 | # Kernel hacking | 1048 | # Kernel hacking |
@@ -1045,7 +1066,51 @@ CONFIG_FRAME_POINTER=y | |||
1045 | # CONFIG_KEYS is not set | 1066 | # CONFIG_KEYS is not set |
1046 | # CONFIG_SECURITY is not set | 1067 | # CONFIG_SECURITY is not set |
1047 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | 1068 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set |
1048 | # CONFIG_CRYPTO is not set | 1069 | CONFIG_CRYPTO=y |
1070 | # CONFIG_CRYPTO_SEQIV is not set | ||
1071 | # CONFIG_CRYPTO_MANAGER is not set | ||
1072 | # CONFIG_CRYPTO_HMAC is not set | ||
1073 | # CONFIG_CRYPTO_XCBC is not set | ||
1074 | # CONFIG_CRYPTO_NULL is not set | ||
1075 | # CONFIG_CRYPTO_MD4 is not set | ||
1076 | # CONFIG_CRYPTO_MD5 is not set | ||
1077 | # CONFIG_CRYPTO_SHA1 is not set | ||
1078 | # CONFIG_CRYPTO_SHA256 is not set | ||
1079 | # CONFIG_CRYPTO_SHA512 is not set | ||
1080 | # CONFIG_CRYPTO_WP512 is not set | ||
1081 | # CONFIG_CRYPTO_TGR192 is not set | ||
1082 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1083 | # CONFIG_CRYPTO_ECB is not set | ||
1084 | # CONFIG_CRYPTO_CBC is not set | ||
1085 | # CONFIG_CRYPTO_PCBC is not set | ||
1086 | # CONFIG_CRYPTO_LRW is not set | ||
1087 | # CONFIG_CRYPTO_XTS is not set | ||
1088 | # CONFIG_CRYPTO_CTR is not set | ||
1089 | # CONFIG_CRYPTO_GCM is not set | ||
1090 | # CONFIG_CRYPTO_CCM is not set | ||
1091 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1092 | # CONFIG_CRYPTO_DES is not set | ||
1093 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1094 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1095 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1096 | # CONFIG_CRYPTO_SERPENT is not set | ||
1097 | # CONFIG_CRYPTO_AES is not set | ||
1098 | # CONFIG_CRYPTO_CAST5 is not set | ||
1099 | # CONFIG_CRYPTO_CAST6 is not set | ||
1100 | # CONFIG_CRYPTO_TEA is not set | ||
1101 | # CONFIG_CRYPTO_ARC4 is not set | ||
1102 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1103 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1104 | # CONFIG_CRYPTO_SEED is not set | ||
1105 | # CONFIG_CRYPTO_SALSA20 is not set | ||
1106 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1107 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1108 | # CONFIG_CRYPTO_CRC32C is not set | ||
1109 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1110 | # CONFIG_CRYPTO_TEST is not set | ||
1111 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1112 | # CONFIG_CRYPTO_LZO is not set | ||
1113 | CONFIG_CRYPTO_HW=y | ||
1049 | 1114 | ||
1050 | # | 1115 | # |
1051 | # Library routines | 1116 | # Library routines |
diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S index 024a9cf469b4..50f667febe29 100644 --- a/arch/arm/kernel/head-common.S +++ b/arch/arm/kernel/head-common.S | |||
@@ -11,6 +11,9 @@ | |||
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #define ATAG_CORE 0x54410001 | ||
15 | #define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2) | ||
16 | |||
14 | .type __switch_data, %object | 17 | .type __switch_data, %object |
15 | __switch_data: | 18 | __switch_data: |
16 | .long __mmap_switched | 19 | .long __mmap_switched |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 7898cbc9861a..bff4c6e90dd5 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
@@ -29,9 +29,6 @@ | |||
29 | #define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET) | 29 | #define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET) |
30 | #define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET) | 30 | #define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET) |
31 | 31 | ||
32 | #define ATAG_CORE 0x54410001 | ||
33 | #define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2) | ||
34 | |||
35 | 32 | ||
36 | /* | 33 | /* |
37 | * swapper_pg_dir is the virtual address of the initial page table. | 34 | * swapper_pg_dir is the virtual address of the initial page table. |
diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c index a22a98c43ca5..13e371aad879 100644 --- a/arch/arm/kernel/kprobes.c +++ b/arch/arm/kernel/kprobes.c | |||
@@ -431,6 +431,11 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | |||
431 | return 0; | 431 | return 0; |
432 | } | 432 | } |
433 | 433 | ||
434 | int __kprobes arch_trampoline_kprobe(struct kprobe *p) | ||
435 | { | ||
436 | return 0; | ||
437 | } | ||
438 | |||
434 | static struct undef_hook kprobes_break_hook = { | 439 | static struct undef_hook kprobes_break_hook = { |
435 | .instr_mask = 0xffffffff, | 440 | .instr_mask = 0xffffffff, |
436 | .instr_val = KPROBE_BREAKPOINT_INSTRUCTION, | 441 | .instr_val = KPROBE_BREAKPOINT_INSTRUCTION, |
diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index 38313abef657..bf103b24c937 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c | |||
@@ -245,10 +245,7 @@ static struct fb_monspecs at91fb_default_monspecs = { | |||
245 | 245 | ||
246 | static void at91_lcdc_power_control(int on) | 246 | static void at91_lcdc_power_control(int on) |
247 | { | 247 | { |
248 | if (on) | 248 | at91_set_gpio_value(AT91_PIN_PA30, on); |
249 | at91_set_gpio_value(AT91_PIN_PD12, 0); /* power up */ | ||
250 | else | ||
251 | at91_set_gpio_value(AT91_PIN_PD12, 1); /* power down */ | ||
252 | } | 249 | } |
253 | 250 | ||
254 | /* Driver datas */ | 251 | /* Driver datas */ |
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index f629c2b5f0c5..ee4964abcaf5 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c | |||
@@ -490,6 +490,11 @@ postcore_initcall(at91_gpio_debugfs_init); | |||
490 | 490 | ||
491 | /*--------------------------------------------------------------------------*/ | 491 | /*--------------------------------------------------------------------------*/ |
492 | 492 | ||
493 | /* This lock class tells lockdep that GPIO irqs are in a different | ||
494 | * category than their parents, so it won't report false recursion. | ||
495 | */ | ||
496 | static struct lock_class_key gpio_lock_class; | ||
497 | |||
493 | /* | 498 | /* |
494 | * Called from the processor-specific init to enable GPIO interrupt support. | 499 | * Called from the processor-specific init to enable GPIO interrupt support. |
495 | */ | 500 | */ |
@@ -510,6 +515,8 @@ void __init at91_gpio_irq_setup(void) | |||
510 | __raw_writel(~0, this->regbase + PIO_IDR); | 515 | __raw_writel(~0, this->regbase + PIO_IDR); |
511 | 516 | ||
512 | for (i = 0, pin = this->chipbase; i < 32; i++, pin++) { | 517 | for (i = 0, pin = this->chipbase; i < 32; i++, pin++) { |
518 | lockdep_set_class(&irq_desc[pin].lock, &gpio_lock_class); | ||
519 | |||
513 | /* | 520 | /* |
514 | * Can use the "simple" and not "edge" handler since it's | 521 | * Can use the "simple" and not "edge" handler since it's |
515 | * shorter, and the AIC handles interrupts sanely. | 522 | * shorter, and the AIC handles interrupts sanely. |
diff --git a/arch/arm/mach-h720x/common.c b/arch/arm/mach-h720x/common.c index 7f31816896ad..45144ad2bed9 100644 --- a/arch/arm/mach-h720x/common.c +++ b/arch/arm/mach-h720x/common.c | |||
@@ -103,7 +103,7 @@ static void | |||
103 | h720x_gpio_handler(unsigned int mask, unsigned int irq, | 103 | h720x_gpio_handler(unsigned int mask, unsigned int irq, |
104 | struct irq_desc *desc) | 104 | struct irq_desc *desc) |
105 | { | 105 | { |
106 | IRQDBG("%s irq: %d\n",__FUNCTION__,irq); | 106 | IRQDBG("%s irq: %d\n", __func__, irq); |
107 | desc = irq_desc + irq; | 107 | desc = irq_desc + irq; |
108 | while (mask) { | 108 | while (mask) { |
109 | if (mask & 1) { | 109 | if (mask & 1) { |
@@ -123,7 +123,7 @@ h720x_gpioa_demux_handler(unsigned int irq_unused, struct irq_desc *desc) | |||
123 | 123 | ||
124 | mask = CPU_REG(GPIO_A_VIRT,GPIO_STAT); | 124 | mask = CPU_REG(GPIO_A_VIRT,GPIO_STAT); |
125 | irq = IRQ_CHAINED_GPIOA(0); | 125 | irq = IRQ_CHAINED_GPIOA(0); |
126 | IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq); | 126 | IRQDBG("%s mask: 0x%08x irq: %d\n", __func__, mask,irq); |
127 | h720x_gpio_handler(mask, irq, desc); | 127 | h720x_gpio_handler(mask, irq, desc); |
128 | } | 128 | } |
129 | 129 | ||
@@ -133,7 +133,7 @@ h720x_gpiob_demux_handler(unsigned int irq_unused, struct irq_desc *desc) | |||
133 | unsigned int mask, irq; | 133 | unsigned int mask, irq; |
134 | mask = CPU_REG(GPIO_B_VIRT,GPIO_STAT); | 134 | mask = CPU_REG(GPIO_B_VIRT,GPIO_STAT); |
135 | irq = IRQ_CHAINED_GPIOB(0); | 135 | irq = IRQ_CHAINED_GPIOB(0); |
136 | IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq); | 136 | IRQDBG("%s mask: 0x%08x irq: %d\n", __func__, mask,irq); |
137 | h720x_gpio_handler(mask, irq, desc); | 137 | h720x_gpio_handler(mask, irq, desc); |
138 | } | 138 | } |
139 | 139 | ||
@@ -144,7 +144,7 @@ h720x_gpioc_demux_handler(unsigned int irq_unused, struct irq_desc *desc) | |||
144 | 144 | ||
145 | mask = CPU_REG(GPIO_C_VIRT,GPIO_STAT); | 145 | mask = CPU_REG(GPIO_C_VIRT,GPIO_STAT); |
146 | irq = IRQ_CHAINED_GPIOC(0); | 146 | irq = IRQ_CHAINED_GPIOC(0); |
147 | IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq); | 147 | IRQDBG("%s mask: 0x%08x irq: %d\n", __func__, mask,irq); |
148 | h720x_gpio_handler(mask, irq, desc); | 148 | h720x_gpio_handler(mask, irq, desc); |
149 | } | 149 | } |
150 | 150 | ||
@@ -155,7 +155,7 @@ h720x_gpiod_demux_handler(unsigned int irq_unused, struct irq_desc *desc) | |||
155 | 155 | ||
156 | mask = CPU_REG(GPIO_D_VIRT,GPIO_STAT); | 156 | mask = CPU_REG(GPIO_D_VIRT,GPIO_STAT); |
157 | irq = IRQ_CHAINED_GPIOD(0); | 157 | irq = IRQ_CHAINED_GPIOD(0); |
158 | IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq); | 158 | IRQDBG("%s mask: 0x%08x irq: %d\n", __func__, mask,irq); |
159 | h720x_gpio_handler(mask, irq, desc); | 159 | h720x_gpio_handler(mask, irq, desc); |
160 | } | 160 | } |
161 | 161 | ||
@@ -167,7 +167,7 @@ h720x_gpioe_demux_handler(unsigned int irq_unused, struct irq_desc *desc) | |||
167 | 167 | ||
168 | mask = CPU_REG(GPIO_E_VIRT,GPIO_STAT); | 168 | mask = CPU_REG(GPIO_E_VIRT,GPIO_STAT); |
169 | irq = IRQ_CHAINED_GPIOE(0); | 169 | irq = IRQ_CHAINED_GPIOE(0); |
170 | IRQDBG("%s mask: 0x%08x irq: %d\n",__FUNCTION__,mask,irq); | 170 | IRQDBG("%s mask: 0x%08x irq: %d\n", __func__, mask,irq); |
171 | h720x_gpio_handler(mask, irq, desc); | 171 | h720x_gpio_handler(mask, irq, desc); |
172 | } | 172 | } |
173 | #endif | 173 | #endif |
diff --git a/arch/arm/mach-imx/dma.c b/arch/arm/mach-imx/dma.c index bc6fb02d213b..a59ff2987cb7 100644 --- a/arch/arm/mach-imx/dma.c +++ b/arch/arm/mach-imx/dma.c | |||
@@ -54,7 +54,7 @@ static inline int imx_dma_sg_next(imx_dmach_t dma_ch, unsigned int lastcount) | |||
54 | 54 | ||
55 | if (!imxdma->name) { | 55 | if (!imxdma->name) { |
56 | printk(KERN_CRIT "%s: called for not allocated channel %d\n", | 56 | printk(KERN_CRIT "%s: called for not allocated channel %d\n", |
57 | __FUNCTION__, dma_ch); | 57 | __func__, dma_ch); |
58 | return 0; | 58 | return 0; |
59 | } | 59 | } |
60 | 60 | ||
@@ -288,7 +288,7 @@ imx_dma_setup_handlers(imx_dmach_t dma_ch, | |||
288 | 288 | ||
289 | if (!imxdma->name) { | 289 | if (!imxdma->name) { |
290 | printk(KERN_CRIT "%s: called for not allocated channel %d\n", | 290 | printk(KERN_CRIT "%s: called for not allocated channel %d\n", |
291 | __FUNCTION__, dma_ch); | 291 | __func__, dma_ch); |
292 | return -ENODEV; | 292 | return -ENODEV; |
293 | } | 293 | } |
294 | 294 | ||
@@ -321,7 +321,7 @@ void imx_dma_enable(imx_dmach_t dma_ch) | |||
321 | 321 | ||
322 | if (!imxdma->name) { | 322 | if (!imxdma->name) { |
323 | printk(KERN_CRIT "%s: called for not allocated channel %d\n", | 323 | printk(KERN_CRIT "%s: called for not allocated channel %d\n", |
324 | __FUNCTION__, dma_ch); | 324 | __func__, dma_ch); |
325 | return; | 325 | return; |
326 | } | 326 | } |
327 | 327 | ||
@@ -365,7 +365,7 @@ int imx_dma_request(imx_dmach_t dma_ch, const char *name) | |||
365 | 365 | ||
366 | if (dma_ch >= IMX_DMA_CHANNELS) { | 366 | if (dma_ch >= IMX_DMA_CHANNELS) { |
367 | printk(KERN_CRIT "%s: called for non-existed channel %d\n", | 367 | printk(KERN_CRIT "%s: called for non-existed channel %d\n", |
368 | __FUNCTION__, dma_ch); | 368 | __func__, dma_ch); |
369 | return -EINVAL; | 369 | return -EINVAL; |
370 | } | 370 | } |
371 | 371 | ||
@@ -396,7 +396,7 @@ void imx_dma_free(imx_dmach_t dma_ch) | |||
396 | if (!imxdma->name) { | 396 | if (!imxdma->name) { |
397 | printk(KERN_CRIT | 397 | printk(KERN_CRIT |
398 | "%s: trying to free channel %d which is already freed\n", | 398 | "%s: trying to free channel %d which is already freed\n", |
399 | __FUNCTION__, dma_ch); | 399 | __func__, dma_ch); |
400 | return; | 400 | return; |
401 | } | 401 | } |
402 | 402 | ||
@@ -456,7 +456,7 @@ imx_dma_request_by_prio(imx_dmach_t * pdma_ch, const char *name, | |||
456 | } | 456 | } |
457 | } | 457 | } |
458 | 458 | ||
459 | printk(KERN_ERR "%s: no free DMA channel found\n", __FUNCTION__); | 459 | printk(KERN_ERR "%s: no free DMA channel found\n", __func__); |
460 | 460 | ||
461 | return -ENODEV; | 461 | return -ENODEV; |
462 | } | 462 | } |
diff --git a/arch/arm/mach-imx/irq.c b/arch/arm/mach-imx/irq.c index a7465db84893..e6695c4e623b 100644 --- a/arch/arm/mach-imx/irq.c +++ b/arch/arm/mach-imx/irq.c | |||
@@ -160,21 +160,21 @@ imx_gpio_irq_type(unsigned int _irq, unsigned int type) | |||
160 | static void | 160 | static void |
161 | imx_gpio_ack_irq(unsigned int irq) | 161 | imx_gpio_ack_irq(unsigned int irq) |
162 | { | 162 | { |
163 | DEBUG_IRQ("%s: irq %d\n", __FUNCTION__, irq); | 163 | DEBUG_IRQ("%s: irq %d\n", __func__, irq); |
164 | ISR(IRQ_TO_REG(irq)) = 1 << ((irq - IRQ_GPIOA(0)) % 32); | 164 | ISR(IRQ_TO_REG(irq)) = 1 << ((irq - IRQ_GPIOA(0)) % 32); |
165 | } | 165 | } |
166 | 166 | ||
167 | static void | 167 | static void |
168 | imx_gpio_mask_irq(unsigned int irq) | 168 | imx_gpio_mask_irq(unsigned int irq) |
169 | { | 169 | { |
170 | DEBUG_IRQ("%s: irq %d\n", __FUNCTION__, irq); | 170 | DEBUG_IRQ("%s: irq %d\n", __func__, irq); |
171 | IMR(IRQ_TO_REG(irq)) &= ~( 1 << ((irq - IRQ_GPIOA(0)) % 32)); | 171 | IMR(IRQ_TO_REG(irq)) &= ~( 1 << ((irq - IRQ_GPIOA(0)) % 32)); |
172 | } | 172 | } |
173 | 173 | ||
174 | static void | 174 | static void |
175 | imx_gpio_unmask_irq(unsigned int irq) | 175 | imx_gpio_unmask_irq(unsigned int irq) |
176 | { | 176 | { |
177 | DEBUG_IRQ("%s: irq %d\n", __FUNCTION__, irq); | 177 | DEBUG_IRQ("%s: irq %d\n", __func__, irq); |
178 | IMR(IRQ_TO_REG(irq)) |= 1 << ((irq - IRQ_GPIOA(0)) % 32); | 178 | IMR(IRQ_TO_REG(irq)) |= 1 << ((irq - IRQ_GPIOA(0)) % 32); |
179 | } | 179 | } |
180 | 180 | ||
diff --git a/arch/arm/mach-iop13xx/iq81340mc.c b/arch/arm/mach-iop13xx/iq81340mc.c index 268a8d84999c..77b24cd1d88d 100644 --- a/arch/arm/mach-iop13xx/iq81340mc.c +++ b/arch/arm/mach-iop13xx/iq81340mc.c | |||
@@ -81,7 +81,7 @@ static void __init iq81340mc_init(void) | |||
81 | static void __init iq81340mc_timer_init(void) | 81 | static void __init iq81340mc_timer_init(void) |
82 | { | 82 | { |
83 | unsigned long bus_freq = iop13xx_core_freq() / iop13xx_xsi_bus_ratio(); | 83 | unsigned long bus_freq = iop13xx_core_freq() / iop13xx_xsi_bus_ratio(); |
84 | printk(KERN_DEBUG "%s: bus frequency: %lu\n", __FUNCTION__, bus_freq); | 84 | printk(KERN_DEBUG "%s: bus frequency: %lu\n", __func__, bus_freq); |
85 | iop_init_time(bus_freq); | 85 | iop_init_time(bus_freq); |
86 | } | 86 | } |
87 | 87 | ||
diff --git a/arch/arm/mach-iop13xx/iq81340sc.c b/arch/arm/mach-iop13xx/iq81340sc.c index a51ffd2683e5..e8522b3b8163 100644 --- a/arch/arm/mach-iop13xx/iq81340sc.c +++ b/arch/arm/mach-iop13xx/iq81340sc.c | |||
@@ -83,7 +83,7 @@ static void __init iq81340sc_init(void) | |||
83 | static void __init iq81340sc_timer_init(void) | 83 | static void __init iq81340sc_timer_init(void) |
84 | { | 84 | { |
85 | unsigned long bus_freq = iop13xx_core_freq() / iop13xx_xsi_bus_ratio(); | 85 | unsigned long bus_freq = iop13xx_core_freq() / iop13xx_xsi_bus_ratio(); |
86 | printk(KERN_DEBUG "%s: bus frequency: %lu\n", __FUNCTION__, bus_freq); | 86 | printk(KERN_DEBUG "%s: bus frequency: %lu\n", __func__, bus_freq); |
87 | iop_init_time(bus_freq); | 87 | iop_init_time(bus_freq); |
88 | } | 88 | } |
89 | 89 | ||
diff --git a/arch/arm/mach-iop13xx/pci.c b/arch/arm/mach-iop13xx/pci.c index 99d94cb1bafd..7825c1aaa27b 100644 --- a/arch/arm/mach-iop13xx/pci.c +++ b/arch/arm/mach-iop13xx/pci.c | |||
@@ -94,13 +94,13 @@ void iop13xx_map_pci_memory(void) | |||
94 | , 0, iop13xx_atux_mem_size, MT_DEVICE); | 94 | , 0, iop13xx_atux_mem_size, MT_DEVICE); |
95 | if (!iop13xx_atux_mem_base) { | 95 | if (!iop13xx_atux_mem_base) { |
96 | printk("%s: atux allocation " | 96 | printk("%s: atux allocation " |
97 | "failed\n", __FUNCTION__); | 97 | "failed\n", __func__); |
98 | BUG(); | 98 | BUG(); |
99 | } | 99 | } |
100 | } else | 100 | } else |
101 | iop13xx_atux_mem_size = 0; | 101 | iop13xx_atux_mem_size = 0; |
102 | PRINTK("%s: atu: %d bus_size: %d mem_base: %x\n", | 102 | PRINTK("%s: atu: %d bus_size: %d mem_base: %x\n", |
103 | __FUNCTION__, atu, iop13xx_atux_mem_size, | 103 | __func__, atu, iop13xx_atux_mem_size, |
104 | iop13xx_atux_mem_base); | 104 | iop13xx_atux_mem_base); |
105 | break; | 105 | break; |
106 | case 1: | 106 | case 1: |
@@ -120,13 +120,13 @@ void iop13xx_map_pci_memory(void) | |||
120 | , 0, iop13xx_atue_mem_size, MT_DEVICE); | 120 | , 0, iop13xx_atue_mem_size, MT_DEVICE); |
121 | if (!iop13xx_atue_mem_base) { | 121 | if (!iop13xx_atue_mem_base) { |
122 | printk("%s: atue allocation " | 122 | printk("%s: atue allocation " |
123 | "failed\n", __FUNCTION__); | 123 | "failed\n", __func__); |
124 | BUG(); | 124 | BUG(); |
125 | } | 125 | } |
126 | } else | 126 | } else |
127 | iop13xx_atue_mem_size = 0; | 127 | iop13xx_atue_mem_size = 0; |
128 | PRINTK("%s: atu: %d bus_size: %d mem_base: %x\n", | 128 | PRINTK("%s: atu: %d bus_size: %d mem_base: %x\n", |
129 | __FUNCTION__, atu, iop13xx_atue_mem_size, | 129 | __func__, atu, iop13xx_atue_mem_size, |
130 | iop13xx_atue_mem_base); | 130 | iop13xx_atue_mem_base); |
131 | break; | 131 | break; |
132 | } | 132 | } |
diff --git a/arch/arm/mach-iop13xx/setup.c b/arch/arm/mach-iop13xx/setup.c index bfe0c87e3397..246f6d478720 100644 --- a/arch/arm/mach-iop13xx/setup.c +++ b/arch/arm/mach-iop13xx/setup.c | |||
@@ -519,7 +519,7 @@ void __init iop13xx_platform_init(void) | |||
519 | if (iq8134x_flash_resource.end > iq8134x_flash_resource.start) | 519 | if (iq8134x_flash_resource.end > iq8134x_flash_resource.start) |
520 | iop13xx_devices[plat_idx++] = &iq8134x_flash; | 520 | iop13xx_devices[plat_idx++] = &iq8134x_flash; |
521 | else | 521 | else |
522 | printk(KERN_ERR "%s: Failed to probe flash size\n", __FUNCTION__); | 522 | printk(KERN_ERR "%s: Failed to probe flash size\n", __func__); |
523 | #endif | 523 | #endif |
524 | 524 | ||
525 | platform_add_devices(iop13xx_devices, plat_idx); | 525 | platform_add_devices(iop13xx_devices, plat_idx); |
diff --git a/arch/arm/mach-ixp4xx/common-pci.c b/arch/arm/mach-ixp4xx/common-pci.c index bf04121d1a31..64be341109b3 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c | |||
@@ -87,7 +87,7 @@ static inline int check_master_abort(void) | |||
87 | if (isr & PCI_ISR_PFE) { | 87 | if (isr & PCI_ISR_PFE) { |
88 | /* make sure the Master Abort bit is reset */ | 88 | /* make sure the Master Abort bit is reset */ |
89 | *PCI_ISR = PCI_ISR_PFE; | 89 | *PCI_ISR = PCI_ISR_PFE; |
90 | pr_debug("%s failed\n", __FUNCTION__); | 90 | pr_debug("%s failed\n", __func__); |
91 | return 1; | 91 | return 1; |
92 | } | 92 | } |
93 | 93 | ||
diff --git a/arch/arm/mach-ixp4xx/gtwx5715-pci.c b/arch/arm/mach-ixp4xx/gtwx5715-pci.c index 0d5a42455820..49dec7868807 100644 --- a/arch/arm/mach-ixp4xx/gtwx5715-pci.c +++ b/arch/arm/mach-ixp4xx/gtwx5715-pci.c | |||
@@ -65,7 +65,7 @@ static int __init gtwx5715_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | |||
65 | else | 65 | else |
66 | rc = gtwx5715_irqmap[slot][pin-1]; | 66 | rc = gtwx5715_irqmap[slot][pin-1]; |
67 | 67 | ||
68 | printk("%s: Mapped slot %d pin %d to IRQ %d\n", __FUNCTION__,slot, pin, rc); | 68 | printk("%s: Mapped slot %d pin %d to IRQ %d\n", __func__, slot, pin, rc); |
69 | return(rc); | 69 | return(rc); |
70 | } | 70 | } |
71 | 71 | ||
diff --git a/arch/arm/mach-netx/generic.c b/arch/arm/mach-netx/generic.c index b9ca8f98265d..fd7537f7d11e 100644 --- a/arch/arm/mach-netx/generic.c +++ b/arch/arm/mach-netx/generic.c | |||
@@ -133,7 +133,7 @@ netx_hif_ack_irq(unsigned int _irq) | |||
133 | val &= ~((1 << 24) << irq); | 133 | val &= ~((1 << 24) << irq); |
134 | writel(val, NETX_DPMAS_INT_EN); | 134 | writel(val, NETX_DPMAS_INT_EN); |
135 | 135 | ||
136 | DEBUG_IRQ("%s: irq %d\n", __FUNCTION__, _irq); | 136 | DEBUG_IRQ("%s: irq %d\n", __func__, _irq); |
137 | } | 137 | } |
138 | 138 | ||
139 | static void | 139 | static void |
@@ -145,7 +145,7 @@ netx_hif_mask_irq(unsigned int _irq) | |||
145 | val = readl(NETX_DPMAS_INT_EN); | 145 | val = readl(NETX_DPMAS_INT_EN); |
146 | val &= ~((1 << 24) << irq); | 146 | val &= ~((1 << 24) << irq); |
147 | writel(val, NETX_DPMAS_INT_EN); | 147 | writel(val, NETX_DPMAS_INT_EN); |
148 | DEBUG_IRQ("%s: irq %d\n", __FUNCTION__, _irq); | 148 | DEBUG_IRQ("%s: irq %d\n", __func__, _irq); |
149 | } | 149 | } |
150 | 150 | ||
151 | static void | 151 | static void |
@@ -157,7 +157,7 @@ netx_hif_unmask_irq(unsigned int _irq) | |||
157 | val = readl(NETX_DPMAS_INT_EN); | 157 | val = readl(NETX_DPMAS_INT_EN); |
158 | val |= (1 << 24) << irq; | 158 | val |= (1 << 24) << irq; |
159 | writel(val, NETX_DPMAS_INT_EN); | 159 | writel(val, NETX_DPMAS_INT_EN); |
160 | DEBUG_IRQ("%s: irq %d\n", __FUNCTION__, _irq); | 160 | DEBUG_IRQ("%s: irq %d\n", __func__, _irq); |
161 | } | 161 | } |
162 | 162 | ||
163 | static struct irq_chip netx_hif_chip = { | 163 | static struct irq_chip netx_hif_chip = { |
diff --git a/arch/arm/mach-ns9xxx/gpio.c b/arch/arm/mach-ns9xxx/gpio.c index b2230213b983..5286e9fc1d30 100644 --- a/arch/arm/mach-ns9xxx/gpio.c +++ b/arch/arm/mach-ns9xxx/gpio.c | |||
@@ -31,7 +31,7 @@ | |||
31 | static spinlock_t gpio_lock = __SPIN_LOCK_UNLOCKED(gpio_lock); | 31 | static spinlock_t gpio_lock = __SPIN_LOCK_UNLOCKED(gpio_lock); |
32 | 32 | ||
33 | /* only access gpiores with atomic ops */ | 33 | /* only access gpiores with atomic ops */ |
34 | static DECLARE_BITMAP(gpiores, GPIO_MAX); | 34 | static DECLARE_BITMAP(gpiores, GPIO_MAX + 1); |
35 | 35 | ||
36 | static inline int ns9xxx_valid_gpio(unsigned gpio) | 36 | static inline int ns9xxx_valid_gpio(unsigned gpio) |
37 | { | 37 | { |
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 070345ee39a5..507987720015 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
@@ -350,6 +350,10 @@ static void __init h2_init_smc91x(void) | |||
350 | 350 | ||
351 | static struct i2c_board_info __initdata h2_i2c_board_info[] = { | 351 | static struct i2c_board_info __initdata h2_i2c_board_info[] = { |
352 | { | 352 | { |
353 | I2C_BOARD_INFO("tps65010", 0x48), | ||
354 | .type = "tps65010", | ||
355 | .irq = OMAP_GPIO_IRQ(58), | ||
356 | }, { | ||
353 | I2C_BOARD_INFO("isp1301_omap", 0x2d), | 357 | I2C_BOARD_INFO("isp1301_omap", 0x2d), |
354 | .type = "isp1301_omap", | 358 | .type = "isp1301_omap", |
355 | .irq = OMAP_GPIO_IRQ(2), | 359 | .irq = OMAP_GPIO_IRQ(2), |
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 6fc516855a8c..c3ef1ee5f77b 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/mtd/nand.h> | 26 | #include <linux/mtd/nand.h> |
27 | #include <linux/mtd/partitions.h> | 27 | #include <linux/mtd/partitions.h> |
28 | #include <linux/input.h> | 28 | #include <linux/input.h> |
29 | #include <linux/spi/spi.h> | ||
29 | #include <linux/i2c/tps65010.h> | 30 | #include <linux/i2c/tps65010.h> |
30 | 31 | ||
31 | #include <asm/setup.h> | 32 | #include <asm/setup.h> |
@@ -51,6 +52,8 @@ | |||
51 | #include <asm/arch/mcbsp.h> | 52 | #include <asm/arch/mcbsp.h> |
52 | #include <asm/arch/omap-alsa.h> | 53 | #include <asm/arch/omap-alsa.h> |
53 | 54 | ||
55 | #define H3_TS_GPIO 48 | ||
56 | |||
54 | static int h3_keymap[] = { | 57 | static int h3_keymap[] = { |
55 | KEY(0, 0, KEY_LEFT), | 58 | KEY(0, 0, KEY_LEFT), |
56 | KEY(0, 1, KEY_RIGHT), | 59 | KEY(0, 1, KEY_RIGHT), |
@@ -373,6 +376,17 @@ static struct platform_device h3_lcd_device = { | |||
373 | .id = -1, | 376 | .id = -1, |
374 | }; | 377 | }; |
375 | 378 | ||
379 | static struct spi_board_info h3_spi_board_info[] __initdata = { | ||
380 | [0] = { | ||
381 | .modalias = "tsc2101", | ||
382 | .bus_num = 2, | ||
383 | .chip_select = 0, | ||
384 | .irq = OMAP_GPIO_IRQ(H3_TS_GPIO), | ||
385 | .max_speed_hz = 16000000, | ||
386 | /* .platform_data = &tsc_platform_data, */ | ||
387 | }, | ||
388 | }; | ||
389 | |||
376 | static struct omap_mcbsp_reg_cfg mcbsp_regs = { | 390 | static struct omap_mcbsp_reg_cfg mcbsp_regs = { |
377 | .spcr2 = FREE | FRST | GRST | XRST | XINTM(3), | 391 | .spcr2 = FREE | FRST | GRST | XRST | XINTM(3), |
378 | .spcr1 = RINTM(3) | RRST, | 392 | .spcr1 = RINTM(3) | RRST, |
@@ -457,6 +471,14 @@ static struct omap_board_config_kernel h3_config[] __initdata = { | |||
457 | { OMAP_TAG_LCD, &h3_lcd_config }, | 471 | { OMAP_TAG_LCD, &h3_lcd_config }, |
458 | }; | 472 | }; |
459 | 473 | ||
474 | static struct i2c_board_info __initdata h3_i2c_board_info[] = { | ||
475 | { | ||
476 | I2C_BOARD_INFO("tps65010", 0x48), | ||
477 | .type = "tps65013", | ||
478 | /* .irq = OMAP_GPIO_IRQ(??), */ | ||
479 | }, | ||
480 | }; | ||
481 | |||
460 | static struct omap_gpio_switch h3_gpio_switches[] __initdata = { | 482 | static struct omap_gpio_switch h3_gpio_switches[] __initdata = { |
461 | { | 483 | { |
462 | .name = "mmc_slot", | 484 | .name = "mmc_slot", |
diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c index 8eb5dcdaead2..e6c64e10b7ec 100644 --- a/arch/arm/mach-omap1/pm.c +++ b/arch/arm/mach-omap1/pm.c | |||
@@ -717,7 +717,7 @@ static int __init omap_pm_init(void) | |||
717 | #endif | 717 | #endif |
718 | 718 | ||
719 | #ifdef CONFIG_OMAP_32K_TIMER | 719 | #ifdef CONFIG_OMAP_32K_TIMER |
720 | error = sysfs_create_file(power_kobj, &sleep_while_idle_attr); | 720 | error = sysfs_create_file(power_kobj, &sleep_while_idle_attr.attr); |
721 | if (error) | 721 | if (error) |
722 | printk(KERN_ERR "sysfs_create_file failed: %d\n", error); | 722 | printk(KERN_ERR "sysfs_create_file failed: %d\n", error); |
723 | #endif | 723 | #endif |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 5a4091f582ed..69c8174f3aac 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -42,6 +42,12 @@ static struct map_desc omap2_io_desc[] __initdata = { | |||
42 | .length = L3_24XX_SIZE, | 42 | .length = L3_24XX_SIZE, |
43 | .type = MT_DEVICE | 43 | .type = MT_DEVICE |
44 | }, | 44 | }, |
45 | { | ||
46 | .virtual = L4_24XX_VIRT, | ||
47 | .pfn = __phys_to_pfn(L4_24XX_PHYS), | ||
48 | .length = L4_24XX_SIZE, | ||
49 | .type = MT_DEVICE | ||
50 | }, | ||
45 | #ifdef CONFIG_ARCH_OMAP2430 | 51 | #ifdef CONFIG_ARCH_OMAP2430 |
46 | { | 52 | { |
47 | .virtual = L4_WK_243X_VIRT, | 53 | .virtual = L4_WK_243X_VIRT, |
diff --git a/arch/arm/mach-orion/addr-map.c b/arch/arm/mach-orion/addr-map.c index 2e2fd63643c3..58cc3c0333b6 100644 --- a/arch/arm/mach-orion/addr-map.c +++ b/arch/arm/mach-orion/addr-map.c | |||
@@ -97,14 +97,20 @@ | |||
97 | #define PCIE_BAR_CTRL(n) ORION_PCIE_REG(0x1804 + ((n - 1) * 4)) | 97 | #define PCIE_BAR_CTRL(n) ORION_PCIE_REG(0x1804 + ((n - 1) * 4)) |
98 | #define PCIE_BAR_LO(n) ORION_PCIE_REG(0x0010 + ((n) * 8)) | 98 | #define PCIE_BAR_LO(n) ORION_PCIE_REG(0x0010 + ((n) * 8)) |
99 | #define PCIE_BAR_HI(n) ORION_PCIE_REG(0x0014 + ((n) * 8)) | 99 | #define PCIE_BAR_HI(n) ORION_PCIE_REG(0x0014 + ((n) * 8)) |
100 | #define PCIE_WIN_CTRL(n) ORION_PCIE_REG(0x1820 + ((n) << 4)) | 100 | #define PCIE_WIN_CTRL(n) (((n) < 5) ? \ |
101 | #define PCIE_WIN_BASE(n) ORION_PCIE_REG(0x1824 + ((n) << 4)) | 101 | ORION_PCIE_REG(0x1820 + ((n) << 4)) : \ |
102 | #define PCIE_WIN_REMAP(n) ORION_PCIE_REG(0x182c + ((n) << 4)) | 102 | ORION_PCIE_REG(0x1880)) |
103 | #define PCIE_WIN_BASE(n) (((n) < 5) ? \ | ||
104 | ORION_PCIE_REG(0x1824 + ((n) << 4)) : \ | ||
105 | ORION_PCIE_REG(0x1884)) | ||
106 | #define PCIE_WIN_REMAP(n) (((n) < 5) ? \ | ||
107 | ORION_PCIE_REG(0x182c + ((n) << 4)) : \ | ||
108 | ORION_PCIE_REG(0x188c)) | ||
103 | #define PCIE_DEFWIN_CTRL ORION_PCIE_REG(0x18b0) | 109 | #define PCIE_DEFWIN_CTRL ORION_PCIE_REG(0x18b0) |
104 | #define PCIE_EXPROM_WIN_CTRL ORION_PCIE_REG(0x18c0) | 110 | #define PCIE_EXPROM_WIN_CTRL ORION_PCIE_REG(0x18c0) |
105 | #define PCIE_EXPROM_WIN_REMP ORION_PCIE_REG(0x18c4) | 111 | #define PCIE_EXPROM_WIN_REMP ORION_PCIE_REG(0x18c4) |
106 | #define PCIE_MAX_BARS 3 | 112 | #define PCIE_MAX_BARS 3 |
107 | #define PCIE_MAX_WINS 5 | 113 | #define PCIE_MAX_WINS 6 |
108 | 114 | ||
109 | /* | 115 | /* |
110 | * Use PCIE BAR '1' for all DDR banks | 116 | * Use PCIE BAR '1' for all DDR banks |
diff --git a/arch/arm/mach-orion/common.c b/arch/arm/mach-orion/common.c index 5f0ee4b8a9b7..bbc2b4ec932c 100644 --- a/arch/arm/mach-orion/common.c +++ b/arch/arm/mach-orion/common.c | |||
@@ -17,7 +17,9 @@ | |||
17 | #include <linux/mv643xx_eth.h> | 17 | #include <linux/mv643xx_eth.h> |
18 | #include <linux/mv643xx_i2c.h> | 18 | #include <linux/mv643xx_i2c.h> |
19 | #include <asm/page.h> | 19 | #include <asm/page.h> |
20 | #include <asm/setup.h> | ||
20 | #include <asm/timex.h> | 21 | #include <asm/timex.h> |
22 | #include <asm/mach/arch.h> | ||
21 | #include <asm/mach/map.h> | 23 | #include <asm/mach/map.h> |
22 | #include <asm/arch/hardware.h> | 24 | #include <asm/arch/hardware.h> |
23 | #include "common.h" | 25 | #include "common.h" |
@@ -177,8 +179,8 @@ static struct platform_device orion_ehci1 = { | |||
177 | 179 | ||
178 | static struct resource orion_eth_shared_resources[] = { | 180 | static struct resource orion_eth_shared_resources[] = { |
179 | { | 181 | { |
180 | .start = ORION_ETH_PHYS_BASE, | 182 | .start = ORION_ETH_PHYS_BASE + 0x2000, |
181 | .end = ORION_ETH_PHYS_BASE + 0xffff, | 183 | .end = ORION_ETH_PHYS_BASE + 0x3fff, |
182 | .flags = IORESOURCE_MEM, | 184 | .flags = IORESOURCE_MEM, |
183 | }, | 185 | }, |
184 | }; | 186 | }; |
@@ -347,3 +349,21 @@ void __init orion_init(void) | |||
347 | platform_device_register(&orion_ehci1); | 349 | platform_device_register(&orion_ehci1); |
348 | platform_device_register(&orion_i2c); | 350 | platform_device_register(&orion_i2c); |
349 | } | 351 | } |
352 | |||
353 | /* | ||
354 | * Many orion-based systems have buggy bootloader implementations. | ||
355 | * This is a common fixup for bogus memory tags. | ||
356 | */ | ||
357 | void __init tag_fixup_mem32(struct machine_desc *mdesc, struct tag *t, | ||
358 | char **from, struct meminfo *meminfo) | ||
359 | { | ||
360 | for (; t->hdr.size; t = tag_next(t)) | ||
361 | if (t->hdr.tag == ATAG_MEM && | ||
362 | (!t->u.mem.size || t->u.mem.size & ~PAGE_MASK || | ||
363 | t->u.mem.start & ~PAGE_MASK)) { | ||
364 | printk(KERN_WARNING | ||
365 | "Clearing invalid memory bank %dKB@0x%08x\n", | ||
366 | t->u.mem.size / 1024, t->u.mem.start); | ||
367 | t->hdr.tag = 0; | ||
368 | } | ||
369 | } | ||
diff --git a/arch/arm/mach-orion/common.h b/arch/arm/mach-orion/common.h index 10154ec885df..501497cc2c4d 100644 --- a/arch/arm/mach-orion/common.h +++ b/arch/arm/mach-orion/common.h | |||
@@ -83,4 +83,10 @@ struct mv_sata_platform_data; | |||
83 | 83 | ||
84 | void __init orion_sata_init(struct mv_sata_platform_data *sata_data); | 84 | void __init orion_sata_init(struct mv_sata_platform_data *sata_data); |
85 | 85 | ||
86 | struct machine_desc; | ||
87 | struct meminfo; | ||
88 | struct tag; | ||
89 | extern void __init tag_fixup_mem32(struct machine_desc *, struct tag *, | ||
90 | char **, struct meminfo *); | ||
91 | |||
86 | #endif /* __ARCH_ORION_COMMON_H__ */ | 92 | #endif /* __ARCH_ORION_COMMON_H__ */ |
diff --git a/arch/arm/mach-orion/dns323-setup.c b/arch/arm/mach-orion/dns323-setup.c index 02b280c24820..076e155ad510 100644 --- a/arch/arm/mach-orion/dns323-setup.c +++ b/arch/arm/mach-orion/dns323-setup.c | |||
@@ -319,4 +319,5 @@ MACHINE_START(DNS323, "D-Link DNS-323") | |||
319 | .map_io = orion_map_io, | 319 | .map_io = orion_map_io, |
320 | .init_irq = orion_init_irq, | 320 | .init_irq = orion_init_irq, |
321 | .timer = &orion_timer, | 321 | .timer = &orion_timer, |
322 | .fixup = tag_fixup_mem32, | ||
322 | MACHINE_END | 323 | MACHINE_END |
diff --git a/arch/arm/mach-orion/gpio.c b/arch/arm/mach-orion/gpio.c index d5f00c86d616..f713818c66a3 100644 --- a/arch/arm/mach-orion/gpio.c +++ b/arch/arm/mach-orion/gpio.c | |||
@@ -36,7 +36,7 @@ int gpio_direction_input(unsigned pin) | |||
36 | unsigned long flags; | 36 | unsigned long flags; |
37 | 37 | ||
38 | if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) { | 38 | if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) { |
39 | pr_debug("%s: invalid GPIO %d\n", __FUNCTION__, pin); | 39 | pr_debug("%s: invalid GPIO %d\n", __func__, pin); |
40 | return -EINVAL; | 40 | return -EINVAL; |
41 | } | 41 | } |
42 | 42 | ||
@@ -62,7 +62,7 @@ int gpio_direction_output(unsigned pin, int value) | |||
62 | int mask; | 62 | int mask; |
63 | 63 | ||
64 | if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) { | 64 | if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) { |
65 | pr_debug("%s: invalid GPIO %d\n", __FUNCTION__, pin); | 65 | pr_debug("%s: invalid GPIO %d\n", __func__, pin); |
66 | return -EINVAL; | 66 | return -EINVAL; |
67 | } | 67 | } |
68 | 68 | ||
@@ -141,7 +141,7 @@ int gpio_request(unsigned pin, const char *label) | |||
141 | unsigned long flags; | 141 | unsigned long flags; |
142 | 142 | ||
143 | if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) { | 143 | if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) { |
144 | pr_debug("%s: invalid GPIO %d\n", __FUNCTION__, pin); | 144 | pr_debug("%s: invalid GPIO %d\n", __func__, pin); |
145 | return -EINVAL; | 145 | return -EINVAL; |
146 | } | 146 | } |
147 | 147 | ||
@@ -149,7 +149,7 @@ int gpio_request(unsigned pin, const char *label) | |||
149 | 149 | ||
150 | if (gpio_label[pin]) { | 150 | if (gpio_label[pin]) { |
151 | pr_debug("%s: GPIO %d already used as %s\n", | 151 | pr_debug("%s: GPIO %d already used as %s\n", |
152 | __FUNCTION__, pin, gpio_label[pin]); | 152 | __func__, pin, gpio_label[pin]); |
153 | ret = -EBUSY; | 153 | ret = -EBUSY; |
154 | } else | 154 | } else |
155 | gpio_label[pin] = label ? label : "?"; | 155 | gpio_label[pin] = label ? label : "?"; |
@@ -162,12 +162,12 @@ EXPORT_SYMBOL(gpio_request); | |||
162 | void gpio_free(unsigned pin) | 162 | void gpio_free(unsigned pin) |
163 | { | 163 | { |
164 | if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) { | 164 | if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) { |
165 | pr_debug("%s: invalid GPIO %d\n", __FUNCTION__, pin); | 165 | pr_debug("%s: invalid GPIO %d\n", __func__, pin); |
166 | return; | 166 | return; |
167 | } | 167 | } |
168 | 168 | ||
169 | if (!gpio_label[pin]) | 169 | if (!gpio_label[pin]) |
170 | pr_warning("%s: GPIO %d already freed\n", __FUNCTION__, pin); | 170 | pr_warning("%s: GPIO %d already freed\n", __func__, pin); |
171 | else | 171 | else |
172 | gpio_label[pin] = NULL; | 172 | gpio_label[pin] = NULL; |
173 | } | 173 | } |
diff --git a/arch/arm/mach-orion/kurobox_pro-setup.c b/arch/arm/mach-orion/kurobox_pro-setup.c index 6817aca4aa26..785a07bdf1e2 100644 --- a/arch/arm/mach-orion/kurobox_pro-setup.c +++ b/arch/arm/mach-orion/kurobox_pro-setup.c | |||
@@ -240,4 +240,5 @@ MACHINE_START(KUROBOX_PRO, "Buffalo/Revogear Kurobox Pro") | |||
240 | .map_io = orion_map_io, | 240 | .map_io = orion_map_io, |
241 | .init_irq = orion_init_irq, | 241 | .init_irq = orion_init_irq, |
242 | .timer = &orion_timer, | 242 | .timer = &orion_timer, |
243 | .fixup = tag_fixup_mem32, | ||
243 | MACHINE_END | 244 | MACHINE_END |
diff --git a/arch/arm/mach-orion/ts209-setup.c b/arch/arm/mach-orion/ts209-setup.c index b8cfe6813e9d..45764dad16d0 100644 --- a/arch/arm/mach-orion/ts209-setup.c +++ b/arch/arm/mach-orion/ts209-setup.c | |||
@@ -357,4 +357,5 @@ MACHINE_START(TS209, "QNAP TS-109/TS-209") | |||
357 | .map_io = orion_map_io, | 357 | .map_io = orion_map_io, |
358 | .init_irq = orion_init_irq, | 358 | .init_irq = orion_init_irq, |
359 | .timer = &orion_timer, | 359 | .timer = &orion_timer, |
360 | .fixup = tag_fixup_mem32, | ||
360 | MACHINE_END | 361 | MACHINE_END |
diff --git a/arch/arm/mach-pnx4008/clock.c b/arch/arm/mach-pnx4008/clock.c index daa8d3d98eff..8e00ed43fb95 100644 --- a/arch/arm/mach-pnx4008/clock.c +++ b/arch/arm/mach-pnx4008/clock.c | |||
@@ -976,7 +976,7 @@ static int __init clk_init(void) | |||
976 | (*clkp)->set_parent((*clkp), (*clkp)->parent); | 976 | (*clkp)->set_parent((*clkp), (*clkp)->parent); |
977 | } | 977 | } |
978 | pr_debug("%s: clock %s, rate %ld\n", | 978 | pr_debug("%s: clock %s, rate %ld\n", |
979 | __FUNCTION__, (*clkp)->name, (*clkp)->rate); | 979 | __func__, (*clkp)->name, (*clkp)->rate); |
980 | } | 980 | } |
981 | 981 | ||
982 | local_clk_use(&ck_pll4); | 982 | local_clk_use(&ck_pll4); |
diff --git a/arch/arm/mach-pnx4008/dma.c b/arch/arm/mach-pnx4008/dma.c index f7009d845be8..fe152e82590b 100644 --- a/arch/arm/mach-pnx4008/dma.c +++ b/arch/arm/mach-pnx4008/dma.c | |||
@@ -192,7 +192,7 @@ void pnx4008_free_channel(int ch) | |||
192 | if (!dma_channels[ch].name) { | 192 | if (!dma_channels[ch].name) { |
193 | printk(KERN_CRIT | 193 | printk(KERN_CRIT |
194 | "%s: trying to free channel %d which is already freed\n", | 194 | "%s: trying to free channel %d which is already freed\n", |
195 | __FUNCTION__, ch); | 195 | __func__, ch); |
196 | return; | 196 | return; |
197 | } | 197 | } |
198 | 198 | ||
diff --git a/arch/arm/mach-pxa/cm-x270-pci.c b/arch/arm/mach-pxa/cm-x270-pci.c index 15c4e0df3e10..fcda7d5cb693 100644 --- a/arch/arm/mach-pxa/cm-x270-pci.c +++ b/arch/arm/mach-pxa/cm-x270-pci.c | |||
@@ -104,7 +104,7 @@ static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | |||
104 | { | 104 | { |
105 | int irq; | 105 | int irq; |
106 | 106 | ||
107 | dev_dbg(&dev->dev, "%s: slot=%x, pin=%x\n", __FUNCTION__, slot, pin); | 107 | dev_dbg(&dev->dev, "%s: slot=%x, pin=%x\n", __func__, slot, pin); |
108 | 108 | ||
109 | irq = it8152_pci_map_irq(dev, slot, pin); | 109 | irq = it8152_pci_map_irq(dev, slot, pin); |
110 | if (irq) | 110 | if (irq) |
diff --git a/arch/arm/mach-pxa/cm-x270.c b/arch/arm/mach-pxa/cm-x270.c index 6012177a29a3..ecdbc96a4de1 100644 --- a/arch/arm/mach-pxa/cm-x270.c +++ b/arch/arm/mach-pxa/cm-x270.c | |||
@@ -504,11 +504,11 @@ static void cmx270_mci_setpower(struct device *dev, unsigned int vdd) | |||
504 | struct pxamci_platform_data *p_d = dev->platform_data; | 504 | struct pxamci_platform_data *p_d = dev->platform_data; |
505 | 505 | ||
506 | if ((1 << vdd) & p_d->ocr_mask) { | 506 | if ((1 << vdd) & p_d->ocr_mask) { |
507 | printk(KERN_DEBUG "%s: on\n", __FUNCTION__); | 507 | printk(KERN_DEBUG "%s: on\n", __func__); |
508 | GPCR(105) = GPIO_bit(105); | 508 | GPCR(105) = GPIO_bit(105); |
509 | } else { | 509 | } else { |
510 | GPSR(105) = GPIO_bit(105); | 510 | GPSR(105) = GPIO_bit(105); |
511 | printk(KERN_DEBUG "%s: off\n", __FUNCTION__); | 511 | printk(KERN_DEBUG "%s: off\n", __func__); |
512 | } | 512 | } |
513 | } | 513 | } |
514 | 514 | ||
diff --git a/arch/arm/mach-pxa/cpu-pxa.c b/arch/arm/mach-pxa/cpu-pxa.c index 939a3867f77c..4b21479332ae 100644 --- a/arch/arm/mach-pxa/cpu-pxa.c +++ b/arch/arm/mach-pxa/cpu-pxa.c | |||
@@ -43,7 +43,7 @@ | |||
43 | 43 | ||
44 | #ifdef DEBUG | 44 | #ifdef DEBUG |
45 | static unsigned int freq_debug; | 45 | static unsigned int freq_debug; |
46 | MODULE_PARM(freq_debug, "i"); | 46 | module_param(freq_debug, uint, 0); |
47 | MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0"); | 47 | MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0"); |
48 | #else | 48 | #else |
49 | #define freq_debug 0 | 49 | #define freq_debug 0 |
diff --git a/arch/arm/mach-pxa/dma.c b/arch/arm/mach-pxa/dma.c index 93c4f31f127f..3215316d7b06 100644 --- a/arch/arm/mach-pxa/dma.c +++ b/arch/arm/mach-pxa/dma.c | |||
@@ -81,7 +81,7 @@ void pxa_free_dma (int dma_ch) | |||
81 | if (!dma_channels[dma_ch].name) { | 81 | if (!dma_channels[dma_ch].name) { |
82 | printk (KERN_CRIT | 82 | printk (KERN_CRIT |
83 | "%s: trying to free channel %d which is already freed\n", | 83 | "%s: trying to free channel %d which is already freed\n", |
84 | __FUNCTION__, dma_ch); | 84 | __func__, dma_ch); |
85 | return; | 85 | return; |
86 | } | 86 | } |
87 | 87 | ||
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index 3d0ad5065ee5..3bb31314429a 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c | |||
@@ -264,7 +264,7 @@ static int em_x270_mci_init(struct device *dev, | |||
264 | "MMC card detect", data); | 264 | "MMC card detect", data); |
265 | if (err) { | 265 | if (err) { |
266 | printk(KERN_ERR "%s: can't request MMC card detect IRQ: %d\n", | 266 | printk(KERN_ERR "%s: can't request MMC card detect IRQ: %d\n", |
267 | __FUNCTION__, err); | 267 | __func__, err); |
268 | return err; | 268 | return err; |
269 | } | 269 | } |
270 | 270 | ||
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index 345c3deeb02e..72a436fb9a29 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c | |||
@@ -390,11 +390,11 @@ static void mainstone_mci_setpower(struct device *dev, unsigned int vdd) | |||
390 | struct pxamci_platform_data* p_d = dev->platform_data; | 390 | struct pxamci_platform_data* p_d = dev->platform_data; |
391 | 391 | ||
392 | if (( 1 << vdd) & p_d->ocr_mask) { | 392 | if (( 1 << vdd) & p_d->ocr_mask) { |
393 | printk(KERN_DEBUG "%s: on\n", __FUNCTION__); | 393 | printk(KERN_DEBUG "%s: on\n", __func__); |
394 | MST_MSCWR1 |= MST_MSCWR1_MMC_ON; | 394 | MST_MSCWR1 |= MST_MSCWR1_MMC_ON; |
395 | MST_MSCWR1 &= ~MST_MSCWR1_MS_SEL; | 395 | MST_MSCWR1 &= ~MST_MSCWR1_MS_SEL; |
396 | } else { | 396 | } else { |
397 | printk(KERN_DEBUG "%s: off\n", __FUNCTION__); | 397 | printk(KERN_DEBUG "%s: off\n", __func__); |
398 | MST_MSCWR1 &= ~MST_MSCWR1_MMC_ON; | 398 | MST_MSCWR1 &= ~MST_MSCWR1_MMC_ON; |
399 | } | 399 | } |
400 | } | 400 | } |
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index 7cd9ef8deb02..35f25fdaeba3 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c | |||
@@ -129,28 +129,20 @@ static void clk_pxa3xx_cken_enable(struct clk *clk) | |||
129 | { | 129 | { |
130 | unsigned long mask = 1ul << (clk->cken & 0x1f); | 130 | unsigned long mask = 1ul << (clk->cken & 0x1f); |
131 | 131 | ||
132 | local_irq_disable(); | ||
133 | |||
134 | if (clk->cken < 32) | 132 | if (clk->cken < 32) |
135 | CKENA |= mask; | 133 | CKENA |= mask; |
136 | else | 134 | else |
137 | CKENB |= mask; | 135 | CKENB |= mask; |
138 | |||
139 | local_irq_enable(); | ||
140 | } | 136 | } |
141 | 137 | ||
142 | static void clk_pxa3xx_cken_disable(struct clk *clk) | 138 | static void clk_pxa3xx_cken_disable(struct clk *clk) |
143 | { | 139 | { |
144 | unsigned long mask = 1ul << (clk->cken & 0x1f); | 140 | unsigned long mask = 1ul << (clk->cken & 0x1f); |
145 | 141 | ||
146 | local_irq_disable(); | ||
147 | |||
148 | if (clk->cken < 32) | 142 | if (clk->cken < 32) |
149 | CKENA &= ~mask; | 143 | CKENA &= ~mask; |
150 | else | 144 | else |
151 | CKENB &= ~mask; | 145 | CKENB &= ~mask; |
152 | |||
153 | local_irq_enable(); | ||
154 | } | 146 | } |
155 | 147 | ||
156 | static const struct clkops clk_pxa3xx_cken_ops = { | 148 | static const struct clkops clk_pxa3xx_cken_ops = { |
diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c index 853fc9433750..f207fcd30cd7 100644 --- a/arch/arm/mach-pxa/trizeps4.c +++ b/arch/arm/mach-pxa/trizeps4.c | |||
@@ -217,7 +217,7 @@ void board_pcmcia_power(int power) | |||
217 | ConXS_BCR = trizeps_conxs_bcr; | 217 | ConXS_BCR = trizeps_conxs_bcr; |
218 | 218 | ||
219 | } | 219 | } |
220 | pr_debug("%s: o%s 0x%x\n", __FUNCTION__, power ? "n": "ff", trizeps_conxs_bcr); | 220 | pr_debug("%s: o%s 0x%x\n", __func__, power ? "n": "ff", trizeps_conxs_bcr); |
221 | } | 221 | } |
222 | 222 | ||
223 | /* backlight power switching for LCD panel */ | 223 | /* backlight power switching for LCD panel */ |
@@ -228,7 +228,7 @@ static void board_backlight_power(int on) | |||
228 | } else { | 228 | } else { |
229 | trizeps_conxs_bcr &= ~ConXS_BCR_L_DISP; | 229 | trizeps_conxs_bcr &= ~ConXS_BCR_L_DISP; |
230 | } | 230 | } |
231 | pr_debug("%s: o%s 0x%x\n", __FUNCTION__, on ? "n" : "ff", trizeps_conxs_bcr); | 231 | pr_debug("%s: o%s 0x%x\n", __func__, on ? "n" : "ff", trizeps_conxs_bcr); |
232 | ConXS_BCR = trizeps_conxs_bcr; | 232 | ConXS_BCR = trizeps_conxs_bcr; |
233 | } | 233 | } |
234 | 234 | ||
@@ -238,10 +238,10 @@ static void board_mci_power(struct device *dev, unsigned int vdd) | |||
238 | struct pxamci_platform_data* p_d = dev->platform_data; | 238 | struct pxamci_platform_data* p_d = dev->platform_data; |
239 | 239 | ||
240 | if (( 1 << vdd) & p_d->ocr_mask) { | 240 | if (( 1 << vdd) & p_d->ocr_mask) { |
241 | pr_debug("%s: on\n", __FUNCTION__); | 241 | pr_debug("%s: on\n", __func__); |
242 | /* FIXME fill in values here */ | 242 | /* FIXME fill in values here */ |
243 | } else { | 243 | } else { |
244 | pr_debug("%s: off\n", __FUNCTION__); | 244 | pr_debug("%s: off\n", __func__); |
245 | /* FIXME fill in values here */ | 245 | /* FIXME fill in values here */ |
246 | } | 246 | } |
247 | } | 247 | } |
diff --git a/arch/arm/mach-pxa/zylonite.c b/arch/arm/mach-pxa/zylonite.c index 7731d50dd86c..afd2cbfca0d9 100644 --- a/arch/arm/mach-pxa/zylonite.c +++ b/arch/arm/mach-pxa/zylonite.c | |||
@@ -58,7 +58,7 @@ static struct platform_device smc91x_device = { | |||
58 | .resource = smc91x_resources, | 58 | .resource = smc91x_resources, |
59 | }; | 59 | }; |
60 | 60 | ||
61 | #if defined(CONFIG_FB_PXA) || (CONFIG_FB_PXA_MODULES) | 61 | #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) |
62 | static void zylonite_backlight_power(int on) | 62 | static void zylonite_backlight_power(int on) |
63 | { | 63 | { |
64 | gpio_set_value(gpio_backlight, on); | 64 | gpio_set_value(gpio_backlight, on); |
diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c index f60b7a66dfa0..842d9e6dc5ff 100644 --- a/arch/arm/mach-sa1100/badge4.c +++ b/arch/arm/mach-sa1100/badge4.c | |||
@@ -206,7 +206,7 @@ static int __init badge4_init(void) | |||
206 | if (ret < 0) | 206 | if (ret < 0) |
207 | printk(KERN_ERR | 207 | printk(KERN_ERR |
208 | "%s: SA-1111 initialization failed (%d)\n", | 208 | "%s: SA-1111 initialization failed (%d)\n", |
209 | __FUNCTION__, ret); | 209 | __func__, ret); |
210 | 210 | ||
211 | 211 | ||
212 | /* maybe turn on 5v0 from the start */ | 212 | /* maybe turn on 5v0 from the start */ |
@@ -240,11 +240,11 @@ void badge4_set_5V(unsigned subsystem, int on) | |||
240 | /* detect on->off and off->on transitions */ | 240 | /* detect on->off and off->on transitions */ |
241 | if ((!old_5V_bitmap) && (badge4_5V_bitmap)) { | 241 | if ((!old_5V_bitmap) && (badge4_5V_bitmap)) { |
242 | /* was off, now on */ | 242 | /* was off, now on */ |
243 | printk(KERN_INFO "%s: enabling 5V supply rail\n", __FUNCTION__); | 243 | printk(KERN_INFO "%s: enabling 5V supply rail\n", __func__); |
244 | GPSR = BADGE4_GPIO_PCMEN5V; | 244 | GPSR = BADGE4_GPIO_PCMEN5V; |
245 | } else if ((old_5V_bitmap) && (!badge4_5V_bitmap)) { | 245 | } else if ((old_5V_bitmap) && (!badge4_5V_bitmap)) { |
246 | /* was on, now off */ | 246 | /* was on, now off */ |
247 | printk(KERN_INFO "%s: disabling 5V supply rail\n", __FUNCTION__); | 247 | printk(KERN_INFO "%s: disabling 5V supply rail\n", __func__); |
248 | GPCR = BADGE4_GPIO_PCMEN5V; | 248 | GPCR = BADGE4_GPIO_PCMEN5V; |
249 | } | 249 | } |
250 | 250 | ||
diff --git a/arch/arm/mach-sa1100/cpu-sa1100.c b/arch/arm/mach-sa1100/cpu-sa1100.c index d68630b74d78..343368aa82de 100644 --- a/arch/arm/mach-sa1100/cpu-sa1100.c +++ b/arch/arm/mach-sa1100/cpu-sa1100.c | |||
@@ -139,7 +139,7 @@ static void sa1100_update_dram_timings(int current_speed, int new_speed) | |||
139 | 139 | ||
140 | if (settings->speed == 0) { | 140 | if (settings->speed == 0) { |
141 | panic("%s: couldn't find dram setting for speed %d\n", | 141 | panic("%s: couldn't find dram setting for speed %d\n", |
142 | __FUNCTION__, new_speed); | 142 | __func__, new_speed); |
143 | } | 143 | } |
144 | 144 | ||
145 | /* No risk, no fun: run with interrupts on! */ | 145 | /* No risk, no fun: run with interrupts on! */ |
diff --git a/arch/arm/mach-sa1100/dma.c b/arch/arm/mach-sa1100/dma.c index 1fbe053e8b59..e5080286060e 100644 --- a/arch/arm/mach-sa1100/dma.c +++ b/arch/arm/mach-sa1100/dma.c | |||
@@ -129,7 +129,7 @@ int sa1100_request_dma (dma_device_t device, const char *device_id, | |||
129 | if (err) { | 129 | if (err) { |
130 | printk(KERN_ERR | 130 | printk(KERN_ERR |
131 | "%s: unable to request IRQ %d for %s\n", | 131 | "%s: unable to request IRQ %d for %s\n", |
132 | __FUNCTION__, IRQ_DMA0 + i, device_id); | 132 | __func__, IRQ_DMA0 + i, device_id); |
133 | dma->device = 0; | 133 | dma->device = 0; |
134 | return err; | 134 | return err; |
135 | } | 135 | } |
@@ -165,12 +165,12 @@ void sa1100_free_dma(dma_regs_t *regs) | |||
165 | if (regs == (dma_regs_t *)&DDAR(i)) | 165 | if (regs == (dma_regs_t *)&DDAR(i)) |
166 | break; | 166 | break; |
167 | if (i >= SA1100_DMA_CHANNELS) { | 167 | if (i >= SA1100_DMA_CHANNELS) { |
168 | printk(KERN_ERR "%s: bad DMA identifier\n", __FUNCTION__); | 168 | printk(KERN_ERR "%s: bad DMA identifier\n", __func__); |
169 | return; | 169 | return; |
170 | } | 170 | } |
171 | 171 | ||
172 | if (!dma_chan[i].device) { | 172 | if (!dma_chan[i].device) { |
173 | printk(KERN_ERR "%s: Trying to free free DMA\n", __FUNCTION__); | 173 | printk(KERN_ERR "%s: Trying to free free DMA\n", __func__); |
174 | return; | 174 | return; |
175 | } | 175 | } |
176 | 176 | ||
@@ -329,7 +329,7 @@ void sa1100_reset_dma(dma_regs_t *regs) | |||
329 | if (regs == (dma_regs_t *)&DDAR(i)) | 329 | if (regs == (dma_regs_t *)&DDAR(i)) |
330 | break; | 330 | break; |
331 | if (i >= SA1100_DMA_CHANNELS) { | 331 | if (i >= SA1100_DMA_CHANNELS) { |
332 | printk(KERN_ERR "%s: bad DMA identifier\n", __FUNCTION__); | 332 | printk(KERN_ERR "%s: bad DMA identifier\n", __func__); |
333 | return; | 333 | return; |
334 | } | 334 | } |
335 | 335 | ||
diff --git a/arch/arm/mach-sa1100/h3600.c b/arch/arm/mach-sa1100/h3600.c index b72fee0f2538..8473c37b77d6 100644 --- a/arch/arm/mach-sa1100/h3600.c +++ b/arch/arm/mach-sa1100/h3600.c | |||
@@ -596,7 +596,7 @@ static void h3800_control_egpio(enum ipaq_egpio_type x, int setp) | |||
596 | case IPAQ_EGPIO_CODEC_NRESET: | 596 | case IPAQ_EGPIO_CODEC_NRESET: |
597 | case IPAQ_EGPIO_AUDIO_ON: | 597 | case IPAQ_EGPIO_AUDIO_ON: |
598 | case IPAQ_EGPIO_QMUTE: | 598 | case IPAQ_EGPIO_QMUTE: |
599 | printk("%s: error - should not be called\n", __FUNCTION__); | 599 | printk("%s: error - should not be called\n", __func__); |
600 | break; | 600 | break; |
601 | case IPAQ_EGPIO_OPT_NVRAM_ON: | 601 | case IPAQ_EGPIO_OPT_NVRAM_ON: |
602 | SET_ASIC2(GPIO2_OPT_ON_NVRAM); | 602 | SET_ASIC2(GPIO2_OPT_ON_NVRAM); |
@@ -638,7 +638,7 @@ static int h3800_pm_callback(int req) | |||
638 | static u16 asic2_data; | 638 | static u16 asic2_data; |
639 | int result = 0; | 639 | int result = 0; |
640 | 640 | ||
641 | printk("%s %d\n", __FUNCTION__, req); | 641 | printk("%s %d\n", __func__, req); |
642 | 642 | ||
643 | switch (req) { | 643 | switch (req) { |
644 | case PM_RESUME: | 644 | case PM_RESUME: |
@@ -666,7 +666,7 @@ static int h3800_pm_callback(int req) | |||
666 | asic2_data = H3800_ASIC2_GPIOPIOD; | 666 | asic2_data = H3800_ASIC2_GPIOPIOD; |
667 | break; | 667 | break; |
668 | default: | 668 | default: |
669 | printk("%s: unrecognized PM callback\n", __FUNCTION__); | 669 | printk("%s: unrecognized PM callback\n", __func__); |
670 | break; | 670 | break; |
671 | } | 671 | } |
672 | return result; | 672 | return result; |
@@ -706,7 +706,7 @@ static void h3800_IRQ_demux(unsigned int irq, struct irq_desc *desc) | |||
706 | { | 706 | { |
707 | int i; | 707 | int i; |
708 | 708 | ||
709 | if (0) printk("%s: interrupt received\n", __FUNCTION__); | 709 | if (0) printk("%s: interrupt received\n", __func__); |
710 | 710 | ||
711 | desc->chip->ack(irq); | 711 | desc->chip->ack(irq); |
712 | 712 | ||
@@ -716,21 +716,21 @@ static void h3800_IRQ_demux(unsigned int irq, struct irq_desc *desc) | |||
716 | 716 | ||
717 | /* KPIO */ | 717 | /* KPIO */ |
718 | irq = H3800_ASIC2_KPIINTFLAG; | 718 | irq = H3800_ASIC2_KPIINTFLAG; |
719 | if (0) printk("%s KPIO 0x%08X\n", __FUNCTION__, irq); | 719 | if (0) printk("%s KPIO 0x%08X\n", __func__, irq); |
720 | for (j = 0; j < H3800_KPIO_IRQ_COUNT; j++) | 720 | for (j = 0; j < H3800_KPIO_IRQ_COUNT; j++) |
721 | if (irq & kpio_irq_mask[j]) | 721 | if (irq & kpio_irq_mask[j]) |
722 | handle_edge_irq(H3800_KPIO_IRQ_COUNT + j, irq_desc + H3800_KPIO_IRQ_COUNT + j); | 722 | handle_edge_irq(H3800_KPIO_IRQ_COUNT + j, irq_desc + H3800_KPIO_IRQ_COUNT + j); |
723 | 723 | ||
724 | /* GPIO2 */ | 724 | /* GPIO2 */ |
725 | irq = H3800_ASIC2_GPIINTFLAG; | 725 | irq = H3800_ASIC2_GPIINTFLAG; |
726 | if (0) printk("%s GPIO 0x%08X\n", __FUNCTION__, irq); | 726 | if (0) printk("%s GPIO 0x%08X\n", __func__, irq); |
727 | for (j = 0; j < H3800_GPIO_IRQ_COUNT; j++) | 727 | for (j = 0; j < H3800_GPIO_IRQ_COUNT; j++) |
728 | if (irq & gpio_irq_mask[j]) | 728 | if (irq & gpio_irq_mask[j]) |
729 | handle_edge_irq(H3800_GPIO_IRQ_COUNT + j, irq_desc + H3800_GPIO_IRQ_COUNT + j); | 729 | handle_edge_irq(H3800_GPIO_IRQ_COUNT + j, irq_desc + H3800_GPIO_IRQ_COUNT + j); |
730 | } | 730 | } |
731 | 731 | ||
732 | if (i >= MAX_ASIC_ISR_LOOPS) | 732 | if (i >= MAX_ASIC_ISR_LOOPS) |
733 | printk("%s: interrupt processing overrun\n", __FUNCTION__); | 733 | printk("%s: interrupt processing overrun\n", __func__); |
734 | 734 | ||
735 | /* For level-based interrupts */ | 735 | /* For level-based interrupts */ |
736 | desc->chip->unmask(irq); | 736 | desc->chip->unmask(irq); |
diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index 2728b0e7d2bb..3f6dc40b8353 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c | |||
@@ -120,6 +120,8 @@ full_search: | |||
120 | */ | 120 | */ |
121 | int valid_phys_addr_range(unsigned long addr, size_t size) | 121 | int valid_phys_addr_range(unsigned long addr, size_t size) |
122 | { | 122 | { |
123 | if (addr < PHYS_OFFSET) | ||
124 | return 0; | ||
123 | if (addr + size > __pa(high_memory)) | 125 | if (addr + size > __pa(high_memory)) |
124 | return 0; | 126 | return 0; |
125 | 127 | ||
diff --git a/arch/arm/mm/pgd.c b/arch/arm/mm/pgd.c index 500c9610ab30..e0f19ab91163 100644 --- a/arch/arm/mm/pgd.c +++ b/arch/arm/mm/pgd.c | |||
@@ -75,7 +75,7 @@ no_pgd: | |||
75 | void free_pgd_slow(struct mm_struct *mm, pgd_t *pgd) | 75 | void free_pgd_slow(struct mm_struct *mm, pgd_t *pgd) |
76 | { | 76 | { |
77 | pmd_t *pmd; | 77 | pmd_t *pmd; |
78 | struct page *pte; | 78 | pgtable_t pte; |
79 | 79 | ||
80 | if (!pgd) | 80 | if (!pgd) |
81 | return; | 81 | return; |
@@ -90,10 +90,8 @@ void free_pgd_slow(struct mm_struct *mm, pgd_t *pgd) | |||
90 | goto free; | 90 | goto free; |
91 | } | 91 | } |
92 | 92 | ||
93 | pte = pmd_page(*pmd); | 93 | pte = pmd_pgtable(*pmd); |
94 | pmd_clear(pmd); | 94 | pmd_clear(pmd); |
95 | dec_zone_page_state(virt_to_page((unsigned long *)pgd), NR_PAGETABLE); | ||
96 | pte_lock_deinit(pte); | ||
97 | pte_free(mm, pte); | 95 | pte_free(mm, pte); |
98 | pmd_free(mm, pmd); | 96 | pmd_free(mm, pmd); |
99 | free: | 97 | free: |
diff --git a/arch/arm/plat-iop/pci.c b/arch/arm/plat-iop/pci.c index 2b5aa1135b11..98d01517b563 100644 --- a/arch/arm/plat-iop/pci.c +++ b/arch/arm/plat-iop/pci.c | |||
@@ -371,7 +371,7 @@ static int __init iop3xx_init_atu_setup(char *str) | |||
371 | default: | 371 | default: |
372 | printk(KERN_DEBUG "\"%s\" malformed at " | 372 | printk(KERN_DEBUG "\"%s\" malformed at " |
373 | "character: \'%c\'", | 373 | "character: \'%c\'", |
374 | __FUNCTION__, | 374 | __func__, |
375 | *str); | 375 | *str); |
376 | *(str + 1) = '\0'; | 376 | *(str + 1) = '\0'; |
377 | } | 377 | } |
diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c index c0d63b0c61c9..d719c15daa55 100644 --- a/arch/arm/plat-omap/cpu-omap.c +++ b/arch/arm/plat-omap/cpu-omap.c | |||
@@ -33,43 +33,33 @@ | |||
33 | #define MPU_CLK "virt_prcm_set" | 33 | #define MPU_CLK "virt_prcm_set" |
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | static struct clk *mpu_clk; | ||
37 | |||
36 | /* TODO: Add support for SDRAM timing changes */ | 38 | /* TODO: Add support for SDRAM timing changes */ |
37 | 39 | ||
38 | int omap_verify_speed(struct cpufreq_policy *policy) | 40 | int omap_verify_speed(struct cpufreq_policy *policy) |
39 | { | 41 | { |
40 | struct clk * mpu_clk; | ||
41 | |||
42 | if (policy->cpu) | 42 | if (policy->cpu) |
43 | return -EINVAL; | 43 | return -EINVAL; |
44 | 44 | ||
45 | cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, | 45 | cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, |
46 | policy->cpuinfo.max_freq); | 46 | policy->cpuinfo.max_freq); |
47 | mpu_clk = clk_get(NULL, MPU_CLK); | 47 | |
48 | if (IS_ERR(mpu_clk)) | ||
49 | return PTR_ERR(mpu_clk); | ||
50 | policy->min = clk_round_rate(mpu_clk, policy->min * 1000) / 1000; | 48 | policy->min = clk_round_rate(mpu_clk, policy->min * 1000) / 1000; |
51 | policy->max = clk_round_rate(mpu_clk, policy->max * 1000) / 1000; | 49 | policy->max = clk_round_rate(mpu_clk, policy->max * 1000) / 1000; |
52 | cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, | 50 | cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq, |
53 | policy->cpuinfo.max_freq); | 51 | policy->cpuinfo.max_freq); |
54 | clk_put(mpu_clk); | ||
55 | |||
56 | return 0; | 52 | return 0; |
57 | } | 53 | } |
58 | 54 | ||
59 | unsigned int omap_getspeed(unsigned int cpu) | 55 | unsigned int omap_getspeed(unsigned int cpu) |
60 | { | 56 | { |
61 | struct clk * mpu_clk; | ||
62 | unsigned long rate; | 57 | unsigned long rate; |
63 | 58 | ||
64 | if (cpu) | 59 | if (cpu) |
65 | return 0; | 60 | return 0; |
66 | 61 | ||
67 | mpu_clk = clk_get(NULL, MPU_CLK); | ||
68 | if (IS_ERR(mpu_clk)) | ||
69 | return 0; | ||
70 | rate = clk_get_rate(mpu_clk) / 1000; | 62 | rate = clk_get_rate(mpu_clk) / 1000; |
71 | clk_put(mpu_clk); | ||
72 | |||
73 | return rate; | 63 | return rate; |
74 | } | 64 | } |
75 | 65 | ||
@@ -77,14 +67,9 @@ static int omap_target(struct cpufreq_policy *policy, | |||
77 | unsigned int target_freq, | 67 | unsigned int target_freq, |
78 | unsigned int relation) | 68 | unsigned int relation) |
79 | { | 69 | { |
80 | struct clk * mpu_clk; | ||
81 | struct cpufreq_freqs freqs; | 70 | struct cpufreq_freqs freqs; |
82 | int ret = 0; | 71 | int ret = 0; |
83 | 72 | ||
84 | mpu_clk = clk_get(NULL, MPU_CLK); | ||
85 | if (IS_ERR(mpu_clk)) | ||
86 | return PTR_ERR(mpu_clk); | ||
87 | |||
88 | freqs.old = omap_getspeed(0); | 73 | freqs.old = omap_getspeed(0); |
89 | freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; | 74 | freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; |
90 | freqs.cpu = 0; | 75 | freqs.cpu = 0; |
@@ -92,15 +77,12 @@ static int omap_target(struct cpufreq_policy *policy, | |||
92 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); | 77 | cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); |
93 | ret = clk_set_rate(mpu_clk, target_freq * 1000); | 78 | ret = clk_set_rate(mpu_clk, target_freq * 1000); |
94 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 79 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
95 | clk_put(mpu_clk); | ||
96 | 80 | ||
97 | return ret; | 81 | return ret; |
98 | } | 82 | } |
99 | 83 | ||
100 | static int __init omap_cpu_init(struct cpufreq_policy *policy) | 84 | static int __init omap_cpu_init(struct cpufreq_policy *policy) |
101 | { | 85 | { |
102 | struct clk * mpu_clk; | ||
103 | |||
104 | mpu_clk = clk_get(NULL, MPU_CLK); | 86 | mpu_clk = clk_get(NULL, MPU_CLK); |
105 | if (IS_ERR(mpu_clk)) | 87 | if (IS_ERR(mpu_clk)) |
106 | return PTR_ERR(mpu_clk); | 88 | return PTR_ERR(mpu_clk); |
@@ -111,17 +93,23 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy) | |||
111 | policy->cpuinfo.min_freq = clk_round_rate(mpu_clk, 0) / 1000; | 93 | policy->cpuinfo.min_freq = clk_round_rate(mpu_clk, 0) / 1000; |
112 | policy->cpuinfo.max_freq = clk_round_rate(mpu_clk, VERY_HI_RATE) / 1000; | 94 | policy->cpuinfo.max_freq = clk_round_rate(mpu_clk, VERY_HI_RATE) / 1000; |
113 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; | 95 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; |
114 | clk_put(mpu_clk); | ||
115 | 96 | ||
116 | return 0; | 97 | return 0; |
117 | } | 98 | } |
118 | 99 | ||
100 | static int omap_cpu_exit(struct cpufreq_policy *policy) | ||
101 | { | ||
102 | clk_put(mpu_clk); | ||
103 | return 0; | ||
104 | } | ||
105 | |||
119 | static struct cpufreq_driver omap_driver = { | 106 | static struct cpufreq_driver omap_driver = { |
120 | .flags = CPUFREQ_STICKY, | 107 | .flags = CPUFREQ_STICKY, |
121 | .verify = omap_verify_speed, | 108 | .verify = omap_verify_speed, |
122 | .target = omap_target, | 109 | .target = omap_target, |
123 | .get = omap_getspeed, | 110 | .get = omap_getspeed, |
124 | .init = omap_cpu_init, | 111 | .init = omap_cpu_init, |
112 | .exit = omap_cpu_exit, | ||
125 | .name = "omap", | 113 | .name = "omap", |
126 | }; | 114 | }; |
127 | 115 | ||
diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index c5dab1d6417e..4a53f9ba6c43 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c | |||
@@ -89,68 +89,6 @@ static inline void omap_init_dsp(void) { } | |||
89 | #endif /* CONFIG_OMAP_DSP */ | 89 | #endif /* CONFIG_OMAP_DSP */ |
90 | 90 | ||
91 | /*-------------------------------------------------------------------------*/ | 91 | /*-------------------------------------------------------------------------*/ |
92 | #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) | ||
93 | |||
94 | #define OMAP1_I2C_BASE 0xfffb3800 | ||
95 | #define OMAP2_I2C_BASE1 0x48070000 | ||
96 | #define OMAP_I2C_SIZE 0x3f | ||
97 | #define OMAP1_I2C_INT INT_I2C | ||
98 | #define OMAP2_I2C_INT1 56 | ||
99 | |||
100 | static struct resource i2c_resources1[] = { | ||
101 | { | ||
102 | .start = 0, | ||
103 | .end = 0, | ||
104 | .flags = IORESOURCE_MEM, | ||
105 | }, | ||
106 | { | ||
107 | .start = 0, | ||
108 | .flags = IORESOURCE_IRQ, | ||
109 | }, | ||
110 | }; | ||
111 | |||
112 | /* DMA not used; works around erratum writing to non-empty i2c fifo */ | ||
113 | |||
114 | static struct platform_device omap_i2c_device1 = { | ||
115 | .name = "i2c_omap", | ||
116 | .id = 1, | ||
117 | .num_resources = ARRAY_SIZE(i2c_resources1), | ||
118 | .resource = i2c_resources1, | ||
119 | }; | ||
120 | |||
121 | /* See also arch/arm/mach-omap2/devices.c for second I2C on 24xx */ | ||
122 | static void omap_init_i2c(void) | ||
123 | { | ||
124 | if (cpu_is_omap24xx()) { | ||
125 | i2c_resources1[0].start = OMAP2_I2C_BASE1; | ||
126 | i2c_resources1[0].end = OMAP2_I2C_BASE1 + OMAP_I2C_SIZE; | ||
127 | i2c_resources1[1].start = OMAP2_I2C_INT1; | ||
128 | } else { | ||
129 | i2c_resources1[0].start = OMAP1_I2C_BASE; | ||
130 | i2c_resources1[0].end = OMAP1_I2C_BASE + OMAP_I2C_SIZE; | ||
131 | i2c_resources1[1].start = OMAP1_I2C_INT; | ||
132 | } | ||
133 | |||
134 | /* FIXME define and use a boot tag, in case of boards that | ||
135 | * either don't wire up I2C, or chips that mux it differently... | ||
136 | * it can include clocking and address info, maybe more. | ||
137 | */ | ||
138 | if (cpu_is_omap24xx()) { | ||
139 | omap_cfg_reg(M19_24XX_I2C1_SCL); | ||
140 | omap_cfg_reg(L15_24XX_I2C1_SDA); | ||
141 | } else { | ||
142 | omap_cfg_reg(I2C_SCL); | ||
143 | omap_cfg_reg(I2C_SDA); | ||
144 | } | ||
145 | |||
146 | (void) platform_device_register(&omap_i2c_device1); | ||
147 | } | ||
148 | |||
149 | #else | ||
150 | static inline void omap_init_i2c(void) {} | ||
151 | #endif | ||
152 | |||
153 | /*-------------------------------------------------------------------------*/ | ||
154 | #if defined(CONFIG_KEYBOARD_OMAP) || defined(CONFIG_KEYBOARD_OMAP_MODULE) | 92 | #if defined(CONFIG_KEYBOARD_OMAP) || defined(CONFIG_KEYBOARD_OMAP_MODULE) |
155 | 93 | ||
156 | static void omap_init_kp(void) | 94 | static void omap_init_kp(void) |
@@ -501,7 +439,6 @@ static int __init omap_init_devices(void) | |||
501 | * in alphabetical order so they're easier to sort through. | 439 | * in alphabetical order so they're easier to sort through. |
502 | */ | 440 | */ |
503 | omap_init_dsp(); | 441 | omap_init_dsp(); |
504 | omap_init_i2c(); | ||
505 | omap_init_kp(); | 442 | omap_init_kp(); |
506 | omap_init_mmc(); | 443 | omap_init_mmc(); |
507 | omap_init_uwire(); | 444 | omap_init_uwire(); |
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c index a46676db8113..91004a3c4794 100644 --- a/arch/arm/plat-omap/dma.c +++ b/arch/arm/plat-omap/dma.c | |||
@@ -137,7 +137,7 @@ static void omap_disable_channel_irq(int lch); | |||
137 | static inline void omap_enable_channel_irq(int lch); | 137 | static inline void omap_enable_channel_irq(int lch); |
138 | 138 | ||
139 | #define REVISIT_24XX() printk(KERN_ERR "FIXME: no %s on 24xx\n", \ | 139 | #define REVISIT_24XX() printk(KERN_ERR "FIXME: no %s on 24xx\n", \ |
140 | __FUNCTION__); | 140 | __func__); |
141 | 141 | ||
142 | #ifdef CONFIG_ARCH_OMAP15XX | 142 | #ifdef CONFIG_ARCH_OMAP15XX |
143 | /* Returns 1 if the DMA module is in OMAP1510-compatible mode, 0 otherwise */ | 143 | /* Returns 1 if the DMA module is in OMAP1510-compatible mode, 0 otherwise */ |
@@ -699,7 +699,7 @@ omap_dma_set_global_params(int arb_rate, int max_fifo_depth, int tparams) | |||
699 | u32 reg; | 699 | u32 reg; |
700 | 700 | ||
701 | if (!cpu_class_is_omap2()) { | 701 | if (!cpu_class_is_omap2()) { |
702 | printk(KERN_ERR "FIXME: no %s on 15xx/16xx\n", __FUNCTION__); | 702 | printk(KERN_ERR "FIXME: no %s on 15xx/16xx\n", __func__); |
703 | return; | 703 | return; |
704 | } | 704 | } |
705 | 705 | ||
@@ -1705,14 +1705,8 @@ static int omap2_dma_handle_ch(int ch) | |||
1705 | status = OMAP_DMA_CSR_REG(ch); | 1705 | status = OMAP_DMA_CSR_REG(ch); |
1706 | } | 1706 | } |
1707 | 1707 | ||
1708 | if (likely(dma_chan[ch].callback != NULL)) { | 1708 | if (likely(dma_chan[ch].callback != NULL)) |
1709 | if (dma_chan[ch].chain_id != -1) | 1709 | dma_chan[ch].callback(ch, status, dma_chan[ch].data); |
1710 | dma_chan[ch].callback(dma_chan[ch].chain_id, status, | ||
1711 | dma_chan[ch].data); | ||
1712 | else | ||
1713 | dma_chan[ch].callback(ch, status, dma_chan[ch].data); | ||
1714 | |||
1715 | } | ||
1716 | 1710 | ||
1717 | OMAP_DMA_CSR_REG(ch) = status; | 1711 | OMAP_DMA_CSR_REG(ch) = status; |
1718 | 1712 | ||
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index e719d0eeb5c8..302ad8dff2cb 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
@@ -268,7 +268,7 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id) | |||
268 | if (id <= 0 || id > dm_timer_count || dm_timers[id-1].reserved) { | 268 | if (id <= 0 || id > dm_timer_count || dm_timers[id-1].reserved) { |
269 | spin_unlock_irqrestore(&dm_timer_lock, flags); | 269 | spin_unlock_irqrestore(&dm_timer_lock, flags); |
270 | printk("BUG: warning at %s:%d/%s(): unable to get timer %d\n", | 270 | printk("BUG: warning at %s:%d/%s(): unable to get timer %d\n", |
271 | __FILE__, __LINE__, __FUNCTION__, id); | 271 | __FILE__, __LINE__, __func__, id); |
272 | dump_stack(); | 272 | dump_stack(); |
273 | return NULL; | 273 | return NULL; |
274 | } | 274 | } |
diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c index 56f4d1394d56..66a1455595f4 100644 --- a/arch/arm/plat-omap/gpio.c +++ b/arch/arm/plat-omap/gpio.c | |||
@@ -333,13 +333,14 @@ static void _set_gpio_direction(struct gpio_bank *bank, int gpio, int is_input) | |||
333 | void omap_set_gpio_direction(int gpio, int is_input) | 333 | void omap_set_gpio_direction(int gpio, int is_input) |
334 | { | 334 | { |
335 | struct gpio_bank *bank; | 335 | struct gpio_bank *bank; |
336 | unsigned long flags; | ||
336 | 337 | ||
337 | if (check_gpio(gpio) < 0) | 338 | if (check_gpio(gpio) < 0) |
338 | return; | 339 | return; |
339 | bank = get_gpio_bank(gpio); | 340 | bank = get_gpio_bank(gpio); |
340 | spin_lock(&bank->lock); | 341 | spin_lock_irqsave(&bank->lock, flags); |
341 | _set_gpio_direction(bank, get_gpio_index(gpio), is_input); | 342 | _set_gpio_direction(bank, get_gpio_index(gpio), is_input); |
342 | spin_unlock(&bank->lock); | 343 | spin_unlock_irqrestore(&bank->lock, flags); |
343 | } | 344 | } |
344 | 345 | ||
345 | static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) | 346 | static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) |
@@ -406,13 +407,14 @@ static void _set_gpio_dataout(struct gpio_bank *bank, int gpio, int enable) | |||
406 | void omap_set_gpio_dataout(int gpio, int enable) | 407 | void omap_set_gpio_dataout(int gpio, int enable) |
407 | { | 408 | { |
408 | struct gpio_bank *bank; | 409 | struct gpio_bank *bank; |
410 | unsigned long flags; | ||
409 | 411 | ||
410 | if (check_gpio(gpio) < 0) | 412 | if (check_gpio(gpio) < 0) |
411 | return; | 413 | return; |
412 | bank = get_gpio_bank(gpio); | 414 | bank = get_gpio_bank(gpio); |
413 | spin_lock(&bank->lock); | 415 | spin_lock_irqsave(&bank->lock, flags); |
414 | _set_gpio_dataout(bank, get_gpio_index(gpio), enable); | 416 | _set_gpio_dataout(bank, get_gpio_index(gpio), enable); |
415 | spin_unlock(&bank->lock); | 417 | spin_unlock_irqrestore(&bank->lock, flags); |
416 | } | 418 | } |
417 | 419 | ||
418 | int omap_get_gpio_datain(int gpio) | 420 | int omap_get_gpio_datain(int gpio) |
@@ -624,6 +626,7 @@ static int gpio_irq_type(unsigned irq, unsigned type) | |||
624 | struct gpio_bank *bank; | 626 | struct gpio_bank *bank; |
625 | unsigned gpio; | 627 | unsigned gpio; |
626 | int retval; | 628 | int retval; |
629 | unsigned long flags; | ||
627 | 630 | ||
628 | if (!cpu_class_is_omap2() && irq > IH_MPUIO_BASE) | 631 | if (!cpu_class_is_omap2() && irq > IH_MPUIO_BASE) |
629 | gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE); | 632 | gpio = OMAP_MPUIO(irq - IH_MPUIO_BASE); |
@@ -642,13 +645,13 @@ static int gpio_irq_type(unsigned irq, unsigned type) | |||
642 | return -EINVAL; | 645 | return -EINVAL; |
643 | 646 | ||
644 | bank = get_irq_chip_data(irq); | 647 | bank = get_irq_chip_data(irq); |
645 | spin_lock(&bank->lock); | 648 | spin_lock_irqsave(&bank->lock, flags); |
646 | retval = _set_gpio_triggering(bank, get_gpio_index(gpio), type); | 649 | retval = _set_gpio_triggering(bank, get_gpio_index(gpio), type); |
647 | if (retval == 0) { | 650 | if (retval == 0) { |
648 | irq_desc[irq].status &= ~IRQ_TYPE_SENSE_MASK; | 651 | irq_desc[irq].status &= ~IRQ_TYPE_SENSE_MASK; |
649 | irq_desc[irq].status |= type; | 652 | irq_desc[irq].status |= type; |
650 | } | 653 | } |
651 | spin_unlock(&bank->lock); | 654 | spin_unlock_irqrestore(&bank->lock, flags); |
652 | return retval; | 655 | return retval; |
653 | } | 656 | } |
654 | 657 | ||
@@ -830,11 +833,13 @@ static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int ena | |||
830 | */ | 833 | */ |
831 | static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | 834 | static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) |
832 | { | 835 | { |
836 | unsigned long flags; | ||
837 | |||
833 | switch (bank->method) { | 838 | switch (bank->method) { |
834 | #ifdef CONFIG_ARCH_OMAP16XX | 839 | #ifdef CONFIG_ARCH_OMAP16XX |
835 | case METHOD_MPUIO: | 840 | case METHOD_MPUIO: |
836 | case METHOD_GPIO_1610: | 841 | case METHOD_GPIO_1610: |
837 | spin_lock(&bank->lock); | 842 | spin_lock_irqsave(&bank->lock, flags); |
838 | if (enable) { | 843 | if (enable) { |
839 | bank->suspend_wakeup |= (1 << gpio); | 844 | bank->suspend_wakeup |= (1 << gpio); |
840 | enable_irq_wake(bank->irq); | 845 | enable_irq_wake(bank->irq); |
@@ -842,7 +847,7 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | |||
842 | disable_irq_wake(bank->irq); | 847 | disable_irq_wake(bank->irq); |
843 | bank->suspend_wakeup &= ~(1 << gpio); | 848 | bank->suspend_wakeup &= ~(1 << gpio); |
844 | } | 849 | } |
845 | spin_unlock(&bank->lock); | 850 | spin_unlock_irqrestore(&bank->lock, flags); |
846 | return 0; | 851 | return 0; |
847 | #endif | 852 | #endif |
848 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) | 853 | #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) |
@@ -853,7 +858,7 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | |||
853 | (bank - gpio_bank) * 32 + gpio); | 858 | (bank - gpio_bank) * 32 + gpio); |
854 | return -EINVAL; | 859 | return -EINVAL; |
855 | } | 860 | } |
856 | spin_lock(&bank->lock); | 861 | spin_lock_irqsave(&bank->lock, flags); |
857 | if (enable) { | 862 | if (enable) { |
858 | bank->suspend_wakeup |= (1 << gpio); | 863 | bank->suspend_wakeup |= (1 << gpio); |
859 | enable_irq_wake(bank->irq); | 864 | enable_irq_wake(bank->irq); |
@@ -861,7 +866,7 @@ static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) | |||
861 | disable_irq_wake(bank->irq); | 866 | disable_irq_wake(bank->irq); |
862 | bank->suspend_wakeup &= ~(1 << gpio); | 867 | bank->suspend_wakeup &= ~(1 << gpio); |
863 | } | 868 | } |
864 | spin_unlock(&bank->lock); | 869 | spin_unlock_irqrestore(&bank->lock, flags); |
865 | return 0; | 870 | return 0; |
866 | #endif | 871 | #endif |
867 | default: | 872 | default: |
@@ -897,16 +902,17 @@ static int gpio_wake_enable(unsigned int irq, unsigned int enable) | |||
897 | int omap_request_gpio(int gpio) | 902 | int omap_request_gpio(int gpio) |
898 | { | 903 | { |
899 | struct gpio_bank *bank; | 904 | struct gpio_bank *bank; |
905 | unsigned long flags; | ||
900 | 906 | ||
901 | if (check_gpio(gpio) < 0) | 907 | if (check_gpio(gpio) < 0) |
902 | return -EINVAL; | 908 | return -EINVAL; |
903 | 909 | ||
904 | bank = get_gpio_bank(gpio); | 910 | bank = get_gpio_bank(gpio); |
905 | spin_lock(&bank->lock); | 911 | spin_lock_irqsave(&bank->lock, flags); |
906 | if (unlikely(bank->reserved_map & (1 << get_gpio_index(gpio)))) { | 912 | if (unlikely(bank->reserved_map & (1 << get_gpio_index(gpio)))) { |
907 | printk(KERN_ERR "omap-gpio: GPIO %d is already reserved!\n", gpio); | 913 | printk(KERN_ERR "omap-gpio: GPIO %d is already reserved!\n", gpio); |
908 | dump_stack(); | 914 | dump_stack(); |
909 | spin_unlock(&bank->lock); | 915 | spin_unlock_irqrestore(&bank->lock, flags); |
910 | return -1; | 916 | return -1; |
911 | } | 917 | } |
912 | bank->reserved_map |= (1 << get_gpio_index(gpio)); | 918 | bank->reserved_map |= (1 << get_gpio_index(gpio)); |
@@ -925,7 +931,7 @@ int omap_request_gpio(int gpio) | |||
925 | __raw_writel(__raw_readl(reg) | (1 << get_gpio_index(gpio)), reg); | 931 | __raw_writel(__raw_readl(reg) | (1 << get_gpio_index(gpio)), reg); |
926 | } | 932 | } |
927 | #endif | 933 | #endif |
928 | spin_unlock(&bank->lock); | 934 | spin_unlock_irqrestore(&bank->lock, flags); |
929 | 935 | ||
930 | return 0; | 936 | return 0; |
931 | } | 937 | } |
@@ -933,15 +939,16 @@ int omap_request_gpio(int gpio) | |||
933 | void omap_free_gpio(int gpio) | 939 | void omap_free_gpio(int gpio) |
934 | { | 940 | { |
935 | struct gpio_bank *bank; | 941 | struct gpio_bank *bank; |
942 | unsigned long flags; | ||
936 | 943 | ||
937 | if (check_gpio(gpio) < 0) | 944 | if (check_gpio(gpio) < 0) |
938 | return; | 945 | return; |
939 | bank = get_gpio_bank(gpio); | 946 | bank = get_gpio_bank(gpio); |
940 | spin_lock(&bank->lock); | 947 | spin_lock_irqsave(&bank->lock, flags); |
941 | if (unlikely(!(bank->reserved_map & (1 << get_gpio_index(gpio))))) { | 948 | if (unlikely(!(bank->reserved_map & (1 << get_gpio_index(gpio))))) { |
942 | printk(KERN_ERR "omap-gpio: GPIO %d wasn't reserved!\n", gpio); | 949 | printk(KERN_ERR "omap-gpio: GPIO %d wasn't reserved!\n", gpio); |
943 | dump_stack(); | 950 | dump_stack(); |
944 | spin_unlock(&bank->lock); | 951 | spin_unlock_irqrestore(&bank->lock, flags); |
945 | return; | 952 | return; |
946 | } | 953 | } |
947 | #ifdef CONFIG_ARCH_OMAP16XX | 954 | #ifdef CONFIG_ARCH_OMAP16XX |
@@ -960,7 +967,7 @@ void omap_free_gpio(int gpio) | |||
960 | #endif | 967 | #endif |
961 | bank->reserved_map &= ~(1 << get_gpio_index(gpio)); | 968 | bank->reserved_map &= ~(1 << get_gpio_index(gpio)); |
962 | _reset_gpio(bank, gpio); | 969 | _reset_gpio(bank, gpio); |
963 | spin_unlock(&bank->lock); | 970 | spin_unlock_irqrestore(&bank->lock, flags); |
964 | } | 971 | } |
965 | 972 | ||
966 | /* | 973 | /* |
@@ -1194,11 +1201,12 @@ static int omap_mpuio_suspend_late(struct platform_device *pdev, pm_message_t me | |||
1194 | { | 1201 | { |
1195 | struct gpio_bank *bank = platform_get_drvdata(pdev); | 1202 | struct gpio_bank *bank = platform_get_drvdata(pdev); |
1196 | void __iomem *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; | 1203 | void __iomem *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; |
1204 | unsigned long flags; | ||
1197 | 1205 | ||
1198 | spin_lock(&bank->lock); | 1206 | spin_lock_irqsave(&bank->lock, flags); |
1199 | bank->saved_wakeup = __raw_readl(mask_reg); | 1207 | bank->saved_wakeup = __raw_readl(mask_reg); |
1200 | __raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg); | 1208 | __raw_writel(0xffff & ~bank->suspend_wakeup, mask_reg); |
1201 | spin_unlock(&bank->lock); | 1209 | spin_unlock_irqrestore(&bank->lock, flags); |
1202 | 1210 | ||
1203 | return 0; | 1211 | return 0; |
1204 | } | 1212 | } |
@@ -1207,10 +1215,11 @@ static int omap_mpuio_resume_early(struct platform_device *pdev) | |||
1207 | { | 1215 | { |
1208 | struct gpio_bank *bank = platform_get_drvdata(pdev); | 1216 | struct gpio_bank *bank = platform_get_drvdata(pdev); |
1209 | void __iomem *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; | 1217 | void __iomem *mask_reg = bank->base + OMAP_MPUIO_GPIO_MASKIT; |
1218 | unsigned long flags; | ||
1210 | 1219 | ||
1211 | spin_lock(&bank->lock); | 1220 | spin_lock_irqsave(&bank->lock, flags); |
1212 | __raw_writel(bank->saved_wakeup, mask_reg); | 1221 | __raw_writel(bank->saved_wakeup, mask_reg); |
1213 | spin_unlock(&bank->lock); | 1222 | spin_unlock_irqrestore(&bank->lock, flags); |
1214 | 1223 | ||
1215 | return 0; | 1224 | return 0; |
1216 | } | 1225 | } |
@@ -1277,6 +1286,11 @@ static struct clk *gpio_fclks[OMAP34XX_NR_GPIOS]; | |||
1277 | static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; | 1286 | static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS]; |
1278 | #endif | 1287 | #endif |
1279 | 1288 | ||
1289 | /* This lock class tells lockdep that GPIO irqs are in a different | ||
1290 | * category than their parents, so it won't report false recursion. | ||
1291 | */ | ||
1292 | static struct lock_class_key gpio_lock_class; | ||
1293 | |||
1280 | static int __init _omap_gpio_init(void) | 1294 | static int __init _omap_gpio_init(void) |
1281 | { | 1295 | { |
1282 | int i; | 1296 | int i; |
@@ -1450,6 +1464,7 @@ static int __init _omap_gpio_init(void) | |||
1450 | #endif | 1464 | #endif |
1451 | for (j = bank->virtual_irq_start; | 1465 | for (j = bank->virtual_irq_start; |
1452 | j < bank->virtual_irq_start + gpio_count; j++) { | 1466 | j < bank->virtual_irq_start + gpio_count; j++) { |
1467 | lockdep_set_class(&irq_desc[j].lock, &gpio_lock_class); | ||
1453 | set_irq_chip_data(j, bank); | 1468 | set_irq_chip_data(j, bank); |
1454 | if (bank_is_mpuio(bank)) | 1469 | if (bank_is_mpuio(bank)) |
1455 | set_irq_chip(j, &mpuio_irq_chip); | 1470 | set_irq_chip(j, &mpuio_irq_chip); |
@@ -1489,6 +1504,7 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) | |||
1489 | void __iomem *wake_status; | 1504 | void __iomem *wake_status; |
1490 | void __iomem *wake_clear; | 1505 | void __iomem *wake_clear; |
1491 | void __iomem *wake_set; | 1506 | void __iomem *wake_set; |
1507 | unsigned long flags; | ||
1492 | 1508 | ||
1493 | switch (bank->method) { | 1509 | switch (bank->method) { |
1494 | #ifdef CONFIG_ARCH_OMAP16XX | 1510 | #ifdef CONFIG_ARCH_OMAP16XX |
@@ -1509,11 +1525,11 @@ static int omap_gpio_suspend(struct sys_device *dev, pm_message_t mesg) | |||
1509 | continue; | 1525 | continue; |
1510 | } | 1526 | } |
1511 | 1527 | ||
1512 | spin_lock(&bank->lock); | 1528 | spin_lock_irqsave(&bank->lock, flags); |
1513 | bank->saved_wakeup = __raw_readl(wake_status); | 1529 | bank->saved_wakeup = __raw_readl(wake_status); |
1514 | __raw_writel(0xffffffff, wake_clear); | 1530 | __raw_writel(0xffffffff, wake_clear); |
1515 | __raw_writel(bank->suspend_wakeup, wake_set); | 1531 | __raw_writel(bank->suspend_wakeup, wake_set); |
1516 | spin_unlock(&bank->lock); | 1532 | spin_unlock_irqrestore(&bank->lock, flags); |
1517 | } | 1533 | } |
1518 | 1534 | ||
1519 | return 0; | 1535 | return 0; |
@@ -1530,6 +1546,7 @@ static int omap_gpio_resume(struct sys_device *dev) | |||
1530 | struct gpio_bank *bank = &gpio_bank[i]; | 1546 | struct gpio_bank *bank = &gpio_bank[i]; |
1531 | void __iomem *wake_clear; | 1547 | void __iomem *wake_clear; |
1532 | void __iomem *wake_set; | 1548 | void __iomem *wake_set; |
1549 | unsigned long flags; | ||
1533 | 1550 | ||
1534 | switch (bank->method) { | 1551 | switch (bank->method) { |
1535 | #ifdef CONFIG_ARCH_OMAP16XX | 1552 | #ifdef CONFIG_ARCH_OMAP16XX |
@@ -1548,10 +1565,10 @@ static int omap_gpio_resume(struct sys_device *dev) | |||
1548 | continue; | 1565 | continue; |
1549 | } | 1566 | } |
1550 | 1567 | ||
1551 | spin_lock(&bank->lock); | 1568 | spin_lock_irqsave(&bank->lock, flags); |
1552 | __raw_writel(0xffffffff, wake_clear); | 1569 | __raw_writel(0xffffffff, wake_clear); |
1553 | __raw_writel(bank->saved_wakeup, wake_set); | 1570 | __raw_writel(bank->saved_wakeup, wake_set); |
1554 | spin_unlock(&bank->lock); | 1571 | spin_unlock_irqrestore(&bank->lock, flags); |
1555 | } | 1572 | } |
1556 | 1573 | ||
1557 | return 0; | 1574 | return 0; |
diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index ac9ff1666fcc..60f162dc4fad 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c | |||
@@ -130,8 +130,8 @@ dmadbg_showregs(const char *fname, int line, struct s3c2410_dma_chan *chan) | |||
130 | dmadbg_dumpregs(fname, line, chan, &state); | 130 | dmadbg_dumpregs(fname, line, chan, &state); |
131 | } | 131 | } |
132 | 132 | ||
133 | #define dbg_showregs(chan) dmadbg_showregs(__FUNCTION__, __LINE__, (chan)) | 133 | #define dbg_showregs(chan) dmadbg_showregs(__func__, __LINE__, (chan)) |
134 | #define dbg_showchan(chan) dmadbg_showchan(__FUNCTION__, __LINE__, (chan)) | 134 | #define dbg_showchan(chan) dmadbg_showchan(__func__, __LINE__, (chan)) |
135 | #else | 135 | #else |
136 | #define dbg_showregs(chan) do { } while(0) | 136 | #define dbg_showregs(chan) do { } while(0) |
137 | #define dbg_showchan(chan) do { } while(0) | 137 | #define dbg_showchan(chan) do { } while(0) |
@@ -403,7 +403,7 @@ static int s3c2410_dma_start(struct s3c2410_dma_chan *chan) | |||
403 | 403 | ||
404 | if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { | 404 | if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { |
405 | pr_debug("%s: buff not yet loaded, no more todo\n", | 405 | pr_debug("%s: buff not yet loaded, no more todo\n", |
406 | __FUNCTION__); | 406 | __func__); |
407 | } else { | 407 | } else { |
408 | chan->load_state = S3C2410_DMALOAD_1RUNNING; | 408 | chan->load_state = S3C2410_DMALOAD_1RUNNING; |
409 | s3c2410_dma_loadbuffer(chan, chan->next); | 409 | s3c2410_dma_loadbuffer(chan, chan->next); |
@@ -463,16 +463,16 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id, | |||
463 | return -EINVAL; | 463 | return -EINVAL; |
464 | 464 | ||
465 | pr_debug("%s: id=%p, data=%08x, size=%d\n", | 465 | pr_debug("%s: id=%p, data=%08x, size=%d\n", |
466 | __FUNCTION__, id, (unsigned int)data, size); | 466 | __func__, id, (unsigned int)data, size); |
467 | 467 | ||
468 | buf = kmem_cache_alloc(dma_kmem, GFP_ATOMIC); | 468 | buf = kmem_cache_alloc(dma_kmem, GFP_ATOMIC); |
469 | if (buf == NULL) { | 469 | if (buf == NULL) { |
470 | pr_debug("%s: out of memory (%ld alloc)\n", | 470 | pr_debug("%s: out of memory (%ld alloc)\n", |
471 | __FUNCTION__, (long)sizeof(*buf)); | 471 | __func__, (long)sizeof(*buf)); |
472 | return -ENOMEM; | 472 | return -ENOMEM; |
473 | } | 473 | } |
474 | 474 | ||
475 | //pr_debug("%s: new buffer %p\n", __FUNCTION__, buf); | 475 | //pr_debug("%s: new buffer %p\n", __func__, buf); |
476 | //dbg_showchan(chan); | 476 | //dbg_showchan(chan); |
477 | 477 | ||
478 | buf->next = NULL; | 478 | buf->next = NULL; |
@@ -486,18 +486,18 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id, | |||
486 | if (chan->curr == NULL) { | 486 | if (chan->curr == NULL) { |
487 | /* we've got nothing loaded... */ | 487 | /* we've got nothing loaded... */ |
488 | pr_debug("%s: buffer %p queued onto empty channel\n", | 488 | pr_debug("%s: buffer %p queued onto empty channel\n", |
489 | __FUNCTION__, buf); | 489 | __func__, buf); |
490 | 490 | ||
491 | chan->curr = buf; | 491 | chan->curr = buf; |
492 | chan->end = buf; | 492 | chan->end = buf; |
493 | chan->next = NULL; | 493 | chan->next = NULL; |
494 | } else { | 494 | } else { |
495 | pr_debug("dma%d: %s: buffer %p queued onto non-empty channel\n", | 495 | pr_debug("dma%d: %s: buffer %p queued onto non-empty channel\n", |
496 | chan->number, __FUNCTION__, buf); | 496 | chan->number, __func__, buf); |
497 | 497 | ||
498 | if (chan->end == NULL) | 498 | if (chan->end == NULL) |
499 | pr_debug("dma%d: %s: %p not empty, and chan->end==NULL?\n", | 499 | pr_debug("dma%d: %s: %p not empty, and chan->end==NULL?\n", |
500 | chan->number, __FUNCTION__, chan); | 500 | chan->number, __func__, chan); |
501 | 501 | ||
502 | chan->end->next = buf; | 502 | chan->end->next = buf; |
503 | chan->end = buf; | 503 | chan->end = buf; |
@@ -572,7 +572,7 @@ s3c2410_dma_lastxfer(struct s3c2410_dma_chan *chan) | |||
572 | if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { | 572 | if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { |
573 | /* flag error? */ | 573 | /* flag error? */ |
574 | printk(KERN_ERR "dma%d: timeout waiting for load (%s)\n", | 574 | printk(KERN_ERR "dma%d: timeout waiting for load (%s)\n", |
575 | chan->number, __FUNCTION__); | 575 | chan->number, __func__); |
576 | return; | 576 | return; |
577 | } | 577 | } |
578 | break; | 578 | break; |
@@ -658,7 +658,7 @@ s3c2410_dma_irq(int irq, void *devpw) | |||
658 | 658 | ||
659 | if (buf->magic != BUF_MAGIC) { | 659 | if (buf->magic != BUF_MAGIC) { |
660 | printk(KERN_ERR "dma%d: %s: buf %p incorrect magic\n", | 660 | printk(KERN_ERR "dma%d: %s: buf %p incorrect magic\n", |
661 | chan->number, __FUNCTION__, buf); | 661 | chan->number, __func__, buf); |
662 | return IRQ_HANDLED; | 662 | return IRQ_HANDLED; |
663 | } | 663 | } |
664 | 664 | ||
@@ -692,7 +692,7 @@ s3c2410_dma_irq(int irq, void *devpw) | |||
692 | if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { | 692 | if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { |
693 | /* flag error? */ | 693 | /* flag error? */ |
694 | printk(KERN_ERR "dma%d: timeout waiting for load (%s)\n", | 694 | printk(KERN_ERR "dma%d: timeout waiting for load (%s)\n", |
695 | chan->number, __FUNCTION__); | 695 | chan->number, __func__); |
696 | return IRQ_HANDLED; | 696 | return IRQ_HANDLED; |
697 | } | 697 | } |
698 | 698 | ||
@@ -759,7 +759,7 @@ int s3c2410_dma_request(unsigned int channel, | |||
759 | 759 | ||
760 | if (!chan->irq_claimed) { | 760 | if (!chan->irq_claimed) { |
761 | pr_debug("dma%d: %s : requesting irq %d\n", | 761 | pr_debug("dma%d: %s : requesting irq %d\n", |
762 | channel, __FUNCTION__, chan->irq); | 762 | channel, __func__, chan->irq); |
763 | 763 | ||
764 | chan->irq_claimed = 1; | 764 | chan->irq_claimed = 1; |
765 | local_irq_restore(flags); | 765 | local_irq_restore(flags); |
@@ -786,7 +786,7 @@ int s3c2410_dma_request(unsigned int channel, | |||
786 | 786 | ||
787 | /* need to setup */ | 787 | /* need to setup */ |
788 | 788 | ||
789 | pr_debug("%s: channel initialised, %p\n", __FUNCTION__, chan); | 789 | pr_debug("%s: channel initialised, %p\n", __func__, chan); |
790 | 790 | ||
791 | return chan->number | DMACH_LOW_LEVEL; | 791 | return chan->number | DMACH_LOW_LEVEL; |
792 | } | 792 | } |
@@ -823,7 +823,7 @@ int s3c2410_dma_free(dmach_t channel, struct s3c2410_dma_client *client) | |||
823 | 823 | ||
824 | if (chan->state != S3C2410_DMA_IDLE) { | 824 | if (chan->state != S3C2410_DMA_IDLE) { |
825 | pr_debug("%s: need to stop dma channel %p\n", | 825 | pr_debug("%s: need to stop dma channel %p\n", |
826 | __FUNCTION__, chan); | 826 | __func__, chan); |
827 | 827 | ||
828 | /* possibly flush the channel */ | 828 | /* possibly flush the channel */ |
829 | s3c2410_dma_ctrl(channel, S3C2410_DMAOP_STOP); | 829 | s3c2410_dma_ctrl(channel, S3C2410_DMAOP_STOP); |
@@ -852,7 +852,7 @@ static int s3c2410_dma_dostop(struct s3c2410_dma_chan *chan) | |||
852 | unsigned long flags; | 852 | unsigned long flags; |
853 | unsigned long tmp; | 853 | unsigned long tmp; |
854 | 854 | ||
855 | pr_debug("%s:\n", __FUNCTION__); | 855 | pr_debug("%s:\n", __func__); |
856 | 856 | ||
857 | dbg_showchan(chan); | 857 | dbg_showchan(chan); |
858 | 858 | ||
@@ -907,14 +907,14 @@ static int s3c2410_dma_flush(struct s3c2410_dma_chan *chan) | |||
907 | struct s3c2410_dma_buf *buf, *next; | 907 | struct s3c2410_dma_buf *buf, *next; |
908 | unsigned long flags; | 908 | unsigned long flags; |
909 | 909 | ||
910 | pr_debug("%s: chan %p (%d)\n", __FUNCTION__, chan, chan->number); | 910 | pr_debug("%s: chan %p (%d)\n", __func__, chan, chan->number); |
911 | 911 | ||
912 | dbg_showchan(chan); | 912 | dbg_showchan(chan); |
913 | 913 | ||
914 | local_irq_save(flags); | 914 | local_irq_save(flags); |
915 | 915 | ||
916 | if (chan->state != S3C2410_DMA_IDLE) { | 916 | if (chan->state != S3C2410_DMA_IDLE) { |
917 | pr_debug("%s: stopping channel...\n", __FUNCTION__ ); | 917 | pr_debug("%s: stopping channel...\n", __func__ ); |
918 | s3c2410_dma_ctrl(chan->number, S3C2410_DMAOP_STOP); | 918 | s3c2410_dma_ctrl(chan->number, S3C2410_DMAOP_STOP); |
919 | } | 919 | } |
920 | 920 | ||
@@ -929,7 +929,7 @@ static int s3c2410_dma_flush(struct s3c2410_dma_chan *chan) | |||
929 | next = buf->next; | 929 | next = buf->next; |
930 | 930 | ||
931 | pr_debug("%s: free buffer %p, next %p\n", | 931 | pr_debug("%s: free buffer %p, next %p\n", |
932 | __FUNCTION__, buf, buf->next); | 932 | __func__, buf, buf->next); |
933 | 933 | ||
934 | s3c2410_dma_buffdone(chan, buf, S3C2410_RES_ABORT); | 934 | s3c2410_dma_buffdone(chan, buf, S3C2410_RES_ABORT); |
935 | s3c2410_dma_freebuf(buf); | 935 | s3c2410_dma_freebuf(buf); |
@@ -976,7 +976,7 @@ static int s3c2410_dma_started(struct s3c2410_dma_chan *chan) | |||
976 | 976 | ||
977 | if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { | 977 | if (s3c2410_dma_waitforload(chan, __LINE__) == 0) { |
978 | pr_debug("%s: buff not yet loaded, no more todo\n", | 978 | pr_debug("%s: buff not yet loaded, no more todo\n", |
979 | __FUNCTION__); | 979 | __func__); |
980 | } else { | 980 | } else { |
981 | chan->load_state = S3C2410_DMALOAD_1RUNNING; | 981 | chan->load_state = S3C2410_DMALOAD_1RUNNING; |
982 | s3c2410_dma_loadbuffer(chan, chan->next); | 982 | s3c2410_dma_loadbuffer(chan, chan->next); |
@@ -1050,16 +1050,16 @@ int s3c2410_dma_config(dmach_t channel, | |||
1050 | struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); | 1050 | struct s3c2410_dma_chan *chan = lookup_dma_channel(channel); |
1051 | 1051 | ||
1052 | pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n", | 1052 | pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n", |
1053 | __FUNCTION__, channel, xferunit, dcon); | 1053 | __func__, channel, xferunit, dcon); |
1054 | 1054 | ||
1055 | if (chan == NULL) | 1055 | if (chan == NULL) |
1056 | return -EINVAL; | 1056 | return -EINVAL; |
1057 | 1057 | ||
1058 | pr_debug("%s: Initial dcon is %08x\n", __FUNCTION__, dcon); | 1058 | pr_debug("%s: Initial dcon is %08x\n", __func__, dcon); |
1059 | 1059 | ||
1060 | dcon |= chan->dcon & dma_sel.dcon_mask; | 1060 | dcon |= chan->dcon & dma_sel.dcon_mask; |
1061 | 1061 | ||
1062 | pr_debug("%s: New dcon is %08x\n", __FUNCTION__, dcon); | 1062 | pr_debug("%s: New dcon is %08x\n", __func__, dcon); |
1063 | 1063 | ||
1064 | switch (xferunit) { | 1064 | switch (xferunit) { |
1065 | case 1: | 1065 | case 1: |
@@ -1075,14 +1075,14 @@ int s3c2410_dma_config(dmach_t channel, | |||
1075 | break; | 1075 | break; |
1076 | 1076 | ||
1077 | default: | 1077 | default: |
1078 | pr_debug("%s: bad transfer size %d\n", __FUNCTION__, xferunit); | 1078 | pr_debug("%s: bad transfer size %d\n", __func__, xferunit); |
1079 | return -EINVAL; | 1079 | return -EINVAL; |
1080 | } | 1080 | } |
1081 | 1081 | ||
1082 | dcon |= S3C2410_DCON_HWTRIG; | 1082 | dcon |= S3C2410_DCON_HWTRIG; |
1083 | dcon |= S3C2410_DCON_INTREQ; | 1083 | dcon |= S3C2410_DCON_INTREQ; |
1084 | 1084 | ||
1085 | pr_debug("%s: dcon now %08x\n", __FUNCTION__, dcon); | 1085 | pr_debug("%s: dcon now %08x\n", __func__, dcon); |
1086 | 1086 | ||
1087 | chan->dcon = dcon; | 1087 | chan->dcon = dcon; |
1088 | chan->xfer_unit = xferunit; | 1088 | chan->xfer_unit = xferunit; |
@@ -1099,7 +1099,7 @@ int s3c2410_dma_setflags(dmach_t channel, unsigned int flags) | |||
1099 | if (chan == NULL) | 1099 | if (chan == NULL) |
1100 | return -EINVAL; | 1100 | return -EINVAL; |
1101 | 1101 | ||
1102 | pr_debug("%s: chan=%p, flags=%08x\n", __FUNCTION__, chan, flags); | 1102 | pr_debug("%s: chan=%p, flags=%08x\n", __func__, chan, flags); |
1103 | 1103 | ||
1104 | chan->flags = flags; | 1104 | chan->flags = flags; |
1105 | 1105 | ||
@@ -1120,7 +1120,7 @@ int s3c2410_dma_set_opfn(dmach_t channel, s3c2410_dma_opfn_t rtn) | |||
1120 | if (chan == NULL) | 1120 | if (chan == NULL) |
1121 | return -EINVAL; | 1121 | return -EINVAL; |
1122 | 1122 | ||
1123 | pr_debug("%s: chan=%p, op rtn=%p\n", __FUNCTION__, chan, rtn); | 1123 | pr_debug("%s: chan=%p, op rtn=%p\n", __func__, chan, rtn); |
1124 | 1124 | ||
1125 | chan->op_fn = rtn; | 1125 | chan->op_fn = rtn; |
1126 | 1126 | ||
@@ -1136,7 +1136,7 @@ int s3c2410_dma_set_buffdone_fn(dmach_t channel, s3c2410_dma_cbfn_t rtn) | |||
1136 | if (chan == NULL) | 1136 | if (chan == NULL) |
1137 | return -EINVAL; | 1137 | return -EINVAL; |
1138 | 1138 | ||
1139 | pr_debug("%s: chan=%p, callback rtn=%p\n", __FUNCTION__, chan, rtn); | 1139 | pr_debug("%s: chan=%p, callback rtn=%p\n", __func__, chan, rtn); |
1140 | 1140 | ||
1141 | chan->callback_fn = rtn; | 1141 | chan->callback_fn = rtn; |
1142 | 1142 | ||
@@ -1170,7 +1170,7 @@ int s3c2410_dma_devconfig(int channel, | |||
1170 | return -EINVAL; | 1170 | return -EINVAL; |
1171 | 1171 | ||
1172 | pr_debug("%s: source=%d, hwcfg=%08x, devaddr=%08lx\n", | 1172 | pr_debug("%s: source=%d, hwcfg=%08x, devaddr=%08lx\n", |
1173 | __FUNCTION__, (int)source, hwcfg, devaddr); | 1173 | __func__, (int)source, hwcfg, devaddr); |
1174 | 1174 | ||
1175 | chan->source = source; | 1175 | chan->source = source; |
1176 | chan->dev_addr = devaddr; | 1176 | chan->dev_addr = devaddr; |
@@ -1180,7 +1180,7 @@ int s3c2410_dma_devconfig(int channel, | |||
1180 | case S3C2410_DMASRC_HW: | 1180 | case S3C2410_DMASRC_HW: |
1181 | /* source is hardware */ | 1181 | /* source is hardware */ |
1182 | pr_debug("%s: hw source, devaddr=%08lx, hwcfg=%d\n", | 1182 | pr_debug("%s: hw source, devaddr=%08lx, hwcfg=%d\n", |
1183 | __FUNCTION__, devaddr, hwcfg); | 1183 | __func__, devaddr, hwcfg); |
1184 | dma_wrreg(chan, S3C2410_DMA_DISRCC, hwcfg & 3); | 1184 | dma_wrreg(chan, S3C2410_DMA_DISRCC, hwcfg & 3); |
1185 | dma_wrreg(chan, S3C2410_DMA_DISRC, devaddr); | 1185 | dma_wrreg(chan, S3C2410_DMA_DISRC, devaddr); |
1186 | dma_wrreg(chan, S3C2410_DMA_DIDSTC, (0<<1) | (0<<0)); | 1186 | dma_wrreg(chan, S3C2410_DMA_DIDSTC, (0<<1) | (0<<0)); |
@@ -1190,8 +1190,8 @@ int s3c2410_dma_devconfig(int channel, | |||
1190 | 1190 | ||
1191 | case S3C2410_DMASRC_MEM: | 1191 | case S3C2410_DMASRC_MEM: |
1192 | /* source is memory */ | 1192 | /* source is memory */ |
1193 | pr_debug( "%s: mem source, devaddr=%08lx, hwcfg=%d\n", | 1193 | pr_debug("%s: mem source, devaddr=%08lx, hwcfg=%d\n", |
1194 | __FUNCTION__, devaddr, hwcfg); | 1194 | __func__, devaddr, hwcfg); |
1195 | dma_wrreg(chan, S3C2410_DMA_DISRCC, (0<<1) | (0<<0)); | 1195 | dma_wrreg(chan, S3C2410_DMA_DISRCC, (0<<1) | (0<<0)); |
1196 | dma_wrreg(chan, S3C2410_DMA_DIDST, devaddr); | 1196 | dma_wrreg(chan, S3C2410_DMA_DIDST, devaddr); |
1197 | dma_wrreg(chan, S3C2410_DMA_DIDSTC, hwcfg & 3); | 1197 | dma_wrreg(chan, S3C2410_DMA_DIDSTC, hwcfg & 3); |
diff --git a/arch/avr32/boards/atstk1000/atstk1004.c b/arch/avr32/boards/atstk1000/atstk1004.c index 5a77030e07a0..e765a8652b3e 100644 --- a/arch/avr32/boards/atstk1000/atstk1004.c +++ b/arch/avr32/boards/atstk1000/atstk1004.c | |||
@@ -129,7 +129,7 @@ static int __init atstk1004_init(void) | |||
129 | #ifdef CONFIG_BOARD_ATSTK100X_SPI1 | 129 | #ifdef CONFIG_BOARD_ATSTK100X_SPI1 |
130 | at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); | 130 | at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); |
131 | #endif | 131 | #endif |
132 | #ifndef CONFIG_BOARD_ATSTK1002_SW2_CUSTOM | 132 | #ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM |
133 | at32_add_device_mci(0); | 133 | at32_add_device_mci(0); |
134 | #endif | 134 | #endif |
135 | at32_add_device_lcdc(0, &atstk1000_lcdc_data, | 135 | at32_add_device_lcdc(0, &atstk1000_lcdc_data, |
diff --git a/arch/avr32/kernel/process.c b/arch/avr32/kernel/process.c index eaaa69bbdc38..7f4af0b1e111 100644 --- a/arch/avr32/kernel/process.c +++ b/arch/avr32/kernel/process.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/fs.h> | 11 | #include <linux/fs.h> |
12 | #include <linux/ptrace.h> | 12 | #include <linux/ptrace.h> |
13 | #include <linux/reboot.h> | 13 | #include <linux/reboot.h> |
14 | #include <linux/tick.h> | ||
14 | #include <linux/uaccess.h> | 15 | #include <linux/uaccess.h> |
15 | #include <linux/unistd.h> | 16 | #include <linux/unistd.h> |
16 | 17 | ||
@@ -30,8 +31,10 @@ void cpu_idle(void) | |||
30 | { | 31 | { |
31 | /* endless idle loop with no priority at all */ | 32 | /* endless idle loop with no priority at all */ |
32 | while (1) { | 33 | while (1) { |
34 | tick_nohz_stop_sched_tick(); | ||
33 | while (!need_resched()) | 35 | while (!need_resched()) |
34 | cpu_idle_sleep(); | 36 | cpu_idle_sleep(); |
37 | tick_nohz_restart_sched_tick(); | ||
35 | preempt_enable_no_resched(); | 38 | preempt_enable_no_resched(); |
36 | schedule(); | 39 | schedule(); |
37 | preempt_disable(); | 40 | preempt_disable(); |
@@ -345,6 +348,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | |||
345 | p->thread.cpu_context.ksp = (unsigned long)childregs; | 348 | p->thread.cpu_context.ksp = (unsigned long)childregs; |
346 | p->thread.cpu_context.pc = (unsigned long)ret_from_fork; | 349 | p->thread.cpu_context.pc = (unsigned long)ret_from_fork; |
347 | 350 | ||
351 | clear_tsk_thread_flag(p, TIF_DEBUG); | ||
348 | if ((clone_flags & CLONE_PTRACE) && test_thread_flag(TIF_DEBUG)) | 352 | if ((clone_flags & CLONE_PTRACE) && test_thread_flag(TIF_DEBUG)) |
349 | ocd_enable(p); | 353 | ocd_enable(p); |
350 | 354 | ||
diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c index 6560cb18b4e3..ce4e4296b954 100644 --- a/arch/avr32/mm/fault.c +++ b/arch/avr32/mm/fault.c | |||
@@ -189,6 +189,8 @@ no_context: | |||
189 | 189 | ||
190 | page = sysreg_read(PTBR); | 190 | page = sysreg_read(PTBR); |
191 | printk(KERN_ALERT "ptbr = %08lx", page); | 191 | printk(KERN_ALERT "ptbr = %08lx", page); |
192 | if (address >= TASK_SIZE) | ||
193 | page = (unsigned long)swapper_pg_dir; | ||
192 | if (page) { | 194 | if (page) { |
193 | page = ((unsigned long *)page)[address >> 22]; | 195 | page = ((unsigned long *)page)[address >> 22]; |
194 | printk(" pgd = %08lx", page); | 196 | printk(" pgd = %08lx", page); |
diff --git a/arch/blackfin/Makefile b/arch/blackfin/Makefile index fe254f886a6e..75eba2ca7881 100644 --- a/arch/blackfin/Makefile +++ b/arch/blackfin/Makefile | |||
@@ -98,8 +98,11 @@ drivers-$(CONFIG_OPROFILE) += arch/$(ARCH)/oprofile/ | |||
98 | # them changed. We use .mach to indicate when they were updated | 98 | # them changed. We use .mach to indicate when they were updated |
99 | # last, otherwise make uses the target directory mtime. | 99 | # last, otherwise make uses the target directory mtime. |
100 | 100 | ||
101 | show_mach_symlink = : | ||
102 | quiet_show_mach_symlink = echo ' SYMLINK include/asm-$(ARCH)/mach-$(MACHINE) -> include/asm-$(ARCH)/mach' | ||
103 | silent_show_mach_symlink = : | ||
101 | include/asm-blackfin/.mach: $(wildcard include/config/arch/*.h) include/config/auto.conf | 104 | include/asm-blackfin/.mach: $(wildcard include/config/arch/*.h) include/config/auto.conf |
102 | @echo ' SYMLINK include/asm-$(ARCH)/mach-$(MACHINE) -> include/asm-$(ARCH)/mach' | 105 | @$($(quiet)show_mach_symlink) |
103 | ifneq ($(KBUILD_SRC),) | 106 | ifneq ($(KBUILD_SRC),) |
104 | $(Q)mkdir -p include/asm-$(ARCH) | 107 | $(Q)mkdir -p include/asm-$(ARCH) |
105 | $(Q)ln -fsn $(srctree)/include/asm-$(ARCH)/mach-$(MACHINE) include/asm-$(ARCH)/mach | 108 | $(Q)ln -fsn $(srctree)/include/asm-$(ARCH)/mach-$(MACHINE) include/asm-$(ARCH)/mach |
diff --git a/arch/blackfin/configs/BF527-EZKIT_defconfig b/arch/blackfin/configs/BF527-EZKIT_defconfig index d59ee1530bd4..ae320dcfedef 100644 --- a/arch/blackfin/configs/BF527-EZKIT_defconfig +++ b/arch/blackfin/configs/BF527-EZKIT_defconfig | |||
@@ -1,7 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.22.14 | 3 | # Linux kernel version: 2.6.22.16 |
4 | # Thu Nov 29 17:32:47 2007 | ||
5 | # | 4 | # |
6 | # CONFIG_MMU is not set | 5 | # CONFIG_MMU is not set |
7 | # CONFIG_FPU is not set | 6 | # CONFIG_FPU is not set |
@@ -116,7 +115,10 @@ CONFIG_PREEMPT_VOLUNTARY=y | |||
116 | # Processor and Board Settings | 115 | # Processor and Board Settings |
117 | # | 116 | # |
118 | # CONFIG_BF522 is not set | 117 | # CONFIG_BF522 is not set |
118 | # CONFIG_BF523 is not set | ||
119 | # CONFIG_BF524 is not set | ||
119 | # CONFIG_BF525 is not set | 120 | # CONFIG_BF525 is not set |
121 | # CONFIG_BF526 is not set | ||
120 | CONFIG_BF527=y | 122 | CONFIG_BF527=y |
121 | # CONFIG_BF531 is not set | 123 | # CONFIG_BF531 is not set |
122 | # CONFIG_BF532 is not set | 124 | # CONFIG_BF532 is not set |
@@ -306,6 +308,7 @@ CONFIG_BFIN_DCACHE=y | |||
306 | # CONFIG_BFIN_WB is not set | 308 | # CONFIG_BFIN_WB is not set |
307 | CONFIG_BFIN_WT=y | 309 | CONFIG_BFIN_WT=y |
308 | CONFIG_L1_MAX_PIECE=16 | 310 | CONFIG_L1_MAX_PIECE=16 |
311 | # CONFIG_MPU is not set | ||
309 | 312 | ||
310 | # | 313 | # |
311 | # Asynchonous Memory Configuration | 314 | # Asynchonous Memory Configuration |
@@ -354,6 +357,7 @@ CONFIG_BINFMT_ZFLAT=y | |||
354 | # Power management options | 357 | # Power management options |
355 | # | 358 | # |
356 | # CONFIG_PM is not set | 359 | # CONFIG_PM is not set |
360 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | ||
357 | 361 | ||
358 | # | 362 | # |
359 | # Networking | 363 | # Networking |
@@ -496,7 +500,6 @@ CONFIG_MTD_CFI_I2=y | |||
496 | # CONFIG_MTD_CFI_INTELEXT is not set | 500 | # CONFIG_MTD_CFI_INTELEXT is not set |
497 | # CONFIG_MTD_CFI_AMDSTD is not set | 501 | # CONFIG_MTD_CFI_AMDSTD is not set |
498 | # CONFIG_MTD_CFI_STAA is not set | 502 | # CONFIG_MTD_CFI_STAA is not set |
499 | CONFIG_MTD_MW320D=m | ||
500 | CONFIG_MTD_RAM=y | 503 | CONFIG_MTD_RAM=y |
501 | CONFIG_MTD_ROM=m | 504 | CONFIG_MTD_ROM=m |
502 | # CONFIG_MTD_ABSENT is not set | 505 | # CONFIG_MTD_ABSENT is not set |
@@ -506,9 +509,6 @@ CONFIG_MTD_ROM=m | |||
506 | # | 509 | # |
507 | CONFIG_MTD_COMPLEX_MAPPINGS=y | 510 | CONFIG_MTD_COMPLEX_MAPPINGS=y |
508 | # CONFIG_MTD_PHYSMAP is not set | 511 | # CONFIG_MTD_PHYSMAP is not set |
509 | CONFIG_MTD_BF5xx=m | ||
510 | CONFIG_BFIN_FLASH_SIZE=0x400000 | ||
511 | CONFIG_EBIU_FLASH_BASE=0x20000000 | ||
512 | # CONFIG_MTD_UCLINUX is not set | 512 | # CONFIG_MTD_UCLINUX is not set |
513 | # CONFIG_MTD_PLATRAM is not set | 513 | # CONFIG_MTD_PLATRAM is not set |
514 | 514 | ||
@@ -684,7 +684,6 @@ CONFIG_INPUT_MISC=y | |||
684 | # CONFIG_INPUT_POWERMATE is not set | 684 | # CONFIG_INPUT_POWERMATE is not set |
685 | # CONFIG_INPUT_YEALINK is not set | 685 | # CONFIG_INPUT_YEALINK is not set |
686 | # CONFIG_INPUT_UINPUT is not set | 686 | # CONFIG_INPUT_UINPUT is not set |
687 | # CONFIG_BF53X_PFBUTTONS is not set | ||
688 | # CONFIG_TWI_KEYPAD is not set | 687 | # CONFIG_TWI_KEYPAD is not set |
689 | 688 | ||
690 | # | 689 | # |
@@ -702,12 +701,12 @@ CONFIG_INPUT_MISC=y | |||
702 | # CONFIG_BF5xx_PPIFCD is not set | 701 | # CONFIG_BF5xx_PPIFCD is not set |
703 | # CONFIG_BFIN_SIMPLE_TIMER is not set | 702 | # CONFIG_BFIN_SIMPLE_TIMER is not set |
704 | # CONFIG_BF5xx_PPI is not set | 703 | # CONFIG_BF5xx_PPI is not set |
704 | CONFIG_BFIN_OTP=y | ||
705 | # CONFIG_BFIN_OTP_WRITE_ENABLE is not set | ||
705 | # CONFIG_BFIN_SPORT is not set | 706 | # CONFIG_BFIN_SPORT is not set |
706 | # CONFIG_BFIN_TIMER_LATENCY is not set | 707 | # CONFIG_BFIN_TIMER_LATENCY is not set |
707 | # CONFIG_TWI_LCD is not set | 708 | # CONFIG_TWI_LCD is not set |
708 | # CONFIG_AD5304 is not set | 709 | # CONFIG_AD5304 is not set |
709 | # CONFIG_BF5xx_TEA5764 is not set | ||
710 | # CONFIG_BF5xx_FBDMA is not set | ||
711 | # CONFIG_VT is not set | 710 | # CONFIG_VT is not set |
712 | # CONFIG_SERIAL_NONSTANDARD is not set | 711 | # CONFIG_SERIAL_NONSTANDARD is not set |
713 | 712 | ||
@@ -772,7 +771,6 @@ CONFIG_I2C_CHARDEV=m | |||
772 | # | 771 | # |
773 | # I2C Hardware Bus support | 772 | # I2C Hardware Bus support |
774 | # | 773 | # |
775 | # CONFIG_I2C_BLACKFIN_GPIO is not set | ||
776 | CONFIG_I2C_BLACKFIN_TWI=m | 774 | CONFIG_I2C_BLACKFIN_TWI=m |
777 | CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=50 | 775 | CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=50 |
778 | # CONFIG_I2C_GPIO is not set | 776 | # CONFIG_I2C_GPIO is not set |
diff --git a/arch/blackfin/configs/BF533-EZKIT_defconfig b/arch/blackfin/configs/BF533-EZKIT_defconfig index 811711f59a25..9621caa60b5f 100644 --- a/arch/blackfin/configs/BF533-EZKIT_defconfig +++ b/arch/blackfin/configs/BF533-EZKIT_defconfig | |||
@@ -322,10 +322,9 @@ CONFIG_PM=y | |||
322 | # CONFIG_PM_LEGACY is not set | 322 | # CONFIG_PM_LEGACY is not set |
323 | # CONFIG_PM_DEBUG is not set | 323 | # CONFIG_PM_DEBUG is not set |
324 | # CONFIG_PM_SYSFS_DEPRECATED is not set | 324 | # CONFIG_PM_SYSFS_DEPRECATED is not set |
325 | CONFIG_PM_WAKEUP_GPIO_BY_SIC_IWR=y | 325 | CONFIG_PM_BFIN_SLEEP_DEEPER=y |
326 | # CONFIG_PM_BFIN_SLEEP is not set | ||
326 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | 327 | # CONFIG_PM_WAKEUP_BY_GPIO is not set |
327 | # CONFIG_PM_WAKEUP_GPIO_API is not set | ||
328 | CONFIG_PM_WAKEUP_SIC_IWR=0x80 | ||
329 | 328 | ||
330 | # | 329 | # |
331 | # CPU Frequency scaling | 330 | # CPU Frequency scaling |
@@ -697,7 +696,6 @@ CONFIG_SERIAL_BFIN_DMA=y | |||
697 | # CONFIG_SERIAL_BFIN_PIO is not set | 696 | # CONFIG_SERIAL_BFIN_PIO is not set |
698 | CONFIG_SERIAL_BFIN_UART0=y | 697 | CONFIG_SERIAL_BFIN_UART0=y |
699 | # CONFIG_BFIN_UART0_CTSRTS is not set | 698 | # CONFIG_BFIN_UART0_CTSRTS is not set |
700 | # CONFIG_SERIAL_BFIN_UART1 is not set | ||
701 | CONFIG_SERIAL_CORE=y | 699 | CONFIG_SERIAL_CORE=y |
702 | CONFIG_SERIAL_CORE_CONSOLE=y | 700 | CONFIG_SERIAL_CORE_CONSOLE=y |
703 | # CONFIG_SERIAL_BFIN_SPORT is not set | 701 | # CONFIG_SERIAL_BFIN_SPORT is not set |
diff --git a/arch/blackfin/configs/BF533-STAMP_defconfig b/arch/blackfin/configs/BF533-STAMP_defconfig index 198f4123af4b..b51e76ce7f4f 100644 --- a/arch/blackfin/configs/BF533-STAMP_defconfig +++ b/arch/blackfin/configs/BF533-STAMP_defconfig | |||
@@ -323,10 +323,9 @@ CONFIG_PM=y | |||
323 | # CONFIG_PM_LEGACY is not set | 323 | # CONFIG_PM_LEGACY is not set |
324 | # CONFIG_PM_DEBUG is not set | 324 | # CONFIG_PM_DEBUG is not set |
325 | # CONFIG_PM_SYSFS_DEPRECATED is not set | 325 | # CONFIG_PM_SYSFS_DEPRECATED is not set |
326 | CONFIG_PM_WAKEUP_GPIO_BY_SIC_IWR=y | 326 | CONFIG_PM_BFIN_SLEEP_DEEPER=y |
327 | # CONFIG_PM_BFIN_SLEEP is not set | ||
327 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | 328 | # CONFIG_PM_WAKEUP_BY_GPIO is not set |
328 | # CONFIG_PM_WAKEUP_GPIO_API is not set | ||
329 | CONFIG_PM_WAKEUP_SIC_IWR=0x80 | ||
330 | 329 | ||
331 | # | 330 | # |
332 | # CPU Frequency scaling | 331 | # CPU Frequency scaling |
@@ -714,7 +713,6 @@ CONFIG_SERIAL_BFIN_DMA=y | |||
714 | # CONFIG_SERIAL_BFIN_PIO is not set | 713 | # CONFIG_SERIAL_BFIN_PIO is not set |
715 | CONFIG_SERIAL_BFIN_UART0=y | 714 | CONFIG_SERIAL_BFIN_UART0=y |
716 | # CONFIG_BFIN_UART0_CTSRTS is not set | 715 | # CONFIG_BFIN_UART0_CTSRTS is not set |
717 | # CONFIG_SERIAL_BFIN_UART1 is not set | ||
718 | CONFIG_SERIAL_CORE=y | 716 | CONFIG_SERIAL_CORE=y |
719 | CONFIG_SERIAL_CORE_CONSOLE=y | 717 | CONFIG_SERIAL_CORE_CONSOLE=y |
720 | # CONFIG_SERIAL_BFIN_SPORT is not set | 718 | # CONFIG_SERIAL_BFIN_SPORT is not set |
diff --git a/arch/blackfin/configs/BF537-STAMP_defconfig b/arch/blackfin/configs/BF537-STAMP_defconfig index b37ccc681e7a..d45fa535dad7 100644 --- a/arch/blackfin/configs/BF537-STAMP_defconfig +++ b/arch/blackfin/configs/BF537-STAMP_defconfig | |||
@@ -330,10 +330,9 @@ CONFIG_PM=y | |||
330 | # CONFIG_PM_LEGACY is not set | 330 | # CONFIG_PM_LEGACY is not set |
331 | # CONFIG_PM_DEBUG is not set | 331 | # CONFIG_PM_DEBUG is not set |
332 | # CONFIG_PM_SYSFS_DEPRECATED is not set | 332 | # CONFIG_PM_SYSFS_DEPRECATED is not set |
333 | CONFIG_PM_WAKEUP_GPIO_BY_SIC_IWR=y | 333 | CONFIG_PM_BFIN_SLEEP_DEEPER=y |
334 | # CONFIG_PM_BFIN_SLEEP is not set | ||
334 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | 335 | # CONFIG_PM_WAKEUP_BY_GPIO is not set |
335 | # CONFIG_PM_WAKEUP_GPIO_API is not set | ||
336 | CONFIG_PM_WAKEUP_SIC_IWR=0x8 | ||
337 | 336 | ||
338 | # | 337 | # |
339 | # CPU Frequency scaling | 338 | # CPU Frequency scaling |
@@ -1013,6 +1012,7 @@ CONFIG_SND_BFIN_AD73311_SE=4 | |||
1013 | CONFIG_SND_SOC_AC97_BUS=y | 1012 | CONFIG_SND_SOC_AC97_BUS=y |
1014 | CONFIG_SND_SOC=m | 1013 | CONFIG_SND_SOC=m |
1015 | CONFIG_SND_BF5XX_SOC=m | 1014 | CONFIG_SND_BF5XX_SOC=m |
1015 | CONFIG_SND_MMAP_SUPPORT=y | ||
1016 | CONFIG_SND_BF5XX_SOC_AC97=m | 1016 | CONFIG_SND_BF5XX_SOC_AC97=m |
1017 | # CONFIG_SND_BF5XX_SOC_WM8750 is not set | 1017 | # CONFIG_SND_BF5XX_SOC_WM8750 is not set |
1018 | # CONFIG_SND_BF5XX_SOC_WM8731 is not set | 1018 | # CONFIG_SND_BF5XX_SOC_WM8731 is not set |
diff --git a/arch/blackfin/configs/BF548-EZKIT_defconfig b/arch/blackfin/configs/BF548-EZKIT_defconfig index fd702161ef59..c9707f7665ad 100644 --- a/arch/blackfin/configs/BF548-EZKIT_defconfig +++ b/arch/blackfin/configs/BF548-EZKIT_defconfig | |||
@@ -396,6 +396,7 @@ CONFIG_BINFMT_ZFLAT=y | |||
396 | # Power management options | 396 | # Power management options |
397 | # | 397 | # |
398 | # CONFIG_PM is not set | 398 | # CONFIG_PM is not set |
399 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | ||
399 | 400 | ||
400 | # | 401 | # |
401 | # CPU Frequency scaling | 402 | # CPU Frequency scaling |
@@ -1075,6 +1076,7 @@ CONFIG_SND_VERBOSE_PROCFS=y | |||
1075 | CONFIG_SND_SOC_AC97_BUS=y | 1076 | CONFIG_SND_SOC_AC97_BUS=y |
1076 | CONFIG_SND_SOC=y | 1077 | CONFIG_SND_SOC=y |
1077 | CONFIG_SND_BF5XX_SOC=y | 1078 | CONFIG_SND_BF5XX_SOC=y |
1079 | CONFIG_SND_MMAP_SUPPORT=y | ||
1078 | CONFIG_SND_BF5XX_SOC_AC97=y | 1080 | CONFIG_SND_BF5XX_SOC_AC97=y |
1079 | CONFIG_SND_BF5XX_SOC_BF548_EZKIT=y | 1081 | CONFIG_SND_BF5XX_SOC_BF548_EZKIT=y |
1080 | # CONFIG_SND_BF5XX_SOC_WM8750 is not set | 1082 | # CONFIG_SND_BF5XX_SOC_WM8750 is not set |
diff --git a/arch/blackfin/configs/BF561-EZKIT_defconfig b/arch/blackfin/configs/BF561-EZKIT_defconfig index 8546994939fb..4d8a63331309 100644 --- a/arch/blackfin/configs/BF561-EZKIT_defconfig +++ b/arch/blackfin/configs/BF561-EZKIT_defconfig | |||
@@ -367,6 +367,7 @@ CONFIG_BINFMT_ZFLAT=y | |||
367 | # Power management options | 367 | # Power management options |
368 | # | 368 | # |
369 | # CONFIG_PM is not set | 369 | # CONFIG_PM is not set |
370 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | ||
370 | 371 | ||
371 | # | 372 | # |
372 | # Networking | 373 | # Networking |
diff --git a/arch/blackfin/kernel/bfin_dma_5xx.c b/arch/blackfin/kernel/bfin_dma_5xx.c index 5453bc3664fc..8fd5d22cec34 100644 --- a/arch/blackfin/kernel/bfin_dma_5xx.c +++ b/arch/blackfin/kernel/bfin_dma_5xx.c | |||
@@ -105,13 +105,14 @@ int request_dma(unsigned int channel, char *device_id) | |||
105 | mutex_unlock(&(dma_ch[channel].dmalock)); | 105 | mutex_unlock(&(dma_ch[channel].dmalock)); |
106 | 106 | ||
107 | #ifdef CONFIG_BF54x | 107 | #ifdef CONFIG_BF54x |
108 | if (channel >= CH_UART2_RX && channel <= CH_UART3_TX && | 108 | if (channel >= CH_UART2_RX && channel <= CH_UART3_TX) { |
109 | strncmp(device_id, "BFIN_UART", 9) == 0) | 109 | if (strncmp(device_id, "BFIN_UART", 9) == 0) |
110 | dma_ch[channel].regs->peripheral_map |= | 110 | dma_ch[channel].regs->peripheral_map |= |
111 | (channel - CH_UART2_RX + 0xC); | 111 | (channel - CH_UART2_RX + 0xC); |
112 | else | 112 | else |
113 | dma_ch[channel].regs->peripheral_map |= | 113 | dma_ch[channel].regs->peripheral_map |= |
114 | (channel - CH_UART2_RX + 0x6); | 114 | (channel - CH_UART2_RX + 0x6); |
115 | } | ||
115 | #endif | 116 | #endif |
116 | 117 | ||
117 | dma_ch[channel].device_id = device_id; | 118 | dma_ch[channel].device_id = device_id; |
diff --git a/arch/blackfin/kernel/fixed_code.S b/arch/blackfin/kernel/fixed_code.S index 90262691b11a..5ed47228a390 100644 --- a/arch/blackfin/kernel/fixed_code.S +++ b/arch/blackfin/kernel/fixed_code.S | |||
@@ -101,9 +101,9 @@ ENDPROC (_atomic_ior32) | |||
101 | 101 | ||
102 | .align 16 | 102 | .align 16 |
103 | /* | 103 | /* |
104 | * Atomic ior, 32 bit. | 104 | * Atomic and, 32 bit. |
105 | * Inputs: P0: memory address to use | 105 | * Inputs: P0: memory address to use |
106 | * R0: value to ior | 106 | * R0: value to and |
107 | * Outputs: R0: new contents of the memory address. | 107 | * Outputs: R0: new contents of the memory address. |
108 | * R1: previous contents of the memory address. | 108 | * R1: previous contents of the memory address. |
109 | */ | 109 | */ |
@@ -112,13 +112,13 @@ ENTRY(_atomic_and32) | |||
112 | R0 = R1 & R0; | 112 | R0 = R1 & R0; |
113 | [P0] = R0; | 113 | [P0] = R0; |
114 | rts; | 114 | rts; |
115 | ENDPROC (_atomic_ior32) | 115 | ENDPROC (_atomic_and32) |
116 | 116 | ||
117 | .align 16 | 117 | .align 16 |
118 | /* | 118 | /* |
119 | * Atomic ior, 32 bit. | 119 | * Atomic xor, 32 bit. |
120 | * Inputs: P0: memory address to use | 120 | * Inputs: P0: memory address to use |
121 | * R0: value to ior | 121 | * R0: value to xor |
122 | * Outputs: R0: new contents of the memory address. | 122 | * Outputs: R0: new contents of the memory address. |
123 | * R1: previous contents of the memory address. | 123 | * R1: previous contents of the memory address. |
124 | */ | 124 | */ |
@@ -127,7 +127,7 @@ ENTRY(_atomic_xor32) | |||
127 | R0 = R1 ^ R0; | 127 | R0 = R1 ^ R0; |
128 | [P0] = R0; | 128 | [P0] = R0; |
129 | rts; | 129 | rts; |
130 | ENDPROC (_atomic_ior32) | 130 | ENDPROC (_atomic_xor32) |
131 | 131 | ||
132 | .align 16 | 132 | .align 16 |
133 | /* | 133 | /* |
diff --git a/arch/blackfin/kernel/gptimers.c b/arch/blackfin/kernel/gptimers.c index 5cf4bdb1df3b..1904d8b53328 100644 --- a/arch/blackfin/kernel/gptimers.c +++ b/arch/blackfin/kernel/gptimers.c | |||
@@ -1,9 +1,9 @@ | |||
1 | /* | 1 | /* |
2 | * bfin_gptimers.c - derived from bf53x_timers.c | 2 | * gptimers.c - Blackfin General Purpose Timer core API |
3 | * Driver for General Purpose Timer functions on the Blackfin processor | ||
4 | * | 3 | * |
5 | * Copyright (C) 2005 John DeHority | 4 | * Copyright (c) 2005-2008 Analog Devices Inc. |
6 | * Copyright (C) 2006 Hella Aglaia GmbH (awe@aglaia-gmbh.de) | 5 | * Copyright (C) 2005 John DeHority |
6 | * Copyright (C) 2006 Hella Aglaia GmbH (awe@aglaia-gmbh.de) | ||
7 | * | 7 | * |
8 | * Licensed under the GPLv2. | 8 | * Licensed under the GPLv2. |
9 | */ | 9 | */ |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 8229b1090eb9..2255c289a714 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
@@ -32,6 +32,7 @@ | |||
32 | static DEFINE_PER_CPU(struct cpu, cpu_devices); | 32 | static DEFINE_PER_CPU(struct cpu, cpu_devices); |
33 | 33 | ||
34 | u16 _bfin_swrst; | 34 | u16 _bfin_swrst; |
35 | EXPORT_SYMBOL(_bfin_swrst); | ||
35 | 36 | ||
36 | unsigned long memory_start, memory_end, physical_mem_end; | 37 | unsigned long memory_start, memory_end, physical_mem_end; |
37 | unsigned long reserved_mem_dcache_on; | 38 | unsigned long reserved_mem_dcache_on; |
@@ -514,6 +515,7 @@ static __init void memory_setup(void) | |||
514 | printk(KERN_INFO "Kernel Managed Memory: %ldMB\n", _ramend >> 20); | 515 | printk(KERN_INFO "Kernel Managed Memory: %ldMB\n", _ramend >> 20); |
515 | 516 | ||
516 | printk(KERN_INFO "Memory map:\n" | 517 | printk(KERN_INFO "Memory map:\n" |
518 | KERN_INFO " fixedcode = 0x%p-0x%p\n" | ||
517 | KERN_INFO " text = 0x%p-0x%p\n" | 519 | KERN_INFO " text = 0x%p-0x%p\n" |
518 | KERN_INFO " rodata = 0x%p-0x%p\n" | 520 | KERN_INFO " rodata = 0x%p-0x%p\n" |
519 | KERN_INFO " bss = 0x%p-0x%p\n" | 521 | KERN_INFO " bss = 0x%p-0x%p\n" |
@@ -527,7 +529,8 @@ static __init void memory_setup(void) | |||
527 | #if DMA_UNCACHED_REGION > 0 | 529 | #if DMA_UNCACHED_REGION > 0 |
528 | KERN_INFO " DMA Zone = 0x%p-0x%p\n" | 530 | KERN_INFO " DMA Zone = 0x%p-0x%p\n" |
529 | #endif | 531 | #endif |
530 | , _stext, _etext, | 532 | , (void *)FIXED_CODE_START, (void *)FIXED_CODE_END, |
533 | _stext, _etext, | ||
531 | __start_rodata, __end_rodata, | 534 | __start_rodata, __end_rodata, |
532 | __bss_start, __bss_stop, | 535 | __bss_start, __bss_stop, |
533 | _sdata, _edata, | 536 | _sdata, _edata, |
diff --git a/arch/blackfin/kernel/vmlinux.lds.S b/arch/blackfin/kernel/vmlinux.lds.S index aed832540b3b..cb01a9de2680 100644 --- a/arch/blackfin/kernel/vmlinux.lds.S +++ b/arch/blackfin/kernel/vmlinux.lds.S | |||
@@ -147,44 +147,64 @@ SECTIONS | |||
147 | 147 | ||
148 | __l1_lma_start = .; | 148 | __l1_lma_start = .; |
149 | 149 | ||
150 | #if L1_CODE_LENGTH | ||
151 | # define LDS_L1_CODE *(.l1.text) | ||
152 | #else | ||
153 | # define LDS_L1_CODE | ||
154 | #endif | ||
150 | .text_l1 L1_CODE_START : AT(LOADADDR(.init.ramfs) + SIZEOF(.init.ramfs)) | 155 | .text_l1 L1_CODE_START : AT(LOADADDR(.init.ramfs) + SIZEOF(.init.ramfs)) |
151 | { | 156 | { |
152 | . = ALIGN(4); | 157 | . = ALIGN(4); |
153 | __stext_l1 = .; | 158 | __stext_l1 = .; |
154 | *(.l1.text) | 159 | LDS_L1_CODE |
155 | |||
156 | . = ALIGN(4); | 160 | . = ALIGN(4); |
157 | __etext_l1 = .; | 161 | __etext_l1 = .; |
158 | } | 162 | } |
159 | 163 | ||
164 | #if L1_DATA_A_LENGTH | ||
165 | # define LDS_L1_A_DATA *(.l1.data) | ||
166 | # define LDS_L1_A_BSS *(.l1.bss) | ||
167 | # define LDS_L1_A_CACHE *(.data_l1.cacheline_aligned) | ||
168 | #else | ||
169 | # define LDS_L1_A_DATA | ||
170 | # define LDS_L1_A_BSS | ||
171 | # define LDS_L1_A_CACHE | ||
172 | #endif | ||
160 | .data_l1 L1_DATA_A_START : AT(LOADADDR(.text_l1) + SIZEOF(.text_l1)) | 173 | .data_l1 L1_DATA_A_START : AT(LOADADDR(.text_l1) + SIZEOF(.text_l1)) |
161 | { | 174 | { |
162 | . = ALIGN(4); | 175 | . = ALIGN(4); |
163 | __sdata_l1 = .; | 176 | __sdata_l1 = .; |
164 | *(.l1.data) | 177 | LDS_L1_A_DATA |
165 | __edata_l1 = .; | 178 | __edata_l1 = .; |
166 | 179 | ||
167 | . = ALIGN(4); | 180 | . = ALIGN(4); |
168 | __sbss_l1 = .; | 181 | __sbss_l1 = .; |
169 | *(.l1.bss) | 182 | LDS_L1_A_BSS |
170 | 183 | ||
171 | . = ALIGN(32); | 184 | . = ALIGN(32); |
172 | *(.data_l1.cacheline_aligned) | 185 | LDS_L1_A_CACHE |
173 | 186 | ||
174 | . = ALIGN(4); | 187 | . = ALIGN(4); |
175 | __ebss_l1 = .; | 188 | __ebss_l1 = .; |
176 | } | 189 | } |
177 | 190 | ||
191 | #if L1_DATA_B_LENGTH | ||
192 | # define LDS_L1_B_DATA *(.l1.data.B) | ||
193 | # define LDS_L1_B_BSS *(.l1.bss.B) | ||
194 | #else | ||
195 | # define LDS_L1_B_DATA | ||
196 | # define LDS_L1_B_BSS | ||
197 | #endif | ||
178 | .data_b_l1 L1_DATA_B_START : AT(LOADADDR(.data_l1) + SIZEOF(.data_l1)) | 198 | .data_b_l1 L1_DATA_B_START : AT(LOADADDR(.data_l1) + SIZEOF(.data_l1)) |
179 | { | 199 | { |
180 | . = ALIGN(4); | 200 | . = ALIGN(4); |
181 | __sdata_b_l1 = .; | 201 | __sdata_b_l1 = .; |
182 | *(.l1.data.B) | 202 | LDS_L1_B_DATA |
183 | __edata_b_l1 = .; | 203 | __edata_b_l1 = .; |
184 | 204 | ||
185 | . = ALIGN(4); | 205 | . = ALIGN(4); |
186 | __sbss_b_l1 = .; | 206 | __sbss_b_l1 = .; |
187 | *(.l1.bss.B) | 207 | LDS_L1_B_BSS |
188 | 208 | ||
189 | . = ALIGN(4); | 209 | . = ALIGN(4); |
190 | __ebss_b_l1 = .; | 210 | __ebss_b_l1 = .; |
diff --git a/arch/blackfin/mach-bf527/boards/ezkit.c b/arch/blackfin/mach-bf527/boards/ezkit.c index 337515fba612..cf4bc0d83355 100644 --- a/arch/blackfin/mach-bf527/boards/ezkit.c +++ b/arch/blackfin/mach-bf527/boards/ezkit.c | |||
@@ -180,8 +180,8 @@ static struct mtd_partition partition_info[] = { | |||
180 | }, | 180 | }, |
181 | { | 181 | { |
182 | .name = "File System", | 182 | .name = "File System", |
183 | .offset = 4 * SIZE_1M, | 183 | .offset = MTDPART_OFS_APPEND, |
184 | .size = (256 - 4) * SIZE_1M, | 184 | .size = MTDPART_SIZ_FULL, |
185 | }, | 185 | }, |
186 | }; | 186 | }; |
187 | 187 | ||
@@ -422,11 +422,11 @@ static struct mtd_partition bfin_spi_flash_partitions[] = { | |||
422 | }, { | 422 | }, { |
423 | .name = "kernel", | 423 | .name = "kernel", |
424 | .size = 0xe0000, | 424 | .size = 0xe0000, |
425 | .offset = 0x20000 | 425 | .offset = MTDPART_OFS_APPEND, |
426 | }, { | 426 | }, { |
427 | .name = "file system", | 427 | .name = "file system", |
428 | .size = 0x700000, | 428 | .size = MTDPART_SIZ_FULL, |
429 | .offset = 0x00100000, | 429 | .offset = MTDPART_OFS_APPEND, |
430 | } | 430 | } |
431 | }; | 431 | }; |
432 | 432 | ||
@@ -484,13 +484,6 @@ static struct bfin5xx_spi_chip spi_si3xxx_chip_info = { | |||
484 | }; | 484 | }; |
485 | #endif | 485 | #endif |
486 | 486 | ||
487 | #if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE) | ||
488 | static struct bfin5xx_spi_chip ad5304_chip_info = { | ||
489 | .enable_dma = 0, | ||
490 | .bits_per_word = 16, | ||
491 | }; | ||
492 | #endif | ||
493 | |||
494 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) | 487 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) |
495 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { | 488 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { |
496 | .enable_dma = 0, | 489 | .enable_dma = 0, |
@@ -611,17 +604,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = { | |||
611 | .mode = SPI_MODE_3, | 604 | .mode = SPI_MODE_3, |
612 | }, | 605 | }, |
613 | #endif | 606 | #endif |
614 | #if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE) | ||
615 | { | ||
616 | .modalias = "ad5304_spi", | ||
617 | .max_speed_hz = 1250000, /* max spi clock (SCK) speed in HZ */ | ||
618 | .bus_num = 0, | ||
619 | .chip_select = 2, | ||
620 | .platform_data = NULL, | ||
621 | .controller_data = &ad5304_chip_info, | ||
622 | .mode = SPI_MODE_2, | ||
623 | }, | ||
624 | #endif | ||
625 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) | 607 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) |
626 | { | 608 | { |
627 | .modalias = "ad7877", | 609 | .modalias = "ad7877", |
@@ -818,6 +800,19 @@ static struct platform_device bfin_device_gpiokeys = { | |||
818 | }; | 800 | }; |
819 | #endif | 801 | #endif |
820 | 802 | ||
803 | static struct resource bfin_gpios_resources = { | ||
804 | .start = 0, | ||
805 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
806 | .flags = IORESOURCE_IRQ, | ||
807 | }; | ||
808 | |||
809 | static struct platform_device bfin_gpios_device = { | ||
810 | .name = "simple-gpio", | ||
811 | .id = -1, | ||
812 | .num_resources = 1, | ||
813 | .resource = &bfin_gpios_resources, | ||
814 | }; | ||
815 | |||
821 | static struct platform_device *stamp_devices[] __initdata = { | 816 | static struct platform_device *stamp_devices[] __initdata = { |
822 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) | 817 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) |
823 | &bf5xx_nand_device, | 818 | &bf5xx_nand_device, |
@@ -895,6 +890,8 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
895 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 890 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
896 | &bfin_device_gpiokeys, | 891 | &bfin_device_gpiokeys, |
897 | #endif | 892 | #endif |
893 | |||
894 | &bfin_gpios_device, | ||
898 | }; | 895 | }; |
899 | 896 | ||
900 | static int __init stamp_init(void) | 897 | static int __init stamp_init(void) |
@@ -921,13 +918,18 @@ void native_machine_restart(char *cmd) | |||
921 | bfin_gpio_reset_spi0_ssel1(); | 918 | bfin_gpio_reset_spi0_ssel1(); |
922 | } | 919 | } |
923 | 920 | ||
924 | /* | ||
925 | * Currently the MAC address is saved in Flash by U-Boot | ||
926 | */ | ||
927 | #define FLASH_MAC 0x203f0000 | ||
928 | void bfin_get_ether_addr(char *addr) | 921 | void bfin_get_ether_addr(char *addr) |
929 | { | 922 | { |
930 | *(u32 *)(&(addr[0])) = bfin_read32(FLASH_MAC); | 923 | /* the MAC is stored in OTP memory page 0xDF */ |
931 | *(u16 *)(&(addr[4])) = bfin_read16(FLASH_MAC + 4); | 924 | u32 ret; |
925 | u64 otp_mac; | ||
926 | u32 (*otp_read)(u32 page, u32 flags, u64 *page_content) = (void *)0xEF00001A; | ||
927 | |||
928 | ret = otp_read(0xDF, 0x00, &otp_mac); | ||
929 | if (!(ret & 0x1)) { | ||
930 | char *otp_mac_p = (char *)&otp_mac; | ||
931 | for (ret = 0; ret < 6; ++ret) | ||
932 | addr[ret] = otp_mac_p[5 - ret]; | ||
933 | } | ||
932 | } | 934 | } |
933 | EXPORT_SYMBOL(bfin_get_ether_addr); | 935 | EXPORT_SYMBOL(bfin_get_ether_addr); |
diff --git a/arch/blackfin/mach-bf533/boards/ezkit.c b/arch/blackfin/mach-bf533/boards/ezkit.c index 2b09aa39f565..241b5a20a36a 100644 --- a/arch/blackfin/mach-bf533/boards/ezkit.c +++ b/arch/blackfin/mach-bf533/boards/ezkit.c | |||
@@ -99,11 +99,11 @@ static struct mtd_partition bfin_spi_flash_partitions[] = { | |||
99 | }, { | 99 | }, { |
100 | .name = "kernel", | 100 | .name = "kernel", |
101 | .size = 0xe0000, | 101 | .size = 0xe0000, |
102 | .offset = 0x20000 | 102 | .offset = MTDPART_OFS_APPEND, |
103 | }, { | 103 | }, { |
104 | .name = "file system", | 104 | .name = "file system", |
105 | .size = 0x700000, | 105 | .size = MTDPART_SIZ_FULL, |
106 | .offset = 0x00100000, | 106 | .offset = MTDPART_OFS_APPEND, |
107 | } | 107 | } |
108 | }; | 108 | }; |
109 | 109 | ||
@@ -298,6 +298,19 @@ static struct platform_device bfin_device_gpiokeys = { | |||
298 | }; | 298 | }; |
299 | #endif | 299 | #endif |
300 | 300 | ||
301 | static struct resource bfin_gpios_resources = { | ||
302 | .start = 0, | ||
303 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
304 | .flags = IORESOURCE_IRQ, | ||
305 | }; | ||
306 | |||
307 | static struct platform_device bfin_gpios_device = { | ||
308 | .name = "simple-gpio", | ||
309 | .id = -1, | ||
310 | .num_resources = 1, | ||
311 | .resource = &bfin_gpios_resources, | ||
312 | }; | ||
313 | |||
301 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 314 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
302 | #include <linux/i2c-gpio.h> | 315 | #include <linux/i2c-gpio.h> |
303 | 316 | ||
@@ -350,6 +363,8 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
350 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 363 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
351 | &i2c_gpio_device, | 364 | &i2c_gpio_device, |
352 | #endif | 365 | #endif |
366 | |||
367 | &bfin_gpios_device, | ||
353 | }; | 368 | }; |
354 | 369 | ||
355 | static int __init ezkit_init(void) | 370 | static int __init ezkit_init(void) |
diff --git a/arch/blackfin/mach-bf533/boards/stamp.c b/arch/blackfin/mach-bf533/boards/stamp.c index a645f6fd091b..b2ac4816ae62 100644 --- a/arch/blackfin/mach-bf533/boards/stamp.c +++ b/arch/blackfin/mach-bf533/boards/stamp.c | |||
@@ -112,7 +112,7 @@ static struct platform_device net2272_bfin_device = { | |||
112 | static struct mtd_partition stamp_partitions[] = { | 112 | static struct mtd_partition stamp_partitions[] = { |
113 | { | 113 | { |
114 | .name = "Bootloader", | 114 | .name = "Bootloader", |
115 | .size = 0x20000, | 115 | .size = 0x40000, |
116 | .offset = 0, | 116 | .offset = 0, |
117 | }, { | 117 | }, { |
118 | .name = "Kernel", | 118 | .name = "Kernel", |
@@ -160,17 +160,17 @@ static struct platform_device stamp_flash_device = { | |||
160 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 160 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
161 | { | 161 | { |
162 | .name = "bootloader", | 162 | .name = "bootloader", |
163 | .size = 0x00020000, | 163 | .size = 0x00040000, |
164 | .offset = 0, | 164 | .offset = 0, |
165 | .mask_flags = MTD_CAP_ROM | 165 | .mask_flags = MTD_CAP_ROM |
166 | }, { | 166 | }, { |
167 | .name = "kernel", | 167 | .name = "kernel", |
168 | .size = 0xe0000, | 168 | .size = 0xe0000, |
169 | .offset = 0x20000 | 169 | .offset = MTDPART_OFS_APPEND, |
170 | }, { | 170 | }, { |
171 | .name = "file system", | 171 | .name = "file system", |
172 | .size = 0x700000, | 172 | .size = MTDPART_SIZ_FULL, |
173 | .offset = 0x00100000, | 173 | .offset = MTDPART_OFS_APPEND, |
174 | } | 174 | } |
175 | }; | 175 | }; |
176 | 176 | ||
@@ -212,13 +212,6 @@ static struct bfin5xx_spi_chip spi_si3xxx_chip_info = { | |||
212 | }; | 212 | }; |
213 | #endif | 213 | #endif |
214 | 214 | ||
215 | #if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE) | ||
216 | static struct bfin5xx_spi_chip ad5304_chip_info = { | ||
217 | .enable_dma = 0, | ||
218 | .bits_per_word = 16, | ||
219 | }; | ||
220 | #endif | ||
221 | |||
222 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) | 215 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) |
223 | static struct bfin5xx_spi_chip spi_mmc_chip_info = { | 216 | static struct bfin5xx_spi_chip spi_mmc_chip_info = { |
224 | .enable_dma = 1, | 217 | .enable_dma = 1, |
@@ -308,17 +301,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = { | |||
308 | }, | 301 | }, |
309 | #endif | 302 | #endif |
310 | 303 | ||
311 | #if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE) | ||
312 | { | ||
313 | .modalias = "ad5304_spi", | ||
314 | .max_speed_hz = 1000000, /* max spi clock (SCK) speed in HZ */ | ||
315 | .bus_num = 0, | ||
316 | .chip_select = 2, | ||
317 | .platform_data = NULL, | ||
318 | .controller_data = &ad5304_chip_info, | ||
319 | .mode = SPI_MODE_2, | ||
320 | }, | ||
321 | #endif | ||
322 | #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) | 304 | #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) |
323 | { | 305 | { |
324 | .modalias = "spidev", | 306 | .modalias = "spidev", |
@@ -457,6 +439,19 @@ static struct platform_device bfin_device_gpiokeys = { | |||
457 | }; | 439 | }; |
458 | #endif | 440 | #endif |
459 | 441 | ||
442 | static struct resource bfin_gpios_resources = { | ||
443 | .start = 0, | ||
444 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
445 | .flags = IORESOURCE_IRQ, | ||
446 | }; | ||
447 | |||
448 | static struct platform_device bfin_gpios_device = { | ||
449 | .name = "simple-gpio", | ||
450 | .id = -1, | ||
451 | .num_resources = 1, | ||
452 | .resource = &bfin_gpios_resources, | ||
453 | }; | ||
454 | |||
460 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 455 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
461 | #include <linux/i2c-gpio.h> | 456 | #include <linux/i2c-gpio.h> |
462 | 457 | ||
@@ -518,6 +513,8 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
518 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 513 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
519 | &i2c_gpio_device, | 514 | &i2c_gpio_device, |
520 | #endif | 515 | #endif |
516 | |||
517 | &bfin_gpios_device, | ||
521 | &stamp_flash_device, | 518 | &stamp_flash_device, |
522 | }; | 519 | }; |
523 | 520 | ||
diff --git a/arch/blackfin/mach-bf537/boards/generic_board.c b/arch/blackfin/mach-bf537/boards/generic_board.c index 8a3397db1d21..c95395ba7bfa 100644 --- a/arch/blackfin/mach-bf537/boards/generic_board.c +++ b/arch/blackfin/mach-bf537/boards/generic_board.c | |||
@@ -371,13 +371,6 @@ static struct bfin5xx_spi_chip spi_si3xxx_chip_info = { | |||
371 | }; | 371 | }; |
372 | #endif | 372 | #endif |
373 | 373 | ||
374 | #if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE) | ||
375 | static struct bfin5xx_spi_chip ad5304_chip_info = { | ||
376 | .enable_dma = 0, | ||
377 | .bits_per_word = 16, | ||
378 | }; | ||
379 | #endif | ||
380 | |||
381 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) | 374 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) |
382 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { | 375 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { |
383 | .enable_dma = 0, | 376 | .enable_dma = 0, |
@@ -483,17 +476,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = { | |||
483 | .mode = SPI_MODE_3, | 476 | .mode = SPI_MODE_3, |
484 | }, | 477 | }, |
485 | #endif | 478 | #endif |
486 | #if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE) | ||
487 | { | ||
488 | .modalias = "ad5304_spi", | ||
489 | .max_speed_hz = 1250000, /* max spi clock (SCK) speed in HZ */ | ||
490 | .bus_num = 0, | ||
491 | .chip_select = 2, | ||
492 | .platform_data = NULL, | ||
493 | .controller_data = &ad5304_chip_info, | ||
494 | .mode = SPI_MODE_2, | ||
495 | }, | ||
496 | #endif | ||
497 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) | 479 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) |
498 | { | 480 | { |
499 | .modalias = "ad7877", | 481 | .modalias = "ad7877", |
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c index 9e2277e0d25c..ea83148993da 100644 --- a/arch/blackfin/mach-bf537/boards/stamp.c +++ b/arch/blackfin/mach-bf537/boards/stamp.c | |||
@@ -128,6 +128,19 @@ static struct platform_device bfin_device_gpiokeys = { | |||
128 | }; | 128 | }; |
129 | #endif | 129 | #endif |
130 | 130 | ||
131 | static struct resource bfin_gpios_resources = { | ||
132 | .start = 0, | ||
133 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
134 | .flags = IORESOURCE_IRQ, | ||
135 | }; | ||
136 | |||
137 | static struct platform_device bfin_gpios_device = { | ||
138 | .name = "simple-gpio", | ||
139 | .id = -1, | ||
140 | .num_resources = 1, | ||
141 | .resource = &bfin_gpios_resources, | ||
142 | }; | ||
143 | |||
131 | #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) | 144 | #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) |
132 | static struct resource bfin_pcmcia_cf_resources[] = { | 145 | static struct resource bfin_pcmcia_cf_resources[] = { |
133 | { | 146 | { |
@@ -343,7 +356,7 @@ static struct platform_device net2272_bfin_device = { | |||
343 | static struct mtd_partition stamp_partitions[] = { | 356 | static struct mtd_partition stamp_partitions[] = { |
344 | { | 357 | { |
345 | .name = "Bootloader", | 358 | .name = "Bootloader", |
346 | .size = 0x20000, | 359 | .size = 0x40000, |
347 | .offset = 0, | 360 | .offset = 0, |
348 | }, { | 361 | }, { |
349 | .name = "Kernel", | 362 | .name = "Kernel", |
@@ -351,7 +364,7 @@ static struct mtd_partition stamp_partitions[] = { | |||
351 | .offset = MTDPART_OFS_APPEND, | 364 | .offset = MTDPART_OFS_APPEND, |
352 | }, { | 365 | }, { |
353 | .name = "RootFS", | 366 | .name = "RootFS", |
354 | .size = 0x400000 - 0x20000 - 0xE0000 - 0x10000, | 367 | .size = 0x400000 - 0x40000 - 0xE0000 - 0x10000, |
355 | .offset = MTDPART_OFS_APPEND, | 368 | .offset = MTDPART_OFS_APPEND, |
356 | }, { | 369 | }, { |
357 | .name = "MAC Address", | 370 | .name = "MAC Address", |
@@ -391,17 +404,17 @@ static struct platform_device stamp_flash_device = { | |||
391 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 404 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
392 | { | 405 | { |
393 | .name = "bootloader", | 406 | .name = "bootloader", |
394 | .size = 0x00020000, | 407 | .size = 0x00040000, |
395 | .offset = 0, | 408 | .offset = 0, |
396 | .mask_flags = MTD_CAP_ROM | 409 | .mask_flags = MTD_CAP_ROM |
397 | }, { | 410 | }, { |
398 | .name = "kernel", | 411 | .name = "kernel", |
399 | .size = 0xe0000, | 412 | .size = 0xe0000, |
400 | .offset = 0x20000 | 413 | .offset = MTDPART_OFS_APPEND, |
401 | }, { | 414 | }, { |
402 | .name = "file system", | 415 | .name = "file system", |
403 | .size = 0x700000, | 416 | .size = MTDPART_SIZ_FULL, |
404 | .offset = 0x00100000, | 417 | .offset = MTDPART_OFS_APPEND, |
405 | } | 418 | } |
406 | }; | 419 | }; |
407 | 420 | ||
@@ -459,13 +472,6 @@ static struct bfin5xx_spi_chip spi_si3xxx_chip_info = { | |||
459 | }; | 472 | }; |
460 | #endif | 473 | #endif |
461 | 474 | ||
462 | #if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE) | ||
463 | static struct bfin5xx_spi_chip ad5304_chip_info = { | ||
464 | .enable_dma = 0, | ||
465 | .bits_per_word = 16, | ||
466 | }; | ||
467 | #endif | ||
468 | |||
469 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) | 475 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) |
470 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { | 476 | static struct bfin5xx_spi_chip spi_ad7877_chip_info = { |
471 | .enable_dma = 0, | 477 | .enable_dma = 0, |
@@ -578,17 +584,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = { | |||
578 | .mode = SPI_MODE_3, | 584 | .mode = SPI_MODE_3, |
579 | }, | 585 | }, |
580 | #endif | 586 | #endif |
581 | #if defined(CONFIG_AD5304) || defined(CONFIG_AD5304_MODULE) | ||
582 | { | ||
583 | .modalias = "ad5304_spi", | ||
584 | .max_speed_hz = 1250000, /* max spi clock (SCK) speed in HZ */ | ||
585 | .bus_num = 0, | ||
586 | .chip_select = 2, | ||
587 | .platform_data = NULL, | ||
588 | .controller_data = &ad5304_chip_info, | ||
589 | .mode = SPI_MODE_2, | ||
590 | }, | ||
591 | #endif | ||
592 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) | 587 | #if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) |
593 | { | 588 | { |
594 | .modalias = "ad7877", | 589 | .modalias = "ad7877", |
@@ -821,6 +816,8 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
821 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 816 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
822 | &bfin_device_gpiokeys, | 817 | &bfin_device_gpiokeys, |
823 | #endif | 818 | #endif |
819 | |||
820 | &bfin_gpios_device, | ||
824 | &stamp_flash_device, | 821 | &stamp_flash_device, |
825 | }; | 822 | }; |
826 | 823 | ||
diff --git a/arch/blackfin/mach-bf548/boards/ezkit.c b/arch/blackfin/mach-bf548/boards/ezkit.c index 916e963e83ba..40846aa034c4 100644 --- a/arch/blackfin/mach-bf548/boards/ezkit.c +++ b/arch/blackfin/mach-bf548/boards/ezkit.c | |||
@@ -285,8 +285,8 @@ static struct mtd_partition partition_info[] = { | |||
285 | }, | 285 | }, |
286 | { | 286 | { |
287 | .name = "File System", | 287 | .name = "File System", |
288 | .offset = 4 * SIZE_1M, | 288 | .offset = MTDPART_OFS_APPEND, |
289 | .size = (256 - 4) * SIZE_1M, | 289 | .size = MTDPART_SIZ_FULL, |
290 | }, | 290 | }, |
291 | }; | 291 | }; |
292 | 292 | ||
@@ -323,7 +323,7 @@ static struct platform_device bf5xx_nand_device = { | |||
323 | }; | 323 | }; |
324 | #endif | 324 | #endif |
325 | 325 | ||
326 | #if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN) | 326 | #if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN_MODULE) |
327 | static struct platform_device bf54x_sdh_device = { | 327 | static struct platform_device bf54x_sdh_device = { |
328 | .name = "bfin-sdh", | 328 | .name = "bfin-sdh", |
329 | .id = 0, | 329 | .id = 0, |
@@ -333,7 +333,7 @@ static struct platform_device bf54x_sdh_device = { | |||
333 | static struct mtd_partition ezkit_partitions[] = { | 333 | static struct mtd_partition ezkit_partitions[] = { |
334 | { | 334 | { |
335 | .name = "Bootloader", | 335 | .name = "Bootloader", |
336 | .size = 0x20000, | 336 | .size = 0x40000, |
337 | .offset = 0, | 337 | .offset = 0, |
338 | }, { | 338 | }, { |
339 | .name = "Kernel", | 339 | .name = "Kernel", |
@@ -381,8 +381,8 @@ static struct mtd_partition bfin_spi_flash_partitions[] = { | |||
381 | .mask_flags = MTD_CAP_ROM | 381 | .mask_flags = MTD_CAP_ROM |
382 | }, { | 382 | }, { |
383 | .name = "linux kernel", | 383 | .name = "linux kernel", |
384 | .size = 0x1c0000, | 384 | .size = MTDPART_SIZ_FULL, |
385 | .offset = 0x40000 | 385 | .offset = MTDPART_OFS_APPEND, |
386 | } | 386 | } |
387 | }; | 387 | }; |
388 | 388 | ||
@@ -594,6 +594,19 @@ static struct platform_device bfin_device_gpiokeys = { | |||
594 | }; | 594 | }; |
595 | #endif | 595 | #endif |
596 | 596 | ||
597 | static struct resource bfin_gpios_resources = { | ||
598 | .start = 0, | ||
599 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
600 | .flags = IORESOURCE_IRQ, | ||
601 | }; | ||
602 | |||
603 | static struct platform_device bfin_gpios_device = { | ||
604 | .name = "simple-gpio", | ||
605 | .id = -1, | ||
606 | .num_resources = 1, | ||
607 | .resource = &bfin_gpios_resources, | ||
608 | }; | ||
609 | |||
597 | static struct platform_device *ezkit_devices[] __initdata = { | 610 | static struct platform_device *ezkit_devices[] __initdata = { |
598 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | 611 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) |
599 | &rtc_device, | 612 | &rtc_device, |
@@ -623,7 +636,7 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
623 | &bf5xx_nand_device, | 636 | &bf5xx_nand_device, |
624 | #endif | 637 | #endif |
625 | 638 | ||
626 | #if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN) | 639 | #if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN_MODULE) |
627 | &bf54x_sdh_device, | 640 | &bf54x_sdh_device, |
628 | #endif | 641 | #endif |
629 | 642 | ||
@@ -646,6 +659,8 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
646 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 659 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
647 | &bfin_device_gpiokeys, | 660 | &bfin_device_gpiokeys, |
648 | #endif | 661 | #endif |
662 | |||
663 | &bfin_gpios_device, | ||
649 | &ezkit_flash_device, | 664 | &ezkit_flash_device, |
650 | }; | 665 | }; |
651 | 666 | ||
diff --git a/arch/blackfin/mach-bf548/dma.c b/arch/blackfin/mach-bf548/dma.c index 374803a8d2e8..f5479298bb79 100644 --- a/arch/blackfin/mach-bf548/dma.c +++ b/arch/blackfin/mach-bf548/dma.c | |||
@@ -27,6 +27,8 @@ | |||
27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <linux/module.h> | ||
31 | |||
30 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
31 | #include <asm/dma.h> | 33 | #include <asm/dma.h> |
32 | 34 | ||
diff --git a/arch/blackfin/mach-bf548/head.S b/arch/blackfin/mach-bf548/head.S index 74fe258421a5..46222a75321a 100644 --- a/arch/blackfin/mach-bf548/head.S +++ b/arch/blackfin/mach-bf548/head.S | |||
@@ -28,6 +28,7 @@ | |||
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
31 | #include <linux/init.h> | ||
31 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
32 | #include <asm/trace.h> | 33 | #include <asm/trace.h> |
33 | #if CONFIG_BFIN_KERNEL_CLOCK | 34 | #if CONFIG_BFIN_KERNEL_CLOCK |
@@ -44,10 +45,9 @@ | |||
44 | 45 | ||
45 | #define INITIAL_STACK 0xFFB01000 | 46 | #define INITIAL_STACK 0xFFB01000 |
46 | 47 | ||
47 | .text | 48 | __INIT |
48 | 49 | ||
49 | ENTRY(__start) | 50 | ENTRY(__start) |
50 | ENTRY(__stext) | ||
51 | /* R0: argument of command line string, passed from uboot, save it */ | 51 | /* R0: argument of command line string, passed from uboot, save it */ |
52 | R7 = R0; | 52 | R7 = R0; |
53 | /* Enable Cycle Counter and Nesting Of Interrupts */ | 53 | /* Enable Cycle Counter and Nesting Of Interrupts */ |
@@ -213,6 +213,7 @@ ENTRY(__stext) | |||
213 | 213 | ||
214 | .LWAIT_HERE: | 214 | .LWAIT_HERE: |
215 | jump .LWAIT_HERE; | 215 | jump .LWAIT_HERE; |
216 | ENDPROC(__start) | ||
216 | 217 | ||
217 | ENTRY(_real_start) | 218 | ENTRY(_real_start) |
218 | [ -- sp ] = reti; | 219 | [ -- sp ] = reti; |
@@ -285,6 +286,9 @@ ENTRY(_real_start) | |||
285 | call _start_kernel; | 286 | call _start_kernel; |
286 | .L_exit: | 287 | .L_exit: |
287 | jump.s .L_exit; | 288 | jump.s .L_exit; |
289 | ENDPROC(_real_start) | ||
290 | |||
291 | __FINIT | ||
288 | 292 | ||
289 | .section .l1.text | 293 | .section .l1.text |
290 | #if CONFIG_BFIN_KERNEL_CLOCK | 294 | #if CONFIG_BFIN_KERNEL_CLOCK |
@@ -450,6 +454,7 @@ ENTRY(_start_dma_code) | |||
450 | SSYNC; | 454 | SSYNC; |
451 | 455 | ||
452 | RTS; | 456 | RTS; |
457 | ENDPROC(_start_dma_code) | ||
453 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 458 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
454 | 459 | ||
455 | .data | 460 | .data |
diff --git a/arch/blackfin/mach-bf561/boards/ezkit.c b/arch/blackfin/mach-bf561/boards/ezkit.c index 43c1b0982819..d357f648d963 100644 --- a/arch/blackfin/mach-bf561/boards/ezkit.c +++ b/arch/blackfin/mach-bf561/boards/ezkit.c | |||
@@ -223,7 +223,7 @@ static struct platform_device bfin_uart_device = { | |||
223 | static struct mtd_partition ezkit_partitions[] = { | 223 | static struct mtd_partition ezkit_partitions[] = { |
224 | { | 224 | { |
225 | .name = "Bootloader", | 225 | .name = "Bootloader", |
226 | .size = 0x20000, | 226 | .size = 0x40000, |
227 | .offset = 0, | 227 | .offset = 0, |
228 | }, { | 228 | }, { |
229 | .name = "Kernel", | 229 | .name = "Kernel", |
@@ -389,6 +389,19 @@ static struct platform_device bfin_device_gpiokeys = { | |||
389 | }; | 389 | }; |
390 | #endif | 390 | #endif |
391 | 391 | ||
392 | static struct resource bfin_gpios_resources = { | ||
393 | .start = 0, | ||
394 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
395 | .flags = IORESOURCE_IRQ, | ||
396 | }; | ||
397 | |||
398 | static struct platform_device bfin_gpios_device = { | ||
399 | .name = "simple-gpio", | ||
400 | .id = -1, | ||
401 | .num_resources = 1, | ||
402 | .resource = &bfin_gpios_resources, | ||
403 | }; | ||
404 | |||
392 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | 405 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) |
393 | #include <linux/i2c-gpio.h> | 406 | #include <linux/i2c-gpio.h> |
394 | 407 | ||
@@ -446,6 +459,7 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
446 | &isp1362_hcd_device, | 459 | &isp1362_hcd_device, |
447 | #endif | 460 | #endif |
448 | 461 | ||
462 | &bfin_gpios_device, | ||
449 | &ezkit_flash_device, | 463 | &ezkit_flash_device, |
450 | }; | 464 | }; |
451 | 465 | ||
diff --git a/arch/blackfin/mach-common/dpmc.S b/arch/blackfin/mach-common/dpmc.S index b80ddd8b232d..9d45aa3265b1 100644 --- a/arch/blackfin/mach-common/dpmc.S +++ b/arch/blackfin/mach-common/dpmc.S | |||
@@ -31,140 +31,6 @@ | |||
31 | #include <asm/blackfin.h> | 31 | #include <asm/blackfin.h> |
32 | #include <asm/mach/irq.h> | 32 | #include <asm/mach/irq.h> |
33 | 33 | ||
34 | .text | ||
35 | |||
36 | ENTRY(_unmask_wdog_wakeup_evt) | ||
37 | [--SP] = ( R7:0, P5:0 ); | ||
38 | #if defined(CONFIG_BF561) | ||
39 | P0.H = hi(SICA_IWR1); | ||
40 | P0.L = lo(SICA_IWR1); | ||
41 | #elif defined(CONFIG_BF54x) || defined(CONFIG_BF52x) | ||
42 | P0.h = HI(SIC_IWR0); | ||
43 | P0.l = LO(SIC_IWR0); | ||
44 | #else | ||
45 | P0.h = HI(SIC_IWR); | ||
46 | P0.l = LO(SIC_IWR); | ||
47 | #endif | ||
48 | R7 = [P0]; | ||
49 | #if defined(CONFIG_BF561) | ||
50 | BITSET(R7, 27); | ||
51 | #else | ||
52 | BITSET(R7,(IRQ_WATCH - IVG7)); | ||
53 | #endif | ||
54 | [P0] = R7; | ||
55 | SSYNC; | ||
56 | |||
57 | ( R7:0, P5:0 ) = [SP++]; | ||
58 | RTS; | ||
59 | |||
60 | .LWRITE_TO_STAT: | ||
61 | /* When watch dog timer is enabled, a write to STAT will load the | ||
62 | * contents of CNT to STAT | ||
63 | */ | ||
64 | R7 = 0x0000(z); | ||
65 | #if defined(CONFIG_BF561) | ||
66 | P0.h = HI(WDOGA_STAT); | ||
67 | P0.l = LO(WDOGA_STAT); | ||
68 | #else | ||
69 | P0.h = HI(WDOG_STAT); | ||
70 | P0.l = LO(WDOG_STAT); | ||
71 | #endif | ||
72 | [P0] = R7; | ||
73 | SSYNC; | ||
74 | JUMP .LSKIP_WRITE_TO_STAT; | ||
75 | |||
76 | ENTRY(_program_wdog_timer) | ||
77 | [--SP] = ( R7:0, P5:0 ); | ||
78 | #if defined(CONFIG_BF561) | ||
79 | P0.h = HI(WDOGA_CNT); | ||
80 | P0.l = LO(WDOGA_CNT); | ||
81 | #else | ||
82 | P0.h = HI(WDOG_CNT); | ||
83 | P0.l = LO(WDOG_CNT); | ||
84 | #endif | ||
85 | [P0] = R0; | ||
86 | SSYNC; | ||
87 | |||
88 | #if defined(CONFIG_BF561) | ||
89 | P0.h = HI(WDOGA_CTL); | ||
90 | P0.l = LO(WDOGA_CTL); | ||
91 | #else | ||
92 | P0.h = HI(WDOG_CTL); | ||
93 | P0.l = LO(WDOG_CTL); | ||
94 | #endif | ||
95 | R7 = W[P0](Z); | ||
96 | CC = BITTST(R7,1); | ||
97 | if !CC JUMP .LWRITE_TO_STAT; | ||
98 | CC = BITTST(R7,2); | ||
99 | if !CC JUMP .LWRITE_TO_STAT; | ||
100 | |||
101 | .LSKIP_WRITE_TO_STAT: | ||
102 | #if defined(CONFIG_BF561) | ||
103 | P0.h = HI(WDOGA_CTL); | ||
104 | P0.l = LO(WDOGA_CTL); | ||
105 | #else | ||
106 | P0.h = HI(WDOG_CTL); | ||
107 | P0.l = LO(WDOG_CTL); | ||
108 | #endif | ||
109 | R7 = W[P0](Z); | ||
110 | BITCLR(R7,1); /* Enable GP event */ | ||
111 | BITSET(R7,2); | ||
112 | W[P0] = R7.L; | ||
113 | SSYNC; | ||
114 | NOP; | ||
115 | |||
116 | R7 = W[P0](Z); | ||
117 | BITCLR(R7,4); /* Enable the wdog counter */ | ||
118 | W[P0] = R7.L; | ||
119 | SSYNC; | ||
120 | |||
121 | ( R7:0, P5:0 ) = [SP++]; | ||
122 | RTS; | ||
123 | |||
124 | ENTRY(_clear_wdog_wakeup_evt) | ||
125 | [--SP] = ( R7:0, P5:0 ); | ||
126 | |||
127 | #if defined(CONFIG_BF561) | ||
128 | P0.h = HI(WDOGA_CTL); | ||
129 | P0.l = LO(WDOGA_CTL); | ||
130 | #else | ||
131 | P0.h = HI(WDOG_CTL); | ||
132 | P0.l = LO(WDOG_CTL); | ||
133 | #endif | ||
134 | R7 = 0x0AD6(Z); | ||
135 | W[P0] = R7.L; | ||
136 | SSYNC; | ||
137 | |||
138 | R7 = W[P0](Z); | ||
139 | BITSET(R7,15); | ||
140 | W[P0] = R7.L; | ||
141 | SSYNC; | ||
142 | |||
143 | R7 = W[P0](Z); | ||
144 | BITSET(R7,1); | ||
145 | BITSET(R7,2); | ||
146 | W[P0] = R7.L; | ||
147 | SSYNC; | ||
148 | |||
149 | ( R7:0, P5:0 ) = [SP++]; | ||
150 | RTS; | ||
151 | |||
152 | ENTRY(_disable_wdog_timer) | ||
153 | [--SP] = ( R7:0, P5:0 ); | ||
154 | #if defined(CONFIG_BF561) | ||
155 | P0.h = HI(WDOGA_CTL); | ||
156 | P0.l = LO(WDOGA_CTL); | ||
157 | #else | ||
158 | P0.h = HI(WDOG_CTL); | ||
159 | P0.l = LO(WDOG_CTL); | ||
160 | #endif | ||
161 | R7 = 0xAD6(Z); | ||
162 | W[P0] = R7.L; | ||
163 | SSYNC; | ||
164 | ( R7:0, P5:0 ) = [SP++]; | ||
165 | RTS; | ||
166 | |||
167 | #if !defined(CONFIG_BF561) | ||
168 | 34 | ||
169 | .section .l1.text | 35 | .section .l1.text |
170 | 36 | ||
@@ -459,10 +325,12 @@ ENTRY(_set_sic_iwr) | |||
459 | RTS; | 325 | RTS; |
460 | 326 | ||
461 | ENTRY(_set_rtc_istat) | 327 | ENTRY(_set_rtc_istat) |
328 | #ifndef CONFIG_BF561 | ||
462 | P0.H = hi(RTC_ISTAT); | 329 | P0.H = hi(RTC_ISTAT); |
463 | P0.L = lo(RTC_ISTAT); | 330 | P0.L = lo(RTC_ISTAT); |
464 | w[P0] = R0.L; | 331 | w[P0] = R0.L; |
465 | SSYNC; | 332 | SSYNC; |
333 | #endif | ||
466 | RTS; | 334 | RTS; |
467 | 335 | ||
468 | ENTRY(_test_pll_locked) | 336 | ENTRY(_test_pll_locked) |
@@ -473,4 +341,3 @@ ENTRY(_test_pll_locked) | |||
473 | CC = BITTST(R0,5); | 341 | CC = BITTST(R0,5); |
474 | IF !CC JUMP 1b; | 342 | IF !CC JUMP 1b; |
475 | RTS; | 343 | RTS; |
476 | #endif | ||
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index 2cbb7a0bc38e..cee54cebbc65 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
@@ -1369,7 +1369,7 @@ ENTRY(_sys_call_table) | |||
1369 | .long _sys_epoll_pwait | 1369 | .long _sys_epoll_pwait |
1370 | .long _sys_utimensat | 1370 | .long _sys_utimensat |
1371 | .long _sys_signalfd | 1371 | .long _sys_signalfd |
1372 | .long _sys_ni_syscall | 1372 | .long _sys_timerfd_create |
1373 | .long _sys_eventfd /* 350 */ | 1373 | .long _sys_eventfd /* 350 */ |
1374 | .long _sys_pread64 | 1374 | .long _sys_pread64 |
1375 | .long _sys_pwrite64 | 1375 | .long _sys_pwrite64 |
@@ -1378,6 +1378,9 @@ ENTRY(_sys_call_table) | |||
1378 | .long _sys_get_robust_list /* 355 */ | 1378 | .long _sys_get_robust_list /* 355 */ |
1379 | .long _sys_fallocate | 1379 | .long _sys_fallocate |
1380 | .long _sys_semtimedop | 1380 | .long _sys_semtimedop |
1381 | .long _sys_timerfd_settime | ||
1382 | .long _sys_timerfd_gettime | ||
1383 | |||
1381 | .rept NR_syscalls-(.-_sys_call_table)/4 | 1384 | .rept NR_syscalls-(.-_sys_call_table)/4 |
1382 | .long _sys_ni_syscall | 1385 | .long _sys_ni_syscall |
1383 | .endr | 1386 | .endr |
diff --git a/arch/blackfin/mach-common/ints-priority.c b/arch/blackfin/mach-common/ints-priority.c index 880595afe98d..225ef14af75e 100644 --- a/arch/blackfin/mach-common/ints-priority.c +++ b/arch/blackfin/mach-common/ints-priority.c | |||
@@ -74,7 +74,7 @@ unsigned long bfin_sic_iwr[3]; /* Up to 3 SIC_IWRx registers */ | |||
74 | #endif | 74 | #endif |
75 | 75 | ||
76 | struct ivgx { | 76 | struct ivgx { |
77 | /* irq number for request_irq, available in mach-bf533/irq.h */ | 77 | /* irq number for request_irq, available in mach-bf5xx/irq.h */ |
78 | unsigned int irqno; | 78 | unsigned int irqno; |
79 | /* corresponding bit in the SIC_ISR register */ | 79 | /* corresponding bit in the SIC_ISR register */ |
80 | unsigned int isrflag; | 80 | unsigned int isrflag; |
@@ -86,7 +86,6 @@ struct ivg_slice { | |||
86 | struct ivgx *istop; | 86 | struct ivgx *istop; |
87 | } ivg7_13[IVG13 - IVG7 + 1]; | 87 | } ivg7_13[IVG13 - IVG7 + 1]; |
88 | 88 | ||
89 | static void search_IAR(void); | ||
90 | 89 | ||
91 | /* | 90 | /* |
92 | * Search SIC_IAR and fill tables with the irqvalues | 91 | * Search SIC_IAR and fill tables with the irqvalues |
@@ -120,10 +119,10 @@ static void __init search_IAR(void) | |||
120 | } | 119 | } |
121 | 120 | ||
122 | /* | 121 | /* |
123 | * This is for BF533 internal IRQs | 122 | * This is for core internal IRQs |
124 | */ | 123 | */ |
125 | 124 | ||
126 | static void ack_noop(unsigned int irq) | 125 | static void bfin_ack_noop(unsigned int irq) |
127 | { | 126 | { |
128 | /* Dummy function. */ | 127 | /* Dummy function. */ |
129 | } | 128 | } |
@@ -156,11 +155,11 @@ static void bfin_internal_mask_irq(unsigned int irq) | |||
156 | { | 155 | { |
157 | #ifdef CONFIG_BF53x | 156 | #ifdef CONFIG_BF53x |
158 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() & | 157 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() & |
159 | ~(1 << (irq - (IRQ_CORETMR + 1)))); | 158 | ~(1 << SIC_SYSIRQ(irq))); |
160 | #else | 159 | #else |
161 | unsigned mask_bank, mask_bit; | 160 | unsigned mask_bank, mask_bit; |
162 | mask_bank = (irq - (IRQ_CORETMR + 1)) / 32; | 161 | mask_bank = SIC_SYSIRQ(irq) / 32; |
163 | mask_bit = (irq - (IRQ_CORETMR + 1)) % 32; | 162 | mask_bit = SIC_SYSIRQ(irq) % 32; |
164 | bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) & | 163 | bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) & |
165 | ~(1 << mask_bit)); | 164 | ~(1 << mask_bit)); |
166 | #endif | 165 | #endif |
@@ -171,11 +170,11 @@ static void bfin_internal_unmask_irq(unsigned int irq) | |||
171 | { | 170 | { |
172 | #ifdef CONFIG_BF53x | 171 | #ifdef CONFIG_BF53x |
173 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() | | 172 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() | |
174 | (1 << (irq - (IRQ_CORETMR + 1)))); | 173 | (1 << SIC_SYSIRQ(irq))); |
175 | #else | 174 | #else |
176 | unsigned mask_bank, mask_bit; | 175 | unsigned mask_bank, mask_bit; |
177 | mask_bank = (irq - (IRQ_CORETMR + 1)) / 32; | 176 | mask_bank = SIC_SYSIRQ(irq) / 32; |
178 | mask_bit = (irq - (IRQ_CORETMR + 1)) % 32; | 177 | mask_bit = SIC_SYSIRQ(irq) % 32; |
179 | bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) | | 178 | bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) | |
180 | (1 << mask_bit)); | 179 | (1 << mask_bit)); |
181 | #endif | 180 | #endif |
@@ -187,8 +186,8 @@ int bfin_internal_set_wake(unsigned int irq, unsigned int state) | |||
187 | { | 186 | { |
188 | unsigned bank, bit; | 187 | unsigned bank, bit; |
189 | unsigned long flags; | 188 | unsigned long flags; |
190 | bank = (irq - (IRQ_CORETMR + 1)) / 32; | 189 | bank = SIC_SYSIRQ(irq) / 32; |
191 | bit = (irq - (IRQ_CORETMR + 1)) % 32; | 190 | bit = SIC_SYSIRQ(irq) % 32; |
192 | 191 | ||
193 | local_irq_save(flags); | 192 | local_irq_save(flags); |
194 | 193 | ||
@@ -204,15 +203,18 @@ int bfin_internal_set_wake(unsigned int irq, unsigned int state) | |||
204 | #endif | 203 | #endif |
205 | 204 | ||
206 | static struct irq_chip bfin_core_irqchip = { | 205 | static struct irq_chip bfin_core_irqchip = { |
207 | .ack = ack_noop, | 206 | .ack = bfin_ack_noop, |
208 | .mask = bfin_core_mask_irq, | 207 | .mask = bfin_core_mask_irq, |
209 | .unmask = bfin_core_unmask_irq, | 208 | .unmask = bfin_core_unmask_irq, |
210 | }; | 209 | }; |
211 | 210 | ||
212 | static struct irq_chip bfin_internal_irqchip = { | 211 | static struct irq_chip bfin_internal_irqchip = { |
213 | .ack = ack_noop, | 212 | .ack = bfin_ack_noop, |
214 | .mask = bfin_internal_mask_irq, | 213 | .mask = bfin_internal_mask_irq, |
215 | .unmask = bfin_internal_unmask_irq, | 214 | .unmask = bfin_internal_unmask_irq, |
215 | .mask_ack = bfin_internal_mask_irq, | ||
216 | .disable = bfin_internal_mask_irq, | ||
217 | .enable = bfin_internal_unmask_irq, | ||
216 | #ifdef CONFIG_PM | 218 | #ifdef CONFIG_PM |
217 | .set_wake = bfin_internal_set_wake, | 219 | .set_wake = bfin_internal_set_wake, |
218 | #endif | 220 | #endif |
@@ -221,38 +223,23 @@ static struct irq_chip bfin_internal_irqchip = { | |||
221 | #ifdef BF537_GENERIC_ERROR_INT_DEMUX | 223 | #ifdef BF537_GENERIC_ERROR_INT_DEMUX |
222 | static int error_int_mask; | 224 | static int error_int_mask; |
223 | 225 | ||
224 | static void bfin_generic_error_ack_irq(unsigned int irq) | ||
225 | { | ||
226 | |||
227 | } | ||
228 | |||
229 | static void bfin_generic_error_mask_irq(unsigned int irq) | 226 | static void bfin_generic_error_mask_irq(unsigned int irq) |
230 | { | 227 | { |
231 | error_int_mask &= ~(1L << (irq - IRQ_PPI_ERROR)); | 228 | error_int_mask &= ~(1L << (irq - IRQ_PPI_ERROR)); |
232 | 229 | ||
233 | if (!error_int_mask) { | 230 | if (!error_int_mask) |
234 | local_irq_disable(); | 231 | bfin_internal_mask_irq(IRQ_GENERIC_ERROR); |
235 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() & | ||
236 | ~(1 << (IRQ_GENERIC_ERROR - | ||
237 | (IRQ_CORETMR + 1)))); | ||
238 | SSYNC(); | ||
239 | local_irq_enable(); | ||
240 | } | ||
241 | } | 232 | } |
242 | 233 | ||
243 | static void bfin_generic_error_unmask_irq(unsigned int irq) | 234 | static void bfin_generic_error_unmask_irq(unsigned int irq) |
244 | { | 235 | { |
245 | local_irq_disable(); | 236 | bfin_internal_unmask_irq(IRQ_GENERIC_ERROR); |
246 | bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() | 1 << | ||
247 | (IRQ_GENERIC_ERROR - (IRQ_CORETMR + 1))); | ||
248 | SSYNC(); | ||
249 | local_irq_enable(); | ||
250 | |||
251 | error_int_mask |= 1L << (irq - IRQ_PPI_ERROR); | 237 | error_int_mask |= 1L << (irq - IRQ_PPI_ERROR); |
252 | } | 238 | } |
253 | 239 | ||
254 | static struct irq_chip bfin_generic_error_irqchip = { | 240 | static struct irq_chip bfin_generic_error_irqchip = { |
255 | .ack = bfin_generic_error_ack_irq, | 241 | .ack = bfin_ack_noop, |
242 | .mask_ack = bfin_generic_error_mask_irq, | ||
256 | .mask = bfin_generic_error_mask_irq, | 243 | .mask = bfin_generic_error_mask_irq, |
257 | .unmask = bfin_generic_error_unmask_irq, | 244 | .unmask = bfin_generic_error_unmask_irq, |
258 | }; | 245 | }; |
@@ -608,7 +595,7 @@ static struct pin_int_t *pint[NR_PINT_SYS_IRQS] = { | |||
608 | (struct pin_int_t *)PINT3_MASK_SET, | 595 | (struct pin_int_t *)PINT3_MASK_SET, |
609 | }; | 596 | }; |
610 | 597 | ||
611 | unsigned short get_irq_base(u8 bank, u8 bmap) | 598 | inline unsigned short get_irq_base(u8 bank, u8 bmap) |
612 | { | 599 | { |
613 | 600 | ||
614 | u16 irq_base; | 601 | u16 irq_base; |
@@ -969,17 +956,12 @@ int __init init_arch_irq(void) | |||
969 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) | 956 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) |
970 | bfin_write_SIC_IMASK0(SIC_UNMASK_ALL); | 957 | bfin_write_SIC_IMASK0(SIC_UNMASK_ALL); |
971 | bfin_write_SIC_IMASK1(SIC_UNMASK_ALL); | 958 | bfin_write_SIC_IMASK1(SIC_UNMASK_ALL); |
972 | bfin_write_SIC_IWR0(IWR_ENABLE_ALL); | ||
973 | bfin_write_SIC_IWR1(IWR_ENABLE_ALL); | ||
974 | # ifdef CONFIG_BF54x | 959 | # ifdef CONFIG_BF54x |
975 | bfin_write_SIC_IMASK2(SIC_UNMASK_ALL); | 960 | bfin_write_SIC_IMASK2(SIC_UNMASK_ALL); |
976 | bfin_write_SIC_IWR2(IWR_ENABLE_ALL); | ||
977 | # endif | 961 | # endif |
978 | #else | 962 | #else |
979 | bfin_write_SIC_IMASK(SIC_UNMASK_ALL); | 963 | bfin_write_SIC_IMASK(SIC_UNMASK_ALL); |
980 | bfin_write_SIC_IWR(IWR_ENABLE_ALL); | ||
981 | #endif | 964 | #endif |
982 | SSYNC(); | ||
983 | 965 | ||
984 | local_irq_disable(); | 966 | local_irq_disable(); |
985 | 967 | ||
@@ -1001,90 +983,53 @@ int __init init_arch_irq(void) | |||
1001 | set_irq_chip(irq, &bfin_core_irqchip); | 983 | set_irq_chip(irq, &bfin_core_irqchip); |
1002 | else | 984 | else |
1003 | set_irq_chip(irq, &bfin_internal_irqchip); | 985 | set_irq_chip(irq, &bfin_internal_irqchip); |
1004 | #ifdef BF537_GENERIC_ERROR_INT_DEMUX | ||
1005 | if (irq != IRQ_GENERIC_ERROR) { | ||
1006 | #endif | ||
1007 | 986 | ||
1008 | switch (irq) { | 987 | switch (irq) { |
1009 | #if defined(CONFIG_BF53x) | 988 | #if defined(CONFIG_BF53x) |
1010 | case IRQ_PROG_INTA: | 989 | case IRQ_PROG_INTA: |
1011 | set_irq_chained_handler(irq, | ||
1012 | bfin_demux_gpio_irq); | ||
1013 | break; | ||
1014 | # if defined(BF537_FAMILY) && !(defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)) | 990 | # if defined(BF537_FAMILY) && !(defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)) |
1015 | case IRQ_MAC_RX: | 991 | case IRQ_MAC_RX: |
1016 | set_irq_chained_handler(irq, | ||
1017 | bfin_demux_gpio_irq); | ||
1018 | break; | ||
1019 | # endif | 992 | # endif |
1020 | #elif defined(CONFIG_BF54x) | 993 | #elif defined(CONFIG_BF54x) |
1021 | case IRQ_PINT0: | 994 | case IRQ_PINT0: |
1022 | set_irq_chained_handler(irq, | 995 | case IRQ_PINT1: |
1023 | bfin_demux_gpio_irq); | 996 | case IRQ_PINT2: |
1024 | break; | 997 | case IRQ_PINT3: |
1025 | case IRQ_PINT1: | ||
1026 | set_irq_chained_handler(irq, | ||
1027 | bfin_demux_gpio_irq); | ||
1028 | break; | ||
1029 | case IRQ_PINT2: | ||
1030 | set_irq_chained_handler(irq, | ||
1031 | bfin_demux_gpio_irq); | ||
1032 | break; | ||
1033 | case IRQ_PINT3: | ||
1034 | set_irq_chained_handler(irq, | ||
1035 | bfin_demux_gpio_irq); | ||
1036 | break; | ||
1037 | #elif defined(CONFIG_BF52x) | 998 | #elif defined(CONFIG_BF52x) |
1038 | case IRQ_PORTF_INTA: | 999 | case IRQ_PORTF_INTA: |
1039 | set_irq_chained_handler(irq, | 1000 | case IRQ_PORTG_INTA: |
1040 | bfin_demux_gpio_irq); | 1001 | case IRQ_PORTH_INTA: |
1041 | break; | ||
1042 | case IRQ_PORTG_INTA: | ||
1043 | set_irq_chained_handler(irq, | ||
1044 | bfin_demux_gpio_irq); | ||
1045 | break; | ||
1046 | case IRQ_PORTH_INTA: | ||
1047 | set_irq_chained_handler(irq, | ||
1048 | bfin_demux_gpio_irq); | ||
1049 | break; | ||
1050 | #elif defined(CONFIG_BF561) | 1002 | #elif defined(CONFIG_BF561) |
1051 | case IRQ_PROG0_INTA: | 1003 | case IRQ_PROG0_INTA: |
1052 | set_irq_chained_handler(irq, | 1004 | case IRQ_PROG1_INTA: |
1053 | bfin_demux_gpio_irq); | 1005 | case IRQ_PROG2_INTA: |
1054 | break; | ||
1055 | case IRQ_PROG1_INTA: | ||
1056 | set_irq_chained_handler(irq, | ||
1057 | bfin_demux_gpio_irq); | ||
1058 | break; | ||
1059 | case IRQ_PROG2_INTA: | ||
1060 | set_irq_chained_handler(irq, | ||
1061 | bfin_demux_gpio_irq); | ||
1062 | break; | ||
1063 | #endif | 1006 | #endif |
1064 | default: | 1007 | set_irq_chained_handler(irq, |
1065 | set_irq_handler(irq, handle_simple_irq); | 1008 | bfin_demux_gpio_irq); |
1066 | break; | 1009 | break; |
1067 | } | ||
1068 | |||
1069 | #ifdef BF537_GENERIC_ERROR_INT_DEMUX | 1010 | #ifdef BF537_GENERIC_ERROR_INT_DEMUX |
1070 | } else { | 1011 | case IRQ_GENERIC_ERROR: |
1071 | set_irq_handler(irq, bfin_demux_error_irq); | 1012 | set_irq_handler(irq, bfin_demux_error_irq); |
1072 | } | 1013 | |
1014 | break; | ||
1073 | #endif | 1015 | #endif |
1016 | default: | ||
1017 | set_irq_handler(irq, handle_simple_irq); | ||
1018 | break; | ||
1019 | } | ||
1074 | } | 1020 | } |
1021 | |||
1075 | #ifdef BF537_GENERIC_ERROR_INT_DEMUX | 1022 | #ifdef BF537_GENERIC_ERROR_INT_DEMUX |
1076 | for (irq = IRQ_PPI_ERROR; irq <= IRQ_UART1_ERROR; irq++) { | 1023 | for (irq = IRQ_PPI_ERROR; irq <= IRQ_UART1_ERROR; irq++) |
1077 | set_irq_chip(irq, &bfin_generic_error_irqchip); | 1024 | set_irq_chip_and_handler(irq, &bfin_generic_error_irqchip, |
1078 | set_irq_handler(irq, handle_level_irq); | 1025 | handle_level_irq); |
1079 | } | ||
1080 | #endif | 1026 | #endif |
1081 | 1027 | ||
1082 | for (irq = GPIO_IRQ_BASE; irq < NR_IRQS; irq++) { | 1028 | /* if configured as edge, then will be changed to do_edge_IRQ */ |
1029 | for (irq = GPIO_IRQ_BASE; irq < NR_IRQS; irq++) | ||
1030 | set_irq_chip_and_handler(irq, &bfin_gpio_irqchip, | ||
1031 | handle_level_irq); | ||
1083 | 1032 | ||
1084 | set_irq_chip(irq, &bfin_gpio_irqchip); | ||
1085 | /* if configured as edge, then will be changed to do_edge_IRQ */ | ||
1086 | set_irq_handler(irq, handle_level_irq); | ||
1087 | } | ||
1088 | 1033 | ||
1089 | bfin_write_IMASK(0); | 1034 | bfin_write_IMASK(0); |
1090 | CSYNC(); | 1035 | CSYNC(); |
@@ -1106,6 +1051,16 @@ int __init init_arch_irq(void) | |||
1106 | IMASK_IVG14 | IMASK_IVG13 | IMASK_IVG12 | IMASK_IVG11 | | 1051 | IMASK_IVG14 | IMASK_IVG13 | IMASK_IVG12 | IMASK_IVG11 | |
1107 | IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW; | 1052 | IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW; |
1108 | 1053 | ||
1054 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) | ||
1055 | bfin_write_SIC_IWR0(IWR_ENABLE_ALL); | ||
1056 | bfin_write_SIC_IWR1(IWR_ENABLE_ALL); | ||
1057 | # ifdef CONFIG_BF54x | ||
1058 | bfin_write_SIC_IWR2(IWR_ENABLE_ALL); | ||
1059 | # endif | ||
1060 | #else | ||
1061 | bfin_write_SIC_IWR(IWR_ENABLE_ALL); | ||
1062 | #endif | ||
1063 | |||
1109 | return 0; | 1064 | return 0; |
1110 | } | 1065 | } |
1111 | 1066 | ||
@@ -1122,7 +1077,6 @@ void do_irq(int vec, struct pt_regs *fp) | |||
1122 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) | 1077 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) |
1123 | unsigned long sic_status[3]; | 1078 | unsigned long sic_status[3]; |
1124 | 1079 | ||
1125 | SSYNC(); | ||
1126 | sic_status[0] = bfin_read_SIC_ISR0() & bfin_read_SIC_IMASK0(); | 1080 | sic_status[0] = bfin_read_SIC_ISR0() & bfin_read_SIC_IMASK0(); |
1127 | sic_status[1] = bfin_read_SIC_ISR1() & bfin_read_SIC_IMASK1(); | 1081 | sic_status[1] = bfin_read_SIC_ISR1() & bfin_read_SIC_IMASK1(); |
1128 | #ifdef CONFIG_BF54x | 1082 | #ifdef CONFIG_BF54x |
@@ -1138,7 +1092,7 @@ void do_irq(int vec, struct pt_regs *fp) | |||
1138 | } | 1092 | } |
1139 | #else | 1093 | #else |
1140 | unsigned long sic_status; | 1094 | unsigned long sic_status; |
1141 | SSYNC(); | 1095 | |
1142 | sic_status = bfin_read_SIC_IMASK() & bfin_read_SIC_ISR(); | 1096 | sic_status = bfin_read_SIC_IMASK() & bfin_read_SIC_ISR(); |
1143 | 1097 | ||
1144 | for (;; ivg++) { | 1098 | for (;; ivg++) { |
diff --git a/arch/blackfin/mm/init.c b/arch/blackfin/mm/init.c index 1f516c55bde6..ec3141fefd20 100644 --- a/arch/blackfin/mm/init.c +++ b/arch/blackfin/mm/init.c | |||
@@ -181,7 +181,7 @@ void __init mem_init(void) | |||
181 | } | 181 | } |
182 | } | 182 | } |
183 | 183 | ||
184 | static __init void free_init_pages(const char *what, unsigned long begin, unsigned long end) | 184 | static void __init free_init_pages(const char *what, unsigned long begin, unsigned long end) |
185 | { | 185 | { |
186 | unsigned long addr; | 186 | unsigned long addr; |
187 | /* next to check that the page we free is not a partial page */ | 187 | /* next to check that the page we free is not a partial page */ |
@@ -203,7 +203,7 @@ void __init free_initrd_mem(unsigned long start, unsigned long end) | |||
203 | } | 203 | } |
204 | #endif | 204 | #endif |
205 | 205 | ||
206 | void __init free_initmem(void) | 206 | void __init_refok free_initmem(void) |
207 | { | 207 | { |
208 | #if defined CONFIG_RAMKERNEL && !defined CONFIG_MPU | 208 | #if defined CONFIG_RAMKERNEL && !defined CONFIG_MPU |
209 | free_init_pages("unused kernel memory", | 209 | free_init_pages("unused kernel memory", |
diff --git a/arch/cris/arch-v10/kernel/time.c b/arch/cris/arch-v10/kernel/time.c index 9310a7b476e9..525483f0ddf8 100644 --- a/arch/cris/arch-v10/kernel/time.c +++ b/arch/cris/arch-v10/kernel/time.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/swap.h> | 13 | #include <linux/swap.h> |
14 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/vmstat.h> | 16 | #include <linux/mm.h> |
17 | #include <asm/arch/svinto.h> | 17 | #include <asm/arch/svinto.h> |
18 | #include <asm/types.h> | 18 | #include <asm/types.h> |
19 | #include <asm/signal.h> | 19 | #include <asm/signal.h> |
diff --git a/arch/cris/arch-v10/lib/string.c b/arch/cris/arch-v10/lib/string.c index 7161a2bef4fe..c7bd6ebdc93c 100644 --- a/arch/cris/arch-v10/lib/string.c +++ b/arch/cris/arch-v10/lib/string.c | |||
@@ -1,55 +1,59 @@ | |||
1 | /*#************************************************************************#*/ | 1 | /* A memcpy for CRIS. |
2 | /*#-------------------------------------------------------------------------*/ | 2 | Copyright (C) 1994-2005 Axis Communications. |
3 | /*# */ | 3 | All rights reserved. |
4 | /*# FUNCTION NAME: memcpy() */ | 4 | |
5 | /*# */ | 5 | Redistribution and use in source and binary forms, with or without |
6 | /*# PARAMETERS: void* dst; Destination address. */ | 6 | modification, are permitted provided that the following conditions |
7 | /*# void* src; Source address. */ | 7 | are met: |
8 | /*# int len; Number of bytes to copy. */ | 8 | |
9 | /*# */ | 9 | 1. Redistributions of source code must retain the above copyright |
10 | /*# RETURNS: dst. */ | 10 | notice, this list of conditions and the following disclaimer. |
11 | /*# */ | 11 | |
12 | /*# DESCRIPTION: Copies len bytes of memory from src to dst. No guarantees */ | 12 | 2. Neither the name of Axis Communications nor the names of its |
13 | /*# about copying of overlapping memory areas. This routine is */ | 13 | contributors may be used to endorse or promote products derived |
14 | /*# very sensitive to compiler changes in register allocation. */ | 14 | from this software without specific prior written permission. |
15 | /*# Should really be rewritten to avoid this problem. */ | 15 | |
16 | /*# */ | 16 | THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS |
17 | /*#-------------------------------------------------------------------------*/ | 17 | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 | /*# */ | 18 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 | /*# HISTORY */ | 19 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS |
20 | /*# */ | 20 | COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
21 | /*# DATE NAME CHANGES */ | 21 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
22 | /*# ---- ---- ------- */ | 22 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
23 | /*# 941007 Kenny R Creation */ | 23 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
24 | /*# 941011 Kenny R Lots of optimizations and inlining. */ | 24 | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
25 | /*# 941129 Ulf A Adapted for use in libc. */ | 25 | STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
26 | /*# 950216 HP N==0 forgotten if non-aligned src/dst. */ | 26 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
27 | /*# Added some optimizations. */ | 27 | POSSIBILITY OF SUCH DAMAGE. */ |
28 | /*# 001025 HP Make src and dst char *. Align dst to */ | 28 | |
29 | /*# dword, not just word-if-both-src-and-dst- */ | 29 | /* FIXME: This file should really only be used for reference, as the |
30 | /*# are-misaligned. */ | 30 | result is somewhat depending on gcc generating what we expect rather |
31 | /*# */ | 31 | than what we describe. An assembly file should be used instead. */ |
32 | /*#-------------------------------------------------------------------------*/ | 32 | |
33 | 33 | #include <stddef.h> | |
34 | #include <linux/types.h> | 34 | |
35 | 35 | /* Break even between movem and move16 is really at 38.7 * 2, but | |
36 | void *memcpy(void *pdst, | 36 | modulo 44, so up to the next multiple of 44, we use ordinary code. */ |
37 | const void *psrc, | 37 | #define MEMCPY_BY_BLOCK_THRESHOLD (44 * 2) |
38 | size_t pn) | 38 | |
39 | /* No name ambiguities in this file. */ | ||
40 | __asm__ (".syntax no_register_prefix"); | ||
41 | |||
42 | void * | ||
43 | memcpy(void *pdst, const void *psrc, size_t pn) | ||
39 | { | 44 | { |
40 | /* Ok. Now we want the parameters put in special registers. | 45 | /* Now we want the parameters put in special registers. |
41 | Make sure the compiler is able to make something useful of this. | 46 | Make sure the compiler is able to make something useful of this. |
42 | As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop). | 47 | As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop). |
43 | 48 | ||
44 | If gcc was alright, it really would need no temporaries, and no | 49 | If gcc was allright, it really would need no temporaries, and no |
45 | stack space to save stuff on. */ | 50 | stack space to save stuff on. */ |
46 | 51 | ||
47 | register void *return_dst __asm__ ("r10") = pdst; | 52 | register void *return_dst __asm__ ("r10") = pdst; |
48 | register char *dst __asm__ ("r13") = pdst; | 53 | register unsigned char *dst __asm__ ("r13") = pdst; |
49 | register const char *src __asm__ ("r11") = psrc; | 54 | register unsigned const char *src __asm__ ("r11") = psrc; |
50 | register int n __asm__ ("r12") = pn; | 55 | register int n __asm__ ("r12") = pn; |
51 | 56 | ||
52 | |||
53 | /* When src is aligned but not dst, this makes a few extra needless | 57 | /* When src is aligned but not dst, this makes a few extra needless |
54 | cycles. I believe it would take as many to check that the | 58 | cycles. I believe it would take as many to check that the |
55 | re-alignment was unnecessary. */ | 59 | re-alignment was unnecessary. */ |
@@ -59,167 +63,174 @@ void *memcpy(void *pdst, | |||
59 | && n >= 3) | 63 | && n >= 3) |
60 | { | 64 | { |
61 | if ((unsigned long) dst & 1) | 65 | if ((unsigned long) dst & 1) |
62 | { | 66 | { |
63 | n--; | 67 | n--; |
64 | *(char*)dst = *(char*)src; | 68 | *dst = *src; |
65 | src++; | 69 | src++; |
66 | dst++; | 70 | dst++; |
67 | } | 71 | } |
68 | 72 | ||
69 | if ((unsigned long) dst & 2) | 73 | if ((unsigned long) dst & 2) |
70 | { | 74 | { |
71 | n -= 2; | 75 | n -= 2; |
72 | *(short*)dst = *(short*)src; | 76 | *(short *) dst = *(short *) src; |
73 | src += 2; | 77 | src += 2; |
74 | dst += 2; | 78 | dst += 2; |
75 | } | 79 | } |
76 | } | 80 | } |
77 | 81 | ||
78 | /* Decide which copying method to use. */ | 82 | /* Decide which copying method to use. */ |
79 | if (n >= 44*2) /* Break even between movem and | 83 | if (n >= MEMCPY_BY_BLOCK_THRESHOLD) |
80 | move16 is at 38.7*2, but modulo 44. */ | 84 | { |
81 | { | 85 | /* It is not optimal to tell the compiler about clobbering any |
82 | /* For large copies we use 'movem' */ | 86 | registers; that will move the saving/restoring of those registers |
83 | 87 | to the function prologue/epilogue, and make non-movem sizes | |
84 | /* It is not optimal to tell the compiler about clobbering any | 88 | suboptimal. */ |
85 | registers; that will move the saving/restoring of those registers | 89 | __asm__ volatile |
86 | to the function prologue/epilogue, and make non-movem sizes | 90 | ("\ |
87 | suboptimal. | 91 | ;; GCC does promise correct register allocations, but let's \n\ |
88 | 92 | ;; make sure it keeps its promises. \n\ | |
89 | This method is not foolproof; it assumes that the "asm reg" | 93 | .ifnc %0-%1-%2,$r13-$r11-$r12 \n\ |
90 | declarations at the beginning of the function really are used | 94 | .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\" \n\ |
91 | here (beware: they may be moved to temporary registers). | 95 | .endif \n\ |
92 | This way, we do not have to save/move the registers around into | 96 | \n\ |
93 | temporaries; we can safely use them straight away. | 97 | ;; Save the registers we'll use in the movem process \n\ |
94 | 98 | ;; on the stack. \n\ | |
95 | If you want to check that the allocation was right; then | 99 | subq 11*4,sp \n\ |
96 | check the equalities in the first comment. It should say | 100 | movem r10,[sp] \n\ |
97 | "r13=r13, r11=r11, r12=r12" */ | ||
98 | __asm__ volatile ("\n\ | ||
99 | ;; Check that the following is true (same register names on \n\ | ||
100 | ;; both sides of equal sign, as in r8=r8): \n\ | ||
101 | ;; %0=r13, %1=r11, %2=r12 \n\ | ||
102 | ;; \n\ | ||
103 | ;; Save the registers we'll use in the movem process \n\ | ||
104 | ;; on the stack. \n\ | ||
105 | subq 11*4,$sp \n\ | ||
106 | movem $r10,[$sp] \n\ | ||
107 | \n\ | 101 | \n\ |
108 | ;; Now we've got this: \n\ | 102 | ;; Now we've got this: \n\ |
109 | ;; r11 - src \n\ | 103 | ;; r11 - src \n\ |
110 | ;; r13 - dst \n\ | 104 | ;; r13 - dst \n\ |
111 | ;; r12 - n \n\ | 105 | ;; r12 - n \n\ |
112 | \n\ | 106 | \n\ |
113 | ;; Update n for the first loop \n\ | 107 | ;; Update n for the first loop. \n\ |
114 | subq 44,$r12 \n\ | 108 | subq 44,r12 \n\ |
115 | 0: \n\ | 109 | 0: \n\ |
116 | movem [$r11+],$r10 \n\ | 110 | " |
117 | subq 44,$r12 \n\ | 111 | #ifdef __arch_common_v10_v32 |
118 | bge 0b \n\ | 112 | /* Cater to branch offset difference between v32 and v10. We |
119 | movem $r10,[$r13+] \n\ | 113 | assume the branch below has an 8-bit offset. */ |
114 | " setf\n" | ||
115 | #endif | ||
116 | " movem [r11+],r10 \n\ | ||
117 | subq 44,r12 \n\ | ||
118 | bge 0b \n\ | ||
119 | movem r10,[r13+] \n\ | ||
120 | \n\ | 120 | \n\ |
121 | addq 44,$r12 ;; compensate for last loop underflowing n \n\ | 121 | ;; Compensate for last loop underflowing n. \n\ |
122 | addq 44,r12 \n\ | ||
122 | \n\ | 123 | \n\ |
123 | ;; Restore registers from stack \n\ | 124 | ;; Restore registers from stack. \n\ |
124 | movem [$sp+],$r10" | 125 | movem [sp+],r10" |
125 | 126 | ||
126 | /* Outputs */ : "=r" (dst), "=r" (src), "=r" (n) | 127 | /* Outputs. */ |
127 | /* Inputs */ : "0" (dst), "1" (src), "2" (n)); | 128 | : "=r" (dst), "=r" (src), "=r" (n) |
128 | |||
129 | } | ||
130 | 129 | ||
131 | /* Either we directly starts copying, using dword copying | 130 | /* Inputs. */ |
132 | in a loop, or we copy as much as possible with 'movem' | 131 | : "0" (dst), "1" (src), "2" (n)); |
133 | and then the last block (<44 bytes) is copied here. | 132 | } |
134 | This will work since 'movem' will have updated src,dst,n. */ | ||
135 | 133 | ||
136 | while ( n >= 16 ) | 134 | while (n >= 16) |
137 | { | 135 | { |
138 | *((long*)dst)++ = *((long*)src)++; | 136 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
139 | *((long*)dst)++ = *((long*)src)++; | 137 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
140 | *((long*)dst)++ = *((long*)src)++; | 138 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
141 | *((long*)dst)++ = *((long*)src)++; | 139 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
142 | n -= 16; | 140 | |
143 | } | 141 | n -= 16; |
142 | } | ||
144 | 143 | ||
145 | /* A switch() is definitely the fastest although it takes a LOT of code. | ||
146 | * Particularly if you inline code this. | ||
147 | */ | ||
148 | switch (n) | 144 | switch (n) |
149 | { | 145 | { |
150 | case 0: | 146 | case 0: |
151 | break; | 147 | break; |
148 | |||
152 | case 1: | 149 | case 1: |
153 | *(char*)dst = *(char*)src; | 150 | *dst = *src; |
154 | break; | 151 | break; |
152 | |||
155 | case 2: | 153 | case 2: |
156 | *(short*)dst = *(short*)src; | 154 | *(short *) dst = *(short *) src; |
157 | break; | 155 | break; |
156 | |||
158 | case 3: | 157 | case 3: |
159 | *((short*)dst)++ = *((short*)src)++; | 158 | *(short *) dst = *(short *) src; dst += 2; src += 2; |
160 | *(char*)dst = *(char*)src; | 159 | *dst = *src; |
161 | break; | 160 | break; |
161 | |||
162 | case 4: | 162 | case 4: |
163 | *((long*)dst)++ = *((long*)src)++; | 163 | *(long *) dst = *(long *) src; |
164 | break; | 164 | break; |
165 | |||
165 | case 5: | 166 | case 5: |
166 | *((long*)dst)++ = *((long*)src)++; | 167 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
167 | *(char*)dst = *(char*)src; | 168 | *dst = *src; |
168 | break; | 169 | break; |
170 | |||
169 | case 6: | 171 | case 6: |
170 | *((long*)dst)++ = *((long*)src)++; | 172 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
171 | *(short*)dst = *(short*)src; | 173 | *(short *) dst = *(short *) src; |
172 | break; | 174 | break; |
175 | |||
173 | case 7: | 176 | case 7: |
174 | *((long*)dst)++ = *((long*)src)++; | 177 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
175 | *((short*)dst)++ = *((short*)src)++; | 178 | *(short *) dst = *(short *) src; dst += 2; src += 2; |
176 | *(char*)dst = *(char*)src; | 179 | *dst = *src; |
177 | break; | 180 | break; |
181 | |||
178 | case 8: | 182 | case 8: |
179 | *((long*)dst)++ = *((long*)src)++; | 183 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
180 | *((long*)dst)++ = *((long*)src)++; | 184 | *(long *) dst = *(long *) src; |
181 | break; | 185 | break; |
186 | |||
182 | case 9: | 187 | case 9: |
183 | *((long*)dst)++ = *((long*)src)++; | 188 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
184 | *((long*)dst)++ = *((long*)src)++; | 189 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
185 | *(char*)dst = *(char*)src; | 190 | *dst = *src; |
186 | break; | 191 | break; |
192 | |||
187 | case 10: | 193 | case 10: |
188 | *((long*)dst)++ = *((long*)src)++; | 194 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
189 | *((long*)dst)++ = *((long*)src)++; | 195 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
190 | *(short*)dst = *(short*)src; | 196 | *(short *) dst = *(short *) src; |
191 | break; | 197 | break; |
198 | |||
192 | case 11: | 199 | case 11: |
193 | *((long*)dst)++ = *((long*)src)++; | 200 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
194 | *((long*)dst)++ = *((long*)src)++; | 201 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
195 | *((short*)dst)++ = *((short*)src)++; | 202 | *(short *) dst = *(short *) src; dst += 2; src += 2; |
196 | *(char*)dst = *(char*)src; | 203 | *dst = *src; |
197 | break; | 204 | break; |
205 | |||
198 | case 12: | 206 | case 12: |
199 | *((long*)dst)++ = *((long*)src)++; | 207 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
200 | *((long*)dst)++ = *((long*)src)++; | 208 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
201 | *((long*)dst)++ = *((long*)src)++; | 209 | *(long *) dst = *(long *) src; |
202 | break; | 210 | break; |
211 | |||
203 | case 13: | 212 | case 13: |
204 | *((long*)dst)++ = *((long*)src)++; | 213 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
205 | *((long*)dst)++ = *((long*)src)++; | 214 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
206 | *((long*)dst)++ = *((long*)src)++; | 215 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
207 | *(char*)dst = *(char*)src; | 216 | *dst = *src; |
208 | break; | 217 | break; |
218 | |||
209 | case 14: | 219 | case 14: |
210 | *((long*)dst)++ = *((long*)src)++; | 220 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
211 | *((long*)dst)++ = *((long*)src)++; | 221 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
212 | *((long*)dst)++ = *((long*)src)++; | 222 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
213 | *(short*)dst = *(short*)src; | 223 | *(short *) dst = *(short *) src; |
214 | break; | 224 | break; |
225 | |||
215 | case 15: | 226 | case 15: |
216 | *((long*)dst)++ = *((long*)src)++; | 227 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
217 | *((long*)dst)++ = *((long*)src)++; | 228 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
218 | *((long*)dst)++ = *((long*)src)++; | 229 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
219 | *((short*)dst)++ = *((short*)src)++; | 230 | *(short *) dst = *(short *) src; dst += 2; src += 2; |
220 | *(char*)dst = *(char*)src; | 231 | *dst = *src; |
221 | break; | 232 | break; |
222 | } | 233 | } |
223 | 234 | ||
224 | return return_dst; /* destination pointer. */ | 235 | return return_dst; |
225 | } /* memcpy() */ | 236 | } |
diff --git a/arch/cris/arch-v10/lib/usercopy.c b/arch/cris/arch-v10/lib/usercopy.c index b8e6c0430e5b..b0a608da7bd1 100644 --- a/arch/cris/arch-v10/lib/usercopy.c +++ b/arch/cris/arch-v10/lib/usercopy.c | |||
@@ -193,7 +193,7 @@ __copy_user (void __user *pdst, const void *psrc, unsigned long pn) | |||
193 | inaccessible. */ | 193 | inaccessible. */ |
194 | 194 | ||
195 | unsigned long | 195 | unsigned long |
196 | __copy_user_zeroing (void __user *pdst, const void *psrc, unsigned long pn) | 196 | __copy_user_zeroing(void *pdst, const void __user *psrc, unsigned long pn) |
197 | { | 197 | { |
198 | /* We want the parameters put in special registers. | 198 | /* We want the parameters put in special registers. |
199 | Make sure the compiler is able to make something useful of this. | 199 | Make sure the compiler is able to make something useful of this. |
diff --git a/arch/cris/arch-v32/lib/string.c b/arch/cris/arch-v32/lib/string.c index 6740b2cebae5..c7bd6ebdc93c 100644 --- a/arch/cris/arch-v32/lib/string.c +++ b/arch/cris/arch-v32/lib/string.c | |||
@@ -1,55 +1,59 @@ | |||
1 | /*#************************************************************************#*/ | 1 | /* A memcpy for CRIS. |
2 | /*#-------------------------------------------------------------------------*/ | 2 | Copyright (C) 1994-2005 Axis Communications. |
3 | /*# */ | 3 | All rights reserved. |
4 | /*# FUNCTION NAME: memcpy() */ | 4 | |
5 | /*# */ | 5 | Redistribution and use in source and binary forms, with or without |
6 | /*# PARAMETERS: void* dst; Destination address. */ | 6 | modification, are permitted provided that the following conditions |
7 | /*# void* src; Source address. */ | 7 | are met: |
8 | /*# int len; Number of bytes to copy. */ | 8 | |
9 | /*# */ | 9 | 1. Redistributions of source code must retain the above copyright |
10 | /*# RETURNS: dst. */ | 10 | notice, this list of conditions and the following disclaimer. |
11 | /*# */ | 11 | |
12 | /*# DESCRIPTION: Copies len bytes of memory from src to dst. No guarantees */ | 12 | 2. Neither the name of Axis Communications nor the names of its |
13 | /*# about copying of overlapping memory areas. This routine is */ | 13 | contributors may be used to endorse or promote products derived |
14 | /*# very sensitive to compiler changes in register allocation. */ | 14 | from this software without specific prior written permission. |
15 | /*# Should really be rewritten to avoid this problem. */ | 15 | |
16 | /*# */ | 16 | THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS |
17 | /*#-------------------------------------------------------------------------*/ | 17 | ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 | /*# */ | 18 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 | /*# HISTORY */ | 19 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS |
20 | /*# */ | 20 | COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
21 | /*# DATE NAME CHANGES */ | 21 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
22 | /*# ---- ---- ------- */ | 22 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
23 | /*# 941007 Kenny R Creation */ | 23 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
24 | /*# 941011 Kenny R Lots of optimizations and inlining. */ | 24 | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
25 | /*# 941129 Ulf A Adapted for use in libc. */ | 25 | STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
26 | /*# 950216 HP N==0 forgotten if non-aligned src/dst. */ | 26 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
27 | /*# Added some optimizations. */ | 27 | POSSIBILITY OF SUCH DAMAGE. */ |
28 | /*# 001025 HP Make src and dst char *. Align dst to */ | 28 | |
29 | /*# dword, not just word-if-both-src-and-dst- */ | 29 | /* FIXME: This file should really only be used for reference, as the |
30 | /*# are-misaligned. */ | 30 | result is somewhat depending on gcc generating what we expect rather |
31 | /*# */ | 31 | than what we describe. An assembly file should be used instead. */ |
32 | /*#-------------------------------------------------------------------------*/ | 32 | |
33 | 33 | #include <stddef.h> | |
34 | #include <linux/types.h> | 34 | |
35 | 35 | /* Break even between movem and move16 is really at 38.7 * 2, but | |
36 | void *memcpy(void *pdst, | 36 | modulo 44, so up to the next multiple of 44, we use ordinary code. */ |
37 | const void *psrc, | 37 | #define MEMCPY_BY_BLOCK_THRESHOLD (44 * 2) |
38 | size_t pn) | 38 | |
39 | /* No name ambiguities in this file. */ | ||
40 | __asm__ (".syntax no_register_prefix"); | ||
41 | |||
42 | void * | ||
43 | memcpy(void *pdst, const void *psrc, size_t pn) | ||
39 | { | 44 | { |
40 | /* Ok. Now we want the parameters put in special registers. | 45 | /* Now we want the parameters put in special registers. |
41 | Make sure the compiler is able to make something useful of this. | 46 | Make sure the compiler is able to make something useful of this. |
42 | As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop). | 47 | As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop). |
43 | 48 | ||
44 | If gcc was alright, it really would need no temporaries, and no | 49 | If gcc was allright, it really would need no temporaries, and no |
45 | stack space to save stuff on. */ | 50 | stack space to save stuff on. */ |
46 | 51 | ||
47 | register void *return_dst __asm__ ("r10") = pdst; | 52 | register void *return_dst __asm__ ("r10") = pdst; |
48 | register char *dst __asm__ ("r13") = pdst; | 53 | register unsigned char *dst __asm__ ("r13") = pdst; |
49 | register const char *src __asm__ ("r11") = psrc; | 54 | register unsigned const char *src __asm__ ("r11") = psrc; |
50 | register int n __asm__ ("r12") = pn; | 55 | register int n __asm__ ("r12") = pn; |
51 | 56 | ||
52 | |||
53 | /* When src is aligned but not dst, this makes a few extra needless | 57 | /* When src is aligned but not dst, this makes a few extra needless |
54 | cycles. I believe it would take as many to check that the | 58 | cycles. I believe it would take as many to check that the |
55 | re-alignment was unnecessary. */ | 59 | re-alignment was unnecessary. */ |
@@ -59,161 +63,174 @@ void *memcpy(void *pdst, | |||
59 | && n >= 3) | 63 | && n >= 3) |
60 | { | 64 | { |
61 | if ((unsigned long) dst & 1) | 65 | if ((unsigned long) dst & 1) |
62 | { | 66 | { |
63 | n--; | 67 | n--; |
64 | *(char*)dst = *(char*)src; | 68 | *dst = *src; |
65 | src++; | 69 | src++; |
66 | dst++; | 70 | dst++; |
67 | } | 71 | } |
68 | 72 | ||
69 | if ((unsigned long) dst & 2) | 73 | if ((unsigned long) dst & 2) |
70 | { | 74 | { |
71 | n -= 2; | 75 | n -= 2; |
72 | *(short*)dst = *(short*)src; | 76 | *(short *) dst = *(short *) src; |
73 | src += 2; | 77 | src += 2; |
74 | dst += 2; | 78 | dst += 2; |
75 | } | 79 | } |
76 | } | 80 | } |
77 | 81 | ||
78 | /* Decide which copying method to use. Movem is dirt cheap, so the | 82 | /* Decide which copying method to use. */ |
79 | overheap is low enough to always use the minimum block size as the | 83 | if (n >= MEMCPY_BY_BLOCK_THRESHOLD) |
80 | threshold. */ | 84 | { |
81 | if (n >= 44) | 85 | /* It is not optimal to tell the compiler about clobbering any |
82 | { | 86 | registers; that will move the saving/restoring of those registers |
83 | /* For large copies we use 'movem' */ | 87 | to the function prologue/epilogue, and make non-movem sizes |
84 | 88 | suboptimal. */ | |
85 | /* It is not optimal to tell the compiler about clobbering any | 89 | __asm__ volatile |
86 | registers; that will move the saving/restoring of those registers | 90 | ("\ |
87 | to the function prologue/epilogue, and make non-movem sizes | 91 | ;; GCC does promise correct register allocations, but let's \n\ |
88 | suboptimal. */ | 92 | ;; make sure it keeps its promises. \n\ |
89 | __asm__ volatile (" \n\ | 93 | .ifnc %0-%1-%2,$r13-$r11-$r12 \n\ |
90 | ;; Check that the register asm declaration got right. \n\ | 94 | .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\" \n\ |
91 | ;; The GCC manual explicitly says TRT will happen. \n\ | 95 | .endif \n\ |
92 | .ifnc %0-%1-%2,$r13-$r11-$r12 \n\ | ||
93 | .err \n\ | ||
94 | .endif \n\ | ||
95 | \n\ | ||
96 | ;; Save the registers we'll use in the movem process \n\ | ||
97 | \n\ | 96 | \n\ |
98 | ;; on the stack. \n\ | 97 | ;; Save the registers we'll use in the movem process \n\ |
99 | subq 11*4,$sp \n\ | 98 | ;; on the stack. \n\ |
100 | movem $r10,[$sp] \n\ | 99 | subq 11*4,sp \n\ |
100 | movem r10,[sp] \n\ | ||
101 | \n\ | 101 | \n\ |
102 | ;; Now we've got this: \n\ | 102 | ;; Now we've got this: \n\ |
103 | ;; r11 - src \n\ | 103 | ;; r11 - src \n\ |
104 | ;; r13 - dst \n\ | 104 | ;; r13 - dst \n\ |
105 | ;; r12 - n \n\ | 105 | ;; r12 - n \n\ |
106 | \n\ | 106 | \n\ |
107 | ;; Update n for the first loop \n\ | 107 | ;; Update n for the first loop. \n\ |
108 | subq 44,$r12 \n\ | 108 | subq 44,r12 \n\ |
109 | 0: \n\ | 109 | 0: \n\ |
110 | movem [$r11+],$r10 \n\ | 110 | " |
111 | subq 44,$r12 \n\ | 111 | #ifdef __arch_common_v10_v32 |
112 | bge 0b \n\ | 112 | /* Cater to branch offset difference between v32 and v10. We |
113 | movem $r10,[$r13+] \n\ | 113 | assume the branch below has an 8-bit offset. */ |
114 | " setf\n" | ||
115 | #endif | ||
116 | " movem [r11+],r10 \n\ | ||
117 | subq 44,r12 \n\ | ||
118 | bge 0b \n\ | ||
119 | movem r10,[r13+] \n\ | ||
114 | \n\ | 120 | \n\ |
115 | addq 44,$r12 ;; compensate for last loop underflowing n \n\ | 121 | ;; Compensate for last loop underflowing n. \n\ |
122 | addq 44,r12 \n\ | ||
116 | \n\ | 123 | \n\ |
117 | ;; Restore registers from stack \n\ | 124 | ;; Restore registers from stack. \n\ |
118 | movem [$sp+],$r10" | 125 | movem [sp+],r10" |
119 | 126 | ||
120 | /* Outputs */ : "=r" (dst), "=r" (src), "=r" (n) | 127 | /* Outputs. */ |
121 | /* Inputs */ : "0" (dst), "1" (src), "2" (n)); | 128 | : "=r" (dst), "=r" (src), "=r" (n) |
122 | 129 | ||
123 | } | 130 | /* Inputs. */ |
131 | : "0" (dst), "1" (src), "2" (n)); | ||
132 | } | ||
124 | 133 | ||
125 | /* Either we directly starts copying, using dword copying | 134 | while (n >= 16) |
126 | in a loop, or we copy as much as possible with 'movem' | 135 | { |
127 | and then the last block (<44 bytes) is copied here. | 136 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
128 | This will work since 'movem' will have updated src,dst,n. */ | 137 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
138 | *(long *) dst = *(long *) src; dst += 4; src += 4; | ||
139 | *(long *) dst = *(long *) src; dst += 4; src += 4; | ||
129 | 140 | ||
130 | while ( n >= 16 ) | 141 | n -= 16; |
131 | { | 142 | } |
132 | *((long*)dst)++ = *((long*)src)++; | ||
133 | *((long*)dst)++ = *((long*)src)++; | ||
134 | *((long*)dst)++ = *((long*)src)++; | ||
135 | *((long*)dst)++ = *((long*)src)++; | ||
136 | n -= 16; | ||
137 | } | ||
138 | 143 | ||
139 | /* A switch() is definitely the fastest although it takes a LOT of code. | ||
140 | * Particularly if you inline code this. | ||
141 | */ | ||
142 | switch (n) | 144 | switch (n) |
143 | { | 145 | { |
144 | case 0: | 146 | case 0: |
145 | break; | 147 | break; |
148 | |||
146 | case 1: | 149 | case 1: |
147 | *(char*)dst = *(char*)src; | 150 | *dst = *src; |
148 | break; | 151 | break; |
152 | |||
149 | case 2: | 153 | case 2: |
150 | *(short*)dst = *(short*)src; | 154 | *(short *) dst = *(short *) src; |
151 | break; | 155 | break; |
156 | |||
152 | case 3: | 157 | case 3: |
153 | *((short*)dst)++ = *((short*)src)++; | 158 | *(short *) dst = *(short *) src; dst += 2; src += 2; |
154 | *(char*)dst = *(char*)src; | 159 | *dst = *src; |
155 | break; | 160 | break; |
161 | |||
156 | case 4: | 162 | case 4: |
157 | *((long*)dst)++ = *((long*)src)++; | 163 | *(long *) dst = *(long *) src; |
158 | break; | 164 | break; |
165 | |||
159 | case 5: | 166 | case 5: |
160 | *((long*)dst)++ = *((long*)src)++; | 167 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
161 | *(char*)dst = *(char*)src; | 168 | *dst = *src; |
162 | break; | 169 | break; |
170 | |||
163 | case 6: | 171 | case 6: |
164 | *((long*)dst)++ = *((long*)src)++; | 172 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
165 | *(short*)dst = *(short*)src; | 173 | *(short *) dst = *(short *) src; |
166 | break; | 174 | break; |
175 | |||
167 | case 7: | 176 | case 7: |
168 | *((long*)dst)++ = *((long*)src)++; | 177 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
169 | *((short*)dst)++ = *((short*)src)++; | 178 | *(short *) dst = *(short *) src; dst += 2; src += 2; |
170 | *(char*)dst = *(char*)src; | 179 | *dst = *src; |
171 | break; | 180 | break; |
181 | |||
172 | case 8: | 182 | case 8: |
173 | *((long*)dst)++ = *((long*)src)++; | 183 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
174 | *((long*)dst)++ = *((long*)src)++; | 184 | *(long *) dst = *(long *) src; |
175 | break; | 185 | break; |
186 | |||
176 | case 9: | 187 | case 9: |
177 | *((long*)dst)++ = *((long*)src)++; | 188 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
178 | *((long*)dst)++ = *((long*)src)++; | 189 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
179 | *(char*)dst = *(char*)src; | 190 | *dst = *src; |
180 | break; | 191 | break; |
192 | |||
181 | case 10: | 193 | case 10: |
182 | *((long*)dst)++ = *((long*)src)++; | 194 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
183 | *((long*)dst)++ = *((long*)src)++; | 195 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
184 | *(short*)dst = *(short*)src; | 196 | *(short *) dst = *(short *) src; |
185 | break; | 197 | break; |
198 | |||
186 | case 11: | 199 | case 11: |
187 | *((long*)dst)++ = *((long*)src)++; | 200 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
188 | *((long*)dst)++ = *((long*)src)++; | 201 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
189 | *((short*)dst)++ = *((short*)src)++; | 202 | *(short *) dst = *(short *) src; dst += 2; src += 2; |
190 | *(char*)dst = *(char*)src; | 203 | *dst = *src; |
191 | break; | 204 | break; |
205 | |||
192 | case 12: | 206 | case 12: |
193 | *((long*)dst)++ = *((long*)src)++; | 207 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
194 | *((long*)dst)++ = *((long*)src)++; | 208 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
195 | *((long*)dst)++ = *((long*)src)++; | 209 | *(long *) dst = *(long *) src; |
196 | break; | 210 | break; |
211 | |||
197 | case 13: | 212 | case 13: |
198 | *((long*)dst)++ = *((long*)src)++; | 213 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
199 | *((long*)dst)++ = *((long*)src)++; | 214 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
200 | *((long*)dst)++ = *((long*)src)++; | 215 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
201 | *(char*)dst = *(char*)src; | 216 | *dst = *src; |
202 | break; | 217 | break; |
218 | |||
203 | case 14: | 219 | case 14: |
204 | *((long*)dst)++ = *((long*)src)++; | 220 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
205 | *((long*)dst)++ = *((long*)src)++; | 221 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
206 | *((long*)dst)++ = *((long*)src)++; | 222 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
207 | *(short*)dst = *(short*)src; | 223 | *(short *) dst = *(short *) src; |
208 | break; | 224 | break; |
225 | |||
209 | case 15: | 226 | case 15: |
210 | *((long*)dst)++ = *((long*)src)++; | 227 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
211 | *((long*)dst)++ = *((long*)src)++; | 228 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
212 | *((long*)dst)++ = *((long*)src)++; | 229 | *(long *) dst = *(long *) src; dst += 4; src += 4; |
213 | *((short*)dst)++ = *((short*)src)++; | 230 | *(short *) dst = *(short *) src; dst += 2; src += 2; |
214 | *(char*)dst = *(char*)src; | 231 | *dst = *src; |
215 | break; | 232 | break; |
216 | } | 233 | } |
217 | 234 | ||
218 | return return_dst; /* destination pointer. */ | 235 | return return_dst; |
219 | } /* memcpy() */ | 236 | } |
diff --git a/arch/cris/arch-v32/lib/usercopy.c b/arch/cris/arch-v32/lib/usercopy.c index 04d0cf35a276..0b5b70d5f58a 100644 --- a/arch/cris/arch-v32/lib/usercopy.c +++ b/arch/cris/arch-v32/lib/usercopy.c | |||
@@ -161,7 +161,7 @@ __copy_user (void __user *pdst, const void *psrc, unsigned long pn) | |||
161 | inaccessible. */ | 161 | inaccessible. */ |
162 | 162 | ||
163 | unsigned long | 163 | unsigned long |
164 | __copy_user_zeroing (void __user *pdst, const void *psrc, unsigned long pn) | 164 | __copy_user_zeroing(void *pdst, const void __user *psrc, unsigned long pn) |
165 | { | 165 | { |
166 | /* We want the parameters put in special registers. | 166 | /* We want the parameters put in special registers. |
167 | Make sure the compiler is able to make something useful of this. | 167 | Make sure the compiler is able to make something useful of this. |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index dff9edfc7465..8fa3faf5ef1b 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -18,6 +18,7 @@ config IA64 | |||
18 | select HAVE_IDE | 18 | select HAVE_IDE |
19 | select HAVE_OPROFILE | 19 | select HAVE_OPROFILE |
20 | select HAVE_KPROBES | 20 | select HAVE_KPROBES |
21 | select HAVE_KRETPROBES | ||
21 | default y | 22 | default y |
22 | help | 23 | help |
23 | The Itanium Processor Family is Intel's 64-bit successor to | 24 | The Itanium Processor Family is Intel's 64-bit successor to |
@@ -155,6 +156,8 @@ config IA64_HP_ZX1_SWIOTLB | |||
155 | 156 | ||
156 | config IA64_SGI_SN2 | 157 | config IA64_SGI_SN2 |
157 | bool "SGI-SN2" | 158 | bool "SGI-SN2" |
159 | select NUMA | ||
160 | select ACPI_NUMA | ||
158 | help | 161 | help |
159 | Selecting this option will optimize the kernel for use on sn2 based | 162 | Selecting this option will optimize the kernel for use on sn2 based |
160 | systems, but the resulting kernel binary will not run on other | 163 | systems, but the resulting kernel binary will not run on other |
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index b916ccfdef84..f1645c4f7039 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile | |||
@@ -11,6 +11,8 @@ | |||
11 | # Copyright (C) 1998-2004 by David Mosberger-Tang <davidm@hpl.hp.com> | 11 | # Copyright (C) 1998-2004 by David Mosberger-Tang <davidm@hpl.hp.com> |
12 | # | 12 | # |
13 | 13 | ||
14 | KBUILD_DEFCONFIG := generic_defconfig | ||
15 | |||
14 | NM := $(CROSS_COMPILE)nm -B | 16 | NM := $(CROSS_COMPILE)nm -B |
15 | READELF := $(CROSS_COMPILE)readelf | 17 | READELF := $(CROSS_COMPILE)readelf |
16 | 18 | ||
diff --git a/arch/ia64/defconfig b/arch/ia64/configs/generic_defconfig index 0210545e7f61..0210545e7f61 100644 --- a/arch/ia64/defconfig +++ b/arch/ia64/configs/generic_defconfig | |||
diff --git a/arch/ia64/hp/common/hwsw_iommu.c b/arch/ia64/hp/common/hwsw_iommu.c index 94e57109fad6..8f6bcfe1dada 100644 --- a/arch/ia64/hp/common/hwsw_iommu.c +++ b/arch/ia64/hp/common/hwsw_iommu.c | |||
@@ -71,7 +71,7 @@ hwsw_init (void) | |||
71 | #ifdef CONFIG_IA64_GENERIC | 71 | #ifdef CONFIG_IA64_GENERIC |
72 | /* Better to have normal DMA than panic */ | 72 | /* Better to have normal DMA than panic */ |
73 | printk(KERN_WARNING "%s: Failed to initialize software I/O TLB," | 73 | printk(KERN_WARNING "%s: Failed to initialize software I/O TLB," |
74 | " reverting to hpzx1 platform vector\n", __FUNCTION__); | 74 | " reverting to hpzx1 platform vector\n", __func__); |
75 | machvec_init("hpzx1"); | 75 | machvec_init("hpzx1"); |
76 | #else | 76 | #else |
77 | panic("Unable to initialize software I/O TLB services"); | 77 | panic("Unable to initialize software I/O TLB services"); |
diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index a94445422cc6..523eae6d3e49 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c | |||
@@ -529,7 +529,7 @@ sba_search_bitmap(struct ioc *ioc, unsigned long bits_wanted, int use_hint) | |||
529 | base_mask = RESMAP_MASK(bits_wanted); | 529 | base_mask = RESMAP_MASK(bits_wanted); |
530 | mask = base_mask << bitshiftcnt; | 530 | mask = base_mask << bitshiftcnt; |
531 | 531 | ||
532 | DBG_RES("%s() o %ld %p", __FUNCTION__, o, res_ptr); | 532 | DBG_RES("%s() o %ld %p", __func__, o, res_ptr); |
533 | for(; res_ptr < res_end ; res_ptr++) | 533 | for(; res_ptr < res_end ; res_ptr++) |
534 | { | 534 | { |
535 | DBG_RES(" %p %lx %lx\n", res_ptr, mask, *res_ptr); | 535 | DBG_RES(" %p %lx %lx\n", res_ptr, mask, *res_ptr); |
@@ -679,7 +679,7 @@ sba_alloc_range(struct ioc *ioc, size_t size) | |||
679 | #endif | 679 | #endif |
680 | 680 | ||
681 | DBG_RES("%s(%x) %d -> %lx hint %x/%x\n", | 681 | DBG_RES("%s(%x) %d -> %lx hint %x/%x\n", |
682 | __FUNCTION__, size, pages_needed, pide, | 682 | __func__, size, pages_needed, pide, |
683 | (uint) ((unsigned long) ioc->res_hint - (unsigned long) ioc->res_map), | 683 | (uint) ((unsigned long) ioc->res_hint - (unsigned long) ioc->res_map), |
684 | ioc->res_bitshift ); | 684 | ioc->res_bitshift ); |
685 | 685 | ||
@@ -722,8 +722,8 @@ sba_free_range(struct ioc *ioc, dma_addr_t iova, size_t size) | |||
722 | m = RESMAP_MASK(bits_not_wanted) << (pide & (BITS_PER_LONG - 1)); | 722 | m = RESMAP_MASK(bits_not_wanted) << (pide & (BITS_PER_LONG - 1)); |
723 | bits_not_wanted = 0; | 723 | bits_not_wanted = 0; |
724 | 724 | ||
725 | DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", __FUNCTION__, (uint) iova, size, | 725 | DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", __func__, (uint) iova, size, |
726 | bits_not_wanted, m, pide, res_ptr, *res_ptr); | 726 | bits_not_wanted, m, pide, res_ptr, *res_ptr); |
727 | 727 | ||
728 | ASSERT(m != 0); | 728 | ASSERT(m != 0); |
729 | ASSERT(bits_not_wanted); | 729 | ASSERT(bits_not_wanted); |
@@ -940,8 +940,7 @@ sba_map_single(struct device *dev, void *addr, size_t size, int dir) | |||
940 | 940 | ||
941 | iovp = (dma_addr_t) pide << iovp_shift; | 941 | iovp = (dma_addr_t) pide << iovp_shift; |
942 | 942 | ||
943 | DBG_RUN("%s() 0x%p -> 0x%lx\n", | 943 | DBG_RUN("%s() 0x%p -> 0x%lx\n", __func__, addr, (long) iovp | offset); |
944 | __FUNCTION__, addr, (long) iovp | offset); | ||
945 | 944 | ||
946 | pdir_start = &(ioc->pdir_base[pide]); | 945 | pdir_start = &(ioc->pdir_base[pide]); |
947 | 946 | ||
@@ -1029,8 +1028,7 @@ void sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size, int dir) | |||
1029 | #endif | 1028 | #endif |
1030 | offset = iova & ~iovp_mask; | 1029 | offset = iova & ~iovp_mask; |
1031 | 1030 | ||
1032 | DBG_RUN("%s() iovp 0x%lx/%x\n", | 1031 | DBG_RUN("%s() iovp 0x%lx/%x\n", __func__, (long) iova, size); |
1033 | __FUNCTION__, (long) iova, size); | ||
1034 | 1032 | ||
1035 | iova ^= offset; /* clear offset bits */ | 1033 | iova ^= offset; /* clear offset bits */ |
1036 | size += offset; | 1034 | size += offset; |
@@ -1404,7 +1402,7 @@ int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int di | |||
1404 | struct scatterlist *sg; | 1402 | struct scatterlist *sg; |
1405 | #endif | 1403 | #endif |
1406 | 1404 | ||
1407 | DBG_RUN_SG("%s() START %d entries\n", __FUNCTION__, nents); | 1405 | DBG_RUN_SG("%s() START %d entries\n", __func__, nents); |
1408 | ioc = GET_IOC(dev); | 1406 | ioc = GET_IOC(dev); |
1409 | ASSERT(ioc); | 1407 | ASSERT(ioc); |
1410 | 1408 | ||
@@ -1468,7 +1466,7 @@ int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int di | |||
1468 | #endif | 1466 | #endif |
1469 | 1467 | ||
1470 | ASSERT(coalesced == filled); | 1468 | ASSERT(coalesced == filled); |
1471 | DBG_RUN_SG("%s() DONE %d mappings\n", __FUNCTION__, filled); | 1469 | DBG_RUN_SG("%s() DONE %d mappings\n", __func__, filled); |
1472 | 1470 | ||
1473 | return filled; | 1471 | return filled; |
1474 | } | 1472 | } |
@@ -1491,7 +1489,7 @@ void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, in | |||
1491 | #endif | 1489 | #endif |
1492 | 1490 | ||
1493 | DBG_RUN_SG("%s() START %d entries, %p,%x\n", | 1491 | DBG_RUN_SG("%s() START %d entries, %p,%x\n", |
1494 | __FUNCTION__, nents, sba_sg_address(sglist), sglist->length); | 1492 | __func__, nents, sba_sg_address(sglist), sglist->length); |
1495 | 1493 | ||
1496 | #ifdef ASSERT_PDIR_SANITY | 1494 | #ifdef ASSERT_PDIR_SANITY |
1497 | ioc = GET_IOC(dev); | 1495 | ioc = GET_IOC(dev); |
@@ -1509,7 +1507,7 @@ void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, in | |||
1509 | nents--; | 1507 | nents--; |
1510 | } | 1508 | } |
1511 | 1509 | ||
1512 | DBG_RUN_SG("%s() DONE (nents %d)\n", __FUNCTION__, nents); | 1510 | DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); |
1513 | 1511 | ||
1514 | #ifdef ASSERT_PDIR_SANITY | 1512 | #ifdef ASSERT_PDIR_SANITY |
1515 | spin_lock_irqsave(&ioc->res_lock, flags); | 1513 | spin_lock_irqsave(&ioc->res_lock, flags); |
@@ -1546,7 +1544,7 @@ ioc_iova_init(struct ioc *ioc) | |||
1546 | ioc->iov_size = ~ioc->imask + 1; | 1544 | ioc->iov_size = ~ioc->imask + 1; |
1547 | 1545 | ||
1548 | DBG_INIT("%s() hpa %p IOV base 0x%lx mask 0x%lx (%dMB)\n", | 1546 | DBG_INIT("%s() hpa %p IOV base 0x%lx mask 0x%lx (%dMB)\n", |
1549 | __FUNCTION__, ioc->ioc_hpa, ioc->ibase, ioc->imask, | 1547 | __func__, ioc->ioc_hpa, ioc->ibase, ioc->imask, |
1550 | ioc->iov_size >> 20); | 1548 | ioc->iov_size >> 20); |
1551 | 1549 | ||
1552 | switch (iovp_size) { | 1550 | switch (iovp_size) { |
@@ -1569,7 +1567,7 @@ ioc_iova_init(struct ioc *ioc) | |||
1569 | 1567 | ||
1570 | memset(ioc->pdir_base, 0, ioc->pdir_size); | 1568 | memset(ioc->pdir_base, 0, ioc->pdir_size); |
1571 | 1569 | ||
1572 | DBG_INIT("%s() IOV page size %ldK pdir %p size %x\n", __FUNCTION__, | 1570 | DBG_INIT("%s() IOV page size %ldK pdir %p size %x\n", __func__, |
1573 | iovp_size >> 10, ioc->pdir_base, ioc->pdir_size); | 1571 | iovp_size >> 10, ioc->pdir_base, ioc->pdir_size); |
1574 | 1572 | ||
1575 | ASSERT(ALIGN((unsigned long) ioc->pdir_base, 4*1024) == (unsigned long) ioc->pdir_base); | 1573 | ASSERT(ALIGN((unsigned long) ioc->pdir_base, 4*1024) == (unsigned long) ioc->pdir_base); |
@@ -1612,7 +1610,7 @@ ioc_iova_init(struct ioc *ioc) | |||
1612 | 1610 | ||
1613 | prefetch_spill_page = virt_to_phys(addr); | 1611 | prefetch_spill_page = virt_to_phys(addr); |
1614 | 1612 | ||
1615 | DBG_INIT("%s() prefetch spill addr: 0x%lx\n", __FUNCTION__, prefetch_spill_page); | 1613 | DBG_INIT("%s() prefetch spill addr: 0x%lx\n", __func__, prefetch_spill_page); |
1616 | } | 1614 | } |
1617 | /* | 1615 | /* |
1618 | ** Set all the PDIR entries valid w/ the spill page as the target | 1616 | ** Set all the PDIR entries valid w/ the spill page as the target |
@@ -1641,7 +1639,7 @@ ioc_resource_init(struct ioc *ioc) | |||
1641 | /* resource map size dictated by pdir_size */ | 1639 | /* resource map size dictated by pdir_size */ |
1642 | ioc->res_size = ioc->pdir_size / PDIR_ENTRY_SIZE; /* entries */ | 1640 | ioc->res_size = ioc->pdir_size / PDIR_ENTRY_SIZE; /* entries */ |
1643 | ioc->res_size >>= 3; /* convert bit count to byte count */ | 1641 | ioc->res_size >>= 3; /* convert bit count to byte count */ |
1644 | DBG_INIT("%s() res_size 0x%x\n", __FUNCTION__, ioc->res_size); | 1642 | DBG_INIT("%s() res_size 0x%x\n", __func__, ioc->res_size); |
1645 | 1643 | ||
1646 | ioc->res_map = (char *) __get_free_pages(GFP_KERNEL, | 1644 | ioc->res_map = (char *) __get_free_pages(GFP_KERNEL, |
1647 | get_order(ioc->res_size)); | 1645 | get_order(ioc->res_size)); |
@@ -1664,7 +1662,7 @@ ioc_resource_init(struct ioc *ioc) | |||
1664 | | prefetch_spill_page); | 1662 | | prefetch_spill_page); |
1665 | #endif | 1663 | #endif |
1666 | 1664 | ||
1667 | DBG_INIT("%s() res_map %x %p\n", __FUNCTION__, | 1665 | DBG_INIT("%s() res_map %x %p\n", __func__, |
1668 | ioc->res_size, (void *) ioc->res_map); | 1666 | ioc->res_size, (void *) ioc->res_map); |
1669 | } | 1667 | } |
1670 | 1668 | ||
@@ -1767,7 +1765,7 @@ ioc_init(u64 hpa, void *handle) | |||
1767 | iovp_size = (1 << iovp_shift); | 1765 | iovp_size = (1 << iovp_shift); |
1768 | iovp_mask = ~(iovp_size - 1); | 1766 | iovp_mask = ~(iovp_size - 1); |
1769 | 1767 | ||
1770 | DBG_INIT("%s: PAGE_SIZE %ldK, iovp_size %ldK\n", __FUNCTION__, | 1768 | DBG_INIT("%s: PAGE_SIZE %ldK, iovp_size %ldK\n", __func__, |
1771 | PAGE_SIZE >> 10, iovp_size >> 10); | 1769 | PAGE_SIZE >> 10, iovp_size >> 10); |
1772 | 1770 | ||
1773 | if (!ioc->name) { | 1771 | if (!ioc->name) { |
@@ -2137,7 +2135,7 @@ sba_page_override(char *str) | |||
2137 | break; | 2135 | break; |
2138 | default: | 2136 | default: |
2139 | printk("%s: unknown/unsupported iommu page size %ld\n", | 2137 | printk("%s: unknown/unsupported iommu page size %ld\n", |
2140 | __FUNCTION__, page_size); | 2138 | __func__, page_size); |
2141 | } | 2139 | } |
2142 | 2140 | ||
2143 | return 1; | 2141 | return 1; |
diff --git a/arch/ia64/hp/sim/simeth.c b/arch/ia64/hp/sim/simeth.c index 9898febf609a..969fe9f443c4 100644 --- a/arch/ia64/hp/sim/simeth.c +++ b/arch/ia64/hp/sim/simeth.c | |||
@@ -222,7 +222,7 @@ simeth_probe1(void) | |||
222 | } | 222 | } |
223 | 223 | ||
224 | if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0) | 224 | if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0) |
225 | panic("%s: out of interrupt vectors!\n", __FUNCTION__); | 225 | panic("%s: out of interrupt vectors!\n", __func__); |
226 | dev->irq = rc; | 226 | dev->irq = rc; |
227 | 227 | ||
228 | /* | 228 | /* |
diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c index ef252df50e1e..eb0c32a85fd7 100644 --- a/arch/ia64/hp/sim/simserial.c +++ b/arch/ia64/hp/sim/simserial.c | |||
@@ -1000,7 +1000,7 @@ simrs_init (void) | |||
1000 | if (!state->irq) { | 1000 | if (!state->irq) { |
1001 | if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0) | 1001 | if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0) |
1002 | panic("%s: out of interrupt vectors!\n", | 1002 | panic("%s: out of interrupt vectors!\n", |
1003 | __FUNCTION__); | 1003 | __func__); |
1004 | state->irq = rc; | 1004 | state->irq = rc; |
1005 | ia64_ssc_connect_irq(KEYBOARD_INTR, state->irq); | 1005 | ia64_ssc_connect_irq(KEYBOARD_INTR, state->irq); |
1006 | } | 1006 | } |
diff --git a/arch/ia64/ia32/ia32_signal.c b/arch/ia64/ia32/ia32_signal.c index 85e82f32e480..256a7faeda07 100644 --- a/arch/ia64/ia32/ia32_signal.c +++ b/arch/ia64/ia32/ia32_signal.c | |||
@@ -766,8 +766,19 @@ get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size) | |||
766 | 766 | ||
767 | /* This is the X/Open sanctioned signal stack switching. */ | 767 | /* This is the X/Open sanctioned signal stack switching. */ |
768 | if (ka->sa.sa_flags & SA_ONSTACK) { | 768 | if (ka->sa.sa_flags & SA_ONSTACK) { |
769 | if (!on_sig_stack(esp)) | 769 | int onstack = sas_ss_flags(esp); |
770 | |||
771 | if (onstack == 0) | ||
770 | esp = current->sas_ss_sp + current->sas_ss_size; | 772 | esp = current->sas_ss_sp + current->sas_ss_size; |
773 | else if (onstack == SS_ONSTACK) { | ||
774 | /* | ||
775 | * If we are on the alternate signal stack and would | ||
776 | * overflow it, don't. Return an always-bogus address | ||
777 | * instead so we will die with SIGSEGV. | ||
778 | */ | ||
779 | if (!likely(on_sig_stack(esp - frame_size))) | ||
780 | return (void __user *) -1L; | ||
781 | } | ||
771 | } | 782 | } |
772 | /* Legacy stack switching not supported */ | 783 | /* Legacy stack switching not supported */ |
773 | 784 | ||
diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c index d025a22eb225..b1bf51fe97b4 100644 --- a/arch/ia64/ia32/sys_ia32.c +++ b/arch/ia64/ia32/sys_ia32.c | |||
@@ -32,13 +32,8 @@ | |||
32 | #include <linux/shm.h> | 32 | #include <linux/shm.h> |
33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
34 | #include <linux/uio.h> | 34 | #include <linux/uio.h> |
35 | #include <linux/nfs_fs.h> | 35 | #include <linux/socket.h> |
36 | #include <linux/quota.h> | 36 | #include <linux/quota.h> |
37 | #include <linux/sunrpc/svc.h> | ||
38 | #include <linux/nfsd/nfsd.h> | ||
39 | #include <linux/nfsd/cache.h> | ||
40 | #include <linux/nfsd/xdr.h> | ||
41 | #include <linux/nfsd/syscall.h> | ||
42 | #include <linux/poll.h> | 37 | #include <linux/poll.h> |
43 | #include <linux/eventpoll.h> | 38 | #include <linux/eventpoll.h> |
44 | #include <linux/personality.h> | 39 | #include <linux/personality.h> |
diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c index f1cf2df97a2d..fbe742ad2fde 100644 --- a/arch/ia64/kernel/crash.c +++ b/arch/ia64/kernel/crash.c | |||
@@ -155,7 +155,7 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data) | |||
155 | if (val == DIE_INIT_MONARCH_LEAVE) | 155 | if (val == DIE_INIT_MONARCH_LEAVE) |
156 | ia64_mca_printk(KERN_NOTICE | 156 | ia64_mca_printk(KERN_NOTICE |
157 | "%s: kdump not configured\n", | 157 | "%s: kdump not configured\n", |
158 | __FUNCTION__); | 158 | __func__); |
159 | return NOTIFY_DONE; | 159 | return NOTIFY_DONE; |
160 | } | 160 | } |
161 | 161 | ||
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index 919070a9aed7..728d7247a1a6 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c | |||
@@ -379,8 +379,8 @@ efi_get_pal_addr (void) | |||
379 | * a dedicated ITR for the PAL code. | 379 | * a dedicated ITR for the PAL code. |
380 | */ | 380 | */ |
381 | if ((vaddr & mask) == (KERNEL_START & mask)) { | 381 | if ((vaddr & mask) == (KERNEL_START & mask)) { |
382 | printk(KERN_INFO "%s: no need to install ITR for " | 382 | printk(KERN_INFO "%s: no need to install ITR for PAL code\n", |
383 | "PAL code\n", __FUNCTION__); | 383 | __func__); |
384 | continue; | 384 | continue; |
385 | } | 385 | } |
386 | 386 | ||
@@ -399,7 +399,7 @@ efi_get_pal_addr (void) | |||
399 | return __va(md->phys_addr); | 399 | return __va(md->phys_addr); |
400 | } | 400 | } |
401 | printk(KERN_WARNING "%s: no PAL-code memory-descriptor found\n", | 401 | printk(KERN_WARNING "%s: no PAL-code memory-descriptor found\n", |
402 | __FUNCTION__); | 402 | __func__); |
403 | return NULL; | 403 | return NULL; |
404 | } | 404 | } |
405 | 405 | ||
@@ -543,12 +543,30 @@ efi_init (void) | |||
543 | for (i = 0, p = efi_map_start; p < efi_map_end; | 543 | for (i = 0, p = efi_map_start; p < efi_map_end; |
544 | ++i, p += efi_desc_size) | 544 | ++i, p += efi_desc_size) |
545 | { | 545 | { |
546 | const char *unit; | ||
547 | unsigned long size; | ||
548 | |||
546 | md = p; | 549 | md = p; |
547 | printk("mem%02u: type=%u, attr=0x%lx, " | 550 | size = md->num_pages << EFI_PAGE_SHIFT; |
548 | "range=[0x%016lx-0x%016lx) (%luMB)\n", | 551 | |
552 | if ((size >> 40) > 0) { | ||
553 | size >>= 40; | ||
554 | unit = "TB"; | ||
555 | } else if ((size >> 30) > 0) { | ||
556 | size >>= 30; | ||
557 | unit = "GB"; | ||
558 | } else if ((size >> 20) > 0) { | ||
559 | size >>= 20; | ||
560 | unit = "MB"; | ||
561 | } else { | ||
562 | size >>= 10; | ||
563 | unit = "KB"; | ||
564 | } | ||
565 | |||
566 | printk("mem%02d: type=%2u, attr=0x%016lx, " | ||
567 | "range=[0x%016lx-0x%016lx) (%4lu%s)\n", | ||
549 | i, md->type, md->attribute, md->phys_addr, | 568 | i, md->type, md->attribute, md->phys_addr, |
550 | md->phys_addr + efi_md_size(md), | 569 | md->phys_addr + efi_md_size(md), size, unit); |
551 | md->num_pages >> (20 - EFI_PAGE_SHIFT)); | ||
552 | } | 570 | } |
553 | } | 571 | } |
554 | #endif | 572 | #endif |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 398e2fd1cd25..082c31dcfd99 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -345,7 +345,7 @@ iosapic_set_affinity (unsigned int irq, cpumask_t mask) | |||
345 | if (cpus_empty(mask)) | 345 | if (cpus_empty(mask)) |
346 | return; | 346 | return; |
347 | 347 | ||
348 | if (reassign_irq_vector(irq, first_cpu(mask))) | 348 | if (irq_prepare_move(irq, first_cpu(mask))) |
349 | return; | 349 | return; |
350 | 350 | ||
351 | dest = cpu_physical_id(first_cpu(mask)); | 351 | dest = cpu_physical_id(first_cpu(mask)); |
@@ -397,6 +397,7 @@ iosapic_end_level_irq (unsigned int irq) | |||
397 | struct iosapic_rte_info *rte; | 397 | struct iosapic_rte_info *rte; |
398 | int do_unmask_irq = 0; | 398 | int do_unmask_irq = 0; |
399 | 399 | ||
400 | irq_complete_move(irq); | ||
400 | if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) { | 401 | if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) { |
401 | do_unmask_irq = 1; | 402 | do_unmask_irq = 1; |
402 | mask_irq(irq); | 403 | mask_irq(irq); |
@@ -450,6 +451,7 @@ iosapic_ack_edge_irq (unsigned int irq) | |||
450 | { | 451 | { |
451 | irq_desc_t *idesc = irq_desc + irq; | 452 | irq_desc_t *idesc = irq_desc + irq; |
452 | 453 | ||
454 | irq_complete_move(irq); | ||
453 | move_native_irq(irq); | 455 | move_native_irq(irq); |
454 | /* | 456 | /* |
455 | * Once we have recorded IRQ_PENDING already, we can mask the | 457 | * Once we have recorded IRQ_PENDING already, we can mask the |
@@ -532,7 +534,7 @@ iosapic_reassign_vector (int irq) | |||
532 | if (iosapic_intr_info[irq].count) { | 534 | if (iosapic_intr_info[irq].count) { |
533 | new_irq = create_irq(); | 535 | new_irq = create_irq(); |
534 | if (new_irq < 0) | 536 | if (new_irq < 0) |
535 | panic("%s: out of interrupt vectors!\n", __FUNCTION__); | 537 | panic("%s: out of interrupt vectors!\n", __func__); |
536 | printk(KERN_INFO "Reassigning vector %d to %d\n", | 538 | printk(KERN_INFO "Reassigning vector %d to %d\n", |
537 | irq_to_vector(irq), irq_to_vector(new_irq)); | 539 | irq_to_vector(irq), irq_to_vector(new_irq)); |
538 | memcpy(&iosapic_intr_info[new_irq], &iosapic_intr_info[irq], | 540 | memcpy(&iosapic_intr_info[new_irq], &iosapic_intr_info[irq], |
@@ -597,7 +599,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery, | |||
597 | index = find_iosapic(gsi); | 599 | index = find_iosapic(gsi); |
598 | if (index < 0) { | 600 | if (index < 0) { |
599 | printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n", | 601 | printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n", |
600 | __FUNCTION__, gsi); | 602 | __func__, gsi); |
601 | return -ENODEV; | 603 | return -ENODEV; |
602 | } | 604 | } |
603 | 605 | ||
@@ -606,7 +608,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery, | |||
606 | rte = iosapic_alloc_rte(); | 608 | rte = iosapic_alloc_rte(); |
607 | if (!rte) { | 609 | if (!rte) { |
608 | printk(KERN_WARNING "%s: cannot allocate memory\n", | 610 | printk(KERN_WARNING "%s: cannot allocate memory\n", |
609 | __FUNCTION__); | 611 | __func__); |
610 | return -ENOMEM; | 612 | return -ENOMEM; |
611 | } | 613 | } |
612 | 614 | ||
@@ -623,7 +625,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery, | |||
623 | (info->trigger != trigger || info->polarity != polarity)){ | 625 | (info->trigger != trigger || info->polarity != polarity)){ |
624 | printk (KERN_WARNING | 626 | printk (KERN_WARNING |
625 | "%s: cannot override the interrupt\n", | 627 | "%s: cannot override the interrupt\n", |
626 | __FUNCTION__); | 628 | __func__); |
627 | return -EINVAL; | 629 | return -EINVAL; |
628 | } | 630 | } |
629 | rte->refcnt++; | 631 | rte->refcnt++; |
@@ -645,7 +647,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery, | |||
645 | if (idesc->chip != &no_irq_type) | 647 | if (idesc->chip != &no_irq_type) |
646 | printk(KERN_WARNING | 648 | printk(KERN_WARNING |
647 | "%s: changing vector %d from %s to %s\n", | 649 | "%s: changing vector %d from %s to %s\n", |
648 | __FUNCTION__, irq_to_vector(irq), | 650 | __func__, irq_to_vector(irq), |
649 | idesc->chip->name, irq_type->name); | 651 | idesc->chip->name, irq_type->name); |
650 | idesc->chip = irq_type; | 652 | idesc->chip = irq_type; |
651 | } | 653 | } |
@@ -918,7 +920,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi, | |||
918 | case ACPI_INTERRUPT_INIT: | 920 | case ACPI_INTERRUPT_INIT: |
919 | irq = create_irq(); | 921 | irq = create_irq(); |
920 | if (irq < 0) | 922 | if (irq < 0) |
921 | panic("%s: out of interrupt vectors!\n", __FUNCTION__); | 923 | panic("%s: out of interrupt vectors!\n", __func__); |
922 | vector = irq_to_vector(irq); | 924 | vector = irq_to_vector(irq); |
923 | delivery = IOSAPIC_INIT; | 925 | delivery = IOSAPIC_INIT; |
924 | break; | 926 | break; |
@@ -929,7 +931,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi, | |||
929 | mask = 1; | 931 | mask = 1; |
930 | break; | 932 | break; |
931 | default: | 933 | default: |
932 | printk(KERN_ERR "%s: invalid int type 0x%x\n", __FUNCTION__, | 934 | printk(KERN_ERR "%s: invalid int type 0x%x\n", __func__, |
933 | int_type); | 935 | int_type); |
934 | return -1; | 936 | return -1; |
935 | } | 937 | } |
@@ -994,7 +996,7 @@ iosapic_system_init (int system_pcat_compat) | |||
994 | */ | 996 | */ |
995 | printk(KERN_INFO | 997 | printk(KERN_INFO |
996 | "%s: Disabling PC-AT compatible 8259 interrupts\n", | 998 | "%s: Disabling PC-AT compatible 8259 interrupts\n", |
997 | __FUNCTION__); | 999 | __func__); |
998 | outb(0xff, 0xA1); | 1000 | outb(0xff, 0xA1); |
999 | outb(0xff, 0x21); | 1001 | outb(0xff, 0x21); |
1000 | } | 1002 | } |
@@ -1009,7 +1011,7 @@ iosapic_alloc (void) | |||
1009 | if (!iosapic_lists[index].addr) | 1011 | if (!iosapic_lists[index].addr) |
1010 | return index; | 1012 | return index; |
1011 | 1013 | ||
1012 | printk(KERN_WARNING "%s: failed to allocate iosapic\n", __FUNCTION__); | 1014 | printk(KERN_WARNING "%s: failed to allocate iosapic\n", __func__); |
1013 | return -1; | 1015 | return -1; |
1014 | } | 1016 | } |
1015 | 1017 | ||
@@ -1107,14 +1109,14 @@ iosapic_remove (unsigned int gsi_base) | |||
1107 | index = find_iosapic(gsi_base); | 1109 | index = find_iosapic(gsi_base); |
1108 | if (index < 0) { | 1110 | if (index < 0) { |
1109 | printk(KERN_WARNING "%s: No IOSAPIC for GSI base %u\n", | 1111 | printk(KERN_WARNING "%s: No IOSAPIC for GSI base %u\n", |
1110 | __FUNCTION__, gsi_base); | 1112 | __func__, gsi_base); |
1111 | goto out; | 1113 | goto out; |
1112 | } | 1114 | } |
1113 | 1115 | ||
1114 | if (iosapic_lists[index].rtes_inuse) { | 1116 | if (iosapic_lists[index].rtes_inuse) { |
1115 | err = -EBUSY; | 1117 | err = -EBUSY; |
1116 | printk(KERN_WARNING "%s: IOSAPIC for GSI base %u is busy\n", | 1118 | printk(KERN_WARNING "%s: IOSAPIC for GSI base %u is busy\n", |
1117 | __FUNCTION__, gsi_base); | 1119 | __func__, gsi_base); |
1118 | goto out; | 1120 | goto out; |
1119 | } | 1121 | } |
1120 | 1122 | ||
@@ -1135,7 +1137,7 @@ map_iosapic_to_node(unsigned int gsi_base, int node) | |||
1135 | index = find_iosapic(gsi_base); | 1137 | index = find_iosapic(gsi_base); |
1136 | if (index < 0) { | 1138 | if (index < 0) { |
1137 | printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n", | 1139 | printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n", |
1138 | __FUNCTION__, gsi_base); | 1140 | __func__, gsi_base); |
1139 | return; | 1141 | return; |
1140 | } | 1142 | } |
1141 | iosapic_lists[index].node = node; | 1143 | iosapic_lists[index].node = node; |
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index 0b52f19ed046..d8be23fbe6bc 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -260,6 +260,8 @@ void __setup_vector_irq(int cpu) | |||
260 | } | 260 | } |
261 | 261 | ||
262 | #if defined(CONFIG_SMP) && (defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG)) | 262 | #if defined(CONFIG_SMP) && (defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG)) |
263 | #define IA64_IRQ_MOVE_VECTOR IA64_DEF_FIRST_DEVICE_VECTOR | ||
264 | |||
263 | static enum vector_domain_type { | 265 | static enum vector_domain_type { |
264 | VECTOR_DOMAIN_NONE, | 266 | VECTOR_DOMAIN_NONE, |
265 | VECTOR_DOMAIN_PERCPU | 267 | VECTOR_DOMAIN_PERCPU |
@@ -272,6 +274,101 @@ static cpumask_t vector_allocation_domain(int cpu) | |||
272 | return CPU_MASK_ALL; | 274 | return CPU_MASK_ALL; |
273 | } | 275 | } |
274 | 276 | ||
277 | static int __irq_prepare_move(int irq, int cpu) | ||
278 | { | ||
279 | struct irq_cfg *cfg = &irq_cfg[irq]; | ||
280 | int vector; | ||
281 | cpumask_t domain; | ||
282 | |||
283 | if (cfg->move_in_progress || cfg->move_cleanup_count) | ||
284 | return -EBUSY; | ||
285 | if (cfg->vector == IRQ_VECTOR_UNASSIGNED || !cpu_online(cpu)) | ||
286 | return -EINVAL; | ||
287 | if (cpu_isset(cpu, cfg->domain)) | ||
288 | return 0; | ||
289 | domain = vector_allocation_domain(cpu); | ||
290 | vector = find_unassigned_vector(domain); | ||
291 | if (vector < 0) | ||
292 | return -ENOSPC; | ||
293 | cfg->move_in_progress = 1; | ||
294 | cfg->old_domain = cfg->domain; | ||
295 | cfg->vector = IRQ_VECTOR_UNASSIGNED; | ||
296 | cfg->domain = CPU_MASK_NONE; | ||
297 | BUG_ON(__bind_irq_vector(irq, vector, domain)); | ||
298 | return 0; | ||
299 | } | ||
300 | |||
301 | int irq_prepare_move(int irq, int cpu) | ||
302 | { | ||
303 | unsigned long flags; | ||
304 | int ret; | ||
305 | |||
306 | spin_lock_irqsave(&vector_lock, flags); | ||
307 | ret = __irq_prepare_move(irq, cpu); | ||
308 | spin_unlock_irqrestore(&vector_lock, flags); | ||
309 | return ret; | ||
310 | } | ||
311 | |||
312 | void irq_complete_move(unsigned irq) | ||
313 | { | ||
314 | struct irq_cfg *cfg = &irq_cfg[irq]; | ||
315 | cpumask_t cleanup_mask; | ||
316 | int i; | ||
317 | |||
318 | if (likely(!cfg->move_in_progress)) | ||
319 | return; | ||
320 | |||
321 | if (unlikely(cpu_isset(smp_processor_id(), cfg->old_domain))) | ||
322 | return; | ||
323 | |||
324 | cpus_and(cleanup_mask, cfg->old_domain, cpu_online_map); | ||
325 | cfg->move_cleanup_count = cpus_weight(cleanup_mask); | ||
326 | for_each_cpu_mask(i, cleanup_mask) | ||
327 | platform_send_ipi(i, IA64_IRQ_MOVE_VECTOR, IA64_IPI_DM_INT, 0); | ||
328 | cfg->move_in_progress = 0; | ||
329 | } | ||
330 | |||
331 | static irqreturn_t smp_irq_move_cleanup_interrupt(int irq, void *dev_id) | ||
332 | { | ||
333 | int me = smp_processor_id(); | ||
334 | ia64_vector vector; | ||
335 | unsigned long flags; | ||
336 | |||
337 | for (vector = IA64_FIRST_DEVICE_VECTOR; | ||
338 | vector < IA64_LAST_DEVICE_VECTOR; vector++) { | ||
339 | int irq; | ||
340 | struct irq_desc *desc; | ||
341 | struct irq_cfg *cfg; | ||
342 | irq = __get_cpu_var(vector_irq)[vector]; | ||
343 | if (irq < 0) | ||
344 | continue; | ||
345 | |||
346 | desc = irq_desc + irq; | ||
347 | cfg = irq_cfg + irq; | ||
348 | spin_lock(&desc->lock); | ||
349 | if (!cfg->move_cleanup_count) | ||
350 | goto unlock; | ||
351 | |||
352 | if (!cpu_isset(me, cfg->old_domain)) | ||
353 | goto unlock; | ||
354 | |||
355 | spin_lock_irqsave(&vector_lock, flags); | ||
356 | __get_cpu_var(vector_irq)[vector] = -1; | ||
357 | cpu_clear(me, vector_table[vector]); | ||
358 | spin_unlock_irqrestore(&vector_lock, flags); | ||
359 | cfg->move_cleanup_count--; | ||
360 | unlock: | ||
361 | spin_unlock(&desc->lock); | ||
362 | } | ||
363 | return IRQ_HANDLED; | ||
364 | } | ||
365 | |||
366 | static struct irqaction irq_move_irqaction = { | ||
367 | .handler = smp_irq_move_cleanup_interrupt, | ||
368 | .flags = IRQF_DISABLED, | ||
369 | .name = "irq_move" | ||
370 | }; | ||
371 | |||
275 | static int __init parse_vector_domain(char *arg) | 372 | static int __init parse_vector_domain(char *arg) |
276 | { | 373 | { |
277 | if (!arg) | 374 | if (!arg) |
@@ -303,36 +400,6 @@ void destroy_and_reserve_irq(unsigned int irq) | |||
303 | spin_unlock_irqrestore(&vector_lock, flags); | 400 | spin_unlock_irqrestore(&vector_lock, flags); |
304 | } | 401 | } |
305 | 402 | ||
306 | static int __reassign_irq_vector(int irq, int cpu) | ||
307 | { | ||
308 | struct irq_cfg *cfg = &irq_cfg[irq]; | ||
309 | int vector; | ||
310 | cpumask_t domain; | ||
311 | |||
312 | if (cfg->vector == IRQ_VECTOR_UNASSIGNED || !cpu_online(cpu)) | ||
313 | return -EINVAL; | ||
314 | if (cpu_isset(cpu, cfg->domain)) | ||
315 | return 0; | ||
316 | domain = vector_allocation_domain(cpu); | ||
317 | vector = find_unassigned_vector(domain); | ||
318 | if (vector < 0) | ||
319 | return -ENOSPC; | ||
320 | __clear_irq_vector(irq); | ||
321 | BUG_ON(__bind_irq_vector(irq, vector, domain)); | ||
322 | return 0; | ||
323 | } | ||
324 | |||
325 | int reassign_irq_vector(int irq, int cpu) | ||
326 | { | ||
327 | unsigned long flags; | ||
328 | int ret; | ||
329 | |||
330 | spin_lock_irqsave(&vector_lock, flags); | ||
331 | ret = __reassign_irq_vector(irq, cpu); | ||
332 | spin_unlock_irqrestore(&vector_lock, flags); | ||
333 | return ret; | ||
334 | } | ||
335 | |||
336 | /* | 403 | /* |
337 | * Dynamic irq allocate and deallocation for MSI | 404 | * Dynamic irq allocate and deallocation for MSI |
338 | */ | 405 | */ |
@@ -440,7 +507,7 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs) | |||
440 | if (unlikely(irq < 0)) { | 507 | if (unlikely(irq < 0)) { |
441 | printk(KERN_ERR "%s: Unexpected interrupt " | 508 | printk(KERN_ERR "%s: Unexpected interrupt " |
442 | "vector %d on CPU %d is not mapped " | 509 | "vector %d on CPU %d is not mapped " |
443 | "to any IRQ!\n", __FUNCTION__, vector, | 510 | "to any IRQ!\n", __func__, vector, |
444 | smp_processor_id()); | 511 | smp_processor_id()); |
445 | } else | 512 | } else |
446 | generic_handle_irq(irq); | 513 | generic_handle_irq(irq); |
@@ -505,7 +572,7 @@ void ia64_process_pending_intr(void) | |||
505 | if (unlikely(irq < 0)) { | 572 | if (unlikely(irq < 0)) { |
506 | printk(KERN_ERR "%s: Unexpected interrupt " | 573 | printk(KERN_ERR "%s: Unexpected interrupt " |
507 | "vector %d on CPU %d not being mapped " | 574 | "vector %d on CPU %d not being mapped " |
508 | "to any IRQ!!\n", __FUNCTION__, vector, | 575 | "to any IRQ!!\n", __func__, vector, |
509 | smp_processor_id()); | 576 | smp_processor_id()); |
510 | } else { | 577 | } else { |
511 | vectors_in_migration[irq]=0; | 578 | vectors_in_migration[irq]=0; |
@@ -578,6 +645,13 @@ init_IRQ (void) | |||
578 | register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction); | 645 | register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction); |
579 | register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction); | 646 | register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction); |
580 | register_percpu_irq(IA64_IPI_LOCAL_TLB_FLUSH, &tlb_irqaction); | 647 | register_percpu_irq(IA64_IPI_LOCAL_TLB_FLUSH, &tlb_irqaction); |
648 | #if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG) | ||
649 | if (vector_domain_type != VECTOR_DOMAIN_NONE) { | ||
650 | BUG_ON(IA64_FIRST_DEVICE_VECTOR != IA64_IRQ_MOVE_VECTOR); | ||
651 | IA64_FIRST_DEVICE_VECTOR++; | ||
652 | register_percpu_irq(IA64_IRQ_MOVE_VECTOR, &irq_move_irqaction); | ||
653 | } | ||
654 | #endif | ||
581 | #endif | 655 | #endif |
582 | #ifdef CONFIG_PERFMON | 656 | #ifdef CONFIG_PERFMON |
583 | pfm_init_percpu(); | 657 | pfm_init_percpu(); |
@@ -592,11 +666,7 @@ ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect) | |||
592 | unsigned long ipi_data; | 666 | unsigned long ipi_data; |
593 | unsigned long phys_cpu_id; | 667 | unsigned long phys_cpu_id; |
594 | 668 | ||
595 | #ifdef CONFIG_SMP | ||
596 | phys_cpu_id = cpu_physical_id(cpu); | 669 | phys_cpu_id = cpu_physical_id(cpu); |
597 | #else | ||
598 | phys_cpu_id = (ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff; | ||
599 | #endif | ||
600 | 670 | ||
601 | /* | 671 | /* |
602 | * cpu number is in 8bit ID and 8bit EID | 672 | * cpu number is in 8bit ID and 8bit EID |
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index b618487cdc85..8d9a446a0d17 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c | |||
@@ -838,7 +838,7 @@ out: | |||
838 | return 1; | 838 | return 1; |
839 | } | 839 | } |
840 | 840 | ||
841 | int __kprobes kprobes_fault_handler(struct pt_regs *regs, int trapnr) | 841 | int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) |
842 | { | 842 | { |
843 | struct kprobe *cur = kprobe_running(); | 843 | struct kprobe *cur = kprobe_running(); |
844 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 844 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
@@ -1001,6 +1001,11 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | |||
1001 | return 1; | 1001 | return 1; |
1002 | } | 1002 | } |
1003 | 1003 | ||
1004 | /* ia64 does not need this */ | ||
1005 | void __kprobes jprobe_return(void) | ||
1006 | { | ||
1007 | } | ||
1008 | |||
1004 | int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | 1009 | int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) |
1005 | { | 1010 | { |
1006 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 1011 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 6e17aed53135..6c18221dba36 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
@@ -413,8 +413,8 @@ ia64_log_get(int sal_info_type, u8 **buffer, int irq_safe) | |||
413 | IA64_LOG_INDEX_INC(sal_info_type); | 413 | IA64_LOG_INDEX_INC(sal_info_type); |
414 | IA64_LOG_UNLOCK(sal_info_type); | 414 | IA64_LOG_UNLOCK(sal_info_type); |
415 | if (irq_safe) { | 415 | if (irq_safe) { |
416 | IA64_MCA_DEBUG("%s: SAL error record type %d retrieved. " | 416 | IA64_MCA_DEBUG("%s: SAL error record type %d retrieved. Record length = %ld\n", |
417 | "Record length = %ld\n", __FUNCTION__, sal_info_type, total_len); | 417 | __func__, sal_info_type, total_len); |
418 | } | 418 | } |
419 | *buffer = (u8 *) log_buffer; | 419 | *buffer = (u8 *) log_buffer; |
420 | return total_len; | 420 | return total_len; |
@@ -518,7 +518,7 @@ ia64_mca_cpe_int_handler (int cpe_irq, void *arg) | |||
518 | static DEFINE_SPINLOCK(cpe_history_lock); | 518 | static DEFINE_SPINLOCK(cpe_history_lock); |
519 | 519 | ||
520 | IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n", | 520 | IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n", |
521 | __FUNCTION__, cpe_irq, smp_processor_id()); | 521 | __func__, cpe_irq, smp_processor_id()); |
522 | 522 | ||
523 | /* SAL spec states this should run w/ interrupts enabled */ | 523 | /* SAL spec states this should run w/ interrupts enabled */ |
524 | local_irq_enable(); | 524 | local_irq_enable(); |
@@ -594,7 +594,7 @@ ia64_mca_register_cpev (int cpev) | |||
594 | } | 594 | } |
595 | 595 | ||
596 | IA64_MCA_DEBUG("%s: corrected platform error " | 596 | IA64_MCA_DEBUG("%s: corrected platform error " |
597 | "vector %#x registered\n", __FUNCTION__, cpev); | 597 | "vector %#x registered\n", __func__, cpev); |
598 | } | 598 | } |
599 | #endif /* CONFIG_ACPI */ | 599 | #endif /* CONFIG_ACPI */ |
600 | 600 | ||
@@ -621,12 +621,11 @@ ia64_mca_cmc_vector_setup (void) | |||
621 | cmcv.cmcv_vector = IA64_CMC_VECTOR; | 621 | cmcv.cmcv_vector = IA64_CMC_VECTOR; |
622 | ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval); | 622 | ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval); |
623 | 623 | ||
624 | IA64_MCA_DEBUG("%s: CPU %d corrected " | 624 | IA64_MCA_DEBUG("%s: CPU %d corrected machine check vector %#x registered.\n", |
625 | "machine check vector %#x registered.\n", | 625 | __func__, smp_processor_id(), IA64_CMC_VECTOR); |
626 | __FUNCTION__, smp_processor_id(), IA64_CMC_VECTOR); | ||
627 | 626 | ||
628 | IA64_MCA_DEBUG("%s: CPU %d CMCV = %#016lx\n", | 627 | IA64_MCA_DEBUG("%s: CPU %d CMCV = %#016lx\n", |
629 | __FUNCTION__, smp_processor_id(), ia64_getreg(_IA64_REG_CR_CMCV)); | 628 | __func__, smp_processor_id(), ia64_getreg(_IA64_REG_CR_CMCV)); |
630 | } | 629 | } |
631 | 630 | ||
632 | /* | 631 | /* |
@@ -651,9 +650,8 @@ ia64_mca_cmc_vector_disable (void *dummy) | |||
651 | cmcv.cmcv_mask = 1; /* Mask/disable interrupt */ | 650 | cmcv.cmcv_mask = 1; /* Mask/disable interrupt */ |
652 | ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval); | 651 | ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval); |
653 | 652 | ||
654 | IA64_MCA_DEBUG("%s: CPU %d corrected " | 653 | IA64_MCA_DEBUG("%s: CPU %d corrected machine check vector %#x disabled.\n", |
655 | "machine check vector %#x disabled.\n", | 654 | __func__, smp_processor_id(), cmcv.cmcv_vector); |
656 | __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector); | ||
657 | } | 655 | } |
658 | 656 | ||
659 | /* | 657 | /* |
@@ -678,9 +676,8 @@ ia64_mca_cmc_vector_enable (void *dummy) | |||
678 | cmcv.cmcv_mask = 0; /* Unmask/enable interrupt */ | 676 | cmcv.cmcv_mask = 0; /* Unmask/enable interrupt */ |
679 | ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval); | 677 | ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval); |
680 | 678 | ||
681 | IA64_MCA_DEBUG("%s: CPU %d corrected " | 679 | IA64_MCA_DEBUG("%s: CPU %d corrected machine check vector %#x enabled.\n", |
682 | "machine check vector %#x enabled.\n", | 680 | __func__, smp_processor_id(), cmcv.cmcv_vector); |
683 | __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector); | ||
684 | } | 681 | } |
685 | 682 | ||
686 | /* | 683 | /* |
@@ -767,7 +764,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg) | |||
767 | local_irq_save(flags); | 764 | local_irq_save(flags); |
768 | if (notify_die(DIE_MCA_RENDZVOUS_ENTER, "MCA", get_irq_regs(), | 765 | if (notify_die(DIE_MCA_RENDZVOUS_ENTER, "MCA", get_irq_regs(), |
769 | (long)&nd, 0, 0) == NOTIFY_STOP) | 766 | (long)&nd, 0, 0) == NOTIFY_STOP) |
770 | ia64_mca_spin(__FUNCTION__); | 767 | ia64_mca_spin(__func__); |
771 | 768 | ||
772 | ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_DONE; | 769 | ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_DONE; |
773 | /* Register with the SAL monarch that the slave has | 770 | /* Register with the SAL monarch that the slave has |
@@ -777,7 +774,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg) | |||
777 | 774 | ||
778 | if (notify_die(DIE_MCA_RENDZVOUS_PROCESS, "MCA", get_irq_regs(), | 775 | if (notify_die(DIE_MCA_RENDZVOUS_PROCESS, "MCA", get_irq_regs(), |
779 | (long)&nd, 0, 0) == NOTIFY_STOP) | 776 | (long)&nd, 0, 0) == NOTIFY_STOP) |
780 | ia64_mca_spin(__FUNCTION__); | 777 | ia64_mca_spin(__func__); |
781 | 778 | ||
782 | /* Wait for the monarch cpu to exit. */ | 779 | /* Wait for the monarch cpu to exit. */ |
783 | while (monarch_cpu != -1) | 780 | while (monarch_cpu != -1) |
@@ -785,7 +782,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg) | |||
785 | 782 | ||
786 | if (notify_die(DIE_MCA_RENDZVOUS_LEAVE, "MCA", get_irq_regs(), | 783 | if (notify_die(DIE_MCA_RENDZVOUS_LEAVE, "MCA", get_irq_regs(), |
787 | (long)&nd, 0, 0) == NOTIFY_STOP) | 784 | (long)&nd, 0, 0) == NOTIFY_STOP) |
788 | ia64_mca_spin(__FUNCTION__); | 785 | ia64_mca_spin(__func__); |
789 | 786 | ||
790 | ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE; | 787 | ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE; |
791 | /* Enable all interrupts */ | 788 | /* Enable all interrupts */ |
@@ -1230,7 +1227,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
1230 | 1227 | ||
1231 | if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, (long)&nd, 0, 0) | 1228 | if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, (long)&nd, 0, 0) |
1232 | == NOTIFY_STOP) | 1229 | == NOTIFY_STOP) |
1233 | ia64_mca_spin(__FUNCTION__); | 1230 | ia64_mca_spin(__func__); |
1234 | 1231 | ||
1235 | ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_CONCURRENT_MCA; | 1232 | ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_CONCURRENT_MCA; |
1236 | if (sos->monarch) { | 1233 | if (sos->monarch) { |
@@ -1246,7 +1243,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
1246 | ia64_mca_wakeup_all(); | 1243 | ia64_mca_wakeup_all(); |
1247 | if (notify_die(DIE_MCA_MONARCH_PROCESS, "MCA", regs, (long)&nd, 0, 0) | 1244 | if (notify_die(DIE_MCA_MONARCH_PROCESS, "MCA", regs, (long)&nd, 0, 0) |
1248 | == NOTIFY_STOP) | 1245 | == NOTIFY_STOP) |
1249 | ia64_mca_spin(__FUNCTION__); | 1246 | ia64_mca_spin(__func__); |
1250 | } else { | 1247 | } else { |
1251 | while (cpu_isset(cpu, mca_cpu)) | 1248 | while (cpu_isset(cpu, mca_cpu)) |
1252 | cpu_relax(); /* spin until monarch wakes us */ | 1249 | cpu_relax(); /* spin until monarch wakes us */ |
@@ -1276,7 +1273,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
1276 | } | 1273 | } |
1277 | if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, (long)&nd, 0, recover) | 1274 | if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, (long)&nd, 0, recover) |
1278 | == NOTIFY_STOP) | 1275 | == NOTIFY_STOP) |
1279 | ia64_mca_spin(__FUNCTION__); | 1276 | ia64_mca_spin(__func__); |
1280 | 1277 | ||
1281 | 1278 | ||
1282 | if (atomic_dec_return(&mca_count) > 0) { | 1279 | if (atomic_dec_return(&mca_count) > 0) { |
@@ -1328,7 +1325,7 @@ ia64_mca_cmc_int_handler(int cmc_irq, void *arg) | |||
1328 | static DEFINE_SPINLOCK(cmc_history_lock); | 1325 | static DEFINE_SPINLOCK(cmc_history_lock); |
1329 | 1326 | ||
1330 | IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n", | 1327 | IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n", |
1331 | __FUNCTION__, cmc_irq, smp_processor_id()); | 1328 | __func__, cmc_irq, smp_processor_id()); |
1332 | 1329 | ||
1333 | /* SAL spec states this should run w/ interrupts enabled */ | 1330 | /* SAL spec states this should run w/ interrupts enabled */ |
1334 | local_irq_enable(); | 1331 | local_irq_enable(); |
@@ -1614,7 +1611,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
1614 | */ | 1611 | */ |
1615 | if (!sos->monarch && atomic_add_return(1, &slaves) == num_online_cpus()) { | 1612 | if (!sos->monarch && atomic_add_return(1, &slaves) == num_online_cpus()) { |
1616 | mprintk(KERN_WARNING "%s: Promoting cpu %d to monarch.\n", | 1613 | mprintk(KERN_WARNING "%s: Promoting cpu %d to monarch.\n", |
1617 | __FUNCTION__, cpu); | 1614 | __func__, cpu); |
1618 | atomic_dec(&slaves); | 1615 | atomic_dec(&slaves); |
1619 | sos->monarch = 1; | 1616 | sos->monarch = 1; |
1620 | } | 1617 | } |
@@ -1626,7 +1623,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
1626 | */ | 1623 | */ |
1627 | if (sos->monarch && atomic_add_return(1, &monarchs) > 1) { | 1624 | if (sos->monarch && atomic_add_return(1, &monarchs) > 1) { |
1628 | mprintk(KERN_WARNING "%s: Demoting cpu %d to slave.\n", | 1625 | mprintk(KERN_WARNING "%s: Demoting cpu %d to slave.\n", |
1629 | __FUNCTION__, cpu); | 1626 | __func__, cpu); |
1630 | atomic_dec(&monarchs); | 1627 | atomic_dec(&monarchs); |
1631 | sos->monarch = 0; | 1628 | sos->monarch = 0; |
1632 | } | 1629 | } |
@@ -1637,15 +1634,15 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
1637 | cpu_relax(); /* spin until monarch enters */ | 1634 | cpu_relax(); /* spin until monarch enters */ |
1638 | if (notify_die(DIE_INIT_SLAVE_ENTER, "INIT", regs, (long)&nd, 0, 0) | 1635 | if (notify_die(DIE_INIT_SLAVE_ENTER, "INIT", regs, (long)&nd, 0, 0) |
1639 | == NOTIFY_STOP) | 1636 | == NOTIFY_STOP) |
1640 | ia64_mca_spin(__FUNCTION__); | 1637 | ia64_mca_spin(__func__); |
1641 | if (notify_die(DIE_INIT_SLAVE_PROCESS, "INIT", regs, (long)&nd, 0, 0) | 1638 | if (notify_die(DIE_INIT_SLAVE_PROCESS, "INIT", regs, (long)&nd, 0, 0) |
1642 | == NOTIFY_STOP) | 1639 | == NOTIFY_STOP) |
1643 | ia64_mca_spin(__FUNCTION__); | 1640 | ia64_mca_spin(__func__); |
1644 | while (monarch_cpu != -1) | 1641 | while (monarch_cpu != -1) |
1645 | cpu_relax(); /* spin until monarch leaves */ | 1642 | cpu_relax(); /* spin until monarch leaves */ |
1646 | if (notify_die(DIE_INIT_SLAVE_LEAVE, "INIT", regs, (long)&nd, 0, 0) | 1643 | if (notify_die(DIE_INIT_SLAVE_LEAVE, "INIT", regs, (long)&nd, 0, 0) |
1647 | == NOTIFY_STOP) | 1644 | == NOTIFY_STOP) |
1648 | ia64_mca_spin(__FUNCTION__); | 1645 | ia64_mca_spin(__func__); |
1649 | mprintk("Slave on cpu %d returning to normal service.\n", cpu); | 1646 | mprintk("Slave on cpu %d returning to normal service.\n", cpu); |
1650 | set_curr_task(cpu, previous_current); | 1647 | set_curr_task(cpu, previous_current); |
1651 | ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE; | 1648 | ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE; |
@@ -1656,7 +1653,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
1656 | monarch_cpu = cpu; | 1653 | monarch_cpu = cpu; |
1657 | if (notify_die(DIE_INIT_MONARCH_ENTER, "INIT", regs, (long)&nd, 0, 0) | 1654 | if (notify_die(DIE_INIT_MONARCH_ENTER, "INIT", regs, (long)&nd, 0, 0) |
1658 | == NOTIFY_STOP) | 1655 | == NOTIFY_STOP) |
1659 | ia64_mca_spin(__FUNCTION__); | 1656 | ia64_mca_spin(__func__); |
1660 | 1657 | ||
1661 | /* | 1658 | /* |
1662 | * Wait for a bit. On some machines (e.g., HP's zx2000 and zx6000, INIT can be | 1659 | * Wait for a bit. On some machines (e.g., HP's zx2000 and zx6000, INIT can be |
@@ -1673,10 +1670,10 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw, | |||
1673 | */ | 1670 | */ |
1674 | if (notify_die(DIE_INIT_MONARCH_PROCESS, "INIT", regs, (long)&nd, 0, 0) | 1671 | if (notify_die(DIE_INIT_MONARCH_PROCESS, "INIT", regs, (long)&nd, 0, 0) |
1675 | == NOTIFY_STOP) | 1672 | == NOTIFY_STOP) |
1676 | ia64_mca_spin(__FUNCTION__); | 1673 | ia64_mca_spin(__func__); |
1677 | if (notify_die(DIE_INIT_MONARCH_LEAVE, "INIT", regs, (long)&nd, 0, 0) | 1674 | if (notify_die(DIE_INIT_MONARCH_LEAVE, "INIT", regs, (long)&nd, 0, 0) |
1678 | == NOTIFY_STOP) | 1675 | == NOTIFY_STOP) |
1679 | ia64_mca_spin(__FUNCTION__); | 1676 | ia64_mca_spin(__func__); |
1680 | mprintk("\nINIT dump complete. Monarch on cpu %d returning to normal service.\n", cpu); | 1677 | mprintk("\nINIT dump complete. Monarch on cpu %d returning to normal service.\n", cpu); |
1681 | atomic_dec(&monarchs); | 1678 | atomic_dec(&monarchs); |
1682 | set_curr_task(cpu, previous_current); | 1679 | set_curr_task(cpu, previous_current); |
@@ -1884,7 +1881,7 @@ ia64_mca_init(void) | |||
1884 | .priority = 0/* we need to notified last */ | 1881 | .priority = 0/* we need to notified last */ |
1885 | }; | 1882 | }; |
1886 | 1883 | ||
1887 | IA64_MCA_DEBUG("%s: begin\n", __FUNCTION__); | 1884 | IA64_MCA_DEBUG("%s: begin\n", __func__); |
1888 | 1885 | ||
1889 | /* Clear the Rendez checkin flag for all cpus */ | 1886 | /* Clear the Rendez checkin flag for all cpus */ |
1890 | for(i = 0 ; i < NR_CPUS; i++) | 1887 | for(i = 0 ; i < NR_CPUS; i++) |
@@ -1928,7 +1925,7 @@ ia64_mca_init(void) | |||
1928 | return; | 1925 | return; |
1929 | } | 1926 | } |
1930 | 1927 | ||
1931 | IA64_MCA_DEBUG("%s: registered MCA rendezvous spinloop and wakeup mech.\n", __FUNCTION__); | 1928 | IA64_MCA_DEBUG("%s: registered MCA rendezvous spinloop and wakeup mech.\n", __func__); |
1932 | 1929 | ||
1933 | ia64_mc_info.imi_mca_handler = ia64_tpa(mca_hldlr_ptr->fp); | 1930 | ia64_mc_info.imi_mca_handler = ia64_tpa(mca_hldlr_ptr->fp); |
1934 | /* | 1931 | /* |
@@ -1949,7 +1946,7 @@ ia64_mca_init(void) | |||
1949 | return; | 1946 | return; |
1950 | } | 1947 | } |
1951 | 1948 | ||
1952 | IA64_MCA_DEBUG("%s: registered OS MCA handler with SAL at 0x%lx, gp = 0x%lx\n", __FUNCTION__, | 1949 | IA64_MCA_DEBUG("%s: registered OS MCA handler with SAL at 0x%lx, gp = 0x%lx\n", __func__, |
1953 | ia64_mc_info.imi_mca_handler, ia64_tpa(mca_hldlr_ptr->gp)); | 1950 | ia64_mc_info.imi_mca_handler, ia64_tpa(mca_hldlr_ptr->gp)); |
1954 | 1951 | ||
1955 | /* | 1952 | /* |
@@ -1961,7 +1958,7 @@ ia64_mca_init(void) | |||
1961 | ia64_mc_info.imi_slave_init_handler = ia64_tpa(init_hldlr_ptr_slave->fp); | 1958 | ia64_mc_info.imi_slave_init_handler = ia64_tpa(init_hldlr_ptr_slave->fp); |
1962 | ia64_mc_info.imi_slave_init_handler_size = 0; | 1959 | ia64_mc_info.imi_slave_init_handler_size = 0; |
1963 | 1960 | ||
1964 | IA64_MCA_DEBUG("%s: OS INIT handler at %lx\n", __FUNCTION__, | 1961 | IA64_MCA_DEBUG("%s: OS INIT handler at %lx\n", __func__, |
1965 | ia64_mc_info.imi_monarch_init_handler); | 1962 | ia64_mc_info.imi_monarch_init_handler); |
1966 | 1963 | ||
1967 | /* Register the os init handler with SAL */ | 1964 | /* Register the os init handler with SAL */ |
@@ -1982,7 +1979,7 @@ ia64_mca_init(void) | |||
1982 | return; | 1979 | return; |
1983 | } | 1980 | } |
1984 | 1981 | ||
1985 | IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __FUNCTION__); | 1982 | IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __func__); |
1986 | 1983 | ||
1987 | /* | 1984 | /* |
1988 | * Configure the CMCI/P vector and handler. Interrupts for CMC are | 1985 | * Configure the CMCI/P vector and handler. Interrupts for CMC are |
@@ -2042,7 +2039,7 @@ ia64_mca_late_init(void) | |||
2042 | cmc_polling_enabled = 0; | 2039 | cmc_polling_enabled = 0; |
2043 | schedule_work(&cmc_enable_work); | 2040 | schedule_work(&cmc_enable_work); |
2044 | 2041 | ||
2045 | IA64_MCA_DEBUG("%s: CMCI/P setup and enabled.\n", __FUNCTION__); | 2042 | IA64_MCA_DEBUG("%s: CMCI/P setup and enabled.\n", __func__); |
2046 | 2043 | ||
2047 | #ifdef CONFIG_ACPI | 2044 | #ifdef CONFIG_ACPI |
2048 | /* Setup the CPEI/P vector and handler */ | 2045 | /* Setup the CPEI/P vector and handler */ |
@@ -2065,17 +2062,17 @@ ia64_mca_late_init(void) | |||
2065 | ia64_cpe_irq = irq; | 2062 | ia64_cpe_irq = irq; |
2066 | ia64_mca_register_cpev(cpe_vector); | 2063 | ia64_mca_register_cpev(cpe_vector); |
2067 | IA64_MCA_DEBUG("%s: CPEI/P setup and enabled.\n", | 2064 | IA64_MCA_DEBUG("%s: CPEI/P setup and enabled.\n", |
2068 | __FUNCTION__); | 2065 | __func__); |
2069 | return 0; | 2066 | return 0; |
2070 | } | 2067 | } |
2071 | printk(KERN_ERR "%s: Failed to find irq for CPE " | 2068 | printk(KERN_ERR "%s: Failed to find irq for CPE " |
2072 | "interrupt handler, vector %d\n", | 2069 | "interrupt handler, vector %d\n", |
2073 | __FUNCTION__, cpe_vector); | 2070 | __func__, cpe_vector); |
2074 | } | 2071 | } |
2075 | /* If platform doesn't support CPEI, get the timer going. */ | 2072 | /* If platform doesn't support CPEI, get the timer going. */ |
2076 | if (cpe_poll_enabled) { | 2073 | if (cpe_poll_enabled) { |
2077 | ia64_mca_cpe_poll(0UL); | 2074 | ia64_mca_cpe_poll(0UL); |
2078 | IA64_MCA_DEBUG("%s: CPEP setup and enabled.\n", __FUNCTION__); | 2075 | IA64_MCA_DEBUG("%s: CPEP setup and enabled.\n", __func__); |
2079 | } | 2076 | } |
2080 | } | 2077 | } |
2081 | #endif | 2078 | #endif |
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index e58f4367cf11..e83e2ea3b3e0 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c | |||
@@ -493,7 +493,7 @@ module_frob_arch_sections (Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings, | |||
493 | mod->arch.opd->sh_addralign = 8; | 493 | mod->arch.opd->sh_addralign = 8; |
494 | mod->arch.opd->sh_size = fdescs * sizeof(struct fdesc); | 494 | mod->arch.opd->sh_size = fdescs * sizeof(struct fdesc); |
495 | DEBUGP("%s: core.plt=%lx, init.plt=%lx, got=%lx, fdesc=%lx\n", | 495 | DEBUGP("%s: core.plt=%lx, init.plt=%lx, got=%lx, fdesc=%lx\n", |
496 | __FUNCTION__, mod->arch.core_plt->sh_size, mod->arch.init_plt->sh_size, | 496 | __func__, mod->arch.core_plt->sh_size, mod->arch.init_plt->sh_size, |
497 | mod->arch.got->sh_size, mod->arch.opd->sh_size); | 497 | mod->arch.got->sh_size, mod->arch.opd->sh_size); |
498 | return 0; | 498 | return 0; |
499 | } | 499 | } |
@@ -585,7 +585,7 @@ get_plt (struct module *mod, const struct insn *insn, uint64_t value, int *okp) | |||
585 | #if ARCH_MODULE_DEBUG | 585 | #if ARCH_MODULE_DEBUG |
586 | if (plt_target(plt) != target_ip) { | 586 | if (plt_target(plt) != target_ip) { |
587 | printk("%s: mistargeted PLT: wanted %lx, got %lx\n", | 587 | printk("%s: mistargeted PLT: wanted %lx, got %lx\n", |
588 | __FUNCTION__, target_ip, plt_target(plt)); | 588 | __func__, target_ip, plt_target(plt)); |
589 | *okp = 0; | 589 | *okp = 0; |
590 | return 0; | 590 | return 0; |
591 | } | 591 | } |
@@ -703,7 +703,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend, | |||
703 | if (r_type == R_IA64_PCREL21BI) { | 703 | if (r_type == R_IA64_PCREL21BI) { |
704 | if (!is_internal(mod, val)) { | 704 | if (!is_internal(mod, val)) { |
705 | printk(KERN_ERR "%s: %s reloc against non-local symbol (%lx)\n", | 705 | printk(KERN_ERR "%s: %s reloc against non-local symbol (%lx)\n", |
706 | __FUNCTION__, reloc_name[r_type], val); | 706 | __func__, reloc_name[r_type], val); |
707 | return -ENOEXEC; | 707 | return -ENOEXEC; |
708 | } | 708 | } |
709 | format = RF_INSN21B; | 709 | format = RF_INSN21B; |
@@ -737,7 +737,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend, | |||
737 | case R_IA64_LDXMOV: | 737 | case R_IA64_LDXMOV: |
738 | if (gp_addressable(mod, val)) { | 738 | if (gp_addressable(mod, val)) { |
739 | /* turn "ld8" into "mov": */ | 739 | /* turn "ld8" into "mov": */ |
740 | DEBUGP("%s: patching ld8 at %p to mov\n", __FUNCTION__, location); | 740 | DEBUGP("%s: patching ld8 at %p to mov\n", __func__, location); |
741 | ia64_patch((u64) location, 0x1fff80fe000UL, 0x10000000000UL); | 741 | ia64_patch((u64) location, 0x1fff80fe000UL, 0x10000000000UL); |
742 | } | 742 | } |
743 | return 0; | 743 | return 0; |
@@ -771,7 +771,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend, | |||
771 | if (!ok) | 771 | if (!ok) |
772 | return -ENOEXEC; | 772 | return -ENOEXEC; |
773 | 773 | ||
774 | DEBUGP("%s: [%p]<-%016lx = %s(%lx)\n", __FUNCTION__, location, val, | 774 | DEBUGP("%s: [%p]<-%016lx = %s(%lx)\n", __func__, location, val, |
775 | reloc_name[r_type] ? reloc_name[r_type] : "?", sym->st_value + addend); | 775 | reloc_name[r_type] ? reloc_name[r_type] : "?", sym->st_value + addend); |
776 | 776 | ||
777 | switch (format) { | 777 | switch (format) { |
@@ -807,7 +807,7 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind | |||
807 | Elf64_Shdr *target_sec; | 807 | Elf64_Shdr *target_sec; |
808 | int ret; | 808 | int ret; |
809 | 809 | ||
810 | DEBUGP("%s: applying section %u (%u relocs) to %u\n", __FUNCTION__, | 810 | DEBUGP("%s: applying section %u (%u relocs) to %u\n", __func__, |
811 | relsec, n, sechdrs[relsec].sh_info); | 811 | relsec, n, sechdrs[relsec].sh_info); |
812 | 812 | ||
813 | target_sec = sechdrs + sechdrs[relsec].sh_info; | 813 | target_sec = sechdrs + sechdrs[relsec].sh_info; |
@@ -835,7 +835,7 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind | |||
835 | gp = mod->core_size / 2; | 835 | gp = mod->core_size / 2; |
836 | gp = (uint64_t) mod->module_core + ((gp + 7) & -8); | 836 | gp = (uint64_t) mod->module_core + ((gp + 7) & -8); |
837 | mod->arch.gp = gp; | 837 | mod->arch.gp = gp; |
838 | DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp); | 838 | DEBUGP("%s: placing gp at 0x%lx\n", __func__, gp); |
839 | } | 839 | } |
840 | 840 | ||
841 | for (i = 0; i < n; i++) { | 841 | for (i = 0; i < n; i++) { |
@@ -903,7 +903,7 @@ register_unwind_table (struct module *mod) | |||
903 | init = start + num_core; | 903 | init = start + num_core; |
904 | } | 904 | } |
905 | 905 | ||
906 | DEBUGP("%s: name=%s, gp=%lx, num_init=%lu, num_core=%lu\n", __FUNCTION__, | 906 | DEBUGP("%s: name=%s, gp=%lx, num_init=%lu, num_core=%lu\n", __func__, |
907 | mod->name, mod->arch.gp, num_init, num_core); | 907 | mod->name, mod->arch.gp, num_init, num_core); |
908 | 908 | ||
909 | /* | 909 | /* |
@@ -912,13 +912,13 @@ register_unwind_table (struct module *mod) | |||
912 | if (num_core > 0) { | 912 | if (num_core > 0) { |
913 | mod->arch.core_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp, | 913 | mod->arch.core_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp, |
914 | core, core + num_core); | 914 | core, core + num_core); |
915 | DEBUGP("%s: core: handle=%p [%p-%p)\n", __FUNCTION__, | 915 | DEBUGP("%s: core: handle=%p [%p-%p)\n", __func__, |
916 | mod->arch.core_unw_table, core, core + num_core); | 916 | mod->arch.core_unw_table, core, core + num_core); |
917 | } | 917 | } |
918 | if (num_init > 0) { | 918 | if (num_init > 0) { |
919 | mod->arch.init_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp, | 919 | mod->arch.init_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp, |
920 | init, init + num_init); | 920 | init, init + num_init); |
921 | DEBUGP("%s: init: handle=%p [%p-%p)\n", __FUNCTION__, | 921 | DEBUGP("%s: init: handle=%p [%p-%p)\n", __func__, |
922 | mod->arch.init_unw_table, init, init + num_init); | 922 | mod->arch.init_unw_table, init, init + num_init); |
923 | } | 923 | } |
924 | } | 924 | } |
@@ -926,7 +926,7 @@ register_unwind_table (struct module *mod) | |||
926 | int | 926 | int |
927 | module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod) | 927 | module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod) |
928 | { | 928 | { |
929 | DEBUGP("%s: init: entry=%p\n", __FUNCTION__, mod->init); | 929 | DEBUGP("%s: init: entry=%p\n", __func__, mod->init); |
930 | if (mod->arch.unwind) | 930 | if (mod->arch.unwind) |
931 | register_unwind_table(mod); | 931 | register_unwind_table(mod); |
932 | return 0; | 932 | return 0; |
diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index e86d02959794..60c6ef67ebb2 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c | |||
@@ -57,7 +57,7 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, cpumask_t cpu_mask) | |||
57 | if (!cpu_online(cpu)) | 57 | if (!cpu_online(cpu)) |
58 | return; | 58 | return; |
59 | 59 | ||
60 | if (reassign_irq_vector(irq, cpu)) | 60 | if (irq_prepare_move(irq, cpu)) |
61 | return; | 61 | return; |
62 | 62 | ||
63 | read_msi_msg(irq, &msg); | 63 | read_msi_msg(irq, &msg); |
@@ -119,6 +119,7 @@ void ia64_teardown_msi_irq(unsigned int irq) | |||
119 | 119 | ||
120 | static void ia64_ack_msi_irq(unsigned int irq) | 120 | static void ia64_ack_msi_irq(unsigned int irq) |
121 | { | 121 | { |
122 | irq_complete_move(irq); | ||
122 | move_native_irq(irq); | 123 | move_native_irq(irq); |
123 | ia64_eoi(); | 124 | ia64_eoi(); |
124 | } | 125 | } |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index f6b99719f10f..a2aabfdc80d9 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
@@ -227,12 +227,12 @@ | |||
227 | #ifdef PFM_DEBUGGING | 227 | #ifdef PFM_DEBUGGING |
228 | #define DPRINT(a) \ | 228 | #define DPRINT(a) \ |
229 | do { \ | 229 | do { \ |
230 | if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d [%d] ", __FUNCTION__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \ | 230 | if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d [%d] ", __func__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \ |
231 | } while (0) | 231 | } while (0) |
232 | 232 | ||
233 | #define DPRINT_ovfl(a) \ | 233 | #define DPRINT_ovfl(a) \ |
234 | do { \ | 234 | do { \ |
235 | if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d [%d] ", __FUNCTION__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \ | 235 | if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d [%d] ", __func__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \ |
236 | } while (0) | 236 | } while (0) |
237 | #endif | 237 | #endif |
238 | 238 | ||
diff --git a/arch/ia64/kernel/perfmon_default_smpl.c b/arch/ia64/kernel/perfmon_default_smpl.c index a7af1cb419f9..5f637bbfcccd 100644 --- a/arch/ia64/kernel/perfmon_default_smpl.c +++ b/arch/ia64/kernel/perfmon_default_smpl.c | |||
@@ -24,12 +24,12 @@ MODULE_LICENSE("GPL"); | |||
24 | #ifdef DEFAULT_DEBUG | 24 | #ifdef DEFAULT_DEBUG |
25 | #define DPRINT(a) \ | 25 | #define DPRINT(a) \ |
26 | do { \ | 26 | do { \ |
27 | if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d ", __FUNCTION__, __LINE__, smp_processor_id()); printk a; } \ | 27 | if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d ", __func__, __LINE__, smp_processor_id()); printk a; } \ |
28 | } while (0) | 28 | } while (0) |
29 | 29 | ||
30 | #define DPRINT_ovfl(a) \ | 30 | #define DPRINT_ovfl(a) \ |
31 | do { \ | 31 | do { \ |
32 | if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d ", __FUNCTION__, __LINE__, smp_processor_id()); printk a; } \ | 32 | if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d ", __func__, __LINE__, smp_processor_id()); printk a; } \ |
33 | } while (0) | 33 | } while (0) |
34 | 34 | ||
35 | #else | 35 | #else |
diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index 331d6768b5d5..ab784ec4319d 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c | |||
@@ -698,52 +698,6 @@ thread_matches (struct task_struct *thread, unsigned long addr) | |||
698 | } | 698 | } |
699 | 699 | ||
700 | /* | 700 | /* |
701 | * GDB apparently wants to be able to read the register-backing store | ||
702 | * of any thread when attached to a given process. If we are peeking | ||
703 | * or poking an address that happens to reside in the kernel-backing | ||
704 | * store of another thread, we need to attach to that thread, because | ||
705 | * otherwise we end up accessing stale data. | ||
706 | * | ||
707 | * task_list_lock must be read-locked before calling this routine! | ||
708 | */ | ||
709 | static struct task_struct * | ||
710 | find_thread_for_addr (struct task_struct *child, unsigned long addr) | ||
711 | { | ||
712 | struct task_struct *p; | ||
713 | struct mm_struct *mm; | ||
714 | struct list_head *this, *next; | ||
715 | int mm_users; | ||
716 | |||
717 | if (!(mm = get_task_mm(child))) | ||
718 | return child; | ||
719 | |||
720 | /* -1 because of our get_task_mm(): */ | ||
721 | mm_users = atomic_read(&mm->mm_users) - 1; | ||
722 | if (mm_users <= 1) | ||
723 | goto out; /* not multi-threaded */ | ||
724 | |||
725 | /* | ||
726 | * Traverse the current process' children list. Every task that | ||
727 | * one attaches to becomes a child. And it is only attached children | ||
728 | * of the debugger that are of interest (ptrace_check_attach checks | ||
729 | * for this). | ||
730 | */ | ||
731 | list_for_each_safe(this, next, ¤t->children) { | ||
732 | p = list_entry(this, struct task_struct, sibling); | ||
733 | if (p->tgid != child->tgid) | ||
734 | continue; | ||
735 | if (thread_matches(p, addr)) { | ||
736 | child = p; | ||
737 | goto out; | ||
738 | } | ||
739 | } | ||
740 | |||
741 | out: | ||
742 | mmput(mm); | ||
743 | return child; | ||
744 | } | ||
745 | |||
746 | /* | ||
747 | * Write f32-f127 back to task->thread.fph if it has been modified. | 701 | * Write f32-f127 back to task->thread.fph if it has been modified. |
748 | */ | 702 | */ |
749 | inline void | 703 | inline void |
@@ -826,14 +780,14 @@ convert_to_non_syscall (struct task_struct *child, struct pt_regs *pt, | |||
826 | if ((long)((unsigned long)child + IA64_STK_OFFSET - sp) | 780 | if ((long)((unsigned long)child + IA64_STK_OFFSET - sp) |
827 | < IA64_PT_REGS_SIZE) { | 781 | < IA64_PT_REGS_SIZE) { |
828 | dprintk("ptrace.%s: ran off the top of the kernel " | 782 | dprintk("ptrace.%s: ran off the top of the kernel " |
829 | "stack\n", __FUNCTION__); | 783 | "stack\n", __func__); |
830 | return; | 784 | return; |
831 | } | 785 | } |
832 | if (unw_get_pr (&prev_info, &pr) < 0) { | 786 | if (unw_get_pr (&prev_info, &pr) < 0) { |
833 | unw_get_rp(&prev_info, &ip); | 787 | unw_get_rp(&prev_info, &ip); |
834 | dprintk("ptrace.%s: failed to read " | 788 | dprintk("ptrace.%s: failed to read " |
835 | "predicate register (ip=0x%lx)\n", | 789 | "predicate register (ip=0x%lx)\n", |
836 | __FUNCTION__, ip); | 790 | __func__, ip); |
837 | return; | 791 | return; |
838 | } | 792 | } |
839 | if (unw_is_intr_frame(&info) | 793 | if (unw_is_intr_frame(&info) |
@@ -908,7 +862,7 @@ static int | |||
908 | access_uarea (struct task_struct *child, unsigned long addr, | 862 | access_uarea (struct task_struct *child, unsigned long addr, |
909 | unsigned long *data, int write_access) | 863 | unsigned long *data, int write_access) |
910 | { | 864 | { |
911 | unsigned long *ptr, regnum, urbs_end, rnat_addr, cfm; | 865 | unsigned long *ptr, regnum, urbs_end, cfm; |
912 | struct switch_stack *sw; | 866 | struct switch_stack *sw; |
913 | struct pt_regs *pt; | 867 | struct pt_regs *pt; |
914 | # define pt_reg_addr(pt, reg) ((void *) \ | 868 | # define pt_reg_addr(pt, reg) ((void *) \ |
@@ -1011,14 +965,9 @@ access_uarea (struct task_struct *child, unsigned long addr, | |||
1011 | * the kernel was entered. | 965 | * the kernel was entered. |
1012 | * | 966 | * |
1013 | * Furthermore, when changing the contents of | 967 | * Furthermore, when changing the contents of |
1014 | * PT_AR_BSP (or PT_CFM) we MUST copy any | 968 | * PT_AR_BSP (or PT_CFM) while the task is |
1015 | * users-level stacked registers that are | 969 | * blocked in a system call, convert the state |
1016 | * stored on the kernel stack back to | 970 | * so that the non-system-call exit |
1017 | * user-space because otherwise, we might end | ||
1018 | * up clobbering kernel stacked registers. | ||
1019 | * Also, if this happens while the task is | ||
1020 | * blocked in a system call, which convert the | ||
1021 | * state such that the non-system-call exit | ||
1022 | * path is used. This ensures that the proper | 971 | * path is used. This ensures that the proper |
1023 | * state will be picked up when resuming | 972 | * state will be picked up when resuming |
1024 | * execution. However, it *also* means that | 973 | * execution. However, it *also* means that |
@@ -1035,10 +984,6 @@ access_uarea (struct task_struct *child, unsigned long addr, | |||
1035 | urbs_end = ia64_get_user_rbs_end(child, pt, &cfm); | 984 | urbs_end = ia64_get_user_rbs_end(child, pt, &cfm); |
1036 | if (write_access) { | 985 | if (write_access) { |
1037 | if (*data != urbs_end) { | 986 | if (*data != urbs_end) { |
1038 | if (ia64_sync_user_rbs(child, sw, | ||
1039 | pt->ar_bspstore, | ||
1040 | urbs_end) < 0) | ||
1041 | return -1; | ||
1042 | if (in_syscall(pt)) | 987 | if (in_syscall(pt)) |
1043 | convert_to_non_syscall(child, | 988 | convert_to_non_syscall(child, |
1044 | pt, | 989 | pt, |
@@ -1058,10 +1003,6 @@ access_uarea (struct task_struct *child, unsigned long addr, | |||
1058 | urbs_end = ia64_get_user_rbs_end(child, pt, &cfm); | 1003 | urbs_end = ia64_get_user_rbs_end(child, pt, &cfm); |
1059 | if (write_access) { | 1004 | if (write_access) { |
1060 | if (((cfm ^ *data) & PFM_MASK) != 0) { | 1005 | if (((cfm ^ *data) & PFM_MASK) != 0) { |
1061 | if (ia64_sync_user_rbs(child, sw, | ||
1062 | pt->ar_bspstore, | ||
1063 | urbs_end) < 0) | ||
1064 | return -1; | ||
1065 | if (in_syscall(pt)) | 1006 | if (in_syscall(pt)) |
1066 | convert_to_non_syscall(child, | 1007 | convert_to_non_syscall(child, |
1067 | pt, | 1008 | pt, |
@@ -1093,16 +1034,8 @@ access_uarea (struct task_struct *child, unsigned long addr, | |||
1093 | return 0; | 1034 | return 0; |
1094 | 1035 | ||
1095 | case PT_AR_RNAT: | 1036 | case PT_AR_RNAT: |
1096 | urbs_end = ia64_get_user_rbs_end(child, pt, NULL); | 1037 | ptr = pt_reg_addr(pt, ar_rnat); |
1097 | rnat_addr = (long) ia64_rse_rnat_addr((long *) | 1038 | break; |
1098 | urbs_end); | ||
1099 | if (write_access) | ||
1100 | return ia64_poke(child, sw, urbs_end, | ||
1101 | rnat_addr, *data); | ||
1102 | else | ||
1103 | return ia64_peek(child, sw, urbs_end, | ||
1104 | rnat_addr, data); | ||
1105 | |||
1106 | case PT_R1: | 1039 | case PT_R1: |
1107 | ptr = pt_reg_addr(pt, r1); | 1040 | ptr = pt_reg_addr(pt, r1); |
1108 | break; | 1041 | break; |
@@ -1521,215 +1454,97 @@ ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) | |||
1521 | return ret; | 1454 | return ret; |
1522 | } | 1455 | } |
1523 | 1456 | ||
1524 | /* | ||
1525 | * Called by kernel/ptrace.c when detaching.. | ||
1526 | * | ||
1527 | * Make sure the single step bit is not set. | ||
1528 | */ | ||
1529 | void | 1457 | void |
1530 | ptrace_disable (struct task_struct *child) | 1458 | user_enable_single_step (struct task_struct *child) |
1531 | { | 1459 | { |
1532 | struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child)); | 1460 | struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child)); |
1533 | 1461 | ||
1534 | /* make sure the single step/taken-branch trap bits are not set: */ | 1462 | set_tsk_thread_flag(child, TIF_SINGLESTEP); |
1535 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | 1463 | child_psr->ss = 1; |
1536 | child_psr->ss = 0; | ||
1537 | child_psr->tb = 0; | ||
1538 | } | 1464 | } |
1539 | 1465 | ||
1540 | asmlinkage long | 1466 | void |
1541 | sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data) | 1467 | user_enable_block_step (struct task_struct *child) |
1542 | { | 1468 | { |
1543 | struct pt_regs *pt; | 1469 | struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child)); |
1544 | unsigned long urbs_end, peek_or_poke; | ||
1545 | struct task_struct *child; | ||
1546 | struct switch_stack *sw; | ||
1547 | long ret; | ||
1548 | struct unw_frame_info info; | ||
1549 | 1470 | ||
1550 | lock_kernel(); | 1471 | set_tsk_thread_flag(child, TIF_SINGLESTEP); |
1551 | ret = -EPERM; | 1472 | child_psr->tb = 1; |
1552 | if (request == PTRACE_TRACEME) { | 1473 | } |
1553 | ret = ptrace_traceme(); | ||
1554 | goto out; | ||
1555 | } | ||
1556 | 1474 | ||
1557 | peek_or_poke = (request == PTRACE_PEEKTEXT | 1475 | void |
1558 | || request == PTRACE_PEEKDATA | 1476 | user_disable_single_step (struct task_struct *child) |
1559 | || request == PTRACE_POKETEXT | 1477 | { |
1560 | || request == PTRACE_POKEDATA); | 1478 | struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child)); |
1561 | ret = -ESRCH; | ||
1562 | read_lock(&tasklist_lock); | ||
1563 | { | ||
1564 | child = find_task_by_pid(pid); | ||
1565 | if (child) { | ||
1566 | if (peek_or_poke) | ||
1567 | child = find_thread_for_addr(child, addr); | ||
1568 | get_task_struct(child); | ||
1569 | } | ||
1570 | } | ||
1571 | read_unlock(&tasklist_lock); | ||
1572 | if (!child) | ||
1573 | goto out; | ||
1574 | ret = -EPERM; | ||
1575 | if (pid == 1) /* no messing around with init! */ | ||
1576 | goto out_tsk; | ||
1577 | |||
1578 | if (request == PTRACE_ATTACH) { | ||
1579 | ret = ptrace_attach(child); | ||
1580 | if (!ret) | ||
1581 | arch_ptrace_attach(child); | ||
1582 | goto out_tsk; | ||
1583 | } | ||
1584 | 1479 | ||
1585 | ret = ptrace_check_attach(child, request == PTRACE_KILL); | 1480 | /* make sure the single step/taken-branch trap bits are not set: */ |
1586 | if (ret < 0) | 1481 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); |
1587 | goto out_tsk; | 1482 | child_psr->ss = 0; |
1483 | child_psr->tb = 0; | ||
1484 | } | ||
1588 | 1485 | ||
1589 | pt = task_pt_regs(child); | 1486 | /* |
1590 | sw = (struct switch_stack *) (child->thread.ksp + 16); | 1487 | * Called by kernel/ptrace.c when detaching.. |
1488 | * | ||
1489 | * Make sure the single step bit is not set. | ||
1490 | */ | ||
1491 | void | ||
1492 | ptrace_disable (struct task_struct *child) | ||
1493 | { | ||
1494 | user_disable_single_step(child); | ||
1495 | } | ||
1591 | 1496 | ||
1497 | long | ||
1498 | arch_ptrace (struct task_struct *child, long request, long addr, long data) | ||
1499 | { | ||
1592 | switch (request) { | 1500 | switch (request) { |
1593 | case PTRACE_PEEKTEXT: | 1501 | case PTRACE_PEEKTEXT: |
1594 | case PTRACE_PEEKDATA: | 1502 | case PTRACE_PEEKDATA: |
1595 | /* read word at location addr */ | 1503 | /* read word at location addr */ |
1596 | urbs_end = ia64_get_user_rbs_end(child, pt, NULL); | 1504 | if (access_process_vm(child, addr, &data, sizeof(data), 0) |
1597 | ret = ia64_peek(child, sw, urbs_end, addr, &data); | 1505 | != sizeof(data)) |
1598 | if (ret == 0) { | 1506 | return -EIO; |
1599 | ret = data; | 1507 | /* ensure return value is not mistaken for error code */ |
1600 | /* ensure "ret" is not mistaken as an error code: */ | 1508 | force_successful_syscall_return(); |
1601 | force_successful_syscall_return(); | 1509 | return data; |
1602 | } | ||
1603 | goto out_tsk; | ||
1604 | |||
1605 | case PTRACE_POKETEXT: | ||
1606 | case PTRACE_POKEDATA: | ||
1607 | /* write the word at location addr */ | ||
1608 | urbs_end = ia64_get_user_rbs_end(child, pt, NULL); | ||
1609 | ret = ia64_poke(child, sw, urbs_end, addr, data); | ||
1610 | |||
1611 | /* Make sure user RBS has the latest data */ | ||
1612 | unw_init_from_blocked_task(&info, child); | ||
1613 | do_sync_rbs(&info, ia64_sync_user_rbs); | ||
1614 | 1510 | ||
1615 | goto out_tsk; | 1511 | /* PTRACE_POKETEXT and PTRACE_POKEDATA is handled |
1512 | * by the generic ptrace_request(). | ||
1513 | */ | ||
1616 | 1514 | ||
1617 | case PTRACE_PEEKUSR: | 1515 | case PTRACE_PEEKUSR: |
1618 | /* read the word at addr in the USER area */ | 1516 | /* read the word at addr in the USER area */ |
1619 | if (access_uarea(child, addr, &data, 0) < 0) { | 1517 | if (access_uarea(child, addr, &data, 0) < 0) |
1620 | ret = -EIO; | 1518 | return -EIO; |
1621 | goto out_tsk; | 1519 | /* ensure return value is not mistaken for error code */ |
1622 | } | ||
1623 | ret = data; | ||
1624 | /* ensure "ret" is not mistaken as an error code */ | ||
1625 | force_successful_syscall_return(); | 1520 | force_successful_syscall_return(); |
1626 | goto out_tsk; | 1521 | return data; |
1627 | 1522 | ||
1628 | case PTRACE_POKEUSR: | 1523 | case PTRACE_POKEUSR: |
1629 | /* write the word at addr in the USER area */ | 1524 | /* write the word at addr in the USER area */ |
1630 | if (access_uarea(child, addr, &data, 1) < 0) { | 1525 | if (access_uarea(child, addr, &data, 1) < 0) |
1631 | ret = -EIO; | 1526 | return -EIO; |
1632 | goto out_tsk; | 1527 | return 0; |
1633 | } | ||
1634 | ret = 0; | ||
1635 | goto out_tsk; | ||
1636 | 1528 | ||
1637 | case PTRACE_OLD_GETSIGINFO: | 1529 | case PTRACE_OLD_GETSIGINFO: |
1638 | /* for backwards-compatibility */ | 1530 | /* for backwards-compatibility */ |
1639 | ret = ptrace_request(child, PTRACE_GETSIGINFO, addr, data); | 1531 | return ptrace_request(child, PTRACE_GETSIGINFO, addr, data); |
1640 | goto out_tsk; | ||
1641 | 1532 | ||
1642 | case PTRACE_OLD_SETSIGINFO: | 1533 | case PTRACE_OLD_SETSIGINFO: |
1643 | /* for backwards-compatibility */ | 1534 | /* for backwards-compatibility */ |
1644 | ret = ptrace_request(child, PTRACE_SETSIGINFO, addr, data); | 1535 | return ptrace_request(child, PTRACE_SETSIGINFO, addr, data); |
1645 | goto out_tsk; | ||
1646 | |||
1647 | case PTRACE_SYSCALL: | ||
1648 | /* continue and stop at next (return from) syscall */ | ||
1649 | case PTRACE_CONT: | ||
1650 | /* restart after signal. */ | ||
1651 | ret = -EIO; | ||
1652 | if (!valid_signal(data)) | ||
1653 | goto out_tsk; | ||
1654 | if (request == PTRACE_SYSCALL) | ||
1655 | set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
1656 | else | ||
1657 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
1658 | child->exit_code = data; | ||
1659 | 1536 | ||
1660 | /* | 1537 | case PTRACE_GETREGS: |
1661 | * Make sure the single step/taken-branch trap bits | 1538 | return ptrace_getregs(child, |
1662 | * are not set: | 1539 | (struct pt_all_user_regs __user *) data); |
1663 | */ | ||
1664 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
1665 | ia64_psr(pt)->ss = 0; | ||
1666 | ia64_psr(pt)->tb = 0; | ||
1667 | 1540 | ||
1668 | wake_up_process(child); | 1541 | case PTRACE_SETREGS: |
1669 | ret = 0; | 1542 | return ptrace_setregs(child, |
1670 | goto out_tsk; | 1543 | (struct pt_all_user_regs __user *) data); |
1671 | 1544 | ||
1672 | case PTRACE_KILL: | 1545 | default: |
1673 | /* | 1546 | return ptrace_request(child, request, addr, data); |
1674 | * Make the child exit. Best I can do is send it a | ||
1675 | * sigkill. Perhaps it should be put in the status | ||
1676 | * that it wants to exit. | ||
1677 | */ | ||
1678 | if (child->exit_state == EXIT_ZOMBIE) | ||
1679 | /* already dead */ | ||
1680 | goto out_tsk; | ||
1681 | child->exit_code = SIGKILL; | ||
1682 | |||
1683 | ptrace_disable(child); | ||
1684 | wake_up_process(child); | ||
1685 | ret = 0; | ||
1686 | goto out_tsk; | ||
1687 | |||
1688 | case PTRACE_SINGLESTEP: | ||
1689 | /* let child execute for one instruction */ | ||
1690 | case PTRACE_SINGLEBLOCK: | ||
1691 | ret = -EIO; | ||
1692 | if (!valid_signal(data)) | ||
1693 | goto out_tsk; | ||
1694 | |||
1695 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
1696 | set_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
1697 | if (request == PTRACE_SINGLESTEP) { | ||
1698 | ia64_psr(pt)->ss = 1; | ||
1699 | } else { | ||
1700 | ia64_psr(pt)->tb = 1; | ||
1701 | } | ||
1702 | child->exit_code = data; | ||
1703 | |||
1704 | /* give it a chance to run. */ | ||
1705 | wake_up_process(child); | ||
1706 | ret = 0; | ||
1707 | goto out_tsk; | ||
1708 | |||
1709 | case PTRACE_DETACH: | ||
1710 | /* detach a process that was attached. */ | ||
1711 | ret = ptrace_detach(child, data); | ||
1712 | goto out_tsk; | ||
1713 | |||
1714 | case PTRACE_GETREGS: | ||
1715 | ret = ptrace_getregs(child, | ||
1716 | (struct pt_all_user_regs __user *) data); | ||
1717 | goto out_tsk; | ||
1718 | |||
1719 | case PTRACE_SETREGS: | ||
1720 | ret = ptrace_setregs(child, | ||
1721 | (struct pt_all_user_regs __user *) data); | ||
1722 | goto out_tsk; | ||
1723 | |||
1724 | default: | ||
1725 | ret = ptrace_request(child, request, addr, data); | ||
1726 | goto out_tsk; | ||
1727 | } | 1547 | } |
1728 | out_tsk: | ||
1729 | put_task_struct(child); | ||
1730 | out: | ||
1731 | unlock_kernel(); | ||
1732 | return ret; | ||
1733 | } | 1548 | } |
1734 | 1549 | ||
1735 | 1550 | ||
diff --git a/arch/ia64/kernel/sal.c b/arch/ia64/kernel/sal.c index f44fe8412162..a3022dc48ef8 100644 --- a/arch/ia64/kernel/sal.c +++ b/arch/ia64/kernel/sal.c | |||
@@ -109,6 +109,13 @@ check_versions (struct ia64_sal_systab *systab) | |||
109 | sal_revision = SAL_VERSION_CODE(2, 8); | 109 | sal_revision = SAL_VERSION_CODE(2, 8); |
110 | sal_version = SAL_VERSION_CODE(0, 0); | 110 | sal_version = SAL_VERSION_CODE(0, 0); |
111 | } | 111 | } |
112 | |||
113 | if (ia64_platform_is("sn2") && (sal_revision == SAL_VERSION_CODE(2, 9))) | ||
114 | /* | ||
115 | * SGI Altix has hard-coded version 2.9 in their prom | ||
116 | * but they actually implement 3.2, so let's fix it here. | ||
117 | */ | ||
118 | sal_revision = SAL_VERSION_CODE(3, 2); | ||
112 | } | 119 | } |
113 | 120 | ||
114 | static void __init | 121 | static void __init |
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index ebd1a09f3201..4aa9eaea76c3 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
@@ -690,7 +690,7 @@ get_model_name(__u8 family, __u8 model) | |||
690 | if (overflow++ == 0) | 690 | if (overflow++ == 0) |
691 | printk(KERN_ERR | 691 | printk(KERN_ERR |
692 | "%s: Table overflow. Some processor model information will be missing\n", | 692 | "%s: Table overflow. Some processor model information will be missing\n", |
693 | __FUNCTION__); | 693 | __func__); |
694 | return "Unknown"; | 694 | return "Unknown"; |
695 | } | 695 | } |
696 | 696 | ||
@@ -785,7 +785,7 @@ get_max_cacheline_size (void) | |||
785 | status = ia64_pal_cache_summary(&levels, &unique_caches); | 785 | status = ia64_pal_cache_summary(&levels, &unique_caches); |
786 | if (status != 0) { | 786 | if (status != 0) { |
787 | printk(KERN_ERR "%s: ia64_pal_cache_summary() failed (status=%ld)\n", | 787 | printk(KERN_ERR "%s: ia64_pal_cache_summary() failed (status=%ld)\n", |
788 | __FUNCTION__, status); | 788 | __func__, status); |
789 | max = SMP_CACHE_BYTES; | 789 | max = SMP_CACHE_BYTES; |
790 | /* Safest setup for "flush_icache_range()" */ | 790 | /* Safest setup for "flush_icache_range()" */ |
791 | ia64_i_cache_stride_shift = I_CACHE_STRIDE_SHIFT; | 791 | ia64_i_cache_stride_shift = I_CACHE_STRIDE_SHIFT; |
@@ -798,7 +798,7 @@ get_max_cacheline_size (void) | |||
798 | if (status != 0) { | 798 | if (status != 0) { |
799 | printk(KERN_ERR | 799 | printk(KERN_ERR |
800 | "%s: ia64_pal_cache_config_info(l=%lu, 2) failed (status=%ld)\n", | 800 | "%s: ia64_pal_cache_config_info(l=%lu, 2) failed (status=%ld)\n", |
801 | __FUNCTION__, l, status); | 801 | __func__, l, status); |
802 | max = SMP_CACHE_BYTES; | 802 | max = SMP_CACHE_BYTES; |
803 | /* The safest setup for "flush_icache_range()" */ | 803 | /* The safest setup for "flush_icache_range()" */ |
804 | cci.pcci_stride = I_CACHE_STRIDE_SHIFT; | 804 | cci.pcci_stride = I_CACHE_STRIDE_SHIFT; |
@@ -814,7 +814,7 @@ get_max_cacheline_size (void) | |||
814 | if (status != 0) { | 814 | if (status != 0) { |
815 | printk(KERN_ERR | 815 | printk(KERN_ERR |
816 | "%s: ia64_pal_cache_config_info(l=%lu, 1) failed (status=%ld)\n", | 816 | "%s: ia64_pal_cache_config_info(l=%lu, 1) failed (status=%ld)\n", |
817 | __FUNCTION__, l, status); | 817 | __func__, l, status); |
818 | /* The safest setup for "flush_icache_range()" */ | 818 | /* The safest setup for "flush_icache_range()" */ |
819 | cci.pcci_stride = I_CACHE_STRIDE_SHIFT; | 819 | cci.pcci_stride = I_CACHE_STRIDE_SHIFT; |
820 | } | 820 | } |
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c index 309da3567bc8..5740296c35af 100644 --- a/arch/ia64/kernel/signal.c +++ b/arch/ia64/kernel/signal.c | |||
@@ -342,15 +342,33 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, | |||
342 | 342 | ||
343 | new_sp = scr->pt.r12; | 343 | new_sp = scr->pt.r12; |
344 | tramp_addr = (unsigned long) __kernel_sigtramp; | 344 | tramp_addr = (unsigned long) __kernel_sigtramp; |
345 | if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags(new_sp) == 0) { | 345 | if (ka->sa.sa_flags & SA_ONSTACK) { |
346 | new_sp = current->sas_ss_sp + current->sas_ss_size; | 346 | int onstack = sas_ss_flags(new_sp); |
347 | /* | 347 | |
348 | * We need to check for the register stack being on the signal stack | 348 | if (onstack == 0) { |
349 | * separately, because it's switched separately (memory stack is switched | 349 | new_sp = current->sas_ss_sp + current->sas_ss_size; |
350 | * in the kernel, register stack is switched in the signal trampoline). | 350 | /* |
351 | */ | 351 | * We need to check for the register stack being on the |
352 | if (!rbs_on_sig_stack(scr->pt.ar_bspstore)) | 352 | * signal stack separately, because it's switched |
353 | new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1); | 353 | * separately (memory stack is switched in the kernel, |
354 | * register stack is switched in the signal trampoline). | ||
355 | */ | ||
356 | if (!rbs_on_sig_stack(scr->pt.ar_bspstore)) | ||
357 | new_rbs = ALIGN(current->sas_ss_sp, | ||
358 | sizeof(long)); | ||
359 | } else if (onstack == SS_ONSTACK) { | ||
360 | unsigned long check_sp; | ||
361 | |||
362 | /* | ||
363 | * If we are on the alternate signal stack and would | ||
364 | * overflow it, don't. Return an always-bogus address | ||
365 | * instead so we will die with SIGSEGV. | ||
366 | */ | ||
367 | check_sp = (new_sp - sizeof(*frame)) & -STACK_ALIGN; | ||
368 | if (!likely(on_sig_stack(check_sp))) | ||
369 | return force_sigsegv_info(sig, (void __user *) | ||
370 | check_sp); | ||
371 | } | ||
354 | } | 372 | } |
355 | frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN); | 373 | frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN); |
356 | 374 | ||
diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c index 52f70bbc192a..6903361d11a5 100644 --- a/arch/ia64/kernel/unaligned.c +++ b/arch/ia64/kernel/unaligned.c | |||
@@ -28,7 +28,7 @@ extern int die_if_kernel(char *str, struct pt_regs *regs, long err); | |||
28 | #undef DEBUG_UNALIGNED_TRAP | 28 | #undef DEBUG_UNALIGNED_TRAP |
29 | 29 | ||
30 | #ifdef DEBUG_UNALIGNED_TRAP | 30 | #ifdef DEBUG_UNALIGNED_TRAP |
31 | # define DPRINT(a...) do { printk("%s %u: ", __FUNCTION__, __LINE__); printk (a); } while (0) | 31 | # define DPRINT(a...) do { printk("%s %u: ", __func__, __LINE__); printk (a); } while (0) |
32 | # define DDUMP(str,vp,len) dump(str, vp, len) | 32 | # define DDUMP(str,vp,len) dump(str, vp, len) |
33 | 33 | ||
34 | static void | 34 | static void |
@@ -674,7 +674,7 @@ emulate_load_updates (update_t type, load_store_t ld, struct pt_regs *regs, unsi | |||
674 | * just in case. | 674 | * just in case. |
675 | */ | 675 | */ |
676 | if (ld.x6_op == 1 || ld.x6_op == 3) { | 676 | if (ld.x6_op == 1 || ld.x6_op == 3) { |
677 | printk(KERN_ERR "%s: register update on speculative load, error\n", __FUNCTION__); | 677 | printk(KERN_ERR "%s: register update on speculative load, error\n", __func__); |
678 | if (die_if_kernel("unaligned reference on speculative load with register update\n", | 678 | if (die_if_kernel("unaligned reference on speculative load with register update\n", |
679 | regs, 30)) | 679 | regs, 30)) |
680 | return; | 680 | return; |
@@ -1104,7 +1104,7 @@ emulate_load_floatpair (unsigned long ifa, load_store_t ld, struct pt_regs *regs | |||
1104 | */ | 1104 | */ |
1105 | if (ld.x6_op == 1 || ld.x6_op == 3) | 1105 | if (ld.x6_op == 1 || ld.x6_op == 3) |
1106 | printk(KERN_ERR "%s: register update on speculative load pair, error\n", | 1106 | printk(KERN_ERR "%s: register update on speculative load pair, error\n", |
1107 | __FUNCTION__); | 1107 | __func__); |
1108 | 1108 | ||
1109 | setreg(ld.r3, ifa, 0, regs); | 1109 | setreg(ld.r3, ifa, 0, regs); |
1110 | } | 1110 | } |
diff --git a/arch/ia64/kernel/unwind.c b/arch/ia64/kernel/unwind.c index c1bdb5131814..67810b77d998 100644 --- a/arch/ia64/kernel/unwind.c +++ b/arch/ia64/kernel/unwind.c | |||
@@ -257,7 +257,7 @@ pt_regs_off (unsigned long reg) | |||
257 | off = unw.pt_regs_offsets[reg]; | 257 | off = unw.pt_regs_offsets[reg]; |
258 | 258 | ||
259 | if (off < 0) { | 259 | if (off < 0) { |
260 | UNW_DPRINT(0, "unwind.%s: bad scratch reg r%lu\n", __FUNCTION__, reg); | 260 | UNW_DPRINT(0, "unwind.%s: bad scratch reg r%lu\n", __func__, reg); |
261 | off = 0; | 261 | off = 0; |
262 | } | 262 | } |
263 | return (unsigned long) off; | 263 | return (unsigned long) off; |
@@ -268,13 +268,13 @@ get_scratch_regs (struct unw_frame_info *info) | |||
268 | { | 268 | { |
269 | if (!info->pt) { | 269 | if (!info->pt) { |
270 | /* This should not happen with valid unwind info. */ | 270 | /* This should not happen with valid unwind info. */ |
271 | UNW_DPRINT(0, "unwind.%s: bad unwind info: resetting info->pt\n", __FUNCTION__); | 271 | UNW_DPRINT(0, "unwind.%s: bad unwind info: resetting info->pt\n", __func__); |
272 | if (info->flags & UNW_FLAG_INTERRUPT_FRAME) | 272 | if (info->flags & UNW_FLAG_INTERRUPT_FRAME) |
273 | info->pt = (unsigned long) ((struct pt_regs *) info->psp - 1); | 273 | info->pt = (unsigned long) ((struct pt_regs *) info->psp - 1); |
274 | else | 274 | else |
275 | info->pt = info->sp - 16; | 275 | info->pt = info->sp - 16; |
276 | } | 276 | } |
277 | UNW_DPRINT(3, "unwind.%s: sp 0x%lx pt 0x%lx\n", __FUNCTION__, info->sp, info->pt); | 277 | UNW_DPRINT(3, "unwind.%s: sp 0x%lx pt 0x%lx\n", __func__, info->sp, info->pt); |
278 | return (struct pt_regs *) info->pt; | 278 | return (struct pt_regs *) info->pt; |
279 | } | 279 | } |
280 | 280 | ||
@@ -294,7 +294,7 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char | |||
294 | return 0; | 294 | return 0; |
295 | } | 295 | } |
296 | UNW_DPRINT(0, "unwind.%s: trying to access non-existent r%u\n", | 296 | UNW_DPRINT(0, "unwind.%s: trying to access non-existent r%u\n", |
297 | __FUNCTION__, regnum); | 297 | __func__, regnum); |
298 | return -1; | 298 | return -1; |
299 | } | 299 | } |
300 | 300 | ||
@@ -341,7 +341,7 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char | |||
341 | { | 341 | { |
342 | UNW_DPRINT(0, "unwind.%s: %p outside of regstk " | 342 | UNW_DPRINT(0, "unwind.%s: %p outside of regstk " |
343 | "[0x%lx-0x%lx)\n", | 343 | "[0x%lx-0x%lx)\n", |
344 | __FUNCTION__, (void *) addr, | 344 | __func__, (void *) addr, |
345 | info->regstk.limit, | 345 | info->regstk.limit, |
346 | info->regstk.top); | 346 | info->regstk.top); |
347 | return -1; | 347 | return -1; |
@@ -374,7 +374,7 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char | |||
374 | || (unsigned long) addr >= info->regstk.top) | 374 | || (unsigned long) addr >= info->regstk.top) |
375 | { | 375 | { |
376 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to access register outside " | 376 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to access register outside " |
377 | "of rbs\n", __FUNCTION__); | 377 | "of rbs\n", __func__); |
378 | return -1; | 378 | return -1; |
379 | } | 379 | } |
380 | if ((unsigned long) nat_addr >= info->regstk.top) | 380 | if ((unsigned long) nat_addr >= info->regstk.top) |
@@ -385,7 +385,7 @@ unw_access_gr (struct unw_frame_info *info, int regnum, unsigned long *val, char | |||
385 | if (write) { | 385 | if (write) { |
386 | if (read_only(addr)) { | 386 | if (read_only(addr)) { |
387 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", | 387 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", |
388 | __FUNCTION__); | 388 | __func__); |
389 | } else { | 389 | } else { |
390 | *addr = *val; | 390 | *addr = *val; |
391 | if (*nat) | 391 | if (*nat) |
@@ -427,13 +427,13 @@ unw_access_br (struct unw_frame_info *info, int regnum, unsigned long *val, int | |||
427 | 427 | ||
428 | default: | 428 | default: |
429 | UNW_DPRINT(0, "unwind.%s: trying to access non-existent b%u\n", | 429 | UNW_DPRINT(0, "unwind.%s: trying to access non-existent b%u\n", |
430 | __FUNCTION__, regnum); | 430 | __func__, regnum); |
431 | return -1; | 431 | return -1; |
432 | } | 432 | } |
433 | if (write) | 433 | if (write) |
434 | if (read_only(addr)) { | 434 | if (read_only(addr)) { |
435 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", | 435 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", |
436 | __FUNCTION__); | 436 | __func__); |
437 | } else | 437 | } else |
438 | *addr = *val; | 438 | *addr = *val; |
439 | else | 439 | else |
@@ -450,7 +450,7 @@ unw_access_fr (struct unw_frame_info *info, int regnum, struct ia64_fpreg *val, | |||
450 | 450 | ||
451 | if ((unsigned) (regnum - 2) >= 126) { | 451 | if ((unsigned) (regnum - 2) >= 126) { |
452 | UNW_DPRINT(0, "unwind.%s: trying to access non-existent f%u\n", | 452 | UNW_DPRINT(0, "unwind.%s: trying to access non-existent f%u\n", |
453 | __FUNCTION__, regnum); | 453 | __func__, regnum); |
454 | return -1; | 454 | return -1; |
455 | } | 455 | } |
456 | 456 | ||
@@ -482,7 +482,7 @@ unw_access_fr (struct unw_frame_info *info, int regnum, struct ia64_fpreg *val, | |||
482 | if (write) | 482 | if (write) |
483 | if (read_only(addr)) { | 483 | if (read_only(addr)) { |
484 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", | 484 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", |
485 | __FUNCTION__); | 485 | __func__); |
486 | } else | 486 | } else |
487 | *addr = *val; | 487 | *addr = *val; |
488 | else | 488 | else |
@@ -572,14 +572,14 @@ unw_access_ar (struct unw_frame_info *info, int regnum, unsigned long *val, int | |||
572 | 572 | ||
573 | default: | 573 | default: |
574 | UNW_DPRINT(0, "unwind.%s: trying to access non-existent ar%u\n", | 574 | UNW_DPRINT(0, "unwind.%s: trying to access non-existent ar%u\n", |
575 | __FUNCTION__, regnum); | 575 | __func__, regnum); |
576 | return -1; | 576 | return -1; |
577 | } | 577 | } |
578 | 578 | ||
579 | if (write) { | 579 | if (write) { |
580 | if (read_only(addr)) { | 580 | if (read_only(addr)) { |
581 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", | 581 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", |
582 | __FUNCTION__); | 582 | __func__); |
583 | } else | 583 | } else |
584 | *addr = *val; | 584 | *addr = *val; |
585 | } else | 585 | } else |
@@ -600,7 +600,7 @@ unw_access_pr (struct unw_frame_info *info, unsigned long *val, int write) | |||
600 | if (write) { | 600 | if (write) { |
601 | if (read_only(addr)) { | 601 | if (read_only(addr)) { |
602 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", | 602 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to write read-only location\n", |
603 | __FUNCTION__); | 603 | __func__); |
604 | } else | 604 | } else |
605 | *addr = *val; | 605 | *addr = *val; |
606 | } else | 606 | } else |
@@ -699,7 +699,7 @@ decode_abreg (unsigned char abreg, int memory) | |||
699 | default: | 699 | default: |
700 | break; | 700 | break; |
701 | } | 701 | } |
702 | UNW_DPRINT(0, "unwind.%s: bad abreg=0x%x\n", __FUNCTION__, abreg); | 702 | UNW_DPRINT(0, "unwind.%s: bad abreg=0x%x\n", __func__, abreg); |
703 | return UNW_REG_LC; | 703 | return UNW_REG_LC; |
704 | } | 704 | } |
705 | 705 | ||
@@ -739,7 +739,7 @@ spill_next_when (struct unw_reg_info **regp, struct unw_reg_info *lim, unw_word | |||
739 | return; | 739 | return; |
740 | } | 740 | } |
741 | } | 741 | } |
742 | UNW_DPRINT(0, "unwind.%s: excess spill!\n", __FUNCTION__); | 742 | UNW_DPRINT(0, "unwind.%s: excess spill!\n", __func__); |
743 | } | 743 | } |
744 | 744 | ||
745 | static inline void | 745 | static inline void |
@@ -855,11 +855,11 @@ desc_abi (unsigned char abi, unsigned char context, struct unw_state_record *sr) | |||
855 | { | 855 | { |
856 | if (abi == 3 && context == 'i') { | 856 | if (abi == 3 && context == 'i') { |
857 | sr->flags |= UNW_FLAG_INTERRUPT_FRAME; | 857 | sr->flags |= UNW_FLAG_INTERRUPT_FRAME; |
858 | UNW_DPRINT(3, "unwind.%s: interrupt frame\n", __FUNCTION__); | 858 | UNW_DPRINT(3, "unwind.%s: interrupt frame\n", __func__); |
859 | } | 859 | } |
860 | else | 860 | else |
861 | UNW_DPRINT(0, "unwind%s: ignoring unwabi(abi=0x%x,context=0x%x)\n", | 861 | UNW_DPRINT(0, "unwind%s: ignoring unwabi(abi=0x%x,context=0x%x)\n", |
862 | __FUNCTION__, abi, context); | 862 | __func__, abi, context); |
863 | } | 863 | } |
864 | 864 | ||
865 | static inline void | 865 | static inline void |
@@ -1347,7 +1347,7 @@ script_emit (struct unw_script *script, struct unw_insn insn) | |||
1347 | { | 1347 | { |
1348 | if (script->count >= UNW_MAX_SCRIPT_LEN) { | 1348 | if (script->count >= UNW_MAX_SCRIPT_LEN) { |
1349 | UNW_DPRINT(0, "unwind.%s: script exceeds maximum size of %u instructions!\n", | 1349 | UNW_DPRINT(0, "unwind.%s: script exceeds maximum size of %u instructions!\n", |
1350 | __FUNCTION__, UNW_MAX_SCRIPT_LEN); | 1350 | __func__, UNW_MAX_SCRIPT_LEN); |
1351 | return; | 1351 | return; |
1352 | } | 1352 | } |
1353 | script->insn[script->count++] = insn; | 1353 | script->insn[script->count++] = insn; |
@@ -1389,7 +1389,7 @@ emit_nat_info (struct unw_state_record *sr, int i, struct unw_script *script) | |||
1389 | 1389 | ||
1390 | default: | 1390 | default: |
1391 | UNW_DPRINT(0, "unwind.%s: don't know how to emit nat info for where = %u\n", | 1391 | UNW_DPRINT(0, "unwind.%s: don't know how to emit nat info for where = %u\n", |
1392 | __FUNCTION__, r->where); | 1392 | __func__, r->where); |
1393 | return; | 1393 | return; |
1394 | } | 1394 | } |
1395 | insn.opc = opc; | 1395 | insn.opc = opc; |
@@ -1446,7 +1446,7 @@ compile_reg (struct unw_state_record *sr, int i, struct unw_script *script) | |||
1446 | val = offsetof(struct pt_regs, f6) + 16*(rval - 6); | 1446 | val = offsetof(struct pt_regs, f6) + 16*(rval - 6); |
1447 | else | 1447 | else |
1448 | UNW_DPRINT(0, "unwind.%s: kernel may not touch f%lu\n", | 1448 | UNW_DPRINT(0, "unwind.%s: kernel may not touch f%lu\n", |
1449 | __FUNCTION__, rval); | 1449 | __func__, rval); |
1450 | } | 1450 | } |
1451 | break; | 1451 | break; |
1452 | 1452 | ||
@@ -1474,7 +1474,7 @@ compile_reg (struct unw_state_record *sr, int i, struct unw_script *script) | |||
1474 | 1474 | ||
1475 | default: | 1475 | default: |
1476 | UNW_DPRINT(0, "unwind%s: register %u has unexpected `where' value of %u\n", | 1476 | UNW_DPRINT(0, "unwind%s: register %u has unexpected `where' value of %u\n", |
1477 | __FUNCTION__, i, r->where); | 1477 | __func__, i, r->where); |
1478 | break; | 1478 | break; |
1479 | } | 1479 | } |
1480 | insn.opc = opc; | 1480 | insn.opc = opc; |
@@ -1547,10 +1547,10 @@ build_script (struct unw_frame_info *info) | |||
1547 | r->when = UNW_WHEN_NEVER; | 1547 | r->when = UNW_WHEN_NEVER; |
1548 | sr.pr_val = info->pr; | 1548 | sr.pr_val = info->pr; |
1549 | 1549 | ||
1550 | UNW_DPRINT(3, "unwind.%s: ip 0x%lx\n", __FUNCTION__, ip); | 1550 | UNW_DPRINT(3, "unwind.%s: ip 0x%lx\n", __func__, ip); |
1551 | script = script_new(ip); | 1551 | script = script_new(ip); |
1552 | if (!script) { | 1552 | if (!script) { |
1553 | UNW_DPRINT(0, "unwind.%s: failed to create unwind script\n", __FUNCTION__); | 1553 | UNW_DPRINT(0, "unwind.%s: failed to create unwind script\n", __func__); |
1554 | STAT(unw.stat.script.build_time += ia64_get_itc() - start); | 1554 | STAT(unw.stat.script.build_time += ia64_get_itc() - start); |
1555 | return NULL; | 1555 | return NULL; |
1556 | } | 1556 | } |
@@ -1569,7 +1569,7 @@ build_script (struct unw_frame_info *info) | |||
1569 | if (!e) { | 1569 | if (!e) { |
1570 | /* no info, return default unwinder (leaf proc, no mem stack, no saved regs) */ | 1570 | /* no info, return default unwinder (leaf proc, no mem stack, no saved regs) */ |
1571 | UNW_DPRINT(1, "unwind.%s: no unwind info for ip=0x%lx (prev ip=0x%lx)\n", | 1571 | UNW_DPRINT(1, "unwind.%s: no unwind info for ip=0x%lx (prev ip=0x%lx)\n", |
1572 | __FUNCTION__, ip, unw.cache[info->prev_script].ip); | 1572 | __func__, ip, unw.cache[info->prev_script].ip); |
1573 | sr.curr.reg[UNW_REG_RP].where = UNW_WHERE_BR; | 1573 | sr.curr.reg[UNW_REG_RP].where = UNW_WHERE_BR; |
1574 | sr.curr.reg[UNW_REG_RP].when = -1; | 1574 | sr.curr.reg[UNW_REG_RP].when = -1; |
1575 | sr.curr.reg[UNW_REG_RP].val = 0; | 1575 | sr.curr.reg[UNW_REG_RP].val = 0; |
@@ -1618,13 +1618,13 @@ build_script (struct unw_frame_info *info) | |||
1618 | sr.curr.reg[UNW_REG_RP].when = -1; | 1618 | sr.curr.reg[UNW_REG_RP].when = -1; |
1619 | sr.curr.reg[UNW_REG_RP].val = sr.return_link_reg; | 1619 | sr.curr.reg[UNW_REG_RP].val = sr.return_link_reg; |
1620 | UNW_DPRINT(1, "unwind.%s: using default for rp at ip=0x%lx where=%d val=0x%lx\n", | 1620 | UNW_DPRINT(1, "unwind.%s: using default for rp at ip=0x%lx where=%d val=0x%lx\n", |
1621 | __FUNCTION__, ip, sr.curr.reg[UNW_REG_RP].where, | 1621 | __func__, ip, sr.curr.reg[UNW_REG_RP].where, |
1622 | sr.curr.reg[UNW_REG_RP].val); | 1622 | sr.curr.reg[UNW_REG_RP].val); |
1623 | } | 1623 | } |
1624 | 1624 | ||
1625 | #ifdef UNW_DEBUG | 1625 | #ifdef UNW_DEBUG |
1626 | UNW_DPRINT(1, "unwind.%s: state record for func 0x%lx, t=%u:\n", | 1626 | UNW_DPRINT(1, "unwind.%s: state record for func 0x%lx, t=%u:\n", |
1627 | __FUNCTION__, table->segment_base + e->start_offset, sr.when_target); | 1627 | __func__, table->segment_base + e->start_offset, sr.when_target); |
1628 | for (r = sr.curr.reg; r < sr.curr.reg + UNW_NUM_REGS; ++r) { | 1628 | for (r = sr.curr.reg; r < sr.curr.reg + UNW_NUM_REGS; ++r) { |
1629 | if (r->where != UNW_WHERE_NONE || r->when != UNW_WHEN_NEVER) { | 1629 | if (r->where != UNW_WHERE_NONE || r->when != UNW_WHEN_NEVER) { |
1630 | UNW_DPRINT(1, " %s <- ", unw.preg_name[r - sr.curr.reg]); | 1630 | UNW_DPRINT(1, " %s <- ", unw.preg_name[r - sr.curr.reg]); |
@@ -1746,7 +1746,7 @@ run_script (struct unw_script *script, struct unw_frame_info *state) | |||
1746 | } else { | 1746 | } else { |
1747 | s[dst] = 0; | 1747 | s[dst] = 0; |
1748 | UNW_DPRINT(0, "unwind.%s: no state->pt, dst=%ld, val=%ld\n", | 1748 | UNW_DPRINT(0, "unwind.%s: no state->pt, dst=%ld, val=%ld\n", |
1749 | __FUNCTION__, dst, val); | 1749 | __func__, dst, val); |
1750 | } | 1750 | } |
1751 | break; | 1751 | break; |
1752 | 1752 | ||
@@ -1756,7 +1756,7 @@ run_script (struct unw_script *script, struct unw_frame_info *state) | |||
1756 | else { | 1756 | else { |
1757 | s[dst] = 0; | 1757 | s[dst] = 0; |
1758 | UNW_DPRINT(0, "unwind.%s: UNW_INSN_MOVE_CONST bad val=%ld\n", | 1758 | UNW_DPRINT(0, "unwind.%s: UNW_INSN_MOVE_CONST bad val=%ld\n", |
1759 | __FUNCTION__, val); | 1759 | __func__, val); |
1760 | } | 1760 | } |
1761 | break; | 1761 | break; |
1762 | 1762 | ||
@@ -1791,7 +1791,7 @@ run_script (struct unw_script *script, struct unw_frame_info *state) | |||
1791 | || s[val] < TASK_SIZE) | 1791 | || s[val] < TASK_SIZE) |
1792 | { | 1792 | { |
1793 | UNW_DPRINT(0, "unwind.%s: rejecting bad psp=0x%lx\n", | 1793 | UNW_DPRINT(0, "unwind.%s: rejecting bad psp=0x%lx\n", |
1794 | __FUNCTION__, s[val]); | 1794 | __func__, s[val]); |
1795 | break; | 1795 | break; |
1796 | } | 1796 | } |
1797 | #endif | 1797 | #endif |
@@ -1825,7 +1825,7 @@ find_save_locs (struct unw_frame_info *info) | |||
1825 | if ((info->ip & (local_cpu_data->unimpl_va_mask | 0xf)) || info->ip < TASK_SIZE) { | 1825 | if ((info->ip & (local_cpu_data->unimpl_va_mask | 0xf)) || info->ip < TASK_SIZE) { |
1826 | /* don't let obviously bad addresses pollute the cache */ | 1826 | /* don't let obviously bad addresses pollute the cache */ |
1827 | /* FIXME: should really be level 0 but it occurs too often. KAO */ | 1827 | /* FIXME: should really be level 0 but it occurs too often. KAO */ |
1828 | UNW_DPRINT(1, "unwind.%s: rejecting bad ip=0x%lx\n", __FUNCTION__, info->ip); | 1828 | UNW_DPRINT(1, "unwind.%s: rejecting bad ip=0x%lx\n", __func__, info->ip); |
1829 | info->rp_loc = NULL; | 1829 | info->rp_loc = NULL; |
1830 | return -1; | 1830 | return -1; |
1831 | } | 1831 | } |
@@ -1838,7 +1838,7 @@ find_save_locs (struct unw_frame_info *info) | |||
1838 | spin_unlock_irqrestore(&unw.lock, flags); | 1838 | spin_unlock_irqrestore(&unw.lock, flags); |
1839 | UNW_DPRINT(0, | 1839 | UNW_DPRINT(0, |
1840 | "unwind.%s: failed to locate/build unwind script for ip %lx\n", | 1840 | "unwind.%s: failed to locate/build unwind script for ip %lx\n", |
1841 | __FUNCTION__, info->ip); | 1841 | __func__, info->ip); |
1842 | return -1; | 1842 | return -1; |
1843 | } | 1843 | } |
1844 | have_write_lock = 1; | 1844 | have_write_lock = 1; |
@@ -1882,21 +1882,21 @@ unw_unwind (struct unw_frame_info *info) | |||
1882 | if (!unw_valid(info, info->rp_loc)) { | 1882 | if (!unw_valid(info, info->rp_loc)) { |
1883 | /* FIXME: should really be level 0 but it occurs too often. KAO */ | 1883 | /* FIXME: should really be level 0 but it occurs too often. KAO */ |
1884 | UNW_DPRINT(1, "unwind.%s: failed to locate return link (ip=0x%lx)!\n", | 1884 | UNW_DPRINT(1, "unwind.%s: failed to locate return link (ip=0x%lx)!\n", |
1885 | __FUNCTION__, info->ip); | 1885 | __func__, info->ip); |
1886 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); | 1886 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); |
1887 | return -1; | 1887 | return -1; |
1888 | } | 1888 | } |
1889 | /* restore the ip */ | 1889 | /* restore the ip */ |
1890 | ip = info->ip = *info->rp_loc; | 1890 | ip = info->ip = *info->rp_loc; |
1891 | if (ip < GATE_ADDR) { | 1891 | if (ip < GATE_ADDR) { |
1892 | UNW_DPRINT(2, "unwind.%s: reached user-space (ip=0x%lx)\n", __FUNCTION__, ip); | 1892 | UNW_DPRINT(2, "unwind.%s: reached user-space (ip=0x%lx)\n", __func__, ip); |
1893 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); | 1893 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); |
1894 | return -1; | 1894 | return -1; |
1895 | } | 1895 | } |
1896 | 1896 | ||
1897 | /* validate the previous stack frame pointer */ | 1897 | /* validate the previous stack frame pointer */ |
1898 | if (!unw_valid(info, info->pfs_loc)) { | 1898 | if (!unw_valid(info, info->pfs_loc)) { |
1899 | UNW_DPRINT(0, "unwind.%s: failed to locate ar.pfs!\n", __FUNCTION__); | 1899 | UNW_DPRINT(0, "unwind.%s: failed to locate ar.pfs!\n", __func__); |
1900 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); | 1900 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); |
1901 | return -1; | 1901 | return -1; |
1902 | } | 1902 | } |
@@ -1912,13 +1912,13 @@ unw_unwind (struct unw_frame_info *info) | |||
1912 | num_regs = *info->cfm_loc & 0x7f; /* size of frame */ | 1912 | num_regs = *info->cfm_loc & 0x7f; /* size of frame */ |
1913 | info->pfs_loc = | 1913 | info->pfs_loc = |
1914 | (unsigned long *) (info->pt + offsetof(struct pt_regs, ar_pfs)); | 1914 | (unsigned long *) (info->pt + offsetof(struct pt_regs, ar_pfs)); |
1915 | UNW_DPRINT(3, "unwind.%s: interrupt_frame pt 0x%lx\n", __FUNCTION__, info->pt); | 1915 | UNW_DPRINT(3, "unwind.%s: interrupt_frame pt 0x%lx\n", __func__, info->pt); |
1916 | } else | 1916 | } else |
1917 | num_regs = (*info->cfm_loc >> 7) & 0x7f; /* size of locals */ | 1917 | num_regs = (*info->cfm_loc >> 7) & 0x7f; /* size of locals */ |
1918 | info->bsp = (unsigned long) ia64_rse_skip_regs((unsigned long *) info->bsp, -num_regs); | 1918 | info->bsp = (unsigned long) ia64_rse_skip_regs((unsigned long *) info->bsp, -num_regs); |
1919 | if (info->bsp < info->regstk.limit || info->bsp > info->regstk.top) { | 1919 | if (info->bsp < info->regstk.limit || info->bsp > info->regstk.top) { |
1920 | UNW_DPRINT(0, "unwind.%s: bsp (0x%lx) out of range [0x%lx-0x%lx]\n", | 1920 | UNW_DPRINT(0, "unwind.%s: bsp (0x%lx) out of range [0x%lx-0x%lx]\n", |
1921 | __FUNCTION__, info->bsp, info->regstk.limit, info->regstk.top); | 1921 | __func__, info->bsp, info->regstk.limit, info->regstk.top); |
1922 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); | 1922 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); |
1923 | return -1; | 1923 | return -1; |
1924 | } | 1924 | } |
@@ -1927,14 +1927,14 @@ unw_unwind (struct unw_frame_info *info) | |||
1927 | info->sp = info->psp; | 1927 | info->sp = info->psp; |
1928 | if (info->sp < info->memstk.top || info->sp > info->memstk.limit) { | 1928 | if (info->sp < info->memstk.top || info->sp > info->memstk.limit) { |
1929 | UNW_DPRINT(0, "unwind.%s: sp (0x%lx) out of range [0x%lx-0x%lx]\n", | 1929 | UNW_DPRINT(0, "unwind.%s: sp (0x%lx) out of range [0x%lx-0x%lx]\n", |
1930 | __FUNCTION__, info->sp, info->memstk.top, info->memstk.limit); | 1930 | __func__, info->sp, info->memstk.top, info->memstk.limit); |
1931 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); | 1931 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); |
1932 | return -1; | 1932 | return -1; |
1933 | } | 1933 | } |
1934 | 1934 | ||
1935 | if (info->ip == prev_ip && info->sp == prev_sp && info->bsp == prev_bsp) { | 1935 | if (info->ip == prev_ip && info->sp == prev_sp && info->bsp == prev_bsp) { |
1936 | UNW_DPRINT(0, "unwind.%s: ip, sp, bsp unchanged; stopping here (ip=0x%lx)\n", | 1936 | UNW_DPRINT(0, "unwind.%s: ip, sp, bsp unchanged; stopping here (ip=0x%lx)\n", |
1937 | __FUNCTION__, ip); | 1937 | __func__, ip); |
1938 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); | 1938 | STAT(unw.stat.api.unwind_time += ia64_get_itc() - start; local_irq_restore(flags)); |
1939 | return -1; | 1939 | return -1; |
1940 | } | 1940 | } |
@@ -1961,7 +1961,7 @@ unw_unwind_to_user (struct unw_frame_info *info) | |||
1961 | if ((long)((unsigned long)info->task + IA64_STK_OFFSET - sp) | 1961 | if ((long)((unsigned long)info->task + IA64_STK_OFFSET - sp) |
1962 | < IA64_PT_REGS_SIZE) { | 1962 | < IA64_PT_REGS_SIZE) { |
1963 | UNW_DPRINT(0, "unwind.%s: ran off the top of the kernel stack\n", | 1963 | UNW_DPRINT(0, "unwind.%s: ran off the top of the kernel stack\n", |
1964 | __FUNCTION__); | 1964 | __func__); |
1965 | break; | 1965 | break; |
1966 | } | 1966 | } |
1967 | if (unw_is_intr_frame(info) && | 1967 | if (unw_is_intr_frame(info) && |
@@ -1971,13 +1971,13 @@ unw_unwind_to_user (struct unw_frame_info *info) | |||
1971 | unw_get_rp(info, &ip); | 1971 | unw_get_rp(info, &ip); |
1972 | UNW_DPRINT(0, "unwind.%s: failed to read " | 1972 | UNW_DPRINT(0, "unwind.%s: failed to read " |
1973 | "predicate register (ip=0x%lx)\n", | 1973 | "predicate register (ip=0x%lx)\n", |
1974 | __FUNCTION__, ip); | 1974 | __func__, ip); |
1975 | return -1; | 1975 | return -1; |
1976 | } | 1976 | } |
1977 | } while (unw_unwind(info) >= 0); | 1977 | } while (unw_unwind(info) >= 0); |
1978 | unw_get_ip(info, &ip); | 1978 | unw_get_ip(info, &ip); |
1979 | UNW_DPRINT(0, "unwind.%s: failed to unwind to user-level (ip=0x%lx)\n", | 1979 | UNW_DPRINT(0, "unwind.%s: failed to unwind to user-level (ip=0x%lx)\n", |
1980 | __FUNCTION__, ip); | 1980 | __func__, ip); |
1981 | return -1; | 1981 | return -1; |
1982 | } | 1982 | } |
1983 | EXPORT_SYMBOL(unw_unwind_to_user); | 1983 | EXPORT_SYMBOL(unw_unwind_to_user); |
@@ -2028,7 +2028,7 @@ init_frame_info (struct unw_frame_info *info, struct task_struct *t, | |||
2028 | " pr 0x%lx\n" | 2028 | " pr 0x%lx\n" |
2029 | " sw 0x%lx\n" | 2029 | " sw 0x%lx\n" |
2030 | " sp 0x%lx\n", | 2030 | " sp 0x%lx\n", |
2031 | __FUNCTION__, (unsigned long) t, rbslimit, rbstop, stktop, stklimit, | 2031 | __func__, (unsigned long) t, rbslimit, rbstop, stktop, stklimit, |
2032 | info->pr, (unsigned long) info->sw, info->sp); | 2032 | info->pr, (unsigned long) info->sw, info->sp); |
2033 | STAT(unw.stat.api.init_time += ia64_get_itc() - start; local_irq_restore(flags)); | 2033 | STAT(unw.stat.api.init_time += ia64_get_itc() - start; local_irq_restore(flags)); |
2034 | } | 2034 | } |
@@ -2047,7 +2047,7 @@ unw_init_frame_info (struct unw_frame_info *info, struct task_struct *t, struct | |||
2047 | " bsp 0x%lx\n" | 2047 | " bsp 0x%lx\n" |
2048 | " sol 0x%lx\n" | 2048 | " sol 0x%lx\n" |
2049 | " ip 0x%lx\n", | 2049 | " ip 0x%lx\n", |
2050 | __FUNCTION__, info->bsp, sol, info->ip); | 2050 | __func__, info->bsp, sol, info->ip); |
2051 | find_save_locs(info); | 2051 | find_save_locs(info); |
2052 | } | 2052 | } |
2053 | 2053 | ||
@@ -2058,7 +2058,7 @@ unw_init_from_blocked_task (struct unw_frame_info *info, struct task_struct *t) | |||
2058 | { | 2058 | { |
2059 | struct switch_stack *sw = (struct switch_stack *) (t->thread.ksp + 16); | 2059 | struct switch_stack *sw = (struct switch_stack *) (t->thread.ksp + 16); |
2060 | 2060 | ||
2061 | UNW_DPRINT(1, "unwind.%s\n", __FUNCTION__); | 2061 | UNW_DPRINT(1, "unwind.%s\n", __func__); |
2062 | unw_init_frame_info(info, t, sw); | 2062 | unw_init_frame_info(info, t, sw); |
2063 | } | 2063 | } |
2064 | EXPORT_SYMBOL(unw_init_from_blocked_task); | 2064 | EXPORT_SYMBOL(unw_init_from_blocked_task); |
@@ -2088,7 +2088,7 @@ unw_add_unwind_table (const char *name, unsigned long segment_base, unsigned lon | |||
2088 | 2088 | ||
2089 | if (end - start <= 0) { | 2089 | if (end - start <= 0) { |
2090 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to insert empty unwind table\n", | 2090 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to insert empty unwind table\n", |
2091 | __FUNCTION__); | 2091 | __func__); |
2092 | return NULL; | 2092 | return NULL; |
2093 | } | 2093 | } |
2094 | 2094 | ||
@@ -2119,14 +2119,14 @@ unw_remove_unwind_table (void *handle) | |||
2119 | 2119 | ||
2120 | if (!handle) { | 2120 | if (!handle) { |
2121 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to remove non-existent unwind table\n", | 2121 | UNW_DPRINT(0, "unwind.%s: ignoring attempt to remove non-existent unwind table\n", |
2122 | __FUNCTION__); | 2122 | __func__); |
2123 | return; | 2123 | return; |
2124 | } | 2124 | } |
2125 | 2125 | ||
2126 | table = handle; | 2126 | table = handle; |
2127 | if (table == &unw.kernel_table) { | 2127 | if (table == &unw.kernel_table) { |
2128 | UNW_DPRINT(0, "unwind.%s: sorry, freeing the kernel's unwind table is a " | 2128 | UNW_DPRINT(0, "unwind.%s: sorry, freeing the kernel's unwind table is a " |
2129 | "no-can-do!\n", __FUNCTION__); | 2129 | "no-can-do!\n", __func__); |
2130 | return; | 2130 | return; |
2131 | } | 2131 | } |
2132 | 2132 | ||
@@ -2139,7 +2139,7 @@ unw_remove_unwind_table (void *handle) | |||
2139 | break; | 2139 | break; |
2140 | if (!prev) { | 2140 | if (!prev) { |
2141 | UNW_DPRINT(0, "unwind.%s: failed to find unwind table %p\n", | 2141 | UNW_DPRINT(0, "unwind.%s: failed to find unwind table %p\n", |
2142 | __FUNCTION__, (void *) table); | 2142 | __func__, (void *) table); |
2143 | spin_unlock_irqrestore(&unw.lock, flags); | 2143 | spin_unlock_irqrestore(&unw.lock, flags); |
2144 | return; | 2144 | return; |
2145 | } | 2145 | } |
@@ -2185,7 +2185,7 @@ create_gate_table (void) | |||
2185 | } | 2185 | } |
2186 | 2186 | ||
2187 | if (!punw) { | 2187 | if (!punw) { |
2188 | printk("%s: failed to find gate DSO's unwind table!\n", __FUNCTION__); | 2188 | printk("%s: failed to find gate DSO's unwind table!\n", __func__); |
2189 | return 0; | 2189 | return 0; |
2190 | } | 2190 | } |
2191 | 2191 | ||
@@ -2202,7 +2202,7 @@ create_gate_table (void) | |||
2202 | unw.gate_table = kmalloc(size, GFP_KERNEL); | 2202 | unw.gate_table = kmalloc(size, GFP_KERNEL); |
2203 | if (!unw.gate_table) { | 2203 | if (!unw.gate_table) { |
2204 | unw.gate_table_size = 0; | 2204 | unw.gate_table_size = 0; |
2205 | printk(KERN_ERR "%s: unable to create unwind data for gate page!\n", __FUNCTION__); | 2205 | printk(KERN_ERR "%s: unable to create unwind data for gate page!\n", __func__); |
2206 | return 0; | 2206 | return 0; |
2207 | } | 2207 | } |
2208 | unw.gate_table_size = size; | 2208 | unw.gate_table_size = size; |
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c index 3e69881648a3..23088bed111e 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c | |||
@@ -26,7 +26,7 @@ static inline int notify_page_fault(struct pt_regs *regs, int trap) | |||
26 | if (!user_mode(regs)) { | 26 | if (!user_mode(regs)) { |
27 | /* kprobe_running() needs smp_processor_id() */ | 27 | /* kprobe_running() needs smp_processor_id() */ |
28 | preempt_disable(); | 28 | preempt_disable(); |
29 | if (kprobe_running() && kprobes_fault_handler(regs, trap)) | 29 | if (kprobe_running() && kprobe_fault_handler(regs, trap)) |
30 | ret = 1; | 30 | ret = 1; |
31 | preempt_enable(); | 31 | preempt_enable(); |
32 | } | 32 | } |
diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index 25aef6211a54..a4ca657c72c6 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c | |||
@@ -714,7 +714,7 @@ int arch_add_memory(int nid, u64 start, u64 size) | |||
714 | 714 | ||
715 | if (ret) | 715 | if (ret) |
716 | printk("%s: Problem encountered in __add_pages() as ret=%d\n", | 716 | printk("%s: Problem encountered in __add_pages() as ret=%d\n", |
717 | __FUNCTION__, ret); | 717 | __func__, ret); |
718 | 718 | ||
719 | return ret; | 719 | return ret; |
720 | } | 720 | } |
diff --git a/arch/ia64/pci/fixup.c b/arch/ia64/pci/fixup.c index 245dc1fedc24..f5959c0c1810 100644 --- a/arch/ia64/pci/fixup.c +++ b/arch/ia64/pci/fixup.c | |||
@@ -63,7 +63,7 @@ static void __devinit pci_fixup_video(struct pci_dev *pdev) | |||
63 | pci_read_config_word(pdev, PCI_COMMAND, &config); | 63 | pci_read_config_word(pdev, PCI_COMMAND, &config); |
64 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { | 64 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { |
65 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; | 65 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; |
66 | printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev)); | 66 | dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); |
67 | } | 67 | } |
68 | } | 68 | } |
69 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); | 69 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); |
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index 8fd7e825192b..e282c348dcde 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c | |||
@@ -765,7 +765,7 @@ static void __init set_pci_cacheline_size(void) | |||
765 | status = ia64_pal_cache_summary(&levels, &unique_caches); | 765 | status = ia64_pal_cache_summary(&levels, &unique_caches); |
766 | if (status != 0) { | 766 | if (status != 0) { |
767 | printk(KERN_ERR "%s: ia64_pal_cache_summary() failed " | 767 | printk(KERN_ERR "%s: ia64_pal_cache_summary() failed " |
768 | "(status=%ld)\n", __FUNCTION__, status); | 768 | "(status=%ld)\n", __func__, status); |
769 | return; | 769 | return; |
770 | } | 770 | } |
771 | 771 | ||
@@ -773,7 +773,7 @@ static void __init set_pci_cacheline_size(void) | |||
773 | /* cache_type (data_or_unified)= */ 2, &cci); | 773 | /* cache_type (data_or_unified)= */ 2, &cci); |
774 | if (status != 0) { | 774 | if (status != 0) { |
775 | printk(KERN_ERR "%s: ia64_pal_cache_config_info() failed " | 775 | printk(KERN_ERR "%s: ia64_pal_cache_config_info() failed " |
776 | "(status=%ld)\n", __FUNCTION__, status); | 776 | "(status=%ld)\n", __func__, status); |
777 | return; | 777 | return; |
778 | } | 778 | } |
779 | pci_cache_line_size = (1 << cci.pcci_line_size) / 4; | 779 | pci_cache_line_size = (1 << cci.pcci_line_size) / 4; |
diff --git a/arch/ia64/sn/kernel/huberror.c b/arch/ia64/sn/kernel/huberror.c index b663168da55c..0101c7924a4d 100644 --- a/arch/ia64/sn/kernel/huberror.c +++ b/arch/ia64/sn/kernel/huberror.c | |||
@@ -37,7 +37,7 @@ static irqreturn_t hub_eint_handler(int irq, void *arg) | |||
37 | (u64) nasid, 0, 0, 0, 0, 0, 0); | 37 | (u64) nasid, 0, 0, 0, 0, 0, 0); |
38 | 38 | ||
39 | if ((int)ret_stuff.v0) | 39 | if ((int)ret_stuff.v0) |
40 | panic("%s: Fatal %s Error", __FUNCTION__, | 40 | panic("%s: Fatal %s Error", __func__, |
41 | ((nasid & 1) ? "TIO" : "HUBII")); | 41 | ((nasid & 1) ? "TIO" : "HUBII")); |
42 | 42 | ||
43 | if (!(nasid & 1)) /* Not a TIO, handle CRB errors */ | 43 | if (!(nasid & 1)) /* Not a TIO, handle CRB errors */ |
@@ -48,7 +48,7 @@ static irqreturn_t hub_eint_handler(int irq, void *arg) | |||
48 | (u64) nasid, 0, 0, 0, 0, 0, 0); | 48 | (u64) nasid, 0, 0, 0, 0, 0, 0); |
49 | 49 | ||
50 | if ((int)ret_stuff.v0) | 50 | if ((int)ret_stuff.v0) |
51 | panic("%s: Fatal TIO Error", __FUNCTION__); | 51 | panic("%s: Fatal TIO Error", __func__); |
52 | } else | 52 | } else |
53 | bte_error_handler((unsigned long)NODEPDA(nasid_to_cnodeid(nasid))); | 53 | bte_error_handler((unsigned long)NODEPDA(nasid_to_cnodeid(nasid))); |
54 | 54 | ||
diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c index 3c7178f5dce8..6568942a95f0 100644 --- a/arch/ia64/sn/kernel/io_acpi_init.c +++ b/arch/ia64/sn/kernel/io_acpi_init.c | |||
@@ -133,7 +133,7 @@ sn_get_bussoft_ptr(struct pci_bus *bus) | |||
133 | if (ACPI_FAILURE(status)) { | 133 | if (ACPI_FAILURE(status)) { |
134 | printk(KERN_ERR "%s: " | 134 | printk(KERN_ERR "%s: " |
135 | "acpi_get_vendor_resource() failed (0x%x) for: ", | 135 | "acpi_get_vendor_resource() failed (0x%x) for: ", |
136 | __FUNCTION__, status); | 136 | __func__, status); |
137 | acpi_ns_print_node_pathname(handle, NULL); | 137 | acpi_ns_print_node_pathname(handle, NULL); |
138 | printk("\n"); | 138 | printk("\n"); |
139 | return NULL; | 139 | return NULL; |
@@ -145,7 +145,7 @@ sn_get_bussoft_ptr(struct pci_bus *bus) | |||
145 | sizeof(struct pcibus_bussoft *)) { | 145 | sizeof(struct pcibus_bussoft *)) { |
146 | printk(KERN_ERR | 146 | printk(KERN_ERR |
147 | "%s: Invalid vendor data length %d\n", | 147 | "%s: Invalid vendor data length %d\n", |
148 | __FUNCTION__, vendor->byte_length); | 148 | __func__, vendor->byte_length); |
149 | kfree(buffer.pointer); | 149 | kfree(buffer.pointer); |
150 | return NULL; | 150 | return NULL; |
151 | } | 151 | } |
@@ -184,7 +184,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info, | |||
184 | if (ACPI_FAILURE(status)) { | 184 | if (ACPI_FAILURE(status)) { |
185 | printk(KERN_ERR | 185 | printk(KERN_ERR |
186 | "%s: acpi_get_vendor_resource() failed (0x%x) for: ", | 186 | "%s: acpi_get_vendor_resource() failed (0x%x) for: ", |
187 | __FUNCTION__, status); | 187 | __func__, status); |
188 | acpi_ns_print_node_pathname(handle, NULL); | 188 | acpi_ns_print_node_pathname(handle, NULL); |
189 | printk("\n"); | 189 | printk("\n"); |
190 | return 1; | 190 | return 1; |
@@ -196,7 +196,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info, | |||
196 | sizeof(struct pci_devdev_info *)) { | 196 | sizeof(struct pci_devdev_info *)) { |
197 | printk(KERN_ERR | 197 | printk(KERN_ERR |
198 | "%s: Invalid vendor data length: %d for: ", | 198 | "%s: Invalid vendor data length: %d for: ", |
199 | __FUNCTION__, vendor->byte_length); | 199 | __func__, vendor->byte_length); |
200 | acpi_ns_print_node_pathname(handle, NULL); | 200 | acpi_ns_print_node_pathname(handle, NULL); |
201 | printk("\n"); | 201 | printk("\n"); |
202 | ret = 1; | 202 | ret = 1; |
@@ -205,7 +205,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info, | |||
205 | 205 | ||
206 | pcidev_ptr = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL); | 206 | pcidev_ptr = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL); |
207 | if (!pcidev_ptr) | 207 | if (!pcidev_ptr) |
208 | panic("%s: Unable to alloc memory for pcidev_info", __FUNCTION__); | 208 | panic("%s: Unable to alloc memory for pcidev_info", __func__); |
209 | 209 | ||
210 | memcpy(&addr, vendor->byte_data, sizeof(struct pcidev_info *)); | 210 | memcpy(&addr, vendor->byte_data, sizeof(struct pcidev_info *)); |
211 | pcidev_prom_ptr = __va(addr); | 211 | pcidev_prom_ptr = __va(addr); |
@@ -214,7 +214,7 @@ sn_extract_device_info(acpi_handle handle, struct pcidev_info **pcidev_info, | |||
214 | /* Get the IRQ info */ | 214 | /* Get the IRQ info */ |
215 | irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL); | 215 | irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL); |
216 | if (!irq_info) | 216 | if (!irq_info) |
217 | panic("%s: Unable to alloc memory for sn_irq_info", __FUNCTION__); | 217 | panic("%s: Unable to alloc memory for sn_irq_info", __func__); |
218 | 218 | ||
219 | if (pcidev_ptr->pdi_sn_irq_info) { | 219 | if (pcidev_ptr->pdi_sn_irq_info) { |
220 | irq_info_prom = __va(pcidev_ptr->pdi_sn_irq_info); | 220 | irq_info_prom = __va(pcidev_ptr->pdi_sn_irq_info); |
@@ -249,10 +249,10 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle) | |||
249 | status = acpi_get_parent(child, &parent); | 249 | status = acpi_get_parent(child, &parent); |
250 | if (ACPI_FAILURE(status)) { | 250 | if (ACPI_FAILURE(status)) { |
251 | printk(KERN_ERR "%s: acpi_get_parent() failed " | 251 | printk(KERN_ERR "%s: acpi_get_parent() failed " |
252 | "(0x%x) for: ", __FUNCTION__, status); | 252 | "(0x%x) for: ", __func__, status); |
253 | acpi_ns_print_node_pathname(child, NULL); | 253 | acpi_ns_print_node_pathname(child, NULL); |
254 | printk("\n"); | 254 | printk("\n"); |
255 | panic("%s: Unable to find host devfn\n", __FUNCTION__); | 255 | panic("%s: Unable to find host devfn\n", __func__); |
256 | } | 256 | } |
257 | if (parent == rootbus_handle) | 257 | if (parent == rootbus_handle) |
258 | break; | 258 | break; |
@@ -260,7 +260,7 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle) | |||
260 | } | 260 | } |
261 | if (!child) { | 261 | if (!child) { |
262 | printk(KERN_ERR "%s: Unable to find root bus for: ", | 262 | printk(KERN_ERR "%s: Unable to find root bus for: ", |
263 | __FUNCTION__); | 263 | __func__); |
264 | acpi_ns_print_node_pathname(device_handle, NULL); | 264 | acpi_ns_print_node_pathname(device_handle, NULL); |
265 | printk("\n"); | 265 | printk("\n"); |
266 | BUG(); | 266 | BUG(); |
@@ -269,10 +269,10 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle) | |||
269 | status = acpi_evaluate_integer(child, METHOD_NAME__ADR, NULL, &adr); | 269 | status = acpi_evaluate_integer(child, METHOD_NAME__ADR, NULL, &adr); |
270 | if (ACPI_FAILURE(status)) { | 270 | if (ACPI_FAILURE(status)) { |
271 | printk(KERN_ERR "%s: Unable to get _ADR (0x%x) for: ", | 271 | printk(KERN_ERR "%s: Unable to get _ADR (0x%x) for: ", |
272 | __FUNCTION__, status); | 272 | __func__, status); |
273 | acpi_ns_print_node_pathname(child, NULL); | 273 | acpi_ns_print_node_pathname(child, NULL); |
274 | printk("\n"); | 274 | printk("\n"); |
275 | panic("%s: Unable to find host devfn\n", __FUNCTION__); | 275 | panic("%s: Unable to find host devfn\n", __func__); |
276 | } | 276 | } |
277 | 277 | ||
278 | slot = (adr >> 16) & 0xffff; | 278 | slot = (adr >> 16) & 0xffff; |
@@ -308,7 +308,7 @@ find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
308 | if (ACPI_FAILURE(status)) { | 308 | if (ACPI_FAILURE(status)) { |
309 | printk(KERN_ERR | 309 | printk(KERN_ERR |
310 | "%s: acpi_get_parent() failed (0x%x) for: ", | 310 | "%s: acpi_get_parent() failed (0x%x) for: ", |
311 | __FUNCTION__, status); | 311 | __func__, status); |
312 | acpi_ns_print_node_pathname(handle, NULL); | 312 | acpi_ns_print_node_pathname(handle, NULL); |
313 | printk("\n"); | 313 | printk("\n"); |
314 | return AE_OK; | 314 | return AE_OK; |
@@ -318,7 +318,7 @@ find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv) | |||
318 | if (ACPI_FAILURE(status)) { | 318 | if (ACPI_FAILURE(status)) { |
319 | printk(KERN_ERR | 319 | printk(KERN_ERR |
320 | "%s: Failed to find _BBN in parent of: ", | 320 | "%s: Failed to find _BBN in parent of: ", |
321 | __FUNCTION__); | 321 | __func__); |
322 | acpi_ns_print_node_pathname(handle, NULL); | 322 | acpi_ns_print_node_pathname(handle, NULL); |
323 | printk("\n"); | 323 | printk("\n"); |
324 | return AE_OK; | 324 | return AE_OK; |
@@ -358,14 +358,14 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info, | |||
358 | if (segment != pci_domain_nr(dev)) { | 358 | if (segment != pci_domain_nr(dev)) { |
359 | printk(KERN_ERR | 359 | printk(KERN_ERR |
360 | "%s: Segment number mismatch, 0x%lx vs 0x%x for: ", | 360 | "%s: Segment number mismatch, 0x%lx vs 0x%x for: ", |
361 | __FUNCTION__, segment, pci_domain_nr(dev)); | 361 | __func__, segment, pci_domain_nr(dev)); |
362 | acpi_ns_print_node_pathname(rootbus_handle, NULL); | 362 | acpi_ns_print_node_pathname(rootbus_handle, NULL); |
363 | printk("\n"); | 363 | printk("\n"); |
364 | return 1; | 364 | return 1; |
365 | } | 365 | } |
366 | } else { | 366 | } else { |
367 | printk(KERN_ERR "%s: Unable to get __SEG from: ", | 367 | printk(KERN_ERR "%s: Unable to get __SEG from: ", |
368 | __FUNCTION__); | 368 | __func__); |
369 | acpi_ns_print_node_pathname(rootbus_handle, NULL); | 369 | acpi_ns_print_node_pathname(rootbus_handle, NULL); |
370 | printk("\n"); | 370 | printk("\n"); |
371 | return 1; | 371 | return 1; |
@@ -386,7 +386,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info, | |||
386 | if (!pcidev_match.handle) { | 386 | if (!pcidev_match.handle) { |
387 | printk(KERN_ERR | 387 | printk(KERN_ERR |
388 | "%s: Could not find matching ACPI device for %s.\n", | 388 | "%s: Could not find matching ACPI device for %s.\n", |
389 | __FUNCTION__, pci_name(dev)); | 389 | __func__, pci_name(dev)); |
390 | return 1; | 390 | return 1; |
391 | } | 391 | } |
392 | 392 | ||
@@ -422,7 +422,7 @@ sn_acpi_slot_fixup(struct pci_dev *dev) | |||
422 | 422 | ||
423 | if (sn_acpi_get_pcidev_info(dev, &pcidev_info, &sn_irq_info)) { | 423 | if (sn_acpi_get_pcidev_info(dev, &pcidev_info, &sn_irq_info)) { |
424 | panic("%s: Failure obtaining pcidev_info for %s\n", | 424 | panic("%s: Failure obtaining pcidev_info for %s\n", |
425 | __FUNCTION__, pci_name(dev)); | 425 | __func__, pci_name(dev)); |
426 | } | 426 | } |
427 | 427 | ||
428 | if (pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE]) { | 428 | if (pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE]) { |
@@ -463,7 +463,7 @@ sn_acpi_bus_fixup(struct pci_bus *bus) | |||
463 | printk(KERN_ERR | 463 | printk(KERN_ERR |
464 | "%s: 0x%04x:0x%02x Unable to " | 464 | "%s: 0x%04x:0x%02x Unable to " |
465 | "obtain prom_bussoft_ptr\n", | 465 | "obtain prom_bussoft_ptr\n", |
466 | __FUNCTION__, pci_domain_nr(bus), bus->number); | 466 | __func__, pci_domain_nr(bus), bus->number); |
467 | return; | 467 | return; |
468 | } | 468 | } |
469 | sn_common_bus_fixup(bus, prom_bussoft_ptr); | 469 | sn_common_bus_fixup(bus, prom_bussoft_ptr); |
diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c index c4eb84f9e781..8a924a5661dd 100644 --- a/arch/ia64/sn/kernel/io_common.c +++ b/arch/ia64/sn/kernel/io_common.c | |||
@@ -364,7 +364,7 @@ void sn_bus_store_sysdata(struct pci_dev *dev) | |||
364 | 364 | ||
365 | element = kzalloc(sizeof(struct sysdata_el), GFP_KERNEL); | 365 | element = kzalloc(sizeof(struct sysdata_el), GFP_KERNEL); |
366 | if (!element) { | 366 | if (!element) { |
367 | dev_dbg(&dev->dev, "%s: out of memory!\n", __FUNCTION__); | 367 | dev_dbg(&dev->dev, "%s: out of memory!\n", __func__); |
368 | return; | 368 | return; |
369 | } | 369 | } |
370 | element->sysdata = SN_PCIDEV_INFO(dev); | 370 | element->sysdata = SN_PCIDEV_INFO(dev); |
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c index 906b93674b76..c3aa851d1ca6 100644 --- a/arch/ia64/sn/kernel/io_init.c +++ b/arch/ia64/sn/kernel/io_init.c | |||
@@ -209,11 +209,11 @@ sn_io_slot_fixup(struct pci_dev *dev) | |||
209 | 209 | ||
210 | pcidev_info = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL); | 210 | pcidev_info = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL); |
211 | if (!pcidev_info) | 211 | if (!pcidev_info) |
212 | panic("%s: Unable to alloc memory for pcidev_info", __FUNCTION__); | 212 | panic("%s: Unable to alloc memory for pcidev_info", __func__); |
213 | 213 | ||
214 | sn_irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL); | 214 | sn_irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL); |
215 | if (!sn_irq_info) | 215 | if (!sn_irq_info) |
216 | panic("%s: Unable to alloc memory for sn_irq_info", __FUNCTION__); | 216 | panic("%s: Unable to alloc memory for sn_irq_info", __func__); |
217 | 217 | ||
218 | /* Call to retrieve pci device information needed by kernel. */ | 218 | /* Call to retrieve pci device information needed by kernel. */ |
219 | status = sal_get_pcidev_info((u64) pci_domain_nr(dev), | 219 | status = sal_get_pcidev_info((u64) pci_domain_nr(dev), |
diff --git a/arch/ia64/sn/kernel/mca.c b/arch/ia64/sn/kernel/mca.c index 868c9aa64fe2..27793f7aa99c 100644 --- a/arch/ia64/sn/kernel/mca.c +++ b/arch/ia64/sn/kernel/mca.c | |||
@@ -100,7 +100,7 @@ sn_platform_plat_specific_err_print(const u8 * sect_header, u8 ** oemdata, | |||
100 | if (!newbuf) { | 100 | if (!newbuf) { |
101 | mutex_unlock(&sn_oemdata_mutex); | 101 | mutex_unlock(&sn_oemdata_mutex); |
102 | printk(KERN_ERR "%s: unable to extend sn_oemdata\n", | 102 | printk(KERN_ERR "%s: unable to extend sn_oemdata\n", |
103 | __FUNCTION__); | 103 | __func__); |
104 | return 1; | 104 | return 1; |
105 | } | 105 | } |
106 | vfree(*sn_oemdata); | 106 | vfree(*sn_oemdata); |
diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index 511db2fd7bff..18b94b792d54 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c | |||
@@ -116,7 +116,7 @@ void *sn_dma_alloc_coherent(struct device *dev, size_t size, | |||
116 | *dma_handle = provider->dma_map_consistent(pdev, phys_addr, size, | 116 | *dma_handle = provider->dma_map_consistent(pdev, phys_addr, size, |
117 | SN_DMA_ADDR_PHYS); | 117 | SN_DMA_ADDR_PHYS); |
118 | if (!*dma_handle) { | 118 | if (!*dma_handle) { |
119 | printk(KERN_ERR "%s: out of ATEs\n", __FUNCTION__); | 119 | printk(KERN_ERR "%s: out of ATEs\n", __func__); |
120 | free_pages((unsigned long)cpuaddr, get_order(size)); | 120 | free_pages((unsigned long)cpuaddr, get_order(size)); |
121 | return NULL; | 121 | return NULL; |
122 | } | 122 | } |
@@ -179,7 +179,7 @@ dma_addr_t sn_dma_map_single(struct device *dev, void *cpu_addr, size_t size, | |||
179 | phys_addr = __pa(cpu_addr); | 179 | phys_addr = __pa(cpu_addr); |
180 | dma_addr = provider->dma_map(pdev, phys_addr, size, SN_DMA_ADDR_PHYS); | 180 | dma_addr = provider->dma_map(pdev, phys_addr, size, SN_DMA_ADDR_PHYS); |
181 | if (!dma_addr) { | 181 | if (!dma_addr) { |
182 | printk(KERN_ERR "%s: out of ATEs\n", __FUNCTION__); | 182 | printk(KERN_ERR "%s: out of ATEs\n", __func__); |
183 | return 0; | 183 | return 0; |
184 | } | 184 | } |
185 | return dma_addr; | 185 | return dma_addr; |
@@ -266,7 +266,7 @@ int sn_dma_map_sg(struct device *dev, struct scatterlist *sgl, int nhwentries, | |||
266 | SN_DMA_ADDR_PHYS); | 266 | SN_DMA_ADDR_PHYS); |
267 | 267 | ||
268 | if (!sg->dma_address) { | 268 | if (!sg->dma_address) { |
269 | printk(KERN_ERR "%s: out of ATEs\n", __FUNCTION__); | 269 | printk(KERN_ERR "%s: out of ATEs\n", __func__); |
270 | 270 | ||
271 | /* | 271 | /* |
272 | * Free any successfully allocated entries. | 272 | * Free any successfully allocated entries. |
diff --git a/arch/ia64/sn/pci/tioca_provider.c b/arch/ia64/sn/pci/tioca_provider.c index ef048a674772..529462c01570 100644 --- a/arch/ia64/sn/pci/tioca_provider.c +++ b/arch/ia64/sn/pci/tioca_provider.c | |||
@@ -88,7 +88,7 @@ tioca_gart_init(struct tioca_kernel *tioca_kern) | |||
88 | break; | 88 | break; |
89 | default: | 89 | default: |
90 | printk(KERN_ERR "%s: Invalid CA_APERATURE_SIZE " | 90 | printk(KERN_ERR "%s: Invalid CA_APERATURE_SIZE " |
91 | "0x%lx\n", __FUNCTION__, (ulong) CA_APERATURE_SIZE); | 91 | "0x%lx\n", __func__, (ulong) CA_APERATURE_SIZE); |
92 | return -1; | 92 | return -1; |
93 | } | 93 | } |
94 | 94 | ||
@@ -124,7 +124,7 @@ tioca_gart_init(struct tioca_kernel *tioca_kern) | |||
124 | if (!tmp) { | 124 | if (!tmp) { |
125 | printk(KERN_ERR "%s: Could not allocate " | 125 | printk(KERN_ERR "%s: Could not allocate " |
126 | "%lu bytes (order %d) for GART\n", | 126 | "%lu bytes (order %d) for GART\n", |
127 | __FUNCTION__, | 127 | __func__, |
128 | tioca_kern->ca_gart_size, | 128 | tioca_kern->ca_gart_size, |
129 | get_order(tioca_kern->ca_gart_size)); | 129 | get_order(tioca_kern->ca_gart_size)); |
130 | return -ENOMEM; | 130 | return -ENOMEM; |
@@ -341,7 +341,7 @@ tioca_dma_d48(struct pci_dev *pdev, u64 paddr) | |||
341 | 341 | ||
342 | if (node_upper > 64) { | 342 | if (node_upper > 64) { |
343 | printk(KERN_ERR "%s: coretalk addr 0x%p node id out " | 343 | printk(KERN_ERR "%s: coretalk addr 0x%p node id out " |
344 | "of range\n", __FUNCTION__, (void *)ct_addr); | 344 | "of range\n", __func__, (void *)ct_addr); |
345 | return 0; | 345 | return 0; |
346 | } | 346 | } |
347 | 347 | ||
@@ -349,7 +349,7 @@ tioca_dma_d48(struct pci_dev *pdev, u64 paddr) | |||
349 | if (node_upper != (agp_dma_extn >> CA_AGP_DMA_NODE_ID_SHFT)) { | 349 | if (node_upper != (agp_dma_extn >> CA_AGP_DMA_NODE_ID_SHFT)) { |
350 | printk(KERN_ERR "%s: coretalk upper node (%u) " | 350 | printk(KERN_ERR "%s: coretalk upper node (%u) " |
351 | "mismatch with ca_agp_dma_addr_extn (%lu)\n", | 351 | "mismatch with ca_agp_dma_addr_extn (%lu)\n", |
352 | __FUNCTION__, | 352 | __func__, |
353 | node_upper, (agp_dma_extn >> CA_AGP_DMA_NODE_ID_SHFT)); | 353 | node_upper, (agp_dma_extn >> CA_AGP_DMA_NODE_ID_SHFT)); |
354 | return 0; | 354 | return 0; |
355 | } | 355 | } |
@@ -597,7 +597,7 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont | |||
597 | if (is_shub1() && sn_sal_rev() < 0x0406) { | 597 | if (is_shub1() && sn_sal_rev() < 0x0406) { |
598 | printk | 598 | printk |
599 | (KERN_ERR "%s: SGI prom rev 4.06 or greater required " | 599 | (KERN_ERR "%s: SGI prom rev 4.06 or greater required " |
600 | "for tioca support\n", __FUNCTION__); | 600 | "for tioca support\n", __func__); |
601 | return NULL; | 601 | return NULL; |
602 | } | 602 | } |
603 | 603 | ||
@@ -651,7 +651,7 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont | |||
651 | printk(KERN_WARNING | 651 | printk(KERN_WARNING |
652 | "%s: Unable to get irq %d. " | 652 | "%s: Unable to get irq %d. " |
653 | "Error interrupts won't be routed for TIOCA bus %d\n", | 653 | "Error interrupts won't be routed for TIOCA bus %d\n", |
654 | __FUNCTION__, SGI_TIOCA_ERROR, | 654 | __func__, SGI_TIOCA_ERROR, |
655 | (int)tioca_common->ca_common.bs_persist_busnum); | 655 | (int)tioca_common->ca_common.bs_persist_busnum); |
656 | 656 | ||
657 | sn_set_err_irq_affinity(SGI_TIOCA_ERROR); | 657 | sn_set_err_irq_affinity(SGI_TIOCA_ERROR); |
diff --git a/arch/ia64/sn/pci/tioce_provider.c b/arch/ia64/sn/pci/tioce_provider.c index 999f14f986e2..9b3c11373022 100644 --- a/arch/ia64/sn/pci/tioce_provider.c +++ b/arch/ia64/sn/pci/tioce_provider.c | |||
@@ -494,7 +494,7 @@ tioce_dma_unmap(struct pci_dev *pdev, dma_addr_t bus_addr, int dir) | |||
494 | if (&map->ce_dmamap_list == &ce_kern->ce_dmamap_list) { | 494 | if (&map->ce_dmamap_list == &ce_kern->ce_dmamap_list) { |
495 | printk(KERN_WARNING | 495 | printk(KERN_WARNING |
496 | "%s: %s - no map found for bus_addr 0x%lx\n", | 496 | "%s: %s - no map found for bus_addr 0x%lx\n", |
497 | __FUNCTION__, pci_name(pdev), bus_addr); | 497 | __func__, pci_name(pdev), bus_addr); |
498 | } else if (--map->refcnt == 0) { | 498 | } else if (--map->refcnt == 0) { |
499 | for (i = 0; i < map->ate_count; i++) { | 499 | for (i = 0; i < map->ate_count; i++) { |
500 | map->ate_shadow[i] = 0; | 500 | map->ate_shadow[i] = 0; |
@@ -1030,7 +1030,7 @@ tioce_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont | |||
1030 | "%s: Unable to get irq %d. " | 1030 | "%s: Unable to get irq %d. " |
1031 | "Error interrupts won't be routed for " | 1031 | "Error interrupts won't be routed for " |
1032 | "TIOCE bus %04x:%02x\n", | 1032 | "TIOCE bus %04x:%02x\n", |
1033 | __FUNCTION__, SGI_PCIASIC_ERROR, | 1033 | __func__, SGI_PCIASIC_ERROR, |
1034 | tioce_common->ce_pcibus.bs_persist_segment, | 1034 | tioce_common->ce_pcibus.bs_persist_segment, |
1035 | tioce_common->ce_pcibus.bs_persist_busnum); | 1035 | tioce_common->ce_pcibus.bs_persist_busnum); |
1036 | 1036 | ||
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S index 6dfa3b3c0e2a..18a9c5f4b00d 100644 --- a/arch/m68k/kernel/entry.S +++ b/arch/m68k/kernel/entry.S | |||
@@ -742,7 +742,9 @@ sys_call_table: | |||
742 | .long sys_epoll_pwait /* 315 */ | 742 | .long sys_epoll_pwait /* 315 */ |
743 | .long sys_utimensat | 743 | .long sys_utimensat |
744 | .long sys_signalfd | 744 | .long sys_signalfd |
745 | .long sys_ni_syscall | 745 | .long sys_timerfd_create |
746 | .long sys_eventfd | 746 | .long sys_eventfd |
747 | .long sys_fallocate /* 320 */ | 747 | .long sys_fallocate /* 320 */ |
748 | .long sys_timerfd_settime | ||
749 | .long sys_timerfd_gettime | ||
748 | 750 | ||
diff --git a/arch/m68knommu/defconfig b/arch/m68knommu/defconfig index 648113075f97..670b0a99cfa0 100644 --- a/arch/m68knommu/defconfig +++ b/arch/m68knommu/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.23 | 3 | # Linux kernel version: 2.6.25-rc3 |
4 | # Thu Oct 18 13:17:38 2007 | 4 | # Mon Feb 25 15:03:00 2008 |
5 | # | 5 | # |
6 | CONFIG_M68K=y | 6 | CONFIG_M68K=y |
7 | # CONFIG_MMU is not set | 7 | # CONFIG_MMU is not set |
@@ -15,8 +15,10 @@ CONFIG_GENERIC_FIND_NEXT_BIT=y | |||
15 | CONFIG_GENERIC_HWEIGHT=y | 15 | CONFIG_GENERIC_HWEIGHT=y |
16 | CONFIG_GENERIC_HARDIRQS=y | 16 | CONFIG_GENERIC_HARDIRQS=y |
17 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 17 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
18 | CONFIG_GENERIC_TIME=y | ||
18 | CONFIG_TIME_LOW_RES=y | 19 | CONFIG_TIME_LOW_RES=y |
19 | CONFIG_NO_IOPORT=y | 20 | CONFIG_NO_IOPORT=y |
21 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
20 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 22 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
21 | 23 | ||
22 | # | 24 | # |
@@ -31,12 +33,14 @@ CONFIG_LOCALVERSION_AUTO=y | |||
31 | # CONFIG_POSIX_MQUEUE is not set | 33 | # CONFIG_POSIX_MQUEUE is not set |
32 | # CONFIG_BSD_PROCESS_ACCT is not set | 34 | # CONFIG_BSD_PROCESS_ACCT is not set |
33 | # CONFIG_TASKSTATS is not set | 35 | # CONFIG_TASKSTATS is not set |
34 | # CONFIG_USER_NS is not set | ||
35 | # CONFIG_AUDIT is not set | 36 | # CONFIG_AUDIT is not set |
36 | # CONFIG_IKCONFIG is not set | 37 | # CONFIG_IKCONFIG is not set |
37 | CONFIG_LOG_BUF_SHIFT=14 | 38 | CONFIG_LOG_BUF_SHIFT=14 |
39 | # CONFIG_CGROUPS is not set | ||
40 | # CONFIG_GROUP_SCHED is not set | ||
38 | # CONFIG_SYSFS_DEPRECATED is not set | 41 | # CONFIG_SYSFS_DEPRECATED is not set |
39 | # CONFIG_RELAY is not set | 42 | # CONFIG_RELAY is not set |
43 | # CONFIG_NAMESPACES is not set | ||
40 | # CONFIG_BLK_DEV_INITRD is not set | 44 | # CONFIG_BLK_DEV_INITRD is not set |
41 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 45 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
42 | CONFIG_SYSCTL=y | 46 | CONFIG_SYSCTL=y |
@@ -48,15 +52,22 @@ CONFIG_SYSCTL_SYSCALL=y | |||
48 | CONFIG_PRINTK=y | 52 | CONFIG_PRINTK=y |
49 | CONFIG_BUG=y | 53 | CONFIG_BUG=y |
50 | CONFIG_ELF_CORE=y | 54 | CONFIG_ELF_CORE=y |
55 | CONFIG_COMPAT_BRK=y | ||
51 | CONFIG_BASE_FULL=y | 56 | CONFIG_BASE_FULL=y |
52 | # CONFIG_FUTEX is not set | 57 | # CONFIG_FUTEX is not set |
53 | # CONFIG_EPOLL is not set | 58 | # CONFIG_EPOLL is not set |
54 | # CONFIG_SIGNALFD is not set | 59 | # CONFIG_SIGNALFD is not set |
60 | # CONFIG_TIMERFD is not set | ||
55 | # CONFIG_EVENTFD is not set | 61 | # CONFIG_EVENTFD is not set |
56 | # CONFIG_VM_EVENT_COUNTERS is not set | 62 | # CONFIG_VM_EVENT_COUNTERS is not set |
57 | CONFIG_SLAB=y | 63 | CONFIG_SLAB=y |
58 | # CONFIG_SLUB is not set | 64 | # CONFIG_SLUB is not set |
59 | # CONFIG_SLOB is not set | 65 | # CONFIG_SLOB is not set |
66 | # CONFIG_PROFILING is not set | ||
67 | # CONFIG_MARKERS is not set | ||
68 | # CONFIG_HAVE_OPROFILE is not set | ||
69 | # CONFIG_HAVE_KPROBES is not set | ||
70 | CONFIG_SLABINFO=y | ||
60 | CONFIG_TINY_SHMEM=y | 71 | CONFIG_TINY_SHMEM=y |
61 | CONFIG_BASE_SMALL=0 | 72 | CONFIG_BASE_SMALL=0 |
62 | CONFIG_MODULES=y | 73 | CONFIG_MODULES=y |
@@ -83,6 +94,8 @@ CONFIG_IOSCHED_NOOP=y | |||
83 | # CONFIG_DEFAULT_CFQ is not set | 94 | # CONFIG_DEFAULT_CFQ is not set |
84 | CONFIG_DEFAULT_NOOP=y | 95 | CONFIG_DEFAULT_NOOP=y |
85 | CONFIG_DEFAULT_IOSCHED="noop" | 96 | CONFIG_DEFAULT_IOSCHED="noop" |
97 | CONFIG_CLASSIC_RCU=y | ||
98 | # CONFIG_PREEMPT_RCU is not set | ||
86 | 99 | ||
87 | # | 100 | # |
88 | # Processor type and features | 101 | # Processor type and features |
@@ -121,6 +134,7 @@ CONFIG_M5272C3=y | |||
121 | # CONFIG_MOD5272 is not set | 134 | # CONFIG_MOD5272 is not set |
122 | CONFIG_FREESCALE=y | 135 | CONFIG_FREESCALE=y |
123 | CONFIG_4KSTACKS=y | 136 | CONFIG_4KSTACKS=y |
137 | CONFIG_HZ=100 | ||
124 | 138 | ||
125 | # | 139 | # |
126 | # RAM configuration | 140 | # RAM configuration |
@@ -147,6 +161,7 @@ CONFIG_FLATMEM_MANUAL=y | |||
147 | CONFIG_FLATMEM=y | 161 | CONFIG_FLATMEM=y |
148 | CONFIG_FLAT_NODE_MEM_MAP=y | 162 | CONFIG_FLAT_NODE_MEM_MAP=y |
149 | # CONFIG_SPARSEMEM_STATIC is not set | 163 | # CONFIG_SPARSEMEM_STATIC is not set |
164 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
150 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 165 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
151 | # CONFIG_RESOURCES_64BIT is not set | 166 | # CONFIG_RESOURCES_64BIT is not set |
152 | CONFIG_ZONE_DMA_FLAG=1 | 167 | CONFIG_ZONE_DMA_FLAG=1 |
@@ -159,10 +174,6 @@ CONFIG_VIRT_TO_BUS=y | |||
159 | # CONFIG_ARCH_SUPPORTS_MSI is not set | 174 | # CONFIG_ARCH_SUPPORTS_MSI is not set |
160 | 175 | ||
161 | # | 176 | # |
162 | # PCCARD (PCMCIA/CardBus) support | ||
163 | # | ||
164 | |||
165 | # | ||
166 | # Executable file formats | 177 | # Executable file formats |
167 | # | 178 | # |
168 | CONFIG_BINFMT_FLAT=y | 179 | CONFIG_BINFMT_FLAT=y |
@@ -205,6 +216,7 @@ CONFIG_IP_FIB_HASH=y | |||
205 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | 216 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set |
206 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | 217 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set |
207 | # CONFIG_INET_XFRM_MODE_BEET is not set | 218 | # CONFIG_INET_XFRM_MODE_BEET is not set |
219 | # CONFIG_INET_LRO is not set | ||
208 | # CONFIG_INET_DIAG is not set | 220 | # CONFIG_INET_DIAG is not set |
209 | # CONFIG_TCP_CONG_ADVANCED is not set | 221 | # CONFIG_TCP_CONG_ADVANCED is not set |
210 | CONFIG_TCP_CONG_CUBIC=y | 222 | CONFIG_TCP_CONG_CUBIC=y |
@@ -229,10 +241,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
229 | # CONFIG_LAPB is not set | 241 | # CONFIG_LAPB is not set |
230 | # CONFIG_ECONET is not set | 242 | # CONFIG_ECONET is not set |
231 | # CONFIG_WAN_ROUTER is not set | 243 | # CONFIG_WAN_ROUTER is not set |
232 | |||
233 | # | ||
234 | # QoS and/or fair queueing | ||
235 | # | ||
236 | # CONFIG_NET_SCHED is not set | 244 | # CONFIG_NET_SCHED is not set |
237 | 245 | ||
238 | # | 246 | # |
@@ -240,6 +248,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
240 | # | 248 | # |
241 | # CONFIG_NET_PKTGEN is not set | 249 | # CONFIG_NET_PKTGEN is not set |
242 | # CONFIG_HAMRADIO is not set | 250 | # CONFIG_HAMRADIO is not set |
251 | # CONFIG_CAN is not set | ||
243 | # CONFIG_IRDA is not set | 252 | # CONFIG_IRDA is not set |
244 | # CONFIG_BT is not set | 253 | # CONFIG_BT is not set |
245 | # CONFIG_AF_RXRPC is not set | 254 | # CONFIG_AF_RXRPC is not set |
@@ -283,6 +292,7 @@ CONFIG_MTD_BLOCK=y | |||
283 | # CONFIG_INFTL is not set | 292 | # CONFIG_INFTL is not set |
284 | # CONFIG_RFD_FTL is not set | 293 | # CONFIG_RFD_FTL is not set |
285 | # CONFIG_SSFDC is not set | 294 | # CONFIG_SSFDC is not set |
295 | # CONFIG_MTD_OOPS is not set | ||
286 | 296 | ||
287 | # | 297 | # |
288 | # RAM/ROM/Flash chip drivers | 298 | # RAM/ROM/Flash chip drivers |
@@ -339,10 +349,11 @@ CONFIG_BLK_DEV=y | |||
339 | CONFIG_BLK_DEV_RAM=y | 349 | CONFIG_BLK_DEV_RAM=y |
340 | CONFIG_BLK_DEV_RAM_COUNT=16 | 350 | CONFIG_BLK_DEV_RAM_COUNT=16 |
341 | CONFIG_BLK_DEV_RAM_SIZE=4096 | 351 | CONFIG_BLK_DEV_RAM_SIZE=4096 |
342 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 352 | # CONFIG_BLK_DEV_XIP is not set |
343 | # CONFIG_CDROM_PKTCDVD is not set | 353 | # CONFIG_CDROM_PKTCDVD is not set |
344 | # CONFIG_ATA_OVER_ETH is not set | 354 | # CONFIG_ATA_OVER_ETH is not set |
345 | # CONFIG_MISC_DEVICES is not set | 355 | # CONFIG_MISC_DEVICES is not set |
356 | CONFIG_HAVE_IDE=y | ||
346 | # CONFIG_IDE is not set | 357 | # CONFIG_IDE is not set |
347 | 358 | ||
348 | # | 359 | # |
@@ -360,9 +371,15 @@ CONFIG_NETDEVICES=y | |||
360 | # CONFIG_MACVLAN is not set | 371 | # CONFIG_MACVLAN is not set |
361 | # CONFIG_EQUALIZER is not set | 372 | # CONFIG_EQUALIZER is not set |
362 | # CONFIG_TUN is not set | 373 | # CONFIG_TUN is not set |
374 | # CONFIG_VETH is not set | ||
363 | # CONFIG_PHYLIB is not set | 375 | # CONFIG_PHYLIB is not set |
364 | CONFIG_NET_ETHERNET=y | 376 | CONFIG_NET_ETHERNET=y |
365 | # CONFIG_MII is not set | 377 | # CONFIG_MII is not set |
378 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
379 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
380 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
381 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
382 | # CONFIG_B44 is not set | ||
366 | CONFIG_FEC=y | 383 | CONFIG_FEC=y |
367 | # CONFIG_FEC2 is not set | 384 | # CONFIG_FEC2 is not set |
368 | # CONFIG_NETDEV_1000 is not set | 385 | # CONFIG_NETDEV_1000 is not set |
@@ -377,7 +394,7 @@ CONFIG_FEC=y | |||
377 | CONFIG_PPP=y | 394 | CONFIG_PPP=y |
378 | # CONFIG_PPP_MULTILINK is not set | 395 | # CONFIG_PPP_MULTILINK is not set |
379 | # CONFIG_PPP_FILTER is not set | 396 | # CONFIG_PPP_FILTER is not set |
380 | # CONFIG_PPP_ASYNC is not set | 397 | CONFIG_PPP_ASYNC=y |
381 | # CONFIG_PPP_SYNC_TTY is not set | 398 | # CONFIG_PPP_SYNC_TTY is not set |
382 | # CONFIG_PPP_DEFLATE is not set | 399 | # CONFIG_PPP_DEFLATE is not set |
383 | # CONFIG_PPP_BSDCOMP is not set | 400 | # CONFIG_PPP_BSDCOMP is not set |
@@ -386,7 +403,6 @@ CONFIG_PPP=y | |||
386 | # CONFIG_PPPOL2TP is not set | 403 | # CONFIG_PPPOL2TP is not set |
387 | # CONFIG_SLIP is not set | 404 | # CONFIG_SLIP is not set |
388 | CONFIG_SLHC=y | 405 | CONFIG_SLHC=y |
389 | # CONFIG_SHAPER is not set | ||
390 | # CONFIG_NETCONSOLE is not set | 406 | # CONFIG_NETCONSOLE is not set |
391 | # CONFIG_NETPOLL is not set | 407 | # CONFIG_NETPOLL is not set |
392 | # CONFIG_NET_POLL_CONTROLLER is not set | 408 | # CONFIG_NET_POLL_CONTROLLER is not set |
@@ -418,12 +434,16 @@ CONFIG_SLHC=y | |||
418 | # | 434 | # |
419 | # Non-8250 serial port support | 435 | # Non-8250 serial port support |
420 | # | 436 | # |
421 | CONFIG_SERIAL_COLDFIRE=y | 437 | CONFIG_SERIAL_CORE=y |
438 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
439 | # CONFIG_SERIAL_COLDFIRE is not set | ||
440 | CONFIG_SERIAL_MCF=y | ||
441 | CONFIG_SERIAL_MCF_BAUDRATE=19200 | ||
442 | CONFIG_SERIAL_MCF_CONSOLE=y | ||
422 | # CONFIG_UNIX98_PTYS is not set | 443 | # CONFIG_UNIX98_PTYS is not set |
423 | CONFIG_LEGACY_PTYS=y | 444 | CONFIG_LEGACY_PTYS=y |
424 | CONFIG_LEGACY_PTY_COUNT=256 | 445 | CONFIG_LEGACY_PTY_COUNT=256 |
425 | # CONFIG_IPMI_HANDLER is not set | 446 | # CONFIG_IPMI_HANDLER is not set |
426 | # CONFIG_WATCHDOG is not set | ||
427 | # CONFIG_HW_RANDOM is not set | 447 | # CONFIG_HW_RANDOM is not set |
428 | # CONFIG_GEN_RTC is not set | 448 | # CONFIG_GEN_RTC is not set |
429 | # CONFIG_R3964 is not set | 449 | # CONFIG_R3964 is not set |
@@ -439,6 +459,14 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
439 | # CONFIG_W1 is not set | 459 | # CONFIG_W1 is not set |
440 | # CONFIG_POWER_SUPPLY is not set | 460 | # CONFIG_POWER_SUPPLY is not set |
441 | # CONFIG_HWMON is not set | 461 | # CONFIG_HWMON is not set |
462 | # CONFIG_THERMAL is not set | ||
463 | # CONFIG_WATCHDOG is not set | ||
464 | |||
465 | # | ||
466 | # Sonics Silicon Backplane | ||
467 | # | ||
468 | CONFIG_SSB_POSSIBLE=y | ||
469 | # CONFIG_SSB is not set | ||
442 | 470 | ||
443 | # | 471 | # |
444 | # Multifunction device drivers | 472 | # Multifunction device drivers |
@@ -450,20 +478,20 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
450 | # | 478 | # |
451 | # CONFIG_VIDEO_DEV is not set | 479 | # CONFIG_VIDEO_DEV is not set |
452 | # CONFIG_DVB_CORE is not set | 480 | # CONFIG_DVB_CORE is not set |
453 | CONFIG_DAB=y | 481 | # CONFIG_DAB is not set |
454 | 482 | ||
455 | # | 483 | # |
456 | # Graphics support | 484 | # Graphics support |
457 | # | 485 | # |
486 | # CONFIG_VGASTATE is not set | ||
487 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
488 | # CONFIG_FB is not set | ||
458 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 489 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
459 | 490 | ||
460 | # | 491 | # |
461 | # Display device support | 492 | # Display device support |
462 | # | 493 | # |
463 | # CONFIG_DISPLAY_SUPPORT is not set | 494 | # CONFIG_DISPLAY_SUPPORT is not set |
464 | # CONFIG_VGASTATE is not set | ||
465 | CONFIG_VIDEO_OUTPUT_CONTROL=y | ||
466 | # CONFIG_FB is not set | ||
467 | 495 | ||
468 | # | 496 | # |
469 | # Sound | 497 | # Sound |
@@ -471,23 +499,11 @@ CONFIG_VIDEO_OUTPUT_CONTROL=y | |||
471 | # CONFIG_SOUND is not set | 499 | # CONFIG_SOUND is not set |
472 | # CONFIG_USB_SUPPORT is not set | 500 | # CONFIG_USB_SUPPORT is not set |
473 | # CONFIG_MMC is not set | 501 | # CONFIG_MMC is not set |
502 | # CONFIG_MEMSTICK is not set | ||
474 | # CONFIG_NEW_LEDS is not set | 503 | # CONFIG_NEW_LEDS is not set |
475 | # CONFIG_RTC_CLASS is not set | 504 | # CONFIG_RTC_CLASS is not set |
476 | 505 | ||
477 | # | 506 | # |
478 | # DMA Engine support | ||
479 | # | ||
480 | # CONFIG_DMA_ENGINE is not set | ||
481 | |||
482 | # | ||
483 | # DMA Clients | ||
484 | # | ||
485 | |||
486 | # | ||
487 | # DMA Devices | ||
488 | # | ||
489 | |||
490 | # | ||
491 | # Userspace I/O | 507 | # Userspace I/O |
492 | # | 508 | # |
493 | # CONFIG_UIO is not set | 509 | # CONFIG_UIO is not set |
@@ -505,11 +521,9 @@ CONFIG_EXT2_FS=y | |||
505 | # CONFIG_XFS_FS is not set | 521 | # CONFIG_XFS_FS is not set |
506 | # CONFIG_GFS2_FS is not set | 522 | # CONFIG_GFS2_FS is not set |
507 | # CONFIG_OCFS2_FS is not set | 523 | # CONFIG_OCFS2_FS is not set |
508 | # CONFIG_MINIX_FS is not set | 524 | # CONFIG_DNOTIFY is not set |
509 | CONFIG_ROMFS_FS=y | ||
510 | # CONFIG_INOTIFY is not set | 525 | # CONFIG_INOTIFY is not set |
511 | # CONFIG_QUOTA is not set | 526 | # CONFIG_QUOTA is not set |
512 | # CONFIG_DNOTIFY is not set | ||
513 | # CONFIG_AUTOFS_FS is not set | 527 | # CONFIG_AUTOFS_FS is not set |
514 | # CONFIG_AUTOFS4_FS is not set | 528 | # CONFIG_AUTOFS4_FS is not set |
515 | # CONFIG_FUSE_FS is not set | 529 | # CONFIG_FUSE_FS is not set |
@@ -535,7 +549,6 @@ CONFIG_PROC_SYSCTL=y | |||
535 | CONFIG_SYSFS=y | 549 | CONFIG_SYSFS=y |
536 | # CONFIG_TMPFS is not set | 550 | # CONFIG_TMPFS is not set |
537 | # CONFIG_HUGETLB_PAGE is not set | 551 | # CONFIG_HUGETLB_PAGE is not set |
538 | CONFIG_RAMFS=y | ||
539 | # CONFIG_CONFIGFS_FS is not set | 552 | # CONFIG_CONFIGFS_FS is not set |
540 | 553 | ||
541 | # | 554 | # |
@@ -551,42 +564,27 @@ CONFIG_RAMFS=y | |||
551 | # CONFIG_JFFS2_FS is not set | 564 | # CONFIG_JFFS2_FS is not set |
552 | # CONFIG_CRAMFS is not set | 565 | # CONFIG_CRAMFS is not set |
553 | # CONFIG_VXFS_FS is not set | 566 | # CONFIG_VXFS_FS is not set |
567 | # CONFIG_MINIX_FS is not set | ||
554 | # CONFIG_HPFS_FS is not set | 568 | # CONFIG_HPFS_FS is not set |
555 | # CONFIG_QNX4FS_FS is not set | 569 | # CONFIG_QNX4FS_FS is not set |
570 | CONFIG_ROMFS_FS=y | ||
556 | # CONFIG_SYSV_FS is not set | 571 | # CONFIG_SYSV_FS is not set |
557 | # CONFIG_UFS_FS is not set | 572 | # CONFIG_UFS_FS is not set |
558 | 573 | # CONFIG_NETWORK_FILESYSTEMS is not set | |
559 | # | ||
560 | # Network File Systems | ||
561 | # | ||
562 | # CONFIG_NFS_FS is not set | ||
563 | # CONFIG_NFSD is not set | ||
564 | # CONFIG_SMB_FS is not set | ||
565 | # CONFIG_CIFS is not set | ||
566 | # CONFIG_NCP_FS is not set | ||
567 | # CONFIG_CODA_FS is not set | ||
568 | # CONFIG_AFS_FS is not set | ||
569 | 574 | ||
570 | # | 575 | # |
571 | # Partition Types | 576 | # Partition Types |
572 | # | 577 | # |
573 | # CONFIG_PARTITION_ADVANCED is not set | 578 | # CONFIG_PARTITION_ADVANCED is not set |
574 | CONFIG_MSDOS_PARTITION=y | 579 | CONFIG_MSDOS_PARTITION=y |
575 | |||
576 | # | ||
577 | # Native Language Support | ||
578 | # | ||
579 | # CONFIG_NLS is not set | 580 | # CONFIG_NLS is not set |
580 | |||
581 | # | ||
582 | # Distributed Lock Manager | ||
583 | # | ||
584 | # CONFIG_DLM is not set | 581 | # CONFIG_DLM is not set |
585 | 582 | ||
586 | # | 583 | # |
587 | # Kernel hacking | 584 | # Kernel hacking |
588 | # | 585 | # |
589 | # CONFIG_PRINTK_TIME is not set | 586 | # CONFIG_PRINTK_TIME is not set |
587 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
590 | # CONFIG_ENABLE_MUST_CHECK is not set | 588 | # CONFIG_ENABLE_MUST_CHECK is not set |
591 | # CONFIG_MAGIC_SYSRQ is not set | 589 | # CONFIG_MAGIC_SYSRQ is not set |
592 | # CONFIG_UNUSED_SYMBOLS is not set | 590 | # CONFIG_UNUSED_SYMBOLS is not set |
@@ -594,6 +592,7 @@ CONFIG_MSDOS_PARTITION=y | |||
594 | # CONFIG_HEADERS_CHECK is not set | 592 | # CONFIG_HEADERS_CHECK is not set |
595 | # CONFIG_DEBUG_KERNEL is not set | 593 | # CONFIG_DEBUG_KERNEL is not set |
596 | # CONFIG_DEBUG_BUGVERBOSE is not set | 594 | # CONFIG_DEBUG_BUGVERBOSE is not set |
595 | # CONFIG_SAMPLES is not set | ||
597 | # CONFIG_FULLDEBUG is not set | 596 | # CONFIG_FULLDEBUG is not set |
598 | # CONFIG_HIGHPROFILE is not set | 597 | # CONFIG_HIGHPROFILE is not set |
599 | # CONFIG_BOOTPARAM is not set | 598 | # CONFIG_BOOTPARAM is not set |
@@ -605,6 +604,7 @@ CONFIG_MSDOS_PARTITION=y | |||
605 | # | 604 | # |
606 | # CONFIG_KEYS is not set | 605 | # CONFIG_KEYS is not set |
607 | # CONFIG_SECURITY is not set | 606 | # CONFIG_SECURITY is not set |
607 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
608 | # CONFIG_CRYPTO is not set | 608 | # CONFIG_CRYPTO is not set |
609 | 609 | ||
610 | # | 610 | # |
diff --git a/arch/m68knommu/kernel/syscalltable.S b/arch/m68knommu/kernel/syscalltable.S index 1b02b8820068..fca2e49917a3 100644 --- a/arch/m68knommu/kernel/syscalltable.S +++ b/arch/m68knommu/kernel/syscalltable.S | |||
@@ -336,9 +336,11 @@ ENTRY(sys_call_table) | |||
336 | .long sys_epoll_pwait /* 315 */ | 336 | .long sys_epoll_pwait /* 315 */ |
337 | .long sys_utimensat | 337 | .long sys_utimensat |
338 | .long sys_signalfd | 338 | .long sys_signalfd |
339 | .long sys_ni_syscall | 339 | .long sys_timerfd_create |
340 | .long sys_eventfd | 340 | .long sys_eventfd |
341 | .long sys_fallocate /* 320 */ | 341 | .long sys_fallocate /* 320 */ |
342 | .long sys_timerfd_settime | ||
343 | .long sys_timerfd_gettime | ||
342 | 344 | ||
343 | .rept NR_syscalls-(.-sys_call_table)/4 | 345 | .rept NR_syscalls-(.-sys_call_table)/4 |
344 | .long sys_ni_syscall | 346 | .long sys_ni_syscall |
diff --git a/arch/m68knommu/platform/68328/timers.c b/arch/m68knommu/platform/68328/timers.c index 9159fd05c9ac..6bafefa546e5 100644 --- a/arch/m68knommu/platform/68328/timers.c +++ b/arch/m68knommu/platform/68328/timers.c | |||
@@ -67,16 +67,6 @@ static irqreturn_t hw_tick(int irq, void *dummy) | |||
67 | 67 | ||
68 | /***************************************************************************/ | 68 | /***************************************************************************/ |
69 | 69 | ||
70 | static irqreturn_t hw_tick(int irq, void *dummy) | ||
71 | { | ||
72 | /* Reset Timer1 */ | ||
73 | TSTAT &= 0; | ||
74 | |||
75 | return arch_timer_interrupt(irq, dummy); | ||
76 | } | ||
77 | |||
78 | /***************************************************************************/ | ||
79 | |||
80 | static struct irqaction m68328_timer_irq = { | 70 | static struct irqaction m68328_timer_irq = { |
81 | .name = "timer", | 71 | .name = "timer", |
82 | .flags = IRQF_DISABLED | IRQF_TIMER, | 72 | .flags = IRQF_DISABLED | IRQF_TIMER, |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index ade230d445d9..8724ed3298d3 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -1824,7 +1824,7 @@ choice | |||
1824 | Allows the configuration of the timer frequency. | 1824 | Allows the configuration of the timer frequency. |
1825 | 1825 | ||
1826 | config HZ_48 | 1826 | config HZ_48 |
1827 | bool "48 HZ" if SYS_SUPPORTS_48HZ | 1827 | bool "48 HZ" if SYS_SUPPORTS_48HZ || SYS_SUPPORTS_ARBIT_HZ |
1828 | 1828 | ||
1829 | config HZ_100 | 1829 | config HZ_100 |
1830 | bool "100 HZ" if SYS_SUPPORTS_100HZ || SYS_SUPPORTS_ARBIT_HZ | 1830 | bool "100 HZ" if SYS_SUPPORTS_100HZ || SYS_SUPPORTS_ARBIT_HZ |
diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 3fb7f3065c92..72097dacabd3 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile | |||
@@ -12,6 +12,8 @@ | |||
12 | # for "archclean" cleaning up for this architecture. | 12 | # for "archclean" cleaning up for this architecture. |
13 | # | 13 | # |
14 | 14 | ||
15 | KBUILD_DEFCONFIG := ip22_defconfig | ||
16 | |||
15 | cflags-y := | 17 | cflags-y := |
16 | 18 | ||
17 | # | 19 | # |
diff --git a/arch/mips/au1000/common/dbdma.c b/arch/mips/au1000/common/dbdma.c index 428ed275a0f6..57f17b41098d 100644 --- a/arch/mips/au1000/common/dbdma.c +++ b/arch/mips/au1000/common/dbdma.c | |||
@@ -161,22 +161,22 @@ static dbdev_tab_t dbdev_tab[] = { | |||
161 | { DSCR_CMD0_ALWAYS, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 }, | 161 | { DSCR_CMD0_ALWAYS, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 }, |
162 | 162 | ||
163 | /* Provide 16 user definable device types */ | 163 | /* Provide 16 user definable device types */ |
164 | { 0, 0, 0, 0, 0, 0, 0 }, | 164 | { ~0, 0, 0, 0, 0, 0, 0 }, |
165 | { 0, 0, 0, 0, 0, 0, 0 }, | 165 | { ~0, 0, 0, 0, 0, 0, 0 }, |
166 | { 0, 0, 0, 0, 0, 0, 0 }, | 166 | { ~0, 0, 0, 0, 0, 0, 0 }, |
167 | { 0, 0, 0, 0, 0, 0, 0 }, | 167 | { ~0, 0, 0, 0, 0, 0, 0 }, |
168 | { 0, 0, 0, 0, 0, 0, 0 }, | 168 | { ~0, 0, 0, 0, 0, 0, 0 }, |
169 | { 0, 0, 0, 0, 0, 0, 0 }, | 169 | { ~0, 0, 0, 0, 0, 0, 0 }, |
170 | { 0, 0, 0, 0, 0, 0, 0 }, | 170 | { ~0, 0, 0, 0, 0, 0, 0 }, |
171 | { 0, 0, 0, 0, 0, 0, 0 }, | 171 | { ~0, 0, 0, 0, 0, 0, 0 }, |
172 | { 0, 0, 0, 0, 0, 0, 0 }, | 172 | { ~0, 0, 0, 0, 0, 0, 0 }, |
173 | { 0, 0, 0, 0, 0, 0, 0 }, | 173 | { ~0, 0, 0, 0, 0, 0, 0 }, |
174 | { 0, 0, 0, 0, 0, 0, 0 }, | 174 | { ~0, 0, 0, 0, 0, 0, 0 }, |
175 | { 0, 0, 0, 0, 0, 0, 0 }, | 175 | { ~0, 0, 0, 0, 0, 0, 0 }, |
176 | { 0, 0, 0, 0, 0, 0, 0 }, | 176 | { ~0, 0, 0, 0, 0, 0, 0 }, |
177 | { 0, 0, 0, 0, 0, 0, 0 }, | 177 | { ~0, 0, 0, 0, 0, 0, 0 }, |
178 | { 0, 0, 0, 0, 0, 0, 0 }, | 178 | { ~0, 0, 0, 0, 0, 0, 0 }, |
179 | { 0, 0, 0, 0, 0, 0, 0 }, | 179 | { ~0, 0, 0, 0, 0, 0, 0 }, |
180 | }; | 180 | }; |
181 | 181 | ||
182 | #define DBDEV_TAB_SIZE ARRAY_SIZE(dbdev_tab) | 182 | #define DBDEV_TAB_SIZE ARRAY_SIZE(dbdev_tab) |
@@ -209,7 +209,7 @@ au1xxx_ddma_add_device(dbdev_tab_t *dev) | |||
209 | dbdev_tab_t *p=NULL; | 209 | dbdev_tab_t *p=NULL; |
210 | static u16 new_id=0x1000; | 210 | static u16 new_id=0x1000; |
211 | 211 | ||
212 | p = find_dbdev_id(0); | 212 | p = find_dbdev_id(~0); |
213 | if ( NULL != p ) | 213 | if ( NULL != p ) |
214 | { | 214 | { |
215 | memcpy(p, dev, sizeof(dbdev_tab_t)); | 215 | memcpy(p, dev, sizeof(dbdev_tab_t)); |
diff --git a/arch/mips/defconfig b/arch/mips/defconfig deleted file mode 100644 index 4f5e56c9335e..000000000000 --- a/arch/mips/defconfig +++ /dev/null | |||
@@ -1,1158 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.23-rc2 | ||
4 | # Tue Aug 7 12:39:49 2007 | ||
5 | # | ||
6 | CONFIG_MIPS=y | ||
7 | |||
8 | # | ||
9 | # Machine selection | ||
10 | # | ||
11 | CONFIG_ZONE_DMA=y | ||
12 | # CONFIG_MACH_ALCHEMY is not set | ||
13 | # CONFIG_BASLER_EXCITE is not set | ||
14 | # CONFIG_MIPS_COBALT is not set | ||
15 | # CONFIG_MACH_DECSTATION is not set | ||
16 | # CONFIG_MACH_JAZZ is not set | ||
17 | # CONFIG_LEMOTE_FULONG is not set | ||
18 | # CONFIG_MIPS_ATLAS is not set | ||
19 | # CONFIG_MIPS_MALTA is not set | ||
20 | # CONFIG_MIPS_SEAD is not set | ||
21 | # CONFIG_MIPS_SIM is not set | ||
22 | # CONFIG_MARKEINS is not set | ||
23 | # CONFIG_MACH_VR41XX is not set | ||
24 | # CONFIG_PNX8550_JBS is not set | ||
25 | # CONFIG_PNX8550_STB810 is not set | ||
26 | # CONFIG_PMC_MSP is not set | ||
27 | # CONFIG_PMC_YOSEMITE is not set | ||
28 | CONFIG_SGI_IP22=y | ||
29 | # CONFIG_SGI_IP27 is not set | ||
30 | # CONFIG_SGI_IP32 is not set | ||
31 | # CONFIG_SIBYTE_CRHINE is not set | ||
32 | # CONFIG_SIBYTE_CARMEL is not set | ||
33 | # CONFIG_SIBYTE_CRHONE is not set | ||
34 | # CONFIG_SIBYTE_RHONE is not set | ||
35 | # CONFIG_SIBYTE_SWARM is not set | ||
36 | # CONFIG_SIBYTE_LITTLESUR is not set | ||
37 | # CONFIG_SIBYTE_SENTOSA is not set | ||
38 | # CONFIG_SIBYTE_BIGSUR is not set | ||
39 | # CONFIG_SNI_RM is not set | ||
40 | # CONFIG_TOSHIBA_JMR3927 is not set | ||
41 | # CONFIG_TOSHIBA_RBTX4927 is not set | ||
42 | # CONFIG_TOSHIBA_RBTX4938 is not set | ||
43 | # CONFIG_WR_PPMC is not set | ||
44 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
45 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
46 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
47 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
48 | CONFIG_GENERIC_HWEIGHT=y | ||
49 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
50 | CONFIG_GENERIC_TIME=y | ||
51 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
52 | # CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ is not set | ||
53 | CONFIG_ARC=y | ||
54 | CONFIG_DMA_NONCOHERENT=y | ||
55 | CONFIG_DMA_NEED_PCI_MAP_STATE=y | ||
56 | CONFIG_EARLY_PRINTK=y | ||
57 | CONFIG_SYS_HAS_EARLY_PRINTK=y | ||
58 | # CONFIG_NO_IOPORT is not set | ||
59 | CONFIG_GENERIC_ISA_DMA_SUPPORT_BROKEN=y | ||
60 | CONFIG_CPU_BIG_ENDIAN=y | ||
61 | # CONFIG_CPU_LITTLE_ENDIAN is not set | ||
62 | CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y | ||
63 | CONFIG_IRQ_CPU=y | ||
64 | CONFIG_SWAP_IO_SPACE=y | ||
65 | CONFIG_ARC32=y | ||
66 | CONFIG_BOOT_ELF32=y | ||
67 | CONFIG_MIPS_L1_CACHE_SHIFT=5 | ||
68 | CONFIG_ARC_CONSOLE=y | ||
69 | CONFIG_ARC_PROMLIB=y | ||
70 | |||
71 | # | ||
72 | # CPU selection | ||
73 | # | ||
74 | # CONFIG_CPU_LOONGSON2 is not set | ||
75 | # CONFIG_CPU_MIPS32_R1 is not set | ||
76 | # CONFIG_CPU_MIPS32_R2 is not set | ||
77 | # CONFIG_CPU_MIPS64_R1 is not set | ||
78 | # CONFIG_CPU_MIPS64_R2 is not set | ||
79 | # CONFIG_CPU_R3000 is not set | ||
80 | # CONFIG_CPU_TX39XX is not set | ||
81 | # CONFIG_CPU_VR41XX is not set | ||
82 | # CONFIG_CPU_R4300 is not set | ||
83 | # CONFIG_CPU_R4X00 is not set | ||
84 | # CONFIG_CPU_TX49XX is not set | ||
85 | CONFIG_CPU_R5000=y | ||
86 | # CONFIG_CPU_R5432 is not set | ||
87 | # CONFIG_CPU_R6000 is not set | ||
88 | # CONFIG_CPU_NEVADA is not set | ||
89 | # CONFIG_CPU_R8000 is not set | ||
90 | # CONFIG_CPU_R10000 is not set | ||
91 | # CONFIG_CPU_RM7000 is not set | ||
92 | # CONFIG_CPU_RM9000 is not set | ||
93 | # CONFIG_CPU_SB1 is not set | ||
94 | CONFIG_SYS_HAS_CPU_R4X00=y | ||
95 | CONFIG_SYS_HAS_CPU_R5000=y | ||
96 | CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y | ||
97 | CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y | ||
98 | CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y | ||
99 | CONFIG_CPU_SUPPORTS_64BIT_KERNEL=y | ||
100 | |||
101 | # | ||
102 | # Kernel type | ||
103 | # | ||
104 | CONFIG_32BIT=y | ||
105 | # CONFIG_64BIT is not set | ||
106 | CONFIG_PAGE_SIZE_4KB=y | ||
107 | # CONFIG_PAGE_SIZE_8KB is not set | ||
108 | # CONFIG_PAGE_SIZE_16KB is not set | ||
109 | # CONFIG_PAGE_SIZE_64KB is not set | ||
110 | CONFIG_BOARD_SCACHE=y | ||
111 | CONFIG_IP22_CPU_SCACHE=y | ||
112 | CONFIG_MIPS_MT_DISABLED=y | ||
113 | # CONFIG_MIPS_MT_SMP is not set | ||
114 | # CONFIG_MIPS_MT_SMTC is not set | ||
115 | CONFIG_CPU_HAS_LLSC=y | ||
116 | CONFIG_CPU_HAS_SYNC=y | ||
117 | CONFIG_GENERIC_HARDIRQS=y | ||
118 | CONFIG_GENERIC_IRQ_PROBE=y | ||
119 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
120 | CONFIG_SELECT_MEMORY_MODEL=y | ||
121 | CONFIG_FLATMEM_MANUAL=y | ||
122 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
123 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
124 | CONFIG_FLATMEM=y | ||
125 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
126 | # CONFIG_SPARSEMEM_STATIC is not set | ||
127 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
128 | # CONFIG_RESOURCES_64BIT is not set | ||
129 | CONFIG_ZONE_DMA_FLAG=1 | ||
130 | CONFIG_BOUNCE=y | ||
131 | CONFIG_VIRT_TO_BUS=y | ||
132 | # CONFIG_HZ_48 is not set | ||
133 | # CONFIG_HZ_100 is not set | ||
134 | # CONFIG_HZ_128 is not set | ||
135 | # CONFIG_HZ_250 is not set | ||
136 | # CONFIG_HZ_256 is not set | ||
137 | CONFIG_HZ_1000=y | ||
138 | # CONFIG_HZ_1024 is not set | ||
139 | CONFIG_SYS_SUPPORTS_ARBIT_HZ=y | ||
140 | CONFIG_HZ=1000 | ||
141 | # CONFIG_PREEMPT_NONE is not set | ||
142 | CONFIG_PREEMPT_VOLUNTARY=y | ||
143 | # CONFIG_PREEMPT is not set | ||
144 | # CONFIG_KEXEC is not set | ||
145 | CONFIG_SECCOMP=y | ||
146 | CONFIG_LOCKDEP_SUPPORT=y | ||
147 | CONFIG_STACKTRACE_SUPPORT=y | ||
148 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
149 | |||
150 | # | ||
151 | # General setup | ||
152 | # | ||
153 | CONFIG_EXPERIMENTAL=y | ||
154 | CONFIG_BROKEN_ON_SMP=y | ||
155 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
156 | CONFIG_LOCALVERSION="" | ||
157 | CONFIG_LOCALVERSION_AUTO=y | ||
158 | CONFIG_SWAP=y | ||
159 | CONFIG_SYSVIPC=y | ||
160 | CONFIG_SYSVIPC_SYSCTL=y | ||
161 | # CONFIG_POSIX_MQUEUE is not set | ||
162 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
163 | # CONFIG_TASKSTATS is not set | ||
164 | # CONFIG_USER_NS is not set | ||
165 | # CONFIG_AUDIT is not set | ||
166 | CONFIG_IKCONFIG=y | ||
167 | CONFIG_IKCONFIG_PROC=y | ||
168 | CONFIG_LOG_BUF_SHIFT=14 | ||
169 | CONFIG_SYSFS_DEPRECATED=y | ||
170 | CONFIG_RELAY=y | ||
171 | # CONFIG_BLK_DEV_INITRD is not set | ||
172 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
173 | CONFIG_SYSCTL=y | ||
174 | CONFIG_EMBEDDED=y | ||
175 | CONFIG_SYSCTL_SYSCALL=y | ||
176 | CONFIG_KALLSYMS=y | ||
177 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
178 | # CONFIG_HOTPLUG is not set | ||
179 | CONFIG_PRINTK=y | ||
180 | CONFIG_BUG=y | ||
181 | CONFIG_ELF_CORE=y | ||
182 | CONFIG_BASE_FULL=y | ||
183 | CONFIG_FUTEX=y | ||
184 | CONFIG_ANON_INODES=y | ||
185 | CONFIG_EPOLL=y | ||
186 | CONFIG_SIGNALFD=y | ||
187 | CONFIG_TIMERFD=y | ||
188 | CONFIG_EVENTFD=y | ||
189 | CONFIG_SHMEM=y | ||
190 | CONFIG_VM_EVENT_COUNTERS=y | ||
191 | CONFIG_SLAB=y | ||
192 | # CONFIG_SLUB is not set | ||
193 | # CONFIG_SLOB is not set | ||
194 | CONFIG_RT_MUTEXES=y | ||
195 | # CONFIG_TINY_SHMEM is not set | ||
196 | CONFIG_BASE_SMALL=0 | ||
197 | CONFIG_MODULES=y | ||
198 | CONFIG_MODULE_UNLOAD=y | ||
199 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
200 | CONFIG_MODVERSIONS=y | ||
201 | CONFIG_MODULE_SRCVERSION_ALL=y | ||
202 | CONFIG_KMOD=y | ||
203 | CONFIG_BLOCK=y | ||
204 | # CONFIG_LBD is not set | ||
205 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
206 | # CONFIG_LSF is not set | ||
207 | # CONFIG_BLK_DEV_BSG is not set | ||
208 | |||
209 | # | ||
210 | # IO Schedulers | ||
211 | # | ||
212 | CONFIG_IOSCHED_NOOP=y | ||
213 | CONFIG_IOSCHED_AS=y | ||
214 | CONFIG_IOSCHED_DEADLINE=y | ||
215 | CONFIG_IOSCHED_CFQ=y | ||
216 | CONFIG_DEFAULT_AS=y | ||
217 | # CONFIG_DEFAULT_DEADLINE is not set | ||
218 | # CONFIG_DEFAULT_CFQ is not set | ||
219 | # CONFIG_DEFAULT_NOOP is not set | ||
220 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
221 | |||
222 | # | ||
223 | # Bus options (PCI, PCMCIA, EISA, ISA, TC) | ||
224 | # | ||
225 | CONFIG_HW_HAS_EISA=y | ||
226 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
227 | # CONFIG_EISA is not set | ||
228 | CONFIG_MMU=y | ||
229 | |||
230 | # | ||
231 | # PCCARD (PCMCIA/CardBus) support | ||
232 | # | ||
233 | |||
234 | # | ||
235 | # Executable file formats | ||
236 | # | ||
237 | CONFIG_BINFMT_ELF=y | ||
238 | CONFIG_BINFMT_MISC=m | ||
239 | CONFIG_TRAD_SIGNALS=y | ||
240 | |||
241 | # | ||
242 | # Power management options | ||
243 | # | ||
244 | CONFIG_PM=y | ||
245 | # CONFIG_PM_LEGACY is not set | ||
246 | # CONFIG_PM_DEBUG is not set | ||
247 | # CONFIG_SUSPEND is not set | ||
248 | |||
249 | # | ||
250 | # Networking | ||
251 | # | ||
252 | CONFIG_NET=y | ||
253 | |||
254 | # | ||
255 | # Networking options | ||
256 | # | ||
257 | CONFIG_PACKET=y | ||
258 | CONFIG_PACKET_MMAP=y | ||
259 | CONFIG_UNIX=y | ||
260 | CONFIG_XFRM=y | ||
261 | CONFIG_XFRM_USER=m | ||
262 | # CONFIG_XFRM_SUB_POLICY is not set | ||
263 | CONFIG_XFRM_MIGRATE=y | ||
264 | CONFIG_NET_KEY=y | ||
265 | CONFIG_NET_KEY_MIGRATE=y | ||
266 | CONFIG_INET=y | ||
267 | CONFIG_IP_MULTICAST=y | ||
268 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
269 | CONFIG_IP_FIB_HASH=y | ||
270 | CONFIG_IP_PNP=y | ||
271 | # CONFIG_IP_PNP_DHCP is not set | ||
272 | CONFIG_IP_PNP_BOOTP=y | ||
273 | # CONFIG_IP_PNP_RARP is not set | ||
274 | # CONFIG_NET_IPIP is not set | ||
275 | # CONFIG_NET_IPGRE is not set | ||
276 | # CONFIG_IP_MROUTE is not set | ||
277 | # CONFIG_ARPD is not set | ||
278 | # CONFIG_SYN_COOKIES is not set | ||
279 | CONFIG_INET_AH=m | ||
280 | CONFIG_INET_ESP=m | ||
281 | CONFIG_INET_IPCOMP=m | ||
282 | CONFIG_INET_XFRM_TUNNEL=m | ||
283 | CONFIG_INET_TUNNEL=m | ||
284 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
285 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
286 | CONFIG_INET_XFRM_MODE_BEET=m | ||
287 | CONFIG_INET_DIAG=y | ||
288 | CONFIG_INET_TCP_DIAG=y | ||
289 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
290 | CONFIG_TCP_CONG_CUBIC=y | ||
291 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
292 | CONFIG_TCP_MD5SIG=y | ||
293 | CONFIG_IP_VS=m | ||
294 | # CONFIG_IP_VS_DEBUG is not set | ||
295 | CONFIG_IP_VS_TAB_BITS=12 | ||
296 | |||
297 | # | ||
298 | # IPVS transport protocol load balancing support | ||
299 | # | ||
300 | CONFIG_IP_VS_PROTO_TCP=y | ||
301 | CONFIG_IP_VS_PROTO_UDP=y | ||
302 | CONFIG_IP_VS_PROTO_ESP=y | ||
303 | CONFIG_IP_VS_PROTO_AH=y | ||
304 | |||
305 | # | ||
306 | # IPVS scheduler | ||
307 | # | ||
308 | CONFIG_IP_VS_RR=m | ||
309 | CONFIG_IP_VS_WRR=m | ||
310 | CONFIG_IP_VS_LC=m | ||
311 | CONFIG_IP_VS_WLC=m | ||
312 | CONFIG_IP_VS_LBLC=m | ||
313 | CONFIG_IP_VS_LBLCR=m | ||
314 | CONFIG_IP_VS_DH=m | ||
315 | CONFIG_IP_VS_SH=m | ||
316 | CONFIG_IP_VS_SED=m | ||
317 | CONFIG_IP_VS_NQ=m | ||
318 | |||
319 | # | ||
320 | # IPVS application helper | ||
321 | # | ||
322 | CONFIG_IP_VS_FTP=m | ||
323 | CONFIG_IPV6=m | ||
324 | CONFIG_IPV6_PRIVACY=y | ||
325 | CONFIG_IPV6_ROUTER_PREF=y | ||
326 | CONFIG_IPV6_ROUTE_INFO=y | ||
327 | CONFIG_IPV6_OPTIMISTIC_DAD=y | ||
328 | CONFIG_INET6_AH=m | ||
329 | CONFIG_INET6_ESP=m | ||
330 | CONFIG_INET6_IPCOMP=m | ||
331 | CONFIG_IPV6_MIP6=m | ||
332 | CONFIG_INET6_XFRM_TUNNEL=m | ||
333 | CONFIG_INET6_TUNNEL=m | ||
334 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
335 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
336 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
337 | CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m | ||
338 | CONFIG_IPV6_SIT=m | ||
339 | CONFIG_IPV6_TUNNEL=m | ||
340 | CONFIG_IPV6_MULTIPLE_TABLES=y | ||
341 | CONFIG_IPV6_SUBTREES=y | ||
342 | CONFIG_NETWORK_SECMARK=y | ||
343 | CONFIG_NETFILTER=y | ||
344 | # CONFIG_NETFILTER_DEBUG is not set | ||
345 | |||
346 | # | ||
347 | # Core Netfilter Configuration | ||
348 | # | ||
349 | CONFIG_NETFILTER_NETLINK=m | ||
350 | CONFIG_NETFILTER_NETLINK_QUEUE=m | ||
351 | CONFIG_NETFILTER_NETLINK_LOG=m | ||
352 | CONFIG_NF_CONNTRACK_ENABLED=m | ||
353 | CONFIG_NF_CONNTRACK=m | ||
354 | CONFIG_NF_CT_ACCT=y | ||
355 | CONFIG_NF_CONNTRACK_MARK=y | ||
356 | CONFIG_NF_CONNTRACK_SECMARK=y | ||
357 | CONFIG_NF_CONNTRACK_EVENTS=y | ||
358 | CONFIG_NF_CT_PROTO_GRE=m | ||
359 | CONFIG_NF_CT_PROTO_SCTP=m | ||
360 | CONFIG_NF_CT_PROTO_UDPLITE=m | ||
361 | CONFIG_NF_CONNTRACK_AMANDA=m | ||
362 | CONFIG_NF_CONNTRACK_FTP=m | ||
363 | CONFIG_NF_CONNTRACK_H323=m | ||
364 | CONFIG_NF_CONNTRACK_IRC=m | ||
365 | # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set | ||
366 | CONFIG_NF_CONNTRACK_PPTP=m | ||
367 | CONFIG_NF_CONNTRACK_SANE=m | ||
368 | CONFIG_NF_CONNTRACK_SIP=m | ||
369 | CONFIG_NF_CONNTRACK_TFTP=m | ||
370 | CONFIG_NF_CT_NETLINK=m | ||
371 | CONFIG_NETFILTER_XTABLES=m | ||
372 | CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m | ||
373 | CONFIG_NETFILTER_XT_TARGET_CONNMARK=m | ||
374 | CONFIG_NETFILTER_XT_TARGET_DSCP=m | ||
375 | CONFIG_NETFILTER_XT_TARGET_MARK=m | ||
376 | CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m | ||
377 | CONFIG_NETFILTER_XT_TARGET_NFLOG=m | ||
378 | CONFIG_NETFILTER_XT_TARGET_NOTRACK=m | ||
379 | CONFIG_NETFILTER_XT_TARGET_TRACE=m | ||
380 | CONFIG_NETFILTER_XT_TARGET_SECMARK=m | ||
381 | CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m | ||
382 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=m | ||
383 | CONFIG_NETFILTER_XT_MATCH_COMMENT=m | ||
384 | CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m | ||
385 | CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m | ||
386 | CONFIG_NETFILTER_XT_MATCH_CONNMARK=m | ||
387 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m | ||
388 | CONFIG_NETFILTER_XT_MATCH_DCCP=m | ||
389 | CONFIG_NETFILTER_XT_MATCH_DSCP=m | ||
390 | CONFIG_NETFILTER_XT_MATCH_ESP=m | ||
391 | CONFIG_NETFILTER_XT_MATCH_HELPER=m | ||
392 | CONFIG_NETFILTER_XT_MATCH_LENGTH=m | ||
393 | CONFIG_NETFILTER_XT_MATCH_LIMIT=m | ||
394 | CONFIG_NETFILTER_XT_MATCH_MAC=m | ||
395 | CONFIG_NETFILTER_XT_MATCH_MARK=m | ||
396 | CONFIG_NETFILTER_XT_MATCH_POLICY=m | ||
397 | CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m | ||
398 | CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m | ||
399 | CONFIG_NETFILTER_XT_MATCH_QUOTA=m | ||
400 | CONFIG_NETFILTER_XT_MATCH_REALM=m | ||
401 | CONFIG_NETFILTER_XT_MATCH_SCTP=m | ||
402 | CONFIG_NETFILTER_XT_MATCH_STATE=m | ||
403 | CONFIG_NETFILTER_XT_MATCH_STATISTIC=m | ||
404 | CONFIG_NETFILTER_XT_MATCH_STRING=m | ||
405 | CONFIG_NETFILTER_XT_MATCH_TCPMSS=m | ||
406 | CONFIG_NETFILTER_XT_MATCH_U32=m | ||
407 | CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m | ||
408 | |||
409 | # | ||
410 | # IP: Netfilter Configuration | ||
411 | # | ||
412 | CONFIG_NF_CONNTRACK_IPV4=m | ||
413 | CONFIG_NF_CONNTRACK_PROC_COMPAT=y | ||
414 | CONFIG_IP_NF_QUEUE=m | ||
415 | CONFIG_IP_NF_IPTABLES=m | ||
416 | CONFIG_IP_NF_MATCH_IPRANGE=m | ||
417 | CONFIG_IP_NF_MATCH_TOS=m | ||
418 | CONFIG_IP_NF_MATCH_RECENT=m | ||
419 | CONFIG_IP_NF_MATCH_ECN=m | ||
420 | CONFIG_IP_NF_MATCH_AH=m | ||
421 | CONFIG_IP_NF_MATCH_TTL=m | ||
422 | CONFIG_IP_NF_MATCH_OWNER=m | ||
423 | CONFIG_IP_NF_MATCH_ADDRTYPE=m | ||
424 | CONFIG_IP_NF_FILTER=m | ||
425 | CONFIG_IP_NF_TARGET_REJECT=m | ||
426 | CONFIG_IP_NF_TARGET_LOG=m | ||
427 | CONFIG_IP_NF_TARGET_ULOG=m | ||
428 | CONFIG_NF_NAT=m | ||
429 | CONFIG_NF_NAT_NEEDED=y | ||
430 | CONFIG_IP_NF_TARGET_MASQUERADE=m | ||
431 | CONFIG_IP_NF_TARGET_REDIRECT=m | ||
432 | CONFIG_IP_NF_TARGET_NETMAP=m | ||
433 | CONFIG_IP_NF_TARGET_SAME=m | ||
434 | CONFIG_NF_NAT_SNMP_BASIC=m | ||
435 | CONFIG_NF_NAT_PROTO_GRE=m | ||
436 | CONFIG_NF_NAT_FTP=m | ||
437 | CONFIG_NF_NAT_IRC=m | ||
438 | CONFIG_NF_NAT_TFTP=m | ||
439 | CONFIG_NF_NAT_AMANDA=m | ||
440 | CONFIG_NF_NAT_PPTP=m | ||
441 | CONFIG_NF_NAT_H323=m | ||
442 | CONFIG_NF_NAT_SIP=m | ||
443 | CONFIG_IP_NF_MANGLE=m | ||
444 | CONFIG_IP_NF_TARGET_TOS=m | ||
445 | CONFIG_IP_NF_TARGET_ECN=m | ||
446 | CONFIG_IP_NF_TARGET_TTL=m | ||
447 | CONFIG_IP_NF_TARGET_CLUSTERIP=m | ||
448 | CONFIG_IP_NF_RAW=m | ||
449 | CONFIG_IP_NF_ARPTABLES=m | ||
450 | CONFIG_IP_NF_ARPFILTER=m | ||
451 | CONFIG_IP_NF_ARP_MANGLE=m | ||
452 | |||
453 | # | ||
454 | # IPv6: Netfilter Configuration (EXPERIMENTAL) | ||
455 | # | ||
456 | CONFIG_NF_CONNTRACK_IPV6=m | ||
457 | CONFIG_IP6_NF_QUEUE=m | ||
458 | CONFIG_IP6_NF_IPTABLES=m | ||
459 | CONFIG_IP6_NF_MATCH_RT=m | ||
460 | CONFIG_IP6_NF_MATCH_OPTS=m | ||
461 | CONFIG_IP6_NF_MATCH_FRAG=m | ||
462 | CONFIG_IP6_NF_MATCH_HL=m | ||
463 | CONFIG_IP6_NF_MATCH_OWNER=m | ||
464 | CONFIG_IP6_NF_MATCH_IPV6HEADER=m | ||
465 | CONFIG_IP6_NF_MATCH_AH=m | ||
466 | CONFIG_IP6_NF_MATCH_MH=m | ||
467 | CONFIG_IP6_NF_MATCH_EUI64=m | ||
468 | CONFIG_IP6_NF_FILTER=m | ||
469 | CONFIG_IP6_NF_TARGET_LOG=m | ||
470 | CONFIG_IP6_NF_TARGET_REJECT=m | ||
471 | CONFIG_IP6_NF_MANGLE=m | ||
472 | CONFIG_IP6_NF_TARGET_HL=m | ||
473 | CONFIG_IP6_NF_RAW=m | ||
474 | # CONFIG_IP_DCCP is not set | ||
475 | CONFIG_IP_SCTP=m | ||
476 | # CONFIG_SCTP_DBG_MSG is not set | ||
477 | # CONFIG_SCTP_DBG_OBJCNT is not set | ||
478 | # CONFIG_SCTP_HMAC_NONE is not set | ||
479 | # CONFIG_SCTP_HMAC_SHA1 is not set | ||
480 | CONFIG_SCTP_HMAC_MD5=y | ||
481 | # CONFIG_TIPC is not set | ||
482 | # CONFIG_ATM is not set | ||
483 | # CONFIG_BRIDGE is not set | ||
484 | # CONFIG_VLAN_8021Q is not set | ||
485 | # CONFIG_DECNET is not set | ||
486 | # CONFIG_LLC2 is not set | ||
487 | # CONFIG_IPX is not set | ||
488 | # CONFIG_ATALK is not set | ||
489 | # CONFIG_X25 is not set | ||
490 | # CONFIG_LAPB is not set | ||
491 | # CONFIG_ECONET is not set | ||
492 | # CONFIG_WAN_ROUTER is not set | ||
493 | |||
494 | # | ||
495 | # QoS and/or fair queueing | ||
496 | # | ||
497 | CONFIG_NET_SCHED=y | ||
498 | CONFIG_NET_SCH_FIFO=y | ||
499 | |||
500 | # | ||
501 | # Queueing/Scheduling | ||
502 | # | ||
503 | CONFIG_NET_SCH_CBQ=m | ||
504 | CONFIG_NET_SCH_HTB=m | ||
505 | CONFIG_NET_SCH_HFSC=m | ||
506 | CONFIG_NET_SCH_PRIO=m | ||
507 | CONFIG_NET_SCH_RR=m | ||
508 | CONFIG_NET_SCH_RED=m | ||
509 | CONFIG_NET_SCH_SFQ=m | ||
510 | CONFIG_NET_SCH_TEQL=m | ||
511 | CONFIG_NET_SCH_TBF=m | ||
512 | CONFIG_NET_SCH_GRED=m | ||
513 | CONFIG_NET_SCH_DSMARK=m | ||
514 | CONFIG_NET_SCH_NETEM=m | ||
515 | CONFIG_NET_SCH_INGRESS=m | ||
516 | |||
517 | # | ||
518 | # Classification | ||
519 | # | ||
520 | CONFIG_NET_CLS=y | ||
521 | CONFIG_NET_CLS_BASIC=m | ||
522 | CONFIG_NET_CLS_TCINDEX=m | ||
523 | CONFIG_NET_CLS_ROUTE4=m | ||
524 | CONFIG_NET_CLS_ROUTE=y | ||
525 | CONFIG_NET_CLS_FW=m | ||
526 | CONFIG_NET_CLS_U32=m | ||
527 | # CONFIG_CLS_U32_PERF is not set | ||
528 | # CONFIG_CLS_U32_MARK is not set | ||
529 | CONFIG_NET_CLS_RSVP=m | ||
530 | CONFIG_NET_CLS_RSVP6=m | ||
531 | # CONFIG_NET_EMATCH is not set | ||
532 | CONFIG_NET_CLS_ACT=y | ||
533 | CONFIG_NET_ACT_POLICE=y | ||
534 | CONFIG_NET_ACT_GACT=m | ||
535 | CONFIG_GACT_PROB=y | ||
536 | CONFIG_NET_ACT_MIRRED=m | ||
537 | CONFIG_NET_ACT_IPT=m | ||
538 | CONFIG_NET_ACT_PEDIT=m | ||
539 | CONFIG_NET_ACT_SIMP=m | ||
540 | CONFIG_NET_CLS_POLICE=y | ||
541 | # CONFIG_NET_CLS_IND is not set | ||
542 | |||
543 | # | ||
544 | # Network testing | ||
545 | # | ||
546 | # CONFIG_NET_PKTGEN is not set | ||
547 | # CONFIG_HAMRADIO is not set | ||
548 | # CONFIG_IRDA is not set | ||
549 | # CONFIG_BT is not set | ||
550 | # CONFIG_AF_RXRPC is not set | ||
551 | CONFIG_FIB_RULES=y | ||
552 | |||
553 | # | ||
554 | # Wireless | ||
555 | # | ||
556 | CONFIG_CFG80211=m | ||
557 | CONFIG_WIRELESS_EXT=y | ||
558 | CONFIG_MAC80211=m | ||
559 | # CONFIG_MAC80211_DEBUG is not set | ||
560 | CONFIG_IEEE80211=m | ||
561 | # CONFIG_IEEE80211_DEBUG is not set | ||
562 | CONFIG_IEEE80211_CRYPT_WEP=m | ||
563 | CONFIG_IEEE80211_CRYPT_CCMP=m | ||
564 | CONFIG_IEEE80211_CRYPT_TKIP=m | ||
565 | CONFIG_IEEE80211_SOFTMAC=m | ||
566 | # CONFIG_IEEE80211_SOFTMAC_DEBUG is not set | ||
567 | CONFIG_RFKILL=m | ||
568 | CONFIG_RFKILL_INPUT=m | ||
569 | # CONFIG_NET_9P is not set | ||
570 | |||
571 | # | ||
572 | # Device Drivers | ||
573 | # | ||
574 | |||
575 | # | ||
576 | # Generic Driver Options | ||
577 | # | ||
578 | CONFIG_STANDALONE=y | ||
579 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
580 | # CONFIG_SYS_HYPERVISOR is not set | ||
581 | CONFIG_CONNECTOR=m | ||
582 | # CONFIG_MTD is not set | ||
583 | # CONFIG_PARPORT is not set | ||
584 | CONFIG_BLK_DEV=y | ||
585 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
586 | # CONFIG_BLK_DEV_LOOP is not set | ||
587 | # CONFIG_BLK_DEV_NBD is not set | ||
588 | # CONFIG_BLK_DEV_RAM is not set | ||
589 | CONFIG_CDROM_PKTCDVD=m | ||
590 | CONFIG_CDROM_PKTCDVD_BUFFERS=8 | ||
591 | # CONFIG_CDROM_PKTCDVD_WCACHE is not set | ||
592 | CONFIG_ATA_OVER_ETH=m | ||
593 | # CONFIG_MISC_DEVICES is not set | ||
594 | # CONFIG_IDE is not set | ||
595 | |||
596 | # | ||
597 | # SCSI device support | ||
598 | # | ||
599 | CONFIG_RAID_ATTRS=m | ||
600 | CONFIG_SCSI=y | ||
601 | CONFIG_SCSI_DMA=y | ||
602 | CONFIG_SCSI_TGT=m | ||
603 | # CONFIG_SCSI_NETLINK is not set | ||
604 | CONFIG_SCSI_PROC_FS=y | ||
605 | |||
606 | # | ||
607 | # SCSI support type (disk, tape, CD-ROM) | ||
608 | # | ||
609 | CONFIG_BLK_DEV_SD=y | ||
610 | CONFIG_CHR_DEV_ST=y | ||
611 | # CONFIG_CHR_DEV_OSST is not set | ||
612 | CONFIG_BLK_DEV_SR=y | ||
613 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
614 | # CONFIG_CHR_DEV_SG is not set | ||
615 | CONFIG_CHR_DEV_SCH=m | ||
616 | |||
617 | # | ||
618 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
619 | # | ||
620 | # CONFIG_SCSI_MULTI_LUN is not set | ||
621 | CONFIG_SCSI_CONSTANTS=y | ||
622 | # CONFIG_SCSI_LOGGING is not set | ||
623 | CONFIG_SCSI_SCAN_ASYNC=y | ||
624 | CONFIG_SCSI_WAIT_SCAN=m | ||
625 | |||
626 | # | ||
627 | # SCSI Transports | ||
628 | # | ||
629 | CONFIG_SCSI_SPI_ATTRS=m | ||
630 | # CONFIG_SCSI_FC_ATTRS is not set | ||
631 | CONFIG_SCSI_ISCSI_ATTRS=m | ||
632 | # CONFIG_SCSI_SAS_LIBSAS is not set | ||
633 | CONFIG_SCSI_LOWLEVEL=y | ||
634 | CONFIG_ISCSI_TCP=m | ||
635 | CONFIG_SGIWD93_SCSI=y | ||
636 | # CONFIG_SCSI_DEBUG is not set | ||
637 | # CONFIG_ATA is not set | ||
638 | # CONFIG_MD is not set | ||
639 | CONFIG_NETDEVICES=y | ||
640 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
641 | # CONFIG_IFB is not set | ||
642 | CONFIG_DUMMY=m | ||
643 | CONFIG_BONDING=m | ||
644 | CONFIG_MACVLAN=m | ||
645 | CONFIG_EQUALIZER=m | ||
646 | CONFIG_TUN=m | ||
647 | CONFIG_PHYLIB=m | ||
648 | |||
649 | # | ||
650 | # MII PHY device drivers | ||
651 | # | ||
652 | CONFIG_MARVELL_PHY=m | ||
653 | CONFIG_DAVICOM_PHY=m | ||
654 | CONFIG_QSEMI_PHY=m | ||
655 | CONFIG_LXT_PHY=m | ||
656 | CONFIG_CICADA_PHY=m | ||
657 | # CONFIG_VITESSE_PHY is not set | ||
658 | # CONFIG_SMSC_PHY is not set | ||
659 | # CONFIG_BROADCOM_PHY is not set | ||
660 | # CONFIG_ICPLUS_PHY is not set | ||
661 | # CONFIG_FIXED_PHY is not set | ||
662 | CONFIG_NET_ETHERNET=y | ||
663 | # CONFIG_MII is not set | ||
664 | # CONFIG_AX88796 is not set | ||
665 | # CONFIG_DM9000 is not set | ||
666 | CONFIG_SGISEEQ=y | ||
667 | # CONFIG_NETDEV_1000 is not set | ||
668 | # CONFIG_NETDEV_10000 is not set | ||
669 | |||
670 | # | ||
671 | # Wireless LAN | ||
672 | # | ||
673 | CONFIG_WLAN_PRE80211=y | ||
674 | CONFIG_STRIP=m | ||
675 | CONFIG_WLAN_80211=y | ||
676 | # CONFIG_LIBERTAS is not set | ||
677 | CONFIG_HOSTAP=m | ||
678 | # CONFIG_HOSTAP_FIRMWARE is not set | ||
679 | # CONFIG_WAN is not set | ||
680 | # CONFIG_PPP is not set | ||
681 | # CONFIG_SLIP is not set | ||
682 | # CONFIG_SHAPER is not set | ||
683 | # CONFIG_NETCONSOLE is not set | ||
684 | # CONFIG_NETPOLL is not set | ||
685 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
686 | # CONFIG_ISDN is not set | ||
687 | # CONFIG_PHONE is not set | ||
688 | |||
689 | # | ||
690 | # Input device support | ||
691 | # | ||
692 | CONFIG_INPUT=y | ||
693 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
694 | # CONFIG_INPUT_POLLDEV is not set | ||
695 | |||
696 | # | ||
697 | # Userland interfaces | ||
698 | # | ||
699 | CONFIG_INPUT_MOUSEDEV=m | ||
700 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
701 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
702 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
703 | # CONFIG_INPUT_JOYDEV is not set | ||
704 | # CONFIG_INPUT_TSDEV is not set | ||
705 | # CONFIG_INPUT_EVDEV is not set | ||
706 | # CONFIG_INPUT_EVBUG is not set | ||
707 | |||
708 | # | ||
709 | # Input Device Drivers | ||
710 | # | ||
711 | CONFIG_INPUT_KEYBOARD=y | ||
712 | CONFIG_KEYBOARD_ATKBD=y | ||
713 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
714 | # CONFIG_KEYBOARD_LKKBD is not set | ||
715 | # CONFIG_KEYBOARD_XTKBD is not set | ||
716 | # CONFIG_KEYBOARD_NEWTON is not set | ||
717 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
718 | CONFIG_INPUT_MOUSE=y | ||
719 | CONFIG_MOUSE_PS2=m | ||
720 | # CONFIG_MOUSE_PS2_ALPS is not set | ||
721 | CONFIG_MOUSE_PS2_LOGIPS2PP=y | ||
722 | # CONFIG_MOUSE_PS2_SYNAPTICS is not set | ||
723 | # CONFIG_MOUSE_PS2_LIFEBOOK is not set | ||
724 | CONFIG_MOUSE_PS2_TRACKPOINT=y | ||
725 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
726 | CONFIG_MOUSE_SERIAL=m | ||
727 | # CONFIG_MOUSE_VSXXXAA is not set | ||
728 | # CONFIG_INPUT_JOYSTICK is not set | ||
729 | # CONFIG_INPUT_TABLET is not set | ||
730 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
731 | # CONFIG_INPUT_MISC is not set | ||
732 | |||
733 | # | ||
734 | # Hardware I/O ports | ||
735 | # | ||
736 | CONFIG_SERIO=y | ||
737 | CONFIG_SERIO_I8042=y | ||
738 | CONFIG_SERIO_SERPORT=y | ||
739 | CONFIG_SERIO_LIBPS2=y | ||
740 | CONFIG_SERIO_RAW=m | ||
741 | # CONFIG_GAMEPORT is not set | ||
742 | |||
743 | # | ||
744 | # Character devices | ||
745 | # | ||
746 | CONFIG_VT=y | ||
747 | CONFIG_VT_CONSOLE=y | ||
748 | CONFIG_HW_CONSOLE=y | ||
749 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
750 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
751 | |||
752 | # | ||
753 | # Serial drivers | ||
754 | # | ||
755 | # CONFIG_SERIAL_8250 is not set | ||
756 | |||
757 | # | ||
758 | # Non-8250 serial port support | ||
759 | # | ||
760 | CONFIG_SERIAL_IP22_ZILOG=m | ||
761 | CONFIG_SERIAL_CORE=m | ||
762 | CONFIG_UNIX98_PTYS=y | ||
763 | CONFIG_LEGACY_PTYS=y | ||
764 | CONFIG_LEGACY_PTY_COUNT=256 | ||
765 | # CONFIG_IPMI_HANDLER is not set | ||
766 | CONFIG_WATCHDOG=y | ||
767 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
768 | |||
769 | # | ||
770 | # Watchdog Device Drivers | ||
771 | # | ||
772 | # CONFIG_SOFT_WATCHDOG is not set | ||
773 | CONFIG_INDYDOG=m | ||
774 | # CONFIG_HW_RANDOM is not set | ||
775 | # CONFIG_RTC is not set | ||
776 | CONFIG_SGI_DS1286=m | ||
777 | # CONFIG_R3964 is not set | ||
778 | CONFIG_RAW_DRIVER=m | ||
779 | CONFIG_MAX_RAW_DEVS=256 | ||
780 | # CONFIG_TCG_TPM is not set | ||
781 | # CONFIG_I2C is not set | ||
782 | |||
783 | # | ||
784 | # SPI support | ||
785 | # | ||
786 | # CONFIG_SPI is not set | ||
787 | # CONFIG_SPI_MASTER is not set | ||
788 | # CONFIG_W1 is not set | ||
789 | # CONFIG_POWER_SUPPLY is not set | ||
790 | # CONFIG_HWMON is not set | ||
791 | |||
792 | # | ||
793 | # Multifunction device drivers | ||
794 | # | ||
795 | # CONFIG_MFD_SM501 is not set | ||
796 | |||
797 | # | ||
798 | # Multimedia devices | ||
799 | # | ||
800 | # CONFIG_VIDEO_DEV is not set | ||
801 | # CONFIG_DVB_CORE is not set | ||
802 | # CONFIG_DAB is not set | ||
803 | |||
804 | # | ||
805 | # Graphics support | ||
806 | # | ||
807 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
808 | |||
809 | # | ||
810 | # Display device support | ||
811 | # | ||
812 | # CONFIG_DISPLAY_SUPPORT is not set | ||
813 | # CONFIG_VGASTATE is not set | ||
814 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
815 | # CONFIG_FB is not set | ||
816 | |||
817 | # | ||
818 | # Console display driver support | ||
819 | # | ||
820 | # CONFIG_VGA_CONSOLE is not set | ||
821 | CONFIG_SGI_NEWPORT_CONSOLE=y | ||
822 | CONFIG_DUMMY_CONSOLE=y | ||
823 | CONFIG_FONT_8x16=y | ||
824 | CONFIG_LOGO=y | ||
825 | # CONFIG_LOGO_LINUX_MONO is not set | ||
826 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
827 | # CONFIG_LOGO_LINUX_CLUT224 is not set | ||
828 | CONFIG_LOGO_SGI_CLUT224=y | ||
829 | |||
830 | # | ||
831 | # Sound | ||
832 | # | ||
833 | # CONFIG_SOUND is not set | ||
834 | CONFIG_HID_SUPPORT=y | ||
835 | CONFIG_HID=y | ||
836 | # CONFIG_HID_DEBUG is not set | ||
837 | CONFIG_USB_SUPPORT=y | ||
838 | # CONFIG_USB_ARCH_HAS_HCD is not set | ||
839 | # CONFIG_USB_ARCH_HAS_OHCI is not set | ||
840 | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||
841 | |||
842 | # | ||
843 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
844 | # | ||
845 | |||
846 | # | ||
847 | # USB Gadget Support | ||
848 | # | ||
849 | # CONFIG_USB_GADGET is not set | ||
850 | # CONFIG_MMC is not set | ||
851 | # CONFIG_NEW_LEDS is not set | ||
852 | # CONFIG_RTC_CLASS is not set | ||
853 | |||
854 | # | ||
855 | # DMA Engine support | ||
856 | # | ||
857 | # CONFIG_DMA_ENGINE is not set | ||
858 | |||
859 | # | ||
860 | # DMA Clients | ||
861 | # | ||
862 | |||
863 | # | ||
864 | # DMA Devices | ||
865 | # | ||
866 | |||
867 | # | ||
868 | # Userspace I/O | ||
869 | # | ||
870 | # CONFIG_UIO is not set | ||
871 | |||
872 | # | ||
873 | # File systems | ||
874 | # | ||
875 | CONFIG_EXT2_FS=m | ||
876 | # CONFIG_EXT2_FS_XATTR is not set | ||
877 | # CONFIG_EXT2_FS_XIP is not set | ||
878 | CONFIG_EXT3_FS=y | ||
879 | CONFIG_EXT3_FS_XATTR=y | ||
880 | CONFIG_EXT3_FS_POSIX_ACL=y | ||
881 | CONFIG_EXT3_FS_SECURITY=y | ||
882 | # CONFIG_EXT4DEV_FS is not set | ||
883 | CONFIG_JBD=y | ||
884 | # CONFIG_JBD_DEBUG is not set | ||
885 | CONFIG_FS_MBCACHE=y | ||
886 | # CONFIG_REISERFS_FS is not set | ||
887 | # CONFIG_JFS_FS is not set | ||
888 | CONFIG_FS_POSIX_ACL=y | ||
889 | CONFIG_XFS_FS=m | ||
890 | CONFIG_XFS_QUOTA=y | ||
891 | CONFIG_XFS_SECURITY=y | ||
892 | # CONFIG_XFS_POSIX_ACL is not set | ||
893 | # CONFIG_XFS_RT is not set | ||
894 | # CONFIG_GFS2_FS is not set | ||
895 | # CONFIG_OCFS2_FS is not set | ||
896 | CONFIG_MINIX_FS=m | ||
897 | # CONFIG_ROMFS_FS is not set | ||
898 | CONFIG_INOTIFY=y | ||
899 | CONFIG_INOTIFY_USER=y | ||
900 | CONFIG_QUOTA=y | ||
901 | # CONFIG_QFMT_V1 is not set | ||
902 | CONFIG_QFMT_V2=m | ||
903 | CONFIG_QUOTACTL=y | ||
904 | CONFIG_DNOTIFY=y | ||
905 | CONFIG_AUTOFS_FS=m | ||
906 | CONFIG_AUTOFS4_FS=m | ||
907 | CONFIG_FUSE_FS=m | ||
908 | CONFIG_GENERIC_ACL=y | ||
909 | |||
910 | # | ||
911 | # CD-ROM/DVD Filesystems | ||
912 | # | ||
913 | CONFIG_ISO9660_FS=m | ||
914 | CONFIG_JOLIET=y | ||
915 | CONFIG_ZISOFS=y | ||
916 | CONFIG_UDF_FS=m | ||
917 | CONFIG_UDF_NLS=y | ||
918 | |||
919 | # | ||
920 | # DOS/FAT/NT Filesystems | ||
921 | # | ||
922 | CONFIG_FAT_FS=m | ||
923 | CONFIG_MSDOS_FS=m | ||
924 | CONFIG_VFAT_FS=m | ||
925 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
926 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
927 | # CONFIG_NTFS_FS is not set | ||
928 | |||
929 | # | ||
930 | # Pseudo filesystems | ||
931 | # | ||
932 | CONFIG_PROC_FS=y | ||
933 | CONFIG_PROC_KCORE=y | ||
934 | CONFIG_PROC_SYSCTL=y | ||
935 | CONFIG_SYSFS=y | ||
936 | CONFIG_TMPFS=y | ||
937 | CONFIG_TMPFS_POSIX_ACL=y | ||
938 | # CONFIG_HUGETLB_PAGE is not set | ||
939 | CONFIG_RAMFS=y | ||
940 | CONFIG_CONFIGFS_FS=m | ||
941 | |||
942 | # | ||
943 | # Miscellaneous filesystems | ||
944 | # | ||
945 | # CONFIG_ADFS_FS is not set | ||
946 | # CONFIG_AFFS_FS is not set | ||
947 | # CONFIG_ECRYPT_FS is not set | ||
948 | # CONFIG_HFS_FS is not set | ||
949 | # CONFIG_HFSPLUS_FS is not set | ||
950 | # CONFIG_BEFS_FS is not set | ||
951 | # CONFIG_BFS_FS is not set | ||
952 | CONFIG_EFS_FS=m | ||
953 | # CONFIG_CRAMFS is not set | ||
954 | # CONFIG_VXFS_FS is not set | ||
955 | # CONFIG_HPFS_FS is not set | ||
956 | # CONFIG_QNX4FS_FS is not set | ||
957 | # CONFIG_SYSV_FS is not set | ||
958 | CONFIG_UFS_FS=m | ||
959 | # CONFIG_UFS_FS_WRITE is not set | ||
960 | # CONFIG_UFS_DEBUG is not set | ||
961 | |||
962 | # | ||
963 | # Network File Systems | ||
964 | # | ||
965 | CONFIG_NFS_FS=m | ||
966 | CONFIG_NFS_V3=y | ||
967 | CONFIG_NFS_V3_ACL=y | ||
968 | # CONFIG_NFS_V4 is not set | ||
969 | # CONFIG_NFS_DIRECTIO is not set | ||
970 | CONFIG_NFSD=m | ||
971 | CONFIG_NFSD_V2_ACL=y | ||
972 | CONFIG_NFSD_V3=y | ||
973 | CONFIG_NFSD_V3_ACL=y | ||
974 | # CONFIG_NFSD_V4 is not set | ||
975 | CONFIG_NFSD_TCP=y | ||
976 | CONFIG_LOCKD=m | ||
977 | CONFIG_LOCKD_V4=y | ||
978 | CONFIG_EXPORTFS=m | ||
979 | CONFIG_NFS_ACL_SUPPORT=m | ||
980 | CONFIG_NFS_COMMON=y | ||
981 | CONFIG_SUNRPC=m | ||
982 | CONFIG_SUNRPC_GSS=m | ||
983 | # CONFIG_SUNRPC_BIND34 is not set | ||
984 | CONFIG_RPCSEC_GSS_KRB5=m | ||
985 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
986 | CONFIG_SMB_FS=m | ||
987 | CONFIG_SMB_NLS_DEFAULT=y | ||
988 | CONFIG_SMB_NLS_REMOTE="cp437" | ||
989 | CONFIG_CIFS=m | ||
990 | # CONFIG_CIFS_STATS is not set | ||
991 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
992 | # CONFIG_CIFS_XATTR is not set | ||
993 | # CONFIG_CIFS_DEBUG2 is not set | ||
994 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
995 | # CONFIG_NCP_FS is not set | ||
996 | CONFIG_CODA_FS=m | ||
997 | # CONFIG_CODA_FS_OLD_API is not set | ||
998 | # CONFIG_AFS_FS is not set | ||
999 | |||
1000 | # | ||
1001 | # Partition Types | ||
1002 | # | ||
1003 | CONFIG_PARTITION_ADVANCED=y | ||
1004 | # CONFIG_ACORN_PARTITION is not set | ||
1005 | # CONFIG_OSF_PARTITION is not set | ||
1006 | # CONFIG_AMIGA_PARTITION is not set | ||
1007 | # CONFIG_ATARI_PARTITION is not set | ||
1008 | # CONFIG_MAC_PARTITION is not set | ||
1009 | CONFIG_MSDOS_PARTITION=y | ||
1010 | # CONFIG_BSD_DISKLABEL is not set | ||
1011 | # CONFIG_MINIX_SUBPARTITION is not set | ||
1012 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
1013 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
1014 | # CONFIG_LDM_PARTITION is not set | ||
1015 | CONFIG_SGI_PARTITION=y | ||
1016 | # CONFIG_ULTRIX_PARTITION is not set | ||
1017 | # CONFIG_SUN_PARTITION is not set | ||
1018 | # CONFIG_KARMA_PARTITION is not set | ||
1019 | # CONFIG_EFI_PARTITION is not set | ||
1020 | # CONFIG_SYSV68_PARTITION is not set | ||
1021 | |||
1022 | # | ||
1023 | # Native Language Support | ||
1024 | # | ||
1025 | CONFIG_NLS=m | ||
1026 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1027 | CONFIG_NLS_CODEPAGE_437=m | ||
1028 | CONFIG_NLS_CODEPAGE_737=m | ||
1029 | CONFIG_NLS_CODEPAGE_775=m | ||
1030 | CONFIG_NLS_CODEPAGE_850=m | ||
1031 | CONFIG_NLS_CODEPAGE_852=m | ||
1032 | CONFIG_NLS_CODEPAGE_855=m | ||
1033 | CONFIG_NLS_CODEPAGE_857=m | ||
1034 | CONFIG_NLS_CODEPAGE_860=m | ||
1035 | CONFIG_NLS_CODEPAGE_861=m | ||
1036 | CONFIG_NLS_CODEPAGE_862=m | ||
1037 | CONFIG_NLS_CODEPAGE_863=m | ||
1038 | CONFIG_NLS_CODEPAGE_864=m | ||
1039 | CONFIG_NLS_CODEPAGE_865=m | ||
1040 | CONFIG_NLS_CODEPAGE_866=m | ||
1041 | CONFIG_NLS_CODEPAGE_869=m | ||
1042 | CONFIG_NLS_CODEPAGE_936=m | ||
1043 | CONFIG_NLS_CODEPAGE_950=m | ||
1044 | CONFIG_NLS_CODEPAGE_932=m | ||
1045 | CONFIG_NLS_CODEPAGE_949=m | ||
1046 | CONFIG_NLS_CODEPAGE_874=m | ||
1047 | CONFIG_NLS_ISO8859_8=m | ||
1048 | CONFIG_NLS_CODEPAGE_1250=m | ||
1049 | CONFIG_NLS_CODEPAGE_1251=m | ||
1050 | CONFIG_NLS_ASCII=m | ||
1051 | CONFIG_NLS_ISO8859_1=m | ||
1052 | CONFIG_NLS_ISO8859_2=m | ||
1053 | CONFIG_NLS_ISO8859_3=m | ||
1054 | CONFIG_NLS_ISO8859_4=m | ||
1055 | CONFIG_NLS_ISO8859_5=m | ||
1056 | CONFIG_NLS_ISO8859_6=m | ||
1057 | CONFIG_NLS_ISO8859_7=m | ||
1058 | CONFIG_NLS_ISO8859_9=m | ||
1059 | CONFIG_NLS_ISO8859_13=m | ||
1060 | CONFIG_NLS_ISO8859_14=m | ||
1061 | CONFIG_NLS_ISO8859_15=m | ||
1062 | CONFIG_NLS_KOI8_R=m | ||
1063 | CONFIG_NLS_KOI8_U=m | ||
1064 | CONFIG_NLS_UTF8=m | ||
1065 | |||
1066 | # | ||
1067 | # Distributed Lock Manager | ||
1068 | # | ||
1069 | CONFIG_DLM=m | ||
1070 | # CONFIG_DLM_DEBUG is not set | ||
1071 | |||
1072 | # | ||
1073 | # Profiling support | ||
1074 | # | ||
1075 | # CONFIG_PROFILING is not set | ||
1076 | |||
1077 | # | ||
1078 | # Kernel hacking | ||
1079 | # | ||
1080 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
1081 | # CONFIG_PRINTK_TIME is not set | ||
1082 | CONFIG_ENABLE_MUST_CHECK=y | ||
1083 | # CONFIG_MAGIC_SYSRQ is not set | ||
1084 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1085 | # CONFIG_DEBUG_FS is not set | ||
1086 | # CONFIG_HEADERS_CHECK is not set | ||
1087 | # CONFIG_DEBUG_KERNEL is not set | ||
1088 | CONFIG_CROSSCOMPILE=y | ||
1089 | CONFIG_CMDLINE="" | ||
1090 | |||
1091 | # | ||
1092 | # Security options | ||
1093 | # | ||
1094 | CONFIG_KEYS=y | ||
1095 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
1096 | # CONFIG_SECURITY is not set | ||
1097 | CONFIG_CRYPTO=y | ||
1098 | CONFIG_CRYPTO_ALGAPI=y | ||
1099 | CONFIG_CRYPTO_ABLKCIPHER=m | ||
1100 | CONFIG_CRYPTO_BLKCIPHER=m | ||
1101 | CONFIG_CRYPTO_HASH=y | ||
1102 | CONFIG_CRYPTO_MANAGER=y | ||
1103 | CONFIG_CRYPTO_HMAC=y | ||
1104 | CONFIG_CRYPTO_XCBC=m | ||
1105 | CONFIG_CRYPTO_NULL=m | ||
1106 | CONFIG_CRYPTO_MD4=m | ||
1107 | CONFIG_CRYPTO_MD5=y | ||
1108 | CONFIG_CRYPTO_SHA1=m | ||
1109 | CONFIG_CRYPTO_SHA256=m | ||
1110 | CONFIG_CRYPTO_SHA512=m | ||
1111 | CONFIG_CRYPTO_WP512=m | ||
1112 | CONFIG_CRYPTO_TGR192=m | ||
1113 | CONFIG_CRYPTO_GF128MUL=m | ||
1114 | CONFIG_CRYPTO_ECB=m | ||
1115 | CONFIG_CRYPTO_CBC=m | ||
1116 | CONFIG_CRYPTO_PCBC=m | ||
1117 | CONFIG_CRYPTO_LRW=m | ||
1118 | CONFIG_CRYPTO_CRYPTD=m | ||
1119 | CONFIG_CRYPTO_DES=m | ||
1120 | CONFIG_CRYPTO_FCRYPT=m | ||
1121 | CONFIG_CRYPTO_BLOWFISH=m | ||
1122 | CONFIG_CRYPTO_TWOFISH=m | ||
1123 | CONFIG_CRYPTO_TWOFISH_COMMON=m | ||
1124 | CONFIG_CRYPTO_SERPENT=m | ||
1125 | CONFIG_CRYPTO_AES=m | ||
1126 | CONFIG_CRYPTO_CAST5=m | ||
1127 | CONFIG_CRYPTO_CAST6=m | ||
1128 | CONFIG_CRYPTO_TEA=m | ||
1129 | CONFIG_CRYPTO_ARC4=m | ||
1130 | CONFIG_CRYPTO_KHAZAD=m | ||
1131 | CONFIG_CRYPTO_ANUBIS=m | ||
1132 | CONFIG_CRYPTO_DEFLATE=m | ||
1133 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
1134 | CONFIG_CRYPTO_CRC32C=m | ||
1135 | CONFIG_CRYPTO_CAMELLIA=m | ||
1136 | # CONFIG_CRYPTO_TEST is not set | ||
1137 | # CONFIG_CRYPTO_HW is not set | ||
1138 | |||
1139 | # | ||
1140 | # Library routines | ||
1141 | # | ||
1142 | CONFIG_BITREVERSE=m | ||
1143 | # CONFIG_CRC_CCITT is not set | ||
1144 | CONFIG_CRC16=m | ||
1145 | # CONFIG_CRC_ITU_T is not set | ||
1146 | CONFIG_CRC32=m | ||
1147 | # CONFIG_CRC7 is not set | ||
1148 | CONFIG_LIBCRC32C=m | ||
1149 | CONFIG_ZLIB_INFLATE=m | ||
1150 | CONFIG_ZLIB_DEFLATE=m | ||
1151 | CONFIG_TEXTSEARCH=y | ||
1152 | CONFIG_TEXTSEARCH_KMP=m | ||
1153 | CONFIG_TEXTSEARCH_BM=m | ||
1154 | CONFIG_TEXTSEARCH_FSM=m | ||
1155 | CONFIG_PLIST=y | ||
1156 | CONFIG_HAS_IOMEM=y | ||
1157 | CONFIG_HAS_IOPORT=y | ||
1158 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index ffa08362de17..9e78e1a4ca17 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
@@ -76,7 +76,6 @@ obj-$(CONFIG_PROC_FS) += proc.o | |||
76 | obj-$(CONFIG_64BIT) += cpu-bugs64.o | 76 | obj-$(CONFIG_64BIT) += cpu-bugs64.o |
77 | 77 | ||
78 | obj-$(CONFIG_I8253) += i8253.o | 78 | obj-$(CONFIG_I8253) += i8253.o |
79 | obj-$(CONFIG_PCSPEAKER) += pcspeaker.o | ||
80 | 79 | ||
81 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o | 80 | obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o |
82 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 81 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
diff --git a/arch/mips/kernel/cpu-bugs64.c b/arch/mips/kernel/cpu-bugs64.c index 417bb3e336ac..a1b48af0992f 100644 --- a/arch/mips/kernel/cpu-bugs64.c +++ b/arch/mips/kernel/cpu-bugs64.c | |||
@@ -167,7 +167,7 @@ static inline void check_mult_sh(void) | |||
167 | panic(bug64hit, !R4000_WAR ? r4kwar : nowar); | 167 | panic(bug64hit, !R4000_WAR ? r4kwar : nowar); |
168 | } | 168 | } |
169 | 169 | ||
170 | static volatile int daddi_ov __initdata = 0; | 170 | static volatile int daddi_ov __cpuinitdata = 0; |
171 | 171 | ||
172 | asmlinkage void __init do_daddi_ov(struct pt_regs *regs) | 172 | asmlinkage void __init do_daddi_ov(struct pt_regs *regs) |
173 | { | 173 | { |
@@ -239,7 +239,7 @@ static inline void check_daddi(void) | |||
239 | panic(bug64hit, !DADDI_WAR ? daddiwar : nowar); | 239 | panic(bug64hit, !DADDI_WAR ? daddiwar : nowar); |
240 | } | 240 | } |
241 | 241 | ||
242 | int daddiu_bug __initdata = -1; | 242 | int daddiu_bug __cpuinitdata = -1; |
243 | 243 | ||
244 | static inline void check_daddiu(void) | 244 | static inline void check_daddiu(void) |
245 | { | 245 | { |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 5861a432a52f..89c3304cb93c 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
@@ -550,7 +550,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
550 | } | 550 | } |
551 | } | 551 | } |
552 | 552 | ||
553 | static char unknown_isa[] __initdata = KERN_ERR \ | 553 | static char unknown_isa[] __cpuinitdata = KERN_ERR \ |
554 | "Unsupported ISA type, c0.config0: %d."; | 554 | "Unsupported ISA type, c0.config0: %d."; |
555 | 555 | ||
556 | static inline unsigned int decode_config0(struct cpuinfo_mips *c) | 556 | static inline unsigned int decode_config0(struct cpuinfo_mips *c) |
@@ -656,7 +656,7 @@ static inline unsigned int decode_config3(struct cpuinfo_mips *c) | |||
656 | return config3 & MIPS_CONF_M; | 656 | return config3 & MIPS_CONF_M; |
657 | } | 657 | } |
658 | 658 | ||
659 | static void __init decode_configs(struct cpuinfo_mips *c) | 659 | static void __cpuinit decode_configs(struct cpuinfo_mips *c) |
660 | { | 660 | { |
661 | /* MIPS32 or MIPS64 compliant CPU. */ | 661 | /* MIPS32 or MIPS64 compliant CPU. */ |
662 | c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER | | 662 | c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER | |
@@ -814,7 +814,7 @@ const char *__cpu_name[NR_CPUS]; | |||
814 | /* | 814 | /* |
815 | * Name a CPU | 815 | * Name a CPU |
816 | */ | 816 | */ |
817 | static __init const char *cpu_to_name(struct cpuinfo_mips *c) | 817 | static __cpuinit const char *cpu_to_name(struct cpuinfo_mips *c) |
818 | { | 818 | { |
819 | const char *name = NULL; | 819 | const char *name = NULL; |
820 | 820 | ||
@@ -896,7 +896,7 @@ static __init const char *cpu_to_name(struct cpuinfo_mips *c) | |||
896 | return name; | 896 | return name; |
897 | } | 897 | } |
898 | 898 | ||
899 | __init void cpu_probe(void) | 899 | __cpuinit void cpu_probe(void) |
900 | { | 900 | { |
901 | struct cpuinfo_mips *c = ¤t_cpu_data; | 901 | struct cpuinfo_mips *c = ¤t_cpu_data; |
902 | unsigned int cpu = smp_processor_id(); | 902 | unsigned int cpu = smp_processor_id(); |
@@ -959,7 +959,7 @@ __init void cpu_probe(void) | |||
959 | c->srsets = 1; | 959 | c->srsets = 1; |
960 | } | 960 | } |
961 | 961 | ||
962 | __init void cpu_report(void) | 962 | __cpuinit void cpu_report(void) |
963 | { | 963 | { |
964 | struct cpuinfo_mips *c = ¤t_cpu_data; | 964 | struct cpuinfo_mips *c = ¤t_cpu_data; |
965 | 965 | ||
diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c index 0e2b5cd81f67..86e026f067bc 100644 --- a/arch/mips/kernel/csrc-r4k.c +++ b/arch/mips/kernel/csrc-r4k.c | |||
@@ -22,12 +22,17 @@ static struct clocksource clocksource_mips = { | |||
22 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 22 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
23 | }; | 23 | }; |
24 | 24 | ||
25 | void __init init_mips_clocksource(void) | 25 | int __init init_mips_clocksource(void) |
26 | { | 26 | { |
27 | if (!cpu_has_counter || !mips_hpt_frequency) | ||
28 | return -ENXIO; | ||
29 | |||
27 | /* Calclate a somewhat reasonable rating value */ | 30 | /* Calclate a somewhat reasonable rating value */ |
28 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; | 31 | clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; |
29 | 32 | ||
30 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); | 33 | clocksource_set_clock(&clocksource_mips, mips_hpt_frequency); |
31 | 34 | ||
32 | clocksource_register(&clocksource_mips); | 35 | clocksource_register(&clocksource_mips); |
36 | |||
37 | return 0; | ||
33 | } | 38 | } |
diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S index a24fb7900901..361364501d34 100644 --- a/arch/mips/kernel/head.S +++ b/arch/mips/kernel/head.S | |||
@@ -195,7 +195,7 @@ NESTED(kernel_entry, 16, sp) # kernel entry point | |||
195 | j start_kernel | 195 | j start_kernel |
196 | END(kernel_entry) | 196 | END(kernel_entry) |
197 | 197 | ||
198 | __INIT | 198 | __CPUINIT |
199 | 199 | ||
200 | #ifdef CONFIG_SMP | 200 | #ifdef CONFIG_SMP |
201 | /* | 201 | /* |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index fcae66752972..984c0d0a7b4d 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -534,8 +534,7 @@ static int simulate_llsc(struct pt_regs *regs, unsigned int opcode) | |||
534 | 534 | ||
535 | /* | 535 | /* |
536 | * Simulate trapping 'rdhwr' instructions to provide user accessible | 536 | * Simulate trapping 'rdhwr' instructions to provide user accessible |
537 | * registers not implemented in hardware. The only current use of this | 537 | * registers not implemented in hardware. |
538 | * is the thread area pointer. | ||
539 | */ | 538 | */ |
540 | static int simulate_rdhwr(struct pt_regs *regs, unsigned int opcode) | 539 | static int simulate_rdhwr(struct pt_regs *regs, unsigned int opcode) |
541 | { | 540 | { |
@@ -545,11 +544,31 @@ static int simulate_rdhwr(struct pt_regs *regs, unsigned int opcode) | |||
545 | int rd = (opcode & RD) >> 11; | 544 | int rd = (opcode & RD) >> 11; |
546 | int rt = (opcode & RT) >> 16; | 545 | int rt = (opcode & RT) >> 16; |
547 | switch (rd) { | 546 | switch (rd) { |
548 | case 29: | 547 | case 0: /* CPU number */ |
549 | regs->regs[rt] = ti->tp_value; | 548 | regs->regs[rt] = smp_processor_id(); |
550 | return 0; | 549 | return 0; |
550 | case 1: /* SYNCI length */ | ||
551 | regs->regs[rt] = min(current_cpu_data.dcache.linesz, | ||
552 | current_cpu_data.icache.linesz); | ||
553 | return 0; | ||
554 | case 2: /* Read count register */ | ||
555 | regs->regs[rt] = read_c0_count(); | ||
556 | return 0; | ||
557 | case 3: /* Count register resolution */ | ||
558 | switch (current_cpu_data.cputype) { | ||
559 | case CPU_20KC: | ||
560 | case CPU_25KF: | ||
561 | regs->regs[rt] = 1; | ||
562 | break; | ||
551 | default: | 563 | default: |
552 | return -1; | 564 | regs->regs[rt] = 2; |
565 | } | ||
566 | return 0; | ||
567 | case 29: | ||
568 | regs->regs[rt] = ti->tp_value; | ||
569 | return 0; | ||
570 | default: | ||
571 | return -1; | ||
553 | } | 572 | } |
554 | } | 573 | } |
555 | 574 | ||
@@ -1287,7 +1306,7 @@ int cp0_compare_irq; | |||
1287 | int cp0_perfcount_irq; | 1306 | int cp0_perfcount_irq; |
1288 | EXPORT_SYMBOL_GPL(cp0_perfcount_irq); | 1307 | EXPORT_SYMBOL_GPL(cp0_perfcount_irq); |
1289 | 1308 | ||
1290 | void __init per_cpu_trap_init(void) | 1309 | void __cpuinit per_cpu_trap_init(void) |
1291 | { | 1310 | { |
1292 | unsigned int cpu = smp_processor_id(); | 1311 | unsigned int cpu = smp_processor_id(); |
1293 | unsigned int status_set = ST0_CU0; | 1312 | unsigned int status_set = ST0_CU0; |
@@ -1404,11 +1423,12 @@ void __init set_handler(unsigned long offset, void *addr, unsigned long size) | |||
1404 | flush_icache_range(ebase + offset, ebase + offset + size); | 1423 | flush_icache_range(ebase + offset, ebase + offset + size); |
1405 | } | 1424 | } |
1406 | 1425 | ||
1407 | static char panic_null_cerr[] __initdata = | 1426 | static char panic_null_cerr[] __cpuinitdata = |
1408 | "Trying to set NULL cache error exception handler"; | 1427 | "Trying to set NULL cache error exception handler"; |
1409 | 1428 | ||
1410 | /* Install uncached CPU exception handler */ | 1429 | /* Install uncached CPU exception handler */ |
1411 | void __init set_uncached_handler(unsigned long offset, void *addr, unsigned long size) | 1430 | void __cpuinit set_uncached_handler(unsigned long offset, void *addr, |
1431 | unsigned long size) | ||
1412 | { | 1432 | { |
1413 | #ifdef CONFIG_32BIT | 1433 | #ifdef CONFIG_32BIT |
1414 | unsigned long uncached_ebase = KSEG1ADDR(ebase); | 1434 | unsigned long uncached_ebase = KSEG1ADDR(ebase); |
diff --git a/arch/mips/lib/ucmpdi2.c b/arch/mips/lib/ucmpdi2.c index b33d8569bcb0..bb4cb2f828ea 100644 --- a/arch/mips/lib/ucmpdi2.c +++ b/arch/mips/lib/ucmpdi2.c | |||
@@ -17,3 +17,5 @@ word_type __ucmpdi2(unsigned long long a, unsigned long long b) | |||
17 | return 2; | 17 | return 2; |
18 | return 1; | 18 | return 1; |
19 | } | 19 | } |
20 | |||
21 | EXPORT_SYMBOL(__ucmpdi2); | ||
diff --git a/arch/mips/lib/uncached.c b/arch/mips/lib/uncached.c index 27b012d4341c..a6d1c77034d5 100644 --- a/arch/mips/lib/uncached.c +++ b/arch/mips/lib/uncached.c | |||
@@ -36,7 +36,7 @@ | |||
36 | * values, so we can avoid sharing the same stack area between a cached | 36 | * values, so we can avoid sharing the same stack area between a cached |
37 | * and the uncached mode. | 37 | * and the uncached mode. |
38 | */ | 38 | */ |
39 | unsigned long __init run_uncached(void *func) | 39 | unsigned long __cpuinit run_uncached(void *func) |
40 | { | 40 | { |
41 | register long sp __asm__("$sp"); | 41 | register long sp __asm__("$sp"); |
42 | register long ret __asm__("$2"); | 42 | register long ret __asm__("$2"); |
diff --git a/arch/mips/mips-boards/generic/time.c b/arch/mips/mips-boards/generic/time.c index f02ce6308e51..b50e0fc406ac 100644 --- a/arch/mips/mips-boards/generic/time.c +++ b/arch/mips/mips-boards/generic/time.c | |||
@@ -146,7 +146,7 @@ void __init plat_perf_setup(void) | |||
146 | } | 146 | } |
147 | } | 147 | } |
148 | 148 | ||
149 | unsigned int __init get_c0_compare_int(void) | 149 | unsigned int __cpuinit get_c0_compare_int(void) |
150 | { | 150 | { |
151 | #ifdef MSC01E_INT_BASE | 151 | #ifdef MSC01E_INT_BASE |
152 | if (cpu_has_veic) { | 152 | if (cpu_has_veic) { |
diff --git a/arch/mips/mipssim/sim_time.c b/arch/mips/mipssim/sim_time.c index e39bbe989da3..881ecbc1fa23 100644 --- a/arch/mips/mipssim/sim_time.c +++ b/arch/mips/mipssim/sim_time.c | |||
@@ -83,7 +83,7 @@ static void mips_timer_dispatch(void) | |||
83 | } | 83 | } |
84 | 84 | ||
85 | 85 | ||
86 | unsigned __init get_c0_compare_int(void) | 86 | unsigned __cpuinit get_c0_compare_int(void) |
87 | { | 87 | { |
88 | #ifdef MSC01E_INT_BASE | 88 | #ifdef MSC01E_INT_BASE |
89 | if (cpu_has_veic) { | 89 | if (cpu_has_veic) { |
diff --git a/arch/mips/mm/c-r3k.c b/arch/mips/mm/c-r3k.c index 562abb77d1d5..76935e320214 100644 --- a/arch/mips/mm/c-r3k.c +++ b/arch/mips/mm/c-r3k.c | |||
@@ -307,7 +307,7 @@ static void r3k_dma_cache_wback_inv(unsigned long start, unsigned long size) | |||
307 | r3k_flush_dcache_range(start, start + size); | 307 | r3k_flush_dcache_range(start, start + size); |
308 | } | 308 | } |
309 | 309 | ||
310 | void __init r3k_cache_init(void) | 310 | void __cpuinit r3k_cache_init(void) |
311 | { | 311 | { |
312 | extern void build_clear_page(void); | 312 | extern void build_clear_page(void); |
313 | extern void build_copy_page(void); | 313 | extern void build_copy_page(void); |
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c index 2c4f7e11f0d5..6496925b5e29 100644 --- a/arch/mips/mm/c-r4k.c +++ b/arch/mips/mm/c-r4k.c | |||
@@ -93,7 +93,7 @@ static inline void r4k_blast_dcache_page_dc32(unsigned long addr) | |||
93 | blast_dcache32_page(addr); | 93 | blast_dcache32_page(addr); |
94 | } | 94 | } |
95 | 95 | ||
96 | static void __init r4k_blast_dcache_page_setup(void) | 96 | static void __cpuinit r4k_blast_dcache_page_setup(void) |
97 | { | 97 | { |
98 | unsigned long dc_lsize = cpu_dcache_line_size(); | 98 | unsigned long dc_lsize = cpu_dcache_line_size(); |
99 | 99 | ||
@@ -107,7 +107,7 @@ static void __init r4k_blast_dcache_page_setup(void) | |||
107 | 107 | ||
108 | static void (* r4k_blast_dcache_page_indexed)(unsigned long addr); | 108 | static void (* r4k_blast_dcache_page_indexed)(unsigned long addr); |
109 | 109 | ||
110 | static void __init r4k_blast_dcache_page_indexed_setup(void) | 110 | static void __cpuinit r4k_blast_dcache_page_indexed_setup(void) |
111 | { | 111 | { |
112 | unsigned long dc_lsize = cpu_dcache_line_size(); | 112 | unsigned long dc_lsize = cpu_dcache_line_size(); |
113 | 113 | ||
@@ -121,7 +121,7 @@ static void __init r4k_blast_dcache_page_indexed_setup(void) | |||
121 | 121 | ||
122 | static void (* r4k_blast_dcache)(void); | 122 | static void (* r4k_blast_dcache)(void); |
123 | 123 | ||
124 | static void __init r4k_blast_dcache_setup(void) | 124 | static void __cpuinit r4k_blast_dcache_setup(void) |
125 | { | 125 | { |
126 | unsigned long dc_lsize = cpu_dcache_line_size(); | 126 | unsigned long dc_lsize = cpu_dcache_line_size(); |
127 | 127 | ||
@@ -206,7 +206,7 @@ static inline void tx49_blast_icache32_page_indexed(unsigned long page) | |||
206 | 206 | ||
207 | static void (* r4k_blast_icache_page)(unsigned long addr); | 207 | static void (* r4k_blast_icache_page)(unsigned long addr); |
208 | 208 | ||
209 | static void __init r4k_blast_icache_page_setup(void) | 209 | static void __cpuinit r4k_blast_icache_page_setup(void) |
210 | { | 210 | { |
211 | unsigned long ic_lsize = cpu_icache_line_size(); | 211 | unsigned long ic_lsize = cpu_icache_line_size(); |
212 | 212 | ||
@@ -223,7 +223,7 @@ static void __init r4k_blast_icache_page_setup(void) | |||
223 | 223 | ||
224 | static void (* r4k_blast_icache_page_indexed)(unsigned long addr); | 224 | static void (* r4k_blast_icache_page_indexed)(unsigned long addr); |
225 | 225 | ||
226 | static void __init r4k_blast_icache_page_indexed_setup(void) | 226 | static void __cpuinit r4k_blast_icache_page_indexed_setup(void) |
227 | { | 227 | { |
228 | unsigned long ic_lsize = cpu_icache_line_size(); | 228 | unsigned long ic_lsize = cpu_icache_line_size(); |
229 | 229 | ||
@@ -247,7 +247,7 @@ static void __init r4k_blast_icache_page_indexed_setup(void) | |||
247 | 247 | ||
248 | static void (* r4k_blast_icache)(void); | 248 | static void (* r4k_blast_icache)(void); |
249 | 249 | ||
250 | static void __init r4k_blast_icache_setup(void) | 250 | static void __cpuinit r4k_blast_icache_setup(void) |
251 | { | 251 | { |
252 | unsigned long ic_lsize = cpu_icache_line_size(); | 252 | unsigned long ic_lsize = cpu_icache_line_size(); |
253 | 253 | ||
@@ -268,7 +268,7 @@ static void __init r4k_blast_icache_setup(void) | |||
268 | 268 | ||
269 | static void (* r4k_blast_scache_page)(unsigned long addr); | 269 | static void (* r4k_blast_scache_page)(unsigned long addr); |
270 | 270 | ||
271 | static void __init r4k_blast_scache_page_setup(void) | 271 | static void __cpuinit r4k_blast_scache_page_setup(void) |
272 | { | 272 | { |
273 | unsigned long sc_lsize = cpu_scache_line_size(); | 273 | unsigned long sc_lsize = cpu_scache_line_size(); |
274 | 274 | ||
@@ -286,7 +286,7 @@ static void __init r4k_blast_scache_page_setup(void) | |||
286 | 286 | ||
287 | static void (* r4k_blast_scache_page_indexed)(unsigned long addr); | 287 | static void (* r4k_blast_scache_page_indexed)(unsigned long addr); |
288 | 288 | ||
289 | static void __init r4k_blast_scache_page_indexed_setup(void) | 289 | static void __cpuinit r4k_blast_scache_page_indexed_setup(void) |
290 | { | 290 | { |
291 | unsigned long sc_lsize = cpu_scache_line_size(); | 291 | unsigned long sc_lsize = cpu_scache_line_size(); |
292 | 292 | ||
@@ -304,7 +304,7 @@ static void __init r4k_blast_scache_page_indexed_setup(void) | |||
304 | 304 | ||
305 | static void (* r4k_blast_scache)(void); | 305 | static void (* r4k_blast_scache)(void); |
306 | 306 | ||
307 | static void __init r4k_blast_scache_setup(void) | 307 | static void __cpuinit r4k_blast_scache_setup(void) |
308 | { | 308 | { |
309 | unsigned long sc_lsize = cpu_scache_line_size(); | 309 | unsigned long sc_lsize = cpu_scache_line_size(); |
310 | 310 | ||
@@ -691,11 +691,11 @@ static inline void rm7k_erratum31(void) | |||
691 | } | 691 | } |
692 | } | 692 | } |
693 | 693 | ||
694 | static char *way_string[] __initdata = { NULL, "direct mapped", "2-way", | 694 | static char *way_string[] __cpuinitdata = { NULL, "direct mapped", "2-way", |
695 | "3-way", "4-way", "5-way", "6-way", "7-way", "8-way" | 695 | "3-way", "4-way", "5-way", "6-way", "7-way", "8-way" |
696 | }; | 696 | }; |
697 | 697 | ||
698 | static void __init probe_pcache(void) | 698 | static void __cpuinit probe_pcache(void) |
699 | { | 699 | { |
700 | struct cpuinfo_mips *c = ¤t_cpu_data; | 700 | struct cpuinfo_mips *c = ¤t_cpu_data; |
701 | unsigned int config = read_c0_config(); | 701 | unsigned int config = read_c0_config(); |
@@ -1016,7 +1016,7 @@ static void __init probe_pcache(void) | |||
1016 | * executes in KSEG1 space or else you will crash and burn badly. You have | 1016 | * executes in KSEG1 space or else you will crash and burn badly. You have |
1017 | * been warned. | 1017 | * been warned. |
1018 | */ | 1018 | */ |
1019 | static int __init probe_scache(void) | 1019 | static int __cpuinit probe_scache(void) |
1020 | { | 1020 | { |
1021 | unsigned long flags, addr, begin, end, pow2; | 1021 | unsigned long flags, addr, begin, end, pow2; |
1022 | unsigned int config = read_c0_config(); | 1022 | unsigned int config = read_c0_config(); |
@@ -1095,7 +1095,7 @@ extern int r5k_sc_init(void); | |||
1095 | extern int rm7k_sc_init(void); | 1095 | extern int rm7k_sc_init(void); |
1096 | extern int mips_sc_init(void); | 1096 | extern int mips_sc_init(void); |
1097 | 1097 | ||
1098 | static void __init setup_scache(void) | 1098 | static void __cpuinit setup_scache(void) |
1099 | { | 1099 | { |
1100 | struct cpuinfo_mips *c = ¤t_cpu_data; | 1100 | struct cpuinfo_mips *c = ¤t_cpu_data; |
1101 | unsigned int config = read_c0_config(); | 1101 | unsigned int config = read_c0_config(); |
@@ -1206,7 +1206,7 @@ void au1x00_fixup_config_od(void) | |||
1206 | } | 1206 | } |
1207 | } | 1207 | } |
1208 | 1208 | ||
1209 | static void __init coherency_setup(void) | 1209 | static void __cpuinit coherency_setup(void) |
1210 | { | 1210 | { |
1211 | change_c0_config(CONF_CM_CMASK, CONF_CM_DEFAULT); | 1211 | change_c0_config(CONF_CM_CMASK, CONF_CM_DEFAULT); |
1212 | 1212 | ||
@@ -1238,7 +1238,7 @@ static void __init coherency_setup(void) | |||
1238 | } | 1238 | } |
1239 | } | 1239 | } |
1240 | 1240 | ||
1241 | void __init r4k_cache_init(void) | 1241 | void __cpuinit r4k_cache_init(void) |
1242 | { | 1242 | { |
1243 | extern void build_clear_page(void); | 1243 | extern void build_clear_page(void); |
1244 | extern void build_copy_page(void); | 1244 | extern void build_copy_page(void); |
diff --git a/arch/mips/mm/c-tx39.c b/arch/mips/mm/c-tx39.c index 9ea121e8cdce..b09d56981d53 100644 --- a/arch/mips/mm/c-tx39.c +++ b/arch/mips/mm/c-tx39.c | |||
@@ -329,7 +329,7 @@ static __init void tx39_probe_cache(void) | |||
329 | } | 329 | } |
330 | } | 330 | } |
331 | 331 | ||
332 | void __init tx39_cache_init(void) | 332 | void __cpuinit tx39_cache_init(void) |
333 | { | 333 | { |
334 | extern void build_clear_page(void); | 334 | extern void build_clear_page(void); |
335 | extern void build_copy_page(void); | 335 | extern void build_copy_page(void); |
diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c index 6a24651971df..51ab1faa027d 100644 --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c | |||
@@ -127,9 +127,10 @@ void __update_cache(struct vm_area_struct *vma, unsigned long address, | |||
127 | } | 127 | } |
128 | } | 128 | } |
129 | 129 | ||
130 | static char cache_panic[] __initdata = "Yeee, unsupported cache architecture."; | 130 | static char cache_panic[] __cpuinitdata = |
131 | "Yeee, unsupported cache architecture."; | ||
131 | 132 | ||
132 | void __init cpu_cache_init(void) | 133 | void __devinit cpu_cache_init(void) |
133 | { | 134 | { |
134 | if (cpu_has_3k_cache) { | 135 | if (cpu_has_3k_cache) { |
135 | extern void __weak r3k_cache_init(void); | 136 | extern void __weak r3k_cache_init(void); |
diff --git a/arch/mips/mm/cex-sb1.S b/arch/mips/mm/cex-sb1.S index e54a62f2807c..2d08268bb705 100644 --- a/arch/mips/mm/cex-sb1.S +++ b/arch/mips/mm/cex-sb1.S | |||
@@ -34,8 +34,6 @@ | |||
34 | * is changed. | 34 | * is changed. |
35 | */ | 35 | */ |
36 | 36 | ||
37 | __INIT | ||
38 | |||
39 | .set mips64 | 37 | .set mips64 |
40 | .set noreorder | 38 | .set noreorder |
41 | .set noat | 39 | .set noat |
@@ -51,6 +49,8 @@ | |||
51 | * (0x170-0x17f) are used to preserve k0, k1, and ra. | 49 | * (0x170-0x17f) are used to preserve k0, k1, and ra. |
52 | */ | 50 | */ |
53 | 51 | ||
52 | __CPUINIT | ||
53 | |||
54 | LEAF(except_vec2_sb1) | 54 | LEAF(except_vec2_sb1) |
55 | /* | 55 | /* |
56 | * If this error is recoverable, we need to exit the handler | 56 | * If this error is recoverable, we need to exit the handler |
diff --git a/arch/mips/mm/pg-r4k.c b/arch/mips/mm/pg-r4k.c index 9185fbf37c0d..455dedb5b39e 100644 --- a/arch/mips/mm/pg-r4k.c +++ b/arch/mips/mm/pg-r4k.c | |||
@@ -66,21 +66,21 @@ EXPORT_SYMBOL(copy_page); | |||
66 | * with 64-bit kernels. The prefetch offsets have been experimentally tuned | 66 | * with 64-bit kernels. The prefetch offsets have been experimentally tuned |
67 | * an Origin 200. | 67 | * an Origin 200. |
68 | */ | 68 | */ |
69 | static int pref_offset_clear __initdata = 512; | 69 | static int pref_offset_clear __cpuinitdata = 512; |
70 | static int pref_offset_copy __initdata = 256; | 70 | static int pref_offset_copy __cpuinitdata = 256; |
71 | 71 | ||
72 | static unsigned int pref_src_mode __initdata; | 72 | static unsigned int pref_src_mode __cpuinitdata; |
73 | static unsigned int pref_dst_mode __initdata; | 73 | static unsigned int pref_dst_mode __cpuinitdata; |
74 | 74 | ||
75 | static int load_offset __initdata; | 75 | static int load_offset __cpuinitdata; |
76 | static int store_offset __initdata; | 76 | static int store_offset __cpuinitdata; |
77 | 77 | ||
78 | static unsigned int __initdata *dest, *epc; | 78 | static unsigned int __cpuinitdata *dest, *epc; |
79 | 79 | ||
80 | static unsigned int instruction_pending; | 80 | static unsigned int instruction_pending; |
81 | static union mips_instruction delayed_mi; | 81 | static union mips_instruction delayed_mi; |
82 | 82 | ||
83 | static void __init emit_instruction(union mips_instruction mi) | 83 | static void __cpuinit emit_instruction(union mips_instruction mi) |
84 | { | 84 | { |
85 | if (instruction_pending) | 85 | if (instruction_pending) |
86 | *epc++ = delayed_mi.word; | 86 | *epc++ = delayed_mi.word; |
@@ -222,7 +222,7 @@ static inline void build_cdex_p(void) | |||
222 | emit_instruction(mi); | 222 | emit_instruction(mi); |
223 | } | 223 | } |
224 | 224 | ||
225 | static void __init __build_store_reg(int reg) | 225 | static void __cpuinit __build_store_reg(int reg) |
226 | { | 226 | { |
227 | union mips_instruction mi; | 227 | union mips_instruction mi; |
228 | unsigned int width; | 228 | unsigned int width; |
@@ -339,7 +339,7 @@ static inline void build_jr_ra(void) | |||
339 | flush_delay_slot_or_nop(); | 339 | flush_delay_slot_or_nop(); |
340 | } | 340 | } |
341 | 341 | ||
342 | void __init build_clear_page(void) | 342 | void __cpuinit build_clear_page(void) |
343 | { | 343 | { |
344 | unsigned int loop_start; | 344 | unsigned int loop_start; |
345 | unsigned long off; | 345 | unsigned long off; |
@@ -442,7 +442,7 @@ dest = label(); | |||
442 | pr_debug("\t.set pop\n"); | 442 | pr_debug("\t.set pop\n"); |
443 | } | 443 | } |
444 | 444 | ||
445 | void __init build_copy_page(void) | 445 | void __cpuinit build_copy_page(void) |
446 | { | 446 | { |
447 | unsigned int loop_start; | 447 | unsigned int loop_start; |
448 | unsigned long off; | 448 | unsigned long off; |
diff --git a/arch/mips/mm/pg-sb1.c b/arch/mips/mm/pg-sb1.c index 89925ec57d6a..49e289d05414 100644 --- a/arch/mips/mm/pg-sb1.c +++ b/arch/mips/mm/pg-sb1.c | |||
@@ -293,10 +293,10 @@ void copy_page(void *to, void *from) | |||
293 | EXPORT_SYMBOL(clear_page); | 293 | EXPORT_SYMBOL(clear_page); |
294 | EXPORT_SYMBOL(copy_page); | 294 | EXPORT_SYMBOL(copy_page); |
295 | 295 | ||
296 | void __init build_clear_page(void) | 296 | void __cpuinit build_clear_page(void) |
297 | { | 297 | { |
298 | } | 298 | } |
299 | 299 | ||
300 | void __init build_copy_page(void) | 300 | void __cpuinit build_copy_page(void) |
301 | { | 301 | { |
302 | } | 302 | } |
diff --git a/arch/mips/mm/sc-ip22.c b/arch/mips/mm/sc-ip22.c index d236cf8b7374..1f602a110e10 100644 --- a/arch/mips/mm/sc-ip22.c +++ b/arch/mips/mm/sc-ip22.c | |||
@@ -168,7 +168,7 @@ struct bcache_ops indy_sc_ops = { | |||
168 | .bc_inv = indy_sc_wback_invalidate | 168 | .bc_inv = indy_sc_wback_invalidate |
169 | }; | 169 | }; |
170 | 170 | ||
171 | void __init indy_sc_init(void) | 171 | void __cpuinit indy_sc_init(void) |
172 | { | 172 | { |
173 | if (indy_sc_probe()) { | 173 | if (indy_sc_probe()) { |
174 | indy_sc_enable(); | 174 | indy_sc_enable(); |
diff --git a/arch/mips/mm/sc-mips.c b/arch/mips/mm/sc-mips.c index c13170bc675c..b55c2d1b998f 100644 --- a/arch/mips/mm/sc-mips.c +++ b/arch/mips/mm/sc-mips.c | |||
@@ -100,7 +100,7 @@ static inline int __init mips_sc_probe(void) | |||
100 | return 1; | 100 | return 1; |
101 | } | 101 | } |
102 | 102 | ||
103 | int __init mips_sc_init(void) | 103 | int __cpuinit mips_sc_init(void) |
104 | { | 104 | { |
105 | int found = mips_sc_probe(); | 105 | int found = mips_sc_probe(); |
106 | if (found) { | 106 | if (found) { |
@@ -109,4 +109,3 @@ int __init mips_sc_init(void) | |||
109 | } | 109 | } |
110 | return found; | 110 | return found; |
111 | } | 111 | } |
112 | |||
diff --git a/arch/mips/mm/sc-r5k.c b/arch/mips/mm/sc-r5k.c index d35b6c1103a3..f330d38e5575 100644 --- a/arch/mips/mm/sc-r5k.c +++ b/arch/mips/mm/sc-r5k.c | |||
@@ -99,7 +99,7 @@ static struct bcache_ops r5k_sc_ops = { | |||
99 | .bc_inv = r5k_dma_cache_inv_sc | 99 | .bc_inv = r5k_dma_cache_inv_sc |
100 | }; | 100 | }; |
101 | 101 | ||
102 | void __init r5k_sc_init(void) | 102 | void __cpuinit r5k_sc_init(void) |
103 | { | 103 | { |
104 | if (r5k_sc_probe()) { | 104 | if (r5k_sc_probe()) { |
105 | r5k_sc_enable(); | 105 | r5k_sc_enable(); |
diff --git a/arch/mips/mm/sc-rm7k.c b/arch/mips/mm/sc-rm7k.c index 31ec73052423..fc227f3b1199 100644 --- a/arch/mips/mm/sc-rm7k.c +++ b/arch/mips/mm/sc-rm7k.c | |||
@@ -128,7 +128,7 @@ struct bcache_ops rm7k_sc_ops = { | |||
128 | .bc_inv = rm7k_sc_inv | 128 | .bc_inv = rm7k_sc_inv |
129 | }; | 129 | }; |
130 | 130 | ||
131 | void __init rm7k_sc_init(void) | 131 | void __cpuinit rm7k_sc_init(void) |
132 | { | 132 | { |
133 | struct cpuinfo_mips *c = ¤t_cpu_data; | 133 | struct cpuinfo_mips *c = ¤t_cpu_data; |
134 | unsigned int config = read_c0_config(); | 134 | unsigned int config = read_c0_config(); |
diff --git a/arch/mips/mm/tlb-r3k.c b/arch/mips/mm/tlb-r3k.c index 7948e9a5e372..a782549ac80e 100644 --- a/arch/mips/mm/tlb-r3k.c +++ b/arch/mips/mm/tlb-r3k.c | |||
@@ -281,7 +281,7 @@ void __init add_wired_entry(unsigned long entrylo0, unsigned long entrylo1, | |||
281 | } | 281 | } |
282 | } | 282 | } |
283 | 283 | ||
284 | void __init tlb_init(void) | 284 | void __cpuinit tlb_init(void) |
285 | { | 285 | { |
286 | local_flush_tlb_all(); | 286 | local_flush_tlb_all(); |
287 | 287 | ||
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c index 74ae0348cc92..63065d6e8063 100644 --- a/arch/mips/mm/tlb-r4k.c +++ b/arch/mips/mm/tlb-r4k.c | |||
@@ -388,7 +388,7 @@ void __init add_wired_entry(unsigned long entrylo0, unsigned long entrylo1, | |||
388 | * lifetime of the system | 388 | * lifetime of the system |
389 | */ | 389 | */ |
390 | 390 | ||
391 | static int temp_tlb_entry __initdata; | 391 | static int temp_tlb_entry __cpuinitdata; |
392 | 392 | ||
393 | __init int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1, | 393 | __init int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1, |
394 | unsigned long entryhi, unsigned long pagemask) | 394 | unsigned long entryhi, unsigned long pagemask) |
@@ -427,7 +427,7 @@ out: | |||
427 | return ret; | 427 | return ret; |
428 | } | 428 | } |
429 | 429 | ||
430 | static void __init probe_tlb(unsigned long config) | 430 | static void __cpuinit probe_tlb(unsigned long config) |
431 | { | 431 | { |
432 | struct cpuinfo_mips *c = ¤t_cpu_data; | 432 | struct cpuinfo_mips *c = ¤t_cpu_data; |
433 | unsigned int reg; | 433 | unsigned int reg; |
@@ -455,7 +455,7 @@ static void __init probe_tlb(unsigned long config) | |||
455 | c->tlbsize = ((reg >> 25) & 0x3f) + 1; | 455 | c->tlbsize = ((reg >> 25) & 0x3f) + 1; |
456 | } | 456 | } |
457 | 457 | ||
458 | static int __initdata ntlb = 0; | 458 | static int __cpuinitdata ntlb = 0; |
459 | static int __init set_ntlb(char *str) | 459 | static int __init set_ntlb(char *str) |
460 | { | 460 | { |
461 | get_option(&str, &ntlb); | 461 | get_option(&str, &ntlb); |
@@ -464,7 +464,7 @@ static int __init set_ntlb(char *str) | |||
464 | 464 | ||
465 | __setup("ntlb=", set_ntlb); | 465 | __setup("ntlb=", set_ntlb); |
466 | 466 | ||
467 | void __init tlb_init(void) | 467 | void __cpuinit tlb_init(void) |
468 | { | 468 | { |
469 | unsigned int config = read_c0_config(); | 469 | unsigned int config = read_c0_config(); |
470 | 470 | ||
@@ -473,7 +473,7 @@ void __init tlb_init(void) | |||
473 | * - On R4600 1.7 the tlbp never hits for pages smaller than | 473 | * - On R4600 1.7 the tlbp never hits for pages smaller than |
474 | * the value in the c0_pagemask register. | 474 | * the value in the c0_pagemask register. |
475 | * - The entire mm handling assumes the c0_pagemask register to | 475 | * - The entire mm handling assumes the c0_pagemask register to |
476 | * be set for 4kb pages. | 476 | * be set to fixed-size pages. |
477 | */ | 477 | */ |
478 | probe_tlb(config); | 478 | probe_tlb(config); |
479 | write_c0_pagemask(PM_DEFAULT_MASK); | 479 | write_c0_pagemask(PM_DEFAULT_MASK); |
diff --git a/arch/mips/mm/tlb-r8k.c b/arch/mips/mm/tlb-r8k.c index bd8409d8ff62..4f01a3be215c 100644 --- a/arch/mips/mm/tlb-r8k.c +++ b/arch/mips/mm/tlb-r8k.c | |||
@@ -214,14 +214,14 @@ void __update_tlb(struct vm_area_struct * vma, unsigned long address, pte_t pte) | |||
214 | local_irq_restore(flags); | 214 | local_irq_restore(flags); |
215 | } | 215 | } |
216 | 216 | ||
217 | static void __init probe_tlb(unsigned long config) | 217 | static void __cpuinit probe_tlb(unsigned long config) |
218 | { | 218 | { |
219 | struct cpuinfo_mips *c = ¤t_cpu_data; | 219 | struct cpuinfo_mips *c = ¤t_cpu_data; |
220 | 220 | ||
221 | c->tlbsize = 3 * 128; /* 3 sets each 128 entries */ | 221 | c->tlbsize = 3 * 128; /* 3 sets each 128 entries */ |
222 | } | 222 | } |
223 | 223 | ||
224 | void __init tlb_init(void) | 224 | void __cpuinit tlb_init(void) |
225 | { | 225 | { |
226 | unsigned int config = read_c0_config(); | 226 | unsigned int config = read_c0_config(); |
227 | unsigned long status; | 227 | unsigned long status; |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 218a6cc415e8..3a93d4ce2703 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
@@ -60,7 +60,7 @@ static inline int __maybe_unused r10000_llsc_war(void) | |||
60 | * why; it's not an issue caused by the core RTL. | 60 | * why; it's not an issue caused by the core RTL. |
61 | * | 61 | * |
62 | */ | 62 | */ |
63 | static int __init m4kc_tlbp_war(void) | 63 | static int __cpuinit m4kc_tlbp_war(void) |
64 | { | 64 | { |
65 | return (current_cpu_data.processor_id & 0xffff00) == | 65 | return (current_cpu_data.processor_id & 0xffff00) == |
66 | (PRID_COMP_MIPS | PRID_IMP_4KC); | 66 | (PRID_COMP_MIPS | PRID_IMP_4KC); |
@@ -144,16 +144,16 @@ static inline void dump_handler(const u32 *handler, int count) | |||
144 | * We deliberately chose a buffer size of 128, so we won't scribble | 144 | * We deliberately chose a buffer size of 128, so we won't scribble |
145 | * over anything important on overflow before we panic. | 145 | * over anything important on overflow before we panic. |
146 | */ | 146 | */ |
147 | static u32 tlb_handler[128] __initdata; | 147 | static u32 tlb_handler[128] __cpuinitdata; |
148 | 148 | ||
149 | /* simply assume worst case size for labels and relocs */ | 149 | /* simply assume worst case size for labels and relocs */ |
150 | static struct uasm_label labels[128] __initdata; | 150 | static struct uasm_label labels[128] __cpuinitdata; |
151 | static struct uasm_reloc relocs[128] __initdata; | 151 | static struct uasm_reloc relocs[128] __cpuinitdata; |
152 | 152 | ||
153 | /* | 153 | /* |
154 | * The R3000 TLB handler is simple. | 154 | * The R3000 TLB handler is simple. |
155 | */ | 155 | */ |
156 | static void __init build_r3000_tlb_refill_handler(void) | 156 | static void __cpuinit build_r3000_tlb_refill_handler(void) |
157 | { | 157 | { |
158 | long pgdc = (long)pgd_current; | 158 | long pgdc = (long)pgd_current; |
159 | u32 *p; | 159 | u32 *p; |
@@ -197,7 +197,7 @@ static void __init build_r3000_tlb_refill_handler(void) | |||
197 | * other one.To keep things simple, we first assume linear space, | 197 | * other one.To keep things simple, we first assume linear space, |
198 | * then we relocate it to the final handler layout as needed. | 198 | * then we relocate it to the final handler layout as needed. |
199 | */ | 199 | */ |
200 | static u32 final_handler[64] __initdata; | 200 | static u32 final_handler[64] __cpuinitdata; |
201 | 201 | ||
202 | /* | 202 | /* |
203 | * Hazards | 203 | * Hazards |
@@ -221,7 +221,7 @@ static u32 final_handler[64] __initdata; | |||
221 | * | 221 | * |
222 | * As if we MIPS hackers wouldn't know how to nop pipelines happy ... | 222 | * As if we MIPS hackers wouldn't know how to nop pipelines happy ... |
223 | */ | 223 | */ |
224 | static void __init __maybe_unused build_tlb_probe_entry(u32 **p) | 224 | static void __cpuinit __maybe_unused build_tlb_probe_entry(u32 **p) |
225 | { | 225 | { |
226 | switch (current_cpu_type()) { | 226 | switch (current_cpu_type()) { |
227 | /* Found by experiment: R4600 v2.0 needs this, too. */ | 227 | /* Found by experiment: R4600 v2.0 needs this, too. */ |
@@ -245,7 +245,7 @@ static void __init __maybe_unused build_tlb_probe_entry(u32 **p) | |||
245 | */ | 245 | */ |
246 | enum tlb_write_entry { tlb_random, tlb_indexed }; | 246 | enum tlb_write_entry { tlb_random, tlb_indexed }; |
247 | 247 | ||
248 | static void __init build_tlb_write_entry(u32 **p, struct uasm_label **l, | 248 | static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l, |
249 | struct uasm_reloc **r, | 249 | struct uasm_reloc **r, |
250 | enum tlb_write_entry wmode) | 250 | enum tlb_write_entry wmode) |
251 | { | 251 | { |
@@ -389,7 +389,7 @@ static void __init build_tlb_write_entry(u32 **p, struct uasm_label **l, | |||
389 | * TMP and PTR are scratch. | 389 | * TMP and PTR are scratch. |
390 | * TMP will be clobbered, PTR will hold the pmd entry. | 390 | * TMP will be clobbered, PTR will hold the pmd entry. |
391 | */ | 391 | */ |
392 | static void __init | 392 | static void __cpuinit |
393 | build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | 393 | build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, |
394 | unsigned int tmp, unsigned int ptr) | 394 | unsigned int tmp, unsigned int ptr) |
395 | { | 395 | { |
@@ -450,7 +450,7 @@ build_get_pmde64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
450 | * BVADDR is the faulting address, PTR is scratch. | 450 | * BVADDR is the faulting address, PTR is scratch. |
451 | * PTR will hold the pgd for vmalloc. | 451 | * PTR will hold the pgd for vmalloc. |
452 | */ | 452 | */ |
453 | static void __init | 453 | static void __cpuinit |
454 | build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | 454 | build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, |
455 | unsigned int bvaddr, unsigned int ptr) | 455 | unsigned int bvaddr, unsigned int ptr) |
456 | { | 456 | { |
@@ -522,7 +522,7 @@ build_get_pgd_vmalloc64(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
522 | * TMP and PTR are scratch. | 522 | * TMP and PTR are scratch. |
523 | * TMP will be clobbered, PTR will hold the pgd entry. | 523 | * TMP will be clobbered, PTR will hold the pgd entry. |
524 | */ | 524 | */ |
525 | static void __init __maybe_unused | 525 | static void __cpuinit __maybe_unused |
526 | build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr) | 526 | build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr) |
527 | { | 527 | { |
528 | long pgdc = (long)pgd_current; | 528 | long pgdc = (long)pgd_current; |
@@ -557,7 +557,7 @@ build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr) | |||
557 | 557 | ||
558 | #endif /* !CONFIG_64BIT */ | 558 | #endif /* !CONFIG_64BIT */ |
559 | 559 | ||
560 | static void __init build_adjust_context(u32 **p, unsigned int ctx) | 560 | static void __cpuinit build_adjust_context(u32 **p, unsigned int ctx) |
561 | { | 561 | { |
562 | unsigned int shift = 4 - (PTE_T_LOG2 + 1) + PAGE_SHIFT - 12; | 562 | unsigned int shift = 4 - (PTE_T_LOG2 + 1) + PAGE_SHIFT - 12; |
563 | unsigned int mask = (PTRS_PER_PTE / 2 - 1) << (PTE_T_LOG2 + 1); | 563 | unsigned int mask = (PTRS_PER_PTE / 2 - 1) << (PTE_T_LOG2 + 1); |
@@ -583,7 +583,7 @@ static void __init build_adjust_context(u32 **p, unsigned int ctx) | |||
583 | uasm_i_andi(p, ctx, ctx, mask); | 583 | uasm_i_andi(p, ctx, ctx, mask); |
584 | } | 584 | } |
585 | 585 | ||
586 | static void __init build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr) | 586 | static void __cpuinit build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr) |
587 | { | 587 | { |
588 | /* | 588 | /* |
589 | * Bug workaround for the Nevada. It seems as if under certain | 589 | * Bug workaround for the Nevada. It seems as if under certain |
@@ -608,7 +608,7 @@ static void __init build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr) | |||
608 | UASM_i_ADDU(p, ptr, ptr, tmp); /* add in offset */ | 608 | UASM_i_ADDU(p, ptr, ptr, tmp); /* add in offset */ |
609 | } | 609 | } |
610 | 610 | ||
611 | static void __init build_update_entries(u32 **p, unsigned int tmp, | 611 | static void __cpuinit build_update_entries(u32 **p, unsigned int tmp, |
612 | unsigned int ptep) | 612 | unsigned int ptep) |
613 | { | 613 | { |
614 | /* | 614 | /* |
@@ -651,7 +651,7 @@ static void __init build_update_entries(u32 **p, unsigned int tmp, | |||
651 | #endif | 651 | #endif |
652 | } | 652 | } |
653 | 653 | ||
654 | static void __init build_r4000_tlb_refill_handler(void) | 654 | static void __cpuinit build_r4000_tlb_refill_handler(void) |
655 | { | 655 | { |
656 | u32 *p = tlb_handler; | 656 | u32 *p = tlb_handler; |
657 | struct uasm_label *l = labels; | 657 | struct uasm_label *l = labels; |
@@ -783,7 +783,7 @@ u32 handle_tlbl[FASTPATH_SIZE] __cacheline_aligned; | |||
783 | u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned; | 783 | u32 handle_tlbs[FASTPATH_SIZE] __cacheline_aligned; |
784 | u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned; | 784 | u32 handle_tlbm[FASTPATH_SIZE] __cacheline_aligned; |
785 | 785 | ||
786 | static void __init | 786 | static void __cpuinit |
787 | iPTE_LW(u32 **p, struct uasm_label **l, unsigned int pte, unsigned int ptr) | 787 | iPTE_LW(u32 **p, struct uasm_label **l, unsigned int pte, unsigned int ptr) |
788 | { | 788 | { |
789 | #ifdef CONFIG_SMP | 789 | #ifdef CONFIG_SMP |
@@ -803,7 +803,7 @@ iPTE_LW(u32 **p, struct uasm_label **l, unsigned int pte, unsigned int ptr) | |||
803 | #endif | 803 | #endif |
804 | } | 804 | } |
805 | 805 | ||
806 | static void __init | 806 | static void __cpuinit |
807 | iPTE_SW(u32 **p, struct uasm_reloc **r, unsigned int pte, unsigned int ptr, | 807 | iPTE_SW(u32 **p, struct uasm_reloc **r, unsigned int pte, unsigned int ptr, |
808 | unsigned int mode) | 808 | unsigned int mode) |
809 | { | 809 | { |
@@ -863,7 +863,7 @@ iPTE_SW(u32 **p, struct uasm_reloc **r, unsigned int pte, unsigned int ptr, | |||
863 | * the page table where this PTE is located, PTE will be re-loaded | 863 | * the page table where this PTE is located, PTE will be re-loaded |
864 | * with it's original value. | 864 | * with it's original value. |
865 | */ | 865 | */ |
866 | static void __init | 866 | static void __cpuinit |
867 | build_pte_present(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | 867 | build_pte_present(u32 **p, struct uasm_label **l, struct uasm_reloc **r, |
868 | unsigned int pte, unsigned int ptr, enum label_id lid) | 868 | unsigned int pte, unsigned int ptr, enum label_id lid) |
869 | { | 869 | { |
@@ -874,7 +874,7 @@ build_pte_present(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
874 | } | 874 | } |
875 | 875 | ||
876 | /* Make PTE valid, store result in PTR. */ | 876 | /* Make PTE valid, store result in PTR. */ |
877 | static void __init | 877 | static void __cpuinit |
878 | build_make_valid(u32 **p, struct uasm_reloc **r, unsigned int pte, | 878 | build_make_valid(u32 **p, struct uasm_reloc **r, unsigned int pte, |
879 | unsigned int ptr) | 879 | unsigned int ptr) |
880 | { | 880 | { |
@@ -887,7 +887,7 @@ build_make_valid(u32 **p, struct uasm_reloc **r, unsigned int pte, | |||
887 | * Check if PTE can be written to, if not branch to LABEL. Regardless | 887 | * Check if PTE can be written to, if not branch to LABEL. Regardless |
888 | * restore PTE with value from PTR when done. | 888 | * restore PTE with value from PTR when done. |
889 | */ | 889 | */ |
890 | static void __init | 890 | static void __cpuinit |
891 | build_pte_writable(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | 891 | build_pte_writable(u32 **p, struct uasm_label **l, struct uasm_reloc **r, |
892 | unsigned int pte, unsigned int ptr, enum label_id lid) | 892 | unsigned int pte, unsigned int ptr, enum label_id lid) |
893 | { | 893 | { |
@@ -900,7 +900,7 @@ build_pte_writable(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
900 | /* Make PTE writable, update software status bits as well, then store | 900 | /* Make PTE writable, update software status bits as well, then store |
901 | * at PTR. | 901 | * at PTR. |
902 | */ | 902 | */ |
903 | static void __init | 903 | static void __cpuinit |
904 | build_make_write(u32 **p, struct uasm_reloc **r, unsigned int pte, | 904 | build_make_write(u32 **p, struct uasm_reloc **r, unsigned int pte, |
905 | unsigned int ptr) | 905 | unsigned int ptr) |
906 | { | 906 | { |
@@ -914,7 +914,7 @@ build_make_write(u32 **p, struct uasm_reloc **r, unsigned int pte, | |||
914 | * Check if PTE can be modified, if not branch to LABEL. Regardless | 914 | * Check if PTE can be modified, if not branch to LABEL. Regardless |
915 | * restore PTE with value from PTR when done. | 915 | * restore PTE with value from PTR when done. |
916 | */ | 916 | */ |
917 | static void __init | 917 | static void __cpuinit |
918 | build_pte_modifiable(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | 918 | build_pte_modifiable(u32 **p, struct uasm_label **l, struct uasm_reloc **r, |
919 | unsigned int pte, unsigned int ptr, enum label_id lid) | 919 | unsigned int pte, unsigned int ptr, enum label_id lid) |
920 | { | 920 | { |
@@ -931,7 +931,7 @@ build_pte_modifiable(u32 **p, struct uasm_label **l, struct uasm_reloc **r, | |||
931 | * This places the pte into ENTRYLO0 and writes it with tlbwi. | 931 | * This places the pte into ENTRYLO0 and writes it with tlbwi. |
932 | * Then it returns. | 932 | * Then it returns. |
933 | */ | 933 | */ |
934 | static void __init | 934 | static void __cpuinit |
935 | build_r3000_pte_reload_tlbwi(u32 **p, unsigned int pte, unsigned int tmp) | 935 | build_r3000_pte_reload_tlbwi(u32 **p, unsigned int pte, unsigned int tmp) |
936 | { | 936 | { |
937 | uasm_i_mtc0(p, pte, C0_ENTRYLO0); /* cp0 delay */ | 937 | uasm_i_mtc0(p, pte, C0_ENTRYLO0); /* cp0 delay */ |
@@ -947,7 +947,7 @@ build_r3000_pte_reload_tlbwi(u32 **p, unsigned int pte, unsigned int tmp) | |||
947 | * may have the probe fail bit set as a result of a trap on a | 947 | * may have the probe fail bit set as a result of a trap on a |
948 | * kseg2 access, i.e. without refill. Then it returns. | 948 | * kseg2 access, i.e. without refill. Then it returns. |
949 | */ | 949 | */ |
950 | static void __init | 950 | static void __cpuinit |
951 | build_r3000_tlb_reload_write(u32 **p, struct uasm_label **l, | 951 | build_r3000_tlb_reload_write(u32 **p, struct uasm_label **l, |
952 | struct uasm_reloc **r, unsigned int pte, | 952 | struct uasm_reloc **r, unsigned int pte, |
953 | unsigned int tmp) | 953 | unsigned int tmp) |
@@ -965,7 +965,7 @@ build_r3000_tlb_reload_write(u32 **p, struct uasm_label **l, | |||
965 | uasm_i_rfe(p); /* branch delay */ | 965 | uasm_i_rfe(p); /* branch delay */ |
966 | } | 966 | } |
967 | 967 | ||
968 | static void __init | 968 | static void __cpuinit |
969 | build_r3000_tlbchange_handler_head(u32 **p, unsigned int pte, | 969 | build_r3000_tlbchange_handler_head(u32 **p, unsigned int pte, |
970 | unsigned int ptr) | 970 | unsigned int ptr) |
971 | { | 971 | { |
@@ -985,7 +985,7 @@ build_r3000_tlbchange_handler_head(u32 **p, unsigned int pte, | |||
985 | uasm_i_tlbp(p); /* load delay */ | 985 | uasm_i_tlbp(p); /* load delay */ |
986 | } | 986 | } |
987 | 987 | ||
988 | static void __init build_r3000_tlb_load_handler(void) | 988 | static void __cpuinit build_r3000_tlb_load_handler(void) |
989 | { | 989 | { |
990 | u32 *p = handle_tlbl; | 990 | u32 *p = handle_tlbl; |
991 | struct uasm_label *l = labels; | 991 | struct uasm_label *l = labels; |
@@ -1015,7 +1015,7 @@ static void __init build_r3000_tlb_load_handler(void) | |||
1015 | dump_handler(handle_tlbl, ARRAY_SIZE(handle_tlbl)); | 1015 | dump_handler(handle_tlbl, ARRAY_SIZE(handle_tlbl)); |
1016 | } | 1016 | } |
1017 | 1017 | ||
1018 | static void __init build_r3000_tlb_store_handler(void) | 1018 | static void __cpuinit build_r3000_tlb_store_handler(void) |
1019 | { | 1019 | { |
1020 | u32 *p = handle_tlbs; | 1020 | u32 *p = handle_tlbs; |
1021 | struct uasm_label *l = labels; | 1021 | struct uasm_label *l = labels; |
@@ -1045,7 +1045,7 @@ static void __init build_r3000_tlb_store_handler(void) | |||
1045 | dump_handler(handle_tlbs, ARRAY_SIZE(handle_tlbs)); | 1045 | dump_handler(handle_tlbs, ARRAY_SIZE(handle_tlbs)); |
1046 | } | 1046 | } |
1047 | 1047 | ||
1048 | static void __init build_r3000_tlb_modify_handler(void) | 1048 | static void __cpuinit build_r3000_tlb_modify_handler(void) |
1049 | { | 1049 | { |
1050 | u32 *p = handle_tlbm; | 1050 | u32 *p = handle_tlbm; |
1051 | struct uasm_label *l = labels; | 1051 | struct uasm_label *l = labels; |
@@ -1078,7 +1078,7 @@ static void __init build_r3000_tlb_modify_handler(void) | |||
1078 | /* | 1078 | /* |
1079 | * R4000 style TLB load/store/modify handlers. | 1079 | * R4000 style TLB load/store/modify handlers. |
1080 | */ | 1080 | */ |
1081 | static void __init | 1081 | static void __cpuinit |
1082 | build_r4000_tlbchange_handler_head(u32 **p, struct uasm_label **l, | 1082 | build_r4000_tlbchange_handler_head(u32 **p, struct uasm_label **l, |
1083 | struct uasm_reloc **r, unsigned int pte, | 1083 | struct uasm_reloc **r, unsigned int pte, |
1084 | unsigned int ptr) | 1084 | unsigned int ptr) |
@@ -1103,7 +1103,7 @@ build_r4000_tlbchange_handler_head(u32 **p, struct uasm_label **l, | |||
1103 | build_tlb_probe_entry(p); | 1103 | build_tlb_probe_entry(p); |
1104 | } | 1104 | } |
1105 | 1105 | ||
1106 | static void __init | 1106 | static void __cpuinit |
1107 | build_r4000_tlbchange_handler_tail(u32 **p, struct uasm_label **l, | 1107 | build_r4000_tlbchange_handler_tail(u32 **p, struct uasm_label **l, |
1108 | struct uasm_reloc **r, unsigned int tmp, | 1108 | struct uasm_reloc **r, unsigned int tmp, |
1109 | unsigned int ptr) | 1109 | unsigned int ptr) |
@@ -1120,7 +1120,7 @@ build_r4000_tlbchange_handler_tail(u32 **p, struct uasm_label **l, | |||
1120 | #endif | 1120 | #endif |
1121 | } | 1121 | } |
1122 | 1122 | ||
1123 | static void __init build_r4000_tlb_load_handler(void) | 1123 | static void __cpuinit build_r4000_tlb_load_handler(void) |
1124 | { | 1124 | { |
1125 | u32 *p = handle_tlbl; | 1125 | u32 *p = handle_tlbl; |
1126 | struct uasm_label *l = labels; | 1126 | struct uasm_label *l = labels; |
@@ -1160,7 +1160,7 @@ static void __init build_r4000_tlb_load_handler(void) | |||
1160 | dump_handler(handle_tlbl, ARRAY_SIZE(handle_tlbl)); | 1160 | dump_handler(handle_tlbl, ARRAY_SIZE(handle_tlbl)); |
1161 | } | 1161 | } |
1162 | 1162 | ||
1163 | static void __init build_r4000_tlb_store_handler(void) | 1163 | static void __cpuinit build_r4000_tlb_store_handler(void) |
1164 | { | 1164 | { |
1165 | u32 *p = handle_tlbs; | 1165 | u32 *p = handle_tlbs; |
1166 | struct uasm_label *l = labels; | 1166 | struct uasm_label *l = labels; |
@@ -1191,7 +1191,7 @@ static void __init build_r4000_tlb_store_handler(void) | |||
1191 | dump_handler(handle_tlbs, ARRAY_SIZE(handle_tlbs)); | 1191 | dump_handler(handle_tlbs, ARRAY_SIZE(handle_tlbs)); |
1192 | } | 1192 | } |
1193 | 1193 | ||
1194 | static void __init build_r4000_tlb_modify_handler(void) | 1194 | static void __cpuinit build_r4000_tlb_modify_handler(void) |
1195 | { | 1195 | { |
1196 | u32 *p = handle_tlbm; | 1196 | u32 *p = handle_tlbm; |
1197 | struct uasm_label *l = labels; | 1197 | struct uasm_label *l = labels; |
@@ -1223,7 +1223,7 @@ static void __init build_r4000_tlb_modify_handler(void) | |||
1223 | dump_handler(handle_tlbm, ARRAY_SIZE(handle_tlbm)); | 1223 | dump_handler(handle_tlbm, ARRAY_SIZE(handle_tlbm)); |
1224 | } | 1224 | } |
1225 | 1225 | ||
1226 | void __init build_tlb_refill_handler(void) | 1226 | void __cpuinit build_tlb_refill_handler(void) |
1227 | { | 1227 | { |
1228 | /* | 1228 | /* |
1229 | * The refill handler is generated per-CPU, multi-node systems | 1229 | * The refill handler is generated per-CPU, multi-node systems |
@@ -1269,7 +1269,7 @@ void __init build_tlb_refill_handler(void) | |||
1269 | } | 1269 | } |
1270 | } | 1270 | } |
1271 | 1271 | ||
1272 | void __init flush_tlb_handlers(void) | 1272 | void __cpuinit flush_tlb_handlers(void) |
1273 | { | 1273 | { |
1274 | flush_icache_range((unsigned long)handle_tlbl, | 1274 | flush_icache_range((unsigned long)handle_tlbl, |
1275 | (unsigned long)handle_tlbl + sizeof(handle_tlbl)); | 1275 | (unsigned long)handle_tlbl + sizeof(handle_tlbl)); |
diff --git a/arch/mips/mm/uasm.c b/arch/mips/mm/uasm.c index e3f74ed5f704..1a6f7704cc89 100644 --- a/arch/mips/mm/uasm.c +++ b/arch/mips/mm/uasm.c | |||
@@ -82,7 +82,7 @@ struct insn { | |||
82 | | (e) << RE_SH \ | 82 | | (e) << RE_SH \ |
83 | | (f) << FUNC_SH) | 83 | | (f) << FUNC_SH) |
84 | 84 | ||
85 | static struct insn insn_table[] __initdata = { | 85 | static struct insn insn_table[] __cpuinitdata = { |
86 | { insn_addiu, M(addiu_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, | 86 | { insn_addiu, M(addiu_op, 0, 0, 0, 0, 0), RS | RT | SIMM }, |
87 | { insn_addu, M(spec_op, 0, 0, 0, 0, addu_op), RS | RT | RD }, | 87 | { insn_addu, M(spec_op, 0, 0, 0, 0, addu_op), RS | RT | RD }, |
88 | { insn_and, M(spec_op, 0, 0, 0, 0, and_op), RS | RT | RD }, | 88 | { insn_and, M(spec_op, 0, 0, 0, 0, and_op), RS | RT | RD }, |
@@ -135,7 +135,7 @@ static struct insn insn_table[] __initdata = { | |||
135 | 135 | ||
136 | #undef M | 136 | #undef M |
137 | 137 | ||
138 | static inline __init u32 build_rs(u32 arg) | 138 | static inline __cpuinit u32 build_rs(u32 arg) |
139 | { | 139 | { |
140 | if (arg & ~RS_MASK) | 140 | if (arg & ~RS_MASK) |
141 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 141 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -143,7 +143,7 @@ static inline __init u32 build_rs(u32 arg) | |||
143 | return (arg & RS_MASK) << RS_SH; | 143 | return (arg & RS_MASK) << RS_SH; |
144 | } | 144 | } |
145 | 145 | ||
146 | static inline __init u32 build_rt(u32 arg) | 146 | static inline __cpuinit u32 build_rt(u32 arg) |
147 | { | 147 | { |
148 | if (arg & ~RT_MASK) | 148 | if (arg & ~RT_MASK) |
149 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 149 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -151,7 +151,7 @@ static inline __init u32 build_rt(u32 arg) | |||
151 | return (arg & RT_MASK) << RT_SH; | 151 | return (arg & RT_MASK) << RT_SH; |
152 | } | 152 | } |
153 | 153 | ||
154 | static inline __init u32 build_rd(u32 arg) | 154 | static inline __cpuinit u32 build_rd(u32 arg) |
155 | { | 155 | { |
156 | if (arg & ~RD_MASK) | 156 | if (arg & ~RD_MASK) |
157 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 157 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -159,7 +159,7 @@ static inline __init u32 build_rd(u32 arg) | |||
159 | return (arg & RD_MASK) << RD_SH; | 159 | return (arg & RD_MASK) << RD_SH; |
160 | } | 160 | } |
161 | 161 | ||
162 | static inline __init u32 build_re(u32 arg) | 162 | static inline __cpuinit u32 build_re(u32 arg) |
163 | { | 163 | { |
164 | if (arg & ~RE_MASK) | 164 | if (arg & ~RE_MASK) |
165 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 165 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -167,7 +167,7 @@ static inline __init u32 build_re(u32 arg) | |||
167 | return (arg & RE_MASK) << RE_SH; | 167 | return (arg & RE_MASK) << RE_SH; |
168 | } | 168 | } |
169 | 169 | ||
170 | static inline __init u32 build_simm(s32 arg) | 170 | static inline __cpuinit u32 build_simm(s32 arg) |
171 | { | 171 | { |
172 | if (arg > 0x7fff || arg < -0x8000) | 172 | if (arg > 0x7fff || arg < -0x8000) |
173 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 173 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -175,7 +175,7 @@ static inline __init u32 build_simm(s32 arg) | |||
175 | return arg & 0xffff; | 175 | return arg & 0xffff; |
176 | } | 176 | } |
177 | 177 | ||
178 | static inline __init u32 build_uimm(u32 arg) | 178 | static inline __cpuinit u32 build_uimm(u32 arg) |
179 | { | 179 | { |
180 | if (arg & ~IMM_MASK) | 180 | if (arg & ~IMM_MASK) |
181 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 181 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -183,7 +183,7 @@ static inline __init u32 build_uimm(u32 arg) | |||
183 | return arg & IMM_MASK; | 183 | return arg & IMM_MASK; |
184 | } | 184 | } |
185 | 185 | ||
186 | static inline __init u32 build_bimm(s32 arg) | 186 | static inline __cpuinit u32 build_bimm(s32 arg) |
187 | { | 187 | { |
188 | if (arg > 0x1ffff || arg < -0x20000) | 188 | if (arg > 0x1ffff || arg < -0x20000) |
189 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 189 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -194,7 +194,7 @@ static inline __init u32 build_bimm(s32 arg) | |||
194 | return ((arg < 0) ? (1 << 15) : 0) | ((arg >> 2) & 0x7fff); | 194 | return ((arg < 0) ? (1 << 15) : 0) | ((arg >> 2) & 0x7fff); |
195 | } | 195 | } |
196 | 196 | ||
197 | static inline __init u32 build_jimm(u32 arg) | 197 | static inline __cpuinit u32 build_jimm(u32 arg) |
198 | { | 198 | { |
199 | if (arg & ~((JIMM_MASK) << 2)) | 199 | if (arg & ~((JIMM_MASK) << 2)) |
200 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 200 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -202,7 +202,7 @@ static inline __init u32 build_jimm(u32 arg) | |||
202 | return (arg >> 2) & JIMM_MASK; | 202 | return (arg >> 2) & JIMM_MASK; |
203 | } | 203 | } |
204 | 204 | ||
205 | static inline __init u32 build_func(u32 arg) | 205 | static inline __cpuinit u32 build_func(u32 arg) |
206 | { | 206 | { |
207 | if (arg & ~FUNC_MASK) | 207 | if (arg & ~FUNC_MASK) |
208 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 208 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -210,7 +210,7 @@ static inline __init u32 build_func(u32 arg) | |||
210 | return arg & FUNC_MASK; | 210 | return arg & FUNC_MASK; |
211 | } | 211 | } |
212 | 212 | ||
213 | static inline __init u32 build_set(u32 arg) | 213 | static inline __cpuinit u32 build_set(u32 arg) |
214 | { | 214 | { |
215 | if (arg & ~SET_MASK) | 215 | if (arg & ~SET_MASK) |
216 | printk(KERN_WARNING "Micro-assembler field overflow\n"); | 216 | printk(KERN_WARNING "Micro-assembler field overflow\n"); |
@@ -222,7 +222,7 @@ static inline __init u32 build_set(u32 arg) | |||
222 | * The order of opcode arguments is implicitly left to right, | 222 | * The order of opcode arguments is implicitly left to right, |
223 | * starting with RS and ending with FUNC or IMM. | 223 | * starting with RS and ending with FUNC or IMM. |
224 | */ | 224 | */ |
225 | static void __init build_insn(u32 **buf, enum opcode opc, ...) | 225 | static void __cpuinit build_insn(u32 **buf, enum opcode opc, ...) |
226 | { | 226 | { |
227 | struct insn *ip = NULL; | 227 | struct insn *ip = NULL; |
228 | unsigned int i; | 228 | unsigned int i; |
@@ -375,14 +375,14 @@ I_u3u1u2(_xor) | |||
375 | I_u2u1u3(_xori) | 375 | I_u2u1u3(_xori) |
376 | 376 | ||
377 | /* Handle labels. */ | 377 | /* Handle labels. */ |
378 | void __init uasm_build_label(struct uasm_label **lab, u32 *addr, int lid) | 378 | void __cpuinit uasm_build_label(struct uasm_label **lab, u32 *addr, int lid) |
379 | { | 379 | { |
380 | (*lab)->addr = addr; | 380 | (*lab)->addr = addr; |
381 | (*lab)->lab = lid; | 381 | (*lab)->lab = lid; |
382 | (*lab)++; | 382 | (*lab)++; |
383 | } | 383 | } |
384 | 384 | ||
385 | int __init uasm_in_compat_space_p(long addr) | 385 | int __cpuinit uasm_in_compat_space_p(long addr) |
386 | { | 386 | { |
387 | /* Is this address in 32bit compat space? */ | 387 | /* Is this address in 32bit compat space? */ |
388 | #ifdef CONFIG_64BIT | 388 | #ifdef CONFIG_64BIT |
@@ -392,7 +392,7 @@ int __init uasm_in_compat_space_p(long addr) | |||
392 | #endif | 392 | #endif |
393 | } | 393 | } |
394 | 394 | ||
395 | int __init uasm_rel_highest(long val) | 395 | int __cpuinit uasm_rel_highest(long val) |
396 | { | 396 | { |
397 | #ifdef CONFIG_64BIT | 397 | #ifdef CONFIG_64BIT |
398 | return ((((val + 0x800080008000L) >> 48) & 0xffff) ^ 0x8000) - 0x8000; | 398 | return ((((val + 0x800080008000L) >> 48) & 0xffff) ^ 0x8000) - 0x8000; |
@@ -401,7 +401,7 @@ int __init uasm_rel_highest(long val) | |||
401 | #endif | 401 | #endif |
402 | } | 402 | } |
403 | 403 | ||
404 | int __init uasm_rel_higher(long val) | 404 | int __cpuinit uasm_rel_higher(long val) |
405 | { | 405 | { |
406 | #ifdef CONFIG_64BIT | 406 | #ifdef CONFIG_64BIT |
407 | return ((((val + 0x80008000L) >> 32) & 0xffff) ^ 0x8000) - 0x8000; | 407 | return ((((val + 0x80008000L) >> 32) & 0xffff) ^ 0x8000) - 0x8000; |
@@ -410,17 +410,17 @@ int __init uasm_rel_higher(long val) | |||
410 | #endif | 410 | #endif |
411 | } | 411 | } |
412 | 412 | ||
413 | int __init uasm_rel_hi(long val) | 413 | int __cpuinit uasm_rel_hi(long val) |
414 | { | 414 | { |
415 | return ((((val + 0x8000L) >> 16) & 0xffff) ^ 0x8000) - 0x8000; | 415 | return ((((val + 0x8000L) >> 16) & 0xffff) ^ 0x8000) - 0x8000; |
416 | } | 416 | } |
417 | 417 | ||
418 | int __init uasm_rel_lo(long val) | 418 | int __cpuinit uasm_rel_lo(long val) |
419 | { | 419 | { |
420 | return ((val & 0xffff) ^ 0x8000) - 0x8000; | 420 | return ((val & 0xffff) ^ 0x8000) - 0x8000; |
421 | } | 421 | } |
422 | 422 | ||
423 | void __init UASM_i_LA_mostly(u32 **buf, unsigned int rs, long addr) | 423 | void __cpuinit UASM_i_LA_mostly(u32 **buf, unsigned int rs, long addr) |
424 | { | 424 | { |
425 | if (!uasm_in_compat_space_p(addr)) { | 425 | if (!uasm_in_compat_space_p(addr)) { |
426 | uasm_i_lui(buf, rs, uasm_rel_highest(addr)); | 426 | uasm_i_lui(buf, rs, uasm_rel_highest(addr)); |
@@ -436,7 +436,7 @@ void __init UASM_i_LA_mostly(u32 **buf, unsigned int rs, long addr) | |||
436 | uasm_i_lui(buf, rs, uasm_rel_hi(addr)); | 436 | uasm_i_lui(buf, rs, uasm_rel_hi(addr)); |
437 | } | 437 | } |
438 | 438 | ||
439 | void __init UASM_i_LA(u32 **buf, unsigned int rs, long addr) | 439 | void __cpuinit UASM_i_LA(u32 **buf, unsigned int rs, long addr) |
440 | { | 440 | { |
441 | UASM_i_LA_mostly(buf, rs, addr); | 441 | UASM_i_LA_mostly(buf, rs, addr); |
442 | if (uasm_rel_lo(addr)) { | 442 | if (uasm_rel_lo(addr)) { |
@@ -448,7 +448,7 @@ void __init UASM_i_LA(u32 **buf, unsigned int rs, long addr) | |||
448 | } | 448 | } |
449 | 449 | ||
450 | /* Handle relocations. */ | 450 | /* Handle relocations. */ |
451 | void __init | 451 | void __cpuinit |
452 | uasm_r_mips_pc16(struct uasm_reloc **rel, u32 *addr, int lid) | 452 | uasm_r_mips_pc16(struct uasm_reloc **rel, u32 *addr, int lid) |
453 | { | 453 | { |
454 | (*rel)->addr = addr; | 454 | (*rel)->addr = addr; |
@@ -457,7 +457,7 @@ uasm_r_mips_pc16(struct uasm_reloc **rel, u32 *addr, int lid) | |||
457 | (*rel)++; | 457 | (*rel)++; |
458 | } | 458 | } |
459 | 459 | ||
460 | static inline void __init | 460 | static inline void __cpuinit |
461 | __resolve_relocs(struct uasm_reloc *rel, struct uasm_label *lab) | 461 | __resolve_relocs(struct uasm_reloc *rel, struct uasm_label *lab) |
462 | { | 462 | { |
463 | long laddr = (long)lab->addr; | 463 | long laddr = (long)lab->addr; |
@@ -474,7 +474,7 @@ __resolve_relocs(struct uasm_reloc *rel, struct uasm_label *lab) | |||
474 | } | 474 | } |
475 | } | 475 | } |
476 | 476 | ||
477 | void __init | 477 | void __cpuinit |
478 | uasm_resolve_relocs(struct uasm_reloc *rel, struct uasm_label *lab) | 478 | uasm_resolve_relocs(struct uasm_reloc *rel, struct uasm_label *lab) |
479 | { | 479 | { |
480 | struct uasm_label *l; | 480 | struct uasm_label *l; |
@@ -485,7 +485,7 @@ uasm_resolve_relocs(struct uasm_reloc *rel, struct uasm_label *lab) | |||
485 | __resolve_relocs(rel, l); | 485 | __resolve_relocs(rel, l); |
486 | } | 486 | } |
487 | 487 | ||
488 | void __init | 488 | void __cpuinit |
489 | uasm_move_relocs(struct uasm_reloc *rel, u32 *first, u32 *end, long off) | 489 | uasm_move_relocs(struct uasm_reloc *rel, u32 *first, u32 *end, long off) |
490 | { | 490 | { |
491 | for (; rel->lab != UASM_LABEL_INVALID; rel++) | 491 | for (; rel->lab != UASM_LABEL_INVALID; rel++) |
@@ -493,7 +493,7 @@ uasm_move_relocs(struct uasm_reloc *rel, u32 *first, u32 *end, long off) | |||
493 | rel->addr += off; | 493 | rel->addr += off; |
494 | } | 494 | } |
495 | 495 | ||
496 | void __init | 496 | void __cpuinit |
497 | uasm_move_labels(struct uasm_label *lab, u32 *first, u32 *end, long off) | 497 | uasm_move_labels(struct uasm_label *lab, u32 *first, u32 *end, long off) |
498 | { | 498 | { |
499 | for (; lab->lab != UASM_LABEL_INVALID; lab++) | 499 | for (; lab->lab != UASM_LABEL_INVALID; lab++) |
@@ -501,7 +501,7 @@ uasm_move_labels(struct uasm_label *lab, u32 *first, u32 *end, long off) | |||
501 | lab->addr += off; | 501 | lab->addr += off; |
502 | } | 502 | } |
503 | 503 | ||
504 | void __init | 504 | void __cpuinit |
505 | uasm_copy_handler(struct uasm_reloc *rel, struct uasm_label *lab, u32 *first, | 505 | uasm_copy_handler(struct uasm_reloc *rel, struct uasm_label *lab, u32 *first, |
506 | u32 *end, u32 *target) | 506 | u32 *end, u32 *target) |
507 | { | 507 | { |
@@ -513,7 +513,7 @@ uasm_copy_handler(struct uasm_reloc *rel, struct uasm_label *lab, u32 *first, | |||
513 | uasm_move_labels(lab, first, end, off); | 513 | uasm_move_labels(lab, first, end, off); |
514 | } | 514 | } |
515 | 515 | ||
516 | int __init uasm_insn_has_bdelay(struct uasm_reloc *rel, u32 *addr) | 516 | int __cpuinit uasm_insn_has_bdelay(struct uasm_reloc *rel, u32 *addr) |
517 | { | 517 | { |
518 | for (; rel->lab != UASM_LABEL_INVALID; rel++) { | 518 | for (; rel->lab != UASM_LABEL_INVALID; rel++) { |
519 | if (rel->addr == addr | 519 | if (rel->addr == addr |
@@ -526,49 +526,49 @@ int __init uasm_insn_has_bdelay(struct uasm_reloc *rel, u32 *addr) | |||
526 | } | 526 | } |
527 | 527 | ||
528 | /* Convenience functions for labeled branches. */ | 528 | /* Convenience functions for labeled branches. */ |
529 | void __init | 529 | void __cpuinit |
530 | uasm_il_bltz(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) | 530 | uasm_il_bltz(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) |
531 | { | 531 | { |
532 | uasm_r_mips_pc16(r, *p, lid); | 532 | uasm_r_mips_pc16(r, *p, lid); |
533 | uasm_i_bltz(p, reg, 0); | 533 | uasm_i_bltz(p, reg, 0); |
534 | } | 534 | } |
535 | 535 | ||
536 | void __init | 536 | void __cpuinit |
537 | uasm_il_b(u32 **p, struct uasm_reloc **r, int lid) | 537 | uasm_il_b(u32 **p, struct uasm_reloc **r, int lid) |
538 | { | 538 | { |
539 | uasm_r_mips_pc16(r, *p, lid); | 539 | uasm_r_mips_pc16(r, *p, lid); |
540 | uasm_i_b(p, 0); | 540 | uasm_i_b(p, 0); |
541 | } | 541 | } |
542 | 542 | ||
543 | void __init | 543 | void __cpuinit |
544 | uasm_il_beqz(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) | 544 | uasm_il_beqz(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) |
545 | { | 545 | { |
546 | uasm_r_mips_pc16(r, *p, lid); | 546 | uasm_r_mips_pc16(r, *p, lid); |
547 | uasm_i_beqz(p, reg, 0); | 547 | uasm_i_beqz(p, reg, 0); |
548 | } | 548 | } |
549 | 549 | ||
550 | void __init | 550 | void __cpuinit |
551 | uasm_il_beqzl(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) | 551 | uasm_il_beqzl(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) |
552 | { | 552 | { |
553 | uasm_r_mips_pc16(r, *p, lid); | 553 | uasm_r_mips_pc16(r, *p, lid); |
554 | uasm_i_beqzl(p, reg, 0); | 554 | uasm_i_beqzl(p, reg, 0); |
555 | } | 555 | } |
556 | 556 | ||
557 | void __init | 557 | void __cpuinit |
558 | uasm_il_bnez(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) | 558 | uasm_il_bnez(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) |
559 | { | 559 | { |
560 | uasm_r_mips_pc16(r, *p, lid); | 560 | uasm_r_mips_pc16(r, *p, lid); |
561 | uasm_i_bnez(p, reg, 0); | 561 | uasm_i_bnez(p, reg, 0); |
562 | } | 562 | } |
563 | 563 | ||
564 | void __init | 564 | void __cpuinit |
565 | uasm_il_bgezl(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) | 565 | uasm_il_bgezl(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) |
566 | { | 566 | { |
567 | uasm_r_mips_pc16(r, *p, lid); | 567 | uasm_r_mips_pc16(r, *p, lid); |
568 | uasm_i_bgezl(p, reg, 0); | 568 | uasm_i_bgezl(p, reg, 0); |
569 | } | 569 | } |
570 | 570 | ||
571 | void __init | 571 | void __cpuinit |
572 | uasm_il_bgez(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) | 572 | uasm_il_bgez(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid) |
573 | { | 573 | { |
574 | uasm_r_mips_pc16(r, *p, lid); | 574 | uasm_r_mips_pc16(r, *p, lid); |
diff --git a/arch/mips/mm/uasm.h b/arch/mips/mm/uasm.h index a10fc1135c76..fe0574f6e77d 100644 --- a/arch/mips/mm/uasm.h +++ b/arch/mips/mm/uasm.h | |||
@@ -11,38 +11,38 @@ | |||
11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
12 | 12 | ||
13 | #define Ip_u1u2u3(op) \ | 13 | #define Ip_u1u2u3(op) \ |
14 | void __init \ | 14 | void __cpuinit \ |
15 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, unsigned int c) | 15 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, unsigned int c) |
16 | 16 | ||
17 | #define Ip_u2u1u3(op) \ | 17 | #define Ip_u2u1u3(op) \ |
18 | void __init \ | 18 | void __cpuinit \ |
19 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, unsigned int c) | 19 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, unsigned int c) |
20 | 20 | ||
21 | #define Ip_u3u1u2(op) \ | 21 | #define Ip_u3u1u2(op) \ |
22 | void __init \ | 22 | void __cpuinit \ |
23 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, unsigned int c) | 23 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, unsigned int c) |
24 | 24 | ||
25 | #define Ip_u1u2s3(op) \ | 25 | #define Ip_u1u2s3(op) \ |
26 | void __init \ | 26 | void __cpuinit \ |
27 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, signed int c) | 27 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, signed int c) |
28 | 28 | ||
29 | #define Ip_u2s3u1(op) \ | 29 | #define Ip_u2s3u1(op) \ |
30 | void __init \ | 30 | void __cpuinit \ |
31 | uasm_i##op(u32 **buf, unsigned int a, signed int b, unsigned int c) | 31 | uasm_i##op(u32 **buf, unsigned int a, signed int b, unsigned int c) |
32 | 32 | ||
33 | #define Ip_u2u1s3(op) \ | 33 | #define Ip_u2u1s3(op) \ |
34 | void __init \ | 34 | void __cpuinit \ |
35 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, signed int c) | 35 | uasm_i##op(u32 **buf, unsigned int a, unsigned int b, signed int c) |
36 | 36 | ||
37 | #define Ip_u1u2(op) \ | 37 | #define Ip_u1u2(op) \ |
38 | void __init uasm_i##op(u32 **buf, unsigned int a, unsigned int b) | 38 | void __cpuinit uasm_i##op(u32 **buf, unsigned int a, unsigned int b) |
39 | 39 | ||
40 | #define Ip_u1s2(op) \ | 40 | #define Ip_u1s2(op) \ |
41 | void __init uasm_i##op(u32 **buf, unsigned int a, signed int b) | 41 | void __cpuinit uasm_i##op(u32 **buf, unsigned int a, signed int b) |
42 | 42 | ||
43 | #define Ip_u1(op) void __init uasm_i##op(u32 **buf, unsigned int a) | 43 | #define Ip_u1(op) void __cpuinit uasm_i##op(u32 **buf, unsigned int a) |
44 | 44 | ||
45 | #define Ip_0(op) void __init uasm_i##op(u32 **buf) | 45 | #define Ip_0(op) void __cpuinit uasm_i##op(u32 **buf) |
46 | 46 | ||
47 | Ip_u2u1s3(_addiu); | 47 | Ip_u2u1s3(_addiu); |
48 | Ip_u3u1u2(_addu); | 48 | Ip_u3u1u2(_addu); |
@@ -98,19 +98,19 @@ struct uasm_label { | |||
98 | int lab; | 98 | int lab; |
99 | }; | 99 | }; |
100 | 100 | ||
101 | void __init uasm_build_label(struct uasm_label **lab, u32 *addr, int lid); | 101 | void __cpuinit uasm_build_label(struct uasm_label **lab, u32 *addr, int lid); |
102 | #ifdef CONFIG_64BIT | 102 | #ifdef CONFIG_64BIT |
103 | int __init uasm_in_compat_space_p(long addr); | 103 | int uasm_in_compat_space_p(long addr); |
104 | int __init uasm_rel_highest(long val); | 104 | int uasm_rel_highest(long val); |
105 | int __init uasm_rel_higher(long val); | 105 | int uasm_rel_higher(long val); |
106 | #endif | 106 | #endif |
107 | int __init uasm_rel_hi(long val); | 107 | int uasm_rel_hi(long val); |
108 | int __init uasm_rel_lo(long val); | 108 | int uasm_rel_lo(long val); |
109 | void __init UASM_i_LA_mostly(u32 **buf, unsigned int rs, long addr); | 109 | void UASM_i_LA_mostly(u32 **buf, unsigned int rs, long addr); |
110 | void __init UASM_i_LA(u32 **buf, unsigned int rs, long addr); | 110 | void UASM_i_LA(u32 **buf, unsigned int rs, long addr); |
111 | 111 | ||
112 | #define UASM_L_LA(lb) \ | 112 | #define UASM_L_LA(lb) \ |
113 | static inline void __init uasm_l##lb(struct uasm_label **lab, u32 *addr) \ | 113 | static inline void __cpuinit uasm_l##lb(struct uasm_label **lab, u32 *addr) \ |
114 | { \ | 114 | { \ |
115 | uasm_build_label(lab, addr, label##lb); \ | 115 | uasm_build_label(lab, addr, label##lb); \ |
116 | } | 116 | } |
@@ -164,29 +164,19 @@ struct uasm_reloc { | |||
164 | /* This is zero so we can use zeroed label arrays. */ | 164 | /* This is zero so we can use zeroed label arrays. */ |
165 | #define UASM_LABEL_INVALID 0 | 165 | #define UASM_LABEL_INVALID 0 |
166 | 166 | ||
167 | void __init uasm_r_mips_pc16(struct uasm_reloc **rel, u32 *addr, int lid); | 167 | void uasm_r_mips_pc16(struct uasm_reloc **rel, u32 *addr, int lid); |
168 | void __init | 168 | void uasm_resolve_relocs(struct uasm_reloc *rel, struct uasm_label *lab); |
169 | uasm_resolve_relocs(struct uasm_reloc *rel, struct uasm_label *lab); | 169 | void uasm_move_relocs(struct uasm_reloc *rel, u32 *first, u32 *end, long off); |
170 | void __init | 170 | void uasm_move_labels(struct uasm_label *lab, u32 *first, u32 *end, long off); |
171 | uasm_move_relocs(struct uasm_reloc *rel, u32 *first, u32 *end, long off); | 171 | void uasm_copy_handler(struct uasm_reloc *rel, struct uasm_label *lab, |
172 | void __init | 172 | u32 *first, u32 *end, u32 *target); |
173 | uasm_move_labels(struct uasm_label *lab, u32 *first, u32 *end, long off); | 173 | int uasm_insn_has_bdelay(struct uasm_reloc *rel, u32 *addr); |
174 | void __init | ||
175 | uasm_copy_handler(struct uasm_reloc *rel, struct uasm_label *lab, u32 *first, | ||
176 | u32 *end, u32 *target); | ||
177 | int __init uasm_insn_has_bdelay(struct uasm_reloc *rel, u32 *addr); | ||
178 | 174 | ||
179 | /* Convenience functions for labeled branches. */ | 175 | /* Convenience functions for labeled branches. */ |
180 | void __init | 176 | void uasm_il_bltz(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); |
181 | uasm_il_bltz(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); | 177 | void uasm_il_b(u32 **p, struct uasm_reloc **r, int lid); |
182 | void __init uasm_il_b(u32 **p, struct uasm_reloc **r, int lid); | 178 | void uasm_il_beqz(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); |
183 | void __init | 179 | void uasm_il_beqzl(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); |
184 | uasm_il_beqz(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); | 180 | void uasm_il_bnez(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); |
185 | void __init | 181 | void uasm_il_bgezl(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); |
186 | uasm_il_beqzl(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); | 182 | void uasm_il_bgez(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); |
187 | void __init | ||
188 | uasm_il_bnez(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); | ||
189 | void __init | ||
190 | uasm_il_bgezl(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); | ||
191 | void __init | ||
192 | uasm_il_bgez(u32 **p, struct uasm_reloc **r, unsigned int reg, int lid); | ||
diff --git a/arch/mips/pci/pci-bcm1480.c b/arch/mips/pci/pci-bcm1480.c index 30ed36125bcd..ab68c4318a30 100644 --- a/arch/mips/pci/pci-bcm1480.c +++ b/arch/mips/pci/pci-bcm1480.c | |||
@@ -249,8 +249,9 @@ static int __init bcm1480_pcibios_init(void) | |||
249 | * XXX ehs: Should this happen in PCI Device mode? | 249 | * XXX ehs: Should this happen in PCI Device mode? |
250 | */ | 250 | */ |
251 | 251 | ||
252 | set_io_port_base((unsigned long) | 252 | bcm1480_controller.io_map_base = (unsigned long) |
253 | ioremap(A_BCM1480_PHYS_PCI_IO_MATCH_BYTES, 65536)); | 253 | ioremap(A_BCM1480_PHYS_PCI_IO_MATCH_BYTES, 65536); |
254 | set_io_port_base(bcm1480_controller.io_map_base); | ||
254 | isa_slot_offset = (unsigned long) | 255 | isa_slot_offset = (unsigned long) |
255 | ioremap(A_BCM1480_PHYS_PCI_MEM_MATCH_BYTES, 1024*1024); | 256 | ioremap(A_BCM1480_PHYS_PCI_MEM_MATCH_BYTES, 1024*1024); |
256 | 257 | ||
diff --git a/arch/mips/pci/pci-ip27.c b/arch/mips/pci/pci-ip27.c index a322543ac34e..bb64828a92fe 100644 --- a/arch/mips/pci/pci-ip27.c +++ b/arch/mips/pci/pci-ip27.c | |||
@@ -40,7 +40,7 @@ int irq_to_slot[MAX_PCI_BUSSES * MAX_DEVICES_PER_PCIBUS]; | |||
40 | 40 | ||
41 | extern struct pci_ops bridge_pci_ops; | 41 | extern struct pci_ops bridge_pci_ops; |
42 | 42 | ||
43 | int __init bridge_probe(nasid_t nasid, int widget_id, int masterwid) | 43 | int __cpuinit bridge_probe(nasid_t nasid, int widget_id, int masterwid) |
44 | { | 44 | { |
45 | unsigned long offset = NODE_OFFSET(nasid); | 45 | unsigned long offset = NODE_OFFSET(nasid); |
46 | struct bridge_controller *bc; | 46 | struct bridge_controller *bc; |
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index f9471d77c096..358ad6210949 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c | |||
@@ -260,7 +260,7 @@ static void pcibios_fixup_device_resources(struct pci_dev *dev, | |||
260 | } | 260 | } |
261 | } | 261 | } |
262 | 262 | ||
263 | void pcibios_fixup_bus(struct pci_bus *bus) | 263 | void __devinit pcibios_fixup_bus(struct pci_bus *bus) |
264 | { | 264 | { |
265 | /* Propagate hose info into the subordinate devices. */ | 265 | /* Propagate hose info into the subordinate devices. */ |
266 | 266 | ||
diff --git a/arch/mips/pmc-sierra/yosemite/smp.c b/arch/mips/pmc-sierra/yosemite/smp.c index 653f3ec61cab..3a7df647ca77 100644 --- a/arch/mips/pmc-sierra/yosemite/smp.c +++ b/arch/mips/pmc-sierra/yosemite/smp.c | |||
@@ -7,10 +7,10 @@ | |||
7 | 7 | ||
8 | #define LAUNCHSTACK_SIZE 256 | 8 | #define LAUNCHSTACK_SIZE 256 |
9 | 9 | ||
10 | static __initdata DEFINE_SPINLOCK(launch_lock); | 10 | static __cpuinitdata DEFINE_SPINLOCK(launch_lock); |
11 | 11 | ||
12 | static unsigned long secondary_sp __initdata; | 12 | static unsigned long secondary_sp __cpuinitdata; |
13 | static unsigned long secondary_gp __initdata; | 13 | static unsigned long secondary_gp __cpuinitdata; |
14 | 14 | ||
15 | static unsigned char launchstack[LAUNCHSTACK_SIZE] __initdata | 15 | static unsigned char launchstack[LAUNCHSTACK_SIZE] __initdata |
16 | __attribute__((aligned(2 * sizeof(long)))); | 16 | __attribute__((aligned(2 * sizeof(long)))); |
diff --git a/arch/mips/sgi-ip27/ip27-init.c b/arch/mips/sgi-ip27/ip27-init.c index a49e7c85f724..7093e7c573a4 100644 --- a/arch/mips/sgi-ip27/ip27-init.c +++ b/arch/mips/sgi-ip27/ip27-init.c | |||
@@ -53,7 +53,7 @@ extern void pcibr_setup(cnodeid_t); | |||
53 | 53 | ||
54 | extern void xtalk_probe_node(cnodeid_t nid); | 54 | extern void xtalk_probe_node(cnodeid_t nid); |
55 | 55 | ||
56 | static void __init per_hub_init(cnodeid_t cnode) | 56 | static void __cpuinit per_hub_init(cnodeid_t cnode) |
57 | { | 57 | { |
58 | struct hub_data *hub = hub_data(cnode); | 58 | struct hub_data *hub = hub_data(cnode); |
59 | nasid_t nasid = COMPACT_TO_NASID_NODEID(cnode); | 59 | nasid_t nasid = COMPACT_TO_NASID_NODEID(cnode); |
diff --git a/arch/mips/sgi-ip27/ip27-timer.c b/arch/mips/sgi-ip27/ip27-timer.c index 08d45369be45..25d3baf0ebc4 100644 --- a/arch/mips/sgi-ip27/ip27-timer.c +++ b/arch/mips/sgi-ip27/ip27-timer.c | |||
@@ -285,7 +285,7 @@ void __cpuinit cpu_time_init(void) | |||
285 | set_c0_status(SRB_TIMOCLK); | 285 | set_c0_status(SRB_TIMOCLK); |
286 | } | 286 | } |
287 | 287 | ||
288 | void __init hub_rtc_init(cnodeid_t cnode) | 288 | void __cpuinit hub_rtc_init(cnodeid_t cnode) |
289 | { | 289 | { |
290 | /* | 290 | /* |
291 | * We only need to initialize the current node. | 291 | * We only need to initialize the current node. |
diff --git a/arch/mips/sgi-ip27/ip27-xtalk.c b/arch/mips/sgi-ip27/ip27-xtalk.c index fc82f34a32ce..6ae64e8dfc40 100644 --- a/arch/mips/sgi-ip27/ip27-xtalk.c +++ b/arch/mips/sgi-ip27/ip27-xtalk.c | |||
@@ -22,7 +22,7 @@ | |||
22 | 22 | ||
23 | extern int bridge_probe(nasid_t nasid, int widget, int masterwid); | 23 | extern int bridge_probe(nasid_t nasid, int widget, int masterwid); |
24 | 24 | ||
25 | static int __init probe_one_port(nasid_t nasid, int widget, int masterwid) | 25 | static int __cpuinit probe_one_port(nasid_t nasid, int widget, int masterwid) |
26 | { | 26 | { |
27 | widgetreg_t widget_id; | 27 | widgetreg_t widget_id; |
28 | xwidget_part_num_t partnum; | 28 | xwidget_part_num_t partnum; |
@@ -46,7 +46,7 @@ static int __init probe_one_port(nasid_t nasid, int widget, int masterwid) | |||
46 | return 0; | 46 | return 0; |
47 | } | 47 | } |
48 | 48 | ||
49 | static int __init xbow_probe(nasid_t nasid) | 49 | static int __cpuinit xbow_probe(nasid_t nasid) |
50 | { | 50 | { |
51 | lboard_t *brd; | 51 | lboard_t *brd; |
52 | klxbow_t *xbow_p; | 52 | klxbow_t *xbow_p; |
@@ -99,7 +99,7 @@ static int __init xbow_probe(nasid_t nasid) | |||
99 | return 0; | 99 | return 0; |
100 | } | 100 | } |
101 | 101 | ||
102 | void __init xtalk_probe_node(cnodeid_t nid) | 102 | void __cpuinit xtalk_probe_node(cnodeid_t nid) |
103 | { | 103 | { |
104 | volatile u64 hubreg; | 104 | volatile u64 hubreg; |
105 | nasid_t nasid; | 105 | nasid_t nasid; |
diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile index e574de4efb36..5ddad7bd60ac 100644 --- a/arch/parisc/Makefile +++ b/arch/parisc/Makefile | |||
@@ -16,6 +16,9 @@ | |||
16 | # Modified for PA-RISC Linux by Paul Lahaie, Alex deVries, | 16 | # Modified for PA-RISC Linux by Paul Lahaie, Alex deVries, |
17 | # Mike Shaver, Helge Deller and Martin K. Petersen | 17 | # Mike Shaver, Helge Deller and Martin K. Petersen |
18 | # | 18 | # |
19 | |||
20 | KBUILD_DEFCONFIG := default_defconfig | ||
21 | |||
19 | NM = sh $(srctree)/arch/parisc/nm | 22 | NM = sh $(srctree)/arch/parisc/nm |
20 | CHECKFLAGS += -D__hppa__=1 | 23 | CHECKFLAGS += -D__hppa__=1 |
21 | 24 | ||
diff --git a/arch/parisc/defconfig b/arch/parisc/configs/default_defconfig index 448a757b06c6..448a757b06c6 100644 --- a/arch/parisc/defconfig +++ b/arch/parisc/configs/default_defconfig | |||
diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 4ab83d56974d..7177a6cd1b7f 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c | |||
@@ -1080,6 +1080,9 @@ void pdc_io_reset_devices(void) | |||
1080 | spin_unlock_irqrestore(&pdc_lock, flags); | 1080 | spin_unlock_irqrestore(&pdc_lock, flags); |
1081 | } | 1081 | } |
1082 | 1082 | ||
1083 | /* locked by pdc_console_lock */ | ||
1084 | static int __attribute__((aligned(8))) iodc_retbuf[32]; | ||
1085 | static char __attribute__((aligned(64))) iodc_dbuf[4096]; | ||
1083 | 1086 | ||
1084 | /** | 1087 | /** |
1085 | * pdc_iodc_print - Console print using IODC. | 1088 | * pdc_iodc_print - Console print using IODC. |
@@ -1091,24 +1094,20 @@ void pdc_io_reset_devices(void) | |||
1091 | * Since the HP console requires CR+LF to perform a 'newline', we translate | 1094 | * Since the HP console requires CR+LF to perform a 'newline', we translate |
1092 | * "\n" to "\r\n". | 1095 | * "\n" to "\r\n". |
1093 | */ | 1096 | */ |
1094 | int pdc_iodc_print(unsigned char *str, unsigned count) | 1097 | int pdc_iodc_print(const unsigned char *str, unsigned count) |
1095 | { | 1098 | { |
1096 | /* XXX Should we spinlock posx usage */ | ||
1097 | static int posx; /* for simple TAB-Simulation... */ | 1099 | static int posx; /* for simple TAB-Simulation... */ |
1098 | int __attribute__((aligned(8))) iodc_retbuf[32]; | ||
1099 | char __attribute__((aligned(64))) iodc_dbuf[4096]; | ||
1100 | unsigned int i; | 1100 | unsigned int i; |
1101 | unsigned long flags; | 1101 | unsigned long flags; |
1102 | 1102 | ||
1103 | memset(iodc_dbuf, 0, 4096); | 1103 | for (i = 0; i < count && i < 79;) { |
1104 | for (i = 0; i < count && i < 2048;) { | ||
1105 | switch(str[i]) { | 1104 | switch(str[i]) { |
1106 | case '\n': | 1105 | case '\n': |
1107 | iodc_dbuf[i+0] = '\r'; | 1106 | iodc_dbuf[i+0] = '\r'; |
1108 | iodc_dbuf[i+1] = '\n'; | 1107 | iodc_dbuf[i+1] = '\n'; |
1109 | i += 2; | 1108 | i += 2; |
1110 | posx = 0; | 1109 | posx = 0; |
1111 | break; | 1110 | goto print; |
1112 | case '\t': | 1111 | case '\t': |
1113 | while (posx & 7) { | 1112 | while (posx & 7) { |
1114 | iodc_dbuf[i] = ' '; | 1113 | iodc_dbuf[i] = ' '; |
@@ -1124,6 +1123,16 @@ int pdc_iodc_print(unsigned char *str, unsigned count) | |||
1124 | } | 1123 | } |
1125 | } | 1124 | } |
1126 | 1125 | ||
1126 | /* if we're at the end of line, and not already inserting a newline, | ||
1127 | * insert one anyway. iodc console doesn't claim to support >79 char | ||
1128 | * lines. don't account for this in the return value. | ||
1129 | */ | ||
1130 | if (i == 79 && iodc_dbuf[i-1] != '\n') { | ||
1131 | iodc_dbuf[i+0] = '\r'; | ||
1132 | iodc_dbuf[i+1] = '\n'; | ||
1133 | } | ||
1134 | |||
1135 | print: | ||
1127 | spin_lock_irqsave(&pdc_lock, flags); | 1136 | spin_lock_irqsave(&pdc_lock, flags); |
1128 | real32_call(PAGE0->mem_cons.iodc_io, | 1137 | real32_call(PAGE0->mem_cons.iodc_io, |
1129 | (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT, | 1138 | (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT, |
@@ -1142,11 +1151,9 @@ int pdc_iodc_print(unsigned char *str, unsigned count) | |||
1142 | */ | 1151 | */ |
1143 | int pdc_iodc_getc(void) | 1152 | int pdc_iodc_getc(void) |
1144 | { | 1153 | { |
1145 | unsigned long flags; | ||
1146 | static int __attribute__((aligned(8))) iodc_retbuf[32]; | ||
1147 | static char __attribute__((aligned(64))) iodc_dbuf[4096]; | ||
1148 | int ch; | 1154 | int ch; |
1149 | int status; | 1155 | int status; |
1156 | unsigned long flags; | ||
1150 | 1157 | ||
1151 | /* Bail if no console input device. */ | 1158 | /* Bail if no console input device. */ |
1152 | if (!PAGE0->mem_kbd.iodc_io) | 1159 | if (!PAGE0->mem_kbd.iodc_io) |
diff --git a/arch/parisc/kernel/hardware.c b/arch/parisc/kernel/hardware.c index 84b9611a9228..f48a640b55fb 100644 --- a/arch/parisc/kernel/hardware.c +++ b/arch/parisc/kernel/hardware.c | |||
@@ -274,7 +274,18 @@ static struct hp_hardware hp_hardware_list[] __devinitdata = { | |||
274 | {HPHW_NPROC,0x887,0x4,0x91,"Storm Peak Slow"}, | 274 | {HPHW_NPROC,0x887,0x4,0x91,"Storm Peak Slow"}, |
275 | {HPHW_NPROC,0x888,0x4,0x91,"Storm Peak Fast DC-"}, | 275 | {HPHW_NPROC,0x888,0x4,0x91,"Storm Peak Fast DC-"}, |
276 | {HPHW_NPROC,0x889,0x4,0x91,"Storm Peak Fast"}, | 276 | {HPHW_NPROC,0x889,0x4,0x91,"Storm Peak Fast"}, |
277 | {HPHW_NPROC,0x88A,0x4,0x91,"Crestone Peak"}, | 277 | {HPHW_NPROC,0x88A,0x4,0x91,"Crestone Peak Slow"}, |
278 | {HPHW_NPROC,0x88C,0x4,0x91,"Orca Mako+"}, | ||
279 | {HPHW_NPROC,0x88D,0x4,0x91,"Rainier/Medel Mako+ Slow"}, | ||
280 | {HPHW_NPROC,0x88E,0x4,0x91,"Rainier/Medel Mako+ Fast"}, | ||
281 | {HPHW_NPROC,0x894,0x4,0x91,"Mt. Hamilton Fast Mako+"}, | ||
282 | {HPHW_NPROC,0x895,0x4,0x91,"Storm Peak Slow Mako+"}, | ||
283 | {HPHW_NPROC,0x896,0x4,0x91,"Storm Peak Fast Mako+"}, | ||
284 | {HPHW_NPROC,0x897,0x4,0x91,"Storm Peak DC- Slow Mako+"}, | ||
285 | {HPHW_NPROC,0x898,0x4,0x91,"Storm Peak DC- Fast Mako+"}, | ||
286 | {HPHW_NPROC,0x899,0x4,0x91,"Mt. Hamilton Slow Mako+"}, | ||
287 | {HPHW_NPROC,0x89B,0x4,0x91,"Crestone Peak Mako+ Slow"}, | ||
288 | {HPHW_NPROC,0x89C,0x4,0x91,"Crestone Peak Mako+ Fast"}, | ||
278 | {HPHW_A_DIRECT, 0x004, 0x0000D, 0x00, "Arrakis MUX"}, | 289 | {HPHW_A_DIRECT, 0x004, 0x0000D, 0x00, "Arrakis MUX"}, |
279 | {HPHW_A_DIRECT, 0x005, 0x0000D, 0x00, "Dyun Kiuh MUX"}, | 290 | {HPHW_A_DIRECT, 0x005, 0x0000D, 0x00, "Dyun Kiuh MUX"}, |
280 | {HPHW_A_DIRECT, 0x006, 0x0000D, 0x00, "Baat Kiuh AP/MUX (40299B)"}, | 291 | {HPHW_A_DIRECT, 0x006, 0x0000D, 0x00, "Baat Kiuh AP/MUX (40299B)"}, |
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S index a7b8859488bb..ec2482dc1beb 100644 --- a/arch/parisc/kernel/head.S +++ b/arch/parisc/kernel/head.S | |||
@@ -20,10 +20,11 @@ | |||
20 | #include <asm/pgtable.h> | 20 | #include <asm/pgtable.h> |
21 | 21 | ||
22 | #include <linux/linkage.h> | 22 | #include <linux/linkage.h> |
23 | #include <linux/init.h> | ||
23 | 24 | ||
24 | .level LEVEL | 25 | .level LEVEL |
25 | 26 | ||
26 | .data | 27 | __INITDATA |
27 | ENTRY(boot_args) | 28 | ENTRY(boot_args) |
28 | .word 0 /* arg0 */ | 29 | .word 0 /* arg0 */ |
29 | .word 0 /* arg1 */ | 30 | .word 0 /* arg1 */ |
@@ -31,7 +32,7 @@ ENTRY(boot_args) | |||
31 | .word 0 /* arg3 */ | 32 | .word 0 /* arg3 */ |
32 | END(boot_args) | 33 | END(boot_args) |
33 | 34 | ||
34 | .text | 35 | .section .text.head |
35 | .align 4 | 36 | .align 4 |
36 | .import init_thread_union,data | 37 | .import init_thread_union,data |
37 | .import fault_vector_20,code /* IVA parisc 2.0 32 bit */ | 38 | .import fault_vector_20,code /* IVA parisc 2.0 32 bit */ |
@@ -343,7 +344,7 @@ smp_slave_stext: | |||
343 | ENDPROC(stext) | 344 | ENDPROC(stext) |
344 | 345 | ||
345 | #ifndef CONFIG_64BIT | 346 | #ifndef CONFIG_64BIT |
346 | .data | 347 | .section .data.read_mostly |
347 | 348 | ||
348 | .align 4 | 349 | .align 4 |
349 | .export $global$,data | 350 | .export $global$,data |
diff --git a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c index 33b1f84441b1..ccb68090781e 100644 --- a/arch/parisc/kernel/pdc_cons.c +++ b/arch/parisc/kernel/pdc_cons.c | |||
@@ -52,28 +52,30 @@ | |||
52 | #include <linux/tty.h> | 52 | #include <linux/tty.h> |
53 | #include <asm/pdc.h> /* for iodc_call() proto and friends */ | 53 | #include <asm/pdc.h> /* for iodc_call() proto and friends */ |
54 | 54 | ||
55 | static spinlock_t pdc_console_lock = SPIN_LOCK_UNLOCKED; | ||
55 | 56 | ||
56 | static void pdc_console_write(struct console *co, const char *s, unsigned count) | 57 | static void pdc_console_write(struct console *co, const char *s, unsigned count) |
57 | { | 58 | { |
58 | pdc_iodc_print(s, count); | 59 | int i = 0; |
60 | unsigned long flags; | ||
61 | |||
62 | spin_lock_irqsave(&pdc_console_lock, flags); | ||
63 | do { | ||
64 | i += pdc_iodc_print(s + i, count - i); | ||
65 | } while (i < count); | ||
66 | spin_unlock_irqrestore(&pdc_console_lock, flags); | ||
59 | } | 67 | } |
60 | 68 | ||
61 | void pdc_printf(const char *fmt, ...) | 69 | int pdc_console_poll_key(struct console *co) |
62 | { | 70 | { |
63 | va_list args; | 71 | int c; |
64 | char buf[1024]; | 72 | unsigned long flags; |
65 | int i, len; | ||
66 | |||
67 | va_start(args, fmt); | ||
68 | len = vscnprintf(buf, sizeof(buf), fmt, args); | ||
69 | va_end(args); | ||
70 | 73 | ||
71 | pdc_iodc_print(buf, len); | 74 | spin_lock_irqsave(&pdc_console_lock, flags); |
72 | } | 75 | c = pdc_iodc_getc(); |
76 | spin_unlock_irqrestore(&pdc_console_lock, flags); | ||
73 | 77 | ||
74 | int pdc_console_poll_key(struct console *co) | 78 | return c; |
75 | { | ||
76 | return pdc_iodc_getc(); | ||
77 | } | 79 | } |
78 | 80 | ||
79 | static int pdc_console_setup(struct console *co, char *options) | 81 | static int pdc_console_setup(struct console *co, char *options) |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 117438e9eb2a..6b5ac38f5a99 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
@@ -401,9 +401,12 @@ | |||
401 | ENTRY_COMP(kexec_load) /* 300 */ | 401 | ENTRY_COMP(kexec_load) /* 300 */ |
402 | ENTRY_COMP(utimensat) | 402 | ENTRY_COMP(utimensat) |
403 | ENTRY_COMP(signalfd) | 403 | ENTRY_COMP(signalfd) |
404 | ENTRY_COMP(timerfd) | 404 | ENTRY_SAME(ni_syscall) /* was timerfd */ |
405 | ENTRY_SAME(eventfd) | 405 | ENTRY_SAME(eventfd) |
406 | ENTRY_COMP(fallocate) /* 305 */ | 406 | ENTRY_COMP(fallocate) /* 305 */ |
407 | ENTRY_SAME(timerfd_create) | ||
408 | ENTRY_COMP(timerfd_settime) | ||
409 | ENTRY_COMP(timerfd_gettime) | ||
407 | 410 | ||
408 | /* Nothing yet */ | 411 | /* Nothing yet */ |
409 | 412 | ||
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c index 99fd56939afa..9dc6dc42f9cf 100644 --- a/arch/parisc/kernel/traps.c +++ b/arch/parisc/kernel/traps.c | |||
@@ -51,6 +51,9 @@ | |||
51 | DEFINE_SPINLOCK(pa_dbit_lock); | 51 | DEFINE_SPINLOCK(pa_dbit_lock); |
52 | #endif | 52 | #endif |
53 | 53 | ||
54 | void parisc_show_stack(struct task_struct *t, unsigned long *sp, | ||
55 | struct pt_regs *regs); | ||
56 | |||
54 | static int printbinary(char *buf, unsigned long x, int nbits) | 57 | static int printbinary(char *buf, unsigned long x, int nbits) |
55 | { | 58 | { |
56 | unsigned long mask = 1UL << (nbits - 1); | 59 | unsigned long mask = 1UL << (nbits - 1); |
@@ -148,6 +151,8 @@ void show_regs(struct pt_regs *regs) | |||
148 | print_symbol(" IAOQ[1]: %s\n", regs->iaoq[1]); | 151 | print_symbol(" IAOQ[1]: %s\n", regs->iaoq[1]); |
149 | printk(level); | 152 | printk(level); |
150 | print_symbol(" RP(r2): %s\n", regs->gr[2]); | 153 | print_symbol(" RP(r2): %s\n", regs->gr[2]); |
154 | |||
155 | parisc_show_stack(current, NULL, regs); | ||
151 | } | 156 | } |
152 | 157 | ||
153 | 158 | ||
@@ -181,11 +186,19 @@ static void do_show_stack(struct unwind_frame_info *info) | |||
181 | printk("\n"); | 186 | printk("\n"); |
182 | } | 187 | } |
183 | 188 | ||
184 | void show_stack(struct task_struct *task, unsigned long *s) | 189 | void parisc_show_stack(struct task_struct *task, unsigned long *sp, |
190 | struct pt_regs *regs) | ||
185 | { | 191 | { |
186 | struct unwind_frame_info info; | 192 | struct unwind_frame_info info; |
193 | struct task_struct *t; | ||
194 | |||
195 | t = task ? task : current; | ||
196 | if (regs) { | ||
197 | unwind_frame_init(&info, t, regs); | ||
198 | goto show_stack; | ||
199 | } | ||
187 | 200 | ||
188 | if (!task) { | 201 | if (t == current) { |
189 | unsigned long sp; | 202 | unsigned long sp; |
190 | 203 | ||
191 | HERE: | 204 | HERE: |
@@ -201,12 +214,18 @@ HERE: | |||
201 | unwind_frame_init(&info, current, &r); | 214 | unwind_frame_init(&info, current, &r); |
202 | } | 215 | } |
203 | } else { | 216 | } else { |
204 | unwind_frame_init_from_blocked_task(&info, task); | 217 | unwind_frame_init_from_blocked_task(&info, t); |
205 | } | 218 | } |
206 | 219 | ||
220 | show_stack: | ||
207 | do_show_stack(&info); | 221 | do_show_stack(&info); |
208 | } | 222 | } |
209 | 223 | ||
224 | void show_stack(struct task_struct *t, unsigned long *sp) | ||
225 | { | ||
226 | return parisc_show_stack(t, sp, NULL); | ||
227 | } | ||
228 | |||
210 | int is_valid_bugaddr(unsigned long iaoq) | 229 | int is_valid_bugaddr(unsigned long iaoq) |
211 | { | 230 | { |
212 | return 1; | 231 | return 1; |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 5b8d8382b762..1189d8d6170d 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -90,6 +90,7 @@ config PPC | |||
90 | select HAVE_IDE | 90 | select HAVE_IDE |
91 | select HAVE_OPROFILE | 91 | select HAVE_OPROFILE |
92 | select HAVE_KPROBES | 92 | select HAVE_KPROBES |
93 | select HAVE_KRETPROBES | ||
93 | 94 | ||
94 | config EARLY_PRINTK | 95 | config EARLY_PRINTK |
95 | bool | 96 | bool |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 1c6ce3536e4c..ab5cfe8ef988 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
@@ -155,7 +155,7 @@ all: zImage | |||
155 | 155 | ||
156 | CPPFLAGS_vmlinux.lds := -Upowerpc | 156 | CPPFLAGS_vmlinux.lds := -Upowerpc |
157 | 157 | ||
158 | BOOT_TARGETS = zImage zImage.initrd uImage treeImage.% cuImage.% | 158 | BOOT_TARGETS = zImage zImage.initrd uImage zImage% dtbImage% treeImage.% cuImage.% |
159 | 159 | ||
160 | PHONY += $(BOOT_TARGETS) | 160 | PHONY += $(BOOT_TARGETS) |
161 | 161 | ||
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index e3993a607584..4974d9e56ead 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
@@ -186,7 +186,7 @@ quiet_cmd_wrap = WRAP $@ | |||
186 | image-$(CONFIG_PPC_PSERIES) += zImage.pseries | 186 | image-$(CONFIG_PPC_PSERIES) += zImage.pseries |
187 | image-$(CONFIG_PPC_MAPLE) += zImage.pseries | 187 | image-$(CONFIG_PPC_MAPLE) += zImage.pseries |
188 | image-$(CONFIG_PPC_IBM_CELL_BLADE) += zImage.pseries | 188 | image-$(CONFIG_PPC_IBM_CELL_BLADE) += zImage.pseries |
189 | image-$(CONFIG_PPC_PS3) += zImage-dtb.ps3 | 189 | image-$(CONFIG_PPC_PS3) += dtbImage.ps3 |
190 | image-$(CONFIG_PPC_CELLEB) += zImage.pseries | 190 | image-$(CONFIG_PPC_CELLEB) += zImage.pseries |
191 | image-$(CONFIG_PPC_CHRP) += zImage.chrp | 191 | image-$(CONFIG_PPC_CHRP) += zImage.chrp |
192 | image-$(CONFIG_PPC_EFIKA) += zImage.chrp | 192 | image-$(CONFIG_PPC_EFIKA) += zImage.chrp |
@@ -205,7 +205,7 @@ image-$(CONFIG_DEFAULT_UIMAGE) += uImage | |||
205 | # | 205 | # |
206 | 206 | ||
207 | # Board ports in arch/powerpc/platform/40x/Kconfig | 207 | # Board ports in arch/powerpc/platform/40x/Kconfig |
208 | image-$(CONFIG_EP405) += zImage-dtb.ep405 | 208 | image-$(CONFIG_EP405) += dtbImage.ep405 |
209 | image-$(CONFIG_WALNUT) += treeImage.walnut | 209 | image-$(CONFIG_WALNUT) += treeImage.walnut |
210 | 210 | ||
211 | # Board ports in arch/powerpc/platform/44x/Kconfig | 211 | # Board ports in arch/powerpc/platform/44x/Kconfig |
@@ -220,9 +220,9 @@ image-$(CONFIG_WARP) += cuImage.warp | |||
220 | # Board ports in arch/powerpc/platform/8xx/Kconfig | 220 | # Board ports in arch/powerpc/platform/8xx/Kconfig |
221 | image-$(CONFIG_PPC_MPC86XADS) += cuImage.mpc866ads | 221 | image-$(CONFIG_PPC_MPC86XADS) += cuImage.mpc866ads |
222 | image-$(CONFIG_PPC_MPC885ADS) += cuImage.mpc885ads | 222 | image-$(CONFIG_PPC_MPC885ADS) += cuImage.mpc885ads |
223 | image-$(CONFIG_PPC_EP88XC) += zImage-dtb.ep88xc | 223 | image-$(CONFIG_PPC_EP88XC) += dtbImage.ep88xc |
224 | image-$(CONFIG_PPC_ADDER875) += cuImage.adder875-uboot \ | 224 | image-$(CONFIG_PPC_ADDER875) += cuImage.adder875-uboot \ |
225 | zImage-dtb.adder875-redboot | 225 | dtbImage.adder875-redboot |
226 | 226 | ||
227 | # Board ports in arch/powerpc/platform/52xx/Kconfig | 227 | # Board ports in arch/powerpc/platform/52xx/Kconfig |
228 | image-$(CONFIG_PPC_LITE5200) += cuImage.lite5200 cuImage.lite5200b | 228 | image-$(CONFIG_PPC_LITE5200) += cuImage.lite5200 cuImage.lite5200b |
@@ -230,7 +230,7 @@ image-$(CONFIG_PPC_LITE5200) += cuImage.lite5200 cuImage.lite5200b | |||
230 | # Board ports in arch/powerpc/platform/82xx/Kconfig | 230 | # Board ports in arch/powerpc/platform/82xx/Kconfig |
231 | image-$(CONFIG_MPC8272_ADS) += cuImage.mpc8272ads | 231 | image-$(CONFIG_MPC8272_ADS) += cuImage.mpc8272ads |
232 | image-$(CONFIG_PQ2FADS) += cuImage.pq2fads | 232 | image-$(CONFIG_PQ2FADS) += cuImage.pq2fads |
233 | image-$(CONFIG_EP8248E) += zImage-dtb.ep8248e | 233 | image-$(CONFIG_EP8248E) += dtbImage.ep8248e |
234 | 234 | ||
235 | # Board ports in arch/powerpc/platform/83xx/Kconfig | 235 | # Board ports in arch/powerpc/platform/83xx/Kconfig |
236 | image-$(CONFIG_MPC832x_MDS) += cuImage.mpc832x_mds | 236 | image-$(CONFIG_MPC832x_MDS) += cuImage.mpc832x_mds |
@@ -268,7 +268,8 @@ endif | |||
268 | 268 | ||
269 | initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-)) | 269 | initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-)) |
270 | initrd-y := $(patsubst zImage%, zImage.initrd%, \ | 270 | initrd-y := $(patsubst zImage%, zImage.initrd%, \ |
271 | $(patsubst treeImage%, treeImage.initrd%, $(image-y))) | 271 | $(patsubst dtbImage%, dtbImage.initrd%, \ |
272 | $(patsubst treeImage%, treeImage.initrd%, $(image-y)))) | ||
272 | initrd-y := $(filter-out $(image-y), $(initrd-y)) | 273 | initrd-y := $(filter-out $(image-y), $(initrd-y)) |
273 | targets += $(image-y) $(initrd-y) | 274 | targets += $(image-y) $(initrd-y) |
274 | 275 | ||
@@ -283,10 +284,11 @@ $(obj)/zImage.initrd.%: vmlinux $(wrapperbits) | |||
283 | $(obj)/zImage.%: vmlinux $(wrapperbits) | 284 | $(obj)/zImage.%: vmlinux $(wrapperbits) |
284 | $(call if_changed,wrap,$*) | 285 | $(call if_changed,wrap,$*) |
285 | 286 | ||
286 | $(obj)/zImage-dtb.initrd.%: vmlinux $(wrapperbits) $(dtstree)/%.dts | 287 | # dtbImage% - a dtbImage is a zImage with an embedded device tree blob |
288 | $(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(dtstree)/%.dts | ||
287 | $(call if_changed,wrap,$*,$(dtstree)/$*.dts,,$(obj)/ramdisk.image.gz) | 289 | $(call if_changed,wrap,$*,$(dtstree)/$*.dts,,$(obj)/ramdisk.image.gz) |
288 | 290 | ||
289 | $(obj)/zImage-dtb.%: vmlinux $(wrapperbits) $(dtstree)/%.dts | 291 | $(obj)/dtbImage.%: vmlinux $(wrapperbits) $(dtstree)/%.dts |
290 | $(call if_changed,wrap,$*,$(dtstree)/$*.dts) | 292 | $(call if_changed,wrap,$*,$(dtstree)/$*.dts) |
291 | 293 | ||
292 | # This cannot be in the root of $(src) as the zImage rule always adds a $(obj) | 294 | # This cannot be in the root of $(src) as the zImage rule always adds a $(obj) |
diff --git a/arch/powerpc/boot/cuboot-bamboo.c b/arch/powerpc/boot/cuboot-bamboo.c index 900c7ff2b7e9..b5c30f766c40 100644 --- a/arch/powerpc/boot/cuboot-bamboo.c +++ b/arch/powerpc/boot/cuboot-bamboo.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include "44x.h" | 17 | #include "44x.h" |
18 | #include "cuboot.h" | 18 | #include "cuboot.h" |
19 | 19 | ||
20 | #define TARGET_4xx | ||
20 | #define TARGET_44x | 21 | #define TARGET_44x |
21 | #include "ppcboot.h" | 22 | #include "ppcboot.h" |
22 | 23 | ||
diff --git a/arch/powerpc/boot/cuboot-ebony.c b/arch/powerpc/boot/cuboot-ebony.c index c5f37ce172ea..56564ba37f62 100644 --- a/arch/powerpc/boot/cuboot-ebony.c +++ b/arch/powerpc/boot/cuboot-ebony.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include "44x.h" | 17 | #include "44x.h" |
18 | #include "cuboot.h" | 18 | #include "cuboot.h" |
19 | 19 | ||
20 | #define TARGET_4xx | ||
20 | #define TARGET_44x | 21 | #define TARGET_44x |
21 | #include "ppcboot.h" | 22 | #include "ppcboot.h" |
22 | 23 | ||
diff --git a/arch/powerpc/boot/cuboot-katmai.c b/arch/powerpc/boot/cuboot-katmai.c index c021167f9381..5434d70b5660 100644 --- a/arch/powerpc/boot/cuboot-katmai.c +++ b/arch/powerpc/boot/cuboot-katmai.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include "44x.h" | 22 | #include "44x.h" |
23 | #include "cuboot.h" | 23 | #include "cuboot.h" |
24 | 24 | ||
25 | #define TARGET_4xx | ||
25 | #define TARGET_44x | 26 | #define TARGET_44x |
26 | #include "ppcboot.h" | 27 | #include "ppcboot.h" |
27 | 28 | ||
diff --git a/arch/powerpc/boot/cuboot-taishan.c b/arch/powerpc/boot/cuboot-taishan.c index f66455a45ab1..b55b80467eed 100644 --- a/arch/powerpc/boot/cuboot-taishan.c +++ b/arch/powerpc/boot/cuboot-taishan.c | |||
@@ -21,7 +21,9 @@ | |||
21 | #include "dcr.h" | 21 | #include "dcr.h" |
22 | #include "4xx.h" | 22 | #include "4xx.h" |
23 | 23 | ||
24 | #define TARGET_4xx | ||
24 | #define TARGET_44x | 25 | #define TARGET_44x |
26 | #define TARGET_440GX | ||
25 | #include "ppcboot.h" | 27 | #include "ppcboot.h" |
26 | 28 | ||
27 | static bd_t bd; | 29 | static bd_t bd; |
diff --git a/arch/powerpc/boot/cuboot-warp.c b/arch/powerpc/boot/cuboot-warp.c index bdedebe1bc14..3db93e85e9ea 100644 --- a/arch/powerpc/boot/cuboot-warp.c +++ b/arch/powerpc/boot/cuboot-warp.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include "4xx.h" | 11 | #include "4xx.h" |
12 | #include "cuboot.h" | 12 | #include "cuboot.h" |
13 | 13 | ||
14 | #define TARGET_4xx | ||
14 | #define TARGET_44x | 15 | #define TARGET_44x |
15 | #include "ppcboot.h" | 16 | #include "ppcboot.h" |
16 | 17 | ||
diff --git a/arch/powerpc/boot/dts/haleakala.dts b/arch/powerpc/boot/dts/haleakala.dts index 5dd3d15f0feb..ae68fefc01b6 100644 --- a/arch/powerpc/boot/dts/haleakala.dts +++ b/arch/powerpc/boot/dts/haleakala.dts | |||
@@ -235,7 +235,7 @@ | |||
235 | #interrupt-cells = <1>; | 235 | #interrupt-cells = <1>; |
236 | #size-cells = <2>; | 236 | #size-cells = <2>; |
237 | #address-cells = <3>; | 237 | #address-cells = <3>; |
238 | compatible = "ibm,plb-pciex-405exr", "ibm,plb-pciex"; | 238 | compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex"; |
239 | primary; | 239 | primary; |
240 | port = <0>; /* port number */ | 240 | port = <0>; /* port number */ |
241 | reg = <a0000000 20000000 /* Config space access */ | 241 | reg = <a0000000 20000000 /* Config space access */ |
diff --git a/arch/powerpc/boot/dts/katmai.dts b/arch/powerpc/boot/dts/katmai.dts index bc32ac7250ec..fc86e5a3afc4 100644 --- a/arch/powerpc/boot/dts/katmai.dts +++ b/arch/powerpc/boot/dts/katmai.dts | |||
@@ -38,8 +38,8 @@ | |||
38 | timebase-frequency = <0>; /* Filled in by zImage */ | 38 | timebase-frequency = <0>; /* Filled in by zImage */ |
39 | i-cache-line-size = <20>; | 39 | i-cache-line-size = <20>; |
40 | d-cache-line-size = <20>; | 40 | d-cache-line-size = <20>; |
41 | i-cache-size = <20000>; | 41 | i-cache-size = <8000>; |
42 | d-cache-size = <20000>; | 42 | d-cache-size = <8000>; |
43 | dcr-controller; | 43 | dcr-controller; |
44 | dcr-access-method = "native"; | 44 | dcr-access-method = "native"; |
45 | }; | 45 | }; |
@@ -136,11 +136,11 @@ | |||
136 | }; | 136 | }; |
137 | 137 | ||
138 | POB0: opb { | 138 | POB0: opb { |
139 | compatible = "ibm,opb-440spe", "ibm,opb-440gp", "ibm,opb"; | 139 | compatible = "ibm,opb-440spe", "ibm,opb-440gp", "ibm,opb"; |
140 | #address-cells = <1>; | 140 | #address-cells = <1>; |
141 | #size-cells = <1>; | 141 | #size-cells = <1>; |
142 | ranges = <00000000 4 e0000000 20000000>; | 142 | ranges = <00000000 4 e0000000 20000000>; |
143 | clock-frequency = <0>; /* Filled in by zImage */ | 143 | clock-frequency = <0>; /* Filled in by zImage */ |
144 | 144 | ||
145 | EBC0: ebc { | 145 | EBC0: ebc { |
146 | compatible = "ibm,ebc-440spe", "ibm,ebc-440gp", "ibm,ebc"; | 146 | compatible = "ibm,ebc-440spe", "ibm,ebc-440gp", "ibm,ebc"; |
@@ -153,38 +153,38 @@ | |||
153 | }; | 153 | }; |
154 | 154 | ||
155 | UART0: serial@10000200 { | 155 | UART0: serial@10000200 { |
156 | device_type = "serial"; | 156 | device_type = "serial"; |
157 | compatible = "ns16550"; | 157 | compatible = "ns16550"; |
158 | reg = <10000200 8>; | 158 | reg = <10000200 8>; |
159 | virtual-reg = <a0000200>; | 159 | virtual-reg = <a0000200>; |
160 | clock-frequency = <0>; /* Filled in by zImage */ | 160 | clock-frequency = <0>; /* Filled in by zImage */ |
161 | current-speed = <1c200>; | 161 | current-speed = <1c200>; |
162 | interrupt-parent = <&UIC0>; | 162 | interrupt-parent = <&UIC0>; |
163 | interrupts = <0 4>; | 163 | interrupts = <0 4>; |
164 | }; | 164 | }; |
165 | 165 | ||
166 | UART1: serial@10000300 { | 166 | UART1: serial@10000300 { |
167 | device_type = "serial"; | 167 | device_type = "serial"; |
168 | compatible = "ns16550"; | 168 | compatible = "ns16550"; |
169 | reg = <10000300 8>; | 169 | reg = <10000300 8>; |
170 | virtual-reg = <a0000300>; | 170 | virtual-reg = <a0000300>; |
171 | clock-frequency = <0>; | 171 | clock-frequency = <0>; |
172 | current-speed = <0>; | 172 | current-speed = <0>; |
173 | interrupt-parent = <&UIC0>; | 173 | interrupt-parent = <&UIC0>; |
174 | interrupts = <1 4>; | 174 | interrupts = <1 4>; |
175 | }; | 175 | }; |
176 | 176 | ||
177 | 177 | ||
178 | UART2: serial@10000600 { | 178 | UART2: serial@10000600 { |
179 | device_type = "serial"; | 179 | device_type = "serial"; |
180 | compatible = "ns16550"; | 180 | compatible = "ns16550"; |
181 | reg = <10000600 8>; | 181 | reg = <10000600 8>; |
182 | virtual-reg = <a0000600>; | 182 | virtual-reg = <a0000600>; |
183 | clock-frequency = <0>; | 183 | clock-frequency = <0>; |
184 | current-speed = <0>; | 184 | current-speed = <0>; |
185 | interrupt-parent = <&UIC1>; | 185 | interrupt-parent = <&UIC1>; |
186 | interrupts = <5 4>; | 186 | interrupts = <5 4>; |
187 | }; | 187 | }; |
188 | 188 | ||
189 | IIC0: i2c@10000400 { | 189 | IIC0: i2c@10000400 { |
190 | compatible = "ibm,iic-440spe", "ibm,iic-440gp", "ibm,iic"; | 190 | compatible = "ibm,iic-440spe", "ibm,iic-440gp", "ibm,iic"; |
diff --git a/arch/powerpc/boot/dts/mpc8377_mds.dts b/arch/powerpc/boot/dts/mpc8377_mds.dts index a3637fff73cc..49c05e97386c 100644 --- a/arch/powerpc/boot/dts/mpc8377_mds.dts +++ b/arch/powerpc/boot/dts/mpc8377_mds.dts | |||
@@ -47,6 +47,72 @@ | |||
47 | reg = <0x00000000 0x20000000>; // 512MB at 0 | 47 | reg = <0x00000000 0x20000000>; // 512MB at 0 |
48 | }; | 48 | }; |
49 | 49 | ||
50 | localbus@e0005000 { | ||
51 | #address-cells = <2>; | ||
52 | #size-cells = <1>; | ||
53 | compatible = "fsl,mpc8377-elbc", "fsl,elbc", "simple-bus"; | ||
54 | reg = <0xe0005000 0x1000>; | ||
55 | interrupts = <77 0x8>; | ||
56 | interrupt-parent = <&ipic>; | ||
57 | |||
58 | // booting from NOR flash | ||
59 | ranges = <0 0x0 0xfe000000 0x02000000 | ||
60 | 1 0x0 0xf8000000 0x00008000 | ||
61 | 3 0x0 0xe0600000 0x00008000>; | ||
62 | |||
63 | flash@0,0 { | ||
64 | #address-cells = <1>; | ||
65 | #size-cells = <1>; | ||
66 | compatible = "cfi-flash"; | ||
67 | reg = <0 0x0 0x2000000>; | ||
68 | bank-width = <2>; | ||
69 | device-width = <1>; | ||
70 | |||
71 | u-boot@0 { | ||
72 | reg = <0x0 0x100000>; | ||
73 | read-only; | ||
74 | }; | ||
75 | |||
76 | fs@100000 { | ||
77 | reg = <0x100000 0x800000>; | ||
78 | }; | ||
79 | |||
80 | kernel@1d00000 { | ||
81 | reg = <0x1d00000 0x200000>; | ||
82 | }; | ||
83 | |||
84 | dtb@1f00000 { | ||
85 | reg = <0x1f00000 0x100000>; | ||
86 | }; | ||
87 | }; | ||
88 | |||
89 | bcsr@1,0 { | ||
90 | reg = <1 0x0 0x8000>; | ||
91 | compatible = "fsl,mpc837xmds-bcsr"; | ||
92 | }; | ||
93 | |||
94 | nand@3,0 { | ||
95 | #address-cells = <1>; | ||
96 | #size-cells = <1>; | ||
97 | compatible = "fsl,mpc8377-fcm-nand", | ||
98 | "fsl,elbc-fcm-nand"; | ||
99 | reg = <3 0x0 0x8000>; | ||
100 | |||
101 | u-boot@0 { | ||
102 | reg = <0x0 0x100000>; | ||
103 | read-only; | ||
104 | }; | ||
105 | |||
106 | kernel@100000 { | ||
107 | reg = <0x100000 0x300000>; | ||
108 | }; | ||
109 | |||
110 | fs@400000 { | ||
111 | reg = <0x400000 0x1c00000>; | ||
112 | }; | ||
113 | }; | ||
114 | }; | ||
115 | |||
50 | soc@e0000000 { | 116 | soc@e0000000 { |
51 | #address-cells = <1>; | 117 | #address-cells = <1>; |
52 | #size-cells = <1>; | 118 | #size-cells = <1>; |
@@ -91,7 +157,6 @@ | |||
91 | mode = "cpu"; | 157 | mode = "cpu"; |
92 | }; | 158 | }; |
93 | 159 | ||
94 | /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */ | ||
95 | usb@23000 { | 160 | usb@23000 { |
96 | compatible = "fsl-usb2-dr"; | 161 | compatible = "fsl-usb2-dr"; |
97 | reg = <0x23000 0x1000>; | 162 | reg = <0x23000 0x1000>; |
@@ -99,7 +164,8 @@ | |||
99 | #size-cells = <0>; | 164 | #size-cells = <0>; |
100 | interrupt-parent = <&ipic>; | 165 | interrupt-parent = <&ipic>; |
101 | interrupts = <38 0x8>; | 166 | interrupts = <38 0x8>; |
102 | phy_type = "utmi_wide"; | 167 | dr_mode = "host"; |
168 | phy_type = "ulpi"; | ||
103 | }; | 169 | }; |
104 | 170 | ||
105 | mdio@24520 { | 171 | mdio@24520 { |
diff --git a/arch/powerpc/boot/dts/mpc8378_mds.dts b/arch/powerpc/boot/dts/mpc8378_mds.dts index 533e9b06cc8f..1d6ea080ad73 100644 --- a/arch/powerpc/boot/dts/mpc8378_mds.dts +++ b/arch/powerpc/boot/dts/mpc8378_mds.dts | |||
@@ -47,6 +47,72 @@ | |||
47 | reg = <0x00000000 0x20000000>; // 512MB at 0 | 47 | reg = <0x00000000 0x20000000>; // 512MB at 0 |
48 | }; | 48 | }; |
49 | 49 | ||
50 | localbus@e0005000 { | ||
51 | #address-cells = <2>; | ||
52 | #size-cells = <1>; | ||
53 | compatible = "fsl,mpc8378-elbc", "fsl,elbc", "simple-bus"; | ||
54 | reg = <0xe0005000 0x1000>; | ||
55 | interrupts = <77 0x8>; | ||
56 | interrupt-parent = <&ipic>; | ||
57 | |||
58 | // booting from NOR flash | ||
59 | ranges = <0 0x0 0xfe000000 0x02000000 | ||
60 | 1 0x0 0xf8000000 0x00008000 | ||
61 | 3 0x0 0xe0600000 0x00008000>; | ||
62 | |||
63 | flash@0,0 { | ||
64 | #address-cells = <1>; | ||
65 | #size-cells = <1>; | ||
66 | compatible = "cfi-flash"; | ||
67 | reg = <0 0x0 0x2000000>; | ||
68 | bank-width = <2>; | ||
69 | device-width = <1>; | ||
70 | |||
71 | u-boot@0 { | ||
72 | reg = <0x0 0x100000>; | ||
73 | read-only; | ||
74 | }; | ||
75 | |||
76 | fs@100000 { | ||
77 | reg = <0x100000 0x800000>; | ||
78 | }; | ||
79 | |||
80 | kernel@1d00000 { | ||
81 | reg = <0x1d00000 0x200000>; | ||
82 | }; | ||
83 | |||
84 | dtb@1f00000 { | ||
85 | reg = <0x1f00000 0x100000>; | ||
86 | }; | ||
87 | }; | ||
88 | |||
89 | bcsr@1,0 { | ||
90 | reg = <1 0x0 0x8000>; | ||
91 | compatible = "fsl,mpc837xmds-bcsr"; | ||
92 | }; | ||
93 | |||
94 | nand@3,0 { | ||
95 | #address-cells = <1>; | ||
96 | #size-cells = <1>; | ||
97 | compatible = "fsl,mpc8378-fcm-nand", | ||
98 | "fsl,elbc-fcm-nand"; | ||
99 | reg = <3 0x0 0x8000>; | ||
100 | |||
101 | u-boot@0 { | ||
102 | reg = <0x0 0x100000>; | ||
103 | read-only; | ||
104 | }; | ||
105 | |||
106 | kernel@100000 { | ||
107 | reg = <0x100000 0x300000>; | ||
108 | }; | ||
109 | |||
110 | fs@400000 { | ||
111 | reg = <0x400000 0x1c00000>; | ||
112 | }; | ||
113 | }; | ||
114 | }; | ||
115 | |||
50 | soc@e0000000 { | 116 | soc@e0000000 { |
51 | #address-cells = <1>; | 117 | #address-cells = <1>; |
52 | #size-cells = <1>; | 118 | #size-cells = <1>; |
@@ -91,7 +157,6 @@ | |||
91 | mode = "cpu"; | 157 | mode = "cpu"; |
92 | }; | 158 | }; |
93 | 159 | ||
94 | /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */ | ||
95 | usb@23000 { | 160 | usb@23000 { |
96 | compatible = "fsl-usb2-dr"; | 161 | compatible = "fsl-usb2-dr"; |
97 | reg = <0x23000 0x1000>; | 162 | reg = <0x23000 0x1000>; |
@@ -99,7 +164,8 @@ | |||
99 | #size-cells = <0>; | 164 | #size-cells = <0>; |
100 | interrupt-parent = <&ipic>; | 165 | interrupt-parent = <&ipic>; |
101 | interrupts = <38 0x8>; | 166 | interrupts = <38 0x8>; |
102 | phy_type = "utmi_wide"; | 167 | dr_mode = "host"; |
168 | phy_type = "ulpi"; | ||
103 | }; | 169 | }; |
104 | 170 | ||
105 | mdio@24520 { | 171 | mdio@24520 { |
diff --git a/arch/powerpc/boot/dts/mpc8379_mds.dts b/arch/powerpc/boot/dts/mpc8379_mds.dts index c270685bbde4..fdb4a9255b24 100644 --- a/arch/powerpc/boot/dts/mpc8379_mds.dts +++ b/arch/powerpc/boot/dts/mpc8379_mds.dts | |||
@@ -47,6 +47,72 @@ | |||
47 | reg = <0x00000000 0x20000000>; // 512MB at 0 | 47 | reg = <0x00000000 0x20000000>; // 512MB at 0 |
48 | }; | 48 | }; |
49 | 49 | ||
50 | localbus@e0005000 { | ||
51 | #address-cells = <2>; | ||
52 | #size-cells = <1>; | ||
53 | compatible = "fsl,mpc8379-elbc", "fsl,elbc", "simple-bus"; | ||
54 | reg = <0xe0005000 0x1000>; | ||
55 | interrupts = <77 0x8>; | ||
56 | interrupt-parent = <&ipic>; | ||
57 | |||
58 | // booting from NOR flash | ||
59 | ranges = <0 0x0 0xfe000000 0x02000000 | ||
60 | 1 0x0 0xf8000000 0x00008000 | ||
61 | 3 0x0 0xe0600000 0x00008000>; | ||
62 | |||
63 | flash@0,0 { | ||
64 | #address-cells = <1>; | ||
65 | #size-cells = <1>; | ||
66 | compatible = "cfi-flash"; | ||
67 | reg = <0 0x0 0x2000000>; | ||
68 | bank-width = <2>; | ||
69 | device-width = <1>; | ||
70 | |||
71 | u-boot@0 { | ||
72 | reg = <0x0 0x100000>; | ||
73 | read-only; | ||
74 | }; | ||
75 | |||
76 | fs@100000 { | ||
77 | reg = <0x100000 0x800000>; | ||
78 | }; | ||
79 | |||
80 | kernel@1d00000 { | ||
81 | reg = <0x1d00000 0x200000>; | ||
82 | }; | ||
83 | |||
84 | dtb@1f00000 { | ||
85 | reg = <0x1f00000 0x100000>; | ||
86 | }; | ||
87 | }; | ||
88 | |||
89 | bcsr@1,0 { | ||
90 | reg = <1 0x0 0x8000>; | ||
91 | compatible = "fsl,mpc837xmds-bcsr"; | ||
92 | }; | ||
93 | |||
94 | nand@3,0 { | ||
95 | #address-cells = <1>; | ||
96 | #size-cells = <1>; | ||
97 | compatible = "fsl,mpc8379-fcm-nand", | ||
98 | "fsl,elbc-fcm-nand"; | ||
99 | reg = <3 0x0 0x8000>; | ||
100 | |||
101 | u-boot@0 { | ||
102 | reg = <0x0 0x100000>; | ||
103 | read-only; | ||
104 | }; | ||
105 | |||
106 | kernel@100000 { | ||
107 | reg = <0x100000 0x300000>; | ||
108 | }; | ||
109 | |||
110 | fs@400000 { | ||
111 | reg = <0x400000 0x1c00000>; | ||
112 | }; | ||
113 | }; | ||
114 | }; | ||
115 | |||
50 | soc@e0000000 { | 116 | soc@e0000000 { |
51 | #address-cells = <1>; | 117 | #address-cells = <1>; |
52 | #size-cells = <1>; | 118 | #size-cells = <1>; |
@@ -91,7 +157,6 @@ | |||
91 | mode = "cpu"; | 157 | mode = "cpu"; |
92 | }; | 158 | }; |
93 | 159 | ||
94 | /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */ | ||
95 | usb@23000 { | 160 | usb@23000 { |
96 | compatible = "fsl-usb2-dr"; | 161 | compatible = "fsl-usb2-dr"; |
97 | reg = <0x23000 0x1000>; | 162 | reg = <0x23000 0x1000>; |
@@ -99,7 +164,8 @@ | |||
99 | #size-cells = <0>; | 164 | #size-cells = <0>; |
100 | interrupt-parent = <&ipic>; | 165 | interrupt-parent = <&ipic>; |
101 | interrupts = <38 0x8>; | 166 | interrupts = <38 0x8>; |
102 | phy_type = "utmi_wide"; | 167 | dr_mode = "host"; |
168 | phy_type = "ulpi"; | ||
103 | }; | 169 | }; |
104 | 170 | ||
105 | mdio@24520 { | 171 | mdio@24520 { |
diff --git a/arch/powerpc/boot/dts/sbc8548.dts b/arch/powerpc/boot/dts/sbc8548.dts index 14be38ad5d4b..b86e65d926c1 100644 --- a/arch/powerpc/boot/dts/sbc8548.dts +++ b/arch/powerpc/boot/dts/sbc8548.dts | |||
@@ -184,11 +184,17 @@ | |||
184 | cell-index = <0>; | 184 | cell-index = <0>; |
185 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | 185 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; |
186 | interrupt-map = < | 186 | interrupt-map = < |
187 | /* IDSEL 0x01 (PCI-X slot) */ | 187 | /* IDSEL 0x01 (PCI-X slot) @66MHz */ |
188 | 0x0800 0x0 0x0 0x1 &mpic 0x0 0x1 | 188 | 0x0800 0x0 0x0 0x1 &mpic 0x2 0x1 |
189 | 0x0800 0x0 0x0 0x2 &mpic 0x1 0x1 | 189 | 0x0800 0x0 0x0 0x2 &mpic 0x3 0x1 |
190 | 0x0800 0x0 0x0 0x3 &mpic 0x2 0x1 | 190 | 0x0800 0x0 0x0 0x3 &mpic 0x4 0x1 |
191 | 0x0800 0x0 0x0 0x4 &mpic 0x3 0x1>; | 191 | 0x0800 0x0 0x0 0x4 &mpic 0x1 0x1 |
192 | |||
193 | /* IDSEL 0x11 (PCI, 3.3V 32bit) @33MHz */ | ||
194 | 0x8800 0x0 0x0 0x1 &mpic 0x2 0x1 | ||
195 | 0x8800 0x0 0x0 0x2 &mpic 0x3 0x1 | ||
196 | 0x8800 0x0 0x0 0x3 &mpic 0x4 0x1 | ||
197 | 0x8800 0x0 0x0 0x4 &mpic 0x1 0x1>; | ||
192 | 198 | ||
193 | interrupt-parent = <&mpic>; | 199 | interrupt-parent = <&mpic>; |
194 | interrupts = <0x18 0x2>; | 200 | interrupts = <0x18 0x2>; |
diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index c3178155311b..d50e498a072b 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper | |||
@@ -191,10 +191,14 @@ ps3) | |||
191 | ksection=.kernel:vmlinux.bin | 191 | ksection=.kernel:vmlinux.bin |
192 | isection=.kernel:initrd | 192 | isection=.kernel:initrd |
193 | ;; | 193 | ;; |
194 | ep88xc|ep405|redboot*|ep8248e) | 194 | ep88xc|ep405|ep8248e) |
195 | platformo="$object/fixed-head.o $object/$platform.o" | 195 | platformo="$object/fixed-head.o $object/$platform.o" |
196 | binary=y | 196 | binary=y |
197 | ;; | 197 | ;; |
198 | adder875-redboot) | ||
199 | platformo="$object/fixed-head.o $object/redboot-8xx.o" | ||
200 | binary=y | ||
201 | ;; | ||
198 | esac | 202 | esac |
199 | 203 | ||
200 | vmz="$tmpdir/`basename \"$kernel\"`.$ext" | 204 | vmz="$tmpdir/`basename \"$kernel\"`.$ext" |
diff --git a/arch/powerpc/configs/adder875-uboot_defconfig b/arch/powerpc/configs/adder875-uboot_defconfig deleted file mode 100644 index 1faf7ef59a23..000000000000 --- a/arch/powerpc/configs/adder875-uboot_defconfig +++ /dev/null | |||
@@ -1,798 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.24-rc6 | ||
4 | # Thu Jan 17 16:17:18 2008 | ||
5 | # | ||
6 | # CONFIG_PPC64 is not set | ||
7 | |||
8 | # | ||
9 | # Processor support | ||
10 | # | ||
11 | # CONFIG_6xx is not set | ||
12 | # CONFIG_PPC_85xx is not set | ||
13 | CONFIG_PPC_8xx=y | ||
14 | # CONFIG_40x is not set | ||
15 | # CONFIG_44x is not set | ||
16 | # CONFIG_E200 is not set | ||
17 | CONFIG_8xx=y | ||
18 | # CONFIG_PPC_MM_SLICES is not set | ||
19 | CONFIG_NOT_COHERENT_CACHE=y | ||
20 | CONFIG_PPC32=y | ||
21 | CONFIG_WORD_SIZE=32 | ||
22 | CONFIG_PPC_MERGE=y | ||
23 | CONFIG_MMU=y | ||
24 | CONFIG_GENERIC_CMOS_UPDATE=y | ||
25 | CONFIG_GENERIC_TIME=y | ||
26 | CONFIG_GENERIC_TIME_VSYSCALL=y | ||
27 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
28 | CONFIG_GENERIC_HARDIRQS=y | ||
29 | CONFIG_IRQ_PER_CPU=y | ||
30 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
31 | CONFIG_ARCH_HAS_ILOG2_U32=y | ||
32 | CONFIG_GENERIC_HWEIGHT=y | ||
33 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
34 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
35 | # CONFIG_ARCH_NO_VIRT_TO_BUS is not set | ||
36 | CONFIG_PPC=y | ||
37 | CONFIG_EARLY_PRINTK=y | ||
38 | CONFIG_GENERIC_NVRAM=y | ||
39 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
40 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | ||
41 | CONFIG_PPC_OF=y | ||
42 | CONFIG_OF=y | ||
43 | # CONFIG_PPC_UDBG_16550 is not set | ||
44 | # CONFIG_GENERIC_TBSYNC is not set | ||
45 | CONFIG_AUDIT_ARCH=y | ||
46 | CONFIG_GENERIC_BUG=y | ||
47 | # CONFIG_DEFAULT_UIMAGE is not set | ||
48 | CONFIG_REDBOOT=y | ||
49 | # CONFIG_PPC_DCR_NATIVE is not set | ||
50 | # CONFIG_PPC_DCR_MMIO is not set | ||
51 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
52 | |||
53 | # | ||
54 | # General setup | ||
55 | # | ||
56 | CONFIG_EXPERIMENTAL=y | ||
57 | CONFIG_BROKEN_ON_SMP=y | ||
58 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
59 | CONFIG_LOCALVERSION="" | ||
60 | CONFIG_LOCALVERSION_AUTO=y | ||
61 | # CONFIG_SWAP is not set | ||
62 | CONFIG_SYSVIPC=y | ||
63 | CONFIG_SYSVIPC_SYSCTL=y | ||
64 | # CONFIG_POSIX_MQUEUE is not set | ||
65 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
66 | # CONFIG_TASKSTATS is not set | ||
67 | # CONFIG_USER_NS is not set | ||
68 | # CONFIG_PID_NS is not set | ||
69 | # CONFIG_AUDIT is not set | ||
70 | # CONFIG_IKCONFIG is not set | ||
71 | CONFIG_LOG_BUF_SHIFT=14 | ||
72 | # CONFIG_CGROUPS is not set | ||
73 | CONFIG_FAIR_GROUP_SCHED=y | ||
74 | CONFIG_FAIR_USER_SCHED=y | ||
75 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
76 | CONFIG_SYSFS_DEPRECATED=y | ||
77 | # CONFIG_RELAY is not set | ||
78 | # CONFIG_BLK_DEV_INITRD is not set | ||
79 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
80 | CONFIG_SYSCTL=y | ||
81 | CONFIG_EMBEDDED=y | ||
82 | # CONFIG_SYSCTL_SYSCALL is not set | ||
83 | CONFIG_KALLSYMS=y | ||
84 | # CONFIG_KALLSYMS_ALL is not set | ||
85 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
86 | CONFIG_HOTPLUG=y | ||
87 | CONFIG_PRINTK=y | ||
88 | CONFIG_BUG=y | ||
89 | # CONFIG_ELF_CORE is not set | ||
90 | # CONFIG_BASE_FULL is not set | ||
91 | # CONFIG_FUTEX is not set | ||
92 | CONFIG_ANON_INODES=y | ||
93 | CONFIG_EPOLL=y | ||
94 | CONFIG_SIGNALFD=y | ||
95 | CONFIG_EVENTFD=y | ||
96 | CONFIG_SHMEM=y | ||
97 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
98 | CONFIG_SLUB_DEBUG=y | ||
99 | # CONFIG_SLAB is not set | ||
100 | CONFIG_SLUB=y | ||
101 | # CONFIG_SLOB is not set | ||
102 | # CONFIG_TINY_SHMEM is not set | ||
103 | CONFIG_BASE_SMALL=1 | ||
104 | # CONFIG_MODULES is not set | ||
105 | CONFIG_BLOCK=y | ||
106 | # CONFIG_LBD is not set | ||
107 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
108 | # CONFIG_LSF is not set | ||
109 | # CONFIG_BLK_DEV_BSG is not set | ||
110 | |||
111 | # | ||
112 | # IO Schedulers | ||
113 | # | ||
114 | CONFIG_IOSCHED_NOOP=y | ||
115 | # CONFIG_IOSCHED_AS is not set | ||
116 | CONFIG_IOSCHED_DEADLINE=y | ||
117 | # CONFIG_IOSCHED_CFQ is not set | ||
118 | # CONFIG_DEFAULT_AS is not set | ||
119 | CONFIG_DEFAULT_DEADLINE=y | ||
120 | # CONFIG_DEFAULT_CFQ is not set | ||
121 | # CONFIG_DEFAULT_NOOP is not set | ||
122 | CONFIG_DEFAULT_IOSCHED="deadline" | ||
123 | |||
124 | # | ||
125 | # Platform support | ||
126 | # | ||
127 | # CONFIG_PPC_MPC52xx is not set | ||
128 | # CONFIG_PPC_MPC5200 is not set | ||
129 | # CONFIG_PPC_CELL is not set | ||
130 | # CONFIG_PPC_CELL_NATIVE is not set | ||
131 | CONFIG_CPM1=y | ||
132 | # CONFIG_MPC8XXFADS is not set | ||
133 | # CONFIG_MPC86XADS is not set | ||
134 | # CONFIG_MPC885ADS is not set | ||
135 | # CONFIG_PPC_EP88XC is not set | ||
136 | CONFIG_PPC_ADDER875=y | ||
137 | |||
138 | # | ||
139 | # MPC8xx CPM Options | ||
140 | # | ||
141 | |||
142 | # | ||
143 | # Generic MPC8xx Options | ||
144 | # | ||
145 | CONFIG_8xx_COPYBACK=y | ||
146 | # CONFIG_8xx_CPU6 is not set | ||
147 | CONFIG_8xx_CPU15=y | ||
148 | CONFIG_NO_UCODE_PATCH=y | ||
149 | # CONFIG_USB_SOF_UCODE_PATCH is not set | ||
150 | # CONFIG_I2C_SPI_UCODE_PATCH is not set | ||
151 | # CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set | ||
152 | # CONFIG_PQ2ADS is not set | ||
153 | # CONFIG_MPIC is not set | ||
154 | # CONFIG_MPIC_WEIRD is not set | ||
155 | # CONFIG_PPC_I8259 is not set | ||
156 | # CONFIG_PPC_RTAS is not set | ||
157 | # CONFIG_MMIO_NVRAM is not set | ||
158 | # CONFIG_PPC_MPC106 is not set | ||
159 | # CONFIG_PPC_970_NAP is not set | ||
160 | # CONFIG_PPC_INDIRECT_IO is not set | ||
161 | # CONFIG_GENERIC_IOMAP is not set | ||
162 | # CONFIG_CPU_FREQ is not set | ||
163 | # CONFIG_CPM2 is not set | ||
164 | CONFIG_PPC_CPM_NEW_BINDING=y | ||
165 | # CONFIG_FSL_ULI1575 is not set | ||
166 | CONFIG_CPM=y | ||
167 | |||
168 | # | ||
169 | # Kernel options | ||
170 | # | ||
171 | # CONFIG_HIGHMEM is not set | ||
172 | # CONFIG_TICK_ONESHOT is not set | ||
173 | # CONFIG_NO_HZ is not set | ||
174 | # CONFIG_HIGH_RES_TIMERS is not set | ||
175 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
176 | # CONFIG_HZ_100 is not set | ||
177 | # CONFIG_HZ_250 is not set | ||
178 | # CONFIG_HZ_300 is not set | ||
179 | CONFIG_HZ_1000=y | ||
180 | CONFIG_HZ=1000 | ||
181 | CONFIG_PREEMPT_NONE=y | ||
182 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
183 | # CONFIG_PREEMPT is not set | ||
184 | CONFIG_BINFMT_ELF=y | ||
185 | # CONFIG_BINFMT_MISC is not set | ||
186 | # CONFIG_MATH_EMULATION is not set | ||
187 | # CONFIG_8XX_MINIMAL_FPEMU is not set | ||
188 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
189 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
190 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
191 | CONFIG_SELECT_MEMORY_MODEL=y | ||
192 | CONFIG_FLATMEM_MANUAL=y | ||
193 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
194 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
195 | CONFIG_FLATMEM=y | ||
196 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
197 | # CONFIG_SPARSEMEM_STATIC is not set | ||
198 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
199 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
200 | # CONFIG_RESOURCES_64BIT is not set | ||
201 | CONFIG_ZONE_DMA_FLAG=1 | ||
202 | CONFIG_BOUNCE=y | ||
203 | CONFIG_VIRT_TO_BUS=y | ||
204 | # CONFIG_PROC_DEVICETREE is not set | ||
205 | # CONFIG_CMDLINE_BOOL is not set | ||
206 | # CONFIG_PM is not set | ||
207 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
208 | CONFIG_HIBERNATION_UP_POSSIBLE=y | ||
209 | # CONFIG_SECCOMP is not set | ||
210 | CONFIG_WANT_DEVICE_TREE=y | ||
211 | CONFIG_DEVICE_TREE="adder875-uboot.dts" | ||
212 | CONFIG_ISA_DMA_API=y | ||
213 | |||
214 | # | ||
215 | # Bus options | ||
216 | # | ||
217 | CONFIG_ZONE_DMA=y | ||
218 | CONFIG_FSL_SOC=y | ||
219 | # CONFIG_PCI is not set | ||
220 | # CONFIG_PCI_DOMAINS is not set | ||
221 | # CONFIG_PCI_SYSCALL is not set | ||
222 | # CONFIG_PCI_QSPAN is not set | ||
223 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
224 | # CONFIG_PCCARD is not set | ||
225 | |||
226 | # | ||
227 | # Advanced setup | ||
228 | # | ||
229 | # CONFIG_ADVANCED_OPTIONS is not set | ||
230 | |||
231 | # | ||
232 | # Default settings for advanced configuration options are used | ||
233 | # | ||
234 | CONFIG_HIGHMEM_START=0xfe000000 | ||
235 | CONFIG_LOWMEM_SIZE=0x30000000 | ||
236 | CONFIG_KERNEL_START=0xc0000000 | ||
237 | CONFIG_TASK_SIZE=0x80000000 | ||
238 | CONFIG_CONSISTENT_START=0xfd000000 | ||
239 | CONFIG_CONSISTENT_SIZE=0x00200000 | ||
240 | CONFIG_BOOT_LOAD=0x00400000 | ||
241 | |||
242 | # | ||
243 | # Networking | ||
244 | # | ||
245 | CONFIG_NET=y | ||
246 | |||
247 | # | ||
248 | # Networking options | ||
249 | # | ||
250 | CONFIG_PACKET=y | ||
251 | # CONFIG_PACKET_MMAP is not set | ||
252 | CONFIG_UNIX=y | ||
253 | # CONFIG_NET_KEY is not set | ||
254 | CONFIG_INET=y | ||
255 | CONFIG_IP_MULTICAST=y | ||
256 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
257 | CONFIG_IP_FIB_HASH=y | ||
258 | CONFIG_IP_PNP=y | ||
259 | # CONFIG_IP_PNP_DHCP is not set | ||
260 | # CONFIG_IP_PNP_BOOTP is not set | ||
261 | # CONFIG_IP_PNP_RARP is not set | ||
262 | # CONFIG_NET_IPIP is not set | ||
263 | # CONFIG_NET_IPGRE is not set | ||
264 | # CONFIG_IP_MROUTE is not set | ||
265 | # CONFIG_ARPD is not set | ||
266 | CONFIG_SYN_COOKIES=y | ||
267 | # CONFIG_INET_AH is not set | ||
268 | # CONFIG_INET_ESP is not set | ||
269 | # CONFIG_INET_IPCOMP is not set | ||
270 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
271 | # CONFIG_INET_TUNNEL is not set | ||
272 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
273 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
274 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
275 | # CONFIG_INET_LRO is not set | ||
276 | CONFIG_INET_DIAG=y | ||
277 | CONFIG_INET_TCP_DIAG=y | ||
278 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
279 | CONFIG_TCP_CONG_CUBIC=y | ||
280 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
281 | # CONFIG_TCP_MD5SIG is not set | ||
282 | # CONFIG_IPV6 is not set | ||
283 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
284 | # CONFIG_INET6_TUNNEL is not set | ||
285 | # CONFIG_NETWORK_SECMARK is not set | ||
286 | # CONFIG_NETFILTER is not set | ||
287 | # CONFIG_IP_DCCP is not set | ||
288 | # CONFIG_IP_SCTP is not set | ||
289 | # CONFIG_TIPC is not set | ||
290 | # CONFIG_ATM is not set | ||
291 | # CONFIG_BRIDGE is not set | ||
292 | # CONFIG_VLAN_8021Q is not set | ||
293 | # CONFIG_DECNET is not set | ||
294 | # CONFIG_LLC2 is not set | ||
295 | # CONFIG_IPX is not set | ||
296 | # CONFIG_ATALK is not set | ||
297 | # CONFIG_X25 is not set | ||
298 | # CONFIG_LAPB is not set | ||
299 | # CONFIG_ECONET is not set | ||
300 | # CONFIG_WAN_ROUTER is not set | ||
301 | # CONFIG_NET_SCHED is not set | ||
302 | |||
303 | # | ||
304 | # Network testing | ||
305 | # | ||
306 | # CONFIG_NET_PKTGEN is not set | ||
307 | # CONFIG_HAMRADIO is not set | ||
308 | # CONFIG_IRDA is not set | ||
309 | # CONFIG_BT is not set | ||
310 | # CONFIG_AF_RXRPC is not set | ||
311 | |||
312 | # | ||
313 | # Wireless | ||
314 | # | ||
315 | # CONFIG_CFG80211 is not set | ||
316 | # CONFIG_WIRELESS_EXT is not set | ||
317 | # CONFIG_MAC80211 is not set | ||
318 | # CONFIG_IEEE80211 is not set | ||
319 | # CONFIG_RFKILL is not set | ||
320 | # CONFIG_NET_9P is not set | ||
321 | |||
322 | # | ||
323 | # Device Drivers | ||
324 | # | ||
325 | |||
326 | # | ||
327 | # Generic Driver Options | ||
328 | # | ||
329 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
330 | CONFIG_STANDALONE=y | ||
331 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
332 | # CONFIG_FW_LOADER is not set | ||
333 | # CONFIG_DEBUG_DRIVER is not set | ||
334 | # CONFIG_DEBUG_DEVRES is not set | ||
335 | # CONFIG_SYS_HYPERVISOR is not set | ||
336 | # CONFIG_CONNECTOR is not set | ||
337 | CONFIG_MTD=y | ||
338 | # CONFIG_MTD_DEBUG is not set | ||
339 | # CONFIG_MTD_CONCAT is not set | ||
340 | # CONFIG_MTD_PARTITIONS is not set | ||
341 | |||
342 | # | ||
343 | # User Modules And Translation Layers | ||
344 | # | ||
345 | CONFIG_MTD_CHAR=y | ||
346 | CONFIG_MTD_BLKDEVS=y | ||
347 | CONFIG_MTD_BLOCK=y | ||
348 | # CONFIG_FTL is not set | ||
349 | # CONFIG_NFTL is not set | ||
350 | # CONFIG_INFTL is not set | ||
351 | # CONFIG_RFD_FTL is not set | ||
352 | # CONFIG_SSFDC is not set | ||
353 | # CONFIG_MTD_OOPS is not set | ||
354 | |||
355 | # | ||
356 | # RAM/ROM/Flash chip drivers | ||
357 | # | ||
358 | CONFIG_MTD_CFI=y | ||
359 | # CONFIG_MTD_JEDECPROBE is not set | ||
360 | CONFIG_MTD_GEN_PROBE=y | ||
361 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
362 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
363 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
364 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
365 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
366 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
367 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
368 | CONFIG_MTD_CFI_I1=y | ||
369 | CONFIG_MTD_CFI_I2=y | ||
370 | # CONFIG_MTD_CFI_I4 is not set | ||
371 | # CONFIG_MTD_CFI_I8 is not set | ||
372 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
373 | CONFIG_MTD_CFI_AMDSTD=y | ||
374 | # CONFIG_MTD_CFI_STAA is not set | ||
375 | CONFIG_MTD_CFI_UTIL=y | ||
376 | # CONFIG_MTD_RAM is not set | ||
377 | # CONFIG_MTD_ROM is not set | ||
378 | # CONFIG_MTD_ABSENT is not set | ||
379 | |||
380 | # | ||
381 | # Mapping drivers for chip access | ||
382 | # | ||
383 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
384 | # CONFIG_MTD_PHYSMAP is not set | ||
385 | CONFIG_MTD_PHYSMAP_OF=y | ||
386 | # CONFIG_MTD_CFI_FLAGADM is not set | ||
387 | # CONFIG_MTD_PLATRAM is not set | ||
388 | |||
389 | # | ||
390 | # Self-contained MTD device drivers | ||
391 | # | ||
392 | # CONFIG_MTD_SLRAM is not set | ||
393 | # CONFIG_MTD_PHRAM is not set | ||
394 | # CONFIG_MTD_MTDRAM is not set | ||
395 | # CONFIG_MTD_BLOCK2MTD is not set | ||
396 | |||
397 | # | ||
398 | # Disk-On-Chip Device Drivers | ||
399 | # | ||
400 | # CONFIG_MTD_DOC2000 is not set | ||
401 | # CONFIG_MTD_DOC2001 is not set | ||
402 | # CONFIG_MTD_DOC2001PLUS is not set | ||
403 | # CONFIG_MTD_NAND is not set | ||
404 | # CONFIG_MTD_ONENAND is not set | ||
405 | |||
406 | # | ||
407 | # UBI - Unsorted block images | ||
408 | # | ||
409 | # CONFIG_MTD_UBI is not set | ||
410 | CONFIG_OF_DEVICE=y | ||
411 | # CONFIG_PARPORT is not set | ||
412 | # CONFIG_BLK_DEV is not set | ||
413 | # CONFIG_MISC_DEVICES is not set | ||
414 | # CONFIG_IDE is not set | ||
415 | |||
416 | # | ||
417 | # SCSI device support | ||
418 | # | ||
419 | # CONFIG_RAID_ATTRS is not set | ||
420 | # CONFIG_SCSI is not set | ||
421 | # CONFIG_SCSI_DMA is not set | ||
422 | # CONFIG_SCSI_NETLINK is not set | ||
423 | # CONFIG_ATA is not set | ||
424 | # CONFIG_MD is not set | ||
425 | # CONFIG_MACINTOSH_DRIVERS is not set | ||
426 | CONFIG_NETDEVICES=y | ||
427 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
428 | # CONFIG_DUMMY is not set | ||
429 | # CONFIG_BONDING is not set | ||
430 | # CONFIG_MACVLAN is not set | ||
431 | # CONFIG_EQUALIZER is not set | ||
432 | # CONFIG_TUN is not set | ||
433 | # CONFIG_VETH is not set | ||
434 | CONFIG_PHYLIB=y | ||
435 | |||
436 | # | ||
437 | # MII PHY device drivers | ||
438 | # | ||
439 | # CONFIG_MARVELL_PHY is not set | ||
440 | CONFIG_DAVICOM_PHY=y | ||
441 | # CONFIG_QSEMI_PHY is not set | ||
442 | # CONFIG_LXT_PHY is not set | ||
443 | # CONFIG_CICADA_PHY is not set | ||
444 | # CONFIG_VITESSE_PHY is not set | ||
445 | # CONFIG_SMSC_PHY is not set | ||
446 | # CONFIG_BROADCOM_PHY is not set | ||
447 | # CONFIG_ICPLUS_PHY is not set | ||
448 | # CONFIG_FIXED_PHY is not set | ||
449 | # CONFIG_MDIO_BITBANG is not set | ||
450 | CONFIG_NET_ETHERNET=y | ||
451 | CONFIG_MII=y | ||
452 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
453 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
454 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
455 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
456 | # CONFIG_B44 is not set | ||
457 | CONFIG_FS_ENET=y | ||
458 | # CONFIG_FS_ENET_HAS_SCC is not set | ||
459 | CONFIG_FS_ENET_HAS_FEC=y | ||
460 | CONFIG_FS_ENET_MDIO_FEC=y | ||
461 | # CONFIG_NETDEV_1000 is not set | ||
462 | # CONFIG_NETDEV_10000 is not set | ||
463 | |||
464 | # | ||
465 | # Wireless LAN | ||
466 | # | ||
467 | # CONFIG_WLAN_PRE80211 is not set | ||
468 | # CONFIG_WLAN_80211 is not set | ||
469 | # CONFIG_WAN is not set | ||
470 | # CONFIG_PPP is not set | ||
471 | # CONFIG_SLIP is not set | ||
472 | # CONFIG_SHAPER is not set | ||
473 | # CONFIG_NETCONSOLE is not set | ||
474 | # CONFIG_NETPOLL is not set | ||
475 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
476 | # CONFIG_ISDN is not set | ||
477 | # CONFIG_PHONE is not set | ||
478 | |||
479 | # | ||
480 | # Input device support | ||
481 | # | ||
482 | CONFIG_INPUT=y | ||
483 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
484 | # CONFIG_INPUT_POLLDEV is not set | ||
485 | |||
486 | # | ||
487 | # Userland interfaces | ||
488 | # | ||
489 | CONFIG_INPUT_MOUSEDEV=y | ||
490 | CONFIG_INPUT_MOUSEDEV_PSAUX=y | ||
491 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
492 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
493 | # CONFIG_INPUT_JOYDEV is not set | ||
494 | # CONFIG_INPUT_EVDEV is not set | ||
495 | # CONFIG_INPUT_EVBUG is not set | ||
496 | |||
497 | # | ||
498 | # Input Device Drivers | ||
499 | # | ||
500 | CONFIG_INPUT_KEYBOARD=y | ||
501 | CONFIG_KEYBOARD_ATKBD=y | ||
502 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
503 | # CONFIG_KEYBOARD_LKKBD is not set | ||
504 | # CONFIG_KEYBOARD_XTKBD is not set | ||
505 | # CONFIG_KEYBOARD_NEWTON is not set | ||
506 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
507 | CONFIG_INPUT_MOUSE=y | ||
508 | CONFIG_MOUSE_PS2=y | ||
509 | CONFIG_MOUSE_PS2_ALPS=y | ||
510 | CONFIG_MOUSE_PS2_LOGIPS2PP=y | ||
511 | CONFIG_MOUSE_PS2_SYNAPTICS=y | ||
512 | CONFIG_MOUSE_PS2_LIFEBOOK=y | ||
513 | CONFIG_MOUSE_PS2_TRACKPOINT=y | ||
514 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | ||
515 | # CONFIG_MOUSE_SERIAL is not set | ||
516 | # CONFIG_MOUSE_VSXXXAA is not set | ||
517 | # CONFIG_INPUT_JOYSTICK is not set | ||
518 | # CONFIG_INPUT_TABLET is not set | ||
519 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
520 | # CONFIG_INPUT_MISC is not set | ||
521 | |||
522 | # | ||
523 | # Hardware I/O ports | ||
524 | # | ||
525 | CONFIG_SERIO=y | ||
526 | CONFIG_SERIO_I8042=y | ||
527 | CONFIG_SERIO_SERPORT=y | ||
528 | CONFIG_SERIO_LIBPS2=y | ||
529 | # CONFIG_SERIO_RAW is not set | ||
530 | # CONFIG_GAMEPORT is not set | ||
531 | |||
532 | # | ||
533 | # Character devices | ||
534 | # | ||
535 | # CONFIG_VT is not set | ||
536 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
537 | |||
538 | # | ||
539 | # Serial drivers | ||
540 | # | ||
541 | # CONFIG_SERIAL_8250 is not set | ||
542 | |||
543 | # | ||
544 | # Non-8250 serial port support | ||
545 | # | ||
546 | # CONFIG_SERIAL_UARTLITE is not set | ||
547 | CONFIG_SERIAL_CORE=y | ||
548 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
549 | CONFIG_SERIAL_CPM=y | ||
550 | CONFIG_SERIAL_CPM_CONSOLE=y | ||
551 | # CONFIG_SERIAL_CPM_SCC1 is not set | ||
552 | # CONFIG_SERIAL_CPM_SCC2 is not set | ||
553 | # CONFIG_SERIAL_CPM_SCC3 is not set | ||
554 | # CONFIG_SERIAL_CPM_SCC4 is not set | ||
555 | CONFIG_SERIAL_CPM_SMC1=y | ||
556 | CONFIG_SERIAL_CPM_SMC2=y | ||
557 | CONFIG_UNIX98_PTYS=y | ||
558 | # CONFIG_LEGACY_PTYS is not set | ||
559 | # CONFIG_IPMI_HANDLER is not set | ||
560 | CONFIG_HW_RANDOM=y | ||
561 | # CONFIG_NVRAM is not set | ||
562 | CONFIG_GEN_RTC=y | ||
563 | # CONFIG_GEN_RTC_X is not set | ||
564 | # CONFIG_R3964 is not set | ||
565 | # CONFIG_RAW_DRIVER is not set | ||
566 | # CONFIG_TCG_TPM is not set | ||
567 | # CONFIG_I2C is not set | ||
568 | |||
569 | # | ||
570 | # SPI support | ||
571 | # | ||
572 | # CONFIG_SPI is not set | ||
573 | # CONFIG_SPI_MASTER is not set | ||
574 | # CONFIG_W1 is not set | ||
575 | # CONFIG_POWER_SUPPLY is not set | ||
576 | # CONFIG_HWMON is not set | ||
577 | # CONFIG_WATCHDOG is not set | ||
578 | |||
579 | # | ||
580 | # Sonics Silicon Backplane | ||
581 | # | ||
582 | CONFIG_SSB_POSSIBLE=y | ||
583 | # CONFIG_SSB is not set | ||
584 | |||
585 | # | ||
586 | # Multifunction device drivers | ||
587 | # | ||
588 | # CONFIG_MFD_SM501 is not set | ||
589 | |||
590 | # | ||
591 | # Multimedia devices | ||
592 | # | ||
593 | # CONFIG_VIDEO_DEV is not set | ||
594 | # CONFIG_DVB_CORE is not set | ||
595 | CONFIG_DAB=y | ||
596 | |||
597 | # | ||
598 | # Graphics support | ||
599 | # | ||
600 | # CONFIG_VGASTATE is not set | ||
601 | CONFIG_VIDEO_OUTPUT_CONTROL=y | ||
602 | # CONFIG_FB is not set | ||
603 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
604 | |||
605 | # | ||
606 | # Display device support | ||
607 | # | ||
608 | # CONFIG_DISPLAY_SUPPORT is not set | ||
609 | |||
610 | # | ||
611 | # Sound | ||
612 | # | ||
613 | # CONFIG_SOUND is not set | ||
614 | # CONFIG_HID_SUPPORT is not set | ||
615 | # CONFIG_USB_SUPPORT is not set | ||
616 | # CONFIG_MMC is not set | ||
617 | # CONFIG_NEW_LEDS is not set | ||
618 | # CONFIG_EDAC is not set | ||
619 | # CONFIG_RTC_CLASS is not set | ||
620 | |||
621 | # | ||
622 | # Userspace I/O | ||
623 | # | ||
624 | # CONFIG_UIO is not set | ||
625 | |||
626 | # | ||
627 | # File systems | ||
628 | # | ||
629 | # CONFIG_EXT2_FS is not set | ||
630 | # CONFIG_EXT3_FS is not set | ||
631 | # CONFIG_EXT4DEV_FS is not set | ||
632 | # CONFIG_REISERFS_FS is not set | ||
633 | # CONFIG_JFS_FS is not set | ||
634 | # CONFIG_FS_POSIX_ACL is not set | ||
635 | # CONFIG_XFS_FS is not set | ||
636 | # CONFIG_GFS2_FS is not set | ||
637 | # CONFIG_OCFS2_FS is not set | ||
638 | # CONFIG_MINIX_FS is not set | ||
639 | # CONFIG_ROMFS_FS is not set | ||
640 | # CONFIG_INOTIFY is not set | ||
641 | # CONFIG_QUOTA is not set | ||
642 | # CONFIG_DNOTIFY is not set | ||
643 | # CONFIG_AUTOFS_FS is not set | ||
644 | # CONFIG_AUTOFS4_FS is not set | ||
645 | # CONFIG_FUSE_FS is not set | ||
646 | |||
647 | # | ||
648 | # CD-ROM/DVD Filesystems | ||
649 | # | ||
650 | # CONFIG_ISO9660_FS is not set | ||
651 | # CONFIG_UDF_FS is not set | ||
652 | |||
653 | # | ||
654 | # DOS/FAT/NT Filesystems | ||
655 | # | ||
656 | # CONFIG_MSDOS_FS is not set | ||
657 | # CONFIG_VFAT_FS is not set | ||
658 | # CONFIG_NTFS_FS is not set | ||
659 | |||
660 | # | ||
661 | # Pseudo filesystems | ||
662 | # | ||
663 | CONFIG_PROC_FS=y | ||
664 | # CONFIG_PROC_KCORE is not set | ||
665 | CONFIG_PROC_SYSCTL=y | ||
666 | CONFIG_SYSFS=y | ||
667 | CONFIG_TMPFS=y | ||
668 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
669 | # CONFIG_HUGETLB_PAGE is not set | ||
670 | # CONFIG_CONFIGFS_FS is not set | ||
671 | |||
672 | # | ||
673 | # Miscellaneous filesystems | ||
674 | # | ||
675 | # CONFIG_ADFS_FS is not set | ||
676 | # CONFIG_AFFS_FS is not set | ||
677 | # CONFIG_HFS_FS is not set | ||
678 | # CONFIG_HFSPLUS_FS is not set | ||
679 | # CONFIG_BEFS_FS is not set | ||
680 | # CONFIG_BFS_FS is not set | ||
681 | # CONFIG_EFS_FS is not set | ||
682 | # CONFIG_JFFS2_FS is not set | ||
683 | CONFIG_CRAMFS=y | ||
684 | # CONFIG_VXFS_FS is not set | ||
685 | # CONFIG_HPFS_FS is not set | ||
686 | # CONFIG_QNX4FS_FS is not set | ||
687 | # CONFIG_SYSV_FS is not set | ||
688 | # CONFIG_UFS_FS is not set | ||
689 | CONFIG_NETWORK_FILESYSTEMS=y | ||
690 | CONFIG_NFS_FS=y | ||
691 | CONFIG_NFS_V3=y | ||
692 | # CONFIG_NFS_V3_ACL is not set | ||
693 | # CONFIG_NFS_V4 is not set | ||
694 | # CONFIG_NFS_DIRECTIO is not set | ||
695 | # CONFIG_NFSD is not set | ||
696 | CONFIG_ROOT_NFS=y | ||
697 | CONFIG_LOCKD=y | ||
698 | CONFIG_LOCKD_V4=y | ||
699 | CONFIG_NFS_COMMON=y | ||
700 | CONFIG_SUNRPC=y | ||
701 | # CONFIG_SUNRPC_BIND34 is not set | ||
702 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
703 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
704 | # CONFIG_SMB_FS is not set | ||
705 | # CONFIG_CIFS is not set | ||
706 | # CONFIG_NCP_FS is not set | ||
707 | # CONFIG_CODA_FS is not set | ||
708 | # CONFIG_AFS_FS is not set | ||
709 | |||
710 | # | ||
711 | # Partition Types | ||
712 | # | ||
713 | CONFIG_PARTITION_ADVANCED=y | ||
714 | # CONFIG_ACORN_PARTITION is not set | ||
715 | # CONFIG_OSF_PARTITION is not set | ||
716 | # CONFIG_AMIGA_PARTITION is not set | ||
717 | # CONFIG_ATARI_PARTITION is not set | ||
718 | # CONFIG_MAC_PARTITION is not set | ||
719 | CONFIG_MSDOS_PARTITION=y | ||
720 | # CONFIG_BSD_DISKLABEL is not set | ||
721 | # CONFIG_MINIX_SUBPARTITION is not set | ||
722 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
723 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
724 | # CONFIG_LDM_PARTITION is not set | ||
725 | # CONFIG_SGI_PARTITION is not set | ||
726 | # CONFIG_ULTRIX_PARTITION is not set | ||
727 | # CONFIG_SUN_PARTITION is not set | ||
728 | # CONFIG_KARMA_PARTITION is not set | ||
729 | # CONFIG_EFI_PARTITION is not set | ||
730 | # CONFIG_SYSV68_PARTITION is not set | ||
731 | # CONFIG_NLS is not set | ||
732 | # CONFIG_DLM is not set | ||
733 | # CONFIG_UCC_SLOW is not set | ||
734 | |||
735 | # | ||
736 | # Library routines | ||
737 | # | ||
738 | # CONFIG_CRC_CCITT is not set | ||
739 | # CONFIG_CRC16 is not set | ||
740 | # CONFIG_CRC_ITU_T is not set | ||
741 | # CONFIG_CRC32 is not set | ||
742 | # CONFIG_CRC7 is not set | ||
743 | # CONFIG_LIBCRC32C is not set | ||
744 | CONFIG_ZLIB_INFLATE=y | ||
745 | CONFIG_HAS_IOMEM=y | ||
746 | CONFIG_HAS_IOPORT=y | ||
747 | CONFIG_HAS_DMA=y | ||
748 | CONFIG_INSTRUMENTATION=y | ||
749 | # CONFIG_PROFILING is not set | ||
750 | # CONFIG_MARKERS is not set | ||
751 | |||
752 | # | ||
753 | # Kernel hacking | ||
754 | # | ||
755 | # CONFIG_PRINTK_TIME is not set | ||
756 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
757 | CONFIG_ENABLE_MUST_CHECK=y | ||
758 | CONFIG_MAGIC_SYSRQ=y | ||
759 | # CONFIG_UNUSED_SYMBOLS is not set | ||
760 | # CONFIG_DEBUG_FS is not set | ||
761 | # CONFIG_HEADERS_CHECK is not set | ||
762 | CONFIG_DEBUG_KERNEL=y | ||
763 | # CONFIG_DEBUG_SHIRQ is not set | ||
764 | CONFIG_DETECT_SOFTLOCKUP=y | ||
765 | CONFIG_SCHED_DEBUG=y | ||
766 | # CONFIG_SCHEDSTATS is not set | ||
767 | # CONFIG_TIMER_STATS is not set | ||
768 | # CONFIG_SLUB_DEBUG_ON is not set | ||
769 | # CONFIG_DEBUG_SPINLOCK is not set | ||
770 | # CONFIG_DEBUG_MUTEXES is not set | ||
771 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
772 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
773 | # CONFIG_DEBUG_KOBJECT is not set | ||
774 | CONFIG_DEBUG_BUGVERBOSE=y | ||
775 | CONFIG_DEBUG_INFO=y | ||
776 | # CONFIG_DEBUG_VM is not set | ||
777 | # CONFIG_DEBUG_LIST is not set | ||
778 | # CONFIG_DEBUG_SG is not set | ||
779 | CONFIG_FORCED_INLINING=y | ||
780 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
781 | # CONFIG_FAULT_INJECTION is not set | ||
782 | # CONFIG_SAMPLES is not set | ||
783 | # CONFIG_DEBUG_STACKOVERFLOW is not set | ||
784 | # CONFIG_DEBUG_STACK_USAGE is not set | ||
785 | # CONFIG_DEBUG_PAGEALLOC is not set | ||
786 | # CONFIG_DEBUGGER is not set | ||
787 | # CONFIG_BDI_SWITCH is not set | ||
788 | # CONFIG_PPC_EARLY_DEBUG is not set | ||
789 | |||
790 | # | ||
791 | # Security options | ||
792 | # | ||
793 | # CONFIG_KEYS is not set | ||
794 | # CONFIG_SECURITY is not set | ||
795 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
796 | # CONFIG_CRYPTO is not set | ||
797 | # CONFIG_PPC_CLOCK is not set | ||
798 | CONFIG_PPC_LIB_RHEAP=y | ||
diff --git a/arch/powerpc/configs/adder875-redboot_defconfig b/arch/powerpc/configs/adder875_defconfig index cab5f9b64567..a3cc94a2ff06 100644 --- a/arch/powerpc/configs/adder875-redboot_defconfig +++ b/arch/powerpc/configs/adder875_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.24-rc6 | 3 | # Linux kernel version: 2.6.25-rc2 |
4 | # Thu Jan 17 16:17:38 2008 | 4 | # Wed Feb 20 12:26:07 2008 |
5 | # | 5 | # |
6 | # CONFIG_PPC64 is not set | 6 | # CONFIG_PPC64 is not set |
7 | 7 | ||
@@ -26,6 +26,7 @@ CONFIG_GENERIC_TIME=y | |||
26 | CONFIG_GENERIC_TIME_VSYSCALL=y | 26 | CONFIG_GENERIC_TIME_VSYSCALL=y |
27 | CONFIG_GENERIC_CLOCKEVENTS=y | 27 | CONFIG_GENERIC_CLOCKEVENTS=y |
28 | CONFIG_GENERIC_HARDIRQS=y | 28 | CONFIG_GENERIC_HARDIRQS=y |
29 | # CONFIG_HAVE_SETUP_PER_CPU_AREA is not set | ||
29 | CONFIG_IRQ_PER_CPU=y | 30 | CONFIG_IRQ_PER_CPU=y |
30 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 31 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
31 | CONFIG_ARCH_HAS_ILOG2_U32=y | 32 | CONFIG_ARCH_HAS_ILOG2_U32=y |
@@ -64,17 +65,18 @@ CONFIG_SYSVIPC_SYSCTL=y | |||
64 | # CONFIG_POSIX_MQUEUE is not set | 65 | # CONFIG_POSIX_MQUEUE is not set |
65 | # CONFIG_BSD_PROCESS_ACCT is not set | 66 | # CONFIG_BSD_PROCESS_ACCT is not set |
66 | # CONFIG_TASKSTATS is not set | 67 | # CONFIG_TASKSTATS is not set |
67 | # CONFIG_USER_NS is not set | ||
68 | # CONFIG_PID_NS is not set | ||
69 | # CONFIG_AUDIT is not set | 68 | # CONFIG_AUDIT is not set |
70 | # CONFIG_IKCONFIG is not set | 69 | # CONFIG_IKCONFIG is not set |
71 | CONFIG_LOG_BUF_SHIFT=14 | 70 | CONFIG_LOG_BUF_SHIFT=14 |
72 | # CONFIG_CGROUPS is not set | 71 | # CONFIG_CGROUPS is not set |
72 | CONFIG_GROUP_SCHED=y | ||
73 | CONFIG_FAIR_GROUP_SCHED=y | 73 | CONFIG_FAIR_GROUP_SCHED=y |
74 | CONFIG_FAIR_USER_SCHED=y | 74 | # CONFIG_RT_GROUP_SCHED is not set |
75 | # CONFIG_FAIR_CGROUP_SCHED is not set | 75 | CONFIG_USER_SCHED=y |
76 | # CONFIG_CGROUP_SCHED is not set | ||
76 | CONFIG_SYSFS_DEPRECATED=y | 77 | CONFIG_SYSFS_DEPRECATED=y |
77 | # CONFIG_RELAY is not set | 78 | # CONFIG_RELAY is not set |
79 | # CONFIG_NAMESPACES is not set | ||
78 | # CONFIG_BLK_DEV_INITRD is not set | 80 | # CONFIG_BLK_DEV_INITRD is not set |
79 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | 81 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set |
80 | CONFIG_SYSCTL=y | 82 | CONFIG_SYSCTL=y |
@@ -87,11 +89,13 @@ CONFIG_HOTPLUG=y | |||
87 | CONFIG_PRINTK=y | 89 | CONFIG_PRINTK=y |
88 | CONFIG_BUG=y | 90 | CONFIG_BUG=y |
89 | # CONFIG_ELF_CORE is not set | 91 | # CONFIG_ELF_CORE is not set |
92 | CONFIG_COMPAT_BRK=y | ||
90 | # CONFIG_BASE_FULL is not set | 93 | # CONFIG_BASE_FULL is not set |
91 | # CONFIG_FUTEX is not set | 94 | # CONFIG_FUTEX is not set |
92 | CONFIG_ANON_INODES=y | 95 | CONFIG_ANON_INODES=y |
93 | CONFIG_EPOLL=y | 96 | CONFIG_EPOLL=y |
94 | CONFIG_SIGNALFD=y | 97 | CONFIG_SIGNALFD=y |
98 | CONFIG_TIMERFD=y | ||
95 | CONFIG_EVENTFD=y | 99 | CONFIG_EVENTFD=y |
96 | CONFIG_SHMEM=y | 100 | CONFIG_SHMEM=y |
97 | # CONFIG_VM_EVENT_COUNTERS is not set | 101 | # CONFIG_VM_EVENT_COUNTERS is not set |
@@ -99,6 +103,12 @@ CONFIG_SLUB_DEBUG=y | |||
99 | # CONFIG_SLAB is not set | 103 | # CONFIG_SLAB is not set |
100 | CONFIG_SLUB=y | 104 | CONFIG_SLUB=y |
101 | # CONFIG_SLOB is not set | 105 | # CONFIG_SLOB is not set |
106 | # CONFIG_PROFILING is not set | ||
107 | # CONFIG_MARKERS is not set | ||
108 | CONFIG_HAVE_OPROFILE=y | ||
109 | CONFIG_HAVE_KPROBES=y | ||
110 | CONFIG_PROC_PAGE_MONITOR=y | ||
111 | CONFIG_SLABINFO=y | ||
102 | # CONFIG_TINY_SHMEM is not set | 112 | # CONFIG_TINY_SHMEM is not set |
103 | CONFIG_BASE_SMALL=1 | 113 | CONFIG_BASE_SMALL=1 |
104 | # CONFIG_MODULES is not set | 114 | # CONFIG_MODULES is not set |
@@ -120,12 +130,14 @@ CONFIG_DEFAULT_DEADLINE=y | |||
120 | # CONFIG_DEFAULT_CFQ is not set | 130 | # CONFIG_DEFAULT_CFQ is not set |
121 | # CONFIG_DEFAULT_NOOP is not set | 131 | # CONFIG_DEFAULT_NOOP is not set |
122 | CONFIG_DEFAULT_IOSCHED="deadline" | 132 | CONFIG_DEFAULT_IOSCHED="deadline" |
133 | CONFIG_CLASSIC_RCU=y | ||
134 | # CONFIG_PREEMPT_RCU is not set | ||
123 | 135 | ||
124 | # | 136 | # |
125 | # Platform support | 137 | # Platform support |
126 | # | 138 | # |
127 | # CONFIG_PPC_MPC52xx is not set | 139 | # CONFIG_PPC_MPC512x is not set |
128 | # CONFIG_PPC_MPC5200 is not set | 140 | # CONFIG_PPC_MPC5121 is not set |
129 | # CONFIG_PPC_CELL is not set | 141 | # CONFIG_PPC_CELL is not set |
130 | # CONFIG_PPC_CELL_NATIVE is not set | 142 | # CONFIG_PPC_CELL_NATIVE is not set |
131 | CONFIG_CPM1=y | 143 | CONFIG_CPM1=y |
@@ -150,6 +162,7 @@ CONFIG_NO_UCODE_PATCH=y | |||
150 | # CONFIG_I2C_SPI_UCODE_PATCH is not set | 162 | # CONFIG_I2C_SPI_UCODE_PATCH is not set |
151 | # CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set | 163 | # CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set |
152 | # CONFIG_PQ2ADS is not set | 164 | # CONFIG_PQ2ADS is not set |
165 | # CONFIG_IPIC is not set | ||
153 | # CONFIG_MPIC is not set | 166 | # CONFIG_MPIC is not set |
154 | # CONFIG_MPIC_WEIRD is not set | 167 | # CONFIG_MPIC_WEIRD is not set |
155 | # CONFIG_PPC_I8259 is not set | 168 | # CONFIG_PPC_I8259 is not set |
@@ -160,7 +173,6 @@ CONFIG_NO_UCODE_PATCH=y | |||
160 | # CONFIG_PPC_INDIRECT_IO is not set | 173 | # CONFIG_PPC_INDIRECT_IO is not set |
161 | # CONFIG_GENERIC_IOMAP is not set | 174 | # CONFIG_GENERIC_IOMAP is not set |
162 | # CONFIG_CPU_FREQ is not set | 175 | # CONFIG_CPU_FREQ is not set |
163 | # CONFIG_CPM2 is not set | ||
164 | CONFIG_PPC_CPM_NEW_BINDING=y | 176 | CONFIG_PPC_CPM_NEW_BINDING=y |
165 | # CONFIG_FSL_ULI1575 is not set | 177 | # CONFIG_FSL_ULI1575 is not set |
166 | CONFIG_CPM=y | 178 | CONFIG_CPM=y |
@@ -178,14 +190,19 @@ CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | |||
178 | # CONFIG_HZ_300 is not set | 190 | # CONFIG_HZ_300 is not set |
179 | CONFIG_HZ_1000=y | 191 | CONFIG_HZ_1000=y |
180 | CONFIG_HZ=1000 | 192 | CONFIG_HZ=1000 |
193 | # CONFIG_SCHED_HRTICK is not set | ||
181 | CONFIG_PREEMPT_NONE=y | 194 | CONFIG_PREEMPT_NONE=y |
182 | # CONFIG_PREEMPT_VOLUNTARY is not set | 195 | # CONFIG_PREEMPT_VOLUNTARY is not set |
183 | # CONFIG_PREEMPT is not set | 196 | # CONFIG_PREEMPT is not set |
197 | CONFIG_RCU_TRACE=y | ||
184 | CONFIG_BINFMT_ELF=y | 198 | CONFIG_BINFMT_ELF=y |
185 | # CONFIG_BINFMT_MISC is not set | 199 | # CONFIG_BINFMT_MISC is not set |
186 | # CONFIG_MATH_EMULATION is not set | 200 | # CONFIG_MATH_EMULATION is not set |
187 | # CONFIG_8XX_MINIMAL_FPEMU is not set | 201 | # CONFIG_8XX_MINIMAL_FPEMU is not set |
202 | # CONFIG_IOMMU_HELPER is not set | ||
188 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 203 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
204 | CONFIG_ARCH_HAS_WALK_MEMORY=y | ||
205 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
189 | CONFIG_ARCH_FLATMEM_ENABLE=y | 206 | CONFIG_ARCH_FLATMEM_ENABLE=y |
190 | CONFIG_ARCH_POPULATES_NODE_MAP=y | 207 | CONFIG_ARCH_POPULATES_NODE_MAP=y |
191 | CONFIG_SELECT_MEMORY_MODEL=y | 208 | CONFIG_SELECT_MEMORY_MODEL=y |
@@ -204,11 +221,7 @@ CONFIG_VIRT_TO_BUS=y | |||
204 | # CONFIG_PROC_DEVICETREE is not set | 221 | # CONFIG_PROC_DEVICETREE is not set |
205 | # CONFIG_CMDLINE_BOOL is not set | 222 | # CONFIG_CMDLINE_BOOL is not set |
206 | # CONFIG_PM is not set | 223 | # CONFIG_PM is not set |
207 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
208 | CONFIG_HIBERNATION_UP_POSSIBLE=y | ||
209 | # CONFIG_SECCOMP is not set | 224 | # CONFIG_SECCOMP is not set |
210 | CONFIG_WANT_DEVICE_TREE=y | ||
211 | CONFIG_DEVICE_TREE="adder875-redboot.dts" | ||
212 | CONFIG_ISA_DMA_API=y | 225 | CONFIG_ISA_DMA_API=y |
213 | 226 | ||
214 | # | 227 | # |
@@ -305,6 +318,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
305 | # | 318 | # |
306 | # CONFIG_NET_PKTGEN is not set | 319 | # CONFIG_NET_PKTGEN is not set |
307 | # CONFIG_HAMRADIO is not set | 320 | # CONFIG_HAMRADIO is not set |
321 | # CONFIG_CAN is not set | ||
308 | # CONFIG_IRDA is not set | 322 | # CONFIG_IRDA is not set |
309 | # CONFIG_BT is not set | 323 | # CONFIG_BT is not set |
310 | # CONFIG_AF_RXRPC is not set | 324 | # CONFIG_AF_RXRPC is not set |
@@ -411,6 +425,7 @@ CONFIG_OF_DEVICE=y | |||
411 | # CONFIG_PARPORT is not set | 425 | # CONFIG_PARPORT is not set |
412 | # CONFIG_BLK_DEV is not set | 426 | # CONFIG_BLK_DEV is not set |
413 | # CONFIG_MISC_DEVICES is not set | 427 | # CONFIG_MISC_DEVICES is not set |
428 | CONFIG_HAVE_IDE=y | ||
414 | # CONFIG_IDE is not set | 429 | # CONFIG_IDE is not set |
415 | 430 | ||
416 | # | 431 | # |
@@ -445,6 +460,7 @@ CONFIG_DAVICOM_PHY=y | |||
445 | # CONFIG_SMSC_PHY is not set | 460 | # CONFIG_SMSC_PHY is not set |
446 | # CONFIG_BROADCOM_PHY is not set | 461 | # CONFIG_BROADCOM_PHY is not set |
447 | # CONFIG_ICPLUS_PHY is not set | 462 | # CONFIG_ICPLUS_PHY is not set |
463 | # CONFIG_REALTEK_PHY is not set | ||
448 | # CONFIG_FIXED_PHY is not set | 464 | # CONFIG_FIXED_PHY is not set |
449 | # CONFIG_MDIO_BITBANG is not set | 465 | # CONFIG_MDIO_BITBANG is not set |
450 | CONFIG_NET_ETHERNET=y | 466 | CONFIG_NET_ETHERNET=y |
@@ -469,7 +485,6 @@ CONFIG_FS_ENET_MDIO_FEC=y | |||
469 | # CONFIG_WAN is not set | 485 | # CONFIG_WAN is not set |
470 | # CONFIG_PPP is not set | 486 | # CONFIG_PPP is not set |
471 | # CONFIG_SLIP is not set | 487 | # CONFIG_SLIP is not set |
472 | # CONFIG_SHAPER is not set | ||
473 | # CONFIG_NETCONSOLE is not set | 488 | # CONFIG_NETCONSOLE is not set |
474 | # CONFIG_NETPOLL is not set | 489 | # CONFIG_NETPOLL is not set |
475 | # CONFIG_NET_POLL_CONTROLLER is not set | 490 | # CONFIG_NET_POLL_CONTROLLER is not set |
@@ -574,6 +589,7 @@ CONFIG_GEN_RTC=y | |||
574 | # CONFIG_W1 is not set | 589 | # CONFIG_W1 is not set |
575 | # CONFIG_POWER_SUPPLY is not set | 590 | # CONFIG_POWER_SUPPLY is not set |
576 | # CONFIG_HWMON is not set | 591 | # CONFIG_HWMON is not set |
592 | CONFIG_THERMAL=y | ||
577 | # CONFIG_WATCHDOG is not set | 593 | # CONFIG_WATCHDOG is not set |
578 | 594 | ||
579 | # | 595 | # |
@@ -614,6 +630,7 @@ CONFIG_VIDEO_OUTPUT_CONTROL=y | |||
614 | # CONFIG_HID_SUPPORT is not set | 630 | # CONFIG_HID_SUPPORT is not set |
615 | # CONFIG_USB_SUPPORT is not set | 631 | # CONFIG_USB_SUPPORT is not set |
616 | # CONFIG_MMC is not set | 632 | # CONFIG_MMC is not set |
633 | # CONFIG_MEMSTICK is not set | ||
617 | # CONFIG_NEW_LEDS is not set | 634 | # CONFIG_NEW_LEDS is not set |
618 | # CONFIG_EDAC is not set | 635 | # CONFIG_EDAC is not set |
619 | # CONFIG_RTC_CLASS is not set | 636 | # CONFIG_RTC_CLASS is not set |
@@ -635,11 +652,9 @@ CONFIG_VIDEO_OUTPUT_CONTROL=y | |||
635 | # CONFIG_XFS_FS is not set | 652 | # CONFIG_XFS_FS is not set |
636 | # CONFIG_GFS2_FS is not set | 653 | # CONFIG_GFS2_FS is not set |
637 | # CONFIG_OCFS2_FS is not set | 654 | # CONFIG_OCFS2_FS is not set |
638 | # CONFIG_MINIX_FS is not set | 655 | # CONFIG_DNOTIFY is not set |
639 | # CONFIG_ROMFS_FS is not set | ||
640 | # CONFIG_INOTIFY is not set | 656 | # CONFIG_INOTIFY is not set |
641 | # CONFIG_QUOTA is not set | 657 | # CONFIG_QUOTA is not set |
642 | # CONFIG_DNOTIFY is not set | ||
643 | # CONFIG_AUTOFS_FS is not set | 658 | # CONFIG_AUTOFS_FS is not set |
644 | # CONFIG_AUTOFS4_FS is not set | 659 | # CONFIG_AUTOFS4_FS is not set |
645 | # CONFIG_FUSE_FS is not set | 660 | # CONFIG_FUSE_FS is not set |
@@ -682,8 +697,10 @@ CONFIG_TMPFS=y | |||
682 | # CONFIG_JFFS2_FS is not set | 697 | # CONFIG_JFFS2_FS is not set |
683 | CONFIG_CRAMFS=y | 698 | CONFIG_CRAMFS=y |
684 | # CONFIG_VXFS_FS is not set | 699 | # CONFIG_VXFS_FS is not set |
700 | # CONFIG_MINIX_FS is not set | ||
685 | # CONFIG_HPFS_FS is not set | 701 | # CONFIG_HPFS_FS is not set |
686 | # CONFIG_QNX4FS_FS is not set | 702 | # CONFIG_QNX4FS_FS is not set |
703 | # CONFIG_ROMFS_FS is not set | ||
687 | # CONFIG_SYSV_FS is not set | 704 | # CONFIG_SYSV_FS is not set |
688 | # CONFIG_UFS_FS is not set | 705 | # CONFIG_UFS_FS is not set |
689 | CONFIG_NETWORK_FILESYSTEMS=y | 706 | CONFIG_NETWORK_FILESYSTEMS=y |
@@ -730,7 +747,6 @@ CONFIG_MSDOS_PARTITION=y | |||
730 | # CONFIG_SYSV68_PARTITION is not set | 747 | # CONFIG_SYSV68_PARTITION is not set |
731 | # CONFIG_NLS is not set | 748 | # CONFIG_NLS is not set |
732 | # CONFIG_DLM is not set | 749 | # CONFIG_DLM is not set |
733 | # CONFIG_UCC_SLOW is not set | ||
734 | 750 | ||
735 | # | 751 | # |
736 | # Library routines | 752 | # Library routines |
@@ -745,9 +761,6 @@ CONFIG_ZLIB_INFLATE=y | |||
745 | CONFIG_HAS_IOMEM=y | 761 | CONFIG_HAS_IOMEM=y |
746 | CONFIG_HAS_IOPORT=y | 762 | CONFIG_HAS_IOPORT=y |
747 | CONFIG_HAS_DMA=y | 763 | CONFIG_HAS_DMA=y |
748 | CONFIG_INSTRUMENTATION=y | ||
749 | # CONFIG_PROFILING is not set | ||
750 | # CONFIG_MARKERS is not set | ||
751 | 764 | ||
752 | # | 765 | # |
753 | # Kernel hacking | 766 | # Kernel hacking |
@@ -757,7 +770,7 @@ CONFIG_ENABLE_WARN_DEPRECATED=y | |||
757 | CONFIG_ENABLE_MUST_CHECK=y | 770 | CONFIG_ENABLE_MUST_CHECK=y |
758 | CONFIG_MAGIC_SYSRQ=y | 771 | CONFIG_MAGIC_SYSRQ=y |
759 | # CONFIG_UNUSED_SYMBOLS is not set | 772 | # CONFIG_UNUSED_SYMBOLS is not set |
760 | # CONFIG_DEBUG_FS is not set | 773 | CONFIG_DEBUG_FS=y |
761 | # CONFIG_HEADERS_CHECK is not set | 774 | # CONFIG_HEADERS_CHECK is not set |
762 | CONFIG_DEBUG_KERNEL=y | 775 | CONFIG_DEBUG_KERNEL=y |
763 | # CONFIG_DEBUG_SHIRQ is not set | 776 | # CONFIG_DEBUG_SHIRQ is not set |
@@ -766,6 +779,7 @@ CONFIG_SCHED_DEBUG=y | |||
766 | # CONFIG_SCHEDSTATS is not set | 779 | # CONFIG_SCHEDSTATS is not set |
767 | # CONFIG_TIMER_STATS is not set | 780 | # CONFIG_TIMER_STATS is not set |
768 | # CONFIG_SLUB_DEBUG_ON is not set | 781 | # CONFIG_SLUB_DEBUG_ON is not set |
782 | # CONFIG_SLUB_STATS is not set | ||
769 | # CONFIG_DEBUG_SPINLOCK is not set | 783 | # CONFIG_DEBUG_SPINLOCK is not set |
770 | # CONFIG_DEBUG_MUTEXES is not set | 784 | # CONFIG_DEBUG_MUTEXES is not set |
771 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | 785 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set |
@@ -776,14 +790,15 @@ CONFIG_DEBUG_INFO=y | |||
776 | # CONFIG_DEBUG_VM is not set | 790 | # CONFIG_DEBUG_VM is not set |
777 | # CONFIG_DEBUG_LIST is not set | 791 | # CONFIG_DEBUG_LIST is not set |
778 | # CONFIG_DEBUG_SG is not set | 792 | # CONFIG_DEBUG_SG is not set |
779 | CONFIG_FORCED_INLINING=y | ||
780 | # CONFIG_BOOT_PRINTK_DELAY is not set | 793 | # CONFIG_BOOT_PRINTK_DELAY is not set |
794 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
781 | # CONFIG_FAULT_INJECTION is not set | 795 | # CONFIG_FAULT_INJECTION is not set |
782 | # CONFIG_SAMPLES is not set | 796 | # CONFIG_SAMPLES is not set |
783 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 797 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
784 | # CONFIG_DEBUG_STACK_USAGE is not set | 798 | # CONFIG_DEBUG_STACK_USAGE is not set |
785 | # CONFIG_DEBUG_PAGEALLOC is not set | 799 | # CONFIG_DEBUG_PAGEALLOC is not set |
786 | # CONFIG_DEBUGGER is not set | 800 | # CONFIG_DEBUGGER is not set |
801 | # CONFIG_VIRQ_DEBUG is not set | ||
787 | # CONFIG_BDI_SWITCH is not set | 802 | # CONFIG_BDI_SWITCH is not set |
788 | # CONFIG_PPC_EARLY_DEBUG is not set | 803 | # CONFIG_PPC_EARLY_DEBUG is not set |
789 | 804 | ||
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index f7458396cd7c..3c9452d4308b 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S | |||
@@ -332,8 +332,18 @@ InstructionTLBMiss: | |||
332 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ | 332 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ |
333 | lwz r10, 0(r11) /* Get the pte */ | 333 | lwz r10, 0(r11) /* Get the pte */ |
334 | 334 | ||
335 | #ifdef CONFIG_SWAP | ||
336 | /* do not set the _PAGE_ACCESSED bit of a non-present page */ | ||
337 | andi. r11, r10, _PAGE_PRESENT | ||
338 | beq 4f | ||
339 | ori r10, r10, _PAGE_ACCESSED | ||
340 | mfspr r11, SPRN_MD_TWC /* get the pte address again */ | ||
341 | stw r10, 0(r11) | ||
342 | 4: | ||
343 | #else | ||
335 | ori r10, r10, _PAGE_ACCESSED | 344 | ori r10, r10, _PAGE_ACCESSED |
336 | stw r10, 0(r11) | 345 | stw r10, 0(r11) |
346 | #endif | ||
337 | 347 | ||
338 | /* The Linux PTE won't go exactly into the MMU TLB. | 348 | /* The Linux PTE won't go exactly into the MMU TLB. |
339 | * Software indicator bits 21, 22 and 28 must be clear. | 349 | * Software indicator bits 21, 22 and 28 must be clear. |
@@ -398,8 +408,17 @@ DataStoreTLBMiss: | |||
398 | DO_8xx_CPU6(0x3b80, r3) | 408 | DO_8xx_CPU6(0x3b80, r3) |
399 | mtspr SPRN_MD_TWC, r11 | 409 | mtspr SPRN_MD_TWC, r11 |
400 | 410 | ||
401 | mfspr r11, SPRN_MD_TWC /* get the pte address again */ | 411 | #ifdef CONFIG_SWAP |
412 | /* do not set the _PAGE_ACCESSED bit of a non-present page */ | ||
413 | andi. r11, r10, _PAGE_PRESENT | ||
414 | beq 4f | ||
402 | ori r10, r10, _PAGE_ACCESSED | 415 | ori r10, r10, _PAGE_ACCESSED |
416 | 4: | ||
417 | /* and update pte in table */ | ||
418 | #else | ||
419 | ori r10, r10, _PAGE_ACCESSED | ||
420 | #endif | ||
421 | mfspr r11, SPRN_MD_TWC /* get the pte address again */ | ||
403 | stw r10, 0(r11) | 422 | stw r10, 0(r11) |
404 | 423 | ||
405 | /* The Linux PTE won't go exactly into the MMU TLB. | 424 | /* The Linux PTE won't go exactly into the MMU TLB. |
@@ -507,7 +526,16 @@ DataTLBError: | |||
507 | 526 | ||
508 | /* Update 'changed', among others. | 527 | /* Update 'changed', among others. |
509 | */ | 528 | */ |
529 | #ifdef CONFIG_SWAP | ||
530 | ori r10, r10, _PAGE_DIRTY|_PAGE_HWWRITE | ||
531 | /* do not set the _PAGE_ACCESSED bit of a non-present page */ | ||
532 | andi. r11, r10, _PAGE_PRESENT | ||
533 | beq 4f | ||
534 | ori r10, r10, _PAGE_ACCESSED | ||
535 | 4: | ||
536 | #else | ||
510 | ori r10, r10, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE | 537 | ori r10, r10, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE |
538 | #endif | ||
511 | mfspr r11, SPRN_MD_TWC /* Get pte address again */ | 539 | mfspr r11, SPRN_MD_TWC /* Get pte address again */ |
512 | stw r10, 0(r11) /* and update pte in table */ | 540 | stw r10, 0(r11) /* and update pte in table */ |
513 | 541 | ||
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 5c2e253ddfb1..9d2c56621f1e 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -785,6 +785,21 @@ _GLOBAL(__lshrdi3) | |||
785 | or r4,r4,r7 # LSW |= t2 | 785 | or r4,r4,r7 # LSW |= t2 |
786 | blr | 786 | blr |
787 | 787 | ||
788 | /* | ||
789 | * 64-bit comparison: __ucmpdi2(u64 a, u64 b) | ||
790 | * Returns 0 if a < b, 1 if a == b, 2 if a > b. | ||
791 | */ | ||
792 | _GLOBAL(__ucmpdi2) | ||
793 | cmplw r3,r5 | ||
794 | li r3,1 | ||
795 | bne 1f | ||
796 | cmplw r4,r6 | ||
797 | beqlr | ||
798 | 1: li r3,0 | ||
799 | bltlr | ||
800 | li r3,2 | ||
801 | blr | ||
802 | |||
788 | _GLOBAL(abs) | 803 | _GLOBAL(abs) |
789 | srawi r4,r3,31 | 804 | srawi r4,r3,31 |
790 | xor r3,r3,r4 | 805 | xor r3,r3,r4 |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 980fe32895c0..89c83ccb85c1 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -748,7 +748,13 @@ static void __devinit pcibios_fixup_resources(struct pci_dev *dev) | |||
748 | struct resource *res = dev->resource + i; | 748 | struct resource *res = dev->resource + i; |
749 | if (!res->flags) | 749 | if (!res->flags) |
750 | continue; | 750 | continue; |
751 | if (res->end == 0xffffffff) { | 751 | /* On platforms that have PPC_PCI_PROBE_ONLY set, we don't |
752 | * consider 0 as an unassigned BAR value. It's technically | ||
753 | * a valid value, but linux doesn't like it... so when we can | ||
754 | * re-assign things, we do so, but if we can't, we keep it | ||
755 | * around and hope for the best... | ||
756 | */ | ||
757 | if (res->start == 0 && !(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) { | ||
752 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] is unassigned\n", | 758 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] is unassigned\n", |
753 | pci_name(dev), i, | 759 | pci_name(dev), i, |
754 | (unsigned long long)res->start, | 760 | (unsigned long long)res->start, |
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index aa9ff35b0e63..9c98424277a8 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
@@ -58,6 +58,7 @@ extern void program_check_exception(struct pt_regs *regs); | |||
58 | extern void single_step_exception(struct pt_regs *regs); | 58 | extern void single_step_exception(struct pt_regs *regs); |
59 | extern int sys_sigreturn(struct pt_regs *regs); | 59 | extern int sys_sigreturn(struct pt_regs *regs); |
60 | 60 | ||
61 | EXPORT_SYMBOL(empty_zero_page); | ||
61 | EXPORT_SYMBOL(clear_pages); | 62 | EXPORT_SYMBOL(clear_pages); |
62 | EXPORT_SYMBOL(copy_page); | 63 | EXPORT_SYMBOL(copy_page); |
63 | EXPORT_SYMBOL(ISA_DMA_THRESHOLD); | 64 | EXPORT_SYMBOL(ISA_DMA_THRESHOLD); |
@@ -149,6 +150,8 @@ long long __lshrdi3(long long, int); | |||
149 | EXPORT_SYMBOL(__ashrdi3); | 150 | EXPORT_SYMBOL(__ashrdi3); |
150 | EXPORT_SYMBOL(__ashldi3); | 151 | EXPORT_SYMBOL(__ashldi3); |
151 | EXPORT_SYMBOL(__lshrdi3); | 152 | EXPORT_SYMBOL(__lshrdi3); |
153 | int __ucmpdi2(unsigned long long, unsigned long long); | ||
154 | EXPORT_SYMBOL(__ucmpdi2); | ||
152 | #endif | 155 | #endif |
153 | 156 | ||
154 | EXPORT_SYMBOL(memcpy); | 157 | EXPORT_SYMBOL(memcpy); |
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 32f416175db1..590f1f67c874 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -506,10 +506,10 @@ void __init htab_initialize(void) | |||
506 | } else { | 506 | } else { |
507 | /* Find storage for the HPT. Must be contiguous in | 507 | /* Find storage for the HPT. Must be contiguous in |
508 | * the absolute address space. On cell we want it to be | 508 | * the absolute address space. On cell we want it to be |
509 | * in the first 1 Gig. | 509 | * in the first 2 Gig so we can use it for IOMMU hacks. |
510 | */ | 510 | */ |
511 | if (machine_is(cell)) | 511 | if (machine_is(cell)) |
512 | limit = 0x40000000; | 512 | limit = 0x80000000; |
513 | else | 513 | else |
514 | limit = 0; | 514 | limit = 0; |
515 | 515 | ||
diff --git a/arch/powerpc/oprofile/op_model_cell.c b/arch/powerpc/oprofile/op_model_cell.c index 13929771bee7..9eed1f68fcab 100644 --- a/arch/powerpc/oprofile/op_model_cell.c +++ b/arch/powerpc/oprofile/op_model_cell.c | |||
@@ -1151,7 +1151,7 @@ static void cell_handle_interrupt(struct pt_regs *regs, | |||
1151 | for (i = 0; i < num_counters; ++i) { | 1151 | for (i = 0; i < num_counters; ++i) { |
1152 | if ((interrupt_mask & CBE_PM_CTR_OVERFLOW_INTR(i)) | 1152 | if ((interrupt_mask & CBE_PM_CTR_OVERFLOW_INTR(i)) |
1153 | && ctr[i].enabled) { | 1153 | && ctr[i].enabled) { |
1154 | oprofile_add_pc(pc, is_kernel, i); | 1154 | oprofile_add_ext_sample(pc, regs, i, is_kernel); |
1155 | cbe_write_ctr(cpu, i, reset_value[i]); | 1155 | cbe_write_ctr(cpu, i, reset_value[i]); |
1156 | } | 1156 | } |
1157 | } | 1157 | } |
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_common.c b/arch/powerpc/platforms/52xx/mpc52xx_common.c index 9aa4425d80b2..4d5fd1dbd400 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_common.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_common.c | |||
@@ -199,6 +199,7 @@ int mpc52xx_set_psc_clkdiv(int psc_id, int clkdiv) | |||
199 | 199 | ||
200 | return 0; | 200 | return 0; |
201 | } | 201 | } |
202 | EXPORT_SYMBOL(mpc52xx_set_psc_clkdiv); | ||
202 | 203 | ||
203 | /** | 204 | /** |
204 | * mpc52xx_restart: ppc_md->restart hook for mpc5200 using the watchdog timer | 205 | * mpc52xx_restart: ppc_md->restart hook for mpc5200 using the watchdog timer |
diff --git a/arch/powerpc/platforms/83xx/mpc837x_mds.c b/arch/powerpc/platforms/83xx/mpc837x_mds.c index 8a9c26973605..64d17b0d6455 100644 --- a/arch/powerpc/platforms/83xx/mpc837x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc837x_mds.c | |||
@@ -39,12 +39,9 @@ static int mpc837xmds_usb_cfg(void) | |||
39 | if (ret) | 39 | if (ret) |
40 | return ret; | 40 | return ret; |
41 | /* Map BCSR area */ | 41 | /* Map BCSR area */ |
42 | np = of_find_node_by_name(NULL, "bcsr"); | 42 | np = of_find_compatible_node(NULL, NULL, "fsl,mpc837xmds-bcsr"); |
43 | if (np) { | 43 | if (np) { |
44 | struct resource res; | 44 | bcsr_regs = of_iomap(np, 0); |
45 | |||
46 | of_address_to_resource(np, 0, &res); | ||
47 | bcsr_regs = ioremap(res.start, res.end - res.start + 1); | ||
48 | of_node_put(np); | 45 | of_node_put(np); |
49 | } | 46 | } |
50 | if (!bcsr_regs) | 47 | if (!bcsr_regs) |
@@ -96,6 +93,7 @@ static void __init mpc837x_mds_setup_arch(void) | |||
96 | static struct of_device_id mpc837x_ids[] = { | 93 | static struct of_device_id mpc837x_ids[] = { |
97 | { .type = "soc", }, | 94 | { .type = "soc", }, |
98 | { .compatible = "soc", }, | 95 | { .compatible = "soc", }, |
96 | { .compatible = "simple-bus", }, | ||
99 | {}, | 97 | {}, |
100 | }; | 98 | }; |
101 | 99 | ||
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig index 0afd22595546..a578b966ecbc 100644 --- a/arch/powerpc/platforms/Kconfig +++ b/arch/powerpc/platforms/Kconfig | |||
@@ -22,7 +22,6 @@ config PPC_83xx | |||
22 | select FSL_SOC | 22 | select FSL_SOC |
23 | select MPC83xx | 23 | select MPC83xx |
24 | select IPIC | 24 | select IPIC |
25 | select FSL_EMB_PERFMON | ||
26 | 25 | ||
27 | config PPC_86xx | 26 | config PPC_86xx |
28 | bool "Freescale 86xx" | 27 | bool "Freescale 86xx" |
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 73d81ce14b67..0c3face0ddbb 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -113,7 +113,12 @@ config FSL_BOOKE | |||
113 | default y | 113 | default y |
114 | 114 | ||
115 | config FSL_EMB_PERFMON | 115 | config FSL_EMB_PERFMON |
116 | bool | 116 | bool "Freescale Embedded Perfmon" |
117 | depends on E500 || PPC_83xx | ||
118 | help | ||
119 | This is the Performance Monitor support found on the e500 core | ||
120 | and some e300 cores (c3 and c4). Select this only if your | ||
121 | core supports the Embedded Performance Monitor APU | ||
117 | 122 | ||
118 | config PTE_64BIT | 123 | config PTE_64BIT |
119 | bool | 124 | bool |
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c index edab631a8dcb..20ea0e118f24 100644 --- a/arch/powerpc/platforms/cell/iommu.c +++ b/arch/powerpc/platforms/cell/iommu.c | |||
@@ -113,7 +113,7 @@ | |||
113 | 113 | ||
114 | /* IOMMU sizing */ | 114 | /* IOMMU sizing */ |
115 | #define IO_SEGMENT_SHIFT 28 | 115 | #define IO_SEGMENT_SHIFT 28 |
116 | #define IO_PAGENO_BITS (IO_SEGMENT_SHIFT - IOMMU_PAGE_SHIFT) | 116 | #define IO_PAGENO_BITS(shift) (IO_SEGMENT_SHIFT - (shift)) |
117 | 117 | ||
118 | /* The high bit needs to be set on every DMA address */ | 118 | /* The high bit needs to be set on every DMA address */ |
119 | #define SPIDER_DMA_OFFSET 0x80000000ul | 119 | #define SPIDER_DMA_OFFSET 0x80000000ul |
@@ -123,7 +123,6 @@ struct iommu_window { | |||
123 | struct cbe_iommu *iommu; | 123 | struct cbe_iommu *iommu; |
124 | unsigned long offset; | 124 | unsigned long offset; |
125 | unsigned long size; | 125 | unsigned long size; |
126 | unsigned long pte_offset; | ||
127 | unsigned int ioid; | 126 | unsigned int ioid; |
128 | struct iommu_table table; | 127 | struct iommu_table table; |
129 | }; | 128 | }; |
@@ -200,7 +199,7 @@ static void tce_build_cell(struct iommu_table *tbl, long index, long npages, | |||
200 | (window->ioid & IOPTE_IOID_Mask); | 199 | (window->ioid & IOPTE_IOID_Mask); |
201 | #endif | 200 | #endif |
202 | 201 | ||
203 | io_pte = (unsigned long *)tbl->it_base + (index - window->pte_offset); | 202 | io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); |
204 | 203 | ||
205 | for (i = 0; i < npages; i++, uaddr += IOMMU_PAGE_SIZE) | 204 | for (i = 0; i < npages; i++, uaddr += IOMMU_PAGE_SIZE) |
206 | io_pte[i] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask); | 205 | io_pte[i] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask); |
@@ -232,7 +231,7 @@ static void tce_free_cell(struct iommu_table *tbl, long index, long npages) | |||
232 | | (window->ioid & IOPTE_IOID_Mask); | 231 | | (window->ioid & IOPTE_IOID_Mask); |
233 | #endif | 232 | #endif |
234 | 233 | ||
235 | io_pte = (unsigned long *)tbl->it_base + (index - window->pte_offset); | 234 | io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); |
236 | 235 | ||
237 | for (i = 0; i < npages; i++) | 236 | for (i = 0; i < npages; i++) |
238 | io_pte[i] = pte; | 237 | io_pte[i] = pte; |
@@ -307,76 +306,84 @@ static int cell_iommu_find_ioc(int nid, unsigned long *base) | |||
307 | return -ENODEV; | 306 | return -ENODEV; |
308 | } | 307 | } |
309 | 308 | ||
310 | static void cell_iommu_setup_page_tables(struct cbe_iommu *iommu, | 309 | static void cell_iommu_setup_stab(struct cbe_iommu *iommu, |
311 | unsigned long dbase, unsigned long dsize, | 310 | unsigned long dbase, unsigned long dsize, |
312 | unsigned long fbase, unsigned long fsize) | 311 | unsigned long fbase, unsigned long fsize) |
313 | { | 312 | { |
314 | struct page *page; | 313 | struct page *page; |
315 | int i; | 314 | unsigned long segments, stab_size; |
316 | unsigned long reg, segments, pages_per_segment, ptab_size, stab_size, | ||
317 | n_pte_pages, base; | ||
318 | |||
319 | base = dbase; | ||
320 | if (fsize != 0) | ||
321 | base = min(fbase, dbase); | ||
322 | 315 | ||
323 | segments = max(dbase + dsize, fbase + fsize) >> IO_SEGMENT_SHIFT; | 316 | segments = max(dbase + dsize, fbase + fsize) >> IO_SEGMENT_SHIFT; |
324 | pages_per_segment = 1ull << IO_PAGENO_BITS; | ||
325 | 317 | ||
326 | pr_debug("%s: iommu[%d]: segments: %lu, pages per segment: %lu\n", | 318 | pr_debug("%s: iommu[%d]: segments: %lu\n", |
327 | __FUNCTION__, iommu->nid, segments, pages_per_segment); | 319 | __FUNCTION__, iommu->nid, segments); |
328 | 320 | ||
329 | /* set up the segment table */ | 321 | /* set up the segment table */ |
330 | stab_size = segments * sizeof(unsigned long); | 322 | stab_size = segments * sizeof(unsigned long); |
331 | page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(stab_size)); | 323 | page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(stab_size)); |
332 | BUG_ON(!page); | 324 | BUG_ON(!page); |
333 | iommu->stab = page_address(page); | 325 | iommu->stab = page_address(page); |
334 | clear_page(iommu->stab); | 326 | memset(iommu->stab, 0, stab_size); |
327 | } | ||
328 | |||
329 | static unsigned long *cell_iommu_alloc_ptab(struct cbe_iommu *iommu, | ||
330 | unsigned long base, unsigned long size, unsigned long gap_base, | ||
331 | unsigned long gap_size, unsigned long page_shift) | ||
332 | { | ||
333 | struct page *page; | ||
334 | int i; | ||
335 | unsigned long reg, segments, pages_per_segment, ptab_size, | ||
336 | n_pte_pages, start_seg, *ptab; | ||
337 | |||
338 | start_seg = base >> IO_SEGMENT_SHIFT; | ||
339 | segments = size >> IO_SEGMENT_SHIFT; | ||
340 | pages_per_segment = 1ull << IO_PAGENO_BITS(page_shift); | ||
341 | /* PTEs for each segment must start on a 4K bounday */ | ||
342 | pages_per_segment = max(pages_per_segment, | ||
343 | (1 << 12) / sizeof(unsigned long)); | ||
335 | 344 | ||
336 | /* ... and the page tables. Since these are contiguous, we can treat | ||
337 | * the page tables as one array of ptes, like pSeries does. | ||
338 | */ | ||
339 | ptab_size = segments * pages_per_segment * sizeof(unsigned long); | 345 | ptab_size = segments * pages_per_segment * sizeof(unsigned long); |
340 | pr_debug("%s: iommu[%d]: ptab_size: %lu, order: %d\n", __FUNCTION__, | 346 | pr_debug("%s: iommu[%d]: ptab_size: %lu, order: %d\n", __FUNCTION__, |
341 | iommu->nid, ptab_size, get_order(ptab_size)); | 347 | iommu->nid, ptab_size, get_order(ptab_size)); |
342 | page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(ptab_size)); | 348 | page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(ptab_size)); |
343 | BUG_ON(!page); | 349 | BUG_ON(!page); |
344 | 350 | ||
345 | iommu->ptab = page_address(page); | 351 | ptab = page_address(page); |
346 | memset(iommu->ptab, 0, ptab_size); | 352 | memset(ptab, 0, ptab_size); |
347 | 353 | ||
348 | /* allocate a bogus page for the end of each mapping */ | 354 | /* number of 4K pages needed for a page table */ |
349 | page = alloc_pages_node(iommu->nid, GFP_KERNEL, 0); | 355 | n_pte_pages = (pages_per_segment * sizeof(unsigned long)) >> 12; |
350 | BUG_ON(!page); | ||
351 | iommu->pad_page = page_address(page); | ||
352 | clear_page(iommu->pad_page); | ||
353 | |||
354 | /* number of pages needed for a page table */ | ||
355 | n_pte_pages = (pages_per_segment * | ||
356 | sizeof(unsigned long)) >> IOMMU_PAGE_SHIFT; | ||
357 | 356 | ||
358 | pr_debug("%s: iommu[%d]: stab at %p, ptab at %p, n_pte_pages: %lu\n", | 357 | pr_debug("%s: iommu[%d]: stab at %p, ptab at %p, n_pte_pages: %lu\n", |
359 | __FUNCTION__, iommu->nid, iommu->stab, iommu->ptab, | 358 | __FUNCTION__, iommu->nid, iommu->stab, ptab, |
360 | n_pte_pages); | 359 | n_pte_pages); |
361 | 360 | ||
362 | /* initialise the STEs */ | 361 | /* initialise the STEs */ |
363 | reg = IOSTE_V | ((n_pte_pages - 1) << 5); | 362 | reg = IOSTE_V | ((n_pte_pages - 1) << 5); |
364 | 363 | ||
365 | if (IOMMU_PAGE_SIZE == 0x1000) | 364 | switch (page_shift) { |
366 | reg |= IOSTE_PS_4K; | 365 | case 12: reg |= IOSTE_PS_4K; break; |
367 | else if (IOMMU_PAGE_SIZE == 0x10000) | 366 | case 16: reg |= IOSTE_PS_64K; break; |
368 | reg |= IOSTE_PS_64K; | 367 | case 20: reg |= IOSTE_PS_1M; break; |
369 | else { | 368 | case 24: reg |= IOSTE_PS_16M; break; |
370 | extern void __unknown_page_size_error(void); | 369 | default: BUG(); |
371 | __unknown_page_size_error(); | ||
372 | } | 370 | } |
373 | 371 | ||
372 | gap_base = gap_base >> IO_SEGMENT_SHIFT; | ||
373 | gap_size = gap_size >> IO_SEGMENT_SHIFT; | ||
374 | |||
374 | pr_debug("Setting up IOMMU stab:\n"); | 375 | pr_debug("Setting up IOMMU stab:\n"); |
375 | for (i = base >> IO_SEGMENT_SHIFT; i < segments; i++) { | 376 | for (i = start_seg; i < (start_seg + segments); i++) { |
376 | iommu->stab[i] = reg | | 377 | if (i >= gap_base && i < (gap_base + gap_size)) { |
377 | (__pa(iommu->ptab) + n_pte_pages * IOMMU_PAGE_SIZE * i); | 378 | pr_debug("\toverlap at %d, skipping\n", i); |
379 | continue; | ||
380 | } | ||
381 | iommu->stab[i] = reg | (__pa(ptab) + (n_pte_pages << 12) * | ||
382 | (i - start_seg)); | ||
378 | pr_debug("\t[%d] 0x%016lx\n", i, iommu->stab[i]); | 383 | pr_debug("\t[%d] 0x%016lx\n", i, iommu->stab[i]); |
379 | } | 384 | } |
385 | |||
386 | return ptab; | ||
380 | } | 387 | } |
381 | 388 | ||
382 | static void cell_iommu_enable_hardware(struct cbe_iommu *iommu) | 389 | static void cell_iommu_enable_hardware(struct cbe_iommu *iommu) |
@@ -423,7 +430,9 @@ static void cell_iommu_enable_hardware(struct cbe_iommu *iommu) | |||
423 | static void cell_iommu_setup_hardware(struct cbe_iommu *iommu, | 430 | static void cell_iommu_setup_hardware(struct cbe_iommu *iommu, |
424 | unsigned long base, unsigned long size) | 431 | unsigned long base, unsigned long size) |
425 | { | 432 | { |
426 | cell_iommu_setup_page_tables(iommu, base, size, 0, 0); | 433 | cell_iommu_setup_stab(iommu, base, size, 0, 0); |
434 | iommu->ptab = cell_iommu_alloc_ptab(iommu, base, size, 0, 0, | ||
435 | IOMMU_PAGE_SHIFT); | ||
427 | cell_iommu_enable_hardware(iommu); | 436 | cell_iommu_enable_hardware(iommu); |
428 | } | 437 | } |
429 | 438 | ||
@@ -464,6 +473,7 @@ cell_iommu_setup_window(struct cbe_iommu *iommu, struct device_node *np, | |||
464 | unsigned long pte_offset) | 473 | unsigned long pte_offset) |
465 | { | 474 | { |
466 | struct iommu_window *window; | 475 | struct iommu_window *window; |
476 | struct page *page; | ||
467 | u32 ioid; | 477 | u32 ioid; |
468 | 478 | ||
469 | ioid = cell_iommu_get_ioid(np); | 479 | ioid = cell_iommu_get_ioid(np); |
@@ -475,13 +485,11 @@ cell_iommu_setup_window(struct cbe_iommu *iommu, struct device_node *np, | |||
475 | window->size = size; | 485 | window->size = size; |
476 | window->ioid = ioid; | 486 | window->ioid = ioid; |
477 | window->iommu = iommu; | 487 | window->iommu = iommu; |
478 | window->pte_offset = pte_offset; | ||
479 | 488 | ||
480 | window->table.it_blocksize = 16; | 489 | window->table.it_blocksize = 16; |
481 | window->table.it_base = (unsigned long)iommu->ptab; | 490 | window->table.it_base = (unsigned long)iommu->ptab; |
482 | window->table.it_index = iommu->nid; | 491 | window->table.it_index = iommu->nid; |
483 | window->table.it_offset = (offset >> IOMMU_PAGE_SHIFT) + | 492 | window->table.it_offset = (offset >> IOMMU_PAGE_SHIFT) + pte_offset; |
484 | window->pte_offset; | ||
485 | window->table.it_size = size >> IOMMU_PAGE_SHIFT; | 493 | window->table.it_size = size >> IOMMU_PAGE_SHIFT; |
486 | 494 | ||
487 | iommu_init_table(&window->table, iommu->nid); | 495 | iommu_init_table(&window->table, iommu->nid); |
@@ -504,6 +512,11 @@ cell_iommu_setup_window(struct cbe_iommu *iommu, struct device_node *np, | |||
504 | * This code also assumes that we have a window that starts at 0, | 512 | * This code also assumes that we have a window that starts at 0, |
505 | * which is the case on all spider based blades. | 513 | * which is the case on all spider based blades. |
506 | */ | 514 | */ |
515 | page = alloc_pages_node(iommu->nid, GFP_KERNEL, 0); | ||
516 | BUG_ON(!page); | ||
517 | iommu->pad_page = page_address(page); | ||
518 | clear_page(iommu->pad_page); | ||
519 | |||
507 | __set_bit(0, window->table.it_map); | 520 | __set_bit(0, window->table.it_map); |
508 | tce_build_cell(&window->table, window->table.it_offset, 1, | 521 | tce_build_cell(&window->table, window->table.it_offset, 1, |
509 | (unsigned long)iommu->pad_page, DMA_TO_DEVICE); | 522 | (unsigned long)iommu->pad_page, DMA_TO_DEVICE); |
@@ -549,7 +562,7 @@ static void cell_dma_dev_setup_iommu(struct device *dev) | |||
549 | archdata->dma_data = &window->table; | 562 | archdata->dma_data = &window->table; |
550 | } | 563 | } |
551 | 564 | ||
552 | static void cell_dma_dev_setup_static(struct device *dev); | 565 | static void cell_dma_dev_setup_fixed(struct device *dev); |
553 | 566 | ||
554 | static void cell_dma_dev_setup(struct device *dev) | 567 | static void cell_dma_dev_setup(struct device *dev) |
555 | { | 568 | { |
@@ -557,7 +570,7 @@ static void cell_dma_dev_setup(struct device *dev) | |||
557 | 570 | ||
558 | /* Order is important here, these are not mutually exclusive */ | 571 | /* Order is important here, these are not mutually exclusive */ |
559 | if (get_dma_ops(dev) == &dma_iommu_fixed_ops) | 572 | if (get_dma_ops(dev) == &dma_iommu_fixed_ops) |
560 | cell_dma_dev_setup_static(dev); | 573 | cell_dma_dev_setup_fixed(dev); |
561 | else if (get_pci_dma_ops() == &dma_iommu_ops) | 574 | else if (get_pci_dma_ops() == &dma_iommu_ops) |
562 | cell_dma_dev_setup_iommu(dev); | 575 | cell_dma_dev_setup_iommu(dev); |
563 | else if (get_pci_dma_ops() == &dma_direct_ops) | 576 | else if (get_pci_dma_ops() == &dma_direct_ops) |
@@ -858,7 +871,7 @@ static int dma_set_mask_and_switch(struct device *dev, u64 dma_mask) | |||
858 | return 0; | 871 | return 0; |
859 | } | 872 | } |
860 | 873 | ||
861 | static void cell_dma_dev_setup_static(struct device *dev) | 874 | static void cell_dma_dev_setup_fixed(struct device *dev) |
862 | { | 875 | { |
863 | struct dev_archdata *archdata = &dev->archdata; | 876 | struct dev_archdata *archdata = &dev->archdata; |
864 | u64 addr; | 877 | u64 addr; |
@@ -869,35 +882,45 @@ static void cell_dma_dev_setup_static(struct device *dev) | |||
869 | dev_dbg(dev, "iommu: fixed addr = %lx\n", addr); | 882 | dev_dbg(dev, "iommu: fixed addr = %lx\n", addr); |
870 | } | 883 | } |
871 | 884 | ||
885 | static void insert_16M_pte(unsigned long addr, unsigned long *ptab, | ||
886 | unsigned long base_pte) | ||
887 | { | ||
888 | unsigned long segment, offset; | ||
889 | |||
890 | segment = addr >> IO_SEGMENT_SHIFT; | ||
891 | offset = (addr >> 24) - (segment << IO_PAGENO_BITS(24)); | ||
892 | ptab = ptab + (segment * (1 << 12) / sizeof(unsigned long)); | ||
893 | |||
894 | pr_debug("iommu: addr %lx ptab %p segment %lx offset %lx\n", | ||
895 | addr, ptab, segment, offset); | ||
896 | |||
897 | ptab[offset] = base_pte | (__pa(addr) & IOPTE_RPN_Mask); | ||
898 | } | ||
899 | |||
872 | static void cell_iommu_setup_fixed_ptab(struct cbe_iommu *iommu, | 900 | static void cell_iommu_setup_fixed_ptab(struct cbe_iommu *iommu, |
873 | struct device_node *np, unsigned long dbase, unsigned long dsize, | 901 | struct device_node *np, unsigned long dbase, unsigned long dsize, |
874 | unsigned long fbase, unsigned long fsize) | 902 | unsigned long fbase, unsigned long fsize) |
875 | { | 903 | { |
876 | unsigned long base_pte, uaddr, *io_pte; | 904 | unsigned long base_pte, uaddr, ioaddr, *ptab; |
877 | int i; | ||
878 | 905 | ||
879 | dma_iommu_fixed_base = fbase; | 906 | ptab = cell_iommu_alloc_ptab(iommu, fbase, fsize, dbase, dsize, 24); |
880 | 907 | ||
881 | /* convert from bytes into page table indices */ | 908 | dma_iommu_fixed_base = fbase; |
882 | dbase = dbase >> IOMMU_PAGE_SHIFT; | ||
883 | dsize = dsize >> IOMMU_PAGE_SHIFT; | ||
884 | fbase = fbase >> IOMMU_PAGE_SHIFT; | ||
885 | fsize = fsize >> IOMMU_PAGE_SHIFT; | ||
886 | 909 | ||
887 | pr_debug("iommu: mapping 0x%lx pages from 0x%lx\n", fsize, fbase); | 910 | pr_debug("iommu: mapping 0x%lx pages from 0x%lx\n", fsize, fbase); |
888 | 911 | ||
889 | io_pte = iommu->ptab; | ||
890 | base_pte = IOPTE_PP_W | IOPTE_PP_R | IOPTE_M | IOPTE_SO_RW | 912 | base_pte = IOPTE_PP_W | IOPTE_PP_R | IOPTE_M | IOPTE_SO_RW |
891 | | (cell_iommu_get_ioid(np) & IOPTE_IOID_Mask); | 913 | | (cell_iommu_get_ioid(np) & IOPTE_IOID_Mask); |
892 | 914 | ||
893 | uaddr = 0; | 915 | for (uaddr = 0; uaddr < fsize; uaddr += (1 << 24)) { |
894 | for (i = fbase; i < fbase + fsize; i++, uaddr += IOMMU_PAGE_SIZE) { | ||
895 | /* Don't touch the dynamic region */ | 916 | /* Don't touch the dynamic region */ |
896 | if (i >= dbase && i < (dbase + dsize)) { | 917 | ioaddr = uaddr + fbase; |
897 | pr_debug("iommu: static/dynamic overlap, skipping\n"); | 918 | if (ioaddr >= dbase && ioaddr < (dbase + dsize)) { |
919 | pr_debug("iommu: fixed/dynamic overlap, skipping\n"); | ||
898 | continue; | 920 | continue; |
899 | } | 921 | } |
900 | io_pte[i] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask); | 922 | |
923 | insert_16M_pte(uaddr, ptab, base_pte); | ||
901 | } | 924 | } |
902 | 925 | ||
903 | mb(); | 926 | mb(); |
@@ -995,7 +1018,9 @@ static int __init cell_iommu_fixed_mapping_init(void) | |||
995 | "fixed window 0x%lx-0x%lx\n", iommu->nid, dbase, | 1018 | "fixed window 0x%lx-0x%lx\n", iommu->nid, dbase, |
996 | dbase + dsize, fbase, fbase + fsize); | 1019 | dbase + dsize, fbase, fbase + fsize); |
997 | 1020 | ||
998 | cell_iommu_setup_page_tables(iommu, dbase, dsize, fbase, fsize); | 1021 | cell_iommu_setup_stab(iommu, dbase, dsize, fbase, fsize); |
1022 | iommu->ptab = cell_iommu_alloc_ptab(iommu, dbase, dsize, 0, 0, | ||
1023 | IOMMU_PAGE_SHIFT); | ||
999 | cell_iommu_setup_fixed_ptab(iommu, np, dbase, dsize, | 1024 | cell_iommu_setup_fixed_ptab(iommu, np, dbase, dsize, |
1000 | fbase, fsize); | 1025 | fbase, fsize); |
1001 | cell_iommu_enable_hardware(iommu); | 1026 | cell_iommu_enable_hardware(iommu); |
diff --git a/arch/powerpc/platforms/cell/setup.c b/arch/powerpc/platforms/cell/setup.c index a7f609b3b876..dda34650cb07 100644 --- a/arch/powerpc/platforms/cell/setup.c +++ b/arch/powerpc/platforms/cell/setup.c | |||
@@ -149,6 +149,11 @@ static void __init cell_init_irq(void) | |||
149 | mpic_init_IRQ(); | 149 | mpic_init_IRQ(); |
150 | } | 150 | } |
151 | 151 | ||
152 | static void __init cell_set_dabrx(void) | ||
153 | { | ||
154 | mtspr(SPRN_DABRX, DABRX_KERNEL | DABRX_USER); | ||
155 | } | ||
156 | |||
152 | static void __init cell_setup_arch(void) | 157 | static void __init cell_setup_arch(void) |
153 | { | 158 | { |
154 | #ifdef CONFIG_SPU_BASE | 159 | #ifdef CONFIG_SPU_BASE |
@@ -158,6 +163,8 @@ static void __init cell_setup_arch(void) | |||
158 | 163 | ||
159 | cbe_regs_init(); | 164 | cbe_regs_init(); |
160 | 165 | ||
166 | cell_set_dabrx(); | ||
167 | |||
161 | #ifdef CONFIG_CBE_RAS | 168 | #ifdef CONFIG_CBE_RAS |
162 | cbe_ras_init(); | 169 | cbe_ras_init(); |
163 | #endif | 170 | #endif |
diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c index 87eb07f94c5f..712001f6b7da 100644 --- a/arch/powerpc/platforms/cell/spu_base.c +++ b/arch/powerpc/platforms/cell/spu_base.c | |||
@@ -81,9 +81,12 @@ struct spu_slb { | |||
81 | void spu_invalidate_slbs(struct spu *spu) | 81 | void spu_invalidate_slbs(struct spu *spu) |
82 | { | 82 | { |
83 | struct spu_priv2 __iomem *priv2 = spu->priv2; | 83 | struct spu_priv2 __iomem *priv2 = spu->priv2; |
84 | unsigned long flags; | ||
84 | 85 | ||
86 | spin_lock_irqsave(&spu->register_lock, flags); | ||
85 | if (spu_mfc_sr1_get(spu) & MFC_STATE1_RELOCATE_MASK) | 87 | if (spu_mfc_sr1_get(spu) & MFC_STATE1_RELOCATE_MASK) |
86 | out_be64(&priv2->slb_invalidate_all_W, 0UL); | 88 | out_be64(&priv2->slb_invalidate_all_W, 0UL); |
89 | spin_unlock_irqrestore(&spu->register_lock, flags); | ||
87 | } | 90 | } |
88 | EXPORT_SYMBOL_GPL(spu_invalidate_slbs); | 91 | EXPORT_SYMBOL_GPL(spu_invalidate_slbs); |
89 | 92 | ||
@@ -148,7 +151,11 @@ static inline void spu_load_slb(struct spu *spu, int slbe, struct spu_slb *slb) | |||
148 | __func__, slbe, slb->vsid, slb->esid); | 151 | __func__, slbe, slb->vsid, slb->esid); |
149 | 152 | ||
150 | out_be64(&priv2->slb_index_W, slbe); | 153 | out_be64(&priv2->slb_index_W, slbe); |
154 | /* set invalid before writing vsid */ | ||
155 | out_be64(&priv2->slb_esid_RW, 0); | ||
156 | /* now it's safe to write the vsid */ | ||
151 | out_be64(&priv2->slb_vsid_RW, slb->vsid); | 157 | out_be64(&priv2->slb_vsid_RW, slb->vsid); |
158 | /* setting the new esid makes the entry valid again */ | ||
152 | out_be64(&priv2->slb_esid_RW, slb->esid); | 159 | out_be64(&priv2->slb_esid_RW, slb->esid); |
153 | } | 160 | } |
154 | 161 | ||
@@ -290,9 +297,11 @@ void spu_setup_kernel_slbs(struct spu *spu, struct spu_lscsa *lscsa, | |||
290 | nr_slbs++; | 297 | nr_slbs++; |
291 | } | 298 | } |
292 | 299 | ||
300 | spin_lock_irq(&spu->register_lock); | ||
293 | /* Add the set of SLBs */ | 301 | /* Add the set of SLBs */ |
294 | for (i = 0; i < nr_slbs; i++) | 302 | for (i = 0; i < nr_slbs; i++) |
295 | spu_load_slb(spu, i, &slbs[i]); | 303 | spu_load_slb(spu, i, &slbs[i]); |
304 | spin_unlock_irq(&spu->register_lock); | ||
296 | } | 305 | } |
297 | EXPORT_SYMBOL_GPL(spu_setup_kernel_slbs); | 306 | EXPORT_SYMBOL_GPL(spu_setup_kernel_slbs); |
298 | 307 | ||
@@ -337,13 +346,14 @@ spu_irq_class_1(int irq, void *data) | |||
337 | if (stat & CLASS1_STORAGE_FAULT_INTR) | 346 | if (stat & CLASS1_STORAGE_FAULT_INTR) |
338 | spu_mfc_dsisr_set(spu, 0ul); | 347 | spu_mfc_dsisr_set(spu, 0ul); |
339 | spu_int_stat_clear(spu, 1, stat); | 348 | spu_int_stat_clear(spu, 1, stat); |
340 | spin_unlock(&spu->register_lock); | ||
341 | pr_debug("%s: %lx %lx %lx %lx\n", __FUNCTION__, mask, stat, | ||
342 | dar, dsisr); | ||
343 | 349 | ||
344 | if (stat & CLASS1_SEGMENT_FAULT_INTR) | 350 | if (stat & CLASS1_SEGMENT_FAULT_INTR) |
345 | __spu_trap_data_seg(spu, dar); | 351 | __spu_trap_data_seg(spu, dar); |
346 | 352 | ||
353 | spin_unlock(&spu->register_lock); | ||
354 | pr_debug("%s: %lx %lx %lx %lx\n", __FUNCTION__, mask, stat, | ||
355 | dar, dsisr); | ||
356 | |||
347 | if (stat & CLASS1_STORAGE_FAULT_INTR) | 357 | if (stat & CLASS1_STORAGE_FAULT_INTR) |
348 | __spu_trap_data_map(spu, dar, dsisr); | 358 | __spu_trap_data_map(spu, dar, dsisr); |
349 | 359 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/context.c b/arch/powerpc/platforms/cell/spufs/context.c index 133995ed5cc7..0ad83aeb70b1 100644 --- a/arch/powerpc/platforms/cell/spufs/context.c +++ b/arch/powerpc/platforms/cell/spufs/context.c | |||
@@ -109,13 +109,12 @@ void spu_forget(struct spu_context *ctx) | |||
109 | 109 | ||
110 | /* | 110 | /* |
111 | * This is basically an open-coded spu_acquire_saved, except that | 111 | * This is basically an open-coded spu_acquire_saved, except that |
112 | * we don't acquire the state mutex interruptible. | 112 | * we don't acquire the state mutex interruptible, and we don't |
113 | * want this context to be rescheduled on release. | ||
113 | */ | 114 | */ |
114 | mutex_lock(&ctx->state_mutex); | 115 | mutex_lock(&ctx->state_mutex); |
115 | if (ctx->state != SPU_STATE_SAVED) { | 116 | if (ctx->state != SPU_STATE_SAVED) |
116 | set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags); | ||
117 | spu_deactivate(ctx); | 117 | spu_deactivate(ctx); |
118 | } | ||
119 | 118 | ||
120 | mm = ctx->owner; | 119 | mm = ctx->owner; |
121 | ctx->owner = NULL; | 120 | ctx->owner = NULL; |
@@ -171,7 +170,8 @@ void spu_release_saved(struct spu_context *ctx) | |||
171 | { | 170 | { |
172 | BUG_ON(ctx->state != SPU_STATE_SAVED); | 171 | BUG_ON(ctx->state != SPU_STATE_SAVED); |
173 | 172 | ||
174 | if (test_and_clear_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags)) | 173 | if (test_and_clear_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags) && |
174 | test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags)) | ||
175 | spu_activate(ctx, 0); | 175 | spu_activate(ctx, 0); |
176 | 176 | ||
177 | spu_release(ctx); | 177 | spu_release(ctx); |
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index c66c3756970d..f7a7e8635fb6 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -367,6 +367,13 @@ static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma, | |||
367 | return NOPFN_SIGBUS; | 367 | return NOPFN_SIGBUS; |
368 | 368 | ||
369 | /* | 369 | /* |
370 | * Because we release the mmap_sem, the context may be destroyed while | ||
371 | * we're in spu_wait. Grab an extra reference so it isn't destroyed | ||
372 | * in the meantime. | ||
373 | */ | ||
374 | get_spu_context(ctx); | ||
375 | |||
376 | /* | ||
370 | * We have to wait for context to be loaded before we have | 377 | * We have to wait for context to be loaded before we have |
371 | * pages to hand out to the user, but we don't want to wait | 378 | * pages to hand out to the user, but we don't want to wait |
372 | * with the mmap_sem held. | 379 | * with the mmap_sem held. |
@@ -375,7 +382,7 @@ static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma, | |||
375 | * hanged. | 382 | * hanged. |
376 | */ | 383 | */ |
377 | if (spu_acquire(ctx)) | 384 | if (spu_acquire(ctx)) |
378 | return NOPFN_REFAULT; | 385 | goto refault; |
379 | 386 | ||
380 | if (ctx->state == SPU_STATE_SAVED) { | 387 | if (ctx->state == SPU_STATE_SAVED) { |
381 | up_read(¤t->mm->mmap_sem); | 388 | up_read(¤t->mm->mmap_sem); |
@@ -391,6 +398,9 @@ static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma, | |||
391 | 398 | ||
392 | if (!ret) | 399 | if (!ret) |
393 | spu_release(ctx); | 400 | spu_release(ctx); |
401 | |||
402 | refault: | ||
403 | put_spu_context(ctx); | ||
394 | return NOPFN_REFAULT; | 404 | return NOPFN_REFAULT; |
395 | } | 405 | } |
396 | 406 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/run.c b/arch/powerpc/platforms/cell/spufs/run.c index 6221968c2a3c..cac69e116776 100644 --- a/arch/powerpc/platforms/cell/spufs/run.c +++ b/arch/powerpc/platforms/cell/spufs/run.c | |||
@@ -220,6 +220,7 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc) | |||
220 | } | 220 | } |
221 | } | 221 | } |
222 | 222 | ||
223 | set_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags); | ||
223 | return 0; | 224 | return 0; |
224 | } | 225 | } |
225 | 226 | ||
@@ -234,7 +235,7 @@ static int spu_run_fini(struct spu_context *ctx, u32 *npc, | |||
234 | *npc = ctx->ops->npc_read(ctx); | 235 | *npc = ctx->ops->npc_read(ctx); |
235 | 236 | ||
236 | spuctx_switch_state(ctx, SPU_UTIL_IDLE_LOADED); | 237 | spuctx_switch_state(ctx, SPU_UTIL_IDLE_LOADED); |
237 | ctx->policy = SCHED_IDLE; | 238 | clear_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags); |
238 | spu_release(ctx); | 239 | spu_release(ctx); |
239 | 240 | ||
240 | if (signal_pending(current)) | 241 | if (signal_pending(current)) |
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 3a5972117de7..00528ef84ad2 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -246,7 +246,7 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx) | |||
246 | spu_switch_notify(spu, ctx); | 246 | spu_switch_notify(spu, ctx); |
247 | ctx->state = SPU_STATE_RUNNABLE; | 247 | ctx->state = SPU_STATE_RUNNABLE; |
248 | 248 | ||
249 | spuctx_switch_state(ctx, SPU_UTIL_IDLE_LOADED); | 249 | spuctx_switch_state(ctx, SPU_UTIL_USER); |
250 | } | 250 | } |
251 | 251 | ||
252 | /* | 252 | /* |
@@ -867,7 +867,7 @@ static noinline void spusched_tick(struct spu_context *ctx) | |||
867 | if (ctx->policy == SCHED_FIFO) | 867 | if (ctx->policy == SCHED_FIFO) |
868 | goto out; | 868 | goto out; |
869 | 869 | ||
870 | if (--ctx->time_slice && ctx->policy != SCHED_IDLE) | 870 | if (--ctx->time_slice && test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags)) |
871 | goto out; | 871 | goto out; |
872 | 872 | ||
873 | spu = ctx->spu; | 873 | spu = ctx->spu; |
@@ -877,7 +877,7 @@ static noinline void spusched_tick(struct spu_context *ctx) | |||
877 | new = grab_runnable_context(ctx->prio + 1, spu->node); | 877 | new = grab_runnable_context(ctx->prio + 1, spu->node); |
878 | if (new) { | 878 | if (new) { |
879 | spu_unschedule(spu, ctx); | 879 | spu_unschedule(spu, ctx); |
880 | if (ctx->policy != SCHED_IDLE) | 880 | if (test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags)) |
881 | spu_add_to_rq(ctx); | 881 | spu_add_to_rq(ctx); |
882 | } else { | 882 | } else { |
883 | spu_context_nospu_trace(spusched_tick__newslice, ctx); | 883 | spu_context_nospu_trace(spusched_tick__newslice, ctx); |
diff --git a/arch/powerpc/platforms/cell/spufs/spufs.h b/arch/powerpc/platforms/cell/spufs/spufs.h index 2c2fe3c07d72..cdc515182f82 100644 --- a/arch/powerpc/platforms/cell/spufs/spufs.h +++ b/arch/powerpc/platforms/cell/spufs/spufs.h | |||
@@ -44,6 +44,7 @@ struct spu_gang; | |||
44 | enum { | 44 | enum { |
45 | SPU_SCHED_NOTIFY_ACTIVE, | 45 | SPU_SCHED_NOTIFY_ACTIVE, |
46 | SPU_SCHED_WAS_ACTIVE, /* was active upon spu_acquire_saved() */ | 46 | SPU_SCHED_WAS_ACTIVE, /* was active upon spu_acquire_saved() */ |
47 | SPU_SCHED_SPU_RUN, /* context is within spu_run */ | ||
47 | }; | 48 | }; |
48 | 49 | ||
49 | struct spu_context { | 50 | struct spu_context { |
diff --git a/arch/powerpc/platforms/cell/spufs/sputrace.c b/arch/powerpc/platforms/cell/spufs/sputrace.c index 01974f7776e1..79aa773f3c99 100644 --- a/arch/powerpc/platforms/cell/spufs/sputrace.c +++ b/arch/powerpc/platforms/cell/spufs/sputrace.c | |||
@@ -58,12 +58,12 @@ static int sputrace_sprint(char *tbuf, int n) | |||
58 | ktime_to_timespec(ktime_sub(t->tstamp, sputrace_start)); | 58 | ktime_to_timespec(ktime_sub(t->tstamp, sputrace_start)); |
59 | 59 | ||
60 | return snprintf(tbuf, n, | 60 | return snprintf(tbuf, n, |
61 | "[%lu.%09lu] %d: %s (thread = %d, spu = %d)\n", | 61 | "[%lu.%09lu] %d: %s (ctxthread = %d, spu = %d)\n", |
62 | (unsigned long) tv.tv_sec, | 62 | (unsigned long) tv.tv_sec, |
63 | (unsigned long) tv.tv_nsec, | 63 | (unsigned long) tv.tv_nsec, |
64 | t->owner_tid, | ||
65 | t->name, | ||
66 | t->curr_tid, | 64 | t->curr_tid, |
65 | t->name, | ||
66 | t->owner_tid, | ||
67 | t->number); | 67 | t->number); |
68 | } | 68 | } |
69 | 69 | ||
@@ -188,6 +188,7 @@ struct spu_probe spu_probes[] = { | |||
188 | { "spufs_ps_nopfn__insert", "%p %p", spu_context_event }, | 188 | { "spufs_ps_nopfn__insert", "%p %p", spu_context_event }, |
189 | { "spu_acquire_saved__enter", "%p", spu_context_nospu_event }, | 189 | { "spu_acquire_saved__enter", "%p", spu_context_nospu_event }, |
190 | { "destroy_spu_context__enter", "%p", spu_context_nospu_event }, | 190 | { "destroy_spu_context__enter", "%p", spu_context_nospu_event }, |
191 | { "spufs_stop_callback__enter", "%p %p", spu_context_event }, | ||
191 | }; | 192 | }; |
192 | 193 | ||
193 | static int __init sputrace_init(void) | 194 | static int __init sputrace_init(void) |
diff --git a/arch/powerpc/platforms/cell/spufs/switch.c b/arch/powerpc/platforms/cell/spufs/switch.c index 6f5886c7b1f9..e9dc7a55d1b9 100644 --- a/arch/powerpc/platforms/cell/spufs/switch.c +++ b/arch/powerpc/platforms/cell/spufs/switch.c | |||
@@ -34,6 +34,7 @@ | |||
34 | 34 | ||
35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
36 | #include <linux/errno.h> | 36 | #include <linux/errno.h> |
37 | #include <linux/hardirq.h> | ||
37 | #include <linux/sched.h> | 38 | #include <linux/sched.h> |
38 | #include <linux/kernel.h> | 39 | #include <linux/kernel.h> |
39 | #include <linux/mm.h> | 40 | #include <linux/mm.h> |
@@ -117,6 +118,8 @@ static inline void disable_interrupts(struct spu_state *csa, struct spu *spu) | |||
117 | * Write INT_MASK_class1 with value of 0. | 118 | * Write INT_MASK_class1 with value of 0. |
118 | * Save INT_Mask_class2 in CSA. | 119 | * Save INT_Mask_class2 in CSA. |
119 | * Write INT_MASK_class2 with value of 0. | 120 | * Write INT_MASK_class2 with value of 0. |
121 | * Synchronize all three interrupts to be sure | ||
122 | * we no longer execute a handler on another CPU. | ||
120 | */ | 123 | */ |
121 | spin_lock_irq(&spu->register_lock); | 124 | spin_lock_irq(&spu->register_lock); |
122 | if (csa) { | 125 | if (csa) { |
@@ -129,6 +132,9 @@ static inline void disable_interrupts(struct spu_state *csa, struct spu *spu) | |||
129 | spu_int_mask_set(spu, 2, 0ul); | 132 | spu_int_mask_set(spu, 2, 0ul); |
130 | eieio(); | 133 | eieio(); |
131 | spin_unlock_irq(&spu->register_lock); | 134 | spin_unlock_irq(&spu->register_lock); |
135 | synchronize_irq(spu->irqs[0]); | ||
136 | synchronize_irq(spu->irqs[1]); | ||
137 | synchronize_irq(spu->irqs[2]); | ||
132 | } | 138 | } |
133 | 139 | ||
134 | static inline void set_watchdog_timer(struct spu_state *csa, struct spu *spu) | 140 | static inline void set_watchdog_timer(struct spu_state *csa, struct spu *spu) |
diff --git a/arch/powerpc/platforms/celleb/beat.h b/arch/powerpc/platforms/celleb/beat.h index b2e292df13ca..ac82ac35b991 100644 --- a/arch/powerpc/platforms/celleb/beat.h +++ b/arch/powerpc/platforms/celleb/beat.h | |||
@@ -21,9 +21,6 @@ | |||
21 | #ifndef _CELLEB_BEAT_H | 21 | #ifndef _CELLEB_BEAT_H |
22 | #define _CELLEB_BEAT_H | 22 | #define _CELLEB_BEAT_H |
23 | 23 | ||
24 | #define DABRX_KERNEL (1UL<<1) | ||
25 | #define DABRX_USER (1UL<<0) | ||
26 | |||
27 | int64_t beat_get_term_char(uint64_t,uint64_t*,uint64_t*,uint64_t*); | 24 | int64_t beat_get_term_char(uint64_t,uint64_t*,uint64_t*,uint64_t*); |
28 | int64_t beat_put_term_char(uint64_t,uint64_t,uint64_t,uint64_t); | 25 | int64_t beat_put_term_char(uint64_t,uint64_t,uint64_t,uint64_t); |
29 | int64_t beat_repository_encode(int, const char *, uint64_t[4]); | 26 | int64_t beat_repository_encode(int, const char *, uint64_t[4]); |
diff --git a/arch/powerpc/platforms/powermac/pic.c b/arch/powerpc/platforms/powermac/pic.c index 40736400ef80..829b8b02527b 100644 --- a/arch/powerpc/platforms/powermac/pic.c +++ b/arch/powerpc/platforms/powermac/pic.c | |||
@@ -618,9 +618,9 @@ static int pmacpic_find_viaint(void) | |||
618 | if (np == NULL) | 618 | if (np == NULL) |
619 | goto not_found; | 619 | goto not_found; |
620 | viaint = irq_of_parse_and_map(np, 0);; | 620 | viaint = irq_of_parse_and_map(np, 0);; |
621 | #endif /* CONFIG_ADB_PMU */ | ||
622 | 621 | ||
623 | not_found: | 622 | not_found: |
623 | #endif /* CONFIG_ADB_PMU */ | ||
624 | return viaint; | 624 | return viaint; |
625 | } | 625 | } |
626 | 626 | ||
diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/arch/powerpc/sysdev/qe_lib/qe.c index 6efbd5e5bb1b..cc81fd1141b0 100644 --- a/arch/powerpc/sysdev/qe_lib/qe.c +++ b/arch/powerpc/sysdev/qe_lib/qe.c | |||
@@ -509,7 +509,7 @@ int qe_upload_firmware(const struct qe_firmware *firmware) | |||
509 | } | 509 | } |
510 | 510 | ||
511 | /* Validate some of the fields */ | 511 | /* Validate some of the fields */ |
512 | if ((firmware->count < 1) || (firmware->count >= MAX_QE_RISC)) { | 512 | if ((firmware->count < 1) || (firmware->count > MAX_QE_RISC)) { |
513 | printk(KERN_ERR "qe-firmware: invalid data\n"); | 513 | printk(KERN_ERR "qe-firmware: invalid data\n"); |
514 | return -EINVAL; | 514 | return -EINVAL; |
515 | } | 515 | } |
@@ -609,7 +609,10 @@ struct qe_firmware_info *qe_get_firmware_info(void) | |||
609 | * If we haven't checked yet, and a driver hasn't uploaded a firmware | 609 | * If we haven't checked yet, and a driver hasn't uploaded a firmware |
610 | * yet, then check the device tree for information. | 610 | * yet, then check the device tree for information. |
611 | */ | 611 | */ |
612 | if (initialized || qe_firmware_uploaded) | 612 | if (qe_firmware_uploaded) |
613 | return &qe_firmware_info; | ||
614 | |||
615 | if (initialized) | ||
613 | return NULL; | 616 | return NULL; |
614 | 617 | ||
615 | initialized = 1; | 618 | initialized = 1; |
diff --git a/arch/ppc/kernel/head_8xx.S b/arch/ppc/kernel/head_8xx.S index eb8d26f87362..321bda2de2cb 100644 --- a/arch/ppc/kernel/head_8xx.S +++ b/arch/ppc/kernel/head_8xx.S | |||
@@ -329,8 +329,18 @@ InstructionTLBMiss: | |||
329 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ | 329 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ |
330 | lwz r10, 0(r11) /* Get the pte */ | 330 | lwz r10, 0(r11) /* Get the pte */ |
331 | 331 | ||
332 | #ifdef CONFIG_SWAP | ||
333 | /* do not set the _PAGE_ACCESSED bit of a non-present page */ | ||
334 | andi. r11, r10, _PAGE_PRESENT | ||
335 | beq 4f | ||
336 | ori r10, r10, _PAGE_ACCESSED | ||
337 | mfspr r11, SPRN_MD_TWC /* get the pte address again */ | ||
338 | stw r10, 0(r11) | ||
339 | 4: | ||
340 | #else | ||
332 | ori r10, r10, _PAGE_ACCESSED | 341 | ori r10, r10, _PAGE_ACCESSED |
333 | stw r10, 0(r11) | 342 | stw r10, 0(r11) |
343 | #endif | ||
334 | 344 | ||
335 | /* The Linux PTE won't go exactly into the MMU TLB. | 345 | /* The Linux PTE won't go exactly into the MMU TLB. |
336 | * Software indicator bits 21, 22 and 28 must be clear. | 346 | * Software indicator bits 21, 22 and 28 must be clear. |
@@ -395,8 +405,17 @@ DataStoreTLBMiss: | |||
395 | DO_8xx_CPU6(0x3b80, r3) | 405 | DO_8xx_CPU6(0x3b80, r3) |
396 | mtspr SPRN_MD_TWC, r11 | 406 | mtspr SPRN_MD_TWC, r11 |
397 | 407 | ||
398 | mfspr r11, SPRN_MD_TWC /* get the pte address again */ | 408 | #ifdef CONFIG_SWAP |
409 | /* do not set the _PAGE_ACCESSED bit of a non-present page */ | ||
410 | andi. r11, r10, _PAGE_PRESENT | ||
411 | beq 4f | ||
412 | ori r10, r10, _PAGE_ACCESSED | ||
413 | 4: | ||
414 | /* and update pte in table */ | ||
415 | #else | ||
399 | ori r10, r10, _PAGE_ACCESSED | 416 | ori r10, r10, _PAGE_ACCESSED |
417 | #endif | ||
418 | mfspr r11, SPRN_MD_TWC /* get the pte address again */ | ||
400 | stw r10, 0(r11) | 419 | stw r10, 0(r11) |
401 | 420 | ||
402 | /* The Linux PTE won't go exactly into the MMU TLB. | 421 | /* The Linux PTE won't go exactly into the MMU TLB. |
@@ -575,7 +594,16 @@ DataTLBError: | |||
575 | 594 | ||
576 | /* Update 'changed', among others. | 595 | /* Update 'changed', among others. |
577 | */ | 596 | */ |
597 | #ifdef CONFIG_SWAP | ||
598 | ori r10, r10, _PAGE_DIRTY|_PAGE_HWWRITE | ||
599 | /* do not set the _PAGE_ACCESSED bit of a non-present page */ | ||
600 | andi. r11, r10, _PAGE_PRESENT | ||
601 | beq 4f | ||
602 | ori r10, r10, _PAGE_ACCESSED | ||
603 | 4: | ||
604 | #else | ||
578 | ori r10, r10, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE | 605 | ori r10, r10, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE |
606 | #endif | ||
579 | mfspr r11, SPRN_MD_TWC /* Get pte address again */ | 607 | mfspr r11, SPRN_MD_TWC /* Get pte address again */ |
580 | stw r10, 0(r11) /* and update pte in table */ | 608 | stw r10, 0(r11) /* and update pte in table */ |
581 | 609 | ||
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index b21444b681b6..1831833c430e 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -61,6 +61,7 @@ config S390 | |||
61 | def_bool y | 61 | def_bool y |
62 | select HAVE_OPROFILE | 62 | select HAVE_OPROFILE |
63 | select HAVE_KPROBES | 63 | select HAVE_KPROBES |
64 | select HAVE_KRETPROBES | ||
64 | 65 | ||
65 | source "init/Kconfig" | 66 | source "init/Kconfig" |
66 | 67 | ||
@@ -350,6 +351,10 @@ endchoice | |||
350 | 351 | ||
351 | source "fs/Kconfig.binfmt" | 352 | source "fs/Kconfig.binfmt" |
352 | 353 | ||
354 | config FORCE_MAX_ZONEORDER | ||
355 | int | ||
356 | default "9" | ||
357 | |||
353 | config PROCESS_DEBUG | 358 | config PROCESS_DEBUG |
354 | bool "Show crashed user process info" | 359 | bool "Show crashed user process info" |
355 | help | 360 | help |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index 39921f3a9685..62f6b5a606dd 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.24 | 3 | # Linux kernel version: 2.6.25-rc4 |
4 | # Sat Feb 9 12:13:01 2008 | 4 | # Wed Mar 5 11:22:59 2008 |
5 | # | 5 | # |
6 | CONFIG_MMU=y | 6 | CONFIG_MMU=y |
7 | CONFIG_ZONE_DMA=y | 7 | CONFIG_ZONE_DMA=y |
@@ -43,12 +43,15 @@ CONFIG_CGROUPS=y | |||
43 | # CONFIG_CGROUP_DEBUG is not set | 43 | # CONFIG_CGROUP_DEBUG is not set |
44 | CONFIG_CGROUP_NS=y | 44 | CONFIG_CGROUP_NS=y |
45 | # CONFIG_CPUSETS is not set | 45 | # CONFIG_CPUSETS is not set |
46 | CONFIG_GROUP_SCHED=y | ||
46 | CONFIG_FAIR_GROUP_SCHED=y | 47 | CONFIG_FAIR_GROUP_SCHED=y |
47 | CONFIG_FAIR_USER_SCHED=y | 48 | # CONFIG_RT_GROUP_SCHED is not set |
48 | # CONFIG_FAIR_CGROUP_SCHED is not set | 49 | CONFIG_USER_SCHED=y |
50 | # CONFIG_CGROUP_SCHED is not set | ||
49 | # CONFIG_CGROUP_CPUACCT is not set | 51 | # CONFIG_CGROUP_CPUACCT is not set |
50 | # CONFIG_RESOURCE_COUNTERS is not set | 52 | # CONFIG_RESOURCE_COUNTERS is not set |
51 | CONFIG_SYSFS_DEPRECATED=y | 53 | CONFIG_SYSFS_DEPRECATED=y |
54 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
52 | # CONFIG_RELAY is not set | 55 | # CONFIG_RELAY is not set |
53 | CONFIG_NAMESPACES=y | 56 | CONFIG_NAMESPACES=y |
54 | CONFIG_UTS_NS=y | 57 | CONFIG_UTS_NS=y |
@@ -85,7 +88,9 @@ CONFIG_SLAB=y | |||
85 | # CONFIG_MARKERS is not set | 88 | # CONFIG_MARKERS is not set |
86 | CONFIG_HAVE_OPROFILE=y | 89 | CONFIG_HAVE_OPROFILE=y |
87 | CONFIG_KPROBES=y | 90 | CONFIG_KPROBES=y |
91 | CONFIG_KRETPROBES=y | ||
88 | CONFIG_HAVE_KPROBES=y | 92 | CONFIG_HAVE_KPROBES=y |
93 | CONFIG_HAVE_KRETPROBES=y | ||
89 | CONFIG_PROC_PAGE_MONITOR=y | 94 | CONFIG_PROC_PAGE_MONITOR=y |
90 | CONFIG_SLABINFO=y | 95 | CONFIG_SLABINFO=y |
91 | CONFIG_RT_MUTEXES=y | 96 | CONFIG_RT_MUTEXES=y |
@@ -185,6 +190,7 @@ CONFIG_IPL=y | |||
185 | CONFIG_IPL_VM=y | 190 | CONFIG_IPL_VM=y |
186 | CONFIG_BINFMT_ELF=y | 191 | CONFIG_BINFMT_ELF=y |
187 | CONFIG_BINFMT_MISC=m | 192 | CONFIG_BINFMT_MISC=m |
193 | CONFIG_FORCE_MAX_ZONEORDER=9 | ||
188 | # CONFIG_PROCESS_DEBUG is not set | 194 | # CONFIG_PROCESS_DEBUG is not set |
189 | CONFIG_PFAULT=y | 195 | CONFIG_PFAULT=y |
190 | # CONFIG_SHARED_KERNEL is not set | 196 | # CONFIG_SHARED_KERNEL is not set |
@@ -435,6 +441,7 @@ CONFIG_DASD_EER=y | |||
435 | CONFIG_MISC_DEVICES=y | 441 | CONFIG_MISC_DEVICES=y |
436 | # CONFIG_EEPROM_93CX6 is not set | 442 | # CONFIG_EEPROM_93CX6 is not set |
437 | # CONFIG_ENCLOSURE_SERVICES is not set | 443 | # CONFIG_ENCLOSURE_SERVICES is not set |
444 | # CONFIG_HAVE_IDE is not set | ||
438 | 445 | ||
439 | # | 446 | # |
440 | # SCSI device support | 447 | # SCSI device support |
@@ -593,6 +600,7 @@ CONFIG_S390_VMUR=m | |||
593 | # | 600 | # |
594 | # Sonics Silicon Backplane | 601 | # Sonics Silicon Backplane |
595 | # | 602 | # |
603 | # CONFIG_MEMSTICK is not set | ||
596 | 604 | ||
597 | # | 605 | # |
598 | # File systems | 606 | # File systems |
@@ -750,7 +758,6 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
750 | # CONFIG_DEBUG_LIST is not set | 758 | # CONFIG_DEBUG_LIST is not set |
751 | # CONFIG_DEBUG_SG is not set | 759 | # CONFIG_DEBUG_SG is not set |
752 | # CONFIG_FRAME_POINTER is not set | 760 | # CONFIG_FRAME_POINTER is not set |
753 | CONFIG_FORCED_INLINING=y | ||
754 | # CONFIG_RCU_TORTURE_TEST is not set | 761 | # CONFIG_RCU_TORTURE_TEST is not set |
755 | # CONFIG_KPROBES_SANITY_TEST is not set | 762 | # CONFIG_KPROBES_SANITY_TEST is not set |
756 | # CONFIG_BACKTRACE_SELF_TEST is not set | 763 | # CONFIG_BACKTRACE_SELF_TEST is not set |
@@ -759,6 +766,7 @@ CONFIG_FORCED_INLINING=y | |||
759 | # CONFIG_LATENCYTOP is not set | 766 | # CONFIG_LATENCYTOP is not set |
760 | CONFIG_SAMPLES=y | 767 | CONFIG_SAMPLES=y |
761 | # CONFIG_SAMPLE_KOBJECT is not set | 768 | # CONFIG_SAMPLE_KOBJECT is not set |
769 | # CONFIG_SAMPLE_KPROBES is not set | ||
762 | # CONFIG_DEBUG_PAGEALLOC is not set | 770 | # CONFIG_DEBUG_PAGEALLOC is not set |
763 | 771 | ||
764 | # | 772 | # |
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index b3b650a93c7c..4d3e38392cb1 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile | |||
@@ -4,6 +4,11 @@ | |||
4 | 4 | ||
5 | EXTRA_AFLAGS := -traditional | 5 | EXTRA_AFLAGS := -traditional |
6 | 6 | ||
7 | # | ||
8 | # Passing null pointers is ok for smp code, since we access the lowcore here. | ||
9 | # | ||
10 | CFLAGS_smp.o := -Wno-nonnull | ||
11 | |||
7 | obj-y := bitmap.o traps.o time.o process.o base.o early.o \ | 12 | obj-y := bitmap.o traps.o time.o process.o base.o early.o \ |
8 | setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ | 13 | setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ |
9 | semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o diag.o | 14 | semaphore.o s390_ext.o debug.o irq.o ipl.o dis.o diag.o |
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index 9f7b73b180f0..01832c440636 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c | |||
@@ -88,13 +88,17 @@ static noinline __init void create_kernel_nss(void) | |||
88 | 88 | ||
89 | __cpcmd(defsys_cmd, NULL, 0, &response); | 89 | __cpcmd(defsys_cmd, NULL, 0, &response); |
90 | 90 | ||
91 | if (response != 0) | 91 | if (response != 0) { |
92 | kernel_nss_name[0] = '\0'; | ||
92 | return; | 93 | return; |
94 | } | ||
93 | 95 | ||
94 | __cpcmd(savesys_cmd, NULL, 0, &response); | 96 | __cpcmd(savesys_cmd, NULL, 0, &response); |
95 | 97 | ||
96 | if (response != strlen(savesys_cmd)) | 98 | if (response != strlen(savesys_cmd)) { |
99 | kernel_nss_name[0] = '\0'; | ||
97 | return; | 100 | return; |
101 | } | ||
98 | 102 | ||
99 | ipl_flags = IPL_NSS_VALID; | 103 | ipl_flags = IPL_NSS_VALID; |
100 | } | 104 | } |
diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c index 60acdc266db1..375232c46c7a 100644 --- a/arch/s390/kernel/ipl.c +++ b/arch/s390/kernel/ipl.c | |||
@@ -704,6 +704,7 @@ void reipl_run(struct shutdown_trigger *trigger) | |||
704 | default: | 704 | default: |
705 | break; | 705 | break; |
706 | } | 706 | } |
707 | disabled_wait((unsigned long) __builtin_return_address(0)); | ||
707 | } | 708 | } |
708 | 709 | ||
709 | static void __init reipl_probe(void) | 710 | static void __init reipl_probe(void) |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 1c59ec161cf8..ce203154d8ce 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -152,6 +152,10 @@ static void default_idle(void) | |||
152 | local_mcck_disable(); | 152 | local_mcck_disable(); |
153 | if (test_thread_flag(TIF_MCCK_PENDING)) { | 153 | if (test_thread_flag(TIF_MCCK_PENDING)) { |
154 | local_mcck_enable(); | 154 | local_mcck_enable(); |
155 | /* disable monitor call class 0 */ | ||
156 | __ctl_clear_bit(8, 15); | ||
157 | atomic_notifier_call_chain(&idle_chain, S390_CPU_NOT_IDLE, | ||
158 | hcpu); | ||
155 | local_irq_enable(); | 159 | local_irq_enable(); |
156 | s390_handle_mcck(); | 160 | s390_handle_mcck(); |
157 | return; | 161 | return; |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 818bd09c0260..8f894d380a62 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -629,14 +629,8 @@ static int __cpuinit smp_alloc_lowcore(int cpu) | |||
629 | panic_stack = __get_free_page(GFP_KERNEL); | 629 | panic_stack = __get_free_page(GFP_KERNEL); |
630 | if (!panic_stack || !async_stack) | 630 | if (!panic_stack || !async_stack) |
631 | goto out; | 631 | goto out; |
632 | /* | 632 | memcpy(lowcore, &S390_lowcore, 512); |
633 | * Only need to copy the first 512 bytes from address 0. But since | 633 | memset((char *)lowcore + 512, 0, sizeof(*lowcore) - 512); |
634 | * the compiler emits a warning if src == NULL for memcpy use copy_page | ||
635 | * instead. Copies more than needed but this code is not performance | ||
636 | * critical. | ||
637 | */ | ||
638 | copy_page(lowcore, &S390_lowcore); | ||
639 | memset((void *)lowcore + 512, 0, sizeof(*lowcore) - 512); | ||
640 | lowcore->async_stack = async_stack + ASYNC_SIZE; | 634 | lowcore->async_stack = async_stack + ASYNC_SIZE; |
641 | lowcore->panic_stack = panic_stack + PAGE_SIZE; | 635 | lowcore->panic_stack = panic_stack + PAGE_SIZE; |
642 | 636 | ||
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 76a5dd1b4ce9..cb232c155360 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
@@ -209,8 +209,6 @@ static void stop_hz_timer(void) | |||
209 | */ | 209 | */ |
210 | static void start_hz_timer(void) | 210 | static void start_hz_timer(void) |
211 | { | 211 | { |
212 | BUG_ON(!in_interrupt()); | ||
213 | |||
214 | if (!cpu_isset(smp_processor_id(), nohz_cpu_mask)) | 212 | if (!cpu_isset(smp_processor_id(), nohz_cpu_mask)) |
215 | return; | 213 | return; |
216 | account_ticks(get_clock()); | 214 | account_ticks(get_clock()); |
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index b3400b5ad5c6..95b7534e9e3c 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -330,6 +330,7 @@ config CPU_SUBTYPE_SH5_101 | |||
330 | 330 | ||
331 | config CPU_SUBTYPE_SH5_103 | 331 | config CPU_SUBTYPE_SH5_103 |
332 | bool "Support SH5-103 processor" | 332 | bool "Support SH5-103 processor" |
333 | select CPU_SH5 | ||
333 | 334 | ||
334 | endchoice | 335 | endchoice |
335 | 336 | ||
@@ -455,13 +456,6 @@ config SH_SECUREEDGE5410 | |||
455 | This includes both the OEM SecureEdge products as well as the | 456 | This includes both the OEM SecureEdge products as well as the |
456 | SME product line. | 457 | SME product line. |
457 | 458 | ||
458 | config SH_7710VOIPGW | ||
459 | bool "SH7710-VOIP-GW" | ||
460 | depends on CPU_SUBTYPE_SH7710 | ||
461 | help | ||
462 | Select this option to build a kernel for the SH7710 based | ||
463 | VOIP GW. | ||
464 | |||
465 | config SH_RTS7751R2D | 459 | config SH_RTS7751R2D |
466 | bool "RTS7751R2D" | 460 | bool "RTS7751R2D" |
467 | depends on CPU_SUBTYPE_SH7751R | 461 | depends on CPU_SUBTYPE_SH7751R |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index 81381e5773c8..c510c225144f 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
@@ -118,7 +118,6 @@ machdir-$(CONFIG_SH_EDOSK7705) += renesas/edosk7705 | |||
118 | machdir-$(CONFIG_SH_HIGHLANDER) += renesas/r7780rp | 118 | machdir-$(CONFIG_SH_HIGHLANDER) += renesas/r7780rp |
119 | machdir-$(CONFIG_SH_MIGOR) += renesas/migor | 119 | machdir-$(CONFIG_SH_MIGOR) += renesas/migor |
120 | machdir-$(CONFIG_SH_SDK7780) += renesas/sdk7780 | 120 | machdir-$(CONFIG_SH_SDK7780) += renesas/sdk7780 |
121 | machdir-$(CONFIG_SH_7710VOIPGW) += renesas/sh7710voipgw | ||
122 | machdir-$(CONFIG_SH_X3PROTO) += renesas/x3proto | 121 | machdir-$(CONFIG_SH_X3PROTO) += renesas/x3proto |
123 | machdir-$(CONFIG_SH_SH4202_MICRODEV) += superh/microdev | 122 | machdir-$(CONFIG_SH_SH4202_MICRODEV) += superh/microdev |
124 | machdir-$(CONFIG_SH_LANDISK) += landisk | 123 | machdir-$(CONFIG_SH_LANDISK) += landisk |
diff --git a/arch/sh/boards/hp6xx/hp6xx_apm.c b/arch/sh/boards/hp6xx/hp6xx_apm.c index 640ca2a74f16..177f4f028e0d 100644 --- a/arch/sh/boards/hp6xx/hp6xx_apm.c +++ b/arch/sh/boards/hp6xx/hp6xx_apm.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * bios-less APM driver for hp680 | 2 | * bios-less APM driver for hp680 |
3 | * | 3 | * |
4 | * Copyright 2005 (c) Andriy Skulysh <askulysh@gmail.com> | 4 | * Copyright 2005 (c) Andriy Skulysh <askulysh@gmail.com> |
5 | * Copyright 2008 (c) Kristoffer Ericson <kristoffer.ericson@gmail.com> | ||
5 | * | 6 | * |
6 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU General Public License. | 8 | * modify it under the terms of the GNU General Public License. |
@@ -15,17 +16,19 @@ | |||
15 | #include <asm/adc.h> | 16 | #include <asm/adc.h> |
16 | #include <asm/hp6xx.h> | 17 | #include <asm/hp6xx.h> |
17 | 18 | ||
18 | #define SH7709_PGDR 0xa400012c | 19 | /* percentage values */ |
19 | |||
20 | #define APM_CRITICAL 10 | 20 | #define APM_CRITICAL 10 |
21 | #define APM_LOW 30 | 21 | #define APM_LOW 30 |
22 | 22 | ||
23 | /* resonably sane values */ | ||
23 | #define HP680_BATTERY_MAX 898 | 24 | #define HP680_BATTERY_MAX 898 |
24 | #define HP680_BATTERY_MIN 486 | 25 | #define HP680_BATTERY_MIN 486 |
25 | #define HP680_BATTERY_AC_ON 1023 | 26 | #define HP680_BATTERY_AC_ON 1023 |
26 | 27 | ||
27 | #define MODNAME "hp6x0_apm" | 28 | #define MODNAME "hp6x0_apm" |
28 | 29 | ||
30 | #define PGDR 0xa400012c | ||
31 | |||
29 | static void hp6x0_apm_get_power_status(struct apm_power_info *info) | 32 | static void hp6x0_apm_get_power_status(struct apm_power_info *info) |
30 | { | 33 | { |
31 | int battery, backup, charging, percentage; | 34 | int battery, backup, charging, percentage; |
@@ -38,17 +41,26 @@ static void hp6x0_apm_get_power_status(struct apm_power_info *info) | |||
38 | percentage = 100 * (battery - HP680_BATTERY_MIN) / | 41 | percentage = 100 * (battery - HP680_BATTERY_MIN) / |
39 | (HP680_BATTERY_MAX - HP680_BATTERY_MIN); | 42 | (HP680_BATTERY_MAX - HP680_BATTERY_MIN); |
40 | 43 | ||
44 | /* % of full battery */ | ||
45 | info->battery_life = percentage; | ||
46 | |||
47 | /* We want our estimates in minutes */ | ||
48 | info->units = 0; | ||
49 | |||
50 | /* Extremely(!!) rough estimate, we will replace this with a datalist later on */ | ||
51 | info->time = (2 * battery); | ||
52 | |||
41 | info->ac_line_status = (battery > HP680_BATTERY_AC_ON) ? | 53 | info->ac_line_status = (battery > HP680_BATTERY_AC_ON) ? |
42 | APM_AC_ONLINE : APM_AC_OFFLINE; | 54 | APM_AC_ONLINE : APM_AC_OFFLINE; |
43 | 55 | ||
44 | pgdr = ctrl_inb(SH7709_PGDR); | 56 | pgdr = ctrl_inb(PGDR); |
45 | if (pgdr & PGDR_MAIN_BATTERY_OUT) { | 57 | if (pgdr & PGDR_MAIN_BATTERY_OUT) { |
46 | info->battery_status = APM_BATTERY_STATUS_NOT_PRESENT; | 58 | info->battery_status = APM_BATTERY_STATUS_NOT_PRESENT; |
47 | info->battery_flag = 0x80; | 59 | info->battery_flag = 0x80; |
48 | } else if (charging < 8) { | 60 | } else if (charging < 8) { |
49 | info->battery_status = APM_BATTERY_STATUS_CHARGING; | 61 | info->battery_status = APM_BATTERY_STATUS_CHARGING; |
50 | info->battery_flag = 0x08; | 62 | info->battery_flag = 0x08; |
51 | info->ac_line_status = 0xff; | 63 | info->ac_line_status = 0x01; |
52 | } else if (percentage <= APM_CRITICAL) { | 64 | } else if (percentage <= APM_CRITICAL) { |
53 | info->battery_status = APM_BATTERY_STATUS_CRITICAL; | 65 | info->battery_status = APM_BATTERY_STATUS_CRITICAL; |
54 | info->battery_flag = 0x04; | 66 | info->battery_flag = 0x04; |
@@ -59,8 +71,6 @@ static void hp6x0_apm_get_power_status(struct apm_power_info *info) | |||
59 | info->battery_status = APM_BATTERY_STATUS_HIGH; | 71 | info->battery_status = APM_BATTERY_STATUS_HIGH; |
60 | info->battery_flag = 0x01; | 72 | info->battery_flag = 0x01; |
61 | } | 73 | } |
62 | |||
63 | info->units = 0; | ||
64 | } | 74 | } |
65 | 75 | ||
66 | static irqreturn_t hp6x0_apm_interrupt(int irq, void *dev) | 76 | static irqreturn_t hp6x0_apm_interrupt(int irq, void *dev) |
diff --git a/arch/sh/boards/renesas/sh7710voipgw/Makefile b/arch/sh/boards/renesas/sh7710voipgw/Makefile deleted file mode 100644 index 77037567633b..000000000000 --- a/arch/sh/boards/renesas/sh7710voipgw/Makefile +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | obj-y := setup.o | ||
diff --git a/arch/sh/boards/renesas/sh7710voipgw/setup.c b/arch/sh/boards/renesas/sh7710voipgw/setup.c deleted file mode 100644 index 0d56fd83bcba..000000000000 --- a/arch/sh/boards/renesas/sh7710voipgw/setup.c +++ /dev/null | |||
@@ -1,94 +0,0 @@ | |||
1 | /* | ||
2 | * Renesas Technology SH7710 VoIP Gateway | ||
3 | * | ||
4 | * Copyright (C) 2006 Ranjit Deshpande | ||
5 | * Kenati Technologies Inc. | ||
6 | * | ||
7 | * May be copied or modified under the terms of the GNU General Public | ||
8 | * License. See linux/COPYING for more information. | ||
9 | */ | ||
10 | #include <linux/init.h> | ||
11 | #include <asm/machvec.h> | ||
12 | #include <asm/irq.h> | ||
13 | #include <asm/io.h> | ||
14 | |||
15 | static struct ipr_data sh7710voipgw_ipr_map[] = { | ||
16 | { TIMER2_IRQ, TIMER2_IPR_ADDR, TIMER2_IPR_POS, TIMER2_PRIORITY }, | ||
17 | { WDT_IRQ, WDT_IPR_ADDR, WDT_IPR_POS, WDT_PRIORITY }, | ||
18 | |||
19 | /* SCIF0 */ | ||
20 | { SCIF0_ERI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY }, | ||
21 | { SCIF0_RXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY }, | ||
22 | { SCIF0_BRI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY }, | ||
23 | { SCIF0_TXI_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY }, | ||
24 | |||
25 | /* DMAC-1 */ | ||
26 | { DMTE0_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
27 | { DMTE1_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
28 | { DMTE2_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
29 | { DMTE3_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY }, | ||
30 | |||
31 | /* DMAC-2 */ | ||
32 | { DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY }, | ||
33 | { DMTE4_IRQ, DMA2_IPR_ADDR, DMA2_IPR_POS, DMA2_PRIORITY }, | ||
34 | |||
35 | /* IPSEC */ | ||
36 | { IPSEC_IRQ, IPSEC_IPR_ADDR, IPSEC_IPR_POS, IPSEC_PRIORITY }, | ||
37 | |||
38 | /* EDMAC */ | ||
39 | { EDMAC0_IRQ, EDMAC0_IPR_ADDR, EDMAC0_IPR_POS, EDMAC0_PRIORITY }, | ||
40 | { EDMAC1_IRQ, EDMAC1_IPR_ADDR, EDMAC1_IPR_POS, EDMAC1_PRIORITY }, | ||
41 | { EDMAC2_IRQ, EDMAC2_IPR_ADDR, EDMAC2_IPR_POS, EDMAC2_PRIORITY }, | ||
42 | |||
43 | /* SIOF0 */ | ||
44 | { SIOF0_ERI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
45 | { SIOF0_TXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
46 | { SIOF0_RXI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
47 | { SIOF0_CCI_IRQ, SIOF0_IPR_ADDR, SIOF0_IPR_POS, SIOF0_PRIORITY }, | ||
48 | |||
49 | /* SIOF1 */ | ||
50 | { SIOF1_ERI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY }, | ||
51 | { SIOF1_TXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY }, | ||
52 | { SIOF1_RXI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY }, | ||
53 | { SIOF1_CCI_IRQ, SIOF1_IPR_ADDR, SIOF1_IPR_POS, SIOF1_PRIORITY }, | ||
54 | |||
55 | /* SLIC IRQ's */ | ||
56 | { IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY }, | ||
57 | { IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY }, | ||
58 | }; | ||
59 | |||
60 | /* | ||
61 | * Initialize IRQ setting | ||
62 | */ | ||
63 | static void __init sh7710voipgw_init_irq(void) | ||
64 | { | ||
65 | /* Disable all interrupts in IPR registers */ | ||
66 | ctrl_outw(0x0, INTC_IPRA); | ||
67 | ctrl_outw(0x0, INTC_IPRB); | ||
68 | ctrl_outw(0x0, INTC_IPRC); | ||
69 | ctrl_outw(0x0, INTC_IPRD); | ||
70 | ctrl_outw(0x0, INTC_IPRE); | ||
71 | ctrl_outw(0x0, INTC_IPRF); | ||
72 | ctrl_outw(0x0, INTC_IPRG); | ||
73 | ctrl_outw(0x0, INTC_IPRH); | ||
74 | ctrl_outw(0x0, INTC_IPRI); | ||
75 | |||
76 | /* Ack all interrupt sources in the IRR0 register */ | ||
77 | ctrl_outb(0x3f, INTC_IRR0); | ||
78 | |||
79 | /* Use IRQ0 - IRQ3 as active low interrupt lines i.e. disable | ||
80 | * IRL mode. | ||
81 | */ | ||
82 | ctrl_outw(0x2aa, INTC_ICR1); | ||
83 | |||
84 | make_ipr_irq(sh7710voipgw_ipr_map, ARRAY_SIZE(sh7710voipgw_ipr_map)); | ||
85 | } | ||
86 | |||
87 | /* | ||
88 | * The Machine Vector | ||
89 | */ | ||
90 | static struct sh_machine_vector mv_sh7710voipgw __initmv = { | ||
91 | .mv_name = "SH7710 VoIP Gateway", | ||
92 | .mv_nr_irqs = 104, | ||
93 | .mv_init_irq = sh7710voipgw_init_irq, | ||
94 | }; | ||
diff --git a/arch/sh/boards/renesas/x3proto/ilsel.c b/arch/sh/boards/renesas/x3proto/ilsel.c index 6d4454fef97c..b5c673c39337 100644 --- a/arch/sh/boards/renesas/x3proto/ilsel.c +++ b/arch/sh/boards/renesas/x3proto/ilsel.c | |||
@@ -68,7 +68,7 @@ static void __ilsel_enable(ilsel_source_t set, unsigned int bit) | |||
68 | shift = mk_ilsel_shift(bit); | 68 | shift = mk_ilsel_shift(bit); |
69 | 69 | ||
70 | pr_debug("%s: bit#%d: addr - 0x%08lx (shift %d, set %d)\n", | 70 | pr_debug("%s: bit#%d: addr - 0x%08lx (shift %d, set %d)\n", |
71 | __FUNCTION__, bit, addr, shift, set); | 71 | __func__, bit, addr, shift, set); |
72 | 72 | ||
73 | tmp = ctrl_inw(addr); | 73 | tmp = ctrl_inw(addr); |
74 | tmp &= ~(0xf << shift); | 74 | tmp &= ~(0xf << shift); |
diff --git a/arch/sh/boards/superh/microdev/io.c b/arch/sh/boards/superh/microdev/io.c index b704e20d7e4d..9f8a540f7e14 100644 --- a/arch/sh/boards/superh/microdev/io.c +++ b/arch/sh/boards/superh/microdev/io.c | |||
@@ -127,7 +127,7 @@ static unsigned long microdev_isa_port2addr(unsigned long offset) | |||
127 | * safe default. | 127 | * safe default. |
128 | */ | 128 | */ |
129 | printk("Warning: unexpected port in %s( offset = 0x%lx )\n", | 129 | printk("Warning: unexpected port in %s( offset = 0x%lx )\n", |
130 | __FUNCTION__, offset); | 130 | __func__, offset); |
131 | result = PVR; | 131 | result = PVR; |
132 | } | 132 | } |
133 | 133 | ||
diff --git a/arch/sh/configs/r7780mp_defconfig b/arch/sh/configs/r7780mp_defconfig index 2ad804ec920a..1a072615ffd4 100644 --- a/arch/sh/configs/r7780mp_defconfig +++ b/arch/sh/configs/r7780mp_defconfig | |||
@@ -1,9 +1,10 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.24-rc2 | 3 | # Linux kernel version: 2.6.25-rc4 |
4 | # Tue Nov 13 20:32:39 2007 | 4 | # Thu Mar 6 15:39:59 2008 |
5 | # | 5 | # |
6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
7 | CONFIG_SUPERH32=y | ||
7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
8 | CONFIG_GENERIC_BUG=y | 9 | CONFIG_GENERIC_BUG=y |
9 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 10 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
@@ -19,6 +20,8 @@ CONFIG_LOCKDEP_SUPPORT=y | |||
19 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set |
20 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
21 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | 22 | CONFIG_ARCH_NO_VIRT_TO_BUS=y |
23 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
24 | CONFIG_IO_TRAPPED=y | ||
22 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 25 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
23 | 26 | ||
24 | # | 27 | # |
@@ -37,17 +40,20 @@ CONFIG_SYSVIPC_SYSCTL=y | |||
37 | CONFIG_BSD_PROCESS_ACCT=y | 40 | CONFIG_BSD_PROCESS_ACCT=y |
38 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set | 41 | # CONFIG_BSD_PROCESS_ACCT_V3 is not set |
39 | # CONFIG_TASKSTATS is not set | 42 | # CONFIG_TASKSTATS is not set |
40 | # CONFIG_USER_NS is not set | ||
41 | # CONFIG_AUDIT is not set | 43 | # CONFIG_AUDIT is not set |
42 | CONFIG_IKCONFIG=y | 44 | CONFIG_IKCONFIG=y |
43 | CONFIG_IKCONFIG_PROC=y | 45 | CONFIG_IKCONFIG_PROC=y |
44 | CONFIG_LOG_BUF_SHIFT=14 | 46 | CONFIG_LOG_BUF_SHIFT=14 |
45 | # CONFIG_CGROUPS is not set | 47 | # CONFIG_CGROUPS is not set |
48 | CONFIG_GROUP_SCHED=y | ||
46 | CONFIG_FAIR_GROUP_SCHED=y | 49 | CONFIG_FAIR_GROUP_SCHED=y |
47 | CONFIG_FAIR_USER_SCHED=y | 50 | # CONFIG_RT_GROUP_SCHED is not set |
48 | # CONFIG_FAIR_CGROUP_SCHED is not set | 51 | CONFIG_USER_SCHED=y |
49 | # CONFIG_SYSFS_DEPRECATED is not set | 52 | # CONFIG_CGROUP_SCHED is not set |
53 | CONFIG_SYSFS_DEPRECATED=y | ||
54 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
50 | # CONFIG_RELAY is not set | 55 | # CONFIG_RELAY is not set |
56 | # CONFIG_NAMESPACES is not set | ||
51 | # CONFIG_BLK_DEV_INITRD is not set | 57 | # CONFIG_BLK_DEV_INITRD is not set |
52 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 58 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
53 | CONFIG_SYSCTL=y | 59 | CONFIG_SYSCTL=y |
@@ -61,17 +67,27 @@ CONFIG_HOTPLUG=y | |||
61 | CONFIG_PRINTK=y | 67 | CONFIG_PRINTK=y |
62 | CONFIG_BUG=y | 68 | CONFIG_BUG=y |
63 | CONFIG_ELF_CORE=y | 69 | CONFIG_ELF_CORE=y |
70 | CONFIG_COMPAT_BRK=y | ||
64 | CONFIG_BASE_FULL=y | 71 | CONFIG_BASE_FULL=y |
65 | # CONFIG_FUTEX is not set | 72 | # CONFIG_FUTEX is not set |
66 | CONFIG_ANON_INODES=y | 73 | CONFIG_ANON_INODES=y |
67 | # CONFIG_EPOLL is not set | 74 | # CONFIG_EPOLL is not set |
68 | CONFIG_SIGNALFD=y | 75 | CONFIG_SIGNALFD=y |
76 | CONFIG_TIMERFD=y | ||
69 | CONFIG_EVENTFD=y | 77 | CONFIG_EVENTFD=y |
70 | CONFIG_SHMEM=y | 78 | CONFIG_SHMEM=y |
71 | CONFIG_VM_EVENT_COUNTERS=y | 79 | CONFIG_VM_EVENT_COUNTERS=y |
72 | CONFIG_SLAB=y | 80 | CONFIG_SLAB=y |
73 | # CONFIG_SLUB is not set | 81 | # CONFIG_SLUB is not set |
74 | # CONFIG_SLOB is not set | 82 | # CONFIG_SLOB is not set |
83 | CONFIG_PROFILING=y | ||
84 | # CONFIG_MARKERS is not set | ||
85 | CONFIG_OPROFILE=m | ||
86 | CONFIG_HAVE_OPROFILE=y | ||
87 | # CONFIG_HAVE_KPROBES is not set | ||
88 | # CONFIG_HAVE_KRETPROBES is not set | ||
89 | CONFIG_PROC_PAGE_MONITOR=y | ||
90 | CONFIG_SLABINFO=y | ||
75 | # CONFIG_TINY_SHMEM is not set | 91 | # CONFIG_TINY_SHMEM is not set |
76 | CONFIG_BASE_SMALL=0 | 92 | CONFIG_BASE_SMALL=0 |
77 | CONFIG_MODULES=y | 93 | CONFIG_MODULES=y |
@@ -98,6 +114,8 @@ CONFIG_IOSCHED_NOOP=y | |||
98 | # CONFIG_DEFAULT_CFQ is not set | 114 | # CONFIG_DEFAULT_CFQ is not set |
99 | CONFIG_DEFAULT_NOOP=y | 115 | CONFIG_DEFAULT_NOOP=y |
100 | CONFIG_DEFAULT_IOSCHED="noop" | 116 | CONFIG_DEFAULT_IOSCHED="noop" |
117 | CONFIG_CLASSIC_RCU=y | ||
118 | # CONFIG_PREEMPT_RCU is not set | ||
101 | 119 | ||
102 | # | 120 | # |
103 | # System type | 121 | # System type |
@@ -105,7 +123,9 @@ CONFIG_DEFAULT_IOSCHED="noop" | |||
105 | CONFIG_CPU_SH4=y | 123 | CONFIG_CPU_SH4=y |
106 | CONFIG_CPU_SH4A=y | 124 | CONFIG_CPU_SH4A=y |
107 | # CONFIG_CPU_SUBTYPE_SH7619 is not set | 125 | # CONFIG_CPU_SUBTYPE_SH7619 is not set |
126 | # CONFIG_CPU_SUBTYPE_SH7203 is not set | ||
108 | # CONFIG_CPU_SUBTYPE_SH7206 is not set | 127 | # CONFIG_CPU_SUBTYPE_SH7206 is not set |
128 | # CONFIG_CPU_SUBTYPE_SH7263 is not set | ||
109 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | 129 | # CONFIG_CPU_SUBTYPE_SH7705 is not set |
110 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | 130 | # CONFIG_CPU_SUBTYPE_SH7706 is not set |
111 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | 131 | # CONFIG_CPU_SUBTYPE_SH7707 is not set |
@@ -114,6 +134,7 @@ CONFIG_CPU_SH4A=y | |||
114 | # CONFIG_CPU_SUBTYPE_SH7710 is not set | 134 | # CONFIG_CPU_SUBTYPE_SH7710 is not set |
115 | # CONFIG_CPU_SUBTYPE_SH7712 is not set | 135 | # CONFIG_CPU_SUBTYPE_SH7712 is not set |
116 | # CONFIG_CPU_SUBTYPE_SH7720 is not set | 136 | # CONFIG_CPU_SUBTYPE_SH7720 is not set |
137 | # CONFIG_CPU_SUBTYPE_SH7721 is not set | ||
117 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | 138 | # CONFIG_CPU_SUBTYPE_SH7750 is not set |
118 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | 139 | # CONFIG_CPU_SUBTYPE_SH7091 is not set |
119 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | 140 | # CONFIG_CPU_SUBTYPE_SH7750R is not set |
@@ -122,12 +143,16 @@ CONFIG_CPU_SH4A=y | |||
122 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | 143 | # CONFIG_CPU_SUBTYPE_SH7751R is not set |
123 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | 144 | # CONFIG_CPU_SUBTYPE_SH7760 is not set |
124 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | 145 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set |
146 | # CONFIG_CPU_SUBTYPE_SH7763 is not set | ||
125 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | 147 | # CONFIG_CPU_SUBTYPE_SH7770 is not set |
126 | CONFIG_CPU_SUBTYPE_SH7780=y | 148 | CONFIG_CPU_SUBTYPE_SH7780=y |
127 | # CONFIG_CPU_SUBTYPE_SH7785 is not set | 149 | # CONFIG_CPU_SUBTYPE_SH7785 is not set |
128 | # CONFIG_CPU_SUBTYPE_SHX3 is not set | 150 | # CONFIG_CPU_SUBTYPE_SHX3 is not set |
129 | # CONFIG_CPU_SUBTYPE_SH7343 is not set | 151 | # CONFIG_CPU_SUBTYPE_SH7343 is not set |
130 | # CONFIG_CPU_SUBTYPE_SH7722 is not set | 152 | # CONFIG_CPU_SUBTYPE_SH7722 is not set |
153 | # CONFIG_CPU_SUBTYPE_SH7366 is not set | ||
154 | # CONFIG_CPU_SUBTYPE_SH5_101 is not set | ||
155 | # CONFIG_CPU_SUBTYPE_SH5_103 is not set | ||
131 | 156 | ||
132 | # | 157 | # |
133 | # Memory management options | 158 | # Memory management options |
@@ -137,7 +162,8 @@ CONFIG_MMU=y | |||
137 | CONFIG_PAGE_OFFSET=0x80000000 | 162 | CONFIG_PAGE_OFFSET=0x80000000 |
138 | CONFIG_MEMORY_START=0x08000000 | 163 | CONFIG_MEMORY_START=0x08000000 |
139 | CONFIG_MEMORY_SIZE=0x08000000 | 164 | CONFIG_MEMORY_SIZE=0x08000000 |
140 | # CONFIG_32BIT is not set | 165 | CONFIG_29BIT=y |
166 | # CONFIG_PMB is not set | ||
141 | CONFIG_VSYSCALL=y | 167 | CONFIG_VSYSCALL=y |
142 | CONFIG_ARCH_FLATMEM_ENABLE=y | 168 | CONFIG_ARCH_FLATMEM_ENABLE=y |
143 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | 169 | CONFIG_ARCH_SPARSEMEM_ENABLE=y |
@@ -153,6 +179,7 @@ CONFIG_HUGETLB_PAGE_SIZE_64K=y | |||
153 | # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set | 179 | # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set |
154 | # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set | 180 | # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set |
155 | # CONFIG_HUGETLB_PAGE_SIZE_64MB is not set | 181 | # CONFIG_HUGETLB_PAGE_SIZE_64MB is not set |
182 | # CONFIG_HUGETLB_PAGE_SIZE_512MB is not set | ||
156 | CONFIG_SELECT_MEMORY_MODEL=y | 183 | CONFIG_SELECT_MEMORY_MODEL=y |
157 | CONFIG_FLATMEM_MANUAL=y | 184 | CONFIG_FLATMEM_MANUAL=y |
158 | # CONFIG_DISCONTIGMEM_MANUAL is not set | 185 | # CONFIG_DISCONTIGMEM_MANUAL is not set |
@@ -190,6 +217,7 @@ CONFIG_CPU_HAS_FPU=y | |||
190 | # Board support | 217 | # Board support |
191 | # | 218 | # |
192 | # CONFIG_SH_7780_SOLUTION_ENGINE is not set | 219 | # CONFIG_SH_7780_SOLUTION_ENGINE is not set |
220 | # CONFIG_SH_SDK7780 is not set | ||
193 | CONFIG_SH_HIGHLANDER=y | 221 | CONFIG_SH_HIGHLANDER=y |
194 | # CONFIG_SH_R7780RP is not set | 222 | # CONFIG_SH_R7780RP is not set |
195 | CONFIG_SH_R7780MP=y | 223 | CONFIG_SH_R7780MP=y |
@@ -234,12 +262,13 @@ CONFIG_HZ_250=y | |||
234 | # CONFIG_HZ_300 is not set | 262 | # CONFIG_HZ_300 is not set |
235 | # CONFIG_HZ_1000 is not set | 263 | # CONFIG_HZ_1000 is not set |
236 | CONFIG_HZ=250 | 264 | CONFIG_HZ=250 |
265 | # CONFIG_SCHED_HRTICK is not set | ||
237 | CONFIG_KEXEC=y | 266 | CONFIG_KEXEC=y |
238 | # CONFIG_CRASH_DUMP is not set | 267 | # CONFIG_CRASH_DUMP is not set |
239 | # CONFIG_PREEMPT_NONE is not set | 268 | # CONFIG_PREEMPT_NONE is not set |
240 | # CONFIG_PREEMPT_VOLUNTARY is not set | 269 | # CONFIG_PREEMPT_VOLUNTARY is not set |
241 | CONFIG_PREEMPT=y | 270 | CONFIG_PREEMPT=y |
242 | CONFIG_PREEMPT_BKL=y | 271 | CONFIG_RCU_TRACE=y |
243 | CONFIG_GUSA=y | 272 | CONFIG_GUSA=y |
244 | 273 | ||
245 | # | 274 | # |
@@ -284,6 +313,7 @@ CONFIG_XFRM=y | |||
284 | # CONFIG_XFRM_USER is not set | 313 | # CONFIG_XFRM_USER is not set |
285 | # CONFIG_XFRM_SUB_POLICY is not set | 314 | # CONFIG_XFRM_SUB_POLICY is not set |
286 | # CONFIG_XFRM_MIGRATE is not set | 315 | # CONFIG_XFRM_MIGRATE is not set |
316 | # CONFIG_XFRM_STATISTICS is not set | ||
287 | # CONFIG_NET_KEY is not set | 317 | # CONFIG_NET_KEY is not set |
288 | CONFIG_INET=y | 318 | CONFIG_INET=y |
289 | # CONFIG_IP_MULTICAST is not set | 319 | # CONFIG_IP_MULTICAST is not set |
@@ -344,6 +374,7 @@ CONFIG_LLC=m | |||
344 | # | 374 | # |
345 | # CONFIG_NET_PKTGEN is not set | 375 | # CONFIG_NET_PKTGEN is not set |
346 | # CONFIG_HAMRADIO is not set | 376 | # CONFIG_HAMRADIO is not set |
377 | # CONFIG_CAN is not set | ||
347 | # CONFIG_IRDA is not set | 378 | # CONFIG_IRDA is not set |
348 | # CONFIG_BT is not set | 379 | # CONFIG_BT is not set |
349 | # CONFIG_AF_RXRPC is not set | 380 | # CONFIG_AF_RXRPC is not set |
@@ -386,7 +417,7 @@ CONFIG_BLK_DEV=y | |||
386 | CONFIG_BLK_DEV_RAM=y | 417 | CONFIG_BLK_DEV_RAM=y |
387 | CONFIG_BLK_DEV_RAM_COUNT=16 | 418 | CONFIG_BLK_DEV_RAM_COUNT=16 |
388 | CONFIG_BLK_DEV_RAM_SIZE=4096 | 419 | CONFIG_BLK_DEV_RAM_SIZE=4096 |
389 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | 420 | # CONFIG_BLK_DEV_XIP is not set |
390 | # CONFIG_CDROM_PKTCDVD is not set | 421 | # CONFIG_CDROM_PKTCDVD is not set |
391 | # CONFIG_ATA_OVER_ETH is not set | 422 | # CONFIG_ATA_OVER_ETH is not set |
392 | CONFIG_MISC_DEVICES=y | 423 | CONFIG_MISC_DEVICES=y |
@@ -394,6 +425,8 @@ CONFIG_MISC_DEVICES=y | |||
394 | CONFIG_EEPROM_93CX6=y | 425 | CONFIG_EEPROM_93CX6=y |
395 | # CONFIG_SGI_IOC4 is not set | 426 | # CONFIG_SGI_IOC4 is not set |
396 | # CONFIG_TIFM_CORE is not set | 427 | # CONFIG_TIFM_CORE is not set |
428 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
429 | CONFIG_HAVE_IDE=y | ||
397 | # CONFIG_IDE is not set | 430 | # CONFIG_IDE is not set |
398 | 431 | ||
399 | # | 432 | # |
@@ -453,6 +486,7 @@ CONFIG_SCSI_LOWLEVEL=y | |||
453 | # CONFIG_SCSI_IPS is not set | 486 | # CONFIG_SCSI_IPS is not set |
454 | # CONFIG_SCSI_INITIO is not set | 487 | # CONFIG_SCSI_INITIO is not set |
455 | # CONFIG_SCSI_INIA100 is not set | 488 | # CONFIG_SCSI_INIA100 is not set |
489 | # CONFIG_SCSI_MVSAS is not set | ||
456 | # CONFIG_SCSI_STEX is not set | 490 | # CONFIG_SCSI_STEX is not set |
457 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 491 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
458 | # CONFIG_SCSI_IPR is not set | 492 | # CONFIG_SCSI_IPR is not set |
@@ -506,6 +540,7 @@ CONFIG_SATA_SIL=y | |||
506 | # CONFIG_PATA_MPIIX is not set | 540 | # CONFIG_PATA_MPIIX is not set |
507 | # CONFIG_PATA_OLDPIIX is not set | 541 | # CONFIG_PATA_OLDPIIX is not set |
508 | # CONFIG_PATA_NETCELL is not set | 542 | # CONFIG_PATA_NETCELL is not set |
543 | # CONFIG_PATA_NINJA32 is not set | ||
509 | # CONFIG_PATA_NS87410 is not set | 544 | # CONFIG_PATA_NS87410 is not set |
510 | # CONFIG_PATA_NS87415 is not set | 545 | # CONFIG_PATA_NS87415 is not set |
511 | # CONFIG_PATA_OPTI is not set | 546 | # CONFIG_PATA_OPTI is not set |
@@ -538,7 +573,6 @@ CONFIG_NETDEVICES=y | |||
538 | # CONFIG_EQUALIZER is not set | 573 | # CONFIG_EQUALIZER is not set |
539 | # CONFIG_TUN is not set | 574 | # CONFIG_TUN is not set |
540 | # CONFIG_VETH is not set | 575 | # CONFIG_VETH is not set |
541 | # CONFIG_IP1000 is not set | ||
542 | # CONFIG_ARCNET is not set | 576 | # CONFIG_ARCNET is not set |
543 | # CONFIG_PHYLIB is not set | 577 | # CONFIG_PHYLIB is not set |
544 | CONFIG_NET_ETHERNET=y | 578 | CONFIG_NET_ETHERNET=y |
@@ -551,7 +585,6 @@ CONFIG_AX88796_93CX6=y | |||
551 | # CONFIG_CASSINI is not set | 585 | # CONFIG_CASSINI is not set |
552 | # CONFIG_NET_VENDOR_3COM is not set | 586 | # CONFIG_NET_VENDOR_3COM is not set |
553 | # CONFIG_SMC91X is not set | 587 | # CONFIG_SMC91X is not set |
554 | # CONFIG_SMC911X is not set | ||
555 | # CONFIG_NET_TULIP is not set | 588 | # CONFIG_NET_TULIP is not set |
556 | # CONFIG_HP100 is not set | 589 | # CONFIG_HP100 is not set |
557 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | 590 | # CONFIG_IBM_NEW_EMAC_ZMII is not set |
@@ -576,6 +609,7 @@ CONFIG_8139TOO=m | |||
576 | # CONFIG_8139TOO_TUNE_TWISTER is not set | 609 | # CONFIG_8139TOO_TUNE_TWISTER is not set |
577 | CONFIG_8139TOO_8129=y | 610 | CONFIG_8139TOO_8129=y |
578 | # CONFIG_8139_OLD_RX_RESET is not set | 611 | # CONFIG_8139_OLD_RX_RESET is not set |
612 | # CONFIG_R6040 is not set | ||
579 | # CONFIG_SIS900 is not set | 613 | # CONFIG_SIS900 is not set |
580 | # CONFIG_EPIC100 is not set | 614 | # CONFIG_EPIC100 is not set |
581 | # CONFIG_SUNDANCE is not set | 615 | # CONFIG_SUNDANCE is not set |
@@ -591,6 +625,9 @@ CONFIG_E1000=m | |||
591 | # CONFIG_E1000_NAPI is not set | 625 | # CONFIG_E1000_NAPI is not set |
592 | # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set | 626 | # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set |
593 | # CONFIG_E1000E is not set | 627 | # CONFIG_E1000E is not set |
628 | # CONFIG_E1000E_ENABLED is not set | ||
629 | # CONFIG_IP1000 is not set | ||
630 | # CONFIG_IGB is not set | ||
594 | # CONFIG_NS83820 is not set | 631 | # CONFIG_NS83820 is not set |
595 | # CONFIG_HAMACHI is not set | 632 | # CONFIG_HAMACHI is not set |
596 | # CONFIG_YELLOWFIN is not set | 633 | # CONFIG_YELLOWFIN is not set |
@@ -616,6 +653,7 @@ CONFIG_NETDEV_10000=y | |||
616 | # CONFIG_NIU is not set | 653 | # CONFIG_NIU is not set |
617 | # CONFIG_MLX4_CORE is not set | 654 | # CONFIG_MLX4_CORE is not set |
618 | # CONFIG_TEHUTI is not set | 655 | # CONFIG_TEHUTI is not set |
656 | # CONFIG_BNX2X is not set | ||
619 | # CONFIG_TR is not set | 657 | # CONFIG_TR is not set |
620 | 658 | ||
621 | # | 659 | # |
@@ -629,7 +667,6 @@ CONFIG_NETDEV_10000=y | |||
629 | # CONFIG_PPP is not set | 667 | # CONFIG_PPP is not set |
630 | # CONFIG_SLIP is not set | 668 | # CONFIG_SLIP is not set |
631 | # CONFIG_NET_FC is not set | 669 | # CONFIG_NET_FC is not set |
632 | # CONFIG_SHAPER is not set | ||
633 | # CONFIG_NETCONSOLE is not set | 670 | # CONFIG_NETCONSOLE is not set |
634 | # CONFIG_NETPOLL is not set | 671 | # CONFIG_NETPOLL is not set |
635 | # CONFIG_NET_POLL_CONTROLLER is not set | 672 | # CONFIG_NET_POLL_CONTROLLER is not set |
@@ -686,6 +723,7 @@ CONFIG_SERIO_LIBPS2=y | |||
686 | # | 723 | # |
687 | # CONFIG_VT is not set | 724 | # CONFIG_VT is not set |
688 | # CONFIG_SERIAL_NONSTANDARD is not set | 725 | # CONFIG_SERIAL_NONSTANDARD is not set |
726 | # CONFIG_NOZOMI is not set | ||
689 | 727 | ||
690 | # | 728 | # |
691 | # Serial drivers | 729 | # Serial drivers |
@@ -722,6 +760,7 @@ CONFIG_DEVPORT=y | |||
722 | # CONFIG_POWER_SUPPLY is not set | 760 | # CONFIG_POWER_SUPPLY is not set |
723 | CONFIG_HWMON=y | 761 | CONFIG_HWMON=y |
724 | # CONFIG_HWMON_VID is not set | 762 | # CONFIG_HWMON_VID is not set |
763 | # CONFIG_SENSORS_I5K_AMB is not set | ||
725 | # CONFIG_SENSORS_F71805F is not set | 764 | # CONFIG_SENSORS_F71805F is not set |
726 | # CONFIG_SENSORS_F71882FG is not set | 765 | # CONFIG_SENSORS_F71882FG is not set |
727 | # CONFIG_SENSORS_IT87 is not set | 766 | # CONFIG_SENSORS_IT87 is not set |
@@ -736,6 +775,7 @@ CONFIG_HWMON=y | |||
736 | # CONFIG_SENSORS_W83627HF is not set | 775 | # CONFIG_SENSORS_W83627HF is not set |
737 | # CONFIG_SENSORS_W83627EHF is not set | 776 | # CONFIG_SENSORS_W83627EHF is not set |
738 | # CONFIG_HWMON_DEBUG_CHIP is not set | 777 | # CONFIG_HWMON_DEBUG_CHIP is not set |
778 | CONFIG_THERMAL=y | ||
739 | # CONFIG_WATCHDOG is not set | 779 | # CONFIG_WATCHDOG is not set |
740 | 780 | ||
741 | # | 781 | # |
@@ -800,12 +840,9 @@ CONFIG_USB_ARCH_HAS_EHCI=y | |||
800 | # | 840 | # |
801 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 841 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
802 | # | 842 | # |
803 | |||
804 | # | ||
805 | # USB Gadget Support | ||
806 | # | ||
807 | # CONFIG_USB_GADGET is not set | 843 | # CONFIG_USB_GADGET is not set |
808 | # CONFIG_MMC is not set | 844 | # CONFIG_MMC is not set |
845 | # CONFIG_MEMSTICK is not set | ||
809 | # CONFIG_NEW_LEDS is not set | 846 | # CONFIG_NEW_LEDS is not set |
810 | # CONFIG_INFINIBAND is not set | 847 | # CONFIG_INFINIBAND is not set |
811 | CONFIG_RTC_LIB=y | 848 | CONFIG_RTC_LIB=y |
@@ -830,9 +867,10 @@ CONFIG_RTC_INTF_DEV=y | |||
830 | # | 867 | # |
831 | # Platform RTC drivers | 868 | # Platform RTC drivers |
832 | # | 869 | # |
870 | # CONFIG_RTC_DRV_DS1511 is not set | ||
833 | # CONFIG_RTC_DRV_DS1553 is not set | 871 | # CONFIG_RTC_DRV_DS1553 is not set |
834 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
835 | # CONFIG_RTC_DRV_DS1742 is not set | 872 | # CONFIG_RTC_DRV_DS1742 is not set |
873 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
836 | # CONFIG_RTC_DRV_M48T86 is not set | 874 | # CONFIG_RTC_DRV_M48T86 is not set |
837 | # CONFIG_RTC_DRV_M48T59 is not set | 875 | # CONFIG_RTC_DRV_M48T59 is not set |
838 | # CONFIG_RTC_DRV_V3020 is not set | 876 | # CONFIG_RTC_DRV_V3020 is not set |
@@ -867,12 +905,10 @@ CONFIG_FS_POSIX_ACL=y | |||
867 | # CONFIG_XFS_FS is not set | 905 | # CONFIG_XFS_FS is not set |
868 | # CONFIG_GFS2_FS is not set | 906 | # CONFIG_GFS2_FS is not set |
869 | # CONFIG_OCFS2_FS is not set | 907 | # CONFIG_OCFS2_FS is not set |
870 | CONFIG_MINIX_FS=y | 908 | CONFIG_DNOTIFY=y |
871 | # CONFIG_ROMFS_FS is not set | ||
872 | CONFIG_INOTIFY=y | 909 | CONFIG_INOTIFY=y |
873 | CONFIG_INOTIFY_USER=y | 910 | CONFIG_INOTIFY_USER=y |
874 | # CONFIG_QUOTA is not set | 911 | # CONFIG_QUOTA is not set |
875 | CONFIG_DNOTIFY=y | ||
876 | # CONFIG_AUTOFS_FS is not set | 912 | # CONFIG_AUTOFS_FS is not set |
877 | # CONFIG_AUTOFS4_FS is not set | 913 | # CONFIG_AUTOFS4_FS is not set |
878 | CONFIG_FUSE_FS=m | 914 | CONFIG_FUSE_FS=m |
@@ -920,8 +956,10 @@ CONFIG_CONFIGFS_FS=m | |||
920 | # CONFIG_EFS_FS is not set | 956 | # CONFIG_EFS_FS is not set |
921 | # CONFIG_CRAMFS is not set | 957 | # CONFIG_CRAMFS is not set |
922 | # CONFIG_VXFS_FS is not set | 958 | # CONFIG_VXFS_FS is not set |
959 | CONFIG_MINIX_FS=y | ||
923 | # CONFIG_HPFS_FS is not set | 960 | # CONFIG_HPFS_FS is not set |
924 | # CONFIG_QNX4FS_FS is not set | 961 | # CONFIG_QNX4FS_FS is not set |
962 | # CONFIG_ROMFS_FS is not set | ||
925 | # CONFIG_SYSV_FS is not set | 963 | # CONFIG_SYSV_FS is not set |
926 | # CONFIG_UFS_FS is not set | 964 | # CONFIG_UFS_FS is not set |
927 | CONFIG_NETWORK_FILESYSTEMS=y | 965 | CONFIG_NETWORK_FILESYSTEMS=y |
@@ -997,10 +1035,6 @@ CONFIG_NLS_ISO8859_1=y | |||
997 | # CONFIG_NLS_KOI8_U is not set | 1035 | # CONFIG_NLS_KOI8_U is not set |
998 | # CONFIG_NLS_UTF8 is not set | 1036 | # CONFIG_NLS_UTF8 is not set |
999 | # CONFIG_DLM is not set | 1037 | # CONFIG_DLM is not set |
1000 | CONFIG_INSTRUMENTATION=y | ||
1001 | CONFIG_PROFILING=y | ||
1002 | CONFIG_OPROFILE=m | ||
1003 | # CONFIG_MARKERS is not set | ||
1004 | 1038 | ||
1005 | # | 1039 | # |
1006 | # Kernel hacking | 1040 | # Kernel hacking |
@@ -1035,9 +1069,9 @@ CONFIG_DEBUG_INFO=y | |||
1035 | # CONFIG_DEBUG_LIST is not set | 1069 | # CONFIG_DEBUG_LIST is not set |
1036 | # CONFIG_DEBUG_SG is not set | 1070 | # CONFIG_DEBUG_SG is not set |
1037 | # CONFIG_FRAME_POINTER is not set | 1071 | # CONFIG_FRAME_POINTER is not set |
1038 | CONFIG_FORCED_INLINING=y | ||
1039 | # CONFIG_BOOT_PRINTK_DELAY is not set | 1072 | # CONFIG_BOOT_PRINTK_DELAY is not set |
1040 | # CONFIG_RCU_TORTURE_TEST is not set | 1073 | # CONFIG_RCU_TORTURE_TEST is not set |
1074 | # CONFIG_BACKTRACE_SELF_TEST is not set | ||
1041 | # CONFIG_FAULT_INJECTION is not set | 1075 | # CONFIG_FAULT_INJECTION is not set |
1042 | # CONFIG_SAMPLES is not set | 1076 | # CONFIG_SAMPLES is not set |
1043 | CONFIG_SH_STANDARD_BIOS=y | 1077 | CONFIG_SH_STANDARD_BIOS=y |
@@ -1059,6 +1093,7 @@ CONFIG_DEBUG_STACKOVERFLOW=y | |||
1059 | CONFIG_CRYPTO=y | 1093 | CONFIG_CRYPTO=y |
1060 | CONFIG_CRYPTO_ALGAPI=y | 1094 | CONFIG_CRYPTO_ALGAPI=y |
1061 | CONFIG_CRYPTO_BLKCIPHER=y | 1095 | CONFIG_CRYPTO_BLKCIPHER=y |
1096 | # CONFIG_CRYPTO_SEQIV is not set | ||
1062 | CONFIG_CRYPTO_HASH=y | 1097 | CONFIG_CRYPTO_HASH=y |
1063 | CONFIG_CRYPTO_MANAGER=y | 1098 | CONFIG_CRYPTO_MANAGER=y |
1064 | CONFIG_CRYPTO_HMAC=y | 1099 | CONFIG_CRYPTO_HMAC=y |
@@ -1077,6 +1112,9 @@ CONFIG_CRYPTO_CBC=y | |||
1077 | CONFIG_CRYPTO_PCBC=m | 1112 | CONFIG_CRYPTO_PCBC=m |
1078 | # CONFIG_CRYPTO_LRW is not set | 1113 | # CONFIG_CRYPTO_LRW is not set |
1079 | # CONFIG_CRYPTO_XTS is not set | 1114 | # CONFIG_CRYPTO_XTS is not set |
1115 | # CONFIG_CRYPTO_CTR is not set | ||
1116 | # CONFIG_CRYPTO_GCM is not set | ||
1117 | # CONFIG_CRYPTO_CCM is not set | ||
1080 | # CONFIG_CRYPTO_CRYPTD is not set | 1118 | # CONFIG_CRYPTO_CRYPTD is not set |
1081 | CONFIG_CRYPTO_DES=y | 1119 | CONFIG_CRYPTO_DES=y |
1082 | # CONFIG_CRYPTO_FCRYPT is not set | 1120 | # CONFIG_CRYPTO_FCRYPT is not set |
@@ -1091,13 +1129,16 @@ CONFIG_CRYPTO_DES=y | |||
1091 | # CONFIG_CRYPTO_KHAZAD is not set | 1129 | # CONFIG_CRYPTO_KHAZAD is not set |
1092 | # CONFIG_CRYPTO_ANUBIS is not set | 1130 | # CONFIG_CRYPTO_ANUBIS is not set |
1093 | # CONFIG_CRYPTO_SEED is not set | 1131 | # CONFIG_CRYPTO_SEED is not set |
1132 | # CONFIG_CRYPTO_SALSA20 is not set | ||
1094 | # CONFIG_CRYPTO_DEFLATE is not set | 1133 | # CONFIG_CRYPTO_DEFLATE is not set |
1095 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 1134 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
1096 | # CONFIG_CRYPTO_CRC32C is not set | 1135 | # CONFIG_CRYPTO_CRC32C is not set |
1097 | # CONFIG_CRYPTO_CAMELLIA is not set | 1136 | # CONFIG_CRYPTO_CAMELLIA is not set |
1098 | # CONFIG_CRYPTO_TEST is not set | 1137 | # CONFIG_CRYPTO_TEST is not set |
1099 | # CONFIG_CRYPTO_AUTHENC is not set | 1138 | # CONFIG_CRYPTO_AUTHENC is not set |
1139 | # CONFIG_CRYPTO_LZO is not set | ||
1100 | CONFIG_CRYPTO_HW=y | 1140 | CONFIG_CRYPTO_HW=y |
1141 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | ||
1101 | 1142 | ||
1102 | # | 1143 | # |
1103 | # Library routines | 1144 | # Library routines |
diff --git a/arch/sh/configs/se7780_defconfig b/arch/sh/configs/se7780_defconfig index f68743dc3931..30f5ee40c312 100644 --- a/arch/sh/configs/se7780_defconfig +++ b/arch/sh/configs/se7780_defconfig | |||
@@ -1,9 +1,10 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.21-rc3 | 3 | # Linux kernel version: 2.6.25-rc3 |
4 | # Thu Mar 15 14:06:20 2007 | 4 | # Thu Feb 28 10:18:04 2008 |
5 | # | 5 | # |
6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
7 | CONFIG_SUPERH32=y | ||
7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
8 | CONFIG_GENERIC_BUG=y | 9 | CONFIG_GENERIC_BUG=y |
9 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 10 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
@@ -11,38 +12,44 @@ CONFIG_GENERIC_HWEIGHT=y | |||
11 | CONFIG_GENERIC_HARDIRQS=y | 12 | CONFIG_GENERIC_HARDIRQS=y |
12 | CONFIG_GENERIC_IRQ_PROBE=y | 13 | CONFIG_GENERIC_IRQ_PROBE=y |
13 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 14 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
14 | # CONFIG_GENERIC_TIME is not set | 15 | CONFIG_GENERIC_TIME=y |
16 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
17 | CONFIG_SYS_SUPPORTS_PCI=y | ||
15 | CONFIG_STACKTRACE_SUPPORT=y | 18 | CONFIG_STACKTRACE_SUPPORT=y |
16 | CONFIG_LOCKDEP_SUPPORT=y | 19 | CONFIG_LOCKDEP_SUPPORT=y |
17 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | 20 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set |
18 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 21 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
22 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | ||
23 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
19 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 24 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
20 | 25 | ||
21 | # | 26 | # |
22 | # Code maturity level options | 27 | # General setup |
23 | # | 28 | # |
24 | # CONFIG_EXPERIMENTAL is not set | 29 | # CONFIG_EXPERIMENTAL is not set |
25 | CONFIG_BROKEN_ON_SMP=y | 30 | CONFIG_BROKEN_ON_SMP=y |
26 | CONFIG_INIT_ENV_ARG_LIMIT=32 | 31 | CONFIG_INIT_ENV_ARG_LIMIT=32 |
27 | |||
28 | # | ||
29 | # General setup | ||
30 | # | ||
31 | CONFIG_LOCALVERSION="" | 32 | CONFIG_LOCALVERSION="" |
32 | CONFIG_LOCALVERSION_AUTO=y | 33 | CONFIG_LOCALVERSION_AUTO=y |
33 | # CONFIG_SWAP is not set | 34 | # CONFIG_SWAP is not set |
34 | CONFIG_SYSVIPC=y | 35 | CONFIG_SYSVIPC=y |
35 | # CONFIG_IPC_NS is not set | ||
36 | CONFIG_SYSVIPC_SYSCTL=y | 36 | CONFIG_SYSVIPC_SYSCTL=y |
37 | # CONFIG_BSD_PROCESS_ACCT is not set | 37 | # CONFIG_BSD_PROCESS_ACCT is not set |
38 | # CONFIG_TASKSTATS is not set | 38 | # CONFIG_TASKSTATS is not set |
39 | # CONFIG_UTS_NS is not set | ||
40 | # CONFIG_AUDIT is not set | 39 | # CONFIG_AUDIT is not set |
41 | CONFIG_IKCONFIG=y | 40 | CONFIG_IKCONFIG=y |
42 | CONFIG_IKCONFIG_PROC=y | 41 | CONFIG_IKCONFIG_PROC=y |
42 | CONFIG_LOG_BUF_SHIFT=14 | ||
43 | # CONFIG_CGROUPS is not set | ||
44 | CONFIG_GROUP_SCHED=y | ||
45 | CONFIG_FAIR_GROUP_SCHED=y | ||
46 | CONFIG_USER_SCHED=y | ||
47 | # CONFIG_CGROUP_SCHED is not set | ||
43 | CONFIG_SYSFS_DEPRECATED=y | 48 | CONFIG_SYSFS_DEPRECATED=y |
44 | # CONFIG_RELAY is not set | 49 | # CONFIG_RELAY is not set |
50 | # CONFIG_NAMESPACES is not set | ||
45 | # CONFIG_BLK_DEV_INITRD is not set | 51 | # CONFIG_BLK_DEV_INITRD is not set |
52 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
46 | CONFIG_SYSCTL=y | 53 | CONFIG_SYSCTL=y |
47 | CONFIG_EMBEDDED=y | 54 | CONFIG_EMBEDDED=y |
48 | CONFIG_UID16=y | 55 | CONFIG_UID16=y |
@@ -52,31 +59,36 @@ CONFIG_SYSCTL_SYSCALL=y | |||
52 | CONFIG_PRINTK=y | 59 | CONFIG_PRINTK=y |
53 | CONFIG_BUG=y | 60 | CONFIG_BUG=y |
54 | CONFIG_ELF_CORE=y | 61 | CONFIG_ELF_CORE=y |
62 | CONFIG_COMPAT_BRK=y | ||
55 | CONFIG_BASE_FULL=y | 63 | CONFIG_BASE_FULL=y |
56 | CONFIG_FUTEX=y | 64 | CONFIG_FUTEX=y |
65 | CONFIG_ANON_INODES=y | ||
57 | # CONFIG_EPOLL is not set | 66 | # CONFIG_EPOLL is not set |
67 | CONFIG_SIGNALFD=y | ||
68 | CONFIG_TIMERFD=y | ||
69 | CONFIG_EVENTFD=y | ||
58 | CONFIG_SHMEM=y | 70 | CONFIG_SHMEM=y |
59 | CONFIG_SLAB=y | ||
60 | CONFIG_VM_EVENT_COUNTERS=y | 71 | CONFIG_VM_EVENT_COUNTERS=y |
72 | CONFIG_SLAB=y | ||
73 | # CONFIG_SLUB is not set | ||
74 | # CONFIG_SLOB is not set | ||
75 | # CONFIG_PROFILING is not set | ||
76 | # CONFIG_MARKERS is not set | ||
77 | CONFIG_HAVE_OPROFILE=y | ||
78 | # CONFIG_HAVE_KPROBES is not set | ||
79 | CONFIG_PROC_PAGE_MONITOR=y | ||
80 | CONFIG_SLABINFO=y | ||
61 | CONFIG_RT_MUTEXES=y | 81 | CONFIG_RT_MUTEXES=y |
62 | # CONFIG_TINY_SHMEM is not set | 82 | # CONFIG_TINY_SHMEM is not set |
63 | CONFIG_BASE_SMALL=0 | 83 | CONFIG_BASE_SMALL=0 |
64 | # CONFIG_SLOB is not set | ||
65 | |||
66 | # | ||
67 | # Loadable module support | ||
68 | # | ||
69 | CONFIG_MODULES=y | 84 | CONFIG_MODULES=y |
70 | CONFIG_MODULE_UNLOAD=y | 85 | CONFIG_MODULE_UNLOAD=y |
71 | # CONFIG_MODVERSIONS is not set | 86 | # CONFIG_MODVERSIONS is not set |
72 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 87 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
73 | CONFIG_KMOD=y | 88 | CONFIG_KMOD=y |
74 | |||
75 | # | ||
76 | # Block layer | ||
77 | # | ||
78 | CONFIG_BLOCK=y | 89 | CONFIG_BLOCK=y |
79 | # CONFIG_LBD is not set | 90 | # CONFIG_LBD is not set |
91 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
80 | # CONFIG_LSF is not set | 92 | # CONFIG_LSF is not set |
81 | 93 | ||
82 | # | 94 | # |
@@ -91,68 +103,27 @@ CONFIG_DEFAULT_DEADLINE=y | |||
91 | # CONFIG_DEFAULT_CFQ is not set | 103 | # CONFIG_DEFAULT_CFQ is not set |
92 | # CONFIG_DEFAULT_NOOP is not set | 104 | # CONFIG_DEFAULT_NOOP is not set |
93 | CONFIG_DEFAULT_IOSCHED="deadline" | 105 | CONFIG_DEFAULT_IOSCHED="deadline" |
106 | CONFIG_CLASSIC_RCU=y | ||
107 | # CONFIG_PREEMPT_RCU is not set | ||
94 | 108 | ||
95 | # | 109 | # |
96 | # System type | 110 | # System type |
97 | # | 111 | # |
98 | CONFIG_SOLUTION_ENGINE=y | ||
99 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
100 | # CONFIG_SH_7751_SOLUTION_ENGINE is not set | ||
101 | CONFIG_SH_7780_SOLUTION_ENGINE=y | ||
102 | # CONFIG_SH_7300_SOLUTION_ENGINE is not set | ||
103 | # CONFIG_SH_7343_SOLUTION_ENGINE is not set | ||
104 | # CONFIG_SH_73180_SOLUTION_ENGINE is not set | ||
105 | # CONFIG_SH_7751_SYSTEMH is not set | ||
106 | # CONFIG_SH_HP6XX is not set | ||
107 | # CONFIG_SH_SATURN is not set | ||
108 | # CONFIG_SH_DREAMCAST is not set | ||
109 | # CONFIG_SH_MPC1211 is not set | ||
110 | # CONFIG_SH_SH03 is not set | ||
111 | # CONFIG_SH_SECUREEDGE5410 is not set | ||
112 | # CONFIG_SH_HS7751RVOIP is not set | ||
113 | # CONFIG_SH_7710VOIPGW is not set | ||
114 | # CONFIG_SH_RTS7751R2D is not set | ||
115 | # CONFIG_SH_HIGHLANDER is not set | ||
116 | # CONFIG_SH_EDOSK7705 is not set | ||
117 | # CONFIG_SH_SH4202_MICRODEV is not set | ||
118 | # CONFIG_SH_LANDISK is not set | ||
119 | # CONFIG_SH_TITAN is not set | ||
120 | # CONFIG_SH_SHMIN is not set | ||
121 | # CONFIG_SH_7206_SOLUTION_ENGINE is not set | ||
122 | # CONFIG_SH_7619_SOLUTION_ENGINE is not set | ||
123 | # CONFIG_SH_UNKNOWN is not set | ||
124 | |||
125 | # | ||
126 | # Processor selection | ||
127 | # | ||
128 | CONFIG_CPU_SH4=y | 112 | CONFIG_CPU_SH4=y |
129 | CONFIG_CPU_SH4A=y | 113 | CONFIG_CPU_SH4A=y |
130 | |||
131 | # | ||
132 | # SH-2 Processor Support | ||
133 | # | ||
134 | # CONFIG_CPU_SUBTYPE_SH7604 is not set | ||
135 | # CONFIG_CPU_SUBTYPE_SH7619 is not set | 114 | # CONFIG_CPU_SUBTYPE_SH7619 is not set |
136 | 115 | # CONFIG_CPU_SUBTYPE_SH7203 is not set | |
137 | # | ||
138 | # SH-2A Processor Support | ||
139 | # | ||
140 | # CONFIG_CPU_SUBTYPE_SH7206 is not set | 116 | # CONFIG_CPU_SUBTYPE_SH7206 is not set |
141 | 117 | # CONFIG_CPU_SUBTYPE_SH7263 is not set | |
142 | # | ||
143 | # SH-3 Processor Support | ||
144 | # | ||
145 | # CONFIG_CPU_SUBTYPE_SH7300 is not set | ||
146 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | 118 | # CONFIG_CPU_SUBTYPE_SH7705 is not set |
147 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | 119 | # CONFIG_CPU_SUBTYPE_SH7706 is not set |
148 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | 120 | # CONFIG_CPU_SUBTYPE_SH7707 is not set |
149 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | 121 | # CONFIG_CPU_SUBTYPE_SH7708 is not set |
150 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | 122 | # CONFIG_CPU_SUBTYPE_SH7709 is not set |
151 | # CONFIG_CPU_SUBTYPE_SH7710 is not set | 123 | # CONFIG_CPU_SUBTYPE_SH7710 is not set |
152 | 124 | # CONFIG_CPU_SUBTYPE_SH7712 is not set | |
153 | # | 125 | # CONFIG_CPU_SUBTYPE_SH7720 is not set |
154 | # SH-4 Processor Support | 126 | # CONFIG_CPU_SUBTYPE_SH7721 is not set |
155 | # | ||
156 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | 127 | # CONFIG_CPU_SUBTYPE_SH7750 is not set |
157 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | 128 | # CONFIG_CPU_SUBTYPE_SH7091 is not set |
158 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | 129 | # CONFIG_CPU_SUBTYPE_SH7750R is not set |
@@ -161,52 +132,58 @@ CONFIG_CPU_SH4A=y | |||
161 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | 132 | # CONFIG_CPU_SUBTYPE_SH7751R is not set |
162 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | 133 | # CONFIG_CPU_SUBTYPE_SH7760 is not set |
163 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | 134 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set |
164 | 135 | # CONFIG_CPU_SUBTYPE_SH7763 is not set | |
165 | # | ||
166 | # ST40 Processor Support | ||
167 | # | ||
168 | # CONFIG_CPU_SUBTYPE_ST40STB1 is not set | ||
169 | # CONFIG_CPU_SUBTYPE_ST40GX1 is not set | ||
170 | |||
171 | # | ||
172 | # SH-4A Processor Support | ||
173 | # | ||
174 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | 136 | # CONFIG_CPU_SUBTYPE_SH7770 is not set |
175 | CONFIG_CPU_SUBTYPE_SH7780=y | 137 | CONFIG_CPU_SUBTYPE_SH7780=y |
176 | # CONFIG_CPU_SUBTYPE_SH7785 is not set | 138 | # CONFIG_CPU_SUBTYPE_SH7785 is not set |
177 | 139 | # CONFIG_CPU_SUBTYPE_SHX3 is not set | |
178 | # | ||
179 | # SH4AL-DSP Processor Support | ||
180 | # | ||
181 | # CONFIG_CPU_SUBTYPE_SH73180 is not set | ||
182 | # CONFIG_CPU_SUBTYPE_SH7343 is not set | 140 | # CONFIG_CPU_SUBTYPE_SH7343 is not set |
183 | # CONFIG_CPU_SUBTYPE_SH7722 is not set | 141 | # CONFIG_CPU_SUBTYPE_SH7722 is not set |
142 | # CONFIG_CPU_SUBTYPE_SH7366 is not set | ||
143 | # CONFIG_CPU_SUBTYPE_SH5_101 is not set | ||
144 | # CONFIG_CPU_SUBTYPE_SH5_103 is not set | ||
184 | 145 | ||
185 | # | 146 | # |
186 | # Memory management options | 147 | # Memory management options |
187 | # | 148 | # |
149 | CONFIG_QUICKLIST=y | ||
188 | CONFIG_MMU=y | 150 | CONFIG_MMU=y |
189 | CONFIG_PAGE_OFFSET=0x80000000 | 151 | CONFIG_PAGE_OFFSET=0x80000000 |
190 | CONFIG_MEMORY_START=0x08000000 | 152 | CONFIG_MEMORY_START=0x08000000 |
191 | CONFIG_MEMORY_SIZE=0x08000000 | 153 | CONFIG_MEMORY_SIZE=0x08000000 |
192 | CONFIG_32BIT=y | 154 | CONFIG_29BIT=y |
155 | # CONFIG_PMB is not set | ||
193 | CONFIG_VSYSCALL=y | 156 | CONFIG_VSYSCALL=y |
157 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
158 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
159 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | ||
160 | CONFIG_MAX_ACTIVE_REGIONS=1 | ||
161 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
162 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
163 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
194 | CONFIG_PAGE_SIZE_4KB=y | 164 | CONFIG_PAGE_SIZE_4KB=y |
195 | # CONFIG_PAGE_SIZE_8KB is not set | 165 | # CONFIG_PAGE_SIZE_8KB is not set |
196 | # CONFIG_PAGE_SIZE_64KB is not set | 166 | # CONFIG_PAGE_SIZE_64KB is not set |
197 | CONFIG_FLATMEM=y | 167 | CONFIG_SELECT_MEMORY_MODEL=y |
198 | CONFIG_FLAT_NODE_MEM_MAP=y | 168 | # CONFIG_FLATMEM_MANUAL is not set |
199 | # CONFIG_SPARSEMEM_STATIC is not set | 169 | # CONFIG_DISCONTIGMEM_MANUAL is not set |
170 | CONFIG_SPARSEMEM_MANUAL=y | ||
171 | CONFIG_SPARSEMEM=y | ||
172 | CONFIG_HAVE_MEMORY_PRESENT=y | ||
173 | CONFIG_SPARSEMEM_STATIC=y | ||
174 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
200 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 175 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
201 | # CONFIG_RESOURCES_64BIT is not set | 176 | # CONFIG_RESOURCES_64BIT is not set |
202 | CONFIG_ZONE_DMA_FLAG=0 | 177 | CONFIG_ZONE_DMA_FLAG=0 |
178 | CONFIG_NR_QUICK=2 | ||
203 | 179 | ||
204 | # | 180 | # |
205 | # Cache configuration | 181 | # Cache configuration |
206 | # | 182 | # |
207 | # CONFIG_SH_DIRECT_MAPPED is not set | 183 | # CONFIG_SH_DIRECT_MAPPED is not set |
208 | # CONFIG_SH_WRITETHROUGH is not set | 184 | CONFIG_CACHE_WRITEBACK=y |
209 | # CONFIG_SH_OCRAM is not set | 185 | # CONFIG_CACHE_WRITETHROUGH is not set |
186 | # CONFIG_CACHE_OFF is not set | ||
210 | 187 | ||
211 | # | 188 | # |
212 | # Processor features | 189 | # Processor features |
@@ -214,20 +191,29 @@ CONFIG_ZONE_DMA_FLAG=0 | |||
214 | CONFIG_CPU_LITTLE_ENDIAN=y | 191 | CONFIG_CPU_LITTLE_ENDIAN=y |
215 | # CONFIG_CPU_BIG_ENDIAN is not set | 192 | # CONFIG_CPU_BIG_ENDIAN is not set |
216 | CONFIG_SH_FPU=y | 193 | CONFIG_SH_FPU=y |
217 | # CONFIG_SH_DSP is not set | ||
218 | # CONFIG_SH_STORE_QUEUES is not set | 194 | # CONFIG_SH_STORE_QUEUES is not set |
219 | CONFIG_CPU_HAS_INTEVT=y | 195 | CONFIG_CPU_HAS_INTEVT=y |
220 | CONFIG_CPU_HAS_INTC2_IRQ=y | ||
221 | CONFIG_CPU_HAS_INTC_IRQ=y | ||
222 | CONFIG_CPU_HAS_SR_RB=y | 196 | CONFIG_CPU_HAS_SR_RB=y |
197 | CONFIG_CPU_HAS_FPU=y | ||
198 | |||
199 | # | ||
200 | # Board support | ||
201 | # | ||
202 | CONFIG_SOLUTION_ENGINE=y | ||
203 | CONFIG_SH_7780_SOLUTION_ENGINE=y | ||
204 | # CONFIG_SH_SDK7780 is not set | ||
205 | # CONFIG_SH_HIGHLANDER is not set | ||
223 | 206 | ||
224 | # | 207 | # |
225 | # Timer and clock configuration | 208 | # Timer and clock configuration |
226 | # | 209 | # |
227 | CONFIG_SH_TMU=y | 210 | CONFIG_SH_TMU=y |
228 | CONFIG_SH_TIMER_IRQ=28 | 211 | CONFIG_SH_TIMER_IRQ=28 |
229 | # CONFIG_NO_IDLE_HZ is not set | ||
230 | CONFIG_SH_PCLK_FREQ=33333333 | 212 | CONFIG_SH_PCLK_FREQ=33333333 |
213 | # CONFIG_TICK_ONESHOT is not set | ||
214 | # CONFIG_NO_HZ is not set | ||
215 | # CONFIG_HIGH_RES_TIMERS is not set | ||
216 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
231 | 217 | ||
232 | # | 218 | # |
233 | # CPU Frequency scaling | 219 | # CPU Frequency scaling |
@@ -242,7 +228,6 @@ CONFIG_SH_PCLK_FREQ=33333333 | |||
242 | # | 228 | # |
243 | # Companion Chips | 229 | # Companion Chips |
244 | # | 230 | # |
245 | # CONFIG_HD6446X_SERIES is not set | ||
246 | 231 | ||
247 | # | 232 | # |
248 | # Additional SuperH Device Drivers | 233 | # Additional SuperH Device Drivers |
@@ -258,40 +243,36 @@ CONFIG_HZ_250=y | |||
258 | # CONFIG_HZ_300 is not set | 243 | # CONFIG_HZ_300 is not set |
259 | # CONFIG_HZ_1000 is not set | 244 | # CONFIG_HZ_1000 is not set |
260 | CONFIG_HZ=250 | 245 | CONFIG_HZ=250 |
261 | # CONFIG_SMP is not set | 246 | # CONFIG_SCHED_HRTICK is not set |
262 | CONFIG_PREEMPT_NONE=y | 247 | CONFIG_PREEMPT_NONE=y |
263 | # CONFIG_PREEMPT_VOLUNTARY is not set | 248 | # CONFIG_PREEMPT_VOLUNTARY is not set |
264 | # CONFIG_PREEMPT is not set | 249 | # CONFIG_PREEMPT is not set |
250 | CONFIG_RCU_TRACE=y | ||
251 | CONFIG_GUSA=y | ||
265 | 252 | ||
266 | # | 253 | # |
267 | # Boot options | 254 | # Boot options |
268 | # | 255 | # |
269 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | 256 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 |
270 | CONFIG_BOOT_LINK_OFFSET=0x00810000 | 257 | CONFIG_BOOT_LINK_OFFSET=0x00810000 |
271 | # CONFIG_UBC_WAKEUP is not set | 258 | CONFIG_CMDLINE_BOOL=y |
272 | # CONFIG_CMDLINE_BOOL is not set | 259 | CONFIG_CMDLINE="console=ttySC0.115200 root=/dev/sda1" |
273 | 260 | ||
274 | # | 261 | # |
275 | # Bus options | 262 | # Bus options |
276 | # | 263 | # |
264 | # CONFIG_CF_ENABLER is not set | ||
277 | CONFIG_PCI=y | 265 | CONFIG_PCI=y |
278 | CONFIG_SH_PCIDMA_NONCOHERENT=y | 266 | CONFIG_SH_PCIDMA_NONCOHERENT=y |
279 | CONFIG_PCI_AUTO=y | 267 | CONFIG_PCI_AUTO=y |
280 | CONFIG_PCI_AUTO_UPDATE_RESOURCES=y | 268 | CONFIG_PCI_AUTO_UPDATE_RESOURCES=y |
281 | 269 | # CONFIG_ARCH_SUPPORTS_MSI is not set | |
282 | # | 270 | CONFIG_PCI_LEGACY=y |
283 | # PCCARD (PCMCIA/CardBus) support | ||
284 | # | ||
285 | |||
286 | # | ||
287 | # PCI Hotplug Support | ||
288 | # | ||
289 | 271 | ||
290 | # | 272 | # |
291 | # Executable file formats | 273 | # Executable file formats |
292 | # | 274 | # |
293 | CONFIG_BINFMT_ELF=y | 275 | CONFIG_BINFMT_ELF=y |
294 | # CONFIG_BINFMT_FLAT is not set | ||
295 | # CONFIG_BINFMT_MISC is not set | 276 | # CONFIG_BINFMT_MISC is not set |
296 | 277 | ||
297 | # | 278 | # |
@@ -302,7 +283,6 @@ CONFIG_NET=y | |||
302 | # | 283 | # |
303 | # Networking options | 284 | # Networking options |
304 | # | 285 | # |
305 | # CONFIG_NETDEBUG is not set | ||
306 | CONFIG_PACKET=y | 286 | CONFIG_PACKET=y |
307 | # CONFIG_PACKET_MMAP is not set | 287 | # CONFIG_PACKET_MMAP is not set |
308 | CONFIG_UNIX=y | 288 | CONFIG_UNIX=y |
@@ -329,6 +309,7 @@ CONFIG_IP_PNP=y | |||
329 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | 309 | CONFIG_INET_XFRM_MODE_TRANSPORT=y |
330 | CONFIG_INET_XFRM_MODE_TUNNEL=y | 310 | CONFIG_INET_XFRM_MODE_TUNNEL=y |
331 | CONFIG_INET_XFRM_MODE_BEET=y | 311 | CONFIG_INET_XFRM_MODE_BEET=y |
312 | # CONFIG_INET_LRO is not set | ||
332 | CONFIG_INET_DIAG=y | 313 | CONFIG_INET_DIAG=y |
333 | CONFIG_INET_TCP_DIAG=y | 314 | CONFIG_INET_TCP_DIAG=y |
334 | # CONFIG_TCP_CONG_ADVANCED is not set | 315 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -349,16 +330,13 @@ CONFIG_IPV6=y | |||
349 | # CONFIG_IPV6_TUNNEL is not set | 330 | # CONFIG_IPV6_TUNNEL is not set |
350 | # CONFIG_NETWORK_SECMARK is not set | 331 | # CONFIG_NETWORK_SECMARK is not set |
351 | # CONFIG_NETFILTER is not set | 332 | # CONFIG_NETFILTER is not set |
333 | # CONFIG_ATM is not set | ||
352 | # CONFIG_BRIDGE is not set | 334 | # CONFIG_BRIDGE is not set |
353 | # CONFIG_VLAN_8021Q is not set | 335 | # CONFIG_VLAN_8021Q is not set |
354 | # CONFIG_DECNET is not set | 336 | # CONFIG_DECNET is not set |
355 | # CONFIG_LLC2 is not set | 337 | # CONFIG_LLC2 is not set |
356 | # CONFIG_IPX is not set | 338 | # CONFIG_IPX is not set |
357 | # CONFIG_ATALK is not set | 339 | # CONFIG_ATALK is not set |
358 | |||
359 | # | ||
360 | # QoS and/or fair queueing | ||
361 | # | ||
362 | # CONFIG_NET_SCHED is not set | 340 | # CONFIG_NET_SCHED is not set |
363 | 341 | ||
364 | # | 342 | # |
@@ -366,9 +344,18 @@ CONFIG_IPV6=y | |||
366 | # | 344 | # |
367 | # CONFIG_NET_PKTGEN is not set | 345 | # CONFIG_NET_PKTGEN is not set |
368 | # CONFIG_HAMRADIO is not set | 346 | # CONFIG_HAMRADIO is not set |
347 | # CONFIG_CAN is not set | ||
369 | # CONFIG_IRDA is not set | 348 | # CONFIG_IRDA is not set |
370 | # CONFIG_BT is not set | 349 | # CONFIG_BT is not set |
350 | |||
351 | # | ||
352 | # Wireless | ||
353 | # | ||
354 | # CONFIG_CFG80211 is not set | ||
355 | # CONFIG_WIRELESS_EXT is not set | ||
356 | # CONFIG_MAC80211 is not set | ||
371 | # CONFIG_IEEE80211 is not set | 357 | # CONFIG_IEEE80211 is not set |
358 | # CONFIG_RFKILL is not set | ||
372 | 359 | ||
373 | # | 360 | # |
374 | # Device Drivers | 361 | # Device Drivers |
@@ -380,15 +367,7 @@ CONFIG_IPV6=y | |||
380 | CONFIG_STANDALONE=y | 367 | CONFIG_STANDALONE=y |
381 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | 368 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set |
382 | # CONFIG_SYS_HYPERVISOR is not set | 369 | # CONFIG_SYS_HYPERVISOR is not set |
383 | |||
384 | # | ||
385 | # Connector - unified userspace <-> kernelspace linker | ||
386 | # | ||
387 | # CONFIG_CONNECTOR is not set | 370 | # CONFIG_CONNECTOR is not set |
388 | |||
389 | # | ||
390 | # Memory Technology Devices (MTD) | ||
391 | # | ||
392 | CONFIG_MTD=y | 371 | CONFIG_MTD=y |
393 | # CONFIG_MTD_DEBUG is not set | 372 | # CONFIG_MTD_DEBUG is not set |
394 | # CONFIG_MTD_CONCAT is not set | 373 | # CONFIG_MTD_CONCAT is not set |
@@ -407,6 +386,7 @@ CONFIG_MTD_BLOCK=y | |||
407 | # CONFIG_INFTL is not set | 386 | # CONFIG_INFTL is not set |
408 | # CONFIG_RFD_FTL is not set | 387 | # CONFIG_RFD_FTL is not set |
409 | # CONFIG_SSFDC is not set | 388 | # CONFIG_SSFDC is not set |
389 | # CONFIG_MTD_OOPS is not set | ||
410 | 390 | ||
411 | # | 391 | # |
412 | # RAM/ROM/Flash chip drivers | 392 | # RAM/ROM/Flash chip drivers |
@@ -437,13 +417,13 @@ CONFIG_MTD_CFI_UTIL=y | |||
437 | # CONFIG_MTD_RAM is not set | 417 | # CONFIG_MTD_RAM is not set |
438 | CONFIG_MTD_ROM=y | 418 | CONFIG_MTD_ROM=y |
439 | # CONFIG_MTD_ABSENT is not set | 419 | # CONFIG_MTD_ABSENT is not set |
440 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
441 | 420 | ||
442 | # | 421 | # |
443 | # Mapping drivers for chip access | 422 | # Mapping drivers for chip access |
444 | # | 423 | # |
445 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | 424 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set |
446 | # CONFIG_MTD_PHYSMAP is not set | 425 | # CONFIG_MTD_PHYSMAP is not set |
426 | # CONFIG_MTD_INTEL_VR_NOR is not set | ||
447 | # CONFIG_MTD_PLATRAM is not set | 427 | # CONFIG_MTD_PLATRAM is not set |
448 | 428 | ||
449 | # | 429 | # |
@@ -461,31 +441,15 @@ CONFIG_MTD_ROM=y | |||
461 | # CONFIG_MTD_DOC2000 is not set | 441 | # CONFIG_MTD_DOC2000 is not set |
462 | # CONFIG_MTD_DOC2001 is not set | 442 | # CONFIG_MTD_DOC2001 is not set |
463 | # CONFIG_MTD_DOC2001PLUS is not set | 443 | # CONFIG_MTD_DOC2001PLUS is not set |
464 | |||
465 | # | ||
466 | # NAND Flash Device Drivers | ||
467 | # | ||
468 | # CONFIG_MTD_NAND is not set | 444 | # CONFIG_MTD_NAND is not set |
469 | |||
470 | # | ||
471 | # OneNAND Flash Device Drivers | ||
472 | # | ||
473 | # CONFIG_MTD_ONENAND is not set | 445 | # CONFIG_MTD_ONENAND is not set |
474 | 446 | ||
475 | # | 447 | # |
476 | # Parallel port support | 448 | # UBI - Unsorted block images |
477 | # | 449 | # |
450 | # CONFIG_MTD_UBI is not set | ||
478 | # CONFIG_PARPORT is not set | 451 | # CONFIG_PARPORT is not set |
479 | 452 | CONFIG_BLK_DEV=y | |
480 | # | ||
481 | # Plug and Play support | ||
482 | # | ||
483 | # CONFIG_PNPACPI is not set | ||
484 | |||
485 | # | ||
486 | # Block devices | ||
487 | # | ||
488 | # CONFIG_BLK_CPQ_DA is not set | ||
489 | # CONFIG_BLK_CPQ_CISS_DA is not set | 453 | # CONFIG_BLK_CPQ_CISS_DA is not set |
490 | # CONFIG_BLK_DEV_DAC960 is not set | 454 | # CONFIG_BLK_DEV_DAC960 is not set |
491 | # CONFIG_BLK_DEV_COW_COMMON is not set | 455 | # CONFIG_BLK_DEV_COW_COMMON is not set |
@@ -497,15 +461,12 @@ CONFIG_BLK_DEV_LOOP=y | |||
497 | # CONFIG_BLK_DEV_RAM is not set | 461 | # CONFIG_BLK_DEV_RAM is not set |
498 | # CONFIG_CDROM_PKTCDVD is not set | 462 | # CONFIG_CDROM_PKTCDVD is not set |
499 | # CONFIG_ATA_OVER_ETH is not set | 463 | # CONFIG_ATA_OVER_ETH is not set |
500 | 464 | CONFIG_MISC_DEVICES=y | |
501 | # | 465 | # CONFIG_PHANTOM is not set |
502 | # Misc devices | 466 | # CONFIG_EEPROM_93CX6 is not set |
503 | # | ||
504 | # CONFIG_SGI_IOC4 is not set | 467 | # CONFIG_SGI_IOC4 is not set |
505 | 468 | # CONFIG_ENCLOSURE_SERVICES is not set | |
506 | # | 469 | CONFIG_HAVE_IDE=y |
507 | # ATA/ATAPI/MFM/RLL support | ||
508 | # | ||
509 | # CONFIG_IDE is not set | 470 | # CONFIG_IDE is not set |
510 | 471 | ||
511 | # | 472 | # |
@@ -513,6 +474,7 @@ CONFIG_BLK_DEV_LOOP=y | |||
513 | # | 474 | # |
514 | # CONFIG_RAID_ATTRS is not set | 475 | # CONFIG_RAID_ATTRS is not set |
515 | CONFIG_SCSI=y | 476 | CONFIG_SCSI=y |
477 | CONFIG_SCSI_DMA=y | ||
516 | # CONFIG_SCSI_NETLINK is not set | 478 | # CONFIG_SCSI_NETLINK is not set |
517 | CONFIG_SCSI_PROC_FS=y | 479 | CONFIG_SCSI_PROC_FS=y |
518 | 480 | ||
@@ -533,6 +495,7 @@ CONFIG_CHR_DEV_SG=y | |||
533 | # CONFIG_SCSI_CONSTANTS is not set | 495 | # CONFIG_SCSI_CONSTANTS is not set |
534 | # CONFIG_SCSI_LOGGING is not set | 496 | # CONFIG_SCSI_LOGGING is not set |
535 | # CONFIG_SCSI_SCAN_ASYNC is not set | 497 | # CONFIG_SCSI_SCAN_ASYNC is not set |
498 | CONFIG_SCSI_WAIT_SCAN=m | ||
536 | 499 | ||
537 | # | 500 | # |
538 | # SCSI Transports | 501 | # SCSI Transports |
@@ -540,12 +503,9 @@ CONFIG_CHR_DEV_SG=y | |||
540 | # CONFIG_SCSI_SPI_ATTRS is not set | 503 | # CONFIG_SCSI_SPI_ATTRS is not set |
541 | # CONFIG_SCSI_FC_ATTRS is not set | 504 | # CONFIG_SCSI_FC_ATTRS is not set |
542 | # CONFIG_SCSI_ISCSI_ATTRS is not set | 505 | # CONFIG_SCSI_ISCSI_ATTRS is not set |
543 | # CONFIG_SCSI_SAS_ATTRS is not set | ||
544 | # CONFIG_SCSI_SAS_LIBSAS is not set | 506 | # CONFIG_SCSI_SAS_LIBSAS is not set |
545 | 507 | # CONFIG_SCSI_SRP_ATTRS is not set | |
546 | # | 508 | CONFIG_SCSI_LOWLEVEL=y |
547 | # SCSI low-level drivers | ||
548 | # | ||
549 | # CONFIG_ISCSI_TCP is not set | 509 | # CONFIG_ISCSI_TCP is not set |
550 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | 510 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set |
551 | # CONFIG_SCSI_3W_9XXX is not set | 511 | # CONFIG_SCSI_3W_9XXX is not set |
@@ -555,7 +515,6 @@ CONFIG_CHR_DEV_SG=y | |||
555 | # CONFIG_SCSI_AIC7XXX_OLD is not set | 515 | # CONFIG_SCSI_AIC7XXX_OLD is not set |
556 | # CONFIG_SCSI_AIC79XX is not set | 516 | # CONFIG_SCSI_AIC79XX is not set |
557 | # CONFIG_SCSI_AIC94XX is not set | 517 | # CONFIG_SCSI_AIC94XX is not set |
558 | # CONFIG_SCSI_DPT_I2O is not set | ||
559 | # CONFIG_SCSI_ARCMSR is not set | 518 | # CONFIG_SCSI_ARCMSR is not set |
560 | # CONFIG_MEGARAID_NEWGEN is not set | 519 | # CONFIG_MEGARAID_NEWGEN is not set |
561 | # CONFIG_MEGARAID_LEGACY is not set | 520 | # CONFIG_MEGARAID_LEGACY is not set |
@@ -566,6 +525,7 @@ CONFIG_CHR_DEV_SG=y | |||
566 | # CONFIG_SCSI_IPS is not set | 525 | # CONFIG_SCSI_IPS is not set |
567 | # CONFIG_SCSI_INITIO is not set | 526 | # CONFIG_SCSI_INITIO is not set |
568 | # CONFIG_SCSI_INIA100 is not set | 527 | # CONFIG_SCSI_INIA100 is not set |
528 | # CONFIG_SCSI_MVSAS is not set | ||
569 | # CONFIG_SCSI_STEX is not set | 529 | # CONFIG_SCSI_STEX is not set |
570 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 530 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
571 | # CONFIG_SCSI_IPR is not set | 531 | # CONFIG_SCSI_IPR is not set |
@@ -577,10 +537,6 @@ CONFIG_CHR_DEV_SG=y | |||
577 | # CONFIG_SCSI_NSP32 is not set | 537 | # CONFIG_SCSI_NSP32 is not set |
578 | # CONFIG_SCSI_DEBUG is not set | 538 | # CONFIG_SCSI_DEBUG is not set |
579 | # CONFIG_SCSI_SRP is not set | 539 | # CONFIG_SCSI_SRP is not set |
580 | |||
581 | # | ||
582 | # Serial ATA (prod) and Parallel ATA (experimental) drivers | ||
583 | # | ||
584 | CONFIG_ATA=y | 540 | CONFIG_ATA=y |
585 | # CONFIG_ATA_NONSTANDARD is not set | 541 | # CONFIG_ATA_NONSTANDARD is not set |
586 | # CONFIG_SATA_AHCI is not set | 542 | # CONFIG_SATA_AHCI is not set |
@@ -597,62 +553,48 @@ CONFIG_SATA_SIL=y | |||
597 | # CONFIG_SATA_VIA is not set | 553 | # CONFIG_SATA_VIA is not set |
598 | # CONFIG_SATA_VITESSE is not set | 554 | # CONFIG_SATA_VITESSE is not set |
599 | # CONFIG_PATA_AMD is not set | 555 | # CONFIG_PATA_AMD is not set |
556 | # CONFIG_PATA_ARTOP is not set | ||
557 | # CONFIG_PATA_ATIIXP is not set | ||
558 | # CONFIG_PATA_CMD64X is not set | ||
600 | # CONFIG_PATA_CS5520 is not set | 559 | # CONFIG_PATA_CS5520 is not set |
601 | # CONFIG_PATA_EFAR is not set | 560 | # CONFIG_PATA_EFAR is not set |
602 | # CONFIG_ATA_GENERIC is not set | 561 | # CONFIG_ATA_GENERIC is not set |
562 | # CONFIG_PATA_HPT366 is not set | ||
603 | # CONFIG_PATA_HPT3X3 is not set | 563 | # CONFIG_PATA_HPT3X3 is not set |
564 | # CONFIG_PATA_IT821X is not set | ||
604 | # CONFIG_PATA_JMICRON is not set | 565 | # CONFIG_PATA_JMICRON is not set |
605 | # CONFIG_PATA_TRIFLEX is not set | 566 | # CONFIG_PATA_TRIFLEX is not set |
606 | # CONFIG_PATA_MARVELL is not set | 567 | # CONFIG_PATA_MARVELL is not set |
607 | # CONFIG_PATA_MPIIX is not set | 568 | # CONFIG_PATA_MPIIX is not set |
569 | # CONFIG_PATA_OLDPIIX is not set | ||
608 | # CONFIG_PATA_NETCELL is not set | 570 | # CONFIG_PATA_NETCELL is not set |
609 | # CONFIG_PATA_RZ1000 is not set | 571 | # CONFIG_PATA_RZ1000 is not set |
572 | # CONFIG_PATA_SERVERWORKS is not set | ||
610 | # CONFIG_PATA_PDC2027X is not set | 573 | # CONFIG_PATA_PDC2027X is not set |
611 | # CONFIG_PATA_SIL680 is not set | 574 | # CONFIG_PATA_SIL680 is not set |
612 | # CONFIG_PATA_VIA is not set | 575 | # CONFIG_PATA_VIA is not set |
613 | # CONFIG_PATA_WINBOND is not set | 576 | # CONFIG_PATA_WINBOND is not set |
614 | # CONFIG_PATA_PLATFORM is not set | 577 | # CONFIG_PATA_PLATFORM is not set |
615 | |||
616 | # | ||
617 | # Multi-device support (RAID and LVM) | ||
618 | # | ||
619 | # CONFIG_MD is not set | 578 | # CONFIG_MD is not set |
620 | |||
621 | # | ||
622 | # Fusion MPT device support | ||
623 | # | ||
624 | # CONFIG_FUSION is not set | 579 | # CONFIG_FUSION is not set |
625 | # CONFIG_FUSION_SPI is not set | ||
626 | # CONFIG_FUSION_FC is not set | ||
627 | # CONFIG_FUSION_SAS is not set | ||
628 | 580 | ||
629 | # | 581 | # |
630 | # IEEE 1394 (FireWire) support | 582 | # IEEE 1394 (FireWire) support |
631 | # | 583 | # |
632 | # CONFIG_IEEE1394 is not set | ||
633 | 584 | ||
634 | # | 585 | # |
635 | # I2O device support | 586 | # An alternative FireWire stack is available with EXPERIMENTAL=y |
636 | # | 587 | # |
588 | # CONFIG_IEEE1394 is not set | ||
637 | # CONFIG_I2O is not set | 589 | # CONFIG_I2O is not set |
638 | |||
639 | # | ||
640 | # Network device support | ||
641 | # | ||
642 | CONFIG_NETDEVICES=y | 590 | CONFIG_NETDEVICES=y |
591 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
643 | # CONFIG_DUMMY is not set | 592 | # CONFIG_DUMMY is not set |
644 | # CONFIG_BONDING is not set | 593 | # CONFIG_BONDING is not set |
645 | # CONFIG_EQUALIZER is not set | 594 | # CONFIG_EQUALIZER is not set |
646 | # CONFIG_TUN is not set | 595 | # CONFIG_TUN is not set |
647 | 596 | # CONFIG_VETH is not set | |
648 | # | ||
649 | # ARCnet devices | ||
650 | # | ||
651 | # CONFIG_ARCNET is not set | 597 | # CONFIG_ARCNET is not set |
652 | |||
653 | # | ||
654 | # PHY device support | ||
655 | # | ||
656 | CONFIG_PHYLIB=y | 598 | CONFIG_PHYLIB=y |
657 | 599 | ||
658 | # | 600 | # |
@@ -666,85 +608,59 @@ CONFIG_PHYLIB=y | |||
666 | # CONFIG_VITESSE_PHY is not set | 608 | # CONFIG_VITESSE_PHY is not set |
667 | CONFIG_SMSC_PHY=y | 609 | CONFIG_SMSC_PHY=y |
668 | # CONFIG_BROADCOM_PHY is not set | 610 | # CONFIG_BROADCOM_PHY is not set |
611 | # CONFIG_ICPLUS_PHY is not set | ||
612 | # CONFIG_REALTEK_PHY is not set | ||
669 | # CONFIG_FIXED_PHY is not set | 613 | # CONFIG_FIXED_PHY is not set |
670 | 614 | # CONFIG_MDIO_BITBANG is not set | |
671 | # | ||
672 | # Ethernet (10 or 100Mbit) | ||
673 | # | ||
674 | CONFIG_NET_ETHERNET=y | 615 | CONFIG_NET_ETHERNET=y |
675 | CONFIG_MII=y | 616 | CONFIG_MII=y |
617 | # CONFIG_AX88796 is not set | ||
676 | # CONFIG_STNIC is not set | 618 | # CONFIG_STNIC is not set |
677 | # CONFIG_HAPPYMEAL is not set | 619 | # CONFIG_HAPPYMEAL is not set |
678 | # CONFIG_SUNGEM is not set | 620 | # CONFIG_SUNGEM is not set |
679 | # CONFIG_CASSINI is not set | 621 | # CONFIG_CASSINI is not set |
680 | # CONFIG_NET_VENDOR_3COM is not set | 622 | # CONFIG_NET_VENDOR_3COM is not set |
681 | CONFIG_SMC91X=y | 623 | CONFIG_SMC91X=y |
682 | |||
683 | # | ||
684 | # Tulip family network device support | ||
685 | # | ||
686 | # CONFIG_NET_TULIP is not set | 624 | # CONFIG_NET_TULIP is not set |
687 | # CONFIG_HP100 is not set | 625 | # CONFIG_HP100 is not set |
626 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
627 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
628 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
629 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
688 | CONFIG_NET_PCI=y | 630 | CONFIG_NET_PCI=y |
689 | # CONFIG_PCNET32 is not set | 631 | # CONFIG_PCNET32 is not set |
690 | # CONFIG_AMD8111_ETH is not set | 632 | # CONFIG_AMD8111_ETH is not set |
691 | # CONFIG_ADAPTEC_STARFIRE is not set | 633 | # CONFIG_ADAPTEC_STARFIRE is not set |
692 | # CONFIG_B44 is not set | 634 | # CONFIG_B44 is not set |
693 | # CONFIG_FORCEDETH is not set | 635 | # CONFIG_FORCEDETH is not set |
694 | # CONFIG_DGRS is not set | ||
695 | # CONFIG_EEPRO100 is not set | 636 | # CONFIG_EEPRO100 is not set |
696 | # CONFIG_E100 is not set | 637 | # CONFIG_E100 is not set |
697 | # CONFIG_FEALNX is not set | 638 | # CONFIG_FEALNX is not set |
698 | # CONFIG_NATSEMI is not set | 639 | # CONFIG_NATSEMI is not set |
699 | # CONFIG_NE2K_PCI is not set | 640 | # CONFIG_NE2K_PCI is not set |
700 | # CONFIG_8139TOO is not set | 641 | # CONFIG_8139TOO is not set |
642 | # CONFIG_R6040 is not set | ||
701 | # CONFIG_SIS900 is not set | 643 | # CONFIG_SIS900 is not set |
702 | # CONFIG_EPIC100 is not set | 644 | # CONFIG_EPIC100 is not set |
703 | # CONFIG_SUNDANCE is not set | 645 | # CONFIG_SUNDANCE is not set |
704 | # CONFIG_TLAN is not set | 646 | # CONFIG_TLAN is not set |
705 | # CONFIG_VIA_RHINE is not set | 647 | # CONFIG_VIA_RHINE is not set |
706 | 648 | # CONFIG_NETDEV_1000 is not set | |
707 | # | 649 | # CONFIG_NETDEV_10000 is not set |
708 | # Ethernet (1000 Mbit) | ||
709 | # | ||
710 | # CONFIG_ACENIC is not set | ||
711 | # CONFIG_DL2K is not set | ||
712 | # CONFIG_E1000 is not set | ||
713 | # CONFIG_NS83820 is not set | ||
714 | # CONFIG_HAMACHI is not set | ||
715 | # CONFIG_R8169 is not set | ||
716 | # CONFIG_SIS190 is not set | ||
717 | # CONFIG_SKGE is not set | ||
718 | # CONFIG_SKY2 is not set | ||
719 | # CONFIG_SK98LIN is not set | ||
720 | # CONFIG_VIA_VELOCITY is not set | ||
721 | # CONFIG_TIGON3 is not set | ||
722 | # CONFIG_BNX2 is not set | ||
723 | # CONFIG_QLA3XXX is not set | ||
724 | |||
725 | # | ||
726 | # Ethernet (10000 Mbit) | ||
727 | # | ||
728 | # CONFIG_CHELSIO_T1 is not set | ||
729 | # CONFIG_CHELSIO_T3 is not set | ||
730 | # CONFIG_IXGB is not set | ||
731 | # CONFIG_S2IO is not set | ||
732 | # CONFIG_MYRI10GE is not set | ||
733 | # CONFIG_NETXEN_NIC is not set | ||
734 | |||
735 | # | ||
736 | # Token Ring devices | ||
737 | # | ||
738 | # CONFIG_TR is not set | 650 | # CONFIG_TR is not set |
739 | 651 | ||
740 | # | 652 | # |
741 | # Wireless LAN (non-hamradio) | 653 | # Wireless LAN |
742 | # | 654 | # |
743 | # CONFIG_NET_RADIO is not set | 655 | # CONFIG_WLAN_PRE80211 is not set |
656 | # CONFIG_WLAN_80211 is not set | ||
744 | 657 | ||
745 | # | 658 | # |
746 | # Wan interfaces | 659 | # USB Network Adapters |
747 | # | 660 | # |
661 | # CONFIG_USB_KAWETH is not set | ||
662 | # CONFIG_USB_PEGASUS is not set | ||
663 | # CONFIG_USB_USBNET is not set | ||
748 | # CONFIG_WAN is not set | 664 | # CONFIG_WAN is not set |
749 | # CONFIG_FDDI is not set | 665 | # CONFIG_FDDI is not set |
750 | # CONFIG_PPP is not set | 666 | # CONFIG_PPP is not set |
@@ -752,15 +668,7 @@ CONFIG_NET_PCI=y | |||
752 | # CONFIG_NET_FC is not set | 668 | # CONFIG_NET_FC is not set |
753 | # CONFIG_NETPOLL is not set | 669 | # CONFIG_NETPOLL is not set |
754 | # CONFIG_NET_POLL_CONTROLLER is not set | 670 | # CONFIG_NET_POLL_CONTROLLER is not set |
755 | |||
756 | # | ||
757 | # ISDN subsystem | ||
758 | # | ||
759 | # CONFIG_ISDN is not set | 671 | # CONFIG_ISDN is not set |
760 | |||
761 | # | ||
762 | # Telephony Support | ||
763 | # | ||
764 | # CONFIG_PHONE is not set | 672 | # CONFIG_PHONE is not set |
765 | 673 | ||
766 | # | 674 | # |
@@ -768,6 +676,7 @@ CONFIG_NET_PCI=y | |||
768 | # | 676 | # |
769 | CONFIG_INPUT=y | 677 | CONFIG_INPUT=y |
770 | # CONFIG_INPUT_FF_MEMLESS is not set | 678 | # CONFIG_INPUT_FF_MEMLESS is not set |
679 | # CONFIG_INPUT_POLLDEV is not set | ||
771 | 680 | ||
772 | # | 681 | # |
773 | # Userland interfaces | 682 | # Userland interfaces |
@@ -777,7 +686,6 @@ CONFIG_INPUT_MOUSEDEV=y | |||
777 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | 686 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 |
778 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | 687 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 |
779 | # CONFIG_INPUT_JOYDEV is not set | 688 | # CONFIG_INPUT_JOYDEV is not set |
780 | # CONFIG_INPUT_TSDEV is not set | ||
781 | # CONFIG_INPUT_EVDEV is not set | 689 | # CONFIG_INPUT_EVDEV is not set |
782 | # CONFIG_INPUT_EVBUG is not set | 690 | # CONFIG_INPUT_EVBUG is not set |
783 | 691 | ||
@@ -787,6 +695,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | |||
787 | # CONFIG_INPUT_KEYBOARD is not set | 695 | # CONFIG_INPUT_KEYBOARD is not set |
788 | # CONFIG_INPUT_MOUSE is not set | 696 | # CONFIG_INPUT_MOUSE is not set |
789 | # CONFIG_INPUT_JOYSTICK is not set | 697 | # CONFIG_INPUT_JOYSTICK is not set |
698 | # CONFIG_INPUT_TABLET is not set | ||
790 | # CONFIG_INPUT_TOUCHSCREEN is not set | 699 | # CONFIG_INPUT_TOUCHSCREEN is not set |
791 | # CONFIG_INPUT_MISC is not set | 700 | # CONFIG_INPUT_MISC is not set |
792 | 701 | ||
@@ -821,31 +730,12 @@ CONFIG_SERIAL_CORE_CONSOLE=y | |||
821 | # CONFIG_SERIAL_JSM is not set | 730 | # CONFIG_SERIAL_JSM is not set |
822 | CONFIG_UNIX98_PTYS=y | 731 | CONFIG_UNIX98_PTYS=y |
823 | # CONFIG_LEGACY_PTYS is not set | 732 | # CONFIG_LEGACY_PTYS is not set |
824 | |||
825 | # | ||
826 | # IPMI | ||
827 | # | ||
828 | # CONFIG_IPMI_HANDLER is not set | 733 | # CONFIG_IPMI_HANDLER is not set |
829 | |||
830 | # | ||
831 | # Watchdog Cards | ||
832 | # | ||
833 | # CONFIG_WATCHDOG is not set | ||
834 | # CONFIG_HW_RANDOM is not set | 734 | # CONFIG_HW_RANDOM is not set |
835 | # CONFIG_GEN_RTC is not set | ||
836 | # CONFIG_DTLK is not set | ||
837 | # CONFIG_R3964 is not set | 735 | # CONFIG_R3964 is not set |
838 | # CONFIG_APPLICOM is not set | 736 | # CONFIG_APPLICOM is not set |
839 | # CONFIG_DRM is not set | ||
840 | # CONFIG_RAW_DRIVER is not set | 737 | # CONFIG_RAW_DRIVER is not set |
841 | 738 | CONFIG_DEVPORT=y | |
842 | # | ||
843 | # TPM devices | ||
844 | # | ||
845 | |||
846 | # | ||
847 | # I2C support | ||
848 | # | ||
849 | # CONFIG_I2C is not set | 739 | # CONFIG_I2C is not set |
850 | 740 | ||
851 | # | 741 | # |
@@ -853,18 +743,27 @@ CONFIG_UNIX98_PTYS=y | |||
853 | # | 743 | # |
854 | # CONFIG_SPI is not set | 744 | # CONFIG_SPI is not set |
855 | # CONFIG_SPI_MASTER is not set | 745 | # CONFIG_SPI_MASTER is not set |
856 | |||
857 | # | ||
858 | # Dallas's 1-wire bus | ||
859 | # | ||
860 | # CONFIG_W1 is not set | 746 | # CONFIG_W1 is not set |
861 | 747 | # CONFIG_POWER_SUPPLY is not set | |
862 | # | ||
863 | # Hardware Monitoring support | ||
864 | # | ||
865 | CONFIG_HWMON=y | 748 | CONFIG_HWMON=y |
866 | # CONFIG_HWMON_VID is not set | 749 | # CONFIG_HWMON_VID is not set |
750 | # CONFIG_SENSORS_IT87 is not set | ||
751 | # CONFIG_SENSORS_PC87360 is not set | ||
752 | # CONFIG_SENSORS_SIS5595 is not set | ||
753 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
754 | # CONFIG_SENSORS_VIA686A is not set | ||
755 | # CONFIG_SENSORS_VT8231 is not set | ||
756 | # CONFIG_SENSORS_W83627HF is not set | ||
757 | # CONFIG_SENSORS_W83627EHF is not set | ||
867 | # CONFIG_HWMON_DEBUG_CHIP is not set | 758 | # CONFIG_HWMON_DEBUG_CHIP is not set |
759 | CONFIG_THERMAL=y | ||
760 | # CONFIG_WATCHDOG is not set | ||
761 | |||
762 | # | ||
763 | # Sonics Silicon Backplane | ||
764 | # | ||
765 | CONFIG_SSB_POSSIBLE=y | ||
766 | # CONFIG_SSB is not set | ||
868 | 767 | ||
869 | # | 768 | # |
870 | # Multifunction device drivers | 769 | # Multifunction device drivers |
@@ -875,23 +774,27 @@ CONFIG_HWMON=y | |||
875 | # Multimedia devices | 774 | # Multimedia devices |
876 | # | 775 | # |
877 | # CONFIG_VIDEO_DEV is not set | 776 | # CONFIG_VIDEO_DEV is not set |
878 | 777 | # CONFIG_DVB_CORE is not set | |
879 | # | 778 | # CONFIG_DAB is not set |
880 | # Digital Video Broadcasting Devices | ||
881 | # | ||
882 | # CONFIG_DVB is not set | ||
883 | # CONFIG_USB_DABUSB is not set | ||
884 | 779 | ||
885 | # | 780 | # |
886 | # Graphics support | 781 | # Graphics support |
887 | # | 782 | # |
888 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 783 | # CONFIG_DRM is not set |
784 | # CONFIG_VGASTATE is not set | ||
785 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
889 | CONFIG_FB=y | 786 | CONFIG_FB=y |
890 | CONFIG_FIRMWARE_EDID=y | 787 | CONFIG_FIRMWARE_EDID=y |
891 | # CONFIG_FB_DDC is not set | 788 | # CONFIG_FB_DDC is not set |
892 | # CONFIG_FB_CFB_FILLRECT is not set | 789 | # CONFIG_FB_CFB_FILLRECT is not set |
893 | # CONFIG_FB_CFB_COPYAREA is not set | 790 | # CONFIG_FB_CFB_COPYAREA is not set |
894 | # CONFIG_FB_CFB_IMAGEBLIT is not set | 791 | # CONFIG_FB_CFB_IMAGEBLIT is not set |
792 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
793 | # CONFIG_FB_SYS_FILLRECT is not set | ||
794 | # CONFIG_FB_SYS_COPYAREA is not set | ||
795 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
796 | # CONFIG_FB_SYS_FOPS is not set | ||
797 | CONFIG_FB_DEFERRED_IO=y | ||
895 | # CONFIG_FB_SVGALIB is not set | 798 | # CONFIG_FB_SVGALIB is not set |
896 | # CONFIG_FB_MACMODES is not set | 799 | # CONFIG_FB_MACMODES is not set |
897 | # CONFIG_FB_BACKLIGHT is not set | 800 | # CONFIG_FB_BACKLIGHT is not set |
@@ -899,14 +802,13 @@ CONFIG_FIRMWARE_EDID=y | |||
899 | # CONFIG_FB_TILEBLITTING is not set | 802 | # CONFIG_FB_TILEBLITTING is not set |
900 | 803 | ||
901 | # | 804 | # |
902 | # Frambuffer hardware drivers | 805 | # Frame buffer hardware drivers |
903 | # | 806 | # |
904 | # CONFIG_FB_CIRRUS is not set | 807 | # CONFIG_FB_CIRRUS is not set |
905 | # CONFIG_FB_PM2 is not set | 808 | # CONFIG_FB_PM2 is not set |
906 | # CONFIG_FB_CYBER2000 is not set | 809 | # CONFIG_FB_CYBER2000 is not set |
907 | # CONFIG_FB_ASILIANT is not set | 810 | # CONFIG_FB_ASILIANT is not set |
908 | # CONFIG_FB_IMSTT is not set | 811 | # CONFIG_FB_IMSTT is not set |
909 | # CONFIG_FB_EPSON1355 is not set | ||
910 | # CONFIG_FB_S1D13XXX is not set | 812 | # CONFIG_FB_S1D13XXX is not set |
911 | # CONFIG_FB_NVIDIA is not set | 813 | # CONFIG_FB_NVIDIA is not set |
912 | # CONFIG_FB_RIVA is not set | 814 | # CONFIG_FB_RIVA is not set |
@@ -920,22 +822,27 @@ CONFIG_FIRMWARE_EDID=y | |||
920 | # CONFIG_FB_KYRO is not set | 822 | # CONFIG_FB_KYRO is not set |
921 | # CONFIG_FB_3DFX is not set | 823 | # CONFIG_FB_3DFX is not set |
922 | # CONFIG_FB_VOODOO1 is not set | 824 | # CONFIG_FB_VOODOO1 is not set |
825 | # CONFIG_FB_VT8623 is not set | ||
923 | # CONFIG_FB_TRIDENT is not set | 826 | # CONFIG_FB_TRIDENT is not set |
827 | # CONFIG_FB_ARK is not set | ||
924 | # CONFIG_FB_VIRTUAL is not set | 828 | # CONFIG_FB_VIRTUAL is not set |
829 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
830 | |||
831 | # | ||
832 | # Display device support | ||
833 | # | ||
834 | # CONFIG_DISPLAY_SUPPORT is not set | ||
925 | 835 | ||
926 | # | 836 | # |
927 | # Console display driver support | 837 | # Console display driver support |
928 | # | 838 | # |
929 | CONFIG_DUMMY_CONSOLE=y | 839 | CONFIG_DUMMY_CONSOLE=y |
930 | CONFIG_FRAMEBUFFER_CONSOLE=y | 840 | CONFIG_FRAMEBUFFER_CONSOLE=y |
841 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
931 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | 842 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set |
932 | # CONFIG_FONTS is not set | 843 | # CONFIG_FONTS is not set |
933 | CONFIG_FONT_8x8=y | 844 | CONFIG_FONT_8x8=y |
934 | CONFIG_FONT_8x16=y | 845 | CONFIG_FONT_8x16=y |
935 | |||
936 | # | ||
937 | # Logo configuration | ||
938 | # | ||
939 | CONFIG_LOGO=y | 846 | CONFIG_LOGO=y |
940 | # CONFIG_LOGO_LINUX_MONO is not set | 847 | # CONFIG_LOGO_LINUX_MONO is not set |
941 | # CONFIG_LOGO_LINUX_VGA16 is not set | 848 | # CONFIG_LOGO_LINUX_VGA16 is not set |
@@ -958,39 +865,38 @@ CONFIG_SOUND=y | |||
958 | # Open Sound System | 865 | # Open Sound System |
959 | # | 866 | # |
960 | CONFIG_SOUND_PRIME=y | 867 | CONFIG_SOUND_PRIME=y |
961 | # CONFIG_OBSOLETE_OSS is not set | ||
962 | # CONFIG_SOUND_BT878 is not set | ||
963 | # CONFIG_SOUND_ICH is not set | ||
964 | # CONFIG_SOUND_TRIDENT is not set | 868 | # CONFIG_SOUND_TRIDENT is not set |
965 | # CONFIG_SOUND_MSNDCLAS is not set | 869 | # CONFIG_SOUND_MSNDCLAS is not set |
966 | # CONFIG_SOUND_MSNDPIN is not set | 870 | # CONFIG_SOUND_MSNDPIN is not set |
967 | # CONFIG_SOUND_VIA82CXXX is not set | 871 | CONFIG_HID_SUPPORT=y |
968 | |||
969 | # | ||
970 | # HID Devices | ||
971 | # | ||
972 | CONFIG_HID=y | 872 | CONFIG_HID=y |
973 | # CONFIG_HID_DEBUG is not set | 873 | # CONFIG_HID_DEBUG is not set |
874 | # CONFIG_HIDRAW is not set | ||
974 | 875 | ||
975 | # | 876 | # |
976 | # USB support | 877 | # USB Input Devices |
977 | # | 878 | # |
879 | CONFIG_USB_HID=y | ||
880 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
881 | # CONFIG_USB_HIDDEV is not set | ||
882 | CONFIG_USB_SUPPORT=y | ||
978 | CONFIG_USB_ARCH_HAS_HCD=y | 883 | CONFIG_USB_ARCH_HAS_HCD=y |
979 | CONFIG_USB_ARCH_HAS_OHCI=y | 884 | CONFIG_USB_ARCH_HAS_OHCI=y |
980 | CONFIG_USB_ARCH_HAS_EHCI=y | 885 | CONFIG_USB_ARCH_HAS_EHCI=y |
981 | CONFIG_USB=y | 886 | CONFIG_USB=y |
982 | CONFIG_USB_DEBUG=y | 887 | # CONFIG_USB_DEBUG is not set |
888 | # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set | ||
983 | 889 | ||
984 | # | 890 | # |
985 | # Miscellaneous USB options | 891 | # Miscellaneous USB options |
986 | # | 892 | # |
987 | CONFIG_USB_DEVICEFS=y | 893 | CONFIG_USB_DEVICEFS=y |
894 | # CONFIG_USB_DEVICE_CLASS is not set | ||
988 | 895 | ||
989 | # | 896 | # |
990 | # USB Host Controller Drivers | 897 | # USB Host Controller Drivers |
991 | # | 898 | # |
992 | CONFIG_USB_EHCI_HCD=y | 899 | CONFIG_USB_EHCI_HCD=y |
993 | # CONFIG_USB_EHCI_BIG_ENDIAN_MMIO is not set | ||
994 | # CONFIG_USB_ISP116X_HCD is not set | 900 | # CONFIG_USB_ISP116X_HCD is not set |
995 | CONFIG_USB_OHCI_HCD=y | 901 | CONFIG_USB_OHCI_HCD=y |
996 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | 902 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set |
@@ -998,6 +904,7 @@ CONFIG_USB_OHCI_HCD=y | |||
998 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | 904 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y |
999 | # CONFIG_USB_UHCI_HCD is not set | 905 | # CONFIG_USB_UHCI_HCD is not set |
1000 | # CONFIG_USB_SL811_HCD is not set | 906 | # CONFIG_USB_SL811_HCD is not set |
907 | # CONFIG_USB_R8A66597_HCD is not set | ||
1001 | 908 | ||
1002 | # | 909 | # |
1003 | # USB Device Class drivers | 910 | # USB Device Class drivers |
@@ -1015,49 +922,20 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y | |||
1015 | CONFIG_USB_STORAGE=y | 922 | CONFIG_USB_STORAGE=y |
1016 | # CONFIG_USB_STORAGE_DEBUG is not set | 923 | # CONFIG_USB_STORAGE_DEBUG is not set |
1017 | # CONFIG_USB_STORAGE_FREECOM is not set | 924 | # CONFIG_USB_STORAGE_FREECOM is not set |
925 | # CONFIG_USB_STORAGE_ISD200 is not set | ||
1018 | # CONFIG_USB_STORAGE_DPCM is not set | 926 | # CONFIG_USB_STORAGE_DPCM is not set |
1019 | # CONFIG_USB_STORAGE_KARMA is not set | 927 | # CONFIG_USB_STORAGE_KARMA is not set |
1020 | # CONFIG_USB_LIBUSUAL is not set | 928 | # CONFIG_USB_LIBUSUAL is not set |
1021 | 929 | ||
1022 | # | 930 | # |
1023 | # USB Input Devices | ||
1024 | # | ||
1025 | CONFIG_USB_HID=y | ||
1026 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
1027 | # CONFIG_USB_HIDDEV is not set | ||
1028 | # CONFIG_USB_AIPTEK is not set | ||
1029 | # CONFIG_USB_WACOM is not set | ||
1030 | # CONFIG_USB_ACECAD is not set | ||
1031 | # CONFIG_USB_KBTAB is not set | ||
1032 | # CONFIG_USB_POWERMATE is not set | ||
1033 | # CONFIG_USB_TOUCHSCREEN is not set | ||
1034 | # CONFIG_USB_XPAD is not set | ||
1035 | # CONFIG_USB_ATI_REMOTE is not set | ||
1036 | # CONFIG_USB_ATI_REMOTE2 is not set | ||
1037 | # CONFIG_USB_APPLETOUCH is not set | ||
1038 | # CONFIG_USB_GTCO is not set | ||
1039 | |||
1040 | # | ||
1041 | # USB Imaging devices | 931 | # USB Imaging devices |
1042 | # | 932 | # |
1043 | # CONFIG_USB_MICROTEK is not set | 933 | # CONFIG_USB_MICROTEK is not set |
1044 | |||
1045 | # | ||
1046 | # USB Network Adapters | ||
1047 | # | ||
1048 | # CONFIG_USB_KAWETH is not set | ||
1049 | # CONFIG_USB_PEGASUS is not set | ||
1050 | # CONFIG_USB_USBNET_MII is not set | ||
1051 | # CONFIG_USB_USBNET is not set | ||
1052 | CONFIG_USB_MON=y | 934 | CONFIG_USB_MON=y |
1053 | 935 | ||
1054 | # | 936 | # |
1055 | # USB port drivers | 937 | # USB port drivers |
1056 | # | 938 | # |
1057 | |||
1058 | # | ||
1059 | # USB Serial Converter support | ||
1060 | # | ||
1061 | # CONFIG_USB_SERIAL is not set | 939 | # CONFIG_USB_SERIAL is not set |
1062 | 940 | ||
1063 | # | 941 | # |
@@ -1078,67 +956,17 @@ CONFIG_USB_MON=y | |||
1078 | # CONFIG_USB_LD is not set | 956 | # CONFIG_USB_LD is not set |
1079 | # CONFIG_USB_TRANCEVIBRATOR is not set | 957 | # CONFIG_USB_TRANCEVIBRATOR is not set |
1080 | # CONFIG_USB_IOWARRIOR is not set | 958 | # CONFIG_USB_IOWARRIOR is not set |
1081 | |||
1082 | # | ||
1083 | # USB DSL modem support | ||
1084 | # | ||
1085 | |||
1086 | # | ||
1087 | # USB Gadget Support | ||
1088 | # | ||
1089 | # CONFIG_USB_GADGET is not set | 959 | # CONFIG_USB_GADGET is not set |
1090 | |||
1091 | # | ||
1092 | # MMC/SD Card support | ||
1093 | # | ||
1094 | # CONFIG_MMC is not set | 960 | # CONFIG_MMC is not set |
1095 | 961 | # CONFIG_MEMSTICK is not set | |
1096 | # | ||
1097 | # LED devices | ||
1098 | # | ||
1099 | # CONFIG_NEW_LEDS is not set | 962 | # CONFIG_NEW_LEDS is not set |
1100 | |||
1101 | # | ||
1102 | # LED drivers | ||
1103 | # | ||
1104 | |||
1105 | # | ||
1106 | # LED Triggers | ||
1107 | # | ||
1108 | |||
1109 | # | ||
1110 | # InfiniBand support | ||
1111 | # | ||
1112 | # CONFIG_INFINIBAND is not set | 963 | # CONFIG_INFINIBAND is not set |
964 | # CONFIG_RTC_CLASS is not set | ||
1113 | 965 | ||
1114 | # | 966 | # |
1115 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | 967 | # Userspace I/O |
1116 | # | ||
1117 | |||
1118 | # | ||
1119 | # Real Time Clock | ||
1120 | # | ||
1121 | |||
1122 | # | ||
1123 | # DMA Engine support | ||
1124 | # | ||
1125 | # CONFIG_DMA_ENGINE is not set | ||
1126 | |||
1127 | # | ||
1128 | # DMA Clients | ||
1129 | # | ||
1130 | |||
1131 | # | ||
1132 | # DMA Devices | ||
1133 | # | ||
1134 | |||
1135 | # | ||
1136 | # Auxiliary Display support | ||
1137 | # | ||
1138 | |||
1139 | # | ||
1140 | # Virtualization | ||
1141 | # | 968 | # |
969 | # CONFIG_UIO is not set | ||
1142 | 970 | ||
1143 | # | 971 | # |
1144 | # File systems | 972 | # File systems |
@@ -1151,12 +979,11 @@ CONFIG_EXT2_FS=y | |||
1151 | # CONFIG_JFS_FS is not set | 979 | # CONFIG_JFS_FS is not set |
1152 | # CONFIG_FS_POSIX_ACL is not set | 980 | # CONFIG_FS_POSIX_ACL is not set |
1153 | # CONFIG_XFS_FS is not set | 981 | # CONFIG_XFS_FS is not set |
1154 | # CONFIG_MINIX_FS is not set | 982 | # CONFIG_OCFS2_FS is not set |
1155 | # CONFIG_ROMFS_FS is not set | 983 | # CONFIG_DNOTIFY is not set |
1156 | CONFIG_INOTIFY=y | 984 | CONFIG_INOTIFY=y |
1157 | CONFIG_INOTIFY_USER=y | 985 | CONFIG_INOTIFY_USER=y |
1158 | # CONFIG_QUOTA is not set | 986 | # CONFIG_QUOTA is not set |
1159 | # CONFIG_DNOTIFY is not set | ||
1160 | # CONFIG_AUTOFS_FS is not set | 987 | # CONFIG_AUTOFS_FS is not set |
1161 | # CONFIG_AUTOFS4_FS is not set | 988 | # CONFIG_AUTOFS4_FS is not set |
1162 | # CONFIG_FUSE_FS is not set | 989 | # CONFIG_FUSE_FS is not set |
@@ -1181,14 +1008,14 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
1181 | # Pseudo filesystems | 1008 | # Pseudo filesystems |
1182 | # | 1009 | # |
1183 | CONFIG_PROC_FS=y | 1010 | CONFIG_PROC_FS=y |
1184 | # CONFIG_PROC_KCORE is not set | 1011 | CONFIG_PROC_KCORE=y |
1185 | CONFIG_PROC_SYSCTL=y | 1012 | CONFIG_PROC_SYSCTL=y |
1186 | # CONFIG_SYSFS is not set | 1013 | CONFIG_SYSFS=y |
1187 | CONFIG_TMPFS=y | 1014 | CONFIG_TMPFS=y |
1188 | # CONFIG_TMPFS_POSIX_ACL is not set | 1015 | # CONFIG_TMPFS_POSIX_ACL is not set |
1189 | # CONFIG_HUGETLBFS is not set | 1016 | # CONFIG_HUGETLBFS is not set |
1190 | # CONFIG_HUGETLB_PAGE is not set | 1017 | # CONFIG_HUGETLB_PAGE is not set |
1191 | CONFIG_RAMFS=y | 1018 | # CONFIG_CONFIGFS_FS is not set |
1192 | 1019 | ||
1193 | # | 1020 | # |
1194 | # Miscellaneous filesystems | 1021 | # Miscellaneous filesystems |
@@ -1197,14 +1024,13 @@ CONFIG_RAMFS=y | |||
1197 | # CONFIG_JFFS2_FS is not set | 1024 | # CONFIG_JFFS2_FS is not set |
1198 | CONFIG_CRAMFS=y | 1025 | CONFIG_CRAMFS=y |
1199 | # CONFIG_VXFS_FS is not set | 1026 | # CONFIG_VXFS_FS is not set |
1027 | # CONFIG_MINIX_FS is not set | ||
1200 | # CONFIG_HPFS_FS is not set | 1028 | # CONFIG_HPFS_FS is not set |
1201 | # CONFIG_QNX4FS_FS is not set | 1029 | # CONFIG_QNX4FS_FS is not set |
1030 | # CONFIG_ROMFS_FS is not set | ||
1202 | # CONFIG_SYSV_FS is not set | 1031 | # CONFIG_SYSV_FS is not set |
1203 | # CONFIG_UFS_FS is not set | 1032 | # CONFIG_UFS_FS is not set |
1204 | 1033 | CONFIG_NETWORK_FILESYSTEMS=y | |
1205 | # | ||
1206 | # Network File Systems | ||
1207 | # | ||
1208 | CONFIG_NFS_FS=y | 1034 | CONFIG_NFS_FS=y |
1209 | CONFIG_NFS_V3=y | 1035 | CONFIG_NFS_V3=y |
1210 | # CONFIG_NFS_V3_ACL is not set | 1036 | # CONFIG_NFS_V3_ACL is not set |
@@ -1225,10 +1051,6 @@ CONFIG_SUNRPC=y | |||
1225 | # | 1051 | # |
1226 | # CONFIG_PARTITION_ADVANCED is not set | 1052 | # CONFIG_PARTITION_ADVANCED is not set |
1227 | CONFIG_MSDOS_PARTITION=y | 1053 | CONFIG_MSDOS_PARTITION=y |
1228 | |||
1229 | # | ||
1230 | # Native Language Support | ||
1231 | # | ||
1232 | CONFIG_NLS=y | 1054 | CONFIG_NLS=y |
1233 | CONFIG_NLS_DEFAULT="iso8859-1" | 1055 | CONFIG_NLS_DEFAULT="iso8859-1" |
1234 | # CONFIG_NLS_CODEPAGE_437 is not set | 1056 | # CONFIG_NLS_CODEPAGE_437 is not set |
@@ -1275,13 +1097,15 @@ CONFIG_NLS_DEFAULT="iso8859-1" | |||
1275 | # | 1097 | # |
1276 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | 1098 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y |
1277 | # CONFIG_PRINTK_TIME is not set | 1099 | # CONFIG_PRINTK_TIME is not set |
1100 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
1278 | CONFIG_ENABLE_MUST_CHECK=y | 1101 | CONFIG_ENABLE_MUST_CHECK=y |
1279 | # CONFIG_MAGIC_SYSRQ is not set | 1102 | # CONFIG_MAGIC_SYSRQ is not set |
1280 | # CONFIG_UNUSED_SYMBOLS is not set | 1103 | # CONFIG_UNUSED_SYMBOLS is not set |
1104 | CONFIG_DEBUG_FS=y | ||
1281 | # CONFIG_HEADERS_CHECK is not set | 1105 | # CONFIG_HEADERS_CHECK is not set |
1282 | # CONFIG_DEBUG_KERNEL is not set | 1106 | # CONFIG_DEBUG_KERNEL is not set |
1283 | CONFIG_LOG_BUF_SHIFT=14 | ||
1284 | # CONFIG_DEBUG_BUGVERBOSE is not set | 1107 | # CONFIG_DEBUG_BUGVERBOSE is not set |
1108 | # CONFIG_SAMPLES is not set | ||
1285 | # CONFIG_SH_STANDARD_BIOS is not set | 1109 | # CONFIG_SH_STANDARD_BIOS is not set |
1286 | # CONFIG_EARLY_SCIF_CONSOLE is not set | 1110 | # CONFIG_EARLY_SCIF_CONSOLE is not set |
1287 | # CONFIG_SH_KGDB is not set | 1111 | # CONFIG_SH_KGDB is not set |
@@ -1290,11 +1114,48 @@ CONFIG_LOG_BUF_SHIFT=14 | |||
1290 | # Security options | 1114 | # Security options |
1291 | # | 1115 | # |
1292 | # CONFIG_KEYS is not set | 1116 | # CONFIG_KEYS is not set |
1293 | 1117 | # CONFIG_SECURITY is not set | |
1294 | # | 1118 | CONFIG_CRYPTO=y |
1295 | # Cryptographic options | 1119 | # CONFIG_CRYPTO_SEQIV is not set |
1296 | # | 1120 | # CONFIG_CRYPTO_MANAGER is not set |
1297 | # CONFIG_CRYPTO is not set | 1121 | # CONFIG_CRYPTO_HMAC is not set |
1122 | # CONFIG_CRYPTO_NULL is not set | ||
1123 | # CONFIG_CRYPTO_MD4 is not set | ||
1124 | # CONFIG_CRYPTO_MD5 is not set | ||
1125 | # CONFIG_CRYPTO_SHA1 is not set | ||
1126 | # CONFIG_CRYPTO_SHA256 is not set | ||
1127 | # CONFIG_CRYPTO_SHA512 is not set | ||
1128 | # CONFIG_CRYPTO_WP512 is not set | ||
1129 | # CONFIG_CRYPTO_TGR192 is not set | ||
1130 | # CONFIG_CRYPTO_ECB is not set | ||
1131 | # CONFIG_CRYPTO_CBC is not set | ||
1132 | # CONFIG_CRYPTO_PCBC is not set | ||
1133 | # CONFIG_CRYPTO_CTR is not set | ||
1134 | # CONFIG_CRYPTO_GCM is not set | ||
1135 | # CONFIG_CRYPTO_CCM is not set | ||
1136 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1137 | # CONFIG_CRYPTO_DES is not set | ||
1138 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1139 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1140 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1141 | # CONFIG_CRYPTO_SERPENT is not set | ||
1142 | # CONFIG_CRYPTO_AES is not set | ||
1143 | # CONFIG_CRYPTO_CAST5 is not set | ||
1144 | # CONFIG_CRYPTO_CAST6 is not set | ||
1145 | # CONFIG_CRYPTO_TEA is not set | ||
1146 | # CONFIG_CRYPTO_ARC4 is not set | ||
1147 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1148 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1149 | # CONFIG_CRYPTO_SEED is not set | ||
1150 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1151 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1152 | # CONFIG_CRYPTO_CRC32C is not set | ||
1153 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1154 | # CONFIG_CRYPTO_TEST is not set | ||
1155 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1156 | # CONFIG_CRYPTO_LZO is not set | ||
1157 | CONFIG_CRYPTO_HW=y | ||
1158 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | ||
1298 | 1159 | ||
1299 | # | 1160 | # |
1300 | # Library routines | 1161 | # Library routines |
@@ -1302,9 +1163,12 @@ CONFIG_LOG_BUF_SHIFT=14 | |||
1302 | CONFIG_BITREVERSE=y | 1163 | CONFIG_BITREVERSE=y |
1303 | # CONFIG_CRC_CCITT is not set | 1164 | # CONFIG_CRC_CCITT is not set |
1304 | # CONFIG_CRC16 is not set | 1165 | # CONFIG_CRC16 is not set |
1166 | # CONFIG_CRC_ITU_T is not set | ||
1305 | CONFIG_CRC32=y | 1167 | CONFIG_CRC32=y |
1168 | # CONFIG_CRC7 is not set | ||
1306 | # CONFIG_LIBCRC32C is not set | 1169 | # CONFIG_LIBCRC32C is not set |
1307 | CONFIG_ZLIB_INFLATE=y | 1170 | CONFIG_ZLIB_INFLATE=y |
1308 | CONFIG_PLIST=y | 1171 | CONFIG_PLIST=y |
1309 | CONFIG_HAS_IOMEM=y | 1172 | CONFIG_HAS_IOMEM=y |
1310 | CONFIG_HAS_IOPORT=y | 1173 | CONFIG_HAS_IOPORT=y |
1174 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/sh/configs/sh7710voipgw_defconfig b/arch/sh/configs/sh7710voipgw_defconfig index 9380c321169a..37e49a589207 100644 --- a/arch/sh/configs/sh7710voipgw_defconfig +++ b/arch/sh/configs/sh7710voipgw_defconfig | |||
@@ -1,40 +1,55 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.18 | 3 | # Linux kernel version: 2.6.25-rc4 |
4 | # Tue Oct 3 12:48:56 2006 | 4 | # Thu Mar 6 16:02:29 2008 |
5 | # | 5 | # |
6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
7 | CONFIG_SUPERH32=y | ||
7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
9 | CONFIG_GENERIC_BUG=y | ||
8 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 10 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
9 | CONFIG_GENERIC_HWEIGHT=y | 11 | CONFIG_GENERIC_HWEIGHT=y |
10 | CONFIG_GENERIC_HARDIRQS=y | 12 | CONFIG_GENERIC_HARDIRQS=y |
11 | CONFIG_GENERIC_IRQ_PROBE=y | 13 | CONFIG_GENERIC_IRQ_PROBE=y |
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 14 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
15 | CONFIG_GENERIC_TIME=y | ||
16 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
17 | CONFIG_STACKTRACE_SUPPORT=y | ||
18 | CONFIG_LOCKDEP_SUPPORT=y | ||
19 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
20 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
21 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | ||
22 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
13 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 23 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
14 | 24 | ||
15 | # | 25 | # |
16 | # Code maturity level options | 26 | # General setup |
17 | # | 27 | # |
18 | CONFIG_EXPERIMENTAL=y | 28 | CONFIG_EXPERIMENTAL=y |
19 | CONFIG_BROKEN_ON_SMP=y | 29 | CONFIG_BROKEN_ON_SMP=y |
20 | CONFIG_INIT_ENV_ARG_LIMIT=32 | 30 | CONFIG_INIT_ENV_ARG_LIMIT=32 |
21 | |||
22 | # | ||
23 | # General setup | ||
24 | # | ||
25 | CONFIG_LOCALVERSION="" | 31 | CONFIG_LOCALVERSION="" |
26 | CONFIG_LOCALVERSION_AUTO=y | 32 | CONFIG_LOCALVERSION_AUTO=y |
27 | # CONFIG_SWAP is not set | 33 | # CONFIG_SWAP is not set |
28 | CONFIG_SYSVIPC=y | 34 | CONFIG_SYSVIPC=y |
29 | # CONFIG_IPC_NS is not set | 35 | CONFIG_SYSVIPC_SYSCTL=y |
30 | CONFIG_POSIX_MQUEUE=y | 36 | CONFIG_POSIX_MQUEUE=y |
31 | # CONFIG_BSD_PROCESS_ACCT is not set | 37 | # CONFIG_BSD_PROCESS_ACCT is not set |
32 | # CONFIG_TASKSTATS is not set | 38 | # CONFIG_TASKSTATS is not set |
33 | # CONFIG_UTS_NS is not set | ||
34 | # CONFIG_AUDIT is not set | 39 | # CONFIG_AUDIT is not set |
35 | # CONFIG_IKCONFIG is not set | 40 | # CONFIG_IKCONFIG is not set |
41 | CONFIG_LOG_BUF_SHIFT=14 | ||
42 | # CONFIG_CGROUPS is not set | ||
43 | CONFIG_GROUP_SCHED=y | ||
44 | CONFIG_FAIR_GROUP_SCHED=y | ||
45 | # CONFIG_RT_GROUP_SCHED is not set | ||
46 | CONFIG_USER_SCHED=y | ||
47 | # CONFIG_CGROUP_SCHED is not set | ||
48 | CONFIG_SYSFS_DEPRECATED=y | ||
49 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
36 | # CONFIG_RELAY is not set | 50 | # CONFIG_RELAY is not set |
37 | CONFIG_INITRAMFS_SOURCE="" | 51 | # CONFIG_NAMESPACES is not set |
52 | # CONFIG_BLK_DEV_INITRD is not set | ||
38 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 53 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
39 | CONFIG_SYSCTL=y | 54 | CONFIG_SYSCTL=y |
40 | CONFIG_EMBEDDED=y | 55 | CONFIG_EMBEDDED=y |
@@ -46,33 +61,39 @@ CONFIG_HOTPLUG=y | |||
46 | CONFIG_PRINTK=y | 61 | CONFIG_PRINTK=y |
47 | CONFIG_BUG=y | 62 | CONFIG_BUG=y |
48 | CONFIG_ELF_CORE=y | 63 | CONFIG_ELF_CORE=y |
64 | CONFIG_COMPAT_BRK=y | ||
49 | CONFIG_BASE_FULL=y | 65 | CONFIG_BASE_FULL=y |
50 | # CONFIG_FUTEX is not set | 66 | # CONFIG_FUTEX is not set |
67 | CONFIG_ANON_INODES=y | ||
51 | # CONFIG_EPOLL is not set | 68 | # CONFIG_EPOLL is not set |
69 | CONFIG_SIGNALFD=y | ||
70 | CONFIG_TIMERFD=y | ||
71 | CONFIG_EVENTFD=y | ||
52 | # CONFIG_SHMEM is not set | 72 | # CONFIG_SHMEM is not set |
53 | CONFIG_SLAB=y | ||
54 | CONFIG_VM_EVENT_COUNTERS=y | 73 | CONFIG_VM_EVENT_COUNTERS=y |
74 | CONFIG_SLAB=y | ||
75 | # CONFIG_SLUB is not set | ||
76 | # CONFIG_SLOB is not set | ||
77 | # CONFIG_PROFILING is not set | ||
78 | # CONFIG_MARKERS is not set | ||
79 | CONFIG_HAVE_OPROFILE=y | ||
80 | # CONFIG_HAVE_KPROBES is not set | ||
81 | # CONFIG_HAVE_KRETPROBES is not set | ||
82 | CONFIG_PROC_PAGE_MONITOR=y | ||
83 | CONFIG_SLABINFO=y | ||
55 | CONFIG_TINY_SHMEM=y | 84 | CONFIG_TINY_SHMEM=y |
56 | CONFIG_BASE_SMALL=0 | 85 | CONFIG_BASE_SMALL=0 |
57 | # CONFIG_SLOB is not set | ||
58 | |||
59 | # | ||
60 | # Loadable module support | ||
61 | # | ||
62 | CONFIG_MODULES=y | 86 | CONFIG_MODULES=y |
63 | CONFIG_MODULE_UNLOAD=y | 87 | CONFIG_MODULE_UNLOAD=y |
64 | CONFIG_MODULE_FORCE_UNLOAD=y | 88 | CONFIG_MODULE_FORCE_UNLOAD=y |
65 | # CONFIG_MODVERSIONS is not set | 89 | # CONFIG_MODVERSIONS is not set |
66 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 90 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
67 | # CONFIG_KMOD is not set | 91 | # CONFIG_KMOD is not set |
68 | |||
69 | # | ||
70 | # Block layer | ||
71 | # | ||
72 | CONFIG_BLOCK=y | 92 | CONFIG_BLOCK=y |
73 | # CONFIG_LBD is not set | 93 | # CONFIG_LBD is not set |
74 | # CONFIG_BLK_DEV_IO_TRACE is not set | 94 | # CONFIG_BLK_DEV_IO_TRACE is not set |
75 | # CONFIG_LSF is not set | 95 | # CONFIG_LSF is not set |
96 | # CONFIG_BLK_DEV_BSG is not set | ||
76 | 97 | ||
77 | # | 98 | # |
78 | # IO Schedulers | 99 | # IO Schedulers |
@@ -86,59 +107,26 @@ CONFIG_DEFAULT_DEADLINE=y | |||
86 | # CONFIG_DEFAULT_CFQ is not set | 107 | # CONFIG_DEFAULT_CFQ is not set |
87 | # CONFIG_DEFAULT_NOOP is not set | 108 | # CONFIG_DEFAULT_NOOP is not set |
88 | CONFIG_DEFAULT_IOSCHED="deadline" | 109 | CONFIG_DEFAULT_IOSCHED="deadline" |
110 | CONFIG_CLASSIC_RCU=y | ||
111 | # CONFIG_PREEMPT_RCU is not set | ||
89 | 112 | ||
90 | # | 113 | # |
91 | # System type | 114 | # System type |
92 | # | 115 | # |
93 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
94 | # CONFIG_SH_7751_SOLUTION_ENGINE is not set | ||
95 | # CONFIG_SH_7300_SOLUTION_ENGINE is not set | ||
96 | # CONFIG_SH_7343_SOLUTION_ENGINE is not set | ||
97 | # CONFIG_SH_73180_SOLUTION_ENGINE is not set | ||
98 | # CONFIG_SH_7751_SYSTEMH is not set | ||
99 | # CONFIG_SH_HP6XX is not set | ||
100 | # CONFIG_SH_EC3104 is not set | ||
101 | # CONFIG_SH_SATURN is not set | ||
102 | # CONFIG_SH_DREAMCAST is not set | ||
103 | # CONFIG_SH_BIGSUR is not set | ||
104 | # CONFIG_SH_MPC1211 is not set | ||
105 | # CONFIG_SH_SH03 is not set | ||
106 | # CONFIG_SH_SECUREEDGE5410 is not set | ||
107 | # CONFIG_SH_HS7751RVOIP is not set | ||
108 | CONFIG_SH_7710VOIPGW=y | ||
109 | # CONFIG_SH_RTS7751R2D is not set | ||
110 | # CONFIG_SH_R7780RP is not set | ||
111 | # CONFIG_SH_EDOSK7705 is not set | ||
112 | # CONFIG_SH_SH4202_MICRODEV is not set | ||
113 | # CONFIG_SH_LANDISK is not set | ||
114 | # CONFIG_SH_TITAN is not set | ||
115 | # CONFIG_SH_SHMIN is not set | ||
116 | # CONFIG_SH_UNKNOWN is not set | ||
117 | |||
118 | # | ||
119 | # Processor selection | ||
120 | # | ||
121 | CONFIG_CPU_SH3=y | 116 | CONFIG_CPU_SH3=y |
122 | 117 | # CONFIG_CPU_SUBTYPE_SH7619 is not set | |
123 | # | 118 | # CONFIG_CPU_SUBTYPE_SH7203 is not set |
124 | # SH-2 Processor Support | 119 | # CONFIG_CPU_SUBTYPE_SH7206 is not set |
125 | # | 120 | # CONFIG_CPU_SUBTYPE_SH7263 is not set |
126 | # CONFIG_CPU_SUBTYPE_SH7604 is not set | ||
127 | |||
128 | # | ||
129 | # SH-3 Processor Support | ||
130 | # | ||
131 | # CONFIG_CPU_SUBTYPE_SH7300 is not set | ||
132 | # CONFIG_CPU_SUBTYPE_SH7705 is not set | 121 | # CONFIG_CPU_SUBTYPE_SH7705 is not set |
133 | # CONFIG_CPU_SUBTYPE_SH7706 is not set | 122 | # CONFIG_CPU_SUBTYPE_SH7706 is not set |
134 | # CONFIG_CPU_SUBTYPE_SH7707 is not set | 123 | # CONFIG_CPU_SUBTYPE_SH7707 is not set |
135 | # CONFIG_CPU_SUBTYPE_SH7708 is not set | 124 | # CONFIG_CPU_SUBTYPE_SH7708 is not set |
136 | # CONFIG_CPU_SUBTYPE_SH7709 is not set | 125 | # CONFIG_CPU_SUBTYPE_SH7709 is not set |
137 | CONFIG_CPU_SUBTYPE_SH7710=y | 126 | CONFIG_CPU_SUBTYPE_SH7710=y |
138 | 127 | # CONFIG_CPU_SUBTYPE_SH7712 is not set | |
139 | # | 128 | # CONFIG_CPU_SUBTYPE_SH7720 is not set |
140 | # SH-4 Processor Support | 129 | # CONFIG_CPU_SUBTYPE_SH7721 is not set |
141 | # | ||
142 | # CONFIG_CPU_SUBTYPE_SH7750 is not set | 130 | # CONFIG_CPU_SUBTYPE_SH7750 is not set |
143 | # CONFIG_CPU_SUBTYPE_SH7091 is not set | 131 | # CONFIG_CPU_SUBTYPE_SH7091 is not set |
144 | # CONFIG_CPU_SUBTYPE_SH7750R is not set | 132 | # CONFIG_CPU_SUBTYPE_SH7750R is not set |
@@ -147,65 +135,84 @@ CONFIG_CPU_SUBTYPE_SH7710=y | |||
147 | # CONFIG_CPU_SUBTYPE_SH7751R is not set | 135 | # CONFIG_CPU_SUBTYPE_SH7751R is not set |
148 | # CONFIG_CPU_SUBTYPE_SH7760 is not set | 136 | # CONFIG_CPU_SUBTYPE_SH7760 is not set |
149 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set | 137 | # CONFIG_CPU_SUBTYPE_SH4_202 is not set |
150 | 138 | # CONFIG_CPU_SUBTYPE_SH7763 is not set | |
151 | # | ||
152 | # ST40 Processor Support | ||
153 | # | ||
154 | # CONFIG_CPU_SUBTYPE_ST40STB1 is not set | ||
155 | # CONFIG_CPU_SUBTYPE_ST40GX1 is not set | ||
156 | |||
157 | # | ||
158 | # SH-4A Processor Support | ||
159 | # | ||
160 | # CONFIG_CPU_SUBTYPE_SH7770 is not set | 139 | # CONFIG_CPU_SUBTYPE_SH7770 is not set |
161 | # CONFIG_CPU_SUBTYPE_SH7780 is not set | 140 | # CONFIG_CPU_SUBTYPE_SH7780 is not set |
162 | 141 | # CONFIG_CPU_SUBTYPE_SH7785 is not set | |
163 | # | 142 | # CONFIG_CPU_SUBTYPE_SHX3 is not set |
164 | # SH4AL-DSP Processor Support | ||
165 | # | ||
166 | # CONFIG_CPU_SUBTYPE_SH73180 is not set | ||
167 | # CONFIG_CPU_SUBTYPE_SH7343 is not set | 143 | # CONFIG_CPU_SUBTYPE_SH7343 is not set |
144 | # CONFIG_CPU_SUBTYPE_SH7722 is not set | ||
145 | # CONFIG_CPU_SUBTYPE_SH7366 is not set | ||
146 | # CONFIG_CPU_SUBTYPE_SH5_101 is not set | ||
147 | # CONFIG_CPU_SUBTYPE_SH5_103 is not set | ||
168 | 148 | ||
169 | # | 149 | # |
170 | # Memory management options | 150 | # Memory management options |
171 | # | 151 | # |
152 | CONFIG_QUICKLIST=y | ||
172 | CONFIG_MMU=y | 153 | CONFIG_MMU=y |
173 | CONFIG_PAGE_OFFSET=0x80000000 | 154 | CONFIG_PAGE_OFFSET=0x80000000 |
174 | CONFIG_MEMORY_START=0x0c000000 | 155 | CONFIG_MEMORY_START=0x0c000000 |
175 | CONFIG_MEMORY_SIZE=0x00800000 | 156 | CONFIG_MEMORY_SIZE=0x00800000 |
157 | CONFIG_29BIT=y | ||
176 | CONFIG_VSYSCALL=y | 158 | CONFIG_VSYSCALL=y |
159 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
160 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
161 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | ||
162 | CONFIG_MAX_ACTIVE_REGIONS=1 | ||
163 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
164 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
165 | CONFIG_PAGE_SIZE_4KB=y | ||
166 | # CONFIG_PAGE_SIZE_8KB is not set | ||
167 | # CONFIG_PAGE_SIZE_64KB is not set | ||
177 | CONFIG_SELECT_MEMORY_MODEL=y | 168 | CONFIG_SELECT_MEMORY_MODEL=y |
178 | CONFIG_FLATMEM_MANUAL=y | 169 | CONFIG_FLATMEM_MANUAL=y |
179 | # CONFIG_DISCONTIGMEM_MANUAL is not set | 170 | # CONFIG_DISCONTIGMEM_MANUAL is not set |
180 | # CONFIG_SPARSEMEM_MANUAL is not set | 171 | # CONFIG_SPARSEMEM_MANUAL is not set |
181 | CONFIG_FLATMEM=y | 172 | CONFIG_FLATMEM=y |
182 | CONFIG_FLAT_NODE_MEM_MAP=y | 173 | CONFIG_FLAT_NODE_MEM_MAP=y |
183 | # CONFIG_SPARSEMEM_STATIC is not set | 174 | CONFIG_SPARSEMEM_STATIC=y |
175 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
184 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 176 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
185 | # CONFIG_RESOURCES_64BIT is not set | 177 | # CONFIG_RESOURCES_64BIT is not set |
178 | CONFIG_ZONE_DMA_FLAG=0 | ||
179 | CONFIG_NR_QUICK=2 | ||
186 | 180 | ||
187 | # | 181 | # |
188 | # Cache configuration | 182 | # Cache configuration |
189 | # | 183 | # |
190 | # CONFIG_SH_DIRECT_MAPPED is not set | 184 | # CONFIG_SH_DIRECT_MAPPED is not set |
191 | # CONFIG_SH_WRITETHROUGH is not set | 185 | CONFIG_CACHE_WRITEBACK=y |
192 | # CONFIG_SH_OCRAM is not set | 186 | # CONFIG_CACHE_WRITETHROUGH is not set |
187 | # CONFIG_CACHE_OFF is not set | ||
193 | 188 | ||
194 | # | 189 | # |
195 | # Processor features | 190 | # Processor features |
196 | # | 191 | # |
197 | CONFIG_CPU_LITTLE_ENDIAN=y | 192 | CONFIG_CPU_LITTLE_ENDIAN=y |
193 | # CONFIG_CPU_BIG_ENDIAN is not set | ||
198 | # CONFIG_SH_FPU_EMU is not set | 194 | # CONFIG_SH_FPU_EMU is not set |
199 | CONFIG_SH_DSP=y | 195 | CONFIG_SH_DSP=y |
200 | # CONFIG_SH_ADC is not set | 196 | # CONFIG_SH_ADC is not set |
201 | CONFIG_CPU_HAS_INTEVT=y | 197 | CONFIG_CPU_HAS_INTEVT=y |
202 | CONFIG_CPU_HAS_SR_RB=y | 198 | CONFIG_CPU_HAS_SR_RB=y |
199 | CONFIG_CPU_HAS_DSP=y | ||
203 | 200 | ||
204 | # | 201 | # |
205 | # Timer support | 202 | # Board support |
203 | # | ||
204 | # CONFIG_SH_SOLUTION_ENGINE is not set | ||
205 | |||
206 | # | ||
207 | # Timer and clock configuration | ||
206 | # | 208 | # |
207 | CONFIG_SH_TMU=y | 209 | CONFIG_SH_TMU=y |
210 | CONFIG_SH_TIMER_IRQ=16 | ||
208 | CONFIG_SH_PCLK_FREQ=32768000 | 211 | CONFIG_SH_PCLK_FREQ=32768000 |
212 | # CONFIG_TICK_ONESHOT is not set | ||
213 | # CONFIG_NO_HZ is not set | ||
214 | # CONFIG_HIGH_RES_TIMERS is not set | ||
215 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
209 | 216 | ||
210 | # | 217 | # |
211 | # CPU Frequency scaling | 218 | # CPU Frequency scaling |
@@ -220,56 +227,51 @@ CONFIG_SH_PCLK_FREQ=32768000 | |||
220 | # | 227 | # |
221 | # Companion Chips | 228 | # Companion Chips |
222 | # | 229 | # |
223 | # CONFIG_HD6446X_SERIES is not set | 230 | |
231 | # | ||
232 | # Additional SuperH Device Drivers | ||
233 | # | ||
234 | # CONFIG_HEARTBEAT is not set | ||
235 | # CONFIG_PUSH_SWITCH is not set | ||
224 | 236 | ||
225 | # | 237 | # |
226 | # Kernel features | 238 | # Kernel features |
227 | # | 239 | # |
228 | # CONFIG_HZ_100 is not set | 240 | # CONFIG_HZ_100 is not set |
229 | CONFIG_HZ_250=y | 241 | CONFIG_HZ_250=y |
242 | # CONFIG_HZ_300 is not set | ||
230 | # CONFIG_HZ_1000 is not set | 243 | # CONFIG_HZ_1000 is not set |
231 | CONFIG_HZ=250 | 244 | CONFIG_HZ=250 |
245 | # CONFIG_SCHED_HRTICK is not set | ||
232 | # CONFIG_KEXEC is not set | 246 | # CONFIG_KEXEC is not set |
233 | # CONFIG_SMP is not set | 247 | # CONFIG_CRASH_DUMP is not set |
234 | CONFIG_PREEMPT_NONE=y | 248 | CONFIG_PREEMPT_NONE=y |
235 | # CONFIG_PREEMPT_VOLUNTARY is not set | 249 | # CONFIG_PREEMPT_VOLUNTARY is not set |
236 | # CONFIG_PREEMPT is not set | 250 | # CONFIG_PREEMPT is not set |
251 | CONFIG_RCU_TRACE=y | ||
252 | CONFIG_GUSA=y | ||
253 | # CONFIG_GUSA_RB is not set | ||
237 | 254 | ||
238 | # | 255 | # |
239 | # Boot options | 256 | # Boot options |
240 | # | 257 | # |
241 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | 258 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 |
242 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | 259 | CONFIG_BOOT_LINK_OFFSET=0x00800000 |
243 | # CONFIG_UBC_WAKEUP is not set | ||
244 | # CONFIG_CMDLINE_BOOL is not set | 260 | # CONFIG_CMDLINE_BOOL is not set |
245 | 261 | ||
246 | # | 262 | # |
247 | # Bus options | 263 | # Bus options |
248 | # | 264 | # |
249 | # CONFIG_PCI is not set | 265 | # CONFIG_ARCH_SUPPORTS_MSI is not set |
250 | |||
251 | # | ||
252 | # PCCARD (PCMCIA/CardBus) support | ||
253 | # | ||
254 | # CONFIG_PCCARD is not set | 266 | # CONFIG_PCCARD is not set |
255 | 267 | ||
256 | # | 268 | # |
257 | # PCI Hotplug Support | ||
258 | # | ||
259 | |||
260 | # | ||
261 | # Executable file formats | 269 | # Executable file formats |
262 | # | 270 | # |
263 | CONFIG_BINFMT_ELF=y | 271 | CONFIG_BINFMT_ELF=y |
264 | # CONFIG_BINFMT_FLAT is not set | ||
265 | # CONFIG_BINFMT_MISC is not set | 272 | # CONFIG_BINFMT_MISC is not set |
266 | 273 | ||
267 | # | 274 | # |
268 | # Power management options (EXPERIMENTAL) | ||
269 | # | ||
270 | # CONFIG_PM is not set | ||
271 | |||
272 | # | ||
273 | # Networking | 275 | # Networking |
274 | # | 276 | # |
275 | CONFIG_NET=y | 277 | CONFIG_NET=y |
@@ -277,13 +279,14 @@ CONFIG_NET=y | |||
277 | # | 279 | # |
278 | # Networking options | 280 | # Networking options |
279 | # | 281 | # |
280 | # CONFIG_NETDEBUG is not set | ||
281 | CONFIG_PACKET=y | 282 | CONFIG_PACKET=y |
282 | # CONFIG_PACKET_MMAP is not set | 283 | # CONFIG_PACKET_MMAP is not set |
283 | CONFIG_UNIX=y | 284 | CONFIG_UNIX=y |
284 | CONFIG_XFRM=y | 285 | CONFIG_XFRM=y |
285 | # CONFIG_XFRM_USER is not set | 286 | # CONFIG_XFRM_USER is not set |
286 | # CONFIG_XFRM_SUB_POLICY is not set | 287 | # CONFIG_XFRM_SUB_POLICY is not set |
288 | # CONFIG_XFRM_MIGRATE is not set | ||
289 | # CONFIG_XFRM_STATISTICS is not set | ||
287 | # CONFIG_NET_KEY is not set | 290 | # CONFIG_NET_KEY is not set |
288 | CONFIG_INET=y | 291 | CONFIG_INET=y |
289 | # CONFIG_IP_MULTICAST is not set | 292 | # CONFIG_IP_MULTICAST is not set |
@@ -301,14 +304,13 @@ CONFIG_SYN_COOKIES=y | |||
301 | # CONFIG_INET_TUNNEL is not set | 304 | # CONFIG_INET_TUNNEL is not set |
302 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | 305 | CONFIG_INET_XFRM_MODE_TRANSPORT=y |
303 | CONFIG_INET_XFRM_MODE_TUNNEL=y | 306 | CONFIG_INET_XFRM_MODE_TUNNEL=y |
307 | CONFIG_INET_XFRM_MODE_BEET=y | ||
308 | # CONFIG_INET_LRO is not set | ||
304 | # CONFIG_INET_DIAG is not set | 309 | # CONFIG_INET_DIAG is not set |
305 | # CONFIG_TCP_CONG_ADVANCED is not set | 310 | # CONFIG_TCP_CONG_ADVANCED is not set |
306 | CONFIG_TCP_CONG_CUBIC=y | 311 | CONFIG_TCP_CONG_CUBIC=y |
307 | CONFIG_DEFAULT_TCP_CONG="cubic" | 312 | CONFIG_DEFAULT_TCP_CONG="cubic" |
308 | 313 | # CONFIG_TCP_MD5SIG is not set | |
309 | # | ||
310 | # IP: Virtual Server Configuration | ||
311 | # | ||
312 | # CONFIG_IP_VS is not set | 314 | # CONFIG_IP_VS is not set |
313 | # CONFIG_IPV6 is not set | 315 | # CONFIG_IPV6 is not set |
314 | # CONFIG_INET6_XFRM_TUNNEL is not set | 316 | # CONFIG_INET6_XFRM_TUNNEL is not set |
@@ -316,44 +318,24 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
316 | # CONFIG_NETWORK_SECMARK is not set | 318 | # CONFIG_NETWORK_SECMARK is not set |
317 | CONFIG_NETFILTER=y | 319 | CONFIG_NETFILTER=y |
318 | # CONFIG_NETFILTER_DEBUG is not set | 320 | # CONFIG_NETFILTER_DEBUG is not set |
321 | CONFIG_NETFILTER_ADVANCED=y | ||
319 | 322 | ||
320 | # | 323 | # |
321 | # Core Netfilter Configuration | 324 | # Core Netfilter Configuration |
322 | # | 325 | # |
323 | # CONFIG_NETFILTER_NETLINK is not set | 326 | # CONFIG_NETFILTER_NETLINK_QUEUE is not set |
327 | # CONFIG_NETFILTER_NETLINK_LOG is not set | ||
328 | # CONFIG_NF_CONNTRACK is not set | ||
324 | # CONFIG_NETFILTER_XTABLES is not set | 329 | # CONFIG_NETFILTER_XTABLES is not set |
325 | 330 | ||
326 | # | 331 | # |
327 | # IP: Netfilter Configuration | 332 | # IP: Netfilter Configuration |
328 | # | 333 | # |
329 | CONFIG_IP_NF_CONNTRACK=y | ||
330 | # CONFIG_IP_NF_CT_ACCT is not set | ||
331 | # CONFIG_IP_NF_CONNTRACK_MARK is not set | ||
332 | # CONFIG_IP_NF_CONNTRACK_EVENTS is not set | ||
333 | # CONFIG_IP_NF_CT_PROTO_SCTP is not set | ||
334 | CONFIG_IP_NF_FTP=m | ||
335 | # CONFIG_IP_NF_IRC is not set | ||
336 | # CONFIG_IP_NF_NETBIOS_NS is not set | ||
337 | # CONFIG_IP_NF_TFTP is not set | ||
338 | # CONFIG_IP_NF_AMANDA is not set | ||
339 | CONFIG_IP_NF_PPTP=m | ||
340 | # CONFIG_IP_NF_H323 is not set | ||
341 | # CONFIG_IP_NF_SIP is not set | ||
342 | # CONFIG_IP_NF_QUEUE is not set | 334 | # CONFIG_IP_NF_QUEUE is not set |
343 | 335 | # CONFIG_IP_NF_IPTABLES is not set | |
344 | # | 336 | # CONFIG_IP_NF_ARPTABLES is not set |
345 | # DCCP Configuration (EXPERIMENTAL) | ||
346 | # | ||
347 | # CONFIG_IP_DCCP is not set | 337 | # CONFIG_IP_DCCP is not set |
348 | |||
349 | # | ||
350 | # SCTP Configuration (EXPERIMENTAL) | ||
351 | # | ||
352 | # CONFIG_IP_SCTP is not set | 338 | # CONFIG_IP_SCTP is not set |
353 | |||
354 | # | ||
355 | # TIPC Configuration (EXPERIMENTAL) | ||
356 | # | ||
357 | # CONFIG_TIPC is not set | 339 | # CONFIG_TIPC is not set |
358 | # CONFIG_ATM is not set | 340 | # CONFIG_ATM is not set |
359 | # CONFIG_BRIDGE is not set | 341 | # CONFIG_BRIDGE is not set |
@@ -366,14 +348,7 @@ CONFIG_IP_NF_PPTP=m | |||
366 | # CONFIG_LAPB is not set | 348 | # CONFIG_LAPB is not set |
367 | # CONFIG_ECONET is not set | 349 | # CONFIG_ECONET is not set |
368 | # CONFIG_WAN_ROUTER is not set | 350 | # CONFIG_WAN_ROUTER is not set |
369 | |||
370 | # | ||
371 | # QoS and/or fair queueing | ||
372 | # | ||
373 | CONFIG_NET_SCHED=y | 351 | CONFIG_NET_SCHED=y |
374 | CONFIG_NET_SCH_CLK_JIFFIES=y | ||
375 | # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set | ||
376 | # CONFIG_NET_SCH_CLK_CPU is not set | ||
377 | 352 | ||
378 | # | 353 | # |
379 | # Queueing/Scheduling | 354 | # Queueing/Scheduling |
@@ -382,6 +357,7 @@ CONFIG_NET_SCH_CBQ=y | |||
382 | # CONFIG_NET_SCH_HTB is not set | 357 | # CONFIG_NET_SCH_HTB is not set |
383 | # CONFIG_NET_SCH_HFSC is not set | 358 | # CONFIG_NET_SCH_HFSC is not set |
384 | # CONFIG_NET_SCH_PRIO is not set | 359 | # CONFIG_NET_SCH_PRIO is not set |
360 | # CONFIG_NET_SCH_RR is not set | ||
385 | # CONFIG_NET_SCH_RED is not set | 361 | # CONFIG_NET_SCH_RED is not set |
386 | # CONFIG_NET_SCH_SFQ is not set | 362 | # CONFIG_NET_SCH_SFQ is not set |
387 | # CONFIG_NET_SCH_TEQL is not set | 363 | # CONFIG_NET_SCH_TEQL is not set |
@@ -389,7 +365,6 @@ CONFIG_NET_SCH_CBQ=y | |||
389 | # CONFIG_NET_SCH_GRED is not set | 365 | # CONFIG_NET_SCH_GRED is not set |
390 | # CONFIG_NET_SCH_DSMARK is not set | 366 | # CONFIG_NET_SCH_DSMARK is not set |
391 | # CONFIG_NET_SCH_NETEM is not set | 367 | # CONFIG_NET_SCH_NETEM is not set |
392 | CONFIG_NET_SCH_INGRESS=y | ||
393 | 368 | ||
394 | # | 369 | # |
395 | # Classification | 370 | # Classification |
@@ -405,20 +380,31 @@ CONFIG_NET_CLS_U32=y | |||
405 | # CONFIG_CLS_U32_MARK is not set | 380 | # CONFIG_CLS_U32_MARK is not set |
406 | # CONFIG_NET_CLS_RSVP is not set | 381 | # CONFIG_NET_CLS_RSVP is not set |
407 | # CONFIG_NET_CLS_RSVP6 is not set | 382 | # CONFIG_NET_CLS_RSVP6 is not set |
383 | # CONFIG_NET_CLS_FLOW is not set | ||
408 | # CONFIG_NET_EMATCH is not set | 384 | # CONFIG_NET_EMATCH is not set |
409 | # CONFIG_NET_CLS_ACT is not set | 385 | # CONFIG_NET_CLS_ACT is not set |
410 | CONFIG_NET_CLS_POLICE=y | ||
411 | # CONFIG_NET_CLS_IND is not set | 386 | # CONFIG_NET_CLS_IND is not set |
412 | CONFIG_NET_ESTIMATOR=y | 387 | CONFIG_NET_SCH_FIFO=y |
413 | 388 | ||
414 | # | 389 | # |
415 | # Network testing | 390 | # Network testing |
416 | # | 391 | # |
417 | # CONFIG_NET_PKTGEN is not set | 392 | # CONFIG_NET_PKTGEN is not set |
418 | # CONFIG_HAMRADIO is not set | 393 | # CONFIG_HAMRADIO is not set |
394 | # CONFIG_CAN is not set | ||
419 | # CONFIG_IRDA is not set | 395 | # CONFIG_IRDA is not set |
420 | # CONFIG_BT is not set | 396 | # CONFIG_BT is not set |
397 | # CONFIG_AF_RXRPC is not set | ||
398 | |||
399 | # | ||
400 | # Wireless | ||
401 | # | ||
402 | # CONFIG_CFG80211 is not set | ||
403 | # CONFIG_WIRELESS_EXT is not set | ||
404 | # CONFIG_MAC80211 is not set | ||
421 | # CONFIG_IEEE80211 is not set | 405 | # CONFIG_IEEE80211 is not set |
406 | # CONFIG_RFKILL is not set | ||
407 | # CONFIG_NET_9P is not set | ||
422 | 408 | ||
423 | # | 409 | # |
424 | # Device Drivers | 410 | # Device Drivers |
@@ -427,19 +413,12 @@ CONFIG_NET_ESTIMATOR=y | |||
427 | # | 413 | # |
428 | # Generic Driver Options | 414 | # Generic Driver Options |
429 | # | 415 | # |
416 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
430 | CONFIG_STANDALONE=y | 417 | CONFIG_STANDALONE=y |
431 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 418 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
432 | CONFIG_FW_LOADER=y | 419 | CONFIG_FW_LOADER=y |
433 | # CONFIG_SYS_HYPERVISOR is not set | 420 | # CONFIG_SYS_HYPERVISOR is not set |
434 | |||
435 | # | ||
436 | # Connector - unified userspace <-> kernelspace linker | ||
437 | # | ||
438 | # CONFIG_CONNECTOR is not set | 421 | # CONFIG_CONNECTOR is not set |
439 | |||
440 | # | ||
441 | # Memory Technology Devices (MTD) | ||
442 | # | ||
443 | CONFIG_MTD=y | 422 | CONFIG_MTD=y |
444 | # CONFIG_MTD_DEBUG is not set | 423 | # CONFIG_MTD_DEBUG is not set |
445 | # CONFIG_MTD_CONCAT is not set | 424 | # CONFIG_MTD_CONCAT is not set |
@@ -451,12 +430,14 @@ CONFIG_MTD_PARTITIONS=y | |||
451 | # User Modules And Translation Layers | 430 | # User Modules And Translation Layers |
452 | # | 431 | # |
453 | CONFIG_MTD_CHAR=y | 432 | CONFIG_MTD_CHAR=y |
433 | CONFIG_MTD_BLKDEVS=y | ||
454 | CONFIG_MTD_BLOCK=y | 434 | CONFIG_MTD_BLOCK=y |
455 | # CONFIG_FTL is not set | 435 | # CONFIG_FTL is not set |
456 | # CONFIG_NFTL is not set | 436 | # CONFIG_NFTL is not set |
457 | # CONFIG_INFTL is not set | 437 | # CONFIG_INFTL is not set |
458 | # CONFIG_RFD_FTL is not set | 438 | # CONFIG_RFD_FTL is not set |
459 | # CONFIG_SSFDC is not set | 439 | # CONFIG_SSFDC is not set |
440 | # CONFIG_MTD_OOPS is not set | ||
460 | 441 | ||
461 | # | 442 | # |
462 | # RAM/ROM/Flash chip drivers | 443 | # RAM/ROM/Flash chip drivers |
@@ -482,7 +463,6 @@ CONFIG_MTD_CFI_UTIL=y | |||
482 | CONFIG_MTD_RAM=y | 463 | CONFIG_MTD_RAM=y |
483 | # CONFIG_MTD_ROM is not set | 464 | # CONFIG_MTD_ROM is not set |
484 | # CONFIG_MTD_ABSENT is not set | 465 | # CONFIG_MTD_ABSENT is not set |
485 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
486 | 466 | ||
487 | # | 467 | # |
488 | # Mapping drivers for chip access | 468 | # Mapping drivers for chip access |
@@ -505,40 +485,25 @@ CONFIG_MTD_RAM=y | |||
505 | # CONFIG_MTD_DOC2000 is not set | 485 | # CONFIG_MTD_DOC2000 is not set |
506 | # CONFIG_MTD_DOC2001 is not set | 486 | # CONFIG_MTD_DOC2001 is not set |
507 | # CONFIG_MTD_DOC2001PLUS is not set | 487 | # CONFIG_MTD_DOC2001PLUS is not set |
508 | |||
509 | # | ||
510 | # NAND Flash Device Drivers | ||
511 | # | ||
512 | # CONFIG_MTD_NAND is not set | 488 | # CONFIG_MTD_NAND is not set |
513 | |||
514 | # | ||
515 | # OneNAND Flash Device Drivers | ||
516 | # | ||
517 | # CONFIG_MTD_ONENAND is not set | 489 | # CONFIG_MTD_ONENAND is not set |
518 | 490 | ||
519 | # | 491 | # |
520 | # Parallel port support | 492 | # UBI - Unsorted block images |
521 | # | 493 | # |
494 | # CONFIG_MTD_UBI is not set | ||
522 | # CONFIG_PARPORT is not set | 495 | # CONFIG_PARPORT is not set |
523 | 496 | CONFIG_BLK_DEV=y | |
524 | # | ||
525 | # Plug and Play support | ||
526 | # | ||
527 | |||
528 | # | ||
529 | # Block devices | ||
530 | # | ||
531 | # CONFIG_BLK_DEV_COW_COMMON is not set | 497 | # CONFIG_BLK_DEV_COW_COMMON is not set |
532 | # CONFIG_BLK_DEV_LOOP is not set | 498 | # CONFIG_BLK_DEV_LOOP is not set |
533 | # CONFIG_BLK_DEV_NBD is not set | 499 | # CONFIG_BLK_DEV_NBD is not set |
534 | # CONFIG_BLK_DEV_RAM is not set | 500 | # CONFIG_BLK_DEV_RAM is not set |
535 | # CONFIG_BLK_DEV_INITRD is not set | ||
536 | # CONFIG_CDROM_PKTCDVD is not set | 501 | # CONFIG_CDROM_PKTCDVD is not set |
537 | # CONFIG_ATA_OVER_ETH is not set | 502 | # CONFIG_ATA_OVER_ETH is not set |
538 | 503 | CONFIG_MISC_DEVICES=y | |
539 | # | 504 | # CONFIG_EEPROM_93CX6 is not set |
540 | # ATA/ATAPI/MFM/RLL support | 505 | # CONFIG_ENCLOSURE_SERVICES is not set |
541 | # | 506 | CONFIG_HAVE_IDE=y |
542 | # CONFIG_IDE is not set | 507 | # CONFIG_IDE is not set |
543 | 508 | ||
544 | # | 509 | # |
@@ -546,104 +511,59 @@ CONFIG_MTD_RAM=y | |||
546 | # | 511 | # |
547 | # CONFIG_RAID_ATTRS is not set | 512 | # CONFIG_RAID_ATTRS is not set |
548 | # CONFIG_SCSI is not set | 513 | # CONFIG_SCSI is not set |
514 | # CONFIG_SCSI_DMA is not set | ||
549 | # CONFIG_SCSI_NETLINK is not set | 515 | # CONFIG_SCSI_NETLINK is not set |
550 | |||
551 | # | ||
552 | # Serial ATA (prod) and Parallel ATA (experimental) drivers | ||
553 | # | ||
554 | # CONFIG_ATA is not set | 516 | # CONFIG_ATA is not set |
555 | |||
556 | # | ||
557 | # Multi-device support (RAID and LVM) | ||
558 | # | ||
559 | # CONFIG_MD is not set | 517 | # CONFIG_MD is not set |
560 | |||
561 | # | ||
562 | # Fusion MPT device support | ||
563 | # | ||
564 | # CONFIG_FUSION is not set | ||
565 | |||
566 | # | ||
567 | # IEEE 1394 (FireWire) support | ||
568 | # | ||
569 | |||
570 | # | ||
571 | # I2O device support | ||
572 | # | ||
573 | |||
574 | # | ||
575 | # Network device support | ||
576 | # | ||
577 | CONFIG_NETDEVICES=y | 518 | CONFIG_NETDEVICES=y |
519 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
578 | # CONFIG_DUMMY is not set | 520 | # CONFIG_DUMMY is not set |
579 | # CONFIG_BONDING is not set | 521 | # CONFIG_BONDING is not set |
522 | # CONFIG_MACVLAN is not set | ||
580 | # CONFIG_EQUALIZER is not set | 523 | # CONFIG_EQUALIZER is not set |
581 | # CONFIG_TUN is not set | 524 | # CONFIG_TUN is not set |
582 | 525 | # CONFIG_VETH is not set | |
583 | # | ||
584 | # PHY device support | ||
585 | # | ||
586 | # CONFIG_PHYLIB is not set | 526 | # CONFIG_PHYLIB is not set |
587 | |||
588 | # | ||
589 | # Ethernet (10 or 100Mbit) | ||
590 | # | ||
591 | CONFIG_NET_ETHERNET=y | 527 | CONFIG_NET_ETHERNET=y |
592 | # CONFIG_MII is not set | 528 | # CONFIG_MII is not set |
529 | # CONFIG_AX88796 is not set | ||
593 | # CONFIG_STNIC is not set | 530 | # CONFIG_STNIC is not set |
594 | # CONFIG_SMC91X is not set | 531 | # CONFIG_SMC91X is not set |
532 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
533 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
534 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
535 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
536 | # CONFIG_B44 is not set | ||
537 | CONFIG_NETDEV_1000=y | ||
538 | # CONFIG_E1000E_ENABLED is not set | ||
539 | CONFIG_NETDEV_10000=y | ||
595 | 540 | ||
596 | # | 541 | # |
597 | # Ethernet (1000 Mbit) | 542 | # Wireless LAN |
598 | # | ||
599 | |||
600 | # | ||
601 | # Ethernet (10000 Mbit) | ||
602 | # | ||
603 | |||
604 | # | ||
605 | # Token Ring devices | ||
606 | # | ||
607 | |||
608 | # | ||
609 | # Wireless LAN (non-hamradio) | ||
610 | # | ||
611 | # CONFIG_NET_RADIO is not set | ||
612 | |||
613 | # | ||
614 | # Wan interfaces | ||
615 | # | 543 | # |
544 | # CONFIG_WLAN_PRE80211 is not set | ||
545 | # CONFIG_WLAN_80211 is not set | ||
616 | # CONFIG_WAN is not set | 546 | # CONFIG_WAN is not set |
617 | # CONFIG_PPP is not set | 547 | # CONFIG_PPP is not set |
618 | # CONFIG_SLIP is not set | 548 | # CONFIG_SLIP is not set |
619 | # CONFIG_SHAPER is not set | ||
620 | # CONFIG_NETCONSOLE is not set | 549 | # CONFIG_NETCONSOLE is not set |
621 | # CONFIG_NETPOLL is not set | 550 | # CONFIG_NETPOLL is not set |
622 | # CONFIG_NET_POLL_CONTROLLER is not set | 551 | # CONFIG_NET_POLL_CONTROLLER is not set |
623 | |||
624 | # | ||
625 | # ISDN subsystem | ||
626 | # | ||
627 | # CONFIG_ISDN is not set | 552 | # CONFIG_ISDN is not set |
628 | |||
629 | # | ||
630 | # Telephony Support | ||
631 | # | ||
632 | CONFIG_PHONE=y | 553 | CONFIG_PHONE=y |
633 | # CONFIG_PHONE_IXJ is not set | ||
634 | 554 | ||
635 | # | 555 | # |
636 | # Input device support | 556 | # Input device support |
637 | # | 557 | # |
638 | CONFIG_INPUT=y | 558 | CONFIG_INPUT=y |
639 | # CONFIG_INPUT_FF_MEMLESS is not set | 559 | # CONFIG_INPUT_FF_MEMLESS is not set |
560 | # CONFIG_INPUT_POLLDEV is not set | ||
640 | 561 | ||
641 | # | 562 | # |
642 | # Userland interfaces | 563 | # Userland interfaces |
643 | # | 564 | # |
644 | # CONFIG_INPUT_MOUSEDEV is not set | 565 | # CONFIG_INPUT_MOUSEDEV is not set |
645 | # CONFIG_INPUT_JOYDEV is not set | 566 | # CONFIG_INPUT_JOYDEV is not set |
646 | # CONFIG_INPUT_TSDEV is not set | ||
647 | # CONFIG_INPUT_EVDEV is not set | 567 | # CONFIG_INPUT_EVDEV is not set |
648 | # CONFIG_INPUT_EVBUG is not set | 568 | # CONFIG_INPUT_EVBUG is not set |
649 | 569 | ||
@@ -653,6 +573,7 @@ CONFIG_INPUT=y | |||
653 | # CONFIG_INPUT_KEYBOARD is not set | 573 | # CONFIG_INPUT_KEYBOARD is not set |
654 | # CONFIG_INPUT_MOUSE is not set | 574 | # CONFIG_INPUT_MOUSE is not set |
655 | # CONFIG_INPUT_JOYSTICK is not set | 575 | # CONFIG_INPUT_JOYSTICK is not set |
576 | # CONFIG_INPUT_TABLET is not set | ||
656 | # CONFIG_INPUT_TOUCHSCREEN is not set | 577 | # CONFIG_INPUT_TOUCHSCREEN is not set |
657 | # CONFIG_INPUT_MISC is not set | 578 | # CONFIG_INPUT_MISC is not set |
658 | 579 | ||
@@ -684,35 +605,11 @@ CONFIG_SERIAL_CORE_CONSOLE=y | |||
684 | # CONFIG_UNIX98_PTYS is not set | 605 | # CONFIG_UNIX98_PTYS is not set |
685 | CONFIG_LEGACY_PTYS=y | 606 | CONFIG_LEGACY_PTYS=y |
686 | CONFIG_LEGACY_PTY_COUNT=256 | 607 | CONFIG_LEGACY_PTY_COUNT=256 |
687 | |||
688 | # | ||
689 | # IPMI | ||
690 | # | ||
691 | # CONFIG_IPMI_HANDLER is not set | 608 | # CONFIG_IPMI_HANDLER is not set |
692 | |||
693 | # | ||
694 | # Watchdog Cards | ||
695 | # | ||
696 | # CONFIG_WATCHDOG is not set | ||
697 | CONFIG_HW_RANDOM=y | 609 | CONFIG_HW_RANDOM=y |
698 | # CONFIG_GEN_RTC is not set | ||
699 | # CONFIG_DTLK is not set | ||
700 | # CONFIG_R3964 is not set | 610 | # CONFIG_R3964 is not set |
701 | |||
702 | # | ||
703 | # Ftape, the floppy tape device driver | ||
704 | # | ||
705 | # CONFIG_RAW_DRIVER is not set | 611 | # CONFIG_RAW_DRIVER is not set |
706 | |||
707 | # | ||
708 | # TPM devices | ||
709 | # | ||
710 | # CONFIG_TCG_TPM is not set | 612 | # CONFIG_TCG_TPM is not set |
711 | # CONFIG_TELCLOCK is not set | ||
712 | |||
713 | # | ||
714 | # I2C support | ||
715 | # | ||
716 | # CONFIG_I2C is not set | 613 | # CONFIG_I2C is not set |
717 | 614 | ||
718 | # | 615 | # |
@@ -720,119 +617,86 @@ CONFIG_HW_RANDOM=y | |||
720 | # | 617 | # |
721 | # CONFIG_SPI is not set | 618 | # CONFIG_SPI is not set |
722 | # CONFIG_SPI_MASTER is not set | 619 | # CONFIG_SPI_MASTER is not set |
620 | # CONFIG_W1 is not set | ||
621 | # CONFIG_POWER_SUPPLY is not set | ||
622 | # CONFIG_HWMON is not set | ||
623 | CONFIG_THERMAL=y | ||
624 | # CONFIG_WATCHDOG is not set | ||
723 | 625 | ||
724 | # | 626 | # |
725 | # Dallas's 1-wire bus | 627 | # Sonics Silicon Backplane |
726 | # | ||
727 | |||
728 | # | ||
729 | # Hardware Monitoring support | ||
730 | # | 628 | # |
731 | # CONFIG_HWMON is not set | 629 | CONFIG_SSB_POSSIBLE=y |
732 | # CONFIG_HWMON_VID is not set | 630 | # CONFIG_SSB is not set |
733 | 631 | ||
734 | # | 632 | # |
735 | # Misc devices | 633 | # Multifunction device drivers |
736 | # | 634 | # |
635 | # CONFIG_MFD_SM501 is not set | ||
737 | 636 | ||
738 | # | 637 | # |
739 | # Multimedia devices | 638 | # Multimedia devices |
740 | # | 639 | # |
741 | # CONFIG_VIDEO_DEV is not set | 640 | # CONFIG_VIDEO_DEV is not set |
742 | CONFIG_VIDEO_V4L2=y | 641 | # CONFIG_DVB_CORE is not set |
743 | 642 | # CONFIG_DAB is not set | |
744 | # | ||
745 | # Digital Video Broadcasting Devices | ||
746 | # | ||
747 | # CONFIG_DVB is not set | ||
748 | 643 | ||
749 | # | 644 | # |
750 | # Graphics support | 645 | # Graphics support |
751 | # | 646 | # |
752 | CONFIG_FIRMWARE_EDID=y | 647 | # CONFIG_VGASTATE is not set |
648 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
753 | # CONFIG_FB is not set | 649 | # CONFIG_FB is not set |
754 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 650 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
755 | 651 | ||
756 | # | 652 | # |
757 | # Sound | 653 | # Display device support |
758 | # | 654 | # |
759 | # CONFIG_SOUND is not set | 655 | # CONFIG_DISPLAY_SUPPORT is not set |
760 | 656 | ||
761 | # | 657 | # |
762 | # USB support | 658 | # Sound |
763 | # | 659 | # |
764 | # CONFIG_USB_ARCH_HAS_HCD is not set | 660 | # CONFIG_SOUND is not set |
661 | CONFIG_HID_SUPPORT=y | ||
662 | CONFIG_HID=y | ||
663 | # CONFIG_HID_DEBUG is not set | ||
664 | # CONFIG_HIDRAW is not set | ||
665 | CONFIG_USB_SUPPORT=y | ||
666 | CONFIG_USB_ARCH_HAS_HCD=y | ||
765 | # CONFIG_USB_ARCH_HAS_OHCI is not set | 667 | # CONFIG_USB_ARCH_HAS_OHCI is not set |
766 | # CONFIG_USB_ARCH_HAS_EHCI is not set | 668 | # CONFIG_USB_ARCH_HAS_EHCI is not set |
669 | # CONFIG_USB is not set | ||
767 | 670 | ||
768 | # | 671 | # |
769 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 672 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' |
770 | # | 673 | # |
771 | |||
772 | # | ||
773 | # USB Gadget Support | ||
774 | # | ||
775 | # CONFIG_USB_GADGET is not set | 674 | # CONFIG_USB_GADGET is not set |
776 | |||
777 | # | ||
778 | # MMC/SD Card support | ||
779 | # | ||
780 | # CONFIG_MMC is not set | 675 | # CONFIG_MMC is not set |
781 | 676 | # CONFIG_MEMSTICK is not set | |
782 | # | ||
783 | # LED devices | ||
784 | # | ||
785 | # CONFIG_NEW_LEDS is not set | 677 | # CONFIG_NEW_LEDS is not set |
786 | |||
787 | # | ||
788 | # LED drivers | ||
789 | # | ||
790 | |||
791 | # | ||
792 | # LED Triggers | ||
793 | # | ||
794 | |||
795 | # | ||
796 | # InfiniBand support | ||
797 | # | ||
798 | |||
799 | # | ||
800 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) | ||
801 | # | ||
802 | |||
803 | # | ||
804 | # Real Time Clock | ||
805 | # | ||
806 | # CONFIG_RTC_CLASS is not set | 678 | # CONFIG_RTC_CLASS is not set |
807 | 679 | ||
808 | # | 680 | # |
809 | # DMA Engine support | 681 | # Userspace I/O |
810 | # | ||
811 | # CONFIG_DMA_ENGINE is not set | ||
812 | |||
813 | # | ||
814 | # DMA Clients | ||
815 | # | ||
816 | |||
817 | # | ||
818 | # DMA Devices | ||
819 | # | 682 | # |
683 | # CONFIG_UIO is not set | ||
820 | 684 | ||
821 | # | 685 | # |
822 | # File systems | 686 | # File systems |
823 | # | 687 | # |
824 | # CONFIG_EXT2_FS is not set | 688 | # CONFIG_EXT2_FS is not set |
825 | # CONFIG_EXT3_FS is not set | 689 | # CONFIG_EXT3_FS is not set |
690 | # CONFIG_EXT4DEV_FS is not set | ||
826 | # CONFIG_REISERFS_FS is not set | 691 | # CONFIG_REISERFS_FS is not set |
827 | # CONFIG_JFS_FS is not set | 692 | # CONFIG_JFS_FS is not set |
828 | # CONFIG_FS_POSIX_ACL is not set | 693 | # CONFIG_FS_POSIX_ACL is not set |
829 | # CONFIG_XFS_FS is not set | 694 | # CONFIG_XFS_FS is not set |
695 | # CONFIG_GFS2_FS is not set | ||
830 | # CONFIG_OCFS2_FS is not set | 696 | # CONFIG_OCFS2_FS is not set |
831 | # CONFIG_MINIX_FS is not set | 697 | # CONFIG_DNOTIFY is not set |
832 | # CONFIG_ROMFS_FS is not set | ||
833 | # CONFIG_INOTIFY is not set | 698 | # CONFIG_INOTIFY is not set |
834 | # CONFIG_QUOTA is not set | 699 | # CONFIG_QUOTA is not set |
835 | # CONFIG_DNOTIFY is not set | ||
836 | # CONFIG_AUTOFS_FS is not set | 700 | # CONFIG_AUTOFS_FS is not set |
837 | # CONFIG_AUTOFS4_FS is not set | 701 | # CONFIG_AUTOFS4_FS is not set |
838 | # CONFIG_FUSE_FS is not set | 702 | # CONFIG_FUSE_FS is not set |
@@ -861,7 +725,6 @@ CONFIG_TMPFS=y | |||
861 | # CONFIG_TMPFS_POSIX_ACL is not set | 725 | # CONFIG_TMPFS_POSIX_ACL is not set |
862 | # CONFIG_HUGETLBFS is not set | 726 | # CONFIG_HUGETLBFS is not set |
863 | # CONFIG_HUGETLB_PAGE is not set | 727 | # CONFIG_HUGETLB_PAGE is not set |
864 | CONFIG_RAMFS=y | ||
865 | # CONFIG_CONFIGFS_FS is not set | 728 | # CONFIG_CONFIGFS_FS is not set |
866 | 729 | ||
867 | # | 730 | # |
@@ -874,26 +737,26 @@ CONFIG_RAMFS=y | |||
874 | # CONFIG_BEFS_FS is not set | 737 | # CONFIG_BEFS_FS is not set |
875 | # CONFIG_BFS_FS is not set | 738 | # CONFIG_BFS_FS is not set |
876 | # CONFIG_EFS_FS is not set | 739 | # CONFIG_EFS_FS is not set |
877 | # CONFIG_JFFS_FS is not set | ||
878 | CONFIG_JFFS2_FS=y | 740 | CONFIG_JFFS2_FS=y |
879 | CONFIG_JFFS2_FS_DEBUG=0 | 741 | CONFIG_JFFS2_FS_DEBUG=0 |
880 | CONFIG_JFFS2_FS_WRITEBUFFER=y | 742 | CONFIG_JFFS2_FS_WRITEBUFFER=y |
743 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
881 | # CONFIG_JFFS2_SUMMARY is not set | 744 | # CONFIG_JFFS2_SUMMARY is not set |
882 | # CONFIG_JFFS2_FS_XATTR is not set | 745 | # CONFIG_JFFS2_FS_XATTR is not set |
883 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | 746 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set |
884 | CONFIG_JFFS2_ZLIB=y | 747 | CONFIG_JFFS2_ZLIB=y |
748 | # CONFIG_JFFS2_LZO is not set | ||
885 | CONFIG_JFFS2_RTIME=y | 749 | CONFIG_JFFS2_RTIME=y |
886 | # CONFIG_JFFS2_RUBIN is not set | 750 | # CONFIG_JFFS2_RUBIN is not set |
887 | # CONFIG_CRAMFS is not set | 751 | # CONFIG_CRAMFS is not set |
888 | # CONFIG_VXFS_FS is not set | 752 | # CONFIG_VXFS_FS is not set |
753 | # CONFIG_MINIX_FS is not set | ||
889 | # CONFIG_HPFS_FS is not set | 754 | # CONFIG_HPFS_FS is not set |
890 | # CONFIG_QNX4FS_FS is not set | 755 | # CONFIG_QNX4FS_FS is not set |
756 | # CONFIG_ROMFS_FS is not set | ||
891 | # CONFIG_SYSV_FS is not set | 757 | # CONFIG_SYSV_FS is not set |
892 | # CONFIG_UFS_FS is not set | 758 | # CONFIG_UFS_FS is not set |
893 | 759 | CONFIG_NETWORK_FILESYSTEMS=y | |
894 | # | ||
895 | # Network File Systems | ||
896 | # | ||
897 | # CONFIG_NFS_FS is not set | 760 | # CONFIG_NFS_FS is not set |
898 | # CONFIG_NFSD is not set | 761 | # CONFIG_NFSD is not set |
899 | # CONFIG_SMB_FS is not set | 762 | # CONFIG_SMB_FS is not set |
@@ -901,55 +764,97 @@ CONFIG_JFFS2_RTIME=y | |||
901 | # CONFIG_NCP_FS is not set | 764 | # CONFIG_NCP_FS is not set |
902 | # CONFIG_CODA_FS is not set | 765 | # CONFIG_CODA_FS is not set |
903 | # CONFIG_AFS_FS is not set | 766 | # CONFIG_AFS_FS is not set |
904 | # CONFIG_9P_FS is not set | ||
905 | 767 | ||
906 | # | 768 | # |
907 | # Partition Types | 769 | # Partition Types |
908 | # | 770 | # |
909 | # CONFIG_PARTITION_ADVANCED is not set | 771 | # CONFIG_PARTITION_ADVANCED is not set |
910 | CONFIG_MSDOS_PARTITION=y | 772 | CONFIG_MSDOS_PARTITION=y |
911 | |||
912 | # | ||
913 | # Native Language Support | ||
914 | # | ||
915 | # CONFIG_NLS is not set | 773 | # CONFIG_NLS is not set |
916 | 774 | # CONFIG_DLM is not set | |
917 | # | ||
918 | # Profiling support | ||
919 | # | ||
920 | # CONFIG_PROFILING is not set | ||
921 | 775 | ||
922 | # | 776 | # |
923 | # Kernel hacking | 777 | # Kernel hacking |
924 | # | 778 | # |
779 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | ||
925 | # CONFIG_PRINTK_TIME is not set | 780 | # CONFIG_PRINTK_TIME is not set |
781 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
926 | CONFIG_ENABLE_MUST_CHECK=y | 782 | CONFIG_ENABLE_MUST_CHECK=y |
927 | # CONFIG_MAGIC_SYSRQ is not set | 783 | # CONFIG_MAGIC_SYSRQ is not set |
928 | # CONFIG_UNUSED_SYMBOLS is not set | 784 | # CONFIG_UNUSED_SYMBOLS is not set |
785 | CONFIG_DEBUG_FS=y | ||
786 | # CONFIG_HEADERS_CHECK is not set | ||
929 | # CONFIG_DEBUG_KERNEL is not set | 787 | # CONFIG_DEBUG_KERNEL is not set |
930 | CONFIG_LOG_BUF_SHIFT=14 | ||
931 | # CONFIG_DEBUG_BUGVERBOSE is not set | 788 | # CONFIG_DEBUG_BUGVERBOSE is not set |
932 | # CONFIG_DEBUG_FS is not set | 789 | # CONFIG_SAMPLES is not set |
933 | # CONFIG_SH_STANDARD_BIOS is not set | 790 | # CONFIG_SH_STANDARD_BIOS is not set |
934 | # CONFIG_KGDB is not set | 791 | # CONFIG_EARLY_SCIF_CONSOLE is not set |
792 | # CONFIG_SH_KGDB is not set | ||
935 | 793 | ||
936 | # | 794 | # |
937 | # Security options | 795 | # Security options |
938 | # | 796 | # |
939 | # CONFIG_KEYS is not set | 797 | # CONFIG_KEYS is not set |
940 | # CONFIG_SECURITY is not set | 798 | # CONFIG_SECURITY is not set |
941 | 799 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | |
942 | # | 800 | CONFIG_CRYPTO=y |
943 | # Cryptographic options | 801 | # CONFIG_CRYPTO_SEQIV is not set |
944 | # | 802 | # CONFIG_CRYPTO_MANAGER is not set |
945 | # CONFIG_CRYPTO is not set | 803 | # CONFIG_CRYPTO_HMAC is not set |
804 | # CONFIG_CRYPTO_XCBC is not set | ||
805 | # CONFIG_CRYPTO_NULL is not set | ||
806 | # CONFIG_CRYPTO_MD4 is not set | ||
807 | # CONFIG_CRYPTO_MD5 is not set | ||
808 | # CONFIG_CRYPTO_SHA1 is not set | ||
809 | # CONFIG_CRYPTO_SHA256 is not set | ||
810 | # CONFIG_CRYPTO_SHA512 is not set | ||
811 | # CONFIG_CRYPTO_WP512 is not set | ||
812 | # CONFIG_CRYPTO_TGR192 is not set | ||
813 | # CONFIG_CRYPTO_GF128MUL is not set | ||
814 | # CONFIG_CRYPTO_ECB is not set | ||
815 | # CONFIG_CRYPTO_CBC is not set | ||
816 | # CONFIG_CRYPTO_PCBC is not set | ||
817 | # CONFIG_CRYPTO_LRW is not set | ||
818 | # CONFIG_CRYPTO_XTS is not set | ||
819 | # CONFIG_CRYPTO_CTR is not set | ||
820 | # CONFIG_CRYPTO_GCM is not set | ||
821 | # CONFIG_CRYPTO_CCM is not set | ||
822 | # CONFIG_CRYPTO_CRYPTD is not set | ||
823 | # CONFIG_CRYPTO_DES is not set | ||
824 | # CONFIG_CRYPTO_FCRYPT is not set | ||
825 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
826 | # CONFIG_CRYPTO_TWOFISH is not set | ||
827 | # CONFIG_CRYPTO_SERPENT is not set | ||
828 | # CONFIG_CRYPTO_AES is not set | ||
829 | # CONFIG_CRYPTO_CAST5 is not set | ||
830 | # CONFIG_CRYPTO_CAST6 is not set | ||
831 | # CONFIG_CRYPTO_TEA is not set | ||
832 | # CONFIG_CRYPTO_ARC4 is not set | ||
833 | # CONFIG_CRYPTO_KHAZAD is not set | ||
834 | # CONFIG_CRYPTO_ANUBIS is not set | ||
835 | # CONFIG_CRYPTO_SEED is not set | ||
836 | # CONFIG_CRYPTO_SALSA20 is not set | ||
837 | # CONFIG_CRYPTO_DEFLATE is not set | ||
838 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
839 | # CONFIG_CRYPTO_CRC32C is not set | ||
840 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
841 | # CONFIG_CRYPTO_TEST is not set | ||
842 | # CONFIG_CRYPTO_AUTHENC is not set | ||
843 | # CONFIG_CRYPTO_LZO is not set | ||
844 | CONFIG_CRYPTO_HW=y | ||
946 | 845 | ||
947 | # | 846 | # |
948 | # Library routines | 847 | # Library routines |
949 | # | 848 | # |
849 | CONFIG_BITREVERSE=y | ||
950 | # CONFIG_CRC_CCITT is not set | 850 | # CONFIG_CRC_CCITT is not set |
951 | # CONFIG_CRC16 is not set | 851 | # CONFIG_CRC16 is not set |
852 | # CONFIG_CRC_ITU_T is not set | ||
952 | CONFIG_CRC32=y | 853 | CONFIG_CRC32=y |
854 | # CONFIG_CRC7 is not set | ||
953 | # CONFIG_LIBCRC32C is not set | 855 | # CONFIG_LIBCRC32C is not set |
954 | CONFIG_ZLIB_INFLATE=y | 856 | CONFIG_ZLIB_INFLATE=y |
955 | CONFIG_ZLIB_DEFLATE=y | 857 | CONFIG_ZLIB_DEFLATE=y |
858 | CONFIG_HAS_IOMEM=y | ||
859 | CONFIG_HAS_IOPORT=y | ||
860 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/sh/drivers/dma/dma-sh.c b/arch/sh/drivers/dma/dma-sh.c index 5c3359756a92..71ff3d6f26e2 100644 --- a/arch/sh/drivers/dma/dma-sh.c +++ b/arch/sh/drivers/dma/dma-sh.c | |||
@@ -90,7 +90,7 @@ static irqreturn_t dma_tei(int irq, void *dev_id) | |||
90 | 90 | ||
91 | static int sh_dmac_request_dma(struct dma_channel *chan) | 91 | static int sh_dmac_request_dma(struct dma_channel *chan) |
92 | { | 92 | { |
93 | if (unlikely(!chan->flags & DMA_TEI_CAPABLE)) | 93 | if (unlikely(!(chan->flags & DMA_TEI_CAPABLE))) |
94 | return 0; | 94 | return 0; |
95 | 95 | ||
96 | return request_irq(get_dmte_irq(chan->chan), dma_tei, | 96 | return request_irq(get_dmte_irq(chan->chan), dma_tei, |
diff --git a/arch/sh/drivers/heartbeat.c b/arch/sh/drivers/heartbeat.c index b76a14f12ce2..ab77b0e0fa0e 100644 --- a/arch/sh/drivers/heartbeat.c +++ b/arch/sh/drivers/heartbeat.c | |||
@@ -93,7 +93,7 @@ static int heartbeat_drv_probe(struct platform_device *pdev) | |||
93 | } | 93 | } |
94 | 94 | ||
95 | hd->base = ioremap_nocache(res->start, res->end - res->start + 1); | 95 | hd->base = ioremap_nocache(res->start, res->end - res->start + 1); |
96 | if (!unlikely(hd->base)) { | 96 | if (unlikely(!hd->base)) { |
97 | dev_err(&pdev->dev, "ioremap failed\n"); | 97 | dev_err(&pdev->dev, "ioremap failed\n"); |
98 | 98 | ||
99 | if (!pdev->dev.platform_data) | 99 | if (!pdev->dev.platform_data) |
diff --git a/arch/sh/drivers/pci/ops-dreamcast.c b/arch/sh/drivers/pci/ops-dreamcast.c index 0dac87b19624..e1284fc69361 100644 --- a/arch/sh/drivers/pci/ops-dreamcast.c +++ b/arch/sh/drivers/pci/ops-dreamcast.c | |||
@@ -83,9 +83,9 @@ static int gapspci_read(struct pci_bus *bus, unsigned int devfn, int where, int | |||
83 | return PCIBIOS_DEVICE_NOT_FOUND; | 83 | return PCIBIOS_DEVICE_NOT_FOUND; |
84 | 84 | ||
85 | switch (size) { | 85 | switch (size) { |
86 | case 1: *val = ctrl_inb(GAPSPCI_BBA_CONFIG+where); break; | 86 | case 1: *val = inb(GAPSPCI_BBA_CONFIG+where); break; |
87 | case 2: *val = ctrl_inw(GAPSPCI_BBA_CONFIG+where); break; | 87 | case 2: *val = inw(GAPSPCI_BBA_CONFIG+where); break; |
88 | case 4: *val = ctrl_inl(GAPSPCI_BBA_CONFIG+where); break; | 88 | case 4: *val = inl(GAPSPCI_BBA_CONFIG+where); break; |
89 | } | 89 | } |
90 | 90 | ||
91 | return PCIBIOS_SUCCESSFUL; | 91 | return PCIBIOS_SUCCESSFUL; |
@@ -97,9 +97,9 @@ static int gapspci_write(struct pci_bus *bus, unsigned int devfn, int where, int | |||
97 | return PCIBIOS_DEVICE_NOT_FOUND; | 97 | return PCIBIOS_DEVICE_NOT_FOUND; |
98 | 98 | ||
99 | switch (size) { | 99 | switch (size) { |
100 | case 1: ctrl_outb(( u8)val, GAPSPCI_BBA_CONFIG+where); break; | 100 | case 1: outb(( u8)val, GAPSPCI_BBA_CONFIG+where); break; |
101 | case 2: ctrl_outw((u16)val, GAPSPCI_BBA_CONFIG+where); break; | 101 | case 2: outw((u16)val, GAPSPCI_BBA_CONFIG+where); break; |
102 | case 4: ctrl_outl((u32)val, GAPSPCI_BBA_CONFIG+where); break; | 102 | case 4: outl((u32)val, GAPSPCI_BBA_CONFIG+where); break; |
103 | } | 103 | } |
104 | 104 | ||
105 | return PCIBIOS_SUCCESSFUL; | 105 | return PCIBIOS_SUCCESSFUL; |
@@ -127,36 +127,36 @@ int __init gapspci_init(void) | |||
127 | */ | 127 | */ |
128 | 128 | ||
129 | for (i=0; i<16; i++) | 129 | for (i=0; i<16; i++) |
130 | idbuf[i] = ctrl_inb(GAPSPCI_REGS+i); | 130 | idbuf[i] = inb(GAPSPCI_REGS+i); |
131 | 131 | ||
132 | if (strncmp(idbuf, "GAPSPCI_BRIDGE_2", 16)) | 132 | if (strncmp(idbuf, "GAPSPCI_BRIDGE_2", 16)) |
133 | return -ENODEV; | 133 | return -ENODEV; |
134 | 134 | ||
135 | ctrl_outl(0x5a14a501, GAPSPCI_REGS+0x18); | 135 | outl(0x5a14a501, GAPSPCI_REGS+0x18); |
136 | 136 | ||
137 | for (i=0; i<1000000; i++) | 137 | for (i=0; i<1000000; i++) |
138 | ; | 138 | ; |
139 | 139 | ||
140 | if (ctrl_inl(GAPSPCI_REGS+0x18) != 1) | 140 | if (inl(GAPSPCI_REGS+0x18) != 1) |
141 | return -EINVAL; | 141 | return -EINVAL; |
142 | 142 | ||
143 | ctrl_outl(0x01000000, GAPSPCI_REGS+0x20); | 143 | outl(0x01000000, GAPSPCI_REGS+0x20); |
144 | ctrl_outl(0x01000000, GAPSPCI_REGS+0x24); | 144 | outl(0x01000000, GAPSPCI_REGS+0x24); |
145 | 145 | ||
146 | ctrl_outl(GAPSPCI_DMA_BASE, GAPSPCI_REGS+0x28); | 146 | outl(GAPSPCI_DMA_BASE, GAPSPCI_REGS+0x28); |
147 | ctrl_outl(GAPSPCI_DMA_BASE+GAPSPCI_DMA_SIZE, GAPSPCI_REGS+0x2c); | 147 | outl(GAPSPCI_DMA_BASE+GAPSPCI_DMA_SIZE, GAPSPCI_REGS+0x2c); |
148 | 148 | ||
149 | ctrl_outl(1, GAPSPCI_REGS+0x14); | 149 | outl(1, GAPSPCI_REGS+0x14); |
150 | ctrl_outl(1, GAPSPCI_REGS+0x34); | 150 | outl(1, GAPSPCI_REGS+0x34); |
151 | 151 | ||
152 | /* Setting Broadband Adapter */ | 152 | /* Setting Broadband Adapter */ |
153 | ctrl_outw(0xf900, GAPSPCI_BBA_CONFIG+0x06); | 153 | outw(0xf900, GAPSPCI_BBA_CONFIG+0x06); |
154 | ctrl_outl(0x00000000, GAPSPCI_BBA_CONFIG+0x30); | 154 | outl(0x00000000, GAPSPCI_BBA_CONFIG+0x30); |
155 | ctrl_outb(0x00, GAPSPCI_BBA_CONFIG+0x3c); | 155 | outb(0x00, GAPSPCI_BBA_CONFIG+0x3c); |
156 | ctrl_outb(0xf0, GAPSPCI_BBA_CONFIG+0x0d); | 156 | outb(0xf0, GAPSPCI_BBA_CONFIG+0x0d); |
157 | ctrl_outw(0x0006, GAPSPCI_BBA_CONFIG+0x04); | 157 | outw(0x0006, GAPSPCI_BBA_CONFIG+0x04); |
158 | ctrl_outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10); | 158 | outl(0x00002001, GAPSPCI_BBA_CONFIG+0x10); |
159 | ctrl_outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14); | 159 | outl(0x01000000, GAPSPCI_BBA_CONFIG+0x14); |
160 | 160 | ||
161 | return 0; | 161 | return 0; |
162 | } | 162 | } |
diff --git a/arch/sh/kernel/cpu/init.c b/arch/sh/kernel/cpu/init.c index 80a31329ead9..75fb03d35670 100644 --- a/arch/sh/kernel/cpu/init.c +++ b/arch/sh/kernel/cpu/init.c | |||
@@ -233,7 +233,7 @@ static void __init dsp_init(void) | |||
233 | * and cache configuration in detect_cpu_and_cache_system(). | 233 | * and cache configuration in detect_cpu_and_cache_system(). |
234 | */ | 234 | */ |
235 | 235 | ||
236 | asmlinkage void __cpuinit sh_cpu_init(void) | 236 | asmlinkage void __init sh_cpu_init(void) |
237 | { | 237 | { |
238 | current_thread_info()->cpu = hard_smp_processor_id(); | 238 | current_thread_info()->cpu = hard_smp_processor_id(); |
239 | 239 | ||
diff --git a/arch/sh/kernel/cpu/sh2/setup-sh7619.c b/arch/sh/kernel/cpu/sh2/setup-sh7619.c index b230eb278cef..cc530f4d84d6 100644 --- a/arch/sh/kernel/cpu/sh2/setup-sh7619.c +++ b/arch/sh/kernel/cpu/sh2/setup-sh7619.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <asm/sci.h> | 13 | #include <linux/serial_sci.h> |
14 | 14 | ||
15 | enum { | 15 | enum { |
16 | UNUSED = 0, | 16 | UNUSED = 0, |
diff --git a/arch/sh/kernel/cpu/sh2a/clock-sh7203.c b/arch/sh/kernel/cpu/sh2a/clock-sh7203.c index 3feb95a4fcbc..fb781329848a 100644 --- a/arch/sh/kernel/cpu/sh2a/clock-sh7203.c +++ b/arch/sh/kernel/cpu/sh2a/clock-sh7203.c | |||
@@ -21,8 +21,8 @@ | |||
21 | #include <asm/freq.h> | 21 | #include <asm/freq.h> |
22 | #include <asm/io.h> | 22 | #include <asm/io.h> |
23 | 23 | ||
24 | const static int pll1rate[]={8,12,16,0}; | 24 | static const int pll1rate[]={8,12,16,0}; |
25 | const static int pfc_divisors[]={1,2,3,4,6,8,12}; | 25 | static const int pfc_divisors[]={1,2,3,4,6,8,12}; |
26 | #define ifc_divisors pfc_divisors | 26 | #define ifc_divisors pfc_divisors |
27 | 27 | ||
28 | #if (CONFIG_SH_CLK_MD == 0) | 28 | #if (CONFIG_SH_CLK_MD == 0) |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7203.c b/arch/sh/kernel/cpu/sh2a/setup-sh7203.c index db6ef5cecde1..e98dc4450352 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7203.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7203.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <asm/sci.h> | 13 | #include <linux/serial_sci.h> |
14 | 14 | ||
15 | enum { | 15 | enum { |
16 | UNUSED = 0, | 16 | UNUSED = 0, |
diff --git a/arch/sh/kernel/cpu/sh2a/setup-sh7206.c b/arch/sh/kernel/cpu/sh2a/setup-sh7206.c index a564425b905f..e6d4ec445dd8 100644 --- a/arch/sh/kernel/cpu/sh2a/setup-sh7206.c +++ b/arch/sh/kernel/cpu/sh2a/setup-sh7206.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <asm/sci.h> | 13 | #include <linux/serial_sci.h> |
14 | 14 | ||
15 | enum { | 15 | enum { |
16 | UNUSED = 0, | 16 | UNUSED = 0, |
diff --git a/arch/sh/kernel/cpu/sh3/probe.c b/arch/sh/kernel/cpu/sh3/probe.c index fcc80bb7bee7..10f2a760c5ee 100644 --- a/arch/sh/kernel/cpu/sh3/probe.c +++ b/arch/sh/kernel/cpu/sh3/probe.c | |||
@@ -94,9 +94,9 @@ int __uses_jump_to_uncached detect_cpu_and_cache_system(void) | |||
94 | boot_cpu_data.dcache.way_incr = (1 << 13); | 94 | boot_cpu_data.dcache.way_incr = (1 << 13); |
95 | boot_cpu_data.dcache.entry_mask = 0x1ff0; | 95 | boot_cpu_data.dcache.entry_mask = 0x1ff0; |
96 | boot_cpu_data.dcache.sets = 512; | 96 | boot_cpu_data.dcache.sets = 512; |
97 | ctrl_outl(CCR_CACHE_32KB, CCR3); | 97 | ctrl_outl(CCR_CACHE_32KB, CCR3_REG); |
98 | #else | 98 | #else |
99 | ctrl_outl(CCR_CACHE_16KB, CCR3); | 99 | ctrl_outl(CCR_CACHE_16KB, CCR3_REG); |
100 | #endif | 100 | #endif |
101 | #endif | 101 | #endif |
102 | } | 102 | } |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7705.c b/arch/sh/kernel/cpu/sh3/setup-sh7705.c index dd0a20a685f7..f581534cb732 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7705.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7705.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <linux/serial.h> | 14 | #include <linux/serial.h> |
15 | #include <asm/sci.h> | 15 | #include <linux/serial_sci.h> |
16 | #include <asm/rtc.h> | 16 | #include <asm/rtc.h> |
17 | 17 | ||
18 | enum { | 18 | enum { |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh770x.c b/arch/sh/kernel/cpu/sh3/setup-sh770x.c index 969804bb523b..d3733b13ea52 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh770x.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh770x.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <linux/irq.h> | 16 | #include <linux/irq.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/serial.h> | 18 | #include <linux/serial.h> |
19 | #include <asm/sci.h> | 19 | #include <linux/serial_sci.h> |
20 | 20 | ||
21 | enum { | 21 | enum { |
22 | UNUSED = 0, | 22 | UNUSED = 0, |
@@ -123,15 +123,15 @@ static struct resource rtc_resources[] = { | |||
123 | .flags = IORESOURCE_IO, | 123 | .flags = IORESOURCE_IO, |
124 | }, | 124 | }, |
125 | [1] = { | 125 | [1] = { |
126 | .start = 20, | 126 | .start = 21, |
127 | .flags = IORESOURCE_IRQ, | 127 | .flags = IORESOURCE_IRQ, |
128 | }, | 128 | }, |
129 | [2] = { | 129 | [2] = { |
130 | .start = 21, | 130 | .start = 22, |
131 | .flags = IORESOURCE_IRQ, | 131 | .flags = IORESOURCE_IRQ, |
132 | }, | 132 | }, |
133 | [3] = { | 133 | [3] = { |
134 | .start = 22, | 134 | .start = 20, |
135 | .flags = IORESOURCE_IRQ, | 135 | .flags = IORESOURCE_IRQ, |
136 | }, | 136 | }, |
137 | }; | 137 | }; |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7710.c b/arch/sh/kernel/cpu/sh3/setup-sh7710.c index 0cc0e2bf135d..7406c9ad9259 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7710.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7710.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <linux/serial.h> | 14 | #include <linux/serial.h> |
15 | #include <asm/sci.h> | 15 | #include <linux/serial_sci.h> |
16 | #include <asm/rtc.h> | 16 | #include <asm/rtc.h> |
17 | 17 | ||
18 | enum { | 18 | enum { |
diff --git a/arch/sh/kernel/cpu/sh3/setup-sh7720.c b/arch/sh/kernel/cpu/sh3/setup-sh7720.c index 3855ea4c21c8..8028082527c5 100644 --- a/arch/sh/kernel/cpu/sh3/setup-sh7720.c +++ b/arch/sh/kernel/cpu/sh3/setup-sh7720.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/serial.h> | 17 | #include <linux/serial.h> |
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | #include <asm/sci.h> | 19 | #include <linux/serial_sci.h> |
20 | #include <asm/rtc.h> | 20 | #include <asm/rtc.h> |
21 | 21 | ||
22 | #define INTC_ICR1 0xA4140010UL | 22 | #define INTC_ICR1 0xA4140010UL |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh4-202.c b/arch/sh/kernel/cpu/sh4/setup-sh4-202.c index dab193293f20..7371abf64f80 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh4-202.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh4-202.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <asm/sci.h> | 13 | #include <linux/serial_sci.h> |
14 | 14 | ||
15 | static struct plat_sci_port sci_platform_data[] = { | 15 | static struct plat_sci_port sci_platform_data[] = { |
16 | { | 16 | { |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7750.c b/arch/sh/kernel/cpu/sh4/setup-sh7750.c index ae3603aca615..ec884039b914 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7750.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7750.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/serial.h> | 13 | #include <linux/serial.h> |
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | #include <asm/sci.h> | 15 | #include <linux/serial_sci.h> |
16 | 16 | ||
17 | static struct resource rtc_resources[] = { | 17 | static struct resource rtc_resources[] = { |
18 | [0] = { | 18 | [0] = { |
diff --git a/arch/sh/kernel/cpu/sh4/setup-sh7760.c b/arch/sh/kernel/cpu/sh4/setup-sh7760.c index 85f81579b97e..254c5c55ab91 100644 --- a/arch/sh/kernel/cpu/sh4/setup-sh7760.c +++ b/arch/sh/kernel/cpu/sh4/setup-sh7760.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <asm/sci.h> | 13 | #include <linux/serial_sci.h> |
14 | 14 | ||
15 | enum { | 15 | enum { |
16 | UNUSED = 0, | 16 | UNUSED = 0, |
diff --git a/arch/sh/kernel/cpu/sh4/sq.c b/arch/sh/kernel/cpu/sh4/sq.c index 8250e017bd4e..9561b02ade0e 100644 --- a/arch/sh/kernel/cpu/sh4/sq.c +++ b/arch/sh/kernel/cpu/sh4/sq.c | |||
@@ -216,7 +216,7 @@ void sq_unmap(unsigned long vaddr) | |||
216 | 216 | ||
217 | if (unlikely(!map)) { | 217 | if (unlikely(!map)) { |
218 | printk("%s: bad store queue address 0x%08lx\n", | 218 | printk("%s: bad store queue address 0x%08lx\n", |
219 | __FUNCTION__, vaddr); | 219 | __func__, vaddr); |
220 | return; | 220 | return; |
221 | } | 221 | } |
222 | 222 | ||
@@ -233,7 +233,7 @@ void sq_unmap(unsigned long vaddr) | |||
233 | vma = remove_vm_area((void *)(map->sq_addr & PAGE_MASK)); | 233 | vma = remove_vm_area((void *)(map->sq_addr & PAGE_MASK)); |
234 | if (!vma) { | 234 | if (!vma) { |
235 | printk(KERN_ERR "%s: bad address 0x%08lx\n", | 235 | printk(KERN_ERR "%s: bad address 0x%08lx\n", |
236 | __FUNCTION__, map->sq_addr); | 236 | __func__, map->sq_addr); |
237 | return; | 237 | return; |
238 | } | 238 | } |
239 | } | 239 | } |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7343.c b/arch/sh/kernel/cpu/sh4a/setup-sh7343.c index c0a3f079dfdc..6d4f50cd4aaf 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7343.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7343.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <asm/sci.h> | 13 | #include <linux/serial_sci.h> |
14 | 14 | ||
15 | static struct plat_sci_port sci_platform_data[] = { | 15 | static struct plat_sci_port sci_platform_data[] = { |
16 | { | 16 | { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7366.c b/arch/sh/kernel/cpu/sh4a/setup-sh7366.c index 967e8b69a2f8..f26b5cdad0d1 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7366.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7366.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/platform_device.h> | 12 | #include <linux/platform_device.h> |
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/serial.h> | 14 | #include <linux/serial.h> |
15 | #include <asm/sci.h> | 15 | #include <linux/serial_sci.h> |
16 | 16 | ||
17 | static struct plat_sci_port sci_platform_data[] = { | 17 | static struct plat_sci_port sci_platform_data[] = { |
18 | { | 18 | { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c index 73c778d40d13..b98b4bc93ec9 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7722.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7722.c | |||
@@ -10,9 +10,9 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <linux/serial_sci.h> | ||
13 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
14 | #include <asm/mmzone.h> | 15 | #include <asm/mmzone.h> |
15 | #include <asm/sci.h> | ||
16 | 16 | ||
17 | static struct resource usbf_resources[] = { | 17 | static struct resource usbf_resources[] = { |
18 | [0] = { | 18 | [0] = { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c index eabd5386812d..07c988dc9de6 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7763.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7763.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/serial.h> | 13 | #include <linux/serial.h> |
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | #include <asm/sci.h> | 15 | #include <linux/serial_sci.h> |
16 | 16 | ||
17 | static struct resource rtc_resources[] = { | 17 | static struct resource rtc_resources[] = { |
18 | [0] = { | 18 | [0] = { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7770.c b/arch/sh/kernel/cpu/sh4a/setup-sh7770.c index 32f4f59a837b..b9cec48b1808 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7770.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7770.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <asm/sci.h> | 13 | #include <linux/serial_sci.h> |
14 | 14 | ||
15 | static struct plat_sci_port sci_platform_data[] = { | 15 | static struct plat_sci_port sci_platform_data[] = { |
16 | { | 16 | { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7780.c b/arch/sh/kernel/cpu/sh4a/setup-sh7780.c index 293004b526ff..18dbbe23fea1 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7780.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7780.c | |||
@@ -11,7 +11,7 @@ | |||
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <linux/io.h> | 13 | #include <linux/io.h> |
14 | #include <asm/sci.h> | 14 | #include <linux/serial_sci.h> |
15 | 15 | ||
16 | static struct resource rtc_resources[] = { | 16 | static struct resource rtc_resources[] = { |
17 | [0] = { | 17 | [0] = { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7785.c b/arch/sh/kernel/cpu/sh4a/setup-sh7785.c index 74b60e96cdf4..621e7329ec63 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7785.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7785.c | |||
@@ -10,10 +10,10 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <linux/serial_sci.h> | ||
13 | #include <linux/io.h> | 14 | #include <linux/io.h> |
14 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
15 | #include <asm/mmzone.h> | 16 | #include <asm/mmzone.h> |
16 | #include <asm/sci.h> | ||
17 | 17 | ||
18 | static struct plat_sci_port sci_platform_data[] = { | 18 | static struct plat_sci_port sci_platform_data[] = { |
19 | { | 19 | { |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-shx3.c b/arch/sh/kernel/cpu/sh4a/setup-shx3.c index 4dc958b6b314..bd35f32534b9 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-shx3.c +++ b/arch/sh/kernel/cpu/sh4a/setup-shx3.c | |||
@@ -10,9 +10,9 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/serial.h> | 12 | #include <linux/serial.h> |
13 | #include <linux/serial_sci.h> | ||
13 | #include <linux/io.h> | 14 | #include <linux/io.h> |
14 | #include <asm/mmzone.h> | 15 | #include <asm/mmzone.h> |
15 | #include <asm/sci.h> | ||
16 | 16 | ||
17 | static struct plat_sci_port sci_platform_data[] = { | 17 | static struct plat_sci_port sci_platform_data[] = { |
18 | { | 18 | { |
diff --git a/arch/sh/kernel/cpu/sh5/unwind.c b/arch/sh/kernel/cpu/sh5/unwind.c index 119c20afd4e5..b205b25eaf45 100644 --- a/arch/sh/kernel/cpu/sh5/unwind.c +++ b/arch/sh/kernel/cpu/sh5/unwind.c | |||
@@ -149,7 +149,7 @@ static int lookup_prev_stack_frame(unsigned long fp, unsigned long pc, | |||
149 | if (dest >= 63) { | 149 | if (dest >= 63) { |
150 | printk(KERN_NOTICE "%s: Invalid dest reg %d " | 150 | printk(KERN_NOTICE "%s: Invalid dest reg %d " |
151 | "specified in movi handler. Failed " | 151 | "specified in movi handler. Failed " |
152 | "opcode was 0x%lx: ", __FUNCTION__, | 152 | "opcode was 0x%lx: ", __func__, |
153 | dest, op); | 153 | dest, op); |
154 | 154 | ||
155 | continue; | 155 | continue; |
diff --git a/arch/sh/kernel/io_trapped.c b/arch/sh/kernel/io_trapped.c index 86a665d92201..39cd7f3aec7b 100644 --- a/arch/sh/kernel/io_trapped.c +++ b/arch/sh/kernel/io_trapped.c | |||
@@ -32,7 +32,7 @@ EXPORT_SYMBOL_GPL(trapped_mem); | |||
32 | #endif | 32 | #endif |
33 | static DEFINE_SPINLOCK(trapped_lock); | 33 | static DEFINE_SPINLOCK(trapped_lock); |
34 | 34 | ||
35 | int __init register_trapped_io(struct trapped_io *tiop) | 35 | int register_trapped_io(struct trapped_io *tiop) |
36 | { | 36 | { |
37 | struct resource *res; | 37 | struct resource *res; |
38 | unsigned long len = 0, flags = 0; | 38 | unsigned long len = 0, flags = 0; |
diff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c index e1a6de9088b5..d80de3903271 100644 --- a/arch/sh/kernel/sh_ksyms_32.c +++ b/arch/sh/kernel/sh_ksyms_32.c | |||
@@ -111,9 +111,9 @@ DECLARE_EXPORT(__movmem_i4_even); | |||
111 | DECLARE_EXPORT(__movmem_i4_odd); | 111 | DECLARE_EXPORT(__movmem_i4_odd); |
112 | DECLARE_EXPORT(__movmemSI12_i4); | 112 | DECLARE_EXPORT(__movmemSI12_i4); |
113 | 113 | ||
114 | #if (__GNUC_MINOR__ == 2 || defined(__GNUC_STM_RELEASE__)) | 114 | #if (__GNUC_MINOR__ >= 2 || defined(__GNUC_STM_RELEASE__)) |
115 | /* | 115 | /* |
116 | * GCC 4.2 emits these for division, as do GCC 4.1.x versions of the ST | 116 | * GCC >= 4.2 emits these for division, as do GCC 4.1.x versions of the ST |
117 | * compiler which include backported patches. | 117 | * compiler which include backported patches. |
118 | */ | 118 | */ |
119 | DECLARE_EXPORT(__sdivsi3_i4i); | 119 | DECLARE_EXPORT(__sdivsi3_i4i); |
@@ -146,5 +146,6 @@ EXPORT_SYMBOL(csum_partial_copy_generic); | |||
146 | EXPORT_SYMBOL(csum_ipv6_magic); | 146 | EXPORT_SYMBOL(csum_ipv6_magic); |
147 | #endif | 147 | #endif |
148 | EXPORT_SYMBOL(clear_page); | 148 | EXPORT_SYMBOL(clear_page); |
149 | EXPORT_SYMBOL(copy_page); | ||
149 | EXPORT_SYMBOL(__clear_user); | 150 | EXPORT_SYMBOL(__clear_user); |
150 | EXPORT_SYMBOL(_ebss); | 151 | EXPORT_SYMBOL(_ebss); |
diff --git a/arch/sh/kernel/sh_ksyms_64.c b/arch/sh/kernel/sh_ksyms_64.c index 8004c38d3d37..dd38a683de65 100644 --- a/arch/sh/kernel/sh_ksyms_64.c +++ b/arch/sh/kernel/sh_ksyms_64.c | |||
@@ -42,6 +42,7 @@ EXPORT_SYMBOL(__down_trylock); | |||
42 | EXPORT_SYMBOL(__up); | 42 | EXPORT_SYMBOL(__up); |
43 | EXPORT_SYMBOL(__put_user_asm_l); | 43 | EXPORT_SYMBOL(__put_user_asm_l); |
44 | EXPORT_SYMBOL(__get_user_asm_l); | 44 | EXPORT_SYMBOL(__get_user_asm_l); |
45 | EXPORT_SYMBOL(copy_page); | ||
45 | EXPORT_SYMBOL(__copy_user); | 46 | EXPORT_SYMBOL(__copy_user); |
46 | EXPORT_SYMBOL(memcpy); | 47 | EXPORT_SYMBOL(memcpy); |
47 | EXPORT_SYMBOL(__udelay); | 48 | EXPORT_SYMBOL(__udelay); |
diff --git a/arch/sh/kernel/timers/timer-cmt.c b/arch/sh/kernel/timers/timer-cmt.c index 71312324b5de..d20c8c375881 100644 --- a/arch/sh/kernel/timers/timer-cmt.c +++ b/arch/sh/kernel/timers/timer-cmt.c | |||
@@ -77,7 +77,7 @@ static unsigned long cmt_timer_get_offset(void) | |||
77 | count -= LATCH; | 77 | count -= LATCH; |
78 | } else { | 78 | } else { |
79 | printk("%s (): hardware timer problem?\n", | 79 | printk("%s (): hardware timer problem?\n", |
80 | __FUNCTION__); | 80 | __func__); |
81 | } | 81 | } |
82 | } | 82 | } |
83 | } else | 83 | } else |
diff --git a/arch/sh/kernel/timers/timer-mtu2.c b/arch/sh/kernel/timers/timer-mtu2.c index ade9d6eb29f9..fe453c01f9c9 100644 --- a/arch/sh/kernel/timers/timer-mtu2.c +++ b/arch/sh/kernel/timers/timer-mtu2.c | |||
@@ -76,7 +76,7 @@ static unsigned long mtu2_timer_get_offset(void) | |||
76 | count -= LATCH; | 76 | count -= LATCH; |
77 | } else { | 77 | } else { |
78 | printk("%s (): hardware timer problem?\n", | 78 | printk("%s (): hardware timer problem?\n", |
79 | __FUNCTION__); | 79 | __func__); |
80 | } | 80 | } |
81 | } | 81 | } |
82 | } else | 82 | } else |
diff --git a/arch/sh/kernel/topology.c b/arch/sh/kernel/topology.c index 9b5844a1bdaa..0838942b7083 100644 --- a/arch/sh/kernel/topology.c +++ b/arch/sh/kernel/topology.c | |||
@@ -29,7 +29,7 @@ static int __init topology_init(void) | |||
29 | ret = register_cpu(&per_cpu(cpu_devices, i), i); | 29 | ret = register_cpu(&per_cpu(cpu_devices, i), i); |
30 | if (unlikely(ret)) | 30 | if (unlikely(ret)) |
31 | printk(KERN_WARNING "%s: register_cpu %d failed (%d)\n", | 31 | printk(KERN_WARNING "%s: register_cpu %d failed (%d)\n", |
32 | __FUNCTION__, i, ret); | 32 | __func__, i, ret); |
33 | } | 33 | } |
34 | 34 | ||
35 | #if defined(CONFIG_NUMA) && !defined(CONFIG_SMP) | 35 | #if defined(CONFIG_NUMA) && !defined(CONFIG_SMP) |
diff --git a/arch/sh/kernel/traps_64.c b/arch/sh/kernel/traps_64.c index a55ac81d795b..1b58a7499087 100644 --- a/arch/sh/kernel/traps_64.c +++ b/arch/sh/kernel/traps_64.c | |||
@@ -238,7 +238,7 @@ DO_ERROR(12, SIGILL, "reserved instruction", reserved_inst, current) | |||
238 | /* Called with interrupts disabled */ | 238 | /* Called with interrupts disabled */ |
239 | asmlinkage void do_exception_error(unsigned long ex, struct pt_regs *regs) | 239 | asmlinkage void do_exception_error(unsigned long ex, struct pt_regs *regs) |
240 | { | 240 | { |
241 | show_excp_regs(__FUNCTION__, -1, -1, regs); | 241 | show_excp_regs(__func__, -1, -1, regs); |
242 | die_if_kernel("exception", regs, ex); | 242 | die_if_kernel("exception", regs, ex); |
243 | } | 243 | } |
244 | 244 | ||
diff --git a/arch/sh/lib64/c-checksum.c b/arch/sh/lib64/c-checksum.c index 5dfbd8b5e558..5c284e0cff9c 100644 --- a/arch/sh/lib64/c-checksum.c +++ b/arch/sh/lib64/c-checksum.c | |||
@@ -207,7 +207,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | |||
207 | result = (result & 0xffffffff) + (result >> 32); | 207 | result = (result & 0xffffffff) + (result >> 32); |
208 | 208 | ||
209 | pr_debug("%s saddr %x daddr %x len %x proto %x sum %x result %08Lx\n", | 209 | pr_debug("%s saddr %x daddr %x len %x proto %x sum %x result %08Lx\n", |
210 | __FUNCTION__, saddr, daddr, len, proto, sum, result); | 210 | __func__, saddr, daddr, len, proto, sum, result); |
211 | 211 | ||
212 | return (__wsum)result; | 212 | return (__wsum)result; |
213 | } | 213 | } |
diff --git a/arch/sh/lib64/udelay.c b/arch/sh/lib64/udelay.c index 23c7d17fb9f7..d76bd801194f 100644 --- a/arch/sh/lib64/udelay.c +++ b/arch/sh/lib64/udelay.c | |||
@@ -21,7 +21,7 @@ | |||
21 | * a 1GHz box, that's about 2 seconds. | 21 | * a 1GHz box, that's about 2 seconds. |
22 | */ | 22 | */ |
23 | 23 | ||
24 | void __delay(int loops) | 24 | void __delay(unsigned long loops) |
25 | { | 25 | { |
26 | long long dummy; | 26 | long long dummy; |
27 | __asm__ __volatile__("gettr tr0, %1\n\t" | 27 | __asm__ __volatile__("gettr tr0, %1\n\t" |
@@ -33,24 +33,17 @@ void __delay(int loops) | |||
33 | :"0"(loops)); | 33 | :"0"(loops)); |
34 | } | 34 | } |
35 | 35 | ||
36 | void __udelay(unsigned long long usecs, unsigned long lpj) | 36 | inline void __const_udelay(unsigned long xloops) |
37 | { | 37 | { |
38 | usecs *= (((unsigned long long) HZ << 32) / 1000000) * lpj; | 38 | __delay(xloops * (HZ * cpu_data[raw_smp_processor_id()].loops_per_jiffy)); |
39 | __delay((long long) usecs >> 32); | ||
40 | } | 39 | } |
41 | 40 | ||
42 | void __ndelay(unsigned long long nsecs, unsigned long lpj) | 41 | void __udelay(unsigned long usecs) |
43 | { | 42 | { |
44 | nsecs *= (((unsigned long long) HZ << 32) / 1000000000) * lpj; | 43 | __const_udelay(usecs * 0x000010c6); /* 2**32 / 1000000 */ |
45 | __delay((long long) nsecs >> 32); | ||
46 | } | 44 | } |
47 | 45 | ||
48 | void udelay(unsigned long usecs) | 46 | void __ndelay(unsigned long nsecs) |
49 | { | 47 | { |
50 | __udelay(usecs, cpu_data[raw_smp_processor_id()].loops_per_jiffy); | 48 | __const_udelay(nsecs * 0x00000005); |
51 | } | ||
52 | |||
53 | void ndelay(unsigned long nsecs) | ||
54 | { | ||
55 | __ndelay(nsecs, cpu_data[raw_smp_processor_id()].loops_per_jiffy); | ||
56 | } | 49 | } |
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index f549b8cd2501..5fd218430b19 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -59,7 +59,7 @@ config 32BIT | |||
59 | 59 | ||
60 | config PMB | 60 | config PMB |
61 | bool "Support 32-bit physical addressing through PMB" | 61 | bool "Support 32-bit physical addressing through PMB" |
62 | depends on MMU && (CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785) | 62 | depends on MMU && EXPERIMENTAL && (CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785) |
63 | select 32BIT | 63 | select 32BIT |
64 | default y | 64 | default y |
65 | help | 65 | help |
diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index e2ed6dd252b9..53dde0607362 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c | |||
@@ -328,7 +328,7 @@ int arch_add_memory(int nid, u64 start, u64 size) | |||
328 | /* We only have ZONE_NORMAL, so this is easy.. */ | 328 | /* We only have ZONE_NORMAL, so this is easy.. */ |
329 | ret = __add_pages(pgdat->node_zones + ZONE_NORMAL, start_pfn, nr_pages); | 329 | ret = __add_pages(pgdat->node_zones + ZONE_NORMAL, start_pfn, nr_pages); |
330 | if (unlikely(ret)) | 330 | if (unlikely(ret)) |
331 | printk("%s: Failed, __add_pages() == %d\n", __FUNCTION__, ret); | 331 | printk("%s: Failed, __add_pages() == %d\n", __func__, ret); |
332 | 332 | ||
333 | return ret; | 333 | return ret; |
334 | } | 334 | } |
diff --git a/arch/sh/mm/ioremap_32.c b/arch/sh/mm/ioremap_32.c index 0c7b7e33abdc..882a32ebc6b7 100644 --- a/arch/sh/mm/ioremap_32.c +++ b/arch/sh/mm/ioremap_32.c | |||
@@ -141,7 +141,7 @@ void __iounmap(void __iomem *addr) | |||
141 | 141 | ||
142 | p = remove_vm_area((void *)(vaddr & PAGE_MASK)); | 142 | p = remove_vm_area((void *)(vaddr & PAGE_MASK)); |
143 | if (!p) { | 143 | if (!p) { |
144 | printk(KERN_ERR "%s: bad address %p\n", __FUNCTION__, addr); | 144 | printk(KERN_ERR "%s: bad address %p\n", __func__, addr); |
145 | return; | 145 | return; |
146 | } | 146 | } |
147 | 147 | ||
diff --git a/arch/sh/mm/ioremap_64.c b/arch/sh/mm/ioremap_64.c index e27d16519235..cea224c3e49b 100644 --- a/arch/sh/mm/ioremap_64.c +++ b/arch/sh/mm/ioremap_64.c | |||
@@ -178,7 +178,7 @@ static unsigned long shmedia_alloc_io(unsigned long phys, unsigned long size, | |||
178 | } else { | 178 | } else { |
179 | if (!printed_full) { | 179 | if (!printed_full) { |
180 | printk("%s: done with statics, switching to kmalloc\n", | 180 | printk("%s: done with statics, switching to kmalloc\n", |
181 | __FUNCTION__); | 181 | __func__); |
182 | printed_full = 1; | 182 | printed_full = 1; |
183 | } | 183 | } |
184 | tlen = strlen(name); | 184 | tlen = strlen(name); |
@@ -352,7 +352,7 @@ void onchip_unmap(unsigned long vaddr) | |||
352 | res = shmedia_find_resource(&shmedia_iomap, vaddr); | 352 | res = shmedia_find_resource(&shmedia_iomap, vaddr); |
353 | if (!res) { | 353 | if (!res) { |
354 | printk(KERN_ERR "%s: Failed to free 0x%08lx\n", | 354 | printk(KERN_ERR "%s: Failed to free 0x%08lx\n", |
355 | __FUNCTION__, vaddr); | 355 | __func__, vaddr); |
356 | return; | 356 | return; |
357 | } | 357 | } |
358 | 358 | ||
diff --git a/arch/sh/mm/pg-sh7705.c b/arch/sh/mm/pg-sh7705.c index a4b015f95a3a..7f885b7f8aff 100644 --- a/arch/sh/mm/pg-sh7705.c +++ b/arch/sh/mm/pg-sh7705.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/mman.h> | 14 | #include <linux/mman.h> |
15 | #include <linux/mm.h> | 15 | #include <linux/mm.h> |
16 | #include <linux/threads.h> | 16 | #include <linux/threads.h> |
17 | #include <linux/fs.h> | ||
17 | #include <asm/addrspace.h> | 18 | #include <asm/addrspace.h> |
18 | #include <asm/page.h> | 19 | #include <asm/page.h> |
19 | #include <asm/pgtable.h> | 20 | #include <asm/pgtable.h> |
diff --git a/arch/sh/mm/tlbflush_64.c b/arch/sh/mm/tlbflush_64.c index 2a98c9ec88ff..7876997ba19a 100644 --- a/arch/sh/mm/tlbflush_64.c +++ b/arch/sh/mm/tlbflush_64.c | |||
@@ -131,7 +131,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess, | |||
131 | #ifdef DEBUG_FAULT | 131 | #ifdef DEBUG_FAULT |
132 | print_task(tsk); | 132 | print_task(tsk); |
133 | printk("%s:%d fault, address is 0x%08x PC %016Lx textaccess %d writeaccess %d\n", | 133 | printk("%s:%d fault, address is 0x%08x PC %016Lx textaccess %d writeaccess %d\n", |
134 | __FUNCTION__,__LINE__, | 134 | __func__, __LINE__, |
135 | address,regs->pc,textaccess,writeaccess); | 135 | address,regs->pc,textaccess,writeaccess); |
136 | show_regs(regs); | 136 | show_regs(regs); |
137 | #endif | 137 | #endif |
@@ -145,7 +145,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess, | |||
145 | #ifdef DEBUG_FAULT | 145 | #ifdef DEBUG_FAULT |
146 | print_task(tsk); | 146 | print_task(tsk); |
147 | printk("%s:%d fault, address is 0x%08x PC %016Lx textaccess %d writeaccess %d\n", | 147 | printk("%s:%d fault, address is 0x%08x PC %016Lx textaccess %d writeaccess %d\n", |
148 | __FUNCTION__,__LINE__, | 148 | __func__, __LINE__, |
149 | address,regs->pc,textaccess,writeaccess); | 149 | address,regs->pc,textaccess,writeaccess); |
150 | show_regs(regs); | 150 | show_regs(regs); |
151 | 151 | ||
@@ -157,7 +157,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long writeaccess, | |||
157 | #ifdef DEBUG_FAULT | 157 | #ifdef DEBUG_FAULT |
158 | print_task(tsk); | 158 | print_task(tsk); |
159 | printk("%s:%d fault, address is 0x%08x PC %016Lx textaccess %d writeaccess %d\n", | 159 | printk("%s:%d fault, address is 0x%08x PC %016Lx textaccess %d writeaccess %d\n", |
160 | __FUNCTION__,__LINE__, | 160 | __func__, __LINE__, |
161 | address,regs->pc,textaccess,writeaccess); | 161 | address,regs->pc,textaccess,writeaccess); |
162 | show_regs(regs); | 162 | show_regs(regs); |
163 | #endif | 163 | #endif |
diff --git a/arch/sh/tools/mach-types b/arch/sh/tools/mach-types index 67997af25c0c..d63b93da952d 100644 --- a/arch/sh/tools/mach-types +++ b/arch/sh/tools/mach-types | |||
@@ -38,7 +38,6 @@ R7780MP SH_R7780MP | |||
38 | R7785RP SH_R7785RP | 38 | R7785RP SH_R7785RP |
39 | TITAN SH_TITAN | 39 | TITAN SH_TITAN |
40 | SHMIN SH_SHMIN | 40 | SHMIN SH_SHMIN |
41 | 7710VOIPGW SH_7710VOIPGW | ||
42 | LBOXRE2 SH_LBOX_RE2 | 41 | LBOXRE2 SH_LBOX_RE2 |
43 | X3PROTO SH_X3PROTO | 42 | X3PROTO SH_X3PROTO |
44 | MAGICPANELR2 SH_MAGIC_PANEL_R2 | 43 | MAGICPANELR2 SH_MAGIC_PANEL_R2 |
diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index e795f282dece..bf1b15d3f6f5 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | # $Id: Makefile,v 1.62 2000/12/15 00:41:17 davem Exp $ | 1 | # |
2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
3 | # | 3 | # |
4 | 4 | ||
@@ -12,7 +12,8 @@ obj-y := entry.o wof.o wuf.o etrap.o rtrap.o traps.o $(IRQ_OBJS) \ | |||
12 | sys_sparc.o sunos_asm.o systbls.o \ | 12 | sys_sparc.o sunos_asm.o systbls.o \ |
13 | time.o windows.o cpu.o devices.o sclow.o \ | 13 | time.o windows.o cpu.o devices.o sclow.o \ |
14 | tadpole.o tick14.o ptrace.o sys_solaris.o \ | 14 | tadpole.o tick14.o ptrace.o sys_solaris.o \ |
15 | unaligned.o muldiv.o semaphore.o prom.o of_device.o devres.o | 15 | unaligned.o una_asm.o muldiv.o semaphore.o \ |
16 | prom.o of_device.o devres.o | ||
16 | 17 | ||
17 | devres-y = ../../../kernel/irq/devres.o | 18 | devres-y = ../../../kernel/irq/devres.o |
18 | 19 | ||
diff --git a/arch/sparc/kernel/cpu.c b/arch/sparc/kernel/cpu.c index 259a559d4cea..e7a0edfc1a32 100644 --- a/arch/sparc/kernel/cpu.c +++ b/arch/sparc/kernel/cpu.c | |||
@@ -32,7 +32,7 @@ struct cpu_fp_info { | |||
32 | /* In order to get the fpu type correct, you need to take the IDPROM's | 32 | /* In order to get the fpu type correct, you need to take the IDPROM's |
33 | * machine type value into consideration too. I will fix this. | 33 | * machine type value into consideration too. I will fix this. |
34 | */ | 34 | */ |
35 | struct cpu_fp_info linux_sparc_fpu[] = { | 35 | static struct cpu_fp_info linux_sparc_fpu[] = { |
36 | { 0, 0, "Fujitsu MB86910 or Weitek WTL1164/5"}, | 36 | { 0, 0, "Fujitsu MB86910 or Weitek WTL1164/5"}, |
37 | { 0, 1, "Fujitsu MB86911 or Weitek WTL1164/5 or LSI L64831"}, | 37 | { 0, 1, "Fujitsu MB86911 or Weitek WTL1164/5 or LSI L64831"}, |
38 | { 0, 2, "LSI Logic L64802 or Texas Instruments ACT8847"}, | 38 | { 0, 2, "LSI Logic L64802 or Texas Instruments ACT8847"}, |
@@ -76,7 +76,7 @@ struct cpu_fp_info linux_sparc_fpu[] = { | |||
76 | 76 | ||
77 | #define NSPARCFPU ARRAY_SIZE(linux_sparc_fpu) | 77 | #define NSPARCFPU ARRAY_SIZE(linux_sparc_fpu) |
78 | 78 | ||
79 | struct cpu_iu_info linux_sparc_chips[] = { | 79 | static struct cpu_iu_info linux_sparc_chips[] = { |
80 | /* Sun4/100, 4/200, SLC */ | 80 | /* Sun4/100, 4/200, SLC */ |
81 | { 0, 0, "Fujitsu MB86900/1A or LSI L64831 SparcKIT-40"}, | 81 | { 0, 0, "Fujitsu MB86900/1A or LSI L64831 SparcKIT-40"}, |
82 | /* borned STP1012PGA */ | 82 | /* borned STP1012PGA */ |
diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c index d850785b2080..96344ff2bbe1 100644 --- a/arch/sparc/kernel/ebus.c +++ b/arch/sparc/kernel/ebus.c | |||
@@ -101,7 +101,7 @@ void __init fill_ebus_child(struct device_node *dp, | |||
101 | prom_printf("UGH: property for %s was %d, need < %d\n", | 101 | prom_printf("UGH: property for %s was %d, need < %d\n", |
102 | dev->prom_node->name, len, | 102 | dev->prom_node->name, len, |
103 | dev->parent->num_addrs); | 103 | dev->parent->num_addrs); |
104 | panic(__FUNCTION__); | 104 | panic(__func__); |
105 | } | 105 | } |
106 | 106 | ||
107 | /* XXX resource */ | 107 | /* XXX resource */ |
@@ -162,7 +162,7 @@ void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_device *d | |||
162 | prom_printf("UGH: proplen for %s was %d, need multiple of %d\n", | 162 | prom_printf("UGH: proplen for %s was %d, need multiple of %d\n", |
163 | dev->prom_node->name, len, | 163 | dev->prom_node->name, len, |
164 | (int)sizeof(struct linux_prom_registers)); | 164 | (int)sizeof(struct linux_prom_registers)); |
165 | panic(__FUNCTION__); | 165 | panic(__func__); |
166 | } | 166 | } |
167 | dev->num_addrs = len / sizeof(struct linux_prom_registers); | 167 | dev->num_addrs = len / sizeof(struct linux_prom_registers); |
168 | 168 | ||
@@ -324,7 +324,7 @@ void __init ebus_init(void) | |||
324 | regs = of_get_property(dp, "reg", &len); | 324 | regs = of_get_property(dp, "reg", &len); |
325 | if (!regs) { | 325 | if (!regs) { |
326 | prom_printf("%s: can't find reg property\n", | 326 | prom_printf("%s: can't find reg property\n", |
327 | __FUNCTION__); | 327 | __func__); |
328 | prom_halt(); | 328 | prom_halt(); |
329 | } | 329 | } |
330 | nreg = len / sizeof(struct linux_prom_pci_registers); | 330 | nreg = len / sizeof(struct linux_prom_pci_registers); |
diff --git a/arch/sparc/kernel/led.c b/arch/sparc/kernel/led.c index 313d1620ae8e..59e9344e7a0d 100644 --- a/arch/sparc/kernel/led.c +++ b/arch/sparc/kernel/led.c | |||
@@ -3,6 +3,9 @@ | |||
3 | #include <linux/init.h> | 3 | #include <linux/init.h> |
4 | #include <linux/proc_fs.h> | 4 | #include <linux/proc_fs.h> |
5 | #include <linux/string.h> | 5 | #include <linux/string.h> |
6 | #include <linux/jiffies.h> | ||
7 | #include <linux/timer.h> | ||
8 | #include <linux/uaccess.h> | ||
6 | 9 | ||
7 | #include <asm/auxio.h> | 10 | #include <asm/auxio.h> |
8 | 11 | ||
diff --git a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c index 0bd69d0b5cd7..70c0dd22491d 100644 --- a/arch/sparc/kernel/process.c +++ b/arch/sparc/kernel/process.c | |||
@@ -139,8 +139,6 @@ void cpu_idle(void) | |||
139 | 139 | ||
140 | #endif | 140 | #endif |
141 | 141 | ||
142 | extern char reboot_command []; | ||
143 | |||
144 | /* XXX cli/sti -> local_irq_xxx here, check this works once SMP is fixed. */ | 142 | /* XXX cli/sti -> local_irq_xxx here, check this works once SMP is fixed. */ |
145 | void machine_halt(void) | 143 | void machine_halt(void) |
146 | { | 144 | { |
diff --git a/arch/sparc/kernel/una_asm.S b/arch/sparc/kernel/una_asm.S new file mode 100644 index 000000000000..8cc03458eb7e --- /dev/null +++ b/arch/sparc/kernel/una_asm.S | |||
@@ -0,0 +1,153 @@ | |||
1 | /* una_asm.S: Kernel unaligned trap assembler helpers. | ||
2 | * | ||
3 | * Copyright (C) 1996,2005,2008 David S. Miller (davem@davemloft.net) | ||
4 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | ||
5 | */ | ||
6 | |||
7 | #include <linux/errno.h> | ||
8 | |||
9 | .text | ||
10 | |||
11 | retl_efault: | ||
12 | retl | ||
13 | mov -EFAULT, %o0 | ||
14 | |||
15 | /* int __do_int_store(unsigned long *dst_addr, int size, | ||
16 | * unsigned long *src_val) | ||
17 | * | ||
18 | * %o0 = dest_addr | ||
19 | * %o1 = size | ||
20 | * %o2 = src_val | ||
21 | * | ||
22 | * Return '0' on success, -EFAULT on failure. | ||
23 | */ | ||
24 | .globl __do_int_store | ||
25 | __do_int_store: | ||
26 | ld [%o2], %g1 | ||
27 | cmp %1, 2 | ||
28 | be 2f | ||
29 | cmp %1, 4 | ||
30 | be 1f | ||
31 | srl %g1, 24, %g2 | ||
32 | srl %g1, 16, %g7 | ||
33 | 4: stb %g2, [%o0] | ||
34 | srl %g1, 8, %g2 | ||
35 | 5: stb %g7, [%o0 + 1] | ||
36 | ld [%o2 + 4], %g7 | ||
37 | 6: stb %g2, [%o0 + 2] | ||
38 | srl %g7, 24, %g2 | ||
39 | 7: stb %g1, [%o0 + 3] | ||
40 | srl %g7, 16, %g1 | ||
41 | 8: stb %g2, [%o0 + 4] | ||
42 | srl %g7, 8, %g2 | ||
43 | 9: stb %g1, [%o0 + 5] | ||
44 | 10: stb %g2, [%o0 + 6] | ||
45 | b 0f | ||
46 | 11: stb %g7, [%o0 + 7] | ||
47 | 1: srl %g1, 16, %g7 | ||
48 | 12: stb %g2, [%o0] | ||
49 | srl %g1, 8, %g2 | ||
50 | 13: stb %g7, [%o0 + 1] | ||
51 | 14: stb %g2, [%o0 + 2] | ||
52 | b 0f | ||
53 | 15: stb %g1, [%o0 + 3] | ||
54 | 2: srl %g1, 8, %g2 | ||
55 | 16: stb %g2, [%o0] | ||
56 | 17: stb %g1, [%o0 + 1] | ||
57 | 0: retl | ||
58 | mov 0, %o0 | ||
59 | |||
60 | .section __ex_table,#alloc | ||
61 | .word 4b, retl_efault | ||
62 | .word 5b, retl_efault | ||
63 | .word 6b, retl_efault | ||
64 | .word 7b, retl_efault | ||
65 | .word 8b, retl_efault | ||
66 | .word 9b, retl_efault | ||
67 | .word 10b, retl_efault | ||
68 | .word 11b, retl_efault | ||
69 | .word 12b, retl_efault | ||
70 | .word 13b, retl_efault | ||
71 | .word 14b, retl_efault | ||
72 | .word 15b, retl_efault | ||
73 | .word 16b, retl_efault | ||
74 | .word 17b, retl_efault | ||
75 | .previous | ||
76 | |||
77 | /* int do_int_load(unsigned long *dest_reg, int size, | ||
78 | * unsigned long *saddr, int is_signed) | ||
79 | * | ||
80 | * %o0 = dest_reg | ||
81 | * %o1 = size | ||
82 | * %o2 = saddr | ||
83 | * %o3 = is_signed | ||
84 | * | ||
85 | * Return '0' on success, -EFAULT on failure. | ||
86 | */ | ||
87 | .globl do_int_load | ||
88 | do_int_load: | ||
89 | cmp %o1, 8 | ||
90 | be 9f | ||
91 | cmp %o1, 4 | ||
92 | be 6f | ||
93 | 4: ldub [%o2], %g1 | ||
94 | 5: ldub [%o2 + 1], %g2 | ||
95 | sll %g1, 8, %g1 | ||
96 | tst %o3 | ||
97 | be 3f | ||
98 | or %g1, %g2, %g1 | ||
99 | sll %g1, 16, %g1 | ||
100 | sra %g1, 16, %g1 | ||
101 | 3: b 0f | ||
102 | st %g1, [%o0] | ||
103 | 6: ldub [%o2 + 1], %g2 | ||
104 | sll %g1, 24, %g1 | ||
105 | 7: ldub [%o2 + 2], %g7 | ||
106 | sll %g2, 16, %g2 | ||
107 | 8: ldub [%o2 + 3], %g3 | ||
108 | sll %g7, 8, %g7 | ||
109 | or %g3, %g2, %g3 | ||
110 | or %g7, %g3, %g7 | ||
111 | or %g1, %g7, %g1 | ||
112 | b 0f | ||
113 | st %g1, [%o0] | ||
114 | 9: ldub [%o2], %g1 | ||
115 | 10: ldub [%o2 + 1], %g2 | ||
116 | sll %g1, 24, %g1 | ||
117 | 11: ldub [%o2 + 2], %g7 | ||
118 | sll %g2, 16, %g2 | ||
119 | 12: ldub [%o2 + 3], %g3 | ||
120 | sll %g7, 8, %g7 | ||
121 | or %g1, %g2, %g1 | ||
122 | or %g7, %g3, %g7 | ||
123 | or %g1, %g7, %g7 | ||
124 | 13: ldub [%o2 + 4], %g1 | ||
125 | st %g7, [%o0] | ||
126 | 14: ldub [%o2 + 5], %g2 | ||
127 | sll %g1, 24, %g1 | ||
128 | 15: ldub [%o2 + 6], %g7 | ||
129 | sll %g2, 16, %g2 | ||
130 | 16: ldub [%o2 + 7], %g3 | ||
131 | sll %g7, 8, %g7 | ||
132 | or %g1, %g2, %g1 | ||
133 | or %g7, %g3, %g7 | ||
134 | or %g1, %g7, %g7 | ||
135 | st %g7, [%o0 + 4] | ||
136 | 0: retl | ||
137 | mov 0, %o0 | ||
138 | |||
139 | .section __ex_table,#alloc | ||
140 | .word 4b, retl_efault | ||
141 | .word 5b, retl_efault | ||
142 | .word 6b, retl_efault | ||
143 | .word 7b, retl_efault | ||
144 | .word 8b, retl_efault | ||
145 | .word 9b, retl_efault | ||
146 | .word 10b, retl_efault | ||
147 | .word 11b, retl_efault | ||
148 | .word 12b, retl_efault | ||
149 | .word 13b, retl_efault | ||
150 | .word 14b, retl_efault | ||
151 | .word 15b, retl_efault | ||
152 | .word 16b, retl_efault | ||
153 | .previous | ||
diff --git a/arch/sparc/kernel/unaligned.c b/arch/sparc/kernel/unaligned.c index a6330fbc9dd9..33857be16661 100644 --- a/arch/sparc/kernel/unaligned.c +++ b/arch/sparc/kernel/unaligned.c | |||
@@ -175,157 +175,31 @@ static void unaligned_panic(char *str) | |||
175 | panic(str); | 175 | panic(str); |
176 | } | 176 | } |
177 | 177 | ||
178 | #define do_integer_load(dest_reg, size, saddr, is_signed, errh) ({ \ | 178 | /* una_asm.S */ |
179 | __asm__ __volatile__ ( \ | 179 | extern int do_int_load(unsigned long *dest_reg, int size, |
180 | "cmp %1, 8\n\t" \ | 180 | unsigned long *saddr, int is_signed); |
181 | "be 9f\n\t" \ | 181 | extern int __do_int_store(unsigned long *dst_addr, int size, |
182 | " cmp %1, 4\n\t" \ | 182 | unsigned long *src_val); |
183 | "be 6f\n" \ | 183 | |
184 | "4:\t" " ldub [%2], %%l1\n" \ | 184 | static int do_int_store(int reg_num, int size, unsigned long *dst_addr, |
185 | "5:\t" "ldub [%2 + 1], %%l2\n\t" \ | 185 | struct pt_regs *regs) |
186 | "sll %%l1, 8, %%l1\n\t" \ | 186 | { |
187 | "tst %3\n\t" \ | 187 | unsigned long zero[2] = { 0, 0 }; |
188 | "be 3f\n\t" \ | 188 | unsigned long *src_val; |
189 | " add %%l1, %%l2, %%l1\n\t" \ | 189 | |
190 | "sll %%l1, 16, %%l1\n\t" \ | 190 | if (reg_num) |
191 | "sra %%l1, 16, %%l1\n" \ | 191 | src_val = fetch_reg_addr(reg_num, regs); |
192 | "3:\t" "b 0f\n\t" \ | 192 | else { |
193 | " st %%l1, [%0]\n" \ | 193 | src_val = &zero[0]; |
194 | "6:\t" "ldub [%2 + 1], %%l2\n\t" \ | 194 | if (size == 8) |
195 | "sll %%l1, 24, %%l1\n" \ | 195 | zero[1] = fetch_reg(1, regs); |
196 | "7:\t" "ldub [%2 + 2], %%g7\n\t" \ | 196 | } |
197 | "sll %%l2, 16, %%l2\n" \ | 197 | return __do_int_store(dst_addr, size, src_val); |
198 | "8:\t" "ldub [%2 + 3], %%g1\n\t" \ | 198 | } |
199 | "sll %%g7, 8, %%g7\n\t" \ | ||
200 | "or %%l1, %%l2, %%l1\n\t" \ | ||
201 | "or %%g7, %%g1, %%g7\n\t" \ | ||
202 | "or %%l1, %%g7, %%l1\n\t" \ | ||
203 | "b 0f\n\t" \ | ||
204 | " st %%l1, [%0]\n" \ | ||
205 | "9:\t" "ldub [%2], %%l1\n" \ | ||
206 | "10:\t" "ldub [%2 + 1], %%l2\n\t" \ | ||
207 | "sll %%l1, 24, %%l1\n" \ | ||
208 | "11:\t" "ldub [%2 + 2], %%g7\n\t" \ | ||
209 | "sll %%l2, 16, %%l2\n" \ | ||
210 | "12:\t" "ldub [%2 + 3], %%g1\n\t" \ | ||
211 | "sll %%g7, 8, %%g7\n\t" \ | ||
212 | "or %%l1, %%l2, %%l1\n\t" \ | ||
213 | "or %%g7, %%g1, %%g7\n\t" \ | ||
214 | "or %%l1, %%g7, %%g7\n" \ | ||
215 | "13:\t" "ldub [%2 + 4], %%l1\n\t" \ | ||
216 | "st %%g7, [%0]\n" \ | ||
217 | "14:\t" "ldub [%2 + 5], %%l2\n\t" \ | ||
218 | "sll %%l1, 24, %%l1\n" \ | ||
219 | "15:\t" "ldub [%2 + 6], %%g7\n\t" \ | ||
220 | "sll %%l2, 16, %%l2\n" \ | ||
221 | "16:\t" "ldub [%2 + 7], %%g1\n\t" \ | ||
222 | "sll %%g7, 8, %%g7\n\t" \ | ||
223 | "or %%l1, %%l2, %%l1\n\t" \ | ||
224 | "or %%g7, %%g1, %%g7\n\t" \ | ||
225 | "or %%l1, %%g7, %%g7\n\t" \ | ||
226 | "st %%g7, [%0 + 4]\n" \ | ||
227 | "0:\n\n\t" \ | ||
228 | ".section __ex_table,#alloc\n\t" \ | ||
229 | ".word 4b, " #errh "\n\t" \ | ||
230 | ".word 5b, " #errh "\n\t" \ | ||
231 | ".word 6b, " #errh "\n\t" \ | ||
232 | ".word 7b, " #errh "\n\t" \ | ||
233 | ".word 8b, " #errh "\n\t" \ | ||
234 | ".word 9b, " #errh "\n\t" \ | ||
235 | ".word 10b, " #errh "\n\t" \ | ||
236 | ".word 11b, " #errh "\n\t" \ | ||
237 | ".word 12b, " #errh "\n\t" \ | ||
238 | ".word 13b, " #errh "\n\t" \ | ||
239 | ".word 14b, " #errh "\n\t" \ | ||
240 | ".word 15b, " #errh "\n\t" \ | ||
241 | ".word 16b, " #errh "\n\n\t" \ | ||
242 | ".previous\n\t" \ | ||
243 | : : "r" (dest_reg), "r" (size), "r" (saddr), "r" (is_signed) \ | ||
244 | : "l1", "l2", "g7", "g1", "cc"); \ | ||
245 | }) | ||
246 | |||
247 | #define store_common(dst_addr, size, src_val, errh) ({ \ | ||
248 | __asm__ __volatile__ ( \ | ||
249 | "ld [%2], %%l1\n" \ | ||
250 | "cmp %1, 2\n\t" \ | ||
251 | "be 2f\n\t" \ | ||
252 | " cmp %1, 4\n\t" \ | ||
253 | "be 1f\n\t" \ | ||
254 | " srl %%l1, 24, %%l2\n\t" \ | ||
255 | "srl %%l1, 16, %%g7\n" \ | ||
256 | "4:\t" "stb %%l2, [%0]\n\t" \ | ||
257 | "srl %%l1, 8, %%l2\n" \ | ||
258 | "5:\t" "stb %%g7, [%0 + 1]\n\t" \ | ||
259 | "ld [%2 + 4], %%g7\n" \ | ||
260 | "6:\t" "stb %%l2, [%0 + 2]\n\t" \ | ||
261 | "srl %%g7, 24, %%l2\n" \ | ||
262 | "7:\t" "stb %%l1, [%0 + 3]\n\t" \ | ||
263 | "srl %%g7, 16, %%l1\n" \ | ||
264 | "8:\t" "stb %%l2, [%0 + 4]\n\t" \ | ||
265 | "srl %%g7, 8, %%l2\n" \ | ||
266 | "9:\t" "stb %%l1, [%0 + 5]\n" \ | ||
267 | "10:\t" "stb %%l2, [%0 + 6]\n\t" \ | ||
268 | "b 0f\n" \ | ||
269 | "11:\t" " stb %%g7, [%0 + 7]\n" \ | ||
270 | "1:\t" "srl %%l1, 16, %%g7\n" \ | ||
271 | "12:\t" "stb %%l2, [%0]\n\t" \ | ||
272 | "srl %%l1, 8, %%l2\n" \ | ||
273 | "13:\t" "stb %%g7, [%0 + 1]\n" \ | ||
274 | "14:\t" "stb %%l2, [%0 + 2]\n\t" \ | ||
275 | "b 0f\n" \ | ||
276 | "15:\t" " stb %%l1, [%0 + 3]\n" \ | ||
277 | "2:\t" "srl %%l1, 8, %%l2\n" \ | ||
278 | "16:\t" "stb %%l2, [%0]\n" \ | ||
279 | "17:\t" "stb %%l1, [%0 + 1]\n" \ | ||
280 | "0:\n\n\t" \ | ||
281 | ".section __ex_table,#alloc\n\t" \ | ||
282 | ".word 4b, " #errh "\n\t" \ | ||
283 | ".word 5b, " #errh "\n\t" \ | ||
284 | ".word 6b, " #errh "\n\t" \ | ||
285 | ".word 7b, " #errh "\n\t" \ | ||
286 | ".word 8b, " #errh "\n\t" \ | ||
287 | ".word 9b, " #errh "\n\t" \ | ||
288 | ".word 10b, " #errh "\n\t" \ | ||
289 | ".word 11b, " #errh "\n\t" \ | ||
290 | ".word 12b, " #errh "\n\t" \ | ||
291 | ".word 13b, " #errh "\n\t" \ | ||
292 | ".word 14b, " #errh "\n\t" \ | ||
293 | ".word 15b, " #errh "\n\t" \ | ||
294 | ".word 16b, " #errh "\n\t" \ | ||
295 | ".word 17b, " #errh "\n\n\t" \ | ||
296 | ".previous\n\t" \ | ||
297 | : : "r" (dst_addr), "r" (size), "r" (src_val) \ | ||
298 | : "l1", "l2", "g7", "g1", "cc"); \ | ||
299 | }) | ||
300 | |||
301 | #define do_integer_store(reg_num, size, dst_addr, regs, errh) ({ \ | ||
302 | unsigned long *src_val; \ | ||
303 | static unsigned long zero[2] = { 0, }; \ | ||
304 | \ | ||
305 | if (reg_num) src_val = fetch_reg_addr(reg_num, regs); \ | ||
306 | else { \ | ||
307 | src_val = &zero[0]; \ | ||
308 | if (size == 8) \ | ||
309 | zero[1] = fetch_reg(1, regs); \ | ||
310 | } \ | ||
311 | store_common(dst_addr, size, src_val, errh); \ | ||
312 | }) | ||
313 | 199 | ||
314 | extern void smp_capture(void); | 200 | extern void smp_capture(void); |
315 | extern void smp_release(void); | 201 | extern void smp_release(void); |
316 | 202 | ||
317 | #define do_atomic(srcdest_reg, mem, errh) ({ \ | ||
318 | unsigned long flags, tmp; \ | ||
319 | \ | ||
320 | smp_capture(); \ | ||
321 | local_irq_save(flags); \ | ||
322 | tmp = *srcdest_reg; \ | ||
323 | do_integer_load(srcdest_reg, 4, mem, 0, errh); \ | ||
324 | store_common(mem, 4, &tmp, errh); \ | ||
325 | local_irq_restore(flags); \ | ||
326 | smp_release(); \ | ||
327 | }) | ||
328 | |||
329 | static inline void advance(struct pt_regs *regs) | 203 | static inline void advance(struct pt_regs *regs) |
330 | { | 204 | { |
331 | regs->pc = regs->npc; | 205 | regs->pc = regs->npc; |
@@ -342,9 +216,7 @@ static inline int ok_for_kernel(unsigned int insn) | |||
342 | return !floating_point_load_or_store_p(insn); | 216 | return !floating_point_load_or_store_p(insn); |
343 | } | 217 | } |
344 | 218 | ||
345 | void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn) __asm__ ("kernel_mna_trap_fault"); | 219 | static void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn) |
346 | |||
347 | void kernel_mna_trap_fault(struct pt_regs *regs, unsigned int insn) | ||
348 | { | 220 | { |
349 | unsigned long g2 = regs->u_regs [UREG_G2]; | 221 | unsigned long g2 = regs->u_regs [UREG_G2]; |
350 | unsigned long fixup = search_extables_range(regs->pc, &g2); | 222 | unsigned long fixup = search_extables_range(regs->pc, &g2); |
@@ -379,48 +251,34 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) | |||
379 | printk("Unsupported unaligned load/store trap for kernel at <%08lx>.\n", | 251 | printk("Unsupported unaligned load/store trap for kernel at <%08lx>.\n", |
380 | regs->pc); | 252 | regs->pc); |
381 | unaligned_panic("Wheee. Kernel does fpu/atomic unaligned load/store."); | 253 | unaligned_panic("Wheee. Kernel does fpu/atomic unaligned load/store."); |
382 | |||
383 | __asm__ __volatile__ ("\n" | ||
384 | "kernel_unaligned_trap_fault:\n\t" | ||
385 | "mov %0, %%o0\n\t" | ||
386 | "call kernel_mna_trap_fault\n\t" | ||
387 | " mov %1, %%o1\n\t" | ||
388 | : | ||
389 | : "r" (regs), "r" (insn) | ||
390 | : "o0", "o1", "o2", "o3", "o4", "o5", "o7", | ||
391 | "g1", "g2", "g3", "g4", "g5", "g7", "cc"); | ||
392 | } else { | 254 | } else { |
393 | unsigned long addr = compute_effective_address(regs, insn); | 255 | unsigned long addr = compute_effective_address(regs, insn); |
256 | int err; | ||
394 | 257 | ||
395 | #ifdef DEBUG_MNA | 258 | #ifdef DEBUG_MNA |
396 | printk("KMNA: pc=%08lx [dir=%s addr=%08lx size=%d] retpc[%08lx]\n", | 259 | printk("KMNA: pc=%08lx [dir=%s addr=%08lx size=%d] retpc[%08lx]\n", |
397 | regs->pc, dirstrings[dir], addr, size, regs->u_regs[UREG_RETPC]); | 260 | regs->pc, dirstrings[dir], addr, size, regs->u_regs[UREG_RETPC]); |
398 | #endif | 261 | #endif |
399 | switch(dir) { | 262 | switch (dir) { |
400 | case load: | 263 | case load: |
401 | do_integer_load(fetch_reg_addr(((insn>>25)&0x1f), regs), | 264 | err = do_int_load(fetch_reg_addr(((insn>>25)&0x1f), |
402 | size, (unsigned long *) addr, | 265 | regs), |
403 | decode_signedness(insn), | 266 | size, (unsigned long *) addr, |
404 | kernel_unaligned_trap_fault); | 267 | decode_signedness(insn)); |
405 | break; | 268 | break; |
406 | 269 | ||
407 | case store: | 270 | case store: |
408 | do_integer_store(((insn>>25)&0x1f), size, | 271 | err = do_int_store(((insn>>25)&0x1f), size, |
409 | (unsigned long *) addr, regs, | 272 | (unsigned long *) addr, regs); |
410 | kernel_unaligned_trap_fault); | ||
411 | break; | 273 | break; |
412 | #if 0 /* unsupported */ | ||
413 | case both: | ||
414 | do_atomic(fetch_reg_addr(((insn>>25)&0x1f), regs), | ||
415 | (unsigned long *) addr, | ||
416 | kernel_unaligned_trap_fault); | ||
417 | break; | ||
418 | #endif | ||
419 | default: | 274 | default: |
420 | panic("Impossible kernel unaligned trap."); | 275 | panic("Impossible kernel unaligned trap."); |
421 | /* Not reached... */ | 276 | /* Not reached... */ |
422 | } | 277 | } |
423 | advance(regs); | 278 | if (err) |
279 | kernel_mna_trap_fault(regs, insn); | ||
280 | else | ||
281 | advance(regs); | ||
424 | } | 282 | } |
425 | } | 283 | } |
426 | 284 | ||
@@ -459,9 +317,7 @@ static inline int ok_for_user(struct pt_regs *regs, unsigned int insn, | |||
459 | return 0; | 317 | return 0; |
460 | } | 318 | } |
461 | 319 | ||
462 | void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn) __asm__ ("user_mna_trap_fault"); | 320 | static void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn) |
463 | |||
464 | void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn) | ||
465 | { | 321 | { |
466 | siginfo_t info; | 322 | siginfo_t info; |
467 | 323 | ||
@@ -485,7 +341,7 @@ asmlinkage void user_unaligned_trap(struct pt_regs *regs, unsigned int insn) | |||
485 | if(!ok_for_user(regs, insn, dir)) { | 341 | if(!ok_for_user(regs, insn, dir)) { |
486 | goto kill_user; | 342 | goto kill_user; |
487 | } else { | 343 | } else { |
488 | int size = decode_access_size(insn); | 344 | int err, size = decode_access_size(insn); |
489 | unsigned long addr; | 345 | unsigned long addr; |
490 | 346 | ||
491 | if(floating_point_load_or_store_p(insn)) { | 347 | if(floating_point_load_or_store_p(insn)) { |
@@ -496,48 +352,34 @@ asmlinkage void user_unaligned_trap(struct pt_regs *regs, unsigned int insn) | |||
496 | addr = compute_effective_address(regs, insn); | 352 | addr = compute_effective_address(regs, insn); |
497 | switch(dir) { | 353 | switch(dir) { |
498 | case load: | 354 | case load: |
499 | do_integer_load(fetch_reg_addr(((insn>>25)&0x1f), regs), | 355 | err = do_int_load(fetch_reg_addr(((insn>>25)&0x1f), |
500 | size, (unsigned long *) addr, | 356 | regs), |
501 | decode_signedness(insn), | 357 | size, (unsigned long *) addr, |
502 | user_unaligned_trap_fault); | 358 | decode_signedness(insn)); |
503 | break; | 359 | break; |
504 | 360 | ||
505 | case store: | 361 | case store: |
506 | do_integer_store(((insn>>25)&0x1f), size, | 362 | err = do_int_store(((insn>>25)&0x1f), size, |
507 | (unsigned long *) addr, regs, | 363 | (unsigned long *) addr, regs); |
508 | user_unaligned_trap_fault); | ||
509 | break; | 364 | break; |
510 | 365 | ||
511 | case both: | 366 | case both: |
512 | #if 0 /* unsupported */ | ||
513 | do_atomic(fetch_reg_addr(((insn>>25)&0x1f), regs), | ||
514 | (unsigned long *) addr, | ||
515 | user_unaligned_trap_fault); | ||
516 | #else | ||
517 | /* | 367 | /* |
518 | * This was supported in 2.4. However, we question | 368 | * This was supported in 2.4. However, we question |
519 | * the value of SWAP instruction across word boundaries. | 369 | * the value of SWAP instruction across word boundaries. |
520 | */ | 370 | */ |
521 | printk("Unaligned SWAP unsupported.\n"); | 371 | printk("Unaligned SWAP unsupported.\n"); |
522 | goto kill_user; | 372 | err = -EFAULT; |
523 | #endif | ||
524 | break; | 373 | break; |
525 | 374 | ||
526 | default: | 375 | default: |
527 | unaligned_panic("Impossible user unaligned trap."); | 376 | unaligned_panic("Impossible user unaligned trap."); |
528 | |||
529 | __asm__ __volatile__ ("\n" | ||
530 | "user_unaligned_trap_fault:\n\t" | ||
531 | "mov %0, %%o0\n\t" | ||
532 | "call user_mna_trap_fault\n\t" | ||
533 | " mov %1, %%o1\n\t" | ||
534 | : | ||
535 | : "r" (regs), "r" (insn) | ||
536 | : "o0", "o1", "o2", "o3", "o4", "o5", "o7", | ||
537 | "g1", "g2", "g3", "g4", "g5", "g7", "cc"); | ||
538 | goto out; | 377 | goto out; |
539 | } | 378 | } |
540 | advance(regs); | 379 | if (err) |
380 | goto kill_user; | ||
381 | else | ||
382 | advance(regs); | ||
541 | goto out; | 383 | goto out; |
542 | } | 384 | } |
543 | 385 | ||
diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig index 3af378ddb6ae..463d1be32c98 100644 --- a/arch/sparc64/Kconfig +++ b/arch/sparc64/Kconfig | |||
@@ -10,6 +10,7 @@ config SPARC | |||
10 | default y | 10 | default y |
11 | select HAVE_OPROFILE | 11 | select HAVE_OPROFILE |
12 | select HAVE_KPROBES | 12 | select HAVE_KPROBES |
13 | select HAVE_KRETPROBES | ||
13 | 14 | ||
14 | config SPARC64 | 15 | config SPARC64 |
15 | bool | 16 | bool |
diff --git a/arch/sparc64/kernel/cpu.c b/arch/sparc64/kernel/cpu.c index e43db73f2b91..dd5d28e3d798 100644 --- a/arch/sparc64/kernel/cpu.c +++ b/arch/sparc64/kernel/cpu.c | |||
@@ -30,7 +30,7 @@ struct cpu_fp_info { | |||
30 | char* fp_name; | 30 | char* fp_name; |
31 | }; | 31 | }; |
32 | 32 | ||
33 | struct cpu_fp_info linux_sparc_fpu[] = { | 33 | static struct cpu_fp_info linux_sparc_fpu[] = { |
34 | { 0x17, 0x10, 0, "UltraSparc I integrated FPU"}, | 34 | { 0x17, 0x10, 0, "UltraSparc I integrated FPU"}, |
35 | { 0x22, 0x10, 0, "UltraSparc I integrated FPU"}, | 35 | { 0x22, 0x10, 0, "UltraSparc I integrated FPU"}, |
36 | { 0x17, 0x11, 0, "UltraSparc II integrated FPU"}, | 36 | { 0x17, 0x11, 0, "UltraSparc II integrated FPU"}, |
@@ -46,7 +46,7 @@ struct cpu_fp_info linux_sparc_fpu[] = { | |||
46 | 46 | ||
47 | #define NSPARCFPU ARRAY_SIZE(linux_sparc_fpu) | 47 | #define NSPARCFPU ARRAY_SIZE(linux_sparc_fpu) |
48 | 48 | ||
49 | struct cpu_iu_info linux_sparc_chips[] = { | 49 | static struct cpu_iu_info linux_sparc_chips[] = { |
50 | { 0x17, 0x10, "TI UltraSparc I (SpitFire)"}, | 50 | { 0x17, 0x10, "TI UltraSparc I (SpitFire)"}, |
51 | { 0x22, 0x10, "TI UltraSparc I (SpitFire)"}, | 51 | { 0x22, 0x10, "TI UltraSparc I (SpitFire)"}, |
52 | { 0x17, 0x11, "TI UltraSparc II (BlackBird)"}, | 52 | { 0x17, 0x11, "TI UltraSparc II (BlackBird)"}, |
diff --git a/arch/sparc64/kernel/ds.c b/arch/sparc64/kernel/ds.c index eeb5a2fc788d..bd76482077be 100644 --- a/arch/sparc64/kernel/ds.c +++ b/arch/sparc64/kernel/ds.c | |||
@@ -525,10 +525,10 @@ static void dr_cpu_mark(struct ds_data *resp, int cpu, int ncpus, | |||
525 | } | 525 | } |
526 | } | 526 | } |
527 | 527 | ||
528 | static int dr_cpu_configure(struct ds_info *dp, | 528 | static int __cpuinit dr_cpu_configure(struct ds_info *dp, |
529 | struct ds_cap_state *cp, | 529 | struct ds_cap_state *cp, |
530 | u64 req_num, | 530 | u64 req_num, |
531 | cpumask_t *mask) | 531 | cpumask_t *mask) |
532 | { | 532 | { |
533 | struct ds_data *resp; | 533 | struct ds_data *resp; |
534 | int resp_len, ncpus, cpu; | 534 | int resp_len, ncpus, cpu; |
@@ -623,9 +623,9 @@ static int dr_cpu_unconfigure(struct ds_info *dp, | |||
623 | return 0; | 623 | return 0; |
624 | } | 624 | } |
625 | 625 | ||
626 | static void dr_cpu_data(struct ds_info *dp, | 626 | static void __cpuinit dr_cpu_data(struct ds_info *dp, |
627 | struct ds_cap_state *cp, | 627 | struct ds_cap_state *cp, |
628 | void *buf, int len) | 628 | void *buf, int len) |
629 | { | 629 | { |
630 | struct ds_data *data = buf; | 630 | struct ds_data *data = buf; |
631 | struct dr_cpu_tag *tag = (struct dr_cpu_tag *) (data + 1); | 631 | struct dr_cpu_tag *tag = (struct dr_cpu_tag *) (data + 1); |
diff --git a/arch/sparc64/kernel/mdesc.c b/arch/sparc64/kernel/mdesc.c index 856659bb1311..910083589569 100644 --- a/arch/sparc64/kernel/mdesc.c +++ b/arch/sparc64/kernel/mdesc.c | |||
@@ -758,7 +758,7 @@ static void __devinit get_mondo_data(struct mdesc_handle *hp, u64 mp, | |||
758 | get_one_mondo_bits(val, &tb->nonresum_qmask, 2); | 758 | get_one_mondo_bits(val, &tb->nonresum_qmask, 2); |
759 | } | 759 | } |
760 | 760 | ||
761 | void __devinit mdesc_fill_in_cpu_data(cpumask_t mask) | 761 | void __cpuinit mdesc_fill_in_cpu_data(cpumask_t mask) |
762 | { | 762 | { |
763 | struct mdesc_handle *hp = mdesc_grab(); | 763 | struct mdesc_handle *hp = mdesc_grab(); |
764 | u64 mp; | 764 | u64 mp; |
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c index 2aafce7dfc0e..e116e38b160e 100644 --- a/arch/sparc64/kernel/process.c +++ b/arch/sparc64/kernel/process.c | |||
@@ -114,8 +114,6 @@ void cpu_idle(void) | |||
114 | } | 114 | } |
115 | } | 115 | } |
116 | 116 | ||
117 | extern char reboot_command []; | ||
118 | |||
119 | void machine_halt(void) | 117 | void machine_halt(void) |
120 | { | 118 | { |
121 | sstate_halt(); | 119 | sstate_halt(); |
diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c index e2027f27c0fe..2650d0d33ac2 100644 --- a/arch/sparc64/mm/fault.c +++ b/arch/sparc64/mm/fault.c | |||
@@ -244,16 +244,8 @@ static void do_kernel_fault(struct pt_regs *regs, int si_code, int fault_code, | |||
244 | if (regs->tstate & TSTATE_PRIV) { | 244 | if (regs->tstate & TSTATE_PRIV) { |
245 | const struct exception_table_entry *entry; | 245 | const struct exception_table_entry *entry; |
246 | 246 | ||
247 | if (asi == ASI_P && (insn & 0xc0800000) == 0xc0800000) { | 247 | entry = search_exception_tables(regs->tpc); |
248 | if (insn & 0x2000) | 248 | if (entry) { |
249 | asi = (regs->tstate >> 24); | ||
250 | else | ||
251 | asi = (insn >> 5); | ||
252 | } | ||
253 | |||
254 | /* Look in asi.h: All _S asis have LS bit set */ | ||
255 | if ((asi & 0x1) && | ||
256 | (entry = search_exception_tables(regs->tpc))) { | ||
257 | regs->tpc = entry->fixup; | 249 | regs->tpc = entry->fixup; |
258 | regs->tnpc = regs->tpc + 4; | 250 | regs->tnpc = regs->tpc + 4; |
259 | return; | 251 | return; |
@@ -294,7 +286,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) | |||
294 | unsigned long tpc = regs->tpc; | 286 | unsigned long tpc = regs->tpc; |
295 | 287 | ||
296 | /* Sanity check the PC. */ | 288 | /* Sanity check the PC. */ |
297 | if ((tpc >= KERNBASE && tpc < (unsigned long) _etext) || | 289 | if ((tpc >= KERNBASE && tpc < (unsigned long) __init_end) || |
298 | (tpc >= MODULES_VADDR && tpc < MODULES_END)) { | 290 | (tpc >= MODULES_VADDR && tpc < MODULES_END)) { |
299 | /* Valid, no problems... */ | 291 | /* Valid, no problems... */ |
300 | } else { | 292 | } else { |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 9e6bca266d88..b5c30416fdac 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -1010,7 +1010,8 @@ static struct linux_prom64_registers pall[MAX_BANKS] __initdata; | |||
1010 | static int pall_ents __initdata; | 1010 | static int pall_ents __initdata; |
1011 | 1011 | ||
1012 | #ifdef CONFIG_DEBUG_PAGEALLOC | 1012 | #ifdef CONFIG_DEBUG_PAGEALLOC |
1013 | static unsigned long kernel_map_range(unsigned long pstart, unsigned long pend, pgprot_t prot) | 1013 | static unsigned long __ref kernel_map_range(unsigned long pstart, |
1014 | unsigned long pend, pgprot_t prot) | ||
1014 | { | 1015 | { |
1015 | unsigned long vstart = PAGE_OFFSET + pstart; | 1016 | unsigned long vstart = PAGE_OFFSET + pstart; |
1016 | unsigned long vend = PAGE_OFFSET + pend; | 1017 | unsigned long vend = PAGE_OFFSET + pend; |
diff --git a/arch/sparc64/solaris/conv.h b/arch/sparc64/solaris/conv.h index 5faf59a9de39..50e58232cf2b 100644 --- a/arch/sparc64/solaris/conv.h +++ b/arch/sparc64/solaris/conv.h | |||
@@ -28,7 +28,7 @@ extern unsigned sunos_sys_table[]; | |||
28 | #define SUNOS(x) ((long)sunos_sys_table[x]) | 28 | #define SUNOS(x) ((long)sunos_sys_table[x]) |
29 | 29 | ||
30 | #ifdef DEBUG_SOLARIS | 30 | #ifdef DEBUG_SOLARIS |
31 | #define SOLD(s) printk("%s,%d,%s(): %s\n",__FILE__,__LINE__,__FUNCTION__,(s)) | 31 | #define SOLD(s) printk("%s,%d,%s(): %s\n",__FILE__,__LINE__,__func__,(s)) |
32 | #define SOLDD(s) printk("solaris: "); printk s | 32 | #define SOLDD(s) printk("solaris: "); printk s |
33 | #else | 33 | #else |
34 | #define SOLD(s) | 34 | #define SOLD(s) |
diff --git a/arch/sparc64/solaris/timod.c b/arch/sparc64/solaris/timod.c index f53123c02c2b..15234fcd191a 100644 --- a/arch/sparc64/solaris/timod.c +++ b/arch/sparc64/solaris/timod.c | |||
@@ -81,7 +81,7 @@ void mykfree(void *p) | |||
81 | #define MKCTL_MAGIC 0xDEADBABEBADC0DEDL | 81 | #define MKCTL_MAGIC 0xDEADBABEBADC0DEDL |
82 | #define PUT_MAGIC(a,m) do{(*(u64*)(a))=(m);}while(0) | 82 | #define PUT_MAGIC(a,m) do{(*(u64*)(a))=(m);}while(0) |
83 | #define SCHECK_MAGIC(a,m) do{if((*(u64*)(a))!=(m))printk("%s,%u,%s(): magic %08x at %p corrupted!\n",\ | 83 | #define SCHECK_MAGIC(a,m) do{if((*(u64*)(a))!=(m))printk("%s,%u,%s(): magic %08x at %p corrupted!\n",\ |
84 | __FILE__,__LINE__,__FUNCTION__,(m),(a));}while(0) | 84 | __FILE__,__LINE__,__func__,(m),(a));}while(0) |
85 | #define BUF_OFFSET sizeof(u64) | 85 | #define BUF_OFFSET sizeof(u64) |
86 | #define MKCTL_TRAILER sizeof(u64) | 86 | #define MKCTL_TRAILER sizeof(u64) |
87 | 87 | ||
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index fc50d2f959d1..e8cb9ff183e9 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c | |||
@@ -128,8 +128,6 @@ void *get_current(void) | |||
128 | return current; | 128 | return current; |
129 | } | 129 | } |
130 | 130 | ||
131 | extern void schedule_tail(struct task_struct *prev); | ||
132 | |||
133 | /* | 131 | /* |
134 | * This is called magically, by its address being stuffed in a jmp_buf | 132 | * This is called magically, by its address being stuffed in a jmp_buf |
135 | * and being longjmp-d to. | 133 | * and being longjmp-d to. |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 4a88cf7695b4..6c70fed0f9a0 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -21,7 +21,8 @@ config X86 | |||
21 | select HAVE_IDE | 21 | select HAVE_IDE |
22 | select HAVE_OPROFILE | 22 | select HAVE_OPROFILE |
23 | select HAVE_KPROBES | 23 | select HAVE_KPROBES |
24 | select HAVE_KVM | 24 | select HAVE_KRETPROBES |
25 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) | ||
25 | 26 | ||
26 | 27 | ||
27 | config GENERIC_LOCKBREAK | 28 | config GENERIC_LOCKBREAK |
@@ -65,9 +66,6 @@ config MMU | |||
65 | config ZONE_DMA | 66 | config ZONE_DMA |
66 | def_bool y | 67 | def_bool y |
67 | 68 | ||
68 | config QUICKLIST | ||
69 | def_bool X86_32 | ||
70 | |||
71 | config SBUS | 69 | config SBUS |
72 | bool | 70 | bool |
73 | 71 | ||
@@ -1261,7 +1259,7 @@ menuconfig APM | |||
1261 | machines with more than one CPU. | 1259 | machines with more than one CPU. |
1262 | 1260 | ||
1263 | In order to use APM, you will need supporting software. For location | 1261 | In order to use APM, you will need supporting software. For location |
1264 | and more information, read <file:Documentation/pm.txt> and the | 1262 | and more information, read <file:Documentation/power/pm.txt> and the |
1265 | Battery Powered Linux mini-HOWTO, available from | 1263 | Battery Powered Linux mini-HOWTO, available from |
1266 | <http://www.tldp.org/docs.html#howto>. | 1264 | <http://www.tldp.org/docs.html#howto>. |
1267 | 1265 | ||
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index e09a6b73a1aa..9304bfba7d45 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu | |||
@@ -377,6 +377,19 @@ config X86_OOSTORE | |||
377 | def_bool y | 377 | def_bool y |
378 | depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR | 378 | depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR |
379 | 379 | ||
380 | # | ||
381 | # P6_NOPs are a relatively minor optimization that require a family >= | ||
382 | # 6 processor, except that it is broken on certain VIA chips. | ||
383 | # Furthermore, AMD chips prefer a totally different sequence of NOPs | ||
384 | # (which work on all CPUs). As a result, disallow these if we're | ||
385 | # compiling X86_GENERIC but not X86_64 (these NOPs do work on all | ||
386 | # x86-64 capable chips); the list of processors in the right-hand clause | ||
387 | # are the cores that benefit from this optimization. | ||
388 | # | ||
389 | config X86_P6_NOP | ||
390 | def_bool y | ||
391 | depends on (X86_64 || !X86_GENERIC) && (M686 || MPENTIUMII || MPENTIUMIII || MPENTIUMM || MCORE2 || MPENTIUM4) | ||
392 | |||
380 | config X86_TSC | 393 | config X86_TSC |
381 | def_bool y | 394 | def_bool y |
382 | depends on ((MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2) && !X86_NUMAQ) || X86_64 | 395 | depends on ((MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2) && !X86_NUMAQ) || X86_64 |
@@ -390,6 +403,7 @@ config X86_CMOV | |||
390 | config X86_MINIMUM_CPU_FAMILY | 403 | config X86_MINIMUM_CPU_FAMILY |
391 | int | 404 | int |
392 | default "64" if X86_64 | 405 | default "64" if X86_64 |
406 | default "6" if X86_32 && X86_P6_NOP | ||
393 | default "4" if X86_32 && (X86_XADD || X86_CMPXCHG || X86_BSWAP || X86_WP_WORKS_OK) | 407 | default "4" if X86_32 && (X86_XADD || X86_CMPXCHG || X86_BSWAP || X86_WP_WORKS_OK) |
394 | default "3" | 408 | default "3" |
395 | 409 | ||
diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c index 378353956b5d..e77d89f9e8aa 100644 --- a/arch/x86/boot/memory.c +++ b/arch/x86/boot/memory.c | |||
@@ -37,6 +37,12 @@ static int detect_memory_e820(void) | |||
37 | "=m" (*desc) | 37 | "=m" (*desc) |
38 | : "D" (desc), "d" (SMAP), "a" (0xe820)); | 38 | : "D" (desc), "d" (SMAP), "a" (0xe820)); |
39 | 39 | ||
40 | /* BIOSes which terminate the chain with CF = 1 as opposed | ||
41 | to %ebx = 0 don't always report the SMAP signature on | ||
42 | the final, failing, probe. */ | ||
43 | if (err) | ||
44 | break; | ||
45 | |||
40 | /* Some BIOSes stop returning SMAP in the middle of | 46 | /* Some BIOSes stop returning SMAP in the middle of |
41 | the search loop. We don't know exactly how the BIOS | 47 | the search loop. We don't know exactly how the BIOS |
42 | screwed up the map at that point, we might have a | 48 | screwed up the map at that point, we might have a |
@@ -47,9 +53,6 @@ static int detect_memory_e820(void) | |||
47 | break; | 53 | break; |
48 | } | 54 | } |
49 | 55 | ||
50 | if (err) | ||
51 | break; | ||
52 | |||
53 | count++; | 56 | count++; |
54 | desc++; | 57 | desc++; |
55 | } while (next && count < E820MAX); | 58 | } while (next && count < E820MAX); |
diff --git a/arch/x86/boot/vesa.h b/arch/x86/boot/vesa.h index ff5b73cd406f..468e444622c5 100644 --- a/arch/x86/boot/vesa.h +++ b/arch/x86/boot/vesa.h | |||
@@ -26,17 +26,10 @@ struct vesa_general_info { | |||
26 | far_ptr video_mode_ptr; /* 14 */ | 26 | far_ptr video_mode_ptr; /* 14 */ |
27 | u16 total_memory; /* 18 */ | 27 | u16 total_memory; /* 18 */ |
28 | 28 | ||
29 | u16 oem_software_rev; /* 20 */ | 29 | u8 reserved[236]; /* 20 */ |
30 | far_ptr oem_vendor_name_ptr; /* 22 */ | ||
31 | far_ptr oem_product_name_ptr; /* 26 */ | ||
32 | far_ptr oem_product_rev_ptr; /* 30 */ | ||
33 | |||
34 | u8 reserved[222]; /* 34 */ | ||
35 | u8 oem_data[256]; /* 256 */ | ||
36 | } __attribute__ ((packed)); | 30 | } __attribute__ ((packed)); |
37 | 31 | ||
38 | #define VESA_MAGIC ('V' + ('E' << 8) + ('S' << 16) + ('A' << 24)) | 32 | #define VESA_MAGIC ('V' + ('E' << 8) + ('S' << 16) + ('A' << 24)) |
39 | #define VBE2_MAGIC ('V' + ('B' << 8) + ('E' << 16) + ('2' << 24)) | ||
40 | 33 | ||
41 | struct vesa_mode_info { | 34 | struct vesa_mode_info { |
42 | u16 mode_attr; /* 0 */ | 35 | u16 mode_attr; /* 0 */ |
diff --git a/arch/x86/boot/video-vesa.c b/arch/x86/boot/video-vesa.c index 662dd2f13068..419b5c273374 100644 --- a/arch/x86/boot/video-vesa.c +++ b/arch/x86/boot/video-vesa.c | |||
@@ -37,8 +37,6 @@ static int vesa_probe(void) | |||
37 | 37 | ||
38 | video_vesa.modes = GET_HEAP(struct mode_info, 0); | 38 | video_vesa.modes = GET_HEAP(struct mode_info, 0); |
39 | 39 | ||
40 | vginfo.signature = VBE2_MAGIC; | ||
41 | |||
42 | ax = 0x4f00; | 40 | ax = 0x4f00; |
43 | di = (size_t)&vginfo; | 41 | di = (size_t)&vginfo; |
44 | asm(INT10 | 42 | asm(INT10 |
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index 1c0503bdfb1a..5e7771a3ba2f 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
@@ -500,7 +500,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
500 | regs->ss = __USER32_DS; | 500 | regs->ss = __USER32_DS; |
501 | 501 | ||
502 | set_fs(USER_DS); | 502 | set_fs(USER_DS); |
503 | regs->flags &= ~X86_EFLAGS_TF; | 503 | regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF); |
504 | if (test_thread_flag(TIF_SINGLESTEP)) | 504 | if (test_thread_flag(TIF_SINGLESTEP)) |
505 | ptrace_notify(SIGTRAP); | 505 | ptrace_notify(SIGTRAP); |
506 | 506 | ||
@@ -600,7 +600,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
600 | regs->ss = __USER32_DS; | 600 | regs->ss = __USER32_DS; |
601 | 601 | ||
602 | set_fs(USER_DS); | 602 | set_fs(USER_DS); |
603 | regs->flags &= ~X86_EFLAGS_TF; | 603 | regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF); |
604 | if (test_thread_flag(TIF_SINGLESTEP)) | 604 | if (test_thread_flag(TIF_SINGLESTEP)) |
605 | ptrace_notify(SIGTRAP); | 605 | ptrace_notify(SIGTRAP); |
606 | 606 | ||
diff --git a/arch/x86/kernel/asm-offsets_32.c b/arch/x86/kernel/asm-offsets_32.c index a33d53017997..8ea040124f7d 100644 --- a/arch/x86/kernel/asm-offsets_32.c +++ b/arch/x86/kernel/asm-offsets_32.c | |||
@@ -128,13 +128,11 @@ void foo(void) | |||
128 | OFFSET(XEN_vcpu_info_pending, vcpu_info, evtchn_upcall_pending); | 128 | OFFSET(XEN_vcpu_info_pending, vcpu_info, evtchn_upcall_pending); |
129 | #endif | 129 | #endif |
130 | 130 | ||
131 | #ifdef CONFIG_LGUEST_GUEST | 131 | #if defined(CONFIG_LGUEST) || defined(CONFIG_LGUEST_GUEST) || defined(CONFIG_LGUEST_MODULE) |
132 | BLANK(); | 132 | BLANK(); |
133 | OFFSET(LGUEST_DATA_irq_enabled, lguest_data, irq_enabled); | 133 | OFFSET(LGUEST_DATA_irq_enabled, lguest_data, irq_enabled); |
134 | OFFSET(LGUEST_DATA_pgdir, lguest_data, pgdir); | 134 | OFFSET(LGUEST_DATA_pgdir, lguest_data, pgdir); |
135 | #endif | ||
136 | 135 | ||
137 | #ifdef CONFIG_LGUEST | ||
138 | BLANK(); | 136 | BLANK(); |
139 | OFFSET(LGUEST_PAGES_host_gdt_desc, lguest_pages, state.host_gdt_desc); | 137 | OFFSET(LGUEST_PAGES_host_gdt_desc, lguest_pages, state.host_gdt_desc); |
140 | OFFSET(LGUEST_PAGES_host_idt_desc, lguest_pages, state.host_idt_desc); | 138 | OFFSET(LGUEST_PAGES_host_idt_desc, lguest_pages, state.host_idt_desc); |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index f86a3c4a2669..a38aafaefc23 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -504,7 +504,7 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
504 | 504 | ||
505 | /* Clear all flags overriden by options */ | 505 | /* Clear all flags overriden by options */ |
506 | for (i = 0; i < NCAPINTS; i++) | 506 | for (i = 0; i < NCAPINTS; i++) |
507 | c->x86_capability[i] ^= cleared_cpu_caps[i]; | 507 | c->x86_capability[i] &= ~cleared_cpu_caps[i]; |
508 | 508 | ||
509 | /* Init Machine Check Exception if available. */ | 509 | /* Init Machine Check Exception if available. */ |
510 | mcheck_init(c); | 510 | mcheck_init(c); |
diff --git a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c index 39f8cb18296c..c2f930d86640 100644 --- a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c +++ b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c | |||
@@ -55,7 +55,6 @@ static int eps_set_state(struct eps_cpu_data *centaur, | |||
55 | { | 55 | { |
56 | struct cpufreq_freqs freqs; | 56 | struct cpufreq_freqs freqs; |
57 | u32 lo, hi; | 57 | u32 lo, hi; |
58 | u8 current_multiplier, current_voltage; | ||
59 | int err = 0; | 58 | int err = 0; |
60 | int i; | 59 | int i; |
61 | 60 | ||
@@ -95,6 +94,10 @@ postchange: | |||
95 | rdmsr(MSR_IA32_PERF_STATUS, lo, hi); | 94 | rdmsr(MSR_IA32_PERF_STATUS, lo, hi); |
96 | freqs.new = centaur->fsb * ((lo >> 8) & 0xff); | 95 | freqs.new = centaur->fsb * ((lo >> 8) & 0xff); |
97 | 96 | ||
97 | #ifdef DEBUG | ||
98 | { | ||
99 | u8 current_multiplier, current_voltage; | ||
100 | |||
98 | /* Print voltage and multiplier */ | 101 | /* Print voltage and multiplier */ |
99 | rdmsr(MSR_IA32_PERF_STATUS, lo, hi); | 102 | rdmsr(MSR_IA32_PERF_STATUS, lo, hi); |
100 | current_voltage = lo & 0xff; | 103 | current_voltage = lo & 0xff; |
@@ -103,7 +106,8 @@ postchange: | |||
103 | current_multiplier = (lo >> 8) & 0xff; | 106 | current_multiplier = (lo >> 8) & 0xff; |
104 | printk(KERN_INFO "eps: Current multiplier = %d\n", | 107 | printk(KERN_INFO "eps: Current multiplier = %d\n", |
105 | current_multiplier); | 108 | current_multiplier); |
106 | 109 | } | |
110 | #endif | ||
107 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); | 111 | cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); |
108 | return err; | 112 | return err; |
109 | } | 113 | } |
diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c index b6e136f23d3d..be83336fddba 100644 --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <asm/uaccess.h> | 43 | #include <asm/uaccess.h> |
44 | #include <asm/processor.h> | 44 | #include <asm/processor.h> |
45 | #include <asm/msr.h> | 45 | #include <asm/msr.h> |
46 | #include <asm/kvm_para.h> | ||
46 | #include "mtrr.h" | 47 | #include "mtrr.h" |
47 | 48 | ||
48 | u32 num_var_ranges = 0; | 49 | u32 num_var_ranges = 0; |
@@ -649,6 +650,7 @@ static __init int amd_special_default_mtrr(void) | |||
649 | 650 | ||
650 | /** | 651 | /** |
651 | * mtrr_trim_uncached_memory - trim RAM not covered by MTRRs | 652 | * mtrr_trim_uncached_memory - trim RAM not covered by MTRRs |
653 | * @end_pfn: ending page frame number | ||
652 | * | 654 | * |
653 | * Some buggy BIOSes don't setup the MTRRs properly for systems with certain | 655 | * Some buggy BIOSes don't setup the MTRRs properly for systems with certain |
654 | * memory configurations. This routine checks that the highest MTRR matches | 656 | * memory configurations. This routine checks that the highest MTRR matches |
@@ -688,8 +690,11 @@ int __init mtrr_trim_uncached_memory(unsigned long end_pfn) | |||
688 | 690 | ||
689 | /* kvm/qemu doesn't have mtrr set right, don't trim them all */ | 691 | /* kvm/qemu doesn't have mtrr set right, don't trim them all */ |
690 | if (!highest_pfn) { | 692 | if (!highest_pfn) { |
691 | printk(KERN_WARNING "WARNING: strange, CPU MTRRs all blank?\n"); | 693 | if (!kvm_para_available()) { |
692 | WARN_ON(1); | 694 | printk(KERN_WARNING |
695 | "WARNING: strange, CPU MTRRs all blank?\n"); | ||
696 | WARN_ON(1); | ||
697 | } | ||
693 | return 0; | 698 | return 0; |
694 | } | 699 | } |
695 | 700 | ||
diff --git a/arch/x86/kernel/cpu/transmeta.c b/arch/x86/kernel/cpu/transmeta.c index 200fb3f9ebfb..e8b422c1c512 100644 --- a/arch/x86/kernel/cpu/transmeta.c +++ b/arch/x86/kernel/cpu/transmeta.c | |||
@@ -76,13 +76,6 @@ static void __cpuinit init_transmeta(struct cpuinfo_x86 *c) | |||
76 | /* All Transmeta CPUs have a constant TSC */ | 76 | /* All Transmeta CPUs have a constant TSC */ |
77 | set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability); | 77 | set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability); |
78 | 78 | ||
79 | /* If we can run i686 user-space code, call us an i686 */ | ||
80 | #define USER686 ((1 << X86_FEATURE_TSC)|\ | ||
81 | (1 << X86_FEATURE_CX8)|\ | ||
82 | (1 << X86_FEATURE_CMOV)) | ||
83 | if (c->x86 == 5 && (c->x86_capability[0] & USER686) == USER686) | ||
84 | c->x86 = 6; | ||
85 | |||
86 | #ifdef CONFIG_SYSCTL | 79 | #ifdef CONFIG_SYSCTL |
87 | /* randomize_va_space slows us down enormously; | 80 | /* randomize_va_space slows us down enormously; |
88 | it probably triggers retranslation of x86->native bytecode */ | 81 | it probably triggers retranslation of x86->native bytecode */ |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 2ad9a1bc6a73..c20c9e7e08dd 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -453,6 +453,7 @@ ENTRY(stub_execve) | |||
453 | CFI_REGISTER rip, r11 | 453 | CFI_REGISTER rip, r11 |
454 | SAVE_REST | 454 | SAVE_REST |
455 | FIXUP_TOP_OF_STACK %r11 | 455 | FIXUP_TOP_OF_STACK %r11 |
456 | movq %rsp, %rcx | ||
456 | call sys_execve | 457 | call sys_execve |
457 | RESTORE_TOP_OF_STACK %r11 | 458 | RESTORE_TOP_OF_STACK %r11 |
458 | movq %rax,RAX(%rsp) | 459 | movq %rax,RAX(%rsp) |
@@ -1036,15 +1037,16 @@ ENDPROC(child_rip) | |||
1036 | * rdi: name, rsi: argv, rdx: envp | 1037 | * rdi: name, rsi: argv, rdx: envp |
1037 | * | 1038 | * |
1038 | * We want to fallback into: | 1039 | * We want to fallback into: |
1039 | * extern long sys_execve(char *name, char **argv,char **envp, struct pt_regs regs) | 1040 | * extern long sys_execve(char *name, char **argv,char **envp, struct pt_regs *regs) |
1040 | * | 1041 | * |
1041 | * do_sys_execve asm fallback arguments: | 1042 | * do_sys_execve asm fallback arguments: |
1042 | * rdi: name, rsi: argv, rdx: envp, fake frame on the stack | 1043 | * rdi: name, rsi: argv, rdx: envp, rcx: fake frame on the stack |
1043 | */ | 1044 | */ |
1044 | ENTRY(kernel_execve) | 1045 | ENTRY(kernel_execve) |
1045 | CFI_STARTPROC | 1046 | CFI_STARTPROC |
1046 | FAKE_STACK_FRAME $0 | 1047 | FAKE_STACK_FRAME $0 |
1047 | SAVE_ALL | 1048 | SAVE_ALL |
1049 | movq %rsp,%rcx | ||
1048 | call sys_execve | 1050 | call sys_execve |
1049 | movq %rax, RAX(%rsp) | 1051 | movq %rax, RAX(%rsp) |
1050 | RESTORE_REST | 1052 | RESTORE_REST |
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 25eb98540a41..fd8ca53943a8 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S | |||
@@ -606,7 +606,7 @@ ENTRY(_stext) | |||
606 | .section ".bss.page_aligned","wa" | 606 | .section ".bss.page_aligned","wa" |
607 | .align PAGE_SIZE_asm | 607 | .align PAGE_SIZE_asm |
608 | #ifdef CONFIG_X86_PAE | 608 | #ifdef CONFIG_X86_PAE |
609 | ENTRY(swapper_pg_pmd) | 609 | swapper_pg_pmd: |
610 | .fill 1024*KPMDS,4,0 | 610 | .fill 1024*KPMDS,4,0 |
611 | #else | 611 | #else |
612 | ENTRY(swapper_pg_dir) | 612 | ENTRY(swapper_pg_dir) |
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index eb415043a929..a007454133a3 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
@@ -379,18 +379,24 @@ NEXT_PAGE(level2_ident_pgt) | |||
379 | /* Since I easily can, map the first 1G. | 379 | /* Since I easily can, map the first 1G. |
380 | * Don't set NX because code runs from these pages. | 380 | * Don't set NX because code runs from these pages. |
381 | */ | 381 | */ |
382 | PMDS(0x0000000000000000, __PAGE_KERNEL_LARGE_EXEC, PTRS_PER_PMD) | 382 | PMDS(0, __PAGE_KERNEL_LARGE_EXEC, PTRS_PER_PMD) |
383 | 383 | ||
384 | NEXT_PAGE(level2_kernel_pgt) | 384 | NEXT_PAGE(level2_kernel_pgt) |
385 | /* 40MB kernel mapping. The kernel code cannot be bigger than that. | 385 | /* |
386 | When you change this change KERNEL_TEXT_SIZE in page.h too. */ | 386 | * 128 MB kernel mapping. We spend a full page on this pagetable |
387 | /* (2^48-(2*1024*1024*1024)-((2^39)*511)-((2^30)*510)) = 0 */ | 387 | * anyway. |
388 | PMDS(0x0000000000000000, __PAGE_KERNEL_LARGE_EXEC|_PAGE_GLOBAL, KERNEL_TEXT_SIZE/PMD_SIZE) | 388 | * |
389 | /* Module mapping starts here */ | 389 | * The kernel code+data+bss must not be bigger than that. |
390 | .fill (PTRS_PER_PMD - (KERNEL_TEXT_SIZE/PMD_SIZE)),8,0 | 390 | * |
391 | * (NOTE: at +128MB starts the module area, see MODULES_VADDR. | ||
392 | * If you want to increase this then increase MODULES_VADDR | ||
393 | * too.) | ||
394 | */ | ||
395 | PMDS(0, __PAGE_KERNEL_LARGE_EXEC|_PAGE_GLOBAL, | ||
396 | KERNEL_IMAGE_SIZE/PMD_SIZE) | ||
391 | 397 | ||
392 | NEXT_PAGE(level2_spare_pgt) | 398 | NEXT_PAGE(level2_spare_pgt) |
393 | .fill 512,8,0 | 399 | .fill 512, 8, 0 |
394 | 400 | ||
395 | #undef PMDS | 401 | #undef PMDS |
396 | #undef NEXT_PAGE | 402 | #undef NEXT_PAGE |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index 429d084e014d..235fd6c77504 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
@@ -368,8 +368,8 @@ static int hpet_clocksource_register(void) | |||
368 | return 0; | 368 | return 0; |
369 | } | 369 | } |
370 | 370 | ||
371 | /* | 371 | /** |
372 | * Try to setup the HPET timer | 372 | * hpet_enable - Try to setup the HPET timer. Returns 1 on success. |
373 | */ | 373 | */ |
374 | int __init hpet_enable(void) | 374 | int __init hpet_enable(void) |
375 | { | 375 | { |
diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index 763dfc407232..d2e39e69aaf8 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c | |||
@@ -132,7 +132,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset, | |||
132 | if (!cpu_has_fxsr) | 132 | if (!cpu_has_fxsr) |
133 | return -ENODEV; | 133 | return -ENODEV; |
134 | 134 | ||
135 | unlazy_fpu(target); | 135 | init_fpu(target); |
136 | 136 | ||
137 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, | 137 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, |
138 | &target->thread.i387.fxsave, 0, -1); | 138 | &target->thread.i387.fxsave, 0, -1); |
@@ -147,7 +147,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset, | |||
147 | if (!cpu_has_fxsr) | 147 | if (!cpu_has_fxsr) |
148 | return -ENODEV; | 148 | return -ENODEV; |
149 | 149 | ||
150 | unlazy_fpu(target); | 150 | init_fpu(target); |
151 | set_stopped_child_used_math(target); | 151 | set_stopped_child_used_math(target); |
152 | 152 | ||
153 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, | 153 | ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
@@ -261,7 +261,7 @@ static void convert_from_fxsr(struct user_i387_ia32_struct *env, | |||
261 | } | 261 | } |
262 | #else | 262 | #else |
263 | env->fip = fxsave->fip; | 263 | env->fip = fxsave->fip; |
264 | env->fcs = fxsave->fcs; | 264 | env->fcs = (u16) fxsave->fcs | ((u32) fxsave->fop << 16); |
265 | env->foo = fxsave->foo; | 265 | env->foo = fxsave->foo; |
266 | env->fos = fxsave->fos; | 266 | env->fos = fxsave->fos; |
267 | #endif | 267 | #endif |
@@ -307,7 +307,7 @@ int fpregs_get(struct task_struct *target, const struct user_regset *regset, | |||
307 | if (!HAVE_HWFP) | 307 | if (!HAVE_HWFP) |
308 | return fpregs_soft_get(target, regset, pos, count, kbuf, ubuf); | 308 | return fpregs_soft_get(target, regset, pos, count, kbuf, ubuf); |
309 | 309 | ||
310 | unlazy_fpu(target); | 310 | init_fpu(target); |
311 | 311 | ||
312 | if (!cpu_has_fxsr) | 312 | if (!cpu_has_fxsr) |
313 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, | 313 | return user_regset_copyout(&pos, &count, &kbuf, &ubuf, |
@@ -332,7 +332,7 @@ int fpregs_set(struct task_struct *target, const struct user_regset *regset, | |||
332 | if (!HAVE_HWFP) | 332 | if (!HAVE_HWFP) |
333 | return fpregs_soft_set(target, regset, pos, count, kbuf, ubuf); | 333 | return fpregs_soft_set(target, regset, pos, count, kbuf, ubuf); |
334 | 334 | ||
335 | unlazy_fpu(target); | 335 | init_fpu(target); |
336 | set_stopped_child_used_math(target); | 336 | set_stopped_child_used_math(target); |
337 | 337 | ||
338 | if (!cpu_has_fxsr) | 338 | if (!cpu_has_fxsr) |
diff --git a/arch/x86/kernel/init_task.c b/arch/x86/kernel/init_task.c index 5b3ce7934363..3d01e47777db 100644 --- a/arch/x86/kernel/init_task.c +++ b/arch/x86/kernel/init_task.c | |||
@@ -15,6 +15,7 @@ static struct files_struct init_files = INIT_FILES; | |||
15 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 15 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
16 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 16 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
17 | struct mm_struct init_mm = INIT_MM(init_mm); | 17 | struct mm_struct init_mm = INIT_MM(init_mm); |
18 | EXPORT_UNUSED_SYMBOL(init_mm); /* will be removed in 2.6.26 */ | ||
18 | 19 | ||
19 | /* | 20 | /* |
20 | * Initial thread structure. | 21 | * Initial thread structure. |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index a7d50a547dc2..be3c7a299f02 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -603,11 +603,13 @@ __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, | |||
603 | } | 603 | } |
604 | #endif | 604 | #endif |
605 | 605 | ||
606 | #ifdef X86_BTS | ||
606 | if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS)) | 607 | if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS)) |
607 | ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS); | 608 | ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS); |
608 | 609 | ||
609 | if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS)) | 610 | if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS)) |
610 | ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES); | 611 | ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES); |
612 | #endif | ||
611 | 613 | ||
612 | 614 | ||
613 | if (!test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) { | 615 | if (!test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) { |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index b0cc8f0136d8..3baf9b9f4c87 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -604,11 +604,13 @@ static inline void __switch_to_xtra(struct task_struct *prev_p, | |||
604 | memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); | 604 | memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); |
605 | } | 605 | } |
606 | 606 | ||
607 | #ifdef X86_BTS | ||
607 | if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS)) | 608 | if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS)) |
608 | ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS); | 609 | ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS); |
609 | 610 | ||
610 | if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS)) | 611 | if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS)) |
611 | ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES); | 612 | ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES); |
613 | #endif | ||
612 | } | 614 | } |
613 | 615 | ||
614 | /* | 616 | /* |
@@ -730,16 +732,16 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
730 | */ | 732 | */ |
731 | asmlinkage | 733 | asmlinkage |
732 | long sys_execve(char __user *name, char __user * __user *argv, | 734 | long sys_execve(char __user *name, char __user * __user *argv, |
733 | char __user * __user *envp, struct pt_regs regs) | 735 | char __user * __user *envp, struct pt_regs *regs) |
734 | { | 736 | { |
735 | long error; | 737 | long error; |
736 | char * filename; | 738 | char * filename; |
737 | 739 | ||
738 | filename = getname(name); | 740 | filename = getname(name); |
739 | error = PTR_ERR(filename); | 741 | error = PTR_ERR(filename); |
740 | if (IS_ERR(filename)) | 742 | if (IS_ERR(filename)) |
741 | return error; | 743 | return error; |
742 | error = do_execve(filename, argv, envp, ®s); | 744 | error = do_execve(filename, argv, envp, regs); |
743 | putname(filename); | 745 | putname(filename); |
744 | return error; | 746 | return error; |
745 | } | 747 | } |
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index d862e396b099..d5904eef1d31 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
@@ -323,6 +323,16 @@ static int putreg(struct task_struct *child, | |||
323 | return set_flags(child, value); | 323 | return set_flags(child, value); |
324 | 324 | ||
325 | #ifdef CONFIG_X86_64 | 325 | #ifdef CONFIG_X86_64 |
326 | /* | ||
327 | * Orig_ax is really just a flag with small positive and | ||
328 | * negative values, so make sure to always sign-extend it | ||
329 | * from 32 bits so that it works correctly regardless of | ||
330 | * whether we come from a 32-bit environment or not. | ||
331 | */ | ||
332 | case offsetof(struct user_regs_struct, orig_ax): | ||
333 | value = (long) (s32) value; | ||
334 | break; | ||
335 | |||
326 | case offsetof(struct user_regs_struct,fs_base): | 336 | case offsetof(struct user_regs_struct,fs_base): |
327 | if (value >= TASK_SIZE_OF(child)) | 337 | if (value >= TASK_SIZE_OF(child)) |
328 | return -EIO; | 338 | return -EIO; |
@@ -544,6 +554,8 @@ static int ptrace_set_debugreg(struct task_struct *child, | |||
544 | return 0; | 554 | return 0; |
545 | } | 555 | } |
546 | 556 | ||
557 | #ifdef X86_BTS | ||
558 | |||
547 | static int ptrace_bts_get_size(struct task_struct *child) | 559 | static int ptrace_bts_get_size(struct task_struct *child) |
548 | { | 560 | { |
549 | if (!child->thread.ds_area_msr) | 561 | if (!child->thread.ds_area_msr) |
@@ -826,6 +838,7 @@ void ptrace_bts_take_timestamp(struct task_struct *tsk, | |||
826 | 838 | ||
827 | ptrace_bts_write_record(tsk, &rec); | 839 | ptrace_bts_write_record(tsk, &rec); |
828 | } | 840 | } |
841 | #endif /* X86_BTS */ | ||
829 | 842 | ||
830 | /* | 843 | /* |
831 | * Called by kernel/ptrace.c when detaching.. | 844 | * Called by kernel/ptrace.c when detaching.. |
@@ -839,7 +852,9 @@ void ptrace_disable(struct task_struct *child) | |||
839 | clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); | 852 | clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); |
840 | #endif | 853 | #endif |
841 | if (child->thread.ds_area_msr) { | 854 | if (child->thread.ds_area_msr) { |
855 | #ifdef X86_BTS | ||
842 | ptrace_bts_realloc(child, 0, 0); | 856 | ptrace_bts_realloc(child, 0, 0); |
857 | #endif | ||
843 | child->thread.debugctlmsr &= ~ds_debugctl_mask(); | 858 | child->thread.debugctlmsr &= ~ds_debugctl_mask(); |
844 | if (!child->thread.debugctlmsr) | 859 | if (!child->thread.debugctlmsr) |
845 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); | 860 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); |
@@ -961,6 +976,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
961 | break; | 976 | break; |
962 | #endif | 977 | #endif |
963 | 978 | ||
979 | /* | ||
980 | * These bits need more cooking - not enabled yet: | ||
981 | */ | ||
982 | #ifdef X86_BTS | ||
964 | case PTRACE_BTS_CONFIG: | 983 | case PTRACE_BTS_CONFIG: |
965 | ret = ptrace_bts_config | 984 | ret = ptrace_bts_config |
966 | (child, data, (struct ptrace_bts_config __user *)addr); | 985 | (child, data, (struct ptrace_bts_config __user *)addr); |
@@ -988,6 +1007,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
988 | ret = ptrace_bts_drain | 1007 | ret = ptrace_bts_drain |
989 | (child, data, (struct bts_struct __user *) addr); | 1008 | (child, data, (struct bts_struct __user *) addr); |
990 | break; | 1009 | break; |
1010 | #endif | ||
991 | 1011 | ||
992 | default: | 1012 | default: |
993 | ret = ptrace_request(child, request, addr, data); | 1013 | ret = ptrace_request(child, request, addr, data); |
@@ -1035,10 +1055,17 @@ static int putreg32(struct task_struct *child, unsigned regno, u32 value) | |||
1035 | R32(esi, si); | 1055 | R32(esi, si); |
1036 | R32(ebp, bp); | 1056 | R32(ebp, bp); |
1037 | R32(eax, ax); | 1057 | R32(eax, ax); |
1038 | R32(orig_eax, orig_ax); | ||
1039 | R32(eip, ip); | 1058 | R32(eip, ip); |
1040 | R32(esp, sp); | 1059 | R32(esp, sp); |
1041 | 1060 | ||
1061 | case offsetof(struct user32, regs.orig_eax): | ||
1062 | /* | ||
1063 | * Sign-extend the value so that orig_eax = -1 | ||
1064 | * causes (long)orig_ax < 0 tests to fire correctly. | ||
1065 | */ | ||
1066 | regs->orig_ax = (long) (s32) value; | ||
1067 | break; | ||
1068 | |||
1042 | case offsetof(struct user32, regs.eflags): | 1069 | case offsetof(struct user32, regs.eflags): |
1043 | return set_flags(child, value); | 1070 | return set_flags(child, value); |
1044 | 1071 | ||
@@ -1226,12 +1253,14 @@ asmlinkage long sys32_ptrace(long request, u32 pid, u32 addr, u32 data) | |||
1226 | case PTRACE_SETOPTIONS: | 1253 | case PTRACE_SETOPTIONS: |
1227 | case PTRACE_SET_THREAD_AREA: | 1254 | case PTRACE_SET_THREAD_AREA: |
1228 | case PTRACE_GET_THREAD_AREA: | 1255 | case PTRACE_GET_THREAD_AREA: |
1256 | #ifdef X86_BTS | ||
1229 | case PTRACE_BTS_CONFIG: | 1257 | case PTRACE_BTS_CONFIG: |
1230 | case PTRACE_BTS_STATUS: | 1258 | case PTRACE_BTS_STATUS: |
1231 | case PTRACE_BTS_SIZE: | 1259 | case PTRACE_BTS_SIZE: |
1232 | case PTRACE_BTS_GET: | 1260 | case PTRACE_BTS_GET: |
1233 | case PTRACE_BTS_CLEAR: | 1261 | case PTRACE_BTS_CLEAR: |
1234 | case PTRACE_BTS_DRAIN: | 1262 | case PTRACE_BTS_DRAIN: |
1263 | #endif | ||
1235 | return sys_ptrace(request, pid, addr, data); | 1264 | return sys_ptrace(request, pid, addr, data); |
1236 | 1265 | ||
1237 | default: | 1266 | default: |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 7fd6ac43e4a1..55ceb8cdef75 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -326,6 +326,10 @@ static inline void kb_wait(void) | |||
326 | } | 326 | } |
327 | } | 327 | } |
328 | 328 | ||
329 | void __attribute__((weak)) mach_reboot_fixups(void) | ||
330 | { | ||
331 | } | ||
332 | |||
329 | static void native_machine_emergency_restart(void) | 333 | static void native_machine_emergency_restart(void) |
330 | { | 334 | { |
331 | int i; | 335 | int i; |
@@ -337,6 +341,8 @@ static void native_machine_emergency_restart(void) | |||
337 | /* Could also try the reset bit in the Hammer NB */ | 341 | /* Could also try the reset bit in the Hammer NB */ |
338 | switch (reboot_type) { | 342 | switch (reboot_type) { |
339 | case BOOT_KBD: | 343 | case BOOT_KBD: |
344 | mach_reboot_fixups(); /* for board specific fixups */ | ||
345 | |||
340 | for (i = 0; i < 10; i++) { | 346 | for (i = 0; i < 10; i++) { |
341 | kb_wait(); | 347 | kb_wait(); |
342 | udelay(50); | 348 | udelay(50); |
diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c index 6fd804f07821..7637dc91c79b 100644 --- a/arch/x86/kernel/setup_64.c +++ b/arch/x86/kernel/setup_64.c | |||
@@ -1021,7 +1021,7 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
1021 | 1021 | ||
1022 | /* Clear all flags overriden by options */ | 1022 | /* Clear all flags overriden by options */ |
1023 | for (i = 0; i < NCAPINTS; i++) | 1023 | for (i = 0; i < NCAPINTS; i++) |
1024 | c->x86_capability[i] ^= cleared_cpu_caps[i]; | 1024 | c->x86_capability[i] &= ~cleared_cpu_caps[i]; |
1025 | 1025 | ||
1026 | #ifdef CONFIG_X86_MCE | 1026 | #ifdef CONFIG_X86_MCE |
1027 | mcheck_init(c); | 1027 | mcheck_init(c); |
diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c index caee1f002fed..0157a6f0f41f 100644 --- a/arch/x86/kernel/signal_32.c +++ b/arch/x86/kernel/signal_32.c | |||
@@ -407,7 +407,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, | |||
407 | * The tracer may want to single-step inside the | 407 | * The tracer may want to single-step inside the |
408 | * handler too. | 408 | * handler too. |
409 | */ | 409 | */ |
410 | regs->flags &= ~TF_MASK; | 410 | regs->flags &= ~(TF_MASK | X86_EFLAGS_DF); |
411 | if (test_thread_flag(TIF_SINGLESTEP)) | 411 | if (test_thread_flag(TIF_SINGLESTEP)) |
412 | ptrace_notify(SIGTRAP); | 412 | ptrace_notify(SIGTRAP); |
413 | 413 | ||
@@ -500,7 +500,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
500 | * The tracer may want to single-step inside the | 500 | * The tracer may want to single-step inside the |
501 | * handler too. | 501 | * handler too. |
502 | */ | 502 | */ |
503 | regs->flags &= ~TF_MASK; | 503 | regs->flags &= ~(TF_MASK | X86_EFLAGS_DF); |
504 | if (test_thread_flag(TIF_SINGLESTEP)) | 504 | if (test_thread_flag(TIF_SINGLESTEP)) |
505 | ptrace_notify(SIGTRAP); | 505 | ptrace_notify(SIGTRAP); |
506 | 506 | ||
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index 7347bb14e306..1c83e5124c65 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
@@ -295,7 +295,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
295 | see include/asm-x86_64/uaccess.h for details. */ | 295 | see include/asm-x86_64/uaccess.h for details. */ |
296 | set_fs(USER_DS); | 296 | set_fs(USER_DS); |
297 | 297 | ||
298 | regs->flags &= ~X86_EFLAGS_TF; | 298 | regs->flags &= ~(X86_EFLAGS_TF | X86_EFLAGS_DF); |
299 | if (test_thread_flag(TIF_SINGLESTEP)) | 299 | if (test_thread_flag(TIF_SINGLESTEP)) |
300 | ptrace_notify(SIGTRAP); | 300 | ptrace_notify(SIGTRAP); |
301 | #ifdef DEBUG_SIG | 301 | #ifdef DEBUG_SIG |
@@ -311,6 +311,35 @@ give_sigsegv: | |||
311 | } | 311 | } |
312 | 312 | ||
313 | /* | 313 | /* |
314 | * Return -1L or the syscall number that @regs is executing. | ||
315 | */ | ||
316 | static long current_syscall(struct pt_regs *regs) | ||
317 | { | ||
318 | /* | ||
319 | * We always sign-extend a -1 value being set here, | ||
320 | * so this is always either -1L or a syscall number. | ||
321 | */ | ||
322 | return regs->orig_ax; | ||
323 | } | ||
324 | |||
325 | /* | ||
326 | * Return a value that is -EFOO if the system call in @regs->orig_ax | ||
327 | * returned an error. This only works for @regs from @current. | ||
328 | */ | ||
329 | static long current_syscall_ret(struct pt_regs *regs) | ||
330 | { | ||
331 | #ifdef CONFIG_IA32_EMULATION | ||
332 | if (test_thread_flag(TIF_IA32)) | ||
333 | /* | ||
334 | * Sign-extend the value so (int)-EFOO becomes (long)-EFOO | ||
335 | * and will match correctly in comparisons. | ||
336 | */ | ||
337 | return (int) regs->ax; | ||
338 | #endif | ||
339 | return regs->ax; | ||
340 | } | ||
341 | |||
342 | /* | ||
314 | * OK, we're invoking a handler | 343 | * OK, we're invoking a handler |
315 | */ | 344 | */ |
316 | 345 | ||
@@ -327,9 +356,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
327 | #endif | 356 | #endif |
328 | 357 | ||
329 | /* Are we from a system call? */ | 358 | /* Are we from a system call? */ |
330 | if ((long)regs->orig_ax >= 0) { | 359 | if (current_syscall(regs) >= 0) { |
331 | /* If so, check system call restarting.. */ | 360 | /* If so, check system call restarting.. */ |
332 | switch (regs->ax) { | 361 | switch (current_syscall_ret(regs)) { |
333 | case -ERESTART_RESTARTBLOCK: | 362 | case -ERESTART_RESTARTBLOCK: |
334 | case -ERESTARTNOHAND: | 363 | case -ERESTARTNOHAND: |
335 | regs->ax = -EINTR; | 364 | regs->ax = -EINTR; |
@@ -426,10 +455,9 @@ static void do_signal(struct pt_regs *regs) | |||
426 | } | 455 | } |
427 | 456 | ||
428 | /* Did we come from a system call? */ | 457 | /* Did we come from a system call? */ |
429 | if ((long)regs->orig_ax >= 0) { | 458 | if (current_syscall(regs) >= 0) { |
430 | /* Restart the system call - no handlers present */ | 459 | /* Restart the system call - no handlers present */ |
431 | long res = regs->ax; | 460 | switch (current_syscall_ret(regs)) { |
432 | switch (res) { | ||
433 | case -ERESTARTNOHAND: | 461 | case -ERESTARTNOHAND: |
434 | case -ERESTARTSYS: | 462 | case -ERESTARTSYS: |
435 | case -ERESTARTNOINTR: | 463 | case -ERESTARTNOINTR: |
diff --git a/arch/x86/kernel/smpboot_64.c b/arch/x86/kernel/smpboot_64.c index d53bd6fcb428..0880f2c388a9 100644 --- a/arch/x86/kernel/smpboot_64.c +++ b/arch/x86/kernel/smpboot_64.c | |||
@@ -554,10 +554,10 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid) | |||
554 | int timeout; | 554 | int timeout; |
555 | unsigned long start_rip; | 555 | unsigned long start_rip; |
556 | struct create_idle c_idle = { | 556 | struct create_idle c_idle = { |
557 | .work = __WORK_INITIALIZER(c_idle.work, do_fork_idle), | ||
558 | .cpu = cpu, | 557 | .cpu = cpu, |
559 | .done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done), | 558 | .done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done), |
560 | }; | 559 | }; |
560 | INIT_WORK(&c_idle.work, do_fork_idle); | ||
561 | 561 | ||
562 | /* allocate memory for gdts of secondary cpus. Hotplug is considered */ | 562 | /* allocate memory for gdts of secondary cpus. Hotplug is considered */ |
563 | if (!cpu_gdt_descr[cpu].address && | 563 | if (!cpu_gdt_descr[cpu].address && |
diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c index 02f0f61f5b11..c28c342c162f 100644 --- a/arch/x86/kernel/stacktrace.c +++ b/arch/x86/kernel/stacktrace.c | |||
@@ -25,6 +25,8 @@ static int save_stack_stack(void *data, char *name) | |||
25 | static void save_stack_address(void *data, unsigned long addr, int reliable) | 25 | static void save_stack_address(void *data, unsigned long addr, int reliable) |
26 | { | 26 | { |
27 | struct stack_trace *trace = data; | 27 | struct stack_trace *trace = data; |
28 | if (!reliable) | ||
29 | return; | ||
28 | if (trace->skip > 0) { | 30 | if (trace->skip > 0) { |
29 | trace->skip--; | 31 | trace->skip--; |
30 | return; | 32 | return; |
@@ -37,6 +39,8 @@ static void | |||
37 | save_stack_address_nosched(void *data, unsigned long addr, int reliable) | 39 | save_stack_address_nosched(void *data, unsigned long addr, int reliable) |
38 | { | 40 | { |
39 | struct stack_trace *trace = (struct stack_trace *)data; | 41 | struct stack_trace *trace = (struct stack_trace *)data; |
42 | if (!reliable) | ||
43 | return; | ||
40 | if (in_sched_functions(addr)) | 44 | if (in_sched_functions(addr)) |
41 | return; | 45 | return; |
42 | if (trace->skip > 0) { | 46 | if (trace->skip > 0) { |
diff --git a/arch/x86/kernel/step.c b/arch/x86/kernel/step.c index 2ef1a5f8d675..9d406cdc847f 100644 --- a/arch/x86/kernel/step.c +++ b/arch/x86/kernel/step.c | |||
@@ -166,7 +166,7 @@ static void enable_step(struct task_struct *child, bool block) | |||
166 | child->thread.debugctlmsr | DEBUGCTLMSR_BTF); | 166 | child->thread.debugctlmsr | DEBUGCTLMSR_BTF); |
167 | } else { | 167 | } else { |
168 | write_debugctlmsr(child, | 168 | write_debugctlmsr(child, |
169 | child->thread.debugctlmsr & ~TIF_DEBUGCTLMSR); | 169 | child->thread.debugctlmsr & ~DEBUGCTLMSR_BTF); |
170 | 170 | ||
171 | if (!child->thread.debugctlmsr) | 171 | if (!child->thread.debugctlmsr) |
172 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); | 172 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); |
@@ -189,7 +189,7 @@ void user_disable_single_step(struct task_struct *child) | |||
189 | * Make sure block stepping (BTF) is disabled. | 189 | * Make sure block stepping (BTF) is disabled. |
190 | */ | 190 | */ |
191 | write_debugctlmsr(child, | 191 | write_debugctlmsr(child, |
192 | child->thread.debugctlmsr & ~TIF_DEBUGCTLMSR); | 192 | child->thread.debugctlmsr & ~DEBUGCTLMSR_BTF); |
193 | 193 | ||
194 | if (!child->thread.debugctlmsr) | 194 | if (!child->thread.debugctlmsr) |
195 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); | 195 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); |
diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c index 6dfd4e76661a..022bcaa3b42e 100644 --- a/arch/x86/kernel/tls.c +++ b/arch/x86/kernel/tls.c | |||
@@ -91,7 +91,9 @@ int do_set_thread_area(struct task_struct *p, int idx, | |||
91 | 91 | ||
92 | asmlinkage int sys_set_thread_area(struct user_desc __user *u_info) | 92 | asmlinkage int sys_set_thread_area(struct user_desc __user *u_info) |
93 | { | 93 | { |
94 | return do_set_thread_area(current, -1, u_info, 1); | 94 | int ret = do_set_thread_area(current, -1, u_info, 1); |
95 | prevent_tail_call(ret); | ||
96 | return ret; | ||
95 | } | 97 | } |
96 | 98 | ||
97 | 99 | ||
@@ -139,7 +141,9 @@ int do_get_thread_area(struct task_struct *p, int idx, | |||
139 | 141 | ||
140 | asmlinkage int sys_get_thread_area(struct user_desc __user *u_info) | 142 | asmlinkage int sys_get_thread_area(struct user_desc __user *u_info) |
141 | { | 143 | { |
142 | return do_get_thread_area(current, -1, u_info); | 144 | int ret = do_get_thread_area(current, -1, u_info); |
145 | prevent_tail_call(ret); | ||
146 | return ret; | ||
143 | } | 147 | } |
144 | 148 | ||
145 | int regset_tls_active(struct task_struct *target, | 149 | int regset_tls_active(struct task_struct *target, |
diff --git a/arch/x86/kernel/tsc_32.c b/arch/x86/kernel/tsc_32.c index 43517e324be8..f14cfd9d1f94 100644 --- a/arch/x86/kernel/tsc_32.c +++ b/arch/x86/kernel/tsc_32.c | |||
@@ -28,7 +28,8 @@ EXPORT_SYMBOL_GPL(tsc_khz); | |||
28 | static int __init tsc_setup(char *str) | 28 | static int __init tsc_setup(char *str) |
29 | { | 29 | { |
30 | printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, " | 30 | printk(KERN_WARNING "notsc: Kernel compiled with CONFIG_X86_TSC, " |
31 | "cannot disable TSC.\n"); | 31 | "cannot disable TSC completely.\n"); |
32 | mark_tsc_unstable("user disabled TSC"); | ||
32 | return 1; | 33 | return 1; |
33 | } | 34 | } |
34 | #else | 35 | #else |
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c index 3f8242774580..edff4c985485 100644 --- a/arch/x86/kernel/vsyscall_64.c +++ b/arch/x86/kernel/vsyscall_64.c | |||
@@ -44,11 +44,6 @@ | |||
44 | 44 | ||
45 | #define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr))) | 45 | #define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr))) |
46 | #define __syscall_clobber "r11","cx","memory" | 46 | #define __syscall_clobber "r11","cx","memory" |
47 | #define __pa_vsymbol(x) \ | ||
48 | ({unsigned long v; \ | ||
49 | extern char __vsyscall_0; \ | ||
50 | asm("" : "=r" (v) : "0" (x)); \ | ||
51 | ((v - VSYSCALL_START) + __pa_symbol(&__vsyscall_0)); }) | ||
52 | 47 | ||
53 | /* | 48 | /* |
54 | * vsyscall_gtod_data contains data that is : | 49 | * vsyscall_gtod_data contains data that is : |
@@ -102,7 +97,7 @@ static __always_inline void do_get_tz(struct timezone * tz) | |||
102 | static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz) | 97 | static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz) |
103 | { | 98 | { |
104 | int ret; | 99 | int ret; |
105 | asm volatile("vsysc2: syscall" | 100 | asm volatile("syscall" |
106 | : "=a" (ret) | 101 | : "=a" (ret) |
107 | : "0" (__NR_gettimeofday),"D" (tv),"S" (tz) | 102 | : "0" (__NR_gettimeofday),"D" (tv),"S" (tz) |
108 | : __syscall_clobber ); | 103 | : __syscall_clobber ); |
@@ -112,7 +107,7 @@ static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz) | |||
112 | static __always_inline long time_syscall(long *t) | 107 | static __always_inline long time_syscall(long *t) |
113 | { | 108 | { |
114 | long secs; | 109 | long secs; |
115 | asm volatile("vsysc1: syscall" | 110 | asm volatile("syscall" |
116 | : "=a" (secs) | 111 | : "=a" (secs) |
117 | : "0" (__NR_time),"D" (t) : __syscall_clobber); | 112 | : "0" (__NR_time),"D" (t) : __syscall_clobber); |
118 | return secs; | 113 | return secs; |
@@ -228,42 +223,11 @@ long __vsyscall(3) venosys_1(void) | |||
228 | 223 | ||
229 | #ifdef CONFIG_SYSCTL | 224 | #ifdef CONFIG_SYSCTL |
230 | 225 | ||
231 | #define SYSCALL 0x050f | 226 | static int |
232 | #define NOP2 0x9090 | 227 | vsyscall_sysctl_change(ctl_table *ctl, int write, struct file * filp, |
233 | 228 | void __user *buffer, size_t *lenp, loff_t *ppos) | |
234 | /* | ||
235 | * NOP out syscall in vsyscall page when not needed. | ||
236 | */ | ||
237 | static int vsyscall_sysctl_change(ctl_table *ctl, int write, struct file * filp, | ||
238 | void __user *buffer, size_t *lenp, loff_t *ppos) | ||
239 | { | 229 | { |
240 | extern u16 vsysc1, vsysc2; | 230 | return proc_dointvec(ctl, write, filp, buffer, lenp, ppos); |
241 | u16 __iomem *map1; | ||
242 | u16 __iomem *map2; | ||
243 | int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos); | ||
244 | if (!write) | ||
245 | return ret; | ||
246 | /* gcc has some trouble with __va(__pa()), so just do it this | ||
247 | way. */ | ||
248 | map1 = ioremap(__pa_vsymbol(&vsysc1), 2); | ||
249 | if (!map1) | ||
250 | return -ENOMEM; | ||
251 | map2 = ioremap(__pa_vsymbol(&vsysc2), 2); | ||
252 | if (!map2) { | ||
253 | ret = -ENOMEM; | ||
254 | goto out; | ||
255 | } | ||
256 | if (!vsyscall_gtod_data.sysctl_enabled) { | ||
257 | writew(SYSCALL, map1); | ||
258 | writew(SYSCALL, map2); | ||
259 | } else { | ||
260 | writew(NOP2, map1); | ||
261 | writew(NOP2, map2); | ||
262 | } | ||
263 | iounmap(map2); | ||
264 | out: | ||
265 | iounmap(map1); | ||
266 | return ret; | ||
267 | } | 231 | } |
268 | 232 | ||
269 | static ctl_table kernel_table2[] = { | 233 | static ctl_table kernel_table2[] = { |
@@ -279,7 +243,6 @@ static ctl_table kernel_root_table2[] = { | |||
279 | .child = kernel_table2 }, | 243 | .child = kernel_table2 }, |
280 | {} | 244 | {} |
281 | }; | 245 | }; |
282 | |||
283 | #endif | 246 | #endif |
284 | 247 | ||
285 | /* Assume __initcall executes before all user space. Hopefully kmod | 248 | /* Assume __initcall executes before all user space. Hopefully kmod |
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 2cbee9479ce4..68a6b1511934 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
@@ -647,6 +647,10 @@ static void start_apic_timer(struct kvm_lapic *apic) | |||
647 | apic->timer.period = apic_get_reg(apic, APIC_TMICT) * | 647 | apic->timer.period = apic_get_reg(apic, APIC_TMICT) * |
648 | APIC_BUS_CYCLE_NS * apic->timer.divide_count; | 648 | APIC_BUS_CYCLE_NS * apic->timer.divide_count; |
649 | atomic_set(&apic->timer.pending, 0); | 649 | atomic_set(&apic->timer.pending, 0); |
650 | |||
651 | if (!apic->timer.period) | ||
652 | return; | ||
653 | |||
650 | hrtimer_start(&apic->timer.dev, | 654 | hrtimer_start(&apic->timer.dev, |
651 | ktime_add_ns(now, apic->timer.period), | 655 | ktime_add_ns(now, apic->timer.period), |
652 | HRTIMER_MODE_ABS); | 656 | HRTIMER_MODE_ABS); |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 8efdcdbebb03..d8172aabc660 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
@@ -681,8 +681,7 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, | |||
681 | unsigned level, | 681 | unsigned level, |
682 | int metaphysical, | 682 | int metaphysical, |
683 | unsigned access, | 683 | unsigned access, |
684 | u64 *parent_pte, | 684 | u64 *parent_pte) |
685 | bool *new_page) | ||
686 | { | 685 | { |
687 | union kvm_mmu_page_role role; | 686 | union kvm_mmu_page_role role; |
688 | unsigned index; | 687 | unsigned index; |
@@ -722,8 +721,6 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu, | |||
722 | vcpu->arch.mmu.prefetch_page(vcpu, sp); | 721 | vcpu->arch.mmu.prefetch_page(vcpu, sp); |
723 | if (!metaphysical) | 722 | if (!metaphysical) |
724 | rmap_write_protect(vcpu->kvm, gfn); | 723 | rmap_write_protect(vcpu->kvm, gfn); |
725 | if (new_page) | ||
726 | *new_page = 1; | ||
727 | return sp; | 724 | return sp; |
728 | } | 725 | } |
729 | 726 | ||
@@ -876,11 +873,18 @@ static void page_header_update_slot(struct kvm *kvm, void *pte, gfn_t gfn) | |||
876 | 873 | ||
877 | struct page *gva_to_page(struct kvm_vcpu *vcpu, gva_t gva) | 874 | struct page *gva_to_page(struct kvm_vcpu *vcpu, gva_t gva) |
878 | { | 875 | { |
876 | struct page *page; | ||
877 | |||
879 | gpa_t gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, gva); | 878 | gpa_t gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, gva); |
880 | 879 | ||
881 | if (gpa == UNMAPPED_GVA) | 880 | if (gpa == UNMAPPED_GVA) |
882 | return NULL; | 881 | return NULL; |
883 | return gfn_to_page(vcpu->kvm, gpa >> PAGE_SHIFT); | 882 | |
883 | down_read(¤t->mm->mmap_sem); | ||
884 | page = gfn_to_page(vcpu->kvm, gpa >> PAGE_SHIFT); | ||
885 | up_read(¤t->mm->mmap_sem); | ||
886 | |||
887 | return page; | ||
884 | } | 888 | } |
885 | 889 | ||
886 | static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte, | 890 | static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte, |
@@ -999,8 +1003,7 @@ static int __nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, | |||
999 | >> PAGE_SHIFT; | 1003 | >> PAGE_SHIFT; |
1000 | new_table = kvm_mmu_get_page(vcpu, pseudo_gfn, | 1004 | new_table = kvm_mmu_get_page(vcpu, pseudo_gfn, |
1001 | v, level - 1, | 1005 | v, level - 1, |
1002 | 1, ACC_ALL, &table[index], | 1006 | 1, ACC_ALL, &table[index]); |
1003 | NULL); | ||
1004 | if (!new_table) { | 1007 | if (!new_table) { |
1005 | pgprintk("nonpaging_map: ENOMEM\n"); | 1008 | pgprintk("nonpaging_map: ENOMEM\n"); |
1006 | kvm_release_page_clean(page); | 1009 | kvm_release_page_clean(page); |
@@ -1020,15 +1023,18 @@ static int nonpaging_map(struct kvm_vcpu *vcpu, gva_t v, int write, gfn_t gfn) | |||
1020 | 1023 | ||
1021 | struct page *page; | 1024 | struct page *page; |
1022 | 1025 | ||
1026 | down_read(&vcpu->kvm->slots_lock); | ||
1027 | |||
1023 | down_read(¤t->mm->mmap_sem); | 1028 | down_read(¤t->mm->mmap_sem); |
1024 | page = gfn_to_page(vcpu->kvm, gfn); | 1029 | page = gfn_to_page(vcpu->kvm, gfn); |
1030 | up_read(¤t->mm->mmap_sem); | ||
1025 | 1031 | ||
1026 | spin_lock(&vcpu->kvm->mmu_lock); | 1032 | spin_lock(&vcpu->kvm->mmu_lock); |
1027 | kvm_mmu_free_some_pages(vcpu); | 1033 | kvm_mmu_free_some_pages(vcpu); |
1028 | r = __nonpaging_map(vcpu, v, write, gfn, page); | 1034 | r = __nonpaging_map(vcpu, v, write, gfn, page); |
1029 | spin_unlock(&vcpu->kvm->mmu_lock); | 1035 | spin_unlock(&vcpu->kvm->mmu_lock); |
1030 | 1036 | ||
1031 | up_read(¤t->mm->mmap_sem); | 1037 | up_read(&vcpu->kvm->slots_lock); |
1032 | 1038 | ||
1033 | return r; | 1039 | return r; |
1034 | } | 1040 | } |
@@ -1090,7 +1096,7 @@ static void mmu_alloc_roots(struct kvm_vcpu *vcpu) | |||
1090 | 1096 | ||
1091 | ASSERT(!VALID_PAGE(root)); | 1097 | ASSERT(!VALID_PAGE(root)); |
1092 | sp = kvm_mmu_get_page(vcpu, root_gfn, 0, | 1098 | sp = kvm_mmu_get_page(vcpu, root_gfn, 0, |
1093 | PT64_ROOT_LEVEL, 0, ACC_ALL, NULL, NULL); | 1099 | PT64_ROOT_LEVEL, 0, ACC_ALL, NULL); |
1094 | root = __pa(sp->spt); | 1100 | root = __pa(sp->spt); |
1095 | ++sp->root_count; | 1101 | ++sp->root_count; |
1096 | vcpu->arch.mmu.root_hpa = root; | 1102 | vcpu->arch.mmu.root_hpa = root; |
@@ -1111,7 +1117,7 @@ static void mmu_alloc_roots(struct kvm_vcpu *vcpu) | |||
1111 | root_gfn = 0; | 1117 | root_gfn = 0; |
1112 | sp = kvm_mmu_get_page(vcpu, root_gfn, i << 30, | 1118 | sp = kvm_mmu_get_page(vcpu, root_gfn, i << 30, |
1113 | PT32_ROOT_LEVEL, !is_paging(vcpu), | 1119 | PT32_ROOT_LEVEL, !is_paging(vcpu), |
1114 | ACC_ALL, NULL, NULL); | 1120 | ACC_ALL, NULL); |
1115 | root = __pa(sp->spt); | 1121 | root = __pa(sp->spt); |
1116 | ++sp->root_count; | 1122 | ++sp->root_count; |
1117 | vcpu->arch.mmu.pae_root[i] = root | PT_PRESENT_MASK; | 1123 | vcpu->arch.mmu.pae_root[i] = root | PT_PRESENT_MASK; |
@@ -1172,7 +1178,7 @@ void kvm_mmu_flush_tlb(struct kvm_vcpu *vcpu) | |||
1172 | 1178 | ||
1173 | static void paging_new_cr3(struct kvm_vcpu *vcpu) | 1179 | static void paging_new_cr3(struct kvm_vcpu *vcpu) |
1174 | { | 1180 | { |
1175 | pgprintk("%s: cr3 %lx\n", __FUNCTION__, vcpu->cr3); | 1181 | pgprintk("%s: cr3 %lx\n", __FUNCTION__, vcpu->arch.cr3); |
1176 | mmu_free_roots(vcpu); | 1182 | mmu_free_roots(vcpu); |
1177 | } | 1183 | } |
1178 | 1184 | ||
@@ -1362,6 +1368,7 @@ static void mmu_guess_page_from_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, | |||
1362 | gfn_t gfn; | 1368 | gfn_t gfn; |
1363 | int r; | 1369 | int r; |
1364 | u64 gpte = 0; | 1370 | u64 gpte = 0; |
1371 | struct page *page; | ||
1365 | 1372 | ||
1366 | if (bytes != 4 && bytes != 8) | 1373 | if (bytes != 4 && bytes != 8) |
1367 | return; | 1374 | return; |
@@ -1389,6 +1396,11 @@ static void mmu_guess_page_from_pte_write(struct kvm_vcpu *vcpu, gpa_t gpa, | |||
1389 | if (!is_present_pte(gpte)) | 1396 | if (!is_present_pte(gpte)) |
1390 | return; | 1397 | return; |
1391 | gfn = (gpte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT; | 1398 | gfn = (gpte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT; |
1399 | |||
1400 | down_read(¤t->mm->mmap_sem); | ||
1401 | page = gfn_to_page(vcpu->kvm, gfn); | ||
1402 | up_read(¤t->mm->mmap_sem); | ||
1403 | |||
1392 | vcpu->arch.update_pte.gfn = gfn; | 1404 | vcpu->arch.update_pte.gfn = gfn; |
1393 | vcpu->arch.update_pte.page = gfn_to_page(vcpu->kvm, gfn); | 1405 | vcpu->arch.update_pte.page = gfn_to_page(vcpu->kvm, gfn); |
1394 | } | 1406 | } |
@@ -1496,9 +1508,9 @@ int kvm_mmu_unprotect_page_virt(struct kvm_vcpu *vcpu, gva_t gva) | |||
1496 | gpa_t gpa; | 1508 | gpa_t gpa; |
1497 | int r; | 1509 | int r; |
1498 | 1510 | ||
1499 | down_read(¤t->mm->mmap_sem); | 1511 | down_read(&vcpu->kvm->slots_lock); |
1500 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, gva); | 1512 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, gva); |
1501 | up_read(¤t->mm->mmap_sem); | 1513 | up_read(&vcpu->kvm->slots_lock); |
1502 | 1514 | ||
1503 | spin_lock(&vcpu->kvm->mmu_lock); | 1515 | spin_lock(&vcpu->kvm->mmu_lock); |
1504 | r = kvm_mmu_unprotect_page(vcpu->kvm, gpa >> PAGE_SHIFT); | 1516 | r = kvm_mmu_unprotect_page(vcpu->kvm, gpa >> PAGE_SHIFT); |
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h index 03ba8608fe0f..ecc0856268c4 100644 --- a/arch/x86/kvm/paging_tmpl.h +++ b/arch/x86/kvm/paging_tmpl.h | |||
@@ -91,7 +91,10 @@ static bool FNAME(cmpxchg_gpte)(struct kvm *kvm, | |||
91 | pt_element_t *table; | 91 | pt_element_t *table; |
92 | struct page *page; | 92 | struct page *page; |
93 | 93 | ||
94 | down_read(¤t->mm->mmap_sem); | ||
94 | page = gfn_to_page(kvm, table_gfn); | 95 | page = gfn_to_page(kvm, table_gfn); |
96 | up_read(¤t->mm->mmap_sem); | ||
97 | |||
95 | table = kmap_atomic(page, KM_USER0); | 98 | table = kmap_atomic(page, KM_USER0); |
96 | 99 | ||
97 | ret = CMPXCHG(&table[index], orig_pte, new_pte); | 100 | ret = CMPXCHG(&table[index], orig_pte, new_pte); |
@@ -140,7 +143,7 @@ walk: | |||
140 | } | 143 | } |
141 | #endif | 144 | #endif |
142 | ASSERT((!is_long_mode(vcpu) && is_pae(vcpu)) || | 145 | ASSERT((!is_long_mode(vcpu) && is_pae(vcpu)) || |
143 | (vcpu->cr3 & CR3_NONPAE_RESERVED_BITS) == 0); | 146 | (vcpu->arch.cr3 & CR3_NONPAE_RESERVED_BITS) == 0); |
144 | 147 | ||
145 | pt_access = ACC_ALL; | 148 | pt_access = ACC_ALL; |
146 | 149 | ||
@@ -297,7 +300,6 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
297 | u64 shadow_pte; | 300 | u64 shadow_pte; |
298 | int metaphysical; | 301 | int metaphysical; |
299 | gfn_t table_gfn; | 302 | gfn_t table_gfn; |
300 | bool new_page = 0; | ||
301 | 303 | ||
302 | shadow_ent = ((u64 *)__va(shadow_addr)) + index; | 304 | shadow_ent = ((u64 *)__va(shadow_addr)) + index; |
303 | if (level == PT_PAGE_TABLE_LEVEL) | 305 | if (level == PT_PAGE_TABLE_LEVEL) |
@@ -319,8 +321,8 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
319 | } | 321 | } |
320 | shadow_page = kvm_mmu_get_page(vcpu, table_gfn, addr, level-1, | 322 | shadow_page = kvm_mmu_get_page(vcpu, table_gfn, addr, level-1, |
321 | metaphysical, access, | 323 | metaphysical, access, |
322 | shadow_ent, &new_page); | 324 | shadow_ent); |
323 | if (new_page && !metaphysical) { | 325 | if (!metaphysical) { |
324 | int r; | 326 | int r; |
325 | pt_element_t curr_pte; | 327 | pt_element_t curr_pte; |
326 | r = kvm_read_guest_atomic(vcpu->kvm, | 328 | r = kvm_read_guest_atomic(vcpu->kvm, |
@@ -378,7 +380,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, | |||
378 | if (r) | 380 | if (r) |
379 | return r; | 381 | return r; |
380 | 382 | ||
381 | down_read(¤t->mm->mmap_sem); | 383 | down_read(&vcpu->kvm->slots_lock); |
382 | /* | 384 | /* |
383 | * Look up the shadow pte for the faulting address. | 385 | * Look up the shadow pte for the faulting address. |
384 | */ | 386 | */ |
@@ -392,11 +394,13 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, | |||
392 | pgprintk("%s: guest page fault\n", __FUNCTION__); | 394 | pgprintk("%s: guest page fault\n", __FUNCTION__); |
393 | inject_page_fault(vcpu, addr, walker.error_code); | 395 | inject_page_fault(vcpu, addr, walker.error_code); |
394 | vcpu->arch.last_pt_write_count = 0; /* reset fork detector */ | 396 | vcpu->arch.last_pt_write_count = 0; /* reset fork detector */ |
395 | up_read(¤t->mm->mmap_sem); | 397 | up_read(&vcpu->kvm->slots_lock); |
396 | return 0; | 398 | return 0; |
397 | } | 399 | } |
398 | 400 | ||
401 | down_read(¤t->mm->mmap_sem); | ||
399 | page = gfn_to_page(vcpu->kvm, walker.gfn); | 402 | page = gfn_to_page(vcpu->kvm, walker.gfn); |
403 | up_read(¤t->mm->mmap_sem); | ||
400 | 404 | ||
401 | spin_lock(&vcpu->kvm->mmu_lock); | 405 | spin_lock(&vcpu->kvm->mmu_lock); |
402 | kvm_mmu_free_some_pages(vcpu); | 406 | kvm_mmu_free_some_pages(vcpu); |
@@ -413,14 +417,14 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr, | |||
413 | */ | 417 | */ |
414 | if (shadow_pte && is_io_pte(*shadow_pte)) { | 418 | if (shadow_pte && is_io_pte(*shadow_pte)) { |
415 | spin_unlock(&vcpu->kvm->mmu_lock); | 419 | spin_unlock(&vcpu->kvm->mmu_lock); |
416 | up_read(¤t->mm->mmap_sem); | 420 | up_read(&vcpu->kvm->slots_lock); |
417 | return 1; | 421 | return 1; |
418 | } | 422 | } |
419 | 423 | ||
420 | ++vcpu->stat.pf_fixed; | 424 | ++vcpu->stat.pf_fixed; |
421 | kvm_mmu_audit(vcpu, "post page fault (fixed)"); | 425 | kvm_mmu_audit(vcpu, "post page fault (fixed)"); |
422 | spin_unlock(&vcpu->kvm->mmu_lock); | 426 | spin_unlock(&vcpu->kvm->mmu_lock); |
423 | up_read(¤t->mm->mmap_sem); | 427 | up_read(&vcpu->kvm->slots_lock); |
424 | 428 | ||
425 | return write_pt; | 429 | return write_pt; |
426 | } | 430 | } |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index de755cb1431d..1a582f1090e8 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
@@ -792,6 +792,10 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
792 | vcpu->arch.cr0 = cr0; | 792 | vcpu->arch.cr0 = cr0; |
793 | cr0 |= X86_CR0_PG | X86_CR0_WP; | 793 | cr0 |= X86_CR0_PG | X86_CR0_WP; |
794 | cr0 &= ~(X86_CR0_CD | X86_CR0_NW); | 794 | cr0 &= ~(X86_CR0_CD | X86_CR0_NW); |
795 | if (!vcpu->fpu_active) { | ||
796 | svm->vmcb->control.intercept_exceptions |= (1 << NM_VECTOR); | ||
797 | cr0 |= X86_CR0_TS; | ||
798 | } | ||
795 | svm->vmcb->save.cr0 = cr0; | 799 | svm->vmcb->save.cr0 = cr0; |
796 | } | 800 | } |
797 | 801 | ||
@@ -1096,6 +1100,24 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 *data) | |||
1096 | case MSR_IA32_SYSENTER_ESP: | 1100 | case MSR_IA32_SYSENTER_ESP: |
1097 | *data = svm->vmcb->save.sysenter_esp; | 1101 | *data = svm->vmcb->save.sysenter_esp; |
1098 | break; | 1102 | break; |
1103 | /* Nobody will change the following 5 values in the VMCB so | ||
1104 | we can safely return them on rdmsr. They will always be 0 | ||
1105 | until LBRV is implemented. */ | ||
1106 | case MSR_IA32_DEBUGCTLMSR: | ||
1107 | *data = svm->vmcb->save.dbgctl; | ||
1108 | break; | ||
1109 | case MSR_IA32_LASTBRANCHFROMIP: | ||
1110 | *data = svm->vmcb->save.br_from; | ||
1111 | break; | ||
1112 | case MSR_IA32_LASTBRANCHTOIP: | ||
1113 | *data = svm->vmcb->save.br_to; | ||
1114 | break; | ||
1115 | case MSR_IA32_LASTINTFROMIP: | ||
1116 | *data = svm->vmcb->save.last_excp_from; | ||
1117 | break; | ||
1118 | case MSR_IA32_LASTINTTOIP: | ||
1119 | *data = svm->vmcb->save.last_excp_to; | ||
1120 | break; | ||
1099 | default: | 1121 | default: |
1100 | return kvm_get_msr_common(vcpu, ecx, data); | 1122 | return kvm_get_msr_common(vcpu, ecx, data); |
1101 | } | 1123 | } |
@@ -1156,6 +1178,10 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data) | |||
1156 | case MSR_IA32_SYSENTER_ESP: | 1178 | case MSR_IA32_SYSENTER_ESP: |
1157 | svm->vmcb->save.sysenter_esp = data; | 1179 | svm->vmcb->save.sysenter_esp = data; |
1158 | break; | 1180 | break; |
1181 | case MSR_IA32_DEBUGCTLMSR: | ||
1182 | pr_unimpl(vcpu, "%s: MSR_IA32_DEBUGCTLMSR 0x%llx, nop\n", | ||
1183 | __FUNCTION__, data); | ||
1184 | break; | ||
1159 | case MSR_K7_EVNTSEL0: | 1185 | case MSR_K7_EVNTSEL0: |
1160 | case MSR_K7_EVNTSEL1: | 1186 | case MSR_K7_EVNTSEL1: |
1161 | case MSR_K7_EVNTSEL2: | 1187 | case MSR_K7_EVNTSEL2: |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index ad36447e696e..94ea724638fd 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -638,6 +638,7 @@ static void setup_msrs(struct vcpu_vmx *vmx) | |||
638 | { | 638 | { |
639 | int save_nmsrs; | 639 | int save_nmsrs; |
640 | 640 | ||
641 | vmx_load_host_state(vmx); | ||
641 | save_nmsrs = 0; | 642 | save_nmsrs = 0; |
642 | #ifdef CONFIG_X86_64 | 643 | #ifdef CONFIG_X86_64 |
643 | if (is_long_mode(&vmx->vcpu)) { | 644 | if (is_long_mode(&vmx->vcpu)) { |
@@ -1477,7 +1478,7 @@ static int alloc_apic_access_page(struct kvm *kvm) | |||
1477 | struct kvm_userspace_memory_region kvm_userspace_mem; | 1478 | struct kvm_userspace_memory_region kvm_userspace_mem; |
1478 | int r = 0; | 1479 | int r = 0; |
1479 | 1480 | ||
1480 | down_write(¤t->mm->mmap_sem); | 1481 | down_write(&kvm->slots_lock); |
1481 | if (kvm->arch.apic_access_page) | 1482 | if (kvm->arch.apic_access_page) |
1482 | goto out; | 1483 | goto out; |
1483 | kvm_userspace_mem.slot = APIC_ACCESS_PAGE_PRIVATE_MEMSLOT; | 1484 | kvm_userspace_mem.slot = APIC_ACCESS_PAGE_PRIVATE_MEMSLOT; |
@@ -1487,9 +1488,12 @@ static int alloc_apic_access_page(struct kvm *kvm) | |||
1487 | r = __kvm_set_memory_region(kvm, &kvm_userspace_mem, 0); | 1488 | r = __kvm_set_memory_region(kvm, &kvm_userspace_mem, 0); |
1488 | if (r) | 1489 | if (r) |
1489 | goto out; | 1490 | goto out; |
1491 | |||
1492 | down_read(¤t->mm->mmap_sem); | ||
1490 | kvm->arch.apic_access_page = gfn_to_page(kvm, 0xfee00); | 1493 | kvm->arch.apic_access_page = gfn_to_page(kvm, 0xfee00); |
1494 | up_read(¤t->mm->mmap_sem); | ||
1491 | out: | 1495 | out: |
1492 | up_write(¤t->mm->mmap_sem); | 1496 | up_write(&kvm->slots_lock); |
1493 | return r; | 1497 | return r; |
1494 | } | 1498 | } |
1495 | 1499 | ||
@@ -1602,9 +1606,6 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx) | |||
1602 | vmcs_writel(CR0_GUEST_HOST_MASK, ~0UL); | 1606 | vmcs_writel(CR0_GUEST_HOST_MASK, ~0UL); |
1603 | vmcs_writel(CR4_GUEST_HOST_MASK, KVM_GUEST_CR4_MASK); | 1607 | vmcs_writel(CR4_GUEST_HOST_MASK, KVM_GUEST_CR4_MASK); |
1604 | 1608 | ||
1605 | if (vm_need_virtualize_apic_accesses(vmx->vcpu.kvm)) | ||
1606 | if (alloc_apic_access_page(vmx->vcpu.kvm) != 0) | ||
1607 | return -ENOMEM; | ||
1608 | 1609 | ||
1609 | return 0; | 1610 | return 0; |
1610 | } | 1611 | } |
@@ -2534,6 +2535,9 @@ static struct kvm_vcpu *vmx_create_vcpu(struct kvm *kvm, unsigned int id) | |||
2534 | put_cpu(); | 2535 | put_cpu(); |
2535 | if (err) | 2536 | if (err) |
2536 | goto free_vmcs; | 2537 | goto free_vmcs; |
2538 | if (vm_need_virtualize_apic_accesses(kvm)) | ||
2539 | if (alloc_apic_access_page(kvm) != 0) | ||
2540 | goto free_vmcs; | ||
2537 | 2541 | ||
2538 | return &vmx->vcpu; | 2542 | return &vmx->vcpu; |
2539 | 2543 | ||
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index cf5308148689..6b01552bd1f1 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -46,6 +46,9 @@ | |||
46 | #define VM_STAT(x) offsetof(struct kvm, stat.x), KVM_STAT_VM | 46 | #define VM_STAT(x) offsetof(struct kvm, stat.x), KVM_STAT_VM |
47 | #define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU | 47 | #define VCPU_STAT(x) offsetof(struct kvm_vcpu, stat.x), KVM_STAT_VCPU |
48 | 48 | ||
49 | static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, | ||
50 | struct kvm_cpuid_entry2 __user *entries); | ||
51 | |||
49 | struct kvm_x86_ops *kvm_x86_ops; | 52 | struct kvm_x86_ops *kvm_x86_ops; |
50 | 53 | ||
51 | struct kvm_stats_debugfs_item debugfs_entries[] = { | 54 | struct kvm_stats_debugfs_item debugfs_entries[] = { |
@@ -181,7 +184,7 @@ int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3) | |||
181 | int ret; | 184 | int ret; |
182 | u64 pdpte[ARRAY_SIZE(vcpu->arch.pdptrs)]; | 185 | u64 pdpte[ARRAY_SIZE(vcpu->arch.pdptrs)]; |
183 | 186 | ||
184 | down_read(¤t->mm->mmap_sem); | 187 | down_read(&vcpu->kvm->slots_lock); |
185 | ret = kvm_read_guest_page(vcpu->kvm, pdpt_gfn, pdpte, | 188 | ret = kvm_read_guest_page(vcpu->kvm, pdpt_gfn, pdpte, |
186 | offset * sizeof(u64), sizeof(pdpte)); | 189 | offset * sizeof(u64), sizeof(pdpte)); |
187 | if (ret < 0) { | 190 | if (ret < 0) { |
@@ -198,7 +201,7 @@ int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3) | |||
198 | 201 | ||
199 | memcpy(vcpu->arch.pdptrs, pdpte, sizeof(vcpu->arch.pdptrs)); | 202 | memcpy(vcpu->arch.pdptrs, pdpte, sizeof(vcpu->arch.pdptrs)); |
200 | out: | 203 | out: |
201 | up_read(¤t->mm->mmap_sem); | 204 | up_read(&vcpu->kvm->slots_lock); |
202 | 205 | ||
203 | return ret; | 206 | return ret; |
204 | } | 207 | } |
@@ -212,13 +215,13 @@ static bool pdptrs_changed(struct kvm_vcpu *vcpu) | |||
212 | if (is_long_mode(vcpu) || !is_pae(vcpu)) | 215 | if (is_long_mode(vcpu) || !is_pae(vcpu)) |
213 | return false; | 216 | return false; |
214 | 217 | ||
215 | down_read(¤t->mm->mmap_sem); | 218 | down_read(&vcpu->kvm->slots_lock); |
216 | r = kvm_read_guest(vcpu->kvm, vcpu->arch.cr3 & ~31u, pdpte, sizeof(pdpte)); | 219 | r = kvm_read_guest(vcpu->kvm, vcpu->arch.cr3 & ~31u, pdpte, sizeof(pdpte)); |
217 | if (r < 0) | 220 | if (r < 0) |
218 | goto out; | 221 | goto out; |
219 | changed = memcmp(pdpte, vcpu->arch.pdptrs, sizeof(pdpte)) != 0; | 222 | changed = memcmp(pdpte, vcpu->arch.pdptrs, sizeof(pdpte)) != 0; |
220 | out: | 223 | out: |
221 | up_read(¤t->mm->mmap_sem); | 224 | up_read(&vcpu->kvm->slots_lock); |
222 | 225 | ||
223 | return changed; | 226 | return changed; |
224 | } | 227 | } |
@@ -356,7 +359,7 @@ void set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) | |||
356 | */ | 359 | */ |
357 | } | 360 | } |
358 | 361 | ||
359 | down_read(¤t->mm->mmap_sem); | 362 | down_read(&vcpu->kvm->slots_lock); |
360 | /* | 363 | /* |
361 | * Does the new cr3 value map to physical memory? (Note, we | 364 | * Does the new cr3 value map to physical memory? (Note, we |
362 | * catch an invalid cr3 even in real-mode, because it would | 365 | * catch an invalid cr3 even in real-mode, because it would |
@@ -372,7 +375,7 @@ void set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) | |||
372 | vcpu->arch.cr3 = cr3; | 375 | vcpu->arch.cr3 = cr3; |
373 | vcpu->arch.mmu.new_cr3(vcpu); | 376 | vcpu->arch.mmu.new_cr3(vcpu); |
374 | } | 377 | } |
375 | up_read(¤t->mm->mmap_sem); | 378 | up_read(&vcpu->kvm->slots_lock); |
376 | } | 379 | } |
377 | EXPORT_SYMBOL_GPL(set_cr3); | 380 | EXPORT_SYMBOL_GPL(set_cr3); |
378 | 381 | ||
@@ -484,6 +487,10 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data) | |||
484 | pr_unimpl(vcpu, "%s: MSR_IA32_MCG_STATUS 0x%llx, nop\n", | 487 | pr_unimpl(vcpu, "%s: MSR_IA32_MCG_STATUS 0x%llx, nop\n", |
485 | __FUNCTION__, data); | 488 | __FUNCTION__, data); |
486 | break; | 489 | break; |
490 | case MSR_IA32_MCG_CTL: | ||
491 | pr_unimpl(vcpu, "%s: MSR_IA32_MCG_CTL 0x%llx, nop\n", | ||
492 | __FUNCTION__, data); | ||
493 | break; | ||
487 | case MSR_IA32_UCODE_REV: | 494 | case MSR_IA32_UCODE_REV: |
488 | case MSR_IA32_UCODE_WRITE: | 495 | case MSR_IA32_UCODE_WRITE: |
489 | case 0x200 ... 0x2ff: /* MTRRs */ | 496 | case 0x200 ... 0x2ff: /* MTRRs */ |
@@ -526,6 +533,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | |||
526 | case MSR_IA32_MC0_CTL: | 533 | case MSR_IA32_MC0_CTL: |
527 | case MSR_IA32_MCG_STATUS: | 534 | case MSR_IA32_MCG_STATUS: |
528 | case MSR_IA32_MCG_CAP: | 535 | case MSR_IA32_MCG_CAP: |
536 | case MSR_IA32_MCG_CTL: | ||
529 | case MSR_IA32_MC0_MISC: | 537 | case MSR_IA32_MC0_MISC: |
530 | case MSR_IA32_MC0_MISC+4: | 538 | case MSR_IA32_MC0_MISC+4: |
531 | case MSR_IA32_MC0_MISC+8: | 539 | case MSR_IA32_MC0_MISC+8: |
@@ -727,6 +735,24 @@ long kvm_arch_dev_ioctl(struct file *filp, | |||
727 | r = 0; | 735 | r = 0; |
728 | break; | 736 | break; |
729 | } | 737 | } |
738 | case KVM_GET_SUPPORTED_CPUID: { | ||
739 | struct kvm_cpuid2 __user *cpuid_arg = argp; | ||
740 | struct kvm_cpuid2 cpuid; | ||
741 | |||
742 | r = -EFAULT; | ||
743 | if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) | ||
744 | goto out; | ||
745 | r = kvm_dev_ioctl_get_supported_cpuid(&cpuid, | ||
746 | cpuid_arg->entries); | ||
747 | if (r) | ||
748 | goto out; | ||
749 | |||
750 | r = -EFAULT; | ||
751 | if (copy_to_user(cpuid_arg, &cpuid, sizeof cpuid)) | ||
752 | goto out; | ||
753 | r = 0; | ||
754 | break; | ||
755 | } | ||
730 | default: | 756 | default: |
731 | r = -EINVAL; | 757 | r = -EINVAL; |
732 | } | 758 | } |
@@ -974,8 +1000,7 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
974 | put_cpu(); | 1000 | put_cpu(); |
975 | } | 1001 | } |
976 | 1002 | ||
977 | static int kvm_vm_ioctl_get_supported_cpuid(struct kvm *kvm, | 1003 | static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, |
978 | struct kvm_cpuid2 *cpuid, | ||
979 | struct kvm_cpuid_entry2 __user *entries) | 1004 | struct kvm_cpuid_entry2 __user *entries) |
980 | { | 1005 | { |
981 | struct kvm_cpuid_entry2 *cpuid_entries; | 1006 | struct kvm_cpuid_entry2 *cpuid_entries; |
@@ -1207,12 +1232,12 @@ static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm, | |||
1207 | if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES) | 1232 | if (kvm_nr_mmu_pages < KVM_MIN_ALLOC_MMU_PAGES) |
1208 | return -EINVAL; | 1233 | return -EINVAL; |
1209 | 1234 | ||
1210 | down_write(¤t->mm->mmap_sem); | 1235 | down_write(&kvm->slots_lock); |
1211 | 1236 | ||
1212 | kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages); | 1237 | kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages); |
1213 | kvm->arch.n_requested_mmu_pages = kvm_nr_mmu_pages; | 1238 | kvm->arch.n_requested_mmu_pages = kvm_nr_mmu_pages; |
1214 | 1239 | ||
1215 | up_write(¤t->mm->mmap_sem); | 1240 | up_write(&kvm->slots_lock); |
1216 | return 0; | 1241 | return 0; |
1217 | } | 1242 | } |
1218 | 1243 | ||
@@ -1261,7 +1286,7 @@ static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm, | |||
1261 | < alias->target_phys_addr) | 1286 | < alias->target_phys_addr) |
1262 | goto out; | 1287 | goto out; |
1263 | 1288 | ||
1264 | down_write(¤t->mm->mmap_sem); | 1289 | down_write(&kvm->slots_lock); |
1265 | 1290 | ||
1266 | p = &kvm->arch.aliases[alias->slot]; | 1291 | p = &kvm->arch.aliases[alias->slot]; |
1267 | p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT; | 1292 | p->base_gfn = alias->guest_phys_addr >> PAGE_SHIFT; |
@@ -1275,7 +1300,7 @@ static int kvm_vm_ioctl_set_memory_alias(struct kvm *kvm, | |||
1275 | 1300 | ||
1276 | kvm_mmu_zap_all(kvm); | 1301 | kvm_mmu_zap_all(kvm); |
1277 | 1302 | ||
1278 | up_write(¤t->mm->mmap_sem); | 1303 | up_write(&kvm->slots_lock); |
1279 | 1304 | ||
1280 | return 0; | 1305 | return 0; |
1281 | 1306 | ||
@@ -1351,7 +1376,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
1351 | struct kvm_memory_slot *memslot; | 1376 | struct kvm_memory_slot *memslot; |
1352 | int is_dirty = 0; | 1377 | int is_dirty = 0; |
1353 | 1378 | ||
1354 | down_write(¤t->mm->mmap_sem); | 1379 | down_write(&kvm->slots_lock); |
1355 | 1380 | ||
1356 | r = kvm_get_dirty_log(kvm, log, &is_dirty); | 1381 | r = kvm_get_dirty_log(kvm, log, &is_dirty); |
1357 | if (r) | 1382 | if (r) |
@@ -1367,7 +1392,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
1367 | } | 1392 | } |
1368 | r = 0; | 1393 | r = 0; |
1369 | out: | 1394 | out: |
1370 | up_write(¤t->mm->mmap_sem); | 1395 | up_write(&kvm->slots_lock); |
1371 | return r; | 1396 | return r; |
1372 | } | 1397 | } |
1373 | 1398 | ||
@@ -1487,24 +1512,6 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
1487 | r = 0; | 1512 | r = 0; |
1488 | break; | 1513 | break; |
1489 | } | 1514 | } |
1490 | case KVM_GET_SUPPORTED_CPUID: { | ||
1491 | struct kvm_cpuid2 __user *cpuid_arg = argp; | ||
1492 | struct kvm_cpuid2 cpuid; | ||
1493 | |||
1494 | r = -EFAULT; | ||
1495 | if (copy_from_user(&cpuid, cpuid_arg, sizeof cpuid)) | ||
1496 | goto out; | ||
1497 | r = kvm_vm_ioctl_get_supported_cpuid(kvm, &cpuid, | ||
1498 | cpuid_arg->entries); | ||
1499 | if (r) | ||
1500 | goto out; | ||
1501 | |||
1502 | r = -EFAULT; | ||
1503 | if (copy_to_user(cpuid_arg, &cpuid, sizeof cpuid)) | ||
1504 | goto out; | ||
1505 | r = 0; | ||
1506 | break; | ||
1507 | } | ||
1508 | default: | 1515 | default: |
1509 | ; | 1516 | ; |
1510 | } | 1517 | } |
@@ -1563,7 +1570,7 @@ int emulator_read_std(unsigned long addr, | |||
1563 | void *data = val; | 1570 | void *data = val; |
1564 | int r = X86EMUL_CONTINUE; | 1571 | int r = X86EMUL_CONTINUE; |
1565 | 1572 | ||
1566 | down_read(¤t->mm->mmap_sem); | 1573 | down_read(&vcpu->kvm->slots_lock); |
1567 | while (bytes) { | 1574 | while (bytes) { |
1568 | gpa_t gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); | 1575 | gpa_t gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); |
1569 | unsigned offset = addr & (PAGE_SIZE-1); | 1576 | unsigned offset = addr & (PAGE_SIZE-1); |
@@ -1585,7 +1592,7 @@ int emulator_read_std(unsigned long addr, | |||
1585 | addr += tocopy; | 1592 | addr += tocopy; |
1586 | } | 1593 | } |
1587 | out: | 1594 | out: |
1588 | up_read(¤t->mm->mmap_sem); | 1595 | up_read(&vcpu->kvm->slots_lock); |
1589 | return r; | 1596 | return r; |
1590 | } | 1597 | } |
1591 | EXPORT_SYMBOL_GPL(emulator_read_std); | 1598 | EXPORT_SYMBOL_GPL(emulator_read_std); |
@@ -1604,9 +1611,9 @@ static int emulator_read_emulated(unsigned long addr, | |||
1604 | return X86EMUL_CONTINUE; | 1611 | return X86EMUL_CONTINUE; |
1605 | } | 1612 | } |
1606 | 1613 | ||
1607 | down_read(¤t->mm->mmap_sem); | 1614 | down_read(&vcpu->kvm->slots_lock); |
1608 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); | 1615 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); |
1609 | up_read(¤t->mm->mmap_sem); | 1616 | up_read(&vcpu->kvm->slots_lock); |
1610 | 1617 | ||
1611 | /* For APIC access vmexit */ | 1618 | /* For APIC access vmexit */ |
1612 | if ((gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE) | 1619 | if ((gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE) |
@@ -1644,14 +1651,14 @@ static int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa, | |||
1644 | { | 1651 | { |
1645 | int ret; | 1652 | int ret; |
1646 | 1653 | ||
1647 | down_read(¤t->mm->mmap_sem); | 1654 | down_read(&vcpu->kvm->slots_lock); |
1648 | ret = kvm_write_guest(vcpu->kvm, gpa, val, bytes); | 1655 | ret = kvm_write_guest(vcpu->kvm, gpa, val, bytes); |
1649 | if (ret < 0) { | 1656 | if (ret < 0) { |
1650 | up_read(¤t->mm->mmap_sem); | 1657 | up_read(&vcpu->kvm->slots_lock); |
1651 | return 0; | 1658 | return 0; |
1652 | } | 1659 | } |
1653 | kvm_mmu_pte_write(vcpu, gpa, val, bytes); | 1660 | kvm_mmu_pte_write(vcpu, gpa, val, bytes); |
1654 | up_read(¤t->mm->mmap_sem); | 1661 | up_read(&vcpu->kvm->slots_lock); |
1655 | return 1; | 1662 | return 1; |
1656 | } | 1663 | } |
1657 | 1664 | ||
@@ -1663,9 +1670,9 @@ static int emulator_write_emulated_onepage(unsigned long addr, | |||
1663 | struct kvm_io_device *mmio_dev; | 1670 | struct kvm_io_device *mmio_dev; |
1664 | gpa_t gpa; | 1671 | gpa_t gpa; |
1665 | 1672 | ||
1666 | down_read(¤t->mm->mmap_sem); | 1673 | down_read(&vcpu->kvm->slots_lock); |
1667 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); | 1674 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); |
1668 | up_read(¤t->mm->mmap_sem); | 1675 | up_read(&vcpu->kvm->slots_lock); |
1669 | 1676 | ||
1670 | if (gpa == UNMAPPED_GVA) { | 1677 | if (gpa == UNMAPPED_GVA) { |
1671 | kvm_inject_page_fault(vcpu, addr, 2); | 1678 | kvm_inject_page_fault(vcpu, addr, 2); |
@@ -1742,7 +1749,7 @@ static int emulator_cmpxchg_emulated(unsigned long addr, | |||
1742 | char *kaddr; | 1749 | char *kaddr; |
1743 | u64 val; | 1750 | u64 val; |
1744 | 1751 | ||
1745 | down_read(¤t->mm->mmap_sem); | 1752 | down_read(&vcpu->kvm->slots_lock); |
1746 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); | 1753 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, addr); |
1747 | 1754 | ||
1748 | if (gpa == UNMAPPED_GVA || | 1755 | if (gpa == UNMAPPED_GVA || |
@@ -1753,13 +1760,17 @@ static int emulator_cmpxchg_emulated(unsigned long addr, | |||
1753 | goto emul_write; | 1760 | goto emul_write; |
1754 | 1761 | ||
1755 | val = *(u64 *)new; | 1762 | val = *(u64 *)new; |
1763 | |||
1764 | down_read(¤t->mm->mmap_sem); | ||
1756 | page = gfn_to_page(vcpu->kvm, gpa >> PAGE_SHIFT); | 1765 | page = gfn_to_page(vcpu->kvm, gpa >> PAGE_SHIFT); |
1766 | up_read(¤t->mm->mmap_sem); | ||
1767 | |||
1757 | kaddr = kmap_atomic(page, KM_USER0); | 1768 | kaddr = kmap_atomic(page, KM_USER0); |
1758 | set_64bit((u64 *)(kaddr + offset_in_page(gpa)), val); | 1769 | set_64bit((u64 *)(kaddr + offset_in_page(gpa)), val); |
1759 | kunmap_atomic(kaddr, KM_USER0); | 1770 | kunmap_atomic(kaddr, KM_USER0); |
1760 | kvm_release_page_dirty(page); | 1771 | kvm_release_page_dirty(page); |
1761 | emul_write: | 1772 | emul_write: |
1762 | up_read(¤t->mm->mmap_sem); | 1773 | up_read(&vcpu->kvm->slots_lock); |
1763 | } | 1774 | } |
1764 | #endif | 1775 | #endif |
1765 | 1776 | ||
@@ -2152,10 +2163,10 @@ int kvm_emulate_pio_string(struct kvm_vcpu *vcpu, struct kvm_run *run, int in, | |||
2152 | kvm_x86_ops->skip_emulated_instruction(vcpu); | 2163 | kvm_x86_ops->skip_emulated_instruction(vcpu); |
2153 | 2164 | ||
2154 | for (i = 0; i < nr_pages; ++i) { | 2165 | for (i = 0; i < nr_pages; ++i) { |
2155 | down_read(¤t->mm->mmap_sem); | 2166 | down_read(&vcpu->kvm->slots_lock); |
2156 | page = gva_to_page(vcpu, address + i * PAGE_SIZE); | 2167 | page = gva_to_page(vcpu, address + i * PAGE_SIZE); |
2157 | vcpu->arch.pio.guest_pages[i] = page; | 2168 | vcpu->arch.pio.guest_pages[i] = page; |
2158 | up_read(¤t->mm->mmap_sem); | 2169 | up_read(&vcpu->kvm->slots_lock); |
2159 | if (!page) { | 2170 | if (!page) { |
2160 | kvm_inject_gp(vcpu, 0); | 2171 | kvm_inject_gp(vcpu, 0); |
2161 | free_pio_guest_pages(vcpu); | 2172 | free_pio_guest_pages(vcpu); |
@@ -2478,8 +2489,9 @@ static void vapic_enter(struct kvm_vcpu *vcpu) | |||
2478 | 2489 | ||
2479 | down_read(¤t->mm->mmap_sem); | 2490 | down_read(¤t->mm->mmap_sem); |
2480 | page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); | 2491 | page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); |
2481 | vcpu->arch.apic->vapic_page = page; | ||
2482 | up_read(¤t->mm->mmap_sem); | 2492 | up_read(¤t->mm->mmap_sem); |
2493 | |||
2494 | vcpu->arch.apic->vapic_page = page; | ||
2483 | } | 2495 | } |
2484 | 2496 | ||
2485 | static void vapic_exit(struct kvm_vcpu *vcpu) | 2497 | static void vapic_exit(struct kvm_vcpu *vcpu) |
@@ -2861,8 +2873,8 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
2861 | kvm_x86_ops->decache_cr4_guest_bits(vcpu); | 2873 | kvm_x86_ops->decache_cr4_guest_bits(vcpu); |
2862 | 2874 | ||
2863 | mmu_reset_needed |= vcpu->arch.cr0 != sregs->cr0; | 2875 | mmu_reset_needed |= vcpu->arch.cr0 != sregs->cr0; |
2864 | vcpu->arch.cr0 = sregs->cr0; | ||
2865 | kvm_x86_ops->set_cr0(vcpu, sregs->cr0); | 2876 | kvm_x86_ops->set_cr0(vcpu, sregs->cr0); |
2877 | vcpu->arch.cr0 = sregs->cr0; | ||
2866 | 2878 | ||
2867 | mmu_reset_needed |= vcpu->arch.cr4 != sregs->cr4; | 2879 | mmu_reset_needed |= vcpu->arch.cr4 != sregs->cr4; |
2868 | kvm_x86_ops->set_cr4(vcpu, sregs->cr4); | 2880 | kvm_x86_ops->set_cr4(vcpu, sregs->cr4); |
@@ -2952,9 +2964,9 @@ int kvm_arch_vcpu_ioctl_translate(struct kvm_vcpu *vcpu, | |||
2952 | gpa_t gpa; | 2964 | gpa_t gpa; |
2953 | 2965 | ||
2954 | vcpu_load(vcpu); | 2966 | vcpu_load(vcpu); |
2955 | down_read(¤t->mm->mmap_sem); | 2967 | down_read(&vcpu->kvm->slots_lock); |
2956 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, vaddr); | 2968 | gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, vaddr); |
2957 | up_read(¤t->mm->mmap_sem); | 2969 | up_read(&vcpu->kvm->slots_lock); |
2958 | tr->physical_address = gpa; | 2970 | tr->physical_address = gpa; |
2959 | tr->valid = gpa != UNMAPPED_GVA; | 2971 | tr->valid = gpa != UNMAPPED_GVA; |
2960 | tr->writeable = 1; | 2972 | tr->writeable = 1; |
@@ -3227,11 +3239,13 @@ int kvm_arch_set_memory_region(struct kvm *kvm, | |||
3227 | */ | 3239 | */ |
3228 | if (!user_alloc) { | 3240 | if (!user_alloc) { |
3229 | if (npages && !old.rmap) { | 3241 | if (npages && !old.rmap) { |
3242 | down_write(¤t->mm->mmap_sem); | ||
3230 | memslot->userspace_addr = do_mmap(NULL, 0, | 3243 | memslot->userspace_addr = do_mmap(NULL, 0, |
3231 | npages * PAGE_SIZE, | 3244 | npages * PAGE_SIZE, |
3232 | PROT_READ | PROT_WRITE, | 3245 | PROT_READ | PROT_WRITE, |
3233 | MAP_SHARED | MAP_ANONYMOUS, | 3246 | MAP_SHARED | MAP_ANONYMOUS, |
3234 | 0); | 3247 | 0); |
3248 | up_write(¤t->mm->mmap_sem); | ||
3235 | 3249 | ||
3236 | if (IS_ERR((void *)memslot->userspace_addr)) | 3250 | if (IS_ERR((void *)memslot->userspace_addr)) |
3237 | return PTR_ERR((void *)memslot->userspace_addr); | 3251 | return PTR_ERR((void *)memslot->userspace_addr); |
@@ -3239,8 +3253,10 @@ int kvm_arch_set_memory_region(struct kvm *kvm, | |||
3239 | if (!old.user_alloc && old.rmap) { | 3253 | if (!old.user_alloc && old.rmap) { |
3240 | int ret; | 3254 | int ret; |
3241 | 3255 | ||
3256 | down_write(¤t->mm->mmap_sem); | ||
3242 | ret = do_munmap(current->mm, old.userspace_addr, | 3257 | ret = do_munmap(current->mm, old.userspace_addr, |
3243 | old.npages * PAGE_SIZE); | 3258 | old.npages * PAGE_SIZE); |
3259 | up_write(¤t->mm->mmap_sem); | ||
3244 | if (ret < 0) | 3260 | if (ret < 0) |
3245 | printk(KERN_WARNING | 3261 | printk(KERN_WARNING |
3246 | "kvm_vm_ioctl_set_memory_region: " | 3262 | "kvm_vm_ioctl_set_memory_region: " |
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index 5afdde4895dc..a104c532ff70 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
@@ -57,6 +57,7 @@ | |||
57 | #include <linux/lguest_launcher.h> | 57 | #include <linux/lguest_launcher.h> |
58 | #include <linux/virtio_console.h> | 58 | #include <linux/virtio_console.h> |
59 | #include <linux/pm.h> | 59 | #include <linux/pm.h> |
60 | #include <asm/lguest.h> | ||
60 | #include <asm/paravirt.h> | 61 | #include <asm/paravirt.h> |
61 | #include <asm/param.h> | 62 | #include <asm/param.h> |
62 | #include <asm/page.h> | 63 | #include <asm/page.h> |
@@ -75,15 +76,6 @@ | |||
75 | * behaving in simplified but equivalent ways. In particular, the Guest is the | 76 | * behaving in simplified but equivalent ways. In particular, the Guest is the |
76 | * same kernel as the Host (or at least, built from the same source code). :*/ | 77 | * same kernel as the Host (or at least, built from the same source code). :*/ |
77 | 78 | ||
78 | /* Declarations for definitions in lguest_guest.S */ | ||
79 | extern char lguest_noirq_start[], lguest_noirq_end[]; | ||
80 | extern const char lgstart_cli[], lgend_cli[]; | ||
81 | extern const char lgstart_sti[], lgend_sti[]; | ||
82 | extern const char lgstart_popf[], lgend_popf[]; | ||
83 | extern const char lgstart_pushf[], lgend_pushf[]; | ||
84 | extern const char lgstart_iret[], lgend_iret[]; | ||
85 | extern void lguest_iret(void); | ||
86 | |||
87 | struct lguest_data lguest_data = { | 79 | struct lguest_data lguest_data = { |
88 | .hcall_status = { [0 ... LHCALL_RING_SIZE-1] = 0xFF }, | 80 | .hcall_status = { [0 ... LHCALL_RING_SIZE-1] = 0xFF }, |
89 | .noirq_start = (u32)lguest_noirq_start, | 81 | .noirq_start = (u32)lguest_noirq_start, |
@@ -92,7 +84,6 @@ struct lguest_data lguest_data = { | |||
92 | .blocked_interrupts = { 1 }, /* Block timer interrupts */ | 84 | .blocked_interrupts = { 1 }, /* Block timer interrupts */ |
93 | .syscall_vec = SYSCALL_VECTOR, | 85 | .syscall_vec = SYSCALL_VECTOR, |
94 | }; | 86 | }; |
95 | static cycle_t clock_base; | ||
96 | 87 | ||
97 | /*G:037 async_hcall() is pretty simple: I'm quite proud of it really. We have a | 88 | /*G:037 async_hcall() is pretty simple: I'm quite proud of it really. We have a |
98 | * ring buffer of stored hypercalls which the Host will run though next time we | 89 | * ring buffer of stored hypercalls which the Host will run though next time we |
@@ -335,8 +326,8 @@ static void lguest_cpuid(unsigned int *ax, unsigned int *bx, | |||
335 | case 1: /* Basic feature request. */ | 326 | case 1: /* Basic feature request. */ |
336 | /* We only allow kernel to see SSE3, CMPXCHG16B and SSSE3 */ | 327 | /* We only allow kernel to see SSE3, CMPXCHG16B and SSSE3 */ |
337 | *cx &= 0x00002201; | 328 | *cx &= 0x00002201; |
338 | /* SSE, SSE2, FXSR, MMX, CMOV, CMPXCHG8B, FPU. */ | 329 | /* SSE, SSE2, FXSR, MMX, CMOV, CMPXCHG8B, TSC, FPU. */ |
339 | *dx &= 0x07808101; | 330 | *dx &= 0x07808111; |
340 | /* The Host can do a nice optimization if it knows that the | 331 | /* The Host can do a nice optimization if it knows that the |
341 | * kernel mappings (addresses above 0xC0000000 or whatever | 332 | * kernel mappings (addresses above 0xC0000000 or whatever |
342 | * PAGE_OFFSET is set to) haven't changed. But Linux calls | 333 | * PAGE_OFFSET is set to) haven't changed. But Linux calls |
@@ -603,19 +594,25 @@ static unsigned long lguest_get_wallclock(void) | |||
603 | return lguest_data.time.tv_sec; | 594 | return lguest_data.time.tv_sec; |
604 | } | 595 | } |
605 | 596 | ||
597 | /* The TSC is a Time Stamp Counter. The Host tells us what speed it runs at, | ||
598 | * or 0 if it's unusable as a reliable clock source. This matches what we want | ||
599 | * here: if we return 0 from this function, the x86 TSC clock will not register | ||
600 | * itself. */ | ||
601 | static unsigned long lguest_cpu_khz(void) | ||
602 | { | ||
603 | return lguest_data.tsc_khz; | ||
604 | } | ||
605 | |||
606 | /* If we can't use the TSC, the kernel falls back to our "lguest_clock", where | ||
607 | * we read the time value given to us by the Host. */ | ||
606 | static cycle_t lguest_clock_read(void) | 608 | static cycle_t lguest_clock_read(void) |
607 | { | 609 | { |
608 | unsigned long sec, nsec; | 610 | unsigned long sec, nsec; |
609 | 611 | ||
610 | /* If the Host tells the TSC speed, we can trust that. */ | 612 | /* Since the time is in two parts (seconds and nanoseconds), we risk |
611 | if (lguest_data.tsc_khz) | 613 | * reading it just as it's changing from 99 & 0.999999999 to 100 and 0, |
612 | return native_read_tsc(); | 614 | * and getting 99 and 0. As Linux tends to come apart under the stress |
613 | 615 | * of time travel, we must be careful: */ | |
614 | /* If we can't use the TSC, we read the time value written by the Host. | ||
615 | * Since it's in two parts (seconds and nanoseconds), we risk reading | ||
616 | * it just as it's changing from 99 & 0.999999999 to 100 and 0, and | ||
617 | * getting 99 and 0. As Linux tends to come apart under the stress of | ||
618 | * time travel, we must be careful: */ | ||
619 | do { | 616 | do { |
620 | /* First we read the seconds part. */ | 617 | /* First we read the seconds part. */ |
621 | sec = lguest_data.time.tv_sec; | 618 | sec = lguest_data.time.tv_sec; |
@@ -630,14 +627,14 @@ static cycle_t lguest_clock_read(void) | |||
630 | /* Now if the seconds part has changed, try again. */ | 627 | /* Now if the seconds part has changed, try again. */ |
631 | } while (unlikely(lguest_data.time.tv_sec != sec)); | 628 | } while (unlikely(lguest_data.time.tv_sec != sec)); |
632 | 629 | ||
633 | /* Our non-TSC clock is in real nanoseconds. */ | 630 | /* Our lguest clock is in real nanoseconds. */ |
634 | return sec*1000000000ULL + nsec; | 631 | return sec*1000000000ULL + nsec; |
635 | } | 632 | } |
636 | 633 | ||
637 | /* This is what we tell the kernel is our clocksource. */ | 634 | /* This is the fallback clocksource: lower priority than the TSC clocksource. */ |
638 | static struct clocksource lguest_clock = { | 635 | static struct clocksource lguest_clock = { |
639 | .name = "lguest", | 636 | .name = "lguest", |
640 | .rating = 400, | 637 | .rating = 200, |
641 | .read = lguest_clock_read, | 638 | .read = lguest_clock_read, |
642 | .mask = CLOCKSOURCE_MASK(64), | 639 | .mask = CLOCKSOURCE_MASK(64), |
643 | .mult = 1 << 22, | 640 | .mult = 1 << 22, |
@@ -645,12 +642,6 @@ static struct clocksource lguest_clock = { | |||
645 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | 642 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, |
646 | }; | 643 | }; |
647 | 644 | ||
648 | /* The "scheduler clock" is just our real clock, adjusted to start at zero */ | ||
649 | static unsigned long long lguest_sched_clock(void) | ||
650 | { | ||
651 | return cyc2ns(&lguest_clock, lguest_clock_read() - clock_base); | ||
652 | } | ||
653 | |||
654 | /* We also need a "struct clock_event_device": Linux asks us to set it to go | 645 | /* We also need a "struct clock_event_device": Linux asks us to set it to go |
655 | * off some time in the future. Actually, James Morris figured all this out, I | 646 | * off some time in the future. Actually, James Morris figured all this out, I |
656 | * just applied the patch. */ | 647 | * just applied the patch. */ |
@@ -720,19 +711,8 @@ static void lguest_time_init(void) | |||
720 | /* Set up the timer interrupt (0) to go to our simple timer routine */ | 711 | /* Set up the timer interrupt (0) to go to our simple timer routine */ |
721 | set_irq_handler(0, lguest_time_irq); | 712 | set_irq_handler(0, lguest_time_irq); |
722 | 713 | ||
723 | /* Our clock structure looks like arch/x86/kernel/tsc_32.c if we can | ||
724 | * use the TSC, otherwise it's a dumb nanosecond-resolution clock. | ||
725 | * Either way, the "rating" is set so high that it's always chosen over | ||
726 | * any other clocksource. */ | ||
727 | if (lguest_data.tsc_khz) | ||
728 | lguest_clock.mult = clocksource_khz2mult(lguest_data.tsc_khz, | ||
729 | lguest_clock.shift); | ||
730 | clock_base = lguest_clock_read(); | ||
731 | clocksource_register(&lguest_clock); | 714 | clocksource_register(&lguest_clock); |
732 | 715 | ||
733 | /* Now we've set up our clock, we can use it as the scheduler clock */ | ||
734 | pv_time_ops.sched_clock = lguest_sched_clock; | ||
735 | |||
736 | /* We can't set cpumask in the initializer: damn C limitations! Set it | 716 | /* We can't set cpumask in the initializer: damn C limitations! Set it |
737 | * here and register our timer device. */ | 717 | * here and register our timer device. */ |
738 | lguest_clockevent.cpumask = cpumask_of_cpu(0); | 718 | lguest_clockevent.cpumask = cpumask_of_cpu(0); |
@@ -1003,6 +983,7 @@ __init void lguest_init(void) | |||
1003 | /* time operations */ | 983 | /* time operations */ |
1004 | pv_time_ops.get_wallclock = lguest_get_wallclock; | 984 | pv_time_ops.get_wallclock = lguest_get_wallclock; |
1005 | pv_time_ops.time_init = lguest_time_init; | 985 | pv_time_ops.time_init = lguest_time_init; |
986 | pv_time_ops.get_cpu_khz = lguest_cpu_khz; | ||
1006 | 987 | ||
1007 | /* Now is a good time to look at the implementations of these functions | 988 | /* Now is a good time to look at the implementations of these functions |
1008 | * before returning to the rest of lguest_init(). */ | 989 | * before returning to the rest of lguest_init(). */ |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index bb652f5a93fb..a02a14f0f324 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -172,8 +172,9 @@ set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot) | |||
172 | } | 172 | } |
173 | 173 | ||
174 | /* | 174 | /* |
175 | * The head.S code sets up the kernel high mapping from: | 175 | * The head.S code sets up the kernel high mapping: |
176 | * __START_KERNEL_map to __START_KERNEL_map + KERNEL_TEXT_SIZE | 176 | * |
177 | * from __START_KERNEL_map to __START_KERNEL_map + size (== _end-_text) | ||
177 | * | 178 | * |
178 | * phys_addr holds the negative offset to the kernel, which is added | 179 | * phys_addr holds the negative offset to the kernel, which is added |
179 | * to the compile time generated pmds. This results in invalid pmds up | 180 | * to the compile time generated pmds. This results in invalid pmds up |
@@ -515,14 +516,6 @@ void __init mem_init(void) | |||
515 | 516 | ||
516 | /* clear_bss() already clear the empty_zero_page */ | 517 | /* clear_bss() already clear the empty_zero_page */ |
517 | 518 | ||
518 | /* temporary debugging - double check it's true: */ | ||
519 | { | ||
520 | int i; | ||
521 | |||
522 | for (i = 0; i < 1024; i++) | ||
523 | WARN_ON_ONCE(empty_zero_page[i]); | ||
524 | } | ||
525 | |||
526 | reservedpages = 0; | 519 | reservedpages = 0; |
527 | 520 | ||
528 | /* this will put all low memory onto the freelists */ | 521 | /* this will put all low memory onto the freelists */ |
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 882328efc3db..8fe576baa148 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
@@ -134,8 +134,6 @@ static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, | |||
134 | return NULL; | 134 | return NULL; |
135 | } | 135 | } |
136 | 136 | ||
137 | WARN_ON_ONCE(page_is_ram(pfn)); | ||
138 | |||
139 | switch (mode) { | 137 | switch (mode) { |
140 | case IOR_MODE_UNCACHED: | 138 | case IOR_MODE_UNCACHED: |
141 | default: | 139 | default: |
@@ -162,7 +160,7 @@ static void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, | |||
162 | area->phys_addr = phys_addr; | 160 | area->phys_addr = phys_addr; |
163 | vaddr = (unsigned long) area->addr; | 161 | vaddr = (unsigned long) area->addr; |
164 | if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) { | 162 | if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot)) { |
165 | remove_vm_area((void *)(vaddr & PAGE_MASK)); | 163 | free_vm_area(area); |
166 | return NULL; | 164 | return NULL; |
167 | } | 165 | } |
168 | 166 | ||
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index 59898fb0a4aa..8ccfee10f5b5 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
@@ -622,13 +622,17 @@ void __init init_cpu_to_node(void) | |||
622 | int i; | 622 | int i; |
623 | 623 | ||
624 | for (i = 0; i < NR_CPUS; i++) { | 624 | for (i = 0; i < NR_CPUS; i++) { |
625 | int node; | ||
625 | u16 apicid = x86_cpu_to_apicid_init[i]; | 626 | u16 apicid = x86_cpu_to_apicid_init[i]; |
626 | 627 | ||
627 | if (apicid == BAD_APICID) | 628 | if (apicid == BAD_APICID) |
628 | continue; | 629 | continue; |
629 | if (apicid_to_node[apicid] == NUMA_NO_NODE) | 630 | node = apicid_to_node[apicid]; |
631 | if (node == NUMA_NO_NODE) | ||
630 | continue; | 632 | continue; |
631 | numa_set_node(i, apicid_to_node[apicid]); | 633 | if (!node_online(node)) |
634 | continue; | ||
635 | numa_set_node(i, node); | ||
632 | } | 636 | } |
633 | } | 637 | } |
634 | 638 | ||
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 464d8fc21ce6..14e48b5a94ba 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
@@ -44,6 +44,12 @@ static inline unsigned long highmap_end_pfn(void) | |||
44 | 44 | ||
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
48 | # define debug_pagealloc 1 | ||
49 | #else | ||
50 | # define debug_pagealloc 0 | ||
51 | #endif | ||
52 | |||
47 | static inline int | 53 | static inline int |
48 | within(unsigned long addr, unsigned long start, unsigned long end) | 54 | within(unsigned long addr, unsigned long start, unsigned long end) |
49 | { | 55 | { |
@@ -355,45 +361,48 @@ out_unlock: | |||
355 | 361 | ||
356 | static LIST_HEAD(page_pool); | 362 | static LIST_HEAD(page_pool); |
357 | static unsigned long pool_size, pool_pages, pool_low; | 363 | static unsigned long pool_size, pool_pages, pool_low; |
358 | static unsigned long pool_used, pool_failed, pool_refill; | 364 | static unsigned long pool_used, pool_failed; |
359 | 365 | ||
360 | static void cpa_fill_pool(void) | 366 | static void cpa_fill_pool(struct page **ret) |
361 | { | 367 | { |
362 | struct page *p; | ||
363 | gfp_t gfp = GFP_KERNEL; | 368 | gfp_t gfp = GFP_KERNEL; |
369 | unsigned long flags; | ||
370 | struct page *p; | ||
364 | 371 | ||
365 | /* Do not allocate from interrupt context */ | ||
366 | if (in_irq() || irqs_disabled()) | ||
367 | return; | ||
368 | /* | 372 | /* |
369 | * Check unlocked. I does not matter when we have one more | 373 | * Avoid recursion (on debug-pagealloc) and also signal |
370 | * page in the pool. The bit lock avoids recursive pool | 374 | * our priority to get to these pagetables: |
371 | * allocations: | ||
372 | */ | 375 | */ |
373 | if (pool_pages >= pool_size || test_and_set_bit_lock(0, &pool_refill)) | 376 | if (current->flags & PF_MEMALLOC) |
374 | return; | 377 | return; |
378 | current->flags |= PF_MEMALLOC; | ||
375 | 379 | ||
376 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
377 | /* | 380 | /* |
378 | * We could do: | 381 | * Allocate atomically from atomic contexts: |
379 | * gfp = in_atomic() ? GFP_ATOMIC : GFP_KERNEL; | ||
380 | * but this fails on !PREEMPT kernels | ||
381 | */ | 382 | */ |
382 | gfp = GFP_ATOMIC | __GFP_NORETRY | __GFP_NOWARN; | 383 | if (in_atomic() || irqs_disabled() || debug_pagealloc) |
383 | #endif | 384 | gfp = GFP_ATOMIC | __GFP_NORETRY | __GFP_NOWARN; |
384 | 385 | ||
385 | while (pool_pages < pool_size) { | 386 | while (pool_pages < pool_size || (ret && !*ret)) { |
386 | p = alloc_pages(gfp, 0); | 387 | p = alloc_pages(gfp, 0); |
387 | if (!p) { | 388 | if (!p) { |
388 | pool_failed++; | 389 | pool_failed++; |
389 | break; | 390 | break; |
390 | } | 391 | } |
391 | spin_lock_irq(&pgd_lock); | 392 | /* |
393 | * If the call site needs a page right now, provide it: | ||
394 | */ | ||
395 | if (ret && !*ret) { | ||
396 | *ret = p; | ||
397 | continue; | ||
398 | } | ||
399 | spin_lock_irqsave(&pgd_lock, flags); | ||
392 | list_add(&p->lru, &page_pool); | 400 | list_add(&p->lru, &page_pool); |
393 | pool_pages++; | 401 | pool_pages++; |
394 | spin_unlock_irq(&pgd_lock); | 402 | spin_unlock_irqrestore(&pgd_lock, flags); |
395 | } | 403 | } |
396 | clear_bit_unlock(0, &pool_refill); | 404 | |
405 | current->flags &= ~PF_MEMALLOC; | ||
397 | } | 406 | } |
398 | 407 | ||
399 | #define SHIFT_MB (20 - PAGE_SHIFT) | 408 | #define SHIFT_MB (20 - PAGE_SHIFT) |
@@ -414,11 +423,15 @@ void __init cpa_init(void) | |||
414 | * GiB. Shift MiB to Gib and multiply the result by | 423 | * GiB. Shift MiB to Gib and multiply the result by |
415 | * POOL_PAGES_PER_GB: | 424 | * POOL_PAGES_PER_GB: |
416 | */ | 425 | */ |
417 | gb = ((si.totalram >> SHIFT_MB) + ROUND_MB_GB) >> SHIFT_MB_GB; | 426 | if (debug_pagealloc) { |
418 | pool_size = POOL_PAGES_PER_GB * gb; | 427 | gb = ((si.totalram >> SHIFT_MB) + ROUND_MB_GB) >> SHIFT_MB_GB; |
428 | pool_size = POOL_PAGES_PER_GB * gb; | ||
429 | } else { | ||
430 | pool_size = 1; | ||
431 | } | ||
419 | pool_low = pool_size; | 432 | pool_low = pool_size; |
420 | 433 | ||
421 | cpa_fill_pool(); | 434 | cpa_fill_pool(NULL); |
422 | printk(KERN_DEBUG | 435 | printk(KERN_DEBUG |
423 | "CPA: page pool initialized %lu of %lu pages preallocated\n", | 436 | "CPA: page pool initialized %lu of %lu pages preallocated\n", |
424 | pool_pages, pool_size); | 437 | pool_pages, pool_size); |
@@ -440,16 +453,20 @@ static int split_large_page(pte_t *kpte, unsigned long address) | |||
440 | spin_lock_irqsave(&pgd_lock, flags); | 453 | spin_lock_irqsave(&pgd_lock, flags); |
441 | if (list_empty(&page_pool)) { | 454 | if (list_empty(&page_pool)) { |
442 | spin_unlock_irqrestore(&pgd_lock, flags); | 455 | spin_unlock_irqrestore(&pgd_lock, flags); |
443 | return -ENOMEM; | 456 | base = NULL; |
457 | cpa_fill_pool(&base); | ||
458 | if (!base) | ||
459 | return -ENOMEM; | ||
460 | spin_lock_irqsave(&pgd_lock, flags); | ||
461 | } else { | ||
462 | base = list_first_entry(&page_pool, struct page, lru); | ||
463 | list_del(&base->lru); | ||
464 | pool_pages--; | ||
465 | |||
466 | if (pool_pages < pool_low) | ||
467 | pool_low = pool_pages; | ||
444 | } | 468 | } |
445 | 469 | ||
446 | base = list_first_entry(&page_pool, struct page, lru); | ||
447 | list_del(&base->lru); | ||
448 | pool_pages--; | ||
449 | |||
450 | if (pool_pages < pool_low) | ||
451 | pool_low = pool_pages; | ||
452 | |||
453 | /* | 470 | /* |
454 | * Check for races, another CPU might have split this page | 471 | * Check for races, another CPU might have split this page |
455 | * up for us already: | 472 | * up for us already: |
@@ -734,7 +751,8 @@ static int change_page_attr_set_clr(unsigned long addr, int numpages, | |||
734 | cpa_flush_all(cache); | 751 | cpa_flush_all(cache); |
735 | 752 | ||
736 | out: | 753 | out: |
737 | cpa_fill_pool(); | 754 | cpa_fill_pool(NULL); |
755 | |||
738 | return ret; | 756 | return ret; |
739 | } | 757 | } |
740 | 758 | ||
@@ -897,7 +915,7 @@ void kernel_map_pages(struct page *page, int numpages, int enable) | |||
897 | * Try to refill the page pool here. We can do this only after | 915 | * Try to refill the page pool here. We can do this only after |
898 | * the tlb flush. | 916 | * the tlb flush. |
899 | */ | 917 | */ |
900 | cpa_fill_pool(); | 918 | cpa_fill_pool(NULL); |
901 | } | 919 | } |
902 | 920 | ||
903 | #ifdef CONFIG_HIBERNATION | 921 | #ifdef CONFIG_HIBERNATION |
diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c index 73aba7125203..2f9e9afcb9f4 100644 --- a/arch/x86/mm/pgtable_32.c +++ b/arch/x86/mm/pgtable_32.c | |||
@@ -342,12 +342,16 @@ static void pgd_mop_up_pmds(struct mm_struct *mm, pgd_t *pgdp) | |||
342 | 342 | ||
343 | pgd_t *pgd_alloc(struct mm_struct *mm) | 343 | pgd_t *pgd_alloc(struct mm_struct *mm) |
344 | { | 344 | { |
345 | pgd_t *pgd = quicklist_alloc(0, GFP_KERNEL, pgd_ctor); | 345 | pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO); |
346 | 346 | ||
347 | mm->pgd = pgd; /* so that alloc_pd can use it */ | 347 | /* so that alloc_pd can use it */ |
348 | mm->pgd = pgd; | ||
349 | if (pgd) | ||
350 | pgd_ctor(pgd); | ||
348 | 351 | ||
349 | if (pgd && !pgd_prepopulate_pmd(mm, pgd)) { | 352 | if (pgd && !pgd_prepopulate_pmd(mm, pgd)) { |
350 | quicklist_free(0, pgd_dtor, pgd); | 353 | pgd_dtor(pgd); |
354 | free_page((unsigned long)pgd); | ||
351 | pgd = NULL; | 355 | pgd = NULL; |
352 | } | 356 | } |
353 | 357 | ||
@@ -357,12 +361,8 @@ pgd_t *pgd_alloc(struct mm_struct *mm) | |||
357 | void pgd_free(struct mm_struct *mm, pgd_t *pgd) | 361 | void pgd_free(struct mm_struct *mm, pgd_t *pgd) |
358 | { | 362 | { |
359 | pgd_mop_up_pmds(mm, pgd); | 363 | pgd_mop_up_pmds(mm, pgd); |
360 | quicklist_free(0, pgd_dtor, pgd); | 364 | pgd_dtor(pgd); |
361 | } | 365 | free_page((unsigned long)pgd); |
362 | |||
363 | void check_pgt_cache(void) | ||
364 | { | ||
365 | quicklist_trim(0, pgd_dtor, 25, 16); | ||
366 | } | 366 | } |
367 | 367 | ||
368 | void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte) | 368 | void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte) |
diff --git a/arch/x86/pci/pcbios.c b/arch/x86/pci/pcbios.c index 10ac8c316c46..2f7109ac4c15 100644 --- a/arch/x86/pci/pcbios.c +++ b/arch/x86/pci/pcbios.c | |||
@@ -198,6 +198,11 @@ static int pci_bios_read(unsigned int seg, unsigned int bus, | |||
198 | "b" (bx), | 198 | "b" (bx), |
199 | "D" ((long)reg), | 199 | "D" ((long)reg), |
200 | "S" (&pci_indirect)); | 200 | "S" (&pci_indirect)); |
201 | /* | ||
202 | * Zero-extend the result beyond 8 bits, do not trust the | ||
203 | * BIOS having done it: | ||
204 | */ | ||
205 | *value &= 0xff; | ||
201 | break; | 206 | break; |
202 | case 2: | 207 | case 2: |
203 | __asm__("lcall *(%%esi); cld\n\t" | 208 | __asm__("lcall *(%%esi); cld\n\t" |
@@ -210,6 +215,11 @@ static int pci_bios_read(unsigned int seg, unsigned int bus, | |||
210 | "b" (bx), | 215 | "b" (bx), |
211 | "D" ((long)reg), | 216 | "D" ((long)reg), |
212 | "S" (&pci_indirect)); | 217 | "S" (&pci_indirect)); |
218 | /* | ||
219 | * Zero-extend the result beyond 16 bits, do not trust the | ||
220 | * BIOS having done it: | ||
221 | */ | ||
222 | *value &= 0xffff; | ||
213 | break; | 223 | break; |
214 | case 4: | 224 | case 4: |
215 | __asm__("lcall *(%%esi); cld\n\t" | 225 | __asm__("lcall *(%%esi); cld\n\t" |
diff --git a/arch/x86/vdso/Makefile b/arch/x86/vdso/Makefile index f385a4b4a484..0a8f4742ef51 100644 --- a/arch/x86/vdso/Makefile +++ b/arch/x86/vdso/Makefile | |||
@@ -50,7 +50,9 @@ obj-$(VDSO64-y) += vdso-syms.lds | |||
50 | sed-vdsosym := -e 's/^00*/0/' \ | 50 | sed-vdsosym := -e 's/^00*/0/' \ |
51 | -e 's/^\([0-9a-fA-F]*\) . \(VDSO[a-zA-Z0-9_]*\)$$/\2 = 0x\1;/p' | 51 | -e 's/^\([0-9a-fA-F]*\) . \(VDSO[a-zA-Z0-9_]*\)$$/\2 = 0x\1;/p' |
52 | quiet_cmd_vdsosym = VDSOSYM $@ | 52 | quiet_cmd_vdsosym = VDSOSYM $@ |
53 | cmd_vdsosym = $(NM) $< | sed -n $(sed-vdsosym) | LC_ALL=C sort > $@ | 53 | define cmd_vdsosym |
54 | $(NM) $< | LC_ALL=C sed -n $(sed-vdsosym) | LC_ALL=C sort > $@ | ||
55 | endef | ||
54 | 56 | ||
55 | $(obj)/%-syms.lds: $(obj)/%.so.dbg FORCE | 57 | $(obj)/%-syms.lds: $(obj)/%.so.dbg FORCE |
56 | $(call if_changed,vdsosym) | 58 | $(call if_changed,vdsosym) |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 49e5358f481a..8b9ee27805fd 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -153,6 +153,7 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, | |||
153 | if (*ax == 1) | 153 | if (*ax == 1) |
154 | maskedx = ~((1 << X86_FEATURE_APIC) | /* disable APIC */ | 154 | maskedx = ~((1 << X86_FEATURE_APIC) | /* disable APIC */ |
155 | (1 << X86_FEATURE_ACPI) | /* disable ACPI */ | 155 | (1 << X86_FEATURE_ACPI) | /* disable ACPI */ |
156 | (1 << X86_FEATURE_SEP) | /* disable SEP */ | ||
156 | (1 << X86_FEATURE_ACC)); /* thermal monitoring */ | 157 | (1 << X86_FEATURE_ACC)); /* thermal monitoring */ |
157 | 158 | ||
158 | asm(XEN_EMULATE_PREFIX "cpuid" | 159 | asm(XEN_EMULATE_PREFIX "cpuid" |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index 3bad4773a2f3..2341492bf7a0 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -38,7 +38,8 @@ char * __init xen_memory_setup(void) | |||
38 | unsigned long max_pfn = xen_start_info->nr_pages; | 38 | unsigned long max_pfn = xen_start_info->nr_pages; |
39 | 39 | ||
40 | e820.nr_map = 0; | 40 | e820.nr_map = 0; |
41 | add_memory_region(0, PFN_PHYS(max_pfn), E820_RAM); | 41 | add_memory_region(0, LOWMEMSIZE(), E820_RAM); |
42 | add_memory_region(HIGH_MEMORY, PFN_PHYS(max_pfn)-HIGH_MEMORY, E820_RAM); | ||
42 | 43 | ||
43 | return "Xen"; | 44 | return "Xen"; |
44 | } | 45 | } |
diff --git a/block/blk-barrier.c b/block/blk-barrier.c index 6901eedeffce..55c5f1fc4f1f 100644 --- a/block/blk-barrier.c +++ b/block/blk-barrier.c | |||
@@ -259,8 +259,11 @@ int blk_do_ordered(struct request_queue *q, struct request **rqp) | |||
259 | 259 | ||
260 | static void bio_end_empty_barrier(struct bio *bio, int err) | 260 | static void bio_end_empty_barrier(struct bio *bio, int err) |
261 | { | 261 | { |
262 | if (err) | 262 | if (err) { |
263 | if (err == -EOPNOTSUPP) | ||
264 | set_bit(BIO_EOPNOTSUPP, &bio->bi_flags); | ||
263 | clear_bit(BIO_UPTODATE, &bio->bi_flags); | 265 | clear_bit(BIO_UPTODATE, &bio->bi_flags); |
266 | } | ||
264 | 267 | ||
265 | complete(bio->bi_private); | 268 | complete(bio->bi_private); |
266 | } | 269 | } |
@@ -309,7 +312,9 @@ int blkdev_issue_flush(struct block_device *bdev, sector_t *error_sector) | |||
309 | *error_sector = bio->bi_sector; | 312 | *error_sector = bio->bi_sector; |
310 | 313 | ||
311 | ret = 0; | 314 | ret = 0; |
312 | if (!bio_flagged(bio, BIO_UPTODATE)) | 315 | if (bio_flagged(bio, BIO_EOPNOTSUPP)) |
316 | ret = -EOPNOTSUPP; | ||
317 | else if (!bio_flagged(bio, BIO_UPTODATE)) | ||
313 | ret = -EIO; | 318 | ret = -EIO; |
314 | 319 | ||
315 | bio_put(bio); | 320 | bio_put(bio); |
diff --git a/block/blk-core.c b/block/blk-core.c index 775c8516abf5..2a438a93f723 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -127,7 +127,6 @@ void rq_init(struct request_queue *q, struct request *rq) | |||
127 | rq->nr_hw_segments = 0; | 127 | rq->nr_hw_segments = 0; |
128 | rq->ioprio = 0; | 128 | rq->ioprio = 0; |
129 | rq->special = NULL; | 129 | rq->special = NULL; |
130 | rq->raw_data_len = 0; | ||
131 | rq->buffer = NULL; | 130 | rq->buffer = NULL; |
132 | rq->tag = -1; | 131 | rq->tag = -1; |
133 | rq->errors = 0; | 132 | rq->errors = 0; |
@@ -135,6 +134,7 @@ void rq_init(struct request_queue *q, struct request *rq) | |||
135 | rq->cmd_len = 0; | 134 | rq->cmd_len = 0; |
136 | memset(rq->cmd, 0, sizeof(rq->cmd)); | 135 | memset(rq->cmd, 0, sizeof(rq->cmd)); |
137 | rq->data_len = 0; | 136 | rq->data_len = 0; |
137 | rq->extra_len = 0; | ||
138 | rq->sense_len = 0; | 138 | rq->sense_len = 0; |
139 | rq->data = NULL; | 139 | rq->data = NULL; |
140 | rq->sense = NULL; | 140 | rq->sense = NULL; |
@@ -424,7 +424,6 @@ void blk_put_queue(struct request_queue *q) | |||
424 | { | 424 | { |
425 | kobject_put(&q->kobj); | 425 | kobject_put(&q->kobj); |
426 | } | 426 | } |
427 | EXPORT_SYMBOL(blk_put_queue); | ||
428 | 427 | ||
429 | void blk_cleanup_queue(struct request_queue *q) | 428 | void blk_cleanup_queue(struct request_queue *q) |
430 | { | 429 | { |
@@ -592,7 +591,6 @@ int blk_get_queue(struct request_queue *q) | |||
592 | 591 | ||
593 | return 1; | 592 | return 1; |
594 | } | 593 | } |
595 | EXPORT_SYMBOL(blk_get_queue); | ||
596 | 594 | ||
597 | static inline void blk_free_request(struct request_queue *q, struct request *rq) | 595 | static inline void blk_free_request(struct request_queue *q, struct request *rq) |
598 | { | 596 | { |
@@ -1768,6 +1766,7 @@ static inline void __end_request(struct request *rq, int uptodate, | |||
1768 | 1766 | ||
1769 | /** | 1767 | /** |
1770 | * blk_rq_bytes - Returns bytes left to complete in the entire request | 1768 | * blk_rq_bytes - Returns bytes left to complete in the entire request |
1769 | * @rq: the request being processed | ||
1771 | **/ | 1770 | **/ |
1772 | unsigned int blk_rq_bytes(struct request *rq) | 1771 | unsigned int blk_rq_bytes(struct request *rq) |
1773 | { | 1772 | { |
@@ -1780,6 +1779,7 @@ EXPORT_SYMBOL_GPL(blk_rq_bytes); | |||
1780 | 1779 | ||
1781 | /** | 1780 | /** |
1782 | * blk_rq_cur_bytes - Returns bytes left to complete in the current segment | 1781 | * blk_rq_cur_bytes - Returns bytes left to complete in the current segment |
1782 | * @rq: the request being processed | ||
1783 | **/ | 1783 | **/ |
1784 | unsigned int blk_rq_cur_bytes(struct request *rq) | 1784 | unsigned int blk_rq_cur_bytes(struct request *rq) |
1785 | { | 1785 | { |
@@ -2016,7 +2016,6 @@ void blk_rq_bio_prep(struct request_queue *q, struct request *rq, | |||
2016 | rq->hard_cur_sectors = rq->current_nr_sectors; | 2016 | rq->hard_cur_sectors = rq->current_nr_sectors; |
2017 | rq->hard_nr_sectors = rq->nr_sectors = bio_sectors(bio); | 2017 | rq->hard_nr_sectors = rq->nr_sectors = bio_sectors(bio); |
2018 | rq->buffer = bio_data(bio); | 2018 | rq->buffer = bio_data(bio); |
2019 | rq->raw_data_len = bio->bi_size; | ||
2020 | rq->data_len = bio->bi_size; | 2019 | rq->data_len = bio->bi_size; |
2021 | 2020 | ||
2022 | rq->bio = rq->biotail = bio; | 2021 | rq->bio = rq->biotail = bio; |
diff --git a/block/blk-map.c b/block/blk-map.c index 09f7fd0bcb73..c07d9c8317f4 100644 --- a/block/blk-map.c +++ b/block/blk-map.c | |||
@@ -19,7 +19,6 @@ int blk_rq_append_bio(struct request_queue *q, struct request *rq, | |||
19 | rq->biotail->bi_next = bio; | 19 | rq->biotail->bi_next = bio; |
20 | rq->biotail = bio; | 20 | rq->biotail = bio; |
21 | 21 | ||
22 | rq->raw_data_len += bio->bi_size; | ||
23 | rq->data_len += bio->bi_size; | 22 | rq->data_len += bio->bi_size; |
24 | } | 23 | } |
25 | return 0; | 24 | return 0; |
@@ -44,6 +43,7 @@ static int __blk_rq_map_user(struct request_queue *q, struct request *rq, | |||
44 | void __user *ubuf, unsigned int len) | 43 | void __user *ubuf, unsigned int len) |
45 | { | 44 | { |
46 | unsigned long uaddr; | 45 | unsigned long uaddr; |
46 | unsigned int alignment; | ||
47 | struct bio *bio, *orig_bio; | 47 | struct bio *bio, *orig_bio; |
48 | int reading, ret; | 48 | int reading, ret; |
49 | 49 | ||
@@ -54,8 +54,8 @@ static int __blk_rq_map_user(struct request_queue *q, struct request *rq, | |||
54 | * direct dma. else, set up kernel bounce buffers | 54 | * direct dma. else, set up kernel bounce buffers |
55 | */ | 55 | */ |
56 | uaddr = (unsigned long) ubuf; | 56 | uaddr = (unsigned long) ubuf; |
57 | if (!(uaddr & queue_dma_alignment(q)) && | 57 | alignment = queue_dma_alignment(q) | q->dma_pad_mask; |
58 | !(len & queue_dma_alignment(q))) | 58 | if (!(uaddr & alignment) && !(len & alignment)) |
59 | bio = bio_map_user(q, NULL, uaddr, len, reading); | 59 | bio = bio_map_user(q, NULL, uaddr, len, reading); |
60 | else | 60 | else |
61 | bio = bio_copy_user(q, uaddr, len, reading); | 61 | bio = bio_copy_user(q, uaddr, len, reading); |
@@ -142,20 +142,22 @@ int blk_rq_map_user(struct request_queue *q, struct request *rq, | |||
142 | 142 | ||
143 | /* | 143 | /* |
144 | * __blk_rq_map_user() copies the buffers if starting address | 144 | * __blk_rq_map_user() copies the buffers if starting address |
145 | * or length isn't aligned. As the copied buffer is always | 145 | * or length isn't aligned to dma_pad_mask. As the copied |
146 | * page aligned, we know that there's enough room for padding. | 146 | * buffer is always page aligned, we know that there's enough |
147 | * Extend the last bio and update rq->data_len accordingly. | 147 | * room for padding. Extend the last bio and update |
148 | * rq->data_len accordingly. | ||
148 | * | 149 | * |
149 | * On unmap, bio_uncopy_user() will use unmodified | 150 | * On unmap, bio_uncopy_user() will use unmodified |
150 | * bio_map_data pointed to by bio->bi_private. | 151 | * bio_map_data pointed to by bio->bi_private. |
151 | */ | 152 | */ |
152 | if (len & queue_dma_alignment(q)) { | 153 | if (len & q->dma_pad_mask) { |
153 | unsigned int pad_len = (queue_dma_alignment(q) & ~len) + 1; | 154 | unsigned int pad_len = (q->dma_pad_mask & ~len) + 1; |
154 | struct bio *bio = rq->biotail; | 155 | struct bio *tail = rq->biotail; |
155 | 156 | ||
156 | bio->bi_io_vec[bio->bi_vcnt - 1].bv_len += pad_len; | 157 | tail->bi_io_vec[tail->bi_vcnt - 1].bv_len += pad_len; |
157 | bio->bi_size += pad_len; | 158 | tail->bi_size += pad_len; |
158 | rq->data_len += pad_len; | 159 | |
160 | rq->extra_len += pad_len; | ||
159 | } | 161 | } |
160 | 162 | ||
161 | rq->buffer = rq->data = NULL; | 163 | rq->buffer = rq->data = NULL; |
@@ -215,7 +217,6 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq, | |||
215 | rq->buffer = rq->data = NULL; | 217 | rq->buffer = rq->data = NULL; |
216 | return 0; | 218 | return 0; |
217 | } | 219 | } |
218 | EXPORT_SYMBOL(blk_rq_map_user_iov); | ||
219 | 220 | ||
220 | /** | 221 | /** |
221 | * blk_rq_unmap_user - unmap a request with user data | 222 | * blk_rq_unmap_user - unmap a request with user data |
diff --git a/block/blk-merge.c b/block/blk-merge.c index 7506c4fe0264..0f58616bcd7f 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c | |||
@@ -231,7 +231,7 @@ new_segment: | |||
231 | ((unsigned long)q->dma_drain_buffer) & | 231 | ((unsigned long)q->dma_drain_buffer) & |
232 | (PAGE_SIZE - 1)); | 232 | (PAGE_SIZE - 1)); |
233 | nsegs++; | 233 | nsegs++; |
234 | rq->data_len += q->dma_drain_size; | 234 | rq->extra_len += q->dma_drain_size; |
235 | } | 235 | } |
236 | 236 | ||
237 | if (sg) | 237 | if (sg) |
diff --git a/block/blk-settings.c b/block/blk-settings.c index 9a8ffdd0ce3d..1344a0ea5cc6 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c | |||
@@ -140,7 +140,7 @@ void blk_queue_bounce_limit(struct request_queue *q, u64 dma_addr) | |||
140 | /* Assume anything <= 4GB can be handled by IOMMU. | 140 | /* Assume anything <= 4GB can be handled by IOMMU. |
141 | Actually some IOMMUs can handle everything, but I don't | 141 | Actually some IOMMUs can handle everything, but I don't |
142 | know of a way to test this here. */ | 142 | know of a way to test this here. */ |
143 | if (b_pfn < (min_t(u64, 0xffffffff, BLK_BOUNCE_HIGH) >> PAGE_SHIFT)) | 143 | if (b_pfn <= (min_t(u64, 0xffffffff, BLK_BOUNCE_HIGH) >> PAGE_SHIFT)) |
144 | dma = 1; | 144 | dma = 1; |
145 | q->bounce_pfn = max_low_pfn; | 145 | q->bounce_pfn = max_low_pfn; |
146 | #else | 146 | #else |
@@ -293,8 +293,24 @@ void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b) | |||
293 | EXPORT_SYMBOL(blk_queue_stack_limits); | 293 | EXPORT_SYMBOL(blk_queue_stack_limits); |
294 | 294 | ||
295 | /** | 295 | /** |
296 | * blk_queue_dma_drain - Set up a drain buffer for excess dma. | 296 | * blk_queue_dma_pad - set pad mask |
297 | * @q: the request queue for the device | ||
298 | * @mask: pad mask | ||
299 | * | ||
300 | * Set pad mask. Direct IO requests are padded to the mask specified. | ||
297 | * | 301 | * |
302 | * Appending pad buffer to a request modifies ->data_len such that it | ||
303 | * includes the pad buffer. The original requested data length can be | ||
304 | * obtained using blk_rq_raw_data_len(). | ||
305 | **/ | ||
306 | void blk_queue_dma_pad(struct request_queue *q, unsigned int mask) | ||
307 | { | ||
308 | q->dma_pad_mask = mask; | ||
309 | } | ||
310 | EXPORT_SYMBOL(blk_queue_dma_pad); | ||
311 | |||
312 | /** | ||
313 | * blk_queue_dma_drain - Set up a drain buffer for excess dma. | ||
298 | * @q: the request queue for the device | 314 | * @q: the request queue for the device |
299 | * @dma_drain_needed: fn which returns non-zero if drain is necessary | 315 | * @dma_drain_needed: fn which returns non-zero if drain is necessary |
300 | * @buf: physically contiguous buffer | 316 | * @buf: physically contiguous buffer |
@@ -316,7 +332,7 @@ EXPORT_SYMBOL(blk_queue_stack_limits); | |||
316 | * device can support otherwise there won't be room for the drain | 332 | * device can support otherwise there won't be room for the drain |
317 | * buffer. | 333 | * buffer. |
318 | */ | 334 | */ |
319 | extern int blk_queue_dma_drain(struct request_queue *q, | 335 | int blk_queue_dma_drain(struct request_queue *q, |
320 | dma_drain_needed_fn *dma_drain_needed, | 336 | dma_drain_needed_fn *dma_drain_needed, |
321 | void *buf, unsigned int size) | 337 | void *buf, unsigned int size) |
322 | { | 338 | { |
diff --git a/block/blk-tag.c b/block/blk-tag.c index a8c37d4bbb32..4780a46ce234 100644 --- a/block/blk-tag.c +++ b/block/blk-tag.c | |||
@@ -6,6 +6,8 @@ | |||
6 | #include <linux/bio.h> | 6 | #include <linux/bio.h> |
7 | #include <linux/blkdev.h> | 7 | #include <linux/blkdev.h> |
8 | 8 | ||
9 | #include "blk.h" | ||
10 | |||
9 | /** | 11 | /** |
10 | * blk_queue_find_tag - find a request by its tag and queue | 12 | * blk_queue_find_tag - find a request by its tag and queue |
11 | * @q: The request queue for the device | 13 | * @q: The request queue for the device |
diff --git a/block/blk.h b/block/blk.h index ec898dd0c65c..ec9120fb789a 100644 --- a/block/blk.h +++ b/block/blk.h | |||
@@ -32,6 +32,8 @@ void blk_recalc_rq_sectors(struct request *rq, int nsect); | |||
32 | 32 | ||
33 | void blk_queue_congestion_threshold(struct request_queue *q); | 33 | void blk_queue_congestion_threshold(struct request_queue *q); |
34 | 34 | ||
35 | int blk_dev_init(void); | ||
36 | |||
35 | /* | 37 | /* |
36 | * Return the threshold (number of used requests) at which the queue is | 38 | * Return the threshold (number of used requests) at which the queue is |
37 | * considered to be congested. It include a little hysteresis to keep the | 39 | * considered to be congested. It include a little hysteresis to keep the |
diff --git a/block/bsg.c b/block/bsg.c index 7f3c09549e4b..8917c5174dc2 100644 --- a/block/bsg.c +++ b/block/bsg.c | |||
@@ -437,14 +437,14 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr, | |||
437 | } | 437 | } |
438 | 438 | ||
439 | if (rq->next_rq) { | 439 | if (rq->next_rq) { |
440 | hdr->dout_resid = rq->raw_data_len; | 440 | hdr->dout_resid = rq->data_len; |
441 | hdr->din_resid = rq->next_rq->raw_data_len; | 441 | hdr->din_resid = rq->next_rq->data_len; |
442 | blk_rq_unmap_user(bidi_bio); | 442 | blk_rq_unmap_user(bidi_bio); |
443 | blk_put_request(rq->next_rq); | 443 | blk_put_request(rq->next_rq); |
444 | } else if (rq_data_dir(rq) == READ) | 444 | } else if (rq_data_dir(rq) == READ) |
445 | hdr->din_resid = rq->raw_data_len; | 445 | hdr->din_resid = rq->data_len; |
446 | else | 446 | else |
447 | hdr->dout_resid = rq->raw_data_len; | 447 | hdr->dout_resid = rq->data_len; |
448 | 448 | ||
449 | /* | 449 | /* |
450 | * If the request generated a negative error number, return it | 450 | * If the request generated a negative error number, return it |
diff --git a/block/genhd.c b/block/genhd.c index 53f2238e69c8..00da5219ee37 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
@@ -17,11 +17,15 @@ | |||
17 | #include <linux/buffer_head.h> | 17 | #include <linux/buffer_head.h> |
18 | #include <linux/mutex.h> | 18 | #include <linux/mutex.h> |
19 | 19 | ||
20 | #include "blk.h" | ||
21 | |||
20 | static DEFINE_MUTEX(block_class_lock); | 22 | static DEFINE_MUTEX(block_class_lock); |
21 | #ifndef CONFIG_SYSFS_DEPRECATED | 23 | #ifndef CONFIG_SYSFS_DEPRECATED |
22 | struct kobject *block_depr; | 24 | struct kobject *block_depr; |
23 | #endif | 25 | #endif |
24 | 26 | ||
27 | static struct device_type disk_type; | ||
28 | |||
25 | /* | 29 | /* |
26 | * Can be deleted altogether. Later. | 30 | * Can be deleted altogether. Later. |
27 | * | 31 | * |
@@ -346,8 +350,6 @@ const struct seq_operations partitions_op = { | |||
346 | #endif | 350 | #endif |
347 | 351 | ||
348 | 352 | ||
349 | extern int blk_dev_init(void); | ||
350 | |||
351 | static struct kobject *base_probe(dev_t devt, int *part, void *data) | 353 | static struct kobject *base_probe(dev_t devt, int *part, void *data) |
352 | { | 354 | { |
353 | if (request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)) > 0) | 355 | if (request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)) > 0) |
@@ -358,7 +360,9 @@ static struct kobject *base_probe(dev_t devt, int *part, void *data) | |||
358 | 360 | ||
359 | static int __init genhd_device_init(void) | 361 | static int __init genhd_device_init(void) |
360 | { | 362 | { |
361 | class_register(&block_class); | 363 | int error = class_register(&block_class); |
364 | if (unlikely(error)) | ||
365 | return error; | ||
362 | bdev_map = kobj_map_init(base_probe, &block_class_lock); | 366 | bdev_map = kobj_map_init(base_probe, &block_class_lock); |
363 | blk_dev_init(); | 367 | blk_dev_init(); |
364 | 368 | ||
@@ -502,7 +506,7 @@ struct class block_class = { | |||
502 | .name = "block", | 506 | .name = "block", |
503 | }; | 507 | }; |
504 | 508 | ||
505 | struct device_type disk_type = { | 509 | static struct device_type disk_type = { |
506 | .name = "disk", | 510 | .name = "disk", |
507 | .groups = disk_attr_groups, | 511 | .groups = disk_attr_groups, |
508 | .release = disk_release, | 512 | .release = disk_release, |
@@ -632,12 +636,14 @@ static void media_change_notify_thread(struct work_struct *work) | |||
632 | put_device(gd->driverfs_dev); | 636 | put_device(gd->driverfs_dev); |
633 | } | 637 | } |
634 | 638 | ||
639 | #if 0 | ||
635 | void genhd_media_change_notify(struct gendisk *disk) | 640 | void genhd_media_change_notify(struct gendisk *disk) |
636 | { | 641 | { |
637 | get_device(disk->driverfs_dev); | 642 | get_device(disk->driverfs_dev); |
638 | schedule_work(&disk->async_notify); | 643 | schedule_work(&disk->async_notify); |
639 | } | 644 | } |
640 | EXPORT_SYMBOL_GPL(genhd_media_change_notify); | 645 | EXPORT_SYMBOL_GPL(genhd_media_change_notify); |
646 | #endif /* 0 */ | ||
641 | 647 | ||
642 | dev_t blk_lookup_devt(const char *name) | 648 | dev_t blk_lookup_devt(const char *name) |
643 | { | 649 | { |
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index e993cac4911d..a2c3a936ebf9 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c | |||
@@ -266,7 +266,7 @@ static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, | |||
266 | hdr->info = 0; | 266 | hdr->info = 0; |
267 | if (hdr->masked_status || hdr->host_status || hdr->driver_status) | 267 | if (hdr->masked_status || hdr->host_status || hdr->driver_status) |
268 | hdr->info |= SG_INFO_CHECK; | 268 | hdr->info |= SG_INFO_CHECK; |
269 | hdr->resid = rq->raw_data_len; | 269 | hdr->resid = rq->data_len; |
270 | hdr->sb_len_wr = 0; | 270 | hdr->sb_len_wr = 0; |
271 | 271 | ||
272 | if (rq->sense_len && hdr->sbp) { | 272 | if (rq->sense_len && hdr->sbp) { |
@@ -528,8 +528,8 @@ static int __blk_send_generic(struct request_queue *q, struct gendisk *bd_disk, | |||
528 | rq = blk_get_request(q, WRITE, __GFP_WAIT); | 528 | rq = blk_get_request(q, WRITE, __GFP_WAIT); |
529 | rq->cmd_type = REQ_TYPE_BLOCK_PC; | 529 | rq->cmd_type = REQ_TYPE_BLOCK_PC; |
530 | rq->data = NULL; | 530 | rq->data = NULL; |
531 | rq->raw_data_len = 0; | ||
532 | rq->data_len = 0; | 531 | rq->data_len = 0; |
532 | rq->extra_len = 0; | ||
533 | rq->timeout = BLK_DEFAULT_SG_TIMEOUT; | 533 | rq->timeout = BLK_DEFAULT_SG_TIMEOUT; |
534 | memset(rq->cmd, 0, sizeof(rq->cmd)); | 534 | memset(rq->cmd, 0, sizeof(rq->cmd)); |
535 | rq->cmd[0] = cmd; | 535 | rq->cmd[0] = cmd; |
diff --git a/crypto/Kconfig b/crypto/Kconfig index 898acc5c1967..69f1be6816f7 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
@@ -575,6 +575,7 @@ config CRYPTO_TEST | |||
575 | config CRYPTO_AUTHENC | 575 | config CRYPTO_AUTHENC |
576 | tristate "Authenc support" | 576 | tristate "Authenc support" |
577 | select CRYPTO_AEAD | 577 | select CRYPTO_AEAD |
578 | select CRYPTO_BLKCIPHER | ||
578 | select CRYPTO_MANAGER | 579 | select CRYPTO_MANAGER |
579 | select CRYPTO_HASH | 580 | select CRYPTO_HASH |
580 | help | 581 | help |
diff --git a/crypto/Makefile b/crypto/Makefile index 48c758379954..7cf36253a75e 100644 --- a/crypto/Makefile +++ b/crypto/Makefile | |||
@@ -12,9 +12,9 @@ obj-$(CONFIG_CRYPTO_AEAD) += aead.o | |||
12 | 12 | ||
13 | crypto_blkcipher-objs := ablkcipher.o | 13 | crypto_blkcipher-objs := ablkcipher.o |
14 | crypto_blkcipher-objs += blkcipher.o | 14 | crypto_blkcipher-objs += blkcipher.o |
15 | crypto_blkcipher-objs += chainiv.o | ||
16 | crypto_blkcipher-objs += eseqiv.o | ||
15 | obj-$(CONFIG_CRYPTO_BLKCIPHER) += crypto_blkcipher.o | 17 | obj-$(CONFIG_CRYPTO_BLKCIPHER) += crypto_blkcipher.o |
16 | obj-$(CONFIG_CRYPTO_BLKCIPHER) += chainiv.o | ||
17 | obj-$(CONFIG_CRYPTO_BLKCIPHER) += eseqiv.o | ||
18 | obj-$(CONFIG_CRYPTO_SEQIV) += seqiv.o | 18 | obj-$(CONFIG_CRYPTO_SEQIV) += seqiv.o |
19 | 19 | ||
20 | crypto_hash-objs := hash.o | 20 | crypto_hash-objs := hash.o |
diff --git a/crypto/ablkcipher.c b/crypto/ablkcipher.c index 3bcb099b4a85..94140b3756fc 100644 --- a/crypto/ablkcipher.c +++ b/crypto/ablkcipher.c | |||
@@ -341,6 +341,3 @@ err: | |||
341 | return ERR_PTR(err); | 341 | return ERR_PTR(err); |
342 | } | 342 | } |
343 | EXPORT_SYMBOL_GPL(crypto_alloc_ablkcipher); | 343 | EXPORT_SYMBOL_GPL(crypto_alloc_ablkcipher); |
344 | |||
345 | MODULE_LICENSE("GPL"); | ||
346 | MODULE_DESCRIPTION("Asynchronous block chaining cipher type"); | ||
diff --git a/crypto/async_tx/async_memcpy.c b/crypto/async_tx/async_memcpy.c index 0f6282207b32..84caa4efc0d4 100644 --- a/crypto/async_tx/async_memcpy.c +++ b/crypto/async_tx/async_memcpy.c | |||
@@ -66,11 +66,11 @@ async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset, | |||
66 | } | 66 | } |
67 | 67 | ||
68 | if (tx) { | 68 | if (tx) { |
69 | pr_debug("%s: (async) len: %zu\n", __FUNCTION__, len); | 69 | pr_debug("%s: (async) len: %zu\n", __func__, len); |
70 | async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); | 70 | async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); |
71 | } else { | 71 | } else { |
72 | void *dest_buf, *src_buf; | 72 | void *dest_buf, *src_buf; |
73 | pr_debug("%s: (sync) len: %zu\n", __FUNCTION__, len); | 73 | pr_debug("%s: (sync) len: %zu\n", __func__, len); |
74 | 74 | ||
75 | /* wait for any prerequisite operations */ | 75 | /* wait for any prerequisite operations */ |
76 | if (depend_tx) { | 76 | if (depend_tx) { |
@@ -80,7 +80,7 @@ async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset, | |||
80 | BUG_ON(depend_tx->ack); | 80 | BUG_ON(depend_tx->ack); |
81 | if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR) | 81 | if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR) |
82 | panic("%s: DMA_ERROR waiting for depend_tx\n", | 82 | panic("%s: DMA_ERROR waiting for depend_tx\n", |
83 | __FUNCTION__); | 83 | __func__); |
84 | } | 84 | } |
85 | 85 | ||
86 | dest_buf = kmap_atomic(dest, KM_USER0) + dest_offset; | 86 | dest_buf = kmap_atomic(dest, KM_USER0) + dest_offset; |
diff --git a/crypto/async_tx/async_memset.c b/crypto/async_tx/async_memset.c index 09c0e83664bc..f5ff3906b035 100644 --- a/crypto/async_tx/async_memset.c +++ b/crypto/async_tx/async_memset.c | |||
@@ -63,11 +63,11 @@ async_memset(struct page *dest, int val, unsigned int offset, | |||
63 | } | 63 | } |
64 | 64 | ||
65 | if (tx) { | 65 | if (tx) { |
66 | pr_debug("%s: (async) len: %zu\n", __FUNCTION__, len); | 66 | pr_debug("%s: (async) len: %zu\n", __func__, len); |
67 | async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); | 67 | async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); |
68 | } else { /* run the memset synchronously */ | 68 | } else { /* run the memset synchronously */ |
69 | void *dest_buf; | 69 | void *dest_buf; |
70 | pr_debug("%s: (sync) len: %zu\n", __FUNCTION__, len); | 70 | pr_debug("%s: (sync) len: %zu\n", __func__, len); |
71 | 71 | ||
72 | dest_buf = (void *) (((char *) page_address(dest)) + offset); | 72 | dest_buf = (void *) (((char *) page_address(dest)) + offset); |
73 | 73 | ||
@@ -79,7 +79,7 @@ async_memset(struct page *dest, int val, unsigned int offset, | |||
79 | BUG_ON(depend_tx->ack); | 79 | BUG_ON(depend_tx->ack); |
80 | if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR) | 80 | if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR) |
81 | panic("%s: DMA_ERROR waiting for depend_tx\n", | 81 | panic("%s: DMA_ERROR waiting for depend_tx\n", |
82 | __FUNCTION__); | 82 | __func__); |
83 | } | 83 | } |
84 | 84 | ||
85 | memset(dest_buf, val, len); | 85 | memset(dest_buf, val, len); |
diff --git a/crypto/async_tx/async_tx.c b/crypto/async_tx/async_tx.c index 562882189de5..2be3bae89930 100644 --- a/crypto/async_tx/async_tx.c +++ b/crypto/async_tx/async_tx.c | |||
@@ -472,11 +472,11 @@ async_trigger_callback(enum async_tx_flags flags, | |||
472 | tx = NULL; | 472 | tx = NULL; |
473 | 473 | ||
474 | if (tx) { | 474 | if (tx) { |
475 | pr_debug("%s: (async)\n", __FUNCTION__); | 475 | pr_debug("%s: (async)\n", __func__); |
476 | 476 | ||
477 | async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); | 477 | async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param); |
478 | } else { | 478 | } else { |
479 | pr_debug("%s: (sync)\n", __FUNCTION__); | 479 | pr_debug("%s: (sync)\n", __func__); |
480 | 480 | ||
481 | /* wait for any prerequisite operations */ | 481 | /* wait for any prerequisite operations */ |
482 | if (depend_tx) { | 482 | if (depend_tx) { |
@@ -486,7 +486,7 @@ async_trigger_callback(enum async_tx_flags flags, | |||
486 | BUG_ON(depend_tx->ack); | 486 | BUG_ON(depend_tx->ack); |
487 | if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR) | 487 | if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR) |
488 | panic("%s: DMA_ERROR waiting for depend_tx\n", | 488 | panic("%s: DMA_ERROR waiting for depend_tx\n", |
489 | __FUNCTION__); | 489 | __func__); |
490 | } | 490 | } |
491 | 491 | ||
492 | async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param); | 492 | async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param); |
diff --git a/crypto/async_tx/async_xor.c b/crypto/async_tx/async_xor.c index 2259a4ff15cb..7a9db353f198 100644 --- a/crypto/async_tx/async_xor.c +++ b/crypto/async_tx/async_xor.c | |||
@@ -47,7 +47,7 @@ do_async_xor(struct dma_device *device, | |||
47 | int i; | 47 | int i; |
48 | unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0; | 48 | unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0; |
49 | 49 | ||
50 | pr_debug("%s: len: %zu\n", __FUNCTION__, len); | 50 | pr_debug("%s: len: %zu\n", __func__, len); |
51 | 51 | ||
52 | dma_dest = dma_map_page(device->dev, dest, offset, len, | 52 | dma_dest = dma_map_page(device->dev, dest, offset, len, |
53 | DMA_FROM_DEVICE); | 53 | DMA_FROM_DEVICE); |
@@ -86,7 +86,7 @@ do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset, | |||
86 | void *_dest; | 86 | void *_dest; |
87 | int i; | 87 | int i; |
88 | 88 | ||
89 | pr_debug("%s: len: %zu\n", __FUNCTION__, len); | 89 | pr_debug("%s: len: %zu\n", __func__, len); |
90 | 90 | ||
91 | /* reuse the 'src_list' array to convert to buffer pointers */ | 91 | /* reuse the 'src_list' array to convert to buffer pointers */ |
92 | for (i = 0; i < src_cnt; i++) | 92 | for (i = 0; i < src_cnt; i++) |
@@ -196,7 +196,7 @@ async_xor(struct page *dest, struct page **src_list, unsigned int offset, | |||
196 | DMA_ERROR) | 196 | DMA_ERROR) |
197 | panic("%s: DMA_ERROR waiting for " | 197 | panic("%s: DMA_ERROR waiting for " |
198 | "depend_tx\n", | 198 | "depend_tx\n", |
199 | __FUNCTION__); | 199 | __func__); |
200 | } | 200 | } |
201 | 201 | ||
202 | do_sync_xor(dest, &src_list[src_off], offset, | 202 | do_sync_xor(dest, &src_list[src_off], offset, |
@@ -276,7 +276,7 @@ async_xor_zero_sum(struct page *dest, struct page **src_list, | |||
276 | unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0; | 276 | unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0; |
277 | int i; | 277 | int i; |
278 | 278 | ||
279 | pr_debug("%s: (async) len: %zu\n", __FUNCTION__, len); | 279 | pr_debug("%s: (async) len: %zu\n", __func__, len); |
280 | 280 | ||
281 | for (i = 0; i < src_cnt; i++) | 281 | for (i = 0; i < src_cnt; i++) |
282 | dma_src[i] = dma_map_page(device->dev, src_list[i], | 282 | dma_src[i] = dma_map_page(device->dev, src_list[i], |
@@ -299,7 +299,7 @@ async_xor_zero_sum(struct page *dest, struct page **src_list, | |||
299 | } else { | 299 | } else { |
300 | unsigned long xor_flags = flags; | 300 | unsigned long xor_flags = flags; |
301 | 301 | ||
302 | pr_debug("%s: (sync) len: %zu\n", __FUNCTION__, len); | 302 | pr_debug("%s: (sync) len: %zu\n", __func__, len); |
303 | 303 | ||
304 | xor_flags |= ASYNC_TX_XOR_DROP_DST; | 304 | xor_flags |= ASYNC_TX_XOR_DROP_DST; |
305 | xor_flags &= ~ASYNC_TX_ACK; | 305 | xor_flags &= ~ASYNC_TX_ACK; |
@@ -310,7 +310,7 @@ async_xor_zero_sum(struct page *dest, struct page **src_list, | |||
310 | if (tx) { | 310 | if (tx) { |
311 | if (dma_wait_for_async_tx(tx) == DMA_ERROR) | 311 | if (dma_wait_for_async_tx(tx) == DMA_ERROR) |
312 | panic("%s: DMA_ERROR waiting for tx\n", | 312 | panic("%s: DMA_ERROR waiting for tx\n", |
313 | __FUNCTION__); | 313 | __func__); |
314 | async_tx_ack(tx); | 314 | async_tx_ack(tx); |
315 | } | 315 | } |
316 | 316 | ||
diff --git a/crypto/blkcipher.c b/crypto/blkcipher.c index 4a7e65c4df4d..185f955fb0d7 100644 --- a/crypto/blkcipher.c +++ b/crypto/blkcipher.c | |||
@@ -696,5 +696,34 @@ void skcipher_geniv_exit(struct crypto_tfm *tfm) | |||
696 | } | 696 | } |
697 | EXPORT_SYMBOL_GPL(skcipher_geniv_exit); | 697 | EXPORT_SYMBOL_GPL(skcipher_geniv_exit); |
698 | 698 | ||
699 | static int __init blkcipher_module_init(void) | ||
700 | { | ||
701 | int err; | ||
702 | |||
703 | err = chainiv_module_init(); | ||
704 | if (err) | ||
705 | goto out; | ||
706 | |||
707 | err = eseqiv_module_init(); | ||
708 | if (err) | ||
709 | goto eseqiv_err; | ||
710 | |||
711 | out: | ||
712 | return err; | ||
713 | |||
714 | eseqiv_err: | ||
715 | chainiv_module_exit(); | ||
716 | goto out; | ||
717 | } | ||
718 | |||
719 | static void __exit blkcipher_module_exit(void) | ||
720 | { | ||
721 | eseqiv_module_exit(); | ||
722 | chainiv_module_exit(); | ||
723 | } | ||
724 | |||
725 | module_init(blkcipher_module_init); | ||
726 | module_exit(blkcipher_module_exit); | ||
727 | |||
699 | MODULE_LICENSE("GPL"); | 728 | MODULE_LICENSE("GPL"); |
700 | MODULE_DESCRIPTION("Generic block chaining cipher type"); | 729 | MODULE_DESCRIPTION("Generic block chaining cipher type"); |
diff --git a/crypto/chainiv.c b/crypto/chainiv.c index d17fa0454dc3..6da3f577e4db 100644 --- a/crypto/chainiv.c +++ b/crypto/chainiv.c | |||
@@ -314,18 +314,12 @@ static struct crypto_template chainiv_tmpl = { | |||
314 | .module = THIS_MODULE, | 314 | .module = THIS_MODULE, |
315 | }; | 315 | }; |
316 | 316 | ||
317 | static int __init chainiv_module_init(void) | 317 | int __init chainiv_module_init(void) |
318 | { | 318 | { |
319 | return crypto_register_template(&chainiv_tmpl); | 319 | return crypto_register_template(&chainiv_tmpl); |
320 | } | 320 | } |
321 | 321 | ||
322 | static void __exit chainiv_module_exit(void) | 322 | void chainiv_module_exit(void) |
323 | { | 323 | { |
324 | crypto_unregister_template(&chainiv_tmpl); | 324 | crypto_unregister_template(&chainiv_tmpl); |
325 | } | 325 | } |
326 | |||
327 | module_init(chainiv_module_init); | ||
328 | module_exit(chainiv_module_exit); | ||
329 | |||
330 | MODULE_LICENSE("GPL"); | ||
331 | MODULE_DESCRIPTION("Chain IV Generator"); | ||
diff --git a/crypto/digest.c b/crypto/digest.c index 6fd43bddd545..b526cc348b79 100644 --- a/crypto/digest.c +++ b/crypto/digest.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | #include <linux/scatterlist.h> | 22 | #include <linux/scatterlist.h> |
23 | 23 | ||
24 | #include "internal.h" | ||
25 | |||
24 | static int init(struct hash_desc *desc) | 26 | static int init(struct hash_desc *desc) |
25 | { | 27 | { |
26 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); | 28 | struct crypto_tfm *tfm = crypto_hash_tfm(desc->tfm); |
diff --git a/crypto/eseqiv.c b/crypto/eseqiv.c index eb90d27ae118..b14f14e314b6 100644 --- a/crypto/eseqiv.c +++ b/crypto/eseqiv.c | |||
@@ -247,18 +247,12 @@ static struct crypto_template eseqiv_tmpl = { | |||
247 | .module = THIS_MODULE, | 247 | .module = THIS_MODULE, |
248 | }; | 248 | }; |
249 | 249 | ||
250 | static int __init eseqiv_module_init(void) | 250 | int __init eseqiv_module_init(void) |
251 | { | 251 | { |
252 | return crypto_register_template(&eseqiv_tmpl); | 252 | return crypto_register_template(&eseqiv_tmpl); |
253 | } | 253 | } |
254 | 254 | ||
255 | static void __exit eseqiv_module_exit(void) | 255 | void __exit eseqiv_module_exit(void) |
256 | { | 256 | { |
257 | crypto_unregister_template(&eseqiv_tmpl); | 257 | crypto_unregister_template(&eseqiv_tmpl); |
258 | } | 258 | } |
259 | |||
260 | module_init(eseqiv_module_init); | ||
261 | module_exit(eseqiv_module_exit); | ||
262 | |||
263 | MODULE_LICENSE("GPL"); | ||
264 | MODULE_DESCRIPTION("Encrypted Sequence Number IV Generator"); | ||
diff --git a/crypto/xcbc.c b/crypto/xcbc.c index 86727403e5ab..2feb0f239c38 100644 --- a/crypto/xcbc.c +++ b/crypto/xcbc.c | |||
@@ -124,6 +124,11 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc, | |||
124 | unsigned int offset = sg[i].offset; | 124 | unsigned int offset = sg[i].offset; |
125 | unsigned int slen = sg[i].length; | 125 | unsigned int slen = sg[i].length; |
126 | 126 | ||
127 | if (unlikely(slen > nbytes)) | ||
128 | slen = nbytes; | ||
129 | |||
130 | nbytes -= slen; | ||
131 | |||
127 | while (slen > 0) { | 132 | while (slen > 0) { |
128 | unsigned int len = min(slen, ((unsigned int)(PAGE_SIZE)) - offset); | 133 | unsigned int len = min(slen, ((unsigned int)(PAGE_SIZE)) - offset); |
129 | char *p = crypto_kmap(pg, 0) + offset; | 134 | char *p = crypto_kmap(pg, 0) + offset; |
@@ -177,7 +182,6 @@ static int crypto_xcbc_digest_update2(struct hash_desc *pdesc, | |||
177 | offset = 0; | 182 | offset = 0; |
178 | pg++; | 183 | pg++; |
179 | } | 184 | } |
180 | nbytes-=sg[i].length; | ||
181 | i++; | 185 | i++; |
182 | } while (nbytes>0); | 186 | } while (nbytes>0); |
183 | 187 | ||
diff --git a/crypto/xts.c b/crypto/xts.c index 8eb08bfaf7c0..d87b0f3102c3 100644 --- a/crypto/xts.c +++ b/crypto/xts.c | |||
@@ -77,16 +77,16 @@ static int setkey(struct crypto_tfm *parent, const u8 *key, | |||
77 | } | 77 | } |
78 | 78 | ||
79 | struct sinfo { | 79 | struct sinfo { |
80 | be128 t; | 80 | be128 *t; |
81 | struct crypto_tfm *tfm; | 81 | struct crypto_tfm *tfm; |
82 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *); | 82 | void (*fn)(struct crypto_tfm *, u8 *, const u8 *); |
83 | }; | 83 | }; |
84 | 84 | ||
85 | static inline void xts_round(struct sinfo *s, void *dst, const void *src) | 85 | static inline void xts_round(struct sinfo *s, void *dst, const void *src) |
86 | { | 86 | { |
87 | be128_xor(dst, &s->t, src); /* PP <- T xor P */ | 87 | be128_xor(dst, s->t, src); /* PP <- T xor P */ |
88 | s->fn(s->tfm, dst, dst); /* CC <- E(Key1,PP) */ | 88 | s->fn(s->tfm, dst, dst); /* CC <- E(Key1,PP) */ |
89 | be128_xor(dst, dst, &s->t); /* C <- T xor CC */ | 89 | be128_xor(dst, dst, s->t); /* C <- T xor CC */ |
90 | } | 90 | } |
91 | 91 | ||
92 | static int crypt(struct blkcipher_desc *d, | 92 | static int crypt(struct blkcipher_desc *d, |
@@ -101,7 +101,6 @@ static int crypt(struct blkcipher_desc *d, | |||
101 | .tfm = crypto_cipher_tfm(ctx->child), | 101 | .tfm = crypto_cipher_tfm(ctx->child), |
102 | .fn = fn | 102 | .fn = fn |
103 | }; | 103 | }; |
104 | be128 *iv; | ||
105 | u8 *wsrc; | 104 | u8 *wsrc; |
106 | u8 *wdst; | 105 | u8 *wdst; |
107 | 106 | ||
@@ -109,20 +108,20 @@ static int crypt(struct blkcipher_desc *d, | |||
109 | if (!w->nbytes) | 108 | if (!w->nbytes) |
110 | return err; | 109 | return err; |
111 | 110 | ||
111 | s.t = (be128 *)w->iv; | ||
112 | avail = w->nbytes; | 112 | avail = w->nbytes; |
113 | 113 | ||
114 | wsrc = w->src.virt.addr; | 114 | wsrc = w->src.virt.addr; |
115 | wdst = w->dst.virt.addr; | 115 | wdst = w->dst.virt.addr; |
116 | 116 | ||
117 | /* calculate first value of T */ | 117 | /* calculate first value of T */ |
118 | iv = (be128 *)w->iv; | 118 | tw(crypto_cipher_tfm(ctx->tweak), w->iv, w->iv); |
119 | tw(crypto_cipher_tfm(ctx->tweak), (void *)&s.t, w->iv); | ||
120 | 119 | ||
121 | goto first; | 120 | goto first; |
122 | 121 | ||
123 | for (;;) { | 122 | for (;;) { |
124 | do { | 123 | do { |
125 | gf128mul_x_ble(&s.t, &s.t); | 124 | gf128mul_x_ble(s.t, s.t); |
126 | 125 | ||
127 | first: | 126 | first: |
128 | xts_round(&s, wdst, wsrc); | 127 | xts_round(&s, wdst, wsrc); |
diff --git a/drivers/acorn/char/defkeymap-l7200.c b/drivers/acorn/char/defkeymap-l7200.c index 28a5fbc6aa1a..93d80a1c36f9 100644 --- a/drivers/acorn/char/defkeymap-l7200.c +++ b/drivers/acorn/char/defkeymap-l7200.c | |||
@@ -347,40 +347,40 @@ char *func_table[MAX_NR_FUNC] = { | |||
347 | }; | 347 | }; |
348 | 348 | ||
349 | struct kbdiacruc accent_table[MAX_DIACR] = { | 349 | struct kbdiacruc accent_table[MAX_DIACR] = { |
350 | {'`', 'A', '\300'}, {'`', 'a', '\340'}, | 350 | {'`', 'A', 0300}, {'`', 'a', 0340}, |
351 | {'\'', 'A', '\301'}, {'\'', 'a', '\341'}, | 351 | {'\'', 'A', 0301}, {'\'', 'a', 0341}, |
352 | {'^', 'A', '\302'}, {'^', 'a', '\342'}, | 352 | {'^', 'A', 0302}, {'^', 'a', 0342}, |
353 | {'~', 'A', '\303'}, {'~', 'a', '\343'}, | 353 | {'~', 'A', 0303}, {'~', 'a', 0343}, |
354 | {'"', 'A', '\304'}, {'"', 'a', '\344'}, | 354 | {'"', 'A', 0304}, {'"', 'a', 0344}, |
355 | {'O', 'A', '\305'}, {'o', 'a', '\345'}, | 355 | {'O', 'A', 0305}, {'o', 'a', 0345}, |
356 | {'0', 'A', '\305'}, {'0', 'a', '\345'}, | 356 | {'0', 'A', 0305}, {'0', 'a', 0345}, |
357 | {'A', 'A', '\305'}, {'a', 'a', '\345'}, | 357 | {'A', 'A', 0305}, {'a', 'a', 0345}, |
358 | {'A', 'E', '\306'}, {'a', 'e', '\346'}, | 358 | {'A', 'E', 0306}, {'a', 'e', 0346}, |
359 | {',', 'C', '\307'}, {',', 'c', '\347'}, | 359 | {',', 'C', 0307}, {',', 'c', 0347}, |
360 | {'`', 'E', '\310'}, {'`', 'e', '\350'}, | 360 | {'`', 'E', 0310}, {'`', 'e', 0350}, |
361 | {'\'', 'E', '\311'}, {'\'', 'e', '\351'}, | 361 | {'\'', 'E', 0311}, {'\'', 'e', 0351}, |
362 | {'^', 'E', '\312'}, {'^', 'e', '\352'}, | 362 | {'^', 'E', 0312}, {'^', 'e', 0352}, |
363 | {'"', 'E', '\313'}, {'"', 'e', '\353'}, | 363 | {'"', 'E', 0313}, {'"', 'e', 0353}, |
364 | {'`', 'I', '\314'}, {'`', 'i', '\354'}, | 364 | {'`', 'I', 0314}, {'`', 'i', 0354}, |
365 | {'\'', 'I', '\315'}, {'\'', 'i', '\355'}, | 365 | {'\'', 'I', 0315}, {'\'', 'i', 0355}, |
366 | {'^', 'I', '\316'}, {'^', 'i', '\356'}, | 366 | {'^', 'I', 0316}, {'^', 'i', 0356}, |
367 | {'"', 'I', '\317'}, {'"', 'i', '\357'}, | 367 | {'"', 'I', 0317}, {'"', 'i', 0357}, |
368 | {'-', 'D', '\320'}, {'-', 'd', '\360'}, | 368 | {'-', 'D', 0320}, {'-', 'd', 0360}, |
369 | {'~', 'N', '\321'}, {'~', 'n', '\361'}, | 369 | {'~', 'N', 0321}, {'~', 'n', 0361}, |
370 | {'`', 'O', '\322'}, {'`', 'o', '\362'}, | 370 | {'`', 'O', 0322}, {'`', 'o', 0362}, |
371 | {'\'', 'O', '\323'}, {'\'', 'o', '\363'}, | 371 | {'\'', 'O', 0323}, {'\'', 'o', 0363}, |
372 | {'^', 'O', '\324'}, {'^', 'o', '\364'}, | 372 | {'^', 'O', 0324}, {'^', 'o', 0364}, |
373 | {'~', 'O', '\325'}, {'~', 'o', '\365'}, | 373 | {'~', 'O', 0325}, {'~', 'o', 0365}, |
374 | {'"', 'O', '\326'}, {'"', 'o', '\366'}, | 374 | {'"', 'O', 0326}, {'"', 'o', 0366}, |
375 | {'/', 'O', '\330'}, {'/', 'o', '\370'}, | 375 | {'/', 'O', 0330}, {'/', 'o', 0370}, |
376 | {'`', 'U', '\331'}, {'`', 'u', '\371'}, | 376 | {'`', 'U', 0331}, {'`', 'u', 0371}, |
377 | {'\'', 'U', '\332'}, {'\'', 'u', '\372'}, | 377 | {'\'', 'U', 0332}, {'\'', 'u', 0372}, |
378 | {'^', 'U', '\333'}, {'^', 'u', '\373'}, | 378 | {'^', 'U', 0333}, {'^', 'u', 0373}, |
379 | {'"', 'U', '\334'}, {'"', 'u', '\374'}, | 379 | {'"', 'U', 0334}, {'"', 'u', 0374}, |
380 | {'\'', 'Y', '\335'}, {'\'', 'y', '\375'}, | 380 | {'\'', 'Y', 0335}, {'\'', 'y', 0375}, |
381 | {'T', 'H', '\336'}, {'t', 'h', '\376'}, | 381 | {'T', 'H', 0336}, {'t', 'h', 0376}, |
382 | {'s', 's', '\337'}, {'"', 'y', '\377'}, | 382 | {'s', 's', 0337}, {'"', 'y', 0377}, |
383 | {'s', 'z', '\337'}, {'i', 'j', '\377'}, | 383 | {'s', 'z', 0337}, {'i', 'j', 0377}, |
384 | }; | 384 | }; |
385 | 385 | ||
386 | unsigned int accent_table_size = 68; | 386 | unsigned int accent_table_size = 68; |
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index f688c214be0c..b4f5e8542829 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig | |||
@@ -283,34 +283,22 @@ config ACPI_TOSHIBA | |||
283 | If you have a legacy free Toshiba laptop (such as the Libretto L1 | 283 | If you have a legacy free Toshiba laptop (such as the Libretto L1 |
284 | series), say Y. | 284 | series), say Y. |
285 | 285 | ||
286 | config ACPI_CUSTOM_DSDT | 286 | config ACPI_CUSTOM_DSDT_FILE |
287 | bool "Include Custom DSDT" | 287 | string "Custom DSDT Table file to include" |
288 | default "" | ||
288 | depends on !STANDALONE | 289 | depends on !STANDALONE |
289 | default n | ||
290 | help | 290 | help |
291 | This option supports a custom DSDT by linking it into the kernel. | 291 | This option supports a custom DSDT by linking it into the kernel. |
292 | See Documentation/acpi/dsdt-override.txt | 292 | See Documentation/acpi/dsdt-override.txt |
293 | 293 | ||
294 | If unsure, say N. | ||
295 | |||
296 | config ACPI_CUSTOM_DSDT_FILE | ||
297 | string "Custom DSDT Table file to include" | ||
298 | depends on ACPI_CUSTOM_DSDT | ||
299 | default "" | ||
300 | help | ||
301 | Enter the full path name to the file which includes the AmlCode | 294 | Enter the full path name to the file which includes the AmlCode |
302 | declaration. | 295 | declaration. |
303 | 296 | ||
304 | config ACPI_CUSTOM_DSDT_INITRD | 297 | If unsure, don't enter a file name. |
305 | bool "Read Custom DSDT from initramfs" | ||
306 | depends on BLK_DEV_INITRD | ||
307 | default n | ||
308 | help | ||
309 | This option supports a custom DSDT by optionally loading it from initrd. | ||
310 | See Documentation/acpi/dsdt-override.txt | ||
311 | 298 | ||
312 | If you are not using this feature now, but may use it later, | 299 | config ACPI_CUSTOM_DSDT |
313 | it is safe to say Y here. | 300 | bool |
301 | default ACPI_CUSTOM_DSDT_FILE != "" | ||
314 | 302 | ||
315 | config ACPI_BLACKLIST_YEAR | 303 | config ACPI_BLACKLIST_YEAR |
316 | int "Disable ACPI for systems before Jan 1st this year" if X86_32 | 304 | int "Disable ACPI for systems before Jan 1st this year" if X86_32 |
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index ce3c0a2cbac4..5b6760e0f957 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
@@ -776,7 +776,7 @@ static int __init acpi_init(void) | |||
776 | 776 | ||
777 | acpi_kobj = kobject_create_and_add("acpi", firmware_kobj); | 777 | acpi_kobj = kobject_create_and_add("acpi", firmware_kobj); |
778 | if (!acpi_kobj) { | 778 | if (!acpi_kobj) { |
779 | printk(KERN_WARNING "%s: kset create error\n", __FUNCTION__); | 779 | printk(KERN_WARNING "%s: kset create error\n", __func__); |
780 | acpi_kobj = NULL; | 780 | acpi_kobj = NULL; |
781 | } | 781 | } |
782 | 782 | ||
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c index 24a7865a57cb..6c5da83cdb68 100644 --- a/drivers/acpi/button.c +++ b/drivers/acpi/button.c | |||
@@ -449,6 +449,7 @@ static int acpi_button_add(struct acpi_device *device) | |||
449 | input->phys = button->phys; | 449 | input->phys = button->phys; |
450 | input->id.bustype = BUS_HOST; | 450 | input->id.bustype = BUS_HOST; |
451 | input->id.product = button->type; | 451 | input->id.product = button->type; |
452 | input->dev.parent = &device->dev; | ||
452 | 453 | ||
453 | switch (button->type) { | 454 | switch (button->type) { |
454 | case ACPI_BUTTON_TYPE_POWER: | 455 | case ACPI_BUTTON_TYPE_POWER: |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index caf873c14bfb..e7e197e3a4ff 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -129,6 +129,7 @@ static struct acpi_ec { | |||
129 | struct mutex lock; | 129 | struct mutex lock; |
130 | wait_queue_head_t wait; | 130 | wait_queue_head_t wait; |
131 | struct list_head list; | 131 | struct list_head list; |
132 | atomic_t irq_count; | ||
132 | u8 handlers_installed; | 133 | u8 handlers_installed; |
133 | } *boot_ec, *first_ec; | 134 | } *boot_ec, *first_ec; |
134 | 135 | ||
@@ -181,6 +182,8 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) | |||
181 | { | 182 | { |
182 | int ret = 0; | 183 | int ret = 0; |
183 | 184 | ||
185 | atomic_set(&ec->irq_count, 0); | ||
186 | |||
184 | if (unlikely(event == ACPI_EC_EVENT_OBF_1 && | 187 | if (unlikely(event == ACPI_EC_EVENT_OBF_1 && |
185 | test_bit(EC_FLAGS_NO_OBF1_GPE, &ec->flags))) | 188 | test_bit(EC_FLAGS_NO_OBF1_GPE, &ec->flags))) |
186 | force_poll = 1; | 189 | force_poll = 1; |
@@ -227,6 +230,7 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) | |||
227 | while (time_before(jiffies, delay)) { | 230 | while (time_before(jiffies, delay)) { |
228 | if (acpi_ec_check_status(ec, event)) | 231 | if (acpi_ec_check_status(ec, event)) |
229 | goto end; | 232 | goto end; |
233 | msleep(5); | ||
230 | } | 234 | } |
231 | } | 235 | } |
232 | pr_err(PREFIX "acpi_ec_wait timeout," | 236 | pr_err(PREFIX "acpi_ec_wait timeout," |
@@ -529,6 +533,13 @@ static u32 acpi_ec_gpe_handler(void *data) | |||
529 | struct acpi_ec *ec = data; | 533 | struct acpi_ec *ec = data; |
530 | 534 | ||
531 | pr_debug(PREFIX "~~~> interrupt\n"); | 535 | pr_debug(PREFIX "~~~> interrupt\n"); |
536 | atomic_inc(&ec->irq_count); | ||
537 | if (atomic_read(&ec->irq_count) > 5) { | ||
538 | pr_err(PREFIX "GPE storm detected, disabling EC GPE\n"); | ||
539 | acpi_disable_gpe(NULL, ec->gpe, ACPI_ISR); | ||
540 | clear_bit(EC_FLAGS_GPE_MODE, &ec->flags); | ||
541 | return ACPI_INTERRUPT_HANDLED; | ||
542 | } | ||
532 | clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags); | 543 | clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags); |
533 | if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) | 544 | if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) |
534 | wake_up(&ec->wait); | 545 | wake_up(&ec->wait); |
@@ -943,11 +954,7 @@ int __init acpi_ec_ecdt_probe(void) | |||
943 | boot_ec->command_addr = ecdt_ptr->control.address; | 954 | boot_ec->command_addr = ecdt_ptr->control.address; |
944 | boot_ec->data_addr = ecdt_ptr->data.address; | 955 | boot_ec->data_addr = ecdt_ptr->data.address; |
945 | boot_ec->gpe = ecdt_ptr->gpe; | 956 | boot_ec->gpe = ecdt_ptr->gpe; |
946 | if (ACPI_FAILURE(acpi_get_handle(NULL, ecdt_ptr->id, | 957 | boot_ec->handle = ACPI_ROOT_OBJECT; |
947 | &boot_ec->handle))) { | ||
948 | pr_info("Failed to locate handle for boot EC\n"); | ||
949 | boot_ec->handle = ACPI_ROOT_OBJECT; | ||
950 | } | ||
951 | } else { | 958 | } else { |
952 | /* This workaround is needed only on some broken machines, | 959 | /* This workaround is needed only on some broken machines, |
953 | * which require early EC, but fail to provide ECDT */ | 960 | * which require early EC, but fail to provide ECDT */ |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 8edba7b678eb..a697fb6cf050 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -91,10 +91,6 @@ static DEFINE_SPINLOCK(acpi_res_lock); | |||
91 | #define OSI_STRING_LENGTH_MAX 64 /* arbitrary */ | 91 | #define OSI_STRING_LENGTH_MAX 64 /* arbitrary */ |
92 | static char osi_additional_string[OSI_STRING_LENGTH_MAX]; | 92 | static char osi_additional_string[OSI_STRING_LENGTH_MAX]; |
93 | 93 | ||
94 | #ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD | ||
95 | static int acpi_no_initrd_override; | ||
96 | #endif | ||
97 | |||
98 | /* | 94 | /* |
99 | * "Ode to _OSI(Linux)" | 95 | * "Ode to _OSI(Linux)" |
100 | * | 96 | * |
@@ -324,67 +320,6 @@ acpi_os_predefined_override(const struct acpi_predefined_names *init_val, | |||
324 | return AE_OK; | 320 | return AE_OK; |
325 | } | 321 | } |
326 | 322 | ||
327 | #ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD | ||
328 | static struct acpi_table_header *acpi_find_dsdt_initrd(void) | ||
329 | { | ||
330 | struct file *firmware_file; | ||
331 | mm_segment_t oldfs; | ||
332 | unsigned long len, len2; | ||
333 | struct acpi_table_header *dsdt_buffer, *ret = NULL; | ||
334 | struct kstat stat; | ||
335 | char *ramfs_dsdt_name = "/DSDT.aml"; | ||
336 | |||
337 | printk(KERN_INFO PREFIX "Checking initramfs for custom DSDT\n"); | ||
338 | |||
339 | /* | ||
340 | * Never do this at home, only the user-space is allowed to open a file. | ||
341 | * The clean way would be to use the firmware loader. | ||
342 | * But this code must be run before there is any userspace available. | ||
343 | * A static/init firmware infrastructure doesn't exist yet... | ||
344 | */ | ||
345 | if (vfs_stat(ramfs_dsdt_name, &stat) < 0) | ||
346 | return ret; | ||
347 | |||
348 | len = stat.size; | ||
349 | /* check especially against empty files */ | ||
350 | if (len <= 4) { | ||
351 | printk(KERN_ERR PREFIX "Failed: DSDT only %lu bytes.\n", len); | ||
352 | return ret; | ||
353 | } | ||
354 | |||
355 | firmware_file = filp_open(ramfs_dsdt_name, O_RDONLY, 0); | ||
356 | if (IS_ERR(firmware_file)) { | ||
357 | printk(KERN_ERR PREFIX "Failed to open %s.\n", ramfs_dsdt_name); | ||
358 | return ret; | ||
359 | } | ||
360 | |||
361 | dsdt_buffer = kmalloc(len, GFP_ATOMIC); | ||
362 | if (!dsdt_buffer) { | ||
363 | printk(KERN_ERR PREFIX "Failed to allocate %lu bytes.\n", len); | ||
364 | goto err; | ||
365 | } | ||
366 | |||
367 | oldfs = get_fs(); | ||
368 | set_fs(KERNEL_DS); | ||
369 | len2 = vfs_read(firmware_file, (char __user *)dsdt_buffer, len, | ||
370 | &firmware_file->f_pos); | ||
371 | set_fs(oldfs); | ||
372 | if (len2 < len) { | ||
373 | printk(KERN_ERR PREFIX "Failed to read %lu bytes from %s.\n", | ||
374 | len, ramfs_dsdt_name); | ||
375 | ACPI_FREE(dsdt_buffer); | ||
376 | goto err; | ||
377 | } | ||
378 | |||
379 | printk(KERN_INFO PREFIX "Found %lu byte DSDT in %s.\n", | ||
380 | len, ramfs_dsdt_name); | ||
381 | ret = dsdt_buffer; | ||
382 | err: | ||
383 | filp_close(firmware_file, NULL); | ||
384 | return ret; | ||
385 | } | ||
386 | #endif | ||
387 | |||
388 | acpi_status | 323 | acpi_status |
389 | acpi_os_table_override(struct acpi_table_header * existing_table, | 324 | acpi_os_table_override(struct acpi_table_header * existing_table, |
390 | struct acpi_table_header ** new_table) | 325 | struct acpi_table_header ** new_table) |
@@ -398,16 +333,6 @@ acpi_os_table_override(struct acpi_table_header * existing_table, | |||
398 | if (strncmp(existing_table->signature, "DSDT", 4) == 0) | 333 | if (strncmp(existing_table->signature, "DSDT", 4) == 0) |
399 | *new_table = (struct acpi_table_header *)AmlCode; | 334 | *new_table = (struct acpi_table_header *)AmlCode; |
400 | #endif | 335 | #endif |
401 | #ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD | ||
402 | if ((strncmp(existing_table->signature, "DSDT", 4) == 0) && | ||
403 | !acpi_no_initrd_override) { | ||
404 | struct acpi_table_header *initrd_table; | ||
405 | |||
406 | initrd_table = acpi_find_dsdt_initrd(); | ||
407 | if (initrd_table) | ||
408 | *new_table = initrd_table; | ||
409 | } | ||
410 | #endif | ||
411 | if (*new_table != NULL) { | 336 | if (*new_table != NULL) { |
412 | printk(KERN_WARNING PREFIX "Override [%4.4s-%8.8s], " | 337 | printk(KERN_WARNING PREFIX "Override [%4.4s-%8.8s], " |
413 | "this is unsafe: tainting kernel\n", | 338 | "this is unsafe: tainting kernel\n", |
@@ -418,15 +343,6 @@ acpi_os_table_override(struct acpi_table_header * existing_table, | |||
418 | return AE_OK; | 343 | return AE_OK; |
419 | } | 344 | } |
420 | 345 | ||
421 | #ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD | ||
422 | static int __init acpi_no_initrd_override_setup(char *s) | ||
423 | { | ||
424 | acpi_no_initrd_override = 1; | ||
425 | return 1; | ||
426 | } | ||
427 | __setup("acpi_no_initrd_override", acpi_no_initrd_override_setup); | ||
428 | #endif | ||
429 | |||
430 | static irqreturn_t acpi_irq(int irq, void *dev_id) | 346 | static irqreturn_t acpi_irq(int irq, void *dev_id) |
431 | { | 347 | { |
432 | u32 handled; | 348 | u32 handled; |
@@ -1237,7 +1153,7 @@ int acpi_check_resource_conflict(struct resource *res) | |||
1237 | 1153 | ||
1238 | if (clash) { | 1154 | if (clash) { |
1239 | if (acpi_enforce_resources != ENFORCE_RESOURCES_NO) { | 1155 | if (acpi_enforce_resources != ENFORCE_RESOURCES_NO) { |
1240 | printk(KERN_INFO "%sACPI: %s resource %s [0x%llx-0x%llx]" | 1156 | printk("%sACPI: %s resource %s [0x%llx-0x%llx]" |
1241 | " conflicts with ACPI region %s" | 1157 | " conflicts with ACPI region %s" |
1242 | " [0x%llx-0x%llx]\n", | 1158 | " [0x%llx-0x%llx]\n", |
1243 | acpi_enforce_resources == ENFORCE_RESOURCES_LAX | 1159 | acpi_enforce_resources == ENFORCE_RESOURCES_LAX |
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 7f19859580c7..7af414a3c63e 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -25,6 +25,7 @@ | |||
25 | */ | 25 | */ |
26 | 26 | ||
27 | 27 | ||
28 | #include <linux/dmi.h> | ||
28 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
29 | #include <linux/module.h> | 30 | #include <linux/module.h> |
30 | #include <linux/init.h> | 31 | #include <linux/init.h> |
@@ -76,6 +77,101 @@ static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(int segment, | |||
76 | return NULL; | 77 | return NULL; |
77 | } | 78 | } |
78 | 79 | ||
80 | /* http://bugzilla.kernel.org/show_bug.cgi?id=4773 */ | ||
81 | static struct dmi_system_id medion_md9580[] = { | ||
82 | { | ||
83 | .ident = "Medion MD9580-F laptop", | ||
84 | .matches = { | ||
85 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | ||
86 | DMI_MATCH(DMI_PRODUCT_NAME, "A555"), | ||
87 | }, | ||
88 | }, | ||
89 | { } | ||
90 | }; | ||
91 | |||
92 | /* http://bugzilla.kernel.org/show_bug.cgi?id=5044 */ | ||
93 | static struct dmi_system_id dell_optiplex[] = { | ||
94 | { | ||
95 | .ident = "Dell Optiplex GX1", | ||
96 | .matches = { | ||
97 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), | ||
98 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX1 600S+"), | ||
99 | }, | ||
100 | }, | ||
101 | { } | ||
102 | }; | ||
103 | |||
104 | /* http://bugzilla.kernel.org/show_bug.cgi?id=10138 */ | ||
105 | static struct dmi_system_id hp_t5710[] = { | ||
106 | { | ||
107 | .ident = "HP t5710", | ||
108 | .matches = { | ||
109 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
110 | DMI_MATCH(DMI_PRODUCT_NAME, "hp t5000 series"), | ||
111 | DMI_MATCH(DMI_BOARD_NAME, "098Ch"), | ||
112 | }, | ||
113 | }, | ||
114 | { } | ||
115 | }; | ||
116 | |||
117 | struct prt_quirk { | ||
118 | struct dmi_system_id *system; | ||
119 | unsigned int segment; | ||
120 | unsigned int bus; | ||
121 | unsigned int device; | ||
122 | unsigned char pin; | ||
123 | char *source; /* according to BIOS */ | ||
124 | char *actual_source; | ||
125 | }; | ||
126 | |||
127 | /* | ||
128 | * These systems have incorrect _PRT entries. The BIOS claims the PCI | ||
129 | * interrupt at the listed segment/bus/device/pin is connected to the first | ||
130 | * link device, but it is actually connected to the second. | ||
131 | */ | ||
132 | static struct prt_quirk prt_quirks[] = { | ||
133 | { medion_md9580, 0, 0, 9, 'A', | ||
134 | "\\_SB_.PCI0.ISA.LNKA", | ||
135 | "\\_SB_.PCI0.ISA.LNKB"}, | ||
136 | { dell_optiplex, 0, 0, 0xd, 'A', | ||
137 | "\\_SB_.LNKB", | ||
138 | "\\_SB_.LNKA"}, | ||
139 | { hp_t5710, 0, 0, 1, 'A', | ||
140 | "\\_SB_.PCI0.LNK1", | ||
141 | "\\_SB_.PCI0.LNK3"}, | ||
142 | }; | ||
143 | |||
144 | static void | ||
145 | do_prt_fixups(struct acpi_prt_entry *entry, struct acpi_pci_routing_table *prt) | ||
146 | { | ||
147 | int i; | ||
148 | struct prt_quirk *quirk; | ||
149 | |||
150 | for (i = 0; i < ARRAY_SIZE(prt_quirks); i++) { | ||
151 | quirk = &prt_quirks[i]; | ||
152 | |||
153 | /* All current quirks involve link devices, not GSIs */ | ||
154 | if (!prt->source) | ||
155 | continue; | ||
156 | |||
157 | if (dmi_check_system(quirk->system) && | ||
158 | entry->id.segment == quirk->segment && | ||
159 | entry->id.bus == quirk->bus && | ||
160 | entry->id.device == quirk->device && | ||
161 | entry->pin + 'A' == quirk->pin && | ||
162 | !strcmp(prt->source, quirk->source) && | ||
163 | strlen(prt->source) >= strlen(quirk->actual_source)) { | ||
164 | printk(KERN_WARNING PREFIX "firmware reports " | ||
165 | "%04x:%02x:%02x[%c] connected to %s; " | ||
166 | "changing to %s\n", | ||
167 | entry->id.segment, entry->id.bus, | ||
168 | entry->id.device, 'A' + entry->pin, | ||
169 | prt->source, quirk->actual_source); | ||
170 | strcpy(prt->source, quirk->actual_source); | ||
171 | } | ||
172 | } | ||
173 | } | ||
174 | |||
79 | static int | 175 | static int |
80 | acpi_pci_irq_add_entry(acpi_handle handle, | 176 | acpi_pci_irq_add_entry(acpi_handle handle, |
81 | int segment, int bus, struct acpi_pci_routing_table *prt) | 177 | int segment, int bus, struct acpi_pci_routing_table *prt) |
@@ -96,6 +192,8 @@ acpi_pci_irq_add_entry(acpi_handle handle, | |||
96 | entry->id.function = prt->address & 0xFFFF; | 192 | entry->id.function = prt->address & 0xFFFF; |
97 | entry->pin = prt->pin; | 193 | entry->pin = prt->pin; |
98 | 194 | ||
195 | do_prt_fixups(entry, prt); | ||
196 | |||
99 | /* | 197 | /* |
100 | * Type 1: Dynamic | 198 | * Type 1: Dynamic |
101 | * --------------- | 199 | * --------------- |
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index f14ff1ffab29..c3fed31166b5 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c | |||
@@ -184,7 +184,7 @@ static void acpi_pci_bridge_scan(struct acpi_device *device) | |||
184 | } | 184 | } |
185 | } | 185 | } |
186 | 186 | ||
187 | static int acpi_pci_root_add(struct acpi_device *device) | 187 | static int __devinit acpi_pci_root_add(struct acpi_device *device) |
188 | { | 188 | { |
189 | int result = 0; | 189 | int result = 0; |
190 | struct acpi_pci_root *root = NULL; | 190 | struct acpi_pci_root *root = NULL; |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index a3cc8a98255c..36a68fa114e3 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
@@ -840,17 +840,19 @@ static int is_processor_present(acpi_handle handle) | |||
840 | 840 | ||
841 | 841 | ||
842 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); | 842 | status = acpi_evaluate_integer(handle, "_STA", NULL, &sta); |
843 | /* | ||
844 | * if a processor object does not have an _STA object, | ||
845 | * OSPM assumes that the processor is present. | ||
846 | */ | ||
847 | if (status == AE_NOT_FOUND) | ||
848 | return 1; | ||
849 | 843 | ||
850 | if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT)) | 844 | if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_PRESENT)) |
851 | return 1; | 845 | return 1; |
852 | 846 | ||
853 | ACPI_EXCEPTION((AE_INFO, status, "Processor Device is not present")); | 847 | /* |
848 | * _STA is mandatory for a processor that supports hot plug | ||
849 | */ | ||
850 | if (status == AE_NOT_FOUND) | ||
851 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
852 | "Processor does not support hot plug\n")); | ||
853 | else | ||
854 | ACPI_EXCEPTION((AE_INFO, status, | ||
855 | "Processor Device is not present")); | ||
854 | return 0; | 856 | return 0; |
855 | } | 857 | } |
856 | 858 | ||
@@ -886,8 +888,8 @@ int acpi_processor_device_add(acpi_handle handle, struct acpi_device **device) | |||
886 | return 0; | 888 | return 0; |
887 | } | 889 | } |
888 | 890 | ||
889 | static void | 891 | static void __ref acpi_processor_hotplug_notify(acpi_handle handle, |
890 | acpi_processor_hotplug_notify(acpi_handle handle, u32 event, void *data) | 892 | u32 event, void *data) |
891 | { | 893 | { |
892 | struct acpi_processor *pr; | 894 | struct acpi_processor *pr; |
893 | struct acpi_device *device = NULL; | 895 | struct acpi_device *device = NULL; |
@@ -897,9 +899,10 @@ acpi_processor_hotplug_notify(acpi_handle handle, u32 event, void *data) | |||
897 | switch (event) { | 899 | switch (event) { |
898 | case ACPI_NOTIFY_BUS_CHECK: | 900 | case ACPI_NOTIFY_BUS_CHECK: |
899 | case ACPI_NOTIFY_DEVICE_CHECK: | 901 | case ACPI_NOTIFY_DEVICE_CHECK: |
900 | printk("Processor driver received %s event\n", | 902 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
903 | "Processor driver received %s event\n", | ||
901 | (event == ACPI_NOTIFY_BUS_CHECK) ? | 904 | (event == ACPI_NOTIFY_BUS_CHECK) ? |
902 | "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK"); | 905 | "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK")); |
903 | 906 | ||
904 | if (!is_processor_present(handle)) | 907 | if (!is_processor_present(handle)) |
905 | break; | 908 | break; |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 3fac011f9cf9..57570ac47803 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -609,7 +609,8 @@ acpi_bus_get_ejd(acpi_handle handle, acpi_handle *ejd) | |||
609 | status = acpi_evaluate_object(handle, "_EJD", NULL, &buffer); | 609 | status = acpi_evaluate_object(handle, "_EJD", NULL, &buffer); |
610 | if (ACPI_SUCCESS(status)) { | 610 | if (ACPI_SUCCESS(status)) { |
611 | obj = buffer.pointer; | 611 | obj = buffer.pointer; |
612 | status = acpi_get_handle(NULL, obj->string.pointer, ejd); | 612 | status = acpi_get_handle(ACPI_ROOT_OBJECT, obj->string.pointer, |
613 | ejd); | ||
613 | kfree(buffer.pointer); | 614 | kfree(buffer.pointer); |
614 | } | 615 | } |
615 | return status; | 616 | return status; |
@@ -966,7 +967,7 @@ static void acpi_device_set_id(struct acpi_device *device, | |||
966 | case ACPI_BUS_TYPE_DEVICE: | 967 | case ACPI_BUS_TYPE_DEVICE: |
967 | status = acpi_get_object_info(handle, &buffer); | 968 | status = acpi_get_object_info(handle, &buffer); |
968 | if (ACPI_FAILURE(status)) { | 969 | if (ACPI_FAILURE(status)) { |
969 | printk(KERN_ERR PREFIX "%s: Error reading device info\n", __FUNCTION__); | 970 | printk(KERN_ERR PREFIX "%s: Error reading device info\n", __func__); |
970 | return; | 971 | return; |
971 | } | 972 | } |
972 | 973 | ||
diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c index 293a1cbb47c0..d2f71a54726c 100644 --- a/drivers/acpi/sleep/main.c +++ b/drivers/acpi/sleep/main.c | |||
@@ -504,7 +504,7 @@ static void acpi_power_off_prepare(void) | |||
504 | static void acpi_power_off(void) | 504 | static void acpi_power_off(void) |
505 | { | 505 | { |
506 | /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */ | 506 | /* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */ |
507 | printk("%s called\n", __FUNCTION__); | 507 | printk("%s called\n", __func__); |
508 | local_irq_disable(); | 508 | local_irq_disable(); |
509 | acpi_enable_wakeup_device(ACPI_STATE_S5); | 509 | acpi_enable_wakeup_device(ACPI_STATE_S5); |
510 | acpi_enter_sleep_state(ACPI_STATE_S5); | 510 | acpi_enter_sleep_state(ACPI_STATE_S5); |
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c index 55cf4c05bb74..4749f379a915 100644 --- a/drivers/acpi/system.c +++ b/drivers/acpi/system.c | |||
@@ -319,7 +319,7 @@ void acpi_irq_stats_init(void) | |||
319 | goto fail; | 319 | goto fail; |
320 | 320 | ||
321 | for (i = 0; i < num_counters; ++i) { | 321 | for (i = 0; i < num_counters; ++i) { |
322 | char buffer[10]; | 322 | char buffer[12]; |
323 | char *name; | 323 | char *name; |
324 | 324 | ||
325 | if (i < num_gpes) | 325 | if (i < num_gpes) |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 8d4b79b4f933..c4e00ac8ea85 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
@@ -879,6 +879,8 @@ static void acpi_thermal_check(void *data) | |||
879 | } | 879 | } |
880 | 880 | ||
881 | /* sys I/F for generic thermal sysfs support */ | 881 | /* sys I/F for generic thermal sysfs support */ |
882 | #define KELVIN_TO_MILLICELSIUS(t) (t * 100 - 273200) | ||
883 | |||
882 | static int thermal_get_temp(struct thermal_zone_device *thermal, char *buf) | 884 | static int thermal_get_temp(struct thermal_zone_device *thermal, char *buf) |
883 | { | 885 | { |
884 | struct acpi_thermal *tz = thermal->devdata; | 886 | struct acpi_thermal *tz = thermal->devdata; |
@@ -886,7 +888,7 @@ static int thermal_get_temp(struct thermal_zone_device *thermal, char *buf) | |||
886 | if (!tz) | 888 | if (!tz) |
887 | return -EINVAL; | 889 | return -EINVAL; |
888 | 890 | ||
889 | return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS(tz->temperature)); | 891 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS(tz->temperature)); |
890 | } | 892 | } |
891 | 893 | ||
892 | static const char enabled[] = "kernel"; | 894 | static const char enabled[] = "kernel"; |
@@ -980,21 +982,21 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal, | |||
980 | 982 | ||
981 | if (tz->trips.critical.flags.valid) { | 983 | if (tz->trips.critical.flags.valid) { |
982 | if (!trip) | 984 | if (!trip) |
983 | return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS( | 985 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS( |
984 | tz->trips.critical.temperature)); | 986 | tz->trips.critical.temperature)); |
985 | trip--; | 987 | trip--; |
986 | } | 988 | } |
987 | 989 | ||
988 | if (tz->trips.hot.flags.valid) { | 990 | if (tz->trips.hot.flags.valid) { |
989 | if (!trip) | 991 | if (!trip) |
990 | return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS( | 992 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS( |
991 | tz->trips.hot.temperature)); | 993 | tz->trips.hot.temperature)); |
992 | trip--; | 994 | trip--; |
993 | } | 995 | } |
994 | 996 | ||
995 | if (tz->trips.passive.flags.valid) { | 997 | if (tz->trips.passive.flags.valid) { |
996 | if (!trip) | 998 | if (!trip) |
997 | return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS( | 999 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS( |
998 | tz->trips.passive.temperature)); | 1000 | tz->trips.passive.temperature)); |
999 | trip--; | 1001 | trip--; |
1000 | } | 1002 | } |
@@ -1002,7 +1004,7 @@ static int thermal_get_trip_temp(struct thermal_zone_device *thermal, | |||
1002 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE && | 1004 | for (i = 0; i < ACPI_THERMAL_MAX_ACTIVE && |
1003 | tz->trips.active[i].flags.valid; i++) { | 1005 | tz->trips.active[i].flags.valid; i++) { |
1004 | if (!trip) | 1006 | if (!trip) |
1005 | return sprintf(buf, "%ld\n", KELVIN_TO_CELSIUS( | 1007 | return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS( |
1006 | tz->trips.active[i].temperature)); | 1008 | tz->trips.active[i].temperature)); |
1007 | trip--; | 1009 | trip--; |
1008 | } | 1010 | } |
diff --git a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c index 9e8c20c6a0b7..0a43c8e0eff3 100644 --- a/drivers/acpi/toshiba_acpi.c +++ b/drivers/acpi/toshiba_acpi.c | |||
@@ -99,6 +99,13 @@ MODULE_LICENSE("GPL"); | |||
99 | #define HCI_VIDEO_OUT_CRT 0x2 | 99 | #define HCI_VIDEO_OUT_CRT 0x2 |
100 | #define HCI_VIDEO_OUT_TV 0x4 | 100 | #define HCI_VIDEO_OUT_TV 0x4 |
101 | 101 | ||
102 | static const struct acpi_device_id toshiba_device_ids[] = { | ||
103 | {"TOS6200", 0}, | ||
104 | {"TOS1900", 0}, | ||
105 | {"", 0}, | ||
106 | }; | ||
107 | MODULE_DEVICE_TABLE(acpi, toshiba_device_ids); | ||
108 | |||
102 | /* utility | 109 | /* utility |
103 | */ | 110 | */ |
104 | 111 | ||
diff --git a/drivers/acpi/utilities/utdebug.c b/drivers/acpi/utilities/utdebug.c index c7e128e5369b..7361204b1eef 100644 --- a/drivers/acpi/utilities/utdebug.c +++ b/drivers/acpi/utilities/utdebug.c | |||
@@ -109,7 +109,7 @@ void acpi_ut_track_stack_ptr(void) | |||
109 | * RETURN: Updated pointer to the function name | 109 | * RETURN: Updated pointer to the function name |
110 | * | 110 | * |
111 | * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present. | 111 | * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present. |
112 | * This allows compiler macros such as __FUNCTION__ to be used | 112 | * This allows compiler macros such as __func__ to be used |
113 | * with no change to the debug output. | 113 | * with no change to the debug output. |
114 | * | 114 | * |
115 | ******************************************************************************/ | 115 | ******************************************************************************/ |
diff --git a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c index 76ee766c84f9..e08b3fa6639f 100644 --- a/drivers/acpi/utilities/utobject.c +++ b/drivers/acpi/utilities/utobject.c | |||
@@ -432,7 +432,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, | |||
432 | * element -- which is legal) | 432 | * element -- which is legal) |
433 | */ | 433 | */ |
434 | if (!internal_object) { | 434 | if (!internal_object) { |
435 | *obj_length = 0; | 435 | *obj_length = sizeof(union acpi_object); |
436 | return_ACPI_STATUS(AE_OK); | 436 | return_ACPI_STATUS(AE_OK); |
437 | } | 437 | } |
438 | 438 | ||
diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c index eba55b7d6c95..44ea60cf21c0 100644 --- a/drivers/acpi/utils.c +++ b/drivers/acpi/utils.c | |||
@@ -407,6 +407,12 @@ acpi_evaluate_reference(acpi_handle handle, | |||
407 | break; | 407 | break; |
408 | } | 408 | } |
409 | 409 | ||
410 | if (!element->reference.handle) { | ||
411 | printk(KERN_WARNING PREFIX "Invalid reference in" | ||
412 | " package %s\n", pathname); | ||
413 | status = AE_NULL_ENTRY; | ||
414 | break; | ||
415 | } | ||
410 | /* Get the acpi_handle. */ | 416 | /* Get the acpi_handle. */ |
411 | 417 | ||
412 | list->handles[i] = element->reference.handle; | 418 | list->handles[i] = element->reference.handle; |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 12cce69b5441..1bc0c74f2755 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -713,7 +713,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device) | |||
713 | 713 | ||
714 | kfree(obj); | 714 | kfree(obj); |
715 | 715 | ||
716 | if (device->cap._BCL && device->cap._BCM && device->cap._BQC && max_level > 0){ | 716 | if (device->cap._BCL && device->cap._BCM && max_level > 0) { |
717 | int result; | 717 | int result; |
718 | static int count = 0; | 718 | static int count = 0; |
719 | char *name; | 719 | char *name; |
@@ -1201,7 +1201,7 @@ static int acpi_video_bus_ROM_seq_show(struct seq_file *seq, void *offset) | |||
1201 | if (!video) | 1201 | if (!video) |
1202 | goto end; | 1202 | goto end; |
1203 | 1203 | ||
1204 | printk(KERN_INFO PREFIX "Please implement %s\n", __FUNCTION__); | 1204 | printk(KERN_INFO PREFIX "Please implement %s\n", __func__); |
1205 | seq_printf(seq, "<TODO>\n"); | 1205 | seq_printf(seq, "<TODO>\n"); |
1206 | 1206 | ||
1207 | end: | 1207 | end: |
diff --git a/drivers/acpi/wmi.c b/drivers/acpi/wmi.c index efacc9f8bfe3..c33b1c6e93b1 100644 --- a/drivers/acpi/wmi.c +++ b/drivers/acpi/wmi.c | |||
@@ -293,7 +293,7 @@ struct acpi_buffer *out) | |||
293 | { | 293 | { |
294 | struct guid_block *block = NULL; | 294 | struct guid_block *block = NULL; |
295 | struct wmi_block *wblock = NULL; | 295 | struct wmi_block *wblock = NULL; |
296 | acpi_handle handle; | 296 | acpi_handle handle, wc_handle; |
297 | acpi_status status, wc_status = AE_ERROR; | 297 | acpi_status status, wc_status = AE_ERROR; |
298 | struct acpi_object_list input, wc_input; | 298 | struct acpi_object_list input, wc_input; |
299 | union acpi_object wc_params[1], wq_params[1]; | 299 | union acpi_object wc_params[1], wq_params[1]; |
@@ -338,8 +338,10 @@ struct acpi_buffer *out) | |||
338 | * expensive, but have no corresponding WCxx method. So we | 338 | * expensive, but have no corresponding WCxx method. So we |
339 | * should not fail if this happens. | 339 | * should not fail if this happens. |
340 | */ | 340 | */ |
341 | wc_status = acpi_evaluate_object(handle, wc_method, | 341 | wc_status = acpi_get_handle(handle, wc_method, &wc_handle); |
342 | &wc_input, NULL); | 342 | if (ACPI_SUCCESS(wc_status)) |
343 | wc_status = acpi_evaluate_object(handle, wc_method, | ||
344 | &wc_input, NULL); | ||
343 | } | 345 | } |
344 | 346 | ||
345 | strcpy(method, "WQ"); | 347 | strcpy(method, "WQ"); |
@@ -351,7 +353,7 @@ struct acpi_buffer *out) | |||
351 | * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if | 353 | * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if |
352 | * the WQxx method failed - we should disable collection anyway. | 354 | * the WQxx method failed - we should disable collection anyway. |
353 | */ | 355 | */ |
354 | if ((block->flags & ACPI_WMI_EXPENSIVE) && wc_status) { | 356 | if ((block->flags & ACPI_WMI_EXPENSIVE) && ACPI_SUCCESS(wc_status)) { |
355 | wc_params[0].integer.value = 0; | 357 | wc_params[0].integer.value = 0; |
356 | status = acpi_evaluate_object(handle, | 358 | status = acpi_evaluate_object(handle, |
357 | wc_method, &wc_input, NULL); | 359 | wc_method, &wc_input, NULL); |
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index ba8f7f4dfa11..e469647330de 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -538,6 +538,15 @@ config PATA_RADISYS | |||
538 | 538 | ||
539 | If unsure, say N. | 539 | If unsure, say N. |
540 | 540 | ||
541 | config PATA_RB500 | ||
542 | tristate "RouterBoard 500 PATA CompactFlash support" | ||
543 | depends on MIKROTIK_RB500 | ||
544 | help | ||
545 | This option enables support for the RouterBoard 500 | ||
546 | PATA CompactFlash controller. | ||
547 | |||
548 | If unsure, say N. | ||
549 | |||
541 | config PATA_RZ1000 | 550 | config PATA_RZ1000 |
542 | tristate "PC Tech RZ1000 PATA support" | 551 | tristate "PC Tech RZ1000 PATA support" |
543 | depends on PCI | 552 | depends on PCI |
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile index 701651e37c89..0511e6f0bb58 100644 --- a/drivers/ata/Makefile +++ b/drivers/ata/Makefile | |||
@@ -55,6 +55,7 @@ obj-$(CONFIG_PATA_PDC2027X) += pata_pdc2027x.o | |||
55 | obj-$(CONFIG_PATA_PDC_OLD) += pata_pdc202xx_old.o | 55 | obj-$(CONFIG_PATA_PDC_OLD) += pata_pdc202xx_old.o |
56 | obj-$(CONFIG_PATA_QDI) += pata_qdi.o | 56 | obj-$(CONFIG_PATA_QDI) += pata_qdi.o |
57 | obj-$(CONFIG_PATA_RADISYS) += pata_radisys.o | 57 | obj-$(CONFIG_PATA_RADISYS) += pata_radisys.o |
58 | obj-$(CONFIG_PATA_RB500) += pata_rb500_cf.o | ||
58 | obj-$(CONFIG_PATA_RZ1000) += pata_rz1000.o | 59 | obj-$(CONFIG_PATA_RZ1000) += pata_rz1000.o |
59 | obj-$(CONFIG_PATA_SC1200) += pata_sc1200.o | 60 | obj-$(CONFIG_PATA_SC1200) += pata_sc1200.o |
60 | obj-$(CONFIG_PATA_SERVERWORKS) += pata_serverworks.o | 61 | obj-$(CONFIG_PATA_SERVERWORKS) += pata_serverworks.o |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 1db93b619074..17ee6ed985d9 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -49,6 +49,10 @@ | |||
49 | #define DRV_NAME "ahci" | 49 | #define DRV_NAME "ahci" |
50 | #define DRV_VERSION "3.0" | 50 | #define DRV_VERSION "3.0" |
51 | 51 | ||
52 | static int ahci_skip_host_reset; | ||
53 | module_param_named(skip_host_reset, ahci_skip_host_reset, int, 0444); | ||
54 | MODULE_PARM_DESC(skip_host_reset, "skip global host reset (0=don't skip, 1=skip)"); | ||
55 | |||
52 | static int ahci_enable_alpm(struct ata_port *ap, | 56 | static int ahci_enable_alpm(struct ata_port *ap, |
53 | enum link_pm policy); | 57 | enum link_pm policy); |
54 | static void ahci_disable_alpm(struct ata_port *ap); | 58 | static void ahci_disable_alpm(struct ata_port *ap); |
@@ -186,6 +190,7 @@ enum { | |||
186 | AHCI_HFLAG_NO_MSI = (1 << 5), /* no PCI MSI */ | 190 | AHCI_HFLAG_NO_MSI = (1 << 5), /* no PCI MSI */ |
187 | AHCI_HFLAG_NO_PMP = (1 << 6), /* no PMP */ | 191 | AHCI_HFLAG_NO_PMP = (1 << 6), /* no PMP */ |
188 | AHCI_HFLAG_NO_HOTPLUG = (1 << 7), /* ignore PxSERR.DIAG.N */ | 192 | AHCI_HFLAG_NO_HOTPLUG = (1 << 7), /* ignore PxSERR.DIAG.N */ |
193 | AHCI_HFLAG_SECT255 = (1 << 8), /* max 255 sectors */ | ||
189 | 194 | ||
190 | /* ap->flags bits */ | 195 | /* ap->flags bits */ |
191 | 196 | ||
@@ -255,6 +260,7 @@ static void ahci_vt8251_error_handler(struct ata_port *ap); | |||
255 | static void ahci_p5wdh_error_handler(struct ata_port *ap); | 260 | static void ahci_p5wdh_error_handler(struct ata_port *ap); |
256 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); | 261 | static void ahci_post_internal_cmd(struct ata_queued_cmd *qc); |
257 | static int ahci_port_resume(struct ata_port *ap); | 262 | static int ahci_port_resume(struct ata_port *ap); |
263 | static void ahci_dev_config(struct ata_device *dev); | ||
258 | static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl); | 264 | static unsigned int ahci_fill_sg(struct ata_queued_cmd *qc, void *cmd_tbl); |
259 | static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, | 265 | static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, |
260 | u32 opts); | 266 | u32 opts); |
@@ -294,6 +300,8 @@ static const struct ata_port_operations ahci_ops = { | |||
294 | .check_altstatus = ahci_check_status, | 300 | .check_altstatus = ahci_check_status, |
295 | .dev_select = ata_noop_dev_select, | 301 | .dev_select = ata_noop_dev_select, |
296 | 302 | ||
303 | .dev_config = ahci_dev_config, | ||
304 | |||
297 | .tf_read = ahci_tf_read, | 305 | .tf_read = ahci_tf_read, |
298 | 306 | ||
299 | .qc_defer = sata_pmp_qc_defer_cmd_switch, | 307 | .qc_defer = sata_pmp_qc_defer_cmd_switch, |
@@ -425,7 +433,7 @@ static const struct ata_port_info ahci_port_info[] = { | |||
425 | /* board_ahci_sb600 */ | 433 | /* board_ahci_sb600 */ |
426 | { | 434 | { |
427 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | | 435 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | |
428 | AHCI_HFLAG_32BIT_ONLY | AHCI_HFLAG_NO_PMP), | 436 | AHCI_HFLAG_SECT255 | AHCI_HFLAG_NO_PMP), |
429 | .flags = AHCI_FLAG_COMMON, | 437 | .flags = AHCI_FLAG_COMMON, |
430 | .link_flags = AHCI_LFLAG_COMMON, | 438 | .link_flags = AHCI_LFLAG_COMMON, |
431 | .pio_mask = 0x1f, /* pio0-4 */ | 439 | .pio_mask = 0x1f, /* pio0-4 */ |
@@ -563,6 +571,18 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
563 | { PCI_VDEVICE(NVIDIA, 0x0abd), board_ahci }, /* MCP79 */ | 571 | { PCI_VDEVICE(NVIDIA, 0x0abd), board_ahci }, /* MCP79 */ |
564 | { PCI_VDEVICE(NVIDIA, 0x0abe), board_ahci }, /* MCP79 */ | 572 | { PCI_VDEVICE(NVIDIA, 0x0abe), board_ahci }, /* MCP79 */ |
565 | { PCI_VDEVICE(NVIDIA, 0x0abf), board_ahci }, /* MCP79 */ | 573 | { PCI_VDEVICE(NVIDIA, 0x0abf), board_ahci }, /* MCP79 */ |
574 | { PCI_VDEVICE(NVIDIA, 0x0bc8), board_ahci }, /* MCP7B */ | ||
575 | { PCI_VDEVICE(NVIDIA, 0x0bc9), board_ahci }, /* MCP7B */ | ||
576 | { PCI_VDEVICE(NVIDIA, 0x0bca), board_ahci }, /* MCP7B */ | ||
577 | { PCI_VDEVICE(NVIDIA, 0x0bcb), board_ahci }, /* MCP7B */ | ||
578 | { PCI_VDEVICE(NVIDIA, 0x0bcc), board_ahci }, /* MCP7B */ | ||
579 | { PCI_VDEVICE(NVIDIA, 0x0bcd), board_ahci }, /* MCP7B */ | ||
580 | { PCI_VDEVICE(NVIDIA, 0x0bce), board_ahci }, /* MCP7B */ | ||
581 | { PCI_VDEVICE(NVIDIA, 0x0bcf), board_ahci }, /* MCP7B */ | ||
582 | { PCI_VDEVICE(NVIDIA, 0x0bd0), board_ahci }, /* MCP7B */ | ||
583 | { PCI_VDEVICE(NVIDIA, 0x0bd1), board_ahci }, /* MCP7B */ | ||
584 | { PCI_VDEVICE(NVIDIA, 0x0bd2), board_ahci }, /* MCP7B */ | ||
585 | { PCI_VDEVICE(NVIDIA, 0x0bd3), board_ahci }, /* MCP7B */ | ||
566 | 586 | ||
567 | /* SiS */ | 587 | /* SiS */ |
568 | { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */ | 588 | { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */ |
@@ -571,6 +591,7 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
571 | 591 | ||
572 | /* Marvell */ | 592 | /* Marvell */ |
573 | { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */ | 593 | { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */ |
594 | { PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv }, /* 6121 */ | ||
574 | 595 | ||
575 | /* Generic, PCI class code for AHCI */ | 596 | /* Generic, PCI class code for AHCI */ |
576 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 597 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
@@ -645,6 +666,7 @@ static void ahci_save_initial_config(struct pci_dev *pdev, | |||
645 | void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR]; | 666 | void __iomem *mmio = pcim_iomap_table(pdev)[AHCI_PCI_BAR]; |
646 | u32 cap, port_map; | 667 | u32 cap, port_map; |
647 | int i; | 668 | int i; |
669 | int mv; | ||
648 | 670 | ||
649 | /* make sure AHCI mode is enabled before accessing CAP */ | 671 | /* make sure AHCI mode is enabled before accessing CAP */ |
650 | ahci_enable_ahci(mmio); | 672 | ahci_enable_ahci(mmio); |
@@ -668,7 +690,7 @@ static void ahci_save_initial_config(struct pci_dev *pdev, | |||
668 | cap &= ~HOST_CAP_NCQ; | 690 | cap &= ~HOST_CAP_NCQ; |
669 | } | 691 | } |
670 | 692 | ||
671 | if ((cap && HOST_CAP_PMP) && (hpriv->flags & AHCI_HFLAG_NO_PMP)) { | 693 | if ((cap & HOST_CAP_PMP) && (hpriv->flags & AHCI_HFLAG_NO_PMP)) { |
672 | dev_printk(KERN_INFO, &pdev->dev, | 694 | dev_printk(KERN_INFO, &pdev->dev, |
673 | "controller can't do PMP, turning off CAP_PMP\n"); | 695 | "controller can't do PMP, turning off CAP_PMP\n"); |
674 | cap &= ~HOST_CAP_PMP; | 696 | cap &= ~HOST_CAP_PMP; |
@@ -680,12 +702,16 @@ static void ahci_save_initial_config(struct pci_dev *pdev, | |||
680 | * presence register, as bit 4 (counting from 0) | 702 | * presence register, as bit 4 (counting from 0) |
681 | */ | 703 | */ |
682 | if (hpriv->flags & AHCI_HFLAG_MV_PATA) { | 704 | if (hpriv->flags & AHCI_HFLAG_MV_PATA) { |
705 | if (pdev->device == 0x6121) | ||
706 | mv = 0x3; | ||
707 | else | ||
708 | mv = 0xf; | ||
683 | dev_printk(KERN_ERR, &pdev->dev, | 709 | dev_printk(KERN_ERR, &pdev->dev, |
684 | "MV_AHCI HACK: port_map %x -> %x\n", | 710 | "MV_AHCI HACK: port_map %x -> %x\n", |
685 | hpriv->port_map, | 711 | port_map, |
686 | hpriv->port_map & 0xf); | 712 | port_map & mv); |
687 | 713 | ||
688 | port_map &= 0xf; | 714 | port_map &= mv; |
689 | } | 715 | } |
690 | 716 | ||
691 | /* cross check port_map and cap.n_ports */ | 717 | /* cross check port_map and cap.n_ports */ |
@@ -1072,29 +1098,35 @@ static int ahci_reset_controller(struct ata_host *host) | |||
1072 | ahci_enable_ahci(mmio); | 1098 | ahci_enable_ahci(mmio); |
1073 | 1099 | ||
1074 | /* global controller reset */ | 1100 | /* global controller reset */ |
1075 | tmp = readl(mmio + HOST_CTL); | 1101 | if (!ahci_skip_host_reset) { |
1076 | if ((tmp & HOST_RESET) == 0) { | 1102 | tmp = readl(mmio + HOST_CTL); |
1077 | writel(tmp | HOST_RESET, mmio + HOST_CTL); | 1103 | if ((tmp & HOST_RESET) == 0) { |
1078 | readl(mmio + HOST_CTL); /* flush */ | 1104 | writel(tmp | HOST_RESET, mmio + HOST_CTL); |
1079 | } | 1105 | readl(mmio + HOST_CTL); /* flush */ |
1106 | } | ||
1080 | 1107 | ||
1081 | /* reset must complete within 1 second, or | 1108 | /* reset must complete within 1 second, or |
1082 | * the hardware should be considered fried. | 1109 | * the hardware should be considered fried. |
1083 | */ | 1110 | */ |
1084 | ssleep(1); | 1111 | ssleep(1); |
1085 | 1112 | ||
1086 | tmp = readl(mmio + HOST_CTL); | 1113 | tmp = readl(mmio + HOST_CTL); |
1087 | if (tmp & HOST_RESET) { | 1114 | if (tmp & HOST_RESET) { |
1088 | dev_printk(KERN_ERR, host->dev, | 1115 | dev_printk(KERN_ERR, host->dev, |
1089 | "controller reset failed (0x%x)\n", tmp); | 1116 | "controller reset failed (0x%x)\n", tmp); |
1090 | return -EIO; | 1117 | return -EIO; |
1091 | } | 1118 | } |
1092 | 1119 | ||
1093 | /* turn on AHCI mode */ | 1120 | /* turn on AHCI mode */ |
1094 | ahci_enable_ahci(mmio); | 1121 | ahci_enable_ahci(mmio); |
1095 | 1122 | ||
1096 | /* some registers might be cleared on reset. restore initial values */ | 1123 | /* Some registers might be cleared on reset. Restore |
1097 | ahci_restore_initial_config(host); | 1124 | * initial values. |
1125 | */ | ||
1126 | ahci_restore_initial_config(host); | ||
1127 | } else | ||
1128 | dev_printk(KERN_INFO, host->dev, | ||
1129 | "skipping global host reset\n"); | ||
1098 | 1130 | ||
1099 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) { | 1131 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) { |
1100 | u16 tmp16; | 1132 | u16 tmp16; |
@@ -1146,9 +1178,14 @@ static void ahci_init_controller(struct ata_host *host) | |||
1146 | int i; | 1178 | int i; |
1147 | void __iomem *port_mmio; | 1179 | void __iomem *port_mmio; |
1148 | u32 tmp; | 1180 | u32 tmp; |
1181 | int mv; | ||
1149 | 1182 | ||
1150 | if (hpriv->flags & AHCI_HFLAG_MV_PATA) { | 1183 | if (hpriv->flags & AHCI_HFLAG_MV_PATA) { |
1151 | port_mmio = __ahci_port_base(host, 4); | 1184 | if (pdev->device == 0x6121) |
1185 | mv = 2; | ||
1186 | else | ||
1187 | mv = 4; | ||
1188 | port_mmio = __ahci_port_base(host, mv); | ||
1152 | 1189 | ||
1153 | writel(0, port_mmio + PORT_IRQ_MASK); | 1190 | writel(0, port_mmio + PORT_IRQ_MASK); |
1154 | 1191 | ||
@@ -1176,6 +1213,14 @@ static void ahci_init_controller(struct ata_host *host) | |||
1176 | VPRINTK("HOST_CTL 0x%x\n", tmp); | 1213 | VPRINTK("HOST_CTL 0x%x\n", tmp); |
1177 | } | 1214 | } |
1178 | 1215 | ||
1216 | static void ahci_dev_config(struct ata_device *dev) | ||
1217 | { | ||
1218 | struct ahci_host_priv *hpriv = dev->link->ap->host->private_data; | ||
1219 | |||
1220 | if (hpriv->flags & AHCI_HFLAG_SECT255) | ||
1221 | dev->max_sectors = 255; | ||
1222 | } | ||
1223 | |||
1179 | static unsigned int ahci_dev_classify(struct ata_port *ap) | 1224 | static unsigned int ahci_dev_classify(struct ata_port *ap) |
1180 | { | 1225 | { |
1181 | void __iomem *port_mmio = ahci_port_base(ap); | 1226 | void __iomem *port_mmio = ahci_port_base(ap); |
@@ -2217,7 +2262,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2217 | if (rc) | 2262 | if (rc) |
2218 | return rc; | 2263 | return rc; |
2219 | 2264 | ||
2220 | rc = pcim_iomap_regions(pdev, 1 << AHCI_PCI_BAR, DRV_NAME); | 2265 | /* AHCI controllers often implement SFF compatible interface. |
2266 | * Grab all PCI BARs just in case. | ||
2267 | */ | ||
2268 | rc = pcim_iomap_regions_request_all(pdev, 1 << AHCI_PCI_BAR, DRV_NAME); | ||
2221 | if (rc == -EBUSY) | 2269 | if (rc == -EBUSY) |
2222 | pcim_pin_device(pdev); | 2270 | pcim_pin_device(pdev); |
2223 | if (rc) | 2271 | if (rc) |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 9e8ec19260af..bf98a566adac 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
@@ -118,45 +118,77 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap) | |||
118 | ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; | 118 | ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; |
119 | } | 119 | } |
120 | 120 | ||
121 | static void ata_acpi_handle_hotplug(struct ata_port *ap, struct kobject *kobj, | 121 | static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev, |
122 | u32 event) | 122 | u32 event) |
123 | { | 123 | { |
124 | char event_string[12]; | 124 | char event_string[12]; |
125 | char *envp[] = { event_string, NULL }; | 125 | char *envp[] = { event_string, NULL }; |
126 | struct ata_eh_info *ehi = &ap->link.eh_info; | 126 | struct ata_eh_info *ehi; |
127 | 127 | struct kobject *kobj = NULL; | |
128 | if (event == 0 || event == 1) { | 128 | int wait = 0; |
129 | unsigned long flags; | 129 | unsigned long flags; |
130 | spin_lock_irqsave(ap->lock, flags); | 130 | |
131 | ata_ehi_clear_desc(ehi); | 131 | if (!ap) |
132 | ata_ehi_push_desc(ehi, "ACPI event"); | 132 | ap = dev->link->ap; |
133 | ata_ehi_hotplugged(ehi); | 133 | ehi = &ap->link.eh_info; |
134 | ata_port_freeze(ap); | 134 | |
135 | spin_unlock_irqrestore(ap->lock, flags); | 135 | spin_lock_irqsave(ap->lock, flags); |
136 | |||
137 | switch (event) { | ||
138 | case ACPI_NOTIFY_BUS_CHECK: | ||
139 | case ACPI_NOTIFY_DEVICE_CHECK: | ||
140 | ata_ehi_push_desc(ehi, "ACPI event"); | ||
141 | ata_ehi_hotplugged(ehi); | ||
142 | ata_port_freeze(ap); | ||
143 | break; | ||
144 | |||
145 | case ACPI_NOTIFY_EJECT_REQUEST: | ||
146 | ata_ehi_push_desc(ehi, "ACPI event"); | ||
147 | if (dev) | ||
148 | dev->flags |= ATA_DFLAG_DETACH; | ||
149 | else { | ||
150 | struct ata_link *tlink; | ||
151 | struct ata_device *tdev; | ||
152 | |||
153 | ata_port_for_each_link(tlink, ap) | ||
154 | ata_link_for_each_dev(tdev, tlink) | ||
155 | tdev->flags |= ATA_DFLAG_DETACH; | ||
156 | } | ||
157 | |||
158 | ata_port_schedule_eh(ap); | ||
159 | wait = 1; | ||
160 | break; | ||
136 | } | 161 | } |
137 | 162 | ||
163 | if (dev) { | ||
164 | if (dev->sdev) | ||
165 | kobj = &dev->sdev->sdev_gendev.kobj; | ||
166 | } else | ||
167 | kobj = &ap->dev->kobj; | ||
168 | |||
138 | if (kobj) { | 169 | if (kobj) { |
139 | sprintf(event_string, "BAY_EVENT=%d", event); | 170 | sprintf(event_string, "BAY_EVENT=%d", event); |
140 | kobject_uevent_env(kobj, KOBJ_CHANGE, envp); | 171 | kobject_uevent_env(kobj, KOBJ_CHANGE, envp); |
141 | } | 172 | } |
173 | |||
174 | spin_unlock_irqrestore(ap->lock, flags); | ||
175 | |||
176 | if (wait) | ||
177 | ata_port_wait_eh(ap); | ||
142 | } | 178 | } |
143 | 179 | ||
144 | static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data) | 180 | static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data) |
145 | { | 181 | { |
146 | struct ata_device *dev = data; | 182 | struct ata_device *dev = data; |
147 | struct kobject *kobj = NULL; | ||
148 | 183 | ||
149 | if (dev->sdev) | 184 | ata_acpi_handle_hotplug(NULL, dev, event); |
150 | kobj = &dev->sdev->sdev_gendev.kobj; | ||
151 | |||
152 | ata_acpi_handle_hotplug(dev->link->ap, kobj, event); | ||
153 | } | 185 | } |
154 | 186 | ||
155 | static void ata_acpi_ap_notify(acpi_handle handle, u32 event, void *data) | 187 | static void ata_acpi_ap_notify(acpi_handle handle, u32 event, void *data) |
156 | { | 188 | { |
157 | struct ata_port *ap = data; | 189 | struct ata_port *ap = data; |
158 | 190 | ||
159 | ata_acpi_handle_hotplug(ap, &ap->dev->kobj, event); | 191 | ata_acpi_handle_hotplug(ap, NULL, event); |
160 | } | 192 | } |
161 | 193 | ||
162 | /** | 194 | /** |
@@ -191,20 +223,30 @@ void ata_acpi_associate(struct ata_host *host) | |||
191 | else | 223 | else |
192 | ata_acpi_associate_ide_port(ap); | 224 | ata_acpi_associate_ide_port(ap); |
193 | 225 | ||
194 | if (ap->acpi_handle) | 226 | if (ap->acpi_handle) { |
195 | acpi_install_notify_handler (ap->acpi_handle, | 227 | acpi_install_notify_handler(ap->acpi_handle, |
196 | ACPI_SYSTEM_NOTIFY, | 228 | ACPI_SYSTEM_NOTIFY, |
197 | ata_acpi_ap_notify, | 229 | ata_acpi_ap_notify, ap); |
198 | ap); | 230 | #if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE) |
231 | /* we might be on a docking station */ | ||
232 | register_hotplug_dock_device(ap->acpi_handle, | ||
233 | ata_acpi_ap_notify, ap); | ||
234 | #endif | ||
235 | } | ||
199 | 236 | ||
200 | for (j = 0; j < ata_link_max_devices(&ap->link); j++) { | 237 | for (j = 0; j < ata_link_max_devices(&ap->link); j++) { |
201 | struct ata_device *dev = &ap->link.device[j]; | 238 | struct ata_device *dev = &ap->link.device[j]; |
202 | 239 | ||
203 | if (dev->acpi_handle) | 240 | if (dev->acpi_handle) { |
204 | acpi_install_notify_handler (dev->acpi_handle, | 241 | acpi_install_notify_handler(dev->acpi_handle, |
205 | ACPI_SYSTEM_NOTIFY, | 242 | ACPI_SYSTEM_NOTIFY, |
206 | ata_acpi_dev_notify, | 243 | ata_acpi_dev_notify, dev); |
207 | dev); | 244 | #if defined(CONFIG_ACPI_DOCK) || defined(CONFIG_ACPI_DOCK_MODULE) |
245 | /* we might be on a docking station */ | ||
246 | register_hotplug_dock_device(dev->acpi_handle, | ||
247 | ata_acpi_dev_notify, dev); | ||
248 | #endif | ||
249 | } | ||
208 | } | 250 | } |
209 | } | 251 | } |
210 | } | 252 | } |
@@ -382,7 +424,7 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf) | |||
382 | 424 | ||
383 | if (ata_msg_probe(ap)) | 425 | if (ata_msg_probe(ap)) |
384 | ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER: port#: %d\n", | 426 | ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER: port#: %d\n", |
385 | __FUNCTION__, ap->port_no); | 427 | __func__, ap->port_no); |
386 | 428 | ||
387 | /* _GTF has no input parameters */ | 429 | /* _GTF has no input parameters */ |
388 | status = acpi_evaluate_object(dev->acpi_handle, "_GTF", NULL, &output); | 430 | status = acpi_evaluate_object(dev->acpi_handle, "_GTF", NULL, &output); |
@@ -402,7 +444,7 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf) | |||
402 | if (ata_msg_probe(ap)) | 444 | if (ata_msg_probe(ap)) |
403 | ata_dev_printk(dev, KERN_DEBUG, "%s: Run _GTF: " | 445 | ata_dev_printk(dev, KERN_DEBUG, "%s: Run _GTF: " |
404 | "length or ptr is NULL (0x%llx, 0x%p)\n", | 446 | "length or ptr is NULL (0x%llx, 0x%p)\n", |
405 | __FUNCTION__, | 447 | __func__, |
406 | (unsigned long long)output.length, | 448 | (unsigned long long)output.length, |
407 | output.pointer); | 449 | output.pointer); |
408 | rc = -EINVAL; | 450 | rc = -EINVAL; |
@@ -432,7 +474,7 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf) | |||
432 | if (ata_msg_probe(ap)) | 474 | if (ata_msg_probe(ap)) |
433 | ata_dev_printk(dev, KERN_DEBUG, | 475 | ata_dev_printk(dev, KERN_DEBUG, |
434 | "%s: returning gtf=%p, gtf_count=%d\n", | 476 | "%s: returning gtf=%p, gtf_count=%d\n", |
435 | __FUNCTION__, *gtf, rc); | 477 | __func__, *gtf, rc); |
436 | } | 478 | } |
437 | return rc; | 479 | return rc; |
438 | 480 | ||
@@ -725,7 +767,7 @@ static int ata_acpi_push_id(struct ata_device *dev) | |||
725 | 767 | ||
726 | if (ata_msg_probe(ap)) | 768 | if (ata_msg_probe(ap)) |
727 | ata_dev_printk(dev, KERN_DEBUG, "%s: ix = %d, port#: %d\n", | 769 | ata_dev_printk(dev, KERN_DEBUG, "%s: ix = %d, port#: %d\n", |
728 | __FUNCTION__, dev->devno, ap->port_no); | 770 | __func__, dev->devno, ap->port_no); |
729 | 771 | ||
730 | /* Give the drive Identify data to the drive via the _SDD method */ | 772 | /* Give the drive Identify data to the drive via the _SDD method */ |
731 | /* _SDD: set up input parameters */ | 773 | /* _SDD: set up input parameters */ |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index fbc24358ada0..4bbe31f98ef8 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -106,14 +106,15 @@ static struct ata_force_ent *ata_force_tbl; | |||
106 | static int ata_force_tbl_size; | 106 | static int ata_force_tbl_size; |
107 | 107 | ||
108 | static char ata_force_param_buf[PAGE_SIZE] __initdata; | 108 | static char ata_force_param_buf[PAGE_SIZE] __initdata; |
109 | module_param_string(force, ata_force_param_buf, sizeof(ata_force_param_buf), 0444); | 109 | /* param_buf is thrown away after initialization, disallow read */ |
110 | module_param_string(force, ata_force_param_buf, sizeof(ata_force_param_buf), 0); | ||
110 | MODULE_PARM_DESC(force, "Force ATA configurations including cable type, link speed and transfer mode (see Documentation/kernel-parameters.txt for details)"); | 111 | MODULE_PARM_DESC(force, "Force ATA configurations including cable type, link speed and transfer mode (see Documentation/kernel-parameters.txt for details)"); |
111 | 112 | ||
112 | int atapi_enabled = 1; | 113 | int atapi_enabled = 1; |
113 | module_param(atapi_enabled, int, 0444); | 114 | module_param(atapi_enabled, int, 0444); |
114 | MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)"); | 115 | MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)"); |
115 | 116 | ||
116 | int atapi_dmadir = 0; | 117 | static int atapi_dmadir = 0; |
117 | module_param(atapi_dmadir, int, 0444); | 118 | module_param(atapi_dmadir, int, 0444); |
118 | MODULE_PARM_DESC(atapi_dmadir, "Enable ATAPI DMADIR bridge support (0=off, 1=on)"); | 119 | MODULE_PARM_DESC(atapi_dmadir, "Enable ATAPI DMADIR bridge support (0=off, 1=on)"); |
119 | 120 | ||
@@ -1719,7 +1720,7 @@ void ata_port_flush_task(struct ata_port *ap) | |||
1719 | cancel_rearming_delayed_work(&ap->port_task); | 1720 | cancel_rearming_delayed_work(&ap->port_task); |
1720 | 1721 | ||
1721 | if (ata_msg_ctl(ap)) | 1722 | if (ata_msg_ctl(ap)) |
1722 | ata_port_printk(ap, KERN_DEBUG, "%s: EXIT\n", __FUNCTION__); | 1723 | ata_port_printk(ap, KERN_DEBUG, "%s: EXIT\n", __func__); |
1723 | } | 1724 | } |
1724 | 1725 | ||
1725 | static void ata_qc_complete_internal(struct ata_queued_cmd *qc) | 1726 | static void ata_qc_complete_internal(struct ata_queued_cmd *qc) |
@@ -2056,7 +2057,7 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class, | |||
2056 | int rc; | 2057 | int rc; |
2057 | 2058 | ||
2058 | if (ata_msg_ctl(ap)) | 2059 | if (ata_msg_ctl(ap)) |
2059 | ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER\n", __FUNCTION__); | 2060 | ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER\n", __func__); |
2060 | 2061 | ||
2061 | ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */ | 2062 | ata_dev_select(ap, dev->devno, 1, 1); /* select device 0/1 */ |
2062 | retry: | 2063 | retry: |
@@ -2253,12 +2254,12 @@ int ata_dev_configure(struct ata_device *dev) | |||
2253 | 2254 | ||
2254 | if (!ata_dev_enabled(dev) && ata_msg_info(ap)) { | 2255 | if (!ata_dev_enabled(dev) && ata_msg_info(ap)) { |
2255 | ata_dev_printk(dev, KERN_INFO, "%s: ENTER/EXIT -- nodev\n", | 2256 | ata_dev_printk(dev, KERN_INFO, "%s: ENTER/EXIT -- nodev\n", |
2256 | __FUNCTION__); | 2257 | __func__); |
2257 | return 0; | 2258 | return 0; |
2258 | } | 2259 | } |
2259 | 2260 | ||
2260 | if (ata_msg_probe(ap)) | 2261 | if (ata_msg_probe(ap)) |
2261 | ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER\n", __FUNCTION__); | 2262 | ata_dev_printk(dev, KERN_DEBUG, "%s: ENTER\n", __func__); |
2262 | 2263 | ||
2263 | /* set horkage */ | 2264 | /* set horkage */ |
2264 | dev->horkage |= ata_dev_blacklisted(dev); | 2265 | dev->horkage |= ata_dev_blacklisted(dev); |
@@ -2279,7 +2280,7 @@ int ata_dev_configure(struct ata_device *dev) | |||
2279 | ata_dev_printk(dev, KERN_DEBUG, | 2280 | ata_dev_printk(dev, KERN_DEBUG, |
2280 | "%s: cfg 49:%04x 82:%04x 83:%04x 84:%04x " | 2281 | "%s: cfg 49:%04x 82:%04x 83:%04x 84:%04x " |
2281 | "85:%04x 86:%04x 87:%04x 88:%04x\n", | 2282 | "85:%04x 86:%04x 87:%04x 88:%04x\n", |
2282 | __FUNCTION__, | 2283 | __func__, |
2283 | id[49], id[82], id[83], id[84], | 2284 | id[49], id[82], id[83], id[84], |
2284 | id[85], id[86], id[87], id[88]); | 2285 | id[85], id[86], id[87], id[88]); |
2285 | 2286 | ||
@@ -2511,13 +2512,13 @@ int ata_dev_configure(struct ata_device *dev) | |||
2511 | 2512 | ||
2512 | if (ata_msg_probe(ap)) | 2513 | if (ata_msg_probe(ap)) |
2513 | ata_dev_printk(dev, KERN_DEBUG, "%s: EXIT, drv_stat = 0x%x\n", | 2514 | ata_dev_printk(dev, KERN_DEBUG, "%s: EXIT, drv_stat = 0x%x\n", |
2514 | __FUNCTION__, ata_chk_status(ap)); | 2515 | __func__, ata_chk_status(ap)); |
2515 | return 0; | 2516 | return 0; |
2516 | 2517 | ||
2517 | err_out_nosup: | 2518 | err_out_nosup: |
2518 | if (ata_msg_probe(ap)) | 2519 | if (ata_msg_probe(ap)) |
2519 | ata_dev_printk(dev, KERN_DEBUG, | 2520 | ata_dev_printk(dev, KERN_DEBUG, |
2520 | "%s: EXIT, err\n", __FUNCTION__); | 2521 | "%s: EXIT, err\n", __func__); |
2521 | return rc; | 2522 | return rc; |
2522 | } | 2523 | } |
2523 | 2524 | ||
@@ -6567,6 +6568,8 @@ int ata_host_suspend(struct ata_host *host, pm_message_t mesg) | |||
6567 | ata_lpm_enable(host); | 6568 | ata_lpm_enable(host); |
6568 | 6569 | ||
6569 | rc = ata_host_request_pm(host, mesg, 0, ATA_EHI_QUIET, 1); | 6570 | rc = ata_host_request_pm(host, mesg, 0, ATA_EHI_QUIET, 1); |
6571 | if (rc == 0) | ||
6572 | host->dev->power.power_state = mesg; | ||
6570 | return rc; | 6573 | return rc; |
6571 | } | 6574 | } |
6572 | 6575 | ||
@@ -6585,6 +6588,7 @@ void ata_host_resume(struct ata_host *host) | |||
6585 | { | 6588 | { |
6586 | ata_host_request_pm(host, PMSG_ON, ATA_EH_SOFTRESET, | 6589 | ata_host_request_pm(host, PMSG_ON, ATA_EH_SOFTRESET, |
6587 | ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, 0); | 6590 | ATA_EHI_NO_AUTOPSY | ATA_EHI_QUIET, 0); |
6591 | host->dev->power.power_state = PMSG_ON; | ||
6588 | 6592 | ||
6589 | /* reenable link pm */ | 6593 | /* reenable link pm */ |
6590 | ata_lpm_disable(host); | 6594 | ata_lpm_disable(host); |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 698ce2cea52c..681252fd8143 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -2150,6 +2150,15 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
2150 | ap->ops->set_piomode(ap, dev); | 2150 | ap->ops->set_piomode(ap, dev); |
2151 | } | 2151 | } |
2152 | 2152 | ||
2153 | if (!softreset && !hardreset) { | ||
2154 | if (verbose) | ||
2155 | ata_link_printk(link, KERN_INFO, "no reset method " | ||
2156 | "available, skipping reset\n"); | ||
2157 | if (!(lflags & ATA_LFLAG_ASSUME_CLASS)) | ||
2158 | lflags |= ATA_LFLAG_ASSUME_ATA; | ||
2159 | goto done; | ||
2160 | } | ||
2161 | |||
2153 | /* Determine which reset to use and record in ehc->i.action. | 2162 | /* Determine which reset to use and record in ehc->i.action. |
2154 | * prereset() may examine and modify it. | 2163 | * prereset() may examine and modify it. |
2155 | */ | 2164 | */ |
@@ -2254,6 +2263,7 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
2254 | lflags |= ATA_LFLAG_ASSUME_ATA; | 2263 | lflags |= ATA_LFLAG_ASSUME_ATA; |
2255 | } | 2264 | } |
2256 | 2265 | ||
2266 | done: | ||
2257 | ata_link_for_each_dev(dev, link) { | 2267 | ata_link_for_each_dev(dev, link) { |
2258 | /* After the reset, the device state is PIO 0 and the | 2268 | /* After the reset, the device state is PIO 0 and the |
2259 | * controller state is undefined. Reset also wakes up | 2269 | * controller state is undefined. Reset also wakes up |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 0562b0a49f3b..8f0e8f2bc628 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -862,9 +862,10 @@ static int ata_scsi_dev_config(struct scsi_device *sdev, | |||
862 | struct request_queue *q = sdev->request_queue; | 862 | struct request_queue *q = sdev->request_queue; |
863 | void *buf; | 863 | void *buf; |
864 | 864 | ||
865 | /* set the min alignment */ | 865 | /* set the min alignment and padding */ |
866 | blk_queue_update_dma_alignment(sdev->request_queue, | 866 | blk_queue_update_dma_alignment(sdev->request_queue, |
867 | ATA_DMA_PAD_SZ - 1); | 867 | ATA_DMA_PAD_SZ - 1); |
868 | blk_queue_dma_pad(sdev->request_queue, ATA_DMA_PAD_SZ - 1); | ||
868 | 869 | ||
869 | /* configure draining */ | 870 | /* configure draining */ |
870 | buf = kmalloc(ATAPI_MAX_DRAIN, q->bounce_gfp | GFP_KERNEL); | 871 | buf = kmalloc(ATAPI_MAX_DRAIN, q->bounce_gfp | GFP_KERNEL); |
@@ -1694,12 +1695,17 @@ void ata_scsi_rbuf_fill(struct ata_scsi_args *args, | |||
1694 | u8 *rbuf; | 1695 | u8 *rbuf; |
1695 | unsigned int buflen, rc; | 1696 | unsigned int buflen, rc; |
1696 | struct scsi_cmnd *cmd = args->cmd; | 1697 | struct scsi_cmnd *cmd = args->cmd; |
1698 | unsigned long flags; | ||
1699 | |||
1700 | local_irq_save(flags); | ||
1697 | 1701 | ||
1698 | buflen = ata_scsi_rbuf_get(cmd, &rbuf); | 1702 | buflen = ata_scsi_rbuf_get(cmd, &rbuf); |
1699 | memset(rbuf, 0, buflen); | 1703 | memset(rbuf, 0, buflen); |
1700 | rc = actor(args, rbuf, buflen); | 1704 | rc = actor(args, rbuf, buflen); |
1701 | ata_scsi_rbuf_put(cmd, rbuf); | 1705 | ata_scsi_rbuf_put(cmd, rbuf); |
1702 | 1706 | ||
1707 | local_irq_restore(flags); | ||
1708 | |||
1703 | if (rc == 0) | 1709 | if (rc == 0) |
1704 | cmd->result = SAM_STAT_GOOD; | 1710 | cmd->result = SAM_STAT_GOOD; |
1705 | args->done(cmd); | 1711 | args->done(cmd); |
@@ -2473,6 +2479,9 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc) | |||
2473 | if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) { | 2479 | if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) { |
2474 | u8 *buf = NULL; | 2480 | u8 *buf = NULL; |
2475 | unsigned int buflen; | 2481 | unsigned int buflen; |
2482 | unsigned long flags; | ||
2483 | |||
2484 | local_irq_save(flags); | ||
2476 | 2485 | ||
2477 | buflen = ata_scsi_rbuf_get(cmd, &buf); | 2486 | buflen = ata_scsi_rbuf_get(cmd, &buf); |
2478 | 2487 | ||
@@ -2490,6 +2499,8 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc) | |||
2490 | } | 2499 | } |
2491 | 2500 | ||
2492 | ata_scsi_rbuf_put(cmd, buf); | 2501 | ata_scsi_rbuf_put(cmd, buf); |
2502 | |||
2503 | local_irq_restore(flags); | ||
2493 | } | 2504 | } |
2494 | 2505 | ||
2495 | cmd->result = SAM_STAT_GOOD; | 2506 | cmd->result = SAM_STAT_GOOD; |
@@ -2528,7 +2539,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
2528 | } | 2539 | } |
2529 | 2540 | ||
2530 | qc->tf.command = ATA_CMD_PACKET; | 2541 | qc->tf.command = ATA_CMD_PACKET; |
2531 | qc->nbytes = scsi_bufflen(scmd); | 2542 | qc->nbytes = scsi_bufflen(scmd) + scmd->request->extra_len; |
2532 | 2543 | ||
2533 | /* check whether ATAPI DMA is safe */ | 2544 | /* check whether ATAPI DMA is safe */ |
2534 | if (!using_pio && ata_check_atapi_dma(qc)) | 2545 | if (!using_pio && ata_check_atapi_dma(qc)) |
@@ -2539,7 +2550,7 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
2539 | * want to set it properly, and for DMA where it is | 2550 | * want to set it properly, and for DMA where it is |
2540 | * effectively meaningless. | 2551 | * effectively meaningless. |
2541 | */ | 2552 | */ |
2542 | nbytes = min(scmd->request->raw_data_len, (unsigned int)63 * 1024); | 2553 | nbytes = min(scmd->request->data_len, (unsigned int)63 * 1024); |
2543 | 2554 | ||
2544 | /* Most ATAPI devices which honor transfer chunk size don't | 2555 | /* Most ATAPI devices which honor transfer chunk size don't |
2545 | * behave according to the spec when odd chunk size which | 2556 | * behave according to the spec when odd chunk size which |
@@ -2865,7 +2876,7 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc) | |||
2865 | * TODO: find out if we need to do more here to | 2876 | * TODO: find out if we need to do more here to |
2866 | * cover scatter/gather case. | 2877 | * cover scatter/gather case. |
2867 | */ | 2878 | */ |
2868 | qc->nbytes = scsi_bufflen(scmd); | 2879 | qc->nbytes = scsi_bufflen(scmd) + scmd->request->extra_len; |
2869 | 2880 | ||
2870 | /* request result TF and be quiet about device error */ | 2881 | /* request result TF and be quiet about device error */ |
2871 | qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET; | 2882 | qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET; |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 60cd4b179766..20dc572fb45a 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -56,7 +56,8 @@ u8 ata_irq_on(struct ata_port *ap) | |||
56 | ap->ctl &= ~ATA_NIEN; | 56 | ap->ctl &= ~ATA_NIEN; |
57 | ap->last_ctl = ap->ctl; | 57 | ap->last_ctl = ap->ctl; |
58 | 58 | ||
59 | iowrite8(ap->ctl, ioaddr->ctl_addr); | 59 | if (ioaddr->ctl_addr) |
60 | iowrite8(ap->ctl, ioaddr->ctl_addr); | ||
60 | tmp = ata_wait_idle(ap); | 61 | tmp = ata_wait_idle(ap); |
61 | 62 | ||
62 | ap->ops->irq_clear(ap); | 63 | ap->ops->irq_clear(ap); |
@@ -81,12 +82,14 @@ void ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) | |||
81 | unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR; | 82 | unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR; |
82 | 83 | ||
83 | if (tf->ctl != ap->last_ctl) { | 84 | if (tf->ctl != ap->last_ctl) { |
84 | iowrite8(tf->ctl, ioaddr->ctl_addr); | 85 | if (ioaddr->ctl_addr) |
86 | iowrite8(tf->ctl, ioaddr->ctl_addr); | ||
85 | ap->last_ctl = tf->ctl; | 87 | ap->last_ctl = tf->ctl; |
86 | ata_wait_idle(ap); | 88 | ata_wait_idle(ap); |
87 | } | 89 | } |
88 | 90 | ||
89 | if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { | 91 | if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { |
92 | WARN_ON(!ioaddr->ctl_addr); | ||
90 | iowrite8(tf->hob_feature, ioaddr->feature_addr); | 93 | iowrite8(tf->hob_feature, ioaddr->feature_addr); |
91 | iowrite8(tf->hob_nsect, ioaddr->nsect_addr); | 94 | iowrite8(tf->hob_nsect, ioaddr->nsect_addr); |
92 | iowrite8(tf->hob_lbal, ioaddr->lbal_addr); | 95 | iowrite8(tf->hob_lbal, ioaddr->lbal_addr); |
@@ -167,14 +170,17 @@ void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf) | |||
167 | tf->device = ioread8(ioaddr->device_addr); | 170 | tf->device = ioread8(ioaddr->device_addr); |
168 | 171 | ||
169 | if (tf->flags & ATA_TFLAG_LBA48) { | 172 | if (tf->flags & ATA_TFLAG_LBA48) { |
170 | iowrite8(tf->ctl | ATA_HOB, ioaddr->ctl_addr); | 173 | if (likely(ioaddr->ctl_addr)) { |
171 | tf->hob_feature = ioread8(ioaddr->error_addr); | 174 | iowrite8(tf->ctl | ATA_HOB, ioaddr->ctl_addr); |
172 | tf->hob_nsect = ioread8(ioaddr->nsect_addr); | 175 | tf->hob_feature = ioread8(ioaddr->error_addr); |
173 | tf->hob_lbal = ioread8(ioaddr->lbal_addr); | 176 | tf->hob_nsect = ioread8(ioaddr->nsect_addr); |
174 | tf->hob_lbam = ioread8(ioaddr->lbam_addr); | 177 | tf->hob_lbal = ioread8(ioaddr->lbal_addr); |
175 | tf->hob_lbah = ioread8(ioaddr->lbah_addr); | 178 | tf->hob_lbam = ioread8(ioaddr->lbam_addr); |
176 | iowrite8(tf->ctl, ioaddr->ctl_addr); | 179 | tf->hob_lbah = ioread8(ioaddr->lbah_addr); |
177 | ap->last_ctl = tf->ctl; | 180 | iowrite8(tf->ctl, ioaddr->ctl_addr); |
181 | ap->last_ctl = tf->ctl; | ||
182 | } else | ||
183 | WARN_ON(1); | ||
178 | } | 184 | } |
179 | } | 185 | } |
180 | 186 | ||
@@ -352,7 +358,8 @@ void ata_bmdma_freeze(struct ata_port *ap) | |||
352 | ap->ctl |= ATA_NIEN; | 358 | ap->ctl |= ATA_NIEN; |
353 | ap->last_ctl = ap->ctl; | 359 | ap->last_ctl = ap->ctl; |
354 | 360 | ||
355 | iowrite8(ap->ctl, ioaddr->ctl_addr); | 361 | if (ioaddr->ctl_addr) |
362 | iowrite8(ap->ctl, ioaddr->ctl_addr); | ||
356 | 363 | ||
357 | /* Under certain circumstances, some controllers raise IRQ on | 364 | /* Under certain circumstances, some controllers raise IRQ on |
358 | * ATA_NIEN manipulation. Also, many controllers fail to mask | 365 | * ATA_NIEN manipulation. Also, many controllers fail to mask |
@@ -459,13 +466,14 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
459 | */ | 466 | */ |
460 | void ata_bmdma_error_handler(struct ata_port *ap) | 467 | void ata_bmdma_error_handler(struct ata_port *ap) |
461 | { | 468 | { |
462 | ata_reset_fn_t hardreset; | 469 | ata_reset_fn_t softreset = NULL, hardreset = NULL; |
463 | 470 | ||
464 | hardreset = NULL; | 471 | if (ap->ioaddr.ctl_addr) |
472 | softreset = ata_std_softreset; | ||
465 | if (sata_scr_valid(&ap->link)) | 473 | if (sata_scr_valid(&ap->link)) |
466 | hardreset = sata_std_hardreset; | 474 | hardreset = sata_std_hardreset; |
467 | 475 | ||
468 | ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, hardreset, | 476 | ata_bmdma_drive_eh(ap, ata_std_prereset, softreset, hardreset, |
469 | ata_std_postreset); | 477 | ata_std_postreset); |
470 | } | 478 | } |
471 | 479 | ||
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index 6036dedfe377..aa884f71a12a 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
@@ -56,7 +56,6 @@ enum { | |||
56 | extern unsigned int ata_print_id; | 56 | extern unsigned int ata_print_id; |
57 | extern struct workqueue_struct *ata_aux_wq; | 57 | extern struct workqueue_struct *ata_aux_wq; |
58 | extern int atapi_enabled; | 58 | extern int atapi_enabled; |
59 | extern int atapi_dmadir; | ||
60 | extern int atapi_passthru16; | 59 | extern int atapi_passthru16; |
61 | extern int libata_fua; | 60 | extern int libata_fua; |
62 | extern int libata_noacpi; | 61 | extern int libata_noacpi; |
diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c index 7e68edf3c0f3..8786455c901d 100644 --- a/drivers/ata/pata_ali.c +++ b/drivers/ata/pata_ali.c | |||
@@ -295,7 +295,7 @@ static void ali_lock_sectors(struct ata_device *adev) | |||
295 | static int ali_check_atapi_dma(struct ata_queued_cmd *qc) | 295 | static int ali_check_atapi_dma(struct ata_queued_cmd *qc) |
296 | { | 296 | { |
297 | /* If its not a media command, its not worth it */ | 297 | /* If its not a media command, its not worth it */ |
298 | if (qc->nbytes < 2048) | 298 | if (atapi_cmd_type(qc->cdb[0]) == ATAPI_MISC) |
299 | return -EOPNOTSUPP; | 299 | return -EOPNOTSUPP; |
300 | return 0; | 300 | return 0; |
301 | } | 301 | } |
diff --git a/drivers/ata/pata_hpt366.c b/drivers/ata/pata_hpt366.c index 0713872cf65c..a742efa0da2b 100644 --- a/drivers/ata/pata_hpt366.c +++ b/drivers/ata/pata_hpt366.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <linux/libata.h> | 27 | #include <linux/libata.h> |
28 | 28 | ||
29 | #define DRV_NAME "pata_hpt366" | 29 | #define DRV_NAME "pata_hpt366" |
30 | #define DRV_VERSION "0.6.1" | 30 | #define DRV_VERSION "0.6.2" |
31 | 31 | ||
32 | struct hpt_clock { | 32 | struct hpt_clock { |
33 | u8 xfer_speed; | 33 | u8 xfer_speed; |
@@ -180,9 +180,9 @@ static unsigned long hpt366_filter(struct ata_device *adev, unsigned long mask) | |||
180 | if (hpt_dma_blacklisted(adev, "UDMA", bad_ata33)) | 180 | if (hpt_dma_blacklisted(adev, "UDMA", bad_ata33)) |
181 | mask &= ~ATA_MASK_UDMA; | 181 | mask &= ~ATA_MASK_UDMA; |
182 | if (hpt_dma_blacklisted(adev, "UDMA3", bad_ata66_3)) | 182 | if (hpt_dma_blacklisted(adev, "UDMA3", bad_ata66_3)) |
183 | mask &= ~(0x07 << ATA_SHIFT_UDMA); | 183 | mask &= ~(0xF8 << ATA_SHIFT_UDMA); |
184 | if (hpt_dma_blacklisted(adev, "UDMA4", bad_ata66_4)) | 184 | if (hpt_dma_blacklisted(adev, "UDMA4", bad_ata66_4)) |
185 | mask &= ~(0x0F << ATA_SHIFT_UDMA); | 185 | mask &= ~(0xF0 << ATA_SHIFT_UDMA); |
186 | } | 186 | } |
187 | return ata_pci_default_filter(adev, mask); | 187 | return ata_pci_default_filter(adev, mask); |
188 | } | 188 | } |
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c index 68eb34929cec..9a10878b2ad8 100644 --- a/drivers/ata/pata_hpt37x.c +++ b/drivers/ata/pata_hpt37x.c | |||
@@ -24,7 +24,7 @@ | |||
24 | #include <linux/libata.h> | 24 | #include <linux/libata.h> |
25 | 25 | ||
26 | #define DRV_NAME "pata_hpt37x" | 26 | #define DRV_NAME "pata_hpt37x" |
27 | #define DRV_VERSION "0.6.9" | 27 | #define DRV_VERSION "0.6.11" |
28 | 28 | ||
29 | struct hpt_clock { | 29 | struct hpt_clock { |
30 | u8 xfer_speed; | 30 | u8 xfer_speed; |
@@ -281,7 +281,7 @@ static unsigned long hpt370_filter(struct ata_device *adev, unsigned long mask) | |||
281 | if (hpt_dma_blacklisted(adev, "UDMA", bad_ata33)) | 281 | if (hpt_dma_blacklisted(adev, "UDMA", bad_ata33)) |
282 | mask &= ~ATA_MASK_UDMA; | 282 | mask &= ~ATA_MASK_UDMA; |
283 | if (hpt_dma_blacklisted(adev, "UDMA100", bad_ata100_5)) | 283 | if (hpt_dma_blacklisted(adev, "UDMA100", bad_ata100_5)) |
284 | mask &= ~(0x1F << ATA_SHIFT_UDMA); | 284 | mask &= ~(0xE0 << ATA_SHIFT_UDMA); |
285 | } | 285 | } |
286 | return ata_pci_default_filter(adev, mask); | 286 | return ata_pci_default_filter(adev, mask); |
287 | } | 287 | } |
@@ -297,7 +297,7 @@ static unsigned long hpt370a_filter(struct ata_device *adev, unsigned long mask) | |||
297 | { | 297 | { |
298 | if (adev->class == ATA_DEV_ATA) { | 298 | if (adev->class == ATA_DEV_ATA) { |
299 | if (hpt_dma_blacklisted(adev, "UDMA100", bad_ata100_5)) | 299 | if (hpt_dma_blacklisted(adev, "UDMA100", bad_ata100_5)) |
300 | mask &= ~ (0x1F << ATA_SHIFT_UDMA); | 300 | mask &= ~(0xE0 << ATA_SHIFT_UDMA); |
301 | } | 301 | } |
302 | return ata_pci_default_filter(adev, mask); | 302 | return ata_pci_default_filter(adev, mask); |
303 | } | 303 | } |
diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c index 028af5dbeed6..511c89b9bae8 100644 --- a/drivers/ata/pata_pdc2027x.c +++ b/drivers/ata/pata_pdc2027x.c | |||
@@ -39,7 +39,7 @@ | |||
39 | #undef PDC_DEBUG | 39 | #undef PDC_DEBUG |
40 | 40 | ||
41 | #ifdef PDC_DEBUG | 41 | #ifdef PDC_DEBUG |
42 | #define PDPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ## args) | 42 | #define PDPRINTK(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ## args) |
43 | #else | 43 | #else |
44 | #define PDPRINTK(fmt, args...) | 44 | #define PDPRINTK(fmt, args...) |
45 | #endif | 45 | #endif |
diff --git a/drivers/ata/pata_rb500_cf.c b/drivers/ata/pata_rb500_cf.c new file mode 100644 index 000000000000..4ce9b03fe6c8 --- /dev/null +++ b/drivers/ata/pata_rb500_cf.c | |||
@@ -0,0 +1,314 @@ | |||
1 | /* | ||
2 | * A low-level PATA driver to handle a Compact Flash connected on the | ||
3 | * Mikrotik's RouterBoard 532 board. | ||
4 | * | ||
5 | * Copyright (C) 2007 Gabor Juhos <juhosg at openwrt.org> | ||
6 | * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org> | ||
7 | * | ||
8 | * This file was based on: drivers/ata/pata_ixp4xx_cf.c | ||
9 | * Copyright (C) 2006-07 Tower Technologies | ||
10 | * Author: Alessandro Zummo <a.zummo@towertech.it> | ||
11 | * | ||
12 | * Also was based on the driver for Linux 2.4.xx published by Mikrotik for | ||
13 | * their RouterBoard 1xx and 5xx series devices. The original Mikrotik code | ||
14 | * seems not to have a license. | ||
15 | * | ||
16 | * This program is free software; you can redistribute it and/or modify | ||
17 | * it under the terms of the GNU General Public License version 2 as | ||
18 | * published by the Free Software Foundation. | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/platform_device.h> | ||
25 | |||
26 | #include <linux/io.h> | ||
27 | #include <linux/interrupt.h> | ||
28 | #include <linux/irq.h> | ||
29 | |||
30 | #include <linux/libata.h> | ||
31 | #include <scsi/scsi_host.h> | ||
32 | |||
33 | #include <asm/gpio.h> | ||
34 | |||
35 | #define DRV_NAME "pata-rb500-cf" | ||
36 | #define DRV_VERSION "0.1.0" | ||
37 | #define DRV_DESC "PATA driver for RouterBOARD 532 Compact Flash" | ||
38 | |||
39 | #define RB500_CF_MAXPORTS 1 | ||
40 | #define RB500_CF_IO_DELAY 400 | ||
41 | |||
42 | #define RB500_CF_REG_CMD 0x0800 | ||
43 | #define RB500_CF_REG_CTRL 0x080E | ||
44 | #define RB500_CF_REG_DATA 0x0C00 | ||
45 | |||
46 | struct rb500_cf_info { | ||
47 | void __iomem *iobase; | ||
48 | unsigned int gpio_line; | ||
49 | int frozen; | ||
50 | unsigned int irq; | ||
51 | }; | ||
52 | |||
53 | /* ------------------------------------------------------------------------ */ | ||
54 | |||
55 | static inline void rb500_pata_finish_io(struct ata_port *ap) | ||
56 | { | ||
57 | struct ata_host *ah = ap->host; | ||
58 | struct rb500_cf_info *info = ah->private_data; | ||
59 | |||
60 | ata_altstatus(ap); | ||
61 | ndelay(RB500_CF_IO_DELAY); | ||
62 | |||
63 | set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH); | ||
64 | } | ||
65 | |||
66 | static void rb500_pata_exec_command(struct ata_port *ap, | ||
67 | const struct ata_taskfile *tf) | ||
68 | { | ||
69 | writeb(tf->command, ap->ioaddr.command_addr); | ||
70 | rb500_pata_finish_io(ap); | ||
71 | } | ||
72 | |||
73 | static void rb500_pata_data_xfer(struct ata_device *adev, unsigned char *buf, | ||
74 | unsigned int buflen, int write_data) | ||
75 | { | ||
76 | struct ata_port *ap = adev->link->ap; | ||
77 | void __iomem *ioaddr = ap->ioaddr.data_addr; | ||
78 | |||
79 | if (write_data) { | ||
80 | for (; buflen > 0; buflen--, buf++) | ||
81 | writeb(*buf, ioaddr); | ||
82 | } else { | ||
83 | for (; buflen > 0; buflen--, buf++) | ||
84 | *buf = readb(ioaddr); | ||
85 | } | ||
86 | |||
87 | rb500_pata_finish_io(adev->link->ap); | ||
88 | } | ||
89 | |||
90 | static void rb500_pata_freeze(struct ata_port *ap) | ||
91 | { | ||
92 | struct rb500_cf_info *info = ap->host->private_data; | ||
93 | |||
94 | info->frozen = 1; | ||
95 | } | ||
96 | |||
97 | static void rb500_pata_thaw(struct ata_port *ap) | ||
98 | { | ||
99 | struct rb500_cf_info *info = ap->host->private_data; | ||
100 | |||
101 | info->frozen = 0; | ||
102 | } | ||
103 | |||
104 | static irqreturn_t rb500_pata_irq_handler(int irq, void *dev_instance) | ||
105 | { | ||
106 | struct ata_host *ah = dev_instance; | ||
107 | struct rb500_cf_info *info = ah->private_data; | ||
108 | |||
109 | if (gpio_get_value(info->gpio_line)) { | ||
110 | set_irq_type(info->irq, IRQ_TYPE_LEVEL_LOW); | ||
111 | if (!info->frozen) | ||
112 | ata_interrupt(info->irq, dev_instance); | ||
113 | } else { | ||
114 | set_irq_type(info->irq, IRQ_TYPE_LEVEL_HIGH); | ||
115 | } | ||
116 | |||
117 | return IRQ_HANDLED; | ||
118 | } | ||
119 | |||
120 | static void rb500_pata_irq_clear(struct ata_port *ap) | ||
121 | { | ||
122 | } | ||
123 | |||
124 | static int rb500_pata_port_start(struct ata_port *ap) | ||
125 | { | ||
126 | return 0; | ||
127 | } | ||
128 | |||
129 | static struct ata_port_operations rb500_pata_port_ops = { | ||
130 | .tf_load = ata_tf_load, | ||
131 | .tf_read = ata_tf_read, | ||
132 | |||
133 | .exec_command = rb500_pata_exec_command, | ||
134 | .check_status = ata_check_status, | ||
135 | .dev_select = ata_std_dev_select, | ||
136 | |||
137 | .data_xfer = rb500_pata_data_xfer, | ||
138 | |||
139 | .qc_prep = ata_qc_prep, | ||
140 | .qc_issue = ata_qc_issue_prot, | ||
141 | |||
142 | .freeze = rb500_pata_freeze, | ||
143 | .thaw = rb500_pata_thaw, | ||
144 | .error_handler = ata_bmdma_error_handler, | ||
145 | |||
146 | .irq_handler = rb500_pata_irq_handler, | ||
147 | .irq_clear = rb500_pata_irq_clear, | ||
148 | .irq_on = ata_irq_on, | ||
149 | |||
150 | .port_start = rb500_pata_port_start, | ||
151 | }; | ||
152 | |||
153 | /* ------------------------------------------------------------------------ */ | ||
154 | |||
155 | static struct scsi_host_template rb500_pata_sht = { | ||
156 | .module = THIS_MODULE, | ||
157 | .name = DRV_NAME, | ||
158 | .ioctl = ata_scsi_ioctl, | ||
159 | .queuecommand = ata_scsi_queuecmd, | ||
160 | .slave_configure = ata_scsi_slave_config, | ||
161 | .slave_destroy = ata_scsi_slave_destroy, | ||
162 | .bios_param = ata_std_bios_param, | ||
163 | .proc_name = DRV_NAME, | ||
164 | |||
165 | .can_queue = ATA_DEF_QUEUE, | ||
166 | .this_id = ATA_SHT_THIS_ID, | ||
167 | .sg_tablesize = LIBATA_MAX_PRD, | ||
168 | .dma_boundary = ATA_DMA_BOUNDARY, | ||
169 | .cmd_per_lun = ATA_SHT_CMD_PER_LUN, | ||
170 | .emulated = ATA_SHT_EMULATED, | ||
171 | .use_clustering = ATA_SHT_USE_CLUSTERING, | ||
172 | }; | ||
173 | |||
174 | /* ------------------------------------------------------------------------ */ | ||
175 | |||
176 | static void rb500_pata_setup_ports(struct ata_host *ah) | ||
177 | { | ||
178 | struct rb500_cf_info *info = ah->private_data; | ||
179 | struct ata_port *ap; | ||
180 | |||
181 | ap = ah->ports[0]; | ||
182 | |||
183 | ap->ops = &rb500_pata_port_ops; | ||
184 | ap->pio_mask = 0x1f; /* PIO4 */ | ||
185 | ap->flags = ATA_FLAG_NO_LEGACY | ATA_FLAG_MMIO; | ||
186 | |||
187 | ap->ioaddr.cmd_addr = info->iobase + RB500_CF_REG_CMD; | ||
188 | ap->ioaddr.ctl_addr = info->iobase + RB500_CF_REG_CTRL; | ||
189 | ap->ioaddr.altstatus_addr = info->iobase + RB500_CF_REG_CTRL; | ||
190 | |||
191 | ata_std_ports(&ap->ioaddr); | ||
192 | |||
193 | ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DATA; | ||
194 | } | ||
195 | |||
196 | static __devinit int rb500_pata_driver_probe(struct platform_device *pdev) | ||
197 | { | ||
198 | unsigned int irq; | ||
199 | int gpio; | ||
200 | struct resource *res; | ||
201 | struct ata_host *ah; | ||
202 | struct rb500_cf_info *info; | ||
203 | int ret; | ||
204 | |||
205 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
206 | if (!res) { | ||
207 | dev_err(&pdev->dev, "no IOMEM resource found\n"); | ||
208 | return -EINVAL; | ||
209 | } | ||
210 | |||
211 | irq = platform_get_irq(pdev, 0); | ||
212 | if (irq <= 0) { | ||
213 | dev_err(&pdev->dev, "no IRQ resource found\n"); | ||
214 | return -ENOENT; | ||
215 | } | ||
216 | |||
217 | gpio = irq_to_gpio(irq); | ||
218 | if (gpio < 0) { | ||
219 | dev_err(&pdev->dev, "no GPIO found for irq%d\n", irq); | ||
220 | return -ENOENT; | ||
221 | } | ||
222 | |||
223 | ret = gpio_request(gpio, DRV_NAME); | ||
224 | if (ret) { | ||
225 | dev_err(&pdev->dev, "GPIO request failed\n"); | ||
226 | return ret; | ||
227 | } | ||
228 | |||
229 | /* allocate host */ | ||
230 | ah = ata_host_alloc(&pdev->dev, RB500_CF_MAXPORTS); | ||
231 | if (!ah) | ||
232 | return -ENOMEM; | ||
233 | |||
234 | platform_set_drvdata(pdev, ah); | ||
235 | |||
236 | info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); | ||
237 | if (!info) | ||
238 | return -ENOMEM; | ||
239 | |||
240 | ah->private_data = info; | ||
241 | info->gpio_line = gpio; | ||
242 | info->irq = irq; | ||
243 | |||
244 | info->iobase = devm_ioremap_nocache(&pdev->dev, res->start, | ||
245 | res->end - res->start + 1); | ||
246 | if (!info->iobase) | ||
247 | return -ENOMEM; | ||
248 | |||
249 | ret = gpio_direction_input(gpio); | ||
250 | if (ret) { | ||
251 | dev_err(&pdev->dev, "unable to set GPIO direction, err=%d\n", | ||
252 | ret); | ||
253 | goto err_free_gpio; | ||
254 | } | ||
255 | |||
256 | rb500_pata_setup_ports(ah); | ||
257 | |||
258 | ret = ata_host_activate(ah, irq, rb500_pata_irq_handler, | ||
259 | IRQF_TRIGGER_LOW, &rb500_pata_sht); | ||
260 | if (ret) | ||
261 | goto err_free_gpio; | ||
262 | |||
263 | return 0; | ||
264 | |||
265 | err_free_gpio: | ||
266 | gpio_free(gpio); | ||
267 | |||
268 | return ret; | ||
269 | } | ||
270 | |||
271 | static __devexit int rb500_pata_driver_remove(struct platform_device *pdev) | ||
272 | { | ||
273 | struct ata_host *ah = platform_get_drvdata(pdev); | ||
274 | struct rb500_cf_info *info = ah->private_data; | ||
275 | |||
276 | ata_host_detach(ah); | ||
277 | gpio_free(info->gpio_line); | ||
278 | |||
279 | return 0; | ||
280 | } | ||
281 | |||
282 | static struct platform_driver rb500_pata_platform_driver = { | ||
283 | .probe = rb500_pata_driver_probe, | ||
284 | .remove = __devexit_p(rb500_pata_driver_remove), | ||
285 | .driver = { | ||
286 | .name = DRV_NAME, | ||
287 | .owner = THIS_MODULE, | ||
288 | }, | ||
289 | }; | ||
290 | |||
291 | /* ------------------------------------------------------------------------ */ | ||
292 | |||
293 | #define DRV_INFO DRV_DESC " version " DRV_VERSION | ||
294 | |||
295 | static int __init rb500_pata_module_init(void) | ||
296 | { | ||
297 | printk(KERN_INFO DRV_INFO "\n"); | ||
298 | |||
299 | return platform_driver_register(&rb500_pata_platform_driver); | ||
300 | } | ||
301 | |||
302 | static void __exit rb500_pata_module_exit(void) | ||
303 | { | ||
304 | platform_driver_unregister(&rb500_pata_platform_driver); | ||
305 | } | ||
306 | |||
307 | MODULE_AUTHOR("Gabor Juhos <juhosg at openwrt.org>"); | ||
308 | MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>"); | ||
309 | MODULE_DESCRIPTION(DRV_DESC); | ||
310 | MODULE_VERSION(DRV_VERSION); | ||
311 | MODULE_LICENSE("GPL"); | ||
312 | |||
313 | module_init(rb500_pata_module_init); | ||
314 | module_exit(rb500_pata_module_exit); | ||
diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c index 9c523fbf529e..a589c0fa0dbb 100644 --- a/drivers/ata/pata_serverworks.c +++ b/drivers/ata/pata_serverworks.c | |||
@@ -226,7 +226,7 @@ static unsigned long serverworks_csb_filter(struct ata_device *adev, unsigned lo | |||
226 | 226 | ||
227 | for (i = 0; (p = csb_bad_ata100[i]) != NULL; i++) { | 227 | for (i = 0; (p = csb_bad_ata100[i]) != NULL; i++) { |
228 | if (!strcmp(p, model_num)) | 228 | if (!strcmp(p, model_num)) |
229 | mask &= ~(0x1F << ATA_SHIFT_UDMA); | 229 | mask &= ~(0xE0 << ATA_SHIFT_UDMA); |
230 | } | 230 | } |
231 | return ata_pci_default_filter(adev, mask); | 231 | return ata_pci_default_filter(adev, mask); |
232 | } | 232 | } |
diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c index 69f651e0bc98..840d1c4a7850 100644 --- a/drivers/ata/sata_svw.c +++ b/drivers/ata/sata_svw.c | |||
@@ -45,6 +45,8 @@ | |||
45 | #include <linux/interrupt.h> | 45 | #include <linux/interrupt.h> |
46 | #include <linux/device.h> | 46 | #include <linux/device.h> |
47 | #include <scsi/scsi_host.h> | 47 | #include <scsi/scsi_host.h> |
48 | #include <scsi/scsi_cmnd.h> | ||
49 | #include <scsi/scsi.h> | ||
48 | #include <linux/libata.h> | 50 | #include <linux/libata.h> |
49 | 51 | ||
50 | #ifdef CONFIG_PPC_OF | 52 | #ifdef CONFIG_PPC_OF |
@@ -59,6 +61,7 @@ enum { | |||
59 | /* ap->flags bits */ | 61 | /* ap->flags bits */ |
60 | K2_FLAG_SATA_8_PORTS = (1 << 24), | 62 | K2_FLAG_SATA_8_PORTS = (1 << 24), |
61 | K2_FLAG_NO_ATAPI_DMA = (1 << 25), | 63 | K2_FLAG_NO_ATAPI_DMA = (1 << 25), |
64 | K2_FLAG_BAR_POS_3 = (1 << 26), | ||
62 | 65 | ||
63 | /* Taskfile registers offsets */ | 66 | /* Taskfile registers offsets */ |
64 | K2_SATA_TF_CMD_OFFSET = 0x00, | 67 | K2_SATA_TF_CMD_OFFSET = 0x00, |
@@ -88,8 +91,10 @@ enum { | |||
88 | /* Port stride */ | 91 | /* Port stride */ |
89 | K2_SATA_PORT_OFFSET = 0x100, | 92 | K2_SATA_PORT_OFFSET = 0x100, |
90 | 93 | ||
91 | board_svw4 = 0, | 94 | chip_svw4 = 0, |
92 | board_svw8 = 1, | 95 | chip_svw8 = 1, |
96 | chip_svw42 = 2, /* bar 3 */ | ||
97 | chip_svw43 = 3, /* bar 5 */ | ||
93 | }; | 98 | }; |
94 | 99 | ||
95 | static u8 k2_stat_check_status(struct ata_port *ap); | 100 | static u8 k2_stat_check_status(struct ata_port *ap); |
@@ -97,10 +102,25 @@ static u8 k2_stat_check_status(struct ata_port *ap); | |||
97 | 102 | ||
98 | static int k2_sata_check_atapi_dma(struct ata_queued_cmd *qc) | 103 | static int k2_sata_check_atapi_dma(struct ata_queued_cmd *qc) |
99 | { | 104 | { |
105 | u8 cmnd = qc->scsicmd->cmnd[0]; | ||
106 | |||
100 | if (qc->ap->flags & K2_FLAG_NO_ATAPI_DMA) | 107 | if (qc->ap->flags & K2_FLAG_NO_ATAPI_DMA) |
101 | return -1; /* ATAPI DMA not supported */ | 108 | return -1; /* ATAPI DMA not supported */ |
109 | else { | ||
110 | switch (cmnd) { | ||
111 | case READ_10: | ||
112 | case READ_12: | ||
113 | case READ_16: | ||
114 | case WRITE_10: | ||
115 | case WRITE_12: | ||
116 | case WRITE_16: | ||
117 | return 0; | ||
118 | |||
119 | default: | ||
120 | return -1; | ||
121 | } | ||
102 | 122 | ||
103 | return 0; | 123 | } |
104 | } | 124 | } |
105 | 125 | ||
106 | static int k2_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 126 | static int k2_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) |
@@ -354,7 +374,7 @@ static const struct ata_port_operations k2_sata_ops = { | |||
354 | }; | 374 | }; |
355 | 375 | ||
356 | static const struct ata_port_info k2_port_info[] = { | 376 | static const struct ata_port_info k2_port_info[] = { |
357 | /* board_svw4 */ | 377 | /* chip_svw4 */ |
358 | { | 378 | { |
359 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 379 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
360 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA, | 380 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA, |
@@ -363,7 +383,7 @@ static const struct ata_port_info k2_port_info[] = { | |||
363 | .udma_mask = ATA_UDMA6, | 383 | .udma_mask = ATA_UDMA6, |
364 | .port_ops = &k2_sata_ops, | 384 | .port_ops = &k2_sata_ops, |
365 | }, | 385 | }, |
366 | /* board_svw8 */ | 386 | /* chip_svw8 */ |
367 | { | 387 | { |
368 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 388 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
369 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA | | 389 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA | |
@@ -373,6 +393,24 @@ static const struct ata_port_info k2_port_info[] = { | |||
373 | .udma_mask = ATA_UDMA6, | 393 | .udma_mask = ATA_UDMA6, |
374 | .port_ops = &k2_sata_ops, | 394 | .port_ops = &k2_sata_ops, |
375 | }, | 395 | }, |
396 | /* chip_svw42 */ | ||
397 | { | ||
398 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
399 | ATA_FLAG_MMIO | K2_FLAG_BAR_POS_3, | ||
400 | .pio_mask = 0x1f, | ||
401 | .mwdma_mask = 0x07, | ||
402 | .udma_mask = ATA_UDMA6, | ||
403 | .port_ops = &k2_sata_ops, | ||
404 | }, | ||
405 | /* chip_svw43 */ | ||
406 | { | ||
407 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
408 | ATA_FLAG_MMIO, | ||
409 | .pio_mask = 0x1f, | ||
410 | .mwdma_mask = 0x07, | ||
411 | .udma_mask = ATA_UDMA6, | ||
412 | .port_ops = &k2_sata_ops, | ||
413 | }, | ||
376 | }; | 414 | }; |
377 | 415 | ||
378 | static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base) | 416 | static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base) |
@@ -402,7 +440,7 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en | |||
402 | { &k2_port_info[ent->driver_data], NULL }; | 440 | { &k2_port_info[ent->driver_data], NULL }; |
403 | struct ata_host *host; | 441 | struct ata_host *host; |
404 | void __iomem *mmio_base; | 442 | void __iomem *mmio_base; |
405 | int n_ports, i, rc; | 443 | int n_ports, i, rc, bar_pos; |
406 | 444 | ||
407 | if (!printed_version++) | 445 | if (!printed_version++) |
408 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); | 446 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); |
@@ -416,6 +454,9 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en | |||
416 | if (!host) | 454 | if (!host) |
417 | return -ENOMEM; | 455 | return -ENOMEM; |
418 | 456 | ||
457 | bar_pos = 5; | ||
458 | if (ppi[0]->flags & K2_FLAG_BAR_POS_3) | ||
459 | bar_pos = 3; | ||
419 | /* | 460 | /* |
420 | * If this driver happens to only be useful on Apple's K2, then | 461 | * If this driver happens to only be useful on Apple's K2, then |
421 | * we should check that here as it has a normal Serverworks ID | 462 | * we should check that here as it has a normal Serverworks ID |
@@ -428,17 +469,23 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en | |||
428 | * Check if we have resources mapped at all (second function may | 469 | * Check if we have resources mapped at all (second function may |
429 | * have been disabled by firmware) | 470 | * have been disabled by firmware) |
430 | */ | 471 | */ |
431 | if (pci_resource_len(pdev, 5) == 0) | 472 | if (pci_resource_len(pdev, bar_pos) == 0) { |
473 | /* In IDE mode we need to pin the device to ensure that | ||
474 | pcim_release does not clear the busmaster bit in config | ||
475 | space, clearing causes busmaster DMA to fail on | ||
476 | ports 3 & 4 */ | ||
477 | pcim_pin_device(pdev); | ||
432 | return -ENODEV; | 478 | return -ENODEV; |
479 | } | ||
433 | 480 | ||
434 | /* Request and iomap PCI regions */ | 481 | /* Request and iomap PCI regions */ |
435 | rc = pcim_iomap_regions(pdev, 1 << 5, DRV_NAME); | 482 | rc = pcim_iomap_regions(pdev, 1 << bar_pos, DRV_NAME); |
436 | if (rc == -EBUSY) | 483 | if (rc == -EBUSY) |
437 | pcim_pin_device(pdev); | 484 | pcim_pin_device(pdev); |
438 | if (rc) | 485 | if (rc) |
439 | return rc; | 486 | return rc; |
440 | host->iomap = pcim_iomap_table(pdev); | 487 | host->iomap = pcim_iomap_table(pdev); |
441 | mmio_base = host->iomap[5]; | 488 | mmio_base = host->iomap[bar_pos]; |
442 | 489 | ||
443 | /* different controllers have different number of ports - currently 4 or 8 */ | 490 | /* different controllers have different number of ports - currently 4 or 8 */ |
444 | /* All ports are on the same function. Multi-function device is no | 491 | /* All ports are on the same function. Multi-function device is no |
@@ -483,11 +530,13 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en | |||
483 | * controller | 530 | * controller |
484 | * */ | 531 | * */ |
485 | static const struct pci_device_id k2_sata_pci_tbl[] = { | 532 | static const struct pci_device_id k2_sata_pci_tbl[] = { |
486 | { PCI_VDEVICE(SERVERWORKS, 0x0240), board_svw4 }, | 533 | { PCI_VDEVICE(SERVERWORKS, 0x0240), chip_svw4 }, |
487 | { PCI_VDEVICE(SERVERWORKS, 0x0241), board_svw4 }, | 534 | { PCI_VDEVICE(SERVERWORKS, 0x0241), chip_svw4 }, |
488 | { PCI_VDEVICE(SERVERWORKS, 0x0242), board_svw8 }, | 535 | { PCI_VDEVICE(SERVERWORKS, 0x0242), chip_svw8 }, |
489 | { PCI_VDEVICE(SERVERWORKS, 0x024a), board_svw4 }, | 536 | { PCI_VDEVICE(SERVERWORKS, 0x024a), chip_svw4 }, |
490 | { PCI_VDEVICE(SERVERWORKS, 0x024b), board_svw4 }, | 537 | { PCI_VDEVICE(SERVERWORKS, 0x024b), chip_svw4 }, |
538 | { PCI_VDEVICE(SERVERWORKS, 0x0410), chip_svw42 }, | ||
539 | { PCI_VDEVICE(SERVERWORKS, 0x0411), chip_svw43 }, | ||
491 | 540 | ||
492 | { } | 541 | { } |
493 | }; | 542 | }; |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 9c0070b5bd3e..7de543d1d0b4 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -621,7 +621,8 @@ static struct kobject *get_device_parent(struct device *dev, | |||
621 | static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir) | 621 | static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir) |
622 | { | 622 | { |
623 | /* see if we live in a "glue" directory */ | 623 | /* see if we live in a "glue" directory */ |
624 | if (!dev->class || glue_dir->kset != &dev->class->class_dirs) | 624 | if (!glue_dir || !dev->class || |
625 | glue_dir->kset != &dev->class->class_dirs) | ||
625 | return; | 626 | return; |
626 | 627 | ||
627 | kobject_put(glue_dir); | 628 | kobject_put(glue_dir); |
@@ -770,17 +771,10 @@ int device_add(struct device *dev) | |||
770 | struct class_interface *class_intf; | 771 | struct class_interface *class_intf; |
771 | int error; | 772 | int error; |
772 | 773 | ||
773 | error = pm_sleep_lock(); | ||
774 | if (error) { | ||
775 | dev_warn(dev, "Suspicious %s during suspend\n", __FUNCTION__); | ||
776 | dump_stack(); | ||
777 | return error; | ||
778 | } | ||
779 | |||
780 | dev = get_device(dev); | 774 | dev = get_device(dev); |
781 | if (!dev || !strlen(dev->bus_id)) { | 775 | if (!dev || !strlen(dev->bus_id)) { |
782 | error = -EINVAL; | 776 | error = -EINVAL; |
783 | goto Error; | 777 | goto Done; |
784 | } | 778 | } |
785 | 779 | ||
786 | pr_debug("device: '%s': %s\n", dev->bus_id, __FUNCTION__); | 780 | pr_debug("device: '%s': %s\n", dev->bus_id, __FUNCTION__); |
@@ -843,11 +837,9 @@ int device_add(struct device *dev) | |||
843 | } | 837 | } |
844 | Done: | 838 | Done: |
845 | put_device(dev); | 839 | put_device(dev); |
846 | pm_sleep_unlock(); | ||
847 | return error; | 840 | return error; |
848 | BusError: | 841 | BusError: |
849 | device_pm_remove(dev); | 842 | device_pm_remove(dev); |
850 | dpm_sysfs_remove(dev); | ||
851 | PMError: | 843 | PMError: |
852 | if (dev->bus) | 844 | if (dev->bus) |
853 | blocking_notifier_call_chain(&dev->bus->p->bus_notifier, | 845 | blocking_notifier_call_chain(&dev->bus->p->bus_notifier, |
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index efaf282c438c..911ec600fe71 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -648,7 +648,7 @@ u64 dma_get_required_mask(struct device *dev) | |||
648 | high_totalram += high_totalram - 1; | 648 | high_totalram += high_totalram - 1; |
649 | mask = (((u64)high_totalram) << 32) + 0xffffffff; | 649 | mask = (((u64)high_totalram) << 32) + 0xffffffff; |
650 | } | 650 | } |
651 | return mask & *dev->dma_mask; | 651 | return mask; |
652 | } | 652 | } |
653 | EXPORT_SYMBOL_GPL(dma_get_required_mask); | 653 | EXPORT_SYMBOL_GPL(dma_get_required_mask); |
654 | #endif | 654 | #endif |
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index ee9d1c8db0d6..d887d5cb5bef 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
@@ -48,7 +48,6 @@ | |||
48 | */ | 48 | */ |
49 | 49 | ||
50 | LIST_HEAD(dpm_active); | 50 | LIST_HEAD(dpm_active); |
51 | static LIST_HEAD(dpm_locked); | ||
52 | static LIST_HEAD(dpm_off); | 51 | static LIST_HEAD(dpm_off); |
53 | static LIST_HEAD(dpm_off_irq); | 52 | static LIST_HEAD(dpm_off_irq); |
54 | static LIST_HEAD(dpm_destroy); | 53 | static LIST_HEAD(dpm_destroy); |
@@ -81,28 +80,6 @@ void device_pm_add(struct device *dev) | |||
81 | */ | 80 | */ |
82 | void device_pm_remove(struct device *dev) | 81 | void device_pm_remove(struct device *dev) |
83 | { | 82 | { |
84 | /* | ||
85 | * If this function is called during a suspend, it will be blocked, | ||
86 | * because we're holding the device's semaphore at that time, which may | ||
87 | * lead to a deadlock. In that case we want to print a warning. | ||
88 | * However, it may also be called by unregister_dropped_devices() with | ||
89 | * the device's semaphore released, in which case the warning should | ||
90 | * not be printed. | ||
91 | */ | ||
92 | if (down_trylock(&dev->sem)) { | ||
93 | if (down_read_trylock(&pm_sleep_rwsem)) { | ||
94 | /* No suspend in progress, wait on dev->sem */ | ||
95 | down(&dev->sem); | ||
96 | up_read(&pm_sleep_rwsem); | ||
97 | } else { | ||
98 | /* Suspend in progress, we may deadlock */ | ||
99 | dev_warn(dev, "Suspicious %s during suspend\n", | ||
100 | __FUNCTION__); | ||
101 | dump_stack(); | ||
102 | /* The user has been warned ... */ | ||
103 | down(&dev->sem); | ||
104 | } | ||
105 | } | ||
106 | pr_debug("PM: Removing info for %s:%s\n", | 83 | pr_debug("PM: Removing info for %s:%s\n", |
107 | dev->bus ? dev->bus->name : "No Bus", | 84 | dev->bus ? dev->bus->name : "No Bus", |
108 | kobject_name(&dev->kobj)); | 85 | kobject_name(&dev->kobj)); |
@@ -110,7 +87,6 @@ void device_pm_remove(struct device *dev) | |||
110 | dpm_sysfs_remove(dev); | 87 | dpm_sysfs_remove(dev); |
111 | list_del_init(&dev->power.entry); | 88 | list_del_init(&dev->power.entry); |
112 | mutex_unlock(&dpm_list_mtx); | 89 | mutex_unlock(&dpm_list_mtx); |
113 | up(&dev->sem); | ||
114 | } | 90 | } |
115 | 91 | ||
116 | /** | 92 | /** |
@@ -230,6 +206,8 @@ static int resume_device(struct device *dev) | |||
230 | TRACE_DEVICE(dev); | 206 | TRACE_DEVICE(dev); |
231 | TRACE_RESUME(0); | 207 | TRACE_RESUME(0); |
232 | 208 | ||
209 | down(&dev->sem); | ||
210 | |||
233 | if (dev->bus && dev->bus->resume) { | 211 | if (dev->bus && dev->bus->resume) { |
234 | dev_dbg(dev,"resuming\n"); | 212 | dev_dbg(dev,"resuming\n"); |
235 | error = dev->bus->resume(dev); | 213 | error = dev->bus->resume(dev); |
@@ -245,6 +223,8 @@ static int resume_device(struct device *dev) | |||
245 | error = dev->class->resume(dev); | 223 | error = dev->class->resume(dev); |
246 | } | 224 | } |
247 | 225 | ||
226 | up(&dev->sem); | ||
227 | |||
248 | TRACE_RESUME(error); | 228 | TRACE_RESUME(error); |
249 | return error; | 229 | return error; |
250 | } | 230 | } |
@@ -266,7 +246,7 @@ static void dpm_resume(void) | |||
266 | struct list_head *entry = dpm_off.next; | 246 | struct list_head *entry = dpm_off.next; |
267 | struct device *dev = to_device(entry); | 247 | struct device *dev = to_device(entry); |
268 | 248 | ||
269 | list_move_tail(entry, &dpm_locked); | 249 | list_move_tail(entry, &dpm_active); |
270 | mutex_unlock(&dpm_list_mtx); | 250 | mutex_unlock(&dpm_list_mtx); |
271 | resume_device(dev); | 251 | resume_device(dev); |
272 | mutex_lock(&dpm_list_mtx); | 252 | mutex_lock(&dpm_list_mtx); |
@@ -275,25 +255,6 @@ static void dpm_resume(void) | |||
275 | } | 255 | } |
276 | 256 | ||
277 | /** | 257 | /** |
278 | * unlock_all_devices - Release each device's semaphore | ||
279 | * | ||
280 | * Go through the dpm_off list. Put each device on the dpm_active | ||
281 | * list and unlock it. | ||
282 | */ | ||
283 | static void unlock_all_devices(void) | ||
284 | { | ||
285 | mutex_lock(&dpm_list_mtx); | ||
286 | while (!list_empty(&dpm_locked)) { | ||
287 | struct list_head *entry = dpm_locked.prev; | ||
288 | struct device *dev = to_device(entry); | ||
289 | |||
290 | list_move(entry, &dpm_active); | ||
291 | up(&dev->sem); | ||
292 | } | ||
293 | mutex_unlock(&dpm_list_mtx); | ||
294 | } | ||
295 | |||
296 | /** | ||
297 | * unregister_dropped_devices - Unregister devices scheduled for removal | 258 | * unregister_dropped_devices - Unregister devices scheduled for removal |
298 | * | 259 | * |
299 | * Unregister all devices on the dpm_destroy list. | 260 | * Unregister all devices on the dpm_destroy list. |
@@ -305,7 +266,6 @@ static void unregister_dropped_devices(void) | |||
305 | struct list_head *entry = dpm_destroy.next; | 266 | struct list_head *entry = dpm_destroy.next; |
306 | struct device *dev = to_device(entry); | 267 | struct device *dev = to_device(entry); |
307 | 268 | ||
308 | up(&dev->sem); | ||
309 | mutex_unlock(&dpm_list_mtx); | 269 | mutex_unlock(&dpm_list_mtx); |
310 | /* This also removes the device from the list */ | 270 | /* This also removes the device from the list */ |
311 | device_unregister(dev); | 271 | device_unregister(dev); |
@@ -324,7 +284,6 @@ void device_resume(void) | |||
324 | { | 284 | { |
325 | might_sleep(); | 285 | might_sleep(); |
326 | dpm_resume(); | 286 | dpm_resume(); |
327 | unlock_all_devices(); | ||
328 | unregister_dropped_devices(); | 287 | unregister_dropped_devices(); |
329 | up_write(&pm_sleep_rwsem); | 288 | up_write(&pm_sleep_rwsem); |
330 | } | 289 | } |
@@ -388,18 +347,15 @@ int device_power_down(pm_message_t state) | |||
388 | struct list_head *entry = dpm_off.prev; | 347 | struct list_head *entry = dpm_off.prev; |
389 | struct device *dev = to_device(entry); | 348 | struct device *dev = to_device(entry); |
390 | 349 | ||
391 | list_del_init(&dev->power.entry); | ||
392 | error = suspend_device_late(dev, state); | 350 | error = suspend_device_late(dev, state); |
393 | if (error) { | 351 | if (error) { |
394 | printk(KERN_ERR "Could not power down device %s: " | 352 | printk(KERN_ERR "Could not power down device %s: " |
395 | "error %d\n", | 353 | "error %d\n", |
396 | kobject_name(&dev->kobj), error); | 354 | kobject_name(&dev->kobj), error); |
397 | if (list_empty(&dev->power.entry)) | ||
398 | list_add(&dev->power.entry, &dpm_off); | ||
399 | break; | 355 | break; |
400 | } | 356 | } |
401 | if (list_empty(&dev->power.entry)) | 357 | if (!list_empty(&dev->power.entry)) |
402 | list_add(&dev->power.entry, &dpm_off_irq); | 358 | list_move(&dev->power.entry, &dpm_off_irq); |
403 | } | 359 | } |
404 | 360 | ||
405 | if (!error) | 361 | if (!error) |
@@ -419,6 +375,8 @@ static int suspend_device(struct device *dev, pm_message_t state) | |||
419 | { | 375 | { |
420 | int error = 0; | 376 | int error = 0; |
421 | 377 | ||
378 | down(&dev->sem); | ||
379 | |||
422 | if (dev->power.power_state.event) { | 380 | if (dev->power.power_state.event) { |
423 | dev_dbg(dev, "PM: suspend %d-->%d\n", | 381 | dev_dbg(dev, "PM: suspend %d-->%d\n", |
424 | dev->power.power_state.event, state.event); | 382 | dev->power.power_state.event, state.event); |
@@ -441,6 +399,9 @@ static int suspend_device(struct device *dev, pm_message_t state) | |||
441 | error = dev->bus->suspend(dev, state); | 399 | error = dev->bus->suspend(dev, state); |
442 | suspend_report_result(dev->bus->suspend, error); | 400 | suspend_report_result(dev->bus->suspend, error); |
443 | } | 401 | } |
402 | |||
403 | up(&dev->sem); | ||
404 | |||
444 | return error; | 405 | return error; |
445 | } | 406 | } |
446 | 407 | ||
@@ -461,13 +422,13 @@ static int dpm_suspend(pm_message_t state) | |||
461 | int error = 0; | 422 | int error = 0; |
462 | 423 | ||
463 | mutex_lock(&dpm_list_mtx); | 424 | mutex_lock(&dpm_list_mtx); |
464 | while (!list_empty(&dpm_locked)) { | 425 | while (!list_empty(&dpm_active)) { |
465 | struct list_head *entry = dpm_locked.prev; | 426 | struct list_head *entry = dpm_active.prev; |
466 | struct device *dev = to_device(entry); | 427 | struct device *dev = to_device(entry); |
467 | 428 | ||
468 | list_del_init(&dev->power.entry); | ||
469 | mutex_unlock(&dpm_list_mtx); | 429 | mutex_unlock(&dpm_list_mtx); |
470 | error = suspend_device(dev, state); | 430 | error = suspend_device(dev, state); |
431 | mutex_lock(&dpm_list_mtx); | ||
471 | if (error) { | 432 | if (error) { |
472 | printk(KERN_ERR "Could not suspend device %s: " | 433 | printk(KERN_ERR "Could not suspend device %s: " |
473 | "error %d%s\n", | 434 | "error %d%s\n", |
@@ -476,14 +437,10 @@ static int dpm_suspend(pm_message_t state) | |||
476 | (error == -EAGAIN ? | 437 | (error == -EAGAIN ? |
477 | " (please convert to suspend_late)" : | 438 | " (please convert to suspend_late)" : |
478 | "")); | 439 | "")); |
479 | mutex_lock(&dpm_list_mtx); | ||
480 | if (list_empty(&dev->power.entry)) | ||
481 | list_add(&dev->power.entry, &dpm_locked); | ||
482 | break; | 440 | break; |
483 | } | 441 | } |
484 | mutex_lock(&dpm_list_mtx); | 442 | if (!list_empty(&dev->power.entry)) |
485 | if (list_empty(&dev->power.entry)) | 443 | list_move(&dev->power.entry, &dpm_off); |
486 | list_add(&dev->power.entry, &dpm_off); | ||
487 | } | 444 | } |
488 | mutex_unlock(&dpm_list_mtx); | 445 | mutex_unlock(&dpm_list_mtx); |
489 | 446 | ||
@@ -491,36 +448,6 @@ static int dpm_suspend(pm_message_t state) | |||
491 | } | 448 | } |
492 | 449 | ||
493 | /** | 450 | /** |
494 | * lock_all_devices - Acquire every device's semaphore | ||
495 | * | ||
496 | * Go through the dpm_active list. Carefully lock each device's | ||
497 | * semaphore and put it in on the dpm_locked list. | ||
498 | */ | ||
499 | static void lock_all_devices(void) | ||
500 | { | ||
501 | mutex_lock(&dpm_list_mtx); | ||
502 | while (!list_empty(&dpm_active)) { | ||
503 | struct list_head *entry = dpm_active.next; | ||
504 | struct device *dev = to_device(entry); | ||
505 | |||
506 | /* Required locking order is dev->sem first, | ||
507 | * then dpm_list_mutex. Hence this awkward code. | ||
508 | */ | ||
509 | get_device(dev); | ||
510 | mutex_unlock(&dpm_list_mtx); | ||
511 | down(&dev->sem); | ||
512 | mutex_lock(&dpm_list_mtx); | ||
513 | |||
514 | if (list_empty(entry)) | ||
515 | up(&dev->sem); /* Device was removed */ | ||
516 | else | ||
517 | list_move_tail(entry, &dpm_locked); | ||
518 | put_device(dev); | ||
519 | } | ||
520 | mutex_unlock(&dpm_list_mtx); | ||
521 | } | ||
522 | |||
523 | /** | ||
524 | * device_suspend - Save state and stop all devices in system. | 451 | * device_suspend - Save state and stop all devices in system. |
525 | * @state: new power management state | 452 | * @state: new power management state |
526 | * | 453 | * |
@@ -533,7 +460,6 @@ int device_suspend(pm_message_t state) | |||
533 | 460 | ||
534 | might_sleep(); | 461 | might_sleep(); |
535 | down_write(&pm_sleep_rwsem); | 462 | down_write(&pm_sleep_rwsem); |
536 | lock_all_devices(); | ||
537 | error = dpm_suspend(state); | 463 | error = dpm_suspend(state); |
538 | if (error) | 464 | if (error) |
539 | device_resume(); | 465 | device_resume(); |
diff --git a/drivers/base/sys.c b/drivers/base/sys.c index 2f79c55acdcc..8e13fd942163 100644 --- a/drivers/base/sys.c +++ b/drivers/base/sys.c | |||
@@ -133,6 +133,7 @@ int sysdev_class_register(struct sysdev_class * cls) | |||
133 | pr_debug("Registering sysdev class '%s'\n", | 133 | pr_debug("Registering sysdev class '%s'\n", |
134 | kobject_name(&cls->kset.kobj)); | 134 | kobject_name(&cls->kset.kobj)); |
135 | INIT_LIST_HEAD(&cls->drivers); | 135 | INIT_LIST_HEAD(&cls->drivers); |
136 | memset(&cls->kset.kobj, 0x00, sizeof(struct kobject)); | ||
136 | cls->kset.kobj.parent = &system_kset->kobj; | 137 | cls->kset.kobj.parent = &system_kset->kobj; |
137 | cls->kset.kobj.ktype = &ktype_sysdev_class; | 138 | cls->kset.kobj.ktype = &ktype_sysdev_class; |
138 | cls->kset.kobj.kset = system_kset; | 139 | cls->kset.kobj.kset = system_kset; |
@@ -227,6 +228,9 @@ int sysdev_register(struct sys_device * sysdev) | |||
227 | 228 | ||
228 | pr_debug("Registering sys device '%s'\n", kobject_name(&sysdev->kobj)); | 229 | pr_debug("Registering sys device '%s'\n", kobject_name(&sysdev->kobj)); |
229 | 230 | ||
231 | /* initialize the kobject to 0, in case it had previously been used */ | ||
232 | memset(&sysdev->kobj, 0x00, sizeof(struct kobject)); | ||
233 | |||
230 | /* Make sure the kset is set */ | 234 | /* Make sure the kset is set */ |
231 | sysdev->kobj.kset = &cls->kset; | 235 | sysdev->kobj.kset = &cls->kset; |
232 | 236 | ||
diff --git a/drivers/base/transport_class.c b/drivers/base/transport_class.c index f25e7c6b2d27..40bca48abc12 100644 --- a/drivers/base/transport_class.c +++ b/drivers/base/transport_class.c | |||
@@ -126,9 +126,7 @@ static int transport_setup_classdev(struct attribute_container *cont, | |||
126 | } | 126 | } |
127 | 127 | ||
128 | /** | 128 | /** |
129 | * transport_setup_device - declare a new dev for transport class association | 129 | * transport_setup_device - declare a new dev for transport class association but don't make it visible yet. |
130 | * but don't make it visible yet. | ||
131 | * | ||
132 | * @dev: the generic device representing the entity being added | 130 | * @dev: the generic device representing the entity being added |
133 | * | 131 | * |
134 | * Usually, dev represents some component in the HBA system (either | 132 | * Usually, dev represents some component in the HBA system (either |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 9715be3f2487..55bd35c0f082 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/blkpg.h> | 33 | #include <linux/blkpg.h> |
34 | #include <linux/timer.h> | 34 | #include <linux/timer.h> |
35 | #include <linux/proc_fs.h> | 35 | #include <linux/proc_fs.h> |
36 | #include <linux/seq_file.h> | ||
36 | #include <linux/init.h> | 37 | #include <linux/init.h> |
37 | #include <linux/hdreg.h> | 38 | #include <linux/hdreg.h> |
38 | #include <linux/spinlock.h> | 39 | #include <linux/spinlock.h> |
@@ -131,7 +132,6 @@ static struct board_type products[] = { | |||
131 | /*define how many times we will try a command because of bus resets */ | 132 | /*define how many times we will try a command because of bus resets */ |
132 | #define MAX_CMD_RETRIES 3 | 133 | #define MAX_CMD_RETRIES 3 |
133 | 134 | ||
134 | #define READ_AHEAD 1024 | ||
135 | #define MAX_CTLR 32 | 135 | #define MAX_CTLR 32 |
136 | 136 | ||
137 | /* Originally cciss driver only supports 8 major numbers */ | 137 | /* Originally cciss driver only supports 8 major numbers */ |
@@ -174,8 +174,6 @@ static int sendcmd_withirq(__u8 cmd, int ctlr, void *buff, size_t size, | |||
174 | static void fail_all_cmds(unsigned long ctlr); | 174 | static void fail_all_cmds(unsigned long ctlr); |
175 | 175 | ||
176 | #ifdef CONFIG_PROC_FS | 176 | #ifdef CONFIG_PROC_FS |
177 | static int cciss_proc_get_info(char *buffer, char **start, off_t offset, | ||
178 | int length, int *eof, void *data); | ||
179 | static void cciss_procinit(int i); | 177 | static void cciss_procinit(int i); |
180 | #else | 178 | #else |
181 | static void cciss_procinit(int i) | 179 | static void cciss_procinit(int i) |
@@ -240,24 +238,46 @@ static inline CommandList_struct *removeQ(CommandList_struct **Qptr, | |||
240 | */ | 238 | */ |
241 | #define ENG_GIG 1000000000 | 239 | #define ENG_GIG 1000000000 |
242 | #define ENG_GIG_FACTOR (ENG_GIG/512) | 240 | #define ENG_GIG_FACTOR (ENG_GIG/512) |
241 | #define ENGAGE_SCSI "engage scsi" | ||
243 | static const char *raid_label[] = { "0", "4", "1(1+0)", "5", "5+1", "ADG", | 242 | static const char *raid_label[] = { "0", "4", "1(1+0)", "5", "5+1", "ADG", |
244 | "UNKNOWN" | 243 | "UNKNOWN" |
245 | }; | 244 | }; |
246 | 245 | ||
247 | static struct proc_dir_entry *proc_cciss; | 246 | static struct proc_dir_entry *proc_cciss; |
248 | 247 | ||
249 | static int cciss_proc_get_info(char *buffer, char **start, off_t offset, | 248 | static void cciss_seq_show_header(struct seq_file *seq) |
250 | int length, int *eof, void *data) | ||
251 | { | 249 | { |
252 | off_t pos = 0; | 250 | ctlr_info_t *h = seq->private; |
253 | off_t len = 0; | 251 | |
254 | int size, i, ctlr; | 252 | seq_printf(seq, "%s: HP %s Controller\n" |
255 | ctlr_info_t *h = (ctlr_info_t *) data; | 253 | "Board ID: 0x%08lx\n" |
256 | drive_info_struct *drv; | 254 | "Firmware Version: %c%c%c%c\n" |
257 | unsigned long flags; | 255 | "IRQ: %d\n" |
258 | sector_t vol_sz, vol_sz_frac; | 256 | "Logical drives: %d\n" |
257 | "Current Q depth: %d\n" | ||
258 | "Current # commands on controller: %d\n" | ||
259 | "Max Q depth since init: %d\n" | ||
260 | "Max # commands on controller since init: %d\n" | ||
261 | "Max SG entries since init: %d\n", | ||
262 | h->devname, | ||
263 | h->product_name, | ||
264 | (unsigned long)h->board_id, | ||
265 | h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], | ||
266 | h->firm_ver[3], (unsigned int)h->intr[SIMPLE_MODE_INT], | ||
267 | h->num_luns, | ||
268 | h->Qdepth, h->commands_outstanding, | ||
269 | h->maxQsinceinit, h->max_outstanding, h->maxSG); | ||
259 | 270 | ||
260 | ctlr = h->ctlr; | 271 | #ifdef CONFIG_CISS_SCSI_TAPE |
272 | cciss_seq_tape_report(seq, h->ctlr); | ||
273 | #endif /* CONFIG_CISS_SCSI_TAPE */ | ||
274 | } | ||
275 | |||
276 | static void *cciss_seq_start(struct seq_file *seq, loff_t *pos) | ||
277 | { | ||
278 | ctlr_info_t *h = seq->private; | ||
279 | unsigned ctlr = h->ctlr; | ||
280 | unsigned long flags; | ||
261 | 281 | ||
262 | /* prevent displaying bogus info during configuration | 282 | /* prevent displaying bogus info during configuration |
263 | * or deconfiguration of a logical volume | 283 | * or deconfiguration of a logical volume |
@@ -265,115 +285,155 @@ static int cciss_proc_get_info(char *buffer, char **start, off_t offset, | |||
265 | spin_lock_irqsave(CCISS_LOCK(ctlr), flags); | 285 | spin_lock_irqsave(CCISS_LOCK(ctlr), flags); |
266 | if (h->busy_configuring) { | 286 | if (h->busy_configuring) { |
267 | spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); | 287 | spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); |
268 | return -EBUSY; | 288 | return ERR_PTR(-EBUSY); |
269 | } | 289 | } |
270 | h->busy_configuring = 1; | 290 | h->busy_configuring = 1; |
271 | spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); | 291 | spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); |
272 | 292 | ||
273 | size = sprintf(buffer, "%s: HP %s Controller\n" | 293 | if (*pos == 0) |
274 | "Board ID: 0x%08lx\n" | 294 | cciss_seq_show_header(seq); |
275 | "Firmware Version: %c%c%c%c\n" | ||
276 | "IRQ: %d\n" | ||
277 | "Logical drives: %d\n" | ||
278 | "Max sectors: %d\n" | ||
279 | "Current Q depth: %d\n" | ||
280 | "Current # commands on controller: %d\n" | ||
281 | "Max Q depth since init: %d\n" | ||
282 | "Max # commands on controller since init: %d\n" | ||
283 | "Max SG entries since init: %d\n\n", | ||
284 | h->devname, | ||
285 | h->product_name, | ||
286 | (unsigned long)h->board_id, | ||
287 | h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], | ||
288 | h->firm_ver[3], (unsigned int)h->intr[SIMPLE_MODE_INT], | ||
289 | h->num_luns, | ||
290 | h->cciss_max_sectors, | ||
291 | h->Qdepth, h->commands_outstanding, | ||
292 | h->maxQsinceinit, h->max_outstanding, h->maxSG); | ||
293 | |||
294 | pos += size; | ||
295 | len += size; | ||
296 | cciss_proc_tape_report(ctlr, buffer, &pos, &len); | ||
297 | for (i = 0; i <= h->highest_lun; i++) { | ||
298 | |||
299 | drv = &h->drv[i]; | ||
300 | if (drv->heads == 0) | ||
301 | continue; | ||
302 | 295 | ||
303 | vol_sz = drv->nr_blocks; | 296 | return pos; |
304 | vol_sz_frac = sector_div(vol_sz, ENG_GIG_FACTOR); | 297 | } |
305 | vol_sz_frac *= 100; | 298 | |
306 | sector_div(vol_sz_frac, ENG_GIG_FACTOR); | 299 | static int cciss_seq_show(struct seq_file *seq, void *v) |
300 | { | ||
301 | sector_t vol_sz, vol_sz_frac; | ||
302 | ctlr_info_t *h = seq->private; | ||
303 | unsigned ctlr = h->ctlr; | ||
304 | loff_t *pos = v; | ||
305 | drive_info_struct *drv = &h->drv[*pos]; | ||
306 | |||
307 | if (*pos > h->highest_lun) | ||
308 | return 0; | ||
309 | |||
310 | if (drv->heads == 0) | ||
311 | return 0; | ||
312 | |||
313 | vol_sz = drv->nr_blocks; | ||
314 | vol_sz_frac = sector_div(vol_sz, ENG_GIG_FACTOR); | ||
315 | vol_sz_frac *= 100; | ||
316 | sector_div(vol_sz_frac, ENG_GIG_FACTOR); | ||
317 | |||
318 | if (drv->raid_level > 5) | ||
319 | drv->raid_level = RAID_UNKNOWN; | ||
320 | seq_printf(seq, "cciss/c%dd%d:" | ||
321 | "\t%4u.%02uGB\tRAID %s\n", | ||
322 | ctlr, (int) *pos, (int)vol_sz, (int)vol_sz_frac, | ||
323 | raid_label[drv->raid_level]); | ||
324 | return 0; | ||
325 | } | ||
326 | |||
327 | static void *cciss_seq_next(struct seq_file *seq, void *v, loff_t *pos) | ||
328 | { | ||
329 | ctlr_info_t *h = seq->private; | ||
330 | |||
331 | if (*pos > h->highest_lun) | ||
332 | return NULL; | ||
333 | *pos += 1; | ||
334 | |||
335 | return pos; | ||
336 | } | ||
337 | |||
338 | static void cciss_seq_stop(struct seq_file *seq, void *v) | ||
339 | { | ||
340 | ctlr_info_t *h = seq->private; | ||
341 | |||
342 | /* Only reset h->busy_configuring if we succeeded in setting | ||
343 | * it during cciss_seq_start. */ | ||
344 | if (v == ERR_PTR(-EBUSY)) | ||
345 | return; | ||
307 | 346 | ||
308 | if (drv->raid_level > 5) | ||
309 | drv->raid_level = RAID_UNKNOWN; | ||
310 | size = sprintf(buffer + len, "cciss/c%dd%d:" | ||
311 | "\t%4u.%02uGB\tRAID %s\n", | ||
312 | ctlr, i, (int)vol_sz, (int)vol_sz_frac, | ||
313 | raid_label[drv->raid_level]); | ||
314 | pos += size; | ||
315 | len += size; | ||
316 | } | ||
317 | |||
318 | *eof = 1; | ||
319 | *start = buffer + offset; | ||
320 | len -= offset; | ||
321 | if (len > length) | ||
322 | len = length; | ||
323 | h->busy_configuring = 0; | 347 | h->busy_configuring = 0; |
324 | return len; | ||
325 | } | 348 | } |
326 | 349 | ||
327 | static int | 350 | static struct seq_operations cciss_seq_ops = { |
328 | cciss_proc_write(struct file *file, const char __user *buffer, | 351 | .start = cciss_seq_start, |
329 | unsigned long count, void *data) | 352 | .show = cciss_seq_show, |
353 | .next = cciss_seq_next, | ||
354 | .stop = cciss_seq_stop, | ||
355 | }; | ||
356 | |||
357 | static int cciss_seq_open(struct inode *inode, struct file *file) | ||
330 | { | 358 | { |
331 | unsigned char cmd[80]; | 359 | int ret = seq_open(file, &cciss_seq_ops); |
332 | int len; | 360 | struct seq_file *seq = file->private_data; |
333 | #ifdef CONFIG_CISS_SCSI_TAPE | 361 | |
334 | ctlr_info_t *h = (ctlr_info_t *) data; | 362 | if (!ret) |
335 | int rc; | 363 | seq->private = PDE(inode)->data; |
364 | |||
365 | return ret; | ||
366 | } | ||
367 | |||
368 | static ssize_t | ||
369 | cciss_proc_write(struct file *file, const char __user *buf, | ||
370 | size_t length, loff_t *ppos) | ||
371 | { | ||
372 | int err; | ||
373 | char *buffer; | ||
374 | |||
375 | #ifndef CONFIG_CISS_SCSI_TAPE | ||
376 | return -EINVAL; | ||
336 | #endif | 377 | #endif |
337 | 378 | ||
338 | if (count > sizeof(cmd) - 1) | 379 | if (!buf || length > PAGE_SIZE - 1) |
339 | return -EINVAL; | 380 | return -EINVAL; |
340 | if (copy_from_user(cmd, buffer, count)) | 381 | |
341 | return -EFAULT; | 382 | buffer = (char *)__get_free_page(GFP_KERNEL); |
342 | cmd[count] = '\0'; | 383 | if (!buffer) |
343 | len = strlen(cmd); // above 3 lines ensure safety | 384 | return -ENOMEM; |
344 | if (len && cmd[len - 1] == '\n') | 385 | |
345 | cmd[--len] = '\0'; | 386 | err = -EFAULT; |
346 | # ifdef CONFIG_CISS_SCSI_TAPE | 387 | if (copy_from_user(buffer, buf, length)) |
347 | if (strcmp("engage scsi", cmd) == 0) { | 388 | goto out; |
389 | buffer[length] = '\0'; | ||
390 | |||
391 | #ifdef CONFIG_CISS_SCSI_TAPE | ||
392 | if (strncmp(ENGAGE_SCSI, buffer, sizeof ENGAGE_SCSI - 1) == 0) { | ||
393 | struct seq_file *seq = file->private_data; | ||
394 | ctlr_info_t *h = seq->private; | ||
395 | int rc; | ||
396 | |||
348 | rc = cciss_engage_scsi(h->ctlr); | 397 | rc = cciss_engage_scsi(h->ctlr); |
349 | if (rc != 0) | 398 | if (rc != 0) |
350 | return -rc; | 399 | err = -rc; |
351 | return count; | 400 | else |
352 | } | 401 | err = length; |
402 | } else | ||
403 | #endif /* CONFIG_CISS_SCSI_TAPE */ | ||
404 | err = -EINVAL; | ||
353 | /* might be nice to have "disengage" too, but it's not | 405 | /* might be nice to have "disengage" too, but it's not |
354 | safely possible. (only 1 module use count, lock issues.) */ | 406 | safely possible. (only 1 module use count, lock issues.) */ |
355 | # endif | 407 | |
356 | return -EINVAL; | 408 | out: |
409 | free_page((unsigned long)buffer); | ||
410 | return err; | ||
357 | } | 411 | } |
358 | 412 | ||
359 | /* | 413 | static struct file_operations cciss_proc_fops = { |
360 | * Get us a file in /proc/cciss that says something about each controller. | 414 | .owner = THIS_MODULE, |
361 | * Create /proc/cciss if it doesn't exist yet. | 415 | .open = cciss_seq_open, |
362 | */ | 416 | .read = seq_read, |
417 | .llseek = seq_lseek, | ||
418 | .release = seq_release, | ||
419 | .write = cciss_proc_write, | ||
420 | }; | ||
421 | |||
363 | static void __devinit cciss_procinit(int i) | 422 | static void __devinit cciss_procinit(int i) |
364 | { | 423 | { |
365 | struct proc_dir_entry *pde; | 424 | struct proc_dir_entry *pde; |
366 | 425 | ||
367 | if (proc_cciss == NULL) { | 426 | if (proc_cciss == NULL) |
368 | proc_cciss = proc_mkdir("cciss", proc_root_driver); | 427 | proc_cciss = proc_mkdir("cciss", proc_root_driver); |
369 | if (!proc_cciss) | 428 | if (!proc_cciss) |
370 | return; | 429 | return; |
371 | } | 430 | pde = proc_create(hba[i]->devname, S_IWUSR | S_IRUSR | S_IRGRP | |
431 | S_IROTH, proc_cciss, | ||
432 | &cciss_proc_fops); | ||
433 | if (!pde) | ||
434 | return; | ||
372 | 435 | ||
373 | pde = create_proc_read_entry(hba[i]->devname, | 436 | pde->data = hba[i]; |
374 | S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, | ||
375 | proc_cciss, cciss_proc_get_info, hba[i]); | ||
376 | pde->write_proc = cciss_proc_write; | ||
377 | } | 437 | } |
378 | #endif /* CONFIG_PROC_FS */ | 438 | #endif /* CONFIG_PROC_FS */ |
379 | 439 | ||
@@ -1341,7 +1401,6 @@ geo_inq: | |||
1341 | disk->private_data = &h->drv[drv_index]; | 1401 | disk->private_data = &h->drv[drv_index]; |
1342 | 1402 | ||
1343 | /* Set up queue information */ | 1403 | /* Set up queue information */ |
1344 | disk->queue->backing_dev_info.ra_pages = READ_AHEAD; | ||
1345 | blk_queue_bounce_limit(disk->queue, hba[ctlr]->pdev->dma_mask); | 1404 | blk_queue_bounce_limit(disk->queue, hba[ctlr]->pdev->dma_mask); |
1346 | 1405 | ||
1347 | /* This is a hardware imposed limit. */ | 1406 | /* This is a hardware imposed limit. */ |
@@ -3434,7 +3493,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, | |||
3434 | } | 3493 | } |
3435 | drv->queue = q; | 3494 | drv->queue = q; |
3436 | 3495 | ||
3437 | q->backing_dev_info.ra_pages = READ_AHEAD; | ||
3438 | blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask); | 3496 | blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask); |
3439 | 3497 | ||
3440 | /* This is a hardware imposed limit. */ | 3498 | /* This is a hardware imposed limit. */ |
diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c index 55178e9973a0..45ac09300eb3 100644 --- a/drivers/block/cciss_scsi.c +++ b/drivers/block/cciss_scsi.c | |||
@@ -1404,21 +1404,18 @@ cciss_engage_scsi(int ctlr) | |||
1404 | } | 1404 | } |
1405 | 1405 | ||
1406 | static void | 1406 | static void |
1407 | cciss_proc_tape_report(int ctlr, unsigned char *buffer, off_t *pos, off_t *len) | 1407 | cciss_seq_tape_report(struct seq_file *seq, int ctlr) |
1408 | { | 1408 | { |
1409 | unsigned long flags; | 1409 | unsigned long flags; |
1410 | int size; | ||
1411 | |||
1412 | *pos = *pos -1; *len = *len - 1; // cut off the last trailing newline | ||
1413 | 1410 | ||
1414 | CPQ_TAPE_LOCK(ctlr, flags); | 1411 | CPQ_TAPE_LOCK(ctlr, flags); |
1415 | size = sprintf(buffer + *len, | 1412 | seq_printf(seq, |
1416 | "Sequential access devices: %d\n\n", | 1413 | "Sequential access devices: %d\n\n", |
1417 | ccissscsi[ctlr].ndevices); | 1414 | ccissscsi[ctlr].ndevices); |
1418 | CPQ_TAPE_UNLOCK(ctlr, flags); | 1415 | CPQ_TAPE_UNLOCK(ctlr, flags); |
1419 | *pos += size; *len += size; | ||
1420 | } | 1416 | } |
1421 | 1417 | ||
1418 | |||
1422 | /* Need at least one of these error handlers to keep ../scsi/hosts.c from | 1419 | /* Need at least one of these error handlers to keep ../scsi/hosts.c from |
1423 | * complaining. Doing a host- or bus-reset can't do anything good here. | 1420 | * complaining. Doing a host- or bus-reset can't do anything good here. |
1424 | * Despite what it might say in scsi_error.c, there may well be commands | 1421 | * Despite what it might say in scsi_error.c, there may well be commands |
@@ -1498,6 +1495,5 @@ static int cciss_eh_abort_handler(struct scsi_cmnd *scsicmd) | |||
1498 | #define cciss_scsi_setup(cntl_num) | 1495 | #define cciss_scsi_setup(cntl_num) |
1499 | #define cciss_unregister_scsi(ctlr) | 1496 | #define cciss_unregister_scsi(ctlr) |
1500 | #define cciss_register_scsi(ctlr) | 1497 | #define cciss_register_scsi(ctlr) |
1501 | #define cciss_proc_tape_report(ctlr, buffer, pos, len) | ||
1502 | 1498 | ||
1503 | #endif /* CONFIG_CISS_SCSI_TAPE */ | 1499 | #endif /* CONFIG_CISS_SCSI_TAPE */ |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 32c79a55511b..7652e87d60c5 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
@@ -217,7 +217,6 @@ static int use_virtual_dma; | |||
217 | */ | 217 | */ |
218 | 218 | ||
219 | static DEFINE_SPINLOCK(floppy_lock); | 219 | static DEFINE_SPINLOCK(floppy_lock); |
220 | static struct completion device_release; | ||
221 | 220 | ||
222 | static unsigned short virtual_dma_port = 0x3f0; | 221 | static unsigned short virtual_dma_port = 0x3f0; |
223 | irqreturn_t floppy_interrupt(int irq, void *dev_id); | 222 | irqreturn_t floppy_interrupt(int irq, void *dev_id); |
@@ -4144,7 +4143,6 @@ DEVICE_ATTR(cmos,S_IRUGO,floppy_cmos_show,NULL); | |||
4144 | 4143 | ||
4145 | static void floppy_device_release(struct device *dev) | 4144 | static void floppy_device_release(struct device *dev) |
4146 | { | 4145 | { |
4147 | complete(&device_release); | ||
4148 | } | 4146 | } |
4149 | 4147 | ||
4150 | static struct platform_device floppy_device[N_DRIVE]; | 4148 | static struct platform_device floppy_device[N_DRIVE]; |
@@ -4539,7 +4537,6 @@ void cleanup_module(void) | |||
4539 | { | 4537 | { |
4540 | int drive; | 4538 | int drive; |
4541 | 4539 | ||
4542 | init_completion(&device_release); | ||
4543 | blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256); | 4540 | blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256); |
4544 | unregister_blkdev(FLOPPY_MAJOR, "fd"); | 4541 | unregister_blkdev(FLOPPY_MAJOR, "fd"); |
4545 | 4542 | ||
@@ -4564,8 +4561,6 @@ void cleanup_module(void) | |||
4564 | 4561 | ||
4565 | /* eject disk, if any */ | 4562 | /* eject disk, if any */ |
4566 | fd_eject(0); | 4563 | fd_eject(0); |
4567 | |||
4568 | wait_for_completion(&device_release); | ||
4569 | } | 4564 | } |
4570 | 4565 | ||
4571 | module_param(floppy, charp, 0); | 4566 | module_param(floppy, charp, 0); |
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 674cd66dcaba..18feb1c7c33b 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
@@ -849,7 +849,8 @@ static int pkt_flush_cache(struct pktcdvd_device *pd) | |||
849 | /* | 849 | /* |
850 | * speed is given as the normal factor, e.g. 4 for 4x | 850 | * speed is given as the normal factor, e.g. 4 for 4x |
851 | */ | 851 | */ |
852 | static int pkt_set_speed(struct pktcdvd_device *pd, unsigned write_speed, unsigned read_speed) | 852 | static noinline_for_stack int pkt_set_speed(struct pktcdvd_device *pd, |
853 | unsigned write_speed, unsigned read_speed) | ||
853 | { | 854 | { |
854 | struct packet_command cgc; | 855 | struct packet_command cgc; |
855 | struct request_sense sense; | 856 | struct request_sense sense; |
@@ -1776,7 +1777,8 @@ static int pkt_get_track_info(struct pktcdvd_device *pd, __u16 track, __u8 type, | |||
1776 | return pkt_generic_packet(pd, &cgc); | 1777 | return pkt_generic_packet(pd, &cgc); |
1777 | } | 1778 | } |
1778 | 1779 | ||
1779 | static int pkt_get_last_written(struct pktcdvd_device *pd, long *last_written) | 1780 | static noinline_for_stack int pkt_get_last_written(struct pktcdvd_device *pd, |
1781 | long *last_written) | ||
1780 | { | 1782 | { |
1781 | disc_information di; | 1783 | disc_information di; |
1782 | track_information ti; | 1784 | track_information ti; |
@@ -1813,7 +1815,7 @@ static int pkt_get_last_written(struct pktcdvd_device *pd, long *last_written) | |||
1813 | /* | 1815 | /* |
1814 | * write mode select package based on pd->settings | 1816 | * write mode select package based on pd->settings |
1815 | */ | 1817 | */ |
1816 | static int pkt_set_write_settings(struct pktcdvd_device *pd) | 1818 | static noinline_for_stack int pkt_set_write_settings(struct pktcdvd_device *pd) |
1817 | { | 1819 | { |
1818 | struct packet_command cgc; | 1820 | struct packet_command cgc; |
1819 | struct request_sense sense; | 1821 | struct request_sense sense; |
@@ -1972,7 +1974,7 @@ static int pkt_writable_disc(struct pktcdvd_device *pd, disc_information *di) | |||
1972 | return 1; | 1974 | return 1; |
1973 | } | 1975 | } |
1974 | 1976 | ||
1975 | static int pkt_probe_settings(struct pktcdvd_device *pd) | 1977 | static noinline_for_stack int pkt_probe_settings(struct pktcdvd_device *pd) |
1976 | { | 1978 | { |
1977 | struct packet_command cgc; | 1979 | struct packet_command cgc; |
1978 | unsigned char buf[12]; | 1980 | unsigned char buf[12]; |
@@ -2071,7 +2073,8 @@ static int pkt_probe_settings(struct pktcdvd_device *pd) | |||
2071 | /* | 2073 | /* |
2072 | * enable/disable write caching on drive | 2074 | * enable/disable write caching on drive |
2073 | */ | 2075 | */ |
2074 | static int pkt_write_caching(struct pktcdvd_device *pd, int set) | 2076 | static noinline_for_stack int pkt_write_caching(struct pktcdvd_device *pd, |
2077 | int set) | ||
2075 | { | 2078 | { |
2076 | struct packet_command cgc; | 2079 | struct packet_command cgc; |
2077 | struct request_sense sense; | 2080 | struct request_sense sense; |
@@ -2116,7 +2119,8 @@ static int pkt_lock_door(struct pktcdvd_device *pd, int lockflag) | |||
2116 | /* | 2119 | /* |
2117 | * Returns drive maximum write speed | 2120 | * Returns drive maximum write speed |
2118 | */ | 2121 | */ |
2119 | static int pkt_get_max_speed(struct pktcdvd_device *pd, unsigned *write_speed) | 2122 | static noinline_for_stack int pkt_get_max_speed(struct pktcdvd_device *pd, |
2123 | unsigned *write_speed) | ||
2120 | { | 2124 | { |
2121 | struct packet_command cgc; | 2125 | struct packet_command cgc; |
2122 | struct request_sense sense; | 2126 | struct request_sense sense; |
@@ -2177,7 +2181,8 @@ static char us_clv_to_speed[16] = { | |||
2177 | /* | 2181 | /* |
2178 | * reads the maximum media speed from ATIP | 2182 | * reads the maximum media speed from ATIP |
2179 | */ | 2183 | */ |
2180 | static int pkt_media_speed(struct pktcdvd_device *pd, unsigned *speed) | 2184 | static noinline_for_stack int pkt_media_speed(struct pktcdvd_device *pd, |
2185 | unsigned *speed) | ||
2181 | { | 2186 | { |
2182 | struct packet_command cgc; | 2187 | struct packet_command cgc; |
2183 | struct request_sense sense; | 2188 | struct request_sense sense; |
@@ -2249,7 +2254,7 @@ static int pkt_media_speed(struct pktcdvd_device *pd, unsigned *speed) | |||
2249 | } | 2254 | } |
2250 | } | 2255 | } |
2251 | 2256 | ||
2252 | static int pkt_perform_opc(struct pktcdvd_device *pd) | 2257 | static noinline_for_stack int pkt_perform_opc(struct pktcdvd_device *pd) |
2253 | { | 2258 | { |
2254 | struct packet_command cgc; | 2259 | struct packet_command cgc; |
2255 | struct request_sense sense; | 2260 | struct request_sense sense; |
diff --git a/drivers/block/viodasd.c b/drivers/block/viodasd.c index 9e61fca46117..41ca721d2523 100644 --- a/drivers/block/viodasd.c +++ b/drivers/block/viodasd.c | |||
@@ -528,8 +528,7 @@ static int block_event_to_scatterlist(const struct vioblocklpevent *bevent, | |||
528 | numsg = VIOMAXBLOCKDMA; | 528 | numsg = VIOMAXBLOCKDMA; |
529 | 529 | ||
530 | *total_len = 0; | 530 | *total_len = 0; |
531 | memset(sg, 0, sizeof(sg[0]) * VIOMAXBLOCKDMA); | 531 | sg_init_table(sg, VIOMAXBLOCKDMA); |
532 | |||
533 | for (i = 0; (i < numsg) && (rw_data->dma_info[i].len > 0); ++i) { | 532 | for (i = 0; (i < numsg) && (rw_data->dma_info[i].len > 0); ++i) { |
534 | sg_dma_address(&sg[i]) = rw_data->dma_info[i].token; | 533 | sg_dma_address(&sg[i]) = rw_data->dma_info[i].token; |
535 | sg_dma_len(&sg[i]) = rw_data->dma_info[i].len; | 534 | sg_dma_len(&sg[i]) = rw_data->dma_info[i].len; |
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 3b1a68d6eddb..0cfbe8c594a5 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
@@ -238,6 +238,7 @@ static int virtblk_probe(struct virtio_device *vdev) | |||
238 | vblk->disk->first_minor = index_to_minor(index); | 238 | vblk->disk->first_minor = index_to_minor(index); |
239 | vblk->disk->private_data = vblk; | 239 | vblk->disk->private_data = vblk; |
240 | vblk->disk->fops = &virtblk_fops; | 240 | vblk->disk->fops = &virtblk_fops; |
241 | vblk->disk->driverfs_dev = &vdev->dev; | ||
241 | index++; | 242 | index++; |
242 | 243 | ||
243 | /* If barriers are supported, tell block layer that queue is ordered */ | 244 | /* If barriers are supported, tell block layer that queue is ordered */ |
diff --git a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c index 4f8a744c90b7..8b884f87d8b7 100644 --- a/drivers/bluetooth/hci_usb.c +++ b/drivers/bluetooth/hci_usb.c | |||
@@ -116,6 +116,7 @@ static struct usb_device_id blacklist_ids[] = { | |||
116 | { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 }, | 116 | { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 }, |
117 | 117 | ||
118 | /* Broadcom BCM2045 */ | 118 | /* Broadcom BCM2045 */ |
119 | { USB_DEVICE(0x0a5c, 0x2039), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, | ||
119 | { USB_DEVICE(0x0a5c, 0x2101), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, | 120 | { USB_DEVICE(0x0a5c, 0x2101), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU }, |
120 | 121 | ||
121 | /* IBM/Lenovo ThinkPad with Broadcom chip */ | 122 | /* IBM/Lenovo ThinkPad with Broadcom chip */ |
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index db259e60289b..12f5baea439b 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
@@ -1152,8 +1152,8 @@ clean_up_and_return: | |||
1152 | /* This code is similar to that in open_for_data. The routine is called | 1152 | /* This code is similar to that in open_for_data. The routine is called |
1153 | whenever an audio play operation is requested. | 1153 | whenever an audio play operation is requested. |
1154 | */ | 1154 | */ |
1155 | int check_for_audio_disc(struct cdrom_device_info * cdi, | 1155 | static int check_for_audio_disc(struct cdrom_device_info * cdi, |
1156 | struct cdrom_device_ops * cdo) | 1156 | struct cdrom_device_ops * cdo) |
1157 | { | 1157 | { |
1158 | int ret; | 1158 | int ret; |
1159 | tracktype tracks; | 1159 | tracktype tracks; |
diff --git a/drivers/char/defkeymap.c_shipped b/drivers/char/defkeymap.c_shipped index 0aa419a61767..d2208dfe3f67 100644 --- a/drivers/char/defkeymap.c_shipped +++ b/drivers/char/defkeymap.c_shipped | |||
@@ -223,40 +223,40 @@ char *func_table[MAX_NR_FUNC] = { | |||
223 | }; | 223 | }; |
224 | 224 | ||
225 | struct kbdiacruc accent_table[MAX_DIACR] = { | 225 | struct kbdiacruc accent_table[MAX_DIACR] = { |
226 | {'`', 'A', '\300'}, {'`', 'a', '\340'}, | 226 | {'`', 'A', 0300}, {'`', 'a', 0340}, |
227 | {'\'', 'A', '\301'}, {'\'', 'a', '\341'}, | 227 | {'\'', 'A', 0301}, {'\'', 'a', 0341}, |
228 | {'^', 'A', '\302'}, {'^', 'a', '\342'}, | 228 | {'^', 'A', 0302}, {'^', 'a', 0342}, |
229 | {'~', 'A', '\303'}, {'~', 'a', '\343'}, | 229 | {'~', 'A', 0303}, {'~', 'a', 0343}, |
230 | {'"', 'A', '\304'}, {'"', 'a', '\344'}, | 230 | {'"', 'A', 0304}, {'"', 'a', 0344}, |
231 | {'O', 'A', '\305'}, {'o', 'a', '\345'}, | 231 | {'O', 'A', 0305}, {'o', 'a', 0345}, |
232 | {'0', 'A', '\305'}, {'0', 'a', '\345'}, | 232 | {'0', 'A', 0305}, {'0', 'a', 0345}, |
233 | {'A', 'A', '\305'}, {'a', 'a', '\345'}, | 233 | {'A', 'A', 0305}, {'a', 'a', 0345}, |
234 | {'A', 'E', '\306'}, {'a', 'e', '\346'}, | 234 | {'A', 'E', 0306}, {'a', 'e', 0346}, |
235 | {',', 'C', '\307'}, {',', 'c', '\347'}, | 235 | {',', 'C', 0307}, {',', 'c', 0347}, |
236 | {'`', 'E', '\310'}, {'`', 'e', '\350'}, | 236 | {'`', 'E', 0310}, {'`', 'e', 0350}, |
237 | {'\'', 'E', '\311'}, {'\'', 'e', '\351'}, | 237 | {'\'', 'E', 0311}, {'\'', 'e', 0351}, |
238 | {'^', 'E', '\312'}, {'^', 'e', '\352'}, | 238 | {'^', 'E', 0312}, {'^', 'e', 0352}, |
239 | {'"', 'E', '\313'}, {'"', 'e', '\353'}, | 239 | {'"', 'E', 0313}, {'"', 'e', 0353}, |
240 | {'`', 'I', '\314'}, {'`', 'i', '\354'}, | 240 | {'`', 'I', 0314}, {'`', 'i', 0354}, |
241 | {'\'', 'I', '\315'}, {'\'', 'i', '\355'}, | 241 | {'\'', 'I', 0315}, {'\'', 'i', 0355}, |
242 | {'^', 'I', '\316'}, {'^', 'i', '\356'}, | 242 | {'^', 'I', 0316}, {'^', 'i', 0356}, |
243 | {'"', 'I', '\317'}, {'"', 'i', '\357'}, | 243 | {'"', 'I', 0317}, {'"', 'i', 0357}, |
244 | {'-', 'D', '\320'}, {'-', 'd', '\360'}, | 244 | {'-', 'D', 0320}, {'-', 'd', 0360}, |
245 | {'~', 'N', '\321'}, {'~', 'n', '\361'}, | 245 | {'~', 'N', 0321}, {'~', 'n', 0361}, |
246 | {'`', 'O', '\322'}, {'`', 'o', '\362'}, | 246 | {'`', 'O', 0322}, {'`', 'o', 0362}, |
247 | {'\'', 'O', '\323'}, {'\'', 'o', '\363'}, | 247 | {'\'', 'O', 0323}, {'\'', 'o', 0363}, |
248 | {'^', 'O', '\324'}, {'^', 'o', '\364'}, | 248 | {'^', 'O', 0324}, {'^', 'o', 0364}, |
249 | {'~', 'O', '\325'}, {'~', 'o', '\365'}, | 249 | {'~', 'O', 0325}, {'~', 'o', 0365}, |
250 | {'"', 'O', '\326'}, {'"', 'o', '\366'}, | 250 | {'"', 'O', 0326}, {'"', 'o', 0366}, |
251 | {'/', 'O', '\330'}, {'/', 'o', '\370'}, | 251 | {'/', 'O', 0330}, {'/', 'o', 0370}, |
252 | {'`', 'U', '\331'}, {'`', 'u', '\371'}, | 252 | {'`', 'U', 0331}, {'`', 'u', 0371}, |
253 | {'\'', 'U', '\332'}, {'\'', 'u', '\372'}, | 253 | {'\'', 'U', 0332}, {'\'', 'u', 0372}, |
254 | {'^', 'U', '\333'}, {'^', 'u', '\373'}, | 254 | {'^', 'U', 0333}, {'^', 'u', 0373}, |
255 | {'"', 'U', '\334'}, {'"', 'u', '\374'}, | 255 | {'"', 'U', 0334}, {'"', 'u', 0374}, |
256 | {'\'', 'Y', '\335'}, {'\'', 'y', '\375'}, | 256 | {'\'', 'Y', 0335}, {'\'', 'y', 0375}, |
257 | {'T', 'H', '\336'}, {'t', 'h', '\376'}, | 257 | {'T', 'H', 0336}, {'t', 'h', 0376}, |
258 | {'s', 's', '\337'}, {'"', 'y', '\377'}, | 258 | {'s', 's', 0337}, {'"', 'y', 0377}, |
259 | {'s', 'z', '\337'}, {'i', 'j', '\377'}, | 259 | {'s', 'z', 0337}, {'i', 'j', 0377}, |
260 | }; | 260 | }; |
261 | 261 | ||
262 | unsigned int accent_table_size = 68; | 262 | unsigned int accent_table_size = 68; |
diff --git a/drivers/char/esp.c b/drivers/char/esp.c index c01e26d9ee5e..f3fe62067344 100644 --- a/drivers/char/esp.c +++ b/drivers/char/esp.c | |||
@@ -2484,6 +2484,7 @@ static int __init espserial_init(void) | |||
2484 | return 0; | 2484 | return 0; |
2485 | } | 2485 | } |
2486 | 2486 | ||
2487 | spin_lock_init(&info->lock); | ||
2487 | /* rx_trigger, tx_trigger are needed by autoconfig */ | 2488 | /* rx_trigger, tx_trigger are needed by autoconfig */ |
2488 | info->config.rx_trigger = rx_trigger; | 2489 | info->config.rx_trigger = rx_trigger; |
2489 | info->config.tx_trigger = tx_trigger; | 2490 | info->config.tx_trigger = tx_trigger; |
diff --git a/drivers/char/isicom.c b/drivers/char/isicom.c index 85d596a3c18c..eba2883b630e 100644 --- a/drivers/char/isicom.c +++ b/drivers/char/isicom.c | |||
@@ -1527,7 +1527,7 @@ static int __devinit reset_card(struct pci_dev *pdev, | |||
1527 | msleep(10); | 1527 | msleep(10); |
1528 | 1528 | ||
1529 | portcount = inw(base + 0x2); | 1529 | portcount = inw(base + 0x2); |
1530 | if (!inw(base + 0xe) & 0x1 || (portcount != 0 && portcount != 4 && | 1530 | if (!(inw(base + 0xe) & 0x1) || (portcount != 0 && portcount != 4 && |
1531 | portcount != 8 && portcount != 16)) { | 1531 | portcount != 8 && portcount != 16)) { |
1532 | dev_err(&pdev->dev, "ISILoad:PCI Card%d reset failure.\n", | 1532 | dev_err(&pdev->dev, "ISILoad:PCI Card%d reset failure.\n", |
1533 | card + 1); | 1533 | card + 1); |
diff --git a/drivers/char/nozomi.c b/drivers/char/nozomi.c index dfaab2322de3..6d0dc5f9b6bb 100644 --- a/drivers/char/nozomi.c +++ b/drivers/char/nozomi.c | |||
@@ -190,6 +190,14 @@ enum card_type { | |||
190 | F32_8 = 8192, /* 3072 bytes downl. + 1024 bytes uplink * 2 -> 8192 */ | 190 | F32_8 = 8192, /* 3072 bytes downl. + 1024 bytes uplink * 2 -> 8192 */ |
191 | }; | 191 | }; |
192 | 192 | ||
193 | /* Initialization states a card can be in */ | ||
194 | enum card_state { | ||
195 | NOZOMI_STATE_UKNOWN = 0, | ||
196 | NOZOMI_STATE_ENABLED = 1, /* pci device enabled */ | ||
197 | NOZOMI_STATE_ALLOCATED = 2, /* config setup done */ | ||
198 | NOZOMI_STATE_READY = 3, /* flowcontrols received */ | ||
199 | }; | ||
200 | |||
193 | /* Two different toggle channels exist */ | 201 | /* Two different toggle channels exist */ |
194 | enum channel_type { | 202 | enum channel_type { |
195 | CH_A = 0, | 203 | CH_A = 0, |
@@ -385,6 +393,7 @@ struct nozomi { | |||
385 | spinlock_t spin_mutex; /* secures access to registers and tty */ | 393 | spinlock_t spin_mutex; /* secures access to registers and tty */ |
386 | 394 | ||
387 | unsigned int index_start; | 395 | unsigned int index_start; |
396 | enum card_state state; | ||
388 | u32 open_ttys; | 397 | u32 open_ttys; |
389 | }; | 398 | }; |
390 | 399 | ||
@@ -686,6 +695,7 @@ static int nozomi_read_config_table(struct nozomi *dc) | |||
686 | dc->last_ier = dc->last_ier | CTRL_DL; | 695 | dc->last_ier = dc->last_ier | CTRL_DL; |
687 | writew(dc->last_ier, dc->reg_ier); | 696 | writew(dc->last_ier, dc->reg_ier); |
688 | 697 | ||
698 | dc->state = NOZOMI_STATE_ALLOCATED; | ||
689 | dev_info(&dc->pdev->dev, "Initialization OK!\n"); | 699 | dev_info(&dc->pdev->dev, "Initialization OK!\n"); |
690 | return 1; | 700 | return 1; |
691 | } | 701 | } |
@@ -944,6 +954,14 @@ static int receive_flow_control(struct nozomi *dc) | |||
944 | case CTRL_APP2: | 954 | case CTRL_APP2: |
945 | port = PORT_APP2; | 955 | port = PORT_APP2; |
946 | enable_ier = APP2_DL; | 956 | enable_ier = APP2_DL; |
957 | if (dc->state == NOZOMI_STATE_ALLOCATED) { | ||
958 | /* | ||
959 | * After card initialization the flow control | ||
960 | * received for APP2 is always the last | ||
961 | */ | ||
962 | dc->state = NOZOMI_STATE_READY; | ||
963 | dev_info(&dc->pdev->dev, "Device READY!\n"); | ||
964 | } | ||
947 | break; | 965 | break; |
948 | default: | 966 | default: |
949 | dev_err(&dc->pdev->dev, | 967 | dev_err(&dc->pdev->dev, |
@@ -1366,22 +1384,12 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev, | |||
1366 | 1384 | ||
1367 | dc->pdev = pdev; | 1385 | dc->pdev = pdev; |
1368 | 1386 | ||
1369 | /* Find out what card type it is */ | ||
1370 | nozomi_get_card_type(dc); | ||
1371 | |||
1372 | ret = pci_enable_device(dc->pdev); | 1387 | ret = pci_enable_device(dc->pdev); |
1373 | if (ret) { | 1388 | if (ret) { |
1374 | dev_err(&pdev->dev, "Failed to enable PCI Device\n"); | 1389 | dev_err(&pdev->dev, "Failed to enable PCI Device\n"); |
1375 | goto err_free; | 1390 | goto err_free; |
1376 | } | 1391 | } |
1377 | 1392 | ||
1378 | start = pci_resource_start(dc->pdev, 0); | ||
1379 | if (start == 0) { | ||
1380 | dev_err(&pdev->dev, "No I/O address for card detected\n"); | ||
1381 | ret = -ENODEV; | ||
1382 | goto err_disable_device; | ||
1383 | } | ||
1384 | |||
1385 | ret = pci_request_regions(dc->pdev, NOZOMI_NAME); | 1393 | ret = pci_request_regions(dc->pdev, NOZOMI_NAME); |
1386 | if (ret) { | 1394 | if (ret) { |
1387 | dev_err(&pdev->dev, "I/O address 0x%04x already in use\n", | 1395 | dev_err(&pdev->dev, "I/O address 0x%04x already in use\n", |
@@ -1389,6 +1397,16 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev, | |||
1389 | goto err_disable_device; | 1397 | goto err_disable_device; |
1390 | } | 1398 | } |
1391 | 1399 | ||
1400 | start = pci_resource_start(dc->pdev, 0); | ||
1401 | if (start == 0) { | ||
1402 | dev_err(&pdev->dev, "No I/O address for card detected\n"); | ||
1403 | ret = -ENODEV; | ||
1404 | goto err_rel_regs; | ||
1405 | } | ||
1406 | |||
1407 | /* Find out what card type it is */ | ||
1408 | nozomi_get_card_type(dc); | ||
1409 | |||
1392 | dc->base_addr = ioremap(start, dc->card_type); | 1410 | dc->base_addr = ioremap(start, dc->card_type); |
1393 | if (!dc->base_addr) { | 1411 | if (!dc->base_addr) { |
1394 | dev_err(&pdev->dev, "Unable to map card MMIO\n"); | 1412 | dev_err(&pdev->dev, "Unable to map card MMIO\n"); |
@@ -1425,6 +1443,14 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev, | |||
1425 | dc->index_start = ndev_idx * MAX_PORT; | 1443 | dc->index_start = ndev_idx * MAX_PORT; |
1426 | ndevs[ndev_idx] = dc; | 1444 | ndevs[ndev_idx] = dc; |
1427 | 1445 | ||
1446 | pci_set_drvdata(pdev, dc); | ||
1447 | |||
1448 | /* Enable RESET interrupt */ | ||
1449 | dc->last_ier = RESET; | ||
1450 | iowrite16(dc->last_ier, dc->reg_ier); | ||
1451 | |||
1452 | dc->state = NOZOMI_STATE_ENABLED; | ||
1453 | |||
1428 | for (i = 0; i < MAX_PORT; i++) { | 1454 | for (i = 0; i < MAX_PORT; i++) { |
1429 | mutex_init(&dc->port[i].tty_sem); | 1455 | mutex_init(&dc->port[i].tty_sem); |
1430 | dc->port[i].tty_open_count = 0; | 1456 | dc->port[i].tty_open_count = 0; |
@@ -1433,12 +1459,6 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev, | |||
1433 | &pdev->dev); | 1459 | &pdev->dev); |
1434 | } | 1460 | } |
1435 | 1461 | ||
1436 | /* Enable RESET interrupt. */ | ||
1437 | dc->last_ier = RESET; | ||
1438 | writew(dc->last_ier, dc->reg_ier); | ||
1439 | |||
1440 | pci_set_drvdata(pdev, dc); | ||
1441 | |||
1442 | return 0; | 1462 | return 0; |
1443 | 1463 | ||
1444 | err_free_sbuf: | 1464 | err_free_sbuf: |
@@ -1553,7 +1573,7 @@ static int ntty_open(struct tty_struct *tty, struct file *file) | |||
1553 | struct nozomi *dc = get_dc_by_tty(tty); | 1573 | struct nozomi *dc = get_dc_by_tty(tty); |
1554 | unsigned long flags; | 1574 | unsigned long flags; |
1555 | 1575 | ||
1556 | if (!port || !dc) | 1576 | if (!port || !dc || dc->state != NOZOMI_STATE_READY) |
1557 | return -ENODEV; | 1577 | return -ENODEV; |
1558 | 1578 | ||
1559 | if (mutex_lock_interruptible(&port->tty_sem)) | 1579 | if (mutex_lock_interruptible(&port->tty_sem)) |
@@ -1716,6 +1736,10 @@ static int ntty_tiocmget(struct tty_struct *tty, struct file *file) | |||
1716 | static int ntty_tiocmset(struct tty_struct *tty, struct file *file, | 1736 | static int ntty_tiocmset(struct tty_struct *tty, struct file *file, |
1717 | unsigned int set, unsigned int clear) | 1737 | unsigned int set, unsigned int clear) |
1718 | { | 1738 | { |
1739 | struct nozomi *dc = get_dc_by_tty(tty); | ||
1740 | unsigned long flags; | ||
1741 | |||
1742 | spin_lock_irqsave(&dc->spin_mutex, flags); | ||
1719 | if (set & TIOCM_RTS) | 1743 | if (set & TIOCM_RTS) |
1720 | set_rts(tty, 1); | 1744 | set_rts(tty, 1); |
1721 | else if (clear & TIOCM_RTS) | 1745 | else if (clear & TIOCM_RTS) |
@@ -1725,6 +1749,7 @@ static int ntty_tiocmset(struct tty_struct *tty, struct file *file, | |||
1725 | set_dtr(tty, 1); | 1749 | set_dtr(tty, 1); |
1726 | else if (clear & TIOCM_DTR) | 1750 | else if (clear & TIOCM_DTR) |
1727 | set_dtr(tty, 0); | 1751 | set_dtr(tty, 0); |
1752 | spin_unlock_irqrestore(&dc->spin_mutex, flags); | ||
1728 | 1753 | ||
1729 | return 0; | 1754 | return 0; |
1730 | } | 1755 | } |
@@ -1762,7 +1787,7 @@ static int ntty_ioctl_tiocgicount(struct port *port, void __user *argp) | |||
1762 | icount.brk = cnow.brk; | 1787 | icount.brk = cnow.brk; |
1763 | icount.buf_overrun = cnow.buf_overrun; | 1788 | icount.buf_overrun = cnow.buf_overrun; |
1764 | 1789 | ||
1765 | return copy_to_user(argp, &icount, sizeof(icount)); | 1790 | return copy_to_user(argp, &icount, sizeof(icount)) ? -EFAULT : 0; |
1766 | } | 1791 | } |
1767 | 1792 | ||
1768 | static int ntty_ioctl(struct tty_struct *tty, struct file *file, | 1793 | static int ntty_ioctl(struct tty_struct *tty, struct file *file, |
diff --git a/drivers/char/pcmcia/ipwireless/network.c b/drivers/char/pcmcia/ipwireless/network.c index ff35230058d3..d793e68b3e0d 100644 --- a/drivers/char/pcmcia/ipwireless/network.c +++ b/drivers/char/pcmcia/ipwireless/network.c | |||
@@ -377,13 +377,16 @@ void ipwireless_network_packet_received(struct ipw_network *network, | |||
377 | for (i = 0; i < MAX_ASSOCIATED_TTYS; i++) { | 377 | for (i = 0; i < MAX_ASSOCIATED_TTYS; i++) { |
378 | struct ipw_tty *tty = network->associated_ttys[channel_idx][i]; | 378 | struct ipw_tty *tty = network->associated_ttys[channel_idx][i]; |
379 | 379 | ||
380 | if (!tty) | ||
381 | continue; | ||
382 | |||
380 | /* | 383 | /* |
381 | * If it's associated with a tty (other than the RAS channel | 384 | * If it's associated with a tty (other than the RAS channel |
382 | * when we're online), then send the data to that tty. The RAS | 385 | * when we're online), then send the data to that tty. The RAS |
383 | * channel's data is handled above - it always goes through | 386 | * channel's data is handled above - it always goes through |
384 | * ppp_generic. | 387 | * ppp_generic. |
385 | */ | 388 | */ |
386 | if (tty && channel_idx == IPW_CHANNEL_RAS | 389 | if (channel_idx == IPW_CHANNEL_RAS |
387 | && (network->ras_control_lines & | 390 | && (network->ras_control_lines & |
388 | IPW_CONTROL_LINE_DCD) != 0 | 391 | IPW_CONTROL_LINE_DCD) != 0 |
389 | && ipwireless_tty_is_modem(tty)) { | 392 | && ipwireless_tty_is_modem(tty)) { |
diff --git a/drivers/char/riscom8.c b/drivers/char/riscom8.c index 8fc4fe4e38f1..3f9d0a9ac36d 100644 --- a/drivers/char/riscom8.c +++ b/drivers/char/riscom8.c | |||
@@ -1620,14 +1620,8 @@ static int __init rc_init_drivers(void) | |||
1620 | 1620 | ||
1621 | static void rc_release_drivers(void) | 1621 | static void rc_release_drivers(void) |
1622 | { | 1622 | { |
1623 | unsigned long flags; | ||
1624 | |||
1625 | spin_lock_irqsave(&riscom_lock, flags); | ||
1626 | |||
1627 | tty_unregister_driver(riscom_driver); | 1623 | tty_unregister_driver(riscom_driver); |
1628 | put_tty_driver(riscom_driver); | 1624 | put_tty_driver(riscom_driver); |
1629 | |||
1630 | spin_unlock_irqrestore(&riscom_lock, flags); | ||
1631 | } | 1625 | } |
1632 | 1626 | ||
1633 | #ifndef MODULE | 1627 | #ifndef MODULE |
@@ -1715,7 +1709,7 @@ static int __init riscom8_init_module (void) | |||
1715 | 1709 | ||
1716 | if (iobase || iobase1 || iobase2 || iobase3) { | 1710 | if (iobase || iobase1 || iobase2 || iobase3) { |
1717 | for(i = 0; i < RC_NBOARD; i++) | 1711 | for(i = 0; i < RC_NBOARD; i++) |
1718 | rc_board[0].base = 0; | 1712 | rc_board[i].base = 0; |
1719 | } | 1713 | } |
1720 | 1714 | ||
1721 | if (iobase) | 1715 | if (iobase) |
diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c index 78b151c4d20f..5c3142b6f1fc 100644 --- a/drivers/char/rtc.c +++ b/drivers/char/rtc.c | |||
@@ -110,8 +110,8 @@ static int rtc_has_irq = 1; | |||
110 | #define hpet_set_rtc_irq_bit(arg) 0 | 110 | #define hpet_set_rtc_irq_bit(arg) 0 |
111 | #define hpet_rtc_timer_init() do { } while (0) | 111 | #define hpet_rtc_timer_init() do { } while (0) |
112 | #define hpet_rtc_dropped_irq() 0 | 112 | #define hpet_rtc_dropped_irq() 0 |
113 | #define hpet_register_irq_handler(h) 0 | 113 | #define hpet_register_irq_handler(h) ({ 0; }) |
114 | #define hpet_unregister_irq_handler(h) 0 | 114 | #define hpet_unregister_irq_handler(h) ({ 0; }) |
115 | #ifdef RTC_IRQ | 115 | #ifdef RTC_IRQ |
116 | static irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id) | 116 | static irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id) |
117 | { | 117 | { |
diff --git a/drivers/char/specialix.c b/drivers/char/specialix.c index c0e08c7bca2f..5ff83df67b44 100644 --- a/drivers/char/specialix.c +++ b/drivers/char/specialix.c | |||
@@ -2109,7 +2109,6 @@ static void sx_throttle(struct tty_struct * tty) | |||
2109 | sx_out(bp, CD186x_CAR, port_No(port)); | 2109 | sx_out(bp, CD186x_CAR, port_No(port)); |
2110 | spin_unlock_irqrestore(&bp->lock, flags); | 2110 | spin_unlock_irqrestore(&bp->lock, flags); |
2111 | if (I_IXOFF(tty)) { | 2111 | if (I_IXOFF(tty)) { |
2112 | spin_unlock_irqrestore(&bp->lock, flags); | ||
2113 | sx_wait_CCR(bp); | 2112 | sx_wait_CCR(bp); |
2114 | spin_lock_irqsave(&bp->lock, flags); | 2113 | spin_lock_irqsave(&bp->lock, flags); |
2115 | sx_out(bp, CD186x_CCR, CCR_SSCH2); | 2114 | sx_out(bp, CD186x_CCR, CCR_SSCH2); |
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index 367be9175061..9b58b894f823 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
@@ -702,6 +702,7 @@ void redraw_screen(struct vc_data *vc, int is_switch) | |||
702 | if (is_switch) { | 702 | if (is_switch) { |
703 | set_leds(); | 703 | set_leds(); |
704 | compute_shiftstate(); | 704 | compute_shiftstate(); |
705 | notify_update(vc); | ||
705 | } | 706 | } |
706 | } | 707 | } |
707 | 708 | ||
diff --git a/drivers/char/xilinx_hwicap/buffer_icap.c b/drivers/char/xilinx_hwicap/buffer_icap.c index dfea2bde162b..f577daedb630 100644 --- a/drivers/char/xilinx_hwicap/buffer_icap.c +++ b/drivers/char/xilinx_hwicap/buffer_icap.c | |||
@@ -73,8 +73,8 @@ | |||
73 | #define XHI_BUFFER_START 0 | 73 | #define XHI_BUFFER_START 0 |
74 | 74 | ||
75 | /** | 75 | /** |
76 | * buffer_icap_get_status: Get the contents of the status register. | 76 | * buffer_icap_get_status - Get the contents of the status register. |
77 | * @parameter base_address: is the base address of the device | 77 | * @base_address: is the base address of the device |
78 | * | 78 | * |
79 | * The status register contains the ICAP status and the done bit. | 79 | * The status register contains the ICAP status and the done bit. |
80 | * | 80 | * |
@@ -94,9 +94,9 @@ static inline u32 buffer_icap_get_status(void __iomem *base_address) | |||
94 | } | 94 | } |
95 | 95 | ||
96 | /** | 96 | /** |
97 | * buffer_icap_get_bram: Reads data from the storage buffer bram. | 97 | * buffer_icap_get_bram - Reads data from the storage buffer bram. |
98 | * @parameter base_address: contains the base address of the component. | 98 | * @base_address: contains the base address of the component. |
99 | * @parameter offset: The word offset from which the data should be read. | 99 | * @offset: The word offset from which the data should be read. |
100 | * | 100 | * |
101 | * A bram is used as a configuration memory cache. One frame of data can | 101 | * A bram is used as a configuration memory cache. One frame of data can |
102 | * be stored in this "storage buffer". | 102 | * be stored in this "storage buffer". |
@@ -108,8 +108,8 @@ static inline u32 buffer_icap_get_bram(void __iomem *base_address, | |||
108 | } | 108 | } |
109 | 109 | ||
110 | /** | 110 | /** |
111 | * buffer_icap_busy: Return true if the icap device is busy | 111 | * buffer_icap_busy - Return true if the icap device is busy |
112 | * @parameter base_address: is the base address of the device | 112 | * @base_address: is the base address of the device |
113 | * | 113 | * |
114 | * The queries the low order bit of the status register, which | 114 | * The queries the low order bit of the status register, which |
115 | * indicates whether the current configuration or readback operation | 115 | * indicates whether the current configuration or readback operation |
@@ -121,8 +121,8 @@ static inline bool buffer_icap_busy(void __iomem *base_address) | |||
121 | } | 121 | } |
122 | 122 | ||
123 | /** | 123 | /** |
124 | * buffer_icap_busy: Return true if the icap device is not busy | 124 | * buffer_icap_busy - Return true if the icap device is not busy |
125 | * @parameter base_address: is the base address of the device | 125 | * @base_address: is the base address of the device |
126 | * | 126 | * |
127 | * The queries the low order bit of the status register, which | 127 | * The queries the low order bit of the status register, which |
128 | * indicates whether the current configuration or readback operation | 128 | * indicates whether the current configuration or readback operation |
@@ -134,9 +134,9 @@ static inline bool buffer_icap_done(void __iomem *base_address) | |||
134 | } | 134 | } |
135 | 135 | ||
136 | /** | 136 | /** |
137 | * buffer_icap_set_size: Set the size register. | 137 | * buffer_icap_set_size - Set the size register. |
138 | * @parameter base_address: is the base address of the device | 138 | * @base_address: is the base address of the device |
139 | * @parameter data: The size in bytes. | 139 | * @data: The size in bytes. |
140 | * | 140 | * |
141 | * The size register holds the number of 8 bit bytes to transfer between | 141 | * The size register holds the number of 8 bit bytes to transfer between |
142 | * bram and the icap (or icap to bram). | 142 | * bram and the icap (or icap to bram). |
@@ -148,9 +148,9 @@ static inline void buffer_icap_set_size(void __iomem *base_address, | |||
148 | } | 148 | } |
149 | 149 | ||
150 | /** | 150 | /** |
151 | * buffer_icap_mSetoffsetReg: Set the bram offset register. | 151 | * buffer_icap_set_offset - Set the bram offset register. |
152 | * @parameter base_address: contains the base address of the device. | 152 | * @base_address: contains the base address of the device. |
153 | * @parameter data: is the value to be written to the data register. | 153 | * @data: is the value to be written to the data register. |
154 | * | 154 | * |
155 | * The bram offset register holds the starting bram address to transfer | 155 | * The bram offset register holds the starting bram address to transfer |
156 | * data from during configuration or write data to during readback. | 156 | * data from during configuration or write data to during readback. |
@@ -162,9 +162,9 @@ static inline void buffer_icap_set_offset(void __iomem *base_address, | |||
162 | } | 162 | } |
163 | 163 | ||
164 | /** | 164 | /** |
165 | * buffer_icap_set_rnc: Set the RNC (Readback not Configure) register. | 165 | * buffer_icap_set_rnc - Set the RNC (Readback not Configure) register. |
166 | * @parameter base_address: contains the base address of the device. | 166 | * @base_address: contains the base address of the device. |
167 | * @parameter data: is the value to be written to the data register. | 167 | * @data: is the value to be written to the data register. |
168 | * | 168 | * |
169 | * The RNC register determines the direction of the data transfer. It | 169 | * The RNC register determines the direction of the data transfer. It |
170 | * controls whether a configuration or readback take place. Writing to | 170 | * controls whether a configuration or readback take place. Writing to |
@@ -178,10 +178,10 @@ static inline void buffer_icap_set_rnc(void __iomem *base_address, | |||
178 | } | 178 | } |
179 | 179 | ||
180 | /** | 180 | /** |
181 | * buffer_icap_set_bram: Write data to the storage buffer bram. | 181 | * buffer_icap_set_bram - Write data to the storage buffer bram. |
182 | * @parameter base_address: contains the base address of the component. | 182 | * @base_address: contains the base address of the component. |
183 | * @parameter offset: The word offset at which the data should be written. | 183 | * @offset: The word offset at which the data should be written. |
184 | * @parameter data: The value to be written to the bram offset. | 184 | * @data: The value to be written to the bram offset. |
185 | * | 185 | * |
186 | * A bram is used as a configuration memory cache. One frame of data can | 186 | * A bram is used as a configuration memory cache. One frame of data can |
187 | * be stored in this "storage buffer". | 187 | * be stored in this "storage buffer". |
@@ -193,10 +193,10 @@ static inline void buffer_icap_set_bram(void __iomem *base_address, | |||
193 | } | 193 | } |
194 | 194 | ||
195 | /** | 195 | /** |
196 | * buffer_icap_device_read: Transfer bytes from ICAP to the storage buffer. | 196 | * buffer_icap_device_read - Transfer bytes from ICAP to the storage buffer. |
197 | * @parameter drvdata: a pointer to the drvdata. | 197 | * @drvdata: a pointer to the drvdata. |
198 | * @parameter offset: The storage buffer start address. | 198 | * @offset: The storage buffer start address. |
199 | * @parameter count: The number of words (32 bit) to read from the | 199 | * @count: The number of words (32 bit) to read from the |
200 | * device (ICAP). | 200 | * device (ICAP). |
201 | **/ | 201 | **/ |
202 | static int buffer_icap_device_read(struct hwicap_drvdata *drvdata, | 202 | static int buffer_icap_device_read(struct hwicap_drvdata *drvdata, |
@@ -227,10 +227,10 @@ static int buffer_icap_device_read(struct hwicap_drvdata *drvdata, | |||
227 | }; | 227 | }; |
228 | 228 | ||
229 | /** | 229 | /** |
230 | * buffer_icap_device_write: Transfer bytes from ICAP to the storage buffer. | 230 | * buffer_icap_device_write - Transfer bytes from ICAP to the storage buffer. |
231 | * @parameter drvdata: a pointer to the drvdata. | 231 | * @drvdata: a pointer to the drvdata. |
232 | * @parameter offset: The storage buffer start address. | 232 | * @offset: The storage buffer start address. |
233 | * @parameter count: The number of words (32 bit) to read from the | 233 | * @count: The number of words (32 bit) to read from the |
234 | * device (ICAP). | 234 | * device (ICAP). |
235 | **/ | 235 | **/ |
236 | static int buffer_icap_device_write(struct hwicap_drvdata *drvdata, | 236 | static int buffer_icap_device_write(struct hwicap_drvdata *drvdata, |
@@ -261,8 +261,8 @@ static int buffer_icap_device_write(struct hwicap_drvdata *drvdata, | |||
261 | }; | 261 | }; |
262 | 262 | ||
263 | /** | 263 | /** |
264 | * buffer_icap_reset: Reset the logic of the icap device. | 264 | * buffer_icap_reset - Reset the logic of the icap device. |
265 | * @parameter drvdata: a pointer to the drvdata. | 265 | * @drvdata: a pointer to the drvdata. |
266 | * | 266 | * |
267 | * Writing to the status register resets the ICAP logic in an internal | 267 | * Writing to the status register resets the ICAP logic in an internal |
268 | * version of the core. For the version of the core published in EDK, | 268 | * version of the core. For the version of the core published in EDK, |
@@ -274,10 +274,10 @@ void buffer_icap_reset(struct hwicap_drvdata *drvdata) | |||
274 | } | 274 | } |
275 | 275 | ||
276 | /** | 276 | /** |
277 | * buffer_icap_set_configuration: Load a partial bitstream from system memory. | 277 | * buffer_icap_set_configuration - Load a partial bitstream from system memory. |
278 | * @parameter drvdata: a pointer to the drvdata. | 278 | * @drvdata: a pointer to the drvdata. |
279 | * @parameter data: Kernel address of the partial bitstream. | 279 | * @data: Kernel address of the partial bitstream. |
280 | * @parameter size: the size of the partial bitstream in 32 bit words. | 280 | * @size: the size of the partial bitstream in 32 bit words. |
281 | **/ | 281 | **/ |
282 | int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data, | 282 | int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data, |
283 | u32 size) | 283 | u32 size) |
@@ -333,10 +333,10 @@ int buffer_icap_set_configuration(struct hwicap_drvdata *drvdata, u32 *data, | |||
333 | }; | 333 | }; |
334 | 334 | ||
335 | /** | 335 | /** |
336 | * buffer_icap_get_configuration: Read configuration data from the device. | 336 | * buffer_icap_get_configuration - Read configuration data from the device. |
337 | * @parameter drvdata: a pointer to the drvdata. | 337 | * @drvdata: a pointer to the drvdata. |
338 | * @parameter data: Address of the data representing the partial bitstream | 338 | * @data: Address of the data representing the partial bitstream |
339 | * @parameter size: the size of the partial bitstream in 32 bit words. | 339 | * @size: the size of the partial bitstream in 32 bit words. |
340 | **/ | 340 | **/ |
341 | int buffer_icap_get_configuration(struct hwicap_drvdata *drvdata, u32 *data, | 341 | int buffer_icap_get_configuration(struct hwicap_drvdata *drvdata, u32 *data, |
342 | u32 size) | 342 | u32 size) |
diff --git a/drivers/char/xilinx_hwicap/fifo_icap.c b/drivers/char/xilinx_hwicap/fifo_icap.c index 0988314694a6..6f45dbd47125 100644 --- a/drivers/char/xilinx_hwicap/fifo_icap.c +++ b/drivers/char/xilinx_hwicap/fifo_icap.c | |||
@@ -94,9 +94,9 @@ | |||
94 | 94 | ||
95 | 95 | ||
96 | /** | 96 | /** |
97 | * fifo_icap_fifo_write: Write data to the write FIFO. | 97 | * fifo_icap_fifo_write - Write data to the write FIFO. |
98 | * @parameter drvdata: a pointer to the drvdata. | 98 | * @drvdata: a pointer to the drvdata. |
99 | * @parameter data: the 32-bit value to be written to the FIFO. | 99 | * @data: the 32-bit value to be written to the FIFO. |
100 | * | 100 | * |
101 | * This function will silently fail if the fifo is full. | 101 | * This function will silently fail if the fifo is full. |
102 | **/ | 102 | **/ |
@@ -108,8 +108,8 @@ static inline void fifo_icap_fifo_write(struct hwicap_drvdata *drvdata, | |||
108 | } | 108 | } |
109 | 109 | ||
110 | /** | 110 | /** |
111 | * fifo_icap_fifo_read: Read data from the Read FIFO. | 111 | * fifo_icap_fifo_read - Read data from the Read FIFO. |
112 | * @parameter drvdata: a pointer to the drvdata. | 112 | * @drvdata: a pointer to the drvdata. |
113 | * | 113 | * |
114 | * This function will silently fail if the fifo is empty. | 114 | * This function will silently fail if the fifo is empty. |
115 | **/ | 115 | **/ |
@@ -121,9 +121,9 @@ static inline u32 fifo_icap_fifo_read(struct hwicap_drvdata *drvdata) | |||
121 | } | 121 | } |
122 | 122 | ||
123 | /** | 123 | /** |
124 | * fifo_icap_set_read_size: Set the the size register. | 124 | * fifo_icap_set_read_size - Set the the size register. |
125 | * @parameter drvdata: a pointer to the drvdata. | 125 | * @drvdata: a pointer to the drvdata. |
126 | * @parameter data: the size of the following read transaction, in words. | 126 | * @data: the size of the following read transaction, in words. |
127 | **/ | 127 | **/ |
128 | static inline void fifo_icap_set_read_size(struct hwicap_drvdata *drvdata, | 128 | static inline void fifo_icap_set_read_size(struct hwicap_drvdata *drvdata, |
129 | u32 data) | 129 | u32 data) |
@@ -132,8 +132,8 @@ static inline void fifo_icap_set_read_size(struct hwicap_drvdata *drvdata, | |||
132 | } | 132 | } |
133 | 133 | ||
134 | /** | 134 | /** |
135 | * fifo_icap_start_config: Initiate a configuration (write) to the device. | 135 | * fifo_icap_start_config - Initiate a configuration (write) to the device. |
136 | * @parameter drvdata: a pointer to the drvdata. | 136 | * @drvdata: a pointer to the drvdata. |
137 | **/ | 137 | **/ |
138 | static inline void fifo_icap_start_config(struct hwicap_drvdata *drvdata) | 138 | static inline void fifo_icap_start_config(struct hwicap_drvdata *drvdata) |
139 | { | 139 | { |
@@ -142,8 +142,8 @@ static inline void fifo_icap_start_config(struct hwicap_drvdata *drvdata) | |||
142 | } | 142 | } |
143 | 143 | ||
144 | /** | 144 | /** |
145 | * fifo_icap_start_readback: Initiate a readback from the device. | 145 | * fifo_icap_start_readback - Initiate a readback from the device. |
146 | * @parameter drvdata: a pointer to the drvdata. | 146 | * @drvdata: a pointer to the drvdata. |
147 | **/ | 147 | **/ |
148 | static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata) | 148 | static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata) |
149 | { | 149 | { |
@@ -152,8 +152,8 @@ static inline void fifo_icap_start_readback(struct hwicap_drvdata *drvdata) | |||
152 | } | 152 | } |
153 | 153 | ||
154 | /** | 154 | /** |
155 | * fifo_icap_busy: Return true if the ICAP is still processing a transaction. | 155 | * fifo_icap_busy - Return true if the ICAP is still processing a transaction. |
156 | * @parameter drvdata: a pointer to the drvdata. | 156 | * @drvdata: a pointer to the drvdata. |
157 | **/ | 157 | **/ |
158 | static inline u32 fifo_icap_busy(struct hwicap_drvdata *drvdata) | 158 | static inline u32 fifo_icap_busy(struct hwicap_drvdata *drvdata) |
159 | { | 159 | { |
@@ -163,8 +163,8 @@ static inline u32 fifo_icap_busy(struct hwicap_drvdata *drvdata) | |||
163 | } | 163 | } |
164 | 164 | ||
165 | /** | 165 | /** |
166 | * fifo_icap_write_fifo_vacancy: Query the write fifo available space. | 166 | * fifo_icap_write_fifo_vacancy - Query the write fifo available space. |
167 | * @parameter drvdata: a pointer to the drvdata. | 167 | * @drvdata: a pointer to the drvdata. |
168 | * | 168 | * |
169 | * Return the number of words that can be safely pushed into the write fifo. | 169 | * Return the number of words that can be safely pushed into the write fifo. |
170 | **/ | 170 | **/ |
@@ -175,8 +175,8 @@ static inline u32 fifo_icap_write_fifo_vacancy( | |||
175 | } | 175 | } |
176 | 176 | ||
177 | /** | 177 | /** |
178 | * fifo_icap_read_fifo_occupancy: Query the read fifo available data. | 178 | * fifo_icap_read_fifo_occupancy - Query the read fifo available data. |
179 | * @parameter drvdata: a pointer to the drvdata. | 179 | * @drvdata: a pointer to the drvdata. |
180 | * | 180 | * |
181 | * Return the number of words that can be safely read from the read fifo. | 181 | * Return the number of words that can be safely read from the read fifo. |
182 | **/ | 182 | **/ |
@@ -187,11 +187,11 @@ static inline u32 fifo_icap_read_fifo_occupancy( | |||
187 | } | 187 | } |
188 | 188 | ||
189 | /** | 189 | /** |
190 | * fifo_icap_set_configuration: Send configuration data to the ICAP. | 190 | * fifo_icap_set_configuration - Send configuration data to the ICAP. |
191 | * @parameter drvdata: a pointer to the drvdata. | 191 | * @drvdata: a pointer to the drvdata. |
192 | * @parameter frame_buffer: a pointer to the data to be written to the | 192 | * @frame_buffer: a pointer to the data to be written to the |
193 | * ICAP device. | 193 | * ICAP device. |
194 | * @parameter num_words: the number of words (32 bit) to write to the ICAP | 194 | * @num_words: the number of words (32 bit) to write to the ICAP |
195 | * device. | 195 | * device. |
196 | 196 | ||
197 | * This function writes the given user data to the Write FIFO in | 197 | * This function writes the given user data to the Write FIFO in |
@@ -266,10 +266,10 @@ int fifo_icap_set_configuration(struct hwicap_drvdata *drvdata, | |||
266 | } | 266 | } |
267 | 267 | ||
268 | /** | 268 | /** |
269 | * fifo_icap_get_configuration: Read configuration data from the device. | 269 | * fifo_icap_get_configuration - Read configuration data from the device. |
270 | * @parameter drvdata: a pointer to the drvdata. | 270 | * @drvdata: a pointer to the drvdata. |
271 | * @parameter data: Address of the data representing the partial bitstream | 271 | * @data: Address of the data representing the partial bitstream |
272 | * @parameter size: the size of the partial bitstream in 32 bit words. | 272 | * @size: the size of the partial bitstream in 32 bit words. |
273 | * | 273 | * |
274 | * This function reads the specified number of words from the ICAP device in | 274 | * This function reads the specified number of words from the ICAP device in |
275 | * the polled mode. | 275 | * the polled mode. |
@@ -335,8 +335,8 @@ int fifo_icap_get_configuration(struct hwicap_drvdata *drvdata, | |||
335 | } | 335 | } |
336 | 336 | ||
337 | /** | 337 | /** |
338 | * buffer_icap_reset: Reset the logic of the icap device. | 338 | * buffer_icap_reset - Reset the logic of the icap device. |
339 | * @parameter drvdata: a pointer to the drvdata. | 339 | * @drvdata: a pointer to the drvdata. |
340 | * | 340 | * |
341 | * This function forces the software reset of the complete HWICAP device. | 341 | * This function forces the software reset of the complete HWICAP device. |
342 | * All the registers will return to the default value and the FIFO is also | 342 | * All the registers will return to the default value and the FIFO is also |
@@ -360,8 +360,8 @@ void fifo_icap_reset(struct hwicap_drvdata *drvdata) | |||
360 | } | 360 | } |
361 | 361 | ||
362 | /** | 362 | /** |
363 | * fifo_icap_flush_fifo: This function flushes the FIFOs in the device. | 363 | * fifo_icap_flush_fifo - This function flushes the FIFOs in the device. |
364 | * @parameter drvdata: a pointer to the drvdata. | 364 | * @drvdata: a pointer to the drvdata. |
365 | */ | 365 | */ |
366 | void fifo_icap_flush_fifo(struct hwicap_drvdata *drvdata) | 366 | void fifo_icap_flush_fifo(struct hwicap_drvdata *drvdata) |
367 | { | 367 | { |
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c index 24f6aef0fd3c..2284fa2a5a57 100644 --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c | |||
@@ -84,7 +84,7 @@ | |||
84 | #include <linux/init.h> | 84 | #include <linux/init.h> |
85 | #include <linux/poll.h> | 85 | #include <linux/poll.h> |
86 | #include <linux/proc_fs.h> | 86 | #include <linux/proc_fs.h> |
87 | #include <asm/semaphore.h> | 87 | #include <linux/mutex.h> |
88 | #include <linux/sysctl.h> | 88 | #include <linux/sysctl.h> |
89 | #include <linux/version.h> | 89 | #include <linux/version.h> |
90 | #include <linux/fs.h> | 90 | #include <linux/fs.h> |
@@ -119,6 +119,7 @@ module_param(xhwicap_minor, int, S_IRUGO); | |||
119 | 119 | ||
120 | /* An array, which is set to true when the device is registered. */ | 120 | /* An array, which is set to true when the device is registered. */ |
121 | static bool probed_devices[HWICAP_DEVICES]; | 121 | static bool probed_devices[HWICAP_DEVICES]; |
122 | static struct mutex icap_sem; | ||
122 | 123 | ||
123 | static struct class *icap_class; | 124 | static struct class *icap_class; |
124 | 125 | ||
@@ -199,14 +200,14 @@ static const struct config_registers v5_config_registers = { | |||
199 | }; | 200 | }; |
200 | 201 | ||
201 | /** | 202 | /** |
202 | * hwicap_command_desync: Send a DESYNC command to the ICAP port. | 203 | * hwicap_command_desync - Send a DESYNC command to the ICAP port. |
203 | * @parameter drvdata: a pointer to the drvdata. | 204 | * @drvdata: a pointer to the drvdata. |
204 | * | 205 | * |
205 | * This command desynchronizes the ICAP After this command, a | 206 | * This command desynchronizes the ICAP After this command, a |
206 | * bitstream containing a NULL packet, followed by a SYNCH packet is | 207 | * bitstream containing a NULL packet, followed by a SYNCH packet is |
207 | * required before the ICAP will recognize commands. | 208 | * required before the ICAP will recognize commands. |
208 | */ | 209 | */ |
209 | int hwicap_command_desync(struct hwicap_drvdata *drvdata) | 210 | static int hwicap_command_desync(struct hwicap_drvdata *drvdata) |
210 | { | 211 | { |
211 | u32 buffer[4]; | 212 | u32 buffer[4]; |
212 | u32 index = 0; | 213 | u32 index = 0; |
@@ -228,51 +229,18 @@ int hwicap_command_desync(struct hwicap_drvdata *drvdata) | |||
228 | } | 229 | } |
229 | 230 | ||
230 | /** | 231 | /** |
231 | * hwicap_command_capture: Send a CAPTURE command to the ICAP port. | 232 | * hwicap_get_configuration_register - Query a configuration register. |
232 | * @parameter drvdata: a pointer to the drvdata. | 233 | * @drvdata: a pointer to the drvdata. |
233 | * | 234 | * @reg: a constant which represents the configuration |
234 | * This command captures all of the flip flop states so they will be | ||
235 | * available during readback. One can use this command instead of | ||
236 | * enabling the CAPTURE block in the design. | ||
237 | */ | ||
238 | int hwicap_command_capture(struct hwicap_drvdata *drvdata) | ||
239 | { | ||
240 | u32 buffer[7]; | ||
241 | u32 index = 0; | ||
242 | |||
243 | /* | ||
244 | * Create the data to be written to the ICAP. | ||
245 | */ | ||
246 | buffer[index++] = XHI_DUMMY_PACKET; | ||
247 | buffer[index++] = XHI_SYNC_PACKET; | ||
248 | buffer[index++] = XHI_NOOP_PACKET; | ||
249 | buffer[index++] = hwicap_type_1_write(drvdata->config_regs->CMD) | 1; | ||
250 | buffer[index++] = XHI_CMD_GCAPTURE; | ||
251 | buffer[index++] = XHI_DUMMY_PACKET; | ||
252 | buffer[index++] = XHI_DUMMY_PACKET; | ||
253 | |||
254 | /* | ||
255 | * Write the data to the FIFO and intiate the transfer of data | ||
256 | * present in the FIFO to the ICAP device. | ||
257 | */ | ||
258 | return drvdata->config->set_configuration(drvdata, | ||
259 | &buffer[0], index); | ||
260 | |||
261 | } | ||
262 | |||
263 | /** | ||
264 | * hwicap_get_configuration_register: Query a configuration register. | ||
265 | * @parameter drvdata: a pointer to the drvdata. | ||
266 | * @parameter reg: a constant which represents the configuration | ||
267 | * register value to be returned. | 235 | * register value to be returned. |
268 | * Examples: XHI_IDCODE, XHI_FLR. | 236 | * Examples: XHI_IDCODE, XHI_FLR. |
269 | * @parameter RegData: returns the value of the register. | 237 | * @reg_data: returns the value of the register. |
270 | * | 238 | * |
271 | * Sends a query packet to the ICAP and then receives the response. | 239 | * Sends a query packet to the ICAP and then receives the response. |
272 | * The icap is left in Synched state. | 240 | * The icap is left in Synched state. |
273 | */ | 241 | */ |
274 | int hwicap_get_configuration_register(struct hwicap_drvdata *drvdata, | 242 | static int hwicap_get_configuration_register(struct hwicap_drvdata *drvdata, |
275 | u32 reg, u32 *RegData) | 243 | u32 reg, u32 *reg_data) |
276 | { | 244 | { |
277 | int status; | 245 | int status; |
278 | u32 buffer[6]; | 246 | u32 buffer[6]; |
@@ -300,14 +268,14 @@ int hwicap_get_configuration_register(struct hwicap_drvdata *drvdata, | |||
300 | /* | 268 | /* |
301 | * Read the configuration register | 269 | * Read the configuration register |
302 | */ | 270 | */ |
303 | status = drvdata->config->get_configuration(drvdata, RegData, 1); | 271 | status = drvdata->config->get_configuration(drvdata, reg_data, 1); |
304 | if (status) | 272 | if (status) |
305 | return status; | 273 | return status; |
306 | 274 | ||
307 | return 0; | 275 | return 0; |
308 | } | 276 | } |
309 | 277 | ||
310 | int hwicap_initialize_hwicap(struct hwicap_drvdata *drvdata) | 278 | static int hwicap_initialize_hwicap(struct hwicap_drvdata *drvdata) |
311 | { | 279 | { |
312 | int status; | 280 | int status; |
313 | u32 idcode; | 281 | u32 idcode; |
@@ -344,7 +312,7 @@ int hwicap_initialize_hwicap(struct hwicap_drvdata *drvdata) | |||
344 | } | 312 | } |
345 | 313 | ||
346 | static ssize_t | 314 | static ssize_t |
347 | hwicap_read(struct file *file, char *buf, size_t count, loff_t *ppos) | 315 | hwicap_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) |
348 | { | 316 | { |
349 | struct hwicap_drvdata *drvdata = file->private_data; | 317 | struct hwicap_drvdata *drvdata = file->private_data; |
350 | ssize_t bytes_to_read = 0; | 318 | ssize_t bytes_to_read = 0; |
@@ -353,8 +321,9 @@ hwicap_read(struct file *file, char *buf, size_t count, loff_t *ppos) | |||
353 | u32 bytes_remaining; | 321 | u32 bytes_remaining; |
354 | int status; | 322 | int status; |
355 | 323 | ||
356 | if (down_interruptible(&drvdata->sem)) | 324 | status = mutex_lock_interruptible(&drvdata->sem); |
357 | return -ERESTARTSYS; | 325 | if (status) |
326 | return status; | ||
358 | 327 | ||
359 | if (drvdata->read_buffer_in_use) { | 328 | if (drvdata->read_buffer_in_use) { |
360 | /* If there are leftover bytes in the buffer, just */ | 329 | /* If there are leftover bytes in the buffer, just */ |
@@ -370,8 +339,9 @@ hwicap_read(struct file *file, char *buf, size_t count, loff_t *ppos) | |||
370 | goto error; | 339 | goto error; |
371 | } | 340 | } |
372 | drvdata->read_buffer_in_use -= bytes_to_read; | 341 | drvdata->read_buffer_in_use -= bytes_to_read; |
373 | memcpy(drvdata->read_buffer + bytes_to_read, | 342 | memmove(drvdata->read_buffer, |
374 | drvdata->read_buffer, 4 - bytes_to_read); | 343 | drvdata->read_buffer + bytes_to_read, |
344 | 4 - bytes_to_read); | ||
375 | } else { | 345 | } else { |
376 | /* Get new data from the ICAP, and return was was requested. */ | 346 | /* Get new data from the ICAP, and return was was requested. */ |
377 | kbuf = (u32 *) get_zeroed_page(GFP_KERNEL); | 347 | kbuf = (u32 *) get_zeroed_page(GFP_KERNEL); |
@@ -414,18 +384,20 @@ hwicap_read(struct file *file, char *buf, size_t count, loff_t *ppos) | |||
414 | status = -EFAULT; | 384 | status = -EFAULT; |
415 | goto error; | 385 | goto error; |
416 | } | 386 | } |
417 | memcpy(kbuf, drvdata->read_buffer, bytes_remaining); | 387 | memcpy(drvdata->read_buffer, |
388 | kbuf, | ||
389 | bytes_remaining); | ||
418 | drvdata->read_buffer_in_use = bytes_remaining; | 390 | drvdata->read_buffer_in_use = bytes_remaining; |
419 | free_page((unsigned long)kbuf); | 391 | free_page((unsigned long)kbuf); |
420 | } | 392 | } |
421 | status = bytes_to_read; | 393 | status = bytes_to_read; |
422 | error: | 394 | error: |
423 | up(&drvdata->sem); | 395 | mutex_unlock(&drvdata->sem); |
424 | return status; | 396 | return status; |
425 | } | 397 | } |
426 | 398 | ||
427 | static ssize_t | 399 | static ssize_t |
428 | hwicap_write(struct file *file, const char *buf, | 400 | hwicap_write(struct file *file, const char __user *buf, |
429 | size_t count, loff_t *ppos) | 401 | size_t count, loff_t *ppos) |
430 | { | 402 | { |
431 | struct hwicap_drvdata *drvdata = file->private_data; | 403 | struct hwicap_drvdata *drvdata = file->private_data; |
@@ -435,8 +407,9 @@ hwicap_write(struct file *file, const char *buf, | |||
435 | ssize_t len; | 407 | ssize_t len; |
436 | ssize_t status; | 408 | ssize_t status; |
437 | 409 | ||
438 | if (down_interruptible(&drvdata->sem)) | 410 | status = mutex_lock_interruptible(&drvdata->sem); |
439 | return -ERESTARTSYS; | 411 | if (status) |
412 | return status; | ||
440 | 413 | ||
441 | left += drvdata->write_buffer_in_use; | 414 | left += drvdata->write_buffer_in_use; |
442 | 415 | ||
@@ -465,7 +438,7 @@ hwicap_write(struct file *file, const char *buf, | |||
465 | memcpy(kbuf, drvdata->write_buffer, | 438 | memcpy(kbuf, drvdata->write_buffer, |
466 | drvdata->write_buffer_in_use); | 439 | drvdata->write_buffer_in_use); |
467 | if (copy_from_user( | 440 | if (copy_from_user( |
468 | (((char *)kbuf) + (drvdata->write_buffer_in_use)), | 441 | (((char *)kbuf) + drvdata->write_buffer_in_use), |
469 | buf + written, | 442 | buf + written, |
470 | len - (drvdata->write_buffer_in_use))) { | 443 | len - (drvdata->write_buffer_in_use))) { |
471 | free_page((unsigned long)kbuf); | 444 | free_page((unsigned long)kbuf); |
@@ -508,7 +481,7 @@ hwicap_write(struct file *file, const char *buf, | |||
508 | free_page((unsigned long)kbuf); | 481 | free_page((unsigned long)kbuf); |
509 | status = written; | 482 | status = written; |
510 | error: | 483 | error: |
511 | up(&drvdata->sem); | 484 | mutex_unlock(&drvdata->sem); |
512 | return status; | 485 | return status; |
513 | } | 486 | } |
514 | 487 | ||
@@ -519,8 +492,9 @@ static int hwicap_open(struct inode *inode, struct file *file) | |||
519 | 492 | ||
520 | drvdata = container_of(inode->i_cdev, struct hwicap_drvdata, cdev); | 493 | drvdata = container_of(inode->i_cdev, struct hwicap_drvdata, cdev); |
521 | 494 | ||
522 | if (down_interruptible(&drvdata->sem)) | 495 | status = mutex_lock_interruptible(&drvdata->sem); |
523 | return -ERESTARTSYS; | 496 | if (status) |
497 | return status; | ||
524 | 498 | ||
525 | if (drvdata->is_open) { | 499 | if (drvdata->is_open) { |
526 | status = -EBUSY; | 500 | status = -EBUSY; |
@@ -539,7 +513,7 @@ static int hwicap_open(struct inode *inode, struct file *file) | |||
539 | drvdata->is_open = 1; | 513 | drvdata->is_open = 1; |
540 | 514 | ||
541 | error: | 515 | error: |
542 | up(&drvdata->sem); | 516 | mutex_unlock(&drvdata->sem); |
543 | return status; | 517 | return status; |
544 | } | 518 | } |
545 | 519 | ||
@@ -549,8 +523,7 @@ static int hwicap_release(struct inode *inode, struct file *file) | |||
549 | int i; | 523 | int i; |
550 | int status = 0; | 524 | int status = 0; |
551 | 525 | ||
552 | if (down_interruptible(&drvdata->sem)) | 526 | mutex_lock(&drvdata->sem); |
553 | return -ERESTARTSYS; | ||
554 | 527 | ||
555 | if (drvdata->write_buffer_in_use) { | 528 | if (drvdata->write_buffer_in_use) { |
556 | /* Flush write buffer. */ | 529 | /* Flush write buffer. */ |
@@ -569,7 +542,7 @@ static int hwicap_release(struct inode *inode, struct file *file) | |||
569 | 542 | ||
570 | error: | 543 | error: |
571 | drvdata->is_open = 0; | 544 | drvdata->is_open = 0; |
572 | up(&drvdata->sem); | 545 | mutex_unlock(&drvdata->sem); |
573 | return status; | 546 | return status; |
574 | } | 547 | } |
575 | 548 | ||
@@ -592,31 +565,36 @@ static int __devinit hwicap_setup(struct device *dev, int id, | |||
592 | 565 | ||
593 | dev_info(dev, "Xilinx icap port driver\n"); | 566 | dev_info(dev, "Xilinx icap port driver\n"); |
594 | 567 | ||
568 | mutex_lock(&icap_sem); | ||
569 | |||
595 | if (id < 0) { | 570 | if (id < 0) { |
596 | for (id = 0; id < HWICAP_DEVICES; id++) | 571 | for (id = 0; id < HWICAP_DEVICES; id++) |
597 | if (!probed_devices[id]) | 572 | if (!probed_devices[id]) |
598 | break; | 573 | break; |
599 | } | 574 | } |
600 | if (id < 0 || id >= HWICAP_DEVICES) { | 575 | if (id < 0 || id >= HWICAP_DEVICES) { |
576 | mutex_unlock(&icap_sem); | ||
601 | dev_err(dev, "%s%i too large\n", DRIVER_NAME, id); | 577 | dev_err(dev, "%s%i too large\n", DRIVER_NAME, id); |
602 | return -EINVAL; | 578 | return -EINVAL; |
603 | } | 579 | } |
604 | if (probed_devices[id]) { | 580 | if (probed_devices[id]) { |
581 | mutex_unlock(&icap_sem); | ||
605 | dev_err(dev, "cannot assign to %s%i; it is already in use\n", | 582 | dev_err(dev, "cannot assign to %s%i; it is already in use\n", |
606 | DRIVER_NAME, id); | 583 | DRIVER_NAME, id); |
607 | return -EBUSY; | 584 | return -EBUSY; |
608 | } | 585 | } |
609 | 586 | ||
610 | probed_devices[id] = 1; | 587 | probed_devices[id] = 1; |
588 | mutex_unlock(&icap_sem); | ||
611 | 589 | ||
612 | devt = MKDEV(xhwicap_major, xhwicap_minor + id); | 590 | devt = MKDEV(xhwicap_major, xhwicap_minor + id); |
613 | 591 | ||
614 | drvdata = kmalloc(sizeof(struct hwicap_drvdata), GFP_KERNEL); | 592 | drvdata = kzalloc(sizeof(struct hwicap_drvdata), GFP_KERNEL); |
615 | if (!drvdata) { | 593 | if (!drvdata) { |
616 | dev_err(dev, "Couldn't allocate device private record\n"); | 594 | dev_err(dev, "Couldn't allocate device private record\n"); |
617 | return -ENOMEM; | 595 | retval = -ENOMEM; |
596 | goto failed0; | ||
618 | } | 597 | } |
619 | memset((void *)drvdata, 0, sizeof(struct hwicap_drvdata)); | ||
620 | dev_set_drvdata(dev, (void *)drvdata); | 598 | dev_set_drvdata(dev, (void *)drvdata); |
621 | 599 | ||
622 | if (!regs_res) { | 600 | if (!regs_res) { |
@@ -648,7 +626,7 @@ static int __devinit hwicap_setup(struct device *dev, int id, | |||
648 | drvdata->config = config; | 626 | drvdata->config = config; |
649 | drvdata->config_regs = config_regs; | 627 | drvdata->config_regs = config_regs; |
650 | 628 | ||
651 | init_MUTEX(&drvdata->sem); | 629 | mutex_init(&drvdata->sem); |
652 | drvdata->is_open = 0; | 630 | drvdata->is_open = 0; |
653 | 631 | ||
654 | dev_info(dev, "ioremap %lx to %p with size %x\n", | 632 | dev_info(dev, "ioremap %lx to %p with size %x\n", |
@@ -663,7 +641,7 @@ static int __devinit hwicap_setup(struct device *dev, int id, | |||
663 | goto failed3; | 641 | goto failed3; |
664 | } | 642 | } |
665 | /* devfs_mk_cdev(devt, S_IFCHR|S_IRUGO|S_IWUGO, DRIVER_NAME); */ | 643 | /* devfs_mk_cdev(devt, S_IFCHR|S_IRUGO|S_IWUGO, DRIVER_NAME); */ |
666 | class_device_create(icap_class, NULL, devt, NULL, DRIVER_NAME); | 644 | device_create(icap_class, dev, devt, "%s%d", DRIVER_NAME, id); |
667 | return 0; /* success */ | 645 | return 0; /* success */ |
668 | 646 | ||
669 | failed3: | 647 | failed3: |
@@ -675,6 +653,11 @@ static int __devinit hwicap_setup(struct device *dev, int id, | |||
675 | failed1: | 653 | failed1: |
676 | kfree(drvdata); | 654 | kfree(drvdata); |
677 | 655 | ||
656 | failed0: | ||
657 | mutex_lock(&icap_sem); | ||
658 | probed_devices[id] = 0; | ||
659 | mutex_unlock(&icap_sem); | ||
660 | |||
678 | return retval; | 661 | return retval; |
679 | } | 662 | } |
680 | 663 | ||
@@ -699,14 +682,16 @@ static int __devexit hwicap_remove(struct device *dev) | |||
699 | if (!drvdata) | 682 | if (!drvdata) |
700 | return 0; | 683 | return 0; |
701 | 684 | ||
702 | class_device_destroy(icap_class, drvdata->devt); | 685 | device_destroy(icap_class, drvdata->devt); |
703 | cdev_del(&drvdata->cdev); | 686 | cdev_del(&drvdata->cdev); |
704 | iounmap(drvdata->base_address); | 687 | iounmap(drvdata->base_address); |
705 | release_mem_region(drvdata->mem_start, drvdata->mem_size); | 688 | release_mem_region(drvdata->mem_start, drvdata->mem_size); |
706 | kfree(drvdata); | 689 | kfree(drvdata); |
707 | dev_set_drvdata(dev, NULL); | 690 | dev_set_drvdata(dev, NULL); |
708 | probed_devices[MINOR(dev->devt)-xhwicap_minor] = 0; | ||
709 | 691 | ||
692 | mutex_lock(&icap_sem); | ||
693 | probed_devices[MINOR(dev->devt)-xhwicap_minor] = 0; | ||
694 | mutex_unlock(&icap_sem); | ||
710 | return 0; /* success */ | 695 | return 0; /* success */ |
711 | } | 696 | } |
712 | 697 | ||
@@ -821,28 +806,29 @@ static struct of_platform_driver hwicap_of_driver = { | |||
821 | }; | 806 | }; |
822 | 807 | ||
823 | /* Registration helpers to keep the number of #ifdefs to a minimum */ | 808 | /* Registration helpers to keep the number of #ifdefs to a minimum */ |
824 | static inline int __devinit hwicap_of_register(void) | 809 | static inline int __init hwicap_of_register(void) |
825 | { | 810 | { |
826 | pr_debug("hwicap: calling of_register_platform_driver()\n"); | 811 | pr_debug("hwicap: calling of_register_platform_driver()\n"); |
827 | return of_register_platform_driver(&hwicap_of_driver); | 812 | return of_register_platform_driver(&hwicap_of_driver); |
828 | } | 813 | } |
829 | 814 | ||
830 | static inline void __devexit hwicap_of_unregister(void) | 815 | static inline void __exit hwicap_of_unregister(void) |
831 | { | 816 | { |
832 | of_unregister_platform_driver(&hwicap_of_driver); | 817 | of_unregister_platform_driver(&hwicap_of_driver); |
833 | } | 818 | } |
834 | #else /* CONFIG_OF */ | 819 | #else /* CONFIG_OF */ |
835 | /* CONFIG_OF not enabled; do nothing helpers */ | 820 | /* CONFIG_OF not enabled; do nothing helpers */ |
836 | static inline int __devinit hwicap_of_register(void) { return 0; } | 821 | static inline int __init hwicap_of_register(void) { return 0; } |
837 | static inline void __devexit hwicap_of_unregister(void) { } | 822 | static inline void __exit hwicap_of_unregister(void) { } |
838 | #endif /* CONFIG_OF */ | 823 | #endif /* CONFIG_OF */ |
839 | 824 | ||
840 | static int __devinit hwicap_module_init(void) | 825 | static int __init hwicap_module_init(void) |
841 | { | 826 | { |
842 | dev_t devt; | 827 | dev_t devt; |
843 | int retval; | 828 | int retval; |
844 | 829 | ||
845 | icap_class = class_create(THIS_MODULE, "xilinx_config"); | 830 | icap_class = class_create(THIS_MODULE, "xilinx_config"); |
831 | mutex_init(&icap_sem); | ||
846 | 832 | ||
847 | if (xhwicap_major) { | 833 | if (xhwicap_major) { |
848 | devt = MKDEV(xhwicap_major, xhwicap_minor); | 834 | devt = MKDEV(xhwicap_major, xhwicap_minor); |
@@ -883,7 +869,7 @@ static int __devinit hwicap_module_init(void) | |||
883 | return retval; | 869 | return retval; |
884 | } | 870 | } |
885 | 871 | ||
886 | static void __devexit hwicap_module_cleanup(void) | 872 | static void __exit hwicap_module_cleanup(void) |
887 | { | 873 | { |
888 | dev_t devt = MKDEV(xhwicap_major, xhwicap_minor); | 874 | dev_t devt = MKDEV(xhwicap_major, xhwicap_minor); |
889 | 875 | ||
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.h b/drivers/char/xilinx_hwicap/xilinx_hwicap.h index ae771cac1629..405fee7e189b 100644 --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.h +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.h | |||
@@ -48,9 +48,9 @@ struct hwicap_drvdata { | |||
48 | u8 write_buffer[4]; | 48 | u8 write_buffer[4]; |
49 | u32 read_buffer_in_use; /* Always in [0,3] */ | 49 | u32 read_buffer_in_use; /* Always in [0,3] */ |
50 | u8 read_buffer[4]; | 50 | u8 read_buffer[4]; |
51 | u32 mem_start; /* phys. address of the control registers */ | 51 | resource_size_t mem_start;/* phys. address of the control registers */ |
52 | u32 mem_end; /* phys. address of the control registers */ | 52 | resource_size_t mem_end; /* phys. address of the control registers */ |
53 | u32 mem_size; | 53 | resource_size_t mem_size; |
54 | void __iomem *base_address;/* virt. address of the control registers */ | 54 | void __iomem *base_address;/* virt. address of the control registers */ |
55 | 55 | ||
56 | struct device *dev; | 56 | struct device *dev; |
@@ -61,7 +61,7 @@ struct hwicap_drvdata { | |||
61 | const struct config_registers *config_regs; | 61 | const struct config_registers *config_regs; |
62 | void *private_data; | 62 | void *private_data; |
63 | bool is_open; | 63 | bool is_open; |
64 | struct semaphore sem; | 64 | struct mutex sem; |
65 | }; | 65 | }; |
66 | 66 | ||
67 | struct hwicap_driver_config { | 67 | struct hwicap_driver_config { |
@@ -164,29 +164,29 @@ struct config_registers { | |||
164 | #define XHI_DISABLED_AUTO_CRC 0x0000DEFCUL | 164 | #define XHI_DISABLED_AUTO_CRC 0x0000DEFCUL |
165 | 165 | ||
166 | /** | 166 | /** |
167 | * hwicap_type_1_read: Generates a Type 1 read packet header. | 167 | * hwicap_type_1_read - Generates a Type 1 read packet header. |
168 | * @parameter: Register is the address of the register to be read back. | 168 | * @reg: is the address of the register to be read back. |
169 | * | 169 | * |
170 | * Generates a Type 1 read packet header, which is used to indirectly | 170 | * Generates a Type 1 read packet header, which is used to indirectly |
171 | * read registers in the configuration logic. This packet must then | 171 | * read registers in the configuration logic. This packet must then |
172 | * be sent through the icap device, and a return packet received with | 172 | * be sent through the icap device, and a return packet received with |
173 | * the information. | 173 | * the information. |
174 | **/ | 174 | **/ |
175 | static inline u32 hwicap_type_1_read(u32 Register) | 175 | static inline u32 hwicap_type_1_read(u32 reg) |
176 | { | 176 | { |
177 | return (XHI_TYPE_1 << XHI_TYPE_SHIFT) | | 177 | return (XHI_TYPE_1 << XHI_TYPE_SHIFT) | |
178 | (Register << XHI_REGISTER_SHIFT) | | 178 | (reg << XHI_REGISTER_SHIFT) | |
179 | (XHI_OP_READ << XHI_OP_SHIFT); | 179 | (XHI_OP_READ << XHI_OP_SHIFT); |
180 | } | 180 | } |
181 | 181 | ||
182 | /** | 182 | /** |
183 | * hwicap_type_1_write: Generates a Type 1 write packet header | 183 | * hwicap_type_1_write - Generates a Type 1 write packet header |
184 | * @parameter: Register is the address of the register to be read back. | 184 | * @reg: is the address of the register to be read back. |
185 | **/ | 185 | **/ |
186 | static inline u32 hwicap_type_1_write(u32 Register) | 186 | static inline u32 hwicap_type_1_write(u32 reg) |
187 | { | 187 | { |
188 | return (XHI_TYPE_1 << XHI_TYPE_SHIFT) | | 188 | return (XHI_TYPE_1 << XHI_TYPE_SHIFT) | |
189 | (Register << XHI_REGISTER_SHIFT) | | 189 | (reg << XHI_REGISTER_SHIFT) | |
190 | (XHI_OP_WRITE << XHI_OP_SHIFT); | 190 | (XHI_OP_WRITE << XHI_OP_SHIFT); |
191 | } | 191 | } |
192 | 192 | ||
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 89a29cd93783..35a26a3e5f68 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -671,13 +671,13 @@ static ssize_t show(struct kobject * kobj, struct attribute * attr ,char * buf) | |||
671 | { | 671 | { |
672 | struct cpufreq_policy * policy = to_policy(kobj); | 672 | struct cpufreq_policy * policy = to_policy(kobj); |
673 | struct freq_attr * fattr = to_attr(attr); | 673 | struct freq_attr * fattr = to_attr(attr); |
674 | ssize_t ret; | 674 | ssize_t ret = -EINVAL; |
675 | policy = cpufreq_cpu_get(policy->cpu); | 675 | policy = cpufreq_cpu_get(policy->cpu); |
676 | if (!policy) | 676 | if (!policy) |
677 | return -EINVAL; | 677 | goto no_policy; |
678 | 678 | ||
679 | if (lock_policy_rwsem_read(policy->cpu) < 0) | 679 | if (lock_policy_rwsem_read(policy->cpu) < 0) |
680 | return -EINVAL; | 680 | goto fail; |
681 | 681 | ||
682 | if (fattr->show) | 682 | if (fattr->show) |
683 | ret = fattr->show(policy, buf); | 683 | ret = fattr->show(policy, buf); |
@@ -685,8 +685,9 @@ static ssize_t show(struct kobject * kobj, struct attribute * attr ,char * buf) | |||
685 | ret = -EIO; | 685 | ret = -EIO; |
686 | 686 | ||
687 | unlock_policy_rwsem_read(policy->cpu); | 687 | unlock_policy_rwsem_read(policy->cpu); |
688 | 688 | fail: | |
689 | cpufreq_cpu_put(policy); | 689 | cpufreq_cpu_put(policy); |
690 | no_policy: | ||
690 | return ret; | 691 | return ret; |
691 | } | 692 | } |
692 | 693 | ||
@@ -695,13 +696,13 @@ static ssize_t store(struct kobject * kobj, struct attribute * attr, | |||
695 | { | 696 | { |
696 | struct cpufreq_policy * policy = to_policy(kobj); | 697 | struct cpufreq_policy * policy = to_policy(kobj); |
697 | struct freq_attr * fattr = to_attr(attr); | 698 | struct freq_attr * fattr = to_attr(attr); |
698 | ssize_t ret; | 699 | ssize_t ret = -EINVAL; |
699 | policy = cpufreq_cpu_get(policy->cpu); | 700 | policy = cpufreq_cpu_get(policy->cpu); |
700 | if (!policy) | 701 | if (!policy) |
701 | return -EINVAL; | 702 | goto no_policy; |
702 | 703 | ||
703 | if (lock_policy_rwsem_write(policy->cpu) < 0) | 704 | if (lock_policy_rwsem_write(policy->cpu) < 0) |
704 | return -EINVAL; | 705 | goto fail; |
705 | 706 | ||
706 | if (fattr->store) | 707 | if (fattr->store) |
707 | ret = fattr->store(policy, buf, count); | 708 | ret = fattr->store(policy, buf, count); |
@@ -709,8 +710,9 @@ static ssize_t store(struct kobject * kobj, struct attribute * attr, | |||
709 | ret = -EIO; | 710 | ret = -EIO; |
710 | 711 | ||
711 | unlock_policy_rwsem_write(policy->cpu); | 712 | unlock_policy_rwsem_write(policy->cpu); |
712 | 713 | fail: | |
713 | cpufreq_cpu_put(policy); | 714 | cpufreq_cpu_put(policy); |
715 | no_policy: | ||
714 | return ret; | 716 | return ret; |
715 | } | 717 | } |
716 | 718 | ||
@@ -1775,7 +1777,7 @@ static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb, | |||
1775 | return NOTIFY_OK; | 1777 | return NOTIFY_OK; |
1776 | } | 1778 | } |
1777 | 1779 | ||
1778 | static struct notifier_block __cpuinitdata cpufreq_cpu_notifier = | 1780 | static struct notifier_block __refdata cpufreq_cpu_notifier = |
1779 | { | 1781 | { |
1780 | .notifier_call = cpufreq_cpu_callback, | 1782 | .notifier_call = cpufreq_cpu_callback, |
1781 | }; | 1783 | }; |
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index 1b8312b02006..070421a5480e 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c | |||
@@ -323,7 +323,7 @@ static int __cpuinit cpufreq_stat_cpu_callback(struct notifier_block *nfb, | |||
323 | return NOTIFY_OK; | 323 | return NOTIFY_OK; |
324 | } | 324 | } |
325 | 325 | ||
326 | static struct notifier_block cpufreq_stat_cpu_notifier __cpuinitdata = | 326 | static struct notifier_block cpufreq_stat_cpu_notifier __refdata = |
327 | { | 327 | { |
328 | .notifier_call = cpufreq_stat_cpu_callback, | 328 | .notifier_call = cpufreq_stat_cpu_callback, |
329 | }; | 329 | }; |
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig index a703deffb795..27340a7b19dd 100644 --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | menuconfig DMADEVICES | 5 | menuconfig DMADEVICES |
6 | bool "DMA Engine support" | 6 | bool "DMA Engine support" |
7 | depends on (PCI && X86) || ARCH_IOP32X || ARCH_IOP33X || ARCH_IOP13XX | 7 | depends on (PCI && X86) || ARCH_IOP32X || ARCH_IOP33X || ARCH_IOP13XX || PPC |
8 | depends on !HIGHMEM64G | 8 | depends on !HIGHMEM64G |
9 | help | 9 | help |
10 | DMA engines can do asynchronous data transfers without | 10 | DMA engines can do asynchronous data transfers without |
@@ -37,6 +37,23 @@ config INTEL_IOP_ADMA | |||
37 | help | 37 | help |
38 | Enable support for the Intel(R) IOP Series RAID engines. | 38 | Enable support for the Intel(R) IOP Series RAID engines. |
39 | 39 | ||
40 | config FSL_DMA | ||
41 | bool "Freescale MPC85xx/MPC83xx DMA support" | ||
42 | depends on PPC | ||
43 | select DMA_ENGINE | ||
44 | ---help--- | ||
45 | Enable support for the Freescale DMA engine. Now, it support | ||
46 | MPC8560/40, MPC8555, MPC8548 and MPC8641 processors. | ||
47 | The MPC8349, MPC8360 is also supported. | ||
48 | |||
49 | config FSL_DMA_SELFTEST | ||
50 | bool "Enable the self test for each DMA channel" | ||
51 | depends on FSL_DMA | ||
52 | default y | ||
53 | ---help--- | ||
54 | Enable the self test for each DMA channel. A self test will be | ||
55 | performed after the channel probed to ensure the DMA works well. | ||
56 | |||
40 | config DMA_ENGINE | 57 | config DMA_ENGINE |
41 | bool | 58 | bool |
42 | 59 | ||
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile index b152cd84e123..c8036d945902 100644 --- a/drivers/dma/Makefile +++ b/drivers/dma/Makefile | |||
@@ -3,3 +3,4 @@ obj-$(CONFIG_NET_DMA) += iovlock.o | |||
3 | obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o | 3 | obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o |
4 | ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o | 4 | ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o |
5 | obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o | 5 | obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o |
6 | obj-$(CONFIG_FSL_DMA) += fsldma.o | ||
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 29965231b912..8db0e7f9d3f4 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
@@ -357,7 +357,7 @@ int dma_async_device_register(struct dma_device *device) | |||
357 | !device->device_prep_dma_zero_sum); | 357 | !device->device_prep_dma_zero_sum); |
358 | BUG_ON(dma_has_cap(DMA_MEMSET, device->cap_mask) && | 358 | BUG_ON(dma_has_cap(DMA_MEMSET, device->cap_mask) && |
359 | !device->device_prep_dma_memset); | 359 | !device->device_prep_dma_memset); |
360 | BUG_ON(dma_has_cap(DMA_ZERO_SUM, device->cap_mask) && | 360 | BUG_ON(dma_has_cap(DMA_INTERRUPT, device->cap_mask) && |
361 | !device->device_prep_dma_interrupt); | 361 | !device->device_prep_dma_interrupt); |
362 | 362 | ||
363 | BUG_ON(!device->device_alloc_chan_resources); | 363 | BUG_ON(!device->device_alloc_chan_resources); |
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c new file mode 100644 index 000000000000..ad2f938597e2 --- /dev/null +++ b/drivers/dma/fsldma.c | |||
@@ -0,0 +1,1097 @@ | |||
1 | /* | ||
2 | * Freescale MPC85xx, MPC83xx DMA Engine support | ||
3 | * | ||
4 | * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. | ||
5 | * | ||
6 | * Author: | ||
7 | * Zhang Wei <wei.zhang@freescale.com>, Jul 2007 | ||
8 | * Ebony Zhu <ebony.zhu@freescale.com>, May 2007 | ||
9 | * | ||
10 | * Description: | ||
11 | * DMA engine driver for Freescale MPC8540 DMA controller, which is | ||
12 | * also fit for MPC8560, MPC8555, MPC8548, MPC8641, and etc. | ||
13 | * The support for MPC8349 DMA contorller is also added. | ||
14 | * | ||
15 | * This is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include <linux/init.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/pci.h> | ||
25 | #include <linux/interrupt.h> | ||
26 | #include <linux/dmaengine.h> | ||
27 | #include <linux/delay.h> | ||
28 | #include <linux/dma-mapping.h> | ||
29 | #include <linux/dmapool.h> | ||
30 | #include <linux/of_platform.h> | ||
31 | |||
32 | #include "fsldma.h" | ||
33 | |||
34 | static void dma_init(struct fsl_dma_chan *fsl_chan) | ||
35 | { | ||
36 | /* Reset the channel */ | ||
37 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, 0, 32); | ||
38 | |||
39 | switch (fsl_chan->feature & FSL_DMA_IP_MASK) { | ||
40 | case FSL_DMA_IP_85XX: | ||
41 | /* Set the channel to below modes: | ||
42 | * EIE - Error interrupt enable | ||
43 | * EOSIE - End of segments interrupt enable (basic mode) | ||
44 | * EOLNIE - End of links interrupt enable | ||
45 | */ | ||
46 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, FSL_DMA_MR_EIE | ||
47 | | FSL_DMA_MR_EOLNIE | FSL_DMA_MR_EOSIE, 32); | ||
48 | break; | ||
49 | case FSL_DMA_IP_83XX: | ||
50 | /* Set the channel to below modes: | ||
51 | * EOTIE - End-of-transfer interrupt enable | ||
52 | */ | ||
53 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, FSL_DMA_MR_EOTIE, | ||
54 | 32); | ||
55 | break; | ||
56 | } | ||
57 | |||
58 | } | ||
59 | |||
60 | static void set_sr(struct fsl_dma_chan *fsl_chan, u32 val) | ||
61 | { | ||
62 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->sr, val, 32); | ||
63 | } | ||
64 | |||
65 | static u32 get_sr(struct fsl_dma_chan *fsl_chan) | ||
66 | { | ||
67 | return DMA_IN(fsl_chan, &fsl_chan->reg_base->sr, 32); | ||
68 | } | ||
69 | |||
70 | static void set_desc_cnt(struct fsl_dma_chan *fsl_chan, | ||
71 | struct fsl_dma_ld_hw *hw, u32 count) | ||
72 | { | ||
73 | hw->count = CPU_TO_DMA(fsl_chan, count, 32); | ||
74 | } | ||
75 | |||
76 | static void set_desc_src(struct fsl_dma_chan *fsl_chan, | ||
77 | struct fsl_dma_ld_hw *hw, dma_addr_t src) | ||
78 | { | ||
79 | u64 snoop_bits; | ||
80 | |||
81 | snoop_bits = ((fsl_chan->feature & FSL_DMA_IP_MASK) == FSL_DMA_IP_85XX) | ||
82 | ? ((u64)FSL_DMA_SATR_SREADTYPE_SNOOP_READ << 32) : 0; | ||
83 | hw->src_addr = CPU_TO_DMA(fsl_chan, snoop_bits | src, 64); | ||
84 | } | ||
85 | |||
86 | static void set_desc_dest(struct fsl_dma_chan *fsl_chan, | ||
87 | struct fsl_dma_ld_hw *hw, dma_addr_t dest) | ||
88 | { | ||
89 | u64 snoop_bits; | ||
90 | |||
91 | snoop_bits = ((fsl_chan->feature & FSL_DMA_IP_MASK) == FSL_DMA_IP_85XX) | ||
92 | ? ((u64)FSL_DMA_DATR_DWRITETYPE_SNOOP_WRITE << 32) : 0; | ||
93 | hw->dst_addr = CPU_TO_DMA(fsl_chan, snoop_bits | dest, 64); | ||
94 | } | ||
95 | |||
96 | static void set_desc_next(struct fsl_dma_chan *fsl_chan, | ||
97 | struct fsl_dma_ld_hw *hw, dma_addr_t next) | ||
98 | { | ||
99 | u64 snoop_bits; | ||
100 | |||
101 | snoop_bits = ((fsl_chan->feature & FSL_DMA_IP_MASK) == FSL_DMA_IP_83XX) | ||
102 | ? FSL_DMA_SNEN : 0; | ||
103 | hw->next_ln_addr = CPU_TO_DMA(fsl_chan, snoop_bits | next, 64); | ||
104 | } | ||
105 | |||
106 | static void set_cdar(struct fsl_dma_chan *fsl_chan, dma_addr_t addr) | ||
107 | { | ||
108 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->cdar, addr | FSL_DMA_SNEN, 64); | ||
109 | } | ||
110 | |||
111 | static dma_addr_t get_cdar(struct fsl_dma_chan *fsl_chan) | ||
112 | { | ||
113 | return DMA_IN(fsl_chan, &fsl_chan->reg_base->cdar, 64) & ~FSL_DMA_SNEN; | ||
114 | } | ||
115 | |||
116 | static void set_ndar(struct fsl_dma_chan *fsl_chan, dma_addr_t addr) | ||
117 | { | ||
118 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->ndar, addr, 64); | ||
119 | } | ||
120 | |||
121 | static dma_addr_t get_ndar(struct fsl_dma_chan *fsl_chan) | ||
122 | { | ||
123 | return DMA_IN(fsl_chan, &fsl_chan->reg_base->ndar, 64); | ||
124 | } | ||
125 | |||
126 | static int dma_is_idle(struct fsl_dma_chan *fsl_chan) | ||
127 | { | ||
128 | u32 sr = get_sr(fsl_chan); | ||
129 | return (!(sr & FSL_DMA_SR_CB)) || (sr & FSL_DMA_SR_CH); | ||
130 | } | ||
131 | |||
132 | static void dma_start(struct fsl_dma_chan *fsl_chan) | ||
133 | { | ||
134 | u32 mr_set = 0;; | ||
135 | |||
136 | if (fsl_chan->feature & FSL_DMA_CHAN_PAUSE_EXT) { | ||
137 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->bcr, 0, 32); | ||
138 | mr_set |= FSL_DMA_MR_EMP_EN; | ||
139 | } else | ||
140 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, | ||
141 | DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | ||
142 | & ~FSL_DMA_MR_EMP_EN, 32); | ||
143 | |||
144 | if (fsl_chan->feature & FSL_DMA_CHAN_START_EXT) | ||
145 | mr_set |= FSL_DMA_MR_EMS_EN; | ||
146 | else | ||
147 | mr_set |= FSL_DMA_MR_CS; | ||
148 | |||
149 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, | ||
150 | DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | ||
151 | | mr_set, 32); | ||
152 | } | ||
153 | |||
154 | static void dma_halt(struct fsl_dma_chan *fsl_chan) | ||
155 | { | ||
156 | int i = 0; | ||
157 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, | ||
158 | DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | FSL_DMA_MR_CA, | ||
159 | 32); | ||
160 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, | ||
161 | DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) & ~(FSL_DMA_MR_CS | ||
162 | | FSL_DMA_MR_EMS_EN | FSL_DMA_MR_CA), 32); | ||
163 | |||
164 | while (!dma_is_idle(fsl_chan) && (i++ < 100)) | ||
165 | udelay(10); | ||
166 | if (i >= 100 && !dma_is_idle(fsl_chan)) | ||
167 | dev_err(fsl_chan->dev, "DMA halt timeout!\n"); | ||
168 | } | ||
169 | |||
170 | static void set_ld_eol(struct fsl_dma_chan *fsl_chan, | ||
171 | struct fsl_desc_sw *desc) | ||
172 | { | ||
173 | desc->hw.next_ln_addr = CPU_TO_DMA(fsl_chan, | ||
174 | DMA_TO_CPU(fsl_chan, desc->hw.next_ln_addr, 64) | FSL_DMA_EOL, | ||
175 | 64); | ||
176 | } | ||
177 | |||
178 | static void append_ld_queue(struct fsl_dma_chan *fsl_chan, | ||
179 | struct fsl_desc_sw *new_desc) | ||
180 | { | ||
181 | struct fsl_desc_sw *queue_tail = to_fsl_desc(fsl_chan->ld_queue.prev); | ||
182 | |||
183 | if (list_empty(&fsl_chan->ld_queue)) | ||
184 | return; | ||
185 | |||
186 | /* Link to the new descriptor physical address and | ||
187 | * Enable End-of-segment interrupt for | ||
188 | * the last link descriptor. | ||
189 | * (the previous node's next link descriptor) | ||
190 | * | ||
191 | * For FSL_DMA_IP_83xx, the snoop enable bit need be set. | ||
192 | */ | ||
193 | queue_tail->hw.next_ln_addr = CPU_TO_DMA(fsl_chan, | ||
194 | new_desc->async_tx.phys | FSL_DMA_EOSIE | | ||
195 | (((fsl_chan->feature & FSL_DMA_IP_MASK) | ||
196 | == FSL_DMA_IP_83XX) ? FSL_DMA_SNEN : 0), 64); | ||
197 | } | ||
198 | |||
199 | /** | ||
200 | * fsl_chan_set_src_loop_size - Set source address hold transfer size | ||
201 | * @fsl_chan : Freescale DMA channel | ||
202 | * @size : Address loop size, 0 for disable loop | ||
203 | * | ||
204 | * The set source address hold transfer size. The source | ||
205 | * address hold or loop transfer size is when the DMA transfer | ||
206 | * data from source address (SA), if the loop size is 4, the DMA will | ||
207 | * read data from SA, SA + 1, SA + 2, SA + 3, then loop back to SA, | ||
208 | * SA + 1 ... and so on. | ||
209 | */ | ||
210 | static void fsl_chan_set_src_loop_size(struct fsl_dma_chan *fsl_chan, int size) | ||
211 | { | ||
212 | switch (size) { | ||
213 | case 0: | ||
214 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, | ||
215 | DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) & | ||
216 | (~FSL_DMA_MR_SAHE), 32); | ||
217 | break; | ||
218 | case 1: | ||
219 | case 2: | ||
220 | case 4: | ||
221 | case 8: | ||
222 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, | ||
223 | DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | | ||
224 | FSL_DMA_MR_SAHE | (__ilog2(size) << 14), | ||
225 | 32); | ||
226 | break; | ||
227 | } | ||
228 | } | ||
229 | |||
230 | /** | ||
231 | * fsl_chan_set_dest_loop_size - Set destination address hold transfer size | ||
232 | * @fsl_chan : Freescale DMA channel | ||
233 | * @size : Address loop size, 0 for disable loop | ||
234 | * | ||
235 | * The set destination address hold transfer size. The destination | ||
236 | * address hold or loop transfer size is when the DMA transfer | ||
237 | * data to destination address (TA), if the loop size is 4, the DMA will | ||
238 | * write data to TA, TA + 1, TA + 2, TA + 3, then loop back to TA, | ||
239 | * TA + 1 ... and so on. | ||
240 | */ | ||
241 | static void fsl_chan_set_dest_loop_size(struct fsl_dma_chan *fsl_chan, int size) | ||
242 | { | ||
243 | switch (size) { | ||
244 | case 0: | ||
245 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, | ||
246 | DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) & | ||
247 | (~FSL_DMA_MR_DAHE), 32); | ||
248 | break; | ||
249 | case 1: | ||
250 | case 2: | ||
251 | case 4: | ||
252 | case 8: | ||
253 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, | ||
254 | DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | | ||
255 | FSL_DMA_MR_DAHE | (__ilog2(size) << 16), | ||
256 | 32); | ||
257 | break; | ||
258 | } | ||
259 | } | ||
260 | |||
261 | /** | ||
262 | * fsl_chan_toggle_ext_pause - Toggle channel external pause status | ||
263 | * @fsl_chan : Freescale DMA channel | ||
264 | * @size : Pause control size, 0 for disable external pause control. | ||
265 | * The maximum is 1024. | ||
266 | * | ||
267 | * The Freescale DMA channel can be controlled by the external | ||
268 | * signal DREQ#. The pause control size is how many bytes are allowed | ||
269 | * to transfer before pausing the channel, after which a new assertion | ||
270 | * of DREQ# resumes channel operation. | ||
271 | */ | ||
272 | static void fsl_chan_toggle_ext_pause(struct fsl_dma_chan *fsl_chan, int size) | ||
273 | { | ||
274 | if (size > 1024) | ||
275 | return; | ||
276 | |||
277 | if (size) { | ||
278 | DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, | ||
279 | DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | ||
280 | | ((__ilog2(size) << 24) & 0x0f000000), | ||
281 | 32); | ||
282 | fsl_chan->feature |= FSL_DMA_CHAN_PAUSE_EXT; | ||
283 | } else | ||
284 | fsl_chan->feature &= ~FSL_DMA_CHAN_PAUSE_EXT; | ||
285 | } | ||
286 | |||
287 | /** | ||
288 | * fsl_chan_toggle_ext_start - Toggle channel external start status | ||
289 | * @fsl_chan : Freescale DMA channel | ||
290 | * @enable : 0 is disabled, 1 is enabled. | ||
291 | * | ||
292 | * If enable the external start, the channel can be started by an | ||
293 | * external DMA start pin. So the dma_start() does not start the | ||
294 | * transfer immediately. The DMA channel will wait for the | ||
295 | * control pin asserted. | ||
296 | */ | ||
297 | static void fsl_chan_toggle_ext_start(struct fsl_dma_chan *fsl_chan, int enable) | ||
298 | { | ||
299 | if (enable) | ||
300 | fsl_chan->feature |= FSL_DMA_CHAN_START_EXT; | ||
301 | else | ||
302 | fsl_chan->feature &= ~FSL_DMA_CHAN_START_EXT; | ||
303 | } | ||
304 | |||
305 | static dma_cookie_t fsl_dma_tx_submit(struct dma_async_tx_descriptor *tx) | ||
306 | { | ||
307 | struct fsl_desc_sw *desc = tx_to_fsl_desc(tx); | ||
308 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(tx->chan); | ||
309 | unsigned long flags; | ||
310 | dma_cookie_t cookie; | ||
311 | |||
312 | /* cookie increment and adding to ld_queue must be atomic */ | ||
313 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); | ||
314 | |||
315 | cookie = fsl_chan->common.cookie; | ||
316 | cookie++; | ||
317 | if (cookie < 0) | ||
318 | cookie = 1; | ||
319 | desc->async_tx.cookie = cookie; | ||
320 | fsl_chan->common.cookie = desc->async_tx.cookie; | ||
321 | |||
322 | append_ld_queue(fsl_chan, desc); | ||
323 | list_splice_init(&desc->async_tx.tx_list, fsl_chan->ld_queue.prev); | ||
324 | |||
325 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | ||
326 | |||
327 | return cookie; | ||
328 | } | ||
329 | |||
330 | /** | ||
331 | * fsl_dma_alloc_descriptor - Allocate descriptor from channel's DMA pool. | ||
332 | * @fsl_chan : Freescale DMA channel | ||
333 | * | ||
334 | * Return - The descriptor allocated. NULL for failed. | ||
335 | */ | ||
336 | static struct fsl_desc_sw *fsl_dma_alloc_descriptor( | ||
337 | struct fsl_dma_chan *fsl_chan) | ||
338 | { | ||
339 | dma_addr_t pdesc; | ||
340 | struct fsl_desc_sw *desc_sw; | ||
341 | |||
342 | desc_sw = dma_pool_alloc(fsl_chan->desc_pool, GFP_ATOMIC, &pdesc); | ||
343 | if (desc_sw) { | ||
344 | memset(desc_sw, 0, sizeof(struct fsl_desc_sw)); | ||
345 | dma_async_tx_descriptor_init(&desc_sw->async_tx, | ||
346 | &fsl_chan->common); | ||
347 | desc_sw->async_tx.tx_submit = fsl_dma_tx_submit; | ||
348 | INIT_LIST_HEAD(&desc_sw->async_tx.tx_list); | ||
349 | desc_sw->async_tx.phys = pdesc; | ||
350 | } | ||
351 | |||
352 | return desc_sw; | ||
353 | } | ||
354 | |||
355 | |||
356 | /** | ||
357 | * fsl_dma_alloc_chan_resources - Allocate resources for DMA channel. | ||
358 | * @fsl_chan : Freescale DMA channel | ||
359 | * | ||
360 | * This function will create a dma pool for descriptor allocation. | ||
361 | * | ||
362 | * Return - The number of descriptors allocated. | ||
363 | */ | ||
364 | static int fsl_dma_alloc_chan_resources(struct dma_chan *chan) | ||
365 | { | ||
366 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); | ||
367 | LIST_HEAD(tmp_list); | ||
368 | |||
369 | /* We need the descriptor to be aligned to 32bytes | ||
370 | * for meeting FSL DMA specification requirement. | ||
371 | */ | ||
372 | fsl_chan->desc_pool = dma_pool_create("fsl_dma_engine_desc_pool", | ||
373 | fsl_chan->dev, sizeof(struct fsl_desc_sw), | ||
374 | 32, 0); | ||
375 | if (!fsl_chan->desc_pool) { | ||
376 | dev_err(fsl_chan->dev, "No memory for channel %d " | ||
377 | "descriptor dma pool.\n", fsl_chan->id); | ||
378 | return 0; | ||
379 | } | ||
380 | |||
381 | return 1; | ||
382 | } | ||
383 | |||
384 | /** | ||
385 | * fsl_dma_free_chan_resources - Free all resources of the channel. | ||
386 | * @fsl_chan : Freescale DMA channel | ||
387 | */ | ||
388 | static void fsl_dma_free_chan_resources(struct dma_chan *chan) | ||
389 | { | ||
390 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); | ||
391 | struct fsl_desc_sw *desc, *_desc; | ||
392 | unsigned long flags; | ||
393 | |||
394 | dev_dbg(fsl_chan->dev, "Free all channel resources.\n"); | ||
395 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); | ||
396 | list_for_each_entry_safe(desc, _desc, &fsl_chan->ld_queue, node) { | ||
397 | #ifdef FSL_DMA_LD_DEBUG | ||
398 | dev_dbg(fsl_chan->dev, | ||
399 | "LD %p will be released.\n", desc); | ||
400 | #endif | ||
401 | list_del(&desc->node); | ||
402 | /* free link descriptor */ | ||
403 | dma_pool_free(fsl_chan->desc_pool, desc, desc->async_tx.phys); | ||
404 | } | ||
405 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | ||
406 | dma_pool_destroy(fsl_chan->desc_pool); | ||
407 | } | ||
408 | |||
409 | static struct dma_async_tx_descriptor * | ||
410 | fsl_dma_prep_interrupt(struct dma_chan *chan) | ||
411 | { | ||
412 | struct fsl_dma_chan *fsl_chan; | ||
413 | struct fsl_desc_sw *new; | ||
414 | |||
415 | if (!chan) | ||
416 | return NULL; | ||
417 | |||
418 | fsl_chan = to_fsl_chan(chan); | ||
419 | |||
420 | new = fsl_dma_alloc_descriptor(fsl_chan); | ||
421 | if (!new) { | ||
422 | dev_err(fsl_chan->dev, "No free memory for link descriptor\n"); | ||
423 | return NULL; | ||
424 | } | ||
425 | |||
426 | new->async_tx.cookie = -EBUSY; | ||
427 | new->async_tx.ack = 0; | ||
428 | |||
429 | /* Set End-of-link to the last link descriptor of new list*/ | ||
430 | set_ld_eol(fsl_chan, new); | ||
431 | |||
432 | return &new->async_tx; | ||
433 | } | ||
434 | |||
435 | static struct dma_async_tx_descriptor *fsl_dma_prep_memcpy( | ||
436 | struct dma_chan *chan, dma_addr_t dma_dest, dma_addr_t dma_src, | ||
437 | size_t len, unsigned long flags) | ||
438 | { | ||
439 | struct fsl_dma_chan *fsl_chan; | ||
440 | struct fsl_desc_sw *first = NULL, *prev = NULL, *new; | ||
441 | size_t copy; | ||
442 | LIST_HEAD(link_chain); | ||
443 | |||
444 | if (!chan) | ||
445 | return NULL; | ||
446 | |||
447 | if (!len) | ||
448 | return NULL; | ||
449 | |||
450 | fsl_chan = to_fsl_chan(chan); | ||
451 | |||
452 | do { | ||
453 | |||
454 | /* Allocate the link descriptor from DMA pool */ | ||
455 | new = fsl_dma_alloc_descriptor(fsl_chan); | ||
456 | if (!new) { | ||
457 | dev_err(fsl_chan->dev, | ||
458 | "No free memory for link descriptor\n"); | ||
459 | return NULL; | ||
460 | } | ||
461 | #ifdef FSL_DMA_LD_DEBUG | ||
462 | dev_dbg(fsl_chan->dev, "new link desc alloc %p\n", new); | ||
463 | #endif | ||
464 | |||
465 | copy = min(len, (size_t)FSL_DMA_BCR_MAX_CNT); | ||
466 | |||
467 | set_desc_cnt(fsl_chan, &new->hw, copy); | ||
468 | set_desc_src(fsl_chan, &new->hw, dma_src); | ||
469 | set_desc_dest(fsl_chan, &new->hw, dma_dest); | ||
470 | |||
471 | if (!first) | ||
472 | first = new; | ||
473 | else | ||
474 | set_desc_next(fsl_chan, &prev->hw, new->async_tx.phys); | ||
475 | |||
476 | new->async_tx.cookie = 0; | ||
477 | new->async_tx.ack = 1; | ||
478 | |||
479 | prev = new; | ||
480 | len -= copy; | ||
481 | dma_src += copy; | ||
482 | dma_dest += copy; | ||
483 | |||
484 | /* Insert the link descriptor to the LD ring */ | ||
485 | list_add_tail(&new->node, &first->async_tx.tx_list); | ||
486 | } while (len); | ||
487 | |||
488 | new->async_tx.ack = 0; /* client is in control of this ack */ | ||
489 | new->async_tx.cookie = -EBUSY; | ||
490 | |||
491 | /* Set End-of-link to the last link descriptor of new list*/ | ||
492 | set_ld_eol(fsl_chan, new); | ||
493 | |||
494 | return first ? &first->async_tx : NULL; | ||
495 | } | ||
496 | |||
497 | /** | ||
498 | * fsl_dma_update_completed_cookie - Update the completed cookie. | ||
499 | * @fsl_chan : Freescale DMA channel | ||
500 | */ | ||
501 | static void fsl_dma_update_completed_cookie(struct fsl_dma_chan *fsl_chan) | ||
502 | { | ||
503 | struct fsl_desc_sw *cur_desc, *desc; | ||
504 | dma_addr_t ld_phy; | ||
505 | |||
506 | ld_phy = get_cdar(fsl_chan) & FSL_DMA_NLDA_MASK; | ||
507 | |||
508 | if (ld_phy) { | ||
509 | cur_desc = NULL; | ||
510 | list_for_each_entry(desc, &fsl_chan->ld_queue, node) | ||
511 | if (desc->async_tx.phys == ld_phy) { | ||
512 | cur_desc = desc; | ||
513 | break; | ||
514 | } | ||
515 | |||
516 | if (cur_desc && cur_desc->async_tx.cookie) { | ||
517 | if (dma_is_idle(fsl_chan)) | ||
518 | fsl_chan->completed_cookie = | ||
519 | cur_desc->async_tx.cookie; | ||
520 | else | ||
521 | fsl_chan->completed_cookie = | ||
522 | cur_desc->async_tx.cookie - 1; | ||
523 | } | ||
524 | } | ||
525 | } | ||
526 | |||
527 | /** | ||
528 | * fsl_chan_ld_cleanup - Clean up link descriptors | ||
529 | * @fsl_chan : Freescale DMA channel | ||
530 | * | ||
531 | * This function clean up the ld_queue of DMA channel. | ||
532 | * If 'in_intr' is set, the function will move the link descriptor to | ||
533 | * the recycle list. Otherwise, free it directly. | ||
534 | */ | ||
535 | static void fsl_chan_ld_cleanup(struct fsl_dma_chan *fsl_chan) | ||
536 | { | ||
537 | struct fsl_desc_sw *desc, *_desc; | ||
538 | unsigned long flags; | ||
539 | |||
540 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); | ||
541 | |||
542 | dev_dbg(fsl_chan->dev, "chan completed_cookie = %d\n", | ||
543 | fsl_chan->completed_cookie); | ||
544 | list_for_each_entry_safe(desc, _desc, &fsl_chan->ld_queue, node) { | ||
545 | dma_async_tx_callback callback; | ||
546 | void *callback_param; | ||
547 | |||
548 | if (dma_async_is_complete(desc->async_tx.cookie, | ||
549 | fsl_chan->completed_cookie, fsl_chan->common.cookie) | ||
550 | == DMA_IN_PROGRESS) | ||
551 | break; | ||
552 | |||
553 | callback = desc->async_tx.callback; | ||
554 | callback_param = desc->async_tx.callback_param; | ||
555 | |||
556 | /* Remove from ld_queue list */ | ||
557 | list_del(&desc->node); | ||
558 | |||
559 | dev_dbg(fsl_chan->dev, "link descriptor %p will be recycle.\n", | ||
560 | desc); | ||
561 | dma_pool_free(fsl_chan->desc_pool, desc, desc->async_tx.phys); | ||
562 | |||
563 | /* Run the link descriptor callback function */ | ||
564 | if (callback) { | ||
565 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | ||
566 | dev_dbg(fsl_chan->dev, "link descriptor %p callback\n", | ||
567 | desc); | ||
568 | callback(callback_param); | ||
569 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); | ||
570 | } | ||
571 | } | ||
572 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | ||
573 | } | ||
574 | |||
575 | /** | ||
576 | * fsl_chan_xfer_ld_queue - Transfer link descriptors in channel ld_queue. | ||
577 | * @fsl_chan : Freescale DMA channel | ||
578 | */ | ||
579 | static void fsl_chan_xfer_ld_queue(struct fsl_dma_chan *fsl_chan) | ||
580 | { | ||
581 | struct list_head *ld_node; | ||
582 | dma_addr_t next_dest_addr; | ||
583 | unsigned long flags; | ||
584 | |||
585 | if (!dma_is_idle(fsl_chan)) | ||
586 | return; | ||
587 | |||
588 | dma_halt(fsl_chan); | ||
589 | |||
590 | /* If there are some link descriptors | ||
591 | * not transfered in queue. We need to start it. | ||
592 | */ | ||
593 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); | ||
594 | |||
595 | /* Find the first un-transfer desciptor */ | ||
596 | for (ld_node = fsl_chan->ld_queue.next; | ||
597 | (ld_node != &fsl_chan->ld_queue) | ||
598 | && (dma_async_is_complete( | ||
599 | to_fsl_desc(ld_node)->async_tx.cookie, | ||
600 | fsl_chan->completed_cookie, | ||
601 | fsl_chan->common.cookie) == DMA_SUCCESS); | ||
602 | ld_node = ld_node->next); | ||
603 | |||
604 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | ||
605 | |||
606 | if (ld_node != &fsl_chan->ld_queue) { | ||
607 | /* Get the ld start address from ld_queue */ | ||
608 | next_dest_addr = to_fsl_desc(ld_node)->async_tx.phys; | ||
609 | dev_dbg(fsl_chan->dev, "xfer LDs staring from %p\n", | ||
610 | (void *)next_dest_addr); | ||
611 | set_cdar(fsl_chan, next_dest_addr); | ||
612 | dma_start(fsl_chan); | ||
613 | } else { | ||
614 | set_cdar(fsl_chan, 0); | ||
615 | set_ndar(fsl_chan, 0); | ||
616 | } | ||
617 | } | ||
618 | |||
619 | /** | ||
620 | * fsl_dma_memcpy_issue_pending - Issue the DMA start command | ||
621 | * @fsl_chan : Freescale DMA channel | ||
622 | */ | ||
623 | static void fsl_dma_memcpy_issue_pending(struct dma_chan *chan) | ||
624 | { | ||
625 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); | ||
626 | |||
627 | #ifdef FSL_DMA_LD_DEBUG | ||
628 | struct fsl_desc_sw *ld; | ||
629 | unsigned long flags; | ||
630 | |||
631 | spin_lock_irqsave(&fsl_chan->desc_lock, flags); | ||
632 | if (list_empty(&fsl_chan->ld_queue)) { | ||
633 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | ||
634 | return; | ||
635 | } | ||
636 | |||
637 | dev_dbg(fsl_chan->dev, "--memcpy issue--\n"); | ||
638 | list_for_each_entry(ld, &fsl_chan->ld_queue, node) { | ||
639 | int i; | ||
640 | dev_dbg(fsl_chan->dev, "Ch %d, LD %08x\n", | ||
641 | fsl_chan->id, ld->async_tx.phys); | ||
642 | for (i = 0; i < 8; i++) | ||
643 | dev_dbg(fsl_chan->dev, "LD offset %d: %08x\n", | ||
644 | i, *(((u32 *)&ld->hw) + i)); | ||
645 | } | ||
646 | dev_dbg(fsl_chan->dev, "----------------\n"); | ||
647 | spin_unlock_irqrestore(&fsl_chan->desc_lock, flags); | ||
648 | #endif | ||
649 | |||
650 | fsl_chan_xfer_ld_queue(fsl_chan); | ||
651 | } | ||
652 | |||
653 | static void fsl_dma_dependency_added(struct dma_chan *chan) | ||
654 | { | ||
655 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); | ||
656 | |||
657 | fsl_chan_ld_cleanup(fsl_chan); | ||
658 | } | ||
659 | |||
660 | /** | ||
661 | * fsl_dma_is_complete - Determine the DMA status | ||
662 | * @fsl_chan : Freescale DMA channel | ||
663 | */ | ||
664 | static enum dma_status fsl_dma_is_complete(struct dma_chan *chan, | ||
665 | dma_cookie_t cookie, | ||
666 | dma_cookie_t *done, | ||
667 | dma_cookie_t *used) | ||
668 | { | ||
669 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); | ||
670 | dma_cookie_t last_used; | ||
671 | dma_cookie_t last_complete; | ||
672 | |||
673 | fsl_chan_ld_cleanup(fsl_chan); | ||
674 | |||
675 | last_used = chan->cookie; | ||
676 | last_complete = fsl_chan->completed_cookie; | ||
677 | |||
678 | if (done) | ||
679 | *done = last_complete; | ||
680 | |||
681 | if (used) | ||
682 | *used = last_used; | ||
683 | |||
684 | return dma_async_is_complete(cookie, last_complete, last_used); | ||
685 | } | ||
686 | |||
687 | static irqreturn_t fsl_dma_chan_do_interrupt(int irq, void *data) | ||
688 | { | ||
689 | struct fsl_dma_chan *fsl_chan = (struct fsl_dma_chan *)data; | ||
690 | u32 stat; | ||
691 | |||
692 | stat = get_sr(fsl_chan); | ||
693 | dev_dbg(fsl_chan->dev, "event: channel %d, stat = 0x%x\n", | ||
694 | fsl_chan->id, stat); | ||
695 | set_sr(fsl_chan, stat); /* Clear the event register */ | ||
696 | |||
697 | stat &= ~(FSL_DMA_SR_CB | FSL_DMA_SR_CH); | ||
698 | if (!stat) | ||
699 | return IRQ_NONE; | ||
700 | |||
701 | if (stat & FSL_DMA_SR_TE) | ||
702 | dev_err(fsl_chan->dev, "Transfer Error!\n"); | ||
703 | |||
704 | /* If the link descriptor segment transfer finishes, | ||
705 | * we will recycle the used descriptor. | ||
706 | */ | ||
707 | if (stat & FSL_DMA_SR_EOSI) { | ||
708 | dev_dbg(fsl_chan->dev, "event: End-of-segments INT\n"); | ||
709 | dev_dbg(fsl_chan->dev, "event: clndar %p, nlndar %p\n", | ||
710 | (void *)get_cdar(fsl_chan), (void *)get_ndar(fsl_chan)); | ||
711 | stat &= ~FSL_DMA_SR_EOSI; | ||
712 | fsl_dma_update_completed_cookie(fsl_chan); | ||
713 | } | ||
714 | |||
715 | /* If it current transfer is the end-of-transfer, | ||
716 | * we should clear the Channel Start bit for | ||
717 | * prepare next transfer. | ||
718 | */ | ||
719 | if (stat & (FSL_DMA_SR_EOLNI | FSL_DMA_SR_EOCDI)) { | ||
720 | dev_dbg(fsl_chan->dev, "event: End-of-link INT\n"); | ||
721 | stat &= ~FSL_DMA_SR_EOLNI; | ||
722 | fsl_chan_xfer_ld_queue(fsl_chan); | ||
723 | } | ||
724 | |||
725 | if (stat) | ||
726 | dev_dbg(fsl_chan->dev, "event: unhandled sr 0x%02x\n", | ||
727 | stat); | ||
728 | |||
729 | dev_dbg(fsl_chan->dev, "event: Exit\n"); | ||
730 | tasklet_schedule(&fsl_chan->tasklet); | ||
731 | return IRQ_HANDLED; | ||
732 | } | ||
733 | |||
734 | static irqreturn_t fsl_dma_do_interrupt(int irq, void *data) | ||
735 | { | ||
736 | struct fsl_dma_device *fdev = (struct fsl_dma_device *)data; | ||
737 | u32 gsr; | ||
738 | int ch_nr; | ||
739 | |||
740 | gsr = (fdev->feature & FSL_DMA_BIG_ENDIAN) ? in_be32(fdev->reg_base) | ||
741 | : in_le32(fdev->reg_base); | ||
742 | ch_nr = (32 - ffs(gsr)) / 8; | ||
743 | |||
744 | return fdev->chan[ch_nr] ? fsl_dma_chan_do_interrupt(irq, | ||
745 | fdev->chan[ch_nr]) : IRQ_NONE; | ||
746 | } | ||
747 | |||
748 | static void dma_do_tasklet(unsigned long data) | ||
749 | { | ||
750 | struct fsl_dma_chan *fsl_chan = (struct fsl_dma_chan *)data; | ||
751 | fsl_chan_ld_cleanup(fsl_chan); | ||
752 | } | ||
753 | |||
754 | #ifdef FSL_DMA_CALLBACKTEST | ||
755 | static void fsl_dma_callback_test(struct fsl_dma_chan *fsl_chan) | ||
756 | { | ||
757 | if (fsl_chan) | ||
758 | dev_info(fsl_chan->dev, "selftest: callback is ok!\n"); | ||
759 | } | ||
760 | #endif | ||
761 | |||
762 | #ifdef CONFIG_FSL_DMA_SELFTEST | ||
763 | static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan) | ||
764 | { | ||
765 | struct dma_chan *chan; | ||
766 | int err = 0; | ||
767 | dma_addr_t dma_dest, dma_src; | ||
768 | dma_cookie_t cookie; | ||
769 | u8 *src, *dest; | ||
770 | int i; | ||
771 | size_t test_size; | ||
772 | struct dma_async_tx_descriptor *tx1, *tx2, *tx3; | ||
773 | |||
774 | test_size = 4096; | ||
775 | |||
776 | src = kmalloc(test_size * 2, GFP_KERNEL); | ||
777 | if (!src) { | ||
778 | dev_err(fsl_chan->dev, | ||
779 | "selftest: Cannot alloc memory for test!\n"); | ||
780 | err = -ENOMEM; | ||
781 | goto out; | ||
782 | } | ||
783 | |||
784 | dest = src + test_size; | ||
785 | |||
786 | for (i = 0; i < test_size; i++) | ||
787 | src[i] = (u8) i; | ||
788 | |||
789 | chan = &fsl_chan->common; | ||
790 | |||
791 | if (fsl_dma_alloc_chan_resources(chan) < 1) { | ||
792 | dev_err(fsl_chan->dev, | ||
793 | "selftest: Cannot alloc resources for DMA\n"); | ||
794 | err = -ENODEV; | ||
795 | goto out; | ||
796 | } | ||
797 | |||
798 | /* TX 1 */ | ||
799 | dma_src = dma_map_single(fsl_chan->dev, src, test_size / 2, | ||
800 | DMA_TO_DEVICE); | ||
801 | dma_dest = dma_map_single(fsl_chan->dev, dest, test_size / 2, | ||
802 | DMA_FROM_DEVICE); | ||
803 | tx1 = fsl_dma_prep_memcpy(chan, dma_dest, dma_src, test_size / 2, 0); | ||
804 | async_tx_ack(tx1); | ||
805 | |||
806 | cookie = fsl_dma_tx_submit(tx1); | ||
807 | fsl_dma_memcpy_issue_pending(chan); | ||
808 | msleep(2); | ||
809 | |||
810 | if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) { | ||
811 | dev_err(fsl_chan->dev, "selftest: Time out!\n"); | ||
812 | err = -ENODEV; | ||
813 | goto out; | ||
814 | } | ||
815 | |||
816 | /* Test free and re-alloc channel resources */ | ||
817 | fsl_dma_free_chan_resources(chan); | ||
818 | |||
819 | if (fsl_dma_alloc_chan_resources(chan) < 1) { | ||
820 | dev_err(fsl_chan->dev, | ||
821 | "selftest: Cannot alloc resources for DMA\n"); | ||
822 | err = -ENODEV; | ||
823 | goto free_resources; | ||
824 | } | ||
825 | |||
826 | /* Continue to test | ||
827 | * TX 2 | ||
828 | */ | ||
829 | dma_src = dma_map_single(fsl_chan->dev, src + test_size / 2, | ||
830 | test_size / 4, DMA_TO_DEVICE); | ||
831 | dma_dest = dma_map_single(fsl_chan->dev, dest + test_size / 2, | ||
832 | test_size / 4, DMA_FROM_DEVICE); | ||
833 | tx2 = fsl_dma_prep_memcpy(chan, dma_dest, dma_src, test_size / 4, 0); | ||
834 | async_tx_ack(tx2); | ||
835 | |||
836 | /* TX 3 */ | ||
837 | dma_src = dma_map_single(fsl_chan->dev, src + test_size * 3 / 4, | ||
838 | test_size / 4, DMA_TO_DEVICE); | ||
839 | dma_dest = dma_map_single(fsl_chan->dev, dest + test_size * 3 / 4, | ||
840 | test_size / 4, DMA_FROM_DEVICE); | ||
841 | tx3 = fsl_dma_prep_memcpy(chan, dma_dest, dma_src, test_size / 4, 0); | ||
842 | async_tx_ack(tx3); | ||
843 | |||
844 | /* Test exchanging the prepared tx sort */ | ||
845 | cookie = fsl_dma_tx_submit(tx3); | ||
846 | cookie = fsl_dma_tx_submit(tx2); | ||
847 | |||
848 | #ifdef FSL_DMA_CALLBACKTEST | ||
849 | if (dma_has_cap(DMA_INTERRUPT, ((struct fsl_dma_device *) | ||
850 | dev_get_drvdata(fsl_chan->dev->parent))->common.cap_mask)) { | ||
851 | tx3->callback = fsl_dma_callback_test; | ||
852 | tx3->callback_param = fsl_chan; | ||
853 | } | ||
854 | #endif | ||
855 | fsl_dma_memcpy_issue_pending(chan); | ||
856 | msleep(2); | ||
857 | |||
858 | if (fsl_dma_is_complete(chan, cookie, NULL, NULL) != DMA_SUCCESS) { | ||
859 | dev_err(fsl_chan->dev, "selftest: Time out!\n"); | ||
860 | err = -ENODEV; | ||
861 | goto free_resources; | ||
862 | } | ||
863 | |||
864 | err = memcmp(src, dest, test_size); | ||
865 | if (err) { | ||
866 | for (i = 0; (*(src + i) == *(dest + i)) && (i < test_size); | ||
867 | i++); | ||
868 | dev_err(fsl_chan->dev, "selftest: Test failed, data %d/%ld is " | ||
869 | "error! src 0x%x, dest 0x%x\n", | ||
870 | i, (long)test_size, *(src + i), *(dest + i)); | ||
871 | } | ||
872 | |||
873 | free_resources: | ||
874 | fsl_dma_free_chan_resources(chan); | ||
875 | out: | ||
876 | kfree(src); | ||
877 | return err; | ||
878 | } | ||
879 | #endif | ||
880 | |||
881 | static int __devinit of_fsl_dma_chan_probe(struct of_device *dev, | ||
882 | const struct of_device_id *match) | ||
883 | { | ||
884 | struct fsl_dma_device *fdev; | ||
885 | struct fsl_dma_chan *new_fsl_chan; | ||
886 | int err; | ||
887 | |||
888 | fdev = dev_get_drvdata(dev->dev.parent); | ||
889 | BUG_ON(!fdev); | ||
890 | |||
891 | /* alloc channel */ | ||
892 | new_fsl_chan = kzalloc(sizeof(struct fsl_dma_chan), GFP_KERNEL); | ||
893 | if (!new_fsl_chan) { | ||
894 | dev_err(&dev->dev, "No free memory for allocating " | ||
895 | "dma channels!\n"); | ||
896 | err = -ENOMEM; | ||
897 | goto err; | ||
898 | } | ||
899 | |||
900 | /* get dma channel register base */ | ||
901 | err = of_address_to_resource(dev->node, 0, &new_fsl_chan->reg); | ||
902 | if (err) { | ||
903 | dev_err(&dev->dev, "Can't get %s property 'reg'\n", | ||
904 | dev->node->full_name); | ||
905 | goto err; | ||
906 | } | ||
907 | |||
908 | new_fsl_chan->feature = *(u32 *)match->data; | ||
909 | |||
910 | if (!fdev->feature) | ||
911 | fdev->feature = new_fsl_chan->feature; | ||
912 | |||
913 | /* If the DMA device's feature is different than its channels', | ||
914 | * report the bug. | ||
915 | */ | ||
916 | WARN_ON(fdev->feature != new_fsl_chan->feature); | ||
917 | |||
918 | new_fsl_chan->dev = &dev->dev; | ||
919 | new_fsl_chan->reg_base = ioremap(new_fsl_chan->reg.start, | ||
920 | new_fsl_chan->reg.end - new_fsl_chan->reg.start + 1); | ||
921 | |||
922 | new_fsl_chan->id = ((new_fsl_chan->reg.start - 0x100) & 0xfff) >> 7; | ||
923 | if (new_fsl_chan->id > FSL_DMA_MAX_CHANS_PER_DEVICE) { | ||
924 | dev_err(&dev->dev, "There is no %d channel!\n", | ||
925 | new_fsl_chan->id); | ||
926 | err = -EINVAL; | ||
927 | goto err; | ||
928 | } | ||
929 | fdev->chan[new_fsl_chan->id] = new_fsl_chan; | ||
930 | tasklet_init(&new_fsl_chan->tasklet, dma_do_tasklet, | ||
931 | (unsigned long)new_fsl_chan); | ||
932 | |||
933 | /* Init the channel */ | ||
934 | dma_init(new_fsl_chan); | ||
935 | |||
936 | /* Clear cdar registers */ | ||
937 | set_cdar(new_fsl_chan, 0); | ||
938 | |||
939 | switch (new_fsl_chan->feature & FSL_DMA_IP_MASK) { | ||
940 | case FSL_DMA_IP_85XX: | ||
941 | new_fsl_chan->toggle_ext_start = fsl_chan_toggle_ext_start; | ||
942 | new_fsl_chan->toggle_ext_pause = fsl_chan_toggle_ext_pause; | ||
943 | case FSL_DMA_IP_83XX: | ||
944 | new_fsl_chan->set_src_loop_size = fsl_chan_set_src_loop_size; | ||
945 | new_fsl_chan->set_dest_loop_size = fsl_chan_set_dest_loop_size; | ||
946 | } | ||
947 | |||
948 | spin_lock_init(&new_fsl_chan->desc_lock); | ||
949 | INIT_LIST_HEAD(&new_fsl_chan->ld_queue); | ||
950 | |||
951 | new_fsl_chan->common.device = &fdev->common; | ||
952 | |||
953 | /* Add the channel to DMA device channel list */ | ||
954 | list_add_tail(&new_fsl_chan->common.device_node, | ||
955 | &fdev->common.channels); | ||
956 | fdev->common.chancnt++; | ||
957 | |||
958 | new_fsl_chan->irq = irq_of_parse_and_map(dev->node, 0); | ||
959 | if (new_fsl_chan->irq != NO_IRQ) { | ||
960 | err = request_irq(new_fsl_chan->irq, | ||
961 | &fsl_dma_chan_do_interrupt, IRQF_SHARED, | ||
962 | "fsldma-channel", new_fsl_chan); | ||
963 | if (err) { | ||
964 | dev_err(&dev->dev, "DMA channel %s request_irq error " | ||
965 | "with return %d\n", dev->node->full_name, err); | ||
966 | goto err; | ||
967 | } | ||
968 | } | ||
969 | |||
970 | #ifdef CONFIG_FSL_DMA_SELFTEST | ||
971 | err = fsl_dma_self_test(new_fsl_chan); | ||
972 | if (err) | ||
973 | goto err; | ||
974 | #endif | ||
975 | |||
976 | dev_info(&dev->dev, "#%d (%s), irq %d\n", new_fsl_chan->id, | ||
977 | match->compatible, new_fsl_chan->irq); | ||
978 | |||
979 | return 0; | ||
980 | err: | ||
981 | dma_halt(new_fsl_chan); | ||
982 | iounmap(new_fsl_chan->reg_base); | ||
983 | free_irq(new_fsl_chan->irq, new_fsl_chan); | ||
984 | list_del(&new_fsl_chan->common.device_node); | ||
985 | kfree(new_fsl_chan); | ||
986 | return err; | ||
987 | } | ||
988 | |||
989 | const u32 mpc8540_dma_ip_feature = FSL_DMA_IP_85XX | FSL_DMA_BIG_ENDIAN; | ||
990 | const u32 mpc8349_dma_ip_feature = FSL_DMA_IP_83XX | FSL_DMA_LITTLE_ENDIAN; | ||
991 | |||
992 | static struct of_device_id of_fsl_dma_chan_ids[] = { | ||
993 | { | ||
994 | .compatible = "fsl,mpc8540-dma-channel", | ||
995 | .data = (void *)&mpc8540_dma_ip_feature, | ||
996 | }, | ||
997 | { | ||
998 | .compatible = "fsl,mpc8349-dma-channel", | ||
999 | .data = (void *)&mpc8349_dma_ip_feature, | ||
1000 | }, | ||
1001 | {} | ||
1002 | }; | ||
1003 | |||
1004 | static struct of_platform_driver of_fsl_dma_chan_driver = { | ||
1005 | .name = "of-fsl-dma-channel", | ||
1006 | .match_table = of_fsl_dma_chan_ids, | ||
1007 | .probe = of_fsl_dma_chan_probe, | ||
1008 | }; | ||
1009 | |||
1010 | static __init int of_fsl_dma_chan_init(void) | ||
1011 | { | ||
1012 | return of_register_platform_driver(&of_fsl_dma_chan_driver); | ||
1013 | } | ||
1014 | |||
1015 | static int __devinit of_fsl_dma_probe(struct of_device *dev, | ||
1016 | const struct of_device_id *match) | ||
1017 | { | ||
1018 | int err; | ||
1019 | unsigned int irq; | ||
1020 | struct fsl_dma_device *fdev; | ||
1021 | |||
1022 | fdev = kzalloc(sizeof(struct fsl_dma_device), GFP_KERNEL); | ||
1023 | if (!fdev) { | ||
1024 | dev_err(&dev->dev, "No enough memory for 'priv'\n"); | ||
1025 | err = -ENOMEM; | ||
1026 | goto err; | ||
1027 | } | ||
1028 | fdev->dev = &dev->dev; | ||
1029 | INIT_LIST_HEAD(&fdev->common.channels); | ||
1030 | |||
1031 | /* get DMA controller register base */ | ||
1032 | err = of_address_to_resource(dev->node, 0, &fdev->reg); | ||
1033 | if (err) { | ||
1034 | dev_err(&dev->dev, "Can't get %s property 'reg'\n", | ||
1035 | dev->node->full_name); | ||
1036 | goto err; | ||
1037 | } | ||
1038 | |||
1039 | dev_info(&dev->dev, "Probe the Freescale DMA driver for %s " | ||
1040 | "controller at %p...\n", | ||
1041 | match->compatible, (void *)fdev->reg.start); | ||
1042 | fdev->reg_base = ioremap(fdev->reg.start, fdev->reg.end | ||
1043 | - fdev->reg.start + 1); | ||
1044 | |||
1045 | dma_cap_set(DMA_MEMCPY, fdev->common.cap_mask); | ||
1046 | dma_cap_set(DMA_INTERRUPT, fdev->common.cap_mask); | ||
1047 | fdev->common.device_alloc_chan_resources = fsl_dma_alloc_chan_resources; | ||
1048 | fdev->common.device_free_chan_resources = fsl_dma_free_chan_resources; | ||
1049 | fdev->common.device_prep_dma_interrupt = fsl_dma_prep_interrupt; | ||
1050 | fdev->common.device_prep_dma_memcpy = fsl_dma_prep_memcpy; | ||
1051 | fdev->common.device_is_tx_complete = fsl_dma_is_complete; | ||
1052 | fdev->common.device_issue_pending = fsl_dma_memcpy_issue_pending; | ||
1053 | fdev->common.device_dependency_added = fsl_dma_dependency_added; | ||
1054 | fdev->common.dev = &dev->dev; | ||
1055 | |||
1056 | irq = irq_of_parse_and_map(dev->node, 0); | ||
1057 | if (irq != NO_IRQ) { | ||
1058 | err = request_irq(irq, &fsl_dma_do_interrupt, IRQF_SHARED, | ||
1059 | "fsldma-device", fdev); | ||
1060 | if (err) { | ||
1061 | dev_err(&dev->dev, "DMA device request_irq error " | ||
1062 | "with return %d\n", err); | ||
1063 | goto err; | ||
1064 | } | ||
1065 | } | ||
1066 | |||
1067 | dev_set_drvdata(&(dev->dev), fdev); | ||
1068 | of_platform_bus_probe(dev->node, of_fsl_dma_chan_ids, &dev->dev); | ||
1069 | |||
1070 | dma_async_device_register(&fdev->common); | ||
1071 | return 0; | ||
1072 | |||
1073 | err: | ||
1074 | iounmap(fdev->reg_base); | ||
1075 | kfree(fdev); | ||
1076 | return err; | ||
1077 | } | ||
1078 | |||
1079 | static struct of_device_id of_fsl_dma_ids[] = { | ||
1080 | { .compatible = "fsl,mpc8540-dma", }, | ||
1081 | { .compatible = "fsl,mpc8349-dma", }, | ||
1082 | {} | ||
1083 | }; | ||
1084 | |||
1085 | static struct of_platform_driver of_fsl_dma_driver = { | ||
1086 | .name = "of-fsl-dma", | ||
1087 | .match_table = of_fsl_dma_ids, | ||
1088 | .probe = of_fsl_dma_probe, | ||
1089 | }; | ||
1090 | |||
1091 | static __init int of_fsl_dma_init(void) | ||
1092 | { | ||
1093 | return of_register_platform_driver(&of_fsl_dma_driver); | ||
1094 | } | ||
1095 | |||
1096 | subsys_initcall(of_fsl_dma_chan_init); | ||
1097 | subsys_initcall(of_fsl_dma_init); | ||
diff --git a/drivers/dma/fsldma.h b/drivers/dma/fsldma.h new file mode 100644 index 000000000000..ba78c42121ba --- /dev/null +++ b/drivers/dma/fsldma.h | |||
@@ -0,0 +1,189 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. | ||
3 | * | ||
4 | * Author: | ||
5 | * Zhang Wei <wei.zhang@freescale.com>, Jul 2007 | ||
6 | * Ebony Zhu <ebony.zhu@freescale.com>, May 2007 | ||
7 | * | ||
8 | * This is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | */ | ||
14 | #ifndef __DMA_FSLDMA_H | ||
15 | #define __DMA_FSLDMA_H | ||
16 | |||
17 | #include <linux/device.h> | ||
18 | #include <linux/dmapool.h> | ||
19 | #include <linux/dmaengine.h> | ||
20 | |||
21 | /* Define data structures needed by Freescale | ||
22 | * MPC8540 and MPC8349 DMA controller. | ||
23 | */ | ||
24 | #define FSL_DMA_MR_CS 0x00000001 | ||
25 | #define FSL_DMA_MR_CC 0x00000002 | ||
26 | #define FSL_DMA_MR_CA 0x00000008 | ||
27 | #define FSL_DMA_MR_EIE 0x00000040 | ||
28 | #define FSL_DMA_MR_XFE 0x00000020 | ||
29 | #define FSL_DMA_MR_EOLNIE 0x00000100 | ||
30 | #define FSL_DMA_MR_EOLSIE 0x00000080 | ||
31 | #define FSL_DMA_MR_EOSIE 0x00000200 | ||
32 | #define FSL_DMA_MR_CDSM 0x00000010 | ||
33 | #define FSL_DMA_MR_CTM 0x00000004 | ||
34 | #define FSL_DMA_MR_EMP_EN 0x00200000 | ||
35 | #define FSL_DMA_MR_EMS_EN 0x00040000 | ||
36 | #define FSL_DMA_MR_DAHE 0x00002000 | ||
37 | #define FSL_DMA_MR_SAHE 0x00001000 | ||
38 | |||
39 | /* Special MR definition for MPC8349 */ | ||
40 | #define FSL_DMA_MR_EOTIE 0x00000080 | ||
41 | |||
42 | #define FSL_DMA_SR_CH 0x00000020 | ||
43 | #define FSL_DMA_SR_CB 0x00000004 | ||
44 | #define FSL_DMA_SR_TE 0x00000080 | ||
45 | #define FSL_DMA_SR_EOSI 0x00000002 | ||
46 | #define FSL_DMA_SR_EOLSI 0x00000001 | ||
47 | #define FSL_DMA_SR_EOCDI 0x00000001 | ||
48 | #define FSL_DMA_SR_EOLNI 0x00000008 | ||
49 | |||
50 | #define FSL_DMA_SATR_SBPATMU 0x20000000 | ||
51 | #define FSL_DMA_SATR_STRANSINT_RIO 0x00c00000 | ||
52 | #define FSL_DMA_SATR_SREADTYPE_SNOOP_READ 0x00050000 | ||
53 | #define FSL_DMA_SATR_SREADTYPE_BP_IORH 0x00020000 | ||
54 | #define FSL_DMA_SATR_SREADTYPE_BP_NREAD 0x00040000 | ||
55 | #define FSL_DMA_SATR_SREADTYPE_BP_MREAD 0x00070000 | ||
56 | |||
57 | #define FSL_DMA_DATR_DBPATMU 0x20000000 | ||
58 | #define FSL_DMA_DATR_DTRANSINT_RIO 0x00c00000 | ||
59 | #define FSL_DMA_DATR_DWRITETYPE_SNOOP_WRITE 0x00050000 | ||
60 | #define FSL_DMA_DATR_DWRITETYPE_BP_FLUSH 0x00010000 | ||
61 | |||
62 | #define FSL_DMA_EOL ((u64)0x1) | ||
63 | #define FSL_DMA_SNEN ((u64)0x10) | ||
64 | #define FSL_DMA_EOSIE 0x8 | ||
65 | #define FSL_DMA_NLDA_MASK (~(u64)0x1f) | ||
66 | |||
67 | #define FSL_DMA_BCR_MAX_CNT 0x03ffffffu | ||
68 | |||
69 | #define FSL_DMA_DGSR_TE 0x80 | ||
70 | #define FSL_DMA_DGSR_CH 0x20 | ||
71 | #define FSL_DMA_DGSR_PE 0x10 | ||
72 | #define FSL_DMA_DGSR_EOLNI 0x08 | ||
73 | #define FSL_DMA_DGSR_CB 0x04 | ||
74 | #define FSL_DMA_DGSR_EOSI 0x02 | ||
75 | #define FSL_DMA_DGSR_EOLSI 0x01 | ||
76 | |||
77 | struct fsl_dma_ld_hw { | ||
78 | u64 __bitwise src_addr; | ||
79 | u64 __bitwise dst_addr; | ||
80 | u64 __bitwise next_ln_addr; | ||
81 | u32 __bitwise count; | ||
82 | u32 __bitwise reserve; | ||
83 | } __attribute__((aligned(32))); | ||
84 | |||
85 | struct fsl_desc_sw { | ||
86 | struct fsl_dma_ld_hw hw; | ||
87 | struct list_head node; | ||
88 | struct dma_async_tx_descriptor async_tx; | ||
89 | struct list_head *ld; | ||
90 | void *priv; | ||
91 | } __attribute__((aligned(32))); | ||
92 | |||
93 | struct fsl_dma_chan_regs { | ||
94 | u32 __bitwise mr; /* 0x00 - Mode Register */ | ||
95 | u32 __bitwise sr; /* 0x04 - Status Register */ | ||
96 | u64 __bitwise cdar; /* 0x08 - Current descriptor address register */ | ||
97 | u64 __bitwise sar; /* 0x10 - Source Address Register */ | ||
98 | u64 __bitwise dar; /* 0x18 - Destination Address Register */ | ||
99 | u32 __bitwise bcr; /* 0x20 - Byte Count Register */ | ||
100 | u64 __bitwise ndar; /* 0x24 - Next Descriptor Address Register */ | ||
101 | }; | ||
102 | |||
103 | struct fsl_dma_chan; | ||
104 | #define FSL_DMA_MAX_CHANS_PER_DEVICE 4 | ||
105 | |||
106 | struct fsl_dma_device { | ||
107 | void __iomem *reg_base; /* DGSR register base */ | ||
108 | struct resource reg; /* Resource for register */ | ||
109 | struct device *dev; | ||
110 | struct dma_device common; | ||
111 | struct fsl_dma_chan *chan[FSL_DMA_MAX_CHANS_PER_DEVICE]; | ||
112 | u32 feature; /* The same as DMA channels */ | ||
113 | }; | ||
114 | |||
115 | /* Define macros for fsl_dma_chan->feature property */ | ||
116 | #define FSL_DMA_LITTLE_ENDIAN 0x00000000 | ||
117 | #define FSL_DMA_BIG_ENDIAN 0x00000001 | ||
118 | |||
119 | #define FSL_DMA_IP_MASK 0x00000ff0 | ||
120 | #define FSL_DMA_IP_85XX 0x00000010 | ||
121 | #define FSL_DMA_IP_83XX 0x00000020 | ||
122 | |||
123 | #define FSL_DMA_CHAN_PAUSE_EXT 0x00001000 | ||
124 | #define FSL_DMA_CHAN_START_EXT 0x00002000 | ||
125 | |||
126 | struct fsl_dma_chan { | ||
127 | struct fsl_dma_chan_regs __iomem *reg_base; | ||
128 | dma_cookie_t completed_cookie; /* The maximum cookie completed */ | ||
129 | spinlock_t desc_lock; /* Descriptor operation lock */ | ||
130 | struct list_head ld_queue; /* Link descriptors queue */ | ||
131 | struct dma_chan common; /* DMA common channel */ | ||
132 | struct dma_pool *desc_pool; /* Descriptors pool */ | ||
133 | struct device *dev; /* Channel device */ | ||
134 | struct resource reg; /* Resource for register */ | ||
135 | int irq; /* Channel IRQ */ | ||
136 | int id; /* Raw id of this channel */ | ||
137 | struct tasklet_struct tasklet; | ||
138 | u32 feature; | ||
139 | |||
140 | void (*toggle_ext_pause)(struct fsl_dma_chan *fsl_chan, int size); | ||
141 | void (*toggle_ext_start)(struct fsl_dma_chan *fsl_chan, int enable); | ||
142 | void (*set_src_loop_size)(struct fsl_dma_chan *fsl_chan, int size); | ||
143 | void (*set_dest_loop_size)(struct fsl_dma_chan *fsl_chan, int size); | ||
144 | }; | ||
145 | |||
146 | #define to_fsl_chan(chan) container_of(chan, struct fsl_dma_chan, common) | ||
147 | #define to_fsl_desc(lh) container_of(lh, struct fsl_desc_sw, node) | ||
148 | #define tx_to_fsl_desc(tx) container_of(tx, struct fsl_desc_sw, async_tx) | ||
149 | |||
150 | #ifndef __powerpc64__ | ||
151 | static u64 in_be64(const u64 __iomem *addr) | ||
152 | { | ||
153 | return ((u64)in_be32((u32 *)addr) << 32) | (in_be32((u32 *)addr + 1)); | ||
154 | } | ||
155 | |||
156 | static void out_be64(u64 __iomem *addr, u64 val) | ||
157 | { | ||
158 | out_be32((u32 *)addr, val >> 32); | ||
159 | out_be32((u32 *)addr + 1, (u32)val); | ||
160 | } | ||
161 | |||
162 | /* There is no asm instructions for 64 bits reverse loads and stores */ | ||
163 | static u64 in_le64(const u64 __iomem *addr) | ||
164 | { | ||
165 | return ((u64)in_le32((u32 *)addr + 1) << 32) | (in_le32((u32 *)addr)); | ||
166 | } | ||
167 | |||
168 | static void out_le64(u64 __iomem *addr, u64 val) | ||
169 | { | ||
170 | out_le32((u32 *)addr + 1, val >> 32); | ||
171 | out_le32((u32 *)addr, (u32)val); | ||
172 | } | ||
173 | #endif | ||
174 | |||
175 | #define DMA_IN(fsl_chan, addr, width) \ | ||
176 | (((fsl_chan)->feature & FSL_DMA_BIG_ENDIAN) ? \ | ||
177 | in_be##width(addr) : in_le##width(addr)) | ||
178 | #define DMA_OUT(fsl_chan, addr, val, width) \ | ||
179 | (((fsl_chan)->feature & FSL_DMA_BIG_ENDIAN) ? \ | ||
180 | out_be##width(addr, val) : out_le##width(addr, val)) | ||
181 | |||
182 | #define DMA_TO_CPU(fsl_chan, d, width) \ | ||
183 | (((fsl_chan)->feature & FSL_DMA_BIG_ENDIAN) ? \ | ||
184 | be##width##_to_cpu(d) : le##width##_to_cpu(d)) | ||
185 | #define CPU_TO_DMA(fsl_chan, c, width) \ | ||
186 | (((fsl_chan)->feature & FSL_DMA_BIG_ENDIAN) ? \ | ||
187 | cpu_to_be##width(c) : cpu_to_le##width(c)) | ||
188 | |||
189 | #endif /* __DMA_FSLDMA_H */ | ||
diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c index dff38accc5c1..4017d9e7acd2 100644 --- a/drivers/dma/ioat_dma.c +++ b/drivers/dma/ioat_dma.c | |||
@@ -714,6 +714,7 @@ static struct dma_async_tx_descriptor *ioat1_dma_prep_memcpy( | |||
714 | new->len = len; | 714 | new->len = len; |
715 | new->dst = dma_dest; | 715 | new->dst = dma_dest; |
716 | new->src = dma_src; | 716 | new->src = dma_src; |
717 | new->async_tx.ack = 0; | ||
717 | return &new->async_tx; | 718 | return &new->async_tx; |
718 | } else | 719 | } else |
719 | return NULL; | 720 | return NULL; |
@@ -741,6 +742,7 @@ static struct dma_async_tx_descriptor *ioat2_dma_prep_memcpy( | |||
741 | new->len = len; | 742 | new->len = len; |
742 | new->dst = dma_dest; | 743 | new->dst = dma_dest; |
743 | new->src = dma_src; | 744 | new->src = dma_src; |
745 | new->async_tx.ack = 0; | ||
744 | return &new->async_tx; | 746 | return &new->async_tx; |
745 | } else | 747 | } else |
746 | return NULL; | 748 | return NULL; |
diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c index 3986d54492bd..f82b0906d466 100644 --- a/drivers/dma/iop-adma.c +++ b/drivers/dma/iop-adma.c | |||
@@ -140,7 +140,7 @@ static void __iop_adma_slot_cleanup(struct iop_adma_chan *iop_chan) | |||
140 | int busy = iop_chan_is_busy(iop_chan); | 140 | int busy = iop_chan_is_busy(iop_chan); |
141 | int seen_current = 0, slot_cnt = 0, slots_per_op = 0; | 141 | int seen_current = 0, slot_cnt = 0, slots_per_op = 0; |
142 | 142 | ||
143 | dev_dbg(iop_chan->device->common.dev, "%s\n", __FUNCTION__); | 143 | dev_dbg(iop_chan->device->common.dev, "%s\n", __func__); |
144 | /* free completed slots from the chain starting with | 144 | /* free completed slots from the chain starting with |
145 | * the oldest descriptor | 145 | * the oldest descriptor |
146 | */ | 146 | */ |
@@ -438,7 +438,7 @@ iop_adma_tx_submit(struct dma_async_tx_descriptor *tx) | |||
438 | spin_unlock_bh(&iop_chan->lock); | 438 | spin_unlock_bh(&iop_chan->lock); |
439 | 439 | ||
440 | dev_dbg(iop_chan->device->common.dev, "%s cookie: %d slot: %d\n", | 440 | dev_dbg(iop_chan->device->common.dev, "%s cookie: %d slot: %d\n", |
441 | __FUNCTION__, sw_desc->async_tx.cookie, sw_desc->idx); | 441 | __func__, sw_desc->async_tx.cookie, sw_desc->idx); |
442 | 442 | ||
443 | return cookie; | 443 | return cookie; |
444 | } | 444 | } |
@@ -520,7 +520,7 @@ iop_adma_prep_dma_interrupt(struct dma_chan *chan) | |||
520 | struct iop_adma_desc_slot *sw_desc, *grp_start; | 520 | struct iop_adma_desc_slot *sw_desc, *grp_start; |
521 | int slot_cnt, slots_per_op; | 521 | int slot_cnt, slots_per_op; |
522 | 522 | ||
523 | dev_dbg(iop_chan->device->common.dev, "%s\n", __FUNCTION__); | 523 | dev_dbg(iop_chan->device->common.dev, "%s\n", __func__); |
524 | 524 | ||
525 | spin_lock_bh(&iop_chan->lock); | 525 | spin_lock_bh(&iop_chan->lock); |
526 | slot_cnt = iop_chan_interrupt_slot_count(&slots_per_op, iop_chan); | 526 | slot_cnt = iop_chan_interrupt_slot_count(&slots_per_op, iop_chan); |
@@ -548,7 +548,7 @@ iop_adma_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dma_dest, | |||
548 | BUG_ON(unlikely(len > IOP_ADMA_MAX_BYTE_COUNT)); | 548 | BUG_ON(unlikely(len > IOP_ADMA_MAX_BYTE_COUNT)); |
549 | 549 | ||
550 | dev_dbg(iop_chan->device->common.dev, "%s len: %u\n", | 550 | dev_dbg(iop_chan->device->common.dev, "%s len: %u\n", |
551 | __FUNCTION__, len); | 551 | __func__, len); |
552 | 552 | ||
553 | spin_lock_bh(&iop_chan->lock); | 553 | spin_lock_bh(&iop_chan->lock); |
554 | slot_cnt = iop_chan_memcpy_slot_count(len, &slots_per_op); | 554 | slot_cnt = iop_chan_memcpy_slot_count(len, &slots_per_op); |
@@ -580,7 +580,7 @@ iop_adma_prep_dma_memset(struct dma_chan *chan, dma_addr_t dma_dest, | |||
580 | BUG_ON(unlikely(len > IOP_ADMA_MAX_BYTE_COUNT)); | 580 | BUG_ON(unlikely(len > IOP_ADMA_MAX_BYTE_COUNT)); |
581 | 581 | ||
582 | dev_dbg(iop_chan->device->common.dev, "%s len: %u\n", | 582 | dev_dbg(iop_chan->device->common.dev, "%s len: %u\n", |
583 | __FUNCTION__, len); | 583 | __func__, len); |
584 | 584 | ||
585 | spin_lock_bh(&iop_chan->lock); | 585 | spin_lock_bh(&iop_chan->lock); |
586 | slot_cnt = iop_chan_memset_slot_count(len, &slots_per_op); | 586 | slot_cnt = iop_chan_memset_slot_count(len, &slots_per_op); |
@@ -614,7 +614,7 @@ iop_adma_prep_dma_xor(struct dma_chan *chan, dma_addr_t dma_dest, | |||
614 | 614 | ||
615 | dev_dbg(iop_chan->device->common.dev, | 615 | dev_dbg(iop_chan->device->common.dev, |
616 | "%s src_cnt: %d len: %u flags: %lx\n", | 616 | "%s src_cnt: %d len: %u flags: %lx\n", |
617 | __FUNCTION__, src_cnt, len, flags); | 617 | __func__, src_cnt, len, flags); |
618 | 618 | ||
619 | spin_lock_bh(&iop_chan->lock); | 619 | spin_lock_bh(&iop_chan->lock); |
620 | slot_cnt = iop_chan_xor_slot_count(len, src_cnt, &slots_per_op); | 620 | slot_cnt = iop_chan_xor_slot_count(len, src_cnt, &slots_per_op); |
@@ -648,7 +648,7 @@ iop_adma_prep_dma_zero_sum(struct dma_chan *chan, dma_addr_t *dma_src, | |||
648 | return NULL; | 648 | return NULL; |
649 | 649 | ||
650 | dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %u\n", | 650 | dev_dbg(iop_chan->device->common.dev, "%s src_cnt: %d len: %u\n", |
651 | __FUNCTION__, src_cnt, len); | 651 | __func__, src_cnt, len); |
652 | 652 | ||
653 | spin_lock_bh(&iop_chan->lock); | 653 | spin_lock_bh(&iop_chan->lock); |
654 | slot_cnt = iop_chan_zero_sum_slot_count(len, src_cnt, &slots_per_op); | 654 | slot_cnt = iop_chan_zero_sum_slot_count(len, src_cnt, &slots_per_op); |
@@ -659,7 +659,7 @@ iop_adma_prep_dma_zero_sum(struct dma_chan *chan, dma_addr_t *dma_src, | |||
659 | iop_desc_set_zero_sum_byte_count(grp_start, len); | 659 | iop_desc_set_zero_sum_byte_count(grp_start, len); |
660 | grp_start->xor_check_result = result; | 660 | grp_start->xor_check_result = result; |
661 | pr_debug("\t%s: grp_start->xor_check_result: %p\n", | 661 | pr_debug("\t%s: grp_start->xor_check_result: %p\n", |
662 | __FUNCTION__, grp_start->xor_check_result); | 662 | __func__, grp_start->xor_check_result); |
663 | sw_desc->unmap_src_cnt = src_cnt; | 663 | sw_desc->unmap_src_cnt = src_cnt; |
664 | sw_desc->unmap_len = len; | 664 | sw_desc->unmap_len = len; |
665 | while (src_cnt--) | 665 | while (src_cnt--) |
@@ -700,7 +700,7 @@ static void iop_adma_free_chan_resources(struct dma_chan *chan) | |||
700 | iop_chan->last_used = NULL; | 700 | iop_chan->last_used = NULL; |
701 | 701 | ||
702 | dev_dbg(iop_chan->device->common.dev, "%s slots_allocated %d\n", | 702 | dev_dbg(iop_chan->device->common.dev, "%s slots_allocated %d\n", |
703 | __FUNCTION__, iop_chan->slots_allocated); | 703 | __func__, iop_chan->slots_allocated); |
704 | spin_unlock_bh(&iop_chan->lock); | 704 | spin_unlock_bh(&iop_chan->lock); |
705 | 705 | ||
706 | /* one is ok since we left it on there on purpose */ | 706 | /* one is ok since we left it on there on purpose */ |
@@ -753,7 +753,7 @@ static irqreturn_t iop_adma_eot_handler(int irq, void *data) | |||
753 | { | 753 | { |
754 | struct iop_adma_chan *chan = data; | 754 | struct iop_adma_chan *chan = data; |
755 | 755 | ||
756 | dev_dbg(chan->device->common.dev, "%s\n", __FUNCTION__); | 756 | dev_dbg(chan->device->common.dev, "%s\n", __func__); |
757 | 757 | ||
758 | tasklet_schedule(&chan->irq_tasklet); | 758 | tasklet_schedule(&chan->irq_tasklet); |
759 | 759 | ||
@@ -766,7 +766,7 @@ static irqreturn_t iop_adma_eoc_handler(int irq, void *data) | |||
766 | { | 766 | { |
767 | struct iop_adma_chan *chan = data; | 767 | struct iop_adma_chan *chan = data; |
768 | 768 | ||
769 | dev_dbg(chan->device->common.dev, "%s\n", __FUNCTION__); | 769 | dev_dbg(chan->device->common.dev, "%s\n", __func__); |
770 | 770 | ||
771 | tasklet_schedule(&chan->irq_tasklet); | 771 | tasklet_schedule(&chan->irq_tasklet); |
772 | 772 | ||
@@ -823,7 +823,7 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device) | |||
823 | int err = 0; | 823 | int err = 0; |
824 | struct iop_adma_chan *iop_chan; | 824 | struct iop_adma_chan *iop_chan; |
825 | 825 | ||
826 | dev_dbg(device->common.dev, "%s\n", __FUNCTION__); | 826 | dev_dbg(device->common.dev, "%s\n", __func__); |
827 | 827 | ||
828 | src = kzalloc(sizeof(u8) * IOP_ADMA_TEST_SIZE, GFP_KERNEL); | 828 | src = kzalloc(sizeof(u8) * IOP_ADMA_TEST_SIZE, GFP_KERNEL); |
829 | if (!src) | 829 | if (!src) |
@@ -906,7 +906,7 @@ iop_adma_xor_zero_sum_self_test(struct iop_adma_device *device) | |||
906 | int err = 0; | 906 | int err = 0; |
907 | struct iop_adma_chan *iop_chan; | 907 | struct iop_adma_chan *iop_chan; |
908 | 908 | ||
909 | dev_dbg(device->common.dev, "%s\n", __FUNCTION__); | 909 | dev_dbg(device->common.dev, "%s\n", __func__); |
910 | 910 | ||
911 | for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) { | 911 | for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) { |
912 | xor_srcs[src_idx] = alloc_page(GFP_KERNEL); | 912 | xor_srcs[src_idx] = alloc_page(GFP_KERNEL); |
@@ -1159,7 +1159,7 @@ static int __devinit iop_adma_probe(struct platform_device *pdev) | |||
1159 | } | 1159 | } |
1160 | 1160 | ||
1161 | dev_dbg(&pdev->dev, "%s: allocted descriptor pool virt %p phys %p\n", | 1161 | dev_dbg(&pdev->dev, "%s: allocted descriptor pool virt %p phys %p\n", |
1162 | __FUNCTION__, adev->dma_desc_pool_virt, | 1162 | __func__, adev->dma_desc_pool_virt, |
1163 | (void *) adev->dma_desc_pool); | 1163 | (void *) adev->dma_desc_pool); |
1164 | 1164 | ||
1165 | adev->id = plat_data->hw_id; | 1165 | adev->id = plat_data->hw_id; |
@@ -1289,7 +1289,7 @@ static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan) | |||
1289 | dma_cookie_t cookie; | 1289 | dma_cookie_t cookie; |
1290 | int slot_cnt, slots_per_op; | 1290 | int slot_cnt, slots_per_op; |
1291 | 1291 | ||
1292 | dev_dbg(iop_chan->device->common.dev, "%s\n", __FUNCTION__); | 1292 | dev_dbg(iop_chan->device->common.dev, "%s\n", __func__); |
1293 | 1293 | ||
1294 | spin_lock_bh(&iop_chan->lock); | 1294 | spin_lock_bh(&iop_chan->lock); |
1295 | slot_cnt = iop_chan_memcpy_slot_count(0, &slots_per_op); | 1295 | slot_cnt = iop_chan_memcpy_slot_count(0, &slots_per_op); |
@@ -1346,7 +1346,7 @@ static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan) | |||
1346 | dma_cookie_t cookie; | 1346 | dma_cookie_t cookie; |
1347 | int slot_cnt, slots_per_op; | 1347 | int slot_cnt, slots_per_op; |
1348 | 1348 | ||
1349 | dev_dbg(iop_chan->device->common.dev, "%s\n", __FUNCTION__); | 1349 | dev_dbg(iop_chan->device->common.dev, "%s\n", __func__); |
1350 | 1350 | ||
1351 | spin_lock_bh(&iop_chan->lock); | 1351 | spin_lock_bh(&iop_chan->lock); |
1352 | slot_cnt = iop_chan_xor_slot_count(0, 2, &slots_per_op); | 1352 | slot_cnt = iop_chan_xor_slot_count(0, 2, &slots_per_op); |
diff --git a/drivers/firewire/Kconfig b/drivers/firewire/Kconfig index fe9e768cfbc4..25bdc2dd9ce1 100644 --- a/drivers/firewire/Kconfig +++ b/drivers/firewire/Kconfig | |||
@@ -1,5 +1,3 @@ | |||
1 | # -*- shell-script -*- | ||
2 | |||
3 | comment "An alternative FireWire stack is available with EXPERIMENTAL=y" | 1 | comment "An alternative FireWire stack is available with EXPERIMENTAL=y" |
4 | depends on EXPERIMENTAL=n | 2 | depends on EXPERIMENTAL=n |
5 | 3 | ||
@@ -21,27 +19,7 @@ config FIREWIRE | |||
21 | NOTE: | 19 | NOTE: |
22 | 20 | ||
23 | You should only build ONE of the stacks, unless you REALLY know what | 21 | You should only build ONE of the stacks, unless you REALLY know what |
24 | you are doing. If you install both, you should configure them only as | 22 | you are doing. |
25 | modules rather than link them statically, and you should blacklist one | ||
26 | of the concurrent low-level drivers in /etc/modprobe.conf. Add either | ||
27 | |||
28 | blacklist firewire-ohci | ||
29 | or | ||
30 | blacklist ohci1394 | ||
31 | |||
32 | there depending on which driver you DON'T want to have auto-loaded. | ||
33 | You can optionally do the same with the other IEEE 1394/ FireWire | ||
34 | drivers. | ||
35 | |||
36 | If you have an old modprobe which doesn't implement the blacklist | ||
37 | directive, use either | ||
38 | |||
39 | install firewire-ohci /bin/true | ||
40 | or | ||
41 | install ohci1394 /bin/true | ||
42 | |||
43 | and so on, depending on which modules you DON't want to have | ||
44 | auto-loaded. | ||
45 | 23 | ||
46 | config FIREWIRE_OHCI | 24 | config FIREWIRE_OHCI |
47 | tristate "Support for OHCI FireWire host controllers" | 25 | tristate "Support for OHCI FireWire host controllers" |
@@ -57,8 +35,24 @@ config FIREWIRE_OHCI | |||
57 | 35 | ||
58 | NOTE: | 36 | NOTE: |
59 | 37 | ||
60 | If you also build ohci1394 of the classic stack, blacklist either | 38 | You should only build ohci1394 or firewire-ohci, but not both. |
61 | ohci1394 or firewire-ohci to let hotplug load only the desired driver. | 39 | If you nevertheless want to install both, you should configure them |
40 | only as modules and blacklist the driver(s) which you don't want to | ||
41 | have auto-loaded. Add either | ||
42 | |||
43 | blacklist firewire-ohci | ||
44 | or | ||
45 | blacklist ohci1394 | ||
46 | blacklist video1394 | ||
47 | blacklist dv1394 | ||
48 | |||
49 | to /etc/modprobe.conf or /etc/modprobe.d/* and update modprobe.conf | ||
50 | depending on your distribution. The latter two modules should be | ||
51 | blacklisted together with ohci1394 because they depend on ohci1394. | ||
52 | |||
53 | If you have an old modprobe which doesn't implement the blacklist | ||
54 | directive, use "install modulename /bin/true" for the modules to be | ||
55 | blacklisted. | ||
62 | 56 | ||
63 | config FIREWIRE_SBP2 | 57 | config FIREWIRE_SBP2 |
64 | tristate "Support for storage devices (SBP-2 protocol driver)" | 58 | tristate "Support for storage devices (SBP-2 protocol driver)" |
@@ -75,9 +69,3 @@ config FIREWIRE_SBP2 | |||
75 | 69 | ||
76 | You should also enable support for disks, CD-ROMs, etc. in the SCSI | 70 | You should also enable support for disks, CD-ROMs, etc. in the SCSI |
77 | configuration section. | 71 | configuration section. |
78 | |||
79 | NOTE: | ||
80 | |||
81 | If you also build sbp2 of the classic stack, blacklist either sbp2 | ||
82 | or firewire-sbp2 to let hotplug load only the desired driver. | ||
83 | |||
diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c index 3e9719948a8e..a03462750b95 100644 --- a/drivers/firewire/fw-card.c +++ b/drivers/firewire/fw-card.c | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/errno.h> | 20 | #include <linux/errno.h> |
21 | #include <linux/delay.h> | ||
21 | #include <linux/device.h> | 22 | #include <linux/device.h> |
22 | #include <linux/mutex.h> | 23 | #include <linux/mutex.h> |
23 | #include <linux/crc-itu-t.h> | 24 | #include <linux/crc-itu-t.h> |
@@ -214,17 +215,29 @@ static void | |||
214 | fw_card_bm_work(struct work_struct *work) | 215 | fw_card_bm_work(struct work_struct *work) |
215 | { | 216 | { |
216 | struct fw_card *card = container_of(work, struct fw_card, work.work); | 217 | struct fw_card *card = container_of(work, struct fw_card, work.work); |
217 | struct fw_device *root; | 218 | struct fw_device *root_device; |
219 | struct fw_node *root_node, *local_node; | ||
218 | struct bm_data bmd; | 220 | struct bm_data bmd; |
219 | unsigned long flags; | 221 | unsigned long flags; |
220 | int root_id, new_root_id, irm_id, gap_count, generation, grace; | 222 | int root_id, new_root_id, irm_id, gap_count, generation, grace; |
221 | int do_reset = 0; | 223 | int do_reset = 0; |
222 | 224 | ||
223 | spin_lock_irqsave(&card->lock, flags); | 225 | spin_lock_irqsave(&card->lock, flags); |
226 | local_node = card->local_node; | ||
227 | root_node = card->root_node; | ||
228 | |||
229 | if (local_node == NULL) { | ||
230 | spin_unlock_irqrestore(&card->lock, flags); | ||
231 | return; | ||
232 | } | ||
233 | fw_node_get(local_node); | ||
234 | fw_node_get(root_node); | ||
224 | 235 | ||
225 | generation = card->generation; | 236 | generation = card->generation; |
226 | root = card->root_node->data; | 237 | root_device = root_node->data; |
227 | root_id = card->root_node->node_id; | 238 | if (root_device) |
239 | fw_device_get(root_device); | ||
240 | root_id = root_node->node_id; | ||
228 | grace = time_after(jiffies, card->reset_jiffies + DIV_ROUND_UP(HZ, 10)); | 241 | grace = time_after(jiffies, card->reset_jiffies + DIV_ROUND_UP(HZ, 10)); |
229 | 242 | ||
230 | if (card->bm_generation + 1 == generation || | 243 | if (card->bm_generation + 1 == generation || |
@@ -243,14 +256,14 @@ fw_card_bm_work(struct work_struct *work) | |||
243 | 256 | ||
244 | irm_id = card->irm_node->node_id; | 257 | irm_id = card->irm_node->node_id; |
245 | if (!card->irm_node->link_on) { | 258 | if (!card->irm_node->link_on) { |
246 | new_root_id = card->local_node->node_id; | 259 | new_root_id = local_node->node_id; |
247 | fw_notify("IRM has link off, making local node (%02x) root.\n", | 260 | fw_notify("IRM has link off, making local node (%02x) root.\n", |
248 | new_root_id); | 261 | new_root_id); |
249 | goto pick_me; | 262 | goto pick_me; |
250 | } | 263 | } |
251 | 264 | ||
252 | bmd.lock.arg = cpu_to_be32(0x3f); | 265 | bmd.lock.arg = cpu_to_be32(0x3f); |
253 | bmd.lock.data = cpu_to_be32(card->local_node->node_id); | 266 | bmd.lock.data = cpu_to_be32(local_node->node_id); |
254 | 267 | ||
255 | spin_unlock_irqrestore(&card->lock, flags); | 268 | spin_unlock_irqrestore(&card->lock, flags); |
256 | 269 | ||
@@ -267,12 +280,12 @@ fw_card_bm_work(struct work_struct *work) | |||
267 | * Another bus reset happened. Just return, | 280 | * Another bus reset happened. Just return, |
268 | * the BM work has been rescheduled. | 281 | * the BM work has been rescheduled. |
269 | */ | 282 | */ |
270 | return; | 283 | goto out; |
271 | } | 284 | } |
272 | 285 | ||
273 | if (bmd.rcode == RCODE_COMPLETE && bmd.old != 0x3f) | 286 | if (bmd.rcode == RCODE_COMPLETE && bmd.old != 0x3f) |
274 | /* Somebody else is BM, let them do the work. */ | 287 | /* Somebody else is BM, let them do the work. */ |
275 | return; | 288 | goto out; |
276 | 289 | ||
277 | spin_lock_irqsave(&card->lock, flags); | 290 | spin_lock_irqsave(&card->lock, flags); |
278 | if (bmd.rcode != RCODE_COMPLETE) { | 291 | if (bmd.rcode != RCODE_COMPLETE) { |
@@ -282,7 +295,7 @@ fw_card_bm_work(struct work_struct *work) | |||
282 | * do a bus reset and pick the local node as | 295 | * do a bus reset and pick the local node as |
283 | * root, and thus, IRM. | 296 | * root, and thus, IRM. |
284 | */ | 297 | */ |
285 | new_root_id = card->local_node->node_id; | 298 | new_root_id = local_node->node_id; |
286 | fw_notify("BM lock failed, making local node (%02x) root.\n", | 299 | fw_notify("BM lock failed, making local node (%02x) root.\n", |
287 | new_root_id); | 300 | new_root_id); |
288 | goto pick_me; | 301 | goto pick_me; |
@@ -295,7 +308,7 @@ fw_card_bm_work(struct work_struct *work) | |||
295 | */ | 308 | */ |
296 | spin_unlock_irqrestore(&card->lock, flags); | 309 | spin_unlock_irqrestore(&card->lock, flags); |
297 | schedule_delayed_work(&card->work, DIV_ROUND_UP(HZ, 10)); | 310 | schedule_delayed_work(&card->work, DIV_ROUND_UP(HZ, 10)); |
298 | return; | 311 | goto out; |
299 | } | 312 | } |
300 | 313 | ||
301 | /* | 314 | /* |
@@ -305,20 +318,20 @@ fw_card_bm_work(struct work_struct *work) | |||
305 | */ | 318 | */ |
306 | card->bm_generation = generation; | 319 | card->bm_generation = generation; |
307 | 320 | ||
308 | if (root == NULL) { | 321 | if (root_device == NULL) { |
309 | /* | 322 | /* |
310 | * Either link_on is false, or we failed to read the | 323 | * Either link_on is false, or we failed to read the |
311 | * config rom. In either case, pick another root. | 324 | * config rom. In either case, pick another root. |
312 | */ | 325 | */ |
313 | new_root_id = card->local_node->node_id; | 326 | new_root_id = local_node->node_id; |
314 | } else if (atomic_read(&root->state) != FW_DEVICE_RUNNING) { | 327 | } else if (atomic_read(&root_device->state) != FW_DEVICE_RUNNING) { |
315 | /* | 328 | /* |
316 | * If we haven't probed this device yet, bail out now | 329 | * If we haven't probed this device yet, bail out now |
317 | * and let's try again once that's done. | 330 | * and let's try again once that's done. |
318 | */ | 331 | */ |
319 | spin_unlock_irqrestore(&card->lock, flags); | 332 | spin_unlock_irqrestore(&card->lock, flags); |
320 | return; | 333 | goto out; |
321 | } else if (root->config_rom[2] & BIB_CMC) { | 334 | } else if (root_device->config_rom[2] & BIB_CMC) { |
322 | /* | 335 | /* |
323 | * FIXME: I suppose we should set the cmstr bit in the | 336 | * FIXME: I suppose we should set the cmstr bit in the |
324 | * STATE_CLEAR register of this node, as described in | 337 | * STATE_CLEAR register of this node, as described in |
@@ -332,7 +345,7 @@ fw_card_bm_work(struct work_struct *work) | |||
332 | * successfully read the config rom, but it's not | 345 | * successfully read the config rom, but it's not |
333 | * cycle master capable. | 346 | * cycle master capable. |
334 | */ | 347 | */ |
335 | new_root_id = card->local_node->node_id; | 348 | new_root_id = local_node->node_id; |
336 | } | 349 | } |
337 | 350 | ||
338 | pick_me: | 351 | pick_me: |
@@ -341,8 +354,8 @@ fw_card_bm_work(struct work_struct *work) | |||
341 | * the typically much larger 1394b beta repeater delays though. | 354 | * the typically much larger 1394b beta repeater delays though. |
342 | */ | 355 | */ |
343 | if (!card->beta_repeaters_present && | 356 | if (!card->beta_repeaters_present && |
344 | card->root_node->max_hops < ARRAY_SIZE(gap_count_table)) | 357 | root_node->max_hops < ARRAY_SIZE(gap_count_table)) |
345 | gap_count = gap_count_table[card->root_node->max_hops]; | 358 | gap_count = gap_count_table[root_node->max_hops]; |
346 | else | 359 | else |
347 | gap_count = 63; | 360 | gap_count = 63; |
348 | 361 | ||
@@ -364,6 +377,11 @@ fw_card_bm_work(struct work_struct *work) | |||
364 | fw_send_phy_config(card, new_root_id, generation, gap_count); | 377 | fw_send_phy_config(card, new_root_id, generation, gap_count); |
365 | fw_core_initiate_bus_reset(card, 1); | 378 | fw_core_initiate_bus_reset(card, 1); |
366 | } | 379 | } |
380 | out: | ||
381 | if (root_device) | ||
382 | fw_device_put(root_device); | ||
383 | fw_node_put(root_node); | ||
384 | fw_node_put(local_node); | ||
367 | } | 385 | } |
368 | 386 | ||
369 | static void | 387 | static void |
@@ -381,6 +399,7 @@ fw_card_initialize(struct fw_card *card, const struct fw_card_driver *driver, | |||
381 | static atomic_t index = ATOMIC_INIT(-1); | 399 | static atomic_t index = ATOMIC_INIT(-1); |
382 | 400 | ||
383 | kref_init(&card->kref); | 401 | kref_init(&card->kref); |
402 | atomic_set(&card->device_count, 0); | ||
384 | card->index = atomic_inc_return(&index); | 403 | card->index = atomic_inc_return(&index); |
385 | card->driver = driver; | 404 | card->driver = driver; |
386 | card->device = device; | 405 | card->device = device; |
@@ -511,8 +530,14 @@ fw_core_remove_card(struct fw_card *card) | |||
511 | card->driver = &dummy_driver; | 530 | card->driver = &dummy_driver; |
512 | 531 | ||
513 | fw_destroy_nodes(card); | 532 | fw_destroy_nodes(card); |
514 | flush_scheduled_work(); | 533 | /* |
534 | * Wait for all device workqueue jobs to finish. Otherwise the | ||
535 | * firewire-core module could be unloaded before the jobs ran. | ||
536 | */ | ||
537 | while (atomic_read(&card->device_count) > 0) | ||
538 | msleep(100); | ||
515 | 539 | ||
540 | cancel_delayed_work_sync(&card->work); | ||
516 | fw_flush_transactions(card); | 541 | fw_flush_transactions(card); |
517 | del_timer_sync(&card->flush_timer); | 542 | del_timer_sync(&card->flush_timer); |
518 | 543 | ||
diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c index 7e73cbaa4121..46bc197a047f 100644 --- a/drivers/firewire/fw-cdev.c +++ b/drivers/firewire/fw-cdev.c | |||
@@ -109,15 +109,17 @@ static int fw_device_op_open(struct inode *inode, struct file *file) | |||
109 | struct client *client; | 109 | struct client *client; |
110 | unsigned long flags; | 110 | unsigned long flags; |
111 | 111 | ||
112 | device = fw_device_from_devt(inode->i_rdev); | 112 | device = fw_device_get_by_devt(inode->i_rdev); |
113 | if (device == NULL) | 113 | if (device == NULL) |
114 | return -ENODEV; | 114 | return -ENODEV; |
115 | 115 | ||
116 | client = kzalloc(sizeof(*client), GFP_KERNEL); | 116 | client = kzalloc(sizeof(*client), GFP_KERNEL); |
117 | if (client == NULL) | 117 | if (client == NULL) { |
118 | fw_device_put(device); | ||
118 | return -ENOMEM; | 119 | return -ENOMEM; |
120 | } | ||
119 | 121 | ||
120 | client->device = fw_device_get(device); | 122 | client->device = device; |
121 | INIT_LIST_HEAD(&client->event_list); | 123 | INIT_LIST_HEAD(&client->event_list); |
122 | INIT_LIST_HEAD(&client->resource_list); | 124 | INIT_LIST_HEAD(&client->resource_list); |
123 | spin_lock_init(&client->lock); | 125 | spin_lock_init(&client->lock); |
@@ -644,6 +646,10 @@ static int ioctl_create_iso_context(struct client *client, void *buffer) | |||
644 | struct fw_cdev_create_iso_context *request = buffer; | 646 | struct fw_cdev_create_iso_context *request = buffer; |
645 | struct fw_iso_context *context; | 647 | struct fw_iso_context *context; |
646 | 648 | ||
649 | /* We only support one context at this time. */ | ||
650 | if (client->iso_context != NULL) | ||
651 | return -EBUSY; | ||
652 | |||
647 | if (request->channel > 63) | 653 | if (request->channel > 63) |
648 | return -EINVAL; | 654 | return -EINVAL; |
649 | 655 | ||
@@ -790,8 +796,9 @@ static int ioctl_start_iso(struct client *client, void *buffer) | |||
790 | { | 796 | { |
791 | struct fw_cdev_start_iso *request = buffer; | 797 | struct fw_cdev_start_iso *request = buffer; |
792 | 798 | ||
793 | if (request->handle != 0) | 799 | if (client->iso_context == NULL || request->handle != 0) |
794 | return -EINVAL; | 800 | return -EINVAL; |
801 | |||
795 | if (client->iso_context->type == FW_ISO_CONTEXT_RECEIVE) { | 802 | if (client->iso_context->type == FW_ISO_CONTEXT_RECEIVE) { |
796 | if (request->tags == 0 || request->tags > 15) | 803 | if (request->tags == 0 || request->tags > 15) |
797 | return -EINVAL; | 804 | return -EINVAL; |
@@ -808,7 +815,7 @@ static int ioctl_stop_iso(struct client *client, void *buffer) | |||
808 | { | 815 | { |
809 | struct fw_cdev_stop_iso *request = buffer; | 816 | struct fw_cdev_stop_iso *request = buffer; |
810 | 817 | ||
811 | if (request->handle != 0) | 818 | if (client->iso_context == NULL || request->handle != 0) |
812 | return -EINVAL; | 819 | return -EINVAL; |
813 | 820 | ||
814 | return fw_iso_context_stop(client->iso_context); | 821 | return fw_iso_context_stop(client->iso_context); |
diff --git a/drivers/firewire/fw-device.c b/drivers/firewire/fw-device.c index de9066e69adf..870125a3638e 100644 --- a/drivers/firewire/fw-device.c +++ b/drivers/firewire/fw-device.c | |||
@@ -150,21 +150,10 @@ struct bus_type fw_bus_type = { | |||
150 | }; | 150 | }; |
151 | EXPORT_SYMBOL(fw_bus_type); | 151 | EXPORT_SYMBOL(fw_bus_type); |
152 | 152 | ||
153 | struct fw_device *fw_device_get(struct fw_device *device) | ||
154 | { | ||
155 | get_device(&device->device); | ||
156 | |||
157 | return device; | ||
158 | } | ||
159 | |||
160 | void fw_device_put(struct fw_device *device) | ||
161 | { | ||
162 | put_device(&device->device); | ||
163 | } | ||
164 | |||
165 | static void fw_device_release(struct device *dev) | 153 | static void fw_device_release(struct device *dev) |
166 | { | 154 | { |
167 | struct fw_device *device = fw_device(dev); | 155 | struct fw_device *device = fw_device(dev); |
156 | struct fw_card *card = device->card; | ||
168 | unsigned long flags; | 157 | unsigned long flags; |
169 | 158 | ||
170 | /* | 159 | /* |
@@ -176,9 +165,9 @@ static void fw_device_release(struct device *dev) | |||
176 | spin_unlock_irqrestore(&device->card->lock, flags); | 165 | spin_unlock_irqrestore(&device->card->lock, flags); |
177 | 166 | ||
178 | fw_node_put(device->node); | 167 | fw_node_put(device->node); |
179 | fw_card_put(device->card); | ||
180 | kfree(device->config_rom); | 168 | kfree(device->config_rom); |
181 | kfree(device); | 169 | kfree(device); |
170 | atomic_dec(&card->device_count); | ||
182 | } | 171 | } |
183 | 172 | ||
184 | int fw_device_enable_phys_dma(struct fw_device *device) | 173 | int fw_device_enable_phys_dma(struct fw_device *device) |
@@ -358,12 +347,9 @@ static ssize_t | |||
358 | guid_show(struct device *dev, struct device_attribute *attr, char *buf) | 347 | guid_show(struct device *dev, struct device_attribute *attr, char *buf) |
359 | { | 348 | { |
360 | struct fw_device *device = fw_device(dev); | 349 | struct fw_device *device = fw_device(dev); |
361 | u64 guid; | ||
362 | |||
363 | guid = ((u64)device->config_rom[3] << 32) | device->config_rom[4]; | ||
364 | 350 | ||
365 | return snprintf(buf, PAGE_SIZE, "0x%016llx\n", | 351 | return snprintf(buf, PAGE_SIZE, "0x%08x%08x\n", |
366 | (unsigned long long)guid); | 352 | device->config_rom[3], device->config_rom[4]); |
367 | } | 353 | } |
368 | 354 | ||
369 | static struct device_attribute fw_device_attributes[] = { | 355 | static struct device_attribute fw_device_attributes[] = { |
@@ -610,12 +596,14 @@ static DECLARE_RWSEM(idr_rwsem); | |||
610 | static DEFINE_IDR(fw_device_idr); | 596 | static DEFINE_IDR(fw_device_idr); |
611 | int fw_cdev_major; | 597 | int fw_cdev_major; |
612 | 598 | ||
613 | struct fw_device *fw_device_from_devt(dev_t devt) | 599 | struct fw_device *fw_device_get_by_devt(dev_t devt) |
614 | { | 600 | { |
615 | struct fw_device *device; | 601 | struct fw_device *device; |
616 | 602 | ||
617 | down_read(&idr_rwsem); | 603 | down_read(&idr_rwsem); |
618 | device = idr_find(&fw_device_idr, MINOR(devt)); | 604 | device = idr_find(&fw_device_idr, MINOR(devt)); |
605 | if (device) | ||
606 | fw_device_get(device); | ||
619 | up_read(&idr_rwsem); | 607 | up_read(&idr_rwsem); |
620 | 608 | ||
621 | return device; | 609 | return device; |
@@ -627,13 +615,14 @@ static void fw_device_shutdown(struct work_struct *work) | |||
627 | container_of(work, struct fw_device, work.work); | 615 | container_of(work, struct fw_device, work.work); |
628 | int minor = MINOR(device->device.devt); | 616 | int minor = MINOR(device->device.devt); |
629 | 617 | ||
630 | down_write(&idr_rwsem); | ||
631 | idr_remove(&fw_device_idr, minor); | ||
632 | up_write(&idr_rwsem); | ||
633 | |||
634 | fw_device_cdev_remove(device); | 618 | fw_device_cdev_remove(device); |
635 | device_for_each_child(&device->device, NULL, shutdown_unit); | 619 | device_for_each_child(&device->device, NULL, shutdown_unit); |
636 | device_unregister(&device->device); | 620 | device_unregister(&device->device); |
621 | |||
622 | down_write(&idr_rwsem); | ||
623 | idr_remove(&fw_device_idr, minor); | ||
624 | up_write(&idr_rwsem); | ||
625 | fw_device_put(device); | ||
637 | } | 626 | } |
638 | 627 | ||
639 | static struct device_type fw_device_type = { | 628 | static struct device_type fw_device_type = { |
@@ -668,7 +657,8 @@ static void fw_device_init(struct work_struct *work) | |||
668 | */ | 657 | */ |
669 | 658 | ||
670 | if (read_bus_info_block(device, device->generation) < 0) { | 659 | if (read_bus_info_block(device, device->generation) < 0) { |
671 | if (device->config_rom_retries < MAX_RETRIES) { | 660 | if (device->config_rom_retries < MAX_RETRIES && |
661 | atomic_read(&device->state) == FW_DEVICE_INITIALIZING) { | ||
672 | device->config_rom_retries++; | 662 | device->config_rom_retries++; |
673 | schedule_delayed_work(&device->work, RETRY_DELAY); | 663 | schedule_delayed_work(&device->work, RETRY_DELAY); |
674 | } else { | 664 | } else { |
@@ -682,10 +672,13 @@ static void fw_device_init(struct work_struct *work) | |||
682 | } | 672 | } |
683 | 673 | ||
684 | err = -ENOMEM; | 674 | err = -ENOMEM; |
675 | |||
676 | fw_device_get(device); | ||
685 | down_write(&idr_rwsem); | 677 | down_write(&idr_rwsem); |
686 | if (idr_pre_get(&fw_device_idr, GFP_KERNEL)) | 678 | if (idr_pre_get(&fw_device_idr, GFP_KERNEL)) |
687 | err = idr_get_new(&fw_device_idr, device, &minor); | 679 | err = idr_get_new(&fw_device_idr, device, &minor); |
688 | up_write(&idr_rwsem); | 680 | up_write(&idr_rwsem); |
681 | |||
689 | if (err < 0) | 682 | if (err < 0) |
690 | goto error; | 683 | goto error; |
691 | 684 | ||
@@ -717,13 +710,22 @@ static void fw_device_init(struct work_struct *work) | |||
717 | */ | 710 | */ |
718 | if (atomic_cmpxchg(&device->state, | 711 | if (atomic_cmpxchg(&device->state, |
719 | FW_DEVICE_INITIALIZING, | 712 | FW_DEVICE_INITIALIZING, |
720 | FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN) | 713 | FW_DEVICE_RUNNING) == FW_DEVICE_SHUTDOWN) { |
721 | fw_device_shutdown(&device->work.work); | 714 | fw_device_shutdown(&device->work.work); |
722 | else | 715 | } else { |
723 | fw_notify("created new fw device %s " | 716 | if (device->config_rom_retries) |
724 | "(%d config rom retries, S%d00)\n", | 717 | fw_notify("created device %s: GUID %08x%08x, S%d00, " |
725 | device->device.bus_id, device->config_rom_retries, | 718 | "%d config ROM retries\n", |
726 | 1 << device->max_speed); | 719 | device->device.bus_id, |
720 | device->config_rom[3], device->config_rom[4], | ||
721 | 1 << device->max_speed, | ||
722 | device->config_rom_retries); | ||
723 | else | ||
724 | fw_notify("created device %s: GUID %08x%08x, S%d00\n", | ||
725 | device->device.bus_id, | ||
726 | device->config_rom[3], device->config_rom[4], | ||
727 | 1 << device->max_speed); | ||
728 | } | ||
727 | 729 | ||
728 | /* | 730 | /* |
729 | * Reschedule the IRM work if we just finished reading the | 731 | * Reschedule the IRM work if we just finished reading the |
@@ -741,7 +743,9 @@ static void fw_device_init(struct work_struct *work) | |||
741 | idr_remove(&fw_device_idr, minor); | 743 | idr_remove(&fw_device_idr, minor); |
742 | up_write(&idr_rwsem); | 744 | up_write(&idr_rwsem); |
743 | error: | 745 | error: |
744 | put_device(&device->device); | 746 | fw_device_put(device); /* fw_device_idr's reference */ |
747 | |||
748 | put_device(&device->device); /* our reference */ | ||
745 | } | 749 | } |
746 | 750 | ||
747 | static int update_unit(struct device *dev, void *data) | 751 | static int update_unit(struct device *dev, void *data) |
@@ -791,7 +795,8 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) | |||
791 | */ | 795 | */ |
792 | device_initialize(&device->device); | 796 | device_initialize(&device->device); |
793 | atomic_set(&device->state, FW_DEVICE_INITIALIZING); | 797 | atomic_set(&device->state, FW_DEVICE_INITIALIZING); |
794 | device->card = fw_card_get(card); | 798 | atomic_inc(&card->device_count); |
799 | device->card = card; | ||
795 | device->node = fw_node_get(node); | 800 | device->node = fw_node_get(node); |
796 | device->node_id = node->node_id; | 801 | device->node_id = node->node_id; |
797 | device->generation = card->generation; | 802 | device->generation = card->generation; |
diff --git a/drivers/firewire/fw-device.h b/drivers/firewire/fw-device.h index 0854fe2bc110..78ecd3991b7f 100644 --- a/drivers/firewire/fw-device.h +++ b/drivers/firewire/fw-device.h | |||
@@ -76,14 +76,26 @@ fw_device_is_shutdown(struct fw_device *device) | |||
76 | return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN; | 76 | return atomic_read(&device->state) == FW_DEVICE_SHUTDOWN; |
77 | } | 77 | } |
78 | 78 | ||
79 | struct fw_device *fw_device_get(struct fw_device *device); | 79 | static inline struct fw_device * |
80 | void fw_device_put(struct fw_device *device); | 80 | fw_device_get(struct fw_device *device) |
81 | { | ||
82 | get_device(&device->device); | ||
83 | |||
84 | return device; | ||
85 | } | ||
86 | |||
87 | static inline void | ||
88 | fw_device_put(struct fw_device *device) | ||
89 | { | ||
90 | put_device(&device->device); | ||
91 | } | ||
92 | |||
93 | struct fw_device *fw_device_get_by_devt(dev_t devt); | ||
81 | int fw_device_enable_phys_dma(struct fw_device *device); | 94 | int fw_device_enable_phys_dma(struct fw_device *device); |
82 | 95 | ||
83 | void fw_device_cdev_update(struct fw_device *device); | 96 | void fw_device_cdev_update(struct fw_device *device); |
84 | void fw_device_cdev_remove(struct fw_device *device); | 97 | void fw_device_cdev_remove(struct fw_device *device); |
85 | 98 | ||
86 | struct fw_device *fw_device_from_devt(dev_t devt); | ||
87 | extern int fw_cdev_major; | 99 | extern int fw_cdev_major; |
88 | 100 | ||
89 | struct fw_unit { | 101 | struct fw_unit { |
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c index 7ebad3c14cb8..996d61f0d460 100644 --- a/drivers/firewire/fw-ohci.c +++ b/drivers/firewire/fw-ohci.c | |||
@@ -33,6 +33,10 @@ | |||
33 | #include <asm/page.h> | 33 | #include <asm/page.h> |
34 | #include <asm/system.h> | 34 | #include <asm/system.h> |
35 | 35 | ||
36 | #ifdef CONFIG_PPC_PMAC | ||
37 | #include <asm/pmac_feature.h> | ||
38 | #endif | ||
39 | |||
36 | #include "fw-ohci.h" | 40 | #include "fw-ohci.h" |
37 | #include "fw-transaction.h" | 41 | #include "fw-transaction.h" |
38 | 42 | ||
@@ -175,6 +179,7 @@ struct fw_ohci { | |||
175 | int generation; | 179 | int generation; |
176 | int request_generation; | 180 | int request_generation; |
177 | u32 bus_seconds; | 181 | u32 bus_seconds; |
182 | bool old_uninorth; | ||
178 | 183 | ||
179 | /* | 184 | /* |
180 | * Spinlock for accessing fw_ohci data. Never call out of | 185 | * Spinlock for accessing fw_ohci data. Never call out of |
@@ -276,19 +281,13 @@ static int ar_context_add_page(struct ar_context *ctx) | |||
276 | { | 281 | { |
277 | struct device *dev = ctx->ohci->card.device; | 282 | struct device *dev = ctx->ohci->card.device; |
278 | struct ar_buffer *ab; | 283 | struct ar_buffer *ab; |
279 | dma_addr_t ab_bus; | 284 | dma_addr_t uninitialized_var(ab_bus); |
280 | size_t offset; | 285 | size_t offset; |
281 | 286 | ||
282 | ab = (struct ar_buffer *) __get_free_page(GFP_ATOMIC); | 287 | ab = dma_alloc_coherent(dev, PAGE_SIZE, &ab_bus, GFP_ATOMIC); |
283 | if (ab == NULL) | 288 | if (ab == NULL) |
284 | return -ENOMEM; | 289 | return -ENOMEM; |
285 | 290 | ||
286 | ab_bus = dma_map_single(dev, ab, PAGE_SIZE, DMA_BIDIRECTIONAL); | ||
287 | if (dma_mapping_error(ab_bus)) { | ||
288 | free_page((unsigned long) ab); | ||
289 | return -ENOMEM; | ||
290 | } | ||
291 | |||
292 | memset(&ab->descriptor, 0, sizeof(ab->descriptor)); | 291 | memset(&ab->descriptor, 0, sizeof(ab->descriptor)); |
293 | ab->descriptor.control = cpu_to_le16(DESCRIPTOR_INPUT_MORE | | 292 | ab->descriptor.control = cpu_to_le16(DESCRIPTOR_INPUT_MORE | |
294 | DESCRIPTOR_STATUS | | 293 | DESCRIPTOR_STATUS | |
@@ -299,8 +298,6 @@ static int ar_context_add_page(struct ar_context *ctx) | |||
299 | ab->descriptor.res_count = cpu_to_le16(PAGE_SIZE - offset); | 298 | ab->descriptor.res_count = cpu_to_le16(PAGE_SIZE - offset); |
300 | ab->descriptor.branch_address = 0; | 299 | ab->descriptor.branch_address = 0; |
301 | 300 | ||
302 | dma_sync_single_for_device(dev, ab_bus, PAGE_SIZE, DMA_BIDIRECTIONAL); | ||
303 | |||
304 | ctx->last_buffer->descriptor.branch_address = cpu_to_le32(ab_bus | 1); | 301 | ctx->last_buffer->descriptor.branch_address = cpu_to_le32(ab_bus | 1); |
305 | ctx->last_buffer->next = ab; | 302 | ctx->last_buffer->next = ab; |
306 | ctx->last_buffer = ab; | 303 | ctx->last_buffer = ab; |
@@ -311,15 +308,22 @@ static int ar_context_add_page(struct ar_context *ctx) | |||
311 | return 0; | 308 | return 0; |
312 | } | 309 | } |
313 | 310 | ||
311 | #if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32) | ||
312 | #define cond_le32_to_cpu(v) \ | ||
313 | (ohci->old_uninorth ? (__force __u32)(v) : le32_to_cpu(v)) | ||
314 | #else | ||
315 | #define cond_le32_to_cpu(v) le32_to_cpu(v) | ||
316 | #endif | ||
317 | |||
314 | static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer) | 318 | static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer) |
315 | { | 319 | { |
316 | struct fw_ohci *ohci = ctx->ohci; | 320 | struct fw_ohci *ohci = ctx->ohci; |
317 | struct fw_packet p; | 321 | struct fw_packet p; |
318 | u32 status, length, tcode; | 322 | u32 status, length, tcode; |
319 | 323 | ||
320 | p.header[0] = le32_to_cpu(buffer[0]); | 324 | p.header[0] = cond_le32_to_cpu(buffer[0]); |
321 | p.header[1] = le32_to_cpu(buffer[1]); | 325 | p.header[1] = cond_le32_to_cpu(buffer[1]); |
322 | p.header[2] = le32_to_cpu(buffer[2]); | 326 | p.header[2] = cond_le32_to_cpu(buffer[2]); |
323 | 327 | ||
324 | tcode = (p.header[0] >> 4) & 0x0f; | 328 | tcode = (p.header[0] >> 4) & 0x0f; |
325 | switch (tcode) { | 329 | switch (tcode) { |
@@ -331,7 +335,7 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer) | |||
331 | break; | 335 | break; |
332 | 336 | ||
333 | case TCODE_READ_BLOCK_REQUEST : | 337 | case TCODE_READ_BLOCK_REQUEST : |
334 | p.header[3] = le32_to_cpu(buffer[3]); | 338 | p.header[3] = cond_le32_to_cpu(buffer[3]); |
335 | p.header_length = 16; | 339 | p.header_length = 16; |
336 | p.payload_length = 0; | 340 | p.payload_length = 0; |
337 | break; | 341 | break; |
@@ -340,7 +344,7 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer) | |||
340 | case TCODE_READ_BLOCK_RESPONSE: | 344 | case TCODE_READ_BLOCK_RESPONSE: |
341 | case TCODE_LOCK_REQUEST: | 345 | case TCODE_LOCK_REQUEST: |
342 | case TCODE_LOCK_RESPONSE: | 346 | case TCODE_LOCK_RESPONSE: |
343 | p.header[3] = le32_to_cpu(buffer[3]); | 347 | p.header[3] = cond_le32_to_cpu(buffer[3]); |
344 | p.header_length = 16; | 348 | p.header_length = 16; |
345 | p.payload_length = p.header[3] >> 16; | 349 | p.payload_length = p.header[3] >> 16; |
346 | break; | 350 | break; |
@@ -357,7 +361,7 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer) | |||
357 | 361 | ||
358 | /* FIXME: What to do about evt_* errors? */ | 362 | /* FIXME: What to do about evt_* errors? */ |
359 | length = (p.header_length + p.payload_length + 3) / 4; | 363 | length = (p.header_length + p.payload_length + 3) / 4; |
360 | status = le32_to_cpu(buffer[length]); | 364 | status = cond_le32_to_cpu(buffer[length]); |
361 | 365 | ||
362 | p.ack = ((status >> 16) & 0x1f) - 16; | 366 | p.ack = ((status >> 16) & 0x1f) - 16; |
363 | p.speed = (status >> 21) & 0x7; | 367 | p.speed = (status >> 21) & 0x7; |
@@ -375,7 +379,7 @@ static __le32 *handle_ar_packet(struct ar_context *ctx, __le32 *buffer) | |||
375 | */ | 379 | */ |
376 | 380 | ||
377 | if (p.ack + 16 == 0x09) | 381 | if (p.ack + 16 == 0x09) |
378 | ohci->request_generation = (buffer[2] >> 16) & 0xff; | 382 | ohci->request_generation = (p.header[2] >> 16) & 0xff; |
379 | else if (ctx == &ohci->ar_request_ctx) | 383 | else if (ctx == &ohci->ar_request_ctx) |
380 | fw_core_handle_request(&ohci->card, &p); | 384 | fw_core_handle_request(&ohci->card, &p); |
381 | else | 385 | else |
@@ -397,6 +401,7 @@ static void ar_context_tasklet(unsigned long data) | |||
397 | 401 | ||
398 | if (d->res_count == 0) { | 402 | if (d->res_count == 0) { |
399 | size_t size, rest, offset; | 403 | size_t size, rest, offset; |
404 | dma_addr_t buffer_bus; | ||
400 | 405 | ||
401 | /* | 406 | /* |
402 | * This descriptor is finished and we may have a | 407 | * This descriptor is finished and we may have a |
@@ -405,9 +410,7 @@ static void ar_context_tasklet(unsigned long data) | |||
405 | */ | 410 | */ |
406 | 411 | ||
407 | offset = offsetof(struct ar_buffer, data); | 412 | offset = offsetof(struct ar_buffer, data); |
408 | dma_unmap_single(ohci->card.device, | 413 | buffer_bus = le32_to_cpu(ab->descriptor.data_address) - offset; |
409 | le32_to_cpu(ab->descriptor.data_address) - offset, | ||
410 | PAGE_SIZE, DMA_BIDIRECTIONAL); | ||
411 | 414 | ||
412 | buffer = ab; | 415 | buffer = ab; |
413 | ab = ab->next; | 416 | ab = ab->next; |
@@ -423,7 +426,8 @@ static void ar_context_tasklet(unsigned long data) | |||
423 | while (buffer < end) | 426 | while (buffer < end) |
424 | buffer = handle_ar_packet(ctx, buffer); | 427 | buffer = handle_ar_packet(ctx, buffer); |
425 | 428 | ||
426 | free_page((unsigned long)buffer); | 429 | dma_free_coherent(ohci->card.device, PAGE_SIZE, |
430 | buffer, buffer_bus); | ||
427 | ar_context_add_page(ctx); | 431 | ar_context_add_page(ctx); |
428 | } else { | 432 | } else { |
429 | buffer = ctx->pointer; | 433 | buffer = ctx->pointer; |
@@ -532,7 +536,7 @@ static int | |||
532 | context_add_buffer(struct context *ctx) | 536 | context_add_buffer(struct context *ctx) |
533 | { | 537 | { |
534 | struct descriptor_buffer *desc; | 538 | struct descriptor_buffer *desc; |
535 | dma_addr_t bus_addr; | 539 | dma_addr_t uninitialized_var(bus_addr); |
536 | int offset; | 540 | int offset; |
537 | 541 | ||
538 | /* | 542 | /* |
@@ -1022,13 +1026,14 @@ static void bus_reset_tasklet(unsigned long data) | |||
1022 | */ | 1026 | */ |
1023 | 1027 | ||
1024 | self_id_count = (reg_read(ohci, OHCI1394_SelfIDCount) >> 3) & 0x3ff; | 1028 | self_id_count = (reg_read(ohci, OHCI1394_SelfIDCount) >> 3) & 0x3ff; |
1025 | generation = (le32_to_cpu(ohci->self_id_cpu[0]) >> 16) & 0xff; | 1029 | generation = (cond_le32_to_cpu(ohci->self_id_cpu[0]) >> 16) & 0xff; |
1026 | rmb(); | 1030 | rmb(); |
1027 | 1031 | ||
1028 | for (i = 1, j = 0; j < self_id_count; i += 2, j++) { | 1032 | for (i = 1, j = 0; j < self_id_count; i += 2, j++) { |
1029 | if (ohci->self_id_cpu[i] != ~ohci->self_id_cpu[i + 1]) | 1033 | if (ohci->self_id_cpu[i] != ~ohci->self_id_cpu[i + 1]) |
1030 | fw_error("inconsistent self IDs\n"); | 1034 | fw_error("inconsistent self IDs\n"); |
1031 | ohci->self_id_buffer[j] = le32_to_cpu(ohci->self_id_cpu[i]); | 1035 | ohci->self_id_buffer[j] = |
1036 | cond_le32_to_cpu(ohci->self_id_cpu[i]); | ||
1032 | } | 1037 | } |
1033 | rmb(); | 1038 | rmb(); |
1034 | 1039 | ||
@@ -1316,7 +1321,7 @@ ohci_set_config_rom(struct fw_card *card, u32 *config_rom, size_t length) | |||
1316 | unsigned long flags; | 1321 | unsigned long flags; |
1317 | int retval = -EBUSY; | 1322 | int retval = -EBUSY; |
1318 | __be32 *next_config_rom; | 1323 | __be32 *next_config_rom; |
1319 | dma_addr_t next_config_rom_bus; | 1324 | dma_addr_t uninitialized_var(next_config_rom_bus); |
1320 | 1325 | ||
1321 | ohci = fw_ohci(card); | 1326 | ohci = fw_ohci(card); |
1322 | 1327 | ||
@@ -1487,7 +1492,7 @@ static int handle_ir_dualbuffer_packet(struct context *context, | |||
1487 | void *p, *end; | 1492 | void *p, *end; |
1488 | int i; | 1493 | int i; |
1489 | 1494 | ||
1490 | if (db->first_res_count > 0 && db->second_res_count > 0) { | 1495 | if (db->first_res_count != 0 && db->second_res_count != 0) { |
1491 | if (ctx->excess_bytes <= le16_to_cpu(db->second_req_count)) { | 1496 | if (ctx->excess_bytes <= le16_to_cpu(db->second_req_count)) { |
1492 | /* This descriptor isn't done yet, stop iteration. */ | 1497 | /* This descriptor isn't done yet, stop iteration. */ |
1493 | return 0; | 1498 | return 0; |
@@ -1513,7 +1518,7 @@ static int handle_ir_dualbuffer_packet(struct context *context, | |||
1513 | memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4); | 1518 | memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4); |
1514 | i += ctx->base.header_size; | 1519 | i += ctx->base.header_size; |
1515 | ctx->excess_bytes += | 1520 | ctx->excess_bytes += |
1516 | (le32_to_cpu(*(u32 *)(p + 4)) >> 16) & 0xffff; | 1521 | (le32_to_cpu(*(__le32 *)(p + 4)) >> 16) & 0xffff; |
1517 | p += ctx->base.header_size + 4; | 1522 | p += ctx->base.header_size + 4; |
1518 | } | 1523 | } |
1519 | ctx->header_length = i; | 1524 | ctx->header_length = i; |
@@ -2048,6 +2053,18 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
2048 | int err; | 2053 | int err; |
2049 | size_t size; | 2054 | size_t size; |
2050 | 2055 | ||
2056 | #ifdef CONFIG_PPC_PMAC | ||
2057 | /* Necessary on some machines if fw-ohci was loaded/ unloaded before */ | ||
2058 | if (machine_is(powermac)) { | ||
2059 | struct device_node *ofn = pci_device_to_OF_node(dev); | ||
2060 | |||
2061 | if (ofn) { | ||
2062 | pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 1); | ||
2063 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); | ||
2064 | } | ||
2065 | } | ||
2066 | #endif /* CONFIG_PPC_PMAC */ | ||
2067 | |||
2051 | ohci = kzalloc(sizeof(*ohci), GFP_KERNEL); | 2068 | ohci = kzalloc(sizeof(*ohci), GFP_KERNEL); |
2052 | if (ohci == NULL) { | 2069 | if (ohci == NULL) { |
2053 | fw_error("Could not malloc fw_ohci data.\n"); | 2070 | fw_error("Could not malloc fw_ohci data.\n"); |
@@ -2066,6 +2083,10 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
2066 | pci_write_config_dword(dev, OHCI1394_PCI_HCI_Control, 0); | 2083 | pci_write_config_dword(dev, OHCI1394_PCI_HCI_Control, 0); |
2067 | pci_set_drvdata(dev, ohci); | 2084 | pci_set_drvdata(dev, ohci); |
2068 | 2085 | ||
2086 | #if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32) | ||
2087 | ohci->old_uninorth = dev->vendor == PCI_VENDOR_ID_APPLE && | ||
2088 | dev->device == PCI_DEVICE_ID_APPLE_UNI_N_FW; | ||
2089 | #endif | ||
2069 | spin_lock_init(&ohci->lock); | 2090 | spin_lock_init(&ohci->lock); |
2070 | 2091 | ||
2071 | tasklet_init(&ohci->bus_reset_tasklet, | 2092 | tasklet_init(&ohci->bus_reset_tasklet, |
@@ -2182,6 +2203,19 @@ static void pci_remove(struct pci_dev *dev) | |||
2182 | pci_disable_device(dev); | 2203 | pci_disable_device(dev); |
2183 | fw_card_put(&ohci->card); | 2204 | fw_card_put(&ohci->card); |
2184 | 2205 | ||
2206 | #ifdef CONFIG_PPC_PMAC | ||
2207 | /* On UniNorth, power down the cable and turn off the chip clock | ||
2208 | * to save power on laptops */ | ||
2209 | if (machine_is(powermac)) { | ||
2210 | struct device_node *ofn = pci_device_to_OF_node(dev); | ||
2211 | |||
2212 | if (ofn) { | ||
2213 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); | ||
2214 | pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0); | ||
2215 | } | ||
2216 | } | ||
2217 | #endif /* CONFIG_PPC_PMAC */ | ||
2218 | |||
2185 | fw_notify("Removed fw-ohci device.\n"); | 2219 | fw_notify("Removed fw-ohci device.\n"); |
2186 | } | 2220 | } |
2187 | 2221 | ||
@@ -2202,6 +2236,16 @@ static int pci_suspend(struct pci_dev *pdev, pm_message_t state) | |||
2202 | if (err) | 2236 | if (err) |
2203 | fw_error("pci_set_power_state failed with %d\n", err); | 2237 | fw_error("pci_set_power_state failed with %d\n", err); |
2204 | 2238 | ||
2239 | /* PowerMac suspend code comes last */ | ||
2240 | #ifdef CONFIG_PPC_PMAC | ||
2241 | if (machine_is(powermac)) { | ||
2242 | struct device_node *ofn = pci_device_to_OF_node(pdev); | ||
2243 | |||
2244 | if (ofn) | ||
2245 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0); | ||
2246 | } | ||
2247 | #endif /* CONFIG_PPC_PMAC */ | ||
2248 | |||
2205 | return 0; | 2249 | return 0; |
2206 | } | 2250 | } |
2207 | 2251 | ||
@@ -2210,6 +2254,16 @@ static int pci_resume(struct pci_dev *pdev) | |||
2210 | struct fw_ohci *ohci = pci_get_drvdata(pdev); | 2254 | struct fw_ohci *ohci = pci_get_drvdata(pdev); |
2211 | int err; | 2255 | int err; |
2212 | 2256 | ||
2257 | /* PowerMac resume code comes first */ | ||
2258 | #ifdef CONFIG_PPC_PMAC | ||
2259 | if (machine_is(powermac)) { | ||
2260 | struct device_node *ofn = pci_device_to_OF_node(pdev); | ||
2261 | |||
2262 | if (ofn) | ||
2263 | pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); | ||
2264 | } | ||
2265 | #endif /* CONFIG_PPC_PMAC */ | ||
2266 | |||
2213 | pci_set_power_state(pdev, PCI_D0); | 2267 | pci_set_power_state(pdev, PCI_D0); |
2214 | pci_restore_state(pdev); | 2268 | pci_restore_state(pdev); |
2215 | err = pci_enable_device(pdev); | 2269 | err = pci_enable_device(pdev); |
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index 19ece9b6d742..62b4e47d0cc0 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
@@ -28,14 +28,15 @@ | |||
28 | * and many others. | 28 | * and many others. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include <linux/blkdev.h> | ||
32 | #include <linux/delay.h> | ||
33 | #include <linux/device.h> | ||
34 | #include <linux/dma-mapping.h> | ||
31 | #include <linux/kernel.h> | 35 | #include <linux/kernel.h> |
36 | #include <linux/mod_devicetable.h> | ||
32 | #include <linux/module.h> | 37 | #include <linux/module.h> |
33 | #include <linux/moduleparam.h> | 38 | #include <linux/moduleparam.h> |
34 | #include <linux/mod_devicetable.h> | ||
35 | #include <linux/device.h> | ||
36 | #include <linux/scatterlist.h> | 39 | #include <linux/scatterlist.h> |
37 | #include <linux/dma-mapping.h> | ||
38 | #include <linux/blkdev.h> | ||
39 | #include <linux/string.h> | 40 | #include <linux/string.h> |
40 | #include <linux/stringify.h> | 41 | #include <linux/stringify.h> |
41 | #include <linux/timer.h> | 42 | #include <linux/timer.h> |
@@ -47,9 +48,9 @@ | |||
47 | #include <scsi/scsi_device.h> | 48 | #include <scsi/scsi_device.h> |
48 | #include <scsi/scsi_host.h> | 49 | #include <scsi/scsi_host.h> |
49 | 50 | ||
50 | #include "fw-transaction.h" | ||
51 | #include "fw-topology.h" | ||
52 | #include "fw-device.h" | 51 | #include "fw-device.h" |
52 | #include "fw-topology.h" | ||
53 | #include "fw-transaction.h" | ||
53 | 54 | ||
54 | /* | 55 | /* |
55 | * So far only bridges from Oxford Semiconductor are known to support | 56 | * So far only bridges from Oxford Semiconductor are known to support |
@@ -82,6 +83,9 @@ MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device " | |||
82 | * Avoids access beyond actual disk limits on devices with an off-by-one bug. | 83 | * Avoids access beyond actual disk limits on devices with an off-by-one bug. |
83 | * Don't use this with devices which don't have this bug. | 84 | * Don't use this with devices which don't have this bug. |
84 | * | 85 | * |
86 | * - delay inquiry | ||
87 | * Wait extra SBP2_INQUIRY_DELAY seconds after login before SCSI inquiry. | ||
88 | * | ||
85 | * - override internal blacklist | 89 | * - override internal blacklist |
86 | * Instead of adding to the built-in blacklist, use only the workarounds | 90 | * Instead of adding to the built-in blacklist, use only the workarounds |
87 | * specified in the module load parameter. | 91 | * specified in the module load parameter. |
@@ -91,6 +95,8 @@ MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device " | |||
91 | #define SBP2_WORKAROUND_INQUIRY_36 0x2 | 95 | #define SBP2_WORKAROUND_INQUIRY_36 0x2 |
92 | #define SBP2_WORKAROUND_MODE_SENSE_8 0x4 | 96 | #define SBP2_WORKAROUND_MODE_SENSE_8 0x4 |
93 | #define SBP2_WORKAROUND_FIX_CAPACITY 0x8 | 97 | #define SBP2_WORKAROUND_FIX_CAPACITY 0x8 |
98 | #define SBP2_WORKAROUND_DELAY_INQUIRY 0x10 | ||
99 | #define SBP2_INQUIRY_DELAY 12 | ||
94 | #define SBP2_WORKAROUND_OVERRIDE 0x100 | 100 | #define SBP2_WORKAROUND_OVERRIDE 0x100 |
95 | 101 | ||
96 | static int sbp2_param_workarounds; | 102 | static int sbp2_param_workarounds; |
@@ -100,6 +106,7 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0" | |||
100 | ", 36 byte inquiry = " __stringify(SBP2_WORKAROUND_INQUIRY_36) | 106 | ", 36 byte inquiry = " __stringify(SBP2_WORKAROUND_INQUIRY_36) |
101 | ", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8) | 107 | ", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8) |
102 | ", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY) | 108 | ", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY) |
109 | ", delay inquiry = " __stringify(SBP2_WORKAROUND_DELAY_INQUIRY) | ||
103 | ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) | 110 | ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) |
104 | ", or a combination)"); | 111 | ", or a combination)"); |
105 | 112 | ||
@@ -115,7 +122,6 @@ static const char sbp2_driver_name[] = "sbp2"; | |||
115 | struct sbp2_logical_unit { | 122 | struct sbp2_logical_unit { |
116 | struct sbp2_target *tgt; | 123 | struct sbp2_target *tgt; |
117 | struct list_head link; | 124 | struct list_head link; |
118 | struct scsi_device *sdev; | ||
119 | struct fw_address_handler address_handler; | 125 | struct fw_address_handler address_handler; |
120 | struct list_head orb_list; | 126 | struct list_head orb_list; |
121 | 127 | ||
@@ -132,6 +138,8 @@ struct sbp2_logical_unit { | |||
132 | int generation; | 138 | int generation; |
133 | int retries; | 139 | int retries; |
134 | struct delayed_work work; | 140 | struct delayed_work work; |
141 | bool has_sdev; | ||
142 | bool blocked; | ||
135 | }; | 143 | }; |
136 | 144 | ||
137 | /* | 145 | /* |
@@ -141,16 +149,18 @@ struct sbp2_logical_unit { | |||
141 | struct sbp2_target { | 149 | struct sbp2_target { |
142 | struct kref kref; | 150 | struct kref kref; |
143 | struct fw_unit *unit; | 151 | struct fw_unit *unit; |
152 | const char *bus_id; | ||
153 | struct list_head lu_list; | ||
144 | 154 | ||
145 | u64 management_agent_address; | 155 | u64 management_agent_address; |
146 | int directory_id; | 156 | int directory_id; |
147 | int node_id; | 157 | int node_id; |
148 | int address_high; | 158 | int address_high; |
149 | 159 | unsigned int workarounds; | |
150 | unsigned workarounds; | ||
151 | struct list_head lu_list; | ||
152 | |||
153 | unsigned int mgt_orb_timeout; | 160 | unsigned int mgt_orb_timeout; |
161 | |||
162 | int dont_block; /* counter for each logical unit */ | ||
163 | int blocked; /* ditto */ | ||
154 | }; | 164 | }; |
155 | 165 | ||
156 | /* | 166 | /* |
@@ -160,9 +170,10 @@ struct sbp2_target { | |||
160 | */ | 170 | */ |
161 | #define SBP2_MIN_LOGIN_ORB_TIMEOUT 5000U /* Timeout in ms */ | 171 | #define SBP2_MIN_LOGIN_ORB_TIMEOUT 5000U /* Timeout in ms */ |
162 | #define SBP2_MAX_LOGIN_ORB_TIMEOUT 40000U /* Timeout in ms */ | 172 | #define SBP2_MAX_LOGIN_ORB_TIMEOUT 40000U /* Timeout in ms */ |
163 | #define SBP2_ORB_TIMEOUT 2000 /* Timeout in ms */ | 173 | #define SBP2_ORB_TIMEOUT 2000U /* Timeout in ms */ |
164 | #define SBP2_ORB_NULL 0x80000000 | 174 | #define SBP2_ORB_NULL 0x80000000 |
165 | #define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 | 175 | #define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 |
176 | #define SBP2_RETRY_LIMIT 0xf /* 15 retries */ | ||
166 | 177 | ||
167 | #define SBP2_DIRECTION_TO_MEDIA 0x0 | 178 | #define SBP2_DIRECTION_TO_MEDIA 0x0 |
168 | #define SBP2_DIRECTION_FROM_MEDIA 0x1 | 179 | #define SBP2_DIRECTION_FROM_MEDIA 0x1 |
@@ -297,7 +308,7 @@ struct sbp2_command_orb { | |||
297 | static const struct { | 308 | static const struct { |
298 | u32 firmware_revision; | 309 | u32 firmware_revision; |
299 | u32 model; | 310 | u32 model; |
300 | unsigned workarounds; | 311 | unsigned int workarounds; |
301 | } sbp2_workarounds_table[] = { | 312 | } sbp2_workarounds_table[] = { |
302 | /* DViCO Momobay CX-1 with TSB42AA9 bridge */ { | 313 | /* DViCO Momobay CX-1 with TSB42AA9 bridge */ { |
303 | .firmware_revision = 0x002800, | 314 | .firmware_revision = 0x002800, |
@@ -305,6 +316,11 @@ static const struct { | |||
305 | .workarounds = SBP2_WORKAROUND_INQUIRY_36 | | 316 | .workarounds = SBP2_WORKAROUND_INQUIRY_36 | |
306 | SBP2_WORKAROUND_MODE_SENSE_8, | 317 | SBP2_WORKAROUND_MODE_SENSE_8, |
307 | }, | 318 | }, |
319 | /* DViCO Momobay FX-3A with TSB42AA9A bridge */ { | ||
320 | .firmware_revision = 0x002800, | ||
321 | .model = 0x000000, | ||
322 | .workarounds = SBP2_WORKAROUND_DELAY_INQUIRY, | ||
323 | }, | ||
308 | /* Initio bridges, actually only needed for some older ones */ { | 324 | /* Initio bridges, actually only needed for some older ones */ { |
309 | .firmware_revision = 0x000200, | 325 | .firmware_revision = 0x000200, |
310 | .model = ~0, | 326 | .model = ~0, |
@@ -315,6 +331,11 @@ static const struct { | |||
315 | .model = ~0, | 331 | .model = ~0, |
316 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, | 332 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, |
317 | }, | 333 | }, |
334 | /* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ { | ||
335 | .firmware_revision = 0x002600, | ||
336 | .model = ~0, | ||
337 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, | ||
338 | }, | ||
318 | 339 | ||
319 | /* | 340 | /* |
320 | * There are iPods (2nd gen, 3rd gen) with model_id == 0, but | 341 | * There are iPods (2nd gen, 3rd gen) with model_id == 0, but |
@@ -501,6 +522,9 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, | |||
501 | unsigned int timeout; | 522 | unsigned int timeout; |
502 | int retval = -ENOMEM; | 523 | int retval = -ENOMEM; |
503 | 524 | ||
525 | if (function == SBP2_LOGOUT_REQUEST && fw_device_is_shutdown(device)) | ||
526 | return 0; | ||
527 | |||
504 | orb = kzalloc(sizeof(*orb), GFP_ATOMIC); | 528 | orb = kzalloc(sizeof(*orb), GFP_ATOMIC); |
505 | if (orb == NULL) | 529 | if (orb == NULL) |
506 | return -ENOMEM; | 530 | return -ENOMEM; |
@@ -553,20 +577,20 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, | |||
553 | 577 | ||
554 | retval = -EIO; | 578 | retval = -EIO; |
555 | if (sbp2_cancel_orbs(lu) == 0) { | 579 | if (sbp2_cancel_orbs(lu) == 0) { |
556 | fw_error("orb reply timed out, rcode=0x%02x\n", | 580 | fw_error("%s: orb reply timed out, rcode=0x%02x\n", |
557 | orb->base.rcode); | 581 | lu->tgt->bus_id, orb->base.rcode); |
558 | goto out; | 582 | goto out; |
559 | } | 583 | } |
560 | 584 | ||
561 | if (orb->base.rcode != RCODE_COMPLETE) { | 585 | if (orb->base.rcode != RCODE_COMPLETE) { |
562 | fw_error("management write failed, rcode 0x%02x\n", | 586 | fw_error("%s: management write failed, rcode 0x%02x\n", |
563 | orb->base.rcode); | 587 | lu->tgt->bus_id, orb->base.rcode); |
564 | goto out; | 588 | goto out; |
565 | } | 589 | } |
566 | 590 | ||
567 | if (STATUS_GET_RESPONSE(orb->status) != 0 || | 591 | if (STATUS_GET_RESPONSE(orb->status) != 0 || |
568 | STATUS_GET_SBP_STATUS(orb->status) != 0) { | 592 | STATUS_GET_SBP_STATUS(orb->status) != 0) { |
569 | fw_error("error status: %d:%d\n", | 593 | fw_error("%s: error status: %d:%d\n", lu->tgt->bus_id, |
570 | STATUS_GET_RESPONSE(orb->status), | 594 | STATUS_GET_RESPONSE(orb->status), |
571 | STATUS_GET_SBP_STATUS(orb->status)); | 595 | STATUS_GET_SBP_STATUS(orb->status)); |
572 | goto out; | 596 | goto out; |
@@ -590,29 +614,158 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, | |||
590 | 614 | ||
591 | static void | 615 | static void |
592 | complete_agent_reset_write(struct fw_card *card, int rcode, | 616 | complete_agent_reset_write(struct fw_card *card, int rcode, |
593 | void *payload, size_t length, void *data) | 617 | void *payload, size_t length, void *done) |
594 | { | 618 | { |
595 | struct fw_transaction *t = data; | 619 | complete(done); |
620 | } | ||
596 | 621 | ||
597 | kfree(t); | 622 | static void sbp2_agent_reset(struct sbp2_logical_unit *lu) |
623 | { | ||
624 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | ||
625 | DECLARE_COMPLETION_ONSTACK(done); | ||
626 | struct fw_transaction t; | ||
627 | static u32 z; | ||
628 | |||
629 | fw_send_request(device->card, &t, TCODE_WRITE_QUADLET_REQUEST, | ||
630 | lu->tgt->node_id, lu->generation, device->max_speed, | ||
631 | lu->command_block_agent_address + SBP2_AGENT_RESET, | ||
632 | &z, sizeof(z), complete_agent_reset_write, &done); | ||
633 | wait_for_completion(&done); | ||
598 | } | 634 | } |
599 | 635 | ||
600 | static int sbp2_agent_reset(struct sbp2_logical_unit *lu) | 636 | static void |
637 | complete_agent_reset_write_no_wait(struct fw_card *card, int rcode, | ||
638 | void *payload, size_t length, void *data) | ||
639 | { | ||
640 | kfree(data); | ||
641 | } | ||
642 | |||
643 | static void sbp2_agent_reset_no_wait(struct sbp2_logical_unit *lu) | ||
601 | { | 644 | { |
602 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 645 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); |
603 | struct fw_transaction *t; | 646 | struct fw_transaction *t; |
604 | static u32 zero; | 647 | static u32 z; |
605 | 648 | ||
606 | t = kzalloc(sizeof(*t), GFP_ATOMIC); | 649 | t = kmalloc(sizeof(*t), GFP_ATOMIC); |
607 | if (t == NULL) | 650 | if (t == NULL) |
608 | return -ENOMEM; | 651 | return; |
609 | 652 | ||
610 | fw_send_request(device->card, t, TCODE_WRITE_QUADLET_REQUEST, | 653 | fw_send_request(device->card, t, TCODE_WRITE_QUADLET_REQUEST, |
611 | lu->tgt->node_id, lu->generation, device->max_speed, | 654 | lu->tgt->node_id, lu->generation, device->max_speed, |
612 | lu->command_block_agent_address + SBP2_AGENT_RESET, | 655 | lu->command_block_agent_address + SBP2_AGENT_RESET, |
613 | &zero, sizeof(zero), complete_agent_reset_write, t); | 656 | &z, sizeof(z), complete_agent_reset_write_no_wait, t); |
657 | } | ||
614 | 658 | ||
615 | return 0; | 659 | static void sbp2_set_generation(struct sbp2_logical_unit *lu, int generation) |
660 | { | ||
661 | struct fw_card *card = fw_device(lu->tgt->unit->device.parent)->card; | ||
662 | unsigned long flags; | ||
663 | |||
664 | /* serialize with comparisons of lu->generation and card->generation */ | ||
665 | spin_lock_irqsave(&card->lock, flags); | ||
666 | lu->generation = generation; | ||
667 | spin_unlock_irqrestore(&card->lock, flags); | ||
668 | } | ||
669 | |||
670 | static inline void sbp2_allow_block(struct sbp2_logical_unit *lu) | ||
671 | { | ||
672 | /* | ||
673 | * We may access dont_block without taking card->lock here: | ||
674 | * All callers of sbp2_allow_block() and all callers of sbp2_unblock() | ||
675 | * are currently serialized against each other. | ||
676 | * And a wrong result in sbp2_conditionally_block()'s access of | ||
677 | * dont_block is rather harmless, it simply misses its first chance. | ||
678 | */ | ||
679 | --lu->tgt->dont_block; | ||
680 | } | ||
681 | |||
682 | /* | ||
683 | * Blocks lu->tgt if all of the following conditions are met: | ||
684 | * - Login, INQUIRY, and high-level SCSI setup of all of the target's | ||
685 | * logical units have been finished (indicated by dont_block == 0). | ||
686 | * - lu->generation is stale. | ||
687 | * | ||
688 | * Note, scsi_block_requests() must be called while holding card->lock, | ||
689 | * otherwise it might foil sbp2_[conditionally_]unblock()'s attempt to | ||
690 | * unblock the target. | ||
691 | */ | ||
692 | static void sbp2_conditionally_block(struct sbp2_logical_unit *lu) | ||
693 | { | ||
694 | struct sbp2_target *tgt = lu->tgt; | ||
695 | struct fw_card *card = fw_device(tgt->unit->device.parent)->card; | ||
696 | struct Scsi_Host *shost = | ||
697 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); | ||
698 | unsigned long flags; | ||
699 | |||
700 | spin_lock_irqsave(&card->lock, flags); | ||
701 | if (!tgt->dont_block && !lu->blocked && | ||
702 | lu->generation != card->generation) { | ||
703 | lu->blocked = true; | ||
704 | if (++tgt->blocked == 1) { | ||
705 | scsi_block_requests(shost); | ||
706 | fw_notify("blocked %s\n", lu->tgt->bus_id); | ||
707 | } | ||
708 | } | ||
709 | spin_unlock_irqrestore(&card->lock, flags); | ||
710 | } | ||
711 | |||
712 | /* | ||
713 | * Unblocks lu->tgt as soon as all its logical units can be unblocked. | ||
714 | * Note, it is harmless to run scsi_unblock_requests() outside the | ||
715 | * card->lock protected section. On the other hand, running it inside | ||
716 | * the section might clash with shost->host_lock. | ||
717 | */ | ||
718 | static void sbp2_conditionally_unblock(struct sbp2_logical_unit *lu) | ||
719 | { | ||
720 | struct sbp2_target *tgt = lu->tgt; | ||
721 | struct fw_card *card = fw_device(tgt->unit->device.parent)->card; | ||
722 | struct Scsi_Host *shost = | ||
723 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); | ||
724 | unsigned long flags; | ||
725 | bool unblock = false; | ||
726 | |||
727 | spin_lock_irqsave(&card->lock, flags); | ||
728 | if (lu->blocked && lu->generation == card->generation) { | ||
729 | lu->blocked = false; | ||
730 | unblock = --tgt->blocked == 0; | ||
731 | } | ||
732 | spin_unlock_irqrestore(&card->lock, flags); | ||
733 | |||
734 | if (unblock) { | ||
735 | scsi_unblock_requests(shost); | ||
736 | fw_notify("unblocked %s\n", lu->tgt->bus_id); | ||
737 | } | ||
738 | } | ||
739 | |||
740 | /* | ||
741 | * Prevents future blocking of tgt and unblocks it. | ||
742 | * Note, it is harmless to run scsi_unblock_requests() outside the | ||
743 | * card->lock protected section. On the other hand, running it inside | ||
744 | * the section might clash with shost->host_lock. | ||
745 | */ | ||
746 | static void sbp2_unblock(struct sbp2_target *tgt) | ||
747 | { | ||
748 | struct fw_card *card = fw_device(tgt->unit->device.parent)->card; | ||
749 | struct Scsi_Host *shost = | ||
750 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); | ||
751 | unsigned long flags; | ||
752 | |||
753 | spin_lock_irqsave(&card->lock, flags); | ||
754 | ++tgt->dont_block; | ||
755 | spin_unlock_irqrestore(&card->lock, flags); | ||
756 | |||
757 | scsi_unblock_requests(shost); | ||
758 | } | ||
759 | |||
760 | static int sbp2_lun2int(u16 lun) | ||
761 | { | ||
762 | struct scsi_lun eight_bytes_lun; | ||
763 | |||
764 | memset(&eight_bytes_lun, 0, sizeof(eight_bytes_lun)); | ||
765 | eight_bytes_lun.scsi_lun[0] = (lun >> 8) & 0xff; | ||
766 | eight_bytes_lun.scsi_lun[1] = lun & 0xff; | ||
767 | |||
768 | return scsilun_to_int(&eight_bytes_lun); | ||
616 | } | 769 | } |
617 | 770 | ||
618 | static void sbp2_release_target(struct kref *kref) | 771 | static void sbp2_release_target(struct kref *kref) |
@@ -621,26 +774,31 @@ static void sbp2_release_target(struct kref *kref) | |||
621 | struct sbp2_logical_unit *lu, *next; | 774 | struct sbp2_logical_unit *lu, *next; |
622 | struct Scsi_Host *shost = | 775 | struct Scsi_Host *shost = |
623 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); | 776 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); |
777 | struct scsi_device *sdev; | ||
624 | struct fw_device *device = fw_device(tgt->unit->device.parent); | 778 | struct fw_device *device = fw_device(tgt->unit->device.parent); |
625 | 779 | ||
626 | list_for_each_entry_safe(lu, next, &tgt->lu_list, link) { | 780 | /* prevent deadlocks */ |
627 | if (lu->sdev) | 781 | sbp2_unblock(tgt); |
628 | scsi_remove_device(lu->sdev); | ||
629 | 782 | ||
630 | if (!fw_device_is_shutdown(device)) | 783 | list_for_each_entry_safe(lu, next, &tgt->lu_list, link) { |
631 | sbp2_send_management_orb(lu, tgt->node_id, | 784 | sdev = scsi_device_lookup(shost, 0, 0, sbp2_lun2int(lu->lun)); |
632 | lu->generation, SBP2_LOGOUT_REQUEST, | 785 | if (sdev) { |
633 | lu->login_id, NULL); | 786 | scsi_remove_device(sdev); |
787 | scsi_device_put(sdev); | ||
788 | } | ||
789 | sbp2_send_management_orb(lu, tgt->node_id, lu->generation, | ||
790 | SBP2_LOGOUT_REQUEST, lu->login_id, NULL); | ||
634 | 791 | ||
635 | fw_core_remove_address_handler(&lu->address_handler); | 792 | fw_core_remove_address_handler(&lu->address_handler); |
636 | list_del(&lu->link); | 793 | list_del(&lu->link); |
637 | kfree(lu); | 794 | kfree(lu); |
638 | } | 795 | } |
639 | scsi_remove_host(shost); | 796 | scsi_remove_host(shost); |
640 | fw_notify("released %s\n", tgt->unit->device.bus_id); | 797 | fw_notify("released %s\n", tgt->bus_id); |
641 | 798 | ||
642 | put_device(&tgt->unit->device); | 799 | put_device(&tgt->unit->device); |
643 | scsi_host_put(shost); | 800 | scsi_host_put(shost); |
801 | fw_device_put(device); | ||
644 | } | 802 | } |
645 | 803 | ||
646 | static struct workqueue_struct *sbp2_wq; | 804 | static struct workqueue_struct *sbp2_wq; |
@@ -660,39 +818,72 @@ static void sbp2_target_put(struct sbp2_target *tgt) | |||
660 | kref_put(&tgt->kref, sbp2_release_target); | 818 | kref_put(&tgt->kref, sbp2_release_target); |
661 | } | 819 | } |
662 | 820 | ||
821 | static void | ||
822 | complete_set_busy_timeout(struct fw_card *card, int rcode, | ||
823 | void *payload, size_t length, void *done) | ||
824 | { | ||
825 | complete(done); | ||
826 | } | ||
827 | |||
828 | static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) | ||
829 | { | ||
830 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | ||
831 | DECLARE_COMPLETION_ONSTACK(done); | ||
832 | struct fw_transaction t; | ||
833 | static __be32 busy_timeout; | ||
834 | |||
835 | /* FIXME: we should try to set dual-phase cycle_limit too */ | ||
836 | busy_timeout = cpu_to_be32(SBP2_RETRY_LIMIT); | ||
837 | |||
838 | fw_send_request(device->card, &t, TCODE_WRITE_QUADLET_REQUEST, | ||
839 | lu->tgt->node_id, lu->generation, device->max_speed, | ||
840 | CSR_REGISTER_BASE + CSR_BUSY_TIMEOUT, &busy_timeout, | ||
841 | sizeof(busy_timeout), complete_set_busy_timeout, &done); | ||
842 | wait_for_completion(&done); | ||
843 | } | ||
844 | |||
663 | static void sbp2_reconnect(struct work_struct *work); | 845 | static void sbp2_reconnect(struct work_struct *work); |
664 | 846 | ||
665 | static void sbp2_login(struct work_struct *work) | 847 | static void sbp2_login(struct work_struct *work) |
666 | { | 848 | { |
667 | struct sbp2_logical_unit *lu = | 849 | struct sbp2_logical_unit *lu = |
668 | container_of(work, struct sbp2_logical_unit, work.work); | 850 | container_of(work, struct sbp2_logical_unit, work.work); |
669 | struct Scsi_Host *shost = | 851 | struct sbp2_target *tgt = lu->tgt; |
670 | container_of((void *)lu->tgt, struct Scsi_Host, hostdata[0]); | 852 | struct fw_device *device = fw_device(tgt->unit->device.parent); |
853 | struct Scsi_Host *shost; | ||
671 | struct scsi_device *sdev; | 854 | struct scsi_device *sdev; |
672 | struct scsi_lun eight_bytes_lun; | ||
673 | struct fw_unit *unit = lu->tgt->unit; | ||
674 | struct fw_device *device = fw_device(unit->device.parent); | ||
675 | struct sbp2_login_response response; | 855 | struct sbp2_login_response response; |
676 | int generation, node_id, local_node_id; | 856 | int generation, node_id, local_node_id; |
677 | 857 | ||
858 | if (fw_device_is_shutdown(device)) | ||
859 | goto out; | ||
860 | |||
678 | generation = device->generation; | 861 | generation = device->generation; |
679 | smp_rmb(); /* node_id must not be older than generation */ | 862 | smp_rmb(); /* node_id must not be older than generation */ |
680 | node_id = device->node_id; | 863 | node_id = device->node_id; |
681 | local_node_id = device->card->node_id; | 864 | local_node_id = device->card->node_id; |
682 | 865 | ||
866 | /* If this is a re-login attempt, log out, or we might be rejected. */ | ||
867 | if (lu->has_sdev) | ||
868 | sbp2_send_management_orb(lu, device->node_id, generation, | ||
869 | SBP2_LOGOUT_REQUEST, lu->login_id, NULL); | ||
870 | |||
683 | if (sbp2_send_management_orb(lu, node_id, generation, | 871 | if (sbp2_send_management_orb(lu, node_id, generation, |
684 | SBP2_LOGIN_REQUEST, lu->lun, &response) < 0) { | 872 | SBP2_LOGIN_REQUEST, lu->lun, &response) < 0) { |
685 | if (lu->retries++ < 5) | 873 | if (lu->retries++ < 5) { |
686 | sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); | 874 | sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); |
687 | else | 875 | } else { |
688 | fw_error("failed to login to %s LUN %04x\n", | 876 | fw_error("%s: failed to login to LUN %04x\n", |
689 | unit->device.bus_id, lu->lun); | 877 | tgt->bus_id, lu->lun); |
878 | /* Let any waiting I/O fail from now on. */ | ||
879 | sbp2_unblock(lu->tgt); | ||
880 | } | ||
690 | goto out; | 881 | goto out; |
691 | } | 882 | } |
692 | 883 | ||
693 | lu->generation = generation; | 884 | tgt->node_id = node_id; |
694 | lu->tgt->node_id = node_id; | 885 | tgt->address_high = local_node_id << 16; |
695 | lu->tgt->address_high = local_node_id << 16; | 886 | sbp2_set_generation(lu, generation); |
696 | 887 | ||
697 | /* Get command block agent offset and login id. */ | 888 | /* Get command block agent offset and login id. */ |
698 | lu->command_block_agent_address = | 889 | lu->command_block_agent_address = |
@@ -700,37 +891,67 @@ static void sbp2_login(struct work_struct *work) | |||
700 | response.command_block_agent.low; | 891 | response.command_block_agent.low; |
701 | lu->login_id = LOGIN_RESPONSE_GET_LOGIN_ID(response); | 892 | lu->login_id = LOGIN_RESPONSE_GET_LOGIN_ID(response); |
702 | 893 | ||
703 | fw_notify("logged in to %s LUN %04x (%d retries)\n", | 894 | fw_notify("%s: logged in to LUN %04x (%d retries)\n", |
704 | unit->device.bus_id, lu->lun, lu->retries); | 895 | tgt->bus_id, lu->lun, lu->retries); |
705 | 896 | ||
706 | #if 0 | 897 | /* set appropriate retry limit(s) in BUSY_TIMEOUT register */ |
707 | /* FIXME: The linux1394 sbp2 does this last step. */ | 898 | sbp2_set_busy_timeout(lu); |
708 | sbp2_set_busy_timeout(scsi_id); | ||
709 | #endif | ||
710 | 899 | ||
711 | PREPARE_DELAYED_WORK(&lu->work, sbp2_reconnect); | 900 | PREPARE_DELAYED_WORK(&lu->work, sbp2_reconnect); |
712 | sbp2_agent_reset(lu); | 901 | sbp2_agent_reset(lu); |
713 | 902 | ||
714 | memset(&eight_bytes_lun, 0, sizeof(eight_bytes_lun)); | 903 | /* This was a re-login. */ |
715 | eight_bytes_lun.scsi_lun[0] = (lu->lun >> 8) & 0xff; | 904 | if (lu->has_sdev) { |
716 | eight_bytes_lun.scsi_lun[1] = lu->lun & 0xff; | 905 | sbp2_cancel_orbs(lu); |
906 | sbp2_conditionally_unblock(lu); | ||
907 | goto out; | ||
908 | } | ||
717 | 909 | ||
718 | sdev = __scsi_add_device(shost, 0, 0, | 910 | if (lu->tgt->workarounds & SBP2_WORKAROUND_DELAY_INQUIRY) |
719 | scsilun_to_int(&eight_bytes_lun), lu); | 911 | ssleep(SBP2_INQUIRY_DELAY); |
720 | if (IS_ERR(sdev)) { | 912 | |
721 | sbp2_send_management_orb(lu, node_id, generation, | 913 | shost = container_of((void *)tgt, struct Scsi_Host, hostdata[0]); |
722 | SBP2_LOGOUT_REQUEST, lu->login_id, NULL); | 914 | sdev = __scsi_add_device(shost, 0, 0, sbp2_lun2int(lu->lun), lu); |
723 | /* | 915 | /* |
724 | * Set this back to sbp2_login so we fall back and | 916 | * FIXME: We are unable to perform reconnects while in sbp2_login(). |
725 | * retry login on bus reset. | 917 | * Therefore __scsi_add_device() will get into trouble if a bus reset |
726 | */ | 918 | * happens in parallel. It will either fail or leave us with an |
727 | PREPARE_DELAYED_WORK(&lu->work, sbp2_login); | 919 | * unusable sdev. As a workaround we check for this and retry the |
728 | } else { | 920 | * whole login and SCSI probing. |
729 | lu->sdev = sdev; | 921 | */ |
922 | |||
923 | /* Reported error during __scsi_add_device() */ | ||
924 | if (IS_ERR(sdev)) | ||
925 | goto out_logout_login; | ||
926 | |||
927 | /* Unreported error during __scsi_add_device() */ | ||
928 | smp_rmb(); /* get current card generation */ | ||
929 | if (generation != device->card->generation) { | ||
930 | scsi_remove_device(sdev); | ||
730 | scsi_device_put(sdev); | 931 | scsi_device_put(sdev); |
932 | goto out_logout_login; | ||
731 | } | 933 | } |
934 | |||
935 | /* No error during __scsi_add_device() */ | ||
936 | lu->has_sdev = true; | ||
937 | scsi_device_put(sdev); | ||
938 | sbp2_allow_block(lu); | ||
939 | goto out; | ||
940 | |||
941 | out_logout_login: | ||
942 | smp_rmb(); /* generation may have changed */ | ||
943 | generation = device->generation; | ||
944 | smp_rmb(); /* node_id must not be older than generation */ | ||
945 | |||
946 | sbp2_send_management_orb(lu, device->node_id, generation, | ||
947 | SBP2_LOGOUT_REQUEST, lu->login_id, NULL); | ||
948 | /* | ||
949 | * If a bus reset happened, sbp2_update will have requeued | ||
950 | * lu->work already. Reset the work from reconnect to login. | ||
951 | */ | ||
952 | PREPARE_DELAYED_WORK(&lu->work, sbp2_login); | ||
732 | out: | 953 | out: |
733 | sbp2_target_put(lu->tgt); | 954 | sbp2_target_put(tgt); |
734 | } | 955 | } |
735 | 956 | ||
736 | static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) | 957 | static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) |
@@ -751,10 +972,12 @@ static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) | |||
751 | return -ENOMEM; | 972 | return -ENOMEM; |
752 | } | 973 | } |
753 | 974 | ||
754 | lu->tgt = tgt; | 975 | lu->tgt = tgt; |
755 | lu->sdev = NULL; | 976 | lu->lun = lun_entry & 0xffff; |
756 | lu->lun = lun_entry & 0xffff; | 977 | lu->retries = 0; |
757 | lu->retries = 0; | 978 | lu->has_sdev = false; |
979 | lu->blocked = false; | ||
980 | ++tgt->dont_block; | ||
758 | INIT_LIST_HEAD(&lu->orb_list); | 981 | INIT_LIST_HEAD(&lu->orb_list); |
759 | INIT_DELAYED_WORK(&lu->work, sbp2_login); | 982 | INIT_DELAYED_WORK(&lu->work, sbp2_login); |
760 | 983 | ||
@@ -813,7 +1036,7 @@ static int sbp2_scan_unit_dir(struct sbp2_target *tgt, u32 *directory, | |||
813 | if (timeout > tgt->mgt_orb_timeout) | 1036 | if (timeout > tgt->mgt_orb_timeout) |
814 | fw_notify("%s: config rom contains %ds " | 1037 | fw_notify("%s: config rom contains %ds " |
815 | "management ORB timeout, limiting " | 1038 | "management ORB timeout, limiting " |
816 | "to %ds\n", tgt->unit->device.bus_id, | 1039 | "to %ds\n", tgt->bus_id, |
817 | timeout / 1000, | 1040 | timeout / 1000, |
818 | tgt->mgt_orb_timeout / 1000); | 1041 | tgt->mgt_orb_timeout / 1000); |
819 | break; | 1042 | break; |
@@ -836,12 +1059,12 @@ static void sbp2_init_workarounds(struct sbp2_target *tgt, u32 model, | |||
836 | u32 firmware_revision) | 1059 | u32 firmware_revision) |
837 | { | 1060 | { |
838 | int i; | 1061 | int i; |
839 | unsigned w = sbp2_param_workarounds; | 1062 | unsigned int w = sbp2_param_workarounds; |
840 | 1063 | ||
841 | if (w) | 1064 | if (w) |
842 | fw_notify("Please notify linux1394-devel@lists.sourceforge.net " | 1065 | fw_notify("Please notify linux1394-devel@lists.sourceforge.net " |
843 | "if you need the workarounds parameter for %s\n", | 1066 | "if you need the workarounds parameter for %s\n", |
844 | tgt->unit->device.bus_id); | 1067 | tgt->bus_id); |
845 | 1068 | ||
846 | if (w & SBP2_WORKAROUND_OVERRIDE) | 1069 | if (w & SBP2_WORKAROUND_OVERRIDE) |
847 | goto out; | 1070 | goto out; |
@@ -863,8 +1086,7 @@ static void sbp2_init_workarounds(struct sbp2_target *tgt, u32 model, | |||
863 | if (w) | 1086 | if (w) |
864 | fw_notify("Workarounds for %s: 0x%x " | 1087 | fw_notify("Workarounds for %s: 0x%x " |
865 | "(firmware_revision 0x%06x, model_id 0x%06x)\n", | 1088 | "(firmware_revision 0x%06x, model_id 0x%06x)\n", |
866 | tgt->unit->device.bus_id, | 1089 | tgt->bus_id, w, firmware_revision, model); |
867 | w, firmware_revision, model); | ||
868 | tgt->workarounds = w; | 1090 | tgt->workarounds = w; |
869 | } | 1091 | } |
870 | 1092 | ||
@@ -888,6 +1110,7 @@ static int sbp2_probe(struct device *dev) | |||
888 | tgt->unit = unit; | 1110 | tgt->unit = unit; |
889 | kref_init(&tgt->kref); | 1111 | kref_init(&tgt->kref); |
890 | INIT_LIST_HEAD(&tgt->lu_list); | 1112 | INIT_LIST_HEAD(&tgt->lu_list); |
1113 | tgt->bus_id = unit->device.bus_id; | ||
891 | 1114 | ||
892 | if (fw_device_enable_phys_dma(device) < 0) | 1115 | if (fw_device_enable_phys_dma(device) < 0) |
893 | goto fail_shost_put; | 1116 | goto fail_shost_put; |
@@ -895,6 +1118,8 @@ static int sbp2_probe(struct device *dev) | |||
895 | if (scsi_add_host(shost, &unit->device) < 0) | 1118 | if (scsi_add_host(shost, &unit->device) < 0) |
896 | goto fail_shost_put; | 1119 | goto fail_shost_put; |
897 | 1120 | ||
1121 | fw_device_get(device); | ||
1122 | |||
898 | /* Initialize to values that won't match anything in our table. */ | 1123 | /* Initialize to values that won't match anything in our table. */ |
899 | firmware_revision = 0xff000000; | 1124 | firmware_revision = 0xff000000; |
900 | model = 0xff000000; | 1125 | model = 0xff000000; |
@@ -938,10 +1163,13 @@ static void sbp2_reconnect(struct work_struct *work) | |||
938 | { | 1163 | { |
939 | struct sbp2_logical_unit *lu = | 1164 | struct sbp2_logical_unit *lu = |
940 | container_of(work, struct sbp2_logical_unit, work.work); | 1165 | container_of(work, struct sbp2_logical_unit, work.work); |
941 | struct fw_unit *unit = lu->tgt->unit; | 1166 | struct sbp2_target *tgt = lu->tgt; |
942 | struct fw_device *device = fw_device(unit->device.parent); | 1167 | struct fw_device *device = fw_device(tgt->unit->device.parent); |
943 | int generation, node_id, local_node_id; | 1168 | int generation, node_id, local_node_id; |
944 | 1169 | ||
1170 | if (fw_device_is_shutdown(device)) | ||
1171 | goto out; | ||
1172 | |||
945 | generation = device->generation; | 1173 | generation = device->generation; |
946 | smp_rmb(); /* node_id must not be older than generation */ | 1174 | smp_rmb(); /* node_id must not be older than generation */ |
947 | node_id = device->node_id; | 1175 | node_id = device->node_id; |
@@ -950,10 +1178,17 @@ static void sbp2_reconnect(struct work_struct *work) | |||
950 | if (sbp2_send_management_orb(lu, node_id, generation, | 1178 | if (sbp2_send_management_orb(lu, node_id, generation, |
951 | SBP2_RECONNECT_REQUEST, | 1179 | SBP2_RECONNECT_REQUEST, |
952 | lu->login_id, NULL) < 0) { | 1180 | lu->login_id, NULL) < 0) { |
953 | if (lu->retries++ >= 5) { | 1181 | /* |
954 | fw_error("failed to reconnect to %s\n", | 1182 | * If reconnect was impossible even though we are in the |
955 | unit->device.bus_id); | 1183 | * current generation, fall back and try to log in again. |
956 | /* Fall back and try to log in again. */ | 1184 | * |
1185 | * We could check for "Function rejected" status, but | ||
1186 | * looking at the bus generation as simpler and more general. | ||
1187 | */ | ||
1188 | smp_rmb(); /* get current card generation */ | ||
1189 | if (generation == device->card->generation || | ||
1190 | lu->retries++ >= 5) { | ||
1191 | fw_error("%s: failed to reconnect\n", tgt->bus_id); | ||
957 | lu->retries = 0; | 1192 | lu->retries = 0; |
958 | PREPARE_DELAYED_WORK(&lu->work, sbp2_login); | 1193 | PREPARE_DELAYED_WORK(&lu->work, sbp2_login); |
959 | } | 1194 | } |
@@ -961,17 +1196,18 @@ static void sbp2_reconnect(struct work_struct *work) | |||
961 | goto out; | 1196 | goto out; |
962 | } | 1197 | } |
963 | 1198 | ||
964 | lu->generation = generation; | 1199 | tgt->node_id = node_id; |
965 | lu->tgt->node_id = node_id; | 1200 | tgt->address_high = local_node_id << 16; |
966 | lu->tgt->address_high = local_node_id << 16; | 1201 | sbp2_set_generation(lu, generation); |
967 | 1202 | ||
968 | fw_notify("reconnected to %s LUN %04x (%d retries)\n", | 1203 | fw_notify("%s: reconnected to LUN %04x (%d retries)\n", |
969 | unit->device.bus_id, lu->lun, lu->retries); | 1204 | tgt->bus_id, lu->lun, lu->retries); |
970 | 1205 | ||
971 | sbp2_agent_reset(lu); | 1206 | sbp2_agent_reset(lu); |
972 | sbp2_cancel_orbs(lu); | 1207 | sbp2_cancel_orbs(lu); |
1208 | sbp2_conditionally_unblock(lu); | ||
973 | out: | 1209 | out: |
974 | sbp2_target_put(lu->tgt); | 1210 | sbp2_target_put(tgt); |
975 | } | 1211 | } |
976 | 1212 | ||
977 | static void sbp2_update(struct fw_unit *unit) | 1213 | static void sbp2_update(struct fw_unit *unit) |
@@ -986,6 +1222,7 @@ static void sbp2_update(struct fw_unit *unit) | |||
986 | * Iteration over tgt->lu_list is therefore safe here. | 1222 | * Iteration over tgt->lu_list is therefore safe here. |
987 | */ | 1223 | */ |
988 | list_for_each_entry(lu, &tgt->lu_list, link) { | 1224 | list_for_each_entry(lu, &tgt->lu_list, link) { |
1225 | sbp2_conditionally_block(lu); | ||
989 | lu->retries = 0; | 1226 | lu->retries = 0; |
990 | sbp2_queue_work(lu, 0); | 1227 | sbp2_queue_work(lu, 0); |
991 | } | 1228 | } |
@@ -1063,7 +1300,7 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status) | |||
1063 | 1300 | ||
1064 | if (status != NULL) { | 1301 | if (status != NULL) { |
1065 | if (STATUS_GET_DEAD(*status)) | 1302 | if (STATUS_GET_DEAD(*status)) |
1066 | sbp2_agent_reset(orb->lu); | 1303 | sbp2_agent_reset_no_wait(orb->lu); |
1067 | 1304 | ||
1068 | switch (STATUS_GET_RESPONSE(*status)) { | 1305 | switch (STATUS_GET_RESPONSE(*status)) { |
1069 | case SBP2_STATUS_REQUEST_COMPLETE: | 1306 | case SBP2_STATUS_REQUEST_COMPLETE: |
@@ -1089,6 +1326,7 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status) | |||
1089 | * or when sending the write (less likely). | 1326 | * or when sending the write (less likely). |
1090 | */ | 1327 | */ |
1091 | result = DID_BUS_BUSY << 16; | 1328 | result = DID_BUS_BUSY << 16; |
1329 | sbp2_conditionally_block(orb->lu); | ||
1092 | } | 1330 | } |
1093 | 1331 | ||
1094 | dma_unmap_single(device->card->device, orb->base.request_bus, | 1332 | dma_unmap_single(device->card->device, orb->base.request_bus, |
@@ -1197,7 +1435,7 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) | |||
1197 | struct sbp2_logical_unit *lu = cmd->device->hostdata; | 1435 | struct sbp2_logical_unit *lu = cmd->device->hostdata; |
1198 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 1436 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); |
1199 | struct sbp2_command_orb *orb; | 1437 | struct sbp2_command_orb *orb; |
1200 | unsigned max_payload; | 1438 | unsigned int max_payload; |
1201 | int retval = SCSI_MLQUEUE_HOST_BUSY; | 1439 | int retval = SCSI_MLQUEUE_HOST_BUSY; |
1202 | 1440 | ||
1203 | /* | 1441 | /* |
@@ -1275,6 +1513,10 @@ static int sbp2_scsi_slave_alloc(struct scsi_device *sdev) | |||
1275 | { | 1513 | { |
1276 | struct sbp2_logical_unit *lu = sdev->hostdata; | 1514 | struct sbp2_logical_unit *lu = sdev->hostdata; |
1277 | 1515 | ||
1516 | /* (Re-)Adding logical units via the SCSI stack is not supported. */ | ||
1517 | if (!lu) | ||
1518 | return -ENOSYS; | ||
1519 | |||
1278 | sdev->allow_restart = 1; | 1520 | sdev->allow_restart = 1; |
1279 | 1521 | ||
1280 | /* | 1522 | /* |
@@ -1319,7 +1561,7 @@ static int sbp2_scsi_abort(struct scsi_cmnd *cmd) | |||
1319 | { | 1561 | { |
1320 | struct sbp2_logical_unit *lu = cmd->device->hostdata; | 1562 | struct sbp2_logical_unit *lu = cmd->device->hostdata; |
1321 | 1563 | ||
1322 | fw_notify("sbp2_scsi_abort\n"); | 1564 | fw_notify("%s: sbp2_scsi_abort\n", lu->tgt->bus_id); |
1323 | sbp2_agent_reset(lu); | 1565 | sbp2_agent_reset(lu); |
1324 | sbp2_cancel_orbs(lu); | 1566 | sbp2_cancel_orbs(lu); |
1325 | 1567 | ||
diff --git a/drivers/firewire/fw-topology.c b/drivers/firewire/fw-topology.c index 172c1867e9aa..d2c7a3d7e1cb 100644 --- a/drivers/firewire/fw-topology.c +++ b/drivers/firewire/fw-topology.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | #include <linux/wait.h> | 22 | #include <linux/wait.h> |
23 | #include <linux/errno.h> | 23 | #include <linux/errno.h> |
24 | #include <asm/bug.h> | ||
24 | #include <asm/system.h> | 25 | #include <asm/system.h> |
25 | #include "fw-transaction.h" | 26 | #include "fw-transaction.h" |
26 | #include "fw-topology.h" | 27 | #include "fw-topology.h" |
@@ -383,6 +384,7 @@ void fw_destroy_nodes(struct fw_card *card) | |||
383 | card->color++; | 384 | card->color++; |
384 | if (card->local_node != NULL) | 385 | if (card->local_node != NULL) |
385 | for_each_fw_node(card, card->local_node, report_lost_node); | 386 | for_each_fw_node(card, card->local_node, report_lost_node); |
387 | card->local_node = NULL; | ||
386 | spin_unlock_irqrestore(&card->lock, flags); | 388 | spin_unlock_irqrestore(&card->lock, flags); |
387 | } | 389 | } |
388 | 390 | ||
@@ -423,8 +425,8 @@ update_tree(struct fw_card *card, struct fw_node *root) | |||
423 | node1 = fw_node(list1.next); | 425 | node1 = fw_node(list1.next); |
424 | 426 | ||
425 | while (&node0->link != &list0) { | 427 | while (&node0->link != &list0) { |
428 | WARN_ON(node0->port_count != node1->port_count); | ||
426 | 429 | ||
427 | /* assert(node0->port_count == node1->port_count); */ | ||
428 | if (node0->link_on && !node1->link_on) | 430 | if (node0->link_on && !node1->link_on) |
429 | event = FW_NODE_LINK_OFF; | 431 | event = FW_NODE_LINK_OFF; |
430 | else if (!node0->link_on && node1->link_on) | 432 | else if (!node0->link_on && node1->link_on) |
diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c index 7fcc59dedf08..99529e59a0b1 100644 --- a/drivers/firewire/fw-transaction.c +++ b/drivers/firewire/fw-transaction.c | |||
@@ -751,7 +751,7 @@ handle_topology_map(struct fw_card *card, struct fw_request *request, | |||
751 | void *payload, size_t length, void *callback_data) | 751 | void *payload, size_t length, void *callback_data) |
752 | { | 752 | { |
753 | int i, start, end; | 753 | int i, start, end; |
754 | u32 *map; | 754 | __be32 *map; |
755 | 755 | ||
756 | if (!TCODE_IS_READ_REQUEST(tcode)) { | 756 | if (!TCODE_IS_READ_REQUEST(tcode)) { |
757 | fw_send_response(card, request, RCODE_TYPE_ERROR); | 757 | fw_send_response(card, request, RCODE_TYPE_ERROR); |
diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h index fa7967b57408..a43bb22912f9 100644 --- a/drivers/firewire/fw-transaction.h +++ b/drivers/firewire/fw-transaction.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/fs.h> | 26 | #include <linux/fs.h> |
27 | #include <linux/dma-mapping.h> | 27 | #include <linux/dma-mapping.h> |
28 | #include <linux/firewire-constants.h> | 28 | #include <linux/firewire-constants.h> |
29 | #include <asm/atomic.h> | ||
29 | 30 | ||
30 | #define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4) | 31 | #define TCODE_IS_READ_REQUEST(tcode) (((tcode) & ~1) == 4) |
31 | #define TCODE_IS_BLOCK_PACKET(tcode) (((tcode) & 1) != 0) | 32 | #define TCODE_IS_BLOCK_PACKET(tcode) (((tcode) & 1) != 0) |
@@ -85,12 +86,12 @@ | |||
85 | static inline void | 86 | static inline void |
86 | fw_memcpy_from_be32(void *_dst, void *_src, size_t size) | 87 | fw_memcpy_from_be32(void *_dst, void *_src, size_t size) |
87 | { | 88 | { |
88 | u32 *dst = _dst; | 89 | u32 *dst = _dst; |
89 | u32 *src = _src; | 90 | __be32 *src = _src; |
90 | int i; | 91 | int i; |
91 | 92 | ||
92 | for (i = 0; i < size / 4; i++) | 93 | for (i = 0; i < size / 4; i++) |
93 | dst[i] = cpu_to_be32(src[i]); | 94 | dst[i] = be32_to_cpu(src[i]); |
94 | } | 95 | } |
95 | 96 | ||
96 | static inline void | 97 | static inline void |
@@ -219,6 +220,7 @@ extern struct bus_type fw_bus_type; | |||
219 | struct fw_card { | 220 | struct fw_card { |
220 | const struct fw_card_driver *driver; | 221 | const struct fw_card_driver *driver; |
221 | struct device *device; | 222 | struct device *device; |
223 | atomic_t device_count; | ||
222 | struct kref kref; | 224 | struct kref kref; |
223 | 225 | ||
224 | int node_id; | 226 | int node_id; |
diff --git a/drivers/gpio/pca953x.c b/drivers/gpio/pca953x.c index 92583cd4bffd..6e72fd31184d 100644 --- a/drivers/gpio/pca953x.c +++ b/drivers/gpio/pca953x.c | |||
@@ -184,6 +184,7 @@ static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios) | |||
184 | gc->direction_output = pca953x_gpio_direction_output; | 184 | gc->direction_output = pca953x_gpio_direction_output; |
185 | gc->get = pca953x_gpio_get_value; | 185 | gc->get = pca953x_gpio_get_value; |
186 | gc->set = pca953x_gpio_set_value; | 186 | gc->set = pca953x_gpio_set_value; |
187 | gc->can_sleep = 1; | ||
187 | 188 | ||
188 | gc->base = chip->gpio_start; | 189 | gc->base = chip->gpio_start; |
189 | gc->ngpio = gpios; | 190 | gc->ngpio = gpios; |
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c index 573abe440842..2fa43183d375 100644 --- a/drivers/i2c/busses/i2c-amd756.c +++ b/drivers/i2c/busses/i2c-amd756.c | |||
@@ -335,7 +335,7 @@ static int __devinit amd756_probe(struct pci_dev *pdev, | |||
335 | u8 temp; | 335 | u8 temp; |
336 | 336 | ||
337 | /* driver_data might come from user-space, so check it */ | 337 | /* driver_data might come from user-space, so check it */ |
338 | if (id->driver_data > ARRAY_SIZE(chipname)) | 338 | if (id->driver_data >= ARRAY_SIZE(chipname)) |
339 | return -EINVAL; | 339 | return -EINVAL; |
340 | 340 | ||
341 | if (amd756_ioport) { | 341 | if (amd756_ioport) { |
diff --git a/drivers/i2c/chips/Makefile b/drivers/i2c/chips/Makefile index 501f00cea782..e47aca0ca5ae 100644 --- a/drivers/i2c/chips/Makefile +++ b/drivers/i2c/chips/Makefile | |||
@@ -1,6 +1,13 @@ | |||
1 | # | 1 | # |
2 | # Makefile for miscellaneous I2C chip drivers. | 2 | # Makefile for miscellaneous I2C chip drivers. |
3 | # | 3 | # |
4 | # Think twice before you add a new driver to this directory. | ||
5 | # Device drivers are better grouped according to the functionality they | ||
6 | # implement rather than to the bus they are connected to. In particular: | ||
7 | # * Hardware monitoring chip drivers go to drivers/hwmon | ||
8 | # * RTC chip drivers go to drivers/rtc | ||
9 | # * I/O expander drivers go to drivers/gpio | ||
10 | # | ||
4 | 11 | ||
5 | obj-$(CONFIG_DS1682) += ds1682.o | 12 | obj-$(CONFIG_DS1682) += ds1682.o |
6 | obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o | 13 | obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 96da22e9a5a4..fd84b2a36338 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -90,12 +90,16 @@ static int i2c_device_probe(struct device *dev) | |||
90 | { | 90 | { |
91 | struct i2c_client *client = to_i2c_client(dev); | 91 | struct i2c_client *client = to_i2c_client(dev); |
92 | struct i2c_driver *driver = to_i2c_driver(dev->driver); | 92 | struct i2c_driver *driver = to_i2c_driver(dev->driver); |
93 | int status; | ||
93 | 94 | ||
94 | if (!driver->probe) | 95 | if (!driver->probe) |
95 | return -ENODEV; | 96 | return -ENODEV; |
96 | client->driver = driver; | 97 | client->driver = driver; |
97 | dev_dbg(dev, "probe\n"); | 98 | dev_dbg(dev, "probe\n"); |
98 | return driver->probe(client); | 99 | status = driver->probe(client); |
100 | if (status) | ||
101 | client->driver = NULL; | ||
102 | return status; | ||
99 | } | 103 | } |
100 | 104 | ||
101 | static int i2c_device_remove(struct device *dev) | 105 | static int i2c_device_remove(struct device *dev) |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index df752e690e47..eed6d8e1b5c7 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -50,7 +50,7 @@ menuconfig IDE | |||
50 | To compile this driver as a module, choose M here: the | 50 | To compile this driver as a module, choose M here: the |
51 | module will be called ide. | 51 | module will be called ide. |
52 | 52 | ||
53 | For further information, please read <file:Documentation/ide.txt>. | 53 | For further information, please read <file:Documentation/ide/ide.txt>. |
54 | 54 | ||
55 | If unsure, say Y. | 55 | If unsure, say Y. |
56 | 56 | ||
@@ -77,7 +77,7 @@ config BLK_DEV_IDE | |||
77 | Useful information about large (>540 MB) IDE disks, multiple | 77 | Useful information about large (>540 MB) IDE disks, multiple |
78 | interfaces, what to do if ATA/IDE devices are not automatically | 78 | interfaces, what to do if ATA/IDE devices are not automatically |
79 | detected, sound card ATA/IDE ports, module support, and other | 79 | detected, sound card ATA/IDE ports, module support, and other |
80 | topics, is contained in <file:Documentation/ide.txt>. For detailed | 80 | topics, is contained in <file:Documentation/ide/ide.txt>. For detailed |
81 | information about hard drives, consult the Disk-HOWTO and the | 81 | information about hard drives, consult the Disk-HOWTO and the |
82 | Multi-Disk-HOWTO, available from | 82 | Multi-Disk-HOWTO, available from |
83 | <http://www.tldp.org/docs.html#howto>. | 83 | <http://www.tldp.org/docs.html#howto>. |
@@ -87,7 +87,7 @@ config BLK_DEV_IDE | |||
87 | <ftp://ibiblio.org/pub/Linux/system/hardware/>. | 87 | <ftp://ibiblio.org/pub/Linux/system/hardware/>. |
88 | 88 | ||
89 | To compile this driver as a module, choose M here and read | 89 | To compile this driver as a module, choose M here and read |
90 | <file:Documentation/ide.txt>. The module will be called ide-mod. | 90 | <file:Documentation/ide/ide.txt>. The module will be called ide-mod. |
91 | Do not compile this driver as a module if your root file system (the | 91 | Do not compile this driver as a module if your root file system (the |
92 | one containing the directory /) is located on an IDE device. | 92 | one containing the directory /) is located on an IDE device. |
93 | 93 | ||
@@ -98,7 +98,7 @@ config BLK_DEV_IDE | |||
98 | 98 | ||
99 | if BLK_DEV_IDE | 99 | if BLK_DEV_IDE |
100 | 100 | ||
101 | comment "Please see Documentation/ide.txt for help/info on IDE drives" | 101 | comment "Please see Documentation/ide/ide.txt for help/info on IDE drives" |
102 | 102 | ||
103 | config BLK_DEV_IDE_SATA | 103 | config BLK_DEV_IDE_SATA |
104 | bool "Support for SATA (deprecated; conflicts with libata SATA driver)" | 104 | bool "Support for SATA (deprecated; conflicts with libata SATA driver)" |
@@ -235,8 +235,8 @@ config BLK_DEV_IDETAPE | |||
235 | along with other IDE devices, as "hdb" or "hdc", or something | 235 | along with other IDE devices, as "hdb" or "hdc", or something |
236 | similar, and will be mapped to a character device such as "ht0" | 236 | similar, and will be mapped to a character device such as "ht0" |
237 | (check the boot messages with dmesg). Be sure to consult the | 237 | (check the boot messages with dmesg). Be sure to consult the |
238 | <file:drivers/ide/ide-tape.c> and <file:Documentation/ide.txt> files | 238 | <file:drivers/ide/ide-tape.c> and <file:Documentation/ide/ide.txt> |
239 | for usage information. | 239 | files for usage information. |
240 | 240 | ||
241 | To compile this driver as a module, choose M here: the | 241 | To compile this driver as a module, choose M here: the |
242 | module will be called ide-tape. | 242 | module will be called ide-tape. |
@@ -358,7 +358,7 @@ config BLK_DEV_CMD640 | |||
358 | 358 | ||
359 | The CMD640 chip is also used on add-in cards by Acculogic, and on | 359 | The CMD640 chip is also used on add-in cards by Acculogic, and on |
360 | the "CSA-6400E PCI to IDE controller" that some people have. For | 360 | the "CSA-6400E PCI to IDE controller" that some people have. For |
361 | details, read <file:Documentation/ide.txt>. | 361 | details, read <file:Documentation/ide/ide.txt>. |
362 | 362 | ||
363 | config BLK_DEV_CMD640_ENHANCED | 363 | config BLK_DEV_CMD640_ENHANCED |
364 | bool "CMD640 enhanced support" | 364 | bool "CMD640 enhanced support" |
@@ -366,7 +366,7 @@ config BLK_DEV_CMD640_ENHANCED | |||
366 | help | 366 | help |
367 | This option includes support for setting/autotuning PIO modes and | 367 | This option includes support for setting/autotuning PIO modes and |
368 | prefetch on CMD640 IDE interfaces. For details, read | 368 | prefetch on CMD640 IDE interfaces. For details, read |
369 | <file:Documentation/ide.txt>. If you have a CMD640 IDE interface | 369 | <file:Documentation/ide/ide.txt>. If you have a CMD640 IDE interface |
370 | and your BIOS does not already do this for you, then say Y here. | 370 | and your BIOS does not already do this for you, then say Y here. |
371 | Otherwise say N. | 371 | Otherwise say N. |
372 | 372 | ||
@@ -1069,9 +1069,9 @@ config BLK_DEV_ALI14XX | |||
1069 | This driver is enabled at runtime using the "ali14xx.probe" kernel | 1069 | This driver is enabled at runtime using the "ali14xx.probe" kernel |
1070 | boot parameter. It enables support for the secondary IDE interface | 1070 | boot parameter. It enables support for the secondary IDE interface |
1071 | of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster | 1071 | of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster |
1072 | I/O speeds to be set as well. See the files | 1072 | I/O speeds to be set as well. |
1073 | <file:Documentation/ide.txt> and <file:drivers/ide/legacy/ali14xx.c> | 1073 | See the files <file:Documentation/ide/ide.txt> and |
1074 | for more info. | 1074 | <file:drivers/ide/legacy/ali14xx.c> for more info. |
1075 | 1075 | ||
1076 | config BLK_DEV_DTC2278 | 1076 | config BLK_DEV_DTC2278 |
1077 | tristate "DTC-2278 support" | 1077 | tristate "DTC-2278 support" |
@@ -1079,7 +1079,7 @@ config BLK_DEV_DTC2278 | |||
1079 | This driver is enabled at runtime using the "dtc2278.probe" kernel | 1079 | This driver is enabled at runtime using the "dtc2278.probe" kernel |
1080 | boot parameter. It enables support for the secondary IDE interface | 1080 | boot parameter. It enables support for the secondary IDE interface |
1081 | of the DTC-2278 card, and permits faster I/O speeds to be set as | 1081 | of the DTC-2278 card, and permits faster I/O speeds to be set as |
1082 | well. See the <file:Documentation/ide.txt> and | 1082 | well. See the <file:Documentation/ide/ide.txt> and |
1083 | <file:drivers/ide/legacy/dtc2278.c> files for more info. | 1083 | <file:drivers/ide/legacy/dtc2278.c> files for more info. |
1084 | 1084 | ||
1085 | config BLK_DEV_HT6560B | 1085 | config BLK_DEV_HT6560B |
@@ -1088,7 +1088,7 @@ config BLK_DEV_HT6560B | |||
1088 | This driver is enabled at runtime using the "ht6560b.probe" kernel | 1088 | This driver is enabled at runtime using the "ht6560b.probe" kernel |
1089 | boot parameter. It enables support for the secondary IDE interface | 1089 | boot parameter. It enables support for the secondary IDE interface |
1090 | of the Holtek card, and permits faster I/O speeds to be set as well. | 1090 | of the Holtek card, and permits faster I/O speeds to be set as well. |
1091 | See the <file:Documentation/ide.txt> and | 1091 | See the <file:Documentation/ide/ide.txt> and |
1092 | <file:drivers/ide/legacy/ht6560b.c> files for more info. | 1092 | <file:drivers/ide/legacy/ht6560b.c> files for more info. |
1093 | 1093 | ||
1094 | config BLK_DEV_QD65XX | 1094 | config BLK_DEV_QD65XX |
@@ -1096,7 +1096,7 @@ config BLK_DEV_QD65XX | |||
1096 | help | 1096 | help |
1097 | This driver is enabled at runtime using the "qd65xx.probe" kernel | 1097 | This driver is enabled at runtime using the "qd65xx.probe" kernel |
1098 | boot parameter. It permits faster I/O speeds to be set. See the | 1098 | boot parameter. It permits faster I/O speeds to be set. See the |
1099 | <file:Documentation/ide.txt> and <file:drivers/ide/legacy/qd65xx.c> | 1099 | <file:Documentation/ide/ide.txt> and <file:drivers/ide/legacy/qd65xx.c> |
1100 | for more info. | 1100 | for more info. |
1101 | 1101 | ||
1102 | config BLK_DEV_UMC8672 | 1102 | config BLK_DEV_UMC8672 |
@@ -1105,7 +1105,7 @@ config BLK_DEV_UMC8672 | |||
1105 | This driver is enabled at runtime using the "umc8672.probe" kernel | 1105 | This driver is enabled at runtime using the "umc8672.probe" kernel |
1106 | boot parameter. It enables support for the secondary IDE interface | 1106 | boot parameter. It enables support for the secondary IDE interface |
1107 | of the UMC-8672, and permits faster I/O speeds to be set as well. | 1107 | of the UMC-8672, and permits faster I/O speeds to be set as well. |
1108 | See the files <file:Documentation/ide.txt> and | 1108 | See the files <file:Documentation/ide/ide.txt> and |
1109 | <file:drivers/ide/legacy/umc8672.c> for more info. | 1109 | <file:drivers/ide/legacy/umc8672.c> for more info. |
1110 | 1110 | ||
1111 | endif | 1111 | endif |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 310e497b5838..c8d0e8715997 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -670,8 +670,8 @@ static void cdrom_buffer_sectors (ide_drive_t *drive, unsigned long sector, | |||
670 | * and attempt to recover if there are problems. Returns 0 if everything's | 670 | * and attempt to recover if there are problems. Returns 0 if everything's |
671 | * ok; nonzero if the request has been terminated. | 671 | * ok; nonzero if the request has been terminated. |
672 | */ | 672 | */ |
673 | static | 673 | static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq, |
674 | int ide_cd_check_ireason(ide_drive_t *drive, int len, int ireason, int rw) | 674 | int len, int ireason, int rw) |
675 | { | 675 | { |
676 | /* | 676 | /* |
677 | * ireason == 0: the drive wants to receive data from us | 677 | * ireason == 0: the drive wants to receive data from us |
@@ -701,6 +701,9 @@ int ide_cd_check_ireason(ide_drive_t *drive, int len, int ireason, int rw) | |||
701 | drive->name, __FUNCTION__, ireason); | 701 | drive->name, __FUNCTION__, ireason); |
702 | } | 702 | } |
703 | 703 | ||
704 | if (rq->cmd_type == REQ_TYPE_ATA_PC) | ||
705 | rq->cmd_flags |= REQ_FAILED; | ||
706 | |||
704 | cdrom_end_request(drive, 0); | 707 | cdrom_end_request(drive, 0); |
705 | return -1; | 708 | return -1; |
706 | } | 709 | } |
@@ -1071,11 +1074,11 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
1071 | /* | 1074 | /* |
1072 | * check which way to transfer data | 1075 | * check which way to transfer data |
1073 | */ | 1076 | */ |
1074 | if (blk_fs_request(rq) || blk_pc_request(rq)) { | 1077 | if (ide_cd_check_ireason(drive, rq, len, ireason, write)) |
1075 | if (ide_cd_check_ireason(drive, len, ireason, write)) | 1078 | return ide_stopped; |
1076 | return ide_stopped; | ||
1077 | 1079 | ||
1078 | if (blk_fs_request(rq) && write == 0) { | 1080 | if (blk_fs_request(rq)) { |
1081 | if (write == 0) { | ||
1079 | int nskip; | 1082 | int nskip; |
1080 | 1083 | ||
1081 | if (ide_cd_check_transfer_size(drive, len)) { | 1084 | if (ide_cd_check_transfer_size(drive, len)) { |
@@ -1101,16 +1104,9 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
1101 | if (ireason == 0) { | 1104 | if (ireason == 0) { |
1102 | write = 1; | 1105 | write = 1; |
1103 | xferfunc = HWIF(drive)->atapi_output_bytes; | 1106 | xferfunc = HWIF(drive)->atapi_output_bytes; |
1104 | } else if (ireason == 2 || (ireason == 1 && | 1107 | } else { |
1105 | (blk_fs_request(rq) || blk_pc_request(rq)))) { | ||
1106 | write = 0; | 1108 | write = 0; |
1107 | xferfunc = HWIF(drive)->atapi_input_bytes; | 1109 | xferfunc = HWIF(drive)->atapi_input_bytes; |
1108 | } else { | ||
1109 | printk(KERN_ERR "%s: %s: The drive " | ||
1110 | "appears confused (ireason = 0x%02x). " | ||
1111 | "Trying to recover by ending request.\n", | ||
1112 | drive->name, __FUNCTION__, ireason); | ||
1113 | goto end_request; | ||
1114 | } | 1110 | } |
1115 | 1111 | ||
1116 | /* | 1112 | /* |
@@ -1182,11 +1178,10 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
1182 | else | 1178 | else |
1183 | rq->data += blen; | 1179 | rq->data += blen; |
1184 | } | 1180 | } |
1181 | if (!write && blk_sense_request(rq)) | ||
1182 | rq->sense_len += blen; | ||
1185 | } | 1183 | } |
1186 | 1184 | ||
1187 | if (write && blk_sense_request(rq)) | ||
1188 | rq->sense_len += thislen; | ||
1189 | |||
1190 | /* | 1185 | /* |
1191 | * pad, if necessary | 1186 | * pad, if necessary |
1192 | */ | 1187 | */ |
@@ -1931,6 +1926,7 @@ static const struct cd_list_entry ide_cd_quirks_list[] = { | |||
1931 | { "MATSHITADVD-ROM SR-8186", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, | 1926 | { "MATSHITADVD-ROM SR-8186", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, |
1932 | { "MATSHITADVD-ROM SR-8176", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, | 1927 | { "MATSHITADVD-ROM SR-8176", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, |
1933 | { "MATSHITADVD-ROM SR-8174", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, | 1928 | { "MATSHITADVD-ROM SR-8174", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, |
1929 | { "Optiarc DVD RW AD-5200A", NULL, IDE_CD_FLAG_PLAY_AUDIO_OK }, | ||
1934 | { NULL, NULL, 0 } | 1930 | { NULL, NULL, 0 } |
1935 | }; | 1931 | }; |
1936 | 1932 | ||
diff --git a/drivers/ide/ide-cd_ioctl.c b/drivers/ide/ide-cd_ioctl.c index b68284de4e85..6d147ce6782f 100644 --- a/drivers/ide/ide-cd_ioctl.c +++ b/drivers/ide/ide-cd_ioctl.c | |||
@@ -457,6 +457,10 @@ int ide_cdrom_packet(struct cdrom_device_info *cdi, | |||
457 | layer. the packet must be complete, as we do not | 457 | layer. the packet must be complete, as we do not |
458 | touch it at all. */ | 458 | touch it at all. */ |
459 | ide_cd_init_rq(drive, &req); | 459 | ide_cd_init_rq(drive, &req); |
460 | |||
461 | if (cgc->data_direction == CGC_DATA_WRITE) | ||
462 | req.cmd_flags |= REQ_RW; | ||
463 | |||
460 | memcpy(req.cmd, cgc->cmd, CDROM_PACKET_SIZE); | 464 | memcpy(req.cmd, cgc->cmd, CDROM_PACKET_SIZE); |
461 | if (cgc->sense) | 465 | if (cgc->sense) |
462 | memset(cgc->sense, 0, sizeof(struct request_sense)); | 466 | memset(cgc->sense, 0, sizeof(struct request_sense)); |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 8f5bed471050..39501d130256 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -867,7 +867,7 @@ static void idedisk_setup (ide_drive_t *drive) | |||
867 | 867 | ||
868 | /* Only print cache size when it was specified */ | 868 | /* Only print cache size when it was specified */ |
869 | if (id->buf_size) | 869 | if (id->buf_size) |
870 | printk (" w/%dKiB Cache", id->buf_size/2); | 870 | printk(KERN_CONT " w/%dKiB Cache", id->buf_size / 2); |
871 | 871 | ||
872 | printk(KERN_CONT ", CHS=%d/%d/%d\n", | 872 | printk(KERN_CONT ", CHS=%d/%d/%d\n", |
873 | drive->bios_cyl, drive->bios_head, drive->bios_sect); | 873 | drive->bios_cyl, drive->bios_head, drive->bios_sect); |
@@ -949,7 +949,8 @@ static void ide_device_shutdown(ide_drive_t *drive) | |||
949 | return; | 949 | return; |
950 | } | 950 | } |
951 | 951 | ||
952 | printk("Shutdown: %s\n", drive->name); | 952 | printk(KERN_INFO "Shutdown: %s\n", drive->name); |
953 | |||
953 | drive->gendev.bus->suspend(&drive->gendev, PMSG_SUSPEND); | 954 | drive->gendev.bus->suspend(&drive->gendev, PMSG_SUSPEND); |
954 | } | 955 | } |
955 | 956 | ||
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index d0e7b537353e..d61e5788d310 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
@@ -1,9 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * IDE DMA support (including IDE PCI BM-DMA). | ||
3 | * | ||
2 | * Copyright (C) 1995-1998 Mark Lord | 4 | * Copyright (C) 1995-1998 Mark Lord |
3 | * Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org> | 5 | * Copyright (C) 1999-2000 Andre Hedrick <andre@linux-ide.org> |
4 | * Copyright (C) 2004, 2007 Bartlomiej Zolnierkiewicz | 6 | * Copyright (C) 2004, 2007 Bartlomiej Zolnierkiewicz |
5 | * | 7 | * |
6 | * May be copied or modified under the terms of the GNU General Public License | 8 | * May be copied or modified under the terms of the GNU General Public License |
9 | * | ||
10 | * DMA is supported for all IDE devices (disk drives, cdroms, tapes, floppies). | ||
7 | */ | 11 | */ |
8 | 12 | ||
9 | /* | 13 | /* |
@@ -11,49 +15,6 @@ | |||
11 | */ | 15 | */ |
12 | 16 | ||
13 | /* | 17 | /* |
14 | * This module provides support for the bus-master IDE DMA functions | ||
15 | * of various PCI chipsets, including the Intel PIIX (i82371FB for | ||
16 | * the 430 FX chipset), the PIIX3 (i82371SB for the 430 HX/VX and | ||
17 | * 440 chipsets), and the PIIX4 (i82371AB for the 430 TX chipset) | ||
18 | * ("PIIX" stands for "PCI ISA IDE Xcellerator"). | ||
19 | * | ||
20 | * Pretty much the same code works for other IDE PCI bus-mastering chipsets. | ||
21 | * | ||
22 | * DMA is supported for all IDE devices (disk drives, cdroms, tapes, floppies). | ||
23 | * | ||
24 | * By default, DMA support is prepared for use, but is currently enabled only | ||
25 | * for drives which already have DMA enabled (UltraDMA or mode 2 multi/single), | ||
26 | * or which are recognized as "good" (see table below). Drives with only mode0 | ||
27 | * or mode1 (multi/single) DMA should also work with this chipset/driver | ||
28 | * (eg. MC2112A) but are not enabled by default. | ||
29 | * | ||
30 | * Use "hdparm -i" to view modes supported by a given drive. | ||
31 | * | ||
32 | * The hdparm-3.5 (or later) utility can be used for manually enabling/disabling | ||
33 | * DMA support, but must be (re-)compiled against this kernel version or later. | ||
34 | * | ||
35 | * To enable DMA, use "hdparm -d1 /dev/hd?" on a per-drive basis after booting. | ||
36 | * If problems arise, ide.c will disable DMA operation after a few retries. | ||
37 | * This error recovery mechanism works and has been extremely well exercised. | ||
38 | * | ||
39 | * IDE drives, depending on their vintage, may support several different modes | ||
40 | * of DMA operation. The boot-time modes are indicated with a "*" in | ||
41 | * the "hdparm -i" listing, and can be changed with *knowledgeable* use of | ||
42 | * the "hdparm -X" feature. There is seldom a need to do this, as drives | ||
43 | * normally power-up with their "best" PIO/DMA modes enabled. | ||
44 | * | ||
45 | * Testing has been done with a rather extensive number of drives, | ||
46 | * with Quantum & Western Digital models generally outperforming the pack, | ||
47 | * and Fujitsu & Conner (and some Seagate which are really Conner) drives | ||
48 | * showing more lackluster throughput. | ||
49 | * | ||
50 | * Keep an eye on /var/adm/messages for "DMA disabled" messages. | ||
51 | * | ||
52 | * Some people have reported trouble with Intel Zappa motherboards. | ||
53 | * This can be fixed by upgrading the AMI BIOS to version 1.00.04.BS0, | ||
54 | * available from ftp://ftp.intel.com/pub/bios/10004bs0.exe | ||
55 | * (thanks to Glen Morrell <glen@spin.Stanford.edu> for researching this). | ||
56 | * | ||
57 | * Thanks to "Christopher J. Reimer" <reimer@doe.carleton.ca> for | 18 | * Thanks to "Christopher J. Reimer" <reimer@doe.carleton.ca> for |
58 | * fixing the problem with the BIOS on some Acer motherboards. | 19 | * fixing the problem with the BIOS on some Acer motherboards. |
59 | * | 20 | * |
@@ -65,11 +26,6 @@ | |||
65 | * | 26 | * |
66 | * Most importantly, thanks to Robert Bringman <rob@mars.trion.com> | 27 | * Most importantly, thanks to Robert Bringman <rob@mars.trion.com> |
67 | * for supplying a Promise UDMA board & WD UDMA drive for this work! | 28 | * for supplying a Promise UDMA board & WD UDMA drive for this work! |
68 | * | ||
69 | * And, yes, Intel Zappa boards really *do* use both PIIX IDE ports. | ||
70 | * | ||
71 | * ATA-66/100 and recovery functions, I forgot the rest...... | ||
72 | * | ||
73 | */ | 29 | */ |
74 | 30 | ||
75 | #include <linux/module.h> | 31 | #include <linux/module.h> |
@@ -757,7 +713,7 @@ static int ide_tune_dma(ide_drive_t *drive) | |||
757 | } | 713 | } |
758 | 714 | ||
759 | if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE) | 715 | if (hwif->host_flags & IDE_HFLAG_NO_SET_MODE) |
760 | return 0; | 716 | return 1; |
761 | 717 | ||
762 | if (ide_set_dma_mode(drive, speed)) | 718 | if (ide_set_dma_mode(drive, speed)) |
763 | return 0; | 719 | return 0; |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 4a2cb2868226..194ecb0049eb 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -756,7 +756,8 @@ static int ide_probe_port(ide_hwif_t *hwif) | |||
756 | 756 | ||
757 | BUG_ON(hwif->present); | 757 | BUG_ON(hwif->present); |
758 | 758 | ||
759 | if (hwif->noprobe) | 759 | if (hwif->noprobe || |
760 | (hwif->drives[0].noprobe && hwif->drives[1].noprobe)) | ||
760 | return -EACCES; | 761 | return -EACCES; |
761 | 762 | ||
762 | /* | 763 | /* |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 0598ecfd5f37..43e0e0557776 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -3765,6 +3765,11 @@ static int ide_tape_probe(ide_drive_t *drive) | |||
3765 | g->fops = &idetape_block_ops; | 3765 | g->fops = &idetape_block_ops; |
3766 | ide_register_region(g); | 3766 | ide_register_region(g); |
3767 | 3767 | ||
3768 | printk(KERN_WARNING "It is possible that this driver does not have any" | ||
3769 | " users anymore and, as a result, it will be REMOVED soon." | ||
3770 | " Please notify Bart <bzolnier@gmail.com> or Boris" | ||
3771 | " <petkovbb@gmail.com> in case you still need it.\n"); | ||
3772 | |||
3768 | return 0; | 3773 | return 0; |
3769 | 3774 | ||
3770 | out_free_tape: | 3775 | out_free_tape: |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 477833f0daf5..9976f9d627d4 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -590,11 +590,6 @@ void ide_unregister(unsigned int index, int init_default, int restore) | |||
590 | hwif->extra_ports = 0; | 590 | hwif->extra_ports = 0; |
591 | } | 591 | } |
592 | 592 | ||
593 | /* | ||
594 | * Note that we only release the standard ports, | ||
595 | * and do not even try to handle any extra ports | ||
596 | * allocated for weird IDE interface chipsets. | ||
597 | */ | ||
598 | ide_hwif_release_regions(hwif); | 593 | ide_hwif_release_regions(hwif); |
599 | 594 | ||
600 | /* copy original settings */ | 595 | /* copy original settings */ |
@@ -672,7 +667,6 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *), | |||
672 | 667 | ||
673 | do { | 668 | do { |
674 | hwif = ide_deprecated_find_port(hw->io_ports[IDE_DATA_OFFSET]); | 669 | hwif = ide_deprecated_find_port(hw->io_ports[IDE_DATA_OFFSET]); |
675 | index = hwif->index; | ||
676 | if (hwif) | 670 | if (hwif) |
677 | goto found; | 671 | goto found; |
678 | for (index = 0; index < MAX_HWIFS; index++) | 672 | for (index = 0; index < MAX_HWIFS; index++) |
@@ -680,6 +674,7 @@ int ide_register_hw(hw_regs_t *hw, void (*quirkproc)(ide_drive_t *), | |||
680 | } while (retry--); | 674 | } while (retry--); |
681 | return -1; | 675 | return -1; |
682 | found: | 676 | found: |
677 | index = hwif->index; | ||
683 | if (hwif->present) | 678 | if (hwif->present) |
684 | ide_unregister(index, 0, 1); | 679 | ide_unregister(index, 0, 1); |
685 | else if (!hwif->hold) | 680 | else if (!hwif->hold) |
@@ -1036,10 +1031,9 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device | |||
1036 | drive->nice1 = (arg >> IDE_NICE_1) & 1; | 1031 | drive->nice1 = (arg >> IDE_NICE_1) & 1; |
1037 | return 0; | 1032 | return 0; |
1038 | case HDIO_DRIVE_RESET: | 1033 | case HDIO_DRIVE_RESET: |
1039 | { | 1034 | if (!capable(CAP_SYS_ADMIN)) |
1040 | unsigned long flags; | 1035 | return -EACCES; |
1041 | if (!capable(CAP_SYS_ADMIN)) return -EACCES; | 1036 | |
1042 | |||
1043 | /* | 1037 | /* |
1044 | * Abort the current command on the | 1038 | * Abort the current command on the |
1045 | * group if there is one, taking | 1039 | * group if there is one, taking |
@@ -1058,17 +1052,15 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device | |||
1058 | ide_abort(drive, "drive reset"); | 1052 | ide_abort(drive, "drive reset"); |
1059 | 1053 | ||
1060 | BUG_ON(HWGROUP(drive)->handler); | 1054 | BUG_ON(HWGROUP(drive)->handler); |
1061 | 1055 | ||
1062 | /* Ensure nothing gets queued after we | 1056 | /* Ensure nothing gets queued after we |
1063 | drop the lock. Reset will clear the busy */ | 1057 | drop the lock. Reset will clear the busy */ |
1064 | 1058 | ||
1065 | HWGROUP(drive)->busy = 1; | 1059 | HWGROUP(drive)->busy = 1; |
1066 | spin_unlock_irqrestore(&ide_lock, flags); | 1060 | spin_unlock_irqrestore(&ide_lock, flags); |
1067 | (void) ide_do_reset(drive); | 1061 | (void) ide_do_reset(drive); |
1068 | 1062 | ||
1069 | return 0; | 1063 | return 0; |
1070 | } | ||
1071 | |||
1072 | case HDIO_GET_BUSSTATE: | 1064 | case HDIO_GET_BUSSTATE: |
1073 | if (!capable(CAP_SYS_ADMIN)) | 1065 | if (!capable(CAP_SYS_ADMIN)) |
1074 | return -EACCES; | 1066 | return -EACCES; |
@@ -1188,7 +1180,7 @@ static int __initdata is_chipset_set[MAX_HWIFS]; | |||
1188 | * ide_setup() gets called VERY EARLY during initialization, | 1180 | * ide_setup() gets called VERY EARLY during initialization, |
1189 | * to handle kernel "command line" strings beginning with "hdx=" or "ide". | 1181 | * to handle kernel "command line" strings beginning with "hdx=" or "ide". |
1190 | * | 1182 | * |
1191 | * Remember to update Documentation/ide.txt if you change something here. | 1183 | * Remember to update Documentation/ide/ide.txt if you change something here. |
1192 | */ | 1184 | */ |
1193 | static int __init ide_setup(char *s) | 1185 | static int __init ide_setup(char *s) |
1194 | { | 1186 | { |
@@ -1449,7 +1441,7 @@ static int __init ide_setup(char *s) | |||
1449 | 1441 | ||
1450 | case -1: /* "noprobe" */ | 1442 | case -1: /* "noprobe" */ |
1451 | hwif->noprobe = 1; | 1443 | hwif->noprobe = 1; |
1452 | goto done; | 1444 | goto obsolete_option; |
1453 | 1445 | ||
1454 | case 1: /* base */ | 1446 | case 1: /* base */ |
1455 | vals[1] = vals[0] + 0x206; /* default ctl */ | 1447 | vals[1] = vals[0] + 0x206; /* default ctl */ |
diff --git a/drivers/ide/legacy/qd65xx.c b/drivers/ide/legacy/qd65xx.c index bba29df5f21d..2f4f47ad602f 100644 --- a/drivers/ide/legacy/qd65xx.c +++ b/drivers/ide/legacy/qd65xx.c | |||
@@ -334,43 +334,6 @@ static void __init qd6580_port_init_devs(ide_hwif_t *hwif) | |||
334 | hwif->drives[1].drive_data = t2; | 334 | hwif->drives[1].drive_data = t2; |
335 | } | 335 | } |
336 | 336 | ||
337 | /* | ||
338 | * qd_unsetup: | ||
339 | * | ||
340 | * called to unsetup an ata channel : back to default values, unlinks tuning | ||
341 | */ | ||
342 | /* | ||
343 | static void __exit qd_unsetup(ide_hwif_t *hwif) | ||
344 | { | ||
345 | u8 config = hwif->config_data; | ||
346 | int base = hwif->select_data; | ||
347 | void *set_pio_mode = (void *)hwif->set_pio_mode; | ||
348 | |||
349 | if (hwif->chipset != ide_qd65xx) | ||
350 | return; | ||
351 | |||
352 | printk(KERN_NOTICE "%s: back to defaults\n", hwif->name); | ||
353 | |||
354 | hwif->selectproc = NULL; | ||
355 | hwif->set_pio_mode = NULL; | ||
356 | |||
357 | if (set_pio_mode == (void *)qd6500_set_pio_mode) { | ||
358 | // will do it for both | ||
359 | outb(QD6500_DEF_DATA, QD_TIMREG(&hwif->drives[0])); | ||
360 | } else if (set_pio_mode == (void *)qd6580_set_pio_mode) { | ||
361 | if (QD_CONTROL(hwif) & QD_CONTR_SEC_DISABLED) { | ||
362 | outb(QD6580_DEF_DATA, QD_TIMREG(&hwif->drives[0])); | ||
363 | outb(QD6580_DEF_DATA2, QD_TIMREG(&hwif->drives[1])); | ||
364 | } else { | ||
365 | outb(hwif->channel ? QD6580_DEF_DATA2 : QD6580_DEF_DATA, QD_TIMREG(&hwif->drives[0])); | ||
366 | } | ||
367 | } else { | ||
368 | printk(KERN_WARNING "Unknown qd65xx tuning fonction !\n"); | ||
369 | printk(KERN_WARNING "keeping settings !\n"); | ||
370 | } | ||
371 | } | ||
372 | */ | ||
373 | |||
374 | static const struct ide_port_info qd65xx_port_info __initdata = { | 337 | static const struct ide_port_info qd65xx_port_info __initdata = { |
375 | .chipset = ide_qd65xx, | 338 | .chipset = ide_qd65xx, |
376 | .host_flags = IDE_HFLAG_IO_32BIT | | 339 | .host_flags = IDE_HFLAG_IO_32BIT | |
@@ -444,6 +407,8 @@ static int __init qd_probe(int base) | |||
444 | printk(KERN_DEBUG "qd6580: config=%#x, control=%#x, ID3=%u\n", | 407 | printk(KERN_DEBUG "qd6580: config=%#x, control=%#x, ID3=%u\n", |
445 | config, control, QD_ID3); | 408 | config, control, QD_ID3); |
446 | 409 | ||
410 | outb(QD_DEF_CONTR, QD_CONTROL_PORT); | ||
411 | |||
447 | if (control & QD_CONTR_SEC_DISABLED) { | 412 | if (control & QD_CONTR_SEC_DISABLED) { |
448 | /* secondary disabled */ | 413 | /* secondary disabled */ |
449 | 414 | ||
@@ -460,8 +425,6 @@ static int __init qd_probe(int base) | |||
460 | 425 | ||
461 | ide_device_add(idx, &qd65xx_port_info); | 426 | ide_device_add(idx, &qd65xx_port_info); |
462 | 427 | ||
463 | outb(QD_DEF_CONTR, QD_CONTROL_PORT); | ||
464 | |||
465 | return 1; | 428 | return 1; |
466 | } else { | 429 | } else { |
467 | ide_hwif_t *mate; | 430 | ide_hwif_t *mate; |
@@ -487,8 +450,6 @@ static int __init qd_probe(int base) | |||
487 | 450 | ||
488 | ide_device_add(idx, &qd65xx_port_info); | 451 | ide_device_add(idx, &qd65xx_port_info); |
489 | 452 | ||
490 | outb(QD_DEF_CONTR, QD_CONTROL_PORT); | ||
491 | |||
492 | return 0; /* no other qd65xx possible */ | 453 | return 0; /* no other qd65xx possible */ |
493 | } | 454 | } |
494 | } | 455 | } |
diff --git a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c index bd24dad3cfc6..ec667982809c 100644 --- a/drivers/ide/pci/cmd640.c +++ b/drivers/ide/pci/cmd640.c | |||
@@ -787,7 +787,8 @@ static int __init cmd640x_init(void) | |||
787 | /* | 787 | /* |
788 | * Try to enable the secondary interface, if not already enabled | 788 | * Try to enable the secondary interface, if not already enabled |
789 | */ | 789 | */ |
790 | if (cmd_hwif1->noprobe) { | 790 | if (cmd_hwif1->noprobe || |
791 | (cmd_hwif1->drives[0].noprobe && cmd_hwif1->drives[1].noprobe)) { | ||
791 | port2 = "not probed"; | 792 | port2 = "not probed"; |
792 | } else { | 793 | } else { |
793 | b = get_cmd640_reg(CNTRL); | 794 | b = get_cmd640_reg(CNTRL); |
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index d0f7bb8b8adf..6357bb6269ab 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -1570,10 +1570,12 @@ static int __devinit hpt366_init_one(struct pci_dev *dev, const struct pci_devic | |||
1570 | if (rev < 3) | 1570 | if (rev < 3) |
1571 | info = &hpt36x; | 1571 | info = &hpt36x; |
1572 | else { | 1572 | else { |
1573 | static const struct hpt_info *hpt37x_info[] = | 1573 | switch (min_t(u8, rev, 6)) { |
1574 | { &hpt370, &hpt370a, &hpt372, &hpt372n }; | 1574 | case 3: info = &hpt370; break; |
1575 | 1575 | case 4: info = &hpt370a; break; | |
1576 | info = hpt37x_info[min_t(u8, rev, 6) - 3]; | 1576 | case 5: info = &hpt372; break; |
1577 | case 6: info = &hpt372n; break; | ||
1578 | } | ||
1577 | idx++; | 1579 | idx++; |
1578 | } | 1580 | } |
1579 | break; | 1581 | break; |
@@ -1626,7 +1628,7 @@ static int __devinit hpt366_init_one(struct pci_dev *dev, const struct pci_devic | |||
1626 | return ide_setup_pci_device(dev, &d); | 1628 | return ide_setup_pci_device(dev, &d); |
1627 | } | 1629 | } |
1628 | 1630 | ||
1629 | static const struct pci_device_id hpt366_pci_tbl[] = { | 1631 | static const struct pci_device_id hpt366_pci_tbl[] __devinitconst = { |
1630 | { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT366), 0 }, | 1632 | { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT366), 0 }, |
1631 | { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT372), 1 }, | 1633 | { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT372), 1 }, |
1632 | { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT302), 2 }, | 1634 | { PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT302), 2 }, |
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 28e155a9e2a5..f53f72daae34 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
@@ -183,6 +183,9 @@ MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device " | |||
183 | * Avoids access beyond actual disk limits on devices with an off-by-one bug. | 183 | * Avoids access beyond actual disk limits on devices with an off-by-one bug. |
184 | * Don't use this with devices which don't have this bug. | 184 | * Don't use this with devices which don't have this bug. |
185 | * | 185 | * |
186 | * - delay inquiry | ||
187 | * Wait extra SBP2_INQUIRY_DELAY seconds after login before SCSI inquiry. | ||
188 | * | ||
186 | * - override internal blacklist | 189 | * - override internal blacklist |
187 | * Instead of adding to the built-in blacklist, use only the workarounds | 190 | * Instead of adding to the built-in blacklist, use only the workarounds |
188 | * specified in the module load parameter. | 191 | * specified in the module load parameter. |
@@ -195,6 +198,7 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0" | |||
195 | ", 36 byte inquiry = " __stringify(SBP2_WORKAROUND_INQUIRY_36) | 198 | ", 36 byte inquiry = " __stringify(SBP2_WORKAROUND_INQUIRY_36) |
196 | ", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8) | 199 | ", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8) |
197 | ", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY) | 200 | ", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY) |
201 | ", delay inquiry = " __stringify(SBP2_WORKAROUND_DELAY_INQUIRY) | ||
198 | ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) | 202 | ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) |
199 | ", or a combination)"); | 203 | ", or a combination)"); |
200 | 204 | ||
@@ -357,6 +361,11 @@ static const struct { | |||
357 | .workarounds = SBP2_WORKAROUND_INQUIRY_36 | | 361 | .workarounds = SBP2_WORKAROUND_INQUIRY_36 | |
358 | SBP2_WORKAROUND_MODE_SENSE_8, | 362 | SBP2_WORKAROUND_MODE_SENSE_8, |
359 | }, | 363 | }, |
364 | /* DViCO Momobay FX-3A with TSB42AA9A bridge */ { | ||
365 | .firmware_revision = 0x002800, | ||
366 | .model_id = 0x000000, | ||
367 | .workarounds = SBP2_WORKAROUND_DELAY_INQUIRY, | ||
368 | }, | ||
360 | /* Initio bridges, actually only needed for some older ones */ { | 369 | /* Initio bridges, actually only needed for some older ones */ { |
361 | .firmware_revision = 0x000200, | 370 | .firmware_revision = 0x000200, |
362 | .model_id = SBP2_ROM_VALUE_WILDCARD, | 371 | .model_id = SBP2_ROM_VALUE_WILDCARD, |
@@ -367,6 +376,11 @@ static const struct { | |||
367 | .model_id = SBP2_ROM_VALUE_WILDCARD, | 376 | .model_id = SBP2_ROM_VALUE_WILDCARD, |
368 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, | 377 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, |
369 | }, | 378 | }, |
379 | /* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ { | ||
380 | .firmware_revision = 0x002600, | ||
381 | .model_id = SBP2_ROM_VALUE_WILDCARD, | ||
382 | .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, | ||
383 | }, | ||
370 | /* iPod 4th generation */ { | 384 | /* iPod 4th generation */ { |
371 | .firmware_revision = 0x0a2700, | 385 | .firmware_revision = 0x0a2700, |
372 | .model_id = 0x000021, | 386 | .model_id = 0x000021, |
@@ -914,6 +928,9 @@ static int sbp2_start_device(struct sbp2_lu *lu) | |||
914 | sbp2_agent_reset(lu, 1); | 928 | sbp2_agent_reset(lu, 1); |
915 | sbp2_max_speed_and_size(lu); | 929 | sbp2_max_speed_and_size(lu); |
916 | 930 | ||
931 | if (lu->workarounds & SBP2_WORKAROUND_DELAY_INQUIRY) | ||
932 | ssleep(SBP2_INQUIRY_DELAY); | ||
933 | |||
917 | error = scsi_add_device(lu->shost, 0, lu->ud->id, 0); | 934 | error = scsi_add_device(lu->shost, 0, lu->ud->id, 0); |
918 | if (error) { | 935 | if (error) { |
919 | SBP2_ERR("scsi_add_device failed"); | 936 | SBP2_ERR("scsi_add_device failed"); |
@@ -1962,6 +1979,9 @@ static int sbp2scsi_slave_alloc(struct scsi_device *sdev) | |||
1962 | { | 1979 | { |
1963 | struct sbp2_lu *lu = (struct sbp2_lu *)sdev->host->hostdata[0]; | 1980 | struct sbp2_lu *lu = (struct sbp2_lu *)sdev->host->hostdata[0]; |
1964 | 1981 | ||
1982 | if (sdev->lun != 0 || sdev->id != lu->ud->id || sdev->channel != 0) | ||
1983 | return -ENODEV; | ||
1984 | |||
1965 | lu->sdev = sdev; | 1985 | lu->sdev = sdev; |
1966 | sdev->allow_restart = 1; | 1986 | sdev->allow_restart = 1; |
1967 | 1987 | ||
diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h index d2ecb0d8a1bb..80d8e097b065 100644 --- a/drivers/ieee1394/sbp2.h +++ b/drivers/ieee1394/sbp2.h | |||
@@ -343,6 +343,8 @@ enum sbp2lu_state_types { | |||
343 | #define SBP2_WORKAROUND_INQUIRY_36 0x2 | 343 | #define SBP2_WORKAROUND_INQUIRY_36 0x2 |
344 | #define SBP2_WORKAROUND_MODE_SENSE_8 0x4 | 344 | #define SBP2_WORKAROUND_MODE_SENSE_8 0x4 |
345 | #define SBP2_WORKAROUND_FIX_CAPACITY 0x8 | 345 | #define SBP2_WORKAROUND_FIX_CAPACITY 0x8 |
346 | #define SBP2_WORKAROUND_DELAY_INQUIRY 0x10 | ||
347 | #define SBP2_INQUIRY_DELAY 12 | ||
346 | #define SBP2_WORKAROUND_OVERRIDE 0x100 | 348 | #define SBP2_WORKAROUND_OVERRIDE 0x100 |
347 | 349 | ||
348 | #endif /* SBP2_H */ | 350 | #endif /* SBP2_H */ |
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index b10ade92efed..4df405157086 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c | |||
@@ -3759,6 +3759,7 @@ static void cm_remove_one(struct ib_device *device) | |||
3759 | port = cm_dev->port[i-1]; | 3759 | port = cm_dev->port[i-1]; |
3760 | ib_modify_port(device, port->port_num, 0, &port_modify); | 3760 | ib_modify_port(device, port->port_num, 0, &port_modify); |
3761 | ib_unregister_mad_agent(port->mad_agent); | 3761 | ib_unregister_mad_agent(port->mad_agent); |
3762 | flush_workqueue(cm.wq); | ||
3762 | cm_remove_port_fs(port); | 3763 | cm_remove_port_fs(port); |
3763 | } | 3764 | } |
3764 | kobject_put(&cm_dev->dev_obj); | 3765 | kobject_put(&cm_dev->dev_obj); |
@@ -3813,6 +3814,7 @@ static void __exit ib_cm_cleanup(void) | |||
3813 | cancel_delayed_work(&timewait_info->work.work); | 3814 | cancel_delayed_work(&timewait_info->work.work); |
3814 | spin_unlock_irq(&cm.lock); | 3815 | spin_unlock_irq(&cm.lock); |
3815 | 3816 | ||
3817 | ib_unregister_client(&cm_client); | ||
3816 | destroy_workqueue(cm.wq); | 3818 | destroy_workqueue(cm.wq); |
3817 | 3819 | ||
3818 | list_for_each_entry_safe(timewait_info, tmp, &cm.timewait_list, list) { | 3820 | list_for_each_entry_safe(timewait_info, tmp, &cm.timewait_list, list) { |
@@ -3820,7 +3822,6 @@ static void __exit ib_cm_cleanup(void) | |||
3820 | kfree(timewait_info); | 3822 | kfree(timewait_info); |
3821 | } | 3823 | } |
3822 | 3824 | ||
3823 | ib_unregister_client(&cm_client); | ||
3824 | class_unregister(&cm_class); | 3825 | class_unregister(&cm_class); |
3825 | idr_destroy(&cm.local_id_table); | 3826 | idr_destroy(&cm.local_id_table); |
3826 | } | 3827 | } |
diff --git a/drivers/infiniband/core/fmr_pool.c b/drivers/infiniband/core/fmr_pool.c index 7f00347364f7..06d502c06a4d 100644 --- a/drivers/infiniband/core/fmr_pool.c +++ b/drivers/infiniband/core/fmr_pool.c | |||
@@ -139,7 +139,7 @@ static inline struct ib_pool_fmr *ib_fmr_cache_lookup(struct ib_fmr_pool *pool, | |||
139 | static void ib_fmr_batch_release(struct ib_fmr_pool *pool) | 139 | static void ib_fmr_batch_release(struct ib_fmr_pool *pool) |
140 | { | 140 | { |
141 | int ret; | 141 | int ret; |
142 | struct ib_pool_fmr *fmr, *next; | 142 | struct ib_pool_fmr *fmr; |
143 | LIST_HEAD(unmap_list); | 143 | LIST_HEAD(unmap_list); |
144 | LIST_HEAD(fmr_list); | 144 | LIST_HEAD(fmr_list); |
145 | 145 | ||
@@ -158,20 +158,6 @@ static void ib_fmr_batch_release(struct ib_fmr_pool *pool) | |||
158 | #endif | 158 | #endif |
159 | } | 159 | } |
160 | 160 | ||
161 | /* | ||
162 | * The free_list may hold FMRs that have been put there | ||
163 | * because they haven't reached the max_remap count. | ||
164 | * Invalidate their mapping as well. | ||
165 | */ | ||
166 | list_for_each_entry_safe(fmr, next, &pool->free_list, list) { | ||
167 | if (fmr->remap_count == 0) | ||
168 | continue; | ||
169 | hlist_del_init(&fmr->cache_node); | ||
170 | fmr->remap_count = 0; | ||
171 | list_add_tail(&fmr->fmr->list, &fmr_list); | ||
172 | list_move(&fmr->list, &unmap_list); | ||
173 | } | ||
174 | |||
175 | list_splice(&pool->dirty_list, &unmap_list); | 161 | list_splice(&pool->dirty_list, &unmap_list); |
176 | INIT_LIST_HEAD(&pool->dirty_list); | 162 | INIT_LIST_HEAD(&pool->dirty_list); |
177 | pool->dirty_len = 0; | 163 | pool->dirty_len = 0; |
@@ -384,6 +370,11 @@ void ib_destroy_fmr_pool(struct ib_fmr_pool *pool) | |||
384 | 370 | ||
385 | i = 0; | 371 | i = 0; |
386 | list_for_each_entry_safe(fmr, tmp, &pool->free_list, list) { | 372 | list_for_each_entry_safe(fmr, tmp, &pool->free_list, list) { |
373 | if (fmr->remap_count) { | ||
374 | INIT_LIST_HEAD(&fmr_list); | ||
375 | list_add_tail(&fmr->fmr->list, &fmr_list); | ||
376 | ib_unmap_fmr(&fmr_list); | ||
377 | } | ||
387 | ib_dealloc_fmr(fmr->fmr); | 378 | ib_dealloc_fmr(fmr->fmr); |
388 | list_del(&fmr->list); | 379 | list_del(&fmr->list); |
389 | kfree(fmr); | 380 | kfree(fmr); |
@@ -407,8 +398,23 @@ EXPORT_SYMBOL(ib_destroy_fmr_pool); | |||
407 | */ | 398 | */ |
408 | int ib_flush_fmr_pool(struct ib_fmr_pool *pool) | 399 | int ib_flush_fmr_pool(struct ib_fmr_pool *pool) |
409 | { | 400 | { |
410 | int serial = atomic_inc_return(&pool->req_ser); | 401 | int serial; |
402 | struct ib_pool_fmr *fmr, *next; | ||
403 | |||
404 | /* | ||
405 | * The free_list holds FMRs that may have been used | ||
406 | * but have not been remapped enough times to be dirty. | ||
407 | * Put them on the dirty list now so that the cleanup | ||
408 | * thread will reap them too. | ||
409 | */ | ||
410 | spin_lock_irq(&pool->pool_lock); | ||
411 | list_for_each_entry_safe(fmr, next, &pool->free_list, list) { | ||
412 | if (fmr->remap_count > 0) | ||
413 | list_move(&fmr->list, &pool->dirty_list); | ||
414 | } | ||
415 | spin_unlock_irq(&pool->pool_lock); | ||
411 | 416 | ||
417 | serial = atomic_inc_return(&pool->req_ser); | ||
412 | wake_up_process(pool->thread); | 418 | wake_up_process(pool->thread); |
413 | 419 | ||
414 | if (wait_event_interruptible(pool->force_wait, | 420 | if (wait_event_interruptible(pool->force_wait, |
diff --git a/drivers/infiniband/core/iwcm.c b/drivers/infiniband/core/iwcm.c index 223b1aa7d92b..81c9195b512a 100644 --- a/drivers/infiniband/core/iwcm.c +++ b/drivers/infiniband/core/iwcm.c | |||
@@ -839,6 +839,7 @@ static void cm_work_handler(struct work_struct *_work) | |||
839 | unsigned long flags; | 839 | unsigned long flags; |
840 | int empty; | 840 | int empty; |
841 | int ret = 0; | 841 | int ret = 0; |
842 | int destroy_id; | ||
842 | 843 | ||
843 | spin_lock_irqsave(&cm_id_priv->lock, flags); | 844 | spin_lock_irqsave(&cm_id_priv->lock, flags); |
844 | empty = list_empty(&cm_id_priv->work_list); | 845 | empty = list_empty(&cm_id_priv->work_list); |
@@ -857,9 +858,9 @@ static void cm_work_handler(struct work_struct *_work) | |||
857 | destroy_cm_id(&cm_id_priv->id); | 858 | destroy_cm_id(&cm_id_priv->id); |
858 | } | 859 | } |
859 | BUG_ON(atomic_read(&cm_id_priv->refcount)==0); | 860 | BUG_ON(atomic_read(&cm_id_priv->refcount)==0); |
861 | destroy_id = test_bit(IWCM_F_CALLBACK_DESTROY, &cm_id_priv->flags); | ||
860 | if (iwcm_deref_id(cm_id_priv)) { | 862 | if (iwcm_deref_id(cm_id_priv)) { |
861 | if (test_bit(IWCM_F_CALLBACK_DESTROY, | 863 | if (destroy_id) { |
862 | &cm_id_priv->flags)) { | ||
863 | BUG_ON(!list_empty(&cm_id_priv->work_list)); | 864 | BUG_ON(!list_empty(&cm_id_priv->work_list)); |
864 | free_cm_id(cm_id_priv); | 865 | free_cm_id(cm_id_priv); |
865 | } | 866 | } |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_mem.c b/drivers/infiniband/hw/cxgb3/iwch_mem.c index 73bfd1656f86..b8797c66676d 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_mem.c +++ b/drivers/infiniband/hw/cxgb3/iwch_mem.c | |||
@@ -136,14 +136,8 @@ int build_phys_page_list(struct ib_phys_buf *buffer_list, | |||
136 | 136 | ||
137 | /* Find largest page shift we can use to cover buffers */ | 137 | /* Find largest page shift we can use to cover buffers */ |
138 | for (*shift = PAGE_SHIFT; *shift < 27; ++(*shift)) | 138 | for (*shift = PAGE_SHIFT; *shift < 27; ++(*shift)) |
139 | if (num_phys_buf > 1) { | 139 | if ((1ULL << *shift) & mask) |
140 | if ((1ULL << *shift) & mask) | 140 | break; |
141 | break; | ||
142 | } else | ||
143 | if (1ULL << *shift >= | ||
144 | buffer_list[0].size + | ||
145 | (buffer_list[0].addr & ((1ULL << *shift) - 1))) | ||
146 | break; | ||
147 | 141 | ||
148 | buffer_list[0].size += buffer_list[0].addr & ((1ULL << *shift) - 1); | 142 | buffer_list[0].size += buffer_list[0].addr & ((1ULL << *shift) - 1); |
149 | buffer_list[0].addr &= ~0ull << *shift; | 143 | buffer_list[0].addr &= ~0ull << *shift; |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c index df1838f8f94d..b2ea9210467f 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_provider.c +++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c | |||
@@ -189,7 +189,7 @@ static struct ib_cq *iwch_create_cq(struct ib_device *ibdev, int entries, int ve | |||
189 | return ERR_PTR(-ENOMEM); | 189 | return ERR_PTR(-ENOMEM); |
190 | } | 190 | } |
191 | chp->rhp = rhp; | 191 | chp->rhp = rhp; |
192 | chp->ibcq.cqe = (1 << chp->cq.size_log2) - 1; | 192 | chp->ibcq.cqe = 1 << chp->cq.size_log2; |
193 | spin_lock_init(&chp->lock); | 193 | spin_lock_init(&chp->lock); |
194 | atomic_set(&chp->refcnt, 1); | 194 | atomic_set(&chp->refcnt, 1); |
195 | init_waitqueue_head(&chp->wait); | 195 | init_waitqueue_head(&chp->wait); |
@@ -819,8 +819,11 @@ static struct ib_qp *iwch_create_qp(struct ib_pd *pd, | |||
819 | kfree(qhp); | 819 | kfree(qhp); |
820 | return ERR_PTR(-ENOMEM); | 820 | return ERR_PTR(-ENOMEM); |
821 | } | 821 | } |
822 | |||
822 | attrs->cap.max_recv_wr = rqsize - 1; | 823 | attrs->cap.max_recv_wr = rqsize - 1; |
823 | attrs->cap.max_send_wr = sqsize; | 824 | attrs->cap.max_send_wr = sqsize; |
825 | attrs->cap.max_inline_data = T3_MAX_INLINE; | ||
826 | |||
824 | qhp->rhp = rhp; | 827 | qhp->rhp = rhp; |
825 | qhp->attr.pd = php->pdid; | 828 | qhp->attr.pd = php->pdid; |
826 | qhp->attr.scq = ((struct iwch_cq *) attrs->send_cq)->cq.cqid; | 829 | qhp->attr.scq = ((struct iwch_cq *) attrs->send_cq)->cq.cqid; |
diff --git a/drivers/infiniband/hw/ipath/ipath_common.h b/drivers/infiniband/hw/ipath/ipath_common.h index 414621095540..591901aab6b7 100644 --- a/drivers/infiniband/hw/ipath/ipath_common.h +++ b/drivers/infiniband/hw/ipath/ipath_common.h | |||
@@ -75,7 +75,7 @@ | |||
75 | #define IPATH_IB_LINKDOWN 0 | 75 | #define IPATH_IB_LINKDOWN 0 |
76 | #define IPATH_IB_LINKARM 1 | 76 | #define IPATH_IB_LINKARM 1 |
77 | #define IPATH_IB_LINKACTIVE 2 | 77 | #define IPATH_IB_LINKACTIVE 2 |
78 | #define IPATH_IB_LINKINIT 3 | 78 | #define IPATH_IB_LINKDOWN_ONLY 3 |
79 | #define IPATH_IB_LINKDOWN_SLEEP 4 | 79 | #define IPATH_IB_LINKDOWN_SLEEP 4 |
80 | #define IPATH_IB_LINKDOWN_DISABLE 5 | 80 | #define IPATH_IB_LINKDOWN_DISABLE 5 |
81 | #define IPATH_IB_LINK_LOOPBACK 6 /* enable local loopback */ | 81 | #define IPATH_IB_LINK_LOOPBACK 6 /* enable local loopback */ |
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c index d5ff6ca2db30..ca4d0acc6786 100644 --- a/drivers/infiniband/hw/ipath/ipath_driver.c +++ b/drivers/infiniband/hw/ipath/ipath_driver.c | |||
@@ -851,8 +851,7 @@ void ipath_disarm_piobufs(struct ipath_devdata *dd, unsigned first, | |||
851 | * -ETIMEDOUT state can have multiple states set, for any of several | 851 | * -ETIMEDOUT state can have multiple states set, for any of several |
852 | * transitions. | 852 | * transitions. |
853 | */ | 853 | */ |
854 | static int ipath_wait_linkstate(struct ipath_devdata *dd, u32 state, | 854 | int ipath_wait_linkstate(struct ipath_devdata *dd, u32 state, int msecs) |
855 | int msecs) | ||
856 | { | 855 | { |
857 | dd->ipath_state_wanted = state; | 856 | dd->ipath_state_wanted = state; |
858 | wait_event_interruptible_timeout(ipath_state_wait, | 857 | wait_event_interruptible_timeout(ipath_state_wait, |
@@ -1656,8 +1655,8 @@ void ipath_cancel_sends(struct ipath_devdata *dd, int restore_sendctrl) | |||
1656 | static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which) | 1655 | static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which) |
1657 | { | 1656 | { |
1658 | static const char *what[4] = { | 1657 | static const char *what[4] = { |
1659 | [0] = "DOWN", | 1658 | [0] = "NOP", |
1660 | [INFINIPATH_IBCC_LINKCMD_INIT] = "INIT", | 1659 | [INFINIPATH_IBCC_LINKCMD_DOWN] = "DOWN", |
1661 | [INFINIPATH_IBCC_LINKCMD_ARMED] = "ARMED", | 1660 | [INFINIPATH_IBCC_LINKCMD_ARMED] = "ARMED", |
1662 | [INFINIPATH_IBCC_LINKCMD_ACTIVE] = "ACTIVE" | 1661 | [INFINIPATH_IBCC_LINKCMD_ACTIVE] = "ACTIVE" |
1663 | }; | 1662 | }; |
@@ -1672,9 +1671,9 @@ static void ipath_set_ib_lstate(struct ipath_devdata *dd, int which) | |||
1672 | (dd, dd->ipath_kregs->kr_ibcstatus) >> | 1671 | (dd, dd->ipath_kregs->kr_ibcstatus) >> |
1673 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) & | 1672 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) & |
1674 | INFINIPATH_IBCS_LINKTRAININGSTATE_MASK]); | 1673 | INFINIPATH_IBCS_LINKTRAININGSTATE_MASK]); |
1675 | /* flush all queued sends when going to DOWN or INIT, to be sure that | 1674 | /* flush all queued sends when going to DOWN to be sure that |
1676 | * they don't block MAD packets */ | 1675 | * they don't block MAD packets */ |
1677 | if (!linkcmd || linkcmd == INFINIPATH_IBCC_LINKCMD_INIT) | 1676 | if (linkcmd == INFINIPATH_IBCC_LINKCMD_DOWN) |
1678 | ipath_cancel_sends(dd, 1); | 1677 | ipath_cancel_sends(dd, 1); |
1679 | 1678 | ||
1680 | ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl, | 1679 | ipath_write_kreg(dd, dd->ipath_kregs->kr_ibcctrl, |
@@ -1687,6 +1686,13 @@ int ipath_set_linkstate(struct ipath_devdata *dd, u8 newstate) | |||
1687 | int ret; | 1686 | int ret; |
1688 | 1687 | ||
1689 | switch (newstate) { | 1688 | switch (newstate) { |
1689 | case IPATH_IB_LINKDOWN_ONLY: | ||
1690 | ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKCMD_DOWN << | ||
1691 | INFINIPATH_IBCC_LINKCMD_SHIFT); | ||
1692 | /* don't wait */ | ||
1693 | ret = 0; | ||
1694 | goto bail; | ||
1695 | |||
1690 | case IPATH_IB_LINKDOWN: | 1696 | case IPATH_IB_LINKDOWN: |
1691 | ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKINITCMD_POLL << | 1697 | ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKINITCMD_POLL << |
1692 | INFINIPATH_IBCC_LINKINITCMD_SHIFT); | 1698 | INFINIPATH_IBCC_LINKINITCMD_SHIFT); |
@@ -1709,16 +1715,6 @@ int ipath_set_linkstate(struct ipath_devdata *dd, u8 newstate) | |||
1709 | ret = 0; | 1715 | ret = 0; |
1710 | goto bail; | 1716 | goto bail; |
1711 | 1717 | ||
1712 | case IPATH_IB_LINKINIT: | ||
1713 | if (dd->ipath_flags & IPATH_LINKINIT) { | ||
1714 | ret = 0; | ||
1715 | goto bail; | ||
1716 | } | ||
1717 | ipath_set_ib_lstate(dd, INFINIPATH_IBCC_LINKCMD_INIT << | ||
1718 | INFINIPATH_IBCC_LINKCMD_SHIFT); | ||
1719 | lstate = IPATH_LINKINIT; | ||
1720 | break; | ||
1721 | |||
1722 | case IPATH_IB_LINKARM: | 1718 | case IPATH_IB_LINKARM: |
1723 | if (dd->ipath_flags & IPATH_LINKARMED) { | 1719 | if (dd->ipath_flags & IPATH_LINKARMED) { |
1724 | ret = 0; | 1720 | ret = 0; |
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index 4cc0f95ea877..ecf3f7ff7717 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
@@ -767,6 +767,7 @@ void ipath_kreceive(struct ipath_portdata *); | |||
767 | int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned); | 767 | int ipath_setrcvhdrsize(struct ipath_devdata *, unsigned); |
768 | int ipath_reset_device(int); | 768 | int ipath_reset_device(int); |
769 | void ipath_get_faststats(unsigned long); | 769 | void ipath_get_faststats(unsigned long); |
770 | int ipath_wait_linkstate(struct ipath_devdata *, u32, int); | ||
770 | int ipath_set_linkstate(struct ipath_devdata *, u8); | 771 | int ipath_set_linkstate(struct ipath_devdata *, u8); |
771 | int ipath_set_mtu(struct ipath_devdata *, u16); | 772 | int ipath_set_mtu(struct ipath_devdata *, u16); |
772 | int ipath_set_lid(struct ipath_devdata *, u32, u8); | 773 | int ipath_set_lid(struct ipath_devdata *, u32, u8); |
diff --git a/drivers/infiniband/hw/ipath/ipath_mad.c b/drivers/infiniband/hw/ipath/ipath_mad.c index d98d5f103700..b34b91d3723a 100644 --- a/drivers/infiniband/hw/ipath/ipath_mad.c +++ b/drivers/infiniband/hw/ipath/ipath_mad.c | |||
@@ -555,10 +555,7 @@ static int recv_subn_set_portinfo(struct ib_smp *smp, | |||
555 | /* FALLTHROUGH */ | 555 | /* FALLTHROUGH */ |
556 | case IB_PORT_DOWN: | 556 | case IB_PORT_DOWN: |
557 | if (lstate == 0) | 557 | if (lstate == 0) |
558 | if (get_linkdowndefaultstate(dd)) | 558 | lstate = IPATH_IB_LINKDOWN_ONLY; |
559 | lstate = IPATH_IB_LINKDOWN_SLEEP; | ||
560 | else | ||
561 | lstate = IPATH_IB_LINKDOWN; | ||
562 | else if (lstate == 1) | 559 | else if (lstate == 1) |
563 | lstate = IPATH_IB_LINKDOWN_SLEEP; | 560 | lstate = IPATH_IB_LINKDOWN_SLEEP; |
564 | else if (lstate == 2) | 561 | else if (lstate == 2) |
@@ -568,6 +565,8 @@ static int recv_subn_set_portinfo(struct ib_smp *smp, | |||
568 | else | 565 | else |
569 | goto err; | 566 | goto err; |
570 | ipath_set_linkstate(dd, lstate); | 567 | ipath_set_linkstate(dd, lstate); |
568 | ipath_wait_linkstate(dd, IPATH_LINKINIT | IPATH_LINKARMED | | ||
569 | IPATH_LINKACTIVE, 1000); | ||
571 | break; | 570 | break; |
572 | case IB_PORT_ARMED: | 571 | case IB_PORT_ARMED: |
573 | ipath_set_linkstate(dd, IPATH_IB_LINKARM); | 572 | ipath_set_linkstate(dd, IPATH_IB_LINKARM); |
diff --git a/drivers/infiniband/hw/ipath/ipath_qp.c b/drivers/infiniband/hw/ipath/ipath_qp.c index 80dc623cee40..087ed3166479 100644 --- a/drivers/infiniband/hw/ipath/ipath_qp.c +++ b/drivers/infiniband/hw/ipath/ipath_qp.c | |||
@@ -329,8 +329,9 @@ struct ipath_qp *ipath_lookup_qpn(struct ipath_qp_table *qpt, u32 qpn) | |||
329 | /** | 329 | /** |
330 | * ipath_reset_qp - initialize the QP state to the reset state | 330 | * ipath_reset_qp - initialize the QP state to the reset state |
331 | * @qp: the QP to reset | 331 | * @qp: the QP to reset |
332 | * @type: the QP type | ||
332 | */ | 333 | */ |
333 | static void ipath_reset_qp(struct ipath_qp *qp) | 334 | static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type) |
334 | { | 335 | { |
335 | qp->remote_qpn = 0; | 336 | qp->remote_qpn = 0; |
336 | qp->qkey = 0; | 337 | qp->qkey = 0; |
@@ -342,7 +343,7 @@ static void ipath_reset_qp(struct ipath_qp *qp) | |||
342 | qp->s_psn = 0; | 343 | qp->s_psn = 0; |
343 | qp->r_psn = 0; | 344 | qp->r_psn = 0; |
344 | qp->r_msn = 0; | 345 | qp->r_msn = 0; |
345 | if (qp->ibqp.qp_type == IB_QPT_RC) { | 346 | if (type == IB_QPT_RC) { |
346 | qp->s_state = IB_OPCODE_RC_SEND_LAST; | 347 | qp->s_state = IB_OPCODE_RC_SEND_LAST; |
347 | qp->r_state = IB_OPCODE_RC_SEND_LAST; | 348 | qp->r_state = IB_OPCODE_RC_SEND_LAST; |
348 | } else { | 349 | } else { |
@@ -414,7 +415,7 @@ int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) | |||
414 | wc.wr_id = qp->r_wr_id; | 415 | wc.wr_id = qp->r_wr_id; |
415 | wc.opcode = IB_WC_RECV; | 416 | wc.opcode = IB_WC_RECV; |
416 | wc.status = err; | 417 | wc.status = err; |
417 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 1); | 418 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1); |
418 | } | 419 | } |
419 | wc.status = IB_WC_WR_FLUSH_ERR; | 420 | wc.status = IB_WC_WR_FLUSH_ERR; |
420 | 421 | ||
@@ -534,7 +535,7 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
534 | 535 | ||
535 | switch (new_state) { | 536 | switch (new_state) { |
536 | case IB_QPS_RESET: | 537 | case IB_QPS_RESET: |
537 | ipath_reset_qp(qp); | 538 | ipath_reset_qp(qp, ibqp->qp_type); |
538 | break; | 539 | break; |
539 | 540 | ||
540 | case IB_QPS_ERR: | 541 | case IB_QPS_ERR: |
@@ -647,7 +648,7 @@ int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
647 | attr->port_num = 1; | 648 | attr->port_num = 1; |
648 | attr->timeout = qp->timeout; | 649 | attr->timeout = qp->timeout; |
649 | attr->retry_cnt = qp->s_retry_cnt; | 650 | attr->retry_cnt = qp->s_retry_cnt; |
650 | attr->rnr_retry = qp->s_rnr_retry; | 651 | attr->rnr_retry = qp->s_rnr_retry_cnt; |
651 | attr->alt_port_num = 0; | 652 | attr->alt_port_num = 0; |
652 | attr->alt_timeout = 0; | 653 | attr->alt_timeout = 0; |
653 | 654 | ||
@@ -839,7 +840,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd, | |||
839 | goto bail_qp; | 840 | goto bail_qp; |
840 | } | 841 | } |
841 | qp->ip = NULL; | 842 | qp->ip = NULL; |
842 | ipath_reset_qp(qp); | 843 | ipath_reset_qp(qp, init_attr->qp_type); |
843 | break; | 844 | break; |
844 | 845 | ||
845 | default: | 846 | default: |
diff --git a/drivers/infiniband/hw/ipath/ipath_rc.c b/drivers/infiniband/hw/ipath/ipath_rc.c index 459e46e2c016..40f3e37d7adc 100644 --- a/drivers/infiniband/hw/ipath/ipath_rc.c +++ b/drivers/infiniband/hw/ipath/ipath_rc.c | |||
@@ -1196,6 +1196,10 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1196 | list_move_tail(&qp->timerwait, | 1196 | list_move_tail(&qp->timerwait, |
1197 | &dev->pending[dev->pending_index]); | 1197 | &dev->pending[dev->pending_index]); |
1198 | spin_unlock(&dev->pending_lock); | 1198 | spin_unlock(&dev->pending_lock); |
1199 | |||
1200 | if (opcode == OP(RDMA_READ_RESPONSE_MIDDLE)) | ||
1201 | qp->s_retry = qp->s_retry_cnt; | ||
1202 | |||
1199 | /* | 1203 | /* |
1200 | * Update the RDMA receive state but do the copy w/o | 1204 | * Update the RDMA receive state but do the copy w/o |
1201 | * holding the locks and blocking interrupts. | 1205 | * holding the locks and blocking interrupts. |
diff --git a/drivers/infiniband/hw/ipath/ipath_registers.h b/drivers/infiniband/hw/ipath/ipath_registers.h index 6d2a17f9c1da..92ad73a7fff0 100644 --- a/drivers/infiniband/hw/ipath/ipath_registers.h +++ b/drivers/infiniband/hw/ipath/ipath_registers.h | |||
@@ -185,7 +185,7 @@ | |||
185 | #define INFINIPATH_IBCC_LINKINITCMD_SLEEP 3 | 185 | #define INFINIPATH_IBCC_LINKINITCMD_SLEEP 3 |
186 | #define INFINIPATH_IBCC_LINKINITCMD_SHIFT 16 | 186 | #define INFINIPATH_IBCC_LINKINITCMD_SHIFT 16 |
187 | #define INFINIPATH_IBCC_LINKCMD_MASK 0x3ULL | 187 | #define INFINIPATH_IBCC_LINKCMD_MASK 0x3ULL |
188 | #define INFINIPATH_IBCC_LINKCMD_INIT 1 /* move to 0x11 */ | 188 | #define INFINIPATH_IBCC_LINKCMD_DOWN 1 /* move to 0x11 */ |
189 | #define INFINIPATH_IBCC_LINKCMD_ARMED 2 /* move to 0x21 */ | 189 | #define INFINIPATH_IBCC_LINKCMD_ARMED 2 /* move to 0x21 */ |
190 | #define INFINIPATH_IBCC_LINKCMD_ACTIVE 3 /* move to 0x31 */ | 190 | #define INFINIPATH_IBCC_LINKCMD_ACTIVE 3 /* move to 0x31 */ |
191 | #define INFINIPATH_IBCC_LINKCMD_SHIFT 18 | 191 | #define INFINIPATH_IBCC_LINKCMD_SHIFT 18 |
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c index 7f8853b44ee1..b2112f5a422f 100644 --- a/drivers/infiniband/hw/nes/nes.c +++ b/drivers/infiniband/hw/nes/nes.c | |||
@@ -567,12 +567,12 @@ static int __devinit nes_probe(struct pci_dev *pcidev, const struct pci_device_i | |||
567 | 567 | ||
568 | /* Init the adapter */ | 568 | /* Init the adapter */ |
569 | nesdev->nesadapter = nes_init_adapter(nesdev, hw_rev); | 569 | nesdev->nesadapter = nes_init_adapter(nesdev, hw_rev); |
570 | nesdev->nesadapter->et_rx_coalesce_usecs_irq = interrupt_mod_interval; | ||
571 | if (!nesdev->nesadapter) { | 570 | if (!nesdev->nesadapter) { |
572 | printk(KERN_ERR PFX "Unable to initialize adapter.\n"); | 571 | printk(KERN_ERR PFX "Unable to initialize adapter.\n"); |
573 | ret = -ENOMEM; | 572 | ret = -ENOMEM; |
574 | goto bail5; | 573 | goto bail5; |
575 | } | 574 | } |
575 | nesdev->nesadapter->et_rx_coalesce_usecs_irq = interrupt_mod_interval; | ||
576 | 576 | ||
577 | /* nesdev->base_doorbell_index = | 577 | /* nesdev->base_doorbell_index = |
578 | nesdev->nesadapter->pd_config_base[PCI_FUNC(nesdev->pcidev->devfn)]; */ | 578 | nesdev->nesadapter->pd_config_base[PCI_FUNC(nesdev->pcidev->devfn)]; */ |
diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h index fd57e8a1582f..a48b288618ec 100644 --- a/drivers/infiniband/hw/nes/nes.h +++ b/drivers/infiniband/hw/nes/nes.h | |||
@@ -285,6 +285,21 @@ struct nes_device { | |||
285 | }; | 285 | }; |
286 | 286 | ||
287 | 287 | ||
288 | static inline __le32 get_crc_value(struct nes_v4_quad *nes_quad) | ||
289 | { | ||
290 | u32 crc_value; | ||
291 | crc_value = crc32c(~0, (void *)nes_quad, sizeof (struct nes_v4_quad)); | ||
292 | |||
293 | /* | ||
294 | * With commit ef19454b ("[LIB] crc32c: Keep intermediate crc | ||
295 | * state in cpu order"), behavior of crc32c changes on | ||
296 | * big-endian platforms. Our algorithm expects the previous | ||
297 | * behavior; otherwise we have RDMA connection establishment | ||
298 | * issue on big-endian. | ||
299 | */ | ||
300 | return cpu_to_le32(crc_value); | ||
301 | } | ||
302 | |||
288 | static inline void | 303 | static inline void |
289 | set_wqe_64bit_value(__le32 *wqe_words, u32 index, u64 value) | 304 | set_wqe_64bit_value(__le32 *wqe_words, u32 index, u64 value) |
290 | { | 305 | { |
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index bd5cfeaac203..39adb267fb15 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c | |||
@@ -370,11 +370,11 @@ int schedule_nes_timer(struct nes_cm_node *cm_node, struct sk_buff *skb, | |||
370 | int ret = 0; | 370 | int ret = 0; |
371 | u32 was_timer_set; | 371 | u32 was_timer_set; |
372 | 372 | ||
373 | if (!cm_node) | ||
374 | return -EINVAL; | ||
373 | new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC); | 375 | new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC); |
374 | if (!new_send) | 376 | if (!new_send) |
375 | return -1; | 377 | return -1; |
376 | if (!cm_node) | ||
377 | return -EINVAL; | ||
378 | 378 | ||
379 | /* new_send->timetosend = currenttime */ | 379 | /* new_send->timetosend = currenttime */ |
380 | new_send->retrycount = NES_DEFAULT_RETRYS; | 380 | new_send->retrycount = NES_DEFAULT_RETRYS; |
@@ -947,6 +947,7 @@ static int mini_cm_dec_refcnt_listen(struct nes_cm_core *cm_core, | |||
947 | nes_debug(NES_DBG_CM, "destroying listener (%p)\n", listener); | 947 | nes_debug(NES_DBG_CM, "destroying listener (%p)\n", listener); |
948 | 948 | ||
949 | kfree(listener); | 949 | kfree(listener); |
950 | listener = NULL; | ||
950 | ret = 0; | 951 | ret = 0; |
951 | cm_listens_destroyed++; | 952 | cm_listens_destroyed++; |
952 | } else { | 953 | } else { |
@@ -2319,6 +2320,7 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
2319 | struct iw_cm_event cm_event; | 2320 | struct iw_cm_event cm_event; |
2320 | struct nes_hw_qp_wqe *wqe; | 2321 | struct nes_hw_qp_wqe *wqe; |
2321 | struct nes_v4_quad nes_quad; | 2322 | struct nes_v4_quad nes_quad; |
2323 | u32 crc_value; | ||
2322 | int ret; | 2324 | int ret; |
2323 | 2325 | ||
2324 | ibqp = nes_get_qp(cm_id->device, conn_param->qpn); | 2326 | ibqp = nes_get_qp(cm_id->device, conn_param->qpn); |
@@ -2435,8 +2437,8 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) | |||
2435 | nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port; | 2437 | nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port; |
2436 | 2438 | ||
2437 | /* Produce hash key */ | 2439 | /* Produce hash key */ |
2438 | nesqp->hte_index = cpu_to_be32( | 2440 | crc_value = get_crc_value(&nes_quad); |
2439 | crc32c(~0, (void *)&nes_quad, sizeof(nes_quad)) ^ 0xffffffff); | 2441 | nesqp->hte_index = cpu_to_be32(crc_value ^ 0xffffffff); |
2440 | nes_debug(NES_DBG_CM, "HTE Index = 0x%08X, CRC = 0x%08X\n", | 2442 | nes_debug(NES_DBG_CM, "HTE Index = 0x%08X, CRC = 0x%08X\n", |
2441 | nesqp->hte_index, nesqp->hte_index & adapter->hte_index_mask); | 2443 | nesqp->hte_index, nesqp->hte_index & adapter->hte_index_mask); |
2442 | 2444 | ||
@@ -2750,6 +2752,7 @@ void cm_event_connected(struct nes_cm_event *event) | |||
2750 | struct iw_cm_event cm_event; | 2752 | struct iw_cm_event cm_event; |
2751 | struct nes_hw_qp_wqe *wqe; | 2753 | struct nes_hw_qp_wqe *wqe; |
2752 | struct nes_v4_quad nes_quad; | 2754 | struct nes_v4_quad nes_quad; |
2755 | u32 crc_value; | ||
2753 | int ret; | 2756 | int ret; |
2754 | 2757 | ||
2755 | /* get all our handles */ | 2758 | /* get all our handles */ |
@@ -2827,8 +2830,8 @@ void cm_event_connected(struct nes_cm_event *event) | |||
2827 | nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port; | 2830 | nes_quad.TcpPorts[1] = cm_id->local_addr.sin_port; |
2828 | 2831 | ||
2829 | /* Produce hash key */ | 2832 | /* Produce hash key */ |
2830 | nesqp->hte_index = cpu_to_be32( | 2833 | crc_value = get_crc_value(&nes_quad); |
2831 | crc32c(~0, (void *)&nes_quad, sizeof(nes_quad)) ^ 0xffffffff); | 2834 | nesqp->hte_index = cpu_to_be32(crc_value ^ 0xffffffff); |
2832 | nes_debug(NES_DBG_CM, "HTE Index = 0x%08X, After CRC = 0x%08X\n", | 2835 | nes_debug(NES_DBG_CM, "HTE Index = 0x%08X, After CRC = 0x%08X\n", |
2833 | nesqp->hte_index, nesqp->hte_index & nesadapter->hte_index_mask); | 2836 | nesqp->hte_index, nesqp->hte_index & nesadapter->hte_index_mask); |
2834 | 2837 | ||
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 7c4c0fbf0abd..49e53e4c1ebe 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -156,15 +156,14 @@ static void nes_nic_tune_timer(struct nes_device *nesdev) | |||
156 | 156 | ||
157 | spin_lock_irqsave(&nesadapter->periodic_timer_lock, flags); | 157 | spin_lock_irqsave(&nesadapter->periodic_timer_lock, flags); |
158 | 158 | ||
159 | if (shared_timer->cq_count_old < cq_count) { | 159 | if (shared_timer->cq_count_old <= cq_count) |
160 | if (cq_count > shared_timer->threshold_low) | 160 | shared_timer->cq_direction_downward = 0; |
161 | shared_timer->cq_direction_downward=0; | 161 | else |
162 | } | ||
163 | if (shared_timer->cq_count_old >= cq_count) | ||
164 | shared_timer->cq_direction_downward++; | 162 | shared_timer->cq_direction_downward++; |
165 | shared_timer->cq_count_old = cq_count; | 163 | shared_timer->cq_count_old = cq_count; |
166 | if (shared_timer->cq_direction_downward > NES_NIC_CQ_DOWNWARD_TREND) { | 164 | if (shared_timer->cq_direction_downward > NES_NIC_CQ_DOWNWARD_TREND) { |
167 | if (cq_count <= shared_timer->threshold_low) { | 165 | if (cq_count <= shared_timer->threshold_low && |
166 | shared_timer->threshold_low > 4) { | ||
168 | shared_timer->threshold_low = shared_timer->threshold_low/2; | 167 | shared_timer->threshold_low = shared_timer->threshold_low/2; |
169 | shared_timer->cq_direction_downward=0; | 168 | shared_timer->cq_direction_downward=0; |
170 | nesdev->currcq_count = 0; | 169 | nesdev->currcq_count = 0; |
@@ -1728,7 +1727,6 @@ int nes_napi_isr(struct nes_device *nesdev) | |||
1728 | nesdev->int_req &= ~NES_INT_TIMER; | 1727 | nesdev->int_req &= ~NES_INT_TIMER; |
1729 | nes_write32(nesdev->regs+NES_INTF_INT_MASK, ~(nesdev->intf_int_req)); | 1728 | nes_write32(nesdev->regs+NES_INTF_INT_MASK, ~(nesdev->intf_int_req)); |
1730 | nes_write32(nesdev->regs+NES_INT_MASK, ~nesdev->int_req); | 1729 | nes_write32(nesdev->regs+NES_INT_MASK, ~nesdev->int_req); |
1731 | nesadapter->tune_timer.timer_in_use_old = 0; | ||
1732 | } | 1730 | } |
1733 | nesdev->deepcq_count = 0; | 1731 | nesdev->deepcq_count = 0; |
1734 | return 1; | 1732 | return 1; |
@@ -1867,7 +1865,6 @@ void nes_dpc(unsigned long param) | |||
1867 | nesdev->int_req &= ~NES_INT_TIMER; | 1865 | nesdev->int_req &= ~NES_INT_TIMER; |
1868 | nes_write32(nesdev->regs + NES_INTF_INT_MASK, ~(nesdev->intf_int_req)); | 1866 | nes_write32(nesdev->regs + NES_INTF_INT_MASK, ~(nesdev->intf_int_req)); |
1869 | nes_write32(nesdev->regs+NES_INT_MASK, ~nesdev->int_req); | 1867 | nes_write32(nesdev->regs+NES_INT_MASK, ~nesdev->int_req); |
1870 | nesdev->nesadapter->tune_timer.timer_in_use_old = 0; | ||
1871 | } else { | 1868 | } else { |
1872 | nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff|(~nesdev->int_req)); | 1869 | nes_write32(nesdev->regs+NES_INT_MASK, 0x0000ffff|(~nesdev->int_req)); |
1873 | } | 1870 | } |
diff --git a/drivers/infiniband/hw/nes/nes_hw.h b/drivers/infiniband/hw/nes/nes_hw.h index 1e10df550c9e..b7e2844f096b 100644 --- a/drivers/infiniband/hw/nes/nes_hw.h +++ b/drivers/infiniband/hw/nes/nes_hw.h | |||
@@ -962,7 +962,7 @@ struct nes_arp_entry { | |||
962 | #define DEFAULT_JUMBO_NES_QL_LOW 12 | 962 | #define DEFAULT_JUMBO_NES_QL_LOW 12 |
963 | #define DEFAULT_JUMBO_NES_QL_TARGET 40 | 963 | #define DEFAULT_JUMBO_NES_QL_TARGET 40 |
964 | #define DEFAULT_JUMBO_NES_QL_HIGH 128 | 964 | #define DEFAULT_JUMBO_NES_QL_HIGH 128 |
965 | #define NES_NIC_CQ_DOWNWARD_TREND 8 | 965 | #define NES_NIC_CQ_DOWNWARD_TREND 16 |
966 | 966 | ||
967 | struct nes_hw_tune_timer { | 967 | struct nes_hw_tune_timer { |
968 | //u16 cq_count; | 968 | //u16 cq_count; |
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c index 4dafbe16e82a..a651e9d9f0ef 100644 --- a/drivers/infiniband/hw/nes/nes_verbs.c +++ b/drivers/infiniband/hw/nes/nes_verbs.c | |||
@@ -929,7 +929,7 @@ static struct ib_pd *nes_alloc_pd(struct ib_device *ibdev, | |||
929 | NES_MAX_USER_DB_REGIONS, nesucontext->first_free_db); | 929 | NES_MAX_USER_DB_REGIONS, nesucontext->first_free_db); |
930 | nes_debug(NES_DBG_PD, "find_first_zero_biton doorbells returned %u, mapping pd_id %u.\n", | 930 | nes_debug(NES_DBG_PD, "find_first_zero_biton doorbells returned %u, mapping pd_id %u.\n", |
931 | nespd->mmap_db_index, nespd->pd_id); | 931 | nespd->mmap_db_index, nespd->pd_id); |
932 | if (nespd->mmap_db_index > NES_MAX_USER_DB_REGIONS) { | 932 | if (nespd->mmap_db_index >= NES_MAX_USER_DB_REGIONS) { |
933 | nes_debug(NES_DBG_PD, "mmap_db_index > MAX\n"); | 933 | nes_debug(NES_DBG_PD, "mmap_db_index > MAX\n"); |
934 | nes_free_resource(nesadapter, nesadapter->allocated_pds, pd_num); | 934 | nes_free_resource(nesadapter, nesadapter->allocated_pds, pd_num); |
935 | kfree(nespd); | 935 | kfree(nespd); |
@@ -1327,7 +1327,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, | |||
1327 | (long long unsigned int)req.user_wqe_buffers); | 1327 | (long long unsigned int)req.user_wqe_buffers); |
1328 | nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num); | 1328 | nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num); |
1329 | kfree(nesqp->allocated_buffer); | 1329 | kfree(nesqp->allocated_buffer); |
1330 | return ERR_PTR(-ENOMEM); | 1330 | return ERR_PTR(-EFAULT); |
1331 | } | 1331 | } |
1332 | } | 1332 | } |
1333 | 1333 | ||
@@ -1674,6 +1674,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries, | |||
1674 | } | 1674 | } |
1675 | nes_debug(NES_DBG_CQ, "CQ Virtual Address = %08lX, size = %u.\n", | 1675 | nes_debug(NES_DBG_CQ, "CQ Virtual Address = %08lX, size = %u.\n", |
1676 | (unsigned long)req.user_cq_buffer, entries); | 1676 | (unsigned long)req.user_cq_buffer, entries); |
1677 | err = 1; | ||
1677 | list_for_each_entry(nespbl, &nes_ucontext->cq_reg_mem_list, list) { | 1678 | list_for_each_entry(nespbl, &nes_ucontext->cq_reg_mem_list, list) { |
1678 | if (nespbl->user_base == (unsigned long )req.user_cq_buffer) { | 1679 | if (nespbl->user_base == (unsigned long )req.user_cq_buffer) { |
1679 | list_del(&nespbl->list); | 1680 | list_del(&nespbl->list); |
@@ -1686,7 +1687,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries, | |||
1686 | if (err) { | 1687 | if (err) { |
1687 | nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num); | 1688 | nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num); |
1688 | kfree(nescq); | 1689 | kfree(nescq); |
1689 | return ERR_PTR(err); | 1690 | return ERR_PTR(-EFAULT); |
1690 | } | 1691 | } |
1691 | 1692 | ||
1692 | pbl_entries = nespbl->pbl_size >> 3; | 1693 | pbl_entries = nespbl->pbl_size >> 3; |
@@ -1831,9 +1832,6 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries, | |||
1831 | spin_unlock_irqrestore(&nesdev->cqp.lock, flags); | 1832 | spin_unlock_irqrestore(&nesdev->cqp.lock, flags); |
1832 | } | 1833 | } |
1833 | } | 1834 | } |
1834 | nes_debug(NES_DBG_CQ, "iWARP CQ%u create timeout expired, major code = 0x%04X," | ||
1835 | " minor code = 0x%04X\n", | ||
1836 | nescq->hw_cq.cq_number, cqp_request->major_code, cqp_request->minor_code); | ||
1837 | if (!context) | 1835 | if (!context) |
1838 | pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem, | 1836 | pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem, |
1839 | nescq->hw_cq.cq_pbase); | 1837 | nescq->hw_cq.cq_pbase); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index 52b1bebfa744..2490b2d79dbb 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <net/icmp.h> | 38 | #include <net/icmp.h> |
39 | #include <linux/icmpv6.h> | 39 | #include <linux/icmpv6.h> |
40 | #include <linux/delay.h> | 40 | #include <linux/delay.h> |
41 | #include <linux/vmalloc.h> | ||
41 | 42 | ||
42 | #include "ipoib.h" | 43 | #include "ipoib.h" |
43 | 44 | ||
@@ -637,6 +638,7 @@ static inline int post_send(struct ipoib_dev_priv *priv, | |||
637 | priv->tx_sge[0].addr = addr; | 638 | priv->tx_sge[0].addr = addr; |
638 | priv->tx_sge[0].length = len; | 639 | priv->tx_sge[0].length = len; |
639 | 640 | ||
641 | priv->tx_wr.num_sge = 1; | ||
640 | priv->tx_wr.wr_id = wr_id | IPOIB_OP_CM; | 642 | priv->tx_wr.wr_id = wr_id | IPOIB_OP_CM; |
641 | 643 | ||
642 | return ib_post_send(tx->qp, &priv->tx_wr, &bad_wr); | 644 | return ib_post_send(tx->qp, &priv->tx_wr, &bad_wr); |
@@ -1030,13 +1032,13 @@ static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn, | |||
1030 | struct ipoib_dev_priv *priv = netdev_priv(p->dev); | 1032 | struct ipoib_dev_priv *priv = netdev_priv(p->dev); |
1031 | int ret; | 1033 | int ret; |
1032 | 1034 | ||
1033 | p->tx_ring = kzalloc(ipoib_sendq_size * sizeof *p->tx_ring, | 1035 | p->tx_ring = vmalloc(ipoib_sendq_size * sizeof *p->tx_ring); |
1034 | GFP_KERNEL); | ||
1035 | if (!p->tx_ring) { | 1036 | if (!p->tx_ring) { |
1036 | ipoib_warn(priv, "failed to allocate tx ring\n"); | 1037 | ipoib_warn(priv, "failed to allocate tx ring\n"); |
1037 | ret = -ENOMEM; | 1038 | ret = -ENOMEM; |
1038 | goto err_tx; | 1039 | goto err_tx; |
1039 | } | 1040 | } |
1041 | memset(p->tx_ring, 0, ipoib_sendq_size * sizeof *p->tx_ring); | ||
1040 | 1042 | ||
1041 | p->qp = ipoib_cm_create_tx_qp(p->dev, p); | 1043 | p->qp = ipoib_cm_create_tx_qp(p->dev, p); |
1042 | if (IS_ERR(p->qp)) { | 1044 | if (IS_ERR(p->qp)) { |
@@ -1077,6 +1079,7 @@ err_id: | |||
1077 | ib_destroy_qp(p->qp); | 1079 | ib_destroy_qp(p->qp); |
1078 | err_qp: | 1080 | err_qp: |
1079 | p->qp = NULL; | 1081 | p->qp = NULL; |
1082 | vfree(p->tx_ring); | ||
1080 | err_tx: | 1083 | err_tx: |
1081 | return ret; | 1084 | return ret; |
1082 | } | 1085 | } |
@@ -1127,7 +1130,7 @@ timeout: | |||
1127 | if (p->qp) | 1130 | if (p->qp) |
1128 | ib_destroy_qp(p->qp); | 1131 | ib_destroy_qp(p->qp); |
1129 | 1132 | ||
1130 | kfree(p->tx_ring); | 1133 | vfree(p->tx_ring); |
1131 | kfree(p); | 1134 | kfree(p); |
1132 | } | 1135 | } |
1133 | 1136 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index f96477a8ca5a..57282048865c 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/init.h> | 41 | #include <linux/init.h> |
42 | #include <linux/slab.h> | 42 | #include <linux/slab.h> |
43 | #include <linux/kernel.h> | 43 | #include <linux/kernel.h> |
44 | #include <linux/vmalloc.h> | ||
44 | 45 | ||
45 | #include <linux/if_arp.h> /* For ARPHRD_xxx */ | 46 | #include <linux/if_arp.h> /* For ARPHRD_xxx */ |
46 | 47 | ||
@@ -887,13 +888,13 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) | |||
887 | goto out; | 888 | goto out; |
888 | } | 889 | } |
889 | 890 | ||
890 | priv->tx_ring = kzalloc(ipoib_sendq_size * sizeof *priv->tx_ring, | 891 | priv->tx_ring = vmalloc(ipoib_sendq_size * sizeof *priv->tx_ring); |
891 | GFP_KERNEL); | ||
892 | if (!priv->tx_ring) { | 892 | if (!priv->tx_ring) { |
893 | printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n", | 893 | printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n", |
894 | ca->name, ipoib_sendq_size); | 894 | ca->name, ipoib_sendq_size); |
895 | goto out_rx_ring_cleanup; | 895 | goto out_rx_ring_cleanup; |
896 | } | 896 | } |
897 | memset(priv->tx_ring, 0, ipoib_sendq_size * sizeof *priv->tx_ring); | ||
897 | 898 | ||
898 | /* priv->tx_head, tx_tail & tx_outstanding are already 0 */ | 899 | /* priv->tx_head, tx_tail & tx_outstanding are already 0 */ |
899 | 900 | ||
@@ -903,7 +904,7 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) | |||
903 | return 0; | 904 | return 0; |
904 | 905 | ||
905 | out_tx_ring_cleanup: | 906 | out_tx_ring_cleanup: |
906 | kfree(priv->tx_ring); | 907 | vfree(priv->tx_ring); |
907 | 908 | ||
908 | out_rx_ring_cleanup: | 909 | out_rx_ring_cleanup: |
909 | kfree(priv->rx_ring); | 910 | kfree(priv->rx_ring); |
@@ -928,7 +929,7 @@ void ipoib_dev_cleanup(struct net_device *dev) | |||
928 | ipoib_ib_dev_cleanup(dev); | 929 | ipoib_ib_dev_cleanup(dev); |
929 | 930 | ||
930 | kfree(priv->rx_ring); | 931 | kfree(priv->rx_ring); |
931 | kfree(priv->tx_ring); | 932 | vfree(priv->tx_ring); |
932 | 933 | ||
933 | priv->rx_ring = NULL; | 934 | priv->rx_ring = NULL; |
934 | priv->tx_ring = NULL; | 935 | priv->tx_ring = NULL; |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 2628339e3a99..31a53c5bcb13 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
@@ -650,7 +650,7 @@ void ipoib_mcast_send(struct net_device *dev, void *mgid, struct sk_buff *skb) | |||
650 | */ | 650 | */ |
651 | spin_lock(&priv->lock); | 651 | spin_lock(&priv->lock); |
652 | 652 | ||
653 | if (!test_bit(IPOIB_MCAST_STARTED, &priv->flags) || | 653 | if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags) || |
654 | !priv->broadcast || | 654 | !priv->broadcast || |
655 | !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) { | 655 | !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) { |
656 | ++dev->stats.tx_dropped; | 656 | ++dev->stats.tx_dropped; |
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index 714b8db02b29..993f0a8ff28f 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c | |||
@@ -237,36 +237,32 @@ static int iser_free_ib_conn_res(struct iser_conn *ib_conn) | |||
237 | static | 237 | static |
238 | struct iser_device *iser_device_find_by_ib_device(struct rdma_cm_id *cma_id) | 238 | struct iser_device *iser_device_find_by_ib_device(struct rdma_cm_id *cma_id) |
239 | { | 239 | { |
240 | struct list_head *p_list; | 240 | struct iser_device *device; |
241 | struct iser_device *device = NULL; | ||
242 | 241 | ||
243 | mutex_lock(&ig.device_list_mutex); | 242 | mutex_lock(&ig.device_list_mutex); |
244 | 243 | ||
245 | p_list = ig.device_list.next; | 244 | list_for_each_entry(device, &ig.device_list, ig_list) |
246 | while (p_list != &ig.device_list) { | ||
247 | device = list_entry(p_list, struct iser_device, ig_list); | ||
248 | /* find if there's a match using the node GUID */ | 245 | /* find if there's a match using the node GUID */ |
249 | if (device->ib_device->node_guid == cma_id->device->node_guid) | 246 | if (device->ib_device->node_guid == cma_id->device->node_guid) |
250 | break; | 247 | goto inc_refcnt; |
251 | } | ||
252 | 248 | ||
253 | if (device == NULL) { | 249 | device = kzalloc(sizeof *device, GFP_KERNEL); |
254 | device = kzalloc(sizeof *device, GFP_KERNEL); | 250 | if (device == NULL) |
255 | if (device == NULL) | 251 | goto out; |
256 | goto out; | 252 | |
257 | /* assign this device to the device */ | 253 | /* assign this device to the device */ |
258 | device->ib_device = cma_id->device; | 254 | device->ib_device = cma_id->device; |
259 | /* init the device and link it into ig device list */ | 255 | /* init the device and link it into ig device list */ |
260 | if (iser_create_device_ib_res(device)) { | 256 | if (iser_create_device_ib_res(device)) { |
261 | kfree(device); | 257 | kfree(device); |
262 | device = NULL; | 258 | device = NULL; |
263 | goto out; | 259 | goto out; |
264 | } | ||
265 | list_add(&device->ig_list, &ig.device_list); | ||
266 | } | 260 | } |
267 | out: | 261 | list_add(&device->ig_list, &ig.device_list); |
268 | BUG_ON(device == NULL); | 262 | |
263 | inc_refcnt: | ||
269 | device->refcount++; | 264 | device->refcount++; |
265 | out: | ||
270 | mutex_unlock(&ig.device_list_mutex); | 266 | mutex_unlock(&ig.device_list_mutex); |
271 | return device; | 267 | return device; |
272 | } | 268 | } |
@@ -372,6 +368,12 @@ static void iser_addr_handler(struct rdma_cm_id *cma_id) | |||
372 | int ret; | 368 | int ret; |
373 | 369 | ||
374 | device = iser_device_find_by_ib_device(cma_id); | 370 | device = iser_device_find_by_ib_device(cma_id); |
371 | if (!device) { | ||
372 | iser_err("device lookup/creation failed\n"); | ||
373 | iser_connect_error(cma_id); | ||
374 | return; | ||
375 | } | ||
376 | |||
375 | ib_conn = (struct iser_conn *)cma_id->context; | 377 | ib_conn = (struct iser_conn *)cma_id->context; |
376 | ib_conn->device = device; | 378 | ib_conn->device = device; |
377 | 379 | ||
@@ -380,7 +382,6 @@ static void iser_addr_handler(struct rdma_cm_id *cma_id) | |||
380 | iser_err("resolve route failed: %d\n", ret); | 382 | iser_err("resolve route failed: %d\n", ret); |
381 | iser_connect_error(cma_id); | 383 | iser_connect_error(cma_id); |
382 | } | 384 | } |
383 | return; | ||
384 | } | 385 | } |
385 | 386 | ||
386 | static void iser_route_handler(struct rdma_cm_id *cma_id) | 387 | static void iser_route_handler(struct rdma_cm_id *cma_id) |
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 8b10d9f23bef..c5263d63aca3 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
@@ -42,14 +42,14 @@ config INPUT_M68K_BEEP | |||
42 | 42 | ||
43 | config INPUT_APANEL | 43 | config INPUT_APANEL |
44 | tristate "Fujitsu Lifebook Application Panel buttons" | 44 | tristate "Fujitsu Lifebook Application Panel buttons" |
45 | depends on X86 | 45 | depends on X86 && I2C && LEDS_CLASS |
46 | select I2C_I801 | ||
47 | select INPUT_POLLDEV | 46 | select INPUT_POLLDEV |
48 | select CHECK_SIGNATURE | 47 | select CHECK_SIGNATURE |
49 | help | 48 | help |
50 | Say Y here for support of the Application Panel buttons, used on | 49 | Say Y here for support of the Application Panel buttons, used on |
51 | Fujitsu Lifebook. These are attached to the mainboard through | 50 | Fujitsu Lifebook. These are attached to the mainboard through |
52 | an SMBus interface managed by the I2C Intel ICH (i801) driver. | 51 | an SMBus interface managed by the I2C Intel ICH (i801) driver, |
52 | which you should also build for this kernel. | ||
53 | 53 | ||
54 | To compile this driver as a module, choose M here: the module will | 54 | To compile this driver as a module, choose M here: the module will |
55 | be called apanel. | 55 | be called apanel. |
diff --git a/drivers/input/serio/i8042.h b/drivers/input/serio/i8042.h index dd22d91f8b39..c972e5d03a3f 100644 --- a/drivers/input/serio/i8042.h +++ b/drivers/input/serio/i8042.h | |||
@@ -16,7 +16,7 @@ | |||
16 | 16 | ||
17 | #if defined(CONFIG_MACH_JAZZ) | 17 | #if defined(CONFIG_MACH_JAZZ) |
18 | #include "i8042-jazzio.h" | 18 | #include "i8042-jazzio.h" |
19 | #elif defined(CONFIG_SGI_IP22) | 19 | #elif defined(CONFIG_SGI_HAS_I8042) |
20 | #include "i8042-ip22io.h" | 20 | #include "i8042-ip22io.h" |
21 | #elif defined(CONFIG_PPC) | 21 | #elif defined(CONFIG_PPC) |
22 | #include "i8042-ppcio.h" | 22 | #include "i8042-ppcio.h" |
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c index aacedec4986f..827c32c16795 100644 --- a/drivers/isdn/gigaset/common.c +++ b/drivers/isdn/gigaset/common.c | |||
@@ -637,7 +637,6 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels, | |||
637 | err("maximum number of devices exceeded"); | 637 | err("maximum number of devices exceeded"); |
638 | return NULL; | 638 | return NULL; |
639 | } | 639 | } |
640 | mutex_init(&cs->mutex); | ||
641 | 640 | ||
642 | gig_dbg(DEBUG_INIT, "allocating bcs[0..%d]", channels - 1); | 641 | gig_dbg(DEBUG_INIT, "allocating bcs[0..%d]", channels - 1); |
643 | cs->bcs = kmalloc(channels * sizeof(struct bc_state), GFP_KERNEL); | 642 | cs->bcs = kmalloc(channels * sizeof(struct bc_state), GFP_KERNEL); |
@@ -898,8 +897,10 @@ int gigaset_shutdown(struct cardstate *cs) | |||
898 | { | 897 | { |
899 | mutex_lock(&cs->mutex); | 898 | mutex_lock(&cs->mutex); |
900 | 899 | ||
901 | if (!(cs->flags & VALID_MINOR)) | 900 | if (!(cs->flags & VALID_MINOR)) { |
901 | mutex_unlock(&cs->mutex); | ||
902 | return -1; | 902 | return -1; |
903 | } | ||
903 | 904 | ||
904 | cs->waiting = 1; | 905 | cs->waiting = 1; |
905 | 906 | ||
@@ -1086,6 +1087,7 @@ struct gigaset_driver *gigaset_initdriver(unsigned minor, unsigned minors, | |||
1086 | drv->cs[i].driver = drv; | 1087 | drv->cs[i].driver = drv; |
1087 | drv->cs[i].ops = drv->ops; | 1088 | drv->cs[i].ops = drv->ops; |
1088 | drv->cs[i].minor_index = i; | 1089 | drv->cs[i].minor_index = i; |
1090 | mutex_init(&drv->cs[i].mutex); | ||
1089 | } | 1091 | } |
1090 | 1092 | ||
1091 | gigaset_if_initdriver(drv, procname, devname); | 1093 | gigaset_if_initdriver(drv, procname, devname); |
diff --git a/drivers/isdn/hisax/hisax_fcpcipnp.c b/drivers/isdn/hisax/hisax_fcpcipnp.c index 7993e01f9fc5..76043dedba5b 100644 --- a/drivers/isdn/hisax/hisax_fcpcipnp.c +++ b/drivers/isdn/hisax/hisax_fcpcipnp.c | |||
@@ -725,23 +725,6 @@ static int __devinit fcpcipnp_setup(struct fritz_adapter *adapter) | |||
725 | 725 | ||
726 | switch (adapter->type) { | 726 | switch (adapter->type) { |
727 | case AVM_FRITZ_PCIV2: | 727 | case AVM_FRITZ_PCIV2: |
728 | retval = request_irq(adapter->irq, fcpci2_irq, IRQF_SHARED, | ||
729 | "fcpcipnp", adapter); | ||
730 | break; | ||
731 | case AVM_FRITZ_PCI: | ||
732 | retval = request_irq(adapter->irq, fcpci_irq, IRQF_SHARED, | ||
733 | "fcpcipnp", adapter); | ||
734 | break; | ||
735 | case AVM_FRITZ_PNP: | ||
736 | retval = request_irq(adapter->irq, fcpci_irq, 0, | ||
737 | "fcpcipnp", adapter); | ||
738 | break; | ||
739 | } | ||
740 | if (retval) | ||
741 | goto err_region; | ||
742 | |||
743 | switch (adapter->type) { | ||
744 | case AVM_FRITZ_PCIV2: | ||
745 | case AVM_FRITZ_PCI: | 728 | case AVM_FRITZ_PCI: |
746 | val = inl(adapter->io); | 729 | val = inl(adapter->io); |
747 | break; | 730 | break; |
@@ -796,6 +779,23 @@ static int __devinit fcpcipnp_setup(struct fritz_adapter *adapter) | |||
796 | 779 | ||
797 | switch (adapter->type) { | 780 | switch (adapter->type) { |
798 | case AVM_FRITZ_PCIV2: | 781 | case AVM_FRITZ_PCIV2: |
782 | retval = request_irq(adapter->irq, fcpci2_irq, IRQF_SHARED, | ||
783 | "fcpcipnp", adapter); | ||
784 | break; | ||
785 | case AVM_FRITZ_PCI: | ||
786 | retval = request_irq(adapter->irq, fcpci_irq, IRQF_SHARED, | ||
787 | "fcpcipnp", adapter); | ||
788 | break; | ||
789 | case AVM_FRITZ_PNP: | ||
790 | retval = request_irq(adapter->irq, fcpci_irq, 0, | ||
791 | "fcpcipnp", adapter); | ||
792 | break; | ||
793 | } | ||
794 | if (retval) | ||
795 | goto err_region; | ||
796 | |||
797 | switch (adapter->type) { | ||
798 | case AVM_FRITZ_PCIV2: | ||
799 | fcpci2_init(adapter); | 799 | fcpci2_init(adapter); |
800 | isacsx_setup(&adapter->isac); | 800 | isacsx_setup(&adapter->isac); |
801 | break; | 801 | break; |
diff --git a/drivers/isdn/i4l/isdn_ttyfax.c b/drivers/isdn/i4l/isdn_ttyfax.c index f93de4a30355..78f7660c1d0e 100644 --- a/drivers/isdn/i4l/isdn_ttyfax.c +++ b/drivers/isdn/i4l/isdn_ttyfax.c | |||
@@ -906,7 +906,8 @@ isdn_tty_cmd_FCLASS2(char **p, modem_info * info) | |||
906 | sprintf(rs, "\r\n0-2"); | 906 | sprintf(rs, "\r\n0-2"); |
907 | isdn_tty_at_cout(rs, info); | 907 | isdn_tty_at_cout(rs, info); |
908 | } else { | 908 | } else { |
909 | if ((f->phase != ISDN_FAX_PHASE_D) || (!info->faxonline & 1)) | 909 | if ((f->phase != ISDN_FAX_PHASE_D) || |
910 | (!(info->faxonline & 1))) | ||
910 | PARSE_ERROR1; | 911 | PARSE_ERROR1; |
911 | par = isdn_getnum(p); | 912 | par = isdn_getnum(p); |
912 | if ((par < 0) || (par > 2)) | 913 | if ((par < 0) || (par > 2)) |
diff --git a/drivers/isdn/isdnloop/isdnloop.c b/drivers/isdn/isdnloop/isdnloop.c index 655ef9a3f4df..a335c85a736e 100644 --- a/drivers/isdn/isdnloop/isdnloop.c +++ b/drivers/isdn/isdnloop/isdnloop.c | |||
@@ -1289,7 +1289,7 @@ isdnloop_command(isdn_ctrl * c, isdnloop_card * card) | |||
1289 | } | 1289 | } |
1290 | break; | 1290 | break; |
1291 | case ISDN_CMD_CLREAZ: | 1291 | case ISDN_CMD_CLREAZ: |
1292 | if (!card->flags & ISDNLOOP_FLAGS_RUNNING) | 1292 | if (!(card->flags & ISDNLOOP_FLAGS_RUNNING)) |
1293 | return -ENODEV; | 1293 | return -ENODEV; |
1294 | if (card->leased) | 1294 | if (card->leased) |
1295 | break; | 1295 | break; |
@@ -1333,7 +1333,7 @@ isdnloop_command(isdn_ctrl * c, isdnloop_card * card) | |||
1333 | } | 1333 | } |
1334 | break; | 1334 | break; |
1335 | case ISDN_CMD_SETL3: | 1335 | case ISDN_CMD_SETL3: |
1336 | if (!card->flags & ISDNLOOP_FLAGS_RUNNING) | 1336 | if (!(card->flags & ISDNLOOP_FLAGS_RUNNING)) |
1337 | return -ENODEV; | 1337 | return -ENODEV; |
1338 | return 0; | 1338 | return 0; |
1339 | default: | 1339 | default: |
@@ -1380,7 +1380,7 @@ if_writecmd(const u_char __user *buf, int len, int id, int channel) | |||
1380 | isdnloop_card *card = isdnloop_findcard(id); | 1380 | isdnloop_card *card = isdnloop_findcard(id); |
1381 | 1381 | ||
1382 | if (card) { | 1382 | if (card) { |
1383 | if (!card->flags & ISDNLOOP_FLAGS_RUNNING) | 1383 | if (!(card->flags & ISDNLOOP_FLAGS_RUNNING)) |
1384 | return -ENODEV; | 1384 | return -ENODEV; |
1385 | return (isdnloop_writecmd(buf, len, 1, card)); | 1385 | return (isdnloop_writecmd(buf, len, 1, card)); |
1386 | } | 1386 | } |
diff --git a/drivers/lguest/core.c b/drivers/lguest/core.c index 7743d73768df..c632c08cbbdc 100644 --- a/drivers/lguest/core.c +++ b/drivers/lguest/core.c | |||
@@ -69,11 +69,22 @@ static __init int map_switcher(void) | |||
69 | switcher_page[i] = virt_to_page(addr); | 69 | switcher_page[i] = virt_to_page(addr); |
70 | } | 70 | } |
71 | 71 | ||
72 | /* First we check that the Switcher won't overlap the fixmap area at | ||
73 | * the top of memory. It's currently nowhere near, but it could have | ||
74 | * very strange effects if it ever happened. */ | ||
75 | if (SWITCHER_ADDR + (TOTAL_SWITCHER_PAGES+1)*PAGE_SIZE > FIXADDR_START){ | ||
76 | err = -ENOMEM; | ||
77 | printk("lguest: mapping switcher would thwack fixmap\n"); | ||
78 | goto free_pages; | ||
79 | } | ||
80 | |||
72 | /* Now we reserve the "virtual memory area" we want: 0xFFC00000 | 81 | /* Now we reserve the "virtual memory area" we want: 0xFFC00000 |
73 | * (SWITCHER_ADDR). We might not get it in theory, but in practice | 82 | * (SWITCHER_ADDR). We might not get it in theory, but in practice |
74 | * it's worked so far. */ | 83 | * it's worked so far. The end address needs +1 because __get_vm_area |
84 | * allocates an extra guard page, so we need space for that. */ | ||
75 | switcher_vma = __get_vm_area(TOTAL_SWITCHER_PAGES * PAGE_SIZE, | 85 | switcher_vma = __get_vm_area(TOTAL_SWITCHER_PAGES * PAGE_SIZE, |
76 | VM_ALLOC, SWITCHER_ADDR, VMALLOC_END); | 86 | VM_ALLOC, SWITCHER_ADDR, SWITCHER_ADDR |
87 | + (TOTAL_SWITCHER_PAGES+1) * PAGE_SIZE); | ||
77 | if (!switcher_vma) { | 88 | if (!switcher_vma) { |
78 | err = -ENOMEM; | 89 | err = -ENOMEM; |
79 | printk("lguest: could not map switcher pages high\n"); | 90 | printk("lguest: could not map switcher pages high\n"); |
diff --git a/drivers/lguest/lguest_user.c b/drivers/lguest/lguest_user.c index 85d42d3d01a9..2221485b0773 100644 --- a/drivers/lguest/lguest_user.c +++ b/drivers/lguest/lguest_user.c | |||
@@ -241,15 +241,16 @@ static ssize_t write(struct file *file, const char __user *in, | |||
241 | cpu = &lg->cpus[cpu_id]; | 241 | cpu = &lg->cpus[cpu_id]; |
242 | if (!cpu) | 242 | if (!cpu) |
243 | return -EINVAL; | 243 | return -EINVAL; |
244 | } | ||
245 | 244 | ||
246 | /* Once the Guest is dead, all you can do is read() why it died. */ | 245 | /* Once the Guest is dead, you can only read() why it died. */ |
247 | if (lg && lg->dead) | 246 | if (lg->dead) |
248 | return -ENOENT; | 247 | return -ENOENT; |
249 | 248 | ||
250 | /* If you're not the task which owns the Guest, you can only break */ | 249 | /* If you're not the task which owns the Guest, all you can do |
251 | if (lg && current != cpu->tsk && req != LHREQ_BREAK) | 250 | * is break the Launcher out of running the Guest. */ |
252 | return -EPERM; | 251 | if (current != cpu->tsk && req != LHREQ_BREAK) |
252 | return -EPERM; | ||
253 | } | ||
253 | 254 | ||
254 | switch (req) { | 255 | switch (req) { |
255 | case LHREQ_INITIALIZE: | 256 | case LHREQ_INITIALIZE: |
diff --git a/drivers/lguest/page_tables.c b/drivers/lguest/page_tables.c index 275f23c2deb4..a7f64a9d67e0 100644 --- a/drivers/lguest/page_tables.c +++ b/drivers/lguest/page_tables.c | |||
@@ -391,7 +391,7 @@ static unsigned int find_pgdir(struct lguest *lg, unsigned long pgtable) | |||
391 | { | 391 | { |
392 | unsigned int i; | 392 | unsigned int i; |
393 | for (i = 0; i < ARRAY_SIZE(lg->pgdirs); i++) | 393 | for (i = 0; i < ARRAY_SIZE(lg->pgdirs); i++) |
394 | if (lg->pgdirs[i].gpgdir == pgtable) | 394 | if (lg->pgdirs[i].pgdir && lg->pgdirs[i].gpgdir == pgtable) |
395 | break; | 395 | break; |
396 | return i; | 396 | return i; |
397 | } | 397 | } |
diff --git a/drivers/macintosh/via-pmu-backlight.c b/drivers/macintosh/via-pmu-backlight.c index 741a2e3f4fc6..a348bb0791d3 100644 --- a/drivers/macintosh/via-pmu-backlight.c +++ b/drivers/macintosh/via-pmu-backlight.c | |||
@@ -17,7 +17,7 @@ | |||
17 | 17 | ||
18 | static struct backlight_ops pmu_backlight_data; | 18 | static struct backlight_ops pmu_backlight_data; |
19 | static DEFINE_SPINLOCK(pmu_backlight_lock); | 19 | static DEFINE_SPINLOCK(pmu_backlight_lock); |
20 | static int sleeping; | 20 | static int sleeping, uses_pmu_bl; |
21 | static u8 bl_curve[FB_BACKLIGHT_LEVELS]; | 21 | static u8 bl_curve[FB_BACKLIGHT_LEVELS]; |
22 | 22 | ||
23 | static void pmu_backlight_init_curve(u8 off, u8 min, u8 max) | 23 | static void pmu_backlight_init_curve(u8 off, u8 min, u8 max) |
@@ -128,7 +128,7 @@ void pmu_backlight_set_sleep(int sleep) | |||
128 | 128 | ||
129 | spin_lock_irqsave(&pmu_backlight_lock, flags); | 129 | spin_lock_irqsave(&pmu_backlight_lock, flags); |
130 | sleeping = sleep; | 130 | sleeping = sleep; |
131 | if (pmac_backlight) { | 131 | if (pmac_backlight && uses_pmu_bl) { |
132 | if (sleep) { | 132 | if (sleep) { |
133 | struct adb_request req; | 133 | struct adb_request req; |
134 | 134 | ||
@@ -166,6 +166,7 @@ void __init pmu_backlight_init() | |||
166 | printk(KERN_ERR "PMU Backlight registration failed\n"); | 166 | printk(KERN_ERR "PMU Backlight registration failed\n"); |
167 | return; | 167 | return; |
168 | } | 168 | } |
169 | uses_pmu_bl = 1; | ||
169 | bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; | 170 | bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; |
170 | pmu_backlight_init_curve(0x7F, 0x46, 0x0E); | 171 | pmu_backlight_init_curve(0x7F, 0x46, 0x0E); |
171 | 172 | ||
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index ebec663d5d37..d6365a9f0637 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c | |||
@@ -2528,7 +2528,7 @@ EXPORT_SYMBOL(pmu_wait_complete); | |||
2528 | EXPORT_SYMBOL(pmu_suspend); | 2528 | EXPORT_SYMBOL(pmu_suspend); |
2529 | EXPORT_SYMBOL(pmu_resume); | 2529 | EXPORT_SYMBOL(pmu_resume); |
2530 | EXPORT_SYMBOL(pmu_unlock); | 2530 | EXPORT_SYMBOL(pmu_unlock); |
2531 | #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32) | 2531 | #if defined(CONFIG_PPC32) |
2532 | EXPORT_SYMBOL(pmu_enable_irled); | 2532 | EXPORT_SYMBOL(pmu_enable_irled); |
2533 | EXPORT_SYMBOL(pmu_battery_count); | 2533 | EXPORT_SYMBOL(pmu_battery_count); |
2534 | EXPORT_SYMBOL(pmu_batteries); | 2534 | EXPORT_SYMBOL(pmu_batteries); |
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 7aeceedcf7d4..c14dacdacfac 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -1045,8 +1045,14 @@ void bitmap_daemon_work(struct bitmap *bitmap) | |||
1045 | if (bitmap == NULL) | 1045 | if (bitmap == NULL) |
1046 | return; | 1046 | return; |
1047 | if (time_before(jiffies, bitmap->daemon_lastrun + bitmap->daemon_sleep*HZ)) | 1047 | if (time_before(jiffies, bitmap->daemon_lastrun + bitmap->daemon_sleep*HZ)) |
1048 | return; | 1048 | goto done; |
1049 | |||
1049 | bitmap->daemon_lastrun = jiffies; | 1050 | bitmap->daemon_lastrun = jiffies; |
1051 | if (bitmap->allclean) { | ||
1052 | bitmap->mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT; | ||
1053 | return; | ||
1054 | } | ||
1055 | bitmap->allclean = 1; | ||
1050 | 1056 | ||
1051 | for (j = 0; j < bitmap->chunks; j++) { | 1057 | for (j = 0; j < bitmap->chunks; j++) { |
1052 | bitmap_counter_t *bmc; | 1058 | bitmap_counter_t *bmc; |
@@ -1068,8 +1074,10 @@ void bitmap_daemon_work(struct bitmap *bitmap) | |||
1068 | clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); | 1074 | clear_page_attr(bitmap, page, BITMAP_PAGE_NEEDWRITE); |
1069 | 1075 | ||
1070 | spin_unlock_irqrestore(&bitmap->lock, flags); | 1076 | spin_unlock_irqrestore(&bitmap->lock, flags); |
1071 | if (need_write) | 1077 | if (need_write) { |
1072 | write_page(bitmap, page, 0); | 1078 | write_page(bitmap, page, 0); |
1079 | bitmap->allclean = 0; | ||
1080 | } | ||
1073 | continue; | 1081 | continue; |
1074 | } | 1082 | } |
1075 | 1083 | ||
@@ -1098,6 +1106,9 @@ void bitmap_daemon_work(struct bitmap *bitmap) | |||
1098 | /* | 1106 | /* |
1099 | if (j < 100) printk("bitmap: j=%lu, *bmc = 0x%x\n", j, *bmc); | 1107 | if (j < 100) printk("bitmap: j=%lu, *bmc = 0x%x\n", j, *bmc); |
1100 | */ | 1108 | */ |
1109 | if (*bmc) | ||
1110 | bitmap->allclean = 0; | ||
1111 | |||
1101 | if (*bmc == 2) { | 1112 | if (*bmc == 2) { |
1102 | *bmc=1; /* maybe clear the bit next time */ | 1113 | *bmc=1; /* maybe clear the bit next time */ |
1103 | set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN); | 1114 | set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN); |
@@ -1132,6 +1143,9 @@ void bitmap_daemon_work(struct bitmap *bitmap) | |||
1132 | } | 1143 | } |
1133 | } | 1144 | } |
1134 | 1145 | ||
1146 | done: | ||
1147 | if (bitmap->allclean == 0) | ||
1148 | bitmap->mddev->thread->timeout = bitmap->daemon_sleep * HZ; | ||
1135 | } | 1149 | } |
1136 | 1150 | ||
1137 | static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap, | 1151 | static bitmap_counter_t *bitmap_get_counter(struct bitmap *bitmap, |
@@ -1226,6 +1240,7 @@ int bitmap_startwrite(struct bitmap *bitmap, sector_t offset, unsigned long sect | |||
1226 | sectors -= blocks; | 1240 | sectors -= blocks; |
1227 | else sectors = 0; | 1241 | else sectors = 0; |
1228 | } | 1242 | } |
1243 | bitmap->allclean = 0; | ||
1229 | return 0; | 1244 | return 0; |
1230 | } | 1245 | } |
1231 | 1246 | ||
@@ -1296,6 +1311,7 @@ int bitmap_start_sync(struct bitmap *bitmap, sector_t offset, int *blocks, | |||
1296 | } | 1311 | } |
1297 | } | 1312 | } |
1298 | spin_unlock_irq(&bitmap->lock); | 1313 | spin_unlock_irq(&bitmap->lock); |
1314 | bitmap->allclean = 0; | ||
1299 | return rv; | 1315 | return rv; |
1300 | } | 1316 | } |
1301 | 1317 | ||
@@ -1332,6 +1348,7 @@ void bitmap_end_sync(struct bitmap *bitmap, sector_t offset, int *blocks, int ab | |||
1332 | } | 1348 | } |
1333 | unlock: | 1349 | unlock: |
1334 | spin_unlock_irqrestore(&bitmap->lock, flags); | 1350 | spin_unlock_irqrestore(&bitmap->lock, flags); |
1351 | bitmap->allclean = 0; | ||
1335 | } | 1352 | } |
1336 | 1353 | ||
1337 | void bitmap_close_sync(struct bitmap *bitmap) | 1354 | void bitmap_close_sync(struct bitmap *bitmap) |
@@ -1399,7 +1416,7 @@ static void bitmap_set_memory_bits(struct bitmap *bitmap, sector_t offset, int n | |||
1399 | set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN); | 1416 | set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN); |
1400 | } | 1417 | } |
1401 | spin_unlock_irq(&bitmap->lock); | 1418 | spin_unlock_irq(&bitmap->lock); |
1402 | 1419 | bitmap->allclean = 0; | |
1403 | } | 1420 | } |
1404 | 1421 | ||
1405 | /* dirty the memory and file bits for bitmap chunks "s" to "e" */ | 1422 | /* dirty the memory and file bits for bitmap chunks "s" to "e" */ |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 7da6ec244e15..ccbbf63727cc 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -1105,7 +1105,11 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | |||
1105 | rdev->sb_size = le32_to_cpu(sb->max_dev) * 2 + 256; | 1105 | rdev->sb_size = le32_to_cpu(sb->max_dev) * 2 + 256; |
1106 | bmask = queue_hardsect_size(rdev->bdev->bd_disk->queue)-1; | 1106 | bmask = queue_hardsect_size(rdev->bdev->bd_disk->queue)-1; |
1107 | if (rdev->sb_size & bmask) | 1107 | if (rdev->sb_size & bmask) |
1108 | rdev-> sb_size = (rdev->sb_size | bmask)+1; | 1108 | rdev->sb_size = (rdev->sb_size | bmask) + 1; |
1109 | |||
1110 | if (minor_version | ||
1111 | && rdev->data_offset < sb_offset + (rdev->sb_size/512)) | ||
1112 | return -EINVAL; | ||
1109 | 1113 | ||
1110 | if (sb->level == cpu_to_le32(LEVEL_MULTIPATH)) | 1114 | if (sb->level == cpu_to_le32(LEVEL_MULTIPATH)) |
1111 | rdev->desc_nr = -1; | 1115 | rdev->desc_nr = -1; |
@@ -1137,7 +1141,7 @@ static int super_1_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version) | |||
1137 | else | 1141 | else |
1138 | ret = 0; | 1142 | ret = 0; |
1139 | } | 1143 | } |
1140 | if (minor_version) | 1144 | if (minor_version) |
1141 | rdev->size = ((rdev->bdev->bd_inode->i_size>>9) - le64_to_cpu(sb->data_offset)) / 2; | 1145 | rdev->size = ((rdev->bdev->bd_inode->i_size>>9) - le64_to_cpu(sb->data_offset)) / 2; |
1142 | else | 1146 | else |
1143 | rdev->size = rdev->sb_offset; | 1147 | rdev->size = rdev->sb_offset; |
@@ -1499,7 +1503,8 @@ static void export_rdev(mdk_rdev_t * rdev) | |||
1499 | free_disk_sb(rdev); | 1503 | free_disk_sb(rdev); |
1500 | list_del_init(&rdev->same_set); | 1504 | list_del_init(&rdev->same_set); |
1501 | #ifndef MODULE | 1505 | #ifndef MODULE |
1502 | md_autodetect_dev(rdev->bdev->bd_dev); | 1506 | if (test_bit(AutoDetected, &rdev->flags)) |
1507 | md_autodetect_dev(rdev->bdev->bd_dev); | ||
1503 | #endif | 1508 | #endif |
1504 | unlock_rdev(rdev); | 1509 | unlock_rdev(rdev); |
1505 | kobject_put(&rdev->kobj); | 1510 | kobject_put(&rdev->kobj); |
@@ -1996,9 +2001,11 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
1996 | char *e; | 2001 | char *e; |
1997 | unsigned long long size = simple_strtoull(buf, &e, 10); | 2002 | unsigned long long size = simple_strtoull(buf, &e, 10); |
1998 | unsigned long long oldsize = rdev->size; | 2003 | unsigned long long oldsize = rdev->size; |
2004 | mddev_t *my_mddev = rdev->mddev; | ||
2005 | |||
1999 | if (e==buf || (*e && *e != '\n')) | 2006 | if (e==buf || (*e && *e != '\n')) |
2000 | return -EINVAL; | 2007 | return -EINVAL; |
2001 | if (rdev->mddev->pers) | 2008 | if (my_mddev->pers) |
2002 | return -EBUSY; | 2009 | return -EBUSY; |
2003 | rdev->size = size; | 2010 | rdev->size = size; |
2004 | if (size > oldsize && rdev->mddev->external) { | 2011 | if (size > oldsize && rdev->mddev->external) { |
@@ -2011,7 +2018,7 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2011 | int overlap = 0; | 2018 | int overlap = 0; |
2012 | struct list_head *tmp, *tmp2; | 2019 | struct list_head *tmp, *tmp2; |
2013 | 2020 | ||
2014 | mddev_unlock(rdev->mddev); | 2021 | mddev_unlock(my_mddev); |
2015 | for_each_mddev(mddev, tmp) { | 2022 | for_each_mddev(mddev, tmp) { |
2016 | mdk_rdev_t *rdev2; | 2023 | mdk_rdev_t *rdev2; |
2017 | 2024 | ||
@@ -2031,7 +2038,7 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2031 | break; | 2038 | break; |
2032 | } | 2039 | } |
2033 | } | 2040 | } |
2034 | mddev_lock(rdev->mddev); | 2041 | mddev_lock(my_mddev); |
2035 | if (overlap) { | 2042 | if (overlap) { |
2036 | /* Someone else could have slipped in a size | 2043 | /* Someone else could have slipped in a size |
2037 | * change here, but doing so is just silly. | 2044 | * change here, but doing so is just silly. |
@@ -2043,8 +2050,8 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len) | |||
2043 | return -EBUSY; | 2050 | return -EBUSY; |
2044 | } | 2051 | } |
2045 | } | 2052 | } |
2046 | if (size < rdev->mddev->size || rdev->mddev->size == 0) | 2053 | if (size < my_mddev->size || my_mddev->size == 0) |
2047 | rdev->mddev->size = size; | 2054 | my_mddev->size = size; |
2048 | return len; | 2055 | return len; |
2049 | } | 2056 | } |
2050 | 2057 | ||
@@ -2065,10 +2072,21 @@ rdev_attr_show(struct kobject *kobj, struct attribute *attr, char *page) | |||
2065 | { | 2072 | { |
2066 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); | 2073 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); |
2067 | mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj); | 2074 | mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj); |
2075 | mddev_t *mddev = rdev->mddev; | ||
2076 | ssize_t rv; | ||
2068 | 2077 | ||
2069 | if (!entry->show) | 2078 | if (!entry->show) |
2070 | return -EIO; | 2079 | return -EIO; |
2071 | return entry->show(rdev, page); | 2080 | |
2081 | rv = mddev ? mddev_lock(mddev) : -EBUSY; | ||
2082 | if (!rv) { | ||
2083 | if (rdev->mddev == NULL) | ||
2084 | rv = -EBUSY; | ||
2085 | else | ||
2086 | rv = entry->show(rdev, page); | ||
2087 | mddev_unlock(mddev); | ||
2088 | } | ||
2089 | return rv; | ||
2072 | } | 2090 | } |
2073 | 2091 | ||
2074 | static ssize_t | 2092 | static ssize_t |
@@ -2077,15 +2095,19 @@ rdev_attr_store(struct kobject *kobj, struct attribute *attr, | |||
2077 | { | 2095 | { |
2078 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); | 2096 | struct rdev_sysfs_entry *entry = container_of(attr, struct rdev_sysfs_entry, attr); |
2079 | mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj); | 2097 | mdk_rdev_t *rdev = container_of(kobj, mdk_rdev_t, kobj); |
2080 | int rv; | 2098 | ssize_t rv; |
2099 | mddev_t *mddev = rdev->mddev; | ||
2081 | 2100 | ||
2082 | if (!entry->store) | 2101 | if (!entry->store) |
2083 | return -EIO; | 2102 | return -EIO; |
2084 | if (!capable(CAP_SYS_ADMIN)) | 2103 | if (!capable(CAP_SYS_ADMIN)) |
2085 | return -EACCES; | 2104 | return -EACCES; |
2086 | rv = mddev_lock(rdev->mddev); | 2105 | rv = mddev ? mddev_lock(mddev): -EBUSY; |
2087 | if (!rv) { | 2106 | if (!rv) { |
2088 | rv = entry->store(rdev, page, length); | 2107 | if (rdev->mddev == NULL) |
2108 | rv = -EBUSY; | ||
2109 | else | ||
2110 | rv = entry->store(rdev, page, length); | ||
2089 | mddev_unlock(rdev->mddev); | 2111 | mddev_unlock(rdev->mddev); |
2090 | } | 2112 | } |
2091 | return rv; | 2113 | return rv; |
@@ -5127,7 +5149,7 @@ static int md_seq_show(struct seq_file *seq, void *v) | |||
5127 | if (mddev->ro==1) | 5149 | if (mddev->ro==1) |
5128 | seq_printf(seq, " (read-only)"); | 5150 | seq_printf(seq, " (read-only)"); |
5129 | if (mddev->ro==2) | 5151 | if (mddev->ro==2) |
5130 | seq_printf(seq, "(auto-read-only)"); | 5152 | seq_printf(seq, " (auto-read-only)"); |
5131 | seq_printf(seq, " %s", mddev->pers->name); | 5153 | seq_printf(seq, " %s", mddev->pers->name); |
5132 | } | 5154 | } |
5133 | 5155 | ||
@@ -5351,6 +5373,7 @@ void md_write_start(mddev_t *mddev, struct bio *bi) | |||
5351 | mddev->ro = 0; | 5373 | mddev->ro = 0; |
5352 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 5374 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
5353 | md_wakeup_thread(mddev->thread); | 5375 | md_wakeup_thread(mddev->thread); |
5376 | md_wakeup_thread(mddev->sync_thread); | ||
5354 | } | 5377 | } |
5355 | atomic_inc(&mddev->writes_pending); | 5378 | atomic_inc(&mddev->writes_pending); |
5356 | if (mddev->in_sync) { | 5379 | if (mddev->in_sync) { |
@@ -6021,6 +6044,7 @@ static void autostart_arrays(int part) | |||
6021 | MD_BUG(); | 6044 | MD_BUG(); |
6022 | continue; | 6045 | continue; |
6023 | } | 6046 | } |
6047 | set_bit(AutoDetected, &rdev->flags); | ||
6024 | list_add(&rdev->same_set, &pending_raid_disks); | 6048 | list_add(&rdev->same_set, &pending_raid_disks); |
6025 | i_passed++; | 6049 | i_passed++; |
6026 | } | 6050 | } |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 5c7fef091cec..ff61b309129a 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -592,6 +592,37 @@ static int raid1_congested(void *data, int bits) | |||
592 | } | 592 | } |
593 | 593 | ||
594 | 594 | ||
595 | static int flush_pending_writes(conf_t *conf) | ||
596 | { | ||
597 | /* Any writes that have been queued but are awaiting | ||
598 | * bitmap updates get flushed here. | ||
599 | * We return 1 if any requests were actually submitted. | ||
600 | */ | ||
601 | int rv = 0; | ||
602 | |||
603 | spin_lock_irq(&conf->device_lock); | ||
604 | |||
605 | if (conf->pending_bio_list.head) { | ||
606 | struct bio *bio; | ||
607 | bio = bio_list_get(&conf->pending_bio_list); | ||
608 | blk_remove_plug(conf->mddev->queue); | ||
609 | spin_unlock_irq(&conf->device_lock); | ||
610 | /* flush any pending bitmap writes to | ||
611 | * disk before proceeding w/ I/O */ | ||
612 | bitmap_unplug(conf->mddev->bitmap); | ||
613 | |||
614 | while (bio) { /* submit pending writes */ | ||
615 | struct bio *next = bio->bi_next; | ||
616 | bio->bi_next = NULL; | ||
617 | generic_make_request(bio); | ||
618 | bio = next; | ||
619 | } | ||
620 | rv = 1; | ||
621 | } else | ||
622 | spin_unlock_irq(&conf->device_lock); | ||
623 | return rv; | ||
624 | } | ||
625 | |||
595 | /* Barriers.... | 626 | /* Barriers.... |
596 | * Sometimes we need to suspend IO while we do something else, | 627 | * Sometimes we need to suspend IO while we do something else, |
597 | * either some resync/recovery, or reconfigure the array. | 628 | * either some resync/recovery, or reconfigure the array. |
@@ -673,15 +704,23 @@ static void freeze_array(conf_t *conf) | |||
673 | /* stop syncio and normal IO and wait for everything to | 704 | /* stop syncio and normal IO and wait for everything to |
674 | * go quite. | 705 | * go quite. |
675 | * We increment barrier and nr_waiting, and then | 706 | * We increment barrier and nr_waiting, and then |
676 | * wait until barrier+nr_pending match nr_queued+2 | 707 | * wait until nr_pending match nr_queued+1 |
708 | * This is called in the context of one normal IO request | ||
709 | * that has failed. Thus any sync request that might be pending | ||
710 | * will be blocked by nr_pending, and we need to wait for | ||
711 | * pending IO requests to complete or be queued for re-try. | ||
712 | * Thus the number queued (nr_queued) plus this request (1) | ||
713 | * must match the number of pending IOs (nr_pending) before | ||
714 | * we continue. | ||
677 | */ | 715 | */ |
678 | spin_lock_irq(&conf->resync_lock); | 716 | spin_lock_irq(&conf->resync_lock); |
679 | conf->barrier++; | 717 | conf->barrier++; |
680 | conf->nr_waiting++; | 718 | conf->nr_waiting++; |
681 | wait_event_lock_irq(conf->wait_barrier, | 719 | wait_event_lock_irq(conf->wait_barrier, |
682 | conf->barrier+conf->nr_pending == conf->nr_queued+2, | 720 | conf->nr_pending == conf->nr_queued+1, |
683 | conf->resync_lock, | 721 | conf->resync_lock, |
684 | raid1_unplug(conf->mddev->queue)); | 722 | ({ flush_pending_writes(conf); |
723 | raid1_unplug(conf->mddev->queue); })); | ||
685 | spin_unlock_irq(&conf->resync_lock); | 724 | spin_unlock_irq(&conf->resync_lock); |
686 | } | 725 | } |
687 | static void unfreeze_array(conf_t *conf) | 726 | static void unfreeze_array(conf_t *conf) |
@@ -907,6 +946,9 @@ static int make_request(struct request_queue *q, struct bio * bio) | |||
907 | blk_plug_device(mddev->queue); | 946 | blk_plug_device(mddev->queue); |
908 | spin_unlock_irqrestore(&conf->device_lock, flags); | 947 | spin_unlock_irqrestore(&conf->device_lock, flags); |
909 | 948 | ||
949 | /* In case raid1d snuck into freeze_array */ | ||
950 | wake_up(&conf->wait_barrier); | ||
951 | |||
910 | if (do_sync) | 952 | if (do_sync) |
911 | md_wakeup_thread(mddev->thread); | 953 | md_wakeup_thread(mddev->thread); |
912 | #if 0 | 954 | #if 0 |
@@ -1473,28 +1515,14 @@ static void raid1d(mddev_t *mddev) | |||
1473 | 1515 | ||
1474 | for (;;) { | 1516 | for (;;) { |
1475 | char b[BDEVNAME_SIZE]; | 1517 | char b[BDEVNAME_SIZE]; |
1476 | spin_lock_irqsave(&conf->device_lock, flags); | ||
1477 | |||
1478 | if (conf->pending_bio_list.head) { | ||
1479 | bio = bio_list_get(&conf->pending_bio_list); | ||
1480 | blk_remove_plug(mddev->queue); | ||
1481 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
1482 | /* flush any pending bitmap writes to disk before proceeding w/ I/O */ | ||
1483 | bitmap_unplug(mddev->bitmap); | ||
1484 | 1518 | ||
1485 | while (bio) { /* submit pending writes */ | 1519 | unplug += flush_pending_writes(conf); |
1486 | struct bio *next = bio->bi_next; | ||
1487 | bio->bi_next = NULL; | ||
1488 | generic_make_request(bio); | ||
1489 | bio = next; | ||
1490 | } | ||
1491 | unplug = 1; | ||
1492 | 1520 | ||
1493 | continue; | 1521 | spin_lock_irqsave(&conf->device_lock, flags); |
1494 | } | 1522 | if (list_empty(head)) { |
1495 | 1523 | spin_unlock_irqrestore(&conf->device_lock, flags); | |
1496 | if (list_empty(head)) | ||
1497 | break; | 1524 | break; |
1525 | } | ||
1498 | r1_bio = list_entry(head->prev, r1bio_t, retry_list); | 1526 | r1_bio = list_entry(head->prev, r1bio_t, retry_list); |
1499 | list_del(head->prev); | 1527 | list_del(head->prev); |
1500 | conf->nr_queued--; | 1528 | conf->nr_queued--; |
@@ -1590,7 +1618,6 @@ static void raid1d(mddev_t *mddev) | |||
1590 | } | 1618 | } |
1591 | } | 1619 | } |
1592 | } | 1620 | } |
1593 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
1594 | if (unplug) | 1621 | if (unplug) |
1595 | unplug_slaves(mddev); | 1622 | unplug_slaves(mddev); |
1596 | } | 1623 | } |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 017f58113c33..32389d2f18fc 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -537,7 +537,8 @@ static int read_balance(conf_t *conf, r10bio_t *r10_bio) | |||
537 | current_distance = abs(r10_bio->devs[slot].addr - | 537 | current_distance = abs(r10_bio->devs[slot].addr - |
538 | conf->mirrors[disk].head_position); | 538 | conf->mirrors[disk].head_position); |
539 | 539 | ||
540 | /* Find the disk whose head is closest */ | 540 | /* Find the disk whose head is closest, |
541 | * or - for far > 1 - find the closest to partition beginning */ | ||
541 | 542 | ||
542 | for (nslot = slot; nslot < conf->copies; nslot++) { | 543 | for (nslot = slot; nslot < conf->copies; nslot++) { |
543 | int ndisk = r10_bio->devs[nslot].devnum; | 544 | int ndisk = r10_bio->devs[nslot].devnum; |
@@ -557,8 +558,13 @@ static int read_balance(conf_t *conf, r10bio_t *r10_bio) | |||
557 | slot = nslot; | 558 | slot = nslot; |
558 | break; | 559 | break; |
559 | } | 560 | } |
560 | new_distance = abs(r10_bio->devs[nslot].addr - | 561 | |
561 | conf->mirrors[ndisk].head_position); | 562 | /* for far > 1 always use the lowest address */ |
563 | if (conf->far_copies > 1) | ||
564 | new_distance = r10_bio->devs[nslot].addr; | ||
565 | else | ||
566 | new_distance = abs(r10_bio->devs[nslot].addr - | ||
567 | conf->mirrors[ndisk].head_position); | ||
562 | if (new_distance < current_distance) { | 568 | if (new_distance < current_distance) { |
563 | current_distance = new_distance; | 569 | current_distance = new_distance; |
564 | disk = ndisk; | 570 | disk = ndisk; |
@@ -629,7 +635,36 @@ static int raid10_congested(void *data, int bits) | |||
629 | return ret; | 635 | return ret; |
630 | } | 636 | } |
631 | 637 | ||
632 | 638 | static int flush_pending_writes(conf_t *conf) | |
639 | { | ||
640 | /* Any writes that have been queued but are awaiting | ||
641 | * bitmap updates get flushed here. | ||
642 | * We return 1 if any requests were actually submitted. | ||
643 | */ | ||
644 | int rv = 0; | ||
645 | |||
646 | spin_lock_irq(&conf->device_lock); | ||
647 | |||
648 | if (conf->pending_bio_list.head) { | ||
649 | struct bio *bio; | ||
650 | bio = bio_list_get(&conf->pending_bio_list); | ||
651 | blk_remove_plug(conf->mddev->queue); | ||
652 | spin_unlock_irq(&conf->device_lock); | ||
653 | /* flush any pending bitmap writes to disk | ||
654 | * before proceeding w/ I/O */ | ||
655 | bitmap_unplug(conf->mddev->bitmap); | ||
656 | |||
657 | while (bio) { /* submit pending writes */ | ||
658 | struct bio *next = bio->bi_next; | ||
659 | bio->bi_next = NULL; | ||
660 | generic_make_request(bio); | ||
661 | bio = next; | ||
662 | } | ||
663 | rv = 1; | ||
664 | } else | ||
665 | spin_unlock_irq(&conf->device_lock); | ||
666 | return rv; | ||
667 | } | ||
633 | /* Barriers.... | 668 | /* Barriers.... |
634 | * Sometimes we need to suspend IO while we do something else, | 669 | * Sometimes we need to suspend IO while we do something else, |
635 | * either some resync/recovery, or reconfigure the array. | 670 | * either some resync/recovery, or reconfigure the array. |
@@ -712,15 +747,23 @@ static void freeze_array(conf_t *conf) | |||
712 | /* stop syncio and normal IO and wait for everything to | 747 | /* stop syncio and normal IO and wait for everything to |
713 | * go quiet. | 748 | * go quiet. |
714 | * We increment barrier and nr_waiting, and then | 749 | * We increment barrier and nr_waiting, and then |
715 | * wait until barrier+nr_pending match nr_queued+2 | 750 | * wait until nr_pending match nr_queued+1 |
751 | * This is called in the context of one normal IO request | ||
752 | * that has failed. Thus any sync request that might be pending | ||
753 | * will be blocked by nr_pending, and we need to wait for | ||
754 | * pending IO requests to complete or be queued for re-try. | ||
755 | * Thus the number queued (nr_queued) plus this request (1) | ||
756 | * must match the number of pending IOs (nr_pending) before | ||
757 | * we continue. | ||
716 | */ | 758 | */ |
717 | spin_lock_irq(&conf->resync_lock); | 759 | spin_lock_irq(&conf->resync_lock); |
718 | conf->barrier++; | 760 | conf->barrier++; |
719 | conf->nr_waiting++; | 761 | conf->nr_waiting++; |
720 | wait_event_lock_irq(conf->wait_barrier, | 762 | wait_event_lock_irq(conf->wait_barrier, |
721 | conf->barrier+conf->nr_pending == conf->nr_queued+2, | 763 | conf->nr_pending == conf->nr_queued+1, |
722 | conf->resync_lock, | 764 | conf->resync_lock, |
723 | raid10_unplug(conf->mddev->queue)); | 765 | ({ flush_pending_writes(conf); |
766 | raid10_unplug(conf->mddev->queue); })); | ||
724 | spin_unlock_irq(&conf->resync_lock); | 767 | spin_unlock_irq(&conf->resync_lock); |
725 | } | 768 | } |
726 | 769 | ||
@@ -892,6 +935,9 @@ static int make_request(struct request_queue *q, struct bio * bio) | |||
892 | blk_plug_device(mddev->queue); | 935 | blk_plug_device(mddev->queue); |
893 | spin_unlock_irqrestore(&conf->device_lock, flags); | 936 | spin_unlock_irqrestore(&conf->device_lock, flags); |
894 | 937 | ||
938 | /* In case raid10d snuck in to freeze_array */ | ||
939 | wake_up(&conf->wait_barrier); | ||
940 | |||
895 | if (do_sync) | 941 | if (do_sync) |
896 | md_wakeup_thread(mddev->thread); | 942 | md_wakeup_thread(mddev->thread); |
897 | 943 | ||
@@ -1464,28 +1510,14 @@ static void raid10d(mddev_t *mddev) | |||
1464 | 1510 | ||
1465 | for (;;) { | 1511 | for (;;) { |
1466 | char b[BDEVNAME_SIZE]; | 1512 | char b[BDEVNAME_SIZE]; |
1467 | spin_lock_irqsave(&conf->device_lock, flags); | ||
1468 | 1513 | ||
1469 | if (conf->pending_bio_list.head) { | 1514 | unplug += flush_pending_writes(conf); |
1470 | bio = bio_list_get(&conf->pending_bio_list); | ||
1471 | blk_remove_plug(mddev->queue); | ||
1472 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
1473 | /* flush any pending bitmap writes to disk before proceeding w/ I/O */ | ||
1474 | bitmap_unplug(mddev->bitmap); | ||
1475 | |||
1476 | while (bio) { /* submit pending writes */ | ||
1477 | struct bio *next = bio->bi_next; | ||
1478 | bio->bi_next = NULL; | ||
1479 | generic_make_request(bio); | ||
1480 | bio = next; | ||
1481 | } | ||
1482 | unplug = 1; | ||
1483 | |||
1484 | continue; | ||
1485 | } | ||
1486 | 1515 | ||
1487 | if (list_empty(head)) | 1516 | spin_lock_irqsave(&conf->device_lock, flags); |
1517 | if (list_empty(head)) { | ||
1518 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
1488 | break; | 1519 | break; |
1520 | } | ||
1489 | r10_bio = list_entry(head->prev, r10bio_t, retry_list); | 1521 | r10_bio = list_entry(head->prev, r10bio_t, retry_list); |
1490 | list_del(head->prev); | 1522 | list_del(head->prev); |
1491 | conf->nr_queued--; | 1523 | conf->nr_queued--; |
@@ -1548,7 +1580,6 @@ static void raid10d(mddev_t *mddev) | |||
1548 | } | 1580 | } |
1549 | } | 1581 | } |
1550 | } | 1582 | } |
1551 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
1552 | if (unplug) | 1583 | if (unplug) |
1553 | unplug_slaves(mddev); | 1584 | unplug_slaves(mddev); |
1554 | } | 1585 | } |
@@ -1787,6 +1818,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i | |||
1787 | if (j == conf->copies) { | 1818 | if (j == conf->copies) { |
1788 | /* Cannot recover, so abort the recovery */ | 1819 | /* Cannot recover, so abort the recovery */ |
1789 | put_buf(r10_bio); | 1820 | put_buf(r10_bio); |
1821 | if (rb2) | ||
1822 | atomic_dec(&rb2->remaining); | ||
1790 | r10_bio = rb2; | 1823 | r10_bio = rb2; |
1791 | if (!test_and_set_bit(MD_RECOVERY_ERR, &mddev->recovery)) | 1824 | if (!test_and_set_bit(MD_RECOVERY_ERR, &mddev->recovery)) |
1792 | printk(KERN_INFO "raid10: %s: insufficient working devices for recovery.\n", | 1825 | printk(KERN_INFO "raid10: %s: insufficient working devices for recovery.\n", |
diff --git a/drivers/memstick/Kconfig b/drivers/memstick/Kconfig index 1093fdb07297..f0ca41c20323 100644 --- a/drivers/memstick/Kconfig +++ b/drivers/memstick/Kconfig | |||
@@ -8,7 +8,7 @@ menuconfig MEMSTICK | |||
8 | Sony MemoryStick is a proprietary storage/extension card protocol. | 8 | Sony MemoryStick is a proprietary storage/extension card protocol. |
9 | 9 | ||
10 | If you want MemoryStick support, you should say Y here and also | 10 | If you want MemoryStick support, you should say Y here and also |
11 | to the specific driver for your MMC interface. | 11 | to the specific driver for your MemoryStick interface. |
12 | 12 | ||
13 | if MEMSTICK | 13 | if MEMSTICK |
14 | 14 | ||
diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c index bba467fe4bce..de80dba12f9b 100644 --- a/drivers/memstick/core/memstick.c +++ b/drivers/memstick/core/memstick.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
19 | 19 | ||
20 | #define DRIVER_NAME "memstick" | 20 | #define DRIVER_NAME "memstick" |
21 | #define DRIVER_VERSION "0.2" | ||
22 | 21 | ||
23 | static unsigned int cmd_retries = 3; | 22 | static unsigned int cmd_retries = 3; |
24 | module_param(cmd_retries, uint, 0644); | 23 | module_param(cmd_retries, uint, 0644); |
@@ -236,7 +235,7 @@ int memstick_next_req(struct memstick_host *host, struct memstick_request **mrq) | |||
236 | rc = host->card->next_request(host->card, mrq); | 235 | rc = host->card->next_request(host->card, mrq); |
237 | 236 | ||
238 | if (!rc) | 237 | if (!rc) |
239 | host->retries = cmd_retries; | 238 | host->retries = cmd_retries > 1 ? cmd_retries - 1 : 1; |
240 | else | 239 | else |
241 | *mrq = NULL; | 240 | *mrq = NULL; |
242 | 241 | ||
@@ -271,7 +270,7 @@ void memstick_init_req_sg(struct memstick_request *mrq, unsigned char tpc, | |||
271 | mrq->data_dir = READ; | 270 | mrq->data_dir = READ; |
272 | 271 | ||
273 | mrq->sg = *sg; | 272 | mrq->sg = *sg; |
274 | mrq->io_type = MEMSTICK_IO_SG; | 273 | mrq->long_data = 1; |
275 | 274 | ||
276 | if (tpc == MS_TPC_SET_CMD || tpc == MS_TPC_EX_SET_CMD) | 275 | if (tpc == MS_TPC_SET_CMD || tpc == MS_TPC_EX_SET_CMD) |
277 | mrq->need_card_int = 1; | 276 | mrq->need_card_int = 1; |
@@ -306,7 +305,7 @@ void memstick_init_req(struct memstick_request *mrq, unsigned char tpc, | |||
306 | if (mrq->data_dir == WRITE) | 305 | if (mrq->data_dir == WRITE) |
307 | memcpy(mrq->data, buf, mrq->data_len); | 306 | memcpy(mrq->data, buf, mrq->data_len); |
308 | 307 | ||
309 | mrq->io_type = MEMSTICK_IO_VAL; | 308 | mrq->long_data = 0; |
310 | 309 | ||
311 | if (tpc == MS_TPC_SET_CMD || tpc == MS_TPC_EX_SET_CMD) | 310 | if (tpc == MS_TPC_SET_CMD || tpc == MS_TPC_EX_SET_CMD) |
312 | mrq->need_card_int = 1; | 311 | mrq->need_card_int = 1; |
@@ -561,6 +560,31 @@ void memstick_free_host(struct memstick_host *host) | |||
561 | } | 560 | } |
562 | EXPORT_SYMBOL(memstick_free_host); | 561 | EXPORT_SYMBOL(memstick_free_host); |
563 | 562 | ||
563 | /** | ||
564 | * memstick_suspend_host - notify bus driver of host suspension | ||
565 | * @host - host to use | ||
566 | */ | ||
567 | void memstick_suspend_host(struct memstick_host *host) | ||
568 | { | ||
569 | mutex_lock(&host->lock); | ||
570 | host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_OFF); | ||
571 | mutex_unlock(&host->lock); | ||
572 | } | ||
573 | EXPORT_SYMBOL(memstick_suspend_host); | ||
574 | |||
575 | /** | ||
576 | * memstick_resume_host - notify bus driver of host resumption | ||
577 | * @host - host to use | ||
578 | */ | ||
579 | void memstick_resume_host(struct memstick_host *host) | ||
580 | { | ||
581 | mutex_lock(&host->lock); | ||
582 | host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_ON); | ||
583 | mutex_unlock(&host->lock); | ||
584 | memstick_detect_change(host); | ||
585 | } | ||
586 | EXPORT_SYMBOL(memstick_resume_host); | ||
587 | |||
564 | int memstick_register_driver(struct memstick_driver *drv) | 588 | int memstick_register_driver(struct memstick_driver *drv) |
565 | { | 589 | { |
566 | drv->driver.bus = &memstick_bus_type; | 590 | drv->driver.bus = &memstick_bus_type; |
@@ -611,4 +635,3 @@ module_exit(memstick_exit); | |||
611 | MODULE_AUTHOR("Alex Dubov"); | 635 | MODULE_AUTHOR("Alex Dubov"); |
612 | MODULE_LICENSE("GPL"); | 636 | MODULE_LICENSE("GPL"); |
613 | MODULE_DESCRIPTION("Sony MemoryStick core driver"); | 637 | MODULE_DESCRIPTION("Sony MemoryStick core driver"); |
614 | MODULE_VERSION(DRIVER_VERSION); | ||
diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c index 423ad8cf4bb9..1d637e4561d3 100644 --- a/drivers/memstick/core/mspro_block.c +++ b/drivers/memstick/core/mspro_block.c | |||
@@ -16,10 +16,10 @@ | |||
16 | #include <linux/idr.h> | 16 | #include <linux/idr.h> |
17 | #include <linux/hdreg.h> | 17 | #include <linux/hdreg.h> |
18 | #include <linux/kthread.h> | 18 | #include <linux/kthread.h> |
19 | #include <linux/delay.h> | ||
19 | #include <linux/memstick.h> | 20 | #include <linux/memstick.h> |
20 | 21 | ||
21 | #define DRIVER_NAME "mspro_block" | 22 | #define DRIVER_NAME "mspro_block" |
22 | #define DRIVER_VERSION "0.2" | ||
23 | 23 | ||
24 | static int major; | 24 | static int major; |
25 | module_param(major, int, 0644); | 25 | module_param(major, int, 0644); |
@@ -110,6 +110,17 @@ struct mspro_mbr { | |||
110 | unsigned int sectors_per_partition; | 110 | unsigned int sectors_per_partition; |
111 | } __attribute__((packed)); | 111 | } __attribute__((packed)); |
112 | 112 | ||
113 | struct mspro_specfile { | ||
114 | char name[8]; | ||
115 | char ext[3]; | ||
116 | unsigned char attr; | ||
117 | unsigned char reserved[10]; | ||
118 | unsigned short time; | ||
119 | unsigned short date; | ||
120 | unsigned short cluster; | ||
121 | unsigned int size; | ||
122 | } __attribute__((packed)); | ||
123 | |||
113 | struct mspro_devinfo { | 124 | struct mspro_devinfo { |
114 | unsigned short cylinders; | 125 | unsigned short cylinders; |
115 | unsigned short heads; | 126 | unsigned short heads; |
@@ -293,6 +304,20 @@ static ssize_t mspro_block_attr_show_sysinfo(struct device *dev, | |||
293 | dev_attr); | 304 | dev_attr); |
294 | struct mspro_sys_info *x_sys = x_attr->data; | 305 | struct mspro_sys_info *x_sys = x_attr->data; |
295 | ssize_t rc = 0; | 306 | ssize_t rc = 0; |
307 | int date_tz = 0, date_tz_f = 0; | ||
308 | |||
309 | if (x_sys->assembly_date[0] > 0x80U) { | ||
310 | date_tz = (~x_sys->assembly_date[0]) + 1; | ||
311 | date_tz_f = date_tz & 3; | ||
312 | date_tz >>= 2; | ||
313 | date_tz = -date_tz; | ||
314 | date_tz_f *= 15; | ||
315 | } else if (x_sys->assembly_date[0] < 0x80U) { | ||
316 | date_tz = x_sys->assembly_date[0]; | ||
317 | date_tz_f = date_tz & 3; | ||
318 | date_tz >>= 2; | ||
319 | date_tz_f *= 15; | ||
320 | } | ||
296 | 321 | ||
297 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "class: %x\n", | 322 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "class: %x\n", |
298 | x_sys->class); | 323 | x_sys->class); |
@@ -305,8 +330,8 @@ static ssize_t mspro_block_attr_show_sysinfo(struct device *dev, | |||
305 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "page size: %x\n", | 330 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "page size: %x\n", |
306 | be16_to_cpu(x_sys->page_size)); | 331 | be16_to_cpu(x_sys->page_size)); |
307 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "assembly date: " | 332 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "assembly date: " |
308 | "%d %04u-%02u-%02u %02u:%02u:%02u\n", | 333 | "GMT%+d:%d %04u-%02u-%02u %02u:%02u:%02u\n", |
309 | x_sys->assembly_date[0], | 334 | date_tz, date_tz_f, |
310 | be16_to_cpu(*(unsigned short *) | 335 | be16_to_cpu(*(unsigned short *) |
311 | &x_sys->assembly_date[1]), | 336 | &x_sys->assembly_date[1]), |
312 | x_sys->assembly_date[3], x_sys->assembly_date[4], | 337 | x_sys->assembly_date[3], x_sys->assembly_date[4], |
@@ -398,6 +423,41 @@ static ssize_t mspro_block_attr_show_mbr(struct device *dev, | |||
398 | return rc; | 423 | return rc; |
399 | } | 424 | } |
400 | 425 | ||
426 | static ssize_t mspro_block_attr_show_specfile(struct device *dev, | ||
427 | struct device_attribute *attr, | ||
428 | char *buffer) | ||
429 | { | ||
430 | struct mspro_sys_attr *x_attr = container_of(attr, | ||
431 | struct mspro_sys_attr, | ||
432 | dev_attr); | ||
433 | struct mspro_specfile *x_spfile = x_attr->data; | ||
434 | char name[9], ext[4]; | ||
435 | ssize_t rc = 0; | ||
436 | |||
437 | memcpy(name, x_spfile->name, 8); | ||
438 | name[8] = 0; | ||
439 | memcpy(ext, x_spfile->ext, 3); | ||
440 | ext[3] = 0; | ||
441 | |||
442 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "name: %s\n", name); | ||
443 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "ext: %s\n", ext); | ||
444 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "attribute: %x\n", | ||
445 | x_spfile->attr); | ||
446 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "time: %d:%d:%d\n", | ||
447 | x_spfile->time >> 11, | ||
448 | (x_spfile->time >> 5) & 0x3f, | ||
449 | (x_spfile->time & 0x1f) * 2); | ||
450 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "date: %d-%d-%d\n", | ||
451 | (x_spfile->date >> 9) + 1980, | ||
452 | (x_spfile->date >> 5) & 0xf, | ||
453 | x_spfile->date & 0x1f); | ||
454 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "start cluster: %x\n", | ||
455 | x_spfile->cluster); | ||
456 | rc += scnprintf(buffer + rc, PAGE_SIZE - rc, "size: %x\n", | ||
457 | x_spfile->size); | ||
458 | return rc; | ||
459 | } | ||
460 | |||
401 | static ssize_t mspro_block_attr_show_devinfo(struct device *dev, | 461 | static ssize_t mspro_block_attr_show_devinfo(struct device *dev, |
402 | struct device_attribute *attr, | 462 | struct device_attribute *attr, |
403 | char *buffer) | 463 | char *buffer) |
@@ -430,6 +490,9 @@ static sysfs_show_t mspro_block_attr_show(unsigned char tag) | |||
430 | return mspro_block_attr_show_modelname; | 490 | return mspro_block_attr_show_modelname; |
431 | case MSPRO_BLOCK_ID_MBR: | 491 | case MSPRO_BLOCK_ID_MBR: |
432 | return mspro_block_attr_show_mbr; | 492 | return mspro_block_attr_show_mbr; |
493 | case MSPRO_BLOCK_ID_SPECFILEVALUES1: | ||
494 | case MSPRO_BLOCK_ID_SPECFILEVALUES2: | ||
495 | return mspro_block_attr_show_specfile; | ||
433 | case MSPRO_BLOCK_ID_DEVINFO: | 496 | case MSPRO_BLOCK_ID_DEVINFO: |
434 | return mspro_block_attr_show_devinfo; | 497 | return mspro_block_attr_show_devinfo; |
435 | default: | 498 | default: |
@@ -629,7 +692,7 @@ static void mspro_block_process_request(struct memstick_dev *card, | |||
629 | param.system = msb->system; | 692 | param.system = msb->system; |
630 | param.data_count = cpu_to_be16(page_count); | 693 | param.data_count = cpu_to_be16(page_count); |
631 | param.data_address = cpu_to_be32((uint32_t)t_sec); | 694 | param.data_address = cpu_to_be32((uint32_t)t_sec); |
632 | param.cmd_param = 0; | 695 | param.tpc_param = 0; |
633 | 696 | ||
634 | msb->data_dir = rq_data_dir(req); | 697 | msb->data_dir = rq_data_dir(req); |
635 | msb->transfer_cmd = msb->data_dir == READ | 698 | msb->transfer_cmd = msb->data_dir == READ |
@@ -758,10 +821,10 @@ static int mspro_block_switch_to_parallel(struct memstick_dev *card) | |||
758 | struct memstick_host *host = card->host; | 821 | struct memstick_host *host = card->host; |
759 | struct mspro_block_data *msb = memstick_get_drvdata(card); | 822 | struct mspro_block_data *msb = memstick_get_drvdata(card); |
760 | struct mspro_param_register param = { | 823 | struct mspro_param_register param = { |
761 | .system = 0, | 824 | .system = MEMSTICK_SYS_PAR4, |
762 | .data_count = 0, | 825 | .data_count = 0, |
763 | .data_address = 0, | 826 | .data_address = 0, |
764 | .cmd_param = 0 | 827 | .tpc_param = 0 |
765 | }; | 828 | }; |
766 | 829 | ||
767 | card->next_request = h_mspro_block_req_init; | 830 | card->next_request = h_mspro_block_req_init; |
@@ -773,8 +836,8 @@ static int mspro_block_switch_to_parallel(struct memstick_dev *card) | |||
773 | if (card->current_mrq.error) | 836 | if (card->current_mrq.error) |
774 | return card->current_mrq.error; | 837 | return card->current_mrq.error; |
775 | 838 | ||
776 | msb->system = 0; | 839 | msb->system = MEMSTICK_SYS_PAR4; |
777 | host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_PARALLEL); | 840 | host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_PAR4); |
778 | 841 | ||
779 | card->next_request = h_mspro_block_req_init; | 842 | card->next_request = h_mspro_block_req_init; |
780 | msb->mrq_handler = h_mspro_block_default; | 843 | msb->mrq_handler = h_mspro_block_default; |
@@ -783,8 +846,24 @@ static int mspro_block_switch_to_parallel(struct memstick_dev *card) | |||
783 | wait_for_completion(&card->mrq_complete); | 846 | wait_for_completion(&card->mrq_complete); |
784 | 847 | ||
785 | if (card->current_mrq.error) { | 848 | if (card->current_mrq.error) { |
786 | msb->system = 0x80; | 849 | msb->system = MEMSTICK_SYS_SERIAL; |
850 | host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_OFF); | ||
851 | msleep(1000); | ||
852 | host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_ON); | ||
787 | host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_SERIAL); | 853 | host->set_param(host, MEMSTICK_INTERFACE, MEMSTICK_SERIAL); |
854 | |||
855 | if (memstick_set_rw_addr(card)) | ||
856 | return card->current_mrq.error; | ||
857 | |||
858 | param.system = msb->system; | ||
859 | |||
860 | card->next_request = h_mspro_block_req_init; | ||
861 | msb->mrq_handler = h_mspro_block_default; | ||
862 | memstick_init_req(&card->current_mrq, MS_TPC_WRITE_REG, ¶m, | ||
863 | sizeof(param)); | ||
864 | memstick_new_req(host); | ||
865 | wait_for_completion(&card->mrq_complete); | ||
866 | |||
788 | return -EFAULT; | 867 | return -EFAULT; |
789 | } | 868 | } |
790 | 869 | ||
@@ -802,7 +881,7 @@ static int mspro_block_read_attributes(struct memstick_dev *card) | |||
802 | .system = msb->system, | 881 | .system = msb->system, |
803 | .data_count = cpu_to_be16(1), | 882 | .data_count = cpu_to_be16(1), |
804 | .data_address = 0, | 883 | .data_address = 0, |
805 | .cmd_param = 0 | 884 | .tpc_param = 0 |
806 | }; | 885 | }; |
807 | struct mspro_attribute *attr = NULL; | 886 | struct mspro_attribute *attr = NULL; |
808 | struct mspro_sys_attr *s_attr = NULL; | 887 | struct mspro_sys_attr *s_attr = NULL; |
@@ -922,7 +1001,7 @@ static int mspro_block_read_attributes(struct memstick_dev *card) | |||
922 | param.system = msb->system; | 1001 | param.system = msb->system; |
923 | param.data_count = cpu_to_be16((rc / msb->page_size) + 1); | 1002 | param.data_count = cpu_to_be16((rc / msb->page_size) + 1); |
924 | param.data_address = cpu_to_be32(addr / msb->page_size); | 1003 | param.data_address = cpu_to_be32(addr / msb->page_size); |
925 | param.cmd_param = 0; | 1004 | param.tpc_param = 0; |
926 | 1005 | ||
927 | sg_init_one(&msb->req_sg[0], buffer, | 1006 | sg_init_one(&msb->req_sg[0], buffer, |
928 | be16_to_cpu(param.data_count) * msb->page_size); | 1007 | be16_to_cpu(param.data_count) * msb->page_size); |
@@ -964,7 +1043,7 @@ static int mspro_block_init_card(struct memstick_dev *card) | |||
964 | struct memstick_host *host = card->host; | 1043 | struct memstick_host *host = card->host; |
965 | int rc = 0; | 1044 | int rc = 0; |
966 | 1045 | ||
967 | msb->system = 0x80; | 1046 | msb->system = MEMSTICK_SYS_SERIAL; |
968 | card->reg_addr.r_offset = offsetof(struct mspro_register, status); | 1047 | card->reg_addr.r_offset = offsetof(struct mspro_register, status); |
969 | card->reg_addr.r_length = sizeof(struct ms_status_register); | 1048 | card->reg_addr.r_length = sizeof(struct ms_status_register); |
970 | card->reg_addr.w_offset = offsetof(struct mspro_register, param); | 1049 | card->reg_addr.w_offset = offsetof(struct mspro_register, param); |
@@ -973,7 +1052,7 @@ static int mspro_block_init_card(struct memstick_dev *card) | |||
973 | if (memstick_set_rw_addr(card)) | 1052 | if (memstick_set_rw_addr(card)) |
974 | return -EIO; | 1053 | return -EIO; |
975 | 1054 | ||
976 | if (host->caps & MEMSTICK_CAP_PARALLEL) { | 1055 | if (host->caps & MEMSTICK_CAP_PAR4) { |
977 | if (mspro_block_switch_to_parallel(card)) | 1056 | if (mspro_block_switch_to_parallel(card)) |
978 | printk(KERN_WARNING "%s: could not switch to " | 1057 | printk(KERN_WARNING "%s: could not switch to " |
979 | "parallel interface\n", card->dev.bus_id); | 1058 | "parallel interface\n", card->dev.bus_id); |
@@ -1348,4 +1427,3 @@ MODULE_LICENSE("GPL"); | |||
1348 | MODULE_AUTHOR("Alex Dubov"); | 1427 | MODULE_AUTHOR("Alex Dubov"); |
1349 | MODULE_DESCRIPTION("Sony MemoryStickPro block device driver"); | 1428 | MODULE_DESCRIPTION("Sony MemoryStickPro block device driver"); |
1350 | MODULE_DEVICE_TABLE(memstick, mspro_block_id_tbl); | 1429 | MODULE_DEVICE_TABLE(memstick, mspro_block_id_tbl); |
1351 | MODULE_VERSION(DRIVER_VERSION); | ||
diff --git a/drivers/memstick/host/Kconfig b/drivers/memstick/host/Kconfig index c002fcc3c879..4ce5c8dffb68 100644 --- a/drivers/memstick/host/Kconfig +++ b/drivers/memstick/host/Kconfig | |||
@@ -20,3 +20,13 @@ config MEMSTICK_TIFM_MS | |||
20 | To compile this driver as a module, choose M here: the | 20 | To compile this driver as a module, choose M here: the |
21 | module will be called tifm_ms. | 21 | module will be called tifm_ms. |
22 | 22 | ||
23 | config MEMSTICK_JMICRON_38X | ||
24 | tristate "JMicron JMB38X MemoryStick interface support (EXPERIMENTAL)" | ||
25 | depends on EXPERIMENTAL && PCI | ||
26 | |||
27 | help | ||
28 | Say Y here if you want to be able to access MemoryStick cards with | ||
29 | the JMicron(R) JMB38X MemoryStick card reader. | ||
30 | |||
31 | To compile this driver as a module, choose M here: the | ||
32 | module will be called jmb38x_ms. | ||
diff --git a/drivers/memstick/host/Makefile b/drivers/memstick/host/Makefile index ee666380efa1..12530e4311d3 100644 --- a/drivers/memstick/host/Makefile +++ b/drivers/memstick/host/Makefile | |||
@@ -3,8 +3,8 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | ifeq ($(CONFIG_MEMSTICK_DEBUG),y) | 5 | ifeq ($(CONFIG_MEMSTICK_DEBUG),y) |
6 | EXTRA_CFLAGS += -DDEBUG | 6 | EXTRA_CFLAGS += -DDEBUG |
7 | endif | 7 | endif |
8 | 8 | ||
9 | obj-$(CONFIG_MEMSTICK_TIFM_MS) += tifm_ms.o | 9 | obj-$(CONFIG_MEMSTICK_TIFM_MS) += tifm_ms.o |
10 | 10 | obj-$(CONFIG_MEMSTICK_JMICRON_38X) += jmb38x_ms.o | |
diff --git a/drivers/memstick/host/jmb38x_ms.c b/drivers/memstick/host/jmb38x_ms.c new file mode 100644 index 000000000000..03fe8783b1ee --- /dev/null +++ b/drivers/memstick/host/jmb38x_ms.c | |||
@@ -0,0 +1,945 @@ | |||
1 | /* | ||
2 | * jmb38x_ms.c - JMicron jmb38x MemoryStick card reader | ||
3 | * | ||
4 | * Copyright (C) 2008 Alex Dubov <oakad@yahoo.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #include <linux/spinlock.h> | ||
13 | #include <linux/interrupt.h> | ||
14 | #include <linux/pci.h> | ||
15 | #include <linux/delay.h> | ||
16 | #include <linux/highmem.h> | ||
17 | #include <linux/memstick.h> | ||
18 | |||
19 | #define DRIVER_NAME "jmb38x_ms" | ||
20 | |||
21 | static int no_dma; | ||
22 | module_param(no_dma, bool, 0644); | ||
23 | |||
24 | enum { | ||
25 | DMA_ADDRESS = 0x00, | ||
26 | BLOCK = 0x04, | ||
27 | DMA_CONTROL = 0x08, | ||
28 | TPC_P0 = 0x0c, | ||
29 | TPC_P1 = 0x10, | ||
30 | TPC = 0x14, | ||
31 | HOST_CONTROL = 0x18, | ||
32 | DATA = 0x1c, | ||
33 | STATUS = 0x20, | ||
34 | INT_STATUS = 0x24, | ||
35 | INT_STATUS_ENABLE = 0x28, | ||
36 | INT_SIGNAL_ENABLE = 0x2c, | ||
37 | TIMER = 0x30, | ||
38 | TIMER_CONTROL = 0x34, | ||
39 | PAD_OUTPUT_ENABLE = 0x38, | ||
40 | PAD_PU_PD = 0x3c, | ||
41 | CLOCK_DELAY = 0x40, | ||
42 | ADMA_ADDRESS = 0x44, | ||
43 | CLOCK_CONTROL = 0x48, | ||
44 | LED_CONTROL = 0x4c, | ||
45 | VERSION = 0x50 | ||
46 | }; | ||
47 | |||
48 | struct jmb38x_ms_host { | ||
49 | struct jmb38x_ms *chip; | ||
50 | void __iomem *addr; | ||
51 | spinlock_t lock; | ||
52 | int id; | ||
53 | char host_id[DEVICE_ID_SIZE]; | ||
54 | int irq; | ||
55 | unsigned int block_pos; | ||
56 | unsigned long timeout_jiffies; | ||
57 | struct timer_list timer; | ||
58 | struct memstick_request *req; | ||
59 | unsigned char eject:1, | ||
60 | use_dma:1; | ||
61 | unsigned char cmd_flags; | ||
62 | unsigned char io_pos; | ||
63 | unsigned int io_word[2]; | ||
64 | }; | ||
65 | |||
66 | struct jmb38x_ms { | ||
67 | struct pci_dev *pdev; | ||
68 | int host_cnt; | ||
69 | struct memstick_host *hosts[]; | ||
70 | }; | ||
71 | |||
72 | #define BLOCK_COUNT_MASK 0xffff0000 | ||
73 | #define BLOCK_SIZE_MASK 0x00000fff | ||
74 | |||
75 | #define DMA_CONTROL_ENABLE 0x00000001 | ||
76 | |||
77 | #define TPC_DATA_SEL 0x00008000 | ||
78 | #define TPC_DIR 0x00004000 | ||
79 | #define TPC_WAIT_INT 0x00002000 | ||
80 | #define TPC_GET_INT 0x00000800 | ||
81 | #define TPC_CODE_SZ_MASK 0x00000700 | ||
82 | #define TPC_DATA_SZ_MASK 0x00000007 | ||
83 | |||
84 | #define HOST_CONTROL_RESET_REQ 0x00008000 | ||
85 | #define HOST_CONTROL_REI 0x00004000 | ||
86 | #define HOST_CONTROL_LED 0x00000400 | ||
87 | #define HOST_CONTROL_FAST_CLK 0x00000200 | ||
88 | #define HOST_CONTROL_RESET 0x00000100 | ||
89 | #define HOST_CONTROL_POWER_EN 0x00000080 | ||
90 | #define HOST_CONTROL_CLOCK_EN 0x00000040 | ||
91 | #define HOST_CONTROL_IF_SHIFT 4 | ||
92 | |||
93 | #define HOST_CONTROL_IF_SERIAL 0x0 | ||
94 | #define HOST_CONTROL_IF_PAR4 0x1 | ||
95 | #define HOST_CONTROL_IF_PAR8 0x3 | ||
96 | |||
97 | #define STATUS_HAS_MEDIA 0x00000400 | ||
98 | #define STATUS_FIFO_EMPTY 0x00000200 | ||
99 | #define STATUS_FIFO_FULL 0x00000100 | ||
100 | |||
101 | #define INT_STATUS_TPC_ERR 0x00080000 | ||
102 | #define INT_STATUS_CRC_ERR 0x00040000 | ||
103 | #define INT_STATUS_TIMER_TO 0x00020000 | ||
104 | #define INT_STATUS_HSK_TO 0x00010000 | ||
105 | #define INT_STATUS_ANY_ERR 0x00008000 | ||
106 | #define INT_STATUS_FIFO_WRDY 0x00000080 | ||
107 | #define INT_STATUS_FIFO_RRDY 0x00000040 | ||
108 | #define INT_STATUS_MEDIA_OUT 0x00000010 | ||
109 | #define INT_STATUS_MEDIA_IN 0x00000008 | ||
110 | #define INT_STATUS_DMA_BOUNDARY 0x00000004 | ||
111 | #define INT_STATUS_EOTRAN 0x00000002 | ||
112 | #define INT_STATUS_EOTPC 0x00000001 | ||
113 | |||
114 | #define INT_STATUS_ALL 0x000f801f | ||
115 | |||
116 | #define PAD_OUTPUT_ENABLE_MS 0x0F3F | ||
117 | |||
118 | #define PAD_PU_PD_OFF 0x7FFF0000 | ||
119 | #define PAD_PU_PD_ON_MS_SOCK0 0x5f8f0000 | ||
120 | #define PAD_PU_PD_ON_MS_SOCK1 0x0f0f0000 | ||
121 | |||
122 | enum { | ||
123 | CMD_READY = 0x01, | ||
124 | FIFO_READY = 0x02, | ||
125 | REG_DATA = 0x04, | ||
126 | AUTO_GET_INT = 0x08 | ||
127 | }; | ||
128 | |||
129 | static unsigned int jmb38x_ms_read_data(struct jmb38x_ms_host *host, | ||
130 | unsigned char *buf, unsigned int length) | ||
131 | { | ||
132 | unsigned int off = 0; | ||
133 | |||
134 | while (host->io_pos && length) { | ||
135 | buf[off++] = host->io_word[0] & 0xff; | ||
136 | host->io_word[0] >>= 8; | ||
137 | length--; | ||
138 | host->io_pos--; | ||
139 | } | ||
140 | |||
141 | if (!length) | ||
142 | return off; | ||
143 | |||
144 | while (!(STATUS_FIFO_EMPTY & readl(host->addr + STATUS))) { | ||
145 | if (length < 4) | ||
146 | break; | ||
147 | *(unsigned int *)(buf + off) = __raw_readl(host->addr + DATA); | ||
148 | length -= 4; | ||
149 | off += 4; | ||
150 | } | ||
151 | |||
152 | if (length | ||
153 | && !(STATUS_FIFO_EMPTY & readl(host->addr + STATUS))) { | ||
154 | host->io_word[0] = readl(host->addr + DATA); | ||
155 | for (host->io_pos = 4; host->io_pos; --host->io_pos) { | ||
156 | buf[off++] = host->io_word[0] & 0xff; | ||
157 | host->io_word[0] >>= 8; | ||
158 | length--; | ||
159 | if (!length) | ||
160 | break; | ||
161 | } | ||
162 | } | ||
163 | |||
164 | return off; | ||
165 | } | ||
166 | |||
167 | static unsigned int jmb38x_ms_read_reg_data(struct jmb38x_ms_host *host, | ||
168 | unsigned char *buf, | ||
169 | unsigned int length) | ||
170 | { | ||
171 | unsigned int off = 0; | ||
172 | |||
173 | while (host->io_pos > 4 && length) { | ||
174 | buf[off++] = host->io_word[0] & 0xff; | ||
175 | host->io_word[0] >>= 8; | ||
176 | length--; | ||
177 | host->io_pos--; | ||
178 | } | ||
179 | |||
180 | if (!length) | ||
181 | return off; | ||
182 | |||
183 | while (host->io_pos && length) { | ||
184 | buf[off++] = host->io_word[1] & 0xff; | ||
185 | host->io_word[1] >>= 8; | ||
186 | length--; | ||
187 | host->io_pos--; | ||
188 | } | ||
189 | |||
190 | return off; | ||
191 | } | ||
192 | |||
193 | static unsigned int jmb38x_ms_write_data(struct jmb38x_ms_host *host, | ||
194 | unsigned char *buf, | ||
195 | unsigned int length) | ||
196 | { | ||
197 | unsigned int off = 0; | ||
198 | |||
199 | if (host->io_pos) { | ||
200 | while (host->io_pos < 4 && length) { | ||
201 | host->io_word[0] |= buf[off++] << (host->io_pos * 8); | ||
202 | host->io_pos++; | ||
203 | length--; | ||
204 | } | ||
205 | } | ||
206 | |||
207 | if (host->io_pos == 4 | ||
208 | && !(STATUS_FIFO_FULL & readl(host->addr + STATUS))) { | ||
209 | writel(host->io_word[0], host->addr + DATA); | ||
210 | host->io_pos = 0; | ||
211 | host->io_word[0] = 0; | ||
212 | } else if (host->io_pos) { | ||
213 | return off; | ||
214 | } | ||
215 | |||
216 | if (!length) | ||
217 | return off; | ||
218 | |||
219 | while (!(STATUS_FIFO_FULL & readl(host->addr + STATUS))) { | ||
220 | if (length < 4) | ||
221 | break; | ||
222 | |||
223 | __raw_writel(*(unsigned int *)(buf + off), | ||
224 | host->addr + DATA); | ||
225 | length -= 4; | ||
226 | off += 4; | ||
227 | } | ||
228 | |||
229 | switch (length) { | ||
230 | case 3: | ||
231 | host->io_word[0] |= buf[off + 2] << 16; | ||
232 | host->io_pos++; | ||
233 | case 2: | ||
234 | host->io_word[0] |= buf[off + 1] << 8; | ||
235 | host->io_pos++; | ||
236 | case 1: | ||
237 | host->io_word[0] |= buf[off]; | ||
238 | host->io_pos++; | ||
239 | } | ||
240 | |||
241 | off += host->io_pos; | ||
242 | |||
243 | return off; | ||
244 | } | ||
245 | |||
246 | static unsigned int jmb38x_ms_write_reg_data(struct jmb38x_ms_host *host, | ||
247 | unsigned char *buf, | ||
248 | unsigned int length) | ||
249 | { | ||
250 | unsigned int off = 0; | ||
251 | |||
252 | while (host->io_pos < 4 && length) { | ||
253 | host->io_word[0] &= ~(0xff << (host->io_pos * 8)); | ||
254 | host->io_word[0] |= buf[off++] << (host->io_pos * 8); | ||
255 | host->io_pos++; | ||
256 | length--; | ||
257 | } | ||
258 | |||
259 | if (!length) | ||
260 | return off; | ||
261 | |||
262 | while (host->io_pos < 8 && length) { | ||
263 | host->io_word[1] &= ~(0xff << (host->io_pos * 8)); | ||
264 | host->io_word[1] |= buf[off++] << (host->io_pos * 8); | ||
265 | host->io_pos++; | ||
266 | length--; | ||
267 | } | ||
268 | |||
269 | return off; | ||
270 | } | ||
271 | |||
272 | static int jmb38x_ms_transfer_data(struct jmb38x_ms_host *host) | ||
273 | { | ||
274 | unsigned int length; | ||
275 | unsigned int off; | ||
276 | unsigned int t_size, p_off, p_cnt; | ||
277 | unsigned char *buf; | ||
278 | struct page *pg; | ||
279 | unsigned long flags = 0; | ||
280 | |||
281 | if (host->req->long_data) { | ||
282 | length = host->req->sg.length - host->block_pos; | ||
283 | off = host->req->sg.offset + host->block_pos; | ||
284 | } else { | ||
285 | length = host->req->data_len - host->block_pos; | ||
286 | off = 0; | ||
287 | } | ||
288 | |||
289 | while (length) { | ||
290 | if (host->req->long_data) { | ||
291 | pg = nth_page(sg_page(&host->req->sg), | ||
292 | off >> PAGE_SHIFT); | ||
293 | p_off = offset_in_page(off); | ||
294 | p_cnt = PAGE_SIZE - p_off; | ||
295 | p_cnt = min(p_cnt, length); | ||
296 | |||
297 | local_irq_save(flags); | ||
298 | buf = kmap_atomic(pg, KM_BIO_SRC_IRQ) + p_off; | ||
299 | } else { | ||
300 | buf = host->req->data + host->block_pos; | ||
301 | p_cnt = host->req->data_len - host->block_pos; | ||
302 | } | ||
303 | |||
304 | if (host->req->data_dir == WRITE) | ||
305 | t_size = !(host->cmd_flags & REG_DATA) | ||
306 | ? jmb38x_ms_write_data(host, buf, p_cnt) | ||
307 | : jmb38x_ms_write_reg_data(host, buf, p_cnt); | ||
308 | else | ||
309 | t_size = !(host->cmd_flags & REG_DATA) | ||
310 | ? jmb38x_ms_read_data(host, buf, p_cnt) | ||
311 | : jmb38x_ms_read_reg_data(host, buf, p_cnt); | ||
312 | |||
313 | if (host->req->long_data) { | ||
314 | kunmap_atomic(buf - p_off, KM_BIO_SRC_IRQ); | ||
315 | local_irq_restore(flags); | ||
316 | } | ||
317 | |||
318 | if (!t_size) | ||
319 | break; | ||
320 | host->block_pos += t_size; | ||
321 | length -= t_size; | ||
322 | off += t_size; | ||
323 | } | ||
324 | |||
325 | if (!length && host->req->data_dir == WRITE) { | ||
326 | if (host->cmd_flags & REG_DATA) { | ||
327 | writel(host->io_word[0], host->addr + TPC_P0); | ||
328 | writel(host->io_word[1], host->addr + TPC_P1); | ||
329 | } else if (host->io_pos) { | ||
330 | writel(host->io_word[0], host->addr + DATA); | ||
331 | } | ||
332 | } | ||
333 | |||
334 | return length; | ||
335 | } | ||
336 | |||
337 | static int jmb38x_ms_issue_cmd(struct memstick_host *msh) | ||
338 | { | ||
339 | struct jmb38x_ms_host *host = memstick_priv(msh); | ||
340 | unsigned char *data; | ||
341 | unsigned int data_len, cmd, t_val; | ||
342 | |||
343 | if (!(STATUS_HAS_MEDIA & readl(host->addr + STATUS))) { | ||
344 | dev_dbg(msh->cdev.dev, "no media status\n"); | ||
345 | host->req->error = -ETIME; | ||
346 | return host->req->error; | ||
347 | } | ||
348 | |||
349 | dev_dbg(msh->cdev.dev, "control %08x\n", | ||
350 | readl(host->addr + HOST_CONTROL)); | ||
351 | dev_dbg(msh->cdev.dev, "status %08x\n", readl(host->addr + INT_STATUS)); | ||
352 | dev_dbg(msh->cdev.dev, "hstatus %08x\n", readl(host->addr + STATUS)); | ||
353 | |||
354 | host->cmd_flags = 0; | ||
355 | host->block_pos = 0; | ||
356 | host->io_pos = 0; | ||
357 | host->io_word[0] = 0; | ||
358 | host->io_word[1] = 0; | ||
359 | |||
360 | cmd = host->req->tpc << 16; | ||
361 | cmd |= TPC_DATA_SEL; | ||
362 | |||
363 | if (host->req->data_dir == READ) | ||
364 | cmd |= TPC_DIR; | ||
365 | if (host->req->need_card_int) | ||
366 | cmd |= TPC_WAIT_INT; | ||
367 | if (host->req->get_int_reg) | ||
368 | cmd |= TPC_GET_INT; | ||
369 | |||
370 | data = host->req->data; | ||
371 | |||
372 | host->use_dma = !no_dma; | ||
373 | |||
374 | if (host->req->long_data) { | ||
375 | data_len = host->req->sg.length; | ||
376 | } else { | ||
377 | data_len = host->req->data_len; | ||
378 | host->use_dma = 0; | ||
379 | } | ||
380 | |||
381 | if (data_len <= 8) { | ||
382 | cmd &= ~(TPC_DATA_SEL | 0xf); | ||
383 | host->cmd_flags |= REG_DATA; | ||
384 | cmd |= data_len & 0xf; | ||
385 | host->use_dma = 0; | ||
386 | } | ||
387 | |||
388 | if (host->use_dma) { | ||
389 | if (1 != pci_map_sg(host->chip->pdev, &host->req->sg, 1, | ||
390 | host->req->data_dir == READ | ||
391 | ? PCI_DMA_FROMDEVICE | ||
392 | : PCI_DMA_TODEVICE)) { | ||
393 | host->req->error = -ENOMEM; | ||
394 | return host->req->error; | ||
395 | } | ||
396 | data_len = sg_dma_len(&host->req->sg); | ||
397 | writel(sg_dma_address(&host->req->sg), | ||
398 | host->addr + DMA_ADDRESS); | ||
399 | writel(((1 << 16) & BLOCK_COUNT_MASK) | ||
400 | | (data_len & BLOCK_SIZE_MASK), | ||
401 | host->addr + BLOCK); | ||
402 | writel(DMA_CONTROL_ENABLE, host->addr + DMA_CONTROL); | ||
403 | } else if (!(host->cmd_flags & REG_DATA)) { | ||
404 | writel(((1 << 16) & BLOCK_COUNT_MASK) | ||
405 | | (data_len & BLOCK_SIZE_MASK), | ||
406 | host->addr + BLOCK); | ||
407 | t_val = readl(host->addr + INT_STATUS_ENABLE); | ||
408 | t_val |= host->req->data_dir == READ | ||
409 | ? INT_STATUS_FIFO_RRDY | ||
410 | : INT_STATUS_FIFO_WRDY; | ||
411 | |||
412 | writel(t_val, host->addr + INT_STATUS_ENABLE); | ||
413 | writel(t_val, host->addr + INT_SIGNAL_ENABLE); | ||
414 | } else { | ||
415 | cmd &= ~(TPC_DATA_SEL | 0xf); | ||
416 | host->cmd_flags |= REG_DATA; | ||
417 | cmd |= data_len & 0xf; | ||
418 | |||
419 | if (host->req->data_dir == WRITE) { | ||
420 | jmb38x_ms_transfer_data(host); | ||
421 | writel(host->io_word[0], host->addr + TPC_P0); | ||
422 | writel(host->io_word[1], host->addr + TPC_P1); | ||
423 | } | ||
424 | } | ||
425 | |||
426 | mod_timer(&host->timer, jiffies + host->timeout_jiffies); | ||
427 | writel(HOST_CONTROL_LED | readl(host->addr + HOST_CONTROL), | ||
428 | host->addr + HOST_CONTROL); | ||
429 | host->req->error = 0; | ||
430 | |||
431 | writel(cmd, host->addr + TPC); | ||
432 | dev_dbg(msh->cdev.dev, "executing TPC %08x, len %x\n", cmd, data_len); | ||
433 | |||
434 | return 0; | ||
435 | } | ||
436 | |||
437 | static void jmb38x_ms_complete_cmd(struct memstick_host *msh, int last) | ||
438 | { | ||
439 | struct jmb38x_ms_host *host = memstick_priv(msh); | ||
440 | unsigned int t_val = 0; | ||
441 | int rc; | ||
442 | |||
443 | del_timer(&host->timer); | ||
444 | |||
445 | dev_dbg(msh->cdev.dev, "c control %08x\n", | ||
446 | readl(host->addr + HOST_CONTROL)); | ||
447 | dev_dbg(msh->cdev.dev, "c status %08x\n", | ||
448 | readl(host->addr + INT_STATUS)); | ||
449 | dev_dbg(msh->cdev.dev, "c hstatus %08x\n", readl(host->addr + STATUS)); | ||
450 | |||
451 | if (host->req->get_int_reg) { | ||
452 | t_val = readl(host->addr + TPC_P0); | ||
453 | host->req->int_reg = (t_val & 0xff); | ||
454 | } | ||
455 | |||
456 | if (host->use_dma) { | ||
457 | writel(0, host->addr + DMA_CONTROL); | ||
458 | pci_unmap_sg(host->chip->pdev, &host->req->sg, 1, | ||
459 | host->req->data_dir == READ | ||
460 | ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE); | ||
461 | } else { | ||
462 | t_val = readl(host->addr + INT_STATUS_ENABLE); | ||
463 | if (host->req->data_dir == READ) | ||
464 | t_val &= ~INT_STATUS_FIFO_RRDY; | ||
465 | else | ||
466 | t_val &= ~INT_STATUS_FIFO_WRDY; | ||
467 | |||
468 | writel(t_val, host->addr + INT_STATUS_ENABLE); | ||
469 | writel(t_val, host->addr + INT_SIGNAL_ENABLE); | ||
470 | } | ||
471 | |||
472 | writel((~HOST_CONTROL_LED) & readl(host->addr + HOST_CONTROL), | ||
473 | host->addr + HOST_CONTROL); | ||
474 | |||
475 | if (!last) { | ||
476 | do { | ||
477 | rc = memstick_next_req(msh, &host->req); | ||
478 | } while (!rc && jmb38x_ms_issue_cmd(msh)); | ||
479 | } else { | ||
480 | do { | ||
481 | rc = memstick_next_req(msh, &host->req); | ||
482 | if (!rc) | ||
483 | host->req->error = -ETIME; | ||
484 | } while (!rc); | ||
485 | } | ||
486 | } | ||
487 | |||
488 | static irqreturn_t jmb38x_ms_isr(int irq, void *dev_id) | ||
489 | { | ||
490 | struct memstick_host *msh = dev_id; | ||
491 | struct jmb38x_ms_host *host = memstick_priv(msh); | ||
492 | unsigned int irq_status; | ||
493 | |||
494 | spin_lock(&host->lock); | ||
495 | irq_status = readl(host->addr + INT_STATUS); | ||
496 | dev_dbg(&host->chip->pdev->dev, "irq_status = %08x\n", irq_status); | ||
497 | if (irq_status == 0 || irq_status == (~0)) { | ||
498 | spin_unlock(&host->lock); | ||
499 | return IRQ_NONE; | ||
500 | } | ||
501 | |||
502 | if (host->req) { | ||
503 | if (irq_status & INT_STATUS_ANY_ERR) { | ||
504 | if (irq_status & INT_STATUS_CRC_ERR) | ||
505 | host->req->error = -EILSEQ; | ||
506 | else | ||
507 | host->req->error = -ETIME; | ||
508 | } else { | ||
509 | if (host->use_dma) { | ||
510 | if (irq_status & INT_STATUS_EOTRAN) | ||
511 | host->cmd_flags |= FIFO_READY; | ||
512 | } else { | ||
513 | if (irq_status & (INT_STATUS_FIFO_RRDY | ||
514 | | INT_STATUS_FIFO_WRDY)) | ||
515 | jmb38x_ms_transfer_data(host); | ||
516 | |||
517 | if (irq_status & INT_STATUS_EOTRAN) { | ||
518 | jmb38x_ms_transfer_data(host); | ||
519 | host->cmd_flags |= FIFO_READY; | ||
520 | } | ||
521 | } | ||
522 | |||
523 | if (irq_status & INT_STATUS_EOTPC) { | ||
524 | host->cmd_flags |= CMD_READY; | ||
525 | if (host->cmd_flags & REG_DATA) { | ||
526 | if (host->req->data_dir == READ) { | ||
527 | host->io_word[0] | ||
528 | = readl(host->addr | ||
529 | + TPC_P0); | ||
530 | host->io_word[1] | ||
531 | = readl(host->addr | ||
532 | + TPC_P1); | ||
533 | host->io_pos = 8; | ||
534 | |||
535 | jmb38x_ms_transfer_data(host); | ||
536 | } | ||
537 | host->cmd_flags |= FIFO_READY; | ||
538 | } | ||
539 | } | ||
540 | } | ||
541 | } | ||
542 | |||
543 | if (irq_status & (INT_STATUS_MEDIA_IN | INT_STATUS_MEDIA_OUT)) { | ||
544 | dev_dbg(&host->chip->pdev->dev, "media changed\n"); | ||
545 | memstick_detect_change(msh); | ||
546 | } | ||
547 | |||
548 | writel(irq_status, host->addr + INT_STATUS); | ||
549 | |||
550 | if (host->req | ||
551 | && (((host->cmd_flags & CMD_READY) | ||
552 | && (host->cmd_flags & FIFO_READY)) | ||
553 | || host->req->error)) | ||
554 | jmb38x_ms_complete_cmd(msh, 0); | ||
555 | |||
556 | spin_unlock(&host->lock); | ||
557 | return IRQ_HANDLED; | ||
558 | } | ||
559 | |||
560 | static void jmb38x_ms_abort(unsigned long data) | ||
561 | { | ||
562 | struct memstick_host *msh = (struct memstick_host *)data; | ||
563 | struct jmb38x_ms_host *host = memstick_priv(msh); | ||
564 | unsigned long flags; | ||
565 | |||
566 | dev_dbg(&host->chip->pdev->dev, "abort\n"); | ||
567 | spin_lock_irqsave(&host->lock, flags); | ||
568 | if (host->req) { | ||
569 | host->req->error = -ETIME; | ||
570 | jmb38x_ms_complete_cmd(msh, 0); | ||
571 | } | ||
572 | spin_unlock_irqrestore(&host->lock, flags); | ||
573 | } | ||
574 | |||
575 | static void jmb38x_ms_request(struct memstick_host *msh) | ||
576 | { | ||
577 | struct jmb38x_ms_host *host = memstick_priv(msh); | ||
578 | unsigned long flags; | ||
579 | int rc; | ||
580 | |||
581 | spin_lock_irqsave(&host->lock, flags); | ||
582 | if (host->req) { | ||
583 | spin_unlock_irqrestore(&host->lock, flags); | ||
584 | BUG(); | ||
585 | return; | ||
586 | } | ||
587 | |||
588 | do { | ||
589 | rc = memstick_next_req(msh, &host->req); | ||
590 | } while (!rc && jmb38x_ms_issue_cmd(msh)); | ||
591 | spin_unlock_irqrestore(&host->lock, flags); | ||
592 | } | ||
593 | |||
594 | static void jmb38x_ms_reset(struct jmb38x_ms_host *host) | ||
595 | { | ||
596 | unsigned int host_ctl = readl(host->addr + HOST_CONTROL); | ||
597 | |||
598 | writel(host_ctl | HOST_CONTROL_RESET_REQ | HOST_CONTROL_RESET, | ||
599 | host->addr + HOST_CONTROL); | ||
600 | |||
601 | while (HOST_CONTROL_RESET_REQ | ||
602 | & (host_ctl = readl(host->addr + HOST_CONTROL))) { | ||
603 | ndelay(100); | ||
604 | dev_dbg(&host->chip->pdev->dev, "reset\n"); | ||
605 | } | ||
606 | |||
607 | writel(INT_STATUS_ALL, host->addr + INT_STATUS_ENABLE); | ||
608 | writel(INT_STATUS_ALL, host->addr + INT_SIGNAL_ENABLE); | ||
609 | |||
610 | dev_dbg(&host->chip->pdev->dev, "reset\n"); | ||
611 | } | ||
612 | |||
613 | static void jmb38x_ms_set_param(struct memstick_host *msh, | ||
614 | enum memstick_param param, | ||
615 | int value) | ||
616 | { | ||
617 | struct jmb38x_ms_host *host = memstick_priv(msh); | ||
618 | unsigned int host_ctl; | ||
619 | unsigned long flags; | ||
620 | |||
621 | spin_lock_irqsave(&host->lock, flags); | ||
622 | |||
623 | switch (param) { | ||
624 | case MEMSTICK_POWER: | ||
625 | if (value == MEMSTICK_POWER_ON) { | ||
626 | jmb38x_ms_reset(host); | ||
627 | |||
628 | writel(host->id ? PAD_PU_PD_ON_MS_SOCK1 | ||
629 | : PAD_PU_PD_ON_MS_SOCK0, | ||
630 | host->addr + PAD_PU_PD); | ||
631 | |||
632 | writel(PAD_OUTPUT_ENABLE_MS, | ||
633 | host->addr + PAD_OUTPUT_ENABLE); | ||
634 | |||
635 | host_ctl = readl(host->addr + HOST_CONTROL); | ||
636 | host_ctl |= 7; | ||
637 | writel(host_ctl | (HOST_CONTROL_POWER_EN | ||
638 | | HOST_CONTROL_CLOCK_EN), | ||
639 | host->addr + HOST_CONTROL); | ||
640 | |||
641 | dev_dbg(&host->chip->pdev->dev, "power on\n"); | ||
642 | } else if (value == MEMSTICK_POWER_OFF) { | ||
643 | writel(readl(host->addr + HOST_CONTROL) | ||
644 | & ~(HOST_CONTROL_POWER_EN | ||
645 | | HOST_CONTROL_CLOCK_EN), | ||
646 | host->addr + HOST_CONTROL); | ||
647 | writel(0, host->addr + PAD_OUTPUT_ENABLE); | ||
648 | writel(PAD_PU_PD_OFF, host->addr + PAD_PU_PD); | ||
649 | dev_dbg(&host->chip->pdev->dev, "power off\n"); | ||
650 | } | ||
651 | break; | ||
652 | case MEMSTICK_INTERFACE: | ||
653 | /* jmb38x_ms_reset(host); */ | ||
654 | |||
655 | host_ctl = readl(host->addr + HOST_CONTROL); | ||
656 | host_ctl &= ~(3 << HOST_CONTROL_IF_SHIFT); | ||
657 | /* host_ctl |= 7; */ | ||
658 | |||
659 | if (value == MEMSTICK_SERIAL) { | ||
660 | host_ctl &= ~HOST_CONTROL_FAST_CLK; | ||
661 | host_ctl |= HOST_CONTROL_IF_SERIAL | ||
662 | << HOST_CONTROL_IF_SHIFT; | ||
663 | host_ctl |= HOST_CONTROL_REI; | ||
664 | writel(0, host->addr + CLOCK_DELAY); | ||
665 | } else if (value == MEMSTICK_PAR4) { | ||
666 | host_ctl |= HOST_CONTROL_FAST_CLK; | ||
667 | host_ctl |= HOST_CONTROL_IF_PAR4 | ||
668 | << HOST_CONTROL_IF_SHIFT; | ||
669 | host_ctl &= ~HOST_CONTROL_REI; | ||
670 | writel(4, host->addr + CLOCK_DELAY); | ||
671 | } else if (value == MEMSTICK_PAR8) { | ||
672 | host_ctl |= HOST_CONTROL_FAST_CLK; | ||
673 | host_ctl |= HOST_CONTROL_IF_PAR8 | ||
674 | << HOST_CONTROL_IF_SHIFT; | ||
675 | host_ctl &= ~HOST_CONTROL_REI; | ||
676 | writel(4, host->addr + CLOCK_DELAY); | ||
677 | } | ||
678 | writel(host_ctl, host->addr + HOST_CONTROL); | ||
679 | break; | ||
680 | }; | ||
681 | |||
682 | spin_unlock_irqrestore(&host->lock, flags); | ||
683 | } | ||
684 | |||
685 | #ifdef CONFIG_PM | ||
686 | |||
687 | static int jmb38x_ms_suspend(struct pci_dev *dev, pm_message_t state) | ||
688 | { | ||
689 | struct jmb38x_ms *jm = pci_get_drvdata(dev); | ||
690 | int cnt; | ||
691 | |||
692 | for (cnt = 0; cnt < jm->host_cnt; ++cnt) { | ||
693 | if (!jm->hosts[cnt]) | ||
694 | break; | ||
695 | memstick_suspend_host(jm->hosts[cnt]); | ||
696 | } | ||
697 | |||
698 | pci_save_state(dev); | ||
699 | pci_enable_wake(dev, pci_choose_state(dev, state), 0); | ||
700 | pci_disable_device(dev); | ||
701 | pci_set_power_state(dev, pci_choose_state(dev, state)); | ||
702 | return 0; | ||
703 | } | ||
704 | |||
705 | static int jmb38x_ms_resume(struct pci_dev *dev) | ||
706 | { | ||
707 | struct jmb38x_ms *jm = pci_get_drvdata(dev); | ||
708 | int rc; | ||
709 | |||
710 | pci_set_power_state(dev, PCI_D0); | ||
711 | pci_restore_state(dev); | ||
712 | rc = pci_enable_device(dev); | ||
713 | if (rc) | ||
714 | return rc; | ||
715 | pci_set_master(dev); | ||
716 | |||
717 | pci_read_config_dword(dev, 0xac, &rc); | ||
718 | pci_write_config_dword(dev, 0xac, rc | 0x00470000); | ||
719 | |||
720 | for (rc = 0; rc < jm->host_cnt; ++rc) { | ||
721 | if (!jm->hosts[rc]) | ||
722 | break; | ||
723 | memstick_resume_host(jm->hosts[rc]); | ||
724 | memstick_detect_change(jm->hosts[rc]); | ||
725 | } | ||
726 | |||
727 | return 0; | ||
728 | } | ||
729 | |||
730 | #else | ||
731 | |||
732 | #define jmb38x_ms_suspend NULL | ||
733 | #define jmb38x_ms_resume NULL | ||
734 | |||
735 | #endif /* CONFIG_PM */ | ||
736 | |||
737 | static int jmb38x_ms_count_slots(struct pci_dev *pdev) | ||
738 | { | ||
739 | int cnt, rc = 0; | ||
740 | |||
741 | for (cnt = 0; cnt < PCI_ROM_RESOURCE; ++cnt) { | ||
742 | if (!(IORESOURCE_MEM & pci_resource_flags(pdev, cnt))) | ||
743 | break; | ||
744 | |||
745 | if (256 != pci_resource_len(pdev, cnt)) | ||
746 | break; | ||
747 | |||
748 | ++rc; | ||
749 | } | ||
750 | return rc; | ||
751 | } | ||
752 | |||
753 | static struct memstick_host *jmb38x_ms_alloc_host(struct jmb38x_ms *jm, int cnt) | ||
754 | { | ||
755 | struct memstick_host *msh; | ||
756 | struct jmb38x_ms_host *host; | ||
757 | |||
758 | msh = memstick_alloc_host(sizeof(struct jmb38x_ms_host), | ||
759 | &jm->pdev->dev); | ||
760 | if (!msh) | ||
761 | return NULL; | ||
762 | |||
763 | host = memstick_priv(msh); | ||
764 | host->chip = jm; | ||
765 | host->addr = ioremap(pci_resource_start(jm->pdev, cnt), | ||
766 | pci_resource_len(jm->pdev, cnt)); | ||
767 | if (!host->addr) | ||
768 | goto err_out_free; | ||
769 | |||
770 | spin_lock_init(&host->lock); | ||
771 | host->id = cnt; | ||
772 | snprintf(host->host_id, DEVICE_ID_SIZE, DRIVER_NAME ":slot%d", | ||
773 | host->id); | ||
774 | host->irq = jm->pdev->irq; | ||
775 | host->timeout_jiffies = msecs_to_jiffies(4000); | ||
776 | msh->request = jmb38x_ms_request; | ||
777 | msh->set_param = jmb38x_ms_set_param; | ||
778 | /* | ||
779 | msh->caps = MEMSTICK_CAP_AUTO_GET_INT | MEMSTICK_CAP_PAR4 | ||
780 | | MEMSTICK_CAP_PAR8; | ||
781 | */ | ||
782 | msh->caps = MEMSTICK_CAP_PAR4 | MEMSTICK_CAP_PAR8; | ||
783 | |||
784 | setup_timer(&host->timer, jmb38x_ms_abort, (unsigned long)msh); | ||
785 | |||
786 | if (!request_irq(host->irq, jmb38x_ms_isr, IRQF_SHARED, host->host_id, | ||
787 | msh)) | ||
788 | return msh; | ||
789 | |||
790 | iounmap(host->addr); | ||
791 | err_out_free: | ||
792 | kfree(msh); | ||
793 | return NULL; | ||
794 | } | ||
795 | |||
796 | static void jmb38x_ms_free_host(struct memstick_host *msh) | ||
797 | { | ||
798 | struct jmb38x_ms_host *host = memstick_priv(msh); | ||
799 | |||
800 | free_irq(host->irq, msh); | ||
801 | iounmap(host->addr); | ||
802 | memstick_free_host(msh); | ||
803 | } | ||
804 | |||
805 | static int jmb38x_ms_probe(struct pci_dev *pdev, | ||
806 | const struct pci_device_id *dev_id) | ||
807 | { | ||
808 | struct jmb38x_ms *jm; | ||
809 | int pci_dev_busy = 0; | ||
810 | int rc, cnt; | ||
811 | |||
812 | rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); | ||
813 | if (rc) | ||
814 | return rc; | ||
815 | |||
816 | rc = pci_enable_device(pdev); | ||
817 | if (rc) | ||
818 | return rc; | ||
819 | |||
820 | pci_set_master(pdev); | ||
821 | |||
822 | rc = pci_request_regions(pdev, DRIVER_NAME); | ||
823 | if (rc) { | ||
824 | pci_dev_busy = 1; | ||
825 | goto err_out; | ||
826 | } | ||
827 | |||
828 | pci_read_config_dword(pdev, 0xac, &rc); | ||
829 | pci_write_config_dword(pdev, 0xac, rc | 0x00470000); | ||
830 | |||
831 | cnt = jmb38x_ms_count_slots(pdev); | ||
832 | if (!cnt) { | ||
833 | rc = -ENODEV; | ||
834 | pci_dev_busy = 1; | ||
835 | goto err_out; | ||
836 | } | ||
837 | |||
838 | jm = kzalloc(sizeof(struct jmb38x_ms) | ||
839 | + cnt * sizeof(struct memstick_host *), GFP_KERNEL); | ||
840 | if (!jm) { | ||
841 | rc = -ENOMEM; | ||
842 | goto err_out_int; | ||
843 | } | ||
844 | |||
845 | jm->pdev = pdev; | ||
846 | jm->host_cnt = cnt; | ||
847 | pci_set_drvdata(pdev, jm); | ||
848 | |||
849 | for (cnt = 0; cnt < jm->host_cnt; ++cnt) { | ||
850 | jm->hosts[cnt] = jmb38x_ms_alloc_host(jm, cnt); | ||
851 | if (!jm->hosts[cnt]) | ||
852 | break; | ||
853 | |||
854 | rc = memstick_add_host(jm->hosts[cnt]); | ||
855 | |||
856 | if (rc) { | ||
857 | jmb38x_ms_free_host(jm->hosts[cnt]); | ||
858 | jm->hosts[cnt] = NULL; | ||
859 | break; | ||
860 | } | ||
861 | } | ||
862 | |||
863 | if (cnt) | ||
864 | return 0; | ||
865 | |||
866 | rc = -ENODEV; | ||
867 | |||
868 | pci_set_drvdata(pdev, NULL); | ||
869 | kfree(jm); | ||
870 | err_out_int: | ||
871 | pci_release_regions(pdev); | ||
872 | err_out: | ||
873 | if (!pci_dev_busy) | ||
874 | pci_disable_device(pdev); | ||
875 | return rc; | ||
876 | } | ||
877 | |||
878 | static void jmb38x_ms_remove(struct pci_dev *dev) | ||
879 | { | ||
880 | struct jmb38x_ms *jm = pci_get_drvdata(dev); | ||
881 | struct jmb38x_ms_host *host; | ||
882 | int cnt; | ||
883 | unsigned long flags; | ||
884 | |||
885 | for (cnt = 0; cnt < jm->host_cnt; ++cnt) { | ||
886 | if (!jm->hosts[cnt]) | ||
887 | break; | ||
888 | |||
889 | host = memstick_priv(jm->hosts[cnt]); | ||
890 | |||
891 | writel(0, host->addr + INT_SIGNAL_ENABLE); | ||
892 | writel(0, host->addr + INT_STATUS_ENABLE); | ||
893 | mmiowb(); | ||
894 | dev_dbg(&jm->pdev->dev, "interrupts off\n"); | ||
895 | spin_lock_irqsave(&host->lock, flags); | ||
896 | if (host->req) { | ||
897 | host->req->error = -ETIME; | ||
898 | jmb38x_ms_complete_cmd(jm->hosts[cnt], 1); | ||
899 | } | ||
900 | spin_unlock_irqrestore(&host->lock, flags); | ||
901 | |||
902 | memstick_remove_host(jm->hosts[cnt]); | ||
903 | dev_dbg(&jm->pdev->dev, "host removed\n"); | ||
904 | |||
905 | jmb38x_ms_free_host(jm->hosts[cnt]); | ||
906 | } | ||
907 | |||
908 | pci_set_drvdata(dev, NULL); | ||
909 | pci_release_regions(dev); | ||
910 | pci_disable_device(dev); | ||
911 | kfree(jm); | ||
912 | } | ||
913 | |||
914 | static struct pci_device_id jmb38x_ms_id_tbl [] = { | ||
915 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB38X_MS, PCI_ANY_ID, | ||
916 | PCI_ANY_ID, 0, 0, 0 }, | ||
917 | { } | ||
918 | }; | ||
919 | |||
920 | static struct pci_driver jmb38x_ms_driver = { | ||
921 | .name = DRIVER_NAME, | ||
922 | .id_table = jmb38x_ms_id_tbl, | ||
923 | .probe = jmb38x_ms_probe, | ||
924 | .remove = jmb38x_ms_remove, | ||
925 | .suspend = jmb38x_ms_suspend, | ||
926 | .resume = jmb38x_ms_resume | ||
927 | }; | ||
928 | |||
929 | static int __init jmb38x_ms_init(void) | ||
930 | { | ||
931 | return pci_register_driver(&jmb38x_ms_driver); | ||
932 | } | ||
933 | |||
934 | static void __exit jmb38x_ms_exit(void) | ||
935 | { | ||
936 | pci_unregister_driver(&jmb38x_ms_driver); | ||
937 | } | ||
938 | |||
939 | MODULE_AUTHOR("Alex Dubov"); | ||
940 | MODULE_DESCRIPTION("JMicron jmb38x MemoryStick driver"); | ||
941 | MODULE_LICENSE("GPL"); | ||
942 | MODULE_DEVICE_TABLE(pci, jmb38x_ms_id_tbl); | ||
943 | |||
944 | module_init(jmb38x_ms_init); | ||
945 | module_exit(jmb38x_ms_exit); | ||
diff --git a/drivers/memstick/host/tifm_ms.c b/drivers/memstick/host/tifm_ms.c index 4fb24215bd95..2b5bf52a8302 100644 --- a/drivers/memstick/host/tifm_ms.c +++ b/drivers/memstick/host/tifm_ms.c | |||
@@ -20,293 +20,315 @@ | |||
20 | #include <asm/io.h> | 20 | #include <asm/io.h> |
21 | 21 | ||
22 | #define DRIVER_NAME "tifm_ms" | 22 | #define DRIVER_NAME "tifm_ms" |
23 | #define DRIVER_VERSION "0.1" | ||
24 | 23 | ||
25 | static int no_dma; | 24 | static int no_dma; |
26 | module_param(no_dma, bool, 0644); | 25 | module_param(no_dma, bool, 0644); |
27 | 26 | ||
28 | #define TIFM_MS_TIMEOUT 0x00100 | 27 | /* |
29 | #define TIFM_MS_BADCRC 0x00200 | 28 | * Some control bits of TIFM appear to conform to Sony's reference design, |
30 | #define TIFM_MS_EOTPC 0x01000 | 29 | * so I'm just assuming they all are. |
31 | #define TIFM_MS_INT 0x02000 | 30 | */ |
32 | |||
33 | /* The meaning of the bit majority in this constant is unknown. */ | ||
34 | #define TIFM_MS_SERIAL 0x04010 | ||
35 | 31 | ||
36 | #define TIFM_MS_SYS_LATCH 0x00100 | 32 | #define TIFM_MS_STAT_DRQ 0x04000 |
37 | #define TIFM_MS_SYS_NOT_RDY 0x00800 | 33 | #define TIFM_MS_STAT_MSINT 0x02000 |
38 | #define TIFM_MS_SYS_DATA 0x10000 | 34 | #define TIFM_MS_STAT_RDY 0x01000 |
35 | #define TIFM_MS_STAT_CRC 0x00200 | ||
36 | #define TIFM_MS_STAT_TOE 0x00100 | ||
37 | #define TIFM_MS_STAT_EMP 0x00020 | ||
38 | #define TIFM_MS_STAT_FUL 0x00010 | ||
39 | #define TIFM_MS_STAT_CED 0x00008 | ||
40 | #define TIFM_MS_STAT_ERR 0x00004 | ||
41 | #define TIFM_MS_STAT_BRQ 0x00002 | ||
42 | #define TIFM_MS_STAT_CNK 0x00001 | ||
43 | |||
44 | #define TIFM_MS_SYS_DMA 0x10000 | ||
45 | #define TIFM_MS_SYS_RESET 0x08000 | ||
46 | #define TIFM_MS_SYS_SRAC 0x04000 | ||
47 | #define TIFM_MS_SYS_INTEN 0x02000 | ||
48 | #define TIFM_MS_SYS_NOCRC 0x01000 | ||
49 | #define TIFM_MS_SYS_INTCLR 0x00800 | ||
50 | #define TIFM_MS_SYS_MSIEN 0x00400 | ||
51 | #define TIFM_MS_SYS_FCLR 0x00200 | ||
52 | #define TIFM_MS_SYS_FDIR 0x00100 | ||
53 | #define TIFM_MS_SYS_DAM 0x00080 | ||
54 | #define TIFM_MS_SYS_DRM 0x00040 | ||
55 | #define TIFM_MS_SYS_DRQSL 0x00020 | ||
56 | #define TIFM_MS_SYS_REI 0x00010 | ||
57 | #define TIFM_MS_SYS_REO 0x00008 | ||
58 | #define TIFM_MS_SYS_BSY_MASK 0x00007 | ||
59 | |||
60 | #define TIFM_MS_SYS_FIFO (TIFM_MS_SYS_INTEN | TIFM_MS_SYS_MSIEN \ | ||
61 | | TIFM_MS_SYS_FCLR | TIFM_MS_SYS_BSY_MASK) | ||
39 | 62 | ||
40 | /* Hardware flags */ | 63 | /* Hardware flags */ |
41 | enum { | 64 | enum { |
42 | CMD_READY = 0x0001, | 65 | CMD_READY = 0x01, |
43 | FIFO_READY = 0x0002, | 66 | FIFO_READY = 0x02, |
44 | CARD_READY = 0x0004, | 67 | CARD_INT = 0x04 |
45 | DATA_CARRY = 0x0008 | ||
46 | }; | 68 | }; |
47 | 69 | ||
48 | struct tifm_ms { | 70 | struct tifm_ms { |
49 | struct tifm_dev *dev; | 71 | struct tifm_dev *dev; |
50 | unsigned short eject:1, | 72 | struct timer_list timer; |
51 | no_dma:1; | 73 | struct memstick_request *req; |
52 | unsigned short cmd_flags; | ||
53 | unsigned int mode_mask; | 74 | unsigned int mode_mask; |
54 | unsigned int block_pos; | 75 | unsigned int block_pos; |
55 | unsigned long timeout_jiffies; | 76 | unsigned long timeout_jiffies; |
56 | 77 | unsigned char eject:1, | |
57 | struct timer_list timer; | 78 | use_dma:1; |
58 | struct memstick_request *req; | 79 | unsigned char cmd_flags; |
80 | unsigned char io_pos; | ||
59 | unsigned int io_word; | 81 | unsigned int io_word; |
60 | }; | 82 | }; |
61 | 83 | ||
62 | static void tifm_ms_read_fifo(struct tifm_ms *host, unsigned int fifo_offset, | 84 | static unsigned int tifm_ms_read_data(struct tifm_ms *host, |
63 | struct page *pg, unsigned int page_off, | 85 | unsigned char *buf, unsigned int length) |
64 | unsigned int length) | ||
65 | { | 86 | { |
66 | struct tifm_dev *sock = host->dev; | 87 | struct tifm_dev *sock = host->dev; |
67 | unsigned int cnt = 0, off = 0; | 88 | unsigned int off = 0; |
68 | unsigned char *buf = kmap_atomic(pg, KM_BIO_DST_IRQ) + page_off; | 89 | |
90 | while (host->io_pos && length) { | ||
91 | buf[off++] = host->io_word & 0xff; | ||
92 | host->io_word >>= 8; | ||
93 | length--; | ||
94 | host->io_pos--; | ||
95 | } | ||
69 | 96 | ||
70 | if (host->cmd_flags & DATA_CARRY) { | 97 | if (!length) |
71 | while ((fifo_offset & 3) && length) { | 98 | return off; |
99 | |||
100 | while (!(TIFM_MS_STAT_EMP & readl(sock->addr + SOCK_MS_STATUS))) { | ||
101 | if (length < 4) | ||
102 | break; | ||
103 | *(unsigned int *)(buf + off) = __raw_readl(sock->addr | ||
104 | + SOCK_MS_DATA); | ||
105 | length -= 4; | ||
106 | off += 4; | ||
107 | } | ||
108 | |||
109 | if (length | ||
110 | && !(TIFM_MS_STAT_EMP & readl(sock->addr + SOCK_MS_STATUS))) { | ||
111 | host->io_word = readl(sock->addr + SOCK_MS_DATA); | ||
112 | for (host->io_pos = 4; host->io_pos; --host->io_pos) { | ||
72 | buf[off++] = host->io_word & 0xff; | 113 | buf[off++] = host->io_word & 0xff; |
73 | host->io_word >>= 8; | 114 | host->io_word >>= 8; |
74 | length--; | 115 | length--; |
75 | fifo_offset++; | 116 | if (!length) |
117 | break; | ||
76 | } | 118 | } |
77 | if (!(fifo_offset & 3)) | ||
78 | host->cmd_flags &= ~DATA_CARRY; | ||
79 | if (!length) | ||
80 | return; | ||
81 | } | 119 | } |
82 | 120 | ||
83 | do { | 121 | return off; |
84 | host->io_word = readl(sock->addr + SOCK_FIFO_ACCESS | ||
85 | + fifo_offset); | ||
86 | cnt = 4; | ||
87 | while (length && cnt) { | ||
88 | buf[off++] = (host->io_word >> 8) & 0xff; | ||
89 | cnt--; | ||
90 | length--; | ||
91 | } | ||
92 | fifo_offset += 4 - cnt; | ||
93 | } while (length); | ||
94 | |||
95 | if (cnt) | ||
96 | host->cmd_flags |= DATA_CARRY; | ||
97 | |||
98 | kunmap_atomic(buf - page_off, KM_BIO_DST_IRQ); | ||
99 | } | 122 | } |
100 | 123 | ||
101 | static void tifm_ms_write_fifo(struct tifm_ms *host, unsigned int fifo_offset, | 124 | static unsigned int tifm_ms_write_data(struct tifm_ms *host, |
102 | struct page *pg, unsigned int page_off, | 125 | unsigned char *buf, unsigned int length) |
103 | unsigned int length) | ||
104 | { | 126 | { |
105 | struct tifm_dev *sock = host->dev; | 127 | struct tifm_dev *sock = host->dev; |
106 | unsigned int cnt = 0, off = 0; | 128 | unsigned int off = 0; |
107 | unsigned char *buf = kmap_atomic(pg, KM_BIO_SRC_IRQ) + page_off; | ||
108 | 129 | ||
109 | if (host->cmd_flags & DATA_CARRY) { | 130 | if (host->io_pos) { |
110 | while (fifo_offset & 3) { | 131 | while (host->io_pos < 4 && length) { |
111 | host->io_word |= buf[off++] << (8 * (fifo_offset & 3)); | 132 | host->io_word |= buf[off++] << (host->io_pos * 8); |
133 | host->io_pos++; | ||
112 | length--; | 134 | length--; |
113 | fifo_offset++; | ||
114 | } | 135 | } |
115 | if (!(fifo_offset & 3)) { | ||
116 | writel(host->io_word, sock->addr + SOCK_FIFO_ACCESS | ||
117 | + fifo_offset - 4); | ||
118 | |||
119 | host->cmd_flags &= ~DATA_CARRY; | ||
120 | } | ||
121 | if (!length) | ||
122 | return; | ||
123 | } | 136 | } |
124 | 137 | ||
125 | do { | 138 | if (host->io_pos == 4 |
126 | cnt = 4; | 139 | && !(TIFM_MS_STAT_FUL & readl(sock->addr + SOCK_MS_STATUS))) { |
140 | writel(TIFM_MS_SYS_FDIR | readl(sock->addr + SOCK_MS_SYSTEM), | ||
141 | sock->addr + SOCK_MS_SYSTEM); | ||
142 | writel(host->io_word, sock->addr + SOCK_MS_DATA); | ||
143 | host->io_pos = 0; | ||
127 | host->io_word = 0; | 144 | host->io_word = 0; |
128 | while (length && cnt) { | 145 | } else if (host->io_pos) { |
129 | host->io_word |= buf[off++] << (4 - cnt); | 146 | return off; |
130 | cnt--; | 147 | } |
131 | length--; | ||
132 | } | ||
133 | fifo_offset += 4 - cnt; | ||
134 | if (!cnt) | ||
135 | writel(host->io_word, sock->addr + SOCK_FIFO_ACCESS | ||
136 | + fifo_offset - 4); | ||
137 | |||
138 | } while (length); | ||
139 | |||
140 | if (cnt) | ||
141 | host->cmd_flags |= DATA_CARRY; | ||
142 | 148 | ||
143 | kunmap_atomic(buf - page_off, KM_BIO_SRC_IRQ); | 149 | if (!length) |
144 | } | 150 | return off; |
145 | 151 | ||
146 | static void tifm_ms_move_block(struct tifm_ms *host, unsigned int length) | 152 | while (!(TIFM_MS_STAT_FUL & readl(sock->addr + SOCK_MS_STATUS))) { |
147 | { | 153 | if (length < 4) |
148 | unsigned int t_size; | 154 | break; |
149 | unsigned int off = host->req->sg.offset + host->block_pos; | 155 | writel(TIFM_MS_SYS_FDIR | readl(sock->addr + SOCK_MS_SYSTEM), |
150 | unsigned int p_off, p_cnt; | 156 | sock->addr + SOCK_MS_SYSTEM); |
151 | struct page *pg; | 157 | __raw_writel(*(unsigned int *)(buf + off), |
152 | unsigned long flags; | 158 | sock->addr + SOCK_MS_DATA); |
159 | length -= 4; | ||
160 | off += 4; | ||
161 | } | ||
153 | 162 | ||
154 | dev_dbg(&host->dev->dev, "moving block\n"); | 163 | switch (length) { |
155 | local_irq_save(flags); | 164 | case 3: |
156 | t_size = length; | 165 | host->io_word |= buf[off + 2] << 16; |
157 | while (t_size) { | 166 | host->io_pos++; |
158 | pg = nth_page(sg_page(&host->req->sg), off >> PAGE_SHIFT); | 167 | case 2: |
159 | p_off = offset_in_page(off); | 168 | host->io_word |= buf[off + 1] << 8; |
160 | p_cnt = PAGE_SIZE - p_off; | 169 | host->io_pos++; |
161 | p_cnt = min(p_cnt, t_size); | 170 | case 1: |
171 | host->io_word |= buf[off]; | ||
172 | host->io_pos++; | ||
173 | } | ||
162 | 174 | ||
163 | if (host->req->data_dir == WRITE) | 175 | off += host->io_pos; |
164 | tifm_ms_write_fifo(host, length - t_size, | ||
165 | pg, p_off, p_cnt); | ||
166 | else | ||
167 | tifm_ms_read_fifo(host, length - t_size, | ||
168 | pg, p_off, p_cnt); | ||
169 | 176 | ||
170 | t_size -= p_cnt; | 177 | return off; |
171 | } | ||
172 | local_irq_restore(flags); | ||
173 | } | 178 | } |
174 | 179 | ||
175 | static int tifm_ms_transfer_data(struct tifm_ms *host, int skip) | 180 | static unsigned int tifm_ms_transfer_data(struct tifm_ms *host) |
176 | { | 181 | { |
177 | struct tifm_dev *sock = host->dev; | 182 | struct tifm_dev *sock = host->dev; |
178 | unsigned int length = host->req->sg.length - host->block_pos; | 183 | unsigned int length; |
184 | unsigned int off; | ||
185 | unsigned int t_size, p_off, p_cnt; | ||
186 | unsigned char *buf; | ||
187 | struct page *pg; | ||
188 | unsigned long flags = 0; | ||
189 | |||
190 | if (host->req->long_data) { | ||
191 | length = host->req->sg.length - host->block_pos; | ||
192 | off = host->req->sg.offset + host->block_pos; | ||
193 | } else { | ||
194 | length = host->req->data_len - host->block_pos; | ||
195 | off = 0; | ||
196 | } | ||
197 | dev_dbg(&sock->dev, "fifo data transfer, %d, %d\n", length, | ||
198 | host->block_pos); | ||
199 | |||
200 | while (length) { | ||
201 | if (host->req->long_data) { | ||
202 | pg = nth_page(sg_page(&host->req->sg), | ||
203 | off >> PAGE_SHIFT); | ||
204 | p_off = offset_in_page(off); | ||
205 | p_cnt = PAGE_SIZE - p_off; | ||
206 | p_cnt = min(p_cnt, length); | ||
207 | |||
208 | local_irq_save(flags); | ||
209 | buf = kmap_atomic(pg, KM_BIO_SRC_IRQ) + p_off; | ||
210 | } else { | ||
211 | buf = host->req->data + host->block_pos; | ||
212 | p_cnt = host->req->data_len - host->block_pos; | ||
213 | } | ||
179 | 214 | ||
180 | if (!length) | 215 | t_size = host->req->data_dir == WRITE |
181 | return 1; | 216 | ? tifm_ms_write_data(host, buf, p_cnt) |
217 | : tifm_ms_read_data(host, buf, p_cnt); | ||
182 | 218 | ||
183 | if (length > TIFM_FIFO_SIZE) | 219 | if (host->req->long_data) { |
184 | length = TIFM_FIFO_SIZE; | 220 | kunmap_atomic(buf - p_off, KM_BIO_SRC_IRQ); |
221 | local_irq_restore(flags); | ||
222 | } | ||
185 | 223 | ||
186 | if (!skip) { | 224 | if (!t_size) |
187 | tifm_ms_move_block(host, length); | 225 | break; |
188 | host->block_pos += length; | 226 | host->block_pos += t_size; |
227 | length -= t_size; | ||
228 | off += t_size; | ||
189 | } | 229 | } |
190 | 230 | ||
191 | if ((host->req->data_dir == READ) | 231 | dev_dbg(&sock->dev, "fifo data transfer, %d remaining\n", length); |
192 | && (host->block_pos == host->req->sg.length)) | 232 | if (!length && (host->req->data_dir == WRITE)) { |
193 | return 1; | 233 | if (host->io_pos) { |
194 | 234 | writel(TIFM_MS_SYS_FDIR | |
195 | writel(ilog2(length) - 2, sock->addr + SOCK_FIFO_PAGE_SIZE); | 235 | | readl(sock->addr + SOCK_MS_SYSTEM), |
196 | if (host->req->data_dir == WRITE) | 236 | sock->addr + SOCK_MS_SYSTEM); |
197 | writel((1 << 8) | TIFM_DMA_TX, sock->addr + SOCK_DMA_CONTROL); | 237 | writel(host->io_word, sock->addr + SOCK_MS_DATA); |
198 | else | 238 | } |
199 | writel((1 << 8), sock->addr + SOCK_DMA_CONTROL); | 239 | writel(TIFM_MS_SYS_FDIR |
240 | | readl(sock->addr + SOCK_MS_SYSTEM), | ||
241 | sock->addr + SOCK_MS_SYSTEM); | ||
242 | writel(0, sock->addr + SOCK_MS_DATA); | ||
243 | } else { | ||
244 | readl(sock->addr + SOCK_MS_DATA); | ||
245 | } | ||
200 | 246 | ||
201 | return 0; | 247 | return length; |
202 | } | 248 | } |
203 | 249 | ||
204 | static int tifm_ms_issue_cmd(struct tifm_ms *host) | 250 | static int tifm_ms_issue_cmd(struct tifm_ms *host) |
205 | { | 251 | { |
206 | struct tifm_dev *sock = host->dev; | 252 | struct tifm_dev *sock = host->dev; |
207 | unsigned char *data; | 253 | unsigned char *data; |
208 | unsigned int data_len = 0, cmd = 0, cmd_mask = 0, cnt, tval = 0; | 254 | unsigned int data_len, cmd, sys_param; |
209 | 255 | ||
210 | host->cmd_flags = 0; | 256 | host->cmd_flags = 0; |
257 | host->block_pos = 0; | ||
258 | host->io_pos = 0; | ||
259 | host->io_word = 0; | ||
260 | host->cmd_flags = 0; | ||
211 | 261 | ||
212 | if (host->req->io_type == MEMSTICK_IO_SG) { | 262 | data = host->req->data; |
213 | if (!host->no_dma) { | ||
214 | if (1 != tifm_map_sg(sock, &host->req->sg, 1, | ||
215 | host->req->data_dir == READ | ||
216 | ? PCI_DMA_FROMDEVICE | ||
217 | : PCI_DMA_TODEVICE)) { | ||
218 | host->req->error = -ENOMEM; | ||
219 | return host->req->error; | ||
220 | } | ||
221 | data_len = sg_dma_len(&host->req->sg); | ||
222 | } else | ||
223 | data_len = host->req->sg.length; | ||
224 | |||
225 | writel(TIFM_FIFO_INT_SETALL, | ||
226 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR); | ||
227 | writel(TIFM_FIFO_ENABLE, | ||
228 | sock->addr + SOCK_FIFO_CONTROL); | ||
229 | writel(TIFM_FIFO_INTMASK, | ||
230 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET); | ||
231 | 263 | ||
232 | if (!host->no_dma) { | 264 | host->use_dma = !no_dma; |
233 | writel(ilog2(data_len) - 2, | ||
234 | sock->addr + SOCK_FIFO_PAGE_SIZE); | ||
235 | writel(sg_dma_address(&host->req->sg), | ||
236 | sock->addr + SOCK_DMA_ADDRESS); | ||
237 | if (host->req->data_dir == WRITE) | ||
238 | writel((1 << 8) | TIFM_DMA_TX | TIFM_DMA_EN, | ||
239 | sock->addr + SOCK_DMA_CONTROL); | ||
240 | else | ||
241 | writel((1 << 8) | TIFM_DMA_EN, | ||
242 | sock->addr + SOCK_DMA_CONTROL); | ||
243 | } else { | ||
244 | tifm_ms_transfer_data(host, | ||
245 | host->req->data_dir == READ); | ||
246 | } | ||
247 | 265 | ||
248 | cmd_mask = readl(sock->addr + SOCK_MS_SYSTEM); | 266 | if (host->req->long_data) { |
249 | cmd_mask |= TIFM_MS_SYS_DATA | TIFM_MS_SYS_NOT_RDY; | 267 | data_len = host->req->sg.length; |
250 | writel(cmd_mask, sock->addr + SOCK_MS_SYSTEM); | 268 | if (!is_power_of_2(data_len)) |
251 | } else if (host->req->io_type == MEMSTICK_IO_VAL) { | 269 | host->use_dma = 0; |
252 | data = host->req->data; | 270 | } else { |
253 | data_len = host->req->data_len; | 271 | data_len = host->req->data_len; |
272 | host->use_dma = 0; | ||
273 | } | ||
254 | 274 | ||
255 | cmd_mask = host->mode_mask | 0x2607; /* unknown constant */ | 275 | writel(TIFM_FIFO_INT_SETALL, |
256 | 276 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR); | |
257 | if (host->req->data_dir == WRITE) { | 277 | writel(TIFM_FIFO_ENABLE, |
258 | cmd_mask |= TIFM_MS_SYS_LATCH; | 278 | sock->addr + SOCK_FIFO_CONTROL); |
259 | writel(cmd_mask, sock->addr + SOCK_MS_SYSTEM); | 279 | |
260 | for (cnt = 0; (data_len - cnt) >= 4; cnt += 4) { | 280 | if (host->use_dma) { |
261 | writel(TIFM_MS_SYS_LATCH | 281 | if (1 != tifm_map_sg(sock, &host->req->sg, 1, |
262 | | readl(sock->addr + SOCK_MS_SYSTEM), | 282 | host->req->data_dir == READ |
263 | sock->addr + SOCK_MS_SYSTEM); | 283 | ? PCI_DMA_FROMDEVICE |
264 | __raw_writel(*(unsigned int *)(data + cnt), | 284 | : PCI_DMA_TODEVICE)) { |
265 | sock->addr + SOCK_MS_DATA); | 285 | host->req->error = -ENOMEM; |
266 | dev_dbg(&sock->dev, "writing %x\n", | 286 | return host->req->error; |
267 | *(int *)(data + cnt)); | 287 | } |
268 | } | 288 | data_len = sg_dma_len(&host->req->sg); |
269 | switch (data_len - cnt) { | ||
270 | case 3: | ||
271 | tval |= data[cnt + 2] << 16; | ||
272 | case 2: | ||
273 | tval |= data[cnt + 1] << 8; | ||
274 | case 1: | ||
275 | tval |= data[cnt]; | ||
276 | writel(TIFM_MS_SYS_LATCH | ||
277 | | readl(sock->addr + SOCK_MS_SYSTEM), | ||
278 | sock->addr + SOCK_MS_SYSTEM); | ||
279 | writel(tval, sock->addr + SOCK_MS_DATA); | ||
280 | dev_dbg(&sock->dev, "writing %x\n", tval); | ||
281 | } | ||
282 | 289 | ||
283 | writel(TIFM_MS_SYS_LATCH | 290 | writel(ilog2(data_len) - 2, |
284 | | readl(sock->addr + SOCK_MS_SYSTEM), | 291 | sock->addr + SOCK_FIFO_PAGE_SIZE); |
285 | sock->addr + SOCK_MS_SYSTEM); | 292 | writel(TIFM_FIFO_INTMASK, |
286 | writel(0, sock->addr + SOCK_MS_DATA); | 293 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET); |
287 | dev_dbg(&sock->dev, "writing %x\n", 0); | 294 | sys_param = TIFM_DMA_EN | (1 << 8); |
295 | if (host->req->data_dir == WRITE) | ||
296 | sys_param |= TIFM_DMA_TX; | ||
297 | |||
298 | writel(TIFM_FIFO_INTMASK, | ||
299 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET); | ||
288 | 300 | ||
289 | } else | 301 | writel(sg_dma_address(&host->req->sg), |
290 | writel(cmd_mask, sock->addr + SOCK_MS_SYSTEM); | 302 | sock->addr + SOCK_DMA_ADDRESS); |
303 | writel(sys_param, sock->addr + SOCK_DMA_CONTROL); | ||
304 | } else { | ||
305 | writel(host->mode_mask | TIFM_MS_SYS_FIFO, | ||
306 | sock->addr + SOCK_MS_SYSTEM); | ||
291 | 307 | ||
292 | cmd_mask = readl(sock->addr + SOCK_MS_SYSTEM); | 308 | writel(TIFM_FIFO_MORE, |
293 | cmd_mask &= ~TIFM_MS_SYS_DATA; | 309 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET); |
294 | cmd_mask |= TIFM_MS_SYS_NOT_RDY; | 310 | } |
295 | dev_dbg(&sock->dev, "mask %x\n", cmd_mask); | ||
296 | writel(cmd_mask, sock->addr + SOCK_MS_SYSTEM); | ||
297 | } else | ||
298 | BUG(); | ||
299 | 311 | ||
300 | mod_timer(&host->timer, jiffies + host->timeout_jiffies); | 312 | mod_timer(&host->timer, jiffies + host->timeout_jiffies); |
301 | writel(TIFM_CTRL_LED | readl(sock->addr + SOCK_CONTROL), | 313 | writel(TIFM_CTRL_LED | readl(sock->addr + SOCK_CONTROL), |
302 | sock->addr + SOCK_CONTROL); | 314 | sock->addr + SOCK_CONTROL); |
303 | host->req->error = 0; | 315 | host->req->error = 0; |
304 | 316 | ||
317 | sys_param = readl(sock->addr + SOCK_MS_SYSTEM); | ||
318 | sys_param |= TIFM_MS_SYS_INTCLR; | ||
319 | |||
320 | if (host->use_dma) | ||
321 | sys_param |= TIFM_MS_SYS_DMA; | ||
322 | else | ||
323 | sys_param &= ~TIFM_MS_SYS_DMA; | ||
324 | |||
325 | writel(sys_param, sock->addr + SOCK_MS_SYSTEM); | ||
326 | |||
305 | cmd = (host->req->tpc & 0xf) << 12; | 327 | cmd = (host->req->tpc & 0xf) << 12; |
306 | cmd |= data_len; | 328 | cmd |= data_len; |
307 | writel(cmd, sock->addr + SOCK_MS_COMMAND); | 329 | writel(cmd, sock->addr + SOCK_MS_COMMAND); |
308 | 330 | ||
309 | dev_dbg(&sock->dev, "executing TPC %x, %x\n", cmd, cmd_mask); | 331 | dev_dbg(&sock->dev, "executing TPC %x, %x\n", cmd, sys_param); |
310 | return 0; | 332 | return 0; |
311 | } | 333 | } |
312 | 334 | ||
@@ -314,47 +336,20 @@ static void tifm_ms_complete_cmd(struct tifm_ms *host) | |||
314 | { | 336 | { |
315 | struct tifm_dev *sock = host->dev; | 337 | struct tifm_dev *sock = host->dev; |
316 | struct memstick_host *msh = tifm_get_drvdata(sock); | 338 | struct memstick_host *msh = tifm_get_drvdata(sock); |
317 | unsigned int tval = 0, data_len; | ||
318 | unsigned char *data; | ||
319 | int rc; | 339 | int rc; |
320 | 340 | ||
321 | del_timer(&host->timer); | 341 | del_timer(&host->timer); |
322 | if (host->req->io_type == MEMSTICK_IO_SG) { | ||
323 | if (!host->no_dma) | ||
324 | tifm_unmap_sg(sock, &host->req->sg, 1, | ||
325 | host->req->data_dir == READ | ||
326 | ? PCI_DMA_FROMDEVICE | ||
327 | : PCI_DMA_TODEVICE); | ||
328 | } else if (host->req->io_type == MEMSTICK_IO_VAL) { | ||
329 | writel(~TIFM_MS_SYS_DATA & readl(sock->addr + SOCK_MS_SYSTEM), | ||
330 | sock->addr + SOCK_MS_SYSTEM); | ||
331 | |||
332 | data = host->req->data; | ||
333 | data_len = host->req->data_len; | ||
334 | 342 | ||
335 | if (host->req->data_dir == READ) { | 343 | if (host->use_dma) |
336 | for (rc = 0; (data_len - rc) >= 4; rc += 4) | 344 | tifm_unmap_sg(sock, &host->req->sg, 1, |
337 | *(int *)(data + rc) | 345 | host->req->data_dir == READ |
338 | = __raw_readl(sock->addr | 346 | ? PCI_DMA_FROMDEVICE |
339 | + SOCK_MS_DATA); | 347 | : PCI_DMA_TODEVICE); |
340 | |||
341 | if (data_len - rc) | ||
342 | tval = readl(sock->addr + SOCK_MS_DATA); | ||
343 | switch (data_len - rc) { | ||
344 | case 3: | ||
345 | data[rc + 2] = (tval >> 16) & 0xff; | ||
346 | case 2: | ||
347 | data[rc + 1] = (tval >> 8) & 0xff; | ||
348 | case 1: | ||
349 | data[rc] = tval & 0xff; | ||
350 | } | ||
351 | readl(sock->addr + SOCK_MS_DATA); | ||
352 | } | ||
353 | } | ||
354 | 348 | ||
355 | writel((~TIFM_CTRL_LED) & readl(sock->addr + SOCK_CONTROL), | 349 | writel((~TIFM_CTRL_LED) & readl(sock->addr + SOCK_CONTROL), |
356 | sock->addr + SOCK_CONTROL); | 350 | sock->addr + SOCK_CONTROL); |
357 | 351 | ||
352 | dev_dbg(&sock->dev, "TPC complete\n"); | ||
358 | do { | 353 | do { |
359 | rc = memstick_next_req(msh, &host->req); | 354 | rc = memstick_next_req(msh, &host->req); |
360 | } while (!rc && tifm_ms_issue_cmd(host)); | 355 | } while (!rc && tifm_ms_issue_cmd(host)); |
@@ -365,11 +360,10 @@ static int tifm_ms_check_status(struct tifm_ms *host) | |||
365 | if (!host->req->error) { | 360 | if (!host->req->error) { |
366 | if (!(host->cmd_flags & CMD_READY)) | 361 | if (!(host->cmd_flags & CMD_READY)) |
367 | return 1; | 362 | return 1; |
368 | if ((host->req->io_type == MEMSTICK_IO_SG) | 363 | if (!(host->cmd_flags & FIFO_READY)) |
369 | && !(host->cmd_flags & FIFO_READY)) | ||
370 | return 1; | 364 | return 1; |
371 | if (host->req->need_card_int | 365 | if (host->req->need_card_int |
372 | && !(host->cmd_flags & CARD_READY)) | 366 | && !(host->cmd_flags & CARD_INT)) |
373 | return 1; | 367 | return 1; |
374 | } | 368 | } |
375 | return 0; | 369 | return 0; |
@@ -379,18 +373,24 @@ static int tifm_ms_check_status(struct tifm_ms *host) | |||
379 | static void tifm_ms_data_event(struct tifm_dev *sock) | 373 | static void tifm_ms_data_event(struct tifm_dev *sock) |
380 | { | 374 | { |
381 | struct tifm_ms *host; | 375 | struct tifm_ms *host; |
382 | unsigned int fifo_status = 0; | 376 | unsigned int fifo_status = 0, host_status = 0; |
383 | int rc = 1; | 377 | int rc = 1; |
384 | 378 | ||
385 | spin_lock(&sock->lock); | 379 | spin_lock(&sock->lock); |
386 | host = memstick_priv((struct memstick_host *)tifm_get_drvdata(sock)); | 380 | host = memstick_priv((struct memstick_host *)tifm_get_drvdata(sock)); |
387 | fifo_status = readl(sock->addr + SOCK_DMA_FIFO_STATUS); | 381 | fifo_status = readl(sock->addr + SOCK_DMA_FIFO_STATUS); |
388 | dev_dbg(&sock->dev, "data event: fifo_status %x, flags %x\n", | 382 | host_status = readl(sock->addr + SOCK_MS_STATUS); |
389 | fifo_status, host->cmd_flags); | 383 | dev_dbg(&sock->dev, |
384 | "data event: fifo_status %x, host_status %x, flags %x\n", | ||
385 | fifo_status, host_status, host->cmd_flags); | ||
390 | 386 | ||
391 | if (host->req) { | 387 | if (host->req) { |
392 | if (fifo_status & TIFM_FIFO_READY) { | 388 | if (host->use_dma && (fifo_status & 1)) { |
393 | if (!host->no_dma || tifm_ms_transfer_data(host, 0)) { | 389 | host->cmd_flags |= FIFO_READY; |
390 | rc = tifm_ms_check_status(host); | ||
391 | } | ||
392 | if (!host->use_dma && (fifo_status & TIFM_FIFO_MORE)) { | ||
393 | if (!tifm_ms_transfer_data(host)) { | ||
394 | host->cmd_flags |= FIFO_READY; | 394 | host->cmd_flags |= FIFO_READY; |
395 | rc = tifm_ms_check_status(host); | 395 | rc = tifm_ms_check_status(host); |
396 | } | 396 | } |
@@ -419,9 +419,9 @@ static void tifm_ms_card_event(struct tifm_dev *sock) | |||
419 | host_status, host->cmd_flags); | 419 | host_status, host->cmd_flags); |
420 | 420 | ||
421 | if (host->req) { | 421 | if (host->req) { |
422 | if (host_status & TIFM_MS_TIMEOUT) | 422 | if (host_status & TIFM_MS_STAT_TOE) |
423 | host->req->error = -ETIME; | 423 | host->req->error = -ETIME; |
424 | else if (host_status & TIFM_MS_BADCRC) | 424 | else if (host_status & TIFM_MS_STAT_CRC) |
425 | host->req->error = -EILSEQ; | 425 | host->req->error = -EILSEQ; |
426 | 426 | ||
427 | if (host->req->error) { | 427 | if (host->req->error) { |
@@ -430,18 +430,17 @@ static void tifm_ms_card_event(struct tifm_dev *sock) | |||
430 | writel(TIFM_DMA_RESET, sock->addr + SOCK_DMA_CONTROL); | 430 | writel(TIFM_DMA_RESET, sock->addr + SOCK_DMA_CONTROL); |
431 | } | 431 | } |
432 | 432 | ||
433 | if (host_status & TIFM_MS_EOTPC) | 433 | if (host_status & TIFM_MS_STAT_RDY) |
434 | host->cmd_flags |= CMD_READY; | 434 | host->cmd_flags |= CMD_READY; |
435 | if (host_status & TIFM_MS_INT) | 435 | |
436 | host->cmd_flags |= CARD_READY; | 436 | if (host_status & TIFM_MS_STAT_MSINT) |
437 | host->cmd_flags |= CARD_INT; | ||
437 | 438 | ||
438 | rc = tifm_ms_check_status(host); | 439 | rc = tifm_ms_check_status(host); |
439 | 440 | ||
440 | } | 441 | } |
441 | 442 | ||
442 | writel(TIFM_MS_SYS_NOT_RDY | readl(sock->addr + SOCK_MS_SYSTEM), | 443 | writel(TIFM_MS_SYS_INTCLR | readl(sock->addr + SOCK_MS_SYSTEM), |
443 | sock->addr + SOCK_MS_SYSTEM); | ||
444 | writel((~TIFM_MS_SYS_DATA) & readl(sock->addr + SOCK_MS_SYSTEM), | ||
445 | sock->addr + SOCK_MS_SYSTEM); | 444 | sock->addr + SOCK_MS_SYSTEM); |
446 | 445 | ||
447 | if (!rc) | 446 | if (!rc) |
@@ -497,15 +496,26 @@ static void tifm_ms_set_param(struct memstick_host *msh, | |||
497 | 496 | ||
498 | switch (param) { | 497 | switch (param) { |
499 | case MEMSTICK_POWER: | 498 | case MEMSTICK_POWER: |
500 | /* this is set by card detection mechanism */ | 499 | /* also affected by media detection mechanism */ |
500 | if (value == MEMSTICK_POWER_ON) { | ||
501 | host->mode_mask = TIFM_MS_SYS_SRAC | TIFM_MS_SYS_REI; | ||
502 | writel(TIFM_MS_SYS_RESET, sock->addr + SOCK_MS_SYSTEM); | ||
503 | writel(TIFM_MS_SYS_FCLR | TIFM_MS_SYS_INTCLR, | ||
504 | sock->addr + SOCK_MS_SYSTEM); | ||
505 | writel(0xffffffff, sock->addr + SOCK_MS_STATUS); | ||
506 | } else if (value == MEMSTICK_POWER_OFF) { | ||
507 | writel(TIFM_MS_SYS_FCLR | TIFM_MS_SYS_INTCLR, | ||
508 | sock->addr + SOCK_MS_SYSTEM); | ||
509 | writel(0xffffffff, sock->addr + SOCK_MS_STATUS); | ||
510 | } | ||
501 | break; | 511 | break; |
502 | case MEMSTICK_INTERFACE: | 512 | case MEMSTICK_INTERFACE: |
503 | if (value == MEMSTICK_SERIAL) { | 513 | if (value == MEMSTICK_SERIAL) { |
504 | host->mode_mask = TIFM_MS_SERIAL; | 514 | host->mode_mask = TIFM_MS_SYS_SRAC | TIFM_MS_SYS_REI; |
505 | writel((~TIFM_CTRL_FAST_CLK) | 515 | writel((~TIFM_CTRL_FAST_CLK) |
506 | & readl(sock->addr + SOCK_CONTROL), | 516 | & readl(sock->addr + SOCK_CONTROL), |
507 | sock->addr + SOCK_CONTROL); | 517 | sock->addr + SOCK_CONTROL); |
508 | } else if (value == MEMSTICK_PARALLEL) { | 518 | } else if (value == MEMSTICK_PAR4) { |
509 | host->mode_mask = 0; | 519 | host->mode_mask = 0; |
510 | writel(TIFM_CTRL_FAST_CLK | 520 | writel(TIFM_CTRL_FAST_CLK |
511 | | readl(sock->addr + SOCK_CONTROL), | 521 | | readl(sock->addr + SOCK_CONTROL), |
@@ -532,21 +542,6 @@ static void tifm_ms_abort(unsigned long data) | |||
532 | tifm_eject(host->dev); | 542 | tifm_eject(host->dev); |
533 | } | 543 | } |
534 | 544 | ||
535 | static int tifm_ms_initialize_host(struct tifm_ms *host) | ||
536 | { | ||
537 | struct tifm_dev *sock = host->dev; | ||
538 | struct memstick_host *msh = tifm_get_drvdata(sock); | ||
539 | |||
540 | host->mode_mask = TIFM_MS_SERIAL; | ||
541 | writel(0x8000, sock->addr + SOCK_MS_SYSTEM); | ||
542 | writel(0x0200 | TIFM_MS_SYS_NOT_RDY, sock->addr + SOCK_MS_SYSTEM); | ||
543 | writel(0xffffffff, sock->addr + SOCK_MS_STATUS); | ||
544 | if (tifm_has_ms_pif(sock)) | ||
545 | msh->caps |= MEMSTICK_CAP_PARALLEL; | ||
546 | |||
547 | return 0; | ||
548 | } | ||
549 | |||
550 | static int tifm_ms_probe(struct tifm_dev *sock) | 545 | static int tifm_ms_probe(struct tifm_dev *sock) |
551 | { | 546 | { |
552 | struct memstick_host *msh; | 547 | struct memstick_host *msh; |
@@ -568,7 +563,6 @@ static int tifm_ms_probe(struct tifm_dev *sock) | |||
568 | tifm_set_drvdata(sock, msh); | 563 | tifm_set_drvdata(sock, msh); |
569 | host->dev = sock; | 564 | host->dev = sock; |
570 | host->timeout_jiffies = msecs_to_jiffies(1000); | 565 | host->timeout_jiffies = msecs_to_jiffies(1000); |
571 | host->no_dma = no_dma; | ||
572 | 566 | ||
573 | setup_timer(&host->timer, tifm_ms_abort, (unsigned long)host); | 567 | setup_timer(&host->timer, tifm_ms_abort, (unsigned long)host); |
574 | 568 | ||
@@ -576,10 +570,10 @@ static int tifm_ms_probe(struct tifm_dev *sock) | |||
576 | msh->set_param = tifm_ms_set_param; | 570 | msh->set_param = tifm_ms_set_param; |
577 | sock->card_event = tifm_ms_card_event; | 571 | sock->card_event = tifm_ms_card_event; |
578 | sock->data_event = tifm_ms_data_event; | 572 | sock->data_event = tifm_ms_data_event; |
579 | rc = tifm_ms_initialize_host(host); | 573 | if (tifm_has_ms_pif(sock)) |
574 | msh->caps |= MEMSTICK_CAP_PAR4; | ||
580 | 575 | ||
581 | if (!rc) | 576 | rc = memstick_add_host(msh); |
582 | rc = memstick_add_host(msh); | ||
583 | if (!rc) | 577 | if (!rc) |
584 | return 0; | 578 | return 0; |
585 | 579 | ||
@@ -601,7 +595,7 @@ static void tifm_ms_remove(struct tifm_dev *sock) | |||
601 | writel(TIFM_FIFO_INT_SETALL, | 595 | writel(TIFM_FIFO_INT_SETALL, |
602 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR); | 596 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR); |
603 | writel(TIFM_DMA_RESET, sock->addr + SOCK_DMA_CONTROL); | 597 | writel(TIFM_DMA_RESET, sock->addr + SOCK_DMA_CONTROL); |
604 | if ((host->req->io_type == MEMSTICK_IO_SG) && !host->no_dma) | 598 | if (host->use_dma) |
605 | tifm_unmap_sg(sock, &host->req->sg, 1, | 599 | tifm_unmap_sg(sock, &host->req->sg, 1, |
606 | host->req->data_dir == READ | 600 | host->req->data_dir == READ |
607 | ? PCI_DMA_TODEVICE | 601 | ? PCI_DMA_TODEVICE |
@@ -617,10 +611,6 @@ static void tifm_ms_remove(struct tifm_dev *sock) | |||
617 | spin_unlock_irqrestore(&sock->lock, flags); | 611 | spin_unlock_irqrestore(&sock->lock, flags); |
618 | 612 | ||
619 | memstick_remove_host(msh); | 613 | memstick_remove_host(msh); |
620 | |||
621 | writel(0x0200 | TIFM_MS_SYS_NOT_RDY, sock->addr + SOCK_MS_SYSTEM); | ||
622 | writel(0xffffffff, sock->addr + SOCK_MS_STATUS); | ||
623 | |||
624 | memstick_free_host(msh); | 614 | memstick_free_host(msh); |
625 | } | 615 | } |
626 | 616 | ||
@@ -628,17 +618,17 @@ static void tifm_ms_remove(struct tifm_dev *sock) | |||
628 | 618 | ||
629 | static int tifm_ms_suspend(struct tifm_dev *sock, pm_message_t state) | 619 | static int tifm_ms_suspend(struct tifm_dev *sock, pm_message_t state) |
630 | { | 620 | { |
621 | struct memstick_host *msh = tifm_get_drvdata(sock); | ||
622 | |||
623 | memstick_suspend_host(msh); | ||
631 | return 0; | 624 | return 0; |
632 | } | 625 | } |
633 | 626 | ||
634 | static int tifm_ms_resume(struct tifm_dev *sock) | 627 | static int tifm_ms_resume(struct tifm_dev *sock) |
635 | { | 628 | { |
636 | struct memstick_host *msh = tifm_get_drvdata(sock); | 629 | struct memstick_host *msh = tifm_get_drvdata(sock); |
637 | struct tifm_ms *host = memstick_priv(msh); | ||
638 | |||
639 | tifm_ms_initialize_host(host); | ||
640 | memstick_detect_change(msh); | ||
641 | 630 | ||
631 | memstick_resume_host(msh); | ||
642 | return 0; | 632 | return 0; |
643 | } | 633 | } |
644 | 634 | ||
@@ -679,7 +669,6 @@ MODULE_AUTHOR("Alex Dubov"); | |||
679 | MODULE_DESCRIPTION("TI FlashMedia MemoryStick driver"); | 669 | MODULE_DESCRIPTION("TI FlashMedia MemoryStick driver"); |
680 | MODULE_LICENSE("GPL"); | 670 | MODULE_LICENSE("GPL"); |
681 | MODULE_DEVICE_TABLE(tifm, tifm_ms_id_tbl); | 671 | MODULE_DEVICE_TABLE(tifm, tifm_ms_id_tbl); |
682 | MODULE_VERSION(DRIVER_VERSION); | ||
683 | 672 | ||
684 | module_init(tifm_ms_init); | 673 | module_init(tifm_ms_init); |
685 | module_exit(tifm_ms_exit); | 674 | module_exit(tifm_ms_exit); |
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 0c303c84b37b..6b6df8679585 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
@@ -632,8 +632,7 @@ mpt_deregister(u8 cb_idx) | |||
632 | 632 | ||
633 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 633 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
634 | /** | 634 | /** |
635 | * mpt_event_register - Register protocol-specific event callback | 635 | * mpt_event_register - Register protocol-specific event callback handler. |
636 | * handler. | ||
637 | * @cb_idx: previously registered (via mpt_register) callback handle | 636 | * @cb_idx: previously registered (via mpt_register) callback handle |
638 | * @ev_cbfunc: callback function | 637 | * @ev_cbfunc: callback function |
639 | * | 638 | * |
@@ -654,8 +653,7 @@ mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc) | |||
654 | 653 | ||
655 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 654 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
656 | /** | 655 | /** |
657 | * mpt_event_deregister - Deregister protocol-specific event callback | 656 | * mpt_event_deregister - Deregister protocol-specific event callback handler |
658 | * handler. | ||
659 | * @cb_idx: previously registered callback handle | 657 | * @cb_idx: previously registered callback handle |
660 | * | 658 | * |
661 | * Each protocol-specific driver should call this routine | 659 | * Each protocol-specific driver should call this routine |
@@ -765,11 +763,13 @@ mpt_device_driver_deregister(u8 cb_idx) | |||
765 | 763 | ||
766 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 764 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
767 | /** | 765 | /** |
768 | * mpt_get_msg_frame - Obtain a MPT request frame from the pool (of 1024) | 766 | * mpt_get_msg_frame - Obtain an MPT request frame from the pool |
769 | * allocated per MPT adapter. | ||
770 | * @cb_idx: Handle of registered MPT protocol driver | 767 | * @cb_idx: Handle of registered MPT protocol driver |
771 | * @ioc: Pointer to MPT adapter structure | 768 | * @ioc: Pointer to MPT adapter structure |
772 | * | 769 | * |
770 | * Obtain an MPT request frame from the pool (of 1024) that are | ||
771 | * allocated per MPT adapter. | ||
772 | * | ||
773 | * Returns pointer to a MPT request frame or %NULL if none are available | 773 | * Returns pointer to a MPT request frame or %NULL if none are available |
774 | * or IOC is not active. | 774 | * or IOC is not active. |
775 | */ | 775 | */ |
@@ -834,13 +834,12 @@ mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc) | |||
834 | 834 | ||
835 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 835 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
836 | /** | 836 | /** |
837 | * mpt_put_msg_frame - Send a protocol specific MPT request frame | 837 | * mpt_put_msg_frame - Send a protocol-specific MPT request frame to an IOC |
838 | * to a IOC. | ||
839 | * @cb_idx: Handle of registered MPT protocol driver | 838 | * @cb_idx: Handle of registered MPT protocol driver |
840 | * @ioc: Pointer to MPT adapter structure | 839 | * @ioc: Pointer to MPT adapter structure |
841 | * @mf: Pointer to MPT request frame | 840 | * @mf: Pointer to MPT request frame |
842 | * | 841 | * |
843 | * This routine posts a MPT request frame to the request post FIFO of a | 842 | * This routine posts an MPT request frame to the request post FIFO of a |
844 | * specific MPT adapter. | 843 | * specific MPT adapter. |
845 | */ | 844 | */ |
846 | void | 845 | void |
@@ -868,13 +867,15 @@ mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf) | |||
868 | } | 867 | } |
869 | 868 | ||
870 | /** | 869 | /** |
871 | * mpt_put_msg_frame_hi_pri - Send a protocol specific MPT request frame | 870 | * mpt_put_msg_frame_hi_pri - Send a hi-pri protocol-specific MPT request frame |
872 | * to a IOC using hi priority request queue. | ||
873 | * @cb_idx: Handle of registered MPT protocol driver | 871 | * @cb_idx: Handle of registered MPT protocol driver |
874 | * @ioc: Pointer to MPT adapter structure | 872 | * @ioc: Pointer to MPT adapter structure |
875 | * @mf: Pointer to MPT request frame | 873 | * @mf: Pointer to MPT request frame |
876 | * | 874 | * |
877 | * This routine posts a MPT request frame to the request post FIFO of a | 875 | * Send a protocol-specific MPT request frame to an IOC using |
876 | * hi-priority request queue. | ||
877 | * | ||
878 | * This routine posts an MPT request frame to the request post FIFO of a | ||
878 | * specific MPT adapter. | 879 | * specific MPT adapter. |
879 | **/ | 880 | **/ |
880 | void | 881 | void |
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index f77b329f6923..78734e25edd5 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
@@ -1701,6 +1701,11 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info, | |||
1701 | if (error) | 1701 | if (error) |
1702 | goto out_free_consistent; | 1702 | goto out_free_consistent; |
1703 | 1703 | ||
1704 | if (!buffer->NumPhys) { | ||
1705 | error = -ENODEV; | ||
1706 | goto out_free_consistent; | ||
1707 | } | ||
1708 | |||
1704 | /* save config data */ | 1709 | /* save config data */ |
1705 | port_info->num_phys = buffer->NumPhys; | 1710 | port_info->num_phys = buffer->NumPhys; |
1706 | port_info->phy_info = kcalloc(port_info->num_phys, | 1711 | port_info->phy_info = kcalloc(port_info->num_phys, |
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index af1de0ccee2f..0c252f60c4c1 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c | |||
@@ -1533,7 +1533,7 @@ mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx) | |||
1533 | * | 1533 | * |
1534 | * Remark: Currently invoked from a non-interrupt thread (_bh). | 1534 | * Remark: Currently invoked from a non-interrupt thread (_bh). |
1535 | * | 1535 | * |
1536 | * Remark: With old EH code, at most 1 SCSI TaskMgmt function per IOC | 1536 | * Note: With old EH code, at most 1 SCSI TaskMgmt function per IOC |
1537 | * will be active. | 1537 | * will be active. |
1538 | * | 1538 | * |
1539 | * Returns 0 for SUCCESS, or %FAILED. | 1539 | * Returns 0 for SUCCESS, or %FAILED. |
@@ -2537,14 +2537,12 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR | |||
2537 | 2537 | ||
2538 | /** | 2538 | /** |
2539 | * mptscsih_get_scsi_lookup | 2539 | * mptscsih_get_scsi_lookup |
2540 | * | ||
2541 | * retrieves scmd entry from ScsiLookup[] array list | ||
2542 | * | ||
2543 | * @ioc: Pointer to MPT_ADAPTER structure | 2540 | * @ioc: Pointer to MPT_ADAPTER structure |
2544 | * @i: index into the array | 2541 | * @i: index into the array |
2545 | * | 2542 | * |
2546 | * Returns the scsi_cmd pointer | 2543 | * retrieves scmd entry from ScsiLookup[] array list |
2547 | * | 2544 | * |
2545 | * Returns the scsi_cmd pointer | ||
2548 | **/ | 2546 | **/ |
2549 | static struct scsi_cmnd * | 2547 | static struct scsi_cmnd * |
2550 | mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i) | 2548 | mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i) |
@@ -2561,14 +2559,12 @@ mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i) | |||
2561 | 2559 | ||
2562 | /** | 2560 | /** |
2563 | * mptscsih_getclear_scsi_lookup | 2561 | * mptscsih_getclear_scsi_lookup |
2564 | * | ||
2565 | * retrieves and clears scmd entry from ScsiLookup[] array list | ||
2566 | * | ||
2567 | * @ioc: Pointer to MPT_ADAPTER structure | 2562 | * @ioc: Pointer to MPT_ADAPTER structure |
2568 | * @i: index into the array | 2563 | * @i: index into the array |
2569 | * | 2564 | * |
2570 | * Returns the scsi_cmd pointer | 2565 | * retrieves and clears scmd entry from ScsiLookup[] array list |
2571 | * | 2566 | * |
2567 | * Returns the scsi_cmd pointer | ||
2572 | **/ | 2568 | **/ |
2573 | static struct scsi_cmnd * | 2569 | static struct scsi_cmnd * |
2574 | mptscsih_getclear_scsi_lookup(MPT_ADAPTER *ioc, int i) | 2570 | mptscsih_getclear_scsi_lookup(MPT_ADAPTER *ioc, int i) |
diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c index afd82966f9a0..13bac53db69a 100644 --- a/drivers/mfd/sm501.c +++ b/drivers/mfd/sm501.c | |||
@@ -48,31 +48,13 @@ struct sm501_devdata { | |||
48 | unsigned int pdev_id; | 48 | unsigned int pdev_id; |
49 | unsigned int irq; | 49 | unsigned int irq; |
50 | void __iomem *regs; | 50 | void __iomem *regs; |
51 | unsigned int rev; | ||
51 | }; | 52 | }; |
52 | 53 | ||
53 | #define MHZ (1000 * 1000) | 54 | #define MHZ (1000 * 1000) |
54 | 55 | ||
55 | #ifdef DEBUG | 56 | #ifdef DEBUG |
56 | static const unsigned int misc_div[] = { | 57 | static const unsigned int div_tab[] = { |
57 | [0] = 1, | ||
58 | [1] = 2, | ||
59 | [2] = 4, | ||
60 | [3] = 8, | ||
61 | [4] = 16, | ||
62 | [5] = 32, | ||
63 | [6] = 64, | ||
64 | [7] = 128, | ||
65 | [8] = 3, | ||
66 | [9] = 6, | ||
67 | [10] = 12, | ||
68 | [11] = 24, | ||
69 | [12] = 48, | ||
70 | [13] = 96, | ||
71 | [14] = 192, | ||
72 | [15] = 384, | ||
73 | }; | ||
74 | |||
75 | static const unsigned int px_div[] = { | ||
76 | [0] = 1, | 58 | [0] = 1, |
77 | [1] = 2, | 59 | [1] = 2, |
78 | [2] = 4, | 60 | [2] = 4, |
@@ -101,12 +83,12 @@ static const unsigned int px_div[] = { | |||
101 | 83 | ||
102 | static unsigned long decode_div(unsigned long pll2, unsigned long val, | 84 | static unsigned long decode_div(unsigned long pll2, unsigned long val, |
103 | unsigned int lshft, unsigned int selbit, | 85 | unsigned int lshft, unsigned int selbit, |
104 | unsigned long mask, const unsigned int *dtab) | 86 | unsigned long mask) |
105 | { | 87 | { |
106 | if (val & selbit) | 88 | if (val & selbit) |
107 | pll2 = 288 * MHZ; | 89 | pll2 = 288 * MHZ; |
108 | 90 | ||
109 | return pll2 / dtab[(val >> lshft) & mask]; | 91 | return pll2 / div_tab[(val >> lshft) & mask]; |
110 | } | 92 | } |
111 | 93 | ||
112 | #define fmt_freq(x) ((x) / MHZ), ((x) % MHZ), (x) | 94 | #define fmt_freq(x) ((x) / MHZ), ((x) % MHZ), (x) |
@@ -141,10 +123,10 @@ static void sm501_dump_clk(struct sm501_devdata *sm) | |||
141 | } | 123 | } |
142 | 124 | ||
143 | sdclk0 = (misct & (1<<12)) ? pll2 : 288 * MHZ; | 125 | sdclk0 = (misct & (1<<12)) ? pll2 : 288 * MHZ; |
144 | sdclk0 /= misc_div[((misct >> 8) & 0xf)]; | 126 | sdclk0 /= div_tab[((misct >> 8) & 0xf)]; |
145 | 127 | ||
146 | sdclk1 = (misct & (1<<20)) ? pll2 : 288 * MHZ; | 128 | sdclk1 = (misct & (1<<20)) ? pll2 : 288 * MHZ; |
147 | sdclk1 /= misc_div[((misct >> 16) & 0xf)]; | 129 | sdclk1 /= div_tab[((misct >> 16) & 0xf)]; |
148 | 130 | ||
149 | dev_dbg(sm->dev, "MISCT=%08lx, PM0=%08lx, PM1=%08lx\n", | 131 | dev_dbg(sm->dev, "MISCT=%08lx, PM0=%08lx, PM1=%08lx\n", |
150 | misct, pm0, pm1); | 132 | misct, pm0, pm1); |
@@ -158,19 +140,19 @@ static void sm501_dump_clk(struct sm501_devdata *sm) | |||
158 | "P2 %ld.%ld MHz (%ld), V2 %ld.%ld (%ld), " | 140 | "P2 %ld.%ld MHz (%ld), V2 %ld.%ld (%ld), " |
159 | "M %ld.%ld (%ld), MX1 %ld.%ld (%ld)\n", | 141 | "M %ld.%ld (%ld), MX1 %ld.%ld (%ld)\n", |
160 | (pmc & 3 ) == 0 ? '*' : '-', | 142 | (pmc & 3 ) == 0 ? '*' : '-', |
161 | fmt_freq(decode_div(pll2, pm0, 24, 1<<29, 31, px_div)), | 143 | fmt_freq(decode_div(pll2, pm0, 24, 1<<29, 31)), |
162 | fmt_freq(decode_div(pll2, pm0, 16, 1<<20, 15, misc_div)), | 144 | fmt_freq(decode_div(pll2, pm0, 16, 1<<20, 15)), |
163 | fmt_freq(decode_div(pll2, pm0, 8, 1<<12, 15, misc_div)), | 145 | fmt_freq(decode_div(pll2, pm0, 8, 1<<12, 15)), |
164 | fmt_freq(decode_div(pll2, pm0, 0, 1<<4, 15, misc_div))); | 146 | fmt_freq(decode_div(pll2, pm0, 0, 1<<4, 15))); |
165 | 147 | ||
166 | dev_dbg(sm->dev, "PM1[%c]: " | 148 | dev_dbg(sm->dev, "PM1[%c]: " |
167 | "P2 %ld.%ld MHz (%ld), V2 %ld.%ld (%ld), " | 149 | "P2 %ld.%ld MHz (%ld), V2 %ld.%ld (%ld), " |
168 | "M %ld.%ld (%ld), MX1 %ld.%ld (%ld)\n", | 150 | "M %ld.%ld (%ld), MX1 %ld.%ld (%ld)\n", |
169 | (pmc & 3 ) == 1 ? '*' : '-', | 151 | (pmc & 3 ) == 1 ? '*' : '-', |
170 | fmt_freq(decode_div(pll2, pm1, 24, 1<<29, 31, px_div)), | 152 | fmt_freq(decode_div(pll2, pm1, 24, 1<<29, 31)), |
171 | fmt_freq(decode_div(pll2, pm1, 16, 1<<20, 15, misc_div)), | 153 | fmt_freq(decode_div(pll2, pm1, 16, 1<<20, 15)), |
172 | fmt_freq(decode_div(pll2, pm1, 8, 1<<12, 15, misc_div)), | 154 | fmt_freq(decode_div(pll2, pm1, 8, 1<<12, 15)), |
173 | fmt_freq(decode_div(pll2, pm1, 0, 1<<4, 15, misc_div))); | 155 | fmt_freq(decode_div(pll2, pm1, 0, 1<<4, 15))); |
174 | } | 156 | } |
175 | 157 | ||
176 | static void sm501_dump_regs(struct sm501_devdata *sm) | 158 | static void sm501_dump_regs(struct sm501_devdata *sm) |
@@ -436,46 +418,108 @@ struct sm501_clock { | |||
436 | unsigned long mclk; | 418 | unsigned long mclk; |
437 | int divider; | 419 | int divider; |
438 | int shift; | 420 | int shift; |
421 | unsigned int m, n, k; | ||
439 | }; | 422 | }; |
440 | 423 | ||
424 | /* sm501_calc_clock | ||
425 | * | ||
426 | * Calculates the nearest discrete clock frequency that | ||
427 | * can be achieved with the specified input clock. | ||
428 | * the maximum divisor is 3 or 5 | ||
429 | */ | ||
430 | |||
431 | static int sm501_calc_clock(unsigned long freq, | ||
432 | struct sm501_clock *clock, | ||
433 | int max_div, | ||
434 | unsigned long mclk, | ||
435 | long *best_diff) | ||
436 | { | ||
437 | int ret = 0; | ||
438 | int divider; | ||
439 | int shift; | ||
440 | long diff; | ||
441 | |||
442 | /* try dividers 1 and 3 for CRT and for panel, | ||
443 | try divider 5 for panel only.*/ | ||
444 | |||
445 | for (divider = 1; divider <= max_div; divider += 2) { | ||
446 | /* try all 8 shift values.*/ | ||
447 | for (shift = 0; shift < 8; shift++) { | ||
448 | /* Calculate difference to requested clock */ | ||
449 | diff = sm501fb_round_div(mclk, divider << shift) - freq; | ||
450 | if (diff < 0) | ||
451 | diff = -diff; | ||
452 | |||
453 | /* If it is less than the current, use it */ | ||
454 | if (diff < *best_diff) { | ||
455 | *best_diff = diff; | ||
456 | |||
457 | clock->mclk = mclk; | ||
458 | clock->divider = divider; | ||
459 | clock->shift = shift; | ||
460 | ret = 1; | ||
461 | } | ||
462 | } | ||
463 | } | ||
464 | |||
465 | return ret; | ||
466 | } | ||
467 | |||
468 | /* sm501_calc_pll | ||
469 | * | ||
470 | * Calculates the nearest discrete clock frequency that can be | ||
471 | * achieved using the programmable PLL. | ||
472 | * the maximum divisor is 3 or 5 | ||
473 | */ | ||
474 | |||
475 | static unsigned long sm501_calc_pll(unsigned long freq, | ||
476 | struct sm501_clock *clock, | ||
477 | int max_div) | ||
478 | { | ||
479 | unsigned long mclk; | ||
480 | unsigned int m, n, k; | ||
481 | long best_diff = 999999999; | ||
482 | |||
483 | /* | ||
484 | * The SM502 datasheet doesn't specify the min/max values for M and N. | ||
485 | * N = 1 at least doesn't work in practice. | ||
486 | */ | ||
487 | for (m = 2; m <= 255; m++) { | ||
488 | for (n = 2; n <= 127; n++) { | ||
489 | for (k = 0; k <= 1; k++) { | ||
490 | mclk = (24000000UL * m / n) >> k; | ||
491 | |||
492 | if (sm501_calc_clock(freq, clock, max_div, | ||
493 | mclk, &best_diff)) { | ||
494 | clock->m = m; | ||
495 | clock->n = n; | ||
496 | clock->k = k; | ||
497 | } | ||
498 | } | ||
499 | } | ||
500 | } | ||
501 | |||
502 | /* Return best clock. */ | ||
503 | return clock->mclk / (clock->divider << clock->shift); | ||
504 | } | ||
505 | |||
441 | /* sm501_select_clock | 506 | /* sm501_select_clock |
442 | * | 507 | * |
443 | * selects nearest discrete clock frequency the SM501 can achive | 508 | * Calculates the nearest discrete clock frequency that can be |
509 | * achieved using the 288MHz and 336MHz PLLs. | ||
444 | * the maximum divisor is 3 or 5 | 510 | * the maximum divisor is 3 or 5 |
445 | */ | 511 | */ |
512 | |||
446 | static unsigned long sm501_select_clock(unsigned long freq, | 513 | static unsigned long sm501_select_clock(unsigned long freq, |
447 | struct sm501_clock *clock, | 514 | struct sm501_clock *clock, |
448 | int max_div) | 515 | int max_div) |
449 | { | 516 | { |
450 | unsigned long mclk; | 517 | unsigned long mclk; |
451 | int divider; | ||
452 | int shift; | ||
453 | long diff; | ||
454 | long best_diff = 999999999; | 518 | long best_diff = 999999999; |
455 | 519 | ||
456 | /* Try 288MHz and 336MHz clocks. */ | 520 | /* Try 288MHz and 336MHz clocks. */ |
457 | for (mclk = 288000000; mclk <= 336000000; mclk += 48000000) { | 521 | for (mclk = 288000000; mclk <= 336000000; mclk += 48000000) { |
458 | /* try dividers 1 and 3 for CRT and for panel, | 522 | sm501_calc_clock(freq, clock, max_div, mclk, &best_diff); |
459 | try divider 5 for panel only.*/ | ||
460 | |||
461 | for (divider = 1; divider <= max_div; divider += 2) { | ||
462 | /* try all 8 shift values.*/ | ||
463 | for (shift = 0; shift < 8; shift++) { | ||
464 | /* Calculate difference to requested clock */ | ||
465 | diff = sm501fb_round_div(mclk, divider << shift) - freq; | ||
466 | if (diff < 0) | ||
467 | diff = -diff; | ||
468 | |||
469 | /* If it is less than the current, use it */ | ||
470 | if (diff < best_diff) { | ||
471 | best_diff = diff; | ||
472 | |||
473 | clock->mclk = mclk; | ||
474 | clock->divider = divider; | ||
475 | clock->shift = shift; | ||
476 | } | ||
477 | } | ||
478 | } | ||
479 | } | 523 | } |
480 | 524 | ||
481 | /* Return best clock. */ | 525 | /* Return best clock. */ |
@@ -497,6 +541,7 @@ unsigned long sm501_set_clock(struct device *dev, | |||
497 | unsigned long gate = readl(sm->regs + SM501_CURRENT_GATE); | 541 | unsigned long gate = readl(sm->regs + SM501_CURRENT_GATE); |
498 | unsigned long clock = readl(sm->regs + SM501_CURRENT_CLOCK); | 542 | unsigned long clock = readl(sm->regs + SM501_CURRENT_CLOCK); |
499 | unsigned char reg; | 543 | unsigned char reg; |
544 | unsigned int pll_reg = 0; | ||
500 | unsigned long sm501_freq; /* the actual frequency acheived */ | 545 | unsigned long sm501_freq; /* the actual frequency acheived */ |
501 | 546 | ||
502 | struct sm501_clock to; | 547 | struct sm501_clock to; |
@@ -511,14 +556,28 @@ unsigned long sm501_set_clock(struct device *dev, | |||
511 | * requested frequency the value must be multiplied by | 556 | * requested frequency the value must be multiplied by |
512 | * 2. This clock also has an additional pre divisor */ | 557 | * 2. This clock also has an additional pre divisor */ |
513 | 558 | ||
514 | sm501_freq = (sm501_select_clock(2 * req_freq, &to, 5) / 2); | 559 | if (sm->rev >= 0xC0) { |
515 | reg=to.shift & 0x07;/* bottom 3 bits are shift */ | 560 | /* SM502 -> use the programmable PLL */ |
516 | if (to.divider == 3) | 561 | sm501_freq = (sm501_calc_pll(2 * req_freq, |
517 | reg |= 0x08; /* /3 divider required */ | 562 | &to, 5) / 2); |
518 | else if (to.divider == 5) | 563 | reg = to.shift & 0x07;/* bottom 3 bits are shift */ |
519 | reg |= 0x10; /* /5 divider required */ | 564 | if (to.divider == 3) |
520 | if (to.mclk != 288000000) | 565 | reg |= 0x08; /* /3 divider required */ |
521 | reg |= 0x20; /* which mclk pll is source */ | 566 | else if (to.divider == 5) |
567 | reg |= 0x10; /* /5 divider required */ | ||
568 | reg |= 0x40; /* select the programmable PLL */ | ||
569 | pll_reg = 0x20000 | (to.k << 15) | (to.n << 8) | to.m; | ||
570 | } else { | ||
571 | sm501_freq = (sm501_select_clock(2 * req_freq, | ||
572 | &to, 5) / 2); | ||
573 | reg = to.shift & 0x07;/* bottom 3 bits are shift */ | ||
574 | if (to.divider == 3) | ||
575 | reg |= 0x08; /* /3 divider required */ | ||
576 | else if (to.divider == 5) | ||
577 | reg |= 0x10; /* /5 divider required */ | ||
578 | if (to.mclk != 288000000) | ||
579 | reg |= 0x20; /* which mclk pll is source */ | ||
580 | } | ||
522 | break; | 581 | break; |
523 | 582 | ||
524 | case SM501_CLOCK_V2XCLK: | 583 | case SM501_CLOCK_V2XCLK: |
@@ -579,6 +638,10 @@ unsigned long sm501_set_clock(struct device *dev, | |||
579 | } | 638 | } |
580 | 639 | ||
581 | writel(mode, sm->regs + SM501_POWER_MODE_CONTROL); | 640 | writel(mode, sm->regs + SM501_POWER_MODE_CONTROL); |
641 | |||
642 | if (pll_reg) | ||
643 | writel(pll_reg, sm->regs + SM501_PROGRAMMABLE_PLL_CONTROL); | ||
644 | |||
582 | sm501_sync_regs(sm); | 645 | sm501_sync_regs(sm); |
583 | 646 | ||
584 | dev_info(sm->dev, "gate %08lx, clock %08lx, mode %08lx\n", | 647 | dev_info(sm->dev, "gate %08lx, clock %08lx, mode %08lx\n", |
@@ -599,15 +662,24 @@ EXPORT_SYMBOL_GPL(sm501_set_clock); | |||
599 | * finds the closest available frequency for a given clock | 662 | * finds the closest available frequency for a given clock |
600 | */ | 663 | */ |
601 | 664 | ||
602 | unsigned long sm501_find_clock(int clksrc, | 665 | unsigned long sm501_find_clock(struct device *dev, |
666 | int clksrc, | ||
603 | unsigned long req_freq) | 667 | unsigned long req_freq) |
604 | { | 668 | { |
669 | struct sm501_devdata *sm = dev_get_drvdata(dev); | ||
605 | unsigned long sm501_freq; /* the frequency achiveable by the 501 */ | 670 | unsigned long sm501_freq; /* the frequency achiveable by the 501 */ |
606 | struct sm501_clock to; | 671 | struct sm501_clock to; |
607 | 672 | ||
608 | switch (clksrc) { | 673 | switch (clksrc) { |
609 | case SM501_CLOCK_P2XCLK: | 674 | case SM501_CLOCK_P2XCLK: |
610 | sm501_freq = (sm501_select_clock(2 * req_freq, &to, 5) / 2); | 675 | if (sm->rev >= 0xC0) { |
676 | /* SM502 -> use the programmable PLL */ | ||
677 | sm501_freq = (sm501_calc_pll(2 * req_freq, | ||
678 | &to, 5) / 2); | ||
679 | } else { | ||
680 | sm501_freq = (sm501_select_clock(2 * req_freq, | ||
681 | &to, 5) / 2); | ||
682 | } | ||
611 | break; | 683 | break; |
612 | 684 | ||
613 | case SM501_CLOCK_V2XCLK: | 685 | case SM501_CLOCK_V2XCLK: |
@@ -914,6 +986,8 @@ static int sm501_init_dev(struct sm501_devdata *sm) | |||
914 | dev_info(sm->dev, "SM501 At %p: Version %08lx, %ld Mb, IRQ %d\n", | 986 | dev_info(sm->dev, "SM501 At %p: Version %08lx, %ld Mb, IRQ %d\n", |
915 | sm->regs, devid, (unsigned long)mem_avail >> 20, sm->irq); | 987 | sm->regs, devid, (unsigned long)mem_avail >> 20, sm->irq); |
916 | 988 | ||
989 | sm->rev = devid & SM501_DEVICEID_REVMASK; | ||
990 | |||
917 | sm501_dump_gate(sm); | 991 | sm501_dump_gate(sm); |
918 | 992 | ||
919 | ret = device_create_file(sm->dev, &dev_attr_dbg_regs); | 993 | ret = device_create_file(sm->dev, &dev_attr_dbg_regs); |
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 982e27b86d10..962817e49fba 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig | |||
@@ -108,6 +108,7 @@ config ACER_WMI | |||
108 | depends on ACPI | 108 | depends on ACPI |
109 | depends on LEDS_CLASS | 109 | depends on LEDS_CLASS |
110 | depends on BACKLIGHT_CLASS_DEVICE | 110 | depends on BACKLIGHT_CLASS_DEVICE |
111 | depends on SERIO_I8042 | ||
111 | select ACPI_WMI | 112 | select ACPI_WMI |
112 | ---help--- | 113 | ---help--- |
113 | This is a driver for newer Acer (and Wistron) laptops. It adds | 114 | This is a driver for newer Acer (and Wistron) laptops. It adds |
diff --git a/drivers/misc/acer-wmi.c b/drivers/misc/acer-wmi.c index 74d12b4a3abd..dd13a3749927 100644 --- a/drivers/misc/acer-wmi.c +++ b/drivers/misc/acer-wmi.c | |||
@@ -219,6 +219,15 @@ static struct dmi_system_id acer_quirks[] = { | |||
219 | }, | 219 | }, |
220 | { | 220 | { |
221 | .callback = dmi_matched, | 221 | .callback = dmi_matched, |
222 | .ident = "Acer Aspire 3610", | ||
223 | .matches = { | ||
224 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
225 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3610"), | ||
226 | }, | ||
227 | .driver_data = &quirk_acer_travelmate_2490, | ||
228 | }, | ||
229 | { | ||
230 | .callback = dmi_matched, | ||
222 | .ident = "Acer Aspire 5100", | 231 | .ident = "Acer Aspire 5100", |
223 | .matches = { | 232 | .matches = { |
224 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 233 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
@@ -228,6 +237,15 @@ static struct dmi_system_id acer_quirks[] = { | |||
228 | }, | 237 | }, |
229 | { | 238 | { |
230 | .callback = dmi_matched, | 239 | .callback = dmi_matched, |
240 | .ident = "Acer Aspire 5610", | ||
241 | .matches = { | ||
242 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
243 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), | ||
244 | }, | ||
245 | .driver_data = &quirk_acer_travelmate_2490, | ||
246 | }, | ||
247 | { | ||
248 | .callback = dmi_matched, | ||
231 | .ident = "Acer Aspire 5630", | 249 | .ident = "Acer Aspire 5630", |
232 | .matches = { | 250 | .matches = { |
233 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 251 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
@@ -761,11 +779,11 @@ enum led_brightness value) | |||
761 | } | 779 | } |
762 | 780 | ||
763 | static struct led_classdev mail_led = { | 781 | static struct led_classdev mail_led = { |
764 | .name = "acer-mail:green", | 782 | .name = "acer-wmi::mail", |
765 | .brightness_set = mail_led_set, | 783 | .brightness_set = mail_led_set, |
766 | }; | 784 | }; |
767 | 785 | ||
768 | static int __init acer_led_init(struct device *dev) | 786 | static int __devinit acer_led_init(struct device *dev) |
769 | { | 787 | { |
770 | return led_classdev_register(dev, &mail_led); | 788 | return led_classdev_register(dev, &mail_led); |
771 | } | 789 | } |
@@ -798,7 +816,7 @@ static struct backlight_ops acer_bl_ops = { | |||
798 | .update_status = update_bl_status, | 816 | .update_status = update_bl_status, |
799 | }; | 817 | }; |
800 | 818 | ||
801 | static int __init acer_backlight_init(struct device *dev) | 819 | static int __devinit acer_backlight_init(struct device *dev) |
802 | { | 820 | { |
803 | struct backlight_device *bd; | 821 | struct backlight_device *bd; |
804 | 822 | ||
@@ -817,7 +835,7 @@ static int __init acer_backlight_init(struct device *dev) | |||
817 | return 0; | 835 | return 0; |
818 | } | 836 | } |
819 | 837 | ||
820 | static void __exit acer_backlight_exit(void) | 838 | static void acer_backlight_exit(void) |
821 | { | 839 | { |
822 | backlight_device_unregister(acer_backlight_device); | 840 | backlight_device_unregister(acer_backlight_device); |
823 | } | 841 | } |
@@ -1052,11 +1070,12 @@ static int __init acer_wmi_init(void) | |||
1052 | 1070 | ||
1053 | if (wmi_has_guid(WMID_GUID2) && interface) { | 1071 | if (wmi_has_guid(WMID_GUID2) && interface) { |
1054 | if (ACPI_FAILURE(WMID_set_capabilities())) { | 1072 | if (ACPI_FAILURE(WMID_set_capabilities())) { |
1055 | printk(ACER_ERR "Unable to detect available devices\n"); | 1073 | printk(ACER_ERR "Unable to detect available WMID " |
1074 | "devices\n"); | ||
1056 | return -ENODEV; | 1075 | return -ENODEV; |
1057 | } | 1076 | } |
1058 | } else if (!wmi_has_guid(WMID_GUID2) && interface) { | 1077 | } else if (!wmi_has_guid(WMID_GUID2) && interface) { |
1059 | printk(ACER_ERR "Unable to detect available devices\n"); | 1078 | printk(ACER_ERR "No WMID device detection method found\n"); |
1060 | return -ENODEV; | 1079 | return -ENODEV; |
1061 | } | 1080 | } |
1062 | 1081 | ||
@@ -1064,21 +1083,20 @@ static int __init acer_wmi_init(void) | |||
1064 | interface = &AMW0_interface; | 1083 | interface = &AMW0_interface; |
1065 | 1084 | ||
1066 | if (ACPI_FAILURE(AMW0_set_capabilities())) { | 1085 | if (ACPI_FAILURE(AMW0_set_capabilities())) { |
1067 | printk(ACER_ERR "Unable to detect available devices\n"); | 1086 | printk(ACER_ERR "Unable to detect available AMW0 " |
1087 | "devices\n"); | ||
1068 | return -ENODEV; | 1088 | return -ENODEV; |
1069 | } | 1089 | } |
1070 | } | 1090 | } |
1071 | 1091 | ||
1072 | if (wmi_has_guid(AMW0_GUID1)) { | 1092 | if (wmi_has_guid(AMW0_GUID1)) |
1073 | if (ACPI_FAILURE(AMW0_find_mailled())) | 1093 | AMW0_find_mailled(); |
1074 | printk(ACER_ERR "Unable to detect mail LED\n"); | ||
1075 | } | ||
1076 | 1094 | ||
1077 | find_quirks(); | 1095 | find_quirks(); |
1078 | 1096 | ||
1079 | if (!interface) { | 1097 | if (!interface) { |
1080 | printk(ACER_ERR "No or unsupported WMI interface, unable to "); | 1098 | printk(ACER_ERR "No or unsupported WMI interface, unable to " |
1081 | printk(KERN_CONT "load.\n"); | 1099 | "load\n"); |
1082 | return -ENODEV; | 1100 | return -ENODEV; |
1083 | } | 1101 | } |
1084 | 1102 | ||
diff --git a/drivers/misc/sony-laptop.c b/drivers/misc/sony-laptop.c index 899e3f75f288..02ff3d19b1cc 100644 --- a/drivers/misc/sony-laptop.c +++ b/drivers/misc/sony-laptop.c | |||
@@ -315,7 +315,7 @@ static void sony_laptop_report_input_event(u8 event) | |||
315 | break; | 315 | break; |
316 | 316 | ||
317 | default: | 317 | default: |
318 | if (event > ARRAY_SIZE(sony_laptop_input_index)) { | 318 | if (event >= ARRAY_SIZE(sony_laptop_input_index)) { |
319 | dprintk("sony_laptop_report_input_event, event not known: %d\n", event); | 319 | dprintk("sony_laptop_report_input_event, event not known: %d\n", event); |
320 | break; | 320 | break; |
321 | } | 321 | } |
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index bb269d0c677e..6cb781262f94 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
@@ -1078,7 +1078,8 @@ static int hotkey_get_tablet_mode(int *status) | |||
1078 | if (!acpi_evalf(hkey_handle, &s, "MHKG", "d")) | 1078 | if (!acpi_evalf(hkey_handle, &s, "MHKG", "d")) |
1079 | return -EIO; | 1079 | return -EIO; |
1080 | 1080 | ||
1081 | return ((s & TP_HOTKEY_TABLET_MASK) != 0); | 1081 | *status = ((s & TP_HOTKEY_TABLET_MASK) != 0); |
1082 | return 0; | ||
1082 | } | 1083 | } |
1083 | 1084 | ||
1084 | /* | 1085 | /* |
diff --git a/drivers/misc/tifm_7xx1.c b/drivers/misc/tifm_7xx1.c index 63a089b29545..67503ea71d21 100644 --- a/drivers/misc/tifm_7xx1.c +++ b/drivers/misc/tifm_7xx1.c | |||
@@ -368,6 +368,8 @@ static int tifm_7xx1_probe(struct pci_dev *dev, | |||
368 | goto err_out_irq; | 368 | goto err_out_irq; |
369 | 369 | ||
370 | writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), | 370 | writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), |
371 | fm->addr + FM_CLEAR_INTERRUPT_ENABLE); | ||
372 | writel(TIFM_IRQ_ENABLE | TIFM_IRQ_SOCKMASK((1 << fm->num_sockets) - 1), | ||
371 | fm->addr + FM_SET_INTERRUPT_ENABLE); | 373 | fm->addr + FM_SET_INTERRUPT_ENABLE); |
372 | return 0; | 374 | return 0; |
373 | 375 | ||
diff --git a/drivers/mmc/host/tifm_sd.c b/drivers/mmc/host/tifm_sd.c index 20d5c7bd940a..1c14a186f000 100644 --- a/drivers/mmc/host/tifm_sd.c +++ b/drivers/mmc/host/tifm_sd.c | |||
@@ -180,7 +180,7 @@ static void tifm_sd_transfer_data(struct tifm_sd *host) | |||
180 | host->sg_pos++; | 180 | host->sg_pos++; |
181 | if (host->sg_pos == host->sg_len) { | 181 | if (host->sg_pos == host->sg_len) { |
182 | if ((r_data->flags & MMC_DATA_WRITE) | 182 | if ((r_data->flags & MMC_DATA_WRITE) |
183 | && DATA_CARRY) | 183 | && (host->cmd_flags & DATA_CARRY)) |
184 | writel(host->bounce_buf_data[0], | 184 | writel(host->bounce_buf_data[0], |
185 | host->dev->addr | 185 | host->dev->addr |
186 | + SOCK_MMCSD_DATA); | 186 | + SOCK_MMCSD_DATA); |
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c index 6ac81e35355c..275960462970 100644 --- a/drivers/mtd/ubi/build.c +++ b/drivers/mtd/ubi/build.c | |||
@@ -1000,8 +1000,8 @@ static int __init ubi_init(void) | |||
1000 | mutex_unlock(&ubi_devices_mutex); | 1000 | mutex_unlock(&ubi_devices_mutex); |
1001 | if (err < 0) { | 1001 | if (err < 0) { |
1002 | put_mtd_device(mtd); | 1002 | put_mtd_device(mtd); |
1003 | printk(KERN_ERR "UBI error: cannot attach %s\n", | 1003 | printk(KERN_ERR "UBI error: cannot attach mtd%d\n", |
1004 | p->name); | 1004 | mtd->index); |
1005 | goto out_detach; | 1005 | goto out_detach; |
1006 | } | 1006 | } |
1007 | } | 1007 | } |
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h index 457710615261..a548c1d28fa8 100644 --- a/drivers/mtd/ubi/ubi.h +++ b/drivers/mtd/ubi/ubi.h | |||
@@ -217,11 +217,11 @@ struct ubi_volume { | |||
217 | void *upd_buf; | 217 | void *upd_buf; |
218 | 218 | ||
219 | int *eba_tbl; | 219 | int *eba_tbl; |
220 | int checked:1; | 220 | unsigned int checked:1; |
221 | int corrupted:1; | 221 | unsigned int corrupted:1; |
222 | int upd_marker:1; | 222 | unsigned int upd_marker:1; |
223 | int updating:1; | 223 | unsigned int updating:1; |
224 | int changing_leb:1; | 224 | unsigned int changing_leb:1; |
225 | 225 | ||
226 | #ifdef CONFIG_MTD_UBI_GLUEBI | 226 | #ifdef CONFIG_MTD_UBI_GLUEBI |
227 | /* | 227 | /* |
diff --git a/drivers/mtd/ubi/vmt.c b/drivers/mtd/ubi/vmt.c index a3ca2257e601..5be58d85c639 100644 --- a/drivers/mtd/ubi/vmt.c +++ b/drivers/mtd/ubi/vmt.c | |||
@@ -376,7 +376,9 @@ out_sysfs: | |||
376 | get_device(&vol->dev); | 376 | get_device(&vol->dev); |
377 | volume_sysfs_close(vol); | 377 | volume_sysfs_close(vol); |
378 | out_gluebi: | 378 | out_gluebi: |
379 | ubi_destroy_gluebi(vol); | 379 | if (ubi_destroy_gluebi(vol)) |
380 | dbg_err("cannot destroy gluebi for volume %d:%d", | ||
381 | ubi->ubi_num, vol_id); | ||
380 | out_cdev: | 382 | out_cdev: |
381 | cdev_del(&vol->cdev); | 383 | cdev_del(&vol->cdev); |
382 | out_mapping: | 384 | out_mapping: |
diff --git a/drivers/mtd/ubi/vtbl.c b/drivers/mtd/ubi/vtbl.c index 56fc3fbce838..af36b12be278 100644 --- a/drivers/mtd/ubi/vtbl.c +++ b/drivers/mtd/ubi/vtbl.c | |||
@@ -519,6 +519,7 @@ static int init_volumes(struct ubi_device *ubi, const struct ubi_scan_info *si, | |||
519 | if (ubi->autoresize_vol_id != -1) { | 519 | if (ubi->autoresize_vol_id != -1) { |
520 | ubi_err("more then one auto-resize volume (%d " | 520 | ubi_err("more then one auto-resize volume (%d " |
521 | "and %d)", ubi->autoresize_vol_id, i); | 521 | "and %d)", ubi->autoresize_vol_id, i); |
522 | kfree(vol); | ||
522 | return -EINVAL; | 523 | return -EINVAL; |
523 | } | 524 | } |
524 | 525 | ||
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 0fbf1bbbaee9..d7a3ea88eddb 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
@@ -1253,7 +1253,7 @@ static void __inline__ fec_request_intrs(struct net_device *dev) | |||
1253 | 1253 | ||
1254 | /* Setup interrupt handlers. */ | 1254 | /* Setup interrupt handlers. */ |
1255 | for (idp = id; idp->name; idp++) { | 1255 | for (idp = id; idp->name; idp++) { |
1256 | if (request_irq(idp->irq, idp->handler, 0, idp->name, dev) != 0) | 1256 | if (request_irq(idp->irq, idp->handler, IRQF_DISABLED, idp->name, dev) != 0) |
1257 | printk("FEC: Could not allocate %s IRQ(%d)!\n", idp->name, idp->irq); | 1257 | printk("FEC: Could not allocate %s IRQ(%d)!\n", idp->name, idp->irq); |
1258 | } | 1258 | } |
1259 | 1259 | ||
@@ -1382,7 +1382,7 @@ static void __inline__ fec_request_intrs(struct net_device *dev) | |||
1382 | 1382 | ||
1383 | /* Setup interrupt handlers. */ | 1383 | /* Setup interrupt handlers. */ |
1384 | for (idp = id; idp->name; idp++) { | 1384 | for (idp = id; idp->name; idp++) { |
1385 | if (request_irq(b+idp->irq, fec_enet_interrupt, 0, idp->name, dev) != 0) | 1385 | if (request_irq(b+idp->irq, fec_enet_interrupt, IRQF_DISABLED, idp->name, dev) != 0) |
1386 | printk("FEC: Could not allocate %s IRQ(%d)!\n", idp->name, b+idp->irq); | 1386 | printk("FEC: Could not allocate %s IRQ(%d)!\n", idp->name, b+idp->irq); |
1387 | } | 1387 | } |
1388 | 1388 | ||
@@ -1553,7 +1553,7 @@ static void __inline__ fec_request_intrs(struct net_device *dev) | |||
1553 | 1553 | ||
1554 | /* Setup interrupt handlers. */ | 1554 | /* Setup interrupt handlers. */ |
1555 | for (idp = id; idp->name; idp++) { | 1555 | for (idp = id; idp->name; idp++) { |
1556 | if (request_irq(b+idp->irq,fec_enet_interrupt,0,idp->name,dev)!=0) | 1556 | if (request_irq(b+idp->irq, fec_enet_interrupt, IRQF_DISABLED, idp->name,dev) != 0) |
1557 | printk("FEC: Could not allocate %s IRQ(%d)!\n", idp->name, b+idp->irq); | 1557 | printk("FEC: Could not allocate %s IRQ(%d)!\n", idp->name, b+idp->irq); |
1558 | } | 1558 | } |
1559 | 1559 | ||
@@ -1680,7 +1680,7 @@ static void __inline__ fec_request_intrs(struct net_device *dev) | |||
1680 | 1680 | ||
1681 | /* Setup interrupt handlers. */ | 1681 | /* Setup interrupt handlers. */ |
1682 | for (idp = id; idp->name; idp++) { | 1682 | for (idp = id; idp->name; idp++) { |
1683 | if (request_irq(b+idp->irq,fec_enet_interrupt,0,idp->name,dev)!=0) | 1683 | if (request_irq(b+idp->irq, fec_enet_interrupt, IRQF_DISABLED, idp->name,dev) != 0) |
1684 | printk("FEC: Could not allocate %s IRQ(%d)!\n", | 1684 | printk("FEC: Could not allocate %s IRQ(%d)!\n", |
1685 | idp->name, b+idp->irq); | 1685 | idp->name, b+idp->irq); |
1686 | } | 1686 | } |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 19fd4cb0ddf8..b58472cf76f8 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -203,8 +203,11 @@ again: | |||
203 | if (received < budget) { | 203 | if (received < budget) { |
204 | netif_rx_complete(vi->dev, napi); | 204 | netif_rx_complete(vi->dev, napi); |
205 | if (unlikely(!vi->rvq->vq_ops->enable_cb(vi->rvq)) | 205 | if (unlikely(!vi->rvq->vq_ops->enable_cb(vi->rvq)) |
206 | && netif_rx_reschedule(vi->dev, napi)) | 206 | && napi_schedule_prep(napi)) { |
207 | vi->rvq->vq_ops->disable_cb(vi->rvq); | ||
208 | __netif_rx_schedule(vi->dev, napi); | ||
207 | goto again; | 209 | goto again; |
210 | } | ||
208 | } | 211 | } |
209 | 212 | ||
210 | return received; | 213 | return received; |
@@ -278,10 +281,11 @@ again: | |||
278 | pr_debug("%s: virtio not prepared to send\n", dev->name); | 281 | pr_debug("%s: virtio not prepared to send\n", dev->name); |
279 | netif_stop_queue(dev); | 282 | netif_stop_queue(dev); |
280 | 283 | ||
281 | /* Activate callback for using skbs: if this fails it | 284 | /* Activate callback for using skbs: if this returns false it |
282 | * means some were used in the meantime. */ | 285 | * means some were used in the meantime. */ |
283 | if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) { | 286 | if (unlikely(!vi->svq->vq_ops->enable_cb(vi->svq))) { |
284 | printk("Unlikely: restart svq failed\n"); | 287 | printk("Unlikely: restart svq race\n"); |
288 | vi->svq->vq_ops->disable_cb(vi->svq); | ||
285 | netif_start_queue(dev); | 289 | netif_start_queue(dev); |
286 | goto again; | 290 | goto again; |
287 | } | 291 | } |
@@ -294,6 +298,15 @@ again: | |||
294 | return 0; | 298 | return 0; |
295 | } | 299 | } |
296 | 300 | ||
301 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
302 | static void virtnet_netpoll(struct net_device *dev) | ||
303 | { | ||
304 | struct virtnet_info *vi = netdev_priv(dev); | ||
305 | |||
306 | napi_schedule(&vi->napi); | ||
307 | } | ||
308 | #endif | ||
309 | |||
297 | static int virtnet_open(struct net_device *dev) | 310 | static int virtnet_open(struct net_device *dev) |
298 | { | 311 | { |
299 | struct virtnet_info *vi = netdev_priv(dev); | 312 | struct virtnet_info *vi = netdev_priv(dev); |
@@ -336,6 +349,9 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
336 | dev->stop = virtnet_close; | 349 | dev->stop = virtnet_close; |
337 | dev->hard_start_xmit = start_xmit; | 350 | dev->hard_start_xmit = start_xmit; |
338 | dev->features = NETIF_F_HIGHDMA; | 351 | dev->features = NETIF_F_HIGHDMA; |
352 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
353 | dev->poll_controller = virtnet_netpoll; | ||
354 | #endif | ||
339 | SET_NETDEV_DEV(dev, &vdev->dev); | 355 | SET_NETDEV_DEV(dev, &vdev->dev); |
340 | 356 | ||
341 | /* Do we support "hardware" checksums? */ | 357 | /* Do we support "hardware" checksums? */ |
diff --git a/drivers/parisc/Kconfig b/drivers/parisc/Kconfig index 1d3b84b4af3f..553a9905299a 100644 --- a/drivers/parisc/Kconfig +++ b/drivers/parisc/Kconfig | |||
@@ -103,6 +103,11 @@ config IOMMU_SBA | |||
103 | depends on PCI_LBA | 103 | depends on PCI_LBA |
104 | default PCI_LBA | 104 | default PCI_LBA |
105 | 105 | ||
106 | config IOMMU_HELPER | ||
107 | bool | ||
108 | depends on IOMMU_SBA || IOMMU_CCIO | ||
109 | default y | ||
110 | |||
106 | #config PCI_EPIC | 111 | #config PCI_EPIC |
107 | # bool "EPIC/SAGA PCI support" | 112 | # bool "EPIC/SAGA PCI support" |
108 | # depends on PCI | 113 | # depends on PCI |
diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c index d08b284de196..62db3c3fe4dc 100644 --- a/drivers/parisc/ccio-dma.c +++ b/drivers/parisc/ccio-dma.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <linux/proc_fs.h> | 43 | #include <linux/proc_fs.h> |
44 | #include <linux/seq_file.h> | 44 | #include <linux/seq_file.h> |
45 | #include <linux/scatterlist.h> | 45 | #include <linux/scatterlist.h> |
46 | #include <linux/iommu-helper.h> | ||
46 | 47 | ||
47 | #include <asm/byteorder.h> | 48 | #include <asm/byteorder.h> |
48 | #include <asm/cache.h> /* for L1_CACHE_BYTES */ | 49 | #include <asm/cache.h> /* for L1_CACHE_BYTES */ |
@@ -302,13 +303,17 @@ static int ioc_count; | |||
302 | */ | 303 | */ |
303 | #define CCIO_SEARCH_LOOP(ioc, res_idx, mask, size) \ | 304 | #define CCIO_SEARCH_LOOP(ioc, res_idx, mask, size) \ |
304 | for(; res_ptr < res_end; ++res_ptr) { \ | 305 | for(; res_ptr < res_end; ++res_ptr) { \ |
305 | if(0 == (*res_ptr & mask)) { \ | 306 | int ret;\ |
306 | *res_ptr |= mask; \ | 307 | unsigned int idx;\ |
307 | res_idx = (unsigned int)((unsigned long)res_ptr - (unsigned long)ioc->res_map); \ | 308 | idx = (unsigned int)((unsigned long)res_ptr - (unsigned long)ioc->res_map); \ |
308 | ioc->res_hint = res_idx + (size >> 3); \ | 309 | ret = iommu_is_span_boundary(idx << 3, pages_needed, 0, boundary_size);\ |
309 | goto resource_found; \ | 310 | if ((0 == (*res_ptr & mask)) && !ret) { \ |
310 | } \ | 311 | *res_ptr |= mask; \ |
311 | } | 312 | res_idx = idx;\ |
313 | ioc->res_hint = res_idx + (size >> 3); \ | ||
314 | goto resource_found; \ | ||
315 | } \ | ||
316 | } | ||
312 | 317 | ||
313 | #define CCIO_FIND_FREE_MAPPING(ioa, res_idx, mask, size) \ | 318 | #define CCIO_FIND_FREE_MAPPING(ioa, res_idx, mask, size) \ |
314 | u##size *res_ptr = (u##size *)&((ioc)->res_map[ioa->res_hint & ~((size >> 3) - 1)]); \ | 319 | u##size *res_ptr = (u##size *)&((ioc)->res_map[ioa->res_hint & ~((size >> 3) - 1)]); \ |
@@ -341,10 +346,11 @@ static int ioc_count; | |||
341 | * of available pages for the requested size. | 346 | * of available pages for the requested size. |
342 | */ | 347 | */ |
343 | static int | 348 | static int |
344 | ccio_alloc_range(struct ioc *ioc, size_t size) | 349 | ccio_alloc_range(struct ioc *ioc, struct device *dev, size_t size) |
345 | { | 350 | { |
346 | unsigned int pages_needed = size >> IOVP_SHIFT; | 351 | unsigned int pages_needed = size >> IOVP_SHIFT; |
347 | unsigned int res_idx; | 352 | unsigned int res_idx; |
353 | unsigned long boundary_size; | ||
348 | #ifdef CCIO_SEARCH_TIME | 354 | #ifdef CCIO_SEARCH_TIME |
349 | unsigned long cr_start = mfctl(16); | 355 | unsigned long cr_start = mfctl(16); |
350 | #endif | 356 | #endif |
@@ -360,6 +366,9 @@ ccio_alloc_range(struct ioc *ioc, size_t size) | |||
360 | ** ggg sacrifices another 710 to the computer gods. | 366 | ** ggg sacrifices another 710 to the computer gods. |
361 | */ | 367 | */ |
362 | 368 | ||
369 | boundary_size = ALIGN((unsigned long long)dma_get_seg_boundary(dev) + 1, | ||
370 | 1ULL << IOVP_SHIFT) >> IOVP_SHIFT; | ||
371 | |||
363 | if (pages_needed <= 8) { | 372 | if (pages_needed <= 8) { |
364 | /* | 373 | /* |
365 | * LAN traffic will not thrash the TLB IFF the same NIC | 374 | * LAN traffic will not thrash the TLB IFF the same NIC |
@@ -760,7 +769,7 @@ ccio_map_single(struct device *dev, void *addr, size_t size, | |||
760 | ioc->msingle_pages += size >> IOVP_SHIFT; | 769 | ioc->msingle_pages += size >> IOVP_SHIFT; |
761 | #endif | 770 | #endif |
762 | 771 | ||
763 | idx = ccio_alloc_range(ioc, size); | 772 | idx = ccio_alloc_range(ioc, dev, size); |
764 | iovp = (dma_addr_t)MKIOVP(idx); | 773 | iovp = (dma_addr_t)MKIOVP(idx); |
765 | 774 | ||
766 | pdir_start = &(ioc->pdir_base[idx]); | 775 | pdir_start = &(ioc->pdir_base[idx]); |
diff --git a/drivers/parisc/iommu-helpers.h b/drivers/parisc/iommu-helpers.h index 97ba8286c596..a9c46cc2db37 100644 --- a/drivers/parisc/iommu-helpers.h +++ b/drivers/parisc/iommu-helpers.h | |||
@@ -96,8 +96,8 @@ iommu_fill_pdir(struct ioc *ioc, struct scatterlist *startsg, int nents, | |||
96 | 96 | ||
97 | static inline unsigned int | 97 | static inline unsigned int |
98 | iommu_coalesce_chunks(struct ioc *ioc, struct device *dev, | 98 | iommu_coalesce_chunks(struct ioc *ioc, struct device *dev, |
99 | struct scatterlist *startsg, int nents, | 99 | struct scatterlist *startsg, int nents, |
100 | int (*iommu_alloc_range)(struct ioc *, size_t)) | 100 | int (*iommu_alloc_range)(struct ioc *, struct device *, size_t)) |
101 | { | 101 | { |
102 | struct scatterlist *contig_sg; /* contig chunk head */ | 102 | struct scatterlist *contig_sg; /* contig chunk head */ |
103 | unsigned long dma_offset, dma_len; /* start/len of DMA stream */ | 103 | unsigned long dma_offset, dma_len; /* start/len of DMA stream */ |
@@ -166,7 +166,7 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device *dev, | |||
166 | dma_len = ALIGN(dma_len + dma_offset, IOVP_SIZE); | 166 | dma_len = ALIGN(dma_len + dma_offset, IOVP_SIZE); |
167 | sg_dma_address(contig_sg) = | 167 | sg_dma_address(contig_sg) = |
168 | PIDE_FLAG | 168 | PIDE_FLAG |
169 | | (iommu_alloc_range(ioc, dma_len) << IOVP_SHIFT) | 169 | | (iommu_alloc_range(ioc, dev, dma_len) << IOVP_SHIFT) |
170 | | dma_offset; | 170 | | dma_offset; |
171 | n_mappings++; | 171 | n_mappings++; |
172 | } | 172 | } |
diff --git a/drivers/parisc/pdc_stable.c b/drivers/parisc/pdc_stable.c index de34aa9d3136..f9f9a5f1bbd0 100644 --- a/drivers/parisc/pdc_stable.c +++ b/drivers/parisc/pdc_stable.c | |||
@@ -829,7 +829,7 @@ static ssize_t pdcs_autoboot_write(struct kobject *kobj, | |||
829 | struct kobj_attribute *attr, | 829 | struct kobj_attribute *attr, |
830 | const char *buf, size_t count) | 830 | const char *buf, size_t count) |
831 | { | 831 | { |
832 | return pdcs_auto_write(kset, attr, buf, count, PF_AUTOBOOT); | 832 | return pdcs_auto_write(kobj, attr, buf, count, PF_AUTOBOOT); |
833 | } | 833 | } |
834 | 834 | ||
835 | /** | 835 | /** |
@@ -845,7 +845,7 @@ static ssize_t pdcs_autosearch_write(struct kobject *kobj, | |||
845 | struct kobj_attribute *attr, | 845 | struct kobj_attribute *attr, |
846 | const char *buf, size_t count) | 846 | const char *buf, size_t count) |
847 | { | 847 | { |
848 | return pdcs_auto_write(kset, attr, buf, count, PF_AUTOSEARCH); | 848 | return pdcs_auto_write(kobj, attr, buf, count, PF_AUTOSEARCH); |
849 | } | 849 | } |
850 | 850 | ||
851 | /** | 851 | /** |
@@ -1066,7 +1066,7 @@ pdc_stable_init(void) | |||
1066 | } | 1066 | } |
1067 | 1067 | ||
1068 | /* Don't forget the root entries */ | 1068 | /* Don't forget the root entries */ |
1069 | error = sysfs_create_group(stable_kobj, pdcs_attr_group); | 1069 | error = sysfs_create_group(stable_kobj, &pdcs_attr_group); |
1070 | 1070 | ||
1071 | /* register the paths kset as a child of the stable kset */ | 1071 | /* register the paths kset as a child of the stable kset */ |
1072 | paths_kset = kset_create_and_add("paths", NULL, stable_kobj); | 1072 | paths_kset = kset_create_and_add("paths", NULL, stable_kobj); |
diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index d06627c3f353..8c4d2c13d5f2 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/string.h> | 29 | #include <linux/string.h> |
30 | #include <linux/pci.h> | 30 | #include <linux/pci.h> |
31 | #include <linux/scatterlist.h> | 31 | #include <linux/scatterlist.h> |
32 | #include <linux/iommu-helper.h> | ||
32 | 33 | ||
33 | #include <asm/byteorder.h> | 34 | #include <asm/byteorder.h> |
34 | #include <asm/io.h> | 35 | #include <asm/io.h> |
@@ -313,6 +314,12 @@ sba_dump_sg( struct ioc *ioc, struct scatterlist *startsg, int nents) | |||
313 | #define RESMAP_MASK(n) (~0UL << (BITS_PER_LONG - (n))) | 314 | #define RESMAP_MASK(n) (~0UL << (BITS_PER_LONG - (n))) |
314 | #define RESMAP_IDX_MASK (sizeof(unsigned long) - 1) | 315 | #define RESMAP_IDX_MASK (sizeof(unsigned long) - 1) |
315 | 316 | ||
317 | static unsigned long ptr_to_pide(struct ioc *ioc, unsigned long *res_ptr, | ||
318 | unsigned int bitshiftcnt) | ||
319 | { | ||
320 | return (((unsigned long)res_ptr - (unsigned long)ioc->res_map) << 3) | ||
321 | + bitshiftcnt; | ||
322 | } | ||
316 | 323 | ||
317 | /** | 324 | /** |
318 | * sba_search_bitmap - find free space in IO PDIR resource bitmap | 325 | * sba_search_bitmap - find free space in IO PDIR resource bitmap |
@@ -324,19 +331,36 @@ sba_dump_sg( struct ioc *ioc, struct scatterlist *startsg, int nents) | |||
324 | * Cool perf optimization: search for log2(size) bits at a time. | 331 | * Cool perf optimization: search for log2(size) bits at a time. |
325 | */ | 332 | */ |
326 | static SBA_INLINE unsigned long | 333 | static SBA_INLINE unsigned long |
327 | sba_search_bitmap(struct ioc *ioc, unsigned long bits_wanted) | 334 | sba_search_bitmap(struct ioc *ioc, struct device *dev, |
335 | unsigned long bits_wanted) | ||
328 | { | 336 | { |
329 | unsigned long *res_ptr = ioc->res_hint; | 337 | unsigned long *res_ptr = ioc->res_hint; |
330 | unsigned long *res_end = (unsigned long *) &(ioc->res_map[ioc->res_size]); | 338 | unsigned long *res_end = (unsigned long *) &(ioc->res_map[ioc->res_size]); |
331 | unsigned long pide = ~0UL; | 339 | unsigned long pide = ~0UL, tpide; |
340 | unsigned long boundary_size; | ||
341 | unsigned long shift; | ||
342 | int ret; | ||
343 | |||
344 | boundary_size = ALIGN((unsigned long long)dma_get_seg_boundary(dev) + 1, | ||
345 | 1ULL << IOVP_SHIFT) >> IOVP_SHIFT; | ||
346 | |||
347 | #if defined(ZX1_SUPPORT) | ||
348 | BUG_ON(ioc->ibase & ~IOVP_MASK); | ||
349 | shift = ioc->ibase >> IOVP_SHIFT; | ||
350 | #else | ||
351 | shift = 0; | ||
352 | #endif | ||
332 | 353 | ||
333 | if (bits_wanted > (BITS_PER_LONG/2)) { | 354 | if (bits_wanted > (BITS_PER_LONG/2)) { |
334 | /* Search word at a time - no mask needed */ | 355 | /* Search word at a time - no mask needed */ |
335 | for(; res_ptr < res_end; ++res_ptr) { | 356 | for(; res_ptr < res_end; ++res_ptr) { |
336 | if (*res_ptr == 0) { | 357 | tpide = ptr_to_pide(ioc, res_ptr, 0); |
358 | ret = iommu_is_span_boundary(tpide, bits_wanted, | ||
359 | shift, | ||
360 | boundary_size); | ||
361 | if ((*res_ptr == 0) && !ret) { | ||
337 | *res_ptr = RESMAP_MASK(bits_wanted); | 362 | *res_ptr = RESMAP_MASK(bits_wanted); |
338 | pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map); | 363 | pide = tpide; |
339 | pide <<= 3; /* convert to bit address */ | ||
340 | break; | 364 | break; |
341 | } | 365 | } |
342 | } | 366 | } |
@@ -365,11 +389,13 @@ sba_search_bitmap(struct ioc *ioc, unsigned long bits_wanted) | |||
365 | { | 389 | { |
366 | DBG_RES(" %p %lx %lx\n", res_ptr, mask, *res_ptr); | 390 | DBG_RES(" %p %lx %lx\n", res_ptr, mask, *res_ptr); |
367 | WARN_ON(mask == 0); | 391 | WARN_ON(mask == 0); |
368 | if(((*res_ptr) & mask) == 0) { | 392 | tpide = ptr_to_pide(ioc, res_ptr, bitshiftcnt); |
393 | ret = iommu_is_span_boundary(tpide, bits_wanted, | ||
394 | shift, | ||
395 | boundary_size); | ||
396 | if ((((*res_ptr) & mask) == 0) && !ret) { | ||
369 | *res_ptr |= mask; /* mark resources busy! */ | 397 | *res_ptr |= mask; /* mark resources busy! */ |
370 | pide = ((unsigned long)res_ptr - (unsigned long)ioc->res_map); | 398 | pide = tpide; |
371 | pide <<= 3; /* convert to bit address */ | ||
372 | pide += bitshiftcnt; | ||
373 | break; | 399 | break; |
374 | } | 400 | } |
375 | mask >>= o; | 401 | mask >>= o; |
@@ -404,7 +430,7 @@ sba_search_bitmap(struct ioc *ioc, unsigned long bits_wanted) | |||
404 | * resource bit map. | 430 | * resource bit map. |
405 | */ | 431 | */ |
406 | static int | 432 | static int |
407 | sba_alloc_range(struct ioc *ioc, size_t size) | 433 | sba_alloc_range(struct ioc *ioc, struct device *dev, size_t size) |
408 | { | 434 | { |
409 | unsigned int pages_needed = size >> IOVP_SHIFT; | 435 | unsigned int pages_needed = size >> IOVP_SHIFT; |
410 | #ifdef SBA_COLLECT_STATS | 436 | #ifdef SBA_COLLECT_STATS |
@@ -412,9 +438,9 @@ sba_alloc_range(struct ioc *ioc, size_t size) | |||
412 | #endif | 438 | #endif |
413 | unsigned long pide; | 439 | unsigned long pide; |
414 | 440 | ||
415 | pide = sba_search_bitmap(ioc, pages_needed); | 441 | pide = sba_search_bitmap(ioc, dev, pages_needed); |
416 | if (pide >= (ioc->res_size << 3)) { | 442 | if (pide >= (ioc->res_size << 3)) { |
417 | pide = sba_search_bitmap(ioc, pages_needed); | 443 | pide = sba_search_bitmap(ioc, dev, pages_needed); |
418 | if (pide >= (ioc->res_size << 3)) | 444 | if (pide >= (ioc->res_size << 3)) |
419 | panic("%s: I/O MMU @ %p is out of mapping resources\n", | 445 | panic("%s: I/O MMU @ %p is out of mapping resources\n", |
420 | __FILE__, ioc->ioc_hpa); | 446 | __FILE__, ioc->ioc_hpa); |
@@ -710,7 +736,7 @@ sba_map_single(struct device *dev, void *addr, size_t size, | |||
710 | ioc->msingle_calls++; | 736 | ioc->msingle_calls++; |
711 | ioc->msingle_pages += size >> IOVP_SHIFT; | 737 | ioc->msingle_pages += size >> IOVP_SHIFT; |
712 | #endif | 738 | #endif |
713 | pide = sba_alloc_range(ioc, size); | 739 | pide = sba_alloc_range(ioc, dev, size); |
714 | iovp = (dma_addr_t) pide << IOVP_SHIFT; | 740 | iovp = (dma_addr_t) pide << IOVP_SHIFT; |
715 | 741 | ||
716 | DBG_RUN("%s() 0x%p -> 0x%lx\n", | 742 | DBG_RUN("%s() 0x%p -> 0x%lx\n", |
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index ef5a6a245f5f..d708358326e5 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c | |||
@@ -143,15 +143,21 @@ void pci_bus_add_devices(struct pci_bus *bus) | |||
143 | /* register the bus with sysfs as the parent is now | 143 | /* register the bus with sysfs as the parent is now |
144 | * properly registered. */ | 144 | * properly registered. */ |
145 | child_bus = dev->subordinate; | 145 | child_bus = dev->subordinate; |
146 | if (child_bus->is_added) | ||
147 | continue; | ||
146 | child_bus->dev.parent = child_bus->bridge; | 148 | child_bus->dev.parent = child_bus->bridge; |
147 | retval = device_register(&child_bus->dev); | 149 | retval = device_register(&child_bus->dev); |
148 | if (!retval) | 150 | if (retval) |
151 | dev_err(&dev->dev, "Error registering pci_bus," | ||
152 | " continuing...\n"); | ||
153 | else { | ||
154 | child_bus->is_added = 1; | ||
149 | retval = device_create_file(&child_bus->dev, | 155 | retval = device_create_file(&child_bus->dev, |
150 | &dev_attr_cpuaffinity); | 156 | &dev_attr_cpuaffinity); |
157 | } | ||
151 | if (retval) | 158 | if (retval) |
152 | dev_err(&dev->dev, "Error registering pci_bus" | 159 | dev_err(&dev->dev, "Error creating cpuaffinity" |
153 | " device bridge symlink," | 160 | " file, continuing...\n"); |
154 | " continuing...\n"); | ||
155 | } | 161 | } |
156 | } | 162 | } |
157 | } | 163 | } |
diff --git a/drivers/pci/hotplug-pci.c b/drivers/pci/hotplug-pci.c index a590ef682153..4d4a64478404 100644 --- a/drivers/pci/hotplug-pci.c +++ b/drivers/pci/hotplug-pci.c | |||
@@ -4,7 +4,7 @@ | |||
4 | #include "pci.h" | 4 | #include "pci.h" |
5 | 5 | ||
6 | 6 | ||
7 | unsigned int pci_do_scan_bus(struct pci_bus *bus) | 7 | unsigned int __devinit pci_do_scan_bus(struct pci_bus *bus) |
8 | { | 8 | { |
9 | unsigned int max; | 9 | unsigned int max; |
10 | 10 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index cf22f9e01e00..5e50008d1181 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
@@ -1085,7 +1085,7 @@ static int acpiphp_bus_trim(acpi_handle handle) | |||
1085 | * This function should be called per *physical slot*, | 1085 | * This function should be called per *physical slot*, |
1086 | * not per each slot object in ACPI namespace. | 1086 | * not per each slot object in ACPI namespace. |
1087 | */ | 1087 | */ |
1088 | static int enable_device(struct acpiphp_slot *slot) | 1088 | static int __ref enable_device(struct acpiphp_slot *slot) |
1089 | { | 1089 | { |
1090 | struct pci_dev *dev; | 1090 | struct pci_dev *dev; |
1091 | struct pci_bus *bus = slot->bridge->pci_bus; | 1091 | struct pci_bus *bus = slot->bridge->pci_bus; |
diff --git a/drivers/pci/hotplug/cpci_hotplug_pci.c b/drivers/pci/hotplug/cpci_hotplug_pci.c index 5e9be44817cb..b3515fc4cd38 100644 --- a/drivers/pci/hotplug/cpci_hotplug_pci.c +++ b/drivers/pci/hotplug/cpci_hotplug_pci.c | |||
@@ -250,7 +250,7 @@ int cpci_led_off(struct slot* slot) | |||
250 | * Device configuration functions | 250 | * Device configuration functions |
251 | */ | 251 | */ |
252 | 252 | ||
253 | int cpci_configure_slot(struct slot* slot) | 253 | int __ref cpci_configure_slot(struct slot *slot) |
254 | { | 254 | { |
255 | struct pci_bus *parent; | 255 | struct pci_bus *parent; |
256 | int fn; | 256 | int fn; |
diff --git a/drivers/pci/hotplug/ibmphp_ebda.c b/drivers/pci/hotplug/ibmphp_ebda.c index 600ed7b67ae7..bbccde9f228f 100644 --- a/drivers/pci/hotplug/ibmphp_ebda.c +++ b/drivers/pci/hotplug/ibmphp_ebda.c | |||
@@ -963,6 +963,7 @@ static int __init ebda_rsrc_controller (void) | |||
963 | 963 | ||
964 | bus_info_ptr1 = ibmphp_find_same_bus_num (hpc_ptr->slots[index].slot_bus_num); | 964 | bus_info_ptr1 = ibmphp_find_same_bus_num (hpc_ptr->slots[index].slot_bus_num); |
965 | if (!bus_info_ptr1) { | 965 | if (!bus_info_ptr1) { |
966 | kfree(tmp_slot); | ||
966 | rc = -ENODEV; | 967 | rc = -ENODEV; |
967 | goto error; | 968 | goto error; |
968 | } | 969 | } |
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 6eba9b2cfb90..698975a6a21c 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c | |||
@@ -711,7 +711,8 @@ static int hpc_power_off_slot(struct slot * slot) | |||
711 | retval = pcie_write_cmd(slot, slot_cmd, cmd_mask); | 711 | retval = pcie_write_cmd(slot, slot_cmd, cmd_mask); |
712 | if (retval) { | 712 | if (retval) { |
713 | err("%s: Write command failed!\n", __FUNCTION__); | 713 | err("%s: Write command failed!\n", __FUNCTION__); |
714 | return -1; | 714 | retval = -1; |
715 | goto out; | ||
715 | } | 716 | } |
716 | dbg("%s: SLOTCTRL %x write cmd %x\n", | 717 | dbg("%s: SLOTCTRL %x write cmd %x\n", |
717 | __FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_cmd); | 718 | __FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_cmd); |
@@ -722,7 +723,7 @@ static int hpc_power_off_slot(struct slot * slot) | |||
722 | * removed from the slot/adapter. | 723 | * removed from the slot/adapter. |
723 | */ | 724 | */ |
724 | msleep(1000); | 725 | msleep(1000); |
725 | 726 | out: | |
726 | if (changed) | 727 | if (changed) |
727 | pcie_unmask_bad_dllp(ctrl); | 728 | pcie_unmask_bad_dllp(ctrl); |
728 | 729 | ||
diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c index dd50713966d1..9372a840b63d 100644 --- a/drivers/pci/hotplug/pciehp_pci.c +++ b/drivers/pci/hotplug/pciehp_pci.c | |||
@@ -167,7 +167,7 @@ static void program_fw_provided_values(struct pci_dev *dev) | |||
167 | } | 167 | } |
168 | } | 168 | } |
169 | 169 | ||
170 | static int pciehp_add_bridge(struct pci_dev *dev) | 170 | static int __ref pciehp_add_bridge(struct pci_dev *dev) |
171 | { | 171 | { |
172 | struct pci_bus *parent = dev->bus; | 172 | struct pci_bus *parent = dev->bus; |
173 | int pass, busnr, start = parent->secondary; | 173 | int pass, busnr, start = parent->secondary; |
diff --git a/drivers/pci/hotplug/shpchp_pci.c b/drivers/pci/hotplug/shpchp_pci.c index 0a6b25ef194c..a69a21520895 100644 --- a/drivers/pci/hotplug/shpchp_pci.c +++ b/drivers/pci/hotplug/shpchp_pci.c | |||
@@ -96,7 +96,7 @@ static void program_fw_provided_values(struct pci_dev *dev) | |||
96 | } | 96 | } |
97 | } | 97 | } |
98 | 98 | ||
99 | int shpchp_configure_device(struct slot *p_slot) | 99 | int __ref shpchp_configure_device(struct slot *p_slot) |
100 | { | 100 | { |
101 | struct pci_dev *dev; | 101 | struct pci_dev *dev; |
102 | struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate; | 102 | struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate; |
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 4a23654184fc..72f7476930c8 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c | |||
@@ -272,21 +272,29 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
272 | { | 272 | { |
273 | acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev); | 273 | acpi_handle handle = DEVICE_ACPI_HANDLE(&dev->dev); |
274 | acpi_handle tmp; | 274 | acpi_handle tmp; |
275 | static int state_conv[] = { | 275 | static const u8 state_conv[] = { |
276 | [0] = 0, | 276 | [PCI_D0] = ACPI_STATE_D0, |
277 | [1] = 1, | 277 | [PCI_D1] = ACPI_STATE_D1, |
278 | [2] = 2, | 278 | [PCI_D2] = ACPI_STATE_D2, |
279 | [3] = 3, | 279 | [PCI_D3hot] = ACPI_STATE_D3, |
280 | [4] = 3 | 280 | [PCI_D3cold] = ACPI_STATE_D3 |
281 | }; | 281 | }; |
282 | int acpi_state = state_conv[(int __force) state]; | ||
283 | 282 | ||
284 | if (!handle) | 283 | if (!handle) |
285 | return -ENODEV; | 284 | return -ENODEV; |
286 | /* If the ACPI device has _EJ0, ignore the device */ | 285 | /* If the ACPI device has _EJ0, ignore the device */ |
287 | if (ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp))) | 286 | if (ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp))) |
288 | return 0; | 287 | return 0; |
289 | return acpi_bus_set_power(handle, acpi_state); | 288 | |
289 | switch (state) { | ||
290 | case PCI_D0: | ||
291 | case PCI_D1: | ||
292 | case PCI_D2: | ||
293 | case PCI_D3hot: | ||
294 | case PCI_D3cold: | ||
295 | return acpi_bus_set_power(handle, state_conv[state]); | ||
296 | } | ||
297 | return -EINVAL; | ||
290 | } | 298 | } |
291 | 299 | ||
292 | 300 | ||
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 4d23b9fb551b..2db2e4bb0d1e 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -286,7 +286,7 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) | |||
286 | } | 286 | } |
287 | } | 287 | } |
288 | 288 | ||
289 | void pci_read_bridge_bases(struct pci_bus *child) | 289 | void __devinit pci_read_bridge_bases(struct pci_bus *child) |
290 | { | 290 | { |
291 | struct pci_dev *dev = child->self; | 291 | struct pci_dev *dev = child->self; |
292 | u8 io_base_lo, io_limit_lo; | 292 | u8 io_base_lo, io_limit_lo; |
@@ -472,7 +472,7 @@ static void pci_fixup_parent_subordinate_busnr(struct pci_bus *child, int max) | |||
472 | * them, we proceed to assigning numbers to the remaining buses in | 472 | * them, we proceed to assigning numbers to the remaining buses in |
473 | * order to avoid overlaps between old and new bus numbers. | 473 | * order to avoid overlaps between old and new bus numbers. |
474 | */ | 474 | */ |
475 | int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass) | 475 | int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max, int pass) |
476 | { | 476 | { |
477 | struct pci_bus *child; | 477 | struct pci_bus *child; |
478 | int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS); | 478 | int is_cardbus = (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS); |
@@ -1008,7 +1008,7 @@ int pci_scan_slot(struct pci_bus *bus, int devfn) | |||
1008 | return nr; | 1008 | return nr; |
1009 | } | 1009 | } |
1010 | 1010 | ||
1011 | unsigned int pci_scan_child_bus(struct pci_bus *bus) | 1011 | unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus) |
1012 | { | 1012 | { |
1013 | unsigned int devfn, pass, max = bus->secondary; | 1013 | unsigned int devfn, pass, max = bus->secondary; |
1014 | struct pci_dev *dev; | 1014 | struct pci_dev *dev; |
@@ -1116,7 +1116,7 @@ err_out: | |||
1116 | return NULL; | 1116 | return NULL; |
1117 | } | 1117 | } |
1118 | 1118 | ||
1119 | struct pci_bus *pci_scan_bus_parented(struct device *parent, | 1119 | struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, |
1120 | int bus, struct pci_ops *ops, void *sysdata) | 1120 | int bus, struct pci_ops *ops, void *sysdata) |
1121 | { | 1121 | { |
1122 | struct pci_bus *b; | 1122 | struct pci_bus *b; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index bbad4a9f264f..e9a333d98552 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -1652,9 +1652,8 @@ static void __devinit quirk_via_cx700_pci_parking_caching(struct pci_dev *dev) | |||
1652 | pci_write_config_byte(dev, 0x75, 0x1); | 1652 | pci_write_config_byte(dev, 0x75, 0x1); |
1653 | pci_write_config_byte(dev, 0x77, 0x0); | 1653 | pci_write_config_byte(dev, 0x77, 0x0); |
1654 | 1654 | ||
1655 | printk(KERN_INFO | 1655 | dev_info(&dev->dev, |
1656 | "PCI: VIA CX700 PCI parking/caching fixup on %s\n", | 1656 | "Disabling VIA CX700 PCI parking/caching\n"); |
1657 | pci_name(dev)); | ||
1658 | } | 1657 | } |
1659 | } | 1658 | } |
1660 | } | 1659 | } |
@@ -1726,32 +1725,6 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT2 | |||
1726 | quirk_msi_ht_cap); | 1725 | quirk_msi_ht_cap); |
1727 | 1726 | ||
1728 | 1727 | ||
1729 | /* | ||
1730 | * Force enable MSI mapping capability on HT bridges | ||
1731 | */ | ||
1732 | static void __devinit quirk_msi_ht_cap_enable(struct pci_dev *dev) | ||
1733 | { | ||
1734 | int pos, ttl = 48; | ||
1735 | |||
1736 | pos = pci_find_ht_capability(dev, HT_CAPTYPE_MSI_MAPPING); | ||
1737 | while (pos && ttl--) { | ||
1738 | u8 flags; | ||
1739 | |||
1740 | if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS, &flags) == 0) { | ||
1741 | printk(KERN_INFO "PCI: Enabling HT MSI Mapping on %s\n", | ||
1742 | pci_name(dev)); | ||
1743 | |||
1744 | pci_write_config_byte(dev, pos + HT_MSI_FLAGS, | ||
1745 | flags | HT_MSI_FLAGS_ENABLE); | ||
1746 | } | ||
1747 | pos = pci_find_next_ht_capability(dev, pos, | ||
1748 | HT_CAPTYPE_MSI_MAPPING); | ||
1749 | } | ||
1750 | } | ||
1751 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS, | ||
1752 | PCI_DEVICE_ID_SERVERWORKS_HT1000_PXB, | ||
1753 | quirk_msi_ht_cap_enable); | ||
1754 | |||
1755 | /* The nVidia CK804 chipset may have 2 HT MSI mappings. | 1728 | /* The nVidia CK804 chipset may have 2 HT MSI mappings. |
1756 | * MSI are supported if the MSI capability set in any of these mappings. | 1729 | * MSI are supported if the MSI capability set in any of these mappings. |
1757 | */ | 1730 | */ |
@@ -1778,9 +1751,8 @@ static void __devinit quirk_nvidia_ck804_msi_ht_cap(struct pci_dev *dev) | |||
1778 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, | 1751 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, |
1779 | quirk_nvidia_ck804_msi_ht_cap); | 1752 | quirk_nvidia_ck804_msi_ht_cap); |
1780 | 1753 | ||
1781 | /* | 1754 | /* Force enable MSI mapping capability on HT bridges */ |
1782 | * Force enable MSI mapping capability on HT bridges */ | 1755 | static void __devinit ht_enable_msi_mapping(struct pci_dev *dev) |
1783 | static inline void ht_enable_msi_mapping(struct pci_dev *dev) | ||
1784 | { | 1756 | { |
1785 | int pos, ttl = 48; | 1757 | int pos, ttl = 48; |
1786 | 1758 | ||
@@ -1799,6 +1771,9 @@ static inline void ht_enable_msi_mapping(struct pci_dev *dev) | |||
1799 | HT_CAPTYPE_MSI_MAPPING); | 1771 | HT_CAPTYPE_MSI_MAPPING); |
1800 | } | 1772 | } |
1801 | } | 1773 | } |
1774 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS, | ||
1775 | PCI_DEVICE_ID_SERVERWORKS_HT1000_PXB, | ||
1776 | ht_enable_msi_mapping); | ||
1802 | 1777 | ||
1803 | static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev) | 1778 | static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev) |
1804 | { | 1779 | { |
@@ -1830,7 +1805,7 @@ static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev) | |||
1830 | 1805 | ||
1831 | if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS, | 1806 | if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS, |
1832 | &flags) == 0) { | 1807 | &flags) == 0) { |
1833 | dev_info(&dev->dev, "Quirk disabling HT MSI mapping"); | 1808 | dev_info(&dev->dev, "Disabling HT MSI mapping"); |
1834 | pci_write_config_byte(dev, pos + HT_MSI_FLAGS, | 1809 | pci_write_config_byte(dev, pos + HT_MSI_FLAGS, |
1835 | flags & ~HT_MSI_FLAGS_ENABLE); | 1810 | flags & ~HT_MSI_FLAGS_ENABLE); |
1836 | } | 1811 | } |
diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index a98b2470b9ea..bd5c0e031398 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c | |||
@@ -242,8 +242,7 @@ void pci_remove_rom(struct pci_dev *pdev) | |||
242 | #endif /* 0 */ | 242 | #endif /* 0 */ |
243 | 243 | ||
244 | /** | 244 | /** |
245 | * pci_cleanup_rom - internal routine for freeing the ROM copy created | 245 | * pci_cleanup_rom - free the ROM copy created by pci_map_rom_copy |
246 | * by pci_map_rom_copy called from remove.c | ||
247 | * @pdev: pointer to pci device struct | 246 | * @pdev: pointer to pci device struct |
248 | * | 247 | * |
249 | * Free the copied ROM if we allocated one. | 248 | * Free the copied ROM if we allocated one. |
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index 4065139753b6..37993206ae5d 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/pnp.h> | 18 | #include <linux/pnp.h> |
19 | #include <linux/io.h> | 19 | #include <linux/io.h> |
20 | #include <linux/dmi.h> | ||
21 | #include <linux/kallsyms.h> | 20 | #include <linux/kallsyms.h> |
22 | #include "base.h" | 21 | #include "base.h" |
23 | 22 | ||
@@ -109,42 +108,73 @@ static void quirk_sb16audio_resources(struct pnp_dev *dev) | |||
109 | "pnp: SB audio device quirk - increasing port range\n"); | 108 | "pnp: SB audio device quirk - increasing port range\n"); |
110 | } | 109 | } |
111 | 110 | ||
112 | static void quirk_supermicro_h8dce_system(struct pnp_dev *dev) | 111 | |
112 | #include <linux/pci.h> | ||
113 | |||
114 | static void quirk_system_pci_resources(struct pnp_dev *dev) | ||
113 | { | 115 | { |
114 | int i; | 116 | struct pci_dev *pdev = NULL; |
115 | static struct dmi_system_id supermicro_h8dce[] = { | 117 | resource_size_t pnp_start, pnp_end, pci_start, pci_end; |
116 | { | 118 | int i, j; |
117 | .ident = "Supermicro H8DCE", | ||
118 | .matches = { | ||
119 | DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"), | ||
120 | DMI_MATCH(DMI_PRODUCT_NAME, "H8DCE"), | ||
121 | }, | ||
122 | }, | ||
123 | { } | ||
124 | }; | ||
125 | |||
126 | if (!dmi_check_system(supermicro_h8dce)) | ||
127 | return; | ||
128 | 119 | ||
129 | /* | 120 | /* |
130 | * On the Supermicro H8DCE, there's a system device with resources | 121 | * Some BIOSes have PNP motherboard devices with resources that |
131 | * that overlap BAR 6 of the built-in SATA PCI adapter. If the PNP | 122 | * partially overlap PCI BARs. The PNP system driver claims these |
132 | * system device claims them, the sata_nv driver won't be able to. | 123 | * motherboard resources, which prevents the normal PCI driver from |
133 | * More details at: | 124 | * requesting them later. |
134 | * https://bugzilla.redhat.com/show_bug.cgi?id=280641 | 125 | * |
135 | * https://bugzilla.redhat.com/show_bug.cgi?id=313491 | 126 | * This patch disables the PNP resources that conflict with PCI BARs |
136 | * http://lkml.org/lkml/2008/1/9/449 | 127 | * so they won't be claimed by the PNP system driver. |
137 | * http://thread.gmane.org/gmane.linux.acpi.devel/27312 | ||
138 | */ | 128 | */ |
139 | for (i = 0; i < PNP_MAX_MEM; i++) { | 129 | for_each_pci_dev(pdev) { |
140 | if (pnp_mem_valid(dev, i) && pnp_mem_len(dev, i) && | 130 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { |
141 | (pnp_mem_start(dev, i) & 0xdfef0000) == 0xdfef0000) { | 131 | if (!(pci_resource_flags(pdev, i) & IORESOURCE_MEM) || |
142 | dev_warn(&dev->dev, "disabling 0x%llx-0x%llx to prevent" | 132 | pci_resource_len(pdev, i) == 0) |
143 | " conflict with sata_nv PCI device\n", | 133 | continue; |
144 | (unsigned long long) pnp_mem_start(dev, i), | 134 | |
145 | (unsigned long long) (pnp_mem_start(dev, i) + | 135 | pci_start = pci_resource_start(pdev, i); |
146 | pnp_mem_len(dev, i) - 1)); | 136 | pci_end = pci_resource_end(pdev, i); |
147 | pnp_mem_flags(dev, i) = 0; | 137 | for (j = 0; j < PNP_MAX_MEM; j++) { |
138 | if (!pnp_mem_valid(dev, j) || | ||
139 | pnp_mem_len(dev, j) == 0) | ||
140 | continue; | ||
141 | |||
142 | pnp_start = pnp_mem_start(dev, j); | ||
143 | pnp_end = pnp_mem_end(dev, j); | ||
144 | |||
145 | /* | ||
146 | * If the PNP region doesn't overlap the PCI | ||
147 | * region at all, there's no problem. | ||
148 | */ | ||
149 | if (pnp_end < pci_start || pnp_start > pci_end) | ||
150 | continue; | ||
151 | |||
152 | /* | ||
153 | * If the PNP region completely encloses (or is | ||
154 | * at least as large as) the PCI region, that's | ||
155 | * also OK. For example, this happens when the | ||
156 | * PNP device describes a bridge with PCI | ||
157 | * behind it. | ||
158 | */ | ||
159 | if (pnp_start <= pci_start && | ||
160 | pnp_end >= pci_end) | ||
161 | continue; | ||
162 | |||
163 | /* | ||
164 | * Otherwise, the PNP region overlaps *part* of | ||
165 | * the PCI region, and that might prevent a PCI | ||
166 | * driver from requesting its resources. | ||
167 | */ | ||
168 | dev_warn(&dev->dev, "mem resource " | ||
169 | "(0x%llx-0x%llx) overlaps %s BAR %d " | ||
170 | "(0x%llx-0x%llx), disabling\n", | ||
171 | (unsigned long long) pnp_start, | ||
172 | (unsigned long long) pnp_end, | ||
173 | pci_name(pdev), i, | ||
174 | (unsigned long long) pci_start, | ||
175 | (unsigned long long) pci_end); | ||
176 | pnp_mem_flags(dev, j) = 0; | ||
177 | } | ||
148 | } | 178 | } |
149 | } | 179 | } |
150 | } | 180 | } |
@@ -169,8 +199,8 @@ static struct pnp_fixup pnp_fixups[] = { | |||
169 | {"CTL0043", quirk_sb16audio_resources}, | 199 | {"CTL0043", quirk_sb16audio_resources}, |
170 | {"CTL0044", quirk_sb16audio_resources}, | 200 | {"CTL0044", quirk_sb16audio_resources}, |
171 | {"CTL0045", quirk_sb16audio_resources}, | 201 | {"CTL0045", quirk_sb16audio_resources}, |
172 | {"PNP0c01", quirk_supermicro_h8dce_system}, | 202 | {"PNP0c01", quirk_system_pci_resources}, |
173 | {"PNP0c02", quirk_supermicro_h8dce_system}, | 203 | {"PNP0c02", quirk_system_pci_resources}, |
174 | {""} | 204 | {""} |
175 | }; | 205 | }; |
176 | 206 | ||
diff --git a/drivers/rapidio/rio-driver.c b/drivers/rapidio/rio-driver.c index 5480119ff9d3..3ce9f3defc12 100644 --- a/drivers/rapidio/rio-driver.c +++ b/drivers/rapidio/rio-driver.c | |||
@@ -78,8 +78,7 @@ void rio_dev_put(struct rio_dev *rdev) | |||
78 | } | 78 | } |
79 | 79 | ||
80 | /** | 80 | /** |
81 | * rio_device_probe - Tell if a RIO device structure has a matching RIO | 81 | * rio_device_probe - Tell if a RIO device structure has a matching RIO device id structure |
82 | * device id structure | ||
83 | * @id: the RIO device id structure to match against | 82 | * @id: the RIO device id structure to match against |
84 | * @dev: the RIO device structure to match against | 83 | * @dev: the RIO device structure to match against |
85 | * | 84 | * |
@@ -137,7 +136,7 @@ static int rio_device_remove(struct device *dev) | |||
137 | * rio_register_driver - register a new RIO driver | 136 | * rio_register_driver - register a new RIO driver |
138 | * @rdrv: the RIO driver structure to register | 137 | * @rdrv: the RIO driver structure to register |
139 | * | 138 | * |
140 | * Adds a &struct rio_driver to the list of registered drivers | 139 | * Adds a &struct rio_driver to the list of registered drivers. |
141 | * Returns a negative value on error, otherwise 0. If no error | 140 | * Returns a negative value on error, otherwise 0. If no error |
142 | * occurred, the driver remains registered even if no device | 141 | * occurred, the driver remains registered even if no device |
143 | * was claimed during registration. | 142 | * was claimed during registration. |
@@ -167,8 +166,7 @@ void rio_unregister_driver(struct rio_driver *rdrv) | |||
167 | } | 166 | } |
168 | 167 | ||
169 | /** | 168 | /** |
170 | * rio_match_bus - Tell if a RIO device structure has a matching RIO | 169 | * rio_match_bus - Tell if a RIO device structure has a matching RIO driver device id structure |
171 | * driver device id structure | ||
172 | * @dev: the standard device structure to match against | 170 | * @dev: the standard device structure to match against |
173 | * @drv: the standard driver structure containing the ids to match against | 171 | * @drv: the standard driver structure containing the ids to match against |
174 | * | 172 | * |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 6402d699072b..82f5ad9c3af4 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -250,6 +250,15 @@ config RTC_DRV_TWL92330 | |||
250 | platforms. The support is integrated with the rest of | 250 | platforms. The support is integrated with the rest of |
251 | the Menelaus driver; it's not separate module. | 251 | the Menelaus driver; it's not separate module. |
252 | 252 | ||
253 | config RTC_DRV_S35390A | ||
254 | tristate "Seiko Instruments S-35390A" | ||
255 | help | ||
256 | If you say yes here you will get support for the Seiko | ||
257 | Instruments S-35390A. | ||
258 | |||
259 | This driver can also be built as a module. If so the module | ||
260 | will be called rtc-s35390a. | ||
261 | |||
253 | endif # I2C | 262 | endif # I2C |
254 | 263 | ||
255 | comment "SPI RTC drivers" | 264 | comment "SPI RTC drivers" |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index ec703f34ab86..872f1218ff9f 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
@@ -45,6 +45,7 @@ obj-$(CONFIG_RTC_DRV_R9701) += rtc-r9701.o | |||
45 | obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o | 45 | obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o |
46 | obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o | 46 | obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o |
47 | obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o | 47 | obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o |
48 | obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o | ||
48 | obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o | 49 | obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o |
49 | obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o | 50 | obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o |
50 | obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o | 51 | obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o |
diff --git a/drivers/rtc/rtc-s35390a.c b/drivers/rtc/rtc-s35390a.c new file mode 100644 index 000000000000..e8abc90c32c5 --- /dev/null +++ b/drivers/rtc/rtc-s35390a.c | |||
@@ -0,0 +1,316 @@ | |||
1 | /* | ||
2 | * Seiko Instruments S-35390A RTC Driver | ||
3 | * | ||
4 | * Copyright (c) 2007 Byron Bradley | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/module.h> | ||
13 | #include <linux/rtc.h> | ||
14 | #include <linux/i2c.h> | ||
15 | #include <linux/bitrev.h> | ||
16 | #include <linux/bcd.h> | ||
17 | #include <linux/slab.h> | ||
18 | |||
19 | #define S35390A_CMD_STATUS1 0 | ||
20 | #define S35390A_CMD_STATUS2 1 | ||
21 | #define S35390A_CMD_TIME1 2 | ||
22 | |||
23 | #define S35390A_BYTE_YEAR 0 | ||
24 | #define S35390A_BYTE_MONTH 1 | ||
25 | #define S35390A_BYTE_DAY 2 | ||
26 | #define S35390A_BYTE_WDAY 3 | ||
27 | #define S35390A_BYTE_HOURS 4 | ||
28 | #define S35390A_BYTE_MINS 5 | ||
29 | #define S35390A_BYTE_SECS 6 | ||
30 | |||
31 | #define S35390A_FLAG_POC 0x01 | ||
32 | #define S35390A_FLAG_BLD 0x02 | ||
33 | #define S35390A_FLAG_24H 0x40 | ||
34 | #define S35390A_FLAG_RESET 0x80 | ||
35 | #define S35390A_FLAG_TEST 0x01 | ||
36 | |||
37 | struct s35390a { | ||
38 | struct i2c_client *client[8]; | ||
39 | struct rtc_device *rtc; | ||
40 | int twentyfourhour; | ||
41 | }; | ||
42 | |||
43 | static int s35390a_set_reg(struct s35390a *s35390a, int reg, char *buf, int len) | ||
44 | { | ||
45 | struct i2c_client *client = s35390a->client[reg]; | ||
46 | struct i2c_msg msg[] = { | ||
47 | { client->addr, 0, len, buf }, | ||
48 | }; | ||
49 | |||
50 | if ((i2c_transfer(client->adapter, msg, 1)) != 1) | ||
51 | return -EIO; | ||
52 | |||
53 | return 0; | ||
54 | } | ||
55 | |||
56 | static int s35390a_get_reg(struct s35390a *s35390a, int reg, char *buf, int len) | ||
57 | { | ||
58 | struct i2c_client *client = s35390a->client[reg]; | ||
59 | struct i2c_msg msg[] = { | ||
60 | { client->addr, I2C_M_RD, len, buf }, | ||
61 | }; | ||
62 | |||
63 | if ((i2c_transfer(client->adapter, msg, 1)) != 1) | ||
64 | return -EIO; | ||
65 | |||
66 | return 0; | ||
67 | } | ||
68 | |||
69 | static int s35390a_reset(struct s35390a *s35390a) | ||
70 | { | ||
71 | char buf[1]; | ||
72 | |||
73 | if (s35390a_get_reg(s35390a, S35390A_CMD_STATUS1, buf, sizeof(buf)) < 0) | ||
74 | return -EIO; | ||
75 | |||
76 | if (!(buf[0] & (S35390A_FLAG_POC | S35390A_FLAG_BLD))) | ||
77 | return 0; | ||
78 | |||
79 | buf[0] |= (S35390A_FLAG_RESET | S35390A_FLAG_24H); | ||
80 | buf[0] &= 0xf0; | ||
81 | return s35390a_set_reg(s35390a, S35390A_CMD_STATUS1, buf, sizeof(buf)); | ||
82 | } | ||
83 | |||
84 | static int s35390a_disable_test_mode(struct s35390a *s35390a) | ||
85 | { | ||
86 | char buf[1]; | ||
87 | |||
88 | if (s35390a_get_reg(s35390a, S35390A_CMD_STATUS2, buf, sizeof(buf)) < 0) | ||
89 | return -EIO; | ||
90 | |||
91 | if (!(buf[0] & S35390A_FLAG_TEST)) | ||
92 | return 0; | ||
93 | |||
94 | buf[0] &= ~S35390A_FLAG_TEST; | ||
95 | return s35390a_set_reg(s35390a, S35390A_CMD_STATUS2, buf, sizeof(buf)); | ||
96 | } | ||
97 | |||
98 | static char s35390a_hr2reg(struct s35390a *s35390a, int hour) | ||
99 | { | ||
100 | if (s35390a->twentyfourhour) | ||
101 | return BIN2BCD(hour); | ||
102 | |||
103 | if (hour < 12) | ||
104 | return BIN2BCD(hour); | ||
105 | |||
106 | return 0x40 | BIN2BCD(hour - 12); | ||
107 | } | ||
108 | |||
109 | static int s35390a_reg2hr(struct s35390a *s35390a, char reg) | ||
110 | { | ||
111 | unsigned hour; | ||
112 | |||
113 | if (s35390a->twentyfourhour) | ||
114 | return BCD2BIN(reg & 0x3f); | ||
115 | |||
116 | hour = BCD2BIN(reg & 0x3f); | ||
117 | if (reg & 0x40) | ||
118 | hour += 12; | ||
119 | |||
120 | return hour; | ||
121 | } | ||
122 | |||
123 | static int s35390a_set_datetime(struct i2c_client *client, struct rtc_time *tm) | ||
124 | { | ||
125 | struct s35390a *s35390a = i2c_get_clientdata(client); | ||
126 | int i, err; | ||
127 | char buf[7]; | ||
128 | |||
129 | dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d mday=%d, " | ||
130 | "mon=%d, year=%d, wday=%d\n", __func__, tm->tm_sec, | ||
131 | tm->tm_min, tm->tm_hour, tm->tm_mday, tm->tm_mon, tm->tm_year, | ||
132 | tm->tm_wday); | ||
133 | |||
134 | buf[S35390A_BYTE_YEAR] = BIN2BCD(tm->tm_year - 100); | ||
135 | buf[S35390A_BYTE_MONTH] = BIN2BCD(tm->tm_mon + 1); | ||
136 | buf[S35390A_BYTE_DAY] = BIN2BCD(tm->tm_mday); | ||
137 | buf[S35390A_BYTE_WDAY] = BIN2BCD(tm->tm_wday); | ||
138 | buf[S35390A_BYTE_HOURS] = s35390a_hr2reg(s35390a, tm->tm_hour); | ||
139 | buf[S35390A_BYTE_MINS] = BIN2BCD(tm->tm_min); | ||
140 | buf[S35390A_BYTE_SECS] = BIN2BCD(tm->tm_sec); | ||
141 | |||
142 | /* This chip expects the bits of each byte to be in reverse order */ | ||
143 | for (i = 0; i < 7; ++i) | ||
144 | buf[i] = bitrev8(buf[i]); | ||
145 | |||
146 | err = s35390a_set_reg(s35390a, S35390A_CMD_TIME1, buf, sizeof(buf)); | ||
147 | |||
148 | return err; | ||
149 | } | ||
150 | |||
151 | static int s35390a_get_datetime(struct i2c_client *client, struct rtc_time *tm) | ||
152 | { | ||
153 | struct s35390a *s35390a = i2c_get_clientdata(client); | ||
154 | char buf[7]; | ||
155 | int i, err; | ||
156 | |||
157 | err = s35390a_get_reg(s35390a, S35390A_CMD_TIME1, buf, sizeof(buf)); | ||
158 | if (err < 0) | ||
159 | return err; | ||
160 | |||
161 | /* This chip returns the bits of each byte in reverse order */ | ||
162 | for (i = 0; i < 7; ++i) | ||
163 | buf[i] = bitrev8(buf[i]); | ||
164 | |||
165 | tm->tm_sec = BCD2BIN(buf[S35390A_BYTE_SECS]); | ||
166 | tm->tm_min = BCD2BIN(buf[S35390A_BYTE_MINS]); | ||
167 | tm->tm_hour = s35390a_reg2hr(s35390a, buf[S35390A_BYTE_HOURS]); | ||
168 | tm->tm_wday = BCD2BIN(buf[S35390A_BYTE_WDAY]); | ||
169 | tm->tm_mday = BCD2BIN(buf[S35390A_BYTE_DAY]); | ||
170 | tm->tm_mon = BCD2BIN(buf[S35390A_BYTE_MONTH]) - 1; | ||
171 | tm->tm_year = BCD2BIN(buf[S35390A_BYTE_YEAR]) + 100; | ||
172 | |||
173 | dev_dbg(&client->dev, "%s: tm is secs=%d, mins=%d, hours=%d, mday=%d, " | ||
174 | "mon=%d, year=%d, wday=%d\n", __func__, tm->tm_sec, | ||
175 | tm->tm_min, tm->tm_hour, tm->tm_mday, tm->tm_mon, tm->tm_year, | ||
176 | tm->tm_wday); | ||
177 | |||
178 | return rtc_valid_tm(tm); | ||
179 | } | ||
180 | |||
181 | static int s35390a_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
182 | { | ||
183 | return s35390a_get_datetime(to_i2c_client(dev), tm); | ||
184 | } | ||
185 | |||
186 | static int s35390a_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
187 | { | ||
188 | return s35390a_set_datetime(to_i2c_client(dev), tm); | ||
189 | } | ||
190 | |||
191 | static const struct rtc_class_ops s35390a_rtc_ops = { | ||
192 | .read_time = s35390a_rtc_read_time, | ||
193 | .set_time = s35390a_rtc_set_time, | ||
194 | }; | ||
195 | |||
196 | static struct i2c_driver s35390a_driver; | ||
197 | |||
198 | static int s35390a_probe(struct i2c_client *client) | ||
199 | { | ||
200 | int err; | ||
201 | unsigned int i; | ||
202 | struct s35390a *s35390a; | ||
203 | struct rtc_time tm; | ||
204 | char buf[1]; | ||
205 | |||
206 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { | ||
207 | err = -ENODEV; | ||
208 | goto exit; | ||
209 | } | ||
210 | |||
211 | s35390a = kzalloc(sizeof(struct s35390a), GFP_KERNEL); | ||
212 | if (!s35390a) { | ||
213 | err = -ENOMEM; | ||
214 | goto exit; | ||
215 | } | ||
216 | |||
217 | s35390a->client[0] = client; | ||
218 | i2c_set_clientdata(client, s35390a); | ||
219 | |||
220 | /* This chip uses multiple addresses, use dummy devices for them */ | ||
221 | for (i = 1; i < 8; ++i) { | ||
222 | s35390a->client[i] = i2c_new_dummy(client->adapter, | ||
223 | client->addr + i, "rtc-s35390a"); | ||
224 | if (!s35390a->client[i]) { | ||
225 | dev_err(&client->dev, "Address %02x unavailable\n", | ||
226 | client->addr + i); | ||
227 | err = -EBUSY; | ||
228 | goto exit_dummy; | ||
229 | } | ||
230 | } | ||
231 | |||
232 | err = s35390a_reset(s35390a); | ||
233 | if (err < 0) { | ||
234 | dev_err(&client->dev, "error resetting chip\n"); | ||
235 | goto exit_dummy; | ||
236 | } | ||
237 | |||
238 | err = s35390a_disable_test_mode(s35390a); | ||
239 | if (err < 0) { | ||
240 | dev_err(&client->dev, "error disabling test mode\n"); | ||
241 | goto exit_dummy; | ||
242 | } | ||
243 | |||
244 | err = s35390a_get_reg(s35390a, S35390A_CMD_STATUS1, buf, sizeof(buf)); | ||
245 | if (err < 0) { | ||
246 | dev_err(&client->dev, "error checking 12/24 hour mode\n"); | ||
247 | goto exit_dummy; | ||
248 | } | ||
249 | if (buf[0] & S35390A_FLAG_24H) | ||
250 | s35390a->twentyfourhour = 1; | ||
251 | else | ||
252 | s35390a->twentyfourhour = 0; | ||
253 | |||
254 | if (s35390a_get_datetime(client, &tm) < 0) | ||
255 | dev_warn(&client->dev, "clock needs to be set\n"); | ||
256 | |||
257 | s35390a->rtc = rtc_device_register(s35390a_driver.driver.name, | ||
258 | &client->dev, &s35390a_rtc_ops, THIS_MODULE); | ||
259 | |||
260 | if (IS_ERR(s35390a->rtc)) { | ||
261 | err = PTR_ERR(s35390a->rtc); | ||
262 | goto exit_dummy; | ||
263 | } | ||
264 | return 0; | ||
265 | |||
266 | exit_dummy: | ||
267 | for (i = 1; i < 8; ++i) | ||
268 | if (s35390a->client[i]) | ||
269 | i2c_unregister_device(s35390a->client[i]); | ||
270 | kfree(s35390a); | ||
271 | i2c_set_clientdata(client, NULL); | ||
272 | |||
273 | exit: | ||
274 | return err; | ||
275 | } | ||
276 | |||
277 | static int s35390a_remove(struct i2c_client *client) | ||
278 | { | ||
279 | unsigned int i; | ||
280 | |||
281 | struct s35390a *s35390a = i2c_get_clientdata(client); | ||
282 | for (i = 1; i < 8; ++i) | ||
283 | if (s35390a->client[i]) | ||
284 | i2c_unregister_device(s35390a->client[i]); | ||
285 | |||
286 | rtc_device_unregister(s35390a->rtc); | ||
287 | kfree(s35390a); | ||
288 | i2c_set_clientdata(client, NULL); | ||
289 | |||
290 | return 0; | ||
291 | } | ||
292 | |||
293 | static struct i2c_driver s35390a_driver = { | ||
294 | .driver = { | ||
295 | .name = "rtc-s35390a", | ||
296 | }, | ||
297 | .probe = s35390a_probe, | ||
298 | .remove = s35390a_remove, | ||
299 | }; | ||
300 | |||
301 | static int __init s35390a_rtc_init(void) | ||
302 | { | ||
303 | return i2c_add_driver(&s35390a_driver); | ||
304 | } | ||
305 | |||
306 | static void __exit s35390a_rtc_exit(void) | ||
307 | { | ||
308 | i2c_del_driver(&s35390a_driver); | ||
309 | } | ||
310 | |||
311 | MODULE_AUTHOR("Byron Bradley <byron.bbradley@gmail.com>"); | ||
312 | MODULE_DESCRIPTION("S35390A RTC driver"); | ||
313 | MODULE_LICENSE("GPL"); | ||
314 | |||
315 | module_init(s35390a_rtc_init); | ||
316 | module_exit(s35390a_rtc_exit); | ||
diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c index f69714a0e9e7..b19db20a0bef 100644 --- a/drivers/s390/block/dasd_3990_erp.c +++ b/drivers/s390/block/dasd_3990_erp.c | |||
@@ -2310,10 +2310,8 @@ static int | |||
2310 | dasd_3990_erp_error_match(struct dasd_ccw_req *cqr1, struct dasd_ccw_req *cqr2) | 2310 | dasd_3990_erp_error_match(struct dasd_ccw_req *cqr1, struct dasd_ccw_req *cqr2) |
2311 | { | 2311 | { |
2312 | 2312 | ||
2313 | /* check failed CCW */ | 2313 | if (cqr1->startdev != cqr2->startdev) |
2314 | if (cqr1->irb.scsw.cpa != cqr2->irb.scsw.cpa) { | 2314 | return 0; |
2315 | // return 0; /* CCW doesn't match */ | ||
2316 | } | ||
2317 | 2315 | ||
2318 | if (cqr1->irb.esw.esw0.erw.cons != cqr2->irb.esw.esw0.erw.cons) | 2316 | if (cqr1->irb.esw.esw0.erw.cons != cqr2->irb.esw.esw0.erw.cons) |
2319 | return 0; | 2317 | return 0; |
diff --git a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c index 28a86f070048..556063e8f7a9 100644 --- a/drivers/s390/block/dasd_proc.c +++ b/drivers/s390/block/dasd_proc.c | |||
@@ -62,8 +62,10 @@ dasd_devices_show(struct seq_file *m, void *v) | |||
62 | return 0; | 62 | return 0; |
63 | if (device->block) | 63 | if (device->block) |
64 | block = device->block; | 64 | block = device->block; |
65 | else | 65 | else { |
66 | dasd_put_device(device); | ||
66 | return 0; | 67 | return 0; |
68 | } | ||
67 | /* Print device number. */ | 69 | /* Print device number. */ |
68 | seq_printf(m, "%s", device->cdev->dev.bus_id); | 70 | seq_printf(m, "%s", device->cdev->dev.bus_id); |
69 | /* Print discipline string. */ | 71 | /* Print discipline string. */ |
diff --git a/drivers/s390/char/defkeymap.c b/drivers/s390/char/defkeymap.c index 389346cda6c8..07c7f31081bc 100644 --- a/drivers/s390/char/defkeymap.c +++ b/drivers/s390/char/defkeymap.c | |||
@@ -151,8 +151,8 @@ char *func_table[MAX_NR_FUNC] = { | |||
151 | }; | 151 | }; |
152 | 152 | ||
153 | struct kbdiacruc accent_table[MAX_DIACR] = { | 153 | struct kbdiacruc accent_table[MAX_DIACR] = { |
154 | {'^', 'c', '\003'}, {'^', 'd', '\004'}, | 154 | {'^', 'c', 0003}, {'^', 'd', 0004}, |
155 | {'^', 'z', '\032'}, {'^', '\012', '\000'}, | 155 | {'^', 'z', 0032}, {'^', 0012, 0000}, |
156 | }; | 156 | }; |
157 | 157 | ||
158 | unsigned int accent_table_size = 4; | 158 | unsigned int accent_table_size = 4; |
diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c index 92f527201792..f7b258dfd52c 100644 --- a/drivers/s390/char/sclp_vt220.c +++ b/drivers/s390/char/sclp_vt220.c | |||
@@ -367,7 +367,7 @@ sclp_vt220_timeout(unsigned long data) | |||
367 | sclp_vt220_emit_current(); | 367 | sclp_vt220_emit_current(); |
368 | } | 368 | } |
369 | 369 | ||
370 | #define BUFFER_MAX_DELAY HZ/2 | 370 | #define BUFFER_MAX_DELAY HZ/20 |
371 | 371 | ||
372 | /* | 372 | /* |
373 | * Internal implementation of the write function. Write COUNT bytes of data | 373 | * Internal implementation of the write function. Write COUNT bytes of data |
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index d0c6fd3b1c19..7b0b81901297 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
@@ -490,10 +490,12 @@ static int ap_device_probe(struct device *dev) | |||
490 | int rc; | 490 | int rc; |
491 | 491 | ||
492 | ap_dev->drv = ap_drv; | 492 | ap_dev->drv = ap_drv; |
493 | spin_lock_bh(&ap_device_lock); | ||
494 | list_add(&ap_dev->list, &ap_device_list); | ||
495 | spin_unlock_bh(&ap_device_lock); | ||
496 | rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV; | 493 | rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV; |
494 | if (!rc) { | ||
495 | spin_lock_bh(&ap_device_lock); | ||
496 | list_add(&ap_dev->list, &ap_device_list); | ||
497 | spin_unlock_bh(&ap_device_lock); | ||
498 | } | ||
497 | return rc; | 499 | return rc; |
498 | } | 500 | } |
499 | 501 | ||
@@ -532,11 +534,11 @@ static int ap_device_remove(struct device *dev) | |||
532 | 534 | ||
533 | ap_flush_queue(ap_dev); | 535 | ap_flush_queue(ap_dev); |
534 | del_timer_sync(&ap_dev->timeout); | 536 | del_timer_sync(&ap_dev->timeout); |
535 | if (ap_drv->remove) | ||
536 | ap_drv->remove(ap_dev); | ||
537 | spin_lock_bh(&ap_device_lock); | 537 | spin_lock_bh(&ap_device_lock); |
538 | list_del_init(&ap_dev->list); | 538 | list_del_init(&ap_dev->list); |
539 | spin_unlock_bh(&ap_device_lock); | 539 | spin_unlock_bh(&ap_device_lock); |
540 | if (ap_drv->remove) | ||
541 | ap_drv->remove(ap_dev); | ||
540 | spin_lock_bh(&ap_dev->lock); | 542 | spin_lock_bh(&ap_dev->lock); |
541 | atomic_sub(ap_dev->queue_count, &ap_poll_requests); | 543 | atomic_sub(ap_dev->queue_count, &ap_poll_requests); |
542 | spin_unlock_bh(&ap_dev->lock); | 544 | spin_unlock_bh(&ap_dev->lock); |
diff --git a/drivers/scsi/aic94xx/aic94xx.h b/drivers/scsi/aic94xx/aic94xx.h index 32f513b1b78a..eb8efdcefe48 100644 --- a/drivers/scsi/aic94xx/aic94xx.h +++ b/drivers/scsi/aic94xx/aic94xx.h | |||
@@ -102,6 +102,7 @@ int asd_abort_task_set(struct domain_device *, u8 *lun); | |||
102 | int asd_clear_aca(struct domain_device *, u8 *lun); | 102 | int asd_clear_aca(struct domain_device *, u8 *lun); |
103 | int asd_clear_task_set(struct domain_device *, u8 *lun); | 103 | int asd_clear_task_set(struct domain_device *, u8 *lun); |
104 | int asd_lu_reset(struct domain_device *, u8 *lun); | 104 | int asd_lu_reset(struct domain_device *, u8 *lun); |
105 | int asd_I_T_nexus_reset(struct domain_device *dev); | ||
105 | int asd_query_task(struct sas_task *); | 106 | int asd_query_task(struct sas_task *); |
106 | 107 | ||
107 | /* ---------- Adapter and Port management ---------- */ | 108 | /* ---------- Adapter and Port management ---------- */ |
diff --git a/drivers/scsi/aic94xx/aic94xx_hwi.h b/drivers/scsi/aic94xx/aic94xx_hwi.h index 150f6706d23f..abc757559c1a 100644 --- a/drivers/scsi/aic94xx/aic94xx_hwi.h +++ b/drivers/scsi/aic94xx/aic94xx_hwi.h | |||
@@ -140,7 +140,7 @@ struct asd_ascb { | |||
140 | 140 | ||
141 | /* internally generated command */ | 141 | /* internally generated command */ |
142 | struct timer_list timer; | 142 | struct timer_list timer; |
143 | struct completion completion; | 143 | struct completion *completion; |
144 | u8 tag_valid:1; | 144 | u8 tag_valid:1; |
145 | __be16 tag; /* error recovery only */ | 145 | __be16 tag; /* error recovery only */ |
146 | 146 | ||
@@ -294,7 +294,6 @@ static inline void asd_init_ascb(struct asd_ha_struct *asd_ha, | |||
294 | ascb->timer.function = NULL; | 294 | ascb->timer.function = NULL; |
295 | init_timer(&ascb->timer); | 295 | init_timer(&ascb->timer); |
296 | ascb->tc_index = -1; | 296 | ascb->tc_index = -1; |
297 | init_completion(&ascb->completion); | ||
298 | } | 297 | } |
299 | 298 | ||
300 | /* Must be called with the tc_index_lock held! | 299 | /* Must be called with the tc_index_lock held! |
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c index 5d761eb67442..88d1e731b65e 100644 --- a/drivers/scsi/aic94xx/aic94xx_init.c +++ b/drivers/scsi/aic94xx/aic94xx_init.c | |||
@@ -1003,7 +1003,7 @@ static struct sas_domain_function_template aic94xx_transport_functions = { | |||
1003 | .lldd_abort_task_set = asd_abort_task_set, | 1003 | .lldd_abort_task_set = asd_abort_task_set, |
1004 | .lldd_clear_aca = asd_clear_aca, | 1004 | .lldd_clear_aca = asd_clear_aca, |
1005 | .lldd_clear_task_set = asd_clear_task_set, | 1005 | .lldd_clear_task_set = asd_clear_task_set, |
1006 | .lldd_I_T_nexus_reset = NULL, | 1006 | .lldd_I_T_nexus_reset = asd_I_T_nexus_reset, |
1007 | .lldd_lu_reset = asd_lu_reset, | 1007 | .lldd_lu_reset = asd_lu_reset, |
1008 | .lldd_query_task = asd_query_task, | 1008 | .lldd_query_task = asd_query_task, |
1009 | 1009 | ||
diff --git a/drivers/scsi/aic94xx/aic94xx_task.c b/drivers/scsi/aic94xx/aic94xx_task.c index 965d4bb999d9..008df9ab92a5 100644 --- a/drivers/scsi/aic94xx/aic94xx_task.c +++ b/drivers/scsi/aic94xx/aic94xx_task.c | |||
@@ -343,11 +343,13 @@ Again: | |||
343 | task->task_state_flags &= ~SAS_TASK_AT_INITIATOR; | 343 | task->task_state_flags &= ~SAS_TASK_AT_INITIATOR; |
344 | task->task_state_flags |= SAS_TASK_STATE_DONE; | 344 | task->task_state_flags |= SAS_TASK_STATE_DONE; |
345 | if (unlikely((task->task_state_flags & SAS_TASK_STATE_ABORTED))) { | 345 | if (unlikely((task->task_state_flags & SAS_TASK_STATE_ABORTED))) { |
346 | struct completion *completion = ascb->completion; | ||
346 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 347 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
347 | ASD_DPRINTK("task 0x%p done with opcode 0x%x resp 0x%x " | 348 | ASD_DPRINTK("task 0x%p done with opcode 0x%x resp 0x%x " |
348 | "stat 0x%x but aborted by upper layer!\n", | 349 | "stat 0x%x but aborted by upper layer!\n", |
349 | task, opcode, ts->resp, ts->stat); | 350 | task, opcode, ts->resp, ts->stat); |
350 | complete(&ascb->completion); | 351 | if (completion) |
352 | complete(completion); | ||
351 | } else { | 353 | } else { |
352 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 354 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
353 | task->lldd_task = NULL; | 355 | task->lldd_task = NULL; |
diff --git a/drivers/scsi/aic94xx/aic94xx_tmf.c b/drivers/scsi/aic94xx/aic94xx_tmf.c index 144f5ad20453..b9ac8f703a1d 100644 --- a/drivers/scsi/aic94xx/aic94xx_tmf.c +++ b/drivers/scsi/aic94xx/aic94xx_tmf.c | |||
@@ -53,50 +53,64 @@ static int asd_enqueue_internal(struct asd_ascb *ascb, | |||
53 | return res; | 53 | return res; |
54 | } | 54 | } |
55 | 55 | ||
56 | static inline void asd_timedout_common(unsigned long data) | 56 | /* ---------- CLEAR NEXUS ---------- */ |
57 | { | ||
58 | struct asd_ascb *ascb = (void *) data; | ||
59 | struct asd_seq_data *seq = &ascb->ha->seq; | ||
60 | unsigned long flags; | ||
61 | 57 | ||
62 | spin_lock_irqsave(&seq->pend_q_lock, flags); | 58 | struct tasklet_completion_status { |
63 | seq->pending--; | 59 | int dl_opcode; |
64 | list_del_init(&ascb->list); | 60 | int tmf_state; |
65 | spin_unlock_irqrestore(&seq->pend_q_lock, flags); | 61 | u8 tag_valid:1; |
66 | } | 62 | __be16 tag; |
63 | }; | ||
64 | |||
65 | #define DECLARE_TCS(tcs) \ | ||
66 | struct tasklet_completion_status tcs = { \ | ||
67 | .dl_opcode = 0, \ | ||
68 | .tmf_state = 0, \ | ||
69 | .tag_valid = 0, \ | ||
70 | .tag = 0, \ | ||
71 | } | ||
67 | 72 | ||
68 | /* ---------- CLEAR NEXUS ---------- */ | ||
69 | 73 | ||
70 | static void asd_clear_nexus_tasklet_complete(struct asd_ascb *ascb, | 74 | static void asd_clear_nexus_tasklet_complete(struct asd_ascb *ascb, |
71 | struct done_list_struct *dl) | 75 | struct done_list_struct *dl) |
72 | { | 76 | { |
77 | struct tasklet_completion_status *tcs = ascb->uldd_task; | ||
73 | ASD_DPRINTK("%s: here\n", __FUNCTION__); | 78 | ASD_DPRINTK("%s: here\n", __FUNCTION__); |
74 | if (!del_timer(&ascb->timer)) { | 79 | if (!del_timer(&ascb->timer)) { |
75 | ASD_DPRINTK("%s: couldn't delete timer\n", __FUNCTION__); | 80 | ASD_DPRINTK("%s: couldn't delete timer\n", __FUNCTION__); |
76 | return; | 81 | return; |
77 | } | 82 | } |
78 | ASD_DPRINTK("%s: opcode: 0x%x\n", __FUNCTION__, dl->opcode); | 83 | ASD_DPRINTK("%s: opcode: 0x%x\n", __FUNCTION__, dl->opcode); |
79 | ascb->uldd_task = (void *) (unsigned long) dl->opcode; | 84 | tcs->dl_opcode = dl->opcode; |
80 | complete(&ascb->completion); | 85 | complete(ascb->completion); |
86 | asd_ascb_free(ascb); | ||
81 | } | 87 | } |
82 | 88 | ||
83 | static void asd_clear_nexus_timedout(unsigned long data) | 89 | static void asd_clear_nexus_timedout(unsigned long data) |
84 | { | 90 | { |
85 | struct asd_ascb *ascb = (void *) data; | 91 | struct asd_ascb *ascb = (void *)data; |
92 | struct tasklet_completion_status *tcs = ascb->uldd_task; | ||
86 | 93 | ||
87 | ASD_DPRINTK("%s: here\n", __FUNCTION__); | 94 | ASD_DPRINTK("%s: here\n", __FUNCTION__); |
88 | asd_timedout_common(data); | 95 | tcs->dl_opcode = TMF_RESP_FUNC_FAILED; |
89 | ascb->uldd_task = (void *) TMF_RESP_FUNC_FAILED; | 96 | complete(ascb->completion); |
90 | complete(&ascb->completion); | ||
91 | } | 97 | } |
92 | 98 | ||
93 | #define CLEAR_NEXUS_PRE \ | 99 | #define CLEAR_NEXUS_PRE \ |
100 | struct asd_ascb *ascb; \ | ||
101 | struct scb *scb; \ | ||
102 | int res; \ | ||
103 | DECLARE_COMPLETION_ONSTACK(completion); \ | ||
104 | DECLARE_TCS(tcs); \ | ||
105 | \ | ||
94 | ASD_DPRINTK("%s: PRE\n", __FUNCTION__); \ | 106 | ASD_DPRINTK("%s: PRE\n", __FUNCTION__); \ |
95 | res = 1; \ | 107 | res = 1; \ |
96 | ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL); \ | 108 | ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL); \ |
97 | if (!ascb) \ | 109 | if (!ascb) \ |
98 | return -ENOMEM; \ | 110 | return -ENOMEM; \ |
99 | \ | 111 | \ |
112 | ascb->completion = &completion; \ | ||
113 | ascb->uldd_task = &tcs; \ | ||
100 | scb = ascb->scb; \ | 114 | scb = ascb->scb; \ |
101 | scb->header.opcode = CLEAR_NEXUS | 115 | scb->header.opcode = CLEAR_NEXUS |
102 | 116 | ||
@@ -107,10 +121,11 @@ static void asd_clear_nexus_timedout(unsigned long data) | |||
107 | if (res) \ | 121 | if (res) \ |
108 | goto out_err; \ | 122 | goto out_err; \ |
109 | ASD_DPRINTK("%s: clear nexus posted, waiting...\n", __FUNCTION__); \ | 123 | ASD_DPRINTK("%s: clear nexus posted, waiting...\n", __FUNCTION__); \ |
110 | wait_for_completion(&ascb->completion); \ | 124 | wait_for_completion(&completion); \ |
111 | res = (int) (unsigned long) ascb->uldd_task; \ | 125 | res = tcs.dl_opcode; \ |
112 | if (res == TC_NO_ERROR) \ | 126 | if (res == TC_NO_ERROR) \ |
113 | res = TMF_RESP_FUNC_COMPLETE; \ | 127 | res = TMF_RESP_FUNC_COMPLETE; \ |
128 | return res; \ | ||
114 | out_err: \ | 129 | out_err: \ |
115 | asd_ascb_free(ascb); \ | 130 | asd_ascb_free(ascb); \ |
116 | return res | 131 | return res |
@@ -118,9 +133,6 @@ out_err: \ | |||
118 | int asd_clear_nexus_ha(struct sas_ha_struct *sas_ha) | 133 | int asd_clear_nexus_ha(struct sas_ha_struct *sas_ha) |
119 | { | 134 | { |
120 | struct asd_ha_struct *asd_ha = sas_ha->lldd_ha; | 135 | struct asd_ha_struct *asd_ha = sas_ha->lldd_ha; |
121 | struct asd_ascb *ascb; | ||
122 | struct scb *scb; | ||
123 | int res; | ||
124 | 136 | ||
125 | CLEAR_NEXUS_PRE; | 137 | CLEAR_NEXUS_PRE; |
126 | scb->clear_nexus.nexus = NEXUS_ADAPTER; | 138 | scb->clear_nexus.nexus = NEXUS_ADAPTER; |
@@ -130,9 +142,6 @@ int asd_clear_nexus_ha(struct sas_ha_struct *sas_ha) | |||
130 | int asd_clear_nexus_port(struct asd_sas_port *port) | 142 | int asd_clear_nexus_port(struct asd_sas_port *port) |
131 | { | 143 | { |
132 | struct asd_ha_struct *asd_ha = port->ha->lldd_ha; | 144 | struct asd_ha_struct *asd_ha = port->ha->lldd_ha; |
133 | struct asd_ascb *ascb; | ||
134 | struct scb *scb; | ||
135 | int res; | ||
136 | 145 | ||
137 | CLEAR_NEXUS_PRE; | 146 | CLEAR_NEXUS_PRE; |
138 | scb->clear_nexus.nexus = NEXUS_PORT; | 147 | scb->clear_nexus.nexus = NEXUS_PORT; |
@@ -140,29 +149,73 @@ int asd_clear_nexus_port(struct asd_sas_port *port) | |||
140 | CLEAR_NEXUS_POST; | 149 | CLEAR_NEXUS_POST; |
141 | } | 150 | } |
142 | 151 | ||
143 | #if 0 | 152 | enum clear_nexus_phase { |
144 | static int asd_clear_nexus_I_T(struct domain_device *dev) | 153 | NEXUS_PHASE_PRE, |
154 | NEXUS_PHASE_POST, | ||
155 | NEXUS_PHASE_RESUME, | ||
156 | }; | ||
157 | |||
158 | static int asd_clear_nexus_I_T(struct domain_device *dev, | ||
159 | enum clear_nexus_phase phase) | ||
145 | { | 160 | { |
146 | struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha; | 161 | struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha; |
147 | struct asd_ascb *ascb; | ||
148 | struct scb *scb; | ||
149 | int res; | ||
150 | 162 | ||
151 | CLEAR_NEXUS_PRE; | 163 | CLEAR_NEXUS_PRE; |
152 | scb->clear_nexus.nexus = NEXUS_I_T; | 164 | scb->clear_nexus.nexus = NEXUS_I_T; |
153 | scb->clear_nexus.flags = SEND_Q | EXEC_Q | NOTINQ; | 165 | switch (phase) { |
166 | case NEXUS_PHASE_PRE: | ||
167 | scb->clear_nexus.flags = EXEC_Q | SUSPEND_TX; | ||
168 | break; | ||
169 | case NEXUS_PHASE_POST: | ||
170 | scb->clear_nexus.flags = SEND_Q | NOTINQ; | ||
171 | break; | ||
172 | case NEXUS_PHASE_RESUME: | ||
173 | scb->clear_nexus.flags = RESUME_TX; | ||
174 | } | ||
154 | scb->clear_nexus.conn_handle = cpu_to_le16((u16)(unsigned long) | 175 | scb->clear_nexus.conn_handle = cpu_to_le16((u16)(unsigned long) |
155 | dev->lldd_dev); | 176 | dev->lldd_dev); |
156 | CLEAR_NEXUS_POST; | 177 | CLEAR_NEXUS_POST; |
157 | } | 178 | } |
158 | #endif | 179 | |
180 | int asd_I_T_nexus_reset(struct domain_device *dev) | ||
181 | { | ||
182 | int res, tmp_res, i; | ||
183 | struct sas_phy *phy = sas_find_local_phy(dev); | ||
184 | /* Standard mandates link reset for ATA (type 0) and | ||
185 | * hard reset for SSP (type 1) */ | ||
186 | int reset_type = (dev->dev_type == SATA_DEV || | ||
187 | (dev->tproto & SAS_PROTOCOL_STP)) ? 0 : 1; | ||
188 | |||
189 | asd_clear_nexus_I_T(dev, NEXUS_PHASE_PRE); | ||
190 | /* send a hard reset */ | ||
191 | ASD_DPRINTK("sending %s reset to %s\n", | ||
192 | reset_type ? "hard" : "soft", phy->dev.bus_id); | ||
193 | res = sas_phy_reset(phy, reset_type); | ||
194 | if (res == TMF_RESP_FUNC_COMPLETE) { | ||
195 | /* wait for the maximum settle time */ | ||
196 | msleep(500); | ||
197 | /* clear all outstanding commands (keep nexus suspended) */ | ||
198 | asd_clear_nexus_I_T(dev, NEXUS_PHASE_POST); | ||
199 | } | ||
200 | for (i = 0 ; i < 3; i++) { | ||
201 | tmp_res = asd_clear_nexus_I_T(dev, NEXUS_PHASE_RESUME); | ||
202 | if (tmp_res == TC_RESUME) | ||
203 | return res; | ||
204 | msleep(500); | ||
205 | } | ||
206 | |||
207 | /* This is a bit of a problem: the sequencer is still suspended | ||
208 | * and is refusing to resume. Hope it will resume on a bigger hammer | ||
209 | * or the disk is lost */ | ||
210 | dev_printk(KERN_ERR, &phy->dev, | ||
211 | "Failed to resume nexus after reset 0x%x\n", tmp_res); | ||
212 | |||
213 | return TMF_RESP_FUNC_FAILED; | ||
214 | } | ||
159 | 215 | ||
160 | static int asd_clear_nexus_I_T_L(struct domain_device *dev, u8 *lun) | 216 | static int asd_clear_nexus_I_T_L(struct domain_device *dev, u8 *lun) |
161 | { | 217 | { |
162 | struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha; | 218 | struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha; |
163 | struct asd_ascb *ascb; | ||
164 | struct scb *scb; | ||
165 | int res; | ||
166 | 219 | ||
167 | CLEAR_NEXUS_PRE; | 220 | CLEAR_NEXUS_PRE; |
168 | scb->clear_nexus.nexus = NEXUS_I_T_L; | 221 | scb->clear_nexus.nexus = NEXUS_I_T_L; |
@@ -177,9 +230,6 @@ static int asd_clear_nexus_tag(struct sas_task *task) | |||
177 | { | 230 | { |
178 | struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha; | 231 | struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha; |
179 | struct asd_ascb *tascb = task->lldd_task; | 232 | struct asd_ascb *tascb = task->lldd_task; |
180 | struct asd_ascb *ascb; | ||
181 | struct scb *scb; | ||
182 | int res; | ||
183 | 233 | ||
184 | CLEAR_NEXUS_PRE; | 234 | CLEAR_NEXUS_PRE; |
185 | scb->clear_nexus.nexus = NEXUS_TAG; | 235 | scb->clear_nexus.nexus = NEXUS_TAG; |
@@ -195,9 +245,6 @@ static int asd_clear_nexus_index(struct sas_task *task) | |||
195 | { | 245 | { |
196 | struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha; | 246 | struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha; |
197 | struct asd_ascb *tascb = task->lldd_task; | 247 | struct asd_ascb *tascb = task->lldd_task; |
198 | struct asd_ascb *ascb; | ||
199 | struct scb *scb; | ||
200 | int res; | ||
201 | 248 | ||
202 | CLEAR_NEXUS_PRE; | 249 | CLEAR_NEXUS_PRE; |
203 | scb->clear_nexus.nexus = NEXUS_TRANS_CX; | 250 | scb->clear_nexus.nexus = NEXUS_TRANS_CX; |
@@ -213,11 +260,11 @@ static int asd_clear_nexus_index(struct sas_task *task) | |||
213 | static void asd_tmf_timedout(unsigned long data) | 260 | static void asd_tmf_timedout(unsigned long data) |
214 | { | 261 | { |
215 | struct asd_ascb *ascb = (void *) data; | 262 | struct asd_ascb *ascb = (void *) data; |
263 | struct tasklet_completion_status *tcs = ascb->uldd_task; | ||
216 | 264 | ||
217 | ASD_DPRINTK("tmf timed out\n"); | 265 | ASD_DPRINTK("tmf timed out\n"); |
218 | asd_timedout_common(data); | 266 | tcs->tmf_state = TMF_RESP_FUNC_FAILED; |
219 | ascb->uldd_task = (void *) TMF_RESP_FUNC_FAILED; | 267 | complete(ascb->completion); |
220 | complete(&ascb->completion); | ||
221 | } | 268 | } |
222 | 269 | ||
223 | static int asd_get_tmf_resp_tasklet(struct asd_ascb *ascb, | 270 | static int asd_get_tmf_resp_tasklet(struct asd_ascb *ascb, |
@@ -269,18 +316,24 @@ static int asd_get_tmf_resp_tasklet(struct asd_ascb *ascb, | |||
269 | static void asd_tmf_tasklet_complete(struct asd_ascb *ascb, | 316 | static void asd_tmf_tasklet_complete(struct asd_ascb *ascb, |
270 | struct done_list_struct *dl) | 317 | struct done_list_struct *dl) |
271 | { | 318 | { |
319 | struct tasklet_completion_status *tcs; | ||
320 | |||
272 | if (!del_timer(&ascb->timer)) | 321 | if (!del_timer(&ascb->timer)) |
273 | return; | 322 | return; |
274 | 323 | ||
324 | tcs = ascb->uldd_task; | ||
275 | ASD_DPRINTK("tmf tasklet complete\n"); | 325 | ASD_DPRINTK("tmf tasklet complete\n"); |
276 | 326 | ||
277 | if (dl->opcode == TC_SSP_RESP) | 327 | tcs->dl_opcode = dl->opcode; |
278 | ascb->uldd_task = (void *) (unsigned long) | 328 | |
279 | asd_get_tmf_resp_tasklet(ascb, dl); | 329 | if (dl->opcode == TC_SSP_RESP) { |
280 | else | 330 | tcs->tmf_state = asd_get_tmf_resp_tasklet(ascb, dl); |
281 | ascb->uldd_task = (void *) 0xFF00 + (unsigned long) dl->opcode; | 331 | tcs->tag_valid = ascb->tag_valid; |
332 | tcs->tag = ascb->tag; | ||
333 | } | ||
282 | 334 | ||
283 | complete(&ascb->completion); | 335 | complete(ascb->completion); |
336 | asd_ascb_free(ascb); | ||
284 | } | 337 | } |
285 | 338 | ||
286 | static inline int asd_clear_nexus(struct sas_task *task) | 339 | static inline int asd_clear_nexus(struct sas_task *task) |
@@ -288,15 +341,19 @@ static inline int asd_clear_nexus(struct sas_task *task) | |||
288 | int res = TMF_RESP_FUNC_FAILED; | 341 | int res = TMF_RESP_FUNC_FAILED; |
289 | int leftover; | 342 | int leftover; |
290 | struct asd_ascb *tascb = task->lldd_task; | 343 | struct asd_ascb *tascb = task->lldd_task; |
344 | DECLARE_COMPLETION_ONSTACK(completion); | ||
291 | unsigned long flags; | 345 | unsigned long flags; |
292 | 346 | ||
347 | tascb->completion = &completion; | ||
348 | |||
293 | ASD_DPRINTK("task not done, clearing nexus\n"); | 349 | ASD_DPRINTK("task not done, clearing nexus\n"); |
294 | if (tascb->tag_valid) | 350 | if (tascb->tag_valid) |
295 | res = asd_clear_nexus_tag(task); | 351 | res = asd_clear_nexus_tag(task); |
296 | else | 352 | else |
297 | res = asd_clear_nexus_index(task); | 353 | res = asd_clear_nexus_index(task); |
298 | leftover = wait_for_completion_timeout(&tascb->completion, | 354 | leftover = wait_for_completion_timeout(&completion, |
299 | AIC94XX_SCB_TIMEOUT); | 355 | AIC94XX_SCB_TIMEOUT); |
356 | tascb->completion = NULL; | ||
300 | ASD_DPRINTK("came back from clear nexus\n"); | 357 | ASD_DPRINTK("came back from clear nexus\n"); |
301 | spin_lock_irqsave(&task->task_state_lock, flags); | 358 | spin_lock_irqsave(&task->task_state_lock, flags); |
302 | if (leftover < 1) | 359 | if (leftover < 1) |
@@ -350,6 +407,11 @@ int asd_abort_task(struct sas_task *task) | |||
350 | struct asd_ascb *ascb = NULL; | 407 | struct asd_ascb *ascb = NULL; |
351 | struct scb *scb; | 408 | struct scb *scb; |
352 | int leftover; | 409 | int leftover; |
410 | DECLARE_TCS(tcs); | ||
411 | DECLARE_COMPLETION_ONSTACK(completion); | ||
412 | DECLARE_COMPLETION_ONSTACK(tascb_completion); | ||
413 | |||
414 | tascb->completion = &tascb_completion; | ||
353 | 415 | ||
354 | spin_lock_irqsave(&task->task_state_lock, flags); | 416 | spin_lock_irqsave(&task->task_state_lock, flags); |
355 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { | 417 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { |
@@ -363,8 +425,10 @@ int asd_abort_task(struct sas_task *task) | |||
363 | ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL); | 425 | ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL); |
364 | if (!ascb) | 426 | if (!ascb) |
365 | return -ENOMEM; | 427 | return -ENOMEM; |
366 | scb = ascb->scb; | ||
367 | 428 | ||
429 | ascb->uldd_task = &tcs; | ||
430 | ascb->completion = &completion; | ||
431 | scb = ascb->scb; | ||
368 | scb->header.opcode = SCB_ABORT_TASK; | 432 | scb->header.opcode = SCB_ABORT_TASK; |
369 | 433 | ||
370 | switch (task->task_proto) { | 434 | switch (task->task_proto) { |
@@ -406,13 +470,12 @@ int asd_abort_task(struct sas_task *task) | |||
406 | res = asd_enqueue_internal(ascb, asd_tmf_tasklet_complete, | 470 | res = asd_enqueue_internal(ascb, asd_tmf_tasklet_complete, |
407 | asd_tmf_timedout); | 471 | asd_tmf_timedout); |
408 | if (res) | 472 | if (res) |
409 | goto out; | 473 | goto out_free; |
410 | wait_for_completion(&ascb->completion); | 474 | wait_for_completion(&completion); |
411 | ASD_DPRINTK("tmf came back\n"); | 475 | ASD_DPRINTK("tmf came back\n"); |
412 | 476 | ||
413 | res = (int) (unsigned long) ascb->uldd_task; | 477 | tascb->tag = tcs.tag; |
414 | tascb->tag = ascb->tag; | 478 | tascb->tag_valid = tcs.tag_valid; |
415 | tascb->tag_valid = ascb->tag_valid; | ||
416 | 479 | ||
417 | spin_lock_irqsave(&task->task_state_lock, flags); | 480 | spin_lock_irqsave(&task->task_state_lock, flags); |
418 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { | 481 | if (task->task_state_flags & SAS_TASK_STATE_DONE) { |
@@ -423,63 +486,68 @@ int asd_abort_task(struct sas_task *task) | |||
423 | } | 486 | } |
424 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 487 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
425 | 488 | ||
426 | switch (res) { | 489 | if (tcs.dl_opcode == TC_SSP_RESP) { |
427 | /* The task to be aborted has been sent to the device. | 490 | /* The task to be aborted has been sent to the device. |
428 | * We got a Response IU for the ABORT TASK TMF. */ | 491 | * We got a Response IU for the ABORT TASK TMF. */ |
429 | case TC_NO_ERROR + 0xFF00: | 492 | if (tcs.tmf_state == TMF_RESP_FUNC_COMPLETE) |
430 | case TMF_RESP_FUNC_COMPLETE: | 493 | res = asd_clear_nexus(task); |
431 | case TMF_RESP_FUNC_FAILED: | 494 | else |
432 | res = asd_clear_nexus(task); | 495 | res = tcs.tmf_state; |
433 | break; | 496 | } else if (tcs.dl_opcode == TC_NO_ERROR && |
434 | case TMF_RESP_INVALID_FRAME: | 497 | tcs.tmf_state == TMF_RESP_FUNC_FAILED) { |
435 | case TMF_RESP_OVERLAPPED_TAG: | 498 | /* timeout */ |
436 | case TMF_RESP_FUNC_ESUPP: | ||
437 | case TMF_RESP_NO_LUN: | ||
438 | goto out_done; break; | ||
439 | } | ||
440 | /* In the following we assume that the managing layer | ||
441 | * will _never_ make a mistake, when issuing ABORT TASK. | ||
442 | */ | ||
443 | switch (res) { | ||
444 | default: | ||
445 | res = asd_clear_nexus(task); | ||
446 | /* fallthrough */ | ||
447 | case TC_NO_ERROR + 0xFF00: | ||
448 | case TMF_RESP_FUNC_COMPLETE: | ||
449 | break; | ||
450 | /* The task hasn't been sent to the device xor we never got | ||
451 | * a (sane) Response IU for the ABORT TASK TMF. | ||
452 | */ | ||
453 | case TF_NAK_RECV + 0xFF00: | ||
454 | res = TMF_RESP_INVALID_FRAME; | ||
455 | break; | ||
456 | case TF_TMF_TASK_DONE + 0xFF00: /* done but not reported yet */ | ||
457 | res = TMF_RESP_FUNC_FAILED; | 499 | res = TMF_RESP_FUNC_FAILED; |
458 | leftover = wait_for_completion_timeout(&tascb->completion, | 500 | } else { |
459 | AIC94XX_SCB_TIMEOUT); | 501 | /* In the following we assume that the managing layer |
460 | spin_lock_irqsave(&task->task_state_lock, flags); | 502 | * will _never_ make a mistake, when issuing ABORT |
461 | if (leftover < 1) | 503 | * TASK. |
504 | */ | ||
505 | switch (tcs.dl_opcode) { | ||
506 | default: | ||
507 | res = asd_clear_nexus(task); | ||
508 | /* fallthrough */ | ||
509 | case TC_NO_ERROR: | ||
510 | break; | ||
511 | /* The task hasn't been sent to the device xor | ||
512 | * we never got a (sane) Response IU for the | ||
513 | * ABORT TASK TMF. | ||
514 | */ | ||
515 | case TF_NAK_RECV: | ||
516 | res = TMF_RESP_INVALID_FRAME; | ||
517 | break; | ||
518 | case TF_TMF_TASK_DONE: /* done but not reported yet */ | ||
462 | res = TMF_RESP_FUNC_FAILED; | 519 | res = TMF_RESP_FUNC_FAILED; |
463 | if (task->task_state_flags & SAS_TASK_STATE_DONE) | 520 | leftover = |
521 | wait_for_completion_timeout(&tascb_completion, | ||
522 | AIC94XX_SCB_TIMEOUT); | ||
523 | spin_lock_irqsave(&task->task_state_lock, flags); | ||
524 | if (leftover < 1) | ||
525 | res = TMF_RESP_FUNC_FAILED; | ||
526 | if (task->task_state_flags & SAS_TASK_STATE_DONE) | ||
527 | res = TMF_RESP_FUNC_COMPLETE; | ||
528 | spin_unlock_irqrestore(&task->task_state_lock, flags); | ||
529 | break; | ||
530 | case TF_TMF_NO_TAG: | ||
531 | case TF_TMF_TAG_FREE: /* the tag is in the free list */ | ||
532 | case TF_TMF_NO_CONN_HANDLE: /* no such device */ | ||
464 | res = TMF_RESP_FUNC_COMPLETE; | 533 | res = TMF_RESP_FUNC_COMPLETE; |
465 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 534 | break; |
466 | goto out_done; | 535 | case TF_TMF_NO_CTX: /* not in seq, or proto != SSP */ |
467 | case TF_TMF_NO_TAG + 0xFF00: | 536 | res = TMF_RESP_FUNC_ESUPP; |
468 | case TF_TMF_TAG_FREE + 0xFF00: /* the tag is in the free list */ | 537 | break; |
469 | case TF_TMF_NO_CONN_HANDLE + 0xFF00: /* no such device */ | 538 | } |
470 | res = TMF_RESP_FUNC_COMPLETE; | ||
471 | goto out_done; | ||
472 | case TF_TMF_NO_CTX + 0xFF00: /* not in seq, or proto != SSP */ | ||
473 | res = TMF_RESP_FUNC_ESUPP; | ||
474 | goto out; | ||
475 | } | 539 | } |
476 | out_done: | 540 | out_done: |
541 | tascb->completion = NULL; | ||
477 | if (res == TMF_RESP_FUNC_COMPLETE) { | 542 | if (res == TMF_RESP_FUNC_COMPLETE) { |
478 | task->lldd_task = NULL; | 543 | task->lldd_task = NULL; |
479 | mb(); | 544 | mb(); |
480 | asd_ascb_free(tascb); | 545 | asd_ascb_free(tascb); |
481 | } | 546 | } |
482 | out: | 547 | ASD_DPRINTK("task 0x%p aborted, res: 0x%x\n", task, res); |
548 | return res; | ||
549 | |||
550 | out_free: | ||
483 | asd_ascb_free(ascb); | 551 | asd_ascb_free(ascb); |
484 | ASD_DPRINTK("task 0x%p aborted, res: 0x%x\n", task, res); | 552 | ASD_DPRINTK("task 0x%p aborted, res: 0x%x\n", task, res); |
485 | return res; | 553 | return res; |
@@ -507,6 +575,8 @@ static int asd_initiate_ssp_tmf(struct domain_device *dev, u8 *lun, | |||
507 | struct asd_ascb *ascb; | 575 | struct asd_ascb *ascb; |
508 | int res = 1; | 576 | int res = 1; |
509 | struct scb *scb; | 577 | struct scb *scb; |
578 | DECLARE_COMPLETION_ONSTACK(completion); | ||
579 | DECLARE_TCS(tcs); | ||
510 | 580 | ||
511 | if (!(dev->tproto & SAS_PROTOCOL_SSP)) | 581 | if (!(dev->tproto & SAS_PROTOCOL_SSP)) |
512 | return TMF_RESP_FUNC_ESUPP; | 582 | return TMF_RESP_FUNC_ESUPP; |
@@ -514,6 +584,9 @@ static int asd_initiate_ssp_tmf(struct domain_device *dev, u8 *lun, | |||
514 | ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL); | 584 | ascb = asd_ascb_alloc_list(asd_ha, &res, GFP_KERNEL); |
515 | if (!ascb) | 585 | if (!ascb) |
516 | return -ENOMEM; | 586 | return -ENOMEM; |
587 | |||
588 | ascb->completion = &completion; | ||
589 | ascb->uldd_task = &tcs; | ||
517 | scb = ascb->scb; | 590 | scb = ascb->scb; |
518 | 591 | ||
519 | if (tmf == TMF_QUERY_TASK) | 592 | if (tmf == TMF_QUERY_TASK) |
@@ -546,31 +619,32 @@ static int asd_initiate_ssp_tmf(struct domain_device *dev, u8 *lun, | |||
546 | asd_tmf_timedout); | 619 | asd_tmf_timedout); |
547 | if (res) | 620 | if (res) |
548 | goto out_err; | 621 | goto out_err; |
549 | wait_for_completion(&ascb->completion); | 622 | wait_for_completion(&completion); |
550 | res = (int) (unsigned long) ascb->uldd_task; | ||
551 | 623 | ||
552 | switch (res) { | 624 | switch (tcs.dl_opcode) { |
553 | case TC_NO_ERROR + 0xFF00: | 625 | case TC_NO_ERROR: |
554 | res = TMF_RESP_FUNC_COMPLETE; | 626 | res = TMF_RESP_FUNC_COMPLETE; |
555 | break; | 627 | break; |
556 | case TF_NAK_RECV + 0xFF00: | 628 | case TF_NAK_RECV: |
557 | res = TMF_RESP_INVALID_FRAME; | 629 | res = TMF_RESP_INVALID_FRAME; |
558 | break; | 630 | break; |
559 | case TF_TMF_TASK_DONE + 0xFF00: | 631 | case TF_TMF_TASK_DONE: |
560 | res = TMF_RESP_FUNC_FAILED; | 632 | res = TMF_RESP_FUNC_FAILED; |
561 | break; | 633 | break; |
562 | case TF_TMF_NO_TAG + 0xFF00: | 634 | case TF_TMF_NO_TAG: |
563 | case TF_TMF_TAG_FREE + 0xFF00: /* the tag is in the free list */ | 635 | case TF_TMF_TAG_FREE: /* the tag is in the free list */ |
564 | case TF_TMF_NO_CONN_HANDLE + 0xFF00: /* no such device */ | 636 | case TF_TMF_NO_CONN_HANDLE: /* no such device */ |
565 | res = TMF_RESP_FUNC_COMPLETE; | 637 | res = TMF_RESP_FUNC_COMPLETE; |
566 | break; | 638 | break; |
567 | case TF_TMF_NO_CTX + 0xFF00: /* not in seq, or proto != SSP */ | 639 | case TF_TMF_NO_CTX: /* not in seq, or proto != SSP */ |
568 | res = TMF_RESP_FUNC_ESUPP; | 640 | res = TMF_RESP_FUNC_ESUPP; |
569 | break; | 641 | break; |
570 | default: | 642 | default: |
571 | /* Allow TMF response codes to propagate upwards */ | 643 | /* Allow TMF response codes to propagate upwards */ |
644 | res = tcs.dl_opcode; | ||
572 | break; | 645 | break; |
573 | } | 646 | } |
647 | return res; | ||
574 | out_err: | 648 | out_err: |
575 | asd_ascb_free(ascb); | 649 | asd_ascb_free(ascb); |
576 | return res; | 650 | return res; |
diff --git a/drivers/scsi/arcmsr/arcmsr.h b/drivers/scsi/arcmsr/arcmsr.h index 57786502e3ec..0393707bdfce 100644 --- a/drivers/scsi/arcmsr/arcmsr.h +++ b/drivers/scsi/arcmsr/arcmsr.h | |||
@@ -48,7 +48,7 @@ struct class_device_attribute; | |||
48 | /*The limit of outstanding scsi command that firmware can handle*/ | 48 | /*The limit of outstanding scsi command that firmware can handle*/ |
49 | #define ARCMSR_MAX_OUTSTANDING_CMD 256 | 49 | #define ARCMSR_MAX_OUTSTANDING_CMD 256 |
50 | #define ARCMSR_MAX_FREECCB_NUM 320 | 50 | #define ARCMSR_MAX_FREECCB_NUM 320 |
51 | #define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.15 2007/12/24" | 51 | #define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.15 2008/02/27" |
52 | #define ARCMSR_SCSI_INITIATOR_ID 255 | 52 | #define ARCMSR_SCSI_INITIATOR_ID 255 |
53 | #define ARCMSR_MAX_XFER_SECTORS 512 | 53 | #define ARCMSR_MAX_XFER_SECTORS 512 |
54 | #define ARCMSR_MAX_XFER_SECTORS_B 4096 | 54 | #define ARCMSR_MAX_XFER_SECTORS_B 4096 |
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 6d67f5c0eb8e..27ebd336409b 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
@@ -160,7 +160,7 @@ static void gdth_readapp_event(gdth_ha_str *ha, unchar application, | |||
160 | static void gdth_clear_events(void); | 160 | static void gdth_clear_events(void); |
161 | 161 | ||
162 | static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp, | 162 | static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp, |
163 | char *buffer, ushort count, int to_buffer); | 163 | char *buffer, ushort count); |
164 | static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp); | 164 | static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp); |
165 | static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive); | 165 | static int gdth_fill_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, ushort hdrive); |
166 | 166 | ||
@@ -182,7 +182,6 @@ static int gdth_ioctl(struct inode *inode, struct file *filep, | |||
182 | unsigned int cmd, unsigned long arg); | 182 | unsigned int cmd, unsigned long arg); |
183 | 183 | ||
184 | static void gdth_flush(gdth_ha_str *ha); | 184 | static void gdth_flush(gdth_ha_str *ha); |
185 | static int gdth_halt(struct notifier_block *nb, ulong event, void *buf); | ||
186 | static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)); | 185 | static int gdth_queuecommand(Scsi_Cmnd *scp,void (*done)(Scsi_Cmnd *)); |
187 | static int __gdth_queuecommand(gdth_ha_str *ha, struct scsi_cmnd *scp, | 186 | static int __gdth_queuecommand(gdth_ha_str *ha, struct scsi_cmnd *scp, |
188 | struct gdth_cmndinfo *cmndinfo); | 187 | struct gdth_cmndinfo *cmndinfo); |
@@ -417,12 +416,6 @@ static inline void gdth_set_sglist(struct scsi_cmnd *cmd, | |||
417 | #include "gdth_proc.h" | 416 | #include "gdth_proc.h" |
418 | #include "gdth_proc.c" | 417 | #include "gdth_proc.c" |
419 | 418 | ||
420 | /* notifier block to get a notify on system shutdown/halt/reboot */ | ||
421 | static struct notifier_block gdth_notifier = { | ||
422 | gdth_halt, NULL, 0 | ||
423 | }; | ||
424 | static int notifier_disabled = 0; | ||
425 | |||
426 | static gdth_ha_str *gdth_find_ha(int hanum) | 419 | static gdth_ha_str *gdth_find_ha(int hanum) |
427 | { | 420 | { |
428 | gdth_ha_str *ha; | 421 | gdth_ha_str *ha; |
@@ -445,8 +438,8 @@ static struct gdth_cmndinfo *gdth_get_cmndinfo(gdth_ha_str *ha) | |||
445 | for (i=0; i<GDTH_MAXCMDS; ++i) { | 438 | for (i=0; i<GDTH_MAXCMDS; ++i) { |
446 | if (ha->cmndinfo[i].index == 0) { | 439 | if (ha->cmndinfo[i].index == 0) { |
447 | priv = &ha->cmndinfo[i]; | 440 | priv = &ha->cmndinfo[i]; |
448 | priv->index = i+1; | ||
449 | memset(priv, 0, sizeof(*priv)); | 441 | memset(priv, 0, sizeof(*priv)); |
442 | priv->index = i+1; | ||
450 | break; | 443 | break; |
451 | } | 444 | } |
452 | } | 445 | } |
@@ -493,7 +486,6 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, | |||
493 | gdth_ha_str *ha = shost_priv(sdev->host); | 486 | gdth_ha_str *ha = shost_priv(sdev->host); |
494 | Scsi_Cmnd *scp; | 487 | Scsi_Cmnd *scp; |
495 | struct gdth_cmndinfo cmndinfo; | 488 | struct gdth_cmndinfo cmndinfo; |
496 | struct scatterlist one_sg; | ||
497 | DECLARE_COMPLETION_ONSTACK(wait); | 489 | DECLARE_COMPLETION_ONSTACK(wait); |
498 | int rval; | 490 | int rval; |
499 | 491 | ||
@@ -507,13 +499,10 @@ int __gdth_execute(struct scsi_device *sdev, gdth_cmd_str *gdtcmd, char *cmnd, | |||
507 | /* use request field to save the ptr. to completion struct. */ | 499 | /* use request field to save the ptr. to completion struct. */ |
508 | scp->request = (struct request *)&wait; | 500 | scp->request = (struct request *)&wait; |
509 | scp->timeout_per_command = timeout*HZ; | 501 | scp->timeout_per_command = timeout*HZ; |
510 | sg_init_one(&one_sg, gdtcmd, sizeof(*gdtcmd)); | ||
511 | gdth_set_sglist(scp, &one_sg); | ||
512 | gdth_set_sg_count(scp, 1); | ||
513 | gdth_set_bufflen(scp, sizeof(*gdtcmd)); | ||
514 | scp->cmd_len = 12; | 502 | scp->cmd_len = 12; |
515 | memcpy(scp->cmnd, cmnd, 12); | 503 | memcpy(scp->cmnd, cmnd, 12); |
516 | cmndinfo.priority = IOCTL_PRI; | 504 | cmndinfo.priority = IOCTL_PRI; |
505 | cmndinfo.internal_cmd_str = gdtcmd; | ||
517 | cmndinfo.internal_command = 1; | 506 | cmndinfo.internal_command = 1; |
518 | 507 | ||
519 | TRACE(("__gdth_execute() cmd 0x%x\n", scp->cmnd[0])); | 508 | TRACE(("__gdth_execute() cmd 0x%x\n", scp->cmnd[0])); |
@@ -2355,7 +2344,7 @@ static void gdth_next(gdth_ha_str *ha) | |||
2355 | * buffers, kmap_atomic() as needed. | 2344 | * buffers, kmap_atomic() as needed. |
2356 | */ | 2345 | */ |
2357 | static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp, | 2346 | static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp, |
2358 | char *buffer, ushort count, int to_buffer) | 2347 | char *buffer, ushort count) |
2359 | { | 2348 | { |
2360 | ushort cpcount,i, max_sg = gdth_sg_count(scp); | 2349 | ushort cpcount,i, max_sg = gdth_sg_count(scp); |
2361 | ushort cpsum,cpnow; | 2350 | ushort cpsum,cpnow; |
@@ -2381,10 +2370,7 @@ static void gdth_copy_internal_data(gdth_ha_str *ha, Scsi_Cmnd *scp, | |||
2381 | } | 2370 | } |
2382 | local_irq_save(flags); | 2371 | local_irq_save(flags); |
2383 | address = kmap_atomic(sg_page(sl), KM_BIO_SRC_IRQ) + sl->offset; | 2372 | address = kmap_atomic(sg_page(sl), KM_BIO_SRC_IRQ) + sl->offset; |
2384 | if (to_buffer) | 2373 | memcpy(address, buffer, cpnow); |
2385 | memcpy(buffer, address, cpnow); | ||
2386 | else | ||
2387 | memcpy(address, buffer, cpnow); | ||
2388 | flush_dcache_page(sg_page(sl)); | 2374 | flush_dcache_page(sg_page(sl)); |
2389 | kunmap_atomic(address, KM_BIO_SRC_IRQ); | 2375 | kunmap_atomic(address, KM_BIO_SRC_IRQ); |
2390 | local_irq_restore(flags); | 2376 | local_irq_restore(flags); |
@@ -2438,7 +2424,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) | |||
2438 | strcpy(inq.vendor,ha->oem_name); | 2424 | strcpy(inq.vendor,ha->oem_name); |
2439 | sprintf(inq.product,"Host Drive #%02d",t); | 2425 | sprintf(inq.product,"Host Drive #%02d",t); |
2440 | strcpy(inq.revision," "); | 2426 | strcpy(inq.revision," "); |
2441 | gdth_copy_internal_data(ha, scp, (char*)&inq, sizeof(gdth_inq_data), 0); | 2427 | gdth_copy_internal_data(ha, scp, (char*)&inq, sizeof(gdth_inq_data)); |
2442 | break; | 2428 | break; |
2443 | 2429 | ||
2444 | case REQUEST_SENSE: | 2430 | case REQUEST_SENSE: |
@@ -2448,7 +2434,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) | |||
2448 | sd.key = NO_SENSE; | 2434 | sd.key = NO_SENSE; |
2449 | sd.info = 0; | 2435 | sd.info = 0; |
2450 | sd.add_length= 0; | 2436 | sd.add_length= 0; |
2451 | gdth_copy_internal_data(ha, scp, (char*)&sd, sizeof(gdth_sense_data), 0); | 2437 | gdth_copy_internal_data(ha, scp, (char*)&sd, sizeof(gdth_sense_data)); |
2452 | break; | 2438 | break; |
2453 | 2439 | ||
2454 | case MODE_SENSE: | 2440 | case MODE_SENSE: |
@@ -2460,7 +2446,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) | |||
2460 | mpd.bd.block_length[0] = (SECTOR_SIZE & 0x00ff0000) >> 16; | 2446 | mpd.bd.block_length[0] = (SECTOR_SIZE & 0x00ff0000) >> 16; |
2461 | mpd.bd.block_length[1] = (SECTOR_SIZE & 0x0000ff00) >> 8; | 2447 | mpd.bd.block_length[1] = (SECTOR_SIZE & 0x0000ff00) >> 8; |
2462 | mpd.bd.block_length[2] = (SECTOR_SIZE & 0x000000ff); | 2448 | mpd.bd.block_length[2] = (SECTOR_SIZE & 0x000000ff); |
2463 | gdth_copy_internal_data(ha, scp, (char*)&mpd, sizeof(gdth_modep_data), 0); | 2449 | gdth_copy_internal_data(ha, scp, (char*)&mpd, sizeof(gdth_modep_data)); |
2464 | break; | 2450 | break; |
2465 | 2451 | ||
2466 | case READ_CAPACITY: | 2452 | case READ_CAPACITY: |
@@ -2470,7 +2456,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) | |||
2470 | else | 2456 | else |
2471 | rdc.last_block_no = cpu_to_be32(ha->hdr[t].size-1); | 2457 | rdc.last_block_no = cpu_to_be32(ha->hdr[t].size-1); |
2472 | rdc.block_length = cpu_to_be32(SECTOR_SIZE); | 2458 | rdc.block_length = cpu_to_be32(SECTOR_SIZE); |
2473 | gdth_copy_internal_data(ha, scp, (char*)&rdc, sizeof(gdth_rdcap_data), 0); | 2459 | gdth_copy_internal_data(ha, scp, (char*)&rdc, sizeof(gdth_rdcap_data)); |
2474 | break; | 2460 | break; |
2475 | 2461 | ||
2476 | case SERVICE_ACTION_IN: | 2462 | case SERVICE_ACTION_IN: |
@@ -2482,7 +2468,7 @@ static int gdth_internal_cache_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) | |||
2482 | rdc16.last_block_no = cpu_to_be64(ha->hdr[t].size-1); | 2468 | rdc16.last_block_no = cpu_to_be64(ha->hdr[t].size-1); |
2483 | rdc16.block_length = cpu_to_be32(SECTOR_SIZE); | 2469 | rdc16.block_length = cpu_to_be32(SECTOR_SIZE); |
2484 | gdth_copy_internal_data(ha, scp, (char*)&rdc16, | 2470 | gdth_copy_internal_data(ha, scp, (char*)&rdc16, |
2485 | sizeof(gdth_rdcap16_data), 0); | 2471 | sizeof(gdth_rdcap16_data)); |
2486 | } else { | 2472 | } else { |
2487 | scp->result = DID_ABORT << 16; | 2473 | scp->result = DID_ABORT << 16; |
2488 | } | 2474 | } |
@@ -2852,6 +2838,7 @@ static int gdth_fill_raw_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp, unchar b) | |||
2852 | static int gdth_special_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) | 2838 | static int gdth_special_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) |
2853 | { | 2839 | { |
2854 | register gdth_cmd_str *cmdp; | 2840 | register gdth_cmd_str *cmdp; |
2841 | struct gdth_cmndinfo *cmndinfo = gdth_cmnd_priv(scp); | ||
2855 | int cmd_index; | 2842 | int cmd_index; |
2856 | 2843 | ||
2857 | cmdp= ha->pccb; | 2844 | cmdp= ha->pccb; |
@@ -2860,7 +2847,7 @@ static int gdth_special_cmd(gdth_ha_str *ha, Scsi_Cmnd *scp) | |||
2860 | if (ha->type==GDT_EISA && ha->cmd_cnt>0) | 2847 | if (ha->type==GDT_EISA && ha->cmd_cnt>0) |
2861 | return 0; | 2848 | return 0; |
2862 | 2849 | ||
2863 | gdth_copy_internal_data(ha, scp, (char *)cmdp, sizeof(gdth_cmd_str), 1); | 2850 | *cmdp = *cmndinfo->internal_cmd_str; |
2864 | cmdp->RequestBuffer = scp; | 2851 | cmdp->RequestBuffer = scp; |
2865 | 2852 | ||
2866 | /* search free command index */ | 2853 | /* search free command index */ |
@@ -3794,6 +3781,8 @@ static void gdth_timeout(ulong data) | |||
3794 | gdth_ha_str *ha; | 3781 | gdth_ha_str *ha; |
3795 | ulong flags; | 3782 | ulong flags; |
3796 | 3783 | ||
3784 | BUG_ON(list_empty(&gdth_instances)); | ||
3785 | |||
3797 | ha = list_first_entry(&gdth_instances, gdth_ha_str, list); | 3786 | ha = list_first_entry(&gdth_instances, gdth_ha_str, list); |
3798 | spin_lock_irqsave(&ha->smp_lock, flags); | 3787 | spin_lock_irqsave(&ha->smp_lock, flags); |
3799 | 3788 | ||
@@ -4669,45 +4658,6 @@ static void gdth_flush(gdth_ha_str *ha) | |||
4669 | } | 4658 | } |
4670 | } | 4659 | } |
4671 | 4660 | ||
4672 | /* shutdown routine */ | ||
4673 | static int gdth_halt(struct notifier_block *nb, ulong event, void *buf) | ||
4674 | { | ||
4675 | gdth_ha_str *ha; | ||
4676 | #ifndef __alpha__ | ||
4677 | gdth_cmd_str gdtcmd; | ||
4678 | char cmnd[MAX_COMMAND_SIZE]; | ||
4679 | #endif | ||
4680 | |||
4681 | if (notifier_disabled) | ||
4682 | return NOTIFY_OK; | ||
4683 | |||
4684 | TRACE2(("gdth_halt() event %d\n",(int)event)); | ||
4685 | if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF) | ||
4686 | return NOTIFY_DONE; | ||
4687 | |||
4688 | notifier_disabled = 1; | ||
4689 | printk("GDT-HA: Flushing all host drives .. "); | ||
4690 | list_for_each_entry(ha, &gdth_instances, list) { | ||
4691 | gdth_flush(ha); | ||
4692 | |||
4693 | #ifndef __alpha__ | ||
4694 | /* controller reset */ | ||
4695 | memset(cmnd, 0xff, MAX_COMMAND_SIZE); | ||
4696 | gdtcmd.BoardNode = LOCALBOARD; | ||
4697 | gdtcmd.Service = CACHESERVICE; | ||
4698 | gdtcmd.OpCode = GDT_RESET; | ||
4699 | TRACE2(("gdth_halt(): reset controller %d\n", ha->hanum)); | ||
4700 | gdth_execute(ha->shost, &gdtcmd, cmnd, 10, NULL); | ||
4701 | #endif | ||
4702 | } | ||
4703 | printk("Done.\n"); | ||
4704 | |||
4705 | #ifdef GDTH_STATISTICS | ||
4706 | del_timer(&gdth_timer); | ||
4707 | #endif | ||
4708 | return NOTIFY_OK; | ||
4709 | } | ||
4710 | |||
4711 | /* configure lun */ | 4661 | /* configure lun */ |
4712 | static int gdth_slave_configure(struct scsi_device *sdev) | 4662 | static int gdth_slave_configure(struct scsi_device *sdev) |
4713 | { | 4663 | { |
@@ -5142,13 +5092,13 @@ static void gdth_remove_one(gdth_ha_str *ha) | |||
5142 | 5092 | ||
5143 | scsi_remove_host(shp); | 5093 | scsi_remove_host(shp); |
5144 | 5094 | ||
5095 | gdth_flush(ha); | ||
5096 | |||
5145 | if (ha->sdev) { | 5097 | if (ha->sdev) { |
5146 | scsi_free_host_dev(ha->sdev); | 5098 | scsi_free_host_dev(ha->sdev); |
5147 | ha->sdev = NULL; | 5099 | ha->sdev = NULL; |
5148 | } | 5100 | } |
5149 | 5101 | ||
5150 | gdth_flush(ha); | ||
5151 | |||
5152 | if (shp->irq) | 5102 | if (shp->irq) |
5153 | free_irq(shp->irq,ha); | 5103 | free_irq(shp->irq,ha); |
5154 | 5104 | ||
@@ -5174,6 +5124,24 @@ static void gdth_remove_one(gdth_ha_str *ha) | |||
5174 | scsi_host_put(shp); | 5124 | scsi_host_put(shp); |
5175 | } | 5125 | } |
5176 | 5126 | ||
5127 | static int gdth_halt(struct notifier_block *nb, ulong event, void *buf) | ||
5128 | { | ||
5129 | gdth_ha_str *ha; | ||
5130 | |||
5131 | TRACE2(("gdth_halt() event %d\n", (int)event)); | ||
5132 | if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF) | ||
5133 | return NOTIFY_DONE; | ||
5134 | |||
5135 | list_for_each_entry(ha, &gdth_instances, list) | ||
5136 | gdth_flush(ha); | ||
5137 | |||
5138 | return NOTIFY_OK; | ||
5139 | } | ||
5140 | |||
5141 | static struct notifier_block gdth_notifier = { | ||
5142 | gdth_halt, NULL, 0 | ||
5143 | }; | ||
5144 | |||
5177 | static int __init gdth_init(void) | 5145 | static int __init gdth_init(void) |
5178 | { | 5146 | { |
5179 | if (disable) { | 5147 | if (disable) { |
@@ -5236,7 +5204,6 @@ static int __init gdth_init(void) | |||
5236 | add_timer(&gdth_timer); | 5204 | add_timer(&gdth_timer); |
5237 | #endif | 5205 | #endif |
5238 | major = register_chrdev(0,"gdth", &gdth_fops); | 5206 | major = register_chrdev(0,"gdth", &gdth_fops); |
5239 | notifier_disabled = 0; | ||
5240 | register_reboot_notifier(&gdth_notifier); | 5207 | register_reboot_notifier(&gdth_notifier); |
5241 | gdth_polling = FALSE; | 5208 | gdth_polling = FALSE; |
5242 | return 0; | 5209 | return 0; |
@@ -5246,14 +5213,15 @@ static void __exit gdth_exit(void) | |||
5246 | { | 5213 | { |
5247 | gdth_ha_str *ha; | 5214 | gdth_ha_str *ha; |
5248 | 5215 | ||
5249 | list_for_each_entry(ha, &gdth_instances, list) | 5216 | unregister_chrdev(major, "gdth"); |
5250 | gdth_remove_one(ha); | 5217 | unregister_reboot_notifier(&gdth_notifier); |
5251 | 5218 | ||
5252 | #ifdef GDTH_STATISTICS | 5219 | #ifdef GDTH_STATISTICS |
5253 | del_timer(&gdth_timer); | 5220 | del_timer_sync(&gdth_timer); |
5254 | #endif | 5221 | #endif |
5255 | unregister_chrdev(major,"gdth"); | 5222 | |
5256 | unregister_reboot_notifier(&gdth_notifier); | 5223 | list_for_each_entry(ha, &gdth_instances, list) |
5224 | gdth_remove_one(ha); | ||
5257 | } | 5225 | } |
5258 | 5226 | ||
5259 | module_init(gdth_init); | 5227 | module_init(gdth_init); |
diff --git a/drivers/scsi/gdth.h b/drivers/scsi/gdth.h index 1434c6b0297c..26e4e92515e0 100644 --- a/drivers/scsi/gdth.h +++ b/drivers/scsi/gdth.h | |||
@@ -915,6 +915,7 @@ typedef struct { | |||
915 | struct gdth_cmndinfo { /* per-command private info */ | 915 | struct gdth_cmndinfo { /* per-command private info */ |
916 | int index; | 916 | int index; |
917 | int internal_command; /* don't call scsi_done */ | 917 | int internal_command; /* don't call scsi_done */ |
918 | gdth_cmd_str *internal_cmd_str; /* crier for internal messages*/ | ||
918 | dma_addr_t sense_paddr; /* sense dma-addr */ | 919 | dma_addr_t sense_paddr; /* sense dma-addr */ |
919 | unchar priority; | 920 | unchar priority; |
920 | int timeout; | 921 | int timeout; |
diff --git a/drivers/scsi/ibmvscsi/ibmvstgt.c b/drivers/scsi/ibmvscsi/ibmvstgt.c index bd62131b97a1..e5881e92d0fb 100644 --- a/drivers/scsi/ibmvscsi/ibmvstgt.c +++ b/drivers/scsi/ibmvscsi/ibmvstgt.c | |||
@@ -290,7 +290,7 @@ static int ibmvstgt_cmd_done(struct scsi_cmnd *sc, | |||
290 | int err = 0; | 290 | int err = 0; |
291 | 291 | ||
292 | dprintk("%p %p %x %u\n", iue, target, vio_iu(iue)->srp.cmd.cdb[0], | 292 | dprintk("%p %p %x %u\n", iue, target, vio_iu(iue)->srp.cmd.cdb[0], |
293 | cmd->usg_sg); | 293 | scsi_sg_count(sc)); |
294 | 294 | ||
295 | if (scsi_sg_count(sc)) | 295 | if (scsi_sg_count(sc)) |
296 | err = srp_transfer_data(sc, &vio_iu(iue)->srp.cmd, ibmvstgt_rdma, 1, 1); | 296 | err = srp_transfer_data(sc, &vio_iu(iue)->srp.cmd, ibmvstgt_rdma, 1, 1); |
@@ -838,9 +838,6 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) | |||
838 | if (!shost) | 838 | if (!shost) |
839 | goto free_vport; | 839 | goto free_vport; |
840 | shost->transportt = ibmvstgt_transport_template; | 840 | shost->transportt = ibmvstgt_transport_template; |
841 | err = scsi_tgt_alloc_queue(shost); | ||
842 | if (err) | ||
843 | goto put_host; | ||
844 | 841 | ||
845 | target = host_to_srp_target(shost); | 842 | target = host_to_srp_target(shost); |
846 | target->shost = shost; | 843 | target->shost = shost; |
@@ -872,6 +869,10 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id) | |||
872 | if (err) | 869 | if (err) |
873 | goto destroy_queue; | 870 | goto destroy_queue; |
874 | 871 | ||
872 | err = scsi_tgt_alloc_queue(shost); | ||
873 | if (err) | ||
874 | goto destroy_queue; | ||
875 | |||
875 | return 0; | 876 | return 0; |
876 | destroy_queue: | 877 | destroy_queue: |
877 | crq_queue_destroy(target); | 878 | crq_queue_destroy(target); |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 59f8445eab0d..bdd7de7da39a 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -1708,8 +1708,8 @@ iscsi_session_setup(struct iscsi_transport *iscsit, | |||
1708 | qdepth = ISCSI_DEF_CMD_PER_LUN; | 1708 | qdepth = ISCSI_DEF_CMD_PER_LUN; |
1709 | } | 1709 | } |
1710 | 1710 | ||
1711 | if (!is_power_of_2(cmds_max) || | 1711 | if (!is_power_of_2(cmds_max) || cmds_max >= ISCSI_MGMT_ITT_OFFSET || |
1712 | cmds_max >= ISCSI_MGMT_ITT_OFFSET) { | 1712 | cmds_max < 2) { |
1713 | if (cmds_max != 0) | 1713 | if (cmds_max != 0) |
1714 | printk(KERN_ERR "iscsi: invalid can_queue of %d. " | 1714 | printk(KERN_ERR "iscsi: invalid can_queue of %d. " |
1715 | "can_queue must be a power of 2 and between " | 1715 | "can_queue must be a power of 2 and between " |
diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c index 7cd05b599a12..b0e5ac372a32 100644 --- a/drivers/scsi/libsas/sas_ata.c +++ b/drivers/scsi/libsas/sas_ata.c | |||
@@ -236,12 +236,12 @@ static void sas_ata_phy_reset(struct ata_port *ap) | |||
236 | struct domain_device *dev = ap->private_data; | 236 | struct domain_device *dev = ap->private_data; |
237 | struct sas_internal *i = | 237 | struct sas_internal *i = |
238 | to_sas_internal(dev->port->ha->core.shost->transportt); | 238 | to_sas_internal(dev->port->ha->core.shost->transportt); |
239 | int res = 0; | 239 | int res = TMF_RESP_FUNC_FAILED; |
240 | 240 | ||
241 | if (i->dft->lldd_I_T_nexus_reset) | 241 | if (i->dft->lldd_I_T_nexus_reset) |
242 | res = i->dft->lldd_I_T_nexus_reset(dev); | 242 | res = i->dft->lldd_I_T_nexus_reset(dev); |
243 | 243 | ||
244 | if (res) | 244 | if (res != TMF_RESP_FUNC_COMPLETE) |
245 | SAS_DPRINTK("%s: Unable to reset I T nexus?\n", __FUNCTION__); | 245 | SAS_DPRINTK("%s: Unable to reset I T nexus?\n", __FUNCTION__); |
246 | 246 | ||
247 | switch (dev->sata_dev.command_set) { | 247 | switch (dev->sata_dev.command_set) { |
@@ -656,21 +656,6 @@ out: | |||
656 | return res; | 656 | return res; |
657 | } | 657 | } |
658 | 658 | ||
659 | static void sas_sata_propagate_sas_addr(struct domain_device *dev) | ||
660 | { | ||
661 | unsigned long flags; | ||
662 | struct asd_sas_port *port = dev->port; | ||
663 | struct asd_sas_phy *phy; | ||
664 | |||
665 | BUG_ON(dev->parent); | ||
666 | |||
667 | memcpy(port->attached_sas_addr, dev->sas_addr, SAS_ADDR_SIZE); | ||
668 | spin_lock_irqsave(&port->phy_list_lock, flags); | ||
669 | list_for_each_entry(phy, &port->phy_list, port_phy_el) | ||
670 | memcpy(phy->attached_sas_addr, dev->sas_addr, SAS_ADDR_SIZE); | ||
671 | spin_unlock_irqrestore(&port->phy_list_lock, flags); | ||
672 | } | ||
673 | |||
674 | #define ATA_IDENTIFY_DEV 0xEC | 659 | #define ATA_IDENTIFY_DEV 0xEC |
675 | #define ATA_IDENTIFY_PACKET_DEV 0xA1 | 660 | #define ATA_IDENTIFY_PACKET_DEV 0xA1 |
676 | #define ATA_SET_FEATURES 0xEF | 661 | #define ATA_SET_FEATURES 0xEF |
@@ -728,26 +713,6 @@ static int sas_discover_sata_dev(struct domain_device *dev) | |||
728 | goto out_err; | 713 | goto out_err; |
729 | } | 714 | } |
730 | cont1: | 715 | cont1: |
731 | /* Get WWN */ | ||
732 | if (dev->port->oob_mode != SATA_OOB_MODE) { | ||
733 | memcpy(dev->sas_addr, dev->sata_dev.rps_resp.rps.stp_sas_addr, | ||
734 | SAS_ADDR_SIZE); | ||
735 | } else if (dev->sata_dev.command_set == ATA_COMMAND_SET && | ||
736 | (le16_to_cpu(dev->sata_dev.identify_device[108]) & 0xF000) | ||
737 | == 0x5000) { | ||
738 | int i; | ||
739 | |||
740 | for (i = 0; i < 4; i++) { | ||
741 | dev->sas_addr[2*i] = | ||
742 | (le16_to_cpu(dev->sata_dev.identify_device[108+i]) & 0xFF00) >> 8; | ||
743 | dev->sas_addr[2*i+1] = | ||
744 | le16_to_cpu(dev->sata_dev.identify_device[108+i]) & 0x00FF; | ||
745 | } | ||
746 | } | ||
747 | sas_hash_addr(dev->hashed_sas_addr, dev->sas_addr); | ||
748 | if (!dev->parent) | ||
749 | sas_sata_propagate_sas_addr(dev); | ||
750 | |||
751 | /* XXX Hint: register this SATA device with SATL. | 716 | /* XXX Hint: register this SATA device with SATL. |
752 | When this returns, dev->sata_dev->lu is alive and | 717 | When this returns, dev->sata_dev->lu is alive and |
753 | present. | 718 | present. |
diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c index e1e2d085c920..39ae68a3b0ef 100644 --- a/drivers/scsi/libsas/sas_port.c +++ b/drivers/scsi/libsas/sas_port.c | |||
@@ -92,9 +92,6 @@ static void sas_form_port(struct asd_sas_phy *phy) | |||
92 | if (!port->phy) | 92 | if (!port->phy) |
93 | port->phy = phy->phy; | 93 | port->phy = phy->phy; |
94 | 94 | ||
95 | SAS_DPRINTK("phy%d added to port%d, phy_mask:0x%x\n", phy->id, | ||
96 | port->id, port->phy_mask); | ||
97 | |||
98 | if (*(u64 *)port->attached_sas_addr == 0) { | 95 | if (*(u64 *)port->attached_sas_addr == 0) { |
99 | port->class = phy->class; | 96 | port->class = phy->class; |
100 | memcpy(port->attached_sas_addr, phy->attached_sas_addr, | 97 | memcpy(port->attached_sas_addr, phy->attached_sas_addr, |
@@ -115,6 +112,11 @@ static void sas_form_port(struct asd_sas_phy *phy) | |||
115 | } | 112 | } |
116 | sas_port_add_phy(port->port, phy->phy); | 113 | sas_port_add_phy(port->port, phy->phy); |
117 | 114 | ||
115 | SAS_DPRINTK("%s added to %s, phy_mask:0x%x (%16llx)\n", | ||
116 | phy->phy->dev.bus_id,port->port->dev.bus_id, | ||
117 | port->phy_mask, | ||
118 | SAS_ADDR(port->attached_sas_addr)); | ||
119 | |||
118 | if (port->port_dev) | 120 | if (port->port_dev) |
119 | port->port_dev->pathways = port->num_phys; | 121 | port->port_dev->pathways = port->num_phys; |
120 | 122 | ||
@@ -255,12 +257,11 @@ void sas_porte_hard_reset(struct work_struct *work) | |||
255 | static void sas_init_port(struct asd_sas_port *port, | 257 | static void sas_init_port(struct asd_sas_port *port, |
256 | struct sas_ha_struct *sas_ha, int i) | 258 | struct sas_ha_struct *sas_ha, int i) |
257 | { | 259 | { |
260 | memset(port, 0, sizeof(*port)); | ||
258 | port->id = i; | 261 | port->id = i; |
259 | INIT_LIST_HEAD(&port->dev_list); | 262 | INIT_LIST_HEAD(&port->dev_list); |
260 | spin_lock_init(&port->phy_list_lock); | 263 | spin_lock_init(&port->phy_list_lock); |
261 | INIT_LIST_HEAD(&port->phy_list); | 264 | INIT_LIST_HEAD(&port->phy_list); |
262 | port->num_phys = 0; | ||
263 | port->phy_mask = 0; | ||
264 | port->ha = sas_ha; | 265 | port->ha = sas_ha; |
265 | 266 | ||
266 | spin_lock_init(&port->dev_list_lock); | 267 | spin_lock_init(&port->dev_list_lock); |
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c index 704ea06a6e50..1f8241563c6c 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c | |||
@@ -434,7 +434,7 @@ static int sas_recover_I_T(struct domain_device *dev) | |||
434 | } | 434 | } |
435 | 435 | ||
436 | /* Find the sas_phy that's attached to this device */ | 436 | /* Find the sas_phy that's attached to this device */ |
437 | static struct sas_phy *find_local_sas_phy(struct domain_device *dev) | 437 | struct sas_phy *sas_find_local_phy(struct domain_device *dev) |
438 | { | 438 | { |
439 | struct domain_device *pdev = dev->parent; | 439 | struct domain_device *pdev = dev->parent; |
440 | struct ex_phy *exphy = NULL; | 440 | struct ex_phy *exphy = NULL; |
@@ -456,6 +456,7 @@ static struct sas_phy *find_local_sas_phy(struct domain_device *dev) | |||
456 | BUG_ON(!exphy); | 456 | BUG_ON(!exphy); |
457 | return exphy->phy; | 457 | return exphy->phy; |
458 | } | 458 | } |
459 | EXPORT_SYMBOL_GPL(sas_find_local_phy); | ||
459 | 460 | ||
460 | /* Attempt to send a LUN reset message to a device */ | 461 | /* Attempt to send a LUN reset message to a device */ |
461 | int sas_eh_device_reset_handler(struct scsi_cmnd *cmd) | 462 | int sas_eh_device_reset_handler(struct scsi_cmnd *cmd) |
@@ -482,7 +483,7 @@ int sas_eh_device_reset_handler(struct scsi_cmnd *cmd) | |||
482 | int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd) | 483 | int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd) |
483 | { | 484 | { |
484 | struct domain_device *dev = cmd_to_domain_dev(cmd); | 485 | struct domain_device *dev = cmd_to_domain_dev(cmd); |
485 | struct sas_phy *phy = find_local_sas_phy(dev); | 486 | struct sas_phy *phy = sas_find_local_phy(dev); |
486 | int res; | 487 | int res; |
487 | 488 | ||
488 | res = sas_phy_reset(phy, 1); | 489 | res = sas_phy_reset(phy, 1); |
@@ -497,10 +498,10 @@ int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd) | |||
497 | } | 498 | } |
498 | 499 | ||
499 | /* Try to reset a device */ | 500 | /* Try to reset a device */ |
500 | static int try_to_reset_cmd_device(struct Scsi_Host *shost, | 501 | static int try_to_reset_cmd_device(struct scsi_cmnd *cmd) |
501 | struct scsi_cmnd *cmd) | ||
502 | { | 502 | { |
503 | int res; | 503 | int res; |
504 | struct Scsi_Host *shost = cmd->device->host; | ||
504 | 505 | ||
505 | if (!shost->hostt->eh_device_reset_handler) | 506 | if (!shost->hostt->eh_device_reset_handler) |
506 | goto try_bus_reset; | 507 | goto try_bus_reset; |
@@ -540,6 +541,12 @@ Again: | |||
540 | need_reset = task->task_state_flags & SAS_TASK_NEED_DEV_RESET; | 541 | need_reset = task->task_state_flags & SAS_TASK_NEED_DEV_RESET; |
541 | spin_unlock_irqrestore(&task->task_state_lock, flags); | 542 | spin_unlock_irqrestore(&task->task_state_lock, flags); |
542 | 543 | ||
544 | if (need_reset) { | ||
545 | SAS_DPRINTK("%s: task 0x%p requests reset\n", | ||
546 | __FUNCTION__, task); | ||
547 | goto reset; | ||
548 | } | ||
549 | |||
543 | SAS_DPRINTK("trying to find task 0x%p\n", task); | 550 | SAS_DPRINTK("trying to find task 0x%p\n", task); |
544 | res = sas_scsi_find_task(task); | 551 | res = sas_scsi_find_task(task); |
545 | 552 | ||
@@ -550,18 +557,15 @@ Again: | |||
550 | SAS_DPRINTK("%s: task 0x%p is done\n", __FUNCTION__, | 557 | SAS_DPRINTK("%s: task 0x%p is done\n", __FUNCTION__, |
551 | task); | 558 | task); |
552 | sas_eh_finish_cmd(cmd); | 559 | sas_eh_finish_cmd(cmd); |
553 | if (need_reset) | ||
554 | try_to_reset_cmd_device(shost, cmd); | ||
555 | continue; | 560 | continue; |
556 | case TASK_IS_ABORTED: | 561 | case TASK_IS_ABORTED: |
557 | SAS_DPRINTK("%s: task 0x%p is aborted\n", | 562 | SAS_DPRINTK("%s: task 0x%p is aborted\n", |
558 | __FUNCTION__, task); | 563 | __FUNCTION__, task); |
559 | sas_eh_finish_cmd(cmd); | 564 | sas_eh_finish_cmd(cmd); |
560 | if (need_reset) | ||
561 | try_to_reset_cmd_device(shost, cmd); | ||
562 | continue; | 565 | continue; |
563 | case TASK_IS_AT_LU: | 566 | case TASK_IS_AT_LU: |
564 | SAS_DPRINTK("task 0x%p is at LU: lu recover\n", task); | 567 | SAS_DPRINTK("task 0x%p is at LU: lu recover\n", task); |
568 | reset: | ||
565 | tmf_resp = sas_recover_lu(task->dev, cmd); | 569 | tmf_resp = sas_recover_lu(task->dev, cmd); |
566 | if (tmf_resp == TMF_RESP_FUNC_COMPLETE) { | 570 | if (tmf_resp == TMF_RESP_FUNC_COMPLETE) { |
567 | SAS_DPRINTK("dev %016llx LU %x is " | 571 | SAS_DPRINTK("dev %016llx LU %x is " |
@@ -569,8 +573,6 @@ Again: | |||
569 | SAS_ADDR(task->dev), | 573 | SAS_ADDR(task->dev), |
570 | cmd->device->lun); | 574 | cmd->device->lun); |
571 | sas_eh_finish_cmd(cmd); | 575 | sas_eh_finish_cmd(cmd); |
572 | if (need_reset) | ||
573 | try_to_reset_cmd_device(shost, cmd); | ||
574 | sas_scsi_clear_queue_lu(work_q, cmd); | 576 | sas_scsi_clear_queue_lu(work_q, cmd); |
575 | goto Again; | 577 | goto Again; |
576 | } | 578 | } |
@@ -581,15 +583,15 @@ Again: | |||
581 | task); | 583 | task); |
582 | tmf_resp = sas_recover_I_T(task->dev); | 584 | tmf_resp = sas_recover_I_T(task->dev); |
583 | if (tmf_resp == TMF_RESP_FUNC_COMPLETE) { | 585 | if (tmf_resp == TMF_RESP_FUNC_COMPLETE) { |
586 | struct domain_device *dev = task->dev; | ||
584 | SAS_DPRINTK("I_T %016llx recovered\n", | 587 | SAS_DPRINTK("I_T %016llx recovered\n", |
585 | SAS_ADDR(task->dev->sas_addr)); | 588 | SAS_ADDR(task->dev->sas_addr)); |
586 | sas_eh_finish_cmd(cmd); | 589 | sas_eh_finish_cmd(cmd); |
587 | if (need_reset) | 590 | sas_scsi_clear_queue_I_T(work_q, dev); |
588 | try_to_reset_cmd_device(shost, cmd); | ||
589 | sas_scsi_clear_queue_I_T(work_q, task->dev); | ||
590 | goto Again; | 591 | goto Again; |
591 | } | 592 | } |
592 | /* Hammer time :-) */ | 593 | /* Hammer time :-) */ |
594 | try_to_reset_cmd_device(cmd); | ||
593 | if (i->dft->lldd_clear_nexus_port) { | 595 | if (i->dft->lldd_clear_nexus_port) { |
594 | struct asd_sas_port *port = task->dev->port; | 596 | struct asd_sas_port *port = task->dev->port; |
595 | SAS_DPRINTK("clearing nexus for port:%d\n", | 597 | SAS_DPRINTK("clearing nexus for port:%d\n", |
@@ -599,8 +601,6 @@ Again: | |||
599 | SAS_DPRINTK("clear nexus port:%d " | 601 | SAS_DPRINTK("clear nexus port:%d " |
600 | "succeeded\n", port->id); | 602 | "succeeded\n", port->id); |
601 | sas_eh_finish_cmd(cmd); | 603 | sas_eh_finish_cmd(cmd); |
602 | if (need_reset) | ||
603 | try_to_reset_cmd_device(shost, cmd); | ||
604 | sas_scsi_clear_queue_port(work_q, | 604 | sas_scsi_clear_queue_port(work_q, |
605 | port); | 605 | port); |
606 | goto Again; | 606 | goto Again; |
@@ -613,8 +613,6 @@ Again: | |||
613 | SAS_DPRINTK("clear nexus ha " | 613 | SAS_DPRINTK("clear nexus ha " |
614 | "succeeded\n"); | 614 | "succeeded\n"); |
615 | sas_eh_finish_cmd(cmd); | 615 | sas_eh_finish_cmd(cmd); |
616 | if (need_reset) | ||
617 | try_to_reset_cmd_device(shost, cmd); | ||
618 | goto clear_q; | 616 | goto clear_q; |
619 | } | 617 | } |
620 | } | 618 | } |
@@ -628,8 +626,6 @@ Again: | |||
628 | cmd->device->lun); | 626 | cmd->device->lun); |
629 | 627 | ||
630 | sas_eh_finish_cmd(cmd); | 628 | sas_eh_finish_cmd(cmd); |
631 | if (need_reset) | ||
632 | try_to_reset_cmd_device(shost, cmd); | ||
633 | goto clear_q; | 629 | goto clear_q; |
634 | } | 630 | } |
635 | } | 631 | } |
diff --git a/drivers/scsi/mvsas.c b/drivers/scsi/mvsas.c index d4a6ac3c9c47..5ec0665b3a3d 100644 --- a/drivers/scsi/mvsas.c +++ b/drivers/scsi/mvsas.c | |||
@@ -40,7 +40,7 @@ | |||
40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
41 | 41 | ||
42 | #define DRV_NAME "mvsas" | 42 | #define DRV_NAME "mvsas" |
43 | #define DRV_VERSION "0.5" | 43 | #define DRV_VERSION "0.5.1" |
44 | #define _MV_DUMP 0 | 44 | #define _MV_DUMP 0 |
45 | #define MVS_DISABLE_NVRAM | 45 | #define MVS_DISABLE_NVRAM |
46 | #define MVS_DISABLE_MSI | 46 | #define MVS_DISABLE_MSI |
@@ -1005,7 +1005,7 @@ err_out: | |||
1005 | return rc; | 1005 | return rc; |
1006 | #else | 1006 | #else |
1007 | /* FIXME , For SAS target mode */ | 1007 | /* FIXME , For SAS target mode */ |
1008 | memcpy(buf, "\x00\x00\xab\x11\x30\x04\x05\x50", 8); | 1008 | memcpy(buf, "\x50\x05\x04\x30\x11\xab\x00\x00", 8); |
1009 | return 0; | 1009 | return 0; |
1010 | #endif | 1010 | #endif |
1011 | } | 1011 | } |
@@ -1330,7 +1330,7 @@ static int mvs_int_rx(struct mvs_info *mvi, bool self_clear) | |||
1330 | 1330 | ||
1331 | mvs_hba_cq_dump(mvi); | 1331 | mvs_hba_cq_dump(mvi); |
1332 | 1332 | ||
1333 | if (unlikely(rx_desc & RXQ_DONE)) | 1333 | if (likely(rx_desc & RXQ_DONE)) |
1334 | mvs_slot_complete(mvi, rx_desc); | 1334 | mvs_slot_complete(mvi, rx_desc); |
1335 | if (rx_desc & RXQ_ATTN) { | 1335 | if (rx_desc & RXQ_ATTN) { |
1336 | attn = true; | 1336 | attn = true; |
@@ -2720,9 +2720,8 @@ static int __devinit mvs_hw_init(struct mvs_info *mvi) | |||
2720 | msleep(100); | 2720 | msleep(100); |
2721 | /* init and reset phys */ | 2721 | /* init and reset phys */ |
2722 | for (i = 0; i < mvi->chip->n_phy; i++) { | 2722 | for (i = 0; i < mvi->chip->n_phy; i++) { |
2723 | /* FIXME: is this the correct dword order? */ | 2723 | u32 lo = be32_to_cpu(*(u32 *)&mvi->sas_addr[4]); |
2724 | u32 lo = *((u32 *)&mvi->sas_addr[0]); | 2724 | u32 hi = be32_to_cpu(*(u32 *)&mvi->sas_addr[0]); |
2725 | u32 hi = *((u32 *)&mvi->sas_addr[4]); | ||
2726 | 2725 | ||
2727 | mvs_detect_porttype(mvi, i); | 2726 | mvs_detect_porttype(mvi, i); |
2728 | 2727 | ||
diff --git a/drivers/scsi/ps3rom.c b/drivers/scsi/ps3rom.c index 0cd614a0fa73..fad6cb5cba28 100644 --- a/drivers/scsi/ps3rom.c +++ b/drivers/scsi/ps3rom.c | |||
@@ -124,7 +124,7 @@ static int fill_from_dev_buffer(struct scsi_cmnd *cmd, const void *buf) | |||
124 | } | 124 | } |
125 | req_len += sgpnt->length; | 125 | req_len += sgpnt->length; |
126 | } | 126 | } |
127 | scsi_set_resid(cmd, req_len - act_len); | 127 | scsi_set_resid(cmd, buflen - act_len); |
128 | return 0; | 128 | return 0; |
129 | } | 129 | } |
130 | 130 | ||
@@ -427,7 +427,7 @@ static struct scsi_host_template ps3rom_host_template = { | |||
427 | .cmd_per_lun = 1, | 427 | .cmd_per_lun = 1, |
428 | .emulated = 1, /* only sg driver uses this */ | 428 | .emulated = 1, /* only sg driver uses this */ |
429 | .max_sectors = PS3ROM_MAX_SECTORS, | 429 | .max_sectors = PS3ROM_MAX_SECTORS, |
430 | .use_clustering = ENABLE_CLUSTERING, | 430 | .use_clustering = DISABLE_CLUSTERING, |
431 | .module = THIS_MODULE, | 431 | .module = THIS_MODULE, |
432 | }; | 432 | }; |
433 | 433 | ||
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 6226d88479f5..c1808763d40e 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c | |||
@@ -39,7 +39,7 @@ qla2x00_prep_ms_iocb(scsi_qla_host_t *ha, uint32_t req_size, uint32_t rsp_size) | |||
39 | ms_pkt->entry_count = 1; | 39 | ms_pkt->entry_count = 1; |
40 | SET_TARGET_ID(ha, ms_pkt->loop_id, SIMPLE_NAME_SERVER); | 40 | SET_TARGET_ID(ha, ms_pkt->loop_id, SIMPLE_NAME_SERVER); |
41 | ms_pkt->control_flags = __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG); | 41 | ms_pkt->control_flags = __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG); |
42 | ms_pkt->timeout = __constant_cpu_to_le16(25); | 42 | ms_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); |
43 | ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); | 43 | ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); |
44 | ms_pkt->total_dsd_count = __constant_cpu_to_le16(2); | 44 | ms_pkt->total_dsd_count = __constant_cpu_to_le16(2); |
45 | ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size); | 45 | ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size); |
@@ -75,7 +75,7 @@ qla24xx_prep_ms_iocb(scsi_qla_host_t *ha, uint32_t req_size, uint32_t rsp_size) | |||
75 | ct_pkt->entry_type = CT_IOCB_TYPE; | 75 | ct_pkt->entry_type = CT_IOCB_TYPE; |
76 | ct_pkt->entry_count = 1; | 76 | ct_pkt->entry_count = 1; |
77 | ct_pkt->nport_handle = __constant_cpu_to_le16(NPH_SNS); | 77 | ct_pkt->nport_handle = __constant_cpu_to_le16(NPH_SNS); |
78 | ct_pkt->timeout = __constant_cpu_to_le16(25); | 78 | ct_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); |
79 | ct_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); | 79 | ct_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); |
80 | ct_pkt->rsp_dsd_count = __constant_cpu_to_le16(1); | 80 | ct_pkt->rsp_dsd_count = __constant_cpu_to_le16(1); |
81 | ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size); | 81 | ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size); |
@@ -1144,7 +1144,7 @@ qla2x00_prep_ms_fdmi_iocb(scsi_qla_host_t *ha, uint32_t req_size, | |||
1144 | ms_pkt->entry_count = 1; | 1144 | ms_pkt->entry_count = 1; |
1145 | SET_TARGET_ID(ha, ms_pkt->loop_id, ha->mgmt_svr_loop_id); | 1145 | SET_TARGET_ID(ha, ms_pkt->loop_id, ha->mgmt_svr_loop_id); |
1146 | ms_pkt->control_flags = __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG); | 1146 | ms_pkt->control_flags = __constant_cpu_to_le16(CF_READ | CF_HEAD_TAG); |
1147 | ms_pkt->timeout = __constant_cpu_to_le16(59); | 1147 | ms_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); |
1148 | ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); | 1148 | ms_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); |
1149 | ms_pkt->total_dsd_count = __constant_cpu_to_le16(2); | 1149 | ms_pkt->total_dsd_count = __constant_cpu_to_le16(2); |
1150 | ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size); | 1150 | ms_pkt->rsp_bytecount = cpu_to_le32(rsp_size); |
@@ -1181,7 +1181,7 @@ qla24xx_prep_ms_fdmi_iocb(scsi_qla_host_t *ha, uint32_t req_size, | |||
1181 | ct_pkt->entry_type = CT_IOCB_TYPE; | 1181 | ct_pkt->entry_type = CT_IOCB_TYPE; |
1182 | ct_pkt->entry_count = 1; | 1182 | ct_pkt->entry_count = 1; |
1183 | ct_pkt->nport_handle = cpu_to_le16(ha->mgmt_svr_loop_id); | 1183 | ct_pkt->nport_handle = cpu_to_le16(ha->mgmt_svr_loop_id); |
1184 | ct_pkt->timeout = __constant_cpu_to_le16(59); | 1184 | ct_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); |
1185 | ct_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); | 1185 | ct_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); |
1186 | ct_pkt->rsp_dsd_count = __constant_cpu_to_le16(1); | 1186 | ct_pkt->rsp_dsd_count = __constant_cpu_to_le16(1); |
1187 | ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size); | 1187 | ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size); |
@@ -1761,7 +1761,7 @@ qla24xx_prep_ms_fm_iocb(scsi_qla_host_t *ha, uint32_t req_size, | |||
1761 | ct_pkt->entry_type = CT_IOCB_TYPE; | 1761 | ct_pkt->entry_type = CT_IOCB_TYPE; |
1762 | ct_pkt->entry_count = 1; | 1762 | ct_pkt->entry_count = 1; |
1763 | ct_pkt->nport_handle = cpu_to_le16(ha->mgmt_svr_loop_id); | 1763 | ct_pkt->nport_handle = cpu_to_le16(ha->mgmt_svr_loop_id); |
1764 | ct_pkt->timeout = __constant_cpu_to_le16(59); | 1764 | ct_pkt->timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); |
1765 | ct_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); | 1765 | ct_pkt->cmd_dsd_count = __constant_cpu_to_le16(1); |
1766 | ct_pkt->rsp_dsd_count = __constant_cpu_to_le16(1); | 1766 | ct_pkt->rsp_dsd_count = __constant_cpu_to_le16(1); |
1767 | ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size); | 1767 | ct_pkt->rsp_byte_count = cpu_to_le32(rsp_size); |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index d5c7853e7eba..364be7d06875 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -1733,8 +1733,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) | |||
1733 | ha->login_timeout = nv->login_timeout; | 1733 | ha->login_timeout = nv->login_timeout; |
1734 | icb->login_timeout = nv->login_timeout; | 1734 | icb->login_timeout = nv->login_timeout; |
1735 | 1735 | ||
1736 | /* Set minimum RATOV to 200 tenths of a second. */ | 1736 | /* Set minimum RATOV to 100 tenths of a second. */ |
1737 | ha->r_a_tov = 200; | 1737 | ha->r_a_tov = 100; |
1738 | 1738 | ||
1739 | ha->loop_reset_delay = nv->reset_delay; | 1739 | ha->loop_reset_delay = nv->reset_delay; |
1740 | 1740 | ||
@@ -3645,8 +3645,8 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) | |||
3645 | ha->login_timeout = le16_to_cpu(nv->login_timeout); | 3645 | ha->login_timeout = le16_to_cpu(nv->login_timeout); |
3646 | icb->login_timeout = cpu_to_le16(nv->login_timeout); | 3646 | icb->login_timeout = cpu_to_le16(nv->login_timeout); |
3647 | 3647 | ||
3648 | /* Set minimum RATOV to 200 tenths of a second. */ | 3648 | /* Set minimum RATOV to 100 tenths of a second. */ |
3649 | ha->r_a_tov = 200; | 3649 | ha->r_a_tov = 100; |
3650 | 3650 | ||
3651 | ha->loop_reset_delay = nv->reset_delay; | 3651 | ha->loop_reset_delay = nv->reset_delay; |
3652 | 3652 | ||
@@ -4022,7 +4022,8 @@ qla2x00_try_to_stop_firmware(scsi_qla_host_t *ha) | |||
4022 | return; | 4022 | return; |
4023 | 4023 | ||
4024 | ret = qla2x00_stop_firmware(ha); | 4024 | ret = qla2x00_stop_firmware(ha); |
4025 | for (retries = 5; ret != QLA_SUCCESS && retries ; retries--) { | 4025 | for (retries = 5; ret != QLA_SUCCESS && ret != QLA_FUNCTION_TIMEOUT && |
4026 | retries ; retries--) { | ||
4026 | qla2x00_reset_chip(ha); | 4027 | qla2x00_reset_chip(ha); |
4027 | if (qla2x00_chip_diag(ha) != QLA_SUCCESS) | 4028 | if (qla2x00_chip_diag(ha) != QLA_SUCCESS) |
4028 | continue; | 4029 | continue; |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 14e6f22944b7..f0337036c7bb 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -958,6 +958,11 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
958 | } | 958 | } |
959 | } | 959 | } |
960 | 960 | ||
961 | /* Check for overrun. */ | ||
962 | if (IS_FWI2_CAPABLE(ha) && comp_status == CS_COMPLETE && | ||
963 | scsi_status & SS_RESIDUAL_OVER) | ||
964 | comp_status = CS_DATA_OVERRUN; | ||
965 | |||
961 | /* | 966 | /* |
962 | * Based on Host and scsi status generate status code for Linux | 967 | * Based on Host and scsi status generate status code for Linux |
963 | */ | 968 | */ |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 99d29fff836d..bb103580e1ba 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -2206,7 +2206,7 @@ qla24xx_abort_target(fc_port_t *fcport) | |||
2206 | tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE; | 2206 | tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE; |
2207 | tsk->p.tsk.entry_count = 1; | 2207 | tsk->p.tsk.entry_count = 1; |
2208 | tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id); | 2208 | tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id); |
2209 | tsk->p.tsk.timeout = __constant_cpu_to_le16(25); | 2209 | tsk->p.tsk.timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); |
2210 | tsk->p.tsk.control_flags = __constant_cpu_to_le32(TCF_TARGET_RESET); | 2210 | tsk->p.tsk.control_flags = __constant_cpu_to_le32(TCF_TARGET_RESET); |
2211 | tsk->p.tsk.port_id[0] = fcport->d_id.b.al_pa; | 2211 | tsk->p.tsk.port_id[0] = fcport->d_id.b.al_pa; |
2212 | tsk->p.tsk.port_id[1] = fcport->d_id.b.area; | 2212 | tsk->p.tsk.port_id[1] = fcport->d_id.b.area; |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index c5742cc15abb..ea08a129fee9 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
@@ -7,7 +7,7 @@ | |||
7 | /* | 7 | /* |
8 | * Driver version | 8 | * Driver version |
9 | */ | 9 | */ |
10 | #define QLA2XXX_VERSION "8.02.00-k8" | 10 | #define QLA2XXX_VERSION "8.02.00-k9" |
11 | 11 | ||
12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
13 | #define QLA_DRIVER_MINOR_VER 2 | 13 | #define QLA_DRIVER_MINOR_VER 2 |
diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c index 10b3b9a620f3..109c5f5985ec 100644 --- a/drivers/scsi/qla4xxx/ql4_init.c +++ b/drivers/scsi/qla4xxx/ql4_init.c | |||
@@ -1299,9 +1299,9 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, | |||
1299 | ddb_entry->fw_ddb_device_state = state; | 1299 | ddb_entry->fw_ddb_device_state = state; |
1300 | /* Device is back online. */ | 1300 | /* Device is back online. */ |
1301 | if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) { | 1301 | if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) { |
1302 | atomic_set(&ddb_entry->state, DDB_STATE_ONLINE); | ||
1302 | atomic_set(&ddb_entry->port_down_timer, | 1303 | atomic_set(&ddb_entry->port_down_timer, |
1303 | ha->port_down_retry_count); | 1304 | ha->port_down_retry_count); |
1304 | atomic_set(&ddb_entry->state, DDB_STATE_ONLINE); | ||
1305 | atomic_set(&ddb_entry->relogin_retry_count, 0); | 1305 | atomic_set(&ddb_entry->relogin_retry_count, 0); |
1306 | atomic_set(&ddb_entry->relogin_timer, 0); | 1306 | atomic_set(&ddb_entry->relogin_timer, 0); |
1307 | clear_bit(DF_RELOGIN, &ddb_entry->flags); | 1307 | clear_bit(DF_RELOGIN, &ddb_entry->flags); |
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index c3c59d763037..8b92f348f02c 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
@@ -75,6 +75,7 @@ static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd); | |||
75 | static int qla4xxx_slave_alloc(struct scsi_device *device); | 75 | static int qla4xxx_slave_alloc(struct scsi_device *device); |
76 | static int qla4xxx_slave_configure(struct scsi_device *device); | 76 | static int qla4xxx_slave_configure(struct scsi_device *device); |
77 | static void qla4xxx_slave_destroy(struct scsi_device *sdev); | 77 | static void qla4xxx_slave_destroy(struct scsi_device *sdev); |
78 | static void qla4xxx_scan_start(struct Scsi_Host *shost); | ||
78 | 79 | ||
79 | static struct scsi_host_template qla4xxx_driver_template = { | 80 | static struct scsi_host_template qla4xxx_driver_template = { |
80 | .module = THIS_MODULE, | 81 | .module = THIS_MODULE, |
@@ -90,6 +91,7 @@ static struct scsi_host_template qla4xxx_driver_template = { | |||
90 | .slave_destroy = qla4xxx_slave_destroy, | 91 | .slave_destroy = qla4xxx_slave_destroy, |
91 | 92 | ||
92 | .scan_finished = iscsi_scan_finished, | 93 | .scan_finished = iscsi_scan_finished, |
94 | .scan_start = qla4xxx_scan_start, | ||
93 | 95 | ||
94 | .this_id = -1, | 96 | .this_id = -1, |
95 | .cmd_per_lun = 3, | 97 | .cmd_per_lun = 3, |
@@ -299,6 +301,18 @@ struct ddb_entry *qla4xxx_alloc_sess(struct scsi_qla_host *ha) | |||
299 | return ddb_entry; | 301 | return ddb_entry; |
300 | } | 302 | } |
301 | 303 | ||
304 | static void qla4xxx_scan_start(struct Scsi_Host *shost) | ||
305 | { | ||
306 | struct scsi_qla_host *ha = shost_priv(shost); | ||
307 | struct ddb_entry *ddb_entry, *ddbtemp; | ||
308 | |||
309 | /* finish setup of sessions that were already setup in firmware */ | ||
310 | list_for_each_entry_safe(ddb_entry, ddbtemp, &ha->ddb_list, list) { | ||
311 | if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) | ||
312 | qla4xxx_add_sess(ddb_entry); | ||
313 | } | ||
314 | } | ||
315 | |||
302 | /* | 316 | /* |
303 | * Timer routines | 317 | * Timer routines |
304 | */ | 318 | */ |
@@ -864,8 +878,9 @@ static void qla4xxx_flush_active_srbs(struct scsi_qla_host *ha) | |||
864 | * qla4xxx_recover_adapter - recovers adapter after a fatal error | 878 | * qla4xxx_recover_adapter - recovers adapter after a fatal error |
865 | * @ha: Pointer to host adapter structure. | 879 | * @ha: Pointer to host adapter structure. |
866 | * @renew_ddb_list: Indicates what to do with the adapter's ddb list | 880 | * @renew_ddb_list: Indicates what to do with the adapter's ddb list |
867 | * after adapter recovery has completed. | 881 | * |
868 | * 0=preserve ddb list, 1=destroy and rebuild ddb list | 882 | * renew_ddb_list value can be 0=preserve ddb list, 1=destroy and rebuild |
883 | * ddb list. | ||
869 | **/ | 884 | **/ |
870 | static int qla4xxx_recover_adapter(struct scsi_qla_host *ha, | 885 | static int qla4xxx_recover_adapter(struct scsi_qla_host *ha, |
871 | uint8_t renew_ddb_list) | 886 | uint8_t renew_ddb_list) |
@@ -874,6 +889,7 @@ static int qla4xxx_recover_adapter(struct scsi_qla_host *ha, | |||
874 | 889 | ||
875 | /* Stall incoming I/O until we are done */ | 890 | /* Stall incoming I/O until we are done */ |
876 | clear_bit(AF_ONLINE, &ha->flags); | 891 | clear_bit(AF_ONLINE, &ha->flags); |
892 | |||
877 | DEBUG2(printk("scsi%ld: %s calling qla4xxx_cmd_wait\n", ha->host_no, | 893 | DEBUG2(printk("scsi%ld: %s calling qla4xxx_cmd_wait\n", ha->host_no, |
878 | __func__)); | 894 | __func__)); |
879 | 895 | ||
@@ -1176,7 +1192,6 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
1176 | int ret = -ENODEV, status; | 1192 | int ret = -ENODEV, status; |
1177 | struct Scsi_Host *host; | 1193 | struct Scsi_Host *host; |
1178 | struct scsi_qla_host *ha; | 1194 | struct scsi_qla_host *ha; |
1179 | struct ddb_entry *ddb_entry, *ddbtemp; | ||
1180 | uint8_t init_retry_count = 0; | 1195 | uint8_t init_retry_count = 0; |
1181 | char buf[34]; | 1196 | char buf[34]; |
1182 | 1197 | ||
@@ -1295,13 +1310,6 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
1295 | if (ret) | 1310 | if (ret) |
1296 | goto probe_failed; | 1311 | goto probe_failed; |
1297 | 1312 | ||
1298 | /* Update transport device information for all devices. */ | ||
1299 | list_for_each_entry_safe(ddb_entry, ddbtemp, &ha->ddb_list, list) { | ||
1300 | if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) | ||
1301 | if (qla4xxx_add_sess(ddb_entry)) | ||
1302 | goto remove_host; | ||
1303 | } | ||
1304 | |||
1305 | printk(KERN_INFO | 1313 | printk(KERN_INFO |
1306 | " QLogic iSCSI HBA Driver version: %s\n" | 1314 | " QLogic iSCSI HBA Driver version: %s\n" |
1307 | " QLogic ISP%04x @ %s, host#=%ld, fw=%02d.%02d.%02d.%02d\n", | 1315 | " QLogic ISP%04x @ %s, host#=%ld, fw=%02d.%02d.%02d.%02d\n", |
@@ -1311,10 +1319,6 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
1311 | scsi_scan_host(host); | 1319 | scsi_scan_host(host); |
1312 | return 0; | 1320 | return 0; |
1313 | 1321 | ||
1314 | remove_host: | ||
1315 | qla4xxx_free_ddb_list(ha); | ||
1316 | scsi_remove_host(host); | ||
1317 | |||
1318 | probe_failed: | 1322 | probe_failed: |
1319 | qla4xxx_free_adapter(ha); | 1323 | qla4xxx_free_adapter(ha); |
1320 | scsi_host_put(ha->host); | 1324 | scsi_host_put(ha->host); |
@@ -1600,9 +1604,12 @@ static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd) | |||
1600 | return FAILED; | 1604 | return FAILED; |
1601 | } | 1605 | } |
1602 | 1606 | ||
1603 | if (qla4xxx_recover_adapter(ha, PRESERVE_DDB_LIST) == QLA_SUCCESS) { | 1607 | /* make sure the dpc thread is stopped while we reset the hba */ |
1608 | clear_bit(AF_ONLINE, &ha->flags); | ||
1609 | flush_workqueue(ha->dpc_thread); | ||
1610 | |||
1611 | if (qla4xxx_recover_adapter(ha, PRESERVE_DDB_LIST) == QLA_SUCCESS) | ||
1604 | return_status = SUCCESS; | 1612 | return_status = SUCCESS; |
1605 | } | ||
1606 | 1613 | ||
1607 | dev_info(&ha->pdev->dev, "HOST RESET %s.\n", | 1614 | dev_info(&ha->pdev->dev, "HOST RESET %s.\n", |
1608 | return_status == FAILED ? "FAILED" : "SUCCEDED"); | 1615 | return_status == FAILED ? "FAILED" : "SUCCEDED"); |
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index fecba05b4e77..e5c6f6af8765 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
@@ -757,7 +757,7 @@ void scsi_finish_command(struct scsi_cmnd *cmd) | |||
757 | "Notifying upper driver of completion " | 757 | "Notifying upper driver of completion " |
758 | "(result %x)\n", cmd->result)); | 758 | "(result %x)\n", cmd->result)); |
759 | 759 | ||
760 | good_bytes = scsi_bufflen(cmd); | 760 | good_bytes = scsi_bufflen(cmd) + cmd->request->extra_len; |
761 | if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { | 761 | if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { |
762 | drv = scsi_cmd_to_driver(cmd); | 762 | drv = scsi_cmd_to_driver(cmd); |
763 | if (drv->done) | 763 | if (drv->done) |
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 1dc165ad17fb..e67c14e31bab 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -1577,8 +1577,7 @@ static void __scsi_scan_target(struct device *parent, unsigned int channel, | |||
1577 | } | 1577 | } |
1578 | 1578 | ||
1579 | /** | 1579 | /** |
1580 | * scsi_scan_target - scan a target id, possibly including all LUNs on the | 1580 | * scsi_scan_target - scan a target id, possibly including all LUNs on the target. |
1581 | * target. | ||
1582 | * @parent: host to scan | 1581 | * @parent: host to scan |
1583 | * @channel: channel to scan | 1582 | * @channel: channel to scan |
1584 | * @id: target id to scan | 1583 | * @id: target id to scan |
diff --git a/drivers/scsi/scsi_tgt_lib.c b/drivers/scsi/scsi_tgt_lib.c index 3677fbb30b72..a0f308bd145b 100644 --- a/drivers/scsi/scsi_tgt_lib.c +++ b/drivers/scsi/scsi_tgt_lib.c | |||
@@ -103,7 +103,6 @@ struct scsi_cmnd *scsi_host_get_command(struct Scsi_Host *shost, | |||
103 | if (!cmd) | 103 | if (!cmd) |
104 | goto release_rq; | 104 | goto release_rq; |
105 | 105 | ||
106 | memset(cmd, 0, sizeof(*cmd)); | ||
107 | cmd->sc_data_direction = data_dir; | 106 | cmd->sc_data_direction = data_dir; |
108 | cmd->jiffies_at_alloc = jiffies; | 107 | cmd->jiffies_at_alloc = jiffies; |
109 | cmd->request = rq; | 108 | cmd->request = rq; |
@@ -382,6 +381,11 @@ static int scsi_map_user_pages(struct scsi_tgt_cmd *tcmd, struct scsi_cmnd *cmd, | |||
382 | scsi_release_buffers(cmd); | 381 | scsi_release_buffers(cmd); |
383 | goto unmap_rq; | 382 | goto unmap_rq; |
384 | } | 383 | } |
384 | /* | ||
385 | * we use REQ_TYPE_BLOCK_PC so scsi_init_io doesn't set the | ||
386 | * length for us. | ||
387 | */ | ||
388 | cmd->sdb.length = rq->data_len; | ||
385 | 389 | ||
386 | return 0; | 390 | return 0; |
387 | 391 | ||
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 9981682d5302..ca7bb6f63bde 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #define ISCSI_SESSION_ATTRS 19 | 33 | #define ISCSI_SESSION_ATTRS 19 |
34 | #define ISCSI_CONN_ATTRS 13 | 34 | #define ISCSI_CONN_ATTRS 13 |
35 | #define ISCSI_HOST_ATTRS 4 | 35 | #define ISCSI_HOST_ATTRS 4 |
36 | #define ISCSI_TRANSPORT_VERSION "2.0-868" | 36 | #define ISCSI_TRANSPORT_VERSION "2.0-869" |
37 | 37 | ||
38 | struct iscsi_internal { | 38 | struct iscsi_internal { |
39 | int daemon_pid; | 39 | int daemon_pid; |
@@ -373,24 +373,25 @@ static void session_recovery_timedout(struct work_struct *work) | |||
373 | scsi_target_unblock(&session->dev); | 373 | scsi_target_unblock(&session->dev); |
374 | } | 374 | } |
375 | 375 | ||
376 | static void __iscsi_unblock_session(struct iscsi_cls_session *session) | 376 | static void __iscsi_unblock_session(struct work_struct *work) |
377 | { | ||
378 | if (!cancel_delayed_work(&session->recovery_work)) | ||
379 | flush_workqueue(iscsi_eh_timer_workq); | ||
380 | scsi_target_unblock(&session->dev); | ||
381 | } | ||
382 | |||
383 | void iscsi_unblock_session(struct iscsi_cls_session *session) | ||
384 | { | 377 | { |
378 | struct iscsi_cls_session *session = | ||
379 | container_of(work, struct iscsi_cls_session, | ||
380 | unblock_work); | ||
385 | struct Scsi_Host *shost = iscsi_session_to_shost(session); | 381 | struct Scsi_Host *shost = iscsi_session_to_shost(session); |
386 | struct iscsi_host *ihost = shost->shost_data; | 382 | struct iscsi_host *ihost = shost->shost_data; |
387 | unsigned long flags; | 383 | unsigned long flags; |
388 | 384 | ||
385 | /* | ||
386 | * The recovery and unblock work get run from the same workqueue, | ||
387 | * so try to cancel it if it was going to run after this unblock. | ||
388 | */ | ||
389 | cancel_delayed_work(&session->recovery_work); | ||
389 | spin_lock_irqsave(&session->lock, flags); | 390 | spin_lock_irqsave(&session->lock, flags); |
390 | session->state = ISCSI_SESSION_LOGGED_IN; | 391 | session->state = ISCSI_SESSION_LOGGED_IN; |
391 | spin_unlock_irqrestore(&session->lock, flags); | 392 | spin_unlock_irqrestore(&session->lock, flags); |
392 | 393 | /* start IO */ | |
393 | __iscsi_unblock_session(session); | 394 | scsi_target_unblock(&session->dev); |
394 | /* | 395 | /* |
395 | * Only do kernel scanning if the driver is properly hooked into | 396 | * Only do kernel scanning if the driver is properly hooked into |
396 | * the async scanning code (drivers like iscsi_tcp do login and | 397 | * the async scanning code (drivers like iscsi_tcp do login and |
@@ -401,20 +402,43 @@ void iscsi_unblock_session(struct iscsi_cls_session *session) | |||
401 | atomic_inc(&ihost->nr_scans); | 402 | atomic_inc(&ihost->nr_scans); |
402 | } | 403 | } |
403 | } | 404 | } |
405 | |||
406 | /** | ||
407 | * iscsi_unblock_session - set a session as logged in and start IO. | ||
408 | * @session: iscsi session | ||
409 | * | ||
410 | * Mark a session as ready to accept IO. | ||
411 | */ | ||
412 | void iscsi_unblock_session(struct iscsi_cls_session *session) | ||
413 | { | ||
414 | queue_work(iscsi_eh_timer_workq, &session->unblock_work); | ||
415 | /* | ||
416 | * make sure all the events have completed before tell the driver | ||
417 | * it is safe | ||
418 | */ | ||
419 | flush_workqueue(iscsi_eh_timer_workq); | ||
420 | } | ||
404 | EXPORT_SYMBOL_GPL(iscsi_unblock_session); | 421 | EXPORT_SYMBOL_GPL(iscsi_unblock_session); |
405 | 422 | ||
406 | void iscsi_block_session(struct iscsi_cls_session *session) | 423 | static void __iscsi_block_session(struct work_struct *work) |
407 | { | 424 | { |
425 | struct iscsi_cls_session *session = | ||
426 | container_of(work, struct iscsi_cls_session, | ||
427 | block_work); | ||
408 | unsigned long flags; | 428 | unsigned long flags; |
409 | 429 | ||
410 | spin_lock_irqsave(&session->lock, flags); | 430 | spin_lock_irqsave(&session->lock, flags); |
411 | session->state = ISCSI_SESSION_FAILED; | 431 | session->state = ISCSI_SESSION_FAILED; |
412 | spin_unlock_irqrestore(&session->lock, flags); | 432 | spin_unlock_irqrestore(&session->lock, flags); |
413 | |||
414 | scsi_target_block(&session->dev); | 433 | scsi_target_block(&session->dev); |
415 | queue_delayed_work(iscsi_eh_timer_workq, &session->recovery_work, | 434 | queue_delayed_work(iscsi_eh_timer_workq, &session->recovery_work, |
416 | session->recovery_tmo * HZ); | 435 | session->recovery_tmo * HZ); |
417 | } | 436 | } |
437 | |||
438 | void iscsi_block_session(struct iscsi_cls_session *session) | ||
439 | { | ||
440 | queue_work(iscsi_eh_timer_workq, &session->block_work); | ||
441 | } | ||
418 | EXPORT_SYMBOL_GPL(iscsi_block_session); | 442 | EXPORT_SYMBOL_GPL(iscsi_block_session); |
419 | 443 | ||
420 | static void __iscsi_unbind_session(struct work_struct *work) | 444 | static void __iscsi_unbind_session(struct work_struct *work) |
@@ -463,6 +487,8 @@ iscsi_alloc_session(struct Scsi_Host *shost, | |||
463 | INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout); | 487 | INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout); |
464 | INIT_LIST_HEAD(&session->host_list); | 488 | INIT_LIST_HEAD(&session->host_list); |
465 | INIT_LIST_HEAD(&session->sess_list); | 489 | INIT_LIST_HEAD(&session->sess_list); |
490 | INIT_WORK(&session->unblock_work, __iscsi_unblock_session); | ||
491 | INIT_WORK(&session->block_work, __iscsi_block_session); | ||
466 | INIT_WORK(&session->unbind_work, __iscsi_unbind_session); | 492 | INIT_WORK(&session->unbind_work, __iscsi_unbind_session); |
467 | INIT_WORK(&session->scan_work, iscsi_scan_session); | 493 | INIT_WORK(&session->scan_work, iscsi_scan_session); |
468 | spin_lock_init(&session->lock); | 494 | spin_lock_init(&session->lock); |
@@ -575,24 +601,25 @@ void iscsi_remove_session(struct iscsi_cls_session *session) | |||
575 | list_del(&session->sess_list); | 601 | list_del(&session->sess_list); |
576 | spin_unlock_irqrestore(&sesslock, flags); | 602 | spin_unlock_irqrestore(&sesslock, flags); |
577 | 603 | ||
604 | /* make sure there are no blocks/unblocks queued */ | ||
605 | flush_workqueue(iscsi_eh_timer_workq); | ||
606 | /* make sure the timedout callout is not running */ | ||
607 | if (!cancel_delayed_work(&session->recovery_work)) | ||
608 | flush_workqueue(iscsi_eh_timer_workq); | ||
578 | /* | 609 | /* |
579 | * If we are blocked let commands flow again. The lld or iscsi | 610 | * If we are blocked let commands flow again. The lld or iscsi |
580 | * layer should set up the queuecommand to fail commands. | 611 | * layer should set up the queuecommand to fail commands. |
612 | * We assume that LLD will not be calling block/unblock while | ||
613 | * removing the session. | ||
581 | */ | 614 | */ |
582 | spin_lock_irqsave(&session->lock, flags); | 615 | spin_lock_irqsave(&session->lock, flags); |
583 | session->state = ISCSI_SESSION_FREE; | 616 | session->state = ISCSI_SESSION_FREE; |
584 | spin_unlock_irqrestore(&session->lock, flags); | 617 | spin_unlock_irqrestore(&session->lock, flags); |
585 | __iscsi_unblock_session(session); | ||
586 | __iscsi_unbind_session(&session->unbind_work); | ||
587 | 618 | ||
588 | /* flush running scans */ | 619 | scsi_target_unblock(&session->dev); |
620 | /* flush running scans then delete devices */ | ||
589 | flush_workqueue(ihost->scan_workq); | 621 | flush_workqueue(ihost->scan_workq); |
590 | /* | 622 | __iscsi_unbind_session(&session->unbind_work); |
591 | * If the session dropped while removing devices then we need to make | ||
592 | * sure it is not blocked | ||
593 | */ | ||
594 | if (!cancel_delayed_work(&session->recovery_work)) | ||
595 | flush_workqueue(iscsi_eh_timer_workq); | ||
596 | 623 | ||
597 | /* hw iscsi may not have removed all connections from session */ | 624 | /* hw iscsi may not have removed all connections from session */ |
598 | err = device_for_each_child(&session->dev, NULL, | 625 | err = device_for_each_child(&session->dev, NULL, |
@@ -802,23 +829,16 @@ EXPORT_SYMBOL_GPL(iscsi_recv_pdu); | |||
802 | 829 | ||
803 | void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) | 830 | void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) |
804 | { | 831 | { |
805 | struct iscsi_cls_session *session = iscsi_conn_to_session(conn); | ||
806 | struct nlmsghdr *nlh; | 832 | struct nlmsghdr *nlh; |
807 | struct sk_buff *skb; | 833 | struct sk_buff *skb; |
808 | struct iscsi_uevent *ev; | 834 | struct iscsi_uevent *ev; |
809 | struct iscsi_internal *priv; | 835 | struct iscsi_internal *priv; |
810 | int len = NLMSG_SPACE(sizeof(*ev)); | 836 | int len = NLMSG_SPACE(sizeof(*ev)); |
811 | unsigned long flags; | ||
812 | 837 | ||
813 | priv = iscsi_if_transport_lookup(conn->transport); | 838 | priv = iscsi_if_transport_lookup(conn->transport); |
814 | if (!priv) | 839 | if (!priv) |
815 | return; | 840 | return; |
816 | 841 | ||
817 | spin_lock_irqsave(&session->lock, flags); | ||
818 | if (session->state == ISCSI_SESSION_LOGGED_IN) | ||
819 | session->state = ISCSI_SESSION_FAILED; | ||
820 | spin_unlock_irqrestore(&session->lock, flags); | ||
821 | |||
822 | skb = alloc_skb(len, GFP_ATOMIC); | 842 | skb = alloc_skb(len, GFP_ATOMIC); |
823 | if (!skb) { | 843 | if (!skb) { |
824 | iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored " | 844 | iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored " |
diff --git a/drivers/serial/8250_pnp.c b/drivers/serial/8250_pnp.c index 6f09cbd7fc48..97c68d021d28 100644 --- a/drivers/serial/8250_pnp.c +++ b/drivers/serial/8250_pnp.c | |||
@@ -91,6 +91,8 @@ static const struct pnp_device_id pnp_dev_table[] = { | |||
91 | /* Archtek America Corp. */ | 91 | /* Archtek America Corp. */ |
92 | /* Archtek SmartLink Modem 3334BT Plug & Play */ | 92 | /* Archtek SmartLink Modem 3334BT Plug & Play */ |
93 | { "GVC000F", 0 }, | 93 | { "GVC000F", 0 }, |
94 | /* Archtek SmartLink Modem 3334BRV 33.6K Data Fax Voice */ | ||
95 | { "GVC0303", 0 }, | ||
94 | /* Hayes */ | 96 | /* Hayes */ |
95 | /* Hayes Optima 288 V.34-V.FC + FAX + Voice Plug & Play */ | 97 | /* Hayes Optima 288 V.34-V.FC + FAX + Voice Plug & Play */ |
96 | { "HAY0001", 0 }, | 98 | { "HAY0001", 0 }, |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index b82595cf13e8..cf627cd1b4c8 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -686,7 +686,7 @@ config UART0_RTS_PIN | |||
686 | 686 | ||
687 | config SERIAL_BFIN_UART1 | 687 | config SERIAL_BFIN_UART1 |
688 | bool "Enable UART1" | 688 | bool "Enable UART1" |
689 | depends on SERIAL_BFIN && (BF534 || BF536 || BF537 || BF54x) | 689 | depends on SERIAL_BFIN && (!BF531 && !BF532 && !BF533 && !BF561) |
690 | help | 690 | help |
691 | Enable UART1 | 691 | Enable UART1 |
692 | 692 | ||
@@ -699,14 +699,14 @@ config BFIN_UART1_CTSRTS | |||
699 | 699 | ||
700 | config UART1_CTS_PIN | 700 | config UART1_CTS_PIN |
701 | int "UART1 CTS pin" | 701 | int "UART1 CTS pin" |
702 | depends on BFIN_UART1_CTSRTS && (BF53x || BF561) | 702 | depends on BFIN_UART1_CTSRTS && !BF54x |
703 | default -1 | 703 | default -1 |
704 | help | 704 | help |
705 | Refer to ./include/asm-blackfin/gpio.h to see the GPIO map. | 705 | Refer to ./include/asm-blackfin/gpio.h to see the GPIO map. |
706 | 706 | ||
707 | config UART1_RTS_PIN | 707 | config UART1_RTS_PIN |
708 | int "UART1 RTS pin" | 708 | int "UART1 RTS pin" |
709 | depends on BFIN_UART1_CTSRTS && (BF53x || BF561) | 709 | depends on BFIN_UART1_CTSRTS && !BF54x |
710 | default -1 | 710 | default -1 |
711 | help | 711 | help |
712 | Refer to ./include/asm-blackfin/gpio.h to see the GPIO map. | 712 | Refer to ./include/asm-blackfin/gpio.h to see the GPIO map. |
diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c index ac2a3ef28d55..0aa345b9a38b 100644 --- a/drivers/serial/bfin_5xx.c +++ b/drivers/serial/bfin_5xx.c | |||
@@ -1,30 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * File: drivers/serial/bfin_5xx.c | 2 | * Blackfin On-Chip Serial Driver |
3 | * Based on: Based on drivers/serial/sa1100.c | ||
4 | * Author: Aubrey Li <aubrey.li@analog.com> | ||
5 | * | 3 | * |
6 | * Created: | 4 | * Copyright 2006-2007 Analog Devices Inc. |
7 | * Description: Driver for blackfin 5xx serial ports | ||
8 | * | 5 | * |
9 | * Modified: | 6 | * Enter bugs at http://blackfin.uclinux.org/ |
10 | * Copyright 2006 Analog Devices Inc. | ||
11 | * | 7 | * |
12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 8 | * Licensed under the GPL-2 or later. |
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License as published by | ||
16 | * the Free Software Foundation; either version 2 of the License, or | ||
17 | * (at your option) any later version. | ||
18 | * | ||
19 | * This program is distributed in the hope that it will be useful, | ||
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
22 | * GNU General Public License for more details. | ||
23 | * | ||
24 | * You should have received a copy of the GNU General Public License | ||
25 | * along with this program; if not, see the file COPYING, or write | ||
26 | * to the Free Software Foundation, Inc., | ||
27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
28 | */ | 9 | */ |
29 | 10 | ||
30 | #if defined(CONFIG_SERIAL_BFIN_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) | 11 | #if defined(CONFIG_SERIAL_BFIN_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) |
@@ -67,14 +48,12 @@ | |||
67 | #define DMA_RX_XCOUNT 512 | 48 | #define DMA_RX_XCOUNT 512 |
68 | #define DMA_RX_YCOUNT (PAGE_SIZE / DMA_RX_XCOUNT) | 49 | #define DMA_RX_YCOUNT (PAGE_SIZE / DMA_RX_XCOUNT) |
69 | 50 | ||
70 | #define DMA_RX_FLUSH_JIFFIES 5 | 51 | #define DMA_RX_FLUSH_JIFFIES (HZ / 50) |
71 | 52 | ||
72 | #ifdef CONFIG_SERIAL_BFIN_DMA | 53 | #ifdef CONFIG_SERIAL_BFIN_DMA |
73 | static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart); | 54 | static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart); |
74 | #else | 55 | #else |
75 | static void bfin_serial_do_work(struct work_struct *work); | ||
76 | static void bfin_serial_tx_chars(struct bfin_serial_port *uart); | 56 | static void bfin_serial_tx_chars(struct bfin_serial_port *uart); |
77 | static void local_put_char(struct bfin_serial_port *uart, char ch); | ||
78 | #endif | 57 | #endif |
79 | 58 | ||
80 | static void bfin_serial_mctrl_check(struct bfin_serial_port *uart); | 59 | static void bfin_serial_mctrl_check(struct bfin_serial_port *uart); |
@@ -85,23 +64,26 @@ static void bfin_serial_mctrl_check(struct bfin_serial_port *uart); | |||
85 | static void bfin_serial_stop_tx(struct uart_port *port) | 64 | static void bfin_serial_stop_tx(struct uart_port *port) |
86 | { | 65 | { |
87 | struct bfin_serial_port *uart = (struct bfin_serial_port *)port; | 66 | struct bfin_serial_port *uart = (struct bfin_serial_port *)port; |
67 | struct circ_buf *xmit = &uart->port.info->xmit; | ||
68 | #if !defined(CONFIG_BF54x) && !defined(CONFIG_SERIAL_BFIN_DMA) | ||
69 | unsigned short ier; | ||
70 | #endif | ||
88 | 71 | ||
89 | while (!(UART_GET_LSR(uart) & TEMT)) | 72 | while (!(UART_GET_LSR(uart) & TEMT)) |
90 | continue; | 73 | cpu_relax(); |
91 | 74 | ||
92 | #ifdef CONFIG_SERIAL_BFIN_DMA | 75 | #ifdef CONFIG_SERIAL_BFIN_DMA |
93 | disable_dma(uart->tx_dma_channel); | 76 | disable_dma(uart->tx_dma_channel); |
77 | xmit->tail = (xmit->tail + uart->tx_count) & (UART_XMIT_SIZE - 1); | ||
78 | uart->port.icount.tx += uart->tx_count; | ||
79 | uart->tx_count = 0; | ||
80 | uart->tx_done = 1; | ||
94 | #else | 81 | #else |
95 | #ifdef CONFIG_BF54x | 82 | #ifdef CONFIG_BF54x |
96 | /* Waiting for Transmission Finished */ | ||
97 | while (!(UART_GET_LSR(uart) & TFI)) | ||
98 | continue; | ||
99 | /* Clear TFI bit */ | 83 | /* Clear TFI bit */ |
100 | UART_PUT_LSR(uart, TFI); | 84 | UART_PUT_LSR(uart, TFI); |
101 | UART_CLEAR_IER(uart, ETBEI); | 85 | UART_CLEAR_IER(uart, ETBEI); |
102 | #else | 86 | #else |
103 | unsigned short ier; | ||
104 | |||
105 | ier = UART_GET_IER(uart); | 87 | ier = UART_GET_IER(uart); |
106 | ier &= ~ETBEI; | 88 | ier &= ~ETBEI; |
107 | UART_PUT_IER(uart, ier); | 89 | UART_PUT_IER(uart, ier); |
@@ -117,7 +99,8 @@ static void bfin_serial_start_tx(struct uart_port *port) | |||
117 | struct bfin_serial_port *uart = (struct bfin_serial_port *)port; | 99 | struct bfin_serial_port *uart = (struct bfin_serial_port *)port; |
118 | 100 | ||
119 | #ifdef CONFIG_SERIAL_BFIN_DMA | 101 | #ifdef CONFIG_SERIAL_BFIN_DMA |
120 | bfin_serial_dma_tx_chars(uart); | 102 | if (uart->tx_done) |
103 | bfin_serial_dma_tx_chars(uart); | ||
121 | #else | 104 | #else |
122 | #ifdef CONFIG_BF54x | 105 | #ifdef CONFIG_BF54x |
123 | UART_SET_IER(uart, ETBEI); | 106 | UART_SET_IER(uart, ETBEI); |
@@ -209,34 +192,27 @@ int kgdb_get_debug_char(void) | |||
209 | } | 192 | } |
210 | #endif | 193 | #endif |
211 | 194 | ||
212 | #ifdef CONFIG_SERIAL_BFIN_PIO | 195 | #if ANOMALY_05000230 && defined(CONFIG_SERIAL_BFIN_PIO) |
213 | static void local_put_char(struct bfin_serial_port *uart, char ch) | 196 | # define UART_GET_ANOMALY_THRESHOLD(uart) ((uart)->anomaly_threshold) |
214 | { | 197 | # define UART_SET_ANOMALY_THRESHOLD(uart, v) ((uart)->anomaly_threshold = (v)) |
215 | unsigned short status; | 198 | #else |
216 | int flags = 0; | 199 | # define UART_GET_ANOMALY_THRESHOLD(uart) 0 |
217 | 200 | # define UART_SET_ANOMALY_THRESHOLD(uart, v) | |
218 | spin_lock_irqsave(&uart->port.lock, flags); | 201 | #endif |
219 | |||
220 | do { | ||
221 | status = UART_GET_LSR(uart); | ||
222 | } while (!(status & THRE)); | ||
223 | |||
224 | UART_PUT_CHAR(uart, ch); | ||
225 | SSYNC(); | ||
226 | |||
227 | spin_unlock_irqrestore(&uart->port.lock, flags); | ||
228 | } | ||
229 | 202 | ||
203 | #ifdef CONFIG_SERIAL_BFIN_PIO | ||
230 | static void bfin_serial_rx_chars(struct bfin_serial_port *uart) | 204 | static void bfin_serial_rx_chars(struct bfin_serial_port *uart) |
231 | { | 205 | { |
232 | struct tty_struct *tty = uart->port.info->tty; | 206 | struct tty_struct *tty = uart->port.info->tty; |
233 | unsigned int status, ch, flg; | 207 | unsigned int status, ch, flg; |
234 | static int in_break = 0; | 208 | static struct timeval anomaly_start = { .tv_sec = 0 }; |
235 | #ifdef CONFIG_KGDB_UART | 209 | #ifdef CONFIG_KGDB_UART |
236 | struct pt_regs *regs = get_irq_regs(); | 210 | struct pt_regs *regs = get_irq_regs(); |
237 | #endif | 211 | #endif |
238 | 212 | ||
239 | status = UART_GET_LSR(uart); | 213 | status = UART_GET_LSR(uart); |
214 | UART_CLEAR_LSR(uart); | ||
215 | |||
240 | ch = UART_GET_CHAR(uart); | 216 | ch = UART_GET_CHAR(uart); |
241 | uart->port.icount.rx++; | 217 | uart->port.icount.rx++; |
242 | 218 | ||
@@ -262,28 +238,56 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart) | |||
262 | #endif | 238 | #endif |
263 | 239 | ||
264 | if (ANOMALY_05000230) { | 240 | if (ANOMALY_05000230) { |
265 | /* The BF533 family of processors have a nice misbehavior where | 241 | /* The BF533 (and BF561) family of processors have a nice anomaly |
266 | * they continuously generate characters for a "single" break. | 242 | * where they continuously generate characters for a "single" break. |
267 | * We have to basically ignore this flood until the "next" valid | 243 | * We have to basically ignore this flood until the "next" valid |
268 | * character comes across. All other Blackfin families operate | 244 | * character comes across. Due to the nature of the flood, it is |
269 | * properly though. | 245 | * not possible to reliably catch bytes that are sent too quickly |
246 | * after this break. So application code talking to the Blackfin | ||
247 | * which sends a break signal must allow at least 1.5 character | ||
248 | * times after the end of the break for things to stabilize. This | ||
249 | * timeout was picked as it must absolutely be larger than 1 | ||
250 | * character time +/- some percent. So 1.5 sounds good. All other | ||
251 | * Blackfin families operate properly. Woo. | ||
270 | * Note: While Anomaly 05000230 does not directly address this, | 252 | * Note: While Anomaly 05000230 does not directly address this, |
271 | * the changes that went in for it also fixed this issue. | 253 | * the changes that went in for it also fixed this issue. |
254 | * That anomaly was fixed in 0.5+ silicon. I like bunnies. | ||
272 | */ | 255 | */ |
273 | if (in_break) { | 256 | if (anomaly_start.tv_sec) { |
274 | if (ch != 0) { | 257 | struct timeval curr; |
275 | in_break = 0; | 258 | suseconds_t usecs; |
276 | ch = UART_GET_CHAR(uart); | 259 | |
277 | if (bfin_revid() < 5) | 260 | if ((~ch & (~ch + 1)) & 0xff) |
278 | return; | 261 | goto known_good_char; |
279 | } else | 262 | |
280 | return; | 263 | do_gettimeofday(&curr); |
264 | if (curr.tv_sec - anomaly_start.tv_sec > 1) | ||
265 | goto known_good_char; | ||
266 | |||
267 | usecs = 0; | ||
268 | if (curr.tv_sec != anomaly_start.tv_sec) | ||
269 | usecs += USEC_PER_SEC; | ||
270 | usecs += curr.tv_usec - anomaly_start.tv_usec; | ||
271 | |||
272 | if (usecs > UART_GET_ANOMALY_THRESHOLD(uart)) | ||
273 | goto known_good_char; | ||
274 | |||
275 | if (ch) | ||
276 | anomaly_start.tv_sec = 0; | ||
277 | else | ||
278 | anomaly_start = curr; | ||
279 | |||
280 | return; | ||
281 | |||
282 | known_good_char: | ||
283 | anomaly_start.tv_sec = 0; | ||
281 | } | 284 | } |
282 | } | 285 | } |
283 | 286 | ||
284 | if (status & BI) { | 287 | if (status & BI) { |
285 | if (ANOMALY_05000230) | 288 | if (ANOMALY_05000230) |
286 | in_break = 1; | 289 | if (bfin_revid() < 5) |
290 | do_gettimeofday(&anomaly_start); | ||
287 | uart->port.icount.brk++; | 291 | uart->port.icount.brk++; |
288 | if (uart_handle_break(&uart->port)) | 292 | if (uart_handle_break(&uart->port)) |
289 | goto ignore_char; | 293 | goto ignore_char; |
@@ -324,7 +328,6 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart) | |||
324 | UART_PUT_CHAR(uart, uart->port.x_char); | 328 | UART_PUT_CHAR(uart, uart->port.x_char); |
325 | uart->port.icount.tx++; | 329 | uart->port.icount.tx++; |
326 | uart->port.x_char = 0; | 330 | uart->port.x_char = 0; |
327 | return; | ||
328 | } | 331 | } |
329 | /* | 332 | /* |
330 | * Check the modem control lines before | 333 | * Check the modem control lines before |
@@ -337,9 +340,12 @@ static void bfin_serial_tx_chars(struct bfin_serial_port *uart) | |||
337 | return; | 340 | return; |
338 | } | 341 | } |
339 | 342 | ||
340 | local_put_char(uart, xmit->buf[xmit->tail]); | 343 | while ((UART_GET_LSR(uart) & THRE) && xmit->tail != xmit->head) { |
341 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); | 344 | UART_PUT_CHAR(uart, xmit->buf[xmit->tail]); |
342 | uart->port.icount.tx++; | 345 | xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); |
346 | uart->port.icount.tx++; | ||
347 | SSYNC(); | ||
348 | } | ||
343 | 349 | ||
344 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 350 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
345 | uart_write_wakeup(&uart->port); | 351 | uart_write_wakeup(&uart->port); |
@@ -352,21 +358,11 @@ static irqreturn_t bfin_serial_rx_int(int irq, void *dev_id) | |||
352 | { | 358 | { |
353 | struct bfin_serial_port *uart = dev_id; | 359 | struct bfin_serial_port *uart = dev_id; |
354 | 360 | ||
355 | #ifdef CONFIG_BF54x | ||
356 | unsigned short status; | ||
357 | spin_lock(&uart->port.lock); | ||
358 | status = UART_GET_LSR(uart); | ||
359 | while ((UART_GET_IER(uart) & ERBFI) && (status & DR)) { | ||
360 | bfin_serial_rx_chars(uart); | ||
361 | status = UART_GET_LSR(uart); | ||
362 | } | ||
363 | spin_unlock(&uart->port.lock); | ||
364 | #else | ||
365 | spin_lock(&uart->port.lock); | 361 | spin_lock(&uart->port.lock); |
366 | while ((UART_GET_IIR(uart) & IIR_STATUS) == IIR_RX_READY) | 362 | while (UART_GET_LSR(uart) & DR) |
367 | bfin_serial_rx_chars(uart); | 363 | bfin_serial_rx_chars(uart); |
368 | spin_unlock(&uart->port.lock); | 364 | spin_unlock(&uart->port.lock); |
369 | #endif | 365 | |
370 | return IRQ_HANDLED; | 366 | return IRQ_HANDLED; |
371 | } | 367 | } |
372 | 368 | ||
@@ -374,25 +370,16 @@ static irqreturn_t bfin_serial_tx_int(int irq, void *dev_id) | |||
374 | { | 370 | { |
375 | struct bfin_serial_port *uart = dev_id; | 371 | struct bfin_serial_port *uart = dev_id; |
376 | 372 | ||
377 | #ifdef CONFIG_BF54x | ||
378 | unsigned short status; | ||
379 | spin_lock(&uart->port.lock); | 373 | spin_lock(&uart->port.lock); |
380 | status = UART_GET_LSR(uart); | 374 | if (UART_GET_LSR(uart) & THRE) |
381 | while ((UART_GET_IER(uart) & ETBEI) && (status & THRE)) { | ||
382 | bfin_serial_tx_chars(uart); | 375 | bfin_serial_tx_chars(uart); |
383 | status = UART_GET_LSR(uart); | ||
384 | } | ||
385 | spin_unlock(&uart->port.lock); | 376 | spin_unlock(&uart->port.lock); |
386 | #else | 377 | |
387 | spin_lock(&uart->port.lock); | ||
388 | while ((UART_GET_IIR(uart) & IIR_STATUS) == IIR_TX_READY) | ||
389 | bfin_serial_tx_chars(uart); | ||
390 | spin_unlock(&uart->port.lock); | ||
391 | #endif | ||
392 | return IRQ_HANDLED; | 378 | return IRQ_HANDLED; |
393 | } | 379 | } |
380 | #endif | ||
394 | 381 | ||
395 | 382 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | |
396 | static void bfin_serial_do_work(struct work_struct *work) | 383 | static void bfin_serial_do_work(struct work_struct *work) |
397 | { | 384 | { |
398 | struct bfin_serial_port *uart = container_of(work, struct bfin_serial_port, cts_workqueue); | 385 | struct bfin_serial_port *uart = container_of(work, struct bfin_serial_port, cts_workqueue); |
@@ -406,33 +393,27 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) | |||
406 | { | 393 | { |
407 | struct circ_buf *xmit = &uart->port.info->xmit; | 394 | struct circ_buf *xmit = &uart->port.info->xmit; |
408 | unsigned short ier; | 395 | unsigned short ier; |
409 | int flags = 0; | ||
410 | |||
411 | if (!uart->tx_done) | ||
412 | return; | ||
413 | 396 | ||
414 | uart->tx_done = 0; | 397 | uart->tx_done = 0; |
415 | 398 | ||
399 | if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) { | ||
400 | uart->tx_count = 0; | ||
401 | uart->tx_done = 1; | ||
402 | return; | ||
403 | } | ||
404 | |||
416 | if (uart->port.x_char) { | 405 | if (uart->port.x_char) { |
417 | UART_PUT_CHAR(uart, uart->port.x_char); | 406 | UART_PUT_CHAR(uart, uart->port.x_char); |
418 | uart->port.icount.tx++; | 407 | uart->port.icount.tx++; |
419 | uart->port.x_char = 0; | 408 | uart->port.x_char = 0; |
420 | uart->tx_done = 1; | ||
421 | return; | ||
422 | } | 409 | } |
410 | |||
423 | /* | 411 | /* |
424 | * Check the modem control lines before | 412 | * Check the modem control lines before |
425 | * transmitting anything. | 413 | * transmitting anything. |
426 | */ | 414 | */ |
427 | bfin_serial_mctrl_check(uart); | 415 | bfin_serial_mctrl_check(uart); |
428 | 416 | ||
429 | if (uart_circ_empty(xmit) || uart_tx_stopped(&uart->port)) { | ||
430 | bfin_serial_stop_tx(&uart->port); | ||
431 | uart->tx_done = 1; | ||
432 | return; | ||
433 | } | ||
434 | |||
435 | spin_lock_irqsave(&uart->port.lock, flags); | ||
436 | uart->tx_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE); | 417 | uart->tx_count = CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE); |
437 | if (uart->tx_count > (UART_XMIT_SIZE - xmit->tail)) | 418 | if (uart->tx_count > (UART_XMIT_SIZE - xmit->tail)) |
438 | uart->tx_count = UART_XMIT_SIZE - xmit->tail; | 419 | uart->tx_count = UART_XMIT_SIZE - xmit->tail; |
@@ -448,6 +429,7 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) | |||
448 | set_dma_x_count(uart->tx_dma_channel, uart->tx_count); | 429 | set_dma_x_count(uart->tx_dma_channel, uart->tx_count); |
449 | set_dma_x_modify(uart->tx_dma_channel, 1); | 430 | set_dma_x_modify(uart->tx_dma_channel, 1); |
450 | enable_dma(uart->tx_dma_channel); | 431 | enable_dma(uart->tx_dma_channel); |
432 | |||
451 | #ifdef CONFIG_BF54x | 433 | #ifdef CONFIG_BF54x |
452 | UART_SET_IER(uart, ETBEI); | 434 | UART_SET_IER(uart, ETBEI); |
453 | #else | 435 | #else |
@@ -455,7 +437,6 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) | |||
455 | ier |= ETBEI; | 437 | ier |= ETBEI; |
456 | UART_PUT_IER(uart, ier); | 438 | UART_PUT_IER(uart, ier); |
457 | #endif | 439 | #endif |
458 | spin_unlock_irqrestore(&uart->port.lock, flags); | ||
459 | } | 440 | } |
460 | 441 | ||
461 | static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart) | 442 | static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart) |
@@ -464,7 +445,11 @@ static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart) | |||
464 | int i, flg, status; | 445 | int i, flg, status; |
465 | 446 | ||
466 | status = UART_GET_LSR(uart); | 447 | status = UART_GET_LSR(uart); |
467 | uart->port.icount.rx += CIRC_CNT(uart->rx_dma_buf.head, uart->rx_dma_buf.tail, UART_XMIT_SIZE);; | 448 | UART_CLEAR_LSR(uart); |
449 | |||
450 | uart->port.icount.rx += | ||
451 | CIRC_CNT(uart->rx_dma_buf.head, uart->rx_dma_buf.tail, | ||
452 | UART_XMIT_SIZE); | ||
468 | 453 | ||
469 | if (status & BI) { | 454 | if (status & BI) { |
470 | uart->port.icount.brk++; | 455 | uart->port.icount.brk++; |
@@ -490,10 +475,12 @@ static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart) | |||
490 | else | 475 | else |
491 | flg = TTY_NORMAL; | 476 | flg = TTY_NORMAL; |
492 | 477 | ||
493 | for (i = uart->rx_dma_buf.head; i < uart->rx_dma_buf.tail; i++) { | 478 | for (i = uart->rx_dma_buf.tail; i != uart->rx_dma_buf.head; i++) { |
494 | if (uart_handle_sysrq_char(&uart->port, uart->rx_dma_buf.buf[i])) | 479 | if (i >= UART_XMIT_SIZE) |
495 | goto dma_ignore_char; | 480 | i = 0; |
496 | uart_insert_char(&uart->port, status, OE, uart->rx_dma_buf.buf[i], flg); | 481 | if (!uart_handle_sysrq_char(&uart->port, uart->rx_dma_buf.buf[i])) |
482 | uart_insert_char(&uart->port, status, OE, | ||
483 | uart->rx_dma_buf.buf[i], flg); | ||
497 | } | 484 | } |
498 | 485 | ||
499 | dma_ignore_char: | 486 | dma_ignore_char: |
@@ -503,23 +490,23 @@ static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart) | |||
503 | void bfin_serial_rx_dma_timeout(struct bfin_serial_port *uart) | 490 | void bfin_serial_rx_dma_timeout(struct bfin_serial_port *uart) |
504 | { | 491 | { |
505 | int x_pos, pos; | 492 | int x_pos, pos; |
506 | int flags = 0; | ||
507 | |||
508 | bfin_serial_dma_tx_chars(uart); | ||
509 | 493 | ||
510 | spin_lock_irqsave(&uart->port.lock, flags); | 494 | uart->rx_dma_nrows = get_dma_curr_ycount(uart->rx_dma_channel); |
511 | x_pos = DMA_RX_XCOUNT - get_dma_curr_xcount(uart->rx_dma_channel); | 495 | x_pos = get_dma_curr_xcount(uart->rx_dma_channel); |
496 | uart->rx_dma_nrows = DMA_RX_YCOUNT - uart->rx_dma_nrows; | ||
497 | if (uart->rx_dma_nrows == DMA_RX_YCOUNT) | ||
498 | uart->rx_dma_nrows = 0; | ||
499 | x_pos = DMA_RX_XCOUNT - x_pos; | ||
512 | if (x_pos == DMA_RX_XCOUNT) | 500 | if (x_pos == DMA_RX_XCOUNT) |
513 | x_pos = 0; | 501 | x_pos = 0; |
514 | 502 | ||
515 | pos = uart->rx_dma_nrows * DMA_RX_XCOUNT + x_pos; | 503 | pos = uart->rx_dma_nrows * DMA_RX_XCOUNT + x_pos; |
516 | 504 | if (pos != uart->rx_dma_buf.tail) { | |
517 | if (pos>uart->rx_dma_buf.tail) { | 505 | uart->rx_dma_buf.head = pos; |
518 | uart->rx_dma_buf.tail = pos; | ||
519 | bfin_serial_dma_rx_chars(uart); | 506 | bfin_serial_dma_rx_chars(uart); |
520 | uart->rx_dma_buf.head = uart->rx_dma_buf.tail; | 507 | uart->rx_dma_buf.tail = uart->rx_dma_buf.head; |
521 | } | 508 | } |
522 | spin_unlock_irqrestore(&uart->port.lock, flags); | 509 | |
523 | uart->rx_dma_timer.expires = jiffies + DMA_RX_FLUSH_JIFFIES; | 510 | uart->rx_dma_timer.expires = jiffies + DMA_RX_FLUSH_JIFFIES; |
524 | add_timer(&(uart->rx_dma_timer)); | 511 | add_timer(&(uart->rx_dma_timer)); |
525 | } | 512 | } |
@@ -532,8 +519,8 @@ static irqreturn_t bfin_serial_dma_tx_int(int irq, void *dev_id) | |||
532 | 519 | ||
533 | spin_lock(&uart->port.lock); | 520 | spin_lock(&uart->port.lock); |
534 | if (!(get_dma_curr_irqstat(uart->tx_dma_channel)&DMA_RUN)) { | 521 | if (!(get_dma_curr_irqstat(uart->tx_dma_channel)&DMA_RUN)) { |
535 | clear_dma_irqstat(uart->tx_dma_channel); | ||
536 | disable_dma(uart->tx_dma_channel); | 522 | disable_dma(uart->tx_dma_channel); |
523 | clear_dma_irqstat(uart->tx_dma_channel); | ||
537 | #ifdef CONFIG_BF54x | 524 | #ifdef CONFIG_BF54x |
538 | UART_CLEAR_IER(uart, ETBEI); | 525 | UART_CLEAR_IER(uart, ETBEI); |
539 | #else | 526 | #else |
@@ -541,15 +528,13 @@ static irqreturn_t bfin_serial_dma_tx_int(int irq, void *dev_id) | |||
541 | ier &= ~ETBEI; | 528 | ier &= ~ETBEI; |
542 | UART_PUT_IER(uart, ier); | 529 | UART_PUT_IER(uart, ier); |
543 | #endif | 530 | #endif |
544 | xmit->tail = (xmit->tail+uart->tx_count) &(UART_XMIT_SIZE -1); | 531 | xmit->tail = (xmit->tail + uart->tx_count) & (UART_XMIT_SIZE - 1); |
545 | uart->port.icount.tx+=uart->tx_count; | 532 | uart->port.icount.tx += uart->tx_count; |
546 | 533 | ||
547 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) | 534 | if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) |
548 | uart_write_wakeup(&uart->port); | 535 | uart_write_wakeup(&uart->port); |
549 | 536 | ||
550 | if (uart_circ_empty(xmit)) | 537 | bfin_serial_dma_tx_chars(uart); |
551 | bfin_serial_stop_tx(&uart->port); | ||
552 | uart->tx_done = 1; | ||
553 | } | 538 | } |
554 | 539 | ||
555 | spin_unlock(&uart->port.lock); | 540 | spin_unlock(&uart->port.lock); |
@@ -561,18 +546,15 @@ static irqreturn_t bfin_serial_dma_rx_int(int irq, void *dev_id) | |||
561 | struct bfin_serial_port *uart = dev_id; | 546 | struct bfin_serial_port *uart = dev_id; |
562 | unsigned short irqstat; | 547 | unsigned short irqstat; |
563 | 548 | ||
564 | uart->rx_dma_nrows++; | ||
565 | if (uart->rx_dma_nrows == DMA_RX_YCOUNT) { | ||
566 | uart->rx_dma_nrows = 0; | ||
567 | uart->rx_dma_buf.tail = DMA_RX_XCOUNT*DMA_RX_YCOUNT; | ||
568 | bfin_serial_dma_rx_chars(uart); | ||
569 | uart->rx_dma_buf.head = uart->rx_dma_buf.tail = 0; | ||
570 | } | ||
571 | spin_lock(&uart->port.lock); | 549 | spin_lock(&uart->port.lock); |
572 | irqstat = get_dma_curr_irqstat(uart->rx_dma_channel); | 550 | irqstat = get_dma_curr_irqstat(uart->rx_dma_channel); |
573 | clear_dma_irqstat(uart->rx_dma_channel); | 551 | clear_dma_irqstat(uart->rx_dma_channel); |
574 | |||
575 | spin_unlock(&uart->port.lock); | 552 | spin_unlock(&uart->port.lock); |
553 | |||
554 | del_timer(&(uart->rx_dma_timer)); | ||
555 | uart->rx_dma_timer.expires = jiffies; | ||
556 | add_timer(&(uart->rx_dma_timer)); | ||
557 | |||
576 | return IRQ_HANDLED; | 558 | return IRQ_HANDLED; |
577 | } | 559 | } |
578 | #endif | 560 | #endif |
@@ -599,7 +581,11 @@ static unsigned int bfin_serial_get_mctrl(struct uart_port *port) | |||
599 | if (uart->cts_pin < 0) | 581 | if (uart->cts_pin < 0) |
600 | return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR; | 582 | return TIOCM_CTS | TIOCM_DSR | TIOCM_CAR; |
601 | 583 | ||
584 | # ifdef BF54x | ||
585 | if (UART_GET_MSR(uart) & CTS) | ||
586 | # else | ||
602 | if (gpio_get_value(uart->cts_pin)) | 587 | if (gpio_get_value(uart->cts_pin)) |
588 | # endif | ||
603 | return TIOCM_DSR | TIOCM_CAR; | 589 | return TIOCM_DSR | TIOCM_CAR; |
604 | else | 590 | else |
605 | #endif | 591 | #endif |
@@ -614,9 +600,17 @@ static void bfin_serial_set_mctrl(struct uart_port *port, unsigned int mctrl) | |||
614 | return; | 600 | return; |
615 | 601 | ||
616 | if (mctrl & TIOCM_RTS) | 602 | if (mctrl & TIOCM_RTS) |
603 | # ifdef BF54x | ||
604 | UART_PUT_MCR(uart, UART_GET_MCR(uart) & ~MRTS); | ||
605 | # else | ||
617 | gpio_set_value(uart->rts_pin, 0); | 606 | gpio_set_value(uart->rts_pin, 0); |
607 | # endif | ||
618 | else | 608 | else |
609 | # ifdef BF54x | ||
610 | UART_PUT_MCR(uart, UART_GET_MCR(uart) | MRTS); | ||
611 | # else | ||
619 | gpio_set_value(uart->rts_pin, 1); | 612 | gpio_set_value(uart->rts_pin, 1); |
613 | # endif | ||
620 | #endif | 614 | #endif |
621 | } | 615 | } |
622 | 616 | ||
@@ -627,22 +621,17 @@ static void bfin_serial_mctrl_check(struct bfin_serial_port *uart) | |||
627 | { | 621 | { |
628 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | 622 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS |
629 | unsigned int status; | 623 | unsigned int status; |
630 | # ifdef CONFIG_SERIAL_BFIN_DMA | ||
631 | struct uart_info *info = uart->port.info; | 624 | struct uart_info *info = uart->port.info; |
632 | struct tty_struct *tty = info->tty; | 625 | struct tty_struct *tty = info->tty; |
633 | 626 | ||
634 | status = bfin_serial_get_mctrl(&uart->port); | 627 | status = bfin_serial_get_mctrl(&uart->port); |
628 | uart_handle_cts_change(&uart->port, status & TIOCM_CTS); | ||
635 | if (!(status & TIOCM_CTS)) { | 629 | if (!(status & TIOCM_CTS)) { |
636 | tty->hw_stopped = 1; | 630 | tty->hw_stopped = 1; |
631 | schedule_work(&uart->cts_workqueue); | ||
637 | } else { | 632 | } else { |
638 | tty->hw_stopped = 0; | 633 | tty->hw_stopped = 0; |
639 | } | 634 | } |
640 | # else | ||
641 | status = bfin_serial_get_mctrl(&uart->port); | ||
642 | uart_handle_cts_change(&uart->port, status & TIOCM_CTS); | ||
643 | if (!(status & TIOCM_CTS)) | ||
644 | schedule_work(&uart->cts_workqueue); | ||
645 | # endif | ||
646 | #endif | 635 | #endif |
647 | } | 636 | } |
648 | 637 | ||
@@ -743,6 +732,7 @@ static void bfin_serial_shutdown(struct uart_port *port) | |||
743 | disable_dma(uart->rx_dma_channel); | 732 | disable_dma(uart->rx_dma_channel); |
744 | free_dma(uart->rx_dma_channel); | 733 | free_dma(uart->rx_dma_channel); |
745 | del_timer(&(uart->rx_dma_timer)); | 734 | del_timer(&(uart->rx_dma_timer)); |
735 | dma_free_coherent(NULL, PAGE_SIZE, uart->rx_dma_buf.buf, 0); | ||
746 | #else | 736 | #else |
747 | #ifdef CONFIG_KGDB_UART | 737 | #ifdef CONFIG_KGDB_UART |
748 | if (uart->port.line != CONFIG_KGDB_UART_PORT) | 738 | if (uart->port.line != CONFIG_KGDB_UART_PORT) |
@@ -814,6 +804,8 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios, | |||
814 | quot = uart_get_divisor(port, baud); | 804 | quot = uart_get_divisor(port, baud); |
815 | spin_lock_irqsave(&uart->port.lock, flags); | 805 | spin_lock_irqsave(&uart->port.lock, flags); |
816 | 806 | ||
807 | UART_SET_ANOMALY_THRESHOLD(uart, USEC_PER_SEC / baud * 15); | ||
808 | |||
817 | do { | 809 | do { |
818 | lsr = UART_GET_LSR(uart); | 810 | lsr = UART_GET_LSR(uart); |
819 | } while (!(lsr & TEMT)); | 811 | } while (!(lsr & TEMT)); |
@@ -956,10 +948,9 @@ static void __init bfin_serial_init_ports(void) | |||
956 | bfin_serial_ports[i].rx_dma_channel = | 948 | bfin_serial_ports[i].rx_dma_channel = |
957 | bfin_serial_resource[i].uart_rx_dma_channel; | 949 | bfin_serial_resource[i].uart_rx_dma_channel; |
958 | init_timer(&(bfin_serial_ports[i].rx_dma_timer)); | 950 | init_timer(&(bfin_serial_ports[i].rx_dma_timer)); |
959 | #else | ||
960 | INIT_WORK(&bfin_serial_ports[i].cts_workqueue, bfin_serial_do_work); | ||
961 | #endif | 951 | #endif |
962 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | 952 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS |
953 | INIT_WORK(&bfin_serial_ports[i].cts_workqueue, bfin_serial_do_work); | ||
963 | bfin_serial_ports[i].cts_pin = | 954 | bfin_serial_ports[i].cts_pin = |
964 | bfin_serial_resource[i].uart_cts_pin; | 955 | bfin_serial_resource[i].uart_cts_pin; |
965 | bfin_serial_ports[i].rts_pin = | 956 | bfin_serial_ports[i].rts_pin = |
diff --git a/drivers/serial/m32r_sio.c b/drivers/serial/m32r_sio.c index 348ee2c19b58..c2bb11c02bde 100644 --- a/drivers/serial/m32r_sio.c +++ b/drivers/serial/m32r_sio.c | |||
@@ -421,7 +421,7 @@ static void transmit_chars(struct uart_sio_port *up) | |||
421 | up->port.icount.tx++; | 421 | up->port.icount.tx++; |
422 | if (uart_circ_empty(xmit)) | 422 | if (uart_circ_empty(xmit)) |
423 | break; | 423 | break; |
424 | while (!serial_in(up, UART_LSR) & UART_LSR_THRE); | 424 | while (!(serial_in(up, UART_LSR) & UART_LSR_THRE)); |
425 | 425 | ||
426 | } while (--count > 0); | 426 | } while (--count > 0); |
427 | 427 | ||
diff --git a/drivers/serial/of_serial.c b/drivers/serial/of_serial.c index a64d85821996..c0e50a461055 100644 --- a/drivers/serial/of_serial.c +++ b/drivers/serial/of_serial.c | |||
@@ -138,7 +138,7 @@ static struct of_device_id __devinitdata of_platform_serial_table[] = { | |||
138 | { /* end of list */ }, | 138 | { /* end of list */ }, |
139 | }; | 139 | }; |
140 | 140 | ||
141 | static struct of_platform_driver __devinitdata of_platform_serial_driver = { | 141 | static struct of_platform_driver of_platform_serial_driver = { |
142 | .owner = THIS_MODULE, | 142 | .owner = THIS_MODULE, |
143 | .name = "of_serial", | 143 | .name = "of_serial", |
144 | .probe = of_platform_serial_probe, | 144 | .probe = of_platform_serial_probe, |
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 9ce12cb2cebc..a8c116b80bff 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/delay.h> | 41 | #include <linux/delay.h> |
42 | #include <linux/console.h> | 42 | #include <linux/console.h> |
43 | #include <linux/platform_device.h> | 43 | #include <linux/platform_device.h> |
44 | #include <linux/serial_sci.h> | ||
44 | 45 | ||
45 | #ifdef CONFIG_CPU_FREQ | 46 | #ifdef CONFIG_CPU_FREQ |
46 | #include <linux/notifier.h> | 47 | #include <linux/notifier.h> |
@@ -54,7 +55,6 @@ | |||
54 | #include <asm/kgdb.h> | 55 | #include <asm/kgdb.h> |
55 | #endif | 56 | #endif |
56 | 57 | ||
57 | #include <asm/sci.h> | ||
58 | #include "sh-sci.h" | 58 | #include "sh-sci.h" |
59 | 59 | ||
60 | struct sci_port { | 60 | struct sci_port { |
diff --git a/drivers/sh/maple/maple.c b/drivers/sh/maple/maple.c index 9cfcfd8dad5e..617efb1640b1 100644 --- a/drivers/sh/maple/maple.c +++ b/drivers/sh/maple/maple.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Core maple bus functionality | 2 | * Core maple bus functionality |
3 | * | 3 | * |
4 | * Copyright (C) 2007 Adrian McMenamin | 4 | * Copyright (C) 2007, 2008 Adrian McMenamin |
5 | * | 5 | * |
6 | * Based on 2.4 code by: | 6 | * Based on 2.4 code by: |
7 | * | 7 | * |
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
20 | #include <linux/device.h> | 20 | #include <linux/device.h> |
21 | #include <linux/module.h> | ||
22 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
23 | #include <linux/list.h> | 22 | #include <linux/list.h> |
24 | #include <linux/io.h> | 23 | #include <linux/io.h> |
@@ -54,7 +53,7 @@ static struct device maple_bus; | |||
54 | static int subdevice_map[MAPLE_PORTS]; | 53 | static int subdevice_map[MAPLE_PORTS]; |
55 | static unsigned long *maple_sendbuf, *maple_sendptr, *maple_lastptr; | 54 | static unsigned long *maple_sendbuf, *maple_sendptr, *maple_lastptr; |
56 | static unsigned long maple_pnp_time; | 55 | static unsigned long maple_pnp_time; |
57 | static int started, scanning, liststatus, realscan; | 56 | static int started, scanning, liststatus, fullscan; |
58 | static struct kmem_cache *maple_queue_cache; | 57 | static struct kmem_cache *maple_queue_cache; |
59 | 58 | ||
60 | struct maple_device_specify { | 59 | struct maple_device_specify { |
@@ -62,6 +61,9 @@ struct maple_device_specify { | |||
62 | int unit; | 61 | int unit; |
63 | }; | 62 | }; |
64 | 63 | ||
64 | static bool checked[4]; | ||
65 | static struct maple_device *baseunits[4]; | ||
66 | |||
65 | /** | 67 | /** |
66 | * maple_driver_register - register a device driver | 68 | * maple_driver_register - register a device driver |
67 | * automatically makes the driver bus a maple bus | 69 | * automatically makes the driver bus a maple bus |
@@ -309,11 +311,9 @@ static void maple_attach_driver(struct maple_device *mdev) | |||
309 | else | 311 | else |
310 | break; | 312 | break; |
311 | 313 | ||
312 | if (realscan) { | 314 | printk(KERN_INFO "Maple device detected: %s\n", |
313 | printk(KERN_INFO "Maple device detected: %s\n", | 315 | mdev->product_name); |
314 | mdev->product_name); | 316 | printk(KERN_INFO "Maple device: %s\n", mdev->product_licence); |
315 | printk(KERN_INFO "Maple device: %s\n", mdev->product_licence); | ||
316 | } | ||
317 | 317 | ||
318 | function = be32_to_cpu(mdev->devinfo.function); | 318 | function = be32_to_cpu(mdev->devinfo.function); |
319 | 319 | ||
@@ -323,10 +323,9 @@ static void maple_attach_driver(struct maple_device *mdev) | |||
323 | mdev->driver = &maple_dummy_driver; | 323 | mdev->driver = &maple_dummy_driver; |
324 | sprintf(mdev->dev.bus_id, "%d:0.port", mdev->port); | 324 | sprintf(mdev->dev.bus_id, "%d:0.port", mdev->port); |
325 | } else { | 325 | } else { |
326 | if (realscan) | 326 | printk(KERN_INFO |
327 | printk(KERN_INFO | 327 | "Maple bus at (%d, %d): Function 0x%lX\n", |
328 | "Maple bus at (%d, %d): Function 0x%lX\n", | 328 | mdev->port, mdev->unit, function); |
329 | mdev->port, mdev->unit, function); | ||
330 | 329 | ||
331 | matched = | 330 | matched = |
332 | bus_for_each_drv(&maple_bus_type, NULL, mdev, | 331 | bus_for_each_drv(&maple_bus_type, NULL, mdev, |
@@ -334,9 +333,8 @@ static void maple_attach_driver(struct maple_device *mdev) | |||
334 | 333 | ||
335 | if (matched == 0) { | 334 | if (matched == 0) { |
336 | /* Driver does not exist yet */ | 335 | /* Driver does not exist yet */ |
337 | if (realscan) | 336 | printk(KERN_INFO |
338 | printk(KERN_INFO | 337 | "No maple driver found.\n"); |
339 | "No maple driver found.\n"); | ||
340 | mdev->driver = &maple_dummy_driver; | 338 | mdev->driver = &maple_dummy_driver; |
341 | } | 339 | } |
342 | sprintf(mdev->dev.bus_id, "%d:0%d.%lX", mdev->port, | 340 | sprintf(mdev->dev.bus_id, "%d:0%d.%lX", mdev->port, |
@@ -472,9 +470,12 @@ static void maple_response_none(struct maple_device *mdev, | |||
472 | maple_detach_driver(mdev); | 470 | maple_detach_driver(mdev); |
473 | return; | 471 | return; |
474 | } | 472 | } |
475 | if (!started) { | 473 | if (!started || !fullscan) { |
476 | printk(KERN_INFO "No maple devices attached to port %d\n", | 474 | if (checked[mdev->port] == false) { |
477 | mdev->port); | 475 | checked[mdev->port] = true; |
476 | printk(KERN_INFO "No maple devices attached" | ||
477 | " to port %d\n", mdev->port); | ||
478 | } | ||
478 | return; | 479 | return; |
479 | } | 480 | } |
480 | maple_clean_submap(mdev); | 481 | maple_clean_submap(mdev); |
@@ -485,8 +486,14 @@ static void maple_response_devinfo(struct maple_device *mdev, | |||
485 | char *recvbuf) | 486 | char *recvbuf) |
486 | { | 487 | { |
487 | char submask; | 488 | char submask; |
488 | if ((!started) || (scanning == 2)) { | 489 | if (!started || (scanning == 2) || !fullscan) { |
489 | maple_attach_driver(mdev); | 490 | if ((mdev->unit == 0) && (checked[mdev->port] == false)) { |
491 | checked[mdev->port] = true; | ||
492 | maple_attach_driver(mdev); | ||
493 | } else { | ||
494 | if (mdev->unit != 0) | ||
495 | maple_attach_driver(mdev); | ||
496 | } | ||
490 | return; | 497 | return; |
491 | } | 498 | } |
492 | if (mdev->unit == 0) { | 499 | if (mdev->unit == 0) { |
@@ -505,6 +512,7 @@ static void maple_dma_handler(struct work_struct *work) | |||
505 | struct maple_device *dev; | 512 | struct maple_device *dev; |
506 | char *recvbuf; | 513 | char *recvbuf; |
507 | enum maple_code code; | 514 | enum maple_code code; |
515 | int i; | ||
508 | 516 | ||
509 | if (!maple_dma_done()) | 517 | if (!maple_dma_done()) |
510 | return; | 518 | return; |
@@ -557,6 +565,19 @@ static void maple_dma_handler(struct work_struct *work) | |||
557 | } else | 565 | } else |
558 | scanning = 0; | 566 | scanning = 0; |
559 | 567 | ||
568 | if (!fullscan) { | ||
569 | fullscan = 1; | ||
570 | for (i = 0; i < MAPLE_PORTS; i++) { | ||
571 | if (checked[i] == false) { | ||
572 | fullscan = 0; | ||
573 | dev = baseunits[i]; | ||
574 | dev->mq->command = | ||
575 | MAPLE_COMMAND_DEVINFO; | ||
576 | dev->mq->length = 0; | ||
577 | maple_add_packet(dev->mq); | ||
578 | } | ||
579 | } | ||
580 | } | ||
560 | if (started == 0) | 581 | if (started == 0) |
561 | started = 1; | 582 | started = 1; |
562 | } | 583 | } |
@@ -694,7 +715,9 @@ static int __init maple_bus_init(void) | |||
694 | 715 | ||
695 | /* setup maple ports */ | 716 | /* setup maple ports */ |
696 | for (i = 0; i < MAPLE_PORTS; i++) { | 717 | for (i = 0; i < MAPLE_PORTS; i++) { |
718 | checked[i] = false; | ||
697 | mdev[i] = maple_alloc_dev(i, 0); | 719 | mdev[i] = maple_alloc_dev(i, 0); |
720 | baseunits[i] = mdev[i]; | ||
698 | if (!mdev[i]) { | 721 | if (!mdev[i]) { |
699 | while (i-- > 0) | 722 | while (i-- > 0) |
700 | maple_free_dev(mdev[i]); | 723 | maple_free_dev(mdev[i]); |
@@ -703,12 +726,9 @@ static int __init maple_bus_init(void) | |||
703 | mdev[i]->mq->command = MAPLE_COMMAND_DEVINFO; | 726 | mdev[i]->mq->command = MAPLE_COMMAND_DEVINFO; |
704 | mdev[i]->mq->length = 0; | 727 | mdev[i]->mq->length = 0; |
705 | maple_add_packet(mdev[i]->mq); | 728 | maple_add_packet(mdev[i]->mq); |
706 | /* delay aids hardware detection */ | ||
707 | mdelay(5); | ||
708 | subdevice_map[i] = 0; | 729 | subdevice_map[i] = 0; |
709 | } | 730 | } |
710 | 731 | ||
711 | realscan = 1; | ||
712 | /* setup maplebus hardware */ | 732 | /* setup maplebus hardware */ |
713 | maplebus_dma_reset(); | 733 | maplebus_dma_reset(); |
714 | /* initial detection */ | 734 | /* initial detection */ |
diff --git a/drivers/spi/au1550_spi.c b/drivers/spi/au1550_spi.c index c47a650183a1..41a3d00c4515 100644 --- a/drivers/spi/au1550_spi.c +++ b/drivers/spi/au1550_spi.c | |||
@@ -99,7 +99,7 @@ static dbdev_tab_t au1550_spi_mem_dbdev = | |||
99 | static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw); | 99 | static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw); |
100 | 100 | ||
101 | 101 | ||
102 | /** | 102 | /* |
103 | * compute BRG and DIV bits to setup spi clock based on main input clock rate | 103 | * compute BRG and DIV bits to setup spi clock based on main input clock rate |
104 | * that was specified in platform data structure | 104 | * that was specified in platform data structure |
105 | * according to au1550 datasheet: | 105 | * according to au1550 datasheet: |
@@ -650,7 +650,7 @@ static int au1550_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t) | |||
650 | return hw->txrx_bufs(spi, t); | 650 | return hw->txrx_bufs(spi, t); |
651 | } | 651 | } |
652 | 652 | ||
653 | static irqreturn_t au1550_spi_irq(int irq, void *dev, struct pt_regs *regs) | 653 | static irqreturn_t au1550_spi_irq(int irq, void *dev) |
654 | { | 654 | { |
655 | struct au1550_spi *hw = dev; | 655 | struct au1550_spi *hw = dev; |
656 | return hw->irq_callback(hw); | 656 | return hw->irq_callback(hw); |
diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c index 253ed5682a6d..a86315a0c5b8 100644 --- a/drivers/spi/mpc52xx_psc_spi.c +++ b/drivers/spi/mpc52xx_psc_spi.c | |||
@@ -42,6 +42,7 @@ struct mpc52xx_psc_spi { | |||
42 | 42 | ||
43 | /* driver internal data */ | 43 | /* driver internal data */ |
44 | struct mpc52xx_psc __iomem *psc; | 44 | struct mpc52xx_psc __iomem *psc; |
45 | struct mpc52xx_psc_fifo __iomem *fifo; | ||
45 | unsigned int irq; | 46 | unsigned int irq; |
46 | u8 bits_per_word; | 47 | u8 bits_per_word; |
47 | u8 busy; | 48 | u8 busy; |
@@ -139,6 +140,7 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi, | |||
139 | { | 140 | { |
140 | struct mpc52xx_psc_spi *mps = spi_master_get_devdata(spi->master); | 141 | struct mpc52xx_psc_spi *mps = spi_master_get_devdata(spi->master); |
141 | struct mpc52xx_psc __iomem *psc = mps->psc; | 142 | struct mpc52xx_psc __iomem *psc = mps->psc; |
143 | struct mpc52xx_psc_fifo __iomem *fifo = mps->fifo; | ||
142 | unsigned rb = 0; /* number of bytes receieved */ | 144 | unsigned rb = 0; /* number of bytes receieved */ |
143 | unsigned sb = 0; /* number of bytes sent */ | 145 | unsigned sb = 0; /* number of bytes sent */ |
144 | unsigned char *rx_buf = (unsigned char *)t->rx_buf; | 146 | unsigned char *rx_buf = (unsigned char *)t->rx_buf; |
@@ -190,11 +192,11 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi, | |||
190 | out_8(&psc->mode, 0); | 192 | out_8(&psc->mode, 0); |
191 | } else { | 193 | } else { |
192 | out_8(&psc->mode, MPC52xx_PSC_MODE_FFULL); | 194 | out_8(&psc->mode, MPC52xx_PSC_MODE_FFULL); |
193 | out_be16(&psc->rfalarm, rfalarm); | 195 | out_be16(&fifo->rfalarm, rfalarm); |
194 | } | 196 | } |
195 | out_be16(&psc->mpc52xx_psc_imr, MPC52xx_PSC_IMR_RXRDY); | 197 | out_be16(&psc->mpc52xx_psc_imr, MPC52xx_PSC_IMR_RXRDY); |
196 | wait_for_completion(&mps->done); | 198 | wait_for_completion(&mps->done); |
197 | recv_at_once = in_be16(&psc->rfnum); | 199 | recv_at_once = in_be16(&fifo->rfnum); |
198 | dev_dbg(&spi->dev, "%d bytes received\n", recv_at_once); | 200 | dev_dbg(&spi->dev, "%d bytes received\n", recv_at_once); |
199 | 201 | ||
200 | send_at_once = recv_at_once; | 202 | send_at_once = recv_at_once; |
@@ -331,6 +333,7 @@ static void mpc52xx_psc_spi_cleanup(struct spi_device *spi) | |||
331 | static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps) | 333 | static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps) |
332 | { | 334 | { |
333 | struct mpc52xx_psc __iomem *psc = mps->psc; | 335 | struct mpc52xx_psc __iomem *psc = mps->psc; |
336 | struct mpc52xx_psc_fifo __iomem *fifo = mps->fifo; | ||
334 | u32 mclken_div; | 337 | u32 mclken_div; |
335 | int ret = 0; | 338 | int ret = 0; |
336 | 339 | ||
@@ -346,7 +349,7 @@ static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps) | |||
346 | /* Disable interrupts, interrupts are based on alarm level */ | 349 | /* Disable interrupts, interrupts are based on alarm level */ |
347 | out_be16(&psc->mpc52xx_psc_imr, 0); | 350 | out_be16(&psc->mpc52xx_psc_imr, 0); |
348 | out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1); | 351 | out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1); |
349 | out_8(&psc->rfcntl, 0); | 352 | out_8(&fifo->rfcntl, 0); |
350 | out_8(&psc->mode, MPC52xx_PSC_MODE_FFULL); | 353 | out_8(&psc->mode, MPC52xx_PSC_MODE_FFULL); |
351 | 354 | ||
352 | /* Configure 8bit codec mode as a SPI master and use EOF flags */ | 355 | /* Configure 8bit codec mode as a SPI master and use EOF flags */ |
@@ -419,6 +422,8 @@ static int __init mpc52xx_psc_spi_do_probe(struct device *dev, u32 regaddr, | |||
419 | ret = -EFAULT; | 422 | ret = -EFAULT; |
420 | goto free_master; | 423 | goto free_master; |
421 | } | 424 | } |
425 | /* On the 5200, fifo regs are immediately ajacent to the psc regs */ | ||
426 | mps->fifo = ((void __iomem *)mps->psc) + sizeof(struct mpc52xx_psc); | ||
422 | 427 | ||
423 | ret = request_irq(mps->irq, mpc52xx_psc_spi_isr, 0, "mpc52xx-psc-spi", | 428 | ret = request_irq(mps->irq, mpc52xx_psc_spi_isr, 0, "mpc52xx-psc-spi", |
424 | mps); | 429 | mps); |
diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c index f7f8580edad8..71e881419cdd 100644 --- a/drivers/spi/spi_bitbang.c +++ b/drivers/spi/spi_bitbang.c | |||
@@ -344,12 +344,14 @@ static void bitbang_work(struct work_struct *work) | |||
344 | t->rx_dma = t->tx_dma = 0; | 344 | t->rx_dma = t->tx_dma = 0; |
345 | status = bitbang->txrx_bufs(spi, t); | 345 | status = bitbang->txrx_bufs(spi, t); |
346 | } | 346 | } |
347 | if (status > 0) | ||
348 | m->actual_length += status; | ||
347 | if (status != t->len) { | 349 | if (status != t->len) { |
348 | if (status > 0) | 350 | /* always report some kind of error */ |
349 | status = -EMSGSIZE; | 351 | if (status >= 0) |
352 | status = -EREMOTEIO; | ||
350 | break; | 353 | break; |
351 | } | 354 | } |
352 | m->actual_length += status; | ||
353 | status = 0; | 355 | status = 0; |
354 | 356 | ||
355 | /* protocol tweaks before next transfer */ | 357 | /* protocol tweaks before next transfer */ |
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig index 69f19f224875..3ab313ed441c 100644 --- a/drivers/thermal/Kconfig +++ b/drivers/thermal/Kconfig | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | menuconfig THERMAL | 5 | menuconfig THERMAL |
6 | bool "Generic Thermal sysfs driver" | 6 | bool "Generic Thermal sysfs driver" |
7 | select HWMON | ||
7 | default y | 8 | default y |
8 | help | 9 | help |
9 | Generic Thermal Sysfs driver offers a generic mechanism for | 10 | Generic Thermal Sysfs driver offers a generic mechanism for |
diff --git a/drivers/thermal/thermal.c b/drivers/thermal/thermal.c index 8b86e53ccf7a..41bd4c805ace 100644 --- a/drivers/thermal/thermal.c +++ b/drivers/thermal/thermal.c | |||
@@ -30,8 +30,10 @@ | |||
30 | #include <linux/idr.h> | 30 | #include <linux/idr.h> |
31 | #include <linux/thermal.h> | 31 | #include <linux/thermal.h> |
32 | #include <linux/spinlock.h> | 32 | #include <linux/spinlock.h> |
33 | #include <linux/hwmon.h> | ||
34 | #include <linux/hwmon-sysfs.h> | ||
33 | 35 | ||
34 | MODULE_AUTHOR("Zhang Rui") | 36 | MODULE_AUTHOR("Zhang Rui"); |
35 | MODULE_DESCRIPTION("Generic thermal management sysfs support"); | 37 | MODULE_DESCRIPTION("Generic thermal management sysfs support"); |
36 | MODULE_LICENSE("GPL"); | 38 | MODULE_LICENSE("GPL"); |
37 | 39 | ||
@@ -56,6 +58,9 @@ static LIST_HEAD(thermal_tz_list); | |||
56 | static LIST_HEAD(thermal_cdev_list); | 58 | static LIST_HEAD(thermal_cdev_list); |
57 | static DEFINE_MUTEX(thermal_list_lock); | 59 | static DEFINE_MUTEX(thermal_list_lock); |
58 | 60 | ||
61 | static struct device *thermal_hwmon; | ||
62 | #define MAX_THERMAL_ZONES 10 | ||
63 | |||
59 | static int get_idr(struct idr *idr, struct mutex *lock, int *id) | 64 | static int get_idr(struct idr *idr, struct mutex *lock, int *id) |
60 | { | 65 | { |
61 | int err; | 66 | int err; |
@@ -87,7 +92,67 @@ static void release_idr(struct idr *idr, struct mutex *lock, int id) | |||
87 | mutex_unlock(lock); | 92 | mutex_unlock(lock); |
88 | } | 93 | } |
89 | 94 | ||
90 | /* sys I/F for thermal zone */ | 95 | /* hwmon sys I/F*/ |
96 | static ssize_t | ||
97 | name_show(struct device *dev, struct device_attribute *attr, char *buf) | ||
98 | { | ||
99 | return sprintf(buf, "thermal_sys_class\n"); | ||
100 | } | ||
101 | |||
102 | static ssize_t | ||
103 | temp_input_show(struct device *dev, struct device_attribute *attr, char *buf) | ||
104 | { | ||
105 | struct thermal_zone_device *tz; | ||
106 | struct sensor_device_attribute *sensor_attr | ||
107 | = to_sensor_dev_attr(attr); | ||
108 | |||
109 | list_for_each_entry(tz, &thermal_tz_list, node) | ||
110 | if (tz->id == sensor_attr->index) | ||
111 | return tz->ops->get_temp(tz, buf); | ||
112 | |||
113 | return -ENODEV; | ||
114 | } | ||
115 | |||
116 | static ssize_t | ||
117 | temp_crit_show(struct device *dev, struct device_attribute *attr, | ||
118 | char *buf) | ||
119 | { | ||
120 | struct thermal_zone_device *tz; | ||
121 | struct sensor_device_attribute *sensor_attr | ||
122 | = to_sensor_dev_attr(attr); | ||
123 | |||
124 | list_for_each_entry(tz, &thermal_tz_list, node) | ||
125 | if (tz->id == sensor_attr->index) | ||
126 | return tz->ops->get_trip_temp(tz, 0, buf); | ||
127 | |||
128 | return -ENODEV; | ||
129 | } | ||
130 | |||
131 | static DEVICE_ATTR(name, 0444, name_show, NULL); | ||
132 | static struct sensor_device_attribute sensor_attrs[] = { | ||
133 | SENSOR_ATTR(temp1_input, 0444, temp_input_show, NULL, 0), | ||
134 | SENSOR_ATTR(temp1_crit, 0444, temp_crit_show, NULL, 0), | ||
135 | SENSOR_ATTR(temp2_input, 0444, temp_input_show, NULL, 1), | ||
136 | SENSOR_ATTR(temp2_crit, 0444, temp_crit_show, NULL, 1), | ||
137 | SENSOR_ATTR(temp3_input, 0444, temp_input_show, NULL, 2), | ||
138 | SENSOR_ATTR(temp3_crit, 0444, temp_crit_show, NULL, 2), | ||
139 | SENSOR_ATTR(temp4_input, 0444, temp_input_show, NULL, 3), | ||
140 | SENSOR_ATTR(temp4_crit, 0444, temp_crit_show, NULL, 3), | ||
141 | SENSOR_ATTR(temp5_input, 0444, temp_input_show, NULL, 4), | ||
142 | SENSOR_ATTR(temp5_crit, 0444, temp_crit_show, NULL, 4), | ||
143 | SENSOR_ATTR(temp6_input, 0444, temp_input_show, NULL, 5), | ||
144 | SENSOR_ATTR(temp6_crit, 0444, temp_crit_show, NULL, 5), | ||
145 | SENSOR_ATTR(temp7_input, 0444, temp_input_show, NULL, 6), | ||
146 | SENSOR_ATTR(temp7_crit, 0444, temp_crit_show, NULL, 6), | ||
147 | SENSOR_ATTR(temp8_input, 0444, temp_input_show, NULL, 7), | ||
148 | SENSOR_ATTR(temp8_crit, 0444, temp_crit_show, NULL, 7), | ||
149 | SENSOR_ATTR(temp9_input, 0444, temp_input_show, NULL, 8), | ||
150 | SENSOR_ATTR(temp9_crit, 0444, temp_crit_show, NULL, 8), | ||
151 | SENSOR_ATTR(temp10_input, 0444, temp_input_show, NULL, 9), | ||
152 | SENSOR_ATTR(temp10_crit, 0444, temp_crit_show, NULL, 9), | ||
153 | }; | ||
154 | |||
155 | /* thermal zone sys I/F */ | ||
91 | 156 | ||
92 | #define to_thermal_zone(_dev) \ | 157 | #define to_thermal_zone(_dev) \ |
93 | container_of(_dev, struct thermal_zone_device, device) | 158 | container_of(_dev, struct thermal_zone_device, device) |
@@ -214,7 +279,7 @@ do { \ | |||
214 | device_remove_file(_dev, &trip_point_attrs[_index * 2 + 1]); \ | 279 | device_remove_file(_dev, &trip_point_attrs[_index * 2 + 1]); \ |
215 | } while (0) | 280 | } while (0) |
216 | 281 | ||
217 | /* sys I/F for cooling device */ | 282 | /* cooling device sys I/F */ |
218 | #define to_cooling_device(_dev) \ | 283 | #define to_cooling_device(_dev) \ |
219 | container_of(_dev, struct thermal_cooling_device, device) | 284 | container_of(_dev, struct thermal_cooling_device, device) |
220 | 285 | ||
@@ -447,6 +512,9 @@ struct thermal_cooling_device *thermal_cooling_device_register(char *type, | |||
447 | struct thermal_zone_device *pos; | 512 | struct thermal_zone_device *pos; |
448 | int result; | 513 | int result; |
449 | 514 | ||
515 | if (!type) | ||
516 | return ERR_PTR(-EINVAL); | ||
517 | |||
450 | if (strlen(type) >= THERMAL_NAME_LENGTH) | 518 | if (strlen(type) >= THERMAL_NAME_LENGTH) |
451 | return ERR_PTR(-EINVAL); | 519 | return ERR_PTR(-EINVAL); |
452 | 520 | ||
@@ -477,11 +545,9 @@ struct thermal_cooling_device *thermal_cooling_device_register(char *type, | |||
477 | } | 545 | } |
478 | 546 | ||
479 | /* sys I/F */ | 547 | /* sys I/F */ |
480 | if (type) { | 548 | result = device_create_file(&cdev->device, &dev_attr_cdev_type); |
481 | result = device_create_file(&cdev->device, &dev_attr_cdev_type); | 549 | if (result) |
482 | if (result) | 550 | goto unregister; |
483 | goto unregister; | ||
484 | } | ||
485 | 551 | ||
486 | result = device_create_file(&cdev->device, &dev_attr_max_state); | 552 | result = device_create_file(&cdev->device, &dev_attr_max_state); |
487 | if (result) | 553 | if (result) |
@@ -547,8 +613,8 @@ void thermal_cooling_device_unregister(struct | |||
547 | tz->ops->unbind(tz, cdev); | 613 | tz->ops->unbind(tz, cdev); |
548 | } | 614 | } |
549 | mutex_unlock(&thermal_list_lock); | 615 | mutex_unlock(&thermal_list_lock); |
550 | if (cdev->type[0]) | 616 | |
551 | device_remove_file(&cdev->device, &dev_attr_cdev_type); | 617 | device_remove_file(&cdev->device, &dev_attr_cdev_type); |
552 | device_remove_file(&cdev->device, &dev_attr_max_state); | 618 | device_remove_file(&cdev->device, &dev_attr_max_state); |
553 | device_remove_file(&cdev->device, &dev_attr_cur_state); | 619 | device_remove_file(&cdev->device, &dev_attr_cur_state); |
554 | 620 | ||
@@ -580,6 +646,9 @@ struct thermal_zone_device *thermal_zone_device_register(char *type, | |||
580 | int result; | 646 | int result; |
581 | int count; | 647 | int count; |
582 | 648 | ||
649 | if (!type) | ||
650 | return ERR_PTR(-EINVAL); | ||
651 | |||
583 | if (strlen(type) >= THERMAL_NAME_LENGTH) | 652 | if (strlen(type) >= THERMAL_NAME_LENGTH) |
584 | return ERR_PTR(-EINVAL); | 653 | return ERR_PTR(-EINVAL); |
585 | 654 | ||
@@ -601,6 +670,13 @@ struct thermal_zone_device *thermal_zone_device_register(char *type, | |||
601 | kfree(tz); | 670 | kfree(tz); |
602 | return ERR_PTR(result); | 671 | return ERR_PTR(result); |
603 | } | 672 | } |
673 | if (tz->id >= MAX_THERMAL_ZONES) { | ||
674 | printk(KERN_ERR PREFIX | ||
675 | "Too many thermal zones\n"); | ||
676 | release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id); | ||
677 | kfree(tz); | ||
678 | return ERR_PTR(-EINVAL); | ||
679 | } | ||
604 | 680 | ||
605 | strcpy(tz->type, type); | 681 | strcpy(tz->type, type); |
606 | tz->ops = ops; | 682 | tz->ops = ops; |
@@ -615,13 +691,28 @@ struct thermal_zone_device *thermal_zone_device_register(char *type, | |||
615 | return ERR_PTR(result); | 691 | return ERR_PTR(result); |
616 | } | 692 | } |
617 | 693 | ||
618 | /* sys I/F */ | 694 | /* hwmon sys I/F */ |
619 | if (type) { | 695 | result = device_create_file(thermal_hwmon, |
620 | result = device_create_file(&tz->device, &dev_attr_type); | 696 | &sensor_attrs[tz->id * 2].dev_attr); |
621 | if (result) | 697 | if (result) |
622 | goto unregister; | 698 | goto unregister; |
699 | |||
700 | if (trips > 0) { | ||
701 | char buf[40]; | ||
702 | result = tz->ops->get_trip_type(tz, 0, buf); | ||
703 | if (result > 0 && !strcmp(buf, "critical\n")) { | ||
704 | result = device_create_file(thermal_hwmon, | ||
705 | &sensor_attrs[tz->id * 2 + 1].dev_attr); | ||
706 | if (result) | ||
707 | goto unregister; | ||
708 | } | ||
623 | } | 709 | } |
624 | 710 | ||
711 | /* sys I/F */ | ||
712 | result = device_create_file(&tz->device, &dev_attr_type); | ||
713 | if (result) | ||
714 | goto unregister; | ||
715 | |||
625 | result = device_create_file(&tz->device, &dev_attr_temp); | 716 | result = device_create_file(&tz->device, &dev_attr_temp); |
626 | if (result) | 717 | if (result) |
627 | goto unregister; | 718 | goto unregister; |
@@ -687,8 +778,17 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz) | |||
687 | tz->ops->unbind(tz, cdev); | 778 | tz->ops->unbind(tz, cdev); |
688 | mutex_unlock(&thermal_list_lock); | 779 | mutex_unlock(&thermal_list_lock); |
689 | 780 | ||
690 | if (tz->type[0]) | 781 | device_remove_file(thermal_hwmon, |
691 | device_remove_file(&tz->device, &dev_attr_type); | 782 | &sensor_attrs[tz->id * 2].dev_attr); |
783 | if (tz->trips > 0) { | ||
784 | char buf[40]; | ||
785 | if (tz->ops->get_trip_type(tz, 0, buf) > 0) | ||
786 | if (!strcmp(buf, "critical\n")) | ||
787 | device_remove_file(thermal_hwmon, | ||
788 | &sensor_attrs[tz->id * 2 + 1].dev_attr); | ||
789 | } | ||
790 | |||
791 | device_remove_file(&tz->device, &dev_attr_type); | ||
692 | device_remove_file(&tz->device, &dev_attr_temp); | 792 | device_remove_file(&tz->device, &dev_attr_temp); |
693 | if (tz->ops->get_mode) | 793 | if (tz->ops->get_mode) |
694 | device_remove_file(&tz->device, &dev_attr_mode); | 794 | device_remove_file(&tz->device, &dev_attr_mode); |
@@ -705,6 +805,19 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz) | |||
705 | 805 | ||
706 | EXPORT_SYMBOL(thermal_zone_device_unregister); | 806 | EXPORT_SYMBOL(thermal_zone_device_unregister); |
707 | 807 | ||
808 | static void thermal_exit(void) | ||
809 | { | ||
810 | if (thermal_hwmon) { | ||
811 | device_remove_file(thermal_hwmon, &dev_attr_name); | ||
812 | hwmon_device_unregister(thermal_hwmon); | ||
813 | } | ||
814 | class_unregister(&thermal_class); | ||
815 | idr_destroy(&thermal_tz_idr); | ||
816 | idr_destroy(&thermal_cdev_idr); | ||
817 | mutex_destroy(&thermal_idr_lock); | ||
818 | mutex_destroy(&thermal_list_lock); | ||
819 | } | ||
820 | |||
708 | static int __init thermal_init(void) | 821 | static int __init thermal_init(void) |
709 | { | 822 | { |
710 | int result = 0; | 823 | int result = 0; |
@@ -716,16 +829,20 @@ static int __init thermal_init(void) | |||
716 | mutex_destroy(&thermal_idr_lock); | 829 | mutex_destroy(&thermal_idr_lock); |
717 | mutex_destroy(&thermal_list_lock); | 830 | mutex_destroy(&thermal_list_lock); |
718 | } | 831 | } |
719 | return result; | ||
720 | } | ||
721 | 832 | ||
722 | static void __exit thermal_exit(void) | 833 | thermal_hwmon = hwmon_device_register(NULL); |
723 | { | 834 | if (IS_ERR(thermal_hwmon)) { |
724 | class_unregister(&thermal_class); | 835 | result = PTR_ERR(thermal_hwmon); |
725 | idr_destroy(&thermal_tz_idr); | 836 | thermal_hwmon = NULL; |
726 | idr_destroy(&thermal_cdev_idr); | 837 | printk(KERN_ERR PREFIX |
727 | mutex_destroy(&thermal_idr_lock); | 838 | "unable to register hwmon device\n"); |
728 | mutex_destroy(&thermal_list_lock); | 839 | thermal_exit(); |
840 | return result; | ||
841 | } | ||
842 | |||
843 | result = device_create_file(thermal_hwmon, &dev_attr_name); | ||
844 | |||
845 | return result; | ||
729 | } | 846 | } |
730 | 847 | ||
731 | subsys_initcall(thermal_init); | 848 | subsys_initcall(thermal_init); |
diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index 5c33cdb9cac7..a2b0aa48b8ea 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig | |||
@@ -87,12 +87,13 @@ config USB_DYNAMIC_MINORS | |||
87 | If you are unsure about this, say N here. | 87 | If you are unsure about this, say N here. |
88 | 88 | ||
89 | config USB_SUSPEND | 89 | config USB_SUSPEND |
90 | bool "USB selective suspend/resume and wakeup (EXPERIMENTAL)" | 90 | bool "USB selective suspend/resume and wakeup" |
91 | depends on USB && PM && EXPERIMENTAL | 91 | depends on USB && PM |
92 | help | 92 | help |
93 | If you say Y here, you can use driver calls or the sysfs | 93 | If you say Y here, you can use driver calls or the sysfs |
94 | "power/state" file to suspend or resume individual USB | 94 | "power/level" file to suspend or resume individual USB |
95 | peripherals. | 95 | peripherals and to enable or disable autosuspend (see |
96 | Documentation/usb/power-management.txt for more details). | ||
96 | 97 | ||
97 | Also, USB "remote wakeup" signaling is supported, whereby some | 98 | Also, USB "remote wakeup" signaling is supported, whereby some |
98 | USB devices (like keyboards and network adapters) can wake up | 99 | USB devices (like keyboards and network adapters) can wake up |
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index f90ab5e94c58..d9d1eb19f2a1 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c | |||
@@ -28,35 +28,38 @@ | |||
28 | * devices is broken... | 28 | * devices is broken... |
29 | */ | 29 | */ |
30 | static const struct usb_device_id usb_quirk_list[] = { | 30 | static const struct usb_device_id usb_quirk_list[] = { |
31 | /* Action Semiconductor flash disk */ | ||
32 | { USB_DEVICE(0x10d6, 0x2200), .driver_info = USB_QUIRK_STRING_FETCH_255}, | ||
33 | |||
34 | /* CBM - Flash disk */ | 31 | /* CBM - Flash disk */ |
35 | { USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME }, | 32 | { USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME }, |
33 | |||
36 | /* HP 5300/5370C scanner */ | 34 | /* HP 5300/5370C scanner */ |
37 | { USB_DEVICE(0x03f0, 0x0701), .driver_info = USB_QUIRK_STRING_FETCH_255 }, | 35 | { USB_DEVICE(0x03f0, 0x0701), .driver_info = |
36 | USB_QUIRK_STRING_FETCH_255 }, | ||
38 | 37 | ||
39 | /* Creative SB Audigy 2 NX */ | 38 | /* Creative SB Audigy 2 NX */ |
40 | { USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME }, | 39 | { USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME }, |
41 | 40 | ||
41 | /* Philips PSC805 audio device */ | ||
42 | { USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
43 | |||
42 | /* Roland SC-8820 */ | 44 | /* Roland SC-8820 */ |
43 | { USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME }, | 45 | { USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME }, |
44 | 46 | ||
45 | /* Edirol SD-20 */ | 47 | /* Edirol SD-20 */ |
46 | { USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME }, | 48 | { USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME }, |
47 | 49 | ||
48 | /* INTEL VALUE SSD */ | ||
49 | { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
50 | |||
51 | /* M-Systems Flash Disk Pioneers */ | 50 | /* M-Systems Flash Disk Pioneers */ |
52 | { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME }, | 51 | { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME }, |
53 | 52 | ||
54 | /* Philips PSC805 audio device */ | 53 | /* Action Semiconductor flash disk */ |
55 | { USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME }, | 54 | { USB_DEVICE(0x10d6, 0x2200), .driver_info = |
55 | USB_QUIRK_STRING_FETCH_255 }, | ||
56 | 56 | ||
57 | /* SKYMEDI USB_DRIVE */ | 57 | /* SKYMEDI USB_DRIVE */ |
58 | { USB_DEVICE(0x1516, 0x8628), .driver_info = USB_QUIRK_RESET_RESUME }, | 58 | { USB_DEVICE(0x1516, 0x8628), .driver_info = USB_QUIRK_RESET_RESUME }, |
59 | 59 | ||
60 | /* INTEL VALUE SSD */ | ||
61 | { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
62 | |||
60 | { } /* terminating entry must be last */ | 63 | { } /* terminating entry must be last */ |
61 | }; | 64 | }; |
62 | 65 | ||
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 4e984060c984..1f0db51190cc 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -99,8 +99,7 @@ struct usb_interface *usb_ifnum_to_if(const struct usb_device *dev, | |||
99 | EXPORT_SYMBOL_GPL(usb_ifnum_to_if); | 99 | EXPORT_SYMBOL_GPL(usb_ifnum_to_if); |
100 | 100 | ||
101 | /** | 101 | /** |
102 | * usb_altnum_to_altsetting - get the altsetting structure with a given | 102 | * usb_altnum_to_altsetting - get the altsetting structure with a given alternate setting number. |
103 | * alternate setting number. | ||
104 | * @intf: the interface containing the altsetting in question | 103 | * @intf: the interface containing the altsetting in question |
105 | * @altnum: the desired alternate setting number | 104 | * @altnum: the desired alternate setting number |
106 | * | 105 | * |
@@ -234,7 +233,7 @@ static int ksuspend_usb_init(void) | |||
234 | * singlethreaded. Its job doesn't justify running on more | 233 | * singlethreaded. Its job doesn't justify running on more |
235 | * than one CPU. | 234 | * than one CPU. |
236 | */ | 235 | */ |
237 | ksuspend_usb_wq = create_singlethread_workqueue("ksuspend_usbd"); | 236 | ksuspend_usb_wq = create_freezeable_workqueue("ksuspend_usbd"); |
238 | if (!ksuspend_usb_wq) | 237 | if (!ksuspend_usb_wq) |
239 | return -ENOMEM; | 238 | return -ENOMEM; |
240 | return 0; | 239 | return 0; |
@@ -442,8 +441,7 @@ EXPORT_SYMBOL_GPL(usb_put_intf); | |||
442 | */ | 441 | */ |
443 | 442 | ||
444 | /** | 443 | /** |
445 | * usb_lock_device_for_reset - cautiously acquire the lock for a | 444 | * usb_lock_device_for_reset - cautiously acquire the lock for a usb device structure |
446 | * usb device structure | ||
447 | * @udev: device that's being locked | 445 | * @udev: device that's being locked |
448 | * @iface: interface bound to the driver making the request (optional) | 446 | * @iface: interface bound to the driver making the request (optional) |
449 | * | 447 | * |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index c13955164686..6f45dd669b33 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -131,7 +131,7 @@ config USB_ATMEL_USBA | |||
131 | 131 | ||
132 | config USB_GADGET_FSL_USB2 | 132 | config USB_GADGET_FSL_USB2 |
133 | boolean "Freescale Highspeed USB DR Peripheral Controller" | 133 | boolean "Freescale Highspeed USB DR Peripheral Controller" |
134 | depends on MPC834x || PPC_MPC831x | 134 | depends on FSL_SOC |
135 | select USB_GADGET_DUALSPEED | 135 | select USB_GADGET_DUALSPEED |
136 | help | 136 | help |
137 | Some of Freescale PowerPC processors have a High Speed | 137 | Some of Freescale PowerPC processors have a High Speed |
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index 4f6bfa100f2a..2c32bd08ee7d 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c | |||
@@ -92,7 +92,6 @@ struct printer_dev { | |||
92 | u8 *current_rx_buf; | 92 | u8 *current_rx_buf; |
93 | u8 printer_status; | 93 | u8 printer_status; |
94 | u8 reset_printer; | 94 | u8 reset_printer; |
95 | struct class_device *printer_class_dev; | ||
96 | struct cdev printer_cdev; | 95 | struct cdev printer_cdev; |
97 | struct device *pdev; | 96 | struct device *pdev; |
98 | u8 printer_cdev_open; | 97 | u8 printer_cdev_open; |
diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index 4402d6f042d9..096c41cc40d1 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c | |||
@@ -103,6 +103,12 @@ static const char ep0name [] = "ep0"; | |||
103 | #error "Can't configure both IXP and PXA" | 103 | #error "Can't configure both IXP and PXA" |
104 | #endif | 104 | #endif |
105 | 105 | ||
106 | /* IXP doesn't yet support <linux/clk.h> */ | ||
107 | #define clk_get(dev,name) NULL | ||
108 | #define clk_enable(clk) do { } while (0) | ||
109 | #define clk_disable(clk) do { } while (0) | ||
110 | #define clk_put(clk) do { } while (0) | ||
111 | |||
106 | #endif | 112 | #endif |
107 | 113 | ||
108 | #include "pxa2xx_udc.h" | 114 | #include "pxa2xx_udc.h" |
@@ -934,20 +940,31 @@ static void udc_disable(struct pxa2xx_udc *); | |||
934 | /* We disable the UDC -- and its 48 MHz clock -- whenever it's not | 940 | /* We disable the UDC -- and its 48 MHz clock -- whenever it's not |
935 | * in active use. | 941 | * in active use. |
936 | */ | 942 | */ |
937 | static int pullup(struct pxa2xx_udc *udc, int is_active) | 943 | static int pullup(struct pxa2xx_udc *udc) |
938 | { | 944 | { |
939 | is_active = is_active && udc->vbus && udc->pullup; | 945 | int is_active = udc->vbus && udc->pullup && !udc->suspended; |
940 | DMSG("%s\n", is_active ? "active" : "inactive"); | 946 | DMSG("%s\n", is_active ? "active" : "inactive"); |
941 | if (is_active) | 947 | if (is_active) { |
942 | udc_enable(udc); | 948 | if (!udc->active) { |
943 | else { | 949 | udc->active = 1; |
944 | if (udc->gadget.speed != USB_SPEED_UNKNOWN) { | 950 | /* Enable clock for USB device */ |
945 | DMSG("disconnect %s\n", udc->driver | 951 | clk_enable(udc->clk); |
946 | ? udc->driver->driver.name | 952 | udc_enable(udc); |
947 | : "(no driver)"); | ||
948 | stop_activity(udc, udc->driver); | ||
949 | } | 953 | } |
950 | udc_disable(udc); | 954 | } else { |
955 | if (udc->active) { | ||
956 | if (udc->gadget.speed != USB_SPEED_UNKNOWN) { | ||
957 | DMSG("disconnect %s\n", udc->driver | ||
958 | ? udc->driver->driver.name | ||
959 | : "(no driver)"); | ||
960 | stop_activity(udc, udc->driver); | ||
961 | } | ||
962 | udc_disable(udc); | ||
963 | /* Disable clock for USB device */ | ||
964 | clk_disable(udc->clk); | ||
965 | udc->active = 0; | ||
966 | } | ||
967 | |||
951 | } | 968 | } |
952 | return 0; | 969 | return 0; |
953 | } | 970 | } |
@@ -958,9 +975,9 @@ static int pxa2xx_udc_vbus_session(struct usb_gadget *_gadget, int is_active) | |||
958 | struct pxa2xx_udc *udc; | 975 | struct pxa2xx_udc *udc; |
959 | 976 | ||
960 | udc = container_of(_gadget, struct pxa2xx_udc, gadget); | 977 | udc = container_of(_gadget, struct pxa2xx_udc, gadget); |
961 | udc->vbus = is_active = (is_active != 0); | 978 | udc->vbus = (is_active != 0); |
962 | DMSG("vbus %s\n", is_active ? "supplied" : "inactive"); | 979 | DMSG("vbus %s\n", is_active ? "supplied" : "inactive"); |
963 | pullup(udc, is_active); | 980 | pullup(udc); |
964 | return 0; | 981 | return 0; |
965 | } | 982 | } |
966 | 983 | ||
@@ -975,9 +992,8 @@ static int pxa2xx_udc_pullup(struct usb_gadget *_gadget, int is_active) | |||
975 | if (!udc->mach->gpio_pullup && !udc->mach->udc_command) | 992 | if (!udc->mach->gpio_pullup && !udc->mach->udc_command) |
976 | return -EOPNOTSUPP; | 993 | return -EOPNOTSUPP; |
977 | 994 | ||
978 | is_active = (is_active != 0); | 995 | udc->pullup = (is_active != 0); |
979 | udc->pullup = is_active; | 996 | pullup(udc); |
980 | pullup(udc, is_active); | ||
981 | return 0; | 997 | return 0; |
982 | } | 998 | } |
983 | 999 | ||
@@ -997,7 +1013,7 @@ static const struct usb_gadget_ops pxa2xx_udc_ops = { | |||
997 | #ifdef CONFIG_USB_GADGET_DEBUG_FS | 1013 | #ifdef CONFIG_USB_GADGET_DEBUG_FS |
998 | 1014 | ||
999 | static int | 1015 | static int |
1000 | udc_seq_show(struct seq_file *m, void *d) | 1016 | udc_seq_show(struct seq_file *m, void *_d) |
1001 | { | 1017 | { |
1002 | struct pxa2xx_udc *dev = m->private; | 1018 | struct pxa2xx_udc *dev = m->private; |
1003 | unsigned long flags; | 1019 | unsigned long flags; |
@@ -1146,11 +1162,6 @@ static void udc_disable(struct pxa2xx_udc *dev) | |||
1146 | 1162 | ||
1147 | udc_clear_mask_UDCCR(UDCCR_UDE); | 1163 | udc_clear_mask_UDCCR(UDCCR_UDE); |
1148 | 1164 | ||
1149 | #ifdef CONFIG_ARCH_PXA | ||
1150 | /* Disable clock for USB device */ | ||
1151 | clk_disable(dev->clk); | ||
1152 | #endif | ||
1153 | |||
1154 | ep0_idle (dev); | 1165 | ep0_idle (dev); |
1155 | dev->gadget.speed = USB_SPEED_UNKNOWN; | 1166 | dev->gadget.speed = USB_SPEED_UNKNOWN; |
1156 | } | 1167 | } |
@@ -1191,11 +1202,6 @@ static void udc_enable (struct pxa2xx_udc *dev) | |||
1191 | { | 1202 | { |
1192 | udc_clear_mask_UDCCR(UDCCR_UDE); | 1203 | udc_clear_mask_UDCCR(UDCCR_UDE); |
1193 | 1204 | ||
1194 | #ifdef CONFIG_ARCH_PXA | ||
1195 | /* Enable clock for USB device */ | ||
1196 | clk_enable(dev->clk); | ||
1197 | #endif | ||
1198 | |||
1199 | /* try to clear these bits before we enable the udc */ | 1205 | /* try to clear these bits before we enable the udc */ |
1200 | udc_ack_int_UDCCR(UDCCR_SUSIR|/*UDCCR_RSTIR|*/UDCCR_RESIR); | 1206 | udc_ack_int_UDCCR(UDCCR_SUSIR|/*UDCCR_RSTIR|*/UDCCR_RESIR); |
1201 | 1207 | ||
@@ -1286,7 +1292,7 @@ fail: | |||
1286 | * for set_configuration as well as eventual disconnect. | 1292 | * for set_configuration as well as eventual disconnect. |
1287 | */ | 1293 | */ |
1288 | DMSG("registered gadget driver '%s'\n", driver->driver.name); | 1294 | DMSG("registered gadget driver '%s'\n", driver->driver.name); |
1289 | pullup(dev, 1); | 1295 | pullup(dev); |
1290 | dump_state(dev); | 1296 | dump_state(dev); |
1291 | return 0; | 1297 | return 0; |
1292 | } | 1298 | } |
@@ -1329,7 +1335,8 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
1329 | return -EINVAL; | 1335 | return -EINVAL; |
1330 | 1336 | ||
1331 | local_irq_disable(); | 1337 | local_irq_disable(); |
1332 | pullup(dev, 0); | 1338 | dev->pullup = 0; |
1339 | pullup(dev); | ||
1333 | stop_activity(dev, driver); | 1340 | stop_activity(dev, driver); |
1334 | local_irq_enable(); | 1341 | local_irq_enable(); |
1335 | 1342 | ||
@@ -2131,13 +2138,11 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2131 | if (irq < 0) | 2138 | if (irq < 0) |
2132 | return -ENODEV; | 2139 | return -ENODEV; |
2133 | 2140 | ||
2134 | #ifdef CONFIG_ARCH_PXA | ||
2135 | dev->clk = clk_get(&pdev->dev, "UDCCLK"); | 2141 | dev->clk = clk_get(&pdev->dev, "UDCCLK"); |
2136 | if (IS_ERR(dev->clk)) { | 2142 | if (IS_ERR(dev->clk)) { |
2137 | retval = PTR_ERR(dev->clk); | 2143 | retval = PTR_ERR(dev->clk); |
2138 | goto err_clk; | 2144 | goto err_clk; |
2139 | } | 2145 | } |
2140 | #endif | ||
2141 | 2146 | ||
2142 | pr_debug("%s: IRQ %d%s%s\n", driver_name, irq, | 2147 | pr_debug("%s: IRQ %d%s%s\n", driver_name, irq, |
2143 | dev->has_cfr ? "" : " (!cfr)", | 2148 | dev->has_cfr ? "" : " (!cfr)", |
@@ -2250,10 +2255,8 @@ lubbock_fail0: | |||
2250 | if (dev->mach->gpio_vbus) | 2255 | if (dev->mach->gpio_vbus) |
2251 | gpio_free(dev->mach->gpio_vbus); | 2256 | gpio_free(dev->mach->gpio_vbus); |
2252 | err_gpio_vbus: | 2257 | err_gpio_vbus: |
2253 | #ifdef CONFIG_ARCH_PXA | ||
2254 | clk_put(dev->clk); | 2258 | clk_put(dev->clk); |
2255 | err_clk: | 2259 | err_clk: |
2256 | #endif | ||
2257 | return retval; | 2260 | return retval; |
2258 | } | 2261 | } |
2259 | 2262 | ||
@@ -2269,7 +2272,9 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev) | |||
2269 | if (dev->driver) | 2272 | if (dev->driver) |
2270 | return -EBUSY; | 2273 | return -EBUSY; |
2271 | 2274 | ||
2272 | udc_disable(dev); | 2275 | dev->pullup = 0; |
2276 | pullup(dev); | ||
2277 | |||
2273 | remove_debug_files(dev); | 2278 | remove_debug_files(dev); |
2274 | 2279 | ||
2275 | if (dev->got_irq) { | 2280 | if (dev->got_irq) { |
@@ -2289,9 +2294,7 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev) | |||
2289 | if (dev->mach->gpio_pullup) | 2294 | if (dev->mach->gpio_pullup) |
2290 | gpio_free(dev->mach->gpio_pullup); | 2295 | gpio_free(dev->mach->gpio_pullup); |
2291 | 2296 | ||
2292 | #ifdef CONFIG_ARCH_PXA | ||
2293 | clk_put(dev->clk); | 2297 | clk_put(dev->clk); |
2294 | #endif | ||
2295 | 2298 | ||
2296 | platform_set_drvdata(pdev, NULL); | 2299 | platform_set_drvdata(pdev, NULL); |
2297 | the_controller = NULL; | 2300 | the_controller = NULL; |
@@ -2317,10 +2320,15 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev) | |||
2317 | static int pxa2xx_udc_suspend(struct platform_device *dev, pm_message_t state) | 2320 | static int pxa2xx_udc_suspend(struct platform_device *dev, pm_message_t state) |
2318 | { | 2321 | { |
2319 | struct pxa2xx_udc *udc = platform_get_drvdata(dev); | 2322 | struct pxa2xx_udc *udc = platform_get_drvdata(dev); |
2323 | unsigned long flags; | ||
2320 | 2324 | ||
2321 | if (!udc->mach->gpio_pullup && !udc->mach->udc_command) | 2325 | if (!udc->mach->gpio_pullup && !udc->mach->udc_command) |
2322 | WARN("USB host won't detect disconnect!\n"); | 2326 | WARN("USB host won't detect disconnect!\n"); |
2323 | pullup(udc, 0); | 2327 | udc->suspended = 1; |
2328 | |||
2329 | local_irq_save(flags); | ||
2330 | pullup(udc); | ||
2331 | local_irq_restore(flags); | ||
2324 | 2332 | ||
2325 | return 0; | 2333 | return 0; |
2326 | } | 2334 | } |
@@ -2328,8 +2336,12 @@ static int pxa2xx_udc_suspend(struct platform_device *dev, pm_message_t state) | |||
2328 | static int pxa2xx_udc_resume(struct platform_device *dev) | 2336 | static int pxa2xx_udc_resume(struct platform_device *dev) |
2329 | { | 2337 | { |
2330 | struct pxa2xx_udc *udc = platform_get_drvdata(dev); | 2338 | struct pxa2xx_udc *udc = platform_get_drvdata(dev); |
2339 | unsigned long flags; | ||
2331 | 2340 | ||
2332 | pullup(udc, 1); | 2341 | udc->suspended = 0; |
2342 | local_irq_save(flags); | ||
2343 | pullup(udc); | ||
2344 | local_irq_restore(flags); | ||
2333 | 2345 | ||
2334 | return 0; | 2346 | return 0; |
2335 | } | 2347 | } |
diff --git a/drivers/usb/gadget/pxa2xx_udc.h b/drivers/usb/gadget/pxa2xx_udc.h index b67e3ff5e4eb..e2c19e88c875 100644 --- a/drivers/usb/gadget/pxa2xx_udc.h +++ b/drivers/usb/gadget/pxa2xx_udc.h | |||
@@ -119,7 +119,9 @@ struct pxa2xx_udc { | |||
119 | has_cfr : 1, | 119 | has_cfr : 1, |
120 | req_pending : 1, | 120 | req_pending : 1, |
121 | req_std : 1, | 121 | req_std : 1, |
122 | req_config : 1; | 122 | req_config : 1, |
123 | suspended : 1, | ||
124 | active : 1; | ||
123 | 125 | ||
124 | #define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200)) | 126 | #define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200)) |
125 | struct timer_list timer; | 127 | struct timer_list timer; |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index b8ad55aff842..46ee7f4c0912 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -281,23 +281,44 @@ static void ehci_iaa_watchdog(unsigned long param) | |||
281 | { | 281 | { |
282 | struct ehci_hcd *ehci = (struct ehci_hcd *) param; | 282 | struct ehci_hcd *ehci = (struct ehci_hcd *) param; |
283 | unsigned long flags; | 283 | unsigned long flags; |
284 | u32 status, cmd; | ||
285 | 284 | ||
286 | spin_lock_irqsave (&ehci->lock, flags); | 285 | spin_lock_irqsave (&ehci->lock, flags); |
287 | WARN_ON(!ehci->reclaim); | ||
288 | 286 | ||
289 | status = ehci_readl(ehci, &ehci->regs->status); | 287 | /* Lost IAA irqs wedge things badly; seen first with a vt8235. |
290 | cmd = ehci_readl(ehci, &ehci->regs->command); | 288 | * So we need this watchdog, but must protect it against both |
291 | ehci_dbg(ehci, "IAA watchdog: status %x cmd %x\n", status, cmd); | 289 | * (a) SMP races against real IAA firing and retriggering, and |
292 | 290 | * (b) clean HC shutdown, when IAA watchdog was pending. | |
293 | /* lost IAA irqs wedge things badly; seen first with a vt8235 */ | 291 | */ |
294 | if (ehci->reclaim) { | 292 | if (ehci->reclaim |
295 | if (status & STS_IAA) { | 293 | && !timer_pending(&ehci->iaa_watchdog) |
296 | ehci_vdbg (ehci, "lost IAA\n"); | 294 | && HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) { |
295 | u32 cmd, status; | ||
296 | |||
297 | /* If we get here, IAA is *REALLY* late. It's barely | ||
298 | * conceivable that the system is so busy that CMD_IAAD | ||
299 | * is still legitimately set, so let's be sure it's | ||
300 | * clear before we read STS_IAA. (The HC should clear | ||
301 | * CMD_IAAD when it sets STS_IAA.) | ||
302 | */ | ||
303 | cmd = ehci_readl(ehci, &ehci->regs->command); | ||
304 | if (cmd & CMD_IAAD) | ||
305 | ehci_writel(ehci, cmd & ~CMD_IAAD, | ||
306 | &ehci->regs->command); | ||
307 | |||
308 | /* If IAA is set here it either legitimately triggered | ||
309 | * before we cleared IAAD above (but _way_ late, so we'll | ||
310 | * still count it as lost) ... or a silicon erratum: | ||
311 | * - VIA seems to set IAA without triggering the IRQ; | ||
312 | * - IAAD potentially cleared without setting IAA. | ||
313 | */ | ||
314 | status = ehci_readl(ehci, &ehci->regs->status); | ||
315 | if ((status & STS_IAA) || !(cmd & CMD_IAAD)) { | ||
297 | COUNT (ehci->stats.lost_iaa); | 316 | COUNT (ehci->stats.lost_iaa); |
298 | ehci_writel(ehci, STS_IAA, &ehci->regs->status); | 317 | ehci_writel(ehci, STS_IAA, &ehci->regs->status); |
299 | } | 318 | } |
300 | ehci_writel(ehci, cmd & ~CMD_IAAD, &ehci->regs->command); | 319 | |
320 | ehci_vdbg(ehci, "IAA watchdog: status %x cmd %x\n", | ||
321 | status, cmd); | ||
301 | end_unlink_async(ehci); | 322 | end_unlink_async(ehci); |
302 | } | 323 | } |
303 | 324 | ||
@@ -631,7 +652,7 @@ static int ehci_run (struct usb_hcd *hcd) | |||
631 | static irqreturn_t ehci_irq (struct usb_hcd *hcd) | 652 | static irqreturn_t ehci_irq (struct usb_hcd *hcd) |
632 | { | 653 | { |
633 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 654 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
634 | u32 status, pcd_status = 0; | 655 | u32 status, pcd_status = 0, cmd; |
635 | int bh; | 656 | int bh; |
636 | 657 | ||
637 | spin_lock (&ehci->lock); | 658 | spin_lock (&ehci->lock); |
@@ -652,7 +673,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
652 | 673 | ||
653 | /* clear (just) interrupts */ | 674 | /* clear (just) interrupts */ |
654 | ehci_writel(ehci, status, &ehci->regs->status); | 675 | ehci_writel(ehci, status, &ehci->regs->status); |
655 | ehci_readl(ehci, &ehci->regs->command); /* unblock posted write */ | 676 | cmd = ehci_readl(ehci, &ehci->regs->command); |
656 | bh = 0; | 677 | bh = 0; |
657 | 678 | ||
658 | #ifdef EHCI_VERBOSE_DEBUG | 679 | #ifdef EHCI_VERBOSE_DEBUG |
@@ -673,8 +694,17 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
673 | 694 | ||
674 | /* complete the unlinking of some qh [4.15.2.3] */ | 695 | /* complete the unlinking of some qh [4.15.2.3] */ |
675 | if (status & STS_IAA) { | 696 | if (status & STS_IAA) { |
676 | COUNT (ehci->stats.reclaim); | 697 | /* guard against (alleged) silicon errata */ |
677 | end_unlink_async(ehci); | 698 | if (cmd & CMD_IAAD) { |
699 | ehci_writel(ehci, cmd & ~CMD_IAAD, | ||
700 | &ehci->regs->command); | ||
701 | ehci_dbg(ehci, "IAA with IAAD still set?\n"); | ||
702 | } | ||
703 | if (ehci->reclaim) { | ||
704 | COUNT(ehci->stats.reclaim); | ||
705 | end_unlink_async(ehci); | ||
706 | } else | ||
707 | ehci_dbg(ehci, "IAA with nothing to reclaim?\n"); | ||
678 | } | 708 | } |
679 | 709 | ||
680 | /* remote wakeup [4.3.1] */ | 710 | /* remote wakeup [4.3.1] */ |
@@ -781,7 +811,7 @@ static int ehci_urb_enqueue ( | |||
781 | static void unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) | 811 | static void unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) |
782 | { | 812 | { |
783 | /* failfast */ | 813 | /* failfast */ |
784 | if (!HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) | 814 | if (!HC_IS_RUNNING(ehci_to_hcd(ehci)->state) && ehci->reclaim) |
785 | end_unlink_async(ehci); | 815 | end_unlink_async(ehci); |
786 | 816 | ||
787 | /* if it's not linked then there's nothing to do */ | 817 | /* if it's not linked then there's nothing to do */ |
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 776a97f33914..2e49de820b14 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
@@ -319,10 +319,10 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
319 | if (likely (last->urb != urb)) { | 319 | if (likely (last->urb != urb)) { |
320 | ehci_urb_done(ehci, last->urb, last_status); | 320 | ehci_urb_done(ehci, last->urb, last_status); |
321 | count++; | 321 | count++; |
322 | last_status = -EINPROGRESS; | ||
322 | } | 323 | } |
323 | ehci_qtd_free (ehci, last); | 324 | ehci_qtd_free (ehci, last); |
324 | last = NULL; | 325 | last = NULL; |
325 | last_status = -EINPROGRESS; | ||
326 | } | 326 | } |
327 | 327 | ||
328 | /* ignore urbs submitted during completions we reported */ | 328 | /* ignore urbs submitted during completions we reported */ |
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index 0130fd8571e4..d7071c855758 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
@@ -911,8 +911,7 @@ static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf) | |||
911 | buf[0] = 0; | 911 | buf[0] = 0; |
912 | 912 | ||
913 | for (i = 0; i < ports; i++) { | 913 | for (i = 0; i < ports; i++) { |
914 | u32 status = isp116x->rhport[i] = | 914 | u32 status = isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1); |
915 | isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1); | ||
916 | 915 | ||
917 | if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC | 916 | if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC |
918 | | RH_PS_OCIC | RH_PS_PRSC)) { | 917 | | RH_PS_OCIC | RH_PS_PRSC)) { |
@@ -1031,7 +1030,9 @@ static int isp116x_hub_control(struct usb_hcd *hcd, | |||
1031 | DBG("GetPortStatus\n"); | 1030 | DBG("GetPortStatus\n"); |
1032 | if (!wIndex || wIndex > ports) | 1031 | if (!wIndex || wIndex > ports) |
1033 | goto error; | 1032 | goto error; |
1034 | tmp = isp116x->rhport[--wIndex]; | 1033 | spin_lock_irqsave(&isp116x->lock, flags); |
1034 | tmp = isp116x_read_reg32(isp116x, (--wIndex) ? HCRHPORT2 : HCRHPORT1); | ||
1035 | spin_unlock_irqrestore(&isp116x->lock, flags); | ||
1035 | *(__le32 *) buf = cpu_to_le32(tmp); | 1036 | *(__le32 *) buf = cpu_to_le32(tmp); |
1036 | DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp); | 1037 | DBG("GetPortStatus: port[%d] %08x\n", wIndex + 1, tmp); |
1037 | break; | 1038 | break; |
@@ -1080,8 +1081,6 @@ static int isp116x_hub_control(struct usb_hcd *hcd, | |||
1080 | spin_lock_irqsave(&isp116x->lock, flags); | 1081 | spin_lock_irqsave(&isp116x->lock, flags); |
1081 | isp116x_write_reg32(isp116x, wIndex | 1082 | isp116x_write_reg32(isp116x, wIndex |
1082 | ? HCRHPORT2 : HCRHPORT1, tmp); | 1083 | ? HCRHPORT2 : HCRHPORT1, tmp); |
1083 | isp116x->rhport[wIndex] = | ||
1084 | isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1); | ||
1085 | spin_unlock_irqrestore(&isp116x->lock, flags); | 1084 | spin_unlock_irqrestore(&isp116x->lock, flags); |
1086 | break; | 1085 | break; |
1087 | case SetPortFeature: | 1086 | case SetPortFeature: |
@@ -1095,24 +1094,22 @@ static int isp116x_hub_control(struct usb_hcd *hcd, | |||
1095 | spin_lock_irqsave(&isp116x->lock, flags); | 1094 | spin_lock_irqsave(&isp116x->lock, flags); |
1096 | isp116x_write_reg32(isp116x, wIndex | 1095 | isp116x_write_reg32(isp116x, wIndex |
1097 | ? HCRHPORT2 : HCRHPORT1, RH_PS_PSS); | 1096 | ? HCRHPORT2 : HCRHPORT1, RH_PS_PSS); |
1097 | spin_unlock_irqrestore(&isp116x->lock, flags); | ||
1098 | break; | 1098 | break; |
1099 | case USB_PORT_FEAT_POWER: | 1099 | case USB_PORT_FEAT_POWER: |
1100 | DBG("USB_PORT_FEAT_POWER\n"); | 1100 | DBG("USB_PORT_FEAT_POWER\n"); |
1101 | spin_lock_irqsave(&isp116x->lock, flags); | 1101 | spin_lock_irqsave(&isp116x->lock, flags); |
1102 | isp116x_write_reg32(isp116x, wIndex | 1102 | isp116x_write_reg32(isp116x, wIndex |
1103 | ? HCRHPORT2 : HCRHPORT1, RH_PS_PPS); | 1103 | ? HCRHPORT2 : HCRHPORT1, RH_PS_PPS); |
1104 | spin_unlock_irqrestore(&isp116x->lock, flags); | ||
1104 | break; | 1105 | break; |
1105 | case USB_PORT_FEAT_RESET: | 1106 | case USB_PORT_FEAT_RESET: |
1106 | DBG("USB_PORT_FEAT_RESET\n"); | 1107 | DBG("USB_PORT_FEAT_RESET\n"); |
1107 | root_port_reset(isp116x, wIndex); | 1108 | root_port_reset(isp116x, wIndex); |
1108 | spin_lock_irqsave(&isp116x->lock, flags); | ||
1109 | break; | 1109 | break; |
1110 | default: | 1110 | default: |
1111 | goto error; | 1111 | goto error; |
1112 | } | 1112 | } |
1113 | isp116x->rhport[wIndex] = | ||
1114 | isp116x_read_reg32(isp116x, wIndex ? HCRHPORT2 : HCRHPORT1); | ||
1115 | spin_unlock_irqrestore(&isp116x->lock, flags); | ||
1116 | break; | 1113 | break; |
1117 | 1114 | ||
1118 | default: | 1115 | default: |
diff --git a/drivers/usb/host/isp116x.h b/drivers/usb/host/isp116x.h index b91e2edd9c5c..595b90a99848 100644 --- a/drivers/usb/host/isp116x.h +++ b/drivers/usb/host/isp116x.h | |||
@@ -270,7 +270,6 @@ struct isp116x { | |||
270 | u32 rhdesca; | 270 | u32 rhdesca; |
271 | u32 rhdescb; | 271 | u32 rhdescb; |
272 | u32 rhstatus; | 272 | u32 rhstatus; |
273 | u32 rhport[2]; | ||
274 | 273 | ||
275 | /* async schedule: control, bulk */ | 274 | /* async schedule: control, bulk */ |
276 | struct list_head async; | 275 | struct list_head async; |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 08c65c1a3771..779d07851a4d 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -94,6 +94,7 @@ static struct usb_device_id id_table_earthmate [] = { | |||
94 | 94 | ||
95 | static struct usb_device_id id_table_cyphidcomrs232 [] = { | 95 | static struct usb_device_id id_table_cyphidcomrs232 [] = { |
96 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, | 96 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, |
97 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, | ||
97 | { } /* Terminating entry */ | 98 | { } /* Terminating entry */ |
98 | }; | 99 | }; |
99 | 100 | ||
@@ -106,6 +107,7 @@ static struct usb_device_id id_table_combined [] = { | |||
106 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, | 107 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, |
107 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, | 108 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, |
108 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, | 109 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, |
110 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, | ||
109 | { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, | 111 | { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, |
110 | { } /* Terminating entry */ | 112 | { } /* Terminating entry */ |
111 | }; | 113 | }; |
diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h index e1c7c27e18b7..0388065bb794 100644 --- a/drivers/usb/serial/cypress_m8.h +++ b/drivers/usb/serial/cypress_m8.h | |||
@@ -19,6 +19,10 @@ | |||
19 | #define VENDOR_ID_CYPRESS 0x04b4 | 19 | #define VENDOR_ID_CYPRESS 0x04b4 |
20 | #define PRODUCT_ID_CYPHIDCOM 0x5500 | 20 | #define PRODUCT_ID_CYPHIDCOM 0x5500 |
21 | 21 | ||
22 | /* Powercom UPS, chip CY7C63723 */ | ||
23 | #define VENDOR_ID_POWERCOM 0x0d9f | ||
24 | #define PRODUCT_ID_UPS 0x0002 | ||
25 | |||
22 | /* Nokia CA-42 USB to serial cable */ | 26 | /* Nokia CA-42 USB to serial cable */ |
23 | #define VENDOR_ID_DAZZLE 0x07d0 | 27 | #define VENDOR_ID_DAZZLE 0x07d0 |
24 | #define PRODUCT_ID_CA42 0x4101 | 28 | #define PRODUCT_ID_CA42 0x4101 |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 76db2fef4657..3abb3c863647 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -92,6 +92,7 @@ struct ftdi_sio_quirk { | |||
92 | }; | 92 | }; |
93 | 93 | ||
94 | static int ftdi_jtag_probe (struct usb_serial *serial); | 94 | static int ftdi_jtag_probe (struct usb_serial *serial); |
95 | static int ftdi_mtxorb_hack_setup (struct usb_serial *serial); | ||
95 | static void ftdi_USB_UIRT_setup (struct ftdi_private *priv); | 96 | static void ftdi_USB_UIRT_setup (struct ftdi_private *priv); |
96 | static void ftdi_HE_TIRA1_setup (struct ftdi_private *priv); | 97 | static void ftdi_HE_TIRA1_setup (struct ftdi_private *priv); |
97 | 98 | ||
@@ -99,6 +100,10 @@ static struct ftdi_sio_quirk ftdi_jtag_quirk = { | |||
99 | .probe = ftdi_jtag_probe, | 100 | .probe = ftdi_jtag_probe, |
100 | }; | 101 | }; |
101 | 102 | ||
103 | static struct ftdi_sio_quirk ftdi_mtxorb_hack_quirk = { | ||
104 | .probe = ftdi_mtxorb_hack_setup, | ||
105 | }; | ||
106 | |||
102 | static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = { | 107 | static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = { |
103 | .port_probe = ftdi_USB_UIRT_setup, | 108 | .port_probe = ftdi_USB_UIRT_setup, |
104 | }; | 109 | }; |
@@ -161,6 +166,8 @@ static struct usb_device_id id_table_combined [] = { | |||
161 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) }, | 166 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_4_PID) }, |
162 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) }, | 167 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_5_PID) }, |
163 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, | 168 | { USB_DEVICE(FTDI_VID, FTDI_MTXORB_6_PID) }, |
169 | { USB_DEVICE(MTXORB_VK_VID, MTXORB_VK_PID), | ||
170 | .driver_info = (kernel_ulong_t)&ftdi_mtxorb_hack_quirk }, | ||
164 | { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, | 171 | { USB_DEVICE(FTDI_VID, FTDI_PERLE_ULTRAPORT_PID) }, |
165 | { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, | 172 | { USB_DEVICE(FTDI_VID, FTDI_PIEGROUP_PID) }, |
166 | { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) }, | 173 | { USB_DEVICE(FTDI_VID, FTDI_TNC_X_PID) }, |
@@ -274,6 +281,7 @@ static struct usb_device_id id_table_combined [] = { | |||
274 | { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) }, | 281 | { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) }, |
275 | { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) }, | 282 | { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) }, |
276 | { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) }, | 283 | { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) }, |
284 | { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1010PC_PID) }, | ||
277 | { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) }, | 285 | { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) }, |
278 | { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) }, | 286 | { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) }, |
279 | { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) }, | 287 | { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) }, |
@@ -351,6 +359,7 @@ static struct usb_device_id id_table_combined [] = { | |||
351 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, | 359 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, |
352 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, | 360 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, |
353 | { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) }, | 361 | { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) }, |
362 | { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) }, | ||
354 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), | 363 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), |
355 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 364 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
356 | { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID), | 365 | { USB_DEVICE(FIC_VID, FIC_NEO1973_DEBUG_PID), |
@@ -1088,6 +1097,23 @@ static int ftdi_jtag_probe(struct usb_serial *serial) | |||
1088 | return 0; | 1097 | return 0; |
1089 | } | 1098 | } |
1090 | 1099 | ||
1100 | /* | ||
1101 | * The Matrix Orbital VK204-25-USB has an invalid IN endpoint. | ||
1102 | * We have to correct it if we want to read from it. | ||
1103 | */ | ||
1104 | static int ftdi_mtxorb_hack_setup(struct usb_serial *serial) | ||
1105 | { | ||
1106 | struct usb_host_endpoint *ep = serial->dev->ep_in[1]; | ||
1107 | struct usb_endpoint_descriptor *ep_desc = &ep->desc; | ||
1108 | |||
1109 | if (ep->enabled && ep_desc->wMaxPacketSize == 0) { | ||
1110 | ep_desc->wMaxPacketSize = 0x40; | ||
1111 | info("Fixing invalid wMaxPacketSize on read pipe"); | ||
1112 | } | ||
1113 | |||
1114 | return 0; | ||
1115 | } | ||
1116 | |||
1091 | /* ftdi_shutdown is called from usbserial:usb_serial_disconnect | 1117 | /* ftdi_shutdown is called from usbserial:usb_serial_disconnect |
1092 | * it is called when the usb device is disconnected | 1118 | * it is called when the usb device is disconnected |
1093 | * | 1119 | * |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 6eee2ab914ec..6da539ede0ee 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
@@ -102,6 +102,13 @@ | |||
102 | * (http://www.joernonline.de/dw/doku.php?id=start&idx=projects:oocdlink) */ | 102 | * (http://www.joernonline.de/dw/doku.php?id=start&idx=projects:oocdlink) */ |
103 | #define FTDI_OOCDLINK_PID 0xbaf8 /* Amontec JTAGkey */ | 103 | #define FTDI_OOCDLINK_PID 0xbaf8 /* Amontec JTAGkey */ |
104 | 104 | ||
105 | /* | ||
106 | * The following are the values for the Matrix Orbital VK204-25-USB | ||
107 | * display, which use the FT232RL. | ||
108 | */ | ||
109 | #define MTXORB_VK_VID 0x1b3d | ||
110 | #define MTXORB_VK_PID 0x0158 | ||
111 | |||
105 | /* Interbiometrics USB I/O Board */ | 112 | /* Interbiometrics USB I/O Board */ |
106 | /* Developed for Interbiometrics by Rudolf Gugler */ | 113 | /* Developed for Interbiometrics by Rudolf Gugler */ |
107 | #define INTERBIOMETRICS_VID 0x1209 | 114 | #define INTERBIOMETRICS_VID 0x1209 |
@@ -550,6 +557,9 @@ | |||
550 | #define TML_VID 0x1B91 /* Vendor ID */ | 557 | #define TML_VID 0x1B91 /* Vendor ID */ |
551 | #define TML_USB_SERIAL_PID 0x0064 /* USB - Serial Converter */ | 558 | #define TML_USB_SERIAL_PID 0x0064 /* USB - Serial Converter */ |
552 | 559 | ||
560 | /* Propox devices */ | ||
561 | #define FTDI_PROPOX_JTAGCABLEII_PID 0xD738 | ||
562 | |||
553 | /* Commands */ | 563 | /* Commands */ |
554 | #define FTDI_SIO_RESET 0 /* Reset the port */ | 564 | #define FTDI_SIO_RESET 0 /* Reset the port */ |
555 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ | 565 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 97fa3c428435..7cfce9dabb90 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -323,7 +323,7 @@ static void flush_and_resubmit_read_urb (struct usb_serial_port *port) | |||
323 | room = tty_buffer_request_room(tty, urb->actual_length); | 323 | room = tty_buffer_request_room(tty, urb->actual_length); |
324 | if (room) { | 324 | if (room) { |
325 | tty_insert_flip_string(tty, urb->transfer_buffer, room); | 325 | tty_insert_flip_string(tty, urb->transfer_buffer, room); |
326 | tty_flip_buffer_push(tty); /* is this allowed from an URB callback ? */ | 326 | tty_flip_buffer_push(tty); |
327 | } | 327 | } |
328 | } | 328 | } |
329 | 329 | ||
@@ -349,10 +349,12 @@ void usb_serial_generic_read_bulk_callback (struct urb *urb) | |||
349 | 349 | ||
350 | /* Throttle the device if requested by tty */ | 350 | /* Throttle the device if requested by tty */ |
351 | spin_lock_irqsave(&port->lock, flags); | 351 | spin_lock_irqsave(&port->lock, flags); |
352 | if (!(port->throttled = port->throttle_req)) | 352 | if (!(port->throttled = port->throttle_req)) { |
353 | /* Handle data and continue reading from device */ | 353 | spin_unlock_irqrestore(&port->lock, flags); |
354 | flush_and_resubmit_read_urb(port); | 354 | flush_and_resubmit_read_urb(port); |
355 | spin_unlock_irqrestore(&port->lock, flags); | 355 | } else { |
356 | spin_unlock_irqrestore(&port->lock, flags); | ||
357 | } | ||
356 | } | 358 | } |
357 | EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback); | 359 | EXPORT_SYMBOL_GPL(usb_serial_generic_read_bulk_callback); |
358 | 360 | ||
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 869ecd374cb4..aeeb9cb20999 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -110,11 +110,20 @@ | |||
110 | 110 | ||
111 | /* vendor id and device id defines */ | 111 | /* vendor id and device id defines */ |
112 | 112 | ||
113 | /* The native mos7840/7820 component */ | ||
113 | #define USB_VENDOR_ID_MOSCHIP 0x9710 | 114 | #define USB_VENDOR_ID_MOSCHIP 0x9710 |
114 | #define MOSCHIP_DEVICE_ID_7840 0x7840 | 115 | #define MOSCHIP_DEVICE_ID_7840 0x7840 |
115 | #define MOSCHIP_DEVICE_ID_7820 0x7820 | 116 | #define MOSCHIP_DEVICE_ID_7820 0x7820 |
117 | /* The native component can have its vendor/device id's overridden | ||
118 | * in vendor-specific implementations. Such devices can be handled | ||
119 | * by making a change here, in moschip_port_id_table, and in | ||
120 | * moschip_id_table_combined | ||
121 | */ | ||
122 | #define USB_VENDOR_ID_BANDB 0x0856 | ||
123 | #define BANDB_DEVICE_ID_USOPTL4_4 0xAC44 | ||
124 | #define BANDB_DEVICE_ID_USOPTL4_2 0xAC42 | ||
116 | 125 | ||
117 | /* Interrupt Rotinue Defines */ | 126 | /* Interrupt Routine Defines */ |
118 | 127 | ||
119 | #define SERIAL_IIR_RLS 0x06 | 128 | #define SERIAL_IIR_RLS 0x06 |
120 | #define SERIAL_IIR_MS 0x00 | 129 | #define SERIAL_IIR_MS 0x00 |
@@ -159,12 +168,16 @@ | |||
159 | static struct usb_device_id moschip_port_id_table[] = { | 168 | static struct usb_device_id moschip_port_id_table[] = { |
160 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, | 169 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, |
161 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, | 170 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, |
171 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, | ||
172 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, | ||
162 | {} /* terminating entry */ | 173 | {} /* terminating entry */ |
163 | }; | 174 | }; |
164 | 175 | ||
165 | static __devinitdata struct usb_device_id moschip_id_table_combined[] = { | 176 | static __devinitdata struct usb_device_id moschip_id_table_combined[] = { |
166 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, | 177 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, |
167 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, | 178 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, |
179 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, | ||
180 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, | ||
168 | {} /* terminating entry */ | 181 | {} /* terminating entry */ |
169 | }; | 182 | }; |
170 | 183 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index af2674c57414..a396fbbdc9c2 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -111,6 +111,42 @@ static int option_send_setup(struct usb_serial_port *port); | |||
111 | #define HUAWEI_PRODUCT_E220BIS 0x1004 | 111 | #define HUAWEI_PRODUCT_E220BIS 0x1004 |
112 | 112 | ||
113 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 | 113 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 |
114 | |||
115 | /* MERLIN EVDO PRODUCTS */ | ||
116 | #define NOVATELWIRELESS_PRODUCT_V640 0x1100 | ||
117 | #define NOVATELWIRELESS_PRODUCT_V620 0x1110 | ||
118 | #define NOVATELWIRELESS_PRODUCT_V740 0x1120 | ||
119 | #define NOVATELWIRELESS_PRODUCT_V720 0x1130 | ||
120 | |||
121 | /* MERLIN HSDPA/HSPA PRODUCTS */ | ||
122 | #define NOVATELWIRELESS_PRODUCT_U730 0x1400 | ||
123 | #define NOVATELWIRELESS_PRODUCT_U740 0x1410 | ||
124 | #define NOVATELWIRELESS_PRODUCT_U870 0x1420 | ||
125 | #define NOVATELWIRELESS_PRODUCT_XU870 0x1430 | ||
126 | #define NOVATELWIRELESS_PRODUCT_X950D 0x1450 | ||
127 | |||
128 | /* EXPEDITE PRODUCTS */ | ||
129 | #define NOVATELWIRELESS_PRODUCT_EV620 0x2100 | ||
130 | #define NOVATELWIRELESS_PRODUCT_ES720 0x2110 | ||
131 | #define NOVATELWIRELESS_PRODUCT_E725 0x2120 | ||
132 | #define NOVATELWIRELESS_PRODUCT_EU730 0x2400 | ||
133 | #define NOVATELWIRELESS_PRODUCT_EU740 0x2410 | ||
134 | #define NOVATELWIRELESS_PRODUCT_EU870D 0x2420 | ||
135 | |||
136 | /* OVATION PRODUCTS */ | ||
137 | #define NOVATELWIRELESS_PRODUCT_MC727 0x4100 | ||
138 | #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400 | ||
139 | |||
140 | /* FUTURE NOVATEL PRODUCTS */ | ||
141 | #define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000 | ||
142 | #define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000 | ||
143 | #define NOVATELWIRELESS_PRODUCT_EMBEDDED_1 0x8000 | ||
144 | #define NOVATELWIRELESS_PRODUCT_GLOBAL_1 0x9000 | ||
145 | #define NOVATELWIRELESS_PRODUCT_EVDO_2 0x6001 | ||
146 | #define NOVATELWIRELESS_PRODUCT_HSPA_2 0x7001 | ||
147 | #define NOVATELWIRELESS_PRODUCT_EMBEDDED_2 0x8001 | ||
148 | #define NOVATELWIRELESS_PRODUCT_GLOBAL_2 0x9001 | ||
149 | |||
114 | #define DELL_VENDOR_ID 0x413C | 150 | #define DELL_VENDOR_ID 0x413C |
115 | 151 | ||
116 | #define KYOCERA_VENDOR_ID 0x0c88 | 152 | #define KYOCERA_VENDOR_ID 0x0c88 |
@@ -120,6 +156,9 @@ static int option_send_setup(struct usb_serial_port *port); | |||
120 | #define ANYDATA_PRODUCT_ADU_E100A 0x6501 | 156 | #define ANYDATA_PRODUCT_ADU_E100A 0x6501 |
121 | #define ANYDATA_PRODUCT_ADU_500A 0x6502 | 157 | #define ANYDATA_PRODUCT_ADU_500A 0x6502 |
122 | 158 | ||
159 | #define AXESSTEL_VENDOR_ID 0x1726 | ||
160 | #define AXESSTEL_PRODUCT_MV110H 0x1000 | ||
161 | |||
123 | #define BANDRICH_VENDOR_ID 0x1A8D | 162 | #define BANDRICH_VENDOR_ID 0x1A8D |
124 | #define BANDRICH_PRODUCT_C100_1 0x1002 | 163 | #define BANDRICH_PRODUCT_C100_1 0x1002 |
125 | #define BANDRICH_PRODUCT_C100_2 0x1003 | 164 | #define BANDRICH_PRODUCT_C100_2 0x1003 |
@@ -165,21 +204,34 @@ static struct usb_device_id option_ids[] = { | |||
165 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 204 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
166 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) }, | 205 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) }, |
167 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) }, | 206 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) }, |
168 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1100) }, /* Novatel Merlin XS620/S640 */ | 207 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */ |
169 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1110) }, /* Novatel Merlin S620 */ | 208 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */ |
170 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1120) }, /* Novatel Merlin EX720 */ | 209 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, /* Novatel Merlin EX720/V740/X720 */ |
171 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1130) }, /* Novatel Merlin S720 */ | 210 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V720) }, /* Novatel Merlin V720/S720/PC720 */ |
172 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1400) }, /* Novatel U730 */ | 211 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U730) }, /* Novatel U730/U740 (VF version) */ |
173 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1410) }, /* Novatel U740 */ | 212 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U740) }, /* Novatel U740 */ |
174 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1420) }, /* Novatel EU870 */ | 213 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U870) }, /* Novatel U870 */ |
175 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */ | 214 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_XU870) }, /* Novatel Merlin XU870 HSDPA/3G */ |
176 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2100) }, /* Novatel EV620 CDMA/EV-DO */ | 215 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_X950D) }, /* Novatel X950D */ |
177 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2110) }, /* Novatel Merlin ES620 / Merlin ES720 / Ovation U720 */ | 216 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EV620) }, /* Novatel EV620/ES620 CDMA/EV-DO */ |
217 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_ES720) }, /* Novatel ES620/ES720/U720/USB720 */ | ||
218 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_E725) }, /* Novatel E725/E726 */ | ||
178 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2130) }, /* Novatel Merlin ES620 SM Bus */ | 219 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2130) }, /* Novatel Merlin ES620 SM Bus */ |
179 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2410) }, /* Novatel EU740 */ | 220 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU730) }, /* Novatel EU730 and Vodafone EU740 */ |
180 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x4100) }, /* Novatel U727 */ | 221 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU740) }, /* Novatel non-Vodafone EU740 */ |
181 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x4400) }, /* Novatel MC950 */ | 222 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */ |
223 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */ | ||
224 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */ | ||
182 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x5010) }, /* Novatel U727 */ | 225 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x5010) }, /* Novatel U727 */ |
226 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */ | ||
227 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */ | ||
228 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */ | ||
229 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_1) }, /* Novatel Global product */ | ||
230 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_2) }, /* Novatel EVDO product */ | ||
231 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_2) }, /* Novatel HSPA product */ | ||
232 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_2) }, /* Novatel Embedded product */ | ||
233 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_2) }, /* Novatel Global product */ | ||
234 | |||
183 | { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */ | 235 | { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */ |
184 | { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */ | 236 | { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */ |
185 | { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */ | 237 | { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */ |
@@ -192,6 +244,7 @@ static struct usb_device_id option_ids[] = { | |||
192 | { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */ | 244 | { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */ |
193 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, | 245 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, |
194 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, | 246 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, |
247 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, | ||
195 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, | 248 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, |
196 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, | 249 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, |
197 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | 250 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
diff --git a/drivers/usb/storage/protocol.c b/drivers/usb/storage/protocol.c index 958f5b17847c..b9b8ede61fb3 100644 --- a/drivers/usb/storage/protocol.c +++ b/drivers/usb/storage/protocol.c | |||
@@ -170,7 +170,6 @@ unsigned int usb_stor_access_xfer_buf(unsigned char *buffer, | |||
170 | 170 | ||
171 | if (!sg) | 171 | if (!sg) |
172 | sg = scsi_sglist(srb); | 172 | sg = scsi_sglist(srb); |
173 | buflen = min(buflen, scsi_bufflen(srb)); | ||
174 | 173 | ||
175 | /* This loop handles a single s-g list entry, which may | 174 | /* This loop handles a single s-g list entry, which may |
176 | * include multiple pages. Find the initial page structure | 175 | * include multiple pages. Find the initial page structure |
@@ -232,6 +231,7 @@ void usb_stor_set_xfer_buf(unsigned char *buffer, | |||
232 | unsigned int offset = 0; | 231 | unsigned int offset = 0; |
233 | struct scatterlist *sg = NULL; | 232 | struct scatterlist *sg = NULL; |
234 | 233 | ||
234 | buflen = min(buflen, scsi_bufflen(srb)); | ||
235 | buflen = usb_stor_access_xfer_buf(buffer, buflen, srb, &sg, &offset, | 235 | buflen = usb_stor_access_xfer_buf(buffer, buflen, srb, &sg, &offset, |
236 | TO_XFER_BUF); | 236 | TO_XFER_BUF); |
237 | if (buflen < scsi_bufflen(srb)) | 237 | if (buflen < scsi_bufflen(srb)) |
diff --git a/drivers/usb/storage/sddr55.c b/drivers/usb/storage/sddr55.c index d43a3415e12f..6d14327c921d 100644 --- a/drivers/usb/storage/sddr55.c +++ b/drivers/usb/storage/sddr55.c | |||
@@ -522,8 +522,8 @@ int sddr55_reset(struct us_data *us) { | |||
522 | 522 | ||
523 | static unsigned long sddr55_get_capacity(struct us_data *us) { | 523 | static unsigned long sddr55_get_capacity(struct us_data *us) { |
524 | 524 | ||
525 | unsigned char manufacturerID; | 525 | unsigned char uninitialized_var(manufacturerID); |
526 | unsigned char deviceID; | 526 | unsigned char uninitialized_var(deviceID); |
527 | int result; | 527 | int result; |
528 | struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra; | 528 | struct sddr55_card_info *info = (struct sddr55_card_info *)us->extra; |
529 | 529 | ||
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 758435f8a6f8..e0b0580705e4 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
@@ -553,6 +553,19 @@ config FB_BF54X_LQ043 | |||
553 | help | 553 | help |
554 | This is the framebuffer device driver for a SHARP LQ043T1DG01 TFT LCD | 554 | This is the framebuffer device driver for a SHARP LQ043T1DG01 TFT LCD |
555 | 555 | ||
556 | config FB_BFIN_T350MCQB | ||
557 | tristate "Varitronix COG-T350MCQB TFT LCD display (BF527 EZKIT)" | ||
558 | depends on FB && BLACKFIN | ||
559 | select BFIN_GPTIMERS | ||
560 | select FB_CFB_FILLRECT | ||
561 | select FB_CFB_COPYAREA | ||
562 | select FB_CFB_IMAGEBLIT | ||
563 | help | ||
564 | This is the framebuffer device driver for a Varitronix VL-PS-COG-T350MCQB-01 display TFT LCD | ||
565 | This display is a QVGA 320x240 24-bit RGB display interfaced by an 8-bit wide PPI | ||
566 | It uses PPI[0..7] PPI_FS1, PPI_FS2 and PPI_CLK. | ||
567 | |||
568 | |||
556 | config FB_STI | 569 | config FB_STI |
557 | tristate "HP STI frame buffer device support" | 570 | tristate "HP STI frame buffer device support" |
558 | depends on FB && PARISC | 571 | depends on FB && PARISC |
diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 83e02b3429b6..03371c789039 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile | |||
@@ -122,6 +122,7 @@ obj-$(CONFIG_FB_EFI) += efifb.o | |||
122 | obj-$(CONFIG_FB_VGA16) += vga16fb.o | 122 | obj-$(CONFIG_FB_VGA16) += vga16fb.o |
123 | obj-$(CONFIG_FB_OF) += offb.o | 123 | obj-$(CONFIG_FB_OF) += offb.o |
124 | obj-$(CONFIG_FB_BF54X_LQ043) += bf54x-lq043fb.o | 124 | obj-$(CONFIG_FB_BF54X_LQ043) += bf54x-lq043fb.o |
125 | obj-$(CONFIG_FB_BFIN_T350MCQB) += bfin-t350mcqb-fb.o | ||
125 | 126 | ||
126 | # the test framebuffer is last | 127 | # the test framebuffer is last |
127 | obj-$(CONFIG_FB_VIRTUAL) += vfb.o | 128 | obj-$(CONFIG_FB_VIRTUAL) += vfb.o |
diff --git a/drivers/video/bf54x-lq043fb.c b/drivers/video/bf54x-lq043fb.c index 0ce791e6f79c..986a550c0439 100644 --- a/drivers/video/bf54x-lq043fb.c +++ b/drivers/video/bf54x-lq043fb.c | |||
@@ -8,7 +8,7 @@ | |||
8 | * | 8 | * |
9 | * | 9 | * |
10 | * Modified: | 10 | * Modified: |
11 | * Copyright 2004-2007 Analog Devices Inc. | 11 | * Copyright 2007-2008 Analog Devices Inc. |
12 | * | 12 | * |
13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ |
14 | * | 14 | * |
@@ -241,7 +241,7 @@ static int request_ports(struct bfin_bf54xfb_info *fbi) | |||
241 | u16 eppi_req_18[] = EPPI0_18; | 241 | u16 eppi_req_18[] = EPPI0_18; |
242 | u16 disp = fbi->mach_info->disp; | 242 | u16 disp = fbi->mach_info->disp; |
243 | 243 | ||
244 | if (gpio_request(disp, NULL)) { | 244 | if (gpio_request(disp, DRIVER_NAME)) { |
245 | printk(KERN_ERR "Requesting GPIO %d faild\n", disp); | 245 | printk(KERN_ERR "Requesting GPIO %d faild\n", disp); |
246 | return -EFAULT; | 246 | return -EFAULT; |
247 | } | 247 | } |
@@ -672,7 +672,7 @@ static int __init bfin_bf54x_probe(struct platform_device *pdev) | |||
672 | &bfin_lq043fb_bl_ops); | 672 | &bfin_lq043fb_bl_ops); |
673 | bl_dev->props.max_brightness = 255; | 673 | bl_dev->props.max_brightness = 255; |
674 | 674 | ||
675 | lcd_dev = lcd_device_register(DRIVER_NAME, NULL, &bfin_lcd_ops); | 675 | lcd_dev = lcd_device_register(DRIVER_NAME, &pdev->dev, NULL, &bfin_lcd_ops); |
676 | lcd_dev->props.max_contrast = 255, printk(KERN_INFO "Done.\n"); | 676 | lcd_dev->props.max_contrast = 255, printk(KERN_INFO "Done.\n"); |
677 | #endif | 677 | #endif |
678 | 678 | ||
diff --git a/drivers/video/bfin-t350mcqb-fb.c b/drivers/video/bfin-t350mcqb-fb.c new file mode 100644 index 000000000000..a2bb2de9e020 --- /dev/null +++ b/drivers/video/bfin-t350mcqb-fb.c | |||
@@ -0,0 +1,685 @@ | |||
1 | /* | ||
2 | * File: drivers/video/bfin-t350mcqb-fb.c | ||
3 | * Based on: | ||
4 | * Author: Michael Hennerich <hennerich@blackfin.uclinux.org> | ||
5 | * | ||
6 | * Created: | ||
7 | * Description: Blackfin LCD Framebufer driver | ||
8 | * | ||
9 | * | ||
10 | * Modified: | ||
11 | * Copyright 2004-2007 Analog Devices Inc. | ||
12 | * | ||
13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | * This program is distributed in the hope that it will be useful, | ||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
23 | * GNU General Public License for more details. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License | ||
26 | * along with this program; if not, see the file COPYING, or write | ||
27 | * to the Free Software Foundation, Inc., | ||
28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
29 | */ | ||
30 | |||
31 | #include <linux/module.h> | ||
32 | #include <linux/kernel.h> | ||
33 | #include <linux/errno.h> | ||
34 | #include <linux/string.h> | ||
35 | #include <linux/fb.h> | ||
36 | #include <linux/init.h> | ||
37 | #include <linux/types.h> | ||
38 | #include <linux/interrupt.h> | ||
39 | #include <linux/device.h> | ||
40 | #include <linux/backlight.h> | ||
41 | #include <linux/lcd.h> | ||
42 | #include <linux/dma-mapping.h> | ||
43 | #include <linux/platform_device.h> | ||
44 | |||
45 | #include <asm/blackfin.h> | ||
46 | #include <asm/irq.h> | ||
47 | #include <asm/dma-mapping.h> | ||
48 | #include <asm/dma.h> | ||
49 | #include <asm/portmux.h> | ||
50 | #include <asm/gptimers.h> | ||
51 | |||
52 | #define NO_BL_SUPPORT | ||
53 | |||
54 | #define LCD_X_RES 320 /* Horizontal Resolution */ | ||
55 | #define LCD_Y_RES 240 /* Vertical Resolution */ | ||
56 | #define LCD_BPP 24 /* Bit Per Pixel */ | ||
57 | |||
58 | #define DMA_BUS_SIZE 16 | ||
59 | #define LCD_CLK (12*1000*1000) /* 12MHz */ | ||
60 | |||
61 | #define CLOCKS_PER_PIX 3 | ||
62 | |||
63 | /* | ||
64 | * HS and VS timing parameters (all in number of PPI clk ticks) | ||
65 | */ | ||
66 | |||
67 | #define U_LINE 1 /* Blanking Lines */ | ||
68 | |||
69 | #define H_ACTPIX (LCD_X_RES * CLOCKS_PER_PIX) /* active horizontal pixel */ | ||
70 | #define H_PERIOD (408 * CLOCKS_PER_PIX) /* HS period */ | ||
71 | #define H_PULSE 90 /* HS pulse width */ | ||
72 | #define H_START 204 /* first valid pixel */ | ||
73 | |||
74 | #define V_LINES (LCD_Y_RES + U_LINE) /* total vertical lines */ | ||
75 | #define V_PULSE (3 * H_PERIOD) /* VS pulse width (1-5 H_PERIODs) */ | ||
76 | #define V_PERIOD (H_PERIOD * V_LINES) /* VS period */ | ||
77 | |||
78 | #define ACTIVE_VIDEO_MEM_OFFSET (U_LINE * H_ACTPIX) | ||
79 | |||
80 | #define BFIN_LCD_NBR_PALETTE_ENTRIES 256 | ||
81 | |||
82 | #define DRIVER_NAME "bfin-t350mcqb" | ||
83 | static char driver_name[] = DRIVER_NAME; | ||
84 | |||
85 | struct bfin_t350mcqbfb_info { | ||
86 | struct fb_info *fb; | ||
87 | struct device *dev; | ||
88 | unsigned char *fb_buffer; /* RGB Buffer */ | ||
89 | dma_addr_t dma_handle; | ||
90 | int lq043_mmap; | ||
91 | int lq043_open_cnt; | ||
92 | int irq; | ||
93 | spinlock_t lock; /* lock */ | ||
94 | }; | ||
95 | |||
96 | static int nocursor; | ||
97 | module_param(nocursor, int, 0644); | ||
98 | MODULE_PARM_DESC(nocursor, "cursor enable/disable"); | ||
99 | |||
100 | #define PPI_TX_MODE 0x2 | ||
101 | #define PPI_XFER_TYPE_11 0xC | ||
102 | #define PPI_PORT_CFG_01 0x10 | ||
103 | #define PPI_PACK_EN 0x80 | ||
104 | #define PPI_POLS_1 0x8000 | ||
105 | |||
106 | static void bfin_t350mcqb_config_ppi(struct bfin_t350mcqbfb_info *fbi) | ||
107 | { | ||
108 | bfin_write_PPI_DELAY(H_START); | ||
109 | bfin_write_PPI_COUNT(H_ACTPIX-1); | ||
110 | bfin_write_PPI_FRAME(V_LINES); | ||
111 | |||
112 | bfin_write_PPI_CONTROL(PPI_TX_MODE | /* output mode , PORT_DIR */ | ||
113 | PPI_XFER_TYPE_11 | /* sync mode XFR_TYPE */ | ||
114 | PPI_PORT_CFG_01 | /* two frame sync PORT_CFG */ | ||
115 | PPI_PACK_EN | /* packing enabled PACK_EN */ | ||
116 | PPI_POLS_1); /* faling edge syncs POLS */ | ||
117 | } | ||
118 | |||
119 | static inline void bfin_t350mcqb_disable_ppi(void) | ||
120 | { | ||
121 | bfin_write_PPI_CONTROL(bfin_read_PPI_CONTROL() & ~PORT_EN); | ||
122 | } | ||
123 | |||
124 | static inline void bfin_t350mcqb_enable_ppi(void) | ||
125 | { | ||
126 | bfin_write_PPI_CONTROL(bfin_read_PPI_CONTROL() | PORT_EN); | ||
127 | } | ||
128 | |||
129 | static void bfin_t350mcqb_start_timers(void) | ||
130 | { | ||
131 | unsigned long flags; | ||
132 | |||
133 | local_irq_save(flags); | ||
134 | enable_gptimers(TIMER1bit); | ||
135 | enable_gptimers(TIMER0bit); | ||
136 | local_irq_restore(flags); | ||
137 | } | ||
138 | |||
139 | static void bfin_t350mcqb_stop_timers(void) | ||
140 | { | ||
141 | disable_gptimers(TIMER0bit | TIMER1bit); | ||
142 | |||
143 | set_gptimer_status(0, TIMER_STATUS_TRUN0 | TIMER_STATUS_TRUN1 | | ||
144 | TIMER_STATUS_TIMIL0 | TIMER_STATUS_TIMIL1 | | ||
145 | TIMER_STATUS_TOVF0 | TIMER_STATUS_TOVF1); | ||
146 | |||
147 | } | ||
148 | |||
149 | static void bfin_t350mcqb_init_timers(void) | ||
150 | { | ||
151 | |||
152 | bfin_t350mcqb_stop_timers(); | ||
153 | |||
154 | set_gptimer_period(TIMER0_id, H_PERIOD); | ||
155 | set_gptimer_pwidth(TIMER0_id, H_PULSE); | ||
156 | set_gptimer_config(TIMER0_id, TIMER_MODE_PWM | TIMER_PERIOD_CNT | | ||
157 | TIMER_TIN_SEL | TIMER_CLK_SEL| | ||
158 | TIMER_EMU_RUN); | ||
159 | |||
160 | set_gptimer_period(TIMER1_id, V_PERIOD); | ||
161 | set_gptimer_pwidth(TIMER1_id, V_PULSE); | ||
162 | set_gptimer_config(TIMER1_id, TIMER_MODE_PWM | TIMER_PERIOD_CNT | | ||
163 | TIMER_TIN_SEL | TIMER_CLK_SEL | | ||
164 | TIMER_EMU_RUN); | ||
165 | |||
166 | } | ||
167 | |||
168 | static void bfin_t350mcqb_config_dma(struct bfin_t350mcqbfb_info *fbi) | ||
169 | { | ||
170 | |||
171 | set_dma_config(CH_PPI, | ||
172 | set_bfin_dma_config(DIR_READ, DMA_FLOW_AUTO, | ||
173 | INTR_DISABLE, DIMENSION_2D, | ||
174 | DATA_SIZE_16, | ||
175 | DMA_NOSYNC_KEEP_DMA_BUF)); | ||
176 | set_dma_x_count(CH_PPI, (LCD_X_RES * LCD_BPP) / DMA_BUS_SIZE); | ||
177 | set_dma_x_modify(CH_PPI, DMA_BUS_SIZE / 8); | ||
178 | set_dma_y_count(CH_PPI, V_LINES); | ||
179 | |||
180 | set_dma_y_modify(CH_PPI, DMA_BUS_SIZE / 8); | ||
181 | set_dma_start_addr(CH_PPI, (unsigned long)fbi->fb_buffer); | ||
182 | |||
183 | } | ||
184 | |||
185 | static int bfin_t350mcqb_request_ports(int action) | ||
186 | { | ||
187 | u16 ppi0_req_8[] = {P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, | ||
188 | P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, | ||
189 | P_PPI0_D3, P_PPI0_D4, P_PPI0_D5, | ||
190 | P_PPI0_D6, P_PPI0_D7, 0}; | ||
191 | |||
192 | if (action) { | ||
193 | if (peripheral_request_list(ppi0_req_8, DRIVER_NAME)) { | ||
194 | printk(KERN_ERR "Requesting Peripherals faild\n"); | ||
195 | return -EFAULT; | ||
196 | } | ||
197 | } else | ||
198 | peripheral_free_list(ppi0_req_8); | ||
199 | |||
200 | return 0; | ||
201 | } | ||
202 | |||
203 | static int bfin_t350mcqb_fb_open(struct fb_info *info, int user) | ||
204 | { | ||
205 | struct bfin_t350mcqbfb_info *fbi = info->par; | ||
206 | |||
207 | spin_lock(&fbi->lock); | ||
208 | fbi->lq043_open_cnt++; | ||
209 | |||
210 | if (fbi->lq043_open_cnt <= 1) { | ||
211 | |||
212 | bfin_t350mcqb_disable_ppi(); | ||
213 | SSYNC(); | ||
214 | |||
215 | bfin_t350mcqb_config_dma(fbi); | ||
216 | bfin_t350mcqb_config_ppi(fbi); | ||
217 | bfin_t350mcqb_init_timers(); | ||
218 | |||
219 | /* start dma */ | ||
220 | enable_dma(CH_PPI); | ||
221 | bfin_t350mcqb_enable_ppi(); | ||
222 | bfin_t350mcqb_start_timers(); | ||
223 | } | ||
224 | |||
225 | spin_unlock(&fbi->lock); | ||
226 | |||
227 | return 0; | ||
228 | } | ||
229 | |||
230 | static int bfin_t350mcqb_fb_release(struct fb_info *info, int user) | ||
231 | { | ||
232 | struct bfin_t350mcqbfb_info *fbi = info->par; | ||
233 | |||
234 | spin_lock(&fbi->lock); | ||
235 | |||
236 | fbi->lq043_open_cnt--; | ||
237 | fbi->lq043_mmap = 0; | ||
238 | |||
239 | if (fbi->lq043_open_cnt <= 0) { | ||
240 | bfin_t350mcqb_disable_ppi(); | ||
241 | SSYNC(); | ||
242 | disable_dma(CH_PPI); | ||
243 | bfin_t350mcqb_stop_timers(); | ||
244 | memset(fbi->fb_buffer, 0, info->fix.smem_len); | ||
245 | } | ||
246 | |||
247 | spin_unlock(&fbi->lock); | ||
248 | |||
249 | return 0; | ||
250 | } | ||
251 | |||
252 | static int bfin_t350mcqb_fb_check_var(struct fb_var_screeninfo *var, | ||
253 | struct fb_info *info) | ||
254 | { | ||
255 | |||
256 | if (var->bits_per_pixel != LCD_BPP) { | ||
257 | pr_debug("%s: depth not supported: %u BPP\n", __FUNCTION__, | ||
258 | var->bits_per_pixel); | ||
259 | return -EINVAL; | ||
260 | } | ||
261 | |||
262 | if (info->var.xres != var->xres || info->var.yres != var->yres || | ||
263 | info->var.xres_virtual != var->xres_virtual || | ||
264 | info->var.yres_virtual != var->yres_virtual) { | ||
265 | pr_debug("%s: Resolution not supported: X%u x Y%u \n", | ||
266 | __FUNCTION__, var->xres, var->yres); | ||
267 | return -EINVAL; | ||
268 | } | ||
269 | |||
270 | /* | ||
271 | * Memory limit | ||
272 | */ | ||
273 | |||
274 | if ((info->fix.line_length * var->yres_virtual) > info->fix.smem_len) { | ||
275 | pr_debug("%s: Memory Limit requested yres_virtual = %u\n", | ||
276 | __FUNCTION__, var->yres_virtual); | ||
277 | return -ENOMEM; | ||
278 | } | ||
279 | |||
280 | return 0; | ||
281 | } | ||
282 | |||
283 | static int bfin_t350mcqb_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) | ||
284 | { | ||
285 | struct bfin_t350mcqbfb_info *fbi = info->par; | ||
286 | |||
287 | if (fbi->lq043_mmap) | ||
288 | return -1; | ||
289 | |||
290 | spin_lock(&fbi->lock); | ||
291 | fbi->lq043_mmap = 1; | ||
292 | spin_unlock(&fbi->lock); | ||
293 | |||
294 | vma->vm_start = (unsigned long)(fbi->fb_buffer + ACTIVE_VIDEO_MEM_OFFSET); | ||
295 | |||
296 | vma->vm_end = vma->vm_start + info->fix.smem_len; | ||
297 | /* For those who don't understand how mmap works, go read | ||
298 | * Documentation/nommu-mmap.txt. | ||
299 | * For those that do, you will know that the VM_MAYSHARE flag | ||
300 | * must be set in the vma->vm_flags structure on noMMU | ||
301 | * Other flags can be set, and are documented in | ||
302 | * include/linux/mm.h | ||
303 | */ | ||
304 | vma->vm_flags |= VM_MAYSHARE; | ||
305 | |||
306 | return 0; | ||
307 | } | ||
308 | |||
309 | int bfin_t350mcqb_fb_cursor(struct fb_info *info, struct fb_cursor *cursor) | ||
310 | { | ||
311 | if (nocursor) | ||
312 | return 0; | ||
313 | else | ||
314 | return -EINVAL; /* just to force soft_cursor() call */ | ||
315 | } | ||
316 | |||
317 | static int bfin_t350mcqb_fb_setcolreg(u_int regno, u_int red, u_int green, | ||
318 | u_int blue, u_int transp, | ||
319 | struct fb_info *info) | ||
320 | { | ||
321 | if (regno >= BFIN_LCD_NBR_PALETTE_ENTRIES) | ||
322 | return -EINVAL; | ||
323 | |||
324 | if (info->var.grayscale) { | ||
325 | /* grayscale = 0.30*R + 0.59*G + 0.11*B */ | ||
326 | red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8; | ||
327 | } | ||
328 | |||
329 | if (info->fix.visual == FB_VISUAL_TRUECOLOR) { | ||
330 | |||
331 | u32 value; | ||
332 | /* Place color in the pseudopalette */ | ||
333 | if (regno > 16) | ||
334 | return -EINVAL; | ||
335 | |||
336 | red >>= (16 - info->var.red.length); | ||
337 | green >>= (16 - info->var.green.length); | ||
338 | blue >>= (16 - info->var.blue.length); | ||
339 | |||
340 | value = (red << info->var.red.offset) | | ||
341 | (green << info->var.green.offset) | | ||
342 | (blue << info->var.blue.offset); | ||
343 | value &= 0xFFFFFF; | ||
344 | |||
345 | ((u32 *) (info->pseudo_palette))[regno] = value; | ||
346 | |||
347 | } | ||
348 | |||
349 | return 0; | ||
350 | } | ||
351 | |||
352 | static struct fb_ops bfin_t350mcqb_fb_ops = { | ||
353 | .owner = THIS_MODULE, | ||
354 | .fb_open = bfin_t350mcqb_fb_open, | ||
355 | .fb_release = bfin_t350mcqb_fb_release, | ||
356 | .fb_check_var = bfin_t350mcqb_fb_check_var, | ||
357 | .fb_fillrect = cfb_fillrect, | ||
358 | .fb_copyarea = cfb_copyarea, | ||
359 | .fb_imageblit = cfb_imageblit, | ||
360 | .fb_mmap = bfin_t350mcqb_fb_mmap, | ||
361 | .fb_cursor = bfin_t350mcqb_fb_cursor, | ||
362 | .fb_setcolreg = bfin_t350mcqb_fb_setcolreg, | ||
363 | }; | ||
364 | |||
365 | #ifndef NO_BL_SUPPORT | ||
366 | static int bl_get_brightness(struct backlight_device *bd) | ||
367 | { | ||
368 | return 0; | ||
369 | } | ||
370 | |||
371 | static struct backlight_ops bfin_lq043fb_bl_ops = { | ||
372 | .get_brightness = bl_get_brightness, | ||
373 | }; | ||
374 | |||
375 | static struct backlight_device *bl_dev; | ||
376 | |||
377 | static int bfin_lcd_get_power(struct lcd_device *dev) | ||
378 | { | ||
379 | return 0; | ||
380 | } | ||
381 | |||
382 | static int bfin_lcd_set_power(struct lcd_device *dev, int power) | ||
383 | { | ||
384 | return 0; | ||
385 | } | ||
386 | |||
387 | static int bfin_lcd_get_contrast(struct lcd_device *dev) | ||
388 | { | ||
389 | return 0; | ||
390 | } | ||
391 | |||
392 | static int bfin_lcd_set_contrast(struct lcd_device *dev, int contrast) | ||
393 | { | ||
394 | |||
395 | return 0; | ||
396 | } | ||
397 | |||
398 | static int bfin_lcd_check_fb(struct fb_info *fi) | ||
399 | { | ||
400 | if (!fi || (fi == &bfin_t350mcqb_fb)) | ||
401 | return 1; | ||
402 | return 0; | ||
403 | } | ||
404 | |||
405 | static struct lcd_ops bfin_lcd_ops = { | ||
406 | .get_power = bfin_lcd_get_power, | ||
407 | .set_power = bfin_lcd_set_power, | ||
408 | .get_contrast = bfin_lcd_get_contrast, | ||
409 | .set_contrast = bfin_lcd_set_contrast, | ||
410 | .check_fb = bfin_lcd_check_fb, | ||
411 | }; | ||
412 | |||
413 | static struct lcd_device *lcd_dev; | ||
414 | #endif | ||
415 | |||
416 | static irqreturn_t bfin_t350mcqb_irq_error(int irq, void *dev_id) | ||
417 | { | ||
418 | /*struct bfin_t350mcqbfb_info *info = (struct bfin_t350mcqbfb_info *)dev_id;*/ | ||
419 | |||
420 | u16 status = bfin_read_PPI_STATUS(); | ||
421 | bfin_write_PPI_STATUS(0xFFFF); | ||
422 | |||
423 | if (status) { | ||
424 | bfin_t350mcqb_disable_ppi(); | ||
425 | disable_dma(CH_PPI); | ||
426 | |||
427 | /* start dma */ | ||
428 | enable_dma(CH_PPI); | ||
429 | bfin_t350mcqb_enable_ppi(); | ||
430 | bfin_write_PPI_STATUS(0xFFFF); | ||
431 | } | ||
432 | |||
433 | return IRQ_HANDLED; | ||
434 | } | ||
435 | |||
436 | static int __init bfin_t350mcqb_probe(struct platform_device *pdev) | ||
437 | { | ||
438 | struct bfin_t350mcqbfb_info *info; | ||
439 | struct fb_info *fbinfo; | ||
440 | int ret; | ||
441 | |||
442 | printk(KERN_INFO DRIVER_NAME ": %dx%d %d-bit RGB FrameBuffer initializing...\n", | ||
443 | LCD_X_RES, LCD_Y_RES, LCD_BPP); | ||
444 | |||
445 | if (request_dma(CH_PPI, "CH_PPI") < 0) { | ||
446 | printk(KERN_ERR DRIVER_NAME | ||
447 | ": couldn't request CH_PPI DMA\n"); | ||
448 | ret = -EFAULT; | ||
449 | goto out1; | ||
450 | } | ||
451 | |||
452 | fbinfo = | ||
453 | framebuffer_alloc(sizeof(struct bfin_t350mcqbfb_info), &pdev->dev); | ||
454 | if (!fbinfo) { | ||
455 | ret = -ENOMEM; | ||
456 | goto out2; | ||
457 | } | ||
458 | |||
459 | info = fbinfo->par; | ||
460 | info->fb = fbinfo; | ||
461 | info->dev = &pdev->dev; | ||
462 | |||
463 | platform_set_drvdata(pdev, fbinfo); | ||
464 | |||
465 | strcpy(fbinfo->fix.id, driver_name); | ||
466 | |||
467 | fbinfo->fix.type = FB_TYPE_PACKED_PIXELS; | ||
468 | fbinfo->fix.type_aux = 0; | ||
469 | fbinfo->fix.xpanstep = 0; | ||
470 | fbinfo->fix.ypanstep = 0; | ||
471 | fbinfo->fix.ywrapstep = 0; | ||
472 | fbinfo->fix.accel = FB_ACCEL_NONE; | ||
473 | fbinfo->fix.visual = FB_VISUAL_TRUECOLOR; | ||
474 | |||
475 | fbinfo->var.nonstd = 0; | ||
476 | fbinfo->var.activate = FB_ACTIVATE_NOW; | ||
477 | fbinfo->var.height = -1; | ||
478 | fbinfo->var.width = -1; | ||
479 | fbinfo->var.accel_flags = 0; | ||
480 | fbinfo->var.vmode = FB_VMODE_NONINTERLACED; | ||
481 | |||
482 | fbinfo->var.xres = LCD_X_RES; | ||
483 | fbinfo->var.xres_virtual = LCD_X_RES; | ||
484 | fbinfo->var.yres = LCD_Y_RES; | ||
485 | fbinfo->var.yres_virtual = LCD_Y_RES; | ||
486 | fbinfo->var.bits_per_pixel = LCD_BPP; | ||
487 | |||
488 | fbinfo->var.red.offset = 0; | ||
489 | fbinfo->var.green.offset = 8; | ||
490 | fbinfo->var.blue.offset = 16; | ||
491 | fbinfo->var.transp.offset = 0; | ||
492 | fbinfo->var.red.length = 8; | ||
493 | fbinfo->var.green.length = 8; | ||
494 | fbinfo->var.blue.length = 8; | ||
495 | fbinfo->var.transp.length = 0; | ||
496 | fbinfo->fix.smem_len = LCD_X_RES * LCD_Y_RES * LCD_BPP / 8; | ||
497 | |||
498 | fbinfo->fix.line_length = fbinfo->var.xres_virtual * | ||
499 | fbinfo->var.bits_per_pixel / 8; | ||
500 | |||
501 | |||
502 | fbinfo->fbops = &bfin_t350mcqb_fb_ops; | ||
503 | fbinfo->flags = FBINFO_FLAG_DEFAULT; | ||
504 | |||
505 | info->fb_buffer = | ||
506 | dma_alloc_coherent(NULL, fbinfo->fix.smem_len, &info->dma_handle, | ||
507 | GFP_KERNEL); | ||
508 | |||
509 | if (NULL == info->fb_buffer) { | ||
510 | printk(KERN_ERR DRIVER_NAME | ||
511 | ": couldn't allocate dma buffer.\n"); | ||
512 | ret = -ENOMEM; | ||
513 | goto out3; | ||
514 | } | ||
515 | |||
516 | memset(info->fb_buffer, 0, fbinfo->fix.smem_len); | ||
517 | |||
518 | fbinfo->screen_base = (void *)info->fb_buffer + ACTIVE_VIDEO_MEM_OFFSET; | ||
519 | fbinfo->fix.smem_start = (int)info->fb_buffer + ACTIVE_VIDEO_MEM_OFFSET; | ||
520 | |||
521 | fbinfo->fbops = &bfin_t350mcqb_fb_ops; | ||
522 | |||
523 | fbinfo->pseudo_palette = kmalloc(sizeof(u32) * 16, GFP_KERNEL); | ||
524 | if (!fbinfo->pseudo_palette) { | ||
525 | printk(KERN_ERR DRIVER_NAME | ||
526 | "Fail to allocate pseudo_palette\n"); | ||
527 | |||
528 | ret = -ENOMEM; | ||
529 | goto out4; | ||
530 | } | ||
531 | |||
532 | memset(fbinfo->pseudo_palette, 0, sizeof(u32) * 16); | ||
533 | |||
534 | if (fb_alloc_cmap(&fbinfo->cmap, BFIN_LCD_NBR_PALETTE_ENTRIES, 0) | ||
535 | < 0) { | ||
536 | printk(KERN_ERR DRIVER_NAME | ||
537 | "Fail to allocate colormap (%d entries)\n", | ||
538 | BFIN_LCD_NBR_PALETTE_ENTRIES); | ||
539 | ret = -EFAULT; | ||
540 | goto out5; | ||
541 | } | ||
542 | |||
543 | if (bfin_t350mcqb_request_ports(1)) { | ||
544 | printk(KERN_ERR DRIVER_NAME ": couldn't request gpio port.\n"); | ||
545 | ret = -EFAULT; | ||
546 | goto out6; | ||
547 | } | ||
548 | |||
549 | info->irq = platform_get_irq(pdev, 0); | ||
550 | if (info->irq < 0) { | ||
551 | ret = -EINVAL; | ||
552 | goto out7; | ||
553 | } | ||
554 | |||
555 | if (request_irq(info->irq, (void *)bfin_t350mcqb_irq_error, IRQF_DISABLED, | ||
556 | "PPI ERROR", info) < 0) { | ||
557 | printk(KERN_ERR DRIVER_NAME | ||
558 | ": unable to request PPI ERROR IRQ\n"); | ||
559 | ret = -EFAULT; | ||
560 | goto out7; | ||
561 | } | ||
562 | |||
563 | if (register_framebuffer(fbinfo) < 0) { | ||
564 | printk(KERN_ERR DRIVER_NAME | ||
565 | ": unable to register framebuffer.\n"); | ||
566 | ret = -EINVAL; | ||
567 | goto out8; | ||
568 | } | ||
569 | #ifndef NO_BL_SUPPORT | ||
570 | bl_dev = | ||
571 | backlight_device_register("bf52x-bl", NULL, NULL, | ||
572 | &bfin_lq043fb_bl_ops); | ||
573 | bl_dev->props.max_brightness = 255; | ||
574 | |||
575 | lcd_dev = lcd_device_register(DRIVER_NAME, NULL, &bfin_lcd_ops); | ||
576 | lcd_dev->props.max_contrast = 255, printk(KERN_INFO "Done.\n"); | ||
577 | #endif | ||
578 | |||
579 | return 0; | ||
580 | |||
581 | out8: | ||
582 | free_irq(info->irq, info); | ||
583 | out7: | ||
584 | bfin_t350mcqb_request_ports(0); | ||
585 | out6: | ||
586 | fb_dealloc_cmap(&fbinfo->cmap); | ||
587 | out5: | ||
588 | kfree(fbinfo->pseudo_palette); | ||
589 | out4: | ||
590 | dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, | ||
591 | info->dma_handle); | ||
592 | out3: | ||
593 | framebuffer_release(fbinfo); | ||
594 | out2: | ||
595 | free_dma(CH_PPI); | ||
596 | out1: | ||
597 | platform_set_drvdata(pdev, NULL); | ||
598 | |||
599 | return ret; | ||
600 | } | ||
601 | |||
602 | static int bfin_t350mcqb_remove(struct platform_device *pdev) | ||
603 | { | ||
604 | |||
605 | struct fb_info *fbinfo = platform_get_drvdata(pdev); | ||
606 | struct bfin_t350mcqbfb_info *info = fbinfo->par; | ||
607 | |||
608 | free_dma(CH_PPI); | ||
609 | free_irq(info->irq, info); | ||
610 | |||
611 | if (info->fb_buffer != NULL) | ||
612 | dma_free_coherent(NULL, fbinfo->fix.smem_len, info->fb_buffer, | ||
613 | info->dma_handle); | ||
614 | |||
615 | kfree(fbinfo->pseudo_palette); | ||
616 | fb_dealloc_cmap(&fbinfo->cmap); | ||
617 | |||
618 | #ifndef NO_BL_SUPPORT | ||
619 | lcd_device_unregister(lcd_dev); | ||
620 | backlight_device_unregister(bl_dev); | ||
621 | #endif | ||
622 | |||
623 | unregister_framebuffer(fbinfo); | ||
624 | |||
625 | bfin_t350mcqb_request_ports(0); | ||
626 | |||
627 | printk(KERN_INFO DRIVER_NAME ": Unregister LCD driver.\n"); | ||
628 | |||
629 | return 0; | ||
630 | } | ||
631 | |||
632 | #ifdef CONFIG_PM | ||
633 | static int bfin_t350mcqb_suspend(struct platform_device *pdev, pm_message_t state) | ||
634 | { | ||
635 | struct fb_info *fbinfo = platform_get_drvdata(pdev); | ||
636 | struct bfin_t350mcqbfb_info *info = fbinfo->par; | ||
637 | |||
638 | bfin_t350mcqb_disable_ppi(); | ||
639 | disable_dma(CH_PPI); | ||
640 | bfin_write_PPI_STATUS(0xFFFF); | ||
641 | |||
642 | return 0; | ||
643 | } | ||
644 | |||
645 | static int bfin_t350mcqb_resume(struct platform_device *pdev) | ||
646 | { | ||
647 | struct fb_info *fbinfo = platform_get_drvdata(pdev); | ||
648 | struct bfin_t350mcqbfb_info *info = fbinfo->par; | ||
649 | |||
650 | enable_dma(CH_PPI); | ||
651 | bfin_t350mcqb_enable_ppi(); | ||
652 | |||
653 | return 0; | ||
654 | } | ||
655 | #else | ||
656 | #define bfin_t350mcqb_suspend NULL | ||
657 | #define bfin_t350mcqb_resume NULL | ||
658 | #endif | ||
659 | |||
660 | static struct platform_driver bfin_t350mcqb_driver = { | ||
661 | .probe = bfin_t350mcqb_probe, | ||
662 | .remove = bfin_t350mcqb_remove, | ||
663 | .suspend = bfin_t350mcqb_suspend, | ||
664 | .resume = bfin_t350mcqb_resume, | ||
665 | .driver = { | ||
666 | .name = DRIVER_NAME, | ||
667 | .owner = THIS_MODULE, | ||
668 | }, | ||
669 | }; | ||
670 | |||
671 | static int __devinit bfin_t350mcqb_driver_init(void) | ||
672 | { | ||
673 | return platform_driver_register(&bfin_t350mcqb_driver); | ||
674 | } | ||
675 | |||
676 | static void __exit bfin_t350mcqb_driver_cleanup(void) | ||
677 | { | ||
678 | platform_driver_unregister(&bfin_t350mcqb_driver); | ||
679 | } | ||
680 | |||
681 | MODULE_DESCRIPTION("Blackfin TFT LCD Driver"); | ||
682 | MODULE_LICENSE("GPL"); | ||
683 | |||
684 | module_init(bfin_t350mcqb_driver_init); | ||
685 | module_exit(bfin_t350mcqb_driver_cleanup); | ||
diff --git a/drivers/video/hitfb.c b/drivers/video/hitfb.c index 756c0ce85911..392a8be6aa76 100644 --- a/drivers/video/hitfb.c +++ b/drivers/video/hitfb.c | |||
@@ -403,7 +403,7 @@ static int __init hitfb_probe(struct platform_device *dev) | |||
403 | return 0; | 403 | return 0; |
404 | } | 404 | } |
405 | 405 | ||
406 | static int __devexit hitfb_remove(struct platform_device *dev) | 406 | static int __exit hitfb_remove(struct platform_device *dev) |
407 | { | 407 | { |
408 | return unregister_framebuffer(&fb_info); | 408 | return unregister_framebuffer(&fb_info); |
409 | } | 409 | } |
@@ -439,7 +439,7 @@ static int hitfb_resume(struct platform_device *dev) | |||
439 | 439 | ||
440 | static struct platform_driver hitfb_driver = { | 440 | static struct platform_driver hitfb_driver = { |
441 | .probe = hitfb_probe, | 441 | .probe = hitfb_probe, |
442 | .remove = __devexit_p(hitfb_remove), | 442 | .remove = __exit_p(hitfb_remove), |
443 | #ifdef CONFIG_PM | 443 | #ifdef CONFIG_PM |
444 | .suspend = hitfb_suspend, | 444 | .suspend = hitfb_suspend, |
445 | .resume = hitfb_resume, | 445 | .resume = hitfb_resume, |
diff --git a/drivers/video/mbx/mbxfb.c b/drivers/video/mbx/mbxfb.c index 80cd117ca65c..01f77bcc68f9 100644 --- a/drivers/video/mbx/mbxfb.c +++ b/drivers/video/mbx/mbxfb.c | |||
@@ -889,7 +889,7 @@ static int __devinit mbxfb_probe(struct platform_device *dev) | |||
889 | struct mbxfb_info *mfbi; | 889 | struct mbxfb_info *mfbi; |
890 | struct mbxfb_platform_data *pdata; | 890 | struct mbxfb_platform_data *pdata; |
891 | 891 | ||
892 | dev_dbg(dev, "mbxfb_probe\n"); | 892 | dev_dbg(&dev->dev, "mbxfb_probe\n"); |
893 | 893 | ||
894 | pdata = dev->dev.platform_data; | 894 | pdata = dev->dev.platform_data; |
895 | if (!pdata) { | 895 | if (!pdata) { |
diff --git a/drivers/video/pvr2fb.c b/drivers/video/pvr2fb.c index 6a3d0b574897..8c863a7f654b 100644 --- a/drivers/video/pvr2fb.c +++ b/drivers/video/pvr2fb.c | |||
@@ -1,16 +1,12 @@ | |||
1 | /* drivers/video/pvr2fb.c | 1 | /* |
2 | * drivers/video/pvr2fb.c | ||
2 | * | 3 | * |
3 | * Frame buffer and fbcon support for the NEC PowerVR2 found within the Sega | 4 | * Frame buffer and fbcon support for the NEC PowerVR2 found within the Sega |
4 | * Dreamcast. | 5 | * Dreamcast. |
5 | * | 6 | * |
6 | * Copyright (c) 2001 M. R. Brown <mrbrown@0xd6.org> | 7 | * Copyright (c) 2001 M. R. Brown <mrbrown@0xd6.org> |
7 | * Copyright (c) 2001, 2002, 2003, 2004, 2005 Paul Mundt <lethal@linux-sh.org> | 8 | * Copyright (c) 2001 - 2008 Paul Mundt <lethal@linux-sh.org> |
8 | * | ||
9 | * This file is part of the LinuxDC project (linuxdc.sourceforge.net). | ||
10 | * | 9 | * |
11 | */ | ||
12 | |||
13 | /* | ||
14 | * This driver is mostly based on the excellent amifb and vfb sources. It uses | 10 | * This driver is mostly based on the excellent amifb and vfb sources. It uses |
15 | * an odd scheme for converting hardware values to/from framebuffer values, | 11 | * an odd scheme for converting hardware values to/from framebuffer values, |
16 | * here are some hacked-up formulas: | 12 | * here are some hacked-up formulas: |
@@ -490,7 +486,7 @@ static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) | |||
490 | } else { | 486 | } else { |
491 | var->sync &= ~FB_SYNC_BROADCAST; | 487 | var->sync &= ~FB_SYNC_BROADCAST; |
492 | var->vmode &= ~FB_VMODE_INTERLACED; | 488 | var->vmode &= ~FB_VMODE_INTERLACED; |
493 | var->vmode |= pvr2_var.vmode; | 489 | var->vmode |= FB_VMODE_NONINTERLACED; |
494 | } | 490 | } |
495 | 491 | ||
496 | if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_TEST) { | 492 | if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_TEST) { |
diff --git a/drivers/video/sm501fb.c b/drivers/video/sm501fb.c index e83dfba7e636..742b5c656d66 100644 --- a/drivers/video/sm501fb.c +++ b/drivers/video/sm501fb.c | |||
@@ -237,12 +237,14 @@ static int sm501fb_check_var(struct fb_var_screeninfo *var, | |||
237 | 237 | ||
238 | /* check we can fit these values into the registers */ | 238 | /* check we can fit these values into the registers */ |
239 | 239 | ||
240 | if (var->hsync_len > 255 || var->vsync_len > 255) | 240 | if (var->hsync_len > 255 || var->vsync_len > 63) |
241 | return -EINVAL; | 241 | return -EINVAL; |
242 | 242 | ||
243 | if ((var->xres + var->right_margin) >= 4096) | 243 | /* hdisplay end and hsync start */ |
244 | if ((var->xres + var->right_margin) > 4096) | ||
244 | return -EINVAL; | 245 | return -EINVAL; |
245 | 246 | ||
247 | /* vdisplay end and vsync start */ | ||
246 | if ((var->yres + var->lower_margin) > 2048) | 248 | if ((var->yres + var->lower_margin) > 2048) |
247 | return -EINVAL; | 249 | return -EINVAL; |
248 | 250 | ||
@@ -281,19 +283,21 @@ static int sm501fb_check_var(struct fb_var_screeninfo *var, | |||
281 | var->blue.length = var->bits_per_pixel; | 283 | var->blue.length = var->bits_per_pixel; |
282 | var->blue.offset = 0; | 284 | var->blue.offset = 0; |
283 | var->transp.length = 0; | 285 | var->transp.length = 0; |
286 | var->transp.offset = 0; | ||
284 | 287 | ||
285 | break; | 288 | break; |
286 | 289 | ||
287 | case 16: | 290 | case 16: |
288 | if (sm->pdata->flags & SM501_FBPD_SWAP_FB_ENDIAN) { | 291 | if (sm->pdata->flags & SM501_FBPD_SWAP_FB_ENDIAN) { |
289 | var->red.offset = 11; | ||
290 | var->green.offset = 5; | ||
291 | var->blue.offset = 0; | ||
292 | } else { | ||
293 | var->blue.offset = 11; | 292 | var->blue.offset = 11; |
294 | var->green.offset = 5; | 293 | var->green.offset = 5; |
295 | var->red.offset = 0; | 294 | var->red.offset = 0; |
295 | } else { | ||
296 | var->red.offset = 11; | ||
297 | var->green.offset = 5; | ||
298 | var->blue.offset = 0; | ||
296 | } | 299 | } |
300 | var->transp.offset = 0; | ||
297 | 301 | ||
298 | var->red.length = 5; | 302 | var->red.length = 5; |
299 | var->green.length = 6; | 303 | var->green.length = 6; |
@@ -397,7 +401,7 @@ static int sm501fb_set_par_common(struct fb_info *info, | |||
397 | break; | 401 | break; |
398 | 402 | ||
399 | case 16: | 403 | case 16: |
400 | info->fix.visual = FB_VISUAL_DIRECTCOLOR; | 404 | info->fix.visual = FB_VISUAL_TRUECOLOR; |
401 | break; | 405 | break; |
402 | 406 | ||
403 | case 32: | 407 | case 32: |
@@ -613,6 +617,7 @@ static int sm501fb_set_par_crt(struct fb_info *info) | |||
613 | 617 | ||
614 | case 16: | 618 | case 16: |
615 | control |= SM501_DC_CRT_CONTROL_16BPP; | 619 | control |= SM501_DC_CRT_CONTROL_16BPP; |
620 | sm501fb_setup_gamma(fbi, SM501_DC_CRT_PALETTE); | ||
616 | break; | 621 | break; |
617 | 622 | ||
618 | case 32: | 623 | case 32: |
@@ -750,6 +755,7 @@ static int sm501fb_set_par_pnl(struct fb_info *info) | |||
750 | 755 | ||
751 | case 16: | 756 | case 16: |
752 | control |= SM501_DC_PANEL_CONTROL_16BPP; | 757 | control |= SM501_DC_PANEL_CONTROL_16BPP; |
758 | sm501fb_setup_gamma(fbi, SM501_DC_PANEL_PALETTE); | ||
753 | break; | 759 | break; |
754 | 760 | ||
755 | case 32: | 761 | case 32: |
diff --git a/drivers/video/stifb.c b/drivers/video/stifb.c index e7c8db2eb49b..f98be301140c 100644 --- a/drivers/video/stifb.c +++ b/drivers/video/stifb.c | |||
@@ -505,16 +505,24 @@ ngleSetupAttrPlanes(struct stifb_info *fb, int BufferNumber) | |||
505 | static void | 505 | static void |
506 | rattlerSetupPlanes(struct stifb_info *fb) | 506 | rattlerSetupPlanes(struct stifb_info *fb) |
507 | { | 507 | { |
508 | int saved_id, y; | ||
509 | |||
510 | /* Write RAMDAC pixel read mask register so all overlay | ||
511 | * planes are display-enabled. (CRX24 uses Bt462 pixel | ||
512 | * read mask register for overlay planes, not image planes). | ||
513 | */ | ||
508 | CRX24_SETUP_RAMDAC(fb); | 514 | CRX24_SETUP_RAMDAC(fb); |
509 | 515 | ||
510 | /* replacement for: SETUP_FB(fb, CRX24_OVERLAY_PLANES); */ | 516 | /* change fb->id temporarily to fool SETUP_FB() */ |
511 | WRITE_WORD(0x83000300, fb, REG_14); | 517 | saved_id = fb->id; |
512 | SETUP_HW(fb); | 518 | fb->id = CRX24_OVERLAY_PLANES; |
513 | WRITE_BYTE(1, fb, REG_16b1); | 519 | SETUP_FB(fb); |
520 | fb->id = saved_id; | ||
521 | |||
522 | for (y = 0; y < fb->info.var.yres; ++y) | ||
523 | memset(fb->info.screen_base + y * fb->info.fix.line_length, | ||
524 | 0xff, fb->info.var.xres * fb->info.var.bits_per_pixel/8); | ||
514 | 525 | ||
515 | fb_memset((void*)fb->info.fix.smem_start, 0xff, | ||
516 | fb->info.var.yres*fb->info.fix.line_length); | ||
517 | |||
518 | CRX24_SET_OVLY_MASK(fb); | 526 | CRX24_SET_OVLY_MASK(fb); |
519 | SETUP_FB(fb); | 527 | SETUP_FB(fb); |
520 | } | 528 | } |
diff --git a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c index 70fb4ee2b421..0a4e07d43d2d 100644 --- a/drivers/video/tridentfb.c +++ b/drivers/video/tridentfb.c | |||
@@ -564,7 +564,7 @@ static inline void write3CE(int reg, unsigned char val) | |||
564 | t_outb(val, 0x3CF); | 564 | t_outb(val, 0x3CF); |
565 | } | 565 | } |
566 | 566 | ||
567 | static inline void enable_mmio(void) | 567 | static void enable_mmio(void) |
568 | { | 568 | { |
569 | /* Goto New Mode */ | 569 | /* Goto New Mode */ |
570 | outb(0x0B, 0x3C4); | 570 | outb(0x0B, 0x3C4); |
@@ -579,6 +579,21 @@ static inline void enable_mmio(void) | |||
579 | outb(inb(0x3D5) | 0x01, 0x3D5); | 579 | outb(inb(0x3D5) | 0x01, 0x3D5); |
580 | } | 580 | } |
581 | 581 | ||
582 | static void disable_mmio(void) | ||
583 | { | ||
584 | /* Goto New Mode */ | ||
585 | t_outb(0x0B, 0x3C4); | ||
586 | t_inb(0x3C5); | ||
587 | |||
588 | /* Unprotect registers */ | ||
589 | t_outb(NewMode1, 0x3C4); | ||
590 | t_outb(0x80, 0x3C5); | ||
591 | |||
592 | /* Disable MMIO */ | ||
593 | t_outb(PCIReg, 0x3D4); | ||
594 | t_outb(t_inb(0x3D5) & ~0x01, 0x3D5); | ||
595 | } | ||
596 | |||
582 | #define crtc_unlock() write3X4(CRTVSyncEnd, read3X4(CRTVSyncEnd) & 0x7F) | 597 | #define crtc_unlock() write3X4(CRTVSyncEnd, read3X4(CRTVSyncEnd) & 0x7F) |
583 | 598 | ||
584 | /* Return flat panel's maximum x resolution */ | 599 | /* Return flat panel's maximum x resolution */ |
@@ -730,7 +745,7 @@ static unsigned int __devinit get_memsize(void) | |||
730 | switch (tmp) { | 745 | switch (tmp) { |
731 | 746 | ||
732 | case 0x01: | 747 | case 0x01: |
733 | k = 512; | 748 | k = 512 * Kb; |
734 | break; | 749 | break; |
735 | case 0x02: | 750 | case 0x02: |
736 | k = 6 * Mb; /* XP */ | 751 | k = 6 * Mb; /* XP */ |
@@ -1239,9 +1254,9 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, | |||
1239 | default_par.io_virt = ioremap_nocache(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); | 1254 | default_par.io_virt = ioremap_nocache(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); |
1240 | 1255 | ||
1241 | if (!default_par.io_virt) { | 1256 | if (!default_par.io_virt) { |
1242 | release_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); | ||
1243 | debug("ioremap failed\n"); | 1257 | debug("ioremap failed\n"); |
1244 | return -1; | 1258 | err = -1; |
1259 | goto out_unmap1; | ||
1245 | } | 1260 | } |
1246 | 1261 | ||
1247 | enable_mmio(); | 1262 | enable_mmio(); |
@@ -1252,25 +1267,21 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, | |||
1252 | 1267 | ||
1253 | if (!request_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len, "tridentfb")) { | 1268 | if (!request_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len, "tridentfb")) { |
1254 | debug("request_mem_region failed!\n"); | 1269 | debug("request_mem_region failed!\n"); |
1270 | disable_mmio(); | ||
1255 | err = -1; | 1271 | err = -1; |
1256 | goto out_unmap; | 1272 | goto out_unmap1; |
1257 | } | 1273 | } |
1258 | 1274 | ||
1259 | fb_info.screen_base = ioremap_nocache(tridentfb_fix.smem_start, | 1275 | fb_info.screen_base = ioremap_nocache(tridentfb_fix.smem_start, |
1260 | tridentfb_fix.smem_len); | 1276 | tridentfb_fix.smem_len); |
1261 | 1277 | ||
1262 | if (!fb_info.screen_base) { | 1278 | if (!fb_info.screen_base) { |
1263 | release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len); | ||
1264 | debug("ioremap failed\n"); | 1279 | debug("ioremap failed\n"); |
1265 | err = -1; | 1280 | err = -1; |
1266 | goto out_unmap; | 1281 | goto out_unmap2; |
1267 | } | 1282 | } |
1268 | 1283 | ||
1269 | output("%s board found\n", pci_name(dev)); | 1284 | output("%s board found\n", pci_name(dev)); |
1270 | #if 0 | ||
1271 | output("Trident board found : mem = %X, io = %X, mem_v = %X, io_v = %X\n", | ||
1272 | tridentfb_fix.smem_start, tridentfb_fix.mmio_start, fb_info.screen_base, default_par.io_virt); | ||
1273 | #endif | ||
1274 | displaytype = get_displaytype(); | 1285 | displaytype = get_displaytype(); |
1275 | 1286 | ||
1276 | if (flatpanel) | 1287 | if (flatpanel) |
@@ -1288,9 +1299,12 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, | |||
1288 | 1299 | ||
1289 | if (!fb_find_mode(&default_var, &fb_info, mode, NULL, 0, NULL, bpp)) { | 1300 | if (!fb_find_mode(&default_var, &fb_info, mode, NULL, 0, NULL, bpp)) { |
1290 | err = -EINVAL; | 1301 | err = -EINVAL; |
1291 | goto out_unmap; | 1302 | goto out_unmap2; |
1292 | } | 1303 | } |
1293 | fb_alloc_cmap(&fb_info.cmap, 256, 0); | 1304 | err = fb_alloc_cmap(&fb_info.cmap, 256, 0); |
1305 | if (err < 0) | ||
1306 | goto out_unmap2; | ||
1307 | |||
1294 | if (defaultaccel && acc) | 1308 | if (defaultaccel && acc) |
1295 | default_var.accel_flags |= FB_ACCELF_TEXT; | 1309 | default_var.accel_flags |= FB_ACCELF_TEXT; |
1296 | else | 1310 | else |
@@ -1300,19 +1314,24 @@ static int __devinit trident_pci_probe(struct pci_dev * dev, | |||
1300 | fb_info.device = &dev->dev; | 1314 | fb_info.device = &dev->dev; |
1301 | if (register_framebuffer(&fb_info) < 0) { | 1315 | if (register_framebuffer(&fb_info) < 0) { |
1302 | printk(KERN_ERR "tridentfb: could not register Trident framebuffer\n"); | 1316 | printk(KERN_ERR "tridentfb: could not register Trident framebuffer\n"); |
1317 | fb_dealloc_cmap(&fb_info.cmap); | ||
1303 | err = -EINVAL; | 1318 | err = -EINVAL; |
1304 | goto out_unmap; | 1319 | goto out_unmap2; |
1305 | } | 1320 | } |
1306 | output("fb%d: %s frame buffer device %dx%d-%dbpp\n", | 1321 | output("fb%d: %s frame buffer device %dx%d-%dbpp\n", |
1307 | fb_info.node, fb_info.fix.id, default_var.xres, | 1322 | fb_info.node, fb_info.fix.id, default_var.xres, |
1308 | default_var.yres, default_var.bits_per_pixel); | 1323 | default_var.yres, default_var.bits_per_pixel); |
1309 | return 0; | 1324 | return 0; |
1310 | 1325 | ||
1311 | out_unmap: | 1326 | out_unmap2: |
1312 | if (default_par.io_virt) | ||
1313 | iounmap(default_par.io_virt); | ||
1314 | if (fb_info.screen_base) | 1327 | if (fb_info.screen_base) |
1315 | iounmap(fb_info.screen_base); | 1328 | iounmap(fb_info.screen_base); |
1329 | release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len); | ||
1330 | disable_mmio(); | ||
1331 | out_unmap1: | ||
1332 | if (default_par.io_virt) | ||
1333 | iounmap(default_par.io_virt); | ||
1334 | release_mem_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); | ||
1316 | return err; | 1335 | return err; |
1317 | } | 1336 | } |
1318 | 1337 | ||
@@ -1323,7 +1342,7 @@ static void __devexit trident_pci_remove(struct pci_dev *dev) | |||
1323 | iounmap(par->io_virt); | 1342 | iounmap(par->io_virt); |
1324 | iounmap(fb_info.screen_base); | 1343 | iounmap(fb_info.screen_base); |
1325 | release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len); | 1344 | release_mem_region(tridentfb_fix.smem_start, tridentfb_fix.smem_len); |
1326 | release_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); | 1345 | release_mem_region(tridentfb_fix.mmio_start, tridentfb_fix.mmio_len); |
1327 | } | 1346 | } |
1328 | 1347 | ||
1329 | /* List of boards that we are trying to support */ | 1348 | /* List of boards that we are trying to support */ |
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index c8a4332d1132..0b3efc31ee6d 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c | |||
@@ -152,7 +152,7 @@ static void virtballoon_changed(struct virtio_device *vdev) | |||
152 | wake_up(&vb->config_change); | 152 | wake_up(&vb->config_change); |
153 | } | 153 | } |
154 | 154 | ||
155 | static inline int towards_target(struct virtio_balloon *vb) | 155 | static inline s64 towards_target(struct virtio_balloon *vb) |
156 | { | 156 | { |
157 | u32 v; | 157 | u32 v; |
158 | __virtio_config_val(vb->vdev, | 158 | __virtio_config_val(vb->vdev, |
@@ -176,7 +176,7 @@ static int balloon(void *_vballoon) | |||
176 | 176 | ||
177 | set_freezable(); | 177 | set_freezable(); |
178 | while (!kthread_should_stop()) { | 178 | while (!kthread_should_stop()) { |
179 | int diff; | 179 | s64 diff; |
180 | 180 | ||
181 | try_to_freeze(); | 181 | try_to_freeze(); |
182 | wait_event_interruptible(vb->config_change, | 182 | wait_event_interruptible(vb->config_change, |
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 26f787ddd5ff..59a8f73dec73 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c | |||
@@ -177,6 +177,7 @@ static irqreturn_t vp_interrupt(int irq, void *opaque) | |||
177 | struct virtio_pci_device *vp_dev = opaque; | 177 | struct virtio_pci_device *vp_dev = opaque; |
178 | struct virtio_pci_vq_info *info; | 178 | struct virtio_pci_vq_info *info; |
179 | irqreturn_t ret = IRQ_NONE; | 179 | irqreturn_t ret = IRQ_NONE; |
180 | unsigned long flags; | ||
180 | u8 isr; | 181 | u8 isr; |
181 | 182 | ||
182 | /* reading the ISR has the effect of also clearing it so it's very | 183 | /* reading the ISR has the effect of also clearing it so it's very |
@@ -197,12 +198,12 @@ static irqreturn_t vp_interrupt(int irq, void *opaque) | |||
197 | drv->config_changed(&vp_dev->vdev); | 198 | drv->config_changed(&vp_dev->vdev); |
198 | } | 199 | } |
199 | 200 | ||
200 | spin_lock(&vp_dev->lock); | 201 | spin_lock_irqsave(&vp_dev->lock, flags); |
201 | list_for_each_entry(info, &vp_dev->virtqueues, node) { | 202 | list_for_each_entry(info, &vp_dev->virtqueues, node) { |
202 | if (vring_interrupt(irq, info->vq) == IRQ_HANDLED) | 203 | if (vring_interrupt(irq, info->vq) == IRQ_HANDLED) |
203 | ret = IRQ_HANDLED; | 204 | ret = IRQ_HANDLED; |
204 | } | 205 | } |
205 | spin_unlock(&vp_dev->lock); | 206 | spin_unlock_irqrestore(&vp_dev->lock, flags); |
206 | 207 | ||
207 | return ret; | 208 | return ret; |
208 | } | 209 | } |
@@ -214,6 +215,7 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index, | |||
214 | struct virtio_pci_device *vp_dev = to_vp_device(vdev); | 215 | struct virtio_pci_device *vp_dev = to_vp_device(vdev); |
215 | struct virtio_pci_vq_info *info; | 216 | struct virtio_pci_vq_info *info; |
216 | struct virtqueue *vq; | 217 | struct virtqueue *vq; |
218 | unsigned long flags; | ||
217 | u16 num; | 219 | u16 num; |
218 | int err; | 220 | int err; |
219 | 221 | ||
@@ -255,9 +257,9 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index, | |||
255 | vq->priv = info; | 257 | vq->priv = info; |
256 | info->vq = vq; | 258 | info->vq = vq; |
257 | 259 | ||
258 | spin_lock(&vp_dev->lock); | 260 | spin_lock_irqsave(&vp_dev->lock, flags); |
259 | list_add(&info->node, &vp_dev->virtqueues); | 261 | list_add(&info->node, &vp_dev->virtqueues); |
260 | spin_unlock(&vp_dev->lock); | 262 | spin_unlock_irqrestore(&vp_dev->lock, flags); |
261 | 263 | ||
262 | return vq; | 264 | return vq; |
263 | 265 | ||
@@ -274,10 +276,11 @@ static void vp_del_vq(struct virtqueue *vq) | |||
274 | { | 276 | { |
275 | struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev); | 277 | struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev); |
276 | struct virtio_pci_vq_info *info = vq->priv; | 278 | struct virtio_pci_vq_info *info = vq->priv; |
279 | unsigned long flags; | ||
277 | 280 | ||
278 | spin_lock(&vp_dev->lock); | 281 | spin_lock_irqsave(&vp_dev->lock, flags); |
279 | list_del(&info->node); | 282 | list_del(&info->node); |
280 | spin_unlock(&vp_dev->lock); | 283 | spin_unlock_irqrestore(&vp_dev->lock, flags); |
281 | 284 | ||
282 | vring_del_virtqueue(vq); | 285 | vring_del_virtqueue(vq); |
283 | 286 | ||
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index 3a28c1382131..aa714028641e 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c | |||
@@ -232,7 +232,6 @@ static bool vring_enable_cb(struct virtqueue *_vq) | |||
232 | vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; | 232 | vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; |
233 | mb(); | 233 | mb(); |
234 | if (unlikely(more_used(vq))) { | 234 | if (unlikely(more_used(vq))) { |
235 | vq->vring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; | ||
236 | END_USE(vq); | 235 | END_USE(vq); |
237 | return false; | 236 | return false; |
238 | } | 237 | } |
diff --git a/drivers/w1/masters/ds1wm.c b/drivers/w1/masters/ds1wm.c index 688e435b4d9a..10211e493001 100644 --- a/drivers/w1/masters/ds1wm.c +++ b/drivers/w1/masters/ds1wm.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/pm.h> | 17 | #include <linux/pm.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | #include <linux/clk.h> | 19 | #include <linux/clk.h> |
20 | #include <linux/err.h> | ||
20 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
21 | #include <linux/ds1wm.h> | 22 | #include <linux/ds1wm.h> |
22 | 23 | ||
@@ -102,12 +103,12 @@ struct ds1wm_data { | |||
102 | static inline void ds1wm_write_register(struct ds1wm_data *ds1wm_data, u32 reg, | 103 | static inline void ds1wm_write_register(struct ds1wm_data *ds1wm_data, u32 reg, |
103 | u8 val) | 104 | u8 val) |
104 | { | 105 | { |
105 | __raw_writeb(val, ds1wm_data->map + (reg << ds1wm_data->bus_shift)); | 106 | __raw_writeb(val, ds1wm_data->map + (reg << ds1wm_data->bus_shift)); |
106 | } | 107 | } |
107 | 108 | ||
108 | static inline u8 ds1wm_read_register(struct ds1wm_data *ds1wm_data, u32 reg) | 109 | static inline u8 ds1wm_read_register(struct ds1wm_data *ds1wm_data, u32 reg) |
109 | { | 110 | { |
110 | return __raw_readb(ds1wm_data->map + (reg << ds1wm_data->bus_shift)); | 111 | return __raw_readb(ds1wm_data->map + (reg << ds1wm_data->bus_shift)); |
111 | } | 112 | } |
112 | 113 | ||
113 | 114 | ||
@@ -149,8 +150,8 @@ static int ds1wm_reset(struct ds1wm_data *ds1wm_data) | |||
149 | timeleft = wait_for_completion_timeout(&reset_done, DS1WM_TIMEOUT); | 150 | timeleft = wait_for_completion_timeout(&reset_done, DS1WM_TIMEOUT); |
150 | ds1wm_data->reset_complete = NULL; | 151 | ds1wm_data->reset_complete = NULL; |
151 | if (!timeleft) { | 152 | if (!timeleft) { |
152 | dev_dbg(&ds1wm_data->pdev->dev, "reset failed\n"); | 153 | dev_err(&ds1wm_data->pdev->dev, "reset failed\n"); |
153 | return 1; | 154 | return 1; |
154 | } | 155 | } |
155 | 156 | ||
156 | /* Wait for the end of the reset. According to the specs, the time | 157 | /* Wait for the end of the reset. According to the specs, the time |
@@ -167,11 +168,11 @@ static int ds1wm_reset(struct ds1wm_data *ds1wm_data) | |||
167 | (ds1wm_data->active_high ? DS1WM_INTEN_IAS : 0)); | 168 | (ds1wm_data->active_high ? DS1WM_INTEN_IAS : 0)); |
168 | 169 | ||
169 | if (!ds1wm_data->slave_present) { | 170 | if (!ds1wm_data->slave_present) { |
170 | dev_dbg(&ds1wm_data->pdev->dev, "reset: no devices found\n"); | 171 | dev_dbg(&ds1wm_data->pdev->dev, "reset: no devices found\n"); |
171 | return 1; | 172 | return 1; |
172 | } | 173 | } |
173 | 174 | ||
174 | return 0; | 175 | return 0; |
175 | } | 176 | } |
176 | 177 | ||
177 | static int ds1wm_write(struct ds1wm_data *ds1wm_data, u8 data) | 178 | static int ds1wm_write(struct ds1wm_data *ds1wm_data, u8 data) |
@@ -334,7 +335,7 @@ static int ds1wm_probe(struct platform_device *pdev) | |||
334 | if (!pdev) | 335 | if (!pdev) |
335 | return -ENODEV; | 336 | return -ENODEV; |
336 | 337 | ||
337 | ds1wm_data = kzalloc(sizeof (*ds1wm_data), GFP_KERNEL); | 338 | ds1wm_data = kzalloc(sizeof(*ds1wm_data), GFP_KERNEL); |
338 | if (!ds1wm_data) | 339 | if (!ds1wm_data) |
339 | return -ENOMEM; | 340 | return -ENOMEM; |
340 | 341 | ||
@@ -374,8 +375,8 @@ static int ds1wm_probe(struct platform_device *pdev) | |||
374 | goto err1; | 375 | goto err1; |
375 | 376 | ||
376 | ds1wm_data->clk = clk_get(&pdev->dev, "ds1wm"); | 377 | ds1wm_data->clk = clk_get(&pdev->dev, "ds1wm"); |
377 | if (!ds1wm_data->clk) { | 378 | if (IS_ERR(ds1wm_data->clk)) { |
378 | ret = -ENOENT; | 379 | ret = PTR_ERR(ds1wm_data->clk); |
379 | goto err2; | 380 | goto err2; |
380 | } | 381 | } |
381 | 382 | ||
diff --git a/drivers/watchdog/cpu5wdt.c b/drivers/watchdog/cpu5wdt.c index 5941ca601a3a..df72f90123df 100644 --- a/drivers/watchdog/cpu5wdt.c +++ b/drivers/watchdog/cpu5wdt.c | |||
@@ -59,9 +59,9 @@ static int ticks = 10000; | |||
59 | 59 | ||
60 | static struct { | 60 | static struct { |
61 | struct completion stop; | 61 | struct completion stop; |
62 | volatile int running; | 62 | int running; |
63 | struct timer_list timer; | 63 | struct timer_list timer; |
64 | volatile int queue; | 64 | int queue; |
65 | int default_ticks; | 65 | int default_ticks; |
66 | unsigned long inuse; | 66 | unsigned long inuse; |
67 | } cpu5wdt_device; | 67 | } cpu5wdt_device; |
diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c index a2e174b09fe7..6483d1066b95 100644 --- a/drivers/watchdog/hpwdt.c +++ b/drivers/watchdog/hpwdt.c | |||
@@ -58,41 +58,6 @@ struct bios32_service_dir { | |||
58 | u8 reserved[5]; | 58 | u8 reserved[5]; |
59 | }; | 59 | }; |
60 | 60 | ||
61 | /* | ||
62 | * smbios_entry_point - defines SMBIOS entry point structure | ||
63 | * | ||
64 | * anchor[4] - anchor string (_SM_) | ||
65 | * checksum - checksum of the entry point structure | ||
66 | * length - length of the entry point structure | ||
67 | * major_ver - major version (02h for revision 2.1) | ||
68 | * minor_ver - minor version (01h for revision 2.1) | ||
69 | * max_struct_size - size of the largest SMBIOS structure | ||
70 | * revision - entry point structure revision implemented | ||
71 | * formatted_area[5] - reserved | ||
72 | * intermediate_anchor[5] - intermediate anchor string (_DMI_) | ||
73 | * intermediate_checksum - intermediate checksum | ||
74 | * table_length - structure table length | ||
75 | * table_address - structure table address | ||
76 | * table_num_structs - number of SMBIOS structures present | ||
77 | * bcd_revision - BCD revision | ||
78 | */ | ||
79 | struct smbios_entry_point { | ||
80 | u8 anchor[4]; | ||
81 | u8 checksum; | ||
82 | u8 length; | ||
83 | u8 major_ver; | ||
84 | u8 minor_ver; | ||
85 | u16 max_struct_size; | ||
86 | u8 revision; | ||
87 | u8 formatted_area[5]; | ||
88 | u8 intermediate_anchor[5]; | ||
89 | u8 intermediate_checksum; | ||
90 | u16 table_length; | ||
91 | u64 table_address; | ||
92 | u16 table_num_structs; | ||
93 | u8 bcd_revision; | ||
94 | }; | ||
95 | |||
96 | /* type 212 */ | 61 | /* type 212 */ |
97 | struct smbios_cru64_info { | 62 | struct smbios_cru64_info { |
98 | u8 type; | 63 | u8 type; |
@@ -175,31 +140,13 @@ static struct pci_device_id hpwdt_devices[] = { | |||
175 | }; | 140 | }; |
176 | MODULE_DEVICE_TABLE(pci, hpwdt_devices); | 141 | MODULE_DEVICE_TABLE(pci, hpwdt_devices); |
177 | 142 | ||
178 | /* | ||
179 | * bios_checksum | ||
180 | */ | ||
181 | static int __devinit bios_checksum(const char __iomem *ptr, int len) | ||
182 | { | ||
183 | char sum = 0; | ||
184 | int i; | ||
185 | |||
186 | /* | ||
187 | * calculate checksum of size bytes. This should add up | ||
188 | * to zero if we have a valid header. | ||
189 | */ | ||
190 | for (i = 0; i < len; i++) | ||
191 | sum += ptr[i]; | ||
192 | |||
193 | return ((sum == 0) && (len > 0)); | ||
194 | } | ||
195 | |||
196 | #ifndef CONFIG_X86_64 | 143 | #ifndef CONFIG_X86_64 |
197 | /* --32 Bit Bios------------------------------------------------------------ */ | 144 | /* --32 Bit Bios------------------------------------------------------------ */ |
198 | 145 | ||
199 | #define HPWDT_ARCH 32 | 146 | #define HPWDT_ARCH 32 |
200 | 147 | ||
201 | asmlinkage void asminline_call(struct cmn_registers *pi86Regs, | 148 | static void asminline_call(struct cmn_registers *pi86Regs, |
202 | unsigned long *pRomEntry) | 149 | unsigned long *pRomEntry) |
203 | { | 150 | { |
204 | asm("pushl %ebp \n\t" | 151 | asm("pushl %ebp \n\t" |
205 | "movl %esp, %ebp \n\t" | 152 | "movl %esp, %ebp \n\t" |
@@ -303,6 +250,24 @@ static int __devinit cru_detect(unsigned long map_entry, | |||
303 | } | 250 | } |
304 | 251 | ||
305 | /* | 252 | /* |
253 | * bios_checksum | ||
254 | */ | ||
255 | static int __devinit bios_checksum(const char __iomem *ptr, int len) | ||
256 | { | ||
257 | char sum = 0; | ||
258 | int i; | ||
259 | |||
260 | /* | ||
261 | * calculate checksum of size bytes. This should add up | ||
262 | * to zero if we have a valid header. | ||
263 | */ | ||
264 | for (i = 0; i < len; i++) | ||
265 | sum += ptr[i]; | ||
266 | |||
267 | return ((sum == 0) && (len > 0)); | ||
268 | } | ||
269 | |||
270 | /* | ||
306 | * bios32_present | 271 | * bios32_present |
307 | * | 272 | * |
308 | * Routine Description: | 273 | * Routine Description: |
@@ -368,8 +333,8 @@ static int __devinit detect_cru_service(void) | |||
368 | 333 | ||
369 | #define HPWDT_ARCH 64 | 334 | #define HPWDT_ARCH 64 |
370 | 335 | ||
371 | asmlinkage void asminline_call(struct cmn_registers *pi86Regs, | 336 | static void asminline_call(struct cmn_registers *pi86Regs, |
372 | unsigned long *pRomEntry) | 337 | unsigned long *pRomEntry) |
373 | { | 338 | { |
374 | asm("pushq %rbp \n\t" | 339 | asm("pushq %rbp \n\t" |
375 | "movq %rsp, %rbp \n\t" | 340 | "movq %rsp, %rbp \n\t" |
@@ -410,12 +375,8 @@ asmlinkage void asminline_call(struct cmn_registers *pi86Regs, | |||
410 | * dmi_find_cru | 375 | * dmi_find_cru |
411 | * | 376 | * |
412 | * Routine Description: | 377 | * Routine Description: |
413 | * This function checks wether or not a SMBIOS/DMI record is | 378 | * This function checks whether or not a SMBIOS/DMI record is |
414 | * the 64bit CRU info or not | 379 | * the 64bit CRU info or not |
415 | * | ||
416 | * Return Value: | ||
417 | * 0 : SUCCESS - if record found | ||
418 | * <0 : FAILURE - if record not found | ||
419 | */ | 380 | */ |
420 | static void __devinit dmi_find_cru(const struct dmi_header *dm) | 381 | static void __devinit dmi_find_cru(const struct dmi_header *dm) |
421 | { | 382 | { |
@@ -434,138 +395,11 @@ static void __devinit dmi_find_cru(const struct dmi_header *dm) | |||
434 | } | 395 | } |
435 | } | 396 | } |
436 | 397 | ||
437 | /* | ||
438 | * dmi_table | ||
439 | * | ||
440 | * Routine Description: | ||
441 | * Decode the SMBIOS/DMI table and check if we have a 64bit CRU record | ||
442 | * or not. | ||
443 | * | ||
444 | * We have to be cautious here. We have seen BIOSes with DMI pointers | ||
445 | * pointing to completely the wrong place for example | ||
446 | */ | ||
447 | static void __devinit dmi_table(u8 *buf, int len, int num, | ||
448 | void (*decode)(const struct dmi_header *)) | ||
449 | { | ||
450 | u8 *data = buf; | ||
451 | int i = 0; | ||
452 | |||
453 | /* | ||
454 | * Stop when we see all the items the table claimed to have | ||
455 | * OR we run off the end of the table (also happens) | ||
456 | */ | ||
457 | while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) { | ||
458 | const struct dmi_header *dm = (const struct dmi_header *)data; | ||
459 | |||
460 | /* | ||
461 | * We want to know the total length (formated area and strings) | ||
462 | * before decoding to make sure we won't run off the table in | ||
463 | * dmi_decode or dmi_string | ||
464 | */ | ||
465 | data += dm->length; | ||
466 | while ((data - buf < len - 1) && (data[0] || data[1])) | ||
467 | data++; | ||
468 | if (data - buf < len - 1) | ||
469 | decode(dm); | ||
470 | data += 2; | ||
471 | i++; | ||
472 | } | ||
473 | } | ||
474 | |||
475 | /* | ||
476 | * smbios_present | ||
477 | * | ||
478 | * Routine Description: | ||
479 | * This function parses the SMBIOS entry point table to retrieve | ||
480 | * the 64 bit CRU Service. | ||
481 | * | ||
482 | * Return Value: | ||
483 | * 0 : SUCCESS | ||
484 | * <0 : FAILURE | ||
485 | */ | ||
486 | static int __devinit smbios_present(const char __iomem *p) | ||
487 | { | ||
488 | struct smbios_entry_point *eps = | ||
489 | (struct smbios_entry_point *) p; | ||
490 | int length; | ||
491 | u8 *buf; | ||
492 | |||
493 | /* check if we have indeed the SMBIOS table entry point */ | ||
494 | if ((strncmp((char *)eps->anchor, "_SM_", | ||
495 | sizeof(eps->anchor))) == 0) { | ||
496 | length = eps->length; | ||
497 | |||
498 | /* SMBIOS v2.1 implementation might use 0x1e */ | ||
499 | if ((length == 0x1e) && | ||
500 | (eps->major_ver == 2) && | ||
501 | (eps->minor_ver == 1)) | ||
502 | length = 0x1f; | ||
503 | |||
504 | /* | ||
505 | * Now we will check: | ||
506 | * - SMBIOS checksum must be 0 | ||
507 | * - intermediate anchor should be _DMI_ | ||
508 | * - intermediate checksum should be 0 | ||
509 | */ | ||
510 | if ((bios_checksum(p, length)) && | ||
511 | (strncmp((char *)eps->intermediate_anchor, "_DMI_", | ||
512 | sizeof(eps->intermediate_anchor)) == 0) && | ||
513 | (bios_checksum(p+0x10, 15))) { | ||
514 | buf = ioremap(eps->table_address, eps->table_length); | ||
515 | if (buf == NULL) | ||
516 | return -ENODEV; | ||
517 | |||
518 | |||
519 | /* Scan the DMI table for the 64 bit CRU service */ | ||
520 | dmi_table(buf, eps->table_length, | ||
521 | eps->table_num_structs, dmi_find_cru); | ||
522 | |||
523 | iounmap(buf); | ||
524 | return 0; | ||
525 | } | ||
526 | } | ||
527 | |||
528 | return -ENODEV; | ||
529 | } | ||
530 | |||
531 | static int __devinit smbios_scan_machine(void) | ||
532 | { | ||
533 | char __iomem *p, *q; | ||
534 | int rc; | ||
535 | |||
536 | if (efi_enabled) { | ||
537 | if (efi.smbios == EFI_INVALID_TABLE_ADDR) | ||
538 | return -ENODEV; | ||
539 | |||
540 | p = ioremap(efi.smbios, 32); | ||
541 | if (p == NULL) | ||
542 | return -ENOMEM; | ||
543 | |||
544 | rc = smbios_present(p); | ||
545 | iounmap(p); | ||
546 | } else { | ||
547 | /* | ||
548 | * Search from 0x0f0000 through 0x0fffff, inclusive. | ||
549 | */ | ||
550 | p = ioremap(PCI_ROM_BASE1, ROM_SIZE); | ||
551 | if (p == NULL) | ||
552 | return -ENOMEM; | ||
553 | |||
554 | for (q = p; q < p + ROM_SIZE; q += 16) { | ||
555 | rc = smbios_present(q); | ||
556 | if (!rc) { | ||
557 | break; | ||
558 | } | ||
559 | } | ||
560 | iounmap(p); | ||
561 | } | ||
562 | } | ||
563 | |||
564 | static int __devinit detect_cru_service(void) | 398 | static int __devinit detect_cru_service(void) |
565 | { | 399 | { |
566 | cru_rom_addr = NULL; | 400 | cru_rom_addr = NULL; |
567 | 401 | ||
568 | smbios_scan_machine(); /* will become dmi_walk(dmi_find_cru); */ | 402 | dmi_walk(dmi_find_cru); |
569 | 403 | ||
570 | /* if cru_rom_addr has been set then we found a CRU service */ | 404 | /* if cru_rom_addr has been set then we found a CRU service */ |
571 | return ((cru_rom_addr != NULL)? 0: -ENODEV); | 405 | return ((cru_rom_addr != NULL)? 0: -ENODEV); |
diff --git a/drivers/watchdog/it8712f_wdt.c b/drivers/watchdog/it8712f_wdt.c index 1b6d7d1b715d..1efcad3b6fca 100644 --- a/drivers/watchdog/it8712f_wdt.c +++ b/drivers/watchdog/it8712f_wdt.c | |||
@@ -7,7 +7,8 @@ | |||
7 | * | 7 | * |
8 | * drivers/char/watchdog/scx200_wdt.c | 8 | * drivers/char/watchdog/scx200_wdt.c |
9 | * drivers/hwmon/it87.c | 9 | * drivers/hwmon/it87.c |
10 | * IT8712F EC-LPC I/O Preliminary Specification 0.9.2.pdf | 10 | * IT8712F EC-LPC I/O Preliminary Specification 0.8.2 |
11 | * IT8712F EC-LPC I/O Preliminary Specification 0.9.3 | ||
11 | * | 12 | * |
12 | * This program is free software; you can redistribute it and/or | 13 | * This program is free software; you can redistribute it and/or |
13 | * modify it under the terms of the GNU General Public License as | 14 | * modify it under the terms of the GNU General Public License as |
@@ -40,6 +41,7 @@ MODULE_DESCRIPTION("IT8712F Watchdog Driver"); | |||
40 | MODULE_LICENSE("GPL"); | 41 | MODULE_LICENSE("GPL"); |
41 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | 42 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); |
42 | 43 | ||
44 | static int max_units = 255; | ||
43 | static int margin = 60; /* in seconds */ | 45 | static int margin = 60; /* in seconds */ |
44 | module_param(margin, int, 0); | 46 | module_param(margin, int, 0); |
45 | MODULE_PARM_DESC(margin, "Watchdog margin in seconds"); | 47 | MODULE_PARM_DESC(margin, "Watchdog margin in seconds"); |
@@ -51,6 +53,7 @@ MODULE_PARM_DESC(nowayout, "Disable watchdog shutdown on close"); | |||
51 | static struct semaphore it8712f_wdt_sem; | 53 | static struct semaphore it8712f_wdt_sem; |
52 | static unsigned expect_close; | 54 | static unsigned expect_close; |
53 | static spinlock_t io_lock; | 55 | static spinlock_t io_lock; |
56 | static unsigned char revision; | ||
54 | 57 | ||
55 | /* Dog Food address - We use the game port address */ | 58 | /* Dog Food address - We use the game port address */ |
56 | static unsigned short address; | 59 | static unsigned short address; |
@@ -108,6 +111,15 @@ superio_inw(int reg) | |||
108 | return val; | 111 | return val; |
109 | } | 112 | } |
110 | 113 | ||
114 | static void | ||
115 | superio_outw(int val, int reg) | ||
116 | { | ||
117 | outb(reg++, REG); | ||
118 | outb((val >> 8) & 0xff, VAL); | ||
119 | outb(reg, REG); | ||
120 | outb(val & 0xff, VAL); | ||
121 | } | ||
122 | |||
111 | static inline void | 123 | static inline void |
112 | superio_select(int ldn) | 124 | superio_select(int ldn) |
113 | { | 125 | { |
@@ -143,15 +155,33 @@ static void | |||
143 | it8712f_wdt_update_margin(void) | 155 | it8712f_wdt_update_margin(void) |
144 | { | 156 | { |
145 | int config = WDT_OUT_KRST | WDT_OUT_PWROK; | 157 | int config = WDT_OUT_KRST | WDT_OUT_PWROK; |
146 | 158 | int units = margin; | |
147 | printk(KERN_INFO NAME ": timer margin %d seconds\n", margin); | 159 | |
148 | 160 | /* Switch to minutes precision if the configured margin | |
149 | /* The timeout register only has 8bits wide */ | 161 | * value does not fit within the register width. |
150 | if (margin < 256) | 162 | */ |
151 | config |= WDT_UNIT_SEC; /* else UNIT are MINUTES */ | 163 | if (units <= max_units) { |
164 | config |= WDT_UNIT_SEC; /* else UNIT is MINUTES */ | ||
165 | printk(KERN_INFO NAME ": timer margin %d seconds\n", units); | ||
166 | } else { | ||
167 | units /= 60; | ||
168 | printk(KERN_INFO NAME ": timer margin %d minutes\n", units); | ||
169 | } | ||
152 | superio_outb(config, WDT_CONFIG); | 170 | superio_outb(config, WDT_CONFIG); |
153 | 171 | ||
154 | superio_outb((margin > 255) ? (margin / 60) : margin, WDT_TIMEOUT); | 172 | if (revision >= 0x08) |
173 | superio_outw(units, WDT_TIMEOUT); | ||
174 | else | ||
175 | superio_outb(units, WDT_TIMEOUT); | ||
176 | } | ||
177 | |||
178 | static int | ||
179 | it8712f_wdt_get_status(void) | ||
180 | { | ||
181 | if (superio_inb(WDT_CONTROL) & 0x01) | ||
182 | return WDIOF_CARDRESET; | ||
183 | else | ||
184 | return 0; | ||
155 | } | 185 | } |
156 | 186 | ||
157 | static void | 187 | static void |
@@ -234,7 +264,7 @@ it8712f_wdt_ioctl(struct inode *inode, struct file *file, | |||
234 | .firmware_version = 1, | 264 | .firmware_version = 1, |
235 | .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, | 265 | .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, |
236 | }; | 266 | }; |
237 | int new_margin; | 267 | int value; |
238 | 268 | ||
239 | switch (cmd) { | 269 | switch (cmd) { |
240 | default: | 270 | default: |
@@ -244,17 +274,27 @@ it8712f_wdt_ioctl(struct inode *inode, struct file *file, | |||
244 | return -EFAULT; | 274 | return -EFAULT; |
245 | return 0; | 275 | return 0; |
246 | case WDIOC_GETSTATUS: | 276 | case WDIOC_GETSTATUS: |
277 | superio_enter(); | ||
278 | superio_select(LDN_GPIO); | ||
279 | |||
280 | value = it8712f_wdt_get_status(); | ||
281 | |||
282 | superio_exit(); | ||
283 | |||
284 | return put_user(value, p); | ||
247 | case WDIOC_GETBOOTSTATUS: | 285 | case WDIOC_GETBOOTSTATUS: |
248 | return put_user(0, p); | 286 | return put_user(0, p); |
249 | case WDIOC_KEEPALIVE: | 287 | case WDIOC_KEEPALIVE: |
250 | it8712f_wdt_ping(); | 288 | it8712f_wdt_ping(); |
251 | return 0; | 289 | return 0; |
252 | case WDIOC_SETTIMEOUT: | 290 | case WDIOC_SETTIMEOUT: |
253 | if (get_user(new_margin, p)) | 291 | if (get_user(value, p)) |
254 | return -EFAULT; | 292 | return -EFAULT; |
255 | if (new_margin < 1) | 293 | if (value < 1) |
294 | return -EINVAL; | ||
295 | if (value > (max_units * 60)) | ||
256 | return -EINVAL; | 296 | return -EINVAL; |
257 | margin = new_margin; | 297 | margin = value; |
258 | superio_enter(); | 298 | superio_enter(); |
259 | superio_select(LDN_GPIO); | 299 | superio_select(LDN_GPIO); |
260 | 300 | ||
@@ -262,6 +302,7 @@ it8712f_wdt_ioctl(struct inode *inode, struct file *file, | |||
262 | 302 | ||
263 | superio_exit(); | 303 | superio_exit(); |
264 | it8712f_wdt_ping(); | 304 | it8712f_wdt_ping(); |
305 | /* Fall through */ | ||
265 | case WDIOC_GETTIMEOUT: | 306 | case WDIOC_GETTIMEOUT: |
266 | if (put_user(margin, p)) | 307 | if (put_user(margin, p)) |
267 | return -EFAULT; | 308 | return -EFAULT; |
@@ -336,9 +377,18 @@ it8712f_wdt_find(unsigned short *address) | |||
336 | } | 377 | } |
337 | 378 | ||
338 | err = 0; | 379 | err = 0; |
339 | printk(KERN_DEBUG NAME ": Found IT%04xF chip revision %d - " | 380 | revision = superio_inb(DEVREV) & 0x0f; |
381 | |||
382 | /* Later revisions have 16-bit values per datasheet 0.9.1 */ | ||
383 | if (revision >= 0x08) | ||
384 | max_units = 65535; | ||
385 | |||
386 | if (margin > (max_units * 60)) | ||
387 | margin = (max_units * 60); | ||
388 | |||
389 | printk(KERN_INFO NAME ": Found IT%04xF chip revision %d - " | ||
340 | "using DogFood address 0x%x\n", | 390 | "using DogFood address 0x%x\n", |
341 | chip_type, superio_inb(DEVREV) & 0x0f, *address); | 391 | chip_type, revision, *address); |
342 | 392 | ||
343 | exit: | 393 | exit: |
344 | superio_exit(); | 394 | superio_exit(); |
diff --git a/drivers/watchdog/machzwd.c b/drivers/watchdog/machzwd.c index e6e07b4575eb..6905135a776c 100644 --- a/drivers/watchdog/machzwd.c +++ b/drivers/watchdog/machzwd.c | |||
@@ -141,7 +141,7 @@ static unsigned long next_heartbeat = 0; | |||
141 | #ifndef ZF_DEBUG | 141 | #ifndef ZF_DEBUG |
142 | # define dprintk(format, args...) | 142 | # define dprintk(format, args...) |
143 | #else | 143 | #else |
144 | # define dprintk(format, args...) printk(KERN_DEBUG PFX ":%s:%d: " format, __FUNCTION__, __LINE__ , ## args) | 144 | # define dprintk(format, args...) printk(KERN_DEBUG PFX ":%s:%d: " format, __func__, __LINE__ , ## args) |
145 | #endif | 145 | #endif |
146 | 146 | ||
147 | 147 | ||
diff --git a/drivers/watchdog/mtx-1_wdt.c b/drivers/watchdog/mtx-1_wdt.c index 789831b3fa00..10b89f2703bd 100644 --- a/drivers/watchdog/mtx-1_wdt.c +++ b/drivers/watchdog/mtx-1_wdt.c | |||
@@ -59,9 +59,9 @@ static int ticks = 100 * HZ; | |||
59 | 59 | ||
60 | static struct { | 60 | static struct { |
61 | struct completion stop; | 61 | struct completion stop; |
62 | volatile int running; | 62 | int running; |
63 | struct timer_list timer; | 63 | struct timer_list timer; |
64 | volatile int queue; | 64 | int queue; |
65 | int default_ticks; | 65 | int default_ticks; |
66 | unsigned long inuse; | 66 | unsigned long inuse; |
67 | unsigned gpio; | 67 | unsigned gpio; |
diff --git a/drivers/watchdog/pcwd_usb.c b/drivers/watchdog/pcwd_usb.c index 0f3fd6c9c354..bf443d077a1e 100644 --- a/drivers/watchdog/pcwd_usb.c +++ b/drivers/watchdog/pcwd_usb.c | |||
@@ -179,11 +179,11 @@ static void usb_pcwd_intr_done(struct urb *urb) | |||
179 | case -ENOENT: | 179 | case -ENOENT: |
180 | case -ESHUTDOWN: | 180 | case -ESHUTDOWN: |
181 | /* this urb is terminated, clean up */ | 181 | /* this urb is terminated, clean up */ |
182 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); | 182 | dbg("%s - urb shutting down with status: %d", __func__, urb->status); |
183 | return; | 183 | return; |
184 | /* -EPIPE: should clear the halt */ | 184 | /* -EPIPE: should clear the halt */ |
185 | default: /* error */ | 185 | default: /* error */ |
186 | dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status); | 186 | dbg("%s - nonzero urb status received: %d", __func__, urb->status); |
187 | goto resubmit; | 187 | goto resubmit; |
188 | } | 188 | } |
189 | 189 | ||
diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 5d1c15f83d23..7645e8812156 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c | |||
@@ -144,7 +144,7 @@ static int s3c2410wdt_start(void) | |||
144 | } | 144 | } |
145 | 145 | ||
146 | DBG("%s: wdt_count=0x%08x, wtcon=%08lx\n", | 146 | DBG("%s: wdt_count=0x%08x, wtcon=%08lx\n", |
147 | __FUNCTION__, wdt_count, wtcon); | 147 | __func__, wdt_count, wtcon); |
148 | 148 | ||
149 | writel(wdt_count, wdt_base + S3C2410_WTDAT); | 149 | writel(wdt_count, wdt_base + S3C2410_WTDAT); |
150 | writel(wdt_count, wdt_base + S3C2410_WTCNT); | 150 | writel(wdt_count, wdt_base + S3C2410_WTCNT); |
@@ -167,7 +167,7 @@ static int s3c2410wdt_set_heartbeat(int timeout) | |||
167 | count = timeout * freq; | 167 | count = timeout * freq; |
168 | 168 | ||
169 | DBG("%s: count=%d, timeout=%d, freq=%d\n", | 169 | DBG("%s: count=%d, timeout=%d, freq=%d\n", |
170 | __FUNCTION__, count, timeout, freq); | 170 | __func__, count, timeout, freq); |
171 | 171 | ||
172 | /* if the count is bigger than the watchdog register, | 172 | /* if the count is bigger than the watchdog register, |
173 | then work out what we need to do (and if) we can | 173 | then work out what we need to do (and if) we can |
@@ -189,7 +189,7 @@ static int s3c2410wdt_set_heartbeat(int timeout) | |||
189 | tmr_margin = timeout; | 189 | tmr_margin = timeout; |
190 | 190 | ||
191 | DBG("%s: timeout=%d, divisor=%d, count=%d (%08x)\n", | 191 | DBG("%s: timeout=%d, divisor=%d, count=%d (%08x)\n", |
192 | __FUNCTION__, timeout, divisor, count, count/divisor); | 192 | __func__, timeout, divisor, count, count/divisor); |
193 | 193 | ||
194 | count /= divisor; | 194 | count /= divisor; |
195 | wdt_count = count; | 195 | wdt_count = count; |
@@ -355,7 +355,7 @@ static int s3c2410wdt_probe(struct platform_device *pdev) | |||
355 | int ret; | 355 | int ret; |
356 | int size; | 356 | int size; |
357 | 357 | ||
358 | DBG("%s: probe=%p\n", __FUNCTION__, pdev); | 358 | DBG("%s: probe=%p\n", __func__, pdev); |
359 | 359 | ||
360 | dev = &pdev->dev; | 360 | dev = &pdev->dev; |
361 | wdt_dev = &pdev->dev; | 361 | wdt_dev = &pdev->dev; |
diff --git a/drivers/watchdog/shwdt.c b/drivers/watchdog/shwdt.c index 61dde863bd40..1277f7e9cc54 100644 --- a/drivers/watchdog/shwdt.c +++ b/drivers/watchdog/shwdt.c | |||
@@ -298,7 +298,7 @@ static int sh_wdt_mmap(struct file *file, struct vm_area_struct *vma) | |||
298 | if (io_remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT, | 298 | if (io_remap_pfn_range(vma, vma->vm_start, addr >> PAGE_SHIFT, |
299 | PAGE_SIZE, vma->vm_page_prot)) { | 299 | PAGE_SIZE, vma->vm_page_prot)) { |
300 | printk(KERN_ERR PFX "%s: io_remap_pfn_range failed\n", | 300 | printk(KERN_ERR PFX "%s: io_remap_pfn_range failed\n", |
301 | __FUNCTION__); | 301 | __func__); |
302 | return -EAGAIN; | 302 | return -EAGAIN; |
303 | } | 303 | } |
304 | 304 | ||
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c index 41a958a7585e..5e1a4fb5cacb 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c | |||
@@ -1424,6 +1424,18 @@ struct elf_note_info { | |||
1424 | int thread_notes; | 1424 | int thread_notes; |
1425 | }; | 1425 | }; |
1426 | 1426 | ||
1427 | /* | ||
1428 | * When a regset has a writeback hook, we call it on each thread before | ||
1429 | * dumping user memory. On register window machines, this makes sure the | ||
1430 | * user memory backing the register data is up to date before we read it. | ||
1431 | */ | ||
1432 | static void do_thread_regset_writeback(struct task_struct *task, | ||
1433 | const struct user_regset *regset) | ||
1434 | { | ||
1435 | if (regset->writeback) | ||
1436 | regset->writeback(task, regset, 1); | ||
1437 | } | ||
1438 | |||
1427 | static int fill_thread_core_info(struct elf_thread_core_info *t, | 1439 | static int fill_thread_core_info(struct elf_thread_core_info *t, |
1428 | const struct user_regset_view *view, | 1440 | const struct user_regset_view *view, |
1429 | long signr, size_t *total) | 1441 | long signr, size_t *total) |
@@ -1445,6 +1457,8 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, | |||
1445 | sizeof(t->prstatus), &t->prstatus); | 1457 | sizeof(t->prstatus), &t->prstatus); |
1446 | *total += notesize(&t->notes[0]); | 1458 | *total += notesize(&t->notes[0]); |
1447 | 1459 | ||
1460 | do_thread_regset_writeback(t->task, &view->regsets[0]); | ||
1461 | |||
1448 | /* | 1462 | /* |
1449 | * Each other regset might generate a note too. For each regset | 1463 | * Each other regset might generate a note too. For each regset |
1450 | * that has no core_note_type or is inactive, we leave t->notes[i] | 1464 | * that has no core_note_type or is inactive, we leave t->notes[i] |
@@ -1452,6 +1466,7 @@ static int fill_thread_core_info(struct elf_thread_core_info *t, | |||
1452 | */ | 1466 | */ |
1453 | for (i = 1; i < view->n; ++i) { | 1467 | for (i = 1; i < view->n; ++i) { |
1454 | const struct user_regset *regset = &view->regsets[i]; | 1468 | const struct user_regset *regset = &view->regsets[i]; |
1469 | do_thread_regset_writeback(t->task, regset); | ||
1455 | if (regset->core_note_type && | 1470 | if (regset->core_note_type && |
1456 | (!regset->active || regset->active(t->task, regset))) { | 1471 | (!regset->active || regset->active(t->task, regset))) { |
1457 | int ret; | 1472 | int ret; |
diff --git a/fs/buffer.c b/fs/buffer.c index 3ebccf4aa7e3..ddfdd2c80bf9 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
@@ -627,8 +627,7 @@ repeat: | |||
627 | } | 627 | } |
628 | 628 | ||
629 | /** | 629 | /** |
630 | * sync_mapping_buffers - write out and wait upon a mapping's "associated" | 630 | * sync_mapping_buffers - write out & wait upon a mapping's "associated" buffers |
631 | * buffers | ||
632 | * @mapping: the mapping which wants those buffers written | 631 | * @mapping: the mapping which wants those buffers written |
633 | * | 632 | * |
634 | * Starts I/O against the buffers at mapping->private_list, and waits upon | 633 | * Starts I/O against the buffers at mapping->private_list, and waits upon |
@@ -836,7 +835,7 @@ static int fsync_buffers_list(spinlock_t *lock, struct list_head *list) | |||
836 | smp_mb(); | 835 | smp_mb(); |
837 | if (buffer_dirty(bh)) { | 836 | if (buffer_dirty(bh)) { |
838 | list_add(&bh->b_assoc_buffers, | 837 | list_add(&bh->b_assoc_buffers, |
839 | &bh->b_assoc_map->private_list); | 838 | &mapping->private_list); |
840 | bh->b_assoc_map = mapping; | 839 | bh->b_assoc_map = mapping; |
841 | } | 840 | } |
842 | spin_unlock(lock); | 841 | spin_unlock(lock); |
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index edd248367b36..dbd91461853c 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
@@ -6,7 +6,9 @@ and sync so that events like out of disk space get reported properly on | |||
6 | cached files. Fix setxattr failure to certain Samba versions. Fix mount | 6 | cached files. Fix setxattr failure to certain Samba versions. Fix mount |
7 | of second share to disconnected server session (autoreconnect on this). | 7 | of second share to disconnected server session (autoreconnect on this). |
8 | Add ability to modify cifs acls for handling chmod (when mounted with | 8 | Add ability to modify cifs acls for handling chmod (when mounted with |
9 | cifsacl flag). | 9 | cifsacl flag). Fix prefixpath path separator so we can handle mounts |
10 | with prefixpaths longer than one directory (one path component) when | ||
11 | mounted to Windows servers. | ||
10 | 12 | ||
11 | Version 1.51 | 13 | Version 1.51 |
12 | ------------ | 14 | ------------ |
diff --git a/fs/cifs/README b/fs/cifs/README index c623e2f9c5db..50306229b0f9 100644 --- a/fs/cifs/README +++ b/fs/cifs/README | |||
@@ -461,7 +461,7 @@ A partial list of the supported mount options follows: | |||
461 | cifsacl Report mode bits (e.g. on stat) based on the Windows ACL for | 461 | cifsacl Report mode bits (e.g. on stat) based on the Windows ACL for |
462 | the file. (EXPERIMENTAL) | 462 | the file. (EXPERIMENTAL) |
463 | servern Specify the server 's netbios name (RFC1001 name) to use | 463 | servern Specify the server 's netbios name (RFC1001 name) to use |
464 | when attempting to setup a session to the server. This is | 464 | when attempting to setup a session to the server. |
465 | This is needed for mounting to some older servers (such | 465 | This is needed for mounting to some older servers (such |
466 | as OS/2 or Windows 98 and Windows ME) since they do not | 466 | as OS/2 or Windows 98 and Windows ME) since they do not |
467 | support a default server name. A server name can be up | 467 | support a default server name. A server name can be up |
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 73c4c419663c..0228ed06069e 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c | |||
@@ -98,8 +98,7 @@ void cifs_dump_mids(struct TCP_Server_Info *server) | |||
98 | if (mid_entry->resp_buf) { | 98 | if (mid_entry->resp_buf) { |
99 | cifs_dump_detail(mid_entry->resp_buf); | 99 | cifs_dump_detail(mid_entry->resp_buf); |
100 | cifs_dump_mem("existing buf: ", | 100 | cifs_dump_mem("existing buf: ", |
101 | mid_entry->resp_buf, | 101 | mid_entry->resp_buf, 62); |
102 | 62 /* fixme */); | ||
103 | } | 102 | } |
104 | } | 103 | } |
105 | } | 104 | } |
@@ -439,7 +438,7 @@ cifs_stats_read(char *buf, char **beginBuffer, off_t offset, | |||
439 | 438 | ||
440 | return length; | 439 | return length; |
441 | } | 440 | } |
442 | #endif | 441 | #endif /* STATS */ |
443 | 442 | ||
444 | static struct proc_dir_entry *proc_fs_cifs; | 443 | static struct proc_dir_entry *proc_fs_cifs; |
445 | read_proc_t cifs_txanchor_read; | 444 | read_proc_t cifs_txanchor_read; |
@@ -482,7 +481,7 @@ cifs_proc_init(void) | |||
482 | cifs_stats_read, NULL); | 481 | cifs_stats_read, NULL); |
483 | if (pde) | 482 | if (pde) |
484 | pde->write_proc = cifs_stats_write; | 483 | pde->write_proc = cifs_stats_write; |
485 | #endif | 484 | #endif /* STATS */ |
486 | pde = create_proc_read_entry("cifsFYI", 0, proc_fs_cifs, | 485 | pde = create_proc_read_entry("cifsFYI", 0, proc_fs_cifs, |
487 | cifsFYI_read, NULL); | 486 | cifsFYI_read, NULL); |
488 | if (pde) | 487 | if (pde) |
@@ -918,4 +917,12 @@ security_flags_write(struct file *file, const char __user *buffer, | |||
918 | /* BB should we turn on MAY flags for other MUST options? */ | 917 | /* BB should we turn on MAY flags for other MUST options? */ |
919 | return count; | 918 | return count; |
920 | } | 919 | } |
921 | #endif | 920 | #else |
921 | inline void cifs_proc_init(void) | ||
922 | { | ||
923 | } | ||
924 | |||
925 | inline void cifs_proc_clean(void) | ||
926 | { | ||
927 | } | ||
928 | #endif /* PROC_FS */ | ||
diff --git a/fs/cifs/cifs_debug.h b/fs/cifs/cifs_debug.h index c26cd0d2c6d5..5eb3b83bbfa7 100644 --- a/fs/cifs/cifs_debug.h +++ b/fs/cifs/cifs_debug.h | |||
@@ -25,8 +25,11 @@ | |||
25 | 25 | ||
26 | void cifs_dump_mem(char *label, void *data, int length); | 26 | void cifs_dump_mem(char *label, void *data, int length); |
27 | #ifdef CONFIG_CIFS_DEBUG2 | 27 | #ifdef CONFIG_CIFS_DEBUG2 |
28 | #define DBG2 2 | ||
28 | void cifs_dump_detail(struct smb_hdr *); | 29 | void cifs_dump_detail(struct smb_hdr *); |
29 | void cifs_dump_mids(struct TCP_Server_Info *); | 30 | void cifs_dump_mids(struct TCP_Server_Info *); |
31 | #else | ||
32 | #define DBG2 0 | ||
30 | #endif | 33 | #endif |
31 | extern int traceSMB; /* flag which enables the function below */ | 34 | extern int traceSMB; /* flag which enables the function below */ |
32 | void dump_smb(struct smb_hdr *, int); | 35 | void dump_smb(struct smb_hdr *, int); |
@@ -64,10 +67,10 @@ extern int cifsERROR; | |||
64 | * --------- | 67 | * --------- |
65 | */ | 68 | */ |
66 | #else /* _CIFS_DEBUG */ | 69 | #else /* _CIFS_DEBUG */ |
67 | #define cERROR(button,prspec) | 70 | #define cERROR(button, prspec) |
68 | #define cEVENT(format,arg...) | 71 | #define cEVENT(format, arg...) |
69 | #define cFYI(button, prspec) | 72 | #define cFYI(button, prspec) |
70 | #define cifserror(format,arg...) | 73 | #define cifserror(format, arg...) |
71 | #endif /* _CIFS_DEBUG */ | 74 | #endif /* _CIFS_DEBUG */ |
72 | 75 | ||
73 | #endif /* _H_CIFS_DEBUG */ | 76 | #endif /* _H_CIFS_DEBUG */ |
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index 6ad447529961..7f8838253410 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
@@ -286,7 +286,7 @@ static void dump_referral(const struct dfs_info3_param *ref) | |||
286 | cFYI(1, ("DFS: node path: %s", ref->node_name)); | 286 | cFYI(1, ("DFS: node path: %s", ref->node_name)); |
287 | cFYI(1, ("DFS: fl: %hd, srv_type: %hd", ref->flags, ref->server_type)); | 287 | cFYI(1, ("DFS: fl: %hd, srv_type: %hd", ref->flags, ref->server_type)); |
288 | cFYI(1, ("DFS: ref_flags: %hd, path_consumed: %hd", ref->ref_flag, | 288 | cFYI(1, ("DFS: ref_flags: %hd, path_consumed: %hd", ref->ref_flag, |
289 | ref->PathConsumed)); | 289 | ref->path_consumed)); |
290 | } | 290 | } |
291 | 291 | ||
292 | 292 | ||
diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c index d543accc10dd..6653e29637a7 100644 --- a/fs/cifs/cifs_spnego.c +++ b/fs/cifs/cifs_spnego.c | |||
@@ -125,7 +125,7 @@ cifs_get_spnego_key(struct cifsSesInfo *sesInfo) | |||
125 | #ifdef CONFIG_CIFS_DEBUG2 | 125 | #ifdef CONFIG_CIFS_DEBUG2 |
126 | if (cifsFYI && !IS_ERR(spnego_key)) { | 126 | if (cifsFYI && !IS_ERR(spnego_key)) { |
127 | struct cifs_spnego_msg *msg = spnego_key->payload.data; | 127 | struct cifs_spnego_msg *msg = spnego_key->payload.data; |
128 | cifs_dump_mem("SPNEGO reply blob:", msg->data, min(1024, | 128 | cifs_dump_mem("SPNEGO reply blob:", msg->data, min(1024U, |
129 | msg->secblob_len + msg->sesskey_len)); | 129 | msg->secblob_len + msg->sesskey_len)); |
130 | } | 130 | } |
131 | #endif /* CONFIG_CIFS_DEBUG2 */ | 131 | #endif /* CONFIG_CIFS_DEBUG2 */ |
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c index b5903b89250d..7d75272a6b3f 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c | |||
@@ -32,7 +32,7 @@ | |||
32 | * | 32 | * |
33 | */ | 33 | */ |
34 | int | 34 | int |
35 | cifs_strfromUCS_le(char *to, const __le16 * from, | 35 | cifs_strfromUCS_le(char *to, const __le16 *from, |
36 | int len, const struct nls_table *codepage) | 36 | int len, const struct nls_table *codepage) |
37 | { | 37 | { |
38 | int i; | 38 | int i; |
@@ -61,7 +61,7 @@ cifs_strfromUCS_le(char *to, const __le16 * from, | |||
61 | * | 61 | * |
62 | */ | 62 | */ |
63 | int | 63 | int |
64 | cifs_strtoUCS(__le16 * to, const char *from, int len, | 64 | cifs_strtoUCS(__le16 *to, const char *from, int len, |
65 | const struct nls_table *codepage) | 65 | const struct nls_table *codepage) |
66 | { | 66 | { |
67 | int charlen; | 67 | int charlen; |
diff --git a/fs/cifs/cifs_unicode.h b/fs/cifs/cifs_unicode.h index 614c11fcdcb6..14eb9a2395d3 100644 --- a/fs/cifs/cifs_unicode.h +++ b/fs/cifs/cifs_unicode.h | |||
@@ -254,7 +254,8 @@ UniStrstr(const wchar_t *ucs1, const wchar_t *ucs2) | |||
254 | const wchar_t *anchor2 = ucs2; | 254 | const wchar_t *anchor2 = ucs2; |
255 | 255 | ||
256 | while (*ucs1) { | 256 | while (*ucs1) { |
257 | if (*ucs1 == *ucs2) { /* Partial match found */ | 257 | if (*ucs1 == *ucs2) { |
258 | /* Partial match found */ | ||
258 | ucs1++; | 259 | ucs1++; |
259 | ucs2++; | 260 | ucs2++; |
260 | } else { | 261 | } else { |
@@ -279,7 +280,8 @@ UniToupper(register wchar_t uc) | |||
279 | { | 280 | { |
280 | register const struct UniCaseRange *rp; | 281 | register const struct UniCaseRange *rp; |
281 | 282 | ||
282 | if (uc < sizeof (CifsUniUpperTable)) { /* Latin characters */ | 283 | if (uc < sizeof(CifsUniUpperTable)) { |
284 | /* Latin characters */ | ||
283 | return uc + CifsUniUpperTable[uc]; /* Use base tables */ | 285 | return uc + CifsUniUpperTable[uc]; /* Use base tables */ |
284 | } else { | 286 | } else { |
285 | rp = CifsUniUpperRange; /* Use range tables */ | 287 | rp = CifsUniUpperRange; /* Use range tables */ |
@@ -320,7 +322,8 @@ UniTolower(wchar_t uc) | |||
320 | { | 322 | { |
321 | register struct UniCaseRange *rp; | 323 | register struct UniCaseRange *rp; |
322 | 324 | ||
323 | if (uc < sizeof (UniLowerTable)) { /* Latin characters */ | 325 | if (uc < sizeof(UniLowerTable)) { |
326 | /* Latin characters */ | ||
324 | return uc + UniLowerTable[uc]; /* Use base tables */ | 327 | return uc + UniLowerTable[uc]; /* Use base tables */ |
325 | } else { | 328 | } else { |
326 | rp = UniLowerRange; /* Use range tables */ | 329 | rp = UniLowerRange; /* Use range tables */ |
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index a7035bd18e4e..f93932c21772 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c | |||
@@ -46,8 +46,7 @@ static struct cifs_wksid wksidarr[NUM_WK_SIDS] = { | |||
46 | static const struct cifs_sid sid_everyone = { | 46 | static const struct cifs_sid sid_everyone = { |
47 | 1, 1, {0, 0, 0, 0, 0, 1}, {0} }; | 47 | 1, 1, {0, 0, 0, 0, 0, 1}, {0} }; |
48 | /* group users */ | 48 | /* group users */ |
49 | static const struct cifs_sid sid_user = | 49 | static const struct cifs_sid sid_user = {1, 2 , {0, 0, 0, 0, 0, 5}, {} }; |
50 | {1, 2 , {0, 0, 0, 0, 0, 5}, {} }; | ||
51 | 50 | ||
52 | 51 | ||
53 | int match_sid(struct cifs_sid *ctsid) | 52 | int match_sid(struct cifs_sid *ctsid) |
@@ -195,9 +194,9 @@ static void access_flags_to_mode(__le32 ace_flags, int type, umode_t *pmode, | |||
195 | /* For deny ACEs we change the mask so that subsequent allow access | 194 | /* For deny ACEs we change the mask so that subsequent allow access |
196 | control entries do not turn on the bits we are denying */ | 195 | control entries do not turn on the bits we are denying */ |
197 | if (type == ACCESS_DENIED) { | 196 | if (type == ACCESS_DENIED) { |
198 | if (flags & GENERIC_ALL) { | 197 | if (flags & GENERIC_ALL) |
199 | *pbits_to_set &= ~S_IRWXUGO; | 198 | *pbits_to_set &= ~S_IRWXUGO; |
200 | } | 199 | |
201 | if ((flags & GENERIC_WRITE) || | 200 | if ((flags & GENERIC_WRITE) || |
202 | ((flags & FILE_WRITE_RIGHTS) == FILE_WRITE_RIGHTS)) | 201 | ((flags & FILE_WRITE_RIGHTS) == FILE_WRITE_RIGHTS)) |
203 | *pbits_to_set &= ~S_IWUGO; | 202 | *pbits_to_set &= ~S_IWUGO; |
@@ -216,9 +215,7 @@ static void access_flags_to_mode(__le32 ace_flags, int type, umode_t *pmode, | |||
216 | 215 | ||
217 | if (flags & GENERIC_ALL) { | 216 | if (flags & GENERIC_ALL) { |
218 | *pmode |= (S_IRWXUGO & (*pbits_to_set)); | 217 | *pmode |= (S_IRWXUGO & (*pbits_to_set)); |
219 | #ifdef CONFIG_CIFS_DEBUG2 | 218 | cFYI(DBG2, ("all perms")); |
220 | cFYI(1, ("all perms")); | ||
221 | #endif | ||
222 | return; | 219 | return; |
223 | } | 220 | } |
224 | if ((flags & GENERIC_WRITE) || | 221 | if ((flags & GENERIC_WRITE) || |
@@ -231,9 +228,7 @@ static void access_flags_to_mode(__le32 ace_flags, int type, umode_t *pmode, | |||
231 | ((flags & FILE_EXEC_RIGHTS) == FILE_EXEC_RIGHTS)) | 228 | ((flags & FILE_EXEC_RIGHTS) == FILE_EXEC_RIGHTS)) |
232 | *pmode |= (S_IXUGO & (*pbits_to_set)); | 229 | *pmode |= (S_IXUGO & (*pbits_to_set)); |
233 | 230 | ||
234 | #ifdef CONFIG_CIFS_DEBUG2 | 231 | cFYI(DBG2, ("access flags 0x%x mode now 0x%x", flags, *pmode)); |
235 | cFYI(1, ("access flags 0x%x mode now 0x%x", flags, *pmode)); | ||
236 | #endif | ||
237 | return; | 232 | return; |
238 | } | 233 | } |
239 | 234 | ||
@@ -262,9 +257,7 @@ static void mode_to_access_flags(umode_t mode, umode_t bits_to_use, | |||
262 | if (mode & S_IXUGO) | 257 | if (mode & S_IXUGO) |
263 | *pace_flags |= SET_FILE_EXEC_RIGHTS; | 258 | *pace_flags |= SET_FILE_EXEC_RIGHTS; |
264 | 259 | ||
265 | #ifdef CONFIG_CIFS_DEBUG2 | 260 | cFYI(DBG2, ("mode: 0x%x, access flags now 0x%x", mode, *pace_flags)); |
266 | cFYI(1, ("mode: 0x%x, access flags now 0x%x", mode, *pace_flags)); | ||
267 | #endif | ||
268 | return; | 261 | return; |
269 | } | 262 | } |
270 | 263 | ||
@@ -358,11 +351,9 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl, | |||
358 | return; | 351 | return; |
359 | } | 352 | } |
360 | 353 | ||
361 | #ifdef CONFIG_CIFS_DEBUG2 | 354 | cFYI(DBG2, ("DACL revision %d size %d num aces %d", |
362 | cFYI(1, ("DACL revision %d size %d num aces %d", | ||
363 | le16_to_cpu(pdacl->revision), le16_to_cpu(pdacl->size), | 355 | le16_to_cpu(pdacl->revision), le16_to_cpu(pdacl->size), |
364 | le32_to_cpu(pdacl->num_aces))); | 356 | le32_to_cpu(pdacl->num_aces))); |
365 | #endif | ||
366 | 357 | ||
367 | /* reset rwx permissions for user/group/other. | 358 | /* reset rwx permissions for user/group/other. |
368 | Also, if num_aces is 0 i.e. DACL has no ACEs, | 359 | Also, if num_aces is 0 i.e. DACL has no ACEs, |
@@ -381,10 +372,6 @@ static void parse_dacl(struct cifs_acl *pdacl, char *end_of_acl, | |||
381 | ppace = kmalloc(num_aces * sizeof(struct cifs_ace *), | 372 | ppace = kmalloc(num_aces * sizeof(struct cifs_ace *), |
382 | GFP_KERNEL); | 373 | GFP_KERNEL); |
383 | 374 | ||
384 | /* cifscred->cecount = pdacl->num_aces; | ||
385 | cifscred->aces = kmalloc(num_aces * | ||
386 | sizeof(struct cifs_ace *), GFP_KERNEL);*/ | ||
387 | |||
388 | for (i = 0; i < num_aces; ++i) { | 375 | for (i = 0; i < num_aces; ++i) { |
389 | ppace[i] = (struct cifs_ace *) (acl_base + acl_size); | 376 | ppace[i] = (struct cifs_ace *) (acl_base + acl_size); |
390 | #ifdef CONFIG_CIFS_DEBUG2 | 377 | #ifdef CONFIG_CIFS_DEBUG2 |
@@ -437,7 +424,7 @@ static int set_chmod_dacl(struct cifs_acl *pndacl, struct cifs_sid *pownersid, | |||
437 | &sid_everyone, nmode, S_IRWXO); | 424 | &sid_everyone, nmode, S_IRWXO); |
438 | 425 | ||
439 | pndacl->size = cpu_to_le16(size + sizeof(struct cifs_acl)); | 426 | pndacl->size = cpu_to_le16(size + sizeof(struct cifs_acl)); |
440 | pndacl->num_aces = 3; | 427 | pndacl->num_aces = cpu_to_le32(3); |
441 | 428 | ||
442 | return (0); | 429 | return (0); |
443 | } | 430 | } |
@@ -495,13 +482,11 @@ static int parse_sec_desc(struct cifs_ntsd *pntsd, int acl_len, | |||
495 | le32_to_cpu(pntsd->gsidoffset)); | 482 | le32_to_cpu(pntsd->gsidoffset)); |
496 | dacloffset = le32_to_cpu(pntsd->dacloffset); | 483 | dacloffset = le32_to_cpu(pntsd->dacloffset); |
497 | dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset); | 484 | dacl_ptr = (struct cifs_acl *)((char *)pntsd + dacloffset); |
498 | #ifdef CONFIG_CIFS_DEBUG2 | 485 | cFYI(DBG2, ("revision %d type 0x%x ooffset 0x%x goffset 0x%x " |
499 | cFYI(1, ("revision %d type 0x%x ooffset 0x%x goffset 0x%x " | ||
500 | "sacloffset 0x%x dacloffset 0x%x", | 486 | "sacloffset 0x%x dacloffset 0x%x", |
501 | pntsd->revision, pntsd->type, le32_to_cpu(pntsd->osidoffset), | 487 | pntsd->revision, pntsd->type, le32_to_cpu(pntsd->osidoffset), |
502 | le32_to_cpu(pntsd->gsidoffset), | 488 | le32_to_cpu(pntsd->gsidoffset), |
503 | le32_to_cpu(pntsd->sacloffset), dacloffset)); | 489 | le32_to_cpu(pntsd->sacloffset), dacloffset)); |
504 | #endif | ||
505 | /* cifs_dump_mem("owner_sid: ", owner_sid_ptr, 64); */ | 490 | /* cifs_dump_mem("owner_sid: ", owner_sid_ptr, 64); */ |
506 | rc = parse_sid(owner_sid_ptr, end_of_acl); | 491 | rc = parse_sid(owner_sid_ptr, end_of_acl); |
507 | if (rc) | 492 | if (rc) |
@@ -636,9 +621,7 @@ static int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen, | |||
636 | struct super_block *sb; | 621 | struct super_block *sb; |
637 | struct cifs_sb_info *cifs_sb; | 622 | struct cifs_sb_info *cifs_sb; |
638 | 623 | ||
639 | #ifdef CONFIG_CIFS_DEBUG2 | 624 | cFYI(DBG2, ("set ACL for %s from mode 0x%x", path, inode->i_mode)); |
640 | cFYI(1, ("set ACL for %s from mode 0x%x", path, inode->i_mode)); | ||
641 | #endif | ||
642 | 625 | ||
643 | if (!inode) | 626 | if (!inode) |
644 | return (rc); | 627 | return (rc); |
@@ -669,9 +652,7 @@ static int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen, | |||
669 | } | 652 | } |
670 | 653 | ||
671 | rc = CIFSSMBSetCIFSACL(xid, cifs_sb->tcon, fid, pnntsd, acllen); | 654 | rc = CIFSSMBSetCIFSACL(xid, cifs_sb->tcon, fid, pnntsd, acllen); |
672 | #ifdef CONFIG_CIFS_DEBUG2 | 655 | cFYI(DBG2, ("SetCIFSACL rc = %d", rc)); |
673 | cFYI(1, ("SetCIFSACL rc = %d", rc)); | ||
674 | #endif | ||
675 | if (unlock_file == TRUE) | 656 | if (unlock_file == TRUE) |
676 | atomic_dec(&open_file->wrtPending); | 657 | atomic_dec(&open_file->wrtPending); |
677 | else | 658 | else |
@@ -689,9 +670,7 @@ void acl_to_uid_mode(struct inode *inode, const char *path) | |||
689 | u32 acllen = 0; | 670 | u32 acllen = 0; |
690 | int rc = 0; | 671 | int rc = 0; |
691 | 672 | ||
692 | #ifdef CONFIG_CIFS_DEBUG2 | 673 | cFYI(DBG2, ("converting ACL to mode for %s", path)); |
693 | cFYI(1, ("converting ACL to mode for %s", path)); | ||
694 | #endif | ||
695 | pntsd = get_cifs_acl(&acllen, inode, path); | 674 | pntsd = get_cifs_acl(&acllen, inode, path); |
696 | 675 | ||
697 | /* if we can retrieve the ACL, now parse Access Control Entries, ACEs */ | 676 | /* if we can retrieve the ACL, now parse Access Control Entries, ACEs */ |
@@ -712,9 +691,7 @@ int mode_to_acl(struct inode *inode, const char *path, __u64 nmode) | |||
712 | struct cifs_ntsd *pntsd = NULL; /* acl obtained from server */ | 691 | struct cifs_ntsd *pntsd = NULL; /* acl obtained from server */ |
713 | struct cifs_ntsd *pnntsd = NULL; /* modified acl to be sent to server */ | 692 | struct cifs_ntsd *pnntsd = NULL; /* modified acl to be sent to server */ |
714 | 693 | ||
715 | #ifdef CONFIG_CIFS_DEBUG2 | 694 | cFYI(DBG2, ("set ACL from mode for %s", path)); |
716 | cFYI(1, ("set ACL from mode for %s", path)); | ||
717 | #endif | ||
718 | 695 | ||
719 | /* Get the security descriptor */ | 696 | /* Get the security descriptor */ |
720 | pntsd = get_cifs_acl(&acllen, inode, path); | 697 | pntsd = get_cifs_acl(&acllen, inode, path); |
@@ -736,16 +713,12 @@ int mode_to_acl(struct inode *inode, const char *path, __u64 nmode) | |||
736 | 713 | ||
737 | rc = build_sec_desc(pntsd, pnntsd, acllen, inode, nmode); | 714 | rc = build_sec_desc(pntsd, pnntsd, acllen, inode, nmode); |
738 | 715 | ||
739 | #ifdef CONFIG_CIFS_DEBUG2 | 716 | cFYI(DBG2, ("build_sec_desc rc: %d", rc)); |
740 | cFYI(1, ("build_sec_desc rc: %d", rc)); | ||
741 | #endif | ||
742 | 717 | ||
743 | if (!rc) { | 718 | if (!rc) { |
744 | /* Set the security descriptor */ | 719 | /* Set the security descriptor */ |
745 | rc = set_cifs_acl(pnntsd, acllen, inode, path); | 720 | rc = set_cifs_acl(pnntsd, acllen, inode, path); |
746 | #ifdef CONFIG_CIFS_DEBUG2 | 721 | cFYI(DBG2, ("set_cifs_acl rc: %d", rc)); |
747 | cFYI(1, ("set_cifs_acl rc: %d", rc)); | ||
748 | #endif | ||
749 | } | 722 | } |
750 | 723 | ||
751 | kfree(pnntsd); | 724 | kfree(pnntsd); |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index fcc434227691..a04b17e5a9d0 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -204,9 +204,8 @@ cifs_put_super(struct super_block *sb) | |||
204 | return; | 204 | return; |
205 | } | 205 | } |
206 | rc = cifs_umount(sb, cifs_sb); | 206 | rc = cifs_umount(sb, cifs_sb); |
207 | if (rc) { | 207 | if (rc) |
208 | cERROR(1, ("cifs_umount failed with return code %d", rc)); | 208 | cERROR(1, ("cifs_umount failed with return code %d", rc)); |
209 | } | ||
210 | #ifdef CONFIG_CIFS_DFS_UPCALL | 209 | #ifdef CONFIG_CIFS_DFS_UPCALL |
211 | if (cifs_sb->mountdata) { | 210 | if (cifs_sb->mountdata) { |
212 | kfree(cifs_sb->mountdata); | 211 | kfree(cifs_sb->mountdata); |
@@ -461,7 +460,7 @@ int cifs_xstate_get(struct super_block *sb, struct fs_quota_stat *qstats) | |||
461 | 460 | ||
462 | static struct quotactl_ops cifs_quotactl_ops = { | 461 | static struct quotactl_ops cifs_quotactl_ops = { |
463 | .set_xquota = cifs_xquota_set, | 462 | .set_xquota = cifs_xquota_set, |
464 | .get_xquota = cifs_xquota_set, | 463 | .get_xquota = cifs_xquota_get, |
465 | .set_xstate = cifs_xstate_set, | 464 | .set_xstate = cifs_xstate_set, |
466 | .get_xstate = cifs_xstate_get, | 465 | .get_xstate = cifs_xstate_get, |
467 | }; | 466 | }; |
@@ -472,9 +471,7 @@ static void cifs_umount_begin(struct vfsmount *vfsmnt, int flags) | |||
472 | struct cifs_sb_info *cifs_sb; | 471 | struct cifs_sb_info *cifs_sb; |
473 | struct cifsTconInfo *tcon; | 472 | struct cifsTconInfo *tcon; |
474 | 473 | ||
475 | #ifdef CONFIG_CIFS_DFS_UPCALL | ||
476 | dfs_shrink_umount_helper(vfsmnt); | 474 | dfs_shrink_umount_helper(vfsmnt); |
477 | #endif /* CONFIG CIFS_DFS_UPCALL */ | ||
478 | 475 | ||
479 | if (!(flags & MNT_FORCE)) | 476 | if (!(flags & MNT_FORCE)) |
480 | return; | 477 | return; |
@@ -992,9 +989,7 @@ static int __init | |||
992 | init_cifs(void) | 989 | init_cifs(void) |
993 | { | 990 | { |
994 | int rc = 0; | 991 | int rc = 0; |
995 | #ifdef CONFIG_PROC_FS | ||
996 | cifs_proc_init(); | 992 | cifs_proc_init(); |
997 | #endif | ||
998 | /* INIT_LIST_HEAD(&GlobalServerList);*/ /* BB not implemented yet */ | 993 | /* INIT_LIST_HEAD(&GlobalServerList);*/ /* BB not implemented yet */ |
999 | INIT_LIST_HEAD(&GlobalSMBSessionList); | 994 | INIT_LIST_HEAD(&GlobalSMBSessionList); |
1000 | INIT_LIST_HEAD(&GlobalTreeConnectionList); | 995 | INIT_LIST_HEAD(&GlobalTreeConnectionList); |
@@ -1095,19 +1090,15 @@ init_cifs(void) | |||
1095 | out_destroy_inodecache: | 1090 | out_destroy_inodecache: |
1096 | cifs_destroy_inodecache(); | 1091 | cifs_destroy_inodecache(); |
1097 | out_clean_proc: | 1092 | out_clean_proc: |
1098 | #ifdef CONFIG_PROC_FS | ||
1099 | cifs_proc_clean(); | 1093 | cifs_proc_clean(); |
1100 | #endif | ||
1101 | return rc; | 1094 | return rc; |
1102 | } | 1095 | } |
1103 | 1096 | ||
1104 | static void __exit | 1097 | static void __exit |
1105 | exit_cifs(void) | 1098 | exit_cifs(void) |
1106 | { | 1099 | { |
1107 | cFYI(0, ("exit_cifs")); | 1100 | cFYI(DBG2, ("exit_cifs")); |
1108 | #ifdef CONFIG_PROC_FS | ||
1109 | cifs_proc_clean(); | 1101 | cifs_proc_clean(); |
1110 | #endif | ||
1111 | #ifdef CONFIG_CIFS_DFS_UPCALL | 1102 | #ifdef CONFIG_CIFS_DFS_UPCALL |
1112 | unregister_key_type(&key_type_dns_resolver); | 1103 | unregister_key_type(&key_type_dns_resolver); |
1113 | #endif | 1104 | #endif |
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index 5d32d8ddc82e..69a2e1942542 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h | |||
@@ -454,7 +454,7 @@ struct dir_notify_req { | |||
454 | 454 | ||
455 | struct dfs_info3_param { | 455 | struct dfs_info3_param { |
456 | int flags; /* DFSREF_REFERRAL_SERVER, DFSREF_STORAGE_SERVER*/ | 456 | int flags; /* DFSREF_REFERRAL_SERVER, DFSREF_STORAGE_SERVER*/ |
457 | int PathConsumed; | 457 | int path_consumed; |
458 | int server_type; | 458 | int server_type; |
459 | int ref_flag; | 459 | int ref_flag; |
460 | char *path_name; | 460 | char *path_name; |
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 2f09f565a3d9..0af63e6b426b 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
@@ -53,11 +53,11 @@ extern int SendReceiveNoRsp(const unsigned int xid, struct cifsSesInfo *ses, | |||
53 | extern int SendReceive2(const unsigned int /* xid */ , struct cifsSesInfo *, | 53 | extern int SendReceive2(const unsigned int /* xid */ , struct cifsSesInfo *, |
54 | struct kvec *, int /* nvec to send */, | 54 | struct kvec *, int /* nvec to send */, |
55 | int * /* type of buf returned */ , const int flags); | 55 | int * /* type of buf returned */ , const int flags); |
56 | extern int SendReceiveBlockingLock(const unsigned int /* xid */ , | 56 | extern int SendReceiveBlockingLock(const unsigned int xid, |
57 | struct cifsTconInfo *, | 57 | struct cifsTconInfo *ptcon, |
58 | struct smb_hdr * /* input */ , | 58 | struct smb_hdr *in_buf , |
59 | struct smb_hdr * /* out */ , | 59 | struct smb_hdr *out_buf, |
60 | int * /* bytes returned */); | 60 | int *bytes_returned); |
61 | extern int checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length); | 61 | extern int checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length); |
62 | extern int is_valid_oplock_break(struct smb_hdr *smb, struct TCP_Server_Info *); | 62 | extern int is_valid_oplock_break(struct smb_hdr *smb, struct TCP_Server_Info *); |
63 | extern int is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof); | 63 | extern int is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof); |
@@ -84,7 +84,7 @@ extern __u16 GetNextMid(struct TCP_Server_Info *server); | |||
84 | extern struct oplock_q_entry *AllocOplockQEntry(struct inode *, u16, | 84 | extern struct oplock_q_entry *AllocOplockQEntry(struct inode *, u16, |
85 | struct cifsTconInfo *); | 85 | struct cifsTconInfo *); |
86 | extern void DeleteOplockQEntry(struct oplock_q_entry *); | 86 | extern void DeleteOplockQEntry(struct oplock_q_entry *); |
87 | extern struct timespec cifs_NTtimeToUnix(u64 /* utc nanoseconds since 1601 */ ); | 87 | extern struct timespec cifs_NTtimeToUnix(u64 utc_nanoseconds_since_1601); |
88 | extern u64 cifs_UnixTimeToNT(struct timespec); | 88 | extern u64 cifs_UnixTimeToNT(struct timespec); |
89 | extern __le64 cnvrtDosCifsTm(__u16 date, __u16 time); | 89 | extern __le64 cnvrtDosCifsTm(__u16 date, __u16 time); |
90 | extern struct timespec cnvrtDosUnixTm(__u16 date, __u16 time); | 90 | extern struct timespec cnvrtDosUnixTm(__u16 date, __u16 time); |
@@ -104,7 +104,11 @@ extern int cifs_mount(struct super_block *, struct cifs_sb_info *, char *, | |||
104 | extern int cifs_umount(struct super_block *, struct cifs_sb_info *); | 104 | extern int cifs_umount(struct super_block *, struct cifs_sb_info *); |
105 | #ifdef CONFIG_CIFS_DFS_UPCALL | 105 | #ifdef CONFIG_CIFS_DFS_UPCALL |
106 | extern void dfs_shrink_umount_helper(struct vfsmount *vfsmnt); | 106 | extern void dfs_shrink_umount_helper(struct vfsmount *vfsmnt); |
107 | #endif | 107 | #else |
108 | static inline void dfs_shrink_umount_helper(struct vfsmount *vfsmnt) | ||
109 | { | ||
110 | } | ||
111 | #endif /* DFS_UPCALL */ | ||
108 | void cifs_proc_init(void); | 112 | void cifs_proc_init(void); |
109 | void cifs_proc_clean(void); | 113 | void cifs_proc_clean(void); |
110 | 114 | ||
@@ -175,11 +179,11 @@ extern int CIFSSMBQFSPosixInfo(const int xid, struct cifsTconInfo *tcon, | |||
175 | struct kstatfs *FSData); | 179 | struct kstatfs *FSData); |
176 | 180 | ||
177 | extern int CIFSSMBSetTimes(const int xid, struct cifsTconInfo *tcon, | 181 | extern int CIFSSMBSetTimes(const int xid, struct cifsTconInfo *tcon, |
178 | const char *fileName, const FILE_BASIC_INFO * data, | 182 | const char *fileName, const FILE_BASIC_INFO *data, |
179 | const struct nls_table *nls_codepage, | 183 | const struct nls_table *nls_codepage, |
180 | int remap_special_chars); | 184 | int remap_special_chars); |
181 | extern int CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, | 185 | extern int CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, |
182 | const FILE_BASIC_INFO * data, __u16 fid); | 186 | const FILE_BASIC_INFO *data, __u16 fid); |
183 | #if 0 | 187 | #if 0 |
184 | extern int CIFSSMBSetAttrLegacy(int xid, struct cifsTconInfo *tcon, | 188 | extern int CIFSSMBSetAttrLegacy(int xid, struct cifsTconInfo *tcon, |
185 | char *fileName, __u16 dos_attributes, | 189 | char *fileName, __u16 dos_attributes, |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 9409524e4bf8..30bbe448e260 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * fs/cifs/cifssmb.c | 2 | * fs/cifs/cifssmb.c |
3 | * | 3 | * |
4 | * Copyright (C) International Business Machines Corp., 2002,2007 | 4 | * Copyright (C) International Business Machines Corp., 2002,2008 |
5 | * Author(s): Steve French (sfrench@us.ibm.com) | 5 | * Author(s): Steve French (sfrench@us.ibm.com) |
6 | * | 6 | * |
7 | * Contains the routines for constructing the SMB PDUs themselves | 7 | * Contains the routines for constructing the SMB PDUs themselves |
@@ -102,10 +102,12 @@ static void mark_open_files_invalid(struct cifsTconInfo *pTcon) | |||
102 | to this tcon */ | 102 | to this tcon */ |
103 | } | 103 | } |
104 | 104 | ||
105 | /* If the return code is zero, this function must fill in request_buf pointer */ | 105 | /* Allocate and return pointer to an SMB request buffer, and set basic |
106 | SMB information in the SMB header. If the return code is zero, this | ||
107 | function must have filled in request_buf pointer */ | ||
106 | static int | 108 | static int |
107 | small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, | 109 | small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, |
108 | void **request_buf /* returned */) | 110 | void **request_buf) |
109 | { | 111 | { |
110 | int rc = 0; | 112 | int rc = 0; |
111 | 113 | ||
@@ -363,7 +365,7 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, | |||
363 | *response_buf = *request_buf; | 365 | *response_buf = *request_buf; |
364 | 366 | ||
365 | header_assemble((struct smb_hdr *) *request_buf, smb_command, tcon, | 367 | header_assemble((struct smb_hdr *) *request_buf, smb_command, tcon, |
366 | wct /*wct */ ); | 368 | wct); |
367 | 369 | ||
368 | if (tcon != NULL) | 370 | if (tcon != NULL) |
369 | cifs_stats_inc(&tcon->num_smbs_sent); | 371 | cifs_stats_inc(&tcon->num_smbs_sent); |
@@ -523,7 +525,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
523 | if (remain >= (MIN_TZ_ADJ / 2)) | 525 | if (remain >= (MIN_TZ_ADJ / 2)) |
524 | result += MIN_TZ_ADJ; | 526 | result += MIN_TZ_ADJ; |
525 | if (val < 0) | 527 | if (val < 0) |
526 | result = - result; | 528 | result = -result; |
527 | server->timeAdj = result; | 529 | server->timeAdj = result; |
528 | } else { | 530 | } else { |
529 | server->timeAdj = (int)tmp; | 531 | server->timeAdj = (int)tmp; |
@@ -600,7 +602,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
600 | server->maxBuf = min(le32_to_cpu(pSMBr->MaxBufferSize), | 602 | server->maxBuf = min(le32_to_cpu(pSMBr->MaxBufferSize), |
601 | (__u32) CIFSMaxBufSize + MAX_CIFS_HDR_SIZE); | 603 | (__u32) CIFSMaxBufSize + MAX_CIFS_HDR_SIZE); |
602 | server->maxRw = le32_to_cpu(pSMBr->MaxRawSize); | 604 | server->maxRw = le32_to_cpu(pSMBr->MaxRawSize); |
603 | cFYI(0, ("Max buf = %d", ses->server->maxBuf)); | 605 | cFYI(DBG2, ("Max buf = %d", ses->server->maxBuf)); |
604 | GETU32(ses->server->sessid) = le32_to_cpu(pSMBr->SessionKey); | 606 | GETU32(ses->server->sessid) = le32_to_cpu(pSMBr->SessionKey); |
605 | server->capabilities = le32_to_cpu(pSMBr->Capabilities); | 607 | server->capabilities = le32_to_cpu(pSMBr->Capabilities); |
606 | server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); | 608 | server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); |
@@ -868,9 +870,8 @@ PsxDelete: | |||
868 | pSMB->ByteCount = cpu_to_le16(byte_count); | 870 | pSMB->ByteCount = cpu_to_le16(byte_count); |
869 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 871 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
870 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 872 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
871 | if (rc) { | 873 | if (rc) |
872 | cFYI(1, ("Posix delete returned %d", rc)); | 874 | cFYI(1, ("Posix delete returned %d", rc)); |
873 | } | ||
874 | cifs_buf_release(pSMB); | 875 | cifs_buf_release(pSMB); |
875 | 876 | ||
876 | cifs_stats_inc(&tcon->num_deletes); | 877 | cifs_stats_inc(&tcon->num_deletes); |
@@ -916,9 +917,8 @@ DelFileRetry: | |||
916 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 917 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
917 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 918 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
918 | cifs_stats_inc(&tcon->num_deletes); | 919 | cifs_stats_inc(&tcon->num_deletes); |
919 | if (rc) { | 920 | if (rc) |
920 | cFYI(1, ("Error in RMFile = %d", rc)); | 921 | cFYI(1, ("Error in RMFile = %d", rc)); |
921 | } | ||
922 | 922 | ||
923 | cifs_buf_release(pSMB); | 923 | cifs_buf_release(pSMB); |
924 | if (rc == -EAGAIN) | 924 | if (rc == -EAGAIN) |
@@ -961,9 +961,8 @@ RmDirRetry: | |||
961 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 961 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
962 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 962 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
963 | cifs_stats_inc(&tcon->num_rmdirs); | 963 | cifs_stats_inc(&tcon->num_rmdirs); |
964 | if (rc) { | 964 | if (rc) |
965 | cFYI(1, ("Error in RMDir = %d", rc)); | 965 | cFYI(1, ("Error in RMDir = %d", rc)); |
966 | } | ||
967 | 966 | ||
968 | cifs_buf_release(pSMB); | 967 | cifs_buf_release(pSMB); |
969 | if (rc == -EAGAIN) | 968 | if (rc == -EAGAIN) |
@@ -1005,9 +1004,8 @@ MkDirRetry: | |||
1005 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 1004 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
1006 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 1005 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
1007 | cifs_stats_inc(&tcon->num_mkdirs); | 1006 | cifs_stats_inc(&tcon->num_mkdirs); |
1008 | if (rc) { | 1007 | if (rc) |
1009 | cFYI(1, ("Error in Mkdir = %d", rc)); | 1008 | cFYI(1, ("Error in Mkdir = %d", rc)); |
1010 | } | ||
1011 | 1009 | ||
1012 | cifs_buf_release(pSMB); | 1010 | cifs_buf_release(pSMB); |
1013 | if (rc == -EAGAIN) | 1011 | if (rc == -EAGAIN) |
@@ -1017,7 +1015,7 @@ MkDirRetry: | |||
1017 | 1015 | ||
1018 | int | 1016 | int |
1019 | CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags, | 1017 | CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags, |
1020 | __u64 mode, __u16 * netfid, FILE_UNIX_BASIC_INFO *pRetData, | 1018 | __u64 mode, __u16 *netfid, FILE_UNIX_BASIC_INFO *pRetData, |
1021 | __u32 *pOplock, const char *name, | 1019 | __u32 *pOplock, const char *name, |
1022 | const struct nls_table *nls_codepage, int remap) | 1020 | const struct nls_table *nls_codepage, int remap) |
1023 | { | 1021 | { |
@@ -1027,8 +1025,8 @@ CIFSPOSIXCreate(const int xid, struct cifsTconInfo *tcon, __u32 posix_flags, | |||
1027 | int rc = 0; | 1025 | int rc = 0; |
1028 | int bytes_returned = 0; | 1026 | int bytes_returned = 0; |
1029 | __u16 params, param_offset, offset, byte_count, count; | 1027 | __u16 params, param_offset, offset, byte_count, count; |
1030 | OPEN_PSX_REQ * pdata; | 1028 | OPEN_PSX_REQ *pdata; |
1031 | OPEN_PSX_RSP * psx_rsp; | 1029 | OPEN_PSX_RSP *psx_rsp; |
1032 | 1030 | ||
1033 | cFYI(1, ("In POSIX Create")); | 1031 | cFYI(1, ("In POSIX Create")); |
1034 | PsxCreat: | 1032 | PsxCreat: |
@@ -1110,9 +1108,7 @@ PsxCreat: | |||
1110 | /* check to make sure response data is there */ | 1108 | /* check to make sure response data is there */ |
1111 | if (psx_rsp->ReturnedLevel != cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC)) { | 1109 | if (psx_rsp->ReturnedLevel != cpu_to_le16(SMB_QUERY_FILE_UNIX_BASIC)) { |
1112 | pRetData->Type = cpu_to_le32(-1); /* unknown */ | 1110 | pRetData->Type = cpu_to_le32(-1); /* unknown */ |
1113 | #ifdef CONFIG_CIFS_DEBUG2 | 1111 | cFYI(DBG2, ("unknown type")); |
1114 | cFYI(1, ("unknown type")); | ||
1115 | #endif | ||
1116 | } else { | 1112 | } else { |
1117 | if (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP) | 1113 | if (pSMBr->ByteCount < sizeof(OPEN_PSX_RSP) |
1118 | + sizeof(FILE_UNIX_BASIC_INFO)) { | 1114 | + sizeof(FILE_UNIX_BASIC_INFO)) { |
@@ -1169,8 +1165,8 @@ static __u16 convert_disposition(int disposition) | |||
1169 | int | 1165 | int |
1170 | SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon, | 1166 | SMBLegacyOpen(const int xid, struct cifsTconInfo *tcon, |
1171 | const char *fileName, const int openDisposition, | 1167 | const char *fileName, const int openDisposition, |
1172 | const int access_flags, const int create_options, __u16 * netfid, | 1168 | const int access_flags, const int create_options, __u16 *netfid, |
1173 | int *pOplock, FILE_ALL_INFO * pfile_info, | 1169 | int *pOplock, FILE_ALL_INFO *pfile_info, |
1174 | const struct nls_table *nls_codepage, int remap) | 1170 | const struct nls_table *nls_codepage, int remap) |
1175 | { | 1171 | { |
1176 | int rc = -EACCES; | 1172 | int rc = -EACCES; |
@@ -1221,8 +1217,8 @@ OldOpenRetry: | |||
1221 | 1217 | ||
1222 | if (create_options & CREATE_OPTION_SPECIAL) | 1218 | if (create_options & CREATE_OPTION_SPECIAL) |
1223 | pSMB->FileAttributes = cpu_to_le16(ATTR_SYSTEM); | 1219 | pSMB->FileAttributes = cpu_to_le16(ATTR_SYSTEM); |
1224 | else | 1220 | else /* BB FIXME BB */ |
1225 | pSMB->FileAttributes = cpu_to_le16(0/*ATTR_NORMAL*/); /* BB FIXME */ | 1221 | pSMB->FileAttributes = cpu_to_le16(0/*ATTR_NORMAL*/); |
1226 | 1222 | ||
1227 | /* if ((omode & S_IWUGO) == 0) | 1223 | /* if ((omode & S_IWUGO) == 0) |
1228 | pSMB->FileAttributes |= cpu_to_le32(ATTR_READONLY);*/ | 1224 | pSMB->FileAttributes |= cpu_to_le32(ATTR_READONLY);*/ |
@@ -1284,8 +1280,8 @@ OldOpenRetry: | |||
1284 | int | 1280 | int |
1285 | CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon, | 1281 | CIFSSMBOpen(const int xid, struct cifsTconInfo *tcon, |
1286 | const char *fileName, const int openDisposition, | 1282 | const char *fileName, const int openDisposition, |
1287 | const int access_flags, const int create_options, __u16 * netfid, | 1283 | const int access_flags, const int create_options, __u16 *netfid, |
1288 | int *pOplock, FILE_ALL_INFO * pfile_info, | 1284 | int *pOplock, FILE_ALL_INFO *pfile_info, |
1289 | const struct nls_table *nls_codepage, int remap) | 1285 | const struct nls_table *nls_codepage, int remap) |
1290 | { | 1286 | { |
1291 | int rc = -EACCES; | 1287 | int rc = -EACCES; |
@@ -1556,9 +1552,9 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon, | |||
1556 | } /* else setting file size with write of zero bytes */ | 1552 | } /* else setting file size with write of zero bytes */ |
1557 | if (wct == 14) | 1553 | if (wct == 14) |
1558 | byte_count = bytes_sent + 1; /* pad */ | 1554 | byte_count = bytes_sent + 1; /* pad */ |
1559 | else /* wct == 12 */ { | 1555 | else /* wct == 12 */ |
1560 | byte_count = bytes_sent + 5; /* bigger pad, smaller smb hdr */ | 1556 | byte_count = bytes_sent + 5; /* bigger pad, smaller smb hdr */ |
1561 | } | 1557 | |
1562 | pSMB->DataLengthLow = cpu_to_le16(bytes_sent & 0xFFFF); | 1558 | pSMB->DataLengthLow = cpu_to_le16(bytes_sent & 0xFFFF); |
1563 | pSMB->DataLengthHigh = cpu_to_le16(bytes_sent >> 16); | 1559 | pSMB->DataLengthHigh = cpu_to_le16(bytes_sent >> 16); |
1564 | pSMB->hdr.smb_buf_length += byte_count; | 1560 | pSMB->hdr.smb_buf_length += byte_count; |
@@ -1663,7 +1659,7 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, | |||
1663 | rc = -EIO; | 1659 | rc = -EIO; |
1664 | *nbytes = 0; | 1660 | *nbytes = 0; |
1665 | } else { | 1661 | } else { |
1666 | WRITE_RSP * pSMBr = (WRITE_RSP *)iov[0].iov_base; | 1662 | WRITE_RSP *pSMBr = (WRITE_RSP *)iov[0].iov_base; |
1667 | *nbytes = le16_to_cpu(pSMBr->CountHigh); | 1663 | *nbytes = le16_to_cpu(pSMBr->CountHigh); |
1668 | *nbytes = (*nbytes) << 16; | 1664 | *nbytes = (*nbytes) << 16; |
1669 | *nbytes += le16_to_cpu(pSMBr->Count); | 1665 | *nbytes += le16_to_cpu(pSMBr->Count); |
@@ -1744,9 +1740,8 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon, | |||
1744 | /* SMB buffer freed by function above */ | 1740 | /* SMB buffer freed by function above */ |
1745 | } | 1741 | } |
1746 | cifs_stats_inc(&tcon->num_locks); | 1742 | cifs_stats_inc(&tcon->num_locks); |
1747 | if (rc) { | 1743 | if (rc) |
1748 | cFYI(1, ("Send error in Lock = %d", rc)); | 1744 | cFYI(1, ("Send error in Lock = %d", rc)); |
1749 | } | ||
1750 | 1745 | ||
1751 | /* Note: On -EAGAIN error only caller can retry on handle based calls | 1746 | /* Note: On -EAGAIN error only caller can retry on handle based calls |
1752 | since file handle passed in no longer valid */ | 1747 | since file handle passed in no longer valid */ |
@@ -1791,7 +1786,7 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon, | |||
1791 | 1786 | ||
1792 | count = sizeof(struct cifs_posix_lock); | 1787 | count = sizeof(struct cifs_posix_lock); |
1793 | pSMB->MaxParameterCount = cpu_to_le16(2); | 1788 | pSMB->MaxParameterCount = cpu_to_le16(2); |
1794 | pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB PDU from sess */ | 1789 | pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ |
1795 | pSMB->SetupCount = 1; | 1790 | pSMB->SetupCount = 1; |
1796 | pSMB->Reserved3 = 0; | 1791 | pSMB->Reserved3 = 0; |
1797 | if (get_flag) | 1792 | if (get_flag) |
@@ -1972,9 +1967,8 @@ renameRetry: | |||
1972 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 1967 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
1973 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 1968 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
1974 | cifs_stats_inc(&tcon->num_renames); | 1969 | cifs_stats_inc(&tcon->num_renames); |
1975 | if (rc) { | 1970 | if (rc) |
1976 | cFYI(1, ("Send error in rename = %d", rc)); | 1971 | cFYI(1, ("Send error in rename = %d", rc)); |
1977 | } | ||
1978 | 1972 | ||
1979 | cifs_buf_release(pSMB); | 1973 | cifs_buf_release(pSMB); |
1980 | 1974 | ||
@@ -2016,7 +2010,7 @@ int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon, | |||
2016 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 2010 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; |
2017 | rename_info = (struct set_file_rename *) data_offset; | 2011 | rename_info = (struct set_file_rename *) data_offset; |
2018 | pSMB->MaxParameterCount = cpu_to_le16(2); | 2012 | pSMB->MaxParameterCount = cpu_to_le16(2); |
2019 | pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB PDU from sess */ | 2013 | pSMB->MaxDataCount = cpu_to_le16(1000); /* BB find max SMB from sess */ |
2020 | pSMB->SetupCount = 1; | 2014 | pSMB->SetupCount = 1; |
2021 | pSMB->Reserved3 = 0; | 2015 | pSMB->Reserved3 = 0; |
2022 | pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); | 2016 | pSMB->SubCommand = cpu_to_le16(TRANS2_SET_FILE_INFORMATION); |
@@ -2052,9 +2046,8 @@ int CIFSSMBRenameOpenFile(const int xid, struct cifsTconInfo *pTcon, | |||
2052 | rc = SendReceive(xid, pTcon->ses, (struct smb_hdr *) pSMB, | 2046 | rc = SendReceive(xid, pTcon->ses, (struct smb_hdr *) pSMB, |
2053 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2047 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
2054 | cifs_stats_inc(&pTcon->num_t2renames); | 2048 | cifs_stats_inc(&pTcon->num_t2renames); |
2055 | if (rc) { | 2049 | if (rc) |
2056 | cFYI(1, ("Send error in Rename (by file handle) = %d", rc)); | 2050 | cFYI(1, ("Send error in Rename (by file handle) = %d", rc)); |
2057 | } | ||
2058 | 2051 | ||
2059 | cifs_buf_release(pSMB); | 2052 | cifs_buf_release(pSMB); |
2060 | 2053 | ||
@@ -2211,9 +2204,8 @@ createSymLinkRetry: | |||
2211 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 2204 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
2212 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2205 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
2213 | cifs_stats_inc(&tcon->num_symlinks); | 2206 | cifs_stats_inc(&tcon->num_symlinks); |
2214 | if (rc) { | 2207 | if (rc) |
2215 | cFYI(1, ("Send error in SetPathInfo create symlink = %d", rc)); | 2208 | cFYI(1, ("Send error in SetPathInfo create symlink = %d", rc)); |
2216 | } | ||
2217 | 2209 | ||
2218 | if (pSMB) | 2210 | if (pSMB) |
2219 | cifs_buf_release(pSMB); | 2211 | cifs_buf_release(pSMB); |
@@ -2299,9 +2291,8 @@ createHardLinkRetry: | |||
2299 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 2291 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
2300 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2292 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
2301 | cifs_stats_inc(&tcon->num_hardlinks); | 2293 | cifs_stats_inc(&tcon->num_hardlinks); |
2302 | if (rc) { | 2294 | if (rc) |
2303 | cFYI(1, ("Send error in SetPathInfo (hard link) = %d", rc)); | 2295 | cFYI(1, ("Send error in SetPathInfo (hard link) = %d", rc)); |
2304 | } | ||
2305 | 2296 | ||
2306 | cifs_buf_release(pSMB); | 2297 | cifs_buf_release(pSMB); |
2307 | if (rc == -EAGAIN) | 2298 | if (rc == -EAGAIN) |
@@ -2370,9 +2361,9 @@ winCreateHardLinkRetry: | |||
2370 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 2361 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
2371 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2362 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
2372 | cifs_stats_inc(&tcon->num_hardlinks); | 2363 | cifs_stats_inc(&tcon->num_hardlinks); |
2373 | if (rc) { | 2364 | if (rc) |
2374 | cFYI(1, ("Send error in hard link (NT rename) = %d", rc)); | 2365 | cFYI(1, ("Send error in hard link (NT rename) = %d", rc)); |
2375 | } | 2366 | |
2376 | cifs_buf_release(pSMB); | 2367 | cifs_buf_release(pSMB); |
2377 | if (rc == -EAGAIN) | 2368 | if (rc == -EAGAIN) |
2378 | goto winCreateHardLinkRetry; | 2369 | goto winCreateHardLinkRetry; |
@@ -2968,9 +2959,8 @@ setAclRetry: | |||
2968 | pSMB->ByteCount = cpu_to_le16(byte_count); | 2959 | pSMB->ByteCount = cpu_to_le16(byte_count); |
2969 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 2960 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
2970 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 2961 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
2971 | if (rc) { | 2962 | if (rc) |
2972 | cFYI(1, ("Set POSIX ACL returned %d", rc)); | 2963 | cFYI(1, ("Set POSIX ACL returned %d", rc)); |
2973 | } | ||
2974 | 2964 | ||
2975 | setACLerrorExit: | 2965 | setACLerrorExit: |
2976 | cifs_buf_release(pSMB); | 2966 | cifs_buf_release(pSMB); |
@@ -2982,7 +2972,7 @@ setACLerrorExit: | |||
2982 | /* BB fix tabs in this function FIXME BB */ | 2972 | /* BB fix tabs in this function FIXME BB */ |
2983 | int | 2973 | int |
2984 | CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon, | 2974 | CIFSGetExtAttr(const int xid, struct cifsTconInfo *tcon, |
2985 | const int netfid, __u64 * pExtAttrBits, __u64 *pMask) | 2975 | const int netfid, __u64 *pExtAttrBits, __u64 *pMask) |
2986 | { | 2976 | { |
2987 | int rc = 0; | 2977 | int rc = 0; |
2988 | struct smb_t2_qfi_req *pSMB = NULL; | 2978 | struct smb_t2_qfi_req *pSMB = NULL; |
@@ -3000,7 +2990,7 @@ GetExtAttrRetry: | |||
3000 | if (rc) | 2990 | if (rc) |
3001 | return rc; | 2991 | return rc; |
3002 | 2992 | ||
3003 | params = 2 /* level */ +2 /* fid */; | 2993 | params = 2 /* level */ + 2 /* fid */; |
3004 | pSMB->t2.TotalDataCount = 0; | 2994 | pSMB->t2.TotalDataCount = 0; |
3005 | pSMB->t2.MaxParameterCount = cpu_to_le16(4); | 2995 | pSMB->t2.MaxParameterCount = cpu_to_le16(4); |
3006 | /* BB find exact max data count below from sess structure BB */ | 2996 | /* BB find exact max data count below from sess structure BB */ |
@@ -3071,7 +3061,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, | |||
3071 | { | 3061 | { |
3072 | int rc = 0; | 3062 | int rc = 0; |
3073 | int buf_type = 0; | 3063 | int buf_type = 0; |
3074 | QUERY_SEC_DESC_REQ * pSMB; | 3064 | QUERY_SEC_DESC_REQ *pSMB; |
3075 | struct kvec iov[1]; | 3065 | struct kvec iov[1]; |
3076 | 3066 | ||
3077 | cFYI(1, ("GetCifsACL")); | 3067 | cFYI(1, ("GetCifsACL")); |
@@ -3101,7 +3091,7 @@ CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, | |||
3101 | if (rc) { | 3091 | if (rc) { |
3102 | cFYI(1, ("Send error in QuerySecDesc = %d", rc)); | 3092 | cFYI(1, ("Send error in QuerySecDesc = %d", rc)); |
3103 | } else { /* decode response */ | 3093 | } else { /* decode response */ |
3104 | __le32 * parm; | 3094 | __le32 *parm; |
3105 | __u32 parm_len; | 3095 | __u32 parm_len; |
3106 | __u32 acl_len; | 3096 | __u32 acl_len; |
3107 | struct smb_com_ntransact_rsp *pSMBr; | 3097 | struct smb_com_ntransact_rsp *pSMBr; |
@@ -3230,8 +3220,8 @@ int SMBQueryInformation(const int xid, struct cifsTconInfo *tcon, | |||
3230 | FILE_ALL_INFO *pFinfo, | 3220 | FILE_ALL_INFO *pFinfo, |
3231 | const struct nls_table *nls_codepage, int remap) | 3221 | const struct nls_table *nls_codepage, int remap) |
3232 | { | 3222 | { |
3233 | QUERY_INFORMATION_REQ * pSMB; | 3223 | QUERY_INFORMATION_REQ *pSMB; |
3234 | QUERY_INFORMATION_RSP * pSMBr; | 3224 | QUERY_INFORMATION_RSP *pSMBr; |
3235 | int rc = 0; | 3225 | int rc = 0; |
3236 | int bytes_returned; | 3226 | int bytes_returned; |
3237 | int name_len; | 3227 | int name_len; |
@@ -3263,9 +3253,11 @@ QInfRetry: | |||
3263 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 3253 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
3264 | if (rc) { | 3254 | if (rc) { |
3265 | cFYI(1, ("Send error in QueryInfo = %d", rc)); | 3255 | cFYI(1, ("Send error in QueryInfo = %d", rc)); |
3266 | } else if (pFinfo) { /* decode response */ | 3256 | } else if (pFinfo) { |
3267 | struct timespec ts; | 3257 | struct timespec ts; |
3268 | __u32 time = le32_to_cpu(pSMBr->last_write_time); | 3258 | __u32 time = le32_to_cpu(pSMBr->last_write_time); |
3259 | |||
3260 | /* decode response */ | ||
3269 | /* BB FIXME - add time zone adjustment BB */ | 3261 | /* BB FIXME - add time zone adjustment BB */ |
3270 | memset(pFinfo, 0, sizeof(FILE_ALL_INFO)); | 3262 | memset(pFinfo, 0, sizeof(FILE_ALL_INFO)); |
3271 | ts.tv_nsec = 0; | 3263 | ts.tv_nsec = 0; |
@@ -3296,7 +3288,7 @@ QInfRetry: | |||
3296 | int | 3288 | int |
3297 | CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon, | 3289 | CIFSSMBQPathInfo(const int xid, struct cifsTconInfo *tcon, |
3298 | const unsigned char *searchName, | 3290 | const unsigned char *searchName, |
3299 | FILE_ALL_INFO * pFindData, | 3291 | FILE_ALL_INFO *pFindData, |
3300 | int legacy /* old style infolevel */, | 3292 | int legacy /* old style infolevel */, |
3301 | const struct nls_table *nls_codepage, int remap) | 3293 | const struct nls_table *nls_codepage, int remap) |
3302 | { | 3294 | { |
@@ -3371,10 +3363,12 @@ QPathInfoRetry: | |||
3371 | else if (pFindData) { | 3363 | else if (pFindData) { |
3372 | int size; | 3364 | int size; |
3373 | __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); | 3365 | __u16 data_offset = le16_to_cpu(pSMBr->t2.DataOffset); |
3374 | if (legacy) /* we do not read the last field, EAsize, | 3366 | |
3375 | fortunately since it varies by subdialect | 3367 | /* On legacy responses we do not read the last field, |
3376 | and on Set vs. Get, is two bytes or 4 | 3368 | EAsize, fortunately since it varies by subdialect and |
3377 | bytes depending but we don't care here */ | 3369 | also note it differs on Set vs. Get, ie two bytes or 4 |
3370 | bytes depending but we don't care here */ | ||
3371 | if (legacy) | ||
3378 | size = sizeof(FILE_INFO_STANDARD); | 3372 | size = sizeof(FILE_INFO_STANDARD); |
3379 | else | 3373 | else |
3380 | size = sizeof(FILE_ALL_INFO); | 3374 | size = sizeof(FILE_ALL_INFO); |
@@ -3476,85 +3470,6 @@ UnixQPathInfoRetry: | |||
3476 | return rc; | 3470 | return rc; |
3477 | } | 3471 | } |
3478 | 3472 | ||
3479 | #if 0 /* function unused at present */ | ||
3480 | int CIFSFindSingle(const int xid, struct cifsTconInfo *tcon, | ||
3481 | const char *searchName, FILE_ALL_INFO * findData, | ||
3482 | const struct nls_table *nls_codepage) | ||
3483 | { | ||
3484 | /* level 257 SMB_ */ | ||
3485 | TRANSACTION2_FFIRST_REQ *pSMB = NULL; | ||
3486 | TRANSACTION2_FFIRST_RSP *pSMBr = NULL; | ||
3487 | int rc = 0; | ||
3488 | int bytes_returned; | ||
3489 | int name_len; | ||
3490 | __u16 params, byte_count; | ||
3491 | |||
3492 | cFYI(1, ("In FindUnique")); | ||
3493 | findUniqueRetry: | ||
3494 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | ||
3495 | (void **) &pSMBr); | ||
3496 | if (rc) | ||
3497 | return rc; | ||
3498 | |||
3499 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | ||
3500 | name_len = | ||
3501 | cifsConvertToUCS((__le16 *) pSMB->FileName, searchName, | ||
3502 | PATH_MAX, nls_codepage); | ||
3503 | name_len++; /* trailing null */ | ||
3504 | name_len *= 2; | ||
3505 | } else { /* BB improve the check for buffer overruns BB */ | ||
3506 | name_len = strnlen(searchName, PATH_MAX); | ||
3507 | name_len++; /* trailing null */ | ||
3508 | strncpy(pSMB->FileName, searchName, name_len); | ||
3509 | } | ||
3510 | |||
3511 | params = 12 + name_len /* includes null */ ; | ||
3512 | pSMB->TotalDataCount = 0; /* no EAs */ | ||
3513 | pSMB->MaxParameterCount = cpu_to_le16(2); | ||
3514 | pSMB->MaxDataCount = cpu_to_le16(4000); /* BB find exact max SMB PDU from sess structure BB */ | ||
3515 | pSMB->MaxSetupCount = 0; | ||
3516 | pSMB->Reserved = 0; | ||
3517 | pSMB->Flags = 0; | ||
3518 | pSMB->Timeout = 0; | ||
3519 | pSMB->Reserved2 = 0; | ||
3520 | pSMB->ParameterOffset = cpu_to_le16( | ||
3521 | offsetof(struct smb_com_transaction2_ffirst_req, InformationLevel)-4); | ||
3522 | pSMB->DataCount = 0; | ||
3523 | pSMB->DataOffset = 0; | ||
3524 | pSMB->SetupCount = 1; /* one byte, no need to le convert */ | ||
3525 | pSMB->Reserved3 = 0; | ||
3526 | pSMB->SubCommand = cpu_to_le16(TRANS2_FIND_FIRST); | ||
3527 | byte_count = params + 1 /* pad */ ; | ||
3528 | pSMB->TotalParameterCount = cpu_to_le16(params); | ||
3529 | pSMB->ParameterCount = pSMB->TotalParameterCount; | ||
3530 | pSMB->SearchAttributes = | ||
3531 | cpu_to_le16(ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM | | ||
3532 | ATTR_DIRECTORY); | ||
3533 | pSMB->SearchCount = cpu_to_le16(16); /* BB increase */ | ||
3534 | pSMB->SearchFlags = cpu_to_le16(1); | ||
3535 | pSMB->InformationLevel = cpu_to_le16(SMB_FIND_FILE_DIRECTORY_INFO); | ||
3536 | pSMB->SearchStorageType = 0; /* BB what should we set this to? BB */ | ||
3537 | pSMB->hdr.smb_buf_length += byte_count; | ||
3538 | pSMB->ByteCount = cpu_to_le16(byte_count); | ||
3539 | |||
3540 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | ||
3541 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | ||
3542 | |||
3543 | if (rc) { | ||
3544 | cFYI(1, ("Send error in FindFileDirInfo = %d", rc)); | ||
3545 | } else { /* decode response */ | ||
3546 | cifs_stats_inc(&tcon->num_ffirst); | ||
3547 | /* BB fill in */ | ||
3548 | } | ||
3549 | |||
3550 | cifs_buf_release(pSMB); | ||
3551 | if (rc == -EAGAIN) | ||
3552 | goto findUniqueRetry; | ||
3553 | |||
3554 | return rc; | ||
3555 | } | ||
3556 | #endif /* end unused (temporarily) function */ | ||
3557 | |||
3558 | /* xid, tcon, searchName and codepage are input parms, rest are returned */ | 3473 | /* xid, tcon, searchName and codepage are input parms, rest are returned */ |
3559 | int | 3474 | int |
3560 | CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, | 3475 | CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, |
@@ -3566,7 +3481,7 @@ CIFSFindFirst(const int xid, struct cifsTconInfo *tcon, | |||
3566 | /* level 257 SMB_ */ | 3481 | /* level 257 SMB_ */ |
3567 | TRANSACTION2_FFIRST_REQ *pSMB = NULL; | 3482 | TRANSACTION2_FFIRST_REQ *pSMB = NULL; |
3568 | TRANSACTION2_FFIRST_RSP *pSMBr = NULL; | 3483 | TRANSACTION2_FFIRST_RSP *pSMBr = NULL; |
3569 | T2_FFIRST_RSP_PARMS * parms; | 3484 | T2_FFIRST_RSP_PARMS *parms; |
3570 | int rc = 0; | 3485 | int rc = 0; |
3571 | int bytes_returned = 0; | 3486 | int bytes_returned = 0; |
3572 | int name_len; | 3487 | int name_len; |
@@ -3697,7 +3612,7 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon, | |||
3697 | { | 3612 | { |
3698 | TRANSACTION2_FNEXT_REQ *pSMB = NULL; | 3613 | TRANSACTION2_FNEXT_REQ *pSMB = NULL; |
3699 | TRANSACTION2_FNEXT_RSP *pSMBr = NULL; | 3614 | TRANSACTION2_FNEXT_RSP *pSMBr = NULL; |
3700 | T2_FNEXT_RSP_PARMS * parms; | 3615 | T2_FNEXT_RSP_PARMS *parms; |
3701 | char *response_data; | 3616 | char *response_data; |
3702 | int rc = 0; | 3617 | int rc = 0; |
3703 | int bytes_returned, name_len; | 3618 | int bytes_returned, name_len; |
@@ -3836,9 +3751,9 @@ CIFSFindClose(const int xid, struct cifsTconInfo *tcon, | |||
3836 | pSMB->FileID = searchHandle; | 3751 | pSMB->FileID = searchHandle; |
3837 | pSMB->ByteCount = 0; | 3752 | pSMB->ByteCount = 0; |
3838 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); | 3753 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); |
3839 | if (rc) { | 3754 | if (rc) |
3840 | cERROR(1, ("Send error in FindClose = %d", rc)); | 3755 | cERROR(1, ("Send error in FindClose = %d", rc)); |
3841 | } | 3756 | |
3842 | cifs_stats_inc(&tcon->num_fclose); | 3757 | cifs_stats_inc(&tcon->num_fclose); |
3843 | 3758 | ||
3844 | /* Since session is dead, search handle closed on server already */ | 3759 | /* Since session is dead, search handle closed on server already */ |
@@ -3851,7 +3766,7 @@ CIFSFindClose(const int xid, struct cifsTconInfo *tcon, | |||
3851 | int | 3766 | int |
3852 | CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon, | 3767 | CIFSGetSrvInodeNumber(const int xid, struct cifsTconInfo *tcon, |
3853 | const unsigned char *searchName, | 3768 | const unsigned char *searchName, |
3854 | __u64 * inode_number, | 3769 | __u64 *inode_number, |
3855 | const struct nls_table *nls_codepage, int remap) | 3770 | const struct nls_table *nls_codepage, int remap) |
3856 | { | 3771 | { |
3857 | int rc = 0; | 3772 | int rc = 0; |
@@ -4560,9 +4475,8 @@ SETFSUnixRetry: | |||
4560 | cERROR(1, ("Send error in SETFSUnixInfo = %d", rc)); | 4475 | cERROR(1, ("Send error in SETFSUnixInfo = %d", rc)); |
4561 | } else { /* decode response */ | 4476 | } else { /* decode response */ |
4562 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); | 4477 | rc = validate_t2((struct smb_t2_rsp *)pSMBr); |
4563 | if (rc) { | 4478 | if (rc) |
4564 | rc = -EIO; /* bad smb */ | 4479 | rc = -EIO; /* bad smb */ |
4565 | } | ||
4566 | } | 4480 | } |
4567 | cifs_buf_release(pSMB); | 4481 | cifs_buf_release(pSMB); |
4568 | 4482 | ||
@@ -4744,9 +4658,8 @@ SetEOFRetry: | |||
4744 | pSMB->ByteCount = cpu_to_le16(byte_count); | 4658 | pSMB->ByteCount = cpu_to_le16(byte_count); |
4745 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4659 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
4746 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4660 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
4747 | if (rc) { | 4661 | if (rc) |
4748 | cFYI(1, ("SetPathInfo (file size) returned %d", rc)); | 4662 | cFYI(1, ("SetPathInfo (file size) returned %d", rc)); |
4749 | } | ||
4750 | 4663 | ||
4751 | cifs_buf_release(pSMB); | 4664 | cifs_buf_release(pSMB); |
4752 | 4665 | ||
@@ -4897,9 +4810,8 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, | |||
4897 | pSMB->ByteCount = cpu_to_le16(byte_count); | 4810 | pSMB->ByteCount = cpu_to_le16(byte_count); |
4898 | memcpy(data_offset, data, sizeof(FILE_BASIC_INFO)); | 4811 | memcpy(data_offset, data, sizeof(FILE_BASIC_INFO)); |
4899 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); | 4812 | rc = SendReceiveNoRsp(xid, tcon->ses, (struct smb_hdr *) pSMB, 0); |
4900 | if (rc) { | 4813 | if (rc) |
4901 | cFYI(1, ("Send error in Set Time (SetFileInfo) = %d", rc)); | 4814 | cFYI(1, ("Send error in Set Time (SetFileInfo) = %d", rc)); |
4902 | } | ||
4903 | 4815 | ||
4904 | /* Note: On -EAGAIN error only caller can retry on handle based calls | 4816 | /* Note: On -EAGAIN error only caller can retry on handle based calls |
4905 | since file handle passed in no longer valid */ | 4817 | since file handle passed in no longer valid */ |
@@ -4975,9 +4887,8 @@ SetTimesRetry: | |||
4975 | pSMB->ByteCount = cpu_to_le16(byte_count); | 4887 | pSMB->ByteCount = cpu_to_le16(byte_count); |
4976 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4888 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
4977 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4889 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
4978 | if (rc) { | 4890 | if (rc) |
4979 | cFYI(1, ("SetPathInfo (times) returned %d", rc)); | 4891 | cFYI(1, ("SetPathInfo (times) returned %d", rc)); |
4980 | } | ||
4981 | 4892 | ||
4982 | cifs_buf_release(pSMB); | 4893 | cifs_buf_release(pSMB); |
4983 | 4894 | ||
@@ -5027,9 +4938,8 @@ SetAttrLgcyRetry: | |||
5027 | pSMB->ByteCount = cpu_to_le16(name_len + 1); | 4938 | pSMB->ByteCount = cpu_to_le16(name_len + 1); |
5028 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 4939 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
5029 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 4940 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
5030 | if (rc) { | 4941 | if (rc) |
5031 | cFYI(1, ("Error in LegacySetAttr = %d", rc)); | 4942 | cFYI(1, ("Error in LegacySetAttr = %d", rc)); |
5032 | } | ||
5033 | 4943 | ||
5034 | cifs_buf_release(pSMB); | 4944 | cifs_buf_release(pSMB); |
5035 | 4945 | ||
@@ -5138,9 +5048,8 @@ setPermsRetry: | |||
5138 | pSMB->ByteCount = cpu_to_le16(byte_count); | 5048 | pSMB->ByteCount = cpu_to_le16(byte_count); |
5139 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 5049 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
5140 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 5050 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
5141 | if (rc) { | 5051 | if (rc) |
5142 | cFYI(1, ("SetPathInfo (perms) returned %d", rc)); | 5052 | cFYI(1, ("SetPathInfo (perms) returned %d", rc)); |
5143 | } | ||
5144 | 5053 | ||
5145 | if (pSMB) | 5054 | if (pSMB) |
5146 | cifs_buf_release(pSMB); | 5055 | cifs_buf_release(pSMB); |
@@ -5615,9 +5524,8 @@ SetEARetry: | |||
5615 | pSMB->ByteCount = cpu_to_le16(byte_count); | 5524 | pSMB->ByteCount = cpu_to_le16(byte_count); |
5616 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, | 5525 | rc = SendReceive(xid, tcon->ses, (struct smb_hdr *) pSMB, |
5617 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); | 5526 | (struct smb_hdr *) pSMBr, &bytes_returned, 0); |
5618 | if (rc) { | 5527 | if (rc) |
5619 | cFYI(1, ("SetPathInfo (EA) returned %d", rc)); | 5528 | cFYI(1, ("SetPathInfo (EA) returned %d", rc)); |
5620 | } | ||
5621 | 5529 | ||
5622 | cifs_buf_release(pSMB); | 5530 | cifs_buf_release(pSMB); |
5623 | 5531 | ||
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 65d0ba72e78f..8dbfa97cd18c 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -1722,8 +1722,15 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, | |||
1722 | originally at mount time */ | 1722 | originally at mount time */ |
1723 | if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0) | 1723 | if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0) |
1724 | cap &= ~CIFS_UNIX_POSIX_ACL_CAP; | 1724 | cap &= ~CIFS_UNIX_POSIX_ACL_CAP; |
1725 | if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) | 1725 | if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) { |
1726 | if (cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) | ||
1727 | cERROR(1, ("POSIXPATH support change")); | ||
1726 | cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP; | 1728 | cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP; |
1729 | } else if ((cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0) { | ||
1730 | cERROR(1, ("possible reconnect error")); | ||
1731 | cERROR(1, | ||
1732 | ("server disabled POSIX path support")); | ||
1733 | } | ||
1727 | } | 1734 | } |
1728 | 1735 | ||
1729 | cap &= CIFS_UNIX_CAP_MASK; | 1736 | cap &= CIFS_UNIX_CAP_MASK; |
@@ -1753,9 +1760,8 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, | |||
1753 | if (sb && (CIFS_SB(sb)->rsize > 127 * 1024)) { | 1760 | if (sb && (CIFS_SB(sb)->rsize > 127 * 1024)) { |
1754 | if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) { | 1761 | if ((cap & CIFS_UNIX_LARGE_READ_CAP) == 0) { |
1755 | CIFS_SB(sb)->rsize = 127 * 1024; | 1762 | CIFS_SB(sb)->rsize = 127 * 1024; |
1756 | #ifdef CONFIG_CIFS_DEBUG2 | 1763 | cFYI(DBG2, |
1757 | cFYI(1, ("larger reads not supported by srv")); | 1764 | ("larger reads not supported by srv")); |
1758 | #endif | ||
1759 | } | 1765 | } |
1760 | } | 1766 | } |
1761 | 1767 | ||
@@ -1792,6 +1798,26 @@ void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon, | |||
1792 | } | 1798 | } |
1793 | } | 1799 | } |
1794 | 1800 | ||
1801 | static void | ||
1802 | convert_delimiter(char *path, char delim) | ||
1803 | { | ||
1804 | int i; | ||
1805 | char old_delim; | ||
1806 | |||
1807 | if (path == NULL) | ||
1808 | return; | ||
1809 | |||
1810 | if (delim == '/') | ||
1811 | old_delim = '\\'; | ||
1812 | else | ||
1813 | old_delim = '/'; | ||
1814 | |||
1815 | for (i = 0; path[i] != '\0'; i++) { | ||
1816 | if (path[i] == old_delim) | ||
1817 | path[i] = delim; | ||
1818 | } | ||
1819 | } | ||
1820 | |||
1795 | int | 1821 | int |
1796 | cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | 1822 | cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, |
1797 | char *mount_data, const char *devname) | 1823 | char *mount_data, const char *devname) |
@@ -2057,7 +2083,11 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2057 | cifs_sb->prepath = volume_info.prepath; | 2083 | cifs_sb->prepath = volume_info.prepath; |
2058 | if (cifs_sb->prepath) { | 2084 | if (cifs_sb->prepath) { |
2059 | cifs_sb->prepathlen = strlen(cifs_sb->prepath); | 2085 | cifs_sb->prepathlen = strlen(cifs_sb->prepath); |
2060 | cifs_sb->prepath[0] = CIFS_DIR_SEP(cifs_sb); | 2086 | /* we can not convert the / to \ in the path |
2087 | separators in the prefixpath yet because we do not | ||
2088 | know (until reset_cifs_unix_caps is called later) | ||
2089 | whether POSIX PATH CAP is available. We normalize | ||
2090 | the / to \ after reset_cifs_unix_caps is called */ | ||
2061 | volume_info.prepath = NULL; | 2091 | volume_info.prepath = NULL; |
2062 | } else | 2092 | } else |
2063 | cifs_sb->prepathlen = 0; | 2093 | cifs_sb->prepathlen = 0; |
@@ -2225,11 +2255,15 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, | |||
2225 | else | 2255 | else |
2226 | tcon->unix_ext = 0; /* server does not support them */ | 2256 | tcon->unix_ext = 0; /* server does not support them */ |
2227 | 2257 | ||
2258 | /* convert forward to back slashes in prepath here if needed */ | ||
2259 | if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0) | ||
2260 | convert_delimiter(cifs_sb->prepath, | ||
2261 | CIFS_DIR_SEP(cifs_sb)); | ||
2262 | |||
2228 | if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) { | 2263 | if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) { |
2229 | cifs_sb->rsize = 1024 * 127; | 2264 | cifs_sb->rsize = 1024 * 127; |
2230 | #ifdef CONFIG_CIFS_DEBUG2 | 2265 | cFYI(DBG2, |
2231 | cFYI(1, ("no very large read support, rsize now 127K")); | 2266 | ("no very large read support, rsize now 127K")); |
2232 | #endif | ||
2233 | } | 2267 | } |
2234 | if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X)) | 2268 | if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X)) |
2235 | cifs_sb->wsize = min(cifs_sb->wsize, | 2269 | cifs_sb->wsize = min(cifs_sb->wsize, |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 699ec1198409..4e83b47c4b34 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * vfs operations that deal with dentries | 4 | * vfs operations that deal with dentries |
5 | * | 5 | * |
6 | * Copyright (C) International Business Machines Corp., 2002,2007 | 6 | * Copyright (C) International Business Machines Corp., 2002,2008 |
7 | * Author(s): Steve French (sfrench@us.ibm.com) | 7 | * Author(s): Steve French (sfrench@us.ibm.com) |
8 | * | 8 | * |
9 | * This library is free software; you can redistribute it and/or modify | 9 | * This library is free software; you can redistribute it and/or modify |
@@ -111,16 +111,6 @@ cifs_bp_rename_retry: | |||
111 | return full_path; | 111 | return full_path; |
112 | } | 112 | } |
113 | 113 | ||
114 | /* char * build_wildcard_path_from_dentry(struct dentry *direntry) | ||
115 | { | ||
116 | if(full_path == NULL) | ||
117 | return full_path; | ||
118 | |||
119 | full_path[namelen] = '\\'; | ||
120 | full_path[namelen+1] = '*'; | ||
121 | full_path[namelen+2] = 0; | ||
122 | BB remove above eight lines BB */ | ||
123 | |||
124 | /* Inode operations in similar order to how they appear in Linux file fs.h */ | 114 | /* Inode operations in similar order to how they appear in Linux file fs.h */ |
125 | 115 | ||
126 | int | 116 | int |
@@ -171,9 +161,8 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
171 | disposition = FILE_OVERWRITE_IF; | 161 | disposition = FILE_OVERWRITE_IF; |
172 | else if ((oflags & O_CREAT) == O_CREAT) | 162 | else if ((oflags & O_CREAT) == O_CREAT) |
173 | disposition = FILE_OPEN_IF; | 163 | disposition = FILE_OPEN_IF; |
174 | else { | 164 | else |
175 | cFYI(1, ("Create flag not set in create function")); | 165 | cFYI(1, ("Create flag not set in create function")); |
176 | } | ||
177 | } | 166 | } |
178 | 167 | ||
179 | /* BB add processing to set equivalent of mode - e.g. via CreateX with | 168 | /* BB add processing to set equivalent of mode - e.g. via CreateX with |
@@ -367,7 +356,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, | |||
367 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { | 356 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { |
368 | int oplock = 0; | 357 | int oplock = 0; |
369 | u16 fileHandle; | 358 | u16 fileHandle; |
370 | FILE_ALL_INFO * buf; | 359 | FILE_ALL_INFO *buf; |
371 | 360 | ||
372 | cFYI(1, ("sfu compat create special file")); | 361 | cFYI(1, ("sfu compat create special file")); |
373 | 362 | ||
@@ -534,9 +523,8 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd) | |||
534 | int isValid = 1; | 523 | int isValid = 1; |
535 | 524 | ||
536 | if (direntry->d_inode) { | 525 | if (direntry->d_inode) { |
537 | if (cifs_revalidate(direntry)) { | 526 | if (cifs_revalidate(direntry)) |
538 | return 0; | 527 | return 0; |
539 | } | ||
540 | } else { | 528 | } else { |
541 | cFYI(1, ("neg dentry 0x%p name = %s", | 529 | cFYI(1, ("neg dentry 0x%p name = %s", |
542 | direntry, direntry->d_name.name)); | 530 | direntry, direntry->d_name.name)); |
diff --git a/fs/cifs/dns_resolve.h b/fs/cifs/dns_resolve.h index 073fdc3db419..966e9288930b 100644 --- a/fs/cifs/dns_resolve.h +++ b/fs/cifs/dns_resolve.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * fs/cifs/dns_resolve.h -- DNS Resolver upcall management for CIFS DFS | 2 | * fs/cifs/dns_resolve.h -- DNS Resolver upcall management for CIFS DFS |
3 | * Handles host name to IP address resolution | 3 | * Handles host name to IP address resolution |
4 | * | 4 | * |
5 | * Copyright (c) International Business Machines Corp., 2008 | 5 | * Copyright (c) International Business Machines Corp., 2008 |
6 | * Author(s): Steve French (sfrench@us.ibm.com) | 6 | * Author(s): Steve French (sfrench@us.ibm.com) |
7 | * | 7 | * |
diff --git a/fs/cifs/fcntl.c b/fs/cifs/fcntl.c index 995474c90885..7d1d5aa4c430 100644 --- a/fs/cifs/fcntl.c +++ b/fs/cifs/fcntl.c | |||
@@ -35,9 +35,8 @@ static __u32 convert_to_cifs_notify_flags(unsigned long fcntl_notify_flags) | |||
35 | 35 | ||
36 | /* No way on Linux VFS to ask to monitor xattr | 36 | /* No way on Linux VFS to ask to monitor xattr |
37 | changes (and no stream support either */ | 37 | changes (and no stream support either */ |
38 | if (fcntl_notify_flags & DN_ACCESS) { | 38 | if (fcntl_notify_flags & DN_ACCESS) |
39 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_LAST_ACCESS; | 39 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_LAST_ACCESS; |
40 | } | ||
41 | if (fcntl_notify_flags & DN_MODIFY) { | 40 | if (fcntl_notify_flags & DN_MODIFY) { |
42 | /* What does this mean on directories? */ | 41 | /* What does this mean on directories? */ |
43 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_LAST_WRITE | | 42 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_LAST_WRITE | |
@@ -47,9 +46,8 @@ static __u32 convert_to_cifs_notify_flags(unsigned long fcntl_notify_flags) | |||
47 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_CREATION | | 46 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_CREATION | |
48 | FILE_NOTIFY_CHANGE_LAST_WRITE; | 47 | FILE_NOTIFY_CHANGE_LAST_WRITE; |
49 | } | 48 | } |
50 | if (fcntl_notify_flags & DN_DELETE) { | 49 | if (fcntl_notify_flags & DN_DELETE) |
51 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_LAST_WRITE; | 50 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_LAST_WRITE; |
52 | } | ||
53 | if (fcntl_notify_flags & DN_RENAME) { | 51 | if (fcntl_notify_flags & DN_RENAME) { |
54 | /* BB review this - checking various server behaviors */ | 52 | /* BB review this - checking various server behaviors */ |
55 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_DIR_NAME | | 53 | cifs_ntfy_flags |= FILE_NOTIFY_CHANGE_DIR_NAME | |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 5f7c374ae89c..fa849c91d323 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -353,9 +353,9 @@ static int cifs_reopen_file(struct file *file, int can_flush) | |||
353 | int disposition = FILE_OPEN; | 353 | int disposition = FILE_OPEN; |
354 | __u16 netfid; | 354 | __u16 netfid; |
355 | 355 | ||
356 | if (file->private_data) { | 356 | if (file->private_data) |
357 | pCifsFile = (struct cifsFileInfo *)file->private_data; | 357 | pCifsFile = (struct cifsFileInfo *)file->private_data; |
358 | } else | 358 | else |
359 | return -EBADF; | 359 | return -EBADF; |
360 | 360 | ||
361 | xid = GetXid(); | 361 | xid = GetXid(); |
@@ -499,9 +499,8 @@ int cifs_close(struct inode *inode, struct file *file) | |||
499 | the struct would be in each open file, | 499 | the struct would be in each open file, |
500 | but this should give enough time to | 500 | but this should give enough time to |
501 | clear the socket */ | 501 | clear the socket */ |
502 | #ifdef CONFIG_CIFS_DEBUG2 | 502 | cFYI(DBG2, |
503 | cFYI(1, ("close delay, write pending")); | 503 | ("close delay, write pending")); |
504 | #endif /* DEBUG2 */ | ||
505 | msleep(timeout); | 504 | msleep(timeout); |
506 | timeout *= 4; | 505 | timeout *= 4; |
507 | } | 506 | } |
@@ -1423,9 +1422,8 @@ static int cifs_writepage(struct page *page, struct writeback_control *wbc) | |||
1423 | xid = GetXid(); | 1422 | xid = GetXid(); |
1424 | /* BB add check for wbc flags */ | 1423 | /* BB add check for wbc flags */ |
1425 | page_cache_get(page); | 1424 | page_cache_get(page); |
1426 | if (!PageUptodate(page)) { | 1425 | if (!PageUptodate(page)) |
1427 | cFYI(1, ("ppw - page not up to date")); | 1426 | cFYI(1, ("ppw - page not up to date")); |
1428 | } | ||
1429 | 1427 | ||
1430 | /* | 1428 | /* |
1431 | * Set the "writeback" flag, and clear "dirty" in the radix tree. | 1429 | * Set the "writeback" flag, and clear "dirty" in the radix tree. |
@@ -1460,9 +1458,9 @@ static int cifs_commit_write(struct file *file, struct page *page, | |||
1460 | cFYI(1, ("commit write for page %p up to position %lld for %d", | 1458 | cFYI(1, ("commit write for page %p up to position %lld for %d", |
1461 | page, position, to)); | 1459 | page, position, to)); |
1462 | spin_lock(&inode->i_lock); | 1460 | spin_lock(&inode->i_lock); |
1463 | if (position > inode->i_size) { | 1461 | if (position > inode->i_size) |
1464 | i_size_write(inode, position); | 1462 | i_size_write(inode, position); |
1465 | } | 1463 | |
1466 | spin_unlock(&inode->i_lock); | 1464 | spin_unlock(&inode->i_lock); |
1467 | if (!PageUptodate(page)) { | 1465 | if (!PageUptodate(page)) { |
1468 | position = ((loff_t)page->index << PAGE_CACHE_SHIFT) + offset; | 1466 | position = ((loff_t)page->index << PAGE_CACHE_SHIFT) + offset; |
@@ -1596,9 +1594,9 @@ ssize_t cifs_user_read(struct file *file, char __user *read_data, | |||
1596 | } | 1594 | } |
1597 | open_file = (struct cifsFileInfo *)file->private_data; | 1595 | open_file = (struct cifsFileInfo *)file->private_data; |
1598 | 1596 | ||
1599 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) { | 1597 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) |
1600 | cFYI(1, ("attempting read on write only file instance")); | 1598 | cFYI(1, ("attempting read on write only file instance")); |
1601 | } | 1599 | |
1602 | for (total_read = 0, current_offset = read_data; | 1600 | for (total_read = 0, current_offset = read_data; |
1603 | read_size > total_read; | 1601 | read_size > total_read; |
1604 | total_read += bytes_read, current_offset += bytes_read) { | 1602 | total_read += bytes_read, current_offset += bytes_read) { |
@@ -1625,9 +1623,8 @@ ssize_t cifs_user_read(struct file *file, char __user *read_data, | |||
1625 | smb_read_data + | 1623 | smb_read_data + |
1626 | 4 /* RFC1001 length field */ + | 1624 | 4 /* RFC1001 length field */ + |
1627 | le16_to_cpu(pSMBr->DataOffset), | 1625 | le16_to_cpu(pSMBr->DataOffset), |
1628 | bytes_read)) { | 1626 | bytes_read)) |
1629 | rc = -EFAULT; | 1627 | rc = -EFAULT; |
1630 | } | ||
1631 | 1628 | ||
1632 | if (buf_type == CIFS_SMALL_BUFFER) | 1629 | if (buf_type == CIFS_SMALL_BUFFER) |
1633 | cifs_small_buf_release(smb_read_data); | 1630 | cifs_small_buf_release(smb_read_data); |
@@ -1814,9 +1811,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
1814 | pTcon = cifs_sb->tcon; | 1811 | pTcon = cifs_sb->tcon; |
1815 | 1812 | ||
1816 | pagevec_init(&lru_pvec, 0); | 1813 | pagevec_init(&lru_pvec, 0); |
1817 | #ifdef CONFIG_CIFS_DEBUG2 | 1814 | cFYI(DBG2, ("rpages: num pages %d", num_pages)); |
1818 | cFYI(1, ("rpages: num pages %d", num_pages)); | ||
1819 | #endif | ||
1820 | for (i = 0; i < num_pages; ) { | 1815 | for (i = 0; i < num_pages; ) { |
1821 | unsigned contig_pages; | 1816 | unsigned contig_pages; |
1822 | struct page *tmp_page; | 1817 | struct page *tmp_page; |
@@ -1849,10 +1844,8 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
1849 | /* Read size needs to be in multiples of one page */ | 1844 | /* Read size needs to be in multiples of one page */ |
1850 | read_size = min_t(const unsigned int, read_size, | 1845 | read_size = min_t(const unsigned int, read_size, |
1851 | cifs_sb->rsize & PAGE_CACHE_MASK); | 1846 | cifs_sb->rsize & PAGE_CACHE_MASK); |
1852 | #ifdef CONFIG_CIFS_DEBUG2 | 1847 | cFYI(DBG2, ("rpages: read size 0x%x contiguous pages %d", |
1853 | cFYI(1, ("rpages: read size 0x%x contiguous pages %d", | ||
1854 | read_size, contig_pages)); | 1848 | read_size, contig_pages)); |
1855 | #endif | ||
1856 | rc = -EAGAIN; | 1849 | rc = -EAGAIN; |
1857 | while (rc == -EAGAIN) { | 1850 | while (rc == -EAGAIN) { |
1858 | if ((open_file->invalidHandle) && | 1851 | if ((open_file->invalidHandle) && |
@@ -2026,7 +2019,7 @@ int is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file) | |||
2026 | struct cifs_sb_info *cifs_sb; | 2019 | struct cifs_sb_info *cifs_sb; |
2027 | 2020 | ||
2028 | cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb); | 2021 | cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb); |
2029 | if ( cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO ) { | 2022 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { |
2030 | /* since no page cache to corrupt on directio | 2023 | /* since no page cache to corrupt on directio |
2031 | we can change size safely */ | 2024 | we can change size safely */ |
2032 | return 1; | 2025 | return 1; |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index b1a4a65eaa08..24eb4d392155 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -29,6 +29,130 @@ | |||
29 | #include "cifs_debug.h" | 29 | #include "cifs_debug.h" |
30 | #include "cifs_fs_sb.h" | 30 | #include "cifs_fs_sb.h" |
31 | 31 | ||
32 | |||
33 | static void cifs_set_ops(struct inode *inode) | ||
34 | { | ||
35 | struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); | ||
36 | |||
37 | switch (inode->i_mode & S_IFMT) { | ||
38 | case S_IFREG: | ||
39 | inode->i_op = &cifs_file_inode_ops; | ||
40 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { | ||
41 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
42 | inode->i_fop = &cifs_file_direct_nobrl_ops; | ||
43 | else | ||
44 | inode->i_fop = &cifs_file_direct_ops; | ||
45 | } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
46 | inode->i_fop = &cifs_file_nobrl_ops; | ||
47 | else { /* not direct, send byte range locks */ | ||
48 | inode->i_fop = &cifs_file_ops; | ||
49 | } | ||
50 | |||
51 | |||
52 | /* check if server can support readpages */ | ||
53 | if (cifs_sb->tcon->ses->server->maxBuf < | ||
54 | PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE) | ||
55 | inode->i_data.a_ops = &cifs_addr_ops_smallbuf; | ||
56 | else | ||
57 | inode->i_data.a_ops = &cifs_addr_ops; | ||
58 | break; | ||
59 | case S_IFDIR: | ||
60 | inode->i_op = &cifs_dir_inode_ops; | ||
61 | inode->i_fop = &cifs_dir_ops; | ||
62 | break; | ||
63 | case S_IFLNK: | ||
64 | inode->i_op = &cifs_symlink_inode_ops; | ||
65 | break; | ||
66 | default: | ||
67 | init_special_inode(inode, inode->i_mode, inode->i_rdev); | ||
68 | break; | ||
69 | } | ||
70 | } | ||
71 | |||
72 | static void cifs_unix_info_to_inode(struct inode *inode, | ||
73 | FILE_UNIX_BASIC_INFO *info, int force_uid_gid) | ||
74 | { | ||
75 | struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); | ||
76 | struct cifsInodeInfo *cifsInfo = CIFS_I(inode); | ||
77 | __u64 num_of_bytes = le64_to_cpu(info->NumOfBytes); | ||
78 | __u64 end_of_file = le64_to_cpu(info->EndOfFile); | ||
79 | |||
80 | inode->i_atime = cifs_NTtimeToUnix(le64_to_cpu(info->LastAccessTime)); | ||
81 | inode->i_mtime = | ||
82 | cifs_NTtimeToUnix(le64_to_cpu(info->LastModificationTime)); | ||
83 | inode->i_ctime = cifs_NTtimeToUnix(le64_to_cpu(info->LastStatusChange)); | ||
84 | inode->i_mode = le64_to_cpu(info->Permissions); | ||
85 | |||
86 | /* | ||
87 | * Since we set the inode type below we need to mask off | ||
88 | * to avoid strange results if bits set above. | ||
89 | */ | ||
90 | inode->i_mode &= ~S_IFMT; | ||
91 | switch (le32_to_cpu(info->Type)) { | ||
92 | case UNIX_FILE: | ||
93 | inode->i_mode |= S_IFREG; | ||
94 | break; | ||
95 | case UNIX_SYMLINK: | ||
96 | inode->i_mode |= S_IFLNK; | ||
97 | break; | ||
98 | case UNIX_DIR: | ||
99 | inode->i_mode |= S_IFDIR; | ||
100 | break; | ||
101 | case UNIX_CHARDEV: | ||
102 | inode->i_mode |= S_IFCHR; | ||
103 | inode->i_rdev = MKDEV(le64_to_cpu(info->DevMajor), | ||
104 | le64_to_cpu(info->DevMinor) & MINORMASK); | ||
105 | break; | ||
106 | case UNIX_BLOCKDEV: | ||
107 | inode->i_mode |= S_IFBLK; | ||
108 | inode->i_rdev = MKDEV(le64_to_cpu(info->DevMajor), | ||
109 | le64_to_cpu(info->DevMinor) & MINORMASK); | ||
110 | break; | ||
111 | case UNIX_FIFO: | ||
112 | inode->i_mode |= S_IFIFO; | ||
113 | break; | ||
114 | case UNIX_SOCKET: | ||
115 | inode->i_mode |= S_IFSOCK; | ||
116 | break; | ||
117 | default: | ||
118 | /* safest to call it a file if we do not know */ | ||
119 | inode->i_mode |= S_IFREG; | ||
120 | cFYI(1, ("unknown type %d", le32_to_cpu(info->Type))); | ||
121 | break; | ||
122 | } | ||
123 | |||
124 | if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID) && | ||
125 | !force_uid_gid) | ||
126 | inode->i_uid = cifs_sb->mnt_uid; | ||
127 | else | ||
128 | inode->i_uid = le64_to_cpu(info->Uid); | ||
129 | |||
130 | if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID) && | ||
131 | !force_uid_gid) | ||
132 | inode->i_gid = cifs_sb->mnt_gid; | ||
133 | else | ||
134 | inode->i_gid = le64_to_cpu(info->Gid); | ||
135 | |||
136 | inode->i_nlink = le64_to_cpu(info->Nlinks); | ||
137 | |||
138 | spin_lock(&inode->i_lock); | ||
139 | if (is_size_safe_to_change(cifsInfo, end_of_file)) { | ||
140 | /* | ||
141 | * We can not safely change the file size here if the client | ||
142 | * is writing to it due to potential races. | ||
143 | */ | ||
144 | i_size_write(inode, end_of_file); | ||
145 | |||
146 | /* | ||
147 | * i_blocks is not related to (i_size / i_blksize), | ||
148 | * but instead 512 byte (2**9) size is required for | ||
149 | * calculating num blocks. | ||
150 | */ | ||
151 | inode->i_blocks = (512 - 1 + num_of_bytes) >> 9; | ||
152 | } | ||
153 | spin_unlock(&inode->i_lock); | ||
154 | } | ||
155 | |||
32 | int cifs_get_inode_info_unix(struct inode **pinode, | 156 | int cifs_get_inode_info_unix(struct inode **pinode, |
33 | const unsigned char *search_path, struct super_block *sb, int xid) | 157 | const unsigned char *search_path, struct super_block *sb, int xid) |
34 | { | 158 | { |
@@ -74,7 +198,6 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
74 | } | 198 | } |
75 | } else { | 199 | } else { |
76 | struct cifsInodeInfo *cifsInfo; | 200 | struct cifsInodeInfo *cifsInfo; |
77 | __u32 type = le32_to_cpu(findData.Type); | ||
78 | __u64 num_of_bytes = le64_to_cpu(findData.NumOfBytes); | 201 | __u64 num_of_bytes = le64_to_cpu(findData.NumOfBytes); |
79 | __u64 end_of_file = le64_to_cpu(findData.EndOfFile); | 202 | __u64 end_of_file = le64_to_cpu(findData.EndOfFile); |
80 | 203 | ||
@@ -105,112 +228,16 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
105 | /* this is ok to set on every inode revalidate */ | 228 | /* this is ok to set on every inode revalidate */ |
106 | atomic_set(&cifsInfo->inUse, 1); | 229 | atomic_set(&cifsInfo->inUse, 1); |
107 | 230 | ||
108 | inode->i_atime = | 231 | cifs_unix_info_to_inode(inode, &findData, 0); |
109 | cifs_NTtimeToUnix(le64_to_cpu(findData.LastAccessTime)); | ||
110 | inode->i_mtime = | ||
111 | cifs_NTtimeToUnix(le64_to_cpu | ||
112 | (findData.LastModificationTime)); | ||
113 | inode->i_ctime = | ||
114 | cifs_NTtimeToUnix(le64_to_cpu(findData.LastStatusChange)); | ||
115 | inode->i_mode = le64_to_cpu(findData.Permissions); | ||
116 | /* since we set the inode type below we need to mask off | ||
117 | to avoid strange results if bits set above */ | ||
118 | inode->i_mode &= ~S_IFMT; | ||
119 | if (type == UNIX_FILE) { | ||
120 | inode->i_mode |= S_IFREG; | ||
121 | } else if (type == UNIX_SYMLINK) { | ||
122 | inode->i_mode |= S_IFLNK; | ||
123 | } else if (type == UNIX_DIR) { | ||
124 | inode->i_mode |= S_IFDIR; | ||
125 | } else if (type == UNIX_CHARDEV) { | ||
126 | inode->i_mode |= S_IFCHR; | ||
127 | inode->i_rdev = MKDEV(le64_to_cpu(findData.DevMajor), | ||
128 | le64_to_cpu(findData.DevMinor) & MINORMASK); | ||
129 | } else if (type == UNIX_BLOCKDEV) { | ||
130 | inode->i_mode |= S_IFBLK; | ||
131 | inode->i_rdev = MKDEV(le64_to_cpu(findData.DevMajor), | ||
132 | le64_to_cpu(findData.DevMinor) & MINORMASK); | ||
133 | } else if (type == UNIX_FIFO) { | ||
134 | inode->i_mode |= S_IFIFO; | ||
135 | } else if (type == UNIX_SOCKET) { | ||
136 | inode->i_mode |= S_IFSOCK; | ||
137 | } else { | ||
138 | /* safest to call it a file if we do not know */ | ||
139 | inode->i_mode |= S_IFREG; | ||
140 | cFYI(1, ("unknown type %d", type)); | ||
141 | } | ||
142 | 232 | ||
143 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID) | ||
144 | inode->i_uid = cifs_sb->mnt_uid; | ||
145 | else | ||
146 | inode->i_uid = le64_to_cpu(findData.Uid); | ||
147 | |||
148 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID) | ||
149 | inode->i_gid = cifs_sb->mnt_gid; | ||
150 | else | ||
151 | inode->i_gid = le64_to_cpu(findData.Gid); | ||
152 | |||
153 | inode->i_nlink = le64_to_cpu(findData.Nlinks); | ||
154 | |||
155 | spin_lock(&inode->i_lock); | ||
156 | if (is_size_safe_to_change(cifsInfo, end_of_file)) { | ||
157 | /* can not safely change the file size here if the | ||
158 | client is writing to it due to potential races */ | ||
159 | i_size_write(inode, end_of_file); | ||
160 | |||
161 | /* blksize needs to be multiple of two. So safer to default to | ||
162 | blksize and blkbits set in superblock so 2**blkbits and blksize | ||
163 | will match rather than setting to: | ||
164 | (pTcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) & 0xFFFFFE00;*/ | ||
165 | |||
166 | /* This seems incredibly stupid but it turns out that i_blocks | ||
167 | is not related to (i_size / i_blksize), instead 512 byte size | ||
168 | is required for calculating num blocks */ | ||
169 | |||
170 | /* 512 bytes (2**9) is the fake blocksize that must be used */ | ||
171 | /* for this calculation */ | ||
172 | inode->i_blocks = (512 - 1 + num_of_bytes) >> 9; | ||
173 | } | ||
174 | spin_unlock(&inode->i_lock); | ||
175 | 233 | ||
176 | if (num_of_bytes < end_of_file) | 234 | if (num_of_bytes < end_of_file) |
177 | cFYI(1, ("allocation size less than end of file")); | 235 | cFYI(1, ("allocation size less than end of file")); |
178 | cFYI(1, ("Size %ld and blocks %llu", | 236 | cFYI(1, ("Size %ld and blocks %llu", |
179 | (unsigned long) inode->i_size, | 237 | (unsigned long) inode->i_size, |
180 | (unsigned long long)inode->i_blocks)); | 238 | (unsigned long long)inode->i_blocks)); |
181 | if (S_ISREG(inode->i_mode)) { | 239 | |
182 | cFYI(1, ("File inode")); | 240 | cifs_set_ops(inode); |
183 | inode->i_op = &cifs_file_inode_ops; | ||
184 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { | ||
185 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
186 | inode->i_fop = | ||
187 | &cifs_file_direct_nobrl_ops; | ||
188 | else | ||
189 | inode->i_fop = &cifs_file_direct_ops; | ||
190 | } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
191 | inode->i_fop = &cifs_file_nobrl_ops; | ||
192 | else /* not direct, send byte range locks */ | ||
193 | inode->i_fop = &cifs_file_ops; | ||
194 | |||
195 | /* check if server can support readpages */ | ||
196 | if (pTcon->ses->server->maxBuf < | ||
197 | PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE) | ||
198 | inode->i_data.a_ops = &cifs_addr_ops_smallbuf; | ||
199 | else | ||
200 | inode->i_data.a_ops = &cifs_addr_ops; | ||
201 | } else if (S_ISDIR(inode->i_mode)) { | ||
202 | cFYI(1, ("Directory inode")); | ||
203 | inode->i_op = &cifs_dir_inode_ops; | ||
204 | inode->i_fop = &cifs_dir_ops; | ||
205 | } else if (S_ISLNK(inode->i_mode)) { | ||
206 | cFYI(1, ("Symbolic Link inode")); | ||
207 | inode->i_op = &cifs_symlink_inode_ops; | ||
208 | /* tmp_inode->i_fop = */ /* do not need to set to anything */ | ||
209 | } else { | ||
210 | cFYI(1, ("Init special inode")); | ||
211 | init_special_inode(inode, inode->i_mode, | ||
212 | inode->i_rdev); | ||
213 | } | ||
214 | } | 241 | } |
215 | return rc; | 242 | return rc; |
216 | } | 243 | } |
@@ -490,9 +517,9 @@ int cifs_get_inode_info(struct inode **pinode, | |||
490 | if (decode_sfu_inode(inode, | 517 | if (decode_sfu_inode(inode, |
491 | le64_to_cpu(pfindData->EndOfFile), | 518 | le64_to_cpu(pfindData->EndOfFile), |
492 | search_path, | 519 | search_path, |
493 | cifs_sb, xid)) { | 520 | cifs_sb, xid)) |
494 | cFYI(1, ("Unrecognized sfu inode type")); | 521 | cFYI(1, ("Unrecognized sfu inode type")); |
495 | } | 522 | |
496 | cFYI(1, ("sfu mode 0%o", inode->i_mode)); | 523 | cFYI(1, ("sfu mode 0%o", inode->i_mode)); |
497 | } else { | 524 | } else { |
498 | inode->i_mode |= S_IFREG; | 525 | inode->i_mode |= S_IFREG; |
@@ -546,36 +573,7 @@ int cifs_get_inode_info(struct inode **pinode, | |||
546 | atomic_set(&cifsInfo->inUse, 1); | 573 | atomic_set(&cifsInfo->inUse, 1); |
547 | } | 574 | } |
548 | 575 | ||
549 | if (S_ISREG(inode->i_mode)) { | 576 | cifs_set_ops(inode); |
550 | cFYI(1, ("File inode")); | ||
551 | inode->i_op = &cifs_file_inode_ops; | ||
552 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { | ||
553 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
554 | inode->i_fop = | ||
555 | &cifs_file_direct_nobrl_ops; | ||
556 | else | ||
557 | inode->i_fop = &cifs_file_direct_ops; | ||
558 | } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
559 | inode->i_fop = &cifs_file_nobrl_ops; | ||
560 | else /* not direct, send byte range locks */ | ||
561 | inode->i_fop = &cifs_file_ops; | ||
562 | |||
563 | if (pTcon->ses->server->maxBuf < | ||
564 | PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE) | ||
565 | inode->i_data.a_ops = &cifs_addr_ops_smallbuf; | ||
566 | else | ||
567 | inode->i_data.a_ops = &cifs_addr_ops; | ||
568 | } else if (S_ISDIR(inode->i_mode)) { | ||
569 | cFYI(1, ("Directory inode")); | ||
570 | inode->i_op = &cifs_dir_inode_ops; | ||
571 | inode->i_fop = &cifs_dir_ops; | ||
572 | } else if (S_ISLNK(inode->i_mode)) { | ||
573 | cFYI(1, ("Symbolic Link inode")); | ||
574 | inode->i_op = &cifs_symlink_inode_ops; | ||
575 | } else { | ||
576 | init_special_inode(inode, inode->i_mode, | ||
577 | inode->i_rdev); | ||
578 | } | ||
579 | } | 577 | } |
580 | kfree(buf); | 578 | kfree(buf); |
581 | return rc; | 579 | return rc; |
@@ -792,17 +790,12 @@ psx_del_no_retry: | |||
792 | } | 790 | } |
793 | 791 | ||
794 | static void posix_fill_in_inode(struct inode *tmp_inode, | 792 | static void posix_fill_in_inode(struct inode *tmp_inode, |
795 | FILE_UNIX_BASIC_INFO *pData, int *pobject_type, int isNewInode) | 793 | FILE_UNIX_BASIC_INFO *pData, int isNewInode) |
796 | { | 794 | { |
795 | struct cifsInodeInfo *cifsInfo = CIFS_I(tmp_inode); | ||
797 | loff_t local_size; | 796 | loff_t local_size; |
798 | struct timespec local_mtime; | 797 | struct timespec local_mtime; |
799 | 798 | ||
800 | struct cifsInodeInfo *cifsInfo = CIFS_I(tmp_inode); | ||
801 | struct cifs_sb_info *cifs_sb = CIFS_SB(tmp_inode->i_sb); | ||
802 | |||
803 | __u32 type = le32_to_cpu(pData->Type); | ||
804 | __u64 num_of_bytes = le64_to_cpu(pData->NumOfBytes); | ||
805 | __u64 end_of_file = le64_to_cpu(pData->EndOfFile); | ||
806 | cifsInfo->time = jiffies; | 799 | cifsInfo->time = jiffies; |
807 | atomic_inc(&cifsInfo->inUse); | 800 | atomic_inc(&cifsInfo->inUse); |
808 | 801 | ||
@@ -810,115 +803,27 @@ static void posix_fill_in_inode(struct inode *tmp_inode, | |||
810 | local_mtime = tmp_inode->i_mtime; | 803 | local_mtime = tmp_inode->i_mtime; |
811 | local_size = tmp_inode->i_size; | 804 | local_size = tmp_inode->i_size; |
812 | 805 | ||
813 | tmp_inode->i_atime = | 806 | cifs_unix_info_to_inode(tmp_inode, pData, 1); |
814 | cifs_NTtimeToUnix(le64_to_cpu(pData->LastAccessTime)); | 807 | cifs_set_ops(tmp_inode); |
815 | tmp_inode->i_mtime = | ||
816 | cifs_NTtimeToUnix(le64_to_cpu(pData->LastModificationTime)); | ||
817 | tmp_inode->i_ctime = | ||
818 | cifs_NTtimeToUnix(le64_to_cpu(pData->LastStatusChange)); | ||
819 | |||
820 | tmp_inode->i_mode = le64_to_cpu(pData->Permissions); | ||
821 | /* since we set the inode type below we need to mask off type | ||
822 | to avoid strange results if bits above were corrupt */ | ||
823 | tmp_inode->i_mode &= ~S_IFMT; | ||
824 | if (type == UNIX_FILE) { | ||
825 | *pobject_type = DT_REG; | ||
826 | tmp_inode->i_mode |= S_IFREG; | ||
827 | } else if (type == UNIX_SYMLINK) { | ||
828 | *pobject_type = DT_LNK; | ||
829 | tmp_inode->i_mode |= S_IFLNK; | ||
830 | } else if (type == UNIX_DIR) { | ||
831 | *pobject_type = DT_DIR; | ||
832 | tmp_inode->i_mode |= S_IFDIR; | ||
833 | } else if (type == UNIX_CHARDEV) { | ||
834 | *pobject_type = DT_CHR; | ||
835 | tmp_inode->i_mode |= S_IFCHR; | ||
836 | tmp_inode->i_rdev = MKDEV(le64_to_cpu(pData->DevMajor), | ||
837 | le64_to_cpu(pData->DevMinor) & MINORMASK); | ||
838 | } else if (type == UNIX_BLOCKDEV) { | ||
839 | *pobject_type = DT_BLK; | ||
840 | tmp_inode->i_mode |= S_IFBLK; | ||
841 | tmp_inode->i_rdev = MKDEV(le64_to_cpu(pData->DevMajor), | ||
842 | le64_to_cpu(pData->DevMinor) & MINORMASK); | ||
843 | } else if (type == UNIX_FIFO) { | ||
844 | *pobject_type = DT_FIFO; | ||
845 | tmp_inode->i_mode |= S_IFIFO; | ||
846 | } else if (type == UNIX_SOCKET) { | ||
847 | *pobject_type = DT_SOCK; | ||
848 | tmp_inode->i_mode |= S_IFSOCK; | ||
849 | } else { | ||
850 | /* safest to just call it a file */ | ||
851 | *pobject_type = DT_REG; | ||
852 | tmp_inode->i_mode |= S_IFREG; | ||
853 | cFYI(1, ("unknown inode type %d", type)); | ||
854 | } | ||
855 | |||
856 | #ifdef CONFIG_CIFS_DEBUG2 | ||
857 | cFYI(1, ("object type: %d", type)); | ||
858 | #endif | ||
859 | tmp_inode->i_uid = le64_to_cpu(pData->Uid); | ||
860 | tmp_inode->i_gid = le64_to_cpu(pData->Gid); | ||
861 | tmp_inode->i_nlink = le64_to_cpu(pData->Nlinks); | ||
862 | |||
863 | spin_lock(&tmp_inode->i_lock); | ||
864 | if (is_size_safe_to_change(cifsInfo, end_of_file)) { | ||
865 | /* can not safely change the file size here if the | ||
866 | client is writing to it due to potential races */ | ||
867 | i_size_write(tmp_inode, end_of_file); | ||
868 | 808 | ||
869 | /* 512 bytes (2**9) is the fake blocksize that must be used */ | 809 | if (!S_ISREG(tmp_inode->i_mode)) |
870 | /* for this calculation, not the real blocksize */ | 810 | return; |
871 | tmp_inode->i_blocks = (512 - 1 + num_of_bytes) >> 9; | ||
872 | } | ||
873 | spin_unlock(&tmp_inode->i_lock); | ||
874 | |||
875 | if (S_ISREG(tmp_inode->i_mode)) { | ||
876 | cFYI(1, ("File inode")); | ||
877 | tmp_inode->i_op = &cifs_file_inode_ops; | ||
878 | |||
879 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { | ||
880 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
881 | tmp_inode->i_fop = &cifs_file_direct_nobrl_ops; | ||
882 | else | ||
883 | tmp_inode->i_fop = &cifs_file_direct_ops; | ||
884 | 811 | ||
885 | } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | 812 | /* |
886 | tmp_inode->i_fop = &cifs_file_nobrl_ops; | 813 | * No sense invalidating pages for new inode |
887 | else | 814 | * since we we have not started caching |
888 | tmp_inode->i_fop = &cifs_file_ops; | 815 | * readahead file data yet. |
889 | 816 | */ | |
890 | if ((cifs_sb->tcon) && (cifs_sb->tcon->ses) && | 817 | if (isNewInode) |
891 | (cifs_sb->tcon->ses->server->maxBuf < | 818 | return; |
892 | PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE)) | ||
893 | tmp_inode->i_data.a_ops = &cifs_addr_ops_smallbuf; | ||
894 | else | ||
895 | tmp_inode->i_data.a_ops = &cifs_addr_ops; | ||
896 | |||
897 | if (isNewInode) | ||
898 | return; /* No sense invalidating pages for new inode | ||
899 | since we we have not started caching | ||
900 | readahead file data yet */ | ||
901 | 819 | ||
902 | if (timespec_equal(&tmp_inode->i_mtime, &local_mtime) && | 820 | if (timespec_equal(&tmp_inode->i_mtime, &local_mtime) && |
903 | (local_size == tmp_inode->i_size)) { | 821 | (local_size == tmp_inode->i_size)) { |
904 | cFYI(1, ("inode exists but unchanged")); | 822 | cFYI(1, ("inode exists but unchanged")); |
905 | } else { | ||
906 | /* file may have changed on server */ | ||
907 | cFYI(1, ("invalidate inode, readdir detected change")); | ||
908 | invalidate_remote_inode(tmp_inode); | ||
909 | } | ||
910 | } else if (S_ISDIR(tmp_inode->i_mode)) { | ||
911 | cFYI(1, ("Directory inode")); | ||
912 | tmp_inode->i_op = &cifs_dir_inode_ops; | ||
913 | tmp_inode->i_fop = &cifs_dir_ops; | ||
914 | } else if (S_ISLNK(tmp_inode->i_mode)) { | ||
915 | cFYI(1, ("Symbolic Link inode")); | ||
916 | tmp_inode->i_op = &cifs_symlink_inode_ops; | ||
917 | /* tmp_inode->i_fop = *//* do not need to set to anything */ | ||
918 | } else { | 823 | } else { |
919 | cFYI(1, ("Special inode")); | 824 | /* file may have changed on server */ |
920 | init_special_inode(tmp_inode, tmp_inode->i_mode, | 825 | cFYI(1, ("invalidate inode, readdir detected change")); |
921 | tmp_inode->i_rdev); | 826 | invalidate_remote_inode(tmp_inode); |
922 | } | 827 | } |
923 | } | 828 | } |
924 | 829 | ||
@@ -968,7 +873,6 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
968 | cFYI(1, ("posix mkdir returned 0x%x", rc)); | 873 | cFYI(1, ("posix mkdir returned 0x%x", rc)); |
969 | d_drop(direntry); | 874 | d_drop(direntry); |
970 | } else { | 875 | } else { |
971 | int obj_type; | ||
972 | if (pInfo->Type == cpu_to_le32(-1)) { | 876 | if (pInfo->Type == cpu_to_le32(-1)) { |
973 | /* no return info, go query for it */ | 877 | /* no return info, go query for it */ |
974 | kfree(pInfo); | 878 | kfree(pInfo); |
@@ -1004,7 +908,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
1004 | /* we already checked in POSIXCreate whether | 908 | /* we already checked in POSIXCreate whether |
1005 | frame was long enough */ | 909 | frame was long enough */ |
1006 | posix_fill_in_inode(direntry->d_inode, | 910 | posix_fill_in_inode(direntry->d_inode, |
1007 | pInfo, &obj_type, 1 /* NewInode */); | 911 | pInfo, 1 /* NewInode */); |
1008 | #ifdef CONFIG_CIFS_DEBUG2 | 912 | #ifdef CONFIG_CIFS_DEBUG2 |
1009 | cFYI(1, ("instantiated dentry %p %s to inode %p", | 913 | cFYI(1, ("instantiated dentry %p %s to inode %p", |
1010 | direntry, direntry->d_name.name, newinode)); | 914 | direntry, direntry->d_name.name, newinode)); |
@@ -1214,9 +1118,8 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, | |||
1214 | } /* if we can not get memory just leave rc as EEXIST */ | 1118 | } /* if we can not get memory just leave rc as EEXIST */ |
1215 | } | 1119 | } |
1216 | 1120 | ||
1217 | if (rc) { | 1121 | if (rc) |
1218 | cFYI(1, ("rename rc %d", rc)); | 1122 | cFYI(1, ("rename rc %d", rc)); |
1219 | } | ||
1220 | 1123 | ||
1221 | if ((rc == -EIO) || (rc == -EEXIST)) { | 1124 | if ((rc == -EIO) || (rc == -EEXIST)) { |
1222 | int oplock = FALSE; | 1125 | int oplock = FALSE; |
diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c index d24fe6880a04..5c792df13d62 100644 --- a/fs/cifs/ioctl.c +++ b/fs/cifs/ioctl.c | |||
@@ -30,7 +30,7 @@ | |||
30 | 30 | ||
31 | #define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2) | 31 | #define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2) |
32 | 32 | ||
33 | int cifs_ioctl (struct inode *inode, struct file *filep, | 33 | int cifs_ioctl(struct inode *inode, struct file *filep, |
34 | unsigned int command, unsigned long arg) | 34 | unsigned int command, unsigned long arg) |
35 | { | 35 | { |
36 | int rc = -ENOTTY; /* strange error - but the precedent */ | 36 | int rc = -ENOTTY; /* strange error - but the precedent */ |
diff --git a/fs/cifs/md4.c b/fs/cifs/md4.c index a2415c1a14db..a725c2609d67 100644 --- a/fs/cifs/md4.c +++ b/fs/cifs/md4.c | |||
@@ -56,7 +56,7 @@ lshift(__u32 x, int s) | |||
56 | 56 | ||
57 | /* this applies md4 to 64 byte chunks */ | 57 | /* this applies md4 to 64 byte chunks */ |
58 | static void | 58 | static void |
59 | mdfour64(__u32 * M, __u32 * A, __u32 *B, __u32 * C, __u32 *D) | 59 | mdfour64(__u32 *M, __u32 *A, __u32 *B, __u32 *C, __u32 *D) |
60 | { | 60 | { |
61 | int j; | 61 | int j; |
62 | __u32 AA, BB, CC, DD; | 62 | __u32 AA, BB, CC, DD; |
@@ -137,7 +137,7 @@ mdfour64(__u32 * M, __u32 * A, __u32 *B, __u32 * C, __u32 *D) | |||
137 | } | 137 | } |
138 | 138 | ||
139 | static void | 139 | static void |
140 | copy64(__u32 * M, unsigned char *in) | 140 | copy64(__u32 *M, unsigned char *in) |
141 | { | 141 | { |
142 | int i; | 142 | int i; |
143 | 143 | ||
diff --git a/fs/cifs/md5.c b/fs/cifs/md5.c index f13f96d42fcf..462bbfefd4b6 100644 --- a/fs/cifs/md5.c +++ b/fs/cifs/md5.c | |||
@@ -161,7 +161,7 @@ MD5Final(unsigned char digest[16], struct MD5Context *ctx) | |||
161 | 161 | ||
162 | /* This is the central step in the MD5 algorithm. */ | 162 | /* This is the central step in the MD5 algorithm. */ |
163 | #define MD5STEP(f, w, x, y, z, data, s) \ | 163 | #define MD5STEP(f, w, x, y, z, data, s) \ |
164 | ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x ) | 164 | (w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x) |
165 | 165 | ||
166 | /* | 166 | /* |
167 | * The core of the MD5 algorithm, this alters an existing MD5 hash to | 167 | * The core of the MD5 algorithm, this alters an existing MD5 hash to |
@@ -302,9 +302,8 @@ hmac_md5_init_limK_to_64(const unsigned char *key, int key_len, | |||
302 | int i; | 302 | int i; |
303 | 303 | ||
304 | /* if key is longer than 64 bytes truncate it */ | 304 | /* if key is longer than 64 bytes truncate it */ |
305 | if (key_len > 64) { | 305 | if (key_len > 64) |
306 | key_len = 64; | 306 | key_len = 64; |
307 | } | ||
308 | 307 | ||
309 | /* start out by storing key in pads */ | 308 | /* start out by storing key in pads */ |
310 | memset(ctx->k_ipad, 0, sizeof(ctx->k_ipad)); | 309 | memset(ctx->k_ipad, 0, sizeof(ctx->k_ipad)); |
@@ -359,9 +358,9 @@ hmac_md5(unsigned char key[16], unsigned char *data, int data_len, | |||
359 | { | 358 | { |
360 | struct HMACMD5Context ctx; | 359 | struct HMACMD5Context ctx; |
361 | hmac_md5_init_limK_to_64(key, 16, &ctx); | 360 | hmac_md5_init_limK_to_64(key, 16, &ctx); |
362 | if (data_len != 0) { | 361 | if (data_len != 0) |
363 | hmac_md5_update(data, data_len, &ctx); | 362 | hmac_md5_update(data, data_len, &ctx); |
364 | } | 363 | |
365 | hmac_md5_final(digest, &ctx); | 364 | hmac_md5_final(digest, &ctx); |
366 | } | 365 | } |
367 | #endif | 366 | #endif |
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index 15546c2354c5..2a42d9fedbb2 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * fs/cifs/misc.c | 2 | * fs/cifs/misc.c |
3 | * | 3 | * |
4 | * Copyright (C) International Business Machines Corp., 2002,2007 | 4 | * Copyright (C) International Business Machines Corp., 2002,2008 |
5 | * Author(s): Steve French (sfrench@us.ibm.com) | 5 | * Author(s): Steve French (sfrench@us.ibm.com) |
6 | * | 6 | * |
7 | * This library is free software; you can redistribute it and/or modify | 7 | * This library is free software; you can redistribute it and/or modify |
@@ -320,9 +320,9 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ , | |||
320 | if (treeCon->ses) { | 320 | if (treeCon->ses) { |
321 | if (treeCon->ses->capabilities & CAP_UNICODE) | 321 | if (treeCon->ses->capabilities & CAP_UNICODE) |
322 | buffer->Flags2 |= SMBFLG2_UNICODE; | 322 | buffer->Flags2 |= SMBFLG2_UNICODE; |
323 | if (treeCon->ses->capabilities & CAP_STATUS32) { | 323 | if (treeCon->ses->capabilities & CAP_STATUS32) |
324 | buffer->Flags2 |= SMBFLG2_ERR_STATUS; | 324 | buffer->Flags2 |= SMBFLG2_ERR_STATUS; |
325 | } | 325 | |
326 | /* Uid is not converted */ | 326 | /* Uid is not converted */ |
327 | buffer->Uid = treeCon->ses->Suid; | 327 | buffer->Uid = treeCon->ses->Suid; |
328 | buffer->Mid = GetNextMid(treeCon->ses->server); | 328 | buffer->Mid = GetNextMid(treeCon->ses->server); |
@@ -610,7 +610,8 @@ dump_smb(struct smb_hdr *smb_buf, int smb_buf_length) | |||
610 | 610 | ||
611 | buffer = (unsigned char *) smb_buf; | 611 | buffer = (unsigned char *) smb_buf; |
612 | for (i = 0, j = 0; i < smb_buf_length; i++, j++) { | 612 | for (i = 0, j = 0; i < smb_buf_length; i++, j++) { |
613 | if (i % 8 == 0) { /* have reached the beginning of line */ | 613 | if (i % 8 == 0) { |
614 | /* have reached the beginning of line */ | ||
614 | printk(KERN_DEBUG "| "); | 615 | printk(KERN_DEBUG "| "); |
615 | j = 0; | 616 | j = 0; |
616 | } | 617 | } |
@@ -621,7 +622,8 @@ dump_smb(struct smb_hdr *smb_buf, int smb_buf_length) | |||
621 | else | 622 | else |
622 | debug_line[1 + (2 * j)] = '_'; | 623 | debug_line[1 + (2 * j)] = '_'; |
623 | 624 | ||
624 | if (i % 8 == 7) { /* reached end of line, time to print ascii */ | 625 | if (i % 8 == 7) { |
626 | /* reached end of line, time to print ascii */ | ||
625 | debug_line[16] = 0; | 627 | debug_line[16] = 0; |
626 | printk(" | %s\n", debug_line); | 628 | printk(" | %s\n", debug_line); |
627 | } | 629 | } |
@@ -631,7 +633,7 @@ dump_smb(struct smb_hdr *smb_buf, int smb_buf_length) | |||
631 | debug_line[2 * j] = ' '; | 633 | debug_line[2 * j] = ' '; |
632 | debug_line[1 + (2 * j)] = ' '; | 634 | debug_line[1 + (2 * j)] = ' '; |
633 | } | 635 | } |
634 | printk( " | %s\n", debug_line); | 636 | printk(" | %s\n", debug_line); |
635 | return; | 637 | return; |
636 | } | 638 | } |
637 | 639 | ||
diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c index 646e1f06941b..3b5a5ce882b6 100644 --- a/fs/cifs/netmisc.c +++ b/fs/cifs/netmisc.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * fs/cifs/netmisc.c | 2 | * fs/cifs/netmisc.c |
3 | * | 3 | * |
4 | * Copyright (c) International Business Machines Corp., 2002 | 4 | * Copyright (c) International Business Machines Corp., 2002,2008 |
5 | * Author(s): Steve French (sfrench@us.ibm.com) | 5 | * Author(s): Steve French (sfrench@us.ibm.com) |
6 | * | 6 | * |
7 | * Error mapping routines from Samba libsmb/errormap.c | 7 | * Error mapping routines from Samba libsmb/errormap.c |
@@ -150,9 +150,7 @@ static int canonicalize_unc(char *cp) | |||
150 | if (cp[i] == '\\') | 150 | if (cp[i] == '\\') |
151 | break; | 151 | break; |
152 | if (cp[i] == '/') { | 152 | if (cp[i] == '/') { |
153 | #ifdef CONFIG_CIFS_DEBUG2 | 153 | cFYI(DBG2, ("change slash to \\ in malformed UNC")); |
154 | cFYI(1, ("change slash to backslash in malformed UNC")); | ||
155 | #endif | ||
156 | cp[i] = '\\'; | 154 | cp[i] = '\\'; |
157 | return 1; | 155 | return 1; |
158 | } | 156 | } |
@@ -178,9 +176,7 @@ cifs_inet_pton(int address_family, char *cp, void *dst) | |||
178 | } else if (address_family == AF_INET6) { | 176 | } else if (address_family == AF_INET6) { |
179 | ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL); | 177 | ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL); |
180 | } | 178 | } |
181 | #ifdef CONFIG_CIFS_DEBUG2 | 179 | cFYI(DBG2, ("address conversion returned %d for %s", ret, cp)); |
182 | cFYI(1, ("address conversion returned %d for %s", ret, cp)); | ||
183 | #endif | ||
184 | if (ret > 0) | 180 | if (ret > 0) |
185 | ret = 1; | 181 | ret = 1; |
186 | return ret; | 182 | return ret; |
@@ -253,7 +249,8 @@ static const struct { | |||
253 | ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_MIX}, { | 249 | ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_MIX}, { |
254 | ERRHRD, ERRgeneral, NT_STATUS_INVALID_QUOTA_LOWER}, { | 250 | ERRHRD, ERRgeneral, NT_STATUS_INVALID_QUOTA_LOWER}, { |
255 | ERRHRD, ERRgeneral, NT_STATUS_DISK_CORRUPT_ERROR}, { | 251 | ERRHRD, ERRgeneral, NT_STATUS_DISK_CORRUPT_ERROR}, { |
256 | ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_INVALID}, { /* mapping changed since shell does lookup on * and expects file not found */ | 252 | /* mapping changed since shell does lookup on * expects FileNotFound */ |
253 | ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_INVALID}, { | ||
257 | ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND}, { | 254 | ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND}, { |
258 | ERRDOS, ERRalreadyexists, NT_STATUS_OBJECT_NAME_COLLISION}, { | 255 | ERRDOS, ERRalreadyexists, NT_STATUS_OBJECT_NAME_COLLISION}, { |
259 | ERRHRD, ERRgeneral, NT_STATUS_HANDLE_NOT_WAITABLE}, { | 256 | ERRHRD, ERRgeneral, NT_STATUS_HANDLE_NOT_WAITABLE}, { |
@@ -820,7 +817,8 @@ map_smb_to_linux_error(struct smb_hdr *smb, int logErr) | |||
820 | /* old style errors */ | 817 | /* old style errors */ |
821 | 818 | ||
822 | /* DOS class smb error codes - map DOS */ | 819 | /* DOS class smb error codes - map DOS */ |
823 | if (smberrclass == ERRDOS) { /* 1 byte field no need to byte reverse */ | 820 | if (smberrclass == ERRDOS) { |
821 | /* 1 byte field no need to byte reverse */ | ||
824 | for (i = 0; | 822 | for (i = 0; |
825 | i < | 823 | i < |
826 | sizeof(mapping_table_ERRDOS) / | 824 | sizeof(mapping_table_ERRDOS) / |
@@ -834,7 +832,8 @@ map_smb_to_linux_error(struct smb_hdr *smb, int logErr) | |||
834 | } | 832 | } |
835 | /* else try next error mapping one to see if match */ | 833 | /* else try next error mapping one to see if match */ |
836 | } | 834 | } |
837 | } else if (smberrclass == ERRSRV) { /* server class of error codes */ | 835 | } else if (smberrclass == ERRSRV) { |
836 | /* server class of error codes */ | ||
838 | for (i = 0; | 837 | for (i = 0; |
839 | i < | 838 | i < |
840 | sizeof(mapping_table_ERRSRV) / | 839 | sizeof(mapping_table_ERRSRV) / |
@@ -922,8 +921,8 @@ struct timespec cnvrtDosUnixTm(__u16 date, __u16 time) | |||
922 | { | 921 | { |
923 | struct timespec ts; | 922 | struct timespec ts; |
924 | int sec, min, days, month, year; | 923 | int sec, min, days, month, year; |
925 | SMB_TIME * st = (SMB_TIME *)&time; | 924 | SMB_TIME *st = (SMB_TIME *)&time; |
926 | SMB_DATE * sd = (SMB_DATE *)&date; | 925 | SMB_DATE *sd = (SMB_DATE *)&date; |
927 | 926 | ||
928 | cFYI(1, ("date %d time %d", date, time)); | 927 | cFYI(1, ("date %d time %d", date, time)); |
929 | 928 | ||
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 0f22def4bdff..32b445edc882 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Directory search handling | 4 | * Directory search handling |
5 | * | 5 | * |
6 | * Copyright (C) International Business Machines Corp., 2004, 2007 | 6 | * Copyright (C) International Business Machines Corp., 2004, 2008 |
7 | * Author(s): Steve French (sfrench@us.ibm.com) | 7 | * Author(s): Steve French (sfrench@us.ibm.com) |
8 | * | 8 | * |
9 | * This library is free software; you can redistribute it and/or modify | 9 | * This library is free software; you can redistribute it and/or modify |
@@ -42,17 +42,18 @@ static void dump_cifs_file_struct(struct file *file, char *label) | |||
42 | cFYI(1, ("empty cifs private file data")); | 42 | cFYI(1, ("empty cifs private file data")); |
43 | return; | 43 | return; |
44 | } | 44 | } |
45 | if (cf->invalidHandle) { | 45 | if (cf->invalidHandle) |
46 | cFYI(1, ("invalid handle")); | 46 | cFYI(1, ("invalid handle")); |
47 | } | 47 | if (cf->srch_inf.endOfSearch) |
48 | if (cf->srch_inf.endOfSearch) { | ||
49 | cFYI(1, ("end of search")); | 48 | cFYI(1, ("end of search")); |
50 | } | 49 | if (cf->srch_inf.emptyDir) |
51 | if (cf->srch_inf.emptyDir) { | ||
52 | cFYI(1, ("empty dir")); | 50 | cFYI(1, ("empty dir")); |
53 | } | ||
54 | } | 51 | } |
55 | } | 52 | } |
53 | #else | ||
54 | static inline void dump_cifs_file_struct(struct file *file, char *label) | ||
55 | { | ||
56 | } | ||
56 | #endif /* DEBUG2 */ | 57 | #endif /* DEBUG2 */ |
57 | 58 | ||
58 | /* Returns one if new inode created (which therefore needs to be hashed) */ | 59 | /* Returns one if new inode created (which therefore needs to be hashed) */ |
@@ -150,7 +151,7 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type, | |||
150 | cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime)); | 151 | cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime)); |
151 | } else { /* legacy, OS2 and DOS style */ | 152 | } else { /* legacy, OS2 and DOS style */ |
152 | /* struct timespec ts;*/ | 153 | /* struct timespec ts;*/ |
153 | FIND_FILE_STANDARD_INFO * pfindData = | 154 | FIND_FILE_STANDARD_INFO *pfindData = |
154 | (FIND_FILE_STANDARD_INFO *)buf; | 155 | (FIND_FILE_STANDARD_INFO *)buf; |
155 | 156 | ||
156 | tmp_inode->i_mtime = cnvrtDosUnixTm( | 157 | tmp_inode->i_mtime = cnvrtDosUnixTm( |
@@ -198,9 +199,8 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type, | |||
198 | if (attr & ATTR_DIRECTORY) { | 199 | if (attr & ATTR_DIRECTORY) { |
199 | *pobject_type = DT_DIR; | 200 | *pobject_type = DT_DIR; |
200 | /* override default perms since we do not lock dirs */ | 201 | /* override default perms since we do not lock dirs */ |
201 | if (atomic_read(&cifsInfo->inUse) == 0) { | 202 | if (atomic_read(&cifsInfo->inUse) == 0) |
202 | tmp_inode->i_mode = cifs_sb->mnt_dir_mode; | 203 | tmp_inode->i_mode = cifs_sb->mnt_dir_mode; |
203 | } | ||
204 | tmp_inode->i_mode |= S_IFDIR; | 204 | tmp_inode->i_mode |= S_IFDIR; |
205 | } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) && | 205 | } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) && |
206 | (attr & ATTR_SYSTEM)) { | 206 | (attr & ATTR_SYSTEM)) { |
@@ -231,9 +231,8 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type, | |||
231 | } /* could add code here - to validate if device or weird share type? */ | 231 | } /* could add code here - to validate if device or weird share type? */ |
232 | 232 | ||
233 | /* can not fill in nlink here as in qpathinfo version and Unx search */ | 233 | /* can not fill in nlink here as in qpathinfo version and Unx search */ |
234 | if (atomic_read(&cifsInfo->inUse) == 0) { | 234 | if (atomic_read(&cifsInfo->inUse) == 0) |
235 | atomic_set(&cifsInfo->inUse, 1); | 235 | atomic_set(&cifsInfo->inUse, 1); |
236 | } | ||
237 | 236 | ||
238 | spin_lock(&tmp_inode->i_lock); | 237 | spin_lock(&tmp_inode->i_lock); |
239 | if (is_size_safe_to_change(cifsInfo, end_of_file)) { | 238 | if (is_size_safe_to_change(cifsInfo, end_of_file)) { |
@@ -461,9 +460,8 @@ static int initiate_cifs_search(const int xid, struct file *file) | |||
461 | 460 | ||
462 | full_path = build_path_from_dentry(file->f_path.dentry); | 461 | full_path = build_path_from_dentry(file->f_path.dentry); |
463 | 462 | ||
464 | if (full_path == NULL) { | 463 | if (full_path == NULL) |
465 | return -ENOMEM; | 464 | return -ENOMEM; |
466 | } | ||
467 | 465 | ||
468 | cFYI(1, ("Full path: %s start at: %lld", full_path, file->f_pos)); | 466 | cFYI(1, ("Full path: %s start at: %lld", full_path, file->f_pos)); |
469 | 467 | ||
@@ -471,9 +469,9 @@ ffirst_retry: | |||
471 | /* test for Unix extensions */ | 469 | /* test for Unix extensions */ |
472 | /* but now check for them on the share/mount not on the SMB session */ | 470 | /* but now check for them on the share/mount not on the SMB session */ |
473 | /* if (pTcon->ses->capabilities & CAP_UNIX) { */ | 471 | /* if (pTcon->ses->capabilities & CAP_UNIX) { */ |
474 | if (pTcon->unix_ext) { | 472 | if (pTcon->unix_ext) |
475 | cifsFile->srch_inf.info_level = SMB_FIND_FILE_UNIX; | 473 | cifsFile->srch_inf.info_level = SMB_FIND_FILE_UNIX; |
476 | } else if ((pTcon->ses->capabilities & | 474 | else if ((pTcon->ses->capabilities & |
477 | (CAP_NT_SMBS | CAP_NT_FIND)) == 0) { | 475 | (CAP_NT_SMBS | CAP_NT_FIND)) == 0) { |
478 | cifsFile->srch_inf.info_level = SMB_FIND_FILE_INFO_STANDARD; | 476 | cifsFile->srch_inf.info_level = SMB_FIND_FILE_INFO_STANDARD; |
479 | } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { | 477 | } else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { |
@@ -514,10 +512,10 @@ static int cifs_unicode_bytelen(char *str) | |||
514 | static char *nxt_dir_entry(char *old_entry, char *end_of_smb, int level) | 512 | static char *nxt_dir_entry(char *old_entry, char *end_of_smb, int level) |
515 | { | 513 | { |
516 | char *new_entry; | 514 | char *new_entry; |
517 | FILE_DIRECTORY_INFO * pDirInfo = (FILE_DIRECTORY_INFO *)old_entry; | 515 | FILE_DIRECTORY_INFO *pDirInfo = (FILE_DIRECTORY_INFO *)old_entry; |
518 | 516 | ||
519 | if (level == SMB_FIND_FILE_INFO_STANDARD) { | 517 | if (level == SMB_FIND_FILE_INFO_STANDARD) { |
520 | FIND_FILE_STANDARD_INFO * pfData; | 518 | FIND_FILE_STANDARD_INFO *pfData; |
521 | pfData = (FIND_FILE_STANDARD_INFO *)pDirInfo; | 519 | pfData = (FIND_FILE_STANDARD_INFO *)pDirInfo; |
522 | 520 | ||
523 | new_entry = old_entry + sizeof(FIND_FILE_STANDARD_INFO) + | 521 | new_entry = old_entry + sizeof(FIND_FILE_STANDARD_INFO) + |
@@ -553,7 +551,7 @@ static int cifs_entry_is_dot(char *current_entry, struct cifsFileInfo *cfile) | |||
553 | int len = 0; | 551 | int len = 0; |
554 | 552 | ||
555 | if (cfile->srch_inf.info_level == SMB_FIND_FILE_UNIX) { | 553 | if (cfile->srch_inf.info_level == SMB_FIND_FILE_UNIX) { |
556 | FILE_UNIX_INFO * pFindData = (FILE_UNIX_INFO *)current_entry; | 554 | FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry; |
557 | filename = &pFindData->FileName[0]; | 555 | filename = &pFindData->FileName[0]; |
558 | if (cfile->srch_inf.unicode) { | 556 | if (cfile->srch_inf.unicode) { |
559 | len = cifs_unicode_bytelen(filename); | 557 | len = cifs_unicode_bytelen(filename); |
@@ -562,30 +560,30 @@ static int cifs_entry_is_dot(char *current_entry, struct cifsFileInfo *cfile) | |||
562 | len = strnlen(filename, 5); | 560 | len = strnlen(filename, 5); |
563 | } | 561 | } |
564 | } else if (cfile->srch_inf.info_level == SMB_FIND_FILE_DIRECTORY_INFO) { | 562 | } else if (cfile->srch_inf.info_level == SMB_FIND_FILE_DIRECTORY_INFO) { |
565 | FILE_DIRECTORY_INFO * pFindData = | 563 | FILE_DIRECTORY_INFO *pFindData = |
566 | (FILE_DIRECTORY_INFO *)current_entry; | 564 | (FILE_DIRECTORY_INFO *)current_entry; |
567 | filename = &pFindData->FileName[0]; | 565 | filename = &pFindData->FileName[0]; |
568 | len = le32_to_cpu(pFindData->FileNameLength); | 566 | len = le32_to_cpu(pFindData->FileNameLength); |
569 | } else if (cfile->srch_inf.info_level == | 567 | } else if (cfile->srch_inf.info_level == |
570 | SMB_FIND_FILE_FULL_DIRECTORY_INFO) { | 568 | SMB_FIND_FILE_FULL_DIRECTORY_INFO) { |
571 | FILE_FULL_DIRECTORY_INFO * pFindData = | 569 | FILE_FULL_DIRECTORY_INFO *pFindData = |
572 | (FILE_FULL_DIRECTORY_INFO *)current_entry; | 570 | (FILE_FULL_DIRECTORY_INFO *)current_entry; |
573 | filename = &pFindData->FileName[0]; | 571 | filename = &pFindData->FileName[0]; |
574 | len = le32_to_cpu(pFindData->FileNameLength); | 572 | len = le32_to_cpu(pFindData->FileNameLength); |
575 | } else if (cfile->srch_inf.info_level == | 573 | } else if (cfile->srch_inf.info_level == |
576 | SMB_FIND_FILE_ID_FULL_DIR_INFO) { | 574 | SMB_FIND_FILE_ID_FULL_DIR_INFO) { |
577 | SEARCH_ID_FULL_DIR_INFO * pFindData = | 575 | SEARCH_ID_FULL_DIR_INFO *pFindData = |
578 | (SEARCH_ID_FULL_DIR_INFO *)current_entry; | 576 | (SEARCH_ID_FULL_DIR_INFO *)current_entry; |
579 | filename = &pFindData->FileName[0]; | 577 | filename = &pFindData->FileName[0]; |
580 | len = le32_to_cpu(pFindData->FileNameLength); | 578 | len = le32_to_cpu(pFindData->FileNameLength); |
581 | } else if (cfile->srch_inf.info_level == | 579 | } else if (cfile->srch_inf.info_level == |
582 | SMB_FIND_FILE_BOTH_DIRECTORY_INFO) { | 580 | SMB_FIND_FILE_BOTH_DIRECTORY_INFO) { |
583 | FILE_BOTH_DIRECTORY_INFO * pFindData = | 581 | FILE_BOTH_DIRECTORY_INFO *pFindData = |
584 | (FILE_BOTH_DIRECTORY_INFO *)current_entry; | 582 | (FILE_BOTH_DIRECTORY_INFO *)current_entry; |
585 | filename = &pFindData->FileName[0]; | 583 | filename = &pFindData->FileName[0]; |
586 | len = le32_to_cpu(pFindData->FileNameLength); | 584 | len = le32_to_cpu(pFindData->FileNameLength); |
587 | } else if (cfile->srch_inf.info_level == SMB_FIND_FILE_INFO_STANDARD) { | 585 | } else if (cfile->srch_inf.info_level == SMB_FIND_FILE_INFO_STANDARD) { |
588 | FIND_FILE_STANDARD_INFO * pFindData = | 586 | FIND_FILE_STANDARD_INFO *pFindData = |
589 | (FIND_FILE_STANDARD_INFO *)current_entry; | 587 | (FIND_FILE_STANDARD_INFO *)current_entry; |
590 | filename = &pFindData->FileName[0]; | 588 | filename = &pFindData->FileName[0]; |
591 | len = pFindData->FileNameLength; | 589 | len = pFindData->FileNameLength; |
@@ -666,9 +664,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
666 | . and .. for the root of a drive and for those we need | 664 | . and .. for the root of a drive and for those we need |
667 | to start two entries earlier */ | 665 | to start two entries earlier */ |
668 | 666 | ||
669 | #ifdef CONFIG_CIFS_DEBUG2 | ||
670 | dump_cifs_file_struct(file, "In fce "); | 667 | dump_cifs_file_struct(file, "In fce "); |
671 | #endif | ||
672 | if (((index_to_find < cifsFile->srch_inf.index_of_last_entry) && | 668 | if (((index_to_find < cifsFile->srch_inf.index_of_last_entry) && |
673 | is_dir_changed(file)) || | 669 | is_dir_changed(file)) || |
674 | (index_to_find < first_entry_in_buffer)) { | 670 | (index_to_find < first_entry_in_buffer)) { |
@@ -718,7 +714,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
718 | pos_in_buf = index_to_find - first_entry_in_buffer; | 714 | pos_in_buf = index_to_find - first_entry_in_buffer; |
719 | cFYI(1, ("found entry - pos_in_buf %d", pos_in_buf)); | 715 | cFYI(1, ("found entry - pos_in_buf %d", pos_in_buf)); |
720 | 716 | ||
721 | for (i=0; (i < (pos_in_buf)) && (current_entry != NULL); i++) { | 717 | for (i = 0; (i < (pos_in_buf)) && (current_entry != NULL); i++) { |
722 | /* go entry by entry figuring out which is first */ | 718 | /* go entry by entry figuring out which is first */ |
723 | current_entry = nxt_dir_entry(current_entry, end_of_smb, | 719 | current_entry = nxt_dir_entry(current_entry, end_of_smb, |
724 | cifsFile->srch_inf.info_level); | 720 | cifsFile->srch_inf.info_level); |
@@ -793,7 +789,7 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst, | |||
793 | filename = &pFindData->FileName[0]; | 789 | filename = &pFindData->FileName[0]; |
794 | len = le32_to_cpu(pFindData->FileNameLength); | 790 | len = le32_to_cpu(pFindData->FileNameLength); |
795 | } else if (level == SMB_FIND_FILE_INFO_STANDARD) { | 791 | } else if (level == SMB_FIND_FILE_INFO_STANDARD) { |
796 | FIND_FILE_STANDARD_INFO * pFindData = | 792 | FIND_FILE_STANDARD_INFO *pFindData = |
797 | (FIND_FILE_STANDARD_INFO *)current_entry; | 793 | (FIND_FILE_STANDARD_INFO *)current_entry; |
798 | filename = &pFindData->FileName[0]; | 794 | filename = &pFindData->FileName[0]; |
799 | /* one byte length, no name conversion */ | 795 | /* one byte length, no name conversion */ |
@@ -928,7 +924,7 @@ static int cifs_save_resume_key(const char *current_entry, | |||
928 | level = cifsFile->srch_inf.info_level; | 924 | level = cifsFile->srch_inf.info_level; |
929 | 925 | ||
930 | if (level == SMB_FIND_FILE_UNIX) { | 926 | if (level == SMB_FIND_FILE_UNIX) { |
931 | FILE_UNIX_INFO * pFindData = (FILE_UNIX_INFO *)current_entry; | 927 | FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry; |
932 | 928 | ||
933 | filename = &pFindData->FileName[0]; | 929 | filename = &pFindData->FileName[0]; |
934 | if (cifsFile->srch_inf.unicode) { | 930 | if (cifsFile->srch_inf.unicode) { |
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index d2153abcba6d..ed150efbe27c 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
@@ -417,10 +417,6 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time, | |||
417 | 417 | ||
418 | calc_lanman_hash(ses, lnm_session_key); | 418 | calc_lanman_hash(ses, lnm_session_key); |
419 | ses->flags |= CIFS_SES_LANMAN; | 419 | ses->flags |= CIFS_SES_LANMAN; |
420 | /* #ifdef CONFIG_CIFS_DEBUG2 | ||
421 | cifs_dump_mem("cryptkey: ",ses->server->cryptKey, | ||
422 | CIFS_SESS_KEY_SIZE); | ||
423 | #endif */ | ||
424 | memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_SESS_KEY_SIZE); | 420 | memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_SESS_KEY_SIZE); |
425 | bcc_ptr += CIFS_SESS_KEY_SIZE; | 421 | bcc_ptr += CIFS_SESS_KEY_SIZE; |
426 | 422 | ||
diff --git a/fs/cifs/smbdes.c b/fs/cifs/smbdes.c index cfa6d21fb4e8..04943c976f98 100644 --- a/fs/cifs/smbdes.c +++ b/fs/cifs/smbdes.c | |||
@@ -114,42 +114,42 @@ static uchar sbox[8][4][16] = { | |||
114 | {{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7}, | 114 | {{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7}, |
115 | {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8}, | 115 | {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8}, |
116 | {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0}, | 116 | {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0}, |
117 | {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}}, | 117 | {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13} }, |
118 | 118 | ||
119 | {{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10}, | 119 | {{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10}, |
120 | {3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5}, | 120 | {3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5}, |
121 | {0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15}, | 121 | {0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15}, |
122 | {13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}}, | 122 | {13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9} }, |
123 | 123 | ||
124 | {{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8}, | 124 | {{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8}, |
125 | {13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1}, | 125 | {13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1}, |
126 | {13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7}, | 126 | {13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7}, |
127 | {1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}}, | 127 | {1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12} }, |
128 | 128 | ||
129 | {{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15}, | 129 | {{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15}, |
130 | {13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9}, | 130 | {13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9}, |
131 | {10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4}, | 131 | {10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4}, |
132 | {3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}}, | 132 | {3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14} }, |
133 | 133 | ||
134 | {{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9}, | 134 | {{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9}, |
135 | {14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6}, | 135 | {14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6}, |
136 | {4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14}, | 136 | {4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14}, |
137 | {11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}}, | 137 | {11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3} }, |
138 | 138 | ||
139 | {{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11}, | 139 | {{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11}, |
140 | {10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8}, | 140 | {10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8}, |
141 | {9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6}, | 141 | {9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6}, |
142 | {4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}}, | 142 | {4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13} }, |
143 | 143 | ||
144 | {{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1}, | 144 | {{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1}, |
145 | {13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6}, | 145 | {13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6}, |
146 | {1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2}, | 146 | {1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2}, |
147 | {6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}}, | 147 | {6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12} }, |
148 | 148 | ||
149 | {{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7}, | 149 | {{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7}, |
150 | {1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2}, | 150 | {1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2}, |
151 | {7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8}, | 151 | {7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8}, |
152 | {2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}} | 152 | {2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11} } |
153 | }; | 153 | }; |
154 | 154 | ||
155 | static void | 155 | static void |
@@ -313,9 +313,8 @@ str_to_key(unsigned char *str, unsigned char *key) | |||
313 | key[5] = ((str[4] & 0x1F) << 2) | (str[5] >> 6); | 313 | key[5] = ((str[4] & 0x1F) << 2) | (str[5] >> 6); |
314 | key[6] = ((str[5] & 0x3F) << 1) | (str[6] >> 7); | 314 | key[6] = ((str[5] & 0x3F) << 1) | (str[6] >> 7); |
315 | key[7] = str[6] & 0x7F; | 315 | key[7] = str[6] & 0x7F; |
316 | for (i = 0; i < 8; i++) { | 316 | for (i = 0; i < 8; i++) |
317 | key[i] = (key[i] << 1); | 317 | key[i] = (key[i] << 1); |
318 | } | ||
319 | } | 318 | } |
320 | 319 | ||
321 | static void | 320 | static void |
@@ -344,9 +343,8 @@ smbhash(unsigned char *out, unsigned char *in, unsigned char *key, int forw) | |||
344 | 343 | ||
345 | dohash(outb, inb, keyb, forw); | 344 | dohash(outb, inb, keyb, forw); |
346 | 345 | ||
347 | for (i = 0; i < 8; i++) { | 346 | for (i = 0; i < 8; i++) |
348 | out[i] = 0; | 347 | out[i] = 0; |
349 | } | ||
350 | 348 | ||
351 | for (i = 0; i < 64; i++) { | 349 | for (i = 0; i < 64; i++) { |
352 | if (outb[i]) | 350 | if (outb[i]) |
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 50b623ad9320..3612d6c0a0bb 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * fs/cifs/transport.c | 2 | * fs/cifs/transport.c |
3 | * | 3 | * |
4 | * Copyright (C) International Business Machines Corp., 2002,2007 | 4 | * Copyright (C) International Business Machines Corp., 2002,2008 |
5 | * Author(s): Steve French (sfrench@us.ibm.com) | 5 | * Author(s): Steve French (sfrench@us.ibm.com) |
6 | * Jeremy Allison (jra@samba.org) 2006. | 6 | * Jeremy Allison (jra@samba.org) 2006. |
7 | * | 7 | * |
@@ -358,9 +358,9 @@ static int allocate_mid(struct cifsSesInfo *ses, struct smb_hdr *in_buf, | |||
358 | } else if (ses->status != CifsGood) { | 358 | } else if (ses->status != CifsGood) { |
359 | /* check if SMB session is bad because we are setting it up */ | 359 | /* check if SMB session is bad because we are setting it up */ |
360 | if ((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) && | 360 | if ((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) && |
361 | (in_buf->Command != SMB_COM_NEGOTIATE)) { | 361 | (in_buf->Command != SMB_COM_NEGOTIATE)) |
362 | return -EAGAIN; | 362 | return -EAGAIN; |
363 | } /* else ok - we are setting up session */ | 363 | /* else ok - we are setting up session */ |
364 | } | 364 | } |
365 | *ppmidQ = AllocMidQEntry(in_buf, ses); | 365 | *ppmidQ = AllocMidQEntry(in_buf, ses); |
366 | if (*ppmidQ == NULL) | 366 | if (*ppmidQ == NULL) |
@@ -437,9 +437,8 @@ SendReceiveNoRsp(const unsigned int xid, struct cifsSesInfo *ses, | |||
437 | iov[0].iov_len = in_buf->smb_buf_length + 4; | 437 | iov[0].iov_len = in_buf->smb_buf_length + 4; |
438 | flags |= CIFS_NO_RESP; | 438 | flags |= CIFS_NO_RESP; |
439 | rc = SendReceive2(xid, ses, iov, 1, &resp_buf_type, flags); | 439 | rc = SendReceive2(xid, ses, iov, 1, &resp_buf_type, flags); |
440 | #ifdef CONFIG_CIFS_DEBUG2 | 440 | cFYI(DBG2, ("SendRcvNoRsp flags %d rc %d", flags, rc)); |
441 | cFYI(1, ("SendRcvNoR flags %d rc %d", flags, rc)); | 441 | |
442 | #endif | ||
443 | return rc; | 442 | return rc; |
444 | } | 443 | } |
445 | 444 | ||
diff --git a/fs/cifs/xattr.c b/fs/cifs/xattr.c index 54e8ef96cb79..8cd6a445b017 100644 --- a/fs/cifs/xattr.c +++ b/fs/cifs/xattr.c | |||
@@ -139,9 +139,9 @@ int cifs_setxattr(struct dentry *direntry, const char *ea_name, | |||
139 | } else if (strncmp(ea_name, CIFS_XATTR_USER_PREFIX, 5) == 0) { | 139 | } else if (strncmp(ea_name, CIFS_XATTR_USER_PREFIX, 5) == 0) { |
140 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) | 140 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_XATTR) |
141 | goto set_ea_exit; | 141 | goto set_ea_exit; |
142 | if (strncmp(ea_name, CIFS_XATTR_DOS_ATTRIB, 14) == 0) { | 142 | if (strncmp(ea_name, CIFS_XATTR_DOS_ATTRIB, 14) == 0) |
143 | cFYI(1, ("attempt to set cifs inode metadata")); | 143 | cFYI(1, ("attempt to set cifs inode metadata")); |
144 | } | 144 | |
145 | ea_name += 5; /* skip past user. prefix */ | 145 | ea_name += 5; /* skip past user. prefix */ |
146 | rc = CIFSSMBSetEA(xid, pTcon, full_path, ea_name, ea_value, | 146 | rc = CIFSSMBSetEA(xid, pTcon, full_path, ea_name, ea_value, |
147 | (__u16)value_size, cifs_sb->local_nls, | 147 | (__u16)value_size, cifs_sb->local_nls, |
@@ -262,7 +262,7 @@ ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, | |||
262 | cifs_sb->mnt_cifs_flags & | 262 | cifs_sb->mnt_cifs_flags & |
263 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 263 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
264 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 264 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
265 | else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { | 265 | else if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { |
266 | __u16 fid; | 266 | __u16 fid; |
267 | int oplock = FALSE; | 267 | int oplock = FALSE; |
268 | struct cifs_ntsd *pacl = NULL; | 268 | struct cifs_ntsd *pacl = NULL; |
@@ -303,11 +303,10 @@ ssize_t cifs_getxattr(struct dentry *direntry, const char *ea_name, | |||
303 | } else if (strncmp(ea_name, | 303 | } else if (strncmp(ea_name, |
304 | CIFS_XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) == 0) { | 304 | CIFS_XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN) == 0) { |
305 | cFYI(1, ("Security xattr namespace not supported yet")); | 305 | cFYI(1, ("Security xattr namespace not supported yet")); |
306 | } else { | 306 | } else |
307 | cFYI(1, | 307 | cFYI(1, |
308 | ("illegal xattr request %s (only user namespace supported)", | 308 | ("illegal xattr request %s (only user namespace supported)", |
309 | ea_name)); | 309 | ea_name)); |
310 | } | ||
311 | 310 | ||
312 | /* We could add an additional check for streams ie | 311 | /* We could add an additional check for streams ie |
313 | if proc/fs/cifs/streamstoxattr is set then | 312 | if proc/fs/cifs/streamstoxattr is set then |
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index d26e2826ba5b..e9602d85c11d 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
@@ -29,10 +29,6 @@ | |||
29 | 29 | ||
30 | #define DEBUGFS_MAGIC 0x64626720 | 30 | #define DEBUGFS_MAGIC 0x64626720 |
31 | 31 | ||
32 | /* declared over in file.c */ | ||
33 | extern struct file_operations debugfs_file_operations; | ||
34 | extern struct inode_operations debugfs_link_operations; | ||
35 | |||
36 | static struct vfsmount *debugfs_mount; | 32 | static struct vfsmount *debugfs_mount; |
37 | static int debugfs_mount_count; | 33 | static int debugfs_mount_count; |
38 | 34 | ||
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index dc74b186145d..6df1debdccce 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c | |||
@@ -263,52 +263,102 @@ out: | |||
263 | return 0; | 263 | return 0; |
264 | } | 264 | } |
265 | 265 | ||
266 | /* This function must zero any hole we create */ | 266 | /** |
267 | * ecryptfs_prepare_write | ||
268 | * @file: The eCryptfs file | ||
269 | * @page: The eCryptfs page | ||
270 | * @from: The start byte from which we will write | ||
271 | * @to: The end byte to which we will write | ||
272 | * | ||
273 | * This function must zero any hole we create | ||
274 | * | ||
275 | * Returns zero on success; non-zero otherwise | ||
276 | */ | ||
267 | static int ecryptfs_prepare_write(struct file *file, struct page *page, | 277 | static int ecryptfs_prepare_write(struct file *file, struct page *page, |
268 | unsigned from, unsigned to) | 278 | unsigned from, unsigned to) |
269 | { | 279 | { |
270 | int rc = 0; | ||
271 | loff_t prev_page_end_size; | 280 | loff_t prev_page_end_size; |
281 | int rc = 0; | ||
272 | 282 | ||
273 | if (!PageUptodate(page)) { | 283 | if (!PageUptodate(page)) { |
274 | rc = ecryptfs_read_lower_page_segment(page, page->index, 0, | 284 | struct ecryptfs_crypt_stat *crypt_stat = |
275 | PAGE_CACHE_SIZE, | 285 | &ecryptfs_inode_to_private( |
276 | page->mapping->host); | 286 | file->f_path.dentry->d_inode)->crypt_stat; |
277 | if (rc) { | 287 | |
278 | printk(KERN_ERR "%s: Error attemping to read lower " | 288 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED) |
279 | "page segment; rc = [%d]\n", __FUNCTION__, rc); | 289 | || (crypt_stat->flags & ECRYPTFS_NEW_FILE)) { |
280 | ClearPageUptodate(page); | 290 | rc = ecryptfs_read_lower_page_segment( |
281 | goto out; | 291 | page, page->index, 0, PAGE_CACHE_SIZE, |
282 | } else | 292 | page->mapping->host); |
293 | if (rc) { | ||
294 | printk(KERN_ERR "%s: Error attemping to read " | ||
295 | "lower page segment; rc = [%d]\n", | ||
296 | __FUNCTION__, rc); | ||
297 | ClearPageUptodate(page); | ||
298 | goto out; | ||
299 | } else | ||
300 | SetPageUptodate(page); | ||
301 | } else if (crypt_stat->flags & ECRYPTFS_VIEW_AS_ENCRYPTED) { | ||
302 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) { | ||
303 | rc = ecryptfs_copy_up_encrypted_with_header( | ||
304 | page, crypt_stat); | ||
305 | if (rc) { | ||
306 | printk(KERN_ERR "%s: Error attempting " | ||
307 | "to copy the encrypted content " | ||
308 | "from the lower file whilst " | ||
309 | "inserting the metadata from " | ||
310 | "the xattr into the header; rc " | ||
311 | "= [%d]\n", __FUNCTION__, rc); | ||
312 | ClearPageUptodate(page); | ||
313 | goto out; | ||
314 | } | ||
315 | SetPageUptodate(page); | ||
316 | } else { | ||
317 | rc = ecryptfs_read_lower_page_segment( | ||
318 | page, page->index, 0, PAGE_CACHE_SIZE, | ||
319 | page->mapping->host); | ||
320 | if (rc) { | ||
321 | printk(KERN_ERR "%s: Error reading " | ||
322 | "page; rc = [%d]\n", | ||
323 | __FUNCTION__, rc); | ||
324 | ClearPageUptodate(page); | ||
325 | goto out; | ||
326 | } | ||
327 | SetPageUptodate(page); | ||
328 | } | ||
329 | } else { | ||
330 | rc = ecryptfs_decrypt_page(page); | ||
331 | if (rc) { | ||
332 | printk(KERN_ERR "%s: Error decrypting page " | ||
333 | "at index [%ld]; rc = [%d]\n", | ||
334 | __FUNCTION__, page->index, rc); | ||
335 | ClearPageUptodate(page); | ||
336 | goto out; | ||
337 | } | ||
283 | SetPageUptodate(page); | 338 | SetPageUptodate(page); |
339 | } | ||
284 | } | 340 | } |
285 | |||
286 | prev_page_end_size = ((loff_t)page->index << PAGE_CACHE_SHIFT); | 341 | prev_page_end_size = ((loff_t)page->index << PAGE_CACHE_SHIFT); |
287 | 342 | /* If creating a page or more of holes, zero them out via truncate. | |
288 | /* | 343 | * Note, this will increase i_size. */ |
289 | * If creating a page or more of holes, zero them out via truncate. | ||
290 | * Note, this will increase i_size. | ||
291 | */ | ||
292 | if (page->index != 0) { | 344 | if (page->index != 0) { |
293 | if (prev_page_end_size > i_size_read(page->mapping->host)) { | 345 | if (prev_page_end_size > i_size_read(page->mapping->host)) { |
294 | rc = ecryptfs_truncate(file->f_path.dentry, | 346 | rc = ecryptfs_truncate(file->f_path.dentry, |
295 | prev_page_end_size); | 347 | prev_page_end_size); |
296 | if (rc) { | 348 | if (rc) { |
297 | printk(KERN_ERR "Error on attempt to " | 349 | printk(KERN_ERR "%s: Error on attempt to " |
298 | "truncate to (higher) offset [%lld];" | 350 | "truncate to (higher) offset [%lld];" |
299 | " rc = [%d]\n", prev_page_end_size, rc); | 351 | " rc = [%d]\n", __FUNCTION__, |
352 | prev_page_end_size, rc); | ||
300 | goto out; | 353 | goto out; |
301 | } | 354 | } |
302 | } | 355 | } |
303 | } | 356 | } |
304 | /* | 357 | /* Writing to a new page, and creating a small hole from start |
305 | * Writing to a new page, and creating a small hole from start of page? | 358 | * of page? Zero it out. */ |
306 | * Zero it out. | 359 | if ((i_size_read(page->mapping->host) == prev_page_end_size) |
307 | */ | 360 | && (from != 0)) |
308 | if ((i_size_read(page->mapping->host) == prev_page_end_size) && | ||
309 | (from != 0)) { | ||
310 | zero_user(page, 0, PAGE_CACHE_SIZE); | 361 | zero_user(page, 0, PAGE_CACHE_SIZE); |
311 | } | ||
312 | out: | 362 | out: |
313 | return rc; | 363 | return rc; |
314 | } | 364 | } |
@@ -173,8 +173,15 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, | |||
173 | return NULL; | 173 | return NULL; |
174 | 174 | ||
175 | if (write) { | 175 | if (write) { |
176 | struct rlimit *rlim = current->signal->rlim; | ||
177 | unsigned long size = bprm->vma->vm_end - bprm->vma->vm_start; | 176 | unsigned long size = bprm->vma->vm_end - bprm->vma->vm_start; |
177 | struct rlimit *rlim; | ||
178 | |||
179 | /* | ||
180 | * We've historically supported up to 32 pages (ARG_MAX) | ||
181 | * of argument strings even with small stacks | ||
182 | */ | ||
183 | if (size <= ARG_MAX) | ||
184 | return page; | ||
178 | 185 | ||
179 | /* | 186 | /* |
180 | * Limit to 1/4-th the stack size for the argv+env strings. | 187 | * Limit to 1/4-th the stack size for the argv+env strings. |
@@ -183,6 +190,7 @@ static struct page *get_arg_page(struct linux_binprm *bprm, unsigned long pos, | |||
183 | * - the program will have a reasonable amount of stack left | 190 | * - the program will have a reasonable amount of stack left |
184 | * to work from. | 191 | * to work from. |
185 | */ | 192 | */ |
193 | rlim = current->signal->rlim; | ||
186 | if (size > rlim[RLIMIT_STACK].rlim_cur / 4) { | 194 | if (size > rlim[RLIMIT_STACK].rlim_cur / 4) { |
187 | put_page(page); | 195 | put_page(page); |
188 | return NULL; | 196 | return NULL; |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 18769cc32377..ad5360664082 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -806,8 +806,8 @@ static match_table_t tokens = { | |||
806 | {Opt_quota, "quota"}, | 806 | {Opt_quota, "quota"}, |
807 | {Opt_usrquota, "usrquota"}, | 807 | {Opt_usrquota, "usrquota"}, |
808 | {Opt_barrier, "barrier=%u"}, | 808 | {Opt_barrier, "barrier=%u"}, |
809 | {Opt_err, NULL}, | ||
810 | {Opt_resize, "resize"}, | 809 | {Opt_resize, "resize"}, |
810 | {Opt_err, NULL}, | ||
811 | }; | 811 | }; |
812 | 812 | ||
813 | static ext3_fsblk_t get_sb_block(void **data) | 813 | static ext3_fsblk_t get_sb_block(void **data) |
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index 33888bb58144..2c23bade9aa6 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c | |||
@@ -46,7 +46,7 @@ const struct file_operations ext4_dir_operations = { | |||
46 | #ifdef CONFIG_COMPAT | 46 | #ifdef CONFIG_COMPAT |
47 | .compat_ioctl = ext4_compat_ioctl, | 47 | .compat_ioctl = ext4_compat_ioctl, |
48 | #endif | 48 | #endif |
49 | .fsync = ext4_sync_file, /* BKL held */ | 49 | .fsync = ext4_sync_file, |
50 | .release = ext4_release_dir, | 50 | .release = ext4_release_dir, |
51 | }; | 51 | }; |
52 | 52 | ||
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index bc7081f1fbe8..9ae6e67090cd 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -148,6 +148,7 @@ static ext4_fsblk_t ext4_ext_find_goal(struct inode *inode, | |||
148 | { | 148 | { |
149 | struct ext4_inode_info *ei = EXT4_I(inode); | 149 | struct ext4_inode_info *ei = EXT4_I(inode); |
150 | ext4_fsblk_t bg_start; | 150 | ext4_fsblk_t bg_start; |
151 | ext4_fsblk_t last_block; | ||
151 | ext4_grpblk_t colour; | 152 | ext4_grpblk_t colour; |
152 | int depth; | 153 | int depth; |
153 | 154 | ||
@@ -169,8 +170,13 @@ static ext4_fsblk_t ext4_ext_find_goal(struct inode *inode, | |||
169 | /* OK. use inode's group */ | 170 | /* OK. use inode's group */ |
170 | bg_start = (ei->i_block_group * EXT4_BLOCKS_PER_GROUP(inode->i_sb)) + | 171 | bg_start = (ei->i_block_group * EXT4_BLOCKS_PER_GROUP(inode->i_sb)) + |
171 | le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_first_data_block); | 172 | le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_first_data_block); |
172 | colour = (current->pid % 16) * | 173 | last_block = ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es) - 1; |
174 | |||
175 | if (bg_start + EXT4_BLOCKS_PER_GROUP(inode->i_sb) <= last_block) | ||
176 | colour = (current->pid % 16) * | ||
173 | (EXT4_BLOCKS_PER_GROUP(inode->i_sb) / 16); | 177 | (EXT4_BLOCKS_PER_GROUP(inode->i_sb) / 16); |
178 | else | ||
179 | colour = (current->pid % 16) * ((last_block - bg_start) / 16); | ||
174 | return bg_start + colour + block; | 180 | return bg_start + colour + block; |
175 | } | 181 | } |
176 | 182 | ||
@@ -349,7 +355,7 @@ static void ext4_ext_show_leaf(struct inode *inode, struct ext4_ext_path *path) | |||
349 | #define ext4_ext_show_leaf(inode,path) | 355 | #define ext4_ext_show_leaf(inode,path) |
350 | #endif | 356 | #endif |
351 | 357 | ||
352 | static void ext4_ext_drop_refs(struct ext4_ext_path *path) | 358 | void ext4_ext_drop_refs(struct ext4_ext_path *path) |
353 | { | 359 | { |
354 | int depth = path->p_depth; | 360 | int depth = path->p_depth; |
355 | int i; | 361 | int i; |
@@ -2168,6 +2174,10 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
2168 | newblock = iblock - ee_block + ext_pblock(ex); | 2174 | newblock = iblock - ee_block + ext_pblock(ex); |
2169 | ex2 = ex; | 2175 | ex2 = ex; |
2170 | 2176 | ||
2177 | err = ext4_ext_get_access(handle, inode, path + depth); | ||
2178 | if (err) | ||
2179 | goto out; | ||
2180 | |||
2171 | /* ex1: ee_block to iblock - 1 : uninitialized */ | 2181 | /* ex1: ee_block to iblock - 1 : uninitialized */ |
2172 | if (iblock > ee_block) { | 2182 | if (iblock > ee_block) { |
2173 | ex1 = ex; | 2183 | ex1 = ex; |
@@ -2200,16 +2210,20 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
2200 | newdepth = ext_depth(inode); | 2210 | newdepth = ext_depth(inode); |
2201 | if (newdepth != depth) { | 2211 | if (newdepth != depth) { |
2202 | depth = newdepth; | 2212 | depth = newdepth; |
2203 | path = ext4_ext_find_extent(inode, iblock, NULL); | 2213 | ext4_ext_drop_refs(path); |
2214 | path = ext4_ext_find_extent(inode, iblock, path); | ||
2204 | if (IS_ERR(path)) { | 2215 | if (IS_ERR(path)) { |
2205 | err = PTR_ERR(path); | 2216 | err = PTR_ERR(path); |
2206 | path = NULL; | ||
2207 | goto out; | 2217 | goto out; |
2208 | } | 2218 | } |
2209 | eh = path[depth].p_hdr; | 2219 | eh = path[depth].p_hdr; |
2210 | ex = path[depth].p_ext; | 2220 | ex = path[depth].p_ext; |
2211 | if (ex2 != &newex) | 2221 | if (ex2 != &newex) |
2212 | ex2 = ex; | 2222 | ex2 = ex; |
2223 | |||
2224 | err = ext4_ext_get_access(handle, inode, path + depth); | ||
2225 | if (err) | ||
2226 | goto out; | ||
2213 | } | 2227 | } |
2214 | allocated = max_blocks; | 2228 | allocated = max_blocks; |
2215 | } | 2229 | } |
@@ -2230,9 +2244,6 @@ static int ext4_ext_convert_to_initialized(handle_t *handle, | |||
2230 | ex2->ee_len = cpu_to_le16(allocated); | 2244 | ex2->ee_len = cpu_to_le16(allocated); |
2231 | if (ex2 != ex) | 2245 | if (ex2 != ex) |
2232 | goto insert; | 2246 | goto insert; |
2233 | err = ext4_ext_get_access(handle, inode, path + depth); | ||
2234 | if (err) | ||
2235 | goto out; | ||
2236 | /* | 2247 | /* |
2237 | * New (initialized) extent starts from the first block | 2248 | * New (initialized) extent starts from the first block |
2238 | * in the current extent. i.e., ex2 == ex | 2249 | * in the current extent. i.e., ex2 == ex |
@@ -2276,9 +2287,22 @@ out: | |||
2276 | } | 2287 | } |
2277 | 2288 | ||
2278 | /* | 2289 | /* |
2290 | * Block allocation/map/preallocation routine for extents based files | ||
2291 | * | ||
2292 | * | ||
2279 | * Need to be called with | 2293 | * Need to be called with |
2280 | * down_read(&EXT4_I(inode)->i_data_sem) if not allocating file system block | 2294 | * down_read(&EXT4_I(inode)->i_data_sem) if not allocating file system block |
2281 | * (ie, create is zero). Otherwise down_write(&EXT4_I(inode)->i_data_sem) | 2295 | * (ie, create is zero). Otherwise down_write(&EXT4_I(inode)->i_data_sem) |
2296 | * | ||
2297 | * return > 0, number of of blocks already mapped/allocated | ||
2298 | * if create == 0 and these are pre-allocated blocks | ||
2299 | * buffer head is unmapped | ||
2300 | * otherwise blocks are mapped | ||
2301 | * | ||
2302 | * return = 0, if plain look up failed (blocks have not been allocated) | ||
2303 | * buffer head is unmapped | ||
2304 | * | ||
2305 | * return < 0, error case. | ||
2282 | */ | 2306 | */ |
2283 | int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | 2307 | int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, |
2284 | ext4_lblk_t iblock, | 2308 | ext4_lblk_t iblock, |
@@ -2623,7 +2647,7 @@ long ext4_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len) | |||
2623 | * modify 1 super block, 1 block bitmap and 1 group descriptor. | 2647 | * modify 1 super block, 1 block bitmap and 1 group descriptor. |
2624 | */ | 2648 | */ |
2625 | credits = EXT4_DATA_TRANS_BLOCKS(inode->i_sb) + 3; | 2649 | credits = EXT4_DATA_TRANS_BLOCKS(inode->i_sb) + 3; |
2626 | down_write((&EXT4_I(inode)->i_data_sem)); | 2650 | mutex_lock(&inode->i_mutex); |
2627 | retry: | 2651 | retry: |
2628 | while (ret >= 0 && ret < max_blocks) { | 2652 | while (ret >= 0 && ret < max_blocks) { |
2629 | block = block + ret; | 2653 | block = block + ret; |
@@ -2634,16 +2658,17 @@ retry: | |||
2634 | break; | 2658 | break; |
2635 | } | 2659 | } |
2636 | 2660 | ||
2637 | ret = ext4_ext_get_blocks(handle, inode, block, | 2661 | ret = ext4_get_blocks_wrap(handle, inode, block, |
2638 | max_blocks, &map_bh, | 2662 | max_blocks, &map_bh, |
2639 | EXT4_CREATE_UNINITIALIZED_EXT, 0); | 2663 | EXT4_CREATE_UNINITIALIZED_EXT, 0); |
2640 | WARN_ON(ret <= 0); | ||
2641 | if (ret <= 0) { | 2664 | if (ret <= 0) { |
2642 | ext4_error(inode->i_sb, "ext4_fallocate", | 2665 | #ifdef EXT4FS_DEBUG |
2643 | "ext4_ext_get_blocks returned error: " | 2666 | WARN_ON(ret <= 0); |
2644 | "inode#%lu, block=%u, max_blocks=%lu", | 2667 | printk(KERN_ERR "%s: ext4_ext_get_blocks " |
2668 | "returned error inode#%lu, block=%u, " | ||
2669 | "max_blocks=%lu", __func__, | ||
2645 | inode->i_ino, block, max_blocks); | 2670 | inode->i_ino, block, max_blocks); |
2646 | ret = -EIO; | 2671 | #endif |
2647 | ext4_mark_inode_dirty(handle, inode); | 2672 | ext4_mark_inode_dirty(handle, inode); |
2648 | ret2 = ext4_journal_stop(handle); | 2673 | ret2 = ext4_journal_stop(handle); |
2649 | break; | 2674 | break; |
@@ -2680,7 +2705,6 @@ retry: | |||
2680 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) | 2705 | if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) |
2681 | goto retry; | 2706 | goto retry; |
2682 | 2707 | ||
2683 | up_write((&EXT4_I(inode)->i_data_sem)); | ||
2684 | /* | 2708 | /* |
2685 | * Time to update the file size. | 2709 | * Time to update the file size. |
2686 | * Update only when preallocation was requested beyond the file size. | 2710 | * Update only when preallocation was requested beyond the file size. |
@@ -2692,21 +2716,18 @@ retry: | |||
2692 | * if no error, we assume preallocation succeeded | 2716 | * if no error, we assume preallocation succeeded |
2693 | * completely | 2717 | * completely |
2694 | */ | 2718 | */ |
2695 | mutex_lock(&inode->i_mutex); | ||
2696 | i_size_write(inode, offset + len); | 2719 | i_size_write(inode, offset + len); |
2697 | EXT4_I(inode)->i_disksize = i_size_read(inode); | 2720 | EXT4_I(inode)->i_disksize = i_size_read(inode); |
2698 | mutex_unlock(&inode->i_mutex); | ||
2699 | } else if (ret < 0 && nblocks) { | 2721 | } else if (ret < 0 && nblocks) { |
2700 | /* Handle partial allocation scenario */ | 2722 | /* Handle partial allocation scenario */ |
2701 | loff_t newsize; | 2723 | loff_t newsize; |
2702 | 2724 | ||
2703 | mutex_lock(&inode->i_mutex); | ||
2704 | newsize = (nblocks << blkbits) + i_size_read(inode); | 2725 | newsize = (nblocks << blkbits) + i_size_read(inode); |
2705 | i_size_write(inode, EXT4_BLOCK_ALIGN(newsize, blkbits)); | 2726 | i_size_write(inode, EXT4_BLOCK_ALIGN(newsize, blkbits)); |
2706 | EXT4_I(inode)->i_disksize = i_size_read(inode); | 2727 | EXT4_I(inode)->i_disksize = i_size_read(inode); |
2707 | mutex_unlock(&inode->i_mutex); | ||
2708 | } | 2728 | } |
2709 | } | 2729 | } |
2710 | 2730 | ||
2731 | mutex_unlock(&inode->i_mutex); | ||
2711 | return ret > 0 ? ret2 : ret; | 2732 | return ret > 0 ? ret2 : ret; |
2712 | } | 2733 | } |
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index da18a74b966a..8036b9b5376b 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
@@ -702,7 +702,12 @@ got: | |||
702 | ei->i_dir_start_lookup = 0; | 702 | ei->i_dir_start_lookup = 0; |
703 | ei->i_disksize = 0; | 703 | ei->i_disksize = 0; |
704 | 704 | ||
705 | ei->i_flags = EXT4_I(dir)->i_flags & ~EXT4_INDEX_FL; | 705 | /* |
706 | * Don't inherit extent flag from directory. We set extent flag on | ||
707 | * newly created directory and file only if -o extent mount option is | ||
708 | * specified | ||
709 | */ | ||
710 | ei->i_flags = EXT4_I(dir)->i_flags & ~(EXT4_INDEX_FL|EXT4_EXTENTS_FL); | ||
706 | if (S_ISLNK(mode)) | 711 | if (S_ISLNK(mode)) |
707 | ei->i_flags &= ~(EXT4_IMMUTABLE_FL|EXT4_APPEND_FL); | 712 | ei->i_flags &= ~(EXT4_IMMUTABLE_FL|EXT4_APPEND_FL); |
708 | /* dirsync only applies to directories */ | 713 | /* dirsync only applies to directories */ |
@@ -745,12 +750,15 @@ got: | |||
745 | goto fail_free_drop; | 750 | goto fail_free_drop; |
746 | } | 751 | } |
747 | if (test_opt(sb, EXTENTS)) { | 752 | if (test_opt(sb, EXTENTS)) { |
748 | EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL; | 753 | /* set extent flag only for directory and file */ |
749 | ext4_ext_tree_init(handle, inode); | 754 | if (S_ISDIR(mode) || S_ISREG(mode)) { |
750 | err = ext4_update_incompat_feature(handle, sb, | 755 | EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL; |
751 | EXT4_FEATURE_INCOMPAT_EXTENTS); | 756 | ext4_ext_tree_init(handle, inode); |
752 | if (err) | 757 | err = ext4_update_incompat_feature(handle, sb, |
753 | goto fail; | 758 | EXT4_FEATURE_INCOMPAT_EXTENTS); |
759 | if (err) | ||
760 | goto fail; | ||
761 | } | ||
754 | } | 762 | } |
755 | 763 | ||
756 | ext4_debug("allocating inode %lu\n", inode->i_ino); | 764 | ext4_debug("allocating inode %lu\n", inode->i_ino); |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 7dd9b50d5ebc..945cbf6cb1fc 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -403,6 +403,7 @@ static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind) | |||
403 | __le32 *start = ind->bh ? (__le32*) ind->bh->b_data : ei->i_data; | 403 | __le32 *start = ind->bh ? (__le32*) ind->bh->b_data : ei->i_data; |
404 | __le32 *p; | 404 | __le32 *p; |
405 | ext4_fsblk_t bg_start; | 405 | ext4_fsblk_t bg_start; |
406 | ext4_fsblk_t last_block; | ||
406 | ext4_grpblk_t colour; | 407 | ext4_grpblk_t colour; |
407 | 408 | ||
408 | /* Try to find previous block */ | 409 | /* Try to find previous block */ |
@@ -420,8 +421,13 @@ static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind) | |||
420 | * into the same cylinder group then. | 421 | * into the same cylinder group then. |
421 | */ | 422 | */ |
422 | bg_start = ext4_group_first_block_no(inode->i_sb, ei->i_block_group); | 423 | bg_start = ext4_group_first_block_no(inode->i_sb, ei->i_block_group); |
423 | colour = (current->pid % 16) * | 424 | last_block = ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es) - 1; |
425 | |||
426 | if (bg_start + EXT4_BLOCKS_PER_GROUP(inode->i_sb) <= last_block) | ||
427 | colour = (current->pid % 16) * | ||
424 | (EXT4_BLOCKS_PER_GROUP(inode->i_sb) / 16); | 428 | (EXT4_BLOCKS_PER_GROUP(inode->i_sb) / 16); |
429 | else | ||
430 | colour = (current->pid % 16) * ((last_block - bg_start) / 16); | ||
425 | return bg_start + colour; | 431 | return bg_start + colour; |
426 | } | 432 | } |
427 | 433 | ||
@@ -768,7 +774,6 @@ err_out: | |||
768 | * | 774 | * |
769 | * `handle' can be NULL if create == 0. | 775 | * `handle' can be NULL if create == 0. |
770 | * | 776 | * |
771 | * The BKL may not be held on entry here. Be sure to take it early. | ||
772 | * return > 0, # of blocks mapped or allocated. | 777 | * return > 0, # of blocks mapped or allocated. |
773 | * return = 0, if plain lookup failed. | 778 | * return = 0, if plain lookup failed. |
774 | * return < 0, error case. | 779 | * return < 0, error case. |
@@ -903,11 +908,38 @@ out: | |||
903 | */ | 908 | */ |
904 | #define DIO_CREDITS 25 | 909 | #define DIO_CREDITS 25 |
905 | 910 | ||
911 | |||
912 | /* | ||
913 | * | ||
914 | * | ||
915 | * ext4_ext4 get_block() wrapper function | ||
916 | * It will do a look up first, and returns if the blocks already mapped. | ||
917 | * Otherwise it takes the write lock of the i_data_sem and allocate blocks | ||
918 | * and store the allocated blocks in the result buffer head and mark it | ||
919 | * mapped. | ||
920 | * | ||
921 | * If file type is extents based, it will call ext4_ext_get_blocks(), | ||
922 | * Otherwise, call with ext4_get_blocks_handle() to handle indirect mapping | ||
923 | * based files | ||
924 | * | ||
925 | * On success, it returns the number of blocks being mapped or allocate. | ||
926 | * if create==0 and the blocks are pre-allocated and uninitialized block, | ||
927 | * the result buffer head is unmapped. If the create ==1, it will make sure | ||
928 | * the buffer head is mapped. | ||
929 | * | ||
930 | * It returns 0 if plain look up failed (blocks have not been allocated), in | ||
931 | * that casem, buffer head is unmapped | ||
932 | * | ||
933 | * It returns the error in case of allocation failure. | ||
934 | */ | ||
906 | int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, | 935 | int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, |
907 | unsigned long max_blocks, struct buffer_head *bh, | 936 | unsigned long max_blocks, struct buffer_head *bh, |
908 | int create, int extend_disksize) | 937 | int create, int extend_disksize) |
909 | { | 938 | { |
910 | int retval; | 939 | int retval; |
940 | |||
941 | clear_buffer_mapped(bh); | ||
942 | |||
911 | /* | 943 | /* |
912 | * Try to see if we can get the block without requesting | 944 | * Try to see if we can get the block without requesting |
913 | * for new file system block. | 945 | * for new file system block. |
@@ -921,12 +953,26 @@ int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, | |||
921 | inode, block, max_blocks, bh, 0, 0); | 953 | inode, block, max_blocks, bh, 0, 0); |
922 | } | 954 | } |
923 | up_read((&EXT4_I(inode)->i_data_sem)); | 955 | up_read((&EXT4_I(inode)->i_data_sem)); |
924 | if (!create || (retval > 0)) | 956 | |
957 | /* If it is only a block(s) look up */ | ||
958 | if (!create) | ||
959 | return retval; | ||
960 | |||
961 | /* | ||
962 | * Returns if the blocks have already allocated | ||
963 | * | ||
964 | * Note that if blocks have been preallocated | ||
965 | * ext4_ext_get_block() returns th create = 0 | ||
966 | * with buffer head unmapped. | ||
967 | */ | ||
968 | if (retval > 0 && buffer_mapped(bh)) | ||
925 | return retval; | 969 | return retval; |
926 | 970 | ||
927 | /* | 971 | /* |
928 | * We need to allocate new blocks which will result | 972 | * New blocks allocate and/or writing to uninitialized extent |
929 | * in i_data update | 973 | * will possibly result in updating i_data, so we take |
974 | * the write lock of i_data_sem, and call get_blocks() | ||
975 | * with create == 1 flag. | ||
930 | */ | 976 | */ |
931 | down_write((&EXT4_I(inode)->i_data_sem)); | 977 | down_write((&EXT4_I(inode)->i_data_sem)); |
932 | /* | 978 | /* |
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index dd0fcfcb35ce..ef97f19c2f9d 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -627,21 +627,19 @@ static ext4_fsblk_t ext4_grp_offs_to_block(struct super_block *sb, | |||
627 | return block; | 627 | return block; |
628 | } | 628 | } |
629 | 629 | ||
630 | static inline void *mb_correct_addr_and_bit(int *bit, void *addr) | ||
631 | { | ||
630 | #if BITS_PER_LONG == 64 | 632 | #if BITS_PER_LONG == 64 |
631 | #define mb_correct_addr_and_bit(bit, addr) \ | 633 | *bit += ((unsigned long) addr & 7UL) << 3; |
632 | { \ | 634 | addr = (void *) ((unsigned long) addr & ~7UL); |
633 | bit += ((unsigned long) addr & 7UL) << 3; \ | ||
634 | addr = (void *) ((unsigned long) addr & ~7UL); \ | ||
635 | } | ||
636 | #elif BITS_PER_LONG == 32 | 635 | #elif BITS_PER_LONG == 32 |
637 | #define mb_correct_addr_and_bit(bit, addr) \ | 636 | *bit += ((unsigned long) addr & 3UL) << 3; |
638 | { \ | 637 | addr = (void *) ((unsigned long) addr & ~3UL); |
639 | bit += ((unsigned long) addr & 3UL) << 3; \ | ||
640 | addr = (void *) ((unsigned long) addr & ~3UL); \ | ||
641 | } | ||
642 | #else | 638 | #else |
643 | #error "how many bits you are?!" | 639 | #error "how many bits you are?!" |
644 | #endif | 640 | #endif |
641 | return addr; | ||
642 | } | ||
645 | 643 | ||
646 | static inline int mb_test_bit(int bit, void *addr) | 644 | static inline int mb_test_bit(int bit, void *addr) |
647 | { | 645 | { |
@@ -649,34 +647,54 @@ static inline int mb_test_bit(int bit, void *addr) | |||
649 | * ext4_test_bit on architecture like powerpc | 647 | * ext4_test_bit on architecture like powerpc |
650 | * needs unsigned long aligned address | 648 | * needs unsigned long aligned address |
651 | */ | 649 | */ |
652 | mb_correct_addr_and_bit(bit, addr); | 650 | addr = mb_correct_addr_and_bit(&bit, addr); |
653 | return ext4_test_bit(bit, addr); | 651 | return ext4_test_bit(bit, addr); |
654 | } | 652 | } |
655 | 653 | ||
656 | static inline void mb_set_bit(int bit, void *addr) | 654 | static inline void mb_set_bit(int bit, void *addr) |
657 | { | 655 | { |
658 | mb_correct_addr_and_bit(bit, addr); | 656 | addr = mb_correct_addr_and_bit(&bit, addr); |
659 | ext4_set_bit(bit, addr); | 657 | ext4_set_bit(bit, addr); |
660 | } | 658 | } |
661 | 659 | ||
662 | static inline void mb_set_bit_atomic(spinlock_t *lock, int bit, void *addr) | 660 | static inline void mb_set_bit_atomic(spinlock_t *lock, int bit, void *addr) |
663 | { | 661 | { |
664 | mb_correct_addr_and_bit(bit, addr); | 662 | addr = mb_correct_addr_and_bit(&bit, addr); |
665 | ext4_set_bit_atomic(lock, bit, addr); | 663 | ext4_set_bit_atomic(lock, bit, addr); |
666 | } | 664 | } |
667 | 665 | ||
668 | static inline void mb_clear_bit(int bit, void *addr) | 666 | static inline void mb_clear_bit(int bit, void *addr) |
669 | { | 667 | { |
670 | mb_correct_addr_and_bit(bit, addr); | 668 | addr = mb_correct_addr_and_bit(&bit, addr); |
671 | ext4_clear_bit(bit, addr); | 669 | ext4_clear_bit(bit, addr); |
672 | } | 670 | } |
673 | 671 | ||
674 | static inline void mb_clear_bit_atomic(spinlock_t *lock, int bit, void *addr) | 672 | static inline void mb_clear_bit_atomic(spinlock_t *lock, int bit, void *addr) |
675 | { | 673 | { |
676 | mb_correct_addr_and_bit(bit, addr); | 674 | addr = mb_correct_addr_and_bit(&bit, addr); |
677 | ext4_clear_bit_atomic(lock, bit, addr); | 675 | ext4_clear_bit_atomic(lock, bit, addr); |
678 | } | 676 | } |
679 | 677 | ||
678 | static inline int mb_find_next_zero_bit(void *addr, int max, int start) | ||
679 | { | ||
680 | int fix = 0; | ||
681 | addr = mb_correct_addr_and_bit(&fix, addr); | ||
682 | max += fix; | ||
683 | start += fix; | ||
684 | |||
685 | return ext4_find_next_zero_bit(addr, max, start) - fix; | ||
686 | } | ||
687 | |||
688 | static inline int mb_find_next_bit(void *addr, int max, int start) | ||
689 | { | ||
690 | int fix = 0; | ||
691 | addr = mb_correct_addr_and_bit(&fix, addr); | ||
692 | max += fix; | ||
693 | start += fix; | ||
694 | |||
695 | return ext4_find_next_bit(addr, max, start) - fix; | ||
696 | } | ||
697 | |||
680 | static void *mb_find_buddy(struct ext4_buddy *e4b, int order, int *max) | 698 | static void *mb_find_buddy(struct ext4_buddy *e4b, int order, int *max) |
681 | { | 699 | { |
682 | char *bb; | 700 | char *bb; |
@@ -906,7 +924,7 @@ static void ext4_mb_mark_free_simple(struct super_block *sb, | |||
906 | unsigned short chunk; | 924 | unsigned short chunk; |
907 | unsigned short border; | 925 | unsigned short border; |
908 | 926 | ||
909 | BUG_ON(len >= EXT4_BLOCKS_PER_GROUP(sb)); | 927 | BUG_ON(len > EXT4_BLOCKS_PER_GROUP(sb)); |
910 | 928 | ||
911 | border = 2 << sb->s_blocksize_bits; | 929 | border = 2 << sb->s_blocksize_bits; |
912 | 930 | ||
@@ -946,12 +964,12 @@ static void ext4_mb_generate_buddy(struct super_block *sb, | |||
946 | 964 | ||
947 | /* initialize buddy from bitmap which is aggregation | 965 | /* initialize buddy from bitmap which is aggregation |
948 | * of on-disk bitmap and preallocations */ | 966 | * of on-disk bitmap and preallocations */ |
949 | i = ext4_find_next_zero_bit(bitmap, max, 0); | 967 | i = mb_find_next_zero_bit(bitmap, max, 0); |
950 | grp->bb_first_free = i; | 968 | grp->bb_first_free = i; |
951 | while (i < max) { | 969 | while (i < max) { |
952 | fragments++; | 970 | fragments++; |
953 | first = i; | 971 | first = i; |
954 | i = ext4_find_next_bit(bitmap, max, i); | 972 | i = mb_find_next_bit(bitmap, max, i); |
955 | len = i - first; | 973 | len = i - first; |
956 | free += len; | 974 | free += len; |
957 | if (len > 1) | 975 | if (len > 1) |
@@ -959,7 +977,7 @@ static void ext4_mb_generate_buddy(struct super_block *sb, | |||
959 | else | 977 | else |
960 | grp->bb_counters[0]++; | 978 | grp->bb_counters[0]++; |
961 | if (i < max) | 979 | if (i < max) |
962 | i = ext4_find_next_zero_bit(bitmap, max, i); | 980 | i = mb_find_next_zero_bit(bitmap, max, i); |
963 | } | 981 | } |
964 | grp->bb_fragments = fragments; | 982 | grp->bb_fragments = fragments; |
965 | 983 | ||
@@ -967,6 +985,10 @@ static void ext4_mb_generate_buddy(struct super_block *sb, | |||
967 | ext4_error(sb, __FUNCTION__, | 985 | ext4_error(sb, __FUNCTION__, |
968 | "EXT4-fs: group %lu: %u blocks in bitmap, %u in gd\n", | 986 | "EXT4-fs: group %lu: %u blocks in bitmap, %u in gd\n", |
969 | group, free, grp->bb_free); | 987 | group, free, grp->bb_free); |
988 | /* | ||
989 | * If we intent to continue, we consider group descritor | ||
990 | * corrupt and update bb_free using bitmap value | ||
991 | */ | ||
970 | grp->bb_free = free; | 992 | grp->bb_free = free; |
971 | } | 993 | } |
972 | 994 | ||
@@ -1778,7 +1800,7 @@ static void ext4_mb_simple_scan_group(struct ext4_allocation_context *ac, | |||
1778 | buddy = mb_find_buddy(e4b, i, &max); | 1800 | buddy = mb_find_buddy(e4b, i, &max); |
1779 | BUG_ON(buddy == NULL); | 1801 | BUG_ON(buddy == NULL); |
1780 | 1802 | ||
1781 | k = ext4_find_next_zero_bit(buddy, max, 0); | 1803 | k = mb_find_next_zero_bit(buddy, max, 0); |
1782 | BUG_ON(k >= max); | 1804 | BUG_ON(k >= max); |
1783 | 1805 | ||
1784 | ac->ac_found++; | 1806 | ac->ac_found++; |
@@ -1818,11 +1840,11 @@ static void ext4_mb_complex_scan_group(struct ext4_allocation_context *ac, | |||
1818 | i = e4b->bd_info->bb_first_free; | 1840 | i = e4b->bd_info->bb_first_free; |
1819 | 1841 | ||
1820 | while (free && ac->ac_status == AC_STATUS_CONTINUE) { | 1842 | while (free && ac->ac_status == AC_STATUS_CONTINUE) { |
1821 | i = ext4_find_next_zero_bit(bitmap, | 1843 | i = mb_find_next_zero_bit(bitmap, |
1822 | EXT4_BLOCKS_PER_GROUP(sb), i); | 1844 | EXT4_BLOCKS_PER_GROUP(sb), i); |
1823 | if (i >= EXT4_BLOCKS_PER_GROUP(sb)) { | 1845 | if (i >= EXT4_BLOCKS_PER_GROUP(sb)) { |
1824 | /* | 1846 | /* |
1825 | * IF we corrupt the bitmap we won't find any | 1847 | * IF we have corrupt bitmap, we won't find any |
1826 | * free blocks even though group info says we | 1848 | * free blocks even though group info says we |
1827 | * we have free blocks | 1849 | * we have free blocks |
1828 | */ | 1850 | */ |
@@ -1838,6 +1860,12 @@ static void ext4_mb_complex_scan_group(struct ext4_allocation_context *ac, | |||
1838 | ext4_error(sb, __FUNCTION__, "%d free blocks as per " | 1860 | ext4_error(sb, __FUNCTION__, "%d free blocks as per " |
1839 | "group info. But got %d blocks\n", | 1861 | "group info. But got %d blocks\n", |
1840 | free, ex.fe_len); | 1862 | free, ex.fe_len); |
1863 | /* | ||
1864 | * The number of free blocks differs. This mostly | ||
1865 | * indicate that the bitmap is corrupt. So exit | ||
1866 | * without claiming the space. | ||
1867 | */ | ||
1868 | break; | ||
1841 | } | 1869 | } |
1842 | 1870 | ||
1843 | ext4_mb_measure_extent(ac, &ex, e4b); | 1871 | ext4_mb_measure_extent(ac, &ex, e4b); |
@@ -3740,10 +3768,10 @@ static int ext4_mb_release_inode_pa(struct ext4_buddy *e4b, | |||
3740 | } | 3768 | } |
3741 | 3769 | ||
3742 | while (bit < end) { | 3770 | while (bit < end) { |
3743 | bit = ext4_find_next_zero_bit(bitmap_bh->b_data, end, bit); | 3771 | bit = mb_find_next_zero_bit(bitmap_bh->b_data, end, bit); |
3744 | if (bit >= end) | 3772 | if (bit >= end) |
3745 | break; | 3773 | break; |
3746 | next = ext4_find_next_bit(bitmap_bh->b_data, end, bit); | 3774 | next = mb_find_next_bit(bitmap_bh->b_data, end, bit); |
3747 | if (next > end) | 3775 | if (next > end) |
3748 | next = end; | 3776 | next = end; |
3749 | start = group * EXT4_BLOCKS_PER_GROUP(sb) + bit + | 3777 | start = group * EXT4_BLOCKS_PER_GROUP(sb) + bit + |
@@ -3771,6 +3799,10 @@ static int ext4_mb_release_inode_pa(struct ext4_buddy *e4b, | |||
3771 | (unsigned long) pa->pa_len); | 3799 | (unsigned long) pa->pa_len); |
3772 | ext4_error(sb, __FUNCTION__, "free %u, pa_free %u\n", | 3800 | ext4_error(sb, __FUNCTION__, "free %u, pa_free %u\n", |
3773 | free, pa->pa_free); | 3801 | free, pa->pa_free); |
3802 | /* | ||
3803 | * pa is already deleted so we use the value obtained | ||
3804 | * from the bitmap and continue. | ||
3805 | */ | ||
3774 | } | 3806 | } |
3775 | atomic_add(free, &sbi->s_mb_discarded); | 3807 | atomic_add(free, &sbi->s_mb_discarded); |
3776 | if (ac) | 3808 | if (ac) |
diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c index 8c6c685b9d22..5c1e27de7755 100644 --- a/fs/ext4/migrate.c +++ b/fs/ext4/migrate.c | |||
@@ -43,6 +43,7 @@ static int finish_range(handle_t *handle, struct inode *inode, | |||
43 | 43 | ||
44 | if (IS_ERR(path)) { | 44 | if (IS_ERR(path)) { |
45 | retval = PTR_ERR(path); | 45 | retval = PTR_ERR(path); |
46 | path = NULL; | ||
46 | goto err_out; | 47 | goto err_out; |
47 | } | 48 | } |
48 | 49 | ||
@@ -74,6 +75,10 @@ static int finish_range(handle_t *handle, struct inode *inode, | |||
74 | } | 75 | } |
75 | retval = ext4_ext_insert_extent(handle, inode, path, &newext); | 76 | retval = ext4_ext_insert_extent(handle, inode, path, &newext); |
76 | err_out: | 77 | err_out: |
78 | if (path) { | ||
79 | ext4_ext_drop_refs(path); | ||
80 | kfree(path); | ||
81 | } | ||
77 | lb->first_pblock = 0; | 82 | lb->first_pblock = 0; |
78 | return retval; | 83 | return retval; |
79 | } | 84 | } |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index a9347fb43bcc..28aa2ed4297e 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -1804,12 +1804,8 @@ retry: | |||
1804 | inode->i_fop = &ext4_dir_operations; | 1804 | inode->i_fop = &ext4_dir_operations; |
1805 | inode->i_size = EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize; | 1805 | inode->i_size = EXT4_I(inode)->i_disksize = inode->i_sb->s_blocksize; |
1806 | dir_block = ext4_bread (handle, inode, 0, 1, &err); | 1806 | dir_block = ext4_bread (handle, inode, 0, 1, &err); |
1807 | if (!dir_block) { | 1807 | if (!dir_block) |
1808 | ext4_dec_count(handle, inode); /* is this nlink == 0? */ | 1808 | goto out_clear_inode; |
1809 | ext4_mark_inode_dirty(handle, inode); | ||
1810 | iput (inode); | ||
1811 | goto out_stop; | ||
1812 | } | ||
1813 | BUFFER_TRACE(dir_block, "get_write_access"); | 1809 | BUFFER_TRACE(dir_block, "get_write_access"); |
1814 | ext4_journal_get_write_access(handle, dir_block); | 1810 | ext4_journal_get_write_access(handle, dir_block); |
1815 | de = (struct ext4_dir_entry_2 *) dir_block->b_data; | 1811 | de = (struct ext4_dir_entry_2 *) dir_block->b_data; |
@@ -1832,7 +1828,8 @@ retry: | |||
1832 | ext4_mark_inode_dirty(handle, inode); | 1828 | ext4_mark_inode_dirty(handle, inode); |
1833 | err = ext4_add_entry (handle, dentry, inode); | 1829 | err = ext4_add_entry (handle, dentry, inode); |
1834 | if (err) { | 1830 | if (err) { |
1835 | inode->i_nlink = 0; | 1831 | out_clear_inode: |
1832 | clear_nlink(inode); | ||
1836 | ext4_mark_inode_dirty(handle, inode); | 1833 | ext4_mark_inode_dirty(handle, inode); |
1837 | iput (inode); | 1834 | iput (inode); |
1838 | goto out_stop; | 1835 | goto out_stop; |
@@ -2164,7 +2161,7 @@ static int ext4_unlink(struct inode * dir, struct dentry *dentry) | |||
2164 | dir->i_ctime = dir->i_mtime = ext4_current_time(dir); | 2161 | dir->i_ctime = dir->i_mtime = ext4_current_time(dir); |
2165 | ext4_update_dx_flag(dir); | 2162 | ext4_update_dx_flag(dir); |
2166 | ext4_mark_inode_dirty(handle, dir); | 2163 | ext4_mark_inode_dirty(handle, dir); |
2167 | ext4_dec_count(handle, inode); | 2164 | drop_nlink(inode); |
2168 | if (!inode->i_nlink) | 2165 | if (!inode->i_nlink) |
2169 | ext4_orphan_add(handle, inode); | 2166 | ext4_orphan_add(handle, inode); |
2170 | inode->i_ctime = ext4_current_time(inode); | 2167 | inode->i_ctime = ext4_current_time(inode); |
@@ -2214,7 +2211,7 @@ retry: | |||
2214 | err = __page_symlink(inode, symname, l, | 2211 | err = __page_symlink(inode, symname, l, |
2215 | mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS); | 2212 | mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS); |
2216 | if (err) { | 2213 | if (err) { |
2217 | ext4_dec_count(handle, inode); | 2214 | clear_nlink(inode); |
2218 | ext4_mark_inode_dirty(handle, inode); | 2215 | ext4_mark_inode_dirty(handle, inode); |
2219 | iput (inode); | 2216 | iput (inode); |
2220 | goto out_stop; | 2217 | goto out_stop; |
@@ -2223,7 +2220,6 @@ retry: | |||
2223 | inode->i_op = &ext4_fast_symlink_inode_operations; | 2220 | inode->i_op = &ext4_fast_symlink_inode_operations; |
2224 | memcpy((char*)&EXT4_I(inode)->i_data,symname,l); | 2221 | memcpy((char*)&EXT4_I(inode)->i_data,symname,l); |
2225 | inode->i_size = l-1; | 2222 | inode->i_size = l-1; |
2226 | EXT4_I(inode)->i_flags &= ~EXT4_EXTENTS_FL; | ||
2227 | } | 2223 | } |
2228 | EXT4_I(inode)->i_disksize = inode->i_size; | 2224 | EXT4_I(inode)->i_disksize = inode->i_size; |
2229 | err = ext4_add_nondir(handle, dentry, inode); | 2225 | err = ext4_add_nondir(handle, dentry, inode); |
@@ -2407,7 +2403,7 @@ static int ext4_rename (struct inode * old_dir, struct dentry *old_dentry, | |||
2407 | ext4_dec_count(handle, old_dir); | 2403 | ext4_dec_count(handle, old_dir); |
2408 | if (new_inode) { | 2404 | if (new_inode) { |
2409 | /* checked empty_dir above, can't have another parent, | 2405 | /* checked empty_dir above, can't have another parent, |
2410 | * ext3_dec_count() won't work for many-linked dirs */ | 2406 | * ext4_dec_count() won't work for many-linked dirs */ |
2411 | new_inode->i_nlink = 0; | 2407 | new_inode->i_nlink = 0; |
2412 | } else { | 2408 | } else { |
2413 | ext4_inc_count(handle, new_dir); | 2409 | ext4_inc_count(handle, new_dir); |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 9477a2bd6ff2..e29efa0f9d62 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -1037,6 +1037,7 @@ int ext4_group_extend(struct super_block *sb, struct ext4_super_block *es, | |||
1037 | ext4_warning(sb, __FUNCTION__, | 1037 | ext4_warning(sb, __FUNCTION__, |
1038 | "multiple resizers run on filesystem!"); | 1038 | "multiple resizers run on filesystem!"); |
1039 | unlock_super(sb); | 1039 | unlock_super(sb); |
1040 | ext4_journal_stop(handle); | ||
1040 | err = -EBUSY; | 1041 | err = -EBUSY; |
1041 | goto exit_put; | 1042 | goto exit_put; |
1042 | } | 1043 | } |
diff --git a/fs/hfs/brec.c b/fs/hfs/brec.c index 878bf25dbc6a..92fb358ce824 100644 --- a/fs/hfs/brec.c +++ b/fs/hfs/brec.c | |||
@@ -229,7 +229,7 @@ skip: | |||
229 | static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd) | 229 | static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd) |
230 | { | 230 | { |
231 | struct hfs_btree *tree; | 231 | struct hfs_btree *tree; |
232 | struct hfs_bnode *node, *new_node; | 232 | struct hfs_bnode *node, *new_node, *next_node; |
233 | struct hfs_bnode_desc node_desc; | 233 | struct hfs_bnode_desc node_desc; |
234 | int num_recs, new_rec_off, new_off, old_rec_off; | 234 | int num_recs, new_rec_off, new_off, old_rec_off; |
235 | int data_start, data_end, size; | 235 | int data_start, data_end, size; |
@@ -248,6 +248,17 @@ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd) | |||
248 | new_node->type = node->type; | 248 | new_node->type = node->type; |
249 | new_node->height = node->height; | 249 | new_node->height = node->height; |
250 | 250 | ||
251 | if (node->next) | ||
252 | next_node = hfs_bnode_find(tree, node->next); | ||
253 | else | ||
254 | next_node = NULL; | ||
255 | |||
256 | if (IS_ERR(next_node)) { | ||
257 | hfs_bnode_put(node); | ||
258 | hfs_bnode_put(new_node); | ||
259 | return next_node; | ||
260 | } | ||
261 | |||
251 | size = tree->node_size / 2 - node->num_recs * 2 - 14; | 262 | size = tree->node_size / 2 - node->num_recs * 2 - 14; |
252 | old_rec_off = tree->node_size - 4; | 263 | old_rec_off = tree->node_size - 4; |
253 | num_recs = 1; | 264 | num_recs = 1; |
@@ -261,6 +272,8 @@ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd) | |||
261 | /* panic? */ | 272 | /* panic? */ |
262 | hfs_bnode_put(node); | 273 | hfs_bnode_put(node); |
263 | hfs_bnode_put(new_node); | 274 | hfs_bnode_put(new_node); |
275 | if (next_node) | ||
276 | hfs_bnode_put(next_node); | ||
264 | return ERR_PTR(-ENOSPC); | 277 | return ERR_PTR(-ENOSPC); |
265 | } | 278 | } |
266 | 279 | ||
@@ -315,8 +328,7 @@ static struct hfs_bnode *hfs_bnode_split(struct hfs_find_data *fd) | |||
315 | hfs_bnode_write(node, &node_desc, 0, sizeof(node_desc)); | 328 | hfs_bnode_write(node, &node_desc, 0, sizeof(node_desc)); |
316 | 329 | ||
317 | /* update next bnode header */ | 330 | /* update next bnode header */ |
318 | if (new_node->next) { | 331 | if (next_node) { |
319 | struct hfs_bnode *next_node = hfs_bnode_find(tree, new_node->next); | ||
320 | next_node->prev = new_node->this; | 332 | next_node->prev = new_node->this; |
321 | hfs_bnode_read(next_node, &node_desc, 0, sizeof(node_desc)); | 333 | hfs_bnode_read(next_node, &node_desc, 0, sizeof(node_desc)); |
322 | node_desc.prev = cpu_to_be32(next_node->prev); | 334 | node_desc.prev = cpu_to_be32(next_node->prev); |
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index 038ed7436199..c6cbb6cd59b2 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c | |||
@@ -369,7 +369,7 @@ out: | |||
369 | 369 | ||
370 | 370 | ||
371 | /** | 371 | /** |
372 | * int journal_restart() - restart a handle . | 372 | * int journal_restart() - restart a handle. |
373 | * @handle: handle to restart | 373 | * @handle: handle to restart |
374 | * @nblocks: nr credits requested | 374 | * @nblocks: nr credits requested |
375 | * | 375 | * |
@@ -844,8 +844,7 @@ out: | |||
844 | } | 844 | } |
845 | 845 | ||
846 | /** | 846 | /** |
847 | * int journal_get_undo_access() - Notify intent to modify metadata with | 847 | * int journal_get_undo_access() - Notify intent to modify metadata with non-rewindable consequences |
848 | * non-rewindable consequences | ||
849 | * @handle: transaction | 848 | * @handle: transaction |
850 | * @bh: buffer to undo | 849 | * @bh: buffer to undo |
851 | * @credits: store the number of taken credits here (if not NULL) | 850 | * @credits: store the number of taken credits here (if not NULL) |
@@ -921,12 +920,14 @@ out: | |||
921 | } | 920 | } |
922 | 921 | ||
923 | /** | 922 | /** |
924 | * int journal_dirty_data() - mark a buffer as containing dirty data which | 923 | * int journal_dirty_data() - mark a buffer as containing dirty data to be flushed |
925 | * needs to be flushed before we can commit the | ||
926 | * current transaction. | ||
927 | * @handle: transaction | 924 | * @handle: transaction |
928 | * @bh: bufferhead to mark | 925 | * @bh: bufferhead to mark |
929 | * | 926 | * |
927 | * Description: | ||
928 | * Mark a buffer as containing dirty data which needs to be flushed before | ||
929 | * we can commit the current transaction. | ||
930 | * | ||
930 | * The buffer is placed on the transaction's data list and is marked as | 931 | * The buffer is placed on the transaction's data list and is marked as |
931 | * belonging to the transaction. | 932 | * belonging to the transaction. |
932 | * | 933 | * |
@@ -1098,11 +1099,11 @@ no_journal: | |||
1098 | } | 1099 | } |
1099 | 1100 | ||
1100 | /** | 1101 | /** |
1101 | * int journal_dirty_metadata() - mark a buffer as containing dirty metadata | 1102 | * int journal_dirty_metadata() - mark a buffer as containing dirty metadata |
1102 | * @handle: transaction to add buffer to. | 1103 | * @handle: transaction to add buffer to. |
1103 | * @bh: buffer to mark | 1104 | * @bh: buffer to mark |
1104 | * | 1105 | * |
1105 | * mark dirty metadata which needs to be journaled as part of the current | 1106 | * Mark dirty metadata which needs to be journaled as part of the current |
1106 | * transaction. | 1107 | * transaction. |
1107 | * | 1108 | * |
1108 | * The buffer is placed on the transaction's metadata list and is marked | 1109 | * The buffer is placed on the transaction's metadata list and is marked |
diff --git a/fs/mpage.c b/fs/mpage.c index 5df564366f36..235e4d3873a8 100644 --- a/fs/mpage.c +++ b/fs/mpage.c | |||
@@ -325,16 +325,12 @@ confused: | |||
325 | } | 325 | } |
326 | 326 | ||
327 | /** | 327 | /** |
328 | * mpage_readpages - populate an address space with some pages, and | 328 | * mpage_readpages - populate an address space with some pages & start reads against them |
329 | * start reads against them. | ||
330 | * | ||
331 | * @mapping: the address_space | 329 | * @mapping: the address_space |
332 | * @pages: The address of a list_head which contains the target pages. These | 330 | * @pages: The address of a list_head which contains the target pages. These |
333 | * pages have their ->index populated and are otherwise uninitialised. | 331 | * pages have their ->index populated and are otherwise uninitialised. |
334 | * | ||
335 | * The page at @pages->prev has the lowest file offset, and reads should be | 332 | * The page at @pages->prev has the lowest file offset, and reads should be |
336 | * issued in @pages->prev to @pages->next order. | 333 | * issued in @pages->prev to @pages->next order. |
337 | * | ||
338 | * @nr_pages: The number of pages at *@pages | 334 | * @nr_pages: The number of pages at *@pages |
339 | * @get_block: The filesystem's block mapper function. | 335 | * @get_block: The filesystem's block mapper function. |
340 | * | 336 | * |
@@ -360,6 +356,7 @@ confused: | |||
360 | * So an mpage read of the first 16 blocks of an ext2 file will cause I/O to be | 356 | * So an mpage read of the first 16 blocks of an ext2 file will cause I/O to be |
361 | * submitted in the following order: | 357 | * submitted in the following order: |
362 | * 12 0 1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 | 358 | * 12 0 1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 |
359 | * | ||
363 | * because the indirect block has to be read to get the mappings of blocks | 360 | * because the indirect block has to be read to get the mappings of blocks |
364 | * 13,14,15,16. Obviously, this impacts performance. | 361 | * 13,14,15,16. Obviously, this impacts performance. |
365 | * | 362 | * |
@@ -656,9 +653,7 @@ out: | |||
656 | } | 653 | } |
657 | 654 | ||
658 | /** | 655 | /** |
659 | * mpage_writepages - walk the list of dirty pages of the given | 656 | * mpage_writepages - walk the list of dirty pages of the given address space & writepage() all of them |
660 | * address space and writepage() all of them. | ||
661 | * | ||
662 | * @mapping: address space structure to write | 657 | * @mapping: address space structure to write |
663 | * @wbc: subtract the number of written pages from *@wbc->nr_to_write | 658 | * @wbc: subtract the number of written pages from *@wbc->nr_to_write |
664 | * @get_block: the filesystem's block mapper function. | 659 | * @get_block: the filesystem's block mapper function. |
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index ae04892a5e5d..6cea7479c5b4 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -710,6 +710,8 @@ int nfs_lookup_verify_inode(struct inode *inode, struct nameidata *nd) | |||
710 | { | 710 | { |
711 | struct nfs_server *server = NFS_SERVER(inode); | 711 | struct nfs_server *server = NFS_SERVER(inode); |
712 | 712 | ||
713 | if (test_bit(NFS_INO_MOUNTPOINT, &NFS_I(inode)->flags)) | ||
714 | return 0; | ||
713 | if (nd != NULL) { | 715 | if (nd != NULL) { |
714 | /* VFS wants an on-the-wire revalidation */ | 716 | /* VFS wants an on-the-wire revalidation */ |
715 | if (nd->flags & LOOKUP_REVAL) | 717 | if (nd->flags & LOOKUP_REVAL) |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 966a8850aa30..a4c7cf2bff3a 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -299,6 +299,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) | |||
299 | else | 299 | else |
300 | inode->i_op = &nfs_mountpoint_inode_operations; | 300 | inode->i_op = &nfs_mountpoint_inode_operations; |
301 | inode->i_fop = NULL; | 301 | inode->i_fop = NULL; |
302 | set_bit(NFS_INO_MOUNTPOINT, &nfsi->flags); | ||
302 | } | 303 | } |
303 | } else if (S_ISLNK(inode->i_mode)) | 304 | } else if (S_ISLNK(inode->i_mode)) |
304 | inode->i_op = &nfs_symlink_inode_operations; | 305 | inode->i_op = &nfs_symlink_inode_operations; |
@@ -1003,8 +1004,9 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | |||
1003 | 1004 | ||
1004 | server = NFS_SERVER(inode); | 1005 | server = NFS_SERVER(inode); |
1005 | /* Update the fsid? */ | 1006 | /* Update the fsid? */ |
1006 | if (S_ISDIR(inode->i_mode) | 1007 | if (S_ISDIR(inode->i_mode) && |
1007 | && !nfs_fsid_equal(&server->fsid, &fattr->fsid)) | 1008 | !nfs_fsid_equal(&server->fsid, &fattr->fsid) && |
1009 | !test_bit(NFS_INO_MOUNTPOINT, &nfsi->flags)) | ||
1008 | server->fsid = fattr->fsid; | 1010 | server->fsid = fattr->fsid; |
1009 | 1011 | ||
1010 | /* | 1012 | /* |
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 0f5619611b8d..931992763e68 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
@@ -3,6 +3,7 @@ | |||
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <linux/mount.h> | 5 | #include <linux/mount.h> |
6 | #include <linux/security.h> | ||
6 | 7 | ||
7 | struct nfs_string; | 8 | struct nfs_string; |
8 | 9 | ||
@@ -57,6 +58,8 @@ struct nfs_parsed_mount_data { | |||
57 | char *export_path; | 58 | char *export_path; |
58 | int protocol; | 59 | int protocol; |
59 | } nfs_server; | 60 | } nfs_server; |
61 | |||
62 | struct security_mnt_opts lsm_opts; | ||
60 | }; | 63 | }; |
61 | 64 | ||
62 | /* client.c */ | 65 | /* client.c */ |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index bdcf6d3ef62f..dd4dfcd632ec 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -684,8 +684,9 @@ static void nfs_parse_server_address(char *value, | |||
684 | static int nfs_parse_mount_options(char *raw, | 684 | static int nfs_parse_mount_options(char *raw, |
685 | struct nfs_parsed_mount_data *mnt) | 685 | struct nfs_parsed_mount_data *mnt) |
686 | { | 686 | { |
687 | char *p, *string; | 687 | char *p, *string, *secdata; |
688 | unsigned short port = 0; | 688 | unsigned short port = 0; |
689 | int rc; | ||
689 | 690 | ||
690 | if (!raw) { | 691 | if (!raw) { |
691 | dfprintk(MOUNT, "NFS: mount options string was NULL.\n"); | 692 | dfprintk(MOUNT, "NFS: mount options string was NULL.\n"); |
@@ -693,6 +694,20 @@ static int nfs_parse_mount_options(char *raw, | |||
693 | } | 694 | } |
694 | dfprintk(MOUNT, "NFS: nfs mount opts='%s'\n", raw); | 695 | dfprintk(MOUNT, "NFS: nfs mount opts='%s'\n", raw); |
695 | 696 | ||
697 | secdata = alloc_secdata(); | ||
698 | if (!secdata) | ||
699 | goto out_nomem; | ||
700 | |||
701 | rc = security_sb_copy_data(raw, secdata); | ||
702 | if (rc) | ||
703 | goto out_security_failure; | ||
704 | |||
705 | rc = security_sb_parse_opts_str(secdata, &mnt->lsm_opts); | ||
706 | if (rc) | ||
707 | goto out_security_failure; | ||
708 | |||
709 | free_secdata(secdata); | ||
710 | |||
696 | while ((p = strsep(&raw, ",")) != NULL) { | 711 | while ((p = strsep(&raw, ",")) != NULL) { |
697 | substring_t args[MAX_OPT_ARGS]; | 712 | substring_t args[MAX_OPT_ARGS]; |
698 | int option, token; | 713 | int option, token; |
@@ -1042,7 +1057,10 @@ static int nfs_parse_mount_options(char *raw, | |||
1042 | out_nomem: | 1057 | out_nomem: |
1043 | printk(KERN_INFO "NFS: not enough memory to parse option\n"); | 1058 | printk(KERN_INFO "NFS: not enough memory to parse option\n"); |
1044 | return 0; | 1059 | return 0; |
1045 | 1060 | out_security_failure: | |
1061 | free_secdata(secdata); | ||
1062 | printk(KERN_INFO "NFS: security options invalid: %d\n", rc); | ||
1063 | return 0; | ||
1046 | out_unrec_vers: | 1064 | out_unrec_vers: |
1047 | printk(KERN_INFO "NFS: unrecognized NFS version number\n"); | 1065 | printk(KERN_INFO "NFS: unrecognized NFS version number\n"); |
1048 | return 0; | 1066 | return 0; |
@@ -1214,6 +1232,33 @@ static int nfs_validate_mount_data(void *options, | |||
1214 | args->namlen = data->namlen; | 1232 | args->namlen = data->namlen; |
1215 | args->bsize = data->bsize; | 1233 | args->bsize = data->bsize; |
1216 | args->auth_flavors[0] = data->pseudoflavor; | 1234 | args->auth_flavors[0] = data->pseudoflavor; |
1235 | |||
1236 | /* | ||
1237 | * The legacy version 6 binary mount data from userspace has a | ||
1238 | * field used only to transport selinux information into the | ||
1239 | * the kernel. To continue to support that functionality we | ||
1240 | * have a touch of selinux knowledge here in the NFS code. The | ||
1241 | * userspace code converted context=blah to just blah so we are | ||
1242 | * converting back to the full string selinux understands. | ||
1243 | */ | ||
1244 | if (data->context[0]){ | ||
1245 | #ifdef CONFIG_SECURITY_SELINUX | ||
1246 | int rc; | ||
1247 | char *opts_str = kmalloc(sizeof(data->context) + 8, GFP_KERNEL); | ||
1248 | if (!opts_str) | ||
1249 | return -ENOMEM; | ||
1250 | strcpy(opts_str, "context="); | ||
1251 | data->context[NFS_MAX_CONTEXT_LEN] = '\0'; | ||
1252 | strcat(opts_str, &data->context[0]); | ||
1253 | rc = security_sb_parse_opts_str(opts_str, &args->lsm_opts); | ||
1254 | kfree(opts_str); | ||
1255 | if (rc) | ||
1256 | return rc; | ||
1257 | #else | ||
1258 | return -EINVAL; | ||
1259 | #endif | ||
1260 | } | ||
1261 | |||
1217 | break; | 1262 | break; |
1218 | default: { | 1263 | default: { |
1219 | unsigned int len; | 1264 | unsigned int len; |
@@ -1476,6 +1521,8 @@ static int nfs_get_sb(struct file_system_type *fs_type, | |||
1476 | }; | 1521 | }; |
1477 | int error; | 1522 | int error; |
1478 | 1523 | ||
1524 | security_init_mnt_opts(&data.lsm_opts); | ||
1525 | |||
1479 | /* Validate the mount data */ | 1526 | /* Validate the mount data */ |
1480 | error = nfs_validate_mount_data(raw_data, &data, &mntfh, dev_name); | 1527 | error = nfs_validate_mount_data(raw_data, &data, &mntfh, dev_name); |
1481 | if (error < 0) | 1528 | if (error < 0) |
@@ -1515,6 +1562,10 @@ static int nfs_get_sb(struct file_system_type *fs_type, | |||
1515 | goto error_splat_super; | 1562 | goto error_splat_super; |
1516 | } | 1563 | } |
1517 | 1564 | ||
1565 | error = security_sb_set_mnt_opts(s, &data.lsm_opts); | ||
1566 | if (error) | ||
1567 | goto error_splat_root; | ||
1568 | |||
1518 | s->s_flags |= MS_ACTIVE; | 1569 | s->s_flags |= MS_ACTIVE; |
1519 | mnt->mnt_sb = s; | 1570 | mnt->mnt_sb = s; |
1520 | mnt->mnt_root = mntroot; | 1571 | mnt->mnt_root = mntroot; |
@@ -1523,12 +1574,15 @@ static int nfs_get_sb(struct file_system_type *fs_type, | |||
1523 | out: | 1574 | out: |
1524 | kfree(data.nfs_server.hostname); | 1575 | kfree(data.nfs_server.hostname); |
1525 | kfree(data.mount_server.hostname); | 1576 | kfree(data.mount_server.hostname); |
1577 | security_free_mnt_opts(&data.lsm_opts); | ||
1526 | return error; | 1578 | return error; |
1527 | 1579 | ||
1528 | out_err_nosb: | 1580 | out_err_nosb: |
1529 | nfs_free_server(server); | 1581 | nfs_free_server(server); |
1530 | goto out; | 1582 | goto out; |
1531 | 1583 | ||
1584 | error_splat_root: | ||
1585 | dput(mntroot); | ||
1532 | error_splat_super: | 1586 | error_splat_super: |
1533 | up_write(&s->s_umount); | 1587 | up_write(&s->s_umount); |
1534 | deactivate_super(s); | 1588 | deactivate_super(s); |
@@ -1608,6 +1662,9 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
1608 | mnt->mnt_sb = s; | 1662 | mnt->mnt_sb = s; |
1609 | mnt->mnt_root = mntroot; | 1663 | mnt->mnt_root = mntroot; |
1610 | 1664 | ||
1665 | /* clone any lsm security options from the parent to the new sb */ | ||
1666 | security_sb_clone_mnt_opts(data->sb, s); | ||
1667 | |||
1611 | dprintk("<-- nfs_xdev_get_sb() = 0\n"); | 1668 | dprintk("<-- nfs_xdev_get_sb() = 0\n"); |
1612 | return 0; | 1669 | return 0; |
1613 | 1670 | ||
@@ -1850,6 +1907,8 @@ static int nfs4_get_sb(struct file_system_type *fs_type, | |||
1850 | }; | 1907 | }; |
1851 | int error; | 1908 | int error; |
1852 | 1909 | ||
1910 | security_init_mnt_opts(&data.lsm_opts); | ||
1911 | |||
1853 | /* Validate the mount data */ | 1912 | /* Validate the mount data */ |
1854 | error = nfs4_validate_mount_data(raw_data, &data, dev_name); | 1913 | error = nfs4_validate_mount_data(raw_data, &data, dev_name); |
1855 | if (error < 0) | 1914 | if (error < 0) |
@@ -1898,6 +1957,7 @@ out: | |||
1898 | kfree(data.client_address); | 1957 | kfree(data.client_address); |
1899 | kfree(data.nfs_server.export_path); | 1958 | kfree(data.nfs_server.export_path); |
1900 | kfree(data.nfs_server.hostname); | 1959 | kfree(data.nfs_server.hostname); |
1960 | security_free_mnt_opts(&data.lsm_opts); | ||
1901 | return error; | 1961 | return error; |
1902 | 1962 | ||
1903 | out_free: | 1963 | out_free: |
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index f55c437124a2..80c61fdb2720 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
@@ -734,7 +734,7 @@ int nfs_updatepage(struct file *file, struct page *page, | |||
734 | */ | 734 | */ |
735 | if (nfs_write_pageuptodate(page, inode) && | 735 | if (nfs_write_pageuptodate(page, inode) && |
736 | inode->i_flock == NULL && | 736 | inode->i_flock == NULL && |
737 | !(file->f_mode & O_SYNC)) { | 737 | !(file->f_flags & O_SYNC)) { |
738 | count = max(count + offset, nfs_page_length(page)); | 738 | count = max(count + offset, nfs_page_length(page)); |
739 | offset = 0; | 739 | offset = 0; |
740 | } | 740 | } |
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 1eb771d79cca..3e6b3f41ee1f 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c | |||
@@ -232,6 +232,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) | |||
232 | fhp->fh_dentry = dentry; | 232 | fhp->fh_dentry = dentry; |
233 | fhp->fh_export = exp; | 233 | fhp->fh_export = exp; |
234 | nfsd_nr_verified++; | 234 | nfsd_nr_verified++; |
235 | cache_get(&exp->h); | ||
235 | } else { | 236 | } else { |
236 | /* | 237 | /* |
237 | * just rechecking permissions | 238 | * just rechecking permissions |
@@ -241,6 +242,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) | |||
241 | dprintk("nfsd: fh_verify - just checking\n"); | 242 | dprintk("nfsd: fh_verify - just checking\n"); |
242 | dentry = fhp->fh_dentry; | 243 | dentry = fhp->fh_dentry; |
243 | exp = fhp->fh_export; | 244 | exp = fhp->fh_export; |
245 | cache_get(&exp->h); | ||
244 | /* | 246 | /* |
245 | * Set user creds for this exportpoint; necessary even | 247 | * Set user creds for this exportpoint; necessary even |
246 | * in the "just checking" case because this may be a | 248 | * in the "just checking" case because this may be a |
@@ -252,8 +254,6 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access) | |||
252 | if (error) | 254 | if (error) |
253 | goto out; | 255 | goto out; |
254 | } | 256 | } |
255 | cache_get(&exp->h); | ||
256 | |||
257 | 257 | ||
258 | error = nfsd_mode_check(rqstp, dentry->d_inode->i_mode, type); | 258 | error = nfsd_mode_check(rqstp, dentry->d_inode->i_mode, type); |
259 | if (error) | 259 | if (error) |
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 82243127eebf..90383ed61005 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -257,7 +257,7 @@ static int ocfs2_readpage_inline(struct inode *inode, struct page *page) | |||
257 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | 257 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
258 | 258 | ||
259 | BUG_ON(!PageLocked(page)); | 259 | BUG_ON(!PageLocked(page)); |
260 | BUG_ON(!OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL); | 260 | BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)); |
261 | 261 | ||
262 | ret = ocfs2_read_block(osb, OCFS2_I(inode)->ip_blkno, &di_bh, | 262 | ret = ocfs2_read_block(osb, OCFS2_I(inode)->ip_blkno, &di_bh, |
263 | OCFS2_BH_CACHED, inode); | 263 | OCFS2_BH_CACHED, inode); |
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index ee50c9610e7f..b8057c51b205 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c | |||
@@ -451,9 +451,9 @@ static void o2net_set_nn_state(struct o2net_node *nn, | |||
451 | /* delay if we're withing a RECONNECT_DELAY of the | 451 | /* delay if we're withing a RECONNECT_DELAY of the |
452 | * last attempt */ | 452 | * last attempt */ |
453 | delay = (nn->nn_last_connect_attempt + | 453 | delay = (nn->nn_last_connect_attempt + |
454 | msecs_to_jiffies(o2net_reconnect_delay(sc->sc_node))) | 454 | msecs_to_jiffies(o2net_reconnect_delay(NULL))) |
455 | - jiffies; | 455 | - jiffies; |
456 | if (delay > msecs_to_jiffies(o2net_reconnect_delay(sc->sc_node))) | 456 | if (delay > msecs_to_jiffies(o2net_reconnect_delay(NULL))) |
457 | delay = 0; | 457 | delay = 0; |
458 | mlog(ML_CONN, "queueing conn attempt in %lu jiffies\n", delay); | 458 | mlog(ML_CONN, "queueing conn attempt in %lu jiffies\n", delay); |
459 | queue_delayed_work(o2net_wq, &nn->nn_connect_work, delay); | 459 | queue_delayed_work(o2net_wq, &nn->nn_connect_work, delay); |
@@ -1552,12 +1552,11 @@ static void o2net_connect_expired(struct work_struct *work) | |||
1552 | 1552 | ||
1553 | spin_lock(&nn->nn_lock); | 1553 | spin_lock(&nn->nn_lock); |
1554 | if (!nn->nn_sc_valid) { | 1554 | if (!nn->nn_sc_valid) { |
1555 | struct o2nm_node *node = nn->nn_sc->sc_node; | ||
1556 | mlog(ML_ERROR, "no connection established with node %u after " | 1555 | mlog(ML_ERROR, "no connection established with node %u after " |
1557 | "%u.%u seconds, giving up and returning errors.\n", | 1556 | "%u.%u seconds, giving up and returning errors.\n", |
1558 | o2net_num_from_nn(nn), | 1557 | o2net_num_from_nn(nn), |
1559 | o2net_idle_timeout(node) / 1000, | 1558 | o2net_idle_timeout(NULL) / 1000, |
1560 | o2net_idle_timeout(node) % 1000); | 1559 | o2net_idle_timeout(NULL) % 1000); |
1561 | 1560 | ||
1562 | o2net_set_nn_state(nn, NULL, 0, -ENOTCONN); | 1561 | o2net_set_nn_state(nn, NULL, 0, -ENOTCONN); |
1563 | } | 1562 | } |
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index e280833ceb9a..8a1875848080 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c | |||
@@ -390,9 +390,8 @@ static int __ocfs2_delete_entry(handle_t *handle, struct inode *dir, | |||
390 | goto bail; | 390 | goto bail; |
391 | } | 391 | } |
392 | if (pde) | 392 | if (pde) |
393 | pde->rec_len = | 393 | le16_add_cpu(&pde->rec_len, |
394 | cpu_to_le16(le16_to_cpu(pde->rec_len) + | 394 | le16_to_cpu(de->rec_len)); |
395 | le16_to_cpu(de->rec_len)); | ||
396 | else | 395 | else |
397 | de->inode = 0; | 396 | de->inode = 0; |
398 | dir->i_version++; | 397 | dir->i_version++; |
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index 9843ee17ea27..dc8ea666efdb 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h | |||
@@ -176,6 +176,7 @@ struct dlm_mig_lockres_priv | |||
176 | { | 176 | { |
177 | struct dlm_lock_resource *lockres; | 177 | struct dlm_lock_resource *lockres; |
178 | u8 real_master; | 178 | u8 real_master; |
179 | u8 extra_ref; | ||
179 | }; | 180 | }; |
180 | 181 | ||
181 | struct dlm_assert_master_priv | 182 | struct dlm_assert_master_priv |
@@ -602,17 +603,19 @@ enum dlm_query_join_response_code { | |||
602 | JOIN_PROTOCOL_MISMATCH, | 603 | JOIN_PROTOCOL_MISMATCH, |
603 | }; | 604 | }; |
604 | 605 | ||
606 | struct dlm_query_join_packet { | ||
607 | u8 code; /* Response code. dlm_minor and fs_minor | ||
608 | are only valid if this is JOIN_OK */ | ||
609 | u8 dlm_minor; /* The minor version of the protocol the | ||
610 | dlm is speaking. */ | ||
611 | u8 fs_minor; /* The minor version of the protocol the | ||
612 | filesystem is speaking. */ | ||
613 | u8 reserved; | ||
614 | }; | ||
615 | |||
605 | union dlm_query_join_response { | 616 | union dlm_query_join_response { |
606 | u32 intval; | 617 | u32 intval; |
607 | struct { | 618 | struct dlm_query_join_packet packet; |
608 | u8 code; /* Response code. dlm_minor and fs_minor | ||
609 | are only valid if this is JOIN_OK */ | ||
610 | u8 dlm_minor; /* The minor version of the protocol the | ||
611 | dlm is speaking. */ | ||
612 | u8 fs_minor; /* The minor version of the protocol the | ||
613 | filesystem is speaking. */ | ||
614 | u8 reserved; | ||
615 | } packet; | ||
616 | }; | 619 | }; |
617 | 620 | ||
618 | struct dlm_lock_request | 621 | struct dlm_lock_request |
diff --git a/fs/ocfs2/dlm/dlmconvert.c b/fs/ocfs2/dlm/dlmconvert.c index ecb4d997221e..75997b4deaf3 100644 --- a/fs/ocfs2/dlm/dlmconvert.c +++ b/fs/ocfs2/dlm/dlmconvert.c | |||
@@ -487,7 +487,7 @@ int dlm_convert_lock_handler(struct o2net_msg *msg, u32 len, void *data, | |||
487 | "cookie=%u:%llu\n", | 487 | "cookie=%u:%llu\n", |
488 | dlm_get_lock_cookie_node(be64_to_cpu(cnv->cookie)), | 488 | dlm_get_lock_cookie_node(be64_to_cpu(cnv->cookie)), |
489 | dlm_get_lock_cookie_seq(be64_to_cpu(cnv->cookie))); | 489 | dlm_get_lock_cookie_seq(be64_to_cpu(cnv->cookie))); |
490 | __dlm_print_one_lock_resource(res); | 490 | dlm_print_one_lock_resource(res); |
491 | goto leave; | 491 | goto leave; |
492 | } | 492 | } |
493 | 493 | ||
diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index 638d2ebb892b..0879d86113e3 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c | |||
@@ -713,14 +713,46 @@ static int dlm_query_join_proto_check(char *proto_type, int node, | |||
713 | return rc; | 713 | return rc; |
714 | } | 714 | } |
715 | 715 | ||
716 | /* | ||
717 | * struct dlm_query_join_packet is made up of four one-byte fields. They | ||
718 | * are effectively in big-endian order already. However, little-endian | ||
719 | * machines swap them before putting the packet on the wire (because | ||
720 | * query_join's response is a status, and that status is treated as a u32 | ||
721 | * on the wire). Thus, a big-endian and little-endian machines will treat | ||
722 | * this structure differently. | ||
723 | * | ||
724 | * The solution is to have little-endian machines swap the structure when | ||
725 | * converting from the structure to the u32 representation. This will | ||
726 | * result in the structure having the correct format on the wire no matter | ||
727 | * the host endian format. | ||
728 | */ | ||
729 | static void dlm_query_join_packet_to_wire(struct dlm_query_join_packet *packet, | ||
730 | u32 *wire) | ||
731 | { | ||
732 | union dlm_query_join_response response; | ||
733 | |||
734 | response.packet = *packet; | ||
735 | *wire = cpu_to_be32(response.intval); | ||
736 | } | ||
737 | |||
738 | static void dlm_query_join_wire_to_packet(u32 wire, | ||
739 | struct dlm_query_join_packet *packet) | ||
740 | { | ||
741 | union dlm_query_join_response response; | ||
742 | |||
743 | response.intval = cpu_to_be32(wire); | ||
744 | *packet = response.packet; | ||
745 | } | ||
746 | |||
716 | static int dlm_query_join_handler(struct o2net_msg *msg, u32 len, void *data, | 747 | static int dlm_query_join_handler(struct o2net_msg *msg, u32 len, void *data, |
717 | void **ret_data) | 748 | void **ret_data) |
718 | { | 749 | { |
719 | struct dlm_query_join_request *query; | 750 | struct dlm_query_join_request *query; |
720 | union dlm_query_join_response response = { | 751 | struct dlm_query_join_packet packet = { |
721 | .packet.code = JOIN_DISALLOW, | 752 | .code = JOIN_DISALLOW, |
722 | }; | 753 | }; |
723 | struct dlm_ctxt *dlm = NULL; | 754 | struct dlm_ctxt *dlm = NULL; |
755 | u32 response; | ||
724 | u8 nodenum; | 756 | u8 nodenum; |
725 | 757 | ||
726 | query = (struct dlm_query_join_request *) msg->buf; | 758 | query = (struct dlm_query_join_request *) msg->buf; |
@@ -737,11 +769,11 @@ static int dlm_query_join_handler(struct o2net_msg *msg, u32 len, void *data, | |||
737 | mlog(0, "node %u is not in our live map yet\n", | 769 | mlog(0, "node %u is not in our live map yet\n", |
738 | query->node_idx); | 770 | query->node_idx); |
739 | 771 | ||
740 | response.packet.code = JOIN_DISALLOW; | 772 | packet.code = JOIN_DISALLOW; |
741 | goto respond; | 773 | goto respond; |
742 | } | 774 | } |
743 | 775 | ||
744 | response.packet.code = JOIN_OK_NO_MAP; | 776 | packet.code = JOIN_OK_NO_MAP; |
745 | 777 | ||
746 | spin_lock(&dlm_domain_lock); | 778 | spin_lock(&dlm_domain_lock); |
747 | dlm = __dlm_lookup_domain_full(query->domain, query->name_len); | 779 | dlm = __dlm_lookup_domain_full(query->domain, query->name_len); |
@@ -760,7 +792,7 @@ static int dlm_query_join_handler(struct o2net_msg *msg, u32 len, void *data, | |||
760 | mlog(0, "disallow join as node %u does not " | 792 | mlog(0, "disallow join as node %u does not " |
761 | "have node %u in its nodemap\n", | 793 | "have node %u in its nodemap\n", |
762 | query->node_idx, nodenum); | 794 | query->node_idx, nodenum); |
763 | response.packet.code = JOIN_DISALLOW; | 795 | packet.code = JOIN_DISALLOW; |
764 | goto unlock_respond; | 796 | goto unlock_respond; |
765 | } | 797 | } |
766 | } | 798 | } |
@@ -780,23 +812,23 @@ static int dlm_query_join_handler(struct o2net_msg *msg, u32 len, void *data, | |||
780 | /*If this is a brand new context and we | 812 | /*If this is a brand new context and we |
781 | * haven't started our join process yet, then | 813 | * haven't started our join process yet, then |
782 | * the other node won the race. */ | 814 | * the other node won the race. */ |
783 | response.packet.code = JOIN_OK_NO_MAP; | 815 | packet.code = JOIN_OK_NO_MAP; |
784 | } else if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) { | 816 | } else if (dlm->joining_node != DLM_LOCK_RES_OWNER_UNKNOWN) { |
785 | /* Disallow parallel joins. */ | 817 | /* Disallow parallel joins. */ |
786 | response.packet.code = JOIN_DISALLOW; | 818 | packet.code = JOIN_DISALLOW; |
787 | } else if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { | 819 | } else if (dlm->reco.state & DLM_RECO_STATE_ACTIVE) { |
788 | mlog(0, "node %u trying to join, but recovery " | 820 | mlog(0, "node %u trying to join, but recovery " |
789 | "is ongoing.\n", bit); | 821 | "is ongoing.\n", bit); |
790 | response.packet.code = JOIN_DISALLOW; | 822 | packet.code = JOIN_DISALLOW; |
791 | } else if (test_bit(bit, dlm->recovery_map)) { | 823 | } else if (test_bit(bit, dlm->recovery_map)) { |
792 | mlog(0, "node %u trying to join, but it " | 824 | mlog(0, "node %u trying to join, but it " |
793 | "still needs recovery.\n", bit); | 825 | "still needs recovery.\n", bit); |
794 | response.packet.code = JOIN_DISALLOW; | 826 | packet.code = JOIN_DISALLOW; |
795 | } else if (test_bit(bit, dlm->domain_map)) { | 827 | } else if (test_bit(bit, dlm->domain_map)) { |
796 | mlog(0, "node %u trying to join, but it " | 828 | mlog(0, "node %u trying to join, but it " |
797 | "is still in the domain! needs recovery?\n", | 829 | "is still in the domain! needs recovery?\n", |
798 | bit); | 830 | bit); |
799 | response.packet.code = JOIN_DISALLOW; | 831 | packet.code = JOIN_DISALLOW; |
800 | } else { | 832 | } else { |
801 | /* Alright we're fully a part of this domain | 833 | /* Alright we're fully a part of this domain |
802 | * so we keep some state as to who's joining | 834 | * so we keep some state as to who's joining |
@@ -807,19 +839,15 @@ static int dlm_query_join_handler(struct o2net_msg *msg, u32 len, void *data, | |||
807 | if (dlm_query_join_proto_check("DLM", bit, | 839 | if (dlm_query_join_proto_check("DLM", bit, |
808 | &dlm->dlm_locking_proto, | 840 | &dlm->dlm_locking_proto, |
809 | &query->dlm_proto)) { | 841 | &query->dlm_proto)) { |
810 | response.packet.code = | 842 | packet.code = JOIN_PROTOCOL_MISMATCH; |
811 | JOIN_PROTOCOL_MISMATCH; | ||
812 | } else if (dlm_query_join_proto_check("fs", bit, | 843 | } else if (dlm_query_join_proto_check("fs", bit, |
813 | &dlm->fs_locking_proto, | 844 | &dlm->fs_locking_proto, |
814 | &query->fs_proto)) { | 845 | &query->fs_proto)) { |
815 | response.packet.code = | 846 | packet.code = JOIN_PROTOCOL_MISMATCH; |
816 | JOIN_PROTOCOL_MISMATCH; | ||
817 | } else { | 847 | } else { |
818 | response.packet.dlm_minor = | 848 | packet.dlm_minor = query->dlm_proto.pv_minor; |
819 | query->dlm_proto.pv_minor; | 849 | packet.fs_minor = query->fs_proto.pv_minor; |
820 | response.packet.fs_minor = | 850 | packet.code = JOIN_OK; |
821 | query->fs_proto.pv_minor; | ||
822 | response.packet.code = JOIN_OK; | ||
823 | __dlm_set_joining_node(dlm, query->node_idx); | 851 | __dlm_set_joining_node(dlm, query->node_idx); |
824 | } | 852 | } |
825 | } | 853 | } |
@@ -830,9 +858,10 @@ unlock_respond: | |||
830 | spin_unlock(&dlm_domain_lock); | 858 | spin_unlock(&dlm_domain_lock); |
831 | 859 | ||
832 | respond: | 860 | respond: |
833 | mlog(0, "We respond with %u\n", response.packet.code); | 861 | mlog(0, "We respond with %u\n", packet.code); |
834 | 862 | ||
835 | return response.intval; | 863 | dlm_query_join_packet_to_wire(&packet, &response); |
864 | return response; | ||
836 | } | 865 | } |
837 | 866 | ||
838 | static int dlm_assert_joined_handler(struct o2net_msg *msg, u32 len, void *data, | 867 | static int dlm_assert_joined_handler(struct o2net_msg *msg, u32 len, void *data, |
@@ -937,7 +966,7 @@ static int dlm_send_join_cancels(struct dlm_ctxt *dlm, | |||
937 | sizeof(unsigned long))) { | 966 | sizeof(unsigned long))) { |
938 | mlog(ML_ERROR, | 967 | mlog(ML_ERROR, |
939 | "map_size %u != BITS_TO_LONGS(O2NM_MAX_NODES) %u\n", | 968 | "map_size %u != BITS_TO_LONGS(O2NM_MAX_NODES) %u\n", |
940 | map_size, BITS_TO_LONGS(O2NM_MAX_NODES)); | 969 | map_size, (unsigned)BITS_TO_LONGS(O2NM_MAX_NODES)); |
941 | return -EINVAL; | 970 | return -EINVAL; |
942 | } | 971 | } |
943 | 972 | ||
@@ -968,7 +997,8 @@ static int dlm_request_join(struct dlm_ctxt *dlm, | |||
968 | { | 997 | { |
969 | int status; | 998 | int status; |
970 | struct dlm_query_join_request join_msg; | 999 | struct dlm_query_join_request join_msg; |
971 | union dlm_query_join_response join_resp; | 1000 | struct dlm_query_join_packet packet; |
1001 | u32 join_resp; | ||
972 | 1002 | ||
973 | mlog(0, "querying node %d\n", node); | 1003 | mlog(0, "querying node %d\n", node); |
974 | 1004 | ||
@@ -984,11 +1014,12 @@ static int dlm_request_join(struct dlm_ctxt *dlm, | |||
984 | 1014 | ||
985 | status = o2net_send_message(DLM_QUERY_JOIN_MSG, DLM_MOD_KEY, &join_msg, | 1015 | status = o2net_send_message(DLM_QUERY_JOIN_MSG, DLM_MOD_KEY, &join_msg, |
986 | sizeof(join_msg), node, | 1016 | sizeof(join_msg), node, |
987 | &join_resp.intval); | 1017 | &join_resp); |
988 | if (status < 0 && status != -ENOPROTOOPT) { | 1018 | if (status < 0 && status != -ENOPROTOOPT) { |
989 | mlog_errno(status); | 1019 | mlog_errno(status); |
990 | goto bail; | 1020 | goto bail; |
991 | } | 1021 | } |
1022 | dlm_query_join_wire_to_packet(join_resp, &packet); | ||
992 | 1023 | ||
993 | /* -ENOPROTOOPT from the net code means the other side isn't | 1024 | /* -ENOPROTOOPT from the net code means the other side isn't |
994 | listening for our message type -- that's fine, it means | 1025 | listening for our message type -- that's fine, it means |
@@ -997,10 +1028,10 @@ static int dlm_request_join(struct dlm_ctxt *dlm, | |||
997 | if (status == -ENOPROTOOPT) { | 1028 | if (status == -ENOPROTOOPT) { |
998 | status = 0; | 1029 | status = 0; |
999 | *response = JOIN_OK_NO_MAP; | 1030 | *response = JOIN_OK_NO_MAP; |
1000 | } else if (join_resp.packet.code == JOIN_DISALLOW || | 1031 | } else if (packet.code == JOIN_DISALLOW || |
1001 | join_resp.packet.code == JOIN_OK_NO_MAP) { | 1032 | packet.code == JOIN_OK_NO_MAP) { |
1002 | *response = join_resp.packet.code; | 1033 | *response = packet.code; |
1003 | } else if (join_resp.packet.code == JOIN_PROTOCOL_MISMATCH) { | 1034 | } else if (packet.code == JOIN_PROTOCOL_MISMATCH) { |
1004 | mlog(ML_NOTICE, | 1035 | mlog(ML_NOTICE, |
1005 | "This node requested DLM locking protocol %u.%u and " | 1036 | "This node requested DLM locking protocol %u.%u and " |
1006 | "filesystem locking protocol %u.%u. At least one of " | 1037 | "filesystem locking protocol %u.%u. At least one of " |
@@ -1012,14 +1043,12 @@ static int dlm_request_join(struct dlm_ctxt *dlm, | |||
1012 | dlm->fs_locking_proto.pv_minor, | 1043 | dlm->fs_locking_proto.pv_minor, |
1013 | node); | 1044 | node); |
1014 | status = -EPROTO; | 1045 | status = -EPROTO; |
1015 | *response = join_resp.packet.code; | 1046 | *response = packet.code; |
1016 | } else if (join_resp.packet.code == JOIN_OK) { | 1047 | } else if (packet.code == JOIN_OK) { |
1017 | *response = join_resp.packet.code; | 1048 | *response = packet.code; |
1018 | /* Use the same locking protocol as the remote node */ | 1049 | /* Use the same locking protocol as the remote node */ |
1019 | dlm->dlm_locking_proto.pv_minor = | 1050 | dlm->dlm_locking_proto.pv_minor = packet.dlm_minor; |
1020 | join_resp.packet.dlm_minor; | 1051 | dlm->fs_locking_proto.pv_minor = packet.fs_minor; |
1021 | dlm->fs_locking_proto.pv_minor = | ||
1022 | join_resp.packet.fs_minor; | ||
1023 | mlog(0, | 1052 | mlog(0, |
1024 | "Node %d responds JOIN_OK with DLM locking protocol " | 1053 | "Node %d responds JOIN_OK with DLM locking protocol " |
1025 | "%u.%u and fs locking protocol %u.%u\n", | 1054 | "%u.%u and fs locking protocol %u.%u\n", |
@@ -1031,11 +1060,11 @@ static int dlm_request_join(struct dlm_ctxt *dlm, | |||
1031 | } else { | 1060 | } else { |
1032 | status = -EINVAL; | 1061 | status = -EINVAL; |
1033 | mlog(ML_ERROR, "invalid response %d from node %u\n", | 1062 | mlog(ML_ERROR, "invalid response %d from node %u\n", |
1034 | join_resp.packet.code, node); | 1063 | packet.code, node); |
1035 | } | 1064 | } |
1036 | 1065 | ||
1037 | mlog(0, "status %d, node %d response is %d\n", status, node, | 1066 | mlog(0, "status %d, node %d response is %d\n", status, node, |
1038 | *response); | 1067 | *response); |
1039 | 1068 | ||
1040 | bail: | 1069 | bail: |
1041 | return status; | 1070 | return status; |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index a54d33d95ada..ea6b89577860 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
@@ -1663,7 +1663,12 @@ way_up_top: | |||
1663 | dlm_put_mle(tmpmle); | 1663 | dlm_put_mle(tmpmle); |
1664 | } | 1664 | } |
1665 | send_response: | 1665 | send_response: |
1666 | 1666 | /* | |
1667 | * __dlm_lookup_lockres() grabbed a reference to this lockres. | ||
1668 | * The reference is released by dlm_assert_master_worker() under | ||
1669 | * the call to dlm_dispatch_assert_master(). If | ||
1670 | * dlm_assert_master_worker() isn't called, we drop it here. | ||
1671 | */ | ||
1667 | if (dispatch_assert) { | 1672 | if (dispatch_assert) { |
1668 | if (response != DLM_MASTER_RESP_YES) | 1673 | if (response != DLM_MASTER_RESP_YES) |
1669 | mlog(ML_ERROR, "invalid response %d\n", response); | 1674 | mlog(ML_ERROR, "invalid response %d\n", response); |
@@ -1678,7 +1683,11 @@ send_response: | |||
1678 | if (ret < 0) { | 1683 | if (ret < 0) { |
1679 | mlog(ML_ERROR, "failed to dispatch assert master work\n"); | 1684 | mlog(ML_ERROR, "failed to dispatch assert master work\n"); |
1680 | response = DLM_MASTER_RESP_ERROR; | 1685 | response = DLM_MASTER_RESP_ERROR; |
1686 | dlm_lockres_put(res); | ||
1681 | } | 1687 | } |
1688 | } else { | ||
1689 | if (res) | ||
1690 | dlm_lockres_put(res); | ||
1682 | } | 1691 | } |
1683 | 1692 | ||
1684 | dlm_put(dlm); | 1693 | dlm_put(dlm); |
@@ -1695,9 +1704,9 @@ send_response: | |||
1695 | * can periodically run all locks owned by this node | 1704 | * can periodically run all locks owned by this node |
1696 | * and re-assert across the cluster... | 1705 | * and re-assert across the cluster... |
1697 | */ | 1706 | */ |
1698 | int dlm_do_assert_master(struct dlm_ctxt *dlm, | 1707 | static int dlm_do_assert_master(struct dlm_ctxt *dlm, |
1699 | struct dlm_lock_resource *res, | 1708 | struct dlm_lock_resource *res, |
1700 | void *nodemap, u32 flags) | 1709 | void *nodemap, u32 flags) |
1701 | { | 1710 | { |
1702 | struct dlm_assert_master assert; | 1711 | struct dlm_assert_master assert; |
1703 | int to, tmpret; | 1712 | int to, tmpret; |
@@ -2348,7 +2357,7 @@ int dlm_deref_lockres_handler(struct o2net_msg *msg, u32 len, void *data, | |||
2348 | mlog(ML_ERROR, "%s:%.*s: node %u trying to drop ref " | 2357 | mlog(ML_ERROR, "%s:%.*s: node %u trying to drop ref " |
2349 | "but it is already dropped!\n", dlm->name, | 2358 | "but it is already dropped!\n", dlm->name, |
2350 | res->lockname.len, res->lockname.name, node); | 2359 | res->lockname.len, res->lockname.name, node); |
2351 | __dlm_print_one_lock_resource(res); | 2360 | dlm_print_one_lock_resource(res); |
2352 | } | 2361 | } |
2353 | ret = 0; | 2362 | ret = 0; |
2354 | goto done; | 2363 | goto done; |
@@ -2408,7 +2417,7 @@ static void dlm_deref_lockres_worker(struct dlm_work_item *item, void *data) | |||
2408 | mlog(ML_ERROR, "%s:%.*s: node %u trying to drop ref " | 2417 | mlog(ML_ERROR, "%s:%.*s: node %u trying to drop ref " |
2409 | "but it is already dropped!\n", dlm->name, | 2418 | "but it is already dropped!\n", dlm->name, |
2410 | res->lockname.len, res->lockname.name, node); | 2419 | res->lockname.len, res->lockname.name, node); |
2411 | __dlm_print_one_lock_resource(res); | 2420 | dlm_print_one_lock_resource(res); |
2412 | } | 2421 | } |
2413 | 2422 | ||
2414 | dlm_lockres_put(res); | 2423 | dlm_lockres_put(res); |
@@ -2933,6 +2942,9 @@ static void dlm_remove_nonlocal_locks(struct dlm_ctxt *dlm, | |||
2933 | dlm_lockres_clear_refmap_bit(lock->ml.node, res); | 2942 | dlm_lockres_clear_refmap_bit(lock->ml.node, res); |
2934 | list_del_init(&lock->list); | 2943 | list_del_init(&lock->list); |
2935 | dlm_lock_put(lock); | 2944 | dlm_lock_put(lock); |
2945 | /* In a normal unlock, we would have added a | ||
2946 | * DLM_UNLOCK_FREE_LOCK action. Force it. */ | ||
2947 | dlm_lock_put(lock); | ||
2936 | } | 2948 | } |
2937 | } | 2949 | } |
2938 | queue++; | 2950 | queue++; |
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index 91f747b8a538..bcb9260c3735 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c | |||
@@ -519,9 +519,9 @@ static int dlm_do_recovery(struct dlm_ctxt *dlm) | |||
519 | return 0; | 519 | return 0; |
520 | 520 | ||
521 | master_here: | 521 | master_here: |
522 | mlog(0, "(%d) mastering recovery of %s:%u here(this=%u)!\n", | 522 | mlog(ML_NOTICE, "(%d) Node %u is the Recovery Master for the Dead Node " |
523 | task_pid_nr(dlm->dlm_reco_thread_task), | 523 | "%u for Domain %s\n", task_pid_nr(dlm->dlm_reco_thread_task), |
524 | dlm->name, dlm->reco.dead_node, dlm->node_num); | 524 | dlm->node_num, dlm->reco.dead_node, dlm->name); |
525 | 525 | ||
526 | status = dlm_remaster_locks(dlm, dlm->reco.dead_node); | 526 | status = dlm_remaster_locks(dlm, dlm->reco.dead_node); |
527 | if (status < 0) { | 527 | if (status < 0) { |
@@ -1191,7 +1191,7 @@ static int dlm_add_lock_to_array(struct dlm_lock *lock, | |||
1191 | (ml->type == LKM_EXMODE || | 1191 | (ml->type == LKM_EXMODE || |
1192 | memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN))) { | 1192 | memcmp(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN))) { |
1193 | mlog(ML_ERROR, "mismatched lvbs!\n"); | 1193 | mlog(ML_ERROR, "mismatched lvbs!\n"); |
1194 | __dlm_print_one_lock_resource(lock->lockres); | 1194 | dlm_print_one_lock_resource(lock->lockres); |
1195 | BUG(); | 1195 | BUG(); |
1196 | } | 1196 | } |
1197 | memcpy(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN); | 1197 | memcpy(mres->lvb, lock->lksb->lvb, DLM_LVB_LEN); |
@@ -1327,6 +1327,7 @@ int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data, | |||
1327 | (struct dlm_migratable_lockres *)msg->buf; | 1327 | (struct dlm_migratable_lockres *)msg->buf; |
1328 | int ret = 0; | 1328 | int ret = 0; |
1329 | u8 real_master; | 1329 | u8 real_master; |
1330 | u8 extra_refs = 0; | ||
1330 | char *buf = NULL; | 1331 | char *buf = NULL; |
1331 | struct dlm_work_item *item = NULL; | 1332 | struct dlm_work_item *item = NULL; |
1332 | struct dlm_lock_resource *res = NULL; | 1333 | struct dlm_lock_resource *res = NULL; |
@@ -1404,16 +1405,28 @@ int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data, | |||
1404 | __dlm_insert_lockres(dlm, res); | 1405 | __dlm_insert_lockres(dlm, res); |
1405 | spin_unlock(&dlm->spinlock); | 1406 | spin_unlock(&dlm->spinlock); |
1406 | 1407 | ||
1408 | /* Add an extra ref for this lock-less lockres lest the | ||
1409 | * dlm_thread purges it before we get the chance to add | ||
1410 | * locks to it */ | ||
1411 | dlm_lockres_get(res); | ||
1412 | |||
1413 | /* There are three refs that need to be put. | ||
1414 | * 1. Taken above. | ||
1415 | * 2. kref_init in dlm_new_lockres()->dlm_init_lockres(). | ||
1416 | * 3. dlm_lookup_lockres() | ||
1417 | * The first one is handled at the end of this function. The | ||
1418 | * other two are handled in the worker thread after locks have | ||
1419 | * been attached. Yes, we don't wait for purge time to match | ||
1420 | * kref_init. The lockres will still have atleast one ref | ||
1421 | * added because it is in the hash __dlm_insert_lockres() */ | ||
1422 | extra_refs++; | ||
1423 | |||
1407 | /* now that the new lockres is inserted, | 1424 | /* now that the new lockres is inserted, |
1408 | * make it usable by other processes */ | 1425 | * make it usable by other processes */ |
1409 | spin_lock(&res->spinlock); | 1426 | spin_lock(&res->spinlock); |
1410 | res->state &= ~DLM_LOCK_RES_IN_PROGRESS; | 1427 | res->state &= ~DLM_LOCK_RES_IN_PROGRESS; |
1411 | spin_unlock(&res->spinlock); | 1428 | spin_unlock(&res->spinlock); |
1412 | wake_up(&res->wq); | 1429 | wake_up(&res->wq); |
1413 | |||
1414 | /* add an extra ref for just-allocated lockres | ||
1415 | * otherwise the lockres will be purged immediately */ | ||
1416 | dlm_lockres_get(res); | ||
1417 | } | 1430 | } |
1418 | 1431 | ||
1419 | /* at this point we have allocated everything we need, | 1432 | /* at this point we have allocated everything we need, |
@@ -1443,12 +1456,17 @@ int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data, | |||
1443 | dlm_init_work_item(dlm, item, dlm_mig_lockres_worker, buf); | 1456 | dlm_init_work_item(dlm, item, dlm_mig_lockres_worker, buf); |
1444 | item->u.ml.lockres = res; /* already have a ref */ | 1457 | item->u.ml.lockres = res; /* already have a ref */ |
1445 | item->u.ml.real_master = real_master; | 1458 | item->u.ml.real_master = real_master; |
1459 | item->u.ml.extra_ref = extra_refs; | ||
1446 | spin_lock(&dlm->work_lock); | 1460 | spin_lock(&dlm->work_lock); |
1447 | list_add_tail(&item->list, &dlm->work_list); | 1461 | list_add_tail(&item->list, &dlm->work_list); |
1448 | spin_unlock(&dlm->work_lock); | 1462 | spin_unlock(&dlm->work_lock); |
1449 | queue_work(dlm->dlm_worker, &dlm->dispatched_work); | 1463 | queue_work(dlm->dlm_worker, &dlm->dispatched_work); |
1450 | 1464 | ||
1451 | leave: | 1465 | leave: |
1466 | /* One extra ref taken needs to be put here */ | ||
1467 | if (extra_refs) | ||
1468 | dlm_lockres_put(res); | ||
1469 | |||
1452 | dlm_put(dlm); | 1470 | dlm_put(dlm); |
1453 | if (ret < 0) { | 1471 | if (ret < 0) { |
1454 | if (buf) | 1472 | if (buf) |
@@ -1464,17 +1482,19 @@ leave: | |||
1464 | 1482 | ||
1465 | static void dlm_mig_lockres_worker(struct dlm_work_item *item, void *data) | 1483 | static void dlm_mig_lockres_worker(struct dlm_work_item *item, void *data) |
1466 | { | 1484 | { |
1467 | struct dlm_ctxt *dlm = data; | 1485 | struct dlm_ctxt *dlm; |
1468 | struct dlm_migratable_lockres *mres; | 1486 | struct dlm_migratable_lockres *mres; |
1469 | int ret = 0; | 1487 | int ret = 0; |
1470 | struct dlm_lock_resource *res; | 1488 | struct dlm_lock_resource *res; |
1471 | u8 real_master; | 1489 | u8 real_master; |
1490 | u8 extra_ref; | ||
1472 | 1491 | ||
1473 | dlm = item->dlm; | 1492 | dlm = item->dlm; |
1474 | mres = (struct dlm_migratable_lockres *)data; | 1493 | mres = (struct dlm_migratable_lockres *)data; |
1475 | 1494 | ||
1476 | res = item->u.ml.lockres; | 1495 | res = item->u.ml.lockres; |
1477 | real_master = item->u.ml.real_master; | 1496 | real_master = item->u.ml.real_master; |
1497 | extra_ref = item->u.ml.extra_ref; | ||
1478 | 1498 | ||
1479 | if (real_master == DLM_LOCK_RES_OWNER_UNKNOWN) { | 1499 | if (real_master == DLM_LOCK_RES_OWNER_UNKNOWN) { |
1480 | /* this case is super-rare. only occurs if | 1500 | /* this case is super-rare. only occurs if |
@@ -1517,6 +1537,12 @@ again: | |||
1517 | } | 1537 | } |
1518 | 1538 | ||
1519 | leave: | 1539 | leave: |
1540 | /* See comment in dlm_mig_lockres_handler() */ | ||
1541 | if (res) { | ||
1542 | if (extra_ref) | ||
1543 | dlm_lockres_put(res); | ||
1544 | dlm_lockres_put(res); | ||
1545 | } | ||
1520 | kfree(data); | 1546 | kfree(data); |
1521 | mlog_exit(ret); | 1547 | mlog_exit(ret); |
1522 | } | 1548 | } |
@@ -1644,7 +1670,8 @@ int dlm_master_requery_handler(struct o2net_msg *msg, u32 len, void *data, | |||
1644 | /* retry!? */ | 1670 | /* retry!? */ |
1645 | BUG(); | 1671 | BUG(); |
1646 | } | 1672 | } |
1647 | } | 1673 | } else /* put.. incase we are not the master */ |
1674 | dlm_lockres_put(res); | ||
1648 | spin_unlock(&res->spinlock); | 1675 | spin_unlock(&res->spinlock); |
1649 | } | 1676 | } |
1650 | spin_unlock(&dlm->spinlock); | 1677 | spin_unlock(&dlm->spinlock); |
@@ -1921,6 +1948,7 @@ void dlm_move_lockres_to_recovery_list(struct dlm_ctxt *dlm, | |||
1921 | "Recovering res %s:%.*s, is already on recovery list!\n", | 1948 | "Recovering res %s:%.*s, is already on recovery list!\n", |
1922 | dlm->name, res->lockname.len, res->lockname.name); | 1949 | dlm->name, res->lockname.len, res->lockname.name); |
1923 | list_del_init(&res->recovering); | 1950 | list_del_init(&res->recovering); |
1951 | dlm_lockres_put(res); | ||
1924 | } | 1952 | } |
1925 | /* We need to hold a reference while on the recovery list */ | 1953 | /* We need to hold a reference while on the recovery list */ |
1926 | dlm_lockres_get(res); | 1954 | dlm_lockres_get(res); |
@@ -2130,11 +2158,16 @@ static void dlm_free_dead_locks(struct dlm_ctxt *dlm, | |||
2130 | assert_spin_locked(&dlm->spinlock); | 2158 | assert_spin_locked(&dlm->spinlock); |
2131 | assert_spin_locked(&res->spinlock); | 2159 | assert_spin_locked(&res->spinlock); |
2132 | 2160 | ||
2161 | /* We do two dlm_lock_put(). One for removing from list and the other is | ||
2162 | * to force the DLM_UNLOCK_FREE_LOCK action so as to free the locks */ | ||
2163 | |||
2133 | /* TODO: check pending_asts, pending_basts here */ | 2164 | /* TODO: check pending_asts, pending_basts here */ |
2134 | list_for_each_entry_safe(lock, next, &res->granted, list) { | 2165 | list_for_each_entry_safe(lock, next, &res->granted, list) { |
2135 | if (lock->ml.node == dead_node) { | 2166 | if (lock->ml.node == dead_node) { |
2136 | list_del_init(&lock->list); | 2167 | list_del_init(&lock->list); |
2137 | dlm_lock_put(lock); | 2168 | dlm_lock_put(lock); |
2169 | /* Can't schedule DLM_UNLOCK_FREE_LOCK - do manually */ | ||
2170 | dlm_lock_put(lock); | ||
2138 | freed++; | 2171 | freed++; |
2139 | } | 2172 | } |
2140 | } | 2173 | } |
@@ -2142,6 +2175,8 @@ static void dlm_free_dead_locks(struct dlm_ctxt *dlm, | |||
2142 | if (lock->ml.node == dead_node) { | 2175 | if (lock->ml.node == dead_node) { |
2143 | list_del_init(&lock->list); | 2176 | list_del_init(&lock->list); |
2144 | dlm_lock_put(lock); | 2177 | dlm_lock_put(lock); |
2178 | /* Can't schedule DLM_UNLOCK_FREE_LOCK - do manually */ | ||
2179 | dlm_lock_put(lock); | ||
2145 | freed++; | 2180 | freed++; |
2146 | } | 2181 | } |
2147 | } | 2182 | } |
@@ -2149,6 +2184,8 @@ static void dlm_free_dead_locks(struct dlm_ctxt *dlm, | |||
2149 | if (lock->ml.node == dead_node) { | 2184 | if (lock->ml.node == dead_node) { |
2150 | list_del_init(&lock->list); | 2185 | list_del_init(&lock->list); |
2151 | dlm_lock_put(lock); | 2186 | dlm_lock_put(lock); |
2187 | /* Can't schedule DLM_UNLOCK_FREE_LOCK - do manually */ | ||
2188 | dlm_lock_put(lock); | ||
2152 | freed++; | 2189 | freed++; |
2153 | } | 2190 | } |
2154 | } | 2191 | } |
diff --git a/fs/ocfs2/dlm/dlmthread.c b/fs/ocfs2/dlm/dlmthread.c index cebd089f8955..4060bb328bc8 100644 --- a/fs/ocfs2/dlm/dlmthread.c +++ b/fs/ocfs2/dlm/dlmthread.c | |||
@@ -176,12 +176,14 @@ static int dlm_purge_lockres(struct dlm_ctxt *dlm, | |||
176 | res->lockname.name, master); | 176 | res->lockname.name, master); |
177 | 177 | ||
178 | if (!master) { | 178 | if (!master) { |
179 | /* drop spinlock... retake below */ | ||
180 | spin_unlock(&dlm->spinlock); | ||
181 | |||
179 | spin_lock(&res->spinlock); | 182 | spin_lock(&res->spinlock); |
180 | /* This ensures that clear refmap is sent after the set */ | 183 | /* This ensures that clear refmap is sent after the set */ |
181 | __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); | 184 | __dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG); |
182 | spin_unlock(&res->spinlock); | 185 | spin_unlock(&res->spinlock); |
183 | /* drop spinlock to do messaging, retake below */ | 186 | |
184 | spin_unlock(&dlm->spinlock); | ||
185 | /* clear our bit from the master's refmap, ignore errors */ | 187 | /* clear our bit from the master's refmap, ignore errors */ |
186 | ret = dlm_drop_lockres_ref(dlm, res); | 188 | ret = dlm_drop_lockres_ref(dlm, res); |
187 | if (ret < 0) { | 189 | if (ret < 0) { |
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index 351130c9b734..1f1873bf41fb 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c | |||
@@ -2409,7 +2409,7 @@ static int ocfs2_dlm_seq_show(struct seq_file *m, void *v) | |||
2409 | return 0; | 2409 | return 0; |
2410 | } | 2410 | } |
2411 | 2411 | ||
2412 | static struct seq_operations ocfs2_dlm_seq_ops = { | 2412 | static const struct seq_operations ocfs2_dlm_seq_ops = { |
2413 | .start = ocfs2_dlm_seq_start, | 2413 | .start = ocfs2_dlm_seq_start, |
2414 | .stop = ocfs2_dlm_seq_stop, | 2414 | .stop = ocfs2_dlm_seq_stop, |
2415 | .next = ocfs2_dlm_seq_next, | 2415 | .next = ocfs2_dlm_seq_next, |
@@ -3042,7 +3042,7 @@ static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres, | |||
3042 | inode = ocfs2_lock_res_inode(lockres); | 3042 | inode = ocfs2_lock_res_inode(lockres); |
3043 | mapping = inode->i_mapping; | 3043 | mapping = inode->i_mapping; |
3044 | 3044 | ||
3045 | if (S_ISREG(inode->i_mode)) | 3045 | if (!S_ISREG(inode->i_mode)) |
3046 | goto out; | 3046 | goto out; |
3047 | 3047 | ||
3048 | /* | 3048 | /* |
@@ -3219,8 +3219,8 @@ static int ocfs2_dentry_convert_worker(struct ocfs2_lock_res *lockres, | |||
3219 | return UNBLOCK_CONTINUE_POST; | 3219 | return UNBLOCK_CONTINUE_POST; |
3220 | } | 3220 | } |
3221 | 3221 | ||
3222 | void ocfs2_process_blocked_lock(struct ocfs2_super *osb, | 3222 | static void ocfs2_process_blocked_lock(struct ocfs2_super *osb, |
3223 | struct ocfs2_lock_res *lockres) | 3223 | struct ocfs2_lock_res *lockres) |
3224 | { | 3224 | { |
3225 | int status; | 3225 | int status; |
3226 | struct ocfs2_unblock_ctl ctl = {0, 0,}; | 3226 | struct ocfs2_unblock_ctl ctl = {0, 0,}; |
@@ -3356,7 +3356,7 @@ static int ocfs2_downconvert_thread_should_wake(struct ocfs2_super *osb) | |||
3356 | return should_wake; | 3356 | return should_wake; |
3357 | } | 3357 | } |
3358 | 3358 | ||
3359 | int ocfs2_downconvert_thread(void *arg) | 3359 | static int ocfs2_downconvert_thread(void *arg) |
3360 | { | 3360 | { |
3361 | int status = 0; | 3361 | int status = 0; |
3362 | struct ocfs2_super *osb = arg; | 3362 | struct ocfs2_super *osb = arg; |
diff --git a/fs/ocfs2/dlmglue.h b/fs/ocfs2/dlmglue.h index 1d5b0699d0a9..e3cf902404b4 100644 --- a/fs/ocfs2/dlmglue.h +++ b/fs/ocfs2/dlmglue.h | |||
@@ -109,8 +109,6 @@ void ocfs2_simple_drop_lockres(struct ocfs2_super *osb, | |||
109 | struct ocfs2_lock_res *lockres); | 109 | struct ocfs2_lock_res *lockres); |
110 | 110 | ||
111 | /* for the downconvert thread */ | 111 | /* for the downconvert thread */ |
112 | void ocfs2_process_blocked_lock(struct ocfs2_super *osb, | ||
113 | struct ocfs2_lock_res *lockres); | ||
114 | void ocfs2_wake_downconvert_thread(struct ocfs2_super *osb); | 112 | void ocfs2_wake_downconvert_thread(struct ocfs2_super *osb); |
115 | 113 | ||
116 | struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void); | 114 | struct ocfs2_dlm_debug *ocfs2_new_dlm_debug(void); |
diff --git a/fs/ocfs2/heartbeat.c b/fs/ocfs2/heartbeat.c index c0efd9489fe8..0758daf64da0 100644 --- a/fs/ocfs2/heartbeat.c +++ b/fs/ocfs2/heartbeat.c | |||
@@ -49,10 +49,15 @@ static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map, | |||
49 | static inline void __ocfs2_node_map_clear_bit(struct ocfs2_node_map *map, | 49 | static inline void __ocfs2_node_map_clear_bit(struct ocfs2_node_map *map, |
50 | int bit); | 50 | int bit); |
51 | static inline int __ocfs2_node_map_is_empty(struct ocfs2_node_map *map); | 51 | static inline int __ocfs2_node_map_is_empty(struct ocfs2_node_map *map); |
52 | static void __ocfs2_node_map_dup(struct ocfs2_node_map *target, | 52 | |
53 | struct ocfs2_node_map *from); | 53 | /* special case -1 for now |
54 | static void __ocfs2_node_map_set(struct ocfs2_node_map *target, | 54 | * TODO: should *really* make sure the calling func never passes -1!! */ |
55 | struct ocfs2_node_map *from); | 55 | static void ocfs2_node_map_init(struct ocfs2_node_map *map) |
56 | { | ||
57 | map->num_nodes = OCFS2_NODE_MAP_MAX_NODES; | ||
58 | memset(map->map, 0, BITS_TO_LONGS(OCFS2_NODE_MAP_MAX_NODES) * | ||
59 | sizeof(unsigned long)); | ||
60 | } | ||
56 | 61 | ||
57 | void ocfs2_init_node_maps(struct ocfs2_super *osb) | 62 | void ocfs2_init_node_maps(struct ocfs2_super *osb) |
58 | { | 63 | { |
@@ -136,15 +141,6 @@ void ocfs2_stop_heartbeat(struct ocfs2_super *osb) | |||
136 | mlog_errno(ret); | 141 | mlog_errno(ret); |
137 | } | 142 | } |
138 | 143 | ||
139 | /* special case -1 for now | ||
140 | * TODO: should *really* make sure the calling func never passes -1!! */ | ||
141 | void ocfs2_node_map_init(struct ocfs2_node_map *map) | ||
142 | { | ||
143 | map->num_nodes = OCFS2_NODE_MAP_MAX_NODES; | ||
144 | memset(map->map, 0, BITS_TO_LONGS(OCFS2_NODE_MAP_MAX_NODES) * | ||
145 | sizeof(unsigned long)); | ||
146 | } | ||
147 | |||
148 | static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map, | 144 | static inline void __ocfs2_node_map_set_bit(struct ocfs2_node_map *map, |
149 | int bit) | 145 | int bit) |
150 | { | 146 | { |
@@ -216,6 +212,8 @@ int ocfs2_node_map_is_empty(struct ocfs2_super *osb, | |||
216 | return ret; | 212 | return ret; |
217 | } | 213 | } |
218 | 214 | ||
215 | #if 0 | ||
216 | |||
219 | static void __ocfs2_node_map_dup(struct ocfs2_node_map *target, | 217 | static void __ocfs2_node_map_dup(struct ocfs2_node_map *target, |
220 | struct ocfs2_node_map *from) | 218 | struct ocfs2_node_map *from) |
221 | { | 219 | { |
@@ -254,6 +252,8 @@ static void __ocfs2_node_map_set(struct ocfs2_node_map *target, | |||
254 | target->map[i] = from->map[i]; | 252 | target->map[i] = from->map[i]; |
255 | } | 253 | } |
256 | 254 | ||
255 | #endif /* 0 */ | ||
256 | |||
257 | /* Returns whether the recovery bit was actually set - it may not be | 257 | /* Returns whether the recovery bit was actually set - it may not be |
258 | * if a node is still marked as needing recovery */ | 258 | * if a node is still marked as needing recovery */ |
259 | int ocfs2_recovery_map_set(struct ocfs2_super *osb, | 259 | int ocfs2_recovery_map_set(struct ocfs2_super *osb, |
diff --git a/fs/ocfs2/heartbeat.h b/fs/ocfs2/heartbeat.h index 56859211888a..eac63aed7611 100644 --- a/fs/ocfs2/heartbeat.h +++ b/fs/ocfs2/heartbeat.h | |||
@@ -33,7 +33,6 @@ void ocfs2_stop_heartbeat(struct ocfs2_super *osb); | |||
33 | 33 | ||
34 | /* node map functions - used to keep track of mounted and in-recovery | 34 | /* node map functions - used to keep track of mounted and in-recovery |
35 | * nodes. */ | 35 | * nodes. */ |
36 | void ocfs2_node_map_init(struct ocfs2_node_map *map); | ||
37 | int ocfs2_node_map_is_empty(struct ocfs2_super *osb, | 36 | int ocfs2_node_map_is_empty(struct ocfs2_super *osb, |
38 | struct ocfs2_node_map *map); | 37 | struct ocfs2_node_map *map); |
39 | void ocfs2_node_map_set_bit(struct ocfs2_super *osb, | 38 | void ocfs2_node_map_set_bit(struct ocfs2_super *osb, |
@@ -57,9 +56,5 @@ int ocfs2_recovery_map_set(struct ocfs2_super *osb, | |||
57 | int num); | 56 | int num); |
58 | void ocfs2_recovery_map_clear(struct ocfs2_super *osb, | 57 | void ocfs2_recovery_map_clear(struct ocfs2_super *osb, |
59 | int num); | 58 | int num); |
60 | /* returns 1 if bit is the only bit set in target, 0 otherwise */ | ||
61 | int ocfs2_node_map_is_only(struct ocfs2_super *osb, | ||
62 | struct ocfs2_node_map *target, | ||
63 | int bit); | ||
64 | 59 | ||
65 | #endif /* OCFS2_HEARTBEAT_H */ | 60 | #endif /* OCFS2_HEARTBEAT_H */ |
diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c index add1ffdc5c6c..ab83fd562429 100644 --- a/fs/ocfs2/localalloc.c +++ b/fs/ocfs2/localalloc.c | |||
@@ -120,9 +120,6 @@ int ocfs2_load_local_alloc(struct ocfs2_super *osb) | |||
120 | 120 | ||
121 | mlog_entry_void(); | 121 | mlog_entry_void(); |
122 | 122 | ||
123 | if (ocfs2_mount_local(osb)) | ||
124 | goto bail; | ||
125 | |||
126 | if (osb->local_alloc_size == 0) | 123 | if (osb->local_alloc_size == 0) |
127 | goto bail; | 124 | goto bail; |
128 | 125 | ||
@@ -588,8 +585,7 @@ int ocfs2_claim_local_alloc_bits(struct ocfs2_super *osb, | |||
588 | while(bits_wanted--) | 585 | while(bits_wanted--) |
589 | ocfs2_set_bit(start++, bitmap); | 586 | ocfs2_set_bit(start++, bitmap); |
590 | 587 | ||
591 | alloc->id1.bitmap1.i_used = cpu_to_le32(*num_bits + | 588 | le32_add_cpu(&alloc->id1.bitmap1.i_used, *num_bits); |
592 | le32_to_cpu(alloc->id1.bitmap1.i_used)); | ||
593 | 589 | ||
594 | status = ocfs2_journal_dirty(handle, osb->local_alloc_bh); | 590 | status = ocfs2_journal_dirty(handle, osb->local_alloc_bh); |
595 | if (status < 0) { | 591 | if (status < 0) { |
diff --git a/fs/ocfs2/resize.c b/fs/ocfs2/resize.c index 37835ffcb039..8166968e9015 100644 --- a/fs/ocfs2/resize.c +++ b/fs/ocfs2/resize.c | |||
@@ -597,7 +597,7 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input) | |||
597 | memset(cr, 0, sizeof(struct ocfs2_chain_rec)); | 597 | memset(cr, 0, sizeof(struct ocfs2_chain_rec)); |
598 | } | 598 | } |
599 | 599 | ||
600 | cr->c_blkno = le64_to_cpu(input->group); | 600 | cr->c_blkno = cpu_to_le64(input->group); |
601 | le32_add_cpu(&cr->c_total, input->clusters * cl_bpc); | 601 | le32_add_cpu(&cr->c_total, input->clusters * cl_bpc); |
602 | le32_add_cpu(&cr->c_free, input->frees * cl_bpc); | 602 | le32_add_cpu(&cr->c_free, input->frees * cl_bpc); |
603 | 603 | ||
diff --git a/fs/proc/base.c b/fs/proc/base.c index 3217774d269f..9a4da0aae02e 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -314,9 +314,12 @@ static int proc_pid_schedstat(struct task_struct *task, char *buffer) | |||
314 | static int lstats_show_proc(struct seq_file *m, void *v) | 314 | static int lstats_show_proc(struct seq_file *m, void *v) |
315 | { | 315 | { |
316 | int i; | 316 | int i; |
317 | struct task_struct *task = m->private; | 317 | struct inode *inode = m->private; |
318 | seq_puts(m, "Latency Top version : v0.1\n"); | 318 | struct task_struct *task = get_proc_task(inode); |
319 | 319 | ||
320 | if (!task) | ||
321 | return -ESRCH; | ||
322 | seq_puts(m, "Latency Top version : v0.1\n"); | ||
320 | for (i = 0; i < 32; i++) { | 323 | for (i = 0; i < 32; i++) { |
321 | if (task->latency_record[i].backtrace[0]) { | 324 | if (task->latency_record[i].backtrace[0]) { |
322 | int q; | 325 | int q; |
@@ -341,32 +344,24 @@ static int lstats_show_proc(struct seq_file *m, void *v) | |||
341 | } | 344 | } |
342 | 345 | ||
343 | } | 346 | } |
347 | put_task_struct(task); | ||
344 | return 0; | 348 | return 0; |
345 | } | 349 | } |
346 | 350 | ||
347 | static int lstats_open(struct inode *inode, struct file *file) | 351 | static int lstats_open(struct inode *inode, struct file *file) |
348 | { | 352 | { |
349 | int ret; | 353 | return single_open(file, lstats_show_proc, inode); |
350 | struct seq_file *m; | ||
351 | struct task_struct *task = get_proc_task(inode); | ||
352 | |||
353 | ret = single_open(file, lstats_show_proc, NULL); | ||
354 | if (!ret) { | ||
355 | m = file->private_data; | ||
356 | m->private = task; | ||
357 | } | ||
358 | return ret; | ||
359 | } | 354 | } |
360 | 355 | ||
361 | static ssize_t lstats_write(struct file *file, const char __user *buf, | 356 | static ssize_t lstats_write(struct file *file, const char __user *buf, |
362 | size_t count, loff_t *offs) | 357 | size_t count, loff_t *offs) |
363 | { | 358 | { |
364 | struct seq_file *m; | 359 | struct task_struct *task = get_proc_task(file->f_dentry->d_inode); |
365 | struct task_struct *task; | ||
366 | 360 | ||
367 | m = file->private_data; | 361 | if (!task) |
368 | task = m->private; | 362 | return -ESRCH; |
369 | clear_all_latency_tracing(task); | 363 | clear_all_latency_tracing(task); |
364 | put_task_struct(task); | ||
370 | 365 | ||
371 | return count; | 366 | return count; |
372 | } | 367 | } |
diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c index 468805d40e2b..2d563979cb02 100644 --- a/fs/proc/proc_misc.c +++ b/fs/proc/proc_misc.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/interrupt.h> | 32 | #include <linux/interrupt.h> |
33 | #include <linux/swap.h> | 33 | #include <linux/swap.h> |
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <linux/genhd.h> | ||
35 | #include <linux/smp.h> | 36 | #include <linux/smp.h> |
36 | #include <linux/signal.h> | 37 | #include <linux/signal.h> |
37 | #include <linux/module.h> | 38 | #include <linux/module.h> |
@@ -377,7 +378,6 @@ static int stram_read_proc(char *page, char **start, off_t off, | |||
377 | #endif | 378 | #endif |
378 | 379 | ||
379 | #ifdef CONFIG_BLOCK | 380 | #ifdef CONFIG_BLOCK |
380 | extern const struct seq_operations partitions_op; | ||
381 | static int partitions_open(struct inode *inode, struct file *file) | 381 | static int partitions_open(struct inode *inode, struct file *file) |
382 | { | 382 | { |
383 | return seq_open(file, &partitions_op); | 383 | return seq_open(file, &partitions_op); |
@@ -389,7 +389,6 @@ static const struct file_operations proc_partitions_operations = { | |||
389 | .release = seq_release, | 389 | .release = seq_release, |
390 | }; | 390 | }; |
391 | 391 | ||
392 | extern const struct seq_operations diskstats_op; | ||
393 | static int diskstats_open(struct inode *inode, struct file *file) | 392 | static int diskstats_open(struct inode *inode, struct file *file) |
394 | { | 393 | { |
395 | return seq_open(file, &diskstats_op); | 394 | return seq_open(file, &diskstats_op); |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 6dc0334815f7..4206454734e0 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -640,17 +640,17 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | |||
640 | 640 | ||
641 | ret = -EACCES; | 641 | ret = -EACCES; |
642 | if (!ptrace_may_attach(task)) | 642 | if (!ptrace_may_attach(task)) |
643 | goto out; | 643 | goto out_task; |
644 | 644 | ||
645 | ret = -EINVAL; | 645 | ret = -EINVAL; |
646 | /* file position must be aligned */ | 646 | /* file position must be aligned */ |
647 | if (*ppos % PM_ENTRY_BYTES) | 647 | if (*ppos % PM_ENTRY_BYTES) |
648 | goto out; | 648 | goto out_task; |
649 | 649 | ||
650 | ret = 0; | 650 | ret = 0; |
651 | mm = get_task_mm(task); | 651 | mm = get_task_mm(task); |
652 | if (!mm) | 652 | if (!mm) |
653 | goto out; | 653 | goto out_task; |
654 | 654 | ||
655 | ret = -ENOMEM; | 655 | ret = -ENOMEM; |
656 | uaddr = (unsigned long)buf & PAGE_MASK; | 656 | uaddr = (unsigned long)buf & PAGE_MASK; |
@@ -658,7 +658,7 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | |||
658 | pagecount = (PAGE_ALIGN(uend) - uaddr) / PAGE_SIZE; | 658 | pagecount = (PAGE_ALIGN(uend) - uaddr) / PAGE_SIZE; |
659 | pages = kmalloc(pagecount * sizeof(struct page *), GFP_KERNEL); | 659 | pages = kmalloc(pagecount * sizeof(struct page *), GFP_KERNEL); |
660 | if (!pages) | 660 | if (!pages) |
661 | goto out_task; | 661 | goto out_mm; |
662 | 662 | ||
663 | down_read(¤t->mm->mmap_sem); | 663 | down_read(¤t->mm->mmap_sem); |
664 | ret = get_user_pages(current, current->mm, uaddr, pagecount, | 664 | ret = get_user_pages(current, current->mm, uaddr, pagecount, |
@@ -668,6 +668,12 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | |||
668 | if (ret < 0) | 668 | if (ret < 0) |
669 | goto out_free; | 669 | goto out_free; |
670 | 670 | ||
671 | if (ret != pagecount) { | ||
672 | pagecount = ret; | ||
673 | ret = -EFAULT; | ||
674 | goto out_pages; | ||
675 | } | ||
676 | |||
671 | pm.out = buf; | 677 | pm.out = buf; |
672 | pm.end = buf + count; | 678 | pm.end = buf + count; |
673 | 679 | ||
@@ -699,15 +705,17 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, | |||
699 | ret = pm.out - buf; | 705 | ret = pm.out - buf; |
700 | } | 706 | } |
701 | 707 | ||
708 | out_pages: | ||
702 | for (; pagecount; pagecount--) { | 709 | for (; pagecount; pagecount--) { |
703 | page = pages[pagecount-1]; | 710 | page = pages[pagecount-1]; |
704 | if (!PageReserved(page)) | 711 | if (!PageReserved(page)) |
705 | SetPageDirty(page); | 712 | SetPageDirty(page); |
706 | page_cache_release(page); | 713 | page_cache_release(page); |
707 | } | 714 | } |
708 | mmput(mm); | ||
709 | out_free: | 715 | out_free: |
710 | kfree(pages); | 716 | kfree(pages); |
717 | out_mm: | ||
718 | mmput(mm); | ||
711 | out_task: | 719 | out_task: |
712 | put_task_struct(task); | 720 | put_task_struct(task); |
713 | out: | 721 | out: |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 6841452e0dea..393cc22c1717 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
@@ -2031,7 +2031,7 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, | |||
2031 | return -EXDEV; | 2031 | return -EXDEV; |
2032 | } | 2032 | } |
2033 | /* We must not pack tails for quota files on reiserfs for quota IO to work */ | 2033 | /* We must not pack tails for quota files on reiserfs for quota IO to work */ |
2034 | if (!REISERFS_I(nd.path.dentry->d_inode)->i_flags & i_nopack_mask) { | 2034 | if (!(REISERFS_I(nd.path.dentry->d_inode)->i_flags & i_nopack_mask)) { |
2035 | reiserfs_warning(sb, | 2035 | reiserfs_warning(sb, |
2036 | "reiserfs: Quota file must have tail packing disabled."); | 2036 | "reiserfs: Quota file must have tail packing disabled."); |
2037 | path_put(&nd.path); | 2037 | path_put(&nd.path); |
diff --git a/fs/splice.c b/fs/splice.c index 9b559ee711a8..0670c915cd35 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -1669,6 +1669,13 @@ static int link_pipe(struct pipe_inode_info *ipipe, | |||
1669 | i++; | 1669 | i++; |
1670 | } while (len); | 1670 | } while (len); |
1671 | 1671 | ||
1672 | /* | ||
1673 | * return EAGAIN if we have the potential of some data in the | ||
1674 | * future, otherwise just return 0 | ||
1675 | */ | ||
1676 | if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK)) | ||
1677 | ret = -EAGAIN; | ||
1678 | |||
1672 | inode_double_unlock(ipipe->inode, opipe->inode); | 1679 | inode_double_unlock(ipipe->inode, opipe->inode); |
1673 | 1680 | ||
1674 | /* | 1681 | /* |
@@ -1709,11 +1716,8 @@ static long do_tee(struct file *in, struct file *out, size_t len, | |||
1709 | ret = link_ipipe_prep(ipipe, flags); | 1716 | ret = link_ipipe_prep(ipipe, flags); |
1710 | if (!ret) { | 1717 | if (!ret) { |
1711 | ret = link_opipe_prep(opipe, flags); | 1718 | ret = link_opipe_prep(opipe, flags); |
1712 | if (!ret) { | 1719 | if (!ret) |
1713 | ret = link_pipe(ipipe, opipe, len, flags); | 1720 | ret = link_pipe(ipipe, opipe, len, flags); |
1714 | if (!ret && (flags & SPLICE_F_NONBLOCK)) | ||
1715 | ret = -EAGAIN; | ||
1716 | } | ||
1717 | } | 1721 | } |
1718 | } | 1722 | } |
1719 | 1723 | ||
diff --git a/fs/super.c b/fs/super.c index 88811f60c8de..010446d8c40a 100644 --- a/fs/super.c +++ b/fs/super.c | |||
@@ -870,12 +870,12 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void | |||
870 | if (!mnt) | 870 | if (!mnt) |
871 | goto out; | 871 | goto out; |
872 | 872 | ||
873 | if (data) { | 873 | if (data && !(type->fs_flags & FS_BINARY_MOUNTDATA)) { |
874 | secdata = alloc_secdata(); | 874 | secdata = alloc_secdata(); |
875 | if (!secdata) | 875 | if (!secdata) |
876 | goto out_mnt; | 876 | goto out_mnt; |
877 | 877 | ||
878 | error = security_sb_copy_data(type, data, secdata); | 878 | error = security_sb_copy_data(data, secdata); |
879 | if (error) | 879 | if (error) |
880 | goto out_free_secdata; | 880 | goto out_free_secdata; |
881 | } | 881 | } |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 21dfc9da235e..8831d9518790 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -171,7 +171,7 @@ xfs_parseargs( | |||
171 | char *this_char, *value, *eov; | 171 | char *this_char, *value, *eov; |
172 | int dsunit, dswidth, vol_dsunit, vol_dswidth; | 172 | int dsunit, dswidth, vol_dsunit, vol_dswidth; |
173 | int iosize; | 173 | int iosize; |
174 | int ikeep = 0; | 174 | int dmapi_implies_ikeep = 1; |
175 | 175 | ||
176 | args->flags |= XFSMNT_BARRIER; | 176 | args->flags |= XFSMNT_BARRIER; |
177 | args->flags2 |= XFSMNT2_COMPAT_IOSIZE; | 177 | args->flags2 |= XFSMNT2_COMPAT_IOSIZE; |
@@ -302,10 +302,10 @@ xfs_parseargs( | |||
302 | } else if (!strcmp(this_char, MNTOPT_NOBARRIER)) { | 302 | } else if (!strcmp(this_char, MNTOPT_NOBARRIER)) { |
303 | args->flags &= ~XFSMNT_BARRIER; | 303 | args->flags &= ~XFSMNT_BARRIER; |
304 | } else if (!strcmp(this_char, MNTOPT_IKEEP)) { | 304 | } else if (!strcmp(this_char, MNTOPT_IKEEP)) { |
305 | ikeep = 1; | 305 | args->flags |= XFSMNT_IKEEP; |
306 | args->flags &= ~XFSMNT_IDELETE; | ||
307 | } else if (!strcmp(this_char, MNTOPT_NOIKEEP)) { | 306 | } else if (!strcmp(this_char, MNTOPT_NOIKEEP)) { |
308 | args->flags |= XFSMNT_IDELETE; | 307 | dmapi_implies_ikeep = 0; |
308 | args->flags &= ~XFSMNT_IKEEP; | ||
309 | } else if (!strcmp(this_char, MNTOPT_LARGEIO)) { | 309 | } else if (!strcmp(this_char, MNTOPT_LARGEIO)) { |
310 | args->flags2 &= ~XFSMNT2_COMPAT_IOSIZE; | 310 | args->flags2 &= ~XFSMNT2_COMPAT_IOSIZE; |
311 | } else if (!strcmp(this_char, MNTOPT_NOLARGEIO)) { | 311 | } else if (!strcmp(this_char, MNTOPT_NOLARGEIO)) { |
@@ -410,8 +410,8 @@ xfs_parseargs( | |||
410 | * Note that if "ikeep" or "noikeep" mount options are | 410 | * Note that if "ikeep" or "noikeep" mount options are |
411 | * supplied, then they are honored. | 411 | * supplied, then they are honored. |
412 | */ | 412 | */ |
413 | if (!(args->flags & XFSMNT_DMAPI) && !ikeep) | 413 | if ((args->flags & XFSMNT_DMAPI) && dmapi_implies_ikeep) |
414 | args->flags |= XFSMNT_IDELETE; | 414 | args->flags |= XFSMNT_IKEEP; |
415 | 415 | ||
416 | if ((args->flags & XFSMNT_NOALIGN) != XFSMNT_NOALIGN) { | 416 | if ((args->flags & XFSMNT_NOALIGN) != XFSMNT_NOALIGN) { |
417 | if (dsunit) { | 417 | if (dsunit) { |
@@ -446,6 +446,7 @@ xfs_showargs( | |||
446 | { | 446 | { |
447 | static struct proc_xfs_info xfs_info_set[] = { | 447 | static struct proc_xfs_info xfs_info_set[] = { |
448 | /* the few simple ones we can get from the mount struct */ | 448 | /* the few simple ones we can get from the mount struct */ |
449 | { XFS_MOUNT_IKEEP, "," MNTOPT_IKEEP }, | ||
449 | { XFS_MOUNT_WSYNC, "," MNTOPT_WSYNC }, | 450 | { XFS_MOUNT_WSYNC, "," MNTOPT_WSYNC }, |
450 | { XFS_MOUNT_INO64, "," MNTOPT_INO64 }, | 451 | { XFS_MOUNT_INO64, "," MNTOPT_INO64 }, |
451 | { XFS_MOUNT_NOALIGN, "," MNTOPT_NOALIGN }, | 452 | { XFS_MOUNT_NOALIGN, "," MNTOPT_NOALIGN }, |
@@ -461,7 +462,6 @@ xfs_showargs( | |||
461 | }; | 462 | }; |
462 | static struct proc_xfs_info xfs_info_unset[] = { | 463 | static struct proc_xfs_info xfs_info_unset[] = { |
463 | /* the few simple ones we can get from the mount struct */ | 464 | /* the few simple ones we can get from the mount struct */ |
464 | { XFS_MOUNT_IDELETE, "," MNTOPT_IKEEP }, | ||
465 | { XFS_MOUNT_COMPAT_IOSIZE, "," MNTOPT_LARGEIO }, | 465 | { XFS_MOUNT_COMPAT_IOSIZE, "," MNTOPT_LARGEIO }, |
466 | { XFS_MOUNT_BARRIER, "," MNTOPT_NOBARRIER }, | 466 | { XFS_MOUNT_BARRIER, "," MNTOPT_NOBARRIER }, |
467 | { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_64BITINODE }, | 467 | { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_64BITINODE }, |
diff --git a/fs/xfs/xfs_bit.c b/fs/xfs/xfs_bit.c index 48228848f5ae..fab0b6d5a41b 100644 --- a/fs/xfs/xfs_bit.c +++ b/fs/xfs/xfs_bit.c | |||
@@ -25,6 +25,109 @@ | |||
25 | * XFS bit manipulation routines, used in non-realtime code. | 25 | * XFS bit manipulation routines, used in non-realtime code. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | #ifndef HAVE_ARCH_HIGHBIT | ||
29 | /* | ||
30 | * Index of high bit number in byte, -1 for none set, 0..7 otherwise. | ||
31 | */ | ||
32 | static const char xfs_highbit[256] = { | ||
33 | -1, 0, 1, 1, 2, 2, 2, 2, /* 00 .. 07 */ | ||
34 | 3, 3, 3, 3, 3, 3, 3, 3, /* 08 .. 0f */ | ||
35 | 4, 4, 4, 4, 4, 4, 4, 4, /* 10 .. 17 */ | ||
36 | 4, 4, 4, 4, 4, 4, 4, 4, /* 18 .. 1f */ | ||
37 | 5, 5, 5, 5, 5, 5, 5, 5, /* 20 .. 27 */ | ||
38 | 5, 5, 5, 5, 5, 5, 5, 5, /* 28 .. 2f */ | ||
39 | 5, 5, 5, 5, 5, 5, 5, 5, /* 30 .. 37 */ | ||
40 | 5, 5, 5, 5, 5, 5, 5, 5, /* 38 .. 3f */ | ||
41 | 6, 6, 6, 6, 6, 6, 6, 6, /* 40 .. 47 */ | ||
42 | 6, 6, 6, 6, 6, 6, 6, 6, /* 48 .. 4f */ | ||
43 | 6, 6, 6, 6, 6, 6, 6, 6, /* 50 .. 57 */ | ||
44 | 6, 6, 6, 6, 6, 6, 6, 6, /* 58 .. 5f */ | ||
45 | 6, 6, 6, 6, 6, 6, 6, 6, /* 60 .. 67 */ | ||
46 | 6, 6, 6, 6, 6, 6, 6, 6, /* 68 .. 6f */ | ||
47 | 6, 6, 6, 6, 6, 6, 6, 6, /* 70 .. 77 */ | ||
48 | 6, 6, 6, 6, 6, 6, 6, 6, /* 78 .. 7f */ | ||
49 | 7, 7, 7, 7, 7, 7, 7, 7, /* 80 .. 87 */ | ||
50 | 7, 7, 7, 7, 7, 7, 7, 7, /* 88 .. 8f */ | ||
51 | 7, 7, 7, 7, 7, 7, 7, 7, /* 90 .. 97 */ | ||
52 | 7, 7, 7, 7, 7, 7, 7, 7, /* 98 .. 9f */ | ||
53 | 7, 7, 7, 7, 7, 7, 7, 7, /* a0 .. a7 */ | ||
54 | 7, 7, 7, 7, 7, 7, 7, 7, /* a8 .. af */ | ||
55 | 7, 7, 7, 7, 7, 7, 7, 7, /* b0 .. b7 */ | ||
56 | 7, 7, 7, 7, 7, 7, 7, 7, /* b8 .. bf */ | ||
57 | 7, 7, 7, 7, 7, 7, 7, 7, /* c0 .. c7 */ | ||
58 | 7, 7, 7, 7, 7, 7, 7, 7, /* c8 .. cf */ | ||
59 | 7, 7, 7, 7, 7, 7, 7, 7, /* d0 .. d7 */ | ||
60 | 7, 7, 7, 7, 7, 7, 7, 7, /* d8 .. df */ | ||
61 | 7, 7, 7, 7, 7, 7, 7, 7, /* e0 .. e7 */ | ||
62 | 7, 7, 7, 7, 7, 7, 7, 7, /* e8 .. ef */ | ||
63 | 7, 7, 7, 7, 7, 7, 7, 7, /* f0 .. f7 */ | ||
64 | 7, 7, 7, 7, 7, 7, 7, 7, /* f8 .. ff */ | ||
65 | }; | ||
66 | #endif | ||
67 | |||
68 | /* | ||
69 | * xfs_highbit32: get high bit set out of 32-bit argument, -1 if none set. | ||
70 | */ | ||
71 | inline int | ||
72 | xfs_highbit32( | ||
73 | __uint32_t v) | ||
74 | { | ||
75 | #ifdef HAVE_ARCH_HIGHBIT | ||
76 | return highbit32(v); | ||
77 | #else | ||
78 | int i; | ||
79 | |||
80 | if (v & 0xffff0000) | ||
81 | if (v & 0xff000000) | ||
82 | i = 24; | ||
83 | else | ||
84 | i = 16; | ||
85 | else if (v & 0x0000ffff) | ||
86 | if (v & 0x0000ff00) | ||
87 | i = 8; | ||
88 | else | ||
89 | i = 0; | ||
90 | else | ||
91 | return -1; | ||
92 | return i + xfs_highbit[(v >> i) & 0xff]; | ||
93 | #endif | ||
94 | } | ||
95 | |||
96 | /* | ||
97 | * xfs_lowbit64: get low bit set out of 64-bit argument, -1 if none set. | ||
98 | */ | ||
99 | int | ||
100 | xfs_lowbit64( | ||
101 | __uint64_t v) | ||
102 | { | ||
103 | __uint32_t w = (__uint32_t)v; | ||
104 | int n = 0; | ||
105 | |||
106 | if (w) { /* lower bits */ | ||
107 | n = ffs(w); | ||
108 | } else { /* upper bits */ | ||
109 | w = (__uint32_t)(v >> 32); | ||
110 | if (w && (n = ffs(w))) | ||
111 | n += 32; | ||
112 | } | ||
113 | return n - 1; | ||
114 | } | ||
115 | |||
116 | /* | ||
117 | * xfs_highbit64: get high bit set out of 64-bit argument, -1 if none set. | ||
118 | */ | ||
119 | int | ||
120 | xfs_highbit64( | ||
121 | __uint64_t v) | ||
122 | { | ||
123 | __uint32_t h = (__uint32_t)(v >> 32); | ||
124 | |||
125 | if (h) | ||
126 | return xfs_highbit32(h) + 32; | ||
127 | return xfs_highbit32((__uint32_t)v); | ||
128 | } | ||
129 | |||
130 | |||
28 | /* | 131 | /* |
29 | * Return whether bitmap is empty. | 132 | * Return whether bitmap is empty. |
30 | * Size is number of words in the bitmap, which is padded to word boundary | 133 | * Size is number of words in the bitmap, which is padded to word boundary |
diff --git a/fs/xfs/xfs_bit.h b/fs/xfs/xfs_bit.h index 325a007dec91..082641a9782c 100644 --- a/fs/xfs/xfs_bit.h +++ b/fs/xfs/xfs_bit.h | |||
@@ -47,30 +47,13 @@ static inline __uint64_t xfs_mask64lo(int n) | |||
47 | } | 47 | } |
48 | 48 | ||
49 | /* Get high bit set out of 32-bit argument, -1 if none set */ | 49 | /* Get high bit set out of 32-bit argument, -1 if none set */ |
50 | static inline int xfs_highbit32(__uint32_t v) | 50 | extern int xfs_highbit32(__uint32_t v); |
51 | { | ||
52 | return fls(v) - 1; | ||
53 | } | ||
54 | |||
55 | /* Get high bit set out of 64-bit argument, -1 if none set */ | ||
56 | static inline int xfs_highbit64(__uint64_t v) | ||
57 | { | ||
58 | return fls64(v) - 1; | ||
59 | } | ||
60 | |||
61 | /* Get low bit set out of 32-bit argument, -1 if none set */ | ||
62 | static inline int xfs_lowbit32(__uint32_t v) | ||
63 | { | ||
64 | __uint32_t t = v; | ||
65 | return (t) ? find_first_bit((unsigned long *)&t, 32) : -1; | ||
66 | } | ||
67 | 51 | ||
68 | /* Get low bit set out of 64-bit argument, -1 if none set */ | 52 | /* Get low bit set out of 64-bit argument, -1 if none set */ |
69 | static inline int xfs_lowbit64(__uint64_t v) | 53 | extern int xfs_lowbit64(__uint64_t v); |
70 | { | 54 | |
71 | __uint64_t t = v; | 55 | /* Get high bit set out of 64-bit argument, -1 if none set */ |
72 | return (t) ? find_first_bit((unsigned long *)&t, 64) : -1; | 56 | extern int xfs_highbit64(__uint64_t); |
73 | } | ||
74 | 57 | ||
75 | /* Return whether bitmap is empty (1 == empty) */ | 58 | /* Return whether bitmap is empty (1 == empty) */ |
76 | extern int xfs_bitmap_empty(uint *map, uint size); | 59 | extern int xfs_bitmap_empty(uint *map, uint size); |
diff --git a/fs/xfs/xfs_clnt.h b/fs/xfs/xfs_clnt.h index d16c1b971074..d5d1e60ee224 100644 --- a/fs/xfs/xfs_clnt.h +++ b/fs/xfs/xfs_clnt.h | |||
@@ -86,7 +86,7 @@ struct xfs_mount_args { | |||
86 | #define XFSMNT_NOUUID 0x01000000 /* Ignore fs uuid */ | 86 | #define XFSMNT_NOUUID 0x01000000 /* Ignore fs uuid */ |
87 | #define XFSMNT_DMAPI 0x02000000 /* enable dmapi/xdsm */ | 87 | #define XFSMNT_DMAPI 0x02000000 /* enable dmapi/xdsm */ |
88 | #define XFSMNT_BARRIER 0x04000000 /* use write barriers */ | 88 | #define XFSMNT_BARRIER 0x04000000 /* use write barriers */ |
89 | #define XFSMNT_IDELETE 0x08000000 /* inode cluster delete */ | 89 | #define XFSMNT_IKEEP 0x08000000 /* inode cluster delete */ |
90 | #define XFSMNT_SWALLOC 0x10000000 /* turn on stripe width | 90 | #define XFSMNT_SWALLOC 0x10000000 /* turn on stripe width |
91 | * allocation */ | 91 | * allocation */ |
92 | #define XFSMNT_DIRSYNC 0x40000000 /* sync creat,link,unlink,rename | 92 | #define XFSMNT_DIRSYNC 0x40000000 /* sync creat,link,unlink,rename |
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index c5836b951d0c..db9d5fa600af 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c | |||
@@ -1053,7 +1053,7 @@ xfs_difree( | |||
1053 | /* | 1053 | /* |
1054 | * When an inode cluster is free, it becomes eligible for removal | 1054 | * When an inode cluster is free, it becomes eligible for removal |
1055 | */ | 1055 | */ |
1056 | if ((mp->m_flags & XFS_MOUNT_IDELETE) && | 1056 | if (!(mp->m_flags & XFS_MOUNT_IKEEP) && |
1057 | (rec.ir_freecount == XFS_IALLOC_INODES(mp))) { | 1057 | (rec.ir_freecount == XFS_IALLOC_INODES(mp))) { |
1058 | 1058 | ||
1059 | *delete = 1; | 1059 | *delete = 1; |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index f01b07687faf..8e09b71f4104 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
@@ -235,6 +235,7 @@ finish_inode: | |||
235 | */ | 235 | */ |
236 | new_icl = kmem_zone_alloc(xfs_icluster_zone, KM_SLEEP); | 236 | new_icl = kmem_zone_alloc(xfs_icluster_zone, KM_SLEEP); |
237 | if (radix_tree_preload(GFP_KERNEL)) { | 237 | if (radix_tree_preload(GFP_KERNEL)) { |
238 | xfs_idestroy(ip); | ||
238 | delay(1); | 239 | delay(1); |
239 | goto again; | 240 | goto again; |
240 | } | 241 | } |
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index f7c620ec6e69..1d8a4728d847 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h | |||
@@ -366,7 +366,7 @@ typedef struct xfs_mount { | |||
366 | #define XFS_MOUNT_SMALL_INUMS (1ULL << 15) /* users wants 32bit inodes */ | 366 | #define XFS_MOUNT_SMALL_INUMS (1ULL << 15) /* users wants 32bit inodes */ |
367 | #define XFS_MOUNT_NOUUID (1ULL << 16) /* ignore uuid during mount */ | 367 | #define XFS_MOUNT_NOUUID (1ULL << 16) /* ignore uuid during mount */ |
368 | #define XFS_MOUNT_BARRIER (1ULL << 17) | 368 | #define XFS_MOUNT_BARRIER (1ULL << 17) |
369 | #define XFS_MOUNT_IDELETE (1ULL << 18) /* delete empty inode clusters*/ | 369 | #define XFS_MOUNT_IKEEP (1ULL << 18) /* keep empty inode clusters*/ |
370 | #define XFS_MOUNT_SWALLOC (1ULL << 19) /* turn on stripe width | 370 | #define XFS_MOUNT_SWALLOC (1ULL << 19) /* turn on stripe width |
371 | * allocation */ | 371 | * allocation */ |
372 | #define XFS_MOUNT_RDONLY (1ULL << 20) /* read-only fs */ | 372 | #define XFS_MOUNT_RDONLY (1ULL << 20) /* read-only fs */ |
diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index ca83ddf72af4..47082c01872d 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c | |||
@@ -73,6 +73,18 @@ STATIC int xfs_rtmodify_summary(xfs_mount_t *, xfs_trans_t *, int, | |||
73 | */ | 73 | */ |
74 | 74 | ||
75 | /* | 75 | /* |
76 | * xfs_lowbit32: get low bit set out of 32-bit argument, -1 if none set. | ||
77 | */ | ||
78 | STATIC int | ||
79 | xfs_lowbit32( | ||
80 | __uint32_t v) | ||
81 | { | ||
82 | if (v) | ||
83 | return ffs(v) - 1; | ||
84 | return -1; | ||
85 | } | ||
86 | |||
87 | /* | ||
76 | * Allocate space to the bitmap or summary file, and zero it, for growfs. | 88 | * Allocate space to the bitmap or summary file, and zero it, for growfs. |
77 | */ | 89 | */ |
78 | STATIC int /* error */ | 90 | STATIC int /* error */ |
@@ -432,7 +444,6 @@ xfs_rtallocate_extent_near( | |||
432 | } | 444 | } |
433 | bbno = XFS_BITTOBLOCK(mp, bno); | 445 | bbno = XFS_BITTOBLOCK(mp, bno); |
434 | i = 0; | 446 | i = 0; |
435 | ASSERT(minlen != 0); | ||
436 | log2len = xfs_highbit32(minlen); | 447 | log2len = xfs_highbit32(minlen); |
437 | /* | 448 | /* |
438 | * Loop over all bitmap blocks (bbno + i is current block). | 449 | * Loop over all bitmap blocks (bbno + i is current block). |
@@ -601,8 +612,6 @@ xfs_rtallocate_extent_size( | |||
601 | xfs_suminfo_t sum; /* summary information for extents */ | 612 | xfs_suminfo_t sum; /* summary information for extents */ |
602 | 613 | ||
603 | ASSERT(minlen % prod == 0 && maxlen % prod == 0); | 614 | ASSERT(minlen % prod == 0 && maxlen % prod == 0); |
604 | ASSERT(maxlen != 0); | ||
605 | |||
606 | /* | 615 | /* |
607 | * Loop over all the levels starting with maxlen. | 616 | * Loop over all the levels starting with maxlen. |
608 | * At each level, look at all the bitmap blocks, to see if there | 617 | * At each level, look at all the bitmap blocks, to see if there |
@@ -660,9 +669,6 @@ xfs_rtallocate_extent_size( | |||
660 | *rtblock = NULLRTBLOCK; | 669 | *rtblock = NULLRTBLOCK; |
661 | return 0; | 670 | return 0; |
662 | } | 671 | } |
663 | ASSERT(minlen != 0); | ||
664 | ASSERT(maxlen != 0); | ||
665 | |||
666 | /* | 672 | /* |
667 | * Loop over sizes, from maxlen down to minlen. | 673 | * Loop over sizes, from maxlen down to minlen. |
668 | * This time, when we do the allocations, allow smaller ones | 674 | * This time, when we do the allocations, allow smaller ones |
@@ -1948,7 +1954,6 @@ xfs_growfs_rt( | |||
1948 | nsbp->sb_blocksize * nsbp->sb_rextsize); | 1954 | nsbp->sb_blocksize * nsbp->sb_rextsize); |
1949 | nsbp->sb_rextents = nsbp->sb_rblocks; | 1955 | nsbp->sb_rextents = nsbp->sb_rblocks; |
1950 | do_div(nsbp->sb_rextents, nsbp->sb_rextsize); | 1956 | do_div(nsbp->sb_rextents, nsbp->sb_rextsize); |
1951 | ASSERT(nsbp->sb_rextents != 0); | ||
1952 | nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents); | 1957 | nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents); |
1953 | nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1; | 1958 | nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1; |
1954 | nrsumsize = | 1959 | nrsumsize = |
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 4d6330eddc8d..76d470d8a1e6 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c | |||
@@ -261,16 +261,19 @@ xfsaild_push( | |||
261 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); | 261 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); |
262 | } | 262 | } |
263 | 263 | ||
264 | /* | 264 | if (!count) { |
265 | * We reached the target so wait a bit longer for I/O to complete and | 265 | /* We're past our target or empty, so idle */ |
266 | * remove pushed items from the AIL before we start the next scan from | 266 | tout = 1000; |
267 | * the start of the AIL. | 267 | } else if (XFS_LSN_CMP(lsn, target) >= 0) { |
268 | */ | 268 | /* |
269 | if ((XFS_LSN_CMP(lsn, target) >= 0)) { | 269 | * We reached the target so wait a bit longer for I/O to |
270 | * complete and remove pushed items from the AIL before we | ||
271 | * start the next scan from the start of the AIL. | ||
272 | */ | ||
270 | tout += 20; | 273 | tout += 20; |
271 | last_pushed_lsn = 0; | 274 | last_pushed_lsn = 0; |
272 | } else if ((restarts > XFS_TRANS_PUSH_AIL_RESTARTS) || | 275 | } else if ((restarts > XFS_TRANS_PUSH_AIL_RESTARTS) || |
273 | (count && ((stuck * 100) / count > 90))) { | 276 | ((stuck * 100) / count > 90)) { |
274 | /* | 277 | /* |
275 | * Either there is a lot of contention on the AIL or we | 278 | * Either there is a lot of contention on the AIL or we |
276 | * are stuck due to operations in progress. "Stuck" in this | 279 | * are stuck due to operations in progress. "Stuck" in this |
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index 413587f02155..7321304a69cc 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
@@ -281,8 +281,8 @@ xfs_start_flags( | |||
281 | mp->m_readio_log = mp->m_writeio_log = ap->iosizelog; | 281 | mp->m_readio_log = mp->m_writeio_log = ap->iosizelog; |
282 | } | 282 | } |
283 | 283 | ||
284 | if (ap->flags & XFSMNT_IDELETE) | 284 | if (ap->flags & XFSMNT_IKEEP) |
285 | mp->m_flags |= XFS_MOUNT_IDELETE; | 285 | mp->m_flags |= XFS_MOUNT_IKEEP; |
286 | if (ap->flags & XFSMNT_DIRSYNC) | 286 | if (ap->flags & XFSMNT_DIRSYNC) |
287 | mp->m_flags |= XFS_MOUNT_DIRSYNC; | 287 | mp->m_flags |= XFS_MOUNT_DIRSYNC; |
288 | if (ap->flags & XFSMNT_ATTR2) | 288 | if (ap->flags & XFSMNT_ATTR2) |
diff --git a/include/asm-arm/arch-omap/board-h3.h b/include/asm-arm/arch-omap/board-h3.h index 1c2b55c61ca0..0f6404435ea8 100644 --- a/include/asm-arm/arch-omap/board-h3.h +++ b/include/asm-arm/arch-omap/board-h3.h | |||
@@ -36,7 +36,7 @@ | |||
36 | 36 | ||
37 | #define NR_IRQS (MAXIRQNUM + 1) | 37 | #define NR_IRQS (MAXIRQNUM + 1) |
38 | 38 | ||
39 | extern void __init h3_mmc_init(void); | 39 | extern void h3_mmc_init(void); |
40 | extern void h3_mmc_slot_cover_handler(void *arg, int state); | 40 | extern void h3_mmc_slot_cover_handler(void *arg, int state); |
41 | 41 | ||
42 | #endif /* __ASM_ARCH_OMAP_H3_H */ | 42 | #endif /* __ASM_ARCH_OMAP_H3_H */ |
diff --git a/include/asm-arm/arch-omap/common.h b/include/asm-arm/arch-omap/common.h index 442aecbb8f44..224e009e5296 100644 --- a/include/asm-arm/arch-omap/common.h +++ b/include/asm-arm/arch-omap/common.h | |||
@@ -27,9 +27,7 @@ | |||
27 | #ifndef __ARCH_ARM_MACH_OMAP_COMMON_H | 27 | #ifndef __ARCH_ARM_MACH_OMAP_COMMON_H |
28 | #define __ARCH_ARM_MACH_OMAP_COMMON_H | 28 | #define __ARCH_ARM_MACH_OMAP_COMMON_H |
29 | 29 | ||
30 | #ifdef CONFIG_I2C_OMAP | ||
31 | #include <linux/i2c.h> | 30 | #include <linux/i2c.h> |
32 | #endif | ||
33 | 31 | ||
34 | struct sys_timer; | 32 | struct sys_timer; |
35 | 33 | ||
@@ -41,7 +39,12 @@ extern int omap_register_i2c_bus(int bus_id, u32 clkrate, | |||
41 | struct i2c_board_info const *info, | 39 | struct i2c_board_info const *info, |
42 | unsigned len); | 40 | unsigned len); |
43 | #else | 41 | #else |
44 | #define omap_register_i2c_bus(a, b, c, d) 0 | 42 | static inline int omap_register_i2c_bus(int bus_id, u32 clkrate, |
43 | struct i2c_board_info const *info, | ||
44 | unsigned len) | ||
45 | { | ||
46 | return 0; | ||
47 | } | ||
45 | #endif | 48 | #endif |
46 | 49 | ||
47 | #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ | 50 | #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ |
diff --git a/include/asm-arm/arch-omap/gpioexpander.h b/include/asm-arm/arch-omap/gpioexpander.h index 7a43b0a912e4..4eed1f80e2fb 100644 --- a/include/asm-arm/arch-omap/gpioexpander.h +++ b/include/asm-arm/arch-omap/gpioexpander.h | |||
@@ -18,7 +18,18 @@ | |||
18 | 18 | ||
19 | /* Function Prototypes for GPIO Expander functions */ | 19 | /* Function Prototypes for GPIO Expander functions */ |
20 | 20 | ||
21 | #ifdef CONFIG_GPIOEXPANDER_OMAP | ||
21 | int read_gpio_expa(u8 *, int); | 22 | int read_gpio_expa(u8 *, int); |
22 | int write_gpio_expa(u8 , int); | 23 | int write_gpio_expa(u8 , int); |
24 | #else | ||
25 | static inline int read_gpio_expa(u8 *val, int addr) | ||
26 | { | ||
27 | return 0; | ||
28 | } | ||
29 | static inline int write_gpio_expa(u8 val, int addr) | ||
30 | { | ||
31 | return 0; | ||
32 | } | ||
33 | #endif | ||
23 | 34 | ||
24 | #endif /* __ASM_ARCH_OMAP_GPIOEXPANDER_H */ | 35 | #endif /* __ASM_ARCH_OMAP_GPIOEXPANDER_H */ |
diff --git a/include/asm-arm/arch-pxa/entry-macro.S b/include/asm-arm/arch-pxa/entry-macro.S index b7e730851461..c145bb01bc8f 100644 --- a/include/asm-arm/arch-pxa/entry-macro.S +++ b/include/asm-arm/arch-pxa/entry-macro.S | |||
@@ -35,7 +35,7 @@ | |||
35 | 1004: | 35 | 1004: |
36 | mrc p6, 0, \irqstat, c6, c0, 0 @ ICIP2 | 36 | mrc p6, 0, \irqstat, c6, c0, 0 @ ICIP2 |
37 | mrc p6, 0, \irqnr, c7, c0, 0 @ ICMR2 | 37 | mrc p6, 0, \irqnr, c7, c0, 0 @ ICMR2 |
38 | ands \irqstat, \irqstat, \irqnr | 38 | ands \irqnr, \irqstat, \irqnr |
39 | beq 1003f | 39 | beq 1003f |
40 | rsb \irqstat, \irqnr, #0 | 40 | rsb \irqstat, \irqnr, #0 |
41 | and \irqstat, \irqstat, \irqnr | 41 | and \irqstat, \irqstat, \irqnr |
diff --git a/include/asm-arm/arch-pxa/pxa-regs.h b/include/asm-arm/arch-pxa/pxa-regs.h index ac175b4d10cb..2357a73340d4 100644 --- a/include/asm-arm/arch-pxa/pxa-regs.h +++ b/include/asm-arm/arch-pxa/pxa-regs.h | |||
@@ -520,6 +520,9 @@ | |||
520 | #define MCCR_FSRIE (1 << 1) /* FIFO Service Request Interrupt Enable */ | 520 | #define MCCR_FSRIE (1 << 1) /* FIFO Service Request Interrupt Enable */ |
521 | 521 | ||
522 | #define GCR __REG(0x4050000C) /* Global Control Register */ | 522 | #define GCR __REG(0x4050000C) /* Global Control Register */ |
523 | #ifdef CONFIG_PXA3xx | ||
524 | #define GCR_CLKBPB (1 << 31) /* Internal clock enable */ | ||
525 | #endif | ||
523 | #define GCR_nDMAEN (1 << 24) /* non DMA Enable */ | 526 | #define GCR_nDMAEN (1 << 24) /* non DMA Enable */ |
524 | #define GCR_CDONE_IE (1 << 19) /* Command Done Interrupt Enable */ | 527 | #define GCR_CDONE_IE (1 << 19) /* Command Done Interrupt Enable */ |
525 | #define GCR_SDONE_IE (1 << 18) /* Status Done Interrupt Enable */ | 528 | #define GCR_SDONE_IE (1 << 18) /* Status Done Interrupt Enable */ |
diff --git a/include/asm-arm/kexec.h b/include/asm-arm/kexec.h index 1ee17b6951d0..47fe34d692da 100644 --- a/include/asm-arm/kexec.h +++ b/include/asm-arm/kexec.h | |||
@@ -8,7 +8,7 @@ | |||
8 | /* Maximum address we can reach in physical address mode */ | 8 | /* Maximum address we can reach in physical address mode */ |
9 | #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL) | 9 | #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL) |
10 | /* Maximum address we can use for the control code buffer */ | 10 | /* Maximum address we can use for the control code buffer */ |
11 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 11 | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) |
12 | 12 | ||
13 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 13 | #define KEXEC_CONTROL_CODE_SIZE 4096 |
14 | 14 | ||
diff --git a/include/asm-arm/kprobes.h b/include/asm-arm/kprobes.h index 4e7bd32288ae..c042194d3ab5 100644 --- a/include/asm-arm/kprobes.h +++ b/include/asm-arm/kprobes.h | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <linux/ptrace.h> | 20 | #include <linux/ptrace.h> |
21 | #include <linux/percpu.h> | 21 | #include <linux/percpu.h> |
22 | 22 | ||
23 | #define ARCH_SUPPORTS_KRETPROBES | ||
24 | #define __ARCH_WANT_KPROBES_INSN_SLOT | 23 | #define __ARCH_WANT_KPROBES_INSN_SLOT |
25 | #define MAX_INSN_SIZE 2 | 24 | #define MAX_INSN_SIZE 2 |
26 | #define MAX_STACK_SIZE 64 /* 32 would probably be OK */ | 25 | #define MAX_STACK_SIZE 64 /* 32 would probably be OK */ |
diff --git a/include/asm-arm/pgtable-nommu.h b/include/asm-arm/pgtable-nommu.h index 33c83dd87965..2e5868bbe03b 100644 --- a/include/asm-arm/pgtable-nommu.h +++ b/include/asm-arm/pgtable-nommu.h | |||
@@ -92,6 +92,8 @@ extern unsigned int kobjsize(const void *objp); | |||
92 | 92 | ||
93 | #define FIRST_USER_ADDRESS (0) | 93 | #define FIRST_USER_ADDRESS (0) |
94 | 94 | ||
95 | #include <asm-generic/pgtable.h> | ||
96 | |||
95 | #else | 97 | #else |
96 | 98 | ||
97 | /* | 99 | /* |
diff --git a/include/asm-arm/plat-s3c/uncompress.h b/include/asm-arm/plat-s3c/uncompress.h index b5e6208175d1..19b9eda39485 100644 --- a/include/asm-arm/plat-s3c/uncompress.h +++ b/include/asm-arm/plat-s3c/uncompress.h | |||
@@ -27,8 +27,8 @@ static void arch_detect_cpu(void); | |||
27 | 27 | ||
28 | /* defines for UART registers */ | 28 | /* defines for UART registers */ |
29 | 29 | ||
30 | #include "asm/plat-s3c/regs-serial.h" | 30 | #include <asm/plat-s3c/regs-serial.h> |
31 | #include "asm/plat-s3c/regs-watchdog.h" | 31 | #include <asm/plat-s3c/regs-watchdog.h> |
32 | 32 | ||
33 | /* working in physical space... */ | 33 | /* working in physical space... */ |
34 | #undef S3C2410_WDOGREG | 34 | #undef S3C2410_WDOGREG |
diff --git a/include/asm-arm/proc-fns.h b/include/asm-arm/proc-fns.h index a4ce457199d3..75ec760f4c74 100644 --- a/include/asm-arm/proc-fns.h +++ b/include/asm-arm/proc-fns.h | |||
@@ -214,9 +214,9 @@ | |||
214 | #ifndef __ASSEMBLY__ | 214 | #ifndef __ASSEMBLY__ |
215 | 215 | ||
216 | #ifndef MULTI_CPU | 216 | #ifndef MULTI_CPU |
217 | #include "asm/cpu-single.h" | 217 | #include <asm/cpu-single.h> |
218 | #else | 218 | #else |
219 | #include "asm/cpu-multi32.h" | 219 | #include <asm/cpu-multi32.h> |
220 | #endif | 220 | #endif |
221 | 221 | ||
222 | #include <asm/memory.h> | 222 | #include <asm/memory.h> |
diff --git a/include/asm-arm/unaligned.h b/include/asm-arm/unaligned.h index 8431f6eed5c6..5db03cf3b905 100644 --- a/include/asm-arm/unaligned.h +++ b/include/asm-arm/unaligned.h | |||
@@ -40,16 +40,16 @@ extern int __bug_unaligned_x(const void *ptr); | |||
40 | */ | 40 | */ |
41 | 41 | ||
42 | #define __get_unaligned_2_le(__p) \ | 42 | #define __get_unaligned_2_le(__p) \ |
43 | (__p[0] | __p[1] << 8) | 43 | (unsigned int)(__p[0] | __p[1] << 8) |
44 | 44 | ||
45 | #define __get_unaligned_2_be(__p) \ | 45 | #define __get_unaligned_2_be(__p) \ |
46 | (__p[0] << 8 | __p[1]) | 46 | (unsigned int)(__p[0] << 8 | __p[1]) |
47 | 47 | ||
48 | #define __get_unaligned_4_le(__p) \ | 48 | #define __get_unaligned_4_le(__p) \ |
49 | (__p[0] | __p[1] << 8 | __p[2] << 16 | __p[3] << 24) | 49 | (unsigned int)(__p[0] | __p[1] << 8 | __p[2] << 16 | __p[3] << 24) |
50 | 50 | ||
51 | #define __get_unaligned_4_be(__p) \ | 51 | #define __get_unaligned_4_be(__p) \ |
52 | (__p[0] << 24 | __p[1] << 16 | __p[2] << 8 | __p[3]) | 52 | (unsigned int)(__p[0] << 24 | __p[1] << 16 | __p[2] << 8 | __p[3]) |
53 | 53 | ||
54 | #define __get_unaligned_8_le(__p) \ | 54 | #define __get_unaligned_8_le(__p) \ |
55 | ((unsigned long long)__get_unaligned_4_le((__p+4)) << 32 | \ | 55 | ((unsigned long long)__get_unaligned_4_le((__p+4)) << 32 | \ |
diff --git a/include/asm-avr32/pgtable.h b/include/asm-avr32/pgtable.h index 018f6e2a0242..3ae7b548fce7 100644 --- a/include/asm-avr32/pgtable.h +++ b/include/asm-avr32/pgtable.h | |||
@@ -157,6 +157,7 @@ extern struct page *empty_zero_page; | |||
157 | #define _PAGE_S(x) _PAGE_NORMAL(x) | 157 | #define _PAGE_S(x) _PAGE_NORMAL(x) |
158 | 158 | ||
159 | #define PAGE_COPY _PAGE_P(PAGE_WRITE | PAGE_READ) | 159 | #define PAGE_COPY _PAGE_P(PAGE_WRITE | PAGE_READ) |
160 | #define PAGE_SHARED _PAGE_S(PAGE_WRITE | PAGE_READ) | ||
160 | 161 | ||
161 | #ifndef __ASSEMBLY__ | 162 | #ifndef __ASSEMBLY__ |
162 | /* | 163 | /* |
diff --git a/include/asm-blackfin/gptimers.h b/include/asm-blackfin/gptimers.h index 8265ea473d5b..4f318f1fd2d9 100644 --- a/include/asm-blackfin/gptimers.h +++ b/include/asm-blackfin/gptimers.h | |||
@@ -1,12 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm/bf5xx_timers.h | 2 | * gptimers.h - Blackfin General Purpose Timer structs/defines/prototypes |
3 | * | ||
4 | * This file contains the major Data structures and constants | ||
5 | * used for General Purpose Timer Implementation in BF5xx | ||
6 | * | 3 | * |
4 | * Copyright (c) 2005-2008 Analog Devices Inc. | ||
7 | * Copyright (C) 2005 John DeHority | 5 | * Copyright (C) 2005 John DeHority |
8 | * Copyright (C) 2006 Hella Aglaia GmbH (awe@aglaia-gmbh.de) | 6 | * Copyright (C) 2006 Hella Aglaia GmbH (awe@aglaia-gmbh.de) |
9 | * | 7 | * |
8 | * Licensed under the GPL-2. | ||
10 | */ | 9 | */ |
11 | 10 | ||
12 | #ifndef _BLACKFIN_TIMERS_H_ | 11 | #ifndef _BLACKFIN_TIMERS_H_ |
diff --git a/include/asm-blackfin/irq.h b/include/asm-blackfin/irq.h index 65480dab244e..86b67834354d 100644 --- a/include/asm-blackfin/irq.h +++ b/include/asm-blackfin/irq.h | |||
@@ -67,4 +67,6 @@ static __inline__ int irq_canonicalize(int irq) | |||
67 | #define NO_IRQ ((unsigned int)(-1)) | 67 | #define NO_IRQ ((unsigned int)(-1)) |
68 | #endif | 68 | #endif |
69 | 69 | ||
70 | #define SIC_SYSIRQ(irq) (irq - (IRQ_CORETMR + 1)) | ||
71 | |||
70 | #endif /* _BFIN_IRQ_H_ */ | 72 | #endif /* _BFIN_IRQ_H_ */ |
diff --git a/include/asm-blackfin/mach-bf527/bfin_serial_5xx.h b/include/asm-blackfin/mach-bf527/bfin_serial_5xx.h index 15dbc21eed8b..c0694ecd2ecd 100644 --- a/include/asm-blackfin/mach-bf527/bfin_serial_5xx.h +++ b/include/asm-blackfin/mach-bf527/bfin_serial_5xx.h | |||
@@ -23,7 +23,6 @@ | |||
23 | #define UART_GET_DLH(uart) bfin_read16(((uart)->port.membase + OFFSET_DLH)) | 23 | #define UART_GET_DLH(uart) bfin_read16(((uart)->port.membase + OFFSET_DLH)) |
24 | #define UART_GET_IIR(uart) bfin_read16(((uart)->port.membase + OFFSET_IIR)) | 24 | #define UART_GET_IIR(uart) bfin_read16(((uart)->port.membase + OFFSET_IIR)) |
25 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) | 25 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) |
26 | #define UART_GET_LSR(uart) bfin_read16(((uart)->port.membase + OFFSET_LSR)) | ||
27 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) | 26 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) |
28 | 27 | ||
29 | #define UART_PUT_CHAR(uart, v) bfin_write16(((uart)->port.membase + OFFSET_THR), v) | 28 | #define UART_PUT_CHAR(uart, v) bfin_write16(((uart)->port.membase + OFFSET_THR), v) |
@@ -58,6 +57,7 @@ | |||
58 | struct bfin_serial_port { | 57 | struct bfin_serial_port { |
59 | struct uart_port port; | 58 | struct uart_port port; |
60 | unsigned int old_status; | 59 | unsigned int old_status; |
60 | unsigned int lsr; | ||
61 | #ifdef CONFIG_SERIAL_BFIN_DMA | 61 | #ifdef CONFIG_SERIAL_BFIN_DMA |
62 | int tx_done; | 62 | int tx_done; |
63 | int tx_count; | 63 | int tx_count; |
@@ -67,15 +67,31 @@ struct bfin_serial_port { | |||
67 | unsigned int tx_dma_channel; | 67 | unsigned int tx_dma_channel; |
68 | unsigned int rx_dma_channel; | 68 | unsigned int rx_dma_channel; |
69 | struct work_struct tx_dma_workqueue; | 69 | struct work_struct tx_dma_workqueue; |
70 | #else | ||
71 | struct work_struct cts_workqueue; | ||
72 | #endif | 70 | #endif |
73 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | 71 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS |
72 | struct work_struct cts_workqueue; | ||
74 | int cts_pin; | 73 | int cts_pin; |
75 | int rts_pin; | 74 | int rts_pin; |
76 | #endif | 75 | #endif |
77 | }; | 76 | }; |
78 | 77 | ||
78 | /* The hardware clears the LSR bits upon read, so we need to cache | ||
79 | * some of the more fun bits in software so they don't get lost | ||
80 | * when checking the LSR in other code paths (TX). | ||
81 | */ | ||
82 | static inline unsigned int UART_GET_LSR(struct bfin_serial_port *uart) | ||
83 | { | ||
84 | unsigned int lsr = bfin_read16(uart->port.membase + OFFSET_LSR); | ||
85 | uart->lsr |= (lsr & (BI|FE|PE|OE)); | ||
86 | return lsr | uart->lsr; | ||
87 | } | ||
88 | |||
89 | static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart) | ||
90 | { | ||
91 | uart->lsr = 0; | ||
92 | bfin_write16(uart->port.membase + OFFSET_LSR, -1); | ||
93 | } | ||
94 | |||
79 | struct bfin_serial_port bfin_serial_ports[NR_PORTS]; | 95 | struct bfin_serial_port bfin_serial_ports[NR_PORTS]; |
80 | struct bfin_serial_res { | 96 | struct bfin_serial_res { |
81 | unsigned long uart_base_addr; | 97 | unsigned long uart_base_addr; |
diff --git a/include/asm-blackfin/mach-bf533/bfin_serial_5xx.h b/include/asm-blackfin/mach-bf533/bfin_serial_5xx.h index 7871d4313f49..b6f513bee56e 100644 --- a/include/asm-blackfin/mach-bf533/bfin_serial_5xx.h +++ b/include/asm-blackfin/mach-bf533/bfin_serial_5xx.h | |||
@@ -23,7 +23,6 @@ | |||
23 | #define UART_GET_DLH(uart) bfin_read16(((uart)->port.membase + OFFSET_DLH)) | 23 | #define UART_GET_DLH(uart) bfin_read16(((uart)->port.membase + OFFSET_DLH)) |
24 | #define UART_GET_IIR(uart) bfin_read16(((uart)->port.membase + OFFSET_IIR)) | 24 | #define UART_GET_IIR(uart) bfin_read16(((uart)->port.membase + OFFSET_IIR)) |
25 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) | 25 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) |
26 | #define UART_GET_LSR(uart) bfin_read16(((uart)->port.membase + OFFSET_LSR)) | ||
27 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) | 26 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) |
28 | 27 | ||
29 | #define UART_PUT_CHAR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_THR),v) | 28 | #define UART_PUT_CHAR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_THR),v) |
@@ -46,6 +45,7 @@ | |||
46 | struct bfin_serial_port { | 45 | struct bfin_serial_port { |
47 | struct uart_port port; | 46 | struct uart_port port; |
48 | unsigned int old_status; | 47 | unsigned int old_status; |
48 | unsigned int lsr; | ||
49 | #ifdef CONFIG_SERIAL_BFIN_DMA | 49 | #ifdef CONFIG_SERIAL_BFIN_DMA |
50 | int tx_done; | 50 | int tx_done; |
51 | int tx_count; | 51 | int tx_count; |
@@ -56,14 +56,34 @@ struct bfin_serial_port { | |||
56 | unsigned int rx_dma_channel; | 56 | unsigned int rx_dma_channel; |
57 | struct work_struct tx_dma_workqueue; | 57 | struct work_struct tx_dma_workqueue; |
58 | #else | 58 | #else |
59 | struct work_struct cts_workqueue; | 59 | # if ANOMALY_05000230 |
60 | unsigned int anomaly_threshold; | ||
61 | # endif | ||
60 | #endif | 62 | #endif |
61 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | 63 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS |
64 | struct work_struct cts_workqueue; | ||
62 | int cts_pin; | 65 | int cts_pin; |
63 | int rts_pin; | 66 | int rts_pin; |
64 | #endif | 67 | #endif |
65 | }; | 68 | }; |
66 | 69 | ||
70 | /* The hardware clears the LSR bits upon read, so we need to cache | ||
71 | * some of the more fun bits in software so they don't get lost | ||
72 | * when checking the LSR in other code paths (TX). | ||
73 | */ | ||
74 | static inline unsigned int UART_GET_LSR(struct bfin_serial_port *uart) | ||
75 | { | ||
76 | unsigned int lsr = bfin_read16(uart->port.membase + OFFSET_LSR); | ||
77 | uart->lsr |= (lsr & (BI|FE|PE|OE)); | ||
78 | return lsr | uart->lsr; | ||
79 | } | ||
80 | |||
81 | static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart) | ||
82 | { | ||
83 | uart->lsr = 0; | ||
84 | bfin_write16(uart->port.membase + OFFSET_LSR, -1); | ||
85 | } | ||
86 | |||
67 | struct bfin_serial_port bfin_serial_ports[NR_PORTS]; | 87 | struct bfin_serial_port bfin_serial_ports[NR_PORTS]; |
68 | struct bfin_serial_res { | 88 | struct bfin_serial_res { |
69 | unsigned long uart_base_addr; | 89 | unsigned long uart_base_addr; |
diff --git a/include/asm-blackfin/mach-bf537/bfin_serial_5xx.h b/include/asm-blackfin/mach-bf537/bfin_serial_5xx.h index 86e45c379838..8fc672d31057 100644 --- a/include/asm-blackfin/mach-bf537/bfin_serial_5xx.h +++ b/include/asm-blackfin/mach-bf537/bfin_serial_5xx.h | |||
@@ -23,7 +23,6 @@ | |||
23 | #define UART_GET_DLH(uart) bfin_read16(((uart)->port.membase + OFFSET_DLH)) | 23 | #define UART_GET_DLH(uart) bfin_read16(((uart)->port.membase + OFFSET_DLH)) |
24 | #define UART_GET_IIR(uart) bfin_read16(((uart)->port.membase + OFFSET_IIR)) | 24 | #define UART_GET_IIR(uart) bfin_read16(((uart)->port.membase + OFFSET_IIR)) |
25 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) | 25 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) |
26 | #define UART_GET_LSR(uart) bfin_read16(((uart)->port.membase + OFFSET_LSR)) | ||
27 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) | 26 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) |
28 | 27 | ||
29 | #define UART_PUT_CHAR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_THR),v) | 28 | #define UART_PUT_CHAR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_THR),v) |
@@ -58,6 +57,7 @@ | |||
58 | struct bfin_serial_port { | 57 | struct bfin_serial_port { |
59 | struct uart_port port; | 58 | struct uart_port port; |
60 | unsigned int old_status; | 59 | unsigned int old_status; |
60 | unsigned int lsr; | ||
61 | #ifdef CONFIG_SERIAL_BFIN_DMA | 61 | #ifdef CONFIG_SERIAL_BFIN_DMA |
62 | int tx_done; | 62 | int tx_done; |
63 | int tx_count; | 63 | int tx_count; |
@@ -67,15 +67,31 @@ struct bfin_serial_port { | |||
67 | unsigned int tx_dma_channel; | 67 | unsigned int tx_dma_channel; |
68 | unsigned int rx_dma_channel; | 68 | unsigned int rx_dma_channel; |
69 | struct work_struct tx_dma_workqueue; | 69 | struct work_struct tx_dma_workqueue; |
70 | #else | ||
71 | struct work_struct cts_workqueue; | ||
72 | #endif | 70 | #endif |
73 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | 71 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS |
72 | struct work_struct cts_workqueue; | ||
74 | int cts_pin; | 73 | int cts_pin; |
75 | int rts_pin; | 74 | int rts_pin; |
76 | #endif | 75 | #endif |
77 | }; | 76 | }; |
78 | 77 | ||
78 | /* The hardware clears the LSR bits upon read, so we need to cache | ||
79 | * some of the more fun bits in software so they don't get lost | ||
80 | * when checking the LSR in other code paths (TX). | ||
81 | */ | ||
82 | static inline unsigned int UART_GET_LSR(struct bfin_serial_port *uart) | ||
83 | { | ||
84 | unsigned int lsr = bfin_read16(uart->port.membase + OFFSET_LSR); | ||
85 | uart->lsr |= (lsr & (BI|FE|PE|OE)); | ||
86 | return lsr | uart->lsr; | ||
87 | } | ||
88 | |||
89 | static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart) | ||
90 | { | ||
91 | uart->lsr = 0; | ||
92 | bfin_write16(uart->port.membase + OFFSET_LSR, -1); | ||
93 | } | ||
94 | |||
79 | struct bfin_serial_port bfin_serial_ports[NR_PORTS]; | 95 | struct bfin_serial_port bfin_serial_ports[NR_PORTS]; |
80 | struct bfin_serial_res { | 96 | struct bfin_serial_res { |
81 | unsigned long uart_base_addr; | 97 | unsigned long uart_base_addr; |
diff --git a/include/asm-blackfin/mach-bf548/bfin_serial_5xx.h b/include/asm-blackfin/mach-bf548/bfin_serial_5xx.h index 3770aa38ee9f..7e6339f62a50 100644 --- a/include/asm-blackfin/mach-bf548/bfin_serial_5xx.h +++ b/include/asm-blackfin/mach-bf548/bfin_serial_5xx.h | |||
@@ -24,6 +24,8 @@ | |||
24 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) | 24 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) |
25 | #define UART_GET_LSR(uart) bfin_read16(((uart)->port.membase + OFFSET_LSR)) | 25 | #define UART_GET_LSR(uart) bfin_read16(((uart)->port.membase + OFFSET_LSR)) |
26 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) | 26 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) |
27 | #define UART_GET_MSR(uart) bfin_read16(((uart)->port.membase + OFFSET_MSR)) | ||
28 | #define UART_GET_MCR(uart) bfin_read16(((uart)->port.membase + OFFSET_MCR)) | ||
27 | 29 | ||
28 | #define UART_PUT_CHAR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_THR),v) | 30 | #define UART_PUT_CHAR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_THR),v) |
29 | #define UART_PUT_DLL(uart,v) bfin_write16(((uart)->port.membase + OFFSET_DLL),v) | 31 | #define UART_PUT_DLL(uart,v) bfin_write16(((uart)->port.membase + OFFSET_DLL),v) |
@@ -32,7 +34,9 @@ | |||
32 | #define UART_PUT_DLH(uart,v) bfin_write16(((uart)->port.membase + OFFSET_DLH),v) | 34 | #define UART_PUT_DLH(uart,v) bfin_write16(((uart)->port.membase + OFFSET_DLH),v) |
33 | #define UART_PUT_LSR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_LSR),v) | 35 | #define UART_PUT_LSR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_LSR),v) |
34 | #define UART_PUT_LCR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_LCR),v) | 36 | #define UART_PUT_LCR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_LCR),v) |
37 | #define UART_CLEAR_LSR(uart) bfin_write16(((uart)->port.membase + OFFSET_LSR), -1) | ||
35 | #define UART_PUT_GCTL(uart,v) bfin_write16(((uart)->port.membase + OFFSET_GCTL),v) | 38 | #define UART_PUT_GCTL(uart,v) bfin_write16(((uart)->port.membase + OFFSET_GCTL),v) |
39 | #define UART_PUT_MCR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_MCR),v) | ||
36 | 40 | ||
37 | #if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS) | 41 | #if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS) |
38 | # define CONFIG_SERIAL_BFIN_CTSRTS | 42 | # define CONFIG_SERIAL_BFIN_CTSRTS |
@@ -68,10 +72,9 @@ struct bfin_serial_port { | |||
68 | unsigned int tx_dma_channel; | 72 | unsigned int tx_dma_channel; |
69 | unsigned int rx_dma_channel; | 73 | unsigned int rx_dma_channel; |
70 | struct work_struct tx_dma_workqueue; | 74 | struct work_struct tx_dma_workqueue; |
71 | #else | ||
72 | struct work_struct cts_workqueue; | ||
73 | #endif | 75 | #endif |
74 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | 76 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS |
77 | struct work_struct cts_workqueue; | ||
75 | int cts_pin; | 78 | int cts_pin; |
76 | int rts_pin; | 79 | int rts_pin; |
77 | #endif | 80 | #endif |
diff --git a/include/asm-blackfin/mach-bf561/bfin_serial_5xx.h b/include/asm-blackfin/mach-bf561/bfin_serial_5xx.h index 7871d4313f49..b6f513bee56e 100644 --- a/include/asm-blackfin/mach-bf561/bfin_serial_5xx.h +++ b/include/asm-blackfin/mach-bf561/bfin_serial_5xx.h | |||
@@ -23,7 +23,6 @@ | |||
23 | #define UART_GET_DLH(uart) bfin_read16(((uart)->port.membase + OFFSET_DLH)) | 23 | #define UART_GET_DLH(uart) bfin_read16(((uart)->port.membase + OFFSET_DLH)) |
24 | #define UART_GET_IIR(uart) bfin_read16(((uart)->port.membase + OFFSET_IIR)) | 24 | #define UART_GET_IIR(uart) bfin_read16(((uart)->port.membase + OFFSET_IIR)) |
25 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) | 25 | #define UART_GET_LCR(uart) bfin_read16(((uart)->port.membase + OFFSET_LCR)) |
26 | #define UART_GET_LSR(uart) bfin_read16(((uart)->port.membase + OFFSET_LSR)) | ||
27 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) | 26 | #define UART_GET_GCTL(uart) bfin_read16(((uart)->port.membase + OFFSET_GCTL)) |
28 | 27 | ||
29 | #define UART_PUT_CHAR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_THR),v) | 28 | #define UART_PUT_CHAR(uart,v) bfin_write16(((uart)->port.membase + OFFSET_THR),v) |
@@ -46,6 +45,7 @@ | |||
46 | struct bfin_serial_port { | 45 | struct bfin_serial_port { |
47 | struct uart_port port; | 46 | struct uart_port port; |
48 | unsigned int old_status; | 47 | unsigned int old_status; |
48 | unsigned int lsr; | ||
49 | #ifdef CONFIG_SERIAL_BFIN_DMA | 49 | #ifdef CONFIG_SERIAL_BFIN_DMA |
50 | int tx_done; | 50 | int tx_done; |
51 | int tx_count; | 51 | int tx_count; |
@@ -56,14 +56,34 @@ struct bfin_serial_port { | |||
56 | unsigned int rx_dma_channel; | 56 | unsigned int rx_dma_channel; |
57 | struct work_struct tx_dma_workqueue; | 57 | struct work_struct tx_dma_workqueue; |
58 | #else | 58 | #else |
59 | struct work_struct cts_workqueue; | 59 | # if ANOMALY_05000230 |
60 | unsigned int anomaly_threshold; | ||
61 | # endif | ||
60 | #endif | 62 | #endif |
61 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS | 63 | #ifdef CONFIG_SERIAL_BFIN_CTSRTS |
64 | struct work_struct cts_workqueue; | ||
62 | int cts_pin; | 65 | int cts_pin; |
63 | int rts_pin; | 66 | int rts_pin; |
64 | #endif | 67 | #endif |
65 | }; | 68 | }; |
66 | 69 | ||
70 | /* The hardware clears the LSR bits upon read, so we need to cache | ||
71 | * some of the more fun bits in software so they don't get lost | ||
72 | * when checking the LSR in other code paths (TX). | ||
73 | */ | ||
74 | static inline unsigned int UART_GET_LSR(struct bfin_serial_port *uart) | ||
75 | { | ||
76 | unsigned int lsr = bfin_read16(uart->port.membase + OFFSET_LSR); | ||
77 | uart->lsr |= (lsr & (BI|FE|PE|OE)); | ||
78 | return lsr | uart->lsr; | ||
79 | } | ||
80 | |||
81 | static inline void UART_CLEAR_LSR(struct bfin_serial_port *uart) | ||
82 | { | ||
83 | uart->lsr = 0; | ||
84 | bfin_write16(uart->port.membase + OFFSET_LSR, -1); | ||
85 | } | ||
86 | |||
67 | struct bfin_serial_port bfin_serial_ports[NR_PORTS]; | 87 | struct bfin_serial_port bfin_serial_ports[NR_PORTS]; |
68 | struct bfin_serial_res { | 88 | struct bfin_serial_res { |
69 | unsigned long uart_base_addr; | 89 | unsigned long uart_base_addr; |
diff --git a/include/asm-blackfin/mach-bf561/blackfin.h b/include/asm-blackfin/mach-bf561/blackfin.h index 362617f93845..3a16df2c86d8 100644 --- a/include/asm-blackfin/mach-bf561/blackfin.h +++ b/include/asm-blackfin/mach-bf561/blackfin.h | |||
@@ -49,7 +49,8 @@ | |||
49 | #define bfin_read_FIO_INEN() bfin_read_FIO0_INEN() | 49 | #define bfin_read_FIO_INEN() bfin_read_FIO0_INEN() |
50 | #define bfin_write_FIO_INEN(val) bfin_write_FIO0_INEN(val) | 50 | #define bfin_write_FIO_INEN(val) bfin_write_FIO0_INEN(val) |
51 | 51 | ||
52 | 52 | #define SIC_IWR0 SICA_IWR0 | |
53 | #define SIC_IWR1 SICA_IWR1 | ||
53 | #define SIC_IAR0 SICA_IAR0 | 54 | #define SIC_IAR0 SICA_IAR0 |
54 | #define bfin_write_SIC_IMASK0 bfin_write_SICA_IMASK0 | 55 | #define bfin_write_SIC_IMASK0 bfin_write_SICA_IMASK0 |
55 | #define bfin_write_SIC_IMASK1 bfin_write_SICA_IMASK1 | 56 | #define bfin_write_SIC_IMASK1 bfin_write_SICA_IMASK1 |
diff --git a/include/asm-blackfin/mach-bf561/cdefBF561.h b/include/asm-blackfin/mach-bf561/cdefBF561.h index d667816486c0..1bc8d2f89ccc 100644 --- a/include/asm-blackfin/mach-bf561/cdefBF561.h +++ b/include/asm-blackfin/mach-bf561/cdefBF561.h | |||
@@ -559,6 +559,7 @@ static __inline__ void bfin_write_VR_CTL(unsigned int val) | |||
559 | #define bfin_write_PPI0_CONTROL(val) bfin_write16(PPI0_CONTROL,val) | 559 | #define bfin_write_PPI0_CONTROL(val) bfin_write16(PPI0_CONTROL,val) |
560 | #define bfin_read_PPI0_STATUS() bfin_read16(PPI0_STATUS) | 560 | #define bfin_read_PPI0_STATUS() bfin_read16(PPI0_STATUS) |
561 | #define bfin_write_PPI0_STATUS(val) bfin_write16(PPI0_STATUS,val) | 561 | #define bfin_write_PPI0_STATUS(val) bfin_write16(PPI0_STATUS,val) |
562 | #define bfin_clear_PPI0_STATUS() bfin_read_PPI0_STATUS() | ||
562 | #define bfin_read_PPI0_COUNT() bfin_read16(PPI0_COUNT) | 563 | #define bfin_read_PPI0_COUNT() bfin_read16(PPI0_COUNT) |
563 | #define bfin_write_PPI0_COUNT(val) bfin_write16(PPI0_COUNT,val) | 564 | #define bfin_write_PPI0_COUNT(val) bfin_write16(PPI0_COUNT,val) |
564 | #define bfin_read_PPI0_DELAY() bfin_read16(PPI0_DELAY) | 565 | #define bfin_read_PPI0_DELAY() bfin_read16(PPI0_DELAY) |
@@ -570,6 +571,7 @@ static __inline__ void bfin_write_VR_CTL(unsigned int val) | |||
570 | #define bfin_write_PPI1_CONTROL(val) bfin_write16(PPI1_CONTROL,val) | 571 | #define bfin_write_PPI1_CONTROL(val) bfin_write16(PPI1_CONTROL,val) |
571 | #define bfin_read_PPI1_STATUS() bfin_read16(PPI1_STATUS) | 572 | #define bfin_read_PPI1_STATUS() bfin_read16(PPI1_STATUS) |
572 | #define bfin_write_PPI1_STATUS(val) bfin_write16(PPI1_STATUS,val) | 573 | #define bfin_write_PPI1_STATUS(val) bfin_write16(PPI1_STATUS,val) |
574 | #define bfin_clear_PPI1_STATUS() bfin_read_PPI1_STATUS() | ||
573 | #define bfin_read_PPI1_COUNT() bfin_read16(PPI1_COUNT) | 575 | #define bfin_read_PPI1_COUNT() bfin_read16(PPI1_COUNT) |
574 | #define bfin_write_PPI1_COUNT(val) bfin_write16(PPI1_COUNT,val) | 576 | #define bfin_write_PPI1_COUNT(val) bfin_write16(PPI1_COUNT,val) |
575 | #define bfin_read_PPI1_DELAY() bfin_read16(PPI1_DELAY) | 577 | #define bfin_read_PPI1_DELAY() bfin_read16(PPI1_DELAY) |
diff --git a/include/asm-blackfin/mmu_context.h b/include/asm-blackfin/mmu_context.h index b5eb67596ad5..f55ec3c23a92 100644 --- a/include/asm-blackfin/mmu_context.h +++ b/include/asm-blackfin/mmu_context.h | |||
@@ -73,7 +73,7 @@ static inline void destroy_context(struct mm_struct *mm) | |||
73 | struct sram_list_struct *tmp; | 73 | struct sram_list_struct *tmp; |
74 | 74 | ||
75 | if (current_l1_stack_save == mm->context.l1_stack_save) | 75 | if (current_l1_stack_save == mm->context.l1_stack_save) |
76 | current_l1_stack_save = 0; | 76 | current_l1_stack_save = NULL; |
77 | if (mm->context.l1_stack_save) | 77 | if (mm->context.l1_stack_save) |
78 | free_l1stack(); | 78 | free_l1stack(); |
79 | 79 | ||
diff --git a/include/asm-blackfin/unistd.h b/include/asm-blackfin/unistd.h index e98167358d26..c18a399f6e3e 100644 --- a/include/asm-blackfin/unistd.h +++ b/include/asm-blackfin/unistd.h | |||
@@ -361,7 +361,7 @@ | |||
361 | #define __NR_epoll_pwait 346 | 361 | #define __NR_epoll_pwait 346 |
362 | #define __NR_utimensat 347 | 362 | #define __NR_utimensat 347 |
363 | #define __NR_signalfd 348 | 363 | #define __NR_signalfd 348 |
364 | #define __NR_timerfd 349 | 364 | #define __NR_timerfd_create 349 |
365 | #define __NR_eventfd 350 | 365 | #define __NR_eventfd 350 |
366 | #define __NR_pread64 351 | 366 | #define __NR_pread64 351 |
367 | #define __NR_pwrite64 352 | 367 | #define __NR_pwrite64 352 |
@@ -370,8 +370,10 @@ | |||
370 | #define __NR_get_robust_list 355 | 370 | #define __NR_get_robust_list 355 |
371 | #define __NR_fallocate 356 | 371 | #define __NR_fallocate 356 |
372 | #define __NR_semtimedop 357 | 372 | #define __NR_semtimedop 357 |
373 | #define __NR_timerfd_settime 358 | ||
374 | #define __NR_timerfd_gettime 359 | ||
373 | 375 | ||
374 | #define __NR_syscall 358 | 376 | #define __NR_syscall 360 |
375 | #define NR_syscalls __NR_syscall | 377 | #define NR_syscalls __NR_syscall |
376 | 378 | ||
377 | /* Old optional stuff no one actually uses */ | 379 | /* Old optional stuff no one actually uses */ |
diff --git a/include/asm-cris/uaccess.h b/include/asm-cris/uaccess.h index 69d48a2dc8e1..ea11eaf0e922 100644 --- a/include/asm-cris/uaccess.h +++ b/include/asm-cris/uaccess.h | |||
@@ -1,43 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Authors: Bjorn Wesen (bjornw@axis.com) | 2 | * Authors: Bjorn Wesen (bjornw@axis.com) |
3 | * Hans-Peter Nilsson (hp@axis.com) | 3 | * Hans-Peter Nilsson (hp@axis.com) |
4 | * | ||
5 | * $Log: uaccess.h,v $ | ||
6 | * Revision 1.8 2001/10/29 13:01:48 bjornw | ||
7 | * Removed unused variable tmp2 in strnlen_user | ||
8 | * | ||
9 | * Revision 1.7 2001/10/02 12:44:52 hp | ||
10 | * Add support for 64-bit put_user/get_user | ||
11 | * | ||
12 | * Revision 1.6 2001/10/01 14:51:17 bjornw | ||
13 | * Added register prefixes and removed underscores | ||
14 | * | ||
15 | * Revision 1.5 2000/10/25 03:33:21 hp | ||
16 | * - Provide implementation for everything else but get_user and put_user; | ||
17 | * copying inline to/from user for constant length 0..16, 20, 24, and | ||
18 | * clearing for 0..4, 8, 12, 16, 20, 24, strncpy_from_user and strnlen_user | ||
19 | * always inline. | ||
20 | * - Constraints for destination addr in get_user cannot be memory, only reg. | ||
21 | * - Correct labels for PC at expected fault points. | ||
22 | * - Nits with assembly code. | ||
23 | * - Don't use statement expressions without value; use "do {} while (0)". | ||
24 | * - Return correct values from __generic_... functions. | ||
25 | * | ||
26 | * Revision 1.4 2000/09/12 16:28:25 bjornw | ||
27 | * * Removed comments from the get/put user asm code | ||
28 | * * Constrains for destination addr in put_user cannot be memory, only reg | ||
29 | * | ||
30 | * Revision 1.3 2000/09/12 14:30:20 bjornw | ||
31 | * MAX_ADDR_USER does not exist anymore | ||
32 | * | ||
33 | * Revision 1.2 2000/07/13 15:52:48 bjornw | ||
34 | * New user-access functions | ||
35 | * | ||
36 | * Revision 1.1.1.1 2000/07/10 16:32:31 bjornw | ||
37 | * CRIS architecture, working draft | ||
38 | * | ||
39 | * | ||
40 | * | ||
41 | */ | 4 | */ |
42 | 5 | ||
43 | /* Asm:s have been tweaked (within the domain of correctness) to give | 6 | /* Asm:s have been tweaked (within the domain of correctness) to give |
@@ -209,9 +172,9 @@ extern long __get_user_bad(void); | |||
209 | /* More complex functions. Most are inline, but some call functions that | 172 | /* More complex functions. Most are inline, but some call functions that |
210 | live in lib/usercopy.c */ | 173 | live in lib/usercopy.c */ |
211 | 174 | ||
212 | extern unsigned long __copy_user(void *to, const void *from, unsigned long n); | 175 | extern unsigned long __copy_user(void __user *to, const void *from, unsigned long n); |
213 | extern unsigned long __copy_user_zeroing(void *to, const void *from, unsigned long n); | 176 | extern unsigned long __copy_user_zeroing(void *to, const void __user *from, unsigned long n); |
214 | extern unsigned long __do_clear_user(void *to, unsigned long n); | 177 | extern unsigned long __do_clear_user(void __user *to, unsigned long n); |
215 | 178 | ||
216 | static inline unsigned long | 179 | static inline unsigned long |
217 | __generic_copy_to_user(void __user *to, const void *from, unsigned long n) | 180 | __generic_copy_to_user(void __user *to, const void *from, unsigned long n) |
@@ -253,7 +216,7 @@ strncpy_from_user(char *dst, const char __user *src, long count) | |||
253 | } | 216 | } |
254 | 217 | ||
255 | 218 | ||
256 | /* Note that if these expand awfully if made into switch constructs, so | 219 | /* Note that these expand awfully if made into switch constructs, so |
257 | don't do that. */ | 220 | don't do that. */ |
258 | 221 | ||
259 | static inline unsigned long | 222 | static inline unsigned long |
@@ -407,19 +370,21 @@ __constant_clear_user(void __user *to, unsigned long n) | |||
407 | */ | 370 | */ |
408 | 371 | ||
409 | static inline unsigned long | 372 | static inline unsigned long |
410 | __generic_copy_from_user_nocheck(void *to, const void *from, unsigned long n) | 373 | __generic_copy_from_user_nocheck(void *to, const void __user *from, |
374 | unsigned long n) | ||
411 | { | 375 | { |
412 | return __copy_user_zeroing(to,from,n); | 376 | return __copy_user_zeroing(to,from,n); |
413 | } | 377 | } |
414 | 378 | ||
415 | static inline unsigned long | 379 | static inline unsigned long |
416 | __generic_copy_to_user_nocheck(void *to, const void *from, unsigned long n) | 380 | __generic_copy_to_user_nocheck(void __user *to, const void *from, |
381 | unsigned long n) | ||
417 | { | 382 | { |
418 | return __copy_user(to,from,n); | 383 | return __copy_user(to,from,n); |
419 | } | 384 | } |
420 | 385 | ||
421 | static inline unsigned long | 386 | static inline unsigned long |
422 | __generic_clear_user_nocheck(void *to, unsigned long n) | 387 | __generic_clear_user_nocheck(void __user *to, unsigned long n) |
423 | { | 388 | { |
424 | return __do_clear_user(to,n); | 389 | return __do_clear_user(to,n); |
425 | } | 390 | } |
diff --git a/include/asm-cris/unistd.h b/include/asm-cris/unistd.h index 007cb16a6b5b..76398ef87e9b 100644 --- a/include/asm-cris/unistd.h +++ b/include/asm-cris/unistd.h | |||
@@ -329,12 +329,12 @@ | |||
329 | #define __NR_timerfd_create 322 | 329 | #define __NR_timerfd_create 322 |
330 | #define __NR_eventfd 323 | 330 | #define __NR_eventfd 323 |
331 | #define __NR_fallocate 324 | 331 | #define __NR_fallocate 324 |
332 | #define __NR_timerfd_settime 315 | 332 | #define __NR_timerfd_settime 325 |
333 | #define __NR_timerfd_gettime 316 | 333 | #define __NR_timerfd_gettime 326 |
334 | 334 | ||
335 | #ifdef __KERNEL__ | 335 | #ifdef __KERNEL__ |
336 | 336 | ||
337 | #define NR_syscalls 325 | 337 | #define NR_syscalls 327 |
338 | 338 | ||
339 | #include <asm/arch/unistd.h> | 339 | #include <asm/arch/unistd.h> |
340 | 340 | ||
diff --git a/include/asm-h8300/uaccess.h b/include/asm-h8300/uaccess.h index a22350ec271a..356068cd0879 100644 --- a/include/asm-h8300/uaccess.h +++ b/include/asm-h8300/uaccess.h | |||
@@ -91,22 +91,19 @@ extern int __put_user_bad(void); | |||
91 | #define get_user(x, ptr) \ | 91 | #define get_user(x, ptr) \ |
92 | ({ \ | 92 | ({ \ |
93 | int __gu_err = 0; \ | 93 | int __gu_err = 0; \ |
94 | uint32_t __gu_val = 0; \ | 94 | typeof(*(ptr)) __gu_val = *ptr; \ |
95 | switch (sizeof(*(ptr))) { \ | 95 | switch (sizeof(*(ptr))) { \ |
96 | case 1: \ | 96 | case 1: \ |
97 | case 2: \ | 97 | case 2: \ |
98 | case 4: \ | 98 | case 4: \ |
99 | __gu_val = *(ptr); \ | 99 | case 8: \ |
100 | break; \ | ||
101 | case 8: \ | ||
102 | memcpy(&__gu_val, ptr, sizeof (*(ptr))); \ | ||
103 | break; \ | 100 | break; \ |
104 | default: \ | 101 | default: \ |
105 | __gu_val = 0; \ | ||
106 | __gu_err = __get_user_bad(); \ | 102 | __gu_err = __get_user_bad(); \ |
103 | __gu_val = 0; \ | ||
107 | break; \ | 104 | break; \ |
108 | } \ | 105 | } \ |
109 | (x) = (typeof(*(ptr)))__gu_val; \ | 106 | (x) = __gu_val; \ |
110 | __gu_err; \ | 107 | __gu_err; \ |
111 | }) | 108 | }) |
112 | #define __get_user(x, ptr) get_user(x, ptr) | 109 | #define __get_user(x, ptr) get_user(x, ptr) |
diff --git a/include/asm-ia64/Kbuild b/include/asm-ia64/Kbuild index 4a1e48b9f403..eb24a3f47caa 100644 --- a/include/asm-ia64/Kbuild +++ b/include/asm-ia64/Kbuild | |||
@@ -3,7 +3,6 @@ include include/asm-generic/Kbuild.asm | |||
3 | header-y += break.h | 3 | header-y += break.h |
4 | header-y += fpu.h | 4 | header-y += fpu.h |
5 | header-y += fpswa.h | 5 | header-y += fpswa.h |
6 | header-y += gcc_intrin.h | ||
7 | header-y += ia64regs.h | 6 | header-y += ia64regs.h |
8 | header-y += intel_intrin.h | 7 | header-y += intel_intrin.h |
9 | header-y += intrinsics.h | 8 | header-y += intrinsics.h |
@@ -12,5 +11,6 @@ header-y += ptrace_offsets.h | |||
12 | header-y += rse.h | 11 | header-y += rse.h |
13 | header-y += ucontext.h | 12 | header-y += ucontext.h |
14 | 13 | ||
14 | unifdef-y += gcc_intrin.h | ||
15 | unifdef-y += perfmon.h | 15 | unifdef-y += perfmon.h |
16 | unifdef-y += ustack.h | 16 | unifdef-y += ustack.h |
diff --git a/include/asm-ia64/hw_irq.h b/include/asm-ia64/hw_irq.h index 7e6e3779670a..76366dc9c1a0 100644 --- a/include/asm-ia64/hw_irq.h +++ b/include/asm-ia64/hw_irq.h | |||
@@ -93,6 +93,9 @@ extern __u8 isa_irq_to_vector_map[16]; | |||
93 | struct irq_cfg { | 93 | struct irq_cfg { |
94 | ia64_vector vector; | 94 | ia64_vector vector; |
95 | cpumask_t domain; | 95 | cpumask_t domain; |
96 | cpumask_t old_domain; | ||
97 | unsigned move_cleanup_count; | ||
98 | u8 move_in_progress : 1; | ||
96 | }; | 99 | }; |
97 | extern spinlock_t vector_lock; | 100 | extern spinlock_t vector_lock; |
98 | extern struct irq_cfg irq_cfg[NR_IRQS]; | 101 | extern struct irq_cfg irq_cfg[NR_IRQS]; |
@@ -106,12 +109,19 @@ extern int assign_irq_vector (int irq); /* allocate a free vector */ | |||
106 | extern void free_irq_vector (int vector); | 109 | extern void free_irq_vector (int vector); |
107 | extern int reserve_irq_vector (int vector); | 110 | extern int reserve_irq_vector (int vector); |
108 | extern void __setup_vector_irq(int cpu); | 111 | extern void __setup_vector_irq(int cpu); |
109 | extern int reassign_irq_vector(int irq, int cpu); | ||
110 | extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect); | 112 | extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect); |
111 | extern void register_percpu_irq (ia64_vector vec, struct irqaction *action); | 113 | extern void register_percpu_irq (ia64_vector vec, struct irqaction *action); |
112 | extern int check_irq_used (int irq); | 114 | extern int check_irq_used (int irq); |
113 | extern void destroy_and_reserve_irq (unsigned int irq); | 115 | extern void destroy_and_reserve_irq (unsigned int irq); |
114 | 116 | ||
117 | #if defined(CONFIG_SMP) && (defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG)) | ||
118 | extern int irq_prepare_move(int irq, int cpu); | ||
119 | extern void irq_complete_move(unsigned int irq); | ||
120 | #else | ||
121 | static inline int irq_prepare_move(int irq, int cpu) { return 0; } | ||
122 | static inline void irq_complete_move(unsigned int irq) {} | ||
123 | #endif | ||
124 | |||
115 | static inline void ia64_resend_irq(unsigned int vector) | 125 | static inline void ia64_resend_irq(unsigned int vector) |
116 | { | 126 | { |
117 | platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0); | 127 | platform_send_ipi(smp_processor_id(), vector, IA64_IPI_DM_INT, 0); |
diff --git a/include/asm-ia64/kprobes.h b/include/asm-ia64/kprobes.h index a93ce9ef07ff..d03bf9ff68e3 100644 --- a/include/asm-ia64/kprobes.h +++ b/include/asm-ia64/kprobes.h | |||
@@ -82,7 +82,6 @@ struct kprobe_ctlblk { | |||
82 | struct prev_kprobe prev_kprobe[ARCH_PREV_KPROBE_SZ]; | 82 | struct prev_kprobe prev_kprobe[ARCH_PREV_KPROBE_SZ]; |
83 | }; | 83 | }; |
84 | 84 | ||
85 | #define ARCH_SUPPORTS_KRETPROBES | ||
86 | #define kretprobe_blacklist_size 0 | 85 | #define kretprobe_blacklist_size 0 |
87 | 86 | ||
88 | #define SLOT0_OPCODE_SHIFT (37) | 87 | #define SLOT0_OPCODE_SHIFT (37) |
@@ -118,14 +117,10 @@ struct arch_specific_insn { | |||
118 | unsigned short slot; | 117 | unsigned short slot; |
119 | }; | 118 | }; |
120 | 119 | ||
121 | extern int kprobes_fault_handler(struct pt_regs *regs, int trapnr); | 120 | extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr); |
122 | extern int kprobe_exceptions_notify(struct notifier_block *self, | 121 | extern int kprobe_exceptions_notify(struct notifier_block *self, |
123 | unsigned long val, void *data); | 122 | unsigned long val, void *data); |
124 | 123 | ||
125 | /* ia64 does not need this */ | ||
126 | static inline void jprobe_return(void) | ||
127 | { | ||
128 | } | ||
129 | extern void invalidate_stacked_regs(void); | 124 | extern void invalidate_stacked_regs(void); |
130 | extern void flush_register_stack(void); | 125 | extern void flush_register_stack(void); |
131 | extern void arch_remove_kprobe(struct kprobe *p); | 126 | extern void arch_remove_kprobe(struct kprobe *p); |
diff --git a/include/asm-ia64/ptrace.h b/include/asm-ia64/ptrace.h index 0bdce7dde1b0..4b2a8d40ebc5 100644 --- a/include/asm-ia64/ptrace.h +++ b/include/asm-ia64/ptrace.h | |||
@@ -233,8 +233,6 @@ struct switch_stack { | |||
233 | #include <asm/current.h> | 233 | #include <asm/current.h> |
234 | #include <asm/page.h> | 234 | #include <asm/page.h> |
235 | 235 | ||
236 | #define __ARCH_SYS_PTRACE 1 | ||
237 | |||
238 | /* | 236 | /* |
239 | * We use the ia64_psr(regs)->ri to determine which of the three | 237 | * We use the ia64_psr(regs)->ri to determine which of the three |
240 | * instructions in bundle (16 bytes) took the sample. Generate | 238 | * instructions in bundle (16 bytes) took the sample. Generate |
@@ -314,6 +312,13 @@ struct switch_stack { | |||
314 | #define arch_ptrace_attach(child) \ | 312 | #define arch_ptrace_attach(child) \ |
315 | ptrace_attach_sync_user_rbs(child) | 313 | ptrace_attach_sync_user_rbs(child) |
316 | 314 | ||
315 | #define arch_has_single_step() (1) | ||
316 | extern void user_enable_single_step(struct task_struct *); | ||
317 | extern void user_disable_single_step(struct task_struct *); | ||
318 | |||
319 | #define arch_has_block_step() (1) | ||
320 | extern void user_enable_block_step(struct task_struct *); | ||
321 | |||
317 | #endif /* !__KERNEL__ */ | 322 | #endif /* !__KERNEL__ */ |
318 | 323 | ||
319 | /* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */ | 324 | /* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */ |
diff --git a/include/asm-ia64/sal.h b/include/asm-ia64/sal.h index 2251118894ae..f4904db3b057 100644 --- a/include/asm-ia64/sal.h +++ b/include/asm-ia64/sal.h | |||
@@ -807,6 +807,10 @@ static inline s64 | |||
807 | ia64_sal_physical_id_info(u16 *splid) | 807 | ia64_sal_physical_id_info(u16 *splid) |
808 | { | 808 | { |
809 | struct ia64_sal_retval isrv; | 809 | struct ia64_sal_retval isrv; |
810 | |||
811 | if (sal_revision < SAL_VERSION_CODE(3,2)) | ||
812 | return -1; | ||
813 | |||
810 | SAL_CALL(isrv, SAL_PHYSICAL_ID_INFO, 0, 0, 0, 0, 0, 0, 0); | 814 | SAL_CALL(isrv, SAL_PHYSICAL_ID_INFO, 0, 0, 0, 0, 0, 0, 0); |
811 | if (splid) | 815 | if (splid) |
812 | *splid = isrv.v0; | 816 | *splid = isrv.v0; |
diff --git a/include/asm-m68k/unistd.h b/include/asm-m68k/unistd.h index 87f77b119317..e72ba563f102 100644 --- a/include/asm-m68k/unistd.h +++ b/include/asm-m68k/unistd.h | |||
@@ -320,13 +320,15 @@ | |||
320 | #define __NR_epoll_pwait 315 | 320 | #define __NR_epoll_pwait 315 |
321 | #define __NR_utimensat 316 | 321 | #define __NR_utimensat 316 |
322 | #define __NR_signalfd 317 | 322 | #define __NR_signalfd 317 |
323 | #define __NR_timerfd 318 | 323 | #define __NR_timerfd_create 318 |
324 | #define __NR_eventfd 319 | 324 | #define __NR_eventfd 319 |
325 | #define __NR_fallocate 320 | 325 | #define __NR_fallocate 320 |
326 | #define __NR_timerfd_settime 321 | ||
327 | #define __NR_timerfd_gettime 322 | ||
326 | 328 | ||
327 | #ifdef __KERNEL__ | 329 | #ifdef __KERNEL__ |
328 | 330 | ||
329 | #define NR_syscalls 321 | 331 | #define NR_syscalls 323 |
330 | 332 | ||
331 | #define __ARCH_WANT_IPC_PARSE_VERSION | 333 | #define __ARCH_WANT_IPC_PARSE_VERSION |
332 | #define __ARCH_WANT_OLD_READDIR | 334 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/include/asm-m68knommu/machdep.h b/include/asm-m68knommu/machdep.h index 1cf26d240d83..de9f47a51cc2 100644 --- a/include/asm-m68knommu/machdep.h +++ b/include/asm-m68knommu/machdep.h | |||
@@ -21,4 +21,6 @@ extern void (*mach_power_off)( void ); | |||
21 | 21 | ||
22 | extern void config_BSP(char *command, int len); | 22 | extern void config_BSP(char *command, int len); |
23 | 23 | ||
24 | extern void do_IRQ(int irq, struct pt_regs *fp); | ||
25 | |||
24 | #endif /* _M68KNOMMU_MACHDEP_H */ | 26 | #endif /* _M68KNOMMU_MACHDEP_H */ |
diff --git a/include/asm-m68knommu/unistd.h b/include/asm-m68knommu/unistd.h index 27c2f9bb4dbd..4ba98b9c5d79 100644 --- a/include/asm-m68knommu/unistd.h +++ b/include/asm-m68knommu/unistd.h | |||
@@ -321,13 +321,15 @@ | |||
321 | #define __NR_epoll_pwait 315 | 321 | #define __NR_epoll_pwait 315 |
322 | #define __NR_utimensat 316 | 322 | #define __NR_utimensat 316 |
323 | #define __NR_signalfd 317 | 323 | #define __NR_signalfd 317 |
324 | #define __NR_timerfd 318 | 324 | #define __NR_timerfd_create 318 |
325 | #define __NR_eventfd 319 | 325 | #define __NR_eventfd 319 |
326 | #define __NR_fallocate 320 | 326 | #define __NR_fallocate 320 |
327 | #define __NR_timerfd_settime 321 | ||
328 | #define __NR_timerfd_gettime 322 | ||
327 | 329 | ||
328 | #ifdef __KERNEL__ | 330 | #ifdef __KERNEL__ |
329 | 331 | ||
330 | #define NR_syscalls 321 | 332 | #define NR_syscalls 323 |
331 | 333 | ||
332 | #define __ARCH_WANT_IPC_PARSE_VERSION | 334 | #define __ARCH_WANT_IPC_PARSE_VERSION |
333 | #define __ARCH_WANT_OLD_READDIR | 335 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/include/asm-mips/cacheflush.h b/include/asm-mips/cacheflush.h index 4933b4947ed0..01e7eadc97e2 100644 --- a/include/asm-mips/cacheflush.h +++ b/include/asm-mips/cacheflush.h | |||
@@ -93,7 +93,7 @@ extern void (*flush_data_cache_page)(unsigned long addr); | |||
93 | clear_bit(PG_dcache_dirty, &(page)->flags) | 93 | clear_bit(PG_dcache_dirty, &(page)->flags) |
94 | 94 | ||
95 | /* Run kernel code uncached, useful for cache probing functions. */ | 95 | /* Run kernel code uncached, useful for cache probing functions. */ |
96 | unsigned long __init run_uncached(void *func); | 96 | unsigned long run_uncached(void *func); |
97 | 97 | ||
98 | extern void *kmap_coherent(struct page *page, unsigned long addr); | 98 | extern void *kmap_coherent(struct page *page, unsigned long addr); |
99 | extern void kunmap_coherent(void); | 99 | extern void kunmap_coherent(void); |
diff --git a/include/asm-mips/highmem.h b/include/asm-mips/highmem.h index 4d6bd5c31c7b..4374ab2adc75 100644 --- a/include/asm-mips/highmem.h +++ b/include/asm-mips/highmem.h | |||
@@ -39,7 +39,6 @@ extern pte_t *pkmap_page_table; | |||
39 | * easily, subsequent pte tables have to be allocated in one physical | 39 | * easily, subsequent pte tables have to be allocated in one physical |
40 | * chunk of RAM. | 40 | * chunk of RAM. |
41 | */ | 41 | */ |
42 | #define PKMAP_BASE (0xfe000000UL) | ||
43 | #define LAST_PKMAP 1024 | 42 | #define LAST_PKMAP 1024 |
44 | #define LAST_PKMAP_MASK (LAST_PKMAP-1) | 43 | #define LAST_PKMAP_MASK (LAST_PKMAP-1) |
45 | #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) | 44 | #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) |
diff --git a/include/asm-mips/mach-ip27/cpu-feature-overrides.h b/include/asm-mips/mach-ip27/cpu-feature-overrides.h index fe076380c189..7d3112b148d9 100644 --- a/include/asm-mips/mach-ip27/cpu-feature-overrides.h +++ b/include/asm-mips/mach-ip27/cpu-feature-overrides.h | |||
@@ -34,7 +34,11 @@ | |||
34 | #define cpu_has_64bits 1 | 34 | #define cpu_has_64bits 1 |
35 | 35 | ||
36 | #define cpu_has_4kex 1 | 36 | #define cpu_has_4kex 1 |
37 | #define cpu_has_3k_cache 0 | ||
38 | #define cpu_has_6k_cache 0 | ||
37 | #define cpu_has_4k_cache 1 | 39 | #define cpu_has_4k_cache 1 |
40 | #define cpu_has_8k_cache 0 | ||
41 | #define cpu_has_tx39_cache 0 | ||
38 | 42 | ||
39 | #define cpu_has_inclusive_pcaches 1 | 43 | #define cpu_has_inclusive_pcaches 1 |
40 | 44 | ||
diff --git a/include/asm-mips/mach-jmr3927/ioremap.h b/include/asm-mips/mach-jmr3927/ioremap.h index aa131ad7f717..29989ff10d66 100644 --- a/include/asm-mips/mach-jmr3927/ioremap.h +++ b/include/asm-mips/mach-jmr3927/ioremap.h | |||
@@ -25,7 +25,7 @@ static inline void __iomem *plat_ioremap(phys_t offset, unsigned long size, | |||
25 | { | 25 | { |
26 | #define TXX9_DIRECTMAP_BASE 0xff000000ul | 26 | #define TXX9_DIRECTMAP_BASE 0xff000000ul |
27 | if (offset >= TXX9_DIRECTMAP_BASE && | 27 | if (offset >= TXX9_DIRECTMAP_BASE && |
28 | offset < TXX9_DIRECTMAP_BASE + 0xf0000) | 28 | offset < TXX9_DIRECTMAP_BASE + 0xff0000) |
29 | return (void __iomem *)offset; | 29 | return (void __iomem *)offset; |
30 | return NULL; | 30 | return NULL; |
31 | } | 31 | } |
diff --git a/include/asm-mips/mach-lasat/irq.h b/include/asm-mips/mach-lasat/irq.h index da75f89f3723..3a282419d5f9 100644 --- a/include/asm-mips/mach-lasat/irq.h +++ b/include/asm-mips/mach-lasat/irq.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef _ASM_MACH_LASAT_IRQ_H | 1 | #ifndef _ASM_MACH_LASAT_IRQ_H |
2 | #define _ASM_MACH_LASAT_IRQ_H | 2 | #define _ASM_MACH_LASAT_IRQ_H |
3 | 3 | ||
4 | #define LASAT_CASCADE_IRQ (MIPS_CPU_IRQ_BASE + 0) | 4 | #define LASAT_CASCADE_IRQ (MIPS_CPU_IRQ_BASE + 2) |
5 | 5 | ||
6 | #define LASAT_IRQ_BASE 8 | 6 | #define LASAT_IRQ_BASE 8 |
7 | #define LASAT_IRQ_END 23 | 7 | #define LASAT_IRQ_END 23 |
diff --git a/include/asm-mips/pgtable-32.h b/include/asm-mips/pgtable-32.h index a0947092d0e0..ceefe027c761 100644 --- a/include/asm-mips/pgtable-32.h +++ b/include/asm-mips/pgtable-32.h | |||
@@ -65,6 +65,8 @@ extern int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1, | |||
65 | 65 | ||
66 | #define VMALLOC_START MAP_BASE | 66 | #define VMALLOC_START MAP_BASE |
67 | 67 | ||
68 | #define PKMAP_BASE (0xfe000000UL) | ||
69 | |||
68 | #ifdef CONFIG_HIGHMEM | 70 | #ifdef CONFIG_HIGHMEM |
69 | # define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE) | 71 | # define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE) |
70 | #else | 72 | #else |
diff --git a/include/asm-mips/time.h b/include/asm-mips/time.h index a8fd16e1981f..d3bd5c5aa2ec 100644 --- a/include/asm-mips/time.h +++ b/include/asm-mips/time.h | |||
@@ -64,10 +64,11 @@ static inline int mips_clockevent_init(void) | |||
64 | * Initialize the count register as a clocksource | 64 | * Initialize the count register as a clocksource |
65 | */ | 65 | */ |
66 | #ifdef CONFIG_CEVT_R4K | 66 | #ifdef CONFIG_CEVT_R4K |
67 | extern void init_mips_clocksource(void); | 67 | extern int init_mips_clocksource(void); |
68 | #else | 68 | #else |
69 | static inline void init_mips_clocksource(void) | 69 | static inline int init_mips_clocksource(void) |
70 | { | 70 | { |
71 | return 0; | ||
71 | } | 72 | } |
72 | #endif | 73 | #endif |
73 | 74 | ||
diff --git a/include/asm-mn10300/Kbuild b/include/asm-mn10300/Kbuild index 79384c537dc6..c68e1680da01 100644 --- a/include/asm-mn10300/Kbuild +++ b/include/asm-mn10300/Kbuild | |||
@@ -1,5 +1 @@ | |||
1 | include include/asm-generic/Kbuild.asm | include include/asm-generic/Kbuild.asm | |
2 | |||
3 | unifdef-y += termios.h | ||
4 | unifdef-y += ptrace.h | ||
5 | unifdef-y += page.h | ||
diff --git a/include/asm-parisc/elf.h b/include/asm-parisc/elf.h index ce0c0d844c7d..d0a4a8262818 100644 --- a/include/asm-parisc/elf.h +++ b/include/asm-parisc/elf.h | |||
@@ -204,7 +204,7 @@ typedef struct elf64_fdesc { | |||
204 | /* | 204 | /* |
205 | * The following definitions are those for 32-bit ELF binaries on a 32-bit | 205 | * The following definitions are those for 32-bit ELF binaries on a 32-bit |
206 | * kernel and for 64-bit binaries on a 64-bit kernel. To run 32-bit binaries | 206 | * kernel and for 64-bit binaries on a 64-bit kernel. To run 32-bit binaries |
207 | * on a 64-bit kernel, arch/parisc64/kernel/binfmt_elf32.c defines these | 207 | * on a 64-bit kernel, arch/parisc/kernel/binfmt_elf32.c defines these |
208 | * macros appropriately and then #includes binfmt_elf.c, which then includes | 208 | * macros appropriately and then #includes binfmt_elf.c, which then includes |
209 | * this file. | 209 | * this file. |
210 | */ | 210 | */ |
@@ -216,26 +216,25 @@ typedef struct elf64_fdesc { | |||
216 | * Note that this header file is used by default in fs/binfmt_elf.c. So | 216 | * Note that this header file is used by default in fs/binfmt_elf.c. So |
217 | * the following macros are for the default case. However, for the 64 | 217 | * the following macros are for the default case. However, for the 64 |
218 | * bit kernel we also support 32 bit parisc binaries. To do that | 218 | * bit kernel we also support 32 bit parisc binaries. To do that |
219 | * arch/parisc64/kernel/binfmt_elf32.c defines its own set of these | 219 | * arch/parisc/kernel/binfmt_elf32.c defines its own set of these |
220 | * macros, and then it includes fs/binfmt_elf.c to provide an alternate | 220 | * macros, and then it includes fs/binfmt_elf.c to provide an alternate |
221 | * elf binary handler for 32 bit binaries (on the 64 bit kernel). | 221 | * elf binary handler for 32 bit binaries (on the 64 bit kernel). |
222 | */ | 222 | */ |
223 | #ifdef CONFIG_64BIT | 223 | #ifdef CONFIG_64BIT |
224 | #define ELF_CLASS ELFCLASS64 | 224 | #define ELF_CLASS ELFCLASS64 |
225 | #else | 225 | #else |
226 | #define ELF_CLASS ELFCLASS32 | 226 | #define ELF_CLASS ELFCLASS32 |
227 | #endif | 227 | #endif |
228 | 228 | ||
229 | typedef unsigned long elf_greg_t; | 229 | typedef unsigned long elf_greg_t; |
230 | 230 | ||
231 | /* This yields a string that ld.so will use to load implementation | 231 | /* |
232 | specific libraries for optimization. This is more specific in | 232 | * This yields a string that ld.so will use to load implementation |
233 | intent than poking at uname or /proc/cpuinfo. | 233 | * specific libraries for optimization. This is more specific in |
234 | 234 | * intent than poking at uname or /proc/cpuinfo. | |
235 | For the moment, we have only optimizations for the Intel generations, | 235 | */ |
236 | but that could change... */ | ||
237 | 236 | ||
238 | #define ELF_PLATFORM ("PARISC\0" /*+((boot_cpu_data.x86-3)*5) */) | 237 | #define ELF_PLATFORM ("PARISC\0") |
239 | 238 | ||
240 | #define SET_PERSONALITY(ex, ibcs2) \ | 239 | #define SET_PERSONALITY(ex, ibcs2) \ |
241 | current->personality = PER_LINUX; \ | 240 | current->personality = PER_LINUX; \ |
@@ -310,7 +309,7 @@ struct pt_regs; /* forward declaration... */ | |||
310 | #define ELF_OSABI ELFOSABI_LINUX | 309 | #define ELF_OSABI ELFOSABI_LINUX |
311 | 310 | ||
312 | /* %r23 is set by ld.so to a pointer to a function which might be | 311 | /* %r23 is set by ld.so to a pointer to a function which might be |
313 | registered using atexit. This provides a mean for the dynamic | 312 | registered using atexit. This provides a means for the dynamic |
314 | linker to call DT_FINI functions for shared libraries that have | 313 | linker to call DT_FINI functions for shared libraries that have |
315 | been loaded before the code runs. | 314 | been loaded before the code runs. |
316 | 315 | ||
@@ -339,6 +338,5 @@ struct pt_regs; /* forward declaration... */ | |||
339 | but it's not easy, and we've already done it here. */ | 338 | but it's not easy, and we've already done it here. */ |
340 | 339 | ||
341 | #define ELF_HWCAP 0 | 340 | #define ELF_HWCAP 0 |
342 | /* (boot_cpu_data.x86_capability) */ | ||
343 | 341 | ||
344 | #endif | 342 | #endif |
diff --git a/include/asm-parisc/fixmap.h b/include/asm-parisc/fixmap.h index a5caf4b122b7..de3fe3a18229 100644 --- a/include/asm-parisc/fixmap.h +++ b/include/asm-parisc/fixmap.h | |||
@@ -20,4 +20,11 @@ | |||
20 | #define KERNEL_MAP_START (GATEWAY_PAGE_SIZE) | 20 | #define KERNEL_MAP_START (GATEWAY_PAGE_SIZE) |
21 | #define KERNEL_MAP_END (TMPALIAS_MAP_START) | 21 | #define KERNEL_MAP_END (TMPALIAS_MAP_START) |
22 | 22 | ||
23 | #endif | 23 | #ifndef __ASSEMBLY__ |
24 | extern void *vmalloc_start; | ||
25 | #define PCXL_DMA_MAP_SIZE (8*1024*1024) | ||
26 | #define VMALLOC_START ((unsigned long)vmalloc_start) | ||
27 | #define VMALLOC_END (KERNEL_MAP_END) | ||
28 | #endif /*__ASSEMBLY__*/ | ||
29 | |||
30 | #endif /*_ASM_FIXMAP_H*/ | ||
diff --git a/include/asm-parisc/futex.h b/include/asm-parisc/futex.h index dbee6e60aa81..fdc6d055ef7f 100644 --- a/include/asm-parisc/futex.h +++ b/include/asm-parisc/futex.h | |||
@@ -56,6 +56,12 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | |||
56 | int err = 0; | 56 | int err = 0; |
57 | int uval; | 57 | int uval; |
58 | 58 | ||
59 | /* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is | ||
60 | * our gateway page, and causes no end of trouble... | ||
61 | */ | ||
62 | if (segment_eq(KERNEL_DS, get_fs()) && !uaddr) | ||
63 | return -EFAULT; | ||
64 | |||
59 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | 65 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) |
60 | return -EFAULT; | 66 | return -EFAULT; |
61 | 67 | ||
@@ -67,5 +73,5 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | |||
67 | return uval; | 73 | return uval; |
68 | } | 74 | } |
69 | 75 | ||
70 | #endif | 76 | #endif /*__KERNEL__*/ |
71 | #endif | 77 | #endif /*_ASM_PARISC_FUTEX_H*/ |
diff --git a/include/asm-parisc/pdc.h b/include/asm-parisc/pdc.h index deda8c311373..9eaa794c3e4a 100644 --- a/include/asm-parisc/pdc.h +++ b/include/asm-parisc/pdc.h | |||
@@ -645,8 +645,7 @@ int pdc_soft_power_button(int sw_control); | |||
645 | void pdc_io_reset(void); | 645 | void pdc_io_reset(void); |
646 | void pdc_io_reset_devices(void); | 646 | void pdc_io_reset_devices(void); |
647 | int pdc_iodc_getc(void); | 647 | int pdc_iodc_getc(void); |
648 | int pdc_iodc_print(unsigned char *str, unsigned count); | 648 | int pdc_iodc_print(const unsigned char *str, unsigned count); |
649 | void pdc_printf(const char *fmt, ...); | ||
650 | 649 | ||
651 | void pdc_emergency_unlock(void); | 650 | void pdc_emergency_unlock(void); |
652 | int pdc_sti_call(unsigned long func, unsigned long flags, | 651 | int pdc_sti_call(unsigned long func, unsigned long flags, |
diff --git a/include/asm-parisc/pgalloc.h b/include/asm-parisc/pgalloc.h index 3996dfc30a3f..fc987a1c12a8 100644 --- a/include/asm-parisc/pgalloc.h +++ b/include/asm-parisc/pgalloc.h | |||
@@ -138,10 +138,10 @@ static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | |||
138 | free_page((unsigned long)pte); | 138 | free_page((unsigned long)pte); |
139 | } | 139 | } |
140 | 140 | ||
141 | static inline void pte_free_kernel(struct mm_struct *mm, struct page *pte) | 141 | static inline void pte_free(struct mm_struct *mm, struct page *pte) |
142 | { | 142 | { |
143 | pgtable_page_dtor(pte); | 143 | pgtable_page_dtor(pte); |
144 | pte_free_kernel(page_address((pte)); | 144 | pte_free_kernel(mm, page_address(pte)); |
145 | } | 145 | } |
146 | 146 | ||
147 | #define check_pgt_cache() do { } while (0) | 147 | #define check_pgt_cache() do { } while (0) |
diff --git a/include/asm-parisc/pgtable.h b/include/asm-parisc/pgtable.h index cd0fa4f73320..dc86adbec916 100644 --- a/include/asm-parisc/pgtable.h +++ b/include/asm-parisc/pgtable.h | |||
@@ -116,14 +116,6 @@ | |||
116 | 116 | ||
117 | #define FIRST_USER_ADDRESS 0 | 117 | #define FIRST_USER_ADDRESS 0 |
118 | 118 | ||
119 | #ifndef __ASSEMBLY__ | ||
120 | extern void *vmalloc_start; | ||
121 | #define PCXL_DMA_MAP_SIZE (8*1024*1024) | ||
122 | #define VMALLOC_START ((unsigned long)vmalloc_start) | ||
123 | /* this is a fixmap remnant, see fixmap.h */ | ||
124 | #define VMALLOC_END (KERNEL_MAP_END) | ||
125 | #endif | ||
126 | |||
127 | /* NB: The tlb miss handlers make certain assumptions about the order */ | 119 | /* NB: The tlb miss handlers make certain assumptions about the order */ |
128 | /* of the following bits, so be careful (One example, bits 25-31 */ | 120 | /* of the following bits, so be careful (One example, bits 25-31 */ |
129 | /* are moved together in one instruction). */ | 121 | /* are moved together in one instruction). */ |
diff --git a/include/asm-parisc/unistd.h b/include/asm-parisc/unistd.h index 081b4ae61866..a7d857f0e4f4 100644 --- a/include/asm-parisc/unistd.h +++ b/include/asm-parisc/unistd.h | |||
@@ -798,8 +798,11 @@ | |||
798 | #define __NR_timerfd (__NR_Linux + 303) | 798 | #define __NR_timerfd (__NR_Linux + 303) |
799 | #define __NR_eventfd (__NR_Linux + 304) | 799 | #define __NR_eventfd (__NR_Linux + 304) |
800 | #define __NR_fallocate (__NR_Linux + 305) | 800 | #define __NR_fallocate (__NR_Linux + 305) |
801 | #define __NR_timerfd_create (__NR_Linux + 306) | ||
802 | #define __NR_timerfd_settime (__NR_Linux + 307) | ||
803 | #define __NR_timerfd_gettime (__NR_Linux + 308) | ||
801 | 804 | ||
802 | #define __NR_Linux_syscalls (__NR_fallocate + 1) | 805 | #define __NR_Linux_syscalls (__NR_timerfd_gettime + 1) |
803 | 806 | ||
804 | 807 | ||
805 | #define __IGNORE_select /* newselect */ | 808 | #define __IGNORE_select /* newselect */ |
diff --git a/include/asm-powerpc/kprobes.h b/include/asm-powerpc/kprobes.h index afabad230dbb..d0e7701fa1f6 100644 --- a/include/asm-powerpc/kprobes.h +++ b/include/asm-powerpc/kprobes.h | |||
@@ -80,7 +80,6 @@ typedef unsigned int kprobe_opcode_t; | |||
80 | #define is_trap(instr) (IS_TW(instr) || IS_TWI(instr)) | 80 | #define is_trap(instr) (IS_TW(instr) || IS_TWI(instr)) |
81 | #endif | 81 | #endif |
82 | 82 | ||
83 | #define ARCH_SUPPORTS_KRETPROBES | ||
84 | #define flush_insn_slot(p) do { } while (0) | 83 | #define flush_insn_slot(p) do { } while (0) |
85 | #define kretprobe_blacklist_size 0 | 84 | #define kretprobe_blacklist_size 0 |
86 | 85 | ||
diff --git a/include/asm-powerpc/pgtable-ppc32.h b/include/asm-powerpc/pgtable-ppc32.h index d1332bbcbd9b..2c79f550272b 100644 --- a/include/asm-powerpc/pgtable-ppc32.h +++ b/include/asm-powerpc/pgtable-ppc32.h | |||
@@ -339,14 +339,6 @@ extern int icache_44x_need_flush; | |||
339 | #define _PMD_PAGE_MASK 0x000c | 339 | #define _PMD_PAGE_MASK 0x000c |
340 | #define _PMD_PAGE_8M 0x000c | 340 | #define _PMD_PAGE_8M 0x000c |
341 | 341 | ||
342 | /* | ||
343 | * The 8xx TLB miss handler allegedly sets _PAGE_ACCESSED in the PTE | ||
344 | * for an address even if _PAGE_PRESENT is not set, as a performance | ||
345 | * optimization. This is a bug if you ever want to use swap unless | ||
346 | * _PAGE_ACCESSED is 2, which it isn't, or unless you have 8xx-specific | ||
347 | * definitions for __swp_entry etc. below, which would be gross. | ||
348 | * -- paulus | ||
349 | */ | ||
350 | #define _PTE_NONE_MASK _PAGE_ACCESSED | 342 | #define _PTE_NONE_MASK _PAGE_ACCESSED |
351 | 343 | ||
352 | #else /* CONFIG_6xx */ | 344 | #else /* CONFIG_6xx */ |
diff --git a/include/asm-powerpc/reg.h b/include/asm-powerpc/reg.h index 0d6238987df8..edc0cfd7f6e2 100644 --- a/include/asm-powerpc/reg.h +++ b/include/asm-powerpc/reg.h | |||
@@ -153,6 +153,9 @@ | |||
153 | #define CTRL_RUNLATCH 0x1 | 153 | #define CTRL_RUNLATCH 0x1 |
154 | #define SPRN_DABR 0x3F5 /* Data Address Breakpoint Register */ | 154 | #define SPRN_DABR 0x3F5 /* Data Address Breakpoint Register */ |
155 | #define DABR_TRANSLATION (1UL << 2) | 155 | #define DABR_TRANSLATION (1UL << 2) |
156 | #define SPRN_DABRX 0x3F7 /* Data Address Breakpoint Register Extension */ | ||
157 | #define DABRX_USER (1UL << 0) | ||
158 | #define DABRX_KERNEL (1UL << 1) | ||
156 | #define SPRN_DAR 0x013 /* Data Address Register */ | 159 | #define SPRN_DAR 0x013 /* Data Address Register */ |
157 | #define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */ | 160 | #define SPRN_DSISR 0x012 /* Data Storage Interrupt Status Register */ |
158 | #define DSISR_NOHPTE 0x40000000 /* no translation found */ | 161 | #define DSISR_NOHPTE 0x40000000 /* no translation found */ |
diff --git a/include/asm-ppc/pgtable.h b/include/asm-ppc/pgtable.h index 69347bdbb401..70435d32129a 100644 --- a/include/asm-ppc/pgtable.h +++ b/include/asm-ppc/pgtable.h | |||
@@ -299,14 +299,6 @@ extern unsigned long ioremap_bot, ioremap_base; | |||
299 | #define _PMD_PAGE_MASK 0x000c | 299 | #define _PMD_PAGE_MASK 0x000c |
300 | #define _PMD_PAGE_8M 0x000c | 300 | #define _PMD_PAGE_8M 0x000c |
301 | 301 | ||
302 | /* | ||
303 | * The 8xx TLB miss handler allegedly sets _PAGE_ACCESSED in the PTE | ||
304 | * for an address even if _PAGE_PRESENT is not set, as a performance | ||
305 | * optimization. This is a bug if you ever want to use swap unless | ||
306 | * _PAGE_ACCESSED is 2, which it isn't, or unless you have 8xx-specific | ||
307 | * definitions for __swp_entry etc. below, which would be gross. | ||
308 | * -- paulus | ||
309 | */ | ||
310 | #define _PTE_NONE_MASK _PAGE_ACCESSED | 302 | #define _PTE_NONE_MASK _PAGE_ACCESSED |
311 | 303 | ||
312 | #else /* CONFIG_6xx */ | 304 | #else /* CONFIG_6xx */ |
diff --git a/include/asm-s390/kprobes.h b/include/asm-s390/kprobes.h index 948db3d0d05c..330f68caffe4 100644 --- a/include/asm-s390/kprobes.h +++ b/include/asm-s390/kprobes.h | |||
@@ -46,7 +46,6 @@ typedef u16 kprobe_opcode_t; | |||
46 | ? (MAX_STACK_SIZE) \ | 46 | ? (MAX_STACK_SIZE) \ |
47 | : (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR))) | 47 | : (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR))) |
48 | 48 | ||
49 | #define ARCH_SUPPORTS_KRETPROBES | ||
50 | #define kretprobe_blacklist_size 0 | 49 | #define kretprobe_blacklist_size 0 |
51 | 50 | ||
52 | #define KPROBE_SWAP_INST 0x10 | 51 | #define KPROBE_SWAP_INST 0x10 |
diff --git a/include/asm-sh/cpu-sh3/cache.h b/include/asm-sh/cpu-sh3/cache.h index 56bd838b7db4..bee2d81c56bf 100644 --- a/include/asm-sh/cpu-sh3/cache.h +++ b/include/asm-sh/cpu-sh3/cache.h | |||
@@ -35,7 +35,7 @@ | |||
35 | defined(CONFIG_CPU_SUBTYPE_SH7710) || \ | 35 | defined(CONFIG_CPU_SUBTYPE_SH7710) || \ |
36 | defined(CONFIG_CPU_SUBTYPE_SH7720) || \ | 36 | defined(CONFIG_CPU_SUBTYPE_SH7720) || \ |
37 | defined(CONFIG_CPU_SUBTYPE_SH7721) | 37 | defined(CONFIG_CPU_SUBTYPE_SH7721) |
38 | #define CCR3 0xa40000b4 | 38 | #define CCR3_REG 0xa40000b4 |
39 | #define CCR_CACHE_16KB 0x00010000 | 39 | #define CCR_CACHE_16KB 0x00010000 |
40 | #define CCR_CACHE_32KB 0x00020000 | 40 | #define CCR_CACHE_32KB 0x00020000 |
41 | #endif | 41 | #endif |
diff --git a/include/asm-sh/delay.h b/include/asm-sh/delay.h index d5d464041003..4b16bf9b56bd 100644 --- a/include/asm-sh/delay.h +++ b/include/asm-sh/delay.h | |||
@@ -15,7 +15,6 @@ extern void __ndelay(unsigned long nsecs); | |||
15 | extern void __const_udelay(unsigned long xloops); | 15 | extern void __const_udelay(unsigned long xloops); |
16 | extern void __delay(unsigned long loops); | 16 | extern void __delay(unsigned long loops); |
17 | 17 | ||
18 | #ifdef CONFIG_SUPERH32 | ||
19 | #define udelay(n) (__builtin_constant_p(n) ? \ | 18 | #define udelay(n) (__builtin_constant_p(n) ? \ |
20 | ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c6ul)) : \ | 19 | ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c6ul)) : \ |
21 | __udelay(n)) | 20 | __udelay(n)) |
@@ -23,9 +22,5 @@ extern void __delay(unsigned long loops); | |||
23 | #define ndelay(n) (__builtin_constant_p(n) ? \ | 22 | #define ndelay(n) (__builtin_constant_p(n) ? \ |
24 | ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \ | 23 | ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \ |
25 | __ndelay(n)) | 24 | __ndelay(n)) |
26 | #else | ||
27 | extern void udelay(unsigned long usecs); | ||
28 | extern void ndelay(unsigned long nsecs); | ||
29 | #endif | ||
30 | 25 | ||
31 | #endif /* __ASM_SH_DELAY_H */ | 26 | #endif /* __ASM_SH_DELAY_H */ |
diff --git a/include/asm-sh/entry-macros.S b/include/asm-sh/entry-macros.S index 500030eae7aa..2dab0b8d9454 100644 --- a/include/asm-sh/entry-macros.S +++ b/include/asm-sh/entry-macros.S | |||
@@ -12,7 +12,7 @@ | |||
12 | not r11, r11 | 12 | not r11, r11 |
13 | stc sr, r10 | 13 | stc sr, r10 |
14 | and r11, r10 | 14 | and r11, r10 |
15 | #ifdef CONFIG_HAS_SR_RB | 15 | #ifdef CONFIG_CPU_HAS_SR_RB |
16 | stc k_g_imask, r11 | 16 | stc k_g_imask, r11 |
17 | or r11, r10 | 17 | or r11, r10 |
18 | #endif | 18 | #endif |
@@ -20,7 +20,7 @@ | |||
20 | .endm | 20 | .endm |
21 | 21 | ||
22 | .macro get_current_thread_info, ti, tmp | 22 | .macro get_current_thread_info, ti, tmp |
23 | #ifdef CONFIG_HAS_SR_RB | 23 | #ifdef CONFIG_CPU_HAS_SR_RB |
24 | stc r7_bank, \ti | 24 | stc r7_bank, \ti |
25 | #else | 25 | #else |
26 | mov #((THREAD_SIZE - 1) >> 10) ^ 0xff, \tmp | 26 | mov #((THREAD_SIZE - 1) >> 10) ^ 0xff, \tmp |
diff --git a/include/asm-sparc/system.h b/include/asm-sparc/system.h index 45e47c159a6e..4e08210cd4c2 100644 --- a/include/asm-sparc/system.h +++ b/include/asm-sparc/system.h | |||
@@ -44,6 +44,8 @@ extern enum sparc_cpu sparc_cpu_model; | |||
44 | 44 | ||
45 | #define SUN4M_NCPUS 4 /* Architectural limit of sun4m. */ | 45 | #define SUN4M_NCPUS 4 /* Architectural limit of sun4m. */ |
46 | 46 | ||
47 | extern char reboot_command[]; | ||
48 | |||
47 | extern struct thread_info *current_set[NR_CPUS]; | 49 | extern struct thread_info *current_set[NR_CPUS]; |
48 | 50 | ||
49 | extern unsigned long empty_bad_page; | 51 | extern unsigned long empty_bad_page; |
diff --git a/include/asm-sparc64/kprobes.h b/include/asm-sparc64/kprobes.h index 7237dd87663e..5879d71afdaa 100644 --- a/include/asm-sparc64/kprobes.h +++ b/include/asm-sparc64/kprobes.h | |||
@@ -14,8 +14,6 @@ typedef u32 kprobe_opcode_t; | |||
14 | 14 | ||
15 | #define arch_remove_kprobe(p) do {} while (0) | 15 | #define arch_remove_kprobe(p) do {} while (0) |
16 | 16 | ||
17 | #define ARCH_SUPPORTS_KRETPROBES | ||
18 | |||
19 | #define flush_insn_slot(p) \ | 17 | #define flush_insn_slot(p) \ |
20 | do { flushi(&(p)->ainsn.insn[0]); \ | 18 | do { flushi(&(p)->ainsn.insn[0]); \ |
21 | flushi(&(p)->ainsn.insn[1]); \ | 19 | flushi(&(p)->ainsn.insn[1]); \ |
diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h index ed91a5d8d4f0..53eae091a171 100644 --- a/include/asm-sparc64/system.h +++ b/include/asm-sparc64/system.h | |||
@@ -30,6 +30,8 @@ enum sparc_cpu { | |||
30 | #define ARCH_SUN4C_SUN4 0 | 30 | #define ARCH_SUN4C_SUN4 0 |
31 | #define ARCH_SUN4 0 | 31 | #define ARCH_SUN4 0 |
32 | 32 | ||
33 | extern char reboot_command[]; | ||
34 | |||
33 | /* These are here in an effort to more fully work around Spitfire Errata | 35 | /* These are here in an effort to more fully work around Spitfire Errata |
34 | * #51. Essentially, if a memory barrier occurs soon after a mispredicted | 36 | * #51. Essentially, if a memory barrier occurs soon after a mispredicted |
35 | * branch, the chip can stop executing instructions until a trap occurs. | 37 | * branch, the chip can stop executing instructions until a trap occurs. |
diff --git a/include/asm-x86/Kbuild b/include/asm-x86/Kbuild index b04a7ff46df1..3b8160a2b47e 100644 --- a/include/asm-x86/Kbuild +++ b/include/asm-x86/Kbuild | |||
@@ -16,7 +16,6 @@ unifdef-y += ist.h | |||
16 | unifdef-y += mce.h | 16 | unifdef-y += mce.h |
17 | unifdef-y += msr.h | 17 | unifdef-y += msr.h |
18 | unifdef-y += mtrr.h | 18 | unifdef-y += mtrr.h |
19 | unifdef-y += page.h | ||
20 | unifdef-y += posix_types_32.h | 19 | unifdef-y += posix_types_32.h |
21 | unifdef-y += posix_types_64.h | 20 | unifdef-y += posix_types_64.h |
22 | unifdef-y += ptrace.h | 21 | unifdef-y += ptrace.h |
diff --git a/include/asm-x86/futex.h b/include/asm-x86/futex.h index cd9f894dd2d7..c9952ea9f698 100644 --- a/include/asm-x86/futex.h +++ b/include/asm-x86/futex.h | |||
@@ -102,6 +102,13 @@ futex_atomic_op_inuser(int encoded_op, int __user *uaddr) | |||
102 | static inline int | 102 | static inline int |
103 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | 103 | futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) |
104 | { | 104 | { |
105 | |||
106 | #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_BSWAP) | ||
107 | /* Real i386 machines have no cmpxchg instruction */ | ||
108 | if (boot_cpu_data.x86 == 3) | ||
109 | return -ENOSYS; | ||
110 | #endif | ||
111 | |||
105 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | 112 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) |
106 | return -EFAULT; | 113 | return -EFAULT; |
107 | 114 | ||
diff --git a/include/asm-x86/kprobes.h b/include/asm-x86/kprobes.h index 143476a3cb52..61ad7b5d142e 100644 --- a/include/asm-x86/kprobes.h +++ b/include/asm-x86/kprobes.h | |||
@@ -42,7 +42,6 @@ typedef u8 kprobe_opcode_t; | |||
42 | : (((unsigned long)current_thread_info()) + THREAD_SIZE \ | 42 | : (((unsigned long)current_thread_info()) + THREAD_SIZE \ |
43 | - (unsigned long)(ADDR))) | 43 | - (unsigned long)(ADDR))) |
44 | 44 | ||
45 | #define ARCH_SUPPORTS_KRETPROBES | ||
46 | #define flush_insn_slot(p) do { } while (0) | 45 | #define flush_insn_slot(p) do { } while (0) |
47 | 46 | ||
48 | extern const int kretprobe_blacklist_size; | 47 | extern const int kretprobe_blacklist_size; |
diff --git a/include/asm-x86/lguest.h b/include/asm-x86/lguest.h index 4d9367b72976..9b17571e9bc3 100644 --- a/include/asm-x86/lguest.h +++ b/include/asm-x86/lguest.h | |||
@@ -23,6 +23,17 @@ | |||
23 | /* Found in switcher.S */ | 23 | /* Found in switcher.S */ |
24 | extern unsigned long default_idt_entries[]; | 24 | extern unsigned long default_idt_entries[]; |
25 | 25 | ||
26 | /* Declarations for definitions in lguest_guest.S */ | ||
27 | extern char lguest_noirq_start[], lguest_noirq_end[]; | ||
28 | extern const char lgstart_cli[], lgend_cli[]; | ||
29 | extern const char lgstart_sti[], lgend_sti[]; | ||
30 | extern const char lgstart_popf[], lgend_popf[]; | ||
31 | extern const char lgstart_pushf[], lgend_pushf[]; | ||
32 | extern const char lgstart_iret[], lgend_iret[]; | ||
33 | |||
34 | extern void lguest_iret(void); | ||
35 | extern void lguest_init(void); | ||
36 | |||
26 | struct lguest_regs | 37 | struct lguest_regs |
27 | { | 38 | { |
28 | /* Manually saved part. */ | 39 | /* Manually saved part. */ |
diff --git a/include/asm-x86/nops.h b/include/asm-x86/nops.h index fec025c7f58c..e3b2bce0aff8 100644 --- a/include/asm-x86/nops.h +++ b/include/asm-x86/nops.h | |||
@@ -3,17 +3,29 @@ | |||
3 | 3 | ||
4 | /* Define nops for use with alternative() */ | 4 | /* Define nops for use with alternative() */ |
5 | 5 | ||
6 | /* generic versions from gas */ | 6 | /* generic versions from gas |
7 | #define GENERIC_NOP1 ".byte 0x90\n" | 7 | 1: nop |
8 | #define GENERIC_NOP2 ".byte 0x89,0xf6\n" | 8 | 2: movl %esi,%esi |
9 | #define GENERIC_NOP3 ".byte 0x8d,0x76,0x00\n" | 9 | 3: leal 0x00(%esi),%esi |
10 | #define GENERIC_NOP4 ".byte 0x8d,0x74,0x26,0x00\n" | 10 | 4: leal 0x00(,%esi,1),%esi |
11 | #define GENERIC_NOP5 GENERIC_NOP1 GENERIC_NOP4 | 11 | 6: leal 0x00000000(%esi),%esi |
12 | #define GENERIC_NOP6 ".byte 0x8d,0xb6,0x00,0x00,0x00,0x00\n" | 12 | 7: leal 0x00000000(,%esi,1),%esi |
13 | #define GENERIC_NOP7 ".byte 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00\n" | 13 | */ |
14 | #define GENERIC_NOP8 GENERIC_NOP1 GENERIC_NOP7 | 14 | #define GENERIC_NOP1 ".byte 0x90\n" |
15 | #define GENERIC_NOP2 ".byte 0x89,0xf6\n" | ||
16 | #define GENERIC_NOP3 ".byte 0x8d,0x76,0x00\n" | ||
17 | #define GENERIC_NOP4 ".byte 0x8d,0x74,0x26,0x00\n" | ||
18 | #define GENERIC_NOP5 GENERIC_NOP1 GENERIC_NOP4 | ||
19 | #define GENERIC_NOP6 ".byte 0x8d,0xb6,0x00,0x00,0x00,0x00\n" | ||
20 | #define GENERIC_NOP7 ".byte 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00\n" | ||
21 | #define GENERIC_NOP8 GENERIC_NOP1 GENERIC_NOP7 | ||
15 | 22 | ||
16 | /* Opteron 64bit nops */ | 23 | /* Opteron 64bit nops |
24 | 1: nop | ||
25 | 2: osp nop | ||
26 | 3: osp osp nop | ||
27 | 4: osp osp osp nop | ||
28 | */ | ||
17 | #define K8_NOP1 GENERIC_NOP1 | 29 | #define K8_NOP1 GENERIC_NOP1 |
18 | #define K8_NOP2 ".byte 0x66,0x90\n" | 30 | #define K8_NOP2 ".byte 0x66,0x90\n" |
19 | #define K8_NOP3 ".byte 0x66,0x66,0x90\n" | 31 | #define K8_NOP3 ".byte 0x66,0x66,0x90\n" |
@@ -23,19 +35,35 @@ | |||
23 | #define K8_NOP7 K8_NOP4 K8_NOP3 | 35 | #define K8_NOP7 K8_NOP4 K8_NOP3 |
24 | #define K8_NOP8 K8_NOP4 K8_NOP4 | 36 | #define K8_NOP8 K8_NOP4 K8_NOP4 |
25 | 37 | ||
26 | /* K7 nops */ | 38 | /* K7 nops |
27 | /* uses eax dependencies (arbitary choice) */ | 39 | uses eax dependencies (arbitary choice) |
28 | #define K7_NOP1 GENERIC_NOP1 | 40 | 1: nop |
41 | 2: movl %eax,%eax | ||
42 | 3: leal (,%eax,1),%eax | ||
43 | 4: leal 0x00(,%eax,1),%eax | ||
44 | 6: leal 0x00000000(%eax),%eax | ||
45 | 7: leal 0x00000000(,%eax,1),%eax | ||
46 | */ | ||
47 | #define K7_NOP1 GENERIC_NOP1 | ||
29 | #define K7_NOP2 ".byte 0x8b,0xc0\n" | 48 | #define K7_NOP2 ".byte 0x8b,0xc0\n" |
30 | #define K7_NOP3 ".byte 0x8d,0x04,0x20\n" | 49 | #define K7_NOP3 ".byte 0x8d,0x04,0x20\n" |
31 | #define K7_NOP4 ".byte 0x8d,0x44,0x20,0x00\n" | 50 | #define K7_NOP4 ".byte 0x8d,0x44,0x20,0x00\n" |
32 | #define K7_NOP5 K7_NOP4 ASM_NOP1 | 51 | #define K7_NOP5 K7_NOP4 ASM_NOP1 |
33 | #define K7_NOP6 ".byte 0x8d,0x80,0,0,0,0\n" | 52 | #define K7_NOP6 ".byte 0x8d,0x80,0,0,0,0\n" |
34 | #define K7_NOP7 ".byte 0x8D,0x04,0x05,0,0,0,0\n" | 53 | #define K7_NOP7 ".byte 0x8D,0x04,0x05,0,0,0,0\n" |
35 | #define K7_NOP8 K7_NOP7 ASM_NOP1 | 54 | #define K7_NOP8 K7_NOP7 ASM_NOP1 |
36 | 55 | ||
37 | /* P6 nops */ | 56 | /* P6 nops |
38 | /* uses eax dependencies (Intel-recommended choice) */ | 57 | uses eax dependencies (Intel-recommended choice) |
58 | 1: nop | ||
59 | 2: osp nop | ||
60 | 3: nopl (%eax) | ||
61 | 4: nopl 0x00(%eax) | ||
62 | 5: nopl 0x00(%eax,%eax,1) | ||
63 | 6: osp nopl 0x00(%eax,%eax,1) | ||
64 | 7: nopl 0x00000000(%eax) | ||
65 | 8: nopl 0x00000000(%eax,%eax,1) | ||
66 | */ | ||
39 | #define P6_NOP1 GENERIC_NOP1 | 67 | #define P6_NOP1 GENERIC_NOP1 |
40 | #define P6_NOP2 ".byte 0x66,0x90\n" | 68 | #define P6_NOP2 ".byte 0x66,0x90\n" |
41 | #define P6_NOP3 ".byte 0x0f,0x1f,0x00\n" | 69 | #define P6_NOP3 ".byte 0x0f,0x1f,0x00\n" |
@@ -63,9 +91,7 @@ | |||
63 | #define ASM_NOP6 K7_NOP6 | 91 | #define ASM_NOP6 K7_NOP6 |
64 | #define ASM_NOP7 K7_NOP7 | 92 | #define ASM_NOP7 K7_NOP7 |
65 | #define ASM_NOP8 K7_NOP8 | 93 | #define ASM_NOP8 K7_NOP8 |
66 | #elif defined(CONFIG_M686) || defined(CONFIG_MPENTIUMII) || \ | 94 | #elif defined(CONFIG_X86_P6_NOP) |
67 | defined(CONFIG_MPENTIUMIII) || defined(CONFIG_MPENTIUMM) || \ | ||
68 | defined(CONFIG_MCORE2) || defined(CONFIG_PENTIUM4) | ||
69 | #define ASM_NOP1 P6_NOP1 | 95 | #define ASM_NOP1 P6_NOP1 |
70 | #define ASM_NOP2 P6_NOP2 | 96 | #define ASM_NOP2 P6_NOP2 |
71 | #define ASM_NOP3 P6_NOP3 | 97 | #define ASM_NOP3 P6_NOP3 |
diff --git a/include/asm-x86/page_64.h b/include/asm-x86/page_64.h index f7393bc516ef..143546073b95 100644 --- a/include/asm-x86/page_64.h +++ b/include/asm-x86/page_64.h | |||
@@ -47,8 +47,12 @@ | |||
47 | #define __PHYSICAL_MASK_SHIFT 46 | 47 | #define __PHYSICAL_MASK_SHIFT 46 |
48 | #define __VIRTUAL_MASK_SHIFT 48 | 48 | #define __VIRTUAL_MASK_SHIFT 48 |
49 | 49 | ||
50 | #define KERNEL_TEXT_SIZE (40*1024*1024) | 50 | /* |
51 | #define KERNEL_TEXT_START _AC(0xffffffff80000000, UL) | 51 | * Kernel image size is limited to 128 MB (see level2_kernel_pgt in |
52 | * arch/x86/kernel/head_64.S), and it is mapped here: | ||
53 | */ | ||
54 | #define KERNEL_IMAGE_SIZE (128*1024*1024) | ||
55 | #define KERNEL_IMAGE_START _AC(0xffffffff80000000, UL) | ||
52 | 56 | ||
53 | #ifndef __ASSEMBLY__ | 57 | #ifndef __ASSEMBLY__ |
54 | void clear_page(void *page); | 58 | void clear_page(void *page); |
diff --git a/include/asm-x86/pgtable_32.h b/include/asm-x86/pgtable_32.h index a842c7222b1e..4e6a0fca0b47 100644 --- a/include/asm-x86/pgtable_32.h +++ b/include/asm-x86/pgtable_32.h | |||
@@ -26,10 +26,9 @@ struct mm_struct; | |||
26 | struct vm_area_struct; | 26 | struct vm_area_struct; |
27 | 27 | ||
28 | extern pgd_t swapper_pg_dir[1024]; | 28 | extern pgd_t swapper_pg_dir[1024]; |
29 | extern struct kmem_cache *pmd_cache; | ||
30 | void check_pgt_cache(void); | ||
31 | 29 | ||
32 | static inline void pgtable_cache_init(void) {} | 30 | static inline void pgtable_cache_init(void) { } |
31 | static inline void check_pgt_cache(void) { } | ||
33 | void paging_init(void); | 32 | void paging_init(void); |
34 | 33 | ||
35 | 34 | ||
diff --git a/include/asm-x86/ptrace-abi.h b/include/asm-x86/ptrace-abi.h index 81a8ee4c55fc..f224eb3c3157 100644 --- a/include/asm-x86/ptrace-abi.h +++ b/include/asm-x86/ptrace-abi.h | |||
@@ -89,13 +89,13 @@ | |||
89 | */ | 89 | */ |
90 | struct ptrace_bts_config { | 90 | struct ptrace_bts_config { |
91 | /* requested or actual size of BTS buffer in bytes */ | 91 | /* requested or actual size of BTS buffer in bytes */ |
92 | u32 size; | 92 | __u32 size; |
93 | /* bitmask of below flags */ | 93 | /* bitmask of below flags */ |
94 | u32 flags; | 94 | __u32 flags; |
95 | /* buffer overflow signal */ | 95 | /* buffer overflow signal */ |
96 | u32 signal; | 96 | __u32 signal; |
97 | /* actual size of bts_struct in bytes */ | 97 | /* actual size of bts_struct in bytes */ |
98 | u32 bts_size; | 98 | __u32 bts_size; |
99 | }; | 99 | }; |
100 | #endif | 100 | #endif |
101 | 101 | ||
diff --git a/include/crypto/internal/skcipher.h b/include/crypto/internal/skcipher.h index 2ba42cd7d6aa..ccc32bad9a89 100644 --- a/include/crypto/internal/skcipher.h +++ b/include/crypto/internal/skcipher.h | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | #include <crypto/algapi.h> | 16 | #include <crypto/algapi.h> |
17 | #include <crypto/skcipher.h> | 17 | #include <crypto/skcipher.h> |
18 | #include <linux/init.h> | ||
18 | #include <linux/types.h> | 19 | #include <linux/types.h> |
19 | 20 | ||
20 | struct rtattr; | 21 | struct rtattr; |
@@ -64,6 +65,11 @@ void skcipher_geniv_free(struct crypto_instance *inst); | |||
64 | int skcipher_geniv_init(struct crypto_tfm *tfm); | 65 | int skcipher_geniv_init(struct crypto_tfm *tfm); |
65 | void skcipher_geniv_exit(struct crypto_tfm *tfm); | 66 | void skcipher_geniv_exit(struct crypto_tfm *tfm); |
66 | 67 | ||
68 | int __init eseqiv_module_init(void); | ||
69 | void __exit eseqiv_module_exit(void); | ||
70 | int __init chainiv_module_init(void); | ||
71 | void chainiv_module_exit(void); | ||
72 | |||
67 | static inline struct crypto_ablkcipher *skcipher_geniv_cipher( | 73 | static inline struct crypto_ablkcipher *skcipher_geniv_cipher( |
68 | struct crypto_ablkcipher *geniv) | 74 | struct crypto_ablkcipher *geniv) |
69 | { | 75 | { |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index aada32fffec2..0fac822c1157 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -61,6 +61,7 @@ header-y += efs_fs_sb.h | |||
61 | header-y += elf-fdpic.h | 61 | header-y += elf-fdpic.h |
62 | header-y += elf-em.h | 62 | header-y += elf-em.h |
63 | header-y += fadvise.h | 63 | header-y += fadvise.h |
64 | header-y += falloc.h | ||
64 | header-y += fd.h | 65 | header-y += fd.h |
65 | header-y += fdreg.h | 66 | header-y += fdreg.h |
66 | header-y += fib_rules.h | 67 | header-y += fib_rules.h |
@@ -204,7 +205,6 @@ unifdef-y += futex.h | |||
204 | unifdef-y += fs.h | 205 | unifdef-y += fs.h |
205 | unifdef-y += gameport.h | 206 | unifdef-y += gameport.h |
206 | unifdef-y += generic_serial.h | 207 | unifdef-y += generic_serial.h |
207 | unifdef-y += genhd.h | ||
208 | unifdef-y += gfs2_ondisk.h | 208 | unifdef-y += gfs2_ondisk.h |
209 | unifdef-y += hayesesp.h | 209 | unifdef-y += hayesesp.h |
210 | unifdef-y += hdlcdrv.h | 210 | unifdef-y += hdlcdrv.h |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 6fe67d1939c2..6f79d40dd3c0 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -216,8 +216,8 @@ struct request { | |||
216 | unsigned int cmd_len; | 216 | unsigned int cmd_len; |
217 | unsigned char cmd[BLK_MAX_CDB]; | 217 | unsigned char cmd[BLK_MAX_CDB]; |
218 | 218 | ||
219 | unsigned int raw_data_len; | ||
220 | unsigned int data_len; | 219 | unsigned int data_len; |
220 | unsigned int extra_len; /* length of alignment and padding */ | ||
221 | unsigned int sense_len; | 221 | unsigned int sense_len; |
222 | void *data; | 222 | void *data; |
223 | void *sense; | 223 | void *sense; |
@@ -362,6 +362,7 @@ struct request_queue | |||
362 | unsigned long seg_boundary_mask; | 362 | unsigned long seg_boundary_mask; |
363 | void *dma_drain_buffer; | 363 | void *dma_drain_buffer; |
364 | unsigned int dma_drain_size; | 364 | unsigned int dma_drain_size; |
365 | unsigned int dma_pad_mask; | ||
365 | unsigned int dma_alignment; | 366 | unsigned int dma_alignment; |
366 | 367 | ||
367 | struct blk_queue_tag *queue_tags; | 368 | struct blk_queue_tag *queue_tags; |
@@ -701,6 +702,7 @@ extern void blk_queue_max_hw_segments(struct request_queue *, unsigned short); | |||
701 | extern void blk_queue_max_segment_size(struct request_queue *, unsigned int); | 702 | extern void blk_queue_max_segment_size(struct request_queue *, unsigned int); |
702 | extern void blk_queue_hardsect_size(struct request_queue *, unsigned short); | 703 | extern void blk_queue_hardsect_size(struct request_queue *, unsigned short); |
703 | extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b); | 704 | extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b); |
705 | extern void blk_queue_dma_pad(struct request_queue *, unsigned int); | ||
704 | extern int blk_queue_dma_drain(struct request_queue *q, | 706 | extern int blk_queue_dma_drain(struct request_queue *q, |
705 | dma_drain_needed_fn *dma_drain_needed, | 707 | dma_drain_needed_fn *dma_drain_needed, |
706 | void *buf, unsigned int size); | 708 | void *buf, unsigned int size); |
diff --git a/include/linux/cgroup_subsys.h b/include/linux/cgroup_subsys.h index ac6aad98b607..1ddebfc52565 100644 --- a/include/linux/cgroup_subsys.h +++ b/include/linux/cgroup_subsys.h | |||
@@ -37,7 +37,7 @@ SUBSYS(cpuacct) | |||
37 | 37 | ||
38 | /* */ | 38 | /* */ |
39 | 39 | ||
40 | #ifdef CONFIG_CGROUP_MEM_CONT | 40 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
41 | SUBSYS(mem_cgroup) | 41 | SUBSYS(mem_cgroup) |
42 | #endif | 42 | #endif |
43 | 43 | ||
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index d0e17e1657dc..dcae0c8d97e6 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
@@ -138,6 +138,12 @@ extern void __chk_io_ptr(const volatile void __iomem *); | |||
138 | #define noinline | 138 | #define noinline |
139 | #endif | 139 | #endif |
140 | 140 | ||
141 | /* | ||
142 | * Rather then using noinline to prevent stack consumption, use | ||
143 | * noinline_for_stack instead. For documentaiton reasons. | ||
144 | */ | ||
145 | #define noinline_for_stack noinline | ||
146 | |||
141 | #ifndef __always_inline | 147 | #ifndef __always_inline |
142 | #define __always_inline inline | 148 | #define __always_inline inline |
143 | #endif | 149 | #endif |
diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h index f592d6de3b97..7266124361b4 100644 --- a/include/linux/debugfs.h +++ b/include/linux/debugfs.h | |||
@@ -27,6 +27,11 @@ struct debugfs_blob_wrapper { | |||
27 | }; | 27 | }; |
28 | 28 | ||
29 | #if defined(CONFIG_DEBUG_FS) | 29 | #if defined(CONFIG_DEBUG_FS) |
30 | |||
31 | /* declared over in file.c */ | ||
32 | extern const struct file_operations debugfs_file_operations; | ||
33 | extern const struct inode_operations debugfs_link_operations; | ||
34 | |||
30 | struct dentry *debugfs_create_file(const char *name, mode_t mode, | 35 | struct dentry *debugfs_create_file(const char *name, mode_t mode, |
31 | struct dentry *parent, void *data, | 36 | struct dentry *parent, void *data, |
32 | const struct file_operations *fops); | 37 | const struct file_operations *fops); |
diff --git a/include/linux/delay.h b/include/linux/delay.h index 17ddb55430ae..54552d21296e 100644 --- a/include/linux/delay.h +++ b/include/linux/delay.h | |||
@@ -7,6 +7,8 @@ | |||
7 | * Delay routines, using a pre-computed "loops_per_jiffy" value. | 7 | * Delay routines, using a pre-computed "loops_per_jiffy" value. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/kernel.h> | ||
11 | |||
10 | extern unsigned long loops_per_jiffy; | 12 | extern unsigned long loops_per_jiffy; |
11 | 13 | ||
12 | #include <asm/delay.h> | 14 | #include <asm/delay.h> |
@@ -32,7 +34,11 @@ extern unsigned long loops_per_jiffy; | |||
32 | #endif | 34 | #endif |
33 | 35 | ||
34 | #ifndef ndelay | 36 | #ifndef ndelay |
35 | #define ndelay(x) udelay(((x)+999)/1000) | 37 | static inline void ndelay(unsigned long x) |
38 | { | ||
39 | udelay(DIV_ROUND_UP(x, 1000)); | ||
40 | } | ||
41 | #define ndelay(x) ndelay(x) | ||
36 | #endif | 42 | #endif |
37 | 43 | ||
38 | void calibrate_delay(void); | 44 | void calibrate_delay(void); |
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index acbb364674ff..261e43a4c873 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h | |||
@@ -366,7 +366,7 @@ __dma_has_cap(enum dma_transaction_type tx_type, dma_cap_mask_t *srcp) | |||
366 | */ | 366 | */ |
367 | static inline void dma_async_issue_pending(struct dma_chan *chan) | 367 | static inline void dma_async_issue_pending(struct dma_chan *chan) |
368 | { | 368 | { |
369 | return chan->device->device_issue_pending(chan); | 369 | chan->device->device_issue_pending(chan); |
370 | } | 370 | } |
371 | 371 | ||
372 | #define dma_async_memcpy_issue_pending(chan) dma_async_issue_pending(chan) | 372 | #define dma_async_memcpy_issue_pending(chan) dma_async_issue_pending(chan) |
diff --git a/include/linux/elfcore-compat.h b/include/linux/elfcore-compat.h index 532d13adabc4..0a90e1c3a422 100644 --- a/include/linux/elfcore-compat.h +++ b/include/linux/elfcore-compat.h | |||
@@ -45,8 +45,8 @@ struct compat_elf_prpsinfo | |||
45 | char pr_zomb; | 45 | char pr_zomb; |
46 | char pr_nice; | 46 | char pr_nice; |
47 | compat_ulong_t pr_flag; | 47 | compat_ulong_t pr_flag; |
48 | compat_uid_t pr_uid; | 48 | __compat_uid_t pr_uid; |
49 | compat_gid_t pr_gid; | 49 | __compat_gid_t pr_gid; |
50 | compat_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid; | 50 | compat_pid_t pr_pid, pr_ppid, pr_pgrp, pr_sid; |
51 | char pr_fname[16]; | 51 | char pr_fname[16]; |
52 | char pr_psargs[ELF_PRARGSZ]; | 52 | char pr_psargs[ELF_PRARGSZ]; |
diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index 51d214138814..adcbb05b120b 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h | |||
@@ -49,11 +49,11 @@ struct fid { | |||
49 | 49 | ||
50 | /** | 50 | /** |
51 | * struct export_operations - for nfsd to communicate with file systems | 51 | * struct export_operations - for nfsd to communicate with file systems |
52 | * @decode_fh: decode a file handle fragment and return a &struct dentry | ||
53 | * @encode_fh: encode a file handle fragment from a dentry | 52 | * @encode_fh: encode a file handle fragment from a dentry |
53 | * @fh_to_dentry: find the implied object and get a dentry for it | ||
54 | * @fh_to_parent: find the implied object's parent and get a dentry for it | ||
54 | * @get_name: find the name for a given inode in a given directory | 55 | * @get_name: find the name for a given inode in a given directory |
55 | * @get_parent: find the parent of a given directory | 56 | * @get_parent: find the parent of a given directory |
56 | * @get_dentry: find a dentry for the inode given a file handle sub-fragment | ||
57 | * | 57 | * |
58 | * See Documentation/filesystems/Exporting for details on how to use | 58 | * See Documentation/filesystems/Exporting for details on how to use |
59 | * this interface correctly. | 59 | * this interface correctly. |
diff --git a/include/linux/ext4_fs_extents.h b/include/linux/ext4_fs_extents.h index 697da4bce6c5..1285c583b2d8 100644 --- a/include/linux/ext4_fs_extents.h +++ b/include/linux/ext4_fs_extents.h | |||
@@ -227,5 +227,6 @@ extern int ext4_ext_search_left(struct inode *, struct ext4_ext_path *, | |||
227 | ext4_lblk_t *, ext4_fsblk_t *); | 227 | ext4_lblk_t *, ext4_fsblk_t *); |
228 | extern int ext4_ext_search_right(struct inode *, struct ext4_ext_path *, | 228 | extern int ext4_ext_search_right(struct inode *, struct ext4_ext_path *, |
229 | ext4_lblk_t *, ext4_fsblk_t *); | 229 | ext4_lblk_t *, ext4_fsblk_t *); |
230 | extern void ext4_ext_drop_refs(struct ext4_ext_path *); | ||
230 | #endif /* _LINUX_EXT4_EXTENTS */ | 231 | #endif /* _LINUX_EXT4_EXTENTS */ |
231 | 232 | ||
diff --git a/include/linux/firmware.h b/include/linux/firmware.h index 33d8f2087b6e..4d10c7328d2d 100644 --- a/include/linux/firmware.h +++ b/include/linux/firmware.h | |||
@@ -10,7 +10,10 @@ struct firmware { | |||
10 | size_t size; | 10 | size_t size; |
11 | u8 *data; | 11 | u8 *data; |
12 | }; | 12 | }; |
13 | |||
13 | struct device; | 14 | struct device; |
15 | |||
16 | #if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE) | ||
14 | int request_firmware(const struct firmware **fw, const char *name, | 17 | int request_firmware(const struct firmware **fw, const char *name, |
15 | struct device *device); | 18 | struct device *device); |
16 | int request_firmware_nowait( | 19 | int request_firmware_nowait( |
@@ -19,4 +22,24 @@ int request_firmware_nowait( | |||
19 | void (*cont)(const struct firmware *fw, void *context)); | 22 | void (*cont)(const struct firmware *fw, void *context)); |
20 | 23 | ||
21 | void release_firmware(const struct firmware *fw); | 24 | void release_firmware(const struct firmware *fw); |
25 | #else | ||
26 | static inline int request_firmware(const struct firmware **fw, | ||
27 | const char *name, | ||
28 | struct device *device) | ||
29 | { | ||
30 | return -EINVAL; | ||
31 | } | ||
32 | static inline int request_firmware_nowait( | ||
33 | struct module *module, int uevent, | ||
34 | const char *name, struct device *device, void *context, | ||
35 | void (*cont)(const struct firmware *fw, void *context)) | ||
36 | { | ||
37 | return -EINVAL; | ||
38 | } | ||
39 | |||
40 | static inline void release_firmware(const struct firmware *fw) | ||
41 | { | ||
42 | } | ||
43 | #endif | ||
44 | |||
22 | #endif | 45 | #endif |
diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 09a3b18918c7..ecd2bf63fc84 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h | |||
@@ -18,11 +18,13 @@ | |||
18 | #define dev_to_disk(device) container_of(device, struct gendisk, dev) | 18 | #define dev_to_disk(device) container_of(device, struct gendisk, dev) |
19 | #define dev_to_part(device) container_of(device, struct hd_struct, dev) | 19 | #define dev_to_part(device) container_of(device, struct hd_struct, dev) |
20 | 20 | ||
21 | extern struct device_type disk_type; | ||
22 | extern struct device_type part_type; | 21 | extern struct device_type part_type; |
23 | extern struct kobject *block_depr; | 22 | extern struct kobject *block_depr; |
24 | extern struct class block_class; | 23 | extern struct class block_class; |
25 | 24 | ||
25 | extern const struct seq_operations partitions_op; | ||
26 | extern const struct seq_operations diskstats_op; | ||
27 | |||
26 | enum { | 28 | enum { |
27 | /* These three have identical behaviour; use the second one if DOS FDISK gets | 29 | /* These three have identical behaviour; use the second one if DOS FDISK gets |
28 | confused about extended/logical partitions starting past cylinder 1023. */ | 30 | confused about extended/logical partitions starting past cylinder 1023. */ |
@@ -53,24 +55,6 @@ enum { | |||
53 | UNIXWARE_PARTITION = 0x63, /* Same as GNU_HURD and SCO Unix */ | 55 | UNIXWARE_PARTITION = 0x63, /* Same as GNU_HURD and SCO Unix */ |
54 | }; | 56 | }; |
55 | 57 | ||
56 | #ifndef __KERNEL__ | ||
57 | |||
58 | struct partition { | ||
59 | unsigned char boot_ind; /* 0x80 - active */ | ||
60 | unsigned char head; /* starting head */ | ||
61 | unsigned char sector; /* starting sector */ | ||
62 | unsigned char cyl; /* starting cylinder */ | ||
63 | unsigned char sys_ind; /* What partition type */ | ||
64 | unsigned char end_head; /* end head */ | ||
65 | unsigned char end_sector; /* end sector */ | ||
66 | unsigned char end_cyl; /* end cylinder */ | ||
67 | unsigned int start_sect; /* starting sector counting from 0 */ | ||
68 | unsigned int nr_sects; /* nr of sectors in partition */ | ||
69 | } __attribute__((packed)); | ||
70 | |||
71 | #endif | ||
72 | |||
73 | #ifdef __KERNEL__ | ||
74 | #include <linux/major.h> | 58 | #include <linux/major.h> |
75 | #include <linux/device.h> | 59 | #include <linux/device.h> |
76 | #include <linux/smp.h> | 60 | #include <linux/smp.h> |
@@ -226,7 +210,7 @@ static inline void part_stat_set_all(struct hd_struct *part, int value) { | |||
226 | sizeof(struct disk_stats)); | 210 | sizeof(struct disk_stats)); |
227 | } | 211 | } |
228 | 212 | ||
229 | #else | 213 | #else /* !CONFIG_SMP */ |
230 | #define __disk_stat_add(gendiskp, field, addnd) \ | 214 | #define __disk_stat_add(gendiskp, field, addnd) \ |
231 | (gendiskp->dkstats.field += addnd) | 215 | (gendiskp->dkstats.field += addnd) |
232 | #define disk_stat_read(gendiskp, field) (gendiskp->dkstats.field) | 216 | #define disk_stat_read(gendiskp, field) (gendiskp->dkstats.field) |
@@ -254,7 +238,7 @@ static inline void part_stat_set_all(struct hd_struct *part, int value) | |||
254 | memset(&part->dkstats, value, sizeof(struct disk_stats)); | 238 | memset(&part->dkstats, value, sizeof(struct disk_stats)); |
255 | } | 239 | } |
256 | 240 | ||
257 | #endif | 241 | #endif /* CONFIG_SMP */ |
258 | 242 | ||
259 | #define disk_stat_add(gendiskp, field, addnd) \ | 243 | #define disk_stat_add(gendiskp, field, addnd) \ |
260 | do { \ | 244 | do { \ |
@@ -393,8 +377,6 @@ static inline void set_capacity(struct gendisk *disk, sector_t size) | |||
393 | disk->capacity = size; | 377 | disk->capacity = size; |
394 | } | 378 | } |
395 | 379 | ||
396 | #endif /* __KERNEL__ */ | ||
397 | |||
398 | #ifdef CONFIG_SOLARIS_X86_PARTITION | 380 | #ifdef CONFIG_SOLARIS_X86_PARTITION |
399 | 381 | ||
400 | #define SOLARIS_X86_NUMSLICE 16 | 382 | #define SOLARIS_X86_NUMSLICE 16 |
@@ -538,8 +520,6 @@ struct unixware_disklabel { | |||
538 | # define MINIX_NR_SUBPARTITIONS 4 | 520 | # define MINIX_NR_SUBPARTITIONS 4 |
539 | #endif /* CONFIG_MINIX_SUBPARTITION */ | 521 | #endif /* CONFIG_MINIX_SUBPARTITION */ |
540 | 522 | ||
541 | #ifdef __KERNEL__ | ||
542 | |||
543 | #define ADDPART_FLAG_NONE 0 | 523 | #define ADDPART_FLAG_NONE 0 |
544 | #define ADDPART_FLAG_RAID 1 | 524 | #define ADDPART_FLAG_RAID 1 |
545 | #define ADDPART_FLAG_WHOLEDISK 2 | 525 | #define ADDPART_FLAG_WHOLEDISK 2 |
@@ -556,7 +536,6 @@ extern struct gendisk *alloc_disk_node(int minors, int node_id); | |||
556 | extern struct gendisk *alloc_disk(int minors); | 536 | extern struct gendisk *alloc_disk(int minors); |
557 | extern struct kobject *get_disk(struct gendisk *disk); | 537 | extern struct kobject *get_disk(struct gendisk *disk); |
558 | extern void put_disk(struct gendisk *disk); | 538 | extern void put_disk(struct gendisk *disk); |
559 | extern void genhd_media_change_notify(struct gendisk *disk); | ||
560 | extern void blk_register_region(dev_t devt, unsigned long range, | 539 | extern void blk_register_region(dev_t devt, unsigned long range, |
561 | struct module *module, | 540 | struct module *module, |
562 | struct kobject *(*probe)(dev_t, int *, void *), | 541 | struct kobject *(*probe)(dev_t, int *, void *), |
@@ -569,8 +548,6 @@ static inline struct block_device *bdget_disk(struct gendisk *disk, int index) | |||
569 | return bdget(MKDEV(disk->major, disk->first_minor) + index); | 548 | return bdget(MKDEV(disk->major, disk->first_minor) + index); |
570 | } | 549 | } |
571 | 550 | ||
572 | #endif | ||
573 | |||
574 | #else /* CONFIG_BLOCK */ | 551 | #else /* CONFIG_BLOCK */ |
575 | 552 | ||
576 | static inline void printk_all_partitions(void) { } | 553 | static inline void printk_all_partitions(void) { } |
@@ -583,4 +560,4 @@ static inline dev_t blk_lookup_devt(const char *name) | |||
583 | 560 | ||
584 | #endif /* CONFIG_BLOCK */ | 561 | #endif /* CONFIG_BLOCK */ |
585 | 562 | ||
586 | #endif | 563 | #endif /* _LINUX_GENHD_H */ |
diff --git a/include/linux/gpio.h b/include/linux/gpio.h new file mode 100644 index 000000000000..4987a84078ef --- /dev/null +++ b/include/linux/gpio.h | |||
@@ -0,0 +1,95 @@ | |||
1 | #ifndef __LINUX_GPIO_H | ||
2 | #define __LINUX_GPIO_H | ||
3 | |||
4 | /* see Documentation/gpio.txt */ | ||
5 | |||
6 | #ifdef CONFIG_GENERIC_GPIO | ||
7 | #include <asm/gpio.h> | ||
8 | |||
9 | #else | ||
10 | |||
11 | /* | ||
12 | * Some platforms don't support the GPIO programming interface. | ||
13 | * | ||
14 | * In case some driver uses it anyway (it should normally have | ||
15 | * depended on GENERIC_GPIO), these routines help the compiler | ||
16 | * optimize out much GPIO-related code ... or trigger a runtime | ||
17 | * warning when something is wrongly called. | ||
18 | */ | ||
19 | |||
20 | static inline int gpio_is_valid(int number) | ||
21 | { | ||
22 | return 0; | ||
23 | } | ||
24 | |||
25 | static inline int gpio_request(unsigned gpio, const char *label) | ||
26 | { | ||
27 | return -ENOSYS; | ||
28 | } | ||
29 | |||
30 | static inline void gpio_free(unsigned gpio) | ||
31 | { | ||
32 | /* GPIO can never have been requested */ | ||
33 | WARN_ON(1); | ||
34 | } | ||
35 | |||
36 | static inline int gpio_direction_input(unsigned gpio) | ||
37 | { | ||
38 | return -ENOSYS; | ||
39 | } | ||
40 | |||
41 | static inline int gpio_direction_output(unsigned gpio, int value) | ||
42 | { | ||
43 | return -ENOSYS; | ||
44 | } | ||
45 | |||
46 | static inline int gpio_get_value(unsigned gpio) | ||
47 | { | ||
48 | /* GPIO can never have been requested or set as {in,out}put */ | ||
49 | WARN_ON(1); | ||
50 | return 0; | ||
51 | } | ||
52 | |||
53 | static inline void gpio_set_value(unsigned gpio, int value) | ||
54 | { | ||
55 | /* GPIO can never have been requested or set as output */ | ||
56 | WARN_ON(1); | ||
57 | } | ||
58 | |||
59 | static inline int gpio_cansleep(unsigned gpio) | ||
60 | { | ||
61 | /* GPIO can never have been requested or set as {in,out}put */ | ||
62 | WARN_ON(1); | ||
63 | return 0; | ||
64 | } | ||
65 | |||
66 | static inline int gpio_get_value_cansleep(unsigned gpio) | ||
67 | { | ||
68 | /* GPIO can never have been requested or set as {in,out}put */ | ||
69 | WARN_ON(1); | ||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | static inline void gpio_set_value_cansleep(unsigned gpio, int value) | ||
74 | { | ||
75 | /* GPIO can never have been requested or set as output */ | ||
76 | WARN_ON(1); | ||
77 | } | ||
78 | |||
79 | static inline int gpio_to_irq(unsigned gpio) | ||
80 | { | ||
81 | /* GPIO can never have been requested or set as input */ | ||
82 | WARN_ON(1); | ||
83 | return -EINVAL; | ||
84 | } | ||
85 | |||
86 | static inline int irq_to_gpio(unsigned irq) | ||
87 | { | ||
88 | /* irq can never have been returned from gpio_to_irq() */ | ||
89 | WARN_ON(1); | ||
90 | return -EINVAL; | ||
91 | } | ||
92 | |||
93 | #endif | ||
94 | |||
95 | #endif /* __LINUX_GPIO_H */ | ||
diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h index 2961ec788046..49829988bfa0 100644 --- a/include/linux/hardirq.h +++ b/include/linux/hardirq.h | |||
@@ -109,6 +109,14 @@ static inline void account_system_vtime(struct task_struct *tsk) | |||
109 | } | 109 | } |
110 | #endif | 110 | #endif |
111 | 111 | ||
112 | #if defined(CONFIG_PREEMPT_RCU) && defined(CONFIG_NO_HZ) | ||
113 | extern void rcu_irq_enter(void); | ||
114 | extern void rcu_irq_exit(void); | ||
115 | #else | ||
116 | # define rcu_irq_enter() do { } while (0) | ||
117 | # define rcu_irq_exit() do { } while (0) | ||
118 | #endif /* CONFIG_PREEMPT_RCU */ | ||
119 | |||
112 | /* | 120 | /* |
113 | * It is safe to do non-atomic ops on ->hardirq_context, | 121 | * It is safe to do non-atomic ops on ->hardirq_context, |
114 | * because NMI handlers may not preempt and the ops are | 122 | * because NMI handlers may not preempt and the ops are |
@@ -117,6 +125,7 @@ static inline void account_system_vtime(struct task_struct *tsk) | |||
117 | */ | 125 | */ |
118 | #define __irq_enter() \ | 126 | #define __irq_enter() \ |
119 | do { \ | 127 | do { \ |
128 | rcu_irq_enter(); \ | ||
120 | account_system_vtime(current); \ | 129 | account_system_vtime(current); \ |
121 | add_preempt_count(HARDIRQ_OFFSET); \ | 130 | add_preempt_count(HARDIRQ_OFFSET); \ |
122 | trace_hardirq_enter(); \ | 131 | trace_hardirq_enter(); \ |
@@ -135,6 +144,7 @@ extern void irq_enter(void); | |||
135 | trace_hardirq_exit(); \ | 144 | trace_hardirq_exit(); \ |
136 | account_system_vtime(current); \ | 145 | account_system_vtime(current); \ |
137 | sub_preempt_count(HARDIRQ_OFFSET); \ | 146 | sub_preempt_count(HARDIRQ_OFFSET); \ |
147 | rcu_irq_exit(); \ | ||
138 | } while (0) | 148 | } while (0) |
139 | 149 | ||
140 | /* | 150 | /* |
diff --git a/include/linux/iommu-helper.h b/include/linux/iommu-helper.h index 4dd4c04ff2f4..c975caf75385 100644 --- a/include/linux/iommu-helper.h +++ b/include/linux/iommu-helper.h | |||
@@ -1,3 +1,6 @@ | |||
1 | extern int iommu_is_span_boundary(unsigned int index, unsigned int nr, | ||
2 | unsigned long shift, | ||
3 | unsigned long boundary_size); | ||
1 | extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, | 4 | extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, |
2 | unsigned long start, unsigned int nr, | 5 | unsigned long start, unsigned int nr, |
3 | unsigned long shift, | 6 | unsigned long shift, |
diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h index 4a6ce82ba039..0f28486f6360 100644 --- a/include/linux/kprobes.h +++ b/include/linux/kprobes.h | |||
@@ -125,11 +125,11 @@ struct jprobe { | |||
125 | DECLARE_PER_CPU(struct kprobe *, current_kprobe); | 125 | DECLARE_PER_CPU(struct kprobe *, current_kprobe); |
126 | DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); | 126 | DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); |
127 | 127 | ||
128 | #ifdef ARCH_SUPPORTS_KRETPROBES | 128 | #ifdef CONFIG_KRETPROBES |
129 | extern void arch_prepare_kretprobe(struct kretprobe_instance *ri, | 129 | extern void arch_prepare_kretprobe(struct kretprobe_instance *ri, |
130 | struct pt_regs *regs); | 130 | struct pt_regs *regs); |
131 | extern int arch_trampoline_kprobe(struct kprobe *p); | 131 | extern int arch_trampoline_kprobe(struct kprobe *p); |
132 | #else /* ARCH_SUPPORTS_KRETPROBES */ | 132 | #else /* CONFIG_KRETPROBES */ |
133 | static inline void arch_prepare_kretprobe(struct kretprobe *rp, | 133 | static inline void arch_prepare_kretprobe(struct kretprobe *rp, |
134 | struct pt_regs *regs) | 134 | struct pt_regs *regs) |
135 | { | 135 | { |
@@ -138,7 +138,7 @@ static inline int arch_trampoline_kprobe(struct kprobe *p) | |||
138 | { | 138 | { |
139 | return 0; | 139 | return 0; |
140 | } | 140 | } |
141 | #endif /* ARCH_SUPPORTS_KRETPROBES */ | 141 | #endif /* CONFIG_KRETPROBES */ |
142 | /* | 142 | /* |
143 | * Function-return probe - | 143 | * Function-return probe - |
144 | * Note: | 144 | * Note: |
diff --git a/include/linux/kvm.h b/include/linux/kvm.h index 4de4fd2d8607..c1ec04fd000d 100644 --- a/include/linux/kvm.h +++ b/include/linux/kvm.h | |||
@@ -221,6 +221,7 @@ struct kvm_vapic_addr { | |||
221 | * Get size for mmap(vcpu_fd) | 221 | * Get size for mmap(vcpu_fd) |
222 | */ | 222 | */ |
223 | #define KVM_GET_VCPU_MMAP_SIZE _IO(KVMIO, 0x04) /* in bytes */ | 223 | #define KVM_GET_VCPU_MMAP_SIZE _IO(KVMIO, 0x04) /* in bytes */ |
224 | #define KVM_GET_SUPPORTED_CPUID _IOWR(KVMIO, 0x05, struct kvm_cpuid2) | ||
224 | 225 | ||
225 | /* | 226 | /* |
226 | * Extension capability list. | 227 | * Extension capability list. |
@@ -230,8 +231,8 @@ struct kvm_vapic_addr { | |||
230 | #define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2 | 231 | #define KVM_CAP_MMU_SHADOW_CACHE_CONTROL 2 |
231 | #define KVM_CAP_USER_MEMORY 3 | 232 | #define KVM_CAP_USER_MEMORY 3 |
232 | #define KVM_CAP_SET_TSS_ADDR 4 | 233 | #define KVM_CAP_SET_TSS_ADDR 4 |
233 | #define KVM_CAP_EXT_CPUID 5 | ||
234 | #define KVM_CAP_VAPIC 6 | 234 | #define KVM_CAP_VAPIC 6 |
235 | #define KVM_CAP_EXT_CPUID 7 | ||
235 | 236 | ||
236 | /* | 237 | /* |
237 | * ioctls for VM fds | 238 | * ioctls for VM fds |
@@ -249,7 +250,6 @@ struct kvm_vapic_addr { | |||
249 | #define KVM_CREATE_VCPU _IO(KVMIO, 0x41) | 250 | #define KVM_CREATE_VCPU _IO(KVMIO, 0x41) |
250 | #define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log) | 251 | #define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log) |
251 | #define KVM_SET_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias) | 252 | #define KVM_SET_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias) |
252 | #define KVM_GET_SUPPORTED_CPUID _IOWR(KVMIO, 0x48, struct kvm_cpuid2) | ||
253 | /* Device model IOC */ | 253 | /* Device model IOC */ |
254 | #define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60) | 254 | #define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60) |
255 | #define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level) | 255 | #define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level) |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index ea4764b0a2f4..928b0d59e9ba 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -107,6 +107,7 @@ struct kvm_memory_slot { | |||
107 | struct kvm { | 107 | struct kvm { |
108 | struct mutex lock; /* protects the vcpus array and APIC accesses */ | 108 | struct mutex lock; /* protects the vcpus array and APIC accesses */ |
109 | spinlock_t mmu_lock; | 109 | spinlock_t mmu_lock; |
110 | struct rw_semaphore slots_lock; | ||
110 | struct mm_struct *mm; /* userspace tied to this vm */ | 111 | struct mm_struct *mm; /* userspace tied to this vm */ |
111 | int nmemslots; | 112 | int nmemslots; |
112 | struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS + | 113 | struct kvm_memory_slot memslots[KVM_MEMORY_SLOTS + |
diff --git a/include/linux/maple.h b/include/linux/maple.h index 3f01e2bae1a1..d31e36ebb436 100644 --- a/include/linux/maple.h +++ b/include/linux/maple.h | |||
@@ -64,7 +64,6 @@ struct maple_driver { | |||
64 | int (*connect) (struct maple_device * dev); | 64 | int (*connect) (struct maple_device * dev); |
65 | void (*disconnect) (struct maple_device * dev); | 65 | void (*disconnect) (struct maple_device * dev); |
66 | struct device_driver drv; | 66 | struct device_driver drv; |
67 | int registered; | ||
68 | }; | 67 | }; |
69 | 68 | ||
70 | void maple_getcond_callback(struct maple_device *dev, | 69 | void maple_getcond_callback(struct maple_device *dev, |
diff --git a/include/linux/marker.h b/include/linux/marker.h index 5df879dc3776..430f6adf9762 100644 --- a/include/linux/marker.h +++ b/include/linux/marker.h | |||
@@ -104,10 +104,16 @@ static inline void marker_update_probe_range(struct marker *begin, | |||
104 | #define MARK_NOARGS " " | 104 | #define MARK_NOARGS " " |
105 | 105 | ||
106 | /* To be used for string format validity checking with gcc */ | 106 | /* To be used for string format validity checking with gcc */ |
107 | static inline void __printf(1, 2) __mark_check_format(const char *fmt, ...) | 107 | static inline void __printf(1, 2) ___mark_check_format(const char *fmt, ...) |
108 | { | 108 | { |
109 | } | 109 | } |
110 | 110 | ||
111 | #define __mark_check_format(format, args...) \ | ||
112 | do { \ | ||
113 | if (0) \ | ||
114 | ___mark_check_format(format, ## args); \ | ||
115 | } while (0) | ||
116 | |||
111 | extern marker_probe_func __mark_empty_function; | 117 | extern marker_probe_func __mark_empty_function; |
112 | 118 | ||
113 | extern void marker_probe_cb(const struct marker *mdata, | 119 | extern void marker_probe_cb(const struct marker *mdata, |
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 04075628cb9a..8b1c4295848b 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
@@ -25,18 +25,20 @@ struct page_cgroup; | |||
25 | struct page; | 25 | struct page; |
26 | struct mm_struct; | 26 | struct mm_struct; |
27 | 27 | ||
28 | #ifdef CONFIG_CGROUP_MEM_CONT | 28 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
29 | 29 | ||
30 | extern void mm_init_cgroup(struct mm_struct *mm, struct task_struct *p); | 30 | extern void mm_init_cgroup(struct mm_struct *mm, struct task_struct *p); |
31 | extern void mm_free_cgroup(struct mm_struct *mm); | 31 | extern void mm_free_cgroup(struct mm_struct *mm); |
32 | extern void page_assign_page_cgroup(struct page *page, | 32 | |
33 | struct page_cgroup *pc); | 33 | #define page_reset_bad_cgroup(page) ((page)->page_cgroup = 0) |
34 | |||
34 | extern struct page_cgroup *page_get_page_cgroup(struct page *page); | 35 | extern struct page_cgroup *page_get_page_cgroup(struct page *page); |
35 | extern int mem_cgroup_charge(struct page *page, struct mm_struct *mm, | 36 | extern int mem_cgroup_charge(struct page *page, struct mm_struct *mm, |
36 | gfp_t gfp_mask); | 37 | gfp_t gfp_mask); |
37 | extern void mem_cgroup_uncharge(struct page_cgroup *pc); | 38 | extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, |
39 | gfp_t gfp_mask); | ||
38 | extern void mem_cgroup_uncharge_page(struct page *page); | 40 | extern void mem_cgroup_uncharge_page(struct page *page); |
39 | extern void mem_cgroup_move_lists(struct page_cgroup *pc, bool active); | 41 | extern void mem_cgroup_move_lists(struct page *page, bool active); |
40 | extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, | 42 | extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, |
41 | struct list_head *dst, | 43 | struct list_head *dst, |
42 | unsigned long *scanned, int order, | 44 | unsigned long *scanned, int order, |
@@ -44,11 +46,9 @@ extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan, | |||
44 | struct mem_cgroup *mem_cont, | 46 | struct mem_cgroup *mem_cont, |
45 | int active); | 47 | int active); |
46 | extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask); | 48 | extern void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask); |
47 | extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, | ||
48 | gfp_t gfp_mask); | ||
49 | int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); | 49 | int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem); |
50 | 50 | ||
51 | #define vm_match_cgroup(mm, cgroup) \ | 51 | #define mm_match_cgroup(mm, cgroup) \ |
52 | ((cgroup) == rcu_dereference((mm)->mem_cgroup)) | 52 | ((cgroup) == rcu_dereference((mm)->mem_cgroup)) |
53 | 53 | ||
54 | extern int mem_cgroup_prepare_migration(struct page *page); | 54 | extern int mem_cgroup_prepare_migration(struct page *page); |
@@ -72,7 +72,7 @@ extern long mem_cgroup_calc_reclaim_active(struct mem_cgroup *mem, | |||
72 | extern long mem_cgroup_calc_reclaim_inactive(struct mem_cgroup *mem, | 72 | extern long mem_cgroup_calc_reclaim_inactive(struct mem_cgroup *mem, |
73 | struct zone *zone, int priority); | 73 | struct zone *zone, int priority); |
74 | 74 | ||
75 | #else /* CONFIG_CGROUP_MEM_CONT */ | 75 | #else /* CONFIG_CGROUP_MEM_RES_CTLR */ |
76 | static inline void mm_init_cgroup(struct mm_struct *mm, | 76 | static inline void mm_init_cgroup(struct mm_struct *mm, |
77 | struct task_struct *p) | 77 | struct task_struct *p) |
78 | { | 78 | { |
@@ -82,8 +82,7 @@ static inline void mm_free_cgroup(struct mm_struct *mm) | |||
82 | { | 82 | { |
83 | } | 83 | } |
84 | 84 | ||
85 | static inline void page_assign_page_cgroup(struct page *page, | 85 | static inline void page_reset_bad_cgroup(struct page *page) |
86 | struct page_cgroup *pc) | ||
87 | { | 86 | { |
88 | } | 87 | } |
89 | 88 | ||
@@ -92,33 +91,27 @@ static inline struct page_cgroup *page_get_page_cgroup(struct page *page) | |||
92 | return NULL; | 91 | return NULL; |
93 | } | 92 | } |
94 | 93 | ||
95 | static inline int mem_cgroup_charge(struct page *page, struct mm_struct *mm, | 94 | static inline int mem_cgroup_charge(struct page *page, |
96 | gfp_t gfp_mask) | 95 | struct mm_struct *mm, gfp_t gfp_mask) |
97 | { | 96 | { |
98 | return 0; | 97 | return 0; |
99 | } | 98 | } |
100 | 99 | ||
101 | static inline void mem_cgroup_uncharge(struct page_cgroup *pc) | 100 | static inline int mem_cgroup_cache_charge(struct page *page, |
101 | struct mm_struct *mm, gfp_t gfp_mask) | ||
102 | { | 102 | { |
103 | return 0; | ||
103 | } | 104 | } |
104 | 105 | ||
105 | static inline void mem_cgroup_uncharge_page(struct page *page) | 106 | static inline void mem_cgroup_uncharge_page(struct page *page) |
106 | { | 107 | { |
107 | } | 108 | } |
108 | 109 | ||
109 | static inline void mem_cgroup_move_lists(struct page_cgroup *pc, | 110 | static inline void mem_cgroup_move_lists(struct page *page, bool active) |
110 | bool active) | ||
111 | { | ||
112 | } | ||
113 | |||
114 | static inline int mem_cgroup_cache_charge(struct page *page, | ||
115 | struct mm_struct *mm, | ||
116 | gfp_t gfp_mask) | ||
117 | { | 111 | { |
118 | return 0; | ||
119 | } | 112 | } |
120 | 113 | ||
121 | static inline int vm_match_cgroup(struct mm_struct *mm, struct mem_cgroup *mem) | 114 | static inline int mm_match_cgroup(struct mm_struct *mm, struct mem_cgroup *mem) |
122 | { | 115 | { |
123 | return 1; | 116 | return 1; |
124 | } | 117 | } |
diff --git a/include/linux/memstick.h b/include/linux/memstick.h index 334d059d6794..b7ee25888836 100644 --- a/include/linux/memstick.h +++ b/include/linux/memstick.h | |||
@@ -22,6 +22,8 @@ struct ms_status_register { | |||
22 | unsigned char reserved; | 22 | unsigned char reserved; |
23 | unsigned char interrupt; | 23 | unsigned char interrupt; |
24 | #define MEMSTICK_INT_CMDNAK 0x0001 | 24 | #define MEMSTICK_INT_CMDNAK 0x0001 |
25 | #define MEMSTICK_INT_IOREQ 0x0008 | ||
26 | #define MEMSTICK_INT_IOBREQ 0x0010 | ||
25 | #define MEMSTICK_INT_BREQ 0x0020 | 27 | #define MEMSTICK_INT_BREQ 0x0020 |
26 | #define MEMSTICK_INT_ERR 0x0040 | 28 | #define MEMSTICK_INT_ERR 0x0040 |
27 | #define MEMSTICK_INT_CED 0x0080 | 29 | #define MEMSTICK_INT_CED 0x0080 |
@@ -47,13 +49,17 @@ struct ms_status_register { | |||
47 | 49 | ||
48 | struct ms_id_register { | 50 | struct ms_id_register { |
49 | unsigned char type; | 51 | unsigned char type; |
50 | unsigned char reserved; | 52 | unsigned char if_mode; |
51 | unsigned char category; | 53 | unsigned char category; |
52 | unsigned char class; | 54 | unsigned char class; |
53 | } __attribute__((packed)); | 55 | } __attribute__((packed)); |
54 | 56 | ||
55 | struct ms_param_register { | 57 | struct ms_param_register { |
56 | unsigned char system; | 58 | unsigned char system; |
59 | #define MEMSTICK_SYS_ATEN 0xc0 | ||
60 | #define MEMSTICK_SYS_BAMD 0x80 | ||
61 | #define MEMSTICK_SYS_PAM 0x08 | ||
62 | |||
57 | unsigned char block_address_msb; | 63 | unsigned char block_address_msb; |
58 | unsigned short block_address; | 64 | unsigned short block_address; |
59 | unsigned char cp; | 65 | unsigned char cp; |
@@ -90,16 +96,48 @@ struct ms_register { | |||
90 | 96 | ||
91 | struct mspro_param_register { | 97 | struct mspro_param_register { |
92 | unsigned char system; | 98 | unsigned char system; |
99 | #define MEMSTICK_SYS_SERIAL 0x80 | ||
100 | #define MEMSTICK_SYS_PAR4 0x00 | ||
101 | #define MEMSTICK_SYS_PAR8 0x40 | ||
102 | |||
103 | unsigned short data_count; | ||
104 | unsigned int data_address; | ||
105 | unsigned char tpc_param; | ||
106 | } __attribute__((packed)); | ||
107 | |||
108 | struct mspro_io_info_register { | ||
109 | unsigned char version; | ||
110 | unsigned char io_category; | ||
111 | unsigned char current_req; | ||
112 | unsigned char card_opt_info; | ||
113 | unsigned char rdy_wait_time; | ||
114 | } __attribute__((packed)); | ||
115 | |||
116 | struct mspro_io_func_register { | ||
117 | unsigned char func_enable; | ||
118 | unsigned char func_select; | ||
119 | unsigned char func_intmask; | ||
120 | unsigned char transfer_mode; | ||
121 | } __attribute__((packed)); | ||
122 | |||
123 | struct mspro_io_cmd_register { | ||
124 | unsigned short tpc_param; | ||
93 | unsigned short data_count; | 125 | unsigned short data_count; |
94 | unsigned int data_address; | 126 | unsigned int data_address; |
95 | unsigned char cmd_param; | ||
96 | } __attribute__((packed)); | 127 | } __attribute__((packed)); |
97 | 128 | ||
98 | struct mspro_register { | 129 | struct mspro_register { |
99 | struct ms_status_register status; | 130 | struct ms_status_register status; |
100 | struct ms_id_register id; | 131 | struct ms_id_register id; |
101 | unsigned char reserved[8]; | 132 | unsigned char reserved0[8]; |
102 | struct mspro_param_register param; | 133 | struct mspro_param_register param; |
134 | unsigned char reserved1[8]; | ||
135 | struct mspro_io_info_register io_info; | ||
136 | struct mspro_io_func_register io_func; | ||
137 | unsigned char reserved2[7]; | ||
138 | struct mspro_io_cmd_register io_cmd; | ||
139 | unsigned char io_int; | ||
140 | unsigned char io_int_func; | ||
103 | } __attribute__((packed)); | 141 | } __attribute__((packed)); |
104 | 142 | ||
105 | struct ms_register_addr { | 143 | struct ms_register_addr { |
@@ -110,49 +148,55 @@ struct ms_register_addr { | |||
110 | } __attribute__((packed)); | 148 | } __attribute__((packed)); |
111 | 149 | ||
112 | enum { | 150 | enum { |
151 | MS_TPC_READ_MG_STATUS = 0x01, | ||
113 | MS_TPC_READ_LONG_DATA = 0x02, | 152 | MS_TPC_READ_LONG_DATA = 0x02, |
114 | MS_TPC_READ_SHORT_DATA = 0x03, | 153 | MS_TPC_READ_SHORT_DATA = 0x03, |
154 | MS_TPC_READ_MG_DATA = 0x03, | ||
115 | MS_TPC_READ_REG = 0x04, | 155 | MS_TPC_READ_REG = 0x04, |
116 | MS_TPC_READ_IO_DATA = 0x05, /* unverified */ | 156 | MS_TPC_READ_QUAD_DATA = 0x05, |
157 | MS_TPC_READ_IO_DATA = 0x05, | ||
117 | MS_TPC_GET_INT = 0x07, | 158 | MS_TPC_GET_INT = 0x07, |
118 | MS_TPC_SET_RW_REG_ADRS = 0x08, | 159 | MS_TPC_SET_RW_REG_ADRS = 0x08, |
119 | MS_TPC_EX_SET_CMD = 0x09, | 160 | MS_TPC_EX_SET_CMD = 0x09, |
120 | MS_TPC_WRITE_IO_DATA = 0x0a, /* unverified */ | 161 | MS_TPC_WRITE_QUAD_DATA = 0x0a, |
162 | MS_TPC_WRITE_IO_DATA = 0x0a, | ||
121 | MS_TPC_WRITE_REG = 0x0b, | 163 | MS_TPC_WRITE_REG = 0x0b, |
122 | MS_TPC_WRITE_SHORT_DATA = 0x0c, | 164 | MS_TPC_WRITE_SHORT_DATA = 0x0c, |
165 | MS_TPC_WRITE_MG_DATA = 0x0c, | ||
123 | MS_TPC_WRITE_LONG_DATA = 0x0d, | 166 | MS_TPC_WRITE_LONG_DATA = 0x0d, |
124 | MS_TPC_SET_CMD = 0x0e | 167 | MS_TPC_SET_CMD = 0x0e |
125 | }; | 168 | }; |
126 | 169 | ||
127 | enum { | 170 | enum { |
128 | MS_CMD_BLOCK_END = 0x33, | 171 | MS_CMD_BLOCK_END = 0x33, |
129 | MS_CMD_RESET = 0x3c, | 172 | MS_CMD_RESET = 0x3c, |
130 | MS_CMD_BLOCK_WRITE = 0x55, | 173 | MS_CMD_BLOCK_WRITE = 0x55, |
131 | MS_CMD_SLEEP = 0x5a, | 174 | MS_CMD_SLEEP = 0x5a, |
132 | MS_CMD_BLOCK_ERASE = 0x99, | 175 | MS_CMD_BLOCK_ERASE = 0x99, |
133 | MS_CMD_BLOCK_READ = 0xaa, | 176 | MS_CMD_BLOCK_READ = 0xaa, |
134 | MS_CMD_CLEAR_BUF = 0xc3, | 177 | MS_CMD_CLEAR_BUF = 0xc3, |
135 | MS_CMD_FLASH_STOP = 0xcc, | 178 | MS_CMD_FLASH_STOP = 0xcc, |
136 | MSPRO_CMD_FORMAT = 0x10, | 179 | MS_CMD_LOAD_ID = 0x60, |
137 | MSPRO_CMD_SLEEP = 0x11, | 180 | MS_CMD_CMP_ICV = 0x7f, |
138 | MSPRO_CMD_READ_DATA = 0x20, | 181 | MSPRO_CMD_FORMAT = 0x10, |
139 | MSPRO_CMD_WRITE_DATA = 0x21, | 182 | MSPRO_CMD_SLEEP = 0x11, |
140 | MSPRO_CMD_READ_ATRB = 0x24, | 183 | MSPRO_CMD_WAKEUP = 0x12, |
141 | MSPRO_CMD_STOP = 0x25, | 184 | MSPRO_CMD_READ_DATA = 0x20, |
142 | MSPRO_CMD_ERASE = 0x26, | 185 | MSPRO_CMD_WRITE_DATA = 0x21, |
143 | MSPRO_CMD_SET_IBA = 0x46, | 186 | MSPRO_CMD_READ_ATRB = 0x24, |
144 | MSPRO_CMD_SET_IBD = 0x47 | 187 | MSPRO_CMD_STOP = 0x25, |
145 | /* | 188 | MSPRO_CMD_ERASE = 0x26, |
146 | MSPRO_CMD_RESET | 189 | MSPRO_CMD_READ_QUAD = 0x27, |
147 | MSPRO_CMD_WAKEUP | 190 | MSPRO_CMD_WRITE_QUAD = 0x28, |
148 | MSPRO_CMD_IN_IO_DATA | 191 | MSPRO_CMD_SET_IBD = 0x46, |
149 | MSPRO_CMD_OUT_IO_DATA | 192 | MSPRO_CMD_GET_IBD = 0x47, |
150 | MSPRO_CMD_READ_IO_ATRB | 193 | MSPRO_CMD_IN_IO_DATA = 0xb0, |
151 | MSPRO_CMD_IN_IO_FIFO | 194 | MSPRO_CMD_OUT_IO_DATA = 0xb1, |
152 | MSPRO_CMD_OUT_IO_FIFO | 195 | MSPRO_CMD_READ_IO_ATRB = 0xb2, |
153 | MSPRO_CMD_IN_IOM | 196 | MSPRO_CMD_IN_IO_FIFO = 0xb3, |
154 | MSPRO_CMD_OUT_IOM | 197 | MSPRO_CMD_OUT_IO_FIFO = 0xb4, |
155 | */ | 198 | MSPRO_CMD_IN_IOM = 0xb5, |
199 | MSPRO_CMD_OUT_IOM = 0xb6, | ||
156 | }; | 200 | }; |
157 | 201 | ||
158 | /*** Driver structures and functions ***/ | 202 | /*** Driver structures and functions ***/ |
@@ -165,7 +209,8 @@ enum memstick_param { MEMSTICK_POWER = 1, MEMSTICK_INTERFACE }; | |||
165 | #define MEMSTICK_POWER_ON 1 | 209 | #define MEMSTICK_POWER_ON 1 |
166 | 210 | ||
167 | #define MEMSTICK_SERIAL 0 | 211 | #define MEMSTICK_SERIAL 0 |
168 | #define MEMSTICK_PARALLEL 1 | 212 | #define MEMSTICK_PAR4 1 |
213 | #define MEMSTICK_PAR8 2 | ||
169 | 214 | ||
170 | struct memstick_host; | 215 | struct memstick_host; |
171 | struct memstick_driver; | 216 | struct memstick_driver; |
@@ -195,11 +240,7 @@ struct memstick_request { | |||
195 | unsigned char data_dir:1, | 240 | unsigned char data_dir:1, |
196 | need_card_int:1, | 241 | need_card_int:1, |
197 | get_int_reg:1, | 242 | get_int_reg:1, |
198 | io_type:2; | 243 | long_data:1; |
199 | #define MEMSTICK_IO_NONE 0 | ||
200 | #define MEMSTICK_IO_VAL 1 | ||
201 | #define MEMSTICK_IO_SG 2 | ||
202 | |||
203 | unsigned char int_reg; | 244 | unsigned char int_reg; |
204 | int error; | 245 | int error; |
205 | union { | 246 | union { |
@@ -231,8 +272,9 @@ struct memstick_host { | |||
231 | struct mutex lock; | 272 | struct mutex lock; |
232 | unsigned int id; | 273 | unsigned int id; |
233 | unsigned int caps; | 274 | unsigned int caps; |
234 | #define MEMSTICK_CAP_PARALLEL 1 | 275 | #define MEMSTICK_CAP_AUTO_GET_INT 1 |
235 | #define MEMSTICK_CAP_AUTO_GET_INT 2 | 276 | #define MEMSTICK_CAP_PAR4 2 |
277 | #define MEMSTICK_CAP_PAR8 4 | ||
236 | 278 | ||
237 | struct work_struct media_checker; | 279 | struct work_struct media_checker; |
238 | struct class_device cdev; | 280 | struct class_device cdev; |
@@ -270,6 +312,8 @@ int memstick_add_host(struct memstick_host *host); | |||
270 | void memstick_remove_host(struct memstick_host *host); | 312 | void memstick_remove_host(struct memstick_host *host); |
271 | void memstick_free_host(struct memstick_host *host); | 313 | void memstick_free_host(struct memstick_host *host); |
272 | void memstick_detect_change(struct memstick_host *host); | 314 | void memstick_detect_change(struct memstick_host *host); |
315 | void memstick_suspend_host(struct memstick_host *host); | ||
316 | void memstick_resume_host(struct memstick_host *host); | ||
273 | 317 | ||
274 | void memstick_init_req_sg(struct memstick_request *mrq, unsigned char tpc, | 318 | void memstick_init_req_sg(struct memstick_request *mrq, unsigned char tpc, |
275 | struct scatterlist *sg); | 319 | struct scatterlist *sg); |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 3f3ccfe42de0..b695875d63e3 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -235,15 +235,22 @@ static inline int get_page_unless_zero(struct page *page) | |||
235 | struct page *vmalloc_to_page(const void *addr); | 235 | struct page *vmalloc_to_page(const void *addr); |
236 | unsigned long vmalloc_to_pfn(const void *addr); | 236 | unsigned long vmalloc_to_pfn(const void *addr); |
237 | 237 | ||
238 | #ifdef CONFIG_MMU | 238 | /* |
239 | /* Determine if an address is within the vmalloc range */ | 239 | * Determine if an address is within the vmalloc range |
240 | * | ||
241 | * On nommu, vmalloc/vfree wrap through kmalloc/kfree directly, so there | ||
242 | * is no special casing required. | ||
243 | */ | ||
240 | static inline int is_vmalloc_addr(const void *x) | 244 | static inline int is_vmalloc_addr(const void *x) |
241 | { | 245 | { |
246 | #ifdef CONFIG_MMU | ||
242 | unsigned long addr = (unsigned long)x; | 247 | unsigned long addr = (unsigned long)x; |
243 | 248 | ||
244 | return addr >= VMALLOC_START && addr < VMALLOC_END; | 249 | return addr >= VMALLOC_START && addr < VMALLOC_END; |
245 | } | 250 | #else |
251 | return 0; | ||
246 | #endif | 252 | #endif |
253 | } | ||
247 | 254 | ||
248 | static inline struct page *compound_head(struct page *page) | 255 | static inline struct page *compound_head(struct page *page) |
249 | { | 256 | { |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index bfee0bd1d435..af190ceab971 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
@@ -64,10 +64,7 @@ struct page { | |||
64 | #if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS | 64 | #if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS |
65 | spinlock_t ptl; | 65 | spinlock_t ptl; |
66 | #endif | 66 | #endif |
67 | struct { | 67 | struct kmem_cache *slab; /* SLUB: Pointer to slab */ |
68 | struct kmem_cache *slab; /* SLUB: Pointer to slab */ | ||
69 | void *end; /* SLUB: end marker */ | ||
70 | }; | ||
71 | struct page *first_page; /* Compound tail pages */ | 68 | struct page *first_page; /* Compound tail pages */ |
72 | }; | 69 | }; |
73 | union { | 70 | union { |
@@ -91,7 +88,7 @@ struct page { | |||
91 | void *virtual; /* Kernel virtual address (NULL if | 88 | void *virtual; /* Kernel virtual address (NULL if |
92 | not kmapped, ie. highmem) */ | 89 | not kmapped, ie. highmem) */ |
93 | #endif /* WANT_PAGE_VIRTUAL */ | 90 | #endif /* WANT_PAGE_VIRTUAL */ |
94 | #ifdef CONFIG_CGROUP_MEM_CONT | 91 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
95 | unsigned long page_cgroup; | 92 | unsigned long page_cgroup; |
96 | #endif | 93 | #endif |
97 | }; | 94 | }; |
@@ -225,7 +222,7 @@ struct mm_struct { | |||
225 | /* aio bits */ | 222 | /* aio bits */ |
226 | rwlock_t ioctx_list_lock; | 223 | rwlock_t ioctx_list_lock; |
227 | struct kioctx *ioctx_list; | 224 | struct kioctx *ioctx_list; |
228 | #ifdef CONFIG_CGROUP_MEM_CONT | 225 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
229 | struct mem_cgroup *mem_cgroup; | 226 | struct mem_cgroup *mem_cgroup; |
230 | #endif | 227 | #endif |
231 | }; | 228 | }; |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index a69ba80f2dfe..f4a0e4c218df 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -195,6 +195,7 @@ struct nfs_inode { | |||
195 | #define NFS_INO_ADVISE_RDPLUS (1) /* advise readdirplus */ | 195 | #define NFS_INO_ADVISE_RDPLUS (1) /* advise readdirplus */ |
196 | #define NFS_INO_STALE (2) /* possible stale inode */ | 196 | #define NFS_INO_STALE (2) /* possible stale inode */ |
197 | #define NFS_INO_ACL_LRU_SET (3) /* Inode is on the LRU list */ | 197 | #define NFS_INO_ACL_LRU_SET (3) /* Inode is on the LRU list */ |
198 | #define NFS_INO_MOUNTPOINT (4) /* inode is remote mountpoint */ | ||
198 | 199 | ||
199 | static inline struct nfs_inode *NFS_I(const struct inode *inode) | 200 | static inline struct nfs_inode *NFS_I(const struct inode *inode) |
200 | { | 201 | { |
diff --git a/include/linux/pci.h b/include/linux/pci.h index 87195b62de52..b7e4b633c69b 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -278,6 +278,7 @@ struct pci_bus { | |||
278 | struct device dev; | 278 | struct device dev; |
279 | struct bin_attribute *legacy_io; /* legacy I/O for this bus */ | 279 | struct bin_attribute *legacy_io; /* legacy I/O for this bus */ |
280 | struct bin_attribute *legacy_mem; /* legacy mem */ | 280 | struct bin_attribute *legacy_mem; /* legacy mem */ |
281 | unsigned int is_added:1; | ||
281 | }; | 282 | }; |
282 | 283 | ||
283 | #define pci_bus_b(n) list_entry(n, struct pci_bus, node) | 284 | #define pci_bus_b(n) list_entry(n, struct pci_bus, node) |
@@ -389,6 +390,16 @@ struct pci_driver { | |||
389 | #define to_pci_driver(drv) container_of(drv, struct pci_driver, driver) | 390 | #define to_pci_driver(drv) container_of(drv, struct pci_driver, driver) |
390 | 391 | ||
391 | /** | 392 | /** |
393 | * DEFINE_PCI_DEVICE_TABLE - macro used to describe a pci device table | ||
394 | * @_table: device table name | ||
395 | * | ||
396 | * This macro is used to create a struct pci_device_id array (a device table) | ||
397 | * in a generic manner. | ||
398 | */ | ||
399 | #define DEFINE_PCI_DEVICE_TABLE(_table) \ | ||
400 | const struct pci_device_id _table[] __devinitconst | ||
401 | |||
402 | /** | ||
392 | * PCI_DEVICE - macro used to describe a specific pci device | 403 | * PCI_DEVICE - macro used to describe a specific pci device |
393 | * @vend: the 16 bit PCI Vendor ID | 404 | * @vend: the 16 bit PCI Vendor ID |
394 | * @dev: the 16 bit PCI Device ID | 405 | * @dev: the 16 bit PCI Device ID |
@@ -1034,6 +1045,8 @@ void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen); | |||
1034 | void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr); | 1045 | void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr); |
1035 | void __iomem * const *pcim_iomap_table(struct pci_dev *pdev); | 1046 | void __iomem * const *pcim_iomap_table(struct pci_dev *pdev); |
1036 | int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name); | 1047 | int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name); |
1048 | int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask, | ||
1049 | const char *name); | ||
1037 | void pcim_iounmap_regions(struct pci_dev *pdev, u16 mask); | 1050 | void pcim_iounmap_regions(struct pci_dev *pdev, u16 mask); |
1038 | 1051 | ||
1039 | extern int pci_pci_problems; | 1052 | extern int pci_pci_problems; |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index effdb558a588..70eb3c803d47 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -2184,6 +2184,7 @@ | |||
2184 | #define PCI_DEVICE_ID_JMICRON_JMB366 0x2366 | 2184 | #define PCI_DEVICE_ID_JMICRON_JMB366 0x2366 |
2185 | #define PCI_DEVICE_ID_JMICRON_JMB368 0x2368 | 2185 | #define PCI_DEVICE_ID_JMICRON_JMB368 0x2368 |
2186 | #define PCI_DEVICE_ID_JMICRON_JMB38X_SD 0x2381 | 2186 | #define PCI_DEVICE_ID_JMICRON_JMB38X_SD 0x2381 |
2187 | #define PCI_DEVICE_ID_JMICRON_JMB38X_MS 0x2383 | ||
2187 | 2188 | ||
2188 | #define PCI_VENDOR_ID_KORENIX 0x1982 | 2189 | #define PCI_VENDOR_ID_KORENIX 0x1982 |
2189 | #define PCI_DEVICE_ID_KORENIX_JETCARDF0 0x1600 | 2190 | #define PCI_DEVICE_ID_KORENIX_JETCARDF0 0x1600 |
diff --git a/include/linux/pmu.h b/include/linux/pmu.h index 4c5f65392d36..cafe98d96948 100644 --- a/include/linux/pmu.h +++ b/include/linux/pmu.h | |||
@@ -147,8 +147,15 @@ extern void pmu_wait_complete(struct adb_request *req); | |||
147 | /* For use before switching interrupts off for a long time; | 147 | /* For use before switching interrupts off for a long time; |
148 | * warning: not stackable | 148 | * warning: not stackable |
149 | */ | 149 | */ |
150 | #if defined(CONFIG_ADB_PMU) | ||
150 | extern void pmu_suspend(void); | 151 | extern void pmu_suspend(void); |
151 | extern void pmu_resume(void); | 152 | extern void pmu_resume(void); |
153 | #else | ||
154 | static inline void pmu_suspend(void) | ||
155 | {} | ||
156 | static inline void pmu_resume(void) | ||
157 | {} | ||
158 | #endif | ||
152 | 159 | ||
153 | extern void pmu_enable_irled(int on); | 160 | extern void pmu_enable_irled(int on); |
154 | 161 | ||
@@ -192,7 +199,7 @@ extern unsigned int pmu_power_flags; | |||
192 | extern void pmu_backlight_init(void); | 199 | extern void pmu_backlight_init(void); |
193 | 200 | ||
194 | /* some code needs to know if the PMU was suspended for hibernation */ | 201 | /* some code needs to know if the PMU was suspended for hibernation */ |
195 | #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32) | 202 | #if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32) |
196 | extern int pmu_sys_suspended; | 203 | extern int pmu_sys_suspended; |
197 | #else | 204 | #else |
198 | /* if power management is not configured it can't be suspended */ | 205 | /* if power management is not configured it can't be suspended */ |
diff --git a/include/linux/raid/bitmap.h b/include/linux/raid/bitmap.h index e51b531cd0b2..47fbcba11850 100644 --- a/include/linux/raid/bitmap.h +++ b/include/linux/raid/bitmap.h | |||
@@ -235,6 +235,8 @@ struct bitmap { | |||
235 | 235 | ||
236 | unsigned long flags; | 236 | unsigned long flags; |
237 | 237 | ||
238 | int allclean; | ||
239 | |||
238 | unsigned long max_write_behind; /* write-behind mode */ | 240 | unsigned long max_write_behind; /* write-behind mode */ |
239 | atomic_t behind_writes; | 241 | atomic_t behind_writes; |
240 | 242 | ||
diff --git a/include/linux/raid/md_k.h b/include/linux/raid/md_k.h index 85a068bab625..7bb6d1abf71e 100644 --- a/include/linux/raid/md_k.h +++ b/include/linux/raid/md_k.h | |||
@@ -83,6 +83,7 @@ struct mdk_rdev_s | |||
83 | #define BarriersNotsupp 5 /* BIO_RW_BARRIER is not supported */ | 83 | #define BarriersNotsupp 5 /* BIO_RW_BARRIER is not supported */ |
84 | #define AllReserved 6 /* If whole device is reserved for | 84 | #define AllReserved 6 /* If whole device is reserved for |
85 | * one array */ | 85 | * one array */ |
86 | #define AutoDetected 7 /* added by auto-detect */ | ||
86 | 87 | ||
87 | int desc_nr; /* descriptor index in the superblock */ | 88 | int desc_nr; /* descriptor index in the superblock */ |
88 | int raid_disk; /* role of device in array */ | 89 | int raid_disk; /* role of device in array */ |
diff --git a/include/linux/rcuclassic.h b/include/linux/rcuclassic.h index 4d6624260b4c..b3dccd68629e 100644 --- a/include/linux/rcuclassic.h +++ b/include/linux/rcuclassic.h | |||
@@ -160,5 +160,8 @@ extern void rcu_restart_cpu(int cpu); | |||
160 | extern long rcu_batches_completed(void); | 160 | extern long rcu_batches_completed(void); |
161 | extern long rcu_batches_completed_bh(void); | 161 | extern long rcu_batches_completed_bh(void); |
162 | 162 | ||
163 | #define rcu_enter_nohz() do { } while (0) | ||
164 | #define rcu_exit_nohz() do { } while (0) | ||
165 | |||
163 | #endif /* __KERNEL__ */ | 166 | #endif /* __KERNEL__ */ |
164 | #endif /* __LINUX_RCUCLASSIC_H */ | 167 | #endif /* __LINUX_RCUCLASSIC_H */ |
diff --git a/include/linux/rcupreempt.h b/include/linux/rcupreempt.h index 60c2a033b19e..01152ed532c8 100644 --- a/include/linux/rcupreempt.h +++ b/include/linux/rcupreempt.h | |||
@@ -82,5 +82,27 @@ extern struct rcupreempt_trace *rcupreempt_trace_cpu(int cpu); | |||
82 | 82 | ||
83 | struct softirq_action; | 83 | struct softirq_action; |
84 | 84 | ||
85 | #ifdef CONFIG_NO_HZ | ||
86 | DECLARE_PER_CPU(long, dynticks_progress_counter); | ||
87 | |||
88 | static inline void rcu_enter_nohz(void) | ||
89 | { | ||
90 | __get_cpu_var(dynticks_progress_counter)++; | ||
91 | WARN_ON(__get_cpu_var(dynticks_progress_counter) & 0x1); | ||
92 | mb(); | ||
93 | } | ||
94 | |||
95 | static inline void rcu_exit_nohz(void) | ||
96 | { | ||
97 | mb(); | ||
98 | __get_cpu_var(dynticks_progress_counter)++; | ||
99 | WARN_ON(!(__get_cpu_var(dynticks_progress_counter) & 0x1)); | ||
100 | } | ||
101 | |||
102 | #else /* CONFIG_NO_HZ */ | ||
103 | #define rcu_enter_nohz() do { } while (0) | ||
104 | #define rcu_exit_nohz() do { } while (0) | ||
105 | #endif /* CONFIG_NO_HZ */ | ||
106 | |||
85 | #endif /* __KERNEL__ */ | 107 | #endif /* __KERNEL__ */ |
86 | #endif /* __LINUX_RCUPREEMPT_H */ | 108 | #endif /* __LINUX_RCUPREEMPT_H */ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index e217d188a102..11d8e9a74eff 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -242,6 +242,7 @@ struct task_struct; | |||
242 | 242 | ||
243 | extern void sched_init(void); | 243 | extern void sched_init(void); |
244 | extern void sched_init_smp(void); | 244 | extern void sched_init_smp(void); |
245 | extern asmlinkage void schedule_tail(struct task_struct *prev); | ||
245 | extern void init_idle(struct task_struct *idle, int cpu); | 246 | extern void init_idle(struct task_struct *idle, int cpu); |
246 | extern void init_idle_bootup_task(struct task_struct *idle); | 247 | extern void init_idle_bootup_task(struct task_struct *idle); |
247 | 248 | ||
@@ -898,6 +899,10 @@ struct sched_class { | |||
898 | int running); | 899 | int running); |
899 | void (*prio_changed) (struct rq *this_rq, struct task_struct *task, | 900 | void (*prio_changed) (struct rq *this_rq, struct task_struct *task, |
900 | int oldprio, int running); | 901 | int oldprio, int running); |
902 | |||
903 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
904 | void (*moved_group) (struct task_struct *p); | ||
905 | #endif | ||
901 | }; | 906 | }; |
902 | 907 | ||
903 | struct load_weight { | 908 | struct load_weight { |
@@ -1189,7 +1194,7 @@ struct task_struct { | |||
1189 | int softirq_context; | 1194 | int softirq_context; |
1190 | #endif | 1195 | #endif |
1191 | #ifdef CONFIG_LOCKDEP | 1196 | #ifdef CONFIG_LOCKDEP |
1192 | # define MAX_LOCK_DEPTH 30UL | 1197 | # define MAX_LOCK_DEPTH 48UL |
1193 | u64 curr_chain_key; | 1198 | u64 curr_chain_key; |
1194 | int lockdep_depth; | 1199 | int lockdep_depth; |
1195 | struct held_lock held_locks[MAX_LOCK_DEPTH]; | 1200 | struct held_lock held_locks[MAX_LOCK_DEPTH]; |
@@ -1541,10 +1546,6 @@ extern unsigned int sysctl_sched_child_runs_first; | |||
1541 | extern unsigned int sysctl_sched_features; | 1546 | extern unsigned int sysctl_sched_features; |
1542 | extern unsigned int sysctl_sched_migration_cost; | 1547 | extern unsigned int sysctl_sched_migration_cost; |
1543 | extern unsigned int sysctl_sched_nr_migrate; | 1548 | extern unsigned int sysctl_sched_nr_migrate; |
1544 | #if defined(CONFIG_FAIR_GROUP_SCHED) && defined(CONFIG_SMP) | ||
1545 | extern unsigned int sysctl_sched_min_bal_int_shares; | ||
1546 | extern unsigned int sysctl_sched_max_bal_int_shares; | ||
1547 | #endif | ||
1548 | 1549 | ||
1549 | int sched_nr_latency_handler(struct ctl_table *table, int write, | 1550 | int sched_nr_latency_handler(struct ctl_table *table, int write, |
1550 | struct file *file, void __user *buffer, size_t *length, | 1551 | struct file *file, void __user *buffer, size_t *length, |
diff --git a/include/linux/security.h b/include/linux/security.h index fe52cdeab0a6..b07357ca2137 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -34,12 +34,6 @@ | |||
34 | #include <linux/xfrm.h> | 34 | #include <linux/xfrm.h> |
35 | #include <net/flow.h> | 35 | #include <net/flow.h> |
36 | 36 | ||
37 | /* only a char in selinux superblock security struct flags */ | ||
38 | #define FSCONTEXT_MNT 0x01 | ||
39 | #define CONTEXT_MNT 0x02 | ||
40 | #define ROOTCONTEXT_MNT 0x04 | ||
41 | #define DEFCONTEXT_MNT 0x08 | ||
42 | |||
43 | extern unsigned securebits; | 37 | extern unsigned securebits; |
44 | 38 | ||
45 | struct ctl_table; | 39 | struct ctl_table; |
@@ -114,6 +108,32 @@ struct request_sock; | |||
114 | 108 | ||
115 | #ifdef CONFIG_SECURITY | 109 | #ifdef CONFIG_SECURITY |
116 | 110 | ||
111 | struct security_mnt_opts { | ||
112 | char **mnt_opts; | ||
113 | int *mnt_opts_flags; | ||
114 | int num_mnt_opts; | ||
115 | }; | ||
116 | |||
117 | static inline void security_init_mnt_opts(struct security_mnt_opts *opts) | ||
118 | { | ||
119 | opts->mnt_opts = NULL; | ||
120 | opts->mnt_opts_flags = NULL; | ||
121 | opts->num_mnt_opts = 0; | ||
122 | } | ||
123 | |||
124 | static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | ||
125 | { | ||
126 | int i; | ||
127 | if (opts->mnt_opts) | ||
128 | for(i = 0; i < opts->num_mnt_opts; i++) | ||
129 | kfree(opts->mnt_opts[i]); | ||
130 | kfree(opts->mnt_opts); | ||
131 | opts->mnt_opts = NULL; | ||
132 | kfree(opts->mnt_opts_flags); | ||
133 | opts->mnt_opts_flags = NULL; | ||
134 | opts->num_mnt_opts = 0; | ||
135 | } | ||
136 | |||
117 | /** | 137 | /** |
118 | * struct security_operations - main security structure | 138 | * struct security_operations - main security structure |
119 | * | 139 | * |
@@ -262,19 +282,19 @@ struct request_sock; | |||
262 | * @sb_get_mnt_opts: | 282 | * @sb_get_mnt_opts: |
263 | * Get the security relevant mount options used for a superblock | 283 | * Get the security relevant mount options used for a superblock |
264 | * @sb the superblock to get security mount options from | 284 | * @sb the superblock to get security mount options from |
265 | * @mount_options array for pointers to mount options | 285 | * @opts binary data structure containing all lsm mount data |
266 | * @mount_flags array of ints specifying what each mount options is | ||
267 | * @num_opts number of options in the arrays | ||
268 | * @sb_set_mnt_opts: | 286 | * @sb_set_mnt_opts: |
269 | * Set the security relevant mount options used for a superblock | 287 | * Set the security relevant mount options used for a superblock |
270 | * @sb the superblock to set security mount options for | 288 | * @sb the superblock to set security mount options for |
271 | * @mount_options array for pointers to mount options | 289 | * @opts binary data structure containing all lsm mount data |
272 | * @mount_flags array of ints specifying what each mount options is | ||
273 | * @num_opts number of options in the arrays | ||
274 | * @sb_clone_mnt_opts: | 290 | * @sb_clone_mnt_opts: |
275 | * Copy all security options from a given superblock to another | 291 | * Copy all security options from a given superblock to another |
276 | * @oldsb old superblock which contain information to clone | 292 | * @oldsb old superblock which contain information to clone |
277 | * @newsb new superblock which needs filled in | 293 | * @newsb new superblock which needs filled in |
294 | * @sb_parse_opts_str: | ||
295 | * Parse a string of security data filling in the opts structure | ||
296 | * @options string containing all mount options known by the LSM | ||
297 | * @opts binary data structure usable by the LSM | ||
278 | * | 298 | * |
279 | * Security hooks for inode operations. | 299 | * Security hooks for inode operations. |
280 | * | 300 | * |
@@ -1238,8 +1258,7 @@ struct security_operations { | |||
1238 | 1258 | ||
1239 | int (*sb_alloc_security) (struct super_block * sb); | 1259 | int (*sb_alloc_security) (struct super_block * sb); |
1240 | void (*sb_free_security) (struct super_block * sb); | 1260 | void (*sb_free_security) (struct super_block * sb); |
1241 | int (*sb_copy_data)(struct file_system_type *type, | 1261 | int (*sb_copy_data)(char *orig, char *copy); |
1242 | void *orig, void *copy); | ||
1243 | int (*sb_kern_mount) (struct super_block *sb, void *data); | 1262 | int (*sb_kern_mount) (struct super_block *sb, void *data); |
1244 | int (*sb_statfs) (struct dentry *dentry); | 1263 | int (*sb_statfs) (struct dentry *dentry); |
1245 | int (*sb_mount) (char *dev_name, struct nameidata * nd, | 1264 | int (*sb_mount) (char *dev_name, struct nameidata * nd, |
@@ -1257,12 +1276,12 @@ struct security_operations { | |||
1257 | void (*sb_post_pivotroot) (struct nameidata * old_nd, | 1276 | void (*sb_post_pivotroot) (struct nameidata * old_nd, |
1258 | struct nameidata * new_nd); | 1277 | struct nameidata * new_nd); |
1259 | int (*sb_get_mnt_opts) (const struct super_block *sb, | 1278 | int (*sb_get_mnt_opts) (const struct super_block *sb, |
1260 | char ***mount_options, int **flags, | 1279 | struct security_mnt_opts *opts); |
1261 | int *num_opts); | 1280 | int (*sb_set_mnt_opts) (struct super_block *sb, |
1262 | int (*sb_set_mnt_opts) (struct super_block *sb, char **mount_options, | 1281 | struct security_mnt_opts *opts); |
1263 | int *flags, int num_opts); | ||
1264 | void (*sb_clone_mnt_opts) (const struct super_block *oldsb, | 1282 | void (*sb_clone_mnt_opts) (const struct super_block *oldsb, |
1265 | struct super_block *newsb); | 1283 | struct super_block *newsb); |
1284 | int (*sb_parse_opts_str) (char *options, struct security_mnt_opts *opts); | ||
1266 | 1285 | ||
1267 | int (*inode_alloc_security) (struct inode *inode); | 1286 | int (*inode_alloc_security) (struct inode *inode); |
1268 | void (*inode_free_security) (struct inode *inode); | 1287 | void (*inode_free_security) (struct inode *inode); |
@@ -1507,7 +1526,7 @@ int security_bprm_check(struct linux_binprm *bprm); | |||
1507 | int security_bprm_secureexec(struct linux_binprm *bprm); | 1526 | int security_bprm_secureexec(struct linux_binprm *bprm); |
1508 | int security_sb_alloc(struct super_block *sb); | 1527 | int security_sb_alloc(struct super_block *sb); |
1509 | void security_sb_free(struct super_block *sb); | 1528 | void security_sb_free(struct super_block *sb); |
1510 | int security_sb_copy_data(struct file_system_type *type, void *orig, void *copy); | 1529 | int security_sb_copy_data(char *orig, char *copy); |
1511 | int security_sb_kern_mount(struct super_block *sb, void *data); | 1530 | int security_sb_kern_mount(struct super_block *sb, void *data); |
1512 | int security_sb_statfs(struct dentry *dentry); | 1531 | int security_sb_statfs(struct dentry *dentry); |
1513 | int security_sb_mount(char *dev_name, struct nameidata *nd, | 1532 | int security_sb_mount(char *dev_name, struct nameidata *nd, |
@@ -1520,12 +1539,12 @@ void security_sb_post_remount(struct vfsmount *mnt, unsigned long flags, void *d | |||
1520 | void security_sb_post_addmount(struct vfsmount *mnt, struct nameidata *mountpoint_nd); | 1539 | void security_sb_post_addmount(struct vfsmount *mnt, struct nameidata *mountpoint_nd); |
1521 | int security_sb_pivotroot(struct nameidata *old_nd, struct nameidata *new_nd); | 1540 | int security_sb_pivotroot(struct nameidata *old_nd, struct nameidata *new_nd); |
1522 | void security_sb_post_pivotroot(struct nameidata *old_nd, struct nameidata *new_nd); | 1541 | void security_sb_post_pivotroot(struct nameidata *old_nd, struct nameidata *new_nd); |
1523 | int security_sb_get_mnt_opts(const struct super_block *sb, char ***mount_options, | 1542 | int security_sb_get_mnt_opts(const struct super_block *sb, |
1524 | int **flags, int *num_opts); | 1543 | struct security_mnt_opts *opts); |
1525 | int security_sb_set_mnt_opts(struct super_block *sb, char **mount_options, | 1544 | int security_sb_set_mnt_opts(struct super_block *sb, struct security_mnt_opts *opts); |
1526 | int *flags, int num_opts); | ||
1527 | void security_sb_clone_mnt_opts(const struct super_block *oldsb, | 1545 | void security_sb_clone_mnt_opts(const struct super_block *oldsb, |
1528 | struct super_block *newsb); | 1546 | struct super_block *newsb); |
1547 | int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts); | ||
1529 | 1548 | ||
1530 | int security_inode_alloc(struct inode *inode); | 1549 | int security_inode_alloc(struct inode *inode); |
1531 | void security_inode_free(struct inode *inode); | 1550 | void security_inode_free(struct inode *inode); |
@@ -1635,6 +1654,16 @@ int security_secctx_to_secid(char *secdata, u32 seclen, u32 *secid); | |||
1635 | void security_release_secctx(char *secdata, u32 seclen); | 1654 | void security_release_secctx(char *secdata, u32 seclen); |
1636 | 1655 | ||
1637 | #else /* CONFIG_SECURITY */ | 1656 | #else /* CONFIG_SECURITY */ |
1657 | struct security_mnt_opts { | ||
1658 | }; | ||
1659 | |||
1660 | static inline void security_init_mnt_opts(struct security_mnt_opts *opts) | ||
1661 | { | ||
1662 | } | ||
1663 | |||
1664 | static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | ||
1665 | { | ||
1666 | } | ||
1638 | 1667 | ||
1639 | /* | 1668 | /* |
1640 | * This is the default capabilities functionality. Most of these functions | 1669 | * This is the default capabilities functionality. Most of these functions |
@@ -1762,8 +1791,7 @@ static inline int security_sb_alloc (struct super_block *sb) | |||
1762 | static inline void security_sb_free (struct super_block *sb) | 1791 | static inline void security_sb_free (struct super_block *sb) |
1763 | { } | 1792 | { } |
1764 | 1793 | ||
1765 | static inline int security_sb_copy_data (struct file_system_type *type, | 1794 | static inline int security_sb_copy_data (char *orig, char *copy) |
1766 | void *orig, void *copy) | ||
1767 | { | 1795 | { |
1768 | return 0; | 1796 | return 0; |
1769 | } | 1797 | } |
@@ -1819,6 +1847,27 @@ static inline int security_sb_pivotroot (struct nameidata *old_nd, | |||
1819 | static inline void security_sb_post_pivotroot (struct nameidata *old_nd, | 1847 | static inline void security_sb_post_pivotroot (struct nameidata *old_nd, |
1820 | struct nameidata *new_nd) | 1848 | struct nameidata *new_nd) |
1821 | { } | 1849 | { } |
1850 | static inline int security_sb_get_mnt_opts(const struct super_block *sb, | ||
1851 | struct security_mnt_opts *opts) | ||
1852 | { | ||
1853 | security_init_mnt_opts(opts); | ||
1854 | return 0; | ||
1855 | } | ||
1856 | |||
1857 | static inline int security_sb_set_mnt_opts(struct super_block *sb, | ||
1858 | struct security_mnt_opts *opts) | ||
1859 | { | ||
1860 | return 0; | ||
1861 | } | ||
1862 | |||
1863 | static inline void security_sb_clone_mnt_opts(const struct super_block *oldsb, | ||
1864 | struct super_block *newsb) | ||
1865 | { } | ||
1866 | |||
1867 | static inline int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts) | ||
1868 | { | ||
1869 | return 0; | ||
1870 | } | ||
1822 | 1871 | ||
1823 | static inline int security_inode_alloc (struct inode *inode) | 1872 | static inline int security_inode_alloc (struct inode *inode) |
1824 | { | 1873 | { |
diff --git a/include/asm-sh/sci.h b/include/linux/serial_sci.h index 52e73660c129..893cc53486bc 100644 --- a/include/asm-sh/sci.h +++ b/include/linux/serial_sci.h | |||
@@ -1,12 +1,10 @@ | |||
1 | #ifndef __ASM_SH_SCI_H | 1 | #ifndef __LINUX_SERIAL_SCI_H |
2 | #define __ASM_SH_SCI_H | 2 | #define __LINUX_SERIAL_SCI_H |
3 | 3 | ||
4 | #include <linux/serial_core.h> | 4 | #include <linux/serial_core.h> |
5 | 5 | ||
6 | /* | 6 | /* |
7 | * Generic header for SuperH SCI(F) | 7 | * Generic header for SuperH SCI(F) (used by sh/sh64/h8300 and related parts) |
8 | * | ||
9 | * Do not place SH-specific parts in here, sh64 and h8300 depend on this too. | ||
10 | */ | 8 | */ |
11 | 9 | ||
12 | /* Offsets into the sci_port->irqs array */ | 10 | /* Offsets into the sci_port->irqs array */ |
@@ -31,4 +29,4 @@ struct plat_sci_port { | |||
31 | 29 | ||
32 | int early_sci_setup(struct uart_port *port); | 30 | int early_sci_setup(struct uart_port *port); |
33 | 31 | ||
34 | #endif /* __ASM_SH_SCI_H */ | 32 | #endif /* __LINUX_SERIAL_SCI_H */ |
diff --git a/include/linux/slab_def.h b/include/linux/slab_def.h index fcc48096ee64..39c3a5eb8ebe 100644 --- a/include/linux/slab_def.h +++ b/include/linux/slab_def.h | |||
@@ -41,7 +41,7 @@ static inline void *kmalloc(size_t size, gfp_t flags) | |||
41 | goto found; \ | 41 | goto found; \ |
42 | else \ | 42 | else \ |
43 | i++; | 43 | i++; |
44 | #include "kmalloc_sizes.h" | 44 | #include <linux/kmalloc_sizes.h> |
45 | #undef CACHE | 45 | #undef CACHE |
46 | { | 46 | { |
47 | extern void __you_cannot_kmalloc_that_much(void); | 47 | extern void __you_cannot_kmalloc_that_much(void); |
@@ -75,7 +75,7 @@ static inline void *kmalloc_node(size_t size, gfp_t flags, int node) | |||
75 | goto found; \ | 75 | goto found; \ |
76 | else \ | 76 | else \ |
77 | i++; | 77 | i++; |
78 | #include "kmalloc_sizes.h" | 78 | #include <linux/kmalloc_sizes.h> |
79 | #undef CACHE | 79 | #undef CACHE |
80 | { | 80 | { |
81 | extern void __you_cannot_kmalloc_that_much(void); | 81 | extern void __you_cannot_kmalloc_that_much(void); |
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index 57deecc79d52..b00c1c73eb0a 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
@@ -61,7 +61,7 @@ struct kmem_cache { | |||
61 | int size; /* The size of an object including meta data */ | 61 | int size; /* The size of an object including meta data */ |
62 | int objsize; /* The size of an object without meta data */ | 62 | int objsize; /* The size of an object without meta data */ |
63 | int offset; /* Free pointer offset. */ | 63 | int offset; /* Free pointer offset. */ |
64 | int order; | 64 | int order; /* Current preferred allocation order */ |
65 | 65 | ||
66 | /* | 66 | /* |
67 | * Avoid an extra cache line for UP, SMP and for the node local to | 67 | * Avoid an extra cache line for UP, SMP and for the node local to |
@@ -138,11 +138,11 @@ static __always_inline int kmalloc_index(size_t size) | |||
138 | if (size <= 512) return 9; | 138 | if (size <= 512) return 9; |
139 | if (size <= 1024) return 10; | 139 | if (size <= 1024) return 10; |
140 | if (size <= 2 * 1024) return 11; | 140 | if (size <= 2 * 1024) return 11; |
141 | if (size <= 4 * 1024) return 12; | ||
141 | /* | 142 | /* |
142 | * The following is only needed to support architectures with a larger page | 143 | * The following is only needed to support architectures with a larger page |
143 | * size than 4k. | 144 | * size than 4k. |
144 | */ | 145 | */ |
145 | if (size <= 4 * 1024) return 12; | ||
146 | if (size <= 8 * 1024) return 13; | 146 | if (size <= 8 * 1024) return 13; |
147 | if (size <= 16 * 1024) return 14; | 147 | if (size <= 16 * 1024) return 14; |
148 | if (size <= 32 * 1024) return 15; | 148 | if (size <= 32 * 1024) return 15; |
diff --git a/include/linux/sm501-regs.h b/include/linux/sm501-regs.h index 64236b73c724..d53642d2d899 100644 --- a/include/linux/sm501-regs.h +++ b/include/linux/sm501-regs.h | |||
@@ -129,11 +129,14 @@ | |||
129 | 129 | ||
130 | #define SM501_DEVICEID_SM501 (0x05010000) | 130 | #define SM501_DEVICEID_SM501 (0x05010000) |
131 | #define SM501_DEVICEID_IDMASK (0xffff0000) | 131 | #define SM501_DEVICEID_IDMASK (0xffff0000) |
132 | #define SM501_DEVICEID_REVMASK (0x000000ff) | ||
132 | 133 | ||
133 | #define SM501_PLLCLOCK_COUNT (0x000064) | 134 | #define SM501_PLLCLOCK_COUNT (0x000064) |
134 | #define SM501_MISC_TIMING (0x000068) | 135 | #define SM501_MISC_TIMING (0x000068) |
135 | #define SM501_CURRENT_SDRAM_CLOCK (0x00006C) | 136 | #define SM501_CURRENT_SDRAM_CLOCK (0x00006C) |
136 | 137 | ||
138 | #define SM501_PROGRAMMABLE_PLL_CONTROL (0x000074) | ||
139 | |||
137 | /* GPIO base */ | 140 | /* GPIO base */ |
138 | #define SM501_GPIO (0x010000) | 141 | #define SM501_GPIO (0x010000) |
139 | #define SM501_GPIO_DATA_LOW (0x00) | 142 | #define SM501_GPIO_DATA_LOW (0x00) |
diff --git a/include/linux/sm501.h b/include/linux/sm501.h index 932a9efee8a5..bca134544700 100644 --- a/include/linux/sm501.h +++ b/include/linux/sm501.h | |||
@@ -24,7 +24,8 @@ extern int sm501_unit_power(struct device *dev, | |||
24 | extern unsigned long sm501_set_clock(struct device *dev, | 24 | extern unsigned long sm501_set_clock(struct device *dev, |
25 | int clksrc, unsigned long freq); | 25 | int clksrc, unsigned long freq); |
26 | 26 | ||
27 | extern unsigned long sm501_find_clock(int clksrc, unsigned long req_freq); | 27 | extern unsigned long sm501_find_clock(struct device *dev, |
28 | int clksrc, unsigned long req_freq); | ||
28 | 29 | ||
29 | /* sm501_misc_control | 30 | /* sm501_misc_control |
30 | * | 31 | * |
diff --git a/include/linux/tifm.h b/include/linux/tifm.h index da76ed85f595..848c0f392541 100644 --- a/include/linux/tifm.h +++ b/include/linux/tifm.h | |||
@@ -70,9 +70,9 @@ enum { | |||
70 | 70 | ||
71 | #define TIFM_FIFO_ENABLE 0x00000001 | 71 | #define TIFM_FIFO_ENABLE 0x00000001 |
72 | #define TIFM_FIFO_READY 0x00000001 | 72 | #define TIFM_FIFO_READY 0x00000001 |
73 | #define TIFM_FIFO_MORE 0x00000008 | ||
73 | #define TIFM_FIFO_INT_SETALL 0x0000ffff | 74 | #define TIFM_FIFO_INT_SETALL 0x0000ffff |
74 | #define TIFM_FIFO_INTMASK 0x00000005 | 75 | #define TIFM_FIFO_INTMASK 0x00000005 |
75 | #define TIFM_FIFO_SIZE 0x00000200 | ||
76 | 76 | ||
77 | #define TIFM_DMA_RESET 0x00000002 | 77 | #define TIFM_DMA_RESET 0x00000002 |
78 | #define TIFM_DMA_TX 0x00008000 | 78 | #define TIFM_DMA_TX 0x00008000 |
diff --git a/include/linux/time.h b/include/linux/time.h index 2091a19f1655..d32ef0ad4c0a 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
@@ -174,6 +174,10 @@ static inline void timespec_add_ns(struct timespec *a, u64 ns) | |||
174 | { | 174 | { |
175 | ns += a->tv_nsec; | 175 | ns += a->tv_nsec; |
176 | while(unlikely(ns >= NSEC_PER_SEC)) { | 176 | while(unlikely(ns >= NSEC_PER_SEC)) { |
177 | /* The following asm() prevents the compiler from | ||
178 | * optimising this loop into a modulo operation. */ | ||
179 | asm("" : "+r"(ns)); | ||
180 | |||
177 | ns -= NSEC_PER_SEC; | 181 | ns -= NSEC_PER_SEC; |
178 | a->tv_sec++; | 182 | a->tv_sec++; |
179 | } | 183 | } |
diff --git a/include/linux/timex.h b/include/linux/timex.h index c3f374786a43..8ea3e71ba7fa 100644 --- a/include/linux/timex.h +++ b/include/linux/timex.h | |||
@@ -232,14 +232,7 @@ static inline int ntp_synced(void) | |||
232 | #else | 232 | #else |
233 | #define NTP_INTERVAL_FREQ (HZ) | 233 | #define NTP_INTERVAL_FREQ (HZ) |
234 | #endif | 234 | #endif |
235 | 235 | #define NTP_INTERVAL_LENGTH (NSEC_PER_SEC/NTP_INTERVAL_FREQ) | |
236 | #define CLOCK_TICK_OVERFLOW (LATCH * HZ - CLOCK_TICK_RATE) | ||
237 | #define CLOCK_TICK_ADJUST (((s64)CLOCK_TICK_OVERFLOW * NSEC_PER_SEC) / \ | ||
238 | (s64)CLOCK_TICK_RATE) | ||
239 | |||
240 | /* Because using NSEC_PER_SEC would be too easy */ | ||
241 | #define NTP_INTERVAL_LENGTH ((((s64)TICK_USEC * NSEC_PER_USEC * USER_HZ) + \ | ||
242 | CLOCK_TICK_ADJUST) / NTP_INTERVAL_FREQ) | ||
243 | 236 | ||
244 | /* Returns how long ticks are at present, in ns / 2^(SHIFT_SCALE-10). */ | 237 | /* Returns how long ticks are at present, in ns / 2^(SHIFT_SCALE-10). */ |
245 | extern u64 current_tick_length(void); | 238 | extern u64 current_tick_length(void); |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 2372e2e6b527..583e0481dfa0 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -94,10 +94,9 @@ enum usb_interface_condition { | |||
94 | * @altsetting: array of interface structures, one for each alternate | 94 | * @altsetting: array of interface structures, one for each alternate |
95 | * setting that may be selected. Each one includes a set of | 95 | * setting that may be selected. Each one includes a set of |
96 | * endpoint configurations. They will be in no particular order. | 96 | * endpoint configurations. They will be in no particular order. |
97 | * @num_altsetting: number of altsettings defined. | ||
98 | * @cur_altsetting: the current altsetting. | 97 | * @cur_altsetting: the current altsetting. |
98 | * @num_altsetting: number of altsettings defined. | ||
99 | * @intf_assoc: interface association descriptor | 99 | * @intf_assoc: interface association descriptor |
100 | * @driver: the USB driver that is bound to this interface. | ||
101 | * @minor: the minor number assigned to this interface, if this | 100 | * @minor: the minor number assigned to this interface, if this |
102 | * interface is bound to a driver that uses the USB major number. | 101 | * interface is bound to a driver that uses the USB major number. |
103 | * If this interface does not use the USB major, this field should | 102 | * If this interface does not use the USB major, this field should |
@@ -781,8 +780,7 @@ static inline int usb_endpoint_is_isoc_out( | |||
781 | .idVendor = (vend), \ | 780 | .idVendor = (vend), \ |
782 | .idProduct = (prod) | 781 | .idProduct = (prod) |
783 | /** | 782 | /** |
784 | * USB_DEVICE_VER - macro used to describe a specific usb device with a | 783 | * USB_DEVICE_VER - describe a specific usb device with a version range |
785 | * version range | ||
786 | * @vend: the 16 bit USB Vendor ID | 784 | * @vend: the 16 bit USB Vendor ID |
787 | * @prod: the 16 bit USB Product ID | 785 | * @prod: the 16 bit USB Product ID |
788 | * @lo: the bcdDevice_lo value | 786 | * @lo: the bcdDevice_lo value |
@@ -799,8 +797,7 @@ static inline int usb_endpoint_is_isoc_out( | |||
799 | .bcdDevice_hi = (hi) | 797 | .bcdDevice_hi = (hi) |
800 | 798 | ||
801 | /** | 799 | /** |
802 | * USB_DEVICE_INTERFACE_PROTOCOL - macro used to describe a usb | 800 | * USB_DEVICE_INTERFACE_PROTOCOL - describe a usb device with a specific interface protocol |
803 | * device with a specific interface protocol | ||
804 | * @vend: the 16 bit USB Vendor ID | 801 | * @vend: the 16 bit USB Vendor ID |
805 | * @prod: the 16 bit USB Product ID | 802 | * @prod: the 16 bit USB Product ID |
806 | * @pr: bInterfaceProtocol value | 803 | * @pr: bInterfaceProtocol value |
@@ -846,8 +843,7 @@ static inline int usb_endpoint_is_isoc_out( | |||
846 | .bInterfaceProtocol = (pr) | 843 | .bInterfaceProtocol = (pr) |
847 | 844 | ||
848 | /** | 845 | /** |
849 | * USB_DEVICE_AND_INTERFACE_INFO - macro used to describe a specific usb device | 846 | * USB_DEVICE_AND_INTERFACE_INFO - describe a specific usb device with a class of usb interfaces |
850 | * with a class of usb interfaces | ||
851 | * @vend: the 16 bit USB Vendor ID | 847 | * @vend: the 16 bit USB Vendor ID |
852 | * @prod: the 16 bit USB Product ID | 848 | * @prod: the 16 bit USB Product ID |
853 | * @cl: bInterfaceClass value | 849 | * @cl: bInterfaceClass value |
diff --git a/include/linux/usb/Kbuild b/include/linux/usb/Kbuild index b8cba1dcb2c6..42e84fc315e3 100644 --- a/include/linux/usb/Kbuild +++ b/include/linux/usb/Kbuild | |||
@@ -3,5 +3,5 @@ header-y += cdc.h | |||
3 | header-y += ch9.h | 3 | header-y += ch9.h |
4 | header-y += gadgetfs.h | 4 | header-y += gadgetfs.h |
5 | header-y += midi.h | 5 | header-y += midi.h |
6 | unifdef-y += g_printer.h | 6 | header-y += g_printer.h |
7 | 7 | ||
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index aa3047ff00d1..f3295296b435 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h | |||
@@ -15,8 +15,6 @@ | |||
15 | #ifndef __LINUX_USB_GADGET_H | 15 | #ifndef __LINUX_USB_GADGET_H |
16 | #define __LINUX_USB_GADGET_H | 16 | #define __LINUX_USB_GADGET_H |
17 | 17 | ||
18 | #ifdef __KERNEL__ | ||
19 | |||
20 | struct usb_ep; | 18 | struct usb_ep; |
21 | 19 | ||
22 | /** | 20 | /** |
@@ -848,6 +846,4 @@ extern struct usb_ep *usb_ep_autoconfig(struct usb_gadget *, | |||
848 | 846 | ||
849 | extern void usb_ep_autoconfig_reset(struct usb_gadget *) __devinit; | 847 | extern void usb_ep_autoconfig_reset(struct usb_gadget *) __devinit; |
850 | 848 | ||
851 | #endif /* __KERNEL__ */ | ||
852 | |||
853 | #endif /* __LINUX_USB_GADGET_H */ | 849 | #endif /* __LINUX_USB_GADGET_H */ |
diff --git a/include/linux/virtio.h b/include/linux/virtio.h index 260d1fcf29a4..12c18ac1b973 100644 --- a/include/linux/virtio.h +++ b/include/linux/virtio.h | |||
@@ -43,8 +43,9 @@ struct virtqueue | |||
43 | * vq: the struct virtqueue we're talking about. | 43 | * vq: the struct virtqueue we're talking about. |
44 | * @enable_cb: restart callbacks after disable_cb. | 44 | * @enable_cb: restart callbacks after disable_cb. |
45 | * vq: the struct virtqueue we're talking about. | 45 | * vq: the struct virtqueue we're talking about. |
46 | * This returns "false" (and doesn't re-enable) if there are pending | 46 | * This re-enables callbacks; it returns "false" if there are pending |
47 | * buffers in the queue, to avoid a race. | 47 | * buffers in the queue, to detect a possible race between the driver |
48 | * checking for more work, and enabling callbacks. | ||
48 | * | 49 | * |
49 | * Locking rules are straightforward: the driver is responsible for | 50 | * Locking rules are straightforward: the driver is responsible for |
50 | * locking. No two operations may be invoked simultaneously. | 51 | * locking. No two operations may be invoked simultaneously. |
diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 75370ec0923e..9f1b4b46151e 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h | |||
@@ -246,8 +246,7 @@ static inline void __dec_zone_state(struct zone *zone, enum zone_stat_item item) | |||
246 | static inline void __dec_zone_page_state(struct page *page, | 246 | static inline void __dec_zone_page_state(struct page *page, |
247 | enum zone_stat_item item) | 247 | enum zone_stat_item item) |
248 | { | 248 | { |
249 | atomic_long_dec(&page_zone(page)->vm_stat[item]); | 249 | __dec_zone_state(page_zone(page), item); |
250 | atomic_long_dec(&vm_stat[item]); | ||
251 | } | 250 | } |
252 | 251 | ||
253 | /* | 252 | /* |
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 3ffd6b582a97..39e1cac24bb7 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h | |||
@@ -675,5 +675,6 @@ extern int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, | |||
675 | 675 | ||
676 | extern void sas_ssp_task_response(struct device *dev, struct sas_task *task, | 676 | extern void sas_ssp_task_response(struct device *dev, struct sas_task *task, |
677 | struct ssp_response_iu *iu); | 677 | struct ssp_response_iu *iu); |
678 | struct sas_phy *sas_find_local_phy(struct domain_device *dev); | ||
678 | 679 | ||
679 | #endif /* _SASLIB_H_ */ | 680 | #endif /* _SASLIB_H_ */ |
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index dbc96ef4cc72..aab1eae2ec4c 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h | |||
@@ -177,6 +177,8 @@ struct iscsi_cls_session { | |||
177 | struct list_head host_list; | 177 | struct list_head host_list; |
178 | struct iscsi_transport *transport; | 178 | struct iscsi_transport *transport; |
179 | spinlock_t lock; | 179 | spinlock_t lock; |
180 | struct work_struct block_work; | ||
181 | struct work_struct unblock_work; | ||
180 | struct work_struct scan_work; | 182 | struct work_struct scan_work; |
181 | struct work_struct unbind_work; | 183 | struct work_struct unbind_work; |
182 | 184 | ||
diff --git a/init/Kconfig b/init/Kconfig index f698a5af5007..a97924bc5b8d 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -366,10 +366,29 @@ config RESOURCE_COUNTERS | |||
366 | infrastructure that works with cgroups | 366 | infrastructure that works with cgroups |
367 | depends on CGROUPS | 367 | depends on CGROUPS |
368 | 368 | ||
369 | config CGROUP_MEM_RES_CTLR | ||
370 | bool "Memory Resource Controller for Control Groups" | ||
371 | depends on CGROUPS && RESOURCE_COUNTERS | ||
372 | help | ||
373 | Provides a memory resource controller that manages both page cache and | ||
374 | RSS memory. | ||
375 | |||
376 | Note that setting this option increases fixed memory overhead | ||
377 | associated with each page of memory in the system by 4/8 bytes | ||
378 | and also increases cache misses because struct page on many 64bit | ||
379 | systems will not fit into a single cache line anymore. | ||
380 | |||
381 | Only enable when you're ok with these trade offs and really | ||
382 | sure you need the memory resource controller. | ||
383 | |||
369 | config SYSFS_DEPRECATED | 384 | config SYSFS_DEPRECATED |
385 | bool | ||
386 | |||
387 | config SYSFS_DEPRECATED_V2 | ||
370 | bool "Create deprecated sysfs files" | 388 | bool "Create deprecated sysfs files" |
371 | depends on SYSFS | 389 | depends on SYSFS |
372 | default y | 390 | default y |
391 | select SYSFS_DEPRECATED | ||
373 | help | 392 | help |
374 | This option creates deprecated symlinks such as the | 393 | This option creates deprecated symlinks such as the |
375 | "device"-link, the <subsystem>:<name>-link, and the | 394 | "device"-link, the <subsystem>:<name>-link, and the |
@@ -382,25 +401,11 @@ config SYSFS_DEPRECATED | |||
382 | 401 | ||
383 | If enabled, this option will also move any device structures | 402 | If enabled, this option will also move any device structures |
384 | that belong to a class, back into the /sys/class hierarchy, in | 403 | that belong to a class, back into the /sys/class hierarchy, in |
385 | order to support older versions of udev. | 404 | order to support older versions of udev and some userspace |
386 | 405 | programs. | |
387 | If you are using a distro that was released in 2006 or later, | ||
388 | it should be safe to say N here. | ||
389 | |||
390 | config CGROUP_MEM_CONT | ||
391 | bool "Memory controller for cgroups" | ||
392 | depends on CGROUPS && RESOURCE_COUNTERS | ||
393 | help | ||
394 | Provides a memory controller that manages both page cache and | ||
395 | RSS memory. | ||
396 | 406 | ||
397 | Note that setting this option increases fixed memory overhead | 407 | If you are using a distro with the most recent userspace |
398 | associated with each page of memory in the system by 4/8 bytes | 408 | packages, it should be safe to say N here. |
399 | and also increases cache misses because struct page on many 64bit | ||
400 | systems will not fit into a single cache line anymore. | ||
401 | |||
402 | Only enable when you're ok with these trade offs and really | ||
403 | sure you need the memory controller. | ||
404 | 409 | ||
405 | config PROC_PID_CPUSET | 410 | config PROC_PID_CPUSET |
406 | bool "Include legacy /proc/<pid>/cpuset file" | 411 | bool "Include legacy /proc/<pid>/cpuset file" |
@@ -860,38 +865,10 @@ source "block/Kconfig" | |||
860 | config PREEMPT_NOTIFIERS | 865 | config PREEMPT_NOTIFIERS |
861 | bool | 866 | bool |
862 | 867 | ||
863 | choice | ||
864 | prompt "RCU implementation type:" | ||
865 | default CLASSIC_RCU | ||
866 | help | ||
867 | This allows you to choose either the classic RCU implementation | ||
868 | that is designed for best read-side performance on non-realtime | ||
869 | systems, or the preemptible RCU implementation for best latency | ||
870 | on realtime systems. Note that some kernel preemption modes | ||
871 | will restrict your choice. | ||
872 | |||
873 | Select the default if you are unsure. | ||
874 | |||
875 | config CLASSIC_RCU | 868 | config CLASSIC_RCU |
876 | bool "Classic RCU" | 869 | def_bool !PREEMPT_RCU |
877 | help | 870 | help |
878 | This option selects the classic RCU implementation that is | 871 | This option selects the classic RCU implementation that is |
879 | designed for best read-side performance on non-realtime | 872 | designed for best read-side performance on non-realtime |
880 | systems. | 873 | systems. Classic RCU is the default. Note that the |
881 | 874 | PREEMPT_RCU symbol is used to select/deselect this option. | |
882 | Say Y if you are unsure. | ||
883 | |||
884 | config PREEMPT_RCU | ||
885 | bool "Preemptible RCU" | ||
886 | depends on PREEMPT | ||
887 | help | ||
888 | This option reduces the latency of the kernel by making certain | ||
889 | RCU sections preemptible. Normally RCU code is non-preemptible, if | ||
890 | this option is selected then read-only RCU sections become | ||
891 | preemptible. This helps latency, but may expose bugs due to | ||
892 | now-naive assumptions about each RCU read-side critical section | ||
893 | remaining on a given CPU through its execution. | ||
894 | |||
895 | Say N if you are unsure. | ||
896 | |||
897 | endchoice | ||
diff --git a/init/initramfs.c b/init/initramfs.c index c0b1e0533d80..d53fee8d8604 100644 --- a/init/initramfs.c +++ b/init/initramfs.c | |||
@@ -538,7 +538,7 @@ skip: | |||
538 | initrd_end = 0; | 538 | initrd_end = 0; |
539 | } | 539 | } |
540 | 540 | ||
541 | int __init populate_rootfs(void) | 541 | static int __init populate_rootfs(void) |
542 | { | 542 | { |
543 | char *err = unpack_to_rootfs(__initramfs_start, | 543 | char *err = unpack_to_rootfs(__initramfs_start, |
544 | __initramfs_end - __initramfs_start, 0); | 544 | __initramfs_end - __initramfs_start, 0); |
@@ -577,10 +577,4 @@ int __init populate_rootfs(void) | |||
577 | } | 577 | } |
578 | return 0; | 578 | return 0; |
579 | } | 579 | } |
580 | #ifndef CONFIG_ACPI_CUSTOM_DSDT_INITRD | ||
581 | /* | ||
582 | * if this option is enabled, populate_rootfs() is called _earlier_ in the | ||
583 | * boot sequence. This insures that the ACPI initialisation can find the file. | ||
584 | */ | ||
585 | rootfs_initcall(populate_rootfs); | 580 | rootfs_initcall(populate_rootfs); |
586 | #endif | ||
diff --git a/init/main.c b/init/main.c index 8b1982082ad8..99ce94930b09 100644 --- a/init/main.c +++ b/init/main.c | |||
@@ -102,12 +102,6 @@ static inline void mark_rodata_ro(void) { } | |||
102 | extern void tc_init(void); | 102 | extern void tc_init(void); |
103 | #endif | 103 | #endif |
104 | 104 | ||
105 | #ifdef CONFIG_ACPI_CUSTOM_DSDT_INITRD | ||
106 | extern int populate_rootfs(void); | ||
107 | #else | ||
108 | static inline void populate_rootfs(void) {} | ||
109 | #endif | ||
110 | |||
111 | enum system_states system_state; | 105 | enum system_states system_state; |
112 | EXPORT_SYMBOL(system_state); | 106 | EXPORT_SYMBOL(system_state); |
113 | 107 | ||
@@ -254,7 +248,7 @@ early_param("quiet", quiet_kernel); | |||
254 | static int __init loglevel(char *str) | 248 | static int __init loglevel(char *str) |
255 | { | 249 | { |
256 | get_option(&str, &console_loglevel); | 250 | get_option(&str, &console_loglevel); |
257 | return 1; | 251 | return 0; |
258 | } | 252 | } |
259 | 253 | ||
260 | early_param("loglevel", loglevel); | 254 | early_param("loglevel", loglevel); |
@@ -650,7 +644,6 @@ asmlinkage void __init start_kernel(void) | |||
650 | 644 | ||
651 | check_bugs(); | 645 | check_bugs(); |
652 | 646 | ||
653 | populate_rootfs(); /* For DSDT override from initramfs */ | ||
654 | acpi_early_init(); /* before LAPIC and SMP init */ | 647 | acpi_early_init(); /* before LAPIC and SMP init */ |
655 | 648 | ||
656 | /* Do the rest non-__init'ed, we're now alive */ | 649 | /* Do the rest non-__init'ed, we're now alive */ |
@@ -271,9 +271,10 @@ static struct mempolicy *shm_get_policy(struct vm_area_struct *vma, | |||
271 | 271 | ||
272 | if (sfd->vm_ops->get_policy) | 272 | if (sfd->vm_ops->get_policy) |
273 | pol = sfd->vm_ops->get_policy(vma, addr); | 273 | pol = sfd->vm_ops->get_policy(vma, addr); |
274 | else if (vma->vm_policy) | 274 | else if (vma->vm_policy) { |
275 | pol = vma->vm_policy; | 275 | pol = vma->vm_policy; |
276 | else | 276 | mpol_get(pol); /* get_vma_policy() expects this */ |
277 | } else | ||
277 | pol = current->mempolicy; | 278 | pol = current->mempolicy; |
278 | return pol; | 279 | return pol; |
279 | } | 280 | } |
diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt index 0669b70fa6a3..9fdba03dc1fc 100644 --- a/kernel/Kconfig.preempt +++ b/kernel/Kconfig.preempt | |||
@@ -52,8 +52,23 @@ config PREEMPT | |||
52 | 52 | ||
53 | endchoice | 53 | endchoice |
54 | 54 | ||
55 | config PREEMPT_RCU | ||
56 | bool "Preemptible RCU" | ||
57 | depends on PREEMPT | ||
58 | default n | ||
59 | help | ||
60 | This option reduces the latency of the kernel by making certain | ||
61 | RCU sections preemptible. Normally RCU code is non-preemptible, if | ||
62 | this option is selected then read-only RCU sections become | ||
63 | preemptible. This helps latency, but may expose bugs due to | ||
64 | now-naive assumptions about each RCU read-side critical section | ||
65 | remaining on a given CPU through its execution. | ||
66 | |||
67 | Say N if you are unsure. | ||
68 | |||
55 | config RCU_TRACE | 69 | config RCU_TRACE |
56 | bool "Enable tracing for RCU - currently stats in debugfs" | 70 | bool "Enable tracing for RCU - currently stats in debugfs" |
71 | depends on PREEMPT_RCU | ||
57 | select DEBUG_FS | 72 | select DEBUG_FS |
58 | default y | 73 | default y |
59 | help | 74 | help |
diff --git a/kernel/audit.c b/kernel/audit.c index 2eeea9a14240..10c4930c2bbf 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -170,7 +170,9 @@ void audit_panic(const char *message) | |||
170 | printk(KERN_ERR "audit: %s\n", message); | 170 | printk(KERN_ERR "audit: %s\n", message); |
171 | break; | 171 | break; |
172 | case AUDIT_FAIL_PANIC: | 172 | case AUDIT_FAIL_PANIC: |
173 | panic("audit: %s\n", message); | 173 | /* test audit_pid since printk is always losey, why bother? */ |
174 | if (audit_pid) | ||
175 | panic("audit: %s\n", message); | ||
174 | break; | 176 | break; |
175 | } | 177 | } |
176 | } | 178 | } |
@@ -352,6 +354,7 @@ static int kauditd_thread(void *dummy) | |||
352 | if (err < 0) { | 354 | if (err < 0) { |
353 | BUG_ON(err != -ECONNREFUSED); /* Shoudn't happen */ | 355 | BUG_ON(err != -ECONNREFUSED); /* Shoudn't happen */ |
354 | printk(KERN_ERR "audit: *NO* daemon at audit_pid=%d\n", audit_pid); | 356 | printk(KERN_ERR "audit: *NO* daemon at audit_pid=%d\n", audit_pid); |
357 | audit_log_lost("auditd dissapeared\n"); | ||
355 | audit_pid = 0; | 358 | audit_pid = 0; |
356 | } | 359 | } |
357 | } else { | 360 | } else { |
@@ -1350,17 +1353,19 @@ void audit_log_end(struct audit_buffer *ab) | |||
1350 | if (!audit_rate_check()) { | 1353 | if (!audit_rate_check()) { |
1351 | audit_log_lost("rate limit exceeded"); | 1354 | audit_log_lost("rate limit exceeded"); |
1352 | } else { | 1355 | } else { |
1356 | struct nlmsghdr *nlh = nlmsg_hdr(ab->skb); | ||
1353 | if (audit_pid) { | 1357 | if (audit_pid) { |
1354 | struct nlmsghdr *nlh = nlmsg_hdr(ab->skb); | ||
1355 | nlh->nlmsg_len = ab->skb->len - NLMSG_SPACE(0); | 1358 | nlh->nlmsg_len = ab->skb->len - NLMSG_SPACE(0); |
1356 | skb_queue_tail(&audit_skb_queue, ab->skb); | 1359 | skb_queue_tail(&audit_skb_queue, ab->skb); |
1357 | ab->skb = NULL; | 1360 | ab->skb = NULL; |
1358 | wake_up_interruptible(&kauditd_wait); | 1361 | wake_up_interruptible(&kauditd_wait); |
1359 | } else if (printk_ratelimit()) { | 1362 | } else if (nlh->nlmsg_type != AUDIT_EOE) { |
1360 | struct nlmsghdr *nlh = nlmsg_hdr(ab->skb); | 1363 | if (printk_ratelimit()) { |
1361 | printk(KERN_NOTICE "type=%d %s\n", nlh->nlmsg_type, ab->skb->data + NLMSG_SPACE(0)); | 1364 | printk(KERN_NOTICE "type=%d %s\n", |
1362 | } else { | 1365 | nlh->nlmsg_type, |
1363 | audit_log_lost("printk limit exceeded\n"); | 1366 | ab->skb->data + NLMSG_SPACE(0)); |
1367 | } else | ||
1368 | audit_log_lost("printk limit exceeded\n"); | ||
1364 | } | 1369 | } |
1365 | } | 1370 | } |
1366 | audit_buffer_free(ab); | 1371 | audit_buffer_free(ab); |
diff --git a/kernel/auditsc.c b/kernel/auditsc.c index 2087d6de67ea..782262e4107d 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c | |||
@@ -1070,7 +1070,7 @@ static int audit_log_single_execve_arg(struct audit_context *context, | |||
1070 | * so we can be sure nothing was lost. | 1070 | * so we can be sure nothing was lost. |
1071 | */ | 1071 | */ |
1072 | if ((i == 0) && (too_long)) | 1072 | if ((i == 0) && (too_long)) |
1073 | audit_log_format(*ab, "a%d_len=%ld ", arg_num, | 1073 | audit_log_format(*ab, "a%d_len=%zu ", arg_num, |
1074 | has_cntl ? 2*len : len); | 1074 | has_cntl ? 2*len : len); |
1075 | 1075 | ||
1076 | /* | 1076 | /* |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index d8abe996e009..e9c2fb01e89b 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -2232,7 +2232,6 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
2232 | 2232 | ||
2233 | mutex_lock(&cgroup_mutex); | 2233 | mutex_lock(&cgroup_mutex); |
2234 | 2234 | ||
2235 | cgrp->flags = 0; | ||
2236 | INIT_LIST_HEAD(&cgrp->sibling); | 2235 | INIT_LIST_HEAD(&cgrp->sibling); |
2237 | INIT_LIST_HEAD(&cgrp->children); | 2236 | INIT_LIST_HEAD(&cgrp->children); |
2238 | INIT_LIST_HEAD(&cgrp->css_sets); | 2237 | INIT_LIST_HEAD(&cgrp->css_sets); |
@@ -2242,6 +2241,9 @@ static long cgroup_create(struct cgroup *parent, struct dentry *dentry, | |||
2242 | cgrp->root = parent->root; | 2241 | cgrp->root = parent->root; |
2243 | cgrp->top_cgroup = parent->top_cgroup; | 2242 | cgrp->top_cgroup = parent->top_cgroup; |
2244 | 2243 | ||
2244 | if (notify_on_release(parent)) | ||
2245 | set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags); | ||
2246 | |||
2245 | for_each_subsys(root, ss) { | 2247 | for_each_subsys(root, ss) { |
2246 | struct cgroup_subsys_state *css = ss->create(ss, cgrp); | 2248 | struct cgroup_subsys_state *css = ss->create(ss, cgrp); |
2247 | if (IS_ERR(css)) { | 2249 | if (IS_ERR(css)) { |
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 3e296ed81d4d..a1b61f414228 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -322,8 +322,8 @@ static void guarantee_online_mems(const struct cpuset *cs, nodemask_t *pmask) | |||
322 | * Call without callback_mutex or task_lock() held. May be | 322 | * Call without callback_mutex or task_lock() held. May be |
323 | * called with or without cgroup_mutex held. Thanks in part to | 323 | * called with or without cgroup_mutex held. Thanks in part to |
324 | * 'the_top_cpuset_hack', the task's cpuset pointer will never | 324 | * 'the_top_cpuset_hack', the task's cpuset pointer will never |
325 | * be NULL. This routine also might acquire callback_mutex and | 325 | * be NULL. This routine also might acquire callback_mutex during |
326 | * current->mm->mmap_sem during call. | 326 | * call. |
327 | * | 327 | * |
328 | * Reading current->cpuset->mems_generation doesn't need task_lock | 328 | * Reading current->cpuset->mems_generation doesn't need task_lock |
329 | * to guard the current->cpuset derefence, because it is guarded | 329 | * to guard the current->cpuset derefence, because it is guarded |
diff --git a/kernel/exit.c b/kernel/exit.c index 506a957b665a..53872bf993fa 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -214,20 +214,19 @@ struct pid *session_of_pgrp(struct pid *pgrp) | |||
214 | static int will_become_orphaned_pgrp(struct pid *pgrp, struct task_struct *ignored_task) | 214 | static int will_become_orphaned_pgrp(struct pid *pgrp, struct task_struct *ignored_task) |
215 | { | 215 | { |
216 | struct task_struct *p; | 216 | struct task_struct *p; |
217 | int ret = 1; | ||
218 | 217 | ||
219 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { | 218 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { |
220 | if (p == ignored_task | 219 | if ((p == ignored_task) || |
221 | || p->exit_state | 220 | (p->exit_state && thread_group_empty(p)) || |
222 | || is_global_init(p->real_parent)) | 221 | is_global_init(p->real_parent)) |
223 | continue; | 222 | continue; |
223 | |||
224 | if (task_pgrp(p->real_parent) != pgrp && | 224 | if (task_pgrp(p->real_parent) != pgrp && |
225 | task_session(p->real_parent) == task_session(p)) { | 225 | task_session(p->real_parent) == task_session(p)) |
226 | ret = 0; | 226 | return 0; |
227 | break; | ||
228 | } | ||
229 | } while_each_pid_task(pgrp, PIDTYPE_PGID, p); | 227 | } while_each_pid_task(pgrp, PIDTYPE_PGID, p); |
230 | return ret; /* (sighing) "Often!" */ | 228 | |
229 | return 1; | ||
231 | } | 230 | } |
232 | 231 | ||
233 | int is_current_pgrp_orphaned(void) | 232 | int is_current_pgrp_orphaned(void) |
@@ -255,6 +254,37 @@ static int has_stopped_jobs(struct pid *pgrp) | |||
255 | return retval; | 254 | return retval; |
256 | } | 255 | } |
257 | 256 | ||
257 | /* | ||
258 | * Check to see if any process groups have become orphaned as | ||
259 | * a result of our exiting, and if they have any stopped jobs, | ||
260 | * send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2) | ||
261 | */ | ||
262 | static void | ||
263 | kill_orphaned_pgrp(struct task_struct *tsk, struct task_struct *parent) | ||
264 | { | ||
265 | struct pid *pgrp = task_pgrp(tsk); | ||
266 | struct task_struct *ignored_task = tsk; | ||
267 | |||
268 | if (!parent) | ||
269 | /* exit: our father is in a different pgrp than | ||
270 | * we are and we were the only connection outside. | ||
271 | */ | ||
272 | parent = tsk->real_parent; | ||
273 | else | ||
274 | /* reparent: our child is in a different pgrp than | ||
275 | * we are, and it was the only connection outside. | ||
276 | */ | ||
277 | ignored_task = NULL; | ||
278 | |||
279 | if (task_pgrp(parent) != pgrp && | ||
280 | task_session(parent) == task_session(tsk) && | ||
281 | will_become_orphaned_pgrp(pgrp, ignored_task) && | ||
282 | has_stopped_jobs(pgrp)) { | ||
283 | __kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp); | ||
284 | __kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp); | ||
285 | } | ||
286 | } | ||
287 | |||
258 | /** | 288 | /** |
259 | * reparent_to_kthreadd - Reparent the calling kernel thread to kthreadd | 289 | * reparent_to_kthreadd - Reparent the calling kernel thread to kthreadd |
260 | * | 290 | * |
@@ -635,22 +665,7 @@ reparent_thread(struct task_struct *p, struct task_struct *father, int traced) | |||
635 | p->exit_signal != -1 && thread_group_empty(p)) | 665 | p->exit_signal != -1 && thread_group_empty(p)) |
636 | do_notify_parent(p, p->exit_signal); | 666 | do_notify_parent(p, p->exit_signal); |
637 | 667 | ||
638 | /* | 668 | kill_orphaned_pgrp(p, father); |
639 | * process group orphan check | ||
640 | * Case ii: Our child is in a different pgrp | ||
641 | * than we are, and it was the only connection | ||
642 | * outside, so the child pgrp is now orphaned. | ||
643 | */ | ||
644 | if ((task_pgrp(p) != task_pgrp(father)) && | ||
645 | (task_session(p) == task_session(father))) { | ||
646 | struct pid *pgrp = task_pgrp(p); | ||
647 | |||
648 | if (will_become_orphaned_pgrp(pgrp, NULL) && | ||
649 | has_stopped_jobs(pgrp)) { | ||
650 | __kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp); | ||
651 | __kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp); | ||
652 | } | ||
653 | } | ||
654 | } | 669 | } |
655 | 670 | ||
656 | /* | 671 | /* |
@@ -735,11 +750,9 @@ static void forget_original_parent(struct task_struct *father) | |||
735 | * Send signals to all our closest relatives so that they know | 750 | * Send signals to all our closest relatives so that they know |
736 | * to properly mourn us.. | 751 | * to properly mourn us.. |
737 | */ | 752 | */ |
738 | static void exit_notify(struct task_struct *tsk) | 753 | static void exit_notify(struct task_struct *tsk, int group_dead) |
739 | { | 754 | { |
740 | int state; | 755 | int state; |
741 | struct task_struct *t; | ||
742 | struct pid *pgrp; | ||
743 | 756 | ||
744 | /* | 757 | /* |
745 | * This does two things: | 758 | * This does two things: |
@@ -753,25 +766,8 @@ static void exit_notify(struct task_struct *tsk) | |||
753 | exit_task_namespaces(tsk); | 766 | exit_task_namespaces(tsk); |
754 | 767 | ||
755 | write_lock_irq(&tasklist_lock); | 768 | write_lock_irq(&tasklist_lock); |
756 | /* | 769 | if (group_dead) |
757 | * Check to see if any process groups have become orphaned | 770 | kill_orphaned_pgrp(tsk->group_leader, NULL); |
758 | * as a result of our exiting, and if they have any stopped | ||
759 | * jobs, send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2) | ||
760 | * | ||
761 | * Case i: Our father is in a different pgrp than we are | ||
762 | * and we were the only connection outside, so our pgrp | ||
763 | * is about to become orphaned. | ||
764 | */ | ||
765 | t = tsk->real_parent; | ||
766 | |||
767 | pgrp = task_pgrp(tsk); | ||
768 | if ((task_pgrp(t) != pgrp) && | ||
769 | (task_session(t) == task_session(tsk)) && | ||
770 | will_become_orphaned_pgrp(pgrp, tsk) && | ||
771 | has_stopped_jobs(pgrp)) { | ||
772 | __kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp); | ||
773 | __kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp); | ||
774 | } | ||
775 | 771 | ||
776 | /* Let father know we died | 772 | /* Let father know we died |
777 | * | 773 | * |
@@ -788,8 +784,8 @@ static void exit_notify(struct task_struct *tsk) | |||
788 | * the same after a fork. | 784 | * the same after a fork. |
789 | */ | 785 | */ |
790 | if (tsk->exit_signal != SIGCHLD && tsk->exit_signal != -1 && | 786 | if (tsk->exit_signal != SIGCHLD && tsk->exit_signal != -1 && |
791 | ( tsk->parent_exec_id != t->self_exec_id || | 787 | (tsk->parent_exec_id != tsk->real_parent->self_exec_id || |
792 | tsk->self_exec_id != tsk->parent_exec_id) | 788 | tsk->self_exec_id != tsk->parent_exec_id) |
793 | && !capable(CAP_KILL)) | 789 | && !capable(CAP_KILL)) |
794 | tsk->exit_signal = SIGCHLD; | 790 | tsk->exit_signal = SIGCHLD; |
795 | 791 | ||
@@ -986,7 +982,7 @@ NORET_TYPE void do_exit(long code) | |||
986 | module_put(tsk->binfmt->module); | 982 | module_put(tsk->binfmt->module); |
987 | 983 | ||
988 | proc_exit_connector(tsk); | 984 | proc_exit_connector(tsk); |
989 | exit_notify(tsk); | 985 | exit_notify(tsk, group_dead); |
990 | #ifdef CONFIG_NUMA | 986 | #ifdef CONFIG_NUMA |
991 | mpol_free(tsk->mempolicy); | 987 | mpol_free(tsk->mempolicy); |
992 | tsk->mempolicy = NULL; | 988 | tsk->mempolicy = NULL; |
@@ -1382,7 +1378,7 @@ unlock_sig: | |||
1382 | if (!retval && infop) | 1378 | if (!retval && infop) |
1383 | retval = put_user(0, &infop->si_errno); | 1379 | retval = put_user(0, &infop->si_errno); |
1384 | if (!retval && infop) | 1380 | if (!retval && infop) |
1385 | retval = put_user(why, &infop->si_code); | 1381 | retval = put_user((short)why, &infop->si_code); |
1386 | if (!retval && infop) | 1382 | if (!retval && infop) |
1387 | retval = put_user(exit_code, &infop->si_status); | 1383 | retval = put_user(exit_code, &infop->si_status); |
1388 | if (!retval && infop) | 1384 | if (!retval && infop) |
diff --git a/kernel/kprobes.c b/kernel/kprobes.c index 7a86e6432338..fcfb580c3afc 100644 --- a/kernel/kprobes.c +++ b/kernel/kprobes.c | |||
@@ -498,27 +498,36 @@ static int __kprobes in_kprobes_functions(unsigned long addr) | |||
498 | return 0; | 498 | return 0; |
499 | } | 499 | } |
500 | 500 | ||
501 | /* | ||
502 | * If we have a symbol_name argument, look it up and add the offset field | ||
503 | * to it. This way, we can specify a relative address to a symbol. | ||
504 | */ | ||
505 | static kprobe_opcode_t __kprobes *kprobe_addr(struct kprobe *p) | ||
506 | { | ||
507 | kprobe_opcode_t *addr = p->addr; | ||
508 | if (p->symbol_name) { | ||
509 | if (addr) | ||
510 | return NULL; | ||
511 | kprobe_lookup_name(p->symbol_name, addr); | ||
512 | } | ||
513 | |||
514 | if (!addr) | ||
515 | return NULL; | ||
516 | return (kprobe_opcode_t *)(((char *)addr) + p->offset); | ||
517 | } | ||
518 | |||
501 | static int __kprobes __register_kprobe(struct kprobe *p, | 519 | static int __kprobes __register_kprobe(struct kprobe *p, |
502 | unsigned long called_from) | 520 | unsigned long called_from) |
503 | { | 521 | { |
504 | int ret = 0; | 522 | int ret = 0; |
505 | struct kprobe *old_p; | 523 | struct kprobe *old_p; |
506 | struct module *probed_mod; | 524 | struct module *probed_mod; |
525 | kprobe_opcode_t *addr; | ||
507 | 526 | ||
508 | /* | 527 | addr = kprobe_addr(p); |
509 | * If we have a symbol_name argument look it up, | 528 | if (!addr) |
510 | * and add it to the address. That way the addr | ||
511 | * field can either be global or relative to a symbol. | ||
512 | */ | ||
513 | if (p->symbol_name) { | ||
514 | if (p->addr) | ||
515 | return -EINVAL; | ||
516 | kprobe_lookup_name(p->symbol_name, p->addr); | ||
517 | } | ||
518 | |||
519 | if (!p->addr) | ||
520 | return -EINVAL; | 529 | return -EINVAL; |
521 | p->addr = (kprobe_opcode_t *)(((char *)p->addr)+ p->offset); | 530 | p->addr = addr; |
522 | 531 | ||
523 | if (!kernel_text_address((unsigned long) p->addr) || | 532 | if (!kernel_text_address((unsigned long) p->addr) || |
524 | in_kprobes_functions((unsigned long) p->addr)) | 533 | in_kprobes_functions((unsigned long) p->addr)) |
@@ -678,8 +687,7 @@ void __kprobes unregister_jprobe(struct jprobe *jp) | |||
678 | unregister_kprobe(&jp->kp); | 687 | unregister_kprobe(&jp->kp); |
679 | } | 688 | } |
680 | 689 | ||
681 | #ifdef ARCH_SUPPORTS_KRETPROBES | 690 | #ifdef CONFIG_KRETPROBES |
682 | |||
683 | /* | 691 | /* |
684 | * This kprobe pre_handler is registered with every kretprobe. When probe | 692 | * This kprobe pre_handler is registered with every kretprobe. When probe |
685 | * hits it will set up the return probe. | 693 | * hits it will set up the return probe. |
@@ -722,12 +730,12 @@ int __kprobes register_kretprobe(struct kretprobe *rp) | |||
722 | int ret = 0; | 730 | int ret = 0; |
723 | struct kretprobe_instance *inst; | 731 | struct kretprobe_instance *inst; |
724 | int i; | 732 | int i; |
725 | void *addr = rp->kp.addr; | 733 | void *addr; |
726 | 734 | ||
727 | if (kretprobe_blacklist_size) { | 735 | if (kretprobe_blacklist_size) { |
728 | if (addr == NULL) | 736 | addr = kprobe_addr(&rp->kp); |
729 | kprobe_lookup_name(rp->kp.symbol_name, addr); | 737 | if (!addr) |
730 | addr += rp->kp.offset; | 738 | return -EINVAL; |
731 | 739 | ||
732 | for (i = 0; kretprobe_blacklist[i].name != NULL; i++) { | 740 | for (i = 0; kretprobe_blacklist[i].name != NULL; i++) { |
733 | if (kretprobe_blacklist[i].addr == addr) | 741 | if (kretprobe_blacklist[i].addr == addr) |
@@ -769,8 +777,7 @@ int __kprobes register_kretprobe(struct kretprobe *rp) | |||
769 | return ret; | 777 | return ret; |
770 | } | 778 | } |
771 | 779 | ||
772 | #else /* ARCH_SUPPORTS_KRETPROBES */ | 780 | #else /* CONFIG_KRETPROBES */ |
773 | |||
774 | int __kprobes register_kretprobe(struct kretprobe *rp) | 781 | int __kprobes register_kretprobe(struct kretprobe *rp) |
775 | { | 782 | { |
776 | return -ENOSYS; | 783 | return -ENOSYS; |
@@ -781,8 +788,7 @@ static int __kprobes pre_handler_kretprobe(struct kprobe *p, | |||
781 | { | 788 | { |
782 | return 0; | 789 | return 0; |
783 | } | 790 | } |
784 | 791 | #endif /* CONFIG_KRETPROBES */ | |
785 | #endif /* ARCH_SUPPORTS_KRETPROBES */ | ||
786 | 792 | ||
787 | void __kprobes unregister_kretprobe(struct kretprobe *rp) | 793 | void __kprobes unregister_kretprobe(struct kretprobe *rp) |
788 | { | 794 | { |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 3574379f4d62..81a4e4a3f087 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -779,6 +779,10 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force) | |||
779 | * parallel walking of the hash-list safe: | 779 | * parallel walking of the hash-list safe: |
780 | */ | 780 | */ |
781 | list_add_tail_rcu(&class->hash_entry, hash_head); | 781 | list_add_tail_rcu(&class->hash_entry, hash_head); |
782 | /* | ||
783 | * Add it to the global list of classes: | ||
784 | */ | ||
785 | list_add_tail_rcu(&class->lock_entry, &all_lock_classes); | ||
782 | 786 | ||
783 | if (verbose(class)) { | 787 | if (verbose(class)) { |
784 | graph_unlock(); | 788 | graph_unlock(); |
@@ -2282,10 +2286,6 @@ static int mark_lock(struct task_struct *curr, struct held_lock *this, | |||
2282 | return 0; | 2286 | return 0; |
2283 | break; | 2287 | break; |
2284 | case LOCK_USED: | 2288 | case LOCK_USED: |
2285 | /* | ||
2286 | * Add it to the global list of classes: | ||
2287 | */ | ||
2288 | list_add_tail_rcu(&this->class->lock_entry, &all_lock_classes); | ||
2289 | debug_atomic_dec(&nr_unused_locks); | 2289 | debug_atomic_dec(&nr_unused_locks); |
2290 | break; | 2290 | break; |
2291 | default: | 2291 | default: |
diff --git a/kernel/marker.c b/kernel/marker.c index 50effc01d9a2..48a4ea5afffd 100644 --- a/kernel/marker.c +++ b/kernel/marker.c | |||
@@ -698,14 +698,12 @@ int marker_probe_unregister(const char *name, | |||
698 | { | 698 | { |
699 | struct marker_entry *entry; | 699 | struct marker_entry *entry; |
700 | struct marker_probe_closure *old; | 700 | struct marker_probe_closure *old; |
701 | int ret = 0; | 701 | int ret = -ENOENT; |
702 | 702 | ||
703 | mutex_lock(&markers_mutex); | 703 | mutex_lock(&markers_mutex); |
704 | entry = get_marker(name); | 704 | entry = get_marker(name); |
705 | if (!entry) { | 705 | if (!entry) |
706 | ret = -ENOENT; | ||
707 | goto end; | 706 | goto end; |
708 | } | ||
709 | if (entry->rcu_pending) | 707 | if (entry->rcu_pending) |
710 | rcu_barrier(); | 708 | rcu_barrier(); |
711 | old = marker_entry_remove_probe(entry, probe, probe_private); | 709 | old = marker_entry_remove_probe(entry, probe, probe_private); |
@@ -713,12 +711,15 @@ int marker_probe_unregister(const char *name, | |||
713 | marker_update_probes(); /* may update entry */ | 711 | marker_update_probes(); /* may update entry */ |
714 | mutex_lock(&markers_mutex); | 712 | mutex_lock(&markers_mutex); |
715 | entry = get_marker(name); | 713 | entry = get_marker(name); |
714 | if (!entry) | ||
715 | goto end; | ||
716 | entry->oldptr = old; | 716 | entry->oldptr = old; |
717 | entry->rcu_pending = 1; | 717 | entry->rcu_pending = 1; |
718 | /* write rcu_pending before calling the RCU callback */ | 718 | /* write rcu_pending before calling the RCU callback */ |
719 | smp_wmb(); | 719 | smp_wmb(); |
720 | call_rcu(&entry->rcu, free_old_closure); | 720 | call_rcu(&entry->rcu, free_old_closure); |
721 | remove_marker(name); /* Ignore busy error message */ | 721 | remove_marker(name); /* Ignore busy error message */ |
722 | ret = 0; | ||
722 | end: | 723 | end: |
723 | mutex_unlock(&markers_mutex); | 724 | mutex_unlock(&markers_mutex); |
724 | return ret; | 725 | return ret; |
diff --git a/kernel/module.c b/kernel/module.c index 901cd6ac2f11..5d437bffd8dc 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -1933,8 +1933,15 @@ static struct module *load_module(void __user *umod, | |||
1933 | /* Set up license info based on the info section */ | 1933 | /* Set up license info based on the info section */ |
1934 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); | 1934 | set_license(mod, get_modinfo(sechdrs, infoindex, "license")); |
1935 | 1935 | ||
1936 | /* | ||
1937 | * ndiswrapper is under GPL by itself, but loads proprietary modules. | ||
1938 | * Don't use add_taint_module(), as it would prevent ndiswrapper from | ||
1939 | * using GPL-only symbols it needs. | ||
1940 | */ | ||
1936 | if (strcmp(mod->name, "ndiswrapper") == 0) | 1941 | if (strcmp(mod->name, "ndiswrapper") == 0) |
1937 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); | 1942 | add_taint(TAINT_PROPRIETARY_MODULE); |
1943 | |||
1944 | /* driverloader was caught wrongly pretending to be under GPL */ | ||
1938 | if (strcmp(mod->name, "driverloader") == 0) | 1945 | if (strcmp(mod->name, "driverloader") == 0) |
1939 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); | 1946 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); |
1940 | 1947 | ||
@@ -2171,10 +2178,20 @@ sys_init_module(void __user *umod, | |||
2171 | wake_up(&module_wq); | 2178 | wake_up(&module_wq); |
2172 | return ret; | 2179 | return ret; |
2173 | } | 2180 | } |
2181 | if (ret > 0) { | ||
2182 | printk(KERN_WARNING "%s: '%s'->init suspiciously returned %d, " | ||
2183 | "it should follow 0/-E convention\n" | ||
2184 | KERN_WARNING "%s: loading module anyway...\n", | ||
2185 | __func__, mod->name, ret, | ||
2186 | __func__); | ||
2187 | dump_stack(); | ||
2188 | } | ||
2174 | 2189 | ||
2175 | /* Now it's a first class citizen! */ | 2190 | /* Now it's a first class citizen! Wake up anyone waiting for it. */ |
2176 | mutex_lock(&module_mutex); | ||
2177 | mod->state = MODULE_STATE_LIVE; | 2191 | mod->state = MODULE_STATE_LIVE; |
2192 | wake_up(&module_wq); | ||
2193 | |||
2194 | mutex_lock(&module_mutex); | ||
2178 | /* Drop initial reference. */ | 2195 | /* Drop initial reference. */ |
2179 | module_put(mod); | 2196 | module_put(mod); |
2180 | unwind_remove_table(mod->unwind_info, 1); | 2197 | unwind_remove_table(mod->unwind_info, 1); |
@@ -2183,7 +2200,6 @@ sys_init_module(void __user *umod, | |||
2183 | mod->init_size = 0; | 2200 | mod->init_size = 0; |
2184 | mod->init_text_size = 0; | 2201 | mod->init_text_size = 0; |
2185 | mutex_unlock(&module_mutex); | 2202 | mutex_unlock(&module_mutex); |
2186 | wake_up(&module_wq); | ||
2187 | 2203 | ||
2188 | return 0; | 2204 | return 0; |
2189 | } | 2205 | } |
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index 79833170bb9c..6233f3b4ae66 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig | |||
@@ -190,7 +190,7 @@ config APM_EMULATION | |||
190 | notification of APM "events" (e.g. battery status change). | 190 | notification of APM "events" (e.g. battery status change). |
191 | 191 | ||
192 | In order to use APM, you will need supporting software. For location | 192 | In order to use APM, you will need supporting software. For location |
193 | and more information, read <file:Documentation/pm.txt> and the | 193 | and more information, read <file:Documentation/power/pm.txt> and the |
194 | Battery Powered Linux mini-HOWTO, available from | 194 | Battery Powered Linux mini-HOWTO, available from |
195 | <http://www.tldp.org/docs.html#howto>. | 195 | <http://www.tldp.org/docs.html#howto>. |
196 | 196 | ||
diff --git a/kernel/power/process.c b/kernel/power/process.c index 7c2118f9597f..f1d0b345c9ba 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
@@ -75,22 +75,15 @@ void refrigerator(void) | |||
75 | __set_current_state(save); | 75 | __set_current_state(save); |
76 | } | 76 | } |
77 | 77 | ||
78 | static void fake_signal_wake_up(struct task_struct *p, int resume) | 78 | static void fake_signal_wake_up(struct task_struct *p) |
79 | { | 79 | { |
80 | unsigned long flags; | 80 | unsigned long flags; |
81 | 81 | ||
82 | spin_lock_irqsave(&p->sighand->siglock, flags); | 82 | spin_lock_irqsave(&p->sighand->siglock, flags); |
83 | signal_wake_up(p, resume); | 83 | signal_wake_up(p, 0); |
84 | spin_unlock_irqrestore(&p->sighand->siglock, flags); | 84 | spin_unlock_irqrestore(&p->sighand->siglock, flags); |
85 | } | 85 | } |
86 | 86 | ||
87 | static void send_fake_signal(struct task_struct *p) | ||
88 | { | ||
89 | if (task_is_stopped(p)) | ||
90 | force_sig_specific(SIGSTOP, p); | ||
91 | fake_signal_wake_up(p, task_is_stopped(p)); | ||
92 | } | ||
93 | |||
94 | static int has_mm(struct task_struct *p) | 87 | static int has_mm(struct task_struct *p) |
95 | { | 88 | { |
96 | return (p->mm && !(p->flags & PF_BORROWED_MM)); | 89 | return (p->mm && !(p->flags & PF_BORROWED_MM)); |
@@ -121,7 +114,7 @@ static int freeze_task(struct task_struct *p, int with_mm_only) | |||
121 | if (freezing(p)) { | 114 | if (freezing(p)) { |
122 | if (has_mm(p)) { | 115 | if (has_mm(p)) { |
123 | if (!signal_pending(p)) | 116 | if (!signal_pending(p)) |
124 | fake_signal_wake_up(p, 0); | 117 | fake_signal_wake_up(p); |
125 | } else { | 118 | } else { |
126 | if (with_mm_only) | 119 | if (with_mm_only) |
127 | ret = 0; | 120 | ret = 0; |
@@ -135,7 +128,7 @@ static int freeze_task(struct task_struct *p, int with_mm_only) | |||
135 | } else { | 128 | } else { |
136 | if (has_mm(p)) { | 129 | if (has_mm(p)) { |
137 | set_freeze_flag(p); | 130 | set_freeze_flag(p); |
138 | send_fake_signal(p); | 131 | fake_signal_wake_up(p); |
139 | } else { | 132 | } else { |
140 | if (with_mm_only) { | 133 | if (with_mm_only) { |
141 | ret = 0; | 134 | ret = 0; |
@@ -182,15 +175,17 @@ static int try_to_freeze_tasks(int freeze_user_space) | |||
182 | if (frozen(p) || !freezeable(p)) | 175 | if (frozen(p) || !freezeable(p)) |
183 | continue; | 176 | continue; |
184 | 177 | ||
185 | if (task_is_traced(p) && frozen(p->parent)) { | ||
186 | cancel_freezing(p); | ||
187 | continue; | ||
188 | } | ||
189 | |||
190 | if (!freeze_task(p, freeze_user_space)) | 178 | if (!freeze_task(p, freeze_user_space)) |
191 | continue; | 179 | continue; |
192 | 180 | ||
193 | if (!freezer_should_skip(p)) | 181 | /* |
182 | * Now that we've done set_freeze_flag, don't | ||
183 | * perturb a task in TASK_STOPPED or TASK_TRACED. | ||
184 | * It is "frozen enough". If the task does wake | ||
185 | * up, it will immediately call try_to_freeze. | ||
186 | */ | ||
187 | if (!task_is_stopped_or_traced(p) && | ||
188 | !freezer_should_skip(p)) | ||
194 | todo++; | 189 | todo++; |
195 | } while_each_thread(g, p); | 190 | } while_each_thread(g, p); |
196 | read_unlock(&tasklist_lock); | 191 | read_unlock(&tasklist_lock); |
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 72a020cabb4c..5f91a07c4eac 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
@@ -447,7 +447,7 @@ static void memory_bm_free(struct memory_bitmap *bm, int clear_nosave_free) | |||
447 | * of @bm->cur_zone_bm are updated. | 447 | * of @bm->cur_zone_bm are updated. |
448 | */ | 448 | */ |
449 | 449 | ||
450 | static void memory_bm_find_bit(struct memory_bitmap *bm, unsigned long pfn, | 450 | static int memory_bm_find_bit(struct memory_bitmap *bm, unsigned long pfn, |
451 | void **addr, unsigned int *bit_nr) | 451 | void **addr, unsigned int *bit_nr) |
452 | { | 452 | { |
453 | struct zone_bitmap *zone_bm; | 453 | struct zone_bitmap *zone_bm; |
@@ -461,7 +461,8 @@ static void memory_bm_find_bit(struct memory_bitmap *bm, unsigned long pfn, | |||
461 | while (pfn < zone_bm->start_pfn || pfn >= zone_bm->end_pfn) { | 461 | while (pfn < zone_bm->start_pfn || pfn >= zone_bm->end_pfn) { |
462 | zone_bm = zone_bm->next; | 462 | zone_bm = zone_bm->next; |
463 | 463 | ||
464 | BUG_ON(!zone_bm); | 464 | if (!zone_bm) |
465 | return -EFAULT; | ||
465 | } | 466 | } |
466 | bm->cur.zone_bm = zone_bm; | 467 | bm->cur.zone_bm = zone_bm; |
467 | } | 468 | } |
@@ -479,23 +480,40 @@ static void memory_bm_find_bit(struct memory_bitmap *bm, unsigned long pfn, | |||
479 | pfn -= bb->start_pfn; | 480 | pfn -= bb->start_pfn; |
480 | *bit_nr = pfn % BM_BITS_PER_CHUNK; | 481 | *bit_nr = pfn % BM_BITS_PER_CHUNK; |
481 | *addr = bb->data + pfn / BM_BITS_PER_CHUNK; | 482 | *addr = bb->data + pfn / BM_BITS_PER_CHUNK; |
483 | return 0; | ||
482 | } | 484 | } |
483 | 485 | ||
484 | static void memory_bm_set_bit(struct memory_bitmap *bm, unsigned long pfn) | 486 | static void memory_bm_set_bit(struct memory_bitmap *bm, unsigned long pfn) |
485 | { | 487 | { |
486 | void *addr; | 488 | void *addr; |
487 | unsigned int bit; | 489 | unsigned int bit; |
490 | int error; | ||
488 | 491 | ||
489 | memory_bm_find_bit(bm, pfn, &addr, &bit); | 492 | error = memory_bm_find_bit(bm, pfn, &addr, &bit); |
493 | BUG_ON(error); | ||
490 | set_bit(bit, addr); | 494 | set_bit(bit, addr); |
491 | } | 495 | } |
492 | 496 | ||
497 | static int mem_bm_set_bit_check(struct memory_bitmap *bm, unsigned long pfn) | ||
498 | { | ||
499 | void *addr; | ||
500 | unsigned int bit; | ||
501 | int error; | ||
502 | |||
503 | error = memory_bm_find_bit(bm, pfn, &addr, &bit); | ||
504 | if (!error) | ||
505 | set_bit(bit, addr); | ||
506 | return error; | ||
507 | } | ||
508 | |||
493 | static void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn) | 509 | static void memory_bm_clear_bit(struct memory_bitmap *bm, unsigned long pfn) |
494 | { | 510 | { |
495 | void *addr; | 511 | void *addr; |
496 | unsigned int bit; | 512 | unsigned int bit; |
513 | int error; | ||
497 | 514 | ||
498 | memory_bm_find_bit(bm, pfn, &addr, &bit); | 515 | error = memory_bm_find_bit(bm, pfn, &addr, &bit); |
516 | BUG_ON(error); | ||
499 | clear_bit(bit, addr); | 517 | clear_bit(bit, addr); |
500 | } | 518 | } |
501 | 519 | ||
@@ -503,8 +521,10 @@ static int memory_bm_test_bit(struct memory_bitmap *bm, unsigned long pfn) | |||
503 | { | 521 | { |
504 | void *addr; | 522 | void *addr; |
505 | unsigned int bit; | 523 | unsigned int bit; |
524 | int error; | ||
506 | 525 | ||
507 | memory_bm_find_bit(bm, pfn, &addr, &bit); | 526 | error = memory_bm_find_bit(bm, pfn, &addr, &bit); |
527 | BUG_ON(error); | ||
508 | return test_bit(bit, addr); | 528 | return test_bit(bit, addr); |
509 | } | 529 | } |
510 | 530 | ||
@@ -709,8 +729,15 @@ static void mark_nosave_pages(struct memory_bitmap *bm) | |||
709 | region->end_pfn << PAGE_SHIFT); | 729 | region->end_pfn << PAGE_SHIFT); |
710 | 730 | ||
711 | for (pfn = region->start_pfn; pfn < region->end_pfn; pfn++) | 731 | for (pfn = region->start_pfn; pfn < region->end_pfn; pfn++) |
712 | if (pfn_valid(pfn)) | 732 | if (pfn_valid(pfn)) { |
713 | memory_bm_set_bit(bm, pfn); | 733 | /* |
734 | * It is safe to ignore the result of | ||
735 | * mem_bm_set_bit_check() here, since we won't | ||
736 | * touch the PFNs for which the error is | ||
737 | * returned anyway. | ||
738 | */ | ||
739 | mem_bm_set_bit_check(bm, pfn); | ||
740 | } | ||
714 | } | 741 | } |
715 | } | 742 | } |
716 | 743 | ||
diff --git a/kernel/printk.c b/kernel/printk.c index bee36100f110..9adc2a473e6e 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -666,7 +666,7 @@ asmlinkage int vprintk(const char *fmt, va_list args) | |||
666 | } | 666 | } |
667 | /* Emit the output into the temporary buffer */ | 667 | /* Emit the output into the temporary buffer */ |
668 | printed_len += vscnprintf(printk_buf + printed_len, | 668 | printed_len += vscnprintf(printk_buf + printed_len, |
669 | sizeof(printk_buf), fmt, args); | 669 | sizeof(printk_buf) - printed_len, fmt, args); |
670 | 670 | ||
671 | /* | 671 | /* |
672 | * Copy the output into log_buf. If the caller didn't provide | 672 | * Copy the output into log_buf. If the caller didn't provide |
diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c index 987cfb7ade89..e9517014b57c 100644 --- a/kernel/rcupreempt.c +++ b/kernel/rcupreempt.c | |||
@@ -23,6 +23,10 @@ | |||
23 | * to Suparna Bhattacharya for pushing me completely away | 23 | * to Suparna Bhattacharya for pushing me completely away |
24 | * from atomic instructions on the read side. | 24 | * from atomic instructions on the read side. |
25 | * | 25 | * |
26 | * - Added handling of Dynamic Ticks | ||
27 | * Copyright 2007 - Paul E. Mckenney <paulmck@us.ibm.com> | ||
28 | * - Steven Rostedt <srostedt@redhat.com> | ||
29 | * | ||
26 | * Papers: http://www.rdrop.com/users/paulmck/RCU | 30 | * Papers: http://www.rdrop.com/users/paulmck/RCU |
27 | * | 31 | * |
28 | * Design Document: http://lwn.net/Articles/253651/ | 32 | * Design Document: http://lwn.net/Articles/253651/ |
@@ -409,6 +413,212 @@ static void __rcu_advance_callbacks(struct rcu_data *rdp) | |||
409 | } | 413 | } |
410 | } | 414 | } |
411 | 415 | ||
416 | #ifdef CONFIG_NO_HZ | ||
417 | |||
418 | DEFINE_PER_CPU(long, dynticks_progress_counter) = 1; | ||
419 | static DEFINE_PER_CPU(long, rcu_dyntick_snapshot); | ||
420 | static DEFINE_PER_CPU(int, rcu_update_flag); | ||
421 | |||
422 | /** | ||
423 | * rcu_irq_enter - Called from Hard irq handlers and NMI/SMI. | ||
424 | * | ||
425 | * If the CPU was idle with dynamic ticks active, this updates the | ||
426 | * dynticks_progress_counter to let the RCU handling know that the | ||
427 | * CPU is active. | ||
428 | */ | ||
429 | void rcu_irq_enter(void) | ||
430 | { | ||
431 | int cpu = smp_processor_id(); | ||
432 | |||
433 | if (per_cpu(rcu_update_flag, cpu)) | ||
434 | per_cpu(rcu_update_flag, cpu)++; | ||
435 | |||
436 | /* | ||
437 | * Only update if we are coming from a stopped ticks mode | ||
438 | * (dynticks_progress_counter is even). | ||
439 | */ | ||
440 | if (!in_interrupt() && | ||
441 | (per_cpu(dynticks_progress_counter, cpu) & 0x1) == 0) { | ||
442 | /* | ||
443 | * The following might seem like we could have a race | ||
444 | * with NMI/SMIs. But this really isn't a problem. | ||
445 | * Here we do a read/modify/write, and the race happens | ||
446 | * when an NMI/SMI comes in after the read and before | ||
447 | * the write. But NMI/SMIs will increment this counter | ||
448 | * twice before returning, so the zero bit will not | ||
449 | * be corrupted by the NMI/SMI which is the most important | ||
450 | * part. | ||
451 | * | ||
452 | * The only thing is that we would bring back the counter | ||
453 | * to a postion that it was in during the NMI/SMI. | ||
454 | * But the zero bit would be set, so the rest of the | ||
455 | * counter would again be ignored. | ||
456 | * | ||
457 | * On return from the IRQ, the counter may have the zero | ||
458 | * bit be 0 and the counter the same as the return from | ||
459 | * the NMI/SMI. If the state machine was so unlucky to | ||
460 | * see that, it still doesn't matter, since all | ||
461 | * RCU read-side critical sections on this CPU would | ||
462 | * have already completed. | ||
463 | */ | ||
464 | per_cpu(dynticks_progress_counter, cpu)++; | ||
465 | /* | ||
466 | * The following memory barrier ensures that any | ||
467 | * rcu_read_lock() primitives in the irq handler | ||
468 | * are seen by other CPUs to follow the above | ||
469 | * increment to dynticks_progress_counter. This is | ||
470 | * required in order for other CPUs to correctly | ||
471 | * determine when it is safe to advance the RCU | ||
472 | * grace-period state machine. | ||
473 | */ | ||
474 | smp_mb(); /* see above block comment. */ | ||
475 | /* | ||
476 | * Since we can't determine the dynamic tick mode from | ||
477 | * the dynticks_progress_counter after this routine, | ||
478 | * we use a second flag to acknowledge that we came | ||
479 | * from an idle state with ticks stopped. | ||
480 | */ | ||
481 | per_cpu(rcu_update_flag, cpu)++; | ||
482 | /* | ||
483 | * If we take an NMI/SMI now, they will also increment | ||
484 | * the rcu_update_flag, and will not update the | ||
485 | * dynticks_progress_counter on exit. That is for | ||
486 | * this IRQ to do. | ||
487 | */ | ||
488 | } | ||
489 | } | ||
490 | |||
491 | /** | ||
492 | * rcu_irq_exit - Called from exiting Hard irq context. | ||
493 | * | ||
494 | * If the CPU was idle with dynamic ticks active, update the | ||
495 | * dynticks_progress_counter to put let the RCU handling be | ||
496 | * aware that the CPU is going back to idle with no ticks. | ||
497 | */ | ||
498 | void rcu_irq_exit(void) | ||
499 | { | ||
500 | int cpu = smp_processor_id(); | ||
501 | |||
502 | /* | ||
503 | * rcu_update_flag is set if we interrupted the CPU | ||
504 | * when it was idle with ticks stopped. | ||
505 | * Once this occurs, we keep track of interrupt nesting | ||
506 | * because a NMI/SMI could also come in, and we still | ||
507 | * only want the IRQ that started the increment of the | ||
508 | * dynticks_progress_counter to be the one that modifies | ||
509 | * it on exit. | ||
510 | */ | ||
511 | if (per_cpu(rcu_update_flag, cpu)) { | ||
512 | if (--per_cpu(rcu_update_flag, cpu)) | ||
513 | return; | ||
514 | |||
515 | /* This must match the interrupt nesting */ | ||
516 | WARN_ON(in_interrupt()); | ||
517 | |||
518 | /* | ||
519 | * If an NMI/SMI happens now we are still | ||
520 | * protected by the dynticks_progress_counter being odd. | ||
521 | */ | ||
522 | |||
523 | /* | ||
524 | * The following memory barrier ensures that any | ||
525 | * rcu_read_unlock() primitives in the irq handler | ||
526 | * are seen by other CPUs to preceed the following | ||
527 | * increment to dynticks_progress_counter. This | ||
528 | * is required in order for other CPUs to determine | ||
529 | * when it is safe to advance the RCU grace-period | ||
530 | * state machine. | ||
531 | */ | ||
532 | smp_mb(); /* see above block comment. */ | ||
533 | per_cpu(dynticks_progress_counter, cpu)++; | ||
534 | WARN_ON(per_cpu(dynticks_progress_counter, cpu) & 0x1); | ||
535 | } | ||
536 | } | ||
537 | |||
538 | static void dyntick_save_progress_counter(int cpu) | ||
539 | { | ||
540 | per_cpu(rcu_dyntick_snapshot, cpu) = | ||
541 | per_cpu(dynticks_progress_counter, cpu); | ||
542 | } | ||
543 | |||
544 | static inline int | ||
545 | rcu_try_flip_waitack_needed(int cpu) | ||
546 | { | ||
547 | long curr; | ||
548 | long snap; | ||
549 | |||
550 | curr = per_cpu(dynticks_progress_counter, cpu); | ||
551 | snap = per_cpu(rcu_dyntick_snapshot, cpu); | ||
552 | smp_mb(); /* force ordering with cpu entering/leaving dynticks. */ | ||
553 | |||
554 | /* | ||
555 | * If the CPU remained in dynticks mode for the entire time | ||
556 | * and didn't take any interrupts, NMIs, SMIs, or whatever, | ||
557 | * then it cannot be in the middle of an rcu_read_lock(), so | ||
558 | * the next rcu_read_lock() it executes must use the new value | ||
559 | * of the counter. So we can safely pretend that this CPU | ||
560 | * already acknowledged the counter. | ||
561 | */ | ||
562 | |||
563 | if ((curr == snap) && ((curr & 0x1) == 0)) | ||
564 | return 0; | ||
565 | |||
566 | /* | ||
567 | * If the CPU passed through or entered a dynticks idle phase with | ||
568 | * no active irq handlers, then, as above, we can safely pretend | ||
569 | * that this CPU already acknowledged the counter. | ||
570 | */ | ||
571 | |||
572 | if ((curr - snap) > 2 || (snap & 0x1) == 0) | ||
573 | return 0; | ||
574 | |||
575 | /* We need this CPU to explicitly acknowledge the counter flip. */ | ||
576 | |||
577 | return 1; | ||
578 | } | ||
579 | |||
580 | static inline int | ||
581 | rcu_try_flip_waitmb_needed(int cpu) | ||
582 | { | ||
583 | long curr; | ||
584 | long snap; | ||
585 | |||
586 | curr = per_cpu(dynticks_progress_counter, cpu); | ||
587 | snap = per_cpu(rcu_dyntick_snapshot, cpu); | ||
588 | smp_mb(); /* force ordering with cpu entering/leaving dynticks. */ | ||
589 | |||
590 | /* | ||
591 | * If the CPU remained in dynticks mode for the entire time | ||
592 | * and didn't take any interrupts, NMIs, SMIs, or whatever, | ||
593 | * then it cannot have executed an RCU read-side critical section | ||
594 | * during that time, so there is no need for it to execute a | ||
595 | * memory barrier. | ||
596 | */ | ||
597 | |||
598 | if ((curr == snap) && ((curr & 0x1) == 0)) | ||
599 | return 0; | ||
600 | |||
601 | /* | ||
602 | * If the CPU either entered or exited an outermost interrupt, | ||
603 | * SMI, NMI, or whatever handler, then we know that it executed | ||
604 | * a memory barrier when doing so. So we don't need another one. | ||
605 | */ | ||
606 | if (curr != snap) | ||
607 | return 0; | ||
608 | |||
609 | /* We need the CPU to execute a memory barrier. */ | ||
610 | |||
611 | return 1; | ||
612 | } | ||
613 | |||
614 | #else /* !CONFIG_NO_HZ */ | ||
615 | |||
616 | # define dyntick_save_progress_counter(cpu) do { } while (0) | ||
617 | # define rcu_try_flip_waitack_needed(cpu) (1) | ||
618 | # define rcu_try_flip_waitmb_needed(cpu) (1) | ||
619 | |||
620 | #endif /* CONFIG_NO_HZ */ | ||
621 | |||
412 | /* | 622 | /* |
413 | * Get here when RCU is idle. Decide whether we need to | 623 | * Get here when RCU is idle. Decide whether we need to |
414 | * move out of idle state, and return non-zero if so. | 624 | * move out of idle state, and return non-zero if so. |
@@ -447,8 +657,10 @@ rcu_try_flip_idle(void) | |||
447 | 657 | ||
448 | /* Now ask each CPU for acknowledgement of the flip. */ | 658 | /* Now ask each CPU for acknowledgement of the flip. */ |
449 | 659 | ||
450 | for_each_cpu_mask(cpu, rcu_cpu_online_map) | 660 | for_each_cpu_mask(cpu, rcu_cpu_online_map) { |
451 | per_cpu(rcu_flip_flag, cpu) = rcu_flipped; | 661 | per_cpu(rcu_flip_flag, cpu) = rcu_flipped; |
662 | dyntick_save_progress_counter(cpu); | ||
663 | } | ||
452 | 664 | ||
453 | return 1; | 665 | return 1; |
454 | } | 666 | } |
@@ -464,7 +676,8 @@ rcu_try_flip_waitack(void) | |||
464 | 676 | ||
465 | RCU_TRACE_ME(rcupreempt_trace_try_flip_a1); | 677 | RCU_TRACE_ME(rcupreempt_trace_try_flip_a1); |
466 | for_each_cpu_mask(cpu, rcu_cpu_online_map) | 678 | for_each_cpu_mask(cpu, rcu_cpu_online_map) |
467 | if (per_cpu(rcu_flip_flag, cpu) != rcu_flip_seen) { | 679 | if (rcu_try_flip_waitack_needed(cpu) && |
680 | per_cpu(rcu_flip_flag, cpu) != rcu_flip_seen) { | ||
468 | RCU_TRACE_ME(rcupreempt_trace_try_flip_ae1); | 681 | RCU_TRACE_ME(rcupreempt_trace_try_flip_ae1); |
469 | return 0; | 682 | return 0; |
470 | } | 683 | } |
@@ -509,8 +722,10 @@ rcu_try_flip_waitzero(void) | |||
509 | smp_mb(); /* ^^^^^^^^^^^^ */ | 722 | smp_mb(); /* ^^^^^^^^^^^^ */ |
510 | 723 | ||
511 | /* Call for a memory barrier from each CPU. */ | 724 | /* Call for a memory barrier from each CPU. */ |
512 | for_each_cpu_mask(cpu, rcu_cpu_online_map) | 725 | for_each_cpu_mask(cpu, rcu_cpu_online_map) { |
513 | per_cpu(rcu_mb_flag, cpu) = rcu_mb_needed; | 726 | per_cpu(rcu_mb_flag, cpu) = rcu_mb_needed; |
727 | dyntick_save_progress_counter(cpu); | ||
728 | } | ||
514 | 729 | ||
515 | RCU_TRACE_ME(rcupreempt_trace_try_flip_z2); | 730 | RCU_TRACE_ME(rcupreempt_trace_try_flip_z2); |
516 | return 1; | 731 | return 1; |
@@ -528,7 +743,8 @@ rcu_try_flip_waitmb(void) | |||
528 | 743 | ||
529 | RCU_TRACE_ME(rcupreempt_trace_try_flip_m1); | 744 | RCU_TRACE_ME(rcupreempt_trace_try_flip_m1); |
530 | for_each_cpu_mask(cpu, rcu_cpu_online_map) | 745 | for_each_cpu_mask(cpu, rcu_cpu_online_map) |
531 | if (per_cpu(rcu_mb_flag, cpu) != rcu_mb_done) { | 746 | if (rcu_try_flip_waitmb_needed(cpu) && |
747 | per_cpu(rcu_mb_flag, cpu) != rcu_mb_done) { | ||
532 | RCU_TRACE_ME(rcupreempt_trace_try_flip_me1); | 748 | RCU_TRACE_ME(rcupreempt_trace_try_flip_me1); |
533 | return 0; | 749 | return 0; |
534 | } | 750 | } |
@@ -702,8 +918,9 @@ void rcu_offline_cpu(int cpu) | |||
702 | * fix. | 918 | * fix. |
703 | */ | 919 | */ |
704 | 920 | ||
921 | local_irq_save(flags); | ||
705 | rdp = RCU_DATA_ME(); | 922 | rdp = RCU_DATA_ME(); |
706 | spin_lock_irqsave(&rdp->lock, flags); | 923 | spin_lock(&rdp->lock); |
707 | *rdp->nexttail = list; | 924 | *rdp->nexttail = list; |
708 | if (list) | 925 | if (list) |
709 | rdp->nexttail = tail; | 926 | rdp->nexttail = tail; |
@@ -735,9 +952,11 @@ static void rcu_process_callbacks(struct softirq_action *unused) | |||
735 | { | 952 | { |
736 | unsigned long flags; | 953 | unsigned long flags; |
737 | struct rcu_head *next, *list; | 954 | struct rcu_head *next, *list; |
738 | struct rcu_data *rdp = RCU_DATA_ME(); | 955 | struct rcu_data *rdp; |
739 | 956 | ||
740 | spin_lock_irqsave(&rdp->lock, flags); | 957 | local_irq_save(flags); |
958 | rdp = RCU_DATA_ME(); | ||
959 | spin_lock(&rdp->lock); | ||
741 | list = rdp->donelist; | 960 | list = rdp->donelist; |
742 | if (list == NULL) { | 961 | if (list == NULL) { |
743 | spin_unlock_irqrestore(&rdp->lock, flags); | 962 | spin_unlock_irqrestore(&rdp->lock, flags); |
diff --git a/kernel/res_counter.c b/kernel/res_counter.c index 16cbec2d5d60..efbfc0fc232f 100644 --- a/kernel/res_counter.c +++ b/kernel/res_counter.c | |||
@@ -113,6 +113,7 @@ ssize_t res_counter_write(struct res_counter *counter, int member, | |||
113 | 113 | ||
114 | ret = -EINVAL; | 114 | ret = -EINVAL; |
115 | 115 | ||
116 | strstrip(buf); | ||
116 | if (write_strategy) { | 117 | if (write_strategy) { |
117 | if (write_strategy(buf, &tmp)) { | 118 | if (write_strategy(buf, &tmp)) { |
118 | goto out_free; | 119 | goto out_free; |
diff --git a/kernel/sched.c b/kernel/sched.c index b387a8de26a5..d1ad69b270ca 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -174,41 +174,6 @@ struct task_group { | |||
174 | struct sched_entity **se; | 174 | struct sched_entity **se; |
175 | /* runqueue "owned" by this group on each cpu */ | 175 | /* runqueue "owned" by this group on each cpu */ |
176 | struct cfs_rq **cfs_rq; | 176 | struct cfs_rq **cfs_rq; |
177 | |||
178 | /* | ||
179 | * shares assigned to a task group governs how much of cpu bandwidth | ||
180 | * is allocated to the group. The more shares a group has, the more is | ||
181 | * the cpu bandwidth allocated to it. | ||
182 | * | ||
183 | * For ex, lets say that there are three task groups, A, B and C which | ||
184 | * have been assigned shares 1000, 2000 and 3000 respectively. Then, | ||
185 | * cpu bandwidth allocated by the scheduler to task groups A, B and C | ||
186 | * should be: | ||
187 | * | ||
188 | * Bw(A) = 1000/(1000+2000+3000) * 100 = 16.66% | ||
189 | * Bw(B) = 2000/(1000+2000+3000) * 100 = 33.33% | ||
190 | * Bw(C) = 3000/(1000+2000+3000) * 100 = 50% | ||
191 | * | ||
192 | * The weight assigned to a task group's schedulable entities on every | ||
193 | * cpu (task_group.se[a_cpu]->load.weight) is derived from the task | ||
194 | * group's shares. For ex: lets say that task group A has been | ||
195 | * assigned shares of 1000 and there are two CPUs in a system. Then, | ||
196 | * | ||
197 | * tg_A->se[0]->load.weight = tg_A->se[1]->load.weight = 1000; | ||
198 | * | ||
199 | * Note: It's not necessary that each of a task's group schedulable | ||
200 | * entity have the same weight on all CPUs. If the group | ||
201 | * has 2 of its tasks on CPU0 and 1 task on CPU1, then a | ||
202 | * better distribution of weight could be: | ||
203 | * | ||
204 | * tg_A->se[0]->load.weight = 2/3 * 2000 = 1333 | ||
205 | * tg_A->se[1]->load.weight = 1/2 * 2000 = 667 | ||
206 | * | ||
207 | * rebalance_shares() is responsible for distributing the shares of a | ||
208 | * task groups like this among the group's schedulable entities across | ||
209 | * cpus. | ||
210 | * | ||
211 | */ | ||
212 | unsigned long shares; | 177 | unsigned long shares; |
213 | #endif | 178 | #endif |
214 | 179 | ||
@@ -250,22 +215,12 @@ static DEFINE_SPINLOCK(task_group_lock); | |||
250 | static DEFINE_MUTEX(doms_cur_mutex); | 215 | static DEFINE_MUTEX(doms_cur_mutex); |
251 | 216 | ||
252 | #ifdef CONFIG_FAIR_GROUP_SCHED | 217 | #ifdef CONFIG_FAIR_GROUP_SCHED |
253 | #ifdef CONFIG_SMP | ||
254 | /* kernel thread that runs rebalance_shares() periodically */ | ||
255 | static struct task_struct *lb_monitor_task; | ||
256 | static int load_balance_monitor(void *unused); | ||
257 | #endif | ||
258 | |||
259 | static void set_se_shares(struct sched_entity *se, unsigned long shares); | ||
260 | |||
261 | #ifdef CONFIG_USER_SCHED | 218 | #ifdef CONFIG_USER_SCHED |
262 | # define INIT_TASK_GROUP_LOAD (2*NICE_0_LOAD) | 219 | # define INIT_TASK_GROUP_LOAD (2*NICE_0_LOAD) |
263 | #else | 220 | #else |
264 | # define INIT_TASK_GROUP_LOAD NICE_0_LOAD | 221 | # define INIT_TASK_GROUP_LOAD NICE_0_LOAD |
265 | #endif | 222 | #endif |
266 | 223 | ||
267 | #define MIN_GROUP_SHARES 2 | ||
268 | |||
269 | static int init_task_group_load = INIT_TASK_GROUP_LOAD; | 224 | static int init_task_group_load = INIT_TASK_GROUP_LOAD; |
270 | #endif | 225 | #endif |
271 | 226 | ||
@@ -346,7 +301,7 @@ struct cfs_rq { | |||
346 | /* 'curr' points to currently running entity on this cfs_rq. | 301 | /* 'curr' points to currently running entity on this cfs_rq. |
347 | * It is set to NULL otherwise (i.e when none are currently running). | 302 | * It is set to NULL otherwise (i.e when none are currently running). |
348 | */ | 303 | */ |
349 | struct sched_entity *curr; | 304 | struct sched_entity *curr, *next; |
350 | 305 | ||
351 | unsigned long nr_spread_over; | 306 | unsigned long nr_spread_over; |
352 | 307 | ||
@@ -668,6 +623,8 @@ const_debug unsigned int sysctl_sched_nr_migrate = 32; | |||
668 | */ | 623 | */ |
669 | unsigned int sysctl_sched_rt_period = 1000000; | 624 | unsigned int sysctl_sched_rt_period = 1000000; |
670 | 625 | ||
626 | static __read_mostly int scheduler_running; | ||
627 | |||
671 | /* | 628 | /* |
672 | * part of the period that we allow rt tasks to run in us. | 629 | * part of the period that we allow rt tasks to run in us. |
673 | * default: 0.95s | 630 | * default: 0.95s |
@@ -689,14 +646,16 @@ unsigned long long cpu_clock(int cpu) | |||
689 | unsigned long flags; | 646 | unsigned long flags; |
690 | struct rq *rq; | 647 | struct rq *rq; |
691 | 648 | ||
692 | local_irq_save(flags); | ||
693 | rq = cpu_rq(cpu); | ||
694 | /* | 649 | /* |
695 | * Only call sched_clock() if the scheduler has already been | 650 | * Only call sched_clock() if the scheduler has already been |
696 | * initialized (some code might call cpu_clock() very early): | 651 | * initialized (some code might call cpu_clock() very early): |
697 | */ | 652 | */ |
698 | if (rq->idle) | 653 | if (unlikely(!scheduler_running)) |
699 | update_rq_clock(rq); | 654 | return 0; |
655 | |||
656 | local_irq_save(flags); | ||
657 | rq = cpu_rq(cpu); | ||
658 | update_rq_clock(rq); | ||
700 | now = rq->clock; | 659 | now = rq->clock; |
701 | local_irq_restore(flags); | 660 | local_irq_restore(flags); |
702 | 661 | ||
@@ -1125,7 +1084,7 @@ calc_delta_mine(unsigned long delta_exec, unsigned long weight, | |||
1125 | u64 tmp; | 1084 | u64 tmp; |
1126 | 1085 | ||
1127 | if (unlikely(!lw->inv_weight)) | 1086 | if (unlikely(!lw->inv_weight)) |
1128 | lw->inv_weight = (WMULT_CONST - lw->weight/2) / lw->weight + 1; | 1087 | lw->inv_weight = (WMULT_CONST-lw->weight/2) / (lw->weight+1); |
1129 | 1088 | ||
1130 | tmp = (u64)delta_exec * weight; | 1089 | tmp = (u64)delta_exec * weight; |
1131 | /* | 1090 | /* |
@@ -1149,11 +1108,13 @@ calc_delta_fair(unsigned long delta_exec, struct load_weight *lw) | |||
1149 | static inline void update_load_add(struct load_weight *lw, unsigned long inc) | 1108 | static inline void update_load_add(struct load_weight *lw, unsigned long inc) |
1150 | { | 1109 | { |
1151 | lw->weight += inc; | 1110 | lw->weight += inc; |
1111 | lw->inv_weight = 0; | ||
1152 | } | 1112 | } |
1153 | 1113 | ||
1154 | static inline void update_load_sub(struct load_weight *lw, unsigned long dec) | 1114 | static inline void update_load_sub(struct load_weight *lw, unsigned long dec) |
1155 | { | 1115 | { |
1156 | lw->weight -= dec; | 1116 | lw->weight -= dec; |
1117 | lw->inv_weight = 0; | ||
1157 | } | 1118 | } |
1158 | 1119 | ||
1159 | /* | 1120 | /* |
@@ -1241,16 +1202,6 @@ static void cpuacct_charge(struct task_struct *tsk, u64 cputime); | |||
1241 | static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime) {} | 1202 | static inline void cpuacct_charge(struct task_struct *tsk, u64 cputime) {} |
1242 | #endif | 1203 | #endif |
1243 | 1204 | ||
1244 | static inline void inc_cpu_load(struct rq *rq, unsigned long load) | ||
1245 | { | ||
1246 | update_load_add(&rq->load, load); | ||
1247 | } | ||
1248 | |||
1249 | static inline void dec_cpu_load(struct rq *rq, unsigned long load) | ||
1250 | { | ||
1251 | update_load_sub(&rq->load, load); | ||
1252 | } | ||
1253 | |||
1254 | #ifdef CONFIG_SMP | 1205 | #ifdef CONFIG_SMP |
1255 | static unsigned long source_load(int cpu, int type); | 1206 | static unsigned long source_load(int cpu, int type); |
1256 | static unsigned long target_load(int cpu, int type); | 1207 | static unsigned long target_load(int cpu, int type); |
@@ -1268,14 +1219,26 @@ static int task_hot(struct task_struct *p, u64 now, struct sched_domain *sd); | |||
1268 | 1219 | ||
1269 | #define sched_class_highest (&rt_sched_class) | 1220 | #define sched_class_highest (&rt_sched_class) |
1270 | 1221 | ||
1271 | static void inc_nr_running(struct rq *rq) | 1222 | static inline void inc_load(struct rq *rq, const struct task_struct *p) |
1223 | { | ||
1224 | update_load_add(&rq->load, p->se.load.weight); | ||
1225 | } | ||
1226 | |||
1227 | static inline void dec_load(struct rq *rq, const struct task_struct *p) | ||
1228 | { | ||
1229 | update_load_sub(&rq->load, p->se.load.weight); | ||
1230 | } | ||
1231 | |||
1232 | static void inc_nr_running(struct task_struct *p, struct rq *rq) | ||
1272 | { | 1233 | { |
1273 | rq->nr_running++; | 1234 | rq->nr_running++; |
1235 | inc_load(rq, p); | ||
1274 | } | 1236 | } |
1275 | 1237 | ||
1276 | static void dec_nr_running(struct rq *rq) | 1238 | static void dec_nr_running(struct task_struct *p, struct rq *rq) |
1277 | { | 1239 | { |
1278 | rq->nr_running--; | 1240 | rq->nr_running--; |
1241 | dec_load(rq, p); | ||
1279 | } | 1242 | } |
1280 | 1243 | ||
1281 | static void set_load_weight(struct task_struct *p) | 1244 | static void set_load_weight(struct task_struct *p) |
@@ -1367,7 +1330,7 @@ static void activate_task(struct rq *rq, struct task_struct *p, int wakeup) | |||
1367 | rq->nr_uninterruptible--; | 1330 | rq->nr_uninterruptible--; |
1368 | 1331 | ||
1369 | enqueue_task(rq, p, wakeup); | 1332 | enqueue_task(rq, p, wakeup); |
1370 | inc_nr_running(rq); | 1333 | inc_nr_running(p, rq); |
1371 | } | 1334 | } |
1372 | 1335 | ||
1373 | /* | 1336 | /* |
@@ -1379,7 +1342,7 @@ static void deactivate_task(struct rq *rq, struct task_struct *p, int sleep) | |||
1379 | rq->nr_uninterruptible++; | 1342 | rq->nr_uninterruptible++; |
1380 | 1343 | ||
1381 | dequeue_task(rq, p, sleep); | 1344 | dequeue_task(rq, p, sleep); |
1382 | dec_nr_running(rq); | 1345 | dec_nr_running(p, rq); |
1383 | } | 1346 | } |
1384 | 1347 | ||
1385 | /** | 1348 | /** |
@@ -2019,7 +1982,7 @@ void wake_up_new_task(struct task_struct *p, unsigned long clone_flags) | |||
2019 | * management (if any): | 1982 | * management (if any): |
2020 | */ | 1983 | */ |
2021 | p->sched_class->task_new(rq, p); | 1984 | p->sched_class->task_new(rq, p); |
2022 | inc_nr_running(rq); | 1985 | inc_nr_running(p, rq); |
2023 | } | 1986 | } |
2024 | check_preempt_curr(rq, p); | 1987 | check_preempt_curr(rq, p); |
2025 | #ifdef CONFIG_SMP | 1988 | #ifdef CONFIG_SMP |
@@ -3885,7 +3848,7 @@ pick_next_task(struct rq *rq, struct task_struct *prev) | |||
3885 | asmlinkage void __sched schedule(void) | 3848 | asmlinkage void __sched schedule(void) |
3886 | { | 3849 | { |
3887 | struct task_struct *prev, *next; | 3850 | struct task_struct *prev, *next; |
3888 | long *switch_count; | 3851 | unsigned long *switch_count; |
3889 | struct rq *rq; | 3852 | struct rq *rq; |
3890 | int cpu; | 3853 | int cpu; |
3891 | 3854 | ||
@@ -4307,11 +4270,10 @@ void rt_mutex_setprio(struct task_struct *p, int prio) | |||
4307 | oldprio = p->prio; | 4270 | oldprio = p->prio; |
4308 | on_rq = p->se.on_rq; | 4271 | on_rq = p->se.on_rq; |
4309 | running = task_current(rq, p); | 4272 | running = task_current(rq, p); |
4310 | if (on_rq) { | 4273 | if (on_rq) |
4311 | dequeue_task(rq, p, 0); | 4274 | dequeue_task(rq, p, 0); |
4312 | if (running) | 4275 | if (running) |
4313 | p->sched_class->put_prev_task(rq, p); | 4276 | p->sched_class->put_prev_task(rq, p); |
4314 | } | ||
4315 | 4277 | ||
4316 | if (rt_prio(prio)) | 4278 | if (rt_prio(prio)) |
4317 | p->sched_class = &rt_sched_class; | 4279 | p->sched_class = &rt_sched_class; |
@@ -4320,10 +4282,9 @@ void rt_mutex_setprio(struct task_struct *p, int prio) | |||
4320 | 4282 | ||
4321 | p->prio = prio; | 4283 | p->prio = prio; |
4322 | 4284 | ||
4285 | if (running) | ||
4286 | p->sched_class->set_curr_task(rq); | ||
4323 | if (on_rq) { | 4287 | if (on_rq) { |
4324 | if (running) | ||
4325 | p->sched_class->set_curr_task(rq); | ||
4326 | |||
4327 | enqueue_task(rq, p, 0); | 4288 | enqueue_task(rq, p, 0); |
4328 | 4289 | ||
4329 | check_class_changed(rq, p, prev_class, oldprio, running); | 4290 | check_class_changed(rq, p, prev_class, oldprio, running); |
@@ -4358,8 +4319,10 @@ void set_user_nice(struct task_struct *p, long nice) | |||
4358 | goto out_unlock; | 4319 | goto out_unlock; |
4359 | } | 4320 | } |
4360 | on_rq = p->se.on_rq; | 4321 | on_rq = p->se.on_rq; |
4361 | if (on_rq) | 4322 | if (on_rq) { |
4362 | dequeue_task(rq, p, 0); | 4323 | dequeue_task(rq, p, 0); |
4324 | dec_load(rq, p); | ||
4325 | } | ||
4363 | 4326 | ||
4364 | p->static_prio = NICE_TO_PRIO(nice); | 4327 | p->static_prio = NICE_TO_PRIO(nice); |
4365 | set_load_weight(p); | 4328 | set_load_weight(p); |
@@ -4369,6 +4332,7 @@ void set_user_nice(struct task_struct *p, long nice) | |||
4369 | 4332 | ||
4370 | if (on_rq) { | 4333 | if (on_rq) { |
4371 | enqueue_task(rq, p, 0); | 4334 | enqueue_task(rq, p, 0); |
4335 | inc_load(rq, p); | ||
4372 | /* | 4336 | /* |
4373 | * If the task increased its priority or is running and | 4337 | * If the task increased its priority or is running and |
4374 | * lowered its priority, then reschedule its CPU: | 4338 | * lowered its priority, then reschedule its CPU: |
@@ -4458,7 +4422,7 @@ int task_nice(const struct task_struct *p) | |||
4458 | { | 4422 | { |
4459 | return TASK_NICE(p); | 4423 | return TASK_NICE(p); |
4460 | } | 4424 | } |
4461 | EXPORT_SYMBOL_GPL(task_nice); | 4425 | EXPORT_SYMBOL(task_nice); |
4462 | 4426 | ||
4463 | /** | 4427 | /** |
4464 | * idle_cpu - is a given cpu idle currently? | 4428 | * idle_cpu - is a given cpu idle currently? |
@@ -4617,19 +4581,17 @@ recheck: | |||
4617 | update_rq_clock(rq); | 4581 | update_rq_clock(rq); |
4618 | on_rq = p->se.on_rq; | 4582 | on_rq = p->se.on_rq; |
4619 | running = task_current(rq, p); | 4583 | running = task_current(rq, p); |
4620 | if (on_rq) { | 4584 | if (on_rq) |
4621 | deactivate_task(rq, p, 0); | 4585 | deactivate_task(rq, p, 0); |
4622 | if (running) | 4586 | if (running) |
4623 | p->sched_class->put_prev_task(rq, p); | 4587 | p->sched_class->put_prev_task(rq, p); |
4624 | } | ||
4625 | 4588 | ||
4626 | oldprio = p->prio; | 4589 | oldprio = p->prio; |
4627 | __setscheduler(rq, p, policy, param->sched_priority); | 4590 | __setscheduler(rq, p, policy, param->sched_priority); |
4628 | 4591 | ||
4592 | if (running) | ||
4593 | p->sched_class->set_curr_task(rq); | ||
4629 | if (on_rq) { | 4594 | if (on_rq) { |
4630 | if (running) | ||
4631 | p->sched_class->set_curr_task(rq); | ||
4632 | |||
4633 | activate_task(rq, p, 0); | 4595 | activate_task(rq, p, 0); |
4634 | 4596 | ||
4635 | check_class_changed(rq, p, prev_class, oldprio, running); | 4597 | check_class_changed(rq, p, prev_class, oldprio, running); |
@@ -5136,7 +5098,7 @@ long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval) | |||
5136 | time_slice = 0; | 5098 | time_slice = 0; |
5137 | if (p->policy == SCHED_RR) { | 5099 | if (p->policy == SCHED_RR) { |
5138 | time_slice = DEF_TIMESLICE; | 5100 | time_slice = DEF_TIMESLICE; |
5139 | } else { | 5101 | } else if (p->policy != SCHED_FIFO) { |
5140 | struct sched_entity *se = &p->se; | 5102 | struct sched_entity *se = &p->se; |
5141 | unsigned long flags; | 5103 | unsigned long flags; |
5142 | struct rq *rq; | 5104 | struct rq *rq; |
@@ -5917,7 +5879,8 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
5917 | spin_unlock_irq(&rq->lock); | 5879 | spin_unlock_irq(&rq->lock); |
5918 | break; | 5880 | break; |
5919 | 5881 | ||
5920 | case CPU_DOWN_PREPARE: | 5882 | case CPU_DYING: |
5883 | case CPU_DYING_FROZEN: | ||
5921 | /* Update our root-domain */ | 5884 | /* Update our root-domain */ |
5922 | rq = cpu_rq(cpu); | 5885 | rq = cpu_rq(cpu); |
5923 | spin_lock_irqsave(&rq->lock, flags); | 5886 | spin_lock_irqsave(&rq->lock, flags); |
@@ -7083,21 +7046,6 @@ void __init sched_init_smp(void) | |||
7083 | if (set_cpus_allowed(current, non_isolated_cpus) < 0) | 7046 | if (set_cpus_allowed(current, non_isolated_cpus) < 0) |
7084 | BUG(); | 7047 | BUG(); |
7085 | sched_init_granularity(); | 7048 | sched_init_granularity(); |
7086 | |||
7087 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
7088 | if (nr_cpu_ids == 1) | ||
7089 | return; | ||
7090 | |||
7091 | lb_monitor_task = kthread_create(load_balance_monitor, NULL, | ||
7092 | "group_balance"); | ||
7093 | if (!IS_ERR(lb_monitor_task)) { | ||
7094 | lb_monitor_task->flags |= PF_NOFREEZE; | ||
7095 | wake_up_process(lb_monitor_task); | ||
7096 | } else { | ||
7097 | printk(KERN_ERR "Could not create load balance monitor thread" | ||
7098 | "(error = %ld) \n", PTR_ERR(lb_monitor_task)); | ||
7099 | } | ||
7100 | #endif | ||
7101 | } | 7049 | } |
7102 | #else | 7050 | #else |
7103 | void __init sched_init_smp(void) | 7051 | void __init sched_init_smp(void) |
@@ -7284,6 +7232,8 @@ void __init sched_init(void) | |||
7284 | * During early bootup we pretend to be a normal task: | 7232 | * During early bootup we pretend to be a normal task: |
7285 | */ | 7233 | */ |
7286 | current->sched_class = &fair_sched_class; | 7234 | current->sched_class = &fair_sched_class; |
7235 | |||
7236 | scheduler_running = 1; | ||
7287 | } | 7237 | } |
7288 | 7238 | ||
7289 | #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP | 7239 | #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP |
@@ -7418,157 +7368,6 @@ void set_curr_task(int cpu, struct task_struct *p) | |||
7418 | 7368 | ||
7419 | #ifdef CONFIG_GROUP_SCHED | 7369 | #ifdef CONFIG_GROUP_SCHED |
7420 | 7370 | ||
7421 | #if defined CONFIG_FAIR_GROUP_SCHED && defined CONFIG_SMP | ||
7422 | /* | ||
7423 | * distribute shares of all task groups among their schedulable entities, | ||
7424 | * to reflect load distribution across cpus. | ||
7425 | */ | ||
7426 | static int rebalance_shares(struct sched_domain *sd, int this_cpu) | ||
7427 | { | ||
7428 | struct cfs_rq *cfs_rq; | ||
7429 | struct rq *rq = cpu_rq(this_cpu); | ||
7430 | cpumask_t sdspan = sd->span; | ||
7431 | int balanced = 1; | ||
7432 | |||
7433 | /* Walk thr' all the task groups that we have */ | ||
7434 | for_each_leaf_cfs_rq(rq, cfs_rq) { | ||
7435 | int i; | ||
7436 | unsigned long total_load = 0, total_shares; | ||
7437 | struct task_group *tg = cfs_rq->tg; | ||
7438 | |||
7439 | /* Gather total task load of this group across cpus */ | ||
7440 | for_each_cpu_mask(i, sdspan) | ||
7441 | total_load += tg->cfs_rq[i]->load.weight; | ||
7442 | |||
7443 | /* Nothing to do if this group has no load */ | ||
7444 | if (!total_load) | ||
7445 | continue; | ||
7446 | |||
7447 | /* | ||
7448 | * tg->shares represents the number of cpu shares the task group | ||
7449 | * is eligible to hold on a single cpu. On N cpus, it is | ||
7450 | * eligible to hold (N * tg->shares) number of cpu shares. | ||
7451 | */ | ||
7452 | total_shares = tg->shares * cpus_weight(sdspan); | ||
7453 | |||
7454 | /* | ||
7455 | * redistribute total_shares across cpus as per the task load | ||
7456 | * distribution. | ||
7457 | */ | ||
7458 | for_each_cpu_mask(i, sdspan) { | ||
7459 | unsigned long local_load, local_shares; | ||
7460 | |||
7461 | local_load = tg->cfs_rq[i]->load.weight; | ||
7462 | local_shares = (local_load * total_shares) / total_load; | ||
7463 | if (!local_shares) | ||
7464 | local_shares = MIN_GROUP_SHARES; | ||
7465 | if (local_shares == tg->se[i]->load.weight) | ||
7466 | continue; | ||
7467 | |||
7468 | spin_lock_irq(&cpu_rq(i)->lock); | ||
7469 | set_se_shares(tg->se[i], local_shares); | ||
7470 | spin_unlock_irq(&cpu_rq(i)->lock); | ||
7471 | balanced = 0; | ||
7472 | } | ||
7473 | } | ||
7474 | |||
7475 | return balanced; | ||
7476 | } | ||
7477 | |||
7478 | /* | ||
7479 | * How frequently should we rebalance_shares() across cpus? | ||
7480 | * | ||
7481 | * The more frequently we rebalance shares, the more accurate is the fairness | ||
7482 | * of cpu bandwidth distribution between task groups. However higher frequency | ||
7483 | * also implies increased scheduling overhead. | ||
7484 | * | ||
7485 | * sysctl_sched_min_bal_int_shares represents the minimum interval between | ||
7486 | * consecutive calls to rebalance_shares() in the same sched domain. | ||
7487 | * | ||
7488 | * sysctl_sched_max_bal_int_shares represents the maximum interval between | ||
7489 | * consecutive calls to rebalance_shares() in the same sched domain. | ||
7490 | * | ||
7491 | * These settings allows for the appropriate trade-off between accuracy of | ||
7492 | * fairness and the associated overhead. | ||
7493 | * | ||
7494 | */ | ||
7495 | |||
7496 | /* default: 8ms, units: milliseconds */ | ||
7497 | const_debug unsigned int sysctl_sched_min_bal_int_shares = 8; | ||
7498 | |||
7499 | /* default: 128ms, units: milliseconds */ | ||
7500 | const_debug unsigned int sysctl_sched_max_bal_int_shares = 128; | ||
7501 | |||
7502 | /* kernel thread that runs rebalance_shares() periodically */ | ||
7503 | static int load_balance_monitor(void *unused) | ||
7504 | { | ||
7505 | unsigned int timeout = sysctl_sched_min_bal_int_shares; | ||
7506 | struct sched_param schedparm; | ||
7507 | int ret; | ||
7508 | |||
7509 | /* | ||
7510 | * We don't want this thread's execution to be limited by the shares | ||
7511 | * assigned to default group (init_task_group). Hence make it run | ||
7512 | * as a SCHED_RR RT task at the lowest priority. | ||
7513 | */ | ||
7514 | schedparm.sched_priority = 1; | ||
7515 | ret = sched_setscheduler(current, SCHED_RR, &schedparm); | ||
7516 | if (ret) | ||
7517 | printk(KERN_ERR "Couldn't set SCHED_RR policy for load balance" | ||
7518 | " monitor thread (error = %d) \n", ret); | ||
7519 | |||
7520 | while (!kthread_should_stop()) { | ||
7521 | int i, cpu, balanced = 1; | ||
7522 | |||
7523 | /* Prevent cpus going down or coming up */ | ||
7524 | get_online_cpus(); | ||
7525 | /* lockout changes to doms_cur[] array */ | ||
7526 | lock_doms_cur(); | ||
7527 | /* | ||
7528 | * Enter a rcu read-side critical section to safely walk rq->sd | ||
7529 | * chain on various cpus and to walk task group list | ||
7530 | * (rq->leaf_cfs_rq_list) in rebalance_shares(). | ||
7531 | */ | ||
7532 | rcu_read_lock(); | ||
7533 | |||
7534 | for (i = 0; i < ndoms_cur; i++) { | ||
7535 | cpumask_t cpumap = doms_cur[i]; | ||
7536 | struct sched_domain *sd = NULL, *sd_prev = NULL; | ||
7537 | |||
7538 | cpu = first_cpu(cpumap); | ||
7539 | |||
7540 | /* Find the highest domain at which to balance shares */ | ||
7541 | for_each_domain(cpu, sd) { | ||
7542 | if (!(sd->flags & SD_LOAD_BALANCE)) | ||
7543 | continue; | ||
7544 | sd_prev = sd; | ||
7545 | } | ||
7546 | |||
7547 | sd = sd_prev; | ||
7548 | /* sd == NULL? No load balance reqd in this domain */ | ||
7549 | if (!sd) | ||
7550 | continue; | ||
7551 | |||
7552 | balanced &= rebalance_shares(sd, cpu); | ||
7553 | } | ||
7554 | |||
7555 | rcu_read_unlock(); | ||
7556 | |||
7557 | unlock_doms_cur(); | ||
7558 | put_online_cpus(); | ||
7559 | |||
7560 | if (!balanced) | ||
7561 | timeout = sysctl_sched_min_bal_int_shares; | ||
7562 | else if (timeout < sysctl_sched_max_bal_int_shares) | ||
7563 | timeout *= 2; | ||
7564 | |||
7565 | msleep_interruptible(timeout); | ||
7566 | } | ||
7567 | |||
7568 | return 0; | ||
7569 | } | ||
7570 | #endif /* CONFIG_SMP */ | ||
7571 | |||
7572 | #ifdef CONFIG_FAIR_GROUP_SCHED | 7371 | #ifdef CONFIG_FAIR_GROUP_SCHED |
7573 | static void free_fair_sched_group(struct task_group *tg) | 7372 | static void free_fair_sched_group(struct task_group *tg) |
7574 | { | 7373 | { |
@@ -7817,47 +7616,46 @@ void sched_move_task(struct task_struct *tsk) | |||
7817 | running = task_current(rq, tsk); | 7616 | running = task_current(rq, tsk); |
7818 | on_rq = tsk->se.on_rq; | 7617 | on_rq = tsk->se.on_rq; |
7819 | 7618 | ||
7820 | if (on_rq) { | 7619 | if (on_rq) |
7821 | dequeue_task(rq, tsk, 0); | 7620 | dequeue_task(rq, tsk, 0); |
7822 | if (unlikely(running)) | 7621 | if (unlikely(running)) |
7823 | tsk->sched_class->put_prev_task(rq, tsk); | 7622 | tsk->sched_class->put_prev_task(rq, tsk); |
7824 | } | ||
7825 | 7623 | ||
7826 | set_task_rq(tsk, task_cpu(tsk)); | 7624 | set_task_rq(tsk, task_cpu(tsk)); |
7827 | 7625 | ||
7828 | if (on_rq) { | 7626 | #ifdef CONFIG_FAIR_GROUP_SCHED |
7829 | if (unlikely(running)) | 7627 | if (tsk->sched_class->moved_group) |
7830 | tsk->sched_class->set_curr_task(rq); | 7628 | tsk->sched_class->moved_group(tsk); |
7629 | #endif | ||
7630 | |||
7631 | if (unlikely(running)) | ||
7632 | tsk->sched_class->set_curr_task(rq); | ||
7633 | if (on_rq) | ||
7831 | enqueue_task(rq, tsk, 0); | 7634 | enqueue_task(rq, tsk, 0); |
7832 | } | ||
7833 | 7635 | ||
7834 | task_rq_unlock(rq, &flags); | 7636 | task_rq_unlock(rq, &flags); |
7835 | } | 7637 | } |
7836 | 7638 | ||
7837 | #ifdef CONFIG_FAIR_GROUP_SCHED | 7639 | #ifdef CONFIG_FAIR_GROUP_SCHED |
7838 | /* rq->lock to be locked by caller */ | ||
7839 | static void set_se_shares(struct sched_entity *se, unsigned long shares) | 7640 | static void set_se_shares(struct sched_entity *se, unsigned long shares) |
7840 | { | 7641 | { |
7841 | struct cfs_rq *cfs_rq = se->cfs_rq; | 7642 | struct cfs_rq *cfs_rq = se->cfs_rq; |
7842 | struct rq *rq = cfs_rq->rq; | 7643 | struct rq *rq = cfs_rq->rq; |
7843 | int on_rq; | 7644 | int on_rq; |
7844 | 7645 | ||
7845 | if (!shares) | 7646 | spin_lock_irq(&rq->lock); |
7846 | shares = MIN_GROUP_SHARES; | ||
7847 | 7647 | ||
7848 | on_rq = se->on_rq; | 7648 | on_rq = se->on_rq; |
7849 | if (on_rq) { | 7649 | if (on_rq) |
7850 | dequeue_entity(cfs_rq, se, 0); | 7650 | dequeue_entity(cfs_rq, se, 0); |
7851 | dec_cpu_load(rq, se->load.weight); | ||
7852 | } | ||
7853 | 7651 | ||
7854 | se->load.weight = shares; | 7652 | se->load.weight = shares; |
7855 | se->load.inv_weight = div64_64((1ULL<<32), shares); | 7653 | se->load.inv_weight = div64_64((1ULL<<32), shares); |
7856 | 7654 | ||
7857 | if (on_rq) { | 7655 | if (on_rq) |
7858 | enqueue_entity(cfs_rq, se, 0); | 7656 | enqueue_entity(cfs_rq, se, 0); |
7859 | inc_cpu_load(rq, se->load.weight); | 7657 | |
7860 | } | 7658 | spin_unlock_irq(&rq->lock); |
7861 | } | 7659 | } |
7862 | 7660 | ||
7863 | static DEFINE_MUTEX(shares_mutex); | 7661 | static DEFINE_MUTEX(shares_mutex); |
@@ -7867,18 +7665,18 @@ int sched_group_set_shares(struct task_group *tg, unsigned long shares) | |||
7867 | int i; | 7665 | int i; |
7868 | unsigned long flags; | 7666 | unsigned long flags; |
7869 | 7667 | ||
7668 | /* | ||
7669 | * A weight of 0 or 1 can cause arithmetics problems. | ||
7670 | * (The default weight is 1024 - so there's no practical | ||
7671 | * limitation from this.) | ||
7672 | */ | ||
7673 | if (shares < 2) | ||
7674 | shares = 2; | ||
7675 | |||
7870 | mutex_lock(&shares_mutex); | 7676 | mutex_lock(&shares_mutex); |
7871 | if (tg->shares == shares) | 7677 | if (tg->shares == shares) |
7872 | goto done; | 7678 | goto done; |
7873 | 7679 | ||
7874 | if (shares < MIN_GROUP_SHARES) | ||
7875 | shares = MIN_GROUP_SHARES; | ||
7876 | |||
7877 | /* | ||
7878 | * Prevent any load balance activity (rebalance_shares, | ||
7879 | * load_balance_fair) from referring to this group first, | ||
7880 | * by taking it off the rq->leaf_cfs_rq_list on each cpu. | ||
7881 | */ | ||
7882 | spin_lock_irqsave(&task_group_lock, flags); | 7680 | spin_lock_irqsave(&task_group_lock, flags); |
7883 | for_each_possible_cpu(i) | 7681 | for_each_possible_cpu(i) |
7884 | unregister_fair_sched_group(tg, i); | 7682 | unregister_fair_sched_group(tg, i); |
@@ -7892,11 +7690,8 @@ int sched_group_set_shares(struct task_group *tg, unsigned long shares) | |||
7892 | * w/o tripping rebalance_share or load_balance_fair. | 7690 | * w/o tripping rebalance_share or load_balance_fair. |
7893 | */ | 7691 | */ |
7894 | tg->shares = shares; | 7692 | tg->shares = shares; |
7895 | for_each_possible_cpu(i) { | 7693 | for_each_possible_cpu(i) |
7896 | spin_lock_irq(&cpu_rq(i)->lock); | ||
7897 | set_se_shares(tg->se[i], shares); | 7694 | set_se_shares(tg->se[i], shares); |
7898 | spin_unlock_irq(&cpu_rq(i)->lock); | ||
7899 | } | ||
7900 | 7695 | ||
7901 | /* | 7696 | /* |
7902 | * Enable load balance activity on this group, by inserting it back on | 7697 | * Enable load balance activity on this group, by inserting it back on |
@@ -7928,9 +7723,7 @@ static unsigned long to_ratio(u64 period, u64 runtime) | |||
7928 | if (runtime == RUNTIME_INF) | 7723 | if (runtime == RUNTIME_INF) |
7929 | return 1ULL << 16; | 7724 | return 1ULL << 16; |
7930 | 7725 | ||
7931 | runtime *= (1ULL << 16); | 7726 | return div64_64(runtime << 16, period); |
7932 | div64_64(runtime, period); | ||
7933 | return runtime; | ||
7934 | } | 7727 | } |
7935 | 7728 | ||
7936 | static int __rt_schedulable(struct task_group *tg, u64 period, u64 runtime) | 7729 | static int __rt_schedulable(struct task_group *tg, u64 period, u64 runtime) |
@@ -7954,25 +7747,40 @@ static int __rt_schedulable(struct task_group *tg, u64 period, u64 runtime) | |||
7954 | return total + to_ratio(period, runtime) < global_ratio; | 7747 | return total + to_ratio(period, runtime) < global_ratio; |
7955 | } | 7748 | } |
7956 | 7749 | ||
7750 | /* Must be called with tasklist_lock held */ | ||
7751 | static inline int tg_has_rt_tasks(struct task_group *tg) | ||
7752 | { | ||
7753 | struct task_struct *g, *p; | ||
7754 | do_each_thread(g, p) { | ||
7755 | if (rt_task(p) && rt_rq_of_se(&p->rt)->tg == tg) | ||
7756 | return 1; | ||
7757 | } while_each_thread(g, p); | ||
7758 | return 0; | ||
7759 | } | ||
7760 | |||
7957 | int sched_group_set_rt_runtime(struct task_group *tg, long rt_runtime_us) | 7761 | int sched_group_set_rt_runtime(struct task_group *tg, long rt_runtime_us) |
7958 | { | 7762 | { |
7959 | u64 rt_runtime, rt_period; | 7763 | u64 rt_runtime, rt_period; |
7960 | int err = 0; | 7764 | int err = 0; |
7961 | 7765 | ||
7962 | rt_period = sysctl_sched_rt_period * NSEC_PER_USEC; | 7766 | rt_period = (u64)sysctl_sched_rt_period * NSEC_PER_USEC; |
7963 | rt_runtime = (u64)rt_runtime_us * NSEC_PER_USEC; | 7767 | rt_runtime = (u64)rt_runtime_us * NSEC_PER_USEC; |
7964 | if (rt_runtime_us == -1) | 7768 | if (rt_runtime_us == -1) |
7965 | rt_runtime = rt_period; | 7769 | rt_runtime = RUNTIME_INF; |
7966 | 7770 | ||
7967 | mutex_lock(&rt_constraints_mutex); | 7771 | mutex_lock(&rt_constraints_mutex); |
7772 | read_lock(&tasklist_lock); | ||
7773 | if (rt_runtime_us == 0 && tg_has_rt_tasks(tg)) { | ||
7774 | err = -EBUSY; | ||
7775 | goto unlock; | ||
7776 | } | ||
7968 | if (!__rt_schedulable(tg, rt_period, rt_runtime)) { | 7777 | if (!__rt_schedulable(tg, rt_period, rt_runtime)) { |
7969 | err = -EINVAL; | 7778 | err = -EINVAL; |
7970 | goto unlock; | 7779 | goto unlock; |
7971 | } | 7780 | } |
7972 | if (rt_runtime_us == -1) | ||
7973 | rt_runtime = RUNTIME_INF; | ||
7974 | tg->rt_runtime = rt_runtime; | 7781 | tg->rt_runtime = rt_runtime; |
7975 | unlock: | 7782 | unlock: |
7783 | read_unlock(&tasklist_lock); | ||
7976 | mutex_unlock(&rt_constraints_mutex); | 7784 | mutex_unlock(&rt_constraints_mutex); |
7977 | 7785 | ||
7978 | return err; | 7786 | return err; |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 6c091d6e159d..f2cc59080efa 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -175,8 +175,15 @@ static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
175 | * Maintain a cache of leftmost tree entries (it is frequently | 175 | * Maintain a cache of leftmost tree entries (it is frequently |
176 | * used): | 176 | * used): |
177 | */ | 177 | */ |
178 | if (leftmost) | 178 | if (leftmost) { |
179 | cfs_rq->rb_leftmost = &se->run_node; | 179 | cfs_rq->rb_leftmost = &se->run_node; |
180 | /* | ||
181 | * maintain cfs_rq->min_vruntime to be a monotonic increasing | ||
182 | * value tracking the leftmost vruntime in the tree. | ||
183 | */ | ||
184 | cfs_rq->min_vruntime = | ||
185 | max_vruntime(cfs_rq->min_vruntime, se->vruntime); | ||
186 | } | ||
180 | 187 | ||
181 | rb_link_node(&se->run_node, parent, link); | 188 | rb_link_node(&se->run_node, parent, link); |
182 | rb_insert_color(&se->run_node, &cfs_rq->tasks_timeline); | 189 | rb_insert_color(&se->run_node, &cfs_rq->tasks_timeline); |
@@ -184,8 +191,24 @@ static void __enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
184 | 191 | ||
185 | static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) | 192 | static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) |
186 | { | 193 | { |
187 | if (cfs_rq->rb_leftmost == &se->run_node) | 194 | if (cfs_rq->rb_leftmost == &se->run_node) { |
188 | cfs_rq->rb_leftmost = rb_next(&se->run_node); | 195 | struct rb_node *next_node; |
196 | struct sched_entity *next; | ||
197 | |||
198 | next_node = rb_next(&se->run_node); | ||
199 | cfs_rq->rb_leftmost = next_node; | ||
200 | |||
201 | if (next_node) { | ||
202 | next = rb_entry(next_node, | ||
203 | struct sched_entity, run_node); | ||
204 | cfs_rq->min_vruntime = | ||
205 | max_vruntime(cfs_rq->min_vruntime, | ||
206 | next->vruntime); | ||
207 | } | ||
208 | } | ||
209 | |||
210 | if (cfs_rq->next == se) | ||
211 | cfs_rq->next = NULL; | ||
189 | 212 | ||
190 | rb_erase(&se->run_node, &cfs_rq->tasks_timeline); | 213 | rb_erase(&se->run_node, &cfs_rq->tasks_timeline); |
191 | } | 214 | } |
@@ -202,17 +225,12 @@ static struct sched_entity *__pick_next_entity(struct cfs_rq *cfs_rq) | |||
202 | 225 | ||
203 | static inline struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq) | 226 | static inline struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq) |
204 | { | 227 | { |
205 | struct rb_node **link = &cfs_rq->tasks_timeline.rb_node; | 228 | struct rb_node *last = rb_last(&cfs_rq->tasks_timeline); |
206 | struct sched_entity *se = NULL; | ||
207 | struct rb_node *parent; | ||
208 | 229 | ||
209 | while (*link) { | 230 | if (!last) |
210 | parent = *link; | 231 | return NULL; |
211 | se = rb_entry(parent, struct sched_entity, run_node); | ||
212 | link = &parent->rb_right; | ||
213 | } | ||
214 | 232 | ||
215 | return se; | 233 | return rb_entry(last, struct sched_entity, run_node); |
216 | } | 234 | } |
217 | 235 | ||
218 | /************************************************************** | 236 | /************************************************************** |
@@ -265,12 +283,8 @@ static u64 __sched_period(unsigned long nr_running) | |||
265 | */ | 283 | */ |
266 | static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se) | 284 | static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se) |
267 | { | 285 | { |
268 | u64 slice = __sched_period(cfs_rq->nr_running); | 286 | return calc_delta_mine(__sched_period(cfs_rq->nr_running), |
269 | 287 | se->load.weight, &cfs_rq->load); | |
270 | slice *= se->load.weight; | ||
271 | do_div(slice, cfs_rq->load.weight); | ||
272 | |||
273 | return slice; | ||
274 | } | 288 | } |
275 | 289 | ||
276 | /* | 290 | /* |
@@ -308,7 +322,6 @@ __update_curr(struct cfs_rq *cfs_rq, struct sched_entity *curr, | |||
308 | unsigned long delta_exec) | 322 | unsigned long delta_exec) |
309 | { | 323 | { |
310 | unsigned long delta_exec_weighted; | 324 | unsigned long delta_exec_weighted; |
311 | u64 vruntime; | ||
312 | 325 | ||
313 | schedstat_set(curr->exec_max, max((u64)delta_exec, curr->exec_max)); | 326 | schedstat_set(curr->exec_max, max((u64)delta_exec, curr->exec_max)); |
314 | 327 | ||
@@ -320,19 +333,6 @@ __update_curr(struct cfs_rq *cfs_rq, struct sched_entity *curr, | |||
320 | &curr->load); | 333 | &curr->load); |
321 | } | 334 | } |
322 | curr->vruntime += delta_exec_weighted; | 335 | curr->vruntime += delta_exec_weighted; |
323 | |||
324 | /* | ||
325 | * maintain cfs_rq->min_vruntime to be a monotonic increasing | ||
326 | * value tracking the leftmost vruntime in the tree. | ||
327 | */ | ||
328 | if (first_fair(cfs_rq)) { | ||
329 | vruntime = min_vruntime(curr->vruntime, | ||
330 | __pick_next_entity(cfs_rq)->vruntime); | ||
331 | } else | ||
332 | vruntime = curr->vruntime; | ||
333 | |||
334 | cfs_rq->min_vruntime = | ||
335 | max_vruntime(cfs_rq->min_vruntime, vruntime); | ||
336 | } | 336 | } |
337 | 337 | ||
338 | static void update_curr(struct cfs_rq *cfs_rq) | 338 | static void update_curr(struct cfs_rq *cfs_rq) |
@@ -498,7 +498,11 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial) | |||
498 | { | 498 | { |
499 | u64 vruntime; | 499 | u64 vruntime; |
500 | 500 | ||
501 | vruntime = cfs_rq->min_vruntime; | 501 | if (first_fair(cfs_rq)) { |
502 | vruntime = min_vruntime(cfs_rq->min_vruntime, | ||
503 | __pick_next_entity(cfs_rq)->vruntime); | ||
504 | } else | ||
505 | vruntime = cfs_rq->min_vruntime; | ||
502 | 506 | ||
503 | if (sched_feat(TREE_AVG)) { | 507 | if (sched_feat(TREE_AVG)) { |
504 | struct sched_entity *last = __pick_last_entity(cfs_rq); | 508 | struct sched_entity *last = __pick_last_entity(cfs_rq); |
@@ -520,8 +524,10 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial) | |||
520 | 524 | ||
521 | if (!initial) { | 525 | if (!initial) { |
522 | /* sleeps upto a single latency don't count. */ | 526 | /* sleeps upto a single latency don't count. */ |
523 | if (sched_feat(NEW_FAIR_SLEEPERS)) | 527 | if (sched_feat(NEW_FAIR_SLEEPERS)) { |
524 | vruntime -= sysctl_sched_latency; | 528 | vruntime -= calc_delta_fair(sysctl_sched_latency, |
529 | &cfs_rq->load); | ||
530 | } | ||
525 | 531 | ||
526 | /* ensure we never gain time by being placed backwards. */ | 532 | /* ensure we never gain time by being placed backwards. */ |
527 | vruntime = max_vruntime(se->vruntime, vruntime); | 533 | vruntime = max_vruntime(se->vruntime, vruntime); |
@@ -621,12 +627,32 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
621 | se->prev_sum_exec_runtime = se->sum_exec_runtime; | 627 | se->prev_sum_exec_runtime = se->sum_exec_runtime; |
622 | } | 628 | } |
623 | 629 | ||
630 | static struct sched_entity * | ||
631 | pick_next(struct cfs_rq *cfs_rq, struct sched_entity *se) | ||
632 | { | ||
633 | s64 diff, gran; | ||
634 | |||
635 | if (!cfs_rq->next) | ||
636 | return se; | ||
637 | |||
638 | diff = cfs_rq->next->vruntime - se->vruntime; | ||
639 | if (diff < 0) | ||
640 | return se; | ||
641 | |||
642 | gran = calc_delta_fair(sysctl_sched_wakeup_granularity, &cfs_rq->load); | ||
643 | if (diff > gran) | ||
644 | return se; | ||
645 | |||
646 | return cfs_rq->next; | ||
647 | } | ||
648 | |||
624 | static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq) | 649 | static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq) |
625 | { | 650 | { |
626 | struct sched_entity *se = NULL; | 651 | struct sched_entity *se = NULL; |
627 | 652 | ||
628 | if (first_fair(cfs_rq)) { | 653 | if (first_fair(cfs_rq)) { |
629 | se = __pick_next_entity(cfs_rq); | 654 | se = __pick_next_entity(cfs_rq); |
655 | se = pick_next(cfs_rq, se); | ||
630 | set_next_entity(cfs_rq, se); | 656 | set_next_entity(cfs_rq, se); |
631 | } | 657 | } |
632 | 658 | ||
@@ -732,8 +758,6 @@ static inline struct sched_entity *parent_entity(struct sched_entity *se) | |||
732 | return se->parent; | 758 | return se->parent; |
733 | } | 759 | } |
734 | 760 | ||
735 | #define GROUP_IMBALANCE_PCT 20 | ||
736 | |||
737 | #else /* CONFIG_FAIR_GROUP_SCHED */ | 761 | #else /* CONFIG_FAIR_GROUP_SCHED */ |
738 | 762 | ||
739 | #define for_each_sched_entity(se) \ | 763 | #define for_each_sched_entity(se) \ |
@@ -824,26 +848,15 @@ hrtick_start_fair(struct rq *rq, struct task_struct *p) | |||
824 | static void enqueue_task_fair(struct rq *rq, struct task_struct *p, int wakeup) | 848 | static void enqueue_task_fair(struct rq *rq, struct task_struct *p, int wakeup) |
825 | { | 849 | { |
826 | struct cfs_rq *cfs_rq; | 850 | struct cfs_rq *cfs_rq; |
827 | struct sched_entity *se = &p->se, | 851 | struct sched_entity *se = &p->se; |
828 | *topse = NULL; /* Highest schedulable entity */ | ||
829 | int incload = 1; | ||
830 | 852 | ||
831 | for_each_sched_entity(se) { | 853 | for_each_sched_entity(se) { |
832 | topse = se; | 854 | if (se->on_rq) |
833 | if (se->on_rq) { | ||
834 | incload = 0; | ||
835 | break; | 855 | break; |
836 | } | ||
837 | cfs_rq = cfs_rq_of(se); | 856 | cfs_rq = cfs_rq_of(se); |
838 | enqueue_entity(cfs_rq, se, wakeup); | 857 | enqueue_entity(cfs_rq, se, wakeup); |
839 | wakeup = 1; | 858 | wakeup = 1; |
840 | } | 859 | } |
841 | /* Increment cpu load if we just enqueued the first task of a group on | ||
842 | * 'rq->cpu'. 'topse' represents the group to which task 'p' belongs | ||
843 | * at the highest grouping level. | ||
844 | */ | ||
845 | if (incload) | ||
846 | inc_cpu_load(rq, topse->load.weight); | ||
847 | 860 | ||
848 | hrtick_start_fair(rq, rq->curr); | 861 | hrtick_start_fair(rq, rq->curr); |
849 | } | 862 | } |
@@ -856,28 +869,16 @@ static void enqueue_task_fair(struct rq *rq, struct task_struct *p, int wakeup) | |||
856 | static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int sleep) | 869 | static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int sleep) |
857 | { | 870 | { |
858 | struct cfs_rq *cfs_rq; | 871 | struct cfs_rq *cfs_rq; |
859 | struct sched_entity *se = &p->se, | 872 | struct sched_entity *se = &p->se; |
860 | *topse = NULL; /* Highest schedulable entity */ | ||
861 | int decload = 1; | ||
862 | 873 | ||
863 | for_each_sched_entity(se) { | 874 | for_each_sched_entity(se) { |
864 | topse = se; | ||
865 | cfs_rq = cfs_rq_of(se); | 875 | cfs_rq = cfs_rq_of(se); |
866 | dequeue_entity(cfs_rq, se, sleep); | 876 | dequeue_entity(cfs_rq, se, sleep); |
867 | /* Don't dequeue parent if it has other entities besides us */ | 877 | /* Don't dequeue parent if it has other entities besides us */ |
868 | if (cfs_rq->load.weight) { | 878 | if (cfs_rq->load.weight) |
869 | if (parent_entity(se)) | ||
870 | decload = 0; | ||
871 | break; | 879 | break; |
872 | } | ||
873 | sleep = 1; | 880 | sleep = 1; |
874 | } | 881 | } |
875 | /* Decrement cpu load if we just dequeued the last task of a group on | ||
876 | * 'rq->cpu'. 'topse' represents the group to which task 'p' belongs | ||
877 | * at the highest grouping level. | ||
878 | */ | ||
879 | if (decload) | ||
880 | dec_cpu_load(rq, topse->load.weight); | ||
881 | 882 | ||
882 | hrtick_start_fair(rq, rq->curr); | 883 | hrtick_start_fair(rq, rq->curr); |
883 | } | 884 | } |
@@ -1090,6 +1091,9 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p) | |||
1090 | resched_task(curr); | 1091 | resched_task(curr); |
1091 | return; | 1092 | return; |
1092 | } | 1093 | } |
1094 | |||
1095 | cfs_rq_of(pse)->next = pse; | ||
1096 | |||
1093 | /* | 1097 | /* |
1094 | * Batch tasks do not preempt (their preemption is driven by | 1098 | * Batch tasks do not preempt (their preemption is driven by |
1095 | * the tick): | 1099 | * the tick): |
@@ -1191,6 +1195,25 @@ static struct task_struct *load_balance_next_fair(void *arg) | |||
1191 | return __load_balance_iterator(cfs_rq, cfs_rq->rb_load_balance_curr); | 1195 | return __load_balance_iterator(cfs_rq, cfs_rq->rb_load_balance_curr); |
1192 | } | 1196 | } |
1193 | 1197 | ||
1198 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
1199 | static int cfs_rq_best_prio(struct cfs_rq *cfs_rq) | ||
1200 | { | ||
1201 | struct sched_entity *curr; | ||
1202 | struct task_struct *p; | ||
1203 | |||
1204 | if (!cfs_rq->nr_running || !first_fair(cfs_rq)) | ||
1205 | return MAX_PRIO; | ||
1206 | |||
1207 | curr = cfs_rq->curr; | ||
1208 | if (!curr) | ||
1209 | curr = __pick_next_entity(cfs_rq); | ||
1210 | |||
1211 | p = task_of(curr); | ||
1212 | |||
1213 | return p->prio; | ||
1214 | } | ||
1215 | #endif | ||
1216 | |||
1194 | static unsigned long | 1217 | static unsigned long |
1195 | load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest, | 1218 | load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest, |
1196 | unsigned long max_load_move, | 1219 | unsigned long max_load_move, |
@@ -1200,45 +1223,28 @@ load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest, | |||
1200 | struct cfs_rq *busy_cfs_rq; | 1223 | struct cfs_rq *busy_cfs_rq; |
1201 | long rem_load_move = max_load_move; | 1224 | long rem_load_move = max_load_move; |
1202 | struct rq_iterator cfs_rq_iterator; | 1225 | struct rq_iterator cfs_rq_iterator; |
1203 | unsigned long load_moved; | ||
1204 | 1226 | ||
1205 | cfs_rq_iterator.start = load_balance_start_fair; | 1227 | cfs_rq_iterator.start = load_balance_start_fair; |
1206 | cfs_rq_iterator.next = load_balance_next_fair; | 1228 | cfs_rq_iterator.next = load_balance_next_fair; |
1207 | 1229 | ||
1208 | for_each_leaf_cfs_rq(busiest, busy_cfs_rq) { | 1230 | for_each_leaf_cfs_rq(busiest, busy_cfs_rq) { |
1209 | #ifdef CONFIG_FAIR_GROUP_SCHED | 1231 | #ifdef CONFIG_FAIR_GROUP_SCHED |
1210 | struct cfs_rq *this_cfs_rq = busy_cfs_rq->tg->cfs_rq[this_cpu]; | 1232 | struct cfs_rq *this_cfs_rq; |
1211 | unsigned long maxload, task_load, group_weight; | 1233 | long imbalance; |
1212 | unsigned long thisload, per_task_load; | 1234 | unsigned long maxload; |
1213 | struct sched_entity *se = busy_cfs_rq->tg->se[busiest->cpu]; | ||
1214 | 1235 | ||
1215 | task_load = busy_cfs_rq->load.weight; | 1236 | this_cfs_rq = cpu_cfs_rq(busy_cfs_rq, this_cpu); |
1216 | group_weight = se->load.weight; | ||
1217 | 1237 | ||
1218 | /* | 1238 | imbalance = busy_cfs_rq->load.weight - this_cfs_rq->load.weight; |
1219 | * 'group_weight' is contributed by tasks of total weight | 1239 | /* Don't pull if this_cfs_rq has more load than busy_cfs_rq */ |
1220 | * 'task_load'. To move 'rem_load_move' worth of weight only, | 1240 | if (imbalance <= 0) |
1221 | * we need to move a maximum task load of: | ||
1222 | * | ||
1223 | * maxload = (remload / group_weight) * task_load; | ||
1224 | */ | ||
1225 | maxload = (rem_load_move * task_load) / group_weight; | ||
1226 | |||
1227 | if (!maxload || !task_load) | ||
1228 | continue; | 1241 | continue; |
1229 | 1242 | ||
1230 | per_task_load = task_load / busy_cfs_rq->nr_running; | 1243 | /* Don't pull more than imbalance/2 */ |
1231 | /* | 1244 | imbalance /= 2; |
1232 | * balance_tasks will try to forcibly move atleast one task if | 1245 | maxload = min(rem_load_move, imbalance); |
1233 | * possible (because of SCHED_LOAD_SCALE_FUZZ). Avoid that if | ||
1234 | * maxload is less than GROUP_IMBALANCE_FUZZ% the per_task_load. | ||
1235 | */ | ||
1236 | if (100 * maxload < GROUP_IMBALANCE_PCT * per_task_load) | ||
1237 | continue; | ||
1238 | 1246 | ||
1239 | /* Disable priority-based load balance */ | 1247 | *this_best_prio = cfs_rq_best_prio(this_cfs_rq); |
1240 | *this_best_prio = 0; | ||
1241 | thisload = this_cfs_rq->load.weight; | ||
1242 | #else | 1248 | #else |
1243 | # define maxload rem_load_move | 1249 | # define maxload rem_load_move |
1244 | #endif | 1250 | #endif |
@@ -1247,33 +1253,11 @@ load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest, | |||
1247 | * load_balance_[start|next]_fair iterators | 1253 | * load_balance_[start|next]_fair iterators |
1248 | */ | 1254 | */ |
1249 | cfs_rq_iterator.arg = busy_cfs_rq; | 1255 | cfs_rq_iterator.arg = busy_cfs_rq; |
1250 | load_moved = balance_tasks(this_rq, this_cpu, busiest, | 1256 | rem_load_move -= balance_tasks(this_rq, this_cpu, busiest, |
1251 | maxload, sd, idle, all_pinned, | 1257 | maxload, sd, idle, all_pinned, |
1252 | this_best_prio, | 1258 | this_best_prio, |
1253 | &cfs_rq_iterator); | 1259 | &cfs_rq_iterator); |
1254 | 1260 | ||
1255 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
1256 | /* | ||
1257 | * load_moved holds the task load that was moved. The | ||
1258 | * effective (group) weight moved would be: | ||
1259 | * load_moved_eff = load_moved/task_load * group_weight; | ||
1260 | */ | ||
1261 | load_moved = (group_weight * load_moved) / task_load; | ||
1262 | |||
1263 | /* Adjust shares on both cpus to reflect load_moved */ | ||
1264 | group_weight -= load_moved; | ||
1265 | set_se_shares(se, group_weight); | ||
1266 | |||
1267 | se = busy_cfs_rq->tg->se[this_cpu]; | ||
1268 | if (!thisload) | ||
1269 | group_weight = load_moved; | ||
1270 | else | ||
1271 | group_weight = se->load.weight + load_moved; | ||
1272 | set_se_shares(se, group_weight); | ||
1273 | #endif | ||
1274 | |||
1275 | rem_load_move -= load_moved; | ||
1276 | |||
1277 | if (rem_load_move <= 0) | 1261 | if (rem_load_move <= 0) |
1278 | break; | 1262 | break; |
1279 | } | 1263 | } |
@@ -1403,6 +1387,16 @@ static void set_curr_task_fair(struct rq *rq) | |||
1403 | set_next_entity(cfs_rq_of(se), se); | 1387 | set_next_entity(cfs_rq_of(se), se); |
1404 | } | 1388 | } |
1405 | 1389 | ||
1390 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
1391 | static void moved_group_fair(struct task_struct *p) | ||
1392 | { | ||
1393 | struct cfs_rq *cfs_rq = task_cfs_rq(p); | ||
1394 | |||
1395 | update_curr(cfs_rq); | ||
1396 | place_entity(cfs_rq, &p->se, 1); | ||
1397 | } | ||
1398 | #endif | ||
1399 | |||
1406 | /* | 1400 | /* |
1407 | * All the scheduling class methods: | 1401 | * All the scheduling class methods: |
1408 | */ | 1402 | */ |
@@ -1431,6 +1425,10 @@ static const struct sched_class fair_sched_class = { | |||
1431 | 1425 | ||
1432 | .prio_changed = prio_changed_fair, | 1426 | .prio_changed = prio_changed_fair, |
1433 | .switched_to = switched_to_fair, | 1427 | .switched_to = switched_to_fair, |
1428 | |||
1429 | #ifdef CONFIG_FAIR_GROUP_SCHED | ||
1430 | .moved_group = moved_group_fair, | ||
1431 | #endif | ||
1434 | }; | 1432 | }; |
1435 | 1433 | ||
1436 | #ifdef CONFIG_SCHED_DEBUG | 1434 | #ifdef CONFIG_SCHED_DEBUG |
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index f54792b175b2..0a6d2e516420 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
@@ -393,8 +393,6 @@ static void enqueue_task_rt(struct rq *rq, struct task_struct *p, int wakeup) | |||
393 | */ | 393 | */ |
394 | for_each_sched_rt_entity(rt_se) | 394 | for_each_sched_rt_entity(rt_se) |
395 | enqueue_rt_entity(rt_se); | 395 | enqueue_rt_entity(rt_se); |
396 | |||
397 | inc_cpu_load(rq, p->se.load.weight); | ||
398 | } | 396 | } |
399 | 397 | ||
400 | static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int sleep) | 398 | static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int sleep) |
@@ -414,8 +412,6 @@ static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int sleep) | |||
414 | if (rt_rq && rt_rq->rt_nr_running) | 412 | if (rt_rq && rt_rq->rt_nr_running) |
415 | enqueue_rt_entity(rt_se); | 413 | enqueue_rt_entity(rt_se); |
416 | } | 414 | } |
417 | |||
418 | dec_cpu_load(rq, p->se.load.weight); | ||
419 | } | 415 | } |
420 | 416 | ||
421 | /* | 417 | /* |
@@ -1111,9 +1107,11 @@ static void prio_changed_rt(struct rq *rq, struct task_struct *p, | |||
1111 | pull_rt_task(rq); | 1107 | pull_rt_task(rq); |
1112 | /* | 1108 | /* |
1113 | * If there's a higher priority task waiting to run | 1109 | * If there's a higher priority task waiting to run |
1114 | * then reschedule. | 1110 | * then reschedule. Note, the above pull_rt_task |
1111 | * can release the rq lock and p could migrate. | ||
1112 | * Only reschedule if p is still on the same runqueue. | ||
1115 | */ | 1113 | */ |
1116 | if (p->prio > rq->rt.highest_prio) | 1114 | if (p->prio > rq->rt.highest_prio && rq->curr == p) |
1117 | resched_task(p); | 1115 | resched_task(p); |
1118 | #else | 1116 | #else |
1119 | /* For UP simply resched on drop of prio */ | 1117 | /* For UP simply resched on drop of prio */ |
diff --git a/kernel/signal.c b/kernel/signal.c index 84917fe507f7..6af1210092c3 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -1623,7 +1623,6 @@ static void ptrace_stop(int exit_code, int clear_code, siginfo_t *info) | |||
1623 | /* Let the debugger run. */ | 1623 | /* Let the debugger run. */ |
1624 | __set_current_state(TASK_TRACED); | 1624 | __set_current_state(TASK_TRACED); |
1625 | spin_unlock_irq(¤t->sighand->siglock); | 1625 | spin_unlock_irq(¤t->sighand->siglock); |
1626 | try_to_freeze(); | ||
1627 | read_lock(&tasklist_lock); | 1626 | read_lock(&tasklist_lock); |
1628 | if (!unlikely(killed) && may_ptrace_stop()) { | 1627 | if (!unlikely(killed) && may_ptrace_stop()) { |
1629 | do_notify_parent_cldstop(current, CLD_TRAPPED); | 1628 | do_notify_parent_cldstop(current, CLD_TRAPPED); |
@@ -1641,6 +1640,13 @@ static void ptrace_stop(int exit_code, int clear_code, siginfo_t *info) | |||
1641 | } | 1640 | } |
1642 | 1641 | ||
1643 | /* | 1642 | /* |
1643 | * While in TASK_TRACED, we were considered "frozen enough". | ||
1644 | * Now that we woke up, it's crucial if we're supposed to be | ||
1645 | * frozen that we freeze now before running anything substantial. | ||
1646 | */ | ||
1647 | try_to_freeze(); | ||
1648 | |||
1649 | /* | ||
1644 | * We are back. Now reacquire the siglock before touching | 1650 | * We are back. Now reacquire the siglock before touching |
1645 | * last_siginfo, so that we are sure to have synchronized with | 1651 | * last_siginfo, so that we are sure to have synchronized with |
1646 | * any signal-sending on another CPU that wants to examine it. | 1652 | * any signal-sending on another CPU that wants to examine it. |
@@ -1757,9 +1763,15 @@ int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, | |||
1757 | sigset_t *mask = ¤t->blocked; | 1763 | sigset_t *mask = ¤t->blocked; |
1758 | int signr = 0; | 1764 | int signr = 0; |
1759 | 1765 | ||
1766 | relock: | ||
1767 | /* | ||
1768 | * We'll jump back here after any time we were stopped in TASK_STOPPED. | ||
1769 | * While in TASK_STOPPED, we were considered "frozen enough". | ||
1770 | * Now that we woke up, it's crucial if we're supposed to be | ||
1771 | * frozen that we freeze now before running anything substantial. | ||
1772 | */ | ||
1760 | try_to_freeze(); | 1773 | try_to_freeze(); |
1761 | 1774 | ||
1762 | relock: | ||
1763 | spin_lock_irq(¤t->sighand->siglock); | 1775 | spin_lock_irq(¤t->sighand->siglock); |
1764 | for (;;) { | 1776 | for (;;) { |
1765 | struct k_sigaction *ka; | 1777 | struct k_sigaction *ka; |
diff --git a/kernel/softirq.c b/kernel/softirq.c index 5b3aea5f471e..31e9f2a47928 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -313,6 +313,7 @@ void irq_exit(void) | |||
313 | /* Make sure that timer wheel updates are propagated */ | 313 | /* Make sure that timer wheel updates are propagated */ |
314 | if (!in_interrupt() && idle_cpu(smp_processor_id()) && !need_resched()) | 314 | if (!in_interrupt() && idle_cpu(smp_processor_id()) && !need_resched()) |
315 | tick_nohz_stop_sched_tick(); | 315 | tick_nohz_stop_sched_tick(); |
316 | rcu_irq_exit(); | ||
316 | #endif | 317 | #endif |
317 | preempt_enable_no_resched(); | 318 | preempt_enable_no_resched(); |
318 | } | 319 | } |
diff --git a/kernel/softlockup.c b/kernel/softlockup.c index 7c2da88db4ed..01b6522fd92b 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c | |||
@@ -216,26 +216,27 @@ static int watchdog(void *__bind_cpu) | |||
216 | /* initialize timestamp */ | 216 | /* initialize timestamp */ |
217 | touch_softlockup_watchdog(); | 217 | touch_softlockup_watchdog(); |
218 | 218 | ||
219 | set_current_state(TASK_INTERRUPTIBLE); | ||
219 | /* | 220 | /* |
220 | * Run briefly once per second to reset the softlockup timestamp. | 221 | * Run briefly once per second to reset the softlockup timestamp. |
221 | * If this gets delayed for more than 60 seconds then the | 222 | * If this gets delayed for more than 60 seconds then the |
222 | * debug-printout triggers in softlockup_tick(). | 223 | * debug-printout triggers in softlockup_tick(). |
223 | */ | 224 | */ |
224 | while (!kthread_should_stop()) { | 225 | while (!kthread_should_stop()) { |
225 | set_current_state(TASK_INTERRUPTIBLE); | ||
226 | touch_softlockup_watchdog(); | 226 | touch_softlockup_watchdog(); |
227 | schedule(); | 227 | schedule(); |
228 | 228 | ||
229 | if (kthread_should_stop()) | 229 | if (kthread_should_stop()) |
230 | break; | 230 | break; |
231 | 231 | ||
232 | if (this_cpu != check_cpu) | 232 | if (this_cpu == check_cpu) { |
233 | continue; | 233 | if (sysctl_hung_task_timeout_secs) |
234 | 234 | check_hung_uninterruptible_tasks(this_cpu); | |
235 | if (sysctl_hung_task_timeout_secs) | 235 | } |
236 | check_hung_uninterruptible_tasks(this_cpu); | ||
237 | 236 | ||
237 | set_current_state(TASK_INTERRUPTIBLE); | ||
238 | } | 238 | } |
239 | __set_current_state(TASK_RUNNING); | ||
239 | 240 | ||
240 | return 0; | 241 | return 0; |
241 | } | 242 | } |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 8b7e95411795..b2a2d6889bab 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -311,24 +311,6 @@ static struct ctl_table kern_table[] = { | |||
311 | .mode = 0644, | 311 | .mode = 0644, |
312 | .proc_handler = &proc_dointvec, | 312 | .proc_handler = &proc_dointvec, |
313 | }, | 313 | }, |
314 | #if defined(CONFIG_FAIR_GROUP_SCHED) && defined(CONFIG_SMP) | ||
315 | { | ||
316 | .ctl_name = CTL_UNNUMBERED, | ||
317 | .procname = "sched_min_bal_int_shares", | ||
318 | .data = &sysctl_sched_min_bal_int_shares, | ||
319 | .maxlen = sizeof(unsigned int), | ||
320 | .mode = 0644, | ||
321 | .proc_handler = &proc_dointvec, | ||
322 | }, | ||
323 | { | ||
324 | .ctl_name = CTL_UNNUMBERED, | ||
325 | .procname = "sched_max_bal_int_shares", | ||
326 | .data = &sysctl_sched_max_bal_int_shares, | ||
327 | .maxlen = sizeof(unsigned int), | ||
328 | .mode = 0644, | ||
329 | .proc_handler = &proc_dointvec, | ||
330 | }, | ||
331 | #endif | ||
332 | #endif | 314 | #endif |
333 | { | 315 | { |
334 | .ctl_name = CTL_UNNUMBERED, | 316 | .ctl_name = CTL_UNNUMBERED, |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index c88b5910e7ab..5fd9b9469770 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -42,12 +42,13 @@ long time_esterror = NTP_PHASE_LIMIT; /* estimated error (us) */ | |||
42 | long time_freq; /* frequency offset (scaled ppm)*/ | 42 | long time_freq; /* frequency offset (scaled ppm)*/ |
43 | static long time_reftime; /* time at last adjustment (s) */ | 43 | static long time_reftime; /* time at last adjustment (s) */ |
44 | long time_adjust; | 44 | long time_adjust; |
45 | static long ntp_tick_adj; | ||
45 | 46 | ||
46 | static void ntp_update_frequency(void) | 47 | static void ntp_update_frequency(void) |
47 | { | 48 | { |
48 | u64 second_length = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ) | 49 | u64 second_length = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ) |
49 | << TICK_LENGTH_SHIFT; | 50 | << TICK_LENGTH_SHIFT; |
50 | second_length += (s64)CLOCK_TICK_ADJUST << TICK_LENGTH_SHIFT; | 51 | second_length += (s64)ntp_tick_adj << TICK_LENGTH_SHIFT; |
51 | second_length += (s64)time_freq << (TICK_LENGTH_SHIFT - SHIFT_NSEC); | 52 | second_length += (s64)time_freq << (TICK_LENGTH_SHIFT - SHIFT_NSEC); |
52 | 53 | ||
53 | tick_length_base = second_length; | 54 | tick_length_base = second_length; |
@@ -342,14 +343,16 @@ int do_adjtimex(struct timex *txc) | |||
342 | freq_adj = shift_right(freq_adj, time_constant * 2 + | 343 | freq_adj = shift_right(freq_adj, time_constant * 2 + |
343 | (SHIFT_PLL + 2) * 2 - SHIFT_NSEC); | 344 | (SHIFT_PLL + 2) * 2 - SHIFT_NSEC); |
344 | if (mtemp >= MINSEC && (time_status & STA_FLL || mtemp > MAXSEC)) { | 345 | if (mtemp >= MINSEC && (time_status & STA_FLL || mtemp > MAXSEC)) { |
346 | u64 utemp64; | ||
345 | temp64 = time_offset << (SHIFT_NSEC - SHIFT_FLL); | 347 | temp64 = time_offset << (SHIFT_NSEC - SHIFT_FLL); |
346 | if (time_offset < 0) { | 348 | if (time_offset < 0) { |
347 | temp64 = -temp64; | 349 | utemp64 = -temp64; |
348 | do_div(temp64, mtemp); | 350 | do_div(utemp64, mtemp); |
349 | freq_adj -= temp64; | 351 | freq_adj -= utemp64; |
350 | } else { | 352 | } else { |
351 | do_div(temp64, mtemp); | 353 | utemp64 = temp64; |
352 | freq_adj += temp64; | 354 | do_div(utemp64, mtemp); |
355 | freq_adj += utemp64; | ||
353 | } | 356 | } |
354 | } | 357 | } |
355 | freq_adj += time_freq; | 358 | freq_adj += time_freq; |
@@ -400,3 +403,11 @@ leave: if ((time_status & (STA_UNSYNC|STA_CLOCKERR)) != 0) | |||
400 | notify_cmos_timer(); | 403 | notify_cmos_timer(); |
401 | return(result); | 404 | return(result); |
402 | } | 405 | } |
406 | |||
407 | static int __init ntp_tick_adj_setup(char *str) | ||
408 | { | ||
409 | ntp_tick_adj = simple_strtol(str, NULL, 0); | ||
410 | return 1; | ||
411 | } | ||
412 | |||
413 | __setup("ntp_tick_adj=", ntp_tick_adj_setup); | ||
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index fa9bb73dbdb4..686da821d376 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -282,6 +282,7 @@ void tick_nohz_stop_sched_tick(void) | |||
282 | ts->idle_tick = ts->sched_timer.expires; | 282 | ts->idle_tick = ts->sched_timer.expires; |
283 | ts->tick_stopped = 1; | 283 | ts->tick_stopped = 1; |
284 | ts->idle_jiffies = last_jiffies; | 284 | ts->idle_jiffies = last_jiffies; |
285 | rcu_enter_nohz(); | ||
285 | } | 286 | } |
286 | 287 | ||
287 | /* | 288 | /* |
@@ -375,6 +376,8 @@ void tick_nohz_restart_sched_tick(void) | |||
375 | return; | 376 | return; |
376 | } | 377 | } |
377 | 378 | ||
379 | rcu_exit_nohz(); | ||
380 | |||
378 | /* Update jiffies first */ | 381 | /* Update jiffies first */ |
379 | select_nohz_load_balancer(0); | 382 | select_nohz_load_balancer(0); |
380 | now = ktime_get(); | 383 | now = ktime_get(); |
@@ -637,7 +640,7 @@ void tick_cancel_sched_timer(int cpu) | |||
637 | 640 | ||
638 | if (ts->sched_timer.base) | 641 | if (ts->sched_timer.base) |
639 | hrtimer_cancel(&ts->sched_timer); | 642 | hrtimer_cancel(&ts->sched_timer); |
640 | ts->tick_stopped = 0; | 643 | |
641 | ts->nohz_mode = NOHZ_MODE_INACTIVE; | 644 | ts->nohz_mode = NOHZ_MODE_INACTIVE; |
642 | } | 645 | } |
643 | #endif /* HIGH_RES_TIMERS */ | 646 | #endif /* HIGH_RES_TIMERS */ |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 1af9fb050fe2..671af612b768 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -187,8 +187,7 @@ static void change_clocksource(void) | |||
187 | 187 | ||
188 | clock->error = 0; | 188 | clock->error = 0; |
189 | clock->xtime_nsec = 0; | 189 | clock->xtime_nsec = 0; |
190 | clocksource_calculate_interval(clock, | 190 | clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH); |
191 | (unsigned long)(current_tick_length()>>TICK_LENGTH_SHIFT)); | ||
192 | 191 | ||
193 | tick_clock_notify(); | 192 | tick_clock_notify(); |
194 | 193 | ||
@@ -245,8 +244,7 @@ void __init timekeeping_init(void) | |||
245 | ntp_clear(); | 244 | ntp_clear(); |
246 | 245 | ||
247 | clock = clocksource_get_next(); | 246 | clock = clocksource_get_next(); |
248 | clocksource_calculate_interval(clock, | 247 | clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH); |
249 | (unsigned long)(current_tick_length()>>TICK_LENGTH_SHIFT)); | ||
250 | clock->cycle_last = clocksource_read(clock); | 248 | clock->cycle_last = clocksource_read(clock); |
251 | 249 | ||
252 | xtime.tv_sec = sec; | 250 | xtime.tv_sec = sec; |
diff --git a/lib/devres.c b/lib/devres.c index b1d336ce7f3d..edc27a5d1b73 100644 --- a/lib/devres.c +++ b/lib/devres.c | |||
@@ -298,6 +298,31 @@ int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name) | |||
298 | EXPORT_SYMBOL(pcim_iomap_regions); | 298 | EXPORT_SYMBOL(pcim_iomap_regions); |
299 | 299 | ||
300 | /** | 300 | /** |
301 | * pcim_iomap_regions_request_all - Request all BARs and iomap specified ones | ||
302 | * @pdev: PCI device to map IO resources for | ||
303 | * @mask: Mask of BARs to iomap | ||
304 | * @name: Name used when requesting regions | ||
305 | * | ||
306 | * Request all PCI BARs and iomap regions specified by @mask. | ||
307 | */ | ||
308 | int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask, | ||
309 | const char *name) | ||
310 | { | ||
311 | int request_mask = ((1 << 6) - 1) & ~mask; | ||
312 | int rc; | ||
313 | |||
314 | rc = pci_request_selected_regions(pdev, request_mask, name); | ||
315 | if (rc) | ||
316 | return rc; | ||
317 | |||
318 | rc = pcim_iomap_regions(pdev, mask, name); | ||
319 | if (rc) | ||
320 | pci_release_selected_regions(pdev, request_mask); | ||
321 | return rc; | ||
322 | } | ||
323 | EXPORT_SYMBOL(pcim_iomap_regions_request_all); | ||
324 | |||
325 | /** | ||
301 | * pcim_iounmap_regions - Unmap and release PCI BARs | 326 | * pcim_iounmap_regions - Unmap and release PCI BARs |
302 | * @pdev: PCI device to map IO resources for | 327 | * @pdev: PCI device to map IO resources for |
303 | * @mask: Mask of BARs to unmap and release | 328 | * @mask: Mask of BARs to unmap and release |
diff --git a/lib/iommu-helper.c b/lib/iommu-helper.c index 495575a59ca6..a3b8d4c3f77a 100644 --- a/lib/iommu-helper.c +++ b/lib/iommu-helper.c | |||
@@ -40,10 +40,12 @@ static inline void set_bit_area(unsigned long *map, unsigned long i, | |||
40 | } | 40 | } |
41 | } | 41 | } |
42 | 42 | ||
43 | static inline int is_span_boundary(unsigned int index, unsigned int nr, | 43 | int iommu_is_span_boundary(unsigned int index, unsigned int nr, |
44 | unsigned long shift, | 44 | unsigned long shift, |
45 | unsigned long boundary_size) | 45 | unsigned long boundary_size) |
46 | { | 46 | { |
47 | BUG_ON(!is_power_of_2(boundary_size)); | ||
48 | |||
47 | shift = (shift + index) & (boundary_size - 1); | 49 | shift = (shift + index) & (boundary_size - 1); |
48 | return shift + nr > boundary_size; | 50 | return shift + nr > boundary_size; |
49 | } | 51 | } |
@@ -57,7 +59,7 @@ unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, | |||
57 | again: | 59 | again: |
58 | index = find_next_zero_area(map, size, start, nr, align_mask); | 60 | index = find_next_zero_area(map, size, start, nr, align_mask); |
59 | if (index != -1) { | 61 | if (index != -1) { |
60 | if (is_span_boundary(index, nr, shift, boundary_size)) { | 62 | if (iommu_is_span_boundary(index, nr, shift, boundary_size)) { |
61 | /* we could do more effectively */ | 63 | /* we could do more effectively */ |
62 | start = index + 1; | 64 | start = index + 1; |
63 | goto again; | 65 | goto again; |
diff --git a/lib/kobject.c b/lib/kobject.c index d784daeb8571..0d03252f87a8 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
@@ -153,6 +153,10 @@ static void kobject_init_internal(struct kobject *kobj) | |||
153 | return; | 153 | return; |
154 | kref_init(&kobj->kref); | 154 | kref_init(&kobj->kref); |
155 | INIT_LIST_HEAD(&kobj->entry); | 155 | INIT_LIST_HEAD(&kobj->entry); |
156 | kobj->state_in_sysfs = 0; | ||
157 | kobj->state_add_uevent_sent = 0; | ||
158 | kobj->state_remove_uevent_sent = 0; | ||
159 | kobj->state_initialized = 1; | ||
156 | } | 160 | } |
157 | 161 | ||
158 | 162 | ||
@@ -289,13 +293,8 @@ void kobject_init(struct kobject *kobj, struct kobj_type *ktype) | |||
289 | dump_stack(); | 293 | dump_stack(); |
290 | } | 294 | } |
291 | 295 | ||
292 | kref_init(&kobj->kref); | 296 | kobject_init_internal(kobj); |
293 | INIT_LIST_HEAD(&kobj->entry); | ||
294 | kobj->ktype = ktype; | 297 | kobj->ktype = ktype; |
295 | kobj->state_in_sysfs = 0; | ||
296 | kobj->state_add_uevent_sent = 0; | ||
297 | kobj->state_remove_uevent_sent = 0; | ||
298 | kobj->state_initialized = 1; | ||
299 | return; | 298 | return; |
300 | 299 | ||
301 | error: | 300 | error: |
diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 4bb5a11e18a2..025922807e6e 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c | |||
@@ -310,7 +310,9 @@ map_single(struct device *hwdev, char *buffer, size_t size, int dir) | |||
310 | start_dma_addr = virt_to_bus(io_tlb_start) & mask; | 310 | start_dma_addr = virt_to_bus(io_tlb_start) & mask; |
311 | 311 | ||
312 | offset_slots = ALIGN(start_dma_addr, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT; | 312 | offset_slots = ALIGN(start_dma_addr, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT; |
313 | max_slots = ALIGN(mask + 1, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT; | 313 | max_slots = mask + 1 |
314 | ? ALIGN(mask + 1, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT | ||
315 | : 1UL << (BITS_PER_LONG - IO_TLB_SHIFT); | ||
314 | 316 | ||
315 | /* | 317 | /* |
316 | * For mappings greater than a page, we limit the stride (and | 318 | * For mappings greater than a page, we limit the stride (and |
@@ -333,16 +335,18 @@ map_single(struct device *hwdev, char *buffer, size_t size, int dir) | |||
333 | index = ALIGN(io_tlb_index, stride); | 335 | index = ALIGN(io_tlb_index, stride); |
334 | if (index >= io_tlb_nslabs) | 336 | if (index >= io_tlb_nslabs) |
335 | index = 0; | 337 | index = 0; |
336 | |||
337 | while (is_span_boundary(index, nslots, offset_slots, | ||
338 | max_slots)) { | ||
339 | index += stride; | ||
340 | if (index >= io_tlb_nslabs) | ||
341 | index = 0; | ||
342 | } | ||
343 | wrap = index; | 338 | wrap = index; |
344 | 339 | ||
345 | do { | 340 | do { |
341 | while (is_span_boundary(index, nslots, offset_slots, | ||
342 | max_slots)) { | ||
343 | index += stride; | ||
344 | if (index >= io_tlb_nslabs) | ||
345 | index = 0; | ||
346 | if (index == wrap) | ||
347 | goto not_found; | ||
348 | } | ||
349 | |||
346 | /* | 350 | /* |
347 | * If we find a slot that indicates we have 'nslots' | 351 | * If we find a slot that indicates we have 'nslots' |
348 | * number of contiguous buffers, we allocate the | 352 | * number of contiguous buffers, we allocate the |
@@ -367,14 +371,12 @@ map_single(struct device *hwdev, char *buffer, size_t size, int dir) | |||
367 | 371 | ||
368 | goto found; | 372 | goto found; |
369 | } | 373 | } |
370 | do { | 374 | index += stride; |
371 | index += stride; | 375 | if (index >= io_tlb_nslabs) |
372 | if (index >= io_tlb_nslabs) | 376 | index = 0; |
373 | index = 0; | ||
374 | } while (is_span_boundary(index, nslots, offset_slots, | ||
375 | max_slots)); | ||
376 | } while (index != wrap); | 377 | } while (index != wrap); |
377 | 378 | ||
379 | not_found: | ||
378 | spin_unlock_irqrestore(&io_tlb_lock, flags); | 380 | spin_unlock_irqrestore(&io_tlb_lock, flags); |
379 | return NULL; | 381 | return NULL; |
380 | } | 382 | } |
diff --git a/mm/Makefile b/mm/Makefile index 9f117bab5322..a5b0dd93427a 100644 --- a/mm/Makefile +++ b/mm/Makefile | |||
@@ -32,5 +32,5 @@ obj-$(CONFIG_FS_XIP) += filemap_xip.o | |||
32 | obj-$(CONFIG_MIGRATION) += migrate.o | 32 | obj-$(CONFIG_MIGRATION) += migrate.o |
33 | obj-$(CONFIG_SMP) += allocpercpu.o | 33 | obj-$(CONFIG_SMP) += allocpercpu.o |
34 | obj-$(CONFIG_QUICKLIST) += quicklist.o | 34 | obj-$(CONFIG_QUICKLIST) += quicklist.o |
35 | obj-$(CONFIG_CGROUP_MEM_CONT) += memcontrol.o | 35 | obj-$(CONFIG_CGROUP_MEM_RES_CTLR) += memcontrol.o |
36 | 36 | ||
diff --git a/mm/allocpercpu.c b/mm/allocpercpu.c index 7e58322b7134..b0012e27fea8 100644 --- a/mm/allocpercpu.c +++ b/mm/allocpercpu.c | |||
@@ -6,6 +6,10 @@ | |||
6 | #include <linux/mm.h> | 6 | #include <linux/mm.h> |
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
8 | 8 | ||
9 | #ifndef cache_line_size | ||
10 | #define cache_line_size() L1_CACHE_BYTES | ||
11 | #endif | ||
12 | |||
9 | /** | 13 | /** |
10 | * percpu_depopulate - depopulate per-cpu data for given cpu | 14 | * percpu_depopulate - depopulate per-cpu data for given cpu |
11 | * @__pdata: per-cpu data to depopulate | 15 | * @__pdata: per-cpu data to depopulate |
@@ -52,6 +56,11 @@ void *percpu_populate(void *__pdata, size_t size, gfp_t gfp, int cpu) | |||
52 | struct percpu_data *pdata = __percpu_disguise(__pdata); | 56 | struct percpu_data *pdata = __percpu_disguise(__pdata); |
53 | int node = cpu_to_node(cpu); | 57 | int node = cpu_to_node(cpu); |
54 | 58 | ||
59 | /* | ||
60 | * We should make sure each CPU gets private memory. | ||
61 | */ | ||
62 | size = roundup(size, cache_line_size()); | ||
63 | |||
55 | BUG_ON(pdata->ptrs[cpu]); | 64 | BUG_ON(pdata->ptrs[cpu]); |
56 | if (node_online(node)) | 65 | if (node_online(node)) |
57 | pdata->ptrs[cpu] = kmalloc_node(size, gfp|__GFP_ZERO, node); | 66 | pdata->ptrs[cpu] = kmalloc_node(size, gfp|__GFP_ZERO, node); |
@@ -98,7 +107,11 @@ EXPORT_SYMBOL_GPL(__percpu_populate_mask); | |||
98 | */ | 107 | */ |
99 | void *__percpu_alloc_mask(size_t size, gfp_t gfp, cpumask_t *mask) | 108 | void *__percpu_alloc_mask(size_t size, gfp_t gfp, cpumask_t *mask) |
100 | { | 109 | { |
101 | void *pdata = kzalloc(nr_cpu_ids * sizeof(void *), gfp); | 110 | /* |
111 | * We allocate whole cache lines to avoid false sharing | ||
112 | */ | ||
113 | size_t sz = roundup(nr_cpu_ids * sizeof(void *), cache_line_size()); | ||
114 | void *pdata = kzalloc(sz, gfp); | ||
102 | void *__pdata = __percpu_disguise(pdata); | 115 | void *__pdata = __percpu_disguise(pdata); |
103 | 116 | ||
104 | if (unlikely(!pdata)) | 117 | if (unlikely(!pdata)) |
diff --git a/mm/filemap.c b/mm/filemap.c index 5c74b68935ac..df343d1e6345 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -28,7 +28,6 @@ | |||
28 | #include <linux/backing-dev.h> | 28 | #include <linux/backing-dev.h> |
29 | #include <linux/pagevec.h> | 29 | #include <linux/pagevec.h> |
30 | #include <linux/blkdev.h> | 30 | #include <linux/blkdev.h> |
31 | #include <linux/backing-dev.h> | ||
32 | #include <linux/security.h> | 31 | #include <linux/security.h> |
33 | #include <linux/syscalls.h> | 32 | #include <linux/syscalls.h> |
34 | #include <linux/cpuset.h> | 33 | #include <linux/cpuset.h> |
@@ -1743,21 +1742,27 @@ size_t iov_iter_copy_from_user(struct page *page, | |||
1743 | } | 1742 | } |
1744 | EXPORT_SYMBOL(iov_iter_copy_from_user); | 1743 | EXPORT_SYMBOL(iov_iter_copy_from_user); |
1745 | 1744 | ||
1746 | static void __iov_iter_advance_iov(struct iov_iter *i, size_t bytes) | 1745 | void iov_iter_advance(struct iov_iter *i, size_t bytes) |
1747 | { | 1746 | { |
1747 | BUG_ON(i->count < bytes); | ||
1748 | |||
1748 | if (likely(i->nr_segs == 1)) { | 1749 | if (likely(i->nr_segs == 1)) { |
1749 | i->iov_offset += bytes; | 1750 | i->iov_offset += bytes; |
1751 | i->count -= bytes; | ||
1750 | } else { | 1752 | } else { |
1751 | const struct iovec *iov = i->iov; | 1753 | const struct iovec *iov = i->iov; |
1752 | size_t base = i->iov_offset; | 1754 | size_t base = i->iov_offset; |
1753 | 1755 | ||
1754 | /* | 1756 | /* |
1755 | * The !iov->iov_len check ensures we skip over unlikely | 1757 | * The !iov->iov_len check ensures we skip over unlikely |
1756 | * zero-length segments. | 1758 | * zero-length segments (without overruning the iovec). |
1757 | */ | 1759 | */ |
1758 | while (bytes || !iov->iov_len) { | 1760 | while (bytes || unlikely(!iov->iov_len && i->count)) { |
1759 | int copy = min(bytes, iov->iov_len - base); | 1761 | int copy; |
1760 | 1762 | ||
1763 | copy = min(bytes, iov->iov_len - base); | ||
1764 | BUG_ON(!i->count || i->count < copy); | ||
1765 | i->count -= copy; | ||
1761 | bytes -= copy; | 1766 | bytes -= copy; |
1762 | base += copy; | 1767 | base += copy; |
1763 | if (iov->iov_len == base) { | 1768 | if (iov->iov_len == base) { |
@@ -1769,14 +1774,6 @@ static void __iov_iter_advance_iov(struct iov_iter *i, size_t bytes) | |||
1769 | i->iov_offset = base; | 1774 | i->iov_offset = base; |
1770 | } | 1775 | } |
1771 | } | 1776 | } |
1772 | |||
1773 | void iov_iter_advance(struct iov_iter *i, size_t bytes) | ||
1774 | { | ||
1775 | BUG_ON(i->count < bytes); | ||
1776 | |||
1777 | __iov_iter_advance_iov(i, bytes); | ||
1778 | i->count -= bytes; | ||
1779 | } | ||
1780 | EXPORT_SYMBOL(iov_iter_advance); | 1777 | EXPORT_SYMBOL(iov_iter_advance); |
1781 | 1778 | ||
1782 | /* | 1779 | /* |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 89e6286a7f57..74c1b6b0b37b 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -71,7 +71,25 @@ static void enqueue_huge_page(struct page *page) | |||
71 | free_huge_pages_node[nid]++; | 71 | free_huge_pages_node[nid]++; |
72 | } | 72 | } |
73 | 73 | ||
74 | static struct page *dequeue_huge_page(struct vm_area_struct *vma, | 74 | static struct page *dequeue_huge_page(void) |
75 | { | ||
76 | int nid; | ||
77 | struct page *page = NULL; | ||
78 | |||
79 | for (nid = 0; nid < MAX_NUMNODES; ++nid) { | ||
80 | if (!list_empty(&hugepage_freelists[nid])) { | ||
81 | page = list_entry(hugepage_freelists[nid].next, | ||
82 | struct page, lru); | ||
83 | list_del(&page->lru); | ||
84 | free_huge_pages--; | ||
85 | free_huge_pages_node[nid]--; | ||
86 | break; | ||
87 | } | ||
88 | } | ||
89 | return page; | ||
90 | } | ||
91 | |||
92 | static struct page *dequeue_huge_page_vma(struct vm_area_struct *vma, | ||
75 | unsigned long address) | 93 | unsigned long address) |
76 | { | 94 | { |
77 | int nid; | 95 | int nid; |
@@ -268,6 +286,12 @@ static struct page *alloc_buddy_huge_page(struct vm_area_struct *vma, | |||
268 | 286 | ||
269 | spin_lock(&hugetlb_lock); | 287 | spin_lock(&hugetlb_lock); |
270 | if (page) { | 288 | if (page) { |
289 | /* | ||
290 | * This page is now managed by the hugetlb allocator and has | ||
291 | * no users -- drop the buddy allocator's reference. | ||
292 | */ | ||
293 | put_page_testzero(page); | ||
294 | VM_BUG_ON(page_count(page)); | ||
271 | nid = page_to_nid(page); | 295 | nid = page_to_nid(page); |
272 | set_compound_page_dtor(page, free_huge_page); | 296 | set_compound_page_dtor(page, free_huge_page); |
273 | /* | 297 | /* |
@@ -296,8 +320,10 @@ static int gather_surplus_pages(int delta) | |||
296 | int needed, allocated; | 320 | int needed, allocated; |
297 | 321 | ||
298 | needed = (resv_huge_pages + delta) - free_huge_pages; | 322 | needed = (resv_huge_pages + delta) - free_huge_pages; |
299 | if (needed <= 0) | 323 | if (needed <= 0) { |
324 | resv_huge_pages += delta; | ||
300 | return 0; | 325 | return 0; |
326 | } | ||
301 | 327 | ||
302 | allocated = 0; | 328 | allocated = 0; |
303 | INIT_LIST_HEAD(&surplus_list); | 329 | INIT_LIST_HEAD(&surplus_list); |
@@ -335,9 +361,12 @@ retry: | |||
335 | * The surplus_list now contains _at_least_ the number of extra pages | 361 | * The surplus_list now contains _at_least_ the number of extra pages |
336 | * needed to accomodate the reservation. Add the appropriate number | 362 | * needed to accomodate the reservation. Add the appropriate number |
337 | * of pages to the hugetlb pool and free the extras back to the buddy | 363 | * of pages to the hugetlb pool and free the extras back to the buddy |
338 | * allocator. | 364 | * allocator. Commit the entire reservation here to prevent another |
365 | * process from stealing the pages as they are added to the pool but | ||
366 | * before they are reserved. | ||
339 | */ | 367 | */ |
340 | needed += allocated; | 368 | needed += allocated; |
369 | resv_huge_pages += delta; | ||
341 | ret = 0; | 370 | ret = 0; |
342 | free: | 371 | free: |
343 | list_for_each_entry_safe(page, tmp, &surplus_list, lru) { | 372 | list_for_each_entry_safe(page, tmp, &surplus_list, lru) { |
@@ -346,13 +375,14 @@ free: | |||
346 | enqueue_huge_page(page); | 375 | enqueue_huge_page(page); |
347 | else { | 376 | else { |
348 | /* | 377 | /* |
349 | * Decrement the refcount and free the page using its | 378 | * The page has a reference count of zero already, so |
350 | * destructor. This must be done with hugetlb_lock | 379 | * call free_huge_page directly instead of using |
380 | * put_page. This must be done with hugetlb_lock | ||
351 | * unlocked which is safe because free_huge_page takes | 381 | * unlocked which is safe because free_huge_page takes |
352 | * hugetlb_lock before deciding how to free the page. | 382 | * hugetlb_lock before deciding how to free the page. |
353 | */ | 383 | */ |
354 | spin_unlock(&hugetlb_lock); | 384 | spin_unlock(&hugetlb_lock); |
355 | put_page(page); | 385 | free_huge_page(page); |
356 | spin_lock(&hugetlb_lock); | 386 | spin_lock(&hugetlb_lock); |
357 | } | 387 | } |
358 | } | 388 | } |
@@ -371,6 +401,9 @@ static void return_unused_surplus_pages(unsigned long unused_resv_pages) | |||
371 | struct page *page; | 401 | struct page *page; |
372 | unsigned long nr_pages; | 402 | unsigned long nr_pages; |
373 | 403 | ||
404 | /* Uncommit the reservation */ | ||
405 | resv_huge_pages -= unused_resv_pages; | ||
406 | |||
374 | nr_pages = min(unused_resv_pages, surplus_huge_pages); | 407 | nr_pages = min(unused_resv_pages, surplus_huge_pages); |
375 | 408 | ||
376 | while (nr_pages) { | 409 | while (nr_pages) { |
@@ -402,7 +435,7 @@ static struct page *alloc_huge_page_shared(struct vm_area_struct *vma, | |||
402 | struct page *page; | 435 | struct page *page; |
403 | 436 | ||
404 | spin_lock(&hugetlb_lock); | 437 | spin_lock(&hugetlb_lock); |
405 | page = dequeue_huge_page(vma, addr); | 438 | page = dequeue_huge_page_vma(vma, addr); |
406 | spin_unlock(&hugetlb_lock); | 439 | spin_unlock(&hugetlb_lock); |
407 | return page ? page : ERR_PTR(-VM_FAULT_OOM); | 440 | return page ? page : ERR_PTR(-VM_FAULT_OOM); |
408 | } | 441 | } |
@@ -417,7 +450,7 @@ static struct page *alloc_huge_page_private(struct vm_area_struct *vma, | |||
417 | 450 | ||
418 | spin_lock(&hugetlb_lock); | 451 | spin_lock(&hugetlb_lock); |
419 | if (free_huge_pages > resv_huge_pages) | 452 | if (free_huge_pages > resv_huge_pages) |
420 | page = dequeue_huge_page(vma, addr); | 453 | page = dequeue_huge_page_vma(vma, addr); |
421 | spin_unlock(&hugetlb_lock); | 454 | spin_unlock(&hugetlb_lock); |
422 | if (!page) { | 455 | if (!page) { |
423 | page = alloc_buddy_huge_page(vma, addr); | 456 | page = alloc_buddy_huge_page(vma, addr); |
@@ -570,7 +603,7 @@ static unsigned long set_max_huge_pages(unsigned long count) | |||
570 | min_count = max(count, min_count); | 603 | min_count = max(count, min_count); |
571 | try_to_free_low(min_count); | 604 | try_to_free_low(min_count); |
572 | while (min_count < persistent_huge_pages) { | 605 | while (min_count < persistent_huge_pages) { |
573 | struct page *page = dequeue_huge_page(NULL, 0); | 606 | struct page *page = dequeue_huge_page(); |
574 | if (!page) | 607 | if (!page) |
575 | break; | 608 | break; |
576 | update_and_free_page(page); | 609 | update_and_free_page(page); |
@@ -1205,12 +1238,13 @@ static int hugetlb_acct_memory(long delta) | |||
1205 | if (gather_surplus_pages(delta) < 0) | 1238 | if (gather_surplus_pages(delta) < 0) |
1206 | goto out; | 1239 | goto out; |
1207 | 1240 | ||
1208 | if (delta > cpuset_mems_nr(free_huge_pages_node)) | 1241 | if (delta > cpuset_mems_nr(free_huge_pages_node)) { |
1242 | return_unused_surplus_pages(delta); | ||
1209 | goto out; | 1243 | goto out; |
1244 | } | ||
1210 | } | 1245 | } |
1211 | 1246 | ||
1212 | ret = 0; | 1247 | ret = 0; |
1213 | resv_huge_pages += delta; | ||
1214 | if (delta < 0) | 1248 | if (delta < 0) |
1215 | return_unused_surplus_pages((unsigned long) -delta); | 1249 | return_unused_surplus_pages((unsigned long) -delta); |
1216 | 1250 | ||
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 631002d085d1..8b9f6cae938e 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -137,14 +137,21 @@ struct mem_cgroup { | |||
137 | */ | 137 | */ |
138 | struct mem_cgroup_stat stat; | 138 | struct mem_cgroup_stat stat; |
139 | }; | 139 | }; |
140 | static struct mem_cgroup init_mem_cgroup; | ||
140 | 141 | ||
141 | /* | 142 | /* |
142 | * We use the lower bit of the page->page_cgroup pointer as a bit spin | 143 | * We use the lower bit of the page->page_cgroup pointer as a bit spin |
143 | * lock. We need to ensure that page->page_cgroup is atleast two | 144 | * lock. We need to ensure that page->page_cgroup is at least two |
144 | * byte aligned (based on comments from Nick Piggin) | 145 | * byte aligned (based on comments from Nick Piggin). But since |
146 | * bit_spin_lock doesn't actually set that lock bit in a non-debug | ||
147 | * uniprocessor kernel, we should avoid setting it here too. | ||
145 | */ | 148 | */ |
146 | #define PAGE_CGROUP_LOCK_BIT 0x0 | 149 | #define PAGE_CGROUP_LOCK_BIT 0x0 |
147 | #define PAGE_CGROUP_LOCK (1 << PAGE_CGROUP_LOCK_BIT) | 150 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) |
151 | #define PAGE_CGROUP_LOCK (1 << PAGE_CGROUP_LOCK_BIT) | ||
152 | #else | ||
153 | #define PAGE_CGROUP_LOCK 0x0 | ||
154 | #endif | ||
148 | 155 | ||
149 | /* | 156 | /* |
150 | * A page_cgroup page is associated with every page descriptor. The | 157 | * A page_cgroup page is associated with every page descriptor. The |
@@ -154,37 +161,27 @@ struct page_cgroup { | |||
154 | struct list_head lru; /* per cgroup LRU list */ | 161 | struct list_head lru; /* per cgroup LRU list */ |
155 | struct page *page; | 162 | struct page *page; |
156 | struct mem_cgroup *mem_cgroup; | 163 | struct mem_cgroup *mem_cgroup; |
157 | atomic_t ref_cnt; /* Helpful when pages move b/w */ | 164 | int ref_cnt; /* cached, mapped, migrating */ |
158 | /* mapped and cached states */ | 165 | int flags; |
159 | int flags; | ||
160 | }; | 166 | }; |
161 | #define PAGE_CGROUP_FLAG_CACHE (0x1) /* charged as cache */ | 167 | #define PAGE_CGROUP_FLAG_CACHE (0x1) /* charged as cache */ |
162 | #define PAGE_CGROUP_FLAG_ACTIVE (0x2) /* page is active in this cgroup */ | 168 | #define PAGE_CGROUP_FLAG_ACTIVE (0x2) /* page is active in this cgroup */ |
163 | 169 | ||
164 | static inline int page_cgroup_nid(struct page_cgroup *pc) | 170 | static int page_cgroup_nid(struct page_cgroup *pc) |
165 | { | 171 | { |
166 | return page_to_nid(pc->page); | 172 | return page_to_nid(pc->page); |
167 | } | 173 | } |
168 | 174 | ||
169 | static inline enum zone_type page_cgroup_zid(struct page_cgroup *pc) | 175 | static enum zone_type page_cgroup_zid(struct page_cgroup *pc) |
170 | { | 176 | { |
171 | return page_zonenum(pc->page); | 177 | return page_zonenum(pc->page); |
172 | } | 178 | } |
173 | 179 | ||
174 | enum { | ||
175 | MEM_CGROUP_TYPE_UNSPEC = 0, | ||
176 | MEM_CGROUP_TYPE_MAPPED, | ||
177 | MEM_CGROUP_TYPE_CACHED, | ||
178 | MEM_CGROUP_TYPE_ALL, | ||
179 | MEM_CGROUP_TYPE_MAX, | ||
180 | }; | ||
181 | |||
182 | enum charge_type { | 180 | enum charge_type { |
183 | MEM_CGROUP_CHARGE_TYPE_CACHE = 0, | 181 | MEM_CGROUP_CHARGE_TYPE_CACHE = 0, |
184 | MEM_CGROUP_CHARGE_TYPE_MAPPED, | 182 | MEM_CGROUP_CHARGE_TYPE_MAPPED, |
185 | }; | 183 | }; |
186 | 184 | ||
187 | |||
188 | /* | 185 | /* |
189 | * Always modified under lru lock. Then, not necessary to preempt_disable() | 186 | * Always modified under lru lock. Then, not necessary to preempt_disable() |
190 | */ | 187 | */ |
@@ -193,23 +190,21 @@ static void mem_cgroup_charge_statistics(struct mem_cgroup *mem, int flags, | |||
193 | { | 190 | { |
194 | int val = (charge)? 1 : -1; | 191 | int val = (charge)? 1 : -1; |
195 | struct mem_cgroup_stat *stat = &mem->stat; | 192 | struct mem_cgroup_stat *stat = &mem->stat; |
196 | VM_BUG_ON(!irqs_disabled()); | ||
197 | 193 | ||
194 | VM_BUG_ON(!irqs_disabled()); | ||
198 | if (flags & PAGE_CGROUP_FLAG_CACHE) | 195 | if (flags & PAGE_CGROUP_FLAG_CACHE) |
199 | __mem_cgroup_stat_add_safe(stat, | 196 | __mem_cgroup_stat_add_safe(stat, MEM_CGROUP_STAT_CACHE, val); |
200 | MEM_CGROUP_STAT_CACHE, val); | ||
201 | else | 197 | else |
202 | __mem_cgroup_stat_add_safe(stat, MEM_CGROUP_STAT_RSS, val); | 198 | __mem_cgroup_stat_add_safe(stat, MEM_CGROUP_STAT_RSS, val); |
203 | } | 199 | } |
204 | 200 | ||
205 | static inline struct mem_cgroup_per_zone * | 201 | static struct mem_cgroup_per_zone * |
206 | mem_cgroup_zoneinfo(struct mem_cgroup *mem, int nid, int zid) | 202 | mem_cgroup_zoneinfo(struct mem_cgroup *mem, int nid, int zid) |
207 | { | 203 | { |
208 | BUG_ON(!mem->info.nodeinfo[nid]); | ||
209 | return &mem->info.nodeinfo[nid]->zoneinfo[zid]; | 204 | return &mem->info.nodeinfo[nid]->zoneinfo[zid]; |
210 | } | 205 | } |
211 | 206 | ||
212 | static inline struct mem_cgroup_per_zone * | 207 | static struct mem_cgroup_per_zone * |
213 | page_cgroup_zoneinfo(struct page_cgroup *pc) | 208 | page_cgroup_zoneinfo(struct page_cgroup *pc) |
214 | { | 209 | { |
215 | struct mem_cgroup *mem = pc->mem_cgroup; | 210 | struct mem_cgroup *mem = pc->mem_cgroup; |
@@ -234,18 +229,14 @@ static unsigned long mem_cgroup_get_all_zonestat(struct mem_cgroup *mem, | |||
234 | return total; | 229 | return total; |
235 | } | 230 | } |
236 | 231 | ||
237 | static struct mem_cgroup init_mem_cgroup; | 232 | static struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont) |
238 | |||
239 | static inline | ||
240 | struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont) | ||
241 | { | 233 | { |
242 | return container_of(cgroup_subsys_state(cont, | 234 | return container_of(cgroup_subsys_state(cont, |
243 | mem_cgroup_subsys_id), struct mem_cgroup, | 235 | mem_cgroup_subsys_id), struct mem_cgroup, |
244 | css); | 236 | css); |
245 | } | 237 | } |
246 | 238 | ||
247 | static inline | 239 | static struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p) |
248 | struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p) | ||
249 | { | 240 | { |
250 | return container_of(task_subsys_state(p, mem_cgroup_subsys_id), | 241 | return container_of(task_subsys_state(p, mem_cgroup_subsys_id), |
251 | struct mem_cgroup, css); | 242 | struct mem_cgroup, css); |
@@ -267,81 +258,33 @@ void mm_free_cgroup(struct mm_struct *mm) | |||
267 | 258 | ||
268 | static inline int page_cgroup_locked(struct page *page) | 259 | static inline int page_cgroup_locked(struct page *page) |
269 | { | 260 | { |
270 | return bit_spin_is_locked(PAGE_CGROUP_LOCK_BIT, | 261 | return bit_spin_is_locked(PAGE_CGROUP_LOCK_BIT, &page->page_cgroup); |
271 | &page->page_cgroup); | ||
272 | } | 262 | } |
273 | 263 | ||
274 | void page_assign_page_cgroup(struct page *page, struct page_cgroup *pc) | 264 | static void page_assign_page_cgroup(struct page *page, struct page_cgroup *pc) |
275 | { | 265 | { |
276 | int locked; | 266 | VM_BUG_ON(!page_cgroup_locked(page)); |
277 | 267 | page->page_cgroup = ((unsigned long)pc | PAGE_CGROUP_LOCK); | |
278 | /* | ||
279 | * While resetting the page_cgroup we might not hold the | ||
280 | * page_cgroup lock. free_hot_cold_page() is an example | ||
281 | * of such a scenario | ||
282 | */ | ||
283 | if (pc) | ||
284 | VM_BUG_ON(!page_cgroup_locked(page)); | ||
285 | locked = (page->page_cgroup & PAGE_CGROUP_LOCK); | ||
286 | page->page_cgroup = ((unsigned long)pc | locked); | ||
287 | } | 268 | } |
288 | 269 | ||
289 | struct page_cgroup *page_get_page_cgroup(struct page *page) | 270 | struct page_cgroup *page_get_page_cgroup(struct page *page) |
290 | { | 271 | { |
291 | return (struct page_cgroup *) | 272 | return (struct page_cgroup *) (page->page_cgroup & ~PAGE_CGROUP_LOCK); |
292 | (page->page_cgroup & ~PAGE_CGROUP_LOCK); | ||
293 | } | 273 | } |
294 | 274 | ||
295 | static void __always_inline lock_page_cgroup(struct page *page) | 275 | static void lock_page_cgroup(struct page *page) |
296 | { | 276 | { |
297 | bit_spin_lock(PAGE_CGROUP_LOCK_BIT, &page->page_cgroup); | 277 | bit_spin_lock(PAGE_CGROUP_LOCK_BIT, &page->page_cgroup); |
298 | VM_BUG_ON(!page_cgroup_locked(page)); | ||
299 | } | ||
300 | |||
301 | static void __always_inline unlock_page_cgroup(struct page *page) | ||
302 | { | ||
303 | bit_spin_unlock(PAGE_CGROUP_LOCK_BIT, &page->page_cgroup); | ||
304 | } | 278 | } |
305 | 279 | ||
306 | /* | 280 | static int try_lock_page_cgroup(struct page *page) |
307 | * Tie new page_cgroup to struct page under lock_page_cgroup() | ||
308 | * This can fail if the page has been tied to a page_cgroup. | ||
309 | * If success, returns 0. | ||
310 | */ | ||
311 | static int page_cgroup_assign_new_page_cgroup(struct page *page, | ||
312 | struct page_cgroup *pc) | ||
313 | { | 281 | { |
314 | int ret = 0; | 282 | return bit_spin_trylock(PAGE_CGROUP_LOCK_BIT, &page->page_cgroup); |
315 | |||
316 | lock_page_cgroup(page); | ||
317 | if (!page_get_page_cgroup(page)) | ||
318 | page_assign_page_cgroup(page, pc); | ||
319 | else /* A page is tied to other pc. */ | ||
320 | ret = 1; | ||
321 | unlock_page_cgroup(page); | ||
322 | return ret; | ||
323 | } | 283 | } |
324 | 284 | ||
325 | /* | 285 | static void unlock_page_cgroup(struct page *page) |
326 | * Clear page->page_cgroup member under lock_page_cgroup(). | ||
327 | * If given "pc" value is different from one page->page_cgroup, | ||
328 | * page->cgroup is not cleared. | ||
329 | * Returns a value of page->page_cgroup at lock taken. | ||
330 | * A can can detect failure of clearing by following | ||
331 | * clear_page_cgroup(page, pc) == pc | ||
332 | */ | ||
333 | |||
334 | static struct page_cgroup *clear_page_cgroup(struct page *page, | ||
335 | struct page_cgroup *pc) | ||
336 | { | 286 | { |
337 | struct page_cgroup *ret; | 287 | bit_spin_unlock(PAGE_CGROUP_LOCK_BIT, &page->page_cgroup); |
338 | /* lock and clear */ | ||
339 | lock_page_cgroup(page); | ||
340 | ret = page_get_page_cgroup(page); | ||
341 | if (likely(ret == pc)) | ||
342 | page_assign_page_cgroup(page, NULL); | ||
343 | unlock_page_cgroup(page); | ||
344 | return ret; | ||
345 | } | 288 | } |
346 | 289 | ||
347 | static void __mem_cgroup_remove_list(struct page_cgroup *pc) | 290 | static void __mem_cgroup_remove_list(struct page_cgroup *pc) |
@@ -399,7 +342,7 @@ int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem) | |||
399 | int ret; | 342 | int ret; |
400 | 343 | ||
401 | task_lock(task); | 344 | task_lock(task); |
402 | ret = task->mm && vm_match_cgroup(task->mm, mem); | 345 | ret = task->mm && mm_match_cgroup(task->mm, mem); |
403 | task_unlock(task); | 346 | task_unlock(task); |
404 | return ret; | 347 | return ret; |
405 | } | 348 | } |
@@ -407,18 +350,30 @@ int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *mem) | |||
407 | /* | 350 | /* |
408 | * This routine assumes that the appropriate zone's lru lock is already held | 351 | * This routine assumes that the appropriate zone's lru lock is already held |
409 | */ | 352 | */ |
410 | void mem_cgroup_move_lists(struct page_cgroup *pc, bool active) | 353 | void mem_cgroup_move_lists(struct page *page, bool active) |
411 | { | 354 | { |
355 | struct page_cgroup *pc; | ||
412 | struct mem_cgroup_per_zone *mz; | 356 | struct mem_cgroup_per_zone *mz; |
413 | unsigned long flags; | 357 | unsigned long flags; |
414 | 358 | ||
415 | if (!pc) | 359 | /* |
360 | * We cannot lock_page_cgroup while holding zone's lru_lock, | ||
361 | * because other holders of lock_page_cgroup can be interrupted | ||
362 | * with an attempt to rotate_reclaimable_page. But we cannot | ||
363 | * safely get to page_cgroup without it, so just try_lock it: | ||
364 | * mem_cgroup_isolate_pages allows for page left on wrong list. | ||
365 | */ | ||
366 | if (!try_lock_page_cgroup(page)) | ||
416 | return; | 367 | return; |
417 | 368 | ||
418 | mz = page_cgroup_zoneinfo(pc); | 369 | pc = page_get_page_cgroup(page); |
419 | spin_lock_irqsave(&mz->lru_lock, flags); | 370 | if (pc) { |
420 | __mem_cgroup_move_lists(pc, active); | 371 | mz = page_cgroup_zoneinfo(pc); |
421 | spin_unlock_irqrestore(&mz->lru_lock, flags); | 372 | spin_lock_irqsave(&mz->lru_lock, flags); |
373 | __mem_cgroup_move_lists(pc, active); | ||
374 | spin_unlock_irqrestore(&mz->lru_lock, flags); | ||
375 | } | ||
376 | unlock_page_cgroup(page); | ||
422 | } | 377 | } |
423 | 378 | ||
424 | /* | 379 | /* |
@@ -437,6 +392,7 @@ int mem_cgroup_calc_mapped_ratio(struct mem_cgroup *mem) | |||
437 | rss = (long)mem_cgroup_read_stat(&mem->stat, MEM_CGROUP_STAT_RSS); | 392 | rss = (long)mem_cgroup_read_stat(&mem->stat, MEM_CGROUP_STAT_RSS); |
438 | return (int)((rss * 100L) / total); | 393 | return (int)((rss * 100L) / total); |
439 | } | 394 | } |
395 | |||
440 | /* | 396 | /* |
441 | * This function is called from vmscan.c. In page reclaiming loop. balance | 397 | * This function is called from vmscan.c. In page reclaiming loop. balance |
442 | * between active and inactive list is calculated. For memory controller | 398 | * between active and inactive list is calculated. For memory controller |
@@ -500,7 +456,6 @@ long mem_cgroup_calc_reclaim_inactive(struct mem_cgroup *mem, | |||
500 | struct mem_cgroup_per_zone *mz = mem_cgroup_zoneinfo(mem, nid, zid); | 456 | struct mem_cgroup_per_zone *mz = mem_cgroup_zoneinfo(mem, nid, zid); |
501 | 457 | ||
502 | nr_inactive = MEM_CGROUP_ZSTAT(mz, MEM_CGROUP_ZSTAT_INACTIVE); | 458 | nr_inactive = MEM_CGROUP_ZSTAT(mz, MEM_CGROUP_ZSTAT_INACTIVE); |
503 | |||
504 | return (nr_inactive >> priority); | 459 | return (nr_inactive >> priority); |
505 | } | 460 | } |
506 | 461 | ||
@@ -586,26 +541,21 @@ static int mem_cgroup_charge_common(struct page *page, struct mm_struct *mm, | |||
586 | * with it | 541 | * with it |
587 | */ | 542 | */ |
588 | retry: | 543 | retry: |
589 | if (page) { | 544 | lock_page_cgroup(page); |
590 | lock_page_cgroup(page); | 545 | pc = page_get_page_cgroup(page); |
591 | pc = page_get_page_cgroup(page); | 546 | /* |
592 | /* | 547 | * The page_cgroup exists and |
593 | * The page_cgroup exists and | 548 | * the page has already been accounted. |
594 | * the page has already been accounted. | 549 | */ |
595 | */ | 550 | if (pc) { |
596 | if (pc) { | 551 | VM_BUG_ON(pc->page != page); |
597 | if (unlikely(!atomic_inc_not_zero(&pc->ref_cnt))) { | 552 | VM_BUG_ON(pc->ref_cnt <= 0); |
598 | /* this page is under being uncharged ? */ | 553 | |
599 | unlock_page_cgroup(page); | 554 | pc->ref_cnt++; |
600 | cpu_relax(); | ||
601 | goto retry; | ||
602 | } else { | ||
603 | unlock_page_cgroup(page); | ||
604 | goto done; | ||
605 | } | ||
606 | } | ||
607 | unlock_page_cgroup(page); | 555 | unlock_page_cgroup(page); |
556 | goto done; | ||
608 | } | 557 | } |
558 | unlock_page_cgroup(page); | ||
609 | 559 | ||
610 | pc = kzalloc(sizeof(struct page_cgroup), gfp_mask); | 560 | pc = kzalloc(sizeof(struct page_cgroup), gfp_mask); |
611 | if (pc == NULL) | 561 | if (pc == NULL) |
@@ -623,16 +573,11 @@ retry: | |||
623 | rcu_read_lock(); | 573 | rcu_read_lock(); |
624 | mem = rcu_dereference(mm->mem_cgroup); | 574 | mem = rcu_dereference(mm->mem_cgroup); |
625 | /* | 575 | /* |
626 | * For every charge from the cgroup, increment reference | 576 | * For every charge from the cgroup, increment reference count |
627 | * count | ||
628 | */ | 577 | */ |
629 | css_get(&mem->css); | 578 | css_get(&mem->css); |
630 | rcu_read_unlock(); | 579 | rcu_read_unlock(); |
631 | 580 | ||
632 | /* | ||
633 | * If we created the page_cgroup, we should free it on exceeding | ||
634 | * the cgroup limit. | ||
635 | */ | ||
636 | while (res_counter_charge(&mem->res, PAGE_SIZE)) { | 581 | while (res_counter_charge(&mem->res, PAGE_SIZE)) { |
637 | if (!(gfp_mask & __GFP_WAIT)) | 582 | if (!(gfp_mask & __GFP_WAIT)) |
638 | goto out; | 583 | goto out; |
@@ -641,12 +586,12 @@ retry: | |||
641 | continue; | 586 | continue; |
642 | 587 | ||
643 | /* | 588 | /* |
644 | * try_to_free_mem_cgroup_pages() might not give us a full | 589 | * try_to_free_mem_cgroup_pages() might not give us a full |
645 | * picture of reclaim. Some pages are reclaimed and might be | 590 | * picture of reclaim. Some pages are reclaimed and might be |
646 | * moved to swap cache or just unmapped from the cgroup. | 591 | * moved to swap cache or just unmapped from the cgroup. |
647 | * Check the limit again to see if the reclaim reduced the | 592 | * Check the limit again to see if the reclaim reduced the |
648 | * current usage of the cgroup before giving up | 593 | * current usage of the cgroup before giving up |
649 | */ | 594 | */ |
650 | if (res_counter_check_under_limit(&mem->res)) | 595 | if (res_counter_check_under_limit(&mem->res)) |
651 | continue; | 596 | continue; |
652 | 597 | ||
@@ -657,14 +602,16 @@ retry: | |||
657 | congestion_wait(WRITE, HZ/10); | 602 | congestion_wait(WRITE, HZ/10); |
658 | } | 603 | } |
659 | 604 | ||
660 | atomic_set(&pc->ref_cnt, 1); | 605 | pc->ref_cnt = 1; |
661 | pc->mem_cgroup = mem; | 606 | pc->mem_cgroup = mem; |
662 | pc->page = page; | 607 | pc->page = page; |
663 | pc->flags = PAGE_CGROUP_FLAG_ACTIVE; | 608 | pc->flags = PAGE_CGROUP_FLAG_ACTIVE; |
664 | if (ctype == MEM_CGROUP_CHARGE_TYPE_CACHE) | 609 | if (ctype == MEM_CGROUP_CHARGE_TYPE_CACHE) |
665 | pc->flags |= PAGE_CGROUP_FLAG_CACHE; | 610 | pc->flags |= PAGE_CGROUP_FLAG_CACHE; |
666 | 611 | ||
667 | if (!page || page_cgroup_assign_new_page_cgroup(page, pc)) { | 612 | lock_page_cgroup(page); |
613 | if (page_get_page_cgroup(page)) { | ||
614 | unlock_page_cgroup(page); | ||
668 | /* | 615 | /* |
669 | * Another charge has been added to this page already. | 616 | * Another charge has been added to this page already. |
670 | * We take lock_page_cgroup(page) again and read | 617 | * We take lock_page_cgroup(page) again and read |
@@ -673,17 +620,16 @@ retry: | |||
673 | res_counter_uncharge(&mem->res, PAGE_SIZE); | 620 | res_counter_uncharge(&mem->res, PAGE_SIZE); |
674 | css_put(&mem->css); | 621 | css_put(&mem->css); |
675 | kfree(pc); | 622 | kfree(pc); |
676 | if (!page) | ||
677 | goto done; | ||
678 | goto retry; | 623 | goto retry; |
679 | } | 624 | } |
625 | page_assign_page_cgroup(page, pc); | ||
680 | 626 | ||
681 | mz = page_cgroup_zoneinfo(pc); | 627 | mz = page_cgroup_zoneinfo(pc); |
682 | spin_lock_irqsave(&mz->lru_lock, flags); | 628 | spin_lock_irqsave(&mz->lru_lock, flags); |
683 | /* Update statistics vector */ | ||
684 | __mem_cgroup_add_list(pc); | 629 | __mem_cgroup_add_list(pc); |
685 | spin_unlock_irqrestore(&mz->lru_lock, flags); | 630 | spin_unlock_irqrestore(&mz->lru_lock, flags); |
686 | 631 | ||
632 | unlock_page_cgroup(page); | ||
687 | done: | 633 | done: |
688 | return 0; | 634 | return 0; |
689 | out: | 635 | out: |
@@ -693,70 +639,61 @@ err: | |||
693 | return -ENOMEM; | 639 | return -ENOMEM; |
694 | } | 640 | } |
695 | 641 | ||
696 | int mem_cgroup_charge(struct page *page, struct mm_struct *mm, | 642 | int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask) |
697 | gfp_t gfp_mask) | ||
698 | { | 643 | { |
699 | return mem_cgroup_charge_common(page, mm, gfp_mask, | 644 | return mem_cgroup_charge_common(page, mm, gfp_mask, |
700 | MEM_CGROUP_CHARGE_TYPE_MAPPED); | 645 | MEM_CGROUP_CHARGE_TYPE_MAPPED); |
701 | } | 646 | } |
702 | 647 | ||
703 | /* | ||
704 | * See if the cached pages should be charged at all? | ||
705 | */ | ||
706 | int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, | 648 | int mem_cgroup_cache_charge(struct page *page, struct mm_struct *mm, |
707 | gfp_t gfp_mask) | 649 | gfp_t gfp_mask) |
708 | { | 650 | { |
709 | int ret = 0; | ||
710 | if (!mm) | 651 | if (!mm) |
711 | mm = &init_mm; | 652 | mm = &init_mm; |
712 | 653 | return mem_cgroup_charge_common(page, mm, gfp_mask, | |
713 | ret = mem_cgroup_charge_common(page, mm, gfp_mask, | ||
714 | MEM_CGROUP_CHARGE_TYPE_CACHE); | 654 | MEM_CGROUP_CHARGE_TYPE_CACHE); |
715 | return ret; | ||
716 | } | 655 | } |
717 | 656 | ||
718 | /* | 657 | /* |
719 | * Uncharging is always a welcome operation, we never complain, simply | 658 | * Uncharging is always a welcome operation, we never complain, simply |
720 | * uncharge. This routine should be called with lock_page_cgroup held | 659 | * uncharge. |
721 | */ | 660 | */ |
722 | void mem_cgroup_uncharge(struct page_cgroup *pc) | 661 | void mem_cgroup_uncharge_page(struct page *page) |
723 | { | 662 | { |
663 | struct page_cgroup *pc; | ||
724 | struct mem_cgroup *mem; | 664 | struct mem_cgroup *mem; |
725 | struct mem_cgroup_per_zone *mz; | 665 | struct mem_cgroup_per_zone *mz; |
726 | struct page *page; | ||
727 | unsigned long flags; | 666 | unsigned long flags; |
728 | 667 | ||
729 | /* | 668 | /* |
730 | * Check if our page_cgroup is valid | 669 | * Check if our page_cgroup is valid |
731 | */ | 670 | */ |
671 | lock_page_cgroup(page); | ||
672 | pc = page_get_page_cgroup(page); | ||
732 | if (!pc) | 673 | if (!pc) |
733 | return; | 674 | goto unlock; |
734 | 675 | ||
735 | if (atomic_dec_and_test(&pc->ref_cnt)) { | 676 | VM_BUG_ON(pc->page != page); |
736 | page = pc->page; | 677 | VM_BUG_ON(pc->ref_cnt <= 0); |
678 | |||
679 | if (--(pc->ref_cnt) == 0) { | ||
737 | mz = page_cgroup_zoneinfo(pc); | 680 | mz = page_cgroup_zoneinfo(pc); |
738 | /* | 681 | spin_lock_irqsave(&mz->lru_lock, flags); |
739 | * get page->cgroup and clear it under lock. | 682 | __mem_cgroup_remove_list(pc); |
740 | * force_empty can drop page->cgroup without checking refcnt. | 683 | spin_unlock_irqrestore(&mz->lru_lock, flags); |
741 | */ | 684 | |
685 | page_assign_page_cgroup(page, NULL); | ||
742 | unlock_page_cgroup(page); | 686 | unlock_page_cgroup(page); |
743 | if (clear_page_cgroup(page, pc) == pc) { | 687 | |
744 | mem = pc->mem_cgroup; | 688 | mem = pc->mem_cgroup; |
745 | css_put(&mem->css); | 689 | res_counter_uncharge(&mem->res, PAGE_SIZE); |
746 | res_counter_uncharge(&mem->res, PAGE_SIZE); | 690 | css_put(&mem->css); |
747 | spin_lock_irqsave(&mz->lru_lock, flags); | 691 | |
748 | __mem_cgroup_remove_list(pc); | 692 | kfree(pc); |
749 | spin_unlock_irqrestore(&mz->lru_lock, flags); | 693 | return; |
750 | kfree(pc); | ||
751 | } | ||
752 | lock_page_cgroup(page); | ||
753 | } | 694 | } |
754 | } | ||
755 | 695 | ||
756 | void mem_cgroup_uncharge_page(struct page *page) | 696 | unlock: |
757 | { | ||
758 | lock_page_cgroup(page); | ||
759 | mem_cgroup_uncharge(page_get_page_cgroup(page)); | ||
760 | unlock_page_cgroup(page); | 697 | unlock_page_cgroup(page); |
761 | } | 698 | } |
762 | 699 | ||
@@ -764,63 +701,59 @@ void mem_cgroup_uncharge_page(struct page *page) | |||
764 | * Returns non-zero if a page (under migration) has valid page_cgroup member. | 701 | * Returns non-zero if a page (under migration) has valid page_cgroup member. |
765 | * Refcnt of page_cgroup is incremented. | 702 | * Refcnt of page_cgroup is incremented. |
766 | */ | 703 | */ |
767 | |||
768 | int mem_cgroup_prepare_migration(struct page *page) | 704 | int mem_cgroup_prepare_migration(struct page *page) |
769 | { | 705 | { |
770 | struct page_cgroup *pc; | 706 | struct page_cgroup *pc; |
771 | int ret = 0; | 707 | |
772 | lock_page_cgroup(page); | 708 | lock_page_cgroup(page); |
773 | pc = page_get_page_cgroup(page); | 709 | pc = page_get_page_cgroup(page); |
774 | if (pc && atomic_inc_not_zero(&pc->ref_cnt)) | 710 | if (pc) |
775 | ret = 1; | 711 | pc->ref_cnt++; |
776 | unlock_page_cgroup(page); | 712 | unlock_page_cgroup(page); |
777 | return ret; | 713 | return pc != NULL; |
778 | } | 714 | } |
779 | 715 | ||
780 | void mem_cgroup_end_migration(struct page *page) | 716 | void mem_cgroup_end_migration(struct page *page) |
781 | { | 717 | { |
782 | struct page_cgroup *pc; | 718 | mem_cgroup_uncharge_page(page); |
783 | |||
784 | lock_page_cgroup(page); | ||
785 | pc = page_get_page_cgroup(page); | ||
786 | mem_cgroup_uncharge(pc); | ||
787 | unlock_page_cgroup(page); | ||
788 | } | 719 | } |
720 | |||
789 | /* | 721 | /* |
790 | * We know both *page* and *newpage* are now not-on-LRU and Pg_locked. | 722 | * We know both *page* and *newpage* are now not-on-LRU and PG_locked. |
791 | * And no race with uncharge() routines because page_cgroup for *page* | 723 | * And no race with uncharge() routines because page_cgroup for *page* |
792 | * has extra one reference by mem_cgroup_prepare_migration. | 724 | * has extra one reference by mem_cgroup_prepare_migration. |
793 | */ | 725 | */ |
794 | |||
795 | void mem_cgroup_page_migration(struct page *page, struct page *newpage) | 726 | void mem_cgroup_page_migration(struct page *page, struct page *newpage) |
796 | { | 727 | { |
797 | struct page_cgroup *pc; | 728 | struct page_cgroup *pc; |
798 | struct mem_cgroup *mem; | ||
799 | unsigned long flags; | ||
800 | struct mem_cgroup_per_zone *mz; | 729 | struct mem_cgroup_per_zone *mz; |
801 | retry: | 730 | unsigned long flags; |
731 | |||
732 | lock_page_cgroup(page); | ||
802 | pc = page_get_page_cgroup(page); | 733 | pc = page_get_page_cgroup(page); |
803 | if (!pc) | 734 | if (!pc) { |
735 | unlock_page_cgroup(page); | ||
804 | return; | 736 | return; |
805 | mem = pc->mem_cgroup; | 737 | } |
738 | |||
806 | mz = page_cgroup_zoneinfo(pc); | 739 | mz = page_cgroup_zoneinfo(pc); |
807 | if (clear_page_cgroup(page, pc) != pc) | ||
808 | goto retry; | ||
809 | spin_lock_irqsave(&mz->lru_lock, flags); | 740 | spin_lock_irqsave(&mz->lru_lock, flags); |
810 | |||
811 | __mem_cgroup_remove_list(pc); | 741 | __mem_cgroup_remove_list(pc); |
812 | spin_unlock_irqrestore(&mz->lru_lock, flags); | 742 | spin_unlock_irqrestore(&mz->lru_lock, flags); |
813 | 743 | ||
744 | page_assign_page_cgroup(page, NULL); | ||
745 | unlock_page_cgroup(page); | ||
746 | |||
814 | pc->page = newpage; | 747 | pc->page = newpage; |
815 | lock_page_cgroup(newpage); | 748 | lock_page_cgroup(newpage); |
816 | page_assign_page_cgroup(newpage, pc); | 749 | page_assign_page_cgroup(newpage, pc); |
817 | unlock_page_cgroup(newpage); | ||
818 | 750 | ||
819 | mz = page_cgroup_zoneinfo(pc); | 751 | mz = page_cgroup_zoneinfo(pc); |
820 | spin_lock_irqsave(&mz->lru_lock, flags); | 752 | spin_lock_irqsave(&mz->lru_lock, flags); |
821 | __mem_cgroup_add_list(pc); | 753 | __mem_cgroup_add_list(pc); |
822 | spin_unlock_irqrestore(&mz->lru_lock, flags); | 754 | spin_unlock_irqrestore(&mz->lru_lock, flags); |
823 | return; | 755 | |
756 | unlock_page_cgroup(newpage); | ||
824 | } | 757 | } |
825 | 758 | ||
826 | /* | 759 | /* |
@@ -829,14 +762,13 @@ retry: | |||
829 | * *And* this routine doesn't reclaim page itself, just removes page_cgroup. | 762 | * *And* this routine doesn't reclaim page itself, just removes page_cgroup. |
830 | */ | 763 | */ |
831 | #define FORCE_UNCHARGE_BATCH (128) | 764 | #define FORCE_UNCHARGE_BATCH (128) |
832 | static void | 765 | static void mem_cgroup_force_empty_list(struct mem_cgroup *mem, |
833 | mem_cgroup_force_empty_list(struct mem_cgroup *mem, | ||
834 | struct mem_cgroup_per_zone *mz, | 766 | struct mem_cgroup_per_zone *mz, |
835 | int active) | 767 | int active) |
836 | { | 768 | { |
837 | struct page_cgroup *pc; | 769 | struct page_cgroup *pc; |
838 | struct page *page; | 770 | struct page *page; |
839 | int count; | 771 | int count = FORCE_UNCHARGE_BATCH; |
840 | unsigned long flags; | 772 | unsigned long flags; |
841 | struct list_head *list; | 773 | struct list_head *list; |
842 | 774 | ||
@@ -845,46 +777,36 @@ mem_cgroup_force_empty_list(struct mem_cgroup *mem, | |||
845 | else | 777 | else |
846 | list = &mz->inactive_list; | 778 | list = &mz->inactive_list; |
847 | 779 | ||
848 | if (list_empty(list)) | ||
849 | return; | ||
850 | retry: | ||
851 | count = FORCE_UNCHARGE_BATCH; | ||
852 | spin_lock_irqsave(&mz->lru_lock, flags); | 780 | spin_lock_irqsave(&mz->lru_lock, flags); |
853 | 781 | while (!list_empty(list)) { | |
854 | while (--count && !list_empty(list)) { | ||
855 | pc = list_entry(list->prev, struct page_cgroup, lru); | 782 | pc = list_entry(list->prev, struct page_cgroup, lru); |
856 | page = pc->page; | 783 | page = pc->page; |
857 | /* Avoid race with charge */ | 784 | get_page(page); |
858 | atomic_set(&pc->ref_cnt, 0); | 785 | spin_unlock_irqrestore(&mz->lru_lock, flags); |
859 | if (clear_page_cgroup(page, pc) == pc) { | 786 | mem_cgroup_uncharge_page(page); |
860 | css_put(&mem->css); | 787 | put_page(page); |
861 | res_counter_uncharge(&mem->res, PAGE_SIZE); | 788 | if (--count <= 0) { |
862 | __mem_cgroup_remove_list(pc); | 789 | count = FORCE_UNCHARGE_BATCH; |
863 | kfree(pc); | 790 | cond_resched(); |
864 | } else /* being uncharged ? ...do relax */ | 791 | } |
865 | break; | 792 | spin_lock_irqsave(&mz->lru_lock, flags); |
866 | } | 793 | } |
867 | spin_unlock_irqrestore(&mz->lru_lock, flags); | 794 | spin_unlock_irqrestore(&mz->lru_lock, flags); |
868 | if (!list_empty(list)) { | ||
869 | cond_resched(); | ||
870 | goto retry; | ||
871 | } | ||
872 | return; | ||
873 | } | 795 | } |
874 | 796 | ||
875 | /* | 797 | /* |
876 | * make mem_cgroup's charge to be 0 if there is no task. | 798 | * make mem_cgroup's charge to be 0 if there is no task. |
877 | * This enables deleting this mem_cgroup. | 799 | * This enables deleting this mem_cgroup. |
878 | */ | 800 | */ |
879 | 801 | static int mem_cgroup_force_empty(struct mem_cgroup *mem) | |
880 | int mem_cgroup_force_empty(struct mem_cgroup *mem) | ||
881 | { | 802 | { |
882 | int ret = -EBUSY; | 803 | int ret = -EBUSY; |
883 | int node, zid; | 804 | int node, zid; |
805 | |||
884 | css_get(&mem->css); | 806 | css_get(&mem->css); |
885 | /* | 807 | /* |
886 | * page reclaim code (kswapd etc..) will move pages between | 808 | * page reclaim code (kswapd etc..) will move pages between |
887 | ` * active_list <-> inactive_list while we don't take a lock. | 809 | * active_list <-> inactive_list while we don't take a lock. |
888 | * So, we have to do loop here until all lists are empty. | 810 | * So, we have to do loop here until all lists are empty. |
889 | */ | 811 | */ |
890 | while (mem->res.usage > 0) { | 812 | while (mem->res.usage > 0) { |
@@ -906,9 +828,7 @@ out: | |||
906 | return ret; | 828 | return ret; |
907 | } | 829 | } |
908 | 830 | ||
909 | 831 | static int mem_cgroup_write_strategy(char *buf, unsigned long long *tmp) | |
910 | |||
911 | int mem_cgroup_write_strategy(char *buf, unsigned long long *tmp) | ||
912 | { | 832 | { |
913 | *tmp = memparse(buf, &buf); | 833 | *tmp = memparse(buf, &buf); |
914 | if (*buf != '\0') | 834 | if (*buf != '\0') |
@@ -945,8 +865,7 @@ static ssize_t mem_force_empty_write(struct cgroup *cont, | |||
945 | size_t nbytes, loff_t *ppos) | 865 | size_t nbytes, loff_t *ppos) |
946 | { | 866 | { |
947 | struct mem_cgroup *mem = mem_cgroup_from_cont(cont); | 867 | struct mem_cgroup *mem = mem_cgroup_from_cont(cont); |
948 | int ret; | 868 | int ret = mem_cgroup_force_empty(mem); |
949 | ret = mem_cgroup_force_empty(mem); | ||
950 | if (!ret) | 869 | if (!ret) |
951 | ret = nbytes; | 870 | ret = nbytes; |
952 | return ret; | 871 | return ret; |
@@ -955,7 +874,6 @@ static ssize_t mem_force_empty_write(struct cgroup *cont, | |||
955 | /* | 874 | /* |
956 | * Note: This should be removed if cgroup supports write-only file. | 875 | * Note: This should be removed if cgroup supports write-only file. |
957 | */ | 876 | */ |
958 | |||
959 | static ssize_t mem_force_empty_read(struct cgroup *cont, | 877 | static ssize_t mem_force_empty_read(struct cgroup *cont, |
960 | struct cftype *cft, | 878 | struct cftype *cft, |
961 | struct file *file, char __user *userbuf, | 879 | struct file *file, char __user *userbuf, |
@@ -964,7 +882,6 @@ static ssize_t mem_force_empty_read(struct cgroup *cont, | |||
964 | return -EINVAL; | 882 | return -EINVAL; |
965 | } | 883 | } |
966 | 884 | ||
967 | |||
968 | static const struct mem_cgroup_stat_desc { | 885 | static const struct mem_cgroup_stat_desc { |
969 | const char *msg; | 886 | const char *msg; |
970 | u64 unit; | 887 | u64 unit; |
@@ -1017,8 +934,6 @@ static int mem_control_stat_open(struct inode *unused, struct file *file) | |||
1017 | return single_open(file, mem_control_stat_show, cont); | 934 | return single_open(file, mem_control_stat_show, cont); |
1018 | } | 935 | } |
1019 | 936 | ||
1020 | |||
1021 | |||
1022 | static struct cftype mem_cgroup_files[] = { | 937 | static struct cftype mem_cgroup_files[] = { |
1023 | { | 938 | { |
1024 | .name = "usage_in_bytes", | 939 | .name = "usage_in_bytes", |
@@ -1084,9 +999,6 @@ static void free_mem_cgroup_per_zone_info(struct mem_cgroup *mem, int node) | |||
1084 | kfree(mem->info.nodeinfo[node]); | 999 | kfree(mem->info.nodeinfo[node]); |
1085 | } | 1000 | } |
1086 | 1001 | ||
1087 | |||
1088 | static struct mem_cgroup init_mem_cgroup; | ||
1089 | |||
1090 | static struct cgroup_subsys_state * | 1002 | static struct cgroup_subsys_state * |
1091 | mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont) | 1003 | mem_cgroup_create(struct cgroup_subsys *ss, struct cgroup *cont) |
1092 | { | 1004 | { |
@@ -1176,7 +1088,6 @@ static void mem_cgroup_move_task(struct cgroup_subsys *ss, | |||
1176 | 1088 | ||
1177 | out: | 1089 | out: |
1178 | mmput(mm); | 1090 | mmput(mm); |
1179 | return; | ||
1180 | } | 1091 | } |
1181 | 1092 | ||
1182 | struct cgroup_subsys mem_cgroup_subsys = { | 1093 | struct cgroup_subsys mem_cgroup_subsys = { |
diff --git a/mm/memory.c b/mm/memory.c index ce3c9e4492d8..0d14d1e58a5f 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -1711,7 +1711,7 @@ unlock: | |||
1711 | } | 1711 | } |
1712 | return ret; | 1712 | return ret; |
1713 | oom_free_new: | 1713 | oom_free_new: |
1714 | __free_page(new_page); | 1714 | page_cache_release(new_page); |
1715 | oom: | 1715 | oom: |
1716 | if (old_page) | 1716 | if (old_page) |
1717 | page_cache_release(old_page); | 1717 | page_cache_release(old_page); |
@@ -2093,12 +2093,9 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2093 | unlock_page(page); | 2093 | unlock_page(page); |
2094 | 2094 | ||
2095 | if (write_access) { | 2095 | if (write_access) { |
2096 | /* XXX: We could OR the do_wp_page code with this one? */ | 2096 | ret |= do_wp_page(mm, vma, address, page_table, pmd, ptl, pte); |
2097 | if (do_wp_page(mm, vma, address, | 2097 | if (ret & VM_FAULT_ERROR) |
2098 | page_table, pmd, ptl, pte) & VM_FAULT_OOM) { | 2098 | ret &= VM_FAULT_ERROR; |
2099 | mem_cgroup_uncharge_page(page); | ||
2100 | ret = VM_FAULT_OOM; | ||
2101 | } | ||
2102 | goto out; | 2099 | goto out; |
2103 | } | 2100 | } |
2104 | 2101 | ||
@@ -2163,7 +2160,7 @@ release: | |||
2163 | page_cache_release(page); | 2160 | page_cache_release(page); |
2164 | goto unlock; | 2161 | goto unlock; |
2165 | oom_free_page: | 2162 | oom_free_page: |
2166 | __free_page(page); | 2163 | page_cache_release(page); |
2167 | oom: | 2164 | oom: |
2168 | return VM_FAULT_OOM; | 2165 | return VM_FAULT_OOM; |
2169 | } | 2166 | } |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 6c7ba1a63d23..3c3601121509 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -1296,7 +1296,9 @@ struct zonelist *huge_zonelist(struct vm_area_struct *vma, unsigned long addr, | |||
1296 | unsigned nid; | 1296 | unsigned nid; |
1297 | 1297 | ||
1298 | nid = interleave_nid(pol, vma, addr, HPAGE_SHIFT); | 1298 | nid = interleave_nid(pol, vma, addr, HPAGE_SHIFT); |
1299 | __mpol_free(pol); /* finished with pol */ | 1299 | if (unlikely(pol != &default_policy && |
1300 | pol != current->mempolicy)) | ||
1301 | __mpol_free(pol); /* finished with pol */ | ||
1300 | return NODE_DATA(nid)->node_zonelists + gfp_zone(gfp_flags); | 1302 | return NODE_DATA(nid)->node_zonelists + gfp_zone(gfp_flags); |
1301 | } | 1303 | } |
1302 | 1304 | ||
@@ -1360,6 +1362,9 @@ alloc_page_vma(gfp_t gfp, struct vm_area_struct *vma, unsigned long addr) | |||
1360 | unsigned nid; | 1362 | unsigned nid; |
1361 | 1363 | ||
1362 | nid = interleave_nid(pol, vma, addr, PAGE_SHIFT); | 1364 | nid = interleave_nid(pol, vma, addr, PAGE_SHIFT); |
1365 | if (unlikely(pol != &default_policy && | ||
1366 | pol != current->mempolicy)) | ||
1367 | __mpol_free(pol); /* finished with pol */ | ||
1363 | return alloc_page_interleave(gfp, 0, nid); | 1368 | return alloc_page_interleave(gfp, 0, nid); |
1364 | } | 1369 | } |
1365 | zl = zonelist_policy(gfp, pol); | 1370 | zl = zonelist_policy(gfp, pol); |
diff --git a/mm/migrate.c b/mm/migrate.c index a73504ff5ab9..4e0eccca5e26 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -153,11 +153,6 @@ static void remove_migration_pte(struct vm_area_struct *vma, | |||
153 | return; | 153 | return; |
154 | } | 154 | } |
155 | 155 | ||
156 | if (mem_cgroup_charge(new, mm, GFP_KERNEL)) { | ||
157 | pte_unmap(ptep); | ||
158 | return; | ||
159 | } | ||
160 | |||
161 | ptl = pte_lockptr(mm, pmd); | 156 | ptl = pte_lockptr(mm, pmd); |
162 | spin_lock(ptl); | 157 | spin_lock(ptl); |
163 | pte = *ptep; | 158 | pte = *ptep; |
@@ -169,6 +164,20 @@ static void remove_migration_pte(struct vm_area_struct *vma, | |||
169 | if (!is_migration_entry(entry) || migration_entry_to_page(entry) != old) | 164 | if (!is_migration_entry(entry) || migration_entry_to_page(entry) != old) |
170 | goto out; | 165 | goto out; |
171 | 166 | ||
167 | /* | ||
168 | * Yes, ignore the return value from a GFP_ATOMIC mem_cgroup_charge. | ||
169 | * Failure is not an option here: we're now expected to remove every | ||
170 | * migration pte, and will cause crashes otherwise. Normally this | ||
171 | * is not an issue: mem_cgroup_prepare_migration bumped up the old | ||
172 | * page_cgroup count for safety, that's now attached to the new page, | ||
173 | * so this charge should just be another incrementation of the count, | ||
174 | * to keep in balance with rmap.c's mem_cgroup_uncharging. But if | ||
175 | * there's been a force_empty, those reference counts may no longer | ||
176 | * be reliable, and this charge can actually fail: oh well, we don't | ||
177 | * make the situation any worse by proceeding as if it had succeeded. | ||
178 | */ | ||
179 | mem_cgroup_charge(new, mm, GFP_ATOMIC); | ||
180 | |||
172 | get_page(new); | 181 | get_page(new); |
173 | pte = pte_mkold(mk_pte(new, vma->vm_page_prot)); | 182 | pte = pte_mkold(mk_pte(new, vma->vm_page_prot)); |
174 | if (is_write_migration_entry(entry)) | 183 | if (is_write_migration_entry(entry)) |
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 4194b9db0104..44b2da11bf43 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
@@ -412,7 +412,7 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, | |||
412 | return oom_kill_task(p); | 412 | return oom_kill_task(p); |
413 | } | 413 | } |
414 | 414 | ||
415 | #ifdef CONFIG_CGROUP_MEM_CONT | 415 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
416 | void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask) | 416 | void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask) |
417 | { | 417 | { |
418 | unsigned long points = 0; | 418 | unsigned long points = 0; |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 8896e874a67d..402a504f1228 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/swap.h> | 19 | #include <linux/swap.h> |
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
21 | #include <linux/pagemap.h> | 21 | #include <linux/pagemap.h> |
22 | #include <linux/jiffies.h> | ||
22 | #include <linux/bootmem.h> | 23 | #include <linux/bootmem.h> |
23 | #include <linux/compiler.h> | 24 | #include <linux/compiler.h> |
24 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
@@ -221,13 +222,19 @@ static inline int bad_range(struct zone *zone, struct page *page) | |||
221 | 222 | ||
222 | static void bad_page(struct page *page) | 223 | static void bad_page(struct page *page) |
223 | { | 224 | { |
224 | printk(KERN_EMERG "Bad page state in process '%s'\n" | 225 | void *pc = page_get_page_cgroup(page); |
225 | KERN_EMERG "page:%p flags:0x%0*lx mapping:%p mapcount:%d count:%d\n" | 226 | |
226 | KERN_EMERG "Trying to fix it up, but a reboot is needed\n" | 227 | printk(KERN_EMERG "Bad page state in process '%s'\n" KERN_EMERG |
227 | KERN_EMERG "Backtrace:\n", | 228 | "page:%p flags:0x%0*lx mapping:%p mapcount:%d count:%d\n", |
228 | current->comm, page, (int)(2*sizeof(unsigned long)), | 229 | current->comm, page, (int)(2*sizeof(unsigned long)), |
229 | (unsigned long)page->flags, page->mapping, | 230 | (unsigned long)page->flags, page->mapping, |
230 | page_mapcount(page), page_count(page)); | 231 | page_mapcount(page), page_count(page)); |
232 | if (pc) { | ||
233 | printk(KERN_EMERG "cgroup:%p\n", pc); | ||
234 | page_reset_bad_cgroup(page); | ||
235 | } | ||
236 | printk(KERN_EMERG "Trying to fix it up, but a reboot is needed\n" | ||
237 | KERN_EMERG "Backtrace:\n"); | ||
231 | dump_stack(); | 238 | dump_stack(); |
232 | page->flags &= ~(1 << PG_lru | | 239 | page->flags &= ~(1 << PG_lru | |
233 | 1 << PG_private | | 240 | 1 << PG_private | |
@@ -453,6 +460,7 @@ static inline int free_pages_check(struct page *page) | |||
453 | { | 460 | { |
454 | if (unlikely(page_mapcount(page) | | 461 | if (unlikely(page_mapcount(page) | |
455 | (page->mapping != NULL) | | 462 | (page->mapping != NULL) | |
463 | (page_get_page_cgroup(page) != NULL) | | ||
456 | (page_count(page) != 0) | | 464 | (page_count(page) != 0) | |
457 | (page->flags & ( | 465 | (page->flags & ( |
458 | 1 << PG_lru | | 466 | 1 << PG_lru | |
@@ -602,6 +610,7 @@ static int prep_new_page(struct page *page, int order, gfp_t gfp_flags) | |||
602 | { | 610 | { |
603 | if (unlikely(page_mapcount(page) | | 611 | if (unlikely(page_mapcount(page) | |
604 | (page->mapping != NULL) | | 612 | (page->mapping != NULL) | |
613 | (page_get_page_cgroup(page) != NULL) | | ||
605 | (page_count(page) != 0) | | 614 | (page_count(page) != 0) | |
606 | (page->flags & ( | 615 | (page->flags & ( |
607 | 1 << PG_lru | | 616 | 1 << PG_lru | |
@@ -988,7 +997,6 @@ static void free_hot_cold_page(struct page *page, int cold) | |||
988 | 997 | ||
989 | if (!PageHighMem(page)) | 998 | if (!PageHighMem(page)) |
990 | debug_check_no_locks_freed(page_address(page), PAGE_SIZE); | 999 | debug_check_no_locks_freed(page_address(page), PAGE_SIZE); |
991 | VM_BUG_ON(page_get_page_cgroup(page)); | ||
992 | arch_free_page(page, 0); | 1000 | arch_free_page(page, 0); |
993 | kernel_map_pages(page, 1, 0); | 1001 | kernel_map_pages(page, 1, 0); |
994 | 1002 | ||
@@ -1276,7 +1284,7 @@ static nodemask_t *zlc_setup(struct zonelist *zonelist, int alloc_flags) | |||
1276 | if (!zlc) | 1284 | if (!zlc) |
1277 | return NULL; | 1285 | return NULL; |
1278 | 1286 | ||
1279 | if (jiffies - zlc->last_full_zap > 1 * HZ) { | 1287 | if (time_after(jiffies, zlc->last_full_zap + HZ)) { |
1280 | bitmap_zero(zlc->fullzones, MAX_ZONES_PER_ZONELIST); | 1288 | bitmap_zero(zlc->fullzones, MAX_ZONES_PER_ZONELIST); |
1281 | zlc->last_full_zap = jiffies; | 1289 | zlc->last_full_zap = jiffies; |
1282 | } | 1290 | } |
@@ -2527,7 +2535,6 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, | |||
2527 | set_page_links(page, zone, nid, pfn); | 2535 | set_page_links(page, zone, nid, pfn); |
2528 | init_page_count(page); | 2536 | init_page_count(page); |
2529 | reset_page_mapcount(page); | 2537 | reset_page_mapcount(page); |
2530 | page_assign_page_cgroup(page, NULL); | ||
2531 | SetPageReserved(page); | 2538 | SetPageReserved(page); |
2532 | 2539 | ||
2533 | /* | 2540 | /* |
@@ -321,7 +321,7 @@ static int page_referenced_anon(struct page *page, | |||
321 | * counting on behalf of references from different | 321 | * counting on behalf of references from different |
322 | * cgroups | 322 | * cgroups |
323 | */ | 323 | */ |
324 | if (mem_cont && !vm_match_cgroup(vma->vm_mm, mem_cont)) | 324 | if (mem_cont && !mm_match_cgroup(vma->vm_mm, mem_cont)) |
325 | continue; | 325 | continue; |
326 | referenced += page_referenced_one(page, vma, &mapcount); | 326 | referenced += page_referenced_one(page, vma, &mapcount); |
327 | if (!mapcount) | 327 | if (!mapcount) |
@@ -382,7 +382,7 @@ static int page_referenced_file(struct page *page, | |||
382 | * counting on behalf of references from different | 382 | * counting on behalf of references from different |
383 | * cgroups | 383 | * cgroups |
384 | */ | 384 | */ |
385 | if (mem_cont && !vm_match_cgroup(vma->vm_mm, mem_cont)) | 385 | if (mem_cont && !mm_match_cgroup(vma->vm_mm, mem_cont)) |
386 | continue; | 386 | continue; |
387 | if ((vma->vm_flags & (VM_LOCKED|VM_MAYSHARE)) | 387 | if ((vma->vm_flags & (VM_LOCKED|VM_MAYSHARE)) |
388 | == (VM_LOCKED|VM_MAYSHARE)) { | 388 | == (VM_LOCKED|VM_MAYSHARE)) { |
diff --git a/mm/shmem.c b/mm/shmem.c index 90b576cbc06e..3372bc579e89 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -1370,14 +1370,17 @@ repeat: | |||
1370 | shmem_swp_unmap(entry); | 1370 | shmem_swp_unmap(entry); |
1371 | spin_unlock(&info->lock); | 1371 | spin_unlock(&info->lock); |
1372 | unlock_page(swappage); | 1372 | unlock_page(swappage); |
1373 | page_cache_release(swappage); | ||
1374 | if (error == -ENOMEM) { | 1373 | if (error == -ENOMEM) { |
1375 | /* allow reclaim from this memory cgroup */ | 1374 | /* allow reclaim from this memory cgroup */ |
1376 | error = mem_cgroup_cache_charge(NULL, | 1375 | error = mem_cgroup_cache_charge(swappage, |
1377 | current->mm, gfp & ~__GFP_HIGHMEM); | 1376 | current->mm, gfp & ~__GFP_HIGHMEM); |
1378 | if (error) | 1377 | if (error) { |
1378 | page_cache_release(swappage); | ||
1379 | goto failed; | 1379 | goto failed; |
1380 | } | ||
1381 | mem_cgroup_uncharge_page(swappage); | ||
1380 | } | 1382 | } |
1383 | page_cache_release(swappage); | ||
1381 | goto repeat; | 1384 | goto repeat; |
1382 | } | 1385 | } |
1383 | } else if (sgp == SGP_READ && !filepage) { | 1386 | } else if (sgp == SGP_READ && !filepage) { |
@@ -333,7 +333,7 @@ static __always_inline int index_of(const size_t size) | |||
333 | return i; \ | 333 | return i; \ |
334 | else \ | 334 | else \ |
335 | i++; | 335 | i++; |
336 | #include "linux/kmalloc_sizes.h" | 336 | #include <linux/kmalloc_sizes.h> |
337 | #undef CACHE | 337 | #undef CACHE |
338 | __bad_size(); | 338 | __bad_size(); |
339 | } else | 339 | } else |
@@ -2964,11 +2964,10 @@ static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags) | |||
2964 | struct array_cache *ac; | 2964 | struct array_cache *ac; |
2965 | int node; | 2965 | int node; |
2966 | 2966 | ||
2967 | node = numa_node_id(); | 2967 | retry: |
2968 | |||
2969 | check_irq_off(); | 2968 | check_irq_off(); |
2969 | node = numa_node_id(); | ||
2970 | ac = cpu_cache_get(cachep); | 2970 | ac = cpu_cache_get(cachep); |
2971 | retry: | ||
2972 | batchcount = ac->batchcount; | 2971 | batchcount = ac->batchcount; |
2973 | if (!ac->touched && batchcount > BATCHREFILL_LIMIT) { | 2972 | if (!ac->touched && batchcount > BATCHREFILL_LIMIT) { |
2974 | /* | 2973 | /* |
@@ -3280,7 +3279,7 @@ retry: | |||
3280 | if (local_flags & __GFP_WAIT) | 3279 | if (local_flags & __GFP_WAIT) |
3281 | local_irq_enable(); | 3280 | local_irq_enable(); |
3282 | kmem_flagcheck(cache, flags); | 3281 | kmem_flagcheck(cache, flags); |
3283 | obj = kmem_getpages(cache, flags, -1); | 3282 | obj = kmem_getpages(cache, local_flags, -1); |
3284 | if (local_flags & __GFP_WAIT) | 3283 | if (local_flags & __GFP_WAIT) |
3285 | local_irq_disable(); | 3284 | local_irq_disable(); |
3286 | if (obj) { | 3285 | if (obj) { |
@@ -291,32 +291,16 @@ static inline struct kmem_cache_cpu *get_cpu_slab(struct kmem_cache *s, int cpu) | |||
291 | #endif | 291 | #endif |
292 | } | 292 | } |
293 | 293 | ||
294 | /* | 294 | /* Verify that a pointer has an address that is valid within a slab page */ |
295 | * The end pointer in a slab is special. It points to the first object in the | ||
296 | * slab but has bit 0 set to mark it. | ||
297 | * | ||
298 | * Note that SLUB relies on page_mapping returning NULL for pages with bit 0 | ||
299 | * in the mapping set. | ||
300 | */ | ||
301 | static inline int is_end(void *addr) | ||
302 | { | ||
303 | return (unsigned long)addr & PAGE_MAPPING_ANON; | ||
304 | } | ||
305 | |||
306 | static void *slab_address(struct page *page) | ||
307 | { | ||
308 | return page->end - PAGE_MAPPING_ANON; | ||
309 | } | ||
310 | |||
311 | static inline int check_valid_pointer(struct kmem_cache *s, | 295 | static inline int check_valid_pointer(struct kmem_cache *s, |
312 | struct page *page, const void *object) | 296 | struct page *page, const void *object) |
313 | { | 297 | { |
314 | void *base; | 298 | void *base; |
315 | 299 | ||
316 | if (object == page->end) | 300 | if (!object) |
317 | return 1; | 301 | return 1; |
318 | 302 | ||
319 | base = slab_address(page); | 303 | base = page_address(page); |
320 | if (object < base || object >= base + s->objects * s->size || | 304 | if (object < base || object >= base + s->objects * s->size || |
321 | (object - base) % s->size) { | 305 | (object - base) % s->size) { |
322 | return 0; | 306 | return 0; |
@@ -349,8 +333,7 @@ static inline void set_freepointer(struct kmem_cache *s, void *object, void *fp) | |||
349 | 333 | ||
350 | /* Scan freelist */ | 334 | /* Scan freelist */ |
351 | #define for_each_free_object(__p, __s, __free) \ | 335 | #define for_each_free_object(__p, __s, __free) \ |
352 | for (__p = (__free); (__p) != page->end; __p = get_freepointer((__s),\ | 336 | for (__p = (__free); __p; __p = get_freepointer((__s), __p)) |
353 | __p)) | ||
354 | 337 | ||
355 | /* Determine object index from a given position */ | 338 | /* Determine object index from a given position */ |
356 | static inline int slab_index(void *p, struct kmem_cache *s, void *addr) | 339 | static inline int slab_index(void *p, struct kmem_cache *s, void *addr) |
@@ -502,7 +485,7 @@ static void slab_fix(struct kmem_cache *s, char *fmt, ...) | |||
502 | static void print_trailer(struct kmem_cache *s, struct page *page, u8 *p) | 485 | static void print_trailer(struct kmem_cache *s, struct page *page, u8 *p) |
503 | { | 486 | { |
504 | unsigned int off; /* Offset of last byte */ | 487 | unsigned int off; /* Offset of last byte */ |
505 | u8 *addr = slab_address(page); | 488 | u8 *addr = page_address(page); |
506 | 489 | ||
507 | print_tracking(s, p); | 490 | print_tracking(s, p); |
508 | 491 | ||
@@ -637,7 +620,7 @@ static int check_bytes_and_report(struct kmem_cache *s, struct page *page, | |||
637 | * A. Free pointer (if we cannot overwrite object on free) | 620 | * A. Free pointer (if we cannot overwrite object on free) |
638 | * B. Tracking data for SLAB_STORE_USER | 621 | * B. Tracking data for SLAB_STORE_USER |
639 | * C. Padding to reach required alignment boundary or at mininum | 622 | * C. Padding to reach required alignment boundary or at mininum |
640 | * one word if debuggin is on to be able to detect writes | 623 | * one word if debugging is on to be able to detect writes |
641 | * before the word boundary. | 624 | * before the word boundary. |
642 | * | 625 | * |
643 | * Padding is done using 0x5a (POISON_INUSE) | 626 | * Padding is done using 0x5a (POISON_INUSE) |
@@ -680,7 +663,7 @@ static int slab_pad_check(struct kmem_cache *s, struct page *page) | |||
680 | if (!(s->flags & SLAB_POISON)) | 663 | if (!(s->flags & SLAB_POISON)) |
681 | return 1; | 664 | return 1; |
682 | 665 | ||
683 | start = slab_address(page); | 666 | start = page_address(page); |
684 | end = start + (PAGE_SIZE << s->order); | 667 | end = start + (PAGE_SIZE << s->order); |
685 | length = s->objects * s->size; | 668 | length = s->objects * s->size; |
686 | remainder = end - (start + length); | 669 | remainder = end - (start + length); |
@@ -748,7 +731,7 @@ static int check_object(struct kmem_cache *s, struct page *page, | |||
748 | * of the free objects in this slab. May cause | 731 | * of the free objects in this slab. May cause |
749 | * another error because the object count is now wrong. | 732 | * another error because the object count is now wrong. |
750 | */ | 733 | */ |
751 | set_freepointer(s, p, page->end); | 734 | set_freepointer(s, p, NULL); |
752 | return 0; | 735 | return 0; |
753 | } | 736 | } |
754 | return 1; | 737 | return 1; |
@@ -782,18 +765,18 @@ static int on_freelist(struct kmem_cache *s, struct page *page, void *search) | |||
782 | void *fp = page->freelist; | 765 | void *fp = page->freelist; |
783 | void *object = NULL; | 766 | void *object = NULL; |
784 | 767 | ||
785 | while (fp != page->end && nr <= s->objects) { | 768 | while (fp && nr <= s->objects) { |
786 | if (fp == search) | 769 | if (fp == search) |
787 | return 1; | 770 | return 1; |
788 | if (!check_valid_pointer(s, page, fp)) { | 771 | if (!check_valid_pointer(s, page, fp)) { |
789 | if (object) { | 772 | if (object) { |
790 | object_err(s, page, object, | 773 | object_err(s, page, object, |
791 | "Freechain corrupt"); | 774 | "Freechain corrupt"); |
792 | set_freepointer(s, object, page->end); | 775 | set_freepointer(s, object, NULL); |
793 | break; | 776 | break; |
794 | } else { | 777 | } else { |
795 | slab_err(s, page, "Freepointer corrupt"); | 778 | slab_err(s, page, "Freepointer corrupt"); |
796 | page->freelist = page->end; | 779 | page->freelist = NULL; |
797 | page->inuse = s->objects; | 780 | page->inuse = s->objects; |
798 | slab_fix(s, "Freelist cleared"); | 781 | slab_fix(s, "Freelist cleared"); |
799 | return 0; | 782 | return 0; |
@@ -870,7 +853,7 @@ static int alloc_debug_processing(struct kmem_cache *s, struct page *page, | |||
870 | if (!check_slab(s, page)) | 853 | if (!check_slab(s, page)) |
871 | goto bad; | 854 | goto bad; |
872 | 855 | ||
873 | if (object && !on_freelist(s, page, object)) { | 856 | if (!on_freelist(s, page, object)) { |
874 | object_err(s, page, object, "Object already allocated"); | 857 | object_err(s, page, object, "Object already allocated"); |
875 | goto bad; | 858 | goto bad; |
876 | } | 859 | } |
@@ -880,7 +863,7 @@ static int alloc_debug_processing(struct kmem_cache *s, struct page *page, | |||
880 | goto bad; | 863 | goto bad; |
881 | } | 864 | } |
882 | 865 | ||
883 | if (object && !check_object(s, page, object, 0)) | 866 | if (!check_object(s, page, object, 0)) |
884 | goto bad; | 867 | goto bad; |
885 | 868 | ||
886 | /* Success perform special debug activities for allocs */ | 869 | /* Success perform special debug activities for allocs */ |
@@ -899,7 +882,7 @@ bad: | |||
899 | */ | 882 | */ |
900 | slab_fix(s, "Marking all objects used"); | 883 | slab_fix(s, "Marking all objects used"); |
901 | page->inuse = s->objects; | 884 | page->inuse = s->objects; |
902 | page->freelist = page->end; | 885 | page->freelist = NULL; |
903 | } | 886 | } |
904 | return 0; | 887 | return 0; |
905 | } | 888 | } |
@@ -939,7 +922,7 @@ static int free_debug_processing(struct kmem_cache *s, struct page *page, | |||
939 | } | 922 | } |
940 | 923 | ||
941 | /* Special debug activities for freeing objects */ | 924 | /* Special debug activities for freeing objects */ |
942 | if (!SlabFrozen(page) && page->freelist == page->end) | 925 | if (!SlabFrozen(page) && !page->freelist) |
943 | remove_full(s, page); | 926 | remove_full(s, page); |
944 | if (s->flags & SLAB_STORE_USER) | 927 | if (s->flags & SLAB_STORE_USER) |
945 | set_track(s, object, TRACK_FREE, addr); | 928 | set_track(s, object, TRACK_FREE, addr); |
@@ -1015,30 +998,11 @@ static unsigned long kmem_cache_flags(unsigned long objsize, | |||
1015 | void (*ctor)(struct kmem_cache *, void *)) | 998 | void (*ctor)(struct kmem_cache *, void *)) |
1016 | { | 999 | { |
1017 | /* | 1000 | /* |
1018 | * The page->offset field is only 16 bit wide. This is an offset | 1001 | * Enable debugging if selected on the kernel commandline. |
1019 | * in units of words from the beginning of an object. If the slab | ||
1020 | * size is bigger then we cannot move the free pointer behind the | ||
1021 | * object anymore. | ||
1022 | * | ||
1023 | * On 32 bit platforms the limit is 256k. On 64bit platforms | ||
1024 | * the limit is 512k. | ||
1025 | * | ||
1026 | * Debugging or ctor may create a need to move the free | ||
1027 | * pointer. Fail if this happens. | ||
1028 | */ | 1002 | */ |
1029 | if (objsize >= 65535 * sizeof(void *)) { | 1003 | if (slub_debug && (!slub_debug_slabs || |
1030 | BUG_ON(flags & (SLAB_RED_ZONE | SLAB_POISON | | 1004 | strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs)) == 0)) |
1031 | SLAB_STORE_USER | SLAB_DESTROY_BY_RCU)); | 1005 | flags |= slub_debug; |
1032 | BUG_ON(ctor); | ||
1033 | } else { | ||
1034 | /* | ||
1035 | * Enable debugging if selected on the kernel commandline. | ||
1036 | */ | ||
1037 | if (slub_debug && (!slub_debug_slabs || | ||
1038 | strncmp(slub_debug_slabs, name, | ||
1039 | strlen(slub_debug_slabs)) == 0)) | ||
1040 | flags |= slub_debug; | ||
1041 | } | ||
1042 | 1006 | ||
1043 | return flags; | 1007 | return flags; |
1044 | } | 1008 | } |
@@ -1124,7 +1088,6 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node) | |||
1124 | SetSlabDebug(page); | 1088 | SetSlabDebug(page); |
1125 | 1089 | ||
1126 | start = page_address(page); | 1090 | start = page_address(page); |
1127 | page->end = start + 1; | ||
1128 | 1091 | ||
1129 | if (unlikely(s->flags & SLAB_POISON)) | 1092 | if (unlikely(s->flags & SLAB_POISON)) |
1130 | memset(start, POISON_INUSE, PAGE_SIZE << s->order); | 1093 | memset(start, POISON_INUSE, PAGE_SIZE << s->order); |
@@ -1136,7 +1099,7 @@ static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node) | |||
1136 | last = p; | 1099 | last = p; |
1137 | } | 1100 | } |
1138 | setup_object(s, page, last); | 1101 | setup_object(s, page, last); |
1139 | set_freepointer(s, last, page->end); | 1102 | set_freepointer(s, last, NULL); |
1140 | 1103 | ||
1141 | page->freelist = start; | 1104 | page->freelist = start; |
1142 | page->inuse = 0; | 1105 | page->inuse = 0; |
@@ -1152,7 +1115,7 @@ static void __free_slab(struct kmem_cache *s, struct page *page) | |||
1152 | void *p; | 1115 | void *p; |
1153 | 1116 | ||
1154 | slab_pad_check(s, page); | 1117 | slab_pad_check(s, page); |
1155 | for_each_object(p, s, slab_address(page)) | 1118 | for_each_object(p, s, page_address(page)) |
1156 | check_object(s, page, p, 0); | 1119 | check_object(s, page, p, 0); |
1157 | ClearSlabDebug(page); | 1120 | ClearSlabDebug(page); |
1158 | } | 1121 | } |
@@ -1162,7 +1125,6 @@ static void __free_slab(struct kmem_cache *s, struct page *page) | |||
1162 | NR_SLAB_RECLAIMABLE : NR_SLAB_UNRECLAIMABLE, | 1125 | NR_SLAB_RECLAIMABLE : NR_SLAB_UNRECLAIMABLE, |
1163 | -pages); | 1126 | -pages); |
1164 | 1127 | ||
1165 | page->mapping = NULL; | ||
1166 | __free_pages(page, s->order); | 1128 | __free_pages(page, s->order); |
1167 | } | 1129 | } |
1168 | 1130 | ||
@@ -1307,7 +1269,7 @@ static struct page *get_any_partial(struct kmem_cache *s, gfp_t flags) | |||
1307 | * may return off node objects because partial slabs are obtained | 1269 | * may return off node objects because partial slabs are obtained |
1308 | * from other nodes and filled up. | 1270 | * from other nodes and filled up. |
1309 | * | 1271 | * |
1310 | * If /sys/slab/xx/defrag_ratio is set to 100 (which makes | 1272 | * If /sys/kernel/slab/xx/defrag_ratio is set to 100 (which makes |
1311 | * defrag_ratio = 1000) then every (well almost) allocation will | 1273 | * defrag_ratio = 1000) then every (well almost) allocation will |
1312 | * first attempt to defrag slab caches on other nodes. This means | 1274 | * first attempt to defrag slab caches on other nodes. This means |
1313 | * scanning over all nodes to look for partial slabs which may be | 1275 | * scanning over all nodes to look for partial slabs which may be |
@@ -1366,7 +1328,7 @@ static void unfreeze_slab(struct kmem_cache *s, struct page *page, int tail) | |||
1366 | ClearSlabFrozen(page); | 1328 | ClearSlabFrozen(page); |
1367 | if (page->inuse) { | 1329 | if (page->inuse) { |
1368 | 1330 | ||
1369 | if (page->freelist != page->end) { | 1331 | if (page->freelist) { |
1370 | add_partial(n, page, tail); | 1332 | add_partial(n, page, tail); |
1371 | stat(c, tail ? DEACTIVATE_TO_TAIL : DEACTIVATE_TO_HEAD); | 1333 | stat(c, tail ? DEACTIVATE_TO_TAIL : DEACTIVATE_TO_HEAD); |
1372 | } else { | 1334 | } else { |
@@ -1382,9 +1344,11 @@ static void unfreeze_slab(struct kmem_cache *s, struct page *page, int tail) | |||
1382 | * Adding an empty slab to the partial slabs in order | 1344 | * Adding an empty slab to the partial slabs in order |
1383 | * to avoid page allocator overhead. This slab needs | 1345 | * to avoid page allocator overhead. This slab needs |
1384 | * to come after the other slabs with objects in | 1346 | * to come after the other slabs with objects in |
1385 | * order to fill them up. That way the size of the | 1347 | * so that the others get filled first. That way the |
1386 | * partial list stays small. kmem_cache_shrink can | 1348 | * size of the partial list stays small. |
1387 | * reclaim empty slabs from the partial list. | 1349 | * |
1350 | * kmem_cache_shrink can reclaim any empty slabs from the | ||
1351 | * partial list. | ||
1388 | */ | 1352 | */ |
1389 | add_partial(n, page, 1); | 1353 | add_partial(n, page, 1); |
1390 | slab_unlock(page); | 1354 | slab_unlock(page); |
@@ -1404,18 +1368,14 @@ static void deactivate_slab(struct kmem_cache *s, struct kmem_cache_cpu *c) | |||
1404 | struct page *page = c->page; | 1368 | struct page *page = c->page; |
1405 | int tail = 1; | 1369 | int tail = 1; |
1406 | 1370 | ||
1407 | if (c->freelist) | 1371 | if (page->freelist) |
1408 | stat(c, DEACTIVATE_REMOTE_FREES); | 1372 | stat(c, DEACTIVATE_REMOTE_FREES); |
1409 | /* | 1373 | /* |
1410 | * Merge cpu freelist into freelist. Typically we get here | 1374 | * Merge cpu freelist into slab freelist. Typically we get here |
1411 | * because both freelists are empty. So this is unlikely | 1375 | * because both freelists are empty. So this is unlikely |
1412 | * to occur. | 1376 | * to occur. |
1413 | * | ||
1414 | * We need to use _is_end here because deactivate slab may | ||
1415 | * be called for a debug slab. Then c->freelist may contain | ||
1416 | * a dummy pointer. | ||
1417 | */ | 1377 | */ |
1418 | while (unlikely(!is_end(c->freelist))) { | 1378 | while (unlikely(c->freelist)) { |
1419 | void **object; | 1379 | void **object; |
1420 | 1380 | ||
1421 | tail = 0; /* Hot objects. Put the slab first */ | 1381 | tail = 0; /* Hot objects. Put the slab first */ |
@@ -1442,6 +1402,7 @@ static inline void flush_slab(struct kmem_cache *s, struct kmem_cache_cpu *c) | |||
1442 | 1402 | ||
1443 | /* | 1403 | /* |
1444 | * Flush cpu slab. | 1404 | * Flush cpu slab. |
1405 | * | ||
1445 | * Called from IPI handler with interrupts disabled. | 1406 | * Called from IPI handler with interrupts disabled. |
1446 | */ | 1407 | */ |
1447 | static inline void __flush_cpu_slab(struct kmem_cache *s, int cpu) | 1408 | static inline void __flush_cpu_slab(struct kmem_cache *s, int cpu) |
@@ -1500,7 +1461,8 @@ static inline int node_match(struct kmem_cache_cpu *c, int node) | |||
1500 | * rest of the freelist to the lockless freelist. | 1461 | * rest of the freelist to the lockless freelist. |
1501 | * | 1462 | * |
1502 | * And if we were unable to get a new slab from the partial slab lists then | 1463 | * And if we were unable to get a new slab from the partial slab lists then |
1503 | * we need to allocate a new slab. This is slowest path since we may sleep. | 1464 | * we need to allocate a new slab. This is the slowest path since it involves |
1465 | * a call to the page allocator and the setup of a new slab. | ||
1504 | */ | 1466 | */ |
1505 | static void *__slab_alloc(struct kmem_cache *s, | 1467 | static void *__slab_alloc(struct kmem_cache *s, |
1506 | gfp_t gfpflags, int node, void *addr, struct kmem_cache_cpu *c) | 1468 | gfp_t gfpflags, int node, void *addr, struct kmem_cache_cpu *c) |
@@ -1514,18 +1476,19 @@ static void *__slab_alloc(struct kmem_cache *s, | |||
1514 | slab_lock(c->page); | 1476 | slab_lock(c->page); |
1515 | if (unlikely(!node_match(c, node))) | 1477 | if (unlikely(!node_match(c, node))) |
1516 | goto another_slab; | 1478 | goto another_slab; |
1479 | |||
1517 | stat(c, ALLOC_REFILL); | 1480 | stat(c, ALLOC_REFILL); |
1481 | |||
1518 | load_freelist: | 1482 | load_freelist: |
1519 | object = c->page->freelist; | 1483 | object = c->page->freelist; |
1520 | if (unlikely(object == c->page->end)) | 1484 | if (unlikely(!object)) |
1521 | goto another_slab; | 1485 | goto another_slab; |
1522 | if (unlikely(SlabDebug(c->page))) | 1486 | if (unlikely(SlabDebug(c->page))) |
1523 | goto debug; | 1487 | goto debug; |
1524 | 1488 | ||
1525 | object = c->page->freelist; | ||
1526 | c->freelist = object[c->offset]; | 1489 | c->freelist = object[c->offset]; |
1527 | c->page->inuse = s->objects; | 1490 | c->page->inuse = s->objects; |
1528 | c->page->freelist = c->page->end; | 1491 | c->page->freelist = NULL; |
1529 | c->node = page_to_nid(c->page); | 1492 | c->node = page_to_nid(c->page); |
1530 | unlock_out: | 1493 | unlock_out: |
1531 | slab_unlock(c->page); | 1494 | slab_unlock(c->page); |
@@ -1578,7 +1541,6 @@ new_slab: | |||
1578 | 1541 | ||
1579 | return NULL; | 1542 | return NULL; |
1580 | debug: | 1543 | debug: |
1581 | object = c->page->freelist; | ||
1582 | if (!alloc_debug_processing(s, c->page, object, addr)) | 1544 | if (!alloc_debug_processing(s, c->page, object, addr)) |
1583 | goto another_slab; | 1545 | goto another_slab; |
1584 | 1546 | ||
@@ -1607,7 +1569,7 @@ static __always_inline void *slab_alloc(struct kmem_cache *s, | |||
1607 | 1569 | ||
1608 | local_irq_save(flags); | 1570 | local_irq_save(flags); |
1609 | c = get_cpu_slab(s, smp_processor_id()); | 1571 | c = get_cpu_slab(s, smp_processor_id()); |
1610 | if (unlikely(is_end(c->freelist) || !node_match(c, node))) | 1572 | if (unlikely(!c->freelist || !node_match(c, node))) |
1611 | 1573 | ||
1612 | object = __slab_alloc(s, gfpflags, node, addr, c); | 1574 | object = __slab_alloc(s, gfpflags, node, addr, c); |
1613 | 1575 | ||
@@ -1659,6 +1621,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, | |||
1659 | 1621 | ||
1660 | if (unlikely(SlabDebug(page))) | 1622 | if (unlikely(SlabDebug(page))) |
1661 | goto debug; | 1623 | goto debug; |
1624 | |||
1662 | checks_ok: | 1625 | checks_ok: |
1663 | prior = object[offset] = page->freelist; | 1626 | prior = object[offset] = page->freelist; |
1664 | page->freelist = object; | 1627 | page->freelist = object; |
@@ -1673,11 +1636,10 @@ checks_ok: | |||
1673 | goto slab_empty; | 1636 | goto slab_empty; |
1674 | 1637 | ||
1675 | /* | 1638 | /* |
1676 | * Objects left in the slab. If it | 1639 | * Objects left in the slab. If it was not on the partial list before |
1677 | * was not on the partial list before | ||
1678 | * then add it. | 1640 | * then add it. |
1679 | */ | 1641 | */ |
1680 | if (unlikely(prior == page->end)) { | 1642 | if (unlikely(!prior)) { |
1681 | add_partial(get_node(s, page_to_nid(page)), page, 1); | 1643 | add_partial(get_node(s, page_to_nid(page)), page, 1); |
1682 | stat(c, FREE_ADD_PARTIAL); | 1644 | stat(c, FREE_ADD_PARTIAL); |
1683 | } | 1645 | } |
@@ -1687,7 +1649,7 @@ out_unlock: | |||
1687 | return; | 1649 | return; |
1688 | 1650 | ||
1689 | slab_empty: | 1651 | slab_empty: |
1690 | if (prior != page->end) { | 1652 | if (prior) { |
1691 | /* | 1653 | /* |
1692 | * Slab still on the partial list. | 1654 | * Slab still on the partial list. |
1693 | */ | 1655 | */ |
@@ -1724,8 +1686,8 @@ static __always_inline void slab_free(struct kmem_cache *s, | |||
1724 | unsigned long flags; | 1686 | unsigned long flags; |
1725 | 1687 | ||
1726 | local_irq_save(flags); | 1688 | local_irq_save(flags); |
1727 | debug_check_no_locks_freed(object, s->objsize); | ||
1728 | c = get_cpu_slab(s, smp_processor_id()); | 1689 | c = get_cpu_slab(s, smp_processor_id()); |
1690 | debug_check_no_locks_freed(object, c->objsize); | ||
1729 | if (likely(page == c->page && c->node >= 0)) { | 1691 | if (likely(page == c->page && c->node >= 0)) { |
1730 | object[c->offset] = c->freelist; | 1692 | object[c->offset] = c->freelist; |
1731 | c->freelist = object; | 1693 | c->freelist = object; |
@@ -1888,20 +1850,21 @@ static unsigned long calculate_alignment(unsigned long flags, | |||
1888 | unsigned long align, unsigned long size) | 1850 | unsigned long align, unsigned long size) |
1889 | { | 1851 | { |
1890 | /* | 1852 | /* |
1891 | * If the user wants hardware cache aligned objects then | 1853 | * If the user wants hardware cache aligned objects then follow that |
1892 | * follow that suggestion if the object is sufficiently | 1854 | * suggestion if the object is sufficiently large. |
1893 | * large. | ||
1894 | * | 1855 | * |
1895 | * The hardware cache alignment cannot override the | 1856 | * The hardware cache alignment cannot override the specified |
1896 | * specified alignment though. If that is greater | 1857 | * alignment though. If that is greater then use it. |
1897 | * then use it. | ||
1898 | */ | 1858 | */ |
1899 | if ((flags & SLAB_HWCACHE_ALIGN) && | 1859 | if (flags & SLAB_HWCACHE_ALIGN) { |
1900 | size > cache_line_size() / 2) | 1860 | unsigned long ralign = cache_line_size(); |
1901 | return max_t(unsigned long, align, cache_line_size()); | 1861 | while (size <= ralign / 2) |
1862 | ralign /= 2; | ||
1863 | align = max(align, ralign); | ||
1864 | } | ||
1902 | 1865 | ||
1903 | if (align < ARCH_SLAB_MINALIGN) | 1866 | if (align < ARCH_SLAB_MINALIGN) |
1904 | return ARCH_SLAB_MINALIGN; | 1867 | align = ARCH_SLAB_MINALIGN; |
1905 | 1868 | ||
1906 | return ALIGN(align, sizeof(void *)); | 1869 | return ALIGN(align, sizeof(void *)); |
1907 | } | 1870 | } |
@@ -1910,7 +1873,7 @@ static void init_kmem_cache_cpu(struct kmem_cache *s, | |||
1910 | struct kmem_cache_cpu *c) | 1873 | struct kmem_cache_cpu *c) |
1911 | { | 1874 | { |
1912 | c->page = NULL; | 1875 | c->page = NULL; |
1913 | c->freelist = (void *)PAGE_MAPPING_ANON; | 1876 | c->freelist = NULL; |
1914 | c->node = 0; | 1877 | c->node = 0; |
1915 | c->offset = s->offset / sizeof(void *); | 1878 | c->offset = s->offset / sizeof(void *); |
1916 | c->objsize = s->objsize; | 1879 | c->objsize = s->objsize; |
@@ -2092,6 +2055,7 @@ static struct kmem_cache_node *early_kmem_cache_node_alloc(gfp_t gfpflags, | |||
2092 | #endif | 2055 | #endif |
2093 | init_kmem_cache_node(n); | 2056 | init_kmem_cache_node(n); |
2094 | atomic_long_inc(&n->nr_slabs); | 2057 | atomic_long_inc(&n->nr_slabs); |
2058 | |||
2095 | /* | 2059 | /* |
2096 | * lockdep requires consistent irq usage for each lock | 2060 | * lockdep requires consistent irq usage for each lock |
2097 | * so even though there cannot be a race this early in | 2061 | * so even though there cannot be a race this early in |
@@ -2173,6 +2137,14 @@ static int calculate_sizes(struct kmem_cache *s) | |||
2173 | unsigned long align = s->align; | 2137 | unsigned long align = s->align; |
2174 | 2138 | ||
2175 | /* | 2139 | /* |
2140 | * Round up object size to the next word boundary. We can only | ||
2141 | * place the free pointer at word boundaries and this determines | ||
2142 | * the possible location of the free pointer. | ||
2143 | */ | ||
2144 | size = ALIGN(size, sizeof(void *)); | ||
2145 | |||
2146 | #ifdef CONFIG_SLUB_DEBUG | ||
2147 | /* | ||
2176 | * Determine if we can poison the object itself. If the user of | 2148 | * Determine if we can poison the object itself. If the user of |
2177 | * the slab may touch the object after free or before allocation | 2149 | * the slab may touch the object after free or before allocation |
2178 | * then we should never poison the object itself. | 2150 | * then we should never poison the object itself. |
@@ -2183,14 +2155,7 @@ static int calculate_sizes(struct kmem_cache *s) | |||
2183 | else | 2155 | else |
2184 | s->flags &= ~__OBJECT_POISON; | 2156 | s->flags &= ~__OBJECT_POISON; |
2185 | 2157 | ||
2186 | /* | ||
2187 | * Round up object size to the next word boundary. We can only | ||
2188 | * place the free pointer at word boundaries and this determines | ||
2189 | * the possible location of the free pointer. | ||
2190 | */ | ||
2191 | size = ALIGN(size, sizeof(void *)); | ||
2192 | 2158 | ||
2193 | #ifdef CONFIG_SLUB_DEBUG | ||
2194 | /* | 2159 | /* |
2195 | * If we are Redzoning then check if there is some space between the | 2160 | * If we are Redzoning then check if there is some space between the |
2196 | * end of the object and the free pointer. If not then add an | 2161 | * end of the object and the free pointer. If not then add an |
@@ -2343,7 +2308,7 @@ int kmem_ptr_validate(struct kmem_cache *s, const void *object) | |||
2343 | /* | 2308 | /* |
2344 | * We could also check if the object is on the slabs freelist. | 2309 | * We could also check if the object is on the slabs freelist. |
2345 | * But this would be too expensive and it seems that the main | 2310 | * But this would be too expensive and it seems that the main |
2346 | * purpose of kmem_ptr_valid is to check if the object belongs | 2311 | * purpose of kmem_ptr_valid() is to check if the object belongs |
2347 | * to a certain slab. | 2312 | * to a certain slab. |
2348 | */ | 2313 | */ |
2349 | return 1; | 2314 | return 1; |
@@ -2630,13 +2595,24 @@ void *__kmalloc(size_t size, gfp_t flags) | |||
2630 | } | 2595 | } |
2631 | EXPORT_SYMBOL(__kmalloc); | 2596 | EXPORT_SYMBOL(__kmalloc); |
2632 | 2597 | ||
2598 | static void *kmalloc_large_node(size_t size, gfp_t flags, int node) | ||
2599 | { | ||
2600 | struct page *page = alloc_pages_node(node, flags | __GFP_COMP, | ||
2601 | get_order(size)); | ||
2602 | |||
2603 | if (page) | ||
2604 | return page_address(page); | ||
2605 | else | ||
2606 | return NULL; | ||
2607 | } | ||
2608 | |||
2633 | #ifdef CONFIG_NUMA | 2609 | #ifdef CONFIG_NUMA |
2634 | void *__kmalloc_node(size_t size, gfp_t flags, int node) | 2610 | void *__kmalloc_node(size_t size, gfp_t flags, int node) |
2635 | { | 2611 | { |
2636 | struct kmem_cache *s; | 2612 | struct kmem_cache *s; |
2637 | 2613 | ||
2638 | if (unlikely(size > PAGE_SIZE)) | 2614 | if (unlikely(size > PAGE_SIZE)) |
2639 | return kmalloc_large(size, flags); | 2615 | return kmalloc_large_node(size, flags, node); |
2640 | 2616 | ||
2641 | s = get_slab(size, flags); | 2617 | s = get_slab(size, flags); |
2642 | 2618 | ||
@@ -2653,19 +2629,17 @@ size_t ksize(const void *object) | |||
2653 | struct page *page; | 2629 | struct page *page; |
2654 | struct kmem_cache *s; | 2630 | struct kmem_cache *s; |
2655 | 2631 | ||
2656 | BUG_ON(!object); | ||
2657 | if (unlikely(object == ZERO_SIZE_PTR)) | 2632 | if (unlikely(object == ZERO_SIZE_PTR)) |
2658 | return 0; | 2633 | return 0; |
2659 | 2634 | ||
2660 | page = virt_to_head_page(object); | 2635 | page = virt_to_head_page(object); |
2661 | BUG_ON(!page); | ||
2662 | 2636 | ||
2663 | if (unlikely(!PageSlab(page))) | 2637 | if (unlikely(!PageSlab(page))) |
2664 | return PAGE_SIZE << compound_order(page); | 2638 | return PAGE_SIZE << compound_order(page); |
2665 | 2639 | ||
2666 | s = page->slab; | 2640 | s = page->slab; |
2667 | BUG_ON(!s); | ||
2668 | 2641 | ||
2642 | #ifdef CONFIG_SLUB_DEBUG | ||
2669 | /* | 2643 | /* |
2670 | * Debugging requires use of the padding between object | 2644 | * Debugging requires use of the padding between object |
2671 | * and whatever may come after it. | 2645 | * and whatever may come after it. |
@@ -2673,6 +2647,7 @@ size_t ksize(const void *object) | |||
2673 | if (s->flags & (SLAB_RED_ZONE | SLAB_POISON)) | 2647 | if (s->flags & (SLAB_RED_ZONE | SLAB_POISON)) |
2674 | return s->objsize; | 2648 | return s->objsize; |
2675 | 2649 | ||
2650 | #endif | ||
2676 | /* | 2651 | /* |
2677 | * If we have the need to store the freelist pointer | 2652 | * If we have the need to store the freelist pointer |
2678 | * back there or track user information then we can | 2653 | * back there or track user information then we can |
@@ -2680,7 +2655,6 @@ size_t ksize(const void *object) | |||
2680 | */ | 2655 | */ |
2681 | if (s->flags & (SLAB_DESTROY_BY_RCU | SLAB_STORE_USER)) | 2656 | if (s->flags & (SLAB_DESTROY_BY_RCU | SLAB_STORE_USER)) |
2682 | return s->inuse; | 2657 | return s->inuse; |
2683 | |||
2684 | /* | 2658 | /* |
2685 | * Else we can use all the padding etc for the allocation | 2659 | * Else we can use all the padding etc for the allocation |
2686 | */ | 2660 | */ |
@@ -2957,7 +2931,7 @@ void __init kmem_cache_init(void) | |||
2957 | /* | 2931 | /* |
2958 | * Patch up the size_index table if we have strange large alignment | 2932 | * Patch up the size_index table if we have strange large alignment |
2959 | * requirements for the kmalloc array. This is only the case for | 2933 | * requirements for the kmalloc array. This is only the case for |
2960 | * mips it seems. The standard arches will not generate any code here. | 2934 | * MIPS it seems. The standard arches will not generate any code here. |
2961 | * | 2935 | * |
2962 | * Largest permitted alignment is 256 bytes due to the way we | 2936 | * Largest permitted alignment is 256 bytes due to the way we |
2963 | * handle the index determination for the smaller caches. | 2937 | * handle the index determination for the smaller caches. |
@@ -2986,7 +2960,6 @@ void __init kmem_cache_init(void) | |||
2986 | kmem_size = sizeof(struct kmem_cache); | 2960 | kmem_size = sizeof(struct kmem_cache); |
2987 | #endif | 2961 | #endif |
2988 | 2962 | ||
2989 | |||
2990 | printk(KERN_INFO | 2963 | printk(KERN_INFO |
2991 | "SLUB: Genslabs=%d, HWalign=%d, Order=%d-%d, MinObjects=%d," | 2964 | "SLUB: Genslabs=%d, HWalign=%d, Order=%d-%d, MinObjects=%d," |
2992 | " CPUs=%d, Nodes=%d\n", | 2965 | " CPUs=%d, Nodes=%d\n", |
@@ -3083,12 +3056,15 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size, | |||
3083 | */ | 3056 | */ |
3084 | for_each_online_cpu(cpu) | 3057 | for_each_online_cpu(cpu) |
3085 | get_cpu_slab(s, cpu)->objsize = s->objsize; | 3058 | get_cpu_slab(s, cpu)->objsize = s->objsize; |
3059 | |||
3086 | s->inuse = max_t(int, s->inuse, ALIGN(size, sizeof(void *))); | 3060 | s->inuse = max_t(int, s->inuse, ALIGN(size, sizeof(void *))); |
3087 | up_write(&slub_lock); | 3061 | up_write(&slub_lock); |
3062 | |||
3088 | if (sysfs_slab_alias(s, name)) | 3063 | if (sysfs_slab_alias(s, name)) |
3089 | goto err; | 3064 | goto err; |
3090 | return s; | 3065 | return s; |
3091 | } | 3066 | } |
3067 | |||
3092 | s = kmalloc(kmem_size, GFP_KERNEL); | 3068 | s = kmalloc(kmem_size, GFP_KERNEL); |
3093 | if (s) { | 3069 | if (s) { |
3094 | if (kmem_cache_open(s, GFP_KERNEL, name, | 3070 | if (kmem_cache_open(s, GFP_KERNEL, name, |
@@ -3184,7 +3160,7 @@ void *__kmalloc_node_track_caller(size_t size, gfp_t gfpflags, | |||
3184 | struct kmem_cache *s; | 3160 | struct kmem_cache *s; |
3185 | 3161 | ||
3186 | if (unlikely(size > PAGE_SIZE)) | 3162 | if (unlikely(size > PAGE_SIZE)) |
3187 | return kmalloc_large(size, gfpflags); | 3163 | return kmalloc_large_node(size, gfpflags, node); |
3188 | 3164 | ||
3189 | s = get_slab(size, gfpflags); | 3165 | s = get_slab(size, gfpflags); |
3190 | 3166 | ||
@@ -3199,7 +3175,7 @@ static int validate_slab(struct kmem_cache *s, struct page *page, | |||
3199 | unsigned long *map) | 3175 | unsigned long *map) |
3200 | { | 3176 | { |
3201 | void *p; | 3177 | void *p; |
3202 | void *addr = slab_address(page); | 3178 | void *addr = page_address(page); |
3203 | 3179 | ||
3204 | if (!check_slab(s, page) || | 3180 | if (!check_slab(s, page) || |
3205 | !on_freelist(s, page, NULL)) | 3181 | !on_freelist(s, page, NULL)) |
@@ -3482,7 +3458,7 @@ static int add_location(struct loc_track *t, struct kmem_cache *s, | |||
3482 | static void process_slab(struct loc_track *t, struct kmem_cache *s, | 3458 | static void process_slab(struct loc_track *t, struct kmem_cache *s, |
3483 | struct page *page, enum track_item alloc) | 3459 | struct page *page, enum track_item alloc) |
3484 | { | 3460 | { |
3485 | void *addr = slab_address(page); | 3461 | void *addr = page_address(page); |
3486 | DECLARE_BITMAP(map, s->objects); | 3462 | DECLARE_BITMAP(map, s->objects); |
3487 | void *p; | 3463 | void *p; |
3488 | 3464 | ||
@@ -3591,8 +3567,8 @@ enum slab_stat_type { | |||
3591 | #define SO_CPU (1 << SL_CPU) | 3567 | #define SO_CPU (1 << SL_CPU) |
3592 | #define SO_OBJECTS (1 << SL_OBJECTS) | 3568 | #define SO_OBJECTS (1 << SL_OBJECTS) |
3593 | 3569 | ||
3594 | static unsigned long slab_objects(struct kmem_cache *s, | 3570 | static ssize_t show_slab_objects(struct kmem_cache *s, |
3595 | char *buf, unsigned long flags) | 3571 | char *buf, unsigned long flags) |
3596 | { | 3572 | { |
3597 | unsigned long total = 0; | 3573 | unsigned long total = 0; |
3598 | int cpu; | 3574 | int cpu; |
@@ -3602,6 +3578,8 @@ static unsigned long slab_objects(struct kmem_cache *s, | |||
3602 | unsigned long *per_cpu; | 3578 | unsigned long *per_cpu; |
3603 | 3579 | ||
3604 | nodes = kzalloc(2 * sizeof(unsigned long) * nr_node_ids, GFP_KERNEL); | 3580 | nodes = kzalloc(2 * sizeof(unsigned long) * nr_node_ids, GFP_KERNEL); |
3581 | if (!nodes) | ||
3582 | return -ENOMEM; | ||
3605 | per_cpu = nodes + nr_node_ids; | 3583 | per_cpu = nodes + nr_node_ids; |
3606 | 3584 | ||
3607 | for_each_possible_cpu(cpu) { | 3585 | for_each_possible_cpu(cpu) { |
@@ -3754,25 +3732,25 @@ SLAB_ATTR_RO(aliases); | |||
3754 | 3732 | ||
3755 | static ssize_t slabs_show(struct kmem_cache *s, char *buf) | 3733 | static ssize_t slabs_show(struct kmem_cache *s, char *buf) |
3756 | { | 3734 | { |
3757 | return slab_objects(s, buf, SO_FULL|SO_PARTIAL|SO_CPU); | 3735 | return show_slab_objects(s, buf, SO_FULL|SO_PARTIAL|SO_CPU); |
3758 | } | 3736 | } |
3759 | SLAB_ATTR_RO(slabs); | 3737 | SLAB_ATTR_RO(slabs); |
3760 | 3738 | ||
3761 | static ssize_t partial_show(struct kmem_cache *s, char *buf) | 3739 | static ssize_t partial_show(struct kmem_cache *s, char *buf) |
3762 | { | 3740 | { |
3763 | return slab_objects(s, buf, SO_PARTIAL); | 3741 | return show_slab_objects(s, buf, SO_PARTIAL); |
3764 | } | 3742 | } |
3765 | SLAB_ATTR_RO(partial); | 3743 | SLAB_ATTR_RO(partial); |
3766 | 3744 | ||
3767 | static ssize_t cpu_slabs_show(struct kmem_cache *s, char *buf) | 3745 | static ssize_t cpu_slabs_show(struct kmem_cache *s, char *buf) |
3768 | { | 3746 | { |
3769 | return slab_objects(s, buf, SO_CPU); | 3747 | return show_slab_objects(s, buf, SO_CPU); |
3770 | } | 3748 | } |
3771 | SLAB_ATTR_RO(cpu_slabs); | 3749 | SLAB_ATTR_RO(cpu_slabs); |
3772 | 3750 | ||
3773 | static ssize_t objects_show(struct kmem_cache *s, char *buf) | 3751 | static ssize_t objects_show(struct kmem_cache *s, char *buf) |
3774 | { | 3752 | { |
3775 | return slab_objects(s, buf, SO_FULL|SO_PARTIAL|SO_CPU|SO_OBJECTS); | 3753 | return show_slab_objects(s, buf, SO_FULL|SO_PARTIAL|SO_CPU|SO_OBJECTS); |
3776 | } | 3754 | } |
3777 | SLAB_ATTR_RO(objects); | 3755 | SLAB_ATTR_RO(objects); |
3778 | 3756 | ||
@@ -3971,7 +3949,6 @@ SLAB_ATTR(remote_node_defrag_ratio); | |||
3971 | #endif | 3949 | #endif |
3972 | 3950 | ||
3973 | #ifdef CONFIG_SLUB_STATS | 3951 | #ifdef CONFIG_SLUB_STATS |
3974 | |||
3975 | static int show_stat(struct kmem_cache *s, char *buf, enum stat_item si) | 3952 | static int show_stat(struct kmem_cache *s, char *buf, enum stat_item si) |
3976 | { | 3953 | { |
3977 | unsigned long sum = 0; | 3954 | unsigned long sum = 0; |
@@ -4155,8 +4132,8 @@ static struct kset *slab_kset; | |||
4155 | #define ID_STR_LENGTH 64 | 4132 | #define ID_STR_LENGTH 64 |
4156 | 4133 | ||
4157 | /* Create a unique string id for a slab cache: | 4134 | /* Create a unique string id for a slab cache: |
4158 | * format | 4135 | * |
4159 | * :[flags-]size:[memory address of kmemcache] | 4136 | * Format :[flags-]size |
4160 | */ | 4137 | */ |
4161 | static char *create_unique_id(struct kmem_cache *s) | 4138 | static char *create_unique_id(struct kmem_cache *s) |
4162 | { | 4139 | { |
@@ -176,7 +176,7 @@ void activate_page(struct page *page) | |||
176 | SetPageActive(page); | 176 | SetPageActive(page); |
177 | add_page_to_active_list(zone, page); | 177 | add_page_to_active_list(zone, page); |
178 | __count_vm_event(PGACTIVATE); | 178 | __count_vm_event(PGACTIVATE); |
179 | mem_cgroup_move_lists(page_get_page_cgroup(page), true); | 179 | mem_cgroup_move_lists(page, true); |
180 | } | 180 | } |
181 | spin_unlock_irq(&zone->lru_lock); | 181 | spin_unlock_irq(&zone->lru_lock); |
182 | } | 182 | } |
diff --git a/mm/truncate.c b/mm/truncate.c index c35c49e54fb6..7d20ce41ecf5 100644 --- a/mm/truncate.c +++ b/mm/truncate.c | |||
@@ -134,8 +134,7 @@ invalidate_complete_page(struct address_space *mapping, struct page *page) | |||
134 | } | 134 | } |
135 | 135 | ||
136 | /** | 136 | /** |
137 | * truncate_inode_pages - truncate range of pages specified by start and | 137 | * truncate_inode_pages - truncate range of pages specified by start & end byte offsets |
138 | * end byte offsets | ||
139 | * @mapping: mapping to truncate | 138 | * @mapping: mapping to truncate |
140 | * @lstart: offset from which to truncate | 139 | * @lstart: offset from which to truncate |
141 | * @lend: offset to which to truncate | 140 | * @lend: offset to which to truncate |
diff --git a/mm/vmscan.c b/mm/vmscan.c index a26dabd62fed..45711585684e 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -126,7 +126,7 @@ long vm_total_pages; /* The total number of pages which the VM controls */ | |||
126 | static LIST_HEAD(shrinker_list); | 126 | static LIST_HEAD(shrinker_list); |
127 | static DECLARE_RWSEM(shrinker_rwsem); | 127 | static DECLARE_RWSEM(shrinker_rwsem); |
128 | 128 | ||
129 | #ifdef CONFIG_CGROUP_MEM_CONT | 129 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
130 | #define scan_global_lru(sc) (!(sc)->mem_cgroup) | 130 | #define scan_global_lru(sc) (!(sc)->mem_cgroup) |
131 | #else | 131 | #else |
132 | #define scan_global_lru(sc) (1) | 132 | #define scan_global_lru(sc) (1) |
@@ -1128,7 +1128,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
1128 | ClearPageActive(page); | 1128 | ClearPageActive(page); |
1129 | 1129 | ||
1130 | list_move(&page->lru, &zone->inactive_list); | 1130 | list_move(&page->lru, &zone->inactive_list); |
1131 | mem_cgroup_move_lists(page_get_page_cgroup(page), false); | 1131 | mem_cgroup_move_lists(page, false); |
1132 | pgmoved++; | 1132 | pgmoved++; |
1133 | if (!pagevec_add(&pvec, page)) { | 1133 | if (!pagevec_add(&pvec, page)) { |
1134 | __mod_zone_page_state(zone, NR_INACTIVE, pgmoved); | 1134 | __mod_zone_page_state(zone, NR_INACTIVE, pgmoved); |
@@ -1156,8 +1156,9 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
1156 | VM_BUG_ON(PageLRU(page)); | 1156 | VM_BUG_ON(PageLRU(page)); |
1157 | SetPageLRU(page); | 1157 | SetPageLRU(page); |
1158 | VM_BUG_ON(!PageActive(page)); | 1158 | VM_BUG_ON(!PageActive(page)); |
1159 | |||
1159 | list_move(&page->lru, &zone->active_list); | 1160 | list_move(&page->lru, &zone->active_list); |
1160 | mem_cgroup_move_lists(page_get_page_cgroup(page), true); | 1161 | mem_cgroup_move_lists(page, true); |
1161 | pgmoved++; | 1162 | pgmoved++; |
1162 | if (!pagevec_add(&pvec, page)) { | 1163 | if (!pagevec_add(&pvec, page)) { |
1163 | __mod_zone_page_state(zone, NR_ACTIVE, pgmoved); | 1164 | __mod_zone_page_state(zone, NR_ACTIVE, pgmoved); |
@@ -1427,7 +1428,7 @@ unsigned long try_to_free_pages(struct zone **zones, int order, gfp_t gfp_mask) | |||
1427 | return do_try_to_free_pages(zones, gfp_mask, &sc); | 1428 | return do_try_to_free_pages(zones, gfp_mask, &sc); |
1428 | } | 1429 | } |
1429 | 1430 | ||
1430 | #ifdef CONFIG_CGROUP_MEM_CONT | 1431 | #ifdef CONFIG_CGROUP_MEM_RES_CTLR |
1431 | 1432 | ||
1432 | unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont, | 1433 | unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont, |
1433 | gfp_t gfp_mask) | 1434 | gfp_t gfp_mask) |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c index 0598b229c11d..981f190c1b39 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c +++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c | |||
@@ -156,7 +156,7 @@ static int send_write(struct svcxprt_rdma *xprt, struct svc_rqst *rqstp, | |||
156 | struct svc_rdma_op_ctxt *ctxt; | 156 | struct svc_rdma_op_ctxt *ctxt; |
157 | int ret = 0; | 157 | int ret = 0; |
158 | 158 | ||
159 | BUG_ON(sge_count >= 32); | 159 | BUG_ON(sge_count > RPCSVC_MAXPAGES); |
160 | dprintk("svcrdma: RDMA_WRITE rmr=%x, to=%llx, xdr_off=%d, " | 160 | dprintk("svcrdma: RDMA_WRITE rmr=%x, to=%llx, xdr_off=%d, " |
161 | "write_len=%d, xdr_sge=%p, sge_count=%d\n", | 161 | "write_len=%d, xdr_sge=%p, sge_count=%d\n", |
162 | rmr, (unsigned long long)to, xdr_off, | 162 | rmr, (unsigned long long)to, xdr_off, |
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c index f09444c451bc..16fd3f6718ff 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_transport.c +++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c | |||
@@ -54,7 +54,6 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, | |||
54 | int flags); | 54 | int flags); |
55 | static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt); | 55 | static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt); |
56 | static void svc_rdma_release_rqst(struct svc_rqst *); | 56 | static void svc_rdma_release_rqst(struct svc_rqst *); |
57 | static void rdma_destroy_xprt(struct svcxprt_rdma *xprt); | ||
58 | static void dto_tasklet_func(unsigned long data); | 57 | static void dto_tasklet_func(unsigned long data); |
59 | static void svc_rdma_detach(struct svc_xprt *xprt); | 58 | static void svc_rdma_detach(struct svc_xprt *xprt); |
60 | static void svc_rdma_free(struct svc_xprt *xprt); | 59 | static void svc_rdma_free(struct svc_xprt *xprt); |
@@ -247,6 +246,7 @@ static void dto_tasklet_func(unsigned long data) | |||
247 | sq_cq_reap(xprt); | 246 | sq_cq_reap(xprt); |
248 | } | 247 | } |
249 | 248 | ||
249 | svc_xprt_put(&xprt->sc_xprt); | ||
250 | spin_lock_irqsave(&dto_lock, flags); | 250 | spin_lock_irqsave(&dto_lock, flags); |
251 | } | 251 | } |
252 | spin_unlock_irqrestore(&dto_lock, flags); | 252 | spin_unlock_irqrestore(&dto_lock, flags); |
@@ -275,8 +275,10 @@ static void rq_comp_handler(struct ib_cq *cq, void *cq_context) | |||
275 | * add it | 275 | * add it |
276 | */ | 276 | */ |
277 | spin_lock_irqsave(&dto_lock, flags); | 277 | spin_lock_irqsave(&dto_lock, flags); |
278 | if (list_empty(&xprt->sc_dto_q)) | 278 | if (list_empty(&xprt->sc_dto_q)) { |
279 | svc_xprt_get(&xprt->sc_xprt); | ||
279 | list_add_tail(&xprt->sc_dto_q, &dto_xprt_q); | 280 | list_add_tail(&xprt->sc_dto_q, &dto_xprt_q); |
281 | } | ||
280 | spin_unlock_irqrestore(&dto_lock, flags); | 282 | spin_unlock_irqrestore(&dto_lock, flags); |
281 | 283 | ||
282 | /* Tasklet does all the work to avoid irqsave locks. */ | 284 | /* Tasklet does all the work to avoid irqsave locks. */ |
@@ -386,8 +388,10 @@ static void sq_comp_handler(struct ib_cq *cq, void *cq_context) | |||
386 | * add it | 388 | * add it |
387 | */ | 389 | */ |
388 | spin_lock_irqsave(&dto_lock, flags); | 390 | spin_lock_irqsave(&dto_lock, flags); |
389 | if (list_empty(&xprt->sc_dto_q)) | 391 | if (list_empty(&xprt->sc_dto_q)) { |
392 | svc_xprt_get(&xprt->sc_xprt); | ||
390 | list_add_tail(&xprt->sc_dto_q, &dto_xprt_q); | 393 | list_add_tail(&xprt->sc_dto_q, &dto_xprt_q); |
394 | } | ||
391 | spin_unlock_irqrestore(&dto_lock, flags); | 395 | spin_unlock_irqrestore(&dto_lock, flags); |
392 | 396 | ||
393 | /* Tasklet does all the work to avoid irqsave locks. */ | 397 | /* Tasklet does all the work to avoid irqsave locks. */ |
@@ -611,6 +615,7 @@ static int rdma_cma_handler(struct rdma_cm_id *cma_id, | |||
611 | switch (event->event) { | 615 | switch (event->event) { |
612 | case RDMA_CM_EVENT_ESTABLISHED: | 616 | case RDMA_CM_EVENT_ESTABLISHED: |
613 | /* Accept complete */ | 617 | /* Accept complete */ |
618 | svc_xprt_get(xprt); | ||
614 | dprintk("svcrdma: Connection completed on DTO xprt=%p, " | 619 | dprintk("svcrdma: Connection completed on DTO xprt=%p, " |
615 | "cm_id=%p\n", xprt, cma_id); | 620 | "cm_id=%p\n", xprt, cma_id); |
616 | clear_bit(RDMAXPRT_CONN_PENDING, &rdma->sc_flags); | 621 | clear_bit(RDMAXPRT_CONN_PENDING, &rdma->sc_flags); |
@@ -661,15 +666,15 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, | |||
661 | 666 | ||
662 | listen_id = rdma_create_id(rdma_listen_handler, cma_xprt, RDMA_PS_TCP); | 667 | listen_id = rdma_create_id(rdma_listen_handler, cma_xprt, RDMA_PS_TCP); |
663 | if (IS_ERR(listen_id)) { | 668 | if (IS_ERR(listen_id)) { |
664 | rdma_destroy_xprt(cma_xprt); | 669 | svc_xprt_put(&cma_xprt->sc_xprt); |
665 | dprintk("svcrdma: rdma_create_id failed = %ld\n", | 670 | dprintk("svcrdma: rdma_create_id failed = %ld\n", |
666 | PTR_ERR(listen_id)); | 671 | PTR_ERR(listen_id)); |
667 | return (void *)listen_id; | 672 | return (void *)listen_id; |
668 | } | 673 | } |
669 | ret = rdma_bind_addr(listen_id, sa); | 674 | ret = rdma_bind_addr(listen_id, sa); |
670 | if (ret) { | 675 | if (ret) { |
671 | rdma_destroy_xprt(cma_xprt); | ||
672 | rdma_destroy_id(listen_id); | 676 | rdma_destroy_id(listen_id); |
677 | svc_xprt_put(&cma_xprt->sc_xprt); | ||
673 | dprintk("svcrdma: rdma_bind_addr failed = %d\n", ret); | 678 | dprintk("svcrdma: rdma_bind_addr failed = %d\n", ret); |
674 | return ERR_PTR(ret); | 679 | return ERR_PTR(ret); |
675 | } | 680 | } |
@@ -678,8 +683,9 @@ static struct svc_xprt *svc_rdma_create(struct svc_serv *serv, | |||
678 | ret = rdma_listen(listen_id, RPCRDMA_LISTEN_BACKLOG); | 683 | ret = rdma_listen(listen_id, RPCRDMA_LISTEN_BACKLOG); |
679 | if (ret) { | 684 | if (ret) { |
680 | rdma_destroy_id(listen_id); | 685 | rdma_destroy_id(listen_id); |
681 | rdma_destroy_xprt(cma_xprt); | 686 | svc_xprt_put(&cma_xprt->sc_xprt); |
682 | dprintk("svcrdma: rdma_listen failed = %d\n", ret); | 687 | dprintk("svcrdma: rdma_listen failed = %d\n", ret); |
688 | return ERR_PTR(ret); | ||
683 | } | 689 | } |
684 | 690 | ||
685 | /* | 691 | /* |
@@ -820,6 +826,7 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) | |||
820 | newxprt->sc_sq_depth = qp_attr.cap.max_send_wr; | 826 | newxprt->sc_sq_depth = qp_attr.cap.max_send_wr; |
821 | newxprt->sc_max_requests = qp_attr.cap.max_recv_wr; | 827 | newxprt->sc_max_requests = qp_attr.cap.max_recv_wr; |
822 | } | 828 | } |
829 | svc_xprt_get(&newxprt->sc_xprt); | ||
823 | newxprt->sc_qp = newxprt->sc_cm_id->qp; | 830 | newxprt->sc_qp = newxprt->sc_cm_id->qp; |
824 | 831 | ||
825 | /* Register all of physical memory */ | 832 | /* Register all of physical memory */ |
@@ -891,8 +898,15 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) | |||
891 | 898 | ||
892 | errout: | 899 | errout: |
893 | dprintk("svcrdma: failure accepting new connection rc=%d.\n", ret); | 900 | dprintk("svcrdma: failure accepting new connection rc=%d.\n", ret); |
901 | /* Take a reference in case the DTO handler runs */ | ||
902 | svc_xprt_get(&newxprt->sc_xprt); | ||
903 | if (newxprt->sc_qp && !IS_ERR(newxprt->sc_qp)) { | ||
904 | ib_destroy_qp(newxprt->sc_qp); | ||
905 | svc_xprt_put(&newxprt->sc_xprt); | ||
906 | } | ||
894 | rdma_destroy_id(newxprt->sc_cm_id); | 907 | rdma_destroy_id(newxprt->sc_cm_id); |
895 | rdma_destroy_xprt(newxprt); | 908 | /* This call to put will destroy the transport */ |
909 | svc_xprt_put(&newxprt->sc_xprt); | ||
896 | return NULL; | 910 | return NULL; |
897 | } | 911 | } |
898 | 912 | ||
@@ -919,54 +933,60 @@ static void svc_rdma_release_rqst(struct svc_rqst *rqstp) | |||
919 | rqstp->rq_xprt_ctxt = NULL; | 933 | rqstp->rq_xprt_ctxt = NULL; |
920 | } | 934 | } |
921 | 935 | ||
922 | /* Disable data ready events for this connection */ | 936 | /* |
937 | * When connected, an svc_xprt has at least three references: | ||
938 | * | ||
939 | * - A reference held by the QP. We still hold that here because this | ||
940 | * code deletes the QP and puts the reference. | ||
941 | * | ||
942 | * - A reference held by the cm_id between the ESTABLISHED and | ||
943 | * DISCONNECTED events. If the remote peer disconnected first, this | ||
944 | * reference could be gone. | ||
945 | * | ||
946 | * - A reference held by the svc_recv code that called this function | ||
947 | * as part of close processing. | ||
948 | * | ||
949 | * At a minimum two references should still be held. | ||
950 | */ | ||
923 | static void svc_rdma_detach(struct svc_xprt *xprt) | 951 | static void svc_rdma_detach(struct svc_xprt *xprt) |
924 | { | 952 | { |
925 | struct svcxprt_rdma *rdma = | 953 | struct svcxprt_rdma *rdma = |
926 | container_of(xprt, struct svcxprt_rdma, sc_xprt); | 954 | container_of(xprt, struct svcxprt_rdma, sc_xprt); |
927 | unsigned long flags; | ||
928 | |||
929 | dprintk("svc: svc_rdma_detach(%p)\n", xprt); | 955 | dprintk("svc: svc_rdma_detach(%p)\n", xprt); |
930 | /* | 956 | |
931 | * Shutdown the connection. This will ensure we don't get any | 957 | /* Disconnect and flush posted WQE */ |
932 | * more events from the provider. | ||
933 | */ | ||
934 | rdma_disconnect(rdma->sc_cm_id); | 958 | rdma_disconnect(rdma->sc_cm_id); |
935 | rdma_destroy_id(rdma->sc_cm_id); | ||
936 | 959 | ||
937 | /* We may already be on the DTO list */ | 960 | /* Destroy the QP if present (not a listener) */ |
938 | spin_lock_irqsave(&dto_lock, flags); | 961 | if (rdma->sc_qp && !IS_ERR(rdma->sc_qp)) { |
939 | if (!list_empty(&rdma->sc_dto_q)) | 962 | ib_destroy_qp(rdma->sc_qp); |
940 | list_del_init(&rdma->sc_dto_q); | 963 | svc_xprt_put(xprt); |
941 | spin_unlock_irqrestore(&dto_lock, flags); | 964 | } |
965 | |||
966 | /* Destroy the CM ID */ | ||
967 | rdma_destroy_id(rdma->sc_cm_id); | ||
942 | } | 968 | } |
943 | 969 | ||
944 | static void svc_rdma_free(struct svc_xprt *xprt) | 970 | static void svc_rdma_free(struct svc_xprt *xprt) |
945 | { | 971 | { |
946 | struct svcxprt_rdma *rdma = (struct svcxprt_rdma *)xprt; | 972 | struct svcxprt_rdma *rdma = (struct svcxprt_rdma *)xprt; |
947 | dprintk("svcrdma: svc_rdma_free(%p)\n", rdma); | 973 | dprintk("svcrdma: svc_rdma_free(%p)\n", rdma); |
948 | rdma_destroy_xprt(rdma); | 974 | /* We should only be called from kref_put */ |
949 | kfree(rdma); | 975 | BUG_ON(atomic_read(&xprt->xpt_ref.refcount) != 0); |
950 | } | 976 | if (rdma->sc_sq_cq && !IS_ERR(rdma->sc_sq_cq)) |
951 | 977 | ib_destroy_cq(rdma->sc_sq_cq); | |
952 | static void rdma_destroy_xprt(struct svcxprt_rdma *xprt) | ||
953 | { | ||
954 | if (xprt->sc_qp && !IS_ERR(xprt->sc_qp)) | ||
955 | ib_destroy_qp(xprt->sc_qp); | ||
956 | |||
957 | if (xprt->sc_sq_cq && !IS_ERR(xprt->sc_sq_cq)) | ||
958 | ib_destroy_cq(xprt->sc_sq_cq); | ||
959 | 978 | ||
960 | if (xprt->sc_rq_cq && !IS_ERR(xprt->sc_rq_cq)) | 979 | if (rdma->sc_rq_cq && !IS_ERR(rdma->sc_rq_cq)) |
961 | ib_destroy_cq(xprt->sc_rq_cq); | 980 | ib_destroy_cq(rdma->sc_rq_cq); |
962 | 981 | ||
963 | if (xprt->sc_phys_mr && !IS_ERR(xprt->sc_phys_mr)) | 982 | if (rdma->sc_phys_mr && !IS_ERR(rdma->sc_phys_mr)) |
964 | ib_dereg_mr(xprt->sc_phys_mr); | 983 | ib_dereg_mr(rdma->sc_phys_mr); |
965 | 984 | ||
966 | if (xprt->sc_pd && !IS_ERR(xprt->sc_pd)) | 985 | if (rdma->sc_pd && !IS_ERR(rdma->sc_pd)) |
967 | ib_dealloc_pd(xprt->sc_pd); | 986 | ib_dealloc_pd(rdma->sc_pd); |
968 | 987 | ||
969 | destroy_context_cache(xprt->sc_ctxt_head); | 988 | destroy_context_cache(rdma->sc_ctxt_head); |
989 | kfree(rdma); | ||
970 | } | 990 | } |
971 | 991 | ||
972 | static int svc_rdma_has_wspace(struct svc_xprt *xprt) | 992 | static int svc_rdma_has_wspace(struct svc_xprt *xprt) |
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 02c522c17de5..a564c1a39ec5 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c | |||
@@ -614,7 +614,11 @@ xprt_rdma_free(void *buffer) | |||
614 | return; | 614 | return; |
615 | 615 | ||
616 | req = container_of(buffer, struct rpcrdma_req, rl_xdr_buf[0]); | 616 | req = container_of(buffer, struct rpcrdma_req, rl_xdr_buf[0]); |
617 | r_xprt = container_of(req->rl_buffer, struct rpcrdma_xprt, rx_buf); | 617 | if (req->rl_iov.length == 0) { /* see allocate above */ |
618 | r_xprt = container_of(((struct rpcrdma_req *) req->rl_buffer)->rl_buffer, | ||
619 | struct rpcrdma_xprt, rx_buf); | ||
620 | } else | ||
621 | r_xprt = container_of(req->rl_buffer, struct rpcrdma_xprt, rx_buf); | ||
618 | rep = req->rl_reply; | 622 | rep = req->rl_reply; |
619 | 623 | ||
620 | dprintk("RPC: %s: called on 0x%p%s\n", | 624 | dprintk("RPC: %s: called on 0x%p%s\n", |
diff --git a/samples/Kconfig b/samples/Kconfig index 74d97cc24787..e1fb471cc501 100644 --- a/samples/Kconfig +++ b/samples/Kconfig | |||
@@ -22,5 +22,16 @@ config SAMPLE_KOBJECT | |||
22 | 22 | ||
23 | If in doubt, say "N" here. | 23 | If in doubt, say "N" here. |
24 | 24 | ||
25 | config SAMPLE_KPROBES | ||
26 | tristate "Build kprobes examples -- loadable modules only" | ||
27 | depends on KPROBES && m | ||
28 | help | ||
29 | This build several kprobes example modules. | ||
30 | |||
31 | config SAMPLE_KRETPROBES | ||
32 | tristate "Build kretprobes example -- loadable modules only" | ||
33 | default m | ||
34 | depends on SAMPLE_KPROBES && KRETPROBES | ||
35 | |||
25 | endif # SAMPLES | 36 | endif # SAMPLES |
26 | 37 | ||
diff --git a/samples/Makefile b/samples/Makefile index 8652d0f268ad..2e02575f7794 100644 --- a/samples/Makefile +++ b/samples/Makefile | |||
@@ -1,3 +1,3 @@ | |||
1 | # Makefile for Linux samples code | 1 | # Makefile for Linux samples code |
2 | 2 | ||
3 | obj-$(CONFIG_SAMPLES) += markers/ kobject/ | 3 | obj-$(CONFIG_SAMPLES) += markers/ kobject/ kprobes/ |
diff --git a/samples/kprobes/Makefile b/samples/kprobes/Makefile new file mode 100644 index 000000000000..68739bc4fc6a --- /dev/null +++ b/samples/kprobes/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | # builds the kprobes example kernel modules; | ||
2 | # then to use one (as root): insmod <module_name.ko> | ||
3 | |||
4 | obj-$(CONFIG_SAMPLE_KPROBES) += kprobe_example.o jprobe_example.o | ||
5 | obj-$(CONFIG_SAMPLE_KRETPROBES) += kretprobe_example.o | ||
diff --git a/samples/kprobes/jprobe_example.c b/samples/kprobes/jprobe_example.c new file mode 100644 index 000000000000..b7541355b92b --- /dev/null +++ b/samples/kprobes/jprobe_example.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* | ||
2 | * Here's a sample kernel module showing the use of jprobes to dump | ||
3 | * the arguments of do_fork(). | ||
4 | * | ||
5 | * For more information on theory of operation of jprobes, see | ||
6 | * Documentation/kprobes.txt | ||
7 | * | ||
8 | * Build and insert the kernel module as done in the kprobe example. | ||
9 | * You will see the trace data in /var/log/messages and on the | ||
10 | * console whenever do_fork() is invoked to create a new process. | ||
11 | * (Some messages may be suppressed if syslogd is configured to | ||
12 | * eliminate duplicate messages.) | ||
13 | */ | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/kprobes.h> | ||
18 | |||
19 | /* | ||
20 | * Jumper probe for do_fork. | ||
21 | * Mirror principle enables access to arguments of the probed routine | ||
22 | * from the probe handler. | ||
23 | */ | ||
24 | |||
25 | /* Proxy routine having the same arguments as actual do_fork() routine */ | ||
26 | static long jdo_fork(unsigned long clone_flags, unsigned long stack_start, | ||
27 | struct pt_regs *regs, unsigned long stack_size, | ||
28 | int __user *parent_tidptr, int __user *child_tidptr) | ||
29 | { | ||
30 | printk(KERN_INFO "jprobe: clone_flags = 0x%lx, stack_size = 0x%lx," | ||
31 | " regs = 0x%p\n", | ||
32 | clone_flags, stack_size, regs); | ||
33 | |||
34 | /* Always end with a call to jprobe_return(). */ | ||
35 | jprobe_return(); | ||
36 | return 0; | ||
37 | } | ||
38 | |||
39 | static struct jprobe my_jprobe = { | ||
40 | .entry = jdo_fork, | ||
41 | .kp = { | ||
42 | .symbol_name = "do_fork", | ||
43 | }, | ||
44 | }; | ||
45 | |||
46 | static int __init jprobe_init(void) | ||
47 | { | ||
48 | int ret; | ||
49 | |||
50 | ret = register_jprobe(&my_jprobe); | ||
51 | if (ret < 0) { | ||
52 | printk(KERN_INFO "register_jprobe failed, returned %d\n", ret); | ||
53 | return -1; | ||
54 | } | ||
55 | printk(KERN_INFO "Planted jprobe at %p, handler addr %p\n", | ||
56 | my_jprobe.kp.addr, my_jprobe.entry); | ||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | static void __exit jprobe_exit(void) | ||
61 | { | ||
62 | unregister_jprobe(&my_jprobe); | ||
63 | printk(KERN_INFO "jprobe at %p unregistered\n", my_jprobe.kp.addr); | ||
64 | } | ||
65 | |||
66 | module_init(jprobe_init) | ||
67 | module_exit(jprobe_exit) | ||
68 | MODULE_LICENSE("GPL"); | ||
diff --git a/samples/kprobes/kprobe_example.c b/samples/kprobes/kprobe_example.c new file mode 100644 index 000000000000..a681998a871c --- /dev/null +++ b/samples/kprobes/kprobe_example.c | |||
@@ -0,0 +1,91 @@ | |||
1 | /* | ||
2 | * NOTE: This example is works on x86 and powerpc. | ||
3 | * Here's a sample kernel module showing the use of kprobes to dump a | ||
4 | * stack trace and selected registers when do_fork() is called. | ||
5 | * | ||
6 | * For more information on theory of operation of kprobes, see | ||
7 | * Documentation/kprobes.txt | ||
8 | * | ||
9 | * You will see the trace data in /var/log/messages and on the console | ||
10 | * whenever do_fork() is invoked to create a new process. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/kprobes.h> | ||
16 | |||
17 | /* For each probe you need to allocate a kprobe structure */ | ||
18 | static struct kprobe kp = { | ||
19 | .symbol_name = "do_fork", | ||
20 | }; | ||
21 | |||
22 | /* kprobe pre_handler: called just before the probed instruction is executed */ | ||
23 | static int handler_pre(struct kprobe *p, struct pt_regs *regs) | ||
24 | { | ||
25 | #ifdef CONFIG_X86 | ||
26 | printk(KERN_INFO "pre_handler: p->addr = 0x%p, ip = %lx," | ||
27 | " flags = 0x%lx\n", | ||
28 | p->addr, regs->ip, regs->flags); | ||
29 | #endif | ||
30 | #ifdef CONFIG_PPC | ||
31 | printk(KERN_INFO "pre_handler: p->addr = 0x%p, nip = 0x%lx," | ||
32 | " msr = 0x%lx\n", | ||
33 | p->addr, regs->nip, regs->msr); | ||
34 | #endif | ||
35 | |||
36 | /* A dump_stack() here will give a stack backtrace */ | ||
37 | return 0; | ||
38 | } | ||
39 | |||
40 | /* kprobe post_handler: called after the probed instruction is executed */ | ||
41 | static void handler_post(struct kprobe *p, struct pt_regs *regs, | ||
42 | unsigned long flags) | ||
43 | { | ||
44 | #ifdef CONFIG_X86 | ||
45 | printk(KERN_INFO "post_handler: p->addr = 0x%p, flags = 0x%lx\n", | ||
46 | p->addr, regs->flags); | ||
47 | #endif | ||
48 | #ifdef CONFIG_PPC | ||
49 | printk(KERN_INFO "post_handler: p->addr = 0x%p, msr = 0x%lx\n", | ||
50 | p->addr, regs->msr); | ||
51 | #endif | ||
52 | } | ||
53 | |||
54 | /* | ||
55 | * fault_handler: this is called if an exception is generated for any | ||
56 | * instruction within the pre- or post-handler, or when Kprobes | ||
57 | * single-steps the probed instruction. | ||
58 | */ | ||
59 | static int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr) | ||
60 | { | ||
61 | printk(KERN_INFO "fault_handler: p->addr = 0x%p, trap #%dn", | ||
62 | p->addr, trapnr); | ||
63 | /* Return 0 because we don't handle the fault. */ | ||
64 | return 0; | ||
65 | } | ||
66 | |||
67 | static int __init kprobe_init(void) | ||
68 | { | ||
69 | int ret; | ||
70 | kp.pre_handler = handler_pre; | ||
71 | kp.post_handler = handler_post; | ||
72 | kp.fault_handler = handler_fault; | ||
73 | |||
74 | ret = register_kprobe(&kp); | ||
75 | if (ret < 0) { | ||
76 | printk(KERN_INFO "register_kprobe failed, returned %d\n", ret); | ||
77 | return ret; | ||
78 | } | ||
79 | printk(KERN_INFO "Planted kprobe at %p\n", kp.addr); | ||
80 | return 0; | ||
81 | } | ||
82 | |||
83 | static void __exit kprobe_exit(void) | ||
84 | { | ||
85 | unregister_kprobe(&kp); | ||
86 | printk(KERN_INFO "kprobe at %p unregistered\n", kp.addr); | ||
87 | } | ||
88 | |||
89 | module_init(kprobe_init) | ||
90 | module_exit(kprobe_exit) | ||
91 | MODULE_LICENSE("GPL"); | ||
diff --git a/samples/kprobes/kretprobe_example.c b/samples/kprobes/kretprobe_example.c new file mode 100644 index 000000000000..4e764b317d61 --- /dev/null +++ b/samples/kprobes/kretprobe_example.c | |||
@@ -0,0 +1,106 @@ | |||
1 | /* | ||
2 | * kretprobe_example.c | ||
3 | * | ||
4 | * Here's a sample kernel module showing the use of return probes to | ||
5 | * report the return value and total time taken for probed function | ||
6 | * to run. | ||
7 | * | ||
8 | * usage: insmod kretprobe_example.ko func=<func_name> | ||
9 | * | ||
10 | * If no func_name is specified, do_fork is instrumented | ||
11 | * | ||
12 | * For more information on theory of operation of kretprobes, see | ||
13 | * Documentation/kprobes.txt | ||
14 | * | ||
15 | * Build and insert the kernel module as done in the kprobe example. | ||
16 | * You will see the trace data in /var/log/messages and on the console | ||
17 | * whenever the probed function returns. (Some messages may be suppressed | ||
18 | * if syslogd is configured to eliminate duplicate messages.) | ||
19 | */ | ||
20 | |||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/kprobes.h> | ||
24 | #include <linux/ktime.h> | ||
25 | #include <linux/limits.h> | ||
26 | |||
27 | static char func_name[NAME_MAX] = "do_fork"; | ||
28 | module_param_string(func, func_name, NAME_MAX, S_IRUGO); | ||
29 | MODULE_PARM_DESC(func, "Function to kretprobe; this module will report the" | ||
30 | " function's execution time"); | ||
31 | |||
32 | /* per-instance private data */ | ||
33 | struct my_data { | ||
34 | ktime_t entry_stamp; | ||
35 | }; | ||
36 | |||
37 | /* Here we use the entry_hanlder to timestamp function entry */ | ||
38 | static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs) | ||
39 | { | ||
40 | struct my_data *data; | ||
41 | |||
42 | if (!current->mm) | ||
43 | return 1; /* Skip kernel threads */ | ||
44 | |||
45 | data = (struct my_data *)ri->data; | ||
46 | data->entry_stamp = ktime_get(); | ||
47 | return 0; | ||
48 | } | ||
49 | |||
50 | /* | ||
51 | * Return-probe handler: Log the return value and duration. Duration may turn | ||
52 | * out to be zero consistently, depending upon the granularity of time | ||
53 | * accounting on the platform. | ||
54 | */ | ||
55 | static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs) | ||
56 | { | ||
57 | int retval = regs_return_value(regs); | ||
58 | struct my_data *data = (struct my_data *)ri->data; | ||
59 | s64 delta; | ||
60 | ktime_t now; | ||
61 | |||
62 | now = ktime_get(); | ||
63 | delta = ktime_to_ns(ktime_sub(now, data->entry_stamp)); | ||
64 | printk(KERN_INFO "%s returned %d and took %lld ns to execute\n", | ||
65 | func_name, retval, (long long)delta); | ||
66 | return 0; | ||
67 | } | ||
68 | |||
69 | static struct kretprobe my_kretprobe = { | ||
70 | .handler = ret_handler, | ||
71 | .entry_handler = entry_handler, | ||
72 | .data_size = sizeof(struct my_data), | ||
73 | /* Probe up to 20 instances concurrently. */ | ||
74 | .maxactive = 20, | ||
75 | }; | ||
76 | |||
77 | static int __init kretprobe_init(void) | ||
78 | { | ||
79 | int ret; | ||
80 | |||
81 | my_kretprobe.kp.symbol_name = func_name; | ||
82 | ret = register_kretprobe(&my_kretprobe); | ||
83 | if (ret < 0) { | ||
84 | printk(KERN_INFO "register_kretprobe failed, returned %d\n", | ||
85 | ret); | ||
86 | return -1; | ||
87 | } | ||
88 | printk(KERN_INFO "Planted return probe at %s: %p\n", | ||
89 | my_kretprobe.kp.symbol_name, my_kretprobe.kp.addr); | ||
90 | return 0; | ||
91 | } | ||
92 | |||
93 | static void __exit kretprobe_exit(void) | ||
94 | { | ||
95 | unregister_kretprobe(&my_kretprobe); | ||
96 | printk(KERN_INFO "kretprobe at %p unregistered\n", | ||
97 | my_kretprobe.kp.addr); | ||
98 | |||
99 | /* nmissed > 0 suggests that maxactive was set too low. */ | ||
100 | printk(KERN_INFO "Missed probing %d instances of %s\n", | ||
101 | my_kretprobe.nmissed, my_kretprobe.kp.symbol_name); | ||
102 | } | ||
103 | |||
104 | module_init(kretprobe_init) | ||
105 | module_exit(kretprobe_exit) | ||
106 | MODULE_LICENSE("GPL"); | ||
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 2086a856400a..2a7cef9726e4 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
@@ -9,7 +9,7 @@ use strict; | |||
9 | my $P = $0; | 9 | my $P = $0; |
10 | $P =~ s@.*/@@g; | 10 | $P =~ s@.*/@@g; |
11 | 11 | ||
12 | my $V = '0.14'; | 12 | my $V = '0.15'; |
13 | 13 | ||
14 | use Getopt::Long qw(:config no_auto_abbrev); | 14 | use Getopt::Long qw(:config no_auto_abbrev); |
15 | 15 | ||
@@ -105,8 +105,7 @@ our $Sparse = qr{ | |||
105 | __iomem| | 105 | __iomem| |
106 | __must_check| | 106 | __must_check| |
107 | __init_refok| | 107 | __init_refok| |
108 | __kprobes| | 108 | __kprobes |
109 | fastcall | ||
110 | }x; | 109 | }x; |
111 | our $Attribute = qr{ | 110 | our $Attribute = qr{ |
112 | const| | 111 | const| |
@@ -158,7 +157,10 @@ sub build_types { | |||
158 | \b | 157 | \b |
159 | (?:const\s+)? | 158 | (?:const\s+)? |
160 | (?:unsigned\s+)? | 159 | (?:unsigned\s+)? |
161 | $all | 160 | (?: |
161 | $all| | ||
162 | (?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\) | ||
163 | ) | ||
162 | (?:\s+$Sparse|\s+const)* | 164 | (?:\s+$Sparse|\s+const)* |
163 | \b | 165 | \b |
164 | }x; | 166 | }x; |
@@ -362,6 +364,7 @@ sub ctx_statement_block { | |||
362 | 364 | ||
363 | my $type = ''; | 365 | my $type = ''; |
364 | my $level = 0; | 366 | my $level = 0; |
367 | my $p; | ||
365 | my $c; | 368 | my $c; |
366 | my $len = 0; | 369 | my $len = 0; |
367 | 370 | ||
@@ -386,6 +389,7 @@ sub ctx_statement_block { | |||
386 | last; | 389 | last; |
387 | } | 390 | } |
388 | } | 391 | } |
392 | $p = $c; | ||
389 | $c = substr($blk, $off, 1); | 393 | $c = substr($blk, $off, 1); |
390 | $remainder = substr($blk, $off); | 394 | $remainder = substr($blk, $off); |
391 | 395 | ||
@@ -397,8 +401,9 @@ sub ctx_statement_block { | |||
397 | } | 401 | } |
398 | 402 | ||
399 | # An else is really a conditional as long as its not else if | 403 | # An else is really a conditional as long as its not else if |
400 | if ($level == 0 && $remainder =~ /(\s+else)(?:\s|{)/ && | 404 | if ($level == 0 && (!defined($p) || $p =~ /(?:\s|\})/) && |
401 | $remainder !~ /\s+else\s+if\b/) { | 405 | $remainder =~ /(else)(?:\s|{)/ && |
406 | $remainder !~ /else\s+if\b/) { | ||
402 | $coff = $off + length($1); | 407 | $coff = $off + length($1); |
403 | } | 408 | } |
404 | 409 | ||
@@ -445,21 +450,73 @@ sub ctx_statement_block { | |||
445 | $line, $remain + 1, $off - $loff + 1, $level); | 450 | $line, $remain + 1, $off - $loff + 1, $level); |
446 | } | 451 | } |
447 | 452 | ||
453 | sub statement_lines { | ||
454 | my ($stmt) = @_; | ||
455 | |||
456 | # Strip the diff line prefixes and rip blank lines at start and end. | ||
457 | $stmt =~ s/(^|\n)./$1/g; | ||
458 | $stmt =~ s/^\s*//; | ||
459 | $stmt =~ s/\s*$//; | ||
460 | |||
461 | my @stmt_lines = ($stmt =~ /\n/g); | ||
462 | |||
463 | return $#stmt_lines + 2; | ||
464 | } | ||
465 | |||
466 | sub statement_rawlines { | ||
467 | my ($stmt) = @_; | ||
468 | |||
469 | my @stmt_lines = ($stmt =~ /\n/g); | ||
470 | |||
471 | return $#stmt_lines + 2; | ||
472 | } | ||
473 | |||
474 | sub statement_block_size { | ||
475 | my ($stmt) = @_; | ||
476 | |||
477 | $stmt =~ s/(^|\n)./$1/g; | ||
478 | $stmt =~ s/^\s*{//; | ||
479 | $stmt =~ s/}\s*$//; | ||
480 | $stmt =~ s/^\s*//; | ||
481 | $stmt =~ s/\s*$//; | ||
482 | |||
483 | my @stmt_lines = ($stmt =~ /\n/g); | ||
484 | my @stmt_statements = ($stmt =~ /;/g); | ||
485 | |||
486 | my $stmt_lines = $#stmt_lines + 2; | ||
487 | my $stmt_statements = $#stmt_statements + 1; | ||
488 | |||
489 | if ($stmt_lines > $stmt_statements) { | ||
490 | return $stmt_lines; | ||
491 | } else { | ||
492 | return $stmt_statements; | ||
493 | } | ||
494 | } | ||
495 | |||
448 | sub ctx_statement_full { | 496 | sub ctx_statement_full { |
449 | my ($linenr, $remain, $off) = @_; | 497 | my ($linenr, $remain, $off) = @_; |
450 | my ($statement, $condition, $level); | 498 | my ($statement, $condition, $level); |
451 | 499 | ||
452 | my (@chunks); | 500 | my (@chunks); |
453 | 501 | ||
502 | # Grab the first conditional/block pair. | ||
454 | ($statement, $condition, $linenr, $remain, $off, $level) = | 503 | ($statement, $condition, $linenr, $remain, $off, $level) = |
455 | ctx_statement_block($linenr, $remain, $off); | 504 | ctx_statement_block($linenr, $remain, $off); |
456 | #print "F: c<$condition> s<$statement>\n"; | 505 | #print "F: c<$condition> s<$statement>\n"; |
506 | push(@chunks, [ $condition, $statement ]); | ||
507 | if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { | ||
508 | return ($level, $linenr, @chunks); | ||
509 | } | ||
510 | |||
511 | # Pull in the following conditional/block pairs and see if they | ||
512 | # could continue the statement. | ||
457 | for (;;) { | 513 | for (;;) { |
458 | push(@chunks, [ $condition, $statement ]); | ||
459 | last if (!($remain > 0 && $condition =~ /^.\s*(?:if|else|do)/)); | ||
460 | ($statement, $condition, $linenr, $remain, $off, $level) = | 514 | ($statement, $condition, $linenr, $remain, $off, $level) = |
461 | ctx_statement_block($linenr, $remain, $off); | 515 | ctx_statement_block($linenr, $remain, $off); |
462 | #print "C: c<$condition> s<$statement>\n"; | 516 | #print "C: c<$condition> s<$statement> remain<$remain>\n"; |
517 | last if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:else|do)\b/s)); | ||
518 | #print "C: push\n"; | ||
519 | push(@chunks, [ $condition, $statement ]); | ||
463 | } | 520 | } |
464 | 521 | ||
465 | return ($level, $linenr, @chunks); | 522 | return ($level, $linenr, @chunks); |
@@ -593,13 +650,13 @@ sub cat_vet { | |||
593 | } | 650 | } |
594 | 651 | ||
595 | my $av_preprocessor = 0; | 652 | my $av_preprocessor = 0; |
596 | my $av_paren = 0; | 653 | my $av_pending; |
597 | my @av_paren_type; | 654 | my @av_paren_type; |
598 | 655 | ||
599 | sub annotate_reset { | 656 | sub annotate_reset { |
600 | $av_preprocessor = 0; | 657 | $av_preprocessor = 0; |
601 | $av_paren = 0; | 658 | $av_pending = '_'; |
602 | @av_paren_type = (); | 659 | @av_paren_type = ('E'); |
603 | } | 660 | } |
604 | 661 | ||
605 | sub annotate_values { | 662 | sub annotate_values { |
@@ -611,12 +668,13 @@ sub annotate_values { | |||
611 | print "$stream\n" if ($dbg_values > 1); | 668 | print "$stream\n" if ($dbg_values > 1); |
612 | 669 | ||
613 | while (length($cur)) { | 670 | while (length($cur)) { |
614 | print " <$type> " if ($dbg_values > 1); | 671 | print " <" . join('', @av_paren_type) . |
672 | "> <$type> " if ($dbg_values > 1); | ||
615 | if ($cur =~ /^(\s+)/o) { | 673 | if ($cur =~ /^(\s+)/o) { |
616 | print "WS($1)\n" if ($dbg_values > 1); | 674 | print "WS($1)\n" if ($dbg_values > 1); |
617 | if ($1 =~ /\n/ && $av_preprocessor) { | 675 | if ($1 =~ /\n/ && $av_preprocessor) { |
676 | $type = pop(@av_paren_type); | ||
618 | $av_preprocessor = 0; | 677 | $av_preprocessor = 0; |
619 | $type = 'N'; | ||
620 | } | 678 | } |
621 | 679 | ||
622 | } elsif ($cur =~ /^($Type)/) { | 680 | } elsif ($cur =~ /^($Type)/) { |
@@ -626,11 +684,33 @@ sub annotate_values { | |||
626 | } elsif ($cur =~ /^(#\s*define\s*$Ident)(\(?)/o) { | 684 | } elsif ($cur =~ /^(#\s*define\s*$Ident)(\(?)/o) { |
627 | print "DEFINE($1)\n" if ($dbg_values > 1); | 685 | print "DEFINE($1)\n" if ($dbg_values > 1); |
628 | $av_preprocessor = 1; | 686 | $av_preprocessor = 1; |
629 | $av_paren_type[$av_paren] = 'N'; | 687 | $av_pending = 'N'; |
630 | 688 | ||
631 | } elsif ($cur =~ /^(#\s*(?:ifdef|ifndef|if|else|elif|endif))/o) { | 689 | } elsif ($cur =~ /^(#\s*(?:ifdef|ifndef|if))/o) { |
632 | print "PRE($1)\n" if ($dbg_values > 1); | 690 | print "PRE_START($1)\n" if ($dbg_values > 1); |
633 | $av_preprocessor = 1; | 691 | $av_preprocessor = 1; |
692 | |||
693 | push(@av_paren_type, $type); | ||
694 | push(@av_paren_type, $type); | ||
695 | $type = 'N'; | ||
696 | |||
697 | } elsif ($cur =~ /^(#\s*(?:else|elif))/o) { | ||
698 | print "PRE_RESTART($1)\n" if ($dbg_values > 1); | ||
699 | $av_preprocessor = 1; | ||
700 | |||
701 | push(@av_paren_type, $av_paren_type[$#av_paren_type]); | ||
702 | |||
703 | $type = 'N'; | ||
704 | |||
705 | } elsif ($cur =~ /^(#\s*(?:endif))/o) { | ||
706 | print "PRE_END($1)\n" if ($dbg_values > 1); | ||
707 | |||
708 | $av_preprocessor = 1; | ||
709 | |||
710 | # Assume all arms of the conditional end as this | ||
711 | # one does, and continue as if the #endif was not here. | ||
712 | pop(@av_paren_type); | ||
713 | push(@av_paren_type, $type); | ||
634 | $type = 'N'; | 714 | $type = 'N'; |
635 | 715 | ||
636 | } elsif ($cur =~ /^(\\\n)/o) { | 716 | } elsif ($cur =~ /^(\\\n)/o) { |
@@ -639,13 +719,13 @@ sub annotate_values { | |||
639 | } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { | 719 | } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { |
640 | print "SIZEOF($1)\n" if ($dbg_values > 1); | 720 | print "SIZEOF($1)\n" if ($dbg_values > 1); |
641 | if (defined $2) { | 721 | if (defined $2) { |
642 | $av_paren_type[$av_paren] = 'V'; | 722 | $av_pending = 'V'; |
643 | } | 723 | } |
644 | $type = 'N'; | 724 | $type = 'N'; |
645 | 725 | ||
646 | } elsif ($cur =~ /^(if|while|typeof|__typeof__|for)\b/o) { | 726 | } elsif ($cur =~ /^(if|while|typeof|__typeof__|for)\b/o) { |
647 | print "COND($1)\n" if ($dbg_values > 1); | 727 | print "COND($1)\n" if ($dbg_values > 1); |
648 | $av_paren_type[$av_paren] = 'N'; | 728 | $av_pending = 'N'; |
649 | $type = 'N'; | 729 | $type = 'N'; |
650 | 730 | ||
651 | } elsif ($cur =~/^(return|case|else)/o) { | 731 | } elsif ($cur =~/^(return|case|else)/o) { |
@@ -654,14 +734,14 @@ sub annotate_values { | |||
654 | 734 | ||
655 | } elsif ($cur =~ /^(\()/o) { | 735 | } elsif ($cur =~ /^(\()/o) { |
656 | print "PAREN('$1')\n" if ($dbg_values > 1); | 736 | print "PAREN('$1')\n" if ($dbg_values > 1); |
657 | $av_paren++; | 737 | push(@av_paren_type, $av_pending); |
738 | $av_pending = '_'; | ||
658 | $type = 'N'; | 739 | $type = 'N'; |
659 | 740 | ||
660 | } elsif ($cur =~ /^(\))/o) { | 741 | } elsif ($cur =~ /^(\))/o) { |
661 | $av_paren-- if ($av_paren > 0); | 742 | my $new_type = pop(@av_paren_type); |
662 | if (defined $av_paren_type[$av_paren]) { | 743 | if ($new_type ne '_') { |
663 | $type = $av_paren_type[$av_paren]; | 744 | $type = $new_type; |
664 | undef $av_paren_type[$av_paren]; | ||
665 | print "PAREN('$1') -> $type\n" | 745 | print "PAREN('$1') -> $type\n" |
666 | if ($dbg_values > 1); | 746 | if ($dbg_values > 1); |
667 | } else { | 747 | } else { |
@@ -670,7 +750,7 @@ sub annotate_values { | |||
670 | 750 | ||
671 | } elsif ($cur =~ /^($Ident)\(/o) { | 751 | } elsif ($cur =~ /^($Ident)\(/o) { |
672 | print "FUNC($1)\n" if ($dbg_values > 1); | 752 | print "FUNC($1)\n" if ($dbg_values > 1); |
673 | $av_paren_type[$av_paren] = 'V'; | 753 | $av_pending = 'V'; |
674 | 754 | ||
675 | } elsif ($cur =~ /^($Ident|$Constant)/o) { | 755 | } elsif ($cur =~ /^($Ident|$Constant)/o) { |
676 | print "IDENT($1)\n" if ($dbg_values > 1); | 756 | print "IDENT($1)\n" if ($dbg_values > 1); |
@@ -680,11 +760,11 @@ sub annotate_values { | |||
680 | print "ASSIGN($1)\n" if ($dbg_values > 1); | 760 | print "ASSIGN($1)\n" if ($dbg_values > 1); |
681 | $type = 'N'; | 761 | $type = 'N'; |
682 | 762 | ||
683 | } elsif ($cur =~/^(;)/) { | 763 | } elsif ($cur =~/^(;|{|})/) { |
684 | print "END($1)\n" if ($dbg_values > 1); | 764 | print "END($1)\n" if ($dbg_values > 1); |
685 | $type = 'E'; | 765 | $type = 'E'; |
686 | 766 | ||
687 | } elsif ($cur =~ /^(;|{|}|\?|:|\[)/o) { | 767 | } elsif ($cur =~ /^(;|\?|:|\[)/o) { |
688 | print "CLOSE($1)\n" if ($dbg_values > 1); | 768 | print "CLOSE($1)\n" if ($dbg_values > 1); |
689 | $type = 'N'; | 769 | $type = 'N'; |
690 | 770 | ||
@@ -988,7 +1068,7 @@ sub process { | |||
988 | } | 1068 | } |
989 | 1069 | ||
990 | # check for RCS/CVS revision markers | 1070 | # check for RCS/CVS revision markers |
991 | if ($rawline =~ /\$(Revision|Log|Id)(?:\$|)/) { | 1071 | if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) { |
992 | WARN("CVS style keyword markers, these will _not_ be updated\n". $herecurr); | 1072 | WARN("CVS style keyword markers, these will _not_ be updated\n". $herecurr); |
993 | } | 1073 | } |
994 | 1074 | ||
@@ -999,41 +1079,44 @@ sub process { | |||
999 | 1079 | ||
1000 | # Check for potential 'bare' types | 1080 | # Check for potential 'bare' types |
1001 | if ($realcnt) { | 1081 | if ($realcnt) { |
1082 | my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); | ||
1083 | $s =~ s/\n./ /g; | ||
1084 | $s =~ s/{.*$//; | ||
1085 | |||
1002 | # Ignore goto labels. | 1086 | # Ignore goto labels. |
1003 | if ($line =~ /$Ident:\*$/) { | 1087 | if ($s =~ /$Ident:\*$/) { |
1004 | 1088 | ||
1005 | # Ignore functions being called | 1089 | # Ignore functions being called |
1006 | } elsif ($line =~ /^.\s*$Ident\s*\(/) { | 1090 | } elsif ($s =~ /^.\s*$Ident\s*\(/) { |
1007 | 1091 | ||
1008 | # definitions in global scope can only start with types | 1092 | # definitions in global scope can only start with types |
1009 | } elsif ($line =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b/) { | 1093 | } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b/) { |
1010 | possible($1, $line); | 1094 | possible($1, $s); |
1011 | 1095 | ||
1012 | # declarations always start with types | 1096 | # declarations always start with types |
1013 | } elsif ($prev_values eq 'E' && $line =~ /^.\s*(?:$Storage\s+)?(?:const\s+)?($Ident)\b(:?\s+$Sparse)?\s*\**\s*$Ident\s*(?:;|=|,)/) { | 1097 | } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:const\s+)?($Ident)\b(:?\s+$Sparse)?\s*\**\s*$Ident\s*(?:;|=|,)/) { |
1014 | possible($1); | 1098 | possible($1, $s); |
1015 | } | 1099 | } |
1016 | 1100 | ||
1017 | # any (foo ... *) is a pointer cast, and foo is a type | 1101 | # any (foo ... *) is a pointer cast, and foo is a type |
1018 | while ($line =~ /\(($Ident)(?:\s+$Sparse)*\s*\*+\s*\)/g) { | 1102 | while ($s =~ /\(($Ident)(?:\s+$Sparse)*\s*\*+\s*\)/g) { |
1019 | possible($1, $line); | 1103 | possible($1, $s); |
1020 | } | 1104 | } |
1021 | 1105 | ||
1022 | # Check for any sort of function declaration. | 1106 | # Check for any sort of function declaration. |
1023 | # int foo(something bar, other baz); | 1107 | # int foo(something bar, other baz); |
1024 | # void (*store_gdt)(x86_descr_ptr *); | 1108 | # void (*store_gdt)(x86_descr_ptr *); |
1025 | if ($prev_values eq 'E' && $line =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/) { | 1109 | if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/) { |
1026 | my ($name_len) = length($1); | 1110 | my ($name_len) = length($1); |
1027 | my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, $name_len); | ||
1028 | my $ctx = join("\n", @ctx); | ||
1029 | 1111 | ||
1030 | $ctx =~ s/\n.//; | 1112 | my $ctx = $s; |
1031 | substr($ctx, 0, $name_len + 1) = ''; | 1113 | substr($ctx, 0, $name_len + 1) = ''; |
1032 | $ctx =~ s/\)[^\)]*$//; | 1114 | $ctx =~ s/\)[^\)]*$//; |
1115 | |||
1033 | for my $arg (split(/\s*,\s*/, $ctx)) { | 1116 | for my $arg (split(/\s*,\s*/, $ctx)) { |
1034 | if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/ || $arg =~ /^($Ident)$/) { | 1117 | if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/ || $arg =~ /^($Ident)$/) { |
1035 | 1118 | ||
1036 | possible($1, $line); | 1119 | possible($1, $s); |
1037 | } | 1120 | } |
1038 | } | 1121 | } |
1039 | } | 1122 | } |
@@ -1100,8 +1183,8 @@ sub process { | |||
1100 | $curr_values = $prev_values . $curr_values; | 1183 | $curr_values = $prev_values . $curr_values; |
1101 | if ($dbg_values) { | 1184 | if ($dbg_values) { |
1102 | my $outline = $opline; $outline =~ s/\t/ /g; | 1185 | my $outline = $opline; $outline =~ s/\t/ /g; |
1103 | warn "--> .$outline\n"; | 1186 | print "$linenr > .$outline\n"; |
1104 | warn "--> $curr_values\n"; | 1187 | print "$linenr > $curr_values\n"; |
1105 | } | 1188 | } |
1106 | $prev_values = substr($curr_values, -1); | 1189 | $prev_values = substr($curr_values, -1); |
1107 | 1190 | ||
@@ -1148,7 +1231,9 @@ sub process { | |||
1148 | if (($prevline !~ /^}/) && | 1231 | if (($prevline !~ /^}/) && |
1149 | ($prevline !~ /^\+}/) && | 1232 | ($prevline !~ /^\+}/) && |
1150 | ($prevline !~ /^ }/) && | 1233 | ($prevline !~ /^ }/) && |
1151 | ($prevline !~ /\b\Q$name\E(?:\s+$Attribute)?\s*(?:;|=)/)) { | 1234 | ($prevline !~ /^.DECLARE_$Ident\(\Q$name\E\)/) && |
1235 | ($prevline !~ /^.LIST_HEAD\(\Q$name\E\)/) && | ||
1236 | ($prevline !~ /\b\Q$name\E(?:\s+$Attribute)?\s*(?:;|=|\[)/)) { | ||
1152 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); | 1237 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); |
1153 | } | 1238 | } |
1154 | } | 1239 | } |
@@ -1266,7 +1351,7 @@ sub process { | |||
1266 | =>|->|<<|>>|<|>|=|!|~| | 1351 | =>|->|<<|>>|<|>|=|!|~| |
1267 | &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|% | 1352 | &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|% |
1268 | }x; | 1353 | }x; |
1269 | my @elements = split(/($;+|$ops|;)/, $opline); | 1354 | my @elements = split(/($ops|;)/, $opline); |
1270 | my $off = 0; | 1355 | my $off = 0; |
1271 | 1356 | ||
1272 | my $blank = copy_spacing($opline); | 1357 | my $blank = copy_spacing($opline); |
@@ -1277,6 +1362,7 @@ sub process { | |||
1277 | my $a = ''; | 1362 | my $a = ''; |
1278 | $a = 'V' if ($elements[$n] ne ''); | 1363 | $a = 'V' if ($elements[$n] ne ''); |
1279 | $a = 'W' if ($elements[$n] =~ /\s$/); | 1364 | $a = 'W' if ($elements[$n] =~ /\s$/); |
1365 | $a = 'C' if ($elements[$n] =~ /$;$/); | ||
1280 | $a = 'B' if ($elements[$n] =~ /(\[|\()$/); | 1366 | $a = 'B' if ($elements[$n] =~ /(\[|\()$/); |
1281 | $a = 'O' if ($elements[$n] eq ''); | 1367 | $a = 'O' if ($elements[$n] eq ''); |
1282 | $a = 'E' if ($elements[$n] eq '' && $n == 0); | 1368 | $a = 'E' if ($elements[$n] eq '' && $n == 0); |
@@ -1287,6 +1373,7 @@ sub process { | |||
1287 | if (defined $elements[$n + 2]) { | 1373 | if (defined $elements[$n + 2]) { |
1288 | $c = 'V' if ($elements[$n + 2] ne ''); | 1374 | $c = 'V' if ($elements[$n + 2] ne ''); |
1289 | $c = 'W' if ($elements[$n + 2] =~ /^\s/); | 1375 | $c = 'W' if ($elements[$n + 2] =~ /^\s/); |
1376 | $c = 'C' if ($elements[$n + 2] =~ /^$;/); | ||
1290 | $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); | 1377 | $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); |
1291 | $c = 'O' if ($elements[$n + 2] eq ''); | 1378 | $c = 'O' if ($elements[$n + 2] eq ''); |
1292 | $c = 'E' if ($elements[$n + 2] =~ /\s*\\$/); | 1379 | $c = 'E' if ($elements[$n + 2] =~ /\s*\\$/); |
@@ -1330,13 +1417,13 @@ sub process { | |||
1330 | if ($op_type ne 'V' && | 1417 | if ($op_type ne 'V' && |
1331 | $ca =~ /\s$/ && $cc =~ /^\s*,/) { | 1418 | $ca =~ /\s$/ && $cc =~ /^\s*,/) { |
1332 | 1419 | ||
1333 | # Ignore comments | 1420 | # # Ignore comments |
1334 | } elsif ($op =~ /^$;+$/) { | 1421 | # } elsif ($op =~ /^$;+$/) { |
1335 | 1422 | ||
1336 | # ; should have either the end of line or a space or \ after it | 1423 | # ; should have either the end of line or a space or \ after it |
1337 | } elsif ($op eq ';') { | 1424 | } elsif ($op eq ';') { |
1338 | if ($ctx !~ /.x[WEB]/ && $cc !~ /^\\/ && | 1425 | if ($ctx !~ /.x[WEBC]/ && |
1339 | $cc !~ /^;/) { | 1426 | $cc !~ /^\\/ && $cc !~ /^;/) { |
1340 | ERROR("need space after that '$op' $at\n" . $hereptr); | 1427 | ERROR("need space after that '$op' $at\n" . $hereptr); |
1341 | } | 1428 | } |
1342 | 1429 | ||
@@ -1351,7 +1438,7 @@ sub process { | |||
1351 | 1438 | ||
1352 | # , must have a space on the right. | 1439 | # , must have a space on the right. |
1353 | } elsif ($op eq ',') { | 1440 | } elsif ($op eq ',') { |
1354 | if ($ctx !~ /.xW|.xE/ && $cc !~ /^}/) { | 1441 | if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { |
1355 | ERROR("need space after that '$op' $at\n" . $hereptr); | 1442 | ERROR("need space after that '$op' $at\n" . $hereptr); |
1356 | } | 1443 | } |
1357 | 1444 | ||
@@ -1364,7 +1451,7 @@ sub process { | |||
1364 | # unary operator, or a cast | 1451 | # unary operator, or a cast |
1365 | } elsif ($op eq '!' || $op eq '~' || | 1452 | } elsif ($op eq '!' || $op eq '~' || |
1366 | ($is_unary && ($op eq '*' || $op eq '-' || $op eq '&'))) { | 1453 | ($is_unary && ($op eq '*' || $op eq '-' || $op eq '&'))) { |
1367 | if ($ctx !~ /[WEB]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { | 1454 | if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { |
1368 | ERROR("need space before that '$op' $at\n" . $hereptr); | 1455 | ERROR("need space before that '$op' $at\n" . $hereptr); |
1369 | } | 1456 | } |
1370 | if ($ctx =~ /.xW/) { | 1457 | if ($ctx =~ /.xW/) { |
@@ -1373,7 +1460,7 @@ sub process { | |||
1373 | 1460 | ||
1374 | # unary ++ and unary -- are allowed no space on one side. | 1461 | # unary ++ and unary -- are allowed no space on one side. |
1375 | } elsif ($op eq '++' or $op eq '--') { | 1462 | } elsif ($op eq '++' or $op eq '--') { |
1376 | if ($ctx !~ /[WOB]x[^W]/ && $ctx !~ /[^W]x[WOBE]/) { | 1463 | if ($ctx !~ /[WOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { |
1377 | ERROR("need space one side of that '$op' $at\n" . $hereptr); | 1464 | ERROR("need space one side of that '$op' $at\n" . $hereptr); |
1378 | } | 1465 | } |
1379 | if ($ctx =~ /WxB/ || ($ctx =~ /Wx./ && $cc =~ /^;/)) { | 1466 | if ($ctx =~ /WxB/ || ($ctx =~ /Wx./ && $cc =~ /^;/)) { |
@@ -1387,13 +1474,13 @@ sub process { | |||
1387 | $op eq '*' or $op eq '/' or | 1474 | $op eq '*' or $op eq '/' or |
1388 | $op eq '%') | 1475 | $op eq '%') |
1389 | { | 1476 | { |
1390 | if ($ctx !~ /VxV|WxW|VxE|WxE|VxO/) { | 1477 | if ($ctx !~ /VxV|WxW|VxE|WxE|VxO|Cx.|.xC/) { |
1391 | ERROR("need consistent spacing around '$op' $at\n" . | 1478 | ERROR("need consistent spacing around '$op' $at\n" . |
1392 | $hereptr); | 1479 | $hereptr); |
1393 | } | 1480 | } |
1394 | 1481 | ||
1395 | # All the others need spaces both sides. | 1482 | # All the others need spaces both sides. |
1396 | } elsif ($ctx !~ /[EW]x[WE]/) { | 1483 | } elsif ($ctx !~ /[EWC]x[CWE]/) { |
1397 | # Ignore email addresses <foo@bar> | 1484 | # Ignore email addresses <foo@bar> |
1398 | if (!($op eq '<' && $cb =~ /$;\S+\@\S+>/) && | 1485 | if (!($op eq '<' && $cb =~ /$;\S+\@\S+>/) && |
1399 | !($op eq '>' && $cb =~ /<\S+\@\S+$;/)) { | 1486 | !($op eq '>' && $cb =~ /<\S+\@\S+$;/)) { |
@@ -1551,7 +1638,7 @@ sub process { | |||
1551 | 1638 | ||
1552 | # multi-statement macros should be enclosed in a do while loop, grab the | 1639 | # multi-statement macros should be enclosed in a do while loop, grab the |
1553 | # first statement and ensure its the whole macro if its not enclosed | 1640 | # first statement and ensure its the whole macro if its not enclosed |
1554 | # in a known goot container | 1641 | # in a known good container |
1555 | if ($prevline =~ /\#define.*\\/ && | 1642 | if ($prevline =~ /\#define.*\\/ && |
1556 | $prevline !~/(?:do\s+{|\(\{|\{)/ && | 1643 | $prevline !~/(?:do\s+{|\(\{|\{)/ && |
1557 | $line !~ /(?:do\s+{|\(\{|\{)/ && | 1644 | $line !~ /(?:do\s+{|\(\{|\{)/ && |
@@ -1599,84 +1686,95 @@ sub process { | |||
1599 | # check for redundant bracing round if etc | 1686 | # check for redundant bracing round if etc |
1600 | if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { | 1687 | if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { |
1601 | my ($level, $endln, @chunks) = | 1688 | my ($level, $endln, @chunks) = |
1602 | ctx_statement_full($linenr, $realcnt, 0); | 1689 | ctx_statement_full($linenr, $realcnt, 1); |
1603 | #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; | 1690 | #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; |
1604 | if ($#chunks > 1 && $level == 0) { | 1691 | #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n"; |
1692 | if ($#chunks > 0 && $level == 0) { | ||
1605 | my $allowed = 0; | 1693 | my $allowed = 0; |
1606 | my $seen = 0; | 1694 | my $seen = 0; |
1695 | my $herectx = $here . "\n";; | ||
1696 | my $ln = $linenr - 1; | ||
1607 | for my $chunk (@chunks) { | 1697 | for my $chunk (@chunks) { |
1608 | my ($cond, $block) = @{$chunk}; | 1698 | my ($cond, $block) = @{$chunk}; |
1609 | 1699 | ||
1700 | $herectx .= "$rawlines[$ln]\n[...]\n"; | ||
1701 | $ln += statement_rawlines($block) - 1; | ||
1702 | |||
1610 | substr($block, 0, length($cond)) = ''; | 1703 | substr($block, 0, length($cond)) = ''; |
1611 | 1704 | ||
1612 | $seen++ if ($block =~ /^\s*{/); | 1705 | $seen++ if ($block =~ /^\s*{/); |
1613 | 1706 | ||
1614 | $block =~ s/(^|\n)./$1/g; | 1707 | #print "cond<$cond> block<$block> allowed<$allowed>\n"; |
1615 | $block =~ s/^\s*{//; | 1708 | if (statement_lines($cond) > 1) { |
1616 | $block =~ s/}\s*$//; | 1709 | #print "APW: ALLOWED: cond<$cond>\n"; |
1617 | $block =~ s/^\s*//; | ||
1618 | $block =~ s/\s*$//; | ||
1619 | |||
1620 | my @lines = ($block =~ /\n/g); | ||
1621 | my @statements = ($block =~ /;/g); | ||
1622 | |||
1623 | #print "cond<$cond> block<$block> lines<" . scalar(@lines) . "> statements<" . scalar(@statements) . "> seen<$seen> allowed<$allowed>\n"; | ||
1624 | if (scalar(@lines) != 0) { | ||
1625 | $allowed = 1; | 1710 | $allowed = 1; |
1626 | } | 1711 | } |
1627 | if ($block =~/\b(?:if|for|while)\b/) { | 1712 | if ($block =~/\b(?:if|for|while)\b/) { |
1713 | #print "APW: ALLOWED: block<$block>\n"; | ||
1628 | $allowed = 1; | 1714 | $allowed = 1; |
1629 | } | 1715 | } |
1630 | if (scalar(@statements) > 1) { | 1716 | if (statement_block_size($block) > 1) { |
1717 | #print "APW: ALLOWED: lines block<$block>\n"; | ||
1631 | $allowed = 1; | 1718 | $allowed = 1; |
1632 | } | 1719 | } |
1633 | } | 1720 | } |
1634 | if ($seen && !$allowed) { | 1721 | if ($seen && !$allowed) { |
1635 | WARN("braces {} are not necessary for any arm of this statement\n" . $herecurr); | 1722 | WARN("braces {} are not necessary for any arm of this statement\n" . $herectx); |
1636 | $suppress_ifbraces = $endln; | ||
1637 | } | 1723 | } |
1724 | # Either way we have looked over this whole | ||
1725 | # statement and said what needs to be said. | ||
1726 | $suppress_ifbraces = $endln; | ||
1638 | } | 1727 | } |
1639 | } | 1728 | } |
1640 | if ($linenr > $suppress_ifbraces && | 1729 | if ($linenr > $suppress_ifbraces && |
1641 | $line =~ /\b(if|while|for|else)\b/) { | 1730 | $line =~ /\b(if|while|for|else)\b/) { |
1642 | # Locate the end of the opening statement. | 1731 | my ($level, $endln, @chunks) = |
1643 | my @control = ctx_statement($linenr, $realcnt, 0); | 1732 | ctx_statement_full($linenr, $realcnt, $-[0]); |
1644 | my $nr = $linenr + (scalar(@control) - 1); | 1733 | |
1645 | my $cnt = $realcnt - (scalar(@control) - 1); | 1734 | my $allowed = 0; |
1646 | 1735 | ||
1647 | my $off = $realcnt - $cnt; | 1736 | # Check the pre-context. |
1648 | #print "$off: line<$line>end<" . $lines[$nr - 1] . ">\n"; | 1737 | if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) { |
1649 | 1738 | #print "APW: ALLOWED: pre<$1>\n"; | |
1650 | # If this is is a braced statement group check it | 1739 | $allowed = 1; |
1651 | if ($lines[$nr - 1] =~ /{\s*$/) { | 1740 | } |
1652 | my ($lvl, @block) = ctx_block_level($nr, $cnt); | 1741 | # Check the condition. |
1653 | 1742 | my ($cond, $block) = @{$chunks[0]}; | |
1654 | my $stmt = join("\n", @block); | 1743 | if (defined $cond) { |
1655 | # Drop the diff line leader. | 1744 | substr($block, 0, length($cond)) = ''; |
1656 | $stmt =~ s/\n./\n/g; | 1745 | } |
1657 | # Drop the code outside the block. | 1746 | if (statement_lines($cond) > 1) { |
1658 | $stmt =~ s/(^[^{]*){\s*//; | 1747 | #print "APW: ALLOWED: cond<$cond>\n"; |
1659 | my $before = $1; | 1748 | $allowed = 1; |
1660 | $stmt =~ s/\s*}([^}]*$)//; | 1749 | } |
1661 | my $after = $1; | 1750 | if ($block =~/\b(?:if|for|while)\b/) { |
1662 | 1751 | #print "APW: ALLOWED: block<$block>\n"; | |
1663 | #print "block<" . join(' ', @block) . "><" . scalar(@block) . ">\n"; | 1752 | $allowed = 1; |
1664 | #print "before<$before> stmt<$stmt> after<$after>\n\n"; | 1753 | } |
1665 | 1754 | if (statement_block_size($block) > 1) { | |
1666 | # Count the newlines, if there is only one | 1755 | #print "APW: ALLOWED: lines block<$block>\n"; |
1667 | # then the block should not have {}'s. | 1756 | $allowed = 1; |
1668 | my @lines = ($stmt =~ /\n/g); | 1757 | } |
1669 | my @statements = ($stmt =~ /;/g); | 1758 | # Check the post-context. |
1670 | #print "lines<" . scalar(@lines) . ">\n"; | 1759 | if (defined $chunks[1]) { |
1671 | #print "statements<" . scalar(@statements) . ">\n"; | 1760 | my ($cond, $block) = @{$chunks[1]}; |
1672 | if ($lvl == 0 && scalar(@lines) == 0 && | 1761 | if (defined $cond) { |
1673 | scalar(@statements) < 2 && | 1762 | substr($block, 0, length($cond)) = ''; |
1674 | $stmt !~ /{/ && $stmt !~ /\bif\b/ && | 1763 | } |
1675 | $before !~ /}/ && $after !~ /{/) { | 1764 | if ($block =~ /^\s*\{/) { |
1676 | my $herectx = "$here\n" . join("\n", @control, @block[1 .. $#block]) . "\n"; | 1765 | #print "APW: ALLOWED: chunk-1 block<$block>\n"; |
1677 | shift(@block); | 1766 | $allowed = 1; |
1678 | WARN("braces {} are not necessary for single statement blocks\n" . $herectx); | 1767 | } |
1768 | } | ||
1769 | if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) { | ||
1770 | my $herectx = $here . "\n";; | ||
1771 | my $end = $linenr + statement_rawlines($block) - 1; | ||
1772 | |||
1773 | for (my $ln = $linenr - 1; $ln < $end; $ln++) { | ||
1774 | $herectx .= $rawlines[$ln] . "\n";; | ||
1679 | } | 1775 | } |
1776 | |||
1777 | WARN("braces {} are not necessary for single statement blocks\n" . $herectx); | ||
1680 | } | 1778 | } |
1681 | } | 1779 | } |
1682 | 1780 | ||
@@ -1828,15 +1926,6 @@ sub process { | |||
1828 | print "are false positives report them to the maintainer, see\n"; | 1926 | print "are false positives report them to the maintainer, see\n"; |
1829 | print "CHECKPATCH in MAINTAINERS.\n"; | 1927 | print "CHECKPATCH in MAINTAINERS.\n"; |
1830 | } | 1928 | } |
1831 | print <<EOL if ($file == 1 && $quiet == 0); | ||
1832 | |||
1833 | WARNING: Using --file mode. Please do not send patches to linux-kernel | ||
1834 | that change whole existing files if you did not significantly change most | ||
1835 | of the the file for other reasons anyways or just wrote the file newly | ||
1836 | from scratch. Pure code style patches have a significant cost in a | ||
1837 | quickly changing code base like Linux because they cause rejects | ||
1838 | with other changes. | ||
1839 | EOL | ||
1840 | 1929 | ||
1841 | return $clean; | 1930 | return $clean; |
1842 | } | 1931 | } |
diff --git a/scripts/kernel-doc b/scripts/kernel-doc index 74c2f9db2aac..263d04ab2d94 100755 --- a/scripts/kernel-doc +++ b/scripts/kernel-doc | |||
@@ -247,6 +247,10 @@ my ($function, %function_table,%parametertypes,$declaration_purpose); | |||
247 | my ($type,$declaration_name,$return_type); | 247 | my ($type,$declaration_name,$return_type); |
248 | my ($newsection,$newcontents,$prototype,$filelist, $brcount, %source_map); | 248 | my ($newsection,$newcontents,$prototype,$filelist, $brcount, %source_map); |
249 | 249 | ||
250 | if (defined($ENV{'KBUILD_VERBOSE'})) { | ||
251 | $verbose = "$ENV{'KBUILD_VERBOSE'}"; | ||
252 | } | ||
253 | |||
250 | # Generated docbook code is inserted in a template at a point where | 254 | # Generated docbook code is inserted in a template at a point where |
251 | # docbook v3.1 requires a non-zero sequence of RefEntry's; see: | 255 | # docbook v3.1 requires a non-zero sequence of RefEntry's; see: |
252 | # http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html | 256 | # http://www.oasis-open.org/docbook/documentation/reference/html/refentry.html |
diff --git a/security/dummy.c b/security/dummy.c index 649326bf64ea..78d8f92310a4 100644 --- a/security/dummy.c +++ b/security/dummy.c | |||
@@ -181,8 +181,7 @@ static void dummy_sb_free_security (struct super_block *sb) | |||
181 | return; | 181 | return; |
182 | } | 182 | } |
183 | 183 | ||
184 | static int dummy_sb_copy_data (struct file_system_type *type, | 184 | static int dummy_sb_copy_data (char *orig, char *copy) |
185 | void *orig, void *copy) | ||
186 | { | 185 | { |
187 | return 0; | 186 | return 0; |
188 | } | 187 | } |
@@ -245,19 +244,17 @@ static void dummy_sb_post_pivotroot (struct nameidata *old_nd, struct nameidata | |||
245 | return; | 244 | return; |
246 | } | 245 | } |
247 | 246 | ||
248 | static int dummy_sb_get_mnt_opts(const struct super_block *sb, char ***mount_options, | 247 | static int dummy_sb_get_mnt_opts(const struct super_block *sb, |
249 | int **flags, int *num_opts) | 248 | struct security_mnt_opts *opts) |
250 | { | 249 | { |
251 | *mount_options = NULL; | 250 | security_init_mnt_opts(opts); |
252 | *flags = NULL; | ||
253 | *num_opts = 0; | ||
254 | return 0; | 251 | return 0; |
255 | } | 252 | } |
256 | 253 | ||
257 | static int dummy_sb_set_mnt_opts(struct super_block *sb, char **mount_options, | 254 | static int dummy_sb_set_mnt_opts(struct super_block *sb, |
258 | int *flags, int num_opts) | 255 | struct security_mnt_opts *opts) |
259 | { | 256 | { |
260 | if (unlikely(num_opts)) | 257 | if (unlikely(opts->num_mnt_opts)) |
261 | return -EOPNOTSUPP; | 258 | return -EOPNOTSUPP; |
262 | return 0; | 259 | return 0; |
263 | } | 260 | } |
@@ -268,6 +265,11 @@ static void dummy_sb_clone_mnt_opts(const struct super_block *oldsb, | |||
268 | return; | 265 | return; |
269 | } | 266 | } |
270 | 267 | ||
268 | static int dummy_sb_parse_opts_str(char *options, struct security_mnt_opts *opts) | ||
269 | { | ||
270 | return 0; | ||
271 | } | ||
272 | |||
271 | static int dummy_inode_alloc_security (struct inode *inode) | 273 | static int dummy_inode_alloc_security (struct inode *inode) |
272 | { | 274 | { |
273 | return 0; | 275 | return 0; |
@@ -1028,6 +1030,7 @@ void security_fixup_ops (struct security_operations *ops) | |||
1028 | set_to_dummy_if_null(ops, sb_get_mnt_opts); | 1030 | set_to_dummy_if_null(ops, sb_get_mnt_opts); |
1029 | set_to_dummy_if_null(ops, sb_set_mnt_opts); | 1031 | set_to_dummy_if_null(ops, sb_set_mnt_opts); |
1030 | set_to_dummy_if_null(ops, sb_clone_mnt_opts); | 1032 | set_to_dummy_if_null(ops, sb_clone_mnt_opts); |
1033 | set_to_dummy_if_null(ops, sb_parse_opts_str); | ||
1031 | set_to_dummy_if_null(ops, inode_alloc_security); | 1034 | set_to_dummy_if_null(ops, inode_alloc_security); |
1032 | set_to_dummy_if_null(ops, inode_free_security); | 1035 | set_to_dummy_if_null(ops, inode_free_security); |
1033 | set_to_dummy_if_null(ops, inode_init_security); | 1036 | set_to_dummy_if_null(ops, inode_init_security); |
diff --git a/security/security.c b/security/security.c index d15e56cbaade..b1387a6b416d 100644 --- a/security/security.c +++ b/security/security.c | |||
@@ -244,10 +244,11 @@ void security_sb_free(struct super_block *sb) | |||
244 | security_ops->sb_free_security(sb); | 244 | security_ops->sb_free_security(sb); |
245 | } | 245 | } |
246 | 246 | ||
247 | int security_sb_copy_data(struct file_system_type *type, void *orig, void *copy) | 247 | int security_sb_copy_data(char *orig, char *copy) |
248 | { | 248 | { |
249 | return security_ops->sb_copy_data(type, orig, copy); | 249 | return security_ops->sb_copy_data(orig, copy); |
250 | } | 250 | } |
251 | EXPORT_SYMBOL(security_sb_copy_data); | ||
251 | 252 | ||
252 | int security_sb_kern_mount(struct super_block *sb, void *data) | 253 | int security_sb_kern_mount(struct super_block *sb, void *data) |
253 | { | 254 | { |
@@ -306,24 +307,30 @@ void security_sb_post_pivotroot(struct nameidata *old_nd, struct nameidata *new_ | |||
306 | } | 307 | } |
307 | 308 | ||
308 | int security_sb_get_mnt_opts(const struct super_block *sb, | 309 | int security_sb_get_mnt_opts(const struct super_block *sb, |
309 | char ***mount_options, | 310 | struct security_mnt_opts *opts) |
310 | int **flags, int *num_opts) | ||
311 | { | 311 | { |
312 | return security_ops->sb_get_mnt_opts(sb, mount_options, flags, num_opts); | 312 | return security_ops->sb_get_mnt_opts(sb, opts); |
313 | } | 313 | } |
314 | 314 | ||
315 | int security_sb_set_mnt_opts(struct super_block *sb, | 315 | int security_sb_set_mnt_opts(struct super_block *sb, |
316 | char **mount_options, | 316 | struct security_mnt_opts *opts) |
317 | int *flags, int num_opts) | ||
318 | { | 317 | { |
319 | return security_ops->sb_set_mnt_opts(sb, mount_options, flags, num_opts); | 318 | return security_ops->sb_set_mnt_opts(sb, opts); |
320 | } | 319 | } |
320 | EXPORT_SYMBOL(security_sb_set_mnt_opts); | ||
321 | 321 | ||
322 | void security_sb_clone_mnt_opts(const struct super_block *oldsb, | 322 | void security_sb_clone_mnt_opts(const struct super_block *oldsb, |
323 | struct super_block *newsb) | 323 | struct super_block *newsb) |
324 | { | 324 | { |
325 | security_ops->sb_clone_mnt_opts(oldsb, newsb); | 325 | security_ops->sb_clone_mnt_opts(oldsb, newsb); |
326 | } | 326 | } |
327 | EXPORT_SYMBOL(security_sb_clone_mnt_opts); | ||
328 | |||
329 | int security_sb_parse_opts_str(char *options, struct security_mnt_opts *opts) | ||
330 | { | ||
331 | return security_ops->sb_parse_opts_str(options, opts); | ||
332 | } | ||
333 | EXPORT_SYMBOL(security_sb_parse_opts_str); | ||
327 | 334 | ||
328 | int security_inode_alloc(struct inode *inode) | 335 | int security_inode_alloc(struct inode *inode) |
329 | { | 336 | { |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 75c2e99bfb81..4bf4807f2d44 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -443,8 +443,7 @@ out: | |||
443 | * mount options, or whatever. | 443 | * mount options, or whatever. |
444 | */ | 444 | */ |
445 | static int selinux_get_mnt_opts(const struct super_block *sb, | 445 | static int selinux_get_mnt_opts(const struct super_block *sb, |
446 | char ***mount_options, int **mnt_opts_flags, | 446 | struct security_mnt_opts *opts) |
447 | int *num_opts) | ||
448 | { | 447 | { |
449 | int rc = 0, i; | 448 | int rc = 0, i; |
450 | struct superblock_security_struct *sbsec = sb->s_security; | 449 | struct superblock_security_struct *sbsec = sb->s_security; |
@@ -452,9 +451,7 @@ static int selinux_get_mnt_opts(const struct super_block *sb, | |||
452 | u32 len; | 451 | u32 len; |
453 | char tmp; | 452 | char tmp; |
454 | 453 | ||
455 | *num_opts = 0; | 454 | security_init_mnt_opts(opts); |
456 | *mount_options = NULL; | ||
457 | *mnt_opts_flags = NULL; | ||
458 | 455 | ||
459 | if (!sbsec->initialized) | 456 | if (!sbsec->initialized) |
460 | return -EINVAL; | 457 | return -EINVAL; |
@@ -470,18 +467,18 @@ static int selinux_get_mnt_opts(const struct super_block *sb, | |||
470 | /* count the number of mount options for this sb */ | 467 | /* count the number of mount options for this sb */ |
471 | for (i = 0; i < 8; i++) { | 468 | for (i = 0; i < 8; i++) { |
472 | if (tmp & 0x01) | 469 | if (tmp & 0x01) |
473 | (*num_opts)++; | 470 | opts->num_mnt_opts++; |
474 | tmp >>= 1; | 471 | tmp >>= 1; |
475 | } | 472 | } |
476 | 473 | ||
477 | *mount_options = kcalloc(*num_opts, sizeof(char *), GFP_ATOMIC); | 474 | opts->mnt_opts = kcalloc(opts->num_mnt_opts, sizeof(char *), GFP_ATOMIC); |
478 | if (!*mount_options) { | 475 | if (!opts->mnt_opts) { |
479 | rc = -ENOMEM; | 476 | rc = -ENOMEM; |
480 | goto out_free; | 477 | goto out_free; |
481 | } | 478 | } |
482 | 479 | ||
483 | *mnt_opts_flags = kcalloc(*num_opts, sizeof(int), GFP_ATOMIC); | 480 | opts->mnt_opts_flags = kcalloc(opts->num_mnt_opts, sizeof(int), GFP_ATOMIC); |
484 | if (!*mnt_opts_flags) { | 481 | if (!opts->mnt_opts_flags) { |
485 | rc = -ENOMEM; | 482 | rc = -ENOMEM; |
486 | goto out_free; | 483 | goto out_free; |
487 | } | 484 | } |
@@ -491,22 +488,22 @@ static int selinux_get_mnt_opts(const struct super_block *sb, | |||
491 | rc = security_sid_to_context(sbsec->sid, &context, &len); | 488 | rc = security_sid_to_context(sbsec->sid, &context, &len); |
492 | if (rc) | 489 | if (rc) |
493 | goto out_free; | 490 | goto out_free; |
494 | (*mount_options)[i] = context; | 491 | opts->mnt_opts[i] = context; |
495 | (*mnt_opts_flags)[i++] = FSCONTEXT_MNT; | 492 | opts->mnt_opts_flags[i++] = FSCONTEXT_MNT; |
496 | } | 493 | } |
497 | if (sbsec->flags & CONTEXT_MNT) { | 494 | if (sbsec->flags & CONTEXT_MNT) { |
498 | rc = security_sid_to_context(sbsec->mntpoint_sid, &context, &len); | 495 | rc = security_sid_to_context(sbsec->mntpoint_sid, &context, &len); |
499 | if (rc) | 496 | if (rc) |
500 | goto out_free; | 497 | goto out_free; |
501 | (*mount_options)[i] = context; | 498 | opts->mnt_opts[i] = context; |
502 | (*mnt_opts_flags)[i++] = CONTEXT_MNT; | 499 | opts->mnt_opts_flags[i++] = CONTEXT_MNT; |
503 | } | 500 | } |
504 | if (sbsec->flags & DEFCONTEXT_MNT) { | 501 | if (sbsec->flags & DEFCONTEXT_MNT) { |
505 | rc = security_sid_to_context(sbsec->def_sid, &context, &len); | 502 | rc = security_sid_to_context(sbsec->def_sid, &context, &len); |
506 | if (rc) | 503 | if (rc) |
507 | goto out_free; | 504 | goto out_free; |
508 | (*mount_options)[i] = context; | 505 | opts->mnt_opts[i] = context; |
509 | (*mnt_opts_flags)[i++] = DEFCONTEXT_MNT; | 506 | opts->mnt_opts_flags[i++] = DEFCONTEXT_MNT; |
510 | } | 507 | } |
511 | if (sbsec->flags & ROOTCONTEXT_MNT) { | 508 | if (sbsec->flags & ROOTCONTEXT_MNT) { |
512 | struct inode *root = sbsec->sb->s_root->d_inode; | 509 | struct inode *root = sbsec->sb->s_root->d_inode; |
@@ -515,24 +512,16 @@ static int selinux_get_mnt_opts(const struct super_block *sb, | |||
515 | rc = security_sid_to_context(isec->sid, &context, &len); | 512 | rc = security_sid_to_context(isec->sid, &context, &len); |
516 | if (rc) | 513 | if (rc) |
517 | goto out_free; | 514 | goto out_free; |
518 | (*mount_options)[i] = context; | 515 | opts->mnt_opts[i] = context; |
519 | (*mnt_opts_flags)[i++] = ROOTCONTEXT_MNT; | 516 | opts->mnt_opts_flags[i++] = ROOTCONTEXT_MNT; |
520 | } | 517 | } |
521 | 518 | ||
522 | BUG_ON(i != *num_opts); | 519 | BUG_ON(i != opts->num_mnt_opts); |
523 | 520 | ||
524 | return 0; | 521 | return 0; |
525 | 522 | ||
526 | out_free: | 523 | out_free: |
527 | /* don't leak context string if security_sid_to_context had an error */ | 524 | security_free_mnt_opts(opts); |
528 | if (*mount_options && i) | ||
529 | for (; i > 0; i--) | ||
530 | kfree((*mount_options)[i-1]); | ||
531 | kfree(*mount_options); | ||
532 | *mount_options = NULL; | ||
533 | kfree(*mnt_opts_flags); | ||
534 | *mnt_opts_flags = NULL; | ||
535 | *num_opts = 0; | ||
536 | return rc; | 525 | return rc; |
537 | } | 526 | } |
538 | 527 | ||
@@ -553,12 +542,13 @@ static int bad_option(struct superblock_security_struct *sbsec, char flag, | |||
553 | return 1; | 542 | return 1; |
554 | return 0; | 543 | return 0; |
555 | } | 544 | } |
545 | |||
556 | /* | 546 | /* |
557 | * Allow filesystems with binary mount data to explicitly set mount point | 547 | * Allow filesystems with binary mount data to explicitly set mount point |
558 | * labeling information. | 548 | * labeling information. |
559 | */ | 549 | */ |
560 | static int selinux_set_mnt_opts(struct super_block *sb, char **mount_options, | 550 | static int selinux_set_mnt_opts(struct super_block *sb, |
561 | int *flags, int num_opts) | 551 | struct security_mnt_opts *opts) |
562 | { | 552 | { |
563 | int rc = 0, i; | 553 | int rc = 0, i; |
564 | struct task_security_struct *tsec = current->security; | 554 | struct task_security_struct *tsec = current->security; |
@@ -568,6 +558,9 @@ static int selinux_set_mnt_opts(struct super_block *sb, char **mount_options, | |||
568 | struct inode_security_struct *root_isec = inode->i_security; | 558 | struct inode_security_struct *root_isec = inode->i_security; |
569 | u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0; | 559 | u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0; |
570 | u32 defcontext_sid = 0; | 560 | u32 defcontext_sid = 0; |
561 | char **mount_options = opts->mnt_opts; | ||
562 | int *flags = opts->mnt_opts_flags; | ||
563 | int num_opts = opts->num_mnt_opts; | ||
571 | 564 | ||
572 | mutex_lock(&sbsec->lock); | 565 | mutex_lock(&sbsec->lock); |
573 | 566 | ||
@@ -589,6 +582,21 @@ static int selinux_set_mnt_opts(struct super_block *sb, char **mount_options, | |||
589 | } | 582 | } |
590 | 583 | ||
591 | /* | 584 | /* |
585 | * Binary mount data FS will come through this function twice. Once | ||
586 | * from an explicit call and once from the generic calls from the vfs. | ||
587 | * Since the generic VFS calls will not contain any security mount data | ||
588 | * we need to skip the double mount verification. | ||
589 | * | ||
590 | * This does open a hole in which we will not notice if the first | ||
591 | * mount using this sb set explict options and a second mount using | ||
592 | * this sb does not set any security options. (The first options | ||
593 | * will be used for both mounts) | ||
594 | */ | ||
595 | if (sbsec->initialized && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA) | ||
596 | && (num_opts == 0)) | ||
597 | goto out; | ||
598 | |||
599 | /* | ||
592 | * parse the mount options, check if they are valid sids. | 600 | * parse the mount options, check if they are valid sids. |
593 | * also check if someone is trying to mount the same sb more | 601 | * also check if someone is trying to mount the same sb more |
594 | * than once with different security options. | 602 | * than once with different security options. |
@@ -792,43 +800,14 @@ static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb, | |||
792 | mutex_unlock(&newsbsec->lock); | 800 | mutex_unlock(&newsbsec->lock); |
793 | } | 801 | } |
794 | 802 | ||
795 | /* | 803 | int selinux_parse_opts_str(char *options, struct security_mnt_opts *opts) |
796 | * string mount options parsing and call set the sbsec | ||
797 | */ | ||
798 | static int superblock_doinit(struct super_block *sb, void *data) | ||
799 | { | 804 | { |
805 | char *p; | ||
800 | char *context = NULL, *defcontext = NULL; | 806 | char *context = NULL, *defcontext = NULL; |
801 | char *fscontext = NULL, *rootcontext = NULL; | 807 | char *fscontext = NULL, *rootcontext = NULL; |
802 | int rc = 0; | 808 | int rc, num_mnt_opts = 0; |
803 | char *p, *options = data; | ||
804 | /* selinux only know about a fixed number of mount options */ | ||
805 | char *mnt_opts[NUM_SEL_MNT_OPTS]; | ||
806 | int mnt_opts_flags[NUM_SEL_MNT_OPTS], num_mnt_opts = 0; | ||
807 | |||
808 | if (!data) | ||
809 | goto out; | ||
810 | 809 | ||
811 | /* with the nfs patch this will become a goto out; */ | 810 | opts->num_mnt_opts = 0; |
812 | if (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA) { | ||
813 | const char *name = sb->s_type->name; | ||
814 | /* NFS we understand. */ | ||
815 | if (!strcmp(name, "nfs")) { | ||
816 | struct nfs_mount_data *d = data; | ||
817 | |||
818 | if (d->version != NFS_MOUNT_VERSION) | ||
819 | goto out; | ||
820 | |||
821 | if (d->context[0]) { | ||
822 | context = kstrdup(d->context, GFP_KERNEL); | ||
823 | if (!context) { | ||
824 | rc = -ENOMEM; | ||
825 | goto out; | ||
826 | } | ||
827 | } | ||
828 | goto build_flags; | ||
829 | } else | ||
830 | goto out; | ||
831 | } | ||
832 | 811 | ||
833 | /* Standard string-based options. */ | 812 | /* Standard string-based options. */ |
834 | while ((p = strsep(&options, "|")) != NULL) { | 813 | while ((p = strsep(&options, "|")) != NULL) { |
@@ -901,26 +880,37 @@ static int superblock_doinit(struct super_block *sb, void *data) | |||
901 | } | 880 | } |
902 | } | 881 | } |
903 | 882 | ||
904 | build_flags: | 883 | rc = -ENOMEM; |
884 | opts->mnt_opts = kcalloc(NUM_SEL_MNT_OPTS, sizeof(char *), GFP_ATOMIC); | ||
885 | if (!opts->mnt_opts) | ||
886 | goto out_err; | ||
887 | |||
888 | opts->mnt_opts_flags = kcalloc(NUM_SEL_MNT_OPTS, sizeof(int), GFP_ATOMIC); | ||
889 | if (!opts->mnt_opts_flags) { | ||
890 | kfree(opts->mnt_opts); | ||
891 | goto out_err; | ||
892 | } | ||
893 | |||
905 | if (fscontext) { | 894 | if (fscontext) { |
906 | mnt_opts[num_mnt_opts] = fscontext; | 895 | opts->mnt_opts[num_mnt_opts] = fscontext; |
907 | mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT; | 896 | opts->mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT; |
908 | } | 897 | } |
909 | if (context) { | 898 | if (context) { |
910 | mnt_opts[num_mnt_opts] = context; | 899 | opts->mnt_opts[num_mnt_opts] = context; |
911 | mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT; | 900 | opts->mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT; |
912 | } | 901 | } |
913 | if (rootcontext) { | 902 | if (rootcontext) { |
914 | mnt_opts[num_mnt_opts] = rootcontext; | 903 | opts->mnt_opts[num_mnt_opts] = rootcontext; |
915 | mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT; | 904 | opts->mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT; |
916 | } | 905 | } |
917 | if (defcontext) { | 906 | if (defcontext) { |
918 | mnt_opts[num_mnt_opts] = defcontext; | 907 | opts->mnt_opts[num_mnt_opts] = defcontext; |
919 | mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT; | 908 | opts->mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT; |
920 | } | 909 | } |
921 | 910 | ||
922 | out: | 911 | opts->num_mnt_opts = num_mnt_opts; |
923 | rc = selinux_set_mnt_opts(sb, mnt_opts, mnt_opts_flags, num_mnt_opts); | 912 | return 0; |
913 | |||
924 | out_err: | 914 | out_err: |
925 | kfree(context); | 915 | kfree(context); |
926 | kfree(defcontext); | 916 | kfree(defcontext); |
@@ -928,6 +918,33 @@ out_err: | |||
928 | kfree(rootcontext); | 918 | kfree(rootcontext); |
929 | return rc; | 919 | return rc; |
930 | } | 920 | } |
921 | /* | ||
922 | * string mount options parsing and call set the sbsec | ||
923 | */ | ||
924 | static int superblock_doinit(struct super_block *sb, void *data) | ||
925 | { | ||
926 | int rc = 0; | ||
927 | char *options = data; | ||
928 | struct security_mnt_opts opts; | ||
929 | |||
930 | security_init_mnt_opts(&opts); | ||
931 | |||
932 | if (!data) | ||
933 | goto out; | ||
934 | |||
935 | BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA); | ||
936 | |||
937 | rc = selinux_parse_opts_str(options, &opts); | ||
938 | if (rc) | ||
939 | goto out_err; | ||
940 | |||
941 | out: | ||
942 | rc = selinux_set_mnt_opts(sb, &opts); | ||
943 | |||
944 | out_err: | ||
945 | security_free_mnt_opts(&opts); | ||
946 | return rc; | ||
947 | } | ||
931 | 948 | ||
932 | static inline u16 inode_mode_to_security_class(umode_t mode) | 949 | static inline u16 inode_mode_to_security_class(umode_t mode) |
933 | { | 950 | { |
@@ -2253,7 +2270,7 @@ static inline void take_selinux_option(char **to, char *from, int *first, | |||
2253 | } | 2270 | } |
2254 | } | 2271 | } |
2255 | 2272 | ||
2256 | static int selinux_sb_copy_data(struct file_system_type *type, void *orig, void *copy) | 2273 | static int selinux_sb_copy_data(char *orig, char *copy) |
2257 | { | 2274 | { |
2258 | int fnosec, fsec, rc = 0; | 2275 | int fnosec, fsec, rc = 0; |
2259 | char *in_save, *in_curr, *in_end; | 2276 | char *in_save, *in_curr, *in_end; |
@@ -2263,12 +2280,6 @@ static int selinux_sb_copy_data(struct file_system_type *type, void *orig, void | |||
2263 | in_curr = orig; | 2280 | in_curr = orig; |
2264 | sec_curr = copy; | 2281 | sec_curr = copy; |
2265 | 2282 | ||
2266 | /* Binary mount data: just copy */ | ||
2267 | if (type->fs_flags & FS_BINARY_MOUNTDATA) { | ||
2268 | copy_page(sec_curr, in_curr); | ||
2269 | goto out; | ||
2270 | } | ||
2271 | |||
2272 | nosec = (char *)get_zeroed_page(GFP_KERNEL); | 2283 | nosec = (char *)get_zeroed_page(GFP_KERNEL); |
2273 | if (!nosec) { | 2284 | if (!nosec) { |
2274 | rc = -ENOMEM; | 2285 | rc = -ENOMEM; |
@@ -5251,6 +5262,8 @@ static struct security_operations selinux_ops = { | |||
5251 | .sb_get_mnt_opts = selinux_get_mnt_opts, | 5262 | .sb_get_mnt_opts = selinux_get_mnt_opts, |
5252 | .sb_set_mnt_opts = selinux_set_mnt_opts, | 5263 | .sb_set_mnt_opts = selinux_set_mnt_opts, |
5253 | .sb_clone_mnt_opts = selinux_sb_clone_mnt_opts, | 5264 | .sb_clone_mnt_opts = selinux_sb_clone_mnt_opts, |
5265 | .sb_parse_opts_str = selinux_parse_opts_str, | ||
5266 | |||
5254 | 5267 | ||
5255 | .inode_alloc_security = selinux_inode_alloc_security, | 5268 | .inode_alloc_security = selinux_inode_alloc_security, |
5256 | .inode_free_security = selinux_inode_free_security, | 5269 | .inode_free_security = selinux_inode_free_security, |
diff --git a/security/selinux/include/security.h b/security/selinux/include/security.h index 837ce420d2f6..f7d2f03781f2 100644 --- a/security/selinux/include/security.h +++ b/security/selinux/include/security.h | |||
@@ -35,6 +35,11 @@ | |||
35 | #define POLICYDB_VERSION_MAX POLICYDB_VERSION_POLCAP | 35 | #define POLICYDB_VERSION_MAX POLICYDB_VERSION_POLCAP |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | #define CONTEXT_MNT 0x01 | ||
39 | #define FSCONTEXT_MNT 0x02 | ||
40 | #define ROOTCONTEXT_MNT 0x04 | ||
41 | #define DEFCONTEXT_MNT 0x08 | ||
42 | |||
38 | struct netlbl_lsm_secattr; | 43 | struct netlbl_lsm_secattr; |
39 | 44 | ||
40 | extern int selinux_enabled; | 45 | extern int selinux_enabled; |
diff --git a/security/smack/smack.h b/security/smack/smack.h index a21a0e907ab3..62c1e982849d 100644 --- a/security/smack/smack.h +++ b/security/smack/smack.h | |||
@@ -26,14 +26,6 @@ | |||
26 | #define SMK_MAXLEN 23 | 26 | #define SMK_MAXLEN 23 |
27 | #define SMK_LABELLEN (SMK_MAXLEN+1) | 27 | #define SMK_LABELLEN (SMK_MAXLEN+1) |
28 | 28 | ||
29 | /* | ||
30 | * How many kinds of access are there? | ||
31 | * Here's your answer. | ||
32 | */ | ||
33 | #define SMK_ACCESSDASH '-' | ||
34 | #define SMK_ACCESSLOW "rwxa" | ||
35 | #define SMK_ACCESSKINDS (sizeof(SMK_ACCESSLOW) - 1) | ||
36 | |||
37 | struct superblock_smack { | 29 | struct superblock_smack { |
38 | char *smk_root; | 30 | char *smk_root; |
39 | char *smk_floor; | 31 | char *smk_floor; |
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 770eb067e165..0241fd359675 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c | |||
@@ -189,17 +189,10 @@ static void smack_sb_free_security(struct super_block *sb) | |||
189 | * Copy the Smack specific mount options out of the mount | 189 | * Copy the Smack specific mount options out of the mount |
190 | * options list. | 190 | * options list. |
191 | */ | 191 | */ |
192 | static int smack_sb_copy_data(struct file_system_type *type, void *orig, | 192 | static int smack_sb_copy_data(char *orig, char *smackopts) |
193 | void *smackopts) | ||
194 | { | 193 | { |
195 | char *cp, *commap, *otheropts, *dp; | 194 | char *cp, *commap, *otheropts, *dp; |
196 | 195 | ||
197 | /* Binary mount data: just copy */ | ||
198 | if (type->fs_flags & FS_BINARY_MOUNTDATA) { | ||
199 | copy_page(smackopts, orig); | ||
200 | return 0; | ||
201 | } | ||
202 | |||
203 | otheropts = (char *)get_zeroed_page(GFP_KERNEL); | 196 | otheropts = (char *)get_zeroed_page(GFP_KERNEL); |
204 | if (otheropts == NULL) | 197 | if (otheropts == NULL) |
205 | return -ENOMEM; | 198 | return -ENOMEM; |
diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index 358c92c1a153..afe7c9b0732a 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c | |||
@@ -81,10 +81,23 @@ static struct semaphore smack_write_sem; | |||
81 | /* | 81 | /* |
82 | * Values for parsing cipso rules | 82 | * Values for parsing cipso rules |
83 | * SMK_DIGITLEN: Length of a digit field in a rule. | 83 | * SMK_DIGITLEN: Length of a digit field in a rule. |
84 | * SMK_CIPSOMEN: Minimum possible cipso rule length. | 84 | * SMK_CIPSOMIN: Minimum possible cipso rule length. |
85 | * SMK_CIPSOMAX: Maximum possible cipso rule length. | ||
85 | */ | 86 | */ |
86 | #define SMK_DIGITLEN 4 | 87 | #define SMK_DIGITLEN 4 |
87 | #define SMK_CIPSOMIN (SMK_MAXLEN + 2 * SMK_DIGITLEN) | 88 | #define SMK_CIPSOMIN (SMK_LABELLEN + 2 * SMK_DIGITLEN) |
89 | #define SMK_CIPSOMAX (SMK_CIPSOMIN + SMACK_CIPSO_MAXCATNUM * SMK_DIGITLEN) | ||
90 | |||
91 | /* | ||
92 | * Values for parsing MAC rules | ||
93 | * SMK_ACCESS: Maximum possible combination of access permissions | ||
94 | * SMK_ACCESSLEN: Maximum length for a rule access field | ||
95 | * SMK_LOADLEN: Smack rule length | ||
96 | */ | ||
97 | #define SMK_ACCESS "rwxa" | ||
98 | #define SMK_ACCESSLEN (sizeof(SMK_ACCESS) - 1) | ||
99 | #define SMK_LOADLEN (SMK_LABELLEN + SMK_LABELLEN + SMK_ACCESSLEN) | ||
100 | |||
88 | 101 | ||
89 | /* | 102 | /* |
90 | * Seq_file read operations for /smack/load | 103 | * Seq_file read operations for /smack/load |
@@ -229,14 +242,10 @@ static void smk_set_access(struct smack_rule *srp) | |||
229 | * The format is exactly: | 242 | * The format is exactly: |
230 | * char subject[SMK_LABELLEN] | 243 | * char subject[SMK_LABELLEN] |
231 | * char object[SMK_LABELLEN] | 244 | * char object[SMK_LABELLEN] |
232 | * char access[SMK_ACCESSKINDS] | 245 | * char access[SMK_ACCESSLEN] |
233 | * | ||
234 | * Anything following is commentary and ignored. | ||
235 | * | 246 | * |
236 | * writes must be SMK_LABELLEN+SMK_LABELLEN+4 bytes. | 247 | * writes must be SMK_LABELLEN+SMK_LABELLEN+SMK_ACCESSLEN bytes. |
237 | */ | 248 | */ |
238 | #define MINIMUM_LOAD (SMK_LABELLEN + SMK_LABELLEN + SMK_ACCESSKINDS) | ||
239 | |||
240 | static ssize_t smk_write_load(struct file *file, const char __user *buf, | 249 | static ssize_t smk_write_load(struct file *file, const char __user *buf, |
241 | size_t count, loff_t *ppos) | 250 | size_t count, loff_t *ppos) |
242 | { | 251 | { |
@@ -253,7 +262,7 @@ static ssize_t smk_write_load(struct file *file, const char __user *buf, | |||
253 | return -EPERM; | 262 | return -EPERM; |
254 | if (*ppos != 0) | 263 | if (*ppos != 0) |
255 | return -EINVAL; | 264 | return -EINVAL; |
256 | if (count < MINIMUM_LOAD) | 265 | if (count != SMK_LOADLEN) |
257 | return -EINVAL; | 266 | return -EINVAL; |
258 | 267 | ||
259 | data = kzalloc(count, GFP_KERNEL); | 268 | data = kzalloc(count, GFP_KERNEL); |
@@ -513,7 +522,7 @@ static ssize_t smk_write_cipso(struct file *file, const char __user *buf, | |||
513 | return -EPERM; | 522 | return -EPERM; |
514 | if (*ppos != 0) | 523 | if (*ppos != 0) |
515 | return -EINVAL; | 524 | return -EINVAL; |
516 | if (count <= SMK_CIPSOMIN) | 525 | if (count < SMK_CIPSOMIN || count > SMK_CIPSOMAX) |
517 | return -EINVAL; | 526 | return -EINVAL; |
518 | 527 | ||
519 | data = kzalloc(count + 1, GFP_KERNEL); | 528 | data = kzalloc(count + 1, GFP_KERNEL); |
@@ -547,7 +556,7 @@ static ssize_t smk_write_cipso(struct file *file, const char __user *buf, | |||
547 | if (ret != 1 || catlen > SMACK_CIPSO_MAXCATNUM) | 556 | if (ret != 1 || catlen > SMACK_CIPSO_MAXCATNUM) |
548 | goto out; | 557 | goto out; |
549 | 558 | ||
550 | if (count <= (SMK_CIPSOMIN + catlen * SMK_DIGITLEN)) | 559 | if (count != (SMK_CIPSOMIN + catlen * SMK_DIGITLEN)) |
551 | goto out; | 560 | goto out; |
552 | 561 | ||
553 | memset(mapcatset, 0, sizeof(mapcatset)); | 562 | memset(mapcatset, 0, sizeof(mapcatset)); |
diff --git a/sound/isa/sb/sb8_main.c b/sound/isa/sb/sb8_main.c index 6304c3a89ba0..fe03bb820532 100644 --- a/sound/isa/sb/sb8_main.c +++ b/sound/isa/sb/sb8_main.c | |||
@@ -277,7 +277,7 @@ static int snd_sb8_capture_prepare(struct snd_pcm_substream *substream) | |||
277 | } else { | 277 | } else { |
278 | snd_sbdsp_command(chip, 256 - runtime->rate_den); | 278 | snd_sbdsp_command(chip, 256 - runtime->rate_den); |
279 | } | 279 | } |
280 | if (chip->capture_format != SB_DSP_OUTPUT) { | 280 | if (chip->capture_format != SB_DSP_INPUT) { |
281 | count--; | 281 | count--; |
282 | snd_sbdsp_command(chip, SB_DSP_BLOCK_SIZE); | 282 | snd_sbdsp_command(chip, SB_DSP_BLOCK_SIZE); |
283 | snd_sbdsp_command(chip, count & 0xff); | 283 | snd_sbdsp_command(chip, count & 0xff); |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 19f08846d6fc..c8649282c2cf 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -1778,9 +1778,9 @@ static hda_nid_t ad1988_capsrc_nids[3] = { | |||
1778 | static struct hda_input_mux ad1988_6stack_capture_source = { | 1778 | static struct hda_input_mux ad1988_6stack_capture_source = { |
1779 | .num_items = 5, | 1779 | .num_items = 5, |
1780 | .items = { | 1780 | .items = { |
1781 | { "Front Mic", 0x0 }, | 1781 | { "Front Mic", 0x1 }, /* port-B */ |
1782 | { "Line", 0x1 }, | 1782 | { "Line", 0x2 }, /* port-C */ |
1783 | { "Mic", 0x4 }, | 1783 | { "Mic", 0x4 }, /* port-E */ |
1784 | { "CD", 0x5 }, | 1784 | { "CD", 0x5 }, |
1785 | { "Mix", 0x9 }, | 1785 | { "Mix", 0x9 }, |
1786 | }, | 1786 | }, |
@@ -1789,7 +1789,7 @@ static struct hda_input_mux ad1988_6stack_capture_source = { | |||
1789 | static struct hda_input_mux ad1988_laptop_capture_source = { | 1789 | static struct hda_input_mux ad1988_laptop_capture_source = { |
1790 | .num_items = 3, | 1790 | .num_items = 3, |
1791 | .items = { | 1791 | .items = { |
1792 | { "Mic/Line", 0x0 }, | 1792 | { "Mic/Line", 0x1 }, /* port-B */ |
1793 | { "CD", 0x5 }, | 1793 | { "CD", 0x5 }, |
1794 | { "Mix", 0x9 }, | 1794 | { "Mix", 0x9 }, |
1795 | }, | 1795 | }, |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index f7cd3a804b11..7206b30cbf94 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -1230,6 +1230,11 @@ static struct hda_verb cxt5047_toshiba_init_verbs[] = { | |||
1230 | static struct hda_verb cxt5047_hp_init_verbs[] = { | 1230 | static struct hda_verb cxt5047_hp_init_verbs[] = { |
1231 | /* pin sensing on HP jack */ | 1231 | /* pin sensing on HP jack */ |
1232 | {0x13, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, | 1232 | {0x13, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, |
1233 | /* 0x13 is actually shared by both HP and speaker; | ||
1234 | * setting the connection to 0 (=0x19) makes the master volume control | ||
1235 | * working mysteriouslly... | ||
1236 | */ | ||
1237 | {0x13, AC_VERB_SET_CONNECT_SEL, 0x0}, | ||
1233 | /* Record selector: Ext Mic */ | 1238 | /* Record selector: Ext Mic */ |
1234 | {0x12, AC_VERB_SET_CONNECT_SEL,0x03}, | 1239 | {0x12, AC_VERB_SET_CONNECT_SEL,0x03}, |
1235 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, | 1240 | {0x19, AC_VERB_SET_AMP_GAIN_MUTE, |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 777f8c01ca7a..33282f9c01c7 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -3973,8 +3973,8 @@ static struct snd_kcontrol_new alc260_fujitsu_mixer[] = { | |||
3973 | ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN), | 3973 | ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN), |
3974 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), | 3974 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x07, 0x05, HDA_INPUT), |
3975 | HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), | 3975 | HDA_CODEC_MUTE("Beep Playback Switch", 0x07, 0x05, HDA_INPUT), |
3976 | HDA_CODEC_VOLUME("Internal Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT), | 3976 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT), |
3977 | HDA_BIND_MUTE("Internal Speaker Playback Switch", 0x09, 2, HDA_INPUT), | 3977 | HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT), |
3978 | { } /* end */ | 3978 | { } /* end */ |
3979 | }; | 3979 | }; |
3980 | 3980 | ||
@@ -4005,9 +4005,9 @@ static struct snd_kcontrol_new alc260_acer_mixer[] = { | |||
4005 | HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), | 4005 | HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT), |
4006 | HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), | 4006 | HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT), |
4007 | ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), | 4007 | ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT), |
4008 | HDA_CODEC_VOLUME_MONO("Mono Speaker Playback Volume", 0x0a, 1, 0x0, | 4008 | HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, |
4009 | HDA_OUTPUT), | 4009 | HDA_OUTPUT), |
4010 | HDA_BIND_MUTE_MONO("Mono Speaker Playback Switch", 0x0a, 1, 2, | 4010 | HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, |
4011 | HDA_INPUT), | 4011 | HDA_INPUT), |
4012 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), | 4012 | HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT), |
4013 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), | 4013 | HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT), |
@@ -7639,6 +7639,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
7639 | SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), | 7639 | SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), |
7640 | SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), | 7640 | SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), |
7641 | SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), | 7641 | SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), |
7642 | SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), | ||
7642 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), | 7643 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), |
7643 | SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), | 7644 | SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), |
7644 | {} | 7645 | {} |
@@ -8102,7 +8103,7 @@ static struct snd_kcontrol_new alc262_base_mixer[] = { | |||
8102 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | 8103 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), |
8103 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | 8104 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), |
8104 | /* HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), | 8105 | /* HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), |
8105 | HDA_CODEC_MUTE("PC Beelp Playback Switch", 0x0b, 0x05, HDA_INPUT), */ | 8106 | HDA_CODEC_MUTE("PC Beep Playback Switch", 0x0b, 0x05, HDA_INPUT), */ |
8106 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT), | 8107 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT), |
8107 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), | 8108 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), |
8108 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), | 8109 | HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), |
@@ -8124,7 +8125,7 @@ static struct snd_kcontrol_new alc262_hippo1_mixer[] = { | |||
8124 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), | 8125 | HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), |
8125 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), | 8126 | HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), |
8126 | /* HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), | 8127 | /* HDA_CODEC_VOLUME("PC Beep Playback Volume", 0x0b, 0x05, HDA_INPUT), |
8127 | HDA_CODEC_MUTE("PC Beelp Playback Switch", 0x0b, 0x05, HDA_INPUT), */ | 8128 | HDA_CODEC_MUTE("PC Beep Playback Switch", 0x0b, 0x05, HDA_INPUT), */ |
8128 | /*HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),*/ | 8129 | /*HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),*/ |
8129 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | 8130 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), |
8130 | { } /* end */ | 8131 | { } /* end */ |
@@ -9238,6 +9239,7 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = { | |||
9238 | SND_PCI_QUIRK(0x104d, 0x900e, "Sony ASSAMD", ALC262_SONY_ASSAMD), | 9239 | SND_PCI_QUIRK(0x104d, 0x900e, "Sony ASSAMD", ALC262_SONY_ASSAMD), |
9239 | SND_PCI_QUIRK(0x104d, 0x9015, "Sony 0x9015", ALC262_SONY_ASSAMD), | 9240 | SND_PCI_QUIRK(0x104d, 0x9015, "Sony 0x9015", ALC262_SONY_ASSAMD), |
9240 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), | 9241 | SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU), |
9242 | SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU), | ||
9241 | SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA), | 9243 | SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA), |
9242 | SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8), | 9244 | SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8), |
9243 | SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31), | 9245 | SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31), |
@@ -12993,8 +12995,8 @@ static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = { | |||
12993 | static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { | 12995 | static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { |
12994 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 12996 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), |
12995 | 12997 | ||
12996 | HDA_CODEC_VOLUME("LineOut Playback Volume", 0x02, 0x0, HDA_OUTPUT), | 12998 | HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x02, 0x0, HDA_OUTPUT), |
12997 | HDA_CODEC_MUTE("LineOut Playback Switch", 0x1b, 0x0, HDA_OUTPUT), | 12999 | HDA_CODEC_MUTE("Line-Out Playback Switch", 0x1b, 0x0, HDA_OUTPUT), |
12998 | 13000 | ||
12999 | HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT), | 13001 | HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT), |
13000 | HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | 13002 | HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
@@ -13007,8 +13009,8 @@ static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { | |||
13007 | }; | 13009 | }; |
13008 | 13010 | ||
13009 | static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = { | 13011 | static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = { |
13010 | HDA_CODEC_VOLUME("LineOut Playback Volume", 0x02, 0x0, HDA_OUTPUT), | 13012 | HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x02, 0x0, HDA_OUTPUT), |
13011 | HDA_CODEC_MUTE("LineOut Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 13013 | HDA_CODEC_MUTE("Line-Out Playback Switch", 0x14, 0x0, HDA_OUTPUT), |
13012 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), | 13014 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), |
13013 | HDA_BIND_MUTE("Surround Playback Switch", 0x03, 2, HDA_INPUT), | 13015 | HDA_BIND_MUTE("Surround Playback Switch", 0x03, 2, HDA_INPUT), |
13014 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), | 13016 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), |
diff --git a/sound/pci/ice1712/phase.c b/sound/pci/ice1712/phase.c index 9ab4a9f383cb..5a158b73dcaa 100644 --- a/sound/pci/ice1712/phase.c +++ b/sound/pci/ice1712/phase.c | |||
@@ -51,7 +51,7 @@ | |||
51 | struct phase28_spec { | 51 | struct phase28_spec { |
52 | unsigned short master[2]; | 52 | unsigned short master[2]; |
53 | unsigned short vol[8]; | 53 | unsigned short vol[8]; |
54 | } phase28; | 54 | }; |
55 | 55 | ||
56 | /* WM8770 registers */ | 56 | /* WM8770 registers */ |
57 | #define WM_DAC_ATTEN 0x00 /* DAC1-8 analog attenuation */ | 57 | #define WM_DAC_ATTEN 0x00 /* DAC1-8 analog attenuation */ |
diff --git a/sound/pci/ice1712/revo.c b/sound/pci/ice1712/revo.c index ddd5fc8d4fe1..301bf929acd9 100644 --- a/sound/pci/ice1712/revo.c +++ b/sound/pci/ice1712/revo.c | |||
@@ -36,7 +36,7 @@ | |||
36 | struct revo51_spec { | 36 | struct revo51_spec { |
37 | struct snd_i2c_device *dev; | 37 | struct snd_i2c_device *dev; |
38 | struct snd_pt2258 *pt2258; | 38 | struct snd_pt2258 *pt2258; |
39 | } revo51; | 39 | }; |
40 | 40 | ||
41 | static void revo_i2s_mclk_changed(struct snd_ice1712 *ice) | 41 | static void revo_i2s_mclk_changed(struct snd_ice1712 *ice) |
42 | { | 42 | { |
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index 061072c7db03..c52abd0bf22e 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
@@ -1708,6 +1708,12 @@ static struct ac97_pcm ac97_pcm_defs[] __devinitdata = { | |||
1708 | }; | 1708 | }; |
1709 | 1709 | ||
1710 | static struct ac97_quirk ac97_quirks[] __devinitdata = { | 1710 | static struct ac97_quirk ac97_quirks[] __devinitdata = { |
1711 | { | ||
1712 | .subvendor = 0x0e11, | ||
1713 | .subdevice = 0x000e, | ||
1714 | .name = "Compaq Deskpro EN", /* AD1885 */ | ||
1715 | .type = AC97_TUNE_HP_ONLY | ||
1716 | }, | ||
1711 | { | 1717 | { |
1712 | .subvendor = 0x0e11, | 1718 | .subvendor = 0x0e11, |
1713 | .subdevice = 0x008a, | 1719 | .subdevice = 0x008a, |
@@ -1740,6 +1746,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = { | |||
1740 | }, | 1746 | }, |
1741 | { | 1747 | { |
1742 | .subvendor = 0x1025, | 1748 | .subvendor = 0x1025, |
1749 | .subdevice = 0x0082, | ||
1750 | .name = "Acer Travelmate 2310", | ||
1751 | .type = AC97_TUNE_HP_ONLY | ||
1752 | }, | ||
1753 | { | ||
1754 | .subvendor = 0x1025, | ||
1743 | .subdevice = 0x0083, | 1755 | .subdevice = 0x0083, |
1744 | .name = "Acer Aspire 3003LCi", | 1756 | .name = "Acer Aspire 3003LCi", |
1745 | .type = AC97_TUNE_HP_ONLY | 1757 | .type = AC97_TUNE_HP_ONLY |
diff --git a/sound/pci/oxygen/hifier.c b/sound/pci/oxygen/hifier.c index 3ea1f05228a1..666f69a3312e 100644 --- a/sound/pci/oxygen/hifier.c +++ b/sound/pci/oxygen/hifier.c | |||
@@ -150,6 +150,7 @@ static const struct oxygen_model model_hifier = { | |||
150 | .shortname = "C-Media CMI8787", | 150 | .shortname = "C-Media CMI8787", |
151 | .longname = "C-Media Oxygen HD Audio", | 151 | .longname = "C-Media Oxygen HD Audio", |
152 | .chip = "CMI8788", | 152 | .chip = "CMI8788", |
153 | .owner = THIS_MODULE, | ||
153 | .init = hifier_init, | 154 | .init = hifier_init, |
154 | .control_filter = hifier_control_filter, | 155 | .control_filter = hifier_control_filter, |
155 | .mixer_init = hifier_mixer_init, | 156 | .mixer_init = hifier_mixer_init, |
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index 40e92f5cd69c..d163397b85cc 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
@@ -389,6 +389,7 @@ static const struct oxygen_model model_xonar = { | |||
389 | .shortname = "Asus AV200", | 389 | .shortname = "Asus AV200", |
390 | .longname = "Asus Virtuoso 200", | 390 | .longname = "Asus Virtuoso 200", |
391 | .chip = "AV200", | 391 | .chip = "AV200", |
392 | .owner = THIS_MODULE, | ||
392 | .init = xonar_init, | 393 | .init = xonar_init, |
393 | .control_filter = xonar_control_filter, | 394 | .control_filter = xonar_control_filter, |
394 | .mixer_init = xonar_mixer_init, | 395 | .mixer_init = xonar_mixer_init, |
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 710e0287ef8c..569ecaca0e8b 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c | |||
@@ -681,8 +681,8 @@ static const struct aic3x_rate_divs aic3x_divs[] = { | |||
681 | {22579200, 48000, 48000, 0x0, 8, 7075}, | 681 | {22579200, 48000, 48000, 0x0, 8, 7075}, |
682 | {33868800, 48000, 48000, 0x0, 5, 8049}, | 682 | {33868800, 48000, 48000, 0x0, 5, 8049}, |
683 | /* 64k */ | 683 | /* 64k */ |
684 | {22579200, 96000, 96000, 0x1, 8, 7075}, | 684 | {22579200, 64000, 96000, 0x1, 8, 7075}, |
685 | {33868800, 96000, 96000, 0x1, 5, 8049}, | 685 | {33868800, 64000, 96000, 0x1, 5, 8049}, |
686 | /* 88.2k */ | 686 | /* 88.2k */ |
687 | {22579200, 88200, 88200, 0x0, 8, 0}, | 687 | {22579200, 88200, 88200, 0x0, 8, 0}, |
688 | {33868800, 88200, 88200, 0x0, 5, 3333}, | 688 | {33868800, 88200, 88200, 0x0, 5, 3333}, |
diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index 590baea3c4c3..524f7450804f 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c | |||
@@ -176,7 +176,8 @@ static int wm9712_add_controls(struct snd_soc_codec *codec) | |||
176 | * the codec only has a single control that is shared by both channels. | 176 | * the codec only has a single control that is shared by both channels. |
177 | * This makes it impossible to determine the audio path. | 177 | * This makes it impossible to determine the audio path. |
178 | */ | 178 | */ |
179 | static int mixer_event (struct snd_soc_dapm_widget *w, int event) | 179 | static int mixer_event(struct snd_soc_dapm_widget *w, |
180 | struct snd_kcontrol *k, int event) | ||
180 | { | 181 | { |
181 | u16 l, r, beep, line, phone, mic, pcm, aux; | 182 | u16 l, r, beep, line, phone, mic, pcm, aux; |
182 | 183 | ||
diff --git a/sound/soc/pxa/corgi.c b/sound/soc/pxa/corgi.c index 3f34e531bebf..1a70a6ac98ce 100644 --- a/sound/soc/pxa/corgi.c +++ b/sound/soc/pxa/corgi.c | |||
@@ -215,7 +215,8 @@ static int corgi_set_spk(struct snd_kcontrol *kcontrol, | |||
215 | return 1; | 215 | return 1; |
216 | } | 216 | } |
217 | 217 | ||
218 | static int corgi_amp_event(struct snd_soc_dapm_widget *w, int event) | 218 | static int corgi_amp_event(struct snd_soc_dapm_widget *w, |
219 | struct snd_kcontrol *k, int event) | ||
219 | { | 220 | { |
220 | if (SND_SOC_DAPM_EVENT_ON(event)) | 221 | if (SND_SOC_DAPM_EVENT_ON(event)) |
221 | set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_APM_ON); | 222 | set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_APM_ON); |
@@ -225,7 +226,8 @@ static int corgi_amp_event(struct snd_soc_dapm_widget *w, int event) | |||
225 | return 0; | 226 | return 0; |
226 | } | 227 | } |
227 | 228 | ||
228 | static int corgi_mic_event(struct snd_soc_dapm_widget *w, int event) | 229 | static int corgi_mic_event(struct snd_soc_dapm_widget *w, |
230 | struct snd_kcontrol *k, int event) | ||
229 | { | 231 | { |
230 | if (SND_SOC_DAPM_EVENT_ON(event)) | 232 | if (SND_SOC_DAPM_EVENT_ON(event)) |
231 | set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MIC_BIAS); | 233 | set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MIC_BIAS); |
diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c index 5ae59bd309a3..4fbf8bba9627 100644 --- a/sound/soc/pxa/poodle.c +++ b/sound/soc/pxa/poodle.c | |||
@@ -196,7 +196,8 @@ static int poodle_set_spk(struct snd_kcontrol *kcontrol, | |||
196 | return 1; | 196 | return 1; |
197 | } | 197 | } |
198 | 198 | ||
199 | static int poodle_amp_event(struct snd_soc_dapm_widget *w, int event) | 199 | static int poodle_amp_event(struct snd_soc_dapm_widget *w, |
200 | struct snd_kcontrol *k, int event) | ||
200 | { | 201 | { |
201 | if (SND_SOC_DAPM_EVENT_ON(event)) | 202 | if (SND_SOC_DAPM_EVENT_ON(event)) |
202 | locomo_gpio_write(&poodle_locomo_device.dev, | 203 | locomo_gpio_write(&poodle_locomo_device.dev, |
diff --git a/sound/soc/pxa/spitz.c b/sound/soc/pxa/spitz.c index d56709e15435..ecca39033fcc 100644 --- a/sound/soc/pxa/spitz.c +++ b/sound/soc/pxa/spitz.c | |||
@@ -215,7 +215,8 @@ static int spitz_set_spk(struct snd_kcontrol *kcontrol, | |||
215 | return 1; | 215 | return 1; |
216 | } | 216 | } |
217 | 217 | ||
218 | static int spitz_mic_bias(struct snd_soc_dapm_widget *w, int event) | 218 | static int spitz_mic_bias(struct snd_soc_dapm_widget *w, |
219 | struct snd_kcontrol *k, int event) | ||
219 | { | 220 | { |
220 | if (machine_is_borzoi() || machine_is_spitz()) { | 221 | if (machine_is_borzoi() || machine_is_spitz()) { |
221 | if (SND_SOC_DAPM_EVENT_ON(event)) | 222 | if (SND_SOC_DAPM_EVENT_ON(event)) |
diff --git a/sound/soc/pxa/tosa.c b/sound/soc/pxa/tosa.c index e4d40b528ca4..7346d7e5d066 100644 --- a/sound/soc/pxa/tosa.c +++ b/sound/soc/pxa/tosa.c | |||
@@ -135,7 +135,8 @@ static int tosa_set_spk(struct snd_kcontrol *kcontrol, | |||
135 | } | 135 | } |
136 | 136 | ||
137 | /* tosa dapm event handlers */ | 137 | /* tosa dapm event handlers */ |
138 | static int tosa_hp_event(struct snd_soc_dapm_widget *w, int event) | 138 | static int tosa_hp_event(struct snd_soc_dapm_widget *w, |
139 | struct snd_kcontrol *k, int event) | ||
139 | { | 140 | { |
140 | if (SND_SOC_DAPM_EVENT_ON(event)) | 141 | if (SND_SOC_DAPM_EVENT_ON(event)) |
141 | set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_L_MUTE); | 142 | set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_L_MUTE); |
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 8fa935665702..f48838a078cb 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
@@ -479,6 +479,33 @@ static int retire_playback_sync_urb_hs(struct snd_usb_substream *subs, | |||
479 | return 0; | 479 | return 0; |
480 | } | 480 | } |
481 | 481 | ||
482 | /* | ||
483 | * process after E-Mu 0202/0404 high speed playback sync complete | ||
484 | * | ||
485 | * These devices return the number of samples per packet instead of the number | ||
486 | * of samples per microframe. | ||
487 | */ | ||
488 | static int retire_playback_sync_urb_hs_emu(struct snd_usb_substream *subs, | ||
489 | struct snd_pcm_runtime *runtime, | ||
490 | struct urb *urb) | ||
491 | { | ||
492 | unsigned int f; | ||
493 | unsigned long flags; | ||
494 | |||
495 | if (urb->iso_frame_desc[0].status == 0 && | ||
496 | urb->iso_frame_desc[0].actual_length == 4) { | ||
497 | f = combine_quad((u8*)urb->transfer_buffer) & 0x0fffffff; | ||
498 | f >>= subs->datainterval; | ||
499 | if (f >= subs->freqn - subs->freqn / 8 && f <= subs->freqmax) { | ||
500 | spin_lock_irqsave(&subs->lock, flags); | ||
501 | subs->freqm = f; | ||
502 | spin_unlock_irqrestore(&subs->lock, flags); | ||
503 | } | ||
504 | } | ||
505 | |||
506 | return 0; | ||
507 | } | ||
508 | |||
482 | /* determine the number of frames in the next packet */ | 509 | /* determine the number of frames in the next packet */ |
483 | static int snd_usb_audio_next_packet_size(struct snd_usb_substream *subs) | 510 | static int snd_usb_audio_next_packet_size(struct snd_usb_substream *subs) |
484 | { | 511 | { |
@@ -1735,6 +1762,8 @@ static int check_hw_params_convention(struct snd_usb_substream *subs) | |||
1735 | 1762 | ||
1736 | channels = kcalloc(MAX_MASK, sizeof(u32), GFP_KERNEL); | 1763 | channels = kcalloc(MAX_MASK, sizeof(u32), GFP_KERNEL); |
1737 | rates = kcalloc(MAX_MASK, sizeof(u32), GFP_KERNEL); | 1764 | rates = kcalloc(MAX_MASK, sizeof(u32), GFP_KERNEL); |
1765 | if (!channels || !rates) | ||
1766 | goto __out; | ||
1738 | 1767 | ||
1739 | list_for_each(p, &subs->fmt_list) { | 1768 | list_for_each(p, &subs->fmt_list) { |
1740 | struct audioformat *f; | 1769 | struct audioformat *f; |
@@ -2219,10 +2248,17 @@ static void init_substream(struct snd_usb_stream *as, int stream, struct audiofo | |||
2219 | subs->stream = as; | 2248 | subs->stream = as; |
2220 | subs->direction = stream; | 2249 | subs->direction = stream; |
2221 | subs->dev = as->chip->dev; | 2250 | subs->dev = as->chip->dev; |
2222 | if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL) | 2251 | if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL) { |
2223 | subs->ops = audio_urb_ops[stream]; | 2252 | subs->ops = audio_urb_ops[stream]; |
2224 | else | 2253 | } else { |
2225 | subs->ops = audio_urb_ops_high_speed[stream]; | 2254 | subs->ops = audio_urb_ops_high_speed[stream]; |
2255 | switch (as->chip->usb_id) { | ||
2256 | case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */ | ||
2257 | case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */ | ||
2258 | subs->ops.retire_sync = retire_playback_sync_urb_hs_emu; | ||
2259 | break; | ||
2260 | } | ||
2261 | } | ||
2226 | snd_pcm_set_ops(as->pcm, stream, | 2262 | snd_pcm_set_ops(as->pcm, stream, |
2227 | stream == SNDRV_PCM_STREAM_PLAYBACK ? | 2263 | stream == SNDRV_PCM_STREAM_PLAYBACK ? |
2228 | &snd_usb_playback_ops : &snd_usb_capture_ops); | 2264 | &snd_usb_playback_ops : &snd_usb_capture_ops); |
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c index 317f8e211cd2..4232fd75dd20 100644 --- a/virt/kvm/ioapic.c +++ b/virt/kvm/ioapic.c | |||
@@ -211,6 +211,10 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int irq) | |||
211 | case IOAPIC_LOWEST_PRIORITY: | 211 | case IOAPIC_LOWEST_PRIORITY: |
212 | vcpu = kvm_get_lowest_prio_vcpu(ioapic->kvm, vector, | 212 | vcpu = kvm_get_lowest_prio_vcpu(ioapic->kvm, vector, |
213 | deliver_bitmask); | 213 | deliver_bitmask); |
214 | #ifdef CONFIG_X86 | ||
215 | if (irq == 0) | ||
216 | vcpu = ioapic->kvm->vcpus[0]; | ||
217 | #endif | ||
214 | if (vcpu != NULL) | 218 | if (vcpu != NULL) |
215 | ioapic_inj_irq(ioapic, vcpu, vector, | 219 | ioapic_inj_irq(ioapic, vcpu, vector, |
216 | trig_mode, delivery_mode); | 220 | trig_mode, delivery_mode); |
@@ -220,6 +224,10 @@ static void ioapic_deliver(struct kvm_ioapic *ioapic, int irq) | |||
220 | deliver_bitmask, vector, IOAPIC_LOWEST_PRIORITY); | 224 | deliver_bitmask, vector, IOAPIC_LOWEST_PRIORITY); |
221 | break; | 225 | break; |
222 | case IOAPIC_FIXED: | 226 | case IOAPIC_FIXED: |
227 | #ifdef CONFIG_X86 | ||
228 | if (irq == 0) | ||
229 | deliver_bitmask = 1; | ||
230 | #endif | ||
223 | for (vcpu_id = 0; deliver_bitmask != 0; vcpu_id++) { | 231 | for (vcpu_id = 0; deliver_bitmask != 0; vcpu_id++) { |
224 | if (!(deliver_bitmask & (1 << vcpu_id))) | 232 | if (!(deliver_bitmask & (1 << vcpu_id))) |
225 | continue; | 233 | continue; |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 32fbf8006969..b2e12893e3f4 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -169,6 +169,7 @@ static struct kvm *kvm_create_vm(void) | |||
169 | kvm_io_bus_init(&kvm->pio_bus); | 169 | kvm_io_bus_init(&kvm->pio_bus); |
170 | mutex_init(&kvm->lock); | 170 | mutex_init(&kvm->lock); |
171 | kvm_io_bus_init(&kvm->mmio_bus); | 171 | kvm_io_bus_init(&kvm->mmio_bus); |
172 | init_rwsem(&kvm->slots_lock); | ||
172 | spin_lock(&kvm_lock); | 173 | spin_lock(&kvm_lock); |
173 | list_add(&kvm->vm_list, &vm_list); | 174 | list_add(&kvm->vm_list, &vm_list); |
174 | spin_unlock(&kvm_lock); | 175 | spin_unlock(&kvm_lock); |
@@ -339,9 +340,9 @@ int kvm_set_memory_region(struct kvm *kvm, | |||
339 | { | 340 | { |
340 | int r; | 341 | int r; |
341 | 342 | ||
342 | down_write(¤t->mm->mmap_sem); | 343 | down_write(&kvm->slots_lock); |
343 | r = __kvm_set_memory_region(kvm, mem, user_alloc); | 344 | r = __kvm_set_memory_region(kvm, mem, user_alloc); |
344 | up_write(¤t->mm->mmap_sem); | 345 | up_write(&kvm->slots_lock); |
345 | return r; | 346 | return r; |
346 | } | 347 | } |
347 | EXPORT_SYMBOL_GPL(kvm_set_memory_region); | 348 | EXPORT_SYMBOL_GPL(kvm_set_memory_region); |