Merge branch 'x86/urgent' into x86/cleanups
This commit is contained in:
		
						commit
						94d4ac2f4a
					
				| @ -26,6 +26,12 @@ Mailing list: linux-ext4@vger.kernel.org | ||||
| 
 | ||||
|     git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git | ||||
| 
 | ||||
|   - Note that it is highly important to install the mke2fs.conf file | ||||
|     that comes with the e2fsprogs 1.41.x sources in /etc/mke2fs.conf. If | ||||
|     you have edited the /etc/mke2fs.conf file installed on your system, | ||||
|     you will need to merge your changes with the version from e2fsprogs | ||||
|     1.41.x. | ||||
| 
 | ||||
|   - Create a new filesystem using the ext4dev filesystem type: | ||||
| 
 | ||||
|     	# mke2fs -t ext4dev /dev/hda1 | ||||
|  | ||||
| @ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a | ||||
| fork. So if you have any comments or updates for this file, please try | ||||
| to update the original English file first. | ||||
| 
 | ||||
| Last Updated: 2007/11/16 | ||||
| Last Updated: 2008/08/21 | ||||
| ================================== | ||||
| これは、 | ||||
| linux-2.6.24/Documentation/HOWTO | ||||
| linux-2.6.27/Documentation/HOWTO | ||||
| の和訳です。 | ||||
| 
 | ||||
| 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > | ||||
| 翻訳日: 2007/11/10 | ||||
| 翻訳日: 2008/8/5 | ||||
| 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> | ||||
| 校正者: 松倉さん <nbh--mats at nifty dot com> | ||||
|          小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> | ||||
| @ -287,13 +287,15 @@ Linux カーネルの開発プロセスは現在幾つかの異なるメイン | ||||
|     に安定した状態にあると判断したときにリリースされます。目標は毎週新 | ||||
|     しい -rc カーネルをリリースすることです。 | ||||
| 
 | ||||
|    - 以下の URL で各 -rc リリースに存在する既知の後戻り問題のリスト | ||||
|      が追跡されます- | ||||
|      http://kernelnewbies.org/known_regressions | ||||
| 
 | ||||
|   - このプロセスはカーネルが 「準備ができた」と考えられるまで継続しま | ||||
|     す。このプロセスはだいたい 6週間継続します。 | ||||
| 
 | ||||
|   - 各リリースでの既知の後戻り問題(regression: このリリースの中で新規 | ||||
|     に作り込まれた問題を指す) はその都度 Linux-kernel メーリングリスト | ||||
|     に投稿されます。ゴールとしては、カーネルが 「準備ができた」と宣言 | ||||
|     する前にこのリストの長さをゼロに減らすことですが、現実には、数個の | ||||
|     後戻り問題がリリース時にたびたび残ってしまいます。 | ||||
| 
 | ||||
| Andrew Morton が Linux-kernel メーリングリストにカーネルリリースについ | ||||
| て書いたことをここで言っておくことは価値があります- | ||||
|   「カーネルがいつリリースされるかは誰も知りません。なぜなら、これは現 | ||||
| @ -303,18 +305,20 @@ Andrew Morton が Linux-kernel メーリングリストにカーネルリリー | ||||
| 2.6.x.y -stable カーネルツリー | ||||
| --------------------------- | ||||
| 
 | ||||
| バージョンに4つ目の数字がついたカーネルは -stable カーネルです。これに | ||||
| は、2.6.x カーネルで見つかったセキュリティ問題や重大な後戻りに対する比 | ||||
| 較的小さい重要な修正が含まれます。 | ||||
| バージョン番号が4つの数字に分かれているカーネルは -stable カーネルです。 | ||||
| これには、2.6.x カーネルで見つかったセキュリティ問題や重大な後戻りに対 | ||||
| する比較的小さい重要な修正が含まれます。 | ||||
| 
 | ||||
| これは、開発/実験的バージョンのテストに協力することに興味が無く、 | ||||
| 最新の安定したカーネルを使いたいユーザに推奨するブランチです。 | ||||
| 
 | ||||
| もし、2.6.x.y カーネルが存在しない場合には、番号が一番大きい 2.6.x | ||||
| が最新の安定版カーネルです。 | ||||
| もし、2.6.x.y カーネルが存在しない場合には、番号が一番大きい 2.6.x が | ||||
| 最新の安定版カーネルです。 | ||||
| 
 | ||||
| 2.6.x.y は "stable" チーム <stable@kernel.org> でメンテされており、だ | ||||
| いたい隔週でリリースされています。 | ||||
| 2.6.x.y は "stable" チーム <stable@kernel.org> でメンテされており、必 | ||||
| 要に応じてリリースされます。通常のリリース期間は 2週間毎ですが、差し迫っ | ||||
| た問題がなければもう少し長くなることもあります。セキュリティ関連の問題 | ||||
| の場合はこれに対してだいたいの場合、すぐにリリースがされます。 | ||||
| 
 | ||||
| カーネルツリーに入っている、Documentation/stable_kernel_rules.txt ファ | ||||
| イルにはどのような種類の変更が -stable ツリーに受け入れ可能か、またリ | ||||
| @ -341,7 +345,9 @@ linux-kernel メーリングリストで収集された多数のパッチと同 | ||||
| メインラインへ入れるように Linus にプッシュします。 | ||||
| 
 | ||||
| メインカーネルツリーに含めるために Linus に送る前に、すべての新しいパッ | ||||
| チが -mm ツリーでテストされることが強く推奨されます。 | ||||
| チが -mm ツリーでテストされることが強く推奨されています。マージウィン | ||||
| ドウが開く前に -mm ツリーに現れなかったパッチはメインラインにマージさ | ||||
| れることは困難になります。 | ||||
| 
 | ||||
| これらのカーネルは安定して動作すべきシステムとして使うのには適切ではあ | ||||
| りませんし、カーネルブランチの中でももっとも動作にリスクが高いものです。 | ||||
| @ -395,13 +401,15 @@ linux-kernel メーリングリストで収集された多数のパッチと同 | ||||
|     - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net> | ||||
| 	git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git | ||||
| 
 | ||||
|     - SCSI, James Bottomley <James.Bottomley@SteelEye.com> | ||||
|     - SCSI, James Bottomley <James.Bottomley@hansenpartnership.com> | ||||
| 	git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git | ||||
| 
 | ||||
|     - x86, Ingo Molnar <mingo@elte.hu> | ||||
| 	git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git | ||||
| 
 | ||||
|   quilt ツリー- | ||||
|     - USB, PCI ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de> | ||||
|     - USB, ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de> | ||||
| 	kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ | ||||
|     - x86-64 と i386 の仲間 Andi Kleen <ak@suse.de> | ||||
| 
 | ||||
|   その他のカーネルツリーは http://git.kernel.org/ と MAINTAINERS ファ | ||||
|   イルに一覧表があります。 | ||||
| @ -412,13 +420,32 @@ linux-kernel メーリングリストで収集された多数のパッチと同 | ||||
| bugzilla.kernel.org は Linux カーネル開発者がカーネルのバグを追跡する | ||||
| 場所です。ユーザは見つけたバグの全てをこのツールで報告すべきです。 | ||||
| どう kernel bugzilla を使うかの詳細は、以下を参照してください- | ||||
| 	http://test.kernel.org/bugzilla/faq.html | ||||
| 
 | ||||
| 	http://bugzilla.kernel.org/page.cgi?id=faq.html | ||||
| メインカーネルソースディレクトリにあるファイル REPORTING-BUGS はカーネ | ||||
| ルバグらしいものについてどうレポートするかの良いテンプレートであり、問 | ||||
| 題の追跡を助けるためにカーネル開発者にとってどんな情報が必要なのかの詳 | ||||
| 細が書かれています。 | ||||
| 
 | ||||
| バグレポートの管理 | ||||
| ------------------- | ||||
| 
 | ||||
| あなたのハッキングのスキルを訓練する最高の方法のひとつに、他人がレポー | ||||
| トしたバグを修正することがあります。あなたがカーネルをより安定化させる | ||||
| こに寄与するということだけでなく、あなたは 現実の問題を修正することを | ||||
| 学び、自分のスキルも強化でき、また他の開発者があなたの存在に気がつき | ||||
| ます。バグを修正することは、多くの開発者の中から自分が功績をあげる最善 | ||||
| の道です、なぜなら多くの人は他人のバグの修正に時間を浪費することを好ま | ||||
| ないからです。 | ||||
| 
 | ||||
| すでにレポートされたバグのために仕事をするためには、 | ||||
| http://bugzilla.kernel.org に行ってください。もし今後のバグレポートに | ||||
| ついてアドバイスを受けたいのであれば、bugme-new メーリングリスト(新し | ||||
| いバグレポートだけがここにメールされる) または bugme-janitor メーリン | ||||
| グリスト(bugzilla の変更毎にここにメールされる)を購読できます。 | ||||
| 
 | ||||
| 	http://lists.linux-foundation.org/mailman/listinfo/bugme-new | ||||
| 	http://lists.linux-foundation.org/mailman/listinfo/bugme-janitors | ||||
| 
 | ||||
| メーリングリスト | ||||
| ------------- | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										111
									
								
								Documentation/ja_JP/SubmitChecklist
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								Documentation/ja_JP/SubmitChecklist
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,111 @@ | ||||
| NOTE: | ||||
| This is a version of Documentation/SubmitChecklist into Japanese. | ||||
| This document is maintained by Takenori Nagano <t-nagano@ah.jp.nec.com> | ||||
| and the JF Project team <http://www.linux.or.jp/JF/>. | ||||
| If you find any difference between this document and the original file | ||||
| or a problem with the translation, | ||||
| please contact the maintainer of this file or JF project. | ||||
| 
 | ||||
| Please also note that the purpose of this file is to be easier to read | ||||
| for non English (read: Japanese) speakers and is not intended as a | ||||
| fork. So if you have any comments or updates of this file, please try | ||||
| to update the original English file first. | ||||
| 
 | ||||
| Last Updated: 2008/07/14 | ||||
| ================================== | ||||
| これは、 | ||||
| linux-2.6.26/Documentation/SubmitChecklist の和訳です。 | ||||
| 
 | ||||
| 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > | ||||
| 翻訳日: 2008/07/14 | ||||
| 翻訳者: Takenori Nagano <t-nagano at ah dot jp dot nec dot com> | ||||
| 校正者: Masanori Kobayashi さん <zap03216 at nifty dot ne dot jp> | ||||
| ================================== | ||||
| 
 | ||||
| 
 | ||||
| Linux カーネルパッチ投稿者向けチェックリスト | ||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
| 
 | ||||
| 本書では、パッチをより素早く取り込んでもらいたい開発者が実践すべき基本的な事柄 | ||||
| をいくつか紹介します。ここにある全ての事柄は、Documentation/SubmittingPatches | ||||
| などのLinuxカーネルパッチ投稿に際しての心得を補足するものです。 | ||||
| 
 | ||||
|  1: 妥当なCONFIGオプションや変更されたCONFIGオプション、つまり =y, =m, =n | ||||
|     全てで正しくビルドできることを確認してください。その際、gcc及びリンカが | ||||
|     warningやerrorを出していないことも確認してください。 | ||||
| 
 | ||||
|  2: allnoconfig, allmodconfig オプションを用いて正しくビルドできることを | ||||
|     確認してください。 | ||||
| 
 | ||||
|  3: 手許のクロスコンパイルツールやOSDLのPLMのようなものを用いて、複数の | ||||
|     アーキテクチャにおいても正しくビルドできることを確認してください。 | ||||
| 
 | ||||
|  4: 64bit長の'unsigned long'を使用しているppc64は、クロスコンパイルでの | ||||
|     チェックに適当なアーキテクチャです。 | ||||
| 
 | ||||
|  5: カーネルコーディングスタイルに準拠しているかどうか確認してください(!) | ||||
| 
 | ||||
|  6: CONFIGオプションの追加・変更をした場合には、CONFIGメニューが壊れていない | ||||
|     ことを確認してください。 | ||||
| 
 | ||||
|  7: 新しくKconfigのオプションを追加する際には、必ずそのhelpも記述してください。 | ||||
| 
 | ||||
|  8: 適切なKconfigの依存関係を考えながら慎重にチェックしてください。 | ||||
|     ただし、この作業はマシンを使ったテストできちんと行うのがとても困難です。 | ||||
|     うまくやるには、自分の頭で考えることです。 | ||||
| 
 | ||||
|  9: sparseを利用してちゃんとしたコードチェックをしてください。 | ||||
| 
 | ||||
| 10: 'make checkstack' と 'make namespacecheck' を利用し、問題が発見されたら | ||||
|     修正してください。'make checkstack' は明示的に問題を示しませんが、どれか | ||||
|     1つの関数が512バイトより大きいスタックを使っていれば、修正すべき候補と | ||||
|     なります。 | ||||
| 
 | ||||
| 11: グローバルなkernel API を説明する kernel-doc をソースの中に含めてください。 | ||||
|     ( staticな関数においては必須ではありませんが、含めてもらっても結構です ) | ||||
|     そして、'make htmldocs' もしくは 'make mandocs' を利用して追記した | ||||
|     ドキュメントのチェックを行い、問題が見つかった場合には修正を行ってください。 | ||||
| 
 | ||||
| 12: CONFIG_PREEMPT, CONFIG_DEBUG_PREEMPT, CONFIG_DEBUG_SLAB, | ||||
|     CONFIG_DEBUG_PAGEALLOC, CONFIG_DEBUG_MUTEXES, CONFIG_DEBUG_SPINLOCK, | ||||
|     CONFIG_DEBUG_SPINLOCK_SLEEP これら全てを同時に有効にして動作確認を | ||||
|     行ってください。 | ||||
| 
 | ||||
| 13: CONFIG_SMP, CONFIG_PREEMPT を有効にした場合と無効にした場合の両方で | ||||
|     ビルドした上、動作確認を行ってください。 | ||||
| 
 | ||||
| 14: もしパッチがディスクのI/O性能などに影響を与えるようであれば、 | ||||
|     'CONFIG_LBD'オプションを有効にした場合と無効にした場合の両方で | ||||
|     テストを実施してみてください。 | ||||
| 
 | ||||
| 15: lockdepの機能を全て有効にした上で、全てのコードパスを評価してください。 | ||||
| 
 | ||||
| 16: /proc に新しいエントリを追加した場合には、Documentation/ 配下に | ||||
|     必ずドキュメントを追加してください。 | ||||
| 
 | ||||
| 17: 新しいブートパラメータを追加した場合には、 | ||||
|     必ずDocumentation/kernel-parameters.txt に説明を追加してください。 | ||||
| 
 | ||||
| 18: 新しくmoduleにパラメータを追加した場合には、MODULE_PARM_DESC()を | ||||
|     利用して必ずその説明を記述してください。 | ||||
| 
 | ||||
| 19: 新しいuserspaceインタフェースを作成した場合には、Documentation/ABI/ に | ||||
|     Documentation/ABI/README を参考にして必ずドキュメントを追加してください。 | ||||
| 
 | ||||
| 20: 'make headers_check'を実行して全く問題がないことを確認してください。 | ||||
| 
 | ||||
| 21: 少なくともslabアロケーションとpageアロケーションに失敗した場合の | ||||
|     挙動について、fault-injectionを利用して確認してください。 | ||||
|     Documentation/fault-injection/ を参照してください。 | ||||
| 
 | ||||
|     追加したコードがかなりの量であったならば、サブシステム特有の | ||||
|     fault-injectionを追加したほうが良いかもしれません。 | ||||
| 
 | ||||
