diff options
219 files changed, 1753 insertions, 2084 deletions
@@ -80,6 +80,8 @@ Nguyen Anh Quynh <aquynh@gmail.com> | |||
80 | Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> | 80 | Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> |
81 | Patrick Mochel <mochel@digitalimplant.org> | 81 | Patrick Mochel <mochel@digitalimplant.org> |
82 | Peter A Jonsson <pj@ludd.ltu.se> | 82 | Peter A Jonsson <pj@ludd.ltu.se> |
83 | Peter Oruba <peter@oruba.de> | ||
84 | Peter Oruba <peter.oruba@amd.com> | ||
83 | Praveen BP <praveenbp@ti.com> | 85 | Praveen BP <praveenbp@ti.com> |
84 | Rajesh Shah <rajesh.shah@intel.com> | 86 | Rajesh Shah <rajesh.shah@intel.com> |
85 | Ralf Baechle <ralf@linux-mips.org> | 87 | Ralf Baechle <ralf@linux-mips.org> |
diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index 7286ad090db7..edef85ce1195 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX | |||
@@ -172,7 +172,7 @@ i2c/ | |||
172 | - directory with info about the I2C bus/protocol (2 wire, kHz speed). | 172 | - directory with info about the I2C bus/protocol (2 wire, kHz speed). |
173 | i2o/ | 173 | i2o/ |
174 | - directory with info about the Linux I2O subsystem. | 174 | - directory with info about the Linux I2O subsystem. |
175 | i386/ | 175 | x86/i386/ |
176 | - directory with info about Linux on Intel 32 bit architecture. | 176 | - directory with info about Linux on Intel 32 bit architecture. |
177 | ia64/ | 177 | ia64/ |
178 | - directory with info about Linux on Intel 64 bit architecture. | 178 | - directory with info about Linux on Intel 64 bit architecture. |
@@ -382,7 +382,7 @@ w1/ | |||
382 | - directory with documents regarding the 1-wire (w1) subsystem. | 382 | - directory with documents regarding the 1-wire (w1) subsystem. |
383 | watchdog/ | 383 | watchdog/ |
384 | - how to auto-reboot Linux if it has "fallen and can't get up". ;-) | 384 | - how to auto-reboot Linux if it has "fallen and can't get up". ;-) |
385 | x86_64/ | 385 | x86/x86_64/ |
386 | - directory with info on Linux support for AMD x86-64 (Hammer) machines. | 386 | - directory with info on Linux support for AMD x86-64 (Hammer) machines. |
387 | zorro.txt | 387 | zorro.txt |
388 | - info on writing drivers for Zorro bus devices found on Amigas. | 388 | - info on writing drivers for Zorro bus devices found on Amigas. |
diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile index fabc06466b93..9b1f6ca100d1 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile | |||
@@ -136,7 +136,7 @@ quiet_cmd_db2ps = PS $@ | |||
136 | %.ps : %.xml | 136 | %.ps : %.xml |
137 | $(call cmd,db2ps) | 137 | $(call cmd,db2ps) |
138 | 138 | ||
139 | quiet_cmd_db2pdf = PDF $@ | 139 | quiet_cmd_db2pdf = PDF $@ |
140 | cmd_db2pdf = $(subst TYPE,pdf, $($(PDF_METHOD)template)) | 140 | cmd_db2pdf = $(subst TYPE,pdf, $($(PDF_METHOD)template)) |
141 | %.pdf : %.xml | 141 | %.pdf : %.xml |
142 | $(call cmd,db2pdf) | 142 | $(call cmd,db2pdf) |
@@ -148,7 +148,7 @@ build_main_index = rm -rf $(main_idx) && \ | |||
148 | echo '<h2>Kernel Version: $(KERNELVERSION)</h2>' >> $(main_idx) && \ | 148 | echo '<h2>Kernel Version: $(KERNELVERSION)</h2>' >> $(main_idx) && \ |
149 | cat $(HTML) >> $(main_idx) | 149 | cat $(HTML) >> $(main_idx) |
150 | 150 | ||
151 | quiet_cmd_db2html = HTML $@ | 151 | quiet_cmd_db2html = HTML $@ |
152 | cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \ | 152 | cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \ |
153 | echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \ | 153 | echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \ |
154 | $(patsubst %.html,%,$(notdir $@))</a><p>' > $@ | 154 | $(patsubst %.html,%,$(notdir $@))</a><p>' > $@ |
diff --git a/Documentation/DocBook/deviceiobook.tmpl b/Documentation/DocBook/deviceiobook.tmpl index 60d6e0b81bd9..3ed88126ab8f 100644 --- a/Documentation/DocBook/deviceiobook.tmpl +++ b/Documentation/DocBook/deviceiobook.tmpl | |||
@@ -24,7 +24,7 @@ | |||
24 | <surname>Cox</surname> | 24 | <surname>Cox</surname> |
25 | <affiliation> | 25 | <affiliation> |
26 | <address> | 26 | <address> |
27 | <email>alan@redhat.com</email> | 27 | <email>alan@lxorguk.ukuu.org.uk</email> |
28 | </address> | 28 | </address> |
29 | </affiliation> | 29 | </affiliation> |
30 | </author> | 30 | </author> |
diff --git a/Documentation/DocBook/mcabook.tmpl b/Documentation/DocBook/mcabook.tmpl index 499eddc2d079..467ccac6ec50 100644 --- a/Documentation/DocBook/mcabook.tmpl +++ b/Documentation/DocBook/mcabook.tmpl | |||
@@ -12,7 +12,7 @@ | |||
12 | <surname>Cox</surname> | 12 | <surname>Cox</surname> |
13 | <affiliation> | 13 | <affiliation> |
14 | <address> | 14 | <address> |
15 | <email>alan@redhat.com</email> | 15 | <email>alan@lxorguk.ukuu.org.uk</email> |
16 | </address> | 16 | </address> |
17 | </affiliation> | 17 | </affiliation> |
18 | </author> | 18 | </author> |
diff --git a/Documentation/DocBook/wanbook.tmpl b/Documentation/DocBook/wanbook.tmpl index 9eebcc304de4..8c93db122f04 100644 --- a/Documentation/DocBook/wanbook.tmpl +++ b/Documentation/DocBook/wanbook.tmpl | |||
@@ -12,7 +12,7 @@ | |||
12 | <surname>Cox</surname> | 12 | <surname>Cox</surname> |
13 | <affiliation> | 13 | <affiliation> |
14 | <address> | 14 | <address> |
15 | <email>alan@redhat.com</email> | 15 | <email>alan@lxorguk.ukuu.org.uk</email> |
16 | </address> | 16 | </address> |
17 | </affiliation> | 17 | </affiliation> |
18 | </author> | 18 | </author> |
diff --git a/Documentation/DocBook/z8530book.tmpl b/Documentation/DocBook/z8530book.tmpl index a42a8a4c7689..6f3883be877e 100644 --- a/Documentation/DocBook/z8530book.tmpl +++ b/Documentation/DocBook/z8530book.tmpl | |||
@@ -12,7 +12,7 @@ | |||
12 | <surname>Cox</surname> | 12 | <surname>Cox</surname> |
13 | <affiliation> | 13 | <affiliation> |
14 | <address> | 14 | <address> |
15 | <email>alan@redhat.com</email> | 15 | <email>alan@lxorguk.ukuu.org.uk</email> |
16 | </address> | 16 | </address> |
17 | </affiliation> | 17 | </affiliation> |
18 | </author> | 18 | </author> |
diff --git a/Documentation/ManagementStyle b/Documentation/ManagementStyle index 49a8efa5afeb..a5f0ea58c788 100644 --- a/Documentation/ManagementStyle +++ b/Documentation/ManagementStyle | |||
@@ -17,7 +17,7 @@ companies. If you sign purchase orders or you have any clue about the | |||
17 | budget of your group, you're almost certainly not a kernel manager. | 17 | budget of your group, you're almost certainly not a kernel manager. |
18 | These suggestions may or may not apply to you. | 18 | These suggestions may or may not apply to you. |
19 | 19 | ||
20 | First off, I'd suggest buying "Seven Habits of Highly Successful | 20 | First off, I'd suggest buying "Seven Habits of Highly Effective |
21 | People", and NOT read it. Burn it, it's a great symbolic gesture. | 21 | People", and NOT read it. Burn it, it's a great symbolic gesture. |
22 | 22 | ||
23 | (*) This document does so not so much by answering the question, but by | 23 | (*) This document does so not so much by answering the question, but by |
diff --git a/Documentation/accounting/.gitignore b/Documentation/accounting/.gitignore new file mode 100644 index 000000000000..86485203c4ae --- /dev/null +++ b/Documentation/accounting/.gitignore | |||
@@ -0,0 +1 @@ | |||
getdelays | |||
diff --git a/Documentation/auxdisplay/.gitignore b/Documentation/auxdisplay/.gitignore new file mode 100644 index 000000000000..7af222860a96 --- /dev/null +++ b/Documentation/auxdisplay/.gitignore | |||
@@ -0,0 +1 @@ | |||
cfag12864b-example | |||
diff --git a/Documentation/connector/.gitignore b/Documentation/connector/.gitignore new file mode 100644 index 000000000000..d2b9c32accd4 --- /dev/null +++ b/Documentation/connector/.gitignore | |||
@@ -0,0 +1 @@ | |||
ucon | |||
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 8362860e21a7..23d2f4460deb 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -161,8 +161,12 @@ prototypes: | |||
161 | int (*set_page_dirty)(struct page *page); | 161 | int (*set_page_dirty)(struct page *page); |
162 | int (*readpages)(struct file *filp, struct address_space *mapping, | 162 | int (*readpages)(struct file *filp, struct address_space *mapping, |
163 | struct list_head *pages, unsigned nr_pages); | 163 | struct list_head *pages, unsigned nr_pages); |
164 | int (*prepare_write)(struct file *, struct page *, unsigned, unsigned); | 164 | int (*write_begin)(struct file *, struct address_space *mapping, |
165 | int (*commit_write)(struct file *, struct page *, unsigned, unsigned); | 165 | loff_t pos, unsigned len, unsigned flags, |
166 | struct page **pagep, void **fsdata); | ||
167 | int (*write_end)(struct file *, struct address_space *mapping, | ||
168 | loff_t pos, unsigned len, unsigned copied, | ||
169 | struct page *page, void *fsdata); | ||
166 | sector_t (*bmap)(struct address_space *, sector_t); | 170 | sector_t (*bmap)(struct address_space *, sector_t); |
167 | int (*invalidatepage) (struct page *, unsigned long); | 171 | int (*invalidatepage) (struct page *, unsigned long); |
168 | int (*releasepage) (struct page *, int); | 172 | int (*releasepage) (struct page *, int); |
@@ -180,8 +184,6 @@ sync_page: no maybe | |||
180 | writepages: no | 184 | writepages: no |
181 | set_page_dirty no no | 185 | set_page_dirty no no |
182 | readpages: no | 186 | readpages: no |
183 | prepare_write: no yes yes | ||
184 | commit_write: no yes yes | ||
185 | write_begin: no locks the page yes | 187 | write_begin: no locks the page yes |
186 | write_end: no yes, unlocks yes | 188 | write_end: no yes, unlocks yes |
187 | perform_write: no n/a yes | 189 | perform_write: no n/a yes |
@@ -191,7 +193,7 @@ releasepage: no yes | |||
191 | direct_IO: no | 193 | direct_IO: no |
192 | launder_page: no yes | 194 | launder_page: no yes |
193 | 195 | ||
194 | ->prepare_write(), ->commit_write(), ->sync_page() and ->readpage() | 196 | ->write_begin(), ->write_end(), ->sync_page() and ->readpage() |
195 | may be called from the request handler (/dev/loop). | 197 | may be called from the request handler (/dev/loop). |
196 | 198 | ||
197 | ->readpage() unlocks the page, either synchronously or via I/O | 199 | ->readpage() unlocks the page, either synchronously or via I/O |
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index c4d348dabe94..5579bda58a6d 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -492,7 +492,7 @@ written-back to storage typically in whole pages, however the | |||
492 | address_space has finer control of write sizes. | 492 | address_space has finer control of write sizes. |
493 | 493 | ||
494 | The read process essentially only requires 'readpage'. The write | 494 | The read process essentially only requires 'readpage'. The write |
495 | process is more complicated and uses prepare_write/commit_write or | 495 | process is more complicated and uses write_begin/write_end or |
496 | set_page_dirty to write data into the address_space, and writepage, | 496 | set_page_dirty to write data into the address_space, and writepage, |
497 | sync_page, and writepages to writeback data to storage. | 497 | sync_page, and writepages to writeback data to storage. |
498 | 498 | ||
@@ -521,8 +521,6 @@ struct address_space_operations { | |||
521 | int (*set_page_dirty)(struct page *page); | 521 | int (*set_page_dirty)(struct page *page); |
522 | int (*readpages)(struct file *filp, struct address_space *mapping, | 522 | int (*readpages)(struct file *filp, struct address_space *mapping, |
523 | struct list_head *pages, unsigned nr_pages); | 523 | struct list_head *pages, unsigned nr_pages); |
524 | int (*prepare_write)(struct file *, struct page *, unsigned, unsigned); | ||
525 | int (*commit_write)(struct file *, struct page *, unsigned, unsigned); | ||
526 | int (*write_begin)(struct file *, struct address_space *mapping, | 524 | int (*write_begin)(struct file *, struct address_space *mapping, |
527 | loff_t pos, unsigned len, unsigned flags, | 525 | loff_t pos, unsigned len, unsigned flags, |
528 | struct page **pagep, void **fsdata); | 526 | struct page **pagep, void **fsdata); |
@@ -598,37 +596,7 @@ struct address_space_operations { | |||
598 | readpages is only used for read-ahead, so read errors are | 596 | readpages is only used for read-ahead, so read errors are |
599 | ignored. If anything goes wrong, feel free to give up. | 597 | ignored. If anything goes wrong, feel free to give up. |
600 | 598 | ||
601 | prepare_write: called by the generic write path in VM to set up a write | 599 | write_begin: |
602 | request for a page. This indicates to the address space that | ||
603 | the given range of bytes is about to be written. The | ||
604 | address_space should check that the write will be able to | ||
605 | complete, by allocating space if necessary and doing any other | ||
606 | internal housekeeping. If the write will update parts of | ||
607 | any basic-blocks on storage, then those blocks should be | ||
608 | pre-read (if they haven't been read already) so that the | ||
609 | updated blocks can be written out properly. | ||
610 | The page will be locked. | ||
611 | |||
612 | Note: the page _must not_ be marked uptodate in this function | ||
613 | (or anywhere else) unless it actually is uptodate right now. As | ||
614 | soon as a page is marked uptodate, it is possible for a concurrent | ||
615 | read(2) to copy it to userspace. | ||
616 | |||
617 | commit_write: If prepare_write succeeds, new data will be copied | ||
618 | into the page and then commit_write will be called. It will | ||
619 | typically update the size of the file (if appropriate) and | ||
620 | mark the inode as dirty, and do any other related housekeeping | ||
621 | operations. It should avoid returning an error if possible - | ||
622 | errors should have been handled by prepare_write. | ||
623 | |||
624 | write_begin: This is intended as a replacement for prepare_write. The | ||
625 | key differences being that: | ||
626 | - it returns a locked page (in *pagep) rather than being | ||
627 | given a pre locked page; | ||
628 | - it must be able to cope with short writes (where the | ||
629 | length passed to write_begin is greater than the number | ||
630 | of bytes copied into the page). | ||
631 | |||
632 | Called by the generic buffered write code to ask the filesystem to | 600 | Called by the generic buffered write code to ask the filesystem to |
633 | prepare to write len bytes at the given offset in the file. The | 601 | prepare to write len bytes at the given offset in the file. The |
634 | address_space should check that the write will be able to complete, | 602 | address_space should check that the write will be able to complete, |
@@ -640,6 +608,9 @@ struct address_space_operations { | |||
640 | The filesystem must return the locked pagecache page for the specified | 608 | The filesystem must return the locked pagecache page for the specified |
641 | offset, in *pagep, for the caller to write into. | 609 | offset, in *pagep, for the caller to write into. |
642 | 610 | ||
611 | It must be able to cope with short writes (where the length passed to | ||
612 | write_begin is greater than the number of bytes copied into the page). | ||
613 | |||
643 | flags is a field for AOP_FLAG_xxx flags, described in | 614 | flags is a field for AOP_FLAG_xxx flags, described in |
644 | include/linux/fs.h. | 615 | include/linux/fs.h. |
645 | 616 | ||
diff --git a/Documentation/i2c/busses/i2c-sis96x b/Documentation/i2c/busses/i2c-sis96x index 266481fd26e2..70e6a0cc1e15 100644 --- a/Documentation/i2c/busses/i2c-sis96x +++ b/Documentation/i2c/busses/i2c-sis96x | |||
@@ -42,7 +42,7 @@ I suspect that this driver could be made to work for the following SiS | |||
42 | chipsets as well: 635, and 635T. If anyone owns a board with those chips | 42 | chipsets as well: 635, and 635T. If anyone owns a board with those chips |
43 | AND is willing to risk crashing & burning an otherwise well-behaved kernel | 43 | AND is willing to risk crashing & burning an otherwise well-behaved kernel |
44 | in the name of progress... please contact me at <mhoffman@lightlink.com> or | 44 | in the name of progress... please contact me at <mhoffman@lightlink.com> or |
45 | via the project's mailing list: <i2c@lm-sensors.org>. Please send bug | 45 | via the linux-i2c mailing list: <linux-i2c@vger.kernel.org>. Please send bug |
46 | reports and/or success stories as well. | 46 | reports and/or success stories as well. |
47 | 47 | ||
48 | 48 | ||
diff --git a/Documentation/ia64/.gitignore b/Documentation/ia64/.gitignore new file mode 100644 index 000000000000..ab806edc8732 --- /dev/null +++ b/Documentation/ia64/.gitignore | |||
@@ -0,0 +1 @@ | |||
aliasing-test | |||
diff --git a/Documentation/isdn/CREDITS b/Documentation/isdn/CREDITS index 8cac6c2f23ee..c1679e913fca 100644 --- a/Documentation/isdn/CREDITS +++ b/Documentation/isdn/CREDITS | |||
@@ -5,7 +5,7 @@ I want to thank all who contributed to this project and especially to: | |||
5 | Thomas Bogendörfer (tsbogend@bigbug.franken.de) | 5 | Thomas Bogendörfer (tsbogend@bigbug.franken.de) |
6 | Tester, lots of bugfixes and hints. | 6 | Tester, lots of bugfixes and hints. |
7 | 7 | ||
8 | Alan Cox (alan@redhat.com) | 8 | Alan Cox (alan@lxorguk.ukuu.org.uk) |
9 | For help getting into standard-kernel. | 9 | For help getting into standard-kernel. |
10 | 10 | ||
11 | Henner Eisen (eis@baty.hanse.de) | 11 | Henner Eisen (eis@baty.hanse.de) |
diff --git a/Documentation/ja_JP/HOWTO b/Documentation/ja_JP/HOWTO index 0775cf4798b2..55476982b5ca 100644 --- a/Documentation/ja_JP/HOWTO +++ b/Documentation/ja_JP/HOWTO | |||
@@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a | |||
11 | fork. So if you have any comments or updates for this file, please try | 11 | fork. So if you have any comments or updates for this file, please try |
12 | to update the original English file first. | 12 | to update the original English file first. |
13 | 13 | ||
14 | Last Updated: 2008/08/21 | 14 | Last Updated: 2008/10/24 |
15 | ================================== | 15 | ================================== |
16 | ã“ã‚Œã¯ã€ | 16 | ã“ã‚Œã¯ã€ |
17 | linux-2.6.27/Documentation/HOWTO | 17 | linux-2.6.28/Documentation/HOWTO |
18 | ã®å’Œè¨³ã§ã™ã€‚ | 18 | ã®å’Œè¨³ã§ã™ã€‚ |
19 | 19 | ||
20 | 翻訳団体: JF プãƒã‚¸ã‚§ã‚¯ãƒˆ < http://www.linux.or.jp/JF/ > | 20 | 翻訳団体: JF プãƒã‚¸ã‚§ã‚¯ãƒˆ < http://www.linux.or.jp/JF/ > |
21 | 翻訳日: 2008/8/5 | 21 | 翻訳日: 2008/10/24 |
22 | 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> | 22 | 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> |
23 | æ ¡æ£è€…: æ¾å€‰ã•ã‚“ <nbh--mats at nifty dot com> | 23 | æ ¡æ£è€…: æ¾å€‰ã•ã‚“ <nbh--mats at nifty dot com> |
24 | å°æž— é›…å…¸ã•ã‚“ (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> | 24 | å°æž— é›…å…¸ã•ã‚“ (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> |
@@ -110,8 +110,8 @@ Linux カーãƒãƒ«ã‚½ãƒ¼ã‚¹ãƒ„リーã¯å¹…広ã„範囲ã®ãƒ‰ã‚ュメントをå | |||
110 | æ–°ã—ã„ドã‚ãƒ¥ãƒ¡ãƒ³ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã‚‚è¿½åŠ ã™ã‚‹ã“ã¨ã‚’勧ã‚ã¾ã™ã€‚ | 110 | æ–°ã—ã„ドã‚ãƒ¥ãƒ¡ãƒ³ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã‚‚è¿½åŠ ã™ã‚‹ã“ã¨ã‚’勧ã‚ã¾ã™ã€‚ |
111 | カーãƒãƒ«ã®å¤‰æ›´ãŒã€ã‚«ãƒ¼ãƒãƒ«ãŒãƒ¦ãƒ¼ã‚¶ç©ºé–“ã«å…¬é–‹ã—ã¦ã„るインターフェイス㮠| 111 | カーãƒãƒ«ã®å¤‰æ›´ãŒã€ã‚«ãƒ¼ãƒãƒ«ãŒãƒ¦ãƒ¼ã‚¶ç©ºé–“ã«å…¬é–‹ã—ã¦ã„るインターフェイス㮠|
112 | 変更を引ãèµ·ã“ã™å ´åˆã€ãã®å¤‰æ›´ã‚’説明ã™ã‚‹ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãƒšãƒ¼ã‚¸ã®ãƒ‘ッãƒã‚„æƒ…å ± | 112 | 変更を引ãèµ·ã“ã™å ´åˆã€ãã®å¤‰æ›´ã‚’説明ã™ã‚‹ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãƒšãƒ¼ã‚¸ã®ãƒ‘ッãƒã‚„æƒ…å ± |
113 | をマニュアルページã®ãƒ¡ãƒ³ãƒ†ãƒŠ mtk.manpages@gmail.com ã«é€ã‚‹ã“ã¨ã‚’勧ã‚ã¾ | 113 | をマニュアルページã®ãƒ¡ãƒ³ãƒ†ãƒŠ mtk.manpages@gmail.com ã«é€ã‚Šã€CC ã‚’ |
114 | ã™ã€‚ | 114 | linux-api@ver.kernel.org ã«é€ã‚‹ã“ã¨ã‚’勧ã‚ã¾ã™ã€‚ |
115 | 115 | ||
116 | 以下ã¯ã‚«ãƒ¼ãƒãƒ«ã‚½ãƒ¼ã‚¹ãƒ„リーã«å«ã¾ã‚Œã¦ã„ã‚‹èªã‚“ã§ãŠãã¹ãファイルã®ä¸€è¦§ã§ | 116 | 以下ã¯ã‚«ãƒ¼ãƒãƒ«ã‚½ãƒ¼ã‚¹ãƒ„リーã«å«ã¾ã‚Œã¦ã„ã‚‹èªã‚“ã§ãŠãã¹ãファイルã®ä¸€è¦§ã§ |
117 | ã™- | 117 | ã™- |
@@ -149,7 +149,7 @@ Linux カーãƒãƒ«ã‚½ãƒ¼ã‚¹ãƒ„リーã¯å¹…広ã„範囲ã®ãƒ‰ã‚ュメントをå | |||
149 | ã“ã®ä»–ã«ãƒ‘ッãƒã‚’作る方法ã«ã¤ã„ã¦ã®ã‚ˆãã§ããŸè¨˜è¿°ã¯- | 149 | ã“ã®ä»–ã«ãƒ‘ッãƒã‚’作る方法ã«ã¤ã„ã¦ã®ã‚ˆãã§ããŸè¨˜è¿°ã¯- |
150 | 150 | ||
151 | "The Perfect Patch" | 151 | "The Perfect Patch" |
152 | http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt | 152 | http://userweb.kernel.org/~akpm/stuff/tpp.txt |
153 | "Linux kernel patch submission format" | 153 | "Linux kernel patch submission format" |
154 | http://linux.yyz.us/patch-format.html | 154 | http://linux.yyz.us/patch-format.html |
155 | 155 | ||
@@ -664,7 +664,7 @@ Linux カーãƒãƒ«ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã¯ã€ä¸€åº¦ã«å¤§é‡ã®ã‚³ãƒ¼ãƒ‰ã®å¡Šã‚’å– | |||
664 | ã“ã‚Œã«ã¤ã„ã¦å…¨ã¦ãŒã©ã®ã‚ˆã†ã«ã‚ã‚‹ã¹ãã‹ã«ã¤ã„ã¦ã®è©³ç´°ã¯ã€ä»¥ä¸‹ã®ãƒ‰ã‚ュメ | 664 | ã“ã‚Œã«ã¤ã„ã¦å…¨ã¦ãŒã©ã®ã‚ˆã†ã«ã‚ã‚‹ã¹ãã‹ã«ã¤ã„ã¦ã®è©³ç´°ã¯ã€ä»¥ä¸‹ã®ãƒ‰ã‚ュメ |
665 | ント㮠ChangeLog セクションを見ã¦ãã ã•ã„- | 665 | ント㮠ChangeLog セクションを見ã¦ãã ã•ã„- |
666 | "The Perfect Patch" | 666 | "The Perfect Patch" |
667 | http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt | 667 | http://userweb.kernel.org/~akpm/stuff/tpp.txt |
668 | 668 | ||
669 | ã“れらã®ã©ã‚Œã‚‚ãŒã€æ™‚ã«ã¯ã¨ã¦ã‚‚困難ã§ã™ã€‚ã“れらã®æ…£ä¾‹ã‚’完璧ã«å®Ÿæ–½ã™ã‚‹ã« | 669 | ã“れらã®ã©ã‚Œã‚‚ãŒã€æ™‚ã«ã¯ã¨ã¦ã‚‚困難ã§ã™ã€‚ã“れらã®æ…£ä¾‹ã‚’完璧ã«å®Ÿæ–½ã™ã‚‹ã« |
670 | ã¯æ•°å¹´ã‹ã‹ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ã“ã‚Œã¯ç¶™ç¶šçš„ãªæ”¹å–„ã®ãƒ—ãƒã‚»ã‚¹ã§ã‚ã‚Šã€ãã®ãŸ | 670 | ã¯æ•°å¹´ã‹ã‹ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ã“ã‚Œã¯ç¶™ç¶šçš„ãªæ”¹å–„ã®ãƒ—ãƒã‚»ã‚¹ã§ã‚ã‚Šã€ãã®ãŸ |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 343e0f0f84b6..1bbcaa8982b6 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -100,7 +100,7 @@ parameter is applicable: | |||
100 | X86-32 X86-32, aka i386 architecture is enabled. | 100 | X86-32 X86-32, aka i386 architecture is enabled. |
101 | X86-64 X86-64 architecture is enabled. | 101 | X86-64 X86-64 architecture is enabled. |
102 | More X86-64 boot options can be found in | 102 | More X86-64 boot options can be found in |
103 | Documentation/x86_64/boot-options.txt . | 103 | Documentation/x86/x86_64/boot-options.txt . |
104 | X86 Either 32bit or 64bit x86 (same as X86-32+X86-64) | 104 | X86 Either 32bit or 64bit x86 (same as X86-32+X86-64) |
105 | 105 | ||
106 | In addition, the following text indicates that the option: | 106 | In addition, the following text indicates that the option: |
@@ -112,10 +112,10 @@ In addition, the following text indicates that the option: | |||
112 | Parameters denoted with BOOT are actually interpreted by the boot | 112 | Parameters denoted with BOOT are actually interpreted by the boot |
113 | loader, and have no meaning to the kernel directly. | 113 | loader, and have no meaning to the kernel directly. |
114 | Do not modify the syntax of boot loader parameters without extreme | 114 | Do not modify the syntax of boot loader parameters without extreme |
115 | need or coordination with <Documentation/i386/boot.txt>. | 115 | need or coordination with <Documentation/x86/i386/boot.txt>. |
116 | 116 | ||
117 | There are also arch-specific kernel-parameters not documented here. | 117 | There are also arch-specific kernel-parameters not documented here. |
118 | See for example <Documentation/x86_64/boot-options.txt>. | 118 | See for example <Documentation/x86/x86_64/boot-options.txt>. |
119 | 119 | ||
120 | Note that ALL kernel parameters listed below are CASE SENSITIVE, and that | 120 | Note that ALL kernel parameters listed below are CASE SENSITIVE, and that |
121 | a trailing = on the name of any parameter states that that parameter will | 121 | a trailing = on the name of any parameter states that that parameter will |
@@ -1222,7 +1222,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1222 | 1222 | ||
1223 | mce [X86-32] Machine Check Exception | 1223 | mce [X86-32] Machine Check Exception |
1224 | 1224 | ||
1225 | mce=option [X86-64] See Documentation/x86_64/boot-options.txt | 1225 | mce=option [X86-64] See Documentation/x86/x86_64/boot-options.txt |
1226 | 1226 | ||
1227 | md= [HW] RAID subsystems devices and level | 1227 | md= [HW] RAID subsystems devices and level |
1228 | See Documentation/md.txt. | 1228 | See Documentation/md.txt. |
@@ -1728,7 +1728,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1728 | See Documentation/paride.txt. | 1728 | See Documentation/paride.txt. |
1729 | 1729 | ||
1730 | pirq= [SMP,APIC] Manual mp-table setup | 1730 | pirq= [SMP,APIC] Manual mp-table setup |
1731 | See Documentation/i386/IO-APIC.txt. | 1731 | See Documentation/x86/i386/IO-APIC.txt. |
1732 | 1732 | ||
1733 | plip= [PPT,NET] Parallel port network link | 1733 | plip= [PPT,NET] Parallel port network link |
1734 | Format: { parport<nr> | timid | 0 } | 1734 | Format: { parport<nr> | timid | 0 } |
@@ -2343,7 +2343,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
2343 | See Documentation/fb/modedb.txt. | 2343 | See Documentation/fb/modedb.txt. |
2344 | 2344 | ||
2345 | vga= [BOOT,X86-32] Select a particular video mode | 2345 | vga= [BOOT,X86-32] Select a particular video mode |
2346 | See Documentation/i386/boot.txt and | 2346 | See Documentation/x86/i386/boot.txt and |
2347 | Documentation/svga.txt. | 2347 | Documentation/svga.txt. |
2348 | Use vga=ask for menu. | 2348 | Use vga=ask for menu. |
2349 | This is actually a boot loader parameter; the value is | 2349 | This is actually a boot loader parameter; the value is |
diff --git a/Documentation/lguest/lguest.c b/Documentation/lguest/lguest.c index 7228369d1014..da86fd53856a 100644 --- a/Documentation/lguest/lguest.c +++ b/Documentation/lguest/lguest.c | |||
@@ -402,7 +402,7 @@ static unsigned long load_bzimage(int fd) | |||
402 | void *p = from_guest_phys(0x100000); | 402 | void *p = from_guest_phys(0x100000); |
403 | 403 | ||
404 | /* Go back to the start of the file and read the header. It should be | 404 | /* Go back to the start of the file and read the header. It should be |
405 | * a Linux boot header (see Documentation/i386/boot.txt) */ | 405 | * a Linux boot header (see Documentation/x86/i386/boot.txt) */ |
406 | lseek(fd, 0, SEEK_SET); | 406 | lseek(fd, 0, SEEK_SET); |
407 | read(fd, &boot, sizeof(boot)); | 407 | read(fd, &boot, sizeof(boot)); |
408 | 408 | ||
diff --git a/Documentation/networking/.gitignore b/Documentation/networking/.gitignore new file mode 100644 index 000000000000..286a5680f490 --- /dev/null +++ b/Documentation/networking/.gitignore | |||
@@ -0,0 +1 @@ | |||
ifenslave | |||
diff --git a/Documentation/networking/dmfe.txt b/Documentation/networking/dmfe.txt index b1b7499dd9d3..8006c227fda2 100644 --- a/Documentation/networking/dmfe.txt +++ b/Documentation/networking/dmfe.txt | |||
@@ -60,6 +60,6 @@ Tobias Ringstrom <tori@unhappy.mine.nu> : Current Maintainer | |||
60 | Contributors: | 60 | Contributors: |
61 | 61 | ||
62 | Marcelo Tosatti <marcelo@conectiva.com.br> | 62 | Marcelo Tosatti <marcelo@conectiva.com.br> |
63 | Alan Cox <alan@redhat.com> | 63 | Alan Cox <alan@lxorguk.ukuu.org.uk> |
64 | Jeff Garzik <jgarzik@pobox.com> | 64 | Jeff Garzik <jgarzik@pobox.com> |
65 | Vojtech Pavlik <vojtech@suse.cz> | 65 | Vojtech Pavlik <vojtech@suse.cz> |
diff --git a/Documentation/pcmcia/.gitignore b/Documentation/pcmcia/.gitignore new file mode 100644 index 000000000000..53d081336757 --- /dev/null +++ b/Documentation/pcmcia/.gitignore | |||
@@ -0,0 +1 @@ | |||
crc32hash | |||
diff --git a/Documentation/scsi/aacraid.txt b/Documentation/scsi/aacraid.txt index 709ca991a451..ddace3afc83b 100644 --- a/Documentation/scsi/aacraid.txt +++ b/Documentation/scsi/aacraid.txt | |||
@@ -128,7 +128,7 @@ Supported Cards/Chipsets | |||
128 | 128 | ||
129 | People | 129 | People |
130 | ------------------------- | 130 | ------------------------- |
131 | Alan Cox <alan@redhat.com> | 131 | Alan Cox <alan@lxorguk.ukuu.org.uk> |
132 | Christoph Hellwig <hch@infradead.org> (updates for new-style PCI probing and SCSI host registration, | 132 | Christoph Hellwig <hch@infradead.org> (updates for new-style PCI probing and SCSI host registration, |
133 | small cleanups/fixes) | 133 | small cleanups/fixes) |
134 | Matt Domsch <matt_domsch@dell.com> (revision ioctl, adapter messages) | 134 | Matt Domsch <matt_domsch@dell.com> (revision ioctl, adapter messages) |
diff --git a/Documentation/spi/.gitignore b/Documentation/spi/.gitignore new file mode 100644 index 000000000000..4280576397e8 --- /dev/null +++ b/Documentation/spi/.gitignore | |||
@@ -0,0 +1,2 @@ | |||
1 | spidev_fdx | ||
2 | spidev_test | ||
diff --git a/Documentation/stable_kernel_rules.txt b/Documentation/stable_kernel_rules.txt index 4cfc78835bc1..a452227361b1 100644 --- a/Documentation/stable_kernel_rules.txt +++ b/Documentation/stable_kernel_rules.txt | |||
@@ -12,6 +12,7 @@ Rules on what kind of patches are accepted, and which ones are not, into the | |||
12 | marked CONFIG_BROKEN), an oops, a hang, data corruption, a real | 12 | marked CONFIG_BROKEN), an oops, a hang, data corruption, a real |
13 | security issue, or some "oh, that's not good" issue. In short, something | 13 | security issue, or some "oh, that's not good" issue. In short, something |
14 | critical. | 14 | critical. |
15 | - New device IDs and quirks are also accepted. | ||
15 | - No "theoretical race condition" issues, unless an explanation of how the | 16 | - No "theoretical race condition" issues, unless an explanation of how the |
16 | race can be exploited is also provided. | 17 | race can be exploited is also provided. |
17 | - It cannot contain any "trivial" fixes in it (spelling changes, | 18 | - It cannot contain any "trivial" fixes in it (spelling changes, |
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index bde799e06598..a4ccdd1981cf 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt | |||
@@ -363,11 +363,21 @@ tainted: | |||
363 | Non-zero if the kernel has been tainted. Numeric values, which | 363 | Non-zero if the kernel has been tainted. Numeric values, which |
364 | can be ORed together: | 364 | can be ORed together: |
365 | 365 | ||
366 | 1 - A module with a non-GPL license has been loaded, this | 366 | 1 - A module with a non-GPL license has been loaded, this |
367 | includes modules with no license. | 367 | includes modules with no license. |
368 | Set by modutils >= 2.4.9 and module-init-tools. | 368 | Set by modutils >= 2.4.9 and module-init-tools. |
369 | 2 - A module was force loaded by insmod -f. | 369 | 2 - A module was force loaded by insmod -f. |
370 | Set by modutils >= 2.4.9 and module-init-tools. | 370 | Set by modutils >= 2.4.9 and module-init-tools. |
371 | 4 - Unsafe SMP processors: SMP with CPUs not designed for SMP. | 371 | 4 - Unsafe SMP processors: SMP with CPUs not designed for SMP. |
372 | 64 - A module from drivers/staging was loaded. | 372 | 8 - A module was forcibly unloaded from the system by rmmod -f. |
373 | 16 - A hardware machine check error occurred on the system. | ||
374 | 32 - A bad page was discovered on the system. | ||
375 | 64 - The user has asked that the system be marked "tainted". This | ||
376 | could be because they are running software that directly modifies | ||
377 | the hardware, or for other reasons. | ||
378 | 128 - The system has died. | ||
379 | 256 - The ACPI DSDT has been overridden with one supplied by the user | ||
380 | instead of using the one provided by the hardware. | ||
381 | 512 - A kernel warning has occurred. | ||
382 | 1024 - A module from drivers/staging was loaded. | ||
373 | 383 | ||
diff --git a/Documentation/video4linux/.gitignore b/Documentation/video4linux/.gitignore new file mode 100644 index 000000000000..952703943e8e --- /dev/null +++ b/Documentation/video4linux/.gitignore | |||
@@ -0,0 +1 @@ | |||
v4lgrab | |||
diff --git a/Documentation/video4linux/bttv/CONTRIBUTORS b/Documentation/video4linux/bttv/CONTRIBUTORS index 8aad6dd93d6b..eb41b2650860 100644 --- a/Documentation/video4linux/bttv/CONTRIBUTORS +++ b/Documentation/video4linux/bttv/CONTRIBUTORS | |||
@@ -3,7 +3,7 @@ Contributors to bttv: | |||
3 | Michael Chu <mmchu@pobox.com> | 3 | Michael Chu <mmchu@pobox.com> |
4 | AverMedia fix and more flexible card recognition | 4 | AverMedia fix and more flexible card recognition |
5 | 5 | ||
6 | Alan Cox <alan@redhat.com> | 6 | Alan Cox <alan@lxorguk.ukuu.org.uk> |
7 | Video4Linux interface and 2.1.x kernel adaptation | 7 | Video4Linux interface and 2.1.x kernel adaptation |
8 | 8 | ||
9 | Chris Kleitsch | 9 | Chris Kleitsch |
diff --git a/Documentation/vm/.gitignore b/Documentation/vm/.gitignore new file mode 100644 index 000000000000..33e8a023df02 --- /dev/null +++ b/Documentation/vm/.gitignore | |||
@@ -0,0 +1 @@ | |||
slabinfo | |||
diff --git a/Documentation/watchdog/src/.gitignore b/Documentation/watchdog/src/.gitignore new file mode 100644 index 000000000000..ac90997dba93 --- /dev/null +++ b/Documentation/watchdog/src/.gitignore | |||
@@ -0,0 +1,2 @@ | |||
1 | watchdog-simple | ||
2 | watchdog-test | ||
diff --git a/Documentation/x86/x86_64/boot-options.txt b/Documentation/x86/x86_64/boot-options.txt index 72ffb5373ec7..f6d561a1a9b2 100644 --- a/Documentation/x86/x86_64/boot-options.txt +++ b/Documentation/x86/x86_64/boot-options.txt | |||
@@ -35,7 +35,7 @@ APICs | |||
35 | 35 | ||
36 | nolapic Don't use the local APIC (alias for i386 compatibility) | 36 | nolapic Don't use the local APIC (alias for i386 compatibility) |
37 | 37 | ||
38 | pirq=... See Documentation/i386/IO-APIC.txt | 38 | pirq=... See Documentation/x86/i386/IO-APIC.txt |
39 | 39 | ||
40 | noapictimer Don't set up the APIC timer | 40 | noapictimer Don't set up the APIC timer |
41 | 41 | ||
@@ -139,7 +139,7 @@ Non Executable Mappings | |||
139 | SMP | 139 | SMP |
140 | 140 | ||
141 | additional_cpus=NUM Allow NUM more CPUs for hotplug | 141 | additional_cpus=NUM Allow NUM more CPUs for hotplug |
142 | (defaults are specified by the BIOS, see Documentation/x86_64/cpu-hotplug-spec) | 142 | (defaults are specified by the BIOS, see Documentation/x86/x86_64/cpu-hotplug-spec) |
143 | 143 | ||
144 | NUMA | 144 | NUMA |
145 | 145 | ||
diff --git a/Documentation/x86/x86_64/fake-numa-for-cpusets b/Documentation/x86/x86_64/fake-numa-for-cpusets index d1a985c5b00a..33bb56655991 100644 --- a/Documentation/x86/x86_64/fake-numa-for-cpusets +++ b/Documentation/x86/x86_64/fake-numa-for-cpusets | |||
@@ -10,7 +10,7 @@ amount of system memory that are available to a certain class of tasks. | |||
10 | For more information on the features of cpusets, see Documentation/cpusets.txt. | 10 | For more information on the features of cpusets, see Documentation/cpusets.txt. |
11 | There are a number of different configurations you can use for your needs. For | 11 | There are a number of different configurations you can use for your needs. For |
12 | more information on the numa=fake command line option and its various ways of | 12 | more information on the numa=fake command line option and its various ways of |
13 | configuring fake nodes, see Documentation/x86_64/boot-options.txt. | 13 | configuring fake nodes, see Documentation/x86/x86_64/boot-options.txt. |
14 | 14 | ||
15 | For the purposes of this introduction, we'll assume a very primitive NUMA | 15 | For the purposes of this introduction, we'll assume a very primitive NUMA |
16 | emulation setup of "numa=fake=4*512,". This will split our system memory into | 16 | emulation setup of "numa=fake=4*512,". This will split our system memory into |
diff --git a/MAINTAINERS b/MAINTAINERS index bfce9bb22f18..43de305c3213 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -347,7 +347,7 @@ S: Maintained | |||
347 | ALI1563 I2C DRIVER | 347 | ALI1563 I2C DRIVER |
348 | P: Rudolf Marek | 348 | P: Rudolf Marek |
349 | M: r.marek@assembler.cz | 349 | M: r.marek@assembler.cz |
350 | L: i2c@lm-sensors.org | 350 | L: linux-i2c@vger.kernel.org |
351 | S: Maintained | 351 | S: Maintained |
352 | 352 | ||
353 | ALPHA PORT | 353 | ALPHA PORT |
@@ -1754,7 +1754,7 @@ FREESCALE I2C CPM DRIVER | |||
1754 | P: Jochen Friedrich | 1754 | P: Jochen Friedrich |
1755 | M: jochen@scram.de | 1755 | M: jochen@scram.de |
1756 | L: linuxppc-dev@ozlabs.org | 1756 | L: linuxppc-dev@ozlabs.org |
1757 | L: i2c@lm-sensors.org | 1757 | L: linux-i2c@vger.kernel.org |
1758 | S: Maintained | 1758 | S: Maintained |
1759 | 1759 | ||
1760 | FREESCALE SOC FS_ENET DRIVER | 1760 | FREESCALE SOC FS_ENET DRIVER |
@@ -2027,7 +2027,7 @@ S: Maintained | |||
2027 | I2C/SMBUS STUB DRIVER | 2027 | I2C/SMBUS STUB DRIVER |
2028 | P: Mark M. Hoffman | 2028 | P: Mark M. Hoffman |
2029 | M: mhoffman@lightlink.com | 2029 | M: mhoffman@lightlink.com |
2030 | L: i2c@lm-sensors.org | 2030 | L: linux-i2c@vger.kernel.org |
2031 | S: Maintained | 2031 | S: Maintained |
2032 | 2032 | ||
2033 | I2C SUBSYSTEM | 2033 | I2C SUBSYSTEM |
@@ -2035,14 +2035,14 @@ P: Jean Delvare (PC drivers, core) | |||
2035 | M: khali@linux-fr.org | 2035 | M: khali@linux-fr.org |
2036 | P: Ben Dooks (embedded platforms) | 2036 | P: Ben Dooks (embedded platforms) |
2037 | M: ben-linux@fluff.org | 2037 | M: ben-linux@fluff.org |
2038 | L: i2c@lm-sensors.org | 2038 | L: linux-i2c@vger.kernel.org |
2039 | T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/ | 2039 | T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/ |
2040 | S: Maintained | 2040 | S: Maintained |
2041 | 2041 | ||
2042 | I2C-TINY-USB DRIVER | 2042 | I2C-TINY-USB DRIVER |
2043 | P: Till Harbaum | 2043 | P: Till Harbaum |
2044 | M: till@harbaum.org | 2044 | M: till@harbaum.org |
2045 | L: i2c@lm-sensors.org | 2045 | L: linux-i2c@vger.kernel.org |
2046 | T: http://www.harbaum.org/till/i2c_tiny_usb | 2046 | T: http://www.harbaum.org/till/i2c_tiny_usb |
2047 | S: Maintained | 2047 | S: Maintained |
2048 | 2048 | ||
@@ -2706,6 +2706,16 @@ M: matthew@wil.cx | |||
2706 | L: linux-scsi@vger.kernel.org | 2706 | L: linux-scsi@vger.kernel.org |
2707 | S: Maintained | 2707 | S: Maintained |
2708 | 2708 | ||
2709 | LTP (Linux Test Project) | ||
2710 | P: Subrata Modak | ||
2711 | M: subrata@linux.vnet.ibm.com | ||
2712 | P: Mike Frysinger | ||
2713 | M: vapier@gentoo.org | ||
2714 | L: ltp-list@lists.sourceforge.net (subscribers-only) | ||
2715 | W: http://ltp.sourceforge.net/ | ||
2716 | T: git kernel.org/pub/scm/linux/kernel/git/galak/ltp.git | ||
2717 | S: Maintained | ||
2718 | |||
2709 | M32R ARCHITECTURE | 2719 | M32R ARCHITECTURE |
2710 | P: Hirokazu Takata | 2720 | P: Hirokazu Takata |
2711 | M: takata@linux-m32r.org | 2721 | M: takata@linux-m32r.org |
@@ -3148,7 +3158,7 @@ S: Maintained | |||
3148 | OPENCORES I2C BUS DRIVER | 3158 | OPENCORES I2C BUS DRIVER |
3149 | P: Peter Korsgaard | 3159 | P: Peter Korsgaard |
3150 | M: jacmet@sunsite.dk | 3160 | M: jacmet@sunsite.dk |
3151 | L: i2c@lm-sensors.org | 3161 | L: linux-i2c@vger.kernel.org |
3152 | S: Maintained | 3162 | S: Maintained |
3153 | 3163 | ||
3154 | OPROFILE | 3164 | OPROFILE |
@@ -3195,7 +3205,7 @@ S: Maintained | |||
3195 | PA SEMI SMBUS DRIVER | 3205 | PA SEMI SMBUS DRIVER |
3196 | P: Olof Johansson | 3206 | P: Olof Johansson |
3197 | M: olof@lixom.net | 3207 | M: olof@lixom.net |
3198 | L: i2c@lm-sensors.org | 3208 | L: linux-i2c@vger.kernel.org |
3199 | S: Maintained | 3209 | S: Maintained |
3200 | 3210 | ||
3201 | PANASONIC LAPTOP ACPI EXTRAS DRIVER | 3211 | PANASONIC LAPTOP ACPI EXTRAS DRIVER |
@@ -3340,7 +3350,7 @@ S: Maintained | |||
3340 | PNXxxxx I2C DRIVER | 3350 | PNXxxxx I2C DRIVER |
3341 | P: Vitaly Wool | 3351 | P: Vitaly Wool |
3342 | M: vitalywool@gmail.com | 3352 | M: vitalywool@gmail.com |
3343 | L: i2c@lm-sensors.org | 3353 | L: linux-i2c@vger.kernel.org |
3344 | S: Maintained | 3354 | S: Maintained |
3345 | 3355 | ||
3346 | PPP PROTOCOL DRIVERS AND COMPRESSORS | 3356 | PPP PROTOCOL DRIVERS AND COMPRESSORS |
@@ -3804,7 +3814,7 @@ S: Maintained | |||
3804 | SIS 96X I2C/SMBUS DRIVER | 3814 | SIS 96X I2C/SMBUS DRIVER |
3805 | P: Mark M. Hoffman | 3815 | P: Mark M. Hoffman |
3806 | M: mhoffman@lightlink.com | 3816 | M: mhoffman@lightlink.com |
3807 | L: i2c@lm-sensors.org | 3817 | L: linux-i2c@vger.kernel.org |
3808 | S: Maintained | 3818 | S: Maintained |
3809 | 3819 | ||
3810 | SIS FRAMEBUFFER DRIVER | 3820 | SIS FRAMEBUFFER DRIVER |
@@ -4551,7 +4561,7 @@ S: Maintained | |||
4551 | VIAPRO SMBUS DRIVER | 4561 | VIAPRO SMBUS DRIVER |
4552 | P: Jean Delvare | 4562 | P: Jean Delvare |
4553 | M: khali@linux-fr.org | 4563 | M: khali@linux-fr.org |
4554 | L: i2c@lm-sensors.org | 4564 | L: linux-i2c@vger.kernel.org |
4555 | S: Maintained | 4565 | S: Maintained |
4556 | 4566 | ||
4557 | VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER | 4567 | VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER |
@@ -961,6 +961,7 @@ export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH) | |||
961 | 961 | ||
962 | # The asm symlink changes when $(ARCH) changes. | 962 | # The asm symlink changes when $(ARCH) changes. |
963 | # Detect this and ask user to run make mrproper | 963 | # Detect this and ask user to run make mrproper |
964 | # If asm is a stale symlink (point to dir that does not exist) remove it | ||
964 | define check-symlink | 965 | define check-symlink |
965 | set -e; \ | 966 | set -e; \ |
966 | if [ -L include/asm ]; then \ | 967 | if [ -L include/asm ]; then \ |
@@ -970,6 +971,10 @@ define check-symlink | |||
970 | echo " set ARCH or save .config and run 'make mrproper' to fix it"; \ | 971 | echo " set ARCH or save .config and run 'make mrproper' to fix it"; \ |
971 | exit 1; \ | 972 | exit 1; \ |
972 | fi; \ | 973 | fi; \ |
974 | test -e $$asmlink || rm include/asm; \ | ||
975 | elif [ -d include/asm ]; then \ | ||
976 | echo "ERROR: $@ is a directory but a symlink was expected";\ | ||
977 | exit 1; \ | ||
973 | fi | 978 | fi |
974 | endef | 979 | endef |
975 | 980 | ||
@@ -1431,7 +1436,8 @@ ALLSOURCE_ARCHS := $(SRCARCH) | |||
1431 | define find-sources | 1436 | define find-sources |
1432 | ( for arch in $(ALLSOURCE_ARCHS) ; do \ | 1437 | ( for arch in $(ALLSOURCE_ARCHS) ; do \ |
1433 | find $(__srctree)arch/$${arch} $(RCS_FIND_IGNORE) \ | 1438 | find $(__srctree)arch/$${arch} $(RCS_FIND_IGNORE) \ |
1434 | -name $1 -print; \ | 1439 | -wholename $(__srctree)arch/$${arch}/include/asm -type d -prune \ |
1440 | -o -name $1 -print; \ | ||
1435 | done ; \ | 1441 | done ; \ |
1436 | find $(__srctree)security/selinux/include $(RCS_FIND_IGNORE) \ | 1442 | find $(__srctree)security/selinux/include $(RCS_FIND_IGNORE) \ |
1437 | -name $1 -print; \ | 1443 | -name $1 -print; \ |
diff --git a/arch/ia64/include/asm/iommu.h b/arch/ia64/include/asm/iommu.h index 5fb2bb93de3b..0490794fe4aa 100644 --- a/arch/ia64/include/asm/iommu.h +++ b/arch/ia64/include/asm/iommu.h | |||
@@ -11,6 +11,5 @@ extern int force_iommu, no_iommu; | |||
11 | extern int iommu_detected; | 11 | extern int iommu_detected; |
12 | extern void iommu_dma_init(void); | 12 | extern void iommu_dma_init(void); |
13 | extern void machvec_init(const char *name); | 13 | extern void machvec_init(const char *name); |
14 | extern int forbid_dac; | ||
15 | 14 | ||
16 | #endif | 15 | #endif |
diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c index 10a75b557650..031abbf9c875 100644 --- a/arch/ia64/kernel/pci-dma.c +++ b/arch/ia64/kernel/pci-dma.c | |||
@@ -89,13 +89,6 @@ int iommu_dma_supported(struct device *dev, u64 mask) | |||
89 | { | 89 | { |
90 | struct dma_mapping_ops *ops = get_dma_ops(dev); | 90 | struct dma_mapping_ops *ops = get_dma_ops(dev); |
91 | 91 | ||
92 | #ifdef CONFIG_PCI | ||
93 | if (mask > 0xffffffff && forbid_dac > 0) { | ||
94 | dev_info(dev, "Disallowing DAC for device\n"); | ||
95 | return 0; | ||
96 | } | ||
97 | #endif | ||
98 | |||
99 | if (ops->dma_supported_op) | 92 | if (ops->dma_supported_op) |
100 | return ops->dma_supported_op(dev, mask); | 93 | return ops->dma_supported_op(dev, mask); |
101 | 94 | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 653574bc19cf..f4af967a6b30 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -327,7 +327,6 @@ config SGI_IP22 | |||
327 | select IP22_CPU_SCACHE | 327 | select IP22_CPU_SCACHE |
328 | select IRQ_CPU | 328 | select IRQ_CPU |
329 | select GENERIC_ISA_DMA_SUPPORT_BROKEN | 329 | select GENERIC_ISA_DMA_SUPPORT_BROKEN |
330 | select SGI_HAS_DS1286 | ||
331 | select SGI_HAS_I8042 | 330 | select SGI_HAS_I8042 |
332 | select SGI_HAS_INDYDOG | 331 | select SGI_HAS_INDYDOG |
333 | select SGI_HAS_HAL2 | 332 | select SGI_HAS_HAL2 |
@@ -382,7 +381,6 @@ config SGI_IP28 | |||
382 | select HW_HAS_EISA | 381 | select HW_HAS_EISA |
383 | select I8253 | 382 | select I8253 |
384 | select I8259 | 383 | select I8259 |
385 | select SGI_HAS_DS1286 | ||
386 | select SGI_HAS_I8042 | 384 | select SGI_HAS_I8042 |
387 | select SGI_HAS_INDYDOG | 385 | select SGI_HAS_INDYDOG |
388 | select SGI_HAS_HAL2 | 386 | select SGI_HAS_HAL2 |
@@ -893,9 +891,6 @@ config EMMA2RH | |||
893 | config SERIAL_RM9000 | 891 | config SERIAL_RM9000 |
894 | bool | 892 | bool |
895 | 893 | ||
896 | config SGI_HAS_DS1286 | ||
897 | bool | ||
898 | |||
899 | config SGI_HAS_INDYDOG | 894 | config SGI_HAS_INDYDOG |
900 | bool | 895 | bool |
901 | 896 | ||
diff --git a/arch/mips/configs/ip22_defconfig b/arch/mips/configs/ip22_defconfig index cc8e6bf2b245..f719bf5e01aa 100644 --- a/arch/mips/configs/ip22_defconfig +++ b/arch/mips/configs/ip22_defconfig | |||
@@ -771,7 +771,6 @@ CONFIG_WATCHDOG=y | |||
771 | CONFIG_INDYDOG=m | 771 | CONFIG_INDYDOG=m |
772 | # CONFIG_HW_RANDOM is not set | 772 | # CONFIG_HW_RANDOM is not set |
773 | # CONFIG_RTC is not set | 773 | # CONFIG_RTC is not set |
774 | CONFIG_SGI_DS1286=m | ||
775 | # CONFIG_R3964 is not set | 774 | # CONFIG_R3964 is not set |
776 | CONFIG_RAW_DRIVER=m | 775 | CONFIG_RAW_DRIVER=m |
777 | CONFIG_MAX_RAW_DEVS=256 | 776 | CONFIG_MAX_RAW_DEVS=256 |
diff --git a/arch/mips/configs/ip27_defconfig b/arch/mips/configs/ip27_defconfig index 831d3e5a1ea6..34ea319be94c 100644 --- a/arch/mips/configs/ip27_defconfig +++ b/arch/mips/configs/ip27_defconfig | |||
@@ -701,7 +701,6 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
701 | # CONFIG_WATCHDOG is not set | 701 | # CONFIG_WATCHDOG is not set |
702 | CONFIG_HW_RANDOM=m | 702 | CONFIG_HW_RANDOM=m |
703 | # CONFIG_RTC is not set | 703 | # CONFIG_RTC is not set |
704 | CONFIG_SGI_IP27_RTC=y | ||
705 | # CONFIG_R3964 is not set | 704 | # CONFIG_R3964 is not set |
706 | # CONFIG_APPLICOM is not set | 705 | # CONFIG_APPLICOM is not set |
707 | # CONFIG_DRM is not set | 706 | # CONFIG_DRM is not set |
diff --git a/arch/mips/configs/ip28_defconfig b/arch/mips/configs/ip28_defconfig index 822b01f643e3..70a744e9a8c5 100644 --- a/arch/mips/configs/ip28_defconfig +++ b/arch/mips/configs/ip28_defconfig | |||
@@ -70,7 +70,6 @@ CONFIG_CPU_BIG_ENDIAN=y | |||
70 | CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y | 70 | CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y |
71 | CONFIG_IRQ_CPU=y | 71 | CONFIG_IRQ_CPU=y |
72 | CONFIG_SWAP_IO_SPACE=y | 72 | CONFIG_SWAP_IO_SPACE=y |
73 | CONFIG_SGI_HAS_DS1286=y | ||
74 | CONFIG_SGI_HAS_INDYDOG=y | 73 | CONFIG_SGI_HAS_INDYDOG=y |
75 | CONFIG_SGI_HAS_SEEQ=y | 74 | CONFIG_SGI_HAS_SEEQ=y |
76 | CONFIG_SGI_HAS_WD93=y | 75 | CONFIG_SGI_HAS_WD93=y |
@@ -585,7 +584,6 @@ CONFIG_LEGACY_PTY_COUNT=256 | |||
585 | # CONFIG_IPMI_HANDLER is not set | 584 | # CONFIG_IPMI_HANDLER is not set |
586 | # CONFIG_HW_RANDOM is not set | 585 | # CONFIG_HW_RANDOM is not set |
587 | # CONFIG_RTC is not set | 586 | # CONFIG_RTC is not set |
588 | CONFIG_SGI_DS1286=y | ||
589 | # CONFIG_DTLK is not set | 587 | # CONFIG_DTLK is not set |
590 | # CONFIG_R3964 is not set | 588 | # CONFIG_R3964 is not set |
591 | # CONFIG_RAW_DRIVER is not set | 589 | # CONFIG_RAW_DRIVER is not set |
diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h index 49df8c4c9d25..bac4a960b24c 100644 --- a/arch/mips/include/asm/bitops.h +++ b/arch/mips/include/asm/bitops.h | |||
@@ -558,39 +558,67 @@ static inline void __clear_bit_unlock(unsigned long nr, volatile unsigned long * | |||
558 | __clear_bit(nr, addr); | 558 | __clear_bit(nr, addr); |
559 | } | 559 | } |
560 | 560 | ||
561 | #if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) | ||
562 | |||
563 | /* | 561 | /* |
564 | * Return the bit position (0..63) of the most significant 1 bit in a word | 562 | * Return the bit position (0..63) of the most significant 1 bit in a word |
565 | * Returns -1 if no 1 bit exists | 563 | * Returns -1 if no 1 bit exists |
566 | */ | 564 | */ |
567 | static inline unsigned long __fls(unsigned long x) | 565 | static inline unsigned long __fls(unsigned long word) |
568 | { | 566 | { |
569 | int lz; | 567 | int num; |
570 | 568 | ||
571 | if (sizeof(x) == 4) { | 569 | if (BITS_PER_LONG == 32 && |
570 | __builtin_constant_p(cpu_has_mips_r) && cpu_has_mips_r) { | ||
572 | __asm__( | 571 | __asm__( |
573 | " .set push \n" | 572 | " .set push \n" |
574 | " .set mips32 \n" | 573 | " .set mips32 \n" |
575 | " clz %0, %1 \n" | 574 | " clz %0, %1 \n" |
576 | " .set pop \n" | 575 | " .set pop \n" |
577 | : "=r" (lz) | 576 | : "=r" (num) |
578 | : "r" (x)); | 577 | : "r" (word)); |
579 | 578 | ||
580 | return 31 - lz; | 579 | return 31 - num; |
581 | } | 580 | } |
582 | 581 | ||
583 | BUG_ON(sizeof(x) != 8); | 582 | if (BITS_PER_LONG == 64 && |
583 | __builtin_constant_p(cpu_has_mips64) && cpu_has_mips64) { | ||
584 | __asm__( | ||
585 | " .set push \n" | ||
586 | " .set mips64 \n" | ||
587 | " dclz %0, %1 \n" | ||
588 | " .set pop \n" | ||
589 | : "=r" (num) | ||
590 | : "r" (word)); | ||
584 | 591 | ||
585 | __asm__( | 592 | return 63 - num; |
586 | " .set push \n" | 593 | } |
587 | " .set mips64 \n" | 594 | |
588 | " dclz %0, %1 \n" | 595 | num = BITS_PER_LONG - 1; |
589 | " .set pop \n" | ||
590 | : "=r" (lz) | ||
591 | : "r" (x)); | ||
592 | 596 | ||
593 | return 63 - lz; | 597 | #if BITS_PER_LONG == 64 |
598 | if (!(word & (~0ul << 32))) { | ||
599 | num -= 32; | ||
600 | word <<= 32; | ||
601 | } | ||
602 | #endif | ||
603 | if (!(word & (~0ul << (BITS_PER_LONG-16)))) { | ||
604 | num -= 16; | ||
605 | word <<= 16; | ||
606 | } | ||
607 | if (!(word & (~0ul << (BITS_PER_LONG-8)))) { | ||
608 | num -= 8; | ||
609 | word <<= 8; | ||
610 | } | ||
611 | if (!(word & (~0ul << (BITS_PER_LONG-4)))) { | ||
612 | num -= 4; | ||
613 | word <<= 4; | ||
614 | } | ||
615 | if (!(word & (~0ul << (BITS_PER_LONG-2)))) { | ||
616 | num -= 2; | ||
617 | word <<= 2; | ||
618 | } | ||
619 | if (!(word & (~0ul << (BITS_PER_LONG-1)))) | ||
620 | num -= 1; | ||
621 | return num; | ||
594 | } | 622 | } |
595 | 623 | ||
596 | /* | 624 | /* |
@@ -612,23 +640,43 @@ static inline unsigned long __ffs(unsigned long word) | |||
612 | * This is defined the same way as ffs. | 640 | * This is defined the same way as ffs. |
613 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. | 641 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. |
614 | */ | 642 | */ |
615 | static inline int fls(int word) | 643 | static inline int fls(int x) |
616 | { | 644 | { |
617 | __asm__("clz %0, %1" : "=r" (word) : "r" (word)); | 645 | int r; |
618 | 646 | ||
619 | return 32 - word; | 647 | if (__builtin_constant_p(cpu_has_mips_r) && cpu_has_mips_r) { |
620 | } | 648 | __asm__("clz %0, %1" : "=r" (x) : "r" (x)); |
621 | 649 | ||
622 | #if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPS64) | 650 | return 32 - x; |
623 | static inline int fls64(__u64 word) | 651 | } |
624 | { | ||
625 | __asm__("dclz %0, %1" : "=r" (word) : "r" (word)); | ||
626 | 652 | ||
627 | return 64 - word; | 653 | r = 32; |
654 | if (!x) | ||
655 | return 0; | ||
656 | if (!(x & 0xffff0000u)) { | ||
657 | x <<= 16; | ||
658 | r -= 16; | ||
659 | } | ||
660 | if (!(x & 0xff000000u)) { | ||
661 | x <<= 8; | ||
662 | r -= 8; | ||
663 | } | ||
664 | if (!(x & 0xf0000000u)) { | ||
665 | x <<= 4; | ||
666 | r -= 4; | ||
667 | } | ||
668 | if (!(x & 0xc0000000u)) { | ||
669 | x <<= 2; | ||
670 | r -= 2; | ||
671 | } | ||
672 | if (!(x & 0x80000000u)) { | ||
673 | x <<= 1; | ||
674 | r -= 1; | ||
675 | } | ||
676 | return r; | ||
628 | } | 677 | } |
629 | #else | 678 | |
630 | #include <asm-generic/bitops/fls64.h> | 679 | #include <asm-generic/bitops/fls64.h> |
631 | #endif | ||
632 | 680 | ||
633 | /* | 681 | /* |
634 | * ffs - find first bit set. | 682 | * ffs - find first bit set. |
@@ -646,16 +694,6 @@ static inline int ffs(int word) | |||
646 | return fls(word & -word); | 694 | return fls(word & -word); |
647 | } | 695 | } |
648 | 696 | ||
649 | #else | ||
650 | |||
651 | #include <asm-generic/bitops/__ffs.h> | ||
652 | #include <asm-generic/bitops/__fls.h> | ||
653 | #include <asm-generic/bitops/ffs.h> | ||
654 | #include <asm-generic/bitops/fls.h> | ||
655 | #include <asm-generic/bitops/fls64.h> | ||
656 | |||
657 | #endif /*defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) */ | ||
658 | |||
659 | #include <asm-generic/bitops/ffz.h> | 697 | #include <asm-generic/bitops/ffz.h> |
660 | #include <asm-generic/bitops/find.h> | 698 | #include <asm-generic/bitops/find.h> |
661 | 699 | ||
diff --git a/arch/mips/include/asm/break.h b/arch/mips/include/asm/break.h index 25b980c91e7e..44437ed765e8 100644 --- a/arch/mips/include/asm/break.h +++ b/arch/mips/include/asm/break.h | |||
@@ -29,6 +29,7 @@ | |||
29 | #define _BRK_THREADBP 11 /* For threads, user bp (used by debuggers) */ | 29 | #define _BRK_THREADBP 11 /* For threads, user bp (used by debuggers) */ |
30 | #define BRK_BUG 512 /* Used by BUG() */ | 30 | #define BRK_BUG 512 /* Used by BUG() */ |
31 | #define BRK_KDB 513 /* Used in KDB_ENTER() */ | 31 | #define BRK_KDB 513 /* Used in KDB_ENTER() */ |
32 | #define BRK_MEMU 514 /* Used by FPU emulator */ | ||
32 | #define BRK_MULOVF 1023 /* Multiply overflow */ | 33 | #define BRK_MULOVF 1023 /* Multiply overflow */ |
33 | 34 | ||
34 | #endif /* __ASM_BREAK_H */ | 35 | #endif /* __ASM_BREAK_H */ |
diff --git a/arch/mips/include/asm/byteorder.h b/arch/mips/include/asm/byteorder.h index fe7dc2d59b69..2988d29a0867 100644 --- a/arch/mips/include/asm/byteorder.h +++ b/arch/mips/include/asm/byteorder.h | |||
@@ -11,11 +11,19 @@ | |||
11 | #include <linux/compiler.h> | 11 | #include <linux/compiler.h> |
12 | #include <asm/types.h> | 12 | #include <asm/types.h> |
13 | 13 | ||
14 | #ifdef __GNUC__ | 14 | #if defined(__MIPSEB__) |
15 | # define __BIG_ENDIAN | ||
16 | #elif defined(__MIPSEL__) | ||
17 | # define __LITTLE_ENDIAN | ||
18 | #else | ||
19 | # error "MIPS, but neither __MIPSEB__, nor __MIPSEL__???" | ||
20 | #endif | ||
21 | |||
22 | #define __SWAB_64_THRU_32__ | ||
15 | 23 | ||
16 | #ifdef CONFIG_CPU_MIPSR2 | 24 | #ifdef CONFIG_CPU_MIPSR2 |
17 | 25 | ||
18 | static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x) | 26 | static inline __attribute_const__ __u16 __arch_swab16(__u16 x) |
19 | { | 27 | { |
20 | __asm__( | 28 | __asm__( |
21 | " wsbh %0, %1 \n" | 29 | " wsbh %0, %1 \n" |
@@ -24,9 +32,9 @@ static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x) | |||
24 | 32 | ||
25 | return x; | 33 | return x; |
26 | } | 34 | } |
27 | #define __arch__swab16(x) ___arch__swab16(x) | 35 | #define __arch_swab16 __arch_swab16 |
28 | 36 | ||
29 | static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x) | 37 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) |
30 | { | 38 | { |
31 | __asm__( | 39 | __asm__( |
32 | " wsbh %0, %1 \n" | 40 | " wsbh %0, %1 \n" |
@@ -36,11 +44,10 @@ static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x) | |||
36 | 44 | ||
37 | return x; | 45 | return x; |
38 | } | 46 | } |
39 | #define __arch__swab32(x) ___arch__swab32(x) | 47 | #define __arch_swab32 __arch_swab32 |
40 | 48 | ||
41 | #ifdef CONFIG_CPU_MIPS64_R2 | 49 | #ifdef CONFIG_CPU_MIPS64_R2 |
42 | 50 | static inline __attribute_const__ __u64 __arch_swab64(__u64 x) | |
43 | static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x) | ||
44 | { | 51 | { |
45 | __asm__( | 52 | __asm__( |
46 | " dsbh %0, %1 \n" | 53 | " dsbh %0, %1 \n" |
@@ -51,26 +58,11 @@ static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x) | |||
51 | 58 | ||
52 | return x; | 59 | return x; |
53 | } | 60 | } |
54 | 61 | #define __arch_swab64 __arch_swab64 | |
55 | #define __arch__swab64(x) ___arch__swab64(x) | ||
56 | |||
57 | #endif /* CONFIG_CPU_MIPS64_R2 */ | 62 | #endif /* CONFIG_CPU_MIPS64_R2 */ |
58 | 63 | ||
59 | #endif /* CONFIG_CPU_MIPSR2 */ | 64 | #endif /* CONFIG_CPU_MIPSR2 */ |
60 | 65 | ||
61 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) | 66 | #include <linux/byteorder.h> |
62 | # define __BYTEORDER_HAS_U64__ | ||
63 | # define __SWAB_64_THRU_32__ | ||
64 | #endif | ||
65 | |||
66 | #endif /* __GNUC__ */ | ||
67 | |||
68 | #if defined(__MIPSEB__) | ||
69 | # include <linux/byteorder/big_endian.h> | ||
70 | #elif defined(__MIPSEL__) | ||
71 | # include <linux/byteorder/little_endian.h> | ||
72 | #else | ||
73 | # error "MIPS, but neither __MIPSEB__, nor __MIPSEL__???" | ||
74 | #endif | ||
75 | 67 | ||
76 | #endif /* _ASM_BYTEORDER_H */ | 68 | #endif /* _ASM_BYTEORDER_H */ |
diff --git a/arch/mips/include/asm/cpu-features.h b/arch/mips/include/asm/cpu-features.h index 5ea701fc3425..12d12dfe73c0 100644 --- a/arch/mips/include/asm/cpu-features.h +++ b/arch/mips/include/asm/cpu-features.h | |||
@@ -141,6 +141,8 @@ | |||
141 | #define cpu_has_mips64 (cpu_has_mips64r1 | cpu_has_mips64r2) | 141 | #define cpu_has_mips64 (cpu_has_mips64r1 | cpu_has_mips64r2) |
142 | #define cpu_has_mips_r1 (cpu_has_mips32r1 | cpu_has_mips64r1) | 142 | #define cpu_has_mips_r1 (cpu_has_mips32r1 | cpu_has_mips64r1) |
143 | #define cpu_has_mips_r2 (cpu_has_mips32r2 | cpu_has_mips64r2) | 143 | #define cpu_has_mips_r2 (cpu_has_mips32r2 | cpu_has_mips64r2) |
144 | #define cpu_has_mips_r (cpu_has_mips32r1 | cpu_has_mips32r2 | \ | ||
145 | cpu_has_mips64r1 | cpu_has_mips64r2) | ||
144 | 146 | ||
145 | #ifndef cpu_has_dsp | 147 | #ifndef cpu_has_dsp |
146 | #define cpu_has_dsp (cpu_data[0].ases & MIPS_ASE_DSP) | 148 | #define cpu_has_dsp (cpu_data[0].ases & MIPS_ASE_DSP) |
diff --git a/arch/mips/include/asm/ds1286.h b/arch/mips/include/asm/ds1286.h deleted file mode 100644 index 6983b6ff0af3..000000000000 --- a/arch/mips/include/asm/ds1286.h +++ /dev/null | |||
@@ -1,15 +0,0 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Machine dependent access functions for RTC registers. | ||
7 | * | ||
8 | * Copyright (C) 2003 Ralf Baechle (ralf@linux-mips.org) | ||
9 | */ | ||
10 | #ifndef _ASM_DS1286_H | ||
11 | #define _ASM_DS1286_H | ||
12 | |||
13 | #include <ds1286.h> | ||
14 | |||
15 | #endif /* _ASM_DS1286_H */ | ||
diff --git a/arch/mips/include/asm/fpu_emulator.h b/arch/mips/include/asm/fpu_emulator.h index 2731c38bd7ae..e5189572956c 100644 --- a/arch/mips/include/asm/fpu_emulator.h +++ b/arch/mips/include/asm/fpu_emulator.h | |||
@@ -23,6 +23,9 @@ | |||
23 | #ifndef _ASM_FPU_EMULATOR_H | 23 | #ifndef _ASM_FPU_EMULATOR_H |
24 | #define _ASM_FPU_EMULATOR_H | 24 | #define _ASM_FPU_EMULATOR_H |
25 | 25 | ||
26 | #include <asm/break.h> | ||
27 | #include <asm/inst.h> | ||
28 | |||
26 | struct mips_fpu_emulator_stats { | 29 | struct mips_fpu_emulator_stats { |
27 | unsigned int emulated; | 30 | unsigned int emulated; |
28 | unsigned int loads; | 31 | unsigned int loads; |
@@ -34,4 +37,18 @@ struct mips_fpu_emulator_stats { | |||
34 | 37 | ||
35 | extern struct mips_fpu_emulator_stats fpuemustats; | 38 | extern struct mips_fpu_emulator_stats fpuemustats; |
36 | 39 | ||
40 | extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir, | ||
41 | unsigned long cpc); | ||
42 | extern int do_dsemulret(struct pt_regs *xcp); | ||
43 | |||
44 | /* | ||
45 | * Instruction inserted following the badinst to further tag the sequence | ||
46 | */ | ||
47 | #define BD_COOKIE 0x0000bd36 /* tne $0, $0 with baggage */ | ||
48 | |||
49 | /* | ||
50 | * Break instruction with special math emu break code set | ||
51 | */ | ||
52 | #define BREAK_MATH (0x0000000d | (BRK_MEMU << 16)) | ||
53 | |||
37 | #endif /* _ASM_FPU_EMULATOR_H */ | 54 | #endif /* _ASM_FPU_EMULATOR_H */ |
diff --git a/arch/mips/include/asm/m48t35.h b/arch/mips/include/asm/m48t35.h deleted file mode 100644 index f44852e9a96d..000000000000 --- a/arch/mips/include/asm/m48t35.h +++ /dev/null | |||
@@ -1,27 +0,0 @@ | |||
1 | /* | ||
2 | * Registers for the SGS-Thomson M48T35 Timekeeper RAM chip | ||
3 | */ | ||
4 | #ifndef _ASM_M48T35_H | ||
5 | #define _ASM_M48T35_H | ||
6 | |||
7 | #include <linux/spinlock.h> | ||
8 | |||
9 | extern spinlock_t rtc_lock; | ||
10 | |||
11 | struct m48t35_rtc { | ||
12 | volatile u8 pad[0x7ff8]; /* starts at 0x7ff8 */ | ||
13 | volatile u8 control; | ||
14 | volatile u8 sec; | ||
15 | volatile u8 min; | ||
16 | volatile u8 hour; | ||
17 | volatile u8 day; | ||
18 | volatile u8 date; | ||
19 | volatile u8 month; | ||
20 | volatile u8 year; | ||
21 | }; | ||
22 | |||
23 | #define M48T35_RTC_SET 0x80 | ||
24 | #define M48T35_RTC_STOPPED 0x80 | ||
25 | #define M48T35_RTC_READ 0x40 | ||
26 | |||
27 | #endif /* _ASM_M48T35_H */ | ||
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 0cf15457ecac..c9207b5fd923 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
@@ -286,11 +286,12 @@ static inline int __cpu_has_fpu(void) | |||
286 | #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ | 286 | #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ |
287 | | MIPS_CPU_COUNTER) | 287 | | MIPS_CPU_COUNTER) |
288 | 288 | ||
289 | static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | 289 | static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) |
290 | { | 290 | { |
291 | switch (c->processor_id & 0xff00) { | 291 | switch (c->processor_id & 0xff00) { |
292 | case PRID_IMP_R2000: | 292 | case PRID_IMP_R2000: |
293 | c->cputype = CPU_R2000; | 293 | c->cputype = CPU_R2000; |
294 | __cpu_name[cpu] = "R2000"; | ||
294 | c->isa_level = MIPS_CPU_ISA_I; | 295 | c->isa_level = MIPS_CPU_ISA_I; |
295 | c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE | | 296 | c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE | |
296 | MIPS_CPU_NOFPUEX; | 297 | MIPS_CPU_NOFPUEX; |
@@ -299,13 +300,19 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
299 | c->tlbsize = 64; | 300 | c->tlbsize = 64; |
300 | break; | 301 | break; |
301 | case PRID_IMP_R3000: | 302 | case PRID_IMP_R3000: |
302 | if ((c->processor_id & 0xff) == PRID_REV_R3000A) | 303 | if ((c->processor_id & 0xff) == PRID_REV_R3000A) { |
303 | if (cpu_has_confreg()) | 304 | if (cpu_has_confreg()) { |
304 | c->cputype = CPU_R3081E; | 305 | c->cputype = CPU_R3081E; |
305 | else | 306 | __cpu_name[cpu] = "R3081"; |
307 | } else { | ||
306 | c->cputype = CPU_R3000A; | 308 | c->cputype = CPU_R3000A; |
307 | else | 309 | __cpu_name[cpu] = "R3000A"; |
310 | } | ||
311 | break; | ||
312 | } else { | ||
308 | c->cputype = CPU_R3000; | 313 | c->cputype = CPU_R3000; |
314 | __cpu_name[cpu] = "R3000"; | ||
315 | } | ||
309 | c->isa_level = MIPS_CPU_ISA_I; | 316 | c->isa_level = MIPS_CPU_ISA_I; |
310 | c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE | | 317 | c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE | |
311 | MIPS_CPU_NOFPUEX; | 318 | MIPS_CPU_NOFPUEX; |
@@ -315,15 +322,21 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
315 | break; | 322 | break; |
316 | case PRID_IMP_R4000: | 323 | case PRID_IMP_R4000: |
317 | if (read_c0_config() & CONF_SC) { | 324 | if (read_c0_config() & CONF_SC) { |
318 | if ((c->processor_id & 0xff) >= PRID_REV_R4400) | 325 | if ((c->processor_id & 0xff) >= PRID_REV_R4400) { |
319 | c->cputype = CPU_R4400PC; | 326 | c->cputype = CPU_R4400PC; |
320 | else | 327 | __cpu_name[cpu] = "R4400PC"; |
328 | } else { | ||
321 | c->cputype = CPU_R4000PC; | 329 | c->cputype = CPU_R4000PC; |
330 | __cpu_name[cpu] = "R4000PC"; | ||
331 | } | ||
322 | } else { | 332 | } else { |
323 | if ((c->processor_id & 0xff) >= PRID_REV_R4400) | 333 | if ((c->processor_id & 0xff) >= PRID_REV_R4400) { |
324 | c->cputype = CPU_R4400SC; | 334 | c->cputype = CPU_R4400SC; |
325 | else | 335 | __cpu_name[cpu] = "R4400SC"; |
336 | } else { | ||
326 | c->cputype = CPU_R4000SC; | 337 | c->cputype = CPU_R4000SC; |
338 | __cpu_name[cpu] = "R4000SC"; | ||
339 | } | ||
327 | } | 340 | } |
328 | 341 | ||
329 | c->isa_level = MIPS_CPU_ISA_III; | 342 | c->isa_level = MIPS_CPU_ISA_III; |
@@ -336,25 +349,34 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
336 | switch (c->processor_id & 0xf0) { | 349 | switch (c->processor_id & 0xf0) { |
337 | case PRID_REV_VR4111: | 350 | case PRID_REV_VR4111: |
338 | c->cputype = CPU_VR4111; | 351 | c->cputype = CPU_VR4111; |
352 | __cpu_name[cpu] = "NEC VR4111"; | ||
339 | break; | 353 | break; |
340 | case PRID_REV_VR4121: | 354 | case PRID_REV_VR4121: |
341 | c->cputype = CPU_VR4121; | 355 | c->cputype = CPU_VR4121; |
356 | __cpu_name[cpu] = "NEC VR4121"; | ||
342 | break; | 357 | break; |
343 | case PRID_REV_VR4122: | 358 | case PRID_REV_VR4122: |
344 | if ((c->processor_id & 0xf) < 0x3) | 359 | if ((c->processor_id & 0xf) < 0x3) { |
345 | c->cputype = CPU_VR4122; | 360 | c->cputype = CPU_VR4122; |
346 | else | 361 | __cpu_name[cpu] = "NEC VR4122"; |
362 | } else { | ||
347 | c->cputype = CPU_VR4181A; | 363 | c->cputype = CPU_VR4181A; |
364 | __cpu_name[cpu] = "NEC VR4181A"; | ||
365 | } | ||
348 | break; | 366 | break; |
349 | case PRID_REV_VR4130: | 367 | case PRID_REV_VR4130: |
350 | if ((c->processor_id & 0xf) < 0x4) | 368 | if ((c->processor_id & 0xf) < 0x4) { |
351 | c->cputype = CPU_VR4131; | 369 | c->cputype = CPU_VR4131; |
352 | else | 370 | __cpu_name[cpu] = "NEC VR4131"; |
371 | } else { | ||
353 | c->cputype = CPU_VR4133; | 372 | c->cputype = CPU_VR4133; |
373 | __cpu_name[cpu] = "NEC VR4133"; | ||
374 | } | ||
354 | break; | 375 | break; |
355 | default: | 376 | default: |
356 | printk(KERN_INFO "Unexpected CPU of NEC VR4100 series\n"); | 377 | printk(KERN_INFO "Unexpected CPU of NEC VR4100 series\n"); |
357 | c->cputype = CPU_VR41XX; | 378 | c->cputype = CPU_VR41XX; |
379 | __cpu_name[cpu] = "NEC Vr41xx"; | ||
358 | break; | 380 | break; |
359 | } | 381 | } |
360 | c->isa_level = MIPS_CPU_ISA_III; | 382 | c->isa_level = MIPS_CPU_ISA_III; |
@@ -363,6 +385,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
363 | break; | 385 | break; |
364 | case PRID_IMP_R4300: | 386 | case PRID_IMP_R4300: |
365 | c->cputype = CPU_R4300; | 387 | c->cputype = CPU_R4300; |
388 | __cpu_name[cpu] = "R4300"; | ||
366 | c->isa_level = MIPS_CPU_ISA_III; | 389 | c->isa_level = MIPS_CPU_ISA_III; |
367 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 390 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
368 | MIPS_CPU_LLSC; | 391 | MIPS_CPU_LLSC; |
@@ -370,6 +393,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
370 | break; | 393 | break; |
371 | case PRID_IMP_R4600: | 394 | case PRID_IMP_R4600: |
372 | c->cputype = CPU_R4600; | 395 | c->cputype = CPU_R4600; |
396 | __cpu_name[cpu] = "R4600"; | ||
373 | c->isa_level = MIPS_CPU_ISA_III; | 397 | c->isa_level = MIPS_CPU_ISA_III; |
374 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 398 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
375 | MIPS_CPU_LLSC; | 399 | MIPS_CPU_LLSC; |
@@ -384,6 +408,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
384 | * it's c0_prid id number with the TX3900. | 408 | * it's c0_prid id number with the TX3900. |
385 | */ | 409 | */ |
386 | c->cputype = CPU_R4650; | 410 | c->cputype = CPU_R4650; |
411 | __cpu_name[cpu] = "R4650"; | ||
387 | c->isa_level = MIPS_CPU_ISA_III; | 412 | c->isa_level = MIPS_CPU_ISA_III; |
388 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_LLSC; | 413 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_LLSC; |
389 | c->tlbsize = 48; | 414 | c->tlbsize = 48; |
@@ -395,25 +420,26 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
395 | 420 | ||
396 | if ((c->processor_id & 0xf0) == (PRID_REV_TX3927 & 0xf0)) { | 421 | if ((c->processor_id & 0xf0) == (PRID_REV_TX3927 & 0xf0)) { |
397 | c->cputype = CPU_TX3927; | 422 | c->cputype = CPU_TX3927; |
423 | __cpu_name[cpu] = "TX3927"; | ||
398 | c->tlbsize = 64; | 424 | c->tlbsize = 64; |
399 | } else { | 425 | } else { |
400 | switch (c->processor_id & 0xff) { | 426 | switch (c->processor_id & 0xff) { |
401 | case PRID_REV_TX3912: | 427 | case PRID_REV_TX3912: |
402 | c->cputype = CPU_TX3912; | 428 | c->cputype = CPU_TX3912; |
429 | __cpu_name[cpu] = "TX3912"; | ||
403 | c->tlbsize = 32; | 430 | c->tlbsize = 32; |
404 | break; | 431 | break; |
405 | case PRID_REV_TX3922: | 432 | case PRID_REV_TX3922: |
406 | c->cputype = CPU_TX3922; | 433 | c->cputype = CPU_TX3922; |
434 | __cpu_name[cpu] = "TX3922"; | ||
407 | c->tlbsize = 64; | 435 | c->tlbsize = 64; |
408 | break; | 436 | break; |
409 | default: | ||
410 | c->cputype = CPU_UNKNOWN; | ||
411 | break; | ||
412 | } | 437 | } |
413 | } | 438 | } |
414 | break; | 439 | break; |
415 | case PRID_IMP_R4700: | 440 | case PRID_IMP_R4700: |
416 | c->cputype = CPU_R4700; | 441 | c->cputype = CPU_R4700; |
442 | __cpu_name[cpu] = "R4700"; | ||
417 | c->isa_level = MIPS_CPU_ISA_III; | 443 | c->isa_level = MIPS_CPU_ISA_III; |
418 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 444 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
419 | MIPS_CPU_LLSC; | 445 | MIPS_CPU_LLSC; |
@@ -421,6 +447,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
421 | break; | 447 | break; |
422 | case PRID_IMP_TX49: | 448 | case PRID_IMP_TX49: |
423 | c->cputype = CPU_TX49XX; | 449 | c->cputype = CPU_TX49XX; |
450 | __cpu_name[cpu] = "R49XX"; | ||
424 | c->isa_level = MIPS_CPU_ISA_III; | 451 | c->isa_level = MIPS_CPU_ISA_III; |
425 | c->options = R4K_OPTS | MIPS_CPU_LLSC; | 452 | c->options = R4K_OPTS | MIPS_CPU_LLSC; |
426 | if (!(c->processor_id & 0x08)) | 453 | if (!(c->processor_id & 0x08)) |
@@ -429,6 +456,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
429 | break; | 456 | break; |
430 | case PRID_IMP_R5000: | 457 | case PRID_IMP_R5000: |
431 | c->cputype = CPU_R5000; | 458 | c->cputype = CPU_R5000; |
459 | __cpu_name[cpu] = "R5000"; | ||
432 | c->isa_level = MIPS_CPU_ISA_IV; | 460 | c->isa_level = MIPS_CPU_ISA_IV; |
433 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 461 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
434 | MIPS_CPU_LLSC; | 462 | MIPS_CPU_LLSC; |
@@ -436,6 +464,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
436 | break; | 464 | break; |
437 | case PRID_IMP_R5432: | 465 | case PRID_IMP_R5432: |
438 | c->cputype = CPU_R5432; | 466 | c->cputype = CPU_R5432; |
467 | __cpu_name[cpu] = "R5432"; | ||
439 | c->isa_level = MIPS_CPU_ISA_IV; | 468 | c->isa_level = MIPS_CPU_ISA_IV; |
440 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 469 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
441 | MIPS_CPU_WATCH | MIPS_CPU_LLSC; | 470 | MIPS_CPU_WATCH | MIPS_CPU_LLSC; |
@@ -443,6 +472,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
443 | break; | 472 | break; |
444 | case PRID_IMP_R5500: | 473 | case PRID_IMP_R5500: |
445 | c->cputype = CPU_R5500; | 474 | c->cputype = CPU_R5500; |
475 | __cpu_name[cpu] = "R5500"; | ||
446 | c->isa_level = MIPS_CPU_ISA_IV; | 476 | c->isa_level = MIPS_CPU_ISA_IV; |
447 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 477 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
448 | MIPS_CPU_WATCH | MIPS_CPU_LLSC; | 478 | MIPS_CPU_WATCH | MIPS_CPU_LLSC; |
@@ -450,6 +480,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
450 | break; | 480 | break; |
451 | case PRID_IMP_NEVADA: | 481 | case PRID_IMP_NEVADA: |
452 | c->cputype = CPU_NEVADA; | 482 | c->cputype = CPU_NEVADA; |
483 | __cpu_name[cpu] = "Nevada"; | ||
453 | c->isa_level = MIPS_CPU_ISA_IV; | 484 | c->isa_level = MIPS_CPU_ISA_IV; |
454 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 485 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
455 | MIPS_CPU_DIVEC | MIPS_CPU_LLSC; | 486 | MIPS_CPU_DIVEC | MIPS_CPU_LLSC; |
@@ -457,6 +488,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
457 | break; | 488 | break; |
458 | case PRID_IMP_R6000: | 489 | case PRID_IMP_R6000: |
459 | c->cputype = CPU_R6000; | 490 | c->cputype = CPU_R6000; |
491 | __cpu_name[cpu] = "R6000"; | ||
460 | c->isa_level = MIPS_CPU_ISA_II; | 492 | c->isa_level = MIPS_CPU_ISA_II; |
461 | c->options = MIPS_CPU_TLB | MIPS_CPU_FPU | | 493 | c->options = MIPS_CPU_TLB | MIPS_CPU_FPU | |
462 | MIPS_CPU_LLSC; | 494 | MIPS_CPU_LLSC; |
@@ -464,6 +496,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
464 | break; | 496 | break; |
465 | case PRID_IMP_R6000A: | 497 | case PRID_IMP_R6000A: |
466 | c->cputype = CPU_R6000A; | 498 | c->cputype = CPU_R6000A; |
499 | __cpu_name[cpu] = "R6000A"; | ||
467 | c->isa_level = MIPS_CPU_ISA_II; | 500 | c->isa_level = MIPS_CPU_ISA_II; |
468 | c->options = MIPS_CPU_TLB | MIPS_CPU_FPU | | 501 | c->options = MIPS_CPU_TLB | MIPS_CPU_FPU | |
469 | MIPS_CPU_LLSC; | 502 | MIPS_CPU_LLSC; |
@@ -471,6 +504,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
471 | break; | 504 | break; |
472 | case PRID_IMP_RM7000: | 505 | case PRID_IMP_RM7000: |
473 | c->cputype = CPU_RM7000; | 506 | c->cputype = CPU_RM7000; |
507 | __cpu_name[cpu] = "RM7000"; | ||
474 | c->isa_level = MIPS_CPU_ISA_IV; | 508 | c->isa_level = MIPS_CPU_ISA_IV; |
475 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 509 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
476 | MIPS_CPU_LLSC; | 510 | MIPS_CPU_LLSC; |
@@ -486,6 +520,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
486 | break; | 520 | break; |
487 | case PRID_IMP_RM9000: | 521 | case PRID_IMP_RM9000: |
488 | c->cputype = CPU_RM9000; | 522 | c->cputype = CPU_RM9000; |
523 | __cpu_name[cpu] = "RM9000"; | ||
489 | c->isa_level = MIPS_CPU_ISA_IV; | 524 | c->isa_level = MIPS_CPU_ISA_IV; |
490 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 525 | c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
491 | MIPS_CPU_LLSC; | 526 | MIPS_CPU_LLSC; |
@@ -500,6 +535,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
500 | break; | 535 | break; |
501 | case PRID_IMP_R8000: | 536 | case PRID_IMP_R8000: |
502 | c->cputype = CPU_R8000; | 537 | c->cputype = CPU_R8000; |
538 | __cpu_name[cpu] = "RM8000"; | ||
503 | c->isa_level = MIPS_CPU_ISA_IV; | 539 | c->isa_level = MIPS_CPU_ISA_IV; |
504 | c->options = MIPS_CPU_TLB | MIPS_CPU_4KEX | | 540 | c->options = MIPS_CPU_TLB | MIPS_CPU_4KEX | |
505 | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 541 | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
@@ -508,6 +544,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
508 | break; | 544 | break; |
509 | case PRID_IMP_R10000: | 545 | case PRID_IMP_R10000: |
510 | c->cputype = CPU_R10000; | 546 | c->cputype = CPU_R10000; |
547 | __cpu_name[cpu] = "R10000"; | ||
511 | c->isa_level = MIPS_CPU_ISA_IV; | 548 | c->isa_level = MIPS_CPU_ISA_IV; |
512 | c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX | | 549 | c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX | |
513 | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 550 | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
@@ -517,6 +554,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
517 | break; | 554 | break; |
518 | case PRID_IMP_R12000: | 555 | case PRID_IMP_R12000: |
519 | c->cputype = CPU_R12000; | 556 | c->cputype = CPU_R12000; |
557 | __cpu_name[cpu] = "R12000"; | ||
520 | c->isa_level = MIPS_CPU_ISA_IV; | 558 | c->isa_level = MIPS_CPU_ISA_IV; |
521 | c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX | | 559 | c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX | |
522 | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 560 | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
@@ -526,6 +564,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
526 | break; | 564 | break; |
527 | case PRID_IMP_R14000: | 565 | case PRID_IMP_R14000: |
528 | c->cputype = CPU_R14000; | 566 | c->cputype = CPU_R14000; |
567 | __cpu_name[cpu] = "R14000"; | ||
529 | c->isa_level = MIPS_CPU_ISA_IV; | 568 | c->isa_level = MIPS_CPU_ISA_IV; |
530 | c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX | | 569 | c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX | |
531 | MIPS_CPU_FPU | MIPS_CPU_32FPR | | 570 | MIPS_CPU_FPU | MIPS_CPU_32FPR | |
@@ -535,6 +574,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c) | |||
535 | break; | 574 | break; |
536 | case PRID_IMP_LOONGSON2: | 575 | case PRID_IMP_LOONGSON2: |
537 | c->cputype = CPU_LOONGSON2; | 576 | c->cputype = CPU_LOONGSON2; |
577 | __cpu_name[cpu] = "ICT Loongson-2"; | ||
538 | c->isa_level = MIPS_CPU_ISA_III; | 578 | c->isa_level = MIPS_CPU_ISA_III; |
539 | c->options = R4K_OPTS | | 579 | c->options = R4K_OPTS | |
540 | MIPS_CPU_FPU | MIPS_CPU_LLSC | | 580 | MIPS_CPU_FPU | MIPS_CPU_LLSC | |
@@ -652,21 +692,24 @@ static inline unsigned int decode_config3(struct cpuinfo_mips *c) | |||
652 | 692 | ||
653 | static void __cpuinit decode_configs(struct cpuinfo_mips *c) | 693 | static void __cpuinit decode_configs(struct cpuinfo_mips *c) |
654 | { | 694 | { |
695 | int ok; | ||
696 | |||
655 | /* MIPS32 or MIPS64 compliant CPU. */ | 697 | /* MIPS32 or MIPS64 compliant CPU. */ |
656 | c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER | | 698 | c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER | |
657 | MIPS_CPU_DIVEC | MIPS_CPU_LLSC | MIPS_CPU_MCHECK; | 699 | MIPS_CPU_DIVEC | MIPS_CPU_LLSC | MIPS_CPU_MCHECK; |
658 | 700 | ||
659 | c->scache.flags = MIPS_CACHE_NOT_PRESENT; | 701 | c->scache.flags = MIPS_CACHE_NOT_PRESENT; |
660 | 702 | ||
661 | /* Read Config registers. */ | 703 | ok = decode_config0(c); /* Read Config registers. */ |
662 | if (!decode_config0(c)) | 704 | BUG_ON(!ok); /* Arch spec violation! */ |
663 | return; /* actually worth a panic() */ | 705 | if (ok) |
664 | if (!decode_config1(c)) | 706 | ok = decode_config1(c); |
665 | return; | 707 | if (ok) |
666 | if (!decode_config2(c)) | 708 | ok = decode_config2(c); |
667 | return; | 709 | if (ok) |
668 | if (!decode_config3(c)) | 710 | ok = decode_config3(c); |
669 | return; | 711 | |
712 | mips_probe_watch_registers(c); | ||
670 | } | 713 | } |
671 | 714 | ||
672 | #ifdef CONFIG_CPU_MIPSR2 | 715 | #ifdef CONFIG_CPU_MIPSR2 |
@@ -675,52 +718,62 @@ extern void spram_config(void); | |||
675 | static inline void spram_config(void) {} | 718 | static inline void spram_config(void) {} |
676 | #endif | 719 | #endif |
677 | 720 | ||
678 | static inline void cpu_probe_mips(struct cpuinfo_mips *c) | 721 | static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu) |
679 | { | 722 | { |
680 | decode_configs(c); | 723 | decode_configs(c); |
681 | mips_probe_watch_registers(c); | ||
682 | switch (c->processor_id & 0xff00) { | 724 | switch (c->processor_id & 0xff00) { |
683 | case PRID_IMP_4KC: | 725 | case PRID_IMP_4KC: |
684 | c->cputype = CPU_4KC; | 726 | c->cputype = CPU_4KC; |
727 | __cpu_name[cpu] = "MIPS 4Kc"; | ||
685 | break; | 728 | break; |
686 | case PRID_IMP_4KEC: | 729 | case PRID_IMP_4KEC: |
687 | c->cputype = CPU_4KEC; | 730 | c->cputype = CPU_4KEC; |
731 | __cpu_name[cpu] = "MIPS 4KEc"; | ||
688 | break; | 732 | break; |
689 | case PRID_IMP_4KECR2: | 733 | case PRID_IMP_4KECR2: |
690 | c->cputype = CPU_4KEC; | 734 | c->cputype = CPU_4KEC; |
735 | __cpu_name[cpu] = "MIPS 4KEc"; | ||
691 | break; | 736 | break; |
692 | case PRID_IMP_4KSC: | 737 | case PRID_IMP_4KSC: |
693 | case PRID_IMP_4KSD: | 738 | case PRID_IMP_4KSD: |
694 | c->cputype = CPU_4KSC; | 739 | c->cputype = CPU_4KSC; |
740 | __cpu_name[cpu] = "MIPS 4KSc"; | ||
695 | break; | 741 | break; |
696 | case PRID_IMP_5KC: | 742 | case PRID_IMP_5KC: |
697 | c->cputype = CPU_5KC; | 743 | c->cputype = CPU_5KC; |
744 | __cpu_name[cpu] = "MIPS 5Kc"; | ||
698 | break; | 745 | break; |
699 | case PRID_IMP_20KC: | 746 | case PRID_IMP_20KC: |
700 | c->cputype = CPU_20KC; | 747 | c->cputype = CPU_20KC; |
748 | __cpu_name[cpu] = "MIPS 20Kc"; | ||
701 | break; | 749 | break; |
702 | case PRID_IMP_24K: | 750 | case PRID_IMP_24K: |
703 | case PRID_IMP_24KE: | 751 | case PRID_IMP_24KE: |
704 | c->cputype = CPU_24K; | 752 | c->cputype = CPU_24K; |
753 | __cpu_name[cpu] = "MIPS 24Kc"; | ||
705 | break; | 754 | break; |
706 | case PRID_IMP_25KF: | 755 | case PRID_IMP_25KF: |
707 | c->cputype = CPU_25KF; | 756 | c->cputype = CPU_25KF; |
757 | __cpu_name[cpu] = "MIPS 25Kc"; | ||
708 | break; | 758 | break; |
709 | case PRID_IMP_34K: | 759 | case PRID_IMP_34K: |
710 | c->cputype = CPU_34K; | 760 | c->cputype = CPU_34K; |
761 | __cpu_name[cpu] = "MIPS 34Kc"; | ||
711 | break; | 762 | break; |
712 | case PRID_IMP_74K: | 763 | case PRID_IMP_74K: |
713 | c->cputype = CPU_74K; | 764 | c->cputype = CPU_74K; |
765 | __cpu_name[cpu] = "MIPS 74Kc"; | ||
714 | break; | 766 | break; |
715 | case PRID_IMP_1004K: | 767 | case PRID_IMP_1004K: |
716 | c->cputype = CPU_1004K; | 768 | c->cputype = CPU_1004K; |
769 | __cpu_name[cpu] = "MIPS 1004Kc"; | ||
717 | break; | 770 | break; |
718 | } | 771 | } |
719 | 772 | ||
720 | spram_config(); | 773 | spram_config(); |
721 | } | 774 | } |
722 | 775 | ||
723 | static inline void cpu_probe_alchemy(struct cpuinfo_mips *c) | 776 | static inline void cpu_probe_alchemy(struct cpuinfo_mips *c, unsigned int cpu) |
724 | { | 777 | { |
725 | decode_configs(c); | 778 | decode_configs(c); |
726 | switch (c->processor_id & 0xff00) { | 779 | switch (c->processor_id & 0xff00) { |
@@ -729,23 +782,31 @@ static inline void cpu_probe_alchemy(struct cpuinfo_mips *c) | |||
729 | switch ((c->processor_id >> 24) & 0xff) { | 782 | switch ((c->processor_id >> 24) & 0xff) { |
730 | case 0: | 783 | case 0: |
731 | c->cputype = CPU_AU1000; | 784 | c->cputype = CPU_AU1000; |
785 | __cpu_name[cpu] = "Au1000"; | ||
732 | break; | 786 | break; |
733 | case 1: | 787 | case 1: |
734 | c->cputype = CPU_AU1500; | 788 | c->cputype = CPU_AU1500; |
789 | __cpu_name[cpu] = "Au1500"; | ||
735 | break; | 790 | break; |
736 | case 2: | 791 | case 2: |
737 | c->cputype = CPU_AU1100; | 792 | c->cputype = CPU_AU1100; |
793 | __cpu_name[cpu] = "Au1100"; | ||
738 | break; | 794 | break; |
739 | case 3: | 795 | case 3: |
740 | c->cputype = CPU_AU1550; | 796 | c->cputype = CPU_AU1550; |
797 | __cpu_name[cpu] = "Au1550"; | ||
741 | break; | 798 | break; |
742 | case 4: | 799 | case 4: |
743 | c->cputype = CPU_AU1200; | 800 | c->cputype = CPU_AU1200; |
744 | if (2 == (c->processor_id & 0xff)) | 801 | __cpu_name[cpu] = "Au1200"; |
802 | if ((c->processor_id & 0xff) == 2) { | ||
745 | c->cputype = CPU_AU1250; | 803 | c->cputype = CPU_AU1250; |
804 | __cpu_name[cpu] = "Au1250"; | ||
805 | } | ||
746 | break; | 806 | break; |
747 | case 5: | 807 | case 5: |
748 | c->cputype = CPU_AU1210; | 808 | c->cputype = CPU_AU1210; |
809 | __cpu_name[cpu] = "Au1210"; | ||
749 | break; | 810 | break; |
750 | default: | 811 | default: |
751 | panic("Unknown Au Core!"); | 812 | panic("Unknown Au Core!"); |
@@ -755,154 +816,67 @@ static inline void cpu_probe_alchemy(struct cpuinfo_mips *c) | |||
755 | } | 816 | } |
756 | } | 817 | } |
757 | 818 | ||
758 | static inline void cpu_probe_sibyte(struct cpuinfo_mips *c) | 819 | static inline void cpu_probe_sibyte(struct cpuinfo_mips *c, unsigned int cpu) |
759 | { | 820 | { |
760 | decode_configs(c); | 821 | decode_configs(c); |
761 | 822 | ||
762 | switch (c->processor_id & 0xff00) { | 823 | switch (c->processor_id & 0xff00) { |
763 | case PRID_IMP_SB1: | 824 | case PRID_IMP_SB1: |
764 | c->cputype = CPU_SB1; | 825 | c->cputype = CPU_SB1; |
826 | __cpu_name[cpu] = "SiByte SB1"; | ||
765 | /* FPU in pass1 is known to have issues. */ | 827 | /* FPU in pass1 is known to have issues. */ |
766 | if ((c->processor_id & 0xff) < 0x02) | 828 | if ((c->processor_id & 0xff) < 0x02) |
767 | c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); | 829 | c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); |
768 | break; | 830 | break; |
769 | case PRID_IMP_SB1A: | 831 | case PRID_IMP_SB1A: |
770 | c->cputype = CPU_SB1A; | 832 | c->cputype = CPU_SB1A; |
833 | __cpu_name[cpu] = "SiByte SB1A"; | ||
771 | break; | 834 | break; |
772 | } | 835 | } |
773 | } | 836 | } |
774 | 837 | ||
775 | static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c) | 838 | static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c, unsigned int cpu) |
776 | { | 839 | { |
777 | decode_configs(c); | 840 | decode_configs(c); |
778 | switch (c->processor_id & 0xff00) { | 841 | switch (c->processor_id & 0xff00) { |
779 | case PRID_IMP_SR71000: | 842 | case PRID_IMP_SR71000: |
780 | c->cputype = CPU_SR71000; | 843 | c->cputype = CPU_SR71000; |
844 | __cpu_name[cpu] = "Sandcraft SR71000"; | ||
781 | c->scache.ways = 8; | 845 | c->scache.ways = 8; |
782 | c->tlbsize = 64; | 846 | c->tlbsize = 64; |
783 | break; | 847 | break; |
784 | } | 848 | } |
785 | } | 849 | } |
786 | 850 | ||
787 | static inline void cpu_probe_nxp(struct cpuinfo_mips *c) | 851 | static inline void cpu_probe_nxp(struct cpuinfo_mips *c, unsigned int cpu) |
788 | { | 852 | { |
789 | decode_configs(c); | 853 | decode_configs(c); |
790 | switch (c->processor_id & 0xff00) { | 854 | switch (c->processor_id & 0xff00) { |
791 | case PRID_IMP_PR4450: | 855 | case PRID_IMP_PR4450: |
792 | c->cputype = CPU_PR4450; | 856 | c->cputype = CPU_PR4450; |
857 | __cpu_name[cpu] = "Philips PR4450"; | ||
793 | c->isa_level = MIPS_CPU_ISA_M32R1; | 858 | c->isa_level = MIPS_CPU_ISA_M32R1; |
794 | break; | 859 | break; |
795 | default: | ||
796 | panic("Unknown NXP Core!"); /* REVISIT: die? */ | ||
797 | break; | ||
798 | } | 860 | } |
799 | } | 861 | } |
800 | 862 | ||
801 | 863 | static inline void cpu_probe_broadcom(struct cpuinfo_mips *c, unsigned int cpu) | |
802 | static inline void cpu_probe_broadcom(struct cpuinfo_mips *c) | ||
803 | { | 864 | { |
804 | decode_configs(c); | 865 | decode_configs(c); |
805 | switch (c->processor_id & 0xff00) { | 866 | switch (c->processor_id & 0xff00) { |
806 | case PRID_IMP_BCM3302: | 867 | case PRID_IMP_BCM3302: |
807 | c->cputype = CPU_BCM3302; | 868 | c->cputype = CPU_BCM3302; |
869 | __cpu_name[cpu] = "Broadcom BCM3302"; | ||
808 | break; | 870 | break; |
809 | case PRID_IMP_BCM4710: | 871 | case PRID_IMP_BCM4710: |
810 | c->cputype = CPU_BCM4710; | 872 | c->cputype = CPU_BCM4710; |
811 | break; | 873 | __cpu_name[cpu] = "Broadcom BCM4710"; |
812 | default: | ||
813 | c->cputype = CPU_UNKNOWN; | ||
814 | break; | 874 | break; |
815 | } | 875 | } |
816 | } | 876 | } |
817 | 877 | ||
818 | const char *__cpu_name[NR_CPUS]; | 878 | const char *__cpu_name[NR_CPUS]; |
819 | 879 | ||
820 | /* | ||
821 | * Name a CPU | ||
822 | */ | ||
823 | static __cpuinit const char *cpu_to_name(struct cpuinfo_mips *c) | ||
824 | { | ||
825 | const char *name = NULL; | ||
826 | |||
827 | switch (c->cputype) { | ||
828 | case CPU_UNKNOWN: name = "unknown"; break; | ||
829 | case CPU_R2000: name = "R2000"; break; | ||
830 | case CPU_R3000: name = "R3000"; break; | ||
831 | case CPU_R3000A: name = "R3000A"; break; | ||
832 | case CPU_R3041: name = "R3041"; break; | ||
833 | case CPU_R3051: name = "R3051"; break; | ||
834 | case CPU_R3052: name = "R3052"; break; | ||
835 | case CPU_R3081: name = "R3081"; break; | ||
836 | case CPU_R3081E: name = "R3081E"; break; | ||
837 | case CPU_R4000PC: name = "R4000PC"; break; | ||
838 | case CPU_R4000SC: name = "R4000SC"; break; | ||
839 | case CPU_R4000MC: name = "R4000MC"; break; | ||
840 | case CPU_R4200: name = "R4200"; break; | ||
841 | case CPU_R4400PC: name = "R4400PC"; break; | ||
842 | case CPU_R4400SC: name = "R4400SC"; break; | ||
843 | case CPU_R4400MC: name = "R4400MC"; break; | ||
844 | case CPU_R4600: name = "R4600"; break; | ||
845 | case CPU_R6000: name = "R6000"; break; | ||
846 | case CPU_R6000A: name = "R6000A"; break; | ||
847 | case CPU_R8000: name = "R8000"; break; | ||
848 | case CPU_R10000: name = "R10000"; break; | ||
849 | case CPU_R12000: name = "R12000"; break; | ||
850 | case CPU_R14000: name = "R14000"; break; | ||
851 | case CPU_R4300: name = "R4300"; break; | ||
852 | case CPU_R4650: name = "R4650"; break; | ||
853 | case CPU_R4700: name = "R4700"; break; | ||
854 | case CPU_R5000: name = "R5000"; break; | ||
855 | case CPU_R5000A: name = "R5000A"; break; | ||
856 | case CPU_R4640: name = "R4640"; break; | ||
857 | case CPU_NEVADA: name = "Nevada"; break; | ||
858 | case CPU_RM7000: name = "RM7000"; break; | ||
859 | case CPU_RM9000: name = "RM9000"; break; | ||
860 | case CPU_R5432: name = "R5432"; break; | ||
861 | case CPU_4KC: name = "MIPS 4Kc"; break; | ||
862 | case CPU_5KC: name = "MIPS 5Kc"; break; | ||
863 | case CPU_R4310: name = "R4310"; break; | ||
864 | case CPU_SB1: name = "SiByte SB1"; break; | ||
865 | case CPU_SB1A: name = "SiByte SB1A"; break; | ||
866 | case CPU_TX3912: name = "TX3912"; break; | ||
867 | case CPU_TX3922: name = "TX3922"; break; | ||
868 | case CPU_TX3927: name = "TX3927"; break; | ||
869 | case CPU_AU1000: name = "Au1000"; break; | ||
870 | case CPU_AU1500: name = "Au1500"; break; | ||
871 | case CPU_AU1100: name = "Au1100"; break; | ||
872 | case CPU_AU1550: name = "Au1550"; break; | ||
873 | case CPU_AU1200: name = "Au1200"; break; | ||
874 | case CPU_AU1210: name = "Au1210"; break; | ||
875 | case CPU_AU1250: name = "Au1250"; break; | ||
876 | case CPU_4KEC: name = "MIPS 4KEc"; break; | ||
877 | case CPU_4KSC: name = "MIPS 4KSc"; break; | ||
878 | case CPU_VR41XX: name = "NEC Vr41xx"; break; | ||
879 | case CPU_R5500: name = "R5500"; break; | ||
880 | case CPU_TX49XX: name = "TX49xx"; break; | ||
881 | case CPU_20KC: name = "MIPS 20Kc"; break; | ||
882 | case CPU_24K: name = "MIPS 24K"; break; | ||
883 | case CPU_25KF: name = "MIPS 25Kf"; break; | ||
884 | case CPU_34K: name = "MIPS 34K"; break; | ||
885 | case CPU_1004K: name = "MIPS 1004K"; break; | ||
886 | case CPU_74K: name = "MIPS 74K"; break; | ||
887 | case CPU_VR4111: name = "NEC VR4111"; break; | ||
888 | case CPU_VR4121: name = "NEC VR4121"; break; | ||
889 | case CPU_VR4122: name = "NEC VR4122"; break; | ||
890 | case CPU_VR4131: name = "NEC VR4131"; break; | ||
891 | case CPU_VR4133: name = "NEC VR4133"; break; | ||
892 | case CPU_VR4181: name = "NEC VR4181"; break; | ||
893 | case CPU_VR4181A: name = "NEC VR4181A"; break; | ||
894 | case CPU_SR71000: name = "Sandcraft SR71000"; break; | ||
895 | case CPU_BCM3302: name = "Broadcom BCM3302"; break; | ||
896 | case CPU_BCM4710: name = "Broadcom BCM4710"; break; | ||
897 | case CPU_PR4450: name = "Philips PR4450"; break; | ||
898 | case CPU_LOONGSON2: name = "ICT Loongson-2"; break; | ||
899 | default: | ||
900 | BUG(); | ||
901 | } | ||
902 | |||
903 | return name; | ||
904 | } | ||
905 | |||
906 | __cpuinit void cpu_probe(void) | 880 | __cpuinit void cpu_probe(void) |
907 | { | 881 | { |
908 | struct cpuinfo_mips *c = ¤t_cpu_data; | 882 | struct cpuinfo_mips *c = ¤t_cpu_data; |
@@ -915,30 +889,31 @@ __cpuinit void cpu_probe(void) | |||
915 | c->processor_id = read_c0_prid(); | 889 | c->processor_id = read_c0_prid(); |
916 | switch (c->processor_id & 0xff0000) { | 890 | switch (c->processor_id & 0xff0000) { |
917 | case PRID_COMP_LEGACY: | 891 | case PRID_COMP_LEGACY: |
918 | cpu_probe_legacy(c); | 892 | cpu_probe_legacy(c, cpu); |
919 | break; | 893 | break; |
920 | case PRID_COMP_MIPS: | 894 | case PRID_COMP_MIPS: |
921 | cpu_probe_mips(c); | 895 | cpu_probe_mips(c, cpu); |
922 | break; | 896 | break; |
923 | case PRID_COMP_ALCHEMY: | 897 | case PRID_COMP_ALCHEMY: |
924 | cpu_probe_alchemy(c); | 898 | cpu_probe_alchemy(c, cpu); |
925 | break; | 899 | break; |
926 | case PRID_COMP_SIBYTE: | 900 | case PRID_COMP_SIBYTE: |
927 | cpu_probe_sibyte(c); | 901 | cpu_probe_sibyte(c, cpu); |
928 | break; | 902 | break; |
929 | case PRID_COMP_BROADCOM: | 903 | case PRID_COMP_BROADCOM: |
930 | cpu_probe_broadcom(c); | 904 | cpu_probe_broadcom(c, cpu); |
931 | break; | 905 | break; |
932 | case PRID_COMP_SANDCRAFT: | 906 | case PRID_COMP_SANDCRAFT: |
933 | cpu_probe_sandcraft(c); | 907 | cpu_probe_sandcraft(c, cpu); |
934 | break; | 908 | break; |
935 | case PRID_COMP_NXP: | 909 | case PRID_COMP_NXP: |
936 | cpu_probe_nxp(c); | 910 | cpu_probe_nxp(c, cpu); |
937 | break; | 911 | break; |
938 | default: | ||
939 | c->cputype = CPU_UNKNOWN; | ||
940 | } | 912 | } |
941 | 913 | ||
914 | BUG_ON(!__cpu_name[cpu]); | ||
915 | BUG_ON(c->cputype == CPU_UNKNOWN); | ||
916 | |||
942 | /* | 917 | /* |
943 | * Platform code can force the cpu type to optimize code | 918 | * Platform code can force the cpu type to optimize code |
944 | * generation. In that case be sure the cpu type is correctly | 919 | * generation. In that case be sure the cpu type is correctly |
@@ -958,8 +933,6 @@ __cpuinit void cpu_probe(void) | |||
958 | } | 933 | } |
959 | } | 934 | } |
960 | 935 | ||
961 | __cpu_name[cpu] = cpu_to_name(c); | ||
962 | |||
963 | if (cpu_has_mips_r2) | 936 | if (cpu_has_mips_r2) |
964 | c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1; | 937 | c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1; |
965 | else | 938 | else |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index b79ea7055ec3..8bf88faf5afd 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -195,12 +195,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
195 | /* preload SMP state for boot cpu */ | 195 | /* preload SMP state for boot cpu */ |
196 | void __devinit smp_prepare_boot_cpu(void) | 196 | void __devinit smp_prepare_boot_cpu(void) |
197 | { | 197 | { |
198 | /* | ||
199 | * This assumes that bootup is always handled by the processor | ||
200 | * with the logic and physical number 0. | ||
201 | */ | ||
202 | __cpu_number_map[0] = 0; | ||
203 | __cpu_logical_map[0] = 0; | ||
204 | cpu_set(0, phys_cpu_present_map); | 198 | cpu_set(0, phys_cpu_present_map); |
205 | cpu_set(0, cpu_online_map); | 199 | cpu_set(0, cpu_online_map); |
206 | cpu_set(0, cpu_callin_map); | 200 | cpu_set(0, cpu_callin_map); |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 80b9e070c207..353056110f2b 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <asm/cpu.h> | 32 | #include <asm/cpu.h> |
33 | #include <asm/dsp.h> | 33 | #include <asm/dsp.h> |
34 | #include <asm/fpu.h> | 34 | #include <asm/fpu.h> |
35 | #include <asm/fpu_emulator.h> | ||
35 | #include <asm/mipsregs.h> | 36 | #include <asm/mipsregs.h> |
36 | #include <asm/mipsmtregs.h> | 37 | #include <asm/mipsmtregs.h> |
37 | #include <asm/module.h> | 38 | #include <asm/module.h> |
@@ -722,6 +723,21 @@ static void do_trap_or_bp(struct pt_regs *regs, unsigned int code, | |||
722 | die_if_kernel("Kernel bug detected", regs); | 723 | die_if_kernel("Kernel bug detected", regs); |
723 | force_sig(SIGTRAP, current); | 724 | force_sig(SIGTRAP, current); |
724 | break; | 725 | break; |
726 | case BRK_MEMU: | ||
727 | /* | ||
728 | * Address errors may be deliberately induced by the FPU | ||
729 | * emulator to retake control of the CPU after executing the | ||
730 | * instruction in the delay slot of an emulated branch. | ||
731 | * | ||
732 | * Terminate if exception was recognized as a delay slot return | ||
733 | * otherwise handle as normal. | ||
734 | */ | ||
735 | if (do_dsemulret(regs)) | ||
736 | return; | ||
737 | |||
738 | die_if_kernel("Math emu break/trap", regs); | ||
739 | force_sig(SIGTRAP, current); | ||
740 | break; | ||
725 | default: | 741 | default: |
726 | scnprintf(b, sizeof(b), "%s instruction in kernel code", str); | 742 | scnprintf(b, sizeof(b), "%s instruction in kernel code", str); |
727 | die_if_kernel(b, regs); | 743 | die_if_kernel(b, regs); |
@@ -1555,6 +1571,8 @@ void __cpuinit set_uncached_handler(unsigned long offset, void *addr, | |||
1555 | #ifdef CONFIG_64BIT | 1571 | #ifdef CONFIG_64BIT |
1556 | unsigned long uncached_ebase = TO_UNCAC(ebase); | 1572 | unsigned long uncached_ebase = TO_UNCAC(ebase); |
1557 | #endif | 1573 | #endif |
1574 | if (cpu_has_mips_r2) | ||
1575 | ebase += (read_c0_ebase() & 0x3ffff000); | ||
1558 | 1576 | ||
1559 | if (!addr) | 1577 | if (!addr) |
1560 | panic(panic_null_cerr); | 1578 | panic(panic_null_cerr); |
@@ -1588,8 +1606,11 @@ void __init trap_init(void) | |||
1588 | 1606 | ||
1589 | if (cpu_has_veic || cpu_has_vint) | 1607 | if (cpu_has_veic || cpu_has_vint) |
1590 | ebase = (unsigned long) alloc_bootmem_low_pages(0x200 + VECTORSPACING*64); | 1608 | ebase = (unsigned long) alloc_bootmem_low_pages(0x200 + VECTORSPACING*64); |
1591 | else | 1609 | else { |
1592 | ebase = CAC_BASE; | 1610 | ebase = CAC_BASE; |
1611 | if (cpu_has_mips_r2) | ||
1612 | ebase += (read_c0_ebase() & 0x3ffff000); | ||
1613 | } | ||
1593 | 1614 | ||
1594 | per_cpu_trap_init(); | 1615 | per_cpu_trap_init(); |
1595 | 1616 | ||
@@ -1697,11 +1718,11 @@ void __init trap_init(void) | |||
1697 | 1718 | ||
1698 | if (cpu_has_vce) | 1719 | if (cpu_has_vce) |
1699 | /* Special exception: R4[04]00 uses also the divec space. */ | 1720 | /* Special exception: R4[04]00 uses also the divec space. */ |
1700 | memcpy((void *)(CAC_BASE + 0x180), &except_vec3_r4000, 0x100); | 1721 | memcpy((void *)(ebase + 0x180), &except_vec3_r4000, 0x100); |
1701 | else if (cpu_has_4kex) | 1722 | else if (cpu_has_4kex) |
1702 | memcpy((void *)(CAC_BASE + 0x180), &except_vec3_generic, 0x80); | 1723 | memcpy((void *)(ebase + 0x180), &except_vec3_generic, 0x80); |
1703 | else | 1724 | else |
1704 | memcpy((void *)(CAC_BASE + 0x080), &except_vec3_generic, 0x80); | 1725 | memcpy((void *)(ebase + 0x080), &except_vec3_generic, 0x80); |
1705 | 1726 | ||
1706 | signal_init(); | 1727 | signal_init(); |
1707 | #ifdef CONFIG_MIPS32_COMPAT | 1728 | #ifdef CONFIG_MIPS32_COMPAT |
diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c index 20709669e592..bf4c4a979abb 100644 --- a/arch/mips/kernel/unaligned.c +++ b/arch/mips/kernel/unaligned.c | |||
@@ -499,22 +499,10 @@ sigill: | |||
499 | 499 | ||
500 | asmlinkage void do_ade(struct pt_regs *regs) | 500 | asmlinkage void do_ade(struct pt_regs *regs) |
501 | { | 501 | { |
502 | extern int do_dsemulret(struct pt_regs *); | ||
503 | unsigned int __user *pc; | 502 | unsigned int __user *pc; |
504 | mm_segment_t seg; | 503 | mm_segment_t seg; |
505 | 504 | ||
506 | /* | 505 | /* |
507 | * Address errors may be deliberately induced by the FPU emulator to | ||
508 | * retake control of the CPU after executing the instruction in the | ||
509 | * delay slot of an emulated branch. | ||
510 | */ | ||
511 | /* Terminate if exception was recognized as a delay slot return */ | ||
512 | if (do_dsemulret(regs)) | ||
513 | return; | ||
514 | |||
515 | /* Otherwise handle as normal */ | ||
516 | |||
517 | /* | ||
518 | * Did we catch a fault trying to load an instruction? | 506 | * Did we catch a fault trying to load an instruction? |
519 | * Or are we running in MIPS16 mode? | 507 | * Or are we running in MIPS16 mode? |
520 | */ | 508 | */ |
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c index 7ec0b217dfd3..890f77927d62 100644 --- a/arch/mips/math-emu/cp1emu.c +++ b/arch/mips/math-emu/cp1emu.c | |||
@@ -48,7 +48,6 @@ | |||
48 | #include <asm/branch.h> | 48 | #include <asm/branch.h> |
49 | 49 | ||
50 | #include "ieee754.h" | 50 | #include "ieee754.h" |
51 | #include "dsemul.h" | ||
52 | 51 | ||
53 | /* Strap kernel emulator for full MIPS IV emulation */ | 52 | /* Strap kernel emulator for full MIPS IV emulation */ |
54 | 53 | ||
@@ -346,9 +345,6 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) | |||
346 | /* cop control register rd -> gpr[rt] */ | 345 | /* cop control register rd -> gpr[rt] */ |
347 | u32 value; | 346 | u32 value; |
348 | 347 | ||
349 | if (ir == CP1UNDEF) { | ||
350 | return do_dsemulret(xcp); | ||
351 | } | ||
352 | if (MIPSInst_RD(ir) == FPCREG_CSR) { | 348 | if (MIPSInst_RD(ir) == FPCREG_CSR) { |
353 | value = ctx->fcr31; | 349 | value = ctx->fcr31; |
354 | value = (value & ~0x3) | mips_rm[value & 0x3]; | 350 | value = (value & ~0x3) | mips_rm[value & 0x3]; |
diff --git a/arch/mips/math-emu/dsemul.c b/arch/mips/math-emu/dsemul.c index 653e325849e4..df7b9d928efc 100644 --- a/arch/mips/math-emu/dsemul.c +++ b/arch/mips/math-emu/dsemul.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <asm/fpu_emulator.h> | 18 | #include <asm/fpu_emulator.h> |
19 | 19 | ||
20 | #include "ieee754.h" | 20 | #include "ieee754.h" |
21 | #include "dsemul.h" | ||
22 | 21 | ||
23 | /* Strap kernel emulator for full MIPS IV emulation */ | 22 | /* Strap kernel emulator for full MIPS IV emulation */ |
24 | 23 | ||
@@ -94,7 +93,7 @@ int mips_dsemul(struct pt_regs *regs, mips_instruction ir, unsigned long cpc) | |||
94 | return SIGBUS; | 93 | return SIGBUS; |
95 | 94 | ||
96 | err = __put_user(ir, &fr->emul); | 95 | err = __put_user(ir, &fr->emul); |
97 | err |= __put_user((mips_instruction)BADINST, &fr->badinst); | 96 | err |= __put_user((mips_instruction)BREAK_MATH, &fr->badinst); |
98 | err |= __put_user((mips_instruction)BD_COOKIE, &fr->cookie); | 97 | err |= __put_user((mips_instruction)BD_COOKIE, &fr->cookie); |
99 | err |= __put_user(cpc, &fr->epc); | 98 | err |= __put_user(cpc, &fr->epc); |
100 | 99 | ||
@@ -130,13 +129,13 @@ int do_dsemulret(struct pt_regs *xcp) | |||
130 | /* | 129 | /* |
131 | * Do some sanity checking on the stackframe: | 130 | * Do some sanity checking on the stackframe: |
132 | * | 131 | * |
133 | * - Is the instruction pointed to by the EPC an BADINST? | 132 | * - Is the instruction pointed to by the EPC an BREAK_MATH? |
134 | * - Is the following memory word the BD_COOKIE? | 133 | * - Is the following memory word the BD_COOKIE? |
135 | */ | 134 | */ |
136 | err = __get_user(insn, &fr->badinst); | 135 | err = __get_user(insn, &fr->badinst); |
137 | err |= __get_user(cookie, &fr->cookie); | 136 | err |= __get_user(cookie, &fr->cookie); |
138 | 137 | ||
139 | if (unlikely(err || (insn != BADINST) || (cookie != BD_COOKIE))) { | 138 | if (unlikely(err || (insn != BREAK_MATH) || (cookie != BD_COOKIE))) { |
140 | fpuemustats.errors++; | 139 | fpuemustats.errors++; |
141 | return 0; | 140 | return 0; |
142 | } | 141 | } |
diff --git a/arch/mips/math-emu/dsemul.h b/arch/mips/math-emu/dsemul.h deleted file mode 100644 index 091f0e76730f..000000000000 --- a/arch/mips/math-emu/dsemul.h +++ /dev/null | |||
@@ -1,17 +0,0 @@ | |||
1 | extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir, unsigned long cpc); | ||
2 | extern int do_dsemulret(struct pt_regs *xcp); | ||
3 | |||
4 | /* Instruction which will always cause an address error */ | ||
5 | #define AdELOAD 0x8c000001 /* lw $0,1($0) */ | ||
6 | /* Instruction which will plainly cause a CP1 exception when FPU is disabled */ | ||
7 | #define CP1UNDEF 0x44400001 /* cfc1 $0,$0 undef */ | ||
8 | |||
9 | /* Instruction inserted following the badinst to further tag the sequence */ | ||
10 | #define BD_COOKIE 0x0000bd36 /* tne $0,$0 with baggage */ | ||
11 | |||
12 | /* Setup which instruction to use for trampoline */ | ||
13 | #ifdef STANDALONE_EMULATOR | ||
14 | #define BADINST CP1UNDEF | ||
15 | #else | ||
16 | #define BADINST AdELOAD | ||
17 | #endif | ||
diff --git a/arch/mips/txx9/rbtx4927/setup.c b/arch/mips/txx9/rbtx4927/setup.c index 4a74423b2ba8..01129a9d50fa 100644 --- a/arch/mips/txx9/rbtx4927/setup.c +++ b/arch/mips/txx9/rbtx4927/setup.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #include <linux/platform_device.h> | 49 | #include <linux/platform_device.h> |
50 | #include <linux/delay.h> | 50 | #include <linux/delay.h> |
51 | #include <linux/gpio.h> | 51 | #include <linux/gpio.h> |
52 | #include <linux/leds.h> | ||
52 | #include <asm/io.h> | 53 | #include <asm/io.h> |
53 | #include <asm/reboot.h> | 54 | #include <asm/reboot.h> |
54 | #include <asm/txx9/generic.h> | 55 | #include <asm/txx9/generic.h> |
@@ -210,10 +211,6 @@ static void __init rbtx4927_mem_setup(void) | |||
210 | /* TX4927-SIO DTR on (PIO[15]) */ | 211 | /* TX4927-SIO DTR on (PIO[15]) */ |
211 | gpio_request(15, "sio-dtr"); | 212 | gpio_request(15, "sio-dtr"); |
212 | gpio_direction_output(15, 1); | 213 | gpio_direction_output(15, 1); |
213 | gpio_request(0, "led"); | ||
214 | gpio_direction_output(0, 1); | ||
215 | gpio_request(1, "led"); | ||
216 | gpio_direction_output(1, 1); | ||
217 | 214 | ||
218 | tx4927_sio_init(0, 0); | 215 | tx4927_sio_init(0, 0); |
219 | #ifdef CONFIG_SERIAL_TXX9_CONSOLE | 216 | #ifdef CONFIG_SERIAL_TXX9_CONSOLE |
@@ -315,6 +312,25 @@ static void __init rbtx4927_mtd_init(void) | |||
315 | tx4927_mtd_init(i); | 312 | tx4927_mtd_init(i); |
316 | } | 313 | } |
317 | 314 | ||
315 | static void __init rbtx4927_gpioled_init(void) | ||
316 | { | ||
317 | static struct gpio_led leds[] = { | ||
318 | { .name = "gpioled:green:0", .gpio = 0, .active_low = 1, }, | ||
319 | { .name = "gpioled:green:1", .gpio = 1, .active_low = 1, }, | ||
320 | }; | ||
321 | static struct gpio_led_platform_data pdata = { | ||
322 | .num_leds = ARRAY_SIZE(leds), | ||
323 | .leds = leds, | ||
324 | }; | ||
325 | struct platform_device *pdev = platform_device_alloc("leds-gpio", 0); | ||
326 | |||
327 | if (!pdev) | ||
328 | return; | ||
329 | pdev->dev.platform_data = &pdata; | ||
330 | if (platform_device_add(pdev)) | ||
331 | platform_device_put(pdev); | ||
332 | } | ||
333 | |||
318 | static void __init rbtx4927_device_init(void) | 334 | static void __init rbtx4927_device_init(void) |
319 | { | 335 | { |
320 | toshiba_rbtx4927_rtc_init(); | 336 | toshiba_rbtx4927_rtc_init(); |
@@ -322,6 +338,7 @@ static void __init rbtx4927_device_init(void) | |||
322 | tx4927_wdt_init(); | 338 | tx4927_wdt_init(); |
323 | rbtx4927_mtd_init(); | 339 | rbtx4927_mtd_init(); |
324 | txx9_iocled_init(RBTX4927_LED_ADDR - IO_BASE, -1, 3, 1, "green", NULL); | 340 | txx9_iocled_init(RBTX4927_LED_ADDR - IO_BASE, -1, 3, 1, "green", NULL); |
341 | rbtx4927_gpioled_init(); | ||
325 | } | 342 | } |
326 | 343 | ||
327 | struct txx9_board_vec rbtx4927_vec __initdata = { | 344 | struct txx9_board_vec rbtx4927_vec __initdata = { |
diff --git a/arch/mips/txx9/rbtx4939/setup.c b/arch/mips/txx9/rbtx4939/setup.c index 6daee9b1cd5e..98fbd9391bf8 100644 --- a/arch/mips/txx9/rbtx4939/setup.c +++ b/arch/mips/txx9/rbtx4939/setup.c | |||
@@ -308,16 +308,22 @@ static void __init rbtx4939_device_init(void) | |||
308 | #if defined(CONFIG_TC35815) || defined(CONFIG_TC35815_MODULE) | 308 | #if defined(CONFIG_TC35815) || defined(CONFIG_TC35815_MODULE) |
309 | int i, j; | 309 | int i, j; |
310 | unsigned char ethaddr[2][6]; | 310 | unsigned char ethaddr[2][6]; |
311 | u8 bdipsw = readb(rbtx4939_bdipsw_addr) & 0x0f; | ||
312 | |||
311 | for (i = 0; i < 2; i++) { | 313 | for (i = 0; i < 2; i++) { |
312 | unsigned long area = CKSEG1 + 0x1fff0000 + (i * 0x10); | 314 | unsigned long area = CKSEG1 + 0x1fff0000 + (i * 0x10); |
313 | if (readb(rbtx4939_bdipsw_addr) & 8) { | 315 | if (bdipsw == 0) |
316 | memcpy(ethaddr[i], (void *)area, 6); | ||
317 | else { | ||
314 | u16 buf[3]; | 318 | u16 buf[3]; |
315 | area -= 0x03000000; | 319 | if (bdipsw & 8) |
320 | area -= 0x03000000; | ||
321 | else | ||
322 | area -= 0x01000000; | ||
316 | for (j = 0; j < 3; j++) | 323 | for (j = 0; j < 3; j++) |
317 | buf[j] = le16_to_cpup((u16 *)(area + j * 2)); | 324 | buf[j] = le16_to_cpup((u16 *)(area + j * 2)); |
318 | memcpy(ethaddr[i], buf, 6); | 325 | memcpy(ethaddr[i], buf, 6); |
319 | } else | 326 | } |
320 | memcpy(ethaddr[i], (void *)area, 6); | ||
321 | } | 327 | } |
322 | tx4939_ethaddr_init(ethaddr[0], ethaddr[1]); | 328 | tx4939_ethaddr_init(ethaddr[0], ethaddr[1]); |
323 | #endif | 329 | #endif |
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index 0b7c4a3f0651..b815664fe370 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu | |||
@@ -513,19 +513,19 @@ config CPU_SUP_UMC_32 | |||
513 | If unsure, say N. | 513 | If unsure, say N. |
514 | 514 | ||
515 | config X86_DS | 515 | config X86_DS |
516 | bool "Debug Store support" | 516 | def_bool X86_PTRACE_BTS |
517 | default y | 517 | depends on X86_DEBUGCTLMSR |
518 | help | ||
519 | Add support for Debug Store. | ||
520 | This allows the kernel to provide a memory buffer to the hardware | ||
521 | to store various profiling and tracing events. | ||
522 | 518 | ||
523 | config X86_PTRACE_BTS | 519 | config X86_PTRACE_BTS |
524 | bool "ptrace interface to Branch Trace Store" | 520 | bool "Branch Trace Store" |
525 | default y | 521 | default y |
526 | depends on (X86_DS && X86_DEBUGCTLMSR) | 522 | depends on X86_DEBUGCTLMSR |
527 | help | 523 | help |
528 | Add a ptrace interface to allow collecting an execution trace | 524 | This adds a ptrace interface to the hardware's branch trace store. |
529 | of the traced task. | 525 | |
530 | This collects control flow changes in a (cyclic) buffer and allows | 526 | Debuggers may use it to collect an execution trace of the debugged |
531 | debuggers to fill in the gaps and show an execution trace of the debuggee. | 527 | application in order to answer the question 'how did I get here?'. |
528 | Debuggers may trace user mode as well as kernel mode. | ||
529 | |||
530 | Say Y unless there is no application development on this machine | ||
531 | and you want to save a small amount of code size. | ||
diff --git a/arch/x86/boot/compressed/.gitignore b/arch/x86/boot/compressed/.gitignore index be0ed065249b..63eff3b04d01 100644 --- a/arch/x86/boot/compressed/.gitignore +++ b/arch/x86/boot/compressed/.gitignore | |||
@@ -1 +1,3 @@ | |||
1 | relocs | 1 | relocs |
2 | vmlinux.bin.all | ||
3 | vmlinux.relocs | ||
diff --git a/arch/x86/include/asm/es7000/wakecpu.h b/arch/x86/include/asm/es7000/wakecpu.h index 3ffc5a7bf667..398493461913 100644 --- a/arch/x86/include/asm/es7000/wakecpu.h +++ b/arch/x86/include/asm/es7000/wakecpu.h | |||
@@ -50,10 +50,9 @@ static inline void restore_NMI_vector(unsigned short *high, unsigned short *low) | |||
50 | { | 50 | { |
51 | } | 51 | } |
52 | 52 | ||
53 | #if APIC_DEBUG | 53 | #define inquire_remote_apic(apicid) do { \ |
54 | #define inquire_remote_apic(apicid) __inquire_remote_apic(apicid) | 54 | if (apic_verbosity >= APIC_DEBUG) \ |
55 | #else | 55 | __inquire_remote_apic(apicid); \ |
56 | #define inquire_remote_apic(apicid) {} | 56 | } while (0) |
57 | #endif | ||
58 | 57 | ||
59 | #endif /* __ASM_MACH_WAKECPU_H */ | 58 | #endif /* __ASM_MACH_WAKECPU_H */ |
diff --git a/arch/x86/include/asm/iommu.h b/arch/x86/include/asm/iommu.h index 98e28ea8cd16..e4a552d44465 100644 --- a/arch/x86/include/asm/iommu.h +++ b/arch/x86/include/asm/iommu.h | |||
@@ -7,7 +7,6 @@ extern struct dma_mapping_ops nommu_dma_ops; | |||
7 | extern int force_iommu, no_iommu; | 7 | extern int force_iommu, no_iommu; |
8 | extern int iommu_detected; | 8 | extern int iommu_detected; |
9 | extern int dmar_disabled; | 9 | extern int dmar_disabled; |
10 | extern int forbid_dac; | ||
11 | 10 | ||
12 | extern unsigned long iommu_nr_pages(unsigned long addr, unsigned long len); | 11 | extern unsigned long iommu_nr_pages(unsigned long addr, unsigned long len); |
13 | 12 | ||
diff --git a/arch/x86/include/asm/mach-default/mach_wakecpu.h b/arch/x86/include/asm/mach-default/mach_wakecpu.h index d5c0b826a4ff..9d80db91e992 100644 --- a/arch/x86/include/asm/mach-default/mach_wakecpu.h +++ b/arch/x86/include/asm/mach-default/mach_wakecpu.h | |||
@@ -33,10 +33,9 @@ static inline void restore_NMI_vector(unsigned short *high, unsigned short *low) | |||
33 | { | 33 | { |
34 | } | 34 | } |
35 | 35 | ||
36 | #if APIC_DEBUG | 36 | #define inquire_remote_apic(apicid) do { \ |
37 | #define inquire_remote_apic(apicid) __inquire_remote_apic(apicid) | 37 | if (apic_verbosity >= APIC_DEBUG) \ |
38 | #else | 38 | __inquire_remote_apic(apicid); \ |
39 | #define inquire_remote_apic(apicid) {} | 39 | } while (0) |
40 | #endif | ||
41 | 40 | ||
42 | #endif /* _ASM_X86_MACH_DEFAULT_MACH_WAKECPU_H */ | 41 | #endif /* _ASM_X86_MACH_DEFAULT_MACH_WAKECPU_H */ |
diff --git a/arch/x86/kernel/k8.c b/arch/x86/kernel/k8.c index 304d8bad6559..cbc4332a77b2 100644 --- a/arch/x86/kernel/k8.c +++ b/arch/x86/kernel/k8.c | |||
@@ -18,7 +18,6 @@ static u32 *flush_words; | |||
18 | struct pci_device_id k8_nb_ids[] = { | 18 | struct pci_device_id k8_nb_ids[] = { |
19 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB_MISC) }, | 19 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB_MISC) }, |
20 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) }, | 20 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) }, |
21 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_11H_NB_MISC) }, | ||
22 | {} | 21 | {} |
23 | }; | 22 | }; |
24 | EXPORT_SYMBOL(k8_nb_ids); | 23 | EXPORT_SYMBOL(k8_nb_ids); |
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c index 0732adba05ca..7a385746509a 100644 --- a/arch/x86/kernel/machine_kexec_32.c +++ b/arch/x86/kernel/machine_kexec_32.c | |||
@@ -162,7 +162,10 @@ void machine_kexec(struct kimage *image) | |||
162 | page_list[VA_PTE_0] = (unsigned long)kexec_pte0; | 162 | page_list[VA_PTE_0] = (unsigned long)kexec_pte0; |
163 | page_list[PA_PTE_1] = __pa(kexec_pte1); | 163 | page_list[PA_PTE_1] = __pa(kexec_pte1); |
164 | page_list[VA_PTE_1] = (unsigned long)kexec_pte1; | 164 | page_list[VA_PTE_1] = (unsigned long)kexec_pte1; |
165 | page_list[PA_SWAP_PAGE] = (page_to_pfn(image->swap_page) << PAGE_SHIFT); | 165 | |
166 | if (image->type == KEXEC_TYPE_DEFAULT) | ||
167 | page_list[PA_SWAP_PAGE] = (page_to_pfn(image->swap_page) | ||
168 | << PAGE_SHIFT); | ||
166 | 169 | ||
167 | /* The segment registers are funny things, they have both a | 170 | /* The segment registers are funny things, they have both a |
168 | * visible and an invisible part. Whenever the visible part is | 171 | * visible and an invisible part. Whenever the visible part is |
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index 7a1f8eeac2c7..5f8e5d75a254 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <asm/microcode.h> | 39 | #include <asm/microcode.h> |
40 | 40 | ||
41 | MODULE_DESCRIPTION("AMD Microcode Update Driver"); | 41 | MODULE_DESCRIPTION("AMD Microcode Update Driver"); |
42 | MODULE_AUTHOR("Peter Oruba <peter.oruba@amd.com>"); | 42 | MODULE_AUTHOR("Peter Oruba"); |
43 | MODULE_LICENSE("GPL v2"); | 43 | MODULE_LICENSE("GPL v2"); |
44 | 44 | ||
45 | #define UCODE_MAGIC 0x00414d44 | 45 | #define UCODE_MAGIC 0x00414d44 |
diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/microcode_core.c index 936d8d55f230..82fb2809ce32 100644 --- a/arch/x86/kernel/microcode_core.c +++ b/arch/x86/kernel/microcode_core.c | |||
@@ -480,8 +480,8 @@ static int __init microcode_init(void) | |||
480 | 480 | ||
481 | printk(KERN_INFO | 481 | printk(KERN_INFO |
482 | "Microcode Update Driver: v" MICROCODE_VERSION | 482 | "Microcode Update Driver: v" MICROCODE_VERSION |
483 | " <tigran@aivazian.fsnet.co.uk>" | 483 | " <tigran@aivazian.fsnet.co.uk>," |
484 | " <peter.oruba@amd.com>\n"); | 484 | " Peter Oruba\n"); |
485 | 485 | ||
486 | return 0; | 486 | return 0; |
487 | } | 487 | } |
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 1972266e8ba5..192624820217 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -9,6 +9,8 @@ | |||
9 | #include <asm/calgary.h> | 9 | #include <asm/calgary.h> |
10 | #include <asm/amd_iommu.h> | 10 | #include <asm/amd_iommu.h> |
11 | 11 | ||
12 | static int forbid_dac __read_mostly; | ||
13 | |||
12 | struct dma_mapping_ops *dma_ops; | 14 | struct dma_mapping_ops *dma_ops; |
13 | EXPORT_SYMBOL(dma_ops); | 15 | EXPORT_SYMBOL(dma_ops); |
14 | 16 | ||
@@ -291,3 +293,17 @@ void pci_iommu_shutdown(void) | |||
291 | } | 293 | } |
292 | /* Must execute after PCI subsystem */ | 294 | /* Must execute after PCI subsystem */ |
293 | fs_initcall(pci_iommu_init); | 295 | fs_initcall(pci_iommu_init); |
296 | |||
297 | #ifdef CONFIG_PCI | ||
298 | /* Many VIA bridges seem to corrupt data for DAC. Disable it here */ | ||
299 | |||
300 | static __devinit void via_no_dac(struct pci_dev *dev) | ||
301 | { | ||
302 | if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI && forbid_dac == 0) { | ||
303 | printk(KERN_INFO "PCI: VIA PCI bridge detected." | ||
304 | "Disabling DAC.\n"); | ||
305 | forbid_dac = 1; | ||
306 | } | ||
307 | } | ||
308 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac); | ||
309 | #endif | ||
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index e3f75bbcedea..a42b02b4df68 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c | |||
@@ -744,7 +744,7 @@ void __init gart_iommu_init(void) | |||
744 | long i; | 744 | long i; |
745 | 745 | ||
746 | if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0) { | 746 | if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0) { |
747 | printk(KERN_INFO "PCI-GART: No AMD northbridge found.\n"); | 747 | printk(KERN_INFO "PCI-GART: No AMD GART found.\n"); |
748 | return; | 748 | return; |
749 | } | 749 | } |
750 | 750 | ||
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index f79a02f64d10..ad38648bddbd 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -884,6 +884,7 @@ static struct kcore_list kcore_mem, kcore_vmalloc, kcore_kernel, | |||
884 | void __init mem_init(void) | 884 | void __init mem_init(void) |
885 | { | 885 | { |
886 | long codesize, reservedpages, datasize, initsize; | 886 | long codesize, reservedpages, datasize, initsize; |
887 | unsigned long absent_pages; | ||
887 | 888 | ||
888 | start_periodic_check_for_corruption(); | 889 | start_periodic_check_for_corruption(); |
889 | 890 | ||
@@ -899,8 +900,9 @@ void __init mem_init(void) | |||
899 | #else | 900 | #else |
900 | totalram_pages = free_all_bootmem(); | 901 | totalram_pages = free_all_bootmem(); |
901 | #endif | 902 | #endif |
902 | reservedpages = max_pfn - totalram_pages - | 903 | |
903 | absent_pages_in_range(0, max_pfn); | 904 | absent_pages = absent_pages_in_range(0, max_pfn); |
905 | reservedpages = max_pfn - totalram_pages - absent_pages; | ||
904 | after_bootmem = 1; | 906 | after_bootmem = 1; |
905 | 907 | ||
906 | codesize = (unsigned long) &_etext - (unsigned long) &_text; | 908 | codesize = (unsigned long) &_etext - (unsigned long) &_text; |
@@ -917,10 +919,11 @@ void __init mem_init(void) | |||
917 | VSYSCALL_END - VSYSCALL_START); | 919 | VSYSCALL_END - VSYSCALL_START); |
918 | 920 | ||
919 | printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, " | 921 | printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, " |
920 | "%ldk reserved, %ldk data, %ldk init)\n", | 922 | "%ldk absent, %ldk reserved, %ldk data, %ldk init)\n", |
921 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), | 923 | (unsigned long) nr_free_pages() << (PAGE_SHIFT-10), |
922 | max_pfn << (PAGE_SHIFT-10), | 924 | max_pfn << (PAGE_SHIFT-10), |
923 | codesize >> 10, | 925 | codesize >> 10, |
926 | absent_pages << (PAGE_SHIFT-10), | ||
924 | reservedpages << (PAGE_SHIFT-10), | 927 | reservedpages << (PAGE_SHIFT-10), |
925 | datasize >> 10, | 928 | datasize >> 10, |
926 | initsize >> 10); | 929 | initsize >> 10); |
diff --git a/drivers/Kconfig b/drivers/Kconfig index d38f43f593d4..2f557f570ade 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig | |||
@@ -68,6 +68,8 @@ source "drivers/ssb/Kconfig" | |||
68 | 68 | ||
69 | source "drivers/mfd/Kconfig" | 69 | source "drivers/mfd/Kconfig" |
70 | 70 | ||
71 | source "drivers/regulator/Kconfig" | ||
72 | |||
71 | source "drivers/media/Kconfig" | 73 | source "drivers/media/Kconfig" |
72 | 74 | ||
73 | source "drivers/video/Kconfig" | 75 | source "drivers/video/Kconfig" |
diff --git a/drivers/base/sys.c b/drivers/base/sys.c index 75dd6e22faff..c98c31ec2f75 100644 --- a/drivers/base/sys.c +++ b/drivers/base/sys.c | |||
@@ -355,7 +355,7 @@ static void __sysdev_resume(struct sys_device *dev) | |||
355 | * sysdev_suspend - Suspend all system devices. | 355 | * sysdev_suspend - Suspend all system devices. |
356 | * @state: Power state to enter. | 356 | * @state: Power state to enter. |
357 | * | 357 | * |
358 | * We perform an almost identical operation as sys_device_shutdown() | 358 | * We perform an almost identical operation as sysdev_shutdown() |
359 | * above, though calling ->suspend() instead. Interrupts are disabled | 359 | * above, though calling ->suspend() instead. Interrupts are disabled |
360 | * when this called. Devices are responsible for both saving state and | 360 | * when this called. Devices are responsible for both saving state and |
361 | * quiescing or powering down the device. | 361 | * quiescing or powering down the device. |
@@ -437,7 +437,7 @@ aux_driver: | |||
437 | /** | 437 | /** |
438 | * sysdev_resume - Bring system devices back to life. | 438 | * sysdev_resume - Bring system devices back to life. |
439 | * | 439 | * |
440 | * Similar to sys_device_suspend(), but we iterate the list forwards | 440 | * Similar to sysdev_suspend(), but we iterate the list forwards |
441 | * to guarantee that parent devices are resumed before their children. | 441 | * to guarantee that parent devices are resumed before their children. |
442 | * | 442 | * |
443 | * Note: Interrupts are disabled when called. | 443 | * Note: Interrupts are disabled when called. |
@@ -488,7 +488,8 @@ ssize_t sysdev_store_ulong(struct sys_device *sysdev, | |||
488 | if (end == buf) | 488 | if (end == buf) |
489 | return -EINVAL; | 489 | return -EINVAL; |
490 | *(unsigned long *)(ea->var) = new; | 490 | *(unsigned long *)(ea->var) = new; |
491 | return end - buf; | 491 | /* Always return full write size even if we didn't consume all */ |
492 | return size; | ||
492 | } | 493 | } |
493 | EXPORT_SYMBOL_GPL(sysdev_store_ulong); | 494 | EXPORT_SYMBOL_GPL(sysdev_store_ulong); |
494 | 495 | ||
@@ -511,7 +512,8 @@ ssize_t sysdev_store_int(struct sys_device *sysdev, | |||
511 | if (end == buf || new > INT_MAX || new < INT_MIN) | 512 | if (end == buf || new > INT_MAX || new < INT_MIN) |
512 | return -EINVAL; | 513 | return -EINVAL; |
513 | *(int *)(ea->var) = new; | 514 | *(int *)(ea->var) = new; |
514 | return end - buf; | 515 | /* Always return full write size even if we didn't consume all */ |
516 | return size; | ||
515 | } | 517 | } |
516 | EXPORT_SYMBOL_GPL(sysdev_store_int); | 518 | EXPORT_SYMBOL_GPL(sysdev_store_int); |
517 | 519 | ||
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 3f09cd8bcc38..5c4ee70d5cf3 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -40,8 +40,7 @@ | |||
40 | * Heinz Mauelshagen <mge@sistina.com>, Feb 2002 | 40 | * Heinz Mauelshagen <mge@sistina.com>, Feb 2002 |
41 | * | 41 | * |
42 | * Support for falling back on the write file operation when the address space | 42 | * Support for falling back on the write file operation when the address space |
43 | * operations prepare_write and/or commit_write are not available on the | 43 | * operations write_begin is not available on the backing filesystem. |
44 | * backing filesystem. | ||
45 | * Anton Altaparmakov, 16 Feb 2005 | 44 | * Anton Altaparmakov, 16 Feb 2005 |
46 | * | 45 | * |
47 | * Still To Fix: | 46 | * Still To Fix: |
@@ -765,7 +764,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, | |||
765 | */ | 764 | */ |
766 | if (!file->f_op->splice_read) | 765 | if (!file->f_op->splice_read) |
767 | goto out_putf; | 766 | goto out_putf; |
768 | if (aops->prepare_write || aops->write_begin) | 767 | if (aops->write_begin) |
769 | lo_flags |= LO_FLAGS_USE_AOPS; | 768 | lo_flags |= LO_FLAGS_USE_AOPS; |
770 | if (!(lo_flags & LO_FLAGS_USE_AOPS) && !file->f_op->write) | 769 | if (!(lo_flags & LO_FLAGS_USE_AOPS) && !file->f_op->write) |
771 | lo_flags |= LO_FLAGS_READ_ONLY; | 770 | lo_flags |= LO_FLAGS_READ_ONLY; |
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index e6ee21d99d92..b0e569ba730d 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c | |||
@@ -867,7 +867,7 @@ static int bluecard_probe(struct pcmcia_device *link) | |||
867 | 867 | ||
868 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 868 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
869 | link->io.NumPorts1 = 8; | 869 | link->io.NumPorts1 = 8; |
870 | link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; | 870 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT; |
871 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | 871 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; |
872 | 872 | ||
873 | link->irq.Handler = bluecard_interrupt; | 873 | link->irq.Handler = bluecard_interrupt; |
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index 2cbe70b66470..b3e4d07a4ac2 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c | |||
@@ -343,6 +343,7 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst) | |||
343 | bt3c_info_t *info = dev_inst; | 343 | bt3c_info_t *info = dev_inst; |
344 | unsigned int iobase; | 344 | unsigned int iobase; |
345 | int iir; | 345 | int iir; |
346 | irqreturn_t r = IRQ_NONE; | ||
346 | 347 | ||
347 | BUG_ON(!info->hdev); | 348 | BUG_ON(!info->hdev); |
348 | 349 | ||
@@ -374,11 +375,12 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst) | |||
374 | 375 | ||
375 | outb(iir, iobase + CONTROL); | 376 | outb(iir, iobase + CONTROL); |
376 | } | 377 | } |
378 | r = IRQ_HANDLED; | ||
377 | } | 379 | } |
378 | 380 | ||
379 | spin_unlock(&(info->lock)); | 381 | spin_unlock(&(info->lock)); |
380 | 382 | ||
381 | return IRQ_HANDLED; | 383 | return r; |
382 | } | 384 | } |
383 | 385 | ||
384 | 386 | ||
@@ -657,7 +659,7 @@ static int bt3c_probe(struct pcmcia_device *link) | |||
657 | 659 | ||
658 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 660 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
659 | link->io.NumPorts1 = 8; | 661 | link->io.NumPorts1 = 8; |
660 | link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; | 662 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT; |
661 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | 663 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; |
662 | 664 | ||
663 | link->irq.Handler = bt3c_interrupt; | 665 | link->irq.Handler = bt3c_interrupt; |
diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c index 8e556b7ff9f6..efd689a062eb 100644 --- a/drivers/bluetooth/btuart_cs.c +++ b/drivers/bluetooth/btuart_cs.c | |||
@@ -293,6 +293,7 @@ static irqreturn_t btuart_interrupt(int irq, void *dev_inst) | |||
293 | unsigned int iobase; | 293 | unsigned int iobase; |
294 | int boguscount = 0; | 294 | int boguscount = 0; |
295 | int iir, lsr; | 295 | int iir, lsr; |
296 | irqreturn_t r = IRQ_NONE; | ||
296 | 297 | ||
297 | BUG_ON(!info->hdev); | 298 | BUG_ON(!info->hdev); |
298 | 299 | ||
@@ -302,6 +303,7 @@ static irqreturn_t btuart_interrupt(int irq, void *dev_inst) | |||
302 | 303 | ||
303 | iir = inb(iobase + UART_IIR) & UART_IIR_ID; | 304 | iir = inb(iobase + UART_IIR) & UART_IIR_ID; |
304 | while (iir) { | 305 | while (iir) { |
306 | r = IRQ_HANDLED; | ||
305 | 307 | ||
306 | /* Clear interrupt */ | 308 | /* Clear interrupt */ |
307 | lsr = inb(iobase + UART_LSR); | 309 | lsr = inb(iobase + UART_LSR); |
@@ -335,7 +337,7 @@ static irqreturn_t btuart_interrupt(int irq, void *dev_inst) | |||
335 | 337 | ||
336 | spin_unlock(&(info->lock)); | 338 | spin_unlock(&(info->lock)); |
337 | 339 | ||
338 | return IRQ_HANDLED; | 340 | return r; |
339 | } | 341 | } |
340 | 342 | ||
341 | 343 | ||
@@ -586,7 +588,7 @@ static int btuart_probe(struct pcmcia_device *link) | |||
586 | 588 | ||
587 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 589 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
588 | link->io.NumPorts1 = 8; | 590 | link->io.NumPorts1 = 8; |
589 | link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; | 591 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT; |
590 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | 592 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; |
591 | 593 | ||
592 | link->irq.Handler = btuart_interrupt; | 594 | link->irq.Handler = btuart_interrupt; |
diff --git a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c index e6e6b037695a..901bdd95655f 100644 --- a/drivers/bluetooth/dtl1_cs.c +++ b/drivers/bluetooth/dtl1_cs.c | |||
@@ -297,6 +297,7 @@ static irqreturn_t dtl1_interrupt(int irq, void *dev_inst) | |||
297 | unsigned char msr; | 297 | unsigned char msr; |
298 | int boguscount = 0; | 298 | int boguscount = 0; |
299 | int iir, lsr; | 299 | int iir, lsr; |
300 | irqreturn_t r = IRQ_NONE; | ||
300 | 301 | ||
301 | BUG_ON(!info->hdev); | 302 | BUG_ON(!info->hdev); |
302 | 303 | ||
@@ -307,6 +308,7 @@ static irqreturn_t dtl1_interrupt(int irq, void *dev_inst) | |||
307 | iir = inb(iobase + UART_IIR) & UART_IIR_ID; | 308 | iir = inb(iobase + UART_IIR) & UART_IIR_ID; |
308 | while (iir) { | 309 | while (iir) { |
309 | 310 | ||
311 | r = IRQ_HANDLED; | ||
310 | /* Clear interrupt */ | 312 | /* Clear interrupt */ |
311 | lsr = inb(iobase + UART_LSR); | 313 | lsr = inb(iobase + UART_LSR); |
312 | 314 | ||
@@ -343,11 +345,12 @@ static irqreturn_t dtl1_interrupt(int irq, void *dev_inst) | |||
343 | info->ri_latch = msr & UART_MSR_RI; | 345 | info->ri_latch = msr & UART_MSR_RI; |
344 | clear_bit(XMIT_WAITING, &(info->tx_state)); | 346 | clear_bit(XMIT_WAITING, &(info->tx_state)); |
345 | dtl1_write_wakeup(info); | 347 | dtl1_write_wakeup(info); |
348 | r = IRQ_HANDLED; | ||
346 | } | 349 | } |
347 | 350 | ||
348 | spin_unlock(&(info->lock)); | 351 | spin_unlock(&(info->lock)); |
349 | 352 | ||
350 | return IRQ_HANDLED; | 353 | return r; |
351 | } | 354 | } |
352 | 355 | ||
353 | 356 | ||
@@ -568,7 +571,7 @@ static int dtl1_probe(struct pcmcia_device *link) | |||
568 | 571 | ||
569 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 572 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
570 | link->io.NumPorts1 = 8; | 573 | link->io.NumPorts1 = 8; |
571 | link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; | 574 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT; |
572 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | 575 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; |
573 | 576 | ||
574 | link->irq.Handler = dtl1_interrupt; | 577 | link->irq.Handler = dtl1_interrupt; |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 122254155ae1..43b35d0369d6 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -812,28 +812,6 @@ config JS_RTC | |||
812 | To compile this driver as a module, choose M here: the | 812 | To compile this driver as a module, choose M here: the |
813 | module will be called js-rtc. | 813 | module will be called js-rtc. |
814 | 814 | ||
815 | config SGI_DS1286 | ||
816 | tristate "SGI DS1286 RTC support" | ||
817 | depends on SGI_HAS_DS1286 | ||
818 | help | ||
819 | If you say Y here and create a character special file /dev/rtc with | ||
820 | major number 10 and minor number 135 using mknod ("man mknod"), you | ||
821 | will get access to the real time clock built into your computer. | ||
822 | Every SGI has such a clock built in. It reports status information | ||
823 | via the file /proc/rtc and its behaviour is set by various ioctls on | ||
824 | /dev/rtc. | ||
825 | |||
826 | config SGI_IP27_RTC | ||
827 | bool "SGI M48T35 RTC support" | ||
828 | depends on SGI_IP27 | ||
829 | help | ||
830 | If you say Y here and create a character special file /dev/rtc with | ||
831 | major number 10 and minor number 135 using mknod ("man mknod"), you | ||
832 | will get access to the real time clock built into your computer. | ||
833 | Every SGI has such a clock built in. It reports status information | ||
834 | via the file /proc/rtc and its behaviour is set by various ioctls on | ||
835 | /dev/rtc. | ||
836 | |||
837 | config GEN_RTC | 815 | config GEN_RTC |
838 | tristate "Generic /dev/rtc emulation" | 816 | tristate "Generic /dev/rtc emulation" |
839 | depends on RTC!=y && !IA64 && !ARM && !M32R && !MIPS && !SPARC && !FRV && !S390 && !SUPERH && !AVR32 | 817 | depends on RTC!=y && !IA64 && !ARM && !M32R && !MIPS && !SPARC && !FRV && !S390 && !SUPERH && !AVR32 |
diff --git a/drivers/char/Makefile b/drivers/char/Makefile index 1a4247dccac4..438f71317c5c 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile | |||
@@ -74,8 +74,6 @@ obj-$(CONFIG_RTC) += rtc.o | |||
74 | obj-$(CONFIG_HPET) += hpet.o | 74 | obj-$(CONFIG_HPET) += hpet.o |
75 | obj-$(CONFIG_GEN_RTC) += genrtc.o | 75 | obj-$(CONFIG_GEN_RTC) += genrtc.o |
76 | obj-$(CONFIG_EFI_RTC) += efirtc.o | 76 | obj-$(CONFIG_EFI_RTC) += efirtc.o |
77 | obj-$(CONFIG_SGI_DS1286) += ds1286.o | ||
78 | obj-$(CONFIG_SGI_IP27_RTC) += ip27-rtc.o | ||
79 | obj-$(CONFIG_DS1302) += ds1302.o | 77 | obj-$(CONFIG_DS1302) += ds1302.o |
80 | obj-$(CONFIG_XILINX_HWICAP) += xilinx_hwicap/ | 78 | obj-$(CONFIG_XILINX_HWICAP) += xilinx_hwicap/ |
81 | ifeq ($(CONFIG_GENERIC_NVRAM),y) | 79 | ifeq ($(CONFIG_GENERIC_NVRAM),y) |
diff --git a/drivers/char/ds1286.c b/drivers/char/ds1286.c deleted file mode 100644 index 0a826d7be10e..000000000000 --- a/drivers/char/ds1286.c +++ /dev/null | |||
@@ -1,585 +0,0 @@ | |||
1 | /* | ||
2 | * DS1286 Real Time Clock interface for Linux | ||
3 | * | ||
4 | * Copyright (C) 1998, 1999, 2000 Ralf Baechle | ||
5 | * | ||
6 | * Based on code written by Paul Gortmaker. | ||
7 | * | ||
8 | * This driver allows use of the real time clock (built into nearly all | ||
9 | * computers) from user space. It exports the /dev/rtc interface supporting | ||
10 | * various ioctl() and also the /proc/rtc pseudo-file for status | ||
11 | * information. | ||
12 | * | ||
13 | * The ioctls can be used to set the interrupt behaviour and generation rate | ||
14 | * from the RTC via IRQ 8. Then the /dev/rtc interface can be used to make | ||
15 | * use of these timer interrupts, be they interval or alarm based. | ||
16 | * | ||
17 | * The /dev/rtc interface will block on reads until an interrupt has been | ||
18 | * received. If a RTC interrupt has already happened, it will output an | ||
19 | * unsigned long and then block. The output value contains the interrupt | ||
20 | * status in the low byte and the number of interrupts since the last read | ||
21 | * in the remaining high bytes. The /dev/rtc interface can also be used with | ||
22 | * the select(2) call. | ||
23 | * | ||
24 | * This program is free software; you can redistribute it and/or modify it | ||
25 | * under the terms of the GNU General Public License as published by the | ||
26 | * Free Software Foundation; either version 2 of the License, or (at your | ||
27 | * option) any later version. | ||
28 | */ | ||
29 | #include <linux/ds1286.h> | ||
30 | #include <linux/smp_lock.h> | ||
31 | #include <linux/types.h> | ||
32 | #include <linux/errno.h> | ||
33 | #include <linux/miscdevice.h> | ||
34 | #include <linux/slab.h> | ||
35 | #include <linux/ioport.h> | ||
36 | #include <linux/fcntl.h> | ||
37 | #include <linux/init.h> | ||
38 | #include <linux/poll.h> | ||
39 | #include <linux/rtc.h> | ||
40 | #include <linux/spinlock.h> | ||
41 | #include <linux/bcd.h> | ||
42 | #include <linux/proc_fs.h> | ||
43 | #include <linux/jiffies.h> | ||
44 | |||
45 | #include <asm/uaccess.h> | ||
46 | #include <asm/system.h> | ||
47 | |||
48 | #define DS1286_VERSION "1.0" | ||
49 | |||
50 | /* | ||
51 | * We sponge a minor off of the misc major. No need slurping | ||
52 | * up another valuable major dev number for this. If you add | ||
53 | * an ioctl, make sure you don't conflict with SPARC's RTC | ||
54 | * ioctls. | ||
55 | */ | ||
56 | |||
57 | static DECLARE_WAIT_QUEUE_HEAD(ds1286_wait); | ||
58 | |||
59 | static ssize_t ds1286_read(struct file *file, char *buf, | ||
60 | size_t count, loff_t *ppos); | ||
61 | |||
62 | static int ds1286_ioctl(struct inode *inode, struct file *file, | ||
63 | unsigned int cmd, unsigned long arg); | ||
64 | |||
65 | static unsigned int ds1286_poll(struct file *file, poll_table *wait); | ||
66 | |||
67 | static void ds1286_get_alm_time (struct rtc_time *alm_tm); | ||
68 | static void ds1286_get_time(struct rtc_time *rtc_tm); | ||
69 | static int ds1286_set_time(struct rtc_time *rtc_tm); | ||
70 | |||
71 | static inline unsigned char ds1286_is_updating(void); | ||
72 | |||
73 | static DEFINE_SPINLOCK(ds1286_lock); | ||
74 | |||
75 | static int ds1286_read_proc(char *page, char **start, off_t off, | ||
76 | int count, int *eof, void *data); | ||
77 | |||
78 | /* | ||
79 | * Bits in rtc_status. (7 bits of room for future expansion) | ||
80 | */ | ||
81 | |||
82 | #define RTC_IS_OPEN 0x01 /* means /dev/rtc is in use */ | ||
83 | #define RTC_TIMER_ON 0x02 /* missed irq timer active */ | ||
84 | |||
85 | static unsigned char ds1286_status; /* bitmapped status byte. */ | ||
86 | |||
87 | static unsigned char days_in_mo[] = { | ||
88 | 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 | ||
89 | }; | ||
90 | |||
91 | /* | ||
92 | * Now all the various file operations that we export. | ||
93 | */ | ||
94 | |||
95 | static ssize_t ds1286_read(struct file *file, char *buf, | ||
96 | size_t count, loff_t *ppos) | ||
97 | { | ||
98 | return -EIO; | ||
99 | } | ||
100 | |||
101 | static int ds1286_ioctl(struct inode *inode, struct file *file, | ||
102 | unsigned int cmd, unsigned long arg) | ||
103 | { | ||
104 | struct rtc_time wtime; | ||
105 | |||
106 | switch (cmd) { | ||
107 | case RTC_AIE_OFF: /* Mask alarm int. enab. bit */ | ||
108 | { | ||
109 | unsigned long flags; | ||
110 | unsigned char val; | ||
111 | |||
112 | if (!capable(CAP_SYS_TIME)) | ||
113 | return -EACCES; | ||
114 | |||
115 | spin_lock_irqsave(&ds1286_lock, flags); | ||
116 | val = rtc_read(RTC_CMD); | ||
117 | val |= RTC_TDM; | ||
118 | rtc_write(val, RTC_CMD); | ||
119 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
120 | |||
121 | return 0; | ||
122 | } | ||
123 | case RTC_AIE_ON: /* Allow alarm interrupts. */ | ||
124 | { | ||
125 | unsigned long flags; | ||
126 | unsigned char val; | ||
127 | |||
128 | if (!capable(CAP_SYS_TIME)) | ||
129 | return -EACCES; | ||
130 | |||
131 | spin_lock_irqsave(&ds1286_lock, flags); | ||
132 | val = rtc_read(RTC_CMD); | ||
133 | val &= ~RTC_TDM; | ||
134 | rtc_write(val, RTC_CMD); | ||
135 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
136 | |||
137 | return 0; | ||
138 | } | ||
139 | case RTC_WIE_OFF: /* Mask watchdog int. enab. bit */ | ||
140 | { | ||
141 | unsigned long flags; | ||
142 | unsigned char val; | ||
143 | |||
144 | if (!capable(CAP_SYS_TIME)) | ||
145 | return -EACCES; | ||
146 | |||
147 | spin_lock_irqsave(&ds1286_lock, flags); | ||
148 | val = rtc_read(RTC_CMD); | ||
149 | val |= RTC_WAM; | ||
150 | rtc_write(val, RTC_CMD); | ||
151 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
152 | |||
153 | return 0; | ||
154 | } | ||
155 | case RTC_WIE_ON: /* Allow watchdog interrupts. */ | ||
156 | { | ||
157 | unsigned long flags; | ||
158 | unsigned char val; | ||
159 | |||
160 | if (!capable(CAP_SYS_TIME)) | ||
161 | return -EACCES; | ||
162 | |||
163 | spin_lock_irqsave(&ds1286_lock, flags); | ||
164 | val = rtc_read(RTC_CMD); | ||
165 | val &= ~RTC_WAM; | ||
166 | rtc_write(val, RTC_CMD); | ||
167 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
168 | |||
169 | return 0; | ||
170 | } | ||
171 | case RTC_ALM_READ: /* Read the present alarm time */ | ||
172 | { | ||
173 | /* | ||
174 | * This returns a struct rtc_time. Reading >= 0xc0 | ||
175 | * means "don't care" or "match all". Only the tm_hour, | ||
176 | * tm_min, and tm_sec values are filled in. | ||
177 | */ | ||
178 | |||
179 | memset(&wtime, 0, sizeof(wtime)); | ||
180 | ds1286_get_alm_time(&wtime); | ||
181 | break; | ||
182 | } | ||
183 | case RTC_ALM_SET: /* Store a time into the alarm */ | ||
184 | { | ||
185 | /* | ||
186 | * This expects a struct rtc_time. Writing 0xff means | ||
187 | * "don't care" or "match all". Only the tm_hour, | ||
188 | * tm_min and tm_sec are used. | ||
189 | */ | ||
190 | unsigned char hrs, min, sec; | ||
191 | struct rtc_time alm_tm; | ||
192 | |||
193 | if (!capable(CAP_SYS_TIME)) | ||
194 | return -EACCES; | ||
195 | |||
196 | if (copy_from_user(&alm_tm, (struct rtc_time*)arg, | ||
197 | sizeof(struct rtc_time))) | ||
198 | return -EFAULT; | ||
199 | |||
200 | hrs = alm_tm.tm_hour; | ||
201 | min = alm_tm.tm_min; | ||
202 | sec = alm_tm.tm_sec; | ||
203 | |||
204 | if (hrs >= 24) | ||
205 | hrs = 0xff; | ||
206 | |||
207 | if (min >= 60) | ||
208 | min = 0xff; | ||
209 | |||
210 | if (sec != 0) | ||
211 | return -EINVAL; | ||
212 | |||
213 | min = bin2bcd(min); | ||
214 | min = bin2bcd(hrs); | ||
215 | |||
216 | spin_lock(&ds1286_lock); | ||
217 | rtc_write(hrs, RTC_HOURS_ALARM); | ||
218 | rtc_write(min, RTC_MINUTES_ALARM); | ||
219 | spin_unlock(&ds1286_lock); | ||
220 | |||
221 | return 0; | ||
222 | } | ||
223 | case RTC_RD_TIME: /* Read the time/date from RTC */ | ||
224 | { | ||
225 | memset(&wtime, 0, sizeof(wtime)); | ||
226 | ds1286_get_time(&wtime); | ||
227 | break; | ||
228 | } | ||
229 | case RTC_SET_TIME: /* Set the RTC */ | ||
230 | { | ||
231 | struct rtc_time rtc_tm; | ||
232 | |||
233 | if (!capable(CAP_SYS_TIME)) | ||
234 | return -EACCES; | ||
235 | |||
236 | if (copy_from_user(&rtc_tm, (struct rtc_time*)arg, | ||
237 | sizeof(struct rtc_time))) | ||
238 | return -EFAULT; | ||
239 | |||
240 | return ds1286_set_time(&rtc_tm); | ||
241 | } | ||
242 | default: | ||
243 | return -EINVAL; | ||
244 | } | ||
245 | return copy_to_user((void *)arg, &wtime, sizeof wtime) ? -EFAULT : 0; | ||
246 | } | ||
247 | |||
248 | /* | ||
249 | * We enforce only one user at a time here with the open/close. | ||
250 | * Also clear the previous interrupt data on an open, and clean | ||
251 | * up things on a close. | ||
252 | */ | ||
253 | |||
254 | static int ds1286_open(struct inode *inode, struct file *file) | ||
255 | { | ||
256 | lock_kernel(); | ||
257 | spin_lock_irq(&ds1286_lock); | ||
258 | |||
259 | if (ds1286_status & RTC_IS_OPEN) | ||
260 | goto out_busy; | ||
261 | |||
262 | ds1286_status |= RTC_IS_OPEN; | ||
263 | |||
264 | spin_unlock_irq(&ds1286_lock); | ||
265 | unlock_kernel(); | ||
266 | return 0; | ||
267 | |||
268 | out_busy: | ||
269 | spin_lock_irq(&ds1286_lock); | ||
270 | unlock_kernel(); | ||
271 | return -EBUSY; | ||
272 | } | ||
273 | |||
274 | static int ds1286_release(struct inode *inode, struct file *file) | ||
275 | { | ||
276 | ds1286_status &= ~RTC_IS_OPEN; | ||
277 | |||
278 | return 0; | ||
279 | } | ||
280 | |||
281 | static unsigned int ds1286_poll(struct file *file, poll_table *wait) | ||
282 | { | ||
283 | poll_wait(file, &ds1286_wait, wait); | ||
284 | |||
285 | return 0; | ||
286 | } | ||
287 | |||
288 | /* | ||
289 | * The various file operations we support. | ||
290 | */ | ||
291 | |||
292 | static const struct file_operations ds1286_fops = { | ||
293 | .llseek = no_llseek, | ||
294 | .read = ds1286_read, | ||
295 | .poll = ds1286_poll, | ||
296 | .ioctl = ds1286_ioctl, | ||
297 | .open = ds1286_open, | ||
298 | .release = ds1286_release, | ||
299 | }; | ||
300 | |||
301 | static struct miscdevice ds1286_dev= | ||
302 | { | ||
303 | .minor = RTC_MINOR, | ||
304 | .name = "rtc", | ||
305 | .fops = &ds1286_fops, | ||
306 | }; | ||
307 | |||
308 | static int __init ds1286_init(void) | ||
309 | { | ||
310 | int err; | ||
311 | |||
312 | printk(KERN_INFO "DS1286 Real Time Clock Driver v%s\n", DS1286_VERSION); | ||
313 | |||
314 | err = misc_register(&ds1286_dev); | ||
315 | if (err) | ||
316 | goto out; | ||
317 | |||
318 | if (!create_proc_read_entry("driver/rtc", 0, 0, ds1286_read_proc, NULL)) { | ||
319 | err = -ENOMEM; | ||
320 | |||
321 | goto out_deregister; | ||
322 | } | ||
323 | |||
324 | return 0; | ||
325 | |||
326 | out_deregister: | ||
327 | misc_deregister(&ds1286_dev); | ||
328 | |||
329 | out: | ||
330 | return err; | ||
331 | } | ||
332 | |||
333 | static void __exit ds1286_exit(void) | ||
334 | { | ||
335 | remove_proc_entry("driver/rtc", NULL); | ||
336 | misc_deregister(&ds1286_dev); | ||
337 | } | ||
338 | |||
339 | static char *days[] = { | ||
340 | "***", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" | ||
341 | }; | ||
342 | |||
343 | /* | ||
344 | * Info exported via "/proc/rtc". | ||
345 | */ | ||
346 | static int ds1286_proc_output(char *buf) | ||
347 | { | ||
348 | char *p, *s; | ||
349 | struct rtc_time tm; | ||
350 | unsigned char hundredth, month, cmd, amode; | ||
351 | |||
352 | p = buf; | ||
353 | |||
354 | ds1286_get_time(&tm); | ||
355 | hundredth = rtc_read(RTC_HUNDREDTH_SECOND); | ||
356 | hundredth = bcd2bin(hundredth); | ||
357 | |||
358 | p += sprintf(p, | ||
359 | "rtc_time\t: %02d:%02d:%02d.%02d\n" | ||
360 | "rtc_date\t: %04d-%02d-%02d\n", | ||
361 | tm.tm_hour, tm.tm_min, tm.tm_sec, hundredth, | ||
362 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); | ||
363 | |||
364 | /* | ||
365 | * We implicitly assume 24hr mode here. Alarm values >= 0xc0 will | ||
366 | * match any value for that particular field. Values that are | ||
367 | * greater than a valid time, but less than 0xc0 shouldn't appear. | ||
368 | */ | ||
369 | ds1286_get_alm_time(&tm); | ||
370 | p += sprintf(p, "alarm\t\t: %s ", days[tm.tm_wday]); | ||
371 | if (tm.tm_hour <= 24) | ||
372 | p += sprintf(p, "%02d:", tm.tm_hour); | ||
373 | else | ||
374 | p += sprintf(p, "**:"); | ||
375 | |||
376 | if (tm.tm_min <= 59) | ||
377 | p += sprintf(p, "%02d\n", tm.tm_min); | ||
378 | else | ||
379 | p += sprintf(p, "**\n"); | ||
380 | |||
381 | month = rtc_read(RTC_MONTH); | ||
382 | p += sprintf(p, | ||
383 | "oscillator\t: %s\n" | ||
384 | "square_wave\t: %s\n", | ||
385 | (month & RTC_EOSC) ? "disabled" : "enabled", | ||
386 | (month & RTC_ESQW) ? "disabled" : "enabled"); | ||
387 | |||
388 | amode = ((rtc_read(RTC_MINUTES_ALARM) & 0x80) >> 5) | | ||
389 | ((rtc_read(RTC_HOURS_ALARM) & 0x80) >> 6) | | ||
390 | ((rtc_read(RTC_DAY_ALARM) & 0x80) >> 7); | ||
391 | if (amode == 7) s = "each minute"; | ||
392 | else if (amode == 3) s = "minutes match"; | ||
393 | else if (amode == 1) s = "hours and minutes match"; | ||
394 | else if (amode == 0) s = "days, hours and minutes match"; | ||
395 | else s = "invalid"; | ||
396 | p += sprintf(p, "alarm_mode\t: %s\n", s); | ||
397 | |||
398 | cmd = rtc_read(RTC_CMD); | ||
399 | p += sprintf(p, | ||
400 | "alarm_enable\t: %s\n" | ||
401 | "wdog_alarm\t: %s\n" | ||
402 | "alarm_mask\t: %s\n" | ||
403 | "wdog_alarm_mask\t: %s\n" | ||
404 | "interrupt_mode\t: %s\n" | ||
405 | "INTB_mode\t: %s_active\n" | ||
406 | "interrupt_pins\t: %s\n", | ||
407 | (cmd & RTC_TDF) ? "yes" : "no", | ||
408 | (cmd & RTC_WAF) ? "yes" : "no", | ||
409 | (cmd & RTC_TDM) ? "disabled" : "enabled", | ||
410 | (cmd & RTC_WAM) ? "disabled" : "enabled", | ||
411 | (cmd & RTC_PU_LVL) ? "pulse" : "level", | ||
412 | (cmd & RTC_IBH_LO) ? "low" : "high", | ||
413 | (cmd & RTC_IPSW) ? "unswapped" : "swapped"); | ||
414 | |||
415 | return p - buf; | ||
416 | } | ||
417 | |||
418 | static int ds1286_read_proc(char *page, char **start, off_t off, | ||
419 | int count, int *eof, void *data) | ||
420 | { | ||
421 | int len = ds1286_proc_output (page); | ||
422 | if (len <= off+count) *eof = 1; | ||
423 | *start = page + off; | ||
424 | len -= off; | ||
425 | if (len>count) | ||
426 | len = count; | ||
427 | if (len<0) | ||
428 | len = 0; | ||
429 | |||
430 | return len; | ||
431 | } | ||
432 | |||
433 | /* | ||
434 | * Returns true if a clock update is in progress | ||
435 | */ | ||
436 | static inline unsigned char ds1286_is_updating(void) | ||
437 | { | ||
438 | return rtc_read(RTC_CMD) & RTC_TE; | ||
439 | } | ||
440 | |||
441 | |||
442 | static void ds1286_get_time(struct rtc_time *rtc_tm) | ||
443 | { | ||
444 | unsigned char save_control; | ||
445 | unsigned long flags; | ||
446 | |||
447 | /* | ||
448 | * read RTC once any update in progress is done. The update | ||
449 | * can take just over 2ms. We wait 10 to 20ms. There is no need to | ||
450 | * to poll-wait (up to 1s - eeccch) for the falling edge of RTC_UIP. | ||
451 | * If you need to know *exactly* when a second has started, enable | ||
452 | * periodic update complete interrupts, (via ioctl) and then | ||
453 | * immediately read /dev/rtc which will block until you get the IRQ. | ||
454 | * Once the read clears, read the RTC time (again via ioctl). Easy. | ||
455 | */ | ||
456 | |||
457 | if (ds1286_is_updating() != 0) | ||
458 | msleep(20); | ||
459 | |||
460 | /* | ||
461 | * Only the values that we read from the RTC are set. We leave | ||
462 | * tm_wday, tm_yday and tm_isdst untouched. Even though the | ||
463 | * RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated | ||
464 | * by the RTC when initially set to a non-zero value. | ||
465 | */ | ||
466 | spin_lock_irqsave(&ds1286_lock, flags); | ||
467 | save_control = rtc_read(RTC_CMD); | ||
468 | rtc_write((save_control|RTC_TE), RTC_CMD); | ||
469 | |||
470 | rtc_tm->tm_sec = rtc_read(RTC_SECONDS); | ||
471 | rtc_tm->tm_min = rtc_read(RTC_MINUTES); | ||
472 | rtc_tm->tm_hour = rtc_read(RTC_HOURS) & 0x3f; | ||
473 | rtc_tm->tm_mday = rtc_read(RTC_DATE); | ||
474 | rtc_tm->tm_mon = rtc_read(RTC_MONTH) & 0x1f; | ||
475 | rtc_tm->tm_year = rtc_read(RTC_YEAR); | ||
476 | |||
477 | rtc_write(save_control, RTC_CMD); | ||
478 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
479 | |||
480 | rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec); | ||
481 | rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min); | ||
482 | rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour); | ||
483 | rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday); | ||
484 | rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon); | ||
485 | rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year); | ||
486 | |||
487 | /* | ||
488 | * Account for differences between how the RTC uses the values | ||
489 | * and how they are defined in a struct rtc_time; | ||
490 | */ | ||
491 | if (rtc_tm->tm_year < 45) | ||
492 | rtc_tm->tm_year += 30; | ||
493 | if ((rtc_tm->tm_year += 40) < 70) | ||
494 | rtc_tm->tm_year += 100; | ||
495 | |||
496 | rtc_tm->tm_mon--; | ||
497 | } | ||
498 | |||
499 | static int ds1286_set_time(struct rtc_time *rtc_tm) | ||
500 | { | ||
501 | unsigned char mon, day, hrs, min, sec, leap_yr; | ||
502 | unsigned char save_control; | ||
503 | unsigned int yrs; | ||
504 | unsigned long flags; | ||
505 | |||
506 | |||
507 | yrs = rtc_tm->tm_year + 1900; | ||
508 | mon = rtc_tm->tm_mon + 1; /* tm_mon starts at zero */ | ||
509 | day = rtc_tm->tm_mday; | ||
510 | hrs = rtc_tm->tm_hour; | ||
511 | min = rtc_tm->tm_min; | ||
512 | sec = rtc_tm->tm_sec; | ||
513 | |||
514 | if (yrs < 1970) | ||
515 | return -EINVAL; | ||
516 | |||
517 | leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400)); | ||
518 | |||
519 | if ((mon > 12) || (day == 0)) | ||
520 | return -EINVAL; | ||
521 | |||
522 | if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr))) | ||
523 | return -EINVAL; | ||
524 | |||
525 | if ((hrs >= 24) || (min >= 60) || (sec >= 60)) | ||
526 | return -EINVAL; | ||
527 | |||
528 | if ((yrs -= 1940) > 255) /* They are unsigned */ | ||
529 | return -EINVAL; | ||
530 | |||
531 | if (yrs >= 100) | ||
532 | yrs -= 100; | ||
533 | |||
534 | sec = bin2bcd(sec); | ||
535 | min = bin2bcd(min); | ||
536 | hrs = bin2bcd(hrs); | ||
537 | day = bin2bcd(day); | ||
538 | mon = bin2bcd(mon); | ||
539 | yrs = bin2bcd(yrs); | ||
540 | |||
541 | spin_lock_irqsave(&ds1286_lock, flags); | ||
542 | save_control = rtc_read(RTC_CMD); | ||
543 | rtc_write((save_control|RTC_TE), RTC_CMD); | ||
544 | |||
545 | rtc_write(yrs, RTC_YEAR); | ||
546 | rtc_write(mon, RTC_MONTH); | ||
547 | rtc_write(day, RTC_DATE); | ||
548 | rtc_write(hrs, RTC_HOURS); | ||
549 | rtc_write(min, RTC_MINUTES); | ||
550 | rtc_write(sec, RTC_SECONDS); | ||
551 | rtc_write(0, RTC_HUNDREDTH_SECOND); | ||
552 | |||
553 | rtc_write(save_control, RTC_CMD); | ||
554 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
555 | |||
556 | return 0; | ||
557 | } | ||
558 | |||
559 | static void ds1286_get_alm_time(struct rtc_time *alm_tm) | ||
560 | { | ||
561 | unsigned char cmd; | ||
562 | unsigned long flags; | ||
563 | |||
564 | /* | ||
565 | * Only the values that we read from the RTC are set. That | ||
566 | * means only tm_wday, tm_hour, tm_min. | ||
567 | */ | ||
568 | spin_lock_irqsave(&ds1286_lock, flags); | ||
569 | alm_tm->tm_min = rtc_read(RTC_MINUTES_ALARM) & 0x7f; | ||
570 | alm_tm->tm_hour = rtc_read(RTC_HOURS_ALARM) & 0x1f; | ||
571 | alm_tm->tm_wday = rtc_read(RTC_DAY_ALARM) & 0x07; | ||
572 | cmd = rtc_read(RTC_CMD); | ||
573 | spin_unlock_irqrestore(&ds1286_lock, flags); | ||
574 | |||
575 | alm_tm->tm_min = bcd2bin(alm_tm->tm_min); | ||
576 | alm_tm->tm_hour = bcd2bin(alm_tm->tm_hour); | ||
577 | alm_tm->tm_sec = 0; | ||
578 | } | ||
579 | |||
580 | module_init(ds1286_init); | ||
581 | module_exit(ds1286_exit); | ||
582 | |||
583 | MODULE_AUTHOR("Ralf Baechle"); | ||
584 | MODULE_LICENSE("GPL"); | ||
585 | MODULE_ALIAS_MISCDEV(RTC_MINOR); | ||
diff --git a/drivers/char/ip27-rtc.c b/drivers/char/ip27-rtc.c deleted file mode 100644 index 2abd881b4cbc..000000000000 --- a/drivers/char/ip27-rtc.c +++ /dev/null | |||
@@ -1,329 +0,0 @@ | |||
1 | /* | ||
2 | * Driver for the SGS-Thomson M48T35 Timekeeper RAM chip | ||
3 | * | ||
4 | * Real Time Clock interface for Linux | ||
5 | * | ||
6 | * TODO: Implement periodic interrupts. | ||
7 | * | ||
8 | * Copyright (C) 2000 Silicon Graphics, Inc. | ||
9 | * Written by Ulf Carlsson (ulfc@engr.sgi.com) | ||
10 | * | ||
11 | * Based on code written by Paul Gortmaker. | ||
12 | * | ||
13 | * This driver allows use of the real time clock (built into | ||
14 | * nearly all computers) from user space. It exports the /dev/rtc | ||
15 | * interface supporting various ioctl() and also the /proc/rtc | ||
16 | * pseudo-file for status information. | ||
17 | * | ||
18 | * This program is free software; you can redistribute it and/or | ||
19 | * modify it under the terms of the GNU General Public License | ||
20 | * as published by the Free Software Foundation; either version | ||
21 | * 2 of the License, or (at your option) any later version. | ||
22 | * | ||
23 | */ | ||
24 | |||
25 | #define RTC_VERSION "1.09b" | ||
26 | |||
27 | #include <linux/bcd.h> | ||
28 | #include <linux/module.h> | ||
29 | #include <linux/kernel.h> | ||
30 | #include <linux/smp_lock.h> | ||
31 | #include <linux/types.h> | ||
32 | #include <linux/miscdevice.h> | ||
33 | #include <linux/ioport.h> | ||
34 | #include <linux/fcntl.h> | ||
35 | #include <linux/rtc.h> | ||
36 | #include <linux/init.h> | ||
37 | #include <linux/poll.h> | ||
38 | #include <linux/proc_fs.h> | ||
39 | |||
40 | #include <asm/m48t35.h> | ||
41 | #include <asm/sn/ioc3.h> | ||
42 | #include <asm/io.h> | ||
43 | #include <asm/uaccess.h> | ||
44 | #include <asm/system.h> | ||
45 | #include <asm/sn/klconfig.h> | ||
46 | #include <asm/sn/sn0/ip27.h> | ||
47 | #include <asm/sn/sn0/hub.h> | ||
48 | #include <asm/sn/sn_private.h> | ||
49 | |||
50 | static long rtc_ioctl(struct file *filp, unsigned int cmd, | ||
51 | unsigned long arg); | ||
52 | |||
53 | static int rtc_read_proc(char *page, char **start, off_t off, | ||
54 | int count, int *eof, void *data); | ||
55 | |||
56 | static void get_rtc_time(struct rtc_time *rtc_tm); | ||
57 | |||
58 | /* | ||
59 | * Bits in rtc_status. (6 bits of room for future expansion) | ||
60 | */ | ||
61 | |||
62 | #define RTC_IS_OPEN 0x01 /* means /dev/rtc is in use */ | ||
63 | #define RTC_TIMER_ON 0x02 /* missed irq timer active */ | ||
64 | |||
65 | static unsigned char rtc_status; /* bitmapped status byte. */ | ||
66 | static unsigned long rtc_freq; /* Current periodic IRQ rate */ | ||
67 | static struct m48t35_rtc *rtc; | ||
68 | |||
69 | /* | ||
70 | * If this driver ever becomes modularised, it will be really nice | ||
71 | * to make the epoch retain its value across module reload... | ||
72 | */ | ||
73 | |||
74 | static unsigned long epoch = 1970; /* year corresponding to 0x00 */ | ||
75 | |||
76 | static const unsigned char days_in_mo[] = | ||
77 | {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; | ||
78 | |||
79 | static long rtc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
80 | { | ||
81 | |||
82 | struct rtc_time wtime; | ||
83 | |||
84 | switch (cmd) { | ||
85 | case RTC_RD_TIME: /* Read the time/date from RTC */ | ||
86 | { | ||
87 | get_rtc_time(&wtime); | ||
88 | break; | ||
89 | } | ||
90 | case RTC_SET_TIME: /* Set the RTC */ | ||
91 | { | ||
92 | struct rtc_time rtc_tm; | ||
93 | unsigned char mon, day, hrs, min, sec, leap_yr; | ||
94 | unsigned int yrs; | ||
95 | |||
96 | if (!capable(CAP_SYS_TIME)) | ||
97 | return -EACCES; | ||
98 | |||
99 | if (copy_from_user(&rtc_tm, (struct rtc_time*)arg, | ||
100 | sizeof(struct rtc_time))) | ||
101 | return -EFAULT; | ||
102 | |||
103 | yrs = rtc_tm.tm_year + 1900; | ||
104 | mon = rtc_tm.tm_mon + 1; /* tm_mon starts at zero */ | ||
105 | day = rtc_tm.tm_mday; | ||
106 | hrs = rtc_tm.tm_hour; | ||
107 | min = rtc_tm.tm_min; | ||
108 | sec = rtc_tm.tm_sec; | ||
109 | |||
110 | if (yrs < 1970) | ||
111 | return -EINVAL; | ||
112 | |||
113 | leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400)); | ||
114 | |||
115 | if ((mon > 12) || (day == 0)) | ||
116 | return -EINVAL; | ||
117 | |||
118 | if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr))) | ||
119 | return -EINVAL; | ||
120 | |||
121 | if ((hrs >= 24) || (min >= 60) || (sec >= 60)) | ||
122 | return -EINVAL; | ||
123 | |||
124 | if ((yrs -= epoch) > 255) /* They are unsigned */ | ||
125 | return -EINVAL; | ||
126 | |||
127 | if (yrs > 169) | ||
128 | return -EINVAL; | ||
129 | |||
130 | if (yrs >= 100) | ||
131 | yrs -= 100; | ||
132 | |||
133 | sec = bin2bcd(sec); | ||
134 | min = bin2bcd(min); | ||
135 | hrs = bin2bcd(hrs); | ||
136 | day = bin2bcd(day); | ||
137 | mon = bin2bcd(mon); | ||
138 | yrs = bin2bcd(yrs); | ||
139 | |||
140 | spin_lock_irq(&rtc_lock); | ||
141 | rtc->control |= M48T35_RTC_SET; | ||
142 | rtc->year = yrs; | ||
143 | rtc->month = mon; | ||
144 | rtc->date = day; | ||
145 | rtc->hour = hrs; | ||
146 | rtc->min = min; | ||
147 | rtc->sec = sec; | ||
148 | rtc->control &= ~M48T35_RTC_SET; | ||
149 | spin_unlock_irq(&rtc_lock); | ||
150 | |||
151 | return 0; | ||
152 | } | ||
153 | default: | ||
154 | return -EINVAL; | ||
155 | } | ||
156 | return copy_to_user((void *)arg, &wtime, sizeof wtime) ? -EFAULT : 0; | ||
157 | } | ||
158 | |||
159 | /* | ||
160 | * We enforce only one user at a time here with the open/close. | ||
161 | * Also clear the previous interrupt data on an open, and clean | ||
162 | * up things on a close. | ||
163 | */ | ||
164 | |||
165 | static int rtc_open(struct inode *inode, struct file *file) | ||
166 | { | ||
167 | lock_kernel(); | ||
168 | spin_lock_irq(&rtc_lock); | ||
169 | |||
170 | if (rtc_status & RTC_IS_OPEN) { | ||
171 | spin_unlock_irq(&rtc_lock); | ||
172 | unlock_kernel(); | ||
173 | return -EBUSY; | ||
174 | } | ||
175 | |||
176 | rtc_status |= RTC_IS_OPEN; | ||
177 | spin_unlock_irq(&rtc_lock); | ||
178 | unlock_kernel(); | ||
179 | |||
180 | return 0; | ||
181 | } | ||
182 | |||
183 | static int rtc_release(struct inode *inode, struct file *file) | ||
184 | { | ||
185 | /* | ||
186 | * Turn off all interrupts once the device is no longer | ||
187 | * in use, and clear the data. | ||
188 | */ | ||
189 | |||
190 | spin_lock_irq(&rtc_lock); | ||
191 | rtc_status &= ~RTC_IS_OPEN; | ||
192 | spin_unlock_irq(&rtc_lock); | ||
193 | |||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | /* | ||
198 | * The various file operations we support. | ||
199 | */ | ||
200 | |||
201 | static const struct file_operations rtc_fops = { | ||
202 | .owner = THIS_MODULE, | ||
203 | .unlocked_ioctl = rtc_ioctl, | ||
204 | .open = rtc_open, | ||
205 | .release = rtc_release, | ||
206 | }; | ||
207 | |||
208 | static struct miscdevice rtc_dev= | ||
209 | { | ||
210 | RTC_MINOR, | ||
211 | "rtc", | ||
212 | &rtc_fops | ||
213 | }; | ||
214 | |||
215 | static int __init rtc_init(void) | ||
216 | { | ||
217 | rtc = (struct m48t35_rtc *) | ||
218 | (KL_CONFIG_CH_CONS_INFO(master_nasid)->memory_base + IOC3_BYTEBUS_DEV0); | ||
219 | |||
220 | printk(KERN_INFO "Real Time Clock Driver v%s\n", RTC_VERSION); | ||
221 | if (misc_register(&rtc_dev)) { | ||
222 | printk(KERN_ERR "rtc: cannot register misc device.\n"); | ||
223 | return -ENODEV; | ||
224 | } | ||
225 | if (!create_proc_read_entry("driver/rtc", 0, NULL, rtc_read_proc, NULL)) { | ||
226 | printk(KERN_ERR "rtc: cannot create /proc/rtc.\n"); | ||
227 | misc_deregister(&rtc_dev); | ||
228 | return -ENOENT; | ||
229 | } | ||
230 | |||
231 | rtc_freq = 1024; | ||
232 | |||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | static void __exit rtc_exit (void) | ||
237 | { | ||
238 | /* interrupts and timer disabled at this point by rtc_release */ | ||
239 | |||
240 | remove_proc_entry ("rtc", NULL); | ||
241 | misc_deregister(&rtc_dev); | ||
242 | } | ||
243 | |||
244 | module_init(rtc_init); | ||
245 | module_exit(rtc_exit); | ||
246 | |||
247 | /* | ||
248 | * Info exported via "/proc/rtc". | ||
249 | */ | ||
250 | |||
251 | static int rtc_get_status(char *buf) | ||
252 | { | ||
253 | char *p; | ||
254 | struct rtc_time tm; | ||
255 | |||
256 | /* | ||
257 | * Just emulate the standard /proc/rtc | ||
258 | */ | ||
259 | |||
260 | p = buf; | ||
261 | |||
262 | get_rtc_time(&tm); | ||
263 | |||
264 | /* | ||
265 | * There is no way to tell if the luser has the RTC set for local | ||
266 | * time or for Universal Standard Time (GMT). Probably local though. | ||
267 | */ | ||
268 | p += sprintf(p, | ||
269 | "rtc_time\t: %02d:%02d:%02d\n" | ||
270 | "rtc_date\t: %04d-%02d-%02d\n" | ||
271 | "rtc_epoch\t: %04lu\n" | ||
272 | "24hr\t\t: yes\n", | ||
273 | tm.tm_hour, tm.tm_min, tm.tm_sec, | ||
274 | tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, epoch); | ||
275 | |||
276 | return p - buf; | ||
277 | } | ||
278 | |||
279 | static int rtc_read_proc(char *page, char **start, off_t off, | ||
280 | int count, int *eof, void *data) | ||
281 | { | ||
282 | int len = rtc_get_status(page); | ||
283 | if (len <= off+count) *eof = 1; | ||
284 | *start = page + off; | ||
285 | len -= off; | ||
286 | if (len>count) len = count; | ||
287 | if (len<0) len = 0; | ||
288 | return len; | ||
289 | } | ||
290 | |||
291 | static void get_rtc_time(struct rtc_time *rtc_tm) | ||
292 | { | ||
293 | /* | ||
294 | * Do we need to wait for the last update to finish? | ||
295 | */ | ||
296 | |||
297 | /* | ||
298 | * Only the values that we read from the RTC are set. We leave | ||
299 | * tm_wday, tm_yday and tm_isdst untouched. Even though the | ||
300 | * RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated | ||
301 | * by the RTC when initially set to a non-zero value. | ||
302 | */ | ||
303 | spin_lock_irq(&rtc_lock); | ||
304 | rtc->control |= M48T35_RTC_READ; | ||
305 | rtc_tm->tm_sec = rtc->sec; | ||
306 | rtc_tm->tm_min = rtc->min; | ||
307 | rtc_tm->tm_hour = rtc->hour; | ||
308 | rtc_tm->tm_mday = rtc->date; | ||
309 | rtc_tm->tm_mon = rtc->month; | ||
310 | rtc_tm->tm_year = rtc->year; | ||
311 | rtc->control &= ~M48T35_RTC_READ; | ||
312 | spin_unlock_irq(&rtc_lock); | ||
313 | |||
314 | rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec); | ||
315 | rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min); | ||
316 | rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour); | ||
317 | rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday); | ||
318 | rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon); | ||
319 | rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year); | ||
320 | |||
321 | /* | ||
322 | * Account for differences between how the RTC uses the values | ||
323 | * and how they are defined in a struct rtc_time; | ||
324 | */ | ||
325 | if ((rtc_tm->tm_year += (epoch - 1900)) <= 69) | ||
326 | rtc_tm->tm_year += 100; | ||
327 | |||
328 | rtc_tm->tm_mon--; | ||
329 | } | ||
diff --git a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c index 835a33c8d5f5..1d7b429f7ffa 100644 --- a/drivers/char/ipmi/ipmi_devintf.c +++ b/drivers/char/ipmi/ipmi_devintf.c | |||
@@ -957,3 +957,4 @@ module_exit(cleanup_ipmi); | |||
957 | MODULE_LICENSE("GPL"); | 957 | MODULE_LICENSE("GPL"); |
958 | MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>"); | 958 | MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>"); |
959 | MODULE_DESCRIPTION("Linux device interface for the IPMI message handler."); | 959 | MODULE_DESCRIPTION("Linux device interface for the IPMI message handler."); |
960 | MODULE_ALIAS("platform:ipmi_si"); | ||
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 9a626e50b793..4d64a02612a4 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c | |||
@@ -554,7 +554,7 @@ static int mgslpc_probe(struct pcmcia_device *link) | |||
554 | /* Initialize the struct pcmcia_device structure */ | 554 | /* Initialize the struct pcmcia_device structure */ |
555 | 555 | ||
556 | /* Interrupt setup */ | 556 | /* Interrupt setup */ |
557 | link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; | 557 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; |
558 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | 558 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; |
559 | link->irq.Handler = NULL; | 559 | link->irq.Handler = NULL; |
560 | 560 | ||
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig index 5a11e3cbcae2..e0dbd388757f 100644 --- a/drivers/edac/Kconfig +++ b/drivers/edac/Kconfig | |||
@@ -102,6 +102,13 @@ config EDAC_I3000 | |||
102 | Support for error detection and correction on the Intel | 102 | Support for error detection and correction on the Intel |
103 | 3000 and 3010 server chipsets. | 103 | 3000 and 3010 server chipsets. |
104 | 104 | ||
105 | config EDAC_X38 | ||
106 | tristate "Intel X38" | ||
107 | depends on EDAC_MM_EDAC && PCI && X86 | ||
108 | help | ||
109 | Support for error detection and correction on the Intel | ||
110 | X38 server chipsets. | ||
111 | |||
105 | config EDAC_I82860 | 112 | config EDAC_I82860 |
106 | tristate "Intel 82860" | 113 | tristate "Intel 82860" |
107 | depends on EDAC_MM_EDAC && PCI && X86_32 | 114 | depends on EDAC_MM_EDAC && PCI && X86_32 |
diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile index e5e9104b5520..62c2d9bad8dc 100644 --- a/drivers/edac/Makefile +++ b/drivers/edac/Makefile | |||
@@ -26,6 +26,7 @@ obj-$(CONFIG_EDAC_I82443BXGX) += i82443bxgx_edac.o | |||
26 | obj-$(CONFIG_EDAC_I82875P) += i82875p_edac.o | 26 | obj-$(CONFIG_EDAC_I82875P) += i82875p_edac.o |
27 | obj-$(CONFIG_EDAC_I82975X) += i82975x_edac.o | 27 | obj-$(CONFIG_EDAC_I82975X) += i82975x_edac.o |
28 | obj-$(CONFIG_EDAC_I3000) += i3000_edac.o | 28 | obj-$(CONFIG_EDAC_I3000) += i3000_edac.o |
29 | obj-$(CONFIG_EDAC_X38) += x38_edac.o | ||
29 | obj-$(CONFIG_EDAC_I82860) += i82860_edac.o | 30 | obj-$(CONFIG_EDAC_I82860) += i82860_edac.o |
30 | obj-$(CONFIG_EDAC_R82600) += r82600_edac.o | 31 | obj-$(CONFIG_EDAC_R82600) += r82600_edac.o |
31 | obj-$(CONFIG_EDAC_PASEMI) += pasemi_edac.o | 32 | obj-$(CONFIG_EDAC_PASEMI) += pasemi_edac.o |
diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c index 887072f5dc8b..cd2e3b8087e7 100644 --- a/drivers/edac/cell_edac.c +++ b/drivers/edac/cell_edac.c | |||
@@ -9,6 +9,7 @@ | |||
9 | */ | 9 | */ |
10 | #undef DEBUG | 10 | #undef DEBUG |
11 | 11 | ||
12 | #include <linux/edac.h> | ||
12 | #include <linux/module.h> | 13 | #include <linux/module.h> |
13 | #include <linux/init.h> | 14 | #include <linux/init.h> |
14 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
@@ -164,6 +165,8 @@ static int __devinit cell_edac_probe(struct platform_device *pdev) | |||
164 | if (regs == NULL) | 165 | if (regs == NULL) |
165 | return -ENODEV; | 166 | return -ENODEV; |
166 | 167 | ||
168 | edac_op_state = EDAC_OPSTATE_POLL; | ||
169 | |||
167 | /* Get channel population */ | 170 | /* Get channel population */ |
168 | reg = in_be64(®s->mic_mnt_cfg); | 171 | reg = in_be64(®s->mic_mnt_cfg); |
169 | dev_dbg(&pdev->dev, "MIC_MNT_CFG = 0x%016lx\n", reg); | 172 | dev_dbg(&pdev->dev, "MIC_MNT_CFG = 0x%016lx\n", reg); |
diff --git a/drivers/edac/x38_edac.c b/drivers/edac/x38_edac.c new file mode 100644 index 000000000000..2406c2ce2844 --- /dev/null +++ b/drivers/edac/x38_edac.c | |||
@@ -0,0 +1,524 @@ | |||
1 | /* | ||
2 | * Intel X38 Memory Controller kernel module | ||
3 | * Copyright (C) 2008 Cluster Computing, Inc. | ||
4 | * | ||
5 | * This file may be distributed under the terms of the | ||
6 | * GNU General Public License. | ||
7 | * | ||
8 | * This file is based on i3200_edac.c | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #include <linux/module.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/pci.h> | ||
15 | #include <linux/pci_ids.h> | ||
16 | #include <linux/slab.h> | ||
17 | #include <linux/edac.h> | ||
18 | #include "edac_core.h" | ||
19 | |||
20 | #define X38_REVISION "1.1" | ||
21 | |||
22 | #define EDAC_MOD_STR "x38_edac" | ||
23 | |||
24 | #define PCI_DEVICE_ID_INTEL_X38_HB 0x29e0 | ||
25 | |||
26 | #define X38_RANKS 8 | ||
27 | #define X38_RANKS_PER_CHANNEL 4 | ||
28 | #define X38_CHANNELS 2 | ||
29 | |||
30 | /* Intel X38 register addresses - device 0 function 0 - DRAM Controller */ | ||
31 | |||
32 | #define X38_MCHBAR_LOW 0x48 /* MCH Memory Mapped Register BAR */ | ||
33 | #define X38_MCHBAR_HIGH 0x4b | ||
34 | #define X38_MCHBAR_MASK 0xfffffc000ULL /* bits 35:14 */ | ||
35 | #define X38_MMR_WINDOW_SIZE 16384 | ||
36 | |||
37 | #define X38_TOM 0xa0 /* Top of Memory (16b) | ||
38 | * | ||
39 | * 15:10 reserved | ||
40 | * 9:0 total populated physical memory | ||
41 | */ | ||
42 | #define X38_TOM_MASK 0x3ff /* bits 9:0 */ | ||
43 | #define X38_TOM_SHIFT 26 /* 64MiB grain */ | ||
44 | |||
45 | #define X38_ERRSTS 0xc8 /* Error Status Register (16b) | ||
46 | * | ||
47 | * 15 reserved | ||
48 | * 14 Isochronous TBWRR Run Behind FIFO Full | ||
49 | * (ITCV) | ||
50 | * 13 Isochronous TBWRR Run Behind FIFO Put | ||
51 | * (ITSTV) | ||
52 | * 12 reserved | ||
53 | * 11 MCH Thermal Sensor Event | ||
54 | * for SMI/SCI/SERR (GTSE) | ||
55 | * 10 reserved | ||
56 | * 9 LOCK to non-DRAM Memory Flag (LCKF) | ||
57 | * 8 reserved | ||
58 | * 7 DRAM Throttle Flag (DTF) | ||
59 | * 6:2 reserved | ||
60 | * 1 Multi-bit DRAM ECC Error Flag (DMERR) | ||
61 | * 0 Single-bit DRAM ECC Error Flag (DSERR) | ||
62 | */ | ||
63 | #define X38_ERRSTS_UE 0x0002 | ||
64 | #define X38_ERRSTS_CE 0x0001 | ||
65 | #define X38_ERRSTS_BITS (X38_ERRSTS_UE | X38_ERRSTS_CE) | ||
66 | |||
67 | |||
68 | /* Intel MMIO register space - device 0 function 0 - MMR space */ | ||
69 | |||
70 | #define X38_C0DRB 0x200 /* Channel 0 DRAM Rank Boundary (16b x 4) | ||
71 | * | ||
72 | * 15:10 reserved | ||
73 | * 9:0 Channel 0 DRAM Rank Boundary Address | ||
74 | */ | ||
75 | #define X38_C1DRB 0x600 /* Channel 1 DRAM Rank Boundary (16b x 4) */ | ||
76 | #define X38_DRB_MASK 0x3ff /* bits 9:0 */ | ||
77 | #define X38_DRB_SHIFT 26 /* 64MiB grain */ | ||
78 | |||
79 | #define X38_C0ECCERRLOG 0x280 /* Channel 0 ECC Error Log (64b) | ||
80 | * | ||
81 | * 63:48 Error Column Address (ERRCOL) | ||
82 | * 47:32 Error Row Address (ERRROW) | ||
83 | * 31:29 Error Bank Address (ERRBANK) | ||
84 | * 28:27 Error Rank Address (ERRRANK) | ||
85 | * 26:24 reserved | ||
86 | * 23:16 Error Syndrome (ERRSYND) | ||
87 | * 15: 2 reserved | ||
88 | * 1 Multiple Bit Error Status (MERRSTS) | ||
89 | * 0 Correctable Error Status (CERRSTS) | ||
90 | */ | ||
91 | #define X38_C1ECCERRLOG 0x680 /* Channel 1 ECC Error Log (64b) */ | ||
92 | #define X38_ECCERRLOG_CE 0x1 | ||
93 | #define X38_ECCERRLOG_UE 0x2 | ||
94 | #define X38_ECCERRLOG_RANK_BITS 0x18000000 | ||
95 | #define X38_ECCERRLOG_SYNDROME_BITS 0xff0000 | ||
96 | |||
97 | #define X38_CAPID0 0xe0 /* see P.94 of spec for details */ | ||
98 | |||
99 | static int x38_channel_num; | ||
100 | |||
101 | static int how_many_channel(struct pci_dev *pdev) | ||
102 | { | ||
103 | unsigned char capid0_8b; /* 8th byte of CAPID0 */ | ||
104 | |||
105 | pci_read_config_byte(pdev, X38_CAPID0 + 8, &capid0_8b); | ||
106 | if (capid0_8b & 0x20) { /* check DCD: Dual Channel Disable */ | ||
107 | debugf0("In single channel mode.\n"); | ||
108 | x38_channel_num = 1; | ||
109 | } else { | ||
110 | debugf0("In dual channel mode.\n"); | ||
111 | x38_channel_num = 2; | ||
112 | } | ||
113 | |||
114 | return x38_channel_num; | ||
115 | } | ||
116 | |||
117 | static unsigned long eccerrlog_syndrome(u64 log) | ||
118 | { | ||
119 | return (log & X38_ECCERRLOG_SYNDROME_BITS) >> 16; | ||
120 | } | ||
121 | |||
122 | static int eccerrlog_row(int channel, u64 log) | ||
123 | { | ||
124 | return ((log & X38_ECCERRLOG_RANK_BITS) >> 27) | | ||
125 | (channel * X38_RANKS_PER_CHANNEL); | ||
126 | } | ||
127 | |||
128 | enum x38_chips { | ||
129 | X38 = 0, | ||
130 | }; | ||
131 | |||
132 | struct x38_dev_info { | ||
133 | const char *ctl_name; | ||
134 | }; | ||
135 | |||
136 | struct x38_error_info { | ||
137 | u16 errsts; | ||
138 | u16 errsts2; | ||
139 | u64 eccerrlog[X38_CHANNELS]; | ||
140 | }; | ||
141 | |||
142 | static const struct x38_dev_info x38_devs[] = { | ||
143 | [X38] = { | ||
144 | .ctl_name = "x38"}, | ||
145 | }; | ||
146 | |||
147 | static struct pci_dev *mci_pdev; | ||
148 | static int x38_registered = 1; | ||
149 | |||
150 | |||
151 | static void x38_clear_error_info(struct mem_ctl_info *mci) | ||
152 | { | ||
153 | struct pci_dev *pdev; | ||
154 | |||
155 | pdev = to_pci_dev(mci->dev); | ||
156 | |||
157 | /* | ||
158 | * Clear any error bits. | ||
159 | * (Yes, we really clear bits by writing 1 to them.) | ||
160 | */ | ||
161 | pci_write_bits16(pdev, X38_ERRSTS, X38_ERRSTS_BITS, | ||
162 | X38_ERRSTS_BITS); | ||
163 | } | ||
164 | |||
165 | static u64 x38_readq(const void __iomem *addr) | ||
166 | { | ||
167 | return readl(addr) | (((u64)readl(addr + 4)) << 32); | ||
168 | } | ||
169 | |||
170 | static void x38_get_and_clear_error_info(struct mem_ctl_info *mci, | ||
171 | struct x38_error_info *info) | ||
172 | { | ||
173 | struct pci_dev *pdev; | ||
174 | void __iomem *window = mci->pvt_info; | ||
175 | |||
176 | pdev = to_pci_dev(mci->dev); | ||
177 | |||
178 | /* | ||
179 | * This is a mess because there is no atomic way to read all the | ||
180 | * registers at once and the registers can transition from CE being | ||
181 | * overwritten by UE. | ||
182 | */ | ||
183 | pci_read_config_word(pdev, X38_ERRSTS, &info->errsts); | ||
184 | if (!(info->errsts & X38_ERRSTS_BITS)) | ||
185 | return; | ||
186 | |||
187 | info->eccerrlog[0] = x38_readq(window + X38_C0ECCERRLOG); | ||
188 | if (x38_channel_num == 2) | ||
189 | info->eccerrlog[1] = x38_readq(window + X38_C1ECCERRLOG); | ||
190 | |||
191 | pci_read_config_word(pdev, X38_ERRSTS, &info->errsts2); | ||
192 | |||
193 | /* | ||
194 | * If the error is the same for both reads then the first set | ||
195 | * of reads is valid. If there is a change then there is a CE | ||
196 | * with no info and the second set of reads is valid and | ||
197 | * should be UE info. | ||
198 | */ | ||
199 | if ((info->errsts ^ info->errsts2) & X38_ERRSTS_BITS) { | ||
200 | info->eccerrlog[0] = x38_readq(window + X38_C0ECCERRLOG); | ||
201 | if (x38_channel_num == 2) | ||
202 | info->eccerrlog[1] = | ||
203 | x38_readq(window + X38_C1ECCERRLOG); | ||
204 | } | ||
205 | |||
206 | x38_clear_error_info(mci); | ||
207 | } | ||
208 | |||
209 | static void x38_process_error_info(struct mem_ctl_info *mci, | ||
210 | struct x38_error_info *info) | ||
211 | { | ||
212 | int channel; | ||
213 | u64 log; | ||
214 | |||
215 | if (!(info->errsts & X38_ERRSTS_BITS)) | ||
216 | return; | ||
217 | |||
218 | if ((info->errsts ^ info->errsts2) & X38_ERRSTS_BITS) { | ||
219 | edac_mc_handle_ce_no_info(mci, "UE overwrote CE"); | ||
220 | info->errsts = info->errsts2; | ||
221 | } | ||
222 | |||
223 | for (channel = 0; channel < x38_channel_num; channel++) { | ||
224 | log = info->eccerrlog[channel]; | ||
225 | if (log & X38_ECCERRLOG_UE) { | ||
226 | edac_mc_handle_ue(mci, 0, 0, | ||
227 | eccerrlog_row(channel, log), "x38 UE"); | ||
228 | } else if (log & X38_ECCERRLOG_CE) { | ||
229 | edac_mc_handle_ce(mci, 0, 0, | ||
230 | eccerrlog_syndrome(log), | ||
231 | eccerrlog_row(channel, log), 0, "x38 CE"); | ||
232 | } | ||
233 | } | ||
234 | } | ||
235 | |||
236 | static void x38_check(struct mem_ctl_info *mci) | ||
237 | { | ||
238 | struct x38_error_info info; | ||
239 | |||
240 | debugf1("MC%d: %s()\n", mci->mc_idx, __func__); | ||
241 | x38_get_and_clear_error_info(mci, &info); | ||
242 | x38_process_error_info(mci, &info); | ||
243 | } | ||
244 | |||
245 | |||
246 | void __iomem *x38_map_mchbar(struct pci_dev *pdev) | ||
247 | { | ||
248 | union { | ||
249 | u64 mchbar; | ||
250 | struct { | ||
251 | u32 mchbar_low; | ||
252 | u32 mchbar_high; | ||
253 | }; | ||
254 | } u; | ||
255 | void __iomem *window; | ||
256 | |||
257 | pci_read_config_dword(pdev, X38_MCHBAR_LOW, &u.mchbar_low); | ||
258 | pci_write_config_dword(pdev, X38_MCHBAR_LOW, u.mchbar_low | 0x1); | ||
259 | pci_read_config_dword(pdev, X38_MCHBAR_HIGH, &u.mchbar_high); | ||
260 | u.mchbar &= X38_MCHBAR_MASK; | ||
261 | |||
262 | if (u.mchbar != (resource_size_t)u.mchbar) { | ||
263 | printk(KERN_ERR | ||
264 | "x38: mmio space beyond accessible range (0x%llx)\n", | ||
265 | (unsigned long long)u.mchbar); | ||
266 | return NULL; | ||
267 | } | ||
268 | |||
269 | window = ioremap_nocache(u.mchbar, X38_MMR_WINDOW_SIZE); | ||
270 | if (!window) | ||
271 | printk(KERN_ERR "x38: cannot map mmio space at 0x%llx\n", | ||
272 | (unsigned long long)u.mchbar); | ||
273 | |||
274 | return window; | ||
275 | } | ||
276 | |||
277 | |||
278 | static void x38_get_drbs(void __iomem *window, | ||
279 | u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL]) | ||
280 | { | ||
281 | int i; | ||
282 | |||
283 | for (i = 0; i < X38_RANKS_PER_CHANNEL; i++) { | ||
284 | drbs[0][i] = readw(window + X38_C0DRB + 2*i) & X38_DRB_MASK; | ||
285 | drbs[1][i] = readw(window + X38_C1DRB + 2*i) & X38_DRB_MASK; | ||
286 | } | ||
287 | } | ||
288 | |||
289 | static bool x38_is_stacked(struct pci_dev *pdev, | ||
290 | u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL]) | ||
291 | { | ||
292 | u16 tom; | ||
293 | |||
294 | pci_read_config_word(pdev, X38_TOM, &tom); | ||
295 | tom &= X38_TOM_MASK; | ||
296 | |||
297 | return drbs[X38_CHANNELS - 1][X38_RANKS_PER_CHANNEL - 1] == tom; | ||
298 | } | ||
299 | |||
300 | static unsigned long drb_to_nr_pages( | ||
301 | u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL], | ||
302 | bool stacked, int channel, int rank) | ||
303 | { | ||
304 | int n; | ||
305 | |||
306 | n = drbs[channel][rank]; | ||
307 | if (rank > 0) | ||
308 | n -= drbs[channel][rank - 1]; | ||
309 | if (stacked && (channel == 1) && drbs[channel][rank] == | ||
310 | drbs[channel][X38_RANKS_PER_CHANNEL - 1]) { | ||
311 | n -= drbs[0][X38_RANKS_PER_CHANNEL - 1]; | ||
312 | } | ||
313 | |||
314 | n <<= (X38_DRB_SHIFT - PAGE_SHIFT); | ||
315 | return n; | ||
316 | } | ||
317 | |||
318 | static int x38_probe1(struct pci_dev *pdev, int dev_idx) | ||
319 | { | ||
320 | int rc; | ||
321 | int i; | ||
322 | struct mem_ctl_info *mci = NULL; | ||
323 | unsigned long last_page; | ||
324 | u16 drbs[X38_CHANNELS][X38_RANKS_PER_CHANNEL]; | ||
325 | bool stacked; | ||
326 | void __iomem *window; | ||
327 | |||
328 | debugf0("MC: %s()\n", __func__); | ||
329 | |||
330 | window = x38_map_mchbar(pdev); | ||
331 | if (!window) | ||
332 | return -ENODEV; | ||
333 | |||
334 | x38_get_drbs(window, drbs); | ||
335 | |||
336 | how_many_channel(pdev); | ||
337 | |||
338 | /* FIXME: unconventional pvt_info usage */ | ||
339 | mci = edac_mc_alloc(0, X38_RANKS, x38_channel_num, 0); | ||
340 | if (!mci) | ||
341 | return -ENOMEM; | ||
342 | |||
343 | debugf3("MC: %s(): init mci\n", __func__); | ||
344 | |||
345 | mci->dev = &pdev->dev; | ||
346 | mci->mtype_cap = MEM_FLAG_DDR2; | ||
347 | |||
348 | mci->edac_ctl_cap = EDAC_FLAG_SECDED; | ||
349 | mci->edac_cap = EDAC_FLAG_SECDED; | ||
350 | |||
351 | mci->mod_name = EDAC_MOD_STR; | ||
352 | mci->mod_ver = X38_REVISION; | ||
353 | mci->ctl_name = x38_devs[dev_idx].ctl_name; | ||
354 | mci->dev_name = pci_name(pdev); | ||
355 | mci->edac_check = x38_check; | ||
356 | mci->ctl_page_to_phys = NULL; | ||
357 | mci->pvt_info = window; | ||
358 | |||
359 | stacked = x38_is_stacked(pdev, drbs); | ||
360 | |||
361 | /* | ||
362 | * The dram rank boundary (DRB) reg values are boundary addresses | ||
363 | * for each DRAM rank with a granularity of 64MB. DRB regs are | ||
364 | * cumulative; the last one will contain the total memory | ||
365 | * contained in all ranks. | ||
366 | */ | ||
367 | last_page = -1UL; | ||
368 | for (i = 0; i < mci->nr_csrows; i++) { | ||
369 | unsigned long nr_pages; | ||
370 | struct csrow_info *csrow = &mci->csrows[i]; | ||
371 | |||
372 | nr_pages = drb_to_nr_pages(drbs, stacked, | ||
373 | i / X38_RANKS_PER_CHANNEL, | ||
374 | i % X38_RANKS_PER_CHANNEL); | ||
375 | |||
376 | if (nr_pages == 0) { | ||
377 | csrow->mtype = MEM_EMPTY; | ||
378 | continue; | ||
379 | } | ||
380 | |||
381 | csrow->first_page = last_page + 1; | ||
382 | last_page += nr_pages; | ||
383 | csrow->last_page = last_page; | ||
384 | csrow->nr_pages = nr_pages; | ||
385 | |||
386 | csrow->grain = nr_pages << PAGE_SHIFT; | ||
387 | csrow->mtype = MEM_DDR2; | ||
388 | csrow->dtype = DEV_UNKNOWN; | ||
389 | csrow->edac_mode = EDAC_UNKNOWN; | ||
390 | } | ||
391 | |||
392 | x38_clear_error_info(mci); | ||
393 | |||
394 | rc = -ENODEV; | ||
395 | if (edac_mc_add_mc(mci)) { | ||
396 | debugf3("MC: %s(): failed edac_mc_add_mc()\n", __func__); | ||
397 | goto fail; | ||
398 | } | ||
399 | |||
400 | /* get this far and it's successful */ | ||
401 | debugf3("MC: %s(): success\n", __func__); | ||
402 | return 0; | ||
403 | |||
404 | fail: | ||
405 | iounmap(window); | ||
406 | if (mci) | ||
407 | edac_mc_free(mci); | ||
408 | |||
409 | return rc; | ||
410 | } | ||
411 | |||
412 | static int __devinit x38_init_one(struct pci_dev *pdev, | ||
413 | const struct pci_device_id *ent) | ||
414 | { | ||
415 | int rc; | ||
416 | |||
417 | debugf0("MC: %s()\n", __func__); | ||
418 | |||
419 | if (pci_enable_device(pdev) < 0) | ||
420 | return -EIO; | ||
421 | |||
422 | rc = x38_probe1(pdev, ent->driver_data); | ||
423 | if (!mci_pdev) | ||
424 | mci_pdev = pci_dev_get(pdev); | ||
425 | |||
426 | return rc; | ||
427 | } | ||
428 | |||
429 | static void __devexit x38_remove_one(struct pci_dev *pdev) | ||
430 | { | ||
431 | struct mem_ctl_info *mci; | ||
432 | |||
433 | debugf0("%s()\n", __func__); | ||
434 | |||
435 | mci = edac_mc_del_mc(&pdev->dev); | ||
436 | if (!mci) | ||
437 | return; | ||
438 | |||
439 | iounmap(mci->pvt_info); | ||
440 | |||
441 | edac_mc_free(mci); | ||
442 | } | ||
443 | |||
444 | static const struct pci_device_id x38_pci_tbl[] __devinitdata = { | ||
445 | { | ||
446 | PCI_VEND_DEV(INTEL, X38_HB), PCI_ANY_ID, PCI_ANY_ID, 0, 0, | ||
447 | X38}, | ||
448 | { | ||
449 | 0, | ||
450 | } /* 0 terminated list. */ | ||
451 | }; | ||
452 | |||
453 | MODULE_DEVICE_TABLE(pci, x38_pci_tbl); | ||
454 | |||
455 | static struct pci_driver x38_driver = { | ||
456 | .name = EDAC_MOD_STR, | ||
457 | .probe = x38_init_one, | ||
458 | .remove = __devexit_p(x38_remove_one), | ||
459 | .id_table = x38_pci_tbl, | ||
460 | }; | ||
461 | |||
462 | static int __init x38_init(void) | ||
463 | { | ||
464 | int pci_rc; | ||
465 | |||
466 | debugf3("MC: %s()\n", __func__); | ||
467 | |||
468 | /* Ensure that the OPSTATE is set correctly for POLL or NMI */ | ||
469 | opstate_init(); | ||
470 | |||
471 | pci_rc = pci_register_driver(&x38_driver); | ||
472 | if (pci_rc < 0) | ||
473 | goto fail0; | ||
474 | |||
475 | if (!mci_pdev) { | ||
476 | x38_registered = 0; | ||
477 | mci_pdev = pci_get_device(PCI_VENDOR_ID_INTEL, | ||
478 | PCI_DEVICE_ID_INTEL_X38_HB, NULL); | ||
479 | if (!mci_pdev) { | ||
480 | debugf0("x38 pci_get_device fail\n"); | ||
481 | pci_rc = -ENODEV; | ||
482 | goto fail1; | ||
483 | } | ||
484 | |||
485 | pci_rc = x38_init_one(mci_pdev, x38_pci_tbl); | ||
486 | if (pci_rc < 0) { | ||
487 | debugf0("x38 init fail\n"); | ||
488 | pci_rc = -ENODEV; | ||
489 | goto fail1; | ||
490 | } | ||
491 | } | ||
492 | |||
493 | return 0; | ||
494 | |||
495 | fail1: | ||
496 | pci_unregister_driver(&x38_driver); | ||
497 | |||
498 | fail0: | ||
499 | if (mci_pdev) | ||
500 | pci_dev_put(mci_pdev); | ||
501 | |||
502 | return pci_rc; | ||
503 | } | ||
504 | |||
505 | static void __exit x38_exit(void) | ||
506 | { | ||
507 | debugf3("MC: %s()\n", __func__); | ||
508 | |||
509 | pci_unregister_driver(&x38_driver); | ||
510 | if (!x38_registered) { | ||
511 | x38_remove_one(mci_pdev); | ||
512 | pci_dev_put(mci_pdev); | ||
513 | } | ||
514 | } | ||
515 | |||
516 | module_init(x38_init); | ||
517 | module_exit(x38_exit); | ||
518 | |||
519 | MODULE_LICENSE("GPL"); | ||
520 | MODULE_AUTHOR("Cluster Computing, Inc. Hitoshi Mitake"); | ||
521 | MODULE_DESCRIPTION("MC support for Intel X38 memory hub controllers"); | ||
522 | |||
523 | module_param(edac_op_state, int, 0444); | ||
524 | MODULE_PARM_DESC(edac_op_state, "EDAC Error Reporting state: 0=Poll,1=NMI"); | ||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 743e6f8cb202..1903e7515650 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1263,6 +1263,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
1263 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) }, | 1263 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) }, |
1264 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, | 1264 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, |
1265 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, | 1265 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, |
1266 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, | ||
1266 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, | 1267 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, |
1267 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, | 1268 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, |
1268 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | 1269 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
diff --git a/drivers/hid/hid-dell.c b/drivers/hid/hid-dell.c index 1a0d0dfc62fc..f5474300b83a 100644 --- a/drivers/hid/hid-dell.c +++ b/drivers/hid/hid-dell.c | |||
@@ -48,6 +48,7 @@ err_free: | |||
48 | static const struct hid_device_id dell_devices[] = { | 48 | static const struct hid_device_id dell_devices[] = { |
49 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) }, | 49 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658) }, |
50 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, | 50 | { HID_USB_DEVICE(USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_SK8115) }, |
51 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, | ||
51 | { } | 52 | { } |
52 | }; | 53 | }; |
53 | MODULE_DEVICE_TABLE(hid, dell_devices); | 54 | MODULE_DEVICE_TABLE(hid, dell_devices); |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index a0d6a6cb1842..5cc404291736 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -163,6 +163,9 @@ | |||
163 | 163 | ||
164 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc | 164 | #define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc |
165 | 165 | ||
166 | #define USB_VENDOR_ID_GENERIC_13BA 0x13ba | ||
167 | #define USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE 0x0017 | ||
168 | |||
166 | #define USB_VENDOR_ID_GLAB 0x06c2 | 169 | #define USB_VENDOR_ID_GLAB 0x06c2 |
167 | #define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038 | 170 | #define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038 |
168 | #define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039 | 171 | #define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039 |
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 42bdd83444c1..18e5ddd722cd 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/list.h> | 21 | #include <linux/list.h> |
22 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
23 | #include <linux/mutex.h> | ||
23 | #include <linux/smp_lock.h> | 24 | #include <linux/smp_lock.h> |
24 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
25 | #include <asm/unaligned.h> | 26 | #include <asm/unaligned.h> |
@@ -776,21 +777,10 @@ static int usbhid_start(struct hid_device *hid) | |||
776 | struct usb_interface *intf = to_usb_interface(hid->dev.parent); | 777 | struct usb_interface *intf = to_usb_interface(hid->dev.parent); |
777 | struct usb_host_interface *interface = intf->cur_altsetting; | 778 | struct usb_host_interface *interface = intf->cur_altsetting; |
778 | struct usb_device *dev = interface_to_usbdev(intf); | 779 | struct usb_device *dev = interface_to_usbdev(intf); |
779 | struct usbhid_device *usbhid; | 780 | struct usbhid_device *usbhid = hid->driver_data; |
780 | unsigned int n, insize = 0; | 781 | unsigned int n, insize = 0; |
781 | int ret; | 782 | int ret; |
782 | 783 | ||
783 | WARN_ON(hid->driver_data); | ||
784 | |||
785 | usbhid = kzalloc(sizeof(struct usbhid_device), GFP_KERNEL); | ||
786 | if (usbhid == NULL) { | ||
787 | ret = -ENOMEM; | ||
788 | goto err; | ||
789 | } | ||
790 | |||
791 | hid->driver_data = usbhid; | ||
792 | usbhid->hid = hid; | ||
793 | |||
794 | usbhid->bufsize = HID_MIN_BUFFER_SIZE; | 784 | usbhid->bufsize = HID_MIN_BUFFER_SIZE; |
795 | hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize); | 785 | hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize); |
796 | hid_find_max_report(hid, HID_OUTPUT_REPORT, &usbhid->bufsize); | 786 | hid_find_max_report(hid, HID_OUTPUT_REPORT, &usbhid->bufsize); |
@@ -804,6 +794,7 @@ static int usbhid_start(struct hid_device *hid) | |||
804 | if (insize > HID_MAX_BUFFER_SIZE) | 794 | if (insize > HID_MAX_BUFFER_SIZE) |
805 | insize = HID_MAX_BUFFER_SIZE; | 795 | insize = HID_MAX_BUFFER_SIZE; |
806 | 796 | ||
797 | mutex_lock(&usbhid->setup); | ||
807 | if (hid_alloc_buffers(dev, hid)) { | 798 | if (hid_alloc_buffers(dev, hid)) { |
808 | ret = -ENOMEM; | 799 | ret = -ENOMEM; |
809 | goto fail; | 800 | goto fail; |
@@ -888,6 +879,9 @@ static int usbhid_start(struct hid_device *hid) | |||
888 | usbhid_init_reports(hid); | 879 | usbhid_init_reports(hid); |
889 | hid_dump_device(hid); | 880 | hid_dump_device(hid); |
890 | 881 | ||
882 | set_bit(HID_STARTED, &usbhid->iofl); | ||
883 | mutex_unlock(&usbhid->setup); | ||
884 | |||
891 | return 0; | 885 | return 0; |
892 | 886 | ||
893 | fail: | 887 | fail: |
@@ -895,8 +889,7 @@ fail: | |||
895 | usb_free_urb(usbhid->urbout); | 889 | usb_free_urb(usbhid->urbout); |
896 | usb_free_urb(usbhid->urbctrl); | 890 | usb_free_urb(usbhid->urbctrl); |
897 | hid_free_buffers(dev, hid); | 891 | hid_free_buffers(dev, hid); |
898 | kfree(usbhid); | 892 | mutex_unlock(&usbhid->setup); |
899 | err: | ||
900 | return ret; | 893 | return ret; |
901 | } | 894 | } |
902 | 895 | ||
@@ -907,6 +900,8 @@ static void usbhid_stop(struct hid_device *hid) | |||
907 | if (WARN_ON(!usbhid)) | 900 | if (WARN_ON(!usbhid)) |
908 | return; | 901 | return; |
909 | 902 | ||
903 | mutex_lock(&usbhid->setup); | ||
904 | clear_bit(HID_STARTED, &usbhid->iofl); | ||
910 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ | 905 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ |
911 | set_bit(HID_DISCONNECTED, &usbhid->iofl); | 906 | set_bit(HID_DISCONNECTED, &usbhid->iofl); |
912 | spin_unlock_irq(&usbhid->inlock); | 907 | spin_unlock_irq(&usbhid->inlock); |
@@ -931,8 +926,7 @@ static void usbhid_stop(struct hid_device *hid) | |||
931 | usb_free_urb(usbhid->urbout); | 926 | usb_free_urb(usbhid->urbout); |
932 | 927 | ||
933 | hid_free_buffers(hid_to_usb_dev(hid), hid); | 928 | hid_free_buffers(hid_to_usb_dev(hid), hid); |
934 | kfree(usbhid); | 929 | mutex_unlock(&usbhid->setup); |
935 | hid->driver_data = NULL; | ||
936 | } | 930 | } |
937 | 931 | ||
938 | static struct hid_ll_driver usb_hid_driver = { | 932 | static struct hid_ll_driver usb_hid_driver = { |
@@ -947,6 +941,7 @@ static struct hid_ll_driver usb_hid_driver = { | |||
947 | static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) | 941 | static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) |
948 | { | 942 | { |
949 | struct usb_device *dev = interface_to_usbdev(intf); | 943 | struct usb_device *dev = interface_to_usbdev(intf); |
944 | struct usbhid_device *usbhid; | ||
950 | struct hid_device *hid; | 945 | struct hid_device *hid; |
951 | size_t len; | 946 | size_t len; |
952 | int ret; | 947 | int ret; |
@@ -1000,14 +995,26 @@ static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1000 | if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0) | 995 | if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0) |
1001 | hid->uniq[0] = 0; | 996 | hid->uniq[0] = 0; |
1002 | 997 | ||
998 | usbhid = kzalloc(sizeof(*usbhid), GFP_KERNEL); | ||
999 | if (usbhid == NULL) { | ||
1000 | ret = -ENOMEM; | ||
1001 | goto err; | ||
1002 | } | ||
1003 | |||
1004 | hid->driver_data = usbhid; | ||
1005 | usbhid->hid = hid; | ||
1006 | mutex_init(&usbhid->setup); /* needed on suspend/resume */ | ||
1007 | |||
1003 | ret = hid_add_device(hid); | 1008 | ret = hid_add_device(hid); |
1004 | if (ret) { | 1009 | if (ret) { |
1005 | if (ret != -ENODEV) | 1010 | if (ret != -ENODEV) |
1006 | dev_err(&intf->dev, "can't add hid device: %d\n", ret); | 1011 | dev_err(&intf->dev, "can't add hid device: %d\n", ret); |
1007 | goto err; | 1012 | goto err_free; |
1008 | } | 1013 | } |
1009 | 1014 | ||
1010 | return 0; | 1015 | return 0; |
1016 | err_free: | ||
1017 | kfree(usbhid); | ||
1011 | err: | 1018 | err: |
1012 | hid_destroy_device(hid); | 1019 | hid_destroy_device(hid); |
1013 | return ret; | 1020 | return ret; |
@@ -1016,11 +1023,14 @@ err: | |||
1016 | static void hid_disconnect(struct usb_interface *intf) | 1023 | static void hid_disconnect(struct usb_interface *intf) |
1017 | { | 1024 | { |
1018 | struct hid_device *hid = usb_get_intfdata(intf); | 1025 | struct hid_device *hid = usb_get_intfdata(intf); |
1026 | struct usbhid_device *usbhid; | ||
1019 | 1027 | ||
1020 | if (WARN_ON(!hid)) | 1028 | if (WARN_ON(!hid)) |
1021 | return; | 1029 | return; |
1022 | 1030 | ||
1031 | usbhid = hid->driver_data; | ||
1023 | hid_destroy_device(hid); | 1032 | hid_destroy_device(hid); |
1033 | kfree(usbhid); | ||
1024 | } | 1034 | } |
1025 | 1035 | ||
1026 | static int hid_suspend(struct usb_interface *intf, pm_message_t message) | 1036 | static int hid_suspend(struct usb_interface *intf, pm_message_t message) |
@@ -1028,11 +1038,18 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) | |||
1028 | struct hid_device *hid = usb_get_intfdata (intf); | 1038 | struct hid_device *hid = usb_get_intfdata (intf); |
1029 | struct usbhid_device *usbhid = hid->driver_data; | 1039 | struct usbhid_device *usbhid = hid->driver_data; |
1030 | 1040 | ||
1041 | mutex_lock(&usbhid->setup); | ||
1042 | if (!test_bit(HID_STARTED, &usbhid->iofl)) { | ||
1043 | mutex_unlock(&usbhid->setup); | ||
1044 | return 0; | ||
1045 | } | ||
1046 | |||
1031 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ | 1047 | spin_lock_irq(&usbhid->inlock); /* Sync with error handler */ |
1032 | set_bit(HID_SUSPENDED, &usbhid->iofl); | 1048 | set_bit(HID_SUSPENDED, &usbhid->iofl); |
1033 | spin_unlock_irq(&usbhid->inlock); | 1049 | spin_unlock_irq(&usbhid->inlock); |
1034 | del_timer(&usbhid->io_retry); | 1050 | del_timer_sync(&usbhid->io_retry); |
1035 | usb_kill_urb(usbhid->urbin); | 1051 | usb_kill_urb(usbhid->urbin); |
1052 | mutex_unlock(&usbhid->setup); | ||
1036 | dev_dbg(&intf->dev, "suspend\n"); | 1053 | dev_dbg(&intf->dev, "suspend\n"); |
1037 | return 0; | 1054 | return 0; |
1038 | } | 1055 | } |
@@ -1043,9 +1060,16 @@ static int hid_resume(struct usb_interface *intf) | |||
1043 | struct usbhid_device *usbhid = hid->driver_data; | 1060 | struct usbhid_device *usbhid = hid->driver_data; |
1044 | int status; | 1061 | int status; |
1045 | 1062 | ||
1063 | mutex_lock(&usbhid->setup); | ||
1064 | if (!test_bit(HID_STARTED, &usbhid->iofl)) { | ||
1065 | mutex_unlock(&usbhid->setup); | ||
1066 | return 0; | ||
1067 | } | ||
1068 | |||
1046 | clear_bit(HID_SUSPENDED, &usbhid->iofl); | 1069 | clear_bit(HID_SUSPENDED, &usbhid->iofl); |
1047 | usbhid->retry_delay = 0; | 1070 | usbhid->retry_delay = 0; |
1048 | status = hid_start_in(hid); | 1071 | status = hid_start_in(hid); |
1072 | mutex_unlock(&usbhid->setup); | ||
1049 | dev_dbg(&intf->dev, "resume status %d\n", status); | 1073 | dev_dbg(&intf->dev, "resume status %d\n", status); |
1050 | return status; | 1074 | return status; |
1051 | } | 1075 | } |
diff --git a/drivers/hid/usbhid/usbhid.h b/drivers/hid/usbhid/usbhid.h index abedb13c623e..55973ff54008 100644 --- a/drivers/hid/usbhid/usbhid.h +++ b/drivers/hid/usbhid/usbhid.h | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/list.h> | 29 | #include <linux/list.h> |
30 | #include <linux/mutex.h> | ||
30 | #include <linux/timer.h> | 31 | #include <linux/timer.h> |
31 | #include <linux/wait.h> | 32 | #include <linux/wait.h> |
32 | #include <linux/workqueue.h> | 33 | #include <linux/workqueue.h> |
@@ -73,6 +74,7 @@ struct usbhid_device { | |||
73 | dma_addr_t outbuf_dma; /* Output buffer dma */ | 74 | dma_addr_t outbuf_dma; /* Output buffer dma */ |
74 | spinlock_t outlock; /* Output fifo spinlock */ | 75 | spinlock_t outlock; /* Output fifo spinlock */ |
75 | 76 | ||
77 | struct mutex setup; | ||
76 | unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ | 78 | unsigned long iofl; /* I/O flags (CTRL_RUNNING, OUT_RUNNING) */ |
77 | struct timer_list io_retry; /* Retry timer */ | 79 | struct timer_list io_retry; /* Retry timer */ |
78 | unsigned long stop_retry; /* Time to give up, in jiffies */ | 80 | unsigned long stop_retry; /* Time to give up, in jiffies */ |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index c772e02c2803..1fac4e233133 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
@@ -507,7 +507,7 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, struct i2c_msg *msgs, int | |||
507 | unsigned long timeout; | 507 | unsigned long timeout; |
508 | int ret; | 508 | int ret; |
509 | 509 | ||
510 | if (!readl(i2c->regs + S3C2410_IICCON) & S3C2410_IICCON_IRQEN) | 510 | if (!(readl(i2c->regs + S3C2410_IICCON) & S3C2410_IICCON_IRQEN)) |
511 | return -EIO; | 511 | return -EIO; |
512 | 512 | ||
513 | ret = s3c24xx_i2c_set_master(i2c); | 513 | ret = s3c24xx_i2c_set_master(i2c); |
diff --git a/drivers/i2c/busses/scx200_i2c.c b/drivers/i2c/busses/scx200_i2c.c index c3022a023449..e4c98539c517 100644 --- a/drivers/i2c/busses/scx200_i2c.c +++ b/drivers/i2c/busses/scx200_i2c.c | |||
@@ -81,6 +81,7 @@ static struct i2c_algo_bit_data scx200_i2c_data = { | |||
81 | 81 | ||
82 | static struct i2c_adapter scx200_i2c_ops = { | 82 | static struct i2c_adapter scx200_i2c_ops = { |
83 | .owner = THIS_MODULE, | 83 | .owner = THIS_MODULE, |
84 | .class = I2C_CLASS_HWMON | I2C_CLASS_SPD, | ||
84 | .id = I2C_HW_B_SCX200, | 85 | .id = I2C_HW_B_SCX200, |
85 | .algo_data = &scx200_i2c_data, | 86 | .algo_data = &scx200_i2c_data, |
86 | .name = "NatSemi SCx200 I2C", | 87 | .name = "NatSemi SCx200 I2C", |
diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c index 92dcc06832a4..9d7b53ed75b2 100644 --- a/drivers/md/dm-raid1.c +++ b/drivers/md/dm-raid1.c | |||
@@ -656,9 +656,10 @@ static void do_failures(struct mirror_set *ms, struct bio_list *failures) | |||
656 | return; | 656 | return; |
657 | 657 | ||
658 | if (!ms->log_failure) { | 658 | if (!ms->log_failure) { |
659 | while ((bio = bio_list_pop(failures))) | 659 | while ((bio = bio_list_pop(failures))) { |
660 | ms->in_sync = 0; | 660 | ms->in_sync = 0; |
661 | dm_rh_mark_nosync(ms->rh, bio, bio->bi_size, 0); | 661 | dm_rh_mark_nosync(ms->rh, bio, bio->bi_size, 0); |
662 | } | ||
662 | return; | 663 | return; |
663 | } | 664 | } |
664 | 665 | ||
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index b2d9d1ac28ad..6c96db26b87c 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c | |||
@@ -229,19 +229,21 @@ static void __insert_origin(struct origin *o) | |||
229 | */ | 229 | */ |
230 | static int register_snapshot(struct dm_snapshot *snap) | 230 | static int register_snapshot(struct dm_snapshot *snap) |
231 | { | 231 | { |
232 | struct origin *o; | 232 | struct origin *o, *new_o; |
233 | struct block_device *bdev = snap->origin->bdev; | 233 | struct block_device *bdev = snap->origin->bdev; |
234 | 234 | ||
235 | new_o = kmalloc(sizeof(*new_o), GFP_KERNEL); | ||
236 | if (!new_o) | ||
237 | return -ENOMEM; | ||
238 | |||
235 | down_write(&_origins_lock); | 239 | down_write(&_origins_lock); |
236 | o = __lookup_origin(bdev); | 240 | o = __lookup_origin(bdev); |
237 | 241 | ||
238 | if (!o) { | 242 | if (o) |
243 | kfree(new_o); | ||
244 | else { | ||
239 | /* New origin */ | 245 | /* New origin */ |
240 | o = kmalloc(sizeof(*o), GFP_KERNEL); | 246 | o = new_o; |
241 | if (!o) { | ||
242 | up_write(&_origins_lock); | ||
243 | return -ENOMEM; | ||
244 | } | ||
245 | 247 | ||
246 | /* Initialise the struct */ | 248 | /* Initialise the struct */ |
247 | INIT_LIST_HEAD(&o->snapshots); | 249 | INIT_LIST_HEAD(&o->snapshots); |
@@ -368,6 +370,7 @@ static struct dm_snap_pending_exception *alloc_pending_exception(struct dm_snaps | |||
368 | struct dm_snap_pending_exception *pe = mempool_alloc(s->pending_pool, | 370 | struct dm_snap_pending_exception *pe = mempool_alloc(s->pending_pool, |
369 | GFP_NOIO); | 371 | GFP_NOIO); |
370 | 372 | ||
373 | atomic_inc(&s->pending_exceptions_count); | ||
371 | pe->snap = s; | 374 | pe->snap = s; |
372 | 375 | ||
373 | return pe; | 376 | return pe; |
@@ -375,7 +378,11 @@ static struct dm_snap_pending_exception *alloc_pending_exception(struct dm_snaps | |||
375 | 378 | ||
376 | static void free_pending_exception(struct dm_snap_pending_exception *pe) | 379 | static void free_pending_exception(struct dm_snap_pending_exception *pe) |
377 | { | 380 | { |
378 | mempool_free(pe, pe->snap->pending_pool); | 381 | struct dm_snapshot *s = pe->snap; |
382 | |||
383 | mempool_free(pe, s->pending_pool); | ||
384 | smp_mb__before_atomic_dec(); | ||
385 | atomic_dec(&s->pending_exceptions_count); | ||
379 | } | 386 | } |
380 | 387 | ||
381 | static void insert_completed_exception(struct dm_snapshot *s, | 388 | static void insert_completed_exception(struct dm_snapshot *s, |
@@ -600,6 +607,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
600 | 607 | ||
601 | s->valid = 1; | 608 | s->valid = 1; |
602 | s->active = 0; | 609 | s->active = 0; |
610 | atomic_set(&s->pending_exceptions_count, 0); | ||
603 | init_rwsem(&s->lock); | 611 | init_rwsem(&s->lock); |
604 | spin_lock_init(&s->pe_lock); | 612 | spin_lock_init(&s->pe_lock); |
605 | s->ti = ti; | 613 | s->ti = ti; |
@@ -726,6 +734,14 @@ static void snapshot_dtr(struct dm_target *ti) | |||
726 | /* After this returns there can be no new kcopyd jobs. */ | 734 | /* After this returns there can be no new kcopyd jobs. */ |
727 | unregister_snapshot(s); | 735 | unregister_snapshot(s); |
728 | 736 | ||
737 | while (atomic_read(&s->pending_exceptions_count)) | ||
738 | yield(); | ||
739 | /* | ||
740 | * Ensure instructions in mempool_destroy aren't reordered | ||
741 | * before atomic_read. | ||
742 | */ | ||
743 | smp_mb(); | ||
744 | |||
729 | #ifdef CONFIG_DM_DEBUG | 745 | #ifdef CONFIG_DM_DEBUG |
730 | for (i = 0; i < DM_TRACKED_CHUNK_HASH_SIZE; i++) | 746 | for (i = 0; i < DM_TRACKED_CHUNK_HASH_SIZE; i++) |
731 | BUG_ON(!hlist_empty(&s->tracked_chunk_hash[i])); | 747 | BUG_ON(!hlist_empty(&s->tracked_chunk_hash[i])); |
diff --git a/drivers/md/dm-snap.h b/drivers/md/dm-snap.h index f07315fe2362..99c0106ede2d 100644 --- a/drivers/md/dm-snap.h +++ b/drivers/md/dm-snap.h | |||
@@ -160,6 +160,8 @@ struct dm_snapshot { | |||
160 | 160 | ||
161 | mempool_t *pending_pool; | 161 | mempool_t *pending_pool; |
162 | 162 | ||
163 | atomic_t pending_exceptions_count; | ||
164 | |||
163 | struct exception_table pending; | 165 | struct exception_table pending; |
164 | struct exception_table complete; | 166 | struct exception_table complete; |
165 | 167 | ||
diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index 11a617ab4243..84bdc2ee69e6 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c | |||
@@ -567,8 +567,8 @@ static void i2o_block_biosparam(unsigned long capacity, unsigned short *cyls, | |||
567 | 567 | ||
568 | /** | 568 | /** |
569 | * i2o_block_open - Open the block device | 569 | * i2o_block_open - Open the block device |
570 | * @inode: inode for block device being opened | 570 | * @bdev: block device being opened |
571 | * @file: file to open | 571 | * @mode: file open mode |
572 | * | 572 | * |
573 | * Power up the device, mount and lock the media. This function is called, | 573 | * Power up the device, mount and lock the media. This function is called, |
574 | * if the block device is opened for access. | 574 | * if the block device is opened for access. |
@@ -596,8 +596,8 @@ static int i2o_block_open(struct block_device *bdev, fmode_t mode) | |||
596 | 596 | ||
597 | /** | 597 | /** |
598 | * i2o_block_release - Release the I2O block device | 598 | * i2o_block_release - Release the I2O block device |
599 | * @inode: inode for block device being released | 599 | * @disk: gendisk device being released |
600 | * @file: file to close | 600 | * @mode: file open mode |
601 | * | 601 | * |
602 | * Unlock and unmount the media, and power down the device. Gets called if | 602 | * Unlock and unmount the media, and power down the device. Gets called if |
603 | * the block device is closed. | 603 | * the block device is closed. |
@@ -643,8 +643,8 @@ static int i2o_block_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
643 | 643 | ||
644 | /** | 644 | /** |
645 | * i2o_block_ioctl - Issue device specific ioctl calls. | 645 | * i2o_block_ioctl - Issue device specific ioctl calls. |
646 | * @inode: inode for block device ioctl | 646 | * @bdev: block device being opened |
647 | * @file: file for ioctl | 647 | * @mode: file open mode |
648 | * @cmd: ioctl command | 648 | * @cmd: ioctl command |
649 | * @arg: arg | 649 | * @arg: arg |
650 | * | 650 | * |
diff --git a/drivers/misc/hdpuftrs/hdpu_nexus.c b/drivers/misc/hdpuftrs/hdpu_nexus.c index 08e26beefe64..ce39fa54949b 100644 --- a/drivers/misc/hdpuftrs/hdpu_nexus.c +++ b/drivers/misc/hdpuftrs/hdpu_nexus.c | |||
@@ -113,7 +113,6 @@ static int hdpu_nexus_probe(struct platform_device *pdev) | |||
113 | if (!hdpu_chassis_id) | 113 | if (!hdpu_chassis_id) |
114 | printk(KERN_WARNING "sky_nexus: " | 114 | printk(KERN_WARNING "sky_nexus: " |
115 | "Unable to create proc dir entry: sky_chassis_id\n"); | 115 | "Unable to create proc dir entry: sky_chassis_id\n"); |
116 | } | ||
117 | 116 | ||
118 | return 0; | 117 | return 0; |
119 | } | 118 | } |
diff --git a/drivers/misc/sgi-xp/Makefile b/drivers/misc/sgi-xp/Makefile index 35ce28578075..4fc40d8e1bcc 100644 --- a/drivers/misc/sgi-xp/Makefile +++ b/drivers/misc/sgi-xp/Makefile | |||
@@ -5,14 +5,14 @@ | |||
5 | obj-$(CONFIG_SGI_XP) += xp.o | 5 | obj-$(CONFIG_SGI_XP) += xp.o |
6 | xp-y := xp_main.o | 6 | xp-y := xp_main.o |
7 | xp-$(CONFIG_IA64_SGI_SN2) += xp_sn2.o xp_nofault.o | 7 | xp-$(CONFIG_IA64_SGI_SN2) += xp_sn2.o xp_nofault.o |
8 | xp-$(CONFIG_IA64_GENERIC) += xp_sn2.o xp_nofault.o xp_uv.o | 8 | xp-$(CONFIG_IA64_GENERIC) += xp_sn2.o xp_nofault.o |
9 | xp-$(CONFIG_IA64_SGI_UV) += xp_uv.o | 9 | xp-$(CONFIG_IA64_SGI_UV) += xp_uv.o |
10 | xp-$(CONFIG_X86_64) += xp_uv.o | 10 | xp-$(CONFIG_X86_64) += xp_uv.o |
11 | 11 | ||
12 | obj-$(CONFIG_SGI_XP) += xpc.o | 12 | obj-$(CONFIG_SGI_XP) += xpc.o |
13 | xpc-y := xpc_main.o xpc_channel.o xpc_partition.o | 13 | xpc-y := xpc_main.o xpc_channel.o xpc_partition.o |
14 | xpc-$(CONFIG_IA64_SGI_SN2) += xpc_sn2.o | 14 | xpc-$(CONFIG_IA64_SGI_SN2) += xpc_sn2.o |
15 | xpc-$(CONFIG_IA64_GENERIC) += xpc_sn2.o xpc_uv.o | 15 | xpc-$(CONFIG_IA64_GENERIC) += xpc_sn2.o |
16 | xpc-$(CONFIG_IA64_SGI_UV) += xpc_uv.o | 16 | xpc-$(CONFIG_IA64_SGI_UV) += xpc_uv.o |
17 | xpc-$(CONFIG_X86_64) += xpc_uv.o | 17 | xpc-$(CONFIG_X86_64) += xpc_uv.o |
18 | 18 | ||
diff --git a/drivers/misc/sgi-xp/xp.h b/drivers/misc/sgi-xp/xp.h index 859a5281c61b..ed1722e50049 100644 --- a/drivers/misc/sgi-xp/xp.h +++ b/drivers/misc/sgi-xp/xp.h | |||
@@ -19,7 +19,11 @@ | |||
19 | #include <asm/system.h> | 19 | #include <asm/system.h> |
20 | #include <asm/sn/arch.h> /* defines is_shub1() and is_shub2() */ | 20 | #include <asm/sn/arch.h> /* defines is_shub1() and is_shub2() */ |
21 | #define is_shub() ia64_platform_is("sn2") | 21 | #define is_shub() ia64_platform_is("sn2") |
22 | #ifdef CONFIG_IA64_SGI_UV | ||
22 | #define is_uv() ia64_platform_is("uv") | 23 | #define is_uv() ia64_platform_is("uv") |
24 | #else | ||
25 | #define is_uv() 0 | ||
26 | #endif | ||
23 | #endif | 27 | #endif |
24 | #ifdef CONFIG_X86_64 | 28 | #ifdef CONFIG_X86_64 |
25 | #include <asm/genapic.h> | 29 | #include <asm/genapic.h> |
diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c index 46325fc84811..e8d5cfbd32c2 100644 --- a/drivers/misc/sgi-xp/xpc_main.c +++ b/drivers/misc/sgi-xp/xpc_main.c | |||
@@ -1104,7 +1104,7 @@ xpc_do_exit(enum xp_retval reason) | |||
1104 | 1104 | ||
1105 | if (is_shub()) | 1105 | if (is_shub()) |
1106 | xpc_exit_sn2(); | 1106 | xpc_exit_sn2(); |
1107 | else | 1107 | else if (is_uv()) |
1108 | xpc_exit_uv(); | 1108 | xpc_exit_uv(); |
1109 | } | 1109 | } |
1110 | 1110 | ||
@@ -1363,7 +1363,7 @@ out_2: | |||
1363 | out_1: | 1363 | out_1: |
1364 | if (is_shub()) | 1364 | if (is_shub()) |
1365 | xpc_exit_sn2(); | 1365 | xpc_exit_sn2(); |
1366 | else | 1366 | else if (is_uv()) |
1367 | xpc_exit_uv(); | 1367 | xpc_exit_uv(); |
1368 | return ret; | 1368 | return ret; |
1369 | } | 1369 | } |
diff --git a/drivers/misc/sony-laptop.c b/drivers/misc/sony-laptop.c index 5a97d3a9d745..f483c4221f76 100644 --- a/drivers/misc/sony-laptop.c +++ b/drivers/misc/sony-laptop.c | |||
@@ -2315,8 +2315,10 @@ end: | |||
2315 | */ | 2315 | */ |
2316 | static int sony_pic_disable(struct acpi_device *device) | 2316 | static int sony_pic_disable(struct acpi_device *device) |
2317 | { | 2317 | { |
2318 | if (ACPI_FAILURE(acpi_evaluate_object(device->handle, | 2318 | acpi_status ret = acpi_evaluate_object(device->handle, "_DIS", NULL, |
2319 | "_DIS", NULL, NULL))) | 2319 | NULL); |
2320 | |||
2321 | if (ACPI_FAILURE(ret) && ret != AE_NOT_FOUND) | ||
2320 | return -ENXIO; | 2322 | return -ENXIO; |
2321 | 2323 | ||
2322 | dprintk("Device disabled\n"); | 2324 | dprintk("Device disabled\n"); |
diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c index c54967f7942a..ba1be0b3a8c8 100644 --- a/drivers/net/amd8111e.c +++ b/drivers/net/amd8111e.c | |||
@@ -833,12 +833,14 @@ static int amd8111e_rx_poll(struct napi_struct *napi, int budget) | |||
833 | 833 | ||
834 | } while(intr0 & RINT0); | 834 | } while(intr0 & RINT0); |
835 | 835 | ||
836 | /* Receive descriptor is empty now */ | 836 | if (rx_pkt_limit > 0) { |
837 | spin_lock_irqsave(&lp->lock, flags); | 837 | /* Receive descriptor is empty now */ |
838 | __netif_rx_complete(dev, napi); | 838 | spin_lock_irqsave(&lp->lock, flags); |
839 | writel(VAL0|RINTEN0, mmio + INTEN0); | 839 | __netif_rx_complete(dev, napi); |
840 | writel(VAL2 | RDMD0, mmio + CMD0); | 840 | writel(VAL0|RINTEN0, mmio + INTEN0); |
841 | spin_unlock_irqrestore(&lp->lock, flags); | 841 | writel(VAL2 | RDMD0, mmio + CMD0); |
842 | spin_unlock_irqrestore(&lp->lock, flags); | ||
843 | } | ||
842 | 844 | ||
843 | rx_not_empty: | 845 | rx_not_empty: |
844 | return num_rx_pkt; | 846 | return num_rx_pkt; |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 82dd1a891ce7..002d918fb4c7 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
@@ -40,7 +40,7 @@ | |||
40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
41 | 41 | ||
42 | #define DRV_NAME "ehea" | 42 | #define DRV_NAME "ehea" |
43 | #define DRV_VERSION "EHEA_0094" | 43 | #define DRV_VERSION "EHEA_0095" |
44 | 44 | ||
45 | /* eHEA capability flags */ | 45 | /* eHEA capability flags */ |
46 | #define DLPAR_PORT_ADD_REM 1 | 46 | #define DLPAR_PORT_ADD_REM 1 |
diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c index 9b61dc9865d1..9d006878f045 100644 --- a/drivers/net/ehea/ehea_qmr.c +++ b/drivers/net/ehea/ehea_qmr.c | |||
@@ -632,10 +632,13 @@ static void ehea_rebuild_busmap(void) | |||
632 | } | 632 | } |
633 | } | 633 | } |
634 | 634 | ||
635 | static int ehea_update_busmap(unsigned long pfn, unsigned long pgnum, int add) | 635 | static int ehea_update_busmap(unsigned long pfn, unsigned long nr_pages, int add) |
636 | { | 636 | { |
637 | unsigned long i, start_section, end_section; | 637 | unsigned long i, start_section, end_section; |
638 | 638 | ||
639 | if (!nr_pages) | ||
640 | return 0; | ||
641 | |||
639 | if (!ehea_bmap) { | 642 | if (!ehea_bmap) { |
640 | ehea_bmap = kzalloc(sizeof(struct ehea_bmap), GFP_KERNEL); | 643 | ehea_bmap = kzalloc(sizeof(struct ehea_bmap), GFP_KERNEL); |
641 | if (!ehea_bmap) | 644 | if (!ehea_bmap) |
@@ -643,7 +646,7 @@ static int ehea_update_busmap(unsigned long pfn, unsigned long pgnum, int add) | |||
643 | } | 646 | } |
644 | 647 | ||
645 | start_section = (pfn * PAGE_SIZE) / EHEA_SECTSIZE; | 648 | start_section = (pfn * PAGE_SIZE) / EHEA_SECTSIZE; |
646 | end_section = start_section + ((pgnum * PAGE_SIZE) / EHEA_SECTSIZE); | 649 | end_section = start_section + ((nr_pages * PAGE_SIZE) / EHEA_SECTSIZE); |
647 | /* Mark entries as valid or invalid only; address is assigned later */ | 650 | /* Mark entries as valid or invalid only; address is assigned later */ |
648 | for (i = start_section; i < end_section; i++) { | 651 | for (i = start_section; i < end_section; i++) { |
649 | u64 flag; | 652 | u64 flag; |
@@ -692,10 +695,54 @@ int ehea_rem_sect_bmap(unsigned long pfn, unsigned long nr_pages) | |||
692 | return ret; | 695 | return ret; |
693 | } | 696 | } |
694 | 697 | ||
695 | static int ehea_create_busmap_callback(unsigned long pfn, | 698 | static int ehea_is_hugepage(unsigned long pfn) |
696 | unsigned long nr_pages, void *arg) | 699 | { |
700 | int page_order; | ||
701 | |||
702 | if (pfn & EHEA_HUGEPAGE_PFN_MASK) | ||
703 | return 0; | ||
704 | |||
705 | page_order = compound_order(pfn_to_page(pfn)); | ||
706 | if (page_order + PAGE_SHIFT != EHEA_HUGEPAGESHIFT) | ||
707 | return 0; | ||
708 | |||
709 | return 1; | ||
710 | } | ||
711 | |||
712 | static int ehea_create_busmap_callback(unsigned long initial_pfn, | ||
713 | unsigned long total_nr_pages, void *arg) | ||
697 | { | 714 | { |
698 | return ehea_update_busmap(pfn, nr_pages, EHEA_BUSMAP_ADD_SECT); | 715 | int ret; |
716 | unsigned long pfn, start_pfn, end_pfn, nr_pages; | ||
717 | |||
718 | if ((total_nr_pages * PAGE_SIZE) < EHEA_HUGEPAGE_SIZE) | ||
719 | return ehea_update_busmap(initial_pfn, total_nr_pages, | ||
720 | EHEA_BUSMAP_ADD_SECT); | ||
721 | |||
722 | /* Given chunk is >= 16GB -> check for hugepages */ | ||
723 | start_pfn = initial_pfn; | ||
724 | end_pfn = initial_pfn + total_nr_pages; | ||
725 | pfn = start_pfn; | ||
726 | |||
727 | while (pfn < end_pfn) { | ||
728 | if (ehea_is_hugepage(pfn)) { | ||
729 | /* Add mem found in front of the hugepage */ | ||
730 | nr_pages = pfn - start_pfn; | ||
731 | ret = ehea_update_busmap(start_pfn, nr_pages, | ||
732 | EHEA_BUSMAP_ADD_SECT); | ||
733 | if (ret) | ||
734 | return ret; | ||
735 | |||
736 | /* Skip the hugepage */ | ||
737 | pfn += (EHEA_HUGEPAGE_SIZE / PAGE_SIZE); | ||
738 | start_pfn = pfn; | ||
739 | } else | ||
740 | pfn += (EHEA_SECTSIZE / PAGE_SIZE); | ||
741 | } | ||
742 | |||
743 | /* Add mem found behind the hugepage(s) */ | ||
744 | nr_pages = pfn - start_pfn; | ||
745 | return ehea_update_busmap(start_pfn, nr_pages, EHEA_BUSMAP_ADD_SECT); | ||
699 | } | 746 | } |
700 | 747 | ||
701 | int ehea_create_busmap(void) | 748 | int ehea_create_busmap(void) |
diff --git a/drivers/net/ehea/ehea_qmr.h b/drivers/net/ehea/ehea_qmr.h index 1e58dc06b7d2..0817c1e74a19 100644 --- a/drivers/net/ehea/ehea_qmr.h +++ b/drivers/net/ehea/ehea_qmr.h | |||
@@ -40,6 +40,9 @@ | |||
40 | #define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT) | 40 | #define EHEA_PAGESIZE (1UL << EHEA_PAGESHIFT) |
41 | #define EHEA_SECTSIZE (1UL << 24) | 41 | #define EHEA_SECTSIZE (1UL << 24) |
42 | #define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT) | 42 | #define EHEA_PAGES_PER_SECTION (EHEA_SECTSIZE >> EHEA_PAGESHIFT) |
43 | #define EHEA_HUGEPAGESHIFT 34 | ||
44 | #define EHEA_HUGEPAGE_SIZE (1UL << EHEA_HUGEPAGESHIFT) | ||
45 | #define EHEA_HUGEPAGE_PFN_MASK ((EHEA_HUGEPAGE_SIZE - 1) >> PAGE_SHIFT) | ||
43 | 46 | ||
44 | #if ((1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE) | 47 | #if ((1UL << SECTION_SIZE_BITS) < EHEA_SECTSIZE) |
45 | #error eHEA module cannot work if kernel sectionsize < ehea sectionsize | 48 | #error eHEA module cannot work if kernel sectionsize < ehea sectionsize |
diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index 2ee2622258f5..901212aa37cb 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c | |||
@@ -2605,7 +2605,7 @@ static int __devinit emac_init_config(struct emac_instance *dev) | |||
2605 | of_device_is_compatible(np, "ibm,emac-440gr")) | 2605 | of_device_is_compatible(np, "ibm,emac-440gr")) |
2606 | dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX; | 2606 | dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX; |
2607 | if (of_device_is_compatible(np, "ibm,emac-405ez")) { | 2607 | if (of_device_is_compatible(np, "ibm,emac-405ez")) { |
2608 | #ifdef CONFIG_IBM_NEW_EMAC_NO_FLOW_CONTROL | 2608 | #ifdef CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL |
2609 | dev->features |= EMAC_FTR_NO_FLOW_CONTROL_40x; | 2609 | dev->features |= EMAC_FTR_NO_FLOW_CONTROL_40x; |
2610 | #else | 2610 | #else |
2611 | printk(KERN_ERR "%s: Flow control not disabled!\n", | 2611 | printk(KERN_ERR "%s: Flow control not disabled!\n", |
diff --git a/drivers/net/mlx4/en_main.c b/drivers/net/mlx4/en_main.c index 1b0eebf84f76..4b9794e97a79 100644 --- a/drivers/net/mlx4/en_main.c +++ b/drivers/net/mlx4/en_main.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
36 | #include <linux/delay.h> | 36 | #include <linux/delay.h> |
37 | #include <linux/netdevice.h> | 37 | #include <linux/netdevice.h> |
38 | #include <linux/cpumask.h> | ||
39 | 38 | ||
40 | #include <linux/mlx4/driver.h> | 39 | #include <linux/mlx4/driver.h> |
41 | #include <linux/mlx4/device.h> | 40 | #include <linux/mlx4/device.h> |
diff --git a/drivers/net/mlx4/fw.c b/drivers/net/mlx4/fw.c index be09fdb79cb8..cee199ceba2f 100644 --- a/drivers/net/mlx4/fw.c +++ b/drivers/net/mlx4/fw.c | |||
@@ -360,9 +360,9 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap) | |||
360 | #define QUERY_PORT_ETH_MTU_OFFSET 0x02 | 360 | #define QUERY_PORT_ETH_MTU_OFFSET 0x02 |
361 | #define QUERY_PORT_WIDTH_OFFSET 0x06 | 361 | #define QUERY_PORT_WIDTH_OFFSET 0x06 |
362 | #define QUERY_PORT_MAX_GID_PKEY_OFFSET 0x07 | 362 | #define QUERY_PORT_MAX_GID_PKEY_OFFSET 0x07 |
363 | #define QUERY_PORT_MAC_OFFSET 0x08 | ||
364 | #define QUERY_PORT_MAX_MACVLAN_OFFSET 0x0a | 363 | #define QUERY_PORT_MAX_MACVLAN_OFFSET 0x0a |
365 | #define QUERY_PORT_MAX_VL_OFFSET 0x0b | 364 | #define QUERY_PORT_MAX_VL_OFFSET 0x0b |
365 | #define QUERY_PORT_MAC_OFFSET 0x10 | ||
366 | 366 | ||
367 | for (i = 1; i <= dev_cap->num_ports; ++i) { | 367 | for (i = 1; i <= dev_cap->num_ports; ++i) { |
368 | err = mlx4_cmd_box(dev, 0, mailbox->dma, i, 0, MLX4_CMD_QUERY_PORT, | 368 | err = mlx4_cmd_box(dev, 0, mailbox->dma, i, 0, MLX4_CMD_QUERY_PORT, |
diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c index 8e46a513a252..c91852f49a48 100644 --- a/drivers/net/tulip/dmfe.c +++ b/drivers/net/tulip/dmfe.c | |||
@@ -420,9 +420,13 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, | |||
420 | /* Allocate Tx/Rx descriptor memory */ | 420 | /* Allocate Tx/Rx descriptor memory */ |
421 | db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * | 421 | db->desc_pool_ptr = pci_alloc_consistent(pdev, sizeof(struct tx_desc) * |
422 | DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr); | 422 | DESC_ALL_CNT + 0x20, &db->desc_pool_dma_ptr); |
423 | if (!db->desc_pool_ptr) | ||
424 | goto err_out_res; | ||
423 | 425 | ||
424 | db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC * | 426 | db->buf_pool_ptr = pci_alloc_consistent(pdev, TX_BUF_ALLOC * |
425 | TX_DESC_CNT + 4, &db->buf_pool_dma_ptr); | 427 | TX_DESC_CNT + 4, &db->buf_pool_dma_ptr); |
428 | if (!db->buf_pool_ptr) | ||
429 | goto err_out_free_desc; | ||
426 | 430 | ||
427 | db->first_tx_desc = (struct tx_desc *) db->desc_pool_ptr; | 431 | db->first_tx_desc = (struct tx_desc *) db->desc_pool_ptr; |
428 | db->first_tx_desc_dma = db->desc_pool_dma_ptr; | 432 | db->first_tx_desc_dma = db->desc_pool_dma_ptr; |
@@ -469,7 +473,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, | |||
469 | 473 | ||
470 | err = register_netdev (dev); | 474 | err = register_netdev (dev); |
471 | if (err) | 475 | if (err) |
472 | goto err_out_res; | 476 | goto err_out_free_buf; |
473 | 477 | ||
474 | printk(KERN_INFO "%s: Davicom DM%04lx at pci%s, " | 478 | printk(KERN_INFO "%s: Davicom DM%04lx at pci%s, " |
475 | "%s, irq %d.\n", | 479 | "%s, irq %d.\n", |
@@ -483,6 +487,12 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, | |||
483 | 487 | ||
484 | return 0; | 488 | return 0; |
485 | 489 | ||
490 | err_out_free_buf: | ||
491 | pci_free_consistent(pdev, TX_BUF_ALLOC * TX_DESC_CNT + 4, | ||
492 | db->buf_pool_ptr, db->buf_pool_dma_ptr); | ||
493 | err_out_free_desc: | ||
494 | pci_free_consistent(pdev, sizeof(struct tx_desc) * DESC_ALL_CNT + 0x20, | ||
495 | db->desc_pool_ptr, db->desc_pool_dma_ptr); | ||
486 | err_out_res: | 496 | err_out_res: |
487 | pci_release_regions(pdev); | 497 | pci_release_regions(pdev); |
488 | err_out_disable: | 498 | err_out_disable: |
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 78df2be8a728..db3377dae9d5 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c | |||
@@ -396,6 +396,20 @@ static void dm9601_set_multicast(struct net_device *net) | |||
396 | dm_write_reg_async(dev, DM_RX_CTRL, rx_ctl); | 396 | dm_write_reg_async(dev, DM_RX_CTRL, rx_ctl); |
397 | } | 397 | } |
398 | 398 | ||
399 | static int dm9601_set_mac_address(struct net_device *net, void *p) | ||
400 | { | ||
401 | struct sockaddr *addr = p; | ||
402 | struct usbnet *dev = netdev_priv(net); | ||
403 | |||
404 | if (!is_valid_ether_addr(addr->sa_data)) | ||
405 | return -EINVAL; | ||
406 | |||
407 | memcpy(net->dev_addr, addr->sa_data, net->addr_len); | ||
408 | dm_write_async(dev, DM_PHY_ADDR, net->addr_len, net->dev_addr); | ||
409 | |||
410 | return 0; | ||
411 | } | ||
412 | |||
399 | static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf) | 413 | static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf) |
400 | { | 414 | { |
401 | int ret; | 415 | int ret; |
@@ -406,6 +420,7 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf) | |||
406 | 420 | ||
407 | dev->net->do_ioctl = dm9601_ioctl; | 421 | dev->net->do_ioctl = dm9601_ioctl; |
408 | dev->net->set_multicast_list = dm9601_set_multicast; | 422 | dev->net->set_multicast_list = dm9601_set_multicast; |
423 | dev->net->set_mac_address = dm9601_set_mac_address; | ||
409 | dev->net->ethtool_ops = &dm9601_ethtool_ops; | 424 | dev->net->ethtool_ops = &dm9601_ethtool_ops; |
410 | dev->net->hard_header_len += DM_TX_OVERHEAD; | 425 | dev->net->hard_header_len += DM_TX_OVERHEAD; |
411 | dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; | 426 | dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; |
diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index 2dced383bcfb..3590ea5a902d 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c | |||
@@ -521,7 +521,7 @@ static void __devexit velocity_remove1(struct pci_dev *pdev) | |||
521 | * we don't duplicate code for each option. | 521 | * we don't duplicate code for each option. |
522 | */ | 522 | */ |
523 | 523 | ||
524 | static void __devinit velocity_set_int_opt(int *opt, int val, int min, int max, int def, char *name, char *devname) | 524 | static void __devinit velocity_set_int_opt(int *opt, int val, int min, int max, int def, char *name, const char *devname) |
525 | { | 525 | { |
526 | if (val == -1) | 526 | if (val == -1) |
527 | *opt = def; | 527 | *opt = def; |
@@ -550,7 +550,7 @@ static void __devinit velocity_set_int_opt(int *opt, int val, int min, int max, | |||
550 | * we don't duplicate code for each option. | 550 | * we don't duplicate code for each option. |
551 | */ | 551 | */ |
552 | 552 | ||
553 | static void __devinit velocity_set_bool_opt(u32 * opt, int val, int def, u32 flag, char *name, char *devname) | 553 | static void __devinit velocity_set_bool_opt(u32 * opt, int val, int def, u32 flag, char *name, const char *devname) |
554 | { | 554 | { |
555 | (*opt) &= (~flag); | 555 | (*opt) &= (~flag); |
556 | if (val == -1) | 556 | if (val == -1) |
@@ -576,7 +576,7 @@ static void __devinit velocity_set_bool_opt(u32 * opt, int val, int def, u32 fla | |||
576 | * for the current device | 576 | * for the current device |
577 | */ | 577 | */ |
578 | 578 | ||
579 | static void __devinit velocity_get_options(struct velocity_opt *opts, int index, char *devname) | 579 | static void __devinit velocity_get_options(struct velocity_opt *opts, int index, const char *devname) |
580 | { | 580 | { |
581 | 581 | ||
582 | velocity_set_int_opt(&opts->rx_thresh, rx_thresh[index], RX_THRESH_MIN, RX_THRESH_MAX, RX_THRESH_DEF, "rx_thresh", devname); | 582 | velocity_set_int_opt(&opts->rx_thresh, rx_thresh[index], RX_THRESH_MIN, RX_THRESH_MAX, RX_THRESH_DEF, "rx_thresh", devname); |
@@ -863,6 +863,7 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi | |||
863 | static int first = 1; | 863 | static int first = 1; |
864 | struct net_device *dev; | 864 | struct net_device *dev; |
865 | int i; | 865 | int i; |
866 | const char *drv_string; | ||
866 | const struct velocity_info_tbl *info = &chip_info_table[ent->driver_data]; | 867 | const struct velocity_info_tbl *info = &chip_info_table[ent->driver_data]; |
867 | struct velocity_info *vptr; | 868 | struct velocity_info *vptr; |
868 | struct mac_regs __iomem * regs; | 869 | struct mac_regs __iomem * regs; |
@@ -935,7 +936,9 @@ static int __devinit velocity_found1(struct pci_dev *pdev, const struct pci_devi | |||
935 | dev->dev_addr[i] = readb(®s->PAR[i]); | 936 | dev->dev_addr[i] = readb(®s->PAR[i]); |
936 | 937 | ||
937 | 938 | ||
938 | velocity_get_options(&vptr->options, velocity_nics, dev->name); | 939 | drv_string = dev_driver_string(&pdev->dev); |
940 | |||
941 | velocity_get_options(&vptr->options, velocity_nics, drv_string); | ||
939 | 942 | ||
940 | /* | 943 | /* |
941 | * Mask out the options cannot be set to the chip | 944 | * Mask out the options cannot be set to the chip |
diff --git a/drivers/net/wan/syncppp.c b/drivers/net/wan/syncppp.c index 327d58589e12..6e92f7b44b1a 100644 --- a/drivers/net/wan/syncppp.c +++ b/drivers/net/wan/syncppp.c | |||
@@ -756,10 +756,11 @@ static void sppp_cisco_input (struct sppp *sp, struct sk_buff *skb) | |||
756 | case CISCO_ADDR_REQ: | 756 | case CISCO_ADDR_REQ: |
757 | /* Stolen from net/ipv4/devinet.c -- SIOCGIFADDR ioctl */ | 757 | /* Stolen from net/ipv4/devinet.c -- SIOCGIFADDR ioctl */ |
758 | { | 758 | { |
759 | struct in_device *in_dev; | ||
760 | struct in_ifaddr *ifa; | ||
761 | __be32 addr = 0, mask = htonl(~0U); /* FIXME: is the mask correct? */ | 759 | __be32 addr = 0, mask = htonl(~0U); /* FIXME: is the mask correct? */ |
762 | #ifdef CONFIG_INET | 760 | #ifdef CONFIG_INET |
761 | struct in_device *in_dev; | ||
762 | struct in_ifaddr *ifa; | ||
763 | |||
763 | rcu_read_lock(); | 764 | rcu_read_lock(); |
764 | if ((in_dev = __in_dev_get_rcu(dev)) != NULL) | 765 | if ((in_dev = __in_dev_get_rcu(dev)) != NULL) |
765 | { | 766 | { |
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index 0f1d6bdd51a2..cfd4d052d666 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c | |||
@@ -661,8 +661,7 @@ ath5k_pci_resume(struct pci_dev *pdev) | |||
661 | { | 661 | { |
662 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); | 662 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); |
663 | struct ath5k_softc *sc = hw->priv; | 663 | struct ath5k_softc *sc = hw->priv; |
664 | struct ath5k_hw *ah = sc->ah; | 664 | int err; |
665 | int i, err; | ||
666 | 665 | ||
667 | pci_restore_state(pdev); | 666 | pci_restore_state(pdev); |
668 | 667 | ||
@@ -688,16 +687,6 @@ ath5k_pci_resume(struct pci_dev *pdev) | |||
688 | goto err_irq; | 687 | goto err_irq; |
689 | ath5k_led_enable(sc); | 688 | ath5k_led_enable(sc); |
690 | 689 | ||
691 | /* | ||
692 | * Reset the key cache since some parts do not | ||
693 | * reset the contents on initial power up or resume. | ||
694 | * | ||
695 | * FIXME: This may need to be revisited when mac80211 becomes | ||
696 | * aware of suspend/resume. | ||
697 | */ | ||
698 | for (i = 0; i < AR5K_KEYTABLE_SIZE; i++) | ||
699 | ath5k_hw_reset_key(ah, i); | ||
700 | |||
701 | return 0; | 690 | return 0; |
702 | err_irq: | 691 | err_irq: |
703 | free_irq(pdev->irq, sc); | 692 | free_irq(pdev->irq, sc); |
@@ -718,7 +707,6 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw) | |||
718 | struct ath5k_softc *sc = hw->priv; | 707 | struct ath5k_softc *sc = hw->priv; |
719 | struct ath5k_hw *ah = sc->ah; | 708 | struct ath5k_hw *ah = sc->ah; |
720 | u8 mac[ETH_ALEN]; | 709 | u8 mac[ETH_ALEN]; |
721 | unsigned int i; | ||
722 | int ret; | 710 | int ret; |
723 | 711 | ||
724 | ATH5K_DBG(sc, ATH5K_DEBUG_ANY, "devid 0x%x\n", pdev->device); | 712 | ATH5K_DBG(sc, ATH5K_DEBUG_ANY, "devid 0x%x\n", pdev->device); |
@@ -737,13 +725,6 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw) | |||
737 | __set_bit(ATH_STAT_MRRETRY, sc->status); | 725 | __set_bit(ATH_STAT_MRRETRY, sc->status); |
738 | 726 | ||
739 | /* | 727 | /* |
740 | * Reset the key cache since some parts do not | ||
741 | * reset the contents on initial power up. | ||
742 | */ | ||
743 | for (i = 0; i < AR5K_KEYTABLE_SIZE; i++) | ||
744 | ath5k_hw_reset_key(ah, i); | ||
745 | |||
746 | /* | ||
747 | * Collect the channel list. The 802.11 layer | 728 | * Collect the channel list. The 802.11 layer |
748 | * is resposible for filtering this list based | 729 | * is resposible for filtering this list based |
749 | * on settings like the phy mode and regulatory | 730 | * on settings like the phy mode and regulatory |
@@ -2202,7 +2183,8 @@ ath5k_beacon_config(struct ath5k_softc *sc) | |||
2202 | static int | 2183 | static int |
2203 | ath5k_init(struct ath5k_softc *sc, bool is_resume) | 2184 | ath5k_init(struct ath5k_softc *sc, bool is_resume) |
2204 | { | 2185 | { |
2205 | int ret; | 2186 | struct ath5k_hw *ah = sc->ah; |
2187 | int ret, i; | ||
2206 | 2188 | ||
2207 | mutex_lock(&sc->lock); | 2189 | mutex_lock(&sc->lock); |
2208 | 2190 | ||
@@ -2235,10 +2217,17 @@ ath5k_init(struct ath5k_softc *sc, bool is_resume) | |||
2235 | if (ret) | 2217 | if (ret) |
2236 | goto done; | 2218 | goto done; |
2237 | 2219 | ||
2220 | /* | ||
2221 | * Reset the key cache since some parts do not reset the | ||
2222 | * contents on initial power up or resume from suspend. | ||
2223 | */ | ||
2224 | for (i = 0; i < AR5K_KEYTABLE_SIZE; i++) | ||
2225 | ath5k_hw_reset_key(ah, i); | ||
2226 | |||
2238 | __set_bit(ATH_STAT_STARTED, sc->status); | 2227 | __set_bit(ATH_STAT_STARTED, sc->status); |
2239 | 2228 | ||
2240 | /* Set ack to be sent at low bit-rates */ | 2229 | /* Set ack to be sent at low bit-rates */ |
2241 | ath5k_hw_set_ack_bitrate_high(sc->ah, false); | 2230 | ath5k_hw_set_ack_bitrate_high(ah, false); |
2242 | 2231 | ||
2243 | mod_timer(&sc->calib_tim, round_jiffies(jiffies + | 2232 | mod_timer(&sc->calib_tim, round_jiffies(jiffies + |
2244 | msecs_to_jiffies(ath5k_calinterval * 1000))); | 2233 | msecs_to_jiffies(ath5k_calinterval * 1000))); |
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 2d022f83774c..827ca0384a4c 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -319,7 +319,7 @@ static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) | |||
319 | void *tmp; | 319 | void *tmp; |
320 | int err; | 320 | int err; |
321 | u8 *end = (u8 *)eeprom + len; | 321 | u8 *end = (u8 *)eeprom + len; |
322 | u16 synth; | 322 | u16 synth = 0; |
323 | DECLARE_MAC_BUF(mac); | 323 | DECLARE_MAC_BUF(mac); |
324 | 324 | ||
325 | wrap = (struct eeprom_pda_wrap *) eeprom; | 325 | wrap = (struct eeprom_pda_wrap *) eeprom; |
@@ -422,7 +422,8 @@ static int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) | |||
422 | entry = (void *)entry + (entry_len + 1)*2; | 422 | entry = (void *)entry + (entry_len + 1)*2; |
423 | } | 423 | } |
424 | 424 | ||
425 | if (!priv->iq_autocal || !priv->output_limit || !priv->curve_data) { | 425 | if (!synth || !priv->iq_autocal || !priv->output_limit || |
426 | !priv->curve_data) { | ||
426 | printk(KERN_ERR "p54: not all required entries found in eeprom!\n"); | 427 | printk(KERN_ERR "p54: not all required entries found in eeprom!\n"); |
427 | err = -EINVAL; | 428 | err = -EINVAL; |
428 | goto err; | 429 | goto err; |
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c index 1c2a02a741af..88b3cad8b65e 100644 --- a/drivers/net/wireless/p54/p54pci.c +++ b/drivers/net/wireless/p54/p54pci.c | |||
@@ -346,68 +346,6 @@ static void p54p_tx(struct ieee80211_hw *dev, struct p54_control_hdr *data, | |||
346 | printk(KERN_INFO "%s: tx overflow.\n", wiphy_name(dev->wiphy)); | 346 | printk(KERN_INFO "%s: tx overflow.\n", wiphy_name(dev->wiphy)); |
347 | } | 347 | } |
348 | 348 | ||
349 | static int p54p_open(struct ieee80211_hw *dev) | ||
350 | { | ||
351 | struct p54p_priv *priv = dev->priv; | ||
352 | int err; | ||
353 | |||
354 | init_completion(&priv->boot_comp); | ||
355 | err = request_irq(priv->pdev->irq, &p54p_interrupt, | ||
356 | IRQF_SHARED, "p54pci", dev); | ||
357 | if (err) { | ||
358 | printk(KERN_ERR "%s: failed to register IRQ handler\n", | ||
359 | wiphy_name(dev->wiphy)); | ||
360 | return err; | ||
361 | } | ||
362 | |||
363 | memset(priv->ring_control, 0, sizeof(*priv->ring_control)); | ||
364 | err = p54p_upload_firmware(dev); | ||
365 | if (err) { | ||
366 | free_irq(priv->pdev->irq, dev); | ||
367 | return err; | ||
368 | } | ||
369 | priv->rx_idx_data = priv->tx_idx_data = 0; | ||
370 | priv->rx_idx_mgmt = priv->tx_idx_mgmt = 0; | ||
371 | |||
372 | p54p_refill_rx_ring(dev, 0, priv->ring_control->rx_data, | ||
373 | ARRAY_SIZE(priv->ring_control->rx_data), priv->rx_buf_data); | ||
374 | |||
375 | p54p_refill_rx_ring(dev, 2, priv->ring_control->rx_mgmt, | ||
376 | ARRAY_SIZE(priv->ring_control->rx_mgmt), priv->rx_buf_mgmt); | ||
377 | |||
378 | P54P_WRITE(ring_control_base, cpu_to_le32(priv->ring_control_dma)); | ||
379 | P54P_READ(ring_control_base); | ||
380 | wmb(); | ||
381 | udelay(10); | ||
382 | |||
383 | P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_INIT)); | ||
384 | P54P_READ(int_enable); | ||
385 | wmb(); | ||
386 | udelay(10); | ||
387 | |||
388 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET)); | ||
389 | P54P_READ(dev_int); | ||
390 | |||
391 | if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) { | ||
392 | printk(KERN_ERR "%s: Cannot boot firmware!\n", | ||
393 | wiphy_name(dev->wiphy)); | ||
394 | free_irq(priv->pdev->irq, dev); | ||
395 | return -ETIMEDOUT; | ||
396 | } | ||
397 | |||
398 | P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_UPDATE)); | ||
399 | P54P_READ(int_enable); | ||
400 | wmb(); | ||
401 | udelay(10); | ||
402 | |||
403 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE)); | ||
404 | P54P_READ(dev_int); | ||
405 | wmb(); | ||
406 | udelay(10); | ||
407 | |||
408 | return 0; | ||
409 | } | ||
410 | |||
411 | static void p54p_stop(struct ieee80211_hw *dev) | 349 | static void p54p_stop(struct ieee80211_hw *dev) |
412 | { | 350 | { |
413 | struct p54p_priv *priv = dev->priv; | 351 | struct p54p_priv *priv = dev->priv; |
@@ -474,6 +412,68 @@ static void p54p_stop(struct ieee80211_hw *dev) | |||
474 | memset(ring_control, 0, sizeof(*ring_control)); | 412 | memset(ring_control, 0, sizeof(*ring_control)); |
475 | } | 413 | } |
476 | 414 | ||
415 | static int p54p_open(struct ieee80211_hw *dev) | ||
416 | { | ||
417 | struct p54p_priv *priv = dev->priv; | ||
418 | int err; | ||
419 | |||
420 | init_completion(&priv->boot_comp); | ||
421 | err = request_irq(priv->pdev->irq, &p54p_interrupt, | ||
422 | IRQF_SHARED, "p54pci", dev); | ||
423 | if (err) { | ||
424 | printk(KERN_ERR "%s: failed to register IRQ handler\n", | ||
425 | wiphy_name(dev->wiphy)); | ||
426 | return err; | ||
427 | } | ||
428 | |||
429 | memset(priv->ring_control, 0, sizeof(*priv->ring_control)); | ||
430 | err = p54p_upload_firmware(dev); | ||
431 | if (err) { | ||
432 | free_irq(priv->pdev->irq, dev); | ||
433 | return err; | ||
434 | } | ||
435 | priv->rx_idx_data = priv->tx_idx_data = 0; | ||
436 | priv->rx_idx_mgmt = priv->tx_idx_mgmt = 0; | ||
437 | |||
438 | p54p_refill_rx_ring(dev, 0, priv->ring_control->rx_data, | ||
439 | ARRAY_SIZE(priv->ring_control->rx_data), priv->rx_buf_data); | ||
440 | |||
441 | p54p_refill_rx_ring(dev, 2, priv->ring_control->rx_mgmt, | ||
442 | ARRAY_SIZE(priv->ring_control->rx_mgmt), priv->rx_buf_mgmt); | ||
443 | |||
444 | P54P_WRITE(ring_control_base, cpu_to_le32(priv->ring_control_dma)); | ||
445 | P54P_READ(ring_control_base); | ||
446 | wmb(); | ||
447 | udelay(10); | ||
448 | |||
449 | P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_INIT)); | ||
450 | P54P_READ(int_enable); | ||
451 | wmb(); | ||
452 | udelay(10); | ||
453 | |||
454 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET)); | ||
455 | P54P_READ(dev_int); | ||
456 | |||
457 | if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) { | ||
458 | printk(KERN_ERR "%s: Cannot boot firmware!\n", | ||
459 | wiphy_name(dev->wiphy)); | ||
460 | p54p_stop(dev); | ||
461 | return -ETIMEDOUT; | ||
462 | } | ||
463 | |||
464 | P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_UPDATE)); | ||
465 | P54P_READ(int_enable); | ||
466 | wmb(); | ||
467 | udelay(10); | ||
468 | |||
469 | P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE)); | ||
470 | P54P_READ(dev_int); | ||
471 | wmb(); | ||
472 | udelay(10); | ||
473 | |||
474 | return 0; | ||
475 | } | ||
476 | |||
477 | static int __devinit p54p_probe(struct pci_dev *pdev, | 477 | static int __devinit p54p_probe(struct pci_dev *pdev, |
478 | const struct pci_device_id *id) | 478 | const struct pci_device_id *id) |
479 | { | 479 | { |
@@ -556,11 +556,13 @@ static int __devinit p54p_probe(struct pci_dev *pdev, | |||
556 | spin_lock_init(&priv->lock); | 556 | spin_lock_init(&priv->lock); |
557 | tasklet_init(&priv->rx_tasklet, p54p_rx_tasklet, (unsigned long)dev); | 557 | tasklet_init(&priv->rx_tasklet, p54p_rx_tasklet, (unsigned long)dev); |
558 | 558 | ||
559 | p54p_open(dev); | 559 | err = p54p_open(dev); |
560 | if (err) | ||
561 | goto err_free_common; | ||
560 | err = p54_read_eeprom(dev); | 562 | err = p54_read_eeprom(dev); |
561 | p54p_stop(dev); | 563 | p54p_stop(dev); |
562 | if (err) | 564 | if (err) |
563 | goto err_free_desc; | 565 | goto err_free_common; |
564 | 566 | ||
565 | err = ieee80211_register_hw(dev); | 567 | err = ieee80211_register_hw(dev); |
566 | if (err) { | 568 | if (err) { |
@@ -573,8 +575,6 @@ static int __devinit p54p_probe(struct pci_dev *pdev, | |||
573 | 575 | ||
574 | err_free_common: | 576 | err_free_common: |
575 | p54_free_common(dev); | 577 | p54_free_common(dev); |
576 | |||
577 | err_free_desc: | ||
578 | pci_free_consistent(pdev, sizeof(*priv->ring_control), | 578 | pci_free_consistent(pdev, sizeof(*priv->ring_control), |
579 | priv->ring_control, priv->ring_control_dma); | 579 | priv->ring_control, priv->ring_control_dma); |
580 | 580 | ||
diff --git a/drivers/parport/parport_cs.c b/drivers/parport/parport_cs.c index b1899e9c1f65..0cd5fbc7f2c2 100644 --- a/drivers/parport/parport_cs.c +++ b/drivers/parport/parport_cs.c | |||
@@ -112,7 +112,7 @@ static int parport_probe(struct pcmcia_device *link) | |||
112 | 112 | ||
113 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 113 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
114 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 114 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; |
115 | link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; | 115 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; |
116 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | 116 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; |
117 | link->conf.Attributes = CONF_ENABLE_IRQ; | 117 | link->conf.Attributes = CONF_ENABLE_IRQ; |
118 | link->conf.IntType = INT_MEMORY_AND_IO; | 118 | link->conf.IntType = INT_MEMORY_AND_IO; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 96cf8ecd04ce..bbf66ea8fd87 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -43,20 +43,6 @@ static void __devinit quirk_mellanox_tavor(struct pci_dev *dev) | |||
43 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR,quirk_mellanox_tavor); | 43 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR,quirk_mellanox_tavor); |
44 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE,quirk_mellanox_tavor); | 44 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE,quirk_mellanox_tavor); |
45 | 45 | ||
46 | /* Many VIA bridges seem to corrupt data for DAC. Disable it here */ | ||
47 | int forbid_dac __read_mostly; | ||
48 | EXPORT_SYMBOL(forbid_dac); | ||
49 | |||
50 | static __devinit void via_no_dac(struct pci_dev *dev) | ||
51 | { | ||
52 | if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI && forbid_dac == 0) { | ||
53 | dev_info(&dev->dev, | ||
54 | "VIA PCI bridge detected. Disabling DAC.\n"); | ||
55 | forbid_dac = 1; | ||
56 | } | ||
57 | } | ||
58 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac); | ||
59 | |||
60 | /* Deal with broken BIOS'es that neglect to enable passive release, | 46 | /* Deal with broken BIOS'es that neglect to enable passive release, |
61 | which can cause problems in combination with the 82441FX/PPro MTRRs */ | 47 | which can cause problems in combination with the 82441FX/PPro MTRRs */ |
62 | static void quirk_passive_release(struct pci_dev *dev) | 48 | static void quirk_passive_release(struct pci_dev *dev) |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index afea2b2558b5..76d4a98f0955 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
@@ -693,8 +693,9 @@ int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req) | |||
693 | type = 0; | 693 | type = 0; |
694 | if (s->functions > 1) /* All of this ought to be handled higher up */ | 694 | if (s->functions > 1) /* All of this ought to be handled higher up */ |
695 | type = IRQF_SHARED; | 695 | type = IRQF_SHARED; |
696 | if (req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) | 696 | else if (req->Attributes & IRQ_TYPE_DYNAMIC_SHARING) |
697 | type = IRQF_SHARED; | 697 | type = IRQF_SHARED; |
698 | else printk(KERN_WARNING "pcmcia: Driver needs updating to support IRQ sharing.\n"); | ||
698 | 699 | ||
699 | #ifdef CONFIG_PCMCIA_PROBE | 700 | #ifdef CONFIG_PCMCIA_PROBE |
700 | 701 | ||
diff --git a/drivers/regulator/da903x.c b/drivers/regulator/da903x.c index 3688e339db87..773b29cec8be 100644 --- a/drivers/regulator/da903x.c +++ b/drivers/regulator/da903x.c | |||
@@ -79,6 +79,11 @@ struct da903x_regulator_info { | |||
79 | int enable_bit; | 79 | int enable_bit; |
80 | }; | 80 | }; |
81 | 81 | ||
82 | static inline struct device *to_da903x_dev(struct regulator_dev *rdev) | ||
83 | { | ||
84 | return rdev_get_dev(rdev)->parent->parent; | ||
85 | } | ||
86 | |||
82 | static inline int check_range(struct da903x_regulator_info *info, | 87 | static inline int check_range(struct da903x_regulator_info *info, |
83 | int min_uV, int max_uV) | 88 | int min_uV, int max_uV) |
84 | { | 89 | { |
@@ -93,7 +98,7 @@ static int da903x_set_ldo_voltage(struct regulator_dev *rdev, | |||
93 | int min_uV, int max_uV) | 98 | int min_uV, int max_uV) |
94 | { | 99 | { |
95 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 100 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
96 | struct device *da9034_dev = rdev_get_dev(rdev)->parent; | 101 | struct device *da9034_dev = to_da903x_dev(rdev); |
97 | uint8_t val, mask; | 102 | uint8_t val, mask; |
98 | 103 | ||
99 | if (check_range(info, min_uV, max_uV)) { | 104 | if (check_range(info, min_uV, max_uV)) { |
@@ -111,7 +116,7 @@ static int da903x_set_ldo_voltage(struct regulator_dev *rdev, | |||
111 | static int da903x_get_voltage(struct regulator_dev *rdev) | 116 | static int da903x_get_voltage(struct regulator_dev *rdev) |
112 | { | 117 | { |
113 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 118 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
114 | struct device *da9034_dev = rdev_get_dev(rdev)->parent; | 119 | struct device *da9034_dev = to_da903x_dev(rdev); |
115 | uint8_t val, mask; | 120 | uint8_t val, mask; |
116 | int ret; | 121 | int ret; |
117 | 122 | ||
@@ -128,7 +133,7 @@ static int da903x_get_voltage(struct regulator_dev *rdev) | |||
128 | static int da903x_enable(struct regulator_dev *rdev) | 133 | static int da903x_enable(struct regulator_dev *rdev) |
129 | { | 134 | { |
130 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 135 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
131 | struct device *da9034_dev = rdev_get_dev(rdev)->parent; | 136 | struct device *da9034_dev = to_da903x_dev(rdev); |
132 | 137 | ||
133 | return da903x_set_bits(da9034_dev, info->enable_reg, | 138 | return da903x_set_bits(da9034_dev, info->enable_reg, |
134 | 1 << info->enable_bit); | 139 | 1 << info->enable_bit); |
@@ -137,7 +142,7 @@ static int da903x_enable(struct regulator_dev *rdev) | |||
137 | static int da903x_disable(struct regulator_dev *rdev) | 142 | static int da903x_disable(struct regulator_dev *rdev) |
138 | { | 143 | { |
139 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 144 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
140 | struct device *da9034_dev = rdev_get_dev(rdev)->parent; | 145 | struct device *da9034_dev = to_da903x_dev(rdev); |
141 | 146 | ||
142 | return da903x_clr_bits(da9034_dev, info->enable_reg, | 147 | return da903x_clr_bits(da9034_dev, info->enable_reg, |
143 | 1 << info->enable_bit); | 148 | 1 << info->enable_bit); |
@@ -146,7 +151,7 @@ static int da903x_disable(struct regulator_dev *rdev) | |||
146 | static int da903x_is_enabled(struct regulator_dev *rdev) | 151 | static int da903x_is_enabled(struct regulator_dev *rdev) |
147 | { | 152 | { |
148 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 153 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
149 | struct device *da9034_dev = rdev_get_dev(rdev)->parent; | 154 | struct device *da9034_dev = to_da903x_dev(rdev); |
150 | uint8_t reg_val; | 155 | uint8_t reg_val; |
151 | int ret; | 156 | int ret; |
152 | 157 | ||
@@ -162,7 +167,7 @@ static int da9030_set_ldo1_15_voltage(struct regulator_dev *rdev, | |||
162 | int min_uV, int max_uV) | 167 | int min_uV, int max_uV) |
163 | { | 168 | { |
164 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 169 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
165 | struct device *da903x_dev = rdev_get_dev(rdev)->parent; | 170 | struct device *da903x_dev = to_da903x_dev(rdev); |
166 | uint8_t val, mask; | 171 | uint8_t val, mask; |
167 | int ret; | 172 | int ret; |
168 | 173 | ||
@@ -189,7 +194,7 @@ static int da9030_set_ldo14_voltage(struct regulator_dev *rdev, | |||
189 | int min_uV, int max_uV) | 194 | int min_uV, int max_uV) |
190 | { | 195 | { |
191 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 196 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
192 | struct device *da903x_dev = rdev_get_dev(rdev)->parent; | 197 | struct device *da903x_dev = to_da903x_dev(rdev); |
193 | uint8_t val, mask; | 198 | uint8_t val, mask; |
194 | int thresh; | 199 | int thresh; |
195 | 200 | ||
@@ -215,7 +220,7 @@ static int da9030_set_ldo14_voltage(struct regulator_dev *rdev, | |||
215 | static int da9030_get_ldo14_voltage(struct regulator_dev *rdev) | 220 | static int da9030_get_ldo14_voltage(struct regulator_dev *rdev) |
216 | { | 221 | { |
217 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 222 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
218 | struct device *da903x_dev = rdev_get_dev(rdev)->parent; | 223 | struct device *da903x_dev = to_da903x_dev(rdev); |
219 | uint8_t val, mask; | 224 | uint8_t val, mask; |
220 | int ret; | 225 | int ret; |
221 | 226 | ||
@@ -238,7 +243,7 @@ static int da9034_set_dvc_voltage(struct regulator_dev *rdev, | |||
238 | int min_uV, int max_uV) | 243 | int min_uV, int max_uV) |
239 | { | 244 | { |
240 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 245 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
241 | struct device *da9034_dev = rdev_get_dev(rdev)->parent; | 246 | struct device *da9034_dev = to_da903x_dev(rdev); |
242 | uint8_t val, mask; | 247 | uint8_t val, mask; |
243 | int ret; | 248 | int ret; |
244 | 249 | ||
@@ -264,7 +269,7 @@ static int da9034_set_ldo12_voltage(struct regulator_dev *rdev, | |||
264 | int min_uV, int max_uV) | 269 | int min_uV, int max_uV) |
265 | { | 270 | { |
266 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 271 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
267 | struct device *da9034_dev = rdev_get_dev(rdev)->parent; | 272 | struct device *da9034_dev = to_da903x_dev(rdev); |
268 | uint8_t val, mask; | 273 | uint8_t val, mask; |
269 | 274 | ||
270 | if (check_range(info, min_uV, max_uV)) { | 275 | if (check_range(info, min_uV, max_uV)) { |
@@ -283,7 +288,7 @@ static int da9034_set_ldo12_voltage(struct regulator_dev *rdev, | |||
283 | static int da9034_get_ldo12_voltage(struct regulator_dev *rdev) | 288 | static int da9034_get_ldo12_voltage(struct regulator_dev *rdev) |
284 | { | 289 | { |
285 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); | 290 | struct da903x_regulator_info *info = rdev_get_drvdata(rdev); |
286 | struct device *da9034_dev = rdev_get_dev(rdev)->parent; | 291 | struct device *da9034_dev = to_da903x_dev(rdev); |
287 | uint8_t val, mask; | 292 | uint8_t val, mask; |
288 | int ret; | 293 | int ret; |
289 | 294 | ||
@@ -466,7 +471,7 @@ static int __devinit da903x_regulator_probe(struct platform_device *pdev) | |||
466 | if (ri->desc.id == DA9030_ID_LDO1 || ri->desc.id == DA9030_ID_LDO15) | 471 | if (ri->desc.id == DA9030_ID_LDO1 || ri->desc.id == DA9030_ID_LDO15) |
467 | ri->desc.ops = &da9030_regulator_ldo1_15_ops; | 472 | ri->desc.ops = &da9030_regulator_ldo1_15_ops; |
468 | 473 | ||
469 | rdev = regulator_register(&ri->desc, pdev->dev.parent, ri); | 474 | rdev = regulator_register(&ri->desc, &pdev->dev, ri); |
470 | if (IS_ERR(rdev)) { | 475 | if (IS_ERR(rdev)) { |
471 | dev_err(&pdev->dev, "failed to register regulator %s\n", | 476 | dev_err(&pdev->dev, "failed to register regulator %s\n", |
472 | ri->desc.name); | 477 | ri->desc.name); |
diff --git a/drivers/rtc/rtc-ds3234.c b/drivers/rtc/rtc-ds3234.c index 37d131d03f33..45e5b106af73 100644 --- a/drivers/rtc/rtc-ds3234.c +++ b/drivers/rtc/rtc-ds3234.c | |||
@@ -189,7 +189,7 @@ static const struct rtc_class_ops ds3234_rtc_ops = { | |||
189 | .set_time = ds3234_set_time, | 189 | .set_time = ds3234_set_time, |
190 | }; | 190 | }; |
191 | 191 | ||
192 | static int ds3234_probe(struct spi_device *spi) | 192 | static int __devinit ds3234_probe(struct spi_device *spi) |
193 | { | 193 | { |
194 | struct rtc_device *rtc; | 194 | struct rtc_device *rtc; |
195 | unsigned char tmp; | 195 | unsigned char tmp; |
@@ -249,7 +249,7 @@ static int ds3234_probe(struct spi_device *spi) | |||
249 | return 0; | 249 | return 0; |
250 | } | 250 | } |
251 | 251 | ||
252 | static int __exit ds3234_remove(struct spi_device *spi) | 252 | static int __devexit ds3234_remove(struct spi_device *spi) |
253 | { | 253 | { |
254 | struct ds3234 *chip = platform_get_drvdata(spi); | 254 | struct ds3234 *chip = platform_get_drvdata(spi); |
255 | struct rtc_device *rtc = chip->rtc; | 255 | struct rtc_device *rtc = chip->rtc; |
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index 910bc704939c..f59277bbedaa 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
@@ -455,6 +455,8 @@ static int __devinit s3c_rtc_probe(struct platform_device *pdev) | |||
455 | 455 | ||
456 | s3c_rtc_setfreq(&pdev->dev, 1); | 456 | s3c_rtc_setfreq(&pdev->dev, 1); |
457 | 457 | ||
458 | device_init_wakeup(&pdev->dev, 1); | ||
459 | |||
458 | /* register RTC and exit */ | 460 | /* register RTC and exit */ |
459 | 461 | ||
460 | rtc = rtc_device_register("s3c", &pdev->dev, &s3c_rtcops, | 462 | rtc = rtc_device_register("s3c", &pdev->dev, &s3c_rtcops, |
@@ -507,7 +509,7 @@ static int s3c_rtc_resume(struct platform_device *pdev) | |||
507 | #define s3c_rtc_resume NULL | 509 | #define s3c_rtc_resume NULL |
508 | #endif | 510 | #endif |
509 | 511 | ||
510 | static struct platform_driver s3c2410_rtcdrv = { | 512 | static struct platform_driver s3c2410_rtc_driver = { |
511 | .probe = s3c_rtc_probe, | 513 | .probe = s3c_rtc_probe, |
512 | .remove = __devexit_p(s3c_rtc_remove), | 514 | .remove = __devexit_p(s3c_rtc_remove), |
513 | .suspend = s3c_rtc_suspend, | 515 | .suspend = s3c_rtc_suspend, |
@@ -523,12 +525,12 @@ static char __initdata banner[] = "S3C24XX RTC, (c) 2004,2006 Simtec Electronics | |||
523 | static int __init s3c_rtc_init(void) | 525 | static int __init s3c_rtc_init(void) |
524 | { | 526 | { |
525 | printk(banner); | 527 | printk(banner); |
526 | return platform_driver_register(&s3c2410_rtcdrv); | 528 | return platform_driver_register(&s3c2410_rtc_driver); |
527 | } | 529 | } |
528 | 530 | ||
529 | static void __exit s3c_rtc_exit(void) | 531 | static void __exit s3c_rtc_exit(void) |
530 | { | 532 | { |
531 | platform_driver_unregister(&s3c2410_rtcdrv); | 533 | platform_driver_unregister(&s3c2410_rtc_driver); |
532 | } | 534 | } |
533 | 535 | ||
534 | module_init(s3c_rtc_init); | 536 | module_init(s3c_rtc_init); |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 7de410d5be4a..52d26592c72c 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -3025,7 +3025,7 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb, | |||
3025 | struct qdio_buffer *buffer, int is_tso, int *next_element_to_fill, | 3025 | struct qdio_buffer *buffer, int is_tso, int *next_element_to_fill, |
3026 | int offset) | 3026 | int offset) |
3027 | { | 3027 | { |
3028 | int length = skb->len - offset; | 3028 | int length = skb->len; |
3029 | int length_here; | 3029 | int length_here; |
3030 | int element; | 3030 | int element; |
3031 | char *data; | 3031 | char *data; |
@@ -3037,6 +3037,7 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb, | |||
3037 | 3037 | ||
3038 | if (offset >= 0) { | 3038 | if (offset >= 0) { |
3039 | data = skb->data + offset; | 3039 | data = skb->data + offset; |
3040 | length -= offset; | ||
3040 | first_lap = 0; | 3041 | first_lap = 0; |
3041 | } | 3042 | } |
3042 | 3043 | ||
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index 955ba7a31b90..1b1e80336d2c 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c | |||
@@ -373,8 +373,6 @@ static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) | |||
373 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); | 373 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
374 | 374 | ||
375 | qeth_set_allowed_threads(card, 0, 1); | 375 | qeth_set_allowed_threads(card, 0, 1); |
376 | if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)) | ||
377 | return -ERESTARTSYS; | ||
378 | if (card->read.state == CH_STATE_UP && | 376 | if (card->read.state == CH_STATE_UP && |
379 | card->write.state == CH_STATE_UP && | 377 | card->write.state == CH_STATE_UP && |
380 | (card->state == CARD_STATE_UP)) { | 378 | (card->state == CARD_STATE_UP)) { |
@@ -451,12 +449,15 @@ static void qeth_l2_process_inbound_buffer(struct qeth_card *card, | |||
451 | netif_rx(skb); | 449 | netif_rx(skb); |
452 | break; | 450 | break; |
453 | case QETH_HEADER_TYPE_OSN: | 451 | case QETH_HEADER_TYPE_OSN: |
454 | skb_push(skb, sizeof(struct qeth_hdr)); | 452 | if (card->info.type == QETH_CARD_TYPE_OSN) { |
455 | skb_copy_to_linear_data(skb, hdr, | 453 | skb_push(skb, sizeof(struct qeth_hdr)); |
454 | skb_copy_to_linear_data(skb, hdr, | ||
456 | sizeof(struct qeth_hdr)); | 455 | sizeof(struct qeth_hdr)); |
457 | len = skb->len; | 456 | len = skb->len; |
458 | card->osn_info.data_cb(skb); | 457 | card->osn_info.data_cb(skb); |
459 | break; | 458 | break; |
459 | } | ||
460 | /* else unknown */ | ||
460 | default: | 461 | default: |
461 | dev_kfree_skb_any(skb); | 462 | dev_kfree_skb_any(skb); |
462 | QETH_DBF_TEXT(TRACE, 3, "inbunkno"); | 463 | QETH_DBF_TEXT(TRACE, 3, "inbunkno"); |
@@ -975,12 +976,6 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
975 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); | 976 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
976 | 977 | ||
977 | qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1); | 978 | qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1); |
978 | if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)) { | ||
979 | PRINT_WARN("set_online of card %s interrupted by user!\n", | ||
980 | CARD_BUS_ID(card)); | ||
981 | return -ERESTARTSYS; | ||
982 | } | ||
983 | |||
984 | recover_flag = card->state; | 979 | recover_flag = card->state; |
985 | rc = ccw_device_set_online(CARD_RDEV(card)); | 980 | rc = ccw_device_set_online(CARD_RDEV(card)); |
986 | if (rc) { | 981 | if (rc) { |
@@ -1091,11 +1086,7 @@ static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev, | |||
1091 | if (card->dev && netif_carrier_ok(card->dev)) | 1086 | if (card->dev && netif_carrier_ok(card->dev)) |
1092 | netif_carrier_off(card->dev); | 1087 | netif_carrier_off(card->dev); |
1093 | recover_flag = card->state; | 1088 | recover_flag = card->state; |
1094 | if (qeth_l2_stop_card(card, recovery_mode) == -ERESTARTSYS) { | 1089 | qeth_l2_stop_card(card, recovery_mode); |
1095 | PRINT_WARN("Stopping card %s interrupted by user!\n", | ||
1096 | CARD_BUS_ID(card)); | ||
1097 | return -ERESTARTSYS; | ||
1098 | } | ||
1099 | rc = ccw_device_set_offline(CARD_DDEV(card)); | 1090 | rc = ccw_device_set_offline(CARD_DDEV(card)); |
1100 | rc2 = ccw_device_set_offline(CARD_WDEV(card)); | 1091 | rc2 = ccw_device_set_offline(CARD_WDEV(card)); |
1101 | rc3 = ccw_device_set_offline(CARD_RDEV(card)); | 1092 | rc3 = ccw_device_set_offline(CARD_RDEV(card)); |
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index 99547dea44de..ed59fedd5922 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c | |||
@@ -2064,8 +2064,6 @@ static int qeth_l3_stop_card(struct qeth_card *card, int recovery_mode) | |||
2064 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); | 2064 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
2065 | 2065 | ||
2066 | qeth_set_allowed_threads(card, 0, 1); | 2066 | qeth_set_allowed_threads(card, 0, 1); |
2067 | if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)) | ||
2068 | return -ERESTARTSYS; | ||
2069 | if (card->read.state == CH_STATE_UP && | 2067 | if (card->read.state == CH_STATE_UP && |
2070 | card->write.state == CH_STATE_UP && | 2068 | card->write.state == CH_STATE_UP && |
2071 | (card->state == CARD_STATE_UP)) { | 2069 | (card->state == CARD_STATE_UP)) { |
@@ -3049,11 +3047,6 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode) | |||
3049 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); | 3047 | QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); |
3050 | 3048 | ||
3051 | qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1); | 3049 | qeth_set_allowed_threads(card, QETH_RECOVER_THREAD, 1); |
3052 | if (qeth_wait_for_threads(card, ~QETH_RECOVER_THREAD)) { | ||
3053 | PRINT_WARN("set_online of card %s interrupted by user!\n", | ||
3054 | CARD_BUS_ID(card)); | ||
3055 | return -ERESTARTSYS; | ||
3056 | } | ||
3057 | 3050 | ||
3058 | recover_flag = card->state; | 3051 | recover_flag = card->state; |
3059 | rc = ccw_device_set_online(CARD_RDEV(card)); | 3052 | rc = ccw_device_set_online(CARD_RDEV(card)); |
@@ -3170,11 +3163,7 @@ static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev, | |||
3170 | if (card->dev && netif_carrier_ok(card->dev)) | 3163 | if (card->dev && netif_carrier_ok(card->dev)) |
3171 | netif_carrier_off(card->dev); | 3164 | netif_carrier_off(card->dev); |
3172 | recover_flag = card->state; | 3165 | recover_flag = card->state; |
3173 | if (qeth_l3_stop_card(card, recovery_mode) == -ERESTARTSYS) { | 3166 | qeth_l3_stop_card(card, recovery_mode); |
3174 | PRINT_WARN("Stopping card %s interrupted by user!\n", | ||
3175 | CARD_BUS_ID(card)); | ||
3176 | return -ERESTARTSYS; | ||
3177 | } | ||
3178 | rc = ccw_device_set_offline(CARD_DDEV(card)); | 3167 | rc = ccw_device_set_offline(CARD_DDEV(card)); |
3179 | rc2 = ccw_device_set_offline(CARD_WDEV(card)); | 3168 | rc2 = ccw_device_set_offline(CARD_WDEV(card)); |
3180 | rc3 = ccw_device_set_offline(CARD_RDEV(card)); | 3169 | rc3 = ccw_device_set_offline(CARD_RDEV(card)); |
diff --git a/drivers/s390/net/qeth_l3_sys.c b/drivers/s390/net/qeth_l3_sys.c index 210ddb639748..c144b9924d52 100644 --- a/drivers/s390/net/qeth_l3_sys.c +++ b/drivers/s390/net/qeth_l3_sys.c | |||
@@ -121,9 +121,6 @@ static ssize_t qeth_l3_dev_route6_show(struct device *dev, | |||
121 | if (!card) | 121 | if (!card) |
122 | return -EINVAL; | 122 | return -EINVAL; |
123 | 123 | ||
124 | if (!qeth_is_supported(card, IPA_IPV6)) | ||
125 | return sprintf(buf, "%s\n", "n/a"); | ||
126 | |||
127 | return qeth_l3_dev_route_show(card, &card->options.route6, buf); | 124 | return qeth_l3_dev_route_show(card, &card->options.route6, buf); |
128 | } | 125 | } |
129 | 126 | ||
@@ -135,10 +132,6 @@ static ssize_t qeth_l3_dev_route6_store(struct device *dev, | |||
135 | if (!card) | 132 | if (!card) |
136 | return -EINVAL; | 133 | return -EINVAL; |
137 | 134 | ||
138 | if (!qeth_is_supported(card, IPA_IPV6)) { | ||
139 | return -EOPNOTSUPP; | ||
140 | } | ||
141 | |||
142 | return qeth_l3_dev_route_store(card, &card->options.route6, | 135 | return qeth_l3_dev_route_store(card, &card->options.route6, |
143 | QETH_PROT_IPV6, buf, count); | 136 | QETH_PROT_IPV6, buf, count); |
144 | } | 137 | } |
diff --git a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c index c33bcb284df7..56f4e6bffc21 100644 --- a/drivers/scsi/fdomain.c +++ b/drivers/scsi/fdomain.c | |||
@@ -290,9 +290,11 @@ | |||
290 | #include <scsi/scsi_ioctl.h> | 290 | #include <scsi/scsi_ioctl.h> |
291 | #include "fdomain.h" | 291 | #include "fdomain.h" |
292 | 292 | ||
293 | #ifndef PCMCIA | ||
293 | MODULE_AUTHOR("Rickard E. Faith"); | 294 | MODULE_AUTHOR("Rickard E. Faith"); |
294 | MODULE_DESCRIPTION("Future domain SCSI driver"); | 295 | MODULE_DESCRIPTION("Future domain SCSI driver"); |
295 | MODULE_LICENSE("GPL"); | 296 | MODULE_LICENSE("GPL"); |
297 | #endif | ||
296 | 298 | ||
297 | 299 | ||
298 | #define VERSION "$Revision: 5.51 $" | 300 | #define VERSION "$Revision: 5.51 $" |
diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 543811f6e6e8..8e74657f106c 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c | |||
@@ -133,7 +133,7 @@ static int usbtmc_release(struct inode *inode, struct file *file) | |||
133 | 133 | ||
134 | static int usbtmc_ioctl_abort_bulk_in(struct usbtmc_device_data *data) | 134 | static int usbtmc_ioctl_abort_bulk_in(struct usbtmc_device_data *data) |
135 | { | 135 | { |
136 | char *buffer; | 136 | u8 *buffer; |
137 | struct device *dev; | 137 | struct device *dev; |
138 | int rv; | 138 | int rv; |
139 | int n; | 139 | int n; |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index fc9018e72a09..e1b42626d04d 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -106,6 +106,9 @@ static DEFINE_SPINLOCK(hcd_root_hub_lock); | |||
106 | /* used when updating an endpoint's URB list */ | 106 | /* used when updating an endpoint's URB list */ |
107 | static DEFINE_SPINLOCK(hcd_urb_list_lock); | 107 | static DEFINE_SPINLOCK(hcd_urb_list_lock); |
108 | 108 | ||
109 | /* used to protect against unlinking URBs after the device is gone */ | ||
110 | static DEFINE_SPINLOCK(hcd_urb_unlink_lock); | ||
111 | |||
109 | /* wait queue for synchronous unlinks */ | 112 | /* wait queue for synchronous unlinks */ |
110 | DECLARE_WAIT_QUEUE_HEAD(usb_kill_urb_queue); | 113 | DECLARE_WAIT_QUEUE_HEAD(usb_kill_urb_queue); |
111 | 114 | ||
@@ -1376,10 +1379,25 @@ static int unlink1(struct usb_hcd *hcd, struct urb *urb, int status) | |||
1376 | int usb_hcd_unlink_urb (struct urb *urb, int status) | 1379 | int usb_hcd_unlink_urb (struct urb *urb, int status) |
1377 | { | 1380 | { |
1378 | struct usb_hcd *hcd; | 1381 | struct usb_hcd *hcd; |
1379 | int retval; | 1382 | int retval = -EIDRM; |
1383 | unsigned long flags; | ||
1380 | 1384 | ||
1381 | hcd = bus_to_hcd(urb->dev->bus); | 1385 | /* Prevent the device and bus from going away while |
1382 | retval = unlink1(hcd, urb, status); | 1386 | * the unlink is carried out. If they are already gone |
1387 | * then urb->use_count must be 0, since disconnected | ||
1388 | * devices can't have any active URBs. | ||
1389 | */ | ||
1390 | spin_lock_irqsave(&hcd_urb_unlink_lock, flags); | ||
1391 | if (atomic_read(&urb->use_count) > 0) { | ||
1392 | retval = 0; | ||
1393 | usb_get_dev(urb->dev); | ||
1394 | } | ||
1395 | spin_unlock_irqrestore(&hcd_urb_unlink_lock, flags); | ||
1396 | if (retval == 0) { | ||
1397 | hcd = bus_to_hcd(urb->dev->bus); | ||
1398 | retval = unlink1(hcd, urb, status); | ||
1399 | usb_put_dev(urb->dev); | ||
1400 | } | ||
1383 | 1401 | ||
1384 | if (retval == 0) | 1402 | if (retval == 0) |
1385 | retval = -EINPROGRESS; | 1403 | retval = -EINPROGRESS; |
@@ -1528,6 +1546,17 @@ void usb_hcd_disable_endpoint(struct usb_device *udev, | |||
1528 | hcd->driver->endpoint_disable(hcd, ep); | 1546 | hcd->driver->endpoint_disable(hcd, ep); |
1529 | } | 1547 | } |
1530 | 1548 | ||
1549 | /* Protect against drivers that try to unlink URBs after the device | ||
1550 | * is gone, by waiting until all unlinks for @udev are finished. | ||
1551 | * Since we don't currently track URBs by device, simply wait until | ||
1552 | * nothing is running in the locked region of usb_hcd_unlink_urb(). | ||
1553 | */ | ||
1554 | void usb_hcd_synchronize_unlinks(struct usb_device *udev) | ||
1555 | { | ||
1556 | spin_lock_irq(&hcd_urb_unlink_lock); | ||
1557 | spin_unlock_irq(&hcd_urb_unlink_lock); | ||
1558 | } | ||
1559 | |||
1531 | /*-------------------------------------------------------------------------*/ | 1560 | /*-------------------------------------------------------------------------*/ |
1532 | 1561 | ||
1533 | /* called in any context */ | 1562 | /* called in any context */ |
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h index 2dcde61c465e..9465e70f4dd0 100644 --- a/drivers/usb/core/hcd.h +++ b/drivers/usb/core/hcd.h | |||
@@ -232,6 +232,7 @@ extern void usb_hcd_flush_endpoint(struct usb_device *udev, | |||
232 | struct usb_host_endpoint *ep); | 232 | struct usb_host_endpoint *ep); |
233 | extern void usb_hcd_disable_endpoint(struct usb_device *udev, | 233 | extern void usb_hcd_disable_endpoint(struct usb_device *udev, |
234 | struct usb_host_endpoint *ep); | 234 | struct usb_host_endpoint *ep); |
235 | extern void usb_hcd_synchronize_unlinks(struct usb_device *udev); | ||
235 | extern int usb_hcd_get_frame_number(struct usb_device *udev); | 236 | extern int usb_hcd_get_frame_number(struct usb_device *udev); |
236 | 237 | ||
237 | extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, | 238 | extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 9b3f16bd12cb..b19cbfcd51da 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -659,6 +659,9 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | |||
659 | PREPARE_DELAYED_WORK(&hub->init_work, hub_init_func2); | 659 | PREPARE_DELAYED_WORK(&hub->init_work, hub_init_func2); |
660 | schedule_delayed_work(&hub->init_work, | 660 | schedule_delayed_work(&hub->init_work, |
661 | msecs_to_jiffies(delay)); | 661 | msecs_to_jiffies(delay)); |
662 | |||
663 | /* Suppress autosuspend until init is done */ | ||
664 | to_usb_interface(hub->intfdev)->pm_usage_cnt = 1; | ||
662 | return; /* Continues at init2: below */ | 665 | return; /* Continues at init2: below */ |
663 | } else { | 666 | } else { |
664 | hub_power_on(hub, true); | 667 | hub_power_on(hub, true); |
@@ -1429,6 +1432,7 @@ void usb_disconnect(struct usb_device **pdev) | |||
1429 | */ | 1432 | */ |
1430 | dev_dbg (&udev->dev, "unregistering device\n"); | 1433 | dev_dbg (&udev->dev, "unregistering device\n"); |
1431 | usb_disable_device(udev, 0); | 1434 | usb_disable_device(udev, 0); |
1435 | usb_hcd_synchronize_unlinks(udev); | ||
1432 | 1436 | ||
1433 | usb_unlock_device(udev); | 1437 | usb_unlock_device(udev); |
1434 | 1438 | ||
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index f2638009a464..4342bd9c3bb6 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c | |||
@@ -474,6 +474,12 @@ EXPORT_SYMBOL_GPL(usb_submit_urb); | |||
474 | * indicating that the request has been canceled (rather than any other | 474 | * indicating that the request has been canceled (rather than any other |
475 | * code). | 475 | * code). |
476 | * | 476 | * |
477 | * Drivers should not call this routine or related routines, such as | ||
478 | * usb_kill_urb() or usb_unlink_anchored_urbs(), after their disconnect | ||
479 | * method has returned. The disconnect function should synchronize with | ||
480 | * a driver's I/O routines to insure that all URB-related activity has | ||
481 | * completed before it returns. | ||
482 | * | ||
477 | * This request is always asynchronous. Success is indicated by | 483 | * This request is always asynchronous. Success is indicated by |
478 | * returning -EINPROGRESS, at which time the URB will probably not yet | 484 | * returning -EINPROGRESS, at which time the URB will probably not yet |
479 | * have been given back to the device driver. When it is eventually | 485 | * have been given back to the device driver. When it is eventually |
@@ -550,6 +556,9 @@ EXPORT_SYMBOL_GPL(usb_unlink_urb); | |||
550 | * This routine may not be used in an interrupt context (such as a bottom | 556 | * This routine may not be used in an interrupt context (such as a bottom |
551 | * half or a completion handler), or when holding a spinlock, or in other | 557 | * half or a completion handler), or when holding a spinlock, or in other |
552 | * situations where the caller can't schedule(). | 558 | * situations where the caller can't schedule(). |
559 | * | ||
560 | * This routine should not be called by a driver after its disconnect | ||
561 | * method has returned. | ||
553 | */ | 562 | */ |
554 | void usb_kill_urb(struct urb *urb) | 563 | void usb_kill_urb(struct urb *urb) |
555 | { | 564 | { |
@@ -588,6 +597,9 @@ EXPORT_SYMBOL_GPL(usb_kill_urb); | |||
588 | * This routine may not be used in an interrupt context (such as a bottom | 597 | * This routine may not be used in an interrupt context (such as a bottom |
589 | * half or a completion handler), or when holding a spinlock, or in other | 598 | * half or a completion handler), or when holding a spinlock, or in other |
590 | * situations where the caller can't schedule(). | 599 | * situations where the caller can't schedule(). |
600 | * | ||
601 | * This routine should not be called by a driver after its disconnect | ||
602 | * method has returned. | ||
591 | */ | 603 | */ |
592 | void usb_poison_urb(struct urb *urb) | 604 | void usb_poison_urb(struct urb *urb) |
593 | { | 605 | { |
@@ -622,6 +634,9 @@ EXPORT_SYMBOL_GPL(usb_unpoison_urb); | |||
622 | * | 634 | * |
623 | * this allows all outstanding URBs to be killed starting | 635 | * this allows all outstanding URBs to be killed starting |
624 | * from the back of the queue | 636 | * from the back of the queue |
637 | * | ||
638 | * This routine should not be called by a driver after its disconnect | ||
639 | * method has returned. | ||
625 | */ | 640 | */ |
626 | void usb_kill_anchored_urbs(struct usb_anchor *anchor) | 641 | void usb_kill_anchored_urbs(struct usb_anchor *anchor) |
627 | { | 642 | { |
@@ -651,6 +666,9 @@ EXPORT_SYMBOL_GPL(usb_kill_anchored_urbs); | |||
651 | * this allows all outstanding URBs to be poisoned starting | 666 | * this allows all outstanding URBs to be poisoned starting |
652 | * from the back of the queue. Newly added URBs will also be | 667 | * from the back of the queue. Newly added URBs will also be |
653 | * poisoned | 668 | * poisoned |
669 | * | ||
670 | * This routine should not be called by a driver after its disconnect | ||
671 | * method has returned. | ||
654 | */ | 672 | */ |
655 | void usb_poison_anchored_urbs(struct usb_anchor *anchor) | 673 | void usb_poison_anchored_urbs(struct usb_anchor *anchor) |
656 | { | 674 | { |
@@ -672,6 +690,7 @@ void usb_poison_anchored_urbs(struct usb_anchor *anchor) | |||
672 | spin_unlock_irq(&anchor->lock); | 690 | spin_unlock_irq(&anchor->lock); |
673 | } | 691 | } |
674 | EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs); | 692 | EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs); |
693 | |||
675 | /** | 694 | /** |
676 | * usb_unlink_anchored_urbs - asynchronously cancel transfer requests en masse | 695 | * usb_unlink_anchored_urbs - asynchronously cancel transfer requests en masse |
677 | * @anchor: anchor the requests are bound to | 696 | * @anchor: anchor the requests are bound to |
@@ -680,6 +699,9 @@ EXPORT_SYMBOL_GPL(usb_poison_anchored_urbs); | |||
680 | * from the back of the queue. This function is asynchronous. | 699 | * from the back of the queue. This function is asynchronous. |
681 | * The unlinking is just tiggered. It may happen after this | 700 | * The unlinking is just tiggered. It may happen after this |
682 | * function has returned. | 701 | * function has returned. |
702 | * | ||
703 | * This routine should not be called by a driver after its disconnect | ||
704 | * method has returned. | ||
683 | */ | 705 | */ |
684 | void usb_unlink_anchored_urbs(struct usb_anchor *anchor) | 706 | void usb_unlink_anchored_urbs(struct usb_anchor *anchor) |
685 | { | 707 | { |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 8be3f39891c7..794b5ffe4397 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -281,6 +281,7 @@ static void serial_close(struct tty_struct *tty, struct file *filp) | |||
281 | if (tty->driver_data) | 281 | if (tty->driver_data) |
282 | tty->driver_data = NULL; | 282 | tty->driver_data = NULL; |
283 | tty_port_tty_set(&port->port, NULL); | 283 | tty_port_tty_set(&port->port, NULL); |
284 | tty_kref_put(tty); | ||
284 | } | 285 | } |
285 | } | 286 | } |
286 | 287 | ||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index a2b9ebbef38e..fb9e20e624c1 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -333,6 +333,13 @@ UNUSUAL_DEV( 0x0482, 0x0103, 0x0100, 0x0100, | |||
333 | "Finecam S5", | 333 | "Finecam S5", |
334 | US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY), | 334 | US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY), |
335 | 335 | ||
336 | /* Patch submitted by Jens Taprogge <jens.taprogge@taprogge.org> */ | ||
337 | UNUSUAL_DEV( 0x0482, 0x0107, 0x0100, 0x0100, | ||
338 | "Kyocera", | ||
339 | "CONTAX SL300R T*", | ||
340 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
341 | US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE), | ||
342 | |||
336 | /* Reported by Paul Stewart <stewart@wetlogic.net> | 343 | /* Reported by Paul Stewart <stewart@wetlogic.net> |
337 | * This entry is needed because the device reports Sub=ff */ | 344 | * This entry is needed because the device reports Sub=ff */ |
338 | UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001, | 345 | UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001, |
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 64b3d30027b8..b92947d62ad6 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -2118,7 +2118,7 @@ static void fbcon_bmove_rec(struct vc_data *vc, struct display *p, int sy, int s | |||
2118 | height, width); | 2118 | height, width); |
2119 | } | 2119 | } |
2120 | 2120 | ||
2121 | static __inline__ void updatescrollmode(struct display *p, | 2121 | static void updatescrollmode(struct display *p, |
2122 | struct fb_info *info, | 2122 | struct fb_info *info, |
2123 | struct vc_data *vc) | 2123 | struct vc_data *vc) |
2124 | { | 2124 | { |
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index cd5f20da738a..6048b55f2878 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
@@ -1262,8 +1262,8 @@ fb_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
1262 | case FBIOPUT_CON2FBMAP: | 1262 | case FBIOPUT_CON2FBMAP: |
1263 | arg = (unsigned long) compat_ptr(arg); | 1263 | arg = (unsigned long) compat_ptr(arg); |
1264 | case FBIOBLANK: | 1264 | case FBIOBLANK: |
1265 | ret = fb_ioctl(file, cmd, arg); | 1265 | mutex_unlock(&info->lock); |
1266 | break; | 1266 | return fb_ioctl(file, cmd, arg); |
1267 | 1267 | ||
1268 | case FBIOGET_FSCREENINFO: | 1268 | case FBIOGET_FSCREENINFO: |
1269 | ret = fb_get_fscreeninfo(inode, file, cmd, arg); | 1269 | ret = fb_get_fscreeninfo(inode, file, cmd, arg); |
diff --git a/drivers/video/via/global.h b/drivers/video/via/global.h index 8e5263c5b812..7543d5f7e309 100644 --- a/drivers/video/via/global.h +++ b/drivers/video/via/global.h | |||
@@ -38,7 +38,6 @@ | |||
38 | #include "iface.h" | 38 | #include "iface.h" |
39 | #include "viafbdev.h" | 39 | #include "viafbdev.h" |
40 | #include "chip.h" | 40 | #include "chip.h" |
41 | #include "debug.h" | ||
42 | #include "accel.h" | 41 | #include "accel.h" |
43 | #include "share.h" | 42 | #include "share.h" |
44 | #include "dvi.h" | 43 | #include "dvi.h" |
@@ -48,12 +47,10 @@ | |||
48 | 47 | ||
49 | #include "lcd.h" | 48 | #include "lcd.h" |
50 | #include "ioctl.h" | 49 | #include "ioctl.h" |
51 | #include "viamode.h" | ||
52 | #include "via_utility.h" | 50 | #include "via_utility.h" |
53 | #include "vt1636.h" | 51 | #include "vt1636.h" |
54 | #include "tblDPASetting.h" | 52 | #include "tblDPASetting.h" |
55 | #include "tbl1636.h" | 53 | #include "tbl1636.h" |
56 | #include "viafbdev.h" | ||
57 | 54 | ||
58 | /* External struct*/ | 55 | /* External struct*/ |
59 | 56 | ||
diff --git a/drivers/watchdog/acquirewdt.c b/drivers/watchdog/acquirewdt.c index 6e46a551395c..3e57aa4d643a 100644 --- a/drivers/watchdog/acquirewdt.c +++ b/drivers/watchdog/acquirewdt.c | |||
@@ -3,8 +3,8 @@ | |||
3 | * | 3 | * |
4 | * Based on wdt.c. Original copyright messages: | 4 | * Based on wdt.c. Original copyright messages: |
5 | * | 5 | * |
6 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 6 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
7 | * http://www.redhat.com | 7 | * All Rights Reserved. |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
10 | * modify it under the terms of the GNU General Public License | 10 | * modify it under the terms of the GNU General Public License |
@@ -15,7 +15,7 @@ | |||
15 | * warranty for any of this software. This material is provided | 15 | * warranty for any of this software. This material is provided |
16 | * "AS-IS" and at no charge. | 16 | * "AS-IS" and at no charge. |
17 | * | 17 | * |
18 | * (c) Copyright 1995 Alan Cox <alan@redhat.com> | 18 | * (c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk> |
19 | * | 19 | * |
20 | * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com> | 20 | * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com> |
21 | * Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT | 21 | * Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT |
diff --git a/drivers/watchdog/advantechwdt.c b/drivers/watchdog/advantechwdt.c index a5110f93a755..a1d7856ea6e0 100644 --- a/drivers/watchdog/advantechwdt.c +++ b/drivers/watchdog/advantechwdt.c | |||
@@ -6,8 +6,8 @@ | |||
6 | * Based on acquirewdt.c which is based on wdt.c. | 6 | * Based on acquirewdt.c which is based on wdt.c. |
7 | * Original copyright messages: | 7 | * Original copyright messages: |
8 | * | 8 | * |
9 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 9 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
10 | * http://www.redhat.com | 10 | * All Rights Reserved. |
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or | 12 | * This program is free software; you can redistribute it and/or |
13 | * modify it under the terms of the GNU General Public License | 13 | * modify it under the terms of the GNU General Public License |
@@ -18,7 +18,7 @@ | |||
18 | * warranty for any of this software. This material is provided | 18 | * warranty for any of this software. This material is provided |
19 | * "AS-IS" and at no charge. | 19 | * "AS-IS" and at no charge. |
20 | * | 20 | * |
21 | * (c) Copyright 1995 Alan Cox <alan@redhat.com> | 21 | * (c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk> |
22 | * | 22 | * |
23 | * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com> | 23 | * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com> |
24 | * Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT | 24 | * Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT |
diff --git a/drivers/watchdog/bfin_wdt.c b/drivers/watchdog/bfin_wdt.c index 31b42253054e..067a57cb3f82 100644 --- a/drivers/watchdog/bfin_wdt.c +++ b/drivers/watchdog/bfin_wdt.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * Originally based on softdog.c | 5 | * Originally based on softdog.c |
6 | * Copyright 2006-2007 Analog Devices Inc. | 6 | * Copyright 2006-2007 Analog Devices Inc. |
7 | * Copyright 2006-2007 Michele d'Amico | 7 | * Copyright 2006-2007 Michele d'Amico |
8 | * Copyright 1996 Alan Cox <alan@redhat.com> | 8 | * Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk> |
9 | * | 9 | * |
10 | * Enter bugs at http://blackfin.uclinux.org/ | 10 | * Enter bugs at http://blackfin.uclinux.org/ |
11 | * | 11 | * |
diff --git a/drivers/watchdog/eurotechwdt.c b/drivers/watchdog/eurotechwdt.c index bbd14e34319f..a171fc6ae1cb 100644 --- a/drivers/watchdog/eurotechwdt.c +++ b/drivers/watchdog/eurotechwdt.c | |||
@@ -8,8 +8,8 @@ | |||
8 | * Based on wdt.c. | 8 | * Based on wdt.c. |
9 | * Original copyright messages: | 9 | * Original copyright messages: |
10 | * | 10 | * |
11 | * (c) Copyright 1996-1997 Alan Cox <alan@redhat.com>, All Rights Reserved. | 11 | * (c) Copyright 1996-1997 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
12 | * http://www.redhat.com | 12 | * All Rights Reserved. |
13 | * | 13 | * |
14 | * This program is free software; you can redistribute it and/or | 14 | * This program is free software; you can redistribute it and/or |
15 | * modify it under the terms of the GNU General Public License | 15 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/i6300esb.c b/drivers/watchdog/i6300esb.c index c13383f7fcb9..74f951c18b90 100644 --- a/drivers/watchdog/i6300esb.c +++ b/drivers/watchdog/i6300esb.c | |||
@@ -394,8 +394,7 @@ static unsigned char __init esb_getdevice(void) | |||
394 | goto err_disable; | 394 | goto err_disable; |
395 | } | 395 | } |
396 | 396 | ||
397 | BASEADDR = ioremap(pci_resource_start(esb_pci, 0), | 397 | BASEADDR = pci_ioremap_bar(esb_pci, 0); |
398 | pci_resource_len(esb_pci, 0)); | ||
399 | if (BASEADDR == NULL) { | 398 | if (BASEADDR == NULL) { |
400 | /* Something's wrong here, BASEADDR has to be set */ | 399 | /* Something's wrong here, BASEADDR has to be set */ |
401 | printk(KERN_ERR PFX "failed to get BASEADDR\n"); | 400 | printk(KERN_ERR PFX "failed to get BASEADDR\n"); |
diff --git a/drivers/watchdog/ib700wdt.c b/drivers/watchdog/ib700wdt.c index 8782ec1f5aa0..317ef2b16cff 100644 --- a/drivers/watchdog/ib700wdt.c +++ b/drivers/watchdog/ib700wdt.c | |||
@@ -11,8 +11,8 @@ | |||
11 | * Based on acquirewdt.c which is based on wdt.c. | 11 | * Based on acquirewdt.c which is based on wdt.c. |
12 | * Original copyright messages: | 12 | * Original copyright messages: |
13 | * | 13 | * |
14 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 14 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
15 | * http://www.redhat.com | 15 | * All Rights Reserved. |
16 | * | 16 | * |
17 | * This program is free software; you can redistribute it and/or | 17 | * This program is free software; you can redistribute it and/or |
18 | * modify it under the terms of the GNU General Public License | 18 | * modify it under the terms of the GNU General Public License |
@@ -23,7 +23,7 @@ | |||
23 | * warranty for any of this software. This material is provided | 23 | * warranty for any of this software. This material is provided |
24 | * "AS-IS" and at no charge. | 24 | * "AS-IS" and at no charge. |
25 | * | 25 | * |
26 | * (c) Copyright 1995 Alan Cox <alan@redhat.com> | 26 | * (c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk> |
27 | * | 27 | * |
28 | * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com> | 28 | * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com> |
29 | * Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT | 29 | * Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT |
diff --git a/drivers/watchdog/indydog.c b/drivers/watchdog/indydog.c index 73c9e7992feb..0f761db9a27c 100644 --- a/drivers/watchdog/indydog.c +++ b/drivers/watchdog/indydog.c | |||
@@ -9,7 +9,7 @@ | |||
9 | * as published by the Free Software Foundation; either version | 9 | * as published by the Free Software Foundation; either version |
10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
11 | * | 11 | * |
12 | * based on softdog.c by Alan Cox <alan@redhat.com> | 12 | * based on softdog.c by Alan Cox <alan@lxorguk.ukuu.org.uk> |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
diff --git a/drivers/watchdog/mpcore_wdt.c b/drivers/watchdog/mpcore_wdt.c index 2a9bfa81f9d6..1130ad697ce2 100644 --- a/drivers/watchdog/mpcore_wdt.c +++ b/drivers/watchdog/mpcore_wdt.c | |||
@@ -4,8 +4,8 @@ | |||
4 | * (c) Copyright 2004 ARM Limited | 4 | * (c) Copyright 2004 ARM Limited |
5 | * | 5 | * |
6 | * Based on the SoftDog driver: | 6 | * Based on the SoftDog driver: |
7 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 7 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
8 | * http://www.redhat.com | 8 | * All Rights Reserved. |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or | 10 | * This program is free software; you can redistribute it and/or |
11 | * modify it under the terms of the GNU General Public License | 11 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/omap_wdt.c b/drivers/watchdog/omap_wdt.c index 7bcbb7f4745f..2f2ce7429f5b 100644 --- a/drivers/watchdog/omap_wdt.c +++ b/drivers/watchdog/omap_wdt.c | |||
@@ -16,7 +16,7 @@ | |||
16 | * 20030527: George G. Davis <gdavis@mvista.com> | 16 | * 20030527: George G. Davis <gdavis@mvista.com> |
17 | * Initially based on linux-2.4.19-rmk7-pxa1/drivers/char/sa1100_wdt.c | 17 | * Initially based on linux-2.4.19-rmk7-pxa1/drivers/char/sa1100_wdt.c |
18 | * (c) Copyright 2000 Oleg Drokin <green@crimea.edu> | 18 | * (c) Copyright 2000 Oleg Drokin <green@crimea.edu> |
19 | * Based on SoftDog driver by Alan Cox <alan@redhat.com> | 19 | * Based on SoftDog driver by Alan Cox <alan@lxorguk.ukuu.org.uk> |
20 | * | 20 | * |
21 | * Copyright (c) 2004 Texas Instruments. | 21 | * Copyright (c) 2004 Texas Instruments. |
22 | * 1. Modified to support OMAP1610 32-KHz watchdog timer | 22 | * 1. Modified to support OMAP1610 32-KHz watchdog timer |
diff --git a/drivers/watchdog/pcwd_pci.c b/drivers/watchdog/pcwd_pci.c index 90eb1d4271d7..5d76422c402c 100644 --- a/drivers/watchdog/pcwd_pci.c +++ b/drivers/watchdog/pcwd_pci.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * Based on source code of the following authors: | 6 | * Based on source code of the following authors: |
7 | * Ken Hollis <kenji@bitgate.com>, | 7 | * Ken Hollis <kenji@bitgate.com>, |
8 | * Lindsay Harris <lindsay@bluegum.com>, | 8 | * Lindsay Harris <lindsay@bluegum.com>, |
9 | * Alan Cox <alan@redhat.com>, | 9 | * Alan Cox <alan@lxorguk.ukuu.org.uk>, |
10 | * Matt Domsch <Matt_Domsch@dell.com>, | 10 | * Matt Domsch <Matt_Domsch@dell.com>, |
11 | * Rob Radez <rob@osinvestor.com> | 11 | * Rob Radez <rob@osinvestor.com> |
12 | * | 12 | * |
diff --git a/drivers/watchdog/pcwd_usb.c b/drivers/watchdog/pcwd_usb.c index c1685c942de6..afb089695da8 100644 --- a/drivers/watchdog/pcwd_usb.c +++ b/drivers/watchdog/pcwd_usb.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * | 5 | * |
6 | * Based on source code of the following authors: | 6 | * Based on source code of the following authors: |
7 | * Ken Hollis <kenji@bitgate.com>, | 7 | * Ken Hollis <kenji@bitgate.com>, |
8 | * Alan Cox <alan@redhat.com>, | 8 | * Alan Cox <alan@lxorguk.ukuu.org.uk>, |
9 | * Matt Domsch <Matt_Domsch@dell.com>, | 9 | * Matt Domsch <Matt_Domsch@dell.com>, |
10 | * Rob Radez <rob@osinvestor.com>, | 10 | * Rob Radez <rob@osinvestor.com>, |
11 | * Greg Kroah-Hartman <greg@kroah.com> | 11 | * Greg Kroah-Hartman <greg@kroah.com> |
diff --git a/drivers/watchdog/rc32434_wdt.c b/drivers/watchdog/rc32434_wdt.c index c9c73b69c5e5..57027f4653ce 100644 --- a/drivers/watchdog/rc32434_wdt.c +++ b/drivers/watchdog/rc32434_wdt.c | |||
@@ -7,7 +7,8 @@ | |||
7 | * based on | 7 | * based on |
8 | * SoftDog 0.05: A Software Watchdog Device | 8 | * SoftDog 0.05: A Software Watchdog Device |
9 | * | 9 | * |
10 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 10 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
11 | * All Rights Reserved. | ||
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 | 14 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 86d42801de45..f7f6ce82a5e2 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * S3C2410 Watchdog Timer Support | 6 | * S3C2410 Watchdog Timer Support |
7 | * | 7 | * |
8 | * Based on, softdog.c by Alan Cox, | 8 | * Based on, softdog.c by Alan Cox, |
9 | * (c) Copyright 1996 Alan Cox <alan@redhat.com> | 9 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk> |
10 | * | 10 | * |
11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
diff --git a/drivers/watchdog/sa1100_wdt.c b/drivers/watchdog/sa1100_wdt.c index 31a48437dc3d..ed01e4c2beff 100644 --- a/drivers/watchdog/sa1100_wdt.c +++ b/drivers/watchdog/sa1100_wdt.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * Watchdog driver for the SA11x0/PXA2xx | 2 | * Watchdog driver for the SA11x0/PXA2xx |
3 | * | 3 | * |
4 | * (c) Copyright 2000 Oleg Drokin <green@crimea.edu> | 4 | * (c) Copyright 2000 Oleg Drokin <green@crimea.edu> |
5 | * Based on SoftDog driver by Alan Cox <alan@redhat.com> | 5 | * Based on SoftDog driver by Alan Cox <alan@lxorguk.ukuu.org.uk> |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/sb_wdog.c b/drivers/watchdog/sb_wdog.c index 27e526a07c9a..38f5831c9291 100644 --- a/drivers/watchdog/sb_wdog.c +++ b/drivers/watchdog/sb_wdog.c | |||
@@ -35,8 +35,8 @@ | |||
35 | * Based on various other watchdog drivers, which are probably all | 35 | * Based on various other watchdog drivers, which are probably all |
36 | * loosely based on something Alan Cox wrote years ago. | 36 | * loosely based on something Alan Cox wrote years ago. |
37 | * | 37 | * |
38 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 38 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
39 | * http://www.redhat.com | 39 | * All Rights Reserved. |
40 | * | 40 | * |
41 | * This program is free software; you can redistribute it and/or | 41 | * This program is free software; you can redistribute it and/or |
42 | * modify it under the terms of the GNU General Public License | 42 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/sbc8360.c b/drivers/watchdog/sbc8360.c index fd83dd052d8c..ae74f6bcfa23 100644 --- a/drivers/watchdog/sbc8360.c +++ b/drivers/watchdog/sbc8360.c | |||
@@ -16,8 +16,8 @@ | |||
16 | * Based on acquirewdt.c which is based on wdt.c. | 16 | * Based on acquirewdt.c which is based on wdt.c. |
17 | * Original copyright messages: | 17 | * Original copyright messages: |
18 | * | 18 | * |
19 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 19 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
20 | * http://www.redhat.com | 20 | * All Rights Reserved. |
21 | * | 21 | * |
22 | * This program is free software; you can redistribute it and/or | 22 | * This program is free software; you can redistribute it and/or |
23 | * modify it under the terms of the GNU General Public License | 23 | * modify it under the terms of the GNU General Public License |
@@ -28,7 +28,7 @@ | |||
28 | * warranty for any of this software. This material is provided | 28 | * warranty for any of this software. This material is provided |
29 | * "AS-IS" and at no charge. | 29 | * "AS-IS" and at no charge. |
30 | * | 30 | * |
31 | * (c) Copyright 1995 Alan Cox <alan@redhat.com> | 31 | * (c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk> |
32 | * | 32 | * |
33 | * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com> | 33 | * 14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com> |
34 | * Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT | 34 | * Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT |
diff --git a/drivers/watchdog/sbc_epx_c3.c b/drivers/watchdog/sbc_epx_c3.c index e5e470ca7759..06553debc7bc 100644 --- a/drivers/watchdog/sbc_epx_c3.c +++ b/drivers/watchdog/sbc_epx_c3.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * as published by the Free Software Foundation; either version | 10 | * as published by the Free Software Foundation; either version |
11 | * 2 of the License, or (at your option) any later version. | 11 | * 2 of the License, or (at your option) any later version. |
12 | * | 12 | * |
13 | * based on softdog.c by Alan Cox <alan@redhat.com> | 13 | * based on softdog.c by Alan Cox <alan@lxorguk.ukuu.org.uk> |
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
diff --git a/drivers/watchdog/smsc37b787_wdt.c b/drivers/watchdog/smsc37b787_wdt.c index 988ff1d5b4be..2e56cad77d19 100644 --- a/drivers/watchdog/smsc37b787_wdt.c +++ b/drivers/watchdog/smsc37b787_wdt.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * SMsC 37B787 Watchdog Timer driver for Linux 2.6.x.x | 2 | * SMsC 37B787 Watchdog Timer driver for Linux 2.6.x.x |
3 | * | 3 | * |
4 | * Based on acquirewdt.c by Alan Cox <alan@redhat.com> | 4 | * Based on acquirewdt.c by Alan Cox <alan@lxorguk.ukuu.org.uk> |
5 | * and some other existing drivers | 5 | * and some other existing drivers |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
diff --git a/drivers/watchdog/softdog.c b/drivers/watchdog/softdog.c index c650464c5c63..7204f9662114 100644 --- a/drivers/watchdog/softdog.c +++ b/drivers/watchdog/softdog.c | |||
@@ -1,8 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * SoftDog 0.07: A Software Watchdog Device | 2 | * SoftDog 0.07: A Software Watchdog Device |
3 | * | 3 | * |
4 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 4 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, All Rights Reserved. |
5 | * http://www.redhat.com | ||
6 | * | 5 | * |
7 | * This program is free software; you can redistribute it and/or | 6 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License | 7 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/w83627hf_wdt.c b/drivers/watchdog/w83627hf_wdt.c index 69396adaa5c3..916890abffdd 100644 --- a/drivers/watchdog/w83627hf_wdt.c +++ b/drivers/watchdog/w83627hf_wdt.c | |||
@@ -11,8 +11,8 @@ | |||
11 | * | 11 | * |
12 | * (c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl> | 12 | * (c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl> |
13 | * | 13 | * |
14 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 14 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
15 | * http://www.redhat.com | 15 | * All Rights Reserved. |
16 | * | 16 | * |
17 | * This program is free software; you can redistribute it and/or | 17 | * This program is free software; you can redistribute it and/or |
18 | * modify it under the terms of the GNU General Public License | 18 | * modify it under the terms of the GNU General Public License |
@@ -23,7 +23,7 @@ | |||
23 | * warranty for any of this software. This material is provided | 23 | * warranty for any of this software. This material is provided |
24 | * "AS-IS" and at no charge. | 24 | * "AS-IS" and at no charge. |
25 | * | 25 | * |
26 | * (c) Copyright 1995 Alan Cox <alan@redhat.com> | 26 | * (c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk> |
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
diff --git a/drivers/watchdog/w83697hf_wdt.c b/drivers/watchdog/w83697hf_wdt.c index 445d30a01ed3..3c7aa412b1f3 100644 --- a/drivers/watchdog/w83697hf_wdt.c +++ b/drivers/watchdog/w83697hf_wdt.c | |||
@@ -12,8 +12,8 @@ | |||
12 | * | 12 | * |
13 | * (c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl> | 13 | * (c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl> |
14 | * | 14 | * |
15 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 15 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
16 | * http://www.redhat.com | 16 | * All Rights Reserved. |
17 | * | 17 | * |
18 | * This program is free software; you can redistribute it and/or | 18 | * This program is free software; you can redistribute it and/or |
19 | * modify it under the terms of the GNU General Public License | 19 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/wafer5823wdt.c b/drivers/watchdog/wafer5823wdt.c index 68377ae171ff..42e940c23891 100644 --- a/drivers/watchdog/wafer5823wdt.c +++ b/drivers/watchdog/wafer5823wdt.c | |||
@@ -10,8 +10,8 @@ | |||
10 | * Based on advantechwdt.c which is based on wdt.c. | 10 | * Based on advantechwdt.c which is based on wdt.c. |
11 | * Original copyright messages: | 11 | * Original copyright messages: |
12 | * | 12 | * |
13 | * (c) Copyright 1996-1997 Alan Cox <alan@redhat.com>, All Rights Reserved. | 13 | * (c) Copyright 1996-1997 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
14 | * http://www.redhat.com | 14 | * All Rights Reserved. |
15 | * | 15 | * |
16 | * This program is free software; you can redistribute it and/or | 16 | * This program is free software; you can redistribute it and/or |
17 | * modify it under the terms of the GNU General Public License | 17 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/wdt.c b/drivers/watchdog/wdt.c index deeebb2b13ea..eddb9187e7b6 100644 --- a/drivers/watchdog/wdt.c +++ b/drivers/watchdog/wdt.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * Industrial Computer Source WDT500/501 driver | 2 | * Industrial Computer Source WDT500/501 driver |
3 | * | 3 | * |
4 | * (c) Copyright 1996-1997 Alan Cox <alan@redhat.com>, All Rights Reserved. | 4 | * (c) Copyright 1996-1997 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
5 | * http://www.redhat.com | 5 | * All Rights Reserved. |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/wdt285.c b/drivers/watchdog/wdt285.c index 191ea6302107..f55135662d78 100644 --- a/drivers/watchdog/wdt285.c +++ b/drivers/watchdog/wdt285.c | |||
@@ -6,7 +6,8 @@ | |||
6 | * | 6 | * |
7 | * SoftDog 0.05: A Software Watchdog Device | 7 | * SoftDog 0.05: A Software Watchdog Device |
8 | * | 8 | * |
9 | * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. | 9 | * (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
10 | * All Rights Reserved. | ||
10 | * | 11 | * |
11 | * This program is free software; you can redistribute it and/or | 12 | * This program is free software; you can redistribute it and/or |
12 | * modify it under the terms of the GNU General Public License | 13 | * modify it under the terms of the GNU General Public License |
diff --git a/drivers/watchdog/wdt_pci.c b/drivers/watchdog/wdt_pci.c index ed02bdb38c09..c45839a4a34d 100644 --- a/drivers/watchdog/wdt_pci.c +++ b/drivers/watchdog/wdt_pci.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * Industrial Computer Source PCI-WDT500/501 driver | 2 | * Industrial Computer Source PCI-WDT500/501 driver |
3 | * | 3 | * |
4 | * (c) Copyright 1996-1997 Alan Cox <alan@redhat.com>, All Rights Reserved. | 4 | * (c) Copyright 1996-1997 Alan Cox <alan@lxorguk.ukuu.org.uk>, |
5 | * http://www.redhat.com | 5 | * All Rights Reserved. |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or | 7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Public License | 8 | * modify it under the terms of the GNU General Public License |
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 06db79d05c12..6046239465a1 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
@@ -1251,6 +1251,7 @@ struct kmem_cache *ecryptfs_header_cache_2; | |||
1251 | /** | 1251 | /** |
1252 | * ecryptfs_write_headers_virt | 1252 | * ecryptfs_write_headers_virt |
1253 | * @page_virt: The virtual address to write the headers to | 1253 | * @page_virt: The virtual address to write the headers to |
1254 | * @max: The size of memory allocated at page_virt | ||
1254 | * @size: Set to the number of bytes written by this function | 1255 | * @size: Set to the number of bytes written by this function |
1255 | * @crypt_stat: The cryptographic context | 1256 | * @crypt_stat: The cryptographic context |
1256 | * @ecryptfs_dentry: The eCryptfs dentry | 1257 | * @ecryptfs_dentry: The eCryptfs dentry |
@@ -1278,7 +1279,8 @@ struct kmem_cache *ecryptfs_header_cache_2; | |||
1278 | * | 1279 | * |
1279 | * Returns zero on success | 1280 | * Returns zero on success |
1280 | */ | 1281 | */ |
1281 | static int ecryptfs_write_headers_virt(char *page_virt, size_t *size, | 1282 | static int ecryptfs_write_headers_virt(char *page_virt, size_t max, |
1283 | size_t *size, | ||
1282 | struct ecryptfs_crypt_stat *crypt_stat, | 1284 | struct ecryptfs_crypt_stat *crypt_stat, |
1283 | struct dentry *ecryptfs_dentry) | 1285 | struct dentry *ecryptfs_dentry) |
1284 | { | 1286 | { |
@@ -1296,7 +1298,7 @@ static int ecryptfs_write_headers_virt(char *page_virt, size_t *size, | |||
1296 | offset += written; | 1298 | offset += written; |
1297 | rc = ecryptfs_generate_key_packet_set((page_virt + offset), crypt_stat, | 1299 | rc = ecryptfs_generate_key_packet_set((page_virt + offset), crypt_stat, |
1298 | ecryptfs_dentry, &written, | 1300 | ecryptfs_dentry, &written, |
1299 | PAGE_CACHE_SIZE - offset); | 1301 | max - offset); |
1300 | if (rc) | 1302 | if (rc) |
1301 | ecryptfs_printk(KERN_WARNING, "Error generating key packet " | 1303 | ecryptfs_printk(KERN_WARNING, "Error generating key packet " |
1302 | "set; rc = [%d]\n", rc); | 1304 | "set; rc = [%d]\n", rc); |
@@ -1368,14 +1370,14 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry) | |||
1368 | goto out; | 1370 | goto out; |
1369 | } | 1371 | } |
1370 | /* Released in this function */ | 1372 | /* Released in this function */ |
1371 | virt = kzalloc(crypt_stat->num_header_bytes_at_front, GFP_KERNEL); | 1373 | virt = (char *)get_zeroed_page(GFP_KERNEL); |
1372 | if (!virt) { | 1374 | if (!virt) { |
1373 | printk(KERN_ERR "%s: Out of memory\n", __func__); | 1375 | printk(KERN_ERR "%s: Out of memory\n", __func__); |
1374 | rc = -ENOMEM; | 1376 | rc = -ENOMEM; |
1375 | goto out; | 1377 | goto out; |
1376 | } | 1378 | } |
1377 | rc = ecryptfs_write_headers_virt(virt, &size, crypt_stat, | 1379 | rc = ecryptfs_write_headers_virt(virt, PAGE_CACHE_SIZE, &size, |
1378 | ecryptfs_dentry); | 1380 | crypt_stat, ecryptfs_dentry); |
1379 | if (unlikely(rc)) { | 1381 | if (unlikely(rc)) { |
1380 | printk(KERN_ERR "%s: Error whilst writing headers; rc = [%d]\n", | 1382 | printk(KERN_ERR "%s: Error whilst writing headers; rc = [%d]\n", |
1381 | __func__, rc); | 1383 | __func__, rc); |
@@ -1393,8 +1395,7 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry) | |||
1393 | goto out_free; | 1395 | goto out_free; |
1394 | } | 1396 | } |
1395 | out_free: | 1397 | out_free: |
1396 | memset(virt, 0, crypt_stat->num_header_bytes_at_front); | 1398 | free_page((unsigned long)virt); |
1397 | kfree(virt); | ||
1398 | out: | 1399 | out: |
1399 | return rc; | 1400 | return rc; |
1400 | } | 1401 | } |
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 19eafbe3c379..2b2eec1283bf 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -175,7 +175,7 @@ static ssize_t fat_direct_IO(int rw, struct kiocb *iocb, | |||
175 | 175 | ||
176 | if (rw == WRITE) { | 176 | if (rw == WRITE) { |
177 | /* | 177 | /* |
178 | * FIXME: blockdev_direct_IO() doesn't use ->prepare_write(), | 178 | * FIXME: blockdev_direct_IO() doesn't use ->write_begin(), |
179 | * so we need to update the ->mmu_private to block boundary. | 179 | * so we need to update the ->mmu_private to block boundary. |
180 | * | 180 | * |
181 | * But we must fill the remaining area or hole by nul for | 181 | * But we must fill the remaining area or hole by nul for |
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index d15cd6e7251e..60d4c32c8808 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c | |||
@@ -860,7 +860,6 @@ out: | |||
860 | * int journal_get_undo_access() - Notify intent to modify metadata with non-rewindable consequences | 860 | * int journal_get_undo_access() - Notify intent to modify metadata with non-rewindable consequences |
861 | * @handle: transaction | 861 | * @handle: transaction |
862 | * @bh: buffer to undo | 862 | * @bh: buffer to undo |
863 | * @credits: store the number of taken credits here (if not NULL) | ||
864 | * | 863 | * |
865 | * Sometimes there is a need to distinguish between metadata which has | 864 | * Sometimes there is a need to distinguish between metadata which has |
866 | * been committed to disk and that which has not. The ext3fs code uses | 865 | * been committed to disk and that which has not. The ext3fs code uses |
diff --git a/fs/libfs.c b/fs/libfs.c index 74688598bcf7..e960a8321902 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
@@ -814,7 +814,7 @@ EXPORT_SYMBOL(simple_getattr); | |||
814 | EXPORT_SYMBOL(simple_link); | 814 | EXPORT_SYMBOL(simple_link); |
815 | EXPORT_SYMBOL(simple_lookup); | 815 | EXPORT_SYMBOL(simple_lookup); |
816 | EXPORT_SYMBOL(simple_pin_fs); | 816 | EXPORT_SYMBOL(simple_pin_fs); |
817 | EXPORT_SYMBOL(simple_prepare_write); | 817 | EXPORT_UNUSED_SYMBOL(simple_prepare_write); |
818 | EXPORT_SYMBOL(simple_readpage); | 818 | EXPORT_SYMBOL(simple_readpage); |
819 | EXPORT_SYMBOL(simple_release_fs); | 819 | EXPORT_SYMBOL(simple_release_fs); |
820 | EXPORT_SYMBOL(simple_rename); | 820 | EXPORT_SYMBOL(simple_rename); |
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index dc52793ff8f8..d22eb383e1cf 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
@@ -908,21 +908,16 @@ static int nfs_size_need_update(const struct inode *inode, const struct nfs_fatt | |||
908 | return nfs_size_to_loff_t(fattr->size) > i_size_read(inode); | 908 | return nfs_size_to_loff_t(fattr->size) > i_size_read(inode); |
909 | } | 909 | } |
910 | 910 | ||
911 | static unsigned long nfs_attr_generation_counter; | 911 | static atomic_long_t nfs_attr_generation_counter; |
912 | 912 | ||
913 | static unsigned long nfs_read_attr_generation_counter(void) | 913 | static unsigned long nfs_read_attr_generation_counter(void) |
914 | { | 914 | { |
915 | smp_rmb(); | 915 | return atomic_long_read(&nfs_attr_generation_counter); |
916 | return nfs_attr_generation_counter; | ||
917 | } | 916 | } |
918 | 917 | ||
919 | unsigned long nfs_inc_attr_generation_counter(void) | 918 | unsigned long nfs_inc_attr_generation_counter(void) |
920 | { | 919 | { |
921 | unsigned long ret; | 920 | return atomic_long_inc_return(&nfs_attr_generation_counter); |
922 | smp_rmb(); | ||
923 | ret = ++nfs_attr_generation_counter; | ||
924 | smp_wmb(); | ||
925 | return ret; | ||
926 | } | 921 | } |
927 | 922 | ||
928 | void nfs_fattr_init(struct nfs_fattr *fattr) | 923 | void nfs_fattr_init(struct nfs_fattr *fattr) |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 8d3225a78073..7efe937a415f 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -679,8 +679,7 @@ leave: | |||
679 | 679 | ||
680 | /* Some parts of this taken from generic_cont_expand, which turned out | 680 | /* Some parts of this taken from generic_cont_expand, which turned out |
681 | * to be too fragile to do exactly what we need without us having to | 681 | * to be too fragile to do exactly what we need without us having to |
682 | * worry about recursive locking in ->prepare_write() and | 682 | * worry about recursive locking in ->write_begin() and ->write_end(). */ |
683 | * ->commit_write(). */ | ||
684 | static int ocfs2_write_zero_page(struct inode *inode, | 683 | static int ocfs2_write_zero_page(struct inode *inode, |
685 | u64 size) | 684 | u64 size) |
686 | { | 685 | { |
diff --git a/fs/splice.c b/fs/splice.c index a1e701c27156..1abab5cee4ba 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -731,8 +731,8 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out, | |||
731 | }; | 731 | }; |
732 | 732 | ||
733 | /* | 733 | /* |
734 | * The actor worker might be calling ->prepare_write and | 734 | * The actor worker might be calling ->write_begin and |
735 | * ->commit_write. Most of the time, these expect i_mutex to | 735 | * ->write_end. Most of the time, these expect i_mutex to |
736 | * be held. Since this may result in an ABBA deadlock with | 736 | * be held. Since this may result in an ABBA deadlock with |
737 | * pipe->inode, we have to order lock acquiry here. | 737 | * pipe->inode, we have to order lock acquiry here. |
738 | */ | 738 | */ |
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 8b00f6643e93..1164963c3a85 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
@@ -25,7 +25,6 @@ struct cgroup; | |||
25 | 25 | ||
26 | extern int cgroup_init_early(void); | 26 | extern int cgroup_init_early(void); |
27 | extern int cgroup_init(void); | 27 | extern int cgroup_init(void); |
28 | extern void cgroup_init_smp(void); | ||
29 | extern void cgroup_lock(void); | 28 | extern void cgroup_lock(void); |
30 | extern bool cgroup_lock_live_group(struct cgroup *cgrp); | 29 | extern bool cgroup_lock_live_group(struct cgroup *cgrp); |
31 | extern void cgroup_unlock(void); | 30 | extern void cgroup_unlock(void); |
@@ -348,8 +347,6 @@ struct cgroup_subsys { | |||
348 | struct cgroupfs_root *root; | 347 | struct cgroupfs_root *root; |
349 | 348 | ||
350 | struct list_head sibling; | 349 | struct list_head sibling; |
351 | |||
352 | void *private; | ||
353 | }; | 350 | }; |
354 | 351 | ||
355 | #define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys; | 352 | #define SUBSYS(_x) extern struct cgroup_subsys _x ## _subsys; |
@@ -410,7 +407,6 @@ void cgroup_mm_owner_callbacks(struct task_struct *old, | |||
410 | 407 | ||
411 | static inline int cgroup_init_early(void) { return 0; } | 408 | static inline int cgroup_init_early(void) { return 0; } |
412 | static inline int cgroup_init(void) { return 0; } | 409 | static inline int cgroup_init(void) { return 0; } |
413 | static inline void cgroup_init_smp(void) {} | ||
414 | static inline void cgroup_fork(struct task_struct *p) {} | 410 | static inline void cgroup_fork(struct task_struct *p) {} |
415 | static inline void cgroup_fork_callbacks(struct task_struct *p) {} | 411 | static inline void cgroup_fork_callbacks(struct task_struct *p) {} |
416 | static inline void cgroup_post_fork(struct task_struct *p) {} | 412 | static inline void cgroup_post_fork(struct task_struct *p) {} |
diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 8f225339eee9..5a361f85cfec 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h | |||
@@ -44,11 +44,6 @@ static inline bool should_send_signal(struct task_struct *p) | |||
44 | return !(p->flags & PF_FREEZER_NOSIG); | 44 | return !(p->flags & PF_FREEZER_NOSIG); |
45 | } | 45 | } |
46 | 46 | ||
47 | /* | ||
48 | * Wake up a frozen process | ||
49 | */ | ||
50 | extern int __thaw_process(struct task_struct *p); | ||
51 | |||
52 | /* Takes and releases task alloc lock using task_lock() */ | 47 | /* Takes and releases task alloc lock using task_lock() */ |
53 | extern int thaw_process(struct task_struct *p); | 48 | extern int thaw_process(struct task_struct *p); |
54 | 49 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index 5b248d61430c..0dcdd9458f4b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -489,13 +489,6 @@ struct address_space_operations { | |||
489 | int (*readpages)(struct file *filp, struct address_space *mapping, | 489 | int (*readpages)(struct file *filp, struct address_space *mapping, |
490 | struct list_head *pages, unsigned nr_pages); | 490 | struct list_head *pages, unsigned nr_pages); |
491 | 491 | ||
492 | /* | ||
493 | * ext3 requires that a successful prepare_write() call be followed | ||
494 | * by a commit_write() call - they must be balanced | ||
495 | */ | ||
496 | int (*prepare_write)(struct file *, struct page *, unsigned, unsigned); | ||
497 | int (*commit_write)(struct file *, struct page *, unsigned, unsigned); | ||
498 | |||
499 | int (*write_begin)(struct file *, struct address_space *mapping, | 492 | int (*write_begin)(struct file *, struct address_space *mapping, |
500 | loff_t pos, unsigned len, unsigned flags, | 493 | loff_t pos, unsigned len, unsigned flags, |
501 | struct page **pagep, void **fsdata); | 494 | struct page **pagep, void **fsdata); |
diff --git a/include/linux/hid.h b/include/linux/hid.h index 5355ca4b939e..e5780f8c934a 100644 --- a/include/linux/hid.h +++ b/include/linux/hid.h | |||
@@ -410,6 +410,7 @@ struct hid_output_fifo { | |||
410 | #define HID_SUSPENDED 5 | 410 | #define HID_SUSPENDED 5 |
411 | #define HID_CLEAR_HALT 6 | 411 | #define HID_CLEAR_HALT 6 |
412 | #define HID_DISCONNECTED 7 | 412 | #define HID_DISCONNECTED 7 |
413 | #define HID_STARTED 8 | ||
413 | 414 | ||
414 | struct hid_input { | 415 | struct hid_input { |
415 | struct list_head list; | 416 | struct list_head list; |
diff --git a/include/linux/init.h b/include/linux/init.h index 0c1264668be0..68cb0265d009 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
@@ -112,21 +112,25 @@ | |||
112 | #define __FINIT .previous | 112 | #define __FINIT .previous |
113 | 113 | ||
114 | #define __INITDATA .section ".init.data","aw" | 114 | #define __INITDATA .section ".init.data","aw" |
115 | #define __INITRODATA .section ".init.rodata","a" | ||
115 | #define __FINITDATA .previous | 116 | #define __FINITDATA .previous |
116 | 117 | ||
117 | #define __DEVINIT .section ".devinit.text", "ax" | 118 | #define __DEVINIT .section ".devinit.text", "ax" |
118 | #define __DEVINITDATA .section ".devinit.data", "aw" | 119 | #define __DEVINITDATA .section ".devinit.data", "aw" |
120 | #define __DEVINITRODATA .section ".devinit.rodata", "a" | ||
119 | 121 | ||
120 | #define __CPUINIT .section ".cpuinit.text", "ax" | 122 | #define __CPUINIT .section ".cpuinit.text", "ax" |
121 | #define __CPUINITDATA .section ".cpuinit.data", "aw" | 123 | #define __CPUINITDATA .section ".cpuinit.data", "aw" |
124 | #define __CPUINITRODATA .section ".cpuinit.rodata", "a" | ||
122 | 125 | ||
123 | #define __MEMINIT .section ".meminit.text", "ax" | 126 | #define __MEMINIT .section ".meminit.text", "ax" |
124 | #define __MEMINITDATA .section ".meminit.data", "aw" | 127 | #define __MEMINITDATA .section ".meminit.data", "aw" |
128 | #define __MEMINITRODATA .section ".meminit.rodata", "a" | ||
125 | 129 | ||
126 | /* silence warnings when references are OK */ | 130 | /* silence warnings when references are OK */ |
127 | #define __REF .section ".ref.text", "ax" | 131 | #define __REF .section ".ref.text", "ax" |
128 | #define __REFDATA .section ".ref.data", "aw" | 132 | #define __REFDATA .section ".ref.data", "aw" |
129 | #define __REFCONST .section ".ref.rodata", "aw" | 133 | #define __REFCONST .section ".ref.rodata", "a" |
130 | 134 | ||
131 | #ifndef __ASSEMBLY__ | 135 | #ifndef __ASSEMBLY__ |
132 | /* | 136 | /* |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 396a350b87a6..fba141d3ca07 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -116,6 +116,8 @@ extern int _cond_resched(void); | |||
116 | # define might_resched() do { } while (0) | 116 | # define might_resched() do { } while (0) |
117 | #endif | 117 | #endif |
118 | 118 | ||
119 | #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP | ||
120 | void __might_sleep(char *file, int line); | ||
119 | /** | 121 | /** |
120 | * might_sleep - annotation for functions that can sleep | 122 | * might_sleep - annotation for functions that can sleep |
121 | * | 123 | * |
@@ -126,8 +128,6 @@ extern int _cond_resched(void); | |||
126 | * be bitten later when the calling function happens to sleep when it is not | 128 | * be bitten later when the calling function happens to sleep when it is not |
127 | * supposed to. | 129 | * supposed to. |
128 | */ | 130 | */ |
129 | #ifdef CONFIG_DEBUG_SPINLOCK_SLEEP | ||
130 | void __might_sleep(char *file, int line); | ||
131 | # define might_sleep() \ | 131 | # define might_sleep() \ |
132 | do { __might_sleep(__FILE__, __LINE__); might_resched(); } while (0) | 132 | do { __might_sleep(__FILE__, __LINE__); might_resched(); } while (0) |
133 | #else | 133 | #else |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index eb71b45fdf5a..97b91d1abb43 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
@@ -135,6 +135,7 @@ struct usb_device_id { | |||
135 | 135 | ||
136 | struct hid_device_id { | 136 | struct hid_device_id { |
137 | __u16 bus; | 137 | __u16 bus; |
138 | __u16 pad1; | ||
138 | __u32 vendor; | 139 | __u32 vendor; |
139 | __u32 product; | 140 | __u32 product; |
140 | kernel_ulong_t driver_data | 141 | kernel_ulong_t driver_data |
diff --git a/include/linux/resource.h b/include/linux/resource.h index aaa423a6f3d9..40fc7e626082 100644 --- a/include/linux/resource.h +++ b/include/linux/resource.h | |||
@@ -59,10 +59,10 @@ struct rlimit { | |||
59 | #define _STK_LIM (8*1024*1024) | 59 | #define _STK_LIM (8*1024*1024) |
60 | 60 | ||
61 | /* | 61 | /* |
62 | * GPG wants 32kB of mlocked memory, to make sure pass phrases | 62 | * GPG2 wants 64kB of mlocked memory, to make sure pass phrases |
63 | * and other sensitive information are never written to disk. | 63 | * and other sensitive information are never written to disk. |
64 | */ | 64 | */ |
65 | #define MLOCK_LIMIT (8 * PAGE_SIZE) | 65 | #define MLOCK_LIMIT ((PAGE_SIZE > 64*1024) ? PAGE_SIZE : 64*1024) |
66 | 66 | ||
67 | /* | 67 | /* |
68 | * Due to binary compatibility, the actual resource numbers | 68 | * Due to binary compatibility, the actual resource numbers |
diff --git a/include/linux/security.h b/include/linux/security.h index f5c4a51eb42e..c13f1cec9abb 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -1585,6 +1585,7 @@ int security_syslog(int type); | |||
1585 | int security_settime(struct timespec *ts, struct timezone *tz); | 1585 | int security_settime(struct timespec *ts, struct timezone *tz); |
1586 | int security_vm_enough_memory(long pages); | 1586 | int security_vm_enough_memory(long pages); |
1587 | int security_vm_enough_memory_mm(struct mm_struct *mm, long pages); | 1587 | int security_vm_enough_memory_mm(struct mm_struct *mm, long pages); |
1588 | int security_vm_enough_memory_kern(long pages); | ||
1588 | int security_bprm_alloc(struct linux_binprm *bprm); | 1589 | int security_bprm_alloc(struct linux_binprm *bprm); |
1589 | void security_bprm_free(struct linux_binprm *bprm); | 1590 | void security_bprm_free(struct linux_binprm *bprm); |
1590 | void security_bprm_apply_creds(struct linux_binprm *bprm, int unsafe); | 1591 | void security_bprm_apply_creds(struct linux_binprm *bprm, int unsafe); |
@@ -1820,6 +1821,11 @@ static inline int security_vm_enough_memory(long pages) | |||
1820 | return cap_vm_enough_memory(current->mm, pages); | 1821 | return cap_vm_enough_memory(current->mm, pages); |
1821 | } | 1822 | } |
1822 | 1823 | ||
1824 | static inline int security_vm_enough_memory_kern(long pages) | ||
1825 | { | ||
1826 | return cap_vm_enough_memory(current->mm, pages); | ||
1827 | } | ||
1828 | |||
1823 | static inline int security_vm_enough_memory_mm(struct mm_struct *mm, long pages) | 1829 | static inline int security_vm_enough_memory_mm(struct mm_struct *mm, long pages) |
1824 | { | 1830 | { |
1825 | return cap_vm_enough_memory(mm, pages); | 1831 | return cap_vm_enough_memory(mm, pages); |
diff --git a/include/linux/spi/spi_bitbang.h b/include/linux/spi/spi_bitbang.h index b8db32cea1de..bf8de281b4ed 100644 --- a/include/linux/spi/spi_bitbang.h +++ b/include/linux/spi/spi_bitbang.h | |||
@@ -18,6 +18,9 @@ | |||
18 | * duplex (MicroWire) controllers. Provide chipslect() and txrx_bufs(), | 18 | * duplex (MicroWire) controllers. Provide chipslect() and txrx_bufs(), |
19 | * and custom setup()/cleanup() methods. | 19 | * and custom setup()/cleanup() methods. |
20 | */ | 20 | */ |
21 | |||
22 | #include <linux/workqueue.h> | ||
23 | |||
21 | struct spi_bitbang { | 24 | struct spi_bitbang { |
22 | struct workqueue_struct *workqueue; | 25 | struct workqueue_struct *workqueue; |
23 | struct work_struct work; | 26 | struct work_struct work; |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index d861197f83c7..8856e2d60e9f 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -1474,7 +1474,6 @@ void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, | |||
1474 | * ieee80211_beacon_get - beacon generation function | 1474 | * ieee80211_beacon_get - beacon generation function |
1475 | * @hw: pointer obtained from ieee80211_alloc_hw(). | 1475 | * @hw: pointer obtained from ieee80211_alloc_hw(). |
1476 | * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf. | 1476 | * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf. |
1477 | * @control: will be filled with information needed to send this beacon. | ||
1478 | * | 1477 | * |
1479 | * If the beacon frames are generated by the host system (i.e., not in | 1478 | * If the beacon frames are generated by the host system (i.e., not in |
1480 | * hardware/firmware), the low-level driver uses this function to receive | 1479 | * hardware/firmware), the low-level driver uses this function to receive |
@@ -1575,7 +1574,6 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, | |||
1575 | * ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames | 1574 | * ieee80211_get_buffered_bc - accessing buffered broadcast and multicast frames |
1576 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | 1575 | * @hw: pointer as obtained from ieee80211_alloc_hw(). |
1577 | * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf. | 1576 | * @vif: &struct ieee80211_vif pointer from &struct ieee80211_if_init_conf. |
1578 | * @control: will be filled with information needed to send returned frame. | ||
1579 | * | 1577 | * |
1580 | * Function for accessing buffered broadcast and multicast frames. If | 1578 | * Function for accessing buffered broadcast and multicast frames. If |
1581 | * hardware/firmware does not implement buffering of broadcast/multicast | 1579 | * hardware/firmware does not implement buffering of broadcast/multicast |
@@ -1623,9 +1621,8 @@ unsigned int ieee80211_hdrlen(__le16 fc); | |||
1623 | * | 1621 | * |
1624 | * @keyconf: the parameter passed with the set key | 1622 | * @keyconf: the parameter passed with the set key |
1625 | * @skb: the skb for which the key is needed | 1623 | * @skb: the skb for which the key is needed |
1626 | * @rc4key: a buffer to which the key will be written | ||
1627 | * @type: TBD | 1624 | * @type: TBD |
1628 | * @key: TBD | 1625 | * @key: a buffer to which the key will be written |
1629 | */ | 1626 | */ |
1630 | void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf, | 1627 | void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf, |
1631 | struct sk_buff *skb, | 1628 | struct sk_buff *skb, |
@@ -1726,7 +1723,8 @@ void ieee80211_iterate_active_interfaces_atomic(struct ieee80211_hw *hw, | |||
1726 | * @hw: pointer as obtained from ieee80211_alloc_hw(). | 1723 | * @hw: pointer as obtained from ieee80211_alloc_hw(). |
1727 | * @ra: receiver address of the BA session recipient | 1724 | * @ra: receiver address of the BA session recipient |
1728 | * @tid: the TID to BA on. | 1725 | * @tid: the TID to BA on. |
1729 | * @return: success if addBA request was sent, failure otherwise | 1726 | * |
1727 | * Return: success if addBA request was sent, failure otherwise | ||
1730 | * | 1728 | * |
1731 | * Although mac80211/low level driver/user space application can estimate | 1729 | * Although mac80211/low level driver/user space application can estimate |
1732 | * the need to start aggregation on a certain RA/TID, the session level | 1730 | * the need to start aggregation on a certain RA/TID, the session level |
@@ -1764,7 +1762,8 @@ void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, const u8 *ra, | |||
1764 | * @ra: receiver address of the BA session recipient | 1762 | * @ra: receiver address of the BA session recipient |
1765 | * @tid: the TID to stop BA. | 1763 | * @tid: the TID to stop BA. |
1766 | * @initiator: if indicates initiator DELBA frame will be sent. | 1764 | * @initiator: if indicates initiator DELBA frame will be sent. |
1767 | * @return: error if no sta with matching da found, success otherwise | 1765 | * |
1766 | * Return: error if no sta with matching da found, success otherwise | ||
1768 | * | 1767 | * |
1769 | * Although mac80211/low level driver/user space application can estimate | 1768 | * Although mac80211/low level driver/user space application can estimate |
1770 | * the need to stop aggregation on a certain RA/TID, the session level | 1769 | * the need to stop aggregation on a certain RA/TID, the session level |
diff --git a/include/sound/soc.h b/include/sound/soc.h index a1e0357a84d7..5e0189876afd 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -28,7 +28,8 @@ | |||
28 | */ | 28 | */ |
29 | #define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) \ | 29 | #define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) \ |
30 | ((unsigned long)&(struct soc_mixer_control) \ | 30 | ((unsigned long)&(struct soc_mixer_control) \ |
31 | {.reg = xreg, .shift = xshift, .max = xmax, .invert = xinvert}) | 31 | {.reg = xreg, .shift = xshift, .rshift = xshift, .max = xmax, \ |
32 | .invert = xinvert}) | ||
32 | #define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \ | 33 | #define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \ |
33 | ((unsigned long)&(struct soc_mixer_control) \ | 34 | ((unsigned long)&(struct soc_mixer_control) \ |
34 | {.reg = xreg, .max = xmax, .invert = xinvert}) | 35 | {.reg = xreg, .max = xmax, .invert = xinvert}) |
diff --git a/init/Kconfig b/init/Kconfig index 44e9208f9c78..86b00c53fade 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -401,16 +401,20 @@ config CGROUP_MEM_RES_CTLR | |||
401 | depends on CGROUPS && RESOURCE_COUNTERS | 401 | depends on CGROUPS && RESOURCE_COUNTERS |
402 | select MM_OWNER | 402 | select MM_OWNER |
403 | help | 403 | help |
404 | Provides a memory resource controller that manages both page cache and | 404 | Provides a memory resource controller that manages both anonymous |
405 | RSS memory. | 405 | memory and page cache. (See Documentation/controllers/memory.txt) |
406 | 406 | ||
407 | Note that setting this option increases fixed memory overhead | 407 | Note that setting this option increases fixed memory overhead |
408 | associated with each page of memory in the system by 4/8 bytes | 408 | associated with each page of memory in the system. By this, |
409 | and also increases cache misses because struct page on many 64bit | 409 | 20(40)bytes/PAGE_SIZE on 32(64)bit system will be occupied by memory |
410 | systems will not fit into a single cache line anymore. | 410 | usage tracking struct at boot. Total amount of this is printed out |
411 | at boot. | ||
411 | 412 | ||
412 | Only enable when you're ok with these trade offs and really | 413 | Only enable when you're ok with these trade offs and really |
413 | sure you need the memory resource controller. | 414 | sure you need the memory resource controller. Even when you enable |
415 | this, you can set "cgroup_disable=memory" at your boot option to | ||
416 | disable memory resource controller and you can avoid overheads. | ||
417 | (and lose benefits of memory resource contoller) | ||
414 | 418 | ||
415 | This config option also selects MM_OWNER config option, which | 419 | This config option also selects MM_OWNER config option, which |
416 | could in turn add some fork/exit overhead. | 420 | could in turn add some fork/exit overhead. |
diff --git a/init/do_mounts_md.c b/init/do_mounts_md.c index 4c87ee1fe5d3..4d42f450b590 100644 --- a/init/do_mounts_md.c +++ b/init/do_mounts_md.c | |||
@@ -1,4 +1,4 @@ | |||
1 | 1 | #include <linux/delay.h> | |
2 | #include <linux/raid/md.h> | 2 | #include <linux/raid/md.h> |
3 | #include <linux/delay.h> | 3 | #include <linux/delay.h> |
4 | 4 | ||
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index e95056954498..7fa476f01d05 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c | |||
@@ -162,9 +162,13 @@ static int freezer_can_attach(struct cgroup_subsys *ss, | |||
162 | struct task_struct *task) | 162 | struct task_struct *task) |
163 | { | 163 | { |
164 | struct freezer *freezer; | 164 | struct freezer *freezer; |
165 | int retval; | ||
166 | 165 | ||
167 | /* Anything frozen can't move or be moved to/from */ | 166 | /* |
167 | * Anything frozen can't move or be moved to/from. | ||
168 | * | ||
169 | * Since orig_freezer->state == FROZEN means that @task has been | ||
170 | * frozen, so it's sufficient to check the latter condition. | ||
171 | */ | ||
168 | 172 | ||
169 | if (is_task_frozen_enough(task)) | 173 | if (is_task_frozen_enough(task)) |
170 | return -EBUSY; | 174 | return -EBUSY; |
@@ -173,13 +177,7 @@ static int freezer_can_attach(struct cgroup_subsys *ss, | |||
173 | if (freezer->state == CGROUP_FROZEN) | 177 | if (freezer->state == CGROUP_FROZEN) |
174 | return -EBUSY; | 178 | return -EBUSY; |
175 | 179 | ||
176 | retval = 0; | 180 | return 0; |
177 | task_lock(task); | ||
178 | freezer = task_freezer(task); | ||
179 | if (freezer->state == CGROUP_FROZEN) | ||
180 | retval = -EBUSY; | ||
181 | task_unlock(task); | ||
182 | return retval; | ||
183 | } | 181 | } |
184 | 182 | ||
185 | static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task) | 183 | static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task) |
@@ -190,8 +188,9 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task) | |||
190 | freezer = task_freezer(task); | 188 | freezer = task_freezer(task); |
191 | task_unlock(task); | 189 | task_unlock(task); |
192 | 190 | ||
193 | BUG_ON(freezer->state == CGROUP_FROZEN); | ||
194 | spin_lock_irq(&freezer->lock); | 191 | spin_lock_irq(&freezer->lock); |
192 | BUG_ON(freezer->state == CGROUP_FROZEN); | ||
193 | |||
195 | /* Locking avoids race with FREEZING -> THAWED transitions. */ | 194 | /* Locking avoids race with FREEZING -> THAWED transitions. */ |
196 | if (freezer->state == CGROUP_FREEZING) | 195 | if (freezer->state == CGROUP_FREEZING) |
197 | freeze_task(task, true); | 196 | freeze_task(task, true); |
@@ -276,25 +275,18 @@ static int try_to_freeze_cgroup(struct cgroup *cgroup, struct freezer *freezer) | |||
276 | return num_cant_freeze_now ? -EBUSY : 0; | 275 | return num_cant_freeze_now ? -EBUSY : 0; |
277 | } | 276 | } |
278 | 277 | ||
279 | static int unfreeze_cgroup(struct cgroup *cgroup, struct freezer *freezer) | 278 | static void unfreeze_cgroup(struct cgroup *cgroup, struct freezer *freezer) |
280 | { | 279 | { |
281 | struct cgroup_iter it; | 280 | struct cgroup_iter it; |
282 | struct task_struct *task; | 281 | struct task_struct *task; |
283 | 282 | ||
284 | cgroup_iter_start(cgroup, &it); | 283 | cgroup_iter_start(cgroup, &it); |
285 | while ((task = cgroup_iter_next(cgroup, &it))) { | 284 | while ((task = cgroup_iter_next(cgroup, &it))) { |
286 | int do_wake; | 285 | thaw_process(task); |
287 | |||
288 | task_lock(task); | ||
289 | do_wake = __thaw_process(task); | ||
290 | task_unlock(task); | ||
291 | if (do_wake) | ||
292 | wake_up_process(task); | ||
293 | } | 286 | } |
294 | cgroup_iter_end(cgroup, &it); | 287 | cgroup_iter_end(cgroup, &it); |
295 | freezer->state = CGROUP_THAWED; | ||
296 | 288 | ||
297 | return 0; | 289 | freezer->state = CGROUP_THAWED; |
298 | } | 290 | } |
299 | 291 | ||
300 | static int freezer_change_state(struct cgroup *cgroup, | 292 | static int freezer_change_state(struct cgroup *cgroup, |
@@ -304,27 +296,22 @@ static int freezer_change_state(struct cgroup *cgroup, | |||
304 | int retval = 0; | 296 | int retval = 0; |
305 | 297 | ||
306 | freezer = cgroup_freezer(cgroup); | 298 | freezer = cgroup_freezer(cgroup); |
299 | |||
307 | spin_lock_irq(&freezer->lock); | 300 | spin_lock_irq(&freezer->lock); |
301 | |||
308 | update_freezer_state(cgroup, freezer); | 302 | update_freezer_state(cgroup, freezer); |
309 | if (goal_state == freezer->state) | 303 | if (goal_state == freezer->state) |
310 | goto out; | 304 | goto out; |
311 | switch (freezer->state) { | 305 | |
306 | switch (goal_state) { | ||
312 | case CGROUP_THAWED: | 307 | case CGROUP_THAWED: |
313 | retval = try_to_freeze_cgroup(cgroup, freezer); | 308 | unfreeze_cgroup(cgroup, freezer); |
314 | break; | 309 | break; |
315 | case CGROUP_FREEZING: | ||
316 | if (goal_state == CGROUP_FROZEN) { | ||
317 | /* Userspace is retrying after | ||
318 | * "/bin/echo FROZEN > freezer.state" returned -EBUSY */ | ||
319 | retval = try_to_freeze_cgroup(cgroup, freezer); | ||
320 | break; | ||
321 | } | ||
322 | /* state == FREEZING and goal_state == THAWED, so unfreeze */ | ||
323 | case CGROUP_FROZEN: | 310 | case CGROUP_FROZEN: |
324 | retval = unfreeze_cgroup(cgroup, freezer); | 311 | retval = try_to_freeze_cgroup(cgroup, freezer); |
325 | break; | 312 | break; |
326 | default: | 313 | default: |
327 | break; | 314 | BUG(); |
328 | } | 315 | } |
329 | out: | 316 | out: |
330 | spin_unlock_irq(&freezer->lock); | 317 | spin_unlock_irq(&freezer->lock); |
diff --git a/kernel/freezer.c b/kernel/freezer.c index ba6248b323ef..2f4936cf7083 100644 --- a/kernel/freezer.c +++ b/kernel/freezer.c | |||
@@ -121,16 +121,7 @@ void cancel_freezing(struct task_struct *p) | |||
121 | } | 121 | } |
122 | } | 122 | } |
123 | 123 | ||
124 | /* | 124 | static int __thaw_process(struct task_struct *p) |
125 | * Wake up a frozen process | ||
126 | * | ||
127 | * task_lock() is needed to prevent the race with refrigerator() which may | ||
128 | * occur if the freezing of tasks fails. Namely, without the lock, if the | ||
129 | * freezing of tasks failed, thaw_tasks() might have run before a task in | ||
130 | * refrigerator() could call frozen_process(), in which case the task would be | ||
131 | * frozen and no one would thaw it. | ||
132 | */ | ||
133 | int __thaw_process(struct task_struct *p) | ||
134 | { | 125 | { |
135 | if (frozen(p)) { | 126 | if (frozen(p)) { |
136 | p->flags &= ~PF_FROZEN; | 127 | p->flags &= ~PF_FROZEN; |
@@ -140,6 +131,15 @@ int __thaw_process(struct task_struct *p) | |||
140 | return 0; | 131 | return 0; |
141 | } | 132 | } |
142 | 133 | ||
134 | /* | ||
135 | * Wake up a frozen process | ||
136 | * | ||
137 | * task_lock() is needed to prevent the race with refrigerator() which may | ||
138 | * occur if the freezing of tasks fails. Namely, without the lock, if the | ||
139 | * freezing of tasks failed, thaw_tasks() might have run before a task in | ||
140 | * refrigerator() could call frozen_process(), in which case the task would be | ||
141 | * frozen and no one would thaw it. | ||
142 | */ | ||
143 | int thaw_process(struct task_struct *p) | 143 | int thaw_process(struct task_struct *p) |
144 | { | 144 | { |
145 | task_lock(p); | 145 | task_lock(p); |
diff --git a/kernel/profile.c b/kernel/profile.c index a9e422df6bf6..9830a037d8db 100644 --- a/kernel/profile.c +++ b/kernel/profile.c | |||
@@ -102,7 +102,7 @@ int profile_setup(char *str) | |||
102 | __setup("profile=", profile_setup); | 102 | __setup("profile=", profile_setup); |
103 | 103 | ||
104 | 104 | ||
105 | int profile_init(void) | 105 | int __ref profile_init(void) |
106 | { | 106 | { |
107 | int buffer_bytes; | 107 | int buffer_bytes; |
108 | if (!prof_on) | 108 | if (!prof_on) |
diff --git a/kernel/signal.c b/kernel/signal.c index 105217da5c82..4530fc654455 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -1144,7 +1144,8 @@ static int kill_something_info(int sig, struct siginfo *info, pid_t pid) | |||
1144 | struct task_struct * p; | 1144 | struct task_struct * p; |
1145 | 1145 | ||
1146 | for_each_process(p) { | 1146 | for_each_process(p) { |
1147 | if (p->pid > 1 && !same_thread_group(p, current)) { | 1147 | if (task_pid_vnr(p) > 1 && |
1148 | !same_thread_group(p, current)) { | ||
1148 | int err = group_send_sig_info(sig, info, p); | 1149 | int err = group_send_sig_info(sig, info, p); |
1149 | ++count; | 1150 | ++count; |
1150 | if (err != -EPERM) | 1151 | if (err != -EPERM) |
diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig index e0cea282e0c5..b58f43bec363 100644 --- a/kernel/trace/Kconfig +++ b/kernel/trace/Kconfig | |||
@@ -8,7 +8,6 @@ config NOP_TRACER | |||
8 | 8 | ||
9 | config HAVE_FUNCTION_TRACER | 9 | config HAVE_FUNCTION_TRACER |
10 | bool | 10 | bool |
11 | select NOP_TRACER | ||
12 | 11 | ||
13 | config HAVE_DYNAMIC_FTRACE | 12 | config HAVE_DYNAMIC_FTRACE |
14 | bool | 13 | bool |
@@ -28,6 +27,7 @@ config TRACING | |||
28 | select RING_BUFFER | 27 | select RING_BUFFER |
29 | select STACKTRACE | 28 | select STACKTRACE |
30 | select TRACEPOINTS | 29 | select TRACEPOINTS |
30 | select NOP_TRACER | ||
31 | 31 | ||
32 | menu "Tracers" | 32 | menu "Tracers" |
33 | 33 | ||
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 7618c528756b..4a39d24568c8 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -1339,6 +1339,14 @@ void __init ftrace_init(void) | |||
1339 | } | 1339 | } |
1340 | 1340 | ||
1341 | #else | 1341 | #else |
1342 | |||
1343 | static int __init ftrace_nodyn_init(void) | ||
1344 | { | ||
1345 | ftrace_enabled = 1; | ||
1346 | return 0; | ||
1347 | } | ||
1348 | device_initcall(ftrace_nodyn_init); | ||
1349 | |||
1342 | # define ftrace_startup() do { } while (0) | 1350 | # define ftrace_startup() do { } while (0) |
1343 | # define ftrace_shutdown() do { } while (0) | 1351 | # define ftrace_shutdown() do { } while (0) |
1344 | # define ftrace_startup_sysctl() do { } while (0) | 1352 | # define ftrace_startup_sysctl() do { } while (0) |
diff --git a/lib/dynamic_printk.c b/lib/dynamic_printk.c index d640f87bdc9e..d83660fd6fdd 100644 --- a/lib/dynamic_printk.c +++ b/lib/dynamic_printk.c | |||
@@ -402,6 +402,8 @@ static int __init dynamic_printk_init(void) | |||
402 | iter->logical_modname, | 402 | iter->logical_modname, |
403 | iter->flag_names, iter->hash, iter->hash2); | 403 | iter->flag_names, iter->hash, iter->hash2); |
404 | } | 404 | } |
405 | if (dynamic_enabled == DYNAMIC_ENABLED_ALL) | ||
406 | set_all(true); | ||
405 | return 0; | 407 | return 0; |
406 | } | 408 | } |
407 | module_init(dynamic_printk_init); | 409 | module_init(dynamic_printk_init); |
@@ -411,7 +413,7 @@ static int __init dynamic_printk_setup(char *str) | |||
411 | { | 413 | { |
412 | if (str) | 414 | if (str) |
413 | return -ENOENT; | 415 | return -ENOENT; |
414 | set_all(true); | 416 | dynamic_enabled = DYNAMIC_ENABLED_ALL; |
415 | return 0; | 417 | return 0; |
416 | } | 418 | } |
417 | /* Use early_param(), so we can get debug output as early as possible */ | 419 | /* Use early_param(), so we can get debug output as early as possible */ |
diff --git a/mm/filemap.c b/mm/filemap.c index ab8553658af3..f3e5f8944d17 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -2029,48 +2029,8 @@ int pagecache_write_begin(struct file *file, struct address_space *mapping, | |||
2029 | { | 2029 | { |
2030 | const struct address_space_operations *aops = mapping->a_ops; | 2030 | const struct address_space_operations *aops = mapping->a_ops; |
2031 | 2031 | ||
2032 | if (aops->write_begin) { | 2032 | return aops->write_begin(file, mapping, pos, len, flags, |
2033 | return aops->write_begin(file, mapping, pos, len, flags, | ||
2034 | pagep, fsdata); | 2033 | pagep, fsdata); |
2035 | } else { | ||
2036 | int ret; | ||
2037 | pgoff_t index = pos >> PAGE_CACHE_SHIFT; | ||
2038 | unsigned offset = pos & (PAGE_CACHE_SIZE - 1); | ||
2039 | struct inode *inode = mapping->host; | ||
2040 | struct page *page; | ||
2041 | again: | ||
2042 | page = __grab_cache_page(mapping, index); | ||
2043 | *pagep = page; | ||
2044 | if (!page) | ||
2045 | return -ENOMEM; | ||
2046 | |||
2047 | if (flags & AOP_FLAG_UNINTERRUPTIBLE && !PageUptodate(page)) { | ||
2048 | /* | ||
2049 | * There is no way to resolve a short write situation | ||
2050 | * for a !Uptodate page (except by double copying in | ||
2051 | * the caller done by generic_perform_write_2copy). | ||
2052 | * | ||
2053 | * Instead, we have to bring it uptodate here. | ||
2054 | */ | ||
2055 | ret = aops->readpage(file, page); | ||
2056 | page_cache_release(page); | ||
2057 | if (ret) { | ||
2058 | if (ret == AOP_TRUNCATED_PAGE) | ||
2059 | goto again; | ||
2060 | return ret; | ||
2061 | } | ||
2062 | goto again; | ||
2063 | } | ||
2064 | |||
2065 | ret = aops->prepare_write(file, page, offset, offset+len); | ||
2066 | if (ret) { | ||
2067 | unlock_page(page); | ||
2068 | page_cache_release(page); | ||
2069 | if (pos + len > inode->i_size) | ||
2070 | vmtruncate(inode, inode->i_size); | ||
2071 | } | ||
2072 | return ret; | ||
2073 | } | ||
2074 | } | 2034 | } |
2075 | EXPORT_SYMBOL(pagecache_write_begin); | 2035 | EXPORT_SYMBOL(pagecache_write_begin); |
2076 | 2036 | ||
@@ -2079,32 +2039,9 @@ int pagecache_write_end(struct file *file, struct address_space *mapping, | |||
2079 | struct page *page, void *fsdata) | 2039 | struct page *page, void *fsdata) |
2080 | { | 2040 | { |
2081 | const struct address_space_operations *aops = mapping->a_ops; | 2041 | const struct address_space_operations *aops = mapping->a_ops; |
2082 | int ret; | ||
2083 | |||
2084 | if (aops->write_end) { | ||
2085 | mark_page_accessed(page); | ||
2086 | ret = aops->write_end(file, mapping, pos, len, copied, | ||
2087 | page, fsdata); | ||
2088 | } else { | ||
2089 | unsigned offset = pos & (PAGE_CACHE_SIZE - 1); | ||
2090 | struct inode *inode = mapping->host; | ||
2091 | |||
2092 | flush_dcache_page(page); | ||
2093 | ret = aops->commit_write(file, page, offset, offset+len); | ||
2094 | unlock_page(page); | ||
2095 | mark_page_accessed(page); | ||
2096 | page_cache_release(page); | ||
2097 | |||
2098 | if (ret < 0) { | ||
2099 | if (pos + len > inode->i_size) | ||
2100 | vmtruncate(inode, inode->i_size); | ||
2101 | } else if (ret > 0) | ||
2102 | ret = min_t(size_t, copied, ret); | ||
2103 | else | ||
2104 | ret = copied; | ||
2105 | } | ||
2106 | 2042 | ||
2107 | return ret; | 2043 | mark_page_accessed(page); |
2044 | return aops->write_end(file, mapping, pos, len, copied, page, fsdata); | ||
2108 | } | 2045 | } |
2109 | EXPORT_SYMBOL(pagecache_write_end); | 2046 | EXPORT_SYMBOL(pagecache_write_end); |
2110 | 2047 | ||
@@ -2226,174 +2163,6 @@ repeat: | |||
2226 | } | 2163 | } |
2227 | EXPORT_SYMBOL(__grab_cache_page); | 2164 | EXPORT_SYMBOL(__grab_cache_page); |
2228 | 2165 | ||
2229 | static ssize_t generic_perform_write_2copy(struct file *file, | ||
2230 | struct iov_iter *i, loff_t pos) | ||
2231 | { | ||
2232 | struct address_space *mapping = file->f_mapping; | ||
2233 | const struct address_space_operations *a_ops = mapping->a_ops; | ||
2234 | struct inode *inode = mapping->host; | ||
2235 | long status = 0; | ||
2236 | ssize_t written = 0; | ||
2237 | |||
2238 | do { | ||
2239 | struct page *src_page; | ||
2240 | struct page *page; | ||
2241 | pgoff_t index; /* Pagecache index for current page */ | ||
2242 | unsigned long offset; /* Offset into pagecache page */ | ||
2243 | unsigned long bytes; /* Bytes to write to page */ | ||
2244 | size_t copied; /* Bytes copied from user */ | ||
2245 | |||
2246 | offset = (pos & (PAGE_CACHE_SIZE - 1)); | ||
2247 | index = pos >> PAGE_CACHE_SHIFT; | ||
2248 | bytes = min_t(unsigned long, PAGE_CACHE_SIZE - offset, | ||
2249 | iov_iter_count(i)); | ||
2250 | |||
2251 | /* | ||
2252 | * a non-NULL src_page indicates that we're doing the | ||
2253 | * copy via get_user_pages and kmap. | ||
2254 | */ | ||
2255 | src_page = NULL; | ||
2256 | |||
2257 | /* | ||
2258 | * Bring in the user page that we will copy from _first_. | ||
2259 | * Otherwise there's a nasty deadlock on copying from the | ||
2260 | * same page as we're writing to, without it being marked | ||
2261 | * up-to-date. | ||
2262 | * | ||
2263 | * Not only is this an optimisation, but it is also required | ||
2264 | * to check that the address is actually valid, when atomic | ||
2265 | * usercopies are used, below. | ||
2266 | */ | ||
2267 | if (unlikely(iov_iter_fault_in_readable(i, bytes))) { | ||
2268 | status = -EFAULT; | ||
2269 | break; | ||
2270 | } | ||
2271 | |||
2272 | page = __grab_cache_page(mapping, index); | ||
2273 | if (!page) { | ||
2274 | status = -ENOMEM; | ||
2275 | break; | ||
2276 | } | ||
2277 | |||
2278 | /* | ||
2279 | * non-uptodate pages cannot cope with short copies, and we | ||
2280 | * cannot take a pagefault with the destination page locked. | ||
2281 | * So pin the source page to copy it. | ||
2282 | */ | ||
2283 | if (!PageUptodate(page) && !segment_eq(get_fs(), KERNEL_DS)) { | ||
2284 | unlock_page(page); | ||
2285 | |||
2286 | src_page = alloc_page(GFP_KERNEL); | ||
2287 | if (!src_page) { | ||
2288 | page_cache_release(page); | ||
2289 | status = -ENOMEM; | ||
2290 | break; | ||
2291 | } | ||
2292 | |||
2293 | /* | ||
2294 | * Cannot get_user_pages with a page locked for the | ||
2295 | * same reason as we can't take a page fault with a | ||
2296 | * page locked (as explained below). | ||
2297 | */ | ||
2298 | copied = iov_iter_copy_from_user(src_page, i, | ||
2299 | offset, bytes); | ||
2300 | if (unlikely(copied == 0)) { | ||
2301 | status = -EFAULT; | ||
2302 | page_cache_release(page); | ||
2303 | page_cache_release(src_page); | ||
2304 | break; | ||
2305 | } | ||
2306 | bytes = copied; | ||
2307 | |||
2308 | lock_page(page); | ||
2309 | /* | ||
2310 | * Can't handle the page going uptodate here, because | ||
2311 | * that means we would use non-atomic usercopies, which | ||
2312 | * zero out the tail of the page, which can cause | ||
2313 | * zeroes to become transiently visible. We could just | ||
2314 | * use a non-zeroing copy, but the APIs aren't too | ||
2315 | * consistent. | ||
2316 | */ | ||
2317 | if (unlikely(!page->mapping || PageUptodate(page))) { | ||
2318 | unlock_page(page); | ||
2319 | page_cache_release(page); | ||
2320 | page_cache_release(src_page); | ||
2321 | continue; | ||
2322 | } | ||
2323 | } | ||
2324 | |||
2325 | status = a_ops->prepare_write(file, page, offset, offset+bytes); | ||
2326 | if (unlikely(status)) | ||
2327 | goto fs_write_aop_error; | ||
2328 | |||
2329 | if (!src_page) { | ||
2330 | /* | ||
2331 | * Must not enter the pagefault handler here, because | ||
2332 | * we hold the page lock, so we might recursively | ||
2333 | * deadlock on the same lock, or get an ABBA deadlock | ||
2334 | * against a different lock, or against the mmap_sem | ||
2335 | * (which nests outside the page lock). So increment | ||
2336 | * preempt count, and use _atomic usercopies. | ||
2337 | * | ||
2338 | * The page is uptodate so we are OK to encounter a | ||
2339 | * short copy: if unmodified parts of the page are | ||
2340 | * marked dirty and written out to disk, it doesn't | ||
2341 | * really matter. | ||
2342 | */ | ||
2343 | pagefault_disable(); | ||
2344 | copied = iov_iter_copy_from_user_atomic(page, i, | ||
2345 | offset, bytes); | ||
2346 | pagefault_enable(); | ||
2347 | } else { | ||
2348 | void *src, *dst; | ||
2349 | src = kmap_atomic(src_page, KM_USER0); | ||
2350 | dst = kmap_atomic(page, KM_USER1); | ||
2351 | memcpy(dst + offset, src + offset, bytes); | ||
2352 | kunmap_atomic(dst, KM_USER1); | ||
2353 | kunmap_atomic(src, KM_USER0); | ||
2354 | copied = bytes; | ||
2355 | } | ||
2356 | flush_dcache_page(page); | ||
2357 | |||
2358 | status = a_ops->commit_write(file, page, offset, offset+bytes); | ||
2359 | if (unlikely(status < 0)) | ||
2360 | goto fs_write_aop_error; | ||
2361 | if (unlikely(status > 0)) /* filesystem did partial write */ | ||
2362 | copied = min_t(size_t, copied, status); | ||
2363 | |||
2364 | unlock_page(page); | ||
2365 | mark_page_accessed(page); | ||
2366 | page_cache_release(page); | ||
2367 | if (src_page) | ||
2368 | page_cache_release(src_page); | ||
2369 | |||
2370 | iov_iter_advance(i, copied); | ||
2371 | pos += copied; | ||
2372 | written += copied; | ||
2373 | |||
2374 | balance_dirty_pages_ratelimited(mapping); | ||
2375 | cond_resched(); | ||
2376 | continue; | ||
2377 | |||
2378 | fs_write_aop_error: | ||
2379 | unlock_page(page); | ||
2380 | page_cache_release(page); | ||
2381 | if (src_page) | ||
2382 | page_cache_release(src_page); | ||
2383 | |||
2384 | /* | ||
2385 | * prepare_write() may have instantiated a few blocks | ||
2386 | * outside i_size. Trim these off again. Don't need | ||
2387 | * i_size_read because we hold i_mutex. | ||
2388 | */ | ||
2389 | if (pos + bytes > inode->i_size) | ||
2390 | vmtruncate(inode, inode->i_size); | ||
2391 | break; | ||
2392 | } while (iov_iter_count(i)); | ||
2393 | |||
2394 | return written ? written : status; | ||
2395 | } | ||
2396 | |||
2397 | static ssize_t generic_perform_write(struct file *file, | 2166 | static ssize_t generic_perform_write(struct file *file, |
2398 | struct iov_iter *i, loff_t pos) | 2167 | struct iov_iter *i, loff_t pos) |
2399 | { | 2168 | { |
@@ -2494,10 +2263,7 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, | |||
2494 | struct iov_iter i; | 2263 | struct iov_iter i; |
2495 | 2264 | ||
2496 | iov_iter_init(&i, iov, nr_segs, count, written); | 2265 | iov_iter_init(&i, iov, nr_segs, count, written); |
2497 | if (a_ops->write_begin) | 2266 | status = generic_perform_write(file, &i, pos); |
2498 | status = generic_perform_write(file, &i, pos); | ||
2499 | else | ||
2500 | status = generic_perform_write_2copy(file, &i, pos); | ||
2501 | 2267 | ||
2502 | if (likely(status >= 0)) { | 2268 | if (likely(status >= 0)) { |
2503 | written += status; | 2269 | written += status; |
@@ -175,7 +175,8 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) | |||
175 | 175 | ||
176 | /* Don't let a single process grow too big: | 176 | /* Don't let a single process grow too big: |
177 | leave 3% of the size of this process for other processes */ | 177 | leave 3% of the size of this process for other processes */ |
178 | allowed -= mm->total_vm / 32; | 178 | if (mm) |
179 | allowed -= mm->total_vm / 32; | ||
179 | 180 | ||
180 | /* | 181 | /* |
181 | * cast `allowed' as a signed long because vm_committed_space | 182 | * cast `allowed' as a signed long because vm_committed_space |
diff --git a/mm/nommu.c b/mm/nommu.c index 2696b24f2bb3..7695dc850785 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -1454,7 +1454,8 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) | |||
1454 | 1454 | ||
1455 | /* Don't let a single process grow too big: | 1455 | /* Don't let a single process grow too big: |
1456 | leave 3% of the size of this process for other processes */ | 1456 | leave 3% of the size of this process for other processes */ |
1457 | allowed -= current->mm->total_vm / 32; | 1457 | if (mm) |
1458 | allowed -= mm->total_vm / 32; | ||
1458 | 1459 | ||
1459 | /* | 1460 | /* |
1460 | * cast `allowed' as a signed long because vm_committed_space | 1461 | * cast `allowed' as a signed long because vm_committed_space |
diff --git a/mm/shmem.c b/mm/shmem.c index d38d7e61fcd0..0ed075215e5f 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -161,8 +161,8 @@ static inline struct shmem_sb_info *SHMEM_SB(struct super_block *sb) | |||
161 | */ | 161 | */ |
162 | static inline int shmem_acct_size(unsigned long flags, loff_t size) | 162 | static inline int shmem_acct_size(unsigned long flags, loff_t size) |
163 | { | 163 | { |
164 | return (flags & VM_ACCOUNT)? | 164 | return (flags & VM_ACCOUNT) ? |
165 | security_vm_enough_memory(VM_ACCT(size)): 0; | 165 | security_vm_enough_memory_kern(VM_ACCT(size)) : 0; |
166 | } | 166 | } |
167 | 167 | ||
168 | static inline void shmem_unacct_size(unsigned long flags, loff_t size) | 168 | static inline void shmem_unacct_size(unsigned long flags, loff_t size) |
@@ -179,8 +179,8 @@ static inline void shmem_unacct_size(unsigned long flags, loff_t size) | |||
179 | */ | 179 | */ |
180 | static inline int shmem_acct_block(unsigned long flags) | 180 | static inline int shmem_acct_block(unsigned long flags) |
181 | { | 181 | { |
182 | return (flags & VM_ACCOUNT)? | 182 | return (flags & VM_ACCOUNT) ? |
183 | 0: security_vm_enough_memory(VM_ACCT(PAGE_CACHE_SIZE)); | 183 | 0 : security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE)); |
184 | } | 184 | } |
185 | 185 | ||
186 | static inline void shmem_unacct_blocks(unsigned long flags, long pages) | 186 | static inline void shmem_unacct_blocks(unsigned long flags, long pages) |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 036536945dd9..f1cc03bbf6ac 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -897,7 +897,8 @@ EXPORT_SYMBOL(vm_unmap_ram); | |||
897 | * @count: number of pages | 897 | * @count: number of pages |
898 | * @node: prefer to allocate data structures on this node | 898 | * @node: prefer to allocate data structures on this node |
899 | * @prot: memory protection to use. PAGE_KERNEL for regular RAM | 899 | * @prot: memory protection to use. PAGE_KERNEL for regular RAM |
900 | * @returns: a pointer to the address that has been mapped, or NULL on failure | 900 | * |
901 | * Returns: a pointer to the address that has been mapped, or %NULL on failure | ||
901 | */ | 902 | */ |
902 | void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t prot) | 903 | void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t prot) |
903 | { | 904 | { |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 99f656d35b4f..a47f5bad110d 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -1973,28 +1973,27 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
1973 | 1973 | ||
1974 | /* make sure that we don't pick a non-existing transmit queue */ | 1974 | /* make sure that we don't pick a non-existing transmit queue */ |
1975 | ntxq = pkt_dev->odev->real_num_tx_queues; | 1975 | ntxq = pkt_dev->odev->real_num_tx_queues; |
1976 | if (ntxq <= num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) { | 1976 | if (ntxq > num_online_cpus() && (pkt_dev->flags & F_QUEUE_MAP_CPU)) { |
1977 | printk(KERN_WARNING "pktgen: WARNING: QUEUE_MAP_CPU " | 1977 | printk(KERN_WARNING "pktgen: WARNING: QUEUE_MAP_CPU " |
1978 | "disabled because CPU count (%d) exceeds number ", | 1978 | "disabled because CPU count (%d) exceeds number " |
1979 | num_online_cpus()); | 1979 | "of tx queues (%d) on %s\n", num_online_cpus(), ntxq, |
1980 | printk(KERN_WARNING "pktgen: WARNING: of tx queues " | 1980 | pkt_dev->odev->name); |
1981 | "(%d) on %s \n", ntxq, pkt_dev->odev->name); | ||
1982 | pkt_dev->flags &= ~F_QUEUE_MAP_CPU; | 1981 | pkt_dev->flags &= ~F_QUEUE_MAP_CPU; |
1983 | } | 1982 | } |
1984 | if (ntxq <= pkt_dev->queue_map_min) { | 1983 | if (ntxq <= pkt_dev->queue_map_min) { |
1985 | printk(KERN_WARNING "pktgen: WARNING: Requested " | 1984 | printk(KERN_WARNING "pktgen: WARNING: Requested " |
1986 | "queue_map_min (%d) exceeds number of tx\n", | 1985 | "queue_map_min (zero-based) (%d) exceeds valid range " |
1987 | pkt_dev->queue_map_min); | 1986 | "[0 - %d] for (%d) queues on %s, resetting\n", |
1988 | printk(KERN_WARNING "pktgen: WARNING: queues (%d) on " | 1987 | pkt_dev->queue_map_min, (ntxq ?: 1)- 1, ntxq, |
1989 | "%s, resetting\n", ntxq, pkt_dev->odev->name); | 1988 | pkt_dev->odev->name); |
1990 | pkt_dev->queue_map_min = ntxq - 1; | 1989 | pkt_dev->queue_map_min = ntxq - 1; |
1991 | } | 1990 | } |
1992 | if (ntxq <= pkt_dev->queue_map_max) { | 1991 | if (pkt_dev->queue_map_max >= ntxq) { |
1993 | printk(KERN_WARNING "pktgen: WARNING: Requested " | 1992 | printk(KERN_WARNING "pktgen: WARNING: Requested " |
1994 | "queue_map_max (%d) exceeds number of tx\n", | 1993 | "queue_map_max (zero-based) (%d) exceeds valid range " |
1995 | pkt_dev->queue_map_max); | 1994 | "[0 - %d] for (%d) queues on %s, resetting\n", |
1996 | printk(KERN_WARNING "pktgen: WARNING: queues (%d) on " | 1995 | pkt_dev->queue_map_max, (ntxq ?: 1)- 1, ntxq, |
1997 | "%s, resetting\n", ntxq, pkt_dev->odev->name); | 1996 | pkt_dev->odev->name); |
1998 | pkt_dev->queue_map_max = ntxq - 1; | 1997 | pkt_dev->queue_map_max = ntxq - 1; |
1999 | } | 1998 | } |
2000 | 1999 | ||
diff --git a/net/mac80211/rc80211_minstrel_debugfs.c b/net/mac80211/rc80211_minstrel_debugfs.c index 0b024cd6b809..98f480708050 100644 --- a/net/mac80211/rc80211_minstrel_debugfs.c +++ b/net/mac80211/rc80211_minstrel_debugfs.c | |||
@@ -94,8 +94,8 @@ minstrel_stats_open(struct inode *inode, struct file *file) | |||
94 | prob / 10, prob % 10, | 94 | prob / 10, prob % 10, |
95 | mr->last_success, | 95 | mr->last_success, |
96 | mr->last_attempts, | 96 | mr->last_attempts, |
97 | mr->succ_hist, | 97 | (unsigned long long)mr->succ_hist, |
98 | mr->att_hist); | 98 | (unsigned long long)mr->att_hist); |
99 | } | 99 | } |
100 | p += sprintf(p, "\nTotal packet count:: ideal %d " | 100 | p += sprintf(p, "\nTotal packet count:: ideal %d " |
101 | "lookaround %d\n\n", | 101 | "lookaround %d\n\n", |
@@ -106,7 +106,7 @@ minstrel_stats_open(struct inode *inode, struct file *file) | |||
106 | return 0; | 106 | return 0; |
107 | } | 107 | } |
108 | 108 | ||
109 | static int | 109 | static ssize_t |
110 | minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *o) | 110 | minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *o) |
111 | { | 111 | { |
112 | struct minstrel_stats_info *ms; | 112 | struct minstrel_stats_info *ms; |
diff --git a/net/rfkill/rfkill-input.c b/net/rfkill/rfkill-input.c index 21124ec0a73d..bfdade72e066 100644 --- a/net/rfkill/rfkill-input.c +++ b/net/rfkill/rfkill-input.c | |||
@@ -256,6 +256,11 @@ static struct input_handler rfkill_handler = { | |||
256 | 256 | ||
257 | static int __init rfkill_handler_init(void) | 257 | static int __init rfkill_handler_init(void) |
258 | { | 258 | { |
259 | unsigned long last_run = jiffies - msecs_to_jiffies(500); | ||
260 | rfkill_wlan.last = last_run; | ||
261 | rfkill_bt.last = last_run; | ||
262 | rfkill_uwb.last = last_run; | ||
263 | rfkill_wimax.last = last_run; | ||
259 | return input_register_handler(&rfkill_handler); | 264 | return input_register_handler(&rfkill_handler); |
260 | } | 265 | } |
261 | 266 | ||
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index 436bf1b4b76c..cb216b2df666 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c | |||
@@ -228,19 +228,21 @@ static int | |||
228 | rpcauth_prune_expired(struct list_head *free, int nr_to_scan) | 228 | rpcauth_prune_expired(struct list_head *free, int nr_to_scan) |
229 | { | 229 | { |
230 | spinlock_t *cache_lock; | 230 | spinlock_t *cache_lock; |
231 | struct rpc_cred *cred; | 231 | struct rpc_cred *cred, *next; |
232 | unsigned long expired = jiffies - RPC_AUTH_EXPIRY_MORATORIUM; | 232 | unsigned long expired = jiffies - RPC_AUTH_EXPIRY_MORATORIUM; |
233 | 233 | ||
234 | while (!list_empty(&cred_unused)) { | 234 | list_for_each_entry_safe(cred, next, &cred_unused, cr_lru) { |
235 | cred = list_entry(cred_unused.next, struct rpc_cred, cr_lru); | 235 | |
236 | /* Enforce a 60 second garbage collection moratorium */ | ||
237 | if (time_in_range(cred->cr_expire, expired, jiffies) && | ||
238 | test_bit(RPCAUTH_CRED_HASHED, &cred->cr_flags) != 0) | ||
239 | continue; | ||
240 | |||
236 | list_del_init(&cred->cr_lru); | 241 | list_del_init(&cred->cr_lru); |
237 | number_cred_unused--; | 242 | number_cred_unused--; |
238 | if (atomic_read(&cred->cr_count) != 0) | 243 | if (atomic_read(&cred->cr_count) != 0) |
239 | continue; | 244 | continue; |
240 | /* Enforce a 5 second garbage collection moratorium */ | 245 | |
241 | if (time_in_range(cred->cr_expire, expired, jiffies) && | ||
242 | test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) != 0) | ||
243 | continue; | ||
244 | cache_lock = &cred->cr_auth->au_credcache->lock; | 246 | cache_lock = &cred->cr_auth->au_credcache->lock; |
245 | spin_lock(cache_lock); | 247 | spin_lock(cache_lock); |
246 | if (atomic_read(&cred->cr_count) == 0) { | 248 | if (atomic_read(&cred->cr_count) == 0) { |
@@ -453,7 +455,7 @@ need_lock: | |||
453 | } | 455 | } |
454 | if (test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) == 0) | 456 | if (test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) == 0) |
455 | rpcauth_unhash_cred(cred); | 457 | rpcauth_unhash_cred(cred); |
456 | else if (test_bit(RPCAUTH_CRED_HASHED, &cred->cr_flags) != 0) { | 458 | if (test_bit(RPCAUTH_CRED_HASHED, &cred->cr_flags) != 0) { |
457 | cred->cr_expire = jiffies; | 459 | cred->cr_expire = jiffies; |
458 | list_add_tail(&cred->cr_lru, &cred_unused); | 460 | list_add_tail(&cred->cr_lru, &cred_unused); |
459 | number_cred_unused++; | 461 | number_cred_unused++; |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 9a288d5eea64..0a50361e3d83 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -249,6 +249,7 @@ struct sock_xprt { | |||
249 | void (*old_data_ready)(struct sock *, int); | 249 | void (*old_data_ready)(struct sock *, int); |
250 | void (*old_state_change)(struct sock *); | 250 | void (*old_state_change)(struct sock *); |
251 | void (*old_write_space)(struct sock *); | 251 | void (*old_write_space)(struct sock *); |
252 | void (*old_error_report)(struct sock *); | ||
252 | }; | 253 | }; |
253 | 254 | ||
254 | /* | 255 | /* |
@@ -698,8 +699,9 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
698 | case -EAGAIN: | 699 | case -EAGAIN: |
699 | xs_nospace(task); | 700 | xs_nospace(task); |
700 | break; | 701 | break; |
701 | case -ECONNREFUSED: | ||
702 | case -ECONNRESET: | 702 | case -ECONNRESET: |
703 | xs_tcp_shutdown(xprt); | ||
704 | case -ECONNREFUSED: | ||
703 | case -ENOTCONN: | 705 | case -ENOTCONN: |
704 | case -EPIPE: | 706 | case -EPIPE: |
705 | status = -ENOTCONN; | 707 | status = -ENOTCONN; |
@@ -742,6 +744,22 @@ out_release: | |||
742 | xprt_release_xprt(xprt, task); | 744 | xprt_release_xprt(xprt, task); |
743 | } | 745 | } |
744 | 746 | ||
747 | static void xs_save_old_callbacks(struct sock_xprt *transport, struct sock *sk) | ||
748 | { | ||
749 | transport->old_data_ready = sk->sk_data_ready; | ||
750 | transport->old_state_change = sk->sk_state_change; | ||
751 | transport->old_write_space = sk->sk_write_space; | ||
752 | transport->old_error_report = sk->sk_error_report; | ||
753 | } | ||
754 | |||
755 | static void xs_restore_old_callbacks(struct sock_xprt *transport, struct sock *sk) | ||
756 | { | ||
757 | sk->sk_data_ready = transport->old_data_ready; | ||
758 | sk->sk_state_change = transport->old_state_change; | ||
759 | sk->sk_write_space = transport->old_write_space; | ||
760 | sk->sk_error_report = transport->old_error_report; | ||
761 | } | ||
762 | |||
745 | /** | 763 | /** |
746 | * xs_close - close a socket | 764 | * xs_close - close a socket |
747 | * @xprt: transport | 765 | * @xprt: transport |
@@ -765,9 +783,8 @@ static void xs_close(struct rpc_xprt *xprt) | |||
765 | transport->sock = NULL; | 783 | transport->sock = NULL; |
766 | 784 | ||
767 | sk->sk_user_data = NULL; | 785 | sk->sk_user_data = NULL; |
768 | sk->sk_data_ready = transport->old_data_ready; | 786 | |
769 | sk->sk_state_change = transport->old_state_change; | 787 | xs_restore_old_callbacks(transport, sk); |
770 | sk->sk_write_space = transport->old_write_space; | ||
771 | write_unlock_bh(&sk->sk_callback_lock); | 788 | write_unlock_bh(&sk->sk_callback_lock); |
772 | 789 | ||
773 | sk->sk_no_check = 0; | 790 | sk->sk_no_check = 0; |
@@ -1180,6 +1197,28 @@ static void xs_tcp_state_change(struct sock *sk) | |||
1180 | } | 1197 | } |
1181 | 1198 | ||
1182 | /** | 1199 | /** |
1200 | * xs_tcp_error_report - callback mainly for catching RST events | ||
1201 | * @sk: socket | ||
1202 | */ | ||
1203 | static void xs_tcp_error_report(struct sock *sk) | ||
1204 | { | ||
1205 | struct rpc_xprt *xprt; | ||
1206 | |||
1207 | read_lock(&sk->sk_callback_lock); | ||
1208 | if (sk->sk_err != ECONNRESET || sk->sk_state != TCP_ESTABLISHED) | ||
1209 | goto out; | ||
1210 | if (!(xprt = xprt_from_sock(sk))) | ||
1211 | goto out; | ||
1212 | dprintk("RPC: %s client %p...\n" | ||
1213 | "RPC: error %d\n", | ||
1214 | __func__, xprt, sk->sk_err); | ||
1215 | |||
1216 | xprt_force_disconnect(xprt); | ||
1217 | out: | ||
1218 | read_unlock(&sk->sk_callback_lock); | ||
1219 | } | ||
1220 | |||
1221 | /** | ||
1183 | * xs_udp_write_space - callback invoked when socket buffer space | 1222 | * xs_udp_write_space - callback invoked when socket buffer space |
1184 | * becomes available | 1223 | * becomes available |
1185 | * @sk: socket whose state has changed | 1224 | * @sk: socket whose state has changed |
@@ -1454,10 +1493,9 @@ static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | |||
1454 | 1493 | ||
1455 | write_lock_bh(&sk->sk_callback_lock); | 1494 | write_lock_bh(&sk->sk_callback_lock); |
1456 | 1495 | ||
1496 | xs_save_old_callbacks(transport, sk); | ||
1497 | |||
1457 | sk->sk_user_data = xprt; | 1498 | sk->sk_user_data = xprt; |
1458 | transport->old_data_ready = sk->sk_data_ready; | ||
1459 | transport->old_state_change = sk->sk_state_change; | ||
1460 | transport->old_write_space = sk->sk_write_space; | ||
1461 | sk->sk_data_ready = xs_udp_data_ready; | 1499 | sk->sk_data_ready = xs_udp_data_ready; |
1462 | sk->sk_write_space = xs_udp_write_space; | 1500 | sk->sk_write_space = xs_udp_write_space; |
1463 | sk->sk_no_check = UDP_CSUM_NORCV; | 1501 | sk->sk_no_check = UDP_CSUM_NORCV; |
@@ -1589,13 +1627,13 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | |||
1589 | 1627 | ||
1590 | write_lock_bh(&sk->sk_callback_lock); | 1628 | write_lock_bh(&sk->sk_callback_lock); |
1591 | 1629 | ||
1630 | xs_save_old_callbacks(transport, sk); | ||
1631 | |||
1592 | sk->sk_user_data = xprt; | 1632 | sk->sk_user_data = xprt; |
1593 | transport->old_data_ready = sk->sk_data_ready; | ||
1594 | transport->old_state_change = sk->sk_state_change; | ||
1595 | transport->old_write_space = sk->sk_write_space; | ||
1596 | sk->sk_data_ready = xs_tcp_data_ready; | 1633 | sk->sk_data_ready = xs_tcp_data_ready; |
1597 | sk->sk_state_change = xs_tcp_state_change; | 1634 | sk->sk_state_change = xs_tcp_state_change; |
1598 | sk->sk_write_space = xs_tcp_write_space; | 1635 | sk->sk_write_space = xs_tcp_write_space; |
1636 | sk->sk_error_report = xs_tcp_error_report; | ||
1599 | sk->sk_allocation = GFP_ATOMIC; | 1637 | sk->sk_allocation = GFP_ATOMIC; |
1600 | 1638 | ||
1601 | /* socket options */ | 1639 | /* socket options */ |
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index 9ee9783aea57..f4053dc7b5d6 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost | |||
@@ -82,7 +82,7 @@ modpost = scripts/mod/modpost \ | |||
82 | $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a,) \ | 82 | $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a,) \ |
83 | $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \ | 83 | $(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \ |
84 | $(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \ | 84 | $(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \ |
85 | $(if $(KBUILD_EXTRA_SYMBOLS), $(patsubst %, -e %,$(EXTRA_SYMBOLS))) \ | 85 | $(if $(KBUILD_EXTRA_SYMBOLS), $(patsubst %, -e %,$(KBUILD_EXTRA_SYMBOLS))) \ |
86 | $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ | 86 | $(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \ |
87 | $(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \ | 87 | $(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \ |
88 | $(if $(CONFIG_MARKERS),-K $(kernelmarkersfile)) \ | 88 | $(if $(CONFIG_MARKERS),-K $(kernelmarkersfile)) \ |
diff --git a/scripts/checksyscalls.sh b/scripts/checksyscalls.sh index 41564b142c04..60d00d1c4eee 100755 --- a/scripts/checksyscalls.sh +++ b/scripts/checksyscalls.sh | |||
@@ -113,10 +113,10 @@ EOF | |||
113 | } | 113 | } |
114 | 114 | ||
115 | syscall_list() { | 115 | syscall_list() { |
116 | sed -n -e '/^\#define/ { s/[^_]*__NR_\([^[:space:]]*\).*/\ | 116 | sed -n -e '/^\#define/ s/[^_]*__NR_\([^[:space:]]*\).*/\ |
117 | \#if !defined \(__NR_\1\) \&\& !defined \(__IGNORE_\1\)\ | 117 | \#if !defined \(__NR_\1\) \&\& !defined \(__IGNORE_\1\)\ |
118 | \#warning syscall \1 not implemented\ | 118 | \#warning syscall \1 not implemented\ |
119 | \#endif/p }' $1 | 119 | \#endif/p' $1 |
120 | } | 120 | } |
121 | 121 | ||
122 | (ignore_list && syscall_list ${srctree}/arch/x86/include/asm/unistd_32.h) | \ | 122 | (ignore_list && syscall_list ${srctree}/arch/x86/include/asm/unistd_32.h) | \ |
diff --git a/scripts/headers_check.pl b/scripts/headers_check.pl index 15d53a6b1a1f..488a3b1f760f 100644 --- a/scripts/headers_check.pl +++ b/scripts/headers_check.pl | |||
@@ -1,4 +1,4 @@ | |||
1 | #!/usr/bin/perl | 1 | #!/usr/bin/perl -w |
2 | # | 2 | # |
3 | # headers_check.pl execute a number of trivial consistency checks | 3 | # headers_check.pl execute a number of trivial consistency checks |
4 | # | 4 | # |
@@ -17,7 +17,6 @@ | |||
17 | # 2) TODO: check for leaked CONFIG_ symbols | 17 | # 2) TODO: check for leaked CONFIG_ symbols |
18 | 18 | ||
19 | use strict; | 19 | use strict; |
20 | use warnings; | ||
21 | 20 | ||
22 | my ($dir, $arch, @files) = @ARGV; | 21 | my ($dir, $arch, @files) = @ARGV; |
23 | 22 | ||
@@ -27,14 +26,15 @@ my $lineno = 0; | |||
27 | my $filename; | 26 | my $filename; |
28 | 27 | ||
29 | foreach my $file (@files) { | 28 | foreach my $file (@files) { |
29 | local *FH; | ||
30 | $filename = $file; | 30 | $filename = $file; |
31 | open(my $fh, '<', "$filename") or die "$filename: $!\n"; | 31 | open(FH, "<$filename") or die "$filename: $!\n"; |
32 | $lineno = 0; | 32 | $lineno = 0; |
33 | while ($line = <$fh>) { | 33 | while ($line = <FH>) { |
34 | $lineno++; | 34 | $lineno++; |
35 | check_include(); | 35 | check_include(); |
36 | } | 36 | } |
37 | close $fh; | 37 | close FH; |
38 | } | 38 | } |
39 | exit $ret; | 39 | exit $ret; |
40 | 40 | ||
diff --git a/scripts/headers_install.pl b/scripts/headers_install.pl index 68591cd08731..7d2b4146e02f 100644 --- a/scripts/headers_install.pl +++ b/scripts/headers_install.pl | |||
@@ -1,4 +1,4 @@ | |||
1 | #!/usr/bin/perl | 1 | #!/usr/bin/perl -w |
2 | # | 2 | # |
3 | # headers_install prepare the listed header files for use in | 3 | # headers_install prepare the listed header files for use in |
4 | # user space and copy the files to their destination. | 4 | # user space and copy the files to their destination. |
@@ -17,28 +17,29 @@ | |||
17 | # 3) Drop all sections defined out by __KERNEL__ (using unifdef) | 17 | # 3) Drop all sections defined out by __KERNEL__ (using unifdef) |
18 | 18 | ||
19 | use strict; | 19 | use strict; |
20 | use warnings; | ||
21 | 20 | ||
22 | my ($readdir, $installdir, $arch, @files) = @ARGV; | 21 | my ($readdir, $installdir, $arch, @files) = @ARGV; |
23 | 22 | ||
24 | my $unifdef = "scripts/unifdef -U__KERNEL__"; | 23 | my $unifdef = "scripts/unifdef -U__KERNEL__"; |
25 | 24 | ||
26 | foreach my $file (@files) { | 25 | foreach my $file (@files) { |
26 | local *INFILE; | ||
27 | local *OUTFILE; | ||
27 | my $tmpfile = "$installdir/$file.tmp"; | 28 | my $tmpfile = "$installdir/$file.tmp"; |
28 | open(my $infile, '<', "$readdir/$file") | 29 | open(INFILE, "<$readdir/$file") |
29 | or die "$readdir/$file: $!\n"; | 30 | or die "$readdir/$file: $!\n"; |
30 | open(my $outfile, '>', "$tmpfile") or die "$tmpfile: $!\n"; | 31 | open(OUTFILE, ">$tmpfile") or die "$tmpfile: $!\n"; |
31 | while (my $line = <$infile>) { | 32 | while (my $line = <INFILE>) { |
32 | $line =~ s/([\s(])__user\s/$1/g; | 33 | $line =~ s/([\s(])__user\s/$1/g; |
33 | $line =~ s/([\s(])__force\s/$1/g; | 34 | $line =~ s/([\s(])__force\s/$1/g; |
34 | $line =~ s/([\s(])__iomem\s/$1/g; | 35 | $line =~ s/([\s(])__iomem\s/$1/g; |
35 | $line =~ s/\s__attribute_const__\s/ /g; | 36 | $line =~ s/\s__attribute_const__\s/ /g; |
36 | $line =~ s/\s__attribute_const__$//g; | 37 | $line =~ s/\s__attribute_const__$//g; |
37 | $line =~ s/^#include <linux\/compiler.h>//; | 38 | $line =~ s/^#include <linux\/compiler.h>//; |
38 | printf $outfile "%s", $line; | 39 | printf OUTFILE "%s", $line; |
39 | } | 40 | } |
40 | close $outfile; | 41 | close OUTFILE; |
41 | close $infile; | 42 | close INFILE; |
42 | system $unifdef . " $tmpfile > $installdir/$file"; | 43 | system $unifdef . " $tmpfile > $installdir/$file"; |
43 | unlink $tmpfile; | 44 | unlink $tmpfile; |
44 | } | 45 | } |
diff --git a/scripts/mod/sumversion.c b/scripts/mod/sumversion.c index d9cc6901d680..aadc5223dcdb 100644 --- a/scripts/mod/sumversion.c +++ b/scripts/mod/sumversion.c | |||
@@ -290,6 +290,15 @@ static int parse_file(const char *fname, struct md4_ctx *md) | |||
290 | release_file(file, len); | 290 | release_file(file, len); |
291 | return 1; | 291 | return 1; |
292 | } | 292 | } |
293 | /* Check whether the file is a static library or not */ | ||
294 | static int is_static_library(const char *objfile) | ||
295 | { | ||
296 | int len = strlen(objfile); | ||
297 | if (objfile[len - 2] == '.' && objfile[len - 1] == 'a') | ||
298 | return 1; | ||
299 | else | ||
300 | return 0; | ||
301 | } | ||
293 | 302 | ||
294 | /* We have dir/file.o. Open dir/.file.o.cmd, look for deps_ line to | 303 | /* We have dir/file.o. Open dir/.file.o.cmd, look for deps_ line to |
295 | * figure out source file. */ | 304 | * figure out source file. */ |
@@ -420,7 +429,8 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen) | |||
420 | while ((fname = strsep(&sources, " ")) != NULL) { | 429 | while ((fname = strsep(&sources, " ")) != NULL) { |
421 | if (!*fname) | 430 | if (!*fname) |
422 | continue; | 431 | continue; |
423 | if (!parse_source_files(fname, &md)) | 432 | if (!(is_static_library(fname)) && |
433 | !parse_source_files(fname, &md)) | ||
424 | goto release; | 434 | goto release; |
425 | } | 435 | } |
426 | 436 | ||
diff --git a/scripts/package/mkspec b/scripts/package/mkspec index ffd61fe0c1ad..2500886fb90a 100755 --- a/scripts/package/mkspec +++ b/scripts/package/mkspec | |||
@@ -57,15 +57,17 @@ fi | |||
57 | echo "%build" | 57 | echo "%build" |
58 | 58 | ||
59 | if ! $PREBUILT; then | 59 | if ! $PREBUILT; then |
60 | echo "make clean && make %{_smp_mflags}" | 60 | echo "make clean && make %{?_smp_mflags}" |
61 | echo "" | 61 | echo "" |
62 | fi | 62 | fi |
63 | 63 | ||
64 | echo "%install" | 64 | echo "%install" |
65 | echo "%ifarch ia64" | 65 | echo "%ifarch ia64" |
66 | echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib/modules' | 66 | echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib/modules' |
67 | echo 'mkdir -p $RPM_BUILD_ROOT/lib/firmware' | ||
67 | echo "%else" | 68 | echo "%else" |
68 | echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib/modules' | 69 | echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib/modules' |
70 | echo 'mkdir -p $RPM_BUILD_ROOT/lib/firmware' | ||
69 | echo "%endif" | 71 | echo "%endif" |
70 | 72 | ||
71 | echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{_smp_mflags} modules_install' | 73 | echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{_smp_mflags} modules_install' |
@@ -92,5 +94,6 @@ echo "%files" | |||
92 | echo '%defattr (-, root, root)' | 94 | echo '%defattr (-, root, root)' |
93 | echo "%dir /lib/modules" | 95 | echo "%dir /lib/modules" |
94 | echo "/lib/modules/$KERNELRELEASE" | 96 | echo "/lib/modules/$KERNELRELEASE" |
97 | echo "/lib/firmware" | ||
95 | echo "/boot/*" | 98 | echo "/boot/*" |
96 | echo "" | 99 | echo "" |
diff --git a/scripts/setlocalversion b/scripts/setlocalversion index 83b75126c9f7..72d233528ade 100755 --- a/scripts/setlocalversion +++ b/scripts/setlocalversion | |||
@@ -9,11 +9,13 @@ usage() { | |||
9 | cd "${1:-.}" || usage | 9 | cd "${1:-.}" || usage |
10 | 10 | ||
11 | # Check for git and a git repo. | 11 | # Check for git and a git repo. |
12 | if head=`git rev-parse --verify HEAD 2>/dev/null`; then | 12 | if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then |
13 | # Do we have an untagged version? | 13 | # Do we have an untagged version? |
14 | if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then | 14 | if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then |
15 | if tag=`git describe 2>/dev/null`; then | 15 | if tag=`git describe 2>/dev/null`; then |
16 | echo $tag | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' | 16 | echo $tag | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' |
17 | else | ||
18 | printf '%s%s' -g $head | ||
17 | fi | 19 | fi |
18 | fi | 20 | fi |
19 | 21 | ||
@@ -55,7 +57,7 @@ if rev=`svn info 2>/dev/null | grep '^Revision'`; then | |||
55 | 57 | ||
56 | # Are there uncommitted changes? | 58 | # Are there uncommitted changes? |
57 | if [ $changes != 0 ]; then | 59 | if [ $changes != 0 ]; then |
58 | printf -- '-svn%s%s%s' "$rev" -dirty "$changes" | 60 | printf -- '-svn%s%s' "$rev" -dirty |
59 | else | 61 | else |
60 | printf -- '-svn%s' "$rev" | 62 | printf -- '-svn%s' "$rev" |
61 | fi | 63 | fi |
diff --git a/security/security.c b/security/security.c index 255b08559b2b..c0acfa7177e5 100644 --- a/security/security.c +++ b/security/security.c | |||
@@ -198,14 +198,23 @@ int security_settime(struct timespec *ts, struct timezone *tz) | |||
198 | 198 | ||
199 | int security_vm_enough_memory(long pages) | 199 | int security_vm_enough_memory(long pages) |
200 | { | 200 | { |
201 | WARN_ON(current->mm == NULL); | ||
201 | return security_ops->vm_enough_memory(current->mm, pages); | 202 | return security_ops->vm_enough_memory(current->mm, pages); |
202 | } | 203 | } |
203 | 204 | ||
204 | int security_vm_enough_memory_mm(struct mm_struct *mm, long pages) | 205 | int security_vm_enough_memory_mm(struct mm_struct *mm, long pages) |
205 | { | 206 | { |
207 | WARN_ON(mm == NULL); | ||
206 | return security_ops->vm_enough_memory(mm, pages); | 208 | return security_ops->vm_enough_memory(mm, pages); |
207 | } | 209 | } |
208 | 210 | ||
211 | int security_vm_enough_memory_kern(long pages) | ||
212 | { | ||
213 | /* If current->mm is a kernel thread then we will pass NULL, | ||
214 | for this specific case that is fine */ | ||
215 | return security_ops->vm_enough_memory(current->mm, pages); | ||
216 | } | ||
217 | |||
209 | int security_bprm_alloc(struct linux_binprm *bprm) | 218 | int security_bprm_alloc(struct linux_binprm *bprm) |
210 | { | 219 | { |
211 | return security_ops->bprm_alloc_security(bprm); | 220 | return security_ops->bprm_alloc_security(bprm); |
diff --git a/sound/core/control.c b/sound/core/control.c index 6d71f9a7ccbb..b0bf42691047 100644 --- a/sound/core/control.c +++ b/sound/core/control.c | |||
@@ -225,8 +225,13 @@ struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol, | |||
225 | kctl.id.iface = ncontrol->iface; | 225 | kctl.id.iface = ncontrol->iface; |
226 | kctl.id.device = ncontrol->device; | 226 | kctl.id.device = ncontrol->device; |
227 | kctl.id.subdevice = ncontrol->subdevice; | 227 | kctl.id.subdevice = ncontrol->subdevice; |
228 | if (ncontrol->name) | 228 | if (ncontrol->name) { |
229 | strlcpy(kctl.id.name, ncontrol->name, sizeof(kctl.id.name)); | 229 | strlcpy(kctl.id.name, ncontrol->name, sizeof(kctl.id.name)); |
230 | if (strcmp(ncontrol->name, kctl.id.name) != 0) | ||
231 | snd_printk(KERN_WARNING | ||
232 | "Control name '%s' truncated to '%s'\n", | ||
233 | ncontrol->name, kctl.id.name); | ||
234 | } | ||
230 | kctl.id.index = ncontrol->index; | 235 | kctl.id.index = ncontrol->index; |
231 | kctl.count = ncontrol->count ? ncontrol->count : 1; | 236 | kctl.count = ncontrol->count ? ncontrol->count : 1; |
232 | access = ncontrol->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE : | 237 | access = ncontrol->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE : |
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c index 6704acbca8c0..bd510eceff1f 100644 --- a/sound/pci/ac97/ac97_codec.c +++ b/sound/pci/ac97/ac97_codec.c | |||
@@ -1927,9 +1927,9 @@ static int snd_ac97_dev_register(struct snd_device *device) | |||
1927 | ac97->dev.bus = &ac97_bus_type; | 1927 | ac97->dev.bus = &ac97_bus_type; |
1928 | ac97->dev.parent = ac97->bus->card->dev; | 1928 | ac97->dev.parent = ac97->bus->card->dev; |
1929 | ac97->dev.release = ac97_device_release; | 1929 | ac97->dev.release = ac97_device_release; |
1930 | snprintf(ac97->dev.bus_id, BUS_ID_SIZE, "%d-%d:%s", | 1930 | dev_set_name(&ac97->dev, "%d-%d:%s", |
1931 | ac97->bus->card->number, ac97->num, | 1931 | ac97->bus->card->number, ac97->num, |
1932 | snd_ac97_get_short_name(ac97)); | 1932 | snd_ac97_get_short_name(ac97)); |
1933 | if ((err = device_register(&ac97->dev)) < 0) { | 1933 | if ((err = device_register(&ac97->dev)) < 0) { |
1934 | snd_printk(KERN_ERR "Can't register ac97 bus\n"); | 1934 | snd_printk(KERN_ERR "Can't register ac97 bus\n"); |
1935 | ac97->dev.bus = NULL; | 1935 | ac97->dev.bus = NULL; |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 6447754ae56e..ba1ab737b55f 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -64,6 +64,7 @@ static struct hda_vendor_id hda_vendor_ids[] = { | |||
64 | { 0x14f1, "Conexant" }, | 64 | { 0x14f1, "Conexant" }, |
65 | { 0x17e8, "Chrontel" }, | 65 | { 0x17e8, "Chrontel" }, |
66 | { 0x1854, "LG" }, | 66 | { 0x1854, "LG" }, |
67 | { 0x1aec, "Wolfson Microelectronics" }, | ||
67 | { 0x434d, "C-Media" }, | 68 | { 0x434d, "C-Media" }, |
68 | { 0x8384, "SigmaTel" }, | 69 | { 0x8384, "SigmaTel" }, |
69 | {} /* terminator */ | 70 | {} /* terminator */ |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index f080f8ce0ecb..35722ec920cb 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <linux/slab.h> | 45 | #include <linux/slab.h> |
46 | #include <linux/pci.h> | 46 | #include <linux/pci.h> |
47 | #include <linux/mutex.h> | 47 | #include <linux/mutex.h> |
48 | #include <linux/reboot.h> | ||
48 | #include <sound/core.h> | 49 | #include <sound/core.h> |
49 | #include <sound/initval.h> | 50 | #include <sound/initval.h> |
50 | #include "hda_codec.h" | 51 | #include "hda_codec.h" |
@@ -397,6 +398,9 @@ struct azx { | |||
397 | 398 | ||
398 | /* for pending irqs */ | 399 | /* for pending irqs */ |
399 | struct work_struct irq_pending_work; | 400 | struct work_struct irq_pending_work; |
401 | |||
402 | /* reboot notifier (for mysterious hangup problem at power-down) */ | ||
403 | struct notifier_block reboot_notifier; | ||
400 | }; | 404 | }; |
401 | 405 | ||
402 | /* driver types */ | 406 | /* driver types */ |
@@ -1979,12 +1983,36 @@ static int azx_resume(struct pci_dev *pci) | |||
1979 | 1983 | ||
1980 | 1984 | ||
1981 | /* | 1985 | /* |
1986 | * reboot notifier for hang-up problem at power-down | ||
1987 | */ | ||
1988 | static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf) | ||
1989 | { | ||
1990 | struct azx *chip = container_of(nb, struct azx, reboot_notifier); | ||
1991 | azx_stop_chip(chip); | ||
1992 | return NOTIFY_OK; | ||
1993 | } | ||
1994 | |||
1995 | static void azx_notifier_register(struct azx *chip) | ||
1996 | { | ||
1997 | chip->reboot_notifier.notifier_call = azx_halt; | ||
1998 | register_reboot_notifier(&chip->reboot_notifier); | ||
1999 | } | ||
2000 | |||
2001 | static void azx_notifier_unregister(struct azx *chip) | ||
2002 | { | ||
2003 | if (chip->reboot_notifier.notifier_call) | ||
2004 | unregister_reboot_notifier(&chip->reboot_notifier); | ||
2005 | } | ||
2006 | |||
2007 | /* | ||
1982 | * destructor | 2008 | * destructor |
1983 | */ | 2009 | */ |
1984 | static int azx_free(struct azx *chip) | 2010 | static int azx_free(struct azx *chip) |
1985 | { | 2011 | { |
1986 | int i; | 2012 | int i; |
1987 | 2013 | ||
2014 | azx_notifier_unregister(chip); | ||
2015 | |||
1988 | if (chip->initialized) { | 2016 | if (chip->initialized) { |
1989 | azx_clear_irq_pending(chip); | 2017 | azx_clear_irq_pending(chip); |
1990 | for (i = 0; i < chip->num_streams; i++) | 2018 | for (i = 0; i < chip->num_streams; i++) |
@@ -2348,6 +2376,7 @@ static int __devinit azx_probe(struct pci_dev *pci, | |||
2348 | pci_set_drvdata(pci, card); | 2376 | pci_set_drvdata(pci, card); |
2349 | chip->running = 1; | 2377 | chip->running = 1; |
2350 | power_down_all_codecs(chip); | 2378 | power_down_all_codecs(chip); |
2379 | azx_notifier_register(chip); | ||
2351 | 2380 | ||
2352 | dev++; | 2381 | dev++; |
2353 | return err; | 2382 | return err; |
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c index 2b00c4afdf97..d3fd432cb3ea 100644 --- a/sound/pci/hda/patch_analog.c +++ b/sound/pci/hda/patch_analog.c | |||
@@ -3860,6 +3860,7 @@ static const char *ad1884a_models[AD1884A_MODELS] = { | |||
3860 | 3860 | ||
3861 | static struct snd_pci_quirk ad1884a_cfg_tbl[] = { | 3861 | static struct snd_pci_quirk ad1884a_cfg_tbl[] = { |
3862 | SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), | 3862 | SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), |
3863 | SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), | ||
3863 | SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), | 3864 | SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), |
3864 | {} | 3865 | {} |
3865 | }; | 3866 | }; |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 788fdc6f3264..df9b0bc7f878 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -566,10 +566,8 @@ static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol, | |||
566 | nid = codec->slave_dig_outs[smux_idx - 1]; | 566 | nid = codec->slave_dig_outs[smux_idx - 1]; |
567 | if (spec->cur_smux[smux_idx] == smux->num_items - 1) | 567 | if (spec->cur_smux[smux_idx] == smux->num_items - 1) |
568 | val = AMP_OUT_MUTE; | 568 | val = AMP_OUT_MUTE; |
569 | if (smux_idx == 0) | ||
570 | nid = spec->multiout.dig_out_nid; | ||
571 | else | 569 | else |
572 | nid = codec->slave_dig_outs[smux_idx - 1]; | 570 | val = AMP_OUT_UNMUTE; |
573 | /* un/mute SPDIF out */ | 571 | /* un/mute SPDIF out */ |
574 | snd_hda_codec_write_cache(codec, nid, 0, | 572 | snd_hda_codec_write_cache(codec, nid, 0, |
575 | AC_VERB_SET_AMP_GAIN_MUTE, val); | 573 | AC_VERB_SET_AMP_GAIN_MUTE, val); |
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index 5b442383fcda..58d7cda03de5 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c | |||
@@ -2688,12 +2688,13 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci, | |||
2688 | return err; | 2688 | return err; |
2689 | } | 2689 | } |
2690 | 2690 | ||
2691 | if (ice_has_con_ac97(ice)) | 2691 | if (ice_has_con_ac97(ice)) { |
2692 | err = snd_ice1712_pcm(ice, pcm_dev++, NULL); | 2692 | err = snd_ice1712_pcm(ice, pcm_dev++, NULL); |
2693 | if (err < 0) { | 2693 | if (err < 0) { |
2694 | snd_card_free(card); | 2694 | snd_card_free(card); |
2695 | return err; | 2695 | return err; |
2696 | } | 2696 | } |
2697 | } | ||
2697 | 2698 | ||
2698 | err = snd_ice1712_ac97_mixer(ice); | 2699 | err = snd_ice1712_ac97_mixer(ice); |
2699 | if (err < 0) { | 2700 | if (err < 0) { |
@@ -2715,12 +2716,13 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci, | |||
2715 | } | 2716 | } |
2716 | } | 2717 | } |
2717 | 2718 | ||
2718 | if (ice_has_con_ac97(ice)) | 2719 | if (ice_has_con_ac97(ice)) { |
2719 | err = snd_ice1712_pcm_ds(ice, pcm_dev++, NULL); | 2720 | err = snd_ice1712_pcm_ds(ice, pcm_dev++, NULL); |
2720 | if (err < 0) { | 2721 | if (err < 0) { |
2721 | snd_card_free(card); | 2722 | snd_card_free(card); |
2722 | return err; | 2723 | return err; |
2723 | } | 2724 | } |
2725 | } | ||
2724 | 2726 | ||
2725 | if (!c->no_mpu401) { | 2727 | if (!c->no_mpu401) { |
2726 | err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712, | 2728 | err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712, |
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index c88d1eace1c4..19d3391e229f 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c | |||
@@ -2702,6 +2702,7 @@ static struct snd_pci_quirk intel8x0_clock_list[] __devinitdata = { | |||
2702 | SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000), | 2702 | SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000), |
2703 | SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100), | 2703 | SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100), |
2704 | SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000), | 2704 | SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000), |
2705 | SND_PCI_QUIRK(0x1028, 0x01ad, "AD1981B", 48000), | ||
2705 | SND_PCI_QUIRK(0x1043, 0x80f3, "AD1985", 48000), | 2706 | SND_PCI_QUIRK(0x1043, 0x80f3, "AD1985", 48000), |
2706 | { } /* terminator */ | 2707 | { } /* terminator */ |
2707 | }; | 2708 | }; |
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c index aba402b3c999..945b32ed9884 100644 --- a/sound/soc/codecs/wm9713.c +++ b/sound/soc/codecs/wm9713.c | |||
@@ -140,7 +140,7 @@ SOC_SINGLE("Capture ADC Boost (+20dB) Switch", AC97_VIDEO, 6, 1, 0), | |||
140 | 140 | ||
141 | SOC_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0), | 141 | SOC_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0), |
142 | SOC_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0), | 142 | SOC_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0), |
143 | SOC_SINGLE("ALC Decay Time ", AC97_CODEC_CLASS_REV, 4, 15, 0), | 143 | SOC_SINGLE("ALC Decay Time", AC97_CODEC_CLASS_REV, 4, 15, 0), |
144 | SOC_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0), | 144 | SOC_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0), |
145 | SOC_ENUM("ALC Function", wm9713_enum[6]), | 145 | SOC_ENUM("ALC Function", wm9713_enum[6]), |
146 | SOC_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 0), | 146 | SOC_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 0), |
diff --git a/sound/soc/fsl/mpc5200_psc_i2s.c b/sound/soc/fsl/mpc5200_psc_i2s.c index 86923299bc10..94a02eaa4825 100644 --- a/sound/soc/fsl/mpc5200_psc_i2s.c +++ b/sound/soc/fsl/mpc5200_psc_i2s.c | |||
@@ -277,7 +277,7 @@ static int psc_i2s_trigger(struct snd_pcm_substream *substream, int cmd) | |||
277 | struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs; | 277 | struct mpc52xx_psc __iomem *regs = psc_i2s->psc_regs; |
278 | u16 imr; | 278 | u16 imr; |
279 | u8 psc_cmd; | 279 | u8 psc_cmd; |
280 | long flags; | 280 | unsigned long flags; |
281 | 281 | ||
282 | if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) | 282 | if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE) |
283 | s = &psc_i2s->capture; | 283 | s = &psc_i2s->capture; |
@@ -699,9 +699,11 @@ static ssize_t psc_i2s_stat_store(struct device *dev, | |||
699 | return count; | 699 | return count; |
700 | } | 700 | } |
701 | 701 | ||
702 | DEVICE_ATTR(status, 0644, psc_i2s_status_show, NULL); | 702 | static DEVICE_ATTR(status, 0644, psc_i2s_status_show, NULL); |
703 | DEVICE_ATTR(playback_underrun, 0644, psc_i2s_stat_show, psc_i2s_stat_store); | 703 | static DEVICE_ATTR(playback_underrun, 0644, psc_i2s_stat_show, |
704 | DEVICE_ATTR(capture_overrun, 0644, psc_i2s_stat_show, psc_i2s_stat_store); | 704 | psc_i2s_stat_store); |
705 | static DEVICE_ATTR(capture_overrun, 0644, psc_i2s_stat_show, | ||
706 | psc_i2s_stat_store); | ||
705 | 707 | ||
706 | /* --------------------------------------------------------------------- | 708 | /* --------------------------------------------------------------------- |
707 | * OF platform bus binding code: | 709 | * OF platform bus binding code: |
@@ -819,8 +821,8 @@ static int __devinit psc_i2s_of_probe(struct of_device *op, | |||
819 | 821 | ||
820 | /* Register the SYSFS files */ | 822 | /* Register the SYSFS files */ |
821 | rc = device_create_file(psc_i2s->dev, &dev_attr_status); | 823 | rc = device_create_file(psc_i2s->dev, &dev_attr_status); |
822 | rc = device_create_file(psc_i2s->dev, &dev_attr_capture_overrun); | 824 | rc |= device_create_file(psc_i2s->dev, &dev_attr_capture_overrun); |
823 | rc = device_create_file(psc_i2s->dev, &dev_attr_playback_underrun); | 825 | rc |= device_create_file(psc_i2s->dev, &dev_attr_playback_underrun); |
824 | if (rc) | 826 | if (rc) |
825 | dev_info(psc_i2s->dev, "error creating sysfs files\n"); | 827 | dev_info(psc_i2s->dev, "error creating sysfs files\n"); |
826 | 828 | ||
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 462e635dfc74..a3adbf06b1e5 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -1462,7 +1462,7 @@ int snd_soc_info_volsw(struct snd_kcontrol *kcontrol, | |||
1462 | struct soc_mixer_control *mc = | 1462 | struct soc_mixer_control *mc = |
1463 | (struct soc_mixer_control *)kcontrol->private_value; | 1463 | (struct soc_mixer_control *)kcontrol->private_value; |
1464 | int max = mc->max; | 1464 | int max = mc->max; |
1465 | unsigned int shift = mc->min; | 1465 | unsigned int shift = mc->shift; |
1466 | unsigned int rshift = mc->rshift; | 1466 | unsigned int rshift = mc->rshift; |
1467 | 1467 | ||
1468 | if (max == 1) | 1468 | if (max == 1) |
diff --git a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h index 69689e79bf79..92115755d98e 100644 --- a/sound/usb/usbquirks.h +++ b/sound/usb/usbquirks.h | |||
@@ -1480,6 +1480,36 @@ YAMAHA_DEVICE(0x7010, "UB99"), | |||
1480 | } | 1480 | } |
1481 | } | 1481 | } |
1482 | }, | 1482 | }, |
1483 | { | ||
1484 | /* Advanced modes of the Edirol UA-25EX. | ||
1485 | * For the standard mode, UA-25EX has ID 0582:00e7, which | ||
1486 | * offers only 16-bit PCM at 44.1 kHz and no MIDI. | ||
1487 | */ | ||
1488 | USB_DEVICE_VENDOR_SPEC(0x0582, 0x00e6), | ||
1489 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | ||
1490 | .vendor_name = "EDIROL", | ||
1491 | .product_name = "UA-25EX", | ||
1492 | .ifnum = QUIRK_ANY_INTERFACE, | ||
1493 | .type = QUIRK_COMPOSITE, | ||
1494 | .data = (const struct snd_usb_audio_quirk[]) { | ||
1495 | { | ||
1496 | .ifnum = 0, | ||
1497 | .type = QUIRK_AUDIO_EDIROL_UAXX | ||
1498 | }, | ||
1499 | { | ||
1500 | .ifnum = 1, | ||
1501 | .type = QUIRK_AUDIO_EDIROL_UAXX | ||
1502 | }, | ||
1503 | { | ||
1504 | .ifnum = 2, | ||
1505 | .type = QUIRK_AUDIO_EDIROL_UAXX | ||
1506 | }, | ||
1507 | { | ||
1508 | .ifnum = -1 | ||
1509 | } | ||
1510 | } | ||
1511 | } | ||
1512 | }, | ||
1483 | 1513 | ||
1484 | /* Guillemot devices */ | 1514 | /* Guillemot devices */ |
1485 | { | 1515 | { |