| 22: 新たに追加したコードは、`gcc -W'でコンパイルしてください。 | ||||
|     このオプションは大量の不要なメッセージを出力しますが、 | ||||
|     "warning: comparison between signed and unsigned" のようなメッセージは、 | ||||
|     バグを見つけるのに役に立ちます。 | ||||
| 
 | ||||
| 23: 投稿したパッチが -mm パッチセットにマージされた後、全ての既存のパッチや | ||||
|     VM, VFS およびその他のサブシステムに関する様々な変更と、現時点でも共存 | ||||
|     できることを確認するテストを行ってください。 | ||||
| @ -365,6 +365,8 @@ and is between 256 and 4096 characters. It is defined in the file | ||||
| 			no delay (0). | ||||
| 			Format: integer | ||||
| 
 | ||||
| 	bootmem_debug	[KNL] Enable bootmem allocator debug messages. | ||||
| 
 | ||||
| 	bttv.card=	[HW,V4L] bttv (bt848 + bt878 based grabber cards) | ||||
| 	bttv.radio=	Most important insmod options are available as | ||||
| 			kernel args too. | ||||
| @ -1072,6 +1074,9 @@ and is between 256 and 4096 characters. It is defined in the file | ||||
| 
 | ||||
| 			* [no]ncq: Turn on or off NCQ. | ||||
| 
 | ||||
| 			* nohrst, nosrst, norst: suppress hard, soft | ||||
|                           and both resets. | ||||
| 
 | ||||
| 			If there are multiple matching configurations changing | ||||
| 			the same attribute, the last one is used. | ||||
| 
 | ||||
|  | ||||
| @ -363,6 +363,11 @@ This rule exists because users of the rfkill subsystem expect to get (and set, | ||||
| when possible) the overall transmitter rfkill state, not of a particular rfkill | ||||
| line. | ||||
| 
 | ||||
| 5. During suspend, the rfkill class will attempt to soft-block the radio | ||||
| through a call to rfkill->toggle_radio, and will try to restore its previous | ||||
| state during resume.  After a rfkill class is suspended, it will *not* call | ||||
| rfkill->toggle_radio until it is resumed. | ||||
| 
 | ||||
| Example of a WLAN wireless driver connected to the rfkill subsystem: | ||||
| -------------------------------------------------------------------- | ||||
| 
 | ||||
|  | ||||
| @ -1,3 +1,26 @@ | ||||
| 
 | ||||
| 1 Release Date    : Thur.July. 24 11:41:51 PST 2008 - | ||||
|                        (emaild-id:megaraidlinux@lsi.com) | ||||
|                        Sumant Patro | ||||
|                        Bo Yang | ||||
| 
 | ||||
| 2 Current Version : 00.00.04.01 | ||||
| 3 Older Version   : 00.00.03.22 | ||||
| 
 | ||||
| 1. Add the new controller (0078, 0079) support to the driver | ||||
|        Those controllers are LSI's next generatation(gen2) SAS controllers. | ||||
| 
 | ||||
| 1 Release Date    : Mon.June. 23 10:12:45 PST 2008 - | ||||
|                        (emaild-id:megaraidlinux@lsi.com) | ||||
|                        Sumant Patro | ||||
|                        Bo Yang | ||||
| 
 | ||||
| 2 Current Version : 00.00.03.22 | ||||
| 3 Older Version   : 00.00.03.20 | ||||
| 
 | ||||
| 1. Add shutdown DCMD cmd to the shutdown routine to make FW shutdown proper. | ||||
| 2. Unexpected interrupt occurs in HWR Linux driver, add the dumy readl pci flush will fix this issue. | ||||
| 
 | ||||
| 1 Release Date    : Mon. March 10 11:02:31 PDT 2008 - | ||||
| 			(emaild-id:megaraidlinux@lsi.com) | ||||
| 			Sumant Patro | ||||
|  | ||||
							
								
								
									
										91
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								MAINTAINERS
									
									
									
									
									
								
							| @ -942,96 +942,21 @@ M:	joern@lazybastard.org | ||||
| L:	linux-mtd@lists.infradead.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH DRIVERS | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| L:	linux-bluetooth@vger.kernel.org | ||||
| W:	http://www.bluez.org/ | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH SUBSYSTEM | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| P:	Maxim Krasnyansky | ||||
| M:	maxk@qualcomm.com | ||||
| L:	linux-bluetooth@vger.kernel.org | ||||
| W:	http://bluez.sf.net | ||||
| W:	http://www.bluez.org | ||||
| W:	http://www.holtmann.org/linux/bluetooth/ | ||||
| W:	http://www.bluez.org/ | ||||
| T:	git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH RFCOMM LAYER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| P:	Maxim Krasnyansky | ||||
| M:	maxk@qualcomm.com | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH BNEP LAYER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| P:	Maxim Krasnyansky | ||||
| M:	maxk@qualcomm.com | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH CMTP LAYER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HIDP LAYER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI UART DRIVER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| P:	Maxim Krasnyansky | ||||
| M:	maxk@qualcomm.com | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI USB DRIVER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| P:	Maxim Krasnyansky | ||||
| M:	maxk@qualcomm.com | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI BCM203X DRIVER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI BPA10X DRIVER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI BFUSB DRIVER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI DTL1 DRIVER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI BLUECARD DRIVER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI BT3C DRIVER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI BTUART DRIVER | ||||
| P:	Marcel Holtmann | ||||
| M:	marcel@holtmann.org | ||||
| S:	Maintained | ||||
| 
 | ||||
| BLUETOOTH HCI VHCI DRIVER | ||||
| P:	Maxim Krasnyansky | ||||
| M:	maxk@qualcomm.com | ||||
| S:	Maintained | ||||
| 
 | ||||
| BONDING DRIVER | ||||
| P:	Jay Vosburgh | ||||
| M:	fubar@us.ibm.com | ||||
|  | ||||
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,7 +1,7 @@ | ||||
| VERSION = 2 | ||||
| PATCHLEVEL = 6 | ||||
| SUBLEVEL = 27 | ||||
| EXTRAVERSION = -rc3 | ||||
| EXTRAVERSION = -rc4 | ||||
| NAME = Rotary Wombat | ||||
| 
 | ||||
| # *DOCUMENTATION*
 | ||||
|  | ||||
| @ -405,7 +405,7 @@ static int impd1_probe(struct lm_device *dev) | ||||
| 
 | ||||
| 		ret = amba_device_register(d, &dev->resource); | ||||
| 		if (ret) { | ||||
| 			dev_err(&d->dev, "unable to register device: %d\n"); | ||||
| 			dev_err(&d->dev, "unable to register device: %d\n", ret); | ||||
| 			kfree(d); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -64,7 +64,7 @@ static struct platform_device fsg_i2c_gpio = { | ||||
| 
 | ||||
| static struct i2c_board_info __initdata fsg_i2c_board_info [] = { | ||||
| 	{ | ||||
| 		I2C_BOARD_INFO("rtc-isl1208", 0x6f), | ||||
| 		I2C_BOARD_INFO("isl1208", 0x6f), | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| @ -179,7 +179,6 @@ static void __init fsg_init(void) | ||||
| { | ||||
| 	DECLARE_MAC_BUF(mac_buf); | ||||
| 	uint8_t __iomem *f; | ||||
| 	int i; | ||||
| 
 | ||||
| 	ixp4xx_sys_init(); | ||||
| 
 | ||||
| @ -228,6 +227,7 @@ static void __init fsg_init(void) | ||||
| 	f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x400000); | ||||
| 	if (f) { | ||||
| #ifdef __ARMEB__ | ||||
| 		int i; | ||||
| 		for (i = 0; i < 6; i++) { | ||||
| 			fsg_plat_eth[0].hwaddr[i] = readb(f + 0x3C0422 + i); | ||||
| 			fsg_plat_eth[1].hwaddr[i] = readb(f + 0x3C043B + i); | ||||
|  | ||||
| @ -125,3 +125,28 @@ void clks_register(struct clk *clks, size_t num) | ||||
| 		list_add(&clks[i].node, &clocks); | ||||
| 	mutex_unlock(&clocks_mutex); | ||||
| } | ||||
| 
 | ||||
| int clk_add_alias(char *alias, struct device *alias_dev, char *id, | ||||
| 	struct device *dev) | ||||
| { | ||||
| 	struct clk *r = clk_lookup(dev, id); | ||||
| 	struct clk *new; | ||||
| 
 | ||||
| 	if (!r) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	new = kzalloc(sizeof(struct clk), GFP_KERNEL); | ||||
| 
 | ||||
| 	if (!new) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	new->name = alias; | ||||
| 	new->dev = alias_dev; | ||||
| 	new->other = r; | ||||
| 
 | ||||
| 	mutex_lock(&clocks_mutex); | ||||
| 	list_add(&new->node, &clocks); | ||||
| 	mutex_unlock(&clocks_mutex); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -1,3 +1,5 @@ | ||||
| #include <linux/list.h> | ||||
| 
 | ||||
| struct clk; | ||||
| 
 | ||||
| struct clkops { | ||||
| @ -86,3 +88,6 @@ extern void clk_pxa3xx_cken_disable(struct clk *); | ||||
| #endif | ||||
| 
 | ||||
| void clks_register(struct clk *clks, size_t num); | ||||
| int clk_add_alias(char *alias, struct device *alias_dev, char *id, | ||||
| 	struct device *dev); | ||||
| 
 | ||||
|  | ||||
| @ -10,18 +10,78 @@ | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/init.h> | ||||
| 
 | ||||
| #include <asm/setup.h> | ||||
| #include <asm/mach/arch.h> | ||||
| #include <mach/hardware.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include <mach/mfp-pxa25x.h> | ||||
| #include <mach/hardware.h> | ||||
| 
 | ||||
| #include "generic.h" | ||||
| 
 | ||||
| static unsigned long e740_pin_config[] __initdata = { | ||||
| 	/* Chip selects */ | ||||
| 	GPIO15_nCS_1,   /* CS1 - Flash */ | ||||
| 	GPIO79_nCS_3,   /* CS3 - IMAGEON */ | ||||
| 	GPIO80_nCS_4,   /* CS4 - TMIO */ | ||||
| 
 | ||||
| 	/* Clocks */ | ||||
| 	GPIO12_32KHz, | ||||
| 
 | ||||
| 	/* BTUART */ | ||||
| 	GPIO42_BTUART_RXD, | ||||
| 	GPIO43_BTUART_TXD, | ||||
| 	GPIO44_BTUART_CTS, | ||||
| 	GPIO45_GPIO, /* Used by TMIO for #SUSPEND */ | ||||
| 
 | ||||
| 	/* PC Card */ | ||||
| 	GPIO8_GPIO,   /* CD0 */ | ||||
| 	GPIO44_GPIO,  /* CD1 */ | ||||
| 	GPIO11_GPIO,  /* IRQ0 */ | ||||
| 	GPIO6_GPIO,   /* IRQ1 */ | ||||
| 	GPIO27_GPIO,  /* RST0 */ | ||||
| 	GPIO24_GPIO,  /* RST1 */ | ||||
| 	GPIO20_GPIO,  /* PWR0 */ | ||||
| 	GPIO23_GPIO,  /* PWR1 */ | ||||
| 	GPIO48_nPOE, | ||||
| 	GPIO49_nPWE, | ||||
| 	GPIO50_nPIOR, | ||||
| 	GPIO51_nPIOW, | ||||
| 	GPIO52_nPCE_1, | ||||
| 	GPIO53_nPCE_2, | ||||
| 	GPIO54_nPSKTSEL, | ||||
| 	GPIO55_nPREG, | ||||
| 	GPIO56_nPWAIT, | ||||
| 	GPIO57_nIOIS16, | ||||
| 
 | ||||
| 	/* wakeup */ | ||||
| 	GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, | ||||
| }; | ||||
| 
 | ||||
| static unsigned long e400_pin_config[] __initdata = { | ||||
| 	/* Chip selects */ | ||||
| 	GPIO15_nCS_1,   /* CS1 - Flash */ | ||||
| 	GPIO80_nCS_4,   /* CS4 - TMIO */ | ||||
| 
 | ||||
| 	/* Clocks */ | ||||
| 	GPIO12_32KHz, | ||||
| 
 | ||||
| 	/* BTUART */ | ||||
| 	GPIO42_BTUART_RXD, | ||||
| 	GPIO43_BTUART_TXD, | ||||
| 	GPIO44_BTUART_CTS, | ||||
| 	GPIO45_GPIO, /* Used by TMIO for #SUSPEND */ | ||||
| 
 | ||||
| 	/* wakeup */ | ||||
| 	GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, | ||||
| }; | ||||
| 
 | ||||
| /* Only e800 has 128MB RAM */ | ||||
| static void __init eseries_fixup(struct machine_desc *desc, | ||||
|                       struct tag *tags, char **cmdline, struct meminfo *mi) | ||||
| 	struct tag *tags, char **cmdline, struct meminfo *mi) | ||||
| { | ||||
| 	mi->nr_banks=1; | ||||
| 	mi->bank[0].start = 0xa0000000; | ||||
| @ -32,83 +92,95 @@ static void __init eseries_fixup(struct machine_desc *desc, | ||||
| 		mi->bank[0].size = (64*1024*1024); | ||||
| } | ||||
| 
 | ||||
| static void __init e740_init(void) | ||||
| { | ||||
| 	pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config)); | ||||
| } | ||||
| 
 | ||||
| static void __init e400_init(void) | ||||
| { | ||||
| 	pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config)); | ||||
| } | ||||
| 
 | ||||
| /* e-series machine definitions */ | ||||
| 
 | ||||
| #ifdef CONFIG_MACH_E330 | ||||
| MACHINE_START(E330, "Toshiba e330") | ||||
|         /* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
|         .phys_io        = 0x40000000, | ||||
|         .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
|         .boot_params    = 0xa0000100, | ||||
|         .map_io         = pxa_map_io, | ||||
|         .init_irq       = pxa25x_init_irq, | ||||
|         .fixup          = eseries_fixup, | ||||
|         .timer = &pxa_timer, | ||||
| 	/* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
| 	.phys_io	= 0x40000000, | ||||
| 	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
| 	.boot_params	= 0xa0000100, | ||||
| 	.map_io		= pxa_map_io, | ||||
| 	.init_irq	= pxa25x_init_irq, | ||||
| 	.fixup		= eseries_fixup, | ||||
| 	.timer		= &pxa_timer, | ||||
| MACHINE_END | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_MACH_E350 | ||||
| MACHINE_START(E350, "Toshiba e350") | ||||
| 	/* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
| 	.phys_io        = 0x40000000, | ||||
| 	.io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
| 	.boot_params    = 0xa0000100, | ||||
| 	.map_io         = pxa_map_io, | ||||
| 	.init_irq       = pxa25x_init_irq, | ||||
| 	.fixup          = eseries_fixup, | ||||
| 	.timer = &pxa_timer, | ||||
| 	.phys_io	= 0x40000000, | ||||
| 	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
| 	.boot_params	= 0xa0000100, | ||||
| 	.map_io		= pxa_map_io, | ||||
| 	.init_irq	= pxa25x_init_irq, | ||||
| 	.fixup		= eseries_fixup, | ||||
| 	.timer		= &pxa_timer, | ||||
| MACHINE_END | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_MACH_E740 | ||||
| MACHINE_START(E740, "Toshiba e740") | ||||
|         /* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
|         .phys_io        = 0x40000000, | ||||
|         .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
|         .boot_params    = 0xa0000100, | ||||
|         .map_io         = pxa_map_io, | ||||
|         .init_irq       = pxa25x_init_irq, | ||||
|         .fixup          = eseries_fixup, | ||||
|         .timer = &pxa_timer, | ||||
| 	/* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
| 	.phys_io	= 0x40000000, | ||||
| 	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
| 	.boot_params	= 0xa0000100, | ||||
| 	.map_io		= pxa_map_io, | ||||
| 	.init_irq	= pxa25x_init_irq, | ||||
| 	.fixup		= eseries_fixup, | ||||
| 	.init_machine	= e740_init, | ||||
| 	.timer		= &pxa_timer, | ||||
| MACHINE_END | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_MACH_E750 | ||||
| MACHINE_START(E750, "Toshiba e750") | ||||
|         /* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
|         .phys_io        = 0x40000000, | ||||
|         .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
|         .boot_params    = 0xa0000100, | ||||
|         .map_io         = pxa_map_io, | ||||
|         .init_irq       = pxa25x_init_irq, | ||||
|         .fixup          = eseries_fixup, | ||||
|         .timer = &pxa_timer, | ||||
| 	/* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
| 	.phys_io	= 0x40000000, | ||||
| 	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
| 	.boot_params	= 0xa0000100, | ||||
| 	.map_io		= pxa_map_io, | ||||
| 	.init_irq	= pxa25x_init_irq, | ||||
| 	.fixup		= eseries_fixup, | ||||
| 	.timer		= &pxa_timer, | ||||
| MACHINE_END | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_MACH_E400 | ||||
| MACHINE_START(E400, "Toshiba e400") | ||||
|         /* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
|         .phys_io        = 0x40000000, | ||||
|         .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
|         .boot_params    = 0xa0000100, | ||||
|         .map_io         = pxa_map_io, | ||||
|         .init_irq       = pxa25x_init_irq, | ||||
|         .fixup          = eseries_fixup, | ||||
|         .timer = &pxa_timer, | ||||
| 	/* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
| 	.phys_io	= 0x40000000, | ||||
| 	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
| 	.boot_params	= 0xa0000100, | ||||
| 	.map_io		= pxa_map_io, | ||||
| 	.init_irq	= pxa25x_init_irq, | ||||
| 	.fixup		= eseries_fixup, | ||||
| 	.init_machine	= e400_init, | ||||
| 	.timer		= &pxa_timer, | ||||
| MACHINE_END | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_MACH_E800 | ||||
| MACHINE_START(E800, "Toshiba e800") | ||||
|         /* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
|         .phys_io        = 0x40000000, | ||||
|         .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
|         .boot_params    = 0xa0000100, | ||||
|         .map_io         = pxa_map_io, | ||||
|         .init_irq       = pxa25x_init_irq, | ||||
|         .fixup          = eseries_fixup, | ||||
|         .timer = &pxa_timer, | ||||
| 	/* Maintainer: Ian Molton (spyro@f2s.com) */ | ||||
| 	.phys_io	= 0x40000000, | ||||
| 	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc, | ||||
| 	.boot_params	= 0xa0000100, | ||||
| 	.map_io		= pxa_map_io, | ||||
| 	.init_irq	= pxa25x_init_irq, | ||||
| 	.fixup		= eseries_fixup, | ||||
| 	.timer		= &pxa_timer, | ||||
| MACHINE_END | ||||
| #endif | ||||
| 
 | ||||
|  | ||||
| @ -183,6 +183,7 @@ | ||||
|       defined(CONFIG_MACH_TOSA) || \ | ||||
|       defined(CONFIG_MACH_MAINSTONE) || \ | ||||
|       defined(CONFIG_MACH_PCM027) || \ | ||||
|       defined(CONFIG_ARCH_PXA_ESERIES) || \ | ||||
|       defined(CONFIG_MACH_MAGICIAN) | ||||
| #define NR_IRQS			(IRQ_BOARD_END) | ||||
| #elif defined(CONFIG_MACH_ZYLONITE) | ||||
|  | ||||
| @ -52,6 +52,7 @@ | ||||
| #include <mach/mmc.h> | ||||
| 
 | ||||
| #include "generic.h" | ||||
| #include "clock.h" | ||||
| #include "devices.h" | ||||
| 
 | ||||
| static unsigned long lubbock_pin_config[] __initdata = { | ||||
| @ -485,6 +486,7 @@ static void __init lubbock_init(void) | ||||
| 
 | ||||
| 	pxa2xx_mfp_config(ARRAY_AND_SIZE(lubbock_pin_config)); | ||||
| 
 | ||||
| 	clk_add_alias("SA1111_CLK", NULL, "GPIO11_CLK", NULL); | ||||
| 	pxa_set_udc_info(&udc_info); | ||||
| 	set_pxa_fb_info(&sharp_lm8v31); | ||||
| 	pxa_set_mci_info(&lubbock_mci_platform_data); | ||||
|  | ||||
| @ -166,8 +166,7 @@ static struct clk pxa25x_hwuart_clk = | ||||
| ; | ||||
| 
 | ||||
| /*
 | ||||
|  * PXA 2xx clock declarations. Order is important (see aliases below) | ||||
|  * Please be careful not to disrupt the ordering. | ||||
|  * PXA 2xx clock declarations. | ||||
|  */ | ||||
| static struct clk pxa25x_clks[] = { | ||||
| 	INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev), | ||||
| @ -194,11 +193,6 @@ static struct clk pxa25x_clks[] = { | ||||
| 	INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), | ||||
| }; | ||||
| 
 | ||||
| static struct clk pxa2xx_clk_aliases[] = { | ||||
| 	INIT_CKOTHER("GPIO7_CLK", &pxa25x_clks[4], NULL), | ||||
| 	INIT_CKOTHER("SA1111_CLK", &pxa25x_clks[5], NULL), | ||||
| }; | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| 
 | ||||
| #define SAVE(x)		sleep_save[SLEEP_SAVE_##x] = x | ||||
| @ -375,8 +369,6 @@ static int __init pxa25x_init(void) | ||||
| 	if (cpu_is_pxa255()) | ||||
| 		ret = platform_device_register(&pxa_device_hwuart); | ||||
| 
 | ||||
| 	clks_register(pxa2xx_clk_aliases, ARRAY_SIZE(pxa2xx_clk_aliases)); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -90,7 +90,9 @@ static struct clk common_clks[] = { | ||||
| }; | ||||
| 
 | ||||
| static struct clk pxa310_clks[] = { | ||||
| #ifdef CONFIG_CPU_PXA310 | ||||
| 	PXA3xx_CKEN("MMCCLK", MMC3, 19500000, 0, &pxa3xx_device_mci3.dev), | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| static int __init pxa300_init(void) | ||||
|  | ||||
| @ -10,7 +10,6 @@ | ||||
|  * it under the terms of the GNU General Public License version 2 as | ||||
|  * published by the Free Software Foundation. | ||||
|  */ | ||||
| #include <linux/version.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/module.h> | ||||
|  | ||||
| @ -19,8 +19,6 @@ | ||||
| #include <asm/irq.h> | ||||
| #include <asm/system.h> | ||||
| 
 | ||||
| #include <linux/version.h> | ||||
| 
 | ||||
| #include <hwregs/reg_map.h> | ||||
| #include <hwregs/reg_rdwr.h> | ||||
| #include <hwregs/timer_defs.h> | ||||
|  | ||||
| @ -17,7 +17,6 @@ static const char serial_revdate[] = "2007-11-06"; | ||||
| #define SUPPORT_SYSRQ | ||||
| #endif | ||||
| 
 | ||||
| #include <linux/version.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/serial.h> | ||||
| #include <linux/circ_buf.h> | ||||
|  | ||||
| @ -86,6 +86,19 @@ static int __init parse_savemaxmem(char *p) | ||||
| } | ||||
| __setup("savemaxmem=", parse_savemaxmem); | ||||
| 
 | ||||
| 
 | ||||
| static size_t copy_oldmem_vaddr(void *vaddr, char *buf, size_t csize, | ||||
|                                unsigned long offset, int userbuf) | ||||
| { | ||||
| 	if (userbuf) { | ||||
| 		if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) | ||||
| 			return -EFAULT; | ||||
| 	} else | ||||
| 		memcpy(buf, (vaddr + offset), csize); | ||||
| 
 | ||||
| 	return csize; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * copy_oldmem_page - copy one page from "oldmem" | ||||
|  * @pfn: page frame number to be copied | ||||
| @ -107,16 +120,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | ||||
| 	if (!csize) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0); | ||||
| 	csize = min(csize, PAGE_SIZE); | ||||
| 
 | ||||
| 	if (userbuf) { | ||||
| 		if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) { | ||||
| 			iounmap(vaddr); | ||||
| 			return -EFAULT; | ||||
| 		} | ||||
| 	} else | ||||
| 		memcpy(buf, (vaddr + offset), csize); | ||||
| 	if (pfn < max_pfn) { | ||||
| 		vaddr = __va(pfn << PAGE_SHIFT); | ||||
| 		csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); | ||||
| 	} else { | ||||
| 		vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0); | ||||
| 		csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); | ||||
| 		iounmap(vaddr); | ||||
| 	} | ||||
| 
 | ||||
| 	iounmap(vaddr); | ||||
| 	return csize; | ||||
| } | ||||
|  | ||||
| @ -233,17 +233,6 @@ void ibmebus_free_irq(u32 ist, void *dev_id) | ||||
| } | ||||
| EXPORT_SYMBOL(ibmebus_free_irq); | ||||
| 
 | ||||
| static ssize_t name_show(struct device *dev, | ||||
| 			 struct device_attribute *attr, char *buf) | ||||
| { | ||||
| 	return sprintf(buf, "%s\n", to_of_device(dev)->node->name); | ||||
| } | ||||
| 
 | ||||
| static struct device_attribute ibmebus_dev_attrs[] = { | ||||
| 	__ATTR_RO(name), | ||||
| 	__ATTR_NULL | ||||
| }; | ||||
| 
 | ||||
| static char *ibmebus_chomp(const char *in, size_t count) | ||||
| { | ||||
| 	char *out = kmalloc(count + 1, GFP_KERNEL); | ||||
| @ -327,7 +316,6 @@ static struct bus_attribute ibmebus_bus_attrs[] = { | ||||
| 
 | ||||
| struct bus_type ibmebus_bus_type = { | ||||
| 	.uevent    = of_device_uevent, | ||||
| 	.dev_attrs = ibmebus_dev_attrs, | ||||
| 	.bus_attrs = ibmebus_bus_attrs | ||||
| }; | ||||
| EXPORT_SYMBOL(ibmebus_bus_type); | ||||
|  | ||||
| @ -1113,7 +1113,7 @@ static int vio_bus_probe(struct device *dev) | ||||
| 				return error; | ||||
| 		} | ||||
| 		error = viodrv->probe(viodev, id); | ||||
| 		if (error) | ||||
| 		if (error && firmware_has_feature(FW_FEATURE_CMO)) | ||||
| 			vio_cmo_bus_remove(viodev); | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -206,11 +206,6 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc) | ||||
| 			(SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE); | ||||
| 		if (runcntl == 0) | ||||
| 			runcntl = SPU_RUNCNTL_RUNNABLE; | ||||
| 	} | ||||
| 
 | ||||
| 	if (ctx->flags & SPU_CREATE_NOSCHED) { | ||||
| 		spuctx_switch_state(ctx, SPU_UTIL_USER); | ||||
| 		ctx->ops->runcntl_write(ctx, runcntl); | ||||
| 	} else { | ||||
| 		unsigned long privcntl; | ||||
| 
 | ||||
| @ -219,9 +214,15 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc) | ||||
| 		else | ||||
| 			privcntl = SPU_PRIVCNTL_MODE_NORMAL; | ||||
| 
 | ||||
| 		ctx->ops->npc_write(ctx, *npc); | ||||
| 		ctx->ops->privcntl_write(ctx, privcntl); | ||||
| 		ctx->ops->runcntl_write(ctx, runcntl); | ||||
| 		ctx->ops->npc_write(ctx, *npc); | ||||
| 	} | ||||
| 
 | ||||
| 	ctx->ops->runcntl_write(ctx, runcntl); | ||||
| 
 | ||||
| 	if (ctx->flags & SPU_CREATE_NOSCHED) { | ||||
| 		spuctx_switch_state(ctx, SPU_UTIL_USER); | ||||
| 	} else { | ||||
| 
 | ||||
| 		if (ctx->state == SPU_STATE_SAVED) { | ||||
| 			ret = spu_activate(ctx, 0); | ||||
|  | ||||
| @ -641,8 +641,10 @@ static struct spu *find_victim(struct spu_context *ctx) | ||||
| 
 | ||||
| 			if (tmp && tmp->prio > ctx->prio && | ||||
| 			    !(tmp->flags & SPU_CREATE_NOSCHED) && | ||||
| 			    (!victim || tmp->prio > victim->prio)) | ||||
| 			    (!victim || tmp->prio > victim->prio)) { | ||||
| 				victim = spu->ctx; | ||||
| 				get_spu_context(victim); | ||||
| 			} | ||||
| 		} | ||||
| 		mutex_unlock(&cbe_spu_info[node].list_mutex); | ||||
| 
 | ||||
| @ -658,6 +660,7 @@ static struct spu *find_victim(struct spu_context *ctx) | ||||
| 			 * look at another context or give up after X retries. | ||||
| 			 */ | ||||
| 			if (!mutex_trylock(&victim->state_mutex)) { | ||||
| 				put_spu_context(victim); | ||||
| 				victim = NULL; | ||||
| 				goto restart; | ||||
| 			} | ||||
| @ -670,6 +673,7 @@ static struct spu *find_victim(struct spu_context *ctx) | ||||
| 				 * restart the search. | ||||
| 				 */ | ||||
| 				mutex_unlock(&victim->state_mutex); | ||||
| 				put_spu_context(victim); | ||||
| 				victim = NULL; | ||||
| 				goto restart; | ||||
| 			} | ||||
| @ -687,6 +691,7 @@ static struct spu *find_victim(struct spu_context *ctx) | ||||
| 				spu_add_to_rq(victim); | ||||
| 
 | ||||
| 			mutex_unlock(&victim->state_mutex); | ||||
| 			put_spu_context(victim); | ||||
| 
 | ||||
| 			return spu; | ||||
| 		} | ||||
| @ -985,9 +990,11 @@ static int spusched_thread(void *unused) | ||||
| 				struct spu_context *ctx = spu->ctx; | ||||
| 
 | ||||
| 				if (ctx) { | ||||
| 					get_spu_context(ctx); | ||||
| 					mutex_unlock(mtx); | ||||
| 					spusched_tick(ctx); | ||||
| 					mutex_lock(mtx); | ||||
| 					put_spu_context(ctx); | ||||
| 				} | ||||
| 			} | ||||
| 			mutex_unlock(mtx); | ||||
| @ -1030,7 +1037,7 @@ void spuctx_switch_state(struct spu_context *ctx, | ||||
| 		node = spu->node; | ||||
| 		if (old_state == SPU_UTIL_USER) | ||||
| 			atomic_dec(&cbe_spu_info[node].busy_spus); | ||||
| 		if (new_state == SPU_UTIL_USER); | ||||
| 		if (new_state == SPU_UTIL_USER) | ||||
| 			atomic_inc(&cbe_spu_info[node].busy_spus); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -11,7 +11,6 @@ | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/version.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/string.h> | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| # | ||||
| # Automatically generated make config: don't edit | ||||
| # Linux kernel version: 2.6.26-rc4 | ||||
| # Fri May 30 09:49:33 2008 | ||||
| # Linux kernel version: 2.6.27-rc4 | ||||
| # Thu Aug 21 19:43:29 2008 | ||||
| # | ||||
| CONFIG_SCHED_MC=y | ||||
| CONFIG_MMU=y | ||||
| @ -68,7 +68,6 @@ CONFIG_INITRAMFS_SOURCE="" | ||||
| CONFIG_SYSCTL=y | ||||
| # CONFIG_EMBEDDED is not set | ||||
| CONFIG_SYSCTL_SYSCALL=y | ||||
| CONFIG_SYSCTL_SYSCALL_CHECK=y | ||||
| CONFIG_KALLSYMS=y | ||||
| # CONFIG_KALLSYMS_ALL is not set | ||||
| # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||||
| @ -93,11 +92,17 @@ CONFIG_SLAB=y | ||||
| # CONFIG_MARKERS is not set | ||||
| CONFIG_HAVE_OPROFILE=y | ||||
| CONFIG_KPROBES=y | ||||
| # CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set | ||||
| CONFIG_KRETPROBES=y | ||||
| # CONFIG_HAVE_IOREMAP_PROT is not set | ||||
| CONFIG_HAVE_KPROBES=y | ||||
| CONFIG_HAVE_KRETPROBES=y | ||||
| # CONFIG_HAVE_ARCH_TRACEHOOK is not set | ||||
| # CONFIG_HAVE_DMA_ATTRS is not set | ||||
| # CONFIG_USE_GENERIC_SMP_HELPERS is not set | ||||
| # CONFIG_HAVE_CLK is not set | ||||
| CONFIG_PROC_PAGE_MONITOR=y | ||||
| # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||||
| CONFIG_SLABINFO=y | ||||
| CONFIG_RT_MUTEXES=y | ||||
| # CONFIG_TINY_SHMEM is not set | ||||
| @ -113,6 +118,7 @@ CONFIG_STOP_MACHINE=y | ||||
| CONFIG_BLOCK=y | ||||
| # CONFIG_BLK_DEV_IO_TRACE is not set | ||||
| CONFIG_BLK_DEV_BSG=y | ||||
| # CONFIG_BLK_DEV_INTEGRITY is not set | ||||
| CONFIG_BLOCK_COMPAT=y | ||||
| 
 | ||||
| # | ||||
| @ -175,6 +181,8 @@ CONFIG_PREEMPT=y | ||||
| CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||||
| CONFIG_ARCH_SPARSEMEM_DEFAULT=y | ||||
| CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||||
| CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||||
| CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||||
| CONFIG_SELECT_MEMORY_MODEL=y | ||||
| # CONFIG_FLATMEM_MANUAL is not set | ||||
| # CONFIG_DISCONTIGMEM_MANUAL is not set | ||||
| @ -185,8 +193,12 @@ CONFIG_HAVE_MEMORY_PRESENT=y | ||||
| CONFIG_SPARSEMEM_EXTREME=y | ||||
| CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y | ||||
| CONFIG_SPARSEMEM_VMEMMAP=y | ||||
| CONFIG_MEMORY_HOTPLUG=y | ||||
| CONFIG_MEMORY_HOTPLUG_SPARSE=y | ||||
| CONFIG_MEMORY_HOTREMOVE=y | ||||
| CONFIG_PAGEFLAGS_EXTENDED=y | ||||
| CONFIG_SPLIT_PTLOCK_CPUS=4 | ||||
| CONFIG_MIGRATION=y | ||||
| CONFIG_RESOURCES_64BIT=y | ||||
| CONFIG_ZONE_DMA_FLAG=1 | ||||
| CONFIG_BOUNCE=y | ||||
| @ -198,6 +210,7 @@ CONFIG_VIRT_TO_BUS=y | ||||
| CONFIG_MACHCHK_WARNING=y | ||||
| CONFIG_QDIO=y | ||||
| # CONFIG_QDIO_DEBUG is not set | ||||
| CONFIG_CHSC_SCH=m | ||||
| 
 | ||||
| # | ||||
| # Misc | ||||
| @ -206,6 +219,7 @@ CONFIG_IPL=y | ||||
| # CONFIG_IPL_TAPE is not set | ||||
| CONFIG_IPL_VM=y | ||||
| CONFIG_BINFMT_ELF=y | ||||
| CONFIG_COMPAT_BINFMT_ELF=y | ||||
| CONFIG_BINFMT_MISC=m | ||||
| CONFIG_FORCE_MAX_ZONEORDER=9 | ||||
| # CONFIG_PROCESS_DEBUG is not set | ||||
| @ -226,10 +240,6 @@ CONFIG_S390_HYPFS_FS=y | ||||
| CONFIG_KEXEC=y | ||||
| # CONFIG_ZFCPDUMP is not set | ||||
| CONFIG_S390_GUEST=y | ||||
| 
 | ||||
| # | ||||
| # Networking | ||||
| # | ||||
| CONFIG_NET=y | ||||
| 
 | ||||
| # | ||||
| @ -364,7 +374,6 @@ CONFIG_NET_SCH_CBQ=m | ||||
| # CONFIG_NET_SCH_HTB is not set | ||||
| # CONFIG_NET_SCH_HFSC is not set | ||||
| CONFIG_NET_SCH_PRIO=m | ||||
| CONFIG_NET_SCH_RR=m | ||||
| CONFIG_NET_SCH_RED=m | ||||
| CONFIG_NET_SCH_SFQ=m | ||||
| CONFIG_NET_SCH_TEQL=m | ||||
| @ -430,7 +439,9 @@ CONFIG_CCW=y | ||||
| CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||||
| CONFIG_STANDALONE=y | ||||
| CONFIG_PREVENT_FIRMWARE_BUILD=y | ||||
| # CONFIG_FW_LOADER is not set | ||||
| CONFIG_FW_LOADER=y | ||||
| # CONFIG_FIRMWARE_IN_KERNEL is not set | ||||
| CONFIG_EXTRA_FIRMWARE="" | ||||
| # CONFIG_DEBUG_DRIVER is not set | ||||
| # CONFIG_DEBUG_DEVRES is not set | ||||
| CONFIG_SYS_HYPERVISOR=y | ||||
| @ -507,6 +518,11 @@ CONFIG_SCSI_LOWLEVEL=y | ||||
| # CONFIG_ISCSI_TCP is not set | ||||
| # CONFIG_SCSI_DEBUG is not set | ||||
| CONFIG_ZFCP=y | ||||
| CONFIG_SCSI_DH=m | ||||
| CONFIG_SCSI_DH_RDAC=m | ||||
| CONFIG_SCSI_DH_HP_SW=m | ||||
| CONFIG_SCSI_DH_EMC=m | ||||
| CONFIG_SCSI_DH_ALUA=m | ||||
| CONFIG_MD=y | ||||
| CONFIG_BLK_DEV_MD=y | ||||
| CONFIG_MD_LINEAR=m | ||||
| @ -522,14 +538,10 @@ CONFIG_DM_CRYPT=y | ||||
| CONFIG_DM_SNAPSHOT=y | ||||
| CONFIG_DM_MIRROR=y | ||||
| CONFIG_DM_ZERO=y | ||||
| CONFIG_DM_MULTIPATH=y | ||||
| # CONFIG_DM_MULTIPATH_EMC is not set | ||||
| # CONFIG_DM_MULTIPATH_RDAC is not set | ||||
| # CONFIG_DM_MULTIPATH_HP is not set | ||||
| CONFIG_DM_MULTIPATH=m | ||||
| # CONFIG_DM_DELAY is not set | ||||
| # CONFIG_DM_UEVENT is not set | ||||
| CONFIG_NETDEVICES=y | ||||
| # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||||
| # CONFIG_IFB is not set | ||||
| CONFIG_DUMMY=m | ||||
| CONFIG_BONDING=m | ||||
| @ -544,7 +556,6 @@ CONFIG_NET_ETHERNET=y | ||||
| # CONFIG_IBM_NEW_EMAC_TAH is not set | ||||
| # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||||
| CONFIG_NETDEV_1000=y | ||||
| # CONFIG_E1000E_ENABLED is not set | ||||
| CONFIG_NETDEV_10000=y | ||||
| # CONFIG_TR is not set | ||||
| # CONFIG_WAN is not set | ||||
| @ -576,7 +587,10 @@ CONFIG_DEVKMEM=y | ||||
| CONFIG_UNIX98_PTYS=y | ||||
| CONFIG_LEGACY_PTYS=y | ||||
| CONFIG_LEGACY_PTY_COUNT=256 | ||||
| CONFIG_HVC_DRIVER=y | ||||
| CONFIG_VIRTIO_CONSOLE=y | ||||
| CONFIG_HW_RANDOM=m | ||||
| CONFIG_HW_RANDOM_VIRTIO=m | ||||
| # CONFIG_R3964 is not set | ||||
| CONFIG_RAW_DRIVER=m | ||||
| CONFIG_MAX_RAW_DEVS=256 | ||||
| @ -616,6 +630,7 @@ CONFIG_MONWRITER=m | ||||
| CONFIG_S390_VMUR=m | ||||
| # CONFIG_POWER_SUPPLY is not set | ||||
| # CONFIG_THERMAL is not set | ||||
| # CONFIG_THERMAL_HWMON is not set | ||||
| # CONFIG_WATCHDOG is not set | ||||
| 
 | ||||
| # | ||||
| @ -693,6 +708,7 @@ CONFIG_CONFIGFS_FS=m | ||||
| # CONFIG_CRAMFS is not set | ||||
| # CONFIG_VXFS_FS is not set | ||||
| # CONFIG_MINIX_FS is not set | ||||
| # CONFIG_OMFS_FS is not set | ||||
| # CONFIG_HPFS_FS is not set | ||||
| # CONFIG_QNX4FS_FS is not set | ||||
| # CONFIG_ROMFS_FS is not set | ||||
| @ -712,7 +728,6 @@ CONFIG_LOCKD_V4=y | ||||
| CONFIG_EXPORTFS=y | ||||
| CONFIG_NFS_COMMON=y | ||||
| CONFIG_SUNRPC=y | ||||
| # CONFIG_SUNRPC_BIND34 is not set | ||||
| # CONFIG_RPCSEC_GSS_KRB5 is not set | ||||
| # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||||
| # CONFIG_SMB_FS is not set | ||||
| @ -780,6 +795,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | ||||
| # CONFIG_DEBUG_INFO is not set | ||||
| # CONFIG_DEBUG_VM is not set | ||||
| # CONFIG_DEBUG_WRITECOUNT is not set | ||||
| CONFIG_DEBUG_MEMORY_INIT=y | ||||
| # CONFIG_DEBUG_LIST is not set | ||||
| # CONFIG_DEBUG_SG is not set | ||||
| # CONFIG_FRAME_POINTER is not set | ||||
| @ -789,6 +805,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | ||||
| # CONFIG_LKDTM is not set | ||||
| # CONFIG_FAULT_INJECTION is not set | ||||
| # CONFIG_LATENCYTOP is not set | ||||
| CONFIG_SYSCTL_SYSCALL_CHECK=y | ||||
| CONFIG_SAMPLES=y | ||||
| # CONFIG_SAMPLE_KOBJECT is not set | ||||
| # CONFIG_SAMPLE_KPROBES is not set | ||||
| @ -847,6 +864,10 @@ CONFIG_CRYPTO_HMAC=m | ||||
| # CONFIG_CRYPTO_MD4 is not set | ||||
| CONFIG_CRYPTO_MD5=m | ||||
| # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||||
| CONFIG_CRYPTO_RMD128=m | ||||
| CONFIG_CRYPTO_RMD160=m | ||||
| CONFIG_CRYPTO_RMD256=m | ||||
| CONFIG_CRYPTO_RMD320=m | ||||
| CONFIG_CRYPTO_SHA1=m | ||||
| # CONFIG_CRYPTO_SHA256 is not set | ||||
| # CONFIG_CRYPTO_SHA512 is not set | ||||
| @ -895,6 +916,7 @@ CONFIG_BITREVERSE=m | ||||
| # CONFIG_GENERIC_FIND_NEXT_BIT is not set | ||||
| # CONFIG_CRC_CCITT is not set | ||||
| # CONFIG_CRC16 is not set | ||||
| CONFIG_CRC_T10DIF=y | ||||
| # CONFIG_CRC_ITU_T is not set | ||||
| CONFIG_CRC32=m | ||||
| CONFIG_CRC7=m | ||||
|  | ||||
| @ -709,7 +709,7 @@ static inline int find_next_zero_bit (const unsigned long * addr, | ||||
| 		 * __ffz_word returns __BITOPS_WORDSIZE | ||||
| 		 * if no zero bit is present in the word. | ||||
| 		 */ | ||||
| 		set = __ffz_word(0, *p >> bit) + bit; | ||||
| 		set = __ffz_word(bit, *p >> bit); | ||||
| 		if (set >= size) | ||||
| 			return size + offset; | ||||
| 		if (set < __BITOPS_WORDSIZE) | ||||
| @ -824,7 +824,7 @@ static inline int ext2_find_next_zero_bit(void *vaddr, unsigned long size, | ||||
| 		 * s390 version of ffz returns __BITOPS_WORDSIZE | ||||
| 		 * if no zero bit is present in the word. | ||||
| 		 */ | ||||
| 		set = ffz(__load_ulong_le(p, 0) >> bit) + bit; | ||||
| 		set = __ffz_word(bit, __load_ulong_le(p, 0) >> bit); | ||||
| 		if (set >= size) | ||||
| 			return size + offset; | ||||
| 		if (set < __BITOPS_WORDSIZE) | ||||
| @ -865,7 +865,7 @@ static inline int ext2_find_next_bit(void *vaddr, unsigned long size, | ||||
| 		 * s390 version of ffz returns __BITOPS_WORDSIZE | ||||
| 		 * if no zero bit is present in the word. | ||||
| 		 */ | ||||
| 		set = ffs(__load_ulong_le(p, 0) >> bit) + bit; | ||||
| 		set = __ffs_word(0, __load_ulong_le(p, 0) & (~0UL << bit)); | ||||
| 		if (set >= size) | ||||
| 			return size + offset; | ||||
| 		if (set < __BITOPS_WORDSIZE) | ||||
|  | ||||
| @ -75,7 +75,9 @@ unsigned long thread_saved_pc(struct task_struct *tsk) | ||||
| 	return sf->gprs[8]; | ||||
| } | ||||
| 
 | ||||
| DEFINE_PER_CPU(struct s390_idle_data, s390_idle); | ||||
| DEFINE_PER_CPU(struct s390_idle_data, s390_idle) = { | ||||
| 	.lock = __SPIN_LOCK_UNLOCKED(s390_idle.lock) | ||||
| }; | ||||
| 
 | ||||
| static int s390_idle_enter(void) | ||||
| { | ||||
|  | ||||
| @ -610,7 +610,6 @@ static void __init smp_create_idle(unsigned int cpu) | ||||
| 	if (IS_ERR(p)) | ||||
| 		panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p)); | ||||
| 	current_set[cpu] = p; | ||||
| 	spin_lock_init(&(&per_cpu(s390_idle, cpu))->lock); | ||||
| } | ||||
| 
 | ||||
| static int __cpuinit smp_alloc_lowcore(int cpu) | ||||
| @ -845,7 +844,6 @@ void __init smp_prepare_boot_cpu(void) | ||||
| 	current_set[0] = current; | ||||
| 	smp_cpu_state[0] = CPU_STATE_CONFIGURED; | ||||
| 	smp_cpu_polarization[0] = POLARIZATION_UNKNWN; | ||||
| 	spin_lock_init(&(&__get_cpu_var(s390_idle))->lock); | ||||
| } | ||||
| 
 | ||||
| void __init smp_cpus_done(unsigned int max_cpus) | ||||
|  | ||||
| @ -140,6 +140,10 @@ static struct sh_mobile_lcdc_info lcdc_info = { | ||||
| 			.vsync_len = 1, | ||||
| 			.sync = 0, /* hsync and vsync are active low */ | ||||
| 		}, | ||||
| 		.lcd_size_cfg = { /* 7.0 inch */ | ||||
| 			.width = 152, | ||||
| 			.height = 91, | ||||
| 		}, | ||||
| 		.board_cfg = { | ||||
| 			.display_on = ap320_wvga_power_on, | ||||
| 		}, | ||||
|  | ||||
| @ -224,6 +224,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = { | ||||
| 			.vsync_len = 2, | ||||
| 			.sync = 0, | ||||
| 		}, | ||||
| 		.lcd_size_cfg = { /* 7.0 inch */ | ||||
| 			.width = 152, | ||||
| 			.height = 91, | ||||
| 		}, | ||||
| 	} | ||||
| #endif | ||||
| #ifdef CONFIG_SH_MIGOR_QVGA | ||||
| @ -245,6 +249,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = { | ||||
| 			.vsync_len = 2, | ||||
| 			.sync = FB_SYNC_HOR_HIGH_ACT, | ||||
| 		}, | ||||
| 		.lcd_size_cfg = { /* 2.4 inch */ | ||||
| 			.width = 49, | ||||
| 			.height = 37, | ||||
| 		}, | ||||
| 		.board_cfg = { | ||||
| 			.setup_sys = migor_lcd_qvga_setup, | ||||
| 		}, | ||||
|  | ||||
| @ -15,8 +15,11 @@ | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/input.h> | ||||
| #include <linux/mtd/physmap.h> | ||||
| #include <asm/io.h> | ||||
| #include <linux/fb.h> | ||||
| #include <linux/io.h> | ||||
| #include <asm/sh7763rdp.h> | ||||
| #include <asm/sh_eth.h> | ||||
| #include <asm/sh7760fb.h> | ||||
| 
 | ||||
| /* NOR Flash */ | ||||
| static struct mtd_partition sh7763rdp_nor_flash_partitions[] = { | ||||
| @ -60,8 +63,85 @@ static struct platform_device sh7763rdp_nor_flash_device = { | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| /* SH-Ether */ | ||||
| static struct resource sh_eth_resources[] = { | ||||
| 	{ | ||||
| 		.start  = 0xFEE00800,   /* use eth1 */ | ||||
| 		.end    = 0xFEE00F7C - 1, | ||||
| 		.flags  = IORESOURCE_MEM, | ||||
| 	}, { | ||||
| 		.start  = 58,   /* irq number */ | ||||
| 		.end    = 58, | ||||
| 		.flags  = IORESOURCE_IRQ, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct sh_eth_plat_data sh7763_eth_pdata = { | ||||
| 	.phy = 1, | ||||
| 	.edmac_endian = EDMAC_LITTLE_ENDIAN, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device sh7763rdp_eth_device = { | ||||
| 	.name       = "sh-eth", | ||||
| 	.resource   = sh_eth_resources, | ||||
| 	.num_resources  = ARRAY_SIZE(sh_eth_resources), | ||||
| 	.dev        = { | ||||
| 		.platform_data = &sh7763_eth_pdata, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| /* SH7763 LCDC */ | ||||
| static struct resource sh7763rdp_fb_resources[] = { | ||||
| 	{ | ||||
| 		.start  = 0xFFE80000, | ||||
| 		.end    = 0xFFE80442 - 1, | ||||
| 		.flags  = IORESOURCE_MEM, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct fb_videomode sh7763fb_videomode = { | ||||
| 	.refresh = 60, | ||||
| 	.name = "VGA Monitor", | ||||
| 	.xres = 640, | ||||
| 	.yres = 480, | ||||
| 	.pixclock = 10000, | ||||
| 	.left_margin = 80, | ||||
| 	.right_margin = 24, | ||||
| 	.upper_margin = 30, | ||||
| 	.lower_margin = 1, | ||||
| 	.hsync_len = 96, | ||||
| 	.vsync_len = 1, | ||||
| 	.sync = 0, | ||||
| 	.vmode = FB_VMODE_NONINTERLACED, | ||||
| 	.flag = FBINFO_FLAG_DEFAULT, | ||||
| }; | ||||
| 
 | ||||
| static struct sh7760fb_platdata sh7763fb_def_pdata = { | ||||
| 	.def_mode = &sh7763fb_videomode, | ||||
| 	.ldmtr = (LDMTR_TFT_COLOR_16|LDMTR_MCNT), | ||||
| 	.lddfr = LDDFR_16BPP_RGB565, | ||||
| 	.ldpmmr = 0x0000, | ||||
| 	.ldpspr = 0xFFFF, | ||||
| 	.ldaclnr = 0x0001, | ||||
| 	.ldickr = 0x1102, | ||||
| 	.rotate = 0, | ||||
| 	.novsync = 0, | ||||
| 	.blank = NULL, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device sh7763rdp_fb_device = { | ||||
| 	.name		= "sh7760-lcdc", | ||||
| 	.resource	= sh7763rdp_fb_resources, | ||||
| 	.num_resources = ARRAY_SIZE(sh7763rdp_fb_resources), | ||||
| 	.dev = { | ||||
| 		.platform_data = &sh7763fb_def_pdata, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device *sh7763rdp_devices[] __initdata = { | ||||
| 	&sh7763rdp_nor_flash_device, | ||||
| 	&sh7763rdp_eth_device, | ||||
| 	&sh7763rdp_fb_device, | ||||
| }; | ||||
| 
 | ||||
| static int __init sh7763rdp_devices_setup(void) | ||||
| @ -69,7 +149,7 @@ static int __init sh7763rdp_devices_setup(void) | ||||
| 	return platform_add_devices(sh7763rdp_devices, | ||||
| 				    ARRAY_SIZE(sh7763rdp_devices)); | ||||
| } | ||||
| __initcall(sh7763rdp_devices_setup); | ||||
| device_initcall(sh7763rdp_devices_setup); | ||||
| 
 | ||||
| static void __init sh7763rdp_setup(char **cmdline_p) | ||||
| { | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
|  * | ||||
|  * Renesas SH-X3 Prototype Board Support. | ||||
|  * | ||||
|  * Copyright (C) 2007 Paul Mundt | ||||
|  * Copyright (C) 2007 - 2008 Paul Mundt | ||||
|  * | ||||
|  * This file is subject to the terms and conditions of the GNU General Public | ||||
|  * License.  See the file "COPYING" in the main directory of this archive | ||||
| @ -13,6 +13,7 @@ | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/io.h> | ||||
| #include <linux/smc91x.h> | ||||
| #include <asm/ilsel.h> | ||||
| 
 | ||||
| static struct resource heartbeat_resources[] = { | ||||
| @ -30,6 +31,10 @@ static struct platform_device heartbeat_device = { | ||||
| 	.resource	= heartbeat_resources, | ||||
| }; | ||||
| 
 | ||||
| static struct smc91x_platdata smc91x_info = { | ||||
| 	.flags	= SMC91X_USE_16BIT | SMC91X_NOWAIT, | ||||
| }; | ||||
| 
 | ||||
| static struct resource smc91x_resources[] = { | ||||
| 	[0] = { | ||||
| 		.start		= 0x18000300, | ||||
| @ -47,6 +52,9 @@ static struct platform_device smc91x_device = { | ||||
| 	.id		= -1, | ||||
| 	.resource	= smc91x_resources, | ||||
| 	.num_resources	= ARRAY_SIZE(smc91x_resources), | ||||
| 	.dev	= { | ||||
| 		.platform_data = &smc91x_info, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct resource r8a66597_usb_host_resources[] = { | ||||
|  | ||||
| @ -1,15 +1,17 @@ | ||||
| # | ||||
| # Automatically generated make config: don't edit | ||||
| # Linux kernel version: 2.6.26-rc4 | ||||
| # Fri Jun  6 12:20:17 2008 | ||||
| # Linux kernel version: 2.6.27-rc2 | ||||
| # Fri Aug  8 13:44:20 2008 | ||||
| # | ||||
| CONFIG_SUPERH=y | ||||
| CONFIG_SUPERH32=y | ||||
| CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig" | ||||
| CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||||
| CONFIG_GENERIC_BUG=y | ||||
| CONFIG_GENERIC_FIND_NEXT_BIT=y | ||||
| CONFIG_GENERIC_HWEIGHT=y | ||||
| CONFIG_GENERIC_HARDIRQS=y | ||||
| CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||||
| CONFIG_GENERIC_IRQ_PROBE=y | ||||
| CONFIG_GENERIC_CALIBRATE_DELAY=y | ||||
| CONFIG_GENERIC_TIME=y | ||||
| @ -19,7 +21,6 @@ CONFIG_LOCKDEP_SUPPORT=y | ||||
| # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||||
| # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||||
| CONFIG_ARCH_NO_VIRT_TO_BUS=y | ||||
| CONFIG_ARCH_SUPPORTS_AOUT=y | ||||
| CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||||
| 
 | ||||
| # | ||||
| @ -83,10 +84,16 @@ CONFIG_PROFILING=y | ||||
| # CONFIG_MARKERS is not set | ||||
| CONFIG_OPROFILE=y | ||||
| CONFIG_HAVE_OPROFILE=y | ||||
| # CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set | ||||
| # CONFIG_HAVE_IOREMAP_PROT is not set | ||||
| # CONFIG_HAVE_KPROBES is not set | ||||
| # CONFIG_HAVE_KRETPROBES is not set | ||||
| # CONFIG_HAVE_ARCH_TRACEHOOK is not set | ||||
| # CONFIG_HAVE_DMA_ATTRS is not set | ||||
| # CONFIG_USE_GENERIC_SMP_HELPERS is not set | ||||
| CONFIG_HAVE_CLK=y | ||||
| CONFIG_PROC_PAGE_MONITOR=y | ||||
| CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||||
| CONFIG_SLABINFO=y | ||||
| CONFIG_RT_MUTEXES=y | ||||
| # CONFIG_TINY_SHMEM is not set | ||||
| @ -96,12 +103,13 @@ CONFIG_MODULES=y | ||||
| # CONFIG_MODULE_UNLOAD is not set | ||||
| # CONFIG_MODVERSIONS is not set | ||||
| # CONFIG_MODULE_SRCVERSION_ALL is not set | ||||
| # CONFIG_KMOD is not set | ||||
| CONFIG_KMOD=y | ||||
| CONFIG_BLOCK=y | ||||
| # CONFIG_LBD is not set | ||||
| # CONFIG_BLK_DEV_IO_TRACE is not set | ||||
| # CONFIG_LSF is not set | ||||
| # CONFIG_BLK_DEV_BSG is not set | ||||
| # CONFIG_BLK_DEV_INTEGRITY is not set | ||||
| 
 | ||||
| # | ||||
| # IO Schedulers | ||||
| @ -177,6 +185,7 @@ CONFIG_PAGE_SIZE_4KB=y | ||||
| # CONFIG_PAGE_SIZE_8KB is not set | ||||
| # CONFIG_PAGE_SIZE_16KB is not set | ||||
| # CONFIG_PAGE_SIZE_64KB is not set | ||||
| CONFIG_ENTRY_OFFSET=0x00001000 | ||||
| CONFIG_SELECT_MEMORY_MODEL=y | ||||
| # CONFIG_FLATMEM_MANUAL is not set | ||||
| # CONFIG_DISCONTIGMEM_MANUAL is not set | ||||
| @ -258,6 +267,7 @@ CONFIG_HZ=250 | ||||
| # CONFIG_SCHED_HRTICK is not set | ||||
| # CONFIG_KEXEC is not set | ||||
| # CONFIG_CRASH_DUMP is not set | ||||
| CONFIG_SECCOMP=y | ||||
| CONFIG_PREEMPT_NONE=y | ||||
| # CONFIG_PREEMPT_VOLUNTARY is not set | ||||
| # CONFIG_PREEMPT is not set | ||||
| @ -282,10 +292,6 @@ CONFIG_CMDLINE="console=ttySC2,115200 root=/dev/sda1 rootdelay=10" | ||||
| # | ||||
| CONFIG_BINFMT_ELF=y | ||||
| # CONFIG_BINFMT_MISC is not set | ||||
| 
 | ||||
| # | ||||
| # Networking | ||||
| # | ||||
| CONFIG_NET=y | ||||
| 
 | ||||
| # | ||||
| @ -361,6 +367,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | ||||
| # | ||||
| # CONFIG_CFG80211 is not set | ||||
| CONFIG_WIRELESS_EXT=y | ||||
| CONFIG_WIRELESS_EXT_SYSFS=y | ||||
| # CONFIG_MAC80211 is not set | ||||
| # CONFIG_IEEE80211 is not set | ||||
| # CONFIG_RFKILL is not set | ||||
| @ -377,6 +384,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||||
| CONFIG_STANDALONE=y | ||||
| CONFIG_PREVENT_FIRMWARE_BUILD=y | ||||
| CONFIG_FW_LOADER=y | ||||
| CONFIG_FIRMWARE_IN_KERNEL=y | ||||
| CONFIG_EXTRA_FIRMWARE="" | ||||
| # CONFIG_SYS_HYPERVISOR is not set | ||||
| # CONFIG_CONNECTOR is not set | ||||
| CONFIG_MTD=y | ||||
| @ -471,6 +480,7 @@ CONFIG_BLK_DEV=y | ||||
| # CONFIG_BLK_DEV_RAM is not set | ||||
| # CONFIG_CDROM_PKTCDVD is not set | ||||
| # CONFIG_ATA_OVER_ETH is not set | ||||
| # CONFIG_BLK_DEV_HD is not set | ||||
| # CONFIG_MISC_DEVICES is not set | ||||
| CONFIG_HAVE_IDE=y | ||||
| # CONFIG_IDE is not set | ||||
| @ -515,10 +525,10 @@ CONFIG_SCSI_WAIT_SCAN=m | ||||
| CONFIG_SCSI_LOWLEVEL=y | ||||
| # CONFIG_ISCSI_TCP is not set | ||||
| # CONFIG_SCSI_DEBUG is not set | ||||
| # CONFIG_SCSI_DH is not set | ||||
| # CONFIG_ATA is not set | ||||
| # CONFIG_MD is not set | ||||
| CONFIG_NETDEVICES=y | ||||
| # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||||
| # CONFIG_DUMMY is not set | ||||
| # CONFIG_BONDING is not set | ||||
| # CONFIG_MACVLAN is not set | ||||
| @ -546,7 +556,9 @@ CONFIG_NET_ETHERNET=y | ||||
| CONFIG_MII=y | ||||
| # CONFIG_AX88796 is not set | ||||
| # CONFIG_STNIC is not set | ||||
| CONFIG_SH_ETH=y | ||||
| # CONFIG_SMC91X is not set | ||||
| # CONFIG_SMC911X is not set | ||||
| # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||||
| # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||||
| # CONFIG_IBM_NEW_EMAC_TAH is not set | ||||
| @ -613,7 +625,11 @@ CONFIG_INPUT=y | ||||
| # | ||||
| # Character devices | ||||
| # | ||||
| # CONFIG_VT is not set | ||||
| CONFIG_VT=y | ||||
| CONFIG_CONSOLE_TRANSLATIONS=y | ||||
| CONFIG_VT_CONSOLE=y | ||||
| CONFIG_HW_CONSOLE=y | ||||
| # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||||
| CONFIG_DEVKMEM=y | ||||
| # CONFIG_SERIAL_NONSTANDARD is not set | ||||
| 
 | ||||
| @ -644,6 +660,7 @@ CONFIG_HW_RANDOM=y | ||||
| # CONFIG_POWER_SUPPLY is not set | ||||
| # CONFIG_HWMON is not set | ||||
| # CONFIG_THERMAL is not set | ||||
| # CONFIG_THERMAL_HWMON is not set | ||||
| # CONFIG_WATCHDOG is not set | ||||
| 
 | ||||
| # | ||||
| @ -655,6 +672,7 @@ CONFIG_SSB_POSSIBLE=y | ||||
| # | ||||
| # Multifunction device drivers | ||||
| # | ||||
| # CONFIG_MFD_CORE is not set | ||||
| # CONFIG_MFD_SM501 is not set | ||||
| # CONFIG_HTC_PASIC3 is not set | ||||
| 
 | ||||
| @ -679,7 +697,34 @@ CONFIG_SSB_POSSIBLE=y | ||||
| # | ||||
| # CONFIG_VGASTATE is not set | ||||
| # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||||
| # CONFIG_FB is not set | ||||
| CONFIG_FB=y | ||||
| # CONFIG_FIRMWARE_EDID is not set | ||||
| # CONFIG_FB_DDC is not set | ||||
| CONFIG_FB_CFB_FILLRECT=y | ||||
| CONFIG_FB_CFB_COPYAREA=y | ||||
| CONFIG_FB_CFB_IMAGEBLIT=y | ||||
| # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||||
| # CONFIG_FB_SYS_FILLRECT is not set | ||||
| # CONFIG_FB_SYS_COPYAREA is not set | ||||
| # CONFIG_FB_SYS_IMAGEBLIT is not set | ||||
| CONFIG_FB_FOREIGN_ENDIAN=y | ||||
| CONFIG_FB_BOTH_ENDIAN=y | ||||
| # CONFIG_FB_BIG_ENDIAN is not set | ||||
| # CONFIG_FB_LITTLE_ENDIAN is not set | ||||
| # CONFIG_FB_SYS_FOPS is not set | ||||
| # CONFIG_FB_SVGALIB is not set | ||||
| # CONFIG_FB_MACMODES is not set | ||||
| # CONFIG_FB_BACKLIGHT is not set | ||||
| # CONFIG_FB_MODE_HELPERS is not set | ||||
| # CONFIG_FB_TILEBLITTING is not set | ||||
| 
 | ||||
| # | ||||
| # Frame buffer hardware drivers | ||||
| # | ||||
| # CONFIG_FB_S1D13XXX is not set | ||||
| # CONFIG_FB_SH_MOBILE_LCDC is not set | ||||
| CONFIG_FB_SH7760=y | ||||
| # CONFIG_FB_VIRTUAL is not set | ||||
| # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||||
| 
 | ||||
| # | ||||
| @ -688,8 +733,22 @@ CONFIG_SSB_POSSIBLE=y | ||||
| # CONFIG_DISPLAY_SUPPORT is not set | ||||
| 
 | ||||
| # | ||||
| # Sound | ||||
| # Console display driver support | ||||
| # | ||||
| CONFIG_DUMMY_CONSOLE=y | ||||
| CONFIG_FRAMEBUFFER_CONSOLE=y | ||||
| # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||||
| # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||||
| # CONFIG_FONTS is not set | ||||
| CONFIG_FONT_8x8=y | ||||
| CONFIG_FONT_8x16=y | ||||
| CONFIG_LOGO=y | ||||
| CONFIG_LOGO_LINUX_MONO=y | ||||
| CONFIG_LOGO_LINUX_VGA16=y | ||||
| CONFIG_LOGO_LINUX_CLUT224=y | ||||
| CONFIG_LOGO_SUPERH_MONO=y | ||||
| CONFIG_LOGO_SUPERH_VGA16=y | ||||
| CONFIG_LOGO_SUPERH_CLUT224=y | ||||
| # CONFIG_SOUND is not set | ||||
| # CONFIG_HID_SUPPORT is not set | ||||
| CONFIG_USB_SUPPORT=y | ||||
| @ -788,11 +847,27 @@ CONFIG_USB_MON=y | ||||
| # CONFIG_USB_IOWARRIOR is not set | ||||
| # CONFIG_USB_ISIGHTFW is not set | ||||
| # CONFIG_USB_GADGET is not set | ||||
| # CONFIG_MMC is not set | ||||
| CONFIG_MMC=y | ||||
| # CONFIG_MMC_DEBUG is not set | ||||
| # CONFIG_MMC_UNSAFE_RESUME is not set | ||||
| 
 | ||||
| # | ||||
| # MMC/SD Card Drivers | ||||
| # | ||||
| CONFIG_MMC_BLOCK=y | ||||
| CONFIG_MMC_BLOCK_BOUNCE=y | ||||
| # CONFIG_SDIO_UART is not set | ||||
| # CONFIG_MMC_TEST is not set | ||||
| 
 | ||||
| # | ||||
| # MMC/SD Host Controller Drivers | ||||
| # | ||||
| # CONFIG_MMC_SDHCI is not set | ||||
| # CONFIG_MEMSTICK is not set | ||||
| # CONFIG_NEW_LEDS is not set | ||||
| # CONFIG_ACCESSIBILITY is not set | ||||
| # CONFIG_RTC_CLASS is not set | ||||
| # CONFIG_DMADEVICES is not set | ||||
| # CONFIG_UIO is not set | ||||
| 
 | ||||
| # | ||||
| @ -865,6 +940,7 @@ CONFIG_TMPFS_POSIX_ACL=y | ||||
| # CONFIG_CRAMFS is not set | ||||
| # CONFIG_VXFS_FS is not set | ||||
| # CONFIG_MINIX_FS is not set | ||||
| # CONFIG_OMFS_FS is not set | ||||
| # CONFIG_HPFS_FS is not set | ||||
| # CONFIG_QNX4FS_FS is not set | ||||
| # CONFIG_ROMFS_FS is not set | ||||
| @ -874,12 +950,11 @@ CONFIG_NETWORK_FILESYSTEMS=y | ||||
| CONFIG_NFS_FS=y | ||||
| # CONFIG_NFS_V3 is not set | ||||
| # CONFIG_NFS_V4 is not set | ||||
| # CONFIG_NFSD is not set | ||||
| CONFIG_ROOT_NFS=y | ||||
| # CONFIG_NFSD is not set | ||||
| CONFIG_LOCKD=y | ||||
| CONFIG_NFS_COMMON=y | ||||
| CONFIG_SUNRPC=y | ||||
| # CONFIG_SUNRPC_BIND34 is not set | ||||
| # CONFIG_RPCSEC_GSS_KRB5 is not set | ||||
| # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||||
| # CONFIG_SMB_FS is not set | ||||
| @ -949,6 +1024,7 @@ CONFIG_FRAME_WARN=1024 | ||||
| # CONFIG_HEADERS_CHECK is not set | ||||
| # CONFIG_DEBUG_KERNEL is not set | ||||
| # CONFIG_DEBUG_BUGVERBOSE is not set | ||||
| # CONFIG_DEBUG_MEMORY_INIT is not set | ||||
| # CONFIG_SAMPLES is not set | ||||
| # CONFIG_SH_STANDARD_BIOS is not set | ||||
| # CONFIG_EARLY_SCIF_CONSOLE is not set | ||||
| @ -1003,6 +1079,10 @@ CONFIG_CRYPTO=y | ||||
| # CONFIG_CRYPTO_MD4 is not set | ||||
| # CONFIG_CRYPTO_MD5 is not set | ||||
| # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||||
| # CONFIG_CRYPTO_RMD128 is not set | ||||
| # CONFIG_CRYPTO_RMD160 is not set | ||||
| # CONFIG_CRYPTO_RMD256 is not set | ||||
| # CONFIG_CRYPTO_RMD320 is not set | ||||
| # CONFIG_CRYPTO_SHA1 is not set | ||||
| # CONFIG_CRYPTO_SHA256 is not set | ||||
| # CONFIG_CRYPTO_SHA512 is not set | ||||
| @ -1042,6 +1122,7 @@ CONFIG_BITREVERSE=y | ||||
| # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||||
| # CONFIG_CRC_CCITT is not set | ||||
| # CONFIG_CRC16 is not set | ||||
| CONFIG_CRC_T10DIF=y | ||||
| # CONFIG_CRC_ITU_T is not set | ||||
| CONFIG_CRC32=y | ||||
| # CONFIG_CRC7 is not set | ||||
|  | ||||
| @ -21,4 +21,11 @@ | ||||
| #define	flat_get_relocate_addr(rel)		(rel) | ||||
| #define	flat_set_persistent(relval, p)		({ (void)p; 0; }) | ||||
| 
 | ||||
| #define FLAT_PLAT_INIT(_r) \ | ||||
|   do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \ | ||||
|        _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \ | ||||
|        _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \ | ||||
|        _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \ | ||||
|        _r->sr = SR_FD; } while (0) | ||||
| 
 | ||||
| #endif /* __ASM_SH_FLAT_H */ | ||||
|  | ||||
| @ -42,9 +42,6 @@ | ||||
| 
 | ||||
| #define PORT_MSELCRB 0xa4050182 | ||||
| 
 | ||||
| #define MSTPCR1 0xa4150034 | ||||
| #define MSTPCR2 0xa4150038 | ||||
| 
 | ||||
| #define PORT_PSELA 0xa405014e | ||||
| #define PORT_PSELB 0xa4050150 | ||||
| #define PORT_PSELC 0xa4050152 | ||||
|  | ||||
| @ -47,12 +47,18 @@ struct sh_mobile_lcdc_board_cfg { | ||||
| 	void (*display_off)(void *board_data); | ||||
| }; | ||||
| 
 | ||||
| struct sh_mobile_lcdc_lcd_size_cfg { /* width and height of panel in mm */ | ||||
| 	unsigned long width; | ||||
| 	unsigned long height; | ||||
| }; | ||||
| 
 | ||||
| struct sh_mobile_lcdc_chan_cfg { | ||||
| 	int chan; | ||||
| 	int bpp; | ||||
| 	int interface_type; /* selects RGBn or SYSn I/F, see above */ | ||||
| 	int clock_divider; | ||||
| 	struct fb_videomode lcd_cfg; | ||||
| 	struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg; | ||||
| 	struct sh_mobile_lcdc_board_cfg board_cfg; | ||||
| 	struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ | ||||
| }; | ||||
|  | ||||
| @ -29,6 +29,16 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned l | ||||
| void flush_dcache_page(struct page *pg); | ||||
| void flush_icache_range(unsigned long start, unsigned long end); | ||||
| void flush_icache_page(struct vm_area_struct *vma, struct page *page); | ||||
| 
 | ||||
| #define flush_dcache_mmap_lock(mapping)		do { } while (0) | ||||
| #define flush_dcache_mmap_unlock(mapping)	do { } while (0) | ||||
| 
 | ||||
| /* SH3 has unified cache so no special action needed here */ | ||||
| #define flush_cache_sigtramp(vaddr)		do { } while (0) | ||||
| #define flush_icache_user_range(vma,pg,adr,len)	do { } while (0) | ||||
| 
 | ||||
| #define p3_cache_init()				do { } while (0) | ||||
| 
 | ||||
| #else | ||||
| #include <cpu-common/cpu/cacheflush.h> | ||||
| #endif | ||||
|  | ||||
| @ -45,7 +45,7 @@ static struct platform_device vpu_device = { | ||||
| }; | ||||
| 
 | ||||
| static struct uio_info veu0_platform_data = { | ||||
| 	.name = "VEU", | ||||
| 	.name = "VEU2H", | ||||
| 	.version = "0", | ||||
| 	.irq = 54, | ||||
| }; | ||||
| @ -73,7 +73,7 @@ static struct platform_device veu0_device = { | ||||
| }; | ||||
| 
 | ||||
| static struct uio_info veu1_platform_data = { | ||||
| 	.name = "VEU", | ||||
| 	.name = "VEU2H", | ||||
| 	.version = "0", | ||||
| 	.irq = 27, | ||||
| }; | ||||
|  | ||||
| @ -107,10 +107,12 @@ DECLARE_EXPORT(__movmemSI12_i4); | ||||
|  * GCC >= 4.2 emits these for division, as do GCC 4.1.x versions of the ST | ||||
|  * compiler which include backported patches. | ||||
|  */ | ||||
| DECLARE_EXPORT(__sdivsi3_i4i); | ||||
| DECLARE_EXPORT(__udiv_qrnnd_16); | ||||
| #if !defined(CONFIG_CPU_SH2) | ||||
| DECLARE_EXPORT(__sdivsi3_i4i); | ||||
| DECLARE_EXPORT(__udivsi3_i4i); | ||||
| #endif | ||||
| #endif | ||||
| #else /* GCC 3.x */ | ||||
| DECLARE_EXPORT(__movstr_i4_even); | ||||
| DECLARE_EXPORT(__movstr_i4_odd); | ||||
|  | ||||
| @ -181,10 +181,12 @@ config ENTRY_OFFSET | ||||
| choice | ||||
| 	prompt "HugeTLB page size" | ||||
| 	depends on HUGETLB_PAGE && (CPU_SH4 || CPU_SH5) && MMU | ||||
| 	default HUGETLB_PAGE_SIZE_1MB if PAGE_SIZE_64KB | ||||
| 	default HUGETLB_PAGE_SIZE_64K | ||||
| 
 | ||||
| config HUGETLB_PAGE_SIZE_64K | ||||
| 	bool "64kB" | ||||
| 	depends on !PAGE_SIZE_64KB | ||||
| 
 | ||||
| config HUGETLB_PAGE_SIZE_256K | ||||
| 	bool "256kB" | ||||
|  | ||||
| @ -95,6 +95,29 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size, | ||||
| } | ||||
| EXPORT_SYMBOL(dma_cache_sync); | ||||
| 
 | ||||
| static int __init memchunk_setup(char *str) | ||||
| { | ||||
| 	return 1; /* accept anything that begins with "memchunk." */ | ||||
| } | ||||
| __setup("memchunk.", memchunk_setup); | ||||
| 
 | ||||
| static void memchunk_cmdline_override(char *name, unsigned long *sizep) | ||||
| { | ||||
| 	char *p = boot_command_line; | ||||
| 	int k = strlen(name); | ||||
| 
 | ||||
| 	while ((p = strstr(p, "memchunk."))) { | ||||
| 		p += 9; /* strlen("memchunk.") */ | ||||
| 		if (!strncmp(name, p, k) && p[k] == '=') { | ||||
| 			p += k + 1; | ||||
| 			*sizep = memparse(p, NULL); | ||||
| 			pr_info("%s: forcing memory chunk size to 0x%08lx\n", | ||||
| 				name, *sizep); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| int platform_resource_setup_memory(struct platform_device *pdev, | ||||
| 				   char *name, unsigned long memsize) | ||||
| { | ||||
| @ -109,6 +132,10 @@ int platform_resource_setup_memory(struct platform_device *pdev, | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	memchunk_cmdline_override(name, &memsize); | ||||
| 	if (!memsize) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL); | ||||
| 	if (!buf) { | ||||
| 		pr_warning("%s: unable to allocate memory\n", name); | ||||
|  | ||||
| @ -737,63 +737,44 @@ static int find_psb_table(struct powernow_k8_data *data) | ||||
| #ifdef CONFIG_X86_POWERNOW_K8_ACPI | ||||
| static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) | ||||
| { | ||||
| 	if (!data->acpi_data->state_count || (cpu_family == CPU_HW_PSTATE)) | ||||
| 	if (!data->acpi_data.state_count || (cpu_family == CPU_HW_PSTATE)) | ||||
| 		return; | ||||
| 
 | ||||
| 	data->irt = (data->acpi_data->states[index].control >> IRT_SHIFT) & IRT_MASK; | ||||
| 	data->rvo = (data->acpi_data->states[index].control >> RVO_SHIFT) & RVO_MASK; | ||||
| 	data->exttype = (data->acpi_data->states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK; | ||||
| 	data->plllock = (data->acpi_data->states[index].control >> PLL_L_SHIFT) & PLL_L_MASK; | ||||
| 	data->vidmvs = 1 << ((data->acpi_data->states[index].control >> MVS_SHIFT) & MVS_MASK); | ||||
| 	data->vstable = (data->acpi_data->states[index].control >> VST_SHIFT) & VST_MASK; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static struct acpi_processor_performance *acpi_perf_data; | ||||
| static int preregister_valid; | ||||
| 
 | ||||
| static int powernow_k8_cpu_preinit_acpi(void) | ||||
| { | ||||
| 	acpi_perf_data = alloc_percpu(struct acpi_processor_performance); | ||||
| 	if (!acpi_perf_data) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	if (acpi_processor_preregister_performance(acpi_perf_data)) | ||||
| 		return -ENODEV; | ||||
| 	else | ||||
| 		preregister_valid = 1; | ||||
| 	return 0; | ||||
| 	data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK; | ||||
| 	data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK; | ||||
| 	data->exttype = (data->acpi_data.states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK; | ||||
| 	data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK; | ||||
| 	data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK); | ||||
| 	data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK; | ||||
| } | ||||
| 
 | ||||
| static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | ||||
| { | ||||
| 	struct cpufreq_frequency_table *powernow_table; | ||||
| 	int ret_val; | ||||
| 	int cpu = 0; | ||||
| 
 | ||||
| 	data->acpi_data = percpu_ptr(acpi_perf_data, cpu); | ||||
| 	if (acpi_processor_register_performance(data->acpi_data, data->cpu)) { | ||||
| 	if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) { | ||||
| 		dprintk("register performance failed: bad ACPI data\n"); | ||||
| 		return -EIO; | ||||
| 	} | ||||
| 
 | ||||
| 	/* verify the data contained in the ACPI structures */ | ||||
| 	if (data->acpi_data->state_count <= 1) { | ||||
| 	if (data->acpi_data.state_count <= 1) { | ||||
| 		dprintk("No ACPI P-States\n"); | ||||
| 		goto err_out; | ||||
| 	} | ||||
| 
 | ||||
| 	if ((data->acpi_data->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || | ||||
| 		(data->acpi_data->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { | ||||
| 	if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || | ||||
| 		(data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { | ||||
| 		dprintk("Invalid control/status registers (%x - %x)\n", | ||||
| 			data->acpi_data->control_register.space_id, | ||||
| 			data->acpi_data->status_register.space_id); | ||||
| 			data->acpi_data.control_register.space_id, | ||||
| 			data->acpi_data.status_register.space_id); | ||||
| 		goto err_out; | ||||
| 	} | ||||
| 
 | ||||
| 	/* fill in data->powernow_table */ | ||||
| 	powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table) | ||||
| 		* (data->acpi_data->state_count + 1)), GFP_KERNEL); | ||||
| 		* (data->acpi_data.state_count + 1)), GFP_KERNEL); | ||||
| 	if (!powernow_table) { | ||||
| 		dprintk("powernow_table memory alloc failure\n"); | ||||
| 		goto err_out; | ||||
| @ -806,12 +787,12 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | ||||
| 	if (ret_val) | ||||
| 		goto err_out_mem; | ||||
| 
 | ||||
| 	powernow_table[data->acpi_data->state_count].frequency = CPUFREQ_TABLE_END; | ||||
| 	powernow_table[data->acpi_data->state_count].index = 0; | ||||
| 	powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END; | ||||
| 	powernow_table[data->acpi_data.state_count].index = 0; | ||||
| 	data->powernow_table = powernow_table; | ||||
| 
 | ||||
| 	/* fill in data */ | ||||
| 	data->numps = data->acpi_data->state_count; | ||||
| 	data->numps = data->acpi_data.state_count; | ||||
| 	if (first_cpu(per_cpu(cpu_core_map, data->cpu)) == data->cpu) | ||||
| 		print_basics(data); | ||||
| 	powernow_k8_acpi_pst_values(data, 0); | ||||
| @ -819,31 +800,16 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | ||||
| 	/* notify BIOS that we exist */ | ||||
| 	acpi_processor_notify_smm(THIS_MODULE); | ||||
| 
 | ||||
| 	/* determine affinity, from ACPI if available */ | ||||
| 	if (preregister_valid) { | ||||
| 		if ((data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ALL) || | ||||
| 			(data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ANY)) | ||||
| 			data->starting_core_affinity = data->acpi_data->shared_cpu_map; | ||||
| 		else | ||||
| 			data->starting_core_affinity = cpumask_of_cpu(data->cpu); | ||||
| 	} else { | ||||
| 	/* best guess from family if not */ | ||||
| 		if (cpu_family == CPU_HW_PSTATE) | ||||
| 			data->starting_core_affinity = cpumask_of_cpu(data->cpu); | ||||
| 		else | ||||
| 			data->starting_core_affinity = per_cpu(cpu_core_map, data->cpu); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| err_out_mem: | ||||
| 	kfree(powernow_table); | ||||
| 
 | ||||
| err_out: | ||||
| 	acpi_processor_unregister_performance(data->acpi_data, data->cpu); | ||||
| 	acpi_processor_unregister_performance(&data->acpi_data, data->cpu); | ||||
| 
 | ||||
| 	/* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */ | ||||
| 	data->acpi_data->state_count = 0; | ||||
| 	data->acpi_data.state_count = 0; | ||||
| 
 | ||||
| 	return -ENODEV; | ||||
| } | ||||
| @ -855,10 +821,10 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf | ||||
| 	rdmsr(MSR_PSTATE_CUR_LIMIT, hi, lo); | ||||
| 	data->max_hw_pstate = (hi & HW_PSTATE_MAX_MASK) >> HW_PSTATE_MAX_SHIFT; | ||||
| 
 | ||||
| 	for (i = 0; i < data->acpi_data->state_count; i++) { | ||||
| 	for (i = 0; i < data->acpi_data.state_count; i++) { | ||||
| 		u32 index; | ||||
| 
 | ||||
| 		index = data->acpi_data->states[i].control & HW_PSTATE_MASK; | ||||
| 		index = data->acpi_data.states[i].control & HW_PSTATE_MASK; | ||||
| 		if (index > data->max_hw_pstate) { | ||||
| 			printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index); | ||||
| 			printk(KERN_ERR PFX "Please report to BIOS manufacturer\n"); | ||||
| @ -874,7 +840,7 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf | ||||
| 
 | ||||
| 		powernow_table[i].index = index; | ||||
| 
 | ||||
| 		powernow_table[i].frequency = data->acpi_data->states[i].core_frequency * 1000; | ||||
| 		powernow_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| @ -883,16 +849,16 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf | ||||
| { | ||||
| 	int i; | ||||
| 	int cntlofreq = 0; | ||||
| 	for (i = 0; i < data->acpi_data->state_count; i++) { | ||||
| 	for (i = 0; i < data->acpi_data.state_count; i++) { | ||||
| 		u32 fid; | ||||
| 		u32 vid; | ||||
| 
 | ||||
| 		if (data->exttype) { | ||||
| 			fid = data->acpi_data->states[i].status & EXT_FID_MASK; | ||||
| 			vid = (data->acpi_data->states[i].status >> VID_SHIFT) & EXT_VID_MASK; | ||||
| 			fid = data->acpi_data.states[i].status & EXT_FID_MASK; | ||||
| 			vid = (data->acpi_data.states[i].status >> VID_SHIFT) & EXT_VID_MASK; | ||||
| 		} else { | ||||
| 			fid = data->acpi_data->states[i].control & FID_MASK; | ||||
| 			vid = (data->acpi_data->states[i].control >> VID_SHIFT) & VID_MASK; | ||||
| 			fid = data->acpi_data.states[i].control & FID_MASK; | ||||
| 			vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK; | ||||
| 		} | ||||
| 
 | ||||
| 		dprintk("   %d : fid 0x%x, vid 0x%x\n", i, fid, vid); | ||||
| @ -933,10 +899,10 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf | ||||
| 				cntlofreq = i; | ||||
| 		} | ||||
| 
 | ||||
| 		if (powernow_table[i].frequency != (data->acpi_data->states[i].core_frequency * 1000)) { | ||||
| 		if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) { | ||||
| 			printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n", | ||||
| 				powernow_table[i].frequency, | ||||
| 				(unsigned int) (data->acpi_data->states[i].core_frequency * 1000)); | ||||
| 				(unsigned int) (data->acpi_data.states[i].core_frequency * 1000)); | ||||
| 			powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | ||||
| 			continue; | ||||
| 		} | ||||
| @ -946,12 +912,11 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf | ||||
| 
 | ||||
| static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) | ||||
| { | ||||
| 	if (data->acpi_data->state_count) | ||||
| 		acpi_processor_unregister_performance(data->acpi_data, data->cpu); | ||||
| 	if (data->acpi_data.state_count) | ||||
| 		acpi_processor_unregister_performance(&data->acpi_data, data->cpu); | ||||
| } | ||||
| 
 | ||||
| #else | ||||
| static int powernow_k8_cpu_preinit_acpi(void) { return -ENODEV; } | ||||
| static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; } | ||||
| static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; } | ||||
| static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; } | ||||
| @ -1136,7 +1101,7 @@ static int powernowk8_verify(struct cpufreq_policy *pol) | ||||
| static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | ||||
| { | ||||
| 	struct powernow_k8_data *data; | ||||
| 	cpumask_t oldmask = CPU_MASK_ALL; | ||||
| 	cpumask_t oldmask; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	if (!cpu_online(pol->cpu)) | ||||
| @ -1209,7 +1174,10 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | ||||
| 	/* run on any CPU again */ | ||||
| 	set_cpus_allowed_ptr(current, &oldmask); | ||||
| 
 | ||||
| 	pol->cpus = data->starting_core_affinity; | ||||
| 	if (cpu_family == CPU_HW_PSTATE) | ||||
| 		pol->cpus = cpumask_of_cpu(pol->cpu); | ||||
| 	else | ||||
| 		pol->cpus = per_cpu(cpu_core_map, pol->cpu); | ||||
| 	data->available_cores = &(pol->cpus); | ||||
| 
 | ||||
| 	/* Take a crude guess here.
 | ||||
| @ -1332,7 +1300,6 @@ static int __cpuinit powernowk8_init(void) | ||||
| 	} | ||||
| 
 | ||||
| 	if (supported_cpus == num_online_cpus()) { | ||||
| 		powernow_k8_cpu_preinit_acpi(); | ||||
| 		printk(KERN_INFO PFX "Found %d %s " | ||||
| 			"processors (%d cpu cores) (" VERSION ")\n", | ||||
| 			num_online_nodes(), | ||||
| @ -1349,10 +1316,6 @@ static void __exit powernowk8_exit(void) | ||||
| 	dprintk("exit\n"); | ||||
| 
 | ||||
| 	cpufreq_unregister_driver(&cpufreq_amd64_driver); | ||||
| 
 | ||||
| #ifdef CONFIG_X86_POWERNOW_K8_ACPI | ||||
| 	free_percpu(acpi_perf_data); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com>"); | ||||
|  | ||||
| @ -33,13 +33,12 @@ struct powernow_k8_data { | ||||
| #ifdef CONFIG_X86_POWERNOW_K8_ACPI | ||||
| 	/* the acpi table needs to be kept. it's only available if ACPI was
 | ||||
| 	 * used to determine valid frequency/vid/fid states */ | ||||
| 	struct acpi_processor_performance *acpi_data; | ||||
| 	struct acpi_processor_performance acpi_data; | ||||
| #endif | ||||
| 	/* we need to keep track of associated cores, but let cpufreq
 | ||||
| 	 * handle hotplug events - so just point at cpufreq pol->cpus | ||||
| 	 * structure */ | ||||
| 	cpumask_t *available_cores; | ||||
| 	cpumask_t starting_core_affinity; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -88,6 +88,8 @@ static ssize_t cpuid_read(struct file *file, char __user *buf, | ||||
| 	struct cpuid_regs cmd; | ||||
| 	int cpu = iminor(file->f_path.dentry->d_inode); | ||||
| 	u64 pos = *ppos; | ||||
| 	ssize_t bytes = 0; | ||||
| 	int err = 0; | ||||
| 
 | ||||
| 	if (count % 16) | ||||
| 		return -EINVAL;	/* Invalid chunk size */ | ||||
| @ -95,14 +97,19 @@ static ssize_t cpuid_read(struct file *file, char __user *buf, | ||||
| 	for (; count; count -= 16) { | ||||
| 		cmd.eax = pos; | ||||
| 		cmd.ecx = pos >> 32; | ||||
| 		smp_call_function_single(cpu, cpuid_smp_cpuid, &cmd, 1); | ||||
| 		if (copy_to_user(tmp, &cmd, 16)) | ||||
| 			return -EFAULT; | ||||
| 		err = smp_call_function_single(cpu, cpuid_smp_cpuid, &cmd, 1); | ||||
| 		if (err) | ||||
| 			break; | ||||
| 		if (copy_to_user(tmp, &cmd, 16)) { | ||||
| 			err = -EFAULT; | ||||
| 			break; | ||||
| 		} | ||||
| 		tmp += 16; | ||||
| 		bytes += 16; | ||||
| 		*ppos = ++pos; | ||||
| 	} | ||||
| 
 | ||||
| 	return tmp - buf; | ||||
| 	return bytes ? bytes : err; | ||||
| } | ||||
| 
 | ||||
| static int cpuid_open(struct inode *inode, struct file *file) | ||||
|  | ||||
| @ -72,21 +72,28 @@ static ssize_t msr_read(struct file *file, char __user *buf, | ||||
| 	u32 data[2]; | ||||
| 	u32 reg = *ppos; | ||||
| 	int cpu = iminor(file->f_path.dentry->d_inode); | ||||
| 	int err; | ||||
| 	int err = 0; | ||||
| 	ssize_t bytes = 0; | ||||
| 
 | ||||
| 	if (count % 8) | ||||
| 		return -EINVAL;	/* Invalid chunk size */ | ||||
| 
 | ||||
| 	for (; count; count -= 8) { | ||||
| 		err = rdmsr_safe_on_cpu(cpu, reg, &data[0], &data[1]); | ||||
| 		if (err) | ||||
| 			return -EIO; | ||||
| 		if (copy_to_user(tmp, &data, 8)) | ||||
| 			return -EFAULT; | ||||
| 		if (err) { | ||||
| 			if (err == -EFAULT) /* Fix idiotic error code */ | ||||
| 				err = -EIO; | ||||
| 			break; | ||||
| 		} | ||||
| 		if (copy_to_user(tmp, &data, 8)) { | ||||
| 			err = -EFAULT; | ||||
| 			break; | ||||
| 		} | ||||
| 		tmp += 2; | ||||
| 		bytes += 8; | ||||
| 	} | ||||
| 
 | ||||
| 	return ((char __user *)tmp) - buf; | ||||
| 	return bytes ? bytes : err; | ||||
| } | ||||
| 
 | ||||
| static ssize_t msr_write(struct file *file, const char __user *buf, | ||||
| @ -96,21 +103,28 @@ static ssize_t msr_write(struct file *file, const char __user *buf, | ||||
| 	u32 data[2]; | ||||
| 	u32 reg = *ppos; | ||||
| 	int cpu = iminor(file->f_path.dentry->d_inode); | ||||
| 	int err; | ||||
| 	int err = 0; | ||||
| 	ssize_t bytes = 0; | ||||
| 
 | ||||
| 	if (count % 8) | ||||
| 		return -EINVAL;	/* Invalid chunk size */ | ||||
| 
 | ||||
| 	for (; count; count -= 8) { | ||||
| 		if (copy_from_user(&data, tmp, 8)) | ||||
| 			return -EFAULT; | ||||
| 		if (copy_from_user(&data, tmp, 8)) { | ||||
| 			err = -EFAULT; | ||||
| 			break; | ||||
| 		} | ||||
| 		err = wrmsr_safe_on_cpu(cpu, reg, data[0], data[1]); | ||||
| 		if (err) | ||||
| 			return -EIO; | ||||
| 		if (err) { | ||||
| 			if (err == -EFAULT) /* Fix idiotic error code */ | ||||
| 				err = -EIO; | ||||
| 			break; | ||||
| 		} | ||||
| 		tmp += 2; | ||||
| 		bytes += 8; | ||||
| 	} | ||||
| 
 | ||||
| 	return ((char __user *)tmp) - buf; | ||||
| 	return bytes ? bytes : err; | ||||
| } | ||||
| 
 | ||||
| static int msr_open(struct inode *inode, struct file *file) | ||||
|  | ||||
| @ -314,7 +314,7 @@ static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val, | ||||
| 			mark_tsc_unstable("cpufreq changes"); | ||||
| 	} | ||||
| 
 | ||||
| 	set_cyc2ns_scale(tsc_khz_ref, freq->cpu); | ||||
| 	set_cyc2ns_scale(tsc_khz, freq->cpu); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| @ -30,10 +30,11 @@ static int _rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h, int safe) | ||||
| 
 | ||||
| 	rv.msr_no = msr_no; | ||||
| 	if (safe) { | ||||
| 		smp_call_function_single(cpu, __rdmsr_safe_on_cpu, &rv, 1); | ||||
| 		err = rv.err; | ||||
| 		err = smp_call_function_single(cpu, __rdmsr_safe_on_cpu, | ||||
| 					       &rv, 1); | ||||
| 		err = err ? err : rv.err; | ||||
| 	} else { | ||||
| 		smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 1); | ||||
| 		err = smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 1); | ||||
| 	} | ||||
| 	*l = rv.l; | ||||
| 	*h = rv.h; | ||||
| @ -64,23 +65,24 @@ static int _wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h, int safe) | ||||
| 	rv.l = l; | ||||
| 	rv.h = h; | ||||
| 	if (safe) { | ||||
| 		smp_call_function_single(cpu, __wrmsr_safe_on_cpu, &rv, 1); | ||||
| 		err = rv.err; | ||||
| 		err = smp_call_function_single(cpu, __wrmsr_safe_on_cpu, | ||||
| 					       &rv, 1); | ||||
| 		err = err ? err : rv.err; | ||||
| 	} else { | ||||
| 		smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 1); | ||||
| 		err = smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 1); | ||||
| 	} | ||||
| 
 | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | ||||
| int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | ||||
| { | ||||
| 	_wrmsr_on_cpu(cpu, msr_no, l, h, 0); | ||||
| 	return _wrmsr_on_cpu(cpu, msr_no, l, h, 0); | ||||
| } | ||||
| 
 | ||||
| void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) | ||||
| int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) | ||||
| { | ||||
| 	_rdmsr_on_cpu(cpu, msr_no, l, h, 0); | ||||
| 	return _rdmsr_on_cpu(cpu, msr_no, l, h, 0); | ||||
| } | ||||
| 
 | ||||
| /* These "safe" variants are slower and should be used when the target MSR
 | ||||
|  | ||||
| @ -25,7 +25,6 @@ | ||||
| #include <linux/list.h> | ||||
| #include <linux/device.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/leds.h> | ||||
| 
 | ||||
| #include <asm/gpio.h> | ||||
|  | ||||
| @ -590,6 +590,8 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route | ||||
| 	case PCI_DEVICE_ID_INTEL_ICH10_1: | ||||
| 	case PCI_DEVICE_ID_INTEL_ICH10_2: | ||||
| 	case PCI_DEVICE_ID_INTEL_ICH10_3: | ||||
| 	case PCI_DEVICE_ID_INTEL_PCH_0: | ||||
| 	case PCI_DEVICE_ID_INTEL_PCH_1: | ||||
| 		r->name = "PIIX/ICH"; | ||||
| 		r->get = pirq_piix_get; | ||||
| 		r->set = pirq_piix_set; | ||||
|  | ||||
| @ -14,7 +14,7 @@ static void __devinit pcibios_fixup_peer_bridges(void) | ||||
| 	int n, devfn; | ||||
| 	long node; | ||||
| 
 | ||||
| 	if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff) | ||||
| 	if (pcibios_last_bus <= 0 || pcibios_last_bus > 0xff) | ||||
| 		return; | ||||
| 	DBG("PCI: Peer bridge fixup\n"); | ||||
| 
 | ||||
|  | ||||
| @ -293,7 +293,7 @@ static acpi_status __init find_mboard_resource(acpi_handle handle, u32 lvl, | ||||
| 	return AE_OK; | ||||
| } | ||||
| 
 | ||||
| static int __init is_acpi_reserved(unsigned long start, unsigned long end) | ||||
| static int __init is_acpi_reserved(u64 start, u64 end, unsigned not_used) | ||||
| { | ||||
| 	struct resource mcfg_res; | ||||
| 
 | ||||
| @ -310,6 +310,41 @@ static int __init is_acpi_reserved(unsigned long start, unsigned long end) | ||||
| 	return mcfg_res.flags; | ||||
| } | ||||
| 
 | ||||
| typedef int (*check_reserved_t)(u64 start, u64 end, unsigned type); | ||||
| 
 | ||||
| static int __init is_mmconf_reserved(check_reserved_t is_reserved, | ||||
| 		u64 addr, u64 size, int i, | ||||
| 		typeof(pci_mmcfg_config[0]) *cfg, int with_e820) | ||||
| { | ||||
| 	u64 old_size = size; | ||||
| 	int valid = 0; | ||||
| 
 | ||||
| 	while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) { | ||||
| 		size >>= 1; | ||||
| 		if (size < (16UL<<20)) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	if (size >= (16UL<<20) || size == old_size) { | ||||
| 		printk(KERN_NOTICE | ||||
| 		       "PCI: MCFG area at %Lx reserved in %s\n", | ||||
| 			addr, with_e820?"E820":"ACPI motherboard resources"); | ||||
| 		valid = 1; | ||||
| 
 | ||||
| 		if (old_size != size) { | ||||
| 			/* update end_bus_number */ | ||||
| 			cfg->end_bus_number = cfg->start_bus_number + ((size>>20) - 1); | ||||
| 			printk(KERN_NOTICE "PCI: updated MCFG configuration %d: base %lx " | ||||
| 			       "segment %hu buses %u - %u\n", | ||||
| 			       i, (unsigned long)cfg->address, cfg->pci_segment, | ||||
| 			       (unsigned int)cfg->start_bus_number, | ||||
| 			       (unsigned int)cfg->end_bus_number); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return valid; | ||||
| } | ||||
| 
 | ||||
| static void __init pci_mmcfg_reject_broken(int early) | ||||
| { | ||||
| 	typeof(pci_mmcfg_config[0]) *cfg; | ||||
| @ -324,21 +359,22 @@ static void __init pci_mmcfg_reject_broken(int early) | ||||
| 
 | ||||
| 	for (i = 0; i < pci_mmcfg_config_num; i++) { | ||||
| 		int valid = 0; | ||||
| 		u32 size = (cfg->end_bus_number + 1) << 20; | ||||
| 		u64 addr, size; | ||||
| 
 | ||||
| 		cfg = &pci_mmcfg_config[i]; | ||||
| 		addr = cfg->start_bus_number; | ||||
| 		addr <<= 20; | ||||
| 		addr += cfg->address; | ||||
| 		size = cfg->end_bus_number + 1 - cfg->start_bus_number; | ||||
| 		size <<= 20; | ||||
| 		printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx " | ||||
| 		       "segment %hu buses %u - %u\n", | ||||
| 		       i, (unsigned long)cfg->address, cfg->pci_segment, | ||||
| 		       (unsigned int)cfg->start_bus_number, | ||||
| 		       (unsigned int)cfg->end_bus_number); | ||||
| 
 | ||||
| 		if (!early && | ||||
| 		    is_acpi_reserved(cfg->address, cfg->address + size - 1)) { | ||||
| 			printk(KERN_NOTICE "PCI: MCFG area at %Lx reserved " | ||||
| 			       "in ACPI motherboard resources\n", | ||||
| 			       cfg->address); | ||||
| 			valid = 1; | ||||
| 		} | ||||
| 		if (!early) | ||||
| 			valid = is_mmconf_reserved(is_acpi_reserved, addr, size, i, cfg, 0); | ||||
| 
 | ||||
| 		if (valid) | ||||
| 			continue; | ||||
| @ -347,16 +383,11 @@ static void __init pci_mmcfg_reject_broken(int early) | ||||
| 			printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not" | ||||
| 			       " reserved in ACPI motherboard resources\n", | ||||
| 			       cfg->address); | ||||
| 
 | ||||
| 		/* Don't try to do this check unless configuration
 | ||||
| 		   type 1 is available. how about type 2 ?*/ | ||||
| 		if (raw_pci_ops && e820_all_mapped(cfg->address, | ||||
| 						  cfg->address + size - 1, | ||||
| 						  E820_RESERVED)) { | ||||
| 			printk(KERN_NOTICE | ||||
| 			       "PCI: MCFG area at %Lx reserved in E820\n", | ||||
| 			       cfg->address); | ||||
| 			valid = 1; | ||||
| 		} | ||||
| 		if (raw_pci_ops) | ||||
| 			valid = is_mmconf_reserved(e820_all_mapped, addr, size, i, cfg, 1); | ||||
| 
 | ||||
| 		if (!valid) | ||||
| 			goto reject; | ||||
|  | ||||
| @ -293,27 +293,30 @@ void __init printk_all_partitions(void) | ||||
| /* iterator */ | ||||
| static int find_start(struct device *dev, void *data) | ||||
| { | ||||
| 	loff_t k = *(loff_t *)data; | ||||
| 	loff_t *k = data; | ||||
| 
 | ||||
| 	if (dev->type != &disk_type) | ||||
| 		return 0; | ||||
| 	if (!k--) | ||||
| 	if (!*k) | ||||
| 		return 1; | ||||
| 	(*k)--; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void *part_start(struct seq_file *part, loff_t *pos) | ||||
| { | ||||
| 	struct device *dev; | ||||
| 	loff_t n = *pos; | ||||
| 	loff_t k = *pos; | ||||
| 
 | ||||
| 	if (!n) | ||||
| 	if (!k) | ||||
| 		seq_puts(part, "major minor  #blocks  name\n\n"); | ||||
| 
 | ||||
| 	mutex_lock(&block_class_lock); | ||||
| 	dev = class_find_device(&block_class, NULL, (void *)pos, find_start); | ||||
| 	if (dev) | ||||
| 	dev = class_find_device(&block_class, NULL, &k, find_start); | ||||
| 	if (dev) { | ||||
| 		put_device(dev); | ||||
| 		return dev_to_disk(dev); | ||||
| 	} | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| @ -330,8 +333,10 @@ static void *part_next(struct seq_file *part, void *v, loff_t *pos) | ||||
| 	struct device *dev; | ||||
| 	++*pos; | ||||
| 	dev = class_find_device(&block_class, &gp->dev, NULL, find_next); | ||||
| 	if (dev) | ||||
| 	if (dev) { | ||||
| 		put_device(dev); | ||||
| 		return dev_to_disk(dev); | ||||
| 	} | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| @ -568,11 +573,14 @@ static struct device_type disk_type = { | ||||
| static void *diskstats_start(struct seq_file *part, loff_t *pos) | ||||
| { | ||||
| 	struct device *dev; | ||||
| 	loff_t k = *pos; | ||||
| 
 | ||||
| 	mutex_lock(&block_class_lock); | ||||
| 	dev = class_find_device(&block_class, NULL, (void *)pos, find_start); | ||||
| 	if (dev) | ||||
| 	dev = class_find_device(&block_class, NULL, &k, find_start); | ||||
| 	if (dev) { | ||||
| 		put_device(dev); | ||||
| 		return dev_to_disk(dev); | ||||
| 	} | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| @ -583,8 +591,10 @@ static void *diskstats_next(struct seq_file *part, void *v, loff_t *pos) | ||||
| 
 | ||||
| 	++*pos; | ||||
| 	dev = class_find_device(&block_class, &gp->dev, NULL, find_next); | ||||
| 	if (dev) | ||||
| 	if (dev) { | ||||
| 		put_device(dev); | ||||
| 		return dev_to_disk(dev); | ||||
| 	} | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| @ -712,10 +722,12 @@ dev_t blk_lookup_devt(const char *name, int part) | ||||
| 	mutex_lock(&block_class_lock); | ||||
| 	find.name = name; | ||||
| 	find.part = part; | ||||
| 	dev = class_find_device(&block_class, NULL, (void *)&find, match_id); | ||||
| 	if (dev) | ||||
| 	dev = class_find_device(&block_class, NULL, &find, match_id); | ||||
| 	if (dev) { | ||||
| 		put_device(dev); | ||||
| 		devt = MKDEV(MAJOR(dev->devt), | ||||
| 			     MINOR(dev->devt) + part); | ||||
| 	} | ||||
| 	mutex_unlock(&block_class_lock); | ||||
| 
 | ||||
| 	return devt; | ||||
|  | ||||
| @ -174,8 +174,9 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv, | ||||
| static void crypto_authenc_encrypt_done(struct crypto_async_request *req, | ||||
| 					int err) | ||||
| { | ||||
| 	struct aead_request *areq = req->data; | ||||
| 
 | ||||
| 	if (!err) { | ||||
| 		struct aead_request *areq = req->data; | ||||
| 		struct crypto_aead *authenc = crypto_aead_reqtfm(areq); | ||||
| 		struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); | ||||
| 		struct ablkcipher_request *abreq = aead_request_ctx(areq); | ||||
| @ -185,7 +186,7 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req, | ||||
| 		err = crypto_authenc_genicv(areq, iv, 0); | ||||
| 	} | ||||
| 
 | ||||
| 	aead_request_complete(req->data, err); | ||||
| 	aead_request_complete(areq, err); | ||||
| } | ||||
| 
 | ||||
| static int crypto_authenc_encrypt(struct aead_request *req) | ||||
| @ -216,14 +217,15 @@ static int crypto_authenc_encrypt(struct aead_request *req) | ||||
| static void crypto_authenc_givencrypt_done(struct crypto_async_request *req, | ||||
| 					   int err) | ||||
| { | ||||
| 	struct aead_request *areq = req->data; | ||||
| 
 | ||||
| 	if (!err) { | ||||
| 		struct aead_request *areq = req->data; | ||||
| 		struct skcipher_givcrypt_request *greq = aead_request_ctx(areq); | ||||
| 
 | ||||
| 		err = crypto_authenc_genicv(areq, greq->giv, 0); | ||||
| 	} | ||||
| 
 | ||||
| 	aead_request_complete(req->data, err); | ||||
| 	aead_request_complete(areq, err); | ||||
| } | ||||
| 
 | ||||
| static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req) | ||||
|  | ||||
| @ -486,6 +486,8 @@ static const struct pci_device_id ahci_pci_tbl[] = { | ||||
| 	{ PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */ | ||||
| 	{ PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */ | ||||
| 	{ PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */ | ||||
| 	{ PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */ | ||||
| 	{ PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */ | ||||
| 
 | ||||
| 	/* JMicron 360/1/3/5/6, match class to avoid IDE function */ | ||||
| 	{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | ||||
| @ -575,9 +577,9 @@ static const struct pci_device_id ahci_pci_tbl[] = { | ||||
| 	{ PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci },		/* MCP7B */ | ||||
| 
 | ||||
| 	/* SiS */ | ||||
| 	{ PCI_VDEVICE(SI, 0x1184), board_ahci_nopmp },		/* SiS 966 */ | ||||
| 	{ PCI_VDEVICE(SI, 0x1185), board_ahci_nopmp },		/* SiS 968 */ | ||||
| 	{ PCI_VDEVICE(SI, 0x0186), board_ahci_nopmp },		/* SiS 968 */ | ||||
| 	{ PCI_VDEVICE(SI, 0x1184), board_ahci },		/* SiS 966 */ | ||||
| 	{ PCI_VDEVICE(SI, 0x1185), board_ahci },		/* SiS 968 */ | ||||
| 	{ PCI_VDEVICE(SI, 0x0186), board_ahci },		/* SiS 968 */ | ||||
| 
 | ||||
| 	/* Marvell */ | ||||
| 	{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv },	/* 6145 */ | ||||
|  | ||||
| @ -275,6 +275,14 @@ static const struct pci_device_id piix_pci_tbl[] = { | ||||
| 	{ 0x8086, 0x3a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||||
| 	/* SATA Controller IDE (ICH10) */ | ||||
| 	{ 0x8086, 0x3a26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||||
| 	/* SATA Controller IDE (PCH) */ | ||||
| 	{ 0x8086, 0x3b20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||||
| 	/* SATA Controller IDE (PCH) */ | ||||
| 	{ 0x8086, 0x3b26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||||
| 	/* SATA Controller IDE (PCH) */ | ||||
| 	{ 0x8086, 0x3b2d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||||
| 	/* SATA Controller IDE (PCH) */ | ||||
| 	{ 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||||
| 
 | ||||
| 	{ }	/* terminate list */ | ||||
| }; | ||||
|  | ||||
| @ -104,6 +104,7 @@ struct ata_force_param { | ||||
| 	unsigned long	xfer_mask; | ||||
| 	unsigned int	horkage_on; | ||||
| 	unsigned int	horkage_off; | ||||
| 	unsigned int	lflags; | ||||
| }; | ||||
| 
 | ||||
| struct ata_force_ent { | ||||
| @ -196,22 +197,23 @@ void ata_force_cbl(struct ata_port *ap) | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  *	ata_force_spd_limit - force SATA spd limit according to libata.force | ||||
|  *	ata_force_link_limits - force link limits according to libata.force | ||||
|  *	@link: ATA link of interest | ||||
|  * | ||||
|  *	Force SATA spd limit according to libata.force and whine about | ||||
|  *	it.  When only the port part is specified (e.g. 1:), the limit | ||||
|  *	applies to all links connected to both the host link and all | ||||
|  *	fan-out ports connected via PMP.  If the device part is | ||||
|  *	specified as 0 (e.g. 1.00:), it specifies the first fan-out | ||||
|  *	link not the host link.  Device number 15 always points to the | ||||
|  *	host link whether PMP is attached or not. | ||||
|  *	Force link flags and SATA spd limit according to libata.force | ||||
|  *	and whine about it.  When only the port part is specified | ||||
|  *	(e.g. 1:), the limit applies to all links connected to both | ||||
|  *	the host link and all fan-out ports connected via PMP.  If the | ||||
|  *	device part is specified as 0 (e.g. 1.00:), it specifies the | ||||
|  *	first fan-out link not the host link.  Device number 15 always | ||||
|  *	points to the host link whether PMP is attached or not. | ||||
|  * | ||||
|  *	LOCKING: | ||||
|  *	EH context. | ||||
|  */ | ||||
| static void ata_force_spd_limit(struct ata_link *link) | ||||
| static void ata_force_link_limits(struct ata_link *link) | ||||
| { | ||||
| 	bool did_spd = false; | ||||
| 	int linkno, i; | ||||
| 
 | ||||
| 	if (ata_is_host_link(link)) | ||||
| @ -228,13 +230,22 @@ static void ata_force_spd_limit(struct ata_link *link) | ||||
| 		if (fe->device != -1 && fe->device != linkno) | ||||
| 			continue; | ||||
| 
 | ||||
| 		if (!fe->param.spd_limit) | ||||
| 			continue; | ||||
| 		/* only honor the first spd limit */ | ||||
| 		if (!did_spd && fe->param.spd_limit) { | ||||
| 			link->hw_sata_spd_limit = (1 << fe->param.spd_limit) - 1; | ||||
| 			ata_link_printk(link, KERN_NOTICE, | ||||
| 					"FORCE: PHY spd limit set to %s\n", | ||||
| 					fe->param.name); | ||||
| 			did_spd = true; | ||||
| 		} | ||||
| 
 | ||||
| 		link->hw_sata_spd_limit = (1 << fe->param.spd_limit) - 1; | ||||
| 		ata_link_printk(link, KERN_NOTICE, | ||||
| 			"FORCE: PHY spd limit set to %s\n", fe->param.name); | ||||
| 		return; | ||||
| 		/* let lflags stack */ | ||||
| 		if (fe->param.lflags) { | ||||
| 			link->flags |= fe->param.lflags; | ||||
| 			ata_link_printk(link, KERN_NOTICE, | ||||
| 					"FORCE: link flag 0x%x forced -> 0x%x\n", | ||||
| 					fe->param.lflags, link->flags); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -3277,7 +3288,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | ||||
| 		dev->dma_mode = ata_xfer_mask2mode(dma_mask); | ||||
| 
 | ||||
| 		found = 1; | ||||
| 		if (dev->dma_mode != 0xff) | ||||
| 		if (ata_dma_enabled(dev)) | ||||
| 			used_dma = 1; | ||||
| 	} | ||||
| 	if (!found) | ||||
| @ -3302,7 +3313,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | ||||
| 
 | ||||
| 	/* step 3: set host DMA timings */ | ||||
| 	ata_link_for_each_dev(dev, link) { | ||||
| 		if (!ata_dev_enabled(dev) || dev->dma_mode == 0xff) | ||||
| 		if (!ata_dev_enabled(dev) || !ata_dma_enabled(dev)) | ||||
| 			continue; | ||||
| 
 | ||||
| 		dev->xfer_mode = dev->dma_mode; | ||||
| @ -5188,19 +5199,18 @@ void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp) | ||||
|  */ | ||||
| int sata_link_init_spd(struct ata_link *link) | ||||
| { | ||||
| 	u32 scontrol; | ||||
| 	u8 spd; | ||||
| 	int rc; | ||||
| 
 | ||||
| 	rc = sata_scr_read(link, SCR_CONTROL, &scontrol); | ||||
| 	rc = sata_scr_read(link, SCR_CONTROL, &link->saved_scontrol); | ||||
| 	if (rc) | ||||
| 		return rc; | ||||
| 
 | ||||
| 	spd = (scontrol >> 4) & 0xf; | ||||
| 	spd = (link->saved_scontrol >> 4) & 0xf; | ||||
| 	if (spd) | ||||
| 		link->hw_sata_spd_limit &= (1 << spd) - 1; | ||||
| 
 | ||||
| 	ata_force_spd_limit(link); | ||||
| 	ata_force_link_limits(link); | ||||
| 
 | ||||
| 	link->sata_spd_limit = link->hw_sata_spd_limit; | ||||
| 
 | ||||
| @ -5783,9 +5793,10 @@ static void ata_port_detach(struct ata_port *ap) | ||||
| 	ata_port_wait_eh(ap); | ||||
| 
 | ||||
| 	/* EH is now guaranteed to see UNLOADING - EH context belongs
 | ||||
| 	 * to us.  Disable all existing devices. | ||||
| 	 * to us.  Restore SControl and disable all existing devices. | ||||
| 	 */ | ||||
| 	ata_port_for_each_link(link, ap) { | ||||
| 	__ata_port_for_each_link(link, ap) { | ||||
| 		sata_scr_write(link, SCR_CONTROL, link->saved_scontrol); | ||||
| 		ata_link_for_each_dev(dev, link) | ||||
| 			ata_dev_disable(dev); | ||||
| 	} | ||||
| @ -5991,6 +6002,9 @@ static int __init ata_parse_force_one(char **cur, | ||||
| 		{ "udma133",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 6) }, | ||||
| 		{ "udma/133",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 6) }, | ||||
| 		{ "udma7",	.xfer_mask	= 1 << (ATA_SHIFT_UDMA + 7) }, | ||||
| 		{ "nohrst",	.lflags		= ATA_LFLAG_NO_HRST }, | ||||
| 		{ "nosrst",	.lflags		= ATA_LFLAG_NO_SRST }, | ||||
| 		{ "norst",	.lflags		= ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST }, | ||||
| 	}; | ||||
| 	char *start = *cur, *p = *cur; | ||||
| 	char *id, *val, *endp; | ||||
|  | ||||
| @ -2040,7 +2040,7 @@ static void ata_eh_link_report(struct ata_link *link) | ||||
| 	} | ||||
| 
 | ||||
| 	if (ehc->i.serror) | ||||
| 		ata_port_printk(ap, KERN_ERR, | ||||
| 		ata_link_printk(link, KERN_ERR, | ||||
| 		  "SError: { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s}\n", | ||||
| 		  ehc->i.serror & SERR_DATA_RECOVERED ? "RecovData " : "", | ||||
| 		  ehc->i.serror & SERR_COMM_RECOVERED ? "RecovComm " : "", | ||||
| @ -2171,18 +2171,12 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset, | ||||
| } | ||||
| 
 | ||||
| static int ata_eh_followup_srst_needed(struct ata_link *link, | ||||
| 				       int rc, int classify, | ||||
| 				       const unsigned int *classes) | ||||
| 				       int rc, const unsigned int *classes) | ||||
| { | ||||
| 	if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link)) | ||||
| 		return 0; | ||||
| 	if (rc == -EAGAIN) { | ||||
| 		if (classify) | ||||
| 			return 1; | ||||
| 		rc = 0; | ||||
| 	} | ||||
| 	if (rc != 0) | ||||
| 		return 0; | ||||
| 	if (rc == -EAGAIN) | ||||
| 		return 1; | ||||
| 	if (sata_pmp_supported(link->ap) && ata_is_host_link(link)) | ||||
| 		return 1; | ||||
| 	return 0; | ||||
| @ -2210,6 +2204,10 @@ int ata_eh_reset(struct ata_link *link, int classify, | ||||
| 	 */ | ||||
| 	while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX) | ||||
| 		max_tries++; | ||||
| 	if (link->flags & ATA_LFLAG_NO_HRST) | ||||
| 		hardreset = NULL; | ||||
| 	if (link->flags & ATA_LFLAG_NO_SRST) | ||||
| 		softreset = NULL; | ||||
| 
 | ||||
| 	now = jiffies; | ||||
| 	deadline = ata_deadline(ehc->last_reset, ATA_EH_RESET_COOL_DOWN); | ||||
| @ -2247,10 +2245,10 @@ int ata_eh_reset(struct ata_link *link, int classify, | ||||
| 	ehc->i.action &= ~ATA_EH_RESET; | ||||
| 	if (hardreset) { | ||||
| 		reset = hardreset; | ||||
| 		ehc->i.action = ATA_EH_HARDRESET; | ||||
| 		ehc->i.action |= ATA_EH_HARDRESET; | ||||
| 	} else if (softreset) { | ||||
| 		reset = softreset; | ||||
| 		ehc->i.action = ATA_EH_SOFTRESET; | ||||
| 		ehc->i.action |= ATA_EH_SOFTRESET; | ||||
| 	} | ||||
| 
 | ||||
| 	if (prereset) { | ||||
| @ -2305,9 +2303,11 @@ int ata_eh_reset(struct ata_link *link, int classify, | ||||
| 			ehc->i.flags |= ATA_EHI_DID_SOFTRESET; | ||||
| 
 | ||||
| 		rc = ata_do_reset(link, reset, classes, deadline); | ||||
| 		if (rc && rc != -EAGAIN) | ||||
| 			goto fail; | ||||
| 
 | ||||
| 		if (reset == hardreset && | ||||
| 		    ata_eh_followup_srst_needed(link, rc, classify, classes)) { | ||||
| 		    ata_eh_followup_srst_needed(link, rc, classes)) { | ||||
| 			/* okay, let's do follow-up softreset */ | ||||
| 			reset = softreset; | ||||
| 
 | ||||
| @ -2322,10 +2322,6 @@ int ata_eh_reset(struct ata_link *link, int classify, | ||||
| 			ata_eh_about_to_do(link, NULL, ATA_EH_RESET); | ||||
| 			rc = ata_do_reset(link, reset, classes, deadline); | ||||
| 		} | ||||
| 
 | ||||
| 		/* -EAGAIN can happen if we skipped followup SRST */ | ||||
| 		if (rc && rc != -EAGAIN) | ||||
| 			goto fail; | ||||
| 	} else { | ||||
| 		if (verbose) | ||||
| 			ata_link_printk(link, KERN_INFO, "no reset method " | ||||
|  | ||||
| @ -181,7 +181,7 @@ static unsigned int pacpi_qc_issue(struct ata_queued_cmd *qc) | ||||
| 
 | ||||
| 	if (adev != acpi->last) { | ||||
| 		pacpi_set_piomode(ap, adev); | ||||
| 		if (adev->dma_mode) | ||||
| 		if (ata_dma_enabled(adev)) | ||||
| 			pacpi_set_dmamode(ap, adev); | ||||
| 		acpi->last = adev; | ||||
| 	} | ||||
|  | ||||
| @ -183,7 +183,7 @@ static void atiixp_bmdma_start(struct ata_queued_cmd *qc) | ||||
| 	u16 tmp16; | ||||
| 
 | ||||
| 	pci_read_config_word(pdev, ATIIXP_IDE_UDMA_CONTROL, &tmp16); | ||||
| 	if (adev->dma_mode >= XFER_UDMA_0) | ||||
| 	if (ata_using_udma(adev)) | ||||
| 		tmp16 |= (1 << dn); | ||||
| 	else | ||||
| 		tmp16 &= ~(1 << dn); | ||||
|  | ||||
| @ -149,10 +149,10 @@ static unsigned int cs5530_qc_issue(struct ata_queued_cmd *qc) | ||||
| 	struct ata_device *prev = ap->private_data; | ||||
| 
 | ||||
| 	/* See if the DMA settings could be wrong */ | ||||
| 	if (adev->dma_mode != 0 && adev != prev && prev != NULL) { | ||||
| 	if (ata_dma_enabled(adev) && adev != prev && prev != NULL) { | ||||
| 		/* Maybe, but do the channels match MWDMA/UDMA ? */ | ||||
| 		if ((adev->dma_mode >= XFER_UDMA_0 && prev->dma_mode < XFER_UDMA_0) || | ||||
| 		    (adev->dma_mode < XFER_UDMA_0 && prev->dma_mode >= XFER_UDMA_0)) | ||||
| 		if ((ata_using_udma(adev) && !ata_using_udma(prev)) || | ||||
| 		    (ata_using_udma(prev) && !ata_using_udma(adev))) | ||||
| 		    	/* Switch the mode bits */ | ||||
| 		    	cs5530_set_dmamode(ap, adev); | ||||
| 	} | ||||
|  | ||||
| @ -606,7 +606,7 @@ static void it821x_display_disk(int n, u8 *buf) | ||||
| { | ||||
| 	unsigned char id[41]; | ||||
| 	int mode = 0; | ||||
| 	char *mtype; | ||||
| 	char *mtype = ""; | ||||
| 	char mbuf[8]; | ||||
| 	char *cbl = "(40 wire cable)"; | ||||
| 
 | ||||
|  | ||||
| @ -198,7 +198,7 @@ static unsigned int oldpiix_qc_issue(struct ata_queued_cmd *qc) | ||||
| 
 | ||||
| 	if (adev != ap->private_data) { | ||||
| 		oldpiix_set_piomode(ap, adev); | ||||
| 		if (adev->dma_mode) | ||||
| 		if (ata_dma_enabled(adev)) | ||||
| 			oldpiix_set_dmamode(ap, adev); | ||||
| 	} | ||||
| 	return ata_sff_qc_issue(qc); | ||||
|  | ||||
| @ -167,10 +167,10 @@ static unsigned int sc1200_qc_issue(struct ata_queued_cmd *qc) | ||||
| 	struct ata_device *prev = ap->private_data; | ||||
| 
 | ||||
| 	/* See if the DMA settings could be wrong */ | ||||
| 	if (adev->dma_mode != 0 && adev != prev && prev != NULL) { | ||||
| 	if (ata_dma_enabled(adev) && adev != prev && prev != NULL) { | ||||
| 		/* Maybe, but do the channels match MWDMA/UDMA ? */ | ||||
| 		if ((adev->dma_mode >= XFER_UDMA_0 && prev->dma_mode < XFER_UDMA_0) || | ||||
| 		    (adev->dma_mode < XFER_UDMA_0 && prev->dma_mode >= XFER_UDMA_0)) | ||||
| 		if ((ata_using_udma(adev) && !ata_using_udma(prev)) || | ||||
| 		    (ata_using_udma(prev) && !ata_using_udma(adev))) | ||||
| 		    	/* Switch the mode bits */ | ||||
| 		    	sc1200_set_dmamode(ap, adev); | ||||
| 	} | ||||
|  | ||||
| @ -324,62 +324,26 @@ static void via_set_dmamode(struct ata_port *ap, struct ata_device *adev) | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  *	via_ata_sff_tf_load - send taskfile registers to host controller | ||||
|  *	via_tf_load - send taskfile registers to host controller | ||||
|  *	@ap: Port to which output is sent | ||||
|  *	@tf: ATA taskfile register set | ||||
|  * | ||||
|  *	Outputs ATA taskfile to standard ATA host controller. | ||||
|  * | ||||
|  *	Note: This is to fix the internal bug of via chipsets, which | ||||
|  *  will reset the device register after changing the IEN bit on | ||||
|  *  ctl register | ||||
|  *	will reset the device register after changing the IEN bit on | ||||
|  *	ctl register | ||||
|  */ | ||||
| static void via_ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) | ||||
| static void via_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) | ||||
| { | ||||
| 	struct ata_ioports *ioaddr = &ap->ioaddr; | ||||
| 	unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR; | ||||
| 	struct ata_taskfile tmp_tf; | ||||
| 
 | ||||
| 	if (tf->ctl != ap->last_ctl) { | ||||
| 		iowrite8(tf->ctl, ioaddr->ctl_addr); | ||||
| 		iowrite8(tf->device, ioaddr->device_addr); | ||||
| 		ap->last_ctl = tf->ctl; | ||||
| 		ata_wait_idle(ap); | ||||
| 	if (ap->ctl != ap->last_ctl && !(tf->flags & ATA_TFLAG_DEVICE)) { | ||||
| 		tmp_tf = *tf; | ||||
| 		tmp_tf.flags |= ATA_TFLAG_DEVICE; | ||||
| 		tf = &tmp_tf; | ||||
| 	} | ||||
| 
 | ||||
| 	if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { | ||||
| 		iowrite8(tf->hob_feature, ioaddr->feature_addr); | ||||
| 		iowrite8(tf->hob_nsect, ioaddr->nsect_addr); | ||||
| 		iowrite8(tf->hob_lbal, ioaddr->lbal_addr); | ||||
| 		iowrite8(tf->hob_lbam, ioaddr->lbam_addr); | ||||
| 		iowrite8(tf->hob_lbah, ioaddr->lbah_addr); | ||||
| 		VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n", | ||||
| 			tf->hob_feature, | ||||
| 			tf->hob_nsect, | ||||
| 			tf->hob_lbal, | ||||
| 			tf->hob_lbam, | ||||
| 			tf->hob_lbah); | ||||
| 	} | ||||
| 
 | ||||
| 	if (is_addr) { | ||||
| 		iowrite8(tf->feature, ioaddr->feature_addr); | ||||
| 		iowrite8(tf->nsect, ioaddr->nsect_addr); | ||||
| 		iowrite8(tf->lbal, ioaddr->lbal_addr); | ||||
| 		iowrite8(tf->lbam, ioaddr->lbam_addr); | ||||
| 		iowrite8(tf->lbah, ioaddr->lbah_addr); | ||||
| 		VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n", | ||||
| 			tf->feature, | ||||
| 			tf->nsect, | ||||
| 			tf->lbal, | ||||
| 			tf->lbam, | ||||
| 			tf->lbah); | ||||
| 	} | ||||
| 
 | ||||
| 	if (tf->flags & ATA_TFLAG_DEVICE) { | ||||
| 		iowrite8(tf->device, ioaddr->device_addr); | ||||
| 		VPRINTK("device 0x%X\n", tf->device); | ||||
| 	} | ||||
| 
 | ||||
| 	ata_wait_idle(ap); | ||||
| 	ata_sff_tf_load(ap, tf); | ||||
| } | ||||
| 
 | ||||
| static struct scsi_host_template via_sht = { | ||||
| @ -392,13 +356,12 @@ static struct ata_port_operations via_port_ops = { | ||||
| 	.set_piomode	= via_set_piomode, | ||||
| 	.set_dmamode	= via_set_dmamode, | ||||
| 	.prereset	= via_pre_reset, | ||||
| 	.sff_tf_load = via_ata_tf_load, | ||||
| 	.sff_tf_load	= via_tf_load, | ||||
| }; | ||||
| 
 | ||||
| static struct ata_port_operations via_port_ops_noirq = { | ||||
| 	.inherits	= &via_port_ops, | ||||
| 	.sff_data_xfer	= ata_sff_data_xfer_noirq, | ||||
| 	.sff_tf_load = via_ata_tf_load, | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  | ||||
| @ -1134,30 +1134,16 @@ static int mv_qc_defer(struct ata_queued_cmd *qc) | ||||
| 	if (ap->nr_active_links == 0) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) { | ||||
| 		/*
 | ||||
| 		 * The port is operating in host queuing mode (EDMA). | ||||
| 		 * It can accomodate a new qc if the qc protocol | ||||
| 		 * is compatible with the current host queue mode. | ||||
| 		 */ | ||||
| 		if (pp->pp_flags & MV_PP_FLAG_NCQ_EN) { | ||||
| 			/*
 | ||||
| 			 * The host queue (EDMA) is in NCQ mode. | ||||
| 			 * If the new qc is also an NCQ command, | ||||
| 			 * then allow the new qc. | ||||
| 			 */ | ||||
| 			if (qc->tf.protocol == ATA_PROT_NCQ) | ||||
| 				return 0; | ||||
| 		} else { | ||||
| 			/*
 | ||||
| 			 * The host queue (EDMA) is in non-NCQ, DMA mode. | ||||
| 			 * If the new qc is also a non-NCQ, DMA command, | ||||
| 			 * then allow the new qc. | ||||
| 			 */ | ||||
| 			if (qc->tf.protocol == ATA_PROT_DMA) | ||||
| 				return 0; | ||||
| 		} | ||||
| 	} | ||||
| 	/*
 | ||||
| 	 * The port is operating in host queuing mode (EDMA) with NCQ | ||||
| 	 * enabled, allow multiple NCQ commands.  EDMA also allows | ||||
| 	 * queueing multiple DMA commands but libata core currently | ||||
| 	 * doesn't allow it. | ||||
| 	 */ | ||||
| 	if ((pp->pp_flags & MV_PP_FLAG_EDMA_EN) && | ||||
| 	    (pp->pp_flags & MV_PP_FLAG_NCQ_EN) && ata_is_ncq(qc->tf.protocol)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	return ATA_DEFER_PORT; | ||||
| } | ||||
| 
 | ||||
| @ -3036,7 +3022,8 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx) | ||||
| 		break; | ||||
| 	case chip_soc: | ||||
| 		hpriv->ops = &mv_soc_ops; | ||||
| 		hp_flags |= MV_HP_FLAG_SOC | MV_HP_ERRATA_60X1C0; | ||||
| 		hp_flags |= MV_HP_FLAG_SOC | MV_HP_GEN_IIE | | ||||
| 			MV_HP_ERRATA_60X1C0; | ||||
| 		break; | ||||
| 
 | ||||
| 	default: | ||||
|  | ||||
| @ -3,7 +3,6 @@ | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/skbuff.h> | ||||
| #include <linux/errno.h> | ||||
|  | ||||
| @ -295,6 +295,12 @@ int class_for_each_device(struct class *class, struct device *start, | ||||
| 
 | ||||
| 	if (!class) | ||||
| 		return -EINVAL; | ||||
| 	if (!class->p) { | ||||
| 		WARN(1, "%s called for class '%s' before it was initialized", | ||||
| 		     __func__, class->name); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	mutex_lock(&class->p->class_mutex); | ||||
| 	list_for_each_entry(dev, &class->p->class_devices, node) { | ||||
| 		if (start) { | ||||
| @ -344,6 +350,11 @@ struct device *class_find_device(struct class *class, struct device *start, | ||||
| 
 | ||||
| 	if (!class) | ||||
| 		return NULL; | ||||
| 	if (!class->p) { | ||||
| 		WARN(1, "%s called for class '%s' before it was initialized", | ||||
| 		     __func__, class->name); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	mutex_lock(&class->p->class_mutex); | ||||
| 	list_for_each_entry(dev, &class->p->class_devices, node) { | ||||
|  | ||||
| @ -53,7 +53,7 @@ static inline int device_is_not_partition(struct device *dev) | ||||
|  * it is attached to.  If it is not attached to a bus either, an empty | ||||
|  * string will be returned. | ||||
|  */ | ||||
| const char *dev_driver_string(struct device *dev) | ||||
| const char *dev_driver_string(const struct device *dev) | ||||
| { | ||||
| 	return dev->driver ? dev->driver->name : | ||||
| 			(dev->bus ? dev->bus->name : | ||||
| @ -541,6 +541,7 @@ void device_initialize(struct device *dev) | ||||
| 	spin_lock_init(&dev->devres_lock); | ||||
| 	INIT_LIST_HEAD(&dev->devres_head); | ||||
| 	device_init_wakeup(dev, 0); | ||||
| 	device_pm_init(dev); | ||||
| 	set_dev_node(dev, -1); | ||||
| } | ||||
| 
 | ||||
| @ -843,13 +844,19 @@ int device_add(struct device *dev) | ||||
| { | ||||
| 	struct device *parent = NULL; | ||||
| 	struct class_interface *class_intf; | ||||
| 	int error; | ||||
| 	int error = -EINVAL; | ||||
| 
 | ||||
| 	dev = get_device(dev); | ||||
| 	if (!dev || !strlen(dev->bus_id)) { | ||||
| 		error = -EINVAL; | ||||
| 		goto Done; | ||||
| 	} | ||||
| 	if (!dev) | ||||
| 		goto done; | ||||
| 
 | ||||
| 	/* Temporarily support init_name if it is set.
 | ||||
| 	 * It will override bus_id for now */ | ||||
| 	if (dev->init_name) | ||||
| 		dev_set_name(dev, "%s", dev->init_name); | ||||
| 
 | ||||
| 	if (!strlen(dev->bus_id)) | ||||
| 		goto done; | ||||
| 
 | ||||
| 	pr_debug("device: '%s': %s\n", dev->bus_id, __func__); | ||||
| 
 | ||||
| @ -897,9 +904,10 @@ int device_add(struct device *dev) | ||||
| 	error = bus_add_device(dev); | ||||
| 	if (error) | ||||
| 		goto BusError; | ||||
| 	error = device_pm_add(dev); | ||||
| 	error = dpm_sysfs_add(dev); | ||||
| 	if (error) | ||||
| 		goto PMError; | ||||
| 		goto DPMError; | ||||
| 	device_pm_add(dev); | ||||
| 	kobject_uevent(&dev->kobj, KOBJ_ADD); | ||||
| 	bus_attach_device(dev); | ||||
| 	if (parent) | ||||
| @ -917,10 +925,10 @@ int device_add(struct device *dev) | ||||
| 				class_intf->add_dev(dev, class_intf); | ||||
| 		mutex_unlock(&dev->class->p->class_mutex); | ||||
| 	} | ||||
|  Done: | ||||
| done: | ||||
| 	put_device(dev); | ||||
| 	return error; | ||||
|  PMError: | ||||
|  DPMError: | ||||
| 	bus_remove_device(dev); | ||||
|  BusError: | ||||
| 	if (dev->bus) | ||||
| @ -944,7 +952,7 @@ int device_add(struct device *dev) | ||||
| 	cleanup_device_parent(dev); | ||||
| 	if (parent) | ||||
| 		put_device(parent); | ||||
| 	goto Done; | ||||
| 	goto done; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| @ -1007,6 +1015,7 @@ void device_del(struct device *dev) | ||||
| 	struct class_interface *class_intf; | ||||
| 
 | ||||
| 	device_pm_remove(dev); | ||||
| 	dpm_sysfs_remove(dev); | ||||
| 	if (parent) | ||||
| 		klist_del(&dev->knode_parent); | ||||
| 	if (MAJOR(dev->devt)) { | ||||
|  | ||||
| @ -16,9 +16,6 @@ | ||||
| #include <linux/string.h> | ||||
| #include "base.h" | ||||
| 
 | ||||
| #define to_dev(node) container_of(node, struct device, driver_list) | ||||
| 
 | ||||
| 
 | ||||
| static struct device *next_device(struct klist_iter *i) | ||||
| { | ||||
| 	struct klist_node *n = klist_next(i); | ||||
|  | ||||
| @ -67,20 +67,16 @@ void device_pm_unlock(void) | ||||
|  *	device_pm_add - add a device to the list of active devices | ||||
|  *	@dev:	Device to be added to the list | ||||
|  */ | ||||
| int device_pm_add(struct device *dev) | ||||
| void device_pm_add(struct device *dev) | ||||
| { | ||||
| 	int error; | ||||
| 
 | ||||
| 	pr_debug("PM: Adding info for %s:%s\n", | ||||
| 		 dev->bus ? dev->bus->name : "No Bus", | ||||
| 		 kobject_name(&dev->kobj)); | ||||
| 	mutex_lock(&dpm_list_mtx); | ||||
| 	if (dev->parent) { | ||||
| 		if (dev->parent->power.status >= DPM_SUSPENDING) { | ||||
| 			dev_warn(dev, "parent %s is sleeping, will not add\n", | ||||
| 		if (dev->parent->power.status >= DPM_SUSPENDING) | ||||
| 			dev_warn(dev, "parent %s should not be sleeping\n", | ||||
| 				dev->parent->bus_id); | ||||
| 			WARN_ON(true); | ||||
| 		} | ||||
| 	} else if (transition_started) { | ||||
| 		/*
 | ||||
| 		 * We refuse to register parentless devices while a PM | ||||
| @ -89,13 +85,9 @@ int device_pm_add(struct device *dev) | ||||
| 		 */ | ||||
| 		WARN_ON(true); | ||||
| 	} | ||||
| 	error = dpm_sysfs_add(dev); | ||||
| 	if (!error) { | ||||
| 		dev->power.status = DPM_ON; | ||||
| 		list_add_tail(&dev->power.entry, &dpm_list); | ||||
| 	} | ||||
| 
 | ||||
| 	list_add_tail(&dev->power.entry, &dpm_list); | ||||
| 	mutex_unlock(&dpm_list_mtx); | ||||
| 	return error; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| @ -110,7 +102,6 @@ void device_pm_remove(struct device *dev) | ||||
| 		 dev->bus ? dev->bus->name : "No Bus", | ||||
| 		 kobject_name(&dev->kobj)); | ||||
| 	mutex_lock(&dpm_list_mtx); | ||||
| 	dpm_sysfs_remove(dev); | ||||
| 	list_del_init(&dev->power.entry); | ||||
| 	mutex_unlock(&dpm_list_mtx); | ||||
| } | ||||
|  | ||||
| @ -1,3 +1,8 @@ | ||||
| static inline void device_pm_init(struct device *dev) | ||||
| { | ||||
| 	dev->power.status = DPM_ON; | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_PM_SLEEP | ||||
| 
 | ||||
| /*
 | ||||
| @ -11,12 +16,12 @@ static inline struct device *to_device(struct list_head *entry) | ||||
| 	return container_of(entry, struct device, power.entry); | ||||
| } | ||||
| 
 | ||||
| extern int device_pm_add(struct device *); | ||||
| extern void device_pm_add(struct device *); | ||||
| extern void device_pm_remove(struct device *); | ||||
| 
 | ||||
| #else /* CONFIG_PM_SLEEP */ | ||||
| 
 | ||||
| static inline int device_pm_add(struct device *dev) { return 0; } | ||||
| static inline void device_pm_add(struct device *dev) {} | ||||
| static inline void device_pm_remove(struct device *dev) {} | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -571,8 +571,8 @@ out_free: | ||||
| 		list_del(&brd->brd_list); | ||||
| 		brd_free(brd); | ||||
| 	} | ||||
| 	unregister_blkdev(RAMDISK_MAJOR, "ramdisk"); | ||||
| 
 | ||||
| 	unregister_blkdev(RAMDISK_MAJOR, "brd"); | ||||
| 	return -ENOMEM; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -707,15 +707,15 @@ static int __init nbd_init(void) | ||||
| 
 | ||||
| 	BUILD_BUG_ON(sizeof(struct nbd_request) != 28); | ||||
| 
 | ||||
| 	nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL); | ||||
| 	if (!nbd_dev) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	if (max_part < 0) { | ||||
| 		printk(KERN_CRIT "nbd: max_part must be >= 0\n"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL); | ||||
| 	if (!nbd_dev) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	part_shift = 0; | ||||
| 	if (max_part > 0) | ||||
| 		part_shift = fls(max_part); | ||||
| @ -779,6 +779,7 @@ out: | ||||
| 		blk_cleanup_queue(nbd_dev[i].disk->queue); | ||||
| 		put_disk(nbd_dev[i].disk); | ||||
| 	} | ||||
| 	kfree(nbd_dev); | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| @ -795,6 +796,7 @@ static void __exit nbd_cleanup(void) | ||||
| 		} | ||||
| 	} | ||||
| 	unregister_blkdev(NBD_MAJOR, "nbd"); | ||||
| 	kfree(nbd_dev); | ||||
| 	printk(KERN_INFO "nbd: unregistered device at major %d\n", NBD_MAJOR); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -3,8 +3,8 @@ menu "Bluetooth device drivers" | ||||
| 	depends on BT | ||||
| 
 | ||||
| config BT_HCIUSB | ||||
| 	tristate "HCI USB driver" | ||||
| 	depends on USB | ||||
| 	tristate "HCI USB driver (old version)" | ||||
| 	depends on USB && BT_HCIBTUSB=n | ||||
| 	help | ||||
| 	  Bluetooth HCI USB driver. | ||||
| 	  This driver is required if you want to use Bluetooth devices with | ||||
| @ -23,15 +23,13 @@ config BT_HCIUSB_SCO | ||||
| 	  Say Y here to compile support for SCO over HCI USB. | ||||
| 
 | ||||
| config BT_HCIBTUSB | ||||
| 	tristate "HCI USB driver (alternate version)" | ||||
| 	depends on USB && EXPERIMENTAL && BT_HCIUSB=n | ||||
| 	tristate "HCI USB driver" | ||||
| 	depends on USB | ||||
| 	help | ||||
| 	  Bluetooth HCI USB driver. | ||||
| 	  This driver is required if you want to use Bluetooth devices with | ||||
| 	  USB interface. | ||||
| 
 | ||||
|           This driver is still experimental and has no SCO support. | ||||
| 
 | ||||
| 	  Say Y here to compile support for Bluetooth USB devices into the | ||||
| 	  kernel or say M to compile it as module (btusb). | ||||
| 
 | ||||
|  | ||||
| @ -60,7 +60,7 @@ | ||||
| /* ======================== Module parameters ======================== */ | ||||
| 
 | ||||
| 
 | ||||
| MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>, Jose Orlando Pereira <jop@di.uminho.pt>"); | ||||
| MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); | ||||
| MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card"); | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_FIRMWARE("BT3CPCC.bin"); | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
|  * | ||||
|  *  Generic Bluetooth USB driver | ||||
|  * | ||||
|  *  Copyright (C) 2005-2007  Marcel Holtmann <marcel@holtmann.org> | ||||
|  *  Copyright (C) 2005-2008  Marcel Holtmann <marcel@holtmann.org> | ||||
|  * | ||||
|  * | ||||
|  *  This program is free software; you can redistribute it and/or modify | ||||
| @ -41,7 +41,7 @@ | ||||
| #define BT_DBG(D...) | ||||
| #endif | ||||
| 
 | ||||
| #define VERSION "0.2" | ||||
| #define VERSION "0.3" | ||||
| 
 | ||||
| static int ignore_dga; | ||||
| static int ignore_csr; | ||||
| @ -160,12 +160,16 @@ static struct usb_device_id blacklist_table[] = { | ||||
| 	{ }	/* Terminating entry */ | ||||
| }; | ||||
| 
 | ||||
| #define BTUSB_MAX_ISOC_FRAMES	10 | ||||
| 
 | ||||
| #define BTUSB_INTR_RUNNING	0 | ||||
| #define BTUSB_BULK_RUNNING	1 | ||||
| #define BTUSB_ISOC_RUNNING	2 | ||||
| 
 | ||||
| struct btusb_data { | ||||
| 	struct hci_dev       *hdev; | ||||
| 	struct usb_device    *udev; | ||||
| 	struct usb_interface *isoc; | ||||
| 
 | ||||
| 	spinlock_t lock; | ||||
| 
 | ||||
| @ -176,10 +180,15 @@ struct btusb_data { | ||||
| 	struct usb_anchor tx_anchor; | ||||
| 	struct usb_anchor intr_anchor; | ||||
| 	struct usb_anchor bulk_anchor; | ||||
| 	struct usb_anchor isoc_anchor; | ||||
| 
 | ||||
| 	struct usb_endpoint_descriptor *intr_ep; | ||||
| 	struct usb_endpoint_descriptor *bulk_tx_ep; | ||||
| 	struct usb_endpoint_descriptor *bulk_rx_ep; | ||||
| 	struct usb_endpoint_descriptor *isoc_tx_ep; | ||||
| 	struct usb_endpoint_descriptor *isoc_rx_ep; | ||||
| 
 | ||||
| 	int isoc_altsetting; | ||||
| }; | ||||
| 
 | ||||
| static void btusb_intr_complete(struct urb *urb) | ||||
| @ -195,6 +204,8 @@ static void btusb_intr_complete(struct urb *urb) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (urb->status == 0) { | ||||
| 		hdev->stat.byte_rx += urb->actual_length; | ||||
| 
 | ||||
| 		if (hci_recv_fragment(hdev, HCI_EVENT_PKT, | ||||
| 						urb->transfer_buffer, | ||||
| 						urb->actual_length) < 0) { | ||||
| @ -216,7 +227,7 @@ static void btusb_intr_complete(struct urb *urb) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static inline int btusb_submit_intr_urb(struct hci_dev *hdev) | ||||
| static int btusb_submit_intr_urb(struct hci_dev *hdev) | ||||
| { | ||||
| 	struct btusb_data *data = hdev->driver_data; | ||||
| 	struct urb *urb; | ||||
| @ -226,6 +237,9 @@ static inline int btusb_submit_intr_urb(struct hci_dev *hdev) | ||||
| 
 | ||||
| 	BT_DBG("%s", hdev->name); | ||||
| 
 | ||||
| 	if (!data->intr_ep) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	urb = usb_alloc_urb(0, GFP_ATOMIC); | ||||
| 	if (!urb) | ||||
| 		return -ENOMEM; | ||||
| @ -274,6 +288,8 @@ static void btusb_bulk_complete(struct urb *urb) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (urb->status == 0) { | ||||
| 		hdev->stat.byte_rx += urb->actual_length; | ||||
| 
 | ||||
| 		if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT, | ||||
| 						urb->transfer_buffer, | ||||
| 						urb->actual_length) < 0) { | ||||
| @ -295,7 +311,7 @@ static void btusb_bulk_complete(struct urb *urb) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static inline int btusb_submit_bulk_urb(struct hci_dev *hdev) | ||||
| static int btusb_submit_bulk_urb(struct hci_dev *hdev) | ||||
| { | ||||
| 	struct btusb_data *data = hdev->driver_data; | ||||
| 	struct urb *urb; | ||||
| @ -305,6 +321,9 @@ static inline int btusb_submit_bulk_urb(struct hci_dev *hdev) | ||||
| 
 | ||||
| 	BT_DBG("%s", hdev->name); | ||||
| 
 | ||||
| 	if (!data->bulk_rx_ep) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	urb = usb_alloc_urb(0, GFP_KERNEL); | ||||
| 	if (!urb) | ||||
| 		return -ENOMEM; | ||||
| @ -339,6 +358,127 @@ static inline int btusb_submit_bulk_urb(struct hci_dev *hdev) | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| static void btusb_isoc_complete(struct urb *urb) | ||||
| { | ||||
| 	struct hci_dev *hdev = urb->context; | ||||
| 	struct btusb_data *data = hdev->driver_data; | ||||
| 	int i, err; | ||||
| 
 | ||||
| 	BT_DBG("%s urb %p status %d count %d", hdev->name, | ||||
| 					urb, urb->status, urb->actual_length); | ||||
| 
 | ||||
| 	if (!test_bit(HCI_RUNNING, &hdev->flags)) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (urb->status == 0) { | ||||
| 		for (i = 0; i < urb->number_of_packets; i++) { | ||||
| 			unsigned int offset = urb->iso_frame_desc[i].offset; | ||||
| 			unsigned int length = urb->iso_frame_desc[i].actual_length; | ||||
| 
 | ||||
| 			if (urb->iso_frame_desc[i].status) | ||||
| 				continue; | ||||
| 
 | ||||
| 			hdev->stat.byte_rx += length; | ||||
| 
 | ||||
| 			if (hci_recv_fragment(hdev, HCI_SCODATA_PKT, | ||||
| 						urb->transfer_buffer + offset, | ||||
| 								length) < 0) { | ||||
| 				BT_ERR("%s corrupted SCO packet", hdev->name); | ||||
| 				hdev->stat.err_rx++; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags)) | ||||
| 		return; | ||||
| 
 | ||||
| 	usb_anchor_urb(urb, &data->isoc_anchor); | ||||
| 
 | ||||
| 	err = usb_submit_urb(urb, GFP_ATOMIC); | ||||
| 	if (err < 0) { | ||||
| 		BT_ERR("%s urb %p failed to resubmit (%d)", | ||||
| 						hdev->name, urb, -err); | ||||
| 		usb_unanchor_urb(urb); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void inline __fill_isoc_descriptor(struct urb *urb, int len, int mtu) | ||||
| { | ||||
| 	int i, offset = 0; | ||||
| 
 | ||||
| 	BT_DBG("len %d mtu %d", len, mtu); | ||||
| 
 | ||||
| 	for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu; | ||||
| 					i++, offset += mtu, len -= mtu) { | ||||
| 		urb->iso_frame_desc[i].offset = offset; | ||||
| 		urb->iso_frame_desc[i].length = mtu; | ||||
| 	} | ||||
| 
 | ||||
| 	if (len && i < BTUSB_MAX_ISOC_FRAMES) { | ||||
| 		urb->iso_frame_desc[i].offset = offset; | ||||
| 		urb->iso_frame_desc[i].length = len; | ||||
| 		i++; | ||||
| 	} | ||||
| 
 | ||||
| 	urb->number_of_packets = i; | ||||
| } | ||||
| 
 | ||||
| static int btusb_submit_isoc_urb(struct hci_dev *hdev) | ||||
| { | ||||
| 	struct btusb_data *data = hdev->driver_data; | ||||
| 	struct urb *urb; | ||||
| 	unsigned char *buf; | ||||
| 	unsigned int pipe; | ||||
| 	int err, size; | ||||
| 
 | ||||
| 	BT_DBG("%s", hdev->name); | ||||
| 
 | ||||
| 	if (!data->isoc_rx_ep) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL); | ||||
| 	if (!urb) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) * | ||||
| 						BTUSB_MAX_ISOC_FRAMES; | ||||
| 
 | ||||
| 	buf = kmalloc(size, GFP_KERNEL); | ||||
| 	if (!buf) { | ||||
| 		usb_free_urb(urb); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress); | ||||
| 
 | ||||
| 	urb->dev      = data->udev; | ||||
| 	urb->pipe     = pipe; | ||||
| 	urb->context  = hdev; | ||||
| 	urb->complete = btusb_isoc_complete; | ||||
| 	urb->interval = data->isoc_rx_ep->bInterval; | ||||
| 
 | ||||
| 	urb->transfer_flags  = URB_FREE_BUFFER | URB_ISO_ASAP; | ||||
| 	urb->transfer_buffer = buf; | ||||
| 	urb->transfer_buffer_length = size; | ||||
| 
 | ||||
| 	__fill_isoc_descriptor(urb, size, | ||||
| 			le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); | ||||
| 
 | ||||
| 	usb_anchor_urb(urb, &data->isoc_anchor); | ||||
| 
 | ||||
| 	err = usb_submit_urb(urb, GFP_KERNEL); | ||||
| 	if (err < 0) { | ||||
| 		BT_ERR("%s urb %p submission failed (%d)", | ||||
| 						hdev->name, urb, -err); | ||||
| 		usb_unanchor_urb(urb); | ||||
| 		kfree(buf); | ||||
| 	} | ||||
| 
 | ||||
| 	usb_free_urb(urb); | ||||
| 
 | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| static void btusb_tx_complete(struct urb *urb) | ||||
| { | ||||
| 	struct sk_buff *skb = urb->context; | ||||
| @ -392,6 +532,9 @@ static int btusb_close(struct hci_dev *hdev) | ||||
| 	if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	clear_bit(BTUSB_ISOC_RUNNING, &data->flags); | ||||
| 	usb_kill_anchored_urbs(&data->intr_anchor); | ||||
| 
 | ||||
| 	clear_bit(BTUSB_BULK_RUNNING, &data->flags); | ||||
| 	usb_kill_anchored_urbs(&data->bulk_anchor); | ||||
| 
 | ||||
| @ -453,6 +596,9 @@ static int btusb_send_frame(struct sk_buff *skb) | ||||
| 		break; | ||||
| 
 | ||||
| 	case HCI_ACLDATA_PKT: | ||||
| 		if (!data->bulk_tx_ep || hdev->conn_hash.acl_num < 1) | ||||
| 			return -ENODEV; | ||||
| 
 | ||||
| 		urb = usb_alloc_urb(0, GFP_ATOMIC); | ||||
| 		if (!urb) | ||||
| 			return -ENOMEM; | ||||
| @ -467,9 +613,31 @@ static int btusb_send_frame(struct sk_buff *skb) | ||||
| 		break; | ||||
| 
 | ||||
| 	case HCI_SCODATA_PKT: | ||||
| 		if (!data->isoc_tx_ep || hdev->conn_hash.sco_num < 1) | ||||
| 			return -ENODEV; | ||||
| 
 | ||||
| 		urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_ATOMIC); | ||||
| 		if (!urb) | ||||
| 			return -ENOMEM; | ||||
| 
 | ||||
| 		pipe = usb_sndisocpipe(data->udev, | ||||
| 					data->isoc_tx_ep->bEndpointAddress); | ||||
| 
 | ||||
| 		urb->dev      = data->udev; | ||||
| 		urb->pipe     = pipe; | ||||
| 		urb->context  = skb; | ||||
| 		urb->complete = btusb_tx_complete; | ||||
| 		urb->interval = data->isoc_tx_ep->bInterval; | ||||
| 
 | ||||
| 		urb->transfer_flags  = URB_ISO_ASAP; | ||||
| 		urb->transfer_buffer = skb->data; | ||||
| 		urb->transfer_buffer_length = skb->len; | ||||
| 
 | ||||
| 		__fill_isoc_descriptor(urb, skb->len, | ||||
| 				le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); | ||||
| 
 | ||||
| 		hdev->stat.sco_tx++; | ||||
| 		kfree_skb(skb); | ||||
| 		return 0; | ||||
| 		break; | ||||
| 
 | ||||
| 	default: | ||||
| 		return -EILSEQ; | ||||
| @ -508,22 +676,86 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt) | ||||
| 		schedule_work(&data->work); | ||||
| } | ||||
| 
 | ||||
| static int inline __set_isoc_interface(struct hci_dev *hdev, int altsetting) | ||||
| { | ||||
| 	struct btusb_data *data = hdev->driver_data; | ||||
| 	struct usb_interface *intf = data->isoc; | ||||
| 	struct usb_endpoint_descriptor *ep_desc; | ||||
| 	int i, err; | ||||
| 
 | ||||
| 	if (!data->isoc) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	err = usb_set_interface(data->udev, 1, altsetting); | ||||
| 	if (err < 0) { | ||||
| 		BT_ERR("%s setting interface failed (%d)", hdev->name, -err); | ||||
| 		return err; | ||||
| 	} | ||||
| 
 | ||||
| 	data->isoc_altsetting = altsetting; | ||||
| 
 | ||||
| 	data->isoc_tx_ep = NULL; | ||||
| 	data->isoc_rx_ep = NULL; | ||||
| 
 | ||||
| 	for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { | ||||
| 		ep_desc = &intf->cur_altsetting->endpoint[i].desc; | ||||
| 
 | ||||
| 		if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) { | ||||
| 			data->isoc_tx_ep = ep_desc; | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) { | ||||
| 			data->isoc_rx_ep = ep_desc; | ||||
| 			continue; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (!data->isoc_tx_ep || !data->isoc_rx_ep) { | ||||
| 		BT_ERR("%s invalid SCO descriptors", hdev->name); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void btusb_work(struct work_struct *work) | ||||
| { | ||||
| 	struct btusb_data *data = container_of(work, struct btusb_data, work); | ||||
| 	struct hci_dev *hdev = data->hdev; | ||||
| 
 | ||||
| 	if (hdev->conn_hash.acl_num == 0) { | ||||
| 	if (hdev->conn_hash.acl_num > 0) { | ||||
| 		if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) { | ||||
| 			if (btusb_submit_bulk_urb(hdev) < 0) | ||||
| 				clear_bit(BTUSB_BULK_RUNNING, &data->flags); | ||||
| 			else | ||||
| 				btusb_submit_bulk_urb(hdev); | ||||
| 		} | ||||
| 	} else { | ||||
| 		clear_bit(BTUSB_BULK_RUNNING, &data->flags); | ||||
| 		usb_kill_anchored_urbs(&data->bulk_anchor); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) { | ||||
| 		if (btusb_submit_bulk_urb(hdev) < 0) | ||||
| 			clear_bit(BTUSB_BULK_RUNNING, &data->flags); | ||||
| 		else | ||||
| 			btusb_submit_bulk_urb(hdev); | ||||
| 	if (hdev->conn_hash.sco_num > 0) { | ||||
| 		if (data->isoc_altsetting != 2) { | ||||
| 			clear_bit(BTUSB_ISOC_RUNNING, &data->flags); | ||||
| 			usb_kill_anchored_urbs(&data->isoc_anchor); | ||||
| 
 | ||||
| 			if (__set_isoc_interface(hdev, 2) < 0) | ||||
| 				return; | ||||
| 		} | ||||
| 
 | ||||
| 		if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) { | ||||
| 			if (btusb_submit_isoc_urb(hdev) < 0) | ||||
| 				clear_bit(BTUSB_ISOC_RUNNING, &data->flags); | ||||
| 			else | ||||
| 				btusb_submit_isoc_urb(hdev); | ||||
| 		} | ||||
| 	} else { | ||||
| 		clear_bit(BTUSB_ISOC_RUNNING, &data->flags); | ||||
| 		usb_kill_anchored_urbs(&data->isoc_anchor); | ||||
| 
 | ||||
| 		__set_isoc_interface(hdev, 0); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -597,6 +829,7 @@ static int btusb_probe(struct usb_interface *intf, | ||||
| 	init_usb_anchor(&data->tx_anchor); | ||||
| 	init_usb_anchor(&data->intr_anchor); | ||||
| 	init_usb_anchor(&data->bulk_anchor); | ||||
| 	init_usb_anchor(&data->isoc_anchor); | ||||
| 
 | ||||
| 	hdev = hci_alloc_dev(); | ||||
| 	if (!hdev) { | ||||
| @ -620,6 +853,9 @@ static int btusb_probe(struct usb_interface *intf, | ||||
| 
 | ||||
| 	hdev->owner = THIS_MODULE; | ||||
| 
 | ||||
| 	/* interface numbers are hardcoded in the spec */ | ||||
| 	data->isoc = usb_ifnum_to_if(data->udev, 1); | ||||
| 
 | ||||
| 	if (reset || id->driver_info & BTUSB_RESET) | ||||
| 		set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks); | ||||
| 
 | ||||
| @ -628,11 +864,16 @@ static int btusb_probe(struct usb_interface *intf, | ||||
| 			set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks); | ||||
| 	} | ||||
| 
 | ||||
| 	if (id->driver_info & BTUSB_BROKEN_ISOC) | ||||
| 		data->isoc = NULL; | ||||
| 
 | ||||
| 	if (id->driver_info & BTUSB_SNIFFER) { | ||||
| 		struct usb_device *udev = interface_to_usbdev(intf); | ||||
| 		struct usb_device *udev = data->udev; | ||||
| 
 | ||||
| 		if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997) | ||||
| 			set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); | ||||
| 
 | ||||
| 		data->isoc = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	if (id->driver_info & BTUSB_BCM92035) { | ||||
| @ -646,6 +887,16 @@ static int btusb_probe(struct usb_interface *intf, | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (data->isoc) { | ||||
| 		err = usb_driver_claim_interface(&btusb_driver, | ||||
| 							data->isoc, NULL); | ||||
| 		if (err < 0) { | ||||
| 			hci_free_dev(hdev); | ||||
| 			kfree(data); | ||||
| 			return err; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	err = hci_register_dev(hdev); | ||||
| 	if (err < 0) { | ||||
| 		hci_free_dev(hdev); | ||||
| @ -670,6 +921,9 @@ static void btusb_disconnect(struct usb_interface *intf) | ||||
| 
 | ||||
| 	hdev = data->hdev; | ||||
| 
 | ||||
| 	if (data->isoc) | ||||
| 		usb_driver_release_interface(&btusb_driver, data->isoc); | ||||
| 
 | ||||
| 	usb_set_intfdata(intf, NULL); | ||||
| 
 | ||||
| 	hci_unregister_dev(hdev); | ||||
|  | ||||
| @ -577,7 +577,7 @@ module_exit(hci_uart_exit); | ||||
| module_param(reset, bool, 0644); | ||||
| MODULE_PARM_DESC(reset, "Send HCI reset command on initialization"); | ||||
| 
 | ||||
| MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | ||||
| MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); | ||||
| MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION); | ||||
| MODULE_VERSION(VERSION); | ||||
| MODULE_LICENSE("GPL"); | ||||
|  | ||||
| @ -1130,7 +1130,7 @@ module_param(isoc, int, 0644); | ||||
| MODULE_PARM_DESC(isoc, "Set isochronous transfers for SCO over HCI support"); | ||||
| #endif | ||||
| 
 | ||||
| MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | ||||
| MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); | ||||
| MODULE_DESCRIPTION("Bluetooth HCI USB driver ver " VERSION); | ||||
| MODULE_VERSION(VERSION); | ||||
| MODULE_LICENSE("GPL"); | ||||
|  | ||||
| @ -377,7 +377,7 @@ module_exit(vhci_exit); | ||||
| module_param(minor, int, 0444); | ||||
| MODULE_PARM_DESC(minor, "Miscellaneous minor device number"); | ||||
| 
 | ||||
| MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | ||||
| MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); | ||||
| MODULE_DESCRIPTION("Bluetooth virtual HCI driver ver " VERSION); | ||||
| MODULE_VERSION(VERSION); | ||||
| MODULE_LICENSE("GPL"); | ||||
|  | ||||
| @ -2695,15 +2695,13 @@ static __devinit void default_find_bmc(void) | ||||
| 	for (i = 0; ; i++) { | ||||
| 		if (!ipmi_defaults[i].port) | ||||
| 			break; | ||||
| 
 | ||||
| 		info = kzalloc(sizeof(*info), GFP_KERNEL); | ||||
| 		if (!info) | ||||
| 			return; | ||||
| 
 | ||||
| #ifdef CONFIG_PPC_MERGE | ||||
| 		if (check_legacy_ioport(ipmi_defaults[i].port)) | ||||
| 			continue; | ||||
| #endif | ||||
| 		info = kzalloc(sizeof(*info), GFP_KERNEL); | ||||
| 		if (!info) | ||||
| 			return; | ||||
| 
 | ||||
| 		info->addr_source = NULL; | ||||
| 
 | ||||
|  | ||||
| @ -1571,6 +1571,7 @@ u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport) | ||||
| 
 | ||||
| 	return half_md4_transform(hash, keyptr->secret); | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral); | ||||
| 
 | ||||
| #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||||
| u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | ||||
|  | ||||
| @ -38,7 +38,6 @@ | ||||
| 
 | ||||
| #include <linux/types.h> | ||||
| #include <linux/cdev.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/platform_device.h> | ||||
| 
 | ||||
| #include <asm/io.h> | ||||
|  | ||||
| @ -38,7 +38,6 @@ | ||||
| 
 | ||||
| #include <linux/types.h> | ||||
| #include <linux/cdev.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/platform_device.h> | ||||
| 
 | ||||
| #include <asm/io.h> | ||||
|  | ||||
| @ -38,7 +38,6 @@ | ||||
| 
 | ||||
| #include <linux/types.h> | ||||
| #include <linux/cdev.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/platform_device.h> | ||||
| 
 | ||||
| #include <asm/io.h> | ||||
|  | ||||
| @ -34,7 +34,6 @@ | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/sysdev.h> | ||||
| #include <linux/workqueue.h> | ||||
| #include <linux/version.h> | ||||
| 
 | ||||
| #define EDAC_MC_LABEL_LEN	31 | ||||
| #define EDAC_DEVICE_NAME_LEN	31 | ||||
|  | ||||
| @ -12,8 +12,8 @@ config FIREWIRE | ||||
| 	  This is the "Juju" FireWire stack, a new alternative implementation | ||||
| 	  designed for robustness and simplicity.  You can build either this | ||||
| 	  stack, or the old stack (the ieee1394 driver, ohci1394 etc.) or both. | ||||
| 	  Please read http://wiki.linux1394.org/JujuMigration before you | ||||
| 	  enable the new stack. | ||||
| 	  Please read http://ieee1394.wiki.kernel.org/index.php/Juju_Migration | ||||
| 	  before you enable the new stack. | ||||
| 
 | ||||
| 	  To compile this driver as a module, say M here: the module will be | ||||
| 	  called firewire-core. | ||||
|  | ||||
| @ -14,7 +14,6 @@ | ||||
| */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/err.h> | ||||
| #include <linux/slab.h> | ||||
|  | ||||
| @ -844,7 +844,7 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr | ||||
| 	ne->host = host; | ||||
| 	ne->nodeid = nodeid; | ||||
| 	ne->generation = generation; | ||||
| 	ne->needs_probe = 1; | ||||
| 	ne->needs_probe = true; | ||||
| 
 | ||||
| 	ne->guid = guid; | ||||
| 	ne->guid_vendor_id = (guid >> 40) & 0xffffff; | ||||
| @ -1144,7 +1144,7 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent | ||||
| 	struct csr1212_keyval *kv, *vendor_name_kv = NULL; | ||||
| 	u8 last_key_id = 0; | ||||
| 
 | ||||
| 	ne->needs_probe = 0; | ||||
| 	ne->needs_probe = false; | ||||
| 
 | ||||
| 	csr1212_for_each_dir_entry(ne->csr, kv, ne->csr->root_kv, dentry) { | ||||
| 		switch (kv->key.id) { | ||||
| @ -1295,7 +1295,7 @@ static void nodemgr_update_node(struct node_entry *ne, struct csr1212_csr *csr, | ||||
| 		nodemgr_update_bus_options(ne); | ||||
| 
 | ||||
| 		/* Mark the node as new, so it gets re-probed */ | ||||
| 		ne->needs_probe = 1; | ||||
| 		ne->needs_probe = true; | ||||
| 	} else { | ||||
| 		/* old cache is valid, so update its generation */ | ||||
| 		struct nodemgr_csr_info *ci = ne->csr->private; | ||||
| @ -1566,57 +1566,60 @@ static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int ge | ||||
| struct probe_param { | ||||
| 	struct host_info *hi; | ||||
| 	int generation; | ||||
| 	bool probe_now; | ||||
| }; | ||||
| 
 | ||||
| static int __nodemgr_node_probe(struct device *dev, void *data) | ||||
| static int node_probe(struct device *dev, void *data) | ||||
| { | ||||
| 	struct probe_param *param = (struct probe_param *)data; | ||||
| 	struct probe_param *p = data; | ||||
| 	struct node_entry *ne; | ||||
| 
 | ||||
| 	if (p->generation != get_hpsb_generation(p->hi->host)) | ||||
| 		return -EAGAIN; | ||||
| 
 | ||||
| 	ne = container_of(dev, struct node_entry, node_dev); | ||||
| 	if (!ne->needs_probe) | ||||
| 		nodemgr_probe_ne(param->hi, ne, param->generation); | ||||
| 	if (ne->needs_probe) | ||||
| 		nodemgr_probe_ne(param->hi, ne, param->generation); | ||||
| 	if (ne->needs_probe == p->probe_now) | ||||
| 		nodemgr_probe_ne(p->hi, ne, p->generation); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void nodemgr_node_probe(struct host_info *hi, int generation) | ||||
| { | ||||
| 	struct hpsb_host *host = hi->host; | ||||
| 	struct probe_param param; | ||||
| 	struct probe_param p; | ||||
| 
 | ||||
| 	param.hi = hi; | ||||
| 	param.generation = generation; | ||||
| 	/* Do some processing of the nodes we've probed. This pulls them
 | ||||
| 	p.hi = hi; | ||||
| 	p.generation = generation; | ||||
| 	/*
 | ||||
| 	 * Do some processing of the nodes we've probed. This pulls them | ||||
| 	 * into the sysfs layer if needed, and can result in processing of | ||||
| 	 * unit-directories, or just updating the node and it's | ||||
| 	 * unit-directories. | ||||
| 	 * | ||||
| 	 * Run updates before probes. Usually, updates are time-critical | ||||
| 	 * while probes are time-consuming. (Well, those probes need some | ||||
| 	 * improvement...) */ | ||||
| 
 | ||||
| 	class_for_each_device(&nodemgr_ne_class, NULL, ¶m, | ||||
| 			      __nodemgr_node_probe); | ||||
| 
 | ||||
| 	/* If we had a bus reset while we were scanning the bus, it is
 | ||||
| 	 * possible that we did not probe all nodes.  In that case, we | ||||
| 	 * skip the clean up for now, since we could remove nodes that | ||||
| 	 * were still on the bus.  Another bus scan is pending which will | ||||
| 	 * do the clean up eventually. | ||||
| 	 * while probes are time-consuming. | ||||
| 	 * | ||||
| 	 * Meanwhile, another bus reset may have happened. In this case we | ||||
| 	 * skip everything here and let the next bus scan handle it. | ||||
| 	 * Otherwise we may prematurely remove nodes which are still there. | ||||
| 	 */ | ||||
| 	p.probe_now = false; | ||||
| 	if (class_for_each_device(&nodemgr_ne_class, NULL, &p, node_probe) != 0) | ||||
| 		return; | ||||
| 
 | ||||
| 	p.probe_now = true; | ||||
| 	if (class_for_each_device(&nodemgr_ne_class, NULL, &p, node_probe) != 0) | ||||
| 		return; | ||||
| 	/*
 | ||||
| 	 * Now let's tell the bus to rescan our devices. This may seem | ||||
| 	 * like overhead, but the driver-model core will only scan a | ||||
| 	 * device for a driver when either the device is added, or when a | ||||
| 	 * new driver is added. A bus reset is a good reason to rescan | ||||
| 	 * devices that were there before.  For example, an sbp2 device | ||||
| 	 * may become available for login, if the host that held it was | ||||
| 	 * just removed.  */ | ||||
| 
 | ||||
| 	if (generation == get_hpsb_generation(host)) | ||||
| 		if (bus_rescan_devices(&ieee1394_bus_type)) | ||||
| 			HPSB_DEBUG("bus_rescan_devices had an error"); | ||||
| 	 * just removed. | ||||
| 	 */ | ||||
| 	if (bus_rescan_devices(&ieee1394_bus_type) != 0) | ||||
| 		HPSB_DEBUG("bus_rescan_devices had an error"); | ||||
| } | ||||
| 
 | ||||
| static int nodemgr_send_resume_packet(struct hpsb_host *host) | ||||
|  | ||||
| @ -97,7 +97,7 @@ struct node_entry { | ||||
| 	struct hpsb_host *host;		/* Host this node is attached to */ | ||||
| 	nodeid_t nodeid;		/* NodeID */ | ||||
| 	struct bus_options busopt;	/* Bus Options */ | ||||
| 	int needs_probe; | ||||
| 	bool needs_probe; | ||||
| 	unsigned int generation;	/* Synced with hpsb generation */ | ||||
| 
 | ||||
| 	/* The following is read from the config rom */ | ||||
|  | ||||
| @ -731,15 +731,26 @@ static int sbp2_update(struct unit_directory *ud) | ||||
| { | ||||
| 	struct sbp2_lu *lu = ud->device.driver_data; | ||||
| 
 | ||||
| 	if (sbp2_reconnect_device(lu)) { | ||||
| 		/* Reconnect has failed. Perhaps we didn't reconnect fast
 | ||||
| 		 * enough. Try a regular login, but first log out just in | ||||
| 		 * case of any weirdness. */ | ||||
| 	if (sbp2_reconnect_device(lu) != 0) { | ||||
| 		/*
 | ||||
| 		 * Reconnect failed.  If another bus reset happened, | ||||
| 		 * let nodemgr proceed and call sbp2_update again later | ||||
| 		 * (or sbp2_remove if this node went away). | ||||
| 		 */ | ||||
| 		if (!hpsb_node_entry_valid(lu->ne)) | ||||
| 			return 0; | ||||
| 		/*
 | ||||
| 		 * Or the target rejected the reconnect because we weren't | ||||
| 		 * fast enough.  Try a regular login, but first log out | ||||
| 		 * just in case of any weirdness. | ||||
| 		 */ | ||||
| 		sbp2_logout_device(lu); | ||||
| 
 | ||||
| 		if (sbp2_login_device(lu)) { | ||||
| 			/* Login failed too, just fail, and the backend
 | ||||
| 			 * will call our sbp2_remove for us */ | ||||
| 		if (sbp2_login_device(lu) != 0) { | ||||
| 			if (!hpsb_node_entry_valid(lu->ne)) | ||||
| 				return 0; | ||||
| 
 | ||||
| 			/* Maybe another initiator won the login. */ | ||||
| 			SBP2_ERR("Failed to reconnect to sbp2 device!"); | ||||
| 			return -EBUSY; | ||||
| 		} | ||||
|  | ||||
| @ -54,7 +54,6 @@ | ||||
| #include <linux/module.h> | ||||
| #include <linux/moduleparam.h> | ||||
| #include <linux/vmalloc.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/notifier.h> | ||||
| #include <linux/cpu.h> | ||||
| #include <linux/device.h> | ||||
|  | ||||
| @ -31,7 +31,6 @@ | ||||
|  * SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/version.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/fs.h> | ||||
| #include <linux/mount.h> | ||||
|  | ||||
| @ -1720,7 +1720,7 @@ static void ipath_7220_put_tid(struct ipath_devdata *dd, u64 __iomem *tidptr, | ||||
| 				 "not 2KB aligned!\n", pa); | ||||
| 			return; | ||||
| 		} | ||||
| 		if (pa >= (1UL << IBA7220_TID_SZ_SHIFT)) { | ||||
| 		if (chippa >= (1UL << IBA7220_TID_SZ_SHIFT)) { | ||||
| 			ipath_dev_err(dd, | ||||
| 				      "BUG: Physical page address 0x%lx " | ||||
| 				      "larger than supported\n", pa); | ||||
|  | ||||
| @ -267,6 +267,7 @@ int ipath_make_ud_req(struct ipath_qp *qp) | ||||
| 	u16 lrh0; | ||||
| 	u16 lid; | ||||
| 	int ret = 0; | ||||
| 	int next_cur; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&qp->s_lock, flags); | ||||
| 
 | ||||
| @ -290,8 +291,9 @@ int ipath_make_ud_req(struct ipath_qp *qp) | ||||
| 		goto bail; | ||||
| 
 | ||||
| 	wqe = get_swqe_ptr(qp, qp->s_cur); | ||||
| 	if (++qp->s_cur >= qp->s_size) | ||||
| 		qp->s_cur = 0; | ||||
| 	next_cur = qp->s_cur + 1; | ||||
| 	if (next_cur >= qp->s_size) | ||||
| 		next_cur = 0; | ||||
| 
 | ||||
| 	/* Construct the header. */ | ||||
| 	ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr; | ||||
| @ -315,6 +317,7 @@ int ipath_make_ud_req(struct ipath_qp *qp) | ||||
| 				qp->s_flags |= IPATH_S_WAIT_DMA; | ||||
| 				goto bail; | ||||
| 			} | ||||
| 			qp->s_cur = next_cur; | ||||
| 			spin_unlock_irqrestore(&qp->s_lock, flags); | ||||
| 			ipath_ud_loopback(qp, wqe); | ||||
| 			spin_lock_irqsave(&qp->s_lock, flags); | ||||
| @ -323,6 +326,7 @@ int ipath_make_ud_req(struct ipath_qp *qp) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	qp->s_cur = next_cur; | ||||
| 	extra_bytes = -wqe->length & 3; | ||||
| 	nwords = (wqe->length + extra_bytes) >> 2; | ||||
| 
 | ||||
|  | ||||
| @ -43,7 +43,6 @@ | ||||
| #include <linux/dma-mapping.h> | ||||
| #include <linux/workqueue.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/version.h> | ||||
| #include <asm/io.h> | ||||
| #include <linux/crc32c.h> | ||||
| 
 | ||||
|  | ||||
| @ -156,14 +156,8 @@ static int ipoib_stop(struct net_device *dev) | ||||
| 
 | ||||
| 	netif_stop_queue(dev); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Now flush workqueue to make sure a scheduled task doesn't | ||||
| 	 * bring our internal state back up. | ||||
| 	 */ | ||||
| 	flush_workqueue(ipoib_workqueue); | ||||
| 
 | ||||
| 	ipoib_ib_dev_down(dev, 1); | ||||
| 	ipoib_ib_dev_stop(dev, 1); | ||||
| 	ipoib_ib_dev_down(dev, 0); | ||||
| 	ipoib_ib_dev_stop(dev, 0); | ||||
| 
 | ||||
| 	if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { | ||||
| 		struct ipoib_dev_priv *cpriv; | ||||
| @ -1314,7 +1308,7 @@ sysfs_failed: | ||||
| 
 | ||||
| register_failed: | ||||
| 	ib_unregister_event_handler(&priv->event_handler); | ||||
| 	flush_scheduled_work(); | ||||
| 	flush_workqueue(ipoib_workqueue); | ||||
| 
 | ||||
| event_failed: | ||||
| 	ipoib_dev_cleanup(priv->dev); | ||||
| @ -1373,7 +1367,12 @@ static void ipoib_remove_one(struct ib_device *device) | ||||
| 
 | ||||
| 	list_for_each_entry_safe(priv, tmp, dev_list, list) { | ||||
| 		ib_unregister_event_handler(&priv->event_handler); | ||||
| 		flush_scheduled_work(); | ||||
| 
 | ||||
| 		rtnl_lock(); | ||||
| 		dev_change_flags(priv->dev, priv->dev->flags & ~IFF_UP); | ||||
| 		rtnl_unlock(); | ||||
| 
 | ||||
| 		flush_workqueue(ipoib_workqueue); | ||||
| 
 | ||||
| 		unregister_netdev(priv->dev); | ||||
| 		ipoib_dev_cleanup(priv->dev); | ||||
|  | ||||
| @ -392,8 +392,16 @@ static int ipoib_mcast_join_complete(int status, | ||||
| 					   &priv->mcast_task, 0); | ||||
| 		mutex_unlock(&mcast_mutex); | ||||
| 
 | ||||
| 		if (mcast == priv->broadcast) | ||||
| 		if (mcast == priv->broadcast) { | ||||
| 			/*
 | ||||
| 			 * Take RTNL lock here to avoid racing with | ||||
| 			 * ipoib_stop() and turning the carrier back | ||||
| 			 * on while a device is being removed. | ||||
| 			 */ | ||||
| 			rtnl_lock(); | ||||
| 			netif_carrier_on(dev); | ||||
| 			rtnl_unlock(); | ||||
| 		} | ||||
| 
 | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| @ -33,7 +33,6 @@ | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/delay.h> | ||||
| #include <linux/version.h> | ||||
| 
 | ||||
| #include "iscsi_iser.h" | ||||
| 
 | ||||
|  | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user