diff options
766 files changed, 24845 insertions, 24738 deletions
@@ -3738,7 +3738,7 @@ S: 93149 Nittenau  S: Germany  N: Gertjan van Wingerde -E: gwingerde@home.nl +E: gwingerde@gmail.com  D: Ralink rt2x00 WLAN driver  D: Minix V2 file-system  D: Misc fixes diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt index 6e253407b3d..accfe2f5247 100644 --- a/Documentation/RCU/checklist.txt +++ b/Documentation/RCU/checklist.txt @@ -298,3 +298,15 @@ over a rather long period of time, but improvements are always welcome!  	Note that, rcu_assign_pointer() and rcu_dereference() relate to  	SRCU just as they do to other forms of RCU. + +15.	The whole point of call_rcu(), synchronize_rcu(), and friends +	is to wait until all pre-existing readers have finished before +	carrying out some otherwise-destructive operation.  It is +	therefore critically important to -first- remove any path +	that readers can follow that could be affected by the +	destructive operation, and -only- -then- invoke call_rcu(), +	synchronize_rcu(), or friends. + +	Because these primitives only wait for pre-existing readers, +	it is the caller's responsibility to guarantee safety to +	any subsequent readers. diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 5ddbe350487..20d3b94703a 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt @@ -335,3 +335,12 @@ Why:	In 2.6.18 the Secmark concept was introduced to replace the "compat_net"  	Secmark, it is time to deprecate the older mechanism and start the  	process of removing the old code.  Who:	Paul Moore <paul.moore@hp.com> +--------------------------- + +What:	sysfs ui for changing p4-clockmod parameters +When:	September 2009 +Why:	See commits 129f8ae9b1b5be94517da76009ea956e89104ce8 and +	e088e4c9cdb618675874becb91b2fd581ee707e6. +	Removal is subject to fixing any remaining bugs in ACPI which may +	cause the thermal throttling not to happen at the right time. +Who:	Dave Jones <davej@redhat.com>, Matthew Garrett <mjg@redhat.com> diff --git a/Documentation/filesystems/ext2.txt b/Documentation/filesystems/ext2.txt index 4333e836c49..e055acb6b2d 100644 --- a/Documentation/filesystems/ext2.txt +++ b/Documentation/filesystems/ext2.txt @@ -373,10 +373,11 @@ Filesystem Resizing	http://ext2resize.sourceforge.net/  Compression (*)		http://e2compr.sourceforge.net/  Implementations for: -Windows 95/98/NT/2000	http://uranus.it.swin.edu.au/~jn/linux/Explore2fs.htm -Windows 95 (*)		http://www.yipton.demon.co.uk/content.html#FSDEXT2 +Windows 95/98/NT/2000	http://www.chrysocome.net/explore2fs +Windows 95 (*)		http://www.yipton.net/content.html#FSDEXT2  DOS client (*)		ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2/ -OS/2			http://perso.wanadoo.fr/matthieu.willm/ext2-os2/ -RISC OS client		ftp://ftp.barnet.ac.uk/pub/acorn/armlinux/iscafs/ +OS/2 (+)		ftp://metalab.unc.edu/pub/Linux/system/filesystems/ext2/ +RISC OS client		http://www.esw-heim.tu-clausthal.de/~marco/smorbrod/IscaFS/  (*) no longer actively developed/supported (as of Apr 2001) +(+) no longer actively developed/supported (as of Mar 2009) diff --git a/Documentation/filesystems/ext3.txt b/Documentation/filesystems/ext3.txt index 9dd2a3bb2ac..e5f3833a6ef 100644 --- a/Documentation/filesystems/ext3.txt +++ b/Documentation/filesystems/ext3.txt @@ -198,5 +198,5 @@ kernel source:	<file:fs/ext3/>  programs: 	http://e2fsprogs.sourceforge.net/  		http://ext2resize.sourceforge.net -useful links:	http://www-106.ibm.com/developerworks/linux/library/l-fs7/ -		http://www-106.ibm.com/developerworks/linux/library/l-fs8/ +useful links:	http://www.ibm.com/developerworks/library/l-fs7.html +		http://www.ibm.com/developerworks/library/l-fs8.html diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt index a87be42f821..830bad7cce0 100644 --- a/Documentation/filesystems/proc.txt +++ b/Documentation/filesystems/proc.txt @@ -1478,6 +1478,13 @@ of problems on the network like duplicate address or bad checksums. Normally,  this should be enabled, but if the problem persists the messages can be  disabled. +netdev_budget +------------- + +Maximum number of packets taken from all interfaces in one polling cycle (NAPI +poll). In one polling cycle interfaces which are registered to polling are +probed in a round-robin manner. The limit of packets in one such probe can be +set per-device via sysfs class/net/<device>/weight .  netdev_max_backlog  ------------------ diff --git a/Documentation/filesystems/squashfs.txt b/Documentation/filesystems/squashfs.txt index 3e79e4a7a39..b324c033035 100644 --- a/Documentation/filesystems/squashfs.txt +++ b/Documentation/filesystems/squashfs.txt @@ -22,7 +22,7 @@ Squashfs filesystem features versus Cramfs:  				Squashfs		Cramfs -Max filesystem size:		2^64			16 MiB +Max filesystem size:		2^64			256 MiB  Max file size:			~ 2 TiB			16 MiB  Max files:			unlimited		unlimited  Max directories:		unlimited		unlimited diff --git a/Documentation/hwmon/lm90 b/Documentation/hwmon/lm90 index 0e841171023..93d8e3d5515 100644 --- a/Documentation/hwmon/lm90 +++ b/Documentation/hwmon/lm90 @@ -42,6 +42,11 @@ Supported chips:      Addresses scanned: I2C 0x4e      Datasheet: Publicly available at the Maxim website                 http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3497 +  * Maxim MAX6648 +    Prefix: 'max6646' +    Addresses scanned: I2C 0x4c +    Datasheet: Publicly available at the Maxim website +               http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3500    * Maxim MAX6649      Prefix: 'max6646'      Addresses scanned: I2C 0x4c @@ -74,6 +79,11 @@ Supported chips:                             0x4c, 0x4d and 0x4e      Datasheet: Publicly available at the Maxim website                 http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3370 +  * Maxim MAX6692 +    Prefix: 'max6646' +    Addresses scanned: I2C 0x4c +    Datasheet: Publicly available at the Maxim website +               http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3500  Author: Jean Delvare <khali@linux-fr.org> diff --git a/Documentation/logo.gif b/Documentation/logo.gif Binary files differdeleted file mode 100644 index 2eae75fecfb..00000000000 --- a/Documentation/logo.gif +++ /dev/null diff --git a/Documentation/logo.svg b/Documentation/logo.svg new file mode 100644 index 00000000000..cb9e4851d8c --- /dev/null +++ b/Documentation/logo.svg @@ -0,0 +1,2911 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg +   xmlns:dc="http://purl.org/dc/elements/1.1/" +   xmlns:cc="http://creativecommons.org/ns#" +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" +   xmlns:svg="http://www.w3.org/2000/svg" +   xmlns="http://www.w3.org/2000/svg" +   xmlns:xlink="http://www.w3.org/1999/xlink" +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" +   width="1771.6534" +   height="1417.3228" +   id="svg2" +   sodipodi:version="0.32" +   inkscape:version="0.46" +   sodipodi:docname="tuz.svg" +   inkscape:output_extension="org.inkscape.output.svg.inkscape" +   version="1.0" +   style="display:inline;enable-background:new" +   inkscape:export-filename="/home/cheeseness/Documents/LCA09/mascot/tuz_final.png" +   inkscape:export-xdpi="100.03588" +   inkscape:export-ydpi="100.03588"> +  <sodipodi:namedview +     id="base" +     pagecolor="#ffffff" +     bordercolor="#666666" +     borderopacity="1.0" +     gridtolerance="10000" +     guidetolerance="10" +     objecttolerance="10" +     inkscape:pageopacity="0.0" +     inkscape:pageshadow="2" +     inkscape:zoom="0.25" +     inkscape:cx="-174.7931" +     inkscape:cy="784.26325" +     inkscape:document-units="px" +     inkscape:current-layer="svg2" +     showgrid="false" +     inkscape:window-width="1280" +     inkscape:window-height="823" +     inkscape:window-x="-4" +     inkscape:window-y="25" +     showguides="true" +     inkscape:guide-bbox="true" +     units="mm" /> +  <defs +     id="defs4"> +    <filter +       inkscape:collect="always" +       x="-0.084654994" +       width="1.16931" +       y="-0.36592469" +       height="1.7318494" +       id="filter11361"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="4.5740586" +         id="feGaussianBlur11363" /> +    </filter> +    <inkscape:perspective +       sodipodi:type="inkscape:persp3d" +       inkscape:vp_x="0 : 564.0976 : 1" +       inkscape:vp_y="0 : 1000 : 0" +       inkscape:vp_z="1445.8591 : 564.0976 : 1" +       inkscape:persp3d-origin="722.92957 : 376.06506 : 1" +       id="perspective8145" /> +    <linearGradient +       id="linearGradient7622"> +      <stop +         style="stop-color:#ffffff;stop-opacity:1;" +         offset="0" +         id="stop7624" /> +      <stop +         style="stop-color:#ffffff;stop-opacity:0;" +         offset="1" +         id="stop7626" /> +    </linearGradient> +    <linearGradient +       id="linearGradient4113"> +      <stop +         style="stop-color:#000000;stop-opacity:0;" +         offset="0" +         id="stop4115" /> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="1" +         id="stop4117" /> +    </linearGradient> +    <linearGradient +       inkscape:collect="always" +       id="linearGradient3660"> +      <stop +         style="stop-color:#ffffff;stop-opacity:1;" +         offset="0" +         id="stop3662" /> +      <stop +         style="stop-color:#ffffff;stop-opacity:0;" +         offset="1" +         id="stop3664" /> +    </linearGradient> +    <linearGradient +       id="linearGradient3627"> +      <stop +         style="stop-color:#ffffff;stop-opacity:1;" +         offset="0" +         id="stop3629" /> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="1" +         id="stop3631" /> +    </linearGradient> +    <linearGradient +       id="linearGradient2843"> +      <stop +         id="stop2845" +         offset="0" +         style="stop-color:#000000;stop-opacity:1;" /> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="0.02188784" +         id="stop2847" /> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="0.75866222" +         id="stop2849" /> +      <stop +         id="stop2851" +         offset="0.88508981" +         style="stop-color:#232323;stop-opacity:1;" /> +      <stop +         id="stop2853" +         offset="1" +         style="stop-color:#595959;stop-opacity:1;" /> +    </linearGradient> +    <linearGradient +       inkscape:collect="always" +       id="linearGradient8964"> +      <stop +         style="stop-color:#1a1a1a;stop-opacity:1;" +         offset="0" +         id="stop8966" /> +      <stop +         style="stop-color:#1a1a1a;stop-opacity:0;" +         offset="1" +         id="stop8968" /> +    </linearGradient> +    <linearGradient +       id="linearGradient8952"> +      <stop +         style="stop-color:#0a0c0c;stop-opacity:1;" +         offset="0" +         id="stop8954" /> +      <stop +         style="stop-color:#1f2727;stop-opacity:0;" +         offset="1" +         id="stop8956" /> +    </linearGradient> +    <linearGradient +       id="linearGradient8430"> +      <stop +         style="stop-color:#1e2323;stop-opacity:1;" +         offset="0" +         id="stop8432" /> +      <stop +         id="stop8438" +         offset="0.55992389" +         style="stop-color:#181d1d;stop-opacity:1;" /> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="1" +         id="stop8434" /> +    </linearGradient> +    <linearGradient +       id="linearGradient8398"> +      <stop +         style="stop-color:#283131;stop-opacity:0;" +         offset="0" +         id="stop8400" /> +      <stop +         id="stop8402" +         offset="0.5125587" +         style="stop-color:#1e2424;stop-opacity:0;" /> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="1" +         id="stop8404" /> +    </linearGradient> +    <linearGradient +       inkscape:collect="always" +       id="linearGradient4870"> +      <stop +         style="stop-color:#c7bd80;stop-opacity:1;" +         offset="0" +         id="stop4872" /> +      <stop +         style="stop-color:#c7bd80;stop-opacity:0;" +         offset="1" +         id="stop4874" /> +    </linearGradient> +    <linearGradient +       inkscape:collect="always" +       id="linearGradient4862"> +      <stop +         style="stop-color:#e2e2e2;stop-opacity:1;" +         offset="0" +         id="stop4864" /> +      <stop +         style="stop-color:#e2e2e2;stop-opacity:0;" +         offset="1" +         id="stop4866" /> +    </linearGradient> +    <linearGradient +       id="linearGradient4478"> +      <stop +         style="stop-color:#f9eed3;stop-opacity:1;" +         offset="0" +         id="stop4480" /> +      <stop +         style="stop-color:#000000;stop-opacity:0;" +         offset="1" +         id="stop4482" /> +    </linearGradient> +    <linearGradient +       id="linearGradient4106"> +      <stop +         style="stop-color:#d9e002;stop-opacity:1;" +         offset="0" +         id="stop4108" /> +      <stop +         id="stop4114" +         offset="0.5" +         style="stop-color:#a9ae01;stop-opacity:1;" /> +      <stop +         style="stop-color:#717501;stop-opacity:1;" +         offset="1" +         id="stop4110" /> +    </linearGradient> +    <linearGradient +       id="linearGradient4084"> +      <stop +         style="stop-color:#7d7d00;stop-opacity:1;" +         offset="0" +         id="stop4086" /> +      <stop +         id="stop4088" +         offset="0.3636601" +         style="stop-color:#c6c700;stop-opacity:1;" /> +      <stop +         style="stop-color:#f6f800;stop-opacity:1;" +         offset="1" +         id="stop4090" /> +    </linearGradient> +    <linearGradient +       id="linearGradient4041"> +      <stop +         id="stop4043" +         offset="0" +         style="stop-color:#ffff00;stop-opacity:1;" /> +      <stop +         id="stop4045" +         offset="1" +         style="stop-color:#ffff00;stop-opacity:0;" /> +    </linearGradient> +    <linearGradient +       id="linearGradient4025"> +      <stop +         style="stop-color:#ffffff;stop-opacity:1;" +         offset="0" +         id="stop4027" /> +      <stop +         style="stop-color:#ffffff;stop-opacity:0;" +         offset="1" +         id="stop4031" /> +    </linearGradient> +    <linearGradient +       id="linearGradient4013"> +      <stop +         style="stop-color:#ffff00;stop-opacity:1;" +         offset="0" +         id="stop4015" /> +      <stop +         style="stop-color:#b2b200;stop-opacity:1;" +         offset="1" +         id="stop4017" /> +    </linearGradient> +    <linearGradient +       id="linearGradient3985"> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="0" +         id="stop3987" /> +      <stop +         style="stop-color:#1d1d1d;stop-opacity:1;" +         offset="1" +         id="stop3989" /> +    </linearGradient> +    <linearGradient +       id="linearGradient3961"> +      <stop +         style="stop-color:#283131;stop-opacity:0;" +         offset="0" +         id="stop3963" /> +      <stop +         id="stop3965" +         offset="0.5" +         style="stop-color:#1e2424;stop-opacity:1;" /> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="1" +         id="stop3967" /> +    </linearGradient> +    <linearGradient +       id="linearGradient3951"> +      <stop +         id="stop3953" +         offset="0" +         style="stop-color:#344040;stop-opacity:1;" /> +      <stop +         style="stop-color:#222929;stop-opacity:1;" +         offset="0.5" +         id="stop3955" /> +      <stop +         id="stop3957" +         offset="1" +         style="stop-color:#000000;stop-opacity:1;" /> +    </linearGradient> +    <linearGradient +       id="linearGradient3909"> +      <stop +         style="stop-color:#283131;stop-opacity:1;" +         offset="0" +         id="stop3911" /> +      <stop +         id="stop3917" +         offset="0.5" +         style="stop-color:#1e2424;stop-opacity:1;" /> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="1" +         id="stop3913" /> +    </linearGradient> +    <linearGradient +       id="linearGradient3537"> +      <stop +         style="stop-color:#ada469;stop-opacity:1;" +         offset="0" +         id="stop3539" /> +      <stop +         id="stop3545" +         offset="0.81132078" +         style="stop-color:#ada469;stop-opacity:1;" /> +      <stop +         style="stop-color:#ffffff;stop-opacity:1;" +         offset="1" +         id="stop3541" /> +    </linearGradient> +    <linearGradient +       id="linearGradient3317"> +      <stop +         style="stop-color:#cfc690;stop-opacity:1" +         offset="0" +         id="stop3319" /> +      <stop +         id="stop3321" +         offset="0.21161865" +         style="stop-color:#afa775;stop-opacity:1;" /> +      <stop +         id="stop3323" +         offset="0.53408515" +         style="stop-color:#615c3a;stop-opacity:1;" /> +      <stop +         style="stop-color:#000000;stop-opacity:1;" +         offset="0.76504093" +         id="stop3325" /> +      <stop +         id="stop3327" +         offset="1" +         style="stop-color:#403518;stop-opacity:1;" /> +    </linearGradient> +    <linearGradient +       id="linearGradient3239"> +      <stop +         id="stop3251" +         offset="0" +         style="stop-color:#cfc690;stop-opacity:1;" /> +      <stop +         style="stop-color:#afa775;stop-opacity:1;" +         offset="0.21161865" +         id="stop3267" /> +      <stop +         style="stop-color:#615c3a;stop-opacity:1;" +         offset="0.53408515" +         id="stop3261" /> +      <stop +         id="stop3265" +         offset="0.76504093" +         style="stop-color:#000000;stop-opacity:1;" /> +      <stop +         style="stop-color:#403518;stop-opacity:1;" +         offset="1" +         id="stop3243" /> +    </linearGradient> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3239" +       id="radialGradient3281" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(1.5480423,1.7414304,-1.9683515,1.7497638,-1130.5586,-1872.5121)" +       spreadMethod="pad" +       cx="806.52582" +       cy="212.68117" +       fx="806.52582" +       fy="212.68117" +       r="48.363216" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3317" +       id="radialGradient3315" +       cx="543.6698" +       cy="147.3131" +       fx="543.6698" +       fy="147.3131" +       r="47.863216" +       gradientTransform="matrix(2.1382256,0,0,2.3382884,-77.03847,-101.68704)" +       gradientUnits="userSpaceOnUse" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3537" +       id="radialGradient3543" +       cx="385" +       cy="237.00504" +       fx="385" +       fy="237.00504" +       r="86.928574" +       gradientTransform="matrix(1,0,0,0.8562038,0,34.080427)" +       gradientUnits="userSpaceOnUse" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3909" +       id="radialGradient3915" +       cx="418.30365" +       cy="342.47794" +       fx="418.30365" +       fy="342.47794" +       r="131.4509" +       gradientTransform="matrix(1.3957347,0.6211056,-0.4244067,0.9537174,-15.061913,-227.96711)" +       gradientUnits="userSpaceOnUse" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3951" +       id="radialGradient3933" +       cx="397.16388" +       cy="336.95245" +       fx="397.16388" +       fy="336.95245" +       r="36.75" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(1.9449972,2.4894837e-7,-2.4894833e-7,1.9449969,-375.31868,-318.41912)" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3961" +       id="linearGradient3959" +       x1="398.21429" +       y1="343.52289" +       x2="379.28571" +       y2="265.30862" +       gradientUnits="userSpaceOnUse" +       gradientTransform="translate(450.03125,73.843964)" /> +    <filter +       inkscape:collect="always" +       id="filter3981" +       x="-0.30000001" +       width="1.6" +       y="-0.30000001" +       height="1.6"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="2" +         id="feGaussianBlur3983" /> +    </filter> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3985" +       id="radialGradient3991" +       cx="402.48898" +       cy="317.23578" +       fx="402.48898" +       fy="317.23578" +       r="23.714285" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(4.3776616,0,0,4.3776616,-1358.3025,-1070.7357)" /> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3999"> +      <path +         style="opacity:1;fill:#f5ff04;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" +         d="M 179.64286,267.36218 C 157.23242,307.0651 119.02676,383.14247 110.35715,417.00504 C 101.70994,450.78014 101.58516,483.42158 110,503.43362 C 118.3602,523.31575 136.16398,539.06642 150.71428,544.86218 C 150.1179,530.48631 165.08723,501.57635 223.57143,472.36218 C 282.1977,443.07704 301.95306,445.23132 327.14285,425.21932 C 352.77291,404.85756 339.75316,358.17469 330.35714,331.29075 C 320.9229,304.29747 295.38973,272.16627 263.92857,261.6479 C 232.8953,251.27258 198.91081,256.79953 179.64286,267.36218 z" +         id="path4001" +         sodipodi:nodetypes="czzczzzzc" /> +    </clipPath> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4013" +       id="radialGradient4056" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(1.1323239,0.7659488,-1.4550286,2.1510098,588.75376,-711.79716)" +       cx="228.81355" +       cy="440.26971" +       fx="228.81355" +       fy="440.26971" +       r="119.17509" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4041" +       id="radialGradient4060" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(5.911206e-2,2.6869855,-0.7234268,1.5914947e-2,408.72779,-424.56452)" +       cx="275.4422" +       cy="335.34866" +       fx="275.4422" +       fy="335.34866" +       r="36.75" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4025" +       id="radialGradient4062" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(5.911206e-2,2.6869855,-0.7234268,1.5914947e-2,408.72779,-424.56452)" +       cx="275.4422" +       cy="335.34866" +       fx="275.4422" +       fy="335.34866" +       r="36.75" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4084" +       id="linearGradient4082" +       gradientUnits="userSpaceOnUse" +       x1="182.35046" +       y1="256.11136" +       x2="145.53348" +       y2="542.20502" /> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath4100"> +      <path +         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.9000755px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" +         d="M 265.93541,126.68393 L 247.1682,295.54701 L 421.27363,222.42633 L 483.22803,311.08516 L 541.11243,279.09486 L 503.57801,99.035183 L 265.93541,126.68393 z" +         id="path4102" +         sodipodi:nodetypes="ccccccc" /> +    </clipPath> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4106" +       id="radialGradient4112" +       cx="250.22678" +       cy="475.09763" +       fx="250.22678" +       fy="475.09763" +       r="95.98877" +       gradientTransform="matrix(1.2259004,-0.7077739,0.1413989,0.2449102,322.22326,608.91815)" +       gradientUnits="userSpaceOnUse" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4478" +       id="linearGradient4484" +       x1="412.08926" +       y1="404.91574" +       x2="417.375" +       y2="401.82648" +       gradientUnits="userSpaceOnUse" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4478" +       id="linearGradient4486" +       x1="411.91071" +       y1="404.91577" +       x2="417.375" +       y2="401.82648" +       gradientUnits="userSpaceOnUse" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4478" +       id="linearGradient4488" +       x1="411.91071" +       y1="405.54077" +       x2="417.375" +       y2="401.82648" +       gradientUnits="userSpaceOnUse" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4478" +       id="linearGradient4490" +       x1="412.08926" +       y1="405.54077" +       x2="417.375" +       y2="401.82648" +       gradientUnits="userSpaceOnUse" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4478" +       id="linearGradient4492" +       x1="411.73212" +       y1="405.54077" +       x2="417.375" +       y2="401.82648" +       gradientUnits="userSpaceOnUse" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4862" +       id="radialGradient4868" +       cx="429.56738" +       cy="377.42877" +       fx="429.56738" +       fy="377.42877" +       r="72.079735" +       gradientTransform="matrix(1,0,0,0.618034,0,144.16496)" +       gradientUnits="userSpaceOnUse" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4870" +       id="radialGradient4876" +       cx="437.6991" +       cy="391.21735" +       fx="437.6991" +       fy="391.21735" +       r="36.611931" +       gradientTransform="matrix(1,0,0,0.618034,0,149.43174)" +       gradientUnits="userSpaceOnUse" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4013" +       id="radialGradient3585" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(1.1323239,0.7659488,-1.4550286,2.1510098,588.75376,-711.79716)" +       cx="228.81355" +       cy="440.26971" +       fx="228.81355" +       fy="440.26971" +       r="119.17509" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4084" +       id="linearGradient3587" +       gradientUnits="userSpaceOnUse" +       x1="182.35046" +       y1="256.11136" +       x2="145.53348" +       y2="542.20502" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3317" +       id="radialGradient8410" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(1.0036478,-1.0345492e-7,1.7124628e-7,1.6613125,-753.99632,-302.76972)" +       cx="317.78754" +       cy="129.65378" +       fx="317.78754" +       fy="129.65378" +       r="47.863216" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient8398" +       id="radialGradient8412" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(2.0747661,-0.1577957,0.2382425,3.1325183,-1144.2358,-272.29325)" +       cx="325.30847" +       cy="80.909554" +       fx="325.30847" +       fy="80.909554" +       r="26.937988" /> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8514"> +      <path +         style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z" +         id="path8516" +         sodipodi:nodetypes="cscccccccccccc" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8604"> +      <path +         style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z" +         id="path8606" +         sodipodi:nodetypes="cscccccccccccc" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8610"> +      <path +         style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z" +         id="path8612" +         sodipodi:nodetypes="cscccccccccccc" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8616"> +      <path +         style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z" +         id="path8618" +         sodipodi:nodetypes="cscccccccccccc" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8622"> +      <path +         style="opacity:1;fill:#202020;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +         d="M 821.64329,477.88997 C 821.64329,477.88997 844.26276,471.38316 857.38604,472.01724 C 870.50932,472.65133 888.02762,473.95586 901.09489,484.20343 C 914.16216,494.45099 926.16263,511.3435 935.20728,542.57308 C 944.25193,573.80266 936.9056,641.82509 929.03125,685.92043 C 921.1569,730.01577 900.76615,792.03341 884.03125,825.92043 C 867.29635,859.80745 834.23354,903.41563 823.46182,915.79659 C 812.0976,928.85856 767.25593,952.22276 744.03125,958.06326 C 749.33455,947.45666 792.93101,907.47442 779.03125,897.349 C 765.01228,887.13674 733.27116,943.33136 694.7381,926.38217 C 716.12041,913.25005 736.5175,875.19611 728.77871,859.78772 C 720.93846,844.17733 698.07378,908.54529 635.24317,896.8006 C 665.29521,869.27394 690.65023,825.89659 676.50587,813.8209 C 662.09071,801.51403 616.04412,868.11405 616.04412,868.11405 C 616.04412,868.11405 613.22222,826.41287 629.81732,799.50673 C 646.45667,772.52886 709.47029,717.89146 729.37045,687.80331 C 749.2706,657.71517 762.98301,621.79429 771.50587,595.28537 C 780.02873,568.77645 787.30681,518.18583 787.30681,518.18583" +         id="path8624" +         sodipodi:nodetypes="czzzzzzczczczczzzc" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8642"> +      <path +         style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 366.88839,504.13471 C 366.88839,504.13471 337.33433,544.70776 319.03125,578.42042 C 300.72816,612.13309 260.41016,704.77736 248.67411,749.49185 C 236.91471,794.29529 186.17411,873.06329 186.17411,873.06329 L 262.24554,891.27757 C 262.24554,891.27757 274.05266,878.45422 293.31696,845.20614 C 312.58126,811.95806 353.67411,706.63471 353.67411,706.63471 L 366.88839,504.13471 z" +         id="path8644" +         sodipodi:nodetypes="czzcczcc" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8658"> +      <path +         style="opacity:1;fill:#0b0b0b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 569.03125,1018.7776 C 564.74554,1019.4919 541.4031,1022.3957 511.17411,1028.7776 C 480.94512,1035.1595 411.39918,1054.7395 368.31696,1064.4919 C 325.23474,1074.2443 251.05253,1099.3079 211.40434,1091.7573 C 171.75616,1084.2067 121.88839,1027.349 121.88839,1027.349 L 126.17411,933.06329 C 126.17411,933.06329 212.05962,916.86235 238.31696,899.49186 C 264.57431,882.12137 283.89934,849.82588 297.60268,828.06329 C 311.30602,806.3007 330.45982,756.63471 330.45982,756.63471 L 569.03125,1018.7776 z" +         id="path8660" +         sodipodi:nodetypes="czzzcczzcc" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter8802" +       x="-0.35311759" +       width="1.7062352" +       y="-0.1817714" +       height="1.3635428"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="48.038491" +         id="feGaussianBlur8804" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8806" +       x="-0.61142862" +       width="2.2228572" +       y="-0.14930232" +       height="1.2986046"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="37.830213" +         id="feGaussianBlur8808" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8810" +       x="-0.23519406" +       width="1.4703881" +       y="-0.24500646" +       height="1.4900129"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="58.328041" +         id="feGaussianBlur8812" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8814" +       x="-0.20466694" +       width="1.4093339" +       y="-0.29007819" +       height="1.5801564"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="22.300169" +         id="feGaussianBlur8816" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8818" +       x="-0.34381232" +       width="1.6876246" +       y="-0.18433961" +       height="1.3686792"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="34.542167" +         id="feGaussianBlur8820" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8822" +       x="-0.2742857" +       width="1.5485713" +       y="-0.21333334" +       height="1.4266667"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="11.313708" +         id="feGaussianBlur8824" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8826" +       x="-0.25894088" +       width="1.5178818" +       y="-0.2236412" +       height="1.4472824"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="19.631544" +         id="feGaussianBlur8828" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8856" +       x="-0.3253231" +       width="1.6506462" +       y="-0.19013336" +       height="1.3802667"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="28.712591" +         id="feGaussianBlur8858" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8860" +       x="-0.38093024" +       width="1.7618605" +       y="-0.17518716" +       height="1.3503743"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="19.304015" +         id="feGaussianBlur8862" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8888" +       x="-0.2112188" +       width="1.4224375" +       y="-0.16808605" +       height="1.3361721"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="8.3693583" +         id="feGaussianBlur8890" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8892" +       x="-0.18692794" +       width="1.3738559" +       y="-0.23646873" +       height="1.4729375"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="31.21228" +         id="feGaussianBlur8894" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8906"> +      <path +         style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 352.24553,211.99185 C 348.4411,186.72762 335.43581,161.35383 335.08873,136.46662 C 334.90247,123.1111 338.36158,109.89571 348.84426,96.912574 C 385.19128,31.616739 465.78517,12.217889 534.77892,5.447147 C 621.70131,-5.569654 719.69159,23.387219 768.15026,100.84843 C 822.27428,176.58173 824.82502,273.38755 848.7623,360.37638 C 878.20009,487.50398 903.54144,616.59052 909.15454,747.22673 C 906.09106,825.40858 900.7282,912.41088 848.65133,975.36086 C 800.62479,1025.7183 725.86486,1025.4139 661.58145,1034.3632 C 571.02606,1039.0182 477.22992,1018.2174 399.79755,970.16496 C 335.02191,932.22495 304.06736,856.68633 302.51815,784.14538 C 294.12898,704.27022 328.90967,630.33687 354.13855,556.98577 C 361.60916,474.2247 363.55141,390.73802 363.79189,307.60093 C 362.95507,275.40549 356.70236,243.7836 352.24553,211.99185 z" +         id="path8908" +         sodipodi:nodetypes="cscccccccccccc" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter8940" +       x="-0.25152978" +       width="1.5030596" +       y="-0.053035267" +       height="1.1060705"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="13.024603" +         id="feGaussianBlur8942" /> +    </filter> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient8952" +       id="linearGradient8958" +       x1="609.31244" +       y1="239.46866" +       x2="560.83142" +       y2="262.86206" +       gradientUnits="userSpaceOnUse" +       gradientTransform="translate(450.03125,73.843964)" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient8964" +       id="linearGradient8970" +       x1="603.84064" +       y1="627.85303" +       x2="616.24396" +       y2="585.42664" +       gradientUnits="userSpaceOnUse" +       gradientTransform="translate(450.03125,73.843964)" /> +    <filter +       inkscape:collect="always" +       id="filter9020" +       x="-0.32861114" +       width="1.6572223" +       y="-0.182" +       height="1.364"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="20.912684" +         id="feGaussianBlur9022" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter9024" +       x="-0.55453134" +       width="2.1090627" +       y="-0.51434779" +       height="2.0286956"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="20.912684" +         id="feGaussianBlur9026" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter9044" +       x="-0.32631579" +       width="1.6526316" +       y="-0.84545463" +       height="2.6909094"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="21.92031" +         id="feGaussianBlur9046" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter9048" +       x="-0.40879121" +       width="1.8175824" +       y="-0.71538466" +       height="2.4307692"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="21.92031" +         id="feGaussianBlur9050" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter3587" +       x="-0.1"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="8.881432" +         id="feGaussianBlur3589" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3602"> +      <path +         sodipodi:nodetypes="czzzzzzczczczczzzc" +         id="path3604" +         d="M 647.61204,540.04601 C 647.61204,540.04601 670.23151,533.5392 683.35479,534.17328 C 696.47807,534.80737 713.99637,536.1119 727.06364,546.35947 C 740.13091,556.60703 752.13138,573.49954 761.17603,604.72912 C 770.22068,635.9587 762.87435,703.98113 755,748.07647 C 747.12565,792.17181 726.7349,854.18945 710,888.07647 C 693.2651,921.96349 660.20229,965.57167 649.43057,977.95263 C 638.06635,991.0146 593.22468,1014.3788 570,1020.2193 C 575.3033,1009.6127 618.89976,969.63046 605,959.50504 C 590.98103,949.29278 559.23991,1005.4874 520.70685,988.53821 C 542.08916,975.40609 562.48625,937.35215 554.74746,921.94376 C 546.90721,906.33337 524.04253,970.70133 461.21192,958.95664 C 491.26396,931.42998 516.61898,888.05263 502.47462,875.97694 C 488.05946,863.67007 442.01287,930.27009 442.01287,930.27009 C 442.01287,930.27009 439.19097,888.56891 455.78607,861.66277 C 472.42542,834.6849 535.43904,780.0475 555.3392,749.95935 C 575.23935,719.87121 588.95176,683.95033 597.47462,657.44141 C 605.99748,630.93249 613.27556,580.34187 613.27556,580.34187" +         style="opacity:1;fill:#202020;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter4120" +       x="-0.2770822" +       width="1.5541644" +       y="-0.32482043" +       height="1.6496409"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="19.956289" +         id="feGaussianBlur4122" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3631"> +      <path +         style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +         d="M 760.16396,935.83377 C 766.95806,954.73656 770.65765,969.13346 772.05426,987.04566 C 773.45088,1004.958 768.27158,1038.8465 769.1538,1057.7018 C 770.03555,1076.547 777.28749,1097.8008 796.49843,1106.6707 C 815.9173,1115.6365 845.81767,1116.882 870.61827,1103.5251 C 895.41887,1090.1681 928.01929,1033.1996 941.59253,1006.2164 C 955.21638,979.13246 980.3536,891.71903 986.25333,856.44781 C 992.15306,821.1766 988.80387,815.14704 981.63585,807.39232 C 984.27615,779.55217 980.13613,752.45689 994.74554,720.20614 C 964.49653,732.03184 957.36325,760.36684 946.42665,785.71122 C 938.42574,734.77829 946.63581,714.43803 949.74554,684.49186 C 920.68078,699.26977 906.88403,731.60588 904.74554,777.349 C 893.82159,776.0448 883.3541,772.91477 871.17411,776.63471 C 870.91007,730.61137 869.71055,699.7453 880.08474,662.42822 C 826.82927,683.45508 817.13746,769.02232 824.03125,775.20614 C 813.14843,775.74114 802.66017,773.90884 791.17411,778.06329 C 791.81303,735.49194 790.91365,693.15468 761.17411,655.20614 C 761.17411,655.20614 730.21605,736.12848 729.74554,758.77757 C 729.27503,781.42666 739.19713,798.94345 739.19713,798.94345 C 739.19713,798.94345 730.62906,835.68396 732.89854,857.17568 C 735.19439,878.91714 753.34144,916.85185 760.16396,935.83377 z" +         id="path3633" +         sodipodi:nodetypes="czzzzzzcccccccccczczz" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3665"> +      <path +         sodipodi:nodetypes="czzcczcc" +         id="path3667" +         d="M 366.88839,504.13471 C 366.88839,504.13471 337.33433,544.70776 319.03125,578.42042 C 300.72816,612.13309 260.41016,704.77736 248.67411,749.49185 C 236.91471,794.29529 186.17411,873.06329 186.17411,873.06329 L 262.24554,891.27757 C 262.24554,891.27757 274.05266,878.45422 293.31696,845.20614 C 312.58126,811.95806 353.67411,706.63471 353.67411,706.63471 L 366.88839,504.13471 z" +         style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3677"> +      <path +         style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +         d="M 586.13271,997.98981 C 592.92681,1016.8926 596.6264,1031.2895 598.02301,1049.2017 C 599.41963,1067.114 594.24033,1101.0025 595.12255,1119.8578 C 596.0043,1138.703 603.25624,1159.9568 622.46718,1168.8267 C 641.88605,1177.7925 671.78642,1179.038 696.58702,1165.6811 C 721.38762,1152.3241 753.98804,1095.3556 767.56128,1068.3724 C 781.18513,1041.2885 806.32235,953.87507 812.22208,918.60385 C 818.12181,883.33264 814.77262,877.30308 807.6046,869.54836 C 810.2449,841.70821 806.10488,814.61293 820.71429,782.36218 C 790.46528,794.18788 783.332,822.52288 772.3954,847.86726 C 764.39449,796.93433 772.60456,776.59407 775.71429,746.6479 C 746.64953,761.42581 732.85278,793.76192 730.71429,839.50504 C 719.79034,838.20084 709.32285,835.07081 697.14286,838.79075 C 696.87882,792.76741 695.6793,761.90134 706.05349,724.58426 C 652.79802,745.61112 643.10621,831.17836 650,837.36218 C 639.11718,837.89718 628.62892,836.06488 617.14286,840.21933 C 617.78178,797.64798 616.8824,755.31072 587.14286,717.36218 C 587.14286,717.36218 556.1848,798.28452 555.71429,820.93361 C 555.24378,843.5827 565.16588,861.09949 565.16588,861.09949 C 565.16588,861.09949 556.59781,897.84 558.86729,919.33172 C 561.16314,941.07318 579.31019,979.00789 586.13271,997.98981 z" +         id="path3679" +         sodipodi:nodetypes="czzzzzzcccccccccczczz" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter3898"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="10.892985" +         id="feGaussianBlur3900" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter4130" +       x="-0.49509686" +       width="1.9901937" +       y="-0.26708817" +       height="1.5341763"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="10.730622" +         id="feGaussianBlur4132" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter4141" +       x="-0.40611032" +       width="1.8122206" +       y="-0.30260596" +       height="1.6052119"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="9.8586086" +         id="feGaussianBlur4143" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath4177"> +      <path +         sodipodi:nodetypes="czzzzzzcccccccccczczz" +         id="path4179" +         d="M 586.13271,997.98981 C 592.92681,1016.8926 596.6264,1031.2895 598.02301,1049.2017 C 599.41963,1067.114 594.24033,1101.0025 595.12255,1119.8578 C 596.0043,1138.703 603.25624,1159.9568 622.46718,1168.8267 C 641.88605,1177.7925 671.78642,1179.038 696.58702,1165.6811 C 721.38762,1152.3241 753.98804,1095.3556 767.56128,1068.3724 C 781.18513,1041.2885 806.32235,953.87507 812.22208,918.60385 C 818.12181,883.33264 814.77262,877.30308 807.6046,869.54836 C 810.2449,841.70821 806.10488,814.61293 820.71429,782.36218 C 790.46528,794.18788 783.332,822.52288 772.3954,847.86726 C 764.39449,796.93433 772.60456,776.59407 775.71429,746.6479 C 746.64953,761.42581 732.85278,793.76192 730.71429,839.50504 C 719.79034,838.20084 709.32285,835.07081 697.14286,838.79075 C 696.87882,792.76741 695.6793,761.90134 706.05349,724.58426 C 652.79802,745.61112 643.10621,831.17836 650,837.36218 C 639.11718,837.89718 628.62892,836.06488 617.14286,840.21933 C 617.78178,797.64798 616.8824,755.31072 587.14286,717.36218 C 587.14286,717.36218 556.1848,798.28452 555.71429,820.93361 C 555.24378,843.5827 565.16588,861.09949 565.16588,861.09949 C 565.16588,861.09949 556.59781,897.84 558.86729,919.33172 C 561.16314,941.07318 579.31019,979.00789 586.13271,997.98981 z" +         style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter4185"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="3.6164709" +         id="feGaussianBlur4187" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter4105"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="3.8640966" +         id="feGaussianBlur4107" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath2833"> +      <path +         style="opacity:1;fill:#292929;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 569.03125,1018.7776 C 564.74554,1019.4919 541.4031,1022.3957 511.17411,1028.7776 C 480.94512,1035.1595 453.86016,1033.7437 375.38803,1046.1072 C 295.53625,1058.688 281.32367,1088.6495 267.26578,1093.1715 C 252.56564,1097.9001 121.88839,1027.349 121.88839,1027.349 L 126.17411,933.06329 C 126.17411,933.06329 212.05962,916.86235 238.31696,899.49186 C 264.57431,882.12137 283.89934,849.82588 297.60268,828.06329 C 311.30602,806.3007 330.45982,756.63471 330.45982,756.63471 L 569.03125,1018.7776 z" +         id="path2835" +         sodipodi:nodetypes="czzzcczzcc" /> +    </clipPath> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient2843" +       id="linearGradient2841" +       gradientUnits="userSpaceOnUse" +       x1="347.89655" +       y1="1070.2124" +       x2="275.58191" +       y2="867.97992" /> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3627" +       id="linearGradient3688" +       gradientUnits="userSpaceOnUse" +       x1="699.32867" +       y1="269.76755" +       x2="698.97504" +       y2="346.1351" /> +    <mask +       maskUnits="userSpaceOnUse" +       id="mask3684"> +      <path +         sodipodi:type="arc" +         style="opacity:1;fill:url(#linearGradient3688);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.43724918px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         id="path3686" +         sodipodi:cx="579.474" +         sodipodi:cy="260.57516" +         sodipodi:rx="192.6866" +         sodipodi:ry="164.04877" +         d="M 772.1606,260.57516 A 192.6866,164.04877 0 1 1 386.7874,260.57516 A 192.6866,164.04877 0 1 1 772.1606,260.57516 z" +         transform="translate(-174.03125,62.156036)" /> +    </mask> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3622"> +      <path +         style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +         d="M 266.27183,924.57186 C 264.86456,943.37307 265.12693,957.32289 268.35357,973.87514 C 271.58022,990.42748 284.75965,1019.7825 288.68797,1037.0589 C 292.61419,1054.326 291.3821,1075.3685 276.22853,1088.2071 C 260.91092,1101.1845 234.17726,1109.806 208.39623,1103.9409 C 182.61517,1098.0756 138.84716,1054.7175 119.80604,1033.7126 C 100.6939,1012.6293 56.045183,939.86194 41.867508,909.43681 C 27.689836,879.01169 29.207903,872.71824 33.747793,863.90708 C 24.381071,839.38658 21.334081,813.84027 0.035335518,788.33044 C 30.360815,791.44488 43.915625,815.28677 60.161025,835.47019 C 54.631129,787.39416 42.10631,771.05369 31.787073,744.74589 C 61.781368,750.82755 82.366433,776.61829 95.766856,817.45839 C 105.32101,813.54048 114.00462,808.08545 125.95427,808.39719 C 114.65677,766.70139 108.00481,738.48135 89.267015,707.32725 C 142.70898,712.99758 172.92404,787.96657 168.23844,795.28805 C 178.21641,793.04406 187.24409,788.75767 198.67497,789.63638 C 187.42601,751.28936 177.62716,712.76848 195.01526,670.9882 C 195.01526,670.9882 243.30204,736.42507 249.40492,756.79397 C 255.50779,777.16288 250.92373,795.49449 250.92373,795.49449 C 250.92373,795.49449 267.8833,826.57978 271.21765,846.58862 C 274.59075,866.82997 267.68496,905.69194 266.27183,924.57186 z" +         id="path3624" +         sodipodi:nodetypes="czzzzzzcccccccccczczz" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3636"> +      <path +         style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +         d="M 760.16396,935.83377 C 766.95806,954.73656 770.65765,969.13346 772.05426,987.04566 C 773.45088,1004.958 768.27158,1038.8465 769.1538,1057.7018 C 770.03555,1076.547 777.28749,1097.8008 796.49843,1106.6707 C 815.9173,1115.6365 845.81767,1116.882 870.61827,1103.5251 C 895.41887,1090.1681 928.01929,1033.1996 941.59253,1006.2164 C 955.21638,979.13246 980.3536,891.71903 986.25333,856.44781 C 992.15306,821.1766 988.80387,815.14704 981.63585,807.39232 C 984.27615,779.55217 980.13613,752.45689 994.74554,720.20614 C 964.49653,732.03184 957.36325,760.36684 946.42665,785.71122 C 938.42574,734.77829 946.63581,714.43803 949.74554,684.49186 C 920.68078,699.26977 906.88403,731.60588 904.74554,777.349 C 893.82159,776.0448 883.3541,772.91477 871.17411,776.63471 C 870.91007,730.61137 869.71055,699.7453 880.08474,662.42822 C 826.82927,683.45508 817.13746,769.02232 824.03125,775.20614 C 813.14843,775.74114 802.66017,773.90884 791.17411,778.06329 C 791.81303,735.49194 790.91365,693.15468 761.17411,655.20614 C 761.17411,655.20614 730.21605,736.12848 729.74554,758.77757 C 729.27503,781.42666 739.19713,798.94345 739.19713,798.94345 C 739.19713,798.94345 730.62906,835.68396 732.89854,857.17568 C 735.19439,878.91714 753.34144,916.85185 760.16396,935.83377 z" +         id="path3638" +         sodipodi:nodetypes="czzzzzzcccccccccczczz" /> +    </clipPath> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3660" +       id="linearGradient3666" +       x1="1255.7386" +       y1="667.09216" +       x2="893.69995" +       y2="858.01099" +       gradientUnits="userSpaceOnUse" /> +    <filter +       inkscape:collect="always" +       id="filter3779" +       x="-0.087980822" +       width="1.1759616" +       y="-0.17728332" +       height="1.3545666"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="16.340344" +         id="feGaussianBlur3781" /> +    </filter> +    <filter +       id="filter3785" +       inkscape:label="White Fur"> +      <feTurbulence +         id="feTurbulence3787" +         in="SourceAlpha" +         type="fractalNoise" +         baseFrequency="0.24044943820224721" +         numOctaves="10" +         seed="655" +         result="result0" /> +      <feDisplacementMap +         id="feDisplacementMap3789" +         in="SourceGraphic" +         in2="result0" +         scale="62" +         xChannelSelector="B" +         yChannelSelector="G" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter3677"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="2.0397518" +         id="feGaussianBlur3679" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3722"> +      <path +         style="opacity:1;fill:#121212;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 709.28572,844.50504 C 763.57143,843.07647 835.32072,829.45305 879.28572,817.71932 C 923.33843,805.96218 1005.172,781.37208 1054.6428,759.86218 C 1103.9821,738.40946 1168.2465,700.58058 1208.9286,667.71933 C 1249.4367,634.99864 1261.3185,611.89952 1269.6429,634.1479 C 1278.012,656.51569 1253.2359,690.47352 1231.7857,715.21933 C 1210.1816,740.14273 1179.0544,767.92466 1132.8571,804.50504 C 1086.6598,841.08542 976.77458,906.08967 920,933.07647 C 862.93394,960.20183 791.79666,991.31489 747.85714,1005.5765 C 703.91762,1019.8381 616.42857,1036.6479 616.42857,1036.6479 L 709.28572,844.50504 z" +         id="path3724" +         sodipodi:nodetypes="czzzzzzzzcc" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3986"> +      <path +         style="opacity:1;fill:#121212;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 709.28572,844.50504 C 763.57143,843.07647 835.32072,829.45305 879.28572,817.71932 C 923.33843,805.96218 1005.172,781.37208 1054.6428,759.86218 C 1103.9821,738.40946 1168.2465,700.58058 1208.9286,667.71933 C 1249.4367,634.99864 1261.3185,611.89952 1269.6429,634.1479 C 1278.012,656.51569 1253.2359,690.47352 1231.7857,715.21933 C 1210.1816,740.14273 1179.0544,767.92466 1132.8571,804.50504 C 1086.6598,841.08542 976.77458,906.08967 920,933.07647 C 862.93394,960.20183 791.79666,991.31489 747.85714,1005.5765 C 703.91762,1019.8381 616.42857,1036.6479 616.42857,1036.6479 L 709.28572,844.50504 z" +         id="path3988" +         sodipodi:nodetypes="czzzzzzzzcc" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3992"> +      <path +         style="opacity:1;fill:#121212;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 709.28572,844.50504 C 763.57143,843.07647 835.32072,829.45305 879.28572,817.71932 C 923.33843,805.96218 1005.172,781.37208 1054.6428,759.86218 C 1103.9821,738.40946 1168.2465,700.58058 1208.9286,667.71933 C 1249.4367,634.99864 1261.3185,611.89952 1269.6429,634.1479 C 1278.012,656.51569 1253.2359,690.47352 1231.7857,715.21933 C 1210.1816,740.14273 1179.0544,767.92466 1132.8571,804.50504 C 1086.6598,841.08542 976.77458,906.08967 920,933.07647 C 862.93394,960.20183 791.79666,991.31489 747.85714,1005.5765 C 703.91762,1019.8381 616.42857,1036.6479 616.42857,1036.6479 L 709.28572,844.50504 z" +         id="path3994" +         sodipodi:nodetypes="czzzzzzzzcc" /> +    </clipPath> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath3998"> +      <path +         style="opacity:1;fill:#262f2f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         d="M 178.21428,274.14789 C 174.40985,248.88366 161.40456,223.50987 161.05748,198.62266 C 160.87122,185.26714 164.33033,172.05175 174.81301,159.06861 C 211.16003,93.772775 291.75392,74.373925 360.74767,67.603183 C 447.67006,56.586382 545.66034,85.543255 594.11901,163.00447 C 648.24303,238.73777 650.79377,335.54359 674.73105,422.53242 C 704.16884,549.66002 729.51019,678.74656 735.12329,809.38277 C 732.05981,887.56462 726.69695,974.56692 674.62008,1037.5169 C 626.59354,1087.8743 551.83361,1087.5699 487.5502,1096.5192 C 396.99481,1101.1742 303.19867,1080.3734 225.7663,1032.321 C 160.99066,994.38099 130.03611,918.84237 128.4869,846.30142 C 120.09773,766.42626 154.87842,692.49291 180.1073,619.14181 C 187.57791,536.38074 189.52016,452.89406 189.76064,369.75697 C 188.92382,337.56153 182.67111,305.93964 178.21428,274.14789 z" +         id="path4000" +         sodipodi:nodetypes="cscccccccccccc" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter4002" +       x="-0.24334238" +       width="1.4866848" +       y="-0.39104807" +       height="1.7820961"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="14.589518" +         id="feGaussianBlur4004" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter4010" +       x="-0.14577261" +       width="1.2915452" +       y="-0.23523259" +       height="1.4704652"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="4.4442907" +         id="feGaussianBlur4012" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter4053"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.6062947" +         id="feGaussianBlur4055" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter4079"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="6.5887624" +         id="feGaussianBlur4081" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter4083"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.5052066" +         id="feGaussianBlur4085" /> +    </filter> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient4113" +       id="radialGradient4119" +       cx="296.33783" +       cy="427.17749" +       fx="296.33783" +       fy="427.17749" +       r="19.704132" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(2.9797125,0,0,2.9797125,-599.28727,-827.0855)" /> +    <filter +       inkscape:collect="always" +       id="filter6949" +       x="-0.10294895" +       width="1.2058979" +       y="-0.34224695" +       height="1.6844939"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6951" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6953" +       x="-0.098320946" +       width="1.1966419" +       y="-0.19750816" +       height="1.3950163"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6955" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6957" +       x="-0.098213427" +       width="1.1964267" +       y="-0.19838208" +       height="1.3967642"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6959" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6961" +       x="-0.09919104" +       width="1.1983821" +       y="-0.22643611" +       height="1.4528722"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6963" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6965" +       x="-0.099081434" +       width="1.1981629" +       y="-0.22529824" +       height="1.4505965"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6967" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6969" +       x="-0.10450897" +       width="1.2090179" +       y="-0.40468886" +       height="1.8093777"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6971" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6973" +       x="-0.10330495" +       width="1.2066098" +       y="-0.36439717" +       height="1.7287945"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6975" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6977" +       x="-0.10224481" +       width="1.2044896" +       y="-0.32371372" +       height="1.6474274"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6979" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6981" +       x="-0.10052545" +       width="1.2010509" +       y="-0.2742162" +       height="1.5484324"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6983" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6985" +       x="-0.098428868" +       width="1.1968577" +       y="-0.20853186" +       height="1.4170637"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6987" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6989" +       x="-0.098428868" +       width="1.1968577" +       y="-0.20287035" +       height="1.4057407"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6991" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6993" +       x="-0.098213255" +       width="1.1964265" +       y="-0.19838208" +       height="1.3967642"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6995" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter6997"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur6999" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7001"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.1675612" +         id="feGaussianBlur7003" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7285" +       x="-0.030884685" +       width="1.0617694" +       y="-0.10267408" +       height="1.2053483"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7287" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7289"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7291" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7293"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7295" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7297"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7299" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7301"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7303" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7305"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7307" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7309"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7311" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7313"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7315" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7317"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7319" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7321"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7323" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7325" +       x="-0.031352691" +       width="1.0627054" +       y="-0.12140666" +       height="1.2428133"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7327" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7329" +       x="-0.030991485" +       width="1.061983" +       y="-0.10931916" +       height="1.2186383"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7331" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7333"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7335" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7337"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.35026836" +         id="feGaussianBlur7339" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7345"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.7233839" +         id="feGaussianBlur7347" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath7421"> +      <path +         sodipodi:type="inkscape:offset" +         inkscape:radius="0" +         inkscape:original="M 1111.4062 -285.9375 L 1107.4688 -284.0625 C 1107.4283 -284.05228 1107.3692 -284.04201 1107.3438 -284.03125 C 1106.925 -283.8184 1107.1791 -283.93067 1106.6875 -283.71875 C 1106.2014 -283.50919 1104.9499 -283.13456 1102.5938 -282.25 C 1099.2626 -280.99942 1096.7895 -280.10016 1095.5938 -279.1875 C 1094.0576 -279.16623 1091.8733 -278.95419 1089.9375 -278.46875 C 1086.956 -277.72108 1085.0823 -277.29474 1083.1875 -276.875 C 1081.2927 -276.45527 1081.512 -276.23281 1080.3125 -276 C 1079.0159 -275.74833 1078.5911 -276.00899 1074.875 -275.21875 C 1071.3851 -274.4766 1065.9802 -273.28768 1064.7188 -272.53125 C 1063.1348 -272.71203 1060.8513 -272.85303 1058.875 -272.5625 C 1055.8346 -272.11554 1053.9588 -271.88974 1052.0312 -271.65625 C 1051.3758 -271.57687 1050.9902 -271.45547 1050.6875 -271.375 C 1050.2613 -271.24334 1050.0017 -271.11498 1049.3125 -271.03125 C 1048.0009 -270.87188 1047.5503 -271.18808 1043.7812 -270.75 C 1040.2273 -270.33691 1034.7758 -269.47718 1033.5312 -268.8125 C 1031.9322 -269.10979 1029.6735 -269.34669 1027.6875 -269.15625 C 1024.6287 -268.86293 1022.7155 -268.67226 1020.7812 -268.5 C 1018.847 -268.32773 1019.0926 -268.07763 1017.875 -267.96875 C 1016.5588 -267.85105 1016.1152 -268.13238 1012.3438 -267.71875 C 1008.8017 -267.3303 1003.3359 -266.50948 1002.0625 -265.84375 C 1000.4636 -266.13844 998.1753 -266.35076 996.1875 -266.15625 C 993.12921 -265.857 991.2463 -265.67601 989.3125 -265.5 C 988.65501 -265.44015 988.27245 -265.32144 987.96875 -265.25 C 987.54105 -265.13104 987.28525 -265.03193 986.59375 -264.96875 C 985.27775 -264.84849 984.834 -265.16363 981.0625 -264.75 C 977.50631 -264.35998 972.0569 -263.51084 970.8125 -262.84375 C 969.21381 -263.13793 966.95265 -263.36747 964.96875 -263.15625 C 961.91305 -262.83092 959.9947 -262.63001 958.0625 -262.4375 C 956.13031 -262.24499 956.37275 -261.99662 955.15625 -261.875 C 953.84137 -261.74353 953.3932 -262.03954 949.625 -261.59375 C 946.08611 -261.17509 940.6473 -260.30158 939.375 -259.625 C 937.77741 -259.90604 935.51505 -260.04543 933.53125 -259.8125 C 930.47927 -259.45413 928.58625 -259.24464 926.65625 -259.03125 C 926.00007 -258.95869 925.6156 -258.85856 925.3125 -258.78125 C 924.88571 -258.65402 924.6276 -258.51405 923.9375 -258.4375 C 922.62411 -258.29181 922.17015 -258.61152 918.40625 -258.125 C 914.85737 -257.66624 909.4276 -256.70598 908.1875 -256 C 906.59441 -256.24424 904.3537 -256.38135 902.375 -256.125 C 899.32741 -255.73018 897.4243 -255.47655 895.5 -255.21875 C 893.57571 -254.96096 893.7739 -254.72522 892.5625 -254.5625 C 891.25301 -254.3866 890.8153 -254.66688 887.0625 -254.09375 C 883.53821 -253.55551 878.1393 -252.39458 876.875 -251.65625 C 875.28751 -251.85979 873.0295 -251.91098 871.0625 -251.5625 C 868.03631 -251.02638 866.1636 -250.70081 864.25 -250.375 C 863.59941 -250.26423 863.2363 -250.10406 862.9375 -250 C 862.51681 -249.83512 862.27405 -249.6687 861.59375 -249.53125 C 860.29905 -249.26966 859.86665 -249.53745 856.15625 -248.71875 C 852.65777 -247.9468 847.31035 -246.33582 846.09375 -245.5 C 844.53085 -245.57745 842.33625 -245.41472 840.40625 -244.90625 C 837.43387 -244.12312 835.58855 -243.67416 833.71875 -243.15625 C 831.84875 -242.63835 832.0521 -242.38897 830.875 -242.0625 C 829.60251 -241.7096 829.17795 -241.95541 825.53125 -240.875 C 822.10657 -239.86037 816.88185 -237.94183 815.65625 -237.03125 C 814.11747 -237.01851 811.93645 -236.75903 810.03125 -236.15625 C 807.10027 -235.22891 805.2809 -234.69783 803.4375 -234.09375 C 802.81071 -233.88837 802.44585 -233.70117 802.15625 -233.5625 C 801.74867 -233.34889 801.50295 -233.15375 800.84375 -232.9375 C 799.58925 -232.52596 799.1576 -232.74846 795.5625 -231.5 C 792.17261 -230.32283 786.96755 -228.2863 785.78125 -227.34375 C 784.25737 -227.28408 782.1312 -226.94888 780.25 -226.28125 C 777.35261 -225.25296 775.55095 -224.60577 773.71875 -223.96875 C 771.88655 -223.33174 772.0909 -223.12021 770.9375 -222.71875 C 769.69071 -222.28479 769.27395 -222.51903 765.71875 -221.15625 C 762.38005 -219.87645 757.23165 -217.6737 756.03125 -216.6875 C 754.52407 -216.57981 752.39555 -216.1887 750.53125 -215.46875 C 747.66307 -214.36115 745.90735 -213.68719 744.09375 -213 C 743.47705 -212.76637 743.0973 -212.55797 742.8125 -212.40625 C 742.81251 -212.40625 742.8125 -212.37673 742.8125 -212.375 L 734.8125 -209.1875 L 736.625 -194.46875 C 736.36701 -194.52956 742.8125 -191.15625 742.8125 -191.15625 C 743.03891 -191.30093 743.26145 -191.42886 743.53125 -191.53125 C 744.61177 -191.94123 745.70285 -191.74702 749.53125 -193.21875 C 753.35977 -194.69049 754.7553 -195.22373 755.4375 -195.625 C 756.11711 -196.02478 757.04925 -196.50437 757.65625 -197.15625 C 759.48317 -197.294 761.22705 -197.64948 762.59375 -198.15625 C 765.56175 -199.25677 767.4691 -199.96244 769.375 -200.625 C 771.28081 -201.28754 771.72915 -202.03987 772.78125 -202.40625 C 773.87287 -202.78636 774.97635 -202.57163 778.84375 -203.9375 C 782.71115 -205.30336 784.1269 -205.76458 784.8125 -206.15625 C 785.51361 -206.55677 786.5133 -207.08923 787.125 -207.75 C 789.09581 -207.80466 790.94195 -208.13463 792.40625 -208.625 C 795.40777 -209.63008 797.3324 -210.24671 799.25 -210.875 C 800.78861 -211.3791 801.42415 -211.92177 802.15625 -212.3125 C 802.38647 -212.44681 802.63215 -212.56623 802.90625 -212.65625 C 804.00457 -213.01673 805.0877 -212.73762 809 -213.96875 C 812.91231 -215.19988 814.366 -215.6417 815.0625 -216 C 815.75641 -216.35697 816.6926 -216.79261 817.3125 -217.40625 C 819.17771 -217.42891 820.94835 -217.67308 822.34375 -218.09375 C 825.37415 -219.00729 827.33615 -219.52385 829.28125 -220.0625 C 831.22637 -220.60114 831.70745 -221.32702 832.78125 -221.625 C 833.89527 -221.93415 835.00125 -221.61761 838.96875 -222.65625 C 842.93625 -223.69488 844.38625 -224.08898 845.09375 -224.40625 C 845.82855 -224.73584 846.90765 -225.15997 847.53125 -225.78125 C 849.52907 -225.66525 851.3887 -225.80134 852.875 -226.15625 C 855.95311 -226.89125 857.9584 -227.25719 859.9375 -227.65625 C 861.52541 -227.97643 862.1818 -228.4468 862.9375 -228.75 C 863.17501 -228.8568 863.4044 -228.94276 863.6875 -229 C 864.82091 -229.22919 865.99215 -228.79107 870.03125 -229.5 C 874.07067 -230.20893 875.5315 -230.42709 876.25 -230.6875 C 876.96581 -230.94694 877.95435 -231.25474 878.59375 -231.78125 C 880.51795 -231.54176 882.34165 -231.55672 883.78125 -231.78125 C 886.90767 -232.26887 888.9358 -232.48192 890.9375 -232.75 C 892.93921 -233.01807 893.42625 -233.69514 894.53125 -233.84375 C 895.67767 -233.99793 896.8071 -233.54218 900.875 -234.0625 C 904.94281 -234.58282 906.43525 -234.75823 907.15625 -235 C 907.89337 -235.24714 908.95435 -235.58623 909.59375 -236.125 C 911.64375 -235.78947 913.56745 -235.72704 915.09375 -235.90625 C 918.23595 -236.27521 920.27375 -236.46561 922.28125 -236.6875 C 923.89207 -236.86552 924.5459 -237.2957 925.3125 -237.53125 C 925.55341 -237.61677 925.80655 -237.68685 926.09375 -237.71875 C 927.24345 -237.84647 928.39505 -237.3721 932.46875 -237.84375 C 936.54245 -238.3154 938.0278 -238.45435 938.75 -238.6875 C 939.46941 -238.91977 940.45025 -239.16096 941.09375 -239.65625 C 943.03005 -239.32279 944.8638 -239.25201 946.3125 -239.40625 C 949.45851 -239.7412 951.49 -239.92484 953.5 -240.125 C 955.50991 -240.32514 955.98415 -240.95139 957.09375 -241.0625 C 958.24485 -241.17778 959.39025 -240.69744 963.46875 -241.125 C 967.54725 -241.55256 969.05765 -241.68709 969.78125 -241.90625 C 970.52047 -242.13011 971.57685 -242.4195 972.21875 -242.9375 C 974.27575 -242.53883 976.2206 -242.4441 977.75 -242.59375 C 980.89871 -242.90185 982.9258 -243.067 984.9375 -243.25 C 986.55151 -243.39682 987.20055 -243.81055 987.96875 -244.03125 C 988.21005 -244.11211 988.4623 -244.16116 988.75 -244.1875 C 989.90211 -244.29295 991.0429 -243.79475 995.125 -244.1875 C 999.20711 -244.58025 1000.7139 -244.71834 1001.4375 -244.9375 C 1002.1584 -245.15583 1003.1371 -245.3852 1003.7812 -245.875 C 1005.7193 -245.52501 1007.5501 -245.42062 1009 -245.5625 C 1012.1487 -245.8706 1014.1758 -246.03575 1016.1875 -246.21875 C 1018.1991 -246.40174 1018.7017 -247.05677 1019.8125 -247.15625 C 1020.9648 -247.25948 1022.1047 -246.77142 1026.1875 -247.15625 C 1030.2704 -247.54107 1031.7762 -247.65725 1032.5 -247.875 C 1033.2393 -248.09743 1034.2956 -248.38949 1034.9375 -248.90625 C 1036.9949 -248.50448 1038.9404 -248.40292 1040.4688 -248.5625 C 1043.6153 -248.89102 1045.6458 -249.0852 1047.6562 -249.28125 C 1049.2692 -249.43854 1049.9219 -249.91273 1050.6875 -250.15625 C 1050.9282 -250.24429 1051.1507 -250.27762 1051.4375 -250.3125 C 1052.5858 -250.4522 1053.7542 -249.97259 1057.8125 -250.5625 C 1061.8708 -251.15242 1063.3743 -251.33964 1064.0938 -251.59375 C 1064.8104 -251.84691 1065.7684 -252.15182 1066.4062 -252.6875 C 1068.3259 -252.47556 1070.1262 -252.53609 1071.5625 -252.78125 C 1074.6816 -253.31365 1076.6741 -253.70986 1078.6562 -254.09375 C 1080.6383 -254.47762 1081.1305 -255.1334 1082.2188 -255.375 C 1083.3475 -255.62566 1084.489 -255.25871 1088.4688 -256.25 C 1092.4483 -257.24127 1093.8983 -257.6693 1094.5938 -258.03125 C 1095.316 -258.40725 1096.3555 -258.90183 1096.9688 -259.5625 C 1098.9317 -259.57454 1100.7625 -259.85355 1102.1875 -260.40625 C 1105.1387 -261.55085 1107.0607 -262.27567 1108.875 -263.15625 C 1110.3307 -263.86277 1111.1941 -264.85828 1111.4062 -265.15625 C 1111.6185 -265.4542 1111.5051 -265.8848 1111.5312 -265.90625 C 1111.5742 -265.94148 1111.8716 -266.00028 1112.0312 -266.34375 C 1112.8902 -268.19082 1114.3544 -271.97139 1114.4688 -272.65625 C 1114.5825 -273.33839 1114.6368 -274.00902 1114.6875 -274.40625 C 1114.7169 -274.63575 1114.5404 -275.28515 1114.5625 -275.34375 C 1114.5934 -275.42579 1114.8508 -275.59432 1114.9062 -275.84375 C 1115.1725 -277.04206 1114.9953 -278.05111 1114.7812 -279.46875 C 1114.5673 -280.88638 1113.8096 -284.08338 1113.1562 -284.9375 C 1112.4973 -285.79922 1111.9314 -285.94801 1111.4062 -285.9375 z " +         style="fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +         id="path7423" +         d="M 1111.4062,-285.9375 L 1107.4688,-284.0625 C 1107.4283,-284.05228 1107.3692,-284.04201 1107.3438,-284.03125 C 1106.925,-283.8184 1107.1791,-283.93067 1106.6875,-283.71875 C 1106.2014,-283.50919 1104.9499,-283.13456 1102.5938,-282.25 C 1099.2626,-280.99942 1096.7895,-280.10016 1095.5938,-279.1875 C 1094.0576,-279.16623 1091.8733,-278.95419 1089.9375,-278.46875 C 1086.956,-277.72108 1085.0823,-277.29474 1083.1875,-276.875 C 1081.2927,-276.45527 1081.512,-276.23281 1080.3125,-276 C 1079.0159,-275.74833 1078.5911,-276.00899 1074.875,-275.21875 C 1071.3851,-274.4766 1065.9802,-273.28768 1064.7188,-272.53125 C 1063.1348,-272.71203 1060.8513,-272.85303 1058.875,-272.5625 C 1055.8346,-272.11554 1053.9588,-271.88974 1052.0312,-271.65625 C 1051.3758,-271.57687 1050.9902,-271.45547 1050.6875,-271.375 C 1050.2613,-271.24334 1050.0017,-271.11498 1049.3125,-271.03125 C 1048.0009,-270.87188 1047.5503,-271.18808 1043.7812,-270.75 C 1040.2273,-270.33691 1034.7758,-269.47718 1033.5312,-268.8125 C 1031.9322,-269.10979 1029.6735,-269.34669 1027.6875,-269.15625 C 1024.6287,-268.86293 1022.7155,-268.67226 1020.7812,-268.5 C 1018.847,-268.32773 1019.0926,-268.07763 1017.875,-267.96875 C 1016.5588,-267.85105 1016.1152,-268.13238 1012.3438,-267.71875 C 1008.8017,-267.3303 1003.3359,-266.50948 1002.0625,-265.84375 C 1000.4636,-266.13844 998.1753,-266.35076 996.1875,-266.15625 C 993.12921,-265.857 991.2463,-265.67601 989.3125,-265.5 C 988.65501,-265.44015 988.27245,-265.32144 987.96875,-265.25 C 987.54105,-265.13104 987.28525,-265.03193 986.59375,-264.96875 C 985.27775,-264.84849 984.834,-265.16363 981.0625,-264.75 C 977.50631,-264.35998 972.0569,-263.51084 970.8125,-262.84375 C 969.21381,-263.13793 966.95265,-263.36747 964.96875,-263.15625 C 961.91305,-262.83092 959.9947,-262.63001 958.0625,-262.4375 C 956.13031,-262.24499 956.37275,-261.99662 955.15625,-261.875 C 953.84137,-261.74353 953.3932,-262.03954 949.625,-261.59375 C 946.08611,-261.17509 940.6473,-260.30158 939.375,-259.625 C 937.77741,-259.90604 935.51505,-260.04543 933.53125,-259.8125 C 930.47927,-259.45413 928.58625,-259.24464 926.65625,-259.03125 C 926.00007,-258.95869 925.6156,-258.85856 925.3125,-258.78125 C 924.88571,-258.65402 924.6276,-258.51405 923.9375,-258.4375 C 922.62411,-258.29181 922.17015,-258.61152 918.40625,-258.125 C 914.85737,-257.66624 909.4276,-256.70598 908.1875,-256 C 906.59441,-256.24424 904.3537,-256.38135 902.375,-256.125 C 899.32741,-255.73018 897.4243,-255.47655 895.5,-255.21875 C 893.57571,-254.96096 893.7739,-254.72522 892.5625,-254.5625 C 891.25301,-254.3866 890.8153,-254.66688 887.0625,-254.09375 C 883.53821,-253.55551 878.1393,-252.39458 876.875,-251.65625 C 875.28751,-251.85979 873.0295,-251.91098 871.0625,-251.5625 C 868.03631,-251.02638 866.1636,-250.70081 864.25,-250.375 C 863.59941,-250.26423 863.2363,-250.10406 862.9375,-250 C 862.51681,-249.83512 862.27405,-249.6687 861.59375,-249.53125 C 860.29905,-249.26966 859.86665,-249.53745 856.15625,-248.71875 C 852.65777,-247.9468 847.31035,-246.33582 846.09375,-245.5 C 844.53085,-245.57745 842.33625,-245.41472 840.40625,-244.90625 C 837.43387,-244.12312 835.58855,-243.67416 833.71875,-243.15625 C 831.84875,-242.63835 832.0521,-242.38897 830.875,-242.0625 C 829.60251,-241.7096 829.17795,-241.95541 825.53125,-240.875 C 822.10657,-239.86037 816.88185,-237.94183 815.65625,-237.03125 C 814.11747,-237.01851 811.93645,-236.75903 810.03125,-236.15625 C 807.10027,-235.22891 805.2809,-234.69783 803.4375,-234.09375 C 802.81071,-233.88837 802.44585,-233.70117 802.15625,-233.5625 C 801.74867,-233.34889 801.50295,-233.15375 800.84375,-232.9375 C 799.58925,-232.52596 799.1576,-232.74846 795.5625,-231.5 C 792.17261,-230.32283 786.96755,-228.2863 785.78125,-227.34375 C 784.25737,-227.28408 782.1312,-226.94888 780.25,-226.28125 C 777.35261,-225.25296 775.55095,-224.60577 773.71875,-223.96875 C 771.88655,-223.33174 772.0909,-223.12021 770.9375,-222.71875 C 769.69071,-222.28479 769.27395,-222.51903 765.71875,-221.15625 C 762.38005,-219.87645 757.23165,-217.6737 756.03125,-216.6875 C 754.52407,-216.57981 752.39555,-216.1887 750.53125,-215.46875 C 747.66307,-214.36115 745.90735,-213.68719 744.09375,-213 C 743.47705,-212.76637 743.0973,-212.55797 742.8125,-212.40625 C 742.81251,-212.40625 742.8125,-212.37673 742.8125,-212.375 L 734.8125,-209.1875 L 736.625,-194.46875 C 736.36701,-194.52956 742.8125,-191.15625 742.8125,-191.15625 C 743.03891,-191.30093 743.26145,-191.42886 743.53125,-191.53125 C 744.61177,-191.94123 745.70285,-191.74702 749.53125,-193.21875 C 753.35977,-194.69049 754.7553,-195.22373 755.4375,-195.625 C 756.11711,-196.02478 757.04925,-196.50437 757.65625,-197.15625 C 759.48317,-197.294 761.22705,-197.64948 762.59375,-198.15625 C 765.56175,-199.25677 767.4691,-199.96244 769.375,-200.625 C 771.28081,-201.28754 771.72915,-202.03987 772.78125,-202.40625 C 773.87287,-202.78636 774.97635,-202.57163 778.84375,-203.9375 C 782.71115,-205.30336 784.1269,-205.76458 784.8125,-206.15625 C 785.51361,-206.55677 786.5133,-207.08923 787.125,-207.75 C 789.09581,-207.80466 790.94195,-208.13463 792.40625,-208.625 C 795.40777,-209.63008 797.3324,-210.24671 799.25,-210.875 C 800.78861,-211.3791 801.42415,-211.92177 802.15625,-212.3125 C 802.38647,-212.44681 802.63215,-212.56623 802.90625,-212.65625 C 804.00457,-213.01673 805.0877,-212.73762 809,-213.96875 C 812.91231,-215.19988 814.366,-215.6417 815.0625,-216 C 815.75641,-216.35697 816.6926,-216.79261 817.3125,-217.40625 C 819.17771,-217.42891 820.94835,-217.67308 822.34375,-218.09375 C 825.37415,-219.00729 827.33615,-219.52385 829.28125,-220.0625 C 831.22637,-220.60114 831.70745,-221.32702 832.78125,-221.625 C 833.89527,-221.93415 835.00125,-221.61761 838.96875,-222.65625 C 842.93625,-223.69488 844.38625,-224.08898 845.09375,-224.40625 C 845.82855,-224.73584 846.90765,-225.15997 847.53125,-225.78125 C 849.52907,-225.66525 851.3887,-225.80134 852.875,-226.15625 C 855.95311,-226.89125 857.9584,-227.25719 859.9375,-227.65625 C 861.52541,-227.97643 862.1818,-228.4468 862.9375,-228.75 C 863.17501,-228.8568 863.4044,-228.94276 863.6875,-229 C 864.82091,-229.22919 865.99215,-228.79107 870.03125,-229.5 C 874.07067,-230.20893 875.5315,-230.42709 876.25,-230.6875 C 876.96581,-230.94694 877.95435,-231.25474 878.59375,-231.78125 C 880.51795,-231.54176 882.34165,-231.55672 883.78125,-231.78125 C 886.90767,-232.26887 888.9358,-232.48192 890.9375,-232.75 C 892.93921,-233.01807 893.42625,-233.69514 894.53125,-233.84375 C 895.67767,-233.99793 896.8071,-233.54218 900.875,-234.0625 C 904.94281,-234.58282 906.43525,-234.75823 907.15625,-235 C 907.89337,-235.24714 908.95435,-235.58623 909.59375,-236.125 C 911.64375,-235.78947 913.56745,-235.72704 915.09375,-235.90625 C 918.23595,-236.27521 920.27375,-236.46561 922.28125,-236.6875 C 923.89207,-236.86552 924.5459,-237.2957 925.3125,-237.53125 C 925.55341,-237.61677 925.80655,-237.68685 926.09375,-237.71875 C 927.24345,-237.84647 928.39505,-237.3721 932.46875,-237.84375 C 936.54245,-238.3154 938.0278,-238.45435 938.75,-238.6875 C 939.46941,-238.91977 940.45025,-239.16096 941.09375,-239.65625 C 943.03005,-239.32279 944.8638,-239.25201 946.3125,-239.40625 C 949.45851,-239.7412 951.49,-239.92484 953.5,-240.125 C 955.50991,-240.32514 955.98415,-240.95139 957.09375,-241.0625 C 958.24485,-241.17778 959.39025,-240.69744 963.46875,-241.125 C 967.54725,-241.55256 969.05765,-241.68709 969.78125,-241.90625 C 970.52047,-242.13011 971.57685,-242.4195 972.21875,-242.9375 C 974.27575,-242.53883 976.2206,-242.4441 977.75,-242.59375 C 980.89871,-242.90185 982.9258,-243.067 984.9375,-243.25 C 986.55151,-243.39682 987.20055,-243.81055 987.96875,-244.03125 C 988.21005,-244.11211 988.4623,-244.16116 988.75,-244.1875 C 989.90211,-244.29295 991.0429,-243.79475 995.125,-244.1875 C 999.20711,-244.58025 1000.7139,-244.71834 1001.4375,-244.9375 C 1002.1584,-245.15583 1003.1371,-245.3852 1003.7812,-245.875 C 1005.7193,-245.52501 1007.5501,-245.42062 1009,-245.5625 C 1012.1487,-245.8706 1014.1758,-246.03575 1016.1875,-246.21875 C 1018.1991,-246.40174 1018.7017,-247.05677 1019.8125,-247.15625 C 1020.9648,-247.25948 1022.1047,-246.77142 1026.1875,-247.15625 C 1030.2704,-247.54107 1031.7762,-247.65725 1032.5,-247.875 C 1033.2393,-248.09743 1034.2956,-248.38949 1034.9375,-248.90625 C 1036.9949,-248.50448 1038.9404,-248.40292 1040.4688,-248.5625 C 1043.6153,-248.89102 1045.6458,-249.0852 1047.6562,-249.28125 C 1049.2692,-249.43854 1049.9219,-249.91273 1050.6875,-250.15625 C 1050.9282,-250.24429 1051.1507,-250.27762 1051.4375,-250.3125 C 1052.5858,-250.4522 1053.7542,-249.97259 1057.8125,-250.5625 C 1061.8708,-251.15242 1063.3743,-251.33964 1064.0938,-251.59375 C 1064.8104,-251.84691 1065.7684,-252.15182 1066.4062,-252.6875 C 1068.3259,-252.47556 1070.1262,-252.53609 1071.5625,-252.78125 C 1074.6816,-253.31365 1076.6741,-253.70986 1078.6562,-254.09375 C 1080.6383,-254.47762 1081.1305,-255.1334 1082.2188,-255.375 C 1083.3475,-255.62566 1084.489,-255.25871 1088.4688,-256.25 C 1092.4483,-257.24127 1093.8983,-257.6693 1094.5938,-258.03125 C 1095.316,-258.40725 1096.3555,-258.90183 1096.9688,-259.5625 C 1098.9317,-259.57454 1100.7625,-259.85355 1102.1875,-260.40625 C 1105.1387,-261.55085 1107.0607,-262.27567 1108.875,-263.15625 C 1110.3307,-263.86277 1111.1941,-264.85828 1111.4062,-265.15625 C 1111.6185,-265.4542 1111.5051,-265.8848 1111.5312,-265.90625 C 1111.5742,-265.94148 1111.8716,-266.00028 1112.0312,-266.34375 C 1112.8902,-268.19082 1114.3544,-271.97139 1114.4688,-272.65625 C 1114.5825,-273.33839 1114.6368,-274.00902 1114.6875,-274.40625 C 1114.7169,-274.63575 1114.5404,-275.28515 1114.5625,-275.34375 C 1114.5934,-275.42579 1114.8508,-275.59432 1114.9062,-275.84375 C 1115.1725,-277.04206 1114.9953,-278.05111 1114.7812,-279.46875 C 1114.5673,-280.88638 1113.8096,-284.08338 1113.1562,-284.9375 C 1112.4973,-285.79922 1111.9314,-285.94801 1111.4062,-285.9375 z" +         transform="translate(8.0045714e-2,-3.125e-2)" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter7578" +       x="-0.08160872" +       width="1.1632174" +       y="-0.22659944" +       height="1.4531989"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="2.437399" +         id="feGaussianBlur7580" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter7594" +       x="-0.040804356" +       width="1.0816087" +       y="-0.11329972" +       height="1.2265995"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="1.2186995" +         id="feGaussianBlur7596" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath7606"> +      <path +         id="path7608" +         d="M 1049.205,-282.26672 L 1049.1152,-282.25891 C 1047.7278,-281.37446 1042.5119,-280.65171 1042.4862,-272.73547 C 1042.462,-265.31022 1057.4991,-255.64401 1059.6425,-254.64172 C 1061.3727,-253.83263 1063.2341,-253.23296 1065.0488,-252.92297 L 1066.4862,-252.70422 C 1068.4059,-252.49228 1070.2062,-252.55281 1071.6425,-252.79797 C 1074.7616,-253.33037 1076.7541,-253.72658 1078.7362,-254.11047 C 1080.7183,-254.49434 1081.2105,-255.15012 1082.2988,-255.39172 C 1083.4275,-255.64238 1084.569,-255.27543 1088.5488,-256.26672 C 1092.5283,-257.258 1093.9782,-257.68602 1094.6738,-258.04797 C 1095.396,-258.42398 1096.4355,-258.91855 1097.0488,-259.57922 C 1099.0117,-259.59127 1100.8425,-259.87027 1102.2675,-260.42297 C 1105.2187,-261.56758 1107.1407,-262.29239 1108.955,-263.17297 C 1110.4107,-263.8795 1111.2741,-264.875 1111.4862,-265.17297 C 1111.6985,-265.47093 1111.5852,-265.90152 1111.6112,-265.92297 C 1111.6542,-265.95821 1111.9517,-266.017 1112.1112,-266.36047 C 1112.9702,-268.20755 1114.4344,-271.98811 1114.5488,-272.67297 C 1114.6625,-273.35512 1114.7168,-274.02574 1114.7675,-274.42297 C 1114.7969,-274.65248 1114.6204,-275.30187 1114.6425,-275.36047 C 1114.6734,-275.44252 1114.9308,-275.61104 1114.9862,-275.86047 C 1115.2525,-277.05879 1115.0754,-278.06783 1114.8612,-279.48547 C 1114.6473,-280.90311 1113.8896,-284.1001 1113.2362,-284.95422 C 1112.8168,-285.50279 1112.4369,-285.74672 1112.08,-285.86047 C 1112.0129,-285.87776 1111.9561,-285.90721 1111.8925,-285.92297 C 1111.8715,-285.92695 1111.8508,-285.91983 1111.83,-285.92297 C 1111.5184,-285.99847 1111.2215,-286.08164 1110.6738,-286.14172 C 1109.6883,-286.24984 1108.2491,-286.40112 1106.705,-286.39172 C 1106.1903,-286.38859 1105.6679,-286.34408 1105.1425,-286.29797 C 1101.5836,-285.98569 1096.1327,-285.30689 1094.9238,-284.67297 C 1093.2907,-285.00699 1090.9756,-285.2852 1088.9862,-285.14172 C 1085.9222,-284.92075 1084.0185,-284.79953 1082.08,-284.67297 C 1080.1416,-284.54642 1080.3939,-284.28433 1079.1738,-284.20422 C 1077.8547,-284.11762 1077.3869,-284.42747 1073.6112,-284.11047 C 1070.0655,-283.81275 1064.6306,-283.1173 1063.3925,-282.48547 C 1061.7591,-282.81998 1059.4466,-283.09786 1057.455,-282.95422 C 1054.3908,-282.73324 1052.4872,-282.58078 1050.5488,-282.45422 C 1049.8896,-282.41119 1049.5064,-282.33029 1049.205,-282.26672 z" +         style="opacity:0.82448976;fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter7610" +       x="-0.021942979" +       width="1.0438859" +       y="-0.10017137" +       height="1.2003427"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="0.57530213" +         id="feGaussianBlur7612" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath7616"> +      <path +         id="path7618" +         d="M 205.47016,-408.97318 L 205.38003,-408.97164 C 203.9344,-408.18598 198.68082,-407.82829 198.10378,-399.93307 C 197.56244,-392.52754 211.88973,-381.83741 213.95811,-380.68826 C 215.62775,-379.76062 217.44286,-379.03275 219.23156,-378.59711 L 220.65023,-378.27877 C 222.5505,-377.93363 224.35065,-377.86862 225.80054,-378.01314 C 228.94914,-378.32698 230.9644,-378.58345 232.96843,-378.82834 C 234.97245,-379.07322 235.50913,-379.69312 236.61162,-379.85833 C 237.75504,-380.02976 238.86821,-379.58419 242.90739,-380.29586 C 246.94627,-381.00755 248.42246,-381.33354 249.14158,-381.64616 C 249.88822,-381.97095 250.95964,-382.39191 251.61747,-383.00826 C 253.57644,-382.88355 255.42223,-383.03435 256.88227,-383.48645 C 259.90603,-384.42272 261.87384,-385.01189 263.74507,-385.76396 C 265.24645,-386.36738 266.17709,-387.30032 266.40943,-387.58279 C 266.64197,-387.86524 266.55894,-388.30268 266.58637,-388.32227 C 266.63172,-388.35443 266.93259,-388.39235 267.11563,-388.72388 C 268.1012,-390.50664 269.82518,-394.17603 269.987,-394.85126 C 270.14794,-395.52383 270.24882,-396.18904 270.32707,-396.58177 C 270.37238,-396.80868 270.24154,-397.46878 270.26767,-397.5257 C 270.30421,-397.6054 270.57272,-397.75558 270.64536,-398.00055 C 270.99449,-399.17741 270.8881,-400.19633 270.77316,-401.62545 C 270.65853,-403.05454 270.12535,-406.29655 269.53303,-407.1941 C 269.15286,-407.77056 268.79088,-408.04035 268.44277,-408.17869 C 268.37703,-408.20061 268.32242,-408.23394 268.26007,-408.2541 C 268.2394,-408.25953 268.21826,-408.25387 268.19773,-408.25845 C 267.89214,-408.35547 267.60176,-408.45912 267.05957,-408.5572 C 266.084,-408.7337 264.65883,-408.98486 263.11782,-409.08304 C 262.60416,-409.11577 262.07992,-409.10775 261.55259,-409.09835 C 257.98058,-409.03472 252.49564,-408.73725 251.24552,-408.18907 C 249.63965,-408.63604 247.34955,-409.07483 245.35499,-409.07027 C 242.28304,-409.06325 240.37552,-409.07493 238.43292,-409.0837 C 236.49041,-409.09248 236.72384,-408.81345 235.50112,-408.81852 C 234.1792,-408.82401 233.73411,-409.16569 229.9455,-409.11245 C 226.38768,-409.06243 220.91754,-408.74723 219.63844,-408.20318 C 218.0323,-408.65065 215.74477,-409.08893 213.74801,-409.08436 C 210.67586,-409.07735 208.76626,-409.05786 206.82375,-409.06662 C 206.16316,-409.06961 205.77525,-409.0156 205.47016,-408.97318 z" +         style="opacity:0.82448976;fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +    </clipPath> +    <linearGradient +       inkscape:collect="always" +       xlink:href="#linearGradient7622" +       id="linearGradient7708" +       gradientUnits="userSpaceOnUse" +       gradientTransform="translate(-19.091883,4.2426407)" +       x1="774.97668" +       y1="-211.87105" +       x2="755.11584" +       y2="-202.67865" /> +    <mask +       maskUnits="userSpaceOnUse" +       id="mask7704"> +      <path +         style="fill:url(#linearGradient7708);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" +         d="M 718.40812,-224.31217 L 751.65812,-168.31217 L 1027.6581,-192.31217 L 1187.1581,-240.56217 L 1120.6581,-323.31217 L 718.40812,-224.31217 z" +         id="path7706" /> +    </mask> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient8430" +       id="radialGradient7904" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(-0.3324832,0.9022288,-0.9582407,-0.3531242,305.29227,19.909497)" +       cx="142.95833" +       cy="107.09234" +       fx="142.95833" +       fy="107.09234" +       r="66.981766" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient3317" +       id="radialGradient7906" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(1.0036478,-1.0345492e-7,1.7124628e-7,1.6613125,-160.53487,-96.205369)" +       cx="317.78754" +       cy="129.65378" +       fx="317.78754" +       fy="129.65378" +       r="47.863216" /> +    <radialGradient +       inkscape:collect="always" +       xlink:href="#linearGradient8398" +       id="radialGradient7908" +       gradientUnits="userSpaceOnUse" +       gradientTransform="matrix(2.0747661,-0.1577957,0.2382425,3.1325183,-550.77432,-65.728909)" +       cx="325.30847" +       cy="80.909554" +       fx="325.30847" +       fy="80.909554" +       r="26.937988" /> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8209"> +      <path +         sodipodi:nodetypes="czcc" +         id="path8211" +         d="M 734.03125,519.49186 C 734.03125,519.49186 750.78638,556.50992 762.73266,573.44581 C 774.67895,590.3817 815.45982,629.49186 815.45982,629.49186 L 816.05699,490.90211" +         style="opacity:1;fill:#1a1a1a;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter8225"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="10.661912" +         id="feGaussianBlur8227" /> +    </filter> +    <filter +       inkscape:collect="always" +       id="filter8333"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="7.18" +         id="feGaussianBlur8335" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8338"> +      <path +         sodipodi:nodetypes="czzzzzzcccccccccczczz" +         id="path8340" +         d="M 266.27183,924.57185 C 264.86456,943.37307 265.12693,957.32289 268.35357,973.87513 C 271.58023,990.42751 284.75966,1019.7825 288.68798,1037.0589 C 292.61419,1054.326 291.38211,1075.3686 276.22854,1088.2071 C 260.91093,1101.1846 234.17727,1109.8061 208.39624,1103.9409 C 182.61518,1098.0756 138.84716,1054.7175 119.80605,1033.7126 C 100.6939,1012.6293 56.045182,939.86193 41.867507,909.4368 C 27.689835,879.01168 29.207902,872.71823 33.747792,863.90708 C 24.38107,839.38658 21.33408,813.84026 0.035334479,788.33044 C 30.360814,791.44487 43.915624,815.28676 60.161024,835.47019 C 54.631128,787.39416 42.106309,771.05368 31.787072,744.74589 C 61.781367,750.82754 82.366432,776.61828 95.766855,817.45839 C 105.32101,813.54047 114.00462,808.08545 125.95427,808.39719 C 114.65677,766.70139 108.0048,738.48134 89.267014,707.32725 C 142.70898,712.99757 172.92404,787.96657 168.23844,795.28805 C 178.21641,793.04406 187.24409,788.75767 198.67497,789.63638 C 187.426,751.28935 177.62715,712.76848 195.01526,670.98819 C 195.01526,670.98819 243.30204,736.42507 249.40491,756.79397 C 255.50779,777.16287 250.92373,795.49448 250.92373,795.49448 C 250.92373,795.49448 267.8833,826.57978 271.21765,846.58862 C 274.59075,866.82996 267.68496,905.69193 266.27183,924.57185 z" +         style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter8354"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="6.82" +         id="feGaussianBlur8356" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8359"> +      <path +         sodipodi:nodetypes="czzzzzzcccccccccczczz" +         id="path8361" +         d="M 266.27183,924.57185 C 264.86456,943.37307 265.12693,957.32289 268.35357,973.87513 C 271.58023,990.42751 284.75966,1019.7825 288.68798,1037.0589 C 292.61419,1054.326 291.38211,1075.3686 276.22854,1088.2071 C 260.91093,1101.1846 234.17727,1109.8061 208.39624,1103.9409 C 182.61518,1098.0756 138.84716,1054.7175 119.80605,1033.7126 C 100.6939,1012.6293 56.045182,939.86193 41.867507,909.4368 C 27.689835,879.01168 29.207902,872.71823 33.747792,863.90708 C 24.38107,839.38658 21.33408,813.84026 0.035334479,788.33044 C 30.360814,791.44487 43.915624,815.28676 60.161024,835.47019 C 54.631128,787.39416 42.106309,771.05368 31.787072,744.74589 C 61.781367,750.82754 82.366432,776.61828 95.766855,817.45839 C 105.32101,813.54047 114.00462,808.08545 125.95427,808.39719 C 114.65677,766.70139 108.0048,738.48134 89.267014,707.32725 C 142.70898,712.99757 172.92404,787.96657 168.23844,795.28805 C 178.21641,793.04406 187.24409,788.75767 198.67497,789.63638 C 187.426,751.28935 177.62715,712.76848 195.01526,670.98819 C 195.01526,670.98819 243.30204,736.42507 249.40491,756.79397 C 255.50779,777.16287 250.92373,795.49448 250.92373,795.49448 C 250.92373,795.49448 267.8833,826.57978 271.21765,846.58862 C 274.59075,866.82996 267.68496,905.69193 266.27183,924.57185 z" +         style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter8379" +       x="-0.14413793" +       width="1.288276" +       y="-0.10278689" +       height="1.2055738"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="7.389266" +         id="feGaussianBlur8381" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8392"> +      <path +         sodipodi:nodetypes="czzzzzzcccccccccczczz" +         id="path8394" +         d="M 760.16396,935.83377 C 766.95806,954.73656 770.65765,969.13346 772.05426,987.04566 C 773.45088,1004.958 768.27158,1038.8465 769.1538,1057.7018 C 770.03555,1076.547 777.28749,1097.8008 796.49843,1106.6707 C 815.9173,1115.6365 845.81767,1116.882 870.61827,1103.5251 C 895.41887,1090.1681 928.01929,1033.1996 941.59253,1006.2164 C 955.21638,979.13246 980.3536,891.71903 986.25333,856.44781 C 992.15306,821.1766 988.80387,815.14704 981.63585,807.39232 C 984.27615,779.55217 980.13613,752.45689 994.74554,720.20614 C 964.49653,732.03184 957.36325,760.36684 946.42665,785.71122 C 938.42574,734.77829 946.63581,714.43803 949.74554,684.49186 C 920.68078,699.26977 906.88403,731.60588 904.74554,777.349 C 893.82159,776.0448 883.3541,772.91477 871.17411,776.63471 C 870.91007,730.61137 869.71055,699.7453 880.08474,662.42822 C 826.82927,683.45508 817.13746,769.02232 824.03125,775.20614 C 813.14843,775.74114 802.66017,773.90884 791.17411,778.06329 C 791.81303,735.49194 790.91365,693.15468 761.17411,655.20614 C 761.17411,655.20614 730.21605,736.12848 729.74554,758.77757 C 729.27503,781.42666 739.19713,798.94345 739.19713,798.94345 C 739.19713,798.94345 730.62906,835.68396 732.89854,857.17568 C 735.19439,878.91714 753.34144,916.85185 760.16396,935.83377 z" +         style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +    </clipPath> +    <filter +       inkscape:collect="always" +       id="filter8404" +       x="-0.090268657" +       width="1.1805373" +       y="-0.10250848" +       height="1.205017"> +      <feGaussianBlur +         inkscape:collect="always" +         stdDeviation="5.3457272" +         id="feGaussianBlur8406" /> +    </filter> +    <clipPath +       clipPathUnits="userSpaceOnUse" +       id="clipPath8417"> +      <path +         sodipodi:nodetypes="czzzzzzcccccccccczczz" +         id="path8419" +         d="M 760.16396,935.83377 C 766.95806,954.73656 770.65765,969.13346 772.05426,987.04566 C 773.45088,1004.958 768.27158,1038.8465 769.1538,1057.7018 C 770.03555,1076.547 777.28749,1097.8008 796.49843,1106.6707 C 815.9173,1115.6365 845.81767,1116.882 870.61827,1103.5251 C 895.41887,1090.1681 928.01929,1033.1996 941.59253,1006.2164 C 955.21638,979.13246 980.3536,891.71903 986.25333,856.44781 C 992.15306,821.1766 988.80387,815.14704 981.63585,807.39232 C 984.27615,779.55217 980.13613,752.45689 994.74554,720.20614 C 964.49653,732.03184 957.36325,760.36684 946.42665,785.71122 C 938.42574,734.77829 946.63581,714.43803 949.74554,684.49186 C 920.68078,699.26977 906.88403,731.60588 904.74554,777.349 C 893.82159,776.0448 883.3541,772.91477 871.17411,776.63471 C 870.91007,730.61137 869.71055,699.7453 880.08474,662.42822 C 826.82927,683.45508 817.13746,769.02232 824.03125,775.20614 C 813.14843,775.74114 802.66017,773.90884 791.17411,778.06329 C 791.81303,735.49194 790.91365,693.15468 761.17411,655.20614 C 761.17411,655.20614 730.21605,736.12848 729.74554,758.77757 C 729.27503,781.42666 739.19713,798.94345 739.19713,798.94345 C 739.19713,798.94345 730.62906,835.68396 732.89854,857.17568 C 735.19439,878.91714 753.34144,916.85185 760.16396,935.83377 z" +         style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +    </clipPath> +  </defs> +  <metadata +     id="metadata7"> +    <rdf:RDF> +      <cc:Work +         rdf:about=""> +        <dc:format>image/svg+xml</dc:format> +        <dc:type +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> +      </cc:Work> +    </rdf:RDF> +  </metadata> +  <g +     inkscape:groupmode="layer" +     id="layer1" +     inkscape:label="Shadow"> +    <path +       style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter11361);enable-background:new" +       d="M 304.64285,526.6479 C 294.64285,527.00505 286.42857,529.50504 286.42857,529.50504 L 293.92857,535.57647 L 304.28571,539.1479 L 320.35714,539.50504 L 342.85714,534.1479 L 350.71428,535.21933 L 371.07143,533.07647 L 360.71428,539.86219 C 366.17351,538.83858 378.10757,543.4313 370.35714,545.21933 C 368.61714,545.62075 384.28571,540.57648 384.28571,540.57648 L 386.78571,535.93361 L 390.35714,526.6479 L 401.78571,526.6479 L 419.99999,522.00504 L 423.57143,517.00505 L 407.49999,518.07647 L 395.35714,520.21933 L 380.71428,515.21933 L 310.02218,531.92707 L 304.64285,526.6479 z" +       id="path10326" +       sodipodi:nodetypes="cccccccccsccccccccccc" +       transform="matrix(10.726753,0,0,10.726753,-2882.1235,-4565.4583)" +       inkscape:export-filename="/home/cheeseness/Documents/LCA09/mascot/tuz_new.png" +       inkscape:export-xdpi="142.10527" +       inkscape:export-ydpi="142.10527" /> +  </g> +  <g +     inkscape:groupmode="layer" +     id="layer20" +     inkscape:label="New Ear"> +    <g +       style="opacity:1;display:inline;enable-background:new" +       id="g7882" +       transform="matrix(0.71084,-0.1937433,0.262963,0.9648058,503.68027,136.48399)"> +      <path +         sodipodi:nodetypes="czzzzcc" +         id="path7876" +         d="M 245.12255,100.05344 C 245.12255,100.05344 197.99444,68.406519 177.9079,64.252501 C 157.86998,60.108538 139.435,60.934923 125.97426,77.859824 C 112.51352,94.784725 113.89687,139.12502 112.43872,164.82937 C 110.98057,190.53372 114.98817,235.00638 130.04332,253.49489 C 145.09848,271.98339 175.92966,267.07991 179.97027,274.90859 C 182.1831,279.19595 245.12255,100.05344 245.12255,100.05344 z" +         style="opacity:1;fill:url(#radialGradient7904);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +      <path +         sodipodi:nodetypes="czzzzzc" +         id="path7878" +         d="M 135.37935,82.017807 C 135.37935,82.017807 161.7229,83.95659 173.01242,95.920995 C 184.42736,108.01833 186.74699,117.25251 188.30828,133.65558 C 189.87165,150.08057 187.45871,162.0737 180.49446,169.69292 C 173.53021,177.31214 179.49017,189.27624 154.57841,181.76399 C 129.66665,174.25174 127.54617,153.98101 128.06318,135.45924 C 128.58039,116.93026 135.37935,82.017807 135.37935,82.017807 z" +         style="opacity:1;fill:url(#radialGradient7906);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +      <path +         sodipodi:nodetypes="czccssc" +         id="path7880" +         d="M 135.648,81.927211 C 135.648,81.927211 131.00335,98.292286 136.23625,110.49031 C 141.72419,123.28285 163.4605,154.75038 163.4605,165.14596 L 186.11675,160.14596 C 188.65893,153.17952 189.32727,144.3939 188.30425,133.64596 C 186.74296,117.24289 184.43795,108.02455 173.023,95.927211 C 163.36812,85.695164 141.42989,82.552354 135.648,81.927211 z" +         style="opacity:1;fill:url(#radialGradient7908);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +    </g> +  </g> +  <g +     inkscape:groupmode="layer" +     id="layer21" +     inkscape:label="Rendered2" +     style="display:inline"> +    <path +       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 845.03125,1154.7776 C 840.74554,1155.4919 817.4031,1158.3957 787.17411,1164.7776 C 756.94512,1171.1595 729.86016,1169.7437 651.38803,1182.1072 C 571.53625,1194.688 557.32367,1224.6495 543.26578,1229.1715 C 528.56564,1233.9001 397.88839,1163.349 397.88839,1163.349 L 402.17411,1069.0633 C 402.17411,1069.0633 488.05962,1052.8624 514.31696,1035.4919 C 540.57431,1018.1214 559.89934,985.82588 573.60268,964.06329 C 587.30602,942.3007 606.45982,892.63471 606.45982,892.63471 L 845.03125,1154.7776 z" +       id="path7917" +       sodipodi:nodetypes="czzzcczzcc" /> +    <path +       style="opacity:0.5;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8888);enable-background:accumulate" +       d="M 332.34019,898.38549 L 299.60838,837.08593 L 261.99104,882.19239 C 264.16779,883.5095 267.76529,861.33636 307.59144,817.77531 L 332.34019,898.38549 z" +       id="path7919" +       clip-path="url(#clipPath8658)" +       sodipodi:nodetypes="ccccc" +       transform="translate(276,136)" /> +    <path +       style="opacity:1;fill:url(#linearGradient2841);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8892);enable-background:accumulate" +       d="M 200.81833,863.03015 L 347.18943,811.41136 L 591.14127,1037.6855 L 349.31075,1177.6927 L 168.29141,1090.0114 L 200.81833,863.03015 z" +       id="path7923" +       clip-path="url(#clipPath2833)" +       sodipodi:nodetypes="cccccc" +       transform="translate(276,136)" /> +    <path +       style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 642.88839,640.13471 C 642.88839,640.13471 613.33433,680.70776 595.03125,714.42042 C 576.72816,748.13309 536.41016,840.77736 524.67411,885.49185 C 512.91471,930.29529 462.17411,1009.0633 462.17411,1009.0633 L 538.24554,1027.2776 C 538.24554,1027.2776 550.05266,1014.4542 569.31696,981.20614 C 588.58126,947.95806 629.67411,842.63471 629.67411,842.63471 L 642.88839,640.13471 z" +       id="path7921" +       sodipodi:nodetypes="czzcczcc" /> +    <path +       style="opacity:0.4;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8856);enable-background:accumulate" +       d="M 430.28131,381.94122 C 423.21025,384.76965 194.10007,414.09303 194.10007,414.09303 L 154.46046,773.92607 L 244.65895,866.56568 L 296.98485,752.01438 L 397.45289,565.62246 L 430.28131,381.94122 z" +       id="path7925" +       sodipodi:nodetypes="ccccccc" +       clip-path="url(#clipPath3665)" +       transform="translate(276,136)" /> +    <path +       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 969.67051,1164.0346 C 969.67051,1164.0346 992.92679,1175.4283 1005.7383,1184.5107 C 1018.4357,1193.5122 1035.2107,1209.1598 1047.4307,1221.8712 C 1059.7362,1234.6714 1067.5434,1244.4699 1088.9634,1246.032 C 1110.3956,1247.5949 1142.2458,1237.2444 1162.2594,1221.3678 C 1182.2729,1205.4912 1207.9063,1152.135 1207.9063,1152.135 L 1080.7455,1009.0633" +       id="path7927" +       sodipodi:nodetypes="czzzzcc" /> +    <path +       style="opacity:0.75;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8860);enable-background:accumulate" +       d="M 331.34019,641.50471 L 216.17367,835.36467 L 260.2153,925.96265 L 357.79603,732.21539 L 331.34019,641.50471 z" +       id="path7929" +       clip-path="url(#clipPath8642)" +       sodipodi:nodetypes="ccccc" +       transform="translate(276,136)" /> +    <g +       style="opacity:1;display:inline;enable-background:new" +       id="g7931" +       transform="matrix(0.9934486,0.1142802,-0.1142802,0.9934486,-9.24324,588.09054)" +       inkscape:transform-center-x="-347.89063" +       inkscape:transform-center-y="-28.255779"> +      <path +         style="opacity:1;fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +         d="M 1049.205,-282.26672 L 1049.1152,-282.25891 C 1047.7278,-281.37446 1042.5119,-280.65171 1042.4862,-272.73547 C 1042.462,-265.31022 1057.4991,-255.64401 1059.6425,-254.64172 C 1061.3727,-253.83263 1063.2341,-253.23296 1065.0488,-252.92297 L 1066.4862,-252.70422 C 1068.4059,-252.49228 1070.2062,-252.55281 1071.6425,-252.79797 C 1074.7616,-253.33037 1076.7541,-253.72658 1078.7362,-254.11047 C 1080.7183,-254.49434 1081.2105,-255.15012 1082.2988,-255.39172 C 1083.4275,-255.64238 1084.569,-255.27543 1088.5488,-256.26672 C 1092.5283,-257.258 1093.9782,-257.68602 1094.6738,-258.04797 C 1095.396,-258.42398 1096.4355,-258.91855 1097.0488,-259.57922 C 1099.0117,-259.59127 1100.8425,-259.87027 1102.2675,-260.42297 C 1105.2187,-261.56758 1107.1407,-262.29239 1108.955,-263.17297 C 1110.4107,-263.8795 1111.2741,-264.875 1111.4862,-265.17297 C 1111.6985,-265.47093 1111.5852,-265.90152 1111.6112,-265.92297 C 1111.6542,-265.95821 1111.9517,-266.017 1112.1112,-266.36047 C 1112.9702,-268.20755 1114.4344,-271.98811 1114.5488,-272.67297 C 1114.6625,-273.35512 1114.7168,-274.02574 1114.7675,-274.42297 C 1114.7969,-274.65248 1114.6204,-275.30187 1114.6425,-275.36047 C 1114.6734,-275.44252 1114.9308,-275.61104 1114.9862,-275.86047 C 1115.2525,-277.05879 1115.0754,-278.06783 1114.8612,-279.48547 C 1114.6473,-280.90311 1113.8896,-284.1001 1113.2362,-284.95422 C 1112.8168,-285.50279 1112.4369,-285.74672 1112.08,-285.86047 C 1112.0129,-285.87776 1111.9561,-285.90721 1111.8925,-285.92297 C 1111.8715,-285.92695 1111.8508,-285.91983 1111.83,-285.92297 C 1111.5184,-285.99847 1111.2215,-286.08164 1110.6738,-286.14172 C 1109.6883,-286.24984 1108.2491,-286.40112 1106.705,-286.39172 C 1106.1903,-286.38859 1105.6679,-286.34408 1105.1425,-286.29797 C 1101.5836,-285.98569 1096.1327,-285.30689 1094.9238,-284.67297 C 1093.2907,-285.00699 1090.9756,-285.2852 1088.9862,-285.14172 C 1085.9222,-284.92075 1084.0185,-284.79953 1082.08,-284.67297 C 1080.1416,-284.54642 1080.3939,-284.28433 1079.1738,-284.20422 C 1077.8547,-284.11762 1077.3869,-284.42747 1073.6112,-284.11047 C 1070.0655,-283.81275 1064.6306,-283.1173 1063.3925,-282.48547 C 1061.7591,-282.81998 1059.4466,-283.09786 1057.455,-282.95422 C 1054.3908,-282.73324 1052.4872,-282.58078 1050.5488,-282.45422 C 1049.8896,-282.41119 1049.5064,-282.33029 1049.205,-282.26672 z" +         id="path7933" /> +      <g +         clip-path="url(#clipPath7616)" +         style="display:inline;filter:url(#filter7610);enable-background:new" +         id="g7935" +         transform="matrix(0.9975712,-6.9654277e-2,6.9654277e-2,0.9975712,872.72062,140.02502)"> +        <path +           sodipodi:nodetypes="ccssscsssscscsscsssccscssccsscssscc" +           id="path7937" +           d="M 229.94262,-409.12268 C 226.38481,-409.07267 220.91842,-408.76259 219.63928,-408.21854 C 218.03319,-408.66601 215.73612,-409.09985 213.73933,-409.09528 C 210.66734,-409.08826 208.77464,-409.08651 206.83206,-409.09528 C 206.17159,-409.09827 205.78447,-409.02811 205.47939,-408.98569 C 205.47939,-408.98569 205.47939,-407.88976 205.47939,-407.88976 C 205.59911,-408.06923 205.87191,-408.58022 206.42914,-408.65691 C 207.17672,-408.7598 211.59842,-408.80814 213.73933,-408.76651 C 215.51393,-408.73198 218.19456,-408.49224 220.12854,-407.80756 C 220.44994,-407.69378 220.74779,-407.53378 221.02073,-407.39659 C 222.98415,-406.40966 228.96409,-403.09505 228.96409,-403.09505 C 228.96409,-403.09505 222.33134,-407.04273 221.48122,-407.53358 C 221.27791,-407.65097 220.90658,-407.79127 220.44513,-407.94456 C 221.66576,-408.39235 225.5211,-408.56427 228.27336,-408.65691 C 231.29786,-408.75873 231.62112,-408.7465 233.68405,-408.46512 C 235.81336,-408.17469 237.02256,-407.86236 237.02256,-407.86236 C 237.02255,-407.86236 236.9442,-408.50354 238.05865,-408.65691 C 238.80622,-408.7598 243.22794,-408.80814 245.36884,-408.76651 C 247.43834,-408.72625 250.73489,-408.35935 252.65024,-407.39659 C 253.65356,-406.89226 255.68588,-405.82796 257.44559,-404.86088 L 257.5412,-404.88031 C 257.5412,-404.88031 253.96086,-407.04273 253.11073,-407.53358 C 252.90742,-407.65097 252.5361,-407.79127 252.07464,-407.94456 C 253.29526,-408.39235 257.12183,-408.56427 259.87409,-408.65691 C 262.89859,-408.75873 263.22184,-408.7465 265.28478,-408.46512 C 267.23794,-408.19872 268.2977,-407.93506 268.47939,-407.88976 C 268.47939,-407.88976 268.4523,-408.20122 268.4523,-408.20122 C 268.04327,-408.33767 267.73806,-408.43457 267.05192,-408.5587 C 265.75111,-408.79403 263.6528,-409.16026 261.54335,-409.12268 C 257.9714,-409.05904 252.49007,-408.76672 251.24001,-408.21854 C 249.63418,-408.66549 247.36339,-409.09984 245.36884,-409.09528 C 242.29685,-409.08826 240.37536,-409.08651 238.43279,-409.09528 C 236.49023,-409.10406 236.72011,-408.81621 235.49721,-408.8213 C 234.1753,-408.8268 233.73109,-409.17593 229.94262,-409.12268 C 229.94262,-409.12268 229.94262,-409.12268 229.94262,-409.12268" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +        <path +           id="path7939" +           d="M 206.1989,-407.47878 C 208.11911,-406.66172 210.77605,-405.28595 212.35787,-404.08139 C 213.93971,-402.87683 215.26544,-402.30771 217.91246,-400.16344 C 218.79803,-399.44606 219.66111,-398.81359 220.50439,-398.2417 L 221.04496,-398.43181 C 220.33173,-398.9152 219.5772,-399.45212 218.77587,-400.05384 C 215.95364,-402.17305 215.14932,-402.86357 212.7608,-404.32798 C 210.37226,-405.79238 208.66132,-406.69374 206.1989,-407.47878 C 206.1989,-407.47878 206.1989,-407.47878 206.1989,-407.47878" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +           sodipodi:nodetypes="cssccsscc" /> +        <path +           id="path7941" +           d="M 237.79963,-407.47878 C 239.71984,-406.66172 242.40557,-405.28595 243.98738,-404.08139 C 244.80045,-403.46223 245.54587,-403.01097 246.43784,-402.42738 L 247.08684,-402.54404 C 246.28853,-403.12041 245.51507,-403.63839 244.39031,-404.32798 C 242.00177,-405.79238 240.26205,-406.69374 237.79963,-407.47878 C 237.79963,-407.47878 237.79963,-407.47878 237.79963,-407.47878" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +           sodipodi:nodetypes="csccscc" /> +      </g> +      <g +         clip-path="url(#clipPath7606)" +         id="g7943"> +        <path +           style="opacity:0.75;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7578);enable-background:new" +           d="M 1056.25,-278.80481 C 1060.3946,-280.28358 1066.25,-275.67981 1066.25,-275.67981 C 1067.149,-275.39889 1068.9751,-276.57428 1068.8743,-277.36595 C 1068.8743,-277.36595 1067.324,-279.22657 1068.5,-280.30481 C 1069.676,-281.38305 1073.796,-278.79743 1076,-278.67981 C 1078.204,-278.56219 1081.5621,-278.90922 1083,-279.42981 C 1084.4379,-279.9504 1084.1129,-280.8544 1085.625,-281.17981 C 1087.1371,-281.50522 1090.7439,-280.14227 1092.6855,-280.01098 C 1094.6271,-279.87969 1097.3336,-279.67671 1098.5,-280.17981 C 1099.6664,-280.68291 1098.6782,-281.33902 1100.375,-282.05481 C 1102.0718,-282.7706 1108.1352,-283.01143 1110,-282.17981 C 1111.8648,-281.34819 1111.8099,-281.66061 1112.625,-279.17981 C 1113.4401,-276.69901 1120.0648,-274.01696 1111.5,-265.80481 C 1102.9352,-257.59266 1052.1221,-252.01887 1045.875,-263.05481 C 1039.6279,-274.09075 1052.1054,-277.32604 1056.25,-278.80481 z" +           id="path7945" +           sodipodi:nodetypes="czzzzzzzzzzzzzz" /> +        <path +           style="opacity:0.75;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7594);enable-background:new" +           d="M 1058.5,-275.42981 C 1062.6446,-276.90858 1068.5,-272.30481 1068.5,-272.30481 C 1069.399,-272.02389 1071.2251,-273.19928 1071.1243,-273.99095 C 1071.1243,-273.99095 1069.574,-275.85157 1070.75,-276.92981 C 1071.926,-278.00805 1076.046,-275.42243 1078.25,-275.30481 C 1080.454,-275.18719 1083.8121,-275.53422 1085.25,-276.05481 C 1086.6879,-276.5754 1086.3629,-277.4794 1087.875,-277.80481 C 1089.3871,-278.13022 1092.9939,-276.76727 1094.9355,-276.63598 C 1096.8771,-276.50469 1099.5836,-276.30171 1100.75,-276.80481 C 1101.9164,-277.30791 1100.9282,-277.96402 1102.625,-278.67981 C 1104.3218,-279.3956 1110.3852,-279.63643 1112.25,-278.80481 C 1114.1148,-277.97319 1114.0599,-278.28561 1114.875,-275.80481 C 1115.6901,-273.32401 1122.3148,-270.64196 1113.75,-262.42981 C 1105.1852,-254.21766 1054.3721,-248.64387 1048.125,-259.67981 C 1041.8779,-270.71575 1054.3554,-273.95104 1058.5,-275.42981 z" +           id="path7947" +           sodipodi:nodetypes="czzzzzzzzzzzzzz" /> +      </g> +    </g> +    <path +       style="opacity:1;fill:#101414;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 628.24553,347.99185 C 624.4411,322.72762 611.43581,297.35383 611.08873,272.46662 C 610.90247,259.1111 614.36158,245.89571 624.84426,232.91257 C 661.19128,167.61674 741.78517,148.21789 810.77892,141.44715 C 897.70131,130.43035 995.69159,159.38722 1044.1503,236.84843 C 1098.2743,312.58173 1100.825,409.38755 1124.7623,496.37638 C 1154.2001,623.50398 1179.5414,752.59052 1185.1545,883.22673 C 1182.0911,961.40858 1176.7282,1048.4109 1124.6513,1111.3609 C 1076.6248,1161.7183 1001.8649,1161.4139 937.58145,1170.3632 C 847.02606,1175.0182 753.22992,1154.2174 675.79755,1106.165 C 611.02191,1068.225 580.06736,992.68633 578.51815,920.14538 C 570.12898,840.27022 604.90967,766.33687 630.13855,692.98577 C 637.60916,610.2247 639.55141,526.73802 639.79189,443.60093 C 638.95507,411.40549 632.70236,379.7836 628.24553,347.99185 z" +       id="path7949" +       sodipodi:nodetypes="cscccccccccccc" /> +    <path +       style="opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8940);enable-background:accumulate" +       d="M 311.83409,415.43155 L 321.73359,537.05392 L 261.62951,673.52553 L 277.18586,848.1809 C 292.79912,910.0601 309.37131,946.84995 351.56201,965.23473 C 355.88112,928.99475 312.95049,822.27485 312.31937,776.11489 C 311.68792,729.93044 323.14971,667.50703 342.99704,617.81842 C 363.04539,567.62654 379.89378,572.972 385.12193,525.22549 C 390.35008,477.47898 367.69553,375.83357 367.69553,375.83357 L 311.83409,415.43155 z" +       id="path7951" +       sodipodi:nodetypes="ccccczzzcc" +       clip-path="url(#clipPath8616)" +       transform="translate(276,136)" /> +    <path +       style="opacity:1;fill:url(#linearGradient8970);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 1010.0312,655.49186 C 1010.0312,655.49186 1026.7864,692.50992 1038.7327,709.44581 C 1050.6789,726.3817 1091.4598,765.49186 1091.4598,765.49186 L 1144.057,637.90211" +       id="path7953" +       sodipodi:nodetypes="czcc" /> +    <path +       style="opacity:0.07999998;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8822);enable-background:accumulate" +       d="M 730.31998,536.56864 C 730.31998,545.05392 772.86772,595.03667 772.86772,595.03667 L 785.47431,566.26713 L 730.31998,536.56864 z" +       id="path7955" +       sodipodi:nodetypes="cccc" +       clip-path="url(#clipPath8209)" +       transform="translate(276,136)" /> +    <g +       transform="translate(450.03125,73.843964)" +       style="opacity:1;display:inline;enable-background:new" +       id="g7957" +       clip-path="url(#clipPath3998)"> +      <g +         transform="translate(-174.03125,62.156036)" +         style="filter:url(#filter3677)" +         id="g7959"> +        <g +           id="g7961" +           style="filter:url(#filter3785)"> +          <path +             sodipodi:nodetypes="czzzzzzzzzz" +             id="path7963" +             d="M 425.88244,476.99186 C 436.68787,475.5132 450.62645,480.34637 470.5253,480.20614 C 490.42415,480.06591 527.97852,463.29492 552.66815,463.06328 C 577.35778,462.83164 615.41985,475.34734 631.95387,478.06328 C 648.48789,480.77922 654.80219,477.90476 659.45386,485.92043 C 664.10553,493.9361 661.38057,496.66767 649.09672,506.63472 C 636.81287,516.60177 608.30704,519.27104 583.02529,519.49186 C 557.74295,519.71268 512.644,526.57038 487.66815,523.42042 C 462.6923,520.27046 430.73059,515.59775 418.73958,505.56328 C 406.74857,495.52881 398.88874,488.83146 401.23958,481.63471 C 403.59042,474.43796 415.07701,478.47052 425.88244,476.99186 z" +             style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <rect +             y="412.60312" +             x="343.6539" +             height="181.01935" +             width="381.83765" +             id="rect7965" +             style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +        </g> +        <g +           id="g7967" +           style="filter:url(#filter3785)"> +          <path +             sodipodi:nodetypes="czzzcc" +             id="path7969" +             d="M 687.14286,452.36218 C 676.68117,462.07661 600.16326,471.36732 586.42857,481.6479 C 572.69388,491.92848 571.67605,494.53616 574.28571,501.6479 C 576.89537,508.75964 580.83098,511.05362 600,510.21932 C 619.16902,509.38502 698.57143,482.5976 698.57143,488.79075 L 687.14286,452.36218 z" +             style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +             transform="translate(174.03125,-62.156036)" /> +          <rect +             y="344.82138" +             x="702.86414" +             height="162.63455" +             width="207.8894" +             id="rect7971" +             style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +        </g> +      </g> +      <g +         transform="translate(-174.03125,62.156036)" +         style="opacity:0.18000004;display:inline;enable-background:new" +         id="g7973"> +        <g +           id="g7975" +           style="filter:url(#filter3785)"> +          <path +             sodipodi:nodetypes="czzzzzzzzzz" +             id="path7977" +             d="M 425.88244,476.99186 C 436.68787,475.5132 450.62645,480.34637 470.5253,480.20614 C 490.42415,480.06591 527.97852,463.29492 552.66815,463.06328 C 577.35778,462.83164 615.41985,475.34734 631.95387,478.06328 C 648.48789,480.77922 654.80219,477.90476 659.45386,485.92043 C 664.10553,493.9361 661.38057,496.66767 649.09672,506.63472 C 636.81287,516.60177 608.30704,519.27104 583.02529,519.49186 C 557.74295,519.71268 512.644,526.57038 487.66815,523.42042 C 462.6923,520.27046 430.73059,515.59775 418.73958,505.56328 C 406.74857,495.52881 398.88874,488.83146 401.23958,481.63471 C 403.59042,474.43796 415.07701,478.47052 425.88244,476.99186 z" +             style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <rect +             y="412.60312" +             x="343.6539" +             height="181.01935" +             width="381.83765" +             id="rect7979" +             style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +        </g> +        <g +           id="g7981" +           style="filter:url(#filter3785)"> +          <path +             sodipodi:nodetypes="czzzcc" +             id="path7983" +             d="M 687.14286,452.36218 C 676.68117,462.07661 600.16326,471.36732 586.42857,481.6479 C 572.69388,491.92848 571.67605,494.53616 574.28571,501.6479 C 576.89537,508.75964 580.83098,511.05362 600,510.21932 C 619.16902,509.38502 698.57143,482.5976 698.57143,488.79075 L 687.14286,452.36218 z" +             style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +             transform="translate(174.03125,-62.156036)" /> +          <rect +             y="344.82138" +             x="702.86414" +             height="162.63455" +             width="207.8894" +             id="rect7985" +             style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +        </g> +      </g> +    </g> +    <path +       style="opacity:0.75;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8802);enable-background:accumulate" +       d="M 582.65599,-7.4183011 L 695.79307,78.848726 L 804.68752,337.64981 L 842.87128,545.5392 L 963.07944,637.46308 C 963.07944,637.46308 950.35151,350.37773 943.28044,323.50767 C 936.20938,296.63761 793.37381,-69.643698 793.37381,-69.643698 L 582.65599,-7.4183011 z" +       id="path7987" +       clip-path="url(#clipPath8604)" +       sodipodi:nodetypes="cccccscc" +       transform="translate(276,136)" /> +    <path +       style="opacity:1;fill:url(#linearGradient8958);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 964.13839,239.599 C 964.13839,239.599 972.81571,250.49562 988.24554,251.56328 C 1003.6754,252.63094 1037.9672,211.61061 1058.4241,199.42043 C 1078.9034,187.2169 1105.4705,172.81818 1122.3527,179.06329 C 1139.2348,185.30839 1144.5105,205.49938 1150.2098,227.099 C 1155.9092,248.69861 1156.9284,288.91289 1147.5313,319.95615 C 1138.1341,350.9994 1097.028,393.0599 1082.1741,423.349 C 1067.3202,453.6381 1070.567,463.17043 1070.567,463.17043" +       id="path7989" +       sodipodi:nodetypes="czzzzzzc" /> +    <path +       style="opacity:1;fill:url(#radialGradient3315);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +       d="M 1124.4955,207.63471 C 1108.6027,206.74185 1074.7767,219.74054 1058.4241,231.92043 C 1041.9855,244.16433 1029.2032,256.03483 1029.1384,284.06328 C 1029.0732,312.26932 1042.2575,323.13969 1058.2455,331.02757 C 1074.2335,338.91546 1091.9317,338.14685 1110.2098,319.24186 C 1128.488,300.33686 1124.4955,207.63471 1124.4955,207.63471 z" +       id="path7991" +       sodipodi:nodetypes="czzzzc" /> +    <path +       sodipodi:type="arc" +       style="opacity:0.75;fill:url(#radialGradient3543);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4120);enable-background:accumulate" +       id="path7993" +       sodipodi:cx="385" +       sodipodi:cy="237.00504" +       sodipodi:rx="86.428574" +       sodipodi:ry="73.928574" +       d="M 471.42857,237.00504 A 86.428574,73.928574 0 1 1 298.57143,237.00504 A 86.428574,73.928574 0 1 1 471.42857,237.00504 z" +       transform="matrix(0.9434749,-0.1239943,0.1440089,1.0957669,451.94827,134.5988)" +       clip-path="url(#clipPath4100)" /> +    <path +       transform="translate(450.03125,73.843964)" +       style="opacity:1;fill:url(#radialGradient3915);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 527.60588,407.44884 C 527.60588,407.44884 405.56444,445.85232 340.09154,417.08065 C 274.61865,388.30899 265.71429,292.36218 265.71429,292.36218 C 265.71429,292.36218 339.09587,211.85825 395.63507,208.74742 C 451.46212,205.67578 486.20893,228.89074 510.50508,274.59913 C 534.85708,320.41261 527.60588,407.44884 527.60588,407.44884 z" +       id="path7995" +       sodipodi:nodetypes="csczzc" +       mask="url(#mask3684)" /> +    <path +       style="opacity:1;fill:url(#linearGradient3959);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 772.17411,393.349 C 772.17411,393.349 808.39165,365.96653 823.78125,357.45614 C 838.95859,349.06313 849.49553,345.849 859.6741,345.849 L 844.13839,412.81328" +       id="path7997" +       sodipodi:nodetypes="czcc" /> +    <path +       sodipodi:type="arc" +       style="opacity:1;fill:url(#radialGradient3933);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       id="path7999" +       sodipodi:cx="409.28571" +       sodipodi:cy="306.64789" +       sodipodi:rx="36.25" +       sodipodi:ry="36.25" +       d="M 445.53571,306.64789 A 36.25,36.25 0 1 1 373.03571,306.64789 A 36.25,36.25 0 1 1 445.53571,306.64789 z" +       transform="translate(449.49554,74.915393)" /> +    <path +       style="opacity:0.3;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8806);enable-background:accumulate" +       d="M 311.83409,415.43155 L 321.73359,537.05392 L 261.62951,673.52553 L 277.18586,848.1809 C 292.79912,910.0601 309.37131,946.84995 351.56201,965.23473 C 355.88112,928.99475 360.24362,892.86709 320.31937,742.11489 L 337.99704,672.81842 L 410.12193,534.22549 L 367.69553,375.83357 L 311.83409,415.43155 z" +       id="path8001" +       sodipodi:nodetypes="cccccccccc" +       clip-path="url(#clipPath8616)" +       transform="translate(276,136)" /> +    <path +       style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8826);enable-background:accumulate" +       d="M 635.21025,581.13004 C 621.06811,593.85796 674.44372,615.71019 711.57778,605.17167 C 748.71184,594.63315 816.22265,569.6073 814.81537,525.97571 C 813.40809,482.34413 738.44784,397.28228 738.44784,397.28228 L 635.21025,581.13004 z" +       id="path8003" +       sodipodi:nodetypes="czzcc" /> +    <path +       sodipodi:type="arc" +       style="opacity:1;fill:url(#radialGradient3991);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       id="path8005" +       sodipodi:cx="410" +       sodipodi:cy="306.64789" +       sodipodi:rx="23.214285" +       sodipodi:ry="23.214285" +       d="M 433.21428,306.64789 A 23.214285,23.214285 0 1 1 386.78572,306.64789 A 23.214285,23.214285 0 1 1 433.21428,306.64789 z" +       transform="translate(449.67411,74.915393)" /> +    <path +       sodipodi:type="arc" +       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3981);enable-background:accumulate" +       id="path8007" +       sodipodi:cx="414.28571" +       sodipodi:cy="303.07648" +       sodipodi:rx="7.5" +       sodipodi:ry="7.5" +       d="M 421.78571,303.07648 A 7.5,7.5 0 1 1 406.78571,303.07648 A 7.5,7.5 0 1 1 421.78571,303.07648 z" +       transform="translate(451.99554,73.486821)" /> +    <path +       style="opacity:1;fill:url(#radialGradient4112);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 789.31696,478.349 C 789.31696,478.349 796.33977,497.91759 788.24553,513.349 C 780.15129,528.78041 745.92236,552.33722 720.74554,563.349 C 695.43582,574.41891 635.27254,596.31293 618.95982,605.31328 C 602.49834,614.39571 600.74554,617.99185 600.74554,617.99185 C 600.74554,617.99185 593.59861,598.92744 629.49553,566.20615 C 665.66764,533.23401 771.52265,518.15665 789.31696,478.349 z" +       id="path8009" +       sodipodi:nodetypes="czzzczc" /> +    <g +       style="opacity:1;display:inline;enable-background:new" +       id="g8011" +       transform="translate(780.74553,74.55825)"> +      <path +         transform="translate(-329.81481,0)" +         clip-path="url(#clipPath3999)" +         sodipodi:nodetypes="czzczzzszc" +         id="path8013" +         d="M 179.64286,267.36218 C 157.23242,307.0651 119.02676,383.14247 110.35715,417.00504 C 101.70994,450.78014 101.58516,483.42158 110,503.43362 C 118.3602,523.31575 136.16398,539.06642 150.71428,544.86218 C 150.1179,530.48631 165.08723,501.57635 223.57143,472.36218 C 282.1977,443.07704 301.95306,445.23132 327.14285,425.21932 C 352.77291,404.85756 335.34872,345.57268 330.35714,331.29075 C 325.36556,317.00882 329.12051,327.91101 328.41112,326.19774 C 317.72184,300.38182 294.1968,271.76744 263.92857,261.6479 C 233.66034,251.52836 198.91081,256.79953 179.64286,267.36218 z" +         style="opacity:1;fill:url(#radialGradient3585);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" /> +      <path +         transform="matrix(0.8823874,0.4705236,-0.4705236,0.8823874,-166.62245,2.387362)" +         d="M 248.28731,338.07648 A 64.715881,134.00607 0 1 1 118.85555,338.07648 A 64.715881,134.00607 0 1 1 248.28731,338.07648 z" +         sodipodi:ry="134.00607" +         sodipodi:rx="64.715881" +         sodipodi:cy="338.07648" +         sodipodi:cx="183.57143" +         id="path8015" +         style="opacity:1;fill:url(#radialGradient4060);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         sodipodi:type="arc" /> +      <path +         transform="matrix(0.8823874,0.4705236,-0.4705236,0.8823874,-162.19388,-18.755495)" +         d="M 248.28731,338.07648 A 64.715881,134.00607 0 1 1 118.85555,338.07648 A 64.715881,134.00607 0 1 1 248.28731,338.07648 z" +         sodipodi:ry="134.00607" +         sodipodi:rx="64.715881" +         sodipodi:cy="338.07648" +         sodipodi:cx="183.57143" +         id="path8017" +         style="opacity:1;fill:url(#radialGradient4062);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         sodipodi:type="arc" /> +      <path +         transform="translate(-329.81481,3e-7)" +         clip-path="url(#clipPath3999)" +         sodipodi:nodetypes="czzczzzszc" +         id="path8019" +         d="M 179.64286,267.36218 C 157.23242,307.0651 119.02676,383.14247 110.35715,417.00504 C 101.70994,450.78014 101.58516,483.42158 110,503.43362 C 118.3602,523.31575 136.16398,539.06642 150.71428,544.86218 C 150.1179,530.48631 165.08723,501.57635 223.57143,472.36218 C 282.1977,443.07704 301.95306,445.23132 327.14285,425.21932 C 352.77291,404.85756 335.34872,345.57268 330.35714,331.29075 C 325.36556,317.00882 329.12051,327.91101 328.41112,326.19774 C 317.72184,300.38182 294.1968,271.76744 263.92857,261.6479 C 233.66034,251.52836 198.91081,256.79953 179.64286,267.36218 z" +         style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3587);stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter4079);enable-background:new" /> +    </g> +    <path +       sodipodi:type="arc" +       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       id="path8021" +       sodipodi:cx="310.71429" +       sodipodi:cy="398.07648" +       sodipodi:rx="19.704132" +       sodipodi:ry="19.704132" +       d="M 330.41843,398.07648 A 19.704132,19.704132 0 1 1 291.01016,398.07648 A 19.704132,19.704132 0 1 1 330.41843,398.07648 z" +       transform="translate(452.55663,72.581273)" /> +    <path +       sodipodi:type="arc" +       style="opacity:1;fill:url(#radialGradient4056);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4082);stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4083);enable-background:accumulate" +       id="path8023" +       sodipodi:cx="310.71429" +       sodipodi:cy="398.07648" +       sodipodi:rx="19.704132" +       sodipodi:ry="19.704132" +       d="M 330.41843,398.07648 A 19.704132,19.704132 0 1 1 291.01016,398.07648 A 19.704132,19.704132 0 1 1 330.41843,398.07648 z" +       transform="translate(450.55663,72.581273)" /> +    <path +       sodipodi:type="arc" +       style="opacity:1;fill:url(#radialGradient4119);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       id="path8025" +       sodipodi:cx="310.71429" +       sodipodi:cy="398.07648" +       sodipodi:rx="19.704132" +       sodipodi:ry="19.704132" +       d="M 330.41843,398.07648 A 19.704132,19.704132 0 1 1 291.01016,398.07648 A 19.704132,19.704132 0 1 1 330.41843,398.07648 z" +       transform="translate(450.55663,72.581273)" /> +    <path +       sodipodi:type="arc" +       style="opacity:1;fill:url(#radialGradient4868);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4002);enable-background:accumulate" +       id="path8027" +       sodipodi:cx="429.56738" +       sodipodi:cy="377.42877" +       sodipodi:rx="72.079735" +       sodipodi:ry="44.547726" +       d="M 501.64712,377.42877 A 72.079735,44.547726 0 1 1 357.48765,377.42877 A 72.079735,44.547726 0 1 1 501.64712,377.42877 z" +       transform="matrix(0.9969564,-7.7961675e-2,7.7961675e-2,0.9969564,436.61877,125.29509)" +       inkscape:transform-center-x="-47.231976" +       inkscape:transform-center-y="-3.6935079" /> +    <path +       sodipodi:type="arc" +       style="opacity:1;fill:url(#radialGradient4876);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:bevel;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4010);enable-background:accumulate" +       id="path8029" +       sodipodi:cx="437.6991" +       sodipodi:cy="391.21735" +       sodipodi:rx="36.611931" +       sodipodi:ry="22.627417" +       d="M 474.31103,391.21735 A 36.611931,22.627417 0 1 1 401.08717,391.21735 A 36.611931,22.627417 0 1 1 474.31103,391.21735 z" +       transform="matrix(1.4357951,-6.9991037e-2,6.9991037e-2,1.4357951,235.18065,-63.86546)" +       inkscape:transform-center-x="-20.955902" +       inkscape:transform-center-y="-13.056625" /> +    <g +       transform="translate(450.03125,73.843964)" +       id="g8031" +       style="opacity:1;display:inline;filter:url(#filter4053);enable-background:new"> +      <path +         d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z" +         sodipodi:ry="3.2142856" +         sodipodi:rx="3.2142856" +         sodipodi:cy="401.82648" +         sodipodi:cx="413.66071" +         id="path8033" +         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4484);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         sodipodi:type="arc" /> +      <path +         transform="translate(13.125009,8.1249913)" +         d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z" +         sodipodi:ry="3.2142856" +         sodipodi:rx="3.2142856" +         sodipodi:cy="401.82648" +         sodipodi:cx="413.66071" +         id="path8035" +         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4486);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         sodipodi:type="arc" /> +      <path +         transform="translate(32.946437,7.4999913)" +         d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z" +         sodipodi:ry="3.2142856" +         sodipodi:rx="3.2142856" +         sodipodi:cy="401.82648" +         sodipodi:cx="413.66071" +         id="path8037" +         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4488);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         sodipodi:type="arc" /> +      <path +         transform="translate(24.910723,-10.267866)" +         d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z" +         sodipodi:ry="3.2142856" +         sodipodi:rx="3.2142856" +         sodipodi:cy="401.82648" +         sodipodi:cx="413.66071" +         id="path8039" +         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4490);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         sodipodi:type="arc" /> +      <path +         transform="translate(47.589294,-0.6250087)" +         d="M 416.87499,401.82648 A 3.2142856,3.2142856 0 1 1 410.44642,401.82648 A 3.2142856,3.2142856 0 1 1 416.87499,401.82648 z" +         sodipodi:ry="3.2142856" +         sodipodi:rx="3.2142856" +         sodipodi:cy="401.82648" +         sodipodi:cx="413.66071" +         id="path8041" +         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4492);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +         sodipodi:type="arc" /> +    </g> +    <path +       style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +       d="M 896.20301,482.92837 C 897.1881,487.27845 900.74008,489.10785 903.58974,490.82019 C 908.05042,493.33311 910.1099,492.3423 912.74425,490.06258 C 914.3462,488.14141 923.42736,485.36393 928.33848,482.99151 C 932.66809,481.5326 937.24178,477.63278 941.723,474.65775 C 945.11814,473.03051 947.06964,475.01239 949.55168,475.6679 C 952.4958,476.38451 953.96285,477.83965 955.6126,479.20344 C 958.00876,480.37863 954.6847,482.34657 958.8956,483.49658 C 960.08651,483.71452 961.31255,484.07303 962.17859,482.99151" +       id="path8043" +       sodipodi:nodetypes="ccccccccc" /> +    <path +       style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +       d="M 910.85021,475.35223 C 913.16515,475.32025 914.02799,475.99476 916.34292,474.53148 C 919.79856,471.45035 921.74546,471.38671 924.29787,470.11206 C 927.32444,468.79683 930.83357,478.26375 934.3994,479.96105 C 936.79449,479.13963 935.68854,481.75484 935.85149,482.6127 C 935.90862,485.25954 938.65843,486.29076 940.20777,488.04227 C 943.52381,490.29776 947.583,494.33773 951.31945,493.34557 C 957.7647,490.4145 961.59867,492.06411 967.60816,485.95883 C 968.31221,484.77749 967.02391,479.06423 970.70175,478.76149 C 973.22574,479.01487 974.86842,478.81164 976.76267,479.32971 C 982.20367,481.4469 984.50045,485.77971 991.47301,487.28466 C 997.65591,488.25105 999.08565,491.07892 1005.3626,492.33542" +       id="path8045" +       sodipodi:nodetypes="cccccccccccc" /> +    <path +       style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +       d="M 876.98133,483.52197 C 879.37991,482.72817 883.08746,487.71407 885.15446,490.56765 C 885.74727,493.24717 886.30823,496.0541 885.91207,502.68948 C 886.6972,505.10702 888.59256,505.72043 890.7103,505.97248 C 893.82775,505.4357 896.58699,504.64818 898.0339,502.94202 C 899.9055,501.00035 903.34643,505.33596 906.11512,506.98263 C 909.72521,508.89472 913.8889,508.96149 917.98442,509.25547 C 919.688,509.02483 920.35482,513.77062 921.26741,517.3367 C 921.65155,521.71476 920.38197,524.23239 919.49965,527.18568 C 919.20535,529.68223 922.48815,530.71542 925.8131,531.73137 C 928.99554,532.47261 932.35734,533.39321 934.90447,533.49914 C 940.04633,534.37405 942.99321,536.18966 947.0263,537.53975 C 949.26544,538.3563 950.28649,539.78191 951.57199,541.07528" +       id="path8047" +       sodipodi:nodetypes="ccccccccccccc" /> +    <path +       style="opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter8814);enable-background:new" +       d="M 332,187.69519 C 332,187.69519 389.5,162.19519 389.5,159.69519 C 389.5,157.19519 395,107.69519 395,107.69519 C 395,107.69519 486,59.195189 486.5,57.195189 C 487,55.195189 572.5,-4.8048114 572.5,-4.8048114 L 386.5,17.195189 L 311,123.19519 L 332,187.69519 z" +       id="path8049" +       clip-path="url(#clipPath8514)" +       transform="translate(276,136)" /> +    <path +       style="opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 1697.2846,722.5514 C 1697.2846,722.5514 1581.3191,796.0905 1574.2481,800.33314 C 1567.177,804.57578 1343.7312,937.51186 1343.7312,937.51186 L 1347.9739,977.10984 L 1564.3486,876.70067 L 1681.7283,774.8773 L 1697.2846,722.5514 z" +       id="path8051" /> +    <path +       style="opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8810);enable-background:accumulate" +       d="M 528.91587,556.85291 C 523.25902,555.4387 347.89654,631.80623 347.89654,631.80623 L 313.95541,812.82557 L 365.05087,1006.7738 L 622.25397,1074.4551 C 622.25397,1074.4551 828.72915,1227.1901 834.386,1222.9475 C 840.04286,1218.7049 1002.6774,1029.2002 1002.6774,1029.2002 L 842.87128,845.35248 L 796.20224,667.16157 L 528.91587,556.85291 z" +       id="path8053" +       clip-path="url(#clipPath8610)" +       sodipodi:nodetypes="cccccscccc" +       transform="translate(276,136)" /> +    <path +       style="opacity:1;fill:#0c0c0c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +       d="M 1097.6433,613.88997 C 1097.6433,613.88997 1120.2628,607.38316 1133.386,608.01724 C 1146.5093,608.65133 1164.0276,609.95586 1177.0949,620.20343 C 1190.1622,630.45099 1202.1626,647.3435 1211.2073,678.57308 C 1220.2519,709.80266 1212.9056,777.82509 1205.0312,821.92043 C 1197.1569,866.01577 1176.7661,928.03341 1160.0312,961.92043 C 1143.2964,995.80745 1110.2335,1039.4156 1099.4618,1051.7966 C 1088.0976,1064.8586 1043.2559,1088.2228 1020.0312,1094.0633 C 1025.3346,1083.4567 1068.931,1043.4744 1055.0312,1033.349 C 1041.0123,1023.1367 1009.2712,1079.3314 970.7381,1062.3822 C 992.12041,1049.2501 1012.5175,1011.1961 1004.7787,995.78772 C 996.93846,980.17733 974.07378,1044.5453 911.24317,1032.8006 C 941.29521,1005.2739 966.65023,961.89659 952.50587,949.8209 C 938.09071,937.51403 892.04412,1004.1141 892.04412,1004.1141 C 892.04412,1004.1141 889.22222,962.41287 905.81732,935.50673 C 922.45667,908.52886 985.47029,853.89146 1005.3704,823.80331 C 1025.2706,793.71517 1038.983,757.79429 1047.5059,731.28537 C 1056.0287,704.77645 1063.3068,654.18583 1063.3068,654.18583" +       id="path8055" +       sodipodi:nodetypes="czzzzzzczczczczzzc" /> +    <path +       style="opacity:0.25;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8818);enable-background:accumulate" +       d="M 770.74639,609.17881 L 719.8347,706.75955 L 639.93163,817.77531 L 674.57987,889.19309 L 717.00628,968.38906 L 789.13117,923.13422 L 803.27331,730.80117 L 824.48651,592.20825 L 810.34437,502.05213 L 770.74639,609.17881 z" +       id="path8057" +       clip-path="url(#clipPath8622)" +       sodipodi:nodetypes="cccccccccc" +       transform="translate(276,136)" /> +    <path +       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8810);enable-background:accumulate" +       d="M 295,846.19519 L 301.64488,777.27234 C 301.64488,777.27234 391.96439,866.27691 464,900.19519 C 536.03561,934.11347 772,962.19519 772,962.19519 L 926,936.19519 L 890,1098.1952 L 604,1124.1952 L 306,1035.1952 L 295,846.19519 z" +       id="path8059" +       clip-path="url(#clipPath8906)" +       sodipodi:nodetypes="cczcccccc" +       transform="translate(276,136)" /> +    <path +       transform="translate(450.03125,73.843964)" +       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter3587);enable-background:new" +       d="M 405.79629,845.99023 L 480.74961,911.04406 L 483.24924,927.92446 L 502.6526,938.08337 L 509.14464,961.13446 L 540.85369,952.76336 L 555.70293,1000.8466 C 567.95945,1013.5745 645.49637,887.7369 611.56436,1039.0304 L 550.75318,1055.2939 L 461.55026,960.60104 L 398.72523,906.80141 L 405.79629,845.99023 z" +       id="path8061" +       sodipodi:nodetypes="cccccccccccc" +       clip-path="url(#clipPath3602)" /> +    <path +       style="opacity:1;fill:#121212;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" +       d="M 1159.317,918.349 C 1213.6027,916.92043 1285.352,903.29701 1329.317,891.56328 C 1373.3697,879.80614 1455.2033,855.21604 1504.674,833.70614 C 1554.0133,812.25342 1618.2778,774.42454 1658.9599,741.56329 C 1699.468,708.8426 1711.3498,685.74348 1719.6741,707.99186 C 1728.0432,730.35965 1703.2672,764.31748 1681.817,789.06329 C 1660.2128,813.98669 1629.0856,841.76862 1582.8883,878.349 C 1536.691,914.92938 1426.8058,979.93363 1370.0312,1006.9204 C 1312.9652,1034.0458 1241.8279,1065.1589 1197.8884,1079.4205 C 1153.9489,1093.6821 1066.4598,1110.4919 1066.4598,1110.4919 L 1159.317,918.349 z" +       id="path8063" +       sodipodi:nodetypes="czzzzzzzzcc" /> +    <path +       transform="translate(450.03125,73.843964)" +       style="opacity:0.5;fill:url(#linearGradient3666);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3779);enable-background:accumulate" +       d="M 1241.5965,652.95007 C 1241.5965,652.95007 1176.875,707.28713 1095.9326,751.94501 C 1013.9082,797.19985 811.67556,845.28311 811.67556,845.28311 C 811.67556,845.28311 796.57419,866.33507 856.93045,873.56739 C 917.28671,880.79971 1081.0124,820.2667 1135.5306,777.40085 C 1190.0488,734.535 1255.7387,665.67799 1255.7387,665.67799 L 1241.5965,652.95007 z" +       id="path8065" +       sodipodi:nodetypes="czczzcc" +       clip-path="url(#clipPath3992)" /> +    <g +       transform="translate(450.03125,73.843964)" +       style="opacity:1;display:inline;enable-background:new" +       id="g8067" +       clip-path="url(#clipPath3986)"> +      <g +         transform="translate(-174.03125,62.156036)" +         style="filter:url(#filter3677)" +         id="g8069"> +        <g +           style="filter:url(#filter3785)" +           id="g8071"> +          <path +             sodipodi:nodetypes="czzccccc" +             id="path8073" +             d="M 1094.2857,725.93361 C 1094.2857,725.93361 1093.9896,752.09452 1098.9285,763.79076 C 1103.8674,775.487 1118.9666,790.27741 1127.5,795.21933 C 1136.0334,800.16125 1146.4286,803.79075 1146.4286,803.79075 L 1264.2857,688.79075 L 1282.1429,613.07647 L 1185.7143,651.6479 L 1094.2857,725.93361 z" +             style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +             transform="translate(174.03125,-62.156036)" /> +          <rect +             y="486.14224" +             x="1197.8389" +             height="309.71277" +             width="333.75412" +             id="rect8075" +             style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +        </g> +      </g> +      <g +         transform="translate(-174.03125,62.156036)" +         style="opacity:0.18000004;display:inline;enable-background:new" +         id="g8077"> +        <g +           style="filter:url(#filter3785)" +           id="g8079"> +          <path +             sodipodi:nodetypes="czzccccc" +             id="path8081" +             d="M 1094.2857,725.93361 C 1094.2857,725.93361 1093.9896,752.09452 1098.9285,763.79076 C 1103.8674,775.487 1118.9666,790.27741 1127.5,795.21933 C 1136.0334,800.16125 1146.4286,803.79075 1146.4286,803.79075 L 1264.2857,688.79075 L 1282.1429,613.07647 L 1185.7143,651.6479 L 1094.2857,725.93361 z" +             style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +             transform="translate(174.03125,-62.156036)" /> +          <rect +             y="486.14224" +             x="1197.8389" +             height="309.71277" +             width="333.75412" +             id="rect8083" +             style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +        </g> +      </g> +    </g> +    <path +       transform="translate(450.03125,73.843964)" +       style="opacity:0.83300003;fill:#050505;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter8225);enable-background:accumulate" +       d="M 1264.1875,605 C 1259.6964,605.73268 1256.0305,608.45509 1252.25,611.40625 C 1242.1687,619.27601 1224.0805,645.83149 1204.2188,661.875 C 1164.3514,694.07816 1100.2228,731.85201 1051.6562,752.96875 C 1003.0422,774.10613 921.11498,798.78676 877.34375,810.46875 C 833.94554,822.05121 762.29972,835.59982 709.09375,837 L 704.53125,837.125 L 702.53125,841.25 L 609.6875,1033.375 L 603.1875,1046.8438 L 617.84375,1044 C 617.84375,1044 705.11343,1027.3486 750.1875,1012.7188 C 794.9127,998.20213 865.97836,967.05197 923.21875,939.84375 C 980.82199,912.46306 1090.1551,847.86412 1137.5,810.375 C 1183.8608,773.66518 1215.3049,745.65818 1237.4375,720.125 C 1248.3386,707.549 1260.1823,692.59356 1268.4688,677.375 C 1276.7552,662.15644 1287.6285,633.15692 1282.1562,618.53125 C 1280.9385,615.27651 1279.6048,612.46995 1277.5625,610.03125 C 1275.5202,607.59255 1269.0878,608.45926 1269,605 C 1268.7902,596.73518 1265.6845,604.75577 1264.1875,605 z M 1266.3438,620.21875 C 1266.7586,620.80449 1267.3749,621.77641 1268.125,623.78125 C 1271.0218,631.52338 1266.6843,655.68 1259.3125,669.21875 C 1251.9407,682.7575 1236.6741,698.14269 1226.125,710.3125 C 1205.0496,734.62606 1174.2213,762.17406 1128.1875,798.625 C 1083.1379,834.29659 972.72717,899.71959 916.78125,926.3125 C 859.88952,953.35499 788.68509,984.4309 745.53125,998.4375 C 709.16634,1010.2406 649.68654,1022.2713 629.8125,1026.2188 L 714.09375,851.75 C 768.80066,849.7007 837.88634,836.53365 881.21875,824.96875 C 925.55297,813.1365 1007.2974,788.63242 1057.625,766.75 C 1107.737,744.96129 1170.1594,705.58184 1211.6562,672.0625 C 1232.3026,655.38529 1253.4011,629.51662 1261.4688,623.21875 C 1263.9058,621.31633 1265.5494,620.58295 1266.3438,620.21875 z" +       id="path8085" +       clip-path="url(#clipPath3722)" +       sodipodi:nodetypes="cssssccccccssssssssccssssssccssssc" /> +    <g +       style="opacity:1;display:inline;enable-background:new" +       id="g8087" +       mask="url(#mask7704)" +       transform="matrix(0.9934486,0.1142802,-0.1142802,0.9934486,-9.24324,588.09054)" +       inkscape:transform-center-x="-185.09603" +       inkscape:transform-center-y="-12.859654"> +      <path +         transform="translate(8.0045714e-2,-3.125e-2)" +         style="fill:#bcb786;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +         d="M 1111.4062,-285.9375 L 1107.4688,-284.0625 C 1107.4283,-284.05228 1107.3692,-284.04201 1107.3438,-284.03125 C 1106.925,-283.8184 1107.1791,-283.93067 1106.6875,-283.71875 C 1106.2014,-283.50919 1104.9499,-283.13456 1102.5938,-282.25 C 1099.2626,-280.99942 1096.7895,-280.10016 1095.5938,-279.1875 C 1094.0576,-279.16623 1091.8733,-278.95419 1089.9375,-278.46875 C 1086.956,-277.72108 1085.0823,-277.29474 1083.1875,-276.875 C 1081.2927,-276.45527 1081.512,-276.23281 1080.3125,-276 C 1079.0159,-275.74833 1078.5911,-276.00899 1074.875,-275.21875 C 1071.3851,-274.4766 1065.9802,-273.28768 1064.7188,-272.53125 C 1063.1348,-272.71203 1060.8513,-272.85303 1058.875,-272.5625 C 1055.8346,-272.11554 1053.9588,-271.88974 1052.0312,-271.65625 C 1051.3758,-271.57687 1050.9902,-271.45547 1050.6875,-271.375 C 1050.2613,-271.24334 1050.0017,-271.11498 1049.3125,-271.03125 C 1048.0009,-270.87188 1047.5503,-271.18808 1043.7812,-270.75 C 1040.2273,-270.33691 1034.7758,-269.47718 1033.5312,-268.8125 C 1031.9322,-269.10979 1029.6735,-269.34669 1027.6875,-269.15625 C 1024.6287,-268.86293 1022.7155,-268.67226 1020.7812,-268.5 C 1018.847,-268.32773 1019.0926,-268.07763 1017.875,-267.96875 C 1016.5588,-267.85105 1016.1152,-268.13238 1012.3438,-267.71875 C 1008.8017,-267.3303 1003.3359,-266.50948 1002.0625,-265.84375 C 1000.4636,-266.13844 998.1753,-266.35076 996.1875,-266.15625 C 993.12921,-265.857 991.2463,-265.67601 989.3125,-265.5 C 988.65501,-265.44015 988.27245,-265.32144 987.96875,-265.25 C 987.54105,-265.13104 987.28525,-265.03193 986.59375,-264.96875 C 985.27775,-264.84849 984.834,-265.16363 981.0625,-264.75 C 977.50631,-264.35998 972.0569,-263.51084 970.8125,-262.84375 C 969.21381,-263.13793 966.95265,-263.36747 964.96875,-263.15625 C 961.91305,-262.83092 959.9947,-262.63001 958.0625,-262.4375 C 956.13031,-262.24499 956.37275,-261.99662 955.15625,-261.875 C 953.84137,-261.74353 953.3932,-262.03954 949.625,-261.59375 C 946.08611,-261.17509 940.6473,-260.30158 939.375,-259.625 C 937.77741,-259.90604 935.51505,-260.04543 933.53125,-259.8125 C 930.47927,-259.45413 928.58625,-259.24464 926.65625,-259.03125 C 926.00007,-258.95869 925.6156,-258.85856 925.3125,-258.78125 C 924.88571,-258.65402 924.6276,-258.51405 923.9375,-258.4375 C 922.62411,-258.29181 922.17015,-258.61152 918.40625,-258.125 C 914.85737,-257.66624 909.4276,-256.70598 908.1875,-256 C 906.59441,-256.24424 904.3537,-256.38135 902.375,-256.125 C 899.32741,-255.73018 897.4243,-255.47655 895.5,-255.21875 C 893.57571,-254.96096 893.7739,-254.72522 892.5625,-254.5625 C 891.25301,-254.3866 890.8153,-254.66688 887.0625,-254.09375 C 883.53821,-253.55551 878.1393,-252.39458 876.875,-251.65625 C 875.28751,-251.85979 873.0295,-251.91098 871.0625,-251.5625 C 868.03631,-251.02638 866.1636,-250.70081 864.25,-250.375 C 863.59941,-250.26423 863.2363,-250.10406 862.9375,-250 C 862.51681,-249.83512 862.27405,-249.6687 861.59375,-249.53125 C 860.29905,-249.26966 859.86665,-249.53745 856.15625,-248.71875 C 852.65777,-247.9468 847.31035,-246.33582 846.09375,-245.5 C 844.53085,-245.57745 842.33625,-245.41472 840.40625,-244.90625 C 837.43387,-244.12312 835.58855,-243.67416 833.71875,-243.15625 C 831.84875,-242.63835 832.0521,-242.38897 830.875,-242.0625 C 829.60251,-241.7096 829.17795,-241.95541 825.53125,-240.875 C 822.10657,-239.86037 816.88185,-237.94183 815.65625,-237.03125 C 814.11747,-237.01851 811.93645,-236.75903 810.03125,-236.15625 C 807.10027,-235.22891 805.2809,-234.69783 803.4375,-234.09375 C 802.81071,-233.88837 802.44585,-233.70117 802.15625,-233.5625 C 801.74867,-233.34889 801.50295,-233.15375 800.84375,-232.9375 C 799.58925,-232.52596 799.1576,-232.74846 795.5625,-231.5 C 792.17261,-230.32283 786.96755,-228.2863 785.78125,-227.34375 C 784.25737,-227.28408 782.1312,-226.94888 780.25,-226.28125 C 777.35261,-225.25296 775.55095,-224.60577 773.71875,-223.96875 C 771.88655,-223.33174 772.0909,-223.12021 770.9375,-222.71875 C 769.69071,-222.28479 769.27395,-222.51903 765.71875,-221.15625 C 762.38005,-219.87645 757.23165,-217.6737 756.03125,-216.6875 C 754.52407,-216.57981 752.39555,-216.1887 750.53125,-215.46875 C 747.66307,-214.36115 745.90735,-213.68719 744.09375,-213 C 743.47705,-212.76637 743.0973,-212.55797 742.8125,-212.40625 C 742.81251,-212.40625 742.8125,-212.37673 742.8125,-212.375 L 734.8125,-209.1875 L 722.3366,-205.69561 L 730.26626,-186.41789 C 729.67463,-184.44432 742.8125,-191.15625 742.8125,-191.15625 C 743.03891,-191.30093 743.26145,-191.42886 743.53125,-191.53125 C 744.61177,-191.94123 745.70285,-191.74702 749.53125,-193.21875 C 753.35977,-194.69049 754.7553,-195.22373 755.4375,-195.625 C 756.11711,-196.02478 757.04925,-196.50437 757.65625,-197.15625 C 759.48317,-197.294 761.22705,-197.64948 762.59375,-198.15625 C 765.56175,-199.25677 767.4691,-199.96244 769.375,-200.625 C 771.28081,-201.28754 771.72915,-202.03987 772.78125,-202.40625 C 773.87287,-202.78636 774.97635,-202.57163 778.84375,-203.9375 C 782.71115,-205.30336 784.1269,-205.76458 784.8125,-206.15625 C 785.51361,-206.55677 786.5133,-207.08923 787.125,-207.75 C 789.09581,-207.80466 790.94195,-208.13463 792.40625,-208.625 C 795.40777,-209.63008 797.3324,-210.24671 799.25,-210.875 C 800.78861,-211.3791 801.42415,-211.92177 802.15625,-212.3125 C 802.38647,-212.44681 802.63215,-212.56623 802.90625,-212.65625 C 804.00457,-213.01673 805.0877,-212.73762 809,-213.96875 C 812.91231,-215.19988 814.366,-215.6417 815.0625,-216 C 815.75641,-216.35697 816.6926,-216.79261 817.3125,-217.40625 C 819.17771,-217.42891 820.94835,-217.67308 822.34375,-218.09375 C 825.37415,-219.00729 827.33615,-219.52385 829.28125,-220.0625 C 831.22637,-220.60114 831.70745,-221.32702 832.78125,-221.625 C 833.89527,-221.93415 835.00125,-221.61761 838.96875,-222.65625 C 842.93625,-223.69488 844.38625,-224.08898 845.09375,-224.40625 C 845.82855,-224.73584 846.90765,-225.15997 847.53125,-225.78125 C 849.52907,-225.66525 851.3887,-225.80134 852.875,-226.15625 C 855.95311,-226.89125 857.9584,-227.25719 859.9375,-227.65625 C 861.52541,-227.97643 862.1818,-228.4468 862.9375,-228.75 C 863.17501,-228.8568 863.4044,-228.94276 863.6875,-229 C 864.82091,-229.22919 865.99215,-228.79107 870.03125,-229.5 C 874.07067,-230.20893 875.5315,-230.42709 876.25,-230.6875 C 876.96581,-230.94694 877.95435,-231.25474 878.59375,-231.78125 C 880.51795,-231.54176 882.34165,-231.55672 883.78125,-231.78125 C 886.90767,-232.26887 888.9358,-232.48192 890.9375,-232.75 C 892.93921,-233.01807 893.42625,-233.69514 894.53125,-233.84375 C 895.67767,-233.99793 896.8071,-233.54218 900.875,-234.0625 C 904.94281,-234.58282 906.43525,-234.75823 907.15625,-235 C 907.89337,-235.24714 908.95435,-235.58623 909.59375,-236.125 C 911.64375,-235.78947 913.56745,-235.72704 915.09375,-235.90625 C 918.23595,-236.27521 920.27375,-236.46561 922.28125,-236.6875 C 923.89207,-236.86552 924.5459,-237.2957 925.3125,-237.53125 C 925.55341,-237.61677 925.80655,-237.68685 926.09375,-237.71875 C 927.24345,-237.84647 928.39505,-237.3721 932.46875,-237.84375 C 936.54245,-238.3154 938.0278,-238.45435 938.75,-238.6875 C 939.46941,-238.91977 940.45025,-239.16096 941.09375,-239.65625 C 943.03005,-239.32279 944.8638,-239.25201 946.3125,-239.40625 C 949.45851,-239.7412 951.49,-239.92484 953.5,-240.125 C 955.50991,-240.32514 955.98415,-240.95139 957.09375,-241.0625 C 958.24485,-241.17778 959.39025,-240.69744 963.46875,-241.125 C 967.54725,-241.55256 969.05765,-241.68709 969.78125,-241.90625 C 970.52047,-242.13011 971.57685,-242.4195 972.21875,-242.9375 C 974.27575,-242.53883 976.2206,-242.4441 977.75,-242.59375 C 980.89871,-242.90185 982.9258,-243.067 984.9375,-243.25 C 986.55151,-243.39682 987.20055,-243.81055 987.96875,-244.03125 C 988.21005,-244.11211 988.4623,-244.16116 988.75,-244.1875 C 989.90211,-244.29295 991.0429,-243.79475 995.125,-244.1875 C 999.20711,-244.58025 1000.7139,-244.71834 1001.4375,-244.9375 C 1002.1584,-245.15583 1003.1371,-245.3852 1003.7812,-245.875 C 1005.7193,-245.52501 1007.5501,-245.42062 1009,-245.5625 C 1012.1487,-245.8706 1014.1758,-246.03575 1016.1875,-246.21875 C 1018.1991,-246.40174 1018.7017,-247.05677 1019.8125,-247.15625 C 1020.9648,-247.25948 1022.1047,-246.77142 1026.1875,-247.15625 C 1030.2704,-247.54107 1031.7762,-247.65725 1032.5,-247.875 C 1033.2393,-248.09743 1034.2956,-248.38949 1034.9375,-248.90625 C 1036.9949,-248.50448 1038.9404,-248.40292 1040.4688,-248.5625 C 1043.6153,-248.89102 1045.6458,-249.0852 1047.6562,-249.28125 C 1049.2692,-249.43854 1049.9219,-249.91273 1050.6875,-250.15625 C 1050.9282,-250.24429 1051.1507,-250.27762 1051.4375,-250.3125 C 1052.5858,-250.4522 1053.7542,-249.97259 1057.8125,-250.5625 C 1061.8708,-251.15242 1063.3743,-251.33964 1064.0938,-251.59375 C 1064.8104,-251.84691 1065.7684,-252.15182 1066.4062,-252.6875 C 1068.3259,-252.47556 1070.1262,-252.53609 1071.5625,-252.78125 C 1074.6816,-253.31365 1076.6741,-253.70986 1078.6562,-254.09375 C 1080.6383,-254.47762 1081.1305,-255.1334 1082.2188,-255.375 C 1083.3475,-255.62566 1084.489,-255.25871 1088.4688,-256.25 C 1092.4483,-257.24127 1093.8983,-257.6693 1094.5938,-258.03125 C 1095.316,-258.40725 1096.3555,-258.90183 1096.9688,-259.5625 C 1098.9317,-259.57454 1100.7625,-259.85355 1102.1875,-260.40625 C 1105.1387,-261.55085 1107.0607,-262.27567 1108.875,-263.15625 C 1110.3307,-263.86277 1111.1941,-264.85828 1111.4062,-265.15625 C 1111.6185,-265.4542 1111.5051,-265.8848 1111.5312,-265.90625 C 1111.5742,-265.94148 1111.8716,-266.00028 1112.0312,-266.34375 C 1112.8902,-268.19082 1114.3544,-271.97139 1114.4688,-272.65625 C 1114.5825,-273.33839 1114.6368,-274.00902 1114.6875,-274.40625 C 1114.7169,-274.63575 1114.5404,-275.28515 1114.5625,-275.34375 C 1114.5934,-275.42579 1114.8508,-275.59432 1114.9062,-275.84375 C 1115.1725,-277.04206 1114.9953,-278.05111 1114.7812,-279.46875 C 1114.5673,-280.88638 1113.8096,-284.08338 1113.1562,-284.9375 C 1112.4973,-285.79922 1111.9314,-285.94801 1111.4062,-285.9375 z" +         id="path8089" +         sodipodi:nodetypes="ccssscsssscssssscsssscssssscsssscssssscsssscssssscsssscssssscsssscssscccccssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsssssssssssc" /> +      <g +         clip-path="url(#clipPath7421)" +         id="g8091"> +        <path +           id="path8093" +           d="M 1107.409,-284.04961 C 1106.9903,-283.83678 1107.2534,-283.95572 1106.7618,-283.7438 C 1106.2757,-283.53426 1105.0384,-283.16941 1102.6822,-282.28485 C 1099.3511,-281.03428 1096.852,-280.13141 1095.6563,-279.21875 C 1094.1202,-279.19749 1091.9358,-278.98544 1090,-278.5 C 1087.0185,-277.75234 1085.1448,-277.32599 1083.25,-276.90625 C 1081.3552,-276.48653 1081.5745,-276.26406 1080.375,-276.03125 C 1079.0784,-275.77959 1078.6536,-276.04024 1074.9375,-275.25 C 1071.4476,-274.50786 1066.0427,-273.31893 1064.7813,-272.5625 C 1063.1974,-272.74329 1060.9138,-272.88428 1058.9375,-272.59375 C 1055.8971,-272.1468 1054.0213,-271.92099 1052.0938,-271.6875 C 1051.4384,-271.60813 1051.0527,-271.48672 1050.75,-271.40625 C 1050.3238,-271.2746 1050.0642,-271.14623 1049.375,-271.0625 C 1048.0634,-270.90314 1047.6128,-271.21933 1043.8438,-270.78125 C 1040.2899,-270.36817 1034.8384,-269.50843 1033.5938,-268.84375 C 1031.9948,-269.14105 1029.736,-269.37794 1027.75,-269.1875 C 1024.6912,-268.89419 1022.778,-268.70351 1020.8438,-268.53125 C 1018.9095,-268.35899 1019.1551,-268.10888 1017.9375,-268 C 1016.6213,-267.88231 1016.1777,-268.16363 1012.4063,-267.75 C 1008.8644,-267.36156 1003.3984,-266.54073 1002.125,-265.875 C 1000.5261,-266.1697 998.23783,-266.38201 996.25,-266.1875 C 993.19176,-265.88826 991.30887,-265.70726 989.375,-265.53125 C 988.71751,-265.47141 988.33496,-265.35269 988.03125,-265.28125 C 987.6036,-265.1623 987.34774,-265.06318 986.65625,-265 C 985.34029,-264.87975 984.89649,-265.19488 981.125,-264.78125 C 977.56886,-264.39124 972.11946,-263.54209 970.875,-262.875 C 969.27637,-263.16919 967.01516,-263.39872 965.03125,-263.1875 C 961.97565,-262.86218 960.05721,-262.66126 958.125,-262.46875 C 956.19279,-262.27625 956.43513,-262.02787 955.21875,-261.90625 C 953.90387,-261.77479 953.45577,-262.07079 949.6875,-261.625 C 946.14863,-261.20635 940.70982,-260.33283 939.4375,-259.65625 C 937.83995,-259.9373 935.57754,-260.07668 933.59375,-259.84375 C 930.54177,-259.48539 928.64867,-259.27589 926.71875,-259.0625 C 926.06255,-258.98995 925.67809,-258.88981 925.375,-258.8125 C 924.94823,-258.68528 924.69009,-258.5453 924,-258.46875 C 922.68667,-258.32307 922.23254,-258.64277 918.46875,-258.15625 C 914.91986,-257.6975 909.49012,-256.73723 908.25,-256.03125 C 906.65695,-256.27549 904.41619,-256.4126 902.4375,-256.15625 C 899.38991,-255.76144 897.48679,-255.5078 895.5625,-255.25 C 893.63822,-254.99221 893.83639,-254.75647 892.625,-254.59375 C 891.31554,-254.41785 890.87781,-254.69813 887.125,-254.125 C 883.60071,-253.58676 878.20185,-252.42583 876.9375,-251.6875 C 875.35,-251.89104 873.092,-251.94223 871.125,-251.59375 C 868.09883,-251.05763 866.22611,-250.73206 864.3125,-250.40625 C 863.66189,-250.29548 863.29879,-250.13531 863,-250.03125 C 862.57933,-249.86637 862.33655,-249.69995 861.65625,-249.5625 C 860.3616,-249.30091 859.92913,-249.5687 856.21875,-248.75 C 852.72022,-247.97805 847.3728,-246.36707 846.15625,-245.53125 C 844.59347,-245.6087 842.39867,-245.44597 840.46875,-244.9375 C 837.49631,-244.15437 835.65114,-243.70541 833.78125,-243.1875 C 831.91137,-242.6696 832.11465,-242.42022 830.9375,-242.09375 C 829.66504,-241.74085 829.24047,-241.98666 825.59375,-240.90625 C 822.16905,-239.89162 816.94431,-237.97308 815.71875,-237.0625 C 814.17992,-237.04976 811.99892,-236.79028 810.09375,-236.1875 C 807.16269,-235.26016 805.34344,-234.72908 803.5,-234.125 C 802.87324,-233.91962 802.50827,-233.73242 802.21875,-233.59375 C 801.81112,-233.38014 801.56541,-233.185 800.90625,-232.96875 C 799.65179,-232.55721 799.22014,-232.77971 795.625,-231.53125 C 792.23515,-230.35408 787.03002,-228.31755 785.84375,-227.375 C 784.31986,-227.31533 782.1937,-226.98013 780.3125,-226.3125 C 777.41511,-225.28421 775.61342,-224.63702 773.78125,-224 C 771.94908,-223.36299 772.1534,-223.15146 771,-222.75 C 769.75322,-222.31604 769.33639,-222.55028 765.78125,-221.1875 C 762.44258,-219.9077 757.2941,-217.70495 756.09375,-216.71875 C 754.58657,-216.61106 752.45806,-216.21995 750.59375,-215.5 C 747.72557,-214.3924 745.96995,-213.71844 744.15625,-213.03125 C 743.53959,-212.79762 743.15984,-212.58922 742.875,-212.4375 C 742.875,-212.4375 742.875,-211.34375 742.875,-211.34375 C 742.98678,-211.56611 743.26099,-212.16118 743.78125,-212.4375 C 744.47922,-212.80822 748.59488,-214.43087 750.59375,-215.15625 C 752.25061,-215.7575 754.74764,-216.48493 756.5625,-216.46875 C 756.86412,-216.46606 757.15012,-216.41785 757.40625,-216.375 C 759.24874,-216.06675 764.875,-214.8125 764.875,-214.8125 C 764.87499,-214.8125 758.64151,-216.45925 757.84375,-216.65625 C 757.65296,-216.70336 757.30803,-216.72497 756.875,-216.71875 C 758.02046,-217.58846 761.636,-219.11226 764.21875,-220.15625 C 767.05697,-221.30352 767.33556,-221.40807 769.28125,-221.8125 C 771.28955,-222.22994 772.4375,-222.3125 772.4375,-222.3125 C 772.4375,-222.31249 772.35514,-222.91364 773.40625,-223.4375 C 774.11135,-223.78891 778.29327,-225.3299 780.3125,-226 C 782.2644,-226.64773 785.3699,-227.3585 787.1875,-227 C 789.05073,-226.6325 794.71875,-225.1875 794.71875,-225.1875 C 794.71876,-225.1875 788.43175,-227.05861 787.625,-227.28125 C 787.43208,-227.3345 787.09416,-227.36729 786.65625,-227.375 C 787.81459,-228.20788 791.45069,-229.57032 794.0625,-230.53125 C 796.93266,-231.58726 797.22984,-231.69305 799.1875,-232.0625 C 801.04099,-232.41229 802.04634,-232.48798 802.21875,-232.5 C 802.33235,-232.71724 802.5962,-233.31002 803.125,-233.5625 C 803.83444,-233.90124 808.05107,-235.27525 810.09375,-235.875 C 811.78692,-236.37211 814.33452,-236.91177 816.1875,-236.78125 C 816.49545,-236.75957 816.80099,-236.68399 817.0625,-236.625 C 818.94368,-236.20068 824.65625,-234.59375 824.65625,-234.59375 C 824.65626,-234.59375 818.31451,-236.659 817.5,-236.90625 C 817.30521,-236.96539 816.94212,-237.01019 816.5,-237.03125 C 817.66949,-237.8288 821.36302,-239.08747 824,-239.96875 C 826.89781,-240.93722 827.23301,-240.97207 829.21875,-241.25 C 831.2684,-241.53689 832.40625,-241.5625 832.40625,-241.5625 C 832.40623,-241.5625 832.3335,-242.16947 833.40625,-242.625 C 834.12585,-242.93057 838.39723,-244.12575 840.46875,-244.625 C 842.47119,-245.10758 845.66724,-245.55329 847.53125,-245.03125 C 849.44203,-244.4961 855.25,-242.53125 855.25,-242.53125 C 855.25,-242.53125 848.82734,-244.95476 848,-245.25 C 847.80216,-245.32061 847.41784,-245.39039 846.96875,-245.4375 C 848.15665,-246.16615 851.88402,-247.21158 854.5625,-247.9375 C 857.50592,-248.73525 857.85458,-248.70833 859.875,-248.84375 C 861.78789,-248.97198 862.82205,-248.91484 863,-248.90625 C 863.11728,-249.10991 863.39176,-249.68573 863.9375,-249.875 C 864.66969,-250.12894 869.01602,-250.92289 871.125,-251.25 C 872.87313,-251.52111 875.52588,-251.7347 877.4375,-251.34375 C 877.75516,-251.27879 878.04272,-251.15824 878.3125,-251.0625 C 880.25324,-250.37377 886.15625,-247.96875 886.15625,-247.96875 C 886.15626,-247.96875 879.62154,-250.91952 878.78125,-251.28125 C 878.58028,-251.36776 878.20612,-251.44804 877.75,-251.53125 C 878.9565,-252.16443 882.77956,-252.92685 885.5,-253.4375 C 888.48953,-253.99869 888.80023,-253.96704 890.84375,-253.96875 C 892.95301,-253.97052 894.15625,-253.84375 894.15625,-253.84375 C 894.15625,-253.84374 894.08354,-254.47494 895.1875,-254.78125 C 895.92802,-254.98672 900.31362,-255.61512 902.4375,-255.84375 C 904.49052,-256.06474 907.75613,-256.09597 909.65625,-255.375 C 911.60404,-254.63593 917.5,-252 917.5,-252 C 917.50002,-252 910.93712,-255.17897 910.09375,-255.5625 C 909.89207,-255.65423 909.55154,-255.74871 909.09375,-255.84375 C 910.30467,-256.44563 914.07817,-257.09259 916.8125,-257.5 C 919.8173,-257.94772 920.13801,-257.9517 922.1875,-257.90625 C 924.12795,-257.86323 925.19449,-257.71202 925.375,-257.6875 C 925.49392,-257.88066 925.7589,-258.45333 926.3125,-258.59375 C 927.05521,-258.78213 931.46679,-259.32803 933.59375,-259.53125 C 935.35678,-259.69967 938.01384,-259.76554 939.9375,-259.28125 C 940.25718,-259.20077 940.54101,-259.07766 940.8125,-258.96875 C 942.76543,-258.18526 948.71875,-255.5 948.71875,-255.5 C 948.71873,-255.5 942.12684,-258.75348 941.28125,-259.15625 C 941.07903,-259.25257 940.70899,-259.36328 940.25,-259.46875 C 941.46414,-260.04302 945.29366,-260.59094 948.03125,-260.96875 C 951.03963,-261.38395 951.35432,-261.41138 953.40625,-261.34375 C 955.52423,-261.27394 956.71875,-261.09375 956.71875,-261.09375 C 956.71873,-261.09375 956.6415,-261.73116 957.75,-262 C 958.49362,-262.18035 962.90176,-262.66355 965.03125,-262.84375 C 967.08972,-263.01792 970.37449,-262.96807 972.28125,-262.1875 C 974.23584,-261.38734 980.15625,-258.65625 980.15625,-258.65625 C 980.15623,-258.65625 973.59632,-261.96501 972.75,-262.375 C 972.54763,-262.47305 972.17814,-262.5781 971.71875,-262.6875 C 972.93392,-263.2514 976.72883,-263.8018 979.46875,-264.15625 C 982.47966,-264.54577 982.79006,-264.5539 984.84375,-264.46875 C 986.78814,-264.38815 987.85038,-264.21551 988.03125,-264.1875 C 988.15041,-264.37836 988.41402,-264.93281 988.96875,-265.0625 C 989.71301,-265.2365 994.11868,-265.71297 996.25,-265.875 C 998.01662,-266.00927 1000.6997,-266.00071 1002.625,-265.5 C 1002.945,-265.41679 1003.2283,-265.29873 1003.5,-265.1875 C 1005.4546,-264.38734 1011.4063,-261.625 1011.4063,-261.625 C 1011.4062,-261.625 1004.8151,-264.96501 1003.9688,-265.375 C 1003.7664,-265.47305 1003.3969,-265.57811 1002.9375,-265.6875 C 1004.1526,-266.2514 1007.9788,-266.77056 1010.7188,-267.125 C 1013.7297,-267.51453 1014.0713,-267.5539 1016.125,-267.46875 C 1018.2447,-267.38087 1019.4375,-267.15625 1019.4375,-267.15625 C 1019.4375,-267.15625 1019.3591,-267.80527 1020.4688,-268.0625 C 1021.2131,-268.23506 1025.6183,-268.68586 1027.75,-268.84375 C 1029.8106,-268.99635 1033.0929,-268.94052 1035,-268.15625 C 1036.955,-267.3523 1042.875,-264.65625 1042.875,-264.65625 C 1042.875,-264.65625 1036.3152,-267.93212 1035.4688,-268.34375 C 1035.2663,-268.44219 1034.897,-268.54597 1034.4375,-268.65625 C 1035.6529,-269.21779 1039.4494,-269.78403 1042.1875,-270.15625 C 1045.1965,-270.5653 1045.5102,-270.57183 1047.5625,-270.5 C 1049.5056,-270.43201 1050.5697,-270.33515 1050.75,-270.3125 C 1050.8688,-270.5069 1051.1346,-271.04131 1051.6875,-271.1875 C 1052.4293,-271.38362 1056.8186,-272.01628 1058.9375,-272.28125 C 1060.6939,-272.50086 1063.3428,-272.61356 1065.25,-272.25 C 1065.5669,-272.18959 1065.8558,-272.06062 1066.125,-271.96875 C 1068.0612,-271.30783 1073.9688,-269.03125 1073.9688,-269.03125 C 1073.9687,-269.03125 1067.4321,-271.8378 1066.5938,-272.1875 C 1066.3933,-272.27113 1066.0176,-272.36083 1065.5625,-272.4375 C 1066.7662,-273.08796 1070.5816,-273.80945 1073.2813,-274.4375 C 1076.248,-275.1277 1076.5702,-275.19257 1078.5938,-275.3125 C 1080.6824,-275.4363 1081.875,-275.34375 1081.875,-275.34375 C 1081.875,-275.34374 1081.788,-275.9758 1082.875,-276.375 C 1083.6042,-276.6428 1087.9222,-277.71297 1090,-278.1875 C 1092.0085,-278.64619 1095.1679,-279.2168 1097,-278.8125 C 1098.8781,-278.39804 1110.5782,-275.79687 1110.5782,-275.79687 C 1110.5782,-275.79687 1098.2507,-278.81953 1097.4375,-279.0625 C 1097.243,-279.12062 1096.8789,-279.16876 1096.4375,-279.1875 C 1097.6051,-279.99119 1099.9517,-280.8748 1102.5469,-281.89062 C 1104.2283,-282.5488 1103.4706,-282.26721 1105.3228,-282.89422 C 1107.0764,-283.48788 1107.8082,-283.90493 1107.9532,-284.00721 C 1108.2993,-284.21372 1107.5972,-284.12909 1107.409,-284.04961 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7001);enable-background:new" +           sodipodi:nodetypes="czscsssscssssscsssscssssscsssscssssscsssscssssscsssscssssscsssscssccsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscc" /> +        <path +           id="path8095" +           d="M 1082.625,-275.125 C 1084.498,-274.73152 1087.1211,-273.97945 1088.6563,-273.15625 C 1090.1915,-272.33306 1091.4785,-272.10025 1094.0313,-270.65625 C 1096.5579,-269.22699 1098.8271,-268.64929 1101,-268.125 C 1103.3476,-267.55858 1106.4354,-267.40977 1109.8438,-266.9375 C 1108.7549,-267.77725 1103.2364,-268.10995 1101.4375,-268.5 C 1099.6386,-268.89006 1097.5434,-269.51616 1094.8438,-270.8125 C 1092.1441,-272.10884 1091.3494,-272.61146 1089.0313,-273.5 C 1086.7131,-274.38854 1085.0269,-274.88314 1082.625,-275.125 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6949);enable-background:new" /> +        <path +           id="path8097" +           d="M 1051.4688,-270 C 1053.3741,-269.42241 1055.9969,-268.38428 1057.5625,-267.40625 C 1059.1281,-266.42823 1060.4427,-266.04644 1063.0625,-264.28125 C 1065.6555,-262.53409 1068.0484,-261.57198 1070.3125,-260.6875 C 1072.7586,-259.73193 1075.9951,-259.03037 1079.7188,-257.625 C 1078.5292,-258.76284 1072.6557,-260.31175 1070.7813,-261 C 1068.9068,-261.68825 1066.6995,-262.5662 1063.9063,-264.28125 C 1061.113,-265.99629 1060.3327,-266.56515 1057.9688,-267.6875 C 1055.6047,-268.80984 1053.9121,-269.52205 1051.4688,-270 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6961);enable-background:new" /> +        <path +           id="path8099" +           d="M 1020.2188,-266.84375 C 1022.1307,-266.20564 1024.8,-265.08839 1026.375,-264.03125 C 1027.9501,-262.9741 1029.2706,-262.52258 1031.9063,-260.625 C 1034.5149,-258.74679 1036.9347,-257.59497 1039.2188,-256.5625 C 1041.6865,-255.44705 1044.9833,-254.3892 1048.75,-252.71875 C 1047.5467,-253.94128 1041.5472,-256.03298 1039.6563,-256.84375 C 1037.7653,-257.65452 1035.5914,-258.73754 1032.7813,-260.59375 C 1029.9711,-262.44995 1029.1595,-263.07068 1026.7813,-264.3125 C 1024.403,-265.5543 1022.6706,-266.28819 1020.2188,-266.84375 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6957);enable-background:new" /> +        <path +           id="path8101" +           d="M 1110.1719,-266.89063 C 1110.3227,-266.84207 1110.8599,-266.25963 1110.2813,-265.40625 C 1109.4712,-264.21166 1104.5764,-262.08196 1101.7188,-261.28125 C 1098.8739,-260.48413 1095.4287,-260.30351 1091.1563,-261.65625 C 1086.8547,-263.0182 1085.6866,-264.12497 1080.5,-265.96875 C 1085.164,-263.85358 1086.6953,-262.01642 1090.625,-260.625 C 1092.2457,-260.05113 1093.9921,-259.6854 1095.6875,-259.59375 C 1095.2424,-259.26812 1094.1572,-258.61045 1092.125,-258 C 1089.3295,-257.16031 1085.4759,-256.46622 1083.875,-256.375 C 1082.3604,-256.28868 1080.733,-256.88749 1080.4375,-257 C 1080.6042,-256.89692 1080.8107,-256.62266 1080.1875,-255.96875 C 1079.2882,-255.02512 1074.0401,-254.04575 1071.0625,-253.71875 C 1068.0982,-253.3932 1064.5409,-253.73471 1060.1563,-255.625 C 1056.1783,-257.33997 1054.8173,-258.54036 1050.75,-260.375 C 1050.75,-260.375 1050.75,-260.21875 1050.75,-260.21875 C 1054.3931,-258.12346 1056.034,-256.33548 1059.625,-254.65625 C 1061.3552,-253.84716 1063.2167,-253.24749 1065.0313,-252.9375 C 1064.4964,-252.65074 1063.4735,-252.22599 1061.5938,-251.90625 C 1058.7248,-251.41829 1054.7848,-251.09011 1053.1563,-251.15625 C 1052.3056,-251.19079 1051.4277,-251.34062 1050.75,-251.5625 C 1050.0652,-251.77738 1049.5603,-252.00717 1049.4375,-252.0625 C 1049.6069,-251.95529 1049.8686,-251.65962 1049.2188,-251.03125 C 1048.3091,-250.15163 1042.9727,-249.69487 1039.9688,-249.5625 C 1036.9783,-249.43071 1033.3799,-250.01313 1028.9688,-252.125 C 1024.5276,-254.25126 1023.3273,-255.5266 1018.0625,-257.90625 C 1022.7968,-255.30921 1024.349,-253.27715 1028.4063,-251.1875 C 1030.0796,-250.32565 1031.8915,-249.69325 1033.6563,-249.25 C 1033.193,-249.01668 1032.0669,-248.56186 1029.9688,-248.3125 C 1027.0825,-247.96952 1023.1342,-247.81962 1021.5,-247.9375 C 1019.9538,-248.049 1018.2688,-248.79446 1017.9688,-248.9375 C 1018.1379,-248.81721 1018.3826,-248.52702 1017.75,-247.9375 C 1016.8372,-247.08677 1011.5059,-246.67538 1008.5,-246.5625 C 1005.5075,-246.45013 1001.9103,-247.05293 997.5,-249.15625 C 993.49875,-251.06448 992.11197,-252.29408 988.03125,-254.25 C 988.03122,-254.25 988.03125,-254.09375 988.03125,-254.09375 C 991.68631,-251.88983 993.32546,-250.0412 996.9375,-248.1875 C 998.67779,-247.29435 1000.5745,-246.65923 1002.4063,-246.21875 C 1001.8663,-245.97045 1000.8282,-245.60342 998.9375,-245.375 C 996.05182,-245.02642 992.07145,-244.85405 990.4375,-244.96875 C 989.58405,-245.02865 988.71119,-245.22666 988.03125,-245.46875 C 987.34415,-245.70405 986.8419,-245.94101 986.71875,-246 C 986.88873,-245.88773 987.18323,-245.57775 986.53125,-244.96875 C 985.6186,-244.11625 980.25592,-243.67538 977.25,-243.5625 C 974.25754,-243.45013 970.65654,-244.09055 966.25,-246.15625 C 961.81347,-248.23603 960.60312,-249.48796 955.34375,-251.8125 C 960.07313,-249.26501 961.63449,-247.2347 965.6875,-245.1875 C 967.35905,-244.34317 969.17304,-243.72107 970.9375,-243.28125 C 970.47427,-243.04703 969.3478,-242.59718 967.25,-242.34375 C 964.36431,-241.99517 960.4138,-241.77423 958.78125,-241.875 C 957.23669,-241.97032 955.58094,-242.70385 955.28125,-242.84375 C 955.45024,-242.72522 955.66317,-242.4399 955.03125,-241.84375 C 954.11939,-240.98347 948.7846,-240.5135 945.78125,-240.375 C 942.7913,-240.2371 939.2138,-240.82568 934.8125,-242.84375 C 930.81942,-244.67464 929.44739,-245.87295 925.375,-247.75 C 925.37498,-247.75 925.375,-247.59375 925.375,-247.59375 C 929.02261,-245.46048 930.64533,-243.65888 934.25,-241.875 C 935.98675,-241.01549 937.85727,-240.42486 939.6875,-240 C 939.14803,-239.7471 938.13687,-239.35871 936.25,-239.09375 C 933.37022,-238.68939 929.41187,-238.44813 927.78125,-238.53125 C 926.92953,-238.57466 926.05355,-238.7398 925.375,-238.96875 C 924.68931,-239.19076 924.1854,-239.41214 924.0625,-239.46875 C 924.23209,-239.35976 924.4944,-239.0591 923.84375,-238.4375 C 922.93296,-237.56736 917.59354,-237.04598 914.59375,-236.875 C 911.60742,-236.70479 908.01994,-237.19077 903.625,-239.15625 C 899.20011,-241.13513 898.01904,-242.38444 892.78125,-244.53125 C 897.49122,-242.14358 899.05142,-240.14252 903.09375,-238.1875 C 904.7609,-237.38119 906.55418,-236.79092 908.3125,-236.40625 C 907.85087,-236.15755 906.7155,-235.694 904.625,-235.375 C 901.7494,-234.93624 897.8446,-234.6419 896.21875,-234.6875 C 894.68052,-234.73062 892.98595,-235.43272 892.6875,-235.5625 C 892.85583,-235.44968 893.09807,-235.14875 892.46875,-234.53125 C 891.56063,-233.64015 886.2658,-233.003 883.28125,-232.71875 C 880.31007,-232.43577 876.70783,-232.89455 872.34375,-234.65625 C 868.38441,-236.25456 867.0146,-237.45112 863,-238.96875 C 863.00003,-238.96875 863,-238.8125 863,-238.8125 C 866.5959,-237.00115 868.23831,-235.23017 871.8125,-233.65625 C 873.53457,-232.8979 875.39998,-232.3673 877.21875,-232.03125 C 876.68266,-231.75217 875.65217,-231.34362 873.78125,-230.96875 C 870.92586,-230.39665 866.99183,-229.94936 865.375,-229.9375 C 864.53049,-229.93129 863.66892,-230.01844 863,-230.1875 C 862.32409,-230.34901 861.83991,-230.51673 861.71875,-230.5625 C 861.88597,-230.46848 862.14142,-230.17902 861.5,-229.5 C 860.60213,-228.54948 855.31352,-227.58292 852.375,-227.0625 C 849.44966,-226.54441 845.94285,-226.68826 841.65625,-228.09375 C 837.34045,-229.50882 836.18348,-230.62369 831.09375,-232.0625 C 835.6706,-230.31149 837.1823,-228.50244 841.125,-227.0625 C 842.75108,-226.46861 844.49385,-226.10685 846.21875,-225.90625 C 845.7659,-225.60923 844.66397,-225.02286 842.625,-224.4375 C 839.82028,-223.63233 835.98614,-222.86167 834.40625,-222.6875 C 832.9115,-222.5227 831.29002,-223.00431 831,-223.09375 C 831.16356,-223.00368 831.39278,-222.73382 830.78125,-222.03125 C 829.89878,-221.0174 824.73673,-219.6596 821.84375,-218.96875 C 818.96373,-218.28097 815.50815,-218.20873 811.28125,-219.40625 C 807.4464,-220.4927 806.10867,-221.47862 802.21875,-222.53125 C 802.21874,-222.53125 802.21875,-222.375 802.21875,-222.375 C 805.70293,-220.98015 807.28816,-219.4556 810.75,-218.34375 C 812.41793,-217.80803 814.20578,-217.55701 815.96875,-217.46875 C 815.44911,-217.11663 814.46836,-216.55423 812.65625,-215.9375 C 809.89059,-214.99625 806.06601,-214.00213 804.5,-213.78125 C 803.68206,-213.66586 802.8669,-213.65842 802.21875,-213.75 C 801.56379,-213.83321 801.08615,-213.96827 800.96875,-214 C 801.13079,-213.92536 801.40274,-213.65956 800.78125,-212.90625 C 799.91125,-211.85172 794.77162,-210.247 791.90625,-209.46875 C 789.05372,-208.69399 785.64713,-208.51055 781.46875,-209.5625 C 777.26192,-210.62163 776.11206,-211.60416 771.125,-212.71875 C 775.60954,-211.25929 777.09435,-209.58352 780.9375,-208.46875 C 782.52254,-208.00898 784.22429,-207.8305 785.90625,-207.78125 C 785.46468,-207.44449 784.39374,-206.75352 782.40625,-206 C 779.67232,-204.96351 775.95427,-203.83731 774.40625,-203.5625 C 772.94163,-203.30248 771.34667,-203.67904 771.0625,-203.75 C 771.22275,-203.67035 771.44294,-203.42902 770.84375,-202.6875 C 769.97909,-201.61744 764.92723,-199.86935 762.09375,-199 C 759.27295,-198.13453 755.88625,-197.84369 751.75,-198.78125 C 747.99741,-199.63186 746.70215,-200.49772 742.875,-201.375 C 742.875,-201.375 742.875,-201.21875 742.875,-201.21875 C 746.30296,-199.98096 747.86241,-198.58645 751.25,-197.6875 C 752.88216,-197.25436 754.61704,-197.10449 756.34375,-197.125 C 755.83482,-196.74083 754.867,-196.10318 753.09375,-195.375 C 750.38741,-194.26366 746.65742,-193.06719 745.125,-192.75 C 744.3246,-192.58431 743.51269,-192.53138 742.875,-192.59375 C 742.875,-192.59375 742.875,-192.07823 742.875,-191.67146 C 742.875,-191.40639 742.875,-191.1875 742.875,-191.1875 C 743.10145,-191.33218 743.32391,-191.46011 743.59375,-191.5625 C 744.67427,-191.97248 745.76536,-191.77827 749.59375,-193.25 C 753.42218,-194.72174 754.81787,-195.25498 755.5,-195.65625 C 756.1796,-196.05603 757.11165,-196.53562 757.71875,-197.1875 C 759.5456,-197.32525 761.2895,-197.68073 762.65625,-198.1875 C 765.62437,-199.28802 767.53162,-199.99369 769.4375,-200.65625 C 771.34336,-201.31879 771.79159,-202.07112 772.84375,-202.4375 C 773.9353,-202.81761 775.03886,-202.60288 778.90625,-203.96875 C 782.7737,-205.33461 784.18941,-205.79583 784.875,-206.1875 C 785.57609,-206.58802 786.57581,-207.12048 787.1875,-207.78125 C 789.1583,-207.83591 791.00435,-208.16588 792.46875,-208.65625 C 795.47023,-209.66133 797.3949,-210.27796 799.3125,-210.90625 C 800.8511,-211.41035 801.48652,-211.95302 802.21875,-212.34375 C 802.44891,-212.47806 802.69449,-212.59748 802.96875,-212.6875 C 804.06698,-213.04798 805.1502,-212.76887 809.0625,-214 C 812.97483,-215.23113 814.42855,-215.67295 815.125,-216.03125 C 815.81888,-216.38822 816.75515,-216.82386 817.375,-217.4375 C 819.24021,-217.46016 821.01081,-217.70433 822.40625,-218.125 C 825.43668,-219.03854 827.39863,-219.5551 829.34375,-220.09375 C 831.28886,-220.63239 831.76993,-221.35827 832.84375,-221.65625 C 833.95776,-221.9654 835.06369,-221.64886 839.03125,-222.6875 C 842.99886,-223.72613 844.44883,-224.12023 845.15625,-224.4375 C 845.89112,-224.76709 846.97008,-225.19122 847.59375,-225.8125 C 849.59149,-225.6965 851.45118,-225.83259 852.9375,-226.1875 C 856.01561,-226.9225 858.02094,-227.28844 860,-227.6875 C 861.58792,-228.00768 862.24429,-228.47805 863,-228.78125 C 863.23757,-228.88805 863.46695,-228.97401 863.75,-229.03125 C 864.88347,-229.26044 866.05448,-228.82232 870.09375,-229.53125 C 874.13308,-230.24018 875.594,-230.45834 876.3125,-230.71875 C 877.02836,-230.97819 878.01678,-231.28599 878.65625,-231.8125 C 880.58052,-231.57301 882.40413,-231.58797 883.84375,-231.8125 C 886.97008,-232.30012 888.9983,-232.51317 891,-232.78125 C 893.00171,-233.04932 893.48869,-233.72639 894.59375,-233.875 C 895.74014,-234.02918 896.86967,-233.57343 900.9375,-234.09375 C 905.00534,-234.61407 906.49763,-234.78948 907.21875,-235.03125 C 907.95585,-235.27839 909.01684,-235.61748 909.65625,-236.15625 C 911.70632,-235.82072 913.63003,-235.75829 915.15625,-235.9375 C 918.29856,-236.30646 920.33619,-236.49686 922.34375,-236.71875 C 923.95451,-236.89677 924.60842,-237.32695 925.375,-237.5625 C 925.61594,-237.64802 925.86912,-237.7181 926.15625,-237.75 C 927.30603,-237.87772 928.45754,-237.40335 932.53125,-237.875 C 936.60499,-238.34665 938.09034,-238.4856 938.8125,-238.71875 C 939.53196,-238.95102 940.51274,-239.19221 941.15625,-239.6875 C 943.09262,-239.35404 944.92631,-239.28326 946.375,-239.4375 C 949.52102,-239.77245 951.55256,-239.95609 953.5625,-240.15625 C 955.57246,-240.35639 956.04664,-240.98264 957.15625,-241.09375 C 958.30739,-241.20903 959.45268,-240.72869 963.53125,-241.15625 C 967.60986,-241.58381 969.12011,-241.71834 969.84375,-241.9375 C 970.5829,-242.16136 971.63947,-242.45075 972.28125,-242.96875 C 974.33835,-242.57008 976.28312,-242.47535 977.8125,-242.625 C 980.96123,-242.9331 982.98834,-243.09825 985,-243.28125 C 986.61407,-243.42807 987.2631,-243.8418 988.03125,-244.0625 C 988.27267,-244.14336 988.52478,-244.19241 988.8125,-244.21875 C 989.96461,-244.3242 991.10546,-243.826 995.1875,-244.21875 C 999.26958,-244.6115 1000.7764,-244.74959 1001.5,-244.96875 C 1002.2209,-245.18708 1003.1997,-245.41645 1003.8438,-245.90625 C 1005.7818,-245.55626 1007.6126,-245.45187 1009.0625,-245.59375 C 1012.2112,-245.90185 1014.2383,-246.067 1016.25,-246.25 C 1018.2616,-246.43299 1018.7642,-247.08802 1019.875,-247.1875 C 1021.0273,-247.29073 1022.1672,-246.80267 1026.25,-247.1875 C 1030.3329,-247.57232 1031.8387,-247.6885 1032.5625,-247.90625 C 1033.3018,-248.12868 1034.3581,-248.42074 1035,-248.9375 C 1037.0574,-248.53573 1039.0029,-248.43417 1040.5313,-248.59375 C 1043.6779,-248.92227 1045.7084,-249.11645 1047.7188,-249.3125 C 1049.3318,-249.46979 1049.9844,-249.94398 1050.75,-250.1875 C 1050.9907,-250.27554 1051.2132,-250.30887 1051.5,-250.34375 C 1052.6483,-250.48345 1053.8167,-250.00384 1057.875,-250.59375 C 1061.9333,-251.18367 1063.4368,-251.37089 1064.1563,-251.625 C 1064.873,-251.87816 1065.8308,-252.18307 1066.4688,-252.71875 C 1068.3885,-252.50681 1070.1887,-252.56734 1071.625,-252.8125 C 1074.7441,-253.3449 1076.7366,-253.74111 1078.7188,-254.125 C 1080.7009,-254.50887 1081.1931,-255.16465 1082.2813,-255.40625 C 1083.4101,-255.65691 1084.5516,-255.28996 1088.5313,-256.28125 C 1092.5109,-257.27253 1093.9609,-257.70055 1094.6563,-258.0625 C 1095.3786,-258.43851 1096.4182,-258.93308 1097.0313,-259.59375 C 1098.9943,-259.6058 1100.825,-259.8848 1102.25,-260.4375 C 1105.2012,-261.58211 1107.1232,-262.30692 1108.9375,-263.1875 C 1110.3932,-263.89403 1111.2723,-264.87391 1111.4844,-265.17188 C 1111.6966,-265.46984 1111.5962,-265.91718 1111.6223,-265.93863 C 1111.6652,-265.97387 1111.9416,-266.0236 1112.1013,-266.36707 C 1112.9602,-268.21415 1114.4223,-272.01166 1114.5365,-272.69652 C 1114.6502,-273.37868 1114.7003,-274.04426 1114.751,-274.44149 C 1114.7804,-274.67101 1114.6043,-275.30693 1114.6264,-275.36553 C 1114.6573,-275.44759 1114.9309,-275.63081 1114.9863,-275.88024 C 1115.2526,-277.07857 1115.0752,-278.07153 1114.8612,-279.48917 C 1114.6472,-280.90681 1113.8775,-284.11131 1113.2243,-284.96543 C 1112.5654,-285.82715 1112.0014,-285.9766 1111.4764,-285.96609 C 1111.2678,-285.69633 1111.6132,-285.703 1111.639,-285.65348 C 1112.3196,-285.60269 1112.573,-285.28484 1113.0582,-284.75686 C 1113.5434,-284.22888 1114.501,-280.8173 1114.6376,-279.36691 C 1114.7742,-277.91652 1114.8276,-276.50671 1114.5496,-275.89827 C 1114.2715,-275.28982 1113.6054,-275.46963 1113.313,-275.40375 C 1113.844,-275.21786 1114.2038,-275.19053 1114.2654,-274.34607 C 1114.3247,-273.53269 1114.1322,-272.70638 1113.7456,-271.54045 C 1113.3544,-270.36044 1111.9004,-267.19047 1111.4599,-266.94168 C 1111.0076,-266.68617 1110.5075,-266.75969 1110.1719,-266.89063 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6997);enable-background:new" +           sodipodi:nodetypes="cssscscsscsssccscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssccscsscscssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsszsszssszzcczzzczzzc" /> +        <path +           id="path8103" +           d="M 988.75,-263.84375 C 990.66161,-263.20935 993.30027,-262.08534 994.875,-261.03125 C 996.44977,-259.97716 997.7711,-259.54873 1000.4063,-257.65625 C 1003.0145,-255.78311 1005.4332,-254.64103 1007.7188,-253.59375 C 1010.1881,-252.46228 1013.4709,-251.43901 1017.25,-249.65625 C 1016.0428,-250.91465 1010.111,-253.0207 1008.2188,-253.84375 C 1006.3266,-254.66679 1004.0908,-255.77424 1001.2813,-257.625 C 998.47169,-259.47575 997.65906,-260.10654 995.28125,-261.34375 C 992.90343,-262.58094 991.20137,-263.29295 988.75,-263.84375 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6953);enable-background:new" /> +        <path +           id="path8105" +           d="M 957.5,-260.78125 C 959.41,-260.16315 962.08288,-259.07191 963.65625,-258.03125 C 965.22964,-256.99059 966.55233,-256.54873 969.1875,-254.65625 C 971.79573,-252.7831 974.21442,-251.64104 976.5,-250.59375 C 978.96931,-249.46228 982.25213,-248.439 986.03125,-246.65625 C 984.82397,-247.91465 978.82971,-250.05195 976.9375,-250.875 C 975.04533,-251.69804 972.84084,-252.8055 970.03125,-254.65625 C 967.22167,-256.507 966.4383,-257.09557 964.0625,-258.3125 C 961.68672,-259.52941 959.94929,-260.25135 957.5,-260.78125 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6993);enable-background:new" /> +        <path +           id="path8107" +           d="M 926.09375,-257.375 C 928.00147,-256.77755 930.64723,-255.71116 932.21875,-254.6875 C 933.79025,-253.66385 935.08897,-253.24779 937.71875,-251.40625 C 940.32166,-249.58352 942.74762,-248.43405 945.03125,-247.40625 C 947.49845,-246.29584 950.7866,-245.31302 954.5625,-243.5625 C 953.35627,-244.8106 947.3906,-246.88059 945.5,-247.6875 C 943.60942,-248.4944 941.39758,-249.57854 938.59375,-251.375 C 935.7899,-253.17144 934.96671,-253.77751 932.59375,-254.96875 C 930.22078,-256.15999 928.54013,-256.87158 926.09375,-257.375 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6989);enable-background:new" /> +        <path +           id="path8109" +           d="M 894.90625,-253.5625 C 896.80838,-253.00895 899.49326,-251.97363 901.0625,-250.96875 C 902.63173,-249.96388 903.93651,-249.56011 906.5625,-247.75 C 909.16162,-245.95836 911.56284,-244.87811 913.84375,-243.875 C 916.30803,-242.79126 919.60359,-241.83471 923.375,-240.125 C 922.1702,-241.36007 916.20084,-243.36978 914.3125,-244.15625 C 912.42418,-244.94272 910.2373,-245.98705 907.4375,-247.75 C 904.63773,-249.51294 903.83831,-250.11836 901.46875,-251.28125 C 899.09918,-252.44413 897.3455,-253.11537 894.90625,-253.5625 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6985);enable-background:new" /> +        <path +           id="path8111" +           d="M 863.71875,-248.65625 C 865.59937,-248.22716 868.22302,-247.27587 869.78125,-246.34375 C 871.33948,-245.41164 872.63358,-245.08599 875.25,-243.34375 C 877.83971,-241.61931 880.23067,-240.63573 882.5,-239.71875 C 884.95176,-238.72806 888.23959,-237.84168 892,-236.21875 C 890.79869,-237.42609 884.84751,-239.28484 882.96875,-240 C 881.09,-240.71517 878.88335,-241.68442 876.09375,-243.375 C 873.30412,-245.06557 872.50914,-245.60322 870.15625,-246.65625 C 867.80333,-247.70926 866.13041,-248.36873 863.71875,-248.65625 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6965);enable-background:new" /> +        <path +           id="path8113" +           d="M 833.15625,-241.375 C 835.00461,-241.07856 837.6257,-240.39868 839.15625,-239.59375 C 840.68683,-238.78882 841.96999,-238.53802 844.53125,-237.0625 C 847.06629,-235.60204 849.42193,-234.73741 851.65625,-234 C 854.07024,-233.20332 857.31336,-232.53311 861.03125,-231.15625 C 859.84354,-232.28498 853.94353,-233.746 852.09375,-234.3125 C 850.24398,-234.879 848.09033,-235.68642 845.34375,-237.15625 C 842.59718,-238.62608 841.84239,-239.07653 839.53125,-239.9375 C 837.2201,-240.79845 835.52654,-241.25759 833.15625,-241.375 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6981);enable-background:new" /> +        <path +           id="path8115" +           d="M 802.90625,-232.3125 C 804.72845,-232.10123 807.27201,-231.51193 808.78125,-230.78125 C 810.2905,-230.05059 811.53693,-229.85127 814.0625,-228.5 C 816.56226,-227.16254 818.89404,-226.45157 821.09375,-225.84375 C 823.47028,-225.18708 826.65839,-224.77087 830.3125,-223.65625 C 829.14515,-224.70121 823.38362,-225.75954 821.5625,-226.21875 C 819.74139,-226.67796 817.61025,-227.34571 814.90625,-228.65625 C 812.20222,-229.96677 811.43519,-230.37615 809.15625,-231.125 C 806.8773,-231.87383 805.243,-232.30431 802.90625,-232.3125 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6977);enable-background:new" /> +        <path +           id="path8117" +           d="M 773.1875,-222.1875 C 774.99859,-222.0088 777.50809,-221.52244 779,-220.84375 C 780.49194,-220.16506 781.7534,-220.04553 784.25,-218.78125 C 786.72107,-217.52987 789.04005,-216.88511 791.21875,-216.34375 C 793.57262,-215.75887 796.71009,-215.44623 800.3125,-214.5 C 799.16166,-215.49116 793.45999,-216.2833 791.65625,-216.6875 C 789.85253,-217.0917 787.74072,-217.70866 785.0625,-218.9375 C 782.38432,-220.16634 781.65905,-220.54839 779.40625,-221.21875 C 777.15346,-221.88909 775.50998,-222.22107 773.1875,-222.1875 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6973);enable-background:new" /> +        <path +           id="path8119" +           d="M 743.5625,-211.1875 C 745.35531,-211.05839 747.83563,-210.63785 749.3125,-210 C 750.7894,-209.36215 752.0286,-209.25844 754.5,-208.0625 C 756.94618,-206.87878 759.22054,-206.31584 761.375,-205.84375 C 763.70267,-205.33372 766.7946,-205.16311 770.375,-204.28125 C 769.23121,-205.25185 763.62741,-205.8719 761.84375,-206.21875 C 760.06008,-206.56559 757.9609,-207.10631 755.3125,-208.25 C 752.66409,-209.39368 751.91755,-209.76631 749.6875,-210.375 C 747.45742,-210.98368 745.86156,-211.28466 743.5625,-211.1875 z" +           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter6969);enable-background:new" /> +        <g +           id="g8121" +           style="fill:#ffffff;fill-opacity:1;filter:url(#filter7345)"> +          <path +             sodipodi:nodetypes="czzzczzc" +             id="path8123" +             d="M 744.9375,-212.11731 C 744.9375,-212.11731 752.15979,-215.34049 754,-215.61731 C 755.84021,-215.89413 757.35225,-215.62054 760,-215.05481 C 762.64775,-214.48908 768.7357,-212.83963 771.1875,-211.67981 C 773.6393,-210.51999 776.5,-208.11731 776.5,-208.11731 C 776.5,-208.11731 769.35356,-210.8975 766.3125,-211.67981 C 763.27144,-212.46212 758.66789,-213.76355 755.9375,-213.99231 C 753.20711,-214.22107 744.9375,-212.11731 744.9375,-212.11731 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> +          <path +             sodipodi:nodetypes="czzzczzc" +             id="path8125" +             d="M 735.46875,-206.95416 C 735.46875,-206.95416 739.12854,-209.17734 740.96875,-209.45416 C 742.80896,-209.73098 744.6335,-209.20739 747.28125,-208.64166 C 749.929,-208.07593 756.01695,-206.42648 758.46875,-205.26666 C 760.92055,-204.10684 765.03125,-203.14166 765.03125,-203.14166 C 765.03125,-203.14166 756.63481,-204.48435 753.59375,-205.26666 C 750.55269,-206.04897 745.63664,-207.6004 742.90625,-207.82916 C 740.17586,-208.05792 735.46875,-206.95416 735.46875,-206.95416 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             sodipodi:nodetypes="czzzczzc" +             id="path8127" +             d="M 759.85042,-217.61116 C 759.85042,-217.61116 768.39412,-220.90973 770.2482,-221.06902 C 772.10229,-221.22832 773.88986,-220.58982 776.4963,-219.85694 C 779.10274,-219.12406 785.07354,-217.091 787.44666,-215.77769 C 789.81978,-214.46438 793.86083,-213.23987 793.86083,-213.23987 C 793.86083,-213.23987 785.5667,-215.11352 782.58152,-216.08754 C 779.59633,-217.06156 774.78883,-218.92232 772.0785,-219.32416 C 769.36817,-219.726 759.85042,-217.61116 759.85042,-217.61116 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             sodipodi:nodetypes="czzzczzc" +             id="path8129" +             d="M 775.19813,-223.2266 C 775.19813,-223.2266 782.96946,-226.00904 784.82644,-226.13009 C 786.68341,-226.25113 788.45744,-225.57592 791.04822,-224.78947 C 793.63899,-224.00302 799.56662,-221.8473 801.91216,-220.48535 C 804.25771,-219.1234 808.27265,-217.81585 808.27265,-217.81585 C 808.27265,-217.81585 800.01892,-219.86008 797.05444,-220.89543 C 794.08997,-221.93078 789.32185,-223.89024 786.62038,-224.34786 C 783.91891,-224.80549 775.19813,-223.2266 775.19813,-223.2266 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-4.3190906" +             inkscape:transform-center-x="13.852145" +             sodipodi:nodetypes="czzzczzc" +             id="path8131" +             d="M 789.64298,-227.95417 C 789.64298,-227.95417 798.32554,-231.47448 800.18452,-231.55952 C 802.04349,-231.64455 803.8041,-230.9351 806.37915,-230.09859 C 808.9542,-229.2621 814.83894,-226.99193 817.15766,-225.58479 C 819.47638,-224.17764 823.46523,-222.79255 823.46523,-222.79255 C 823.46523,-222.79255 815.25266,-224.99632 812.3088,-226.08891 C 809.36494,-227.1815 804.63568,-229.23299 801.94358,-229.74288 C 799.25149,-230.25276 789.64298,-227.95417 789.64298,-227.95417 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-4.3190906" +             inkscape:transform-center-x="13.852145" +             sodipodi:nodetypes="czzzczzc" +             id="path8133" +             d="M 804.49513,-233.32948 C 804.49513,-233.32948 812.30269,-235.91229 814.16167,-235.99733 C 816.02064,-236.08236 817.78125,-235.37291 820.3563,-234.5364 C 822.93135,-233.69991 828.81609,-231.42974 831.13481,-230.0226 C 833.45353,-228.61545 837.44238,-227.23036 837.44238,-227.23036 C 837.44238,-227.23036 829.22981,-229.43413 826.28595,-230.52672 C 823.34209,-231.61931 818.61283,-233.6708 815.92073,-234.18069 C 813.22864,-234.69057 804.49513,-233.32948 804.49513,-233.32948 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-4.3190906" +             inkscape:transform-center-x="13.852145" +             sodipodi:nodetypes="czzzczzc" +             id="path8135" +             d="M 819.55763,-237.57948 C 819.55763,-237.57948 828.11519,-240.16229 829.97417,-240.24733 C 831.83314,-240.33236 833.59375,-239.62291 836.1688,-238.7864 C 838.74385,-237.94991 844.62859,-235.67974 846.94731,-234.2726 C 849.26603,-232.86545 853.25488,-231.48036 853.25488,-231.48036 C 853.25488,-231.48036 845.04231,-233.68413 842.09845,-234.77672 C 839.15459,-235.86931 834.42533,-237.9208 831.73323,-238.43069 C 829.04114,-238.94057 819.55763,-237.57948 819.55763,-237.57948 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-4.9269042" +             inkscape:transform-center-x="13.64141" +             sodipodi:nodetypes="czzzczzc" +             id="path8137" +             d="M 836.23395,-242.60125 C 836.23395,-242.60125 843.20097,-244.58848 845.06179,-244.56882 C 846.9226,-244.54915 848.64052,-243.7418 851.16444,-242.76177 C 853.68837,-241.78177 859.4361,-239.18419 861.672,-237.64886 C 863.9079,-236.11351 867.81253,-234.50625 867.81253,-234.50625 C 867.81253,-234.50625 859.73692,-237.16847 856.85917,-238.42491 C 853.98143,-239.68136 849.37505,-241.99561 846.71589,-242.65612 C 844.05674,-243.31661 836.23395,-242.60125 836.23395,-242.60125 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.1542119" +             inkscape:transform-center-x="13.55068" +             sodipodi:nodetypes="czzzczzc" +             id="path8139" +             d="M 850.73028,-246.00461 C 850.73028,-246.00461 858.41812,-248.03229 860.2781,-247.97315 C 862.13807,-247.914 863.83848,-247.07036 866.34103,-246.03699 C 868.84358,-245.00365 874.5349,-242.28467 876.73771,-240.70224 C 878.94053,-239.11979 882.81016,-237.43004 882.81016,-237.43004 C 882.81016,-237.43004 874.79287,-240.26302 871.94244,-241.58026 C 869.09201,-242.89749 864.53578,-245.30898 861.89124,-246.02576 C 859.2467,-246.74254 850.73028,-246.00461 850.73028,-246.00461 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.4740887" +             inkscape:transform-center-x="13.41151" +             sodipodi:nodetypes="czzzczzc" +             id="path8141" +             d="M 864.82496,-249.21081 C 864.82496,-249.21081 872.99448,-251.17987 874.85184,-251.06477 C 876.70919,-250.94965 878.38342,-250.05521 880.85374,-248.94698 C 883.32405,-247.83877 888.93094,-244.94971 891.08512,-243.30167 C 893.2393,-241.65363 897.05632,-239.84815 897.05632,-239.84815 C 897.05632,-239.84815 889.12793,-242.92121 886.31845,-244.32365 C 883.50896,-245.72609 879.02739,-248.27364 876.40562,-249.06971 C 873.78386,-249.86577 864.82496,-249.21081 864.82496,-249.21081 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.79376" +             inkscape:transform-center-x="13.258805" +             sodipodi:nodetypes="czzzczzc" +             id="path8143" +             d="M 881.38485,-251.60282 C 881.38485,-251.60282 889.47021,-253.51091 891.32322,-253.33946 C 893.17622,-253.16799 894.82252,-252.22313 897.25804,-251.04038 C 899.69357,-249.85767 905.21013,-246.79968 907.31327,-245.08699 C 909.41641,-243.37429 913.17684,-241.45373 913.17684,-241.45373 C 913.17684,-241.45373 905.34544,-244.76613 902.57984,-246.25323 C 899.81423,-247.74035 895.41209,-250.42282 892.8157,-251.29814 C 890.21933,-252.17345 881.38485,-251.60282 881.38485,-251.60282 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8145" +             d="M 896.58415,-254.34724 C 896.58415,-254.34724 904.22581,-255.77494 906.07962,-255.61239 C 907.93342,-255.44983 909.58424,-254.51289 912.02541,-253.34186 C 914.46659,-252.17086 919.99779,-249.1394 922.10913,-247.43684 C 924.22047,-245.73426 927.99009,-243.83179 927.99009,-243.83179 C 927.99009,-243.83179 920.14286,-247.10653 917.37014,-248.58034 C 914.59743,-250.05414 910.18245,-252.71543 907.58189,-253.57827 C 904.98134,-254.44109 896.58415,-254.34724 896.58415,-254.34724 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8147" +             d="M 911.45328,-255.98544 C 911.45328,-255.98544 920.09494,-257.53814 921.94875,-257.37559 C 923.80255,-257.21303 925.45337,-256.27609 927.89454,-255.10506 C 930.33572,-253.93406 935.86692,-250.9026 937.97826,-249.20004 C 940.0896,-247.49746 943.85922,-245.59499 943.85922,-245.59499 C 943.85922,-245.59499 936.01199,-248.86973 933.23927,-250.34354 C 930.46656,-251.81734 926.05158,-254.47863 923.45102,-255.34147 C 920.85047,-256.20429 911.45328,-255.98544 911.45328,-255.98544 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8149" +             d="M 927.70328,-258.29794 C 927.70328,-258.29794 935.34494,-259.16314 937.19875,-259.00059 C 939.05255,-258.83803 940.70337,-257.90109 943.14454,-256.73006 C 945.58572,-255.55906 951.11692,-252.5276 953.22826,-250.82504 C 955.3396,-249.12246 959.10922,-247.21999 959.10922,-247.21999 C 959.10922,-247.21999 951.26199,-250.49473 948.48927,-251.96854 C 945.71656,-253.44234 941.30158,-256.10363 938.70102,-256.96647 C 936.10047,-257.82929 927.70328,-258.29794 927.70328,-258.29794 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8151" +             d="M 942.82828,-259.48544 C 942.82828,-259.48544 951.40744,-260.97564 953.26125,-260.81309 C 955.11505,-260.65053 956.76587,-259.71359 959.20704,-258.54256 C 961.64822,-257.37156 967.17942,-254.3401 969.29076,-252.63754 C 971.4021,-250.93496 975.17172,-249.03249 975.17172,-249.03249 C 975.17172,-249.03249 967.32449,-252.30723 964.55177,-253.78104 C 961.77906,-255.25484 957.36408,-257.91613 954.76352,-258.77897 C 952.16297,-259.64179 942.82828,-259.48544 942.82828,-259.48544 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8153" +             d="M 959.07828,-261.54794 C 959.07828,-261.54794 966.90744,-262.35064 968.76125,-262.18809 C 970.61505,-262.02553 972.26587,-261.08859 974.70704,-259.91756 C 977.14822,-258.74656 982.67942,-255.7151 984.79076,-254.01254 C 986.9021,-252.30996 990.67172,-250.40749 990.67172,-250.40749 C 990.67172,-250.40749 982.82449,-253.68223 980.05177,-255.15604 C 977.27906,-256.62984 972.86408,-259.29113 970.26352,-260.15397 C 967.66297,-261.01679 959.07828,-261.54794 959.07828,-261.54794 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8155" +             d="M 974.45328,-262.79794 C 974.45328,-262.79794 982.84494,-263.97564 984.69875,-263.81309 C 986.55255,-263.65053 988.20337,-262.71359 990.64454,-261.54256 C 993.08572,-260.37156 998.61692,-257.3401 1000.7283,-255.63754 C 1002.8396,-253.93496 1006.6092,-252.03249 1006.6092,-252.03249 C 1006.6092,-252.03249 998.76199,-255.30723 995.98927,-256.78104 C 993.21656,-258.25484 988.80158,-260.91613 986.20102,-261.77897 C 983.60047,-262.64179 974.45328,-262.79794 974.45328,-262.79794 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8157" +             d="M 990.64078,-264.86044 C 990.64078,-264.86044 997.53244,-265.85064 999.38625,-265.68809 C 1001.2401,-265.52553 1002.8909,-264.58859 1005.332,-263.41756 C 1007.7732,-262.24656 1013.3044,-259.2151 1015.4158,-257.51254 C 1017.5271,-255.80996 1021.2967,-253.90749 1021.2967,-253.90749 C 1021.2967,-253.90749 1013.4495,-257.18223 1010.6768,-258.65604 C 1007.9041,-260.12984 1003.4891,-262.79113 1000.8885,-263.65397 C 998.28797,-264.51679 990.64078,-264.86044 990.64078,-264.86044 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8159" +             d="M 1007.7658,-265.79794 C 1007.7658,-265.79794 1014.5949,-266.97564 1016.4488,-266.81309 C 1018.3026,-266.65053 1019.9534,-265.71359 1022.3945,-264.54256 C 1024.8357,-263.37156 1030.3669,-260.3401 1032.4783,-258.63754 C 1034.5896,-256.93496 1038.3592,-255.03249 1038.3592,-255.03249 C 1038.3592,-255.03249 1030.512,-258.30723 1027.7393,-259.78104 C 1024.9666,-261.25484 1020.5516,-263.91613 1017.951,-264.77897 C 1015.3505,-265.64179 1007.7658,-265.79794 1007.7658,-265.79794 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8161" +             d="M 1023.8908,-267.79794 C 1023.8908,-267.79794 1029.9699,-268.22564 1031.8238,-268.06309 C 1033.6776,-267.90053 1035.3284,-266.96359 1037.7695,-265.79256 C 1040.2107,-264.62156 1045.7419,-261.5901 1047.8533,-259.88754 C 1049.9646,-258.18496 1053.7342,-256.28249 1053.7342,-256.28249 C 1053.7342,-256.28249 1045.887,-259.55723 1043.1143,-261.03104 C 1040.3416,-262.50484 1035.9266,-265.16613 1033.326,-266.02897 C 1030.7255,-266.89179 1023.8908,-267.79794 1023.8908,-267.79794 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.7433893" +             inkscape:transform-center-x="13.28378" +             sodipodi:nodetypes="czzzczzc" +             id="path8163" +             d="M 1039.7033,-269.17294 C 1039.7033,-269.17294 1046.1574,-269.85064 1048.0113,-269.68809 C 1049.8651,-269.52553 1051.5159,-268.58859 1053.957,-267.41756 C 1056.3982,-266.24656 1061.9294,-263.2151 1064.0408,-261.51254 C 1066.1521,-259.80996 1069.9217,-257.90749 1069.9217,-257.90749 C 1069.9217,-257.90749 1062.0745,-261.18223 1059.3018,-262.65604 C 1056.5291,-264.12984 1052.1141,-266.79113 1049.5135,-267.65397 C 1046.913,-268.51679 1039.7033,-269.17294 1039.7033,-269.17294 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-5.1360724" +             inkscape:transform-center-x="13.55813" +             sodipodi:nodetypes="czzzczzc" +             id="path8165" +             d="M 1055.2718,-271.03319 C 1055.2718,-271.03319 1060.7694,-271.94264 1062.6296,-271.88667 C 1064.4897,-271.83067 1066.1915,-270.98993 1068.6957,-269.96081 C 1071.2001,-268.93171 1076.896,-266.22241 1079.1015,-264.64372 C 1081.307,-263.06501 1085.1795,-261.38182 1085.1795,-261.38182 C 1085.1795,-261.38182 1077.1575,-264.20121 1074.3047,-265.5136 C 1071.4521,-266.82598 1066.8918,-269.22973 1064.246,-269.94203 C 1061.6003,-270.65431 1055.2718,-271.03319 1055.2718,-271.03319 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-4.6370147" +             inkscape:transform-center-x="13.74758" +             sodipodi:nodetypes="czzzczzc" +             id="path8167" +             d="M 1072.7007,-273.48537 C 1072.7007,-273.48537 1077.2479,-274.64118 1079.1087,-274.67158 C 1080.9694,-274.70196 1082.7083,-273.94109 1085.2576,-273.02927 C 1087.807,-272.1175 1093.6225,-269.67541 1095.899,-268.20077 C 1098.1753,-266.72609 1102.1217,-265.22441 1102.1217,-265.22441 C 1102.1217,-265.22441 1093.9775,-267.66852 1091.067,-268.84713 C 1088.1565,-270.02573 1083.4896,-272.21528 1080.8136,-272.80404 C 1078.1377,-273.39279 1072.7007,-273.48537 1072.7007,-273.48537 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             inkscape:transform-center-y="-4.4842392" +             inkscape:transform-center-x="13.79933" +             sodipodi:nodetypes="czzzczzc" +             id="path8169" +             d="M 1087.1585,-276.5244 C 1087.1585,-276.5244 1093.1185,-278.29795 1094.9787,-278.35464 C 1096.8387,-278.41131 1098.5883,-277.67509 1101.1502,-276.79939 C 1103.7122,-275.92373 1103.6728,-275.94226 1106.4837,-275.30924 C 1109.2806,-274.67938 1113.5604,-273.79611 1113.5604,-273.79611 C 1113.5604,-273.79611 1109.9449,-273.81239 1106.7681,-274.26225 C 1103.6526,-274.70344 1099.3938,-275.9605 1096.7097,-276.51138 C 1094.0258,-277.06226 1087.1585,-276.5244 1087.1585,-276.5244 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" /> +          <path +             sodipodi:nodetypes="czczc" +             id="path8171" +             d="M 1099.25,-279.92981 C 1099.4112,-279.66119 1110.4581,-284.53027 1111.4375,-284.61731 C 1112.4169,-284.70435 1113.4375,-281.49231 1113.4375,-281.49231 C 1113.4375,-281.49231 1112.6624,-282.99665 1110.5625,-282.55481 C 1108.4626,-282.11297 1099.2616,-279.8834 1099.25,-279.92981 z" +             style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> +        </g> +        <path +           id="path8173" +           d="M 1107.4532,-284.0938 C 1107.0345,-283.88097 1107.2976,-283.99991 1106.806,-283.78799 C 1106.3199,-283.57845 1105.0826,-283.2136 1102.7264,-282.32904 C 1099.3953,-281.07847 1096.8962,-280.1756 1095.7005,-279.26294 C 1094.1644,-279.24168 1091.98,-279.02963 1090.0442,-278.54419 C 1087.0627,-277.79653 1085.189,-277.37018 1083.2942,-276.95044 C 1081.3994,-276.53072 1081.6187,-276.30825 1080.4192,-276.07544 C 1079.1226,-275.82378 1078.6978,-276.08443 1074.9817,-275.29419 C 1071.4918,-274.55205 1066.0869,-273.36312 1064.8255,-272.60669 C 1063.2416,-272.78748 1060.958,-272.92847 1058.9817,-272.63794 C 1055.9413,-272.19099 1054.0655,-271.96518 1052.138,-271.73169 C 1051.4826,-271.65232 1051.0969,-271.53091 1050.7942,-271.45044 C 1050.368,-271.31879 1050.1084,-271.19042 1049.4192,-271.10669 C 1048.1076,-270.94733 1047.657,-271.26352 1043.888,-270.82544 C 1040.3341,-270.41236 1034.8826,-269.55262 1033.638,-268.88794 C 1032.039,-269.18524 1029.7802,-269.42213 1027.7942,-269.23169 C 1024.7354,-268.93838 1022.8222,-268.7477 1020.888,-268.57544 C 1018.9537,-268.40318 1019.1993,-268.15307 1017.9817,-268.04419 C 1016.6655,-267.9265 1016.2219,-268.20782 1012.4505,-267.79419 C 1008.9086,-267.40575 1003.4426,-266.58492 1002.1692,-265.91919 C 1000.5703,-266.21389 998.28202,-266.4262 996.29419,-266.23169 C 993.23595,-265.93245 991.35306,-265.75145 989.41919,-265.57544 C 988.7617,-265.5156 988.37915,-265.39688 988.07544,-265.32544 C 987.64779,-265.20649 987.39193,-265.10737 986.70044,-265.04419 C 985.38448,-264.92394 984.94068,-265.23907 981.16919,-264.82544 C 977.61305,-264.43543 972.16365,-263.58628 970.91919,-262.91919 C 969.32056,-263.21338 967.05935,-263.44291 965.07544,-263.23169 C 962.01984,-262.90637 960.1014,-262.70545 958.16919,-262.51294 C 956.23698,-262.32044 956.47932,-262.07206 955.26294,-261.95044 C 953.94806,-261.81898 953.49996,-262.11498 949.73169,-261.66919 C 946.19282,-261.25054 940.75401,-260.37702 939.48169,-259.70044 C 937.88414,-259.98149 935.62173,-260.12087 933.63794,-259.88794 C 930.58596,-259.52958 928.69286,-259.32008 926.76294,-259.10669 C 926.10674,-259.03414 925.72228,-258.934 925.41919,-258.85669 C 924.99242,-258.72947 924.73428,-258.58949 924.04419,-258.51294 C 922.73086,-258.36726 922.27673,-258.68696 918.51294,-258.20044 C 914.96405,-257.74169 909.53431,-256.78142 908.29419,-256.07544 C 906.70114,-256.31968 904.46038,-256.45679 902.48169,-256.20044 C 899.4341,-255.80563 897.53098,-255.55199 895.60669,-255.29419 C 893.68241,-255.0364 893.88058,-254.80066 892.66919,-254.63794 C 891.35973,-254.46204 890.922,-254.74232 887.16919,-254.16919 C 883.6449,-253.63095 878.24604,-252.47002 876.98169,-251.73169 C 875.39419,-251.93523 873.13619,-251.98642 871.16919,-251.63794 C 868.14302,-251.10182 866.2703,-250.77625 864.35669,-250.45044 C 863.70608,-250.33967 863.34298,-250.1795 863.04419,-250.07544 C 862.62352,-249.91056 862.38074,-249.74414 861.70044,-249.60669 C 860.40579,-249.3451 859.97332,-249.61289 856.26294,-248.79419 C 852.76441,-248.02224 847.41699,-246.41126 846.20044,-245.57544 C 844.63766,-245.65289 842.44286,-245.49016 840.51294,-244.98169 C 837.5405,-244.19856 835.69533,-243.7496 833.82544,-243.23169 C 831.95556,-242.71379 832.15884,-242.46441 830.98169,-242.13794 C 829.70923,-241.78504 829.28466,-242.03085 825.63794,-240.95044 C 822.21324,-239.93581 816.9885,-238.01727 815.76294,-237.10669 C 814.22411,-237.09395 812.04311,-236.83447 810.13794,-236.23169 C 807.20688,-235.30435 805.38763,-234.77327 803.54419,-234.16919 C 802.91743,-233.96381 802.55246,-233.77661 802.26294,-233.63794 C 801.85531,-233.42433 801.6096,-233.22919 800.95044,-233.01294 C 799.69598,-232.6014 799.26433,-232.8239 795.66919,-231.57544 C 792.27934,-230.39827 787.07421,-228.36174 785.88794,-227.41919 C 784.36405,-227.35952 782.23789,-227.02432 780.35669,-226.35669 C 777.4593,-225.3284 775.65761,-224.68121 773.82544,-224.04419 C 771.99327,-223.40718 772.19759,-223.19565 771.04419,-222.79419 C 769.79741,-222.36023 769.38058,-222.59447 765.82544,-221.23169 C 762.48677,-219.95189 757.33829,-217.74914 756.13794,-216.76294 C 754.63076,-216.65525 752.50225,-216.26414 750.63794,-215.54419 C 747.76976,-214.43659 746.01414,-213.76263 744.20044,-213.07544 C 743.58378,-212.84181 743.20403,-212.63341 742.91919,-212.48169 C 742.91919,-212.48169 742.91919,-211.38794 742.91919,-211.38794 C 743.03097,-211.6103 743.30518,-212.20537 743.82544,-212.48169 C 744.52341,-212.85241 748.63907,-214.47506 750.63794,-215.20044 C 752.2948,-215.80169 754.79183,-216.52912 756.60669,-216.51294 C 756.90831,-216.51025 757.19431,-216.46204 757.45044,-216.41919 C 759.29293,-216.11094 764.91919,-214.85669 764.91919,-214.85669 C 764.91918,-214.85669 758.6857,-216.50344 757.88794,-216.70044 C 757.69715,-216.74755 757.35222,-216.76916 756.91919,-216.76294 C 758.06465,-217.63265 761.68019,-219.15645 764.26294,-220.20044 C 767.10116,-221.34771 767.37975,-221.45226 769.32544,-221.85669 C 771.33374,-222.27413 772.48169,-222.35669 772.48169,-222.35669 C 772.48169,-222.35668 772.39933,-222.95783 773.45044,-223.48169 C 774.15554,-223.8331 778.33746,-225.37409 780.35669,-226.04419 C 782.30859,-226.69192 785.41409,-227.40269 787.23169,-227.04419 C 789.09492,-226.67669 794.76294,-225.23169 794.76294,-225.23169 C 794.76295,-225.23169 788.47594,-227.1028 787.66919,-227.32544 C 787.47627,-227.37869 787.13835,-227.41148 786.70044,-227.41919 C 787.85878,-228.25207 791.49488,-229.61451 794.10669,-230.57544 C 796.97685,-231.63145 797.27403,-231.73724 799.23169,-232.10669 C 801.08518,-232.45648 802.09053,-232.53217 802.26294,-232.54419 C 802.37654,-232.76143 802.64039,-233.35421 803.16919,-233.60669 C 803.87863,-233.94543 808.09526,-235.31944 810.13794,-235.91919 C 811.83111,-236.4163 814.37871,-236.95596 816.23169,-236.82544 C 816.53964,-236.80376 816.84518,-236.72818 817.10669,-236.66919 C 818.98787,-236.24487 824.70044,-234.63794 824.70044,-234.63794 C 824.70045,-234.63794 818.3587,-236.70319 817.54419,-236.95044 C 817.3494,-237.00958 816.98631,-237.05438 816.54419,-237.07544 C 817.71368,-237.87299 821.40721,-239.13166 824.04419,-240.01294 C 826.942,-240.98141 827.2772,-241.01626 829.26294,-241.29419 C 831.31259,-241.58108 832.45044,-241.60669 832.45044,-241.60669 C 832.45042,-241.60669 832.37769,-242.21366 833.45044,-242.66919 C 834.17004,-242.97476 838.44142,-244.16994 840.51294,-244.66919 C 842.51538,-245.15177 845.71143,-245.59748 847.57544,-245.07544 C 849.48622,-244.54029 855.29419,-242.57544 855.29419,-242.57544 C 855.29419,-242.57544 848.87153,-244.99895 848.04419,-245.29419 C 847.84635,-245.3648 847.46203,-245.43458 847.01294,-245.48169 C 848.20084,-246.21034 851.92821,-247.25577 854.60669,-247.98169 C 857.55011,-248.77944 857.89877,-248.75252 859.91919,-248.88794 C 861.83208,-249.01617 862.86624,-248.95903 863.04419,-248.95044 C 863.16147,-249.1541 863.43595,-249.72992 863.98169,-249.91919 C 864.71388,-250.17313 869.06021,-250.96708 871.16919,-251.29419 C 872.91732,-251.5653 875.57007,-251.77889 877.48169,-251.38794 C 877.79935,-251.32298 878.08691,-251.20243 878.35669,-251.10669 C 880.29743,-250.41796 886.20044,-248.01294 886.20044,-248.01294 C 886.20045,-248.01294 879.66573,-250.96371 878.82544,-251.32544 C 878.62447,-251.41195 878.25031,-251.49223 877.79419,-251.57544 C 879.00069,-252.20862 882.82375,-252.97104 885.54419,-253.48169 C 888.53372,-254.04288 888.84442,-254.01123 890.88794,-254.01294 C 892.9972,-254.01471 894.20044,-253.88794 894.20044,-253.88794 C 894.20044,-253.88793 894.12773,-254.51913 895.23169,-254.82544 C 895.97221,-255.03091 900.35781,-255.65931 902.48169,-255.88794 C 904.53471,-256.10893 907.80032,-256.14016 909.70044,-255.41919 C 911.64823,-254.68012 917.54419,-252.04419 917.54419,-252.04419 C 917.54421,-252.04419 910.98131,-255.22316 910.13794,-255.60669 C 909.93626,-255.69842 909.59573,-255.7929 909.13794,-255.88794 C 910.34886,-256.48982 914.12236,-257.13678 916.85669,-257.54419 C 919.86149,-257.99191 920.1822,-257.99589 922.23169,-257.95044 C 924.17214,-257.90742 925.23868,-257.75621 925.41919,-257.73169 C 925.53811,-257.92485 925.80309,-258.49752 926.35669,-258.63794 C 927.0994,-258.82632 931.51098,-259.37222 933.63794,-259.57544 C 935.40097,-259.74386 938.05803,-259.80973 939.98169,-259.32544 C 940.30137,-259.24496 940.5852,-259.12185 940.85669,-259.01294 C 942.80962,-258.22945 948.76294,-255.54419 948.76294,-255.54419 C 948.76292,-255.54419 942.17103,-258.79767 941.32544,-259.20044 C 941.12322,-259.29676 940.75318,-259.40747 940.29419,-259.51294 C 941.50833,-260.08721 945.33785,-260.63513 948.07544,-261.01294 C 951.08382,-261.42814 951.39851,-261.45557 953.45044,-261.38794 C 955.56842,-261.31813 956.76294,-261.13794 956.76294,-261.13794 C 956.76292,-261.13794 956.68569,-261.77535 957.79419,-262.04419 C 958.53781,-262.22454 962.94595,-262.70774 965.07544,-262.88794 C 967.13391,-263.06211 970.41868,-263.01226 972.32544,-262.23169 C 974.28003,-261.43153 980.20044,-258.70044 980.20044,-258.70044 C 980.20042,-258.70044 973.64051,-262.0092 972.79419,-262.41919 C 972.59182,-262.51724 972.22233,-262.62229 971.76294,-262.73169 C 972.97811,-263.29559 976.77302,-263.84599 979.51294,-264.20044 C 982.52385,-264.58996 982.83425,-264.59809 984.88794,-264.51294 C 986.83233,-264.43234 987.89457,-264.2597 988.07544,-264.23169 C 988.1946,-264.42255 988.45821,-264.977 989.01294,-265.10669 C 989.7572,-265.28069 994.16287,-265.75716 996.29419,-265.91919 C 998.06081,-266.05346 1000.7439,-266.0449 1002.6692,-265.54419 C 1002.9892,-265.46098 1003.2725,-265.34292 1003.5442,-265.23169 C 1005.4988,-264.43153 1011.4505,-261.66919 1011.4505,-261.66919 C 1011.4504,-261.66919 1004.8593,-265.0092 1004.013,-265.41919 C 1003.8106,-265.51724 1003.4411,-265.6223 1002.9817,-265.73169 C 1004.1968,-266.29559 1008.023,-266.81475 1010.763,-267.16919 C 1013.7739,-267.55872 1014.1155,-267.59809 1016.1692,-267.51294 C 1018.2889,-267.42506 1019.4817,-267.20044 1019.4817,-267.20044 C 1019.4817,-267.20044 1019.4033,-267.84946 1020.513,-268.10669 C 1021.2573,-268.27925 1025.6625,-268.73005 1027.7942,-268.88794 C 1029.8548,-269.04054 1033.1371,-268.98471 1035.0442,-268.20044 C 1036.9992,-267.39649 1042.9192,-264.70044 1042.9192,-264.70044 C 1042.9192,-264.70044 1036.3594,-267.97631 1035.513,-268.38794 C 1035.3105,-268.48638 1034.9412,-268.59016 1034.4817,-268.70044 C 1035.6971,-269.26198 1039.4936,-269.82822 1042.2317,-270.20044 C 1045.2407,-270.60949 1045.5544,-270.61602 1047.6067,-270.54419 C 1049.5498,-270.4762 1050.6139,-270.37934 1050.7942,-270.35669 C 1050.913,-270.55109 1051.1788,-271.0855 1051.7317,-271.23169 C 1052.4735,-271.42781 1056.8628,-272.06047 1058.9817,-272.32544 C 1060.7381,-272.54505 1063.387,-272.65775 1065.2942,-272.29419 C 1065.6111,-272.23378 1065.9,-272.10481 1066.1692,-272.01294 C 1068.1054,-271.35202 1074.013,-269.07544 1074.013,-269.07544 C 1074.0129,-269.07544 1067.4763,-271.88199 1066.638,-272.23169 C 1066.4375,-272.31532 1066.0618,-272.40502 1065.6067,-272.48169 C 1066.8104,-273.13215 1070.6258,-273.85364 1073.3255,-274.48169 C 1076.2922,-275.17189 1076.6144,-275.23676 1078.638,-275.35669 C 1080.7266,-275.48049 1081.9192,-275.38794 1081.9192,-275.38794 C 1081.9192,-275.38793 1081.8322,-276.01999 1082.9192,-276.41919 C 1083.6484,-276.68699 1087.9664,-277.75716 1090.0442,-278.23169 C 1092.0527,-278.69038 1095.2121,-279.26099 1097.0442,-278.85669 C 1098.9223,-278.44223 1110.6224,-275.84106 1110.6224,-275.84106 C 1110.6224,-275.84106 1098.2949,-278.86372 1097.4817,-279.10669 C 1097.2872,-279.16481 1096.9231,-279.21295 1096.4817,-279.23169 C 1097.6493,-280.03538 1099.9959,-280.91899 1102.5911,-281.93481 C 1104.2725,-282.59299 1103.5148,-282.3114 1105.367,-282.93841 C 1107.1206,-283.53207 1107.8524,-283.94912 1107.9974,-284.0514 C 1108.3435,-284.25791 1107.6414,-284.17328 1107.4532,-284.0938 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7333);enable-background:new" +           sodipodi:nodetypes="czscsssscssssscsssscssssscsssscssssscsssscssssscsssscssssscsssscssccsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscsssscscsscssscscsscc" /> +        <path +           id="path8175" +           d="M 1082.625,-275.125 C 1084.498,-274.73152 1087.1211,-273.97945 1088.6563,-273.15625 C 1090.1915,-272.33306 1091.4785,-272.10025 1094.0313,-270.65625 C 1096.5579,-269.22699 1098.8271,-268.64929 1101,-268.125 C 1103.3476,-267.55858 1106.4354,-267.40977 1109.8438,-266.9375 C 1108.7549,-267.77725 1103.2364,-268.10995 1101.4375,-268.5 C 1099.6386,-268.89006 1097.5434,-269.51616 1094.8438,-270.8125 C 1092.1441,-272.10884 1091.3494,-272.61146 1089.0313,-273.5 C 1086.7131,-274.38854 1085.0269,-274.88314 1082.625,-275.125 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7285);enable-background:new" /> +        <path +           id="path8177" +           d="M 1051.4688,-270 C 1053.3741,-269.42241 1055.9969,-268.38428 1057.5625,-267.40625 C 1059.1281,-266.42823 1060.4427,-266.04644 1063.0625,-264.28125 C 1065.6555,-262.53409 1068.0484,-261.57198 1070.3125,-260.6875 C 1072.7586,-259.73193 1075.9951,-259.03037 1079.7188,-257.625 C 1078.5292,-258.76284 1072.6557,-260.31175 1070.7813,-261 C 1068.9068,-261.68825 1066.6995,-262.5662 1063.9063,-264.28125 C 1061.113,-265.99629 1060.3327,-266.56515 1057.9688,-267.6875 C 1055.6047,-268.80984 1053.9121,-269.52205 1051.4688,-270 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7289);enable-background:new" /> +        <path +           id="path8179" +           d="M 1020.2188,-266.84375 C 1022.1307,-266.20564 1024.8,-265.08839 1026.375,-264.03125 C 1027.9501,-262.9741 1029.2706,-262.52258 1031.9063,-260.625 C 1034.5149,-258.74679 1036.9347,-257.59497 1039.2188,-256.5625 C 1041.6865,-255.44705 1044.9833,-254.3892 1048.75,-252.71875 C 1047.5467,-253.94128 1041.5472,-256.03298 1039.6563,-256.84375 C 1037.7653,-257.65452 1035.5914,-258.73754 1032.7813,-260.59375 C 1029.9711,-262.44995 1029.1595,-263.07068 1026.7813,-264.3125 C 1024.403,-265.5543 1022.6706,-266.28819 1020.2188,-266.84375 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7293);enable-background:new" /> +        <path +           id="path8181" +           d="M 1110.1719,-266.89063 C 1110.3227,-266.84207 1110.8599,-266.25963 1110.2813,-265.40625 C 1109.4712,-264.21166 1104.5764,-262.08196 1101.7188,-261.28125 C 1098.8739,-260.48413 1095.4287,-260.30351 1091.1563,-261.65625 C 1086.8547,-263.0182 1085.6866,-264.12497 1080.5,-265.96875 C 1085.164,-263.85358 1086.6953,-262.01642 1090.625,-260.625 C 1092.2457,-260.05113 1093.9921,-259.6854 1095.6875,-259.59375 C 1095.2424,-259.26812 1094.1572,-258.61045 1092.125,-258 C 1089.3295,-257.16031 1085.4759,-256.46622 1083.875,-256.375 C 1082.3604,-256.28868 1080.733,-256.88749 1080.4375,-257 C 1080.6042,-256.89692 1080.8107,-256.62266 1080.1875,-255.96875 C 1079.2882,-255.02512 1074.0401,-254.04575 1071.0625,-253.71875 C 1068.0982,-253.3932 1064.5409,-253.73471 1060.1563,-255.625 C 1056.1783,-257.33997 1054.8173,-258.54036 1050.75,-260.375 C 1050.75,-260.375 1050.75,-260.21875 1050.75,-260.21875 C 1054.3931,-258.12346 1056.034,-256.33548 1059.625,-254.65625 C 1061.3552,-253.84716 1063.2167,-253.24749 1065.0313,-252.9375 C 1064.4964,-252.65074 1063.4735,-252.22599 1061.5938,-251.90625 C 1058.7248,-251.41829 1054.7848,-251.09011 1053.1563,-251.15625 C 1052.3056,-251.19079 1051.4277,-251.34062 1050.75,-251.5625 C 1050.0652,-251.77738 1049.5603,-252.00717 1049.4375,-252.0625 C 1049.6069,-251.95529 1049.8686,-251.65962 1049.2188,-251.03125 C 1048.3091,-250.15163 1042.9727,-249.69487 1039.9688,-249.5625 C 1036.9783,-249.43071 1033.3799,-250.01313 1028.9688,-252.125 C 1024.5276,-254.25126 1023.3273,-255.5266 1018.0625,-257.90625 C 1022.7968,-255.30921 1024.349,-253.27715 1028.4063,-251.1875 C 1030.0796,-250.32565 1031.8915,-249.69325 1033.6563,-249.25 C 1033.193,-249.01668 1032.0669,-248.56186 1029.9688,-248.3125 C 1027.0825,-247.96952 1023.1342,-247.81962 1021.5,-247.9375 C 1019.9538,-248.049 1018.2688,-248.79446 1017.9688,-248.9375 C 1018.1379,-248.81721 1018.3826,-248.52702 1017.75,-247.9375 C 1016.8372,-247.08677 1011.5059,-246.67538 1008.5,-246.5625 C 1005.5075,-246.45013 1001.9103,-247.05293 997.5,-249.15625 C 993.49875,-251.06448 992.11197,-252.29408 988.03125,-254.25 C 988.03122,-254.25 988.03125,-254.09375 988.03125,-254.09375 C 991.68631,-251.88983 993.32546,-250.0412 996.9375,-248.1875 C 998.67779,-247.29435 1000.5745,-246.65923 1002.4063,-246.21875 C 1001.8663,-245.97045 1000.8282,-245.60342 998.9375,-245.375 C 996.05182,-245.02642 992.07145,-244.85405 990.4375,-244.96875 C 989.58405,-245.02865 988.71119,-245.22666 988.03125,-245.46875 C 987.34415,-245.70405 986.8419,-245.94101 986.71875,-246 C 986.88873,-245.88773 987.18323,-245.57775 986.53125,-244.96875 C 985.6186,-244.11625 980.25592,-243.67538 977.25,-243.5625 C 974.25754,-243.45013 970.65654,-244.09055 966.25,-246.15625 C 961.81347,-248.23603 960.60312,-249.48796 955.34375,-251.8125 C 960.07313,-249.26501 961.63449,-247.2347 965.6875,-245.1875 C 967.35905,-244.34317 969.17304,-243.72107 970.9375,-243.28125 C 970.47427,-243.04703 969.3478,-242.59718 967.25,-242.34375 C 964.36431,-241.99517 960.4138,-241.77423 958.78125,-241.875 C 957.23669,-241.97032 955.58094,-242.70385 955.28125,-242.84375 C 955.45024,-242.72522 955.66317,-242.4399 955.03125,-241.84375 C 954.11939,-240.98347 948.7846,-240.5135 945.78125,-240.375 C 942.7913,-240.2371 939.2138,-240.82568 934.8125,-242.84375 C 930.81942,-244.67464 929.44739,-245.87295 925.375,-247.75 C 925.37498,-247.75 925.375,-247.59375 925.375,-247.59375 C 929.02261,-245.46048 930.64533,-243.65888 934.25,-241.875 C 935.98675,-241.01549 937.85727,-240.42486 939.6875,-240 C 939.14803,-239.7471 938.13687,-239.35871 936.25,-239.09375 C 933.37022,-238.68939 929.41187,-238.44813 927.78125,-238.53125 C 926.92953,-238.57466 926.05355,-238.7398 925.375,-238.96875 C 924.68931,-239.19076 924.1854,-239.41214 924.0625,-239.46875 C 924.23209,-239.35976 924.4944,-239.0591 923.84375,-238.4375 C 922.93296,-237.56736 917.59354,-237.04598 914.59375,-236.875 C 911.60742,-236.70479 908.01994,-237.19077 903.625,-239.15625 C 899.20011,-241.13513 898.01904,-242.38444 892.78125,-244.53125 C 897.49122,-242.14358 899.05142,-240.14252 903.09375,-238.1875 C 904.7609,-237.38119 906.55418,-236.79092 908.3125,-236.40625 C 907.85087,-236.15755 906.7155,-235.694 904.625,-235.375 C 901.7494,-234.93624 897.8446,-234.6419 896.21875,-234.6875 C 894.68052,-234.73062 892.98595,-235.43272 892.6875,-235.5625 C 892.85583,-235.44968 893.09807,-235.14875 892.46875,-234.53125 C 891.56063,-233.64015 886.2658,-233.003 883.28125,-232.71875 C 880.31007,-232.43577 876.70783,-232.89455 872.34375,-234.65625 C 868.38441,-236.25456 867.0146,-237.45112 863,-238.96875 C 863.00003,-238.96875 863,-238.8125 863,-238.8125 C 866.5959,-237.00115 868.23831,-235.23017 871.8125,-233.65625 C 873.53457,-232.8979 875.39998,-232.3673 877.21875,-232.03125 C 876.68266,-231.75217 875.65217,-231.34362 873.78125,-230.96875 C 870.92586,-230.39665 866.99183,-229.94936 865.375,-229.9375 C 864.53049,-229.93129 863.66892,-230.01844 863,-230.1875 C 862.32409,-230.34901 861.83991,-230.51673 861.71875,-230.5625 C 861.88597,-230.46848 862.14142,-230.17902 861.5,-229.5 C 860.60213,-228.54948 855.31352,-227.58292 852.375,-227.0625 C 849.44966,-226.54441 845.94285,-226.68826 841.65625,-228.09375 C 837.34045,-229.50882 836.18348,-230.62369 831.09375,-232.0625 C 835.6706,-230.31149 837.1823,-228.50244 841.125,-227.0625 C 842.75108,-226.46861 844.49385,-226.10685 846.21875,-225.90625 C 845.7659,-225.60923 844.66397,-225.02286 842.625,-224.4375 C 839.82028,-223.63233 835.98614,-222.86167 834.40625,-222.6875 C 832.9115,-222.5227 831.29002,-223.00431 831,-223.09375 C 831.16356,-223.00368 831.39278,-222.73382 830.78125,-222.03125 C 829.89878,-221.0174 824.73673,-219.6596 821.84375,-218.96875 C 818.96373,-218.28097 815.50815,-218.20873 811.28125,-219.40625 C 807.4464,-220.4927 806.10867,-221.47862 802.21875,-222.53125 C 802.21874,-222.53125 802.21875,-222.375 802.21875,-222.375 C 805.70293,-220.98015 807.28816,-219.4556 810.75,-218.34375 C 812.41793,-217.80803 814.20578,-217.55701 815.96875,-217.46875 C 815.44911,-217.11663 814.46836,-216.55423 812.65625,-215.9375 C 809.89059,-214.99625 806.06601,-214.00213 804.5,-213.78125 C 803.68206,-213.66586 802.8669,-213.65842 802.21875,-213.75 C 801.56379,-213.83321 801.08615,-213.96827 800.96875,-214 C 801.13079,-213.92536 801.40274,-213.65956 800.78125,-212.90625 C 799.91125,-211.85172 794.77162,-210.247 791.90625,-209.46875 C 789.05372,-208.69399 785.64713,-208.51055 781.46875,-209.5625 C 777.26192,-210.62163 776.11206,-211.60416 771.125,-212.71875 C 775.60954,-211.25929 777.09435,-209.58352 780.9375,-208.46875 C 782.52254,-208.00898 784.22429,-207.8305 785.90625,-207.78125 C 785.46468,-207.44449 784.39374,-206.75352 782.40625,-206 C 779.67232,-204.96351 775.95427,-203.83731 774.40625,-203.5625 C 772.94163,-203.30248 771.34667,-203.67904 771.0625,-203.75 C 771.22275,-203.67035 771.44294,-203.42902 770.84375,-202.6875 C 769.97909,-201.61744 764.92723,-199.86935 762.09375,-199 C 759.27295,-198.13453 755.88625,-197.84369 751.75,-198.78125 C 747.99741,-199.63186 746.70215,-200.49772 742.875,-201.375 C 742.875,-201.375 742.875,-201.21875 742.875,-201.21875 C 746.30296,-199.98096 747.86241,-198.58645 751.25,-197.6875 C 752.88216,-197.25436 754.61704,-197.10449 756.34375,-197.125 C 755.83482,-196.74083 754.867,-196.10318 753.09375,-195.375 C 750.38741,-194.26366 746.65742,-193.06719 745.125,-192.75 C 744.3246,-192.58431 743.51269,-192.53138 742.875,-192.59375 C 742.875,-192.59375 742.875,-192.07823 742.875,-191.67146 C 742.875,-191.40639 742.875,-191.1875 742.875,-191.1875 C 743.10145,-191.33218 743.32391,-191.46011 743.59375,-191.5625 C 744.67427,-191.97248 745.76536,-191.77827 749.59375,-193.25 C 753.42218,-194.72174 754.81787,-195.25498 755.5,-195.65625 C 756.1796,-196.05603 757.11165,-196.53562 757.71875,-197.1875 C 759.5456,-197.32525 761.2895,-197.68073 762.65625,-198.1875 C 765.62437,-199.28802 767.53162,-199.99369 769.4375,-200.65625 C 771.34336,-201.31879 771.79159,-202.07112 772.84375,-202.4375 C 773.9353,-202.81761 775.03886,-202.60288 778.90625,-203.96875 C 782.7737,-205.33461 784.18941,-205.79583 784.875,-206.1875 C 785.57609,-206.58802 786.57581,-207.12048 787.1875,-207.78125 C 789.1583,-207.83591 791.00435,-208.16588 792.46875,-208.65625 C 795.47023,-209.66133 797.3949,-210.27796 799.3125,-210.90625 C 800.8511,-211.41035 801.48652,-211.95302 802.21875,-212.34375 C 802.44891,-212.47806 802.69449,-212.59748 802.96875,-212.6875 C 804.06698,-213.04798 805.1502,-212.76887 809.0625,-214 C 812.97483,-215.23113 814.42855,-215.67295 815.125,-216.03125 C 815.81888,-216.38822 816.75515,-216.82386 817.375,-217.4375 C 819.24021,-217.46016 821.01081,-217.70433 822.40625,-218.125 C 825.43668,-219.03854 827.39863,-219.5551 829.34375,-220.09375 C 831.28886,-220.63239 831.76993,-221.35827 832.84375,-221.65625 C 833.95776,-221.9654 835.06369,-221.64886 839.03125,-222.6875 C 842.99886,-223.72613 844.44883,-224.12023 845.15625,-224.4375 C 845.89112,-224.76709 846.97008,-225.19122 847.59375,-225.8125 C 849.59149,-225.6965 851.45118,-225.83259 852.9375,-226.1875 C 856.01561,-226.9225 858.02094,-227.28844 860,-227.6875 C 861.58792,-228.00768 862.24429,-228.47805 863,-228.78125 C 863.23757,-228.88805 863.46695,-228.97401 863.75,-229.03125 C 864.88347,-229.26044 866.05448,-228.82232 870.09375,-229.53125 C 874.13308,-230.24018 875.594,-230.45834 876.3125,-230.71875 C 877.02836,-230.97819 878.01678,-231.28599 878.65625,-231.8125 C 880.58052,-231.57301 882.40413,-231.58797 883.84375,-231.8125 C 886.97008,-232.30012 888.9983,-232.51317 891,-232.78125 C 893.00171,-233.04932 893.48869,-233.72639 894.59375,-233.875 C 895.74014,-234.02918 896.86967,-233.57343 900.9375,-234.09375 C 905.00534,-234.61407 906.49763,-234.78948 907.21875,-235.03125 C 907.95585,-235.27839 909.01684,-235.61748 909.65625,-236.15625 C 911.70632,-235.82072 913.63003,-235.75829 915.15625,-235.9375 C 918.29856,-236.30646 920.33619,-236.49686 922.34375,-236.71875 C 923.95451,-236.89677 924.60842,-237.32695 925.375,-237.5625 C 925.61594,-237.64802 925.86912,-237.7181 926.15625,-237.75 C 927.30603,-237.87772 928.45754,-237.40335 932.53125,-237.875 C 936.60499,-238.34665 938.09034,-238.4856 938.8125,-238.71875 C 939.53196,-238.95102 940.51274,-239.19221 941.15625,-239.6875 C 943.09262,-239.35404 944.92631,-239.28326 946.375,-239.4375 C 949.52102,-239.77245 951.55256,-239.95609 953.5625,-240.15625 C 955.57246,-240.35639 956.04664,-240.98264 957.15625,-241.09375 C 958.30739,-241.20903 959.45268,-240.72869 963.53125,-241.15625 C 967.60986,-241.58381 969.12011,-241.71834 969.84375,-241.9375 C 970.5829,-242.16136 971.63947,-242.45075 972.28125,-242.96875 C 974.33835,-242.57008 976.28312,-242.47535 977.8125,-242.625 C 980.96123,-242.9331 982.98834,-243.09825 985,-243.28125 C 986.61407,-243.42807 987.2631,-243.8418 988.03125,-244.0625 C 988.27267,-244.14336 988.52478,-244.19241 988.8125,-244.21875 C 989.96461,-244.3242 991.10546,-243.826 995.1875,-244.21875 C 999.26958,-244.6115 1000.7764,-244.74959 1001.5,-244.96875 C 1002.2209,-245.18708 1003.1997,-245.41645 1003.8438,-245.90625 C 1005.7818,-245.55626 1007.6126,-245.45187 1009.0625,-245.59375 C 1012.2112,-245.90185 1014.2383,-246.067 1016.25,-246.25 C 1018.2616,-246.43299 1018.7642,-247.08802 1019.875,-247.1875 C 1021.0273,-247.29073 1022.1672,-246.80267 1026.25,-247.1875 C 1030.3329,-247.57232 1031.8387,-247.6885 1032.5625,-247.90625 C 1033.3018,-248.12868 1034.3581,-248.42074 1035,-248.9375 C 1037.0574,-248.53573 1039.0029,-248.43417 1040.5313,-248.59375 C 1043.6779,-248.92227 1045.7084,-249.11645 1047.7188,-249.3125 C 1049.3318,-249.46979 1049.9844,-249.94398 1050.75,-250.1875 C 1050.9907,-250.27554 1051.2132,-250.30887 1051.5,-250.34375 C 1052.6483,-250.48345 1053.8167,-250.00384 1057.875,-250.59375 C 1061.9333,-251.18367 1063.4368,-251.37089 1064.1563,-251.625 C 1064.873,-251.87816 1065.8308,-252.18307 1066.4688,-252.71875 C 1068.3885,-252.50681 1070.1887,-252.56734 1071.625,-252.8125 C 1074.7441,-253.3449 1076.7366,-253.74111 1078.7188,-254.125 C 1080.7009,-254.50887 1081.1931,-255.16465 1082.2813,-255.40625 C 1083.4101,-255.65691 1084.5516,-255.28996 1088.5313,-256.28125 C 1092.5109,-257.27253 1093.9609,-257.70055 1094.6563,-258.0625 C 1095.3786,-258.43851 1096.4182,-258.93308 1097.0313,-259.59375 C 1098.9943,-259.6058 1100.825,-259.8848 1102.25,-260.4375 C 1105.2012,-261.58211 1107.1232,-262.30692 1108.9375,-263.1875 C 1110.3932,-263.89403 1111.2723,-264.87391 1111.4844,-265.17188 C 1111.6966,-265.46984 1111.5962,-265.91718 1111.6223,-265.93863 C 1111.6652,-265.97387 1111.9416,-266.0236 1112.1013,-266.36707 C 1112.9602,-268.21415 1114.4223,-272.01166 1114.5365,-272.69652 C 1114.6502,-273.37868 1114.7003,-274.04426 1114.751,-274.44149 C 1114.7804,-274.67101 1114.6043,-275.30693 1114.6264,-275.36553 C 1114.6573,-275.44759 1114.9309,-275.63081 1114.9863,-275.88024 C 1115.2526,-277.07857 1115.0752,-278.07153 1114.8612,-279.48917 C 1114.6472,-280.90681 1113.8775,-284.11131 1113.2243,-284.96543 C 1112.5654,-285.82715 1112.0014,-285.9766 1111.4764,-285.96609 C 1111.2678,-285.69633 1111.6132,-285.703 1111.639,-285.65348 C 1112.3196,-285.60269 1112.573,-285.28484 1113.0582,-284.75686 C 1113.5434,-284.22888 1114.28,-280.90569 1114.4166,-279.4553 C 1114.5532,-278.00491 1114.6066,-276.5951 1114.3286,-275.98666 C 1114.0505,-275.37821 1113.6054,-275.46963 1113.313,-275.40375 C 1113.844,-275.21786 1113.9828,-275.27892 1114.0444,-274.43446 C 1114.1037,-273.62108 1113.9112,-272.79477 1113.5246,-271.62884 C 1113.1334,-270.44883 1111.6794,-267.27886 1111.2389,-267.03007 C 1110.7866,-266.77456 1110.5075,-266.75969 1110.1719,-266.89063 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7337);enable-background:new" +           sodipodi:nodetypes="cssscscsscsssccscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssscscssssssscscsscsssccscsscscssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsssssscssssscsszsszssszzcczzzczzzc" /> +        <path +           id="path8183" +           d="M 988.75,-263.84375 C 990.66161,-263.20935 993.30027,-262.08534 994.875,-261.03125 C 996.44977,-259.97716 997.7711,-259.54873 1000.4063,-257.65625 C 1003.0145,-255.78311 1005.4332,-254.64103 1007.7188,-253.59375 C 1010.1881,-252.46228 1013.4709,-251.43901 1017.25,-249.65625 C 1016.0428,-250.91465 1010.111,-253.0207 1008.2188,-253.84375 C 1006.3266,-254.66679 1004.0908,-255.77424 1001.2813,-257.625 C 998.47169,-259.47575 997.65906,-260.10654 995.28125,-261.34375 C 992.90343,-262.58094 991.20137,-263.29295 988.75,-263.84375 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7297);enable-background:new" /> +        <path +           id="path8185" +           d="M 957.5,-260.78125 C 959.41,-260.16315 962.08288,-259.07191 963.65625,-258.03125 C 965.22964,-256.99059 966.55233,-256.54873 969.1875,-254.65625 C 971.79573,-252.7831 974.21442,-251.64104 976.5,-250.59375 C 978.96931,-249.46228 982.25213,-248.439 986.03125,-246.65625 C 984.82397,-247.91465 978.82971,-250.05195 976.9375,-250.875 C 975.04533,-251.69804 972.84084,-252.8055 970.03125,-254.65625 C 967.22167,-256.507 966.4383,-257.09557 964.0625,-258.3125 C 961.68672,-259.52941 959.94929,-260.25135 957.5,-260.78125 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7301);enable-background:new" /> +        <path +           id="path8187" +           d="M 926.09375,-257.375 C 928.00147,-256.77755 930.64723,-255.71116 932.21875,-254.6875 C 933.79025,-253.66385 935.08897,-253.24779 937.71875,-251.40625 C 940.32166,-249.58352 942.74762,-248.43405 945.03125,-247.40625 C 947.49845,-246.29584 950.7866,-245.31302 954.5625,-243.5625 C 953.35627,-244.8106 947.3906,-246.88059 945.5,-247.6875 C 943.60942,-248.4944 941.39758,-249.57854 938.59375,-251.375 C 935.7899,-253.17144 934.96671,-253.77751 932.59375,-254.96875 C 930.22078,-256.15999 928.54013,-256.87158 926.09375,-257.375 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7305);enable-background:new" /> +        <path +           id="path8189" +           d="M 894.90625,-253.5625 C 896.80838,-253.00895 899.49326,-251.97363 901.0625,-250.96875 C 902.63173,-249.96388 903.93651,-249.56011 906.5625,-247.75 C 909.16162,-245.95836 911.56284,-244.87811 913.84375,-243.875 C 916.30803,-242.79126 919.60359,-241.83471 923.375,-240.125 C 922.1702,-241.36007 916.20084,-243.36978 914.3125,-244.15625 C 912.42418,-244.94272 910.2373,-245.98705 907.4375,-247.75 C 904.63773,-249.51294 903.83831,-250.11836 901.46875,-251.28125 C 899.09918,-252.44413 897.3455,-253.11537 894.90625,-253.5625 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7309);enable-background:new" /> +        <path +           id="path8191" +           d="M 863.71875,-248.65625 C 865.59937,-248.22716 868.22302,-247.27587 869.78125,-246.34375 C 871.33948,-245.41164 872.63358,-245.08599 875.25,-243.34375 C 877.83971,-241.61931 880.23067,-240.63573 882.5,-239.71875 C 884.95176,-238.72806 888.23959,-237.84168 892,-236.21875 C 890.79869,-237.42609 884.84751,-239.28484 882.96875,-240 C 881.09,-240.71517 878.88335,-241.68442 876.09375,-243.375 C 873.30412,-245.06557 872.50914,-245.60322 870.15625,-246.65625 C 867.80333,-247.70926 866.13041,-248.36873 863.71875,-248.65625 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7313);enable-background:new" /> +        <path +           id="path8193" +           d="M 833.15625,-241.375 C 835.00461,-241.07856 837.6257,-240.39868 839.15625,-239.59375 C 840.68683,-238.78882 841.96999,-238.53802 844.53125,-237.0625 C 847.06629,-235.60204 849.42193,-234.73741 851.65625,-234 C 854.07024,-233.20332 857.31336,-232.53311 861.03125,-231.15625 C 859.84354,-232.28498 853.94353,-233.746 852.09375,-234.3125 C 850.24398,-234.879 848.09033,-235.68642 845.34375,-237.15625 C 842.59718,-238.62608 841.84239,-239.07653 839.53125,-239.9375 C 837.2201,-240.79845 835.52654,-241.25759 833.15625,-241.375 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7317);enable-background:new" /> +        <path +           id="path8195" +           d="M 802.90625,-232.3125 C 804.72845,-232.10123 807.27201,-231.51193 808.78125,-230.78125 C 810.2905,-230.05059 811.53693,-229.85127 814.0625,-228.5 C 816.56226,-227.16254 818.89404,-226.45157 821.09375,-225.84375 C 823.47028,-225.18708 826.65839,-224.77087 830.3125,-223.65625 C 829.14515,-224.70121 823.38362,-225.75954 821.5625,-226.21875 C 819.74139,-226.67796 817.61025,-227.34571 814.90625,-228.65625 C 812.20222,-229.96677 811.43519,-230.37615 809.15625,-231.125 C 806.8773,-231.87383 805.243,-232.30431 802.90625,-232.3125 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7321);enable-background:new" /> +        <path +           id="path8197" +           d="M 773.1875,-222.1875 C 774.99859,-222.0088 777.50809,-221.52244 779,-220.84375 C 780.49194,-220.16506 781.7534,-220.04553 784.25,-218.78125 C 786.72107,-217.52987 789.04005,-216.88511 791.21875,-216.34375 C 793.57262,-215.75887 796.71009,-215.44623 800.3125,-214.5 C 799.16166,-215.49116 793.45999,-216.2833 791.65625,-216.6875 C 789.85253,-217.0917 787.74072,-217.70866 785.0625,-218.9375 C 782.38432,-220.16634 781.65905,-220.54839 779.40625,-221.21875 C 777.15346,-221.88909 775.50998,-222.22107 773.1875,-222.1875 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7329);enable-background:new" /> +        <path +           id="path8199" +           d="M 743.5625,-211.1875 C 745.35531,-211.05839 747.83563,-210.63785 749.3125,-210 C 750.7894,-209.36215 752.0286,-209.25844 754.5,-208.0625 C 756.94618,-206.87878 759.22054,-206.31584 761.375,-205.84375 C 763.70267,-205.33372 766.7946,-205.16311 770.375,-204.28125 C 769.23121,-205.25185 763.62741,-205.8719 761.84375,-206.21875 C 760.06008,-206.56559 757.9609,-207.10631 755.3125,-208.25 C 752.66409,-209.39368 751.91755,-209.76631 749.6875,-210.375 C 747.45742,-210.98368 745.86156,-211.28466 743.5625,-211.1875 z" +           style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;filter:url(#filter7325);enable-background:new" /> +      </g> +    </g> +    <path +       style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +       d="M 863.87812,475.6679 C 865.52024,472.4499 867.39593,469.93261 868.73948,465.81892 C 869.5382,462.16103 872.05152,463.78819 875.99995,457.42202 C 877.40188,455.18252 881.47648,457.81338 884.96505,455.02291 C 886.23577,454.21972 887.84993,454.6186 889.44761,454.95978 C 893.213,456.27874 895.27337,458.66333 897.78137,460.76815 C 903.92043,466.73838 918.31551,468.71142 921.26741,467.08161 C 922.70146,464.17687 929.14869,461.67273 933.64178,455.96993 C 934.38989,454.84726 945.37114,447.22547 948.28899,449.40394" +       id="path8201" +       sodipodi:nodetypes="ccccccccc" /> +    <path +       style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +       d="M 888.50059,465.25071 C 895.864,462.01774 902.31149,456.34231 909.20872,451.86619 C 912.51929,449.89665 916.07855,455.0822 920.00472,455.46485 C 922.30245,455.24672 923.71762,456.66744 925.68683,457.10635 C 930.84319,458.42414 928.08476,460.97123 935.66209,463.54607 C 941.8177,465.26647 944.56949,456.7476 950.56184,456.22247 C 955.43923,455.71948 958.66076,455.90644 962.17859,455.96993 C 966.10555,456.10882 966.25714,452.47233 968.23951,450.66663 C 971.22007,447.86141 975.39512,448.81691 978.38436,445.92573 C 979.4019,444.54105 980.33894,442.91488 981.11895,440.81764 C 982.00096,438.8173 984.15901,441.12362 985.91718,442.08033" +       id="path8203" +       sodipodi:nodetypes="ccccccccccc" /> +  </g> +  <g +     inkscape:groupmode="layer" +     id="layer15" +     inkscape:label="Feet" +     style="display:inline"> +    <path +       style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9048);enable-background:accumulate" +       d="M 403.27922,1056.3058 L 459.84776,1013.8794 L 531.97265,1028.0215 L 485.30361,1080.3474 L 431.56349,1087.4185 L 403.27922,1056.3058 z" +       id="path8994" /> +    <path +       style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +       d="M 542.27183,1060.5719 C 540.86456,1079.3731 541.12693,1093.3229 544.35357,1109.8752 C 547.58023,1126.4275 560.75966,1155.7825 564.68798,1173.0589 C 568.61419,1190.326 567.38211,1211.3686 552.22854,1224.2072 C 536.91093,1237.1846 510.17726,1245.8061 484.39623,1239.9409 C 458.61518,1234.0757 414.84716,1190.7175 395.80604,1169.7126 C 376.6939,1148.6293 332.04518,1075.862 317.86751,1045.4368 C 303.68984,1015.0117 305.2079,1008.7182 309.74779,999.90708 C 300.38107,975.38658 297.33408,949.84027 276.03534,924.33044 C 306.36081,927.44488 319.91562,951.28677 336.16102,971.47019 C 330.63113,923.39416 318.10631,907.05369 307.78707,880.74589 C 337.78137,886.82754 358.36643,912.61828 371.76686,953.45839 C 381.32101,949.54048 390.00462,944.08545 401.95427,944.39719 C 390.65677,902.70139 384.00481,874.48135 365.26702,843.32725 C 418.70898,848.99758 448.92404,923.96657 444.23844,931.28805 C 454.21641,929.04406 463.24409,924.75767 474.67497,925.63638 C 463.426,887.28936 453.62716,848.76848 471.01526,806.98819 C 471.01526,806.98819 519.30204,872.42507 525.40492,892.79397 C 531.50779,913.16287 526.92373,931.49448 526.92373,931.49448 C 526.92373,931.49448 543.8833,962.57978 547.21765,982.58862 C 550.59075,1002.83 543.68496,1041.6919 542.27183,1060.5719 z" +       id="path4189" +       sodipodi:nodetypes="czzzzzzcccccccccczczz" /> +    <path +       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3587);enable-background:accumulate" +       d="M 719.5,738.69519 L 737.81177,754.12715 L 782.2228,738.73894 L 805.5,713.19519 L 816.96397,732.41584 L 847.63558,745.19938 L 872.73295,750.92775 L 892,723.19519 L 908.02309,747.02126 L 947,752.19519 L 957.24541,745.99667 L 964.00012,754.69487 L 989.5,765.69519 L 991.5,725.19519 L 955.94866,710.6576 L 923.45591,689.1305 L 883.0038,677.66492 L 861.69668,662.13148 L 840,685.19519 L 755.02878,638.61208 L 722,676.69519 L 719.5,738.69519 z" +       id="path4191" +       sodipodi:nodetypes="cccccccccccccccccccccc" +       clip-path="url(#clipPath3631)" +       transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,995.28646,23.53493)" /> +    <path +       style="opacity:0.58775509;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter3898);enable-background:new" +       d="M 584,696.5 L 577.4375,713.65625 C 577.4375,713.65625 569.62598,734.02113 561.75,757.3125 C 557.81201,768.95818 553.86698,781.35395 550.8125,792.4375 C 547.75802,803.52105 545.47664,812.81736 545.3125,820.71875 C 544.91443,839.88071 551.05903,855.60705 554.25,862.46875 C 553.47847,866.02398 552.25863,871.92307 550.90625,880.5625 C 548.98583,892.83071 547.18798,907.71691 548.53125,920.4375 C 549.91334,933.52585 555.34347,948.62515 561.125,963.46875 C 566.90653,978.31235 573.17935,992.69586 576.34375,1001.5 C 582.97581,1019.9519 586.33671,1033.0763 587.65625,1050 C 588.2376,1057.4561 587.41398,1070.336 586.40625,1083.375 C 585.39852,1096.414 584.21964,1109.6764 584.71875,1120.3438 C 585.70786,1141.4836 594.04673,1167.1785 618.09375,1178.2812 C 640.86858,1188.7966 673.42057,1189.9834 701.53125,1174.8438 C 717.69117,1166.1404 731.60759,1147.7462 744.90625,1127.9375 C 758.20491,1108.1288 769.87542,1086.8841 776.84375,1073.0312 C 792.19667,1042.51 816.23728,957.56702 822.46875,920.3125 C 825.48734,902.26597 826.39041,891.24695 825.09375,882.28125 C 824.11522,875.51521 821.26556,870.13385 818.21875,866.0625 C 820.26149,838.55459 817.48668,814.69372 830.1875,786.65625 L 840.75,763.375 L 816.9375,772.6875 C 799.44775,779.52503 788.03586,791.73286 780.34375,804.75 C 780.02124,805.29577 779.78061,805.85776 779.46875,806.40625 C 779.69078,783.89104 783.87659,768.76866 786.0625,747.71875 L 788.03125,728.71875 L 771,737.375 C 740.40551,752.93071 725.30511,785.56821 721.28125,827.59375 C 717.03593,826.96828 712.44985,826.5741 707.46875,826.75 C 707.17726,787.56964 707.07246,759.71315 716.0625,727.375 L 721.65625,707.25 L 702.21875,714.90625 C 671.30938,727.11019 654.35921,756.83698 645.59375,783.28125 C 641.21102,796.50339 638.84793,809.08246 638,819.21875 C 637.76797,821.99248 637.68894,824.53007 637.6875,826.9375 C 634.44563,826.90109 631.26698,827.07339 627.625,827.4375 C 627.66662,788.43277 624.14076,747.68335 595.34375,710.9375 L 584,696.5 z M 589.8125,740.3125 C 606.61941,770.95633 607.28701,804.27978 606.75,840.0625 L 606.53125,855.125 L 618.56618,848.58579 C 627.22823,845.45277 638.12676,848.35827 650.5,847.75 L 665.17465,857.1066 L 658.84375,831.3125 C 658.7541,831.08253 658.62329,830.89581 658.59375,830.59375 C 658.39424,828.55389 658.37143,825.12068 658.71875,820.96875 C 659.41339,812.66489 661.50832,801.38351 665.34375,789.8125 C 670.49907,774.25956 678.83176,758.62002 690.46875,747.28125 C 685.78494,775.91923 687.25316,807.54059 687.45711,843.08639 L 684.69118,856.34803 L 700.1875,848.75 C 709.2169,845.99229 717.37647,848.40004 729.46875,849.84375 L 742.71507,859.28798 L 741.09375,840 C 742.54168,809.02823 749.31524,786.32192 761.8125,771.125 C 758.82562,790.90384 756.38207,812.9098 762.125,849.46875 L 763.19052,855.84193 L 760.25237,867.35878 L 770.86948,859.1906 L 780.05921,869.41258 L 778.51093,858.94898 L 781.9375,852 C 787.63852,838.78851 792.11032,825.78663 798.28125,815.34375 C 799.24111,813.71941 800.31278,812.27939 801.34375,810.78125 C 797.66309,831.9366 798.91659,850.9894 797.25,868.5625 L 792.56986,876.36948 L 799.96875,876.59375 C 803.1888,880.07736 803.83625,880.44443 804.53125,885.25 C 805.22625,890.05557 804.84987,899.65035 801.96875,916.875 C 796.40076,950.16292 770.12313,994.71481 758.22835,1018.3614 C 751.62344,1031.4918 739.70002,1075.8473 727.105,1094.6079 C 714.50998,1113.3684 698.57363,1134.3752 689.93296,1139.0288 C 668.44244,1150.603 645.37702,1164.5347 629.31407,1157.1183 C 614.93921,1150.4813 606.27438,1135.9256 605.5,1119.375 C 605.11689,1111.187 606.11279,1098.0658 607.125,1084.9688 C 608.13721,1071.8717 618.41391,1062.398 622.54839,1048.4062 C 627.92068,1030.2254 621.10152,1011.8118 610.04839,994.46875 C 603.56184,984.29097 586.07159,970.21085 580.5,955.90625 C 574.92841,941.60165 570.13249,926.9031 569.21875,918.25 C 568.29254,909.47887 569.64125,895.22498 571.4375,883.75 C 573.23375,872.27503 575.28125,863.46875 575.28125,863.46875 L 584.70403,859.85355 L 574.21875,855.96875 C 574.21875,855.96875 565.71986,840.65865 566.125,821.15625 C 566.19611,817.73309 567.96126,808.4282 570.84375,797.96875 C 573.72624,787.5093 577.60841,775.41604 581.46875,764 C 584.51314,754.99692 587.24938,747.39655 589.8125,740.3125 z" +       id="path4193" +       clip-path="url(#clipPath3677)" +       sodipodi:nodetypes="ccssscsssssssssssssccccscccccccccsscccccccccccssscccccccccccccccsccccssssssssssssscccsssc" +       transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,822.28931,10.93589)" /> +    <g +       id="g3617" +       clip-path="url(#clipPath3622)" +       transform="translate(276,136)"> +      <path +         transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,-52.200498,74.09707)" +         id="path4195" +         d="M -15.66751,843.48852 L -65.16499,827.93217 L -92.03504,880.25807 L -51.02285,925.51291 L -1.52538,887.32914 L -15.66751,843.48852 z" +         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9024);enable-background:accumulate" /> +      <path +         sodipodi:nodetypes="ccccccccccccc" +         transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,-46.92842,75.511284)" +         id="path4197" +         d="M 118.70648,859.93048 L 63.552152,813.26144 L 19.711532,850.03099 L 53.652662,903.7711 L 40.055848,989.23313 L 0.61048221,1017.5253 L -40.401718,1028.839 L -43.230138,1075.508 L 13.338402,1100.9639 L 32.282389,1031.3139 L 55.738939,972.45727 L 102.08648,899.84236 L 118.70648,859.93048 z" +         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9020);enable-background:accumulate" /> +    </g> +    <path +       style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9044);enable-background:accumulate" +       d="M -70.82184,932.58397 L -10.01066,905.71392 L 90.3985,936.82662 L 26.75889,967.93931 L -55.26549,950.96875 L -70.82184,932.58397 z" +       id="path4199" +       transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,229.07158,211.51128)" /> +    <path +       style="opacity:0.58775509;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter4105);enable-background:new" +       d="M 583.0625,715.75 C 570.95641,750.19974 556.348,784.28333 551.3125,820.59375 C 550.48042,835.52242 555.90165,849.75318 560.15625,863.65625 C 554.24001,890.85751 550.01944,920.5562 561.3125,946.78125 C 574.82967,984.9421 596.31397,1022.4634 593.73529,1064.2495 C 592.78699,1093.5437 584.72085,1125.2436 599.125,1152.5312 C 609.32364,1171.866 632.26456,1179.8429 653.09285,1180.1988 C 680.95504,1181.3729 709.55546,1168.5772 725.09375,1144.9375 C 747.68924,1115.5658 766.89426,1083.4402 780.3324,1048.8777 C 797.22293,1003.3717 810.0042,956.31698 818.26642,908.4788 C 820.09082,895.53774 821.3675,881.00895 813.6875,869.65625 C 810.25635,862.31993 813.72957,854.09611 813.00293,846.34648 C 813.67693,821.35182 817.01525,795.68272 829.65625,773.75 C 811.92312,780.1946 794.58357,790.30971 785.65318,807.61425 C 781.7181,814.3238 778.04836,821.18838 774.28125,828 C 770.73126,797.98592 778.00088,768.35172 781.0625,738.71875 C 760.89646,747.77338 744.18578,764.37397 736.88755,785.40075 C 730.58292,800.98078 728.08533,817.71793 726.625,834.4375 C 718.37166,832.91825 709.94053,832.33595 701.5625,832.9375 C 700.59942,794.23963 701.09554,753.53035 712.53125,717.03125 C 693.85012,723.24901 677.36504,735.76676 666.90322,752.41848 C 653.05068,773.29827 645.64182,798.17243 643.84375,823.03125 C 644.42909,827.35579 643.78249,834.87134 637.5,832.90625 C 632.16882,832.9238 626.87092,833.58508 621.5625,834 C 622.71034,794.61852 618.22106,752.3718 594.5,719.78125 C 591.43929,716.14408 588.86315,712.09687 585.875,708.4375 C 584.9375,710.875 584,713.3125 583.0625,715.75 z M 590.8125,729.59375 C 609.37777,758.89004 613.295,794.41387 612.9375,828.46875 C 613.14159,833.64401 612.42094,840.29795 613.0625,844.53125 C 625.38106,838.4285 639.80162,842.09135 652.84375,842.34375 C 655.16087,843.567 656.03585,843.99618 654.75,840.9375 C 650.58545,826.98465 652.90172,812.3245 656.55504,798.52986 C 662.92191,772.23922 677.18332,747.44188 699.375,731.5 C 690.75791,768.73706 693.65842,808.06161 693.28125,845.46875 C 705.53469,838.55885 720.56004,842.02262 733.3125,845.21875 C 736.70472,848.75355 735.60185,844.48927 735.5,841.40625 C 735.01691,820.03567 739.63133,798.33662 749.1875,779.25 C 755.15016,768.56273 763.43088,759.44621 771.625,750.375 C 763.75344,784.2131 762.4221,819.71093 768.90625,853.875 C 770.6311,852.46382 773.51306,853.42086 774.5625,853.5 C 784.24619,832.26318 790.91362,808.11938 809.45266,792.75815 C 811.32595,792.38693 808.00448,801.2831 807.96875,804.65625 C 804.43387,826.50206 800.79359,848.79859 799.18454,870.87536 C 790.40075,873.21707 802.03289,873.1989 802.65329,874.93786 C 810.5764,885.50366 807.31628,899.34258 806.28494,911.2912 C 799.22089,956.32475 784.14263,998.65314 770.33139,1041.971 C 758.25663,1074.9203 742.95719,1100.8235 722.44331,1129.1725 C 711.49074,1142.7239 699.19859,1157.0238 681.59956,1161.6725 C 661.44355,1167.9138 637.3928,1172.5494 619,1161.7188 C 601.71034,1149.3774 597.97607,1126.0099 599.73774,1106.0324 C 599.78653,1090.2062 604.6766,1077.5203 604.14834,1062.5406 C 603.6101,1047.2777 601.85699,1031.9759 597.60573,1015.6743 C 593.35447,999.37268 588.56248,990.75636 581.48667,974.10092 C 574.24556,957.05636 566.41652,937.35229 563.28125,917.8125 C 561.53177,899.18536 566.17296,880.68988 569.0625,862.5625 C 572.35873,859.72554 567.46451,857.36591 566.75,854.375 C 559.14887,837.35992 558.34253,817.6001 564.00766,799.81502 C 571.13786,774.74272 579.76853,750.18261 588.6875,725.6875 C 589.39583,726.98958 590.10417,728.29167 590.8125,729.59375 z" +       id="path4201" +       sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccczzzcccccc" +       clip-path="url(#clipPath4177)" +       transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,822.28931,10.93589)" /> +    <path +       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4130);enable-background:accumulate" +       d="M 735.05635,733.03834 L 737.81177,754.12715 L 782.2228,738.73894 L 787.07343,716.34919 L 783.13726,694.29697 L 760.68563,657.70396 L 752.40559,688.0089 L 735.05635,733.03834 z" +       id="path4203" +       sodipodi:nodetypes="cccccccc" +       clip-path="url(#clipPath3631)" +       transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,995.28646,23.53493)" /> +    <path +       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4141);enable-background:accumulate" +       d="M 831.81321,730.29452 L 847.63558,745.19938 L 868.49031,748.09932 L 866.90002,708.17334 L 875.22563,677.66492 L 868.06064,671.32386 L 846.36395,692.26626 L 831.81321,730.29452 z" +       id="path4205" +       sodipodi:nodetypes="cccccccc" +       clip-path="url(#clipPath3631)" +       transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,995.28646,23.53493)" /> +    <g +       id="g8317" +       style="filter:url(#filter8333)" +       clip-path="url(#clipPath8338)" +       transform="translate(276,136)"> +      <path +         transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,719.28646,-112.46507)" +         clip-path="none" +         sodipodi:nodetypes="ccccc" +         id="path4209" +         d="M 964.00012,754.69487 L 982.42893,762.15966 L 991.5,725.19519 L 976.62969,730.03405 L 964.00012,754.69487 z" +         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +      <rect +         y="757.19519" +         x="-55" +         height="177" +         width="182" +         id="rect8315" +         style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +    </g> +    <g +       id="g8346" +       style="filter:url(#filter8354)" +       clip-path="url(#clipPath8359)" +       transform="translate(276,136)"> +      <path +         transform="matrix(-0.9045327,0.2506626,0.2506626,0.9045327,719.28646,-112.46507)" +         clip-path="none" +         sodipodi:nodetypes="ccccccc" +         id="path4207" +         d="M 910.14441,746.31415 L 942.75736,751.48808 L 942.39617,727.61189 L 949.5847,697.92968 L 941.13358,692.66603 L 919.31164,719.1768 L 910.14441,746.31415 z" +         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +      <rect +         y="696.19519" +         x="-22" +         height="176" +         width="165" +         id="rect8344" +         style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +    </g> +  </g> +  <g +     inkscape:groupmode="layer" +     id="layer16" +     inkscape:label="Left Foot" +     style="display:inline"> +    <path +       style="opacity:1;fill:#ada469;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline;enable-background:new" +       d="M 1036.164,1071.8338 C 1042.9581,1090.7366 1046.6577,1105.1335 1048.0543,1123.0457 C 1049.4509,1140.958 1044.2716,1174.8465 1045.1538,1193.7018 C 1046.0356,1212.547 1053.2875,1233.8008 1072.4984,1242.6707 C 1091.9173,1251.6365 1121.8177,1252.882 1146.6183,1239.5251 C 1171.4189,1226.1681 1204.0193,1169.1996 1217.5925,1142.2164 C 1231.2164,1115.1325 1256.3536,1027.719 1262.2533,992.44781 C 1268.1531,957.1766 1264.8039,951.14704 1257.6359,943.39232 C 1260.2762,915.55217 1256.1361,888.45689 1270.7455,856.20614 C 1240.4965,868.03184 1233.3632,896.36684 1222.4266,921.71122 C 1214.4257,870.77829 1222.6358,850.43803 1225.7455,820.49186 C 1196.6808,835.26977 1182.884,867.60588 1180.7455,913.349 C 1169.8216,912.0448 1159.3541,908.91477 1147.1741,912.63471 C 1146.9101,866.61137 1145.7106,835.7453 1156.0847,798.42822 C 1102.8293,819.45508 1093.1375,905.02232 1100.0312,911.20614 C 1089.1484,911.74114 1078.6602,909.90884 1067.1741,914.06329 C 1067.813,871.49194 1066.9136,829.15468 1037.1741,791.20614 C 1037.1741,791.20614 1006.2161,872.12848 1005.7455,894.77757 C 1005.275,917.42666 1015.1971,934.94345 1015.1971,934.94345 C 1015.1971,934.94345 1006.6291,971.68396 1008.8985,993.17568 C 1011.1944,1014.9171 1029.3414,1052.8519 1036.164,1071.8338 z" +       id="path8848" +       sodipodi:nodetypes="czzzzzzcccccccccczczz" /> +    <path +       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter3587);enable-background:accumulate" +       d="M 719.5,738.69519 L 737.81177,754.12715 L 782.2228,738.73894 L 805.5,713.19519 L 816.96397,732.41584 L 847.63558,745.19938 L 872.73295,750.92775 L 892,723.19519 L 908.02309,747.02126 L 947,752.19519 L 957.24541,745.99667 L 964.00012,754.69487 L 989.5,765.69519 L 991.5,725.19519 L 955.94866,710.6576 L 923.45591,689.1305 L 883.0038,677.66492 L 861.69668,662.13148 L 840,685.19519 L 755.02878,638.61208 L 722,676.69519 L 719.5,738.69519 z" +       id="path3635" +       sodipodi:nodetypes="cccccccccccccccccccccc" +       clip-path="url(#clipPath3631)" +       transform="translate(276,136)" /> +    <path +       transform="translate(450.03125,73.843964)" +       style="opacity:0.58775509;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter3898);enable-background:new" +       d="M 584,696.5 L 577.4375,713.65625 C 577.4375,713.65625 569.62598,734.02113 561.75,757.3125 C 557.81201,768.95818 553.86698,781.35395 550.8125,792.4375 C 547.75802,803.52105 545.47664,812.81736 545.3125,820.71875 C 544.91443,839.88071 551.05903,855.60705 554.25,862.46875 C 553.47847,866.02398 552.25863,871.92307 550.90625,880.5625 C 548.98583,892.83071 547.18798,907.71691 548.53125,920.4375 C 549.91334,933.52585 555.34347,948.62515 561.125,963.46875 C 566.90653,978.31235 573.17935,992.69586 576.34375,1001.5 C 582.97581,1019.9519 586.33671,1033.0763 587.65625,1050 C 588.2376,1057.4561 587.41398,1070.336 586.40625,1083.375 C 585.39852,1096.414 584.21964,1109.6764 584.71875,1120.3438 C 585.70786,1141.4836 594.04673,1167.1785 618.09375,1178.2812 C 640.86858,1188.7966 673.42057,1189.9834 701.53125,1174.8438 C 717.69117,1166.1404 731.60759,1147.7462 744.90625,1127.9375 C 758.20491,1108.1288 769.87542,1086.8841 776.84375,1073.0312 C 792.19667,1042.51 816.23728,957.56702 822.46875,920.3125 C 825.48734,902.26597 826.39041,891.24695 825.09375,882.28125 C 824.11522,875.51521 821.26556,870.13385 818.21875,866.0625 C 820.26149,838.55459 817.48668,814.69372 830.1875,786.65625 L 840.75,763.375 L 816.9375,772.6875 C 799.44775,779.52503 788.03586,791.73286 780.34375,804.75 C 780.02124,805.29577 779.78061,805.85776 779.46875,806.40625 C 779.69078,783.89104 783.87659,768.76866 786.0625,747.71875 L 788.03125,728.71875 L 771,737.375 C 740.40551,752.93071 725.30511,785.56821 721.28125,827.59375 C 717.03593,826.96828 712.44985,826.5741 707.46875,826.75 C 707.17726,787.56964 707.07246,759.71315 716.0625,727.375 L 721.65625,707.25 L 702.21875,714.90625 C 671.30938,727.11019 654.35921,756.83698 645.59375,783.28125 C 641.21102,796.50339 638.84793,809.08246 638,819.21875 C 637.76797,821.99248 637.68894,824.53007 637.6875,826.9375 C 634.44563,826.90109 631.26698,827.07339 627.625,827.4375 C 627.66662,788.43277 624.14076,747.68335 595.34375,710.9375 L 584,696.5 z M 589.8125,740.3125 C 606.61941,770.95633 607.28701,804.27978 606.75,840.0625 L 606.53125,855.125 L 618.56618,848.58579 C 627.22823,845.45277 638.12676,848.35827 650.5,847.75 L 665.17465,857.1066 L 658.84375,831.3125 C 658.7541,831.08253 658.62329,830.89581 658.59375,830.59375 C 658.39424,828.55389 658.37143,825.12068 658.71875,820.96875 C 659.41339,812.66489 661.50832,801.38351 665.34375,789.8125 C 670.49907,774.25956 678.83176,758.62002 690.46875,747.28125 C 685.78494,775.91923 687.25316,807.54059 687.45711,843.08639 L 684.69118,856.34803 L 700.1875,848.75 C 709.2169,845.99229 717.37647,848.40004 729.46875,849.84375 L 742.71507,859.28798 L 741.09375,840 C 742.54168,809.02823 749.31524,786.32192 761.8125,771.125 C 758.82562,790.90384 756.38207,812.9098 762.125,849.46875 L 763.19052,855.84193 L 760.25237,867.35878 L 770.86948,859.1906 L 780.05921,869.41258 L 778.51093,858.94898 L 781.9375,852 C 787.63852,838.78851 792.11032,825.78663 798.28125,815.34375 C 799.24111,813.71941 800.31278,812.27939 801.34375,810.78125 C 797.66309,831.9366 798.91659,850.9894 797.25,868.5625 L 792.56986,876.36948 L 799.96875,876.59375 C 803.1888,880.07736 803.83625,880.44443 804.53125,885.25 C 805.22625,890.05557 804.84987,899.65035 801.96875,916.875 C 796.40076,950.16292 770.17603,1040.0409 758.28125,1063.6875 C 751.67634,1076.8179 740.25127,1097.5832 727.65625,1116.3438 C 715.06123,1135.1043 700.29692,1151.8776 691.65625,1156.5312 C 670.16573,1168.1054 642.87545,1166.7914 626.8125,1159.375 C 612.43764,1152.738 606.27438,1135.9256 605.5,1119.375 C 605.11689,1111.187 606.11279,1098.0658 607.125,1084.9688 C 608.13721,1071.8717 618.41391,1062.398 622.54839,1048.4062 C 627.92068,1030.2254 621.10152,1011.8118 610.04839,994.46875 C 603.56184,984.29097 586.07159,970.21085 580.5,955.90625 C 574.92841,941.60165 570.13249,926.9031 569.21875,918.25 C 568.29254,909.47887 569.64125,895.22498 571.4375,883.75 C 573.23375,872.27503 575.28125,863.46875 575.28125,863.46875 L 584.70403,859.85355 L 574.21875,855.96875 C 574.21875,855.96875 565.71986,840.65865 566.125,821.15625 C 566.19611,817.73309 567.96126,808.4282 570.84375,797.96875 C 573.72624,787.5093 577.60841,775.41604 581.46875,764 C 584.51314,754.99692 587.24938,747.39655 589.8125,740.3125 z" +       id="path3669" +       clip-path="url(#clipPath3677)" +       sodipodi:nodetypes="ccssscsssssssssssssccccscccccccccsscccccccccccssscccccccccccccccsccccssssssssssssscccsssc" /> +    <g +       id="g3628" +       clip-path="url(#clipPath3636)" +       transform="translate(276,136)"> +      <path +         id="path8988" +         d="M 824.48651,818.48242 L 774.98903,802.92607 L 748.11898,855.25197 L 789.13117,900.50681 L 838.62864,862.32304 L 824.48651,818.48242 z" +         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9024);enable-background:accumulate" /> +      <path +         id="path8990" +         d="M 964.49365,855.25197 L 909.33932,808.58293 L 865.4987,845.35248 L 899.43983,899.09259 L 906.51089,965.56063 L 855.59921,1000.916 L 814.58701,1012.2297 L 811.75859,1058.8987 L 868.32713,1084.3546 L 931.96674,1007.987 L 956.00837,913.23473 L 964.49365,855.25197 z" +         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9020);enable-background:accumulate" /> +    </g> +    <path +       style="opacity:0.25;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter9044);enable-background:accumulate" +       d="M 1045.3322,1043.5779 L 1106.1434,1016.7078 L 1206.5525,1047.8205 L 1142.9129,1078.9332 L 1060.8885,1061.9626 L 1045.3322,1043.5779 z" +       id="path8992" /> +    <path +       transform="translate(450.03125,73.843964)" +       style="opacity:0.58775509;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:20.79999924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter4185);enable-background:new" +       d="M 583.0625,715.75 C 570.95641,750.19974 556.348,784.28333 551.3125,820.59375 C 550.48042,835.52242 555.90165,849.75318 560.15625,863.65625 C 554.24001,890.85751 550.01944,920.5562 561.3125,946.78125 C 574.82967,984.9421 596.31397,1022.4634 593.73529,1064.2495 C 592.78699,1093.5437 584.72085,1125.2436 599.125,1152.5312 C 609.32364,1171.866 632.26456,1179.8429 653.09285,1180.1988 C 680.95504,1181.3729 709.55546,1168.5772 725.09375,1144.9375 C 747.68924,1115.5658 766.89426,1083.4402 780.3324,1048.8777 C 797.22293,1003.3717 810.0042,956.31698 818.26642,908.4788 C 820.09082,895.53774 821.3675,881.00895 813.6875,869.65625 C 810.25635,862.31993 813.72957,854.09611 813.00293,846.34648 C 813.67693,821.35182 817.01525,795.68272 829.65625,773.75 C 811.92312,780.1946 794.58357,790.30971 785.65318,807.61425 C 781.7181,814.3238 778.04836,821.18838 774.28125,828 C 770.73126,797.98592 778.00088,768.35172 781.0625,738.71875 C 760.89646,747.77338 744.18578,764.37397 736.88755,785.40075 C 730.58292,800.98078 728.08533,817.71793 726.625,834.4375 C 718.37166,832.91825 709.94053,832.33595 701.5625,832.9375 C 700.59942,794.23963 701.09554,753.53035 712.53125,717.03125 C 693.85012,723.24901 677.36504,735.76676 666.90322,752.41848 C 653.05068,773.29827 645.64182,798.17243 643.84375,823.03125 C 644.42909,827.35579 643.78249,834.87134 637.5,832.90625 C 632.16882,832.9238 626.87092,833.58508 621.5625,834 C 622.71034,794.61852 618.22106,752.3718 594.5,719.78125 C 591.43929,716.14408 588.86315,712.09687 585.875,708.4375 C 584.9375,710.875 584,713.3125 583.0625,715.75 z M 590.8125,729.59375 C 609.37777,758.89004 613.295,794.41387 612.9375,828.46875 C 613.14159,833.64401 612.42094,840.29795 613.0625,844.53125 C 625.38106,838.4285 639.80162,842.09135 652.84375,842.34375 C 655.16087,843.567 656.03585,843.99618 654.75,840.9375 C 650.58545,826.98465 652.90172,812.3245 656.55504,798.52986 C 662.92191,772.23922 677.18332,747.44188 699.375,731.5 C 690.75791,768.73706 693.65842,808.06161 693.28125,845.46875 C 705.53469,838.55885 720.56004,842.02262 733.3125,845.21875 C 736.70472,848.75355 735.60185,844.48927 735.5,841.40625 C 735.01691,820.03567 739.63133,798.33662 749.1875,779.25 C 755.15016,768.56273 763.43088,759.44621 771.625,750.375 C 763.75344,784.2131 762.4221,819.71093 768.90625,853.875 C 770.6311,852.46382 773.51306,853.42086 774.5625,853.5 C 784.24619,832.26318 790.91362,808.11938 809.45266,792.75815 C 811.32595,792.38693 808.00448,801.2831 807.96875,804.65625 C 804.43387,826.50206 804.67155,848.82948 803.0625,870.90625 C 801.75012,872.28304 805.91085,873.22979 806.53125,874.96875 C 814.45436,885.53455 809.65419,899.80024 808.62285,911.74886 C 801.5588,956.78241 786.85732,1000.1282 773.04608,1043.446 C 760.97132,1076.3953 742.32638,1106.526 721.8125,1134.875 C 710.85993,1148.4264 698.56778,1162.7263 680.96875,1167.375 C 660.81274,1173.6163 637.3928,1172.5494 619,1161.7188 C 601.71034,1149.3774 597.97607,1126.0099 599.73774,1106.0324 C 599.78653,1090.2062 602.10985,1078.2316 607.65521,1063.2271 C 613.20056,1048.2226 610.12626,1031.8954 605.875,1015.5938 C 601.62374,999.2922 593.69597,989.33378 584.05342,973.38963 C 574.41087,957.44548 566.41652,937.35229 563.28125,917.8125 C 561.53177,899.18536 566.17296,880.68988 569.0625,862.5625 C 572.35873,859.72554 567.46451,857.36591 566.75,854.375 C 559.14887,837.35992 558.34253,817.6001 564.00766,799.81502 C 571.13786,774.74272 579.76853,750.18261 588.6875,725.6875 C 589.39583,726.98958 590.10417,728.29167 590.8125,729.59375 z" +       id="path4149" +       sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccccccccccccczzzcccccc" +       clip-path="url(#clipPath4177)" /> +    <path +       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4130);enable-background:accumulate" +       d="M 735.05635,733.03834 L 737.81177,754.12715 L 782.2228,738.73894 L 787.07343,716.34919 L 783.13726,694.29697 L 760.68563,657.70396 L 752.40559,688.0089 L 735.05635,733.03834 z" +       id="path3902" +       sodipodi:nodetypes="cccccccc" +       clip-path="url(#clipPath3631)" +       transform="translate(276,136)" /> +    <path +       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter4141);enable-background:accumulate" +       d="M 831.81321,730.29452 L 847.63558,745.19938 L 868.49031,748.09932 L 866.90002,708.17334 L 875.22563,677.66492 L 868.06064,671.32386 L 846.36395,692.26626 L 831.81321,730.29452 z" +       id="path4135" +       sodipodi:nodetypes="cccccccc" +       clip-path="url(#clipPath3631)" +       transform="translate(276,136)" /> +    <g +       id="g8367" +       style="filter:url(#filter8379)" +       clip-path="url(#clipPath8392)" +       transform="translate(276,136)"> +      <path +         clip-path="none" +         sodipodi:nodetypes="ccccccc" +         id="path4145" +         d="M 910.14441,746.31415 L 942.75736,751.48808 L 942.39617,727.61189 L 949.5847,697.92968 L 941.13358,692.66603 L 919.31164,719.1768 L 910.14441,746.31415 z" +         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +      <rect +         y="650.19098" +         x="877.51953" +         height="172.53406" +         width="123.03658" +         id="rect8365" +         style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +    </g> +    <g +       id="g8400" +       style="filter:url(#filter8404)" +       clip-path="url(#clipPath8417)" +       transform="translate(276,136)"> +      <path +         clip-path="none" +         sodipodi:nodetypes="ccccc" +         id="path4147" +         d="M 964.00012,754.69487 L 982.42893,762.15966 L 991.5,725.19519 L 976.62969,730.03405 L 964.00012,754.69487 z" +         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +      <rect +         y="677.06104" +         x="924.89569" +         height="125.1579" +         width="142.12846" +         id="rect8398" +         style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:25;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" /> +    </g> +  </g> +</svg> diff --git a/Documentation/logo.txt b/Documentation/logo.txt index 296f0f7f67e..a2e62445e28 100644 --- a/Documentation/logo.txt +++ b/Documentation/logo.txt @@ -1,13 +1,4 @@ -This is the full-colour version of the currently unofficial Linux logo -("currently unofficial" just means that there has been no paperwork and -that I have not really announced it yet).  It was created by Larry Ewing, -and is freely usable as long as you acknowledge Larry as the original -artist.  - -Note that there are black-and-white versions of this available that -scale down to smaller sizes and are better for letterheads or whatever -you want to use it for: for the full range of logos take a look at -Larry's web-page: - -	http://www.isc.tamu.edu/~lewing/linux/ +Tux is taking a three month sabbatical to work as a barber, so Tuz is +standing in.  He's taken pains to ensure you'll hardly notice. +Image by Andrew McGown and Josh Bush.  Image is licensed CC BY-SA. diff --git a/Documentation/networking/ipv6.txt b/Documentation/networking/ipv6.txt new file mode 100644 index 00000000000..268e5c103dd --- /dev/null +++ b/Documentation/networking/ipv6.txt @@ -0,0 +1,35 @@ + +Options for the ipv6 module are supplied as parameters at load time. + +Module options may be given as command line arguments to the insmod +or modprobe command, but are usually specified in either the +/etc/modules.conf or /etc/modprobe.conf configuration file, or in a +distro-specific configuration file. + +The available ipv6 module parameters are listed below.  If a parameter +is not specified the default value is used. + +The parameters are as follows: + +disable + +	Specifies whether to load the IPv6 module, but disable all +	its functionality.  This might be used when another module +	has a dependency on the IPv6 module being loaded, but no +	IPv6 addresses or operations are desired. + +	The possible values and their effects are: + +	0 +		IPv6 is enabled. + +		This is the default value. + +	1 +		IPv6 is disabled. + +		No IPv6 addresses will be added to interfaces, and +		it will not be possible to open an IPv6 socket. + +		A reboot is required to enable IPv6. + diff --git a/Documentation/sound/alsa/DocBook/alsa-driver-api.tmpl b/Documentation/sound/alsa/DocBook/alsa-driver-api.tmpl index 9d644f7e241..90f163c4bde 100644 --- a/Documentation/sound/alsa/DocBook/alsa-driver-api.tmpl +++ b/Documentation/sound/alsa/DocBook/alsa-driver-api.tmpl @@ -71,6 +71,10 @@  !Esound/pci/ac97/ac97_codec.c  !Esound/pci/ac97/ac97_pcm.c       </sect1> +     <sect1><title>Virtual Master Control API</title> +!Esound/core/vmaster.c +!Iinclude/sound/control.h +     </sect1>    </chapter>    <chapter><title>MIDI API</title>       <sect1><title>Raw MIDI API</title> @@ -89,6 +93,9 @@       <sect1><title>Hardware-Dependent Devices API</title>  !Esound/core/hwdep.c       </sect1> +     <sect1><title>Jack Abstraction Layer API</title> +!Esound/core/jack.c +     </sect1>       <sect1><title>ISA DMA Helpers</title>  !Esound/core/isadma.c       </sect1> diff --git a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl index 87a7c07ab65..320384c1791 100644 --- a/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl +++ b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl @@ -492,9 +492,9 @@            }            /* (2) */ -          card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -          if (card == NULL) -                  return -ENOMEM; +          err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +          if (err < 0) +                  return err;            /* (3) */            err = snd_mychip_create(card, pci, &chip); @@ -590,8 +590,9 @@              <programlisting>  <![CDATA[    struct snd_card *card; +  int err;    .... -  card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); +  err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);  ]]>              </programlisting>            </informalexample> @@ -809,26 +810,28 @@        <para>          As mentioned above, to create a card instance, call -      <function>snd_card_new()</function>. +      <function>snd_card_create()</function>.          <informalexample>            <programlisting>  <![CDATA[    struct snd_card *card; -  card = snd_card_new(index, id, module, extra_size); +  int err; +  err = snd_card_create(index, id, module, extra_size, &card);  ]]>            </programlisting>          </informalexample>        </para>        <para> -        The function takes four arguments, the card-index number, the +        The function takes five arguments, the card-index number, the          id string, the module pointer (usually          <constant>THIS_MODULE</constant>), -        and the size of extra-data space.  The last argument is used to +        the size of extra-data space, and the pointer to return the +        card instance.  The extra_size argument is used to          allocate card->private_data for the          chip-specific data.  Note that these data -        are allocated by <function>snd_card_new()</function>. +        are allocated by <function>snd_card_create()</function>.        </para>      </section> @@ -915,15 +918,16 @@        </para>        <section id="card-management-chip-specific-snd-card-new"> -        <title>1. Allocating via <function>snd_card_new()</function>.</title> +        <title>1. Allocating via <function>snd_card_create()</function>.</title>          <para>            As mentioned above, you can pass the extra-data-length -	  to the 4th argument of <function>snd_card_new()</function>, i.e. +	  to the 4th argument of <function>snd_card_create()</function>, i.e.            <informalexample>              <programlisting>  <![CDATA[ -  card = snd_card_new(index[dev], id[dev], THIS_MODULE, sizeof(struct mychip)); +  err = snd_card_create(index[dev], id[dev], THIS_MODULE, +                        sizeof(struct mychip), &card);  ]]>              </programlisting>            </informalexample> @@ -952,8 +956,8 @@          <para>            After allocating a card instance via -          <function>snd_card_new()</function> (with -          <constant>NULL</constant> on the 4th arg), call +          <function>snd_card_create()</function> (with +          <constant>0</constant> on the 4th arg), call            <function>kzalloc()</function>.             <informalexample> @@ -961,7 +965,7 @@  <![CDATA[    struct snd_card *card;    struct mychip *chip; -  card = snd_card_new(index[dev], id[dev], THIS_MODULE, NULL); +  err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);    .....    chip = kzalloc(sizeof(*chip), GFP_KERNEL);  ]]> @@ -5750,8 +5754,9 @@ struct _snd_pcm_runtime {            ....            struct snd_card *card;            struct mychip *chip; +          int err;            .... -          card = snd_card_new(index[dev], id[dev], THIS_MODULE, NULL); +          err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);            ....            chip = kzalloc(sizeof(*chip), GFP_KERNEL);            .... @@ -5763,7 +5768,7 @@ struct _snd_pcm_runtime {        </informalexample>  	When you created the chip data with -	<function>snd_card_new()</function>, it's anyway accessible +	<function>snd_card_create()</function>, it's anyway accessible  	via <structfield>private_data</structfield> field.        <informalexample> @@ -5775,9 +5780,10 @@ struct _snd_pcm_runtime {            ....            struct snd_card *card;            struct mychip *chip; +          int err;            .... -          card = snd_card_new(index[dev], id[dev], THIS_MODULE, -                              sizeof(struct mychip)); +          err = snd_card_create(index[dev], id[dev], THIS_MODULE, +                                sizeof(struct mychip), &card);            ....            chip = card->private_data;            .... diff --git a/MAINTAINERS b/MAINTAINERS index 1c2ca1dc66f..5d460c9d1c2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1469,8 +1469,6 @@ L:	linux-acpi@vger.kernel.org  S:	Supported  DOCUMENTATION (/Documentation directory) -P:	Michael Kerrisk -M:	mtk.manpages@gmail.com  P:	Randy Dunlap  M:	rdunlap@xenotime.net  L:	linux-doc@vger.kernel.org @@ -2879,7 +2877,7 @@ P:	Michael Kerrisk  M:	mtk.manpages@gmail.com  W:	http://www.kernel.org/doc/man-pages  L:	linux-man@vger.kernel.org -S:	Supported +S:	Maintained  MARVELL LIBERTAS WIRELESS DRIVER  P:	Dan Williams @@ -3352,10 +3350,8 @@ S:	Maintained  PARISC ARCHITECTURE  P:	Kyle McMartin  M:	kyle@mcmartin.ca -P:	Matthew Wilcox -M:	matthew@wil.cx -P:	Grant Grundler -M:	grundler@parisc-linux.org +P:	Helge Deller +M:	deller@gmx.de  L:	linux-parisc@vger.kernel.org  W:	http://www.parisc-linux.org/  T:	git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git @@ -3880,6 +3876,15 @@ L:	linux-ide@vger.kernel.org  T:	git kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git  S:	Supported +SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER +P:	Sathya Perla +M:	sathyap@serverengines.com +P:      Subbu Seetharaman +M:      subbus@serverengines.com +L:      netdev@vger.kernel.org +W:      http://www.serverengines.com +S:      Supported +  SFC NETWORK DRIVER  P:	Steve Hodgson  P:	Ben Hutchings @@ -1,8 +1,8 @@  VERSION = 2  PATCHLEVEL = 6  SUBLEVEL = 29 -EXTRAVERSION = -rc6 -NAME = Erotic Pickled Herring +EXTRAVERSION = +NAME = Temporary Tasmanian Devil  # *DOCUMENTATION*  # To see a list of typical targets execute "make help" @@ -566,6 +566,12 @@ KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)  # disable pointer signed / unsigned warnings in gcc 4.0  KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,) +# disable invalid "can't wrap" optimzations for signed / pointers +KBUILD_CFLAGS	+= $(call cc-option,-fwrapv) + +# revert to pre-gcc-4.4 behaviour of .eh_frame +KBUILD_CFLAGS	+= $(call cc-option,-fno-dwarf2-cfi-asm) +  # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments  # But warn user when we do so  warn-assign = \ @@ -904,12 +910,18 @@ localver = $(subst $(space),, $(string) \  # and if the SCM is know a tag from the SCM is appended.  # The appended tag is determined by the SCM used.  # -# Currently, only git is supported. -# Other SCMs can edit scripts/setlocalversion and add the appropriate -# checks as needed. +# .scmversion is used when generating rpm packages so we do not loose +# the version information from the SCM when we do the build of the kernel +# from the copied source  ifdef CONFIG_LOCALVERSION_AUTO -	_localver-auto = $(shell $(CONFIG_SHELL) \ -	                  $(srctree)/scripts/setlocalversion $(srctree)) + +ifeq ($(wildcard .scmversion),) +        _localver-auto = $(shell $(CONFIG_SHELL) \ +                         $(srctree)/scripts/setlocalversion $(srctree)) +else +        _localver-auto = $(shell cat .scmversion 2> /dev/null) +endif +  	localver-auto  = $(LOCALVERSION)$(_localver-auto)  endif @@ -1537,7 +1549,7 @@ quiet_cmd_depmod = DEPMOD  $(KERNELRELEASE)        cmd_depmod = \  	if [ -r System.map -a -x $(DEPMOD) ]; then                              \  		$(DEPMOD) -ae -F System.map                                     \ -		$(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) -r)   \ +		$(if $(strip $(INSTALL_MOD_PATH)), -b $(INSTALL_MOD_PATH) )     \  		$(KERNELRELEASE);                                               \  	fi diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 49a6ba926c2..159d0416f27 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -111,6 +111,7 @@ ENTRY(mcount)  	.globl mcount_call  mcount_call:  	bl ftrace_stub +	ldr lr, [fp, #-4]			@ restore lr  	ldmia sp!, {r0-r3, pc}  ENTRY(ftrace_caller) @@ -122,6 +123,7 @@ ENTRY(ftrace_caller)  	.globl ftrace_call  ftrace_call:  	bl ftrace_stub +	ldr lr, [fp, #-4]			@ restore lr  	ldmia sp!, {r0-r3, pc}  #else @@ -133,6 +135,7 @@ ENTRY(mcount)  	adr r0, ftrace_stub  	cmp r0, r2  	bne trace +	ldr lr, [fp, #-4]			@ restore lr  	ldmia sp!, {r0-r3, pc}  trace: @@ -141,6 +144,7 @@ trace:  	sub r0, r0, #MCOUNT_INSN_SIZE  	mov lr, pc  	mov pc, r2 +	mov lr, r1				@ restore lr  	ldmia sp!, {r0-r3, pc}  #endif /* CONFIG_DYNAMIC_FTRACE */ diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index 36f81d96797..6ff7919613d 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c @@ -88,7 +88,7 @@ void set_fiq_handler(void *start, unsigned int length)   * disable irqs for the duration.  Note - these functions are almost   * entirely coded in assembly.   */ -void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs) +void __naked set_fiq_regs(struct pt_regs *regs)  {  	register unsigned long tmp;  	asm volatile ( @@ -106,7 +106,7 @@ void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs)  	: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));  } -void __attribute__((naked)) get_fiq_regs(struct pt_regs *regs) +void __naked get_fiq_regs(struct pt_regs *regs)  {  	register unsigned long tmp;  	asm volatile ( diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 7049815d66d..68d6494c038 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -233,12 +233,13 @@ static void __init cacheid_init(void)  	unsigned int cachetype = read_cpuid_cachetype();  	unsigned int arch = cpu_architecture(); -	if (arch >= CPU_ARCH_ARMv7) { -		cacheid = CACHEID_VIPT_NONALIASING; -		if ((cachetype & (3 << 14)) == 1 << 14) -			cacheid |= CACHEID_ASID_TAGGED; -	} else if (arch >= CPU_ARCH_ARMv6) { -		if (cachetype & (1 << 23)) +	if (arch >= CPU_ARCH_ARMv6) { +		if ((cachetype & (7 << 29)) == 4 << 29) { +			/* ARMv7 register format */ +			cacheid = CACHEID_VIPT_NONALIASING; +			if ((cachetype & (3 << 14)) == 1 << 14) +				cacheid |= CACHEID_ASID_TAGGED; +		} else if (cachetype & (1 << 23))  			cacheid = CACHEID_VIPT_ALIASING;  		else  			cacheid = CACHEID_VIPT_NONALIASING; diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 134af97ff34..b7f23324231 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -347,6 +347,111 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)  void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}  #endif +/* -------------------------------------------------------------------- + *  Compact Flash (PCMCIA or IDE) + * -------------------------------------------------------------------- */ + +#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \ +    defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) + +static struct at91_cf_data cf0_data; + +static struct resource cf0_resources[] = { +	[0] = { +		.start	= AT91_CHIPSELECT_4, +		.end	= AT91_CHIPSELECT_4 + SZ_256M - 1, +		.flags	= IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT, +	} +}; + +static struct platform_device cf0_device = { +	.id		= 0, +	.dev		= { +				.platform_data	= &cf0_data, +	}, +	.resource	= cf0_resources, +	.num_resources	= ARRAY_SIZE(cf0_resources), +}; + +static struct at91_cf_data cf1_data; + +static struct resource cf1_resources[] = { +	[0] = { +		.start	= AT91_CHIPSELECT_5, +		.end	= AT91_CHIPSELECT_5 + SZ_256M - 1, +		.flags	= IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT, +	} +}; + +static struct platform_device cf1_device = { +	.id		= 1, +	.dev		= { +				.platform_data	= &cf1_data, +	}, +	.resource	= cf1_resources, +	.num_resources	= ARRAY_SIZE(cf1_resources), +}; + +void __init at91_add_device_cf(struct at91_cf_data *data) +{ +	unsigned long ebi0_csa; +	struct platform_device *pdev; + +	if (!data) +		return; + +	/* +	 * assign CS4 or CS5 to SMC with Compact Flash logic support, +	 * we assume SMC timings are configured by board code, +	 * except True IDE where timings are controlled by driver +	 */ +	ebi0_csa = at91_sys_read(AT91_MATRIX_EBI0CSA); +	switch (data->chipselect) { +	case 4: +		at91_set_A_periph(AT91_PIN_PD6, 0);  /* EBI0_NCS4/CFCS0 */ +		ebi0_csa |= AT91_MATRIX_EBI0_CS4A_SMC_CF1; +		cf0_data = *data; +		pdev = &cf0_device; +		break; +	case 5: +		at91_set_A_periph(AT91_PIN_PD7, 0);  /* EBI0_NCS5/CFCS1 */ +		ebi0_csa |= AT91_MATRIX_EBI0_CS5A_SMC_CF2; +		cf1_data = *data; +		pdev = &cf1_device; +		break; +	default: +		printk(KERN_ERR "AT91 CF: bad chip-select requested (%u)\n", +		       data->chipselect); +		return; +	} +	at91_sys_write(AT91_MATRIX_EBI0CSA, ebi0_csa); + +	if (data->det_pin) { +		at91_set_gpio_input(data->det_pin, 1); +		at91_set_deglitch(data->det_pin, 1); +	} + +	if (data->irq_pin) { +		at91_set_gpio_input(data->irq_pin, 1); +		at91_set_deglitch(data->irq_pin, 1); +	} + +	if (data->vcc_pin) +		/* initially off */ +		at91_set_gpio_output(data->vcc_pin, 0); + +	/* enable EBI controlled pins */ +	at91_set_A_periph(AT91_PIN_PD5, 1);  /* NWAIT */ +	at91_set_A_periph(AT91_PIN_PD8, 0);  /* CFCE1 */ +	at91_set_A_periph(AT91_PIN_PD9, 0);  /* CFCE2 */ +	at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */ + +	pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "at91_ide" : "at91_cf"; +	platform_device_register(pdev); +} +#else +void __init at91_add_device_cf(struct at91_cf_data *data) {} +#endif  /* --------------------------------------------------------------------   *  NAND / SmartMedia diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index 0b3ae21b456..793fe7b25f3 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h @@ -56,6 +56,9 @@ struct at91_cf_data {  	u8	vcc_pin;		/* power switching */  	u8	rst_pin;		/* card reset */  	u8	chipselect;		/* EBI Chip Select number */ +	u8	flags; +#define AT91_CF_TRUE_IDE	0x01 +#define AT91_IDE_SWAP_A0_A2	0x02  };  extern void __init at91_add_device_cf(struct at91_cf_data *data); diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 9bb4f043aa2..7ac812dc055 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -332,7 +332,6 @@ static int at91_pm_enter(suspend_state_t state)  			at91_sys_read(AT91_AIC_IPR) & at91_sys_read(AT91_AIC_IMR));  error: -	sdram_selfrefresh_disable();  	target_state = PM_SUSPEND_ON;  	at91_irq_resume();  	at91_gpio_resume(); diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h index 88f7e88f152..05f0f4f2f3c 100644 --- a/arch/arm/mach-ep93xx/include/mach/platform.h +++ b/arch/arm/mach-ep93xx/include/mach/platform.h @@ -4,6 +4,8 @@  #ifndef __ASSEMBLY__ +struct i2c_board_info; +  struct ep93xx_eth_data  {  	unsigned char	dev_addr[6]; diff --git a/arch/arm/mach-mx1/devices.c b/arch/arm/mach-mx1/devices.c index 686d8d2dbb2..a95644193f3 100644 --- a/arch/arm/mach-mx1/devices.c +++ b/arch/arm/mach-mx1/devices.c @@ -23,6 +23,8 @@  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/gpio.h> + +#include <mach/irqs.h>  #include <mach/hardware.h>  static struct resource imx_csi_resources[] = { diff --git a/arch/arm/mach-mx1/mx1ads.c b/arch/arm/mach-mx1/mx1ads.c index 2e4b185fe4a..3200cf60e38 100644 --- a/arch/arm/mach-mx1/mx1ads.c +++ b/arch/arm/mach-mx1/mx1ads.c @@ -21,6 +21,7 @@  #include <asm/mach/arch.h>  #include <asm/mach/time.h> +#include <mach/irqs.h>  #include <mach/hardware.h>  #include <mach/common.h>  #include <mach/imx-uart.h> diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index f6a13451d1f..6031e179926 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c @@ -81,7 +81,7 @@ static inline void __init ldp_init_smc911x(void)  	}  	ldp_smc911x_resources[0].start = cs_mem_base + 0x0; -	ldp_smc911x_resources[0].end   = cs_mem_base + 0xf; +	ldp_smc911x_resources[0].end   = cs_mem_base + 0xff;  	udelay(100);  	eth_gpio = LDP_SMC911X_GPIO; diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 38c88fbe658..e39cd2c46cf 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c @@ -178,7 +178,9 @@ static int __init omap3_beagle_i2c_init(void)  #ifdef CONFIG_I2C2_OMAP_BEAGLE  	omap_register_i2c_bus(2, 400, NULL, 0);  #endif -	omap_register_i2c_bus(3, 400, NULL, 0); +	/* Bus 3 is attached to the DVI port where devices like the pico DLP +	 * projector don't work reliably with 400kHz */ +	omap_register_i2c_bus(3, 100, NULL, 0);  	return 0;  } diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 0a623379789..8a0e49d8425 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c @@ -431,6 +431,10 @@ void __init orion5x_uart1_init(void)  /*****************************************************************************   * XOR engine   ****************************************************************************/ +struct mv_xor_platform_shared_data orion5x_xor_shared_data = { +	.dram		= &orion5x_mbus_dram_info, +}; +  static struct resource orion5x_xor_shared_resources[] = {  	{  		.name	= "xor low", @@ -448,6 +452,9 @@ static struct resource orion5x_xor_shared_resources[] = {  static struct platform_device orion5x_xor_shared = {  	.name		= MV_XOR_SHARED_NAME,  	.id		= 0, +	.dev		= { +		.platform_data	= &orion5x_xor_shared_data, +	},  	.num_resources	= ARRAY_SIZE(orion5x_xor_shared_resources),  	.resource	= orion5x_xor_shared_resources,  }; diff --git a/arch/arm/mach-s3c6410/mach-smdk6410.c b/arch/arm/mach-s3c6410/mach-smdk6410.c index 3c4d47145c8..25f7935576f 100644 --- a/arch/arm/mach-s3c6410/mach-smdk6410.c +++ b/arch/arm/mach-s3c6410/mach-smdk6410.c @@ -129,7 +129,7 @@ static struct s3c_fb_platdata smdk6410_lcd_pdata __initdata = {  	.vidcon1	= VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,  }; -struct map_desc smdk6410_iodesc[] = {}; +static struct map_desc smdk6410_iodesc[] = {};  static struct platform_device *smdk6410_devices[] __initdata = {  #ifdef CONFIG_SMDK6410_SD_CH0 @@ -146,7 +146,7 @@ static struct platform_device *smdk6410_devices[] __initdata = {  static struct i2c_board_info i2c_devs0[] __initdata = {  	{ I2C_BOARD_INFO("24c08", 0x50), }, -	{ I2C_BOARD_INFO("WM8580", 0X1b), }, +	{ I2C_BOARD_INFO("wm8580", 0x1b), },  };  static struct i2c_board_info i2c_devs1[] __initdata = { diff --git a/arch/arm/mm/abort-ev6.S b/arch/arm/mm/abort-ev6.S index 8a7f65ba14b..94077fbd96b 100644 --- a/arch/arm/mm/abort-ev6.S +++ b/arch/arm/mm/abort-ev6.S @@ -23,7 +23,8 @@ ENTRY(v6_early_abort)  #ifdef CONFIG_CPU_32v6K  	clrex  #else -	strex	r0, r1, [sp]			@ Clear the exclusive monitor +	sub	r1, sp, #4			@ Get unused stack location +	strex	r0, r1, [r1]			@ Clear the exclusive monitor  #endif  	mrc	p15, 0, r1, c5, c0, 0		@ get FSR  	mrc	p15, 0, r0, c6, c0, 0		@ get FAR diff --git a/arch/arm/mm/copypage-feroceon.c b/arch/arm/mm/copypage-feroceon.c index c3ba6a94da0..70997d5bee2 100644 --- a/arch/arm/mm/copypage-feroceon.c +++ b/arch/arm/mm/copypage-feroceon.c @@ -13,7 +13,7 @@  #include <linux/init.h>  #include <linux/highmem.h> -static void __attribute__((naked)) +static void __naked  feroceon_copy_user_page(void *kto, const void *kfrom)  {  	asm("\ diff --git a/arch/arm/mm/copypage-v3.c b/arch/arm/mm/copypage-v3.c index 70ed96c8af8..de9c06854ad 100644 --- a/arch/arm/mm/copypage-v3.c +++ b/arch/arm/mm/copypage-v3.c @@ -15,7 +15,7 @@   *   * FIXME: do we need to handle cache stuff...   */ -static void __attribute__((naked)) +static void __naked  v3_copy_user_page(void *kto, const void *kfrom)  {  	asm("\n\ diff --git a/arch/arm/mm/copypage-v4mc.c b/arch/arm/mm/copypage-v4mc.c index 1601698b980..7370a7142b0 100644 --- a/arch/arm/mm/copypage-v4mc.c +++ b/arch/arm/mm/copypage-v4mc.c @@ -44,7 +44,7 @@ static DEFINE_SPINLOCK(minicache_lock);   * instruction.  If your processor does not supply this, you have to write your   * own copy_user_highpage that does the right thing.   */ -static void __attribute__((naked)) +static void __naked  mc_copy_user_page(void *from, void *to)  {  	asm volatile( diff --git a/arch/arm/mm/copypage-v4wb.c b/arch/arm/mm/copypage-v4wb.c index 3ec93dab765..9ab09841422 100644 --- a/arch/arm/mm/copypage-v4wb.c +++ b/arch/arm/mm/copypage-v4wb.c @@ -22,7 +22,7 @@   * instruction.  If your processor does not supply this, you have to write your   * own copy_user_highpage that does the right thing.   */ -static void __attribute__((naked)) +static void __naked  v4wb_copy_user_page(void *kto, const void *kfrom)  {  	asm("\ diff --git a/arch/arm/mm/copypage-v4wt.c b/arch/arm/mm/copypage-v4wt.c index 0f1188efae4..300efafd664 100644 --- a/arch/arm/mm/copypage-v4wt.c +++ b/arch/arm/mm/copypage-v4wt.c @@ -20,7 +20,7 @@   * dirty data in the cache.  However, we do have to ensure that   * subsequent reads are up to date.   */ -static void __attribute__((naked)) +static void __naked  v4wt_copy_user_page(void *kto, const void *kfrom)  {  	asm("\ diff --git a/arch/arm/mm/copypage-xsc3.c b/arch/arm/mm/copypage-xsc3.c index 39a994542ca..bc4525f5ab2 100644 --- a/arch/arm/mm/copypage-xsc3.c +++ b/arch/arm/mm/copypage-xsc3.c @@ -29,7 +29,7 @@   * if we eventually end up using our copied page.   *   */ -static void __attribute__((naked)) +static void __naked  xsc3_mc_copy_user_page(void *kto, const void *kfrom)  {  	asm("\ diff --git a/arch/arm/mm/copypage-xscale.c b/arch/arm/mm/copypage-xscale.c index d18f2397ee2..76824d3e966 100644 --- a/arch/arm/mm/copypage-xscale.c +++ b/arch/arm/mm/copypage-xscale.c @@ -42,7 +42,7 @@ static DEFINE_SPINLOCK(minicache_lock);   * Dcache aliasing issue.  The writes will be forwarded to the write buffer,   * and merged as appropriate.   */ -static void __attribute__((naked)) +static void __naked  mc_copy_user_page(void *from, void *to)  {  	/* diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 310e479309e..f1ef5613ccd 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -490,26 +490,30 @@ core_initcall(consistent_init);   */  void dma_cache_maint(const void *start, size_t size, int direction)  { -	const void *end = start + size; +	void (*inner_op)(const void *, const void *); +	void (*outer_op)(unsigned long, unsigned long); -	BUG_ON(!virt_addr_valid(start) || !virt_addr_valid(end - 1)); +	BUG_ON(!virt_addr_valid(start) || !virt_addr_valid(start + size - 1));  	switch (direction) {  	case DMA_FROM_DEVICE:		/* invalidate only */ -		dmac_inv_range(start, end); -		outer_inv_range(__pa(start), __pa(end)); +		inner_op = dmac_inv_range; +		outer_op = outer_inv_range;  		break;  	case DMA_TO_DEVICE:		/* writeback only */ -		dmac_clean_range(start, end); -		outer_clean_range(__pa(start), __pa(end)); +		inner_op = dmac_clean_range; +		outer_op = outer_clean_range;  		break;  	case DMA_BIDIRECTIONAL:		/* writeback and invalidate */ -		dmac_flush_range(start, end); -		outer_flush_range(__pa(start), __pa(end)); +		inner_op = dmac_flush_range; +		outer_op = outer_flush_range;  		break;  	default:  		BUG();  	} + +	inner_op(start, start + size); +	outer_op(__pa(start), __pa(start) + size);  }  EXPORT_SYMBOL(dma_cache_maint); diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 34df4d9d03a..80fd3b69ae1 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -382,7 +382,7 @@ void __init bootmem_init(void)  	for_each_node(node)  		bootmem_free_node(node, mi); -	high_memory = __va(memend_pfn << PAGE_SHIFT); +	high_memory = __va((memend_pfn << PAGE_SHIFT) - 1) + 1;  	/*  	 * This doesn't seem to be used by the Linux memory manager any diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index 5358fcc7f61..f7457fea6de 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c @@ -124,7 +124,7 @@ int valid_phys_addr_range(unsigned long addr, size_t size)  {  	if (addr < PHYS_OFFSET)  		return 0; -	if (addr + size > __pa(high_memory)) +	if (addr + size >= __pa(high_memory - 1))  		return 0;  	return 1; diff --git a/arch/arm/plat-omap/Makefile b/arch/arm/plat-omap/Makefile index deaff58878a..04a100cfb8e 100644 --- a/arch/arm/plat-omap/Makefile +++ b/arch/arm/plat-omap/Makefile @@ -18,7 +18,8 @@ obj-$(CONFIG_CPU_FREQ) += cpu-omap.o  obj-$(CONFIG_OMAP_DM_TIMER) += dmtimer.o  obj-$(CONFIG_OMAP_DEBUG_DEVICES) += debug-devices.o  obj-$(CONFIG_OMAP_DEBUG_LEDS) += debug-leds.o -obj-$(CONFIG_I2C_OMAP) += i2c.o +i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o +obj-y += $(i2c-omap-m) $(i2c-omap-y)  # OMAP mailbox framework  obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox.o diff --git a/arch/arm/plat-omap/common.c b/arch/arm/plat-omap/common.c index 0843b8882f9..6825fbb5a05 100644 --- a/arch/arm/plat-omap/common.c +++ b/arch/arm/plat-omap/common.c @@ -200,20 +200,16 @@ static struct clocksource clocksource_32k = {  };  /* - * Rounds down to nearest nsec. - */ -unsigned long long omap_32k_ticks_to_nsecs(unsigned long ticks_32k) -{ -	return cyc2ns(&clocksource_32k, ticks_32k); -} - -/*   * Returns current time from boot in nsecs. It's OK for this to wrap   * around for now, as it's just a relative time stamp.   */  unsigned long long sched_clock(void)  { -	return omap_32k_ticks_to_nsecs(omap_32k_read()); +	unsigned long long ret; + +	ret = (unsigned long long)omap_32k_read(); +	ret = (ret * clocksource_32k.mult_orig) >> clocksource_32k.shift; +	return ret;  }  static int __init omap_init_clocksource_32k(void) diff --git a/arch/arm/plat-omap/include/mach/common.h b/arch/arm/plat-omap/include/mach/common.h index ef70e2b0f05..e746ec7e785 100644 --- a/arch/arm/plat-omap/include/mach/common.h +++ b/arch/arm/plat-omap/include/mach/common.h @@ -35,7 +35,7 @@ extern void omap_map_common_io(void);  extern struct sys_timer omap_timer;  extern void omap_serial_init(void);  extern void omap_serial_enable_clocks(int enable); -#ifdef CONFIG_I2C_OMAP +#if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)  extern int omap_register_i2c_bus(int bus_id, u32 clkrate,  				 struct i2c_board_info const *info,  				 unsigned len); diff --git a/arch/arm/plat-omap/include/mach/pm.h b/arch/arm/plat-omap/include/mach/pm.h index 2a9c27ad4c3..37e2f0f38b4 100644 --- a/arch/arm/plat-omap/include/mach/pm.h +++ b/arch/arm/plat-omap/include/mach/pm.h @@ -108,7 +108,7 @@  	!defined(CONFIG_ARCH_OMAP15XX) && \  	!defined(CONFIG_ARCH_OMAP16XX) && \  	!defined(CONFIG_ARCH_OMAP24XX) -#error "Power management for this processor not implemented yet" +#warning "Power management for this processor not implemented yet"  #endif  #ifndef __ASSEMBLER__ diff --git a/arch/arm/plat-s3c64xx/clock.c b/arch/arm/plat-s3c64xx/clock.c index 136c982c68e..ad1b9682c9c 100644 --- a/arch/arm/plat-s3c64xx/clock.c +++ b/arch/arm/plat-s3c64xx/clock.c @@ -248,7 +248,7 @@ static struct clk *clks[] __initdata = {  	&clk_48m,  }; -void s3c64xx_register_clocks(void) +void __init s3c64xx_register_clocks(void)  {  	struct clk *clkp;  	int ret; diff --git a/arch/arm/plat-s3c64xx/gpiolib.c b/arch/arm/plat-s3c64xx/gpiolib.c index cc62941d7b5..ee9188add8f 100644 --- a/arch/arm/plat-s3c64xx/gpiolib.c +++ b/arch/arm/plat-s3c64xx/gpiolib.c @@ -417,4 +417,4 @@ static __init int s3c64xx_gpiolib_init(void)  	return 0;  } -arch_initcall(s3c64xx_gpiolib_init); +core_initcall(s3c64xx_gpiolib_init); diff --git a/arch/arm/plat-s3c64xx/include/plat/irqs.h b/arch/arm/plat-s3c64xx/include/plat/irqs.h index 2846f550b72..f865bf4d709 100644 --- a/arch/arm/plat-s3c64xx/include/plat/irqs.h +++ b/arch/arm/plat-s3c64xx/include/plat/irqs.h @@ -117,7 +117,7 @@  #define IRQ_ONENAND1		S3C64XX_IRQ_VIC1(12)  #define IRQ_NFC			S3C64XX_IRQ_VIC1(13)  #define IRQ_CFCON		S3C64XX_IRQ_VIC1(14) -#define IRQ_UHOST		S3C64XX_IRQ_VIC1(15) +#define IRQ_USBH		S3C64XX_IRQ_VIC1(15)  #define IRQ_SPI0		S3C64XX_IRQ_VIC1(16)  #define IRQ_SPI1		S3C64XX_IRQ_VIC1(17)  #define IRQ_IIC			S3C64XX_IRQ_VIC1(18) diff --git a/arch/arm/plat-s3c64xx/irq-eint.c b/arch/arm/plat-s3c64xx/irq-eint.c index 1f7cc0067f5..cf524826c93 100644 --- a/arch/arm/plat-s3c64xx/irq-eint.c +++ b/arch/arm/plat-s3c64xx/irq-eint.c @@ -14,12 +14,15 @@  #include <linux/kernel.h>  #include <linux/interrupt.h> +#include <linux/gpio.h>  #include <linux/irq.h>  #include <linux/io.h>  #include <asm/hardware/vic.h>  #include <plat/regs-irqtype.h> +#include <plat/regs-gpio.h> +#include <plat/gpio-cfg.h>  #include <mach/map.h>  #include <plat/cpu.h> @@ -55,7 +58,7 @@ static void s3c_irq_eint_unmask(unsigned int irq)  	u32 mask;  	mask = __raw_readl(S3C64XX_EINT0MASK); -	mask |= eint_irq_to_bit(irq); +	mask &= ~eint_irq_to_bit(irq);  	__raw_writel(mask, S3C64XX_EINT0MASK);  } @@ -74,6 +77,7 @@ static void s3c_irq_eint_maskack(unsigned int irq)  static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type)  {  	int offs = eint_offset(irq); +	int pin;  	int shift;  	u32 ctrl, mask;  	u32 newvalue = 0; @@ -125,6 +129,15 @@ static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type)  	ctrl |= newvalue << shift;  	__raw_writel(ctrl, reg); +	/* set the GPIO pin appropriately */ + +	if (offs < 23) +		pin = S3C64XX_GPN(offs); +	else +		pin = S3C64XX_GPM(offs - 23); + +	s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(2)); +  	return 0;  } @@ -181,7 +194,7 @@ static void s3c_irq_demux_eint20_27(unsigned int irq, struct irq_desc *desc)  	s3c_irq_demux_eint(20, 27);  } -int __init s3c64xx_init_irq_eint(void) +static int __init s3c64xx_init_irq_eint(void)  {  	int irq; diff --git a/arch/arm/plat-s3c64xx/irq.c b/arch/arm/plat-s3c64xx/irq.c index a94f1d5e819..f22edf7c2d2 100644 --- a/arch/arm/plat-s3c64xx/irq.c +++ b/arch/arm/plat-s3c64xx/irq.c @@ -207,7 +207,7 @@ static struct irq_chip s3c_irq_uart = {  static void __init s3c64xx_uart_irq(struct uart_irq *uirq)  { -	void *reg_base = uirq->regs; +	void __iomem *reg_base = uirq->regs;  	unsigned int irq;  	int offs; diff --git a/arch/arm/plat-s3c64xx/s3c6400-clock.c b/arch/arm/plat-s3c64xx/s3c6400-clock.c index 8d9a0cada66..05b17528041 100644 --- a/arch/arm/plat-s3c64xx/s3c6400-clock.c +++ b/arch/arm/plat-s3c64xx/s3c6400-clock.c @@ -36,7 +36,7 @@   * ext_xtal_mux for want of an actual name from the manual.  */ -struct clk clk_ext_xtal_mux = { +static struct clk clk_ext_xtal_mux = {  	.name		= "ext_xtal",  	.id		= -1,  }; @@ -63,7 +63,7 @@ struct clksrc_clk {  	void __iomem		*reg_divider;  }; -struct clk clk_fout_apll = { +static struct clk clk_fout_apll = {  	.name		= "fout_apll",  	.id		= -1,  }; @@ -78,7 +78,7 @@ static struct clk_sources clk_src_apll = {  	.nr_sources	= ARRAY_SIZE(clk_src_apll_list),  }; -struct clksrc_clk clk_mout_apll = { +static struct clksrc_clk clk_mout_apll = {  	.clk	= {  		.name		= "mout_apll",  		.id		= -1, @@ -88,7 +88,7 @@ struct clksrc_clk clk_mout_apll = {  	.sources	= &clk_src_apll,  }; -struct clk clk_fout_epll = { +static struct clk clk_fout_epll = {  	.name		= "fout_epll",  	.id		= -1,  }; @@ -103,7 +103,7 @@ static struct clk_sources clk_src_epll = {  	.nr_sources	= ARRAY_SIZE(clk_src_epll_list),  }; -struct clksrc_clk clk_mout_epll = { +static struct clksrc_clk clk_mout_epll = {  	.clk	= {  		.name		= "mout_epll",  		.id		= -1, @@ -123,7 +123,7 @@ static struct clk_sources clk_src_mpll = {  	.nr_sources	= ARRAY_SIZE(clk_src_mpll_list),  }; -struct clksrc_clk clk_mout_mpll = { +static struct clksrc_clk clk_mout_mpll = {  	.clk = {  		.name		= "mout_mpll",  		.id		= -1, @@ -145,7 +145,7 @@ static unsigned long s3c64xx_clk_doutmpll_get_rate(struct clk *clk)  	return rate;  } -struct clk clk_dout_mpll = { +static struct clk clk_dout_mpll = {  	.name		= "dout_mpll",  	.id		= -1,  	.parent		= &clk_mout_mpll.clk, @@ -189,10 +189,10 @@ static struct clk_sources clkset_uart = {  };  static struct clk *clkset_uhost_list[] = { +	&clk_48m,  	&clk_mout_epll.clk,  	&clk_dout_mpll,  	&clk_fin_epll, -	&clk_48m,  };  static struct clk_sources clkset_uhost = { @@ -239,10 +239,12 @@ static int s3c64xx_setrate_clksrc(struct clk *clk, unsigned long rate)  	rate = clk_round_rate(clk, rate);  	div = clk_get_rate(clk->parent) / rate; +	if (div > 16) +		return -EINVAL;  	val = __raw_readl(reg); -	val &= ~sclk->mask; -	val |= (rate - 1) << sclk->shift; +	val &= ~(0xf << sclk->shift); +	val |= (div - 1) << sclk->shift;  	__raw_writel(val, reg);  	return 0; @@ -351,7 +353,7 @@ static struct clksrc_clk clk_mmc2 = {  static struct clksrc_clk clk_usbhost = {  	.clk	= { -		.name		= "usb-host-bus", +		.name		= "usb-bus-host",  		.id		= -1,  		.ctrlbit        = S3C_CLKCON_SCLK_UHOST,  		.enable		= s3c64xx_sclk_ctrl, diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index fd23c0e9e69..b4211d8b2ac 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types @@ -12,7 +12,7 @@  #  #   http://www.arm.linux.org.uk/developer/machines/?action=new  # -# Last update: Sun Nov 30 16:39:36 2008 +# Last update: Thu Mar 12 18:01:45 2009  #  # machine_is_xxx	CONFIG_xxxx		MACH_TYPE_xxx		number  # @@ -1811,7 +1811,7 @@ pilz_pmi5		MACH_PILZ_PMI5		PILZ_PMI5		1820  jade			MACH_JADE		JADE			1821  ks8695_softplc		MACH_KS8695_SOFTPLC	KS8695_SOFTPLC		1822  gprisc3			MACH_GPRISC3		GPRISC3			1823 -stamp9260		MACH_STAMP9260		STAMP9260		1824 +stamp9g20		MACH_STAMP9G20		STAMP9G20		1824  smdk6430		MACH_SMDK6430		SMDK6430		1825  smdkc100		MACH_SMDKC100		SMDKC100		1826  tavorevb		MACH_TAVOREVB		TAVOREVB		1827 @@ -1993,4 +1993,134 @@ spark			MACH_SPARK		SPARK			2002  benzina			MACH_BENZINA		BENZINA			2003  blaze			MACH_BLAZE		BLAZE			2004  linkstation_ls_hgl	MACH_LINKSTATION_LS_HGL	LINKSTATION_LS_HGL	2005 -htcvenus		MACH_HTCVENUS		HTCVENUS		2006 +htckovsky		MACH_HTCVENUS		HTCVENUS		2006 +sony_prs505		MACH_SONY_PRS505	SONY_PRS505		2007 +hanlin_v3		MACH_HANLIN_V3		HANLIN_V3		2008 +sapphira		MACH_SAPPHIRA		SAPPHIRA		2009 +dack_sda_01		MACH_DACK_SDA_01	DACK_SDA_01		2010 +armbox			MACH_ARMBOX		ARMBOX			2011 +harris_rvp		MACH_HARRIS_RVP		HARRIS_RVP		2012 +ribaldo			MACH_RIBALDO		RIBALDO			2013 +agora			MACH_AGORA		AGORA			2014 +omap3_mini		MACH_OMAP3_MINI		OMAP3_MINI		2015 +a9sam6432_b		MACH_A9SAM6432_B	A9SAM6432_B		2016 +usg2410			MACH_USG2410		USG2410			2017 +pc72052_i10_revb	MACH_PC72052_I10_REVB	PC72052_I10_REVB	2018 +mx35_exm32		MACH_MX35_EXM32		MX35_EXM32		2019 +topas910		MACH_TOPAS910		TOPAS910		2020 +hyena			MACH_HYENA		HYENA			2021 +pospax			MACH_POSPAX		POSPAX			2022 +hdl_gx			MACH_HDL_GX		HDL_GX			2023 +ctera_4bay		MACH_CTERA_4BAY		CTERA_4BAY		2024 +ctera_plug_c		MACH_CTERA_PLUG_C	CTERA_PLUG_C		2025 +crwea_plug_i		MACH_CRWEA_PLUG_I	CRWEA_PLUG_I		2026 +egauge2			MACH_EGAUGE2		EGAUGE2			2027 +didj			MACH_DIDJ		DIDJ			2028 +m_s3c2443		MACH_MEISTER		MEISTER			2029 +htcblackstone		MACH_HTCBLACKSTONE	HTCBLACKSTONE		2030 +cpuat9g20		MACH_CPUAT9G20		CPUAT9G20		2031 +smdk6440		MACH_SMDK6440		SMDK6440		2032 +omap_35xx_mvp		MACH_OMAP_35XX_MVP	OMAP_35XX_MVP		2033 +ctera_plug_i		MACH_CTERA_PLUG_I	CTERA_PLUG_I		2034 +pvg610_100		MACH_PVG610		PVG610			2035 +hprw6815		MACH_HPRW6815		HPRW6815		2036 +omap3_oswald		MACH_OMAP3_OSWALD	OMAP3_OSWALD		2037 +nas4220b		MACH_NAS4220B		NAS4220B		2038 +htcraphael_cdma		MACH_HTCRAPHAEL_CDMA	HTCRAPHAEL_CDMA		2039 +htcdiamond_cdma		MACH_HTCDIAMOND_CDMA	HTCDIAMOND_CDMA		2040 +scaler			MACH_SCALER		SCALER			2041 +zylonite2		MACH_ZYLONITE2		ZYLONITE2		2042 +aspenite		MACH_ASPENITE		ASPENITE		2043 +teton			MACH_TETON		TETON			2044 +ttc_dkb			MACH_TTC_DKB		TTC_DKB			2045 +bishop2			MACH_BISHOP2		BISHOP2			2046 +ippv5			MACH_IPPV5		IPPV5			2047 +farm926			MACH_FARM926		FARM926			2048 +mmccpu			MACH_MMCCPU		MMCCPU			2049 +sgmsfl			MACH_SGMSFL		SGMSFL			2050 +tt8000			MACH_TT8000		TT8000			2051 +zrn4300lp		MACH_ZRN4300LP		ZRN4300LP		2052 +mptc			MACH_MPTC		MPTC			2053 +h6051			MACH_H6051		H6051			2054 +pvg610_101		MACH_PVG610_101		PVG610_101		2055 +stamp9261_pc_evb	MACH_STAMP9261_PC_EVB	STAMP9261_PC_EVB	2056 +pelco_odysseus		MACH_PELCO_ODYSSEUS	PELCO_ODYSSEUS		2057 +tny_a9260		MACH_TNY_A9260		TNY_A9260		2058 +tny_a9g20		MACH_TNY_A9G20		TNY_A9G20		2059 +aesop_mp2530f		MACH_AESOP_MP2530F	AESOP_MP2530F		2060 +dx900			MACH_DX900		DX900			2061 +cpodc2			MACH_CPODC2		CPODC2			2062 +tilt_8925		MACH_TILT_8925		TILT_8925		2063 +davinci_dm357_evm	MACH_DAVINCI_DM357_EVM	DAVINCI_DM357_EVM	2064 +swordfish		MACH_SWORDFISH		SWORDFISH		2065 +corvus			MACH_CORVUS		CORVUS			2066 +taurus			MACH_TAURUS		TAURUS			2067 +axm			MACH_AXM		AXM			2068 +axc			MACH_AXC		AXC			2069 +baby			MACH_BABY		BABY			2070 +mp200			MACH_MP200		MP200			2071 +pcm043			MACH_PCM043		PCM043			2072 +hanlin_v3c		MACH_HANLIN_V3C		HANLIN_V3C		2073 +kbk9g20			MACH_KBK9G20		KBK9G20			2074 +adsturbog5		MACH_ADSTURBOG5		ADSTURBOG5		2075 +avenger_lite1		MACH_AVENGER_LITE1	AVENGER_LITE1		2076 +suc82x			MACH_SUC		SUC			2077 +at91sam7s256		MACH_AT91SAM7S256	AT91SAM7S256		2078 +mendoza			MACH_MENDOZA		MENDOZA			2079 +kira			MACH_KIRA		KIRA			2080 +mx1hbm			MACH_MX1HBM		MX1HBM			2081 +quatro43xx		MACH_QUATRO43XX		QUATRO43XX		2082 +quatro4230		MACH_QUATRO4230		QUATRO4230		2083 +nsb400			MACH_NSB400		NSB400			2084 +drp255			MACH_DRP255		DRP255			2085 +thoth			MACH_THOTH		THOTH			2086 +firestone		MACH_FIRESTONE		FIRESTONE		2087 +asusp750		MACH_ASUSP750		ASUSP750		2088 +ctera_dl		MACH_CTERA_DL		CTERA_DL		2089 +socr			MACH_SOCR		SOCR			2090 +htcoxygen		MACH_HTCOXYGEN		HTCOXYGEN		2091 +heroc			MACH_HEROC		HEROC			2092 +zeno6800		MACH_ZENO6800		ZENO6800		2093 +sc2mcs			MACH_SC2MCS		SC2MCS			2094 +gene100			MACH_GENE100		GENE100			2095 +as353x			MACH_AS353X		AS353X			2096 +sheevaplug		MACH_SHEEVAPLUG		SHEEVAPLUG		2097 +at91sam9g20		MACH_AT91SAM9G20	AT91SAM9G20		2098 +mv88f6192gtw_fe		MACH_MV88F6192GTW_FE	MV88F6192GTW_FE		2099 +cc9200			MACH_CC9200		CC9200			2100 +sm9200			MACH_SM9200		SM9200			2101 +tp9200			MACH_TP9200		TP9200			2102 +snapperdv		MACH_SNAPPERDV		SNAPPERDV		2103 +avengers_lite		MACH_AVENGERS_LITE	AVENGERS_LITE		2104 +avengers_lite1		MACH_AVENGERS_LITE1	AVENGERS_LITE1		2105 +omap3axon		MACH_OMAP3AXON		OMAP3AXON		2106 +ma8xx			MACH_MA8XX		MA8XX			2107 +mp201ek			MACH_MP201EK		MP201EK			2108 +davinci_tux		MACH_DAVINCI_TUX	DAVINCI_TUX		2109 +mpa1600			MACH_MPA1600		MPA1600			2110 +pelco_troy		MACH_PELCO_TROY		PELCO_TROY		2111 +nsb667			MACH_NSB667		NSB667			2112 +rovers5_4mpix		MACH_ROVERS5_4MPIX	ROVERS5_4MPIX		2113 +twocom			MACH_TWOCOM		TWOCOM			2114 +ubisys_p9_rcu3r2	MACH_UBISYS_P9_RCU3R2	UBISYS_P9_RCU3R2	2115 +hero_espresso		MACH_HERO_ESPRESSO	HERO_ESPRESSO		2116 +afeusb			MACH_AFEUSB		AFEUSB			2117 +t830			MACH_T830		T830			2118 +spd8020_cc		MACH_SPD8020_CC		SPD8020_CC		2119 +om_3d7k			MACH_OM_3D7K		OM_3D7K			2120 +picocom2		MACH_PICOCOM2		PICOCOM2		2121 +uwg4mx27		MACH_UWG4MX27		UWG4MX27		2122 +uwg4mx31		MACH_UWG4MX31		UWG4MX31		2123 +cherry			MACH_CHERRY		CHERRY			2124 +mx51_babbage		MACH_MX51_BABBAGE	MX51_BABBAGE		2125 +s3c2440turkiye		MACH_S3C2440TURKIYE	S3C2440TURKIYE		2126 +tx37			MACH_TX37		TX37			2127 +sbc2800_9g20		MACH_SBC2800_9G20	SBC2800_9G20		2128 +benzglb			MACH_BENZGLB		BENZGLB			2129 +benztd			MACH_BENZTD		BENZTD			2130 +cartesio_plus		MACH_CARTESIO_PLUS	CARTESIO_PLUS		2131 +solrad_g20		MACH_SOLRAD_G20		SOLRAD_G20		2132 +mx27wallace		MACH_MX27WALLACE	MX27WALLACE		2133 +fmzwebmodul		MACH_FMZWEBMODUL	FMZWEBMODUL		2134 +rd78x00_masa		MACH_RD78X00_MASA	RD78X00_MASA		2135 +smallogger		MACH_SMALLOGGER		SMALLOGGER		2136 diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index 8f1f97d56e1..0c1f86e3e44 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig @@ -1129,6 +1129,7 @@ endchoice  config PM_WAKEUP_BY_GPIO  	bool "Allow Wakeup from Standby by GPIO" +	depends on PM && !BF54x  config PM_WAKEUP_GPIO_NUMBER  	int "GPIO number" @@ -1168,6 +1169,12 @@ config PM_BFIN_WAKE_GP  	default n  	help  	  Enable General-Purpose Wake-Up (Voltage Regulator Power-Up) +	  (all processors, except ADSP-BF549). This option sets +	  the general-purpose wake-up enable (GPWE) control bit to enable +	  wake-up upon detection of an active low signal on the /GPW (PH7) pin. +	  On ADSP-BF549 this option enables the the same functionality on the +	  /MRXON pin also PH7. +  endmenu  menu "CPU Frequency scaling" diff --git a/arch/blackfin/Kconfig.debug b/arch/blackfin/Kconfig.debug index 5f981d9ca62..79e7e63ab70 100644 --- a/arch/blackfin/Kconfig.debug +++ b/arch/blackfin/Kconfig.debug @@ -21,12 +21,6 @@ config DEBUG_STACK_USAGE  config HAVE_ARCH_KGDB  	def_bool y -config KGDB_TESTCASE -	tristate "KGDB: for test case in expect" -	default n -	help -	  This is a kgdb test case for automated testing. -  config DEBUG_VERBOSE  	bool "Verbose fault messages"  	default y diff --git a/arch/blackfin/configs/BF518F-EZBRD_defconfig b/arch/blackfin/configs/BF518F-EZBRD_defconfig index 4fdb9e04759..281f4b60e60 100644 --- a/arch/blackfin/configs/BF518F-EZBRD_defconfig +++ b/arch/blackfin/configs/BF518F-EZBRD_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.28-rc2 -# Fri Jan  9 17:58:41 2009 +# Linux kernel version: 2.6.28 +# Fri Feb 20 10:01:44 2009  #  # CONFIG_MMU is not set  # CONFIG_FPU is not set @@ -133,10 +133,15 @@ CONFIG_BF518=y  # CONFIG_BF538 is not set  # CONFIG_BF539 is not set  # CONFIG_BF542 is not set +# CONFIG_BF542M is not set  # CONFIG_BF544 is not set +# CONFIG_BF544M is not set  # CONFIG_BF547 is not set +# CONFIG_BF547M is not set  # CONFIG_BF548 is not set +# CONFIG_BF548M is not set  # CONFIG_BF549 is not set +# CONFIG_BF549M is not set  # CONFIG_BF561 is not set  CONFIG_BF_REV_MIN=0  CONFIG_BF_REV_MAX=2 @@ -426,7 +431,17 @@ CONFIG_DEFAULT_TCP_CONG="cubic"  # CONFIG_TIPC is not set  # CONFIG_ATM is not set  # CONFIG_BRIDGE is not set -# CONFIG_NET_DSA is not set +CONFIG_NET_DSA=y +# CONFIG_NET_DSA_TAG_DSA is not set +# CONFIG_NET_DSA_TAG_EDSA is not set +# CONFIG_NET_DSA_TAG_TRAILER is not set +CONFIG_NET_DSA_TAG_STPID=y +# CONFIG_NET_DSA_MV88E6XXX is not set +# CONFIG_NET_DSA_MV88E6060 is not set +# CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set +# CONFIG_NET_DSA_MV88E6131 is not set +# CONFIG_NET_DSA_MV88E6123_61_65 is not set +CONFIG_NET_DSA_KSZ8893M=y  # CONFIG_VLAN_8021Q is not set  # CONFIG_DECNET is not set  # CONFIG_LLC2 is not set @@ -529,6 +544,8 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y  #  # Self-contained MTD device drivers  # +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_M25P80 is not set  # CONFIG_MTD_SLRAM is not set  # CONFIG_MTD_PHRAM is not set  # CONFIG_MTD_MTDRAM is not set @@ -561,7 +578,9 @@ CONFIG_BLK_DEV_RAM_SIZE=4096  # CONFIG_BLK_DEV_HD is not set  CONFIG_MISC_DEVICES=y  # CONFIG_EEPROM_93CX6 is not set +# CONFIG_ICS932S401 is not set  # CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_C2PORT is not set  CONFIG_HAVE_IDE=y  # CONFIG_IDE is not set @@ -607,6 +626,7 @@ CONFIG_BFIN_RX_DESC_NUM=20  # CONFIG_SMC91X is not set  # CONFIG_SMSC911X is not set  # CONFIG_DM9000 is not set +# CONFIG_ENC28J60 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 @@ -764,7 +784,23 @@ CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ=100  # CONFIG_I2C_DEBUG_ALGO is not set  # CONFIG_I2C_DEBUG_BUS is not set  # CONFIG_I2C_DEBUG_CHIP is not set -# CONFIG_SPI is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_BFIN=y +# CONFIG_SPI_BFIN_LOCK is not set +# CONFIG_SPI_BITBANG is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_TLE62X0 is not set  CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y  # CONFIG_GPIOLIB is not set  # CONFIG_W1 is not set @@ -788,8 +824,10 @@ CONFIG_BFIN_WDT=y  # CONFIG_MFD_SM501 is not set  # CONFIG_HTC_PASIC3 is not set  # CONFIG_MFD_TMIO is not set +# CONFIG_PMIC_DA903X is not set  # CONFIG_MFD_WM8400 is not set  # CONFIG_MFD_WM8350_I2C is not set +# CONFIG_REGULATOR is not set  #  # Multimedia devices @@ -861,10 +899,18 @@ CONFIG_RTC_INTF_DEV=y  # CONFIG_RTC_DRV_M41T80 is not set  # CONFIG_RTC_DRV_S35390A is not set  # CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8581 is not set  #  # SPI RTC drivers  # +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_DS3234 is not set  #  # Platform RTC drivers @@ -1062,12 +1108,20 @@ CONFIG_DEBUG_INFO=y  # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set  # CONFIG_FAULT_INJECTION is not set  CONFIG_SYSCTL_SYSCALL_CHECK=y + +# +# Tracers +# +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set  # CONFIG_DYNAMIC_PRINTK_DEBUG is not set  # CONFIG_SAMPLES is not set  CONFIG_HAVE_ARCH_KGDB=y  # CONFIG_KGDB is not set  # CONFIG_DEBUG_STACKOVERFLOW is not set  # CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_KGDB_TESTCASE is not set  CONFIG_DEBUG_VERBOSE=y  CONFIG_DEBUG_MMRS=y  # CONFIG_DEBUG_HWERR is not set @@ -1100,6 +1154,7 @@ CONFIG_CRYPTO=y  #  # CONFIG_CRYPTO_FIPS is not set  # CONFIG_CRYPTO_MANAGER is not set +# CONFIG_CRYPTO_MANAGER2 is not set  # CONFIG_CRYPTO_GF128MUL is not set  # CONFIG_CRYPTO_NULL is not set  # CONFIG_CRYPTO_CRYPTD is not set diff --git a/arch/blackfin/configs/BF527-EZKIT_defconfig b/arch/blackfin/configs/BF527-EZKIT_defconfig index 833128b3972..a50050f1770 100644 --- a/arch/blackfin/configs/BF527-EZKIT_defconfig +++ b/arch/blackfin/configs/BF527-EZKIT_defconfig @@ -327,8 +327,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  # CONFIG_MPU is not set  # diff --git a/arch/blackfin/configs/BF533-EZKIT_defconfig b/arch/blackfin/configs/BF533-EZKIT_defconfig index 334c94b51c4..0a2a00d6388 100644 --- a/arch/blackfin/configs/BF533-EZKIT_defconfig +++ b/arch/blackfin/configs/BF533-EZKIT_defconfig @@ -290,8 +290,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  # CONFIG_MPU is not set  # diff --git a/arch/blackfin/configs/BF533-STAMP_defconfig b/arch/blackfin/configs/BF533-STAMP_defconfig index 9d733436e30..eb027587a35 100644 --- a/arch/blackfin/configs/BF533-STAMP_defconfig +++ b/arch/blackfin/configs/BF533-STAMP_defconfig @@ -290,8 +290,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  # CONFIG_MPU is not set  # diff --git a/arch/blackfin/configs/BF537-STAMP_defconfig b/arch/blackfin/configs/BF537-STAMP_defconfig index 4fb4108d310..9e62b9f40eb 100644 --- a/arch/blackfin/configs/BF537-STAMP_defconfig +++ b/arch/blackfin/configs/BF537-STAMP_defconfig @@ -298,8 +298,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  # CONFIG_MPU is not set  # @@ -568,15 +568,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2  # CONFIG_MTD_DOC2000 is not set  # CONFIG_MTD_DOC2001 is not set  # CONFIG_MTD_DOC2001PLUS is not set -CONFIG_MTD_NAND=m -# CONFIG_MTD_NAND_VERIFY_WRITE is not set -# CONFIG_MTD_NAND_ECC_SMC is not set -# CONFIG_MTD_NAND_MUSEUM_IDS is not set -# CONFIG_MTD_NAND_BFIN is not set -CONFIG_MTD_NAND_IDS=m -# CONFIG_MTD_NAND_DISKONCHIP is not set -# CONFIG_MTD_NAND_NANDSIM is not set -CONFIG_MTD_NAND_PLATFORM=m +# CONFIG_MTD_NAND is not set  # CONFIG_MTD_ONENAND is not set  # diff --git a/arch/blackfin/configs/BF538-EZKIT_defconfig b/arch/blackfin/configs/BF538-EZKIT_defconfig index cb32f5624a1..dd6ad6be1c8 100644 --- a/arch/blackfin/configs/BF538-EZKIT_defconfig +++ b/arch/blackfin/configs/BF538-EZKIT_defconfig @@ -306,8 +306,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  # CONFIG_MPU is not set  # diff --git a/arch/blackfin/configs/BF548-EZKIT_defconfig b/arch/blackfin/configs/BF548-EZKIT_defconfig index 0f8697618aa..6bc2fb1b2a7 100644 --- a/arch/blackfin/configs/BF548-EZKIT_defconfig +++ b/arch/blackfin/configs/BF548-EZKIT_defconfig @@ -361,8 +361,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  # CONFIG_BFIN_L2_CACHEABLE is not set  # CONFIG_MPU is not set @@ -680,7 +680,7 @@ CONFIG_SCSI=y  CONFIG_SCSI_DMA=y  # CONFIG_SCSI_TGT is not set  # CONFIG_SCSI_NETLINK is not set -CONFIG_SCSI_PROC_FS=y +# CONFIG_SCSI_PROC_FS is not set  #  # SCSI support type (disk, tape, CD-ROM) diff --git a/arch/blackfin/configs/BF561-EZKIT_defconfig b/arch/blackfin/configs/BF561-EZKIT_defconfig index 042c7adfccf..69714fb3e60 100644 --- a/arch/blackfin/configs/BF561-EZKIT_defconfig +++ b/arch/blackfin/configs/BF561-EZKIT_defconfig @@ -329,8 +329,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  # CONFIG_BFIN_L2_CACHEABLE is not set  # CONFIG_MPU is not set diff --git a/arch/blackfin/configs/BlackStamp_defconfig b/arch/blackfin/configs/BlackStamp_defconfig index 3a20e281d23..017c6ea071b 100644 --- a/arch/blackfin/configs/BlackStamp_defconfig +++ b/arch/blackfin/configs/BlackStamp_defconfig @@ -288,8 +288,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  # CONFIG_MPU is not set  # diff --git a/arch/blackfin/configs/CM-BF527_defconfig b/arch/blackfin/configs/CM-BF527_defconfig index 865ed85a576..d880ef78677 100644 --- a/arch/blackfin/configs/CM-BF527_defconfig +++ b/arch/blackfin/configs/CM-BF527_defconfig @@ -332,8 +332,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  # CONFIG_MPU is not set  # diff --git a/arch/blackfin/configs/CM-BF548_defconfig b/arch/blackfin/configs/CM-BF548_defconfig index efe9741b1f1..f410430b4e3 100644 --- a/arch/blackfin/configs/CM-BF548_defconfig +++ b/arch/blackfin/configs/CM-BF548_defconfig @@ -336,8 +336,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  CONFIG_L1_MAX_PIECE=16  # CONFIG_MPU is not set @@ -595,7 +595,7 @@ CONFIG_SCSI=y  CONFIG_SCSI_DMA=y  # CONFIG_SCSI_TGT is not set  # CONFIG_SCSI_NETLINK is not set -CONFIG_SCSI_PROC_FS=y +# CONFIG_SCSI_PROC_FS is not set  #  # SCSI support type (disk, tape, CD-ROM) diff --git a/arch/blackfin/configs/IP0X_defconfig b/arch/blackfin/configs/IP0X_defconfig index eae83b5de92..7db93874c98 100644 --- a/arch/blackfin/configs/IP0X_defconfig +++ b/arch/blackfin/configs/IP0X_defconfig @@ -612,7 +612,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024  CONFIG_SCSI=y  # CONFIG_SCSI_TGT is not set  # CONFIG_SCSI_NETLINK is not set -CONFIG_SCSI_PROC_FS=y +# CONFIG_SCSI_PROC_FS is not set  #  # SCSI support type (disk, tape, CD-ROM) diff --git a/arch/blackfin/configs/SRV1_defconfig b/arch/blackfin/configs/SRV1_defconfig index fa580affc9d..a46529c6ade 100644 --- a/arch/blackfin/configs/SRV1_defconfig +++ b/arch/blackfin/configs/SRV1_defconfig @@ -282,8 +282,8 @@ CONFIG_BFIN_ICACHE=y  CONFIG_BFIN_DCACHE=y  # CONFIG_BFIN_DCACHE_BANKA is not set  # CONFIG_BFIN_ICACHE_LOCK is not set -# CONFIG_BFIN_WB is not set -CONFIG_BFIN_WT=y +CONFIG_BFIN_WB=y +# CONFIG_BFIN_WT is not set  CONFIG_L1_MAX_PIECE=16  # diff --git a/arch/blackfin/include/asm/Kbuild b/arch/blackfin/include/asm/Kbuild index 606ecfdcc96..09c31418cc0 100644 --- a/arch/blackfin/include/asm/Kbuild +++ b/arch/blackfin/include/asm/Kbuild @@ -1,3 +1,4 @@  include include/asm-generic/Kbuild.asm +unifdef-y += bfin_sport.h  unifdef-y += fixed_code.h diff --git a/arch/blackfin/include/asm/bfin_sport.h b/arch/blackfin/include/asm/bfin_sport.h index fe88a2c1921..65a651db5b0 100644 --- a/arch/blackfin/include/asm/bfin_sport.h +++ b/arch/blackfin/include/asm/bfin_sport.h @@ -1,30 +1,9 @@  /* - * File:         include/asm-blackfin/bfin_sport.h - * Based on: - * Author:       Roy Huang (roy.huang@analog.com) + * bfin_sport.h - userspace header for bfin sport driver   * - * Created:      Thu Aug. 24 2006 - * Description: + * Copyright 2004-2008 Analog Devices Inc.   * - * Modified: - *               Copyright 2004-2006 Analog Devices Inc. - * - * Bugs:         Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA + * Licensed under the GPL-2 or later.   */  #ifndef __BFIN_SPORT_H__ @@ -42,11 +21,10 @@  #define NORM_FORMAT	0x0  #define ALAW_FORMAT	0x2  #define ULAW_FORMAT	0x3 -struct sport_register;  /* Function driver which use sport must initialize the structure */  struct sport_config { -	/*TDM (multichannels), I2S or other mode */ +	/* TDM (multichannels), I2S or other mode */  	unsigned int mode:3;  	/* if TDM mode is selected, channels must be set */ @@ -72,12 +50,18 @@ struct sport_config {  	int serial_clk;  	int fsync_clk; -	unsigned int data_format:2;	/*Normal, u-law or a-law */ +	unsigned int data_format:2;	/* Normal, u-law or a-law */  	int word_len;		/* How length of the word in bits, 3-32 bits */  	int dma_enabled;  }; +/* Userspace interface */ +#define SPORT_IOC_MAGIC		'P' +#define SPORT_IOC_CONFIG	_IOWR('P', 0x01, struct sport_config) + +#ifdef __KERNEL__ +  struct sport_register {  	unsigned short tcr1;  	unsigned short reserved0; @@ -117,9 +101,6 @@ struct sport_register {  	unsigned long mrcs3;  }; -#define SPORT_IOC_MAGIC		'P' -#define SPORT_IOC_CONFIG	_IOWR('P', 0x01, struct sport_config) -  struct sport_dev {  	struct cdev cdev;	/* Char device structure */ @@ -149,6 +130,8 @@ struct sport_dev {  	struct sport_config config;  }; +#endif +  #define SPORT_TCR1	0  #define	SPORT_TCR2	1  #define	SPORT_TCLKDIV	2 @@ -169,4 +152,4 @@ struct sport_dev {  #define SPORT_MRCS2	22  #define SPORT_MRCS3	23 -#endif				/*__BFIN_SPORT_H__*/ +#endif diff --git a/arch/blackfin/include/asm/ipipe.h b/arch/blackfin/include/asm/ipipe.h index 76f53d8b9a0..343b56361ec 100644 --- a/arch/blackfin/include/asm/ipipe.h +++ b/arch/blackfin/include/asm/ipipe.h @@ -35,9 +35,9 @@  #include <asm/atomic.h>  #include <asm/traps.h> -#define IPIPE_ARCH_STRING     "1.8-00" +#define IPIPE_ARCH_STRING     "1.9-00"  #define IPIPE_MAJOR_NUMBER    1 -#define IPIPE_MINOR_NUMBER    8 +#define IPIPE_MINOR_NUMBER    9  #define IPIPE_PATCH_NUMBER    0  #ifdef CONFIG_SMP @@ -83,9 +83,9 @@ struct ipipe_sysinfo {  				"%2 = CYCLES2\n"		\  				"CC = %2 == %0\n"		\  				"if ! CC jump 1b\n"		\ -				: "=r" (((unsigned long *)&t)[1]),	\ -				  "=r" (((unsigned long *)&t)[0]),	\ -				  "=r" (__cy2)				\ +				: "=d,a" (((unsigned long *)&t)[1]),	\ +				  "=d,a" (((unsigned long *)&t)[0]),	\ +				  "=d,a" (__cy2)				\  				: /*no input*/ : "CC");			\  	t;								\  	}) @@ -118,35 +118,40 @@ void __ipipe_disable_irqdesc(struct ipipe_domain *ipd,  #define __ipipe_disable_irq(irq)	(irq_desc[irq].chip->mask(irq)) -#define __ipipe_lock_root()					\ -	set_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags) +static inline int __ipipe_check_tickdev(const char *devname) +{ +	return 1; +} -#define __ipipe_unlock_root()					\ -	clear_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags) +static inline void __ipipe_lock_root(void) +{ +	set_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status)); +} + +static inline void __ipipe_unlock_root(void) +{ +	clear_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status)); +}  void __ipipe_enable_pipeline(void);  #define __ipipe_hook_critical_ipi(ipd) do { } while (0) -#define __ipipe_sync_pipeline(syncmask)					\ -	do {								\ -		struct ipipe_domain *ipd = ipipe_current_domain;	\ -		if (likely(ipd != ipipe_root_domain || !test_bit(IPIPE_ROOTLOCK_FLAG, &ipd->flags))) \ -			__ipipe_sync_stage(syncmask);			\ -	} while (0) +#define __ipipe_sync_pipeline  ___ipipe_sync_pipeline +void ___ipipe_sync_pipeline(unsigned long syncmask);  void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs);  int __ipipe_get_irq_priority(unsigned irq); -int __ipipe_get_irqthread_priority(unsigned irq); -  void __ipipe_stall_root_raw(void);  void __ipipe_unstall_root_raw(void);  void __ipipe_serial_debug(const char *fmt, ...); +asmlinkage void __ipipe_call_irqtail(unsigned long addr); +  DECLARE_PER_CPU(struct pt_regs, __ipipe_tick_regs);  extern unsigned long __ipipe_core_clock; @@ -162,42 +167,25 @@ static inline unsigned long __ipipe_ffnz(unsigned long ul)  #define __ipipe_run_irqtail()  /* Must be a macro */			\  	do {								\ -		asmlinkage void __ipipe_call_irqtail(void);		\  		unsigned long __pending;				\ -		CSYNC();					\ +		CSYNC();						\  		__pending = bfin_read_IPEND();				\  		if (__pending & 0x8000) {				\  			__pending &= ~0x8010;				\  			if (__pending && (__pending & (__pending - 1)) == 0) \ -				__ipipe_call_irqtail();			\ +				__ipipe_call_irqtail(__ipipe_irq_tail_hook); \  		}							\  	} while (0)  #define __ipipe_run_isr(ipd, irq)					\  	do {								\  		if (ipd == ipipe_root_domain) {				\ -			/*						\ -			 * Note: the I-pipe implements a threaded interrupt model on \ -			 * this arch for Linux external IRQs. The interrupt handler we \ -			 * call here only wakes up the associated IRQ thread. \ -			 */						\ -			if (ipipe_virtual_irq_p(irq)) {			\ -				/* No irqtail here; virtual interrupts have no effect \ -				   on IPEND so there is no need for processing \ -				   deferral. */				\ -				local_irq_enable_nohead(ipd);		\ +			local_irq_enable_hw();				\ +			if (ipipe_virtual_irq_p(irq))			\  				ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \ -				local_irq_disable_nohead(ipd);		\ -			} else						\ -				/*					\ -				 * No need to run the irqtail here either; \ -				 * we can't be preempted by hw IRQs, so	\ -				 * non-Linux IRQs cannot stack over the short \ -				 * thread wakeup code. Which in turn means \ -				 * that no irqtail condition could be pending \ -				 * for domains above Linux in the pipeline. \ -				 */					\ +			else						\  				ipd->irqs[irq].handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs)); \ +			local_irq_disable_hw();				\  		} else {						\  			__clear_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \  			local_irq_enable_nohead(ipd);			\ @@ -217,42 +205,24 @@ void ipipe_init_irq_threads(void);  int ipipe_start_irq_thread(unsigned irq, struct irq_desc *desc); -#define IS_SYSIRQ(irq)		((irq) > IRQ_CORETMR && (irq) <= SYS_IRQS) -#define IS_GPIOIRQ(irq)		((irq) >= GPIO_IRQ_BASE && (irq) < NR_IRQS) - +#ifdef CONFIG_GENERIC_CLOCKEVENTS +#define IRQ_SYSTMR		IRQ_CORETMR +#define IRQ_PRIOTMR		IRQ_CORETMR +#else  #define IRQ_SYSTMR		IRQ_TIMER0  #define IRQ_PRIOTMR		CONFIG_IRQ_TIMER0 +#endif -#if defined(CONFIG_BF531) || defined(CONFIG_BF532) || defined(CONFIG_BF533) -#define PRIO_GPIODEMUX(irq)	CONFIG_PFA -#elif defined(CONFIG_BF534) || defined(CONFIG_BF536) || defined(CONFIG_BF537) -#define PRIO_GPIODEMUX(irq)	CONFIG_IRQ_PROG_INTA -#elif defined(CONFIG_BF52x) -#define PRIO_GPIODEMUX(irq)	((irq) == IRQ_PORTF_INTA ? CONFIG_IRQ_PORTF_INTA : \ -				 (irq) == IRQ_PORTG_INTA ? CONFIG_IRQ_PORTG_INTA : \ -				 (irq) == IRQ_PORTH_INTA ? CONFIG_IRQ_PORTH_INTA : \ -				 -1) -#elif defined(CONFIG_BF561) -#define PRIO_GPIODEMUX(irq)	((irq) == IRQ_PROG0_INTA ? CONFIG_IRQ_PROG0_INTA : \ -				 (irq) == IRQ_PROG1_INTA ? CONFIG_IRQ_PROG1_INTA : \ -				 (irq) == IRQ_PROG2_INTA ? CONFIG_IRQ_PROG2_INTA : \ -				 -1) +#ifdef CONFIG_BF561  #define bfin_write_TIMER_DISABLE(val)	bfin_write_TMRS8_DISABLE(val)  #define bfin_write_TIMER_ENABLE(val)	bfin_write_TMRS8_ENABLE(val)  #define bfin_write_TIMER_STATUS(val)	bfin_write_TMRS8_STATUS(val)  #define bfin_read_TIMER_STATUS()	bfin_read_TMRS8_STATUS()  #elif defined(CONFIG_BF54x) -#define PRIO_GPIODEMUX(irq)	((irq) == IRQ_PINT0 ? CONFIG_IRQ_PINT0 : \ -				 (irq) == IRQ_PINT1 ? CONFIG_IRQ_PINT1 : \ -				 (irq) == IRQ_PINT2 ? CONFIG_IRQ_PINT2 : \ -				 (irq) == IRQ_PINT3 ? CONFIG_IRQ_PINT3 : \ -				 -1)  #define bfin_write_TIMER_DISABLE(val)	bfin_write_TIMER_DISABLE0(val)  #define bfin_write_TIMER_ENABLE(val)	bfin_write_TIMER_ENABLE0(val)  #define bfin_write_TIMER_STATUS(val)	bfin_write_TIMER_STATUS0(val)  #define bfin_read_TIMER_STATUS(val)	bfin_read_TIMER_STATUS0(val) -#else -# error "no PRIO_GPIODEMUX() for this part"  #endif  #define __ipipe_root_tick_p(regs)	((regs->ipend & 0x10) != 0) @@ -275,4 +245,6 @@ int ipipe_start_irq_thread(unsigned irq, struct irq_desc *desc);  #endif /* !CONFIG_IPIPE */ +#define ipipe_update_tick_evtdev(evtdev)	do { } while (0) +  #endif	/* !__ASM_BLACKFIN_IPIPE_H */ diff --git a/arch/blackfin/include/asm/ipipe_base.h b/arch/blackfin/include/asm/ipipe_base.h index cb1025aeabc..3e8acbd1a3b 100644 --- a/arch/blackfin/include/asm/ipipe_base.h +++ b/arch/blackfin/include/asm/ipipe_base.h @@ -1,5 +1,5 @@  /*   -*- linux-c -*- - *   include/asm-blackfin/_baseipipe.h + *   include/asm-blackfin/ipipe_base.h   *   *   Copyright (C) 2007 Philippe Gerum.   * @@ -27,8 +27,9 @@  #define IPIPE_NR_XIRQS		NR_IRQS  #define IPIPE_IRQ_ISHIFT	5	/* 2^5 for 32bits arch. */ -/* Blackfin-specific, global domain flags */ -#define IPIPE_ROOTLOCK_FLAG	1	/* Lock pipeline for root */ +/* Blackfin-specific, per-cpu pipeline status */ +#define IPIPE_SYNCDEFER_FLAG	15 +#define IPIPE_SYNCDEFER_MASK	(1L << IPIPE_SYNCDEFER_MASK)   /* Blackfin traps -- i.e. exception vector numbers */  #define IPIPE_NR_FAULTS		52 /* We leave a gap after VEC_ILL_RES. */ @@ -48,11 +49,6 @@  #ifndef __ASSEMBLY__ -#include <linux/bitops.h> - -extern int test_bit(int nr, const void *addr); - -  extern unsigned long __ipipe_root_status; /* Alias to ipipe_root_cpudom_var(status) */  static inline void __ipipe_stall_root(void) diff --git a/arch/blackfin/include/asm/irq.h b/arch/blackfin/include/asm/irq.h index 3d977909ce7..7645e85a5f6 100644 --- a/arch/blackfin/include/asm/irq.h +++ b/arch/blackfin/include/asm/irq.h @@ -61,20 +61,38 @@ void __ipipe_restore_root(unsigned long flags);  #define raw_irqs_disabled_flags(flags)	(!irqs_enabled_from_flags_hw(flags))  #define local_test_iflag_hw(x)		irqs_enabled_from_flags_hw(x) -#define local_save_flags(x)						\ -	do {								\ -		(x) = __ipipe_test_root() ? \ +#define local_save_flags(x)					 \ +	do {							 \ +		(x) = __ipipe_test_root() ?			 \  			__all_masked_irq_flags : bfin_irq_flags; \ +		barrier();					 \  	} while (0) -#define local_irq_save(x)				\ -	do {						\ -		(x) = __ipipe_test_and_stall_root();	\ +#define local_irq_save(x)					 \ +	do {						 	 \ +		(x) = __ipipe_test_and_stall_root() ?		 \ +			__all_masked_irq_flags : bfin_irq_flags; \ +		barrier();					 \ +	} while (0) + +static inline void local_irq_restore(unsigned long x) +{ +	barrier(); +	__ipipe_restore_root(x == __all_masked_irq_flags); +} + +#define local_irq_disable()			\ +	do {					\ +		__ipipe_stall_root();		\ +		barrier();			\  	} while (0) -#define local_irq_restore(x)	__ipipe_restore_root(x) -#define local_irq_disable()	__ipipe_stall_root() -#define local_irq_enable()	__ipipe_unstall_root() +static inline void local_irq_enable(void) +{ +	barrier(); +	__ipipe_unstall_root(); +} +  #define irqs_disabled()		__ipipe_test_root()  #define local_save_flags_hw(x) \ diff --git a/arch/blackfin/include/asm/thread_info.h b/arch/blackfin/include/asm/thread_info.h index e721ce55956..2920087516f 100644 --- a/arch/blackfin/include/asm/thread_info.h +++ b/arch/blackfin/include/asm/thread_info.h @@ -122,6 +122,7 @@ static inline struct thread_info *current_thread_info(void)  #define TIF_MEMDIE              4  #define TIF_RESTORE_SIGMASK	5	/* restore signal mask in do_signal() */  #define TIF_FREEZE              6       /* is freezing for suspend */ +#define TIF_IRQ_SYNC            7       /* sync pipeline stage */  /* as above, but as bit values */  #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE) @@ -130,6 +131,7 @@ static inline struct thread_info *current_thread_info(void)  #define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)  #define _TIF_RESTORE_SIGMASK	(1<<TIF_RESTORE_SIGMASK)  #define _TIF_FREEZE             (1<<TIF_FREEZE) +#define _TIF_IRQ_SYNC           (1<<TIF_IRQ_SYNC)  #define _TIF_WORK_MASK		0x0000FFFE	/* work to do on interrupt/exception return */ diff --git a/arch/blackfin/kernel/Makefile b/arch/blackfin/kernel/Makefile index 4a92a86824b..fd4d4328a0f 100644 --- a/arch/blackfin/kernel/Makefile +++ b/arch/blackfin/kernel/Makefile @@ -15,13 +15,15 @@ else      obj-y += time.o  endif -CFLAGS_kgdb_test.o := -mlong-calls -O0 -  obj-$(CONFIG_IPIPE)                  += ipipe.o  obj-$(CONFIG_IPIPE_TRACE_MCOUNT)     += mcount.o  obj-$(CONFIG_BFIN_GPTIMERS)          += gptimers.o  obj-$(CONFIG_CPLB_INFO)              += cplbinfo.o  obj-$(CONFIG_MODULES)                += module.o  obj-$(CONFIG_KGDB)                   += kgdb.o -obj-$(CONFIG_KGDB_TESTCASE)          += kgdb_test.o +obj-$(CONFIG_KGDB_TESTS)             += kgdb_test.o  obj-$(CONFIG_EARLY_PRINTK)           += early_printk.o + +# the kgdb test puts code into L2 and without linker +# relaxation, we need to force long calls to/from it +CFLAGS_kgdb_test.o := -mlong-calls -O0 diff --git a/arch/blackfin/kernel/cplb-nompu/cplbinit.c b/arch/blackfin/kernel/cplb-nompu/cplbinit.c index 0e28f759573..d6c067782e6 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbinit.c @@ -53,9 +53,13 @@ void __init generate_cplb_tables_cpu(unsigned int cpu)  	i_d = i_i = 0; +#ifdef CONFIG_DEBUG_HUNT_FOR_ZERO  	/* Set up the zero page.  */  	d_tbl[i_d].addr = 0;  	d_tbl[i_d++].data = SDRAM_OOPS | PAGE_SIZE_1KB; +	i_tbl[i_i].addr = 0; +	i_tbl[i_i++].data = SDRAM_OOPS | PAGE_SIZE_1KB; +#endif  	/* Cover kernel memory with 4M pages.  */  	addr = 0; diff --git a/arch/blackfin/kernel/ipipe.c b/arch/blackfin/kernel/ipipe.c index 339be5a3ae6..a5de8d45424 100644 --- a/arch/blackfin/kernel/ipipe.c +++ b/arch/blackfin/kernel/ipipe.c @@ -35,14 +35,8 @@  #include <asm/atomic.h>  #include <asm/io.h> -static int create_irq_threads; -  DEFINE_PER_CPU(struct pt_regs, __ipipe_tick_regs); -static DEFINE_PER_CPU(unsigned long, pending_irqthread_mask); - -static DEFINE_PER_CPU(int [IVG13 + 1], pending_irq_count); -  asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs);  static void __ipipe_no_irqtail(void); @@ -93,6 +87,7 @@ void __ipipe_enable_pipeline(void)   */  void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)  { +	struct ipipe_percpu_domain_data *p = ipipe_root_cpudom_ptr();  	struct ipipe_domain *this_domain, *next_domain;  	struct list_head *head, *pos;  	int m_ack, s = -1; @@ -104,7 +99,6 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)  	 * interrupt.  	 */  	m_ack = (regs == NULL || irq == IRQ_SYSTMR || irq == IRQ_CORETMR); -  	this_domain = ipipe_current_domain;  	if (unlikely(test_bit(IPIPE_STICKY_FLAG, &this_domain->irqs[irq].control))) @@ -114,49 +108,28 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)  		next_domain = list_entry(head, struct ipipe_domain, p_link);  		if (likely(test_bit(IPIPE_WIRED_FLAG, &next_domain->irqs[irq].control))) {  			if (!m_ack && next_domain->irqs[irq].acknowledge != NULL) -				next_domain->irqs[irq].acknowledge(irq, irq_desc + irq); -			if (test_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags)) -				s = __test_and_set_bit(IPIPE_STALL_FLAG, -						       &ipipe_root_cpudom_var(status)); +				next_domain->irqs[irq].acknowledge(irq, irq_to_desc(irq)); +			if (test_bit(IPIPE_SYNCDEFER_FLAG, &p->status)) +				s = __test_and_set_bit(IPIPE_STALL_FLAG, &p->status);  			__ipipe_dispatch_wired(next_domain, irq); -				goto finalize; -			return; +			goto out;  		}  	}  	/* Ack the interrupt. */  	pos = head; -  	while (pos != &__ipipe_pipeline) {  		next_domain = list_entry(pos, struct ipipe_domain, p_link); -		/* -		 * For each domain handling the incoming IRQ, mark it -		 * as pending in its log. -		 */  		if (test_bit(IPIPE_HANDLE_FLAG, &next_domain->irqs[irq].control)) { -			/* -			 * Domains that handle this IRQ are polled for -			 * acknowledging it by decreasing priority -			 * order. The interrupt must be made pending -			 * _first_ in the domain's status flags before -			 * the PIC is unlocked. -			 */  			__ipipe_set_irq_pending(next_domain, irq); -  			if (!m_ack && next_domain->irqs[irq].acknowledge != NULL) { -				next_domain->irqs[irq].acknowledge(irq, irq_desc + irq); +				next_domain->irqs[irq].acknowledge(irq, irq_to_desc(irq));  				m_ack = 1;  			}  		} - -		/* -		 * If the domain does not want the IRQ to be passed -		 * down the interrupt pipe, exit the loop now. -		 */  		if (!test_bit(IPIPE_PASS_FLAG, &next_domain->irqs[irq].control))  			break; -  		pos = next_domain->p_link.next;  	} @@ -166,18 +139,24 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs)  	 * immediately to the current domain if the interrupt has been  	 * marked as 'sticky'. This search does not go beyond the  	 * current domain in the pipeline. We also enforce the -	 * additional root stage lock (blackfin-specific). */ +	 * additional root stage lock (blackfin-specific). +	 */ +	if (test_bit(IPIPE_SYNCDEFER_FLAG, &p->status)) +		s = __test_and_set_bit(IPIPE_STALL_FLAG, &p->status); -	if (test_bit(IPIPE_ROOTLOCK_FLAG, &ipipe_root_domain->flags)) -		s = __test_and_set_bit(IPIPE_STALL_FLAG, -				       &ipipe_root_cpudom_var(status)); -finalize: +	/* +	 * If the interrupt preempted the head domain, then do not +	 * even try to walk the pipeline, unless an interrupt is +	 * pending for it. +	 */ +	if (test_bit(IPIPE_AHEAD_FLAG, &this_domain->flags) && +	    ipipe_head_cpudom_var(irqpend_himask) == 0) +		goto out;  	__ipipe_walk_pipeline(head); - +out:  	if (!s) -		__clear_bit(IPIPE_STALL_FLAG, -			    &ipipe_root_cpudom_var(status)); +		__clear_bit(IPIPE_STALL_FLAG, &p->status);  }  int __ipipe_check_root(void) @@ -187,7 +166,7 @@ int __ipipe_check_root(void)  void __ipipe_enable_irqdesc(struct ipipe_domain *ipd, unsigned irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	int prio = desc->ic_prio;  	desc->depth = 0; @@ -199,7 +178,7 @@ EXPORT_SYMBOL(__ipipe_enable_irqdesc);  void __ipipe_disable_irqdesc(struct ipipe_domain *ipd, unsigned irq)  { -	struct irq_desc *desc = irq_desc + irq; +	struct irq_desc *desc = irq_to_desc(irq);  	int prio = desc->ic_prio;  	if (ipd != &ipipe_root && @@ -236,15 +215,18 @@ int __ipipe_syscall_root(struct pt_regs *regs)  {  	unsigned long flags; -	/* We need to run the IRQ tail hook whenever we don't +	/* +	 * We need to run the IRQ tail hook whenever we don't  	 * propagate a syscall to higher domains, because we know that  	 * important operations might be pending there (e.g. Xenomai -	 * deferred rescheduling). */ +	 * deferred rescheduling). +	 */ -	if (!__ipipe_syscall_watched_p(current, regs->orig_p0)) { +	if (regs->orig_p0 < NR_syscalls) {  		void (*hook)(void) = (void (*)(void))__ipipe_irq_tail_hook;  		hook(); -		return 0; +		if ((current->flags & PF_EVNOTIFY) == 0) +			return 0;  	}  	/* @@ -312,112 +294,46 @@ int ipipe_trigger_irq(unsigned irq)  {  	unsigned long flags; +#ifdef CONFIG_IPIPE_DEBUG  	if (irq >= IPIPE_NR_IRQS ||  	    (ipipe_virtual_irq_p(irq)  	     && !test_bit(irq - IPIPE_VIRQ_BASE, &__ipipe_virtual_irq_map)))  		return -EINVAL; +#endif  	local_irq_save_hw(flags); -  	__ipipe_handle_irq(irq, NULL); -  	local_irq_restore_hw(flags);  	return 1;  } -/* Move Linux IRQ to threads. */ - -static int do_irqd(void *__desc) +asmlinkage void __ipipe_sync_root(void)  { -	struct irq_desc *desc = __desc; -	unsigned irq = desc - irq_desc; -	int thrprio = desc->thr_prio; -	int thrmask = 1 << thrprio; -	int cpu = smp_processor_id(); -	cpumask_t cpumask; - -	sigfillset(¤t->blocked); -	current->flags |= PF_NOFREEZE; -	cpumask = cpumask_of_cpu(cpu); -	set_cpus_allowed(current, cpumask); -	ipipe_setscheduler_root(current, SCHED_FIFO, 50 + thrprio); - -	while (!kthread_should_stop()) { -		local_irq_disable(); -		if (!(desc->status & IRQ_SCHEDULED)) { -			set_current_state(TASK_INTERRUPTIBLE); -resched: -			local_irq_enable(); -			schedule(); -			local_irq_disable(); -		} -		__set_current_state(TASK_RUNNING); -		/* -		 * If higher priority interrupt servers are ready to -		 * run, reschedule immediately. We need this for the -		 * GPIO demux IRQ handler to unmask the interrupt line -		 * _last_, after all GPIO IRQs have run. -		 */ -		if (per_cpu(pending_irqthread_mask, cpu) & ~(thrmask|(thrmask-1))) -			goto resched; -		if (--per_cpu(pending_irq_count[thrprio], cpu) == 0) -			per_cpu(pending_irqthread_mask, cpu) &= ~thrmask; -		desc->status &= ~IRQ_SCHEDULED; -		desc->thr_handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs)); -		local_irq_enable(); -	} -	__set_current_state(TASK_RUNNING); -	return 0; -} - -static void kick_irqd(unsigned irq, void *cookie) -{ -	struct irq_desc *desc = irq_desc + irq; -	int thrprio = desc->thr_prio; -	int thrmask = 1 << thrprio; -	int cpu = smp_processor_id(); - -	if (!(desc->status & IRQ_SCHEDULED)) { -		desc->status |= IRQ_SCHEDULED; -		per_cpu(pending_irqthread_mask, cpu) |= thrmask; -		++per_cpu(pending_irq_count[thrprio], cpu); -		wake_up_process(desc->thread); -	} -} +	unsigned long flags; -int ipipe_start_irq_thread(unsigned irq, struct irq_desc *desc) -{ -	if (desc->thread || !create_irq_threads) -		return 0; +	BUG_ON(irqs_disabled()); -	desc->thread = kthread_create(do_irqd, desc, "IRQ %d", irq); -	if (desc->thread == NULL) { -		printk(KERN_ERR "irqd: could not create IRQ thread %d!\n", irq); -		return -ENOMEM; -	} +	local_irq_save_hw(flags); -	wake_up_process(desc->thread); +	clear_thread_flag(TIF_IRQ_SYNC); -	desc->thr_handler = ipipe_root_domain->irqs[irq].handler; -	ipipe_root_domain->irqs[irq].handler = &kick_irqd; +	if (ipipe_root_cpudom_var(irqpend_himask) != 0) +		__ipipe_sync_pipeline(IPIPE_IRQMASK_ANY); -	return 0; +	local_irq_restore_hw(flags);  } -void __init ipipe_init_irq_threads(void) +void ___ipipe_sync_pipeline(unsigned long syncmask)  { -	unsigned irq; -	struct irq_desc *desc; - -	create_irq_threads = 1; +	struct ipipe_domain *ipd = ipipe_current_domain; -	for (irq = 0; irq < NR_IRQS; irq++) { -		desc = irq_desc + irq; -		if (desc->action != NULL || -			(desc->status & IRQ_NOREQUEST) != 0) -			ipipe_start_irq_thread(irq, desc); +	if (ipd == ipipe_root_domain) { +		if (test_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status))) +			return;  	} + +	__ipipe_sync_stage(syncmask);  }  EXPORT_SYMBOL(show_stack); diff --git a/arch/blackfin/kernel/irqchip.c b/arch/blackfin/kernel/irqchip.c index 75724eee649..7fd12656484 100644 --- a/arch/blackfin/kernel/irqchip.c +++ b/arch/blackfin/kernel/irqchip.c @@ -144,11 +144,15 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)  #endif  	generic_handle_irq(irq); -#ifndef CONFIG_IPIPE	/* Useless and bugous over the I-pipe: IRQs are threaded. */ -	/* If we're the only interrupt running (ignoring IRQ15 which is for -	   syscalls), lower our priority to IRQ14 so that softirqs run at -	   that level.  If there's another, lower-level interrupt, irq_exit -	   will defer softirqs to that.  */ +#ifndef CONFIG_IPIPE +	/* +	 * If we're the only interrupt running (ignoring IRQ15 which +	 * is for syscalls), lower our priority to IRQ14 so that +	 * softirqs run at that level.  If there's another, +	 * lower-level interrupt, irq_exit will defer softirqs to +	 * that. If the interrupt pipeline is enabled, we are already +	 * running at IRQ14 priority, so we don't need this code. +	 */  	CSYNC();  	pending = bfin_read_IPEND() & ~0x8000;  	other_ints = pending & (pending - 1); diff --git a/arch/blackfin/kernel/kgdb_test.c b/arch/blackfin/kernel/kgdb_test.c index 3dba9c17304..dbcf3e45cb0 100644 --- a/arch/blackfin/kernel/kgdb_test.c +++ b/arch/blackfin/kernel/kgdb_test.c @@ -20,6 +20,7 @@  static char cmdline[256];  static unsigned long len; +#ifndef CONFIG_SMP  static int num1 __attribute__((l1_data));  void kgdb_l1_test(void) __attribute__((l1_text)); @@ -32,6 +33,8 @@ void kgdb_l1_test(void)  	printk(KERN_ALERT "L1(after change) : data variable addr = 0x%p, data value is %d\n", &num1, num1);  	return ;  } +#endif +  #if L2_LENGTH  static int num2 __attribute__((l2)); @@ -59,10 +62,12 @@ int kgdb_test(char *name, int len, int count, int z)  static int test_proc_output(char *buf)  {  	kgdb_test("hello world!", 12, 0x55, 0x10); +#ifndef CONFIG_SMP  	kgdb_l1_test(); -	#if L2_LENGTH +#endif +#if L2_LENGTH  	kgdb_l2_test(); -	#endif +#endif  	return 0;  } diff --git a/arch/blackfin/kernel/ptrace.c b/arch/blackfin/kernel/ptrace.c index 594e325b40e..d76618db50d 100644 --- a/arch/blackfin/kernel/ptrace.c +++ b/arch/blackfin/kernel/ptrace.c @@ -45,6 +45,7 @@  #include <asm/asm-offsets.h>  #include <asm/dma.h>  #include <asm/fixed_code.h> +#include <asm/cacheflush.h>  #include <asm/mem_map.h>  #define TEXT_OFFSET 0 @@ -240,7 +241,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)  			} else if (addr >= FIXED_CODE_START  			    && addr + sizeof(tmp) <= FIXED_CODE_END) { -				memcpy(&tmp, (const void *)(addr), sizeof(tmp)); +				copy_from_user_page(0, 0, 0, &tmp, (const void *)(addr), sizeof(tmp));  				copied = sizeof(tmp);  			} else @@ -320,7 +321,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)  			} else if (addr >= FIXED_CODE_START  			    && addr + sizeof(data) <= FIXED_CODE_END) { -				memcpy((void *)(addr), &data, sizeof(data)); +				copy_to_user_page(0, 0, 0, (void *)(addr), &data, sizeof(data));  				copied = sizeof(data);  			} else diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index e5c11623080..a58687bdee6 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c @@ -889,6 +889,10 @@ void __init setup_arch(char **cmdline_p)  			       CPU, bfin_revid());  	} +	/* We can't run on BF548-0.1 due to ANOMALY 05000448 */ +	if (bfin_cpuid() == 0x27de && bfin_revid() == 1) +		panic("You can't run on this processor due to 05000448\n"); +  	printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n");  	printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n", @@ -1141,12 +1145,12 @@ static int show_cpuinfo(struct seq_file *m, void *v)  		icache_size = 0;  	seq_printf(m, "cache size\t: %d KB(L1 icache) " -		"%d KB(L1 dcache-%s) %d KB(L2 cache)\n", +		"%d KB(L1 dcache%s) %d KB(L2 cache)\n",  		icache_size, dcache_size,  #if defined CONFIG_BFIN_WB -		"wb" +		"-wb"  #elif defined CONFIG_BFIN_WT -		"wt" +		"-wt"  #endif  		"", 0); diff --git a/arch/blackfin/kernel/time.c b/arch/blackfin/kernel/time.c index 172b4c58846..1bbacfbd4c5 100644 --- a/arch/blackfin/kernel/time.c +++ b/arch/blackfin/kernel/time.c @@ -134,7 +134,10 @@ irqreturn_t timer_interrupt(int irq, void *dummy)  	write_seqlock(&xtime_lock);  #if defined(CONFIG_TICK_SOURCE_SYSTMR0) && !defined(CONFIG_IPIPE) -/* FIXME: Here TIMIL0 is not set when IPIPE enabled, why? */ +	/* +	 * TIMIL0 is latched in __ipipe_grab_irq() when the I-Pipe is +	 * enabled. +	 */  	if (get_gptimer_status(0) & TIMER_STATUS_TIMIL0) {  #endif  		do_timer(1); diff --git a/arch/blackfin/mach-bf518/boards/ezbrd.c b/arch/blackfin/mach-bf518/boards/ezbrd.c index 0e175342112..41f2eacfef2 100644 --- a/arch/blackfin/mach-bf518/boards/ezbrd.c +++ b/arch/blackfin/mach-bf518/boards/ezbrd.c @@ -113,7 +113,6 @@ static struct platform_device bfin_mac_device = {  	.name = "bfin_mac",  	.dev.platform_data = &bfin_mii_bus,  }; -#endif  #if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)  static struct dsa_platform_data ksz8893m_switch_data = { @@ -132,6 +131,7 @@ static struct platform_device ksz8893m_switch_device = {  	.dev.platform_data = &ksz8893m_switch_data,  };  #endif +#endif  #if defined(CONFIG_MTD_M25P80) \  	|| defined(CONFIG_MTD_M25P80_MODULE) @@ -171,6 +171,7 @@ static struct bfin5xx_spi_chip spi_adc_chip_info = {  };  #endif +#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)  #if defined(CONFIG_NET_DSA_KSZ8893M) \  	|| defined(CONFIG_NET_DSA_KSZ8893M_MODULE)  /* SPI SWITCH CHIP */ @@ -179,10 +180,11 @@ static struct bfin5xx_spi_chip spi_switch_info = {  	.bits_per_word = 8,  };  #endif +#endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -259,6 +261,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  	},  #endif +#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)  #if defined(CONFIG_NET_DSA_KSZ8893M) \  	|| defined(CONFIG_NET_DSA_KSZ8893M_MODULE)  	{ @@ -271,24 +274,15 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  		.mode = SPI_MODE_3,  	},  #endif +#endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc_dummy", +		.modalias = "mmc_spi",  		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = 0, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, -	{ -		.modalias = "spi_mmc", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif @@ -630,11 +624,10 @@ static struct platform_device *stamp_devices[] __initdata = {  #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)  	&bfin_mii_bus,  	&bfin_mac_device, -#endif -  #if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE)  	&ksz8893m_switch_device,  #endif +#endif  #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)  	&bfin_spi0_device, diff --git a/arch/blackfin/mach-bf518/include/mach/anomaly.h b/arch/blackfin/mach-bf518/include/mach/anomaly.h index e5b4bef0eda..c847bb10107 100644 --- a/arch/blackfin/mach-bf518/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf518/include/mach/anomaly.h @@ -2,12 +2,12 @@   * File: include/asm-blackfin/mach-bf518/anomaly.h   * Bugs: Enter bugs at http://blackfin.uclinux.org/   * - * Copyright (C) 2004-2008 Analog Devices Inc. + * Copyright (C) 2004-2009 Analog Devices Inc.   * Licensed under the GPL-2 or later.   */  /* This file shoule be up to date with: - *  - ???? + *  - Revision B, 02/03/2009; ADSP-BF512/BF514/BF516/BF518 Blackfin Processor Anomaly List   */  #ifndef _MACH_ANOMALY_H_ @@ -19,6 +19,8 @@  #define ANOMALY_05000122 (1)  /* False Hardware Error from an Access in the Shadow of a Conditional Branch */  #define ANOMALY_05000245 (1) +/* Incorrect Timer Pulse Width in Single-Shot PWM_OUT Mode with External Clock */ +#define ANOMALY_05000254 (1)  /* Sensitivity To Noise with Slow Input Edge Rates on External SPORT TX and RX Clocks */  #define ANOMALY_05000265 (1)  /* False Hardware Errors Caused by Fetches at the Boundary of Reserved Memory */ @@ -53,6 +55,12 @@  #define ANOMALY_05000443 (1)  /* Incorrect L1 Instruction Bank B Memory Map Location */  #define ANOMALY_05000444 (1) +/* Incorrect Default Hysteresis Setting for RESET, NMI, and BMODE Signals */ +#define ANOMALY_05000452 (1) +/* PWM_TRIPB Signal Not Available on PG10 */ +#define ANOMALY_05000453 (1) +/* PPI_FS3 is Driven One Half Cycle Later Than PPI Data */ +#define ANOMALY_05000455 (1)  /* Anomalies that don't exist on this proc */  #define ANOMALY_05000125 (0) @@ -65,15 +73,20 @@  #define ANOMALY_05000263 (0)  #define ANOMALY_05000266 (0)  #define ANOMALY_05000273 (0) +#define ANOMALY_05000278 (0)  #define ANOMALY_05000285 (0) +#define ANOMALY_05000305 (0)  #define ANOMALY_05000307 (0)  #define ANOMALY_05000311 (0)  #define ANOMALY_05000312 (0)  #define ANOMALY_05000323 (0)  #define ANOMALY_05000353 (0)  #define ANOMALY_05000363 (0) +#define ANOMALY_05000380 (0)  #define ANOMALY_05000386 (0)  #define ANOMALY_05000412 (0)  #define ANOMALY_05000432 (0) +#define ANOMALY_05000447 (0) +#define ANOMALY_05000448 (0)  #endif diff --git a/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h index b50a63b975a..e21c1c3e4ec 100644 --- a/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf518/include/mach/bfin_serial_5xx.h @@ -144,7 +144,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	 CH_UART0_TX,  	 CH_UART0_RX,  #endif -#ifdef CONFIG_BFIN_UART0_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	 CONFIG_UART0_CTS_PIN,  	 CONFIG_UART0_RTS_PIN,  #endif @@ -158,7 +158,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	 CH_UART1_TX,  	 CH_UART1_RX,  #endif -#ifdef CONFIG_BFIN_UART1_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	 CONFIG_UART1_CTS_PIN,  	 CONFIG_UART1_RTS_PIN,  #endif diff --git a/arch/blackfin/mach-bf527/boards/cm_bf527.c b/arch/blackfin/mach-bf527/boards/cm_bf527.c index 856c097b531..48e69eecdba 100644 --- a/arch/blackfin/mach-bf527/boards/cm_bf527.c +++ b/arch/blackfin/mach-bf527/boards/cm_bf527.c @@ -487,9 +487,9 @@ static struct bfin5xx_spi_chip ad9960_spi_chip_info = {  };  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip  mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -585,23 +585,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  		.controller_data = &ad9960_spi_chip_info,  	},  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc_dummy", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 0, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, -	{ -		.modalias = "spi_mmc", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ +		.modalias = "mmc_spi", +		.max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif diff --git a/arch/blackfin/mach-bf527/boards/ezbrd.c b/arch/blackfin/mach-bf527/boards/ezbrd.c index 83606fcdde2..7fe480e4ebe 100644 --- a/arch/blackfin/mach-bf527/boards/ezbrd.c +++ b/arch/blackfin/mach-bf527/boards/ezbrd.c @@ -256,9 +256,9 @@ static struct bfin5xx_spi_chip spi_adc_chip_info = {  };  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -366,23 +366,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  	},  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc_dummy", +		.modalias = "mmc_spi",  		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = 0, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, -	{ -		.modalias = "spi_mmc", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif diff --git a/arch/blackfin/mach-bf527/include/mach/anomaly.h b/arch/blackfin/mach-bf527/include/mach/anomaly.h index 035e8d83505..df6808d8a6e 100644 --- a/arch/blackfin/mach-bf527/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf527/include/mach/anomaly.h @@ -2,7 +2,7 @@   * File: include/asm-blackfin/mach-bf527/anomaly.h   * Bugs: Enter bugs at http://blackfin.uclinux.org/   * - * Copyright (C) 2004-2008 Analog Devices Inc. + * Copyright (C) 2004-2009 Analog Devices Inc.   * Licensed under the GPL-2 or later.   */ @@ -167,12 +167,16 @@  #define ANOMALY_05000263 (0)  #define ANOMALY_05000266 (0)  #define ANOMALY_05000273 (0) +#define ANOMALY_05000278 (0)  #define ANOMALY_05000285 (0) +#define ANOMALY_05000305 (0)  #define ANOMALY_05000307 (0)  #define ANOMALY_05000311 (0)  #define ANOMALY_05000312 (0)  #define ANOMALY_05000323 (0)  #define ANOMALY_05000363 (0)  #define ANOMALY_05000412 (0) +#define ANOMALY_05000447 (0) +#define ANOMALY_05000448 (0)  #endif diff --git a/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h index 75722d6008b..e8c41fd842b 100644 --- a/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf527/include/mach/bfin_serial_5xx.h @@ -144,7 +144,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	 CH_UART0_TX,  	 CH_UART0_RX,  #endif -#ifdef CONFIG_BFIN_UART0_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	 CONFIG_UART0_CTS_PIN,  	 CONFIG_UART0_RTS_PIN,  #endif @@ -158,7 +158,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	 CH_UART1_TX,  	 CH_UART1_RX,  #endif -#ifdef CONFIG_BFIN_UART1_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	 CONFIG_UART1_CTS_PIN,  	 CONFIG_UART1_RTS_PIN,  #endif diff --git a/arch/blackfin/mach-bf533/boards/Kconfig b/arch/blackfin/mach-bf533/boards/Kconfig index 308c98dc5ab..8d8b3e7321e 100644 --- a/arch/blackfin/mach-bf533/boards/Kconfig +++ b/arch/blackfin/mach-bf533/boards/Kconfig @@ -38,9 +38,4 @@ config BFIN532_IP0X  	help  	  Core support for IP04/IP04 open hardware IP-PBX. -config GENERIC_BF533_BOARD -	bool "Generic" -	help -	  Generic or Custom board support. -  endchoice diff --git a/arch/blackfin/mach-bf533/boards/Makefile b/arch/blackfin/mach-bf533/boards/Makefile index 9afbe72b484..ff1e832f80d 100644 --- a/arch/blackfin/mach-bf533/boards/Makefile +++ b/arch/blackfin/mach-bf533/boards/Makefile @@ -2,7 +2,6 @@  # arch/blackfin/mach-bf533/boards/Makefile  # -obj-$(CONFIG_GENERIC_BF533_BOARD)      += generic_board.o  obj-$(CONFIG_BFIN533_STAMP)            += stamp.o  obj-$(CONFIG_BFIN532_IP0X)             += ip0x.o  obj-$(CONFIG_BFIN533_EZKIT)            += ezkit.o diff --git a/arch/blackfin/mach-bf533/boards/blackstamp.c b/arch/blackfin/mach-bf533/boards/blackstamp.c index 015c18f85e7..0765872a8ad 100644 --- a/arch/blackfin/mach-bf533/boards/blackstamp.c +++ b/arch/blackfin/mach-bf533/boards/blackstamp.c @@ -101,9 +101,9 @@ static struct bfin5xx_spi_chip spi_flash_chip_info = {  };  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -129,23 +129,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  	},  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -	{ -		.modalias = "spi_mmc_dummy", -		.max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 0, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc", +		.modalias = "mmc_spi",  		.max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif diff --git a/arch/blackfin/mach-bf533/boards/cm_bf533.c b/arch/blackfin/mach-bf533/boards/cm_bf533.c index e7061c7e8c4..e8974878d8c 100644 --- a/arch/blackfin/mach-bf533/boards/cm_bf533.c +++ b/arch/blackfin/mach-bf533/boards/cm_bf533.c @@ -96,9 +96,9 @@ static struct bfin5xx_spi_chip ad1836_spi_chip_info = {  };  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -138,23 +138,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  	},  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -	{ -		.modalias = "spi_mmc_dummy", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 0, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc", +		.modalias = "mmc_spi",  		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif diff --git a/arch/blackfin/mach-bf533/boards/generic_board.c b/arch/blackfin/mach-bf533/boards/generic_board.c deleted file mode 100644 index 986eeec53b1..00000000000 --- a/arch/blackfin/mach-bf533/boards/generic_board.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * File:         arch/blackfin/mach-bf533/generic_board.c - * Based on:     arch/blackfin/mach-bf533/ezkit.c - * Author:       Aidan Williams <aidan@nicta.com.au> - * - * Created:      2005 - * Description: - * - * Modified: - *               Copyright 2005 National ICT Australia (NICTA) - *               Copyright 2004-2006 Analog Devices Inc. - * - * Bugs:         Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ - -#include <linux/device.h> -#include <linux/platform_device.h> -#include <linux/irq.h> - -/* - * Name the Board for the /proc/cpuinfo - */ -const char bfin_board_name[] = "UNKNOWN BOARD"; - -#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) -static struct platform_device rtc_device = { -	.name = "rtc-bfin", -	.id   = -1, -}; -#endif - -/* - *  Driver needs to know address, irq and flag pin. - */ -#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) -static struct resource smc91x_resources[] = { -	{ -		.start = 0x20300300, -		.end = 0x20300300 + 16, -		.flags = IORESOURCE_MEM, -	}, { -		.start = IRQ_PROG_INTB, -		.end = IRQ_PROG_INTB, -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, -	}, { -		.start = IRQ_PF7, -		.end = IRQ_PF7, -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, -	}, -}; - -static struct platform_device smc91x_device = { -	.name = "smc91x", -	.id = 0, -	.num_resources = ARRAY_SIZE(smc91x_resources), -	.resource = smc91x_resources, -}; -#endif - -#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) -#ifdef CONFIG_BFIN_SIR0 -static struct resource bfin_sir0_resources[] = { -	{ -		.start = 0xFFC00400, -		.end = 0xFFC004FF, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.start = IRQ_UART0_RX, -		.end = IRQ_UART0_RX+1, -		.flags = IORESOURCE_IRQ, -	}, -	{ -		.start = CH_UART0_RX, -		.end = CH_UART0_RX+1, -		.flags = IORESOURCE_DMA, -	}, -}; - -static struct platform_device bfin_sir0_device = { -	.name = "bfin_sir", -	.id = 0, -	.num_resources = ARRAY_SIZE(bfin_sir0_resources), -	.resource = bfin_sir0_resources, -}; -#endif -#endif - -static struct platform_device *generic_board_devices[] __initdata = { -#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) -	&rtc_device, -#endif - -#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) -	&smc91x_device, -#endif - -#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) -#ifdef CONFIG_BFIN_SIR0 -	&bfin_sir0_device, -#endif -#endif -}; - -static int __init generic_board_init(void) -{ -	printk(KERN_INFO "%s(): registering device resources\n", __func__); -	return platform_add_devices(generic_board_devices, ARRAY_SIZE(generic_board_devices)); -} - -arch_initcall(generic_board_init); diff --git a/arch/blackfin/mach-bf533/boards/ip0x.c b/arch/blackfin/mach-bf533/boards/ip0x.c index e30b1b7d144..f19b63378b1 100644 --- a/arch/blackfin/mach-bf533/boards/ip0x.c +++ b/arch/blackfin/mach-bf533/boards/ip0x.c @@ -127,8 +127,8 @@ static struct platform_device dm9000_device2 = {  #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)  /* all SPI peripherals info goes here */ -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip mmc_spi_chip_info = {  /*   * CPOL (Clock Polarity)   *  0 - Active high SCK @@ -152,14 +152,13 @@ static struct bfin5xx_spi_chip spi_mmc_chip_info = {  /* Notice: for blackfin, the speed_hz is the value of register   * SPI_BAUD, not the real baudrate */  static struct spi_board_info bfin_spi_board_info[] __initdata = { -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc", +		.modalias = "mmc_spi",  		.max_speed_hz = 2,  		.bus_num = 1, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  	},  #endif  }; diff --git a/arch/blackfin/mach-bf533/include/mach/anomaly.h b/arch/blackfin/mach-bf533/include/mach/anomaly.h index 0d3a03429fb..1cf893e2e55 100644 --- a/arch/blackfin/mach-bf533/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf533/include/mach/anomaly.h @@ -2,7 +2,7 @@   * File: include/asm-blackfin/mach-bf533/anomaly.h   * Bugs: Enter bugs at http://blackfin.uclinux.org/   * - * Copyright (C) 2004-2008 Analog Devices Inc. + * Copyright (C) 2004-2009 Analog Devices Inc.   * Licensed under the GPL-2 or later.   */ @@ -160,7 +160,7 @@  #define ANOMALY_05000301 (__SILICON_REVISION__ < 6)  /* SSYNCs After Writes To DMA MMR Registers May Not Be Handled Correctly */  #define ANOMALY_05000302 (__SILICON_REVISION__ < 5) -/* New Feature: Additional Hysteresis on SPORT Input Pins (Not Available On Older Silicon) */ +/* SPORT_HYS Bit in PLL_CTL Register Is Not Functional */  #define ANOMALY_05000305 (__SILICON_REVISION__ < 5)  /* New Feature: Additional PPI Frame Sync Sampling Options (Not Available On Older Silicon) */  #define ANOMALY_05000306 (__SILICON_REVISION__ < 5) @@ -278,9 +278,12 @@  #define ANOMALY_05000266 (0)  #define ANOMALY_05000323 (0)  #define ANOMALY_05000353 (1) +#define ANOMALY_05000380 (0)  #define ANOMALY_05000386 (1)  #define ANOMALY_05000412 (0)  #define ANOMALY_05000432 (0)  #define ANOMALY_05000435 (0) +#define ANOMALY_05000447 (0) +#define ANOMALY_05000448 (0)  #endif diff --git a/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h index f3d9e495230..5f517f53b0f 100644 --- a/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf533/include/mach/bfin_serial_5xx.h @@ -134,7 +134,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART_TX,  	CH_UART_RX,  #endif -#ifdef CONFIG_BFIN_UART0_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	CONFIG_UART0_CTS_PIN,  	CONFIG_UART0_RTS_PIN,  #endif diff --git a/arch/blackfin/mach-bf537/boards/Kconfig b/arch/blackfin/mach-bf537/boards/Kconfig index 42a57b0acb2..77c59da87e8 100644 --- a/arch/blackfin/mach-bf537/boards/Kconfig +++ b/arch/blackfin/mach-bf537/boards/Kconfig @@ -33,9 +33,4 @@ config CAMSIG_MINOTAUR  	help  	  Board supply package for CSP Minotaur -config GENERIC_BF537_BOARD -	bool "Generic" -	help -	  Generic or Custom board support. -  endchoice diff --git a/arch/blackfin/mach-bf537/boards/Makefile b/arch/blackfin/mach-bf537/boards/Makefile index 7168cc14afd..68b98a7af6a 100644 --- a/arch/blackfin/mach-bf537/boards/Makefile +++ b/arch/blackfin/mach-bf537/boards/Makefile @@ -2,7 +2,6 @@  # arch/blackfin/mach-bf537/boards/Makefile  # -obj-$(CONFIG_GENERIC_BF537_BOARD)      += generic_board.o  obj-$(CONFIG_BFIN537_STAMP)            += stamp.o  obj-$(CONFIG_BFIN537_BLUETECHNIX_CM)   += cm_bf537.o  obj-$(CONFIG_BFIN537_BLUETECHNIX_TCM)  += tcm_bf537.o diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537.c b/arch/blackfin/mach-bf537/boards/cm_bf537.c index 9cd8fb2a30d..41c75b9bfac 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537.c @@ -108,9 +108,9 @@ static struct bfin5xx_spi_chip ad9960_spi_chip_info = {  };  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip  mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -160,23 +160,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  	},  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -	{ -		.modalias = "spi_mmc_dummy", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 7, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ +		.modalias = "mmc_spi", +		.max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 1, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif diff --git a/arch/blackfin/mach-bf537/boards/generic_board.c b/arch/blackfin/mach-bf537/boards/generic_board.c deleted file mode 100644 index da710fdc456..00000000000 --- a/arch/blackfin/mach-bf537/boards/generic_board.c +++ /dev/null @@ -1,745 +0,0 @@ -/* - * File:         arch/blackfin/mach-bf537/boards/generic_board.c - * Based on:     arch/blackfin/mach-bf533/boards/ezkit.c - * Author:       Aidan Williams <aidan@nicta.com.au> - * - * Created: - * Description: - * - * Modified: - *               Copyright 2005 National ICT Australia (NICTA) - *               Copyright 2004-2008 Analog Devices Inc. - * - * Bugs:         Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ - -#include <linux/device.h> -#include <linux/etherdevice.h> -#include <linux/platform_device.h> -#include <linux/mtd/mtd.h> -#include <linux/mtd/partitions.h> -#include <linux/spi/spi.h> -#include <linux/spi/flash.h> -#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) -#include <linux/usb/isp1362.h> -#endif -#include <linux/irq.h> -#include <linux/interrupt.h> -#include <linux/usb/sl811.h> -#include <asm/dma.h> -#include <asm/bfin5xx_spi.h> -#include <asm/reboot.h> -#include <asm/portmux.h> -#include <linux/spi/ad7877.h> - -/* - * Name the Board for the /proc/cpuinfo - */ -const char bfin_board_name[] = "UNKNOWN BOARD"; - -/* - *  Driver needs to know address, irq and flag pin. - */ - -#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE) -#include <linux/usb/isp1760.h> -static struct resource bfin_isp1760_resources[] = { -	[0] = { -		.start  = 0x203C0000, -		.end    = 0x203C0000 + 0x000fffff, -		.flags  = IORESOURCE_MEM, -	}, -	[1] = { -		.start  = IRQ_PF7, -		.end    = IRQ_PF7, -		.flags  = IORESOURCE_IRQ, -	}, -}; - -static struct isp1760_platform_data isp1760_priv = { -	.is_isp1761 = 0, -	.port1_disable = 0, -	.bus_width_16 = 1, -	.port1_otg = 0, -	.analog_oc = 0, -	.dack_polarity_high = 0, -	.dreq_polarity_high = 0, -}; - -static struct platform_device bfin_isp1760_device = { -	.name           = "isp1760-hcd", -	.id             = 0, -	.dev = { -		.platform_data = &isp1760_priv, -	}, -	.num_resources  = ARRAY_SIZE(bfin_isp1760_resources), -	.resource       = bfin_isp1760_resources, -}; -#endif - -#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) -static struct resource bfin_pcmcia_cf_resources[] = { -	{ -		.start = 0x20310000, /* IO PORT */ -		.end = 0x20312000, -		.flags = IORESOURCE_MEM, -	}, { -		.start = 0x20311000, /* Attribute Memory */ -		.end = 0x20311FFF, -		.flags = IORESOURCE_MEM, -	}, { -		.start = IRQ_PF4, -		.end = IRQ_PF4, -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, -	}, { -		.start = 6, /* Card Detect PF6 */ -		.end = 6, -		.flags = IORESOURCE_IRQ, -	}, -}; - -static struct platform_device bfin_pcmcia_cf_device = { -	.name = "bfin_cf_pcmcia", -	.id = -1, -	.num_resources = ARRAY_SIZE(bfin_pcmcia_cf_resources), -	.resource = bfin_pcmcia_cf_resources, -}; -#endif - -#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) -static struct platform_device rtc_device = { -	.name = "rtc-bfin", -	.id   = -1, -}; -#endif - -#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) -static struct resource smc91x_resources[] = { -	{ -		.name = "smc91x-regs", -		.start = 0x20300300, -		.end = 0x20300300 + 16, -		.flags = IORESOURCE_MEM, -	}, { - -		.start = IRQ_PF7, -		.end = IRQ_PF7, -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, -	}, -}; -static struct platform_device smc91x_device = { -	.name = "smc91x", -	.id = 0, -	.num_resources = ARRAY_SIZE(smc91x_resources), -	.resource = smc91x_resources, -}; -#endif - -#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE) -static struct resource dm9000_resources[] = { -	[0] = { -		.start	= 0x203FB800, -		.end	= 0x203FB800 + 1, -		.flags	= IORESOURCE_MEM, -	}, -	[1] = { -		.start	= 0x203FB800 + 4, -		.end	= 0x203FB800 + 5, -		.flags	= IORESOURCE_MEM, -	}, -	[2] = { -		.start	= IRQ_PF9, -		.end	= IRQ_PF9, -		.flags	= (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE), -	}, -}; - -static struct platform_device dm9000_device = { -	.name		= "dm9000", -	.id		= -1, -	.num_resources	= ARRAY_SIZE(dm9000_resources), -	.resource	= dm9000_resources, -}; -#endif - -#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE) -static struct resource sl811_hcd_resources[] = { -	{ -		.start = 0x20340000, -		.end = 0x20340000, -		.flags = IORESOURCE_MEM, -	}, { -		.start = 0x20340004, -		.end = 0x20340004, -		.flags = IORESOURCE_MEM, -	}, { -		.start = CONFIG_USB_SL811_BFIN_IRQ, -		.end = CONFIG_USB_SL811_BFIN_IRQ, -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, -	}, -}; - -#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS) -void sl811_port_power(struct device *dev, int is_on) -{ -	gpio_request(CONFIG_USB_SL811_BFIN_GPIO_VBUS, "usb:SL811_VBUS"); -	gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS, is_on); - -} -#endif - -static struct sl811_platform_data sl811_priv = { -	.potpg = 10, -	.power = 250,       /* == 500mA */ -#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS) -	.port_power = &sl811_port_power, -#endif -}; - -static struct platform_device sl811_hcd_device = { -	.name = "sl811-hcd", -	.id = 0, -	.dev = { -		.platform_data = &sl811_priv, -	}, -	.num_resources = ARRAY_SIZE(sl811_hcd_resources), -	.resource = sl811_hcd_resources, -}; -#endif - -#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) -static struct resource isp1362_hcd_resources[] = { -	{ -		.start = 0x20360000, -		.end = 0x20360000, -		.flags = IORESOURCE_MEM, -	}, { -		.start = 0x20360004, -		.end = 0x20360004, -		.flags = IORESOURCE_MEM, -	}, { -		.start = CONFIG_USB_ISP1362_BFIN_GPIO_IRQ, -		.end = CONFIG_USB_ISP1362_BFIN_GPIO_IRQ, -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, -	}, -}; - -static struct isp1362_platform_data isp1362_priv = { -	.sel15Kres = 1, -	.clknotstop = 0, -	.oc_enable = 0, -	.int_act_high = 0, -	.int_edge_triggered = 0, -	.remote_wakeup_connected = 0, -	.no_power_switching = 1, -	.power_switching_mode = 0, -}; - -static struct platform_device isp1362_hcd_device = { -	.name = "isp1362-hcd", -	.id = 0, -	.dev = { -		.platform_data = &isp1362_priv, -	}, -	.num_resources = ARRAY_SIZE(isp1362_hcd_resources), -	.resource = isp1362_hcd_resources, -}; -#endif - -#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) -static struct platform_device bfin_mii_bus = { -	.name = "bfin_mii_bus", -}; - -static struct platform_device bfin_mac_device = { -	.name = "bfin_mac", -	.dev.platform_data = &bfin_mii_bus, -}; -#endif - -#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) -static struct resource net2272_bfin_resources[] = { -	{ -		.start = 0x20300000, -		.end = 0x20300000 + 0x100, -		.flags = IORESOURCE_MEM, -	}, { -		.start = IRQ_PF7, -		.end = IRQ_PF7, -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, -	}, -}; - -static struct platform_device net2272_bfin_device = { -	.name = "net2272", -	.id = -1, -	.num_resources = ARRAY_SIZE(net2272_bfin_resources), -	.resource = net2272_bfin_resources, -}; -#endif - -#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) -/* all SPI peripherals info goes here */ - -#if defined(CONFIG_MTD_M25P80) \ -	|| defined(CONFIG_MTD_M25P80_MODULE) -static struct mtd_partition bfin_spi_flash_partitions[] = { -	{ -		.name = "bootloader(spi)", -		.size = 0x00020000, -		.offset = 0, -		.mask_flags = MTD_CAP_ROM -	}, { -		.name = "linux kernel(spi)", -		.size = 0xe0000, -		.offset = 0x20000 -	}, { -		.name = "file system(spi)", -		.size = 0x700000, -		.offset = 0x00100000, -	} -}; - -static struct flash_platform_data bfin_spi_flash_data = { -	.name = "m25p80", -	.parts = bfin_spi_flash_partitions, -	.nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions), -	.type = "m25p64", -}; - -/* SPI flash chip (m25p64) */ -static struct bfin5xx_spi_chip spi_flash_chip_info = { -	.enable_dma = 0,         /* use dma transfer with this chip*/ -	.bits_per_word = 8, -}; -#endif - -#if defined(CONFIG_SPI_ADC_BF533) \ -	|| defined(CONFIG_SPI_ADC_BF533_MODULE) -/* SPI ADC chip */ -static struct bfin5xx_spi_chip spi_adc_chip_info = { -	.enable_dma = 1,         /* use dma transfer with this chip*/ -	.bits_per_word = 16, -}; -#endif - -#if defined(CONFIG_SND_BLACKFIN_AD1836) \ -	|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE) -static struct bfin5xx_spi_chip ad1836_spi_chip_info = { -	.enable_dma = 0, -	.bits_per_word = 16, -}; -#endif - -#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE) -static struct bfin5xx_spi_chip ad9960_spi_chip_info = { -	.enable_dma = 0, -	.bits_per_word = 16, -}; -#endif - -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, -	.bits_per_word = 8, -}; -#endif - -#if defined(CONFIG_PBX) -static struct bfin5xx_spi_chip spi_si3xxx_chip_info = { -	.ctl_reg	= 0x4, /* send zero */ -	.enable_dma	= 0, -	.bits_per_word	= 8, -	.cs_change_per_word = 1, -}; -#endif - -#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) -static struct bfin5xx_spi_chip spi_ad7877_chip_info = { -	.enable_dma = 0, -	.bits_per_word = 16, -}; - -static const struct ad7877_platform_data bfin_ad7877_ts_info = { -	.model			= 7877, -	.vref_delay_usecs	= 50,	/* internal, no capacitor */ -	.x_plate_ohms		= 419, -	.y_plate_ohms		= 486, -	.pressure_max		= 1000, -	.pressure_min		= 0, -	.stopacq_polarity 	= 1, -	.first_conversion_delay = 3, -	.acquisition_time 	= 1, -	.averaging 		= 1, -	.pen_down_acc_interval 	= 1, -}; -#endif - -static struct spi_board_info bfin_spi_board_info[] __initdata = { -#if defined(CONFIG_MTD_M25P80) \ -	|| defined(CONFIG_MTD_M25P80_MODULE) -	{ -		/* the modalias must be the same as spi device driver name */ -		.modalias = "m25p80", /* Name of spi_driver for this device */ -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, /* Framework bus number */ -		.chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/ -		.platform_data = &bfin_spi_flash_data, -		.controller_data = &spi_flash_chip_info, -		.mode = SPI_MODE_3, -	}, -#endif - -#if defined(CONFIG_SPI_ADC_BF533) \ -	|| defined(CONFIG_SPI_ADC_BF533_MODULE) -	{ -		.modalias = "bfin_spi_adc", /* Name of spi_driver for this device */ -		.max_speed_hz = 6250000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, /* Framework bus number */ -		.chip_select = 1, /* Framework chip select. */ -		.platform_data = NULL, /* No spi_driver specific config */ -		.controller_data = &spi_adc_chip_info, -	}, -#endif - -#if defined(CONFIG_SND_BLACKFIN_AD1836) \ -	|| defined(CONFIG_SND_BLACKFIN_AD1836_MODULE) -	{ -		.modalias = "ad1836-spi", -		.max_speed_hz = 3125000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT, -		.controller_data = &ad1836_spi_chip_info, -	}, -#endif -#if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE) -	{ -		.modalias = "ad9960-spi", -		.max_speed_hz = 10000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 1, -		.controller_data = &ad9960_spi_chip_info, -	}, -#endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -	{ -		.modalias = "spi_mmc_dummy", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 0, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, -	{ -		.modalias = "spi_mmc", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, -#endif -#if defined(CONFIG_PBX) -	{ -		.modalias = "fxs-spi", -		.max_speed_hz = 12500000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 8 - CONFIG_J11_JUMPER, -		.controller_data = &spi_si3xxx_chip_info, -		.mode = SPI_MODE_3, -	}, -	{ -		.modalias = "fxo-spi", -		.max_speed_hz = 12500000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 8 - CONFIG_J19_JUMPER, -		.controller_data = &spi_si3xxx_chip_info, -		.mode = SPI_MODE_3, -	}, -#endif -#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE) -	{ -		.modalias		= "ad7877", -		.platform_data		= &bfin_ad7877_ts_info, -		.irq			= IRQ_PF6, -		.max_speed_hz	= 12500000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num	= 0, -		.chip_select  = 1, -		.controller_data = &spi_ad7877_chip_info, -	}, -#endif -}; - -/* SPI controller data */ -static struct bfin5xx_spi_master bfin_spi0_info = { -	.num_chipselect = 8, -	.enable_dma = 1,  /* master has the ability to do dma transfer */ -	.pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0}, -}; - -/* SPI (0) */ -static struct resource bfin_spi0_resource[] = { -	[0] = { -		.start = SPI0_REGBASE, -		.end   = SPI0_REGBASE + 0xFF, -		.flags = IORESOURCE_MEM, -		}, -	[1] = { -		.start = CH_SPI, -		.end   = CH_SPI, -		.flags = IORESOURCE_IRQ, -	}, -}; - -static struct platform_device bfin_spi0_device = { -	.name = "bfin-spi", -	.id = 0, /* Bus number */ -	.num_resources = ARRAY_SIZE(bfin_spi0_resource), -	.resource = bfin_spi0_resource, -	.dev = { -		.platform_data = &bfin_spi0_info, /* Passed to driver */ -	}, -}; -#endif  /* spi master and devices */ - -#if defined(CONFIG_FB_BF537_LQ035) || defined(CONFIG_FB_BF537_LQ035_MODULE) -static struct platform_device bfin_fb_device = { -	.name = "bf537-lq035", -}; -#endif - -#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) -static struct platform_device bfin_fb_adv7393_device = { -	.name = "bfin-adv7393", -}; -#endif - -#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) -static struct resource bfin_uart_resources[] = { -	{ -		.start = 0xFFC00400, -		.end = 0xFFC004FF, -		.flags = IORESOURCE_MEM, -	}, { -		.start = 0xFFC02000, -		.end = 0xFFC020FF, -		.flags = IORESOURCE_MEM, -	}, -}; - -static struct platform_device bfin_uart_device = { -	.name = "bfin-uart", -	.id = 1, -	.num_resources = ARRAY_SIZE(bfin_uart_resources), -	.resource = bfin_uart_resources, -}; -#endif - -#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) -#ifdef CONFIG_BFIN_SIR0 -static struct resource bfin_sir0_resources[] = { -	{ -		.start = 0xFFC00400, -		.end = 0xFFC004FF, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.start = IRQ_UART0_RX, -		.end = IRQ_UART0_RX+1, -		.flags = IORESOURCE_IRQ, -	}, -	{ -		.start = CH_UART0_RX, -		.end = CH_UART0_RX+1, -		.flags = IORESOURCE_DMA, -	}, -}; - -static struct platform_device bfin_sir0_device = { -	.name = "bfin_sir", -	.id = 0, -	.num_resources = ARRAY_SIZE(bfin_sir0_resources), -	.resource = bfin_sir0_resources, -}; -#endif -#ifdef CONFIG_BFIN_SIR1 -static struct resource bfin_sir1_resources[] = { -	{ -		.start = 0xFFC02000, -		.end = 0xFFC020FF, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.start = IRQ_UART1_RX, -		.end = IRQ_UART1_RX+1, -		.flags = IORESOURCE_IRQ, -	}, -	{ -		.start = CH_UART1_RX, -		.end = CH_UART1_RX+1, -		.flags = IORESOURCE_DMA, -	}, -}; - -static struct platform_device bfin_sir1_device = { -	.name = "bfin_sir", -	.id = 1, -	.num_resources = ARRAY_SIZE(bfin_sir1_resources), -	.resource = bfin_sir1_resources, -}; -#endif -#endif - -#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE) -static struct resource bfin_twi0_resource[] = { -	[0] = { -		.start = TWI0_REGBASE, -		.end   = TWI0_REGBASE + 0xFF, -		.flags = IORESOURCE_MEM, -	}, -	[1] = { -		.start = IRQ_TWI, -		.end   = IRQ_TWI, -		.flags = IORESOURCE_IRQ, -	}, -}; - -static struct platform_device i2c_bfin_twi_device = { -	.name = "i2c-bfin-twi", -	.id = 0, -	.num_resources = ARRAY_SIZE(bfin_twi0_resource), -	.resource = bfin_twi0_resource, -}; -#endif - -#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) -static struct platform_device bfin_sport0_uart_device = { -	.name = "bfin-sport-uart", -	.id = 0, -}; - -static struct platform_device bfin_sport1_uart_device = { -	.name = "bfin-sport-uart", -	.id = 1, -}; -#endif - -static struct platform_device *stamp_devices[] __initdata = { -#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) -	&bfin_pcmcia_cf_device, -#endif - -#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) -	&rtc_device, -#endif - -#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE) -	&sl811_hcd_device, -#endif - -#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) -	&isp1362_hcd_device, -#endif - -#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) -	&smc91x_device, -#endif - -#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE) -	&dm9000_device, -#endif - -#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) -	&bfin_mii_bus, -	&bfin_mac_device, -#endif - -#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) -	&net2272_bfin_device, -#endif - -#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE) -	&bfin_isp1760_device, -#endif - -#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) -	&bfin_spi0_device, -#endif - -#if defined(CONFIG_FB_BF537_LQ035) || defined(CONFIG_FB_BF537_LQ035_MODULE) -	&bfin_fb_device, -#endif - -#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE) -	&bfin_fb_adv7393_device, -#endif - -#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) -	&bfin_uart_device, -#endif - -#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) -#ifdef CONFIG_BFIN_SIR0 -	&bfin_sir0_device, -#endif -#ifdef CONFIG_BFIN_SIR1 -	&bfin_sir1_device, -#endif -#endif - -#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE) -	&i2c_bfin_twi_device, -#endif - -#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) -	&bfin_sport0_uart_device, -	&bfin_sport1_uart_device, -#endif -}; - -static int __init generic_init(void) -{ -	printk(KERN_INFO "%s(): registering device resources\n", __func__); -	platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); -#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) -	spi_register_board_info(bfin_spi_board_info, -				ARRAY_SIZE(bfin_spi_board_info)); -#endif - -	return 0; -} - -arch_initcall(generic_init); - -void native_machine_restart(char *cmd) -{ -	/* workaround reboot hang when booting from SPI */ -	if ((bfin_read_SYSCR() & 0x7) == 0x3) -		bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS); -} - -#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) -void bfin_get_ether_addr(char *addr) -{ -	random_ether_addr(addr); -	printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__); -} -EXPORT_SYMBOL(bfin_get_ether_addr); -#endif diff --git a/arch/blackfin/mach-bf537/boards/minotaur.c b/arch/blackfin/mach-bf537/boards/minotaur.c index db7d3a385e4..3c159819e55 100644 --- a/arch/blackfin/mach-bf537/boards/minotaur.c +++ b/arch/blackfin/mach-bf537/boards/minotaur.c @@ -134,9 +134,9 @@ static struct bfin5xx_spi_chip spi_flash_chip_info = {  };  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -156,23 +156,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  	},  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc_dummy", +		.modalias = "mmc_spi",  		.max_speed_hz = 5000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = 0, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, -	{ -		.modalias = "spi_mmc", -		.max_speed_hz = 5000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif diff --git a/arch/blackfin/mach-bf537/boards/pnav10.c b/arch/blackfin/mach-bf537/boards/pnav10.c index 590eb3a139b..4e1de1e53f8 100644 --- a/arch/blackfin/mach-bf537/boards/pnav10.c +++ b/arch/blackfin/mach-bf537/boards/pnav10.c @@ -289,9 +289,9 @@ static struct bfin5xx_spi_chip ad9960_spi_chip_info = {  };  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -364,23 +364,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  		.controller_data = &ad9960_spi_chip_info,  	},  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -	{ -		.modalias = "spi_mmc_dummy", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 7, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc", +		.modalias = "mmc_spi",  		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif diff --git a/arch/blackfin/mach-bf537/boards/tcm_bf537.c b/arch/blackfin/mach-bf537/boards/tcm_bf537.c index 3f4f203a06e..53ad10f3cd7 100644 --- a/arch/blackfin/mach-bf537/boards/tcm_bf537.c +++ b/arch/blackfin/mach-bf537/boards/tcm_bf537.c @@ -108,9 +108,9 @@ static struct bfin5xx_spi_chip ad9960_spi_chip_info = {  };  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -160,23 +160,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  	},  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -	{ -		.modalias = "spi_mmc_dummy", -		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */ -		.bus_num = 0, -		.chip_select = 7, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, -		.mode = SPI_MODE_3, -	}, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc", +		.modalias = "mmc_spi",  		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif diff --git a/arch/blackfin/mach-bf537/include/mach/anomaly.h b/arch/blackfin/mach-bf537/include/mach/anomaly.h index 9cb39121d1c..1bfd80c26c9 100644 --- a/arch/blackfin/mach-bf537/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf537/include/mach/anomaly.h @@ -2,7 +2,7 @@   * File: include/asm-blackfin/mach-bf537/anomaly.h   * Bugs: Enter bugs at http://blackfin.uclinux.org/   * - * Copyright (C) 2004-2008 Analog Devices Inc. + * Copyright (C) 2004-2009 Analog Devices Inc.   * Licensed under the GPL-2 or later.   */ @@ -110,7 +110,7 @@  #define ANOMALY_05000301 (1)  /* SSYNCs After Writes To CAN/DMA MMR Registers Are Not Always Handled Correctly */  #define ANOMALY_05000304 (__SILICON_REVISION__ < 3) -/* New Feature: Additional Hysteresis on SPORT Input Pins (Not Available On Older Silicon) */ +/* SPORT_HYS Bit in PLL_CTL Register Is Not Functional */  #define ANOMALY_05000305 (__SILICON_REVISION__ < 3)  /* SCKELOW Bit Does Not Maintain State Through Hibernate */  #define ANOMALY_05000307 (__SILICON_REVISION__ < 3) @@ -168,9 +168,12 @@  #define ANOMALY_05000323 (0)  #define ANOMALY_05000353 (1)  #define ANOMALY_05000363 (0) +#define ANOMALY_05000380 (0)  #define ANOMALY_05000386 (1)  #define ANOMALY_05000412 (0)  #define ANOMALY_05000432 (0)  #define ANOMALY_05000435 (0) +#define ANOMALY_05000447 (0) +#define ANOMALY_05000448 (0)  #endif diff --git a/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h index b3f87e1d16a..9e34700844a 100644 --- a/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf537/include/mach/bfin_serial_5xx.h @@ -144,7 +144,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART0_TX,  	CH_UART0_RX,  #endif -#ifdef CONFIG_BFIN_UART0_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	CONFIG_UART0_CTS_PIN,  	CONFIG_UART0_RTS_PIN,  #endif @@ -158,7 +158,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART1_TX,  	CH_UART1_RX,  #endif -#ifdef CONFIG_BFIN_UART1_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	CONFIG_UART1_CTS_PIN,  	CONFIG_UART1_RTS_PIN,  #endif diff --git a/arch/blackfin/mach-bf538/include/mach/anomaly.h b/arch/blackfin/mach-bf538/include/mach/anomaly.h index e130b4f8a05..3a569982736 100644 --- a/arch/blackfin/mach-bf538/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf538/include/mach/anomaly.h @@ -2,7 +2,7 @@   * File: include/asm-blackfin/mach-bf538/anomaly.h   * Bugs: Enter bugs at http://blackfin.uclinux.org/   * - * Copyright (C) 2004-2008 Analog Devices Inc. + * Copyright (C) 2004-2009 Analog Devices Inc.   * Licensed under the GPL-2 or later.   */ @@ -120,13 +120,17 @@  #define ANOMALY_05000198 (0)  #define ANOMALY_05000230 (0)  #define ANOMALY_05000263 (0) +#define ANOMALY_05000305 (0)  #define ANOMALY_05000311 (0)  #define ANOMALY_05000323 (0)  #define ANOMALY_05000353 (1)  #define ANOMALY_05000363 (0) +#define ANOMALY_05000380 (0)  #define ANOMALY_05000386 (1)  #define ANOMALY_05000412 (0)  #define ANOMALY_05000432 (0)  #define ANOMALY_05000435 (0) +#define ANOMALY_05000447 (0) +#define ANOMALY_05000448 (0)  #endif diff --git a/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h index 40503b6b89a..3c2811ebecd 100644 --- a/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf538/include/mach/bfin_serial_5xx.h @@ -144,7 +144,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART0_TX,  	CH_UART0_RX,  #endif -#ifdef CONFIG_BFIN_UART0_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	CONFIG_UART0_CTS_PIN,  	CONFIG_UART0_RTS_PIN,  #endif @@ -158,7 +158,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART1_TX,  	CH_UART1_RX,  #endif -#ifdef CONFIG_BFIN_UART1_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	CONFIG_UART1_CTS_PIN,  	CONFIG_UART1_RTS_PIN,  #endif diff --git a/arch/blackfin/mach-bf548/include/mach/anomaly.h b/arch/blackfin/mach-bf548/include/mach/anomaly.h index 23d03c52f4b..882e40ccf0d 100644 --- a/arch/blackfin/mach-bf548/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf548/include/mach/anomaly.h @@ -2,12 +2,12 @@   * File: include/asm-blackfin/mach-bf548/anomaly.h   * Bugs: Enter bugs at http://blackfin.uclinux.org/   * - * Copyright (C) 2004-2008 Analog Devices Inc. + * Copyright (C) 2004-2009 Analog Devices Inc.   * Licensed under the GPL-2 or later.   */  /* This file shoule be up to date with: - *  - Revision G, 08/07/2008; ADSP-BF542/BF544/BF547/BF548/BF549 Blackfin Processor Anomaly List + *  - Revision H, 01/16/2009; ADSP-BF542/BF544/BF547/BF548/BF549 Blackfin Processor Anomaly List   */  #ifndef _MACH_ANOMALY_H_ @@ -91,8 +91,6 @@  #define ANOMALY_05000371 (__SILICON_REVISION__ < 2)  /* USB DP/DM Data Pins May Lose State When Entering Hibernate */  #define ANOMALY_05000372 (__SILICON_REVISION__ < 1) -/* Mobile DDR Operation Not Functional */ -#define ANOMALY_05000377 (1)  /* Security/Authentication Speedpath Causes Authentication To Fail To Initiate */  #define ANOMALY_05000378 (__SILICON_REVISION__ < 2)  /* 16-Bit NAND FLASH Boot Mode Is Not Functional */ @@ -157,8 +155,22 @@  #define ANOMALY_05000429 (__SILICON_REVISION__ < 2)  /* Software System Reset Corrupts PLL_LOCKCNT Register */  #define ANOMALY_05000430 (__SILICON_REVISION__ >= 2) +/* Incorrect Use of Stack in Lockbox Firmware During Authentication */ +#define ANOMALY_05000431 (__SILICON_REVISION__ < 3) +/* OTP Write Accesses Not Supported */ +#define ANOMALY_05000442 (__SILICON_REVISION__ < 1)  /* IFLUSH Instruction at End of Hardware Loop Causes Infinite Stall */  #define ANOMALY_05000443 (1) +/* CDMAPRIO and L2DMAPRIO Bits in the SYSCR Register Are Not Functional */ +#define ANOMALY_05000446 (1) +/* UART IrDA Receiver Fails on Extended Bit Pulses */ +#define ANOMALY_05000447 (1) +/* DDR Clock Duty Cycle Spec Violation (tCH, tCL) */ +#define ANOMALY_05000448 (__SILICON_REVISION__ == 1) +/* Reduced Timing Margins on DDR Output Setup and Hold (tDS and tDH) */ +#define ANOMALY_05000449 (__SILICON_REVISION__ == 1) +/* USB DMA Mode 1 Short Packet Data Corruption */ +#define ANOMALY_05000450 (1  /* Anomalies that don't exist on this proc */  #define ANOMALY_05000125 (0) @@ -171,6 +183,8 @@  #define ANOMALY_05000263 (0)  #define ANOMALY_05000266 (0)  #define ANOMALY_05000273 (0) +#define ANOMALY_05000278 (0) +#define ANOMALY_05000305 (0)  #define ANOMALY_05000307 (0)  #define ANOMALY_05000311 (0)  #define ANOMALY_05000323 (0) diff --git a/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h index e4cf35e7ab9..c05e79cba25 100644 --- a/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf548/include/mach/bfin_serial_5xx.h @@ -63,7 +63,7 @@  #define UART_ENABLE_INTS(x, v) UART_SET_IER(x, v)  #define UART_DISABLE_INTS(x) UART_CLEAR_IER(x, 0xF) -#if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART1_CTSRTS) +#if defined(CONFIG_BFIN_UART0_CTSRTS) || defined(CONFIG_BFIN_UART2_CTSRTS)  # define CONFIG_SERIAL_BFIN_CTSRTS  # ifndef CONFIG_UART0_CTS_PIN @@ -74,12 +74,12 @@  #  define CONFIG_UART0_RTS_PIN -1  # endif -# ifndef CONFIG_UART1_CTS_PIN -#  define CONFIG_UART1_CTS_PIN -1 +# ifndef CONFIG_UART2_CTS_PIN +#  define CONFIG_UART2_CTS_PIN -1  # endif -# ifndef CONFIG_UART1_RTS_PIN -#  define CONFIG_UART1_RTS_PIN -1 +# ifndef CONFIG_UART2_RTS_PIN +#  define CONFIG_UART2_RTS_PIN -1  # endif  #endif @@ -130,7 +130,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART0_TX,  	CH_UART0_RX,  #endif -#ifdef CONFIG_BFIN_UART0_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	CONFIG_UART0_CTS_PIN,  	CONFIG_UART0_RTS_PIN,  #endif @@ -144,6 +144,10 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART1_TX,  	CH_UART1_RX,  #endif +#ifdef CONFIG_SERIAL_BFIN_CTSRTS +	0, +	0, +#endif  	},  #endif  #ifdef CONFIG_SERIAL_BFIN_UART2 @@ -154,7 +158,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART2_TX,  	CH_UART2_RX,  #endif -#ifdef CONFIG_BFIN_UART2_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	CONFIG_UART2_CTS_PIN,  	CONFIG_UART2_RTS_PIN,  #endif @@ -168,6 +172,10 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART3_TX,  	CH_UART3_RX,  #endif +#ifdef CONFIG_SERIAL_BFIN_CTSRTS +	0, +	0, +#endif  	},  #endif  }; diff --git a/arch/blackfin/mach-bf548/include/mach/irq.h b/arch/blackfin/mach-bf548/include/mach/irq.h index 60299a71e09..f194625f682 100644 --- a/arch/blackfin/mach-bf548/include/mach/irq.h +++ b/arch/blackfin/mach-bf548/include/mach/irq.h @@ -123,8 +123,8 @@ Events         (highest priority)  EMU         0  #define IRQ_MXVR_ERROR		BFIN_IRQ(51)	/* MXVR Status (Error) Interrupt */  #define IRQ_MXVR_MSG		BFIN_IRQ(52)	/* MXVR Message Interrupt */  #define IRQ_MXVR_PKT		BFIN_IRQ(53)	/* MXVR Packet Interrupt */ -#define IRQ_EPP1_ERROR		BFIN_IRQ(54)	/* EPPI1 Error Interrupt */ -#define IRQ_EPP2_ERROR		BFIN_IRQ(55)	/* EPPI2 Error Interrupt */ +#define IRQ_EPPI1_ERROR		BFIN_IRQ(54)	/* EPPI1 Error Interrupt */ +#define IRQ_EPPI2_ERROR		BFIN_IRQ(55)	/* EPPI2 Error Interrupt */  #define IRQ_UART3_ERROR		BFIN_IRQ(56)	/* UART3 Status (Error) Interrupt */  #define IRQ_HOST_ERROR		BFIN_IRQ(57)	/* HOST Status (Error) Interrupt */  #define IRQ_PIXC_ERROR		BFIN_IRQ(59)	/* PIXC Status (Error) Interrupt */ @@ -361,8 +361,8 @@ Events         (highest priority)  EMU         0  #define IRQ_UART2_ERR 		IRQ_UART2_ERROR  #define IRQ_CAN0_ERR  		IRQ_CAN0_ERROR  #define IRQ_MXVR_ERR  		IRQ_MXVR_ERROR -#define IRQ_EPP1_ERR  		IRQ_EPP1_ERROR -#define IRQ_EPP2_ERR  		IRQ_EPP2_ERROR +#define IRQ_EPPI1_ERR  		IRQ_EPPI1_ERROR +#define IRQ_EPPI2_ERR  		IRQ_EPPI2_ERROR  #define IRQ_UART3_ERR 		IRQ_UART3_ERROR  #define IRQ_HOST_ERR  		IRQ_HOST_ERROR  #define IRQ_PIXC_ERR  		IRQ_PIXC_ERROR diff --git a/arch/blackfin/mach-bf561/boards/Kconfig b/arch/blackfin/mach-bf561/boards/Kconfig index e41a67b1fb5..e4bc6d7c5a6 100644 --- a/arch/blackfin/mach-bf561/boards/Kconfig +++ b/arch/blackfin/mach-bf561/boards/Kconfig @@ -19,9 +19,4 @@ config BFIN561_BLUETECHNIX_CM  	help  	  CM-BF561 support for EVAL- and DEV-Board. -config GENERIC_BF561_BOARD -	bool "Generic" -	help -	  Generic or Custom board support. -  endchoice diff --git a/arch/blackfin/mach-bf561/boards/Makefile b/arch/blackfin/mach-bf561/boards/Makefile index 04add010b56..3a152559e95 100644 --- a/arch/blackfin/mach-bf561/boards/Makefile +++ b/arch/blackfin/mach-bf561/boards/Makefile @@ -2,7 +2,6 @@  # arch/blackfin/mach-bf561/boards/Makefile  # -obj-$(CONFIG_GENERIC_BF561_BOARD)      += generic_board.o  obj-$(CONFIG_BFIN561_BLUETECHNIX_CM)   += cm_bf561.o  obj-$(CONFIG_BFIN561_EZKIT)            += ezkit.o  obj-$(CONFIG_BFIN561_TEPLA)            += tepla.o diff --git a/arch/blackfin/mach-bf561/boards/cm_bf561.c b/arch/blackfin/mach-bf561/boards/cm_bf561.c index 6880d1ebfe6..f623c6b0719 100644 --- a/arch/blackfin/mach-bf561/boards/cm_bf561.c +++ b/arch/blackfin/mach-bf561/boards/cm_bf561.c @@ -105,9 +105,9 @@ static struct bfin5xx_spi_chip ad9960_spi_chip_info = {  };  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) -static struct bfin5xx_spi_chip spi_mmc_chip_info = { -	.enable_dma = 1, +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE) +static struct bfin5xx_spi_chip mmc_spi_chip_info = { +	.enable_dma = 0,  	.bits_per_word = 8,  };  #endif @@ -155,14 +155,13 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = {  		.controller_data = &ad9960_spi_chip_info,  	},  #endif -#if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) +#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)  	{ -		.modalias = "spi_mmc", +		.modalias = "mmc_spi",  		.max_speed_hz = 25000000,     /* max spi clock (SCK) speed in HZ */  		.bus_num = 0, -		.chip_select = CONFIG_SPI_MMC_CS_CHAN, -		.platform_data = NULL, -		.controller_data = &spi_mmc_chip_info, +		.chip_select = 5, +		.controller_data = &mmc_spi_chip_info,  		.mode = SPI_MODE_3,  	},  #endif diff --git a/arch/blackfin/mach-bf561/boards/generic_board.c b/arch/blackfin/mach-bf561/boards/generic_board.c deleted file mode 100644 index 0ba366a0e69..00000000000 --- a/arch/blackfin/mach-bf561/boards/generic_board.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * File:         arch/blackfin/mach-bf561/generic_board.c - * Based on:     arch/blackfin/mach-bf533/ezkit.c - * Author:       Aidan Williams <aidan@nicta.com.au> - * - * Created: - * Description: - * - * Modified: - *               Copyright 2005 National ICT Australia (NICTA) - *               Copyright 2004-2006 Analog Devices Inc. - * - * Bugs:         Enter bugs at http://blackfin.uclinux.org/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see the file COPYING, or write - * to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA - */ - -#include <linux/device.h> -#include <linux/platform_device.h> -#include <linux/irq.h> - -const char bfin_board_name[] = "UNKNOWN BOARD"; - -/* - *  Driver needs to know address, irq and flag pin. - */ -#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) -static struct resource smc91x_resources[] = { -	{ -		.start = 0x2C010300, -		.end = 0x2C010300 + 16, -		.flags = IORESOURCE_MEM, -	}, { -		.start = IRQ_PROG_INTB, -		.end = IRQ_PROG_INTB, -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, -	}, { -		.start = IRQ_PF9, -		.end = IRQ_PF9, -		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, -	}, -}; - -static struct platform_device smc91x_device = { -	.name = "smc91x", -	.id = 0, -	.num_resources = ARRAY_SIZE(smc91x_resources), -	.resource = smc91x_resources, -}; -#endif - -#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) -#ifdef CONFIG_BFIN_SIR0 -static struct resource bfin_sir0_resources[] = { -	{ -		.start = 0xFFC00400, -		.end = 0xFFC004FF, -		.flags = IORESOURCE_MEM, -	}, -	{ -		.start = IRQ_UART0_RX, -		.end = IRQ_UART0_RX+1, -		.flags = IORESOURCE_IRQ, -	}, -	{ -		.start = CH_UART0_RX, -		.end = CH_UART0_RX+1, -		.flags = IORESOURCE_DMA, -	}, -}; - -static struct platform_device bfin_sir0_device = { -	.name = "bfin_sir", -	.id = 0, -	.num_resources = ARRAY_SIZE(bfin_sir0_resources), -	.resource = bfin_sir0_resources, -}; -#endif -#endif - -static struct platform_device *generic_board_devices[] __initdata = { -#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) -	&smc91x_device, -#endif - -#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) -#ifdef CONFIG_BFIN_SIR0 -	&bfin_sir0_device, -#endif -#endif -}; - -static int __init generic_board_init(void) -{ -	printk(KERN_INFO "%s(): registering device resources\n", __func__); -	return platform_add_devices(generic_board_devices, -				    ARRAY_SIZE(generic_board_devices)); -} - -arch_initcall(generic_board_init); diff --git a/arch/blackfin/mach-bf561/include/mach/anomaly.h b/arch/blackfin/mach-bf561/include/mach/anomaly.h index 1a9e1756282..d0b0b350644 100644 --- a/arch/blackfin/mach-bf561/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf561/include/mach/anomaly.h @@ -2,7 +2,7 @@   * File: include/asm-blackfin/mach-bf561/anomaly.h   * Bugs: Enter bugs at http://blackfin.uclinux.org/   * - * Copyright (C) 2004-2008 Analog Devices Inc. + * Copyright (C) 2004-2009 Analog Devices Inc.   * Licensed under the GPL-2 or later.   */ @@ -224,7 +224,7 @@  #define ANOMALY_05000301 (1)  /* SSYNCs After Writes To DMA MMR Registers May Not Be Handled Correctly */  #define ANOMALY_05000302 (1) -/* New Feature: Additional Hysteresis on SPORT Input Pins (Not Available On Older Silicon) */ +/* SPORT_HYS Bit in PLL_CTL Register Is Not Functional */  #define ANOMALY_05000305 (__SILICON_REVISION__ < 5)  /* SCKELOW Bit Does Not Maintain State Through Hibernate */  #define ANOMALY_05000307 (__SILICON_REVISION__ < 5) @@ -283,8 +283,11 @@  #define ANOMALY_05000273 (0)  #define ANOMALY_05000311 (0)  #define ANOMALY_05000353 (1) +#define ANOMALY_05000380 (0)  #define ANOMALY_05000386 (1)  #define ANOMALY_05000432 (0)  #define ANOMALY_05000435 (0) +#define ANOMALY_05000447 (0) +#define ANOMALY_05000448 (0)  #endif diff --git a/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h b/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h index 043bfcf26c5..ca8c5f64520 100644 --- a/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h +++ b/arch/blackfin/mach-bf561/include/mach/bfin_serial_5xx.h @@ -134,7 +134,7 @@ struct bfin_serial_res bfin_serial_resource[] = {  	CH_UART_TX,  	CH_UART_RX,  #endif -#ifdef CONFIG_BFIN_UART0_CTSRTS +#ifdef CONFIG_SERIAL_BFIN_CTSRTS  	CONFIG_UART0_CTS_PIN,  	CONFIG_UART0_RTS_PIN,  #endif diff --git a/arch/blackfin/mach-common/arch_checks.c b/arch/blackfin/mach-common/arch_checks.c index 98133b968f7..80d39b2f9db 100644 --- a/arch/blackfin/mach-common/arch_checks.c +++ b/arch/blackfin/mach-common/arch_checks.c @@ -62,3 +62,12 @@  #if (CONFIG_BOOT_LOAD & 0x3)  # error "The kernel load address must be 4 byte aligned"  #endif + +/* The entire kernel must be able to make a 24bit pcrel call to start of L1 */ +#if ((0xffffffff - L1_CODE_START + 1) + CONFIG_BOOT_LOAD) > 0x1000000 +# error "The kernel load address is too high; keep it below 10meg for safety" +#endif + +#if ANOMALY_05000448 +# error You are using a part with anomaly 05000448, this issue causes random memory read/write failures - that means random crashes. +#endif diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index 3c98dacbf28..aa0648c6a9f 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S @@ -66,11 +66,33 @@  /* Invalidate all instruction cache lines assocoiated with this memory area */  ENTRY(_blackfin_icache_flush_range) +/* + * Walkaround to avoid loading wrong instruction after invalidating icache + * and following sequence is met. + * + * 1) One instruction address is cached in the instruction cache. + * 2) This instruction in SDRAM is changed. + * 3) IFLASH[P0] is executed only once in blackfin_icache_flush_range(). + * 4) This instruction is executed again, but the old one is loaded. + */ +	P0 = R0; +	IFLUSH[P0];  	do_flush IFLUSH, , nop  ENDPROC(_blackfin_icache_flush_range)  /* Flush all cache lines assocoiated with this area of memory. */  ENTRY(_blackfin_icache_dcache_flush_range) +/* + * Walkaround to avoid loading wrong instruction after invalidating icache + * and following sequence is met. + * + * 1) One instruction address is cached in the instruction cache. + * 2) This instruction in SDRAM is changed. + * 3) IFLASH[P0] is executed only once in blackfin_icache_flush_range(). + * 4) This instruction is executed again, but the old one is loaded. + */ +	P0 = R0; +	IFLUSH[P0];  	do_flush FLUSH, IFLUSH  ENDPROC(_blackfin_icache_dcache_flush_range) diff --git a/arch/blackfin/mach-common/clocks-init.c b/arch/blackfin/mach-common/clocks-init.c index 9dddb6f8cc8..35393651359 100644 --- a/arch/blackfin/mach-common/clocks-init.c +++ b/arch/blackfin/mach-common/clocks-init.c @@ -17,7 +17,7 @@  #define SDGCTL_WIDTH (1 << 31)	/* SDRAM external data path width */  #define PLL_CTL_VAL \  	(((CONFIG_VCO_MULT & 63) << 9) | CLKIN_HALF | \ -	 (PLL_BYPASS << 8) | (ANOMALY_05000265 ? 0x8000 : 0)) +	 (PLL_BYPASS << 8) | (ANOMALY_05000305 ? 0 : 0x8000))  __attribute__((l1_text))  static void do_sync(void) diff --git a/arch/blackfin/mach-common/dpmc_modes.S b/arch/blackfin/mach-common/dpmc_modes.S index 4da50bcd930..8009a512fb1 100644 --- a/arch/blackfin/mach-common/dpmc_modes.S +++ b/arch/blackfin/mach-common/dpmc_modes.S @@ -376,10 +376,22 @@ ENTRY(_do_hibernate)  #endif  #ifdef PINT0_ASSIGN +	PM_SYS_PUSH(PINT0_MASK_SET) +	PM_SYS_PUSH(PINT1_MASK_SET) +	PM_SYS_PUSH(PINT2_MASK_SET) +	PM_SYS_PUSH(PINT3_MASK_SET)  	PM_SYS_PUSH(PINT0_ASSIGN)  	PM_SYS_PUSH(PINT1_ASSIGN)  	PM_SYS_PUSH(PINT2_ASSIGN)  	PM_SYS_PUSH(PINT3_ASSIGN) +	PM_SYS_PUSH(PINT0_INVERT_SET) +	PM_SYS_PUSH(PINT1_INVERT_SET) +	PM_SYS_PUSH(PINT2_INVERT_SET) +	PM_SYS_PUSH(PINT3_INVERT_SET) +	PM_SYS_PUSH(PINT0_EDGE_SET) +	PM_SYS_PUSH(PINT1_EDGE_SET) +	PM_SYS_PUSH(PINT2_EDGE_SET) +	PM_SYS_PUSH(PINT3_EDGE_SET)  #endif  	PM_SYS_PUSH(EBIU_AMBCTL0) @@ -714,10 +726,22 @@ ENTRY(_do_hibernate)  	PM_SYS_POP(EBIU_AMBCTL0)  #ifdef PINT0_ASSIGN +	PM_SYS_POP(PINT3_EDGE_SET) +	PM_SYS_POP(PINT2_EDGE_SET) +	PM_SYS_POP(PINT1_EDGE_SET) +	PM_SYS_POP(PINT0_EDGE_SET) +	PM_SYS_POP(PINT3_INVERT_SET) +	PM_SYS_POP(PINT2_INVERT_SET) +	PM_SYS_POP(PINT1_INVERT_SET) +	PM_SYS_POP(PINT0_INVERT_SET)  	PM_SYS_POP(PINT3_ASSIGN)  	PM_SYS_POP(PINT2_ASSIGN)  	PM_SYS_POP(PINT1_ASSIGN)  	PM_SYS_POP(PINT0_ASSIGN) +	PM_SYS_POP(PINT3_MASK_SET) +	PM_SYS_POP(PINT2_MASK_SET) +	PM_SYS_POP(PINT1_MASK_SET) +	PM_SYS_POP(PINT0_MASK_SET)  #endif  #ifdef SICA_IWR1 diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index 88de053bbe8..21e65a339a2 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S @@ -600,6 +600,19 @@ ENTRY(_system_call)  	p2 = [p2];  	[p2+(TASK_THREAD+THREAD_KSP)] = sp; +#ifdef CONFIG_IPIPE +	r0 = sp; +	SP += -12; +	call ___ipipe_syscall_root; +	SP += 12; +	cc = r0 == 1; +	if cc jump .Lsyscall_really_exit; +	cc = r0 == -1; +	if cc jump .Lresume_userspace; +	r3 = [sp + PT_R3]; +	r4 = [sp + PT_R4]; +	p0 = [sp + PT_ORIG_P0]; +#endif /* CONFIG_IPIPE */  	/* Check the System Call */  	r7 = __NR_syscall; @@ -654,6 +667,17 @@ ENTRY(_system_call)  	r7 =  r7 & r4;  .Lsyscall_resched: +#ifdef CONFIG_IPIPE +	cc = BITTST(r7, TIF_IRQ_SYNC); +	if !cc jump .Lsyscall_no_irqsync; +	[--sp] = reti; +	r0 = [sp++]; +	SP += -12; +	call ___ipipe_sync_root; +	SP += 12; +	jump .Lresume_userspace_1; +.Lsyscall_no_irqsync: +#endif  	cc = BITTST(r7, TIF_NEED_RESCHED);  	if !cc jump .Lsyscall_sigpending; @@ -685,6 +709,10 @@ ENTRY(_system_call)  .Lsyscall_really_exit:  	r5 = [sp + PT_RESERVED];  	rets = r5; +#ifdef CONFIG_IPIPE +	[--sp] = reti; +	r5 = [sp++]; +#endif /* CONFIG_IPIPE */  	rts;  ENDPROC(_system_call) @@ -771,6 +799,15 @@ _new_old_task:  ENDPROC(_resume)  ENTRY(_ret_from_exception) +#ifdef CONFIG_IPIPE +	[--sp] = rets; +	SP += -12; +	call ___ipipe_check_root +	SP += 12 +	rets = [sp++]; +	cc = r0 == 0; +	if cc jump 4f;                /* not on behalf of Linux, get out */ +#endif /* CONFIG_IPIPE */  	p2.l = lo(IPEND);  	p2.h = hi(IPEND); @@ -827,6 +864,28 @@ ENTRY(_ret_from_exception)  	rts;  ENDPROC(_ret_from_exception) +#ifdef CONFIG_IPIPE + +_sync_root_irqs: +	[--sp] = reti;		/* Reenable interrupts */ +	r0 = [sp++]; +	jump.l ___ipipe_sync_root + +_resume_kernel_from_int: +	r0.l = _sync_root_irqs +	r0.h = _sync_root_irqs +	[--sp] = rets; +	[--sp] = ( r7:4, p5:3 ); +	SP += -12; +	call ___ipipe_call_irqtail +	SP += 12; +	( r7:4, p5:3 ) = [sp++]; +	rets = [sp++]; +	rts +#else +#define _resume_kernel_from_int	 2f +#endif +  ENTRY(_return_from_int)  	/* If someone else already raised IRQ 15, do nothing.  */  	csync; @@ -848,7 +907,7 @@ ENTRY(_return_from_int)  	r1 = r0 - r1;  	r2 = r0 & r1;  	cc = r2 == 0; -	if !cc jump 2f; +	if !cc jump _resume_kernel_from_int;  	/* Lower the interrupt level to 15.  */  	p0.l = lo(EVT15); diff --git a/arch/blackfin/mach-common/interrupt.S b/arch/blackfin/mach-common/interrupt.S index 43c4eb9acb6..0069c2dd462 100644 --- a/arch/blackfin/mach-common/interrupt.S +++ b/arch/blackfin/mach-common/interrupt.S @@ -235,6 +235,7 @@ ENDPROC(_evt_system_call)  #ifdef CONFIG_IPIPE  ENTRY(___ipipe_call_irqtail) +	p0 = r0;  	r0.l = 1f;  	r0.h = 1f;  	reti = r0; @@ -242,9 +243,6 @@ ENTRY(___ipipe_call_irqtail)  1:  	[--sp] = rets;  	[--sp] = ( r7:4, p5:3 ); -	p0.l = ___ipipe_irq_tail_hook; -	p0.h = ___ipipe_irq_tail_hook; -	p0 = [p0];  	sp += -12;  	call (p0);  	sp += 12; @@ -259,7 +257,7 @@ ENTRY(___ipipe_call_irqtail)  	p0.h = hi(EVT14);  	[p0] = r0;  	csync; -	r0 = 0x401f; +	r0 = 0x401f (z);  	sti r0;  	raise 14;  	[--sp] = reti;          /* IRQs on. */ @@ -277,11 +275,7 @@ ENTRY(___ipipe_call_irqtail)  	p0.h = _bfin_irq_flags;  	r0 = [p0];  	sti r0; -#if 0 /* FIXME: this actually raises scheduling latencies */ -	/* Reenable interrupts */ -	[--sp] = reti; -	r0 = [sp++]; -#endif  	rts;  ENDPROC(___ipipe_call_irqtail) +  #endif /* CONFIG_IPIPE */ diff --git a/arch/blackfin/mach-common/ints-priority.c b/arch/blackfin/mach-common/ints-priority.c index 202494568c6..a7d7b2dd405 100644 --- a/arch/blackfin/mach-common/ints-priority.c +++ b/arch/blackfin/mach-common/ints-priority.c @@ -161,11 +161,15 @@ static void bfin_core_unmask_irq(unsigned int irq)  static void bfin_internal_mask_irq(unsigned int irq)  { +	unsigned long flags; +  #ifdef CONFIG_BF53x +	local_irq_save_hw(flags);  	bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() &  			     ~(1 << SIC_SYSIRQ(irq)));  #else  	unsigned mask_bank, mask_bit; +	local_irq_save_hw(flags);  	mask_bank = SIC_SYSIRQ(irq) / 32;  	mask_bit = SIC_SYSIRQ(irq) % 32;  	bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) & @@ -175,15 +179,20 @@ static void bfin_internal_mask_irq(unsigned int irq)  			     ~(1 << mask_bit));  #endif  #endif +	local_irq_restore_hw(flags);  }  static void bfin_internal_unmask_irq(unsigned int irq)  { +	unsigned long flags; +  #ifdef CONFIG_BF53x +	local_irq_save_hw(flags);  	bfin_write_SIC_IMASK(bfin_read_SIC_IMASK() |  			     (1 << SIC_SYSIRQ(irq)));  #else  	unsigned mask_bank, mask_bit; +	local_irq_save_hw(flags);  	mask_bank = SIC_SYSIRQ(irq) / 32;  	mask_bit = SIC_SYSIRQ(irq) % 32;  	bfin_write_SIC_IMASK(mask_bank, bfin_read_SIC_IMASK(mask_bank) | @@ -193,6 +202,7 @@ static void bfin_internal_unmask_irq(unsigned int irq)  			     (1 << mask_bit));  #endif  #endif +	local_irq_restore_hw(flags);  }  #ifdef CONFIG_PM @@ -390,7 +400,7 @@ static void bfin_demux_error_irq(unsigned int int_err_irq,  static inline void bfin_set_irq_handler(unsigned irq, irq_flow_handler_t handle)  {  #ifdef CONFIG_IPIPE -	_set_irq_handler(irq, handle_edge_irq); +	_set_irq_handler(irq, handle_level_irq);  #else  	struct irq_desc *desc = irq_desc + irq;  	/* May not call generic set_irq_handler() due to spinlock @@ -1055,13 +1065,18 @@ int __init init_arch_irq(void)  #endif  		default:  #ifdef CONFIG_IPIPE -	/* -	 * We want internal interrupt sources to be masked, because -	 * ISRs may trigger interrupts recursively (e.g. DMA), but -	 * interrupts are _not_ masked at CPU level. So let's handle -	 * them as level interrupts. -	 */ -			set_irq_handler(irq, handle_level_irq); +			/* +			 * We want internal interrupt sources to be +			 * masked, because ISRs may trigger interrupts +			 * recursively (e.g. DMA), but interrupts are +			 * _not_ masked at CPU level. So let's handle +			 * most of them as level interrupts, except +			 * the timer interrupt which is special. +			 */ +			if (irq == IRQ_SYSTMR || irq == IRQ_CORETMR) +				set_irq_handler(irq, handle_simple_irq); +			else +				set_irq_handler(irq, handle_level_irq);  #else /* !CONFIG_IPIPE */  			set_irq_handler(irq, handle_simple_irq);  #endif /* !CONFIG_IPIPE */ @@ -1123,9 +1138,8 @@ int __init init_arch_irq(void)  #ifdef CONFIG_IPIPE  	for (irq = 0; irq < NR_IRQS; irq++) { -		struct irq_desc *desc = irq_desc + irq; +		struct irq_desc *desc = irq_to_desc(irq);  		desc->ic_prio = __ipipe_get_irq_priority(irq); -		desc->thr_prio = __ipipe_get_irqthread_priority(irq);  	}  #endif /* CONFIG_IPIPE */ @@ -1208,76 +1222,21 @@ int __ipipe_get_irq_priority(unsigned irq)  	return IVG15;  } -int __ipipe_get_irqthread_priority(unsigned irq) -{ -	int ient, prio; -	int demux_irq; - -	/* The returned priority value is rescaled to [0..IVG13+1] -	 * with 0 being the lowest effective priority level. */ - -	if (irq <= IRQ_CORETMR) -		return IVG13 - irq + 1; - -	/* GPIO IRQs are given the priority of the demux -	 * interrupt. */ -	if (IS_GPIOIRQ(irq)) { -#if defined(CONFIG_BF54x) -		u32 bank = PINT_2_BANK(irq2pint_lut[irq - SYS_IRQS]); -		demux_irq = (bank == 0 ? IRQ_PINT0 : -				bank == 1 ? IRQ_PINT1 : -				bank == 2 ? IRQ_PINT2 : -				IRQ_PINT3); -#elif defined(CONFIG_BF561) -		demux_irq = (irq >= IRQ_PF32 ? IRQ_PROG2_INTA : -				irq >= IRQ_PF16 ? IRQ_PROG1_INTA : -				IRQ_PROG0_INTA); -#elif defined(CONFIG_BF52x) -		demux_irq = (irq >= IRQ_PH0 ? IRQ_PORTH_INTA : -				irq >= IRQ_PG0 ? IRQ_PORTG_INTA : -				IRQ_PORTF_INTA); -#else -		demux_irq = irq; -#endif -		return IVG13 - PRIO_GPIODEMUX(demux_irq) + 1; -	} - -	/* The GPIO demux interrupt is given a lower priority -	 * than the GPIO IRQs, so that its threaded handler -	 * unmasks the interrupt line after the decoded IRQs -	 * have been processed. */ -	prio = PRIO_GPIODEMUX(irq); -	/* demux irq? */ -	if (prio != -1) -		return IVG13 - prio; - -	for (ient = 0; ient < NR_PERI_INTS; ient++) { -		struct ivgx *ivg = ivg_table + ient; -		if (ivg->irqno == irq) { -			for (prio = 0; prio <= IVG13-IVG7; prio++) { -				if (ivg7_13[prio].ifirst <= ivg && -				    ivg7_13[prio].istop > ivg) -					return IVG7 - prio; -			} -		} -	} - -	return 0; -} -  /* Hw interrupts are disabled on entry (check SAVE_CONTEXT). */  #ifdef CONFIG_DO_IRQ_L1  __attribute__((l1_text))  #endif  asmlinkage int __ipipe_grab_irq(int vec, struct pt_regs *regs)  { +	struct ipipe_percpu_domain_data *p = ipipe_root_cpudom_ptr(); +	struct ipipe_domain *this_domain = ipipe_current_domain;  	struct ivgx *ivg_stop = ivg7_13[vec-IVG7].istop;  	struct ivgx *ivg = ivg7_13[vec-IVG7].ifirst; -	int irq; +	int irq, s;  	if (likely(vec == EVT_IVTMR_P)) {  		irq = IRQ_CORETMR; -		goto handle_irq; +		goto core_tick;  	}  	SSYNC(); @@ -1319,24 +1278,39 @@ asmlinkage int __ipipe_grab_irq(int vec, struct pt_regs *regs)  	irq = ivg->irqno;  	if (irq == IRQ_SYSTMR) { +#ifdef CONFIG_GENERIC_CLOCKEVENTS +core_tick: +#else  		bfin_write_TIMER_STATUS(1); /* Latch TIMIL0 */ +#endif  		/* This is basically what we need from the register frame. */  		__raw_get_cpu_var(__ipipe_tick_regs).ipend = regs->ipend;  		__raw_get_cpu_var(__ipipe_tick_regs).pc = regs->pc; -		if (!ipipe_root_domain_p) -			__raw_get_cpu_var(__ipipe_tick_regs).ipend |= 0x10; -		else +		if (this_domain != ipipe_root_domain)  			__raw_get_cpu_var(__ipipe_tick_regs).ipend &= ~0x10; +		else +			__raw_get_cpu_var(__ipipe_tick_regs).ipend |= 0x10;  	} -handle_irq: +#ifndef CONFIG_GENERIC_CLOCKEVENTS +core_tick: +#endif +	if (this_domain == ipipe_root_domain) { +		s = __test_and_set_bit(IPIPE_SYNCDEFER_FLAG, &p->status); +		barrier(); +	}  	ipipe_trace_irq_entry(irq);  	__ipipe_handle_irq(irq, regs); -       ipipe_trace_irq_exit(irq); +	ipipe_trace_irq_exit(irq); -       if (ipipe_root_domain_p) -		return !test_bit(IPIPE_STALL_FLAG, &ipipe_root_cpudom_var(status)); +	if (this_domain == ipipe_root_domain) { +		set_thread_flag(TIF_IRQ_SYNC); +		if (!s) { +			__clear_bit(IPIPE_SYNCDEFER_FLAG, &p->status); +			return !test_bit(IPIPE_STALL_FLAG, &p->status); +		} +	}         return 0;  } diff --git a/arch/blackfin/mach-common/smp.c b/arch/blackfin/mach-common/smp.c index 77c99284709..93eab614607 100644 --- a/arch/blackfin/mach-common/smp.c +++ b/arch/blackfin/mach-common/smp.c @@ -158,10 +158,14 @@ static irqreturn_t ipi_handler(int irq, void *dev_instance)  			kfree(msg);  			break;  		case BFIN_IPI_CALL_FUNC: +			spin_unlock(&msg_queue->lock);  			ipi_call_function(cpu, msg); +			spin_lock(&msg_queue->lock);  			break;  		case BFIN_IPI_CPU_STOP: +			spin_unlock(&msg_queue->lock);  			ipi_cpu_stop(cpu); +			spin_lock(&msg_queue->lock);  			kfree(msg);  			break;  		default: @@ -457,7 +461,7 @@ void smp_icache_flush_range_others(unsigned long start, unsigned long end)  	smp_flush_data.start = start;  	smp_flush_data.end = end; -	if (smp_call_function(&ipi_flush_icache, &smp_flush_data, 1)) +	if (smp_call_function(&ipi_flush_icache, &smp_flush_data, 0))  		printk(KERN_WARNING "SMP: failed to run I-cache flush request on other CPUs\n");  }  EXPORT_SYMBOL_GPL(smp_icache_flush_range_others); diff --git a/arch/blackfin/mm/init.c b/arch/blackfin/mm/init.c index d0532b72bba..9c3629b9a68 100644 --- a/arch/blackfin/mm/init.c +++ b/arch/blackfin/mm/init.c @@ -104,7 +104,7 @@ void __init paging_init(void)  	}  } -asmlinkage void init_pda(void) +asmlinkage void __init init_pda(void)  {  	unsigned int cpu = raw_smp_processor_id(); diff --git a/arch/ia64/sn/pci/pcibr/pcibr_dma.c b/arch/ia64/sn/pci/pcibr/pcibr_dma.c index e626e50a938..060df4aa991 100644 --- a/arch/ia64/sn/pci/pcibr/pcibr_dma.c +++ b/arch/ia64/sn/pci/pcibr/pcibr_dma.c @@ -135,11 +135,10 @@ pcibr_dmatrans_direct64(struct pcidev_info * info, u64 paddr,  	if (SN_DMA_ADDRTYPE(dma_flags) == SN_DMA_ADDR_PHYS)  		pci_addr = IS_PIC_SOFT(pcibus_info) ?  				PHYS_TO_DMA(paddr) : -		    		PHYS_TO_TIODMA(paddr) | dma_attributes; +				PHYS_TO_TIODMA(paddr);  	else -		pci_addr = IS_PIC_SOFT(pcibus_info) ? -				paddr : -				paddr | dma_attributes; +		pci_addr = paddr; +	pci_addr |= dma_attributes;  	/* Handle Bus mode */  	if (IS_PCIX(pcibus_info)) diff --git a/arch/m68k/include/asm/param.h b/arch/m68k/include/asm/param.h index 40d1112a458..85c41b75aa7 100644 --- a/arch/m68k/include/asm/param.h +++ b/arch/m68k/include/asm/param.h @@ -1,5 +1,26 @@ +#ifndef _M68K_PARAM_H +#define _M68K_PARAM_H + +#ifdef __KERNEL__ +# define HZ		CONFIG_HZ	/* Internal kernel timer frequency */ +# define USER_HZ	100		/* .. some user interfaces are in "ticks" */ +# define CLOCKS_PER_SEC	(USER_HZ)	/* like times() */ +#endif + +#ifndef HZ +#define HZ 100 +#endif +  #ifdef __uClinux__ -#include "param_no.h" +#define EXEC_PAGESIZE	4096  #else -#include "param_mm.h" +#define EXEC_PAGESIZE	8192 +#endif + +#ifndef NOGROUP +#define NOGROUP		(-1)  #endif + +#define MAXHOSTNAMELEN	64	/* max length of hostname */ + +#endif /* _M68K_PARAM_H */ diff --git a/arch/m68k/include/asm/param_mm.h b/arch/m68k/include/asm/param_mm.h deleted file mode 100644 index 536a2788835..00000000000 --- a/arch/m68k/include/asm/param_mm.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _M68K_PARAM_H -#define _M68K_PARAM_H - -#ifdef __KERNEL__ -# define HZ		CONFIG_HZ	/* Internal kernel timer frequency */ -# define USER_HZ	100		/* .. some user interfaces are in "ticks" */ -# define CLOCKS_PER_SEC	(USER_HZ)	/* like times() */ -#endif - -#ifndef HZ -#define HZ 100 -#endif - -#define EXEC_PAGESIZE	8192 - -#ifndef NOGROUP -#define NOGROUP		(-1) -#endif - -#define MAXHOSTNAMELEN	64	/* max length of hostname */ - -#endif /* _M68K_PARAM_H */ diff --git a/arch/m68k/include/asm/param_no.h b/arch/m68k/include/asm/param_no.h deleted file mode 100644 index 6044397adb6..00000000000 --- a/arch/m68k/include/asm/param_no.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _M68KNOMMU_PARAM_H -#define _M68KNOMMU_PARAM_H - -#ifdef __KERNEL__ -#define HZ CONFIG_HZ -#define	USER_HZ		HZ -#define	CLOCKS_PER_SEC	(USER_HZ) -#endif - -#ifndef HZ -#define HZ	100 -#endif - -#define EXEC_PAGESIZE	4096 - -#ifndef NOGROUP -#define NOGROUP		(-1) -#endif - -#define MAXHOSTNAMELEN	64	/* max length of hostname */ - -#endif /* _M68KNOMMU_PARAM_H */ diff --git a/arch/m68k/include/asm/ptrace.h b/arch/m68k/include/asm/ptrace.h index e83cd2f6610..8c9194b9854 100644 --- a/arch/m68k/include/asm/ptrace.h +++ b/arch/m68k/include/asm/ptrace.h @@ -1,5 +1,87 @@ -#ifdef __uClinux__ -#include "ptrace_no.h" +#ifndef _M68K_PTRACE_H +#define _M68K_PTRACE_H + +#define PT_D1	   0 +#define PT_D2	   1 +#define PT_D3	   2 +#define PT_D4	   3 +#define PT_D5	   4 +#define PT_D6	   5 +#define PT_D7	   6 +#define PT_A0	   7 +#define PT_A1	   8 +#define PT_A2	   9 +#define PT_A3	   10 +#define PT_A4	   11 +#define PT_A5	   12 +#define PT_A6	   13 +#define PT_D0	   14 +#define PT_USP	   15 +#define PT_ORIG_D0 16 +#define PT_SR	   17 +#define PT_PC	   18 + +#ifndef __ASSEMBLY__ + +/* this struct defines the way the registers are stored on the +   stack during a system call. */ + +struct pt_regs { +  long     d1; +  long     d2; +  long     d3; +  long     d4; +  long     d5; +  long     a0; +  long     a1; +  long     a2; +  long     d0; +  long     orig_d0; +  long     stkadj; +#ifdef CONFIG_COLDFIRE +  unsigned format :  4; /* frame format specifier */ +  unsigned vector : 12; /* vector offset */ +  unsigned short sr; +  unsigned long  pc;  #else -#include "ptrace_mm.h" +  unsigned short sr; +  unsigned long  pc; +  unsigned format :  4; /* frame format specifier */ +  unsigned vector : 12; /* vector offset */  #endif +}; + +/* + * This is the extended stack used by signal handlers and the context + * switcher: it's pushed after the normal "struct pt_regs". + */ +struct switch_stack { +	unsigned long  d6; +	unsigned long  d7; +	unsigned long  a3; +	unsigned long  a4; +	unsigned long  a5; +	unsigned long  a6; +	unsigned long  retpc; +}; + +/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ +#define PTRACE_GETREGS            12 +#define PTRACE_SETREGS            13 +#define PTRACE_GETFPREGS          14 +#define PTRACE_SETFPREGS          15 + +#ifdef __KERNEL__ + +#ifndef PS_S +#define PS_S  (0x2000) +#define PS_M  (0x1000) +#endif + +#define user_mode(regs) (!((regs)->sr & PS_S)) +#define instruction_pointer(regs) ((regs)->pc) +#define profile_pc(regs) instruction_pointer(regs) +extern void show_regs(struct pt_regs *); +#endif /* __KERNEL__ */ +#endif /* __ASSEMBLY__ */ +#endif /* _M68K_PTRACE_H */ diff --git a/arch/m68k/include/asm/ptrace_mm.h b/arch/m68k/include/asm/ptrace_mm.h deleted file mode 100644 index 57e763d79bf..00000000000 --- a/arch/m68k/include/asm/ptrace_mm.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef _M68K_PTRACE_H -#define _M68K_PTRACE_H - -#define PT_D1	   0 -#define PT_D2	   1 -#define PT_D3	   2 -#define PT_D4	   3 -#define PT_D5	   4 -#define PT_D6	   5 -#define PT_D7	   6 -#define PT_A0	   7 -#define PT_A1	   8 -#define PT_A2	   9 -#define PT_A3	   10 -#define PT_A4	   11 -#define PT_A5	   12 -#define PT_A6	   13 -#define PT_D0	   14 -#define PT_USP	   15 -#define PT_ORIG_D0 16 -#define PT_SR	   17 -#define PT_PC	   18 - -#ifndef __ASSEMBLY__ - -/* this struct defines the way the registers are stored on the -   stack during a system call. */ - -struct pt_regs { -  long     d1; -  long     d2; -  long     d3; -  long     d4; -  long     d5; -  long     a0; -  long     a1; -  long     a2; -  long     d0; -  long     orig_d0; -  long     stkadj; -  unsigned short sr; -  unsigned long  pc; -  unsigned format :  4; /* frame format specifier */ -  unsigned vector : 12; /* vector offset */ -}; - -/* - * This is the extended stack used by signal handlers and the context - * switcher: it's pushed after the normal "struct pt_regs". - */ -struct switch_stack { -	unsigned long  d6; -	unsigned long  d7; -	unsigned long  a3; -	unsigned long  a4; -	unsigned long  a5; -	unsigned long  a6; -	unsigned long  retpc; -}; - -/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ -#define PTRACE_GETREGS            12 -#define PTRACE_SETREGS            13 -#define PTRACE_GETFPREGS          14 -#define PTRACE_SETFPREGS          15 - -#ifdef __KERNEL__ - -#ifndef PS_S -#define PS_S  (0x2000) -#define PS_M  (0x1000) -#endif - -#define user_mode(regs) (!((regs)->sr & PS_S)) -#define instruction_pointer(regs) ((regs)->pc) -#define profile_pc(regs) instruction_pointer(regs) -extern void show_regs(struct pt_regs *); -#endif /* __KERNEL__ */ -#endif /* __ASSEMBLY__ */ -#endif /* _M68K_PTRACE_H */ diff --git a/arch/m68k/include/asm/ptrace_no.h b/arch/m68k/include/asm/ptrace_no.h deleted file mode 100644 index 8c9194b9854..00000000000 --- a/arch/m68k/include/asm/ptrace_no.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef _M68K_PTRACE_H -#define _M68K_PTRACE_H - -#define PT_D1	   0 -#define PT_D2	   1 -#define PT_D3	   2 -#define PT_D4	   3 -#define PT_D5	   4 -#define PT_D6	   5 -#define PT_D7	   6 -#define PT_A0	   7 -#define PT_A1	   8 -#define PT_A2	   9 -#define PT_A3	   10 -#define PT_A4	   11 -#define PT_A5	   12 -#define PT_A6	   13 -#define PT_D0	   14 -#define PT_USP	   15 -#define PT_ORIG_D0 16 -#define PT_SR	   17 -#define PT_PC	   18 - -#ifndef __ASSEMBLY__ - -/* this struct defines the way the registers are stored on the -   stack during a system call. */ - -struct pt_regs { -  long     d1; -  long     d2; -  long     d3; -  long     d4; -  long     d5; -  long     a0; -  long     a1; -  long     a2; -  long     d0; -  long     orig_d0; -  long     stkadj; -#ifdef CONFIG_COLDFIRE -  unsigned format :  4; /* frame format specifier */ -  unsigned vector : 12; /* vector offset */ -  unsigned short sr; -  unsigned long  pc; -#else -  unsigned short sr; -  unsigned long  pc; -  unsigned format :  4; /* frame format specifier */ -  unsigned vector : 12; /* vector offset */ -#endif -}; - -/* - * This is the extended stack used by signal handlers and the context - * switcher: it's pushed after the normal "struct pt_regs". - */ -struct switch_stack { -	unsigned long  d6; -	unsigned long  d7; -	unsigned long  a3; -	unsigned long  a4; -	unsigned long  a5; -	unsigned long  a6; -	unsigned long  retpc; -}; - -/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ -#define PTRACE_GETREGS            12 -#define PTRACE_SETREGS            13 -#define PTRACE_GETFPREGS          14 -#define PTRACE_SETFPREGS          15 - -#ifdef __KERNEL__ - -#ifndef PS_S -#define PS_S  (0x2000) -#define PS_M  (0x1000) -#endif - -#define user_mode(regs) (!((regs)->sr & PS_S)) -#define instruction_pointer(regs) ((regs)->pc) -#define profile_pc(regs) instruction_pointer(regs) -extern void show_regs(struct pt_regs *); -#endif /* __KERNEL__ */ -#endif /* __ASSEMBLY__ */ -#endif /* _M68K_PTRACE_H */ diff --git a/arch/m68k/include/asm/setup.h b/arch/m68k/include/asm/setup.h index 842f86f75cc..4dfb3952b37 100644 --- a/arch/m68k/include/asm/setup.h +++ b/arch/m68k/include/asm/setup.h @@ -1,5 +1,376 @@ -#ifdef __uClinux__ -#include "setup_no.h" +/* +** asm/setup.h -- Definition of the Linux/m68k setup information +** +** Copyright 1992 by Greg Harp +** +** 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 +** for more details. +** +** Created 09/29/92 by Greg Harp +** +** 5/2/94 Roman Hodek: +**   Added bi_atari part of the machine dependent union bi_un; for now it +**   contains just a model field to distinguish between TT and Falcon. +** 26/7/96 Roman Zippel: +**   Renamed to setup.h; added some useful macros to allow gcc some +**   optimizations if possible. +** 5/10/96 Geert Uytterhoeven: +**   Redesign of the boot information structure; moved boot information +**   structure to bootinfo.h +*/ + +#ifndef _M68K_SETUP_H +#define _M68K_SETUP_H + + + +    /* +     *  Linux/m68k Architectures +     */ + +#define MACH_AMIGA    1 +#define MACH_ATARI    2 +#define MACH_MAC      3 +#define MACH_APOLLO   4 +#define MACH_SUN3     5 +#define MACH_MVME147  6 +#define MACH_MVME16x  7 +#define MACH_BVME6000 8 +#define MACH_HP300    9 +#define MACH_Q40     10 +#define MACH_SUN3X   11 + +#define COMMAND_LINE_SIZE 256 + +#ifdef __KERNEL__ + +#define CL_SIZE COMMAND_LINE_SIZE + +#ifndef __ASSEMBLY__ +extern unsigned long m68k_machtype; +#endif /* !__ASSEMBLY__ */ + +#if !defined(CONFIG_AMIGA) +#  define MACH_IS_AMIGA (0) +#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \ +	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)               \ +	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                      \ +	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) +#  define MACH_IS_AMIGA (m68k_machtype == MACH_AMIGA)  #else -#include "setup_mm.h" +#  define MACH_AMIGA_ONLY +#  define MACH_IS_AMIGA (1) +#  define MACH_TYPE (MACH_AMIGA)  #endif + +#if !defined(CONFIG_ATARI) +#  define MACH_IS_ATARI (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \ +	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)               \ +	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                      \ +	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) +#  define MACH_IS_ATARI (m68k_machtype == MACH_ATARI) +#else +#  define MACH_ATARI_ONLY +#  define MACH_IS_ATARI (1) +#  define MACH_TYPE (MACH_ATARI) +#endif + +#if !defined(CONFIG_MAC) +#  define MACH_IS_MAC (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) \ +	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)                 \ +	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                        \ +	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) +#  define MACH_IS_MAC (m68k_machtype == MACH_MAC) +#else +#  define MACH_MAC_ONLY +#  define MACH_IS_MAC (1) +#  define MACH_TYPE (MACH_MAC) +#endif + +#if defined(CONFIG_SUN3) +#define MACH_IS_SUN3 (1) +#define MACH_SUN3_ONLY (1) +#define MACH_TYPE (MACH_SUN3) +#else +#define MACH_IS_SUN3 (0) +#endif + +#if !defined (CONFIG_APOLLO) +#  define MACH_IS_APOLLO (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ +	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)              \ +	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \ +	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) +#  define MACH_IS_APOLLO (m68k_machtype == MACH_APOLLO) +#else +#  define MACH_APOLLO_ONLY +#  define MACH_IS_APOLLO (1) +#  define MACH_TYPE (MACH_APOLLO) +#endif + +#if !defined (CONFIG_MVME147) +#  define MACH_IS_MVME147 (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ +	|| defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000)               \ +	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \ +	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x) +#  define MACH_IS_MVME147 (m68k_machtype == MACH_MVME147) +#else +#  define MACH_MVME147_ONLY +#  define MACH_IS_MVME147 (1) +#  define MACH_TYPE (MACH_MVME147) +#endif + +#if !defined (CONFIG_MVME16x) +#  define MACH_IS_MVME16x (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ +	|| defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000)               \ +	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \ +	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) +#  define MACH_IS_MVME16x (m68k_machtype == MACH_MVME16x) +#else +#  define MACH_MVME16x_ONLY +#  define MACH_IS_MVME16x (1) +#  define MACH_TYPE (MACH_MVME16x) +#endif + +#if !defined (CONFIG_BVME6000) +#  define MACH_IS_BVME6000 (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ +	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \ +	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \ +	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) +#  define MACH_IS_BVME6000 (m68k_machtype == MACH_BVME6000) +#else +#  define MACH_BVME6000_ONLY +#  define MACH_IS_BVME6000 (1) +#  define MACH_TYPE (MACH_BVME6000) +#endif + +#if !defined (CONFIG_HP300) +#  define MACH_IS_HP300 (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ +	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \ +	|| defined(CONFIG_BVME6000) || defined(CONFIG_Q40) \ +	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) +#  define MACH_IS_HP300 (m68k_machtype == MACH_HP300) +#else +#  define MACH_HP300_ONLY +#  define MACH_IS_HP300 (1) +#  define MACH_TYPE (MACH_HP300) +#endif + +#if !defined (CONFIG_Q40) +#  define MACH_IS_Q40 (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ +	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \ +	|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300)                \ +	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) +#  define MACH_IS_Q40 (m68k_machtype == MACH_Q40) +#else +#  define MACH_Q40_ONLY +#  define MACH_IS_Q40 (1) +#  define MACH_TYPE (MACH_Q40) +#endif + +#if !defined (CONFIG_SUN3X) +#  define MACH_IS_SUN3X (0) +#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ +	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \ +	|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300)                \ +	|| defined(CONFIG_Q40) || defined(CONFIG_MVME147) +#  define MACH_IS_SUN3X (m68k_machtype == MACH_SUN3X) +#else +#  define CONFIG_SUN3X_ONLY +#  define MACH_IS_SUN3X (1) +#  define MACH_TYPE (MACH_SUN3X) +#endif + +#ifndef MACH_TYPE +#  define MACH_TYPE (m68k_machtype) +#endif + +#endif /* __KERNEL__ */ + + +    /* +     *  CPU, FPU and MMU types +     * +     *  Note: we may rely on the following equalities: +     * +     *      CPU_68020 == MMU_68851 +     *      CPU_68030 == MMU_68030 +     *      CPU_68040 == FPU_68040 == MMU_68040 +     *      CPU_68060 == FPU_68060 == MMU_68060 +     */ + +#define CPUB_68020     0 +#define CPUB_68030     1 +#define CPUB_68040     2 +#define CPUB_68060     3 + +#define CPU_68020      (1<<CPUB_68020) +#define CPU_68030      (1<<CPUB_68030) +#define CPU_68040      (1<<CPUB_68040) +#define CPU_68060      (1<<CPUB_68060) + +#define FPUB_68881     0 +#define FPUB_68882     1 +#define FPUB_68040     2                       /* Internal FPU */ +#define FPUB_68060     3                       /* Internal FPU */ +#define FPUB_SUNFPA    4                       /* Sun-3 FPA */ + +#define FPU_68881      (1<<FPUB_68881) +#define FPU_68882      (1<<FPUB_68882) +#define FPU_68040      (1<<FPUB_68040) +#define FPU_68060      (1<<FPUB_68060) +#define FPU_SUNFPA     (1<<FPUB_SUNFPA) + +#define MMUB_68851     0 +#define MMUB_68030     1                       /* Internal MMU */ +#define MMUB_68040     2                       /* Internal MMU */ +#define MMUB_68060     3                       /* Internal MMU */ +#define MMUB_APOLLO    4                       /* Custom Apollo */ +#define MMUB_SUN3      5                       /* Custom Sun-3 */ + +#define MMU_68851      (1<<MMUB_68851) +#define MMU_68030      (1<<MMUB_68030) +#define MMU_68040      (1<<MMUB_68040) +#define MMU_68060      (1<<MMUB_68060) +#define MMU_SUN3       (1<<MMUB_SUN3) +#define MMU_APOLLO     (1<<MMUB_APOLLO) + +#ifdef __KERNEL__ + +#ifndef __ASSEMBLY__ +extern unsigned long m68k_cputype; +extern unsigned long m68k_fputype; +extern unsigned long m68k_mmutype; +#ifdef CONFIG_VME +extern unsigned long vme_brdtype; +#endif + +    /* +     *  m68k_is040or060 is != 0 for a '040 or higher; +     *  used numbers are 4 for 68040 and 6 for 68060. +     */ + +extern int m68k_is040or060; +#endif /* !__ASSEMBLY__ */ + +#if !defined(CONFIG_M68020) +#  define CPU_IS_020 (0) +#  define MMU_IS_851 (0) +#  define MMU_IS_SUN3 (0) +#elif defined(CONFIG_M68030) || defined(CONFIG_M68040) || defined(CONFIG_M68060) +#  define CPU_IS_020 (m68k_cputype & CPU_68020) +#  define MMU_IS_851 (m68k_mmutype & MMU_68851) +#  define MMU_IS_SUN3 (0)	/* Sun3 not supported with other CPU enabled */ +#else +#  define CPU_M68020_ONLY +#  define CPU_IS_020 (1) +#ifdef MACH_SUN3_ONLY +#  define MMU_IS_SUN3 (1) +#  define MMU_IS_851 (0) +#else +#  define MMU_IS_SUN3 (0) +#  define MMU_IS_851 (1) +#endif +#endif + +#if !defined(CONFIG_M68030) +#  define CPU_IS_030 (0) +#  define MMU_IS_030 (0) +#elif defined(CONFIG_M68020) || defined(CONFIG_M68040) || defined(CONFIG_M68060) +#  define CPU_IS_030 (m68k_cputype & CPU_68030) +#  define MMU_IS_030 (m68k_mmutype & MMU_68030) +#else +#  define CPU_M68030_ONLY +#  define CPU_IS_030 (1) +#  define MMU_IS_030 (1) +#endif + +#if !defined(CONFIG_M68040) +#  define CPU_IS_040 (0) +#  define MMU_IS_040 (0) +#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68060) +#  define CPU_IS_040 (m68k_cputype & CPU_68040) +#  define MMU_IS_040 (m68k_mmutype & MMU_68040) +#else +#  define CPU_M68040_ONLY +#  define CPU_IS_040 (1) +#  define MMU_IS_040 (1) +#endif + +#if !defined(CONFIG_M68060) +#  define CPU_IS_060 (0) +#  define MMU_IS_060 (0) +#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68040) +#  define CPU_IS_060 (m68k_cputype & CPU_68060) +#  define MMU_IS_060 (m68k_mmutype & MMU_68060) +#else +#  define CPU_M68060_ONLY +#  define CPU_IS_060 (1) +#  define MMU_IS_060 (1) +#endif + +#if !defined(CONFIG_M68020) && !defined(CONFIG_M68030) +#  define CPU_IS_020_OR_030 (0) +#else +#  define CPU_M68020_OR_M68030 +#  if defined(CONFIG_M68040) || defined(CONFIG_M68060) +#    define CPU_IS_020_OR_030 (!m68k_is040or060) +#  else +#    define CPU_M68020_OR_M68030_ONLY +#    define CPU_IS_020_OR_030 (1) +#  endif +#endif + +#if !defined(CONFIG_M68040) && !defined(CONFIG_M68060) +#  define CPU_IS_040_OR_060 (0) +#else +#  define CPU_M68040_OR_M68060 +#  if defined(CONFIG_M68020) || defined(CONFIG_M68030) +#    define CPU_IS_040_OR_060 (m68k_is040or060) +#  else +#    define CPU_M68040_OR_M68060_ONLY +#    define CPU_IS_040_OR_060 (1) +#  endif +#endif + +#define CPU_TYPE (m68k_cputype) + +#ifdef CONFIG_M68KFPU_EMU +#  ifdef CONFIG_M68KFPU_EMU_ONLY +#    define FPU_IS_EMU (1) +#  else +#    define FPU_IS_EMU (!m68k_fputype) +#  endif +#else +#  define FPU_IS_EMU (0) +#endif + + +    /* +     *  Miscellaneous +     */ + +#define NUM_MEMINFO	4 + +#ifndef __ASSEMBLY__ +struct mem_info { +	unsigned long addr;		/* physical address of memory chunk */ +	unsigned long size;		/* length of memory chunk (in bytes) */ +}; + +extern int m68k_num_memory;		/* # of memory blocks found (and used) */ +extern int m68k_realnum_memory;		/* real # of memory blocks found */ +extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */ +#endif + +#endif /* __KERNEL__ */ + +#endif /* _M68K_SETUP_H */ diff --git a/arch/m68k/include/asm/setup_mm.h b/arch/m68k/include/asm/setup_mm.h deleted file mode 100644 index 4dfb3952b37..00000000000 --- a/arch/m68k/include/asm/setup_mm.h +++ /dev/null @@ -1,376 +0,0 @@ -/* -** asm/setup.h -- Definition of the Linux/m68k setup information -** -** Copyright 1992 by Greg Harp -** -** 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 -** for more details. -** -** Created 09/29/92 by Greg Harp -** -** 5/2/94 Roman Hodek: -**   Added bi_atari part of the machine dependent union bi_un; for now it -**   contains just a model field to distinguish between TT and Falcon. -** 26/7/96 Roman Zippel: -**   Renamed to setup.h; added some useful macros to allow gcc some -**   optimizations if possible. -** 5/10/96 Geert Uytterhoeven: -**   Redesign of the boot information structure; moved boot information -**   structure to bootinfo.h -*/ - -#ifndef _M68K_SETUP_H -#define _M68K_SETUP_H - - - -    /* -     *  Linux/m68k Architectures -     */ - -#define MACH_AMIGA    1 -#define MACH_ATARI    2 -#define MACH_MAC      3 -#define MACH_APOLLO   4 -#define MACH_SUN3     5 -#define MACH_MVME147  6 -#define MACH_MVME16x  7 -#define MACH_BVME6000 8 -#define MACH_HP300    9 -#define MACH_Q40     10 -#define MACH_SUN3X   11 - -#define COMMAND_LINE_SIZE 256 - -#ifdef __KERNEL__ - -#define CL_SIZE COMMAND_LINE_SIZE - -#ifndef __ASSEMBLY__ -extern unsigned long m68k_machtype; -#endif /* !__ASSEMBLY__ */ - -#if !defined(CONFIG_AMIGA) -#  define MACH_IS_AMIGA (0) -#elif defined(CONFIG_ATARI) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \ -	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)               \ -	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                      \ -	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) -#  define MACH_IS_AMIGA (m68k_machtype == MACH_AMIGA) -#else -#  define MACH_AMIGA_ONLY -#  define MACH_IS_AMIGA (1) -#  define MACH_TYPE (MACH_AMIGA) -#endif - -#if !defined(CONFIG_ATARI) -#  define MACH_IS_ATARI (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_APOLLO) \ -	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)               \ -	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                      \ -	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) -#  define MACH_IS_ATARI (m68k_machtype == MACH_ATARI) -#else -#  define MACH_ATARI_ONLY -#  define MACH_IS_ATARI (1) -#  define MACH_TYPE (MACH_ATARI) -#endif - -#if !defined(CONFIG_MAC) -#  define MACH_IS_MAC (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_ATARI) || defined(CONFIG_APOLLO) \ -	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)                 \ -	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                        \ -	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) -#  define MACH_IS_MAC (m68k_machtype == MACH_MAC) -#else -#  define MACH_MAC_ONLY -#  define MACH_IS_MAC (1) -#  define MACH_TYPE (MACH_MAC) -#endif - -#if defined(CONFIG_SUN3) -#define MACH_IS_SUN3 (1) -#define MACH_SUN3_ONLY (1) -#define MACH_TYPE (MACH_SUN3) -#else -#define MACH_IS_SUN3 (0) -#endif - -#if !defined (CONFIG_APOLLO) -#  define MACH_IS_APOLLO (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ -	|| defined(CONFIG_MVME16x) || defined(CONFIG_BVME6000)              \ -	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \ -	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) -#  define MACH_IS_APOLLO (m68k_machtype == MACH_APOLLO) -#else -#  define MACH_APOLLO_ONLY -#  define MACH_IS_APOLLO (1) -#  define MACH_TYPE (MACH_APOLLO) -#endif - -#if !defined (CONFIG_MVME147) -#  define MACH_IS_MVME147 (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ -	|| defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000)               \ -	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \ -	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME16x) -#  define MACH_IS_MVME147 (m68k_machtype == MACH_MVME147) -#else -#  define MACH_MVME147_ONLY -#  define MACH_IS_MVME147 (1) -#  define MACH_TYPE (MACH_MVME147) -#endif - -#if !defined (CONFIG_MVME16x) -#  define MACH_IS_MVME16x (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ -	|| defined(CONFIG_APOLLO) || defined(CONFIG_BVME6000)               \ -	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \ -	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) -#  define MACH_IS_MVME16x (m68k_machtype == MACH_MVME16x) -#else -#  define MACH_MVME16x_ONLY -#  define MACH_IS_MVME16x (1) -#  define MACH_TYPE (MACH_MVME16x) -#endif - -#if !defined (CONFIG_BVME6000) -#  define MACH_IS_BVME6000 (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ -	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \ -	|| defined(CONFIG_HP300) || defined(CONFIG_Q40)                     \ -	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) -#  define MACH_IS_BVME6000 (m68k_machtype == MACH_BVME6000) -#else -#  define MACH_BVME6000_ONLY -#  define MACH_IS_BVME6000 (1) -#  define MACH_TYPE (MACH_BVME6000) -#endif - -#if !defined (CONFIG_HP300) -#  define MACH_IS_HP300 (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ -	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x) \ -	|| defined(CONFIG_BVME6000) || defined(CONFIG_Q40) \ -	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) -#  define MACH_IS_HP300 (m68k_machtype == MACH_HP300) -#else -#  define MACH_HP300_ONLY -#  define MACH_IS_HP300 (1) -#  define MACH_TYPE (MACH_HP300) -#endif - -#if !defined (CONFIG_Q40) -#  define MACH_IS_Q40 (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ -	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \ -	|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300)                \ -	|| defined(CONFIG_SUN3X) || defined(CONFIG_MVME147) -#  define MACH_IS_Q40 (m68k_machtype == MACH_Q40) -#else -#  define MACH_Q40_ONLY -#  define MACH_IS_Q40 (1) -#  define MACH_TYPE (MACH_Q40) -#endif - -#if !defined (CONFIG_SUN3X) -#  define MACH_IS_SUN3X (0) -#elif defined(CONFIG_AMIGA) || defined(CONFIG_MAC) || defined(CONFIG_ATARI) \ -	|| defined(CONFIG_APOLLO) || defined(CONFIG_MVME16x)                \ -	|| defined(CONFIG_BVME6000) || defined(CONFIG_HP300)                \ -	|| defined(CONFIG_Q40) || defined(CONFIG_MVME147) -#  define MACH_IS_SUN3X (m68k_machtype == MACH_SUN3X) -#else -#  define CONFIG_SUN3X_ONLY -#  define MACH_IS_SUN3X (1) -#  define MACH_TYPE (MACH_SUN3X) -#endif - -#ifndef MACH_TYPE -#  define MACH_TYPE (m68k_machtype) -#endif - -#endif /* __KERNEL__ */ - - -    /* -     *  CPU, FPU and MMU types -     * -     *  Note: we may rely on the following equalities: -     * -     *      CPU_68020 == MMU_68851 -     *      CPU_68030 == MMU_68030 -     *      CPU_68040 == FPU_68040 == MMU_68040 -     *      CPU_68060 == FPU_68060 == MMU_68060 -     */ - -#define CPUB_68020     0 -#define CPUB_68030     1 -#define CPUB_68040     2 -#define CPUB_68060     3 - -#define CPU_68020      (1<<CPUB_68020) -#define CPU_68030      (1<<CPUB_68030) -#define CPU_68040      (1<<CPUB_68040) -#define CPU_68060      (1<<CPUB_68060) - -#define FPUB_68881     0 -#define FPUB_68882     1 -#define FPUB_68040     2                       /* Internal FPU */ -#define FPUB_68060     3                       /* Internal FPU */ -#define FPUB_SUNFPA    4                       /* Sun-3 FPA */ - -#define FPU_68881      (1<<FPUB_68881) -#define FPU_68882      (1<<FPUB_68882) -#define FPU_68040      (1<<FPUB_68040) -#define FPU_68060      (1<<FPUB_68060) -#define FPU_SUNFPA     (1<<FPUB_SUNFPA) - -#define MMUB_68851     0 -#define MMUB_68030     1                       /* Internal MMU */ -#define MMUB_68040     2                       /* Internal MMU */ -#define MMUB_68060     3                       /* Internal MMU */ -#define MMUB_APOLLO    4                       /* Custom Apollo */ -#define MMUB_SUN3      5                       /* Custom Sun-3 */ - -#define MMU_68851      (1<<MMUB_68851) -#define MMU_68030      (1<<MMUB_68030) -#define MMU_68040      (1<<MMUB_68040) -#define MMU_68060      (1<<MMUB_68060) -#define MMU_SUN3       (1<<MMUB_SUN3) -#define MMU_APOLLO     (1<<MMUB_APOLLO) - -#ifdef __KERNEL__ - -#ifndef __ASSEMBLY__ -extern unsigned long m68k_cputype; -extern unsigned long m68k_fputype; -extern unsigned long m68k_mmutype; -#ifdef CONFIG_VME -extern unsigned long vme_brdtype; -#endif - -    /* -     *  m68k_is040or060 is != 0 for a '040 or higher; -     *  used numbers are 4 for 68040 and 6 for 68060. -     */ - -extern int m68k_is040or060; -#endif /* !__ASSEMBLY__ */ - -#if !defined(CONFIG_M68020) -#  define CPU_IS_020 (0) -#  define MMU_IS_851 (0) -#  define MMU_IS_SUN3 (0) -#elif defined(CONFIG_M68030) || defined(CONFIG_M68040) || defined(CONFIG_M68060) -#  define CPU_IS_020 (m68k_cputype & CPU_68020) -#  define MMU_IS_851 (m68k_mmutype & MMU_68851) -#  define MMU_IS_SUN3 (0)	/* Sun3 not supported with other CPU enabled */ -#else -#  define CPU_M68020_ONLY -#  define CPU_IS_020 (1) -#ifdef MACH_SUN3_ONLY -#  define MMU_IS_SUN3 (1) -#  define MMU_IS_851 (0) -#else -#  define MMU_IS_SUN3 (0) -#  define MMU_IS_851 (1) -#endif -#endif - -#if !defined(CONFIG_M68030) -#  define CPU_IS_030 (0) -#  define MMU_IS_030 (0) -#elif defined(CONFIG_M68020) || defined(CONFIG_M68040) || defined(CONFIG_M68060) -#  define CPU_IS_030 (m68k_cputype & CPU_68030) -#  define MMU_IS_030 (m68k_mmutype & MMU_68030) -#else -#  define CPU_M68030_ONLY -#  define CPU_IS_030 (1) -#  define MMU_IS_030 (1) -#endif - -#if !defined(CONFIG_M68040) -#  define CPU_IS_040 (0) -#  define MMU_IS_040 (0) -#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68060) -#  define CPU_IS_040 (m68k_cputype & CPU_68040) -#  define MMU_IS_040 (m68k_mmutype & MMU_68040) -#else -#  define CPU_M68040_ONLY -#  define CPU_IS_040 (1) -#  define MMU_IS_040 (1) -#endif - -#if !defined(CONFIG_M68060) -#  define CPU_IS_060 (0) -#  define MMU_IS_060 (0) -#elif defined(CONFIG_M68020) || defined(CONFIG_M68030) || defined(CONFIG_M68040) -#  define CPU_IS_060 (m68k_cputype & CPU_68060) -#  define MMU_IS_060 (m68k_mmutype & MMU_68060) -#else -#  define CPU_M68060_ONLY -#  define CPU_IS_060 (1) -#  define MMU_IS_060 (1) -#endif - -#if !defined(CONFIG_M68020) && !defined(CONFIG_M68030) -#  define CPU_IS_020_OR_030 (0) -#else -#  define CPU_M68020_OR_M68030 -#  if defined(CONFIG_M68040) || defined(CONFIG_M68060) -#    define CPU_IS_020_OR_030 (!m68k_is040or060) -#  else -#    define CPU_M68020_OR_M68030_ONLY -#    define CPU_IS_020_OR_030 (1) -#  endif -#endif - -#if !defined(CONFIG_M68040) && !defined(CONFIG_M68060) -#  define CPU_IS_040_OR_060 (0) -#else -#  define CPU_M68040_OR_M68060 -#  if defined(CONFIG_M68020) || defined(CONFIG_M68030) -#    define CPU_IS_040_OR_060 (m68k_is040or060) -#  else -#    define CPU_M68040_OR_M68060_ONLY -#    define CPU_IS_040_OR_060 (1) -#  endif -#endif - -#define CPU_TYPE (m68k_cputype) - -#ifdef CONFIG_M68KFPU_EMU -#  ifdef CONFIG_M68KFPU_EMU_ONLY -#    define FPU_IS_EMU (1) -#  else -#    define FPU_IS_EMU (!m68k_fputype) -#  endif -#else -#  define FPU_IS_EMU (0) -#endif - - -    /* -     *  Miscellaneous -     */ - -#define NUM_MEMINFO	4 - -#ifndef __ASSEMBLY__ -struct mem_info { -	unsigned long addr;		/* physical address of memory chunk */ -	unsigned long size;		/* length of memory chunk (in bytes) */ -}; - -extern int m68k_num_memory;		/* # of memory blocks found (and used) */ -extern int m68k_realnum_memory;		/* real # of memory blocks found */ -extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */ -#endif - -#endif /* __KERNEL__ */ - -#endif /* _M68K_SETUP_H */ diff --git a/arch/m68k/include/asm/setup_no.h b/arch/m68k/include/asm/setup_no.h deleted file mode 100644 index 45d286ce939..00000000000 --- a/arch/m68k/include/asm/setup_no.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifdef __KERNEL__ - -#include <asm/setup_mm.h> - -/* We have a bigger command line buffer. */ -#undef COMMAND_LINE_SIZE - -#endif  /*  __KERNEL__  */ - -#define COMMAND_LINE_SIZE	512 diff --git a/arch/m68k/include/asm/sigcontext.h b/arch/m68k/include/asm/sigcontext.h index bff6d40345a..523db2a51cf 100644 --- a/arch/m68k/include/asm/sigcontext.h +++ b/arch/m68k/include/asm/sigcontext.h @@ -1,5 +1,24 @@ +#ifndef _ASM_M68k_SIGCONTEXT_H +#define _ASM_M68k_SIGCONTEXT_H + +struct sigcontext { +	unsigned long  sc_mask;		/* old sigmask */ +	unsigned long  sc_usp;		/* old user stack pointer */ +	unsigned long  sc_d0; +	unsigned long  sc_d1; +	unsigned long  sc_a0; +	unsigned long  sc_a1;  #ifdef __uClinux__ -#include "sigcontext_no.h" -#else -#include "sigcontext_mm.h" +	unsigned long  sc_a5; +#endif +	unsigned short sc_sr; +	unsigned long  sc_pc; +	unsigned short sc_formatvec; +#ifndef __uClinux__ +	unsigned long  sc_fpregs[2*3];  /* room for two fp registers */ +	unsigned long  sc_fpcntl[3]; +	unsigned char  sc_fpstate[216]; +#endif +}; +  #endif diff --git a/arch/m68k/include/asm/sigcontext_mm.h b/arch/m68k/include/asm/sigcontext_mm.h deleted file mode 100644 index 64fbe34cf26..00000000000 --- a/arch/m68k/include/asm/sigcontext_mm.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _ASM_M68k_SIGCONTEXT_H -#define _ASM_M68k_SIGCONTEXT_H - -struct sigcontext { -	unsigned long  sc_mask;		/* old sigmask */ -	unsigned long  sc_usp;		/* old user stack pointer */ -	unsigned long  sc_d0; -	unsigned long  sc_d1; -	unsigned long  sc_a0; -	unsigned long  sc_a1; -	unsigned short sc_sr; -	unsigned long  sc_pc; -	unsigned short sc_formatvec; -	unsigned long  sc_fpregs[2*3];  /* room for two fp registers */ -	unsigned long  sc_fpcntl[3]; -	unsigned char  sc_fpstate[216]; -}; - -#endif diff --git a/arch/m68k/include/asm/sigcontext_no.h b/arch/m68k/include/asm/sigcontext_no.h deleted file mode 100644 index 36c293fc133..00000000000 --- a/arch/m68k/include/asm/sigcontext_no.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _ASM_M68KNOMMU_SIGCONTEXT_H -#define _ASM_M68KNOMMU_SIGCONTEXT_H - -struct sigcontext { -	unsigned long  sc_mask; 	/* old sigmask */ -	unsigned long  sc_usp;		/* old user stack pointer */ -	unsigned long  sc_d0; -	unsigned long  sc_d1; -	unsigned long  sc_a0; -	unsigned long  sc_a1; -	unsigned long  sc_a5; -	unsigned short sc_sr; -	unsigned long  sc_pc; -	unsigned short sc_formatvec; -}; - -#endif diff --git a/arch/m68k/include/asm/siginfo.h b/arch/m68k/include/asm/siginfo.h index 61219d7affc..ca7dde8fd22 100644 --- a/arch/m68k/include/asm/siginfo.h +++ b/arch/m68k/include/asm/siginfo.h @@ -1,5 +1,97 @@ -#ifdef __uClinux__ -#include "siginfo_no.h" +#ifndef _M68K_SIGINFO_H +#define _M68K_SIGINFO_H + +#ifndef __uClinux__ +#define HAVE_ARCH_SIGINFO_T +#define HAVE_ARCH_COPY_SIGINFO +#endif + +#include <asm-generic/siginfo.h> + +#ifndef __uClinux__ + +typedef struct siginfo { +	int si_signo; +	int si_errno; +	int si_code; + +	union { +		int _pad[SI_PAD_SIZE]; + +		/* kill() */ +		struct { +			__kernel_pid_t _pid;	/* sender's pid */ +			__kernel_uid_t _uid;	/* backwards compatibility */ +			__kernel_uid32_t _uid32; /* sender's uid */ +		} _kill; + +		/* POSIX.1b timers */ +		struct { +			timer_t _tid;		/* timer id */ +			int _overrun;		/* overrun count */ +			char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)]; +			sigval_t _sigval;	/* same as below */ +			int _sys_private;       /* not to be passed to user */ +		} _timer; + +		/* POSIX.1b signals */ +		struct { +			__kernel_pid_t _pid;	/* sender's pid */ +			__kernel_uid_t _uid;	/* backwards compatibility */ +			sigval_t _sigval; +			__kernel_uid32_t _uid32; /* sender's uid */ +		} _rt; + +		/* SIGCHLD */ +		struct { +			__kernel_pid_t _pid;	/* which child */ +			__kernel_uid_t _uid;	/* backwards compatibility */ +			int _status;		/* exit code */ +			clock_t _utime; +			clock_t _stime; +			__kernel_uid32_t _uid32; /* sender's uid */ +		} _sigchld; + +		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ +		struct { +			void *_addr; /* faulting insn/memory ref. */ +		} _sigfault; + +		/* SIGPOLL */ +		struct { +			int _band;	/* POLL_IN, POLL_OUT, POLL_MSG */ +			int _fd; +		} _sigpoll; +	} _sifields; +} siginfo_t; + +#define UID16_SIGINFO_COMPAT_NEEDED + +/* + * How these fields are to be accessed. + */ +#undef si_uid +#ifdef __KERNEL__ +#define si_uid		_sifields._kill._uid32 +#define si_uid16	_sifields._kill._uid  #else -#include "siginfo_mm.h" +#define si_uid		_sifields._kill._uid +#endif + +#ifdef __KERNEL__ + +#include <linux/string.h> + +static inline void copy_siginfo(struct siginfo *to, struct siginfo *from) +{ +	if (from->si_code < 0) +		memcpy(to, from, sizeof(*to)); +	else +		/* _sigchld is currently the largest know union member */ +		memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld)); +} + +#endif /* __KERNEL__ */ +#endif /* !__uClinux__ */ +  #endif diff --git a/arch/m68k/include/asm/siginfo_mm.h b/arch/m68k/include/asm/siginfo_mm.h deleted file mode 100644 index 05a8d6d90b5..00000000000 --- a/arch/m68k/include/asm/siginfo_mm.h +++ /dev/null @@ -1,92 +0,0 @@ -#ifndef _M68K_SIGINFO_H -#define _M68K_SIGINFO_H - -#define HAVE_ARCH_SIGINFO_T -#define HAVE_ARCH_COPY_SIGINFO - -#include <asm-generic/siginfo.h> - -typedef struct siginfo { -	int si_signo; -	int si_errno; -	int si_code; - -	union { -		int _pad[SI_PAD_SIZE]; - -		/* kill() */ -		struct { -			__kernel_pid_t _pid;	/* sender's pid */ -			__kernel_uid_t _uid;	/* backwards compatibility */ -			__kernel_uid32_t _uid32; /* sender's uid */ -		} _kill; - -		/* POSIX.1b timers */ -		struct { -			timer_t _tid;		/* timer id */ -			int _overrun;		/* overrun count */ -			char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)]; -			sigval_t _sigval;	/* same as below */ -			int _sys_private;       /* not to be passed to user */ -		} _timer; - -		/* POSIX.1b signals */ -		struct { -			__kernel_pid_t _pid;	/* sender's pid */ -			__kernel_uid_t _uid;	/* backwards compatibility */ -			sigval_t _sigval; -			__kernel_uid32_t _uid32; /* sender's uid */ -		} _rt; - -		/* SIGCHLD */ -		struct { -			__kernel_pid_t _pid;	/* which child */ -			__kernel_uid_t _uid;	/* backwards compatibility */ -			int _status;		/* exit code */ -			clock_t _utime; -			clock_t _stime; -			__kernel_uid32_t _uid32; /* sender's uid */ -		} _sigchld; - -		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ -		struct { -			void *_addr; /* faulting insn/memory ref. */ -		} _sigfault; - -		/* SIGPOLL */ -		struct { -			int _band;	/* POLL_IN, POLL_OUT, POLL_MSG */ -			int _fd; -		} _sigpoll; -	} _sifields; -} siginfo_t; - -#define UID16_SIGINFO_COMPAT_NEEDED - -/* - * How these fields are to be accessed. - */ -#undef si_uid -#ifdef __KERNEL__ -#define si_uid		_sifields._kill._uid32 -#define si_uid16	_sifields._kill._uid -#else -#define si_uid		_sifields._kill._uid -#endif - -#ifdef __KERNEL__ - -#include <linux/string.h> - -static inline void copy_siginfo(struct siginfo *to, struct siginfo *from) -{ -	if (from->si_code < 0) -		memcpy(to, from, sizeof(*to)); -	else -		/* _sigchld is currently the largest know union member */ -		memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld)); -} - -#endif /* __KERNEL__ */ - -#endif diff --git a/arch/m68k/include/asm/siginfo_no.h b/arch/m68k/include/asm/siginfo_no.h deleted file mode 100644 index b18e5f4064a..00000000000 --- a/arch/m68k/include/asm/siginfo_no.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _M68KNOMMU_SIGINFO_H -#define _M68KNOMMU_SIGINFO_H - -#include <asm-generic/siginfo.h> - -#endif diff --git a/arch/m68k/include/asm/signal.h b/arch/m68k/include/asm/signal.h index 3c19988bd93..08788fdefde 100644 --- a/arch/m68k/include/asm/signal.h +++ b/arch/m68k/include/asm/signal.h @@ -1,5 +1,213 @@ -#ifdef __uClinux__ -#include "signal_no.h" +#ifndef _M68K_SIGNAL_H +#define _M68K_SIGNAL_H + +#include <linux/types.h> + +/* Avoid too many header ordering problems.  */ +struct siginfo; + +#ifdef __KERNEL__ +/* Most things should be clean enough to redefine this at will, if care +   is taken to make libc match.  */ + +#define _NSIG		64 +#define _NSIG_BPW	32 +#define _NSIG_WORDS	(_NSIG / _NSIG_BPW) + +typedef unsigned long old_sigset_t;		/* at least 32 bits */ + +typedef struct { +	unsigned long sig[_NSIG_WORDS]; +} sigset_t; +  #else -#include "signal_mm.h" -#endif +/* Here we must cater to libcs that poke about in kernel headers.  */ + +#define NSIG		32 +typedef unsigned long sigset_t; + +#endif /* __KERNEL__ */ + +#define SIGHUP		 1 +#define SIGINT		 2 +#define SIGQUIT		 3 +#define SIGILL		 4 +#define SIGTRAP		 5 +#define SIGABRT		 6 +#define SIGIOT		 6 +#define SIGBUS		 7 +#define SIGFPE		 8 +#define SIGKILL		 9 +#define SIGUSR1		10 +#define SIGSEGV		11 +#define SIGUSR2		12 +#define SIGPIPE		13 +#define SIGALRM		14 +#define SIGTERM		15 +#define SIGSTKFLT	16 +#define SIGCHLD		17 +#define SIGCONT		18 +#define SIGSTOP		19 +#define SIGTSTP		20 +#define SIGTTIN		21 +#define SIGTTOU		22 +#define SIGURG		23 +#define SIGXCPU		24 +#define SIGXFSZ		25 +#define SIGVTALRM	26 +#define SIGPROF		27 +#define SIGWINCH	28 +#define SIGIO		29 +#define SIGPOLL		SIGIO +/* +#define SIGLOST		29 +*/ +#define SIGPWR		30 +#define SIGSYS		31 +#define	SIGUNUSED	31 + +/* These should not be considered constants from userland.  */ +#define SIGRTMIN	32 +#define SIGRTMAX	_NSIG + +/* + * SA_FLAGS values: + * + * SA_ONSTACK indicates that a registered stack_t will be used. + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_RESETHAND clears the handler when the signal is delivered. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_NODEFER prevents the current signal from being masked in the handler. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + */ +#define SA_NOCLDSTOP	0x00000001 +#define SA_NOCLDWAIT	0x00000002 +#define SA_SIGINFO	0x00000004 +#define SA_ONSTACK	0x08000000 +#define SA_RESTART	0x10000000 +#define SA_NODEFER	0x40000000 +#define SA_RESETHAND	0x80000000 + +#define SA_NOMASK	SA_NODEFER +#define SA_ONESHOT	SA_RESETHAND + +/* + * sigaltstack controls + */ +#define SS_ONSTACK	1 +#define SS_DISABLE	2 + +#define MINSIGSTKSZ	2048 +#define SIGSTKSZ	8192 + +#include <asm-generic/signal.h> + +#ifdef __KERNEL__ +struct old_sigaction { +	__sighandler_t sa_handler; +	old_sigset_t sa_mask; +	unsigned long sa_flags; +	__sigrestore_t sa_restorer; +}; + +struct sigaction { +	__sighandler_t sa_handler; +	unsigned long sa_flags; +	__sigrestore_t sa_restorer; +	sigset_t sa_mask;		/* mask last for extensibility */ +}; + +struct k_sigaction { +	struct sigaction sa; +}; +#else +/* Here we must cater to libcs that poke about in kernel headers.  */ + +struct sigaction { +	union { +	  __sighandler_t _sa_handler; +	  void (*_sa_sigaction)(int, struct siginfo *, void *); +	} _u; +	sigset_t sa_mask; +	unsigned long sa_flags; +	void (*sa_restorer)(void); +}; + +#define sa_handler	_u._sa_handler +#define sa_sigaction	_u._sa_sigaction + +#endif /* __KERNEL__ */ + +typedef struct sigaltstack { +	void __user *ss_sp; +	int ss_flags; +	size_t ss_size; +} stack_t; + +#ifdef __KERNEL__ +#include <asm/sigcontext.h> + +#ifndef __uClinux__ +#define __HAVE_ARCH_SIG_BITOPS + +static inline void sigaddset(sigset_t *set, int _sig) +{ +	asm ("bfset %0{%1,#1}" +		: "+od" (*set) +		: "id" ((_sig - 1) ^ 31) +		: "cc"); +} + +static inline void sigdelset(sigset_t *set, int _sig) +{ +	asm ("bfclr %0{%1,#1}" +		: "+od" (*set) +		: "id" ((_sig - 1) ^ 31) +		: "cc"); +} + +static inline int __const_sigismember(sigset_t *set, int _sig) +{ +	unsigned long sig = _sig - 1; +	return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW)); +} + +static inline int __gen_sigismember(sigset_t *set, int _sig) +{ +	int ret; +	asm ("bfextu %1{%2,#1},%0" +		: "=d" (ret) +		: "od" (*set), "id" ((_sig-1) ^ 31) +		: "cc"); +	return ret; +} + +#define sigismember(set,sig)			\ +	(__builtin_constant_p(sig) ?		\ +	 __const_sigismember(set,sig) :		\ +	 __gen_sigismember(set,sig)) + +static inline int sigfindinword(unsigned long word) +{ +	asm ("bfffo %1{#0,#0},%0" +		: "=d" (word) +		: "d" (word & -word) +		: "cc"); +	return word ^ 31; +} + +struct pt_regs; +extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie); + +#else + +#undef __HAVE_ARCH_SIG_BITOPS +#define ptrace_signal_deliver(regs, cookie) do { } while (0) + +#endif /* __uClinux__ */ +#endif /* __KERNEL__ */ + +#endif /* _M68K_SIGNAL_H */ diff --git a/arch/m68k/include/asm/signal_mm.h b/arch/m68k/include/asm/signal_mm.h deleted file mode 100644 index 3db8a81942f..00000000000 --- a/arch/m68k/include/asm/signal_mm.h +++ /dev/null @@ -1,206 +0,0 @@ -#ifndef _M68K_SIGNAL_H -#define _M68K_SIGNAL_H - -#include <linux/types.h> - -/* Avoid too many header ordering problems.  */ -struct siginfo; - -#ifdef __KERNEL__ -/* Most things should be clean enough to redefine this at will, if care -   is taken to make libc match.  */ - -#define _NSIG		64 -#define _NSIG_BPW	32 -#define _NSIG_WORDS	(_NSIG / _NSIG_BPW) - -typedef unsigned long old_sigset_t;		/* at least 32 bits */ - -typedef struct { -	unsigned long sig[_NSIG_WORDS]; -} sigset_t; - -#else -/* Here we must cater to libcs that poke about in kernel headers.  */ - -#define NSIG		32 -typedef unsigned long sigset_t; - -#endif /* __KERNEL__ */ - -#define SIGHUP		 1 -#define SIGINT		 2 -#define SIGQUIT		 3 -#define SIGILL		 4 -#define SIGTRAP		 5 -#define SIGABRT		 6 -#define SIGIOT		 6 -#define SIGBUS		 7 -#define SIGFPE		 8 -#define SIGKILL		 9 -#define SIGUSR1		10 -#define SIGSEGV		11 -#define SIGUSR2		12 -#define SIGPIPE		13 -#define SIGALRM		14 -#define SIGTERM		15 -#define SIGSTKFLT	16 -#define SIGCHLD		17 -#define SIGCONT		18 -#define SIGSTOP		19 -#define SIGTSTP		20 -#define SIGTTIN		21 -#define SIGTTOU		22 -#define SIGURG		23 -#define SIGXCPU		24 -#define SIGXFSZ		25 -#define SIGVTALRM	26 -#define SIGPROF		27 -#define SIGWINCH	28 -#define SIGIO		29 -#define SIGPOLL		SIGIO -/* -#define SIGLOST		29 -*/ -#define SIGPWR		30 -#define SIGSYS		31 -#define	SIGUNUSED	31 - -/* These should not be considered constants from userland.  */ -#define SIGRTMIN	32 -#define SIGRTMAX	_NSIG - -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP	0x00000001 -#define SA_NOCLDWAIT	0x00000002 -#define SA_SIGINFO	0x00000004 -#define SA_ONSTACK	0x08000000 -#define SA_RESTART	0x10000000 -#define SA_NODEFER	0x40000000 -#define SA_RESETHAND	0x80000000 - -#define SA_NOMASK	SA_NODEFER -#define SA_ONESHOT	SA_RESETHAND - -/* - * sigaltstack controls - */ -#define SS_ONSTACK	1 -#define SS_DISABLE	2 - -#define MINSIGSTKSZ	2048 -#define SIGSTKSZ	8192 - -#include <asm-generic/signal.h> - -#ifdef __KERNEL__ -struct old_sigaction { -	__sighandler_t sa_handler; -	old_sigset_t sa_mask; -	unsigned long sa_flags; -	__sigrestore_t sa_restorer; -}; - -struct sigaction { -	__sighandler_t sa_handler; -	unsigned long sa_flags; -	__sigrestore_t sa_restorer; -	sigset_t sa_mask;		/* mask last for extensibility */ -}; - -struct k_sigaction { -	struct sigaction sa; -}; -#else -/* Here we must cater to libcs that poke about in kernel headers.  */ - -struct sigaction { -	union { -	  __sighandler_t _sa_handler; -	  void (*_sa_sigaction)(int, struct siginfo *, void *); -	} _u; -	sigset_t sa_mask; -	unsigned long sa_flags; -	void (*sa_restorer)(void); -}; - -#define sa_handler	_u._sa_handler -#define sa_sigaction	_u._sa_sigaction - -#endif /* __KERNEL__ */ - -typedef struct sigaltstack { -	void __user *ss_sp; -	int ss_flags; -	size_t ss_size; -} stack_t; - -#ifdef __KERNEL__ -#include <asm/sigcontext.h> - -#define __HAVE_ARCH_SIG_BITOPS - -static inline void sigaddset(sigset_t *set, int _sig) -{ -	asm ("bfset %0{%1,#1}" -		: "+od" (*set) -		: "id" ((_sig - 1) ^ 31) -		: "cc"); -} - -static inline void sigdelset(sigset_t *set, int _sig) -{ -	asm ("bfclr %0{%1,#1}" -		: "+od" (*set) -		: "id" ((_sig - 1) ^ 31) -		: "cc"); -} - -static inline int __const_sigismember(sigset_t *set, int _sig) -{ -	unsigned long sig = _sig - 1; -	return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW)); -} - -static inline int __gen_sigismember(sigset_t *set, int _sig) -{ -	int ret; -	asm ("bfextu %1{%2,#1},%0" -		: "=d" (ret) -		: "od" (*set), "id" ((_sig-1) ^ 31) -		: "cc"); -	return ret; -} - -#define sigismember(set,sig)			\ -	(__builtin_constant_p(sig) ?		\ -	 __const_sigismember(set,sig) :		\ -	 __gen_sigismember(set,sig)) - -static inline int sigfindinword(unsigned long word) -{ -	asm ("bfffo %1{#0,#0},%0" -		: "=d" (word) -		: "d" (word & -word) -		: "cc"); -	return word ^ 31; -} - -struct pt_regs; -extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie); - -#endif /* __KERNEL__ */ - -#endif /* _M68K_SIGNAL_H */ diff --git a/arch/m68k/include/asm/signal_no.h b/arch/m68k/include/asm/signal_no.h deleted file mode 100644 index 216c08be54a..00000000000 --- a/arch/m68k/include/asm/signal_no.h +++ /dev/null @@ -1,159 +0,0 @@ -#ifndef _M68KNOMMU_SIGNAL_H -#define _M68KNOMMU_SIGNAL_H - -#include <linux/types.h> - -/* Avoid too many header ordering problems.  */ -struct siginfo; - -#ifdef __KERNEL__ -/* Most things should be clean enough to redefine this at will, if care -   is taken to make libc match.  */ - -#define _NSIG		64 -#define _NSIG_BPW	32 -#define _NSIG_WORDS	(_NSIG / _NSIG_BPW) - -typedef unsigned long old_sigset_t;		/* at least 32 bits */ - -typedef struct { -	unsigned long sig[_NSIG_WORDS]; -} sigset_t; - -#else -/* Here we must cater to libcs that poke about in kernel headers.  */ - -#define NSIG		32 -typedef unsigned long sigset_t; - -#endif /* __KERNEL__ */ - -#define SIGHUP		 1 -#define SIGINT		 2 -#define SIGQUIT		 3 -#define SIGILL		 4 -#define SIGTRAP		 5 -#define SIGABRT		 6 -#define SIGIOT		 6 -#define SIGBUS		 7 -#define SIGFPE		 8 -#define SIGKILL		 9 -#define SIGUSR1		10 -#define SIGSEGV		11 -#define SIGUSR2		12 -#define SIGPIPE		13 -#define SIGALRM		14 -#define SIGTERM		15 -#define SIGSTKFLT	16 -#define SIGCHLD		17 -#define SIGCONT		18 -#define SIGSTOP		19 -#define SIGTSTP		20 -#define SIGTTIN		21 -#define SIGTTOU		22 -#define SIGURG		23 -#define SIGXCPU		24 -#define SIGXFSZ		25 -#define SIGVTALRM	26 -#define SIGPROF		27 -#define SIGWINCH	28 -#define SIGIO		29 -#define SIGPOLL		SIGIO -/* -#define SIGLOST		29 -*/ -#define SIGPWR		30 -#define SIGSYS		31 -#define	SIGUNUSED	31 - -/* These should not be considered constants from userland.  */ -#define SIGRTMIN	32 -#define SIGRTMAX	_NSIG - -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP	0x00000001 -#define SA_NOCLDWAIT	0x00000002 -#define SA_SIGINFO	0x00000004 -#define SA_ONSTACK	0x08000000 -#define SA_RESTART	0x10000000 -#define SA_NODEFER	0x40000000 -#define SA_RESETHAND	0x80000000 - -#define SA_NOMASK	SA_NODEFER -#define SA_ONESHOT	SA_RESETHAND - -/*  - * sigaltstack controls - */ -#define SS_ONSTACK	1 -#define SS_DISABLE	2 - -#define MINSIGSTKSZ	2048 -#define SIGSTKSZ	8192 - -#include <asm-generic/signal.h> - -#ifdef __KERNEL__ -struct old_sigaction { -	__sighandler_t sa_handler; -	old_sigset_t sa_mask; -	unsigned long sa_flags; -	void (*sa_restorer)(void); -}; - -struct sigaction { -	__sighandler_t sa_handler; -	unsigned long sa_flags; -	void (*sa_restorer)(void); -	sigset_t sa_mask;		/* mask last for extensibility */ -}; - -struct k_sigaction { -	struct sigaction sa; -}; -#else -/* Here we must cater to libcs that poke about in kernel headers.  */ - -struct sigaction { -	union { -	  __sighandler_t _sa_handler; -	  void (*_sa_sigaction)(int, struct siginfo *, void *); -	} _u; -	sigset_t sa_mask; -	unsigned long sa_flags; -	void (*sa_restorer)(void); -}; - -#define sa_handler	_u._sa_handler -#define sa_sigaction	_u._sa_sigaction - -#endif /* __KERNEL__ */ - -typedef struct sigaltstack { -	void *ss_sp; -	int ss_flags; -	size_t ss_size; -} stack_t; - -#ifdef __KERNEL__ - -#include <asm/sigcontext.h> -#undef __HAVE_ARCH_SIG_BITOPS - -#define ptrace_signal_deliver(regs, cookie) do { } while (0) - -#endif /* __KERNEL__ */ - -#endif /* _M68KNOMMU_SIGNAL_H */ diff --git a/arch/m68k/include/asm/swab.h b/arch/m68k/include/asm/swab.h index 7d7dde1c73e..9e3054ea59e 100644 --- a/arch/m68k/include/asm/swab.h +++ b/arch/m68k/include/asm/swab.h @@ -1,5 +1,27 @@ -#ifdef __uClinux__ -#include "swab_no.h" -#else -#include "swab_mm.h" +#ifndef _M68K_SWAB_H +#define _M68K_SWAB_H + +#include <asm/types.h> +#include <linux/compiler.h> + +#define __SWAB_64_THRU_32__ + +#if defined (__mcfisaaplus__) || defined (__mcfisac__) +static inline __attribute_const__ __u32 __arch_swab32(__u32 val) +{ +	__asm__("byterev %0" : "=d" (val) : "0" (val)); +	return val; +} + +#define __arch_swab32 __arch_swab32 +#elif !defined(__uClinux__) + +static inline __attribute_const__ __u32 __arch_swab32(__u32 val) +{ +	__asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val)); +	return val; +} +#define __arch_swab32 __arch_swab32  #endif + +#endif /* _M68K_SWAB_H */ diff --git a/arch/m68k/include/asm/swab_mm.h b/arch/m68k/include/asm/swab_mm.h deleted file mode 100644 index 7221e306682..00000000000 --- a/arch/m68k/include/asm/swab_mm.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _M68K_SWAB_H -#define _M68K_SWAB_H - -#include <asm/types.h> -#include <linux/compiler.h> - -#define __SWAB_64_THRU_32__ - -static inline __attribute_const__ __u32 __arch_swab32(__u32 val) -{ -	__asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val)); -	return val; -} -#define __arch_swab32 __arch_swab32 - -#endif /* _M68K_SWAB_H */ diff --git a/arch/m68k/include/asm/swab_no.h b/arch/m68k/include/asm/swab_no.h deleted file mode 100644 index e582257db30..00000000000 --- a/arch/m68k/include/asm/swab_no.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _M68KNOMMU_SWAB_H -#define _M68KNOMMU_SWAB_H - -#include <linux/types.h> - -#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) -#  define __SWAB_64_THRU_32__ -#endif - -#if defined (__mcfisaaplus__) || defined (__mcfisac__) -static inline __attribute_const__ __u32 __arch_swab32(__u32 val) -{ -	asm( -			"byterev %0" -			: "=d" (val) -			: "0" (val) -	   ); -	return val; -} - -#define __arch_swab32 __arch_swab32 -#endif - -#endif /* _M68KNOMMU_SWAB_H */ diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index df1d9d4cb1f..3c19027331f 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h @@ -1,5 +1,372 @@ -#ifdef __uClinux__ -#include "unistd_no.h" -#else -#include "unistd_mm.h" -#endif +#ifndef _ASM_M68K_UNISTD_H_ +#define _ASM_M68K_UNISTD_H_ + +/* + * This file contains the system call numbers. + */ + +#define __NR_restart_syscall	  0 +#define __NR_exit		  1 +#define __NR_fork		  2 +#define __NR_read		  3 +#define __NR_write		  4 +#define __NR_open		  5 +#define __NR_close		  6 +#define __NR_waitpid		  7 +#define __NR_creat		  8 +#define __NR_link		  9 +#define __NR_unlink		 10 +#define __NR_execve		 11 +#define __NR_chdir		 12 +#define __NR_time		 13 +#define __NR_mknod		 14 +#define __NR_chmod		 15 +#define __NR_chown		 16 +#define __NR_break		 17 +#define __NR_oldstat		 18 +#define __NR_lseek		 19 +#define __NR_getpid		 20 +#define __NR_mount		 21 +#define __NR_umount		 22 +#define __NR_setuid		 23 +#define __NR_getuid		 24 +#define __NR_stime		 25 +#define __NR_ptrace		 26 +#define __NR_alarm		 27 +#define __NR_oldfstat		 28 +#define __NR_pause		 29 +#define __NR_utime		 30 +#define __NR_stty		 31 +#define __NR_gtty		 32 +#define __NR_access		 33 +#define __NR_nice		 34 +#define __NR_ftime		 35 +#define __NR_sync		 36 +#define __NR_kill		 37 +#define __NR_rename		 38 +#define __NR_mkdir		 39 +#define __NR_rmdir		 40 +#define __NR_dup		 41 +#define __NR_pipe		 42 +#define __NR_times		 43 +#define __NR_prof		 44 +#define __NR_brk		 45 +#define __NR_setgid		 46 +#define __NR_getgid		 47 +#define __NR_signal		 48 +#define __NR_geteuid		 49 +#define __NR_getegid		 50 +#define __NR_acct		 51 +#define __NR_umount2		 52 +#define __NR_lock		 53 +#define __NR_ioctl		 54 +#define __NR_fcntl		 55 +#define __NR_mpx		 56 +#define __NR_setpgid		 57 +#define __NR_ulimit		 58 +#define __NR_oldolduname	 59 +#define __NR_umask		 60 +#define __NR_chroot		 61 +#define __NR_ustat		 62 +#define __NR_dup2		 63 +#define __NR_getppid		 64 +#define __NR_getpgrp		 65 +#define __NR_setsid		 66 +#define __NR_sigaction		 67 +#define __NR_sgetmask		 68 +#define __NR_ssetmask		 69 +#define __NR_setreuid		 70 +#define __NR_setregid		 71 +#define __NR_sigsuspend		 72 +#define __NR_sigpending		 73 +#define __NR_sethostname	 74 +#define __NR_setrlimit		 75 +#define __NR_getrlimit		 76 +#define __NR_getrusage		 77 +#define __NR_gettimeofday	 78 +#define __NR_settimeofday	 79 +#define __NR_getgroups		 80 +#define __NR_setgroups		 81 +#define __NR_select		 82 +#define __NR_symlink		 83 +#define __NR_oldlstat		 84 +#define __NR_readlink		 85 +#define __NR_uselib		 86 +#define __NR_swapon		 87 +#define __NR_reboot		 88 +#define __NR_readdir		 89 +#define __NR_mmap		 90 +#define __NR_munmap		 91 +#define __NR_truncate		 92 +#define __NR_ftruncate		 93 +#define __NR_fchmod		 94 +#define __NR_fchown		 95 +#define __NR_getpriority	 96 +#define __NR_setpriority	 97 +#define __NR_profil		 98 +#define __NR_statfs		 99 +#define __NR_fstatfs		100 +#define __NR_ioperm		101 +#define __NR_socketcall		102 +#define __NR_syslog		103 +#define __NR_setitimer		104 +#define __NR_getitimer		105 +#define __NR_stat		106 +#define __NR_lstat		107 +#define __NR_fstat		108 +#define __NR_olduname		109 +#define __NR_iopl		/* 110 */ not supported +#define __NR_vhangup		111 +#define __NR_idle		/* 112 */ Obsolete +#define __NR_vm86		/* 113 */ not supported +#define __NR_wait4		114 +#define __NR_swapoff		115 +#define __NR_sysinfo		116 +#define __NR_ipc		117 +#define __NR_fsync		118 +#define __NR_sigreturn		119 +#define __NR_clone		120 +#define __NR_setdomainname	121 +#define __NR_uname		122 +#define __NR_cacheflush		123 +#define __NR_adjtimex		124 +#define __NR_mprotect		125 +#define __NR_sigprocmask	126 +#define __NR_create_module	127 +#define __NR_init_module	128 +#define __NR_delete_module	129 +#define __NR_get_kernel_syms	130 +#define __NR_quotactl		131 +#define __NR_getpgid		132 +#define __NR_fchdir		133 +#define __NR_bdflush		134 +#define __NR_sysfs		135 +#define __NR_personality	136 +#define __NR_afs_syscall	137 /* Syscall for Andrew File System */ +#define __NR_setfsuid		138 +#define __NR_setfsgid		139 +#define __NR__llseek		140 +#define __NR_getdents		141 +#define __NR__newselect		142 +#define __NR_flock		143 +#define __NR_msync		144 +#define __NR_readv		145 +#define __NR_writev		146 +#define __NR_getsid		147 +#define __NR_fdatasync		148 +#define __NR__sysctl		149 +#define __NR_mlock		150 +#define __NR_munlock		151 +#define __NR_mlockall		152 +#define __NR_munlockall		153 +#define __NR_sched_setparam		154 +#define __NR_sched_getparam		155 +#define __NR_sched_setscheduler		156 +#define __NR_sched_getscheduler		157 +#define __NR_sched_yield		158 +#define __NR_sched_get_priority_max	159 +#define __NR_sched_get_priority_min	160 +#define __NR_sched_rr_get_interval	161 +#define __NR_nanosleep		162 +#define __NR_mremap		163 +#define __NR_setresuid		164 +#define __NR_getresuid		165 +#define __NR_getpagesize	166 +#define __NR_query_module	167 +#define __NR_poll		168 +#define __NR_nfsservctl		169 +#define __NR_setresgid		170 +#define __NR_getresgid		171 +#define __NR_prctl		172 +#define __NR_rt_sigreturn	173 +#define __NR_rt_sigaction	174 +#define __NR_rt_sigprocmask	175 +#define __NR_rt_sigpending	176 +#define __NR_rt_sigtimedwait	177 +#define __NR_rt_sigqueueinfo	178 +#define __NR_rt_sigsuspend	179 +#define __NR_pread64		180 +#define __NR_pwrite64		181 +#define __NR_lchown		182 +#define __NR_getcwd		183 +#define __NR_capget		184 +#define __NR_capset		185 +#define __NR_sigaltstack	186 +#define __NR_sendfile		187 +#define __NR_getpmsg		188	/* some people actually want streams */ +#define __NR_putpmsg		189	/* some people actually want streams */ +#define __NR_vfork		190 +#define __NR_ugetrlimit		191 +#define __NR_mmap2		192 +#define __NR_truncate64		193 +#define __NR_ftruncate64	194 +#define __NR_stat64		195 +#define __NR_lstat64		196 +#define __NR_fstat64		197 +#define __NR_chown32		198 +#define __NR_getuid32		199 +#define __NR_getgid32		200 +#define __NR_geteuid32		201 +#define __NR_getegid32		202 +#define __NR_setreuid32		203 +#define __NR_setregid32		204 +#define __NR_getgroups32	205 +#define __NR_setgroups32	206 +#define __NR_fchown32		207 +#define __NR_setresuid32	208 +#define __NR_getresuid32	209 +#define __NR_setresgid32	210 +#define __NR_getresgid32	211 +#define __NR_lchown32		212 +#define __NR_setuid32		213 +#define __NR_setgid32		214 +#define __NR_setfsuid32		215 +#define __NR_setfsgid32		216 +#define __NR_pivot_root		217 +#define __NR_getdents64		220 +#define __NR_gettid		221 +#define __NR_tkill		222 +#define __NR_setxattr		223 +#define __NR_lsetxattr		224 +#define __NR_fsetxattr		225 +#define __NR_getxattr		226 +#define __NR_lgetxattr		227 +#define __NR_fgetxattr		228 +#define __NR_listxattr		229 +#define __NR_llistxattr		230 +#define __NR_flistxattr		231 +#define __NR_removexattr	232 +#define __NR_lremovexattr	233 +#define __NR_fremovexattr	234 +#define __NR_futex		235 +#define __NR_sendfile64		236 +#define __NR_mincore		237 +#define __NR_madvise		238 +#define __NR_fcntl64		239 +#define __NR_readahead		240 +#define __NR_io_setup		241 +#define __NR_io_destroy		242 +#define __NR_io_getevents	243 +#define __NR_io_submit		244 +#define __NR_io_cancel		245 +#define __NR_fadvise64		246 +#define __NR_exit_group		247 +#define __NR_lookup_dcookie	248 +#define __NR_epoll_create	249 +#define __NR_epoll_ctl		250 +#define __NR_epoll_wait		251 +#define __NR_remap_file_pages	252 +#define __NR_set_tid_address	253 +#define __NR_timer_create	254 +#define __NR_timer_settime	255 +#define __NR_timer_gettime	256 +#define __NR_timer_getoverrun	257 +#define __NR_timer_delete	258 +#define __NR_clock_settime	259 +#define __NR_clock_gettime	260 +#define __NR_clock_getres	261 +#define __NR_clock_nanosleep	262 +#define __NR_statfs64		263 +#define __NR_fstatfs64		264 +#define __NR_tgkill		265 +#define __NR_utimes		266 +#define __NR_fadvise64_64	267 +#define __NR_mbind		268 +#define __NR_get_mempolicy	269 +#define __NR_set_mempolicy	270 +#define __NR_mq_open		271 +#define __NR_mq_unlink		272 +#define __NR_mq_timedsend	273 +#define __NR_mq_timedreceive	274 +#define __NR_mq_notify		275 +#define __NR_mq_getsetattr	276 +#define __NR_waitid		277 +#define __NR_vserver		278 +#define __NR_add_key		279 +#define __NR_request_key	280 +#define __NR_keyctl		281 +#define __NR_ioprio_set		282 +#define __NR_ioprio_get		283 +#define __NR_inotify_init	284 +#define __NR_inotify_add_watch	285 +#define __NR_inotify_rm_watch	286 +#define __NR_migrate_pages	287 +#define __NR_openat		288 +#define __NR_mkdirat		289 +#define __NR_mknodat		290 +#define __NR_fchownat		291 +#define __NR_futimesat		292 +#define __NR_fstatat64		293 +#define __NR_unlinkat		294 +#define __NR_renameat		295 +#define __NR_linkat		296 +#define __NR_symlinkat		297 +#define __NR_readlinkat		298 +#define __NR_fchmodat		299 +#define __NR_faccessat		300 +#define __NR_pselect6		301 +#define __NR_ppoll		302 +#define __NR_unshare		303 +#define __NR_set_robust_list	304 +#define __NR_get_robust_list	305 +#define __NR_splice		306 +#define __NR_sync_file_range	307 +#define __NR_tee		308 +#define __NR_vmsplice		309 +#define __NR_move_pages		310 +#define __NR_sched_setaffinity	311 +#define __NR_sched_getaffinity	312 +#define __NR_kexec_load		313 +#define __NR_getcpu		314 +#define __NR_epoll_pwait	315 +#define __NR_utimensat		316 +#define __NR_signalfd		317 +#define __NR_timerfd_create	318 +#define __NR_eventfd		319 +#define __NR_fallocate		320 +#define __NR_timerfd_settime	321 +#define __NR_timerfd_gettime	322 +#define __NR_signalfd4		323 +#define __NR_eventfd2		324 +#define __NR_epoll_create1	325 +#define __NR_dup3		326 +#define __NR_pipe2		327 +#define __NR_inotify_init1	328 + +#ifdef __KERNEL__ + +#define NR_syscalls		329 + +#define __ARCH_WANT_IPC_PARSE_VERSION +#define __ARCH_WANT_OLD_READDIR +#define __ARCH_WANT_OLD_STAT +#define __ARCH_WANT_STAT64 +#define __ARCH_WANT_SYS_ALARM +#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_PAUSE +#define __ARCH_WANT_SYS_SGETMASK +#define __ARCH_WANT_SYS_SIGNAL +#define __ARCH_WANT_SYS_TIME +#define __ARCH_WANT_SYS_UTIME +#define __ARCH_WANT_SYS_WAITPID +#define __ARCH_WANT_SYS_SOCKETCALL +#define __ARCH_WANT_SYS_FADVISE64 +#define __ARCH_WANT_SYS_GETPGRP +#define __ARCH_WANT_SYS_LLSEEK +#define __ARCH_WANT_SYS_NICE +#define __ARCH_WANT_SYS_OLD_GETRLIMIT +#define __ARCH_WANT_SYS_OLDUMOUNT +#define __ARCH_WANT_SYS_SIGPENDING +#define __ARCH_WANT_SYS_SIGPROCMASK +#define __ARCH_WANT_SYS_RT_SIGACTION + +/* + * "Conditional" syscalls + * + * What we want is __attribute__((weak,alias("sys_ni_syscall"))), + * but it doesn't work on all toolchains, so we just do it by hand + */ +#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") + +#endif /* __KERNEL__ */ +#endif /* _ASM_M68K_UNISTD_H_ */ diff --git a/arch/m68k/include/asm/unistd_mm.h b/arch/m68k/include/asm/unistd_mm.h deleted file mode 100644 index 3c19027331f..00000000000 --- a/arch/m68k/include/asm/unistd_mm.h +++ /dev/null @@ -1,372 +0,0 @@ -#ifndef _ASM_M68K_UNISTD_H_ -#define _ASM_M68K_UNISTD_H_ - -/* - * This file contains the system call numbers. - */ - -#define __NR_restart_syscall	  0 -#define __NR_exit		  1 -#define __NR_fork		  2 -#define __NR_read		  3 -#define __NR_write		  4 -#define __NR_open		  5 -#define __NR_close		  6 -#define __NR_waitpid		  7 -#define __NR_creat		  8 -#define __NR_link		  9 -#define __NR_unlink		 10 -#define __NR_execve		 11 -#define __NR_chdir		 12 -#define __NR_time		 13 -#define __NR_mknod		 14 -#define __NR_chmod		 15 -#define __NR_chown		 16 -#define __NR_break		 17 -#define __NR_oldstat		 18 -#define __NR_lseek		 19 -#define __NR_getpid		 20 -#define __NR_mount		 21 -#define __NR_umount		 22 -#define __NR_setuid		 23 -#define __NR_getuid		 24 -#define __NR_stime		 25 -#define __NR_ptrace		 26 -#define __NR_alarm		 27 -#define __NR_oldfstat		 28 -#define __NR_pause		 29 -#define __NR_utime		 30 -#define __NR_stty		 31 -#define __NR_gtty		 32 -#define __NR_access		 33 -#define __NR_nice		 34 -#define __NR_ftime		 35 -#define __NR_sync		 36 -#define __NR_kill		 37 -#define __NR_rename		 38 -#define __NR_mkdir		 39 -#define __NR_rmdir		 40 -#define __NR_dup		 41 -#define __NR_pipe		 42 -#define __NR_times		 43 -#define __NR_prof		 44 -#define __NR_brk		 45 -#define __NR_setgid		 46 -#define __NR_getgid		 47 -#define __NR_signal		 48 -#define __NR_geteuid		 49 -#define __NR_getegid		 50 -#define __NR_acct		 51 -#define __NR_umount2		 52 -#define __NR_lock		 53 -#define __NR_ioctl		 54 -#define __NR_fcntl		 55 -#define __NR_mpx		 56 -#define __NR_setpgid		 57 -#define __NR_ulimit		 58 -#define __NR_oldolduname	 59 -#define __NR_umask		 60 -#define __NR_chroot		 61 -#define __NR_ustat		 62 -#define __NR_dup2		 63 -#define __NR_getppid		 64 -#define __NR_getpgrp		 65 -#define __NR_setsid		 66 -#define __NR_sigaction		 67 -#define __NR_sgetmask		 68 -#define __NR_ssetmask		 69 -#define __NR_setreuid		 70 -#define __NR_setregid		 71 -#define __NR_sigsuspend		 72 -#define __NR_sigpending		 73 -#define __NR_sethostname	 74 -#define __NR_setrlimit		 75 -#define __NR_getrlimit		 76 -#define __NR_getrusage		 77 -#define __NR_gettimeofday	 78 -#define __NR_settimeofday	 79 -#define __NR_getgroups		 80 -#define __NR_setgroups		 81 -#define __NR_select		 82 -#define __NR_symlink		 83 -#define __NR_oldlstat		 84 -#define __NR_readlink		 85 -#define __NR_uselib		 86 -#define __NR_swapon		 87 -#define __NR_reboot		 88 -#define __NR_readdir		 89 -#define __NR_mmap		 90 -#define __NR_munmap		 91 -#define __NR_truncate		 92 -#define __NR_ftruncate		 93 -#define __NR_fchmod		 94 -#define __NR_fchown		 95 -#define __NR_getpriority	 96 -#define __NR_setpriority	 97 -#define __NR_profil		 98 -#define __NR_statfs		 99 -#define __NR_fstatfs		100 -#define __NR_ioperm		101 -#define __NR_socketcall		102 -#define __NR_syslog		103 -#define __NR_setitimer		104 -#define __NR_getitimer		105 -#define __NR_stat		106 -#define __NR_lstat		107 -#define __NR_fstat		108 -#define __NR_olduname		109 -#define __NR_iopl		/* 110 */ not supported -#define __NR_vhangup		111 -#define __NR_idle		/* 112 */ Obsolete -#define __NR_vm86		/* 113 */ not supported -#define __NR_wait4		114 -#define __NR_swapoff		115 -#define __NR_sysinfo		116 -#define __NR_ipc		117 -#define __NR_fsync		118 -#define __NR_sigreturn		119 -#define __NR_clone		120 -#define __NR_setdomainname	121 -#define __NR_uname		122 -#define __NR_cacheflush		123 -#define __NR_adjtimex		124 -#define __NR_mprotect		125 -#define __NR_sigprocmask	126 -#define __NR_create_module	127 -#define __NR_init_module	128 -#define __NR_delete_module	129 -#define __NR_get_kernel_syms	130 -#define __NR_quotactl		131 -#define __NR_getpgid		132 -#define __NR_fchdir		133 -#define __NR_bdflush		134 -#define __NR_sysfs		135 -#define __NR_personality	136 -#define __NR_afs_syscall	137 /* Syscall for Andrew File System */ -#define __NR_setfsuid		138 -#define __NR_setfsgid		139 -#define __NR__llseek		140 -#define __NR_getdents		141 -#define __NR__newselect		142 -#define __NR_flock		143 -#define __NR_msync		144 -#define __NR_readv		145 -#define __NR_writev		146 -#define __NR_getsid		147 -#define __NR_fdatasync		148 -#define __NR__sysctl		149 -#define __NR_mlock		150 -#define __NR_munlock		151 -#define __NR_mlockall		152 -#define __NR_munlockall		153 -#define __NR_sched_setparam		154 -#define __NR_sched_getparam		155 -#define __NR_sched_setscheduler		156 -#define __NR_sched_getscheduler		157 -#define __NR_sched_yield		158 -#define __NR_sched_get_priority_max	159 -#define __NR_sched_get_priority_min	160 -#define __NR_sched_rr_get_interval	161 -#define __NR_nanosleep		162 -#define __NR_mremap		163 -#define __NR_setresuid		164 -#define __NR_getresuid		165 -#define __NR_getpagesize	166 -#define __NR_query_module	167 -#define __NR_poll		168 -#define __NR_nfsservctl		169 -#define __NR_setresgid		170 -#define __NR_getresgid		171 -#define __NR_prctl		172 -#define __NR_rt_sigreturn	173 -#define __NR_rt_sigaction	174 -#define __NR_rt_sigprocmask	175 -#define __NR_rt_sigpending	176 -#define __NR_rt_sigtimedwait	177 -#define __NR_rt_sigqueueinfo	178 -#define __NR_rt_sigsuspend	179 -#define __NR_pread64		180 -#define __NR_pwrite64		181 -#define __NR_lchown		182 -#define __NR_getcwd		183 -#define __NR_capget		184 -#define __NR_capset		185 -#define __NR_sigaltstack	186 -#define __NR_sendfile		187 -#define __NR_getpmsg		188	/* some people actually want streams */ -#define __NR_putpmsg		189	/* some people actually want streams */ -#define __NR_vfork		190 -#define __NR_ugetrlimit		191 -#define __NR_mmap2		192 -#define __NR_truncate64		193 -#define __NR_ftruncate64	194 -#define __NR_stat64		195 -#define __NR_lstat64		196 -#define __NR_fstat64		197 -#define __NR_chown32		198 -#define __NR_getuid32		199 -#define __NR_getgid32		200 -#define __NR_geteuid32		201 -#define __NR_getegid32		202 -#define __NR_setreuid32		203 -#define __NR_setregid32		204 -#define __NR_getgroups32	205 -#define __NR_setgroups32	206 -#define __NR_fchown32		207 -#define __NR_setresuid32	208 -#define __NR_getresuid32	209 -#define __NR_setresgid32	210 -#define __NR_getresgid32	211 -#define __NR_lchown32		212 -#define __NR_setuid32		213 -#define __NR_setgid32		214 -#define __NR_setfsuid32		215 -#define __NR_setfsgid32		216 -#define __NR_pivot_root		217 -#define __NR_getdents64		220 -#define __NR_gettid		221 -#define __NR_tkill		222 -#define __NR_setxattr		223 -#define __NR_lsetxattr		224 -#define __NR_fsetxattr		225 -#define __NR_getxattr		226 -#define __NR_lgetxattr		227 -#define __NR_fgetxattr		228 -#define __NR_listxattr		229 -#define __NR_llistxattr		230 -#define __NR_flistxattr		231 -#define __NR_removexattr	232 -#define __NR_lremovexattr	233 -#define __NR_fremovexattr	234 -#define __NR_futex		235 -#define __NR_sendfile64		236 -#define __NR_mincore		237 -#define __NR_madvise		238 -#define __NR_fcntl64		239 -#define __NR_readahead		240 -#define __NR_io_setup		241 -#define __NR_io_destroy		242 -#define __NR_io_getevents	243 -#define __NR_io_submit		244 -#define __NR_io_cancel		245 -#define __NR_fadvise64		246 -#define __NR_exit_group		247 -#define __NR_lookup_dcookie	248 -#define __NR_epoll_create	249 -#define __NR_epoll_ctl		250 -#define __NR_epoll_wait		251 -#define __NR_remap_file_pages	252 -#define __NR_set_tid_address	253 -#define __NR_timer_create	254 -#define __NR_timer_settime	255 -#define __NR_timer_gettime	256 -#define __NR_timer_getoverrun	257 -#define __NR_timer_delete	258 -#define __NR_clock_settime	259 -#define __NR_clock_gettime	260 -#define __NR_clock_getres	261 -#define __NR_clock_nanosleep	262 -#define __NR_statfs64		263 -#define __NR_fstatfs64		264 -#define __NR_tgkill		265 -#define __NR_utimes		266 -#define __NR_fadvise64_64	267 -#define __NR_mbind		268 -#define __NR_get_mempolicy	269 -#define __NR_set_mempolicy	270 -#define __NR_mq_open		271 -#define __NR_mq_unlink		272 -#define __NR_mq_timedsend	273 -#define __NR_mq_timedreceive	274 -#define __NR_mq_notify		275 -#define __NR_mq_getsetattr	276 -#define __NR_waitid		277 -#define __NR_vserver		278 -#define __NR_add_key		279 -#define __NR_request_key	280 -#define __NR_keyctl		281 -#define __NR_ioprio_set		282 -#define __NR_ioprio_get		283 -#define __NR_inotify_init	284 -#define __NR_inotify_add_watch	285 -#define __NR_inotify_rm_watch	286 -#define __NR_migrate_pages	287 -#define __NR_openat		288 -#define __NR_mkdirat		289 -#define __NR_mknodat		290 -#define __NR_fchownat		291 -#define __NR_futimesat		292 -#define __NR_fstatat64		293 -#define __NR_unlinkat		294 -#define __NR_renameat		295 -#define __NR_linkat		296 -#define __NR_symlinkat		297 -#define __NR_readlinkat		298 -#define __NR_fchmodat		299 -#define __NR_faccessat		300 -#define __NR_pselect6		301 -#define __NR_ppoll		302 -#define __NR_unshare		303 -#define __NR_set_robust_list	304 -#define __NR_get_robust_list	305 -#define __NR_splice		306 -#define __NR_sync_file_range	307 -#define __NR_tee		308 -#define __NR_vmsplice		309 -#define __NR_move_pages		310 -#define __NR_sched_setaffinity	311 -#define __NR_sched_getaffinity	312 -#define __NR_kexec_load		313 -#define __NR_getcpu		314 -#define __NR_epoll_pwait	315 -#define __NR_utimensat		316 -#define __NR_signalfd		317 -#define __NR_timerfd_create	318 -#define __NR_eventfd		319 -#define __NR_fallocate		320 -#define __NR_timerfd_settime	321 -#define __NR_timerfd_gettime	322 -#define __NR_signalfd4		323 -#define __NR_eventfd2		324 -#define __NR_epoll_create1	325 -#define __NR_dup3		326 -#define __NR_pipe2		327 -#define __NR_inotify_init1	328 - -#ifdef __KERNEL__ - -#define NR_syscalls		329 - -#define __ARCH_WANT_IPC_PARSE_VERSION -#define __ARCH_WANT_OLD_READDIR -#define __ARCH_WANT_OLD_STAT -#define __ARCH_WANT_STAT64 -#define __ARCH_WANT_SYS_ALARM -#define __ARCH_WANT_SYS_GETHOSTNAME -#define __ARCH_WANT_SYS_PAUSE -#define __ARCH_WANT_SYS_SGETMASK -#define __ARCH_WANT_SYS_SIGNAL -#define __ARCH_WANT_SYS_TIME -#define __ARCH_WANT_SYS_UTIME -#define __ARCH_WANT_SYS_WAITPID -#define __ARCH_WANT_SYS_SOCKETCALL -#define __ARCH_WANT_SYS_FADVISE64 -#define __ARCH_WANT_SYS_GETPGRP -#define __ARCH_WANT_SYS_LLSEEK -#define __ARCH_WANT_SYS_NICE -#define __ARCH_WANT_SYS_OLD_GETRLIMIT -#define __ARCH_WANT_SYS_OLDUMOUNT -#define __ARCH_WANT_SYS_SIGPENDING -#define __ARCH_WANT_SYS_SIGPROCMASK -#define __ARCH_WANT_SYS_RT_SIGACTION - -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") - -#endif /* __KERNEL__ */ -#endif /* _ASM_M68K_UNISTD_H_ */ diff --git a/arch/m68k/include/asm/unistd_no.h b/arch/m68k/include/asm/unistd_no.h deleted file mode 100644 index b034a2f7b44..00000000000 --- a/arch/m68k/include/asm/unistd_no.h +++ /dev/null @@ -1,372 +0,0 @@ -#ifndef _ASM_M68K_UNISTD_H_ -#define _ASM_M68K_UNISTD_H_ - -/* - * This file contains the system call numbers. - */ - -#define __NR_restart_syscall      0 -#define __NR_exit		  1 -#define __NR_fork		  2 -#define __NR_read		  3 -#define __NR_write		  4 -#define __NR_open		  5 -#define __NR_close		  6 -#define __NR_waitpid		  7 -#define __NR_creat		  8 -#define __NR_link		  9 -#define __NR_unlink		 10 -#define __NR_execve		 11 -#define __NR_chdir		 12 -#define __NR_time		 13 -#define __NR_mknod		 14 -#define __NR_chmod		 15 -#define __NR_chown		 16 -#define __NR_break		 17 -#define __NR_oldstat		 18 -#define __NR_lseek		 19 -#define __NR_getpid		 20 -#define __NR_mount		 21 -#define __NR_umount		 22 -#define __NR_setuid		 23 -#define __NR_getuid		 24 -#define __NR_stime		 25 -#define __NR_ptrace		 26 -#define __NR_alarm		 27 -#define __NR_oldfstat		 28 -#define __NR_pause		 29 -#define __NR_utime		 30 -#define __NR_stty		 31 -#define __NR_gtty		 32 -#define __NR_access		 33 -#define __NR_nice		 34 -#define __NR_ftime		 35 -#define __NR_sync		 36 -#define __NR_kill		 37 -#define __NR_rename		 38 -#define __NR_mkdir		 39 -#define __NR_rmdir		 40 -#define __NR_dup		 41 -#define __NR_pipe		 42 -#define __NR_times		 43 -#define __NR_prof		 44 -#define __NR_brk		 45 -#define __NR_setgid		 46 -#define __NR_getgid		 47 -#define __NR_signal		 48 -#define __NR_geteuid		 49 -#define __NR_getegid		 50 -#define __NR_acct		 51 -#define __NR_umount2		 52 -#define __NR_lock		 53 -#define __NR_ioctl		 54 -#define __NR_fcntl		 55 -#define __NR_mpx		 56 -#define __NR_setpgid		 57 -#define __NR_ulimit		 58 -#define __NR_oldolduname	 59 -#define __NR_umask		 60 -#define __NR_chroot		 61 -#define __NR_ustat		 62 -#define __NR_dup2		 63 -#define __NR_getppid		 64 -#define __NR_getpgrp		 65 -#define __NR_setsid		 66 -#define __NR_sigaction		 67 -#define __NR_sgetmask		 68 -#define __NR_ssetmask		 69 -#define __NR_setreuid		 70 -#define __NR_setregid		 71 -#define __NR_sigsuspend		 72 -#define __NR_sigpending		 73 -#define __NR_sethostname	 74 -#define __NR_setrlimit		 75 -#define __NR_getrlimit		 76 -#define __NR_getrusage		 77 -#define __NR_gettimeofday	 78 -#define __NR_settimeofday	 79 -#define __NR_getgroups		 80 -#define __NR_setgroups		 81 -#define __NR_select		 82 -#define __NR_symlink		 83 -#define __NR_oldlstat		 84 -#define __NR_readlink		 85 -#define __NR_uselib		 86 -#define __NR_swapon		 87 -#define __NR_reboot		 88 -#define __NR_readdir		 89 -#define __NR_mmap		 90 -#define __NR_munmap		 91 -#define __NR_truncate		 92 -#define __NR_ftruncate		 93 -#define __NR_fchmod		 94 -#define __NR_fchown		 95 -#define __NR_getpriority	 96 -#define __NR_setpriority	 97 -#define __NR_profil		 98 -#define __NR_statfs		 99 -#define __NR_fstatfs		100 -#define __NR_ioperm		101 -#define __NR_socketcall		102 -#define __NR_syslog		103 -#define __NR_setitimer		104 -#define __NR_getitimer		105 -#define __NR_stat		106 -#define __NR_lstat		107 -#define __NR_fstat		108 -#define __NR_olduname		109 -#define __NR_iopl		/* 110 */ not supported -#define __NR_vhangup		111 -#define __NR_idle		/* 112 */ Obsolete -#define __NR_vm86		/* 113 */ not supported -#define __NR_wait4		114 -#define __NR_swapoff		115 -#define __NR_sysinfo		116 -#define __NR_ipc		117 -#define __NR_fsync		118 -#define __NR_sigreturn		119 -#define __NR_clone		120 -#define __NR_setdomainname	121 -#define __NR_uname		122 -#define __NR_cacheflush		123 -#define __NR_adjtimex		124 -#define __NR_mprotect		125 -#define __NR_sigprocmask	126 -#define __NR_create_module	127 -#define __NR_init_module	128 -#define __NR_delete_module	129 -#define __NR_get_kernel_syms	130 -#define __NR_quotactl		131 -#define __NR_getpgid		132 -#define __NR_fchdir		133 -#define __NR_bdflush		134 -#define __NR_sysfs		135 -#define __NR_personality	136 -#define __NR_afs_syscall	137 /* Syscall for Andrew File System */ -#define __NR_setfsuid		138 -#define __NR_setfsgid		139 -#define __NR__llseek		140 -#define __NR_getdents		141 -#define __NR__newselect		142 -#define __NR_flock		143 -#define __NR_msync		144 -#define __NR_readv		145 -#define __NR_writev		146 -#define __NR_getsid		147 -#define __NR_fdatasync		148 -#define __NR__sysctl		149 -#define __NR_mlock		150 -#define __NR_munlock		151 -#define __NR_mlockall		152 -#define __NR_munlockall		153 -#define __NR_sched_setparam		154 -#define __NR_sched_getparam		155 -#define __NR_sched_setscheduler		156 -#define __NR_sched_getscheduler		157 -#define __NR_sched_yield		158 -#define __NR_sched_get_priority_max	159 -#define __NR_sched_get_priority_min	160 -#define __NR_sched_rr_get_interval	161 -#define __NR_nanosleep		162 -#define __NR_mremap		163 -#define __NR_setresuid		164 -#define __NR_getresuid		165 -#define __NR_getpagesize	166 -#define __NR_query_module	167 -#define __NR_poll		168 -#define __NR_nfsservctl		169 -#define __NR_setresgid		170 -#define __NR_getresgid		171 -#define __NR_prctl		172 -#define __NR_rt_sigreturn	173 -#define __NR_rt_sigaction	174 -#define __NR_rt_sigprocmask	175 -#define __NR_rt_sigpending	176 -#define __NR_rt_sigtimedwait	177 -#define __NR_rt_sigqueueinfo	178 -#define __NR_rt_sigsuspend	179 -#define __NR_pread64		180 -#define __NR_pwrite64		181 -#define __NR_lchown		182 -#define __NR_getcwd		183 -#define __NR_capget		184 -#define __NR_capset		185 -#define __NR_sigaltstack	186 -#define __NR_sendfile		187 -#define __NR_getpmsg		188	/* some people actually want streams */ -#define __NR_putpmsg		189	/* some people actually want streams */ -#define __NR_vfork		190 -#define __NR_ugetrlimit		191 -#define __NR_mmap2		192 -#define __NR_truncate64		193 -#define __NR_ftruncate64	194 -#define __NR_stat64		195 -#define __NR_lstat64		196 -#define __NR_fstat64		197 -#define __NR_chown32		198 -#define __NR_getuid32		199 -#define __NR_getgid32		200 -#define __NR_geteuid32		201 -#define __NR_getegid32		202 -#define __NR_setreuid32		203 -#define __NR_setregid32		204 -#define __NR_getgroups32	205 -#define __NR_setgroups32	206 -#define __NR_fchown32		207 -#define __NR_setresuid32	208 -#define __NR_getresuid32	209 -#define __NR_setresgid32	210 -#define __NR_getresgid32	211 -#define __NR_lchown32		212 -#define __NR_setuid32		213 -#define __NR_setgid32		214 -#define __NR_setfsuid32		215 -#define __NR_setfsgid32		216 -#define __NR_pivot_root		217 -#define __NR_getdents64		220 -#define __NR_gettid		221 -#define __NR_tkill		222 -#define __NR_setxattr		223 -#define __NR_lsetxattr		224 -#define __NR_fsetxattr		225 -#define __NR_getxattr		226 -#define __NR_lgetxattr		227 -#define __NR_fgetxattr		228 -#define __NR_listxattr		229 -#define __NR_llistxattr		230 -#define __NR_flistxattr		231 -#define __NR_removexattr	232 -#define __NR_lremovexattr	233 -#define __NR_fremovexattr	234 -#define __NR_futex		235 -#define __NR_sendfile64		236 -#define __NR_mincore		237 -#define __NR_madvise		238 -#define __NR_fcntl64		239 -#define __NR_readahead		240 -#define __NR_io_setup		241 -#define __NR_io_destroy		242 -#define __NR_io_getevents	243 -#define __NR_io_submit		244 -#define __NR_io_cancel		245 -#define __NR_fadvise64		246 -#define __NR_exit_group		247 -#define __NR_lookup_dcookie	248 -#define __NR_epoll_create	249 -#define __NR_epoll_ctl		250 -#define __NR_epoll_wait		251 -#define __NR_remap_file_pages	252 -#define __NR_set_tid_address	253 -#define __NR_timer_create	254 -#define __NR_timer_settime	255 -#define __NR_timer_gettime	256 -#define __NR_timer_getoverrun	257 -#define __NR_timer_delete	258 -#define __NR_clock_settime	259 -#define __NR_clock_gettime	260 -#define __NR_clock_getres	261 -#define __NR_clock_nanosleep	262 -#define __NR_statfs64		263 -#define __NR_fstatfs64		264 -#define __NR_tgkill		265 -#define __NR_utimes		266 -#define __NR_fadvise64_64	267 -#define __NR_mbind		268 -#define __NR_get_mempolicy	269 -#define __NR_set_mempolicy	270 -#define __NR_mq_open		271 -#define __NR_mq_unlink		272 -#define __NR_mq_timedsend	273 -#define __NR_mq_timedreceive	274 -#define __NR_mq_notify		275 -#define __NR_mq_getsetattr	276 -#define __NR_waitid		277 -#define __NR_vserver		278 -#define __NR_add_key		279 -#define __NR_request_key	280 -#define __NR_keyctl		281 -#define __NR_ioprio_set		282 -#define __NR_ioprio_get		283 -#define __NR_inotify_init	284 -#define __NR_inotify_add_watch	285 -#define __NR_inotify_rm_watch	286 -#define __NR_migrate_pages	287 -#define __NR_openat		288 -#define __NR_mkdirat		289 -#define __NR_mknodat		290 -#define __NR_fchownat		291 -#define __NR_futimesat		292 -#define __NR_fstatat64		293 -#define __NR_unlinkat		294 -#define __NR_renameat		295 -#define __NR_linkat		296 -#define __NR_symlinkat		297 -#define __NR_readlinkat		298 -#define __NR_fchmodat		299 -#define __NR_faccessat		300 -#define __NR_pselect6		301 -#define __NR_ppoll		302 -#define __NR_unshare		303 -#define __NR_set_robust_list	304 -#define __NR_get_robust_list	305 -#define __NR_splice		306 -#define __NR_sync_file_range	307 -#define __NR_tee		308 -#define __NR_vmsplice		309 -#define __NR_move_pages		310 -#define __NR_sched_setaffinity	311 -#define __NR_sched_getaffinity	312 -#define __NR_kexec_load		313 -#define __NR_getcpu		314 -#define __NR_epoll_pwait	315 -#define __NR_utimensat		316 -#define __NR_signalfd		317 -#define __NR_timerfd_create	318 -#define __NR_eventfd		319 -#define __NR_fallocate		320 -#define __NR_timerfd_settime	321 -#define __NR_timerfd_gettime	322 -#define __NR_signalfd4		323 -#define __NR_eventfd2		324 -#define __NR_epoll_create1	325 -#define __NR_dup3		326 -#define __NR_pipe2		327 -#define __NR_inotify_init1	328 - -#ifdef __KERNEL__ - -#define NR_syscalls		329 - -#define __ARCH_WANT_IPC_PARSE_VERSION -#define __ARCH_WANT_OLD_READDIR -#define __ARCH_WANT_OLD_STAT -#define __ARCH_WANT_STAT64 -#define __ARCH_WANT_SYS_ALARM -#define __ARCH_WANT_SYS_GETHOSTNAME -#define __ARCH_WANT_SYS_PAUSE -#define __ARCH_WANT_SYS_SGETMASK -#define __ARCH_WANT_SYS_SIGNAL -#define __ARCH_WANT_SYS_TIME -#define __ARCH_WANT_SYS_UTIME -#define __ARCH_WANT_SYS_WAITPID -#define __ARCH_WANT_SYS_SOCKETCALL -#define __ARCH_WANT_SYS_FADVISE64 -#define __ARCH_WANT_SYS_GETPGRP -#define __ARCH_WANT_SYS_LLSEEK -#define __ARCH_WANT_SYS_NICE -#define __ARCH_WANT_SYS_OLD_GETRLIMIT -#define __ARCH_WANT_SYS_OLDUMOUNT -#define __ARCH_WANT_SYS_SIGPENDING -#define __ARCH_WANT_SYS_SIGPROCMASK -#define __ARCH_WANT_SYS_RT_SIGACTION - -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") - -#endif /* __KERNEL__ */ -#endif /* _ASM_M68K_UNISTD_H_ */ diff --git a/arch/m68knommu/platform/5206e/config.c b/arch/m68knommu/platform/5206e/config.c index d01a5d2b755..db902540bf2 100644 --- a/arch/m68knommu/platform/5206e/config.c +++ b/arch/m68knommu/platform/5206e/config.c @@ -17,6 +17,7 @@  #include <asm/coldfire.h>  #include <asm/mcfsim.h>  #include <asm/mcfdma.h> +#include <asm/mcfuart.h>  /***************************************************************************/ diff --git a/arch/m68knommu/platform/528x/config.c b/arch/m68knommu/platform/528x/config.c index dfdb5c2ed8e..44baeb225dc 100644 --- a/arch/m68knommu/platform/528x/config.c +++ b/arch/m68knommu/platform/528x/config.c @@ -24,7 +24,6 @@  #include <asm/coldfire.h>  #include <asm/mcfsim.h>  #include <asm/mcfuart.h> -#include <asm/mcfqspi.h>  #ifdef CONFIG_MTD_PARTITIONS  #include <linux/mtd/partitions.h> @@ -33,233 +32,6 @@  /***************************************************************************/  void coldfire_reset(void); -static void coldfire_qspi_cs_control(u8 cs, u8 command); - -/***************************************************************************/ - -#if defined(CONFIG_SPI) - -#if defined(CONFIG_WILDFIRE) -#define SPI_NUM_CHIPSELECTS 	0x02 -#define SPI_PAR_VAL		0x07  /* Enable DIN, DOUT, CLK */ -#define SPI_CS_MASK		0x18 - -#define FLASH_BLOCKSIZE		(1024*64) -#define FLASH_NUMBLOCKS		16 -#define FLASH_TYPE		"m25p80" - -#define M25P80_CS		0 -#define MMC_CS			1 - -#ifdef CONFIG_MTD_PARTITIONS -static struct mtd_partition stm25p_partitions[] = { -	/* sflash */ -	[0] = { -		.name = "stm25p80", -		.offset = 0x00000000, -		.size = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS, -		.mask_flags = 0 -	} -}; - -#endif - -#elif defined(CONFIG_WILDFIREMOD) - -#define SPI_NUM_CHIPSELECTS	0x08 -#define SPI_PAR_VAL		0x07  /* Enable DIN, DOUT, CLK */ -#define SPI_CS_MASK		0x78 - -#define FLASH_BLOCKSIZE		(1024*64) -#define FLASH_NUMBLOCKS		64 -#define FLASH_TYPE		"m25p32" -/* Reserve 1M for the kernel parition */ -#define FLASH_KERNEL_SIZE   (1024 * 1024) - -#define M25P80_CS		5 -#define MMC_CS			6 - -#ifdef CONFIG_MTD_PARTITIONS -static struct mtd_partition stm25p_partitions[] = { -	/* sflash */ -	[0] = { -		.name = "kernel", -		.offset = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS - FLASH_KERNEL_SIZE, -		.size = FLASH_KERNEL_SIZE, -		.mask_flags = 0 -	}, -	[1] = { -		.name = "image", -		.offset = 0x00000000, -		.size = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS - FLASH_KERNEL_SIZE, -		.mask_flags = 0 -	}, -	[2] = { -		.name = "all", -		.offset = 0x00000000, -		.size = FLASH_BLOCKSIZE * FLASH_NUMBLOCKS, -		.mask_flags = 0 -	} -}; -#endif - -#else -#define SPI_NUM_CHIPSELECTS 	0x04 -#define SPI_PAR_VAL		0x7F  /* Enable DIN, DOUT, CLK, CS0 - CS4 */ -#endif - -#ifdef MMC_CS -static struct coldfire_spi_chip flash_chip_info = { -	.mode = SPI_MODE_0, -	.bits_per_word = 16, -	.del_cs_to_clk = 17, -	.del_after_trans = 1, -	.void_write_data = 0 -}; - -static struct coldfire_spi_chip mmc_chip_info = { -	.mode = SPI_MODE_0, -	.bits_per_word = 16, -	.del_cs_to_clk = 17, -	.del_after_trans = 1, -	.void_write_data = 0xFFFF -}; -#endif - -#ifdef M25P80_CS -static struct flash_platform_data stm25p80_platform_data = { -	.name = "ST M25P80 SPI Flash chip", -#ifdef CONFIG_MTD_PARTITIONS -	.parts = stm25p_partitions, -	.nr_parts = sizeof(stm25p_partitions) / sizeof(*stm25p_partitions), -#endif -	.type = FLASH_TYPE -}; -#endif - -static struct spi_board_info spi_board_info[] __initdata = { -#ifdef M25P80_CS -	{ -		.modalias = "m25p80", -		.max_speed_hz = 16000000, -		.bus_num = 1, -		.chip_select = M25P80_CS, -		.platform_data = &stm25p80_platform_data, -		.controller_data = &flash_chip_info -	}, -#endif -#ifdef MMC_CS -	{ -		.modalias = "mmc_spi", -		.max_speed_hz = 16000000, -		.bus_num = 1, -		.chip_select = MMC_CS, -		.controller_data = &mmc_chip_info -	} -#endif -}; - -static struct coldfire_spi_master coldfire_master_info = { -	.bus_num = 1, -	.num_chipselect = SPI_NUM_CHIPSELECTS, -	.irq_source = MCF5282_QSPI_IRQ_SOURCE, -	.irq_vector = MCF5282_QSPI_IRQ_VECTOR, -	.irq_mask = ((0x01 << MCF5282_QSPI_IRQ_SOURCE) | 0x01), -	.irq_lp = 0x2B,  /* Level 5 and Priority 3 */ -	.par_val = SPI_PAR_VAL, -	.cs_control = coldfire_qspi_cs_control, -}; - -static struct resource coldfire_spi_resources[] = { -	[0] = { -		.name = "qspi-par", -		.start = MCF5282_QSPI_PAR, -		.end = MCF5282_QSPI_PAR, -		.flags = IORESOURCE_MEM -	}, - -	[1] = { -		.name = "qspi-module", -		.start = MCF5282_QSPI_QMR, -		.end = MCF5282_QSPI_QMR + 0x18, -		.flags = IORESOURCE_MEM -	}, - -	[2] = { -		.name = "qspi-int-level", -		.start = MCF5282_INTC0 + MCFINTC_ICR0 + MCF5282_QSPI_IRQ_SOURCE, -		.end = MCF5282_INTC0 + MCFINTC_ICR0 + MCF5282_QSPI_IRQ_SOURCE, -		.flags = IORESOURCE_MEM -	}, - -	[3] = { -		.name = "qspi-int-mask", -		.start = MCF5282_INTC0 + MCFINTC_IMRL, -		.end = MCF5282_INTC0 + MCFINTC_IMRL, -		.flags = IORESOURCE_MEM -	} -}; - -static struct platform_device coldfire_spi = { -	.name = "spi_coldfire", -	.id = -1, -	.resource = coldfire_spi_resources, -	.num_resources = ARRAY_SIZE(coldfire_spi_resources), -	.dev = { -		.platform_data = &coldfire_master_info, -	} -}; - -static void coldfire_qspi_cs_control(u8 cs, u8 command) -{ -	u8 cs_bit = ((0x01 << cs) << 3) & SPI_CS_MASK; - -#if defined(CONFIG_WILDFIRE) -	u8 cs_mask = ~(((0x01 << cs) << 3) & SPI_CS_MASK); -#endif -#if defined(CONFIG_WILDFIREMOD) -	u8 cs_mask = (cs << 3) & SPI_CS_MASK; -#endif - -	/* -	 * Don't do anything if the chip select is not -	 * one of the port qs pins. -	 */ -	if (command & QSPI_CS_INIT) { -#if defined(CONFIG_WILDFIRE) -		MCF5282_GPIO_DDRQS  |= cs_bit; -		MCF5282_GPIO_PQSPAR &= ~cs_bit; -#endif - -#if defined(CONFIG_WILDFIREMOD) -		MCF5282_GPIO_DDRQS  |= SPI_CS_MASK; -		MCF5282_GPIO_PQSPAR &= ~SPI_CS_MASK; -#endif -	} - -	if (command & QSPI_CS_ASSERT) { -		MCF5282_GPIO_PORTQS &= ~SPI_CS_MASK; -		MCF5282_GPIO_PORTQS |= cs_mask; -	} else if (command & QSPI_CS_DROP) { -		MCF5282_GPIO_PORTQS |= SPI_CS_MASK; -	} -} - -static int __init spi_dev_init(void) -{ -	int retval; - -	retval = platform_device_register(&coldfire_spi); -	if (retval < 0) -		return retval; - -	if (ARRAY_SIZE(spi_board_info)) -		retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); - -	return retval; -} - -#endif /* CONFIG_SPI */  /***************************************************************************/ diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index e61465a18c7..206cb7953b0 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig @@ -238,8 +238,12 @@ config MIPS_SIM  	  This option enables support for MIPS Technologies MIPSsim software  	  emulator. -config MACH_EMMA -	bool "NEC EMMA series based machines" +config NEC_MARKEINS +	bool "NEC EMMA2RH Mark-eins board" +	select SOC_EMMA2RH +	select HW_HAS_PCI +	help +	  This enables support for the NEC Electronics Mark-eins boards.  config MACH_VR41XX  	bool "NEC VR4100 series based machines" @@ -637,7 +641,6 @@ endchoice  source "arch/mips/alchemy/Kconfig"  source "arch/mips/basler/excite/Kconfig" -source "arch/mips/emma/Kconfig"  source "arch/mips/jazz/Kconfig"  source "arch/mips/lasat/Kconfig"  source "arch/mips/pmc-sierra/Kconfig" @@ -895,6 +898,18 @@ config MIPS_RM9122  	bool  	select SERIAL_RM9000 +config SOC_EMMA2RH +	bool +	select CEVT_R4K +	select CSRC_R4K +	select DMA_NONCOHERENT +	select IRQ_CPU +	select SWAP_IO_SPACE +	select SYS_HAS_CPU_R5500 +	select SYS_SUPPORTS_32BIT_KERNEL +	select SYS_SUPPORTS_64BIT_KERNEL +	select SYS_SUPPORTS_BIG_ENDIAN +  config SOC_PNX833X  	bool  	select CEVT_R4K @@ -930,11 +945,6 @@ config SOC_PNX8550  config SWAP_IO_SPACE  	bool -config EMMA2RH -	bool -	depends on MARKEINS -	default y -  config SERIAL_RM9000  	bool diff --git a/arch/mips/Makefile b/arch/mips/Makefile index 21b00e95dae..22dab2e1434 100644 --- a/arch/mips/Makefile +++ b/arch/mips/Makefile @@ -416,7 +416,7 @@ load-$(CONFIG_PNX8550_STB810)	+= 0xffffffff80060000  #  # Common NEC EMMAXXX  # -core-$(CONFIG_SOC_EMMA)		+= arch/mips/emma/common/ +core-$(CONFIG_SOC_EMMA2RH)	+= arch/mips/emma/common/  cflags-$(CONFIG_SOC_EMMA2RH)	+= -I$(srctree)/arch/mips/include/asm/mach-emma2rh  # diff --git a/arch/mips/configs/ip27_defconfig b/arch/mips/configs/ip27_defconfig index f2baea3039b..0208723adf2 100644 --- a/arch/mips/configs/ip27_defconfig +++ b/arch/mips/configs/ip27_defconfig @@ -512,7 +512,7 @@ CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=y  CONFIG_MD_RAID1=y  CONFIG_MD_RAID10=m -CONFIG_MD_RAID456=m +CONFIG_MD_RAID456=y  CONFIG_MD_RAID5_RESHAPE=y  CONFIG_MD_MULTIPATH=m  CONFIG_MD_FAULTY=m diff --git a/arch/mips/configs/jmr3927_defconfig b/arch/mips/configs/jmr3927_defconfig index 9d5bd2a0af3..5380f1f582d 100644 --- a/arch/mips/configs/jmr3927_defconfig +++ b/arch/mips/configs/jmr3927_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.26-rc9 -# Fri Jul 11 23:01:36 2008 +# Linux kernel version: 2.6.29-rc7 +# Wed Mar  4 23:07:16 2009  #  CONFIG_MIPS=y @@ -18,8 +18,10 @@ CONFIG_MIPS=y  # CONFIG_LEMOTE_FULONG is not set  # CONFIG_MIPS_MALTA is not set  # CONFIG_MIPS_SIM is not set -# CONFIG_MARKEINS is not set +# CONFIG_MACH_EMMA is not set  # CONFIG_MACH_VR41XX is not set +# CONFIG_NXP_STB220 is not set +# CONFIG_NXP_STB225 is not set  # CONFIG_PNX8550_JBS is not set  # CONFIG_PNX8550_STB810 is not set  # CONFIG_PMC_MSP is not set @@ -39,7 +41,11 @@ CONFIG_MIPS=y  # CONFIG_SNI_RM is not set  CONFIG_MACH_TX39XX=y  # CONFIG_MACH_TX49XX is not set +# CONFIG_MIKROTIK_RB532 is not set  # CONFIG_WR_PPMC is not set +# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set +# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set +CONFIG_MACH_TXX9=y  CONFIG_TOSHIBA_JMR3927=y  CONFIG_SOC_TX3927=y  # CONFIG_TOSHIBA_FPCIB0 is not set @@ -54,12 +60,14 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y  CONFIG_GENERIC_CLOCKEVENTS=y  CONFIG_GENERIC_TIME=y  CONFIG_GENERIC_CMOS_UPDATE=y -CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y  CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y  CONFIG_CEVT_TXX9=y  CONFIG_GPIO_TXX9=y  CONFIG_DMA_NONCOHERENT=y  CONFIG_DMA_NEED_PCI_MAP_STATE=y +CONFIG_EARLY_PRINTK=y +CONFIG_SYS_HAS_EARLY_PRINTK=y  # CONFIG_HOTPLUG_CPU is not set  # CONFIG_NO_IOPORT is not set  CONFIG_GENERIC_GPIO=y @@ -87,6 +95,7 @@ CONFIG_CPU_TX39XX=y  # CONFIG_CPU_TX49XX is not set  # CONFIG_CPU_R5000 is not set  # CONFIG_CPU_R5432 is not set +# CONFIG_CPU_R5500 is not set  # CONFIG_CPU_R6000 is not set  # CONFIG_CPU_NEVADA is not set  # CONFIG_CPU_R8000 is not set @@ -94,6 +103,7 @@ CONFIG_CPU_TX39XX=y  # CONFIG_CPU_RM7000 is not set  # CONFIG_CPU_RM9000 is not set  # CONFIG_CPU_SB1 is not set +# CONFIG_CPU_CAVIUM_OCTEON is not set  CONFIG_SYS_HAS_CPU_TX39XX=y  CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y  CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y @@ -117,14 +127,12 @@ CONFIG_ARCH_FLATMEM_ENABLE=y  CONFIG_ARCH_POPULATES_NODE_MAP=y  CONFIG_FLATMEM=y  CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_SPARSEMEM_STATIC is not set -# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set  CONFIG_PAGEFLAGS_EXTENDED=y  CONFIG_SPLIT_PTLOCK_CPUS=4 -# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set  CONFIG_ZONE_DMA_FLAG=0  CONFIG_VIRT_TO_BUS=y -# CONFIG_TICK_ONESHOT is not set +CONFIG_UNEVICTABLE_LRU=y  # CONFIG_NO_HZ is not set  # CONFIG_HIGH_RES_TIMERS is not set  CONFIG_GENERIC_CLOCKEVENTS_BUILD=y @@ -159,6 +167,15 @@ CONFIG_SYSVIPC_SYSCTL=y  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  # CONFIG_IKCONFIG is not set  CONFIG_LOG_BUF_SHIFT=14  # CONFIG_CGROUPS is not set @@ -171,7 +188,6 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y  CONFIG_SYSCTL=y  CONFIG_EMBEDDED=y  CONFIG_SYSCTL_SYSCALL=y -CONFIG_SYSCTL_SYSCALL_CHECK=y  CONFIG_KALLSYMS=y  # CONFIG_KALLSYMS_EXTRA_PASS is not set  # CONFIG_HOTPLUG is not set @@ -188,26 +204,23 @@ CONFIG_SIGNALFD=y  CONFIG_TIMERFD=y  CONFIG_EVENTFD=y  CONFIG_SHMEM=y +CONFIG_AIO=y  CONFIG_VM_EVENT_COUNTERS=y +CONFIG_PCI_QUIRKS=y  CONFIG_SLAB=y  # CONFIG_SLUB is not set  # CONFIG_SLOB is not set  # CONFIG_PROFILING is not set -# CONFIG_MARKERS is not set  CONFIG_HAVE_OPROFILE=y -# CONFIG_HAVE_KPROBES is not set -# CONFIG_HAVE_KRETPROBES is not set -# CONFIG_HAVE_DMA_ATTRS 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  CONFIG_BASE_SMALL=0  # CONFIG_MODULES is not set  CONFIG_BLOCK=y  # CONFIG_LBD is not set  # CONFIG_BLK_DEV_IO_TRACE is not set -# CONFIG_LSF is not set +# CONFIG_BLK_DEV_INTEGRITY is not set  #  # IO Schedulers @@ -221,7 +234,7 @@ CONFIG_IOSCHED_CFQ=y  CONFIG_DEFAULT_CFQ=y  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="cfq" -CONFIG_CLASSIC_RCU=y +# CONFIG_FREEZER is not set  #  # Bus options (PCI, PCMCIA, EISA, ISA, TC) @@ -231,12 +244,15 @@ CONFIG_PCI=y  CONFIG_PCI_DOMAINS=y  # CONFIG_ARCH_SUPPORTS_MSI is not set  CONFIG_PCI_LEGACY=y +# CONFIG_PCI_STUB is not set  CONFIG_MMU=y  #  # Executable file formats  #  CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_HAVE_AOUT is not set  # CONFIG_BINFMT_MISC is not set  CONFIG_TRAD_SIGNALS=y @@ -245,15 +261,12 @@ CONFIG_TRAD_SIGNALS=y  #  CONFIG_ARCH_SUSPEND_POSSIBLE=y  # CONFIG_PM is not set - -# -# Networking -#  CONFIG_NET=y  #  # Networking options  # +CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_PACKET=y  # CONFIG_PACKET_MMAP is not set  CONFIG_UNIX=y @@ -293,6 +306,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"  # CONFIG_IPX is not set  # CONFIG_ATALK is not set  # CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set  #  # Network testing @@ -302,14 +316,9 @@ CONFIG_DEFAULT_TCP_CONG="cubic"  # CONFIG_CAN is not set  # CONFIG_IRDA is not set  # CONFIG_BT is not set - -# -# Wireless -# -# CONFIG_CFG80211 is not set -# CONFIG_WIRELESS_EXT is not set -# CONFIG_MAC80211 is not set -# CONFIG_IEEE80211 is not set +# CONFIG_PHONET is not set +# CONFIG_WIRELESS is not set +# CONFIG_WIMAX is not set  # CONFIG_RFKILL is not set  # @@ -323,7 +332,89 @@ CONFIG_STANDALONE=y  CONFIG_PREVENT_FIRMWARE_BUILD=y  # CONFIG_SYS_HYPERVISOR is not set  # CONFIG_CONNECTOR is not set -# CONFIG_MTD is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +# CONFIG_MTD_BLKDEVS is not set +# CONFIG_MTD_BLOCK is not set +# CONFIG_MTD_BLOCK_RO is not set +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_CFI_INTELEXT is not set +CONFIG_MTD_CFI_AMDSTD=y +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_PHYSMAP=y +# CONFIG_MTD_PHYSMAP_COMPAT is not set +# CONFIG_MTD_INTEL_VR_NOR is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +# CONFIG_MTD_NAND is not set +# CONFIG_MTD_ONENAND is not set + +# +# LPDDR flash memory drivers +# +# CONFIG_MTD_LPDDR is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set  # CONFIG_PARPORT is not set  CONFIG_BLK_DEV=y  # CONFIG_BLK_CPQ_DA is not set @@ -336,6 +427,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 @@ -361,7 +453,6 @@ CONFIG_HAVE_IDE=y  # CONFIG_IEEE1394 is not set  # CONFIG_I2O is not set  CONFIG_NETDEVICES=y -# CONFIG_NETDEVICES_MULTIQUEUE is not set  # CONFIG_DUMMY is not set  # CONFIG_BONDING is not set  # CONFIG_EQUALIZER is not set @@ -383,6 +474,9 @@ CONFIG_PHYLIB=y  # CONFIG_BROADCOM_PHY is not set  # CONFIG_ICPLUS_PHY is not set  # CONFIG_REALTEK_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_LSI_ET1011C_PHY is not set  # CONFIG_FIXED_PHY is not set  # CONFIG_MDIO_BITBANG is not set  CONFIG_NET_ETHERNET=y @@ -392,6 +486,7 @@ CONFIG_NET_ETHERNET=y  # CONFIG_SUNGEM is not set  # CONFIG_CASSINI is not set  # CONFIG_NET_VENDOR_3COM is not set +# CONFIG_SMC91X is not set  # CONFIG_DM9000 is not set  # CONFIG_NET_TULIP is not set  # CONFIG_HP100 is not set @@ -399,6 +494,9 @@ CONFIG_NET_ETHERNET=y  # CONFIG_IBM_NEW_EMAC_RGMII is not set  # CONFIG_IBM_NEW_EMAC_TAH is not set  # CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set  CONFIG_NET_PCI=y  # CONFIG_PCNET32 is not set  # CONFIG_AMD8111_ETH is not set @@ -406,7 +504,6 @@ CONFIG_NET_PCI=y  # CONFIG_B44 is not set  # CONFIG_FORCEDETH is not set  CONFIG_TC35815=y -# CONFIG_EEPRO100 is not set  # CONFIG_E100 is not set  # CONFIG_FEALNX is not set  # CONFIG_NATSEMI is not set @@ -415,9 +512,11 @@ CONFIG_TC35815=y  # CONFIG_R6040 is not set  # CONFIG_SIS900 is not set  # CONFIG_EPIC100 is not set +# CONFIG_SMSC9420 is not set  # CONFIG_SUNDANCE is not set  # CONFIG_TLAN is not set  # CONFIG_VIA_RHINE is not set +# CONFIG_ATL2 is not set  # CONFIG_NETDEV_1000 is not set  # CONFIG_NETDEV_10000 is not set  # CONFIG_TR is not set @@ -428,6 +527,10 @@ CONFIG_TC35815=y  # CONFIG_WLAN_PRE80211 is not set  # CONFIG_WLAN_80211 is not set  # CONFIG_IWLWIFI_LEDS is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +#  # CONFIG_WAN is not set  # CONFIG_FDDI is not set  # CONFIG_PPP is not set @@ -440,27 +543,7 @@ CONFIG_TC35815=y  #  # Input device support  # -CONFIG_INPUT=y -# CONFIG_INPUT_FF_MEMLESS is not set -# CONFIG_INPUT_POLLDEV is not set - -# -# Userland interfaces -# -# CONFIG_INPUT_MOUSEDEV is not set -# CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_EVDEV is not set -# CONFIG_INPUT_EVBUG is not set - -# -# Input Device Drivers -# -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_MOUSE is not set -# CONFIG_INPUT_JOYSTICK is not set -# CONFIG_INPUT_TABLET is not set -# CONFIG_INPUT_TOUCHSCREEN is not set -# CONFIG_INPUT_MISC is not set +# CONFIG_INPUT is not set  #  # Hardware I/O ports @@ -517,10 +600,11 @@ CONFIG_LEGACY_PTY_COUNT=256  CONFIG_DEVPORT=y  # CONFIG_I2C is not set  # CONFIG_SPI is not set -CONFIG_HAVE_GPIO_LIB=y +CONFIG_ARCH_REQUIRE_GPIOLIB=y +CONFIG_GPIOLIB=y  # -# GPIO Support +# Memory mapped GPIO expanders:  #  # @@ -528,6 +612,11 @@ CONFIG_HAVE_GPIO_LIB=y  #  # +# PCI GPIO expanders: +# +# CONFIG_GPIO_BT8XX is not set + +#  # SPI GPIO expanders:  #  # CONFIG_W1 is not set @@ -542,6 +631,7 @@ CONFIG_WATCHDOG=y  # Watchdog Device Drivers  #  # CONFIG_SOFT_WATCHDOG is not set +# CONFIG_ALIM7101_WDT is not set  CONFIG_TXX9_WDT=y  # @@ -549,18 +639,21 @@ CONFIG_TXX9_WDT=y  #  # CONFIG_PCIPCWATCHDOG is not set  # CONFIG_WDTPCI is not set +CONFIG_SSB_POSSIBLE=y  #  # Sonics Silicon Backplane  # -CONFIG_SSB_POSSIBLE=y  # CONFIG_SSB is not set  #  # Multifunction device drivers  # +# CONFIG_MFD_CORE is not set  # CONFIG_MFD_SM501 is not set  # CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_REGULATOR is not set  #  # Multimedia devices @@ -591,16 +684,26 @@ CONFIG_SSB_POSSIBLE=y  # Display device support  #  # CONFIG_DISPLAY_SUPPORT is not set - -# -# Sound -#  # CONFIG_SOUND is not set -# CONFIG_HID_SUPPORT is not set  # CONFIG_USB_SUPPORT is not set  # CONFIG_MMC is not set  # CONFIG_MEMSTICK is not set -# CONFIG_NEW_LEDS is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +CONFIG_LEDS_GPIO=y + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +# CONFIG_LEDS_TRIGGER_TIMER is not set +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set  # CONFIG_ACCESSIBILITY is not set  # CONFIG_INFINIBAND is not set  CONFIG_RTC_LIB=y @@ -626,27 +729,34 @@ CONFIG_RTC_INTF_DEV=y  # Platform RTC drivers  #  # CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set  # CONFIG_RTC_DRV_DS1511 is not set  # CONFIG_RTC_DRV_DS1553 is not set  CONFIG_RTC_DRV_DS1742=y  # CONFIG_RTC_DRV_STK17TA8 is not set  # CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set  # CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set  # CONFIG_RTC_DRV_V3020 is not set  #  # on-CPU RTC drivers  # +# CONFIG_DMADEVICES is not set  # CONFIG_UIO is not set +# CONFIG_STAGING is not set  #  # File systems  #  # CONFIG_EXT2_FS is not set  # CONFIG_EXT3_FS is not set +# CONFIG_EXT4_FS is not set  # CONFIG_REISERFS_FS is not set  # CONFIG_JFS_FS is not set  # CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y  # CONFIG_XFS_FS is not set  # CONFIG_OCFS2_FS is not set  CONFIG_DNOTIFY=y @@ -676,28 +786,17 @@ CONFIG_INOTIFY_USER=y  CONFIG_PROC_FS=y  CONFIG_PROC_KCORE=y  CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y  CONFIG_SYSFS=y  # CONFIG_TMPFS is not set  # CONFIG_HUGETLB_PAGE is not set  # CONFIG_CONFIGFS_FS is not set - -# -# Miscellaneous filesystems -# -# CONFIG_HFSPLUS_FS is not set -# CONFIG_CRAMFS is not set -# CONFIG_VXFS_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_HPFS_FS is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_ROMFS_FS is not set -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set +# CONFIG_MISC_FILESYSTEMS is not set  CONFIG_NETWORK_FILESYSTEMS=y  CONFIG_NFS_FS=y  # CONFIG_NFS_V3 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 @@ -726,7 +825,16 @@ CONFIG_FRAME_WARN=1024  # CONFIG_DEBUG_FS is not set  # CONFIG_HEADERS_CHECK is not set  # CONFIG_DEBUG_KERNEL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +CONFIG_SYSCTL_SYSCALL_CHECK=y + +# +# Tracers +# +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set  # CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y  CONFIG_CMDLINE=""  # @@ -734,15 +842,18 @@ CONFIG_CMDLINE=""  #  # CONFIG_KEYS is not set  # CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set  # CONFIG_CRYPTO is not set  #  # Library routines  #  CONFIG_BITREVERSE=y -# CONFIG_GENERIC_FIND_FIRST_BIT is not set +CONFIG_GENERIC_FIND_LAST_BIT=y  # CONFIG_CRC_CCITT is not set  # CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set  # CONFIG_CRC_ITU_T is not set  CONFIG_CRC32=y  # CONFIG_CRC7 is not set diff --git a/arch/mips/configs/emma2rh_defconfig b/arch/mips/configs/markeins_defconfig index fea9bc9865a..bad8901f8f3 100644 --- a/arch/mips/configs/emma2rh_defconfig +++ b/arch/mips/configs/markeins_defconfig @@ -35,7 +35,7 @@ CONFIG_ZONE_DMA=y  # CONFIG_PNX8550_STB810 is not set  # CONFIG_MACH_VR41XX is not set  # CONFIG_PMC_YOSEMITE is not set -CONFIG_MARKEINS=y +CONFIG_NEC_MARKEINS=y  # CONFIG_SGI_IP22 is not set  # CONFIG_SGI_IP27 is not set  # CONFIG_SGI_IP32 is not set @@ -68,7 +68,7 @@ CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y  CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y  CONFIG_IRQ_CPU=y  CONFIG_SWAP_IO_SPACE=y -CONFIG_EMMA2RH=y +CONFIG_SOC_EMMA2RH=y  CONFIG_MIPS_L1_CACHE_SHIFT=5  # @@ -574,9 +574,9 @@ CONFIG_MTD_CFI_UTIL=y  #  # CONFIG_MTD_COMPLEX_MAPPINGS is not set  CONFIG_MTD_PHYSMAP=y -CONFIG_MTD_PHYSMAP_START=0x1e000000 -CONFIG_MTD_PHYSMAP_LEN=0x02000000 -CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PHYSMAP_START=0x0 +CONFIG_MTD_PHYSMAP_LEN=0x0 +CONFIG_MTD_PHYSMAP_BANKWIDTH=0  # CONFIG_MTD_PLATRAM is not set  # diff --git a/arch/mips/configs/rbtx49xx_defconfig b/arch/mips/configs/rbtx49xx_defconfig index 83d5c58662c..1efe977497d 100644 --- a/arch/mips/configs/rbtx49xx_defconfig +++ b/arch/mips/configs/rbtx49xx_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.26-rc9 -# Fri Jul 11 23:03:21 2008 +# Linux kernel version: 2.6.29-rc7 +# Wed Mar  4 23:08:06 2009  #  CONFIG_MIPS=y @@ -18,8 +18,10 @@ CONFIG_MIPS=y  # CONFIG_LEMOTE_FULONG is not set  # CONFIG_MIPS_MALTA is not set  # CONFIG_MIPS_SIM is not set -# CONFIG_MARKEINS is not set +# CONFIG_MACH_EMMA is not set  # CONFIG_MACH_VR41XX is not set +# CONFIG_NXP_STB220 is not set +# CONFIG_NXP_STB225 is not set  # CONFIG_PNX8550_JBS is not set  # CONFIG_PNX8550_STB810 is not set  # CONFIG_PMC_MSP is not set @@ -39,20 +41,28 @@ CONFIG_MIPS=y  # CONFIG_SNI_RM is not set  # CONFIG_MACH_TX39XX is not set  CONFIG_MACH_TX49XX=y +# CONFIG_MIKROTIK_RB532 is not set  # CONFIG_WR_PPMC is not set +# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set +# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set +CONFIG_MACH_TXX9=y  CONFIG_TOSHIBA_RBTX4927=y  CONFIG_TOSHIBA_RBTX4938=y +CONFIG_TOSHIBA_RBTX4939=y  CONFIG_SOC_TX4927=y  CONFIG_SOC_TX4938=y +CONFIG_SOC_TX4939=y +CONFIG_TXX9_7SEGLED=y  # CONFIG_TOSHIBA_FPCIB0 is not set  CONFIG_PICMG_PCI_BACKPLANE_DEFAULT=y  #  # Multiplex Pin Select  # -CONFIG_TOSHIBA_RBTX4938_MPLEX_PIO58_61=y +# CONFIG_TOSHIBA_RBTX4938_MPLEX_PIO58_61 is not set  # CONFIG_TOSHIBA_RBTX4938_MPLEX_NAND is not set  # CONFIG_TOSHIBA_RBTX4938_MPLEX_ATA is not set +CONFIG_TOSHIBA_RBTX4938_MPLEX_KEEP=y  CONFIG_PCI_TX4927=y  CONFIG_RWSEM_GENERIC_SPINLOCK=y  # CONFIG_ARCH_HAS_ILOG2_U32 is not set @@ -64,14 +74,18 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y  CONFIG_GENERIC_CLOCKEVENTS=y  CONFIG_GENERIC_TIME=y  CONFIG_GENERIC_CMOS_UPDATE=y -CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y  CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_CEVT_R4K_LIB=y  CONFIG_CEVT_R4K=y  CONFIG_CEVT_TXX9=y +CONFIG_CSRC_R4K_LIB=y  CONFIG_CSRC_R4K=y  CONFIG_GPIO_TXX9=y  CONFIG_DMA_NONCOHERENT=y  CONFIG_DMA_NEED_PCI_MAP_STATE=y +CONFIG_EARLY_PRINTK=y +CONFIG_SYS_HAS_EARLY_PRINTK=y  # CONFIG_HOTPLUG_CPU is not set  # CONFIG_NO_IOPORT is not set  CONFIG_GENERIC_GPIO=y @@ -100,6 +114,7 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5  CONFIG_CPU_TX49XX=y  # CONFIG_CPU_R5000 is not set  # CONFIG_CPU_R5432 is not set +# CONFIG_CPU_R5500 is not set  # CONFIG_CPU_R6000 is not set  # CONFIG_CPU_NEVADA is not set  # CONFIG_CPU_R8000 is not set @@ -107,6 +122,7 @@ CONFIG_CPU_TX49XX=y  # CONFIG_CPU_RM7000 is not set  # CONFIG_CPU_RM9000 is not set  # CONFIG_CPU_SB1 is not set +# CONFIG_CPU_CAVIUM_OCTEON is not set  CONFIG_SYS_HAS_CPU_TX49XX=y  CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y  CONFIG_SYS_SUPPORTS_64BIT_KERNEL=y @@ -134,13 +150,12 @@ CONFIG_ARCH_FLATMEM_ENABLE=y  CONFIG_ARCH_POPULATES_NODE_MAP=y  CONFIG_FLATMEM=y  CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_SPARSEMEM_STATIC is not set -# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set  CONFIG_PAGEFLAGS_EXTENDED=y  CONFIG_SPLIT_PTLOCK_CPUS=4 -# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set  CONFIG_ZONE_DMA_FLAG=0  CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y  CONFIG_TICK_ONESHOT=y  CONFIG_NO_HZ=y  CONFIG_HIGH_RES_TIMERS=y @@ -176,6 +191,15 @@ CONFIG_SYSVIPC_SYSCTL=y  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y  CONFIG_LOG_BUF_SHIFT=14 @@ -190,7 +214,6 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y  CONFIG_SYSCTL=y  CONFIG_EMBEDDED=y  CONFIG_SYSCTL_SYSCALL=y -CONFIG_SYSCTL_SYSCALL_CHECK=y  CONFIG_KALLSYMS=y  # CONFIG_KALLSYMS_EXTRA_PASS is not set  # CONFIG_HOTPLUG is not set @@ -207,30 +230,26 @@ CONFIG_SIGNALFD=y  CONFIG_TIMERFD=y  CONFIG_EVENTFD=y  CONFIG_SHMEM=y +CONFIG_AIO=y  CONFIG_VM_EVENT_COUNTERS=y +CONFIG_PCI_QUIRKS=y  CONFIG_SLAB=y  # CONFIG_SLUB is not set  # CONFIG_SLOB is not set  # CONFIG_PROFILING is not set -# CONFIG_MARKERS is not set  CONFIG_HAVE_OPROFILE=y -# CONFIG_HAVE_KPROBES is not set -# CONFIG_HAVE_KRETPROBES is not set -# CONFIG_HAVE_DMA_ATTRS is not set -CONFIG_PROC_PAGE_MONITOR=y +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set  CONFIG_SLABINFO=y -# CONFIG_TINY_SHMEM is not set  CONFIG_BASE_SMALL=0  CONFIG_MODULES=y  # CONFIG_MODULE_FORCE_LOAD is not set -# CONFIG_MODULE_UNLOAD is not set +CONFIG_MODULE_UNLOAD=y  # CONFIG_MODVERSIONS is not set  # CONFIG_MODULE_SRCVERSION_ALL 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_INTEGRITY is not set  #  # IO Schedulers @@ -244,7 +263,8 @@ CONFIG_DEFAULT_AS=y  # CONFIG_DEFAULT_CFQ is not set  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="anticipatory" -CONFIG_CLASSIC_RCU=y +# CONFIG_PROBE_INITRD_HEADER is not set +# CONFIG_FREEZER is not set  #  # Bus options (PCI, PCMCIA, EISA, ISA, TC) @@ -254,12 +274,15 @@ CONFIG_PCI=y  CONFIG_PCI_DOMAINS=y  # CONFIG_ARCH_SUPPORTS_MSI is not set  # CONFIG_PCI_LEGACY is not set +# CONFIG_PCI_STUB is not set  CONFIG_MMU=y  #  # Executable file formats  #  CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_HAVE_AOUT is not set  # CONFIG_BINFMT_MISC is not set  CONFIG_TRAD_SIGNALS=y @@ -268,15 +291,12 @@ CONFIG_TRAD_SIGNALS=y  #  CONFIG_ARCH_SUSPEND_POSSIBLE=y  # CONFIG_PM is not set - -# -# Networking -#  CONFIG_NET=y  #  # Networking options  # +CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_PACKET=y  # CONFIG_PACKET_MMAP is not set  CONFIG_UNIX=y @@ -318,6 +338,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"  # CONFIG_IPX is not set  # CONFIG_ATALK is not set  # CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set  #  # Network testing @@ -327,14 +348,9 @@ CONFIG_DEFAULT_TCP_CONG="cubic"  # CONFIG_CAN is not set  # CONFIG_IRDA is not set  # CONFIG_BT is not set - -# -# Wireless -# -# CONFIG_CFG80211 is not set -# CONFIG_WIRELESS_EXT is not set -# CONFIG_MAC80211 is not set -# CONFIG_IEEE80211 is not set +# CONFIG_PHONET is not set +# CONFIG_WIRELESS is not set +# CONFIG_WIMAX is not set  # CONFIG_RFKILL is not set  # @@ -348,7 +364,90 @@ CONFIG_STANDALONE=y  CONFIG_PREVENT_FIRMWARE_BUILD=y  # CONFIG_SYS_HYPERVISOR is not set  # CONFIG_CONNECTOR is not set -# CONFIG_MTD is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_TESTS is not set +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +# CONFIG_MTD_BLKDEVS is not set +# CONFIG_MTD_BLOCK is not set +# CONFIG_MTD_BLOCK_RO is not set +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_CFI_INTELEXT is not set +CONFIG_MTD_CFI_AMDSTD=y +# CONFIG_MTD_CFI_STAA is not set +CONFIG_MTD_CFI_UTIL=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_PHYSMAP=y +# CONFIG_MTD_PHYSMAP_COMPAT is not set +# CONFIG_MTD_INTEL_VR_NOR is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +# CONFIG_MTD_NAND is not set +# CONFIG_MTD_ONENAND is not set + +# +# LPDDR flash memory drivers +# +# CONFIG_MTD_LPDDR is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set  # CONFIG_PARPORT is not set  CONFIG_BLK_DEV=y  # CONFIG_BLK_CPQ_DA is not set @@ -365,9 +464,60 @@ CONFIG_BLK_DEV_RAM_SIZE=8192  # CONFIG_BLK_DEV_XIP 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 +CONFIG_IDE=y + +# +# Please see Documentation/ide/ide.txt for help/info on IDE drives +# +CONFIG_IDE_TIMINGS=y +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_IDE_GD=y +CONFIG_IDE_GD_ATA=y +# CONFIG_IDE_GD_ATAPI is not set +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_PROC_FS=y + +# +# IDE chipset support/bugfixes +# +# CONFIG_IDE_GENERIC is not set +# CONFIG_BLK_DEV_PLATFORM is not set +CONFIG_BLK_DEV_IDEDMA_SFF=y + +# +# PCI IDE chipsets support +# +# CONFIG_BLK_DEV_GENERIC is not set +# CONFIG_BLK_DEV_AEC62XX is not set +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +# CONFIG_BLK_DEV_CMD64X is not set +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CS5530 is not set +# CONFIG_BLK_DEV_HPT366 is not set +# CONFIG_BLK_DEV_JMICRON is not set +# CONFIG_BLK_DEV_SC1200 is not set +# CONFIG_BLK_DEV_PIIX is not set +# CONFIG_BLK_DEV_IT8172 is not set +# CONFIG_BLK_DEV_IT8213 is not set +# CONFIG_BLK_DEV_IT821X is not set +# CONFIG_BLK_DEV_NS87415 is not set +# CONFIG_BLK_DEV_PDC202XX_OLD is not set +# CONFIG_BLK_DEV_PDC202XX_NEW is not set +# CONFIG_BLK_DEV_SVWKS is not set +# CONFIG_BLK_DEV_SIIMAGE is not set +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +# CONFIG_BLK_DEV_VIA82CXXX is not set +# CONFIG_BLK_DEV_TC86C001 is not set +CONFIG_BLK_DEV_IDE_TX4938=y +CONFIG_BLK_DEV_IDE_TX4939=y +CONFIG_BLK_DEV_IDEDMA=y  #  # SCSI device support @@ -390,7 +540,6 @@ CONFIG_HAVE_IDE=y  # CONFIG_IEEE1394 is not set  # CONFIG_I2O is not set  CONFIG_NETDEVICES=y -# CONFIG_NETDEVICES_MULTIQUEUE is not set  # CONFIG_DUMMY is not set  # CONFIG_BONDING is not set  # CONFIG_EQUALIZER is not set @@ -412,15 +561,19 @@ CONFIG_PHYLIB=y  # CONFIG_BROADCOM_PHY is not set  # CONFIG_ICPLUS_PHY is not set  # CONFIG_REALTEK_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_LSI_ET1011C_PHY is not set  # CONFIG_FIXED_PHY is not set  # CONFIG_MDIO_BITBANG is not set  CONFIG_NET_ETHERNET=y -# CONFIG_MII is not set +CONFIG_MII=y  # CONFIG_AX88796 is not set  # CONFIG_HAPPYMEAL is not set  # CONFIG_SUNGEM is not set  # CONFIG_CASSINI is not set  # CONFIG_NET_VENDOR_3COM is not set +CONFIG_SMC91X=y  # CONFIG_DM9000 is not set  # CONFIG_NET_TULIP is not set  # CONFIG_HP100 is not set @@ -429,6 +582,9 @@ CONFIG_NE2000=y  # CONFIG_IBM_NEW_EMAC_RGMII is not set  # CONFIG_IBM_NEW_EMAC_TAH is not set  # CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set  CONFIG_NET_PCI=y  # CONFIG_PCNET32 is not set  # CONFIG_AMD8111_ETH is not set @@ -436,7 +592,6 @@ CONFIG_NET_PCI=y  # CONFIG_B44 is not set  # CONFIG_FORCEDETH is not set  CONFIG_TC35815=y -# CONFIG_EEPRO100 is not set  # CONFIG_E100 is not set  # CONFIG_FEALNX is not set  # CONFIG_NATSEMI is not set @@ -445,9 +600,11 @@ CONFIG_TC35815=y  # CONFIG_R6040 is not set  # CONFIG_SIS900 is not set  # CONFIG_EPIC100 is not set +# CONFIG_SMSC9420 is not set  # CONFIG_SUNDANCE is not set  # CONFIG_TLAN is not set  # CONFIG_VIA_RHINE is not set +# CONFIG_ATL2 is not set  # CONFIG_NETDEV_1000 is not set  # CONFIG_NETDEV_10000 is not set  # CONFIG_TR is not set @@ -458,6 +615,10 @@ CONFIG_TC35815=y  # CONFIG_WLAN_PRE80211 is not set  # CONFIG_WLAN_80211 is not set  # CONFIG_IWLWIFI_LEDS is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +#  # CONFIG_WAN is not set  # CONFIG_FDDI is not set  # CONFIG_PPP is not set @@ -502,6 +663,7 @@ CONFIG_SERIAL_TXX9_CONSOLE=y  CONFIG_SERIAL_TXX9_STDSERIAL=y  # CONFIG_SERIAL_JSM is not set  CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set  CONFIG_LEGACY_PTYS=y  CONFIG_LEGACY_PTY_COUNT=256  # CONFIG_IPMI_HANDLER is not set @@ -517,17 +679,19 @@ CONFIG_SPI_MASTER=y  #  # SPI Master Controller Drivers  # +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_GPIO is not set  CONFIG_SPI_TXX9=y  #  # SPI Protocol Masters  # -CONFIG_EEPROM_AT25=y  # CONFIG_SPI_TLE62X0 is not set -CONFIG_HAVE_GPIO_LIB=y +CONFIG_ARCH_REQUIRE_GPIOLIB=y +CONFIG_GPIOLIB=y  # -# GPIO Support +# Memory mapped GPIO expanders:  #  # @@ -535,8 +699,14 @@ CONFIG_HAVE_GPIO_LIB=y  #  # +# PCI GPIO expanders: +# +# CONFIG_GPIO_BT8XX is not set + +#  # SPI GPIO expanders:  # +# CONFIG_GPIO_MAX7301 is not set  # CONFIG_GPIO_MCP23S08 is not set  # CONFIG_W1 is not set  # CONFIG_POWER_SUPPLY is not set @@ -550,6 +720,7 @@ CONFIG_WATCHDOG=y  # Watchdog Device Drivers  #  # CONFIG_SOFT_WATCHDOG is not set +# CONFIG_ALIM7101_WDT is not set  CONFIG_TXX9_WDT=m  # @@ -557,18 +728,21 @@ CONFIG_TXX9_WDT=m  #  # CONFIG_PCIPCWATCHDOG is not set  # CONFIG_WDTPCI is not set +CONFIG_SSB_POSSIBLE=y  #  # Sonics Silicon Backplane  # -CONFIG_SSB_POSSIBLE=y  # CONFIG_SSB is not set  #  # Multifunction device drivers  # +# CONFIG_MFD_CORE is not set  # CONFIG_MFD_SM501 is not set  # CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_REGULATOR is not set  #  # Multimedia devices @@ -599,15 +773,27 @@ CONFIG_SSB_POSSIBLE=y  # Display device support  #  # CONFIG_DISPLAY_SUPPORT is not set - -# -# Sound -#  # CONFIG_SOUND is not set  # CONFIG_USB_SUPPORT is not set  # CONFIG_MMC is not set  # CONFIG_MEMSTICK is not set -# CONFIG_NEW_LEDS is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +CONFIG_LEDS_GPIO=y + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +# CONFIG_LEDS_TRIGGER_TIMER is not set +CONFIG_LEDS_TRIGGER_IDE_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set +# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set  # CONFIG_ACCESSIBILITY is not set  # CONFIG_INFINIBAND is not set  CONFIG_RTC_LIB=y @@ -628,35 +814,47 @@ CONFIG_RTC_INTF_DEV_UIE_EMUL=y  #  # SPI RTC drivers  # +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1390 is not set  # CONFIG_RTC_DRV_MAX6902 is not set  # CONFIG_RTC_DRV_R9701 is not set  CONFIG_RTC_DRV_RS5C348=y +# CONFIG_RTC_DRV_DS3234 is not set  #  # Platform RTC drivers  #  # CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set  # CONFIG_RTC_DRV_DS1511 is not set  # CONFIG_RTC_DRV_DS1553 is not set  CONFIG_RTC_DRV_DS1742=y  # CONFIG_RTC_DRV_STK17TA8 is not set  # CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set  # CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set  # CONFIG_RTC_DRV_V3020 is not set  #  # on-CPU RTC drivers  # +CONFIG_RTC_DRV_TX4939=y +# CONFIG_DMADEVICES is not set  # CONFIG_UIO is not set +# CONFIG_STAGING is not set  #  # File systems  #  # CONFIG_EXT2_FS is not set  # CONFIG_EXT3_FS is not set +# CONFIG_EXT4_FS is not set  # CONFIG_REISERFS_FS is not set  # CONFIG_JFS_FS is not set  CONFIG_FS_POSIX_ACL=y +CONFIG_FILE_LOCKING=y  # CONFIG_XFS_FS is not set  # CONFIG_OCFS2_FS is not set  # CONFIG_DNOTIFY is not set @@ -687,30 +885,19 @@ CONFIG_GENERIC_ACL=y  CONFIG_PROC_FS=y  # CONFIG_PROC_KCORE is not set  CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y  CONFIG_SYSFS=y  CONFIG_TMPFS=y  CONFIG_TMPFS_POSIX_ACL=y  # CONFIG_HUGETLB_PAGE is not set  # CONFIG_CONFIGFS_FS is not set - -# -# Miscellaneous filesystems -# -# CONFIG_HFSPLUS_FS is not set -# CONFIG_CRAMFS is not set -# CONFIG_VXFS_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_HPFS_FS is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_ROMFS_FS is not set -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set +# CONFIG_MISC_FILESYSTEMS is not set  CONFIG_NETWORK_FILESYSTEMS=y  CONFIG_NFS_FS=y  CONFIG_NFS_V3=y  # CONFIG_NFS_V3_ACL is not set -# CONFIG_NFSD is not set  CONFIG_ROOT_NFS=y +# CONFIG_NFSD is not set  CONFIG_LOCKD=y  CONFIG_LOCKD_V4=y  CONFIG_NFS_COMMON=y @@ -740,7 +927,16 @@ CONFIG_FRAME_WARN=1024  CONFIG_DEBUG_FS=y  # CONFIG_HEADERS_CHECK is not set  # CONFIG_DEBUG_KERNEL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +CONFIG_SYSCTL_SYSCALL_CHECK=y + +# +# Tracers +# +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set  # CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y  CONFIG_CMDLINE=""  # @@ -748,15 +944,18 @@ CONFIG_CMDLINE=""  #  # CONFIG_KEYS is not set  # CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set  # CONFIG_CRYPTO is not set  #  # Library routines  #  CONFIG_BITREVERSE=y -# CONFIG_GENERIC_FIND_FIRST_BIT is not set +CONFIG_GENERIC_FIND_LAST_BIT=y  # CONFIG_CRC_CCITT is not set  # CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set  # CONFIG_CRC_ITU_T is not set  CONFIG_CRC32=y  # CONFIG_CRC7 is not set diff --git a/arch/mips/emma/Kconfig b/arch/mips/emma/Kconfig deleted file mode 100644 index 9669c72123c..00000000000 --- a/arch/mips/emma/Kconfig +++ /dev/null @@ -1,29 +0,0 @@ -choice -	prompt "Machine type" -	depends on MACH_EMMA -	default NEC_MARKEINS - -config NEC_MARKEINS -	bool "NEC EMMA2RH Mark-eins board" -	select SOC_EMMA2RH -	select HW_HAS_PCI -	help -	  This enables support for the NEC Electronics Mark-eins boards. - -endchoice - -config SOC_EMMA2RH -	bool -	select SOC_EMMA -	select SYS_HAS_CPU_R5500 -	select SYS_SUPPORTS_32BIT_KERNEL -	select SYS_SUPPORTS_64BIT_KERNEL - -config SOC_EMMA -	bool -	select CEVT_R4K -	select CSRC_R4K -	select DMA_NONCOHERENT -	select IRQ_CPU -	select SWAP_IO_SPACE -	select SYS_SUPPORTS_BIG_ENDIAN diff --git a/arch/mips/emma/markeins/platform.c b/arch/mips/emma/markeins/platform.c index 88e87f6b344..d5f47e4f0d1 100644 --- a/arch/mips/emma/markeins/platform.c +++ b/arch/mips/emma/markeins/platform.c @@ -141,13 +141,6 @@ static struct  platform_device serial_emma = {  	},  }; -static struct platform_device *devices[] = { -	&i2c_emma_devices[0], -	&i2c_emma_devices[1], -	&i2c_emma_devices[2], -	&serial_emma, -}; -  static struct mtd_partition markeins_parts[] = {  	[0] = {  		.name = "RootFS", @@ -181,11 +174,39 @@ static struct mtd_partition markeins_parts[] = {  	},  }; +static struct physmap_flash_data markeins_flash_data = { +	.width		= 2, +	.nr_parts	= ARRAY_SIZE(markeins_parts), +	.parts		= markeins_parts +}; + +static struct resource markeins_flash_resource = { +	.start		= 0x1e000000, +	.end		= 0x02000000, +	.flags		= IORESOURCE_MEM +}; + +static struct platform_device markeins_flash_device = { +	.name		= "physmap-flash", +	.id		= 0, +	.dev		= { +        	.platform_data  = &markeins_flash_data, +	}, +	.num_resources	= 1, +	.resource	= &markeins_flash_resource, +}; + +static struct platform_device *devices[] = { +	i2c_emma_devices, +	i2c_emma_devices + 1, +	i2c_emma_devices + 2, +	&serial_emma, +	&markeins_flash_device, +}; +  static int __init platform_devices_setup(void)  { -	physmap_set_partitions(markeins_parts, ARRAY_SIZE(markeins_parts));  	return platform_add_devices(devices, ARRAY_SIZE(devices));  }  arch_initcall(platform_devices_setup); - diff --git a/arch/mips/include/asm/compat.h b/arch/mips/include/asm/compat.h index ac5d541368e..6c5b40905dd 100644 --- a/arch/mips/include/asm/compat.h +++ b/arch/mips/include/asm/compat.h @@ -3,6 +3,8 @@  /*   * Architecture specific compatibility types   */ +#include <linux/seccomp.h> +#include <linux/thread_info.h>  #include <linux/types.h>  #include <asm/page.h>  #include <asm/ptrace.h> @@ -218,4 +220,9 @@ struct compat_shmid64_ds {  	compat_ulong_t	__unused2;  }; +static inline int is_compat_task(void) +{ +	return test_thread_flag(TIF_32BIT); +} +  #endif /* _ASM_COMPAT_H */ diff --git a/arch/mips/include/asm/hazards.h b/arch/mips/include/asm/hazards.h index 43baed16a10..134e1fc8f4d 100644 --- a/arch/mips/include/asm/hazards.h +++ b/arch/mips/include/asm/hazards.h @@ -138,7 +138,8 @@ do {									\  		__instruction_hazard();					\  } while (0) -#elif defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_CAVIUM_OCTEON) +#elif defined(CONFIG_CPU_R10000) || defined(CONFIG_CPU_CAVIUM_OCTEON) || \ +      defined(CONFIG_CPU_R5500)  /*   * R10000 rocks - all hazards handled in hardware, so this becomes a nobrainer. diff --git a/arch/mips/include/asm/prefetch.h b/arch/mips/include/asm/prefetch.h index 17850834ccb..a56594f360e 100644 --- a/arch/mips/include/asm/prefetch.h +++ b/arch/mips/include/asm/prefetch.h @@ -26,7 +26,7 @@   * Pref_WriteBackInvalidate is a nop and Pref_PrepareForStore is broken in   * current versions due to erratum G105.   * - * VR7701 only implements the Load prefetch. + * VR5500 (including VR5701 and VR7701) only implement load prefetch.   *   * Finally MIPS32 and MIPS64 implement all of the following hints.   */ diff --git a/arch/mips/include/asm/seccomp.h b/arch/mips/include/asm/seccomp.h index a6772e9507f..ae6306ebdca 100644 --- a/arch/mips/include/asm/seccomp.h +++ b/arch/mips/include/asm/seccomp.h @@ -15,8 +15,6 @@   */  #ifdef CONFIG_MIPS32_O32 -#define TIF_32BIT TIF_32BIT_REGS -  #define __NR_seccomp_read_32		4003  #define __NR_seccomp_write_32		4004  #define __NR_seccomp_exit_32		4001 @@ -24,8 +22,6 @@  #elif defined(CONFIG_MIPS32_N32) -#define TIF_32BIT _TIF_32BIT_ADDR -  #define __NR_seccomp_read_32		6000  #define __NR_seccomp_write_32		6001  #define __NR_seccomp_exit_32		6058 diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index 3f76de73c94..676aa2ae191 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h @@ -127,6 +127,12 @@ register struct thread_info *__current_thread_info __asm__("$28");  #define TIF_LOAD_WATCH		25	/* If set, load watch registers */  #define TIF_SYSCALL_TRACE	31	/* syscall trace active */ +#ifdef CONFIG_MIPS32_O32 +#define TIF_32BIT TIF_32BIT_REGS +#elif defined(CONFIG_MIPS32_N32) +#define TIF_32BIT _TIF_32BIT_ADDR +#endif /* CONFIG_MIPS32_O32 */ +  #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)  #define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)  #define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED) diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index a7162a4484c..1bdbcad3bb7 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c @@ -149,6 +149,7 @@ void __init check_wait(void)  	case CPU_R4650:  	case CPU_R4700:  	case CPU_R5000: +	case CPU_R5500:  	case CPU_NEVADA:  	case CPU_4KC:  	case CPU_4KEC: diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 2f8452b404c..1a86f84fa94 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c @@ -235,7 +235,7 @@ SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third,  #else  SYSCALL_DEFINE6(32_ipc, u32, call, int, first, int, second, int, third, -	u32, ptr, u32 fifth) +	u32, ptr, u32, fifth)  {  	return -ENOSYS;  } diff --git a/arch/mips/mm/page.c b/arch/mips/mm/page.c index 1417c649485..48060c635ac 100644 --- a/arch/mips/mm/page.c +++ b/arch/mips/mm/page.c @@ -172,8 +172,9 @@ static void __cpuinit set_prefetch_parameters(void)  		 */  		cache_line_size = cpu_dcache_line_size();  		switch (current_cpu_type()) { +		case CPU_R5500:  		case CPU_TX49XX: -			/* TX49 supports only Pref_Load */ +			/* These processors only support the Pref_Load. */  			pref_bias_copy_load = 256;  			break; diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index 42942038d0f..f335cf6cdd7 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c @@ -318,6 +318,7 @@ static void __cpuinit build_tlb_write_entry(u32 **p, struct uasm_label **l,  	case CPU_BCM4710:  	case CPU_LOONGSON2:  	case CPU_CAVIUM_OCTEON: +	case CPU_R5500:  		if (m4kc_tlbp_war())  			uasm_i_nop(p);  		tlbw(p); diff --git a/arch/parisc/configs/712_defconfig b/arch/parisc/configs/712_defconfig index 9fc96e72716..bf34a28895f 100644 --- a/arch/parisc/configs/712_defconfig +++ b/arch/parisc/configs/712_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.23 -# Fri Oct 12 21:00:07 2007 +# Linux kernel version: 2.6.29-rc8 +# Fri Mar 13 01:32:55 2009  #  CONFIG_PARISC=y  CONFIG_MMU=y @@ -33,17 +33,35 @@ CONFIG_SYSVIPC_SYSCTL=y  CONFIG_POSIX_MQUEUE=y  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set -# CONFIG_USER_NS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y  CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_GROUP_SCHED is not set +# CONFIG_CGROUPS is not set  CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y  # CONFIG_RELAY is not set +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_USER_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y  CONFIG_INITRAMFS_SOURCE=""  CONFIG_CC_OPTIMIZE_FOR_SIZE=y  CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y  # CONFIG_EMBEDDED is not set  CONFIG_SYSCTL_SYSCALL=y  CONFIG_KALLSYMS=y @@ -55,29 +73,38 @@ CONFIG_BUG=y  CONFIG_ELF_CORE=y  CONFIG_BASE_FULL=y  CONFIG_FUTEX=y -CONFIG_ANON_INODES=y  CONFIG_EPOLL=y  CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y  CONFIG_EVENTFD=y  CONFIG_SHMEM=y +CONFIG_AIO=y  CONFIG_VM_EVENT_COUNTERS=y +CONFIG_COMPAT_BRK=y  CONFIG_SLAB=y  # CONFIG_SLUB is not set  # CONFIG_SLOB is not set +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# CONFIG_MARKERS is not set +CONFIG_OPROFILE=m +CONFIG_HAVE_OPROFILE=y +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_SLABINFO=y  CONFIG_RT_MUTEXES=y -# CONFIG_TINY_SHMEM is not set  CONFIG_BASE_SMALL=0  CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set  CONFIG_MODULE_UNLOAD=y  CONFIG_MODULE_FORCE_UNLOAD=y  # CONFIG_MODVERSIONS is not set  # CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_KMOD=y +CONFIG_INIT_ALL_POSSIBLE=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 @@ -91,6 +118,7 @@ CONFIG_DEFAULT_AS=y  # CONFIG_DEFAULT_CFQ is not set  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="anticipatory" +# CONFIG_FREEZER is not set  #  # Processor type and features @@ -114,17 +142,19 @@ CONFIG_HZ_250=y  # CONFIG_HZ_300 is not set  # CONFIG_HZ_1000 is not set  CONFIG_HZ=250 +# CONFIG_SCHED_HRTICK is not set  CONFIG_SELECT_MEMORY_MODEL=y  CONFIG_FLATMEM_MANUAL=y  # CONFIG_DISCONTIGMEM_MANUAL is not set  # CONFIG_SPARSEMEM_MANUAL is not set  CONFIG_FLATMEM=y  CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_PAGEFLAGS_EXTENDED=y  CONFIG_SPLIT_PTLOCK_CPUS=4096 -# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set  CONFIG_ZONE_DMA_FLAG=0  CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y  # CONFIG_HPUX is not set  # @@ -138,10 +168,6 @@ CONFIG_GSC_LASI=y  # CONFIG_EISA is not set  # CONFIG_PCI is not set  # CONFIG_ARCH_SUPPORTS_MSI is not set - -# -# PCCARD (PCMCIA/CardBus) support -#  # CONFIG_PCCARD is not set  # @@ -156,16 +182,15 @@ CONFIG_PDC_STABLE=y  # Executable file formats  #  CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_HAVE_AOUT is not set  CONFIG_BINFMT_MISC=m - -# -# Networking -#  CONFIG_NET=y  #  # Networking options  # +CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_PACKET=y  CONFIG_PACKET_MMAP=y  CONFIG_UNIX=y @@ -173,6 +198,7 @@ CONFIG_XFRM=y  CONFIG_XFRM_USER=m  # CONFIG_XFRM_SUB_POLICY is not set  # CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set  CONFIG_NET_KEY=m  # CONFIG_NET_KEY_MIGRATE is not set  CONFIG_INET=y @@ -203,25 +229,25 @@ CONFIG_INET_TCP_DIAG=m  CONFIG_TCP_CONG_CUBIC=y  CONFIG_DEFAULT_TCP_CONG="cubic"  # CONFIG_TCP_MD5SIG is not set -# CONFIG_IP_VS is not set  # CONFIG_IPV6 is not set -# CONFIG_INET6_XFRM_TUNNEL is not set -# CONFIG_INET6_TUNNEL is not set  # CONFIG_NETWORK_SECMARK is not set  CONFIG_NETFILTER=y  # CONFIG_NETFILTER_DEBUG is not set +CONFIG_NETFILTER_ADVANCED=y  #  # Core Netfilter Configuration  # -# CONFIG_NETFILTER_NETLINK is not set -# CONFIG_NF_CONNTRACK_ENABLED is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set  # CONFIG_NF_CONNTRACK is not set  # CONFIG_NETFILTER_XTABLES is not set +# CONFIG_IP_VS is not set  #  # IP: Netfilter Configuration  # +# CONFIG_NF_DEFRAG_IPV4 is not set  CONFIG_IP_NF_QUEUE=m  # CONFIG_IP_NF_IPTABLES is not set  # CONFIG_IP_NF_ARPTABLES is not set @@ -230,6 +256,7 @@ CONFIG_IP_NF_QUEUE=m  # CONFIG_TIPC is not set  # CONFIG_ATM is not set  # CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set  # CONFIG_VLAN_8021Q is not set  # CONFIG_DECNET is not set  CONFIG_LLC=m @@ -240,28 +267,26 @@ CONFIG_LLC2=m  # CONFIG_LAPB is not set  # CONFIG_ECONET is not set  # CONFIG_WAN_ROUTER is not set - -# -# QoS and/or fair queueing -#  # CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set  #  # Network testing  #  CONFIG_NET_PKTGEN=m  # CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set  # CONFIG_IRDA is not set  # CONFIG_BT is not set  # CONFIG_AF_RXRPC is not set - -# -# Wireless -# +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y  # CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y  # CONFIG_WIRELESS_EXT is not set +# CONFIG_LIB80211 is not set  # CONFIG_MAC80211 is not set -# CONFIG_IEEE80211 is not set +# CONFIG_WIMAX is not set  # CONFIG_RFKILL is not set  # CONFIG_NET_9P is not set @@ -276,6 +301,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_STANDALONE is not set  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE=""  # CONFIG_DEBUG_DRIVER is not set  # CONFIG_DEBUG_DEVRES is not set  # CONFIG_SYS_HYPERVISOR is not set @@ -298,11 +325,19 @@ CONFIG_BLK_DEV_CRYPTOLOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_COUNT=16  CONFIG_BLK_DEV_RAM_SIZE=6144 -CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +# CONFIG_BLK_DEV_XIP is not set  # CONFIG_CDROM_PKTCDVD is not set  CONFIG_ATA_OVER_ETH=m +# CONFIG_BLK_DEV_HD is not set  CONFIG_MISC_DEVICES=y +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +#  # CONFIG_EEPROM_93CX6 is not set +CONFIG_HAVE_IDE=y  # CONFIG_IDE is not set  # @@ -342,14 +377,17 @@ CONFIG_SCSI_SPI_ATTRS=y  # CONFIG_SCSI_FC_ATTRS is not set  CONFIG_SCSI_ISCSI_ATTRS=m  # CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set  CONFIG_SCSI_LOWLEVEL=y  # CONFIG_ISCSI_TCP is not set +# CONFIG_LIBFC is not set  # CONFIG_SCSI_PPA is not set  # CONFIG_SCSI_IMM is not set  CONFIG_SCSI_LASI700=y  CONFIG_53C700_LE_ON_BE=y  # CONFIG_SCSI_ZALON is not set  CONFIG_SCSI_DEBUG=m +# CONFIG_SCSI_DH is not set  # CONFIG_ATA is not set  CONFIG_MD=y  CONFIG_BLK_DEV_MD=m @@ -362,7 +400,6 @@ CONFIG_MD_RAID1=m  # CONFIG_MD_FAULTY is not set  # CONFIG_BLK_DEV_DM is not set  CONFIG_NETDEVICES=y -# CONFIG_NETDEVICES_MULTIQUEUE is not set  CONFIG_DUMMY=m  CONFIG_BONDING=m  # CONFIG_MACVLAN is not set @@ -377,6 +414,9 @@ CONFIG_LASI_82596=y  # CONFIG_IBM_NEW_EMAC_RGMII is not set  # CONFIG_IBM_NEW_EMAC_TAH is not set  # CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set  # CONFIG_B44 is not set  # CONFIG_NET_POCKET is not set  CONFIG_NETDEV_1000=y @@ -387,6 +427,11 @@ CONFIG_NETDEV_10000=y  #  # CONFIG_WLAN_PRE80211 is not set  # CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +#  # CONFIG_WAN is not set  # CONFIG_PLIP is not set  CONFIG_PPP=m @@ -401,7 +446,6 @@ CONFIG_PPPOE=m  # CONFIG_PPPOL2TP is not set  # CONFIG_SLIP is not set  CONFIG_SLHC=m -# CONFIG_SHAPER is not set  # CONFIG_NETCONSOLE is not set  # CONFIG_NETPOLL is not set  # CONFIG_NET_POLL_CONTROLLER is not set @@ -423,7 +467,6 @@ CONFIG_INPUT_MOUSEDEV_PSAUX=y  CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024  CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768  # CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_TSDEV is not set  # CONFIG_INPUT_EVDEV is not set  # CONFIG_INPUT_EVBUG is not set @@ -446,8 +489,8 @@ CONFIG_MOUSE_PS2=y  CONFIG_MOUSE_PS2_ALPS=y  CONFIG_MOUSE_PS2_LOGIPS2PP=y  CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_LIFEBOOK=y  CONFIG_MOUSE_PS2_TRACKPOINT=y +# CONFIG_MOUSE_PS2_ELANTECH is not set  # CONFIG_MOUSE_PS2_TOUCHKIT is not set  CONFIG_MOUSE_SERIAL=m  # CONFIG_MOUSE_VSXXXAA is not set @@ -474,9 +517,11 @@ CONFIG_SERIO_LIBPS2=y  # Character devices  #  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  # @@ -501,72 +546,76 @@ CONFIG_PDC_CONSOLE=y  CONFIG_SERIAL_CORE=y  CONFIG_SERIAL_CORE_CONSOLE=y  CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set  CONFIG_LEGACY_PTYS=y  CONFIG_LEGACY_PTY_COUNT=64  CONFIG_PRINTER=m  # CONFIG_LP_CONSOLE is not set  CONFIG_PPDEV=m -# CONFIG_TIPAR is not set  # CONFIG_IPMI_HANDLER is not set -# CONFIG_WATCHDOG is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=y -CONFIG_GEN_RTC_X=y  # CONFIG_R3964 is not set  CONFIG_RAW_DRIVER=y  CONFIG_MAX_RAW_DEVS=256  # CONFIG_TCG_TPM is not set  # CONFIG_I2C is not set - -# -# SPI support -#  # CONFIG_SPI is not set -# CONFIG_SPI_MASTER is not set  # CONFIG_W1 is not set  # 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 +CONFIG_SSB_POSSIBLE=y  #  # Sonics Silicon Backplane  # -CONFIG_SSB_POSSIBLE=y  # CONFIG_SSB is not set  #  # Multifunction device drivers  # +# CONFIG_MFD_CORE is not set  # CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_REGULATOR is not set  #  # Multimedia devices  # + +# +# Multimedia core support +#  # CONFIG_VIDEO_DEV is not set  # CONFIG_DVB_CORE is not set -# CONFIG_DAB is not set +# CONFIG_VIDEO_MEDIA is not set  # -# Graphics support +# Multimedia drivers  # -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_DAB is not set  # -# Display device support +# Graphics support  # -# CONFIG_DISPLAY_SUPPORT is not set  # CONFIG_VGASTATE is not set  CONFIG_VIDEO_OUTPUT_CONTROL=m  CONFIG_FB=y  # CONFIG_FIRMWARE_EDID is not set  # CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT 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 is not set  # CONFIG_FB_SYS_FOPS is not set -CONFIG_FB_DEFERRED_IO=y  # CONFIG_FB_SVGALIB is not set  # CONFIG_FB_MACMODES is not set  # CONFIG_FB_BACKLIGHT is not set @@ -579,6 +628,14 @@ CONFIG_FB_TILEBLITTING=y  CONFIG_FB_STI=y  # CONFIG_FB_S1D13XXX is not set  # CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set  #  # Console display driver support @@ -606,15 +663,8 @@ CONFIG_LOGO=y  # CONFIG_LOGO_LINUX_VGA16 is not set  # CONFIG_LOGO_LINUX_CLUT224 is not set  CONFIG_LOGO_PARISC_CLUT224=y - -# -# Sound -#  CONFIG_SOUND=y - -# -# Advanced Linux Sound Architecture -# +CONFIG_SOUND_OSS_CORE=y  CONFIG_SND=y  CONFIG_SND_TIMER=y  CONFIG_SND_PCM=y @@ -630,10 +680,7 @@ CONFIG_SND_SUPPORT_OLD_API=y  CONFIG_SND_VERBOSE_PROCFS=y  # CONFIG_SND_VERBOSE_PRINTK is not set  # CONFIG_SND_DEBUG is not set - -# -# Generic devices -# +CONFIG_SND_DRIVERS=y  # CONFIG_SND_DUMMY is not set  # CONFIG_SND_VIRMIDI is not set  # CONFIG_SND_MTPAV is not set @@ -641,63 +688,82 @@ CONFIG_SND_VERBOSE_PROCFS=y  # CONFIG_SND_SERIAL_U16550 is not set  # CONFIG_SND_MPU401 is not set  # CONFIG_SND_PORTMAN2X4 is not set - -# -# GSC devices -# +CONFIG_SND_GSC=y  CONFIG_SND_HARMONY=y - -# -# System on Chip audio support -#  # CONFIG_SND_SOC is not set - -# -# SoC Audio support for SuperH -# - -# -# Open Sound System -#  # CONFIG_SOUND_PRIME is not set  CONFIG_HID_SUPPORT=y  CONFIG_HID=y  CONFIG_HID_DEBUG=y +# CONFIG_HIDRAW is not set +# CONFIG_HID_PID is not set + +# +# Special HID drivers +# +CONFIG_HID_COMPAT=y  CONFIG_USB_SUPPORT=y  # CONFIG_USB_ARCH_HAS_HCD is not set  # CONFIG_USB_ARCH_HAS_OHCI is not set  # CONFIG_USB_ARCH_HAS_EHCI is not set  # -# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# Enable Host or Gadget support to see Inventra options  #  # -# USB Gadget Support +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;  #  # CONFIG_USB_GADGET is not set + +# +# OTG and related infrastructure +#  # CONFIG_MMC is not set +# CONFIG_MEMSTICK is not set  # CONFIG_NEW_LEDS is not set -# CONFIG_RTC_CLASS is not set +# CONFIG_ACCESSIBILITY is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set  # -# DMA Engine support +# RTC interfaces  # -# CONFIG_DMA_ENGINE is not set +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set  # -# DMA Clients +# SPI RTC drivers  #  # -# DMA Devices +# Platform RTC drivers  # -# CONFIG_AUXDISPLAY is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set  # -# Userspace I/O +# on-CPU RTC drivers  # +CONFIG_RTC_DRV_PARISC=y +# CONFIG_DMADEVICES is not set +# CONFIG_AUXDISPLAY is not set  # CONFIG_UIO is not set +# CONFIG_STAGING is not set  #  # File systems @@ -707,7 +773,7 @@ CONFIG_EXT2_FS=y  # CONFIG_EXT2_FS_XIP is not set  CONFIG_EXT3_FS=y  # CONFIG_EXT3_FS_XATTR is not set -# CONFIG_EXT4DEV_FS is not set +# CONFIG_EXT4_FS is not set  CONFIG_JBD=y  # CONFIG_JBD_DEBUG is not set  # CONFIG_REISERFS_FS is not set @@ -717,19 +783,18 @@ CONFIG_JFS_FS=m  # CONFIG_JFS_DEBUG is not set  # CONFIG_JFS_STATISTICS is not set  CONFIG_FS_POSIX_ACL=y +CONFIG_FILE_LOCKING=y  CONFIG_XFS_FS=m  # CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_SECURITY is not set  # CONFIG_XFS_POSIX_ACL is not set  # CONFIG_XFS_RT is not set -# CONFIG_GFS2_FS is not set +# CONFIG_XFS_DEBUG is not set  # CONFIG_OCFS2_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_ROMFS_FS is not set +# CONFIG_BTRFS_FS is not set +CONFIG_DNOTIFY=y  CONFIG_INOTIFY=y  CONFIG_INOTIFY_USER=y  # CONFIG_QUOTA is not set -CONFIG_DNOTIFY=y  # CONFIG_AUTOFS_FS is not set  CONFIG_AUTOFS4_FS=y  # CONFIG_FUSE_FS is not set @@ -759,16 +824,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"  CONFIG_PROC_FS=y  CONFIG_PROC_KCORE=y  CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y  CONFIG_SYSFS=y  CONFIG_TMPFS=y  # CONFIG_TMPFS_POSIX_ACL is not set  # CONFIG_HUGETLB_PAGE is not set -CONFIG_RAMFS=y  # CONFIG_CONFIGFS_FS is not set - -# -# Miscellaneous filesystems -# +CONFIG_MISC_FILESYSTEMS=y  # CONFIG_ADFS_FS is not set  # CONFIG_AFFS_FS is not set  # CONFIG_ECRYPT_FS is not set @@ -778,35 +840,34 @@ CONFIG_RAMFS=y  # CONFIG_BFS_FS is not set  # CONFIG_EFS_FS is not set  # CONFIG_CRAMFS is not set +# CONFIG_SQUASHFS 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  # CONFIG_SYSV_FS is not set  CONFIG_UFS_FS=m  # CONFIG_UFS_FS_WRITE is not set  # CONFIG_UFS_DEBUG is not set - -# -# Network File Systems -# +CONFIG_NETWORK_FILESYSTEMS=y  CONFIG_NFS_FS=y  CONFIG_NFS_V3=y  # CONFIG_NFS_V3_ACL is not set  CONFIG_NFS_V4=y -CONFIG_NFS_DIRECTIO=y +CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y  # CONFIG_NFSD_V3_ACL is not set  CONFIG_NFSD_V4=y -CONFIG_NFSD_TCP=y -CONFIG_ROOT_NFS=y  CONFIG_LOCKD=y  CONFIG_LOCKD_V4=y  CONFIG_EXPORTFS=m  CONFIG_NFS_COMMON=y  CONFIG_SUNRPC=y  CONFIG_SUNRPC_GSS=y -# CONFIG_SUNRPC_BIND34 is not set +# CONFIG_SUNRPC_REGISTER_V4 is not set  CONFIG_RPCSEC_GSS_KRB5=y  CONFIG_RPCSEC_GSS_SPKM3=m  CONFIG_SMB_FS=m @@ -815,6 +876,7 @@ CONFIG_SMB_NLS_REMOTE="cp437"  CONFIG_CIFS=m  # CONFIG_CIFS_STATS is not set  # CONFIG_CIFS_WEAK_PW_HASH is not set +# CONFIG_CIFS_UPCALL is not set  # CONFIG_CIFS_XATTR is not set  # CONFIG_CIFS_DEBUG2 is not set  # CONFIG_CIFS_EXPERIMENTAL is not set @@ -827,10 +889,6 @@ CONFIG_CIFS=m  #  # CONFIG_PARTITION_ADVANCED is not set  CONFIG_MSDOS_PARTITION=y - -# -# Native Language Support -#  CONFIG_NLS=y  CONFIG_NLS_DEFAULT="iso8859-1"  CONFIG_NLS_CODEPAGE_437=m @@ -871,33 +929,28 @@ CONFIG_NLS_ISO8859_15=m  CONFIG_NLS_KOI8_R=m  CONFIG_NLS_KOI8_U=m  CONFIG_NLS_UTF8=m - -# -# Distributed Lock Manager -#  # CONFIG_DLM is not set  # -# Profiling support -# -CONFIG_PROFILING=y -CONFIG_OPROFILE=m - -#  # Kernel hacking  #  # CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y  CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024  CONFIG_MAGIC_SYSRQ=y  # CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_DEBUG_FS is not set +CONFIG_DEBUG_FS=y  # CONFIG_HEADERS_CHECK is not set  CONFIG_DEBUG_KERNEL=y  # CONFIG_DEBUG_SHIRQ is not set  CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0  CONFIG_SCHED_DEBUG=y  # CONFIG_SCHEDSTATS is not set  # CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set  # CONFIG_DEBUG_SLAB is not set  # CONFIG_DEBUG_RT_MUTEXES is not set  # CONFIG_RT_MUTEX_TESTER is not set @@ -909,10 +962,32 @@ CONFIG_DEBUG_MUTEXES=y  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_FORCED_INLINING=y +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BOOT_PRINTK_DELAY is not set  # CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set  # CONFIG_FAULT_INJECTION is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_NOP_TRACER=y +CONFIG_RING_BUFFER=y +CONFIG_TRACING=y + +# +# Tracers +# +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_TRACE_BRANCH_PROFILING is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set  CONFIG_DEBUG_RODATA=y  # @@ -921,57 +996,113 @@ CONFIG_DEBUG_RODATA=y  CONFIG_KEYS=y  CONFIG_KEYS_DEBUG_PROC_KEYS=y  # CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set  CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set  CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_AEAD2=y  CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y  CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y  CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_NULL=m +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_TEST=m + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +CONFIG_CRYPTO_ECB=m +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +#  CONFIG_CRYPTO_HMAC=y  # CONFIG_CRYPTO_XCBC is not set -CONFIG_CRYPTO_NULL=m + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=m  CONFIG_CRYPTO_MD4=m  CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_MICHAEL_MIC=m +# 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=m  CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m -CONFIG_CRYPTO_WP512=m  CONFIG_CRYPTO_TGR192=m -# CONFIG_CRYPTO_GF128MUL is not set -CONFIG_CRYPTO_ECB=m -CONFIG_CRYPTO_CBC=y -# CONFIG_CRYPTO_PCBC is not set -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_XTS is not set -# CONFIG_CRYPTO_CRYPTD is not set -CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_FCRYPT is not set -CONFIG_CRYPTO_BLOWFISH=m -CONFIG_CRYPTO_TWOFISH=m -CONFIG_CRYPTO_TWOFISH_COMMON=m -CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_WP512=m + +# +# Ciphers +#  CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_BLOWFISH=m +# CONFIG_CRYPTO_CAMELLIA is not set  CONFIG_CRYPTO_CAST5=m  CONFIG_CRYPTO_CAST6=m -CONFIG_CRYPTO_TEA=m -CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set  CONFIG_CRYPTO_KHAZAD=m -CONFIG_CRYPTO_ANUBIS=m +# CONFIG_CRYPTO_SALSA20 is not set  # CONFIG_CRYPTO_SEED is not set +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_TWOFISH_COMMON=m + +# +# Compression +#  CONFIG_CRYPTO_DEFLATE=m -CONFIG_CRYPTO_MICHAEL_MIC=m -CONFIG_CRYPTO_CRC32C=m -# CONFIG_CRYPTO_CAMELLIA is not set -CONFIG_CRYPTO_TEST=m -# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set  # CONFIG_CRYPTO_HW is not set  #  # Library routines  #  CONFIG_BITREVERSE=y +CONFIG_GENERIC_FIND_LAST_BIT=y  CONFIG_CRC_CCITT=m  # CONFIG_CRC16 is not set -# CONFIG_CRC_ITU_T is not set +# CONFIG_CRC_T10DIF is not set +CONFIG_CRC_ITU_T=m  CONFIG_CRC32=y  # CONFIG_CRC7 is not set  CONFIG_LIBCRC32C=m diff --git a/arch/parisc/configs/a500_defconfig b/arch/parisc/configs/a500_defconfig index ddacc72e38f..f12e4b8349d 100644 --- a/arch/parisc/configs/a500_defconfig +++ b/arch/parisc/configs/a500_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.23 -# Fri Oct 12 21:12:44 2007 +# Linux kernel version: 2.6.29-rc8 +# Fri Mar 13 01:32:56 2009  #  CONFIG_PARISC=y  CONFIG_MMU=y @@ -34,18 +34,30 @@ CONFIG_SYSVIPC_SYSCTL=y  CONFIG_POSIX_MQUEUE=y  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set -# CONFIG_USER_NS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y  CONFIG_LOG_BUF_SHIFT=16 -# CONFIG_CPUSETS is not set +# CONFIG_GROUP_SCHED is not set +# CONFIG_CGROUPS is not set  CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y  # CONFIG_RELAY is not set +# CONFIG_NAMESPACES is not set  CONFIG_BLK_DEV_INITRD=y  CONFIG_INITRAMFS_SOURCE=""  # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y  CONFIG_EMBEDDED=y  CONFIG_SYSCTL_SYSCALL=y  CONFIG_KALLSYMS=y @@ -57,28 +69,40 @@ CONFIG_BUG=y  CONFIG_ELF_CORE=y  CONFIG_BASE_FULL=y  CONFIG_FUTEX=y -CONFIG_ANON_INODES=y  CONFIG_EPOLL=y  CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y  CONFIG_EVENTFD=y  CONFIG_SHMEM=y +CONFIG_AIO=y  CONFIG_VM_EVENT_COUNTERS=y +CONFIG_PCI_QUIRKS=y +CONFIG_COMPAT_BRK=y  CONFIG_SLAB=y  # CONFIG_SLUB is not set  # CONFIG_SLOB is not set +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# CONFIG_MARKERS is not set +CONFIG_OPROFILE=m +CONFIG_HAVE_OPROFILE=y +CONFIG_USE_GENERIC_SMP_HELPERS=y +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_SLABINFO=y  CONFIG_RT_MUTEXES=y -# CONFIG_TINY_SHMEM is not set  CONFIG_BASE_SMALL=0  CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set  CONFIG_MODULE_UNLOAD=y  CONFIG_MODULE_FORCE_UNLOAD=y  # CONFIG_MODVERSIONS is not set  # CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_KMOD=y +CONFIG_INIT_ALL_POSSIBLE=y  CONFIG_STOP_MACHINE=y  CONFIG_BLOCK=y  # CONFIG_BLK_DEV_IO_TRACE is not set  # CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_INTEGRITY is not set  CONFIG_BLOCK_COMPAT=y  # @@ -93,6 +117,7 @@ CONFIG_IOSCHED_CFQ=y  CONFIG_DEFAULT_CFQ=y  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="cfq" +# CONFIG_FREEZER is not set  #  # Processor type and features @@ -118,12 +143,12 @@ CONFIG_NODES_SHIFT=3  CONFIG_PREEMPT_NONE=y  # CONFIG_PREEMPT_VOLUNTARY is not set  # CONFIG_PREEMPT is not set -CONFIG_PREEMPT_BKL=y  # CONFIG_HZ_100 is not set  CONFIG_HZ_250=y  # CONFIG_HZ_300 is not set  # CONFIG_HZ_1000 is not set  CONFIG_HZ=250 +# CONFIG_SCHED_HRTICK is not set  CONFIG_SELECT_MEMORY_MODEL=y  # CONFIG_FLATMEM_MANUAL is not set  CONFIG_DISCONTIGMEM_MANUAL=y @@ -131,11 +156,12 @@ CONFIG_DISCONTIGMEM_MANUAL=y  CONFIG_DISCONTIGMEM=y  CONFIG_FLAT_NODE_MEM_MAP=y  CONFIG_NEED_MULTIPLE_NODES=y -# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_PAGEFLAGS_EXTENDED=y  CONFIG_SPLIT_PTLOCK_CPUS=4 -CONFIG_RESOURCES_64BIT=y +CONFIG_PHYS_ADDR_T_64BIT=y  CONFIG_ZONE_DMA_FLAG=0  CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y  CONFIG_COMPAT=y  CONFIG_NR_CPUS=8 @@ -145,14 +171,13 @@ CONFIG_NR_CPUS=8  # CONFIG_GSC is not set  CONFIG_PCI=y  # CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_PCI_LEGACY=y  # CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set  CONFIG_PCI_LBA=y  CONFIG_IOSAPIC=y  CONFIG_IOMMU_SBA=y - -# -# PCCARD (PCMCIA/CardBus) support -# +CONFIG_IOMMU_HELPER=y  CONFIG_PCCARD=m  # CONFIG_PCMCIA_DEBUG is not set  CONFIG_PCMCIA=m @@ -187,16 +212,15 @@ CONFIG_PDC_STABLE=y  # Executable file formats  #  CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_HAVE_AOUT is not set  # CONFIG_BINFMT_MISC is not set - -# -# Networking -#  CONFIG_NET=y  #  # Networking options  # +CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_PACKET=y  CONFIG_PACKET_MMAP=y  CONFIG_UNIX=y @@ -204,6 +228,8 @@ CONFIG_XFRM=y  CONFIG_XFRM_USER=m  # CONFIG_XFRM_SUB_POLICY is not set  # CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_IPCOMP=m  CONFIG_NET_KEY=m  # CONFIG_NET_KEY_MIGRATE is not set  CONFIG_INET=y @@ -234,7 +260,6 @@ CONFIG_INET_TCP_DIAG=y  CONFIG_TCP_CONG_CUBIC=y  CONFIG_DEFAULT_TCP_CONG="cubic"  # CONFIG_TCP_MD5SIG is not set -# CONFIG_IP_VS is not set  CONFIG_IPV6=m  # CONFIG_IPV6_PRIVACY is not set  # CONFIG_IPV6_ROUTER_PREF is not set @@ -250,66 +275,72 @@ CONFIG_INET6_XFRM_MODE_TUNNEL=m  CONFIG_INET6_XFRM_MODE_BEET=m  # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set  CONFIG_IPV6_SIT=m +CONFIG_IPV6_NDISC_NODETYPE=y  CONFIG_IPV6_TUNNEL=m  # CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set  # CONFIG_NETWORK_SECMARK is not set  CONFIG_NETFILTER=y  # CONFIG_NETFILTER_DEBUG is not set +CONFIG_NETFILTER_ADVANCED=y  #  # Core Netfilter Configuration  # -# CONFIG_NETFILTER_NETLINK is not set -# CONFIG_NF_CONNTRACK_ENABLED is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set  # CONFIG_NF_CONNTRACK is not set  CONFIG_NETFILTER_XTABLES=m  # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set  # CONFIG_NETFILTER_XT_TARGET_DSCP is not set  # CONFIG_NETFILTER_XT_TARGET_MARK is not set -# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set  # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set  # CONFIG_NETFILTER_XT_TARGET_TRACE is not set  # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set +# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set  # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set  # CONFIG_NETFILTER_XT_MATCH_DCCP is not set  # CONFIG_NETFILTER_XT_MATCH_DSCP is not set  # CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set  # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set  # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set  # CONFIG_NETFILTER_XT_MATCH_MAC is not set  # CONFIG_NETFILTER_XT_MATCH_MARK is not set -# CONFIG_NETFILTER_XT_MATCH_POLICY is not set  # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +# CONFIG_NETFILTER_XT_MATCH_POLICY is not set  # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set  # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set  # CONFIG_NETFILTER_XT_MATCH_REALM is not set +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set  # CONFIG_NETFILTER_XT_MATCH_SCTP is not set  # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set  # CONFIG_NETFILTER_XT_MATCH_STRING is not set  # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set  # CONFIG_NETFILTER_XT_MATCH_TIME is not set  # CONFIG_NETFILTER_XT_MATCH_U32 is not set -# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_IP_VS is not set  #  # IP: Netfilter Configuration  # +# CONFIG_NF_DEFRAG_IPV4 is not set  CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_IPRANGE=m -CONFIG_IP_NF_MATCH_TOS=m -CONFIG_IP_NF_MATCH_RECENT=m -CONFIG_IP_NF_MATCH_ECN=m +# CONFIG_IP_NF_MATCH_ADDRTYPE is not set  # CONFIG_IP_NF_MATCH_AH is not set +CONFIG_IP_NF_MATCH_ECN=m  CONFIG_IP_NF_MATCH_TTL=m -CONFIG_IP_NF_MATCH_OWNER=m -# CONFIG_IP_NF_MATCH_ADDRTYPE is not set  CONFIG_IP_NF_FILTER=m  CONFIG_IP_NF_TARGET_REJECT=m  CONFIG_IP_NF_TARGET_LOG=m  CONFIG_IP_NF_TARGET_ULOG=m  CONFIG_IP_NF_MANGLE=m -CONFIG_IP_NF_TARGET_TOS=m  CONFIG_IP_NF_TARGET_ECN=m  # CONFIG_IP_NF_TARGET_TTL is not set  CONFIG_IP_NF_RAW=m @@ -318,33 +349,30 @@ CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=m  # -# IPv6: Netfilter Configuration (EXPERIMENTAL) +# IPv6: Netfilter Configuration  #  # CONFIG_IP6_NF_QUEUE is not set  CONFIG_IP6_NF_IPTABLES=m -CONFIG_IP6_NF_MATCH_RT=m -CONFIG_IP6_NF_MATCH_OPTS=m +# CONFIG_IP6_NF_MATCH_AH is not set +# CONFIG_IP6_NF_MATCH_EUI64 is not set  CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_OPTS=m  CONFIG_IP6_NF_MATCH_HL=m -# CONFIG_IP6_NF_MATCH_OWNER is not set  CONFIG_IP6_NF_MATCH_IPV6HEADER=m -# CONFIG_IP6_NF_MATCH_AH is not set  # CONFIG_IP6_NF_MATCH_MH is not set -# CONFIG_IP6_NF_MATCH_EUI64 is not set -CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_MATCH_RT=m  CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_FILTER=m  CONFIG_IP6_NF_TARGET_REJECT=m  CONFIG_IP6_NF_MANGLE=m  # CONFIG_IP6_NF_TARGET_HL is not set  CONFIG_IP6_NF_RAW=m  CONFIG_IP_DCCP=m  CONFIG_INET_DCCP_DIAG=m -CONFIG_IP_DCCP_ACKVEC=y  #  # DCCP CCIDs Configuration (EXPERIMENTAL)  # -CONFIG_IP_DCCP_CCID2=m  # CONFIG_IP_DCCP_CCID2_DEBUG is not set  # CONFIG_IP_DCCP_CCID3 is not set @@ -356,6 +384,7 @@ CONFIG_IP_DCCP_CCID2=m  # CONFIG_TIPC is not set  # CONFIG_ATM is not set  # CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set  # CONFIG_VLAN_8021Q is not set  # CONFIG_DECNET is not set  CONFIG_LLC=m @@ -366,28 +395,26 @@ CONFIG_LLC2=m  # CONFIG_LAPB is not set  # CONFIG_ECONET is not set  # CONFIG_WAN_ROUTER is not set - -# -# QoS and/or fair queueing -#  # CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set  #  # Network testing  #  CONFIG_NET_PKTGEN=m  # CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set  # CONFIG_IRDA is not set  # CONFIG_BT is not set  # CONFIG_AF_RXRPC is not set - -# -# Wireless -# +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y  # CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y  # CONFIG_WIRELESS_EXT is not set +# CONFIG_LIB80211 is not set  # CONFIG_MAC80211 is not set -# CONFIG_IEEE80211 is not set +# CONFIG_WIMAX is not set  # CONFIG_RFKILL is not set  # CONFIG_NET_9P is not set @@ -402,6 +429,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_STANDALONE is not set  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE=""  # CONFIG_DEBUG_DRIVER is not set  # CONFIG_DEBUG_DEVRES is not set  # CONFIG_SYS_HYPERVISOR is not set @@ -421,14 +450,23 @@ CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_COUNT=16  CONFIG_BLK_DEV_RAM_SIZE=6144 -CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +# CONFIG_BLK_DEV_XIP 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=y  # CONFIG_PHANTOM is not set -# CONFIG_EEPROM_93CX6 is not set  # CONFIG_SGI_IOC4 is not set  # CONFIG_TIFM_CORE is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_93CX6 is not set +CONFIG_HAVE_IDE=y  # CONFIG_IDE is not set  # @@ -468,8 +506,10 @@ CONFIG_SCSI_SPI_ATTRS=y  CONFIG_SCSI_FC_ATTRS=m  CONFIG_SCSI_ISCSI_ATTRS=m  # CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set  CONFIG_SCSI_LOWLEVEL=y  # CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set  # CONFIG_BLK_DEV_3W_XXXX_RAID is not set  # CONFIG_SCSI_3W_9XXX is not set  # CONFIG_SCSI_ACARD is not set @@ -478,16 +518,21 @@ CONFIG_SCSI_LOWLEVEL=y  # CONFIG_SCSI_AIC7XXX_OLD is not set  # CONFIG_SCSI_AIC79XX is not set  # CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set  # CONFIG_SCSI_ARCMSR is not set  # CONFIG_MEGARAID_NEWGEN is not set  # CONFIG_MEGARAID_LEGACY is not set  # CONFIG_MEGARAID_SAS is not set  # CONFIG_SCSI_HPTIOP is not set +# CONFIG_LIBFC is not set +# CONFIG_FCOE is not set  # CONFIG_SCSI_DMX3191D is not set  # CONFIG_SCSI_FUTURE_DOMAIN is not set  # CONFIG_SCSI_IPS is not set  # CONFIG_SCSI_INITIO is not set  # CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_MVSAS is not set  # CONFIG_SCSI_STEX is not set  CONFIG_SCSI_SYM53C8XX_2=y  CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 @@ -503,9 +548,11 @@ CONFIG_SCSI_QLOGIC_1280=m  CONFIG_SCSI_DEBUG=m  # CONFIG_SCSI_SRP is not set  # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set +# CONFIG_SCSI_DH is not set  # CONFIG_ATA is not set  CONFIG_MD=y  CONFIG_BLK_DEV_MD=y +CONFIG_MD_AUTODETECT=y  CONFIG_MD_LINEAR=y  CONFIG_MD_RAID0=y  CONFIG_MD_RAID1=y @@ -514,10 +561,6 @@ CONFIG_MD_RAID1=y  # CONFIG_MD_MULTIPATH is not set  # CONFIG_MD_FAULTY is not set  # CONFIG_BLK_DEV_DM is not set - -# -# Fusion MPT device support -#  CONFIG_FUSION=y  CONFIG_FUSION_SPI=m  CONFIG_FUSION_FC=m @@ -529,20 +572,40 @@ CONFIG_FUSION_CTL=m  #  # IEEE 1394 (FireWire) support  # + +# +# Enable only one of the two stacks, unless you know what you are doing +#  # CONFIG_FIREWIRE is not set  # CONFIG_IEEE1394 is not set  # CONFIG_I2O is not set  CONFIG_NETDEVICES=y -# CONFIG_NETDEVICES_MULTIQUEUE is not set  CONFIG_DUMMY=m  CONFIG_BONDING=m  # CONFIG_MACVLAN is not set  # CONFIG_EQUALIZER is not set  CONFIG_TUN=m  # CONFIG_VETH is not set -# CONFIG_IP1000 is not set  # CONFIG_ARCNET is not set -# CONFIG_PHYLIB is not set +CONFIG_PHYLIB=m + +# +# MII PHY device drivers +# +# CONFIG_MARVELL_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_MDIO_BITBANG is not set  CONFIG_NET_ETHERNET=y  CONFIG_MII=m  # CONFIG_HAPPYMEAL is not set @@ -567,33 +630,38 @@ CONFIG_HP100=m  # CONFIG_IBM_NEW_EMAC_RGMII is not set  # CONFIG_IBM_NEW_EMAC_TAH is not set  # CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set  CONFIG_NET_PCI=y  CONFIG_PCNET32=m -# CONFIG_PCNET32_NAPI is not set  # CONFIG_AMD8111_ETH is not set  # CONFIG_ADAPTEC_STARFIRE is not set  # CONFIG_B44 is not set  # CONFIG_FORCEDETH is not set -# CONFIG_EEPRO100 is not set  CONFIG_E100=m  # CONFIG_FEALNX is not set  # CONFIG_NATSEMI is not set  # CONFIG_NE2K_PCI is not set  # CONFIG_8139CP is not set  # CONFIG_8139TOO is not set +# CONFIG_R6040 is not set  # CONFIG_SIS900 is not set  # CONFIG_EPIC100 is not set +# CONFIG_SMSC9420 is not set  # CONFIG_SUNDANCE is not set +# CONFIG_TLAN is not set  # CONFIG_VIA_RHINE is not set  # CONFIG_SC92031 is not set +# CONFIG_ATL2 is not set  CONFIG_NETDEV_1000=y  CONFIG_ACENIC=m  CONFIG_ACENIC_OMIT_TIGON_I=y  # CONFIG_DL2K is not set  CONFIG_E1000=m -CONFIG_E1000_NAPI=y -# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set  # CONFIG_E1000E is not set +# CONFIG_IP1000 is not set +# CONFIG_IGB is not set  # CONFIG_NS83820 is not set  # CONFIG_HAMACHI is not set  # CONFIG_YELLOWFIN is not set @@ -601,23 +669,31 @@ CONFIG_E1000_NAPI=y  # CONFIG_SIS190 is not set  # CONFIG_SKGE is not set  # CONFIG_SKY2 is not set -# CONFIG_SK98LIN is not set  # CONFIG_VIA_VELOCITY is not set  CONFIG_TIGON3=m  # CONFIG_BNX2 is not set  # CONFIG_QLA3XXX is not set  # CONFIG_ATL1 is not set +# CONFIG_ATL1E is not set +# CONFIG_ATL1C is not set +# CONFIG_JME is not set  CONFIG_NETDEV_10000=y  # CONFIG_CHELSIO_T1 is not set +CONFIG_CHELSIO_T3_DEPENDS=y  # CONFIG_CHELSIO_T3 is not set +# CONFIG_ENIC is not set  # CONFIG_IXGBE is not set  # CONFIG_IXGB is not set  # CONFIG_S2IO is not set  # CONFIG_MYRI10GE is not set  # CONFIG_NETXEN_NIC is not set  # CONFIG_NIU is not set +# CONFIG_MLX4_EN is not set  # CONFIG_MLX4_CORE is not set  # CONFIG_TEHUTI is not set +# CONFIG_BNX2X is not set +# CONFIG_QLGE is not set +# CONFIG_SFC is not set  # CONFIG_TR is not set  # @@ -625,6 +701,11 @@ CONFIG_NETDEV_10000=y  #  # CONFIG_WLAN_PRE80211 is not set  # CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +#  CONFIG_NET_PCMCIA=y  CONFIG_PCMCIA_3C589=m  CONFIG_PCMCIA_3C574=m @@ -650,7 +731,6 @@ CONFIG_PPP_BSDCOMP=m  # CONFIG_SLIP is not set  CONFIG_SLHC=m  # CONFIG_NET_FC is not set -# CONFIG_SHAPER is not set  # CONFIG_NETCONSOLE is not set  # CONFIG_NETPOLL is not set  # CONFIG_NET_POLL_CONTROLLER is not set @@ -669,7 +749,6 @@ CONFIG_INPUT=y  #  # CONFIG_INPUT_MOUSEDEV is not set  # CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_TSDEV is not set  # CONFIG_INPUT_EVDEV is not set  # CONFIG_INPUT_EVBUG is not set @@ -693,10 +772,13 @@ CONFIG_INPUT=y  # Character devices  #  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 +# CONFIG_NOZOMI is not set  #  # Serial drivers @@ -721,17 +803,12 @@ CONFIG_SERIAL_CORE=y  CONFIG_SERIAL_CORE_CONSOLE=y  # CONFIG_SERIAL_JSM is not set  CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set  # CONFIG_LEGACY_PTYS is not set  # CONFIG_IPMI_HANDLER is not set -# CONFIG_WATCHDOG is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=y -CONFIG_GEN_RTC_X=y  # CONFIG_R3964 is not set  # CONFIG_APPLICOM is not set -CONFIG_AGP=y -CONFIG_AGP_PARISC=y -# CONFIG_DRM is not set  #  # PCMCIA character devices @@ -739,51 +816,66 @@ CONFIG_AGP_PARISC=y  # CONFIG_SYNCLINK_CS is not set  # CONFIG_CARDMAN_4000 is not set  # CONFIG_CARDMAN_4040 is not set +# CONFIG_IPWIRELESS is not set  CONFIG_RAW_DRIVER=y  CONFIG_MAX_RAW_DEVS=256  # CONFIG_TCG_TPM is not set  CONFIG_DEVPORT=y  # CONFIG_I2C is not set - -# -# SPI support -#  # CONFIG_SPI is not set -# CONFIG_SPI_MASTER is not set  # CONFIG_W1 is not set  # 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 +CONFIG_SSB_POSSIBLE=y  #  # Sonics Silicon Backplane  # -CONFIG_SSB_POSSIBLE=y  # CONFIG_SSB is not set  #  # Multifunction device drivers  # +# CONFIG_MFD_CORE is not set  # CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_REGULATOR is not set  #  # Multimedia devices  # + +# +# Multimedia core support +#  # CONFIG_VIDEO_DEV is not set  # CONFIG_DVB_CORE is not set +# CONFIG_VIDEO_MEDIA is not set + +# +# Multimedia drivers +#  # CONFIG_DAB is not set  #  # Graphics support  # +CONFIG_AGP=y +CONFIG_AGP_PARISC=y +# CONFIG_DRM is not set +# CONFIG_VGASTATE is not set +# CONFIG_VIDEO_OUTPUT_CONTROL is not set +# CONFIG_FB is not set  # CONFIG_BACKLIGHT_LCD_SUPPORT is not set  #  # Display device support  #  # CONFIG_DISPLAY_SUPPORT is not set -# CONFIG_VGASTATE is not set -# CONFIG_VIDEO_OUTPUT_CONTROL is not set -# CONFIG_FB is not set  #  # Console display driver support @@ -792,50 +884,83 @@ CONFIG_DUMMY_CONSOLE=y  CONFIG_DUMMY_CONSOLE_COLUMNS=160  CONFIG_DUMMY_CONSOLE_ROWS=64  # CONFIG_STI_CONSOLE is not set - -# -# Sound -#  # CONFIG_SOUND is not set  CONFIG_HID_SUPPORT=y  CONFIG_HID=y  # CONFIG_HID_DEBUG is not set +# CONFIG_HIDRAW is not set +# CONFIG_HID_PID is not set + +# +# Special HID drivers +# +CONFIG_HID_COMPAT=y  CONFIG_USB_SUPPORT=y  CONFIG_USB_ARCH_HAS_HCD=y  CONFIG_USB_ARCH_HAS_OHCI=y  CONFIG_USB_ARCH_HAS_EHCI=y  # CONFIG_USB is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set  # -# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# Enable Host or Gadget support to see Inventra options  #  # -# USB Gadget Support +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;  #  # CONFIG_USB_GADGET is not set + +# +# OTG and related infrastructure +# +# CONFIG_UWB is not set  # CONFIG_MMC is not set +# CONFIG_MEMSTICK is not set  # CONFIG_NEW_LEDS is not set +# CONFIG_ACCESSIBILITY is not set  # CONFIG_INFINIBAND is not set -# CONFIG_RTC_CLASS is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set  # -# DMA Engine support +# RTC interfaces  # -# CONFIG_DMA_ENGINE is not set +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set  # -# DMA Clients +# SPI RTC drivers  #  # -# DMA Devices +# Platform RTC drivers  # +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set  # -# Userspace I/O +# on-CPU RTC drivers  # +CONFIG_RTC_DRV_PARISC=y +# CONFIG_DMADEVICES is not set  # CONFIG_UIO is not set +# CONFIG_STAGING is not set  #  # File systems @@ -845,7 +970,7 @@ CONFIG_EXT2_FS=y  # CONFIG_EXT2_FS_XIP is not set  CONFIG_EXT3_FS=y  # CONFIG_EXT3_FS_XATTR is not set -# CONFIG_EXT4DEV_FS is not set +# CONFIG_EXT4_FS is not set  CONFIG_JBD=y  # CONFIG_JBD_DEBUG is not set  # CONFIG_REISERFS_FS is not set @@ -855,19 +980,19 @@ CONFIG_JFS_FS=m  # CONFIG_JFS_DEBUG is not set  # CONFIG_JFS_STATISTICS is not set  CONFIG_FS_POSIX_ACL=y +CONFIG_FILE_LOCKING=y  CONFIG_XFS_FS=m  # CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_SECURITY is not set  # CONFIG_XFS_POSIX_ACL is not set  # CONFIG_XFS_RT is not set +# CONFIG_XFS_DEBUG is not set  # CONFIG_GFS2_FS is not set  # CONFIG_OCFS2_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_ROMFS_FS is not set +# CONFIG_BTRFS_FS is not set +CONFIG_DNOTIFY=y  CONFIG_INOTIFY=y  CONFIG_INOTIFY_USER=y  # CONFIG_QUOTA is not set -CONFIG_DNOTIFY=y  # CONFIG_AUTOFS_FS is not set  CONFIG_AUTOFS4_FS=y  # CONFIG_FUSE_FS is not set @@ -897,16 +1022,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"  CONFIG_PROC_FS=y  CONFIG_PROC_KCORE=y  CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y  CONFIG_SYSFS=y  CONFIG_TMPFS=y  # CONFIG_TMPFS_POSIX_ACL is not set  # CONFIG_HUGETLB_PAGE is not set -CONFIG_RAMFS=y  # CONFIG_CONFIGFS_FS is not set - -# -# Miscellaneous filesystems -# +CONFIG_MISC_FILESYSTEMS=y  # CONFIG_ADFS_FS is not set  # CONFIG_AFFS_FS is not set  # CONFIG_ECRYPT_FS is not set @@ -916,34 +1038,33 @@ CONFIG_RAMFS=y  # CONFIG_BFS_FS is not set  # CONFIG_EFS_FS is not set  # CONFIG_CRAMFS is not set +# CONFIG_SQUASHFS 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  # CONFIG_SYSV_FS is not set  CONFIG_UFS_FS=m  # CONFIG_UFS_FS_WRITE is not set  # CONFIG_UFS_DEBUG is not set - -# -# Network File Systems -# +CONFIG_NETWORK_FILESYSTEMS=y  CONFIG_NFS_FS=m  CONFIG_NFS_V3=y  # CONFIG_NFS_V3_ACL is not set  CONFIG_NFS_V4=y -CONFIG_NFS_DIRECTIO=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y  # CONFIG_NFSD_V3_ACL is not set  CONFIG_NFSD_V4=y -CONFIG_NFSD_TCP=y  CONFIG_LOCKD=m  CONFIG_LOCKD_V4=y  CONFIG_EXPORTFS=m  CONFIG_NFS_COMMON=y  CONFIG_SUNRPC=m  CONFIG_SUNRPC_GSS=m -# CONFIG_SUNRPC_BIND34 is not set +# CONFIG_SUNRPC_REGISTER_V4 is not set  CONFIG_RPCSEC_GSS_KRB5=m  CONFIG_RPCSEC_GSS_SPKM3=m  CONFIG_SMB_FS=m @@ -952,6 +1073,7 @@ CONFIG_SMB_NLS_REMOTE="cp437"  CONFIG_CIFS=m  # CONFIG_CIFS_STATS is not set  # CONFIG_CIFS_WEAK_PW_HASH is not set +# CONFIG_CIFS_UPCALL is not set  # CONFIG_CIFS_XATTR is not set  # CONFIG_CIFS_DEBUG2 is not set  # CONFIG_CIFS_EXPERIMENTAL is not set @@ -964,10 +1086,6 @@ CONFIG_CIFS=m  #  # CONFIG_PARTITION_ADVANCED is not set  CONFIG_MSDOS_PARTITION=y - -# -# Native Language Support -#  CONFIG_NLS=y  CONFIG_NLS_DEFAULT="iso8859-1"  CONFIG_NLS_CODEPAGE_437=m @@ -1008,33 +1126,28 @@ CONFIG_NLS_ISO8859_15=m  # CONFIG_NLS_KOI8_R is not set  # CONFIG_NLS_KOI8_U is not set  CONFIG_NLS_UTF8=m - -# -# Distributed Lock Manager -#  # CONFIG_DLM is not set  # -# Profiling support -# -CONFIG_PROFILING=y -CONFIG_OPROFILE=m - -#  # Kernel hacking  #  # CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y  CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=2048  CONFIG_MAGIC_SYSRQ=y  # CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_DEBUG_FS is not set +CONFIG_DEBUG_FS=y  CONFIG_HEADERS_CHECK=y  CONFIG_DEBUG_KERNEL=y  # CONFIG_DEBUG_SHIRQ is not set  CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0  CONFIG_SCHED_DEBUG=y  # CONFIG_SCHEDSTATS is not set  # CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set  # CONFIG_DEBUG_SLAB is not set  # CONFIG_DEBUG_RT_MUTEXES is not set  # CONFIG_RT_MUTEX_TESTER is not set @@ -1046,10 +1159,33 @@ CONFIG_SCHED_DEBUG=y  # CONFIG_DEBUG_BUGVERBOSE is not set  # CONFIG_DEBUG_INFO is not set  # CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +# CONFIG_DEBUG_MEMORY_INIT is not set  # CONFIG_DEBUG_LIST is not set -CONFIG_FORCED_INLINING=y +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BOOT_PRINTK_DELAY is not set  # CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set  # CONFIG_FAULT_INJECTION is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_NOP_TRACER=y +CONFIG_RING_BUFFER=y +CONFIG_TRACING=y + +# +# Tracers +# +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_TRACE_BRANCH_PROFILING is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_BUILD_DOCSRC is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set  # CONFIG_DEBUG_RODATA is not set  # @@ -1058,56 +1194,112 @@ CONFIG_FORCED_INLINING=y  CONFIG_KEYS=y  CONFIG_KEYS_DEBUG_PROC_KEYS=y  # CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set  CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set  CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_AEAD2=y  CONFIG_CRYPTO_BLKCIPHER=m +CONFIG_CRYPTO_BLKCIPHER2=y  CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y  CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_NULL=m +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_TEST=m + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=m +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +#  CONFIG_CRYPTO_HMAC=y  # CONFIG_CRYPTO_XCBC is not set -CONFIG_CRYPTO_NULL=m + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=m  # CONFIG_CRYPTO_MD4 is not set  CONFIG_CRYPTO_MD5=y +# 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=m  # CONFIG_CRYPTO_SHA256 is not set  # CONFIG_CRYPTO_SHA512 is not set -# CONFIG_CRYPTO_WP512 is not set  # CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_GF128MUL is not set -# CONFIG_CRYPTO_ECB is not set -CONFIG_CRYPTO_CBC=m -# CONFIG_CRYPTO_PCBC is not set -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_XTS is not set -# CONFIG_CRYPTO_CRYPTD is not set -CONFIG_CRYPTO_DES=m -# CONFIG_CRYPTO_FCRYPT is not set -CONFIG_CRYPTO_BLOWFISH=m -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +#  # CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARC4 is not set +CONFIG_CRYPTO_BLOWFISH=m +# CONFIG_CRYPTO_CAMELLIA is not set  CONFIG_CRYPTO_CAST5=m  # CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_ARC4 is not set +CONFIG_CRYPTO_DES=m +# CONFIG_CRYPTO_FCRYPT is not set  # CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_SALSA20 is not set  # CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +#  CONFIG_CRYPTO_DEFLATE=m -# CONFIG_CRYPTO_MICHAEL_MIC is not set -CONFIG_CRYPTO_CRC32C=m -# CONFIG_CRYPTO_CAMELLIA is not set -CONFIG_CRYPTO_TEST=m -# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set  # CONFIG_CRYPTO_HW is not set  #  # Library routines  #  CONFIG_BITREVERSE=y +CONFIG_GENERIC_FIND_LAST_BIT=y  CONFIG_CRC_CCITT=m  # CONFIG_CRC16 is not set -# CONFIG_CRC_ITU_T is not set +# CONFIG_CRC_T10DIF is not set +CONFIG_CRC_ITU_T=m  CONFIG_CRC32=y  # CONFIG_CRC7 is not set  CONFIG_LIBCRC32C=m diff --git a/arch/parisc/configs/b180_defconfig b/arch/parisc/configs/b180_defconfig index 1bf22c9a461..98bb05ee6e8 100644 --- a/arch/parisc/configs/b180_defconfig +++ b/arch/parisc/configs/b180_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.23 -# Fri Oct 12 21:16:46 2007 +# Linux kernel version: 2.6.29-rc8 +# Fri Mar 13 01:32:57 2009  #  CONFIG_PARISC=y  CONFIG_MMU=y @@ -33,13 +33,29 @@ CONFIG_SYSVIPC_SYSCTL=y  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y  CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_CGROUPS is not set  CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y  # CONFIG_RELAY is not set +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set  # CONFIG_BLK_DEV_INITRD is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y  CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y  # CONFIG_EMBEDDED is not set  CONFIG_SYSCTL_SYSCALL=y  CONFIG_KALLSYMS=y @@ -51,27 +67,34 @@ CONFIG_BUG=y  CONFIG_ELF_CORE=y  CONFIG_BASE_FULL=y  CONFIG_FUTEX=y -CONFIG_ANON_INODES=y  CONFIG_EPOLL=y  CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y  CONFIG_EVENTFD=y  CONFIG_SHMEM=y +CONFIG_AIO=y  CONFIG_VM_EVENT_COUNTERS=y +CONFIG_PCI_QUIRKS=y +CONFIG_COMPAT_BRK=y  CONFIG_SLAB=y  # CONFIG_SLUB is not set  # CONFIG_SLOB is not set +# CONFIG_PROFILING is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_SLABINFO=y  CONFIG_RT_MUTEXES=y -# CONFIG_TINY_SHMEM is not set  CONFIG_BASE_SMALL=0  CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set  # CONFIG_MODULE_UNLOAD is not set  CONFIG_MODVERSIONS=y  # CONFIG_MODULE_SRCVERSION_ALL is not set -# CONFIG_KMOD is not set +CONFIG_INIT_ALL_POSSIBLE=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_INTEGRITY is not set  #  # IO Schedulers @@ -85,6 +108,7 @@ CONFIG_IOSCHED_CFQ=y  CONFIG_DEFAULT_CFQ=y  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="cfq" +# CONFIG_FREEZER is not set  #  # Processor type and features @@ -108,13 +132,15 @@ CONFIG_HZ_250=y  # CONFIG_HZ_300 is not set  # CONFIG_HZ_1000 is not set  CONFIG_HZ=250 +# CONFIG_SCHED_HRTICK is not set  CONFIG_FLATMEM=y  CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_PAGEFLAGS_EXTENDED=y  CONFIG_SPLIT_PTLOCK_CPUS=4096 -# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set  CONFIG_ZONE_DMA_FLAG=0  CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y  # CONFIG_HPUX is not set  # @@ -130,14 +156,14 @@ CONFIG_EISA_NAMES=y  CONFIG_ISA=y  CONFIG_PCI=y  # CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_PCI_LEGACY=y  # CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set  CONFIG_GSC_DINO=y  # CONFIG_PCI_LBA is not set - -# -# PCCARD (PCMCIA/CardBus) support -# +CONFIG_IOMMU_HELPER=y  # CONFIG_PCCARD is not set +# CONFIG_HOTPLUG_PCI is not set  #  # PA-RISC specific drivers @@ -151,16 +177,15 @@ CONFIG_PDC_STABLE=y  # Executable file formats  #  CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_HAVE_AOUT is not set  # CONFIG_BINFMT_MISC is not set - -# -# Networking -#  CONFIG_NET=y  #  # Networking options  # +CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_PACKET=y  CONFIG_PACKET_MMAP=y  CONFIG_UNIX=y @@ -205,36 +230,37 @@ CONFIG_INET6_XFRM_MODE_TRANSPORT=y  CONFIG_INET6_XFRM_MODE_TUNNEL=y  CONFIG_INET6_XFRM_MODE_BEET=y  CONFIG_IPV6_SIT=y +CONFIG_IPV6_NDISC_NODETYPE=y  # CONFIG_IPV6_TUNNEL is not set  # CONFIG_NETLABEL is not set  # CONFIG_NETWORK_SECMARK is not set  # CONFIG_NETFILTER is not set +# CONFIG_ATM is not set  # CONFIG_BRIDGE is not set  # CONFIG_VLAN_8021Q is not set  # CONFIG_DECNET is not set  # CONFIG_LLC2 is not set  # CONFIG_IPX is not set  # CONFIG_ATALK is not set - -# -# QoS and/or fair queueing -#  # CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set  #  # Network testing  #  # CONFIG_NET_PKTGEN is not set  # CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set  # CONFIG_IRDA is not set  # CONFIG_BT is not set - -# -# Wireless -# +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y  # CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y  # CONFIG_WIRELESS_EXT is not set -# CONFIG_IEEE80211 is not set +# CONFIG_LIB80211 is not set +# CONFIG_MAC80211 is not set +# CONFIG_WIMAX is not set  # CONFIG_RFKILL is not set  # @@ -247,7 +273,9 @@ CONFIG_IPV6_SIT=y  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  CONFIG_STANDALONE=y  # CONFIG_PREVENT_FIRMWARE_BUILD is not set -# CONFIG_FW_LOADER is not set +CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE=""  # CONFIG_DEBUG_DRIVER is not set  # CONFIG_DEBUG_DEVRES is not set  # CONFIG_SYS_HYPERVISOR is not set @@ -275,10 +303,18 @@ CONFIG_BLK_DEV_CRYPTOLOOP=y  CONFIG_CDROM_PKTCDVD=m  CONFIG_CDROM_PKTCDVD_BUFFERS=8  CONFIG_ATA_OVER_ETH=y +# CONFIG_BLK_DEV_HD is not set  CONFIG_MISC_DEVICES=y  # CONFIG_PHANTOM is not set -# CONFIG_EEPROM_93CX6 is not set  # CONFIG_SGI_IOC4 is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_93CX6 is not set +CONFIG_HAVE_IDE=y  # CONFIG_IDE is not set  # @@ -317,8 +353,10 @@ CONFIG_SCSI_SPI_ATTRS=y  # CONFIG_SCSI_FC_ATTRS is not set  # CONFIG_SCSI_ISCSI_ATTRS is not set  # CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set  CONFIG_SCSI_LOWLEVEL=y  # CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set  # CONFIG_BLK_DEV_3W_XXXX_RAID is not set  # CONFIG_SCSI_3W_9XXX is not set  # CONFIG_SCSI_ACARD is not set @@ -330,12 +368,15 @@ CONFIG_SCSI_LOWLEVEL=y  # CONFIG_SCSI_AIC79XX is not set  # CONFIG_SCSI_AIC94XX is not set  # CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set  # CONFIG_SCSI_IN2000 is not set  # CONFIG_SCSI_ARCMSR is not set  # CONFIG_MEGARAID_NEWGEN is not set  # CONFIG_MEGARAID_LEGACY is not set  # CONFIG_MEGARAID_SAS is not set  # CONFIG_SCSI_HPTIOP is not set +# CONFIG_LIBFC is not set +# CONFIG_FCOE is not set  # CONFIG_SCSI_DMX3191D is not set  # CONFIG_SCSI_DTC3280 is not set  # CONFIG_SCSI_FUTURE_DOMAIN is not set @@ -346,6 +387,7 @@ CONFIG_SCSI_LOWLEVEL=y  # CONFIG_SCSI_INIA100 is not set  # CONFIG_SCSI_PPA is not set  # CONFIG_SCSI_IMM is not set +# CONFIG_SCSI_MVSAS is not set  # CONFIG_SCSI_NCR53C406A is not set  CONFIG_SCSI_LASI700=y  CONFIG_53C700_LE_ON_BE=y @@ -360,7 +402,6 @@ CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8  CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32  CONFIG_SCSI_NCR53C8XX_SYNC=40  # CONFIG_SCSI_PAS16 is not set -# CONFIG_SCSI_PSI240I is not set  # CONFIG_SCSI_QLOGIC_FAS is not set  # CONFIG_SCSI_QLOGIC_1280 is not set  # CONFIG_SCSI_QLA_FC is not set @@ -373,9 +414,11 @@ CONFIG_SCSI_NCR53C8XX_SYNC=40  # CONFIG_SCSI_NSP32 is not set  # CONFIG_SCSI_DEBUG is not set  # CONFIG_SCSI_SRP is not set +# CONFIG_SCSI_DH is not set  # CONFIG_ATA is not set  CONFIG_MD=y  CONFIG_BLK_DEV_MD=y +CONFIG_MD_AUTODETECT=y  CONFIG_MD_LINEAR=y  CONFIG_MD_RAID0=y  CONFIG_MD_RAID1=y @@ -383,26 +426,18 @@ CONFIG_MD_RAID1=y  # CONFIG_MD_MULTIPATH is not set  # CONFIG_MD_FAULTY is not set  # CONFIG_BLK_DEV_DM is not set - -# -# Fusion MPT device support -#  # CONFIG_FUSION is not set -# CONFIG_FUSION_SPI is not set -# CONFIG_FUSION_FC is not set -# CONFIG_FUSION_SAS is not set  #  # IEEE 1394 (FireWire) support  #  # -# An alternative FireWire stack is available with EXPERIMENTAL=y +# A new alternative FireWire stack is available with EXPERIMENTAL=y  #  # CONFIG_IEEE1394 is not set  # CONFIG_I2O is not set  CONFIG_NETDEVICES=y -# CONFIG_NETDEVICES_MULTIQUEUE is not set  # CONFIG_DUMMY is not set  # CONFIG_BONDING is not set  # CONFIG_EQUALIZER is not set @@ -434,36 +469,49 @@ CONFIG_TULIP=y  # CONFIG_IBM_NEW_EMAC_RGMII is not set  # CONFIG_IBM_NEW_EMAC_TAH is not set  # CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set  # CONFIG_NET_PCI is not set  # CONFIG_B44 is not set +# CONFIG_CS89x0 is not set  # CONFIG_NET_POCKET is not set +# CONFIG_ATL2 is not set  CONFIG_NETDEV_1000=y  # CONFIG_ACENIC is not set  # CONFIG_DL2K is not set  # CONFIG_E1000 is not set  # CONFIG_E1000E is not set +# CONFIG_IGB is not set  # CONFIG_NS83820 is not set  # CONFIG_HAMACHI is not set  # CONFIG_R8169 is not set  # CONFIG_SIS190 is not set  # CONFIG_SKGE is not set  # CONFIG_SKY2 is not set -# CONFIG_SK98LIN is not set  # CONFIG_VIA_VELOCITY is not set  # CONFIG_TIGON3 is not set  # CONFIG_BNX2 is not set  # CONFIG_QLA3XXX is not set +# CONFIG_ATL1 is not set +# CONFIG_JME is not set  CONFIG_NETDEV_10000=y  # CONFIG_CHELSIO_T1 is not set +CONFIG_CHELSIO_T3_DEPENDS=y  # CONFIG_CHELSIO_T3 is not set +# CONFIG_ENIC is not set  # CONFIG_IXGBE is not set  # CONFIG_IXGB is not set  # CONFIG_S2IO is not set  # CONFIG_MYRI10GE is not set  # CONFIG_NETXEN_NIC is not set  # CONFIG_NIU is not set +# CONFIG_MLX4_EN is not set  # CONFIG_MLX4_CORE is not set  # CONFIG_TEHUTI is not set +# CONFIG_BNX2X is not set +# CONFIG_QLGE is not set +# CONFIG_SFC is not set  # CONFIG_TR is not set  # @@ -471,6 +519,11 @@ CONFIG_NETDEV_10000=y  #  # CONFIG_WLAN_PRE80211 is not set  # CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +#  # CONFIG_WAN is not set  # CONFIG_FDDI is not set  # CONFIG_PLIP is not set @@ -503,7 +556,6 @@ CONFIG_INPUT_MOUSEDEV_PSAUX=y  CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024  CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768  # CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_TSDEV is not set  CONFIG_INPUT_EVDEV=y  # CONFIG_INPUT_EVBUG is not set @@ -526,11 +578,12 @@ CONFIG_MOUSE_PS2=y  CONFIG_MOUSE_PS2_ALPS=y  CONFIG_MOUSE_PS2_LOGIPS2PP=y  CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_LIFEBOOK=y  CONFIG_MOUSE_PS2_TRACKPOINT=y +# CONFIG_MOUSE_PS2_ELANTECH is not set  # CONFIG_MOUSE_PS2_TOUCHKIT is not set  # CONFIG_MOUSE_SERIAL is not set  # CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_BCM5974 is not set  # CONFIG_MOUSE_INPORT is not set  # CONFIG_MOUSE_LOGIBM is not set  # CONFIG_MOUSE_PC110PAD is not set @@ -564,9 +617,11 @@ CONFIG_SERIO_LIBPS2=y  # Character devices  #  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  # @@ -598,75 +653,79 @@ CONFIG_SERIAL_CORE=y  CONFIG_SERIAL_CORE_CONSOLE=y  # CONFIG_SERIAL_JSM is not set  CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set  CONFIG_LEGACY_PTYS=y  CONFIG_LEGACY_PTY_COUNT=256  CONFIG_PRINTER=y  # CONFIG_LP_CONSOLE is not set  # CONFIG_PPDEV is not set -# CONFIG_TIPAR is not set  # CONFIG_IPMI_HANDLER is not set -# CONFIG_WATCHDOG is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=y -# CONFIG_GEN_RTC_X is not set  # CONFIG_DTLK is not set  # CONFIG_R3964 is not set  # CONFIG_APPLICOM is not set -# CONFIG_AGP is not set -# CONFIG_DRM is not set  # CONFIG_RAW_DRIVER is not set  CONFIG_DEVPORT=y  # CONFIG_I2C is not set - -# -# SPI support -#  # CONFIG_SPI is not set -# CONFIG_SPI_MASTER is not set  # CONFIG_W1 is not set  # 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 +CONFIG_SSB_POSSIBLE=y  #  # Sonics Silicon Backplane  # -CONFIG_SSB_POSSIBLE=y  # CONFIG_SSB is not set  #  # Multifunction device drivers  # +# CONFIG_MFD_CORE is not set  # CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_REGULATOR is not set  #  # Multimedia devices  # + +# +# Multimedia core support +#  # CONFIG_VIDEO_DEV is not set  # CONFIG_DVB_CORE is not set -# CONFIG_DAB is not set +# CONFIG_VIDEO_MEDIA is not set  # -# Graphics support +# Multimedia drivers  # -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_DAB is not set  # -# Display device support +# Graphics support  # -# CONFIG_DISPLAY_SUPPORT is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set  # CONFIG_VGASTATE is not set  CONFIG_VIDEO_OUTPUT_CONTROL=m  CONFIG_FB=y  # CONFIG_FIRMWARE_EDID is not set  # CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT 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 is not set  # CONFIG_FB_SYS_FOPS is not set -CONFIG_FB_DEFERRED_IO=y  # CONFIG_FB_SVGALIB is not set  # CONFIG_FB_MACMODES is not set  # CONFIG_FB_BACKLIGHT is not set @@ -691,6 +750,7 @@ CONFIG_FB_STI=y  # CONFIG_FB_ATY is not set  # CONFIG_FB_S3 is not set  # CONFIG_FB_SIS is not set +# CONFIG_FB_VIA is not set  # CONFIG_FB_NEOMAGIC is not set  # CONFIG_FB_KYRO is not set  # CONFIG_FB_3DFX is not set @@ -698,7 +758,16 @@ CONFIG_FB_STI=y  # CONFIG_FB_VT8623 is not set  # CONFIG_FB_TRIDENT is not set  # CONFIG_FB_ARK is not set +# CONFIG_FB_CARMINE is not set  # CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set  #  # Console display driver support @@ -718,15 +787,8 @@ CONFIG_LOGO_LINUX_MONO=y  CONFIG_LOGO_LINUX_VGA16=y  CONFIG_LOGO_LINUX_CLUT224=y  CONFIG_LOGO_PARISC_CLUT224=y - -# -# Sound -#  CONFIG_SOUND=y - -# -# Advanced Linux Sound Architecture -# +CONFIG_SOUND_OSS_CORE=y  CONFIG_SND=y  CONFIG_SND_TIMER=y  CONFIG_SND_PCM=y @@ -742,10 +804,7 @@ CONFIG_SND_SUPPORT_OLD_API=y  CONFIG_SND_VERBOSE_PROCFS=y  # CONFIG_SND_VERBOSE_PRINTK is not set  # CONFIG_SND_DEBUG is not set - -# -# Generic devices -# +CONFIG_SND_DRIVERS=y  # CONFIG_SND_DUMMY is not set  # CONFIG_SND_VIRMIDI is not set  # CONFIG_SND_MTPAV is not set @@ -753,10 +812,7 @@ CONFIG_SND_VERBOSE_PROCFS=y  # CONFIG_SND_SERIAL_U16550 is not set  # CONFIG_SND_MPU401 is not set  # CONFIG_SND_PORTMAN2X4 is not set - -# -# PCI devices -# +CONFIG_SND_PCI=y  # CONFIG_SND_AD1889 is not set  # CONFIG_SND_ALS300 is not set  # CONFIG_SND_ALI5451 is not set @@ -765,9 +821,11 @@ CONFIG_SND_VERBOSE_PROCFS=y  # CONFIG_SND_AU8810 is not set  # CONFIG_SND_AU8820 is not set  # CONFIG_SND_AU8830 is not set +# CONFIG_SND_AW2 is not set  # CONFIG_SND_BT87X is not set  # CONFIG_SND_CA0106 is not set  # CONFIG_SND_CMIPCI is not set +# CONFIG_SND_OXYGEN is not set  # CONFIG_SND_CS4281 is not set  # CONFIG_SND_CS46XX is not set  # CONFIG_SND_DARLA20 is not set @@ -792,6 +850,7 @@ CONFIG_SND_VERBOSE_PROCFS=y  # CONFIG_SND_HDA_INTEL is not set  # CONFIG_SND_HDSP is not set  # CONFIG_SND_HDSPM is not set +# CONFIG_SND_HIFIER is not set  # CONFIG_SND_ICE1712 is not set  # CONFIG_SND_ICE1724 is not set  # CONFIG_SND_INTEL8X0 is not set @@ -809,30 +868,23 @@ CONFIG_SND_VERBOSE_PROCFS=y  # CONFIG_SND_TRIDENT is not set  # CONFIG_SND_VIA82XX is not set  # CONFIG_SND_VIA82XX_MODEM is not set +# CONFIG_SND_VIRTUOSO is not set  # CONFIG_SND_VX222 is not set  # CONFIG_SND_YMFPCI is not set - -# -# GSC devices -# +CONFIG_SND_GSC=y  CONFIG_SND_HARMONY=y - -# -# System on Chip audio support -#  # CONFIG_SND_SOC is not set - -# -# SoC Audio support for SuperH -# - -# -# Open Sound System -#  # CONFIG_SOUND_PRIME is not set  CONFIG_HID_SUPPORT=y  CONFIG_HID=y  CONFIG_HID_DEBUG=y +# CONFIG_HIDRAW is not set +# CONFIG_HID_PID is not set + +# +# Special HID drivers +# +CONFIG_HID_COMPAT=y  CONFIG_USB_SUPPORT=y  CONFIG_USB_ARCH_HAS_HCD=y  CONFIG_USB_ARCH_HAS_OHCI=y @@ -840,36 +892,63 @@ CONFIG_USB_ARCH_HAS_EHCI=y  # CONFIG_USB is not set  # -# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# Enable Host or Gadget support to see Inventra options  #  # -# USB Gadget Support +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;  #  # CONFIG_USB_GADGET is not set + +# +# OTG and related infrastructure +#  # CONFIG_MMC is not set +# CONFIG_MEMSTICK is not set  # CONFIG_NEW_LEDS is not set +# CONFIG_ACCESSIBILITY is not set  # CONFIG_INFINIBAND is not set -# CONFIG_RTC_CLASS is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set  # -# DMA Engine support +# RTC interfaces  # -# CONFIG_DMA_ENGINE is not set +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set  # -# DMA Clients +# SPI RTC drivers  #  # -# DMA Devices +# Platform RTC drivers  # -# CONFIG_AUXDISPLAY is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set  # -# Userspace I/O +# on-CPU RTC drivers  # +CONFIG_RTC_DRV_PARISC=y +# CONFIG_DMADEVICES is not set +# CONFIG_AUXDISPLAY is not set  # CONFIG_UIO is not set +# CONFIG_STAGING is not set  #  # File systems @@ -879,19 +958,18 @@ CONFIG_EXT2_FS=y  # CONFIG_EXT2_FS_XIP is not set  CONFIG_EXT3_FS=y  # CONFIG_EXT3_FS_XATTR is not set +# CONFIG_EXT4_FS is not set  CONFIG_JBD=y -# CONFIG_JBD_DEBUG is not set  # CONFIG_REISERFS_FS is not set  # CONFIG_JFS_FS is not set  # CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y  # CONFIG_XFS_FS is not set  # CONFIG_OCFS2_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_ROMFS_FS is not set +CONFIG_DNOTIFY=y  CONFIG_INOTIFY=y  CONFIG_INOTIFY_USER=y  # CONFIG_QUOTA is not set -CONFIG_DNOTIFY=y  # CONFIG_AUTOFS_FS is not set  CONFIG_AUTOFS4_FS=y  # CONFIG_FUSE_FS is not set @@ -917,35 +995,32 @@ CONFIG_JOLIET=y  CONFIG_PROC_FS=y  CONFIG_PROC_KCORE=y  CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y  CONFIG_SYSFS=y  CONFIG_TMPFS=y  # CONFIG_TMPFS_POSIX_ACL is not set  # CONFIG_HUGETLB_PAGE is not set -CONFIG_RAMFS=y - -# -# Miscellaneous filesystems -# +# CONFIG_CONFIGFS_FS is not set +CONFIG_MISC_FILESYSTEMS=y  # CONFIG_HFSPLUS_FS is not set  # CONFIG_CRAMFS is not set +# CONFIG_SQUASHFS 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  # CONFIG_SYSV_FS is not set  # CONFIG_UFS_FS is not set - -# -# Network File Systems -# +CONFIG_NETWORK_FILESYSTEMS=y  CONFIG_NFS_FS=y  CONFIG_NFS_V3=y  # CONFIG_NFS_V3_ACL is not set -# CONFIG_NFS_DIRECTIO is not set +CONFIG_ROOT_NFS=y  CONFIG_NFSD=y  CONFIG_NFSD_V3=y  # CONFIG_NFSD_V3_ACL is not set -CONFIG_NFSD_TCP=y -CONFIG_ROOT_NFS=y  CONFIG_LOCKD=y  CONFIG_LOCKD_V4=y  CONFIG_EXPORTFS=y @@ -962,10 +1037,6 @@ CONFIG_SMB_FS=y  #  # CONFIG_PARTITION_ADVANCED is not set  CONFIG_MSDOS_PARTITION=y - -# -# Native Language Support -#  CONFIG_NLS=y  CONFIG_NLS_DEFAULT="iso8859-1"  CONFIG_NLS_CODEPAGE_437=m @@ -1011,7 +1082,9 @@ CONFIG_NLS_UTF8=m  # Kernel hacking  #  # CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y  CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024  CONFIG_MAGIC_SYSRQ=y  # CONFIG_UNUSED_SYMBOLS is not set  # CONFIG_DEBUG_FS is not set @@ -1019,9 +1092,12 @@ CONFIG_HEADERS_CHECK=y  CONFIG_DEBUG_KERNEL=y  # CONFIG_DEBUG_SHIRQ is not set  CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0  CONFIG_SCHED_DEBUG=y  # CONFIG_SCHEDSTATS is not set  # CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set  # CONFIG_DEBUG_SLAB is not set  # CONFIG_DEBUG_RT_MUTEXES is not set  # CONFIG_RT_MUTEX_TESTER is not set @@ -1033,10 +1109,29 @@ CONFIG_SCHED_DEBUG=y  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_FORCED_INLINING=y +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BOOT_PRINTK_DELAY is not set  # CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set  # CONFIG_FAULT_INJECTION is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set + +# +# Tracers +# +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_TRACE_BRANCH_PROFILING is not set +# CONFIG_BUILD_DOCSRC is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set  # CONFIG_DEBUG_RODATA is not set  # @@ -1044,52 +1139,108 @@ CONFIG_FORCED_INLINING=y  #  # CONFIG_KEYS is not set  CONFIG_SECURITY=y +# CONFIG_SECURITYFS is not set  # CONFIG_SECURITY_NETWORK is not set -CONFIG_SECURITY_CAPABILITIES=y +# CONFIG_SECURITY_PATH is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0  CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set  CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD2=y  CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y  CONFIG_CRYPTO_MANAGER=y -# CONFIG_CRYPTO_HMAC is not set +CONFIG_CRYPTO_MANAGER2=y  # CONFIG_CRYPTO_NULL is not set +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_TEST is not set + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_PCBC is not set + +# +# Hash modes +# +# CONFIG_CRYPTO_HMAC is not set + +# +# Digest +# +# CONFIG_CRYPTO_CRC32C is not set  # 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 -# CONFIG_CRYPTO_WP512 is not set  # CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_ECB is not set -CONFIG_CRYPTO_CBC=y -# CONFIG_CRYPTO_PCBC is not set -# CONFIG_CRYPTO_CRYPTD is not set -# CONFIG_CRYPTO_DES is not set -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_BLOWFISH is not set -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +#  # CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARC4 is not set +# CONFIG_CRYPTO_BLOWFISH is not set +# CONFIG_CRYPTO_CAMELLIA is not set  # CONFIG_CRYPTO_CAST5 is not set  # CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_ARC4 is not set +# CONFIG_CRYPTO_DES is not set +# CONFIG_CRYPTO_FCRYPT is not set  # CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_ANUBIS is not set  # CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +#  # CONFIG_CRYPTO_DEFLATE is not set -# CONFIG_CRYPTO_MICHAEL_MIC is not set -# CONFIG_CRYPTO_CRC32C is not set -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_TEST is not set -# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set  CONFIG_CRYPTO_HW=y +# CONFIG_CRYPTO_DEV_HIFN_795X is not set  #  # Library routines  #  CONFIG_BITREVERSE=y +CONFIG_GENERIC_FIND_LAST_BIT=y  # CONFIG_CRC_CCITT is not set  # CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set  # CONFIG_CRC_ITU_T is not set  CONFIG_CRC32=y  # CONFIG_CRC7 is not set diff --git a/arch/parisc/configs/c3000_defconfig b/arch/parisc/configs/c3000_defconfig index c6def3c1d20..0aa8014f758 100644 --- a/arch/parisc/configs/c3000_defconfig +++ b/arch/parisc/configs/c3000_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.23 -# Fri Oct 12 21:24:00 2007 +# Linux kernel version: 2.6.29-rc8 +# Fri Mar 13 01:32:58 2009  #  CONFIG_PARISC=y  CONFIG_MMU=y @@ -33,16 +33,29 @@ CONFIG_SYSVIPC_SYSCTL=y  # CONFIG_POSIX_MQUEUE is not set  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set -# CONFIG_USER_NS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y  CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_GROUP_SCHED is not set +# CONFIG_CGROUPS is not set  CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y  # CONFIG_RELAY is not set +# CONFIG_NAMESPACES is not set  # CONFIG_BLK_DEV_INITRD is not set  # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y  CONFIG_EMBEDDED=y  CONFIG_SYSCTL_SYSCALL=y  CONFIG_KALLSYMS=y @@ -54,29 +67,39 @@ CONFIG_BUG=y  CONFIG_ELF_CORE=y  CONFIG_BASE_FULL=y  CONFIG_FUTEX=y -CONFIG_ANON_INODES=y  CONFIG_EPOLL=y  CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y  CONFIG_EVENTFD=y  CONFIG_SHMEM=y +CONFIG_AIO=y  CONFIG_VM_EVENT_COUNTERS=y +CONFIG_PCI_QUIRKS=y +CONFIG_COMPAT_BRK=y  CONFIG_SLAB=y  # CONFIG_SLUB is not set  # CONFIG_SLOB is not set +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# CONFIG_MARKERS is not set +CONFIG_OPROFILE=m +CONFIG_HAVE_OPROFILE=y +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_SLABINFO=y  CONFIG_RT_MUTEXES=y -# CONFIG_TINY_SHMEM is not set  CONFIG_BASE_SMALL=0  CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set  CONFIG_MODULE_UNLOAD=y  CONFIG_MODULE_FORCE_UNLOAD=y  # CONFIG_MODVERSIONS is not set  # CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_KMOD=y +CONFIG_INIT_ALL_POSSIBLE=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 @@ -90,6 +113,7 @@ CONFIG_DEFAULT_AS=y  # CONFIG_DEFAULT_CFQ is not set  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="anticipatory" +# CONFIG_FREEZER is not set  #  # Processor type and features @@ -115,17 +139,19 @@ CONFIG_HZ_250=y  # CONFIG_HZ_300 is not set  # CONFIG_HZ_1000 is not set  CONFIG_HZ=250 +# CONFIG_SCHED_HRTICK is not set  CONFIG_SELECT_MEMORY_MODEL=y  CONFIG_FLATMEM_MANUAL=y  # CONFIG_DISCONTIGMEM_MANUAL is not set  # CONFIG_SPARSEMEM_MANUAL is not set  CONFIG_FLATMEM=y  CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_PAGEFLAGS_EXTENDED=y  CONFIG_SPLIT_PTLOCK_CPUS=4 -# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set  CONFIG_ZONE_DMA_FLAG=0  CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y  # CONFIG_HPUX is not set  # @@ -134,14 +160,13 @@ CONFIG_VIRT_TO_BUS=y  # CONFIG_GSC is not set  CONFIG_PCI=y  # CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_PCI_LEGACY=y  # CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set  CONFIG_PCI_LBA=y  CONFIG_IOSAPIC=y  CONFIG_IOMMU_SBA=y - -# -# PCCARD (PCMCIA/CardBus) support -# +CONFIG_IOMMU_HELPER=y  # CONFIG_PCCARD is not set  # CONFIG_HOTPLUG_PCI is not set @@ -158,16 +183,15 @@ CONFIG_PDC_STABLE=y  # Executable file formats  #  CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_HAVE_AOUT is not set  # CONFIG_BINFMT_MISC is not set - -# -# Networking -#  CONFIG_NET=y  #  # Networking options  # +CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_PACKET=y  CONFIG_PACKET_MMAP=y  CONFIG_UNIX=y @@ -175,6 +199,8 @@ CONFIG_XFRM=y  CONFIG_XFRM_USER=m  # CONFIG_XFRM_SUB_POLICY is not set  # CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_IPCOMP=m  CONFIG_NET_KEY=m  # CONFIG_NET_KEY_MIGRATE is not set  CONFIG_INET=y @@ -204,7 +230,6 @@ CONFIG_INET_XFRM_MODE_BEET=y  CONFIG_TCP_CONG_CUBIC=y  CONFIG_DEFAULT_TCP_CONG="cubic"  # CONFIG_TCP_MD5SIG is not set -# CONFIG_IP_VS is not set  CONFIG_IPV6=m  # CONFIG_IPV6_PRIVACY is not set  # CONFIG_IPV6_ROUTER_PREF is not set @@ -220,29 +245,34 @@ CONFIG_INET6_XFRM_MODE_TUNNEL=m  CONFIG_INET6_XFRM_MODE_BEET=m  # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set  CONFIG_IPV6_SIT=m +CONFIG_IPV6_NDISC_NODETYPE=y  CONFIG_IPV6_TUNNEL=m  # CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set  # CONFIG_NETWORK_SECMARK is not set  CONFIG_NETFILTER=y  CONFIG_NETFILTER_DEBUG=y +CONFIG_NETFILTER_ADVANCED=y  #  # Core Netfilter Configuration  # -# CONFIG_NETFILTER_NETLINK is not set -# CONFIG_NF_CONNTRACK_ENABLED is not set +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set  # CONFIG_NF_CONNTRACK is not set  # CONFIG_NETFILTER_XTABLES is not set +# CONFIG_IP_VS is not set  #  # IP: Netfilter Configuration  # +# CONFIG_NF_DEFRAG_IPV4 is not set  CONFIG_IP_NF_QUEUE=m  # CONFIG_IP_NF_IPTABLES is not set  # CONFIG_IP_NF_ARPTABLES is not set  # -# IPv6: Netfilter Configuration (EXPERIMENTAL) +# IPv6: Netfilter Configuration  #  # CONFIG_IP6_NF_QUEUE is not set  # CONFIG_IP6_NF_IPTABLES is not set @@ -251,6 +281,7 @@ CONFIG_IP_NF_QUEUE=m  # CONFIG_TIPC is not set  # CONFIG_ATM is not set  # CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set  # CONFIG_VLAN_8021Q is not set  # CONFIG_DECNET is not set  # CONFIG_LLC2 is not set @@ -260,28 +291,26 @@ CONFIG_IP_NF_QUEUE=m  # CONFIG_LAPB is not set  # CONFIG_ECONET is not set  # CONFIG_WAN_ROUTER is not set - -# -# QoS and/or fair queueing -#  # CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set  #  # Network testing  #  CONFIG_NET_PKTGEN=m  # CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set  # CONFIG_IRDA is not set  # CONFIG_BT is not set  # CONFIG_AF_RXRPC is not set - -# -# Wireless -# +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y  # CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y  # CONFIG_WIRELESS_EXT is not set +# CONFIG_LIB80211 is not set  # CONFIG_MAC80211 is not set -# CONFIG_IEEE80211 is not set +# CONFIG_WIMAX is not set  # CONFIG_RFKILL is not set  # CONFIG_NET_9P is not set @@ -296,6 +325,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_STANDALONE is not set  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE=""  # CONFIG_DEBUG_DRIVER is not set  # CONFIG_DEBUG_DEVRES is not set  # CONFIG_SYS_HYPERVISOR is not set @@ -316,59 +347,62 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m  # 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=y  # CONFIG_PHANTOM is not set -# CONFIG_EEPROM_93CX6 is not set  # CONFIG_SGI_IOC4 is not set  # CONFIG_TIFM_CORE is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_93CX6 is not set +CONFIG_HAVE_IDE=y  CONFIG_IDE=y -CONFIG_IDE_MAX_HWIFS=4 -CONFIG_BLK_DEV_IDE=y  # -# Please see Documentation/ide.txt for help/info on IDE drives +# Please see Documentation/ide/ide.txt for help/info on IDE drives  # +CONFIG_IDE_ATAPI=y  # CONFIG_BLK_DEV_IDE_SATA is not set -CONFIG_BLK_DEV_IDEDISK=m -# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_IDE_GD=y +CONFIG_IDE_GD_ATA=y +# CONFIG_IDE_GD_ATAPI is not set  CONFIG_BLK_DEV_IDECD=y +CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y  # CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -CONFIG_BLK_DEV_IDESCSI=y  # CONFIG_IDE_TASK_IOCTL is not set  CONFIG_IDE_PROC_FS=y  #  # IDE chipset support/bugfixes  # -CONFIG_IDE_GENERIC=y  # CONFIG_BLK_DEV_PLATFORM is not set +CONFIG_BLK_DEV_IDEDMA_SFF=y  #  # PCI IDE chipsets support  #  CONFIG_BLK_DEV_IDEPCI=y -CONFIG_IDEPCI_SHARE_IRQ=y  CONFIG_IDEPCI_PCIBUS_ORDER=y -# CONFIG_BLK_DEV_OFFBOARD is not set  # CONFIG_BLK_DEV_GENERIC is not set  # CONFIG_BLK_DEV_OPTI621 is not set  CONFIG_BLK_DEV_IDEDMA_PCI=y -# CONFIG_BLK_DEV_IDEDMA_FORCED is not set -CONFIG_IDEDMA_ONLYDISK=y  # CONFIG_BLK_DEV_AEC62XX is not set  # CONFIG_BLK_DEV_ALI15X3 is not set  # CONFIG_BLK_DEV_AMD74XX is not set  # CONFIG_BLK_DEV_CMD64X is not set  # CONFIG_BLK_DEV_TRIFLEX is not set -# CONFIG_BLK_DEV_CY82C693 is not set  # CONFIG_BLK_DEV_CS5520 is not set  # CONFIG_BLK_DEV_CS5530 is not set -# CONFIG_BLK_DEV_HPT34X is not set  # CONFIG_BLK_DEV_HPT366 is not set  # CONFIG_BLK_DEV_JMICRON is not set  # CONFIG_BLK_DEV_SC1200 is not set  # CONFIG_BLK_DEV_PIIX is not set +# CONFIG_BLK_DEV_IT8172 is not set  # CONFIG_BLK_DEV_IT8213 is not set  # CONFIG_BLK_DEV_IT821X is not set  CONFIG_BLK_DEV_NS87415=y @@ -380,10 +414,7 @@ CONFIG_BLK_DEV_SIIMAGE=m  # CONFIG_BLK_DEV_TRM290 is not set  # CONFIG_BLK_DEV_VIA82CXXX is not set  # CONFIG_BLK_DEV_TC86C001 is not set -# CONFIG_IDE_ARM is not set  CONFIG_BLK_DEV_IDEDMA=y -# CONFIG_IDEDMA_IVB is not set -# CONFIG_BLK_DEV_HD is not set  #  # SCSI device support @@ -422,8 +453,10 @@ CONFIG_SCSI_SPI_ATTRS=y  # CONFIG_SCSI_FC_ATTRS is not set  CONFIG_SCSI_ISCSI_ATTRS=m  # CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set  CONFIG_SCSI_LOWLEVEL=y  # CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set  # CONFIG_BLK_DEV_3W_XXXX_RAID is not set  # CONFIG_SCSI_3W_9XXX is not set  # CONFIG_SCSI_ACARD is not set @@ -433,16 +466,20 @@ CONFIG_SCSI_LOWLEVEL=y  # CONFIG_SCSI_AIC79XX is not set  # CONFIG_SCSI_AIC94XX is not set  # CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set  # CONFIG_SCSI_ARCMSR is not set  # CONFIG_MEGARAID_NEWGEN is not set  # CONFIG_MEGARAID_LEGACY is not set  # CONFIG_MEGARAID_SAS is not set  # CONFIG_SCSI_HPTIOP is not set +# CONFIG_LIBFC is not set +# CONFIG_FCOE is not set  # CONFIG_SCSI_DMX3191D is not set  # CONFIG_SCSI_FUTURE_DOMAIN is not set  # CONFIG_SCSI_IPS is not set  # CONFIG_SCSI_INITIO is not set  # CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_MVSAS is not set  # CONFIG_SCSI_STEX is not set  CONFIG_SCSI_SYM53C8XX_2=y  CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 @@ -458,9 +495,11 @@ CONFIG_SCSI_SYM53C8XX_MMIO=y  # CONFIG_SCSI_NSP32 is not set  CONFIG_SCSI_DEBUG=m  # CONFIG_SCSI_SRP is not set +# CONFIG_SCSI_DH is not set  # CONFIG_ATA is not set  CONFIG_MD=y  CONFIG_BLK_DEV_MD=y +CONFIG_MD_AUTODETECT=y  CONFIG_MD_LINEAR=y  CONFIG_MD_RAID0=y  CONFIG_MD_RAID1=y @@ -475,13 +514,8 @@ CONFIG_DM_SNAPSHOT=m  CONFIG_DM_MIRROR=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m -# CONFIG_DM_MULTIPATH_EMC is not set -# CONFIG_DM_MULTIPATH_RDAC is not set  # CONFIG_DM_DELAY is not set - -# -# Fusion MPT device support -# +# CONFIG_DM_UEVENT is not set  CONFIG_FUSION=y  CONFIG_FUSION_SPI=m  # CONFIG_FUSION_FC is not set @@ -493,20 +527,40 @@ CONFIG_FUSION_CTL=m  #  # IEEE 1394 (FireWire) support  # + +# +# Enable only one of the two stacks, unless you know what you are doing +#  # CONFIG_FIREWIRE is not set  # CONFIG_IEEE1394 is not set  # CONFIG_I2O is not set  CONFIG_NETDEVICES=y -# CONFIG_NETDEVICES_MULTIQUEUE is not set  CONFIG_DUMMY=m  CONFIG_BONDING=m  # CONFIG_MACVLAN is not set  # CONFIG_EQUALIZER is not set  CONFIG_TUN=m  # CONFIG_VETH is not set -# CONFIG_IP1000 is not set  # CONFIG_ARCNET is not set -# CONFIG_PHYLIB is not set +CONFIG_PHYLIB=m + +# +# MII PHY device drivers +# +# CONFIG_MARVELL_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_MDIO_BITBANG is not set  CONFIG_NET_ETHERNET=y  CONFIG_MII=m  # CONFIG_HAPPYMEAL is not set @@ -528,33 +582,38 @@ CONFIG_TULIP_MMIO=y  # CONFIG_IBM_NEW_EMAC_RGMII is not set  # CONFIG_IBM_NEW_EMAC_TAH is not set  # CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set  CONFIG_NET_PCI=y  # CONFIG_PCNET32 is not set  # CONFIG_AMD8111_ETH is not set  # CONFIG_ADAPTEC_STARFIRE is not set  # CONFIG_B44 is not set  # CONFIG_FORCEDETH is not set -# CONFIG_EEPRO100 is not set  CONFIG_E100=m  # CONFIG_FEALNX is not set  # CONFIG_NATSEMI is not set  # CONFIG_NE2K_PCI is not set  # CONFIG_8139CP is not set  # CONFIG_8139TOO is not set +# CONFIG_R6040 is not set  # CONFIG_SIS900 is not set  # CONFIG_EPIC100 is not set +# CONFIG_SMSC9420 is not set  # CONFIG_SUNDANCE is not set  # CONFIG_TLAN is not set  # CONFIG_VIA_RHINE is not set  # CONFIG_SC92031 is not set +# CONFIG_ATL2 is not set  CONFIG_NETDEV_1000=y  CONFIG_ACENIC=m  # CONFIG_ACENIC_OMIT_TIGON_I is not set  # CONFIG_DL2K is not set  CONFIG_E1000=m -# CONFIG_E1000_NAPI is not set -# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set  # CONFIG_E1000E is not set +# CONFIG_IP1000 is not set +# CONFIG_IGB is not set  # CONFIG_NS83820 is not set  # CONFIG_HAMACHI is not set  # CONFIG_YELLOWFIN is not set @@ -562,23 +621,31 @@ CONFIG_E1000=m  # CONFIG_SIS190 is not set  # CONFIG_SKGE is not set  # CONFIG_SKY2 is not set -# CONFIG_SK98LIN is not set  # CONFIG_VIA_VELOCITY is not set  CONFIG_TIGON3=m  # CONFIG_BNX2 is not set  # CONFIG_QLA3XXX is not set  # CONFIG_ATL1 is not set +# CONFIG_ATL1E is not set +# CONFIG_ATL1C is not set +# CONFIG_JME is not set  CONFIG_NETDEV_10000=y  # CONFIG_CHELSIO_T1 is not set +CONFIG_CHELSIO_T3_DEPENDS=y  # CONFIG_CHELSIO_T3 is not set +# CONFIG_ENIC is not set  # CONFIG_IXGBE is not set  # CONFIG_IXGB is not set  # CONFIG_S2IO is not set  # CONFIG_MYRI10GE is not set  # CONFIG_NETXEN_NIC is not set  # CONFIG_NIU is not set +# CONFIG_MLX4_EN is not set  # CONFIG_MLX4_CORE is not set  # CONFIG_TEHUTI is not set +# CONFIG_BNX2X is not set +# CONFIG_QLGE is not set +# CONFIG_SFC is not set  # CONFIG_TR is not set  # @@ -586,6 +653,11 @@ CONFIG_NETDEV_10000=y  #  # CONFIG_WLAN_PRE80211 is not set  # CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +#  #  # USB Network Adapters @@ -594,7 +666,6 @@ CONFIG_NETDEV_10000=y  # CONFIG_USB_KAWETH is not set  # CONFIG_USB_PEGASUS is not set  # CONFIG_USB_RTL8150 is not set -# CONFIG_USB_USBNET_MII is not set  # CONFIG_USB_USBNET is not set  # CONFIG_WAN is not set  # CONFIG_FDDI is not set @@ -612,7 +683,6 @@ CONFIG_PPPOE=m  # CONFIG_SLIP is not set  CONFIG_SLHC=m  # CONFIG_NET_FC is not set -# CONFIG_SHAPER is not set  # CONFIG_NETCONSOLE is not set  # CONFIG_NETPOLL is not set  # CONFIG_NET_POLL_CONTROLLER is not set @@ -634,7 +704,6 @@ CONFIG_INPUT_MOUSEDEV=y  CONFIG_INPUT_MOUSEDEV_SCREEN_X=1600  CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1200  # CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_TSDEV is not set  # CONFIG_INPUT_EVDEV is not set  # CONFIG_INPUT_EVBUG is not set @@ -652,6 +721,7 @@ CONFIG_INPUT_MOUSE=y  # CONFIG_MOUSE_PS2 is not set  # CONFIG_MOUSE_SERIAL is not set  # CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_BCM5974 is not set  # CONFIG_MOUSE_VSXXXAA is not set  # CONFIG_INPUT_JOYSTICK is not set  # CONFIG_INPUT_TABLET is not set @@ -672,10 +742,13 @@ CONFIG_SERIO_LIBPS2=m  # Character devices  #  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 +# CONFIG_NOZOMI is not set  #  # Serial drivers @@ -699,72 +772,77 @@ CONFIG_SERIAL_CORE=y  CONFIG_SERIAL_CORE_CONSOLE=y  # CONFIG_SERIAL_JSM is not set  CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set  CONFIG_LEGACY_PTYS=y  CONFIG_LEGACY_PTY_COUNT=256  # CONFIG_IPMI_HANDLER is not set -# CONFIG_WATCHDOG is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=y -CONFIG_GEN_RTC_X=y  # CONFIG_R3964 is not set  # CONFIG_APPLICOM is not set -# CONFIG_AGP is not set -# CONFIG_DRM is not set  CONFIG_RAW_DRIVER=y  CONFIG_MAX_RAW_DEVS=256  # CONFIG_TCG_TPM is not set  CONFIG_DEVPORT=y  # CONFIG_I2C is not set - -# -# SPI support -#  # CONFIG_SPI is not set -# CONFIG_SPI_MASTER is not set  # CONFIG_W1 is not set  # 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 +CONFIG_SSB_POSSIBLE=y  #  # Sonics Silicon Backplane  # -CONFIG_SSB_POSSIBLE=y  # CONFIG_SSB is not set  #  # Multifunction device drivers  # +# CONFIG_MFD_CORE is not set  # CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_REGULATOR is not set  #  # Multimedia devices  # + +# +# Multimedia core support +#  # CONFIG_VIDEO_DEV is not set  # CONFIG_DVB_CORE is not set -# CONFIG_DAB is not set +# CONFIG_VIDEO_MEDIA is not set  # -# Graphics support +# Multimedia drivers  # -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_DAB is not set  # -# Display device support +# Graphics support  # -# CONFIG_DISPLAY_SUPPORT is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set  # CONFIG_VGASTATE is not set  CONFIG_VIDEO_OUTPUT_CONTROL=m  CONFIG_FB=y  # CONFIG_FIRMWARE_EDID is not set  # CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT 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 is not set  # CONFIG_FB_SYS_FOPS is not set -CONFIG_FB_DEFERRED_IO=y  # CONFIG_FB_SVGALIB is not set  # CONFIG_FB_MACMODES is not set  # CONFIG_FB_BACKLIGHT is not set @@ -790,6 +868,7 @@ CONFIG_FB_STI=y  # CONFIG_FB_S3 is not set  # CONFIG_FB_SAVAGE is not set  # CONFIG_FB_SIS is not set +# CONFIG_FB_VIA is not set  # CONFIG_FB_NEOMAGIC is not set  # CONFIG_FB_KYRO is not set  # CONFIG_FB_3DFX is not set @@ -798,7 +877,16 @@ CONFIG_FB_STI=y  # CONFIG_FB_TRIDENT is not set  # CONFIG_FB_ARK is not set  # CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set  # CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set  #  # Console display driver support @@ -818,15 +906,8 @@ CONFIG_LOGO=y  # CONFIG_LOGO_LINUX_VGA16 is not set  # CONFIG_LOGO_LINUX_CLUT224 is not set  CONFIG_LOGO_PARISC_CLUT224=y - -# -# Sound -#  CONFIG_SOUND=y - -# -# Advanced Linux Sound Architecture -# +CONFIG_SOUND_OSS_CORE=y  CONFIG_SND=y  CONFIG_SND_TIMER=y  CONFIG_SND_PCM=y @@ -842,20 +923,16 @@ CONFIG_SND_SUPPORT_OLD_API=y  CONFIG_SND_VERBOSE_PROCFS=y  # CONFIG_SND_VERBOSE_PRINTK is not set  # CONFIG_SND_DEBUG is not set - -# -# Generic devices -# +CONFIG_SND_VMASTER=y  CONFIG_SND_AC97_CODEC=y +CONFIG_SND_DRIVERS=y  # CONFIG_SND_DUMMY is not set  # CONFIG_SND_VIRMIDI is not set  # CONFIG_SND_MTPAV is not set  # CONFIG_SND_SERIAL_U16550 is not set  # CONFIG_SND_MPU401 is not set - -# -# PCI devices -# +# CONFIG_SND_AC97_POWER_SAVE is not set +CONFIG_SND_PCI=y  CONFIG_SND_AD1889=y  # CONFIG_SND_ALS300 is not set  # CONFIG_SND_ALI5451 is not set @@ -864,10 +941,12 @@ CONFIG_SND_AD1889=y  # CONFIG_SND_AU8810 is not set  # CONFIG_SND_AU8820 is not set  # CONFIG_SND_AU8830 is not set +# CONFIG_SND_AW2 is not set  # CONFIG_SND_AZT3328 is not set  # CONFIG_SND_BT87X is not set  # CONFIG_SND_CA0106 is not set  # CONFIG_SND_CMIPCI is not set +# CONFIG_SND_OXYGEN is not set  # CONFIG_SND_CS4281 is not set  # CONFIG_SND_CS46XX is not set  # CONFIG_SND_DARLA20 is not set @@ -892,6 +971,7 @@ CONFIG_SND_AD1889=y  # CONFIG_SND_HDA_INTEL is not set  # CONFIG_SND_HDSP is not set  # CONFIG_SND_HDSPM is not set +# CONFIG_SND_HIFIER is not set  # CONFIG_SND_ICE1712 is not set  # CONFIG_SND_ICE1724 is not set  # CONFIG_SND_INTEL8X0 is not set @@ -909,47 +989,59 @@ CONFIG_SND_AD1889=y  # CONFIG_SND_TRIDENT is not set  # CONFIG_SND_VIA82XX is not set  # CONFIG_SND_VIA82XX_MODEM is not set +# CONFIG_SND_VIRTUOSO is not set  # CONFIG_SND_VX222 is not set  # CONFIG_SND_YMFPCI is not set -# CONFIG_SND_AC97_POWER_SAVE is not set - -# -# USB devices -# +CONFIG_SND_USB=y  # CONFIG_SND_USB_AUDIO is not set  # CONFIG_SND_USB_CAIAQ is not set - -# -# System on Chip audio support -#  # CONFIG_SND_SOC is not set - -# -# SoC Audio support for SuperH -# - -# -# Open Sound System -#  # CONFIG_SOUND_PRIME is not set  CONFIG_AC97_BUS=y  CONFIG_HID_SUPPORT=y  CONFIG_HID=y  # CONFIG_HID_DEBUG is not set +# CONFIG_HIDRAW is not set  #  # USB Input Devices  #  CONFIG_USB_HID=y -# CONFIG_USB_HIDINPUT_POWERBOOK is not set -# CONFIG_HID_FF is not set +# CONFIG_HID_PID is not set  CONFIG_USB_HIDDEV=y + +# +# Special HID drivers +# +CONFIG_HID_COMPAT=y +# CONFIG_HID_A4TECH is not set +# CONFIG_HID_APPLE is not set +# CONFIG_HID_BELKIN is not set +# CONFIG_HID_CHERRY is not set +# CONFIG_HID_CHICONY is not set +# CONFIG_HID_CYPRESS is not set +# CONFIG_HID_EZKEY is not set +# CONFIG_HID_GYRATION is not set +# CONFIG_HID_LOGITECH is not set +# CONFIG_HID_MICROSOFT is not set +# CONFIG_HID_MONTEREY is not set +# CONFIG_HID_NTRIG is not set +# CONFIG_HID_PANTHERLORD is not set +# CONFIG_HID_PETALYNX is not set +# CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SONY is not set +# CONFIG_HID_SUNPLUS is not set +# CONFIG_GREENASIA_FF is not set +# CONFIG_HID_TOPSEED is not set +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_ZEROPLUS_FF is not set  CONFIG_USB_SUPPORT=y  CONFIG_USB_ARCH_HAS_HCD=y  CONFIG_USB_ARCH_HAS_OHCI=y  CONFIG_USB_ARCH_HAS_EHCI=y  CONFIG_USB=y  CONFIG_USB_DEBUG=y +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set  #  # Miscellaneous USB options @@ -958,12 +1050,20 @@ CONFIG_USB_DEVICEFS=y  CONFIG_USB_DEVICE_CLASS=y  # CONFIG_USB_DYNAMIC_MINORS is not set  # CONFIG_USB_OTG is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_MON is not set +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set  #  # USB Host Controller Drivers  # +# CONFIG_USB_C67X00_HCD is not set  # CONFIG_USB_EHCI_HCD is not set +# CONFIG_USB_OXU210HP_HCD is not set  # CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_ISP1760_HCD is not set  CONFIG_USB_OHCI_HCD=y  # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set  # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set @@ -971,32 +1071,37 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y  # CONFIG_USB_UHCI_HCD is not set  # CONFIG_USB_SL811_HCD is not set  # CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_WHCI_HCD is not set +# CONFIG_USB_HWA_HCD is not set  #  # USB Device Class drivers  #  # CONFIG_USB_ACM is not set  CONFIG_USB_PRINTER=m +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set  # -# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;  #  # -# may also be needed; see USB_STORAGE Help for more information +# see USB_STORAGE Help for more information  #  CONFIG_USB_STORAGE=m  # CONFIG_USB_STORAGE_DEBUG is not set  # CONFIG_USB_STORAGE_DATAFAB is not set  # CONFIG_USB_STORAGE_FREECOM is not set  # CONFIG_USB_STORAGE_ISD200 is not set -CONFIG_USB_STORAGE_DPCM=y  CONFIG_USB_STORAGE_USBAT=y  CONFIG_USB_STORAGE_SDDR09=y  CONFIG_USB_STORAGE_SDDR55=y  CONFIG_USB_STORAGE_JUMPSHOT=y  # CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set  # CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set  # CONFIG_USB_LIBUSUAL is not set  # @@ -1004,15 +1109,10 @@ CONFIG_USB_STORAGE_JUMPSHOT=y  #  CONFIG_USB_MDC800=m  CONFIG_USB_MICROTEK=m -# CONFIG_USB_MON is not set  #  # USB port drivers  # - -# -# USB Serial Converter support -#  # CONFIG_USB_SERIAL is not set  # @@ -1021,7 +1121,7 @@ CONFIG_USB_MICROTEK=m  # CONFIG_USB_EMI62 is not set  # CONFIG_USB_EMI26 is not set  # CONFIG_USB_ADUTUX is not set -# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_SEVSEG is not set  # CONFIG_USB_RIO500 is not set  CONFIG_USB_LEGOTOWER=m  # CONFIG_USB_LCD is not set @@ -1037,37 +1137,59 @@ CONFIG_USB_LEGOTOWER=m  # CONFIG_USB_TRANCEVIBRATOR is not set  # CONFIG_USB_IOWARRIOR is not set  # CONFIG_USB_TEST is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_VST is not set +# CONFIG_USB_GADGET is not set  # -# USB DSL modem support -# - -# -# USB Gadget Support +# OTG and related infrastructure  # -# CONFIG_USB_GADGET is not set +# CONFIG_UWB is not set  # CONFIG_MMC is not set +# CONFIG_MEMSTICK is not set  # CONFIG_NEW_LEDS is not set +# CONFIG_ACCESSIBILITY is not set  # CONFIG_INFINIBAND is not set -# CONFIG_RTC_CLASS is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set  # -# DMA Engine support +# RTC interfaces  # -# CONFIG_DMA_ENGINE is not set +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set  # -# DMA Clients +# SPI RTC drivers  #  # -# DMA Devices +# Platform RTC drivers  # +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set  # -# Userspace I/O +# on-CPU RTC drivers  # +CONFIG_RTC_DRV_PARISC=y +# CONFIG_DMADEVICES is not set  # CONFIG_UIO is not set +# CONFIG_STAGING is not set  #  # File systems @@ -1077,25 +1199,24 @@ CONFIG_EXT2_FS=y  # CONFIG_EXT2_FS_XIP is not set  CONFIG_EXT3_FS=y  # CONFIG_EXT3_FS_XATTR is not set -# CONFIG_EXT4DEV_FS is not set +# CONFIG_EXT4_FS is not set  CONFIG_JBD=y  # CONFIG_JBD_DEBUG is not set  # CONFIG_REISERFS_FS is not set  # CONFIG_JFS_FS is not set  # CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y  CONFIG_XFS_FS=m  # CONFIG_XFS_QUOTA is not set -# CONFIG_XFS_SECURITY is not set  # CONFIG_XFS_POSIX_ACL is not set  # CONFIG_XFS_RT is not set -# CONFIG_GFS2_FS is not set +# CONFIG_XFS_DEBUG is not set  # CONFIG_OCFS2_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_ROMFS_FS is not set +# CONFIG_BTRFS_FS is not set +CONFIG_DNOTIFY=y  CONFIG_INOTIFY=y  CONFIG_INOTIFY_USER=y  # CONFIG_QUOTA is not set -CONFIG_DNOTIFY=y  # CONFIG_AUTOFS_FS is not set  CONFIG_AUTOFS4_FS=y  # CONFIG_FUSE_FS is not set @@ -1124,16 +1245,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"  CONFIG_PROC_FS=y  CONFIG_PROC_KCORE=y  CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y  CONFIG_SYSFS=y  CONFIG_TMPFS=y  # CONFIG_TMPFS_POSIX_ACL is not set  # CONFIG_HUGETLB_PAGE is not set -CONFIG_RAMFS=y  # CONFIG_CONFIGFS_FS is not set - -# -# Miscellaneous filesystems -# +CONFIG_MISC_FILESYSTEMS=y  # CONFIG_ADFS_FS is not set  # CONFIG_AFFS_FS is not set  # CONFIG_HFS_FS is not set @@ -1142,32 +1260,31 @@ CONFIG_RAMFS=y  # CONFIG_BFS_FS is not set  # CONFIG_EFS_FS is not set  # CONFIG_CRAMFS is not set +# CONFIG_SQUASHFS 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  # CONFIG_SYSV_FS is not set  # CONFIG_UFS_FS is not set - -# -# Network File Systems -# +CONFIG_NETWORK_FILESYSTEMS=y  CONFIG_NFS_FS=y  CONFIG_NFS_V3=y  # CONFIG_NFS_V3_ACL is not set  # CONFIG_NFS_V4 is not set -# CONFIG_NFS_DIRECTIO is not set +CONFIG_ROOT_NFS=y  CONFIG_NFSD=y  CONFIG_NFSD_V3=y  # CONFIG_NFSD_V3_ACL is not set  # CONFIG_NFSD_V4 is not set -# CONFIG_NFSD_TCP is not set -CONFIG_ROOT_NFS=y  CONFIG_LOCKD=y  CONFIG_LOCKD_V4=y  CONFIG_EXPORTFS=y  CONFIG_NFS_COMMON=y  CONFIG_SUNRPC=y -# CONFIG_SUNRPC_BIND34 is not set +# CONFIG_SUNRPC_REGISTER_V4 is not set  # CONFIG_RPCSEC_GSS_KRB5 is not set  # CONFIG_RPCSEC_GSS_SPKM3 is not set  # CONFIG_SMB_FS is not set @@ -1181,10 +1298,6 @@ CONFIG_SUNRPC=y  #  # CONFIG_PARTITION_ADVANCED is not set  CONFIG_MSDOS_PARTITION=y - -# -# Native Language Support -#  CONFIG_NLS=y  CONFIG_NLS_DEFAULT="iso8859-1"  CONFIG_NLS_CODEPAGE_437=m @@ -1225,33 +1338,28 @@ CONFIG_NLS_ISO8859_15=m  # CONFIG_NLS_KOI8_R is not set  # CONFIG_NLS_KOI8_U is not set  CONFIG_NLS_UTF8=m - -# -# Distributed Lock Manager -#  # CONFIG_DLM is not set  # -# Profiling support -# -CONFIG_PROFILING=y -CONFIG_OPROFILE=m - -#  # Kernel hacking  #  # CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y  CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024  CONFIG_MAGIC_SYSRQ=y  # CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_DEBUG_FS is not set +CONFIG_DEBUG_FS=y  CONFIG_HEADERS_CHECK=y  CONFIG_DEBUG_KERNEL=y  # CONFIG_DEBUG_SHIRQ is not set  CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0  CONFIG_SCHED_DEBUG=y  # CONFIG_SCHEDSTATS is not set  # CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set  # CONFIG_DEBUG_SLAB is not set  # CONFIG_DEBUG_RT_MUTEXES is not set  # CONFIG_RT_MUTEX_TESTER is not set @@ -1263,10 +1371,33 @@ CONFIG_DEBUG_MUTEXES=y  # CONFIG_DEBUG_BUGVERBOSE is not set  # CONFIG_DEBUG_INFO is not set  # CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +# CONFIG_DEBUG_MEMORY_INIT is not set  # CONFIG_DEBUG_LIST is not set -CONFIG_FORCED_INLINING=y +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BOOT_PRINTK_DELAY is not set  # CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set  # CONFIG_FAULT_INJECTION is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_NOP_TRACER=y +CONFIG_RING_BUFFER=y +CONFIG_TRACING=y + +# +# Tracers +# +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_TRACE_BRANCH_PROFILING is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_BUILD_DOCSRC is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set  CONFIG_DEBUG_RODATA=y  # @@ -1274,54 +1405,110 @@ CONFIG_DEBUG_RODATA=y  #  # CONFIG_KEYS is not set  # CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set  CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set  CONFIG_CRYPTO_ALGAPI=m +CONFIG_CRYPTO_ALGAPI2=m +CONFIG_CRYPTO_AEAD2=m  CONFIG_CRYPTO_BLKCIPHER=m +CONFIG_CRYPTO_BLKCIPHER2=m +CONFIG_CRYPTO_HASH=m +CONFIG_CRYPTO_HASH2=m +CONFIG_CRYPTO_RNG2=m  CONFIG_CRYPTO_MANAGER=m +CONFIG_CRYPTO_MANAGER2=m +# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_NULL=m +# CONFIG_CRYPTO_CRYPTD is not set +# CONFIG_CRYPTO_AUTHENC is not set +CONFIG_CRYPTO_TEST=m + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=m +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +#  # CONFIG_CRYPTO_HMAC is not set  # CONFIG_CRYPTO_XCBC is not set -CONFIG_CRYPTO_NULL=m + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=m  # CONFIG_CRYPTO_MD4 is not set  CONFIG_CRYPTO_MD5=m +# 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 -# CONFIG_CRYPTO_WP512 is not set  # CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_GF128MUL is not set -# CONFIG_CRYPTO_ECB is not set -CONFIG_CRYPTO_CBC=m -# CONFIG_CRYPTO_PCBC is not set -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_XTS is not set -# CONFIG_CRYPTO_CRYPTD is not set -CONFIG_CRYPTO_DES=m -# CONFIG_CRYPTO_FCRYPT is not set -CONFIG_CRYPTO_BLOWFISH=m -# CONFIG_CRYPTO_TWOFISH is not set -# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_WP512 is not set + +# +# Ciphers +#  # CONFIG_CRYPTO_AES is not set +# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_ARC4 is not set +CONFIG_CRYPTO_BLOWFISH=m +# CONFIG_CRYPTO_CAMELLIA is not set  # CONFIG_CRYPTO_CAST5 is not set  # CONFIG_CRYPTO_CAST6 is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_ARC4 is not set +CONFIG_CRYPTO_DES=m +# CONFIG_CRYPTO_FCRYPT is not set  # CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_ANUBIS is not set +# CONFIG_CRYPTO_SALSA20 is not set  # CONFIG_CRYPTO_SEED is not set +# CONFIG_CRYPTO_SERPENT is not set +# CONFIG_CRYPTO_TEA is not set +# CONFIG_CRYPTO_TWOFISH is not set + +# +# Compression +#  CONFIG_CRYPTO_DEFLATE=m -# CONFIG_CRYPTO_MICHAEL_MIC is not set -CONFIG_CRYPTO_CRC32C=m -# CONFIG_CRYPTO_CAMELLIA is not set -CONFIG_CRYPTO_TEST=m -# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set  # CONFIG_CRYPTO_HW is not set  #  # Library routines  #  CONFIG_BITREVERSE=y +CONFIG_GENERIC_FIND_LAST_BIT=y  CONFIG_CRC_CCITT=m  # CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set  # CONFIG_CRC_ITU_T is not set  CONFIG_CRC32=y  # CONFIG_CRC7 is not set diff --git a/arch/parisc/configs/default_defconfig b/arch/parisc/configs/default_defconfig index 448a757b06c..283a96c1b5e 100644 --- a/arch/parisc/configs/default_defconfig +++ b/arch/parisc/configs/default_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.23 -# Fri Oct 12 20:54:57 2007 +# Linux kernel version: 2.6.29-rc8 +# Fri Mar 13 01:32:59 2009  #  CONFIG_PARISC=y  CONFIG_MMU=y @@ -33,17 +33,35 @@ CONFIG_SYSVIPC_SYSCTL=y  CONFIG_POSIX_MQUEUE=y  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set -# CONFIG_USER_NS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y  CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_GROUP_SCHED is not set +# CONFIG_CGROUPS is not set  CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y  # CONFIG_RELAY is not set +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_USER_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y  CONFIG_INITRAMFS_SOURCE=""  CONFIG_CC_OPTIMIZE_FOR_SIZE=y  CONFIG_SYSCTL=y +CONFIG_ANON_INODES=y  # CONFIG_EMBEDDED is not set  CONFIG_SYSCTL_SYSCALL=y  CONFIG_KALLSYMS=y @@ -55,29 +73,39 @@ CONFIG_BUG=y  CONFIG_ELF_CORE=y  CONFIG_BASE_FULL=y  CONFIG_FUTEX=y -CONFIG_ANON_INODES=y  CONFIG_EPOLL=y  CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y  CONFIG_EVENTFD=y  CONFIG_SHMEM=y +CONFIG_AIO=y  CONFIG_VM_EVENT_COUNTERS=y +CONFIG_PCI_QUIRKS=y +CONFIG_COMPAT_BRK=y  CONFIG_SLAB=y  # CONFIG_SLUB is not set  # CONFIG_SLOB is not set +CONFIG_PROFILING=y +CONFIG_TRACEPOINTS=y +# CONFIG_MARKERS is not set +CONFIG_OPROFILE=m +CONFIG_HAVE_OPROFILE=y +# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set +CONFIG_SLABINFO=y  CONFIG_RT_MUTEXES=y -# CONFIG_TINY_SHMEM is not set  CONFIG_BASE_SMALL=0  CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set  CONFIG_MODULE_UNLOAD=y  CONFIG_MODULE_FORCE_UNLOAD=y  # CONFIG_MODVERSIONS is not set  # CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_KMOD=y +CONFIG_INIT_ALL_POSSIBLE=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 @@ -91,6 +119,7 @@ CONFIG_DEFAULT_AS=y  # CONFIG_DEFAULT_CFQ is not set  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="anticipatory" +# CONFIG_FREEZER is not set  #  # Processor type and features @@ -114,17 +143,19 @@ CONFIG_HZ_250=y  # CONFIG_HZ_300 is not set  # CONFIG_HZ_1000 is not set  CONFIG_HZ=250 +# CONFIG_SCHED_HRTICK is not set  CONFIG_SELECT_MEMORY_MODEL=y  CONFIG_FLATMEM_MANUAL=y  # CONFIG_DISCONTIGMEM_MANUAL is not set  # CONFIG_SPARSEMEM_MANUAL is not set  CONFIG_FLATMEM=y  CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_PAGEFLAGS_EXTENDED=y  CONFIG_SPLIT_PTLOCK_CPUS=4096 -# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set  CONFIG_ZONE_DMA_FLAG=0  CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y  # CONFIG_HPUX is not set  # @@ -140,15 +171,14 @@ CONFIG_EISA_NAMES=y  # CONFIG_ISA is not set  CONFIG_PCI=y  # CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_PCI_LEGACY=y  # CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_STUB is not set  CONFIG_GSC_DINO=y  CONFIG_PCI_LBA=y  CONFIG_IOSAPIC=y  CONFIG_IOMMU_SBA=y - -# -# PCCARD (PCMCIA/CardBus) support -# +CONFIG_IOMMU_HELPER=y  CONFIG_PCCARD=y  # CONFIG_PCMCIA_DEBUG is not set  CONFIG_PCMCIA=y @@ -183,16 +213,15 @@ CONFIG_PDC_STABLE=y  # Executable file formats  #  CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_HAVE_AOUT is not set  CONFIG_BINFMT_MISC=m - -# -# Networking -#  CONFIG_NET=y  #  # Networking options  # +CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_PACKET=y  CONFIG_PACKET_MMAP=y  CONFIG_UNIX=y @@ -200,6 +229,8 @@ CONFIG_XFRM=y  CONFIG_XFRM_USER=m  # CONFIG_XFRM_SUB_POLICY is not set  # CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_IPCOMP=y  CONFIG_NET_KEY=m  # CONFIG_NET_KEY_MIGRATE is not set  CONFIG_INET=y @@ -245,8 +276,10 @@ CONFIG_INET6_XFRM_MODE_TUNNEL=y  CONFIG_INET6_XFRM_MODE_BEET=y  # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set  CONFIG_IPV6_SIT=y +CONFIG_IPV6_NDISC_NODETYPE=y  # CONFIG_IPV6_TUNNEL is not set  # CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set  # CONFIG_NETWORK_SECMARK is not set  # CONFIG_NETFILTER is not set  # CONFIG_IP_DCCP is not set @@ -254,6 +287,7 @@ CONFIG_IPV6_SIT=y  # CONFIG_TIPC is not set  # CONFIG_ATM is not set  # CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set  # CONFIG_VLAN_8021Q is not set  # CONFIG_DECNET is not set  CONFIG_LLC=m @@ -264,28 +298,26 @@ CONFIG_LLC2=m  # CONFIG_LAPB is not set  # CONFIG_ECONET is not set  # CONFIG_WAN_ROUTER is not set - -# -# QoS and/or fair queueing -#  # CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set  #  # Network testing  #  # CONFIG_NET_PKTGEN is not set  # CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set  # CONFIG_IRDA is not set  # CONFIG_BT is not set  # CONFIG_AF_RXRPC is not set - -# -# Wireless -# +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y  # CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y  # CONFIG_WIRELESS_EXT is not set +# CONFIG_LIB80211 is not set  # CONFIG_MAC80211 is not set -# CONFIG_IEEE80211 is not set +# CONFIG_WIMAX is not set  # CONFIG_RFKILL is not set  # CONFIG_NET_9P is not set @@ -300,6 +332,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"  # CONFIG_STANDALONE is not set  # CONFIG_PREVENT_FIRMWARE_BUILD is not set  CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE=""  # CONFIG_DEBUG_DRIVER is not set  # CONFIG_DEBUG_DEVRES is not set  # CONFIG_SYS_HYPERVISOR is not set @@ -330,63 +364,68 @@ CONFIG_BLK_DEV_CRYPTOLOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_COUNT=16  CONFIG_BLK_DEV_RAM_SIZE=6144 -CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +# CONFIG_BLK_DEV_XIP 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=y  # CONFIG_PHANTOM is not set -# CONFIG_EEPROM_93CX6 is not set  # CONFIG_SGI_IOC4 is not set  # CONFIG_TIFM_CORE is not set +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_HP_ILO is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_93CX6 is not set +CONFIG_HAVE_IDE=y  CONFIG_IDE=y -CONFIG_BLK_DEV_IDE=y  # -# Please see Documentation/ide.txt for help/info on IDE drives +# Please see Documentation/ide/ide.txt for help/info on IDE drives  # +CONFIG_IDE_ATAPI=y  # CONFIG_BLK_DEV_IDE_SATA is not set -CONFIG_BLK_DEV_IDEDISK=y -CONFIG_IDEDISK_MULTI_MODE=y +CONFIG_IDE_GD=y +CONFIG_IDE_GD_ATA=y +# CONFIG_IDE_GD_ATAPI is not set  CONFIG_BLK_DEV_IDECS=y  # CONFIG_BLK_DEV_DELKIN is not set  CONFIG_BLK_DEV_IDECD=y +CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y  # CONFIG_BLK_DEV_IDETAPE is not set -# CONFIG_BLK_DEV_IDEFLOPPY is not set -CONFIG_BLK_DEV_IDESCSI=y  # CONFIG_IDE_TASK_IOCTL is not set  CONFIG_IDE_PROC_FS=y  #  # IDE chipset support/bugfixes  # -CONFIG_IDE_GENERIC=y  # CONFIG_BLK_DEV_PLATFORM is not set +CONFIG_BLK_DEV_IDEDMA_SFF=y  #  # PCI IDE chipsets support  #  CONFIG_BLK_DEV_IDEPCI=y -CONFIG_IDEPCI_SHARE_IRQ=y  CONFIG_IDEPCI_PCIBUS_ORDER=y  # CONFIG_BLK_DEV_OFFBOARD is not set  CONFIG_BLK_DEV_GENERIC=y  # CONFIG_BLK_DEV_OPTI621 is not set  CONFIG_BLK_DEV_IDEDMA_PCI=y -# CONFIG_BLK_DEV_IDEDMA_FORCED is not set -CONFIG_IDEDMA_ONLYDISK=y  # CONFIG_BLK_DEV_AEC62XX is not set  # CONFIG_BLK_DEV_ALI15X3 is not set  # CONFIG_BLK_DEV_AMD74XX is not set  # CONFIG_BLK_DEV_CMD64X is not set  # CONFIG_BLK_DEV_TRIFLEX is not set -# CONFIG_BLK_DEV_CY82C693 is not set  # CONFIG_BLK_DEV_CS5520 is not set  # CONFIG_BLK_DEV_CS5530 is not set -# CONFIG_BLK_DEV_HPT34X is not set  # CONFIG_BLK_DEV_HPT366 is not set  # CONFIG_BLK_DEV_JMICRON is not set  # CONFIG_BLK_DEV_SC1200 is not set  # CONFIG_BLK_DEV_PIIX is not set +# CONFIG_BLK_DEV_IT8172 is not set  # CONFIG_BLK_DEV_IT8213 is not set  # CONFIG_BLK_DEV_IT821X is not set  CONFIG_BLK_DEV_NS87415=y @@ -398,10 +437,7 @@ CONFIG_BLK_DEV_NS87415=y  # CONFIG_BLK_DEV_TRM290 is not set  # CONFIG_BLK_DEV_VIA82CXXX is not set  # CONFIG_BLK_DEV_TC86C001 is not set -# CONFIG_IDE_ARM is not set  CONFIG_BLK_DEV_IDEDMA=y -# CONFIG_IDEDMA_IVB is not set -# CONFIG_BLK_DEV_HD is not set  #  # SCSI device support @@ -440,8 +476,10 @@ CONFIG_SCSI_SPI_ATTRS=y  # CONFIG_SCSI_FC_ATTRS is not set  # CONFIG_SCSI_ISCSI_ATTRS is not set  # CONFIG_SCSI_SAS_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set  CONFIG_SCSI_LOWLEVEL=y  # CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_CXGB3_ISCSI is not set  # CONFIG_BLK_DEV_3W_XXXX_RAID is not set  # CONFIG_SCSI_3W_9XXX is not set  # CONFIG_SCSI_ACARD is not set @@ -452,11 +490,14 @@ CONFIG_SCSI_LOWLEVEL=y  # CONFIG_SCSI_AIC79XX is not set  # CONFIG_SCSI_AIC94XX is not set  # CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set  # CONFIG_SCSI_ARCMSR is not set  # CONFIG_MEGARAID_NEWGEN is not set  # CONFIG_MEGARAID_LEGACY is not set  # CONFIG_MEGARAID_SAS is not set  # CONFIG_SCSI_HPTIOP is not set +# CONFIG_LIBFC is not set +# CONFIG_FCOE is not set  # CONFIG_SCSI_DMX3191D is not set  # CONFIG_SCSI_FUTURE_DOMAIN is not set  # CONFIG_SCSI_IPS is not set @@ -464,6 +505,7 @@ CONFIG_SCSI_LOWLEVEL=y  # CONFIG_SCSI_INIA100 is not set  # CONFIG_SCSI_PPA is not set  # CONFIG_SCSI_IMM is not set +# CONFIG_SCSI_MVSAS is not set  CONFIG_SCSI_LASI700=y  CONFIG_53C700_LE_ON_BE=y  # CONFIG_SCSI_STEX is not set @@ -487,9 +529,11 @@ CONFIG_SCSI_NCR53C8XX_SYNC=20  # CONFIG_SCSI_DEBUG is not set  # CONFIG_SCSI_SRP is not set  # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set +# CONFIG_SCSI_DH is not set  # CONFIG_ATA is not set  CONFIG_MD=y  CONFIG_BLK_DEV_MD=y +CONFIG_MD_AUTODETECT=y  CONFIG_MD_LINEAR=y  CONFIG_MD_RAID0=y  CONFIG_MD_RAID1=y @@ -505,32 +549,47 @@ CONFIG_BLK_DEV_DM=y  # CONFIG_DM_ZERO is not set  # CONFIG_DM_MULTIPATH is not set  # CONFIG_DM_DELAY is not set +# CONFIG_DM_UEVENT is not set +# CONFIG_FUSION is not set  # -# Fusion MPT device support +# IEEE 1394 (FireWire) support  # -# CONFIG_FUSION is not set -# CONFIG_FUSION_SPI is not set -# CONFIG_FUSION_FC is not set -# CONFIG_FUSION_SAS is not set  # -# IEEE 1394 (FireWire) support +# Enable only one of the two stacks, unless you know what you are doing  #  # CONFIG_FIREWIRE is not set  # CONFIG_IEEE1394 is not set  # CONFIG_I2O is not set  CONFIG_NETDEVICES=y -# CONFIG_NETDEVICES_MULTIQUEUE is not set  CONFIG_DUMMY=m  CONFIG_BONDING=m  # CONFIG_MACVLAN is not set  # CONFIG_EQUALIZER is not set  CONFIG_TUN=m  # CONFIG_VETH is not set -# CONFIG_IP1000 is not set  # CONFIG_ARCNET is not set -# CONFIG_PHYLIB is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# CONFIG_MARVELL_PHY is not set +# CONFIG_DAVICOM_PHY is not set +# CONFIG_QSEMI_PHY is not set +# CONFIG_LXT_PHY is not set +# CONFIG_CICADA_PHY is not set +# CONFIG_VITESSE_PHY is not set +# CONFIG_SMSC_PHY is not set +# CONFIG_BROADCOM_PHY is not set +# CONFIG_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_NATIONAL_PHY is not set +# CONFIG_STE10XP is not set +# CONFIG_LSI_ET1011C_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set  CONFIG_NET_ETHERNET=y  CONFIG_MII=m  CONFIG_LASI_82596=y @@ -550,13 +609,15 @@ CONFIG_TULIP=y  # CONFIG_DM9102 is not set  # CONFIG_ULI526X is not set  # CONFIG_PCMCIA_XIRCOM is not set -# CONFIG_PCMCIA_XIRTULIP is not set  # CONFIG_DEPCA is not set  # CONFIG_HP100 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  # CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set  CONFIG_NET_PCI=y  # CONFIG_PCNET32 is not set  # CONFIG_AMD8111_ETH is not set @@ -564,7 +625,7 @@ CONFIG_NET_PCI=y  # CONFIG_AC3200 is not set  # CONFIG_B44 is not set  # CONFIG_FORCEDETH is not set -# CONFIG_EEPRO100 is not set +# CONFIG_CS89x0 is not set  # CONFIG_E100 is not set  # CONFIG_LNE390 is not set  # CONFIG_FEALNX is not set @@ -574,19 +635,24 @@ CONFIG_NET_PCI=y  # CONFIG_ES3210 is not set  # CONFIG_8139CP is not set  # CONFIG_8139TOO is not set +# CONFIG_R6040 is not set  # CONFIG_SIS900 is not set  # CONFIG_EPIC100 is not set +# CONFIG_SMSC9420 is not set  # CONFIG_SUNDANCE is not set  # CONFIG_TLAN is not set  # CONFIG_VIA_RHINE is not set  # CONFIG_SC92031 is not set  # CONFIG_NET_POCKET is not set +# CONFIG_ATL2 is not set  CONFIG_NETDEV_1000=y  CONFIG_ACENIC=y  # CONFIG_ACENIC_OMIT_TIGON_I is not set  # CONFIG_DL2K is not set  # CONFIG_E1000 is not set  # CONFIG_E1000E is not set +# CONFIG_IP1000 is not set +# CONFIG_IGB is not set  # CONFIG_NS83820 is not set  # CONFIG_HAMACHI is not set  # CONFIG_YELLOWFIN is not set @@ -594,23 +660,31 @@ CONFIG_ACENIC=y  # CONFIG_SIS190 is not set  # CONFIG_SKGE is not set  # CONFIG_SKY2 is not set -# CONFIG_SK98LIN is not set  # CONFIG_VIA_VELOCITY is not set  CONFIG_TIGON3=y  # CONFIG_BNX2 is not set  # CONFIG_QLA3XXX is not set  # CONFIG_ATL1 is not set +# CONFIG_ATL1E is not set +# CONFIG_ATL1C is not set +# CONFIG_JME is not set  CONFIG_NETDEV_10000=y  # CONFIG_CHELSIO_T1 is not set +CONFIG_CHELSIO_T3_DEPENDS=y  # CONFIG_CHELSIO_T3 is not set +# CONFIG_ENIC is not set  # CONFIG_IXGBE is not set  # CONFIG_IXGB is not set  # CONFIG_S2IO is not set  # CONFIG_MYRI10GE is not set  # CONFIG_NETXEN_NIC is not set  # CONFIG_NIU is not set +# CONFIG_MLX4_EN is not set  # CONFIG_MLX4_CORE is not set  # CONFIG_TEHUTI is not set +# CONFIG_BNX2X is not set +# CONFIG_QLGE is not set +# CONFIG_SFC is not set  # CONFIG_TR is not set  # @@ -618,6 +692,11 @@ CONFIG_NETDEV_10000=y  #  # CONFIG_WLAN_PRE80211 is not set  # CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +#  #  # USB Network Adapters @@ -626,7 +705,6 @@ CONFIG_NETDEV_10000=y  # CONFIG_USB_KAWETH is not set  # CONFIG_USB_PEGASUS is not set  # CONFIG_USB_RTL8150 is not set -# CONFIG_USB_USBNET_MII is not set  # CONFIG_USB_USBNET is not set  CONFIG_NET_PCMCIA=y  # CONFIG_PCMCIA_3C589 is not set @@ -654,7 +732,6 @@ CONFIG_PPPOE=m  # CONFIG_SLIP is not set  CONFIG_SLHC=m  # CONFIG_NET_FC is not set -# CONFIG_SHAPER is not set  # CONFIG_NETCONSOLE is not set  # CONFIG_NETPOLL is not set  # CONFIG_NET_POLL_CONTROLLER is not set @@ -676,7 +753,6 @@ CONFIG_INPUT_MOUSEDEV_PSAUX=y  CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024  CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768  # CONFIG_INPUT_JOYDEV is not set -# CONFIG_INPUT_TSDEV is not set  # CONFIG_INPUT_EVDEV is not set  # CONFIG_INPUT_EVBUG is not set @@ -699,11 +775,12 @@ CONFIG_MOUSE_PS2=y  CONFIG_MOUSE_PS2_ALPS=y  CONFIG_MOUSE_PS2_LOGIPS2PP=y  CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_LIFEBOOK=y  CONFIG_MOUSE_PS2_TRACKPOINT=y +# CONFIG_MOUSE_PS2_ELANTECH is not set  # CONFIG_MOUSE_PS2_TOUCHKIT is not set  CONFIG_MOUSE_SERIAL=y  # CONFIG_MOUSE_APPLETOUCH is not set +# CONFIG_MOUSE_BCM5974 is not set  # CONFIG_MOUSE_VSXXXAA is not set  CONFIG_MOUSE_HIL=y  # CONFIG_INPUT_JOYSTICK is not set @@ -729,10 +806,13 @@ CONFIG_SERIO_LIBPS2=y  # Character devices  #  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 +# CONFIG_NOZOMI is not set  #  # Serial drivers @@ -759,21 +839,16 @@ CONFIG_SERIAL_CORE=y  CONFIG_SERIAL_CORE_CONSOLE=y  # CONFIG_SERIAL_JSM is not set  CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set  CONFIG_LEGACY_PTYS=y  CONFIG_LEGACY_PTY_COUNT=64  CONFIG_PRINTER=m  # CONFIG_LP_CONSOLE is not set  CONFIG_PPDEV=m -# CONFIG_TIPAR is not set  # CONFIG_IPMI_HANDLER is not set -# CONFIG_WATCHDOG is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=y -CONFIG_GEN_RTC_X=y  # CONFIG_R3964 is not set  # CONFIG_APPLICOM is not set -# CONFIG_AGP is not set -# CONFIG_DRM is not set  #  # PCMCIA character devices @@ -781,60 +856,70 @@ CONFIG_GEN_RTC_X=y  # CONFIG_SYNCLINK_CS is not set  # CONFIG_CARDMAN_4000 is not set  # CONFIG_CARDMAN_4040 is not set +# CONFIG_IPWIRELESS is not set  # CONFIG_RAW_DRIVER is not set  # CONFIG_TCG_TPM is not set  CONFIG_DEVPORT=y  # CONFIG_I2C is not set - -# -# SPI support -#  # CONFIG_SPI is not set -# CONFIG_SPI_MASTER is not set  # CONFIG_W1 is not set  # 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 +CONFIG_SSB_POSSIBLE=y  #  # Sonics Silicon Backplane  # -CONFIG_SSB_POSSIBLE=y  # CONFIG_SSB is not set  #  # Multifunction device drivers  # +# CONFIG_MFD_CORE is not set  # CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_REGULATOR is not set  #  # Multimedia devices  # + +# +# Multimedia core support +#  # CONFIG_VIDEO_DEV is not set  # CONFIG_DVB_CORE is not set -# CONFIG_DAB is not set +# CONFIG_VIDEO_MEDIA is not set  # -# Graphics support +# Multimedia drivers  # -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +# CONFIG_DAB is not set  # -# Display device support +# Graphics support  # -# CONFIG_DISPLAY_SUPPORT is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set  # CONFIG_VGASTATE is not set  CONFIG_VIDEO_OUTPUT_CONTROL=m  CONFIG_FB=y  # CONFIG_FIRMWARE_EDID is not set  # CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT 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 is not set  # CONFIG_FB_SYS_FOPS is not set -CONFIG_FB_DEFERRED_IO=y  # CONFIG_FB_SVGALIB is not set  # CONFIG_FB_MACMODES is not set  # CONFIG_FB_BACKLIGHT is not set @@ -860,6 +945,7 @@ CONFIG_FB_STI=y  # CONFIG_FB_S3 is not set  # CONFIG_FB_SAVAGE is not set  # CONFIG_FB_SIS is not set +# CONFIG_FB_VIA is not set  # CONFIG_FB_NEOMAGIC is not set  # CONFIG_FB_KYRO is not set  # CONFIG_FB_3DFX is not set @@ -868,7 +954,16 @@ CONFIG_FB_STI=y  # CONFIG_FB_TRIDENT is not set  # CONFIG_FB_ARK is not set  # CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set  # CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set  #  # Console display driver support @@ -896,15 +991,8 @@ CONFIG_LOGO=y  # CONFIG_LOGO_LINUX_VGA16 is not set  # CONFIG_LOGO_LINUX_CLUT224 is not set  CONFIG_LOGO_PARISC_CLUT224=y - -# -# Sound -#  CONFIG_SOUND=y - -# -# Advanced Linux Sound Architecture -# +CONFIG_SOUND_OSS_CORE=y  CONFIG_SND=y  CONFIG_SND_TIMER=y  CONFIG_SND_PCM=y @@ -920,11 +1008,9 @@ CONFIG_SND_SUPPORT_OLD_API=y  CONFIG_SND_VERBOSE_PROCFS=y  # CONFIG_SND_VERBOSE_PRINTK is not set  # CONFIG_SND_DEBUG is not set - -# -# Generic devices -# +CONFIG_SND_VMASTER=y  CONFIG_SND_AC97_CODEC=y +CONFIG_SND_DRIVERS=y  # CONFIG_SND_DUMMY is not set  # CONFIG_SND_VIRMIDI is not set  # CONFIG_SND_MTPAV is not set @@ -932,10 +1018,8 @@ CONFIG_SND_AC97_CODEC=y  # CONFIG_SND_SERIAL_U16550 is not set  # CONFIG_SND_MPU401 is not set  # CONFIG_SND_PORTMAN2X4 is not set - -# -# PCI devices -# +# CONFIG_SND_AC97_POWER_SAVE is not set +CONFIG_SND_PCI=y  CONFIG_SND_AD1889=y  # CONFIG_SND_ALS300 is not set  # CONFIG_SND_ALI5451 is not set @@ -944,10 +1028,12 @@ CONFIG_SND_AD1889=y  # CONFIG_SND_AU8810 is not set  # CONFIG_SND_AU8820 is not set  # CONFIG_SND_AU8830 is not set +# CONFIG_SND_AW2 is not set  # CONFIG_SND_AZT3328 is not set  # CONFIG_SND_BT87X is not set  # CONFIG_SND_CA0106 is not set  # CONFIG_SND_CMIPCI is not set +# CONFIG_SND_OXYGEN is not set  # CONFIG_SND_CS4281 is not set  # CONFIG_SND_CS46XX is not set  # CONFIG_SND_DARLA20 is not set @@ -972,6 +1058,7 @@ CONFIG_SND_AD1889=y  # CONFIG_SND_HDA_INTEL is not set  # CONFIG_SND_HDSP is not set  # CONFIG_SND_HDSPM is not set +# CONFIG_SND_HIFIER is not set  # CONFIG_SND_ICE1712 is not set  # CONFIG_SND_ICE1724 is not set  # CONFIG_SND_INTEL8X0 is not set @@ -989,58 +1076,67 @@ CONFIG_SND_AD1889=y  # CONFIG_SND_TRIDENT is not set  # CONFIG_SND_VIA82XX is not set  # CONFIG_SND_VIA82XX_MODEM is not set +# CONFIG_SND_VIRTUOSO is not set  # CONFIG_SND_VX222 is not set  # CONFIG_SND_YMFPCI is not set -# CONFIG_SND_AC97_POWER_SAVE is not set - -# -# USB devices -# +CONFIG_SND_USB=y  # CONFIG_SND_USB_AUDIO is not set  # CONFIG_SND_USB_CAIAQ is not set - -# -# PCMCIA devices -# +CONFIG_SND_PCMCIA=y  # CONFIG_SND_VXPOCKET is not set  # CONFIG_SND_PDAUDIOCF is not set - -# -# GSC devices -# +CONFIG_SND_GSC=y  CONFIG_SND_HARMONY=y - -# -# System on Chip audio support -#  # CONFIG_SND_SOC is not set - -# -# SoC Audio support for SuperH -# - -# -# Open Sound System -#  # CONFIG_SOUND_PRIME is not set  CONFIG_AC97_BUS=y  CONFIG_HID_SUPPORT=y  CONFIG_HID=y  CONFIG_HID_DEBUG=y +# CONFIG_HIDRAW is not set  #  # USB Input Devices  #  CONFIG_USB_HID=y -# CONFIG_USB_HIDINPUT_POWERBOOK is not set -# CONFIG_HID_FF is not set +# CONFIG_HID_PID is not set  # CONFIG_USB_HIDDEV is not set + +# +# Special HID drivers +# +CONFIG_HID_COMPAT=y +CONFIG_HID_A4TECH=y +CONFIG_HID_APPLE=y +CONFIG_HID_BELKIN=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GYRATION=y +CONFIG_HID_LOGITECH=y +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_NTRIG=y +CONFIG_HID_PANTHERLORD=y +# CONFIG_PANTHERLORD_FF is not set +CONFIG_HID_PETALYNX=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_HID_SUNPLUS=y +# CONFIG_GREENASIA_FF is not set +CONFIG_HID_TOPSEED=y +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_ZEROPLUS_FF is not set  CONFIG_USB_SUPPORT=y  CONFIG_USB_ARCH_HAS_HCD=y  CONFIG_USB_ARCH_HAS_OHCI=y  CONFIG_USB_ARCH_HAS_EHCI=y  CONFIG_USB=y  # CONFIG_USB_DEBUG is not set +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set  #  # Miscellaneous USB options @@ -1049,12 +1145,18 @@ CONFIG_USB_DEVICEFS=y  CONFIG_USB_DEVICE_CLASS=y  # CONFIG_USB_DYNAMIC_MINORS is not set  # CONFIG_USB_OTG is not set +CONFIG_USB_MON=y +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set  #  # USB Host Controller Drivers  # +# CONFIG_USB_C67X00_HCD is not set  # CONFIG_USB_EHCI_HCD is not set +# CONFIG_USB_OXU210HP_HCD is not set  # CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_ISP1760_HCD is not set  CONFIG_USB_OHCI_HCD=y  # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set  # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set @@ -1062,19 +1164,23 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y  CONFIG_USB_UHCI_HCD=y  # CONFIG_USB_SL811_HCD is not set  # CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_WHCI_HCD is not set +# CONFIG_USB_HWA_HCD is not set  #  # USB Device Class drivers  #  # CONFIG_USB_ACM is not set  # CONFIG_USB_PRINTER is not set +# CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set  # -# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;  #  # -# may also be needed; see USB_STORAGE Help for more information +# see USB_STORAGE Help for more information  #  # CONFIG_USB_STORAGE is not set  # CONFIG_USB_LIBUSUAL is not set @@ -1084,16 +1190,11 @@ CONFIG_USB_UHCI_HCD=y  #  # CONFIG_USB_MDC800 is not set  # CONFIG_USB_MICROTEK is not set -CONFIG_USB_MON=y  #  # USB port drivers  #  # CONFIG_USB_USS720 is not set - -# -# USB Serial Converter support -#  # CONFIG_USB_SERIAL is not set  # @@ -1102,7 +1203,7 @@ CONFIG_USB_MON=y  # CONFIG_USB_EMI62 is not set  # CONFIG_USB_EMI26 is not set  # CONFIG_USB_ADUTUX is not set -# CONFIG_USB_AUERSWALD is not set +# CONFIG_USB_SEVSEG is not set  # CONFIG_USB_RIO500 is not set  # CONFIG_USB_LEGOTOWER is not set  # CONFIG_USB_LCD is not set @@ -1118,38 +1219,60 @@ CONFIG_USB_MON=y  # CONFIG_USB_TRANCEVIBRATOR is not set  # CONFIG_USB_IOWARRIOR is not set  # CONFIG_USB_TEST is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_VST is not set +# CONFIG_USB_GADGET is not set  # -# USB DSL modem support -# - -# -# USB Gadget Support +# OTG and related infrastructure  # -# CONFIG_USB_GADGET is not set +# CONFIG_UWB is not set  # CONFIG_MMC is not set +# CONFIG_MEMSTICK is not set  # CONFIG_NEW_LEDS is not set +# CONFIG_ACCESSIBILITY is not set  # CONFIG_INFINIBAND is not set -# CONFIG_RTC_CLASS is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_DEBUG is not set  # -# DMA Engine support +# RTC interfaces  # -# CONFIG_DMA_ENGINE is not set +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set +# CONFIG_RTC_DRV_TEST is not set  # -# DMA Clients +# SPI RTC drivers  #  # -# DMA Devices +# Platform RTC drivers  # -# CONFIG_AUXDISPLAY is not set +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set  # -# Userspace I/O +# on-CPU RTC drivers  # +CONFIG_RTC_DRV_PARISC=y +# CONFIG_DMADEVICES is not set +# CONFIG_AUXDISPLAY is not set  # CONFIG_UIO is not set +# CONFIG_STAGING is not set  #  # File systems @@ -1159,21 +1282,20 @@ CONFIG_EXT2_FS=y  # CONFIG_EXT2_FS_XIP is not set  CONFIG_EXT3_FS=y  # CONFIG_EXT3_FS_XATTR is not set -# CONFIG_EXT4DEV_FS is not set +# CONFIG_EXT4_FS is not set  CONFIG_JBD=y  # CONFIG_JBD_DEBUG is not set  # CONFIG_REISERFS_FS is not set  # CONFIG_JFS_FS is not set  CONFIG_FS_POSIX_ACL=y +CONFIG_FILE_LOCKING=y  # CONFIG_XFS_FS is not set -# CONFIG_GFS2_FS is not set  # CONFIG_OCFS2_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_ROMFS_FS is not set +# CONFIG_BTRFS_FS is not set +CONFIG_DNOTIFY=y  CONFIG_INOTIFY=y  CONFIG_INOTIFY_USER=y  # CONFIG_QUOTA is not set -CONFIG_DNOTIFY=y  CONFIG_AUTOFS_FS=y  # CONFIG_AUTOFS4_FS is not set  # CONFIG_FUSE_FS is not set @@ -1202,16 +1324,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"  CONFIG_PROC_FS=y  CONFIG_PROC_KCORE=y  CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y  CONFIG_SYSFS=y  CONFIG_TMPFS=y  # CONFIG_TMPFS_POSIX_ACL is not set  # CONFIG_HUGETLB_PAGE is not set -CONFIG_RAMFS=y  # CONFIG_CONFIGFS_FS is not set - -# -# Miscellaneous filesystems -# +CONFIG_MISC_FILESYSTEMS=y  # CONFIG_ADFS_FS is not set  # CONFIG_AFFS_FS is not set  # CONFIG_ECRYPT_FS is not set @@ -1221,33 +1340,32 @@ CONFIG_RAMFS=y  # CONFIG_BFS_FS is not set  # CONFIG_EFS_FS is not set  # CONFIG_CRAMFS is not set +# CONFIG_SQUASHFS 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  # CONFIG_SYSV_FS is not set  # CONFIG_UFS_FS is not set - -# -# Network File Systems -# +CONFIG_NETWORK_FILESYSTEMS=y  CONFIG_NFS_FS=y  CONFIG_NFS_V3=y  # CONFIG_NFS_V3_ACL is not set  # CONFIG_NFS_V4 is not set -# CONFIG_NFS_DIRECTIO is not set +CONFIG_ROOT_NFS=y  CONFIG_NFSD=y  CONFIG_NFSD_V3=y  # CONFIG_NFSD_V3_ACL is not set  CONFIG_NFSD_V4=y -CONFIG_NFSD_TCP=y -CONFIG_ROOT_NFS=y  CONFIG_LOCKD=y  CONFIG_LOCKD_V4=y  CONFIG_EXPORTFS=y  CONFIG_NFS_COMMON=y  CONFIG_SUNRPC=y  CONFIG_SUNRPC_GSS=y -# CONFIG_SUNRPC_BIND34 is not set +# CONFIG_SUNRPC_REGISTER_V4 is not set  CONFIG_RPCSEC_GSS_KRB5=y  CONFIG_RPCSEC_GSS_SPKM3=m  CONFIG_SMB_FS=m @@ -1256,6 +1374,7 @@ CONFIG_SMB_NLS_REMOTE="cp437"  CONFIG_CIFS=m  # CONFIG_CIFS_STATS is not set  # CONFIG_CIFS_WEAK_PW_HASH is not set +# CONFIG_CIFS_UPCALL is not set  # CONFIG_CIFS_XATTR is not set  # CONFIG_CIFS_DEBUG2 is not set  # CONFIG_CIFS_EXPERIMENTAL is not set @@ -1268,10 +1387,6 @@ CONFIG_CIFS=m  #  # CONFIG_PARTITION_ADVANCED is not set  CONFIG_MSDOS_PARTITION=y - -# -# Native Language Support -#  CONFIG_NLS=y  CONFIG_NLS_DEFAULT="iso8859-1"  CONFIG_NLS_CODEPAGE_437=y @@ -1312,33 +1427,28 @@ CONFIG_NLS_ISO8859_15=m  CONFIG_NLS_KOI8_R=m  CONFIG_NLS_KOI8_U=m  CONFIG_NLS_UTF8=y - -# -# Distributed Lock Manager -#  # CONFIG_DLM is not set  # -# Profiling support -# -CONFIG_PROFILING=y -CONFIG_OPROFILE=m - -#  # Kernel hacking  #  # CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y  CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024  CONFIG_MAGIC_SYSRQ=y  # CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_DEBUG_FS is not set +CONFIG_DEBUG_FS=y  CONFIG_HEADERS_CHECK=y  CONFIG_DEBUG_KERNEL=y  # CONFIG_DEBUG_SHIRQ is not set  CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0  CONFIG_SCHED_DEBUG=y  # CONFIG_SCHEDSTATS is not set  # CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set  # CONFIG_DEBUG_SLAB is not set  # CONFIG_DEBUG_RT_MUTEXES is not set  # CONFIG_RT_MUTEX_TESTER is not set @@ -1350,10 +1460,33 @@ CONFIG_DEBUG_MUTEXES=y  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_FORCED_INLINING=y +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_BOOT_PRINTK_DELAY is not set  # CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set  # CONFIG_FAULT_INJECTION is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_NOP_TRACER=y +CONFIG_RING_BUFFER=y +CONFIG_TRACING=y + +# +# Tracers +# +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_TRACE_BRANCH_PROFILING is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_BUILD_DOCSRC is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set  # CONFIG_DEBUG_RODATA is not set  # @@ -1362,56 +1495,112 @@ CONFIG_FORCED_INLINING=y  CONFIG_KEYS=y  CONFIG_KEYS_DEBUG_PROC_KEYS=y  # CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set  CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set  CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y  CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y  CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y  CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_NULL=m +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_AUTHENC=y +CONFIG_CRYPTO_TEST=m + +# +# Authenticated Encryption with Associated Data +# +# CONFIG_CRYPTO_CCM is not set +# CONFIG_CRYPTO_GCM is not set +# CONFIG_CRYPTO_SEQIV is not set + +# +# Block modes +# +CONFIG_CRYPTO_CBC=y +# CONFIG_CRYPTO_CTR is not set +# CONFIG_CRYPTO_CTS is not set +# CONFIG_CRYPTO_ECB is not set +# CONFIG_CRYPTO_LRW is not set +# CONFIG_CRYPTO_PCBC is not set +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +#  CONFIG_CRYPTO_HMAC=y  # CONFIG_CRYPTO_XCBC is not set -CONFIG_CRYPTO_NULL=m + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=m  CONFIG_CRYPTO_MD4=m  CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_MICHAEL_MIC=m +# 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=y  CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m -CONFIG_CRYPTO_WP512=m  CONFIG_CRYPTO_TGR192=m -# CONFIG_CRYPTO_GF128MUL is not set -# CONFIG_CRYPTO_ECB is not set -CONFIG_CRYPTO_CBC=y -# CONFIG_CRYPTO_PCBC is not set -# CONFIG_CRYPTO_LRW is not set -# CONFIG_CRYPTO_XTS is not set -# CONFIG_CRYPTO_CRYPTD is not set -CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_FCRYPT is not set -CONFIG_CRYPTO_BLOWFISH=m -CONFIG_CRYPTO_TWOFISH=m -CONFIG_CRYPTO_TWOFISH_COMMON=m -CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_WP512=m + +# +# Ciphers +#  CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_BLOWFISH=m +# CONFIG_CRYPTO_CAMELLIA is not set  CONFIG_CRYPTO_CAST5=m  CONFIG_CRYPTO_CAST6=m -CONFIG_CRYPTO_TEA=m -CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set  CONFIG_CRYPTO_KHAZAD=m -CONFIG_CRYPTO_ANUBIS=m +# CONFIG_CRYPTO_SALSA20 is not set  # CONFIG_CRYPTO_SEED is not set +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_TWOFISH_COMMON=m + +# +# Compression +#  CONFIG_CRYPTO_DEFLATE=y -CONFIG_CRYPTO_MICHAEL_MIC=m -CONFIG_CRYPTO_CRC32C=m -# CONFIG_CRYPTO_CAMELLIA is not set -CONFIG_CRYPTO_TEST=m -# CONFIG_CRYPTO_AUTHENC is not set +# CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set  # CONFIG_CRYPTO_HW is not set  #  # Library routines  #  CONFIG_BITREVERSE=y +CONFIG_GENERIC_FIND_LAST_BIT=y  CONFIG_CRC_CCITT=m  # CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set  # CONFIG_CRC_ITU_T is not set  CONFIG_CRC32=y  # CONFIG_CRC7 is not set diff --git a/arch/parisc/hpux/fs.c b/arch/parisc/hpux/fs.c index bd9a4db3bd4..5cbe9f9e5d9 100644 --- a/arch/parisc/hpux/fs.c +++ b/arch/parisc/hpux/fs.c @@ -137,7 +137,6 @@ int hpux_getdents(unsigned int fd, struct hpux_dirent __user *dirent, unsigned i  			error = count - buf.count;  	} -out_putf:  	fput(file);  out:  	return error; diff --git a/arch/parisc/include/asm/assembly.h b/arch/parisc/include/asm/assembly.h index ffb208840ec..89fb40005e3 100644 --- a/arch/parisc/include/asm/assembly.h +++ b/arch/parisc/include/asm/assembly.h @@ -79,6 +79,7 @@  #include <asm/asm-offsets.h>  #include <asm/page.h> +#include <asm/types.h>  #include <asm/asmregs.h> @@ -129,27 +130,27 @@  	/* Shift Left - note the r and t can NOT be the same! */  	.macro shl r, sa, t -	dep,z	\r, 31-\sa, 32-\sa, \t +	dep,z	\r, 31-(\sa), 32-(\sa), \t  	.endm  	/* The PA 2.0 shift left */  	.macro shlw r, sa, t -	depw,z	\r, 31-\sa, 32-\sa, \t +	depw,z	\r, 31-(\sa), 32-(\sa), \t  	.endm  	/* And the PA 2.0W shift left */  	.macro shld r, sa, t -	depd,z	\r, 63-\sa, 64-\sa, \t +	depd,z	\r, 63-(\sa), 64-(\sa), \t  	.endm  	/* Shift Right - note the r and t can NOT be the same! */  	.macro shr r, sa, t -	extru \r, 31-\sa, 32-\sa, \t +	extru \r, 31-(\sa), 32-(\sa), \t  	.endm  	/* pa20w version of shift right */  	.macro shrd r, sa, t -	extrd,u \r, 63-\sa, 64-\sa, \t +	extrd,u \r, 63-(\sa), 64-(\sa), \t  	.endm  	/* load 32-bit 'value' into 'reg' compensating for the ldil diff --git a/arch/parisc/include/asm/io.h b/arch/parisc/include/asm/io.h index d3031d1f9d0..1f6d2ae7aba 100644 --- a/arch/parisc/include/asm/io.h +++ b/arch/parisc/include/asm/io.h @@ -174,15 +174,48 @@ static inline void __raw_writeq(unsigned long long b, volatile void __iomem *add  	*(volatile unsigned long long __force *) addr = b;  } -/* readb can never be const, so use __fswab instead of le*_to_cpu */ -#define readb(addr) __raw_readb(addr) -#define readw(addr) le16_to_cpu(__raw_readw(addr)) -#define readl(addr) le32_to_cpu(__raw_readl(addr)) -#define readq(addr) le64_to_cpu(__raw_readq(addr)) -#define writeb(b, addr) __raw_writeb(b, addr) -#define writew(b, addr) __raw_writew(cpu_to_le16(b), addr) -#define writel(b, addr) __raw_writel(cpu_to_le32(b), addr) -#define writeq(b, addr) __raw_writeq(cpu_to_le64(b), addr) +static inline unsigned char readb(const volatile void __iomem *addr) +{ +	return __raw_readb(addr); +} +static inline unsigned short readw(const volatile void __iomem *addr) +{ +	return le16_to_cpu(__raw_readw(addr)); +} +static inline unsigned int readl(const volatile void __iomem *addr) +{ +	return le32_to_cpu(__raw_readl(addr)); +} +static inline unsigned long long readq(const volatile void __iomem *addr) +{ +	return le64_to_cpu(__raw_readq(addr)); +} + +static inline void writeb(unsigned char b, volatile void __iomem *addr) +{ +	__raw_writeb(b, addr); +} +static inline void writew(unsigned short w, volatile void __iomem *addr) +{ +	__raw_writew(cpu_to_le16(w), addr); +} +static inline void writel(unsigned int l, volatile void __iomem *addr) +{ +	__raw_writel(cpu_to_le32(l), addr); +} +static inline void writeq(unsigned long long q, volatile void __iomem *addr) +{ +	__raw_writeq(cpu_to_le64(q), addr); +} + +#define	readb	readb +#define	readw	readw +#define	readl	readl +#define readq	readq +#define writeb	writeb +#define writew	writew +#define writel	writel +#define writeq	writeq  #define readb_relaxed(addr) readb(addr)  #define readw_relaxed(addr) readw(addr) diff --git a/arch/parisc/include/asm/irq.h b/arch/parisc/include/asm/irq.h index 399c81981ed..dfa26b67f91 100644 --- a/arch/parisc/include/asm/irq.h +++ b/arch/parisc/include/asm/irq.h @@ -49,7 +49,7 @@ extern unsigned long txn_alloc_addr(unsigned int);  extern unsigned long txn_affinity_addr(unsigned int irq, int cpu);  extern int cpu_claim_irq(unsigned int irq, struct irq_chip *, void *); -extern int cpu_check_affinity(unsigned int irq, cpumask_t *dest); +extern int cpu_check_affinity(unsigned int irq, const struct cpumask *dest);  /* soft power switch support (power.c) */  extern struct tasklet_struct power_tasklet; diff --git a/arch/parisc/include/asm/uaccess.h b/arch/parisc/include/asm/uaccess.h index 1c6dbb6f6e5..cd4c0b2a8e7 100644 --- a/arch/parisc/include/asm/uaccess.h +++ b/arch/parisc/include/asm/uaccess.h @@ -241,6 +241,7 @@ unsigned long copy_in_user(void __user *dst, const void __user *src, unsigned lo  #define __copy_to_user_inatomic __copy_to_user  #define __copy_from_user_inatomic __copy_from_user +struct pt_regs;  int fixup_exception(struct pt_regs *regs);  #endif /* __PARISC_UACCESS_H */ diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index 5259d8c2067..837530ea32e 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c @@ -551,10 +551,7 @@ void flush_cache_range(struct vm_area_struct *vma,  {  	int sr3; -	if (!vma->vm_mm->context) { -		BUG(); -		return; -	} +	BUG_ON(!vma->vm_mm->context);  	sr3 = mfsp(3);  	if (vma->vm_mm->context == sr3) { diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index d1fa4edd2d8..0db9fdcb770 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S @@ -368,7 +368,7 @@  	 * abstractions for the macros */  	.macro		EXTR	reg1,start,length,reg2  #ifdef CONFIG_64BIT -	extrd,u		\reg1,32+\start,\length,\reg2 +	extrd,u		\reg1,32+(\start),\length,\reg2  #else  	extrw,u		\reg1,\start,\length,\reg2  #endif @@ -376,7 +376,7 @@  	.macro		DEP	reg1,start,length,reg2  #ifdef CONFIG_64BIT -	depd		\reg1,32+\start,\length,\reg2 +	depd		\reg1,32+(\start),\length,\reg2  #else  	depw		\reg1,\start,\length,\reg2  #endif @@ -384,7 +384,7 @@  	.macro		DEPI	val,start,length,reg  #ifdef CONFIG_64BIT -	depdi		\val,32+\start,\length,\reg +	depdi		\val,32+(\start),\length,\reg  #else  	depwi		\val,\start,\length,\reg  #endif diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 03f26bd75bd..f6d241238a7 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c @@ -151,7 +151,7 @@ static void convert_to_wide(unsigned long *addr)  }  #ifdef CONFIG_64BIT -void __init set_firmware_width_unlocked(void) +void __cpuinit set_firmware_width_unlocked(void)  {  	int ret; @@ -168,7 +168,7 @@ void __init set_firmware_width_unlocked(void)   * This function must be called before any pdc_* function that uses the   * convert_to_wide function.   */ -void __init set_firmware_width(void) +void __cpuinit set_firmware_width(void)  {  	unsigned long flags;  	spin_lock_irqsave(&pdc_lock, flags); @@ -176,11 +176,11 @@ void __init set_firmware_width(void)  	spin_unlock_irqrestore(&pdc_lock, flags);  }  #else -void __init set_firmware_width_unlocked(void) { +void __cpuinit set_firmware_width_unlocked(void) {  	return;  } -void __init set_firmware_width(void) { +void __cpuinit set_firmware_width(void) {  	return;  }  #endif /*CONFIG_64BIT*/ @@ -302,7 +302,7 @@ int pdc_chassis_warn(unsigned long *warn)  	return retval;  } -int __init pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info) +int __cpuinit pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)  {  	int ret; @@ -323,7 +323,7 @@ int __init pdc_coproc_cfg_unlocked(struct pdc_coproc_cfg *pdc_coproc_info)   * This PDC call returns the presence and status of all the coprocessors   * attached to the processor.   */ -int __init pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info) +int __cpuinit pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)  {  	int ret;  	unsigned long flags; diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index ac2c822928c..29e70e16ede 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c @@ -112,7 +112,7 @@ void cpu_end_irq(unsigned int irq)  }  #ifdef CONFIG_SMP -int cpu_check_affinity(unsigned int irq, cpumask_t *dest) +int cpu_check_affinity(unsigned int irq, const struct cpumask *dest)  {  	int cpu_dest; @@ -120,23 +120,25 @@ int cpu_check_affinity(unsigned int irq, cpumask_t *dest)  	if (CHECK_IRQ_PER_CPU(irq)) {  		/* Bad linux design decision.  The mask has already  		 * been set; we must reset it */ -		irq_desc[irq].affinity = CPU_MASK_ALL; +		cpumask_setall(&irq_desc[irq].affinity);  		return -EINVAL;  	}  	/* whatever mask they set, we just allow one CPU */  	cpu_dest = first_cpu(*dest); -	*dest = cpumask_of_cpu(cpu_dest); -	return 0; +	return cpu_dest;  }  static void cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest)  { -	if (cpu_check_affinity(irq, dest)) +	int cpu_dest; + +	cpu_dest = cpu_check_affinity(irq, dest); +	if (cpu_dest < 0)  		return; -	irq_desc[irq].affinity = *dest; +	cpumask_copy(&irq_desc[irq].affinity, &cpumask_of_cpu(cpu_dest));  }  #endif @@ -295,7 +297,7 @@ int txn_alloc_irq(unsigned int bits_wide)  unsigned long txn_affinity_addr(unsigned int irq, int cpu)  {  #ifdef CONFIG_SMP -	irq_desc[irq].affinity = cpumask_of_cpu(cpu); +	cpumask_copy(&irq_desc[irq].affinity, cpumask_of(cpu));  #endif  	return per_cpu(cpu_data, cpu).txn_addr; @@ -352,7 +354,7 @@ void do_cpu_irq_mask(struct pt_regs *regs)  	irq = eirr_to_irq(eirr_val);  #ifdef CONFIG_SMP -	dest = irq_desc[irq].affinity; +	cpumask_copy(&dest, &irq_desc[irq].affinity);  	if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) &&  	    !cpu_isset(smp_processor_id(), dest)) {  		int cpu = first_cpu(dest); diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c index df47895db82..7d927eac932 100644 --- a/arch/parisc/kernel/pci-dma.c +++ b/arch/parisc/kernel/pci-dma.c @@ -447,10 +447,7 @@ static void pa11_dma_free_consistent (struct device *dev, size_t size, void *vad  static dma_addr_t pa11_dma_map_single(struct device *dev, void *addr, size_t size, enum dma_data_direction direction)  { -	if (direction == DMA_NONE) { -		printk(KERN_ERR "pa11_dma_map_single(PCI_DMA_NONE) called by %p\n", __builtin_return_address(0)); -		BUG(); -	} +	BUG_ON(direction == DMA_NONE);  	flush_kernel_dcache_range((unsigned long) addr, size);  	return virt_to_phys(addr); @@ -458,10 +455,7 @@ static dma_addr_t pa11_dma_map_single(struct device *dev, void *addr, size_t siz  static void pa11_dma_unmap_single(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)  { -	if (direction == DMA_NONE) { -		printk(KERN_ERR "pa11_dma_unmap_single(PCI_DMA_NONE) called by %p\n", __builtin_return_address(0)); -		BUG(); -	} +	BUG_ON(direction == DMA_NONE);  	if (direction == DMA_TO_DEVICE)  	    return; @@ -480,8 +474,7 @@ static int pa11_dma_map_sg(struct device *dev, struct scatterlist *sglist, int n  {  	int i; -	if (direction == DMA_NONE) -	    BUG(); +	BUG_ON(direction == DMA_NONE);  	for (i = 0; i < nents; i++, sglist++ ) {  		unsigned long vaddr = sg_virt_addr(sglist); @@ -496,8 +489,7 @@ static void pa11_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, in  {  	int i; -	if (direction == DMA_NONE) -	    BUG(); +	BUG_ON(direction == DMA_NONE);  	if (direction == DMA_TO_DEVICE)  	    return; @@ -511,16 +503,14 @@ static void pa11_dma_unmap_sg(struct device *dev, struct scatterlist *sglist, in  static void pa11_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction)  { -	if (direction == DMA_NONE) -	    BUG(); +	BUG_ON(direction == DMA_NONE);  	flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size);  }  static void pa11_dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, unsigned long offset, size_t size, enum dma_data_direction direction)  { -	if (direction == DMA_NONE) -	    BUG(); +	BUG_ON(direction == DMA_NONE);  	flush_kernel_dcache_range((unsigned long) phys_to_virt(dma_handle) + offset, size);  } diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c index 7c155c254e7..9d704d9831d 100644 --- a/arch/parisc/mm/init.c +++ b/arch/parisc/mm/init.c @@ -304,10 +304,8 @@ static void __init setup_bootmem(void)  	 */  	max_low_pfn = max_pfn; -	if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) { -		printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n"); -		BUG(); -	} +	/* bootmap sizing messed up? */ +	BUG_ON((bootmap_pfn - bootmap_start_pfn) != bootmap_pages);  	/* reserve PAGE0 pdc memory, kernel text/data/bss & bootmap */ diff --git a/arch/powerpc/configs/40x/virtex_defconfig b/arch/powerpc/configs/40x/virtex_defconfig index b6888384dd7..f5698f962e5 100644 --- a/arch/powerpc/configs/40x/virtex_defconfig +++ b/arch/powerpc/configs/40x/virtex_defconfig @@ -686,7 +686,7 @@ CONFIG_SERIAL_UARTLITE_CONSOLE=y  CONFIG_SERIAL_CORE=y  CONFIG_SERIAL_CORE_CONSOLE=y  # CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_OF_PLATFORM is not set +CONFIG_SERIAL_OF_PLATFORM=y  # CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set  CONFIG_UNIX98_PTYS=y  # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set diff --git a/arch/powerpc/configs/44x/virtex5_defconfig b/arch/powerpc/configs/44x/virtex5_defconfig index 15aab1ca638..1bf0a63614b 100644 --- a/arch/powerpc/configs/44x/virtex5_defconfig +++ b/arch/powerpc/configs/44x/virtex5_defconfig @@ -691,7 +691,7 @@ CONFIG_SERIAL_UARTLITE_CONSOLE=y  CONFIG_SERIAL_CORE=y  CONFIG_SERIAL_CORE_CONSOLE=y  # CONFIG_SERIAL_JSM is not set -# CONFIG_SERIAL_OF_PLATFORM is not set +CONFIG_SERIAL_OF_PLATFORM=y  # CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL is not set  CONFIG_UNIX98_PTYS=y  # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set diff --git a/arch/powerpc/configs/linkstation_defconfig b/arch/powerpc/configs/linkstation_defconfig index aa5855a156d..15900dcf0bf 100644 --- a/arch/powerpc/configs/linkstation_defconfig +++ b/arch/powerpc/configs/linkstation_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.29-rc2 -# Mon Jan 26 15:35:29 2009 +# Linux kernel version: 2.6.29-rc6 +# Fri Mar  6 00:07:38 2009  #  # CONFIG_PPC64 is not set @@ -71,6 +71,15 @@ CONFIG_POSIX_MQUEUE=y  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  CONFIG_IKCONFIG=y  CONFIG_IKCONFIG_PROC=y  CONFIG_LOG_BUF_SHIFT=14 @@ -88,6 +97,7 @@ CONFIG_NAMESPACES=y  # CONFIG_IPC_NS is not set  # CONFIG_USER_NS is not set  # CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y  CONFIG_INITRAMFS_SOURCE=""  CONFIG_CC_OPTIMIZE_FOR_SIZE=y @@ -153,11 +163,6 @@ CONFIG_DEFAULT_AS=y  # CONFIG_DEFAULT_CFQ is not set  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="anticipatory" -CONFIG_CLASSIC_RCU=y -# CONFIG_TREE_RCU is not set -# CONFIG_PREEMPT_RCU is not set -# CONFIG_TREE_RCU_TRACE is not set -# CONFIG_PREEMPT_RCU_TRACE is not set  # CONFIG_FREEZER is not set  # @@ -294,7 +299,6 @@ CONFIG_NET=y  #  # Networking options  # -# CONFIG_NET_NS is not set  CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_PACKET=y  CONFIG_PACKET_MMAP=y @@ -508,8 +512,8 @@ CONFIG_MTD_CONCAT=y  CONFIG_MTD_PARTITIONS=y  # CONFIG_MTD_TESTS is not set  # CONFIG_MTD_REDBOOT_PARTS is not set -# CONFIG_MTD_CMDLINE_PARTS is not set -# CONFIG_MTD_OF_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +CONFIG_MTD_OF_PARTS=y  # CONFIG_MTD_AR7_PARTS is not set  # @@ -587,7 +591,6 @@ CONFIG_MTD_PHYSMAP=y  # LPDDR flash memory drivers  #  # CONFIG_MTD_LPDDR is not set -# CONFIG_MTD_QINFO_PROBE is not set  #  # UBI - Unsorted block images @@ -617,13 +620,19 @@ CONFIG_BLK_DEV_RAM_SIZE=8192  # CONFIG_BLK_DEV_HD is not set  CONFIG_MISC_DEVICES=y  # CONFIG_PHANTOM is not set -# CONFIG_EEPROM_93CX6 is not set  # CONFIG_SGI_IOC4 is not set  # CONFIG_TIFM_CORE is not set  # CONFIG_ICS932S401 is not set  # CONFIG_ENCLOSURE_SERVICES is not set  # CONFIG_HP_ILO is not set  # CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +CONFIG_EEPROM_LEGACY=m +# CONFIG_EEPROM_93CX6 is not set  CONFIG_HAVE_IDE=y  # CONFIG_IDE is not set @@ -839,6 +848,7 @@ CONFIG_R8169=y  # CONFIG_QLA3XXX is not set  # CONFIG_ATL1 is not set  # CONFIG_ATL1E is not set +# CONFIG_ATL1C is not set  # CONFIG_JME is not set  CONFIG_NETDEV_10000=y  # CONFIG_CHELSIO_T1 is not set @@ -1037,8 +1047,6 @@ CONFIG_I2C_MPC=y  # Miscellaneous I2C Chip support  #  # CONFIG_DS1682 is not set -# CONFIG_EEPROM_AT24 is not set -CONFIG_EEPROM_LEGACY=m  # CONFIG_SENSORS_PCF8574 is not set  # CONFIG_PCF8575 is not set  # CONFIG_SENSORS_PCA9539 is not set diff --git a/arch/powerpc/configs/ps3_defconfig b/arch/powerpc/configs/ps3_defconfig index b6eee7c93cd..ac14f5245d2 100644 --- a/arch/powerpc/configs/ps3_defconfig +++ b/arch/powerpc/configs/ps3_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.27-rc3 -# Wed Aug 20 08:16:53 2008 +# Linux kernel version: 2.6.29-rc8 +# Fri Mar 13 09:28:45 2009  #  CONFIG_PPC64=y @@ -16,13 +16,14 @@ CONFIG_PPC_FPU=y  CONFIG_ALTIVEC=y  # CONFIG_VSX is not set  CONFIG_PPC_STD_MMU=y +CONFIG_PPC_STD_MMU_64=y  CONFIG_PPC_MM_SLICES=y  CONFIG_VIRT_CPU_ACCOUNTING=y  CONFIG_SMP=y  CONFIG_NR_CPUS=2  CONFIG_64BIT=y  CONFIG_WORD_SIZE=64 -CONFIG_PPC_MERGE=y +CONFIG_ARCH_PHYS_ADDR_T_64BIT=y  CONFIG_MMU=y  CONFIG_GENERIC_CMOS_UPDATE=y  CONFIG_GENERIC_TIME=y @@ -46,7 +47,7 @@ CONFIG_PPC=y  CONFIG_EARLY_PRINTK=y  CONFIG_COMPAT=y  CONFIG_SYSVIPC_COMPAT=y -CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y +CONFIG_SCHED_OMIT_FRAME_POINTER=y  CONFIG_ARCH_MAY_HAVE_PC_FDC=y  CONFIG_PPC_OF=y  CONFIG_OF=y @@ -74,10 +75,19 @@ CONFIG_POSIX_MQUEUE=y  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  # CONFIG_IKCONFIG is not set  CONFIG_LOG_BUF_SHIFT=17 -# CONFIG_CGROUPS is not set  # CONFIG_GROUP_SCHED is not set +# CONFIG_CGROUPS is not set  CONFIG_SYSFS_DEPRECATED=y  CONFIG_SYSFS_DEPRECATED_V2=y  # CONFIG_RELAY is not set @@ -86,11 +96,13 @@ CONFIG_NAMESPACES=y  # CONFIG_IPC_NS is not set  # CONFIG_USER_NS is not set  # CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y  CONFIG_INITRAMFS_SOURCE=""  CONFIG_CC_OPTIMIZE_FOR_SIZE=y  CONFIG_SYSCTL=y -# CONFIG_EMBEDDED is not set +CONFIG_ANON_INODES=y +CONFIG_EMBEDDED=y  CONFIG_SYSCTL_SYSCALL=y  CONFIG_KALLSYMS=y  CONFIG_KALLSYMS_ALL=y @@ -99,37 +111,36 @@ CONFIG_HOTPLUG=y  CONFIG_PRINTK=y  CONFIG_BUG=y  CONFIG_ELF_CORE=y -# CONFIG_COMPAT_BRK is not set  CONFIG_BASE_FULL=y  CONFIG_FUTEX=y -CONFIG_ANON_INODES=y  CONFIG_EPOLL=y  CONFIG_SIGNALFD=y  CONFIG_TIMERFD=y  CONFIG_EVENTFD=y  CONFIG_SHMEM=y +CONFIG_AIO=y  CONFIG_VM_EVENT_COUNTERS=y +# CONFIG_COMPAT_BRK is not set  CONFIG_SLAB=y  # CONFIG_SLUB is not set  # CONFIG_SLOB is not set  CONFIG_PROFILING=y -# CONFIG_MARKERS is not set +CONFIG_TRACEPOINTS=y +CONFIG_MARKERS=y  CONFIG_OPROFILE=m  CONFIG_HAVE_OPROFILE=y  # CONFIG_KPROBES is not set  CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_HAVE_SYSCALL_WRAPPERS=y  CONFIG_HAVE_IOREMAP_PROT=y  CONFIG_HAVE_KPROBES=y  CONFIG_HAVE_KRETPROBES=y  CONFIG_HAVE_ARCH_TRACEHOOK=y  CONFIG_HAVE_DMA_ATTRS=y  CONFIG_USE_GENERIC_SMP_HELPERS=y -# 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  CONFIG_BASE_SMALL=0  CONFIG_MODULES=y  # CONFIG_MODULE_FORCE_LOAD is not set @@ -137,7 +148,6 @@ CONFIG_MODULE_UNLOAD=y  # CONFIG_MODULE_FORCE_UNLOAD is not set  # CONFIG_MODVERSIONS is not set  # CONFIG_MODULE_SRCVERSION_ALL is not set -CONFIG_KMOD=y  CONFIG_STOP_MACHINE=y  CONFIG_BLOCK=y  # CONFIG_BLK_DEV_IO_TRACE is not set @@ -157,7 +167,7 @@ CONFIG_DEFAULT_AS=y  # CONFIG_DEFAULT_CFQ is not set  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="anticipatory" -CONFIG_CLASSIC_RCU=y +# CONFIG_FREEZER is not set  #  # Platform support @@ -183,18 +193,20 @@ CONFIG_PS3_STORAGE=y  CONFIG_PS3_DISK=y  CONFIG_PS3_ROM=y  CONFIG_PS3_FLASH=y -CONFIG_OPROFILE_PS3=y +CONFIG_PS3_VRAM=m  CONFIG_PS3_LPM=m  CONFIG_PPC_CELL=y  # CONFIG_PPC_CELL_NATIVE is not set  # CONFIG_PPC_IBM_CELL_BLADE is not set  # CONFIG_PPC_CELLEB is not set +# CONFIG_PPC_CELL_QPACE is not set  #  # Cell Broadband Engine options  #  CONFIG_SPU_FS=y  CONFIG_SPU_FS_64K_LS=y +# CONFIG_SPU_TRACE is not set  CONFIG_SPU_BASE=y  # CONFIG_PQ2ADS is not set  # CONFIG_IPIC is not set @@ -210,6 +222,7 @@ CONFIG_SPU_BASE=y  # CONFIG_GENERIC_IOMAP is not set  # CONFIG_CPU_FREQ is not set  # CONFIG_FSL_ULI1575 is not set +# CONFIG_SIMPLE_GPIO is not set  #  # Kernel options @@ -229,6 +242,8 @@ CONFIG_PREEMPT_NONE=y  # CONFIG_PREEMPT is not set  CONFIG_BINFMT_ELF=y  CONFIG_COMPAT_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +# CONFIG_HAVE_AOUT is not set  CONFIG_BINFMT_MISC=y  CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y  # CONFIG_IOMMU_VMERGE is not set @@ -251,7 +266,6 @@ CONFIG_SELECT_MEMORY_MODEL=y  CONFIG_SPARSEMEM_MANUAL=y  CONFIG_SPARSEMEM=y  CONFIG_HAVE_MEMORY_PRESENT=y -# CONFIG_SPARSEMEM_STATIC is not set  CONFIG_SPARSEMEM_EXTREME=y  CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y  # CONFIG_SPARSEMEM_VMEMMAP is not set @@ -261,11 +275,14 @@ CONFIG_MEMORY_HOTPLUG_SPARSE=y  CONFIG_PAGEFLAGS_EXTENDED=y  CONFIG_SPLIT_PTLOCK_CPUS=4  CONFIG_MIGRATION=y -CONFIG_RESOURCES_64BIT=y +CONFIG_PHYS_ADDR_T_64BIT=y  CONFIG_ZONE_DMA_FLAG=1  CONFIG_BOUNCE=y +CONFIG_UNEVICTABLE_LRU=y  CONFIG_ARCH_MEMORY_PROBE=y  CONFIG_PPC_HAS_HASH_64K=y +CONFIG_PPC_4K_PAGES=y +# CONFIG_PPC_16K_PAGES is not set  # CONFIG_PPC_64K_PAGES is not set  CONFIG_FORCE_MAX_ZONEORDER=13  CONFIG_SCHED_SMT=y @@ -299,6 +316,7 @@ CONFIG_NET=y  #  # Networking options  # +CONFIG_COMPAT_NET_DEV_OPS=y  CONFIG_PACKET=y  CONFIG_PACKET_MMAP=y  CONFIG_UNIX=y @@ -361,6 +379,7 @@ CONFIG_IPV6_NDISC_NODETYPE=y  # CONFIG_TIPC is not set  # CONFIG_ATM is not set  # CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set  # CONFIG_VLAN_8021Q is not set  # CONFIG_DECNET is not set  # CONFIG_LLC2 is not set @@ -371,6 +390,7 @@ CONFIG_IPV6_NDISC_NODETYPE=y  # CONFIG_ECONET is not set  # CONFIG_WAN_ROUTER is not set  # CONFIG_NET_SCHED is not set +# CONFIG_DCB is not set  #  # Network testing @@ -392,39 +412,37 @@ CONFIG_BT_HIDP=m  #  # Bluetooth device drivers  # -CONFIG_BT_HCIUSB=m -CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIBTUSB=m  # CONFIG_BT_HCIUART is not set  # CONFIG_BT_HCIBCM203X is not set  # CONFIG_BT_HCIBPA10X is not set  # CONFIG_BT_HCIBFUSB is not set  # CONFIG_BT_HCIVHCI is not set  # CONFIG_AF_RXRPC is not set - -# -# Wireless -# +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y  CONFIG_CFG80211=m +# CONFIG_CFG80211_REG_DEBUG is not set  CONFIG_NL80211=y +# CONFIG_WIRELESS_OLD_REGULATORY is not set  CONFIG_WIRELESS_EXT=y  # CONFIG_WIRELESS_EXT_SYSFS is not set +# CONFIG_LIB80211 is not set  CONFIG_MAC80211=m  #  # Rate control algorithm selection  #  CONFIG_MAC80211_RC_PID=y +# CONFIG_MAC80211_RC_MINSTREL is not set  CONFIG_MAC80211_RC_DEFAULT_PID=y +# CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set  CONFIG_MAC80211_RC_DEFAULT="pid"  # CONFIG_MAC80211_MESH is not set  # CONFIG_MAC80211_LEDS is not set  # CONFIG_MAC80211_DEBUGFS is not set  # CONFIG_MAC80211_DEBUG_MENU is not set -CONFIG_IEEE80211=m -# CONFIG_IEEE80211_DEBUG is not set -CONFIG_IEEE80211_CRYPT_WEP=m -CONFIG_IEEE80211_CRYPT_CCMP=m -CONFIG_IEEE80211_CRYPT_TKIP=m +# CONFIG_WIMAX is not set  # CONFIG_RFKILL is not set  # CONFIG_NET_9P is not set @@ -450,6 +468,7 @@ CONFIG_MTD_DEBUG=y  CONFIG_MTD_DEBUG_VERBOSE=0  # CONFIG_MTD_CONCAT is not set  # CONFIG_MTD_PARTITIONS is not set +# CONFIG_MTD_TESTS is not set  #  # User Modules And Translation Layers @@ -494,7 +513,6 @@ CONFIG_MTD_CFI_I2=y  #  # CONFIG_MTD_SLRAM is not set  # CONFIG_MTD_PHRAM is not set -CONFIG_MTD_PS3VRAM=y  # CONFIG_MTD_MTDRAM is not set  # CONFIG_MTD_BLOCK2MTD is not set @@ -508,6 +526,11 @@ CONFIG_MTD_PS3VRAM=y  # CONFIG_MTD_ONENAND is not set  # +# LPDDR flash memory drivers +# +# CONFIG_MTD_LPDDR is not set + +#  # UBI - Unsorted block images  #  # CONFIG_MTD_UBI is not set @@ -528,8 +551,13 @@ CONFIG_BLK_DEV_RAM_SIZE=65535  # CONFIG_ATA_OVER_ETH is not set  # CONFIG_BLK_DEV_HD is not set  CONFIG_MISC_DEVICES=y -# CONFIG_EEPROM_93CX6 is not set  # CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_93CX6 is not set  CONFIG_HAVE_IDE=y  # CONFIG_IDE is not set @@ -575,7 +603,17 @@ CONFIG_SCSI_WAIT_SCAN=m  # CONFIG_SCSI_LOWLEVEL is not set  # CONFIG_SCSI_DH is not set  # CONFIG_ATA is not set -# CONFIG_MD is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +CONFIG_BLK_DEV_DM=m +# CONFIG_DM_DEBUG is not set +# CONFIG_DM_CRYPT is not set +# CONFIG_DM_SNAPSHOT is not set +# CONFIG_DM_MIRROR is not set +# CONFIG_DM_ZERO is not set +# CONFIG_DM_MULTIPATH is not set +# CONFIG_DM_DELAY is not set +# CONFIG_DM_UEVENT is not set  # CONFIG_MACINTOSH_DRIVERS is not set  CONFIG_NETDEVICES=y  # CONFIG_DUMMY is not set @@ -591,6 +629,9 @@ CONFIG_MII=m  # CONFIG_IBM_NEW_EMAC_RGMII is not set  # CONFIG_IBM_NEW_EMAC_TAH is not set  # CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set  # CONFIG_B44 is not set  CONFIG_NETDEV_1000=y  CONFIG_GELIC_NET=y @@ -604,6 +645,7 @@ CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE=y  # CONFIG_WLAN_PRE80211 is not set  CONFIG_WLAN_80211=y  # CONFIG_LIBERTAS is not set +# CONFIG_LIBERTAS_THINFIRM is not set  # CONFIG_USB_ZD1201 is not set  # CONFIG_USB_NET_RNDIS_WLAN is not set  # CONFIG_RTL8187 is not set @@ -615,13 +657,11 @@ CONFIG_WLAN_80211=y  # CONFIG_B43LEGACY is not set  CONFIG_ZD1211RW=m  # CONFIG_ZD1211RW_DEBUG is not set -CONFIG_RT2X00=m -CONFIG_RT2X00_LIB=m -CONFIG_RT2X00_LIB_USB=m -CONFIG_RT2X00_LIB_FIRMWARE=y -# CONFIG_RT2500USB is not set -CONFIG_RT73USB=m -# CONFIG_RT2X00_DEBUG is not set +# CONFIG_RT2X00 is not set + +# +# Enable WiMAX (Networking options) to see the WiMAX drivers +#  #  # USB Network Adapters @@ -634,6 +674,7 @@ CONFIG_USB_USBNET=m  CONFIG_USB_NET_AX8817X=m  # CONFIG_USB_NET_CDCETHER is not set  # CONFIG_USB_NET_DM9601 is not set +# CONFIG_USB_NET_SMSC95XX is not set  # CONFIG_USB_NET_GL620A is not set  # CONFIG_USB_NET_NET1080 is not set  # CONFIG_USB_NET_PLUSB is not set @@ -664,7 +705,7 @@ CONFIG_SLHC=m  # Input device support  #  CONFIG_INPUT=y -# CONFIG_INPUT_FF_MEMLESS is not set +CONFIG_INPUT_FF_MEMLESS=m  # CONFIG_INPUT_POLLDEV is not set  # @@ -735,8 +776,10 @@ CONFIG_DEVKMEM=y  # Non-8250 serial port support  #  CONFIG_UNIX98_PTYS=y +# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set  CONFIG_LEGACY_PTYS=y  CONFIG_LEGACY_PTY_COUNT=16 +# CONFIG_HVC_UDBG is not set  # CONFIG_IPMI_HANDLER is not set  # CONFIG_HW_RANDOM is not set  # CONFIG_R3964 is not set @@ -753,11 +796,11 @@ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y  # CONFIG_THERMAL is not set  # CONFIG_THERMAL_HWMON is not set  # CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y  #  # Sonics Silicon Backplane  # -CONFIG_SSB_POSSIBLE=y  # CONFIG_SSB is not set  # @@ -767,6 +810,7 @@ CONFIG_SSB_POSSIBLE=y  # CONFIG_MFD_SM501 is not set  # CONFIG_HTC_PASIC3 is not set  # CONFIG_MFD_TMIO is not set +# CONFIG_REGULATOR is not set  #  # Multimedia devices @@ -792,6 +836,7 @@ CONFIG_VIDEO_OUTPUT_CONTROL=m  CONFIG_FB=y  # CONFIG_FIRMWARE_EDID is not set  # CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT is not set  # CONFIG_FB_CFB_FILLRECT is not set  # CONFIG_FB_CFB_COPYAREA is not set  # CONFIG_FB_CFB_IMAGEBLIT is not set @@ -817,6 +862,8 @@ CONFIG_FB_SYS_FOPS=y  CONFIG_FB_PS3=y  CONFIG_FB_PS3_DEFAULT_SIZE_M=9  # CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set  # CONFIG_BACKLIGHT_LCD_SUPPORT is not set  # @@ -841,6 +888,7 @@ CONFIG_FB_LOGO_EXTRA=y  # CONFIG_LOGO_LINUX_VGA16 is not set  CONFIG_LOGO_LINUX_CLUT224=y  CONFIG_SOUND=m +# CONFIG_SOUND_OSS_CORE is not set  CONFIG_SND=m  CONFIG_SND_TIMER=m  CONFIG_SND_PCM=m @@ -849,6 +897,7 @@ CONFIG_SND_RAWMIDI=m  # CONFIG_SND_SEQUENCER is not set  # CONFIG_SND_MIXER_OSS is not set  # CONFIG_SND_PCM_OSS is not set +# CONFIG_SND_HRTIMER is not set  # CONFIG_SND_DYNAMIC_MINORS is not set  CONFIG_SND_SUPPORT_OLD_API=y  CONFIG_SND_VERBOSE_PROCFS=y @@ -873,15 +922,40 @@ CONFIG_HIDRAW=y  # USB Input Devices  #  CONFIG_USB_HID=m -# CONFIG_USB_HIDINPUT_POWERBOOK is not set -# CONFIG_HID_FF is not set -# CONFIG_USB_HIDDEV is not set +# CONFIG_HID_PID is not set +CONFIG_USB_HIDDEV=y  #  # USB HID Boot Protocol drivers  #  # CONFIG_USB_KBD is not set  # CONFIG_USB_MOUSE is not set + +# +# Special HID drivers +# +# CONFIG_HID_COMPAT is not set +# CONFIG_HID_A4TECH is not set +# CONFIG_HID_APPLE is not set +# CONFIG_HID_BELKIN is not set +# CONFIG_HID_CHERRY is not set +# CONFIG_HID_CHICONY is not set +# CONFIG_HID_CYPRESS is not set +# CONFIG_HID_EZKEY is not set +# CONFIG_HID_GYRATION is not set +# CONFIG_HID_LOGITECH is not set +# CONFIG_HID_MICROSOFT is not set +# CONFIG_HID_MONTEREY is not set +# CONFIG_HID_NTRIG is not set +# CONFIG_HID_PANTHERLORD is not set +# CONFIG_HID_PETALYNX is not set +# CONFIG_HID_SAMSUNG is not set +# CONFIG_HID_SONY is not set +# CONFIG_HID_SUNPLUS is not set +# CONFIG_GREENASIA_FF is not set +# CONFIG_HID_TOPSEED is not set +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_ZEROPLUS_FF is not set  CONFIG_USB_SUPPORT=y  CONFIG_USB_ARCH_HAS_HCD=y  CONFIG_USB_ARCH_HAS_OHCI=y @@ -898,7 +972,11 @@ CONFIG_USB_DEVICEFS=y  # CONFIG_USB_DYNAMIC_MINORS is not set  CONFIG_USB_SUSPEND=y  # CONFIG_USB_OTG is not set -CONFIG_USB_MON=y +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +CONFIG_USB_MON=m +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set  #  # USB Host Controller Drivers @@ -909,6 +987,7 @@ CONFIG_USB_EHCI_HCD=m  # CONFIG_USB_EHCI_TT_NEWSCHED is not set  CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y  # CONFIG_USB_EHCI_HCD_PPC_OF is not set +# CONFIG_USB_OXU210HP_HCD is not set  # CONFIG_USB_ISP116X_HCD is not set  # CONFIG_USB_ISP1760_HCD is not set  CONFIG_USB_OHCI_HCD=m @@ -918,6 +997,7 @@ CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y  CONFIG_USB_OHCI_LITTLE_ENDIAN=y  # CONFIG_USB_SL811_HCD is not set  # CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HWA_HCD is not set  #  # Enable Host or Gadget support to see Inventra options @@ -929,20 +1009,20 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y  # CONFIG_USB_ACM is not set  # CONFIG_USB_PRINTER is not set  # CONFIG_USB_WDM is not set +# CONFIG_USB_TMC is not set  # -# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;  #  # -# may also be needed; see USB_STORAGE Help for more information +# see USB_STORAGE Help for more information  #  CONFIG_USB_STORAGE=m  # CONFIG_USB_STORAGE_DEBUG is not set  # CONFIG_USB_STORAGE_DATAFAB is not set  # CONFIG_USB_STORAGE_FREECOM is not set  # CONFIG_USB_STORAGE_ISD200 is not set -# CONFIG_USB_STORAGE_DPCM is not set  # CONFIG_USB_STORAGE_USBAT is not set  # CONFIG_USB_STORAGE_SDDR09 is not set  # CONFIG_USB_STORAGE_SDDR55 is not set @@ -950,7 +1030,6 @@ CONFIG_USB_STORAGE=m  # CONFIG_USB_STORAGE_ALAUDA is not set  # CONFIG_USB_STORAGE_ONETOUCH is not set  # CONFIG_USB_STORAGE_KARMA is not set -# CONFIG_USB_STORAGE_SIERRA is not set  # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set  # CONFIG_USB_LIBUSUAL is not set @@ -971,6 +1050,7 @@ CONFIG_USB_STORAGE=m  # CONFIG_USB_EMI62 is not set  # CONFIG_USB_EMI26 is not set  # CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set  # CONFIG_USB_RIO500 is not set  # CONFIG_USB_LEGOTOWER is not set  # CONFIG_USB_LCD is not set @@ -988,7 +1068,12 @@ CONFIG_USB_STORAGE=m  # CONFIG_USB_IOWARRIOR is not set  # CONFIG_USB_TEST is not set  # CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_VST is not set  # CONFIG_USB_GADGET is not set + +# +# OTG and related infrastructure +#  # CONFIG_MMC is not set  # CONFIG_MEMSTICK is not set  # CONFIG_NEW_LEDS is not set @@ -1014,12 +1099,15 @@ CONFIG_RTC_INTF_DEV=y  # Platform RTC drivers  #  # CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_DS1286 is not set  # CONFIG_RTC_DRV_DS1511 is not set  # CONFIG_RTC_DRV_DS1553 is not set  # CONFIG_RTC_DRV_DS1742 is not set  # CONFIG_RTC_DRV_STK17TA8 is not set  # CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set  # CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_BQ4802 is not set  # CONFIG_RTC_DRV_V3020 is not set  # @@ -1028,6 +1116,7 @@ CONFIG_RTC_INTF_DEV=y  CONFIG_RTC_DRV_PPC=m  # CONFIG_DMADEVICES is not set  # CONFIG_UIO is not set +# CONFIG_STAGING is not set  #  # File systems @@ -1035,26 +1124,35 @@ CONFIG_RTC_DRV_PPC=m  CONFIG_EXT2_FS=m  # CONFIG_EXT2_FS_XATTR is not set  # CONFIG_EXT2_FS_XIP is not set -CONFIG_EXT3_FS=y +CONFIG_EXT3_FS=m  CONFIG_EXT3_FS_XATTR=y  # CONFIG_EXT3_FS_POSIX_ACL is not set  # CONFIG_EXT3_FS_SECURITY is not set -# CONFIG_EXT4DEV_FS is not set -CONFIG_JBD=y +CONFIG_EXT4_FS=y +# CONFIG_EXT4DEV_COMPAT is not set +CONFIG_EXT4_FS_XATTR=y +# CONFIG_EXT4_FS_POSIX_ACL is not set +# CONFIG_EXT4_FS_SECURITY is not set +CONFIG_JBD=m  # CONFIG_JBD_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set  CONFIG_FS_MBCACHE=y  # CONFIG_REISERFS_FS is not set  # CONFIG_JFS_FS is not set  # CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y  # CONFIG_XFS_FS is not set  # CONFIG_GFS2_FS is not set  # CONFIG_OCFS2_FS is not set +# CONFIG_BTRFS_FS is not set  CONFIG_DNOTIFY=y  CONFIG_INOTIFY=y  CONFIG_INOTIFY_USER=y  CONFIG_QUOTA=y  # CONFIG_QUOTA_NETLINK_INTERFACE is not set  CONFIG_PRINT_QUOTA_WARNING=y +CONFIG_QUOTA_TREE=y  # CONFIG_QFMT_V1 is not set  CONFIG_QFMT_V2=y  CONFIG_QUOTACTL=y @@ -1087,16 +1185,14 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"  CONFIG_PROC_FS=y  CONFIG_PROC_KCORE=y  CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y  CONFIG_SYSFS=y  CONFIG_TMPFS=y  # CONFIG_TMPFS_POSIX_ACL is not set  CONFIG_HUGETLBFS=y  CONFIG_HUGETLB_PAGE=y  # CONFIG_CONFIGFS_FS is not set - -# -# Miscellaneous filesystems -# +CONFIG_MISC_FILESYSTEMS=y  # CONFIG_ADFS_FS is not set  # CONFIG_AFFS_FS is not set  # CONFIG_HFS_FS is not set @@ -1106,6 +1202,7 @@ CONFIG_HUGETLB_PAGE=y  # CONFIG_EFS_FS is not set  # CONFIG_JFFS2_FS is not set  # CONFIG_CRAMFS is not set +# CONFIG_SQUASHFS is not set  # CONFIG_VXFS_FS is not set  # CONFIG_MINIX_FS is not set  # CONFIG_OMFS_FS is not set @@ -1126,6 +1223,7 @@ CONFIG_LOCKD_V4=y  CONFIG_NFS_COMMON=y  CONFIG_SUNRPC=y  CONFIG_SUNRPC_GSS=y +# CONFIG_SUNRPC_REGISTER_V4 is not set  CONFIG_RPCSEC_GSS_KRB5=y  # CONFIG_RPCSEC_GSS_SPKM3 is not set  # CONFIG_SMB_FS is not set @@ -1190,9 +1288,9 @@ CONFIG_NLS_ISO8859_1=y  # Library routines  #  CONFIG_BITREVERSE=y -# CONFIG_GENERIC_FIND_FIRST_BIT is not set +CONFIG_GENERIC_FIND_LAST_BIT=y  CONFIG_CRC_CCITT=m -# CONFIG_CRC16 is not set +CONFIG_CRC16=y  CONFIG_CRC_T10DIF=y  CONFIG_CRC_ITU_T=m  CONFIG_CRC32=y @@ -1250,27 +1348,44 @@ CONFIG_DEBUG_WRITECOUNT=y  CONFIG_DEBUG_MEMORY_INIT=y  CONFIG_DEBUG_LIST=y  # CONFIG_DEBUG_SG is not set -CONFIG_FRAME_POINTER=y +# CONFIG_DEBUG_NOTIFIERS is not set  # CONFIG_BOOT_PRINTK_DELAY is not set  # CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set  # CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set  # CONFIG_FAULT_INJECTION is not set  # CONFIG_LATENCYTOP is not set  CONFIG_SYSCTL_SYSCALL_CHECK=y -CONFIG_HAVE_FTRACE=y +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y  CONFIG_HAVE_DYNAMIC_FTRACE=y -# CONFIG_FTRACE is not set +CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y +CONFIG_RING_BUFFER=y +CONFIG_TRACING=y + +# +# Tracers +# +# CONFIG_FUNCTION_TRACER is not set  # CONFIG_IRQSOFF_TRACER is not set  # CONFIG_SCHED_TRACER is not set  # CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_TRACE_BRANCH_PROFILING is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_FTRACE_STARTUP_TEST is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set  # CONFIG_SAMPLES is not set  CONFIG_HAVE_ARCH_KGDB=y  # CONFIG_KGDB is not set +CONFIG_PRINT_STACK_DEPTH=64  CONFIG_DEBUG_STACKOVERFLOW=y  # CONFIG_DEBUG_STACK_USAGE is not set  # CONFIG_DEBUG_PAGEALLOC is not set  # CONFIG_CODE_PATCHING_SELFTEST is not set  # CONFIG_FTR_FIXUP_SELFTEST is not set +# CONFIG_MSI_BITMAP_SELFTEST is not set  # CONFIG_XMON is not set  CONFIG_IRQSTACKS=y  # CONFIG_VIRQ_DEBUG is not set @@ -1282,16 +1397,26 @@ CONFIG_IRQSTACKS=y  #  # CONFIG_KEYS is not set  # CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set  # CONFIG_SECURITY_FILE_CAPABILITIES is not set  CONFIG_CRYPTO=y  #  # Crypto core or helper  # +# CONFIG_CRYPTO_FIPS is not set  CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y  CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_AEAD2=y  CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=m +CONFIG_CRYPTO_RNG2=y  CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y  CONFIG_CRYPTO_GF128MUL=m  # CONFIG_CRYPTO_NULL is not set  # CONFIG_CRYPTO_CRYPTD is not set @@ -1363,6 +1488,11 @@ CONFIG_CRYPTO_SALSA20=m  #  # CONFIG_CRYPTO_DEFLATE is not set  CONFIG_CRYPTO_LZO=m + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set  CONFIG_CRYPTO_HW=y  # CONFIG_PPC_CLOCK is not set  # CONFIG_VIRTUALIZATION is not set diff --git a/arch/powerpc/configs/storcenter_defconfig b/arch/powerpc/configs/storcenter_defconfig index 86512c8790d..94903465ea1 100644 --- a/arch/powerpc/configs/storcenter_defconfig +++ b/arch/powerpc/configs/storcenter_defconfig @@ -1,7 +1,7 @@  #  # Automatically generated make config: don't edit -# Linux kernel version: 2.6.29-rc2 -# Mon Jan 26 15:35:46 2009 +# Linux kernel version: 2.6.29-rc6 +# Fri Mar  6 00:09:08 2009  #  # CONFIG_PPC64 is not set @@ -71,6 +71,15 @@ CONFIG_SYSVIPC_SYSCTL=y  # CONFIG_BSD_PROCESS_ACCT is not set  # CONFIG_TASKSTATS is not set  # CONFIG_AUDIT is not set + +# +# RCU Subsystem +# +CONFIG_CLASSIC_RCU=y +# CONFIG_TREE_RCU is not set +# CONFIG_PREEMPT_RCU is not set +# CONFIG_TREE_RCU_TRACE is not set +# CONFIG_PREEMPT_RCU_TRACE is not set  # CONFIG_IKCONFIG is not set  CONFIG_LOG_BUF_SHIFT=14  CONFIG_GROUP_SCHED=y @@ -144,11 +153,6 @@ CONFIG_IOSCHED_CFQ=y  CONFIG_DEFAULT_CFQ=y  # CONFIG_DEFAULT_NOOP is not set  CONFIG_DEFAULT_IOSCHED="cfq" -CONFIG_CLASSIC_RCU=y -# CONFIG_TREE_RCU is not set -# CONFIG_PREEMPT_RCU is not set -# CONFIG_TREE_RCU_TRACE is not set -# CONFIG_PREEMPT_RCU_TRACE is not set  # CONFIG_FREEZER is not set  # @@ -377,8 +381,8 @@ CONFIG_MTD=y  CONFIG_MTD_PARTITIONS=y  # CONFIG_MTD_TESTS is not set  # CONFIG_MTD_REDBOOT_PARTS is not set -# CONFIG_MTD_CMDLINE_PARTS is not set -# CONFIG_MTD_OF_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +CONFIG_MTD_OF_PARTS=y  # CONFIG_MTD_AR7_PARTS is not set  # @@ -452,7 +456,6 @@ CONFIG_MTD_PHYSMAP=y  # LPDDR flash memory drivers  #  # CONFIG_MTD_LPDDR is not set -# CONFIG_MTD_QINFO_PROBE is not set  #  # UBI - Unsorted block images @@ -478,13 +481,19 @@ CONFIG_BLK_DEV=y  # CONFIG_BLK_DEV_HD is not set  CONFIG_MISC_DEVICES=y  # CONFIG_PHANTOM is not set -# CONFIG_EEPROM_93CX6 is not set  # CONFIG_SGI_IOC4 is not set  # CONFIG_TIFM_CORE is not set  # CONFIG_ICS932S401 is not set  # CONFIG_ENCLOSURE_SERVICES is not set  # CONFIG_HP_ILO is not set  # CONFIG_C2PORT is not set + +# +# EEPROM support +# +# CONFIG_EEPROM_AT24 is not set +# CONFIG_EEPROM_LEGACY is not set +# CONFIG_EEPROM_93CX6 is not set  CONFIG_HAVE_IDE=y  CONFIG_IDE=y @@ -677,6 +686,7 @@ CONFIG_R8169=y  # CONFIG_QLA3XXX is not set  # CONFIG_ATL1 is not set  # CONFIG_ATL1E is not set +# CONFIG_ATL1C is not set  # CONFIG_JME is not set  # CONFIG_NETDEV_10000 is not set  # CONFIG_TR is not set @@ -818,8 +828,6 @@ CONFIG_I2C_MPC=y  # Miscellaneous I2C Chip support  #  # CONFIG_DS1682 is not set -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_LEGACY is not set  # CONFIG_SENSORS_PCF8574 is not set  # CONFIG_PCF8575 is not set  # CONFIG_SENSORS_PCA9539 is not set @@ -1159,6 +1167,7 @@ CONFIG_JFFS2_RTIME=y  # CONFIG_SYSV_FS is not set  # CONFIG_UFS_FS is not set  # CONFIG_NETWORK_FILESYSTEMS is not set +CONFIG_EXPORTFS=m  #  # Partition Types diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index 4911104791c..21172badd70 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h @@ -241,9 +241,11 @@ extern const char *powerpc_base_platform;  /* We need to mark all pages as being coherent if we're SMP or we have a   * 74[45]x and an MPC107 host bridge. Also 83xx and PowerQUICC II   * require it for PCI "streaming/prefetch" to work properly. + * This is also required by 52xx family.   */  #if defined(CONFIG_SMP) || defined(CONFIG_MPC10X_BRIDGE) \ -	|| defined(CONFIG_PPC_83xx) || defined(CONFIG_8260) +	|| defined(CONFIG_PPC_83xx) || defined(CONFIG_8260) \ +	|| defined(CONFIG_PPC_MPC52xx)  #define CPU_FTR_COMMON                  CPU_FTR_NEED_COHERENT  #else  #define CPU_FTR_COMMON                  0 diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index a1c4cfd25de..d794a637e42 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S @@ -511,8 +511,11 @@ InstructionTLBMiss:  	and	r1,r1,r2		/* writable if _RW and _DIRTY */  	rlwimi	r3,r3,32-1,30,30	/* _PAGE_USER -> PP msb */  	rlwimi	r3,r3,32-1,31,31	/* _PAGE_USER -> PP lsb */ -	ori	r1,r1,0xe14		/* clear out reserved bits and M */ +	ori	r1,r1,0xe04		/* clear out reserved bits */  	andc	r1,r3,r1		/* PP = user? (rw&dirty? 2: 3): 0 */ +BEGIN_FTR_SECTION +	rlwinm	r1,r1,0,~_PAGE_COHERENT	/* clear M (coherence not required) */ +END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)  	mtspr	SPRN_RPA,r1  	mfspr	r3,SPRN_IMISS  	tlbli	r3 @@ -585,8 +588,11 @@ DataLoadTLBMiss:  	and	r1,r1,r2		/* writable if _RW and _DIRTY */  	rlwimi	r3,r3,32-1,30,30	/* _PAGE_USER -> PP msb */  	rlwimi	r3,r3,32-1,31,31	/* _PAGE_USER -> PP lsb */ -	ori	r1,r1,0xe14		/* clear out reserved bits and M */ +	ori	r1,r1,0xe04		/* clear out reserved bits */  	andc	r1,r3,r1		/* PP = user? (rw&dirty? 2: 3): 0 */ +BEGIN_FTR_SECTION +	rlwinm	r1,r1,0,~_PAGE_COHERENT	/* clear M (coherence not required) */ +END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)  	mtspr	SPRN_RPA,r1  	mfspr	r3,SPRN_DMISS  	tlbld	r3 @@ -653,8 +659,11 @@ DataStoreTLBMiss:  	stw	r3,0(r2)		/* update PTE (accessed/dirty bits) */  	/* Convert linux-style PTE to low word of PPC-style PTE */  	rlwimi	r3,r3,32-1,30,30	/* _PAGE_USER -> PP msb */ -	li	r1,0xe15		/* clear out reserved bits and M */ +	li	r1,0xe05		/* clear out reserved bits & PP lsb */  	andc	r1,r3,r1		/* PP = user? 2: 0 */ +BEGIN_FTR_SECTION +	rlwinm	r1,r1,0,~_PAGE_COHERENT	/* clear M (coherence not required) */ +END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)  	mtspr	SPRN_RPA,r1  	mfspr	r3,SPRN_DMISS  	tlbld	r3 diff --git a/arch/powerpc/platforms/86xx/gef_sbc610.c b/arch/powerpc/platforms/86xx/gef_sbc610.c index fb371f5ce13..d6b772ba3b8 100644 --- a/arch/powerpc/platforms/86xx/gef_sbc610.c +++ b/arch/powerpc/platforms/86xx/gef_sbc610.c @@ -142,6 +142,10 @@ static void __init gef_sbc610_nec_fixup(struct pci_dev *pdev)  {  	unsigned int val; +	/* Do not do the fixup on other platforms! */ +	if (!machine_is(gef_sbc610)) +		return; +  	printk(KERN_INFO "Running NEC uPD720101 Fixup\n");  	/* Ensure ports 1, 2, 3, 4 & 5 are enabled */ diff --git a/arch/powerpc/platforms/embedded6xx/linkstation.c b/arch/powerpc/platforms/embedded6xx/linkstation.c index 2ca7be65c2d..244f997de79 100644 --- a/arch/powerpc/platforms/embedded6xx/linkstation.c +++ b/arch/powerpc/platforms/embedded6xx/linkstation.c @@ -12,7 +12,6 @@  #include <linux/kernel.h>  #include <linux/initrd.h> -#include <linux/mtd/physmap.h>  #include <linux/of_platform.h>  #include <asm/time.h> @@ -22,39 +21,6 @@  #include "mpc10x.h" -static struct mtd_partition linkstation_physmap_partitions[] = { -	{ -		.name   = "mtd_firmimg", -		.offset = 0x000000, -		.size   = 0x300000, -	}, -	{ -		.name   = "mtd_bootcode", -		.offset = 0x300000, -		.size   = 0x070000, -	}, -	{ -		.name   = "mtd_status", -		.offset = 0x370000, -		.size   = 0x010000, -	}, -	{ -		.name   = "mtd_conf", -		.offset = 0x380000, -		.size   = 0x080000, -	}, -	{ -		.name   = "mtd_allflash", -		.offset = 0x000000, -		.size   = 0x400000, -	}, -	{ -		.name   = "mtd_data", -		.offset = 0x310000, -		.size   = 0x0f0000, -	}, -}; -  static __initdata struct of_device_id of_bus_ids[] = {  	{ .type = "soc", },  	{ .compatible = "simple-bus", }, @@ -99,10 +65,6 @@ static int __init linkstation_add_bridge(struct device_node *dev)  static void __init linkstation_setup_arch(void)  {  	struct device_node *np; -#ifdef CONFIG_MTD_PHYSMAP -	physmap_set_partitions(linkstation_physmap_partitions, -			       ARRAY_SIZE(linkstation_physmap_partitions)); -#endif  	/* Lookup PCI host bridges */  	for_each_compatible_node(np, "pci", "mpc10x-pci") diff --git a/arch/powerpc/platforms/embedded6xx/storcenter.c b/arch/powerpc/platforms/embedded6xx/storcenter.c index 8864e488498..613070e9ddb 100644 --- a/arch/powerpc/platforms/embedded6xx/storcenter.c +++ b/arch/powerpc/platforms/embedded6xx/storcenter.c @@ -14,7 +14,6 @@  #include <linux/kernel.h>  #include <linux/pci.h>  #include <linux/initrd.h> -#include <linux/mtd/physmap.h>  #include <linux/of_platform.h>  #include <asm/system.h> @@ -26,32 +25,6 @@  #include "mpc10x.h" -#ifdef CONFIG_MTD_PHYSMAP -static struct mtd_partition storcenter_physmap_partitions[] = { -	{ -		.name   = "kernel", -		.offset = 0x000000, -		.size   = 0x170000, -	}, -	{ -		.name   = "rootfs", -		.offset = 0x170000, -		.size   = 0x590000, -	}, -	{ -		.name   = "uboot", -		.offset = 0x700000, -		.size   = 0x040000, -	}, -	{ -		.name   = "config", -		.offset = 0x740000, -		.size   = 0x0c0000, -	}, -}; -#endif - -  static __initdata struct of_device_id storcenter_of_bus[] = {  	{ .name = "soc", },  	{}, @@ -96,11 +69,6 @@ static void __init storcenter_setup_arch(void)  {  	struct device_node *np; -#ifdef CONFIG_MTD_PHYSMAP -	physmap_set_partitions(storcenter_physmap_partitions, -			       ARRAY_SIZE(storcenter_physmap_partitions)); -#endif -  	/* Lookup PCI host bridges */  	for_each_compatible_node(np, "pci", "mpc10x-pci")  		storcenter_add_bridge(np); diff --git a/arch/powerpc/platforms/ps3/Kconfig b/arch/powerpc/platforms/ps3/Kconfig index 920cf7a454b..740ef56a155 100644 --- a/arch/powerpc/platforms/ps3/Kconfig +++ b/arch/powerpc/platforms/ps3/Kconfig @@ -128,6 +128,13 @@ config PS3_FLASH  	  be disabled on the kernel command line using "ps3flash=off", to  	  not allocate this fixed buffer. +config PS3_VRAM +	tristate "PS3 Video RAM Storage Driver" +	depends on FB_PS3=y && BLOCK && m +	help +	  This driver allows you to use excess PS3 video RAM as volatile +	  storage or system swap. +  config PS3_LPM  	tristate "PS3 Logical Performance Monitor support"  	depends on PPC_PS3 diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c index c42cd898f68..6118890c946 100644 --- a/arch/s390/crypto/aes_s390.c +++ b/arch/s390/crypto/aes_s390.c @@ -556,7 +556,7 @@ static void __exit aes_s390_fini(void)  module_init(aes_s390_init);  module_exit(aes_s390_fini); -MODULE_ALIAS("aes"); +MODULE_ALIAS("aes-all");  MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");  MODULE_LICENSE("GPL"); diff --git a/arch/s390/include/asm/mman.h b/arch/s390/include/asm/mman.h index 7839767d837..da01432e8f4 100644 --- a/arch/s390/include/asm/mman.h +++ b/arch/s390/include/asm/mman.h @@ -22,4 +22,9 @@  #define MCL_CURRENT	1		/* lock all current mappings */  #define MCL_FUTURE	2		/* lock all future mappings */ +#if defined(__KERNEL__) && !defined(__ASSEMBLY__) && defined(CONFIG_64BIT) +int s390_mmap_check(unsigned long addr, unsigned long len); +#define arch_mmap_check(addr,len,flags)	s390_mmap_check(addr,len) +#endif +  #endif /* __S390_MMAN_H__ */ diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h index 066b99502e0..db4523fe38a 100644 --- a/arch/s390/include/asm/processor.h +++ b/arch/s390/include/asm/processor.h @@ -61,7 +61,7 @@ extern void print_cpu_info(struct cpuinfo_S390 *);  extern int get_cpu_capability(unsigned int *);  /* - * User space process size: 2GB for 31 bit, 4TB for 64 bit. + * User space process size: 2GB for 31 bit, 4TB or 8PT for 64 bit.   */  #ifndef __s390x__ @@ -70,8 +70,7 @@ extern int get_cpu_capability(unsigned int *);  #else /* __s390x__ */ -#define TASK_SIZE_OF(tsk)	(test_tsk_thread_flag(tsk,TIF_31BIT) ? \ -					(1UL << 31) : (1UL << 53)) +#define TASK_SIZE_OF(tsk)	((tsk)->mm->context.asce_limit)  #define TASK_UNMAPPED_BASE	(test_thread_flag(TIF_31BIT) ? \  					(1UL << 30) : (1UL << 41))  #define TASK_SIZE		TASK_SIZE_OF(current) diff --git a/arch/s390/include/asm/topology.h b/arch/s390/include/asm/topology.h index c93eb50e1d0..c979c3b56ab 100644 --- a/arch/s390/include/asm/topology.h +++ b/arch/s390/include/asm/topology.h @@ -30,6 +30,8 @@ static inline void s390_init_cpu_topology(void)  };  #endif +#define SD_MC_INIT SD_CPU_INIT +  #include <asm-generic/topology.h>  #endif /* _ASM_S390_TOPOLOGY_H */ diff --git a/arch/s390/kernel/mcount.S b/arch/s390/kernel/mcount.S index 397d131a345..80641224a09 100644 --- a/arch/s390/kernel/mcount.S +++ b/arch/s390/kernel/mcount.S @@ -5,6 +5,8 @@   *   */ +#include <asm/asm-offsets.h> +  #ifndef CONFIG_64BIT  .globl _mcount  _mcount: @@ -14,7 +16,7 @@ _mcount:  	ahi	%r15,-96  	l	%r3,100(%r15)  	la	%r2,0(%r14) -	st	%r1,0(%r15) +	st	%r1,__SF_BACKCHAIN(%r15)  	la	%r3,0(%r3)  	bras	%r14,0f  	.long	ftrace_trace_function @@ -38,7 +40,7 @@ _mcount:  	stg	%r14,112(%r15)  	lgr	%r1,%r15  	aghi	%r15,-160 -	stg	%r1,0(%r15) +	stg	%r1,__SF_BACKCHAIN(%r15)  	lgr	%r2,%r14  	lg	%r3,168(%r15)  	larl	%r14,ftrace_trace_function diff --git a/arch/s390/lib/div64.c b/arch/s390/lib/div64.c index a5f8300bf3e..d9e62c0b576 100644 --- a/arch/s390/lib/div64.c +++ b/arch/s390/lib/div64.c @@ -61,7 +61,7 @@ static uint32_t __div64_31(uint64_t *n, uint32_t base)  		"	clr	%0,%3\n"  		"	jl	0f\n"  		"	slr	%0,%3\n" -		"	alr	%1,%2\n" +		"	ahi	%1,1\n"  		"0:\n"  		: "+d" (reg2), "+d" (reg3), "=d" (tmp)  		: "d" (base), "2" (1UL) : "cc" ); diff --git a/arch/s390/lib/uaccess_pt.c b/arch/s390/lib/uaccess_pt.c index d66215b0fde..b0b84c35b0a 100644 --- a/arch/s390/lib/uaccess_pt.c +++ b/arch/s390/lib/uaccess_pt.c @@ -119,8 +119,6 @@ retry:  			goto fault;  		pfn = pte_pfn(*pte); -		if (!pfn_valid(pfn)) -			goto out;  		offset = uaddr & (PAGE_SIZE - 1);  		size = min(n - done, PAGE_SIZE - offset); @@ -135,7 +133,6 @@ retry:  		done += size;  		uaddr += size;  	} while (done < n); -out:  	spin_unlock(&mm->page_table_lock);  	return n - done;  fault: @@ -163,9 +160,6 @@ retry:  		goto fault;  	pfn = pte_pfn(*pte); -	if (!pfn_valid(pfn)) -		goto out; -  	ret = (pfn << PAGE_SHIFT) + (uaddr & (PAGE_SIZE - 1));  out:  	return ret; @@ -244,11 +238,6 @@ retry:  			goto fault;  		pfn = pte_pfn(*pte); -		if (!pfn_valid(pfn)) { -			done = -1; -			goto out; -		} -  		offset = uaddr & (PAGE_SIZE-1);  		addr = (char *)(pfn << PAGE_SHIFT) + offset;  		len = min(count - done, PAGE_SIZE - offset); @@ -256,7 +245,6 @@ retry:  		done += len_str;  		uaddr += len_str;  	} while ((len_str == len) && (done < count)); -out:  	spin_unlock(&mm->page_table_lock);  	return done + 1;  fault: @@ -325,12 +313,7 @@ retry:  		}  		pfn_from = pte_pfn(*pte_from); -		if (!pfn_valid(pfn_from)) -			goto out;  		pfn_to = pte_pfn(*pte_to); -		if (!pfn_valid(pfn_to)) -			goto out; -  		offset_from = uaddr_from & (PAGE_SIZE-1);  		offset_to = uaddr_from & (PAGE_SIZE-1);  		offset_max = max(offset_from, offset_to); @@ -342,7 +325,6 @@ retry:  		uaddr_from += size;  		uaddr_to += size;  	} while (done < n); -out:  	spin_unlock(&mm->page_table_lock);  	return n - done;  fault: diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index 5932a824547..e008d236cc1 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c @@ -35,7 +35,7 @@   * Leave an at least ~128 MB hole.   */  #define MIN_GAP (128*1024*1024) -#define MAX_GAP (TASK_SIZE/6*5) +#define MAX_GAP (STACK_TOP/6*5)  static inline unsigned long mmap_base(void)  { @@ -46,7 +46,7 @@ static inline unsigned long mmap_base(void)  	else if (gap > MAX_GAP)  		gap = MAX_GAP; -	return TASK_SIZE - (gap & PAGE_MASK); +	return STACK_TOP - (gap & PAGE_MASK);  }  static inline int mmap_is_legacy(void) @@ -89,42 +89,58 @@ EXPORT_SYMBOL_GPL(arch_pick_mmap_layout);  #else +int s390_mmap_check(unsigned long addr, unsigned long len) +{ +	if (!test_thread_flag(TIF_31BIT) && +	    len >= TASK_SIZE && TASK_SIZE < (1UL << 53)) +		return crst_table_upgrade(current->mm, 1UL << 53); +	return 0; +} +  static unsigned long  s390_get_unmapped_area(struct file *filp, unsigned long addr,  		unsigned long len, unsigned long pgoff, unsigned long flags)  {  	struct mm_struct *mm = current->mm; +	unsigned long area;  	int rc; -	addr = arch_get_unmapped_area(filp, addr, len, pgoff, flags); -	if (addr & ~PAGE_MASK) -		return addr; -	if (unlikely(mm->context.asce_limit < addr + len)) { -		rc = crst_table_upgrade(mm, addr + len); +	area = arch_get_unmapped_area(filp, addr, len, pgoff, flags); +	if (!(area & ~PAGE_MASK)) +		return area; +	if (area == -ENOMEM && +	    !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) { +		/* Upgrade the page table to 4 levels and retry. */ +		rc = crst_table_upgrade(mm, 1UL << 53);  		if (rc)  			return (unsigned long) rc; +		area = arch_get_unmapped_area(filp, addr, len, pgoff, flags);  	} -	return addr; +	return area;  }  static unsigned long -s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, +s390_get_unmapped_area_topdown(struct file *filp, const unsigned long addr,  			  const unsigned long len, const unsigned long pgoff,  			  const unsigned long flags)  {  	struct mm_struct *mm = current->mm; -	unsigned long addr = addr0; +	unsigned long area;  	int rc; -	addr = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags); -	if (addr & ~PAGE_MASK) -		return addr; -	if (unlikely(mm->context.asce_limit < addr + len)) { -		rc = crst_table_upgrade(mm, addr + len); +	area = arch_get_unmapped_area_topdown(filp, addr, len, pgoff, flags); +	if (!(area & ~PAGE_MASK)) +		return area; +	if (area == -ENOMEM && +	    !test_thread_flag(TIF_31BIT) && TASK_SIZE < (1UL << 53)) { +		/* Upgrade the page table to 4 levels and retry. */ +		rc = crst_table_upgrade(mm, 1UL << 53);  		if (rc)  			return (unsigned long) rc; +		area = arch_get_unmapped_area_topdown(filp, addr, len, +						      pgoff, flags);  	} -	return addr; +	return area;  }  /*   * This function, called very early during the creation of a new diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 0767827540b..6b6ddc4ea02 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c @@ -117,6 +117,7 @@ repeat:  		crst_table_init(table, entry);  		pgd_populate(mm, (pgd_t *) table, (pud_t *) pgd);  		mm->pgd = (pgd_t *) table; +		mm->task_size = mm->context.asce_limit;  		table = NULL;  	}  	spin_unlock(&mm->page_table_lock); @@ -154,6 +155,7 @@ void crst_table_downgrade(struct mm_struct *mm, unsigned long limit)  			BUG();  		}  		mm->pgd = (pgd_t *) (pgd_val(*pgd) & _REGION_ENTRY_ORIGIN); +		mm->task_size = mm->context.asce_limit;  		crst_table_free(mm, (unsigned long *) pgd);  	}  	update_mm(mm, current); diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index 72da416f616..15b6d450fbf 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c @@ -22,6 +22,7 @@  #include <linux/gpio.h>  #include <linux/spi/spi.h>  #include <linux/spi/spi_gpio.h> +#include <media/soc_camera.h>  #include <media/soc_camera_platform.h>  #include <media/sh_mobile_ceu.h>  #include <video/sh_mobile_lcdc.h> diff --git a/arch/sparc/include/asm/pil.h b/arch/sparc/include/asm/pil.h index 32a7efe76d0..26693703054 100644 --- a/arch/sparc/include/asm/pil.h +++ b/arch/sparc/include/asm/pil.h @@ -24,6 +24,7 @@  #define PIL_DEVICE_IRQ		5  #define PIL_SMP_CALL_FUNC_SNGL	6  #define PIL_DEFERRED_PCR_WORK	7 +#define PIL_KGDB_CAPTURE	8  #define PIL_NORMAL_MAX		14  #define PIL_NMI			15 diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index e289376198e..1c378d8e90c 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c @@ -323,17 +323,25 @@ static void sun4u_set_affinity(unsigned int virt_irq,  	sun4u_irq_enable(virt_irq);  } +/* Don't do anything.  The desc->status check for IRQ_DISABLED in + * handler_irq() will skip the handler call and that will leave the + * interrupt in the sent state.  The next ->enable() call will hit the + * ICLR register to reset the state machine. + * + * This scheme is necessary, instead of clearing the Valid bit in the + * IMAP register, to handle the case of IMAP registers being shared by + * multiple INOs (and thus ICLR registers).  Since we use a different + * virtual IRQ for each shared IMAP instance, the generic code thinks + * there is only one user so it prematurely calls ->disable() on + * free_irq(). + * + * We have to provide an explicit ->disable() method instead of using + * NULL to get the default.  The reason is that if the generic code + * sees that, it also hooks up a default ->shutdown method which + * invokes ->mask() which we do not want.  See irq_chip_set_defaults(). + */  static void sun4u_irq_disable(unsigned int virt_irq)  { -	struct irq_handler_data *data = get_irq_chip_data(virt_irq); - -	if (likely(data)) { -		unsigned long imap = data->imap; -		unsigned long tmp = upa_readq(imap); - -		tmp &= ~IMAP_VALID; -		upa_writeq(tmp, imap); -	}  }  static void sun4u_irq_eoi(unsigned int virt_irq) @@ -746,7 +754,8 @@ void handler_irq(int irq, struct pt_regs *regs)  		desc = irq_desc + virt_irq; -		desc->handle_irq(virt_irq, desc); +		if (!(desc->status & IRQ_DISABLED)) +			desc->handle_irq(virt_irq, desc);  		bucket_pa = next_pa;  	} diff --git a/arch/sparc/kernel/kgdb_64.c b/arch/sparc/kernel/kgdb_64.c index fefbe6dc51b..f5a0fd490b5 100644 --- a/arch/sparc/kernel/kgdb_64.c +++ b/arch/sparc/kernel/kgdb_64.c @@ -108,7 +108,7 @@ void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs)  }  #ifdef CONFIG_SMP -void smp_kgdb_capture_client(struct pt_regs *regs) +void smp_kgdb_capture_client(int irq, struct pt_regs *regs)  {  	unsigned long flags; diff --git a/arch/sparc/kernel/pci_common.c b/arch/sparc/kernel/pci_common.c index 64e6edf17b9..b775658a927 100644 --- a/arch/sparc/kernel/pci_common.c +++ b/arch/sparc/kernel/pci_common.c @@ -368,7 +368,7 @@ static void pci_register_iommu_region(struct pci_pbm_info *pbm)  	const u32 *vdma = of_get_property(pbm->op->node, "virtual-dma", NULL);  	if (vdma) { -		struct resource *rp = kmalloc(sizeof(*rp), GFP_KERNEL); +		struct resource *rp = kzalloc(sizeof(*rp), GFP_KERNEL);  		if (!rp) {  			prom_printf("Cannot allocate IOMMU resource.\n"); diff --git a/arch/sparc/kernel/ttable.S b/arch/sparc/kernel/ttable.S index d9bdfb9d5c1..76d837fc47d 100644 --- a/arch/sparc/kernel/ttable.S +++ b/arch/sparc/kernel/ttable.S @@ -64,7 +64,12 @@ tl0_irq6:	TRAP_IRQ(smp_call_function_single_client, 6)  tl0_irq6:	BTRAP(0x46)  #endif  tl0_irq7:	TRAP_IRQ(deferred_pcr_work_irq, 7) -tl0_irq8:	BTRAP(0x48) BTRAP(0x49) +#ifdef CONFIG_KGDB +tl0_irq8:	TRAP_IRQ(smp_kgdb_capture_client, 8) +#else +tl0_irq8:	BTRAP(0x48) +#endif +tl0_irq9:	BTRAP(0x49)  tl0_irq10:	BTRAP(0x4a) BTRAP(0x4b) BTRAP(0x4c) BTRAP(0x4d)  tl0_irq14:	TRAP_IRQ(timer_interrupt, 14)  tl0_irq15:	TRAP_NMI_IRQ(perfctr_irq, 15) diff --git a/arch/sparc/mm/ultra.S b/arch/sparc/mm/ultra.S index 80c788ec7c3..b57a5942ba6 100644 --- a/arch/sparc/mm/ultra.S +++ b/arch/sparc/mm/ultra.S @@ -679,28 +679,8 @@ xcall_new_mmu_context_version:  #ifdef CONFIG_KGDB  	.globl		xcall_kgdb_capture  xcall_kgdb_capture: -661:	rdpr		%pstate, %g2 -	wrpr		%g2, PSTATE_IG | PSTATE_AG, %pstate -	.section	.sun4v_2insn_patch, "ax" -	.word		661b -	nop -	nop -	.previous - -	rdpr		%pil, %g2 -	wrpr		%g0, PIL_NORMAL_MAX, %pil -	sethi		%hi(109f), %g7 -	ba,pt		%xcc, etrap_irq -109:	 or		%g7, %lo(109b), %g7 -#ifdef CONFIG_TRACE_IRQFLAGS -	call		trace_hardirqs_off -	 nop -#endif -	call		smp_kgdb_capture_client -	 add		%sp, PTREGS_OFF, %o0 -	/* Has to be a non-v9 branch due to the large distance. */ -	ba		rtrap_xcall -	 ldx		[%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 +	wr		%g0, (1 << PIL_KGDB_CAPTURE), %set_softint +	retry  #endif  #endif /* CONFIG_SMP */ diff --git a/arch/um/kernel/ptrace.c b/arch/um/kernel/ptrace.c index 15e8b7c4de1..8e3d69e4fcb 100644 --- a/arch/um/kernel/ptrace.c +++ b/arch/um/kernel/ptrace.c @@ -64,6 +64,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)  		ret = poke_user(child, addr, data);  		break; +	case PTRACE_SYSEMU: +	case PTRACE_SYSEMU_SINGLESTEP: +		ret = -EIO; +		break; +  	/* continue and stop at next (return from) syscall */  	case PTRACE_SYSCALL:  	/* restart after signal. */ diff --git a/arch/um/os-Linux/user_syms.c b/arch/um/os-Linux/user_syms.c index 74f49bb9b12..89b48a116a8 100644 --- a/arch/um/os-Linux/user_syms.c +++ b/arch/um/os-Linux/user_syms.c @@ -14,7 +14,6 @@  #undef memset  extern size_t strlen(const char *); -extern void *memcpy(void *, const void *, size_t);  extern void *memmove(void *, const void *, size_t);  extern void *memset(void *, int, size_t);  extern int printf(const char *, ...); @@ -24,7 +23,11 @@ extern int printf(const char *, ...);  EXPORT_SYMBOL(strstr);  #endif +#ifndef __x86_64__ +extern void *memcpy(void *, const void *, size_t);  EXPORT_SYMBOL(memcpy); +#endif +  EXPORT_SYMBOL(memmove);  EXPORT_SYMBOL(memset);  EXPORT_SYMBOL(printf); diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index ca5ffb2856b..edc90f23e70 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h @@ -37,8 +37,6 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...);  #else /* !CONFIG_X86_32 */ -#define MAX_EFI_IO_PAGES	100 -  extern u64 efi_call0(void *fp);  extern u64 efi_call1(void *fp, u64 arg1);  extern u64 efi_call2(void *fp, u64 arg1, u64 arg2); diff --git a/arch/x86/include/asm/fixmap_64.h b/arch/x86/include/asm/fixmap_64.h index 00a30ab9b1a..8be740977db 100644 --- a/arch/x86/include/asm/fixmap_64.h +++ b/arch/x86/include/asm/fixmap_64.h @@ -16,7 +16,6 @@  #include <asm/apicdef.h>  #include <asm/page.h>  #include <asm/vsyscall.h> -#include <asm/efi.h>  /*   * Here we define all the compile-time 'special' virtual @@ -43,9 +42,6 @@ enum fixed_addresses {  	FIX_APIC_BASE,	/* local (CPU) APIC) -- required for SMP or not */  	FIX_IO_APIC_BASE_0,  	FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1, -	FIX_EFI_IO_MAP_LAST_PAGE, -	FIX_EFI_IO_MAP_FIRST_PAGE = FIX_EFI_IO_MAP_LAST_PAGE -				  + MAX_EFI_IO_PAGES - 1,  #ifdef CONFIG_PARAVIRT  	FIX_PARAVIRT_BOOTMAP,  #endif diff --git a/arch/x86/include/asm/i387.h b/arch/x86/include/asm/i387.h index 48f0004db8c..71c9e518398 100644 --- a/arch/x86/include/asm/i387.h +++ b/arch/x86/include/asm/i387.h @@ -172,7 +172,13 @@ static inline void __save_init_fpu(struct task_struct *tsk)  #else  /* CONFIG_X86_32 */ -extern void finit(void); +#ifdef CONFIG_MATH_EMULATION +extern void finit_task(struct task_struct *tsk); +#else +static inline void finit_task(struct task_struct *tsk) +{ +} +#endif  static inline void tolerant_fwait(void)  { diff --git a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c index b585e04cbc9..3178c3acd97 100644 --- a/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c +++ b/arch/x86/kernel/cpu/cpufreq/p4-clockmod.c @@ -277,7 +277,6 @@ static struct cpufreq_driver p4clockmod_driver = {  	.name		= "p4-clockmod",  	.owner		= THIS_MODULE,  	.attr		= p4clockmod_attr, -	.hide_interface	= 1,  }; diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index 169a120587b..87b67e3a765 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c @@ -729,7 +729,7 @@ struct pebs_tracer *ds_request_pebs(struct task_struct *task,  	spin_unlock_irqrestore(&ds_lock, irq); -	ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_bts); +	ds_write_config(tracer->ds.context, &tracer->trace.ds, ds_pebs);  	ds_resume_pebs(tracer);  	return tracer; @@ -1029,5 +1029,4 @@ void ds_copy_thread(struct task_struct *tsk, struct task_struct *father)  void ds_exit_thread(struct task_struct *tsk)  { -	WARN_ON(tsk->thread.ds_ctx);  } diff --git a/arch/x86/kernel/efi.c b/arch/x86/kernel/efi.c index 1119d247fe1..eb1ef3b67dd 100644 --- a/arch/x86/kernel/efi.c +++ b/arch/x86/kernel/efi.c @@ -467,7 +467,7 @@ void __init efi_enter_virtual_mode(void)  	efi_memory_desc_t *md;  	efi_status_t status;  	unsigned long size; -	u64 end, systab, addr, npages; +	u64 end, systab, addr, npages, end_pfn;  	void *p, *va;  	efi.systab = NULL; @@ -479,7 +479,10 @@ void __init efi_enter_virtual_mode(void)  		size = md->num_pages << EFI_PAGE_SHIFT;  		end = md->phys_addr + size; -		if (PFN_UP(end) <= max_low_pfn_mapped) +		end_pfn = PFN_UP(end); +		if (end_pfn <= max_low_pfn_mapped +		    || (end_pfn > (1UL << (32 - PAGE_SHIFT)) +			&& end_pfn <= max_pfn_mapped))  			va = __va(md->phys_addr);  		else  			va = efi_ioremap(md->phys_addr, size); diff --git a/arch/x86/kernel/efi_64.c b/arch/x86/kernel/efi_64.c index 652c5287215..cb783b92c50 100644 --- a/arch/x86/kernel/efi_64.c +++ b/arch/x86/kernel/efi_64.c @@ -99,24 +99,11 @@ void __init efi_call_phys_epilog(void)  void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size)  { -	static unsigned pages_mapped __initdata; -	unsigned i, pages; -	unsigned long offset; +	unsigned long last_map_pfn; -	pages = PFN_UP(phys_addr + size) - PFN_DOWN(phys_addr); -	offset = phys_addr & ~PAGE_MASK; -	phys_addr &= PAGE_MASK; - -	if (pages_mapped + pages > MAX_EFI_IO_PAGES) +	last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size); +	if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size)  		return NULL; -	for (i = 0; i < pages; i++) { -		__set_fixmap(FIX_EFI_IO_MAP_FIRST_PAGE - pages_mapped, -			     phys_addr, PAGE_KERNEL); -		phys_addr += PAGE_SIZE; -		pages_mapped++; -	} - -	return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \ -					     (pages_mapped - pages)) + offset; +	return (void __iomem *)__va(phys_addr);  } diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index b0f61f0dcd0..f2f8540a7f3 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c @@ -136,7 +136,7 @@ int init_fpu(struct task_struct *tsk)  #ifdef CONFIG_X86_32  	if (!HAVE_HWFP) {  		memset(tsk->thread.xstate, 0, xstate_size); -		finit(); +		finit_task(tsk);  		set_stopped_child_used_math(tsk);  		return 0;  	} diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c index e948b28a5a9..4558dd3918c 100644 --- a/arch/x86/kernel/kprobes.c +++ b/arch/x86/kernel/kprobes.c @@ -193,6 +193,9 @@ static int __kprobes can_boost(kprobe_opcode_t *opcodes)  	kprobe_opcode_t opcode;  	kprobe_opcode_t *orig_opcodes = opcodes; +	if (search_exception_tables(opcodes)) +		return 0;	/* Page fault may occur on this address. */ +  retry:  	if (opcodes - orig_opcodes > MAX_INSN_SIZE - 1)  		return 0; diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 2b46eb41643..4526b3a75ed 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -217,6 +217,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {  			DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"),  		},  	}, +	{	/* Handle problems with rebooting on Dell XPS710 */ +		.callback = set_bios_reboot, +		.ident = "Dell XPS710", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), +			DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"), +		}, +	},  	{ }  }; diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index c461f6d6907..6a8811a6932 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -770,6 +770,9 @@ void __init setup_arch(char **cmdline_p)  	finish_e820_parsing(); +	if (efi_enabled) +		efi_init(); +  	dmi_scan_machine();  	dmi_check_system(bad_bios_dmi_table); @@ -789,8 +792,6 @@ void __init setup_arch(char **cmdline_p)  	insert_resource(&iomem_resource, &data_resource);  	insert_resource(&iomem_resource, &bss_resource); -	if (efi_enabled) -		efi_init();  #ifdef CONFIG_X86_32  	if (ppro_with_ram_bug()) { diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 599e5816863..d5cebb52d45 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -273,30 +273,43 @@ static unsigned long pit_calibrate_tsc(u32 latch, unsigned long ms, int loopmin)   * use the TSC value at the transitions to calculate a pretty   * good value for the TSC frequencty.   */ -static inline int pit_expect_msb(unsigned char val) +static inline int pit_expect_msb(unsigned char val, u64 *tscp, unsigned long *deltap)  { -	int count = 0; +	int count; +	u64 tsc = 0;  	for (count = 0; count < 50000; count++) {  		/* Ignore LSB */  		inb(0x42);  		if (inb(0x42) != val)  			break; +		tsc = get_cycles();  	} -	return count > 50; +	*deltap = get_cycles() - tsc; +	*tscp = tsc; + +	/* +	 * We require _some_ success, but the quality control +	 * will be based on the error terms on the TSC values. +	 */ +	return count > 5;  }  /* - * How many MSB values do we want to see? We aim for a - * 15ms calibration, which assuming a 2us counter read - * error should give us roughly 150 ppm precision for - * the calibration. + * How many MSB values do we want to see? We aim for + * a maximum error rate of 500ppm (in practice the + * real error is much smaller), but refuse to spend + * more than 25ms on it.   */ -#define QUICK_PIT_MS 15 -#define QUICK_PIT_ITERATIONS (QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256) +#define MAX_QUICK_PIT_MS 25 +#define MAX_QUICK_PIT_ITERATIONS (MAX_QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256)  static unsigned long quick_pit_calibrate(void)  { +	int i; +	u64 tsc, delta; +	unsigned long d1, d2; +  	/* Set the Gate high, disable speaker */  	outb((inb(0x61) & ~0x02) | 0x01, 0x61); @@ -315,45 +328,52 @@ static unsigned long quick_pit_calibrate(void)  	outb(0xff, 0x42);  	outb(0xff, 0x42); -	if (pit_expect_msb(0xff)) { -		int i; -		u64 t1, t2, delta; -		unsigned char expect = 0xfe; - -		t1 = get_cycles(); -		for (i = 0; i < QUICK_PIT_ITERATIONS; i++, expect--) { -			if (!pit_expect_msb(expect)) -				goto failed; -		} -		t2 = get_cycles(); +	/* +	 * The PIT starts counting at the next edge, so we +	 * need to delay for a microsecond. The easiest way +	 * to do that is to just read back the 16-bit counter +	 * once from the PIT. +	 */ +	inb(0x42); +	inb(0x42); -		/* -		 * Make sure we can rely on the second TSC timestamp: -		 */ -		if (!pit_expect_msb(expect)) -			goto failed; +	if (pit_expect_msb(0xff, &tsc, &d1)) { +		for (i = 1; i <= MAX_QUICK_PIT_ITERATIONS; i++) { +			if (!pit_expect_msb(0xff-i, &delta, &d2)) +				break; -		/* -		 * Ok, if we get here, then we've seen the -		 * MSB of the PIT decrement QUICK_PIT_ITERATIONS -		 * times, and each MSB had many hits, so we never -		 * had any sudden jumps. -		 * -		 * As a result, we can depend on there not being -		 * any odd delays anywhere, and the TSC reads are -		 * reliable. -		 * -		 * kHz = ticks / time-in-seconds / 1000; -		 * kHz = (t2 - t1) / (QPI * 256 / PIT_TICK_RATE) / 1000 -		 * kHz = ((t2 - t1) * PIT_TICK_RATE) / (QPI * 256 * 1000) -		 */ -		delta = (t2 - t1)*PIT_TICK_RATE; -		do_div(delta, QUICK_PIT_ITERATIONS*256*1000); -		printk("Fast TSC calibration using PIT\n"); -		return delta; +			/* +			 * Iterate until the error is less than 500 ppm +			 */ +			delta -= tsc; +			if (d1+d2 < delta >> 11) +				goto success; +		}  	} -failed: +	printk("Fast TSC calibration failed\n");  	return 0; + +success: +	/* +	 * Ok, if we get here, then we've seen the +	 * MSB of the PIT decrement 'i' times, and the +	 * error has shrunk to less than 500 ppm. +	 * +	 * As a result, we can depend on there not being +	 * any odd delays anywhere, and the TSC reads are +	 * reliable (within the error). We also adjust the +	 * delta to the middle of the error bars, just +	 * because it looks nicer. +	 * +	 * kHz = ticks / time-in-seconds / 1000; +	 * kHz = (t2 - t1) / (I * 256 / PIT_TICK_RATE) / 1000 +	 * kHz = ((t2 - t1) * PIT_TICK_RATE) / (I * 256 * 1000) +	 */ +	delta += (long)(d2 - d1)/2; +	delta *= PIT_TICK_RATE; +	do_div(delta, i*256*1000); +	printk("Fast TSC calibration using PIT\n"); +	return delta;  }  /** diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index 92f1c6f3e19..960a8d9c049 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c @@ -343,6 +343,11 @@ static void lguest_cpuid(unsigned int *ax, unsigned int *bx,  		 * flush_tlb_user() for both user and kernel mappings unless  		 * the Page Global Enable (PGE) feature bit is set. */  		*dx |= 0x00002000; +		/* We also lie, and say we're family id 5.  6 or greater +		 * leads to a rdmsr in early_init_intel which we can't handle. +		 * Family ID is returned as bits 8-12 in ax. */ +		*ax &= 0xFFFFF0FF; +		*ax |= 0x00000500;  		break;  	case 0x80000000:  		/* Futureproof this a little: if they ask how much extended @@ -589,19 +594,21 @@ static void __init lguest_init_IRQ(void)  		/* Some systems map "vectors" to interrupts weirdly.  Lguest has  		 * a straightforward 1 to 1 mapping, so force that here. */  		__get_cpu_var(vector_irq)[vector] = i; -		if (vector != SYSCALL_VECTOR) { -			set_intr_gate(vector, -				      interrupt[vector-FIRST_EXTERNAL_VECTOR]); -			set_irq_chip_and_handler_name(i, &lguest_irq_controller, -						      handle_level_irq, -						      "level"); -		} +		if (vector != SYSCALL_VECTOR) +			set_intr_gate(vector, interrupt[i]);  	}  	/* This call is required to set up for 4k stacks, where we have  	 * separate stacks for hard and soft interrupts. */  	irq_ctx_init(smp_processor_id());  } +void lguest_setup_irq(unsigned int irq) +{ +	irq_to_desc_alloc_cpu(irq, 0); +	set_irq_chip_and_handler_name(irq, &lguest_irq_controller, +				      handle_level_irq, "level"); +} +  /*   * Time.   * diff --git a/arch/x86/math-emu/fpu_aux.c b/arch/x86/math-emu/fpu_aux.c index 491e737ce54..aa098708877 100644 --- a/arch/x86/math-emu/fpu_aux.c +++ b/arch/x86/math-emu/fpu_aux.c @@ -30,20 +30,29 @@ static void fclex(void)  }  /* Needs to be externally visible */ -void finit(void) +void finit_task(struct task_struct *tsk)  { -	control_word = 0x037f; -	partial_status = 0; -	top = 0;		/* We don't keep top in the status word internally. */ -	fpu_tag_word = 0xffff; +	struct i387_soft_struct *soft = &tsk->thread.xstate->soft; +	struct address *oaddr, *iaddr; +	soft->cwd = 0x037f; +	soft->swd = 0; +	soft->ftop = 0;	/* We don't keep top in the status word internally. */ +	soft->twd = 0xffff;  	/* The behaviour is different from that detailed in  	   Section 15.1.6 of the Intel manual */ -	operand_address.offset = 0; -	operand_address.selector = 0; -	instruction_address.offset = 0; -	instruction_address.selector = 0; -	instruction_address.opcode = 0; -	no_ip_update = 1; +	oaddr = (struct address *)&soft->foo; +	oaddr->offset = 0; +	oaddr->selector = 0; +	iaddr = (struct address *)&soft->fip; +	iaddr->offset = 0; +	iaddr->selector = 0; +	iaddr->opcode = 0; +	soft->no_update = 1; +} + +void finit(void) +{ +	finit_task(current);  }  /* diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index e6d36b49025..b1352250096 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -714,6 +714,8 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,  	pos = start_pfn << PAGE_SHIFT;  	end_pfn = ((pos + (PMD_SIZE - 1)) >> PMD_SHIFT)  			<< (PMD_SHIFT - PAGE_SHIFT); +	if (end_pfn > (end >> PAGE_SHIFT)) +		end_pfn = end >> PAGE_SHIFT;  	if (start_pfn < end_pfn) {  		nr_range = save_mr(mr, nr_range, start_pfn, end_pfn, 0);  		pos = end_pfn << PAGE_SHIFT; diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c index 93d82038af4..6a518dd08a3 100644 --- a/arch/x86/mm/kmmio.c +++ b/arch/x86/mm/kmmio.c @@ -32,11 +32,14 @@ struct kmmio_fault_page {  	struct list_head list;  	struct kmmio_fault_page *release_next;  	unsigned long page; /* location of the fault page */ +	bool old_presence; /* page presence prior to arming */ +	bool armed;  	/*  	 * Number of times this page has been registered as a part  	 * of a probe. If zero, page is disarmed and this may be freed. -	 * Used only by writers (RCU). +	 * Used only by writers (RCU) and post_kmmio_handler(). +	 * Protected by kmmio_lock, when linked into kmmio_page_table.  	 */  	int count;  }; @@ -105,57 +108,85 @@ static struct kmmio_fault_page *get_kmmio_fault_page(unsigned long page)  	return NULL;  } -static void set_page_present(unsigned long addr, bool present, -							unsigned int *pglevel) +static void set_pmd_presence(pmd_t *pmd, bool present, bool *old) +{ +	pmdval_t v = pmd_val(*pmd); +	*old = !!(v & _PAGE_PRESENT); +	v &= ~_PAGE_PRESENT; +	if (present) +		v |= _PAGE_PRESENT; +	set_pmd(pmd, __pmd(v)); +} + +static void set_pte_presence(pte_t *pte, bool present, bool *old) +{ +	pteval_t v = pte_val(*pte); +	*old = !!(v & _PAGE_PRESENT); +	v &= ~_PAGE_PRESENT; +	if (present) +		v |= _PAGE_PRESENT; +	set_pte_atomic(pte, __pte(v)); +} + +static int set_page_presence(unsigned long addr, bool present, bool *old)  { -	pteval_t pteval; -	pmdval_t pmdval;  	unsigned int level; -	pmd_t *pmd;  	pte_t *pte = lookup_address(addr, &level);  	if (!pte) {  		pr_err("kmmio: no pte for page 0x%08lx\n", addr); -		return; +		return -1;  	} -	if (pglevel) -		*pglevel = level; -  	switch (level) {  	case PG_LEVEL_2M: -		pmd = (pmd_t *)pte; -		pmdval = pmd_val(*pmd) & ~_PAGE_PRESENT; -		if (present) -			pmdval |= _PAGE_PRESENT; -		set_pmd(pmd, __pmd(pmdval)); +		set_pmd_presence((pmd_t *)pte, present, old);  		break; -  	case PG_LEVEL_4K: -		pteval = pte_val(*pte) & ~_PAGE_PRESENT; -		if (present) -			pteval |= _PAGE_PRESENT; -		set_pte_atomic(pte, __pte(pteval)); +		set_pte_presence(pte, present, old);  		break; -  	default:  		pr_err("kmmio: unexpected page level 0x%x.\n", level); -		return; +		return -1;  	}  	__flush_tlb_one(addr); +	return 0;  } -/** Mark the given page as not present. Access to it will trigger a fault. */ -static void arm_kmmio_fault_page(unsigned long page, unsigned int *pglevel) +/* + * Mark the given page as not present. Access to it will trigger a fault. + * + * Struct kmmio_fault_page is protected by RCU and kmmio_lock, but the + * protection is ignored here. RCU read lock is assumed held, so the struct + * will not disappear unexpectedly. Furthermore, the caller must guarantee, + * that double arming the same virtual address (page) cannot occur. + * + * Double disarming on the other hand is allowed, and may occur when a fault + * and mmiotrace shutdown happen simultaneously. + */ +static int arm_kmmio_fault_page(struct kmmio_fault_page *f)  { -	set_page_present(page & PAGE_MASK, false, pglevel); +	int ret; +	WARN_ONCE(f->armed, KERN_ERR "kmmio page already armed.\n"); +	if (f->armed) { +		pr_warning("kmmio double-arm: page 0x%08lx, ref %d, old %d\n", +					f->page, f->count, f->old_presence); +	} +	ret = set_page_presence(f->page, false, &f->old_presence); +	WARN_ONCE(ret < 0, KERN_ERR "kmmio arming 0x%08lx failed.\n", f->page); +	f->armed = true; +	return ret;  } -/** Mark the given page as present. */ -static void disarm_kmmio_fault_page(unsigned long page, unsigned int *pglevel) +/** Restore the given page to saved presence state. */ +static void disarm_kmmio_fault_page(struct kmmio_fault_page *f)  { -	set_page_present(page & PAGE_MASK, true, pglevel); +	bool tmp; +	int ret = set_page_presence(f->page, f->old_presence, &tmp); +	WARN_ONCE(ret < 0, +			KERN_ERR "kmmio disarming 0x%08lx failed.\n", f->page); +	f->armed = false;  }  /* @@ -202,28 +233,32 @@ int kmmio_handler(struct pt_regs *regs, unsigned long addr)  	ctx = &get_cpu_var(kmmio_ctx);  	if (ctx->active) { -		disarm_kmmio_fault_page(faultpage->page, NULL);  		if (addr == ctx->addr) {  			/* -			 * On SMP we sometimes get recursive probe hits on the -			 * same address. Context is already saved, fall out. +			 * A second fault on the same page means some other +			 * condition needs handling by do_page_fault(), the +			 * page really not being present is the most common.  			 */ -			pr_debug("kmmio: duplicate probe hit on CPU %d, for " -						"address 0x%08lx.\n", -						smp_processor_id(), addr); -			ret = 1; -			goto no_kmmio_ctx; -		} -		/* -		 * Prevent overwriting already in-flight context. -		 * This should not happen, let's hope disarming at least -		 * prevents a panic. -		 */ -		pr_emerg("kmmio: recursive probe hit on CPU %d, " +			pr_debug("kmmio: secondary hit for 0x%08lx CPU %d.\n", +					addr, smp_processor_id()); + +			if (!faultpage->old_presence) +				pr_info("kmmio: unexpected secondary hit for " +					"address 0x%08lx on CPU %d.\n", addr, +					smp_processor_id()); +		} else { +			/* +			 * Prevent overwriting already in-flight context. +			 * This should not happen, let's hope disarming at +			 * least prevents a panic. +			 */ +			pr_emerg("kmmio: recursive probe hit on CPU %d, "  					"for address 0x%08lx. Ignoring.\n",  					smp_processor_id(), addr); -		pr_emerg("kmmio: previous hit was at 0x%08lx.\n", -					ctx->addr); +			pr_emerg("kmmio: previous hit was at 0x%08lx.\n", +						ctx->addr); +			disarm_kmmio_fault_page(faultpage); +		}  		goto no_kmmio_ctx;  	}  	ctx->active++; @@ -244,7 +279,7 @@ int kmmio_handler(struct pt_regs *regs, unsigned long addr)  	regs->flags &= ~X86_EFLAGS_IF;  	/* Now we set present bit in PTE and single step. */ -	disarm_kmmio_fault_page(ctx->fpage->page, NULL); +	disarm_kmmio_fault_page(ctx->fpage);  	/*  	 * If another cpu accesses the same page while we are stepping, @@ -275,7 +310,7 @@ static int post_kmmio_handler(unsigned long condition, struct pt_regs *regs)  	struct kmmio_context *ctx = &get_cpu_var(kmmio_ctx);  	if (!ctx->active) { -		pr_debug("kmmio: spurious debug trap on CPU %d.\n", +		pr_warning("kmmio: spurious debug trap on CPU %d.\n",  							smp_processor_id());  		goto out;  	} @@ -283,7 +318,11 @@ static int post_kmmio_handler(unsigned long condition, struct pt_regs *regs)  	if (ctx->probe && ctx->probe->post_handler)  		ctx->probe->post_handler(ctx->probe, condition, regs); -	arm_kmmio_fault_page(ctx->fpage->page, NULL); +	/* Prevent racing against release_kmmio_fault_page(). */ +	spin_lock(&kmmio_lock); +	if (ctx->fpage->count) +		arm_kmmio_fault_page(ctx->fpage); +	spin_unlock(&kmmio_lock);  	regs->flags &= ~X86_EFLAGS_TF;  	regs->flags |= ctx->saved_flags; @@ -315,20 +354,24 @@ static int add_kmmio_fault_page(unsigned long page)  	f = get_kmmio_fault_page(page);  	if (f) {  		if (!f->count) -			arm_kmmio_fault_page(f->page, NULL); +			arm_kmmio_fault_page(f);  		f->count++;  		return 0;  	} -	f = kmalloc(sizeof(*f), GFP_ATOMIC); +	f = kzalloc(sizeof(*f), GFP_ATOMIC);  	if (!f)  		return -1;  	f->count = 1;  	f->page = page; -	list_add_rcu(&f->list, kmmio_page_list(f->page)); -	arm_kmmio_fault_page(f->page, NULL); +	if (arm_kmmio_fault_page(f)) { +		kfree(f); +		return -1; +	} + +	list_add_rcu(&f->list, kmmio_page_list(f->page));  	return 0;  } @@ -347,7 +390,7 @@ static void release_kmmio_fault_page(unsigned long page,  	f->count--;  	BUG_ON(f->count < 0);  	if (!f->count) { -		disarm_kmmio_fault_page(f->page, NULL); +		disarm_kmmio_fault_page(f);  		f->release_next = *release_list;  		*release_list = f;  	} @@ -408,23 +451,24 @@ static void rcu_free_kmmio_fault_pages(struct rcu_head *head)  static void remove_kmmio_fault_pages(struct rcu_head *head)  { -	struct kmmio_delayed_release *dr = container_of( -						head, -						struct kmmio_delayed_release, -						rcu); +	struct kmmio_delayed_release *dr = +		container_of(head, struct kmmio_delayed_release, rcu);  	struct kmmio_fault_page *p = dr->release_list;  	struct kmmio_fault_page **prevp = &dr->release_list;  	unsigned long flags; +  	spin_lock_irqsave(&kmmio_lock, flags);  	while (p) { -		if (!p->count) +		if (!p->count) {  			list_del_rcu(&p->list); -		else +			prevp = &p->release_next; +		} else {  			*prevp = p->release_next; -		prevp = &p->release_next; +		}  		p = p->release_next;  	}  	spin_unlock_irqrestore(&kmmio_lock, flags); +  	/* This is the real RCU destroy call. */  	call_rcu(&dr->rcu, rcu_free_kmmio_fault_pages);  } diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 7be47d1a97e..7233bd7e357 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -515,6 +515,17 @@ static int split_large_page(pte_t *kpte, unsigned long address)  	 * primary protection behavior:  	 */  	__set_pmd_pte(kpte, address, mk_pte(base, __pgprot(_KERNPG_TABLE))); + +	/* +	 * Intel Atom errata AAH41 workaround. +	 * +	 * The real fix should be in hw or in a microcode update, but +	 * we also probabilistically try to reduce the window of having +	 * a large TLB mixed with 4K TLBs while instruction fetches are +	 * going on. +	 */ +	__flush_tlb_all(); +  	base = NULL;  out_unlock: diff --git a/arch/x86/mm/testmmiotrace.c b/arch/x86/mm/testmmiotrace.c index ab50a8d7402..427fd1b56df 100644 --- a/arch/x86/mm/testmmiotrace.c +++ b/arch/x86/mm/testmmiotrace.c @@ -1,5 +1,5 @@  /* - * Written by Pekka Paalanen, 2008 <pq@iki.fi> + * Written by Pekka Paalanen, 2008-2009 <pq@iki.fi>   */  #include <linux/module.h>  #include <linux/io.h> @@ -9,35 +9,74 @@  static unsigned long mmio_address;  module_param(mmio_address, ulong, 0); -MODULE_PARM_DESC(mmio_address, "Start address of the mapping of 16 kB."); +MODULE_PARM_DESC(mmio_address, " Start address of the mapping of 16 kB " +				"(or 8 MB if read_far is non-zero)."); + +static unsigned long read_far = 0x400100; +module_param(read_far, ulong, 0); +MODULE_PARM_DESC(read_far, " Offset of a 32-bit read within 8 MB " +				"(default: 0x400100)."); + +static unsigned v16(unsigned i) +{ +	return i * 12 + 7; +} + +static unsigned v32(unsigned i) +{ +	return i * 212371 + 13; +}  static void do_write_test(void __iomem *p)  {  	unsigned int i; +	pr_info(MODULE_NAME ": write test.\n");  	mmiotrace_printk("Write test.\n"); +  	for (i = 0; i < 256; i++)  		iowrite8(i, p + i); +  	for (i = 1024; i < (5 * 1024); i += 2) -		iowrite16(i * 12 + 7, p + i); +		iowrite16(v16(i), p + i); +  	for (i = (5 * 1024); i < (16 * 1024); i += 4) -		iowrite32(i * 212371 + 13, p + i); +		iowrite32(v32(i), p + i);  }  static void do_read_test(void __iomem *p)  {  	unsigned int i; +	unsigned errs[3] = { 0 }; +	pr_info(MODULE_NAME ": read test.\n");  	mmiotrace_printk("Read test.\n"); +  	for (i = 0; i < 256; i++) -		ioread8(p + i); +		if (ioread8(p + i) != i) +			++errs[0]; +  	for (i = 1024; i < (5 * 1024); i += 2) -		ioread16(p + i); +		if (ioread16(p + i) != v16(i)) +			++errs[1]; +  	for (i = (5 * 1024); i < (16 * 1024); i += 4) -		ioread32(p + i); +		if (ioread32(p + i) != v32(i)) +			++errs[2]; + +	mmiotrace_printk("Read errors: 8-bit %d, 16-bit %d, 32-bit %d.\n", +						errs[0], errs[1], errs[2]);  } -static void do_test(void) +static void do_read_far_test(void __iomem *p)  { -	void __iomem *p = ioremap_nocache(mmio_address, 0x4000); +	pr_info(MODULE_NAME ": read far test.\n"); +	mmiotrace_printk("Read far test.\n"); + +	ioread32(p + read_far); +} + +static void do_test(unsigned long size) +{ +	void __iomem *p = ioremap_nocache(mmio_address, size);  	if (!p) {  		pr_err(MODULE_NAME ": could not ioremap, aborting.\n");  		return; @@ -45,11 +84,15 @@ static void do_test(void)  	mmiotrace_printk("ioremap returned %p.\n", p);  	do_write_test(p);  	do_read_test(p); +	if (read_far && read_far < size - 4) +		do_read_far_test(p);  	iounmap(p);  }  static int __init init(void)  { +	unsigned long size = (read_far) ? (8 << 20) : (16 << 10); +  	if (mmio_address == 0) {  		pr_err(MODULE_NAME ": you have to use the module argument "  							"mmio_address.\n"); @@ -58,10 +101,11 @@ static int __init init(void)  		return -ENXIO;  	} -	pr_warning(MODULE_NAME ": WARNING: mapping 16 kB @ 0x%08lx " -					"in PCI address space, and writing " -					"rubbish in there.\n", mmio_address); -	do_test(); +	pr_warning(MODULE_NAME ": WARNING: mapping %lu kB @ 0x%08lx in PCI " +		"address space, and writing 16 kB of rubbish in there.\n", +		 size >> 10, mmio_address); +	do_test(size); +	pr_info(MODULE_NAME ": All done.\n");  	return 0;  } diff --git a/arch/x86/oprofile/op_model_ppro.c b/arch/x86/oprofile/op_model_ppro.c index e9f80c744cf..10131fbdaad 100644 --- a/arch/x86/oprofile/op_model_ppro.c +++ b/arch/x86/oprofile/op_model_ppro.c @@ -78,8 +78,18 @@ static void ppro_setup_ctrs(struct op_msrs const * const msrs)  	if (cpu_has_arch_perfmon) {  		union cpuid10_eax eax;  		eax.full = cpuid_eax(0xa); -		if (counter_width < eax.split.bit_width) -			counter_width = eax.split.bit_width; + +		/* +		 * For Core2 (family 6, model 15), don't reset the +		 * counter width: +		 */ +		if (!(eax.split.version_id == 0 && +			current_cpu_data.x86 == 6 && +				current_cpu_data.x86_model == 15)) { + +			if (counter_width < eax.split.bit_width) +				counter_width = eax.split.bit_width; +		}  	}  	/* clear all counters */ diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index 6c873dceb17..98120083043 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -103,9 +103,6 @@ config MATH_EMULATION  	help  	Can we use information of configuration file? -config HIGHMEM -	bool "High memory support" -  endmenu  menu "Platform options" diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c index 9606d2bd1dd..4ec1633c294 100644 --- a/arch/xtensa/kernel/setup.c +++ b/arch/xtensa/kernel/setup.c @@ -44,6 +44,8 @@  #include <asm/setup.h>  #include <asm/param.h> +#include <platform/hardware.h> +  #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)  struct screen_info screen_info = { 0, 24, 0, 0, 0, 80, 0, 0, 0, 24, 1, 16};  #endif diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c index c7a021d9f69..c44f830b6c7 100644 --- a/arch/xtensa/kernel/traps.c +++ b/arch/xtensa/kernel/traps.c @@ -30,6 +30,7 @@  #include <linux/stringify.h>  #include <linux/kallsyms.h>  #include <linux/delay.h> +#include <linux/hardirq.h>  #include <asm/ptrace.h>  #include <asm/timex.h> diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c index 33f366be323..bdd860d93f7 100644 --- a/arch/xtensa/mm/fault.c +++ b/arch/xtensa/mm/fault.c @@ -14,6 +14,7 @@  #include <linux/mm.h>  #include <linux/module.h> +#include <linux/hardirq.h>  #include <asm/mmu_context.h>  #include <asm/cacheflush.h>  #include <asm/hardirq.h> diff --git a/arch/xtensa/platforms/iss/console.c b/arch/xtensa/platforms/iss/console.c index efed8897bef..25d46c84eb0 100644 --- a/arch/xtensa/platforms/iss/console.c +++ b/arch/xtensa/platforms/iss/console.c @@ -140,16 +140,14 @@ static void rs_poll(unsigned long priv)  } -static void rs_put_char(struct tty_struct *tty, unsigned char ch) +static int rs_put_char(struct tty_struct *tty, unsigned char ch)  {  	char buf[2]; -	if (!tty) -		return; -  	buf[0] = ch;  	buf[1] = '\0';		/* Is this NULL necessary? */  	__simc (SYS_write, 1, (unsigned long) buf, 1, 0, 0); +	return 1;  }  static void rs_flush_chars(struct tty_struct *tty) diff --git a/block/blk-merge.c b/block/blk-merge.c index a104593e70c..5a244f05360 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -39,14 +39,13 @@ void blk_recalc_rq_sectors(struct request *rq, int nsect)  }  static unsigned int __blk_recalc_rq_segments(struct request_queue *q, -					     struct bio *bio, -					     unsigned int *seg_size_ptr) +					     struct bio *bio)  {  	unsigned int phys_size;  	struct bio_vec *bv, *bvprv = NULL;  	int cluster, i, high, highprv = 1;  	unsigned int seg_size, nr_phys_segs; -	struct bio *fbio; +	struct bio *fbio, *bbio;  	if (!bio)  		return 0; @@ -87,26 +86,20 @@ new_segment:  			seg_size = bv->bv_len;  			highprv = high;  		} +		bbio = bio;  	} -	if (seg_size_ptr) -		*seg_size_ptr = seg_size; +	if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) +		fbio->bi_seg_front_size = seg_size; +	if (seg_size > bbio->bi_seg_back_size) +		bbio->bi_seg_back_size = seg_size;  	return nr_phys_segs;  }  void blk_recalc_rq_segments(struct request *rq)  { -	unsigned int seg_size = 0, phys_segs; - -	phys_segs = __blk_recalc_rq_segments(rq->q, rq->bio, &seg_size); - -	if (phys_segs == 1 && seg_size > rq->bio->bi_seg_front_size) -		rq->bio->bi_seg_front_size = seg_size; -	if (seg_size > rq->biotail->bi_seg_back_size) -		rq->biotail->bi_seg_back_size = seg_size; - -	rq->nr_phys_segments = phys_segs; +	rq->nr_phys_segments = __blk_recalc_rq_segments(rq->q, rq->bio);  }  void blk_recount_segments(struct request_queue *q, struct bio *bio) @@ -114,7 +107,7 @@ void blk_recount_segments(struct request_queue *q, struct bio *bio)  	struct bio *nxt = bio->bi_next;  	bio->bi_next = NULL; -	bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio, NULL); +	bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio);  	bio->bi_next = nxt;  	bio->bi_flags |= (1 << BIO_SEG_VALID);  } diff --git a/crypto/api.c b/crypto/api.c index efe77df6863..38a2bc02a98 100644 --- a/crypto/api.c +++ b/crypto/api.c @@ -215,8 +215,19 @@ struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask)  	mask &= ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD);  	type &= mask; -	alg = try_then_request_module(crypto_alg_lookup(name, type, mask), -				      name); +	alg = crypto_alg_lookup(name, type, mask); +	if (!alg) { +		char tmp[CRYPTO_MAX_ALG_NAME]; + +		request_module(name); + +		if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask) && +		    snprintf(tmp, sizeof(tmp), "%s-all", name) < sizeof(tmp)) +			request_module(tmp); + +		alg = crypto_alg_lookup(name, type, mask); +	} +  	if (alg)  		return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg; diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 765fd1c56cd..bee64b73c91 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -758,8 +758,7 @@ static int __init acpi_bus_init(void)  	acpi_status status = AE_OK;  	extern acpi_status acpi_os_initialize1(void); - -	status = acpi_os_initialize1(); +	acpi_os_initialize1();  	status =  	    acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE); @@ -769,12 +768,6 @@ static int __init acpi_bus_init(void)  		goto error1;  	} -	if (ACPI_FAILURE(status)) { -		printk(KERN_ERR PREFIX -		       "Unable to initialize ACPI OS objects\n"); -		goto error1; -	} -  	/*  	 * ACPI 2.0 requires the EC driver to be loaded and work before  	 * the EC device is found in the namespace (i.e. before acpi_initialize_objects() diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index c5e292aab0e..3a0d8ef25c7 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c @@ -277,7 +277,7 @@ int acpi_get_node(acpi_handle *handle)  	int pxm, node = -1;  	pxm = acpi_get_pxm(handle); -	if (pxm >= 0) +	if (pxm >= 0 && pxm < MAX_PXM_DOMAINS)  		node = acpi_map_pxm_to_node(pxm);  	return node; diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index b3193ec0a2e..1e35f342957 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -1317,54 +1317,6 @@ acpi_os_validate_interface (char *interface)  	return AE_SUPPORT;  } -#ifdef	CONFIG_X86 - -struct aml_port_desc { -	uint	start; -	uint	end; -	char*   name; -	char	warned; -}; - -static struct aml_port_desc aml_invalid_port_list[] = { -	{0x20, 0x21, "PIC0", 0}, -	{0xA0, 0xA1, "PIC1", 0}, -	{0x4D0, 0x4D1, "ELCR", 0} -}; - -/* - * valid_aml_io_address() - * - * if valid, return true - * else invalid, warn once, return false - */ -static bool valid_aml_io_address(uint address, uint length) -{ -	int i; -	int entries = sizeof(aml_invalid_port_list) / sizeof(struct aml_port_desc); - -	for (i = 0; i < entries; ++i) { -		if ((address >= aml_invalid_port_list[i].start && -			address <= aml_invalid_port_list[i].end) || -			(address + length >= aml_invalid_port_list[i].start && -			address  + length <= aml_invalid_port_list[i].end)) -		{ -			if (!aml_invalid_port_list[i].warned) -			{ -				printk(KERN_ERR "ACPI: Denied BIOS AML access" -					" to invalid port 0x%x+0x%x (%s)\n", -					address, length, -					aml_invalid_port_list[i].name); -				aml_invalid_port_list[i].warned = 1; -			} -			return false;	/* invalid */ -		} -	} -	return true;	/* valid */ -} -#else -static inline bool valid_aml_io_address(uint address, uint length) { return true; } -#endif  /******************************************************************************   *   * FUNCTION:    acpi_os_validate_address @@ -1394,8 +1346,6 @@ acpi_os_validate_address (  	switch (space_id) {  	case ACPI_ADR_SPACE_SYSTEM_IO: -		if (!valid_aml_io_address(address, length)) -			return AE_AML_ILLEGAL_ADDRESS;  	case ACPI_ADR_SPACE_SYSTEM_MEMORY:  		/* Only interference checks against SystemIO and SytemMemory  		   are needed */ diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 519266654f0..00456fccfa3 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c @@ -378,6 +378,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {  		DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),  		},  	}, +	{ +	.callback = init_old_suspend_ordering, +	.ident = "Asus Pundit P1-AH2 (M2N8L motherboard)", +	.matches = { +		DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTek Computer INC."), +		DMI_MATCH(DMI_BOARD_NAME, "M2N8L"), +		}, +	}, +	{ +	.callback = init_set_sci_en_on_resume, +	.ident = "Toshiba Satellite L300", +	.matches = { +		DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), +		DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L300"), +		}, +	},  	{},  };  #endif /* CONFIG_SUSPEND */ diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index a603bbf9b1b..66e012cd327 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -582,18 +582,18 @@ static const struct pci_device_id ahci_pci_tbl[] = {  	{ PCI_VDEVICE(NVIDIA, 0x0abd), board_ahci },		/* MCP79 */  	{ PCI_VDEVICE(NVIDIA, 0x0abe), board_ahci },		/* MCP79 */  	{ PCI_VDEVICE(NVIDIA, 0x0abf), board_ahci },		/* MCP79 */ -	{ PCI_VDEVICE(NVIDIA, 0x0bc8), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bc9), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bca), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bcb), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bcc), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bcd), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bce), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bcf), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bc4), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bc5), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bc6), board_ahci },		/* MCP7B */ -	{ PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci },		/* MCP7B */ +	{ PCI_VDEVICE(NVIDIA, 0x0d84), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d85), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d86), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d87), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d88), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d89), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d8a), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d8b), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d8c), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d8d), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d8e), board_ahci },		/* MCP89 */ +	{ PCI_VDEVICE(NVIDIA, 0x0d8f), board_ahci },		/* MCP89 */  	/* SiS */  	{ PCI_VDEVICE(SI, 0x1184), board_ahci },		/* SiS 966 */ diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 54961c0b2c7..ef8b30d577b 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c @@ -1289,6 +1289,39 @@ static const int *__devinit piix_init_sata_map(struct pci_dev *pdev,  	return map;  } +static bool piix_no_sidpr(struct ata_host *host) +{ +	struct pci_dev *pdev = to_pci_dev(host->dev); + +	/* +	 * Samsung DB-P70 only has three ATA ports exposed and +	 * curiously the unconnected first port reports link online +	 * while not responding to SRST protocol causing excessive +	 * detection delay. +	 * +	 * Unfortunately, the system doesn't carry enough DMI +	 * information to identify the machine but does have subsystem +	 * vendor and device set.  As it's unclear whether the +	 * subsystem vendor/device is used only for this specific +	 * board, the port can't be disabled solely with the +	 * information; however, turning off SIDPR access works around +	 * the problem.  Turn it off. +	 * +	 * This problem is reported in bnc#441240. +	 * +	 * https://bugzilla.novell.com/show_bug.cgi?id=441420 +	 */ +	if (pdev->vendor == PCI_VENDOR_ID_INTEL && pdev->device == 0x2920 && +	    pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG && +	    pdev->subsystem_device == 0xb049) { +		dev_printk(KERN_WARNING, host->dev, +			   "Samsung DB-P70 detected, disabling SIDPR\n"); +		return true; +	} + +	return false; +} +  static int __devinit piix_init_sidpr(struct ata_host *host)  {  	struct pci_dev *pdev = to_pci_dev(host->dev); @@ -1302,6 +1335,10 @@ static int __devinit piix_init_sidpr(struct ata_host *host)  		if (hpriv->map[i] == IDE)  			return 0; +	/* is it blacklisted? */ +	if (piix_no_sidpr(host)) +		return 0; +  	if (!(host->ports[0]->flags & PIIX_FLAG_SIDPR))  		return 0; diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 9fbf0595f3d..060bcd601f5 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -1322,14 +1322,16 @@ static u64 ata_id_n_sectors(const u16 *id)  {  	if (ata_id_has_lba(id)) {  		if (ata_id_has_lba48(id)) -			return ata_id_u64(id, 100); +			return ata_id_u64(id, ATA_ID_LBA_CAPACITY_2);  		else -			return ata_id_u32(id, 60); +			return ata_id_u32(id, ATA_ID_LBA_CAPACITY);  	} else {  		if (ata_id_current_chs_valid(id)) -			return ata_id_u32(id, 57); +			return id[ATA_ID_CUR_CYLS] * id[ATA_ID_CUR_HEADS] * +			       id[ATA_ID_CUR_SECTORS];  		else -			return id[1] * id[3] * id[6]; +			return id[ATA_ID_CYLS] * id[ATA_ID_HEADS] * +			       id[ATA_ID_SECTORS];  	}  } @@ -4612,7 +4614,7 @@ void ata_sg_clean(struct ata_queued_cmd *qc)  	VPRINTK("unmapping %u sg elements\n", qc->n_elem);  	if (qc->n_elem) -		dma_unmap_sg(ap->dev, sg, qc->n_elem, dir); +		dma_unmap_sg(ap->dev, sg, qc->orig_n_elem, dir);  	qc->flags &= ~ATA_QCFLAG_DMAMAP;  	qc->sg = NULL; @@ -4727,7 +4729,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)  		return -1;  	DPRINTK("%d sg elements mapped\n", n_elem); - +	qc->orig_n_elem = qc->n_elem;  	qc->n_elem = n_elem;  	qc->flags |= ATA_QCFLAG_DMAMAP; diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index ce2ef047533..ea890911d4f 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -2423,11 +2423,14 @@ int ata_eh_reset(struct ata_link *link, int classify,  		}  		/* prereset() might have cleared ATA_EH_RESET.  If so, -		 * bang classes and return. +		 * bang classes, thaw and return.  		 */  		if (reset && !(ehc->i.action & ATA_EH_RESET)) {  			ata_for_each_dev(dev, link, ALL)  				classes[dev->devno] = ATA_DEV_NONE; +			if ((ap->pflags & ATA_PFLAG_FROZEN) && +			    ata_is_host_link(link)) +				ata_eh_thaw_port(ap);  			rc = 0;  			goto out;  		} @@ -2901,7 +2904,7 @@ static int atapi_eh_clear_ua(struct ata_device *dev)  	int i;  	for (i = 0; i < ATA_EH_UA_TRIES; i++) { -		u8 sense_buffer[SCSI_SENSE_BUFFERSIZE]; +		u8 *sense_buffer = dev->link->ap->sector_buf;  		u8 sense_key = 0;  		unsigned int err_mask; diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 714cb046b59..f93dc029dfd 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c @@ -2066,6 +2066,7 @@ static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,  	iowrite8(ap->ctl | ATA_SRST, ioaddr->ctl_addr);  	udelay(20);	/* FIXME: flush */  	iowrite8(ap->ctl, ioaddr->ctl_addr); +	ap->last_ctl = ap->ctl;  	/* wait the port to become ready */  	return ata_sff_wait_after_reset(&ap->link, devmask, deadline); @@ -2190,8 +2191,10 @@ void ata_sff_postreset(struct ata_link *link, unsigned int *classes)  	}  	/* set up device control */ -	if (ap->ioaddr.ctl_addr) +	if (ap->ioaddr.ctl_addr) {  		iowrite8(ap->ctl, ap->ioaddr.ctl_addr); +		ap->last_ctl = ap->ctl; +	}  }  EXPORT_SYMBOL_GPL(ata_sff_postreset); @@ -2534,6 +2537,7 @@ void ata_bus_reset(struct ata_port *ap)  	if (ap->flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST)) {  		/* set up device control for ATA_FLAG_SATA_RESET */  		iowrite8(ap->ctl, ioaddr->ctl_addr); +		ap->last_ctl = ap->ctl;  	}  	DPRINTK("EXIT\n"); diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 7007edd2d45..74b1080d116 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c @@ -2218,12 +2218,13 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance)  		else  			handled = mv_host_intr(host, pending_irqs);  	} -	spin_unlock(&host->lock);  	/* for MSI: unmask; interrupt cause bits will retrigger now */  	if (using_msi)  		writel(hpriv->main_irq_mask, hpriv->main_irq_mask_addr); +	spin_unlock(&host->lock); +  	return IRQ_RETVAL(handled);  } diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 55a8eed3f3a..f65b53785a8 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c @@ -2523,7 +2523,7 @@ static void __exit nv_exit(void)  module_init(nv_init);  module_exit(nv_exit);  module_param_named(adma, adma_enabled, bool, 0444); -MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: true)"); +MODULE_PARM_DESC(adma, "Enable use of ADMA (Default: false)");  module_param_named(swncq, swncq_enabled, bool, 0444);  MODULE_PARM_DESC(swncq, "Enable use of SWNCQ (Default: true)"); diff --git a/drivers/base/node.c b/drivers/base/node.c index 43fa90b837e..f8f578a71b2 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -303,7 +303,7 @@ int unregister_mem_sect_under_nodes(struct memory_block *mem_blk)  	sect_start_pfn = section_nr_to_pfn(mem_blk->phys_index);  	sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1;  	for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { -		unsigned int nid; +		int nid;  		nid = get_nid_for_pfn(pfn);  		if (nid < 0) diff --git a/drivers/block/Makefile b/drivers/block/Makefile index 204332b2957..87e120e0a79 100644 --- a/drivers/block/Makefile +++ b/drivers/block/Makefile @@ -9,6 +9,7 @@ obj-$(CONFIG_MAC_FLOPPY)	+= swim3.o  obj-$(CONFIG_BLK_DEV_FD)	+= floppy.o  obj-$(CONFIG_AMIGA_FLOPPY)	+= amiflop.o  obj-$(CONFIG_PS3_DISK)		+= ps3disk.o +obj-$(CONFIG_PS3_VRAM)		+= ps3vram.o  obj-$(CONFIG_ATARI_FLOPPY)	+= ataflop.o  obj-$(CONFIG_AMIGA_Z2RAM)	+= z2ram.o  obj-$(CONFIG_BLK_DEV_RAM)	+= brd.o diff --git a/drivers/block/aoe/aoedev.c b/drivers/block/aoe/aoedev.c index cc250577d40..eeea477d960 100644 --- a/drivers/block/aoe/aoedev.c +++ b/drivers/block/aoe/aoedev.c @@ -173,7 +173,7 @@ skbfree(struct sk_buff *skb)  		return;  	while (atomic_read(&skb_shinfo(skb)->dataref) != 1 && i-- > 0)  		msleep(Sms); -	if (i <= 0) { +	if (i < 0) {  		printk(KERN_ERR  			"aoe: %s holds ref: %s\n",  			skb->dev ? skb->dev->name : "netif", diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index b5a06111463..4f9b6d79201 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -3606,11 +3606,9 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,  		if (cciss_hard_reset_controller(pdev) || cciss_reset_msi(pdev))  			return -ENODEV; -		/* Some devices (notably the HP Smart Array 5i Controller) -		   need a little pause here */ -		schedule_timeout_uninterruptible(30*HZ); - -		/* Now try to get the controller to respond to a no-op */ +		/* Now try to get the controller to respond to a no-op. Some +		   devices (notably the HP Smart Array 5i Controller) need +		   up to 30 seconds to respond. */  		for (i=0; i<30; i++) {  			if (cciss_noop(pdev) == 0)  				break; diff --git a/drivers/block/loop.c b/drivers/block/loop.c index edbaac6c057..bf034557767 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -392,8 +392,7 @@ lo_splice_actor(struct pipe_inode_info *pipe, struct pipe_buffer *buf,  	struct loop_device *lo = p->lo;  	struct page *page = buf->page;  	sector_t IV; -	size_t size; -	int ret; +	int size, ret;  	ret = buf->ops->confirm(pipe, buf);  	if (unlikely(ret)) diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c new file mode 100644 index 00000000000..393ed6760d7 --- /dev/null +++ b/drivers/block/ps3vram.c @@ -0,0 +1,865 @@ +/* + * ps3vram - Use extra PS3 video ram as MTD block device. + * + * Copyright 2009 Sony Corporation + * + * Based on the MTD ps3vram driver, which is + * Copyright (c) 2007-2008 Jim Paris <jim@jtan.com> + * Added support RSX DMA Vivien Chappelier <vivien.chappelier@free.fr> + */ + +#include <linux/blkdev.h> +#include <linux/delay.h> +#include <linux/proc_fs.h> +#include <linux/seq_file.h> + +#include <asm/firmware.h> +#include <asm/lv1call.h> +#include <asm/ps3.h> + + +#define DEVICE_NAME		"ps3vram" + + +#define XDR_BUF_SIZE (2 * 1024 * 1024) /* XDR buffer (must be 1MiB aligned) */ +#define XDR_IOIF 0x0c000000 + +#define FIFO_BASE XDR_IOIF +#define FIFO_SIZE (64 * 1024) + +#define DMA_PAGE_SIZE (4 * 1024) + +#define CACHE_PAGE_SIZE (256 * 1024) +#define CACHE_PAGE_COUNT ((XDR_BUF_SIZE - FIFO_SIZE) / CACHE_PAGE_SIZE) + +#define CACHE_OFFSET CACHE_PAGE_SIZE +#define FIFO_OFFSET 0 + +#define CTRL_PUT 0x10 +#define CTRL_GET 0x11 +#define CTRL_TOP 0x15 + +#define UPLOAD_SUBCH	1 +#define DOWNLOAD_SUBCH	2 + +#define NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN	0x0000030c +#define NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY	0x00000104 + +#define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT 0x601 + +#define CACHE_PAGE_PRESENT 1 +#define CACHE_PAGE_DIRTY   2 + +struct ps3vram_tag { +	unsigned int address; +	unsigned int flags; +}; + +struct ps3vram_cache { +	unsigned int page_count; +	unsigned int page_size; +	struct ps3vram_tag *tags; +	unsigned int hit; +	unsigned int miss; +}; + +struct ps3vram_priv { +	struct request_queue *queue; +	struct gendisk *gendisk; + +	u64 size; + +	u64 memory_handle; +	u64 context_handle; +	u32 *ctrl; +	u32 *reports; +	u8 __iomem *ddr_base; +	u8 *xdr_buf; + +	u32 *fifo_base; +	u32 *fifo_ptr; + +	struct ps3vram_cache cache; + +	/* Used to serialize cache/DMA operations */ +	struct mutex lock; +}; + + +static int ps3vram_major; + + +static struct block_device_operations ps3vram_fops = { +	.owner		= THIS_MODULE, +}; + + +#define DMA_NOTIFIER_HANDLE_BASE 0x66604200 /* first DMA notifier handle */ +#define DMA_NOTIFIER_OFFSET_BASE 0x1000     /* first DMA notifier offset */ +#define DMA_NOTIFIER_SIZE        0x40 +#define NOTIFIER 7	/* notifier used for completion report */ + +static char *size = "256M"; +module_param(size, charp, 0); +MODULE_PARM_DESC(size, "memory size"); + +static u32 *ps3vram_get_notifier(u32 *reports, int notifier) +{ +	return (void *)reports + DMA_NOTIFIER_OFFSET_BASE + +	       DMA_NOTIFIER_SIZE * notifier; +} + +static void ps3vram_notifier_reset(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER); +	int i; + +	for (i = 0; i < 4; i++) +		notify[i] = 0xffffffff; +} + +static int ps3vram_notifier_wait(struct ps3_system_bus_device *dev, +				 unsigned int timeout_ms) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER); +	unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms); + +	do { +		if (!notify[3]) +			return 0; +		msleep(1); +	} while (time_before(jiffies, timeout)); + +	return -ETIMEDOUT; +} + +static void ps3vram_init_ring(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; + +	priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET; +	priv->ctrl[CTRL_GET] = FIFO_BASE + FIFO_OFFSET; +} + +static int ps3vram_wait_ring(struct ps3_system_bus_device *dev, +			     unsigned int timeout_ms) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms); + +	do { +		if (priv->ctrl[CTRL_PUT] == priv->ctrl[CTRL_GET]) +			return 0; +		msleep(1); +	} while (time_before(jiffies, timeout)); + +	dev_warn(&dev->core, "FIFO timeout (%08x/%08x/%08x)\n", +		 priv->ctrl[CTRL_PUT], priv->ctrl[CTRL_GET], +		 priv->ctrl[CTRL_TOP]); + +	return -ETIMEDOUT; +} + +static void ps3vram_out_ring(struct ps3vram_priv *priv, u32 data) +{ +	*(priv->fifo_ptr)++ = data; +} + +static void ps3vram_begin_ring(struct ps3vram_priv *priv, u32 chan, u32 tag, +			       u32 size) +{ +	ps3vram_out_ring(priv, (size << 18) | (chan << 13) | tag); +} + +static void ps3vram_rewind_ring(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	int status; + +	ps3vram_out_ring(priv, 0x20000000 | (FIFO_BASE + FIFO_OFFSET)); + +	priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET; + +	/* asking the HV for a blit will kick the FIFO */ +	status = lv1_gpu_context_attribute(priv->context_handle, +					   L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT, 0, +					   0, 0, 0); +	if (status) +		dev_err(&dev->core, +			"%s: lv1_gpu_context_attribute failed %d\n", __func__, +			status); + +	priv->fifo_ptr = priv->fifo_base; +} + +static void ps3vram_fire_ring(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	int status; + +	mutex_lock(&ps3_gpu_mutex); + +	priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET + +			       (priv->fifo_ptr - priv->fifo_base) * sizeof(u32); + +	/* asking the HV for a blit will kick the FIFO */ +	status = lv1_gpu_context_attribute(priv->context_handle, +					   L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT, 0, +					   0, 0, 0); +	if (status) +		dev_err(&dev->core, +			"%s: lv1_gpu_context_attribute failed %d\n", __func__, +			status); + +	if ((priv->fifo_ptr - priv->fifo_base) * sizeof(u32) > +	    FIFO_SIZE - 1024) { +		dev_dbg(&dev->core, "FIFO full, rewinding\n"); +		ps3vram_wait_ring(dev, 200); +		ps3vram_rewind_ring(dev); +	} + +	mutex_unlock(&ps3_gpu_mutex); +} + +static void ps3vram_bind(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; + +	ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0, 1); +	ps3vram_out_ring(priv, 0x31337303); +	ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x180, 3); +	ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER); +	ps3vram_out_ring(priv, 0xfeed0001);	/* DMA system RAM instance */ +	ps3vram_out_ring(priv, 0xfeed0000);     /* DMA video RAM instance */ + +	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0, 1); +	ps3vram_out_ring(priv, 0x3137c0de); +	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x180, 3); +	ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER); +	ps3vram_out_ring(priv, 0xfeed0000);	/* DMA video RAM instance */ +	ps3vram_out_ring(priv, 0xfeed0001);	/* DMA system RAM instance */ + +	ps3vram_fire_ring(dev); +} + +static int ps3vram_upload(struct ps3_system_bus_device *dev, +			  unsigned int src_offset, unsigned int dst_offset, +			  int len, int count) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; + +	ps3vram_begin_ring(priv, UPLOAD_SUBCH, +			   NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8); +	ps3vram_out_ring(priv, XDR_IOIF + src_offset); +	ps3vram_out_ring(priv, dst_offset); +	ps3vram_out_ring(priv, len); +	ps3vram_out_ring(priv, len); +	ps3vram_out_ring(priv, len); +	ps3vram_out_ring(priv, count); +	ps3vram_out_ring(priv, (1 << 8) | 1); +	ps3vram_out_ring(priv, 0); + +	ps3vram_notifier_reset(dev); +	ps3vram_begin_ring(priv, UPLOAD_SUBCH, +			   NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1); +	ps3vram_out_ring(priv, 0); +	ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x100, 1); +	ps3vram_out_ring(priv, 0); +	ps3vram_fire_ring(dev); +	if (ps3vram_notifier_wait(dev, 200) < 0) { +		dev_warn(&dev->core, "%s: Notifier timeout\n", __func__); +		return -1; +	} + +	return 0; +} + +static int ps3vram_download(struct ps3_system_bus_device *dev, +			    unsigned int src_offset, unsigned int dst_offset, +			    int len, int count) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; + +	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, +			   NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8); +	ps3vram_out_ring(priv, src_offset); +	ps3vram_out_ring(priv, XDR_IOIF + dst_offset); +	ps3vram_out_ring(priv, len); +	ps3vram_out_ring(priv, len); +	ps3vram_out_ring(priv, len); +	ps3vram_out_ring(priv, count); +	ps3vram_out_ring(priv, (1 << 8) | 1); +	ps3vram_out_ring(priv, 0); + +	ps3vram_notifier_reset(dev); +	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, +			   NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1); +	ps3vram_out_ring(priv, 0); +	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x100, 1); +	ps3vram_out_ring(priv, 0); +	ps3vram_fire_ring(dev); +	if (ps3vram_notifier_wait(dev, 200) < 0) { +		dev_warn(&dev->core, "%s: Notifier timeout\n", __func__); +		return -1; +	} + +	return 0; +} + +static void ps3vram_cache_evict(struct ps3_system_bus_device *dev, int entry) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	struct ps3vram_cache *cache = &priv->cache; + +	if (!(cache->tags[entry].flags & CACHE_PAGE_DIRTY)) +		return; + +	dev_dbg(&dev->core, "Flushing %d: 0x%08x\n", entry, +		cache->tags[entry].address); +	if (ps3vram_upload(dev, CACHE_OFFSET + entry * cache->page_size, +			   cache->tags[entry].address, DMA_PAGE_SIZE, +			   cache->page_size / DMA_PAGE_SIZE) < 0) { +		dev_err(&dev->core, +			"Failed to upload from 0x%x to " "0x%x size 0x%x\n", +			entry * cache->page_size, cache->tags[entry].address, +			cache->page_size); +	} +	cache->tags[entry].flags &= ~CACHE_PAGE_DIRTY; +} + +static void ps3vram_cache_load(struct ps3_system_bus_device *dev, int entry, +			       unsigned int address) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	struct ps3vram_cache *cache = &priv->cache; + +	dev_dbg(&dev->core, "Fetching %d: 0x%08x\n", entry, address); +	if (ps3vram_download(dev, address, +			     CACHE_OFFSET + entry * cache->page_size, +			     DMA_PAGE_SIZE, +			     cache->page_size / DMA_PAGE_SIZE) < 0) { +		dev_err(&dev->core, +			"Failed to download from 0x%x to 0x%x size 0x%x\n", +			address, entry * cache->page_size, cache->page_size); +	} + +	cache->tags[entry].address = address; +	cache->tags[entry].flags |= CACHE_PAGE_PRESENT; +} + + +static void ps3vram_cache_flush(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	struct ps3vram_cache *cache = &priv->cache; +	int i; + +	dev_dbg(&dev->core, "FLUSH\n"); +	for (i = 0; i < cache->page_count; i++) { +		ps3vram_cache_evict(dev, i); +		cache->tags[i].flags = 0; +	} +} + +static unsigned int ps3vram_cache_match(struct ps3_system_bus_device *dev, +					loff_t address) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	struct ps3vram_cache *cache = &priv->cache; +	unsigned int base; +	unsigned int offset; +	int i; +	static int counter; + +	offset = (unsigned int) (address & (cache->page_size - 1)); +	base = (unsigned int) (address - offset); + +	/* fully associative check */ +	for (i = 0; i < cache->page_count; i++) { +		if ((cache->tags[i].flags & CACHE_PAGE_PRESENT) && +		    cache->tags[i].address == base) { +			cache->hit++; +			dev_dbg(&dev->core, "Found entry %d: 0x%08x\n", i, +				cache->tags[i].address); +			return i; +		} +	} + +	/* choose a random entry */ +	i = (jiffies + (counter++)) % cache->page_count; +	dev_dbg(&dev->core, "Using entry %d\n", i); + +	ps3vram_cache_evict(dev, i); +	ps3vram_cache_load(dev, i, base); + +	cache->miss++; +	return i; +} + +static int ps3vram_cache_init(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; + +	priv->cache.page_count = CACHE_PAGE_COUNT; +	priv->cache.page_size = CACHE_PAGE_SIZE; +	priv->cache.tags = kzalloc(sizeof(struct ps3vram_tag) * +				   CACHE_PAGE_COUNT, GFP_KERNEL); +	if (priv->cache.tags == NULL) { +		dev_err(&dev->core, "Could not allocate cache tags\n"); +		return -ENOMEM; +	} + +	dev_info(&dev->core, "Created ram cache: %d entries, %d KiB each\n", +		CACHE_PAGE_COUNT, CACHE_PAGE_SIZE / 1024); + +	return 0; +} + +static void ps3vram_cache_cleanup(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; + +	ps3vram_cache_flush(dev); +	kfree(priv->cache.tags); +} + +static int ps3vram_read(struct ps3_system_bus_device *dev, loff_t from, +			size_t len, size_t *retlen, u_char *buf) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	unsigned int cached, count; + +	dev_dbg(&dev->core, "%s: from=0x%08x len=0x%zx\n", __func__, +		(unsigned int)from, len); + +	if (from >= priv->size) +		return -EIO; + +	if (len > priv->size - from) +		len = priv->size - from; + +	/* Copy from vram to buf */ +	count = len; +	while (count) { +		unsigned int offset, avail; +		unsigned int entry; + +		offset = (unsigned int) (from & (priv->cache.page_size - 1)); +		avail  = priv->cache.page_size - offset; + +		mutex_lock(&priv->lock); + +		entry = ps3vram_cache_match(dev, from); +		cached = CACHE_OFFSET + entry * priv->cache.page_size + offset; + +		dev_dbg(&dev->core, "%s: from=%08x cached=%08x offset=%08x " +			"avail=%08x count=%08x\n", __func__, +			(unsigned int)from, cached, offset, avail, count); + +		if (avail > count) +			avail = count; +		memcpy(buf, priv->xdr_buf + cached, avail); + +		mutex_unlock(&priv->lock); + +		buf += avail; +		count -= avail; +		from += avail; +	} + +	*retlen = len; +	return 0; +} + +static int ps3vram_write(struct ps3_system_bus_device *dev, loff_t to, +			 size_t len, size_t *retlen, const u_char *buf) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	unsigned int cached, count; + +	if (to >= priv->size) +		return -EIO; + +	if (len > priv->size - to) +		len = priv->size - to; + +	/* Copy from buf to vram */ +	count = len; +	while (count) { +		unsigned int offset, avail; +		unsigned int entry; + +		offset = (unsigned int) (to & (priv->cache.page_size - 1)); +		avail  = priv->cache.page_size - offset; + +		mutex_lock(&priv->lock); + +		entry = ps3vram_cache_match(dev, to); +		cached = CACHE_OFFSET + entry * priv->cache.page_size + offset; + +		dev_dbg(&dev->core, "%s: to=%08x cached=%08x offset=%08x " +			"avail=%08x count=%08x\n", __func__, (unsigned int)to, +			cached, offset, avail, count); + +		if (avail > count) +			avail = count; +		memcpy(priv->xdr_buf + cached, buf, avail); + +		priv->cache.tags[entry].flags |= CACHE_PAGE_DIRTY; + +		mutex_unlock(&priv->lock); + +		buf += avail; +		count -= avail; +		to += avail; +	} + +	*retlen = len; +	return 0; +} + +static int ps3vram_proc_show(struct seq_file *m, void *v) +{ +	struct ps3vram_priv *priv = m->private; + +	seq_printf(m, "hit:%u\nmiss:%u\n", priv->cache.hit, priv->cache.miss); +	return 0; +} + +static int ps3vram_proc_open(struct inode *inode, struct file *file) +{ +	return single_open(file, ps3vram_proc_show, PDE(inode)->data); +} + +static const struct file_operations ps3vram_proc_fops = { +	.owner		= THIS_MODULE, +	.open		= ps3vram_proc_open, +	.read		= seq_read, +	.llseek		= seq_lseek, +	.release	= single_release, +}; + +static void __devinit ps3vram_proc_init(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; +	struct proc_dir_entry *pde; + +	pde = proc_create(DEVICE_NAME, 0444, NULL, &ps3vram_proc_fops); +	if (!pde) { +		dev_warn(&dev->core, "failed to create /proc entry\n"); +		return; +	} + +	pde->owner = THIS_MODULE; +	pde->data = priv; +} + +static int ps3vram_make_request(struct request_queue *q, struct bio *bio) +{ +	struct ps3_system_bus_device *dev = q->queuedata; +	int write = bio_data_dir(bio) == WRITE; +	const char *op = write ? "write" : "read"; +	loff_t offset = bio->bi_sector << 9; +	int error = 0; +	struct bio_vec *bvec; +	unsigned int i; + +	dev_dbg(&dev->core, "%s\n", __func__); + +	bio_for_each_segment(bvec, bio, i) { +		/* PS3 is ppc64, so we don't handle highmem */ +		char *ptr = page_address(bvec->bv_page) + bvec->bv_offset; +		size_t len = bvec->bv_len, retlen; + +		dev_dbg(&dev->core, "    %s %zu bytes at offset %llu\n", op, +			len, offset); +		if (write) +			error = ps3vram_write(dev, offset, len, &retlen, ptr); +		else +			error = ps3vram_read(dev, offset, len, &retlen, ptr); + +		if (error) { +			dev_err(&dev->core, "%s failed\n", op); +			goto out; +		} + +		if (retlen != len) { +			dev_err(&dev->core, "Short %s\n", op); +			goto out; +		} + +		offset += len; +	} + +	dev_dbg(&dev->core, "%s completed\n", op); + +out: +	bio_endio(bio, error); +	return 0; +} + +static int __devinit ps3vram_probe(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv; +	int error, status; +	struct request_queue *queue; +	struct gendisk *gendisk; +	u64 ddr_lpar, ctrl_lpar, info_lpar, reports_lpar, ddr_size, +	    reports_size; +	char *rest; + +	priv = kzalloc(sizeof(*priv), GFP_KERNEL); +	if (!priv) { +		error = -ENOMEM; +		goto fail; +	} + +	mutex_init(&priv->lock); +	dev->core.driver_data = priv; + +	priv = dev->core.driver_data; + +	/* Allocate XDR buffer (1MiB aligned) */ +	priv->xdr_buf = (void *)__get_free_pages(GFP_KERNEL, +		get_order(XDR_BUF_SIZE)); +	if (priv->xdr_buf == NULL) { +		dev_err(&dev->core, "Could not allocate XDR buffer\n"); +		error = -ENOMEM; +		goto fail_free_priv; +	} + +	/* Put FIFO at begginning of XDR buffer */ +	priv->fifo_base = (u32 *) (priv->xdr_buf + FIFO_OFFSET); +	priv->fifo_ptr = priv->fifo_base; + +	/* XXX: Need to open GPU, in case ps3fb or snd_ps3 aren't loaded */ +	if (ps3_open_hv_device(dev)) { +		dev_err(&dev->core, "ps3_open_hv_device failed\n"); +		error = -EAGAIN; +		goto out_close_gpu; +	} + +	/* Request memory */ +	status = -1; +	ddr_size = ALIGN(memparse(size, &rest), 1024*1024); +	if (!ddr_size) { +		dev_err(&dev->core, "Specified size is too small\n"); +		error = -EINVAL; +		goto out_close_gpu; +	} + +	while (ddr_size > 0) { +		status = lv1_gpu_memory_allocate(ddr_size, 0, 0, 0, 0, +						 &priv->memory_handle, +						 &ddr_lpar); +		if (!status) +			break; +		ddr_size -= 1024*1024; +	} +	if (status) { +		dev_err(&dev->core, "lv1_gpu_memory_allocate failed %d\n", +			status); +		error = -ENOMEM; +		goto out_free_xdr_buf; +	} + +	/* Request context */ +	status = lv1_gpu_context_allocate(priv->memory_handle, 0, +					  &priv->context_handle, &ctrl_lpar, +					  &info_lpar, &reports_lpar, +					  &reports_size); +	if (status) { +		dev_err(&dev->core, "lv1_gpu_context_allocate failed %d\n", +			status); +		error = -ENOMEM; +		goto out_free_memory; +	} + +	/* Map XDR buffer to RSX */ +	status = lv1_gpu_context_iomap(priv->context_handle, XDR_IOIF, +				       ps3_mm_phys_to_lpar(__pa(priv->xdr_buf)), +				       XDR_BUF_SIZE, 0); +	if (status) { +		dev_err(&dev->core, "lv1_gpu_context_iomap failed %d\n", +			status); +		error = -ENOMEM; +		goto out_free_context; +	} + +	priv->ddr_base = ioremap_flags(ddr_lpar, ddr_size, _PAGE_NO_CACHE); + +	if (!priv->ddr_base) { +		dev_err(&dev->core, "ioremap DDR failed\n"); +		error = -ENOMEM; +		goto out_free_context; +	} + +	priv->ctrl = ioremap(ctrl_lpar, 64 * 1024); +	if (!priv->ctrl) { +		dev_err(&dev->core, "ioremap CTRL failed\n"); +		error = -ENOMEM; +		goto out_unmap_vram; +	} + +	priv->reports = ioremap(reports_lpar, reports_size); +	if (!priv->reports) { +		dev_err(&dev->core, "ioremap REPORTS failed\n"); +		error = -ENOMEM; +		goto out_unmap_ctrl; +	} + +	mutex_lock(&ps3_gpu_mutex); +	ps3vram_init_ring(dev); +	mutex_unlock(&ps3_gpu_mutex); + +	priv->size = ddr_size; + +	ps3vram_bind(dev); + +	mutex_lock(&ps3_gpu_mutex); +	error = ps3vram_wait_ring(dev, 100); +	mutex_unlock(&ps3_gpu_mutex); +	if (error < 0) { +		dev_err(&dev->core, "Failed to initialize channels\n"); +		error = -ETIMEDOUT; +		goto out_unmap_reports; +	} + +	ps3vram_cache_init(dev); +	ps3vram_proc_init(dev); + +	queue = blk_alloc_queue(GFP_KERNEL); +	if (!queue) { +		dev_err(&dev->core, "blk_alloc_queue failed\n"); +		error = -ENOMEM; +		goto out_cache_cleanup; +	} + +	priv->queue = queue; +	queue->queuedata = dev; +	blk_queue_make_request(queue, ps3vram_make_request); +	blk_queue_max_phys_segments(queue, MAX_PHYS_SEGMENTS); +	blk_queue_max_hw_segments(queue, MAX_HW_SEGMENTS); +	blk_queue_max_segment_size(queue, MAX_SEGMENT_SIZE); +	blk_queue_max_sectors(queue, SAFE_MAX_SECTORS); + +	gendisk = alloc_disk(1); +	if (!gendisk) { +		dev_err(&dev->core, "alloc_disk failed\n"); +		error = -ENOMEM; +		goto fail_cleanup_queue; +	} + +	priv->gendisk = gendisk; +	gendisk->major = ps3vram_major; +	gendisk->first_minor = 0; +	gendisk->fops = &ps3vram_fops; +	gendisk->queue = queue; +	gendisk->private_data = dev; +	gendisk->driverfs_dev = &dev->core; +	strlcpy(gendisk->disk_name, DEVICE_NAME, sizeof(gendisk->disk_name)); +	set_capacity(gendisk, priv->size >> 9); + +	dev_info(&dev->core, "%s: Using %lu MiB of GPU memory\n", +		 gendisk->disk_name, get_capacity(gendisk) >> 11); + +	add_disk(gendisk); +	return 0; + +fail_cleanup_queue: +	blk_cleanup_queue(queue); +out_cache_cleanup: +	remove_proc_entry(DEVICE_NAME, NULL); +	ps3vram_cache_cleanup(dev); +out_unmap_reports: +	iounmap(priv->reports); +out_unmap_ctrl: +	iounmap(priv->ctrl); +out_unmap_vram: +	iounmap(priv->ddr_base); +out_free_context: +	lv1_gpu_context_free(priv->context_handle); +out_free_memory: +	lv1_gpu_memory_free(priv->memory_handle); +out_close_gpu: +	ps3_close_hv_device(dev); +out_free_xdr_buf: +	free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE)); +fail_free_priv: +	kfree(priv); +	dev->core.driver_data = NULL; +fail: +	return error; +} + +static int ps3vram_remove(struct ps3_system_bus_device *dev) +{ +	struct ps3vram_priv *priv = dev->core.driver_data; + +	del_gendisk(priv->gendisk); +	put_disk(priv->gendisk); +	blk_cleanup_queue(priv->queue); +	remove_proc_entry(DEVICE_NAME, NULL); +	ps3vram_cache_cleanup(dev); +	iounmap(priv->reports); +	iounmap(priv->ctrl); +	iounmap(priv->ddr_base); +	lv1_gpu_context_free(priv->context_handle); +	lv1_gpu_memory_free(priv->memory_handle); +	ps3_close_hv_device(dev); +	free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE)); +	kfree(priv); +	dev->core.driver_data = NULL; +	return 0; +} + +static struct ps3_system_bus_driver ps3vram = { +	.match_id	= PS3_MATCH_ID_GPU, +	.match_sub_id	= PS3_MATCH_SUB_ID_GPU_RAMDISK, +	.core.name	= DEVICE_NAME, +	.core.owner	= THIS_MODULE, +	.probe		= ps3vram_probe, +	.remove		= ps3vram_remove, +	.shutdown	= ps3vram_remove, +}; + + +static int __init ps3vram_init(void) +{ +	int error; + +	if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) +		return -ENODEV; + +	error = register_blkdev(0, DEVICE_NAME); +	if (error <= 0) { +		pr_err("%s: register_blkdev failed %d\n", DEVICE_NAME, error); +		return error; +	} +	ps3vram_major = error; + +	pr_info("%s: registered block device major %d\n", DEVICE_NAME, +		ps3vram_major); + +	error = ps3_system_bus_driver_register(&ps3vram); +	if (error) +		unregister_blkdev(ps3vram_major, DEVICE_NAME); + +	return error; +} + +static void __exit ps3vram_exit(void) +{ +	ps3_system_bus_driver_unregister(&ps3vram); +	unregister_blkdev(ps3vram_major, DEVICE_NAME); +} + +module_init(ps3vram_init); +module_exit(ps3vram_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("PS3 Video RAM Storage Driver"); +MODULE_AUTHOR("Sony Corporation"); +MODULE_ALIAS(PS3_MODULE_ALIAS_GPU_RAMDISK); diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index b6c8ce25435..8f905089b72 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -977,6 +977,8 @@ static void backend_changed(struct xenbus_device *dev,  		break;  	case XenbusStateClosing: +		if (info->gd == NULL) +			xenbus_dev_fatal(dev, -ENODEV, "gd is NULL");  		bd = bdget_disk(info->gd, 0);  		if (bd == NULL)  			xenbus_dev_fatal(dev, -ENODEV, "bdget failed"); diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c index 381d686fc1a..119be3442f2 100644 --- a/drivers/block/xsysace.c +++ b/drivers/block/xsysace.c @@ -489,6 +489,28 @@ static void ace_fsm_dostate(struct ace_device *ace)  		ace->fsm_state, ace->id_req_count);  #endif +	/* Verify that there is actually a CF in the slot. If not, then +	 * bail out back to the idle state and wake up all the waiters */ +	status = ace_in32(ace, ACE_STATUS); +	if ((status & ACE_STATUS_CFDETECT) == 0) { +		ace->fsm_state = ACE_FSM_STATE_IDLE; +		ace->media_change = 1; +		set_capacity(ace->gd, 0); +		dev_info(ace->dev, "No CF in slot\n"); + +		/* Drop all pending requests */ +		while ((req = elv_next_request(ace->queue)) != NULL) +			end_request(req, 0); + +		/* Drop back to IDLE state and notify waiters */ +		ace->fsm_state = ACE_FSM_STATE_IDLE; +		ace->id_result = -EIO; +		while (ace->id_req_count) { +			complete(&ace->id_completion); +			ace->id_req_count--; +		} +	} +  	switch (ace->fsm_state) {  	case ACE_FSM_STATE_IDLE:  		/* See if there is anything to do */ diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index 52f4361eb6e..d765afda9c2 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c @@ -271,15 +271,15 @@ static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,  	nb_order = (nb_order >> 1) & 7;  	pci_read_config_dword(nb, AMD64_GARTAPERTUREBASE, &nb_base);  	nb_aper = nb_base << 25; -	if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order)) { -		return 0; -	}  	/* Northbridge seems to contain crap. Try the AGP bridge. */  	pci_read_config_word(agp, cap+0x14, &apsize); -	if (apsize == 0xffff) +	if (apsize == 0xffff) { +		if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order)) +			return 0;  		return -1; +	}  	apsize &= 0xfff;  	/* Some BIOS use weird encodings not in the AGPv3 table. */ @@ -301,6 +301,11 @@ static __devinit int fix_northbridge(struct pci_dev *nb, struct pci_dev *agp,  		order = nb_order;  	} +	if (nb_order >= order) { +		if (agp_aperture_valid(nb_aper, (32*1024*1024)<<nb_order)) +			return 0; +	} +  	dev_info(&agp->dev, "aperture from AGP @ %Lx size %u MB\n",  		 aper, 32 << order);  	if (order < 0 || !agp_aperture_valid(aper, (32*1024*1024)<<order)) diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index c7714185f83..4373adb2119 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c @@ -633,13 +633,15 @@ static void intel_i830_init_gtt_entries(void)  			break;  		}  	} -	if (gtt_entries > 0) +	if (gtt_entries > 0) {  		dev_info(&agp_bridge->dev->dev, "detected %dK %s memory\n",  		       gtt_entries / KB(1), local ? "local" : "stolen"); -	else +		gtt_entries /= KB(4); +	} else {  		dev_info(&agp_bridge->dev->dev,  		       "no pre-allocated video memory detected\n"); -	gtt_entries /= KB(4); +		gtt_entries = 0; +	}  	intel_private.gtt_entries = gtt_entries;  } diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c index db60539bf67..699e3422ad9 100644 --- a/drivers/char/agp/parisc-agp.c +++ b/drivers/char/agp/parisc-agp.c @@ -359,9 +359,16 @@ fail:  	return error;  } -static struct device *next_device(struct klist_iter *i) { -	struct klist_node * n = klist_next(i); -	return n ? container_of(n, struct device, knode_parent) : NULL; +static int +find_quicksilver(struct device *dev, void *data) +{ +	struct parisc_device **lba = data; +	struct parisc_device *padev = to_parisc_device(dev); + +	if (IS_QUICKSILVER(padev)) +		*lba = padev; + +	return 0;  }  static int @@ -372,8 +379,6 @@ parisc_agp_init(void)  	int err = -1;  	struct parisc_device *sba = NULL, *lba = NULL;  	struct lba_device *lbadev = NULL; -	struct device *dev = NULL; -	struct klist_iter i;  	if (!sba_list)  		goto out; @@ -386,13 +391,7 @@ parisc_agp_init(void)  	}  	/* Now search our Pluto for our precious AGP device... */ -	klist_iter_init(&sba->dev.klist_children, &i); -	while ((dev = next_device(&i))) { -		struct parisc_device *padev = to_parisc_device(dev); -		if (IS_QUICKSILVER(padev)) -			lba = padev; -	} -	klist_iter_exit(&i); +	device_for_each_child(&sba->dev, &lba, find_quicksilver);  	if (!lba) {  		printk(KERN_INFO DRVPFX "No AGP devices found.\n"); diff --git a/drivers/char/hvcs.c b/drivers/char/hvcs.c index 6e6eb445d37..c76bccf5354 100644 --- a/drivers/char/hvcs.c +++ b/drivers/char/hvcs.c @@ -1139,15 +1139,6 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp)  	hvcsd->tty = tty;  	tty->driver_data = hvcsd; -	/* -	 * Set this driver to low latency so that we actually have a chance at -	 * catching a throttled TTY after we flip_buffer_push.  Otherwise the -	 * flush_to_async may not execute until after the kernel_thread has -	 * yielded and resumed the next flip_buffer_push resulting in data -	 * loss. -	 */ -	tty->low_latency = 1; -  	memset(&hvcsd->buffer[0], 0x00, HVCS_BUFF_LEN);  	/* diff --git a/drivers/char/hvsi.c b/drivers/char/hvsi.c index 406f8742a26..2989056a9e3 100644 --- a/drivers/char/hvsi.c +++ b/drivers/char/hvsi.c @@ -810,7 +810,6 @@ static int hvsi_open(struct tty_struct *tty, struct file *filp)  	hp = &hvsi_ports[line];  	tty->driver_data = hp; -	tty->low_latency = 1; /* avoid throttle/tty_flip_buffer_push race */  	mb();  	if (hp->state == HVSI_FSP_DIED) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index b55cb67435b..d6daf3c507d 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -754,11 +754,6 @@ static struct kobj_type ktype_cpufreq = {  	.release	= cpufreq_sysfs_release,  }; -static struct kobj_type ktype_empty_cpufreq = { -	.sysfs_ops	= &sysfs_ops, -	.release	= cpufreq_sysfs_release, -}; -  /**   * cpufreq_add_dev - add a CPU device @@ -892,36 +887,26 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)  	memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));  	/* prepare interface data */ -	if (!cpufreq_driver->hide_interface) { -		ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, -					   &sys_dev->kobj, "cpufreq"); +	ret = kobject_init_and_add(&policy->kobj, &ktype_cpufreq, &sys_dev->kobj, +				   "cpufreq"); +	if (ret) +		goto err_out_driver_exit; + +	/* set up files for this cpu device */ +	drv_attr = cpufreq_driver->attr; +	while ((drv_attr) && (*drv_attr)) { +		ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));  		if (ret)  			goto err_out_driver_exit; - -		/* set up files for this cpu device */ -		drv_attr = cpufreq_driver->attr; -		while ((drv_attr) && (*drv_attr)) { -			ret = sysfs_create_file(&policy->kobj, -						&((*drv_attr)->attr)); -			if (ret) -				goto err_out_driver_exit; -			drv_attr++; -		} -		if (cpufreq_driver->get) { -			ret = sysfs_create_file(&policy->kobj, -						&cpuinfo_cur_freq.attr); -			if (ret) -				goto err_out_driver_exit; -		} -		if (cpufreq_driver->target) { -			ret = sysfs_create_file(&policy->kobj, -						&scaling_cur_freq.attr); -			if (ret) -				goto err_out_driver_exit; -		} -	} else { -		ret = kobject_init_and_add(&policy->kobj, &ktype_empty_cpufreq, -					   &sys_dev->kobj, "cpufreq"); +		drv_attr++; +	} +	if (cpufreq_driver->get) { +		ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr); +		if (ret) +			goto err_out_driver_exit; +	} +	if (cpufreq_driver->target) { +		ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);  		if (ret)  			goto err_out_driver_exit;  	} diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c index 2d637e0fbc0..d9e751be8c5 100644 --- a/drivers/crypto/ixp4xx_crypto.c +++ b/drivers/crypto/ixp4xx_crypto.c @@ -457,10 +457,12 @@ static int init_ixp_crypto(void)  	if (!ctx_pool) {  		goto err;  	} -	ret = qmgr_request_queue(SEND_QID, NPE_QLEN_TOTAL, 0, 0); +	ret = qmgr_request_queue(SEND_QID, NPE_QLEN_TOTAL, 0, 0, +				 "ixp_crypto:out", NULL);  	if (ret)  		goto err; -	ret = qmgr_request_queue(RECV_QID, NPE_QLEN, 0, 0); +	ret = qmgr_request_queue(RECV_QID, NPE_QLEN, 0, 0, +				 "ixp_crypto:in", NULL);  	if (ret) {  		qmgr_release_queue(SEND_QID);  		goto err; diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c index 856b3cc2558..3f0fdd18255 100644 --- a/drivers/crypto/padlock-aes.c +++ b/drivers/crypto/padlock-aes.c @@ -489,4 +489,4 @@ MODULE_DESCRIPTION("VIA PadLock AES algorithm support");  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Michal Ludvig"); -MODULE_ALIAS("aes"); +MODULE_ALIAS("aes-all"); diff --git a/drivers/crypto/padlock-sha.c b/drivers/crypto/padlock-sha.c index a7fbadebf62..a2c8e8514b6 100644 --- a/drivers/crypto/padlock-sha.c +++ b/drivers/crypto/padlock-sha.c @@ -304,7 +304,7 @@ MODULE_DESCRIPTION("VIA PadLock SHA1/SHA256 algorithms support.");  MODULE_LICENSE("GPL");  MODULE_AUTHOR("Michal Ludvig"); -MODULE_ALIAS("sha1"); -MODULE_ALIAS("sha256"); +MODULE_ALIAS("sha1-all"); +MODULE_ALIAS("sha256-all");  MODULE_ALIAS("sha1-padlock");  MODULE_ALIAS("sha256-padlock"); diff --git a/drivers/dca/dca-core.c b/drivers/dca/dca-core.c index 33bd7534751..25b743abfb5 100644 --- a/drivers/dca/dca-core.c +++ b/drivers/dca/dca-core.c @@ -1,5 +1,5 @@  /* - * Copyright(c) 2007 Intel Corporation. All rights reserved. + * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the Free diff --git a/drivers/dca/dca-sysfs.c b/drivers/dca/dca-sysfs.c index bb538b9690e..ee916c9857e 100644 --- a/drivers/dca/dca-sysfs.c +++ b/drivers/dca/dca-sysfs.c @@ -1,3 +1,24 @@ +/* + * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston, MA  02111-1307, USA. + * + * The full GNU General Public License is included in this distribution in the + * file called COPYING. + */ +  #include <linux/kernel.h>  #include <linux/spinlock.h>  #include <linux/device.h> diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index 732fa1ec36a..e190d8b3070 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c @@ -430,13 +430,15 @@ late_initcall(dmatest_init);  static void __exit dmatest_exit(void)  {  	struct dmatest_chan *dtc, *_dtc; +	struct dma_chan *chan;  	list_for_each_entry_safe(dtc, _dtc, &dmatest_channels, node) {  		list_del(&dtc->node); +		chan = dtc->chan;  		dmatest_cleanup_channel(dtc);  		pr_debug("dmatest: dropped channel %s\n", -			 dma_chan_name(dtc->chan)); -		dma_release_channel(dtc->chan); +			 dma_chan_name(chan)); +		dma_release_channel(chan);  	}  }  module_exit(dmatest_exit); diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c index 70126a60623..86d6da47f55 100644 --- a/drivers/dma/fsldma.c +++ b/drivers/dma/fsldma.c @@ -158,7 +158,8 @@ static void dma_start(struct fsl_dma_chan *fsl_chan)  static void dma_halt(struct fsl_dma_chan *fsl_chan)  { -	int i = 0; +	int i; +  	DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr,  		DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) | FSL_DMA_MR_CA,  		32); @@ -166,8 +167,11 @@ static void dma_halt(struct fsl_dma_chan *fsl_chan)  		DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) & ~(FSL_DMA_MR_CS  		| FSL_DMA_MR_EMS_EN | FSL_DMA_MR_CA), 32); -	while (!dma_is_idle(fsl_chan) && (i++ < 100)) +	for (i = 0; i < 100; i++) { +		if (dma_is_idle(fsl_chan)) +			break;  		udelay(10); +	}  	if (i >= 100 && !dma_is_idle(fsl_chan))  		dev_err(fsl_chan->dev, "DMA halt timeout!\n");  } diff --git a/drivers/dma/ioat.c b/drivers/dma/ioat.c index 4105d6575b6..ed83dd9df19 100644 --- a/drivers/dma/ioat.c +++ b/drivers/dma/ioat.c @@ -1,6 +1,6 @@  /*   * Intel I/OAT DMA Linux driver - * Copyright(c) 2007 Intel Corporation. + * Copyright(c) 2007 - 2009 Intel Corporation.   *   * This program is free software; you can redistribute it and/or modify it   * under the terms and conditions of the GNU General Public License, diff --git a/drivers/dma/ioat_dca.c b/drivers/dma/ioat_dca.c index 6cf622da028..c012a1e1504 100644 --- a/drivers/dma/ioat_dca.c +++ b/drivers/dma/ioat_dca.c @@ -1,6 +1,6 @@  /*   * Intel I/OAT DMA Linux driver - * Copyright(c) 2007 Intel Corporation. + * Copyright(c) 2007 - 2009 Intel Corporation.   *   * This program is free software; you can redistribute it and/or modify it   * under the terms and conditions of the GNU General Public License, @@ -49,6 +49,23 @@  #define DCA_TAG_MAP_MASK 0xDF +/* expected tag map bytes for I/OAT ver.2 */ +#define DCA2_TAG_MAP_BYTE0 0x80 +#define DCA2_TAG_MAP_BYTE1 0x0 +#define DCA2_TAG_MAP_BYTE2 0x81 +#define DCA2_TAG_MAP_BYTE3 0x82 +#define DCA2_TAG_MAP_BYTE4 0x82 + +/* verify if tag map matches expected values */ +static inline int dca2_tag_map_valid(u8 *tag_map) +{ +	return ((tag_map[0] == DCA2_TAG_MAP_BYTE0) && +		(tag_map[1] == DCA2_TAG_MAP_BYTE1) && +		(tag_map[2] == DCA2_TAG_MAP_BYTE2) && +		(tag_map[3] == DCA2_TAG_MAP_BYTE3) && +		(tag_map[4] == DCA2_TAG_MAP_BYTE4)); +} +  /*   * "Legacy" DCA systems do not implement the DCA register set in the   * I/OAT device.  Software needs direct support for their tag mappings. @@ -452,6 +469,13 @@ struct dca_provider *ioat2_dca_init(struct pci_dev *pdev, void __iomem *iobase)  			ioatdca->tag_map[i] = 0;  	} +	if (!dca2_tag_map_valid(ioatdca->tag_map)) { +		dev_err(&pdev->dev, "APICID_TAG_MAP set incorrectly by BIOS, " +			"disabling DCA\n"); +		free_dca_provider(dca); +		return NULL; +	} +  	err = register_dca_provider(dca, &pdev->dev);  	if (err) {  		free_dca_provider(dca); diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c index b3759c4b653..5905cd36bcd 100644 --- a/drivers/dma/ioat_dma.c +++ b/drivers/dma/ioat_dma.c @@ -1,6 +1,6 @@  /*   * Intel I/OAT DMA Linux driver - * Copyright(c) 2004 - 2007 Intel Corporation. + * Copyright(c) 2004 - 2009 Intel Corporation.   *   * This program is free software; you can redistribute it and/or modify it   * under the terms and conditions of the GNU General Public License, @@ -189,11 +189,13 @@ static int ioat_dma_enumerate_channels(struct ioatdma_device *device)  		ioat_chan->xfercap = xfercap;  		ioat_chan->desccount = 0;  		INIT_DELAYED_WORK(&ioat_chan->work, ioat_dma_chan_reset_part2); -		if (ioat_chan->device->version != IOAT_VER_1_2) { -			writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE -					| IOAT_DMA_DCA_ANY_CPU, -				ioat_chan->reg_base + IOAT_DCACTRL_OFFSET); -		} +		if (ioat_chan->device->version == IOAT_VER_2_0) +			writel(IOAT_DCACTRL_CMPL_WRITE_ENABLE | +			       IOAT_DMA_DCA_ANY_CPU, +			       ioat_chan->reg_base + IOAT_DCACTRL_OFFSET); +		else if (ioat_chan->device->version == IOAT_VER_3_0) +			writel(IOAT_DMA_DCA_ANY_CPU, +			       ioat_chan->reg_base + IOAT_DCACTRL_OFFSET);  		spin_lock_init(&ioat_chan->cleanup_lock);  		spin_lock_init(&ioat_chan->desc_lock);  		INIT_LIST_HEAD(&ioat_chan->free_desc); @@ -1169,9 +1171,8 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)  				 * up if the client is done with the descriptor  				 */  				if (async_tx_test_ack(&desc->async_tx)) { -					list_del(&desc->node); -					list_add_tail(&desc->node, -						      &ioat_chan->free_desc); +					list_move_tail(&desc->node, +						       &ioat_chan->free_desc);  				} else  					desc->async_tx.cookie = 0;  			} else { @@ -1362,6 +1363,7 @@ static int ioat_dma_self_test(struct ioatdma_device *device)  	dma_cookie_t cookie;  	int err = 0;  	struct completion cmp; +	unsigned long tmo;  	src = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL);  	if (!src) @@ -1413,9 +1415,10 @@ static int ioat_dma_self_test(struct ioatdma_device *device)  	}  	device->common.device_issue_pending(dma_chan); -	wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)); +	tmo = wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000)); -	if (device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL) +	if (tmo == 0 || +	    device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL)  					!= DMA_SUCCESS) {  		dev_err(&device->pdev->dev,  			"Self-test copy timed out, disabling\n"); @@ -1657,6 +1660,13 @@ struct ioatdma_device *ioat_dma_probe(struct pci_dev *pdev,  		" %d channels, device version 0x%02x, driver version %s\n",  		device->common.chancnt, device->version, IOAT_DMA_VERSION); +	if (!device->common.chancnt) { +		dev_err(&device->pdev->dev, +			"Intel(R) I/OAT DMA Engine problem found: " +			"zero channels detected\n"); +		goto err_setup_interrupts; +	} +  	err = ioat_dma_setup_interrupts(device);  	if (err)  		goto err_setup_interrupts; @@ -1696,6 +1706,9 @@ void ioat_dma_remove(struct ioatdma_device *device)  	struct dma_chan *chan, *_chan;  	struct ioat_dma_chan *ioat_chan; +	if (device->version != IOAT_VER_3_0) +		cancel_delayed_work(&device->work); +  	ioat_dma_remove_interrupts(device);  	dma_async_device_unregister(&device->common); @@ -1707,10 +1720,6 @@ void ioat_dma_remove(struct ioatdma_device *device)  	pci_release_regions(device->pdev);  	pci_disable_device(device->pdev); -	if (device->version != IOAT_VER_3_0) { -		cancel_delayed_work(&device->work); -	} -  	list_for_each_entry_safe(chan, _chan,  				 &device->common.channels, device_node) {  		ioat_chan = to_ioat_chan(chan); diff --git a/drivers/dma/ioatdma.h b/drivers/dma/ioatdma.h index a3306d0e137..a52ff4bd460 100644 --- a/drivers/dma/ioatdma.h +++ b/drivers/dma/ioatdma.h @@ -1,5 +1,5 @@  /* - * Copyright(c) 2004 - 2007 Intel Corporation. All rights reserved. + * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the Free @@ -29,7 +29,7 @@  #include <linux/pci_ids.h>  #include <net/tcp.h> -#define IOAT_DMA_VERSION  "3.30" +#define IOAT_DMA_VERSION  "3.64"  enum ioat_interrupt {  	none = 0, @@ -135,12 +135,14 @@ static inline void ioat_set_tcp_copy_break(struct ioatdma_device *dev)  	#ifdef CONFIG_NET_DMA  	switch (dev->version) {  	case IOAT_VER_1_2: -	case IOAT_VER_3_0:  		sysctl_tcp_dma_copybreak = 4096;  		break;  	case IOAT_VER_2_0:  		sysctl_tcp_dma_copybreak = 2048;  		break; +	case IOAT_VER_3_0: +		sysctl_tcp_dma_copybreak = 262144; +		break;  	}  	#endif  } diff --git a/drivers/dma/ioatdma_hw.h b/drivers/dma/ioatdma_hw.h index f1ae2c776f7..afa57eef86c 100644 --- a/drivers/dma/ioatdma_hw.h +++ b/drivers/dma/ioatdma_hw.h @@ -1,5 +1,5 @@  /* - * Copyright(c) 2004 - 2007 Intel Corporation. All rights reserved. + * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the Free diff --git a/drivers/dma/ioatdma_registers.h b/drivers/dma/ioatdma_registers.h index 827cb503cac..49bc277424f 100644 --- a/drivers/dma/ioatdma_registers.h +++ b/drivers/dma/ioatdma_registers.h @@ -1,5 +1,5 @@  /* - * Copyright(c) 2004 - 2007 Intel Corporation. All rights reserved. + * Copyright(c) 2004 - 2009 Intel Corporation. All rights reserved.   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the Free diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c index ea5440dd10d..16adbe61cfb 100644 --- a/drivers/dma/iop-adma.c +++ b/drivers/dma/iop-adma.c @@ -928,19 +928,19 @@ iop_adma_xor_zero_sum_self_test(struct iop_adma_device *device)  	for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) {  		xor_srcs[src_idx] = alloc_page(GFP_KERNEL); -		if (!xor_srcs[src_idx]) -			while (src_idx--) { +		if (!xor_srcs[src_idx]) { +			while (src_idx--)  				__free_page(xor_srcs[src_idx]); -				return -ENOMEM; -			} +			return -ENOMEM; +		}  	}  	dest = alloc_page(GFP_KERNEL); -	if (!dest) -		while (src_idx--) { +	if (!dest) { +		while (src_idx--)  			__free_page(xor_srcs[src_idx]); -			return -ENOMEM; -		} +		return -ENOMEM; +	}  	/* Fill in src buffers */  	for (src_idx = 0; src_idx < IOP_ADMA_NUM_SRC_TEST; src_idx++) { @@ -1401,7 +1401,7 @@ MODULE_ALIAS("platform:iop-adma");  static struct platform_driver iop_adma_driver = {  	.probe		= iop_adma_probe, -	.remove		= iop_adma_remove, +	.remove		= __devexit_p(iop_adma_remove),  	.driver		= {  		.owner	= THIS_MODULE,  		.name	= "iop-adma", diff --git a/drivers/dma/ipu/ipu_idmac.c b/drivers/dma/ipu/ipu_idmac.c index 1f154d08e98..ae50a9d1a4e 100644 --- a/drivers/dma/ipu/ipu_idmac.c +++ b/drivers/dma/ipu/ipu_idmac.c @@ -729,7 +729,7 @@ static int ipu_init_channel_buffer(struct idmac_channel *ichan,  	ichan->status = IPU_CHANNEL_READY; -	spin_unlock_irqrestore(ipu->lock, flags); +	spin_unlock_irqrestore(&ipu->lock, flags);  	return 0;  } diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index d35cbd1ff0b..cb7f26fb9f1 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c @@ -1019,19 +1019,19 @@ mv_xor_xor_self_test(struct mv_xor_device *device)  	for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) {  		xor_srcs[src_idx] = alloc_page(GFP_KERNEL); -		if (!xor_srcs[src_idx]) -			while (src_idx--) { +		if (!xor_srcs[src_idx]) { +			while (src_idx--)  				__free_page(xor_srcs[src_idx]); -				return -ENOMEM; -			} +			return -ENOMEM; +		}  	}  	dest = alloc_page(GFP_KERNEL); -	if (!dest) -		while (src_idx--) { +	if (!dest) { +		while (src_idx--)  			__free_page(xor_srcs[src_idx]); -			return -ENOMEM; -		} +		return -ENOMEM; +	}  	/* Fill in src buffers */  	for (src_idx = 0; src_idx < MV_XOR_NUM_SRC_TEST; src_idx++) { @@ -1287,7 +1287,7 @@ mv_xor_conf_mbus_windows(struct mv_xor_shared_private *msp,  static struct platform_driver mv_xor_driver = {  	.probe		= mv_xor_probe, -	.remove		= mv_xor_remove, +	.remove		= __devexit_p(mv_xor_remove),  	.driver		= {  		.owner	= THIS_MODULE,  		.name	= MV_XOR_NAME, diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 096e2a37446..7c8b15b22bf 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c @@ -168,7 +168,7 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data,  	    file_priv->minor->master != file_priv->master) {  		mutex_lock(&dev->struct_mutex);  		file_priv->minor->master = drm_master_get(file_priv->master); -		mutex_lock(&dev->struct_mutex); +		mutex_unlock(&dev->struct_mutex);  	}  	return 0; diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 6dab63bdc4c..6d21b9e48b8 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c @@ -1105,7 +1105,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)  					 1024 * 1024,  					 MTRR_TYPE_WRCOMB, 1);  	if (dev_priv->mm.gtt_mtrr < 0) { -		DRM_INFO("MTRR allocation failed\n.  Graphics " +		DRM_INFO("MTRR allocation failed.  Graphics "  			 "performance may suffer.\n");  	} diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 17fa40858d2..d6cc9861e0a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -279,7 +279,6 @@ typedef struct drm_i915_private {  	u8 saveAR_INDEX;  	u8 saveAR[21];  	u8 saveDACMASK; -	u8 saveDACDATA[256*3]; /* 256 3-byte colors */  	u8 saveCR[37];  	struct { @@ -457,6 +456,12 @@ struct drm_i915_gem_object {  	/** for phy allocated objects */  	struct drm_i915_gem_phys_object *phys_obj; + +	/** +	 * Used for checking the object doesn't appear more than once +	 * in an execbuffer object list. +	 */ +	int in_execbuffer;  };  /** diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 85685bfd12d..37427e4016c 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1476,7 +1476,7 @@ static void i915_write_fence_reg(struct drm_i915_fence_reg *reg)  	struct drm_i915_gem_object *obj_priv = obj->driver_private;  	int regnum = obj_priv->fence_reg;  	int tile_width; -	uint32_t val; +	uint32_t fence_reg, val;  	uint32_t pitch_val;  	if ((obj_priv->gtt_offset & ~I915_FENCE_START_MASK) || @@ -1503,7 +1503,11 @@ static void i915_write_fence_reg(struct drm_i915_fence_reg *reg)  	val |= pitch_val << I830_FENCE_PITCH_SHIFT;  	val |= I830_FENCE_REG_VALID; -	I915_WRITE(FENCE_REG_830_0 + (regnum * 4), val); +	if (regnum < 8) +		fence_reg = FENCE_REG_830_0 + (regnum * 4); +	else +		fence_reg = FENCE_REG_945_8 + ((regnum - 8) * 4); +	I915_WRITE(fence_reg, val);  }  static void i830_write_fence_reg(struct drm_i915_fence_reg *reg) @@ -1557,7 +1561,8 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write)  	struct drm_i915_private *dev_priv = dev->dev_private;  	struct drm_i915_gem_object *obj_priv = obj->driver_private;  	struct drm_i915_fence_reg *reg = NULL; -	int i, ret; +	struct drm_i915_gem_object *old_obj_priv = NULL; +	int i, ret, avail;  	switch (obj_priv->tiling_mode) {  	case I915_TILING_NONE: @@ -1580,25 +1585,46 @@ i915_gem_object_get_fence_reg(struct drm_gem_object *obj, bool write)  	}  	/* First try to find a free reg */ +try_again: +	avail = 0;  	for (i = dev_priv->fence_reg_start; i < dev_priv->num_fence_regs; i++) {  		reg = &dev_priv->fence_regs[i];  		if (!reg->obj)  			break; + +		old_obj_priv = reg->obj->driver_private; +		if (!old_obj_priv->pin_count) +		    avail++;  	}  	/* None available, try to steal one or wait for a user to finish */  	if (i == dev_priv->num_fence_regs) { -		struct drm_i915_gem_object *old_obj_priv = NULL; +		uint32_t seqno = dev_priv->mm.next_gem_seqno;  		loff_t offset; -try_again: -		/* Could try to use LRU here instead... */ +		if (avail == 0) +			return -ENOMEM; +  		for (i = dev_priv->fence_reg_start;  		     i < dev_priv->num_fence_regs; i++) { +			uint32_t this_seqno; +  			reg = &dev_priv->fence_regs[i];  			old_obj_priv = reg->obj->driver_private; -			if (!old_obj_priv->pin_count) + +			if (old_obj_priv->pin_count) +				continue; + +			/* i915 uses fences for GPU access to tiled buffers */ +			if (IS_I965G(dev) || !old_obj_priv->active)  				break; + +			/* find the seqno of the first available fence */ +			this_seqno = old_obj_priv->last_rendering_seqno; +			if (this_seqno != 0 && +			    reg->obj->write_domain == 0 && +			    i915_seqno_passed(seqno, this_seqno)) +				seqno = this_seqno;  		}  		/* @@ -1606,15 +1632,25 @@ try_again:  		 * objects to finish before trying again.  		 */  		if (i == dev_priv->num_fence_regs) { -			ret = i915_gem_object_set_to_gtt_domain(reg->obj, 0); -			if (ret) { -				WARN(ret != -ERESTARTSYS, -				     "switch to GTT domain failed: %d\n", ret); -				return ret; +			if (seqno == dev_priv->mm.next_gem_seqno) { +				i915_gem_flush(dev, +					       I915_GEM_GPU_DOMAINS, +					       I915_GEM_GPU_DOMAINS); +				seqno = i915_add_request(dev, +							 I915_GEM_GPU_DOMAINS); +				if (seqno == 0) +					return -ENOMEM;  			} + +			ret = i915_wait_request(dev, seqno); +			if (ret) +				return ret;  			goto try_again;  		} +		BUG_ON(old_obj_priv->active || +		       (reg->obj->write_domain & I915_GEM_GPU_DOMAINS)); +  		/*  		 * Zap this virtual mapping so we can set up a fence again  		 * for this object next time we need it. @@ -1655,8 +1691,17 @@ i915_gem_clear_fence_reg(struct drm_gem_object *obj)  	if (IS_I965G(dev))  		I915_WRITE64(FENCE_REG_965_0 + (obj_priv->fence_reg * 8), 0); -	else -		I915_WRITE(FENCE_REG_830_0 + (obj_priv->fence_reg * 4), 0); +	else { +		uint32_t fence_reg; + +		if (obj_priv->fence_reg < 8) +			fence_reg = FENCE_REG_830_0 + obj_priv->fence_reg * 4; +		else +			fence_reg = FENCE_REG_945_8 + (obj_priv->fence_reg - +						       8) * 4; + +		I915_WRITE(fence_reg, 0); +	}  	dev_priv->fence_regs[obj_priv->fence_reg].obj = NULL;  	obj_priv->fence_reg = I915_FENCE_REG_NONE; @@ -2469,6 +2514,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,  	struct drm_i915_gem_exec_object *exec_list = NULL;  	struct drm_gem_object **object_list = NULL;  	struct drm_gem_object *batch_obj; +	struct drm_i915_gem_object *obj_priv;  	int ret, i, pinned = 0;  	uint64_t exec_offset;  	uint32_t seqno, flush_domains; @@ -2533,6 +2579,15 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,  			ret = -EBADF;  			goto err;  		} + +		obj_priv = object_list[i]->driver_private; +		if (obj_priv->in_execbuffer) { +			DRM_ERROR("Object %p appears more than once in object list\n", +				   object_list[i]); +			ret = -EBADF; +			goto err; +		} +		obj_priv->in_execbuffer = true;  	}  	/* Pin and relocate */ @@ -2674,8 +2729,13 @@ err:  	for (i = 0; i < pinned; i++)  		i915_gem_object_unpin(object_list[i]); -	for (i = 0; i < args->buffer_count; i++) +	for (i = 0; i < args->buffer_count; i++) { +		if (object_list[i]) { +			obj_priv = object_list[i]->driver_private; +			obj_priv->in_execbuffer = false; +		}  		drm_gem_object_unreference(object_list[i]); +	}  	mutex_unlock(&dev->struct_mutex); @@ -2712,17 +2772,24 @@ i915_gem_object_pin(struct drm_gem_object *obj, uint32_t alignment)  		ret = i915_gem_object_bind_to_gtt(obj, alignment);  		if (ret != 0) {  			if (ret != -EBUSY && ret != -ERESTARTSYS) -				DRM_ERROR("Failure to bind: %d", ret); +				DRM_ERROR("Failure to bind: %d\n", ret); +			return ret; +		} +	} +	/* +	 * Pre-965 chips need a fence register set up in order to +	 * properly handle tiled surfaces. +	 */ +	if (!IS_I965G(dev) && +	    obj_priv->fence_reg == I915_FENCE_REG_NONE && +	    obj_priv->tiling_mode != I915_TILING_NONE) { +		ret = i915_gem_object_get_fence_reg(obj, true); +		if (ret != 0) { +			if (ret != -EBUSY && ret != -ERESTARTSYS) +				DRM_ERROR("Failure to install fence: %d\n", +					  ret);  			return ret;  		} -		/* -		 * Pre-965 chips need a fence register set up in order to -		 * properly handle tiled surfaces. -		 */ -		if (!IS_I965G(dev) && -		    obj_priv->fence_reg == I915_FENCE_REG_NONE && -		    obj_priv->tiling_mode != I915_TILING_NONE) -			i915_gem_object_get_fence_reg(obj, true);  	}  	obj_priv->pin_count++; diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 9d6539a868b..90600d89941 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -184,6 +184,7 @@   * Fence registers   */  #define FENCE_REG_830_0			0x2000 +#define FENCE_REG_945_8			0x3000  #define   I830_FENCE_START_MASK		0x07f80000  #define   I830_FENCE_TILING_Y_SHIFT	12  #define   I830_FENCE_SIZE_BITS(size)	((ffs((size) >> 19) - 1) << 8) diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 5d84027ee8f..d669cc2b42c 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c @@ -119,11 +119,6 @@ static void i915_save_vga(struct drm_device *dev)  	/* VGA color palette registers */  	dev_priv->saveDACMASK = I915_READ8(VGA_DACMASK); -	/* DACCRX automatically increments during read */ -	I915_WRITE8(VGA_DACRX, 0); -	/* Read 3 bytes of color data from each index */ -	for (i = 0; i < 256 * 3; i++) -		dev_priv->saveDACDATA[i] = I915_READ8(VGA_DACDATA);  	/* MSR bits */  	dev_priv->saveMSR = I915_READ8(VGA_MSR_READ); @@ -225,12 +220,6 @@ static void i915_restore_vga(struct drm_device *dev)  	/* VGA color palette registers */  	I915_WRITE8(VGA_DACMASK, dev_priv->saveDACMASK); -	/* DACCRX automatically increments during read */ -	I915_WRITE8(VGA_DACWX, 0); -	/* Read 3 bytes of color data from each index */ -	for (i = 0; i < 256 * 3; i++) -		I915_WRITE8(VGA_DACDATA, dev_priv->saveDACDATA[i]); -  }  int i915_save_state(struct drm_device *dev) diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 4940e4d70c2..1f5b5d4c3c3 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c @@ -306,7 +306,7 @@ static int hiddev_open(struct inode *inode, struct file *file)  	return 0;  bail:  	file->private_data = NULL; -	kfree(list->hiddev); +	kfree(list);  	return res;  } @@ -323,7 +323,7 @@ static ssize_t hiddev_write(struct file * file, const char __user * buffer, size   */  static ssize_t hiddev_read(struct file * file, char __user * buffer, size_t count, loff_t *ppos)  { -	DECLARE_WAITQUEUE(wait, current); +	DEFINE_WAIT(wait);  	struct hiddev_list *list = file->private_data;  	int event_size;  	int retval; diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index b84bf066879..b4eea0292c1 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -543,8 +543,8 @@ config SENSORS_LM90  	help  	  If you say yes here you get support for National Semiconductor LM90,  	  LM86, LM89 and LM99, Analog Devices ADM1032 and ADT7461, and Maxim -	  MAX6646, MAX6647, MAX6649, MAX6657, MAX6658, MAX6659, MAX6680 and -	  MAX6681 sensor chips. +	  MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659, +	  MAX6680, MAX6681 and MAX6692 sensor chips.  	  This driver can also be built as a module.  If so, the module  	  will be called lm90. diff --git a/drivers/hwmon/abituguru3.c b/drivers/hwmon/abituguru3.c index e52b38806d0..ad2b3431b72 100644 --- a/drivers/hwmon/abituguru3.c +++ b/drivers/hwmon/abituguru3.c @@ -760,8 +760,11 @@ static int abituguru3_read_increment_offset(struct abituguru3_data *data,  	for (i = 0; i < offset_count; i++)  		if ((x = abituguru3_read(data, bank, offset + i, count, -				buf + i * count)) != count) -			return i * count + (i && (x < 0)) ? 0 : x; +				buf + i * count)) != count) { +			if (x < 0) +				return x; +			return i * count + x; +		}  	return i * count;  } diff --git a/drivers/hwmon/f75375s.c b/drivers/hwmon/f75375s.c index 1692de36996..18a1ba88816 100644 --- a/drivers/hwmon/f75375s.c +++ b/drivers/hwmon/f75375s.c @@ -617,7 +617,7 @@ static void f75375_init(struct i2c_client *client, struct f75375_data *data,  static int f75375_probe(struct i2c_client *client,  		const struct i2c_device_id *id)  { -	struct f75375_data *data = i2c_get_clientdata(client); +	struct f75375_data *data;  	struct f75375s_platform_data *f75375s_pdata = client->dev.platform_data;  	int err; diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index 95a99c590da..9157247fed8 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c @@ -213,7 +213,7 @@ static inline u16 FAN16_TO_REG(long rpm)  #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)<0?(((val)-500)/1000):\  					((val)+500)/1000),-128,127)) -#define TEMP_FROM_REG(val) (((val)>0x80?(val)-0x100:(val))*1000) +#define TEMP_FROM_REG(val) ((val) * 1000)  #define PWM_TO_REG(val)   ((val) >> 1)  #define PWM_FROM_REG(val) (((val)&0x7f) << 1) @@ -267,9 +267,9 @@ struct it87_data {  	u8 has_fan;		/* Bitfield, fans enabled */  	u16 fan[5];		/* Register values, possibly combined */  	u16 fan_min[5];		/* Register values, possibly combined */ -	u8 temp[3];		/* Register value */ -	u8 temp_high[3];	/* Register value */ -	u8 temp_low[3];		/* Register value */ +	s8 temp[3];		/* Register value */ +	s8 temp_high[3];	/* Register value */ +	s8 temp_low[3];		/* Register value */  	u8 sensor;		/* Register value */  	u8 fan_div[3];		/* Register encoding, shifted right */  	u8 vid;			/* Register encoding, combined */ diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c index cfc1ee90f5a..b251d8674b4 100644 --- a/drivers/hwmon/lm85.c +++ b/drivers/hwmon/lm85.c @@ -72,6 +72,7 @@ I2C_CLIENT_INSMOD_7(lm85b, lm85c, adm1027, adt7463, adt7468, emc6d100,  #define	LM85_COMPANY_SMSC		0x5c  #define	LM85_VERSTEP_VMASK              0xf0  #define	LM85_VERSTEP_GENERIC		0x60 +#define	LM85_VERSTEP_GENERIC2		0x70  #define	LM85_VERSTEP_LM85C		0x60  #define	LM85_VERSTEP_LM85B		0x62  #define	LM85_VERSTEP_ADM1027		0x60 @@ -334,6 +335,7 @@ static struct lm85_data *lm85_update_device(struct device *dev);  static const struct i2c_device_id lm85_id[] = {  	{ "adm1027", adm1027 },  	{ "adt7463", adt7463 }, +	{ "adt7468", adt7468 },  	{ "lm85", any_chip },  	{ "lm85b", lm85b },  	{ "lm85c", lm85c }, @@ -408,7 +410,8 @@ static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr,  	struct lm85_data *data = lm85_update_device(dev);  	int vid; -	if (data->type == adt7463 && (data->vid & 0x80)) { +	if ((data->type == adt7463 || data->type == adt7468) && +	    (data->vid & 0x80)) {  		/* 6-pin VID (VRM 10) */  		vid = vid_from_reg(data->vid & 0x3f, data->vrm);  	} else { @@ -1153,7 +1156,8 @@ static int lm85_detect(struct i2c_client *client, int kind,  			address, company, verstep);  		/* All supported chips have the version in common */ -		if ((verstep & LM85_VERSTEP_VMASK) != LM85_VERSTEP_GENERIC) { +		if ((verstep & LM85_VERSTEP_VMASK) != LM85_VERSTEP_GENERIC && +		    (verstep & LM85_VERSTEP_VMASK) != LM85_VERSTEP_GENERIC2) {  			dev_dbg(&adapter->dev, "Autodetection failed: "  				"unsupported version\n");  			return -ENODEV; diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c index 96a70186672..1aff7575799 100644 --- a/drivers/hwmon/lm90.c +++ b/drivers/hwmon/lm90.c @@ -32,10 +32,10 @@   * supported by this driver. These chips lack the remote temperature   * offset feature.   * - * This driver also supports the MAX6646, MAX6647 and MAX6649 chips - * made by Maxim.  These are again similar to the LM86, but they use - * unsigned temperature values and can report temperatures from 0 to - * 145 degrees. + * This driver also supports the MAX6646, MAX6647, MAX6648, MAX6649 and + * MAX6692 chips made by Maxim.  These are again similar to the LM86, + * but they use unsigned temperature values and can report temperatures + * from 0 to 145 degrees.   *   * This driver also supports the MAX6680 and MAX6681, two other sensor   * chips made by Maxim. These are quite similar to the other Maxim diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index eeda276f8f1..7f186bbcb99 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c @@ -482,7 +482,7 @@ mv64xxx_i2c_map_regs(struct platform_device *pd,  	return 0;  } -static void __devexit +static void  mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)  {  	if (drv_data->reg_base) { @@ -577,7 +577,7 @@ mv64xxx_i2c_remove(struct platform_device *dev)  static struct platform_driver mv64xxx_i2c_driver = {  	.probe	= mv64xxx_i2c_probe, -	.remove	= mv64xxx_i2c_remove, +	.remove	= __devexit_p(mv64xxx_i2c_remove),  	.driver	= {  		.owner	= THIS_MODULE,  		.name	= MV64XXX_I2C_CTLR_NAME, diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index e072903b12f..5ea3bfad172 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig @@ -721,6 +721,11 @@ config BLK_DEV_IDE_TX4939  	depends on SOC_TX4939  	select BLK_DEV_IDEDMA_SFF +config BLK_DEV_IDE_AT91 +	tristate "Atmel AT91 (SAM9, CAP9, AT572D940HF) IDE support" +	depends on ARM && ARCH_AT91 && !ARCH_AT91RM9200 && !ARCH_AT91X40 +	select IDE_TIMINGS +  config IDE_ARM  	tristate "ARM IDE support"  	depends on ARM && (ARCH_RPC || ARCH_SHARK) diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile index d0e3d7d5b46..1c326d94aa6 100644 --- a/drivers/ide/Makefile +++ b/drivers/ide/Makefile @@ -116,3 +116,4 @@ obj-$(CONFIG_BLK_DEV_IDE_AU1XXX)	+= au1xxx-ide.o  obj-$(CONFIG_BLK_DEV_IDE_TX4938)	+= tx4938ide.o  obj-$(CONFIG_BLK_DEV_IDE_TX4939)	+= tx4939ide.o +obj-$(CONFIG_BLK_DEV_IDE_AT91)		+= at91_ide.o diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c new file mode 100644 index 00000000000..1bb50f46388 --- /dev/null +++ b/drivers/ide/at91_ide.c @@ -0,0 +1,467 @@ +/* + * IDE host driver for AT91 (SAM9, CAP9, AT572D940HF) Static Memory Controller + * with Compact Flash True IDE logic + * + * Copyright (c) 2008, 2009 Kelvatek Ltd. + * + *  This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include <linux/version.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/clk.h> +#include <linux/err.h> +#include <linux/ide.h> +#include <linux/platform_device.h> + +#include <mach/board.h> +#include <mach/gpio.h> +#include <mach/at91sam9263.h> +#include <mach/at91sam9_smc.h> +#include <mach/at91sam9263_matrix.h> + +#define DRV_NAME "at91_ide" + +#define perr(fmt, args...) pr_err(DRV_NAME ": " fmt, ##args) +#define pdbg(fmt, args...) pr_debug("%s " fmt, __func__, ##args) + +/* + * Access to IDE device is possible through EBI Static Memory Controller + * with Compact Flash logic. For details see EBI and SMC datasheet sections + * of any microcontroller from AT91SAM9 family. + * + * Within SMC chip select address space, lines A[23:21] distinguish Compact + * Flash modes (I/O, common memory, attribute memory, True IDE). IDE modes are: + *   0x00c0000 - True IDE + *   0x00e0000 - Alternate True IDE (Alt Status Register) + * + * On True IDE mode Task File and Data Register are mapped at the same address. + * To distinguish access between these two different bus data width is used: + * 8Bit for Task File, 16Bit for Data I/O. + * + * After initialization we do 8/16 bit flipping (changes in SMC MODE register) + * only inside IDE callback routines which are serialized by IDE layer, + * so no additional locking needed. + */ + +#define TASK_FILE	0x00c00000 +#define ALT_MODE	0x00e00000 +#define REGS_SIZE	8 + +#define enter_16bit(cs, mode) do {					\ +	mode = at91_sys_read(AT91_SMC_MODE(cs));			\ +	at91_sys_write(AT91_SMC_MODE(cs), mode | AT91_SMC_DBW_16);	\ +} while (0) + +#define leave_16bit(cs, mode) at91_sys_write(AT91_SMC_MODE(cs), mode); + +static void set_smc_timings(const u8 chipselect, const u16 cycle, +			    const u16 setup, const u16 pulse, +			    const u16 data_float, int use_iordy) +{ +	unsigned long mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | +			     AT91_SMC_BAT_SELECT; + +	/* disable or enable waiting for IORDY signal */ +	if (use_iordy) +		mode |= AT91_SMC_EXNWMODE_READY; + +	/* add data float cycles if needed */ +	if (data_float) +		mode |= AT91_SMC_TDF_(data_float); + +	at91_sys_write(AT91_SMC_MODE(chipselect), mode); + +	/* setup timings in SMC */ +	at91_sys_write(AT91_SMC_SETUP(chipselect), AT91_SMC_NWESETUP_(setup) | +						   AT91_SMC_NCS_WRSETUP_(0) | +						   AT91_SMC_NRDSETUP_(setup) | +						   AT91_SMC_NCS_RDSETUP_(0)); +	at91_sys_write(AT91_SMC_PULSE(chipselect), AT91_SMC_NWEPULSE_(pulse) | +						   AT91_SMC_NCS_WRPULSE_(cycle) | +						   AT91_SMC_NRDPULSE_(pulse) | +						   AT91_SMC_NCS_RDPULSE_(cycle)); +	at91_sys_write(AT91_SMC_CYCLE(chipselect), AT91_SMC_NWECYCLE_(cycle) | +						   AT91_SMC_NRDCYCLE_(cycle)); +} + +static unsigned int calc_mck_cycles(unsigned int ns, unsigned int mck_hz) +{ +	u64 tmp = ns; + +	tmp *= mck_hz; +	tmp += 1000*1000*1000 - 1; /* round up */ +	do_div(tmp, 1000*1000*1000); +	return (unsigned int) tmp; +} + +static void apply_timings(const u8 chipselect, const u8 pio, +			  const struct ide_timing *timing, int use_iordy) +{ +	unsigned int t0, t1, t2, t6z; +	unsigned int cycle, setup, pulse, data_float; +	unsigned int mck_hz; +	struct clk *mck; + +	/* see table 22 of Compact Flash standard 4.1 for the meaning, +	 * we do not stretch active (t2) time, so setup (t1) + hold time (th) +	 * assure at least minimal recovery (t2i) time */ +	t0 = timing->cyc8b; +	t1 = timing->setup; +	t2 = timing->act8b; +	t6z = (pio < 5) ? 30 : 20; + +	pdbg("t0=%u t1=%u t2=%u t6z=%u\n", t0, t1, t2, t6z); + +	mck = clk_get(NULL, "mck"); +	BUG_ON(IS_ERR(mck)); +	mck_hz = clk_get_rate(mck); +	pdbg("mck_hz=%u\n", mck_hz); + +	cycle = calc_mck_cycles(t0, mck_hz); +	setup = calc_mck_cycles(t1, mck_hz); +	pulse = calc_mck_cycles(t2, mck_hz); +	data_float = calc_mck_cycles(t6z, mck_hz); + +	pdbg("cycle=%u setup=%u pulse=%u data_float=%u\n", +	     cycle, setup, pulse, data_float); + +	set_smc_timings(chipselect, cycle, setup, pulse, data_float, use_iordy); +} + +static void at91_ide_input_data(ide_drive_t *drive, struct request *rq, +				void *buf, unsigned int len) +{ +	ide_hwif_t *hwif = drive->hwif; +	struct ide_io_ports *io_ports = &hwif->io_ports; +	u8 chipselect = hwif->select_data; +	unsigned long mode; + +	pdbg("cs %u buf %p len %d\n", chipselect, buf, len); + +	len++; + +	enter_16bit(chipselect, mode); +	__ide_mm_insw((void __iomem *) io_ports->data_addr, buf, len / 2); +	leave_16bit(chipselect, mode); +} + +static void at91_ide_output_data(ide_drive_t *drive, struct request *rq, +				 void *buf, unsigned int len) +{ +	ide_hwif_t *hwif = drive->hwif; +	struct ide_io_ports *io_ports = &hwif->io_ports; +	u8 chipselect = hwif->select_data; +	unsigned long mode; + +	pdbg("cs %u buf %p len %d\n", chipselect,  buf, len); + +	enter_16bit(chipselect, mode); +	__ide_mm_outsw((void __iomem *) io_ports->data_addr, buf, len / 2); +	leave_16bit(chipselect, mode); +} + +static u8 ide_mm_inb(unsigned long port) +{ +	return readb((void __iomem *) port); +} + +static void ide_mm_outb(u8 value, unsigned long port) +{ +	writeb(value, (void __iomem *) port); +} + +static void at91_ide_tf_load(ide_drive_t *drive, ide_task_t *task) +{ +	ide_hwif_t *hwif = drive->hwif; +	struct ide_io_ports *io_ports = &hwif->io_ports; +	struct ide_taskfile *tf = &task->tf; +	u8 HIHI = (task->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF; + +	if (task->tf_flags & IDE_TFLAG_FLAGGED) +		HIHI = 0xFF; + +	if (task->tf_flags & IDE_TFLAG_OUT_DATA) { +		u16 data = (tf->hob_data << 8) | tf->data; + +		at91_ide_output_data(drive, NULL, &data, 2); +	} + +	if (task->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) +		ide_mm_outb(tf->hob_feature, io_ports->feature_addr); +	if (task->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) +		ide_mm_outb(tf->hob_nsect, io_ports->nsect_addr); +	if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAL) +		ide_mm_outb(tf->hob_lbal, io_ports->lbal_addr); +	if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAM) +		ide_mm_outb(tf->hob_lbam, io_ports->lbam_addr); +	if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAH) +		ide_mm_outb(tf->hob_lbah, io_ports->lbah_addr); + +	if (task->tf_flags & IDE_TFLAG_OUT_FEATURE) +		ide_mm_outb(tf->feature, io_ports->feature_addr); +	if (task->tf_flags & IDE_TFLAG_OUT_NSECT) +		ide_mm_outb(tf->nsect, io_ports->nsect_addr); +	if (task->tf_flags & IDE_TFLAG_OUT_LBAL) +		ide_mm_outb(tf->lbal, io_ports->lbal_addr); +	if (task->tf_flags & IDE_TFLAG_OUT_LBAM) +		ide_mm_outb(tf->lbam, io_ports->lbam_addr); +	if (task->tf_flags & IDE_TFLAG_OUT_LBAH) +		ide_mm_outb(tf->lbah, io_ports->lbah_addr); + +	if (task->tf_flags & IDE_TFLAG_OUT_DEVICE) +		ide_mm_outb((tf->device & HIHI) | drive->select, io_ports->device_addr); +} + +static void at91_ide_tf_read(ide_drive_t *drive, ide_task_t *task) +{ +	ide_hwif_t *hwif = drive->hwif; +	struct ide_io_ports *io_ports = &hwif->io_ports; +	struct ide_taskfile *tf = &task->tf; + +	if (task->tf_flags & IDE_TFLAG_IN_DATA) { +		u16 data; + +		at91_ide_input_data(drive, NULL, &data, 2); +		tf->data = data & 0xff; +		tf->hob_data = (data >> 8) & 0xff; +	} + +	/* be sure we're looking at the low order bits */ +	ide_mm_outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr); + +	if (task->tf_flags & IDE_TFLAG_IN_FEATURE) +		tf->feature = ide_mm_inb(io_ports->feature_addr); +	if (task->tf_flags & IDE_TFLAG_IN_NSECT) +		tf->nsect  = ide_mm_inb(io_ports->nsect_addr); +	if (task->tf_flags & IDE_TFLAG_IN_LBAL) +		tf->lbal   = ide_mm_inb(io_ports->lbal_addr); +	if (task->tf_flags & IDE_TFLAG_IN_LBAM) +		tf->lbam   = ide_mm_inb(io_ports->lbam_addr); +	if (task->tf_flags & IDE_TFLAG_IN_LBAH) +		tf->lbah   = ide_mm_inb(io_ports->lbah_addr); +	if (task->tf_flags & IDE_TFLAG_IN_DEVICE) +		tf->device = ide_mm_inb(io_ports->device_addr); + +	if (task->tf_flags & IDE_TFLAG_LBA48) { +		ide_mm_outb(ATA_DEVCTL_OBS | 0x80, io_ports->ctl_addr); + +		if (task->tf_flags & IDE_TFLAG_IN_HOB_FEATURE) +			tf->hob_feature = ide_mm_inb(io_ports->feature_addr); +		if (task->tf_flags & IDE_TFLAG_IN_HOB_NSECT) +			tf->hob_nsect   = ide_mm_inb(io_ports->nsect_addr); +		if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAL) +			tf->hob_lbal    = ide_mm_inb(io_ports->lbal_addr); +		if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAM) +			tf->hob_lbam    = ide_mm_inb(io_ports->lbam_addr); +		if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAH) +			tf->hob_lbah    = ide_mm_inb(io_ports->lbah_addr); +	} +} + +static void at91_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) +{ +	struct ide_timing *timing; +	u8 chipselect = drive->hwif->select_data; +	int use_iordy = 0; + +	pdbg("chipselect %u pio %u\n", chipselect, pio); + +	timing = ide_timing_find_mode(XFER_PIO_0 + pio); +	BUG_ON(!timing); + +	if ((pio > 2 || ata_id_has_iordy(drive->id)) && +	    !(ata_id_is_cfa(drive->id) && pio > 4)) +		use_iordy = 1; + +	apply_timings(chipselect, pio, timing, use_iordy); +} + +static const struct ide_tp_ops at91_ide_tp_ops = { +	.exec_command	= ide_exec_command, +	.read_status	= ide_read_status, +	.read_altstatus	= ide_read_altstatus, +	.set_irq	= ide_set_irq, + +	.tf_load	= at91_ide_tf_load, +	.tf_read	= at91_ide_tf_read, + +	.input_data	= at91_ide_input_data, +	.output_data	= at91_ide_output_data, +}; + +static const struct ide_port_ops at91_ide_port_ops = { +	.set_pio_mode	= at91_ide_set_pio_mode, +}; + +static const struct ide_port_info at91_ide_port_info __initdata = { +	.port_ops	= &at91_ide_port_ops, +	.tp_ops		= &at91_ide_tp_ops, +	.host_flags 	= IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA | IDE_HFLAG_SINGLE | +			  IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_UNMASK_IRQS, +	.pio_mask 	= ATA_PIO5, +}; + +/* + * If interrupt is delivered through GPIO, IRQ are triggered on falling + * and rising edge of signal. Whereas IDE device request interrupt on high + * level (rising edge in our case). This mean we have fake interrupts, so + * we need to check interrupt pin and exit instantly from ISR when line + * is on low level. + */ + +irqreturn_t at91_irq_handler(int irq, void *dev_id) +{ +	int ntries = 8; +	int pin_val1, pin_val2; + +	/* additional deglitch, line can be noisy in badly designed PCB */ +	do { +		pin_val1 = at91_get_gpio_value(irq); +		pin_val2 = at91_get_gpio_value(irq); +	} while (pin_val1 != pin_val2 && --ntries > 0); + +	if (pin_val1 == 0 || ntries <= 0) +		return IRQ_HANDLED; + +	return ide_intr(irq, dev_id); +} + +static int __init at91_ide_probe(struct platform_device *pdev) +{ +	int ret; +	hw_regs_t hw; +	hw_regs_t *hws[] = { &hw, NULL, NULL, NULL }; +	struct ide_host *host; +	struct resource *res; +	unsigned long tf_base = 0, ctl_base = 0; +	struct at91_cf_data *board = pdev->dev.platform_data; + +	if (!board) +		return -ENODEV; + +	if (board->det_pin && at91_get_gpio_value(board->det_pin) != 0) { +		perr("no device detected\n"); +		return -ENODEV; +	} + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	if (!res) { +		perr("can't get memory resource\n"); +		return -ENODEV; +	} + +	if (!devm_request_mem_region(&pdev->dev, res->start + TASK_FILE, +				     REGS_SIZE, "ide") || +	    !devm_request_mem_region(&pdev->dev, res->start + ALT_MODE, +				     REGS_SIZE, "alt")) { +		perr("memory resources in use\n"); +		return -EBUSY; +	} + +	pdbg("chipselect %u irq %u res %08lx\n", board->chipselect, +	     board->irq_pin, (unsigned long) res->start); + +	tf_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + TASK_FILE, +					       REGS_SIZE); +	ctl_base = (unsigned long) devm_ioremap(&pdev->dev, res->start + ALT_MODE, +						REGS_SIZE); +	if (!tf_base || !ctl_base) { +		perr("can't map memory regions\n"); +		return -EBUSY; +	} + +	memset(&hw, 0, sizeof(hw)); + +	if (board->flags & AT91_IDE_SWAP_A0_A2) { +		/* workaround for stupid hardware bug */ +		hw.io_ports.data_addr	= tf_base + 0; +		hw.io_ports.error_addr	= tf_base + 4; +		hw.io_ports.nsect_addr	= tf_base + 2; +		hw.io_ports.lbal_addr	= tf_base + 6; +		hw.io_ports.lbam_addr	= tf_base + 1; +		hw.io_ports.lbah_addr	= tf_base + 5; +		hw.io_ports.device_addr = tf_base + 3; +		hw.io_ports.command_addr = tf_base + 7; +		hw.io_ports.ctl_addr	= ctl_base + 3; +	} else +		ide_std_init_ports(&hw, tf_base, ctl_base + 6); + +	hw.irq = board->irq_pin; +	hw.chipset = ide_generic; +	hw.dev = &pdev->dev; + +	host = ide_host_alloc(&at91_ide_port_info, hws); +	if (!host) { +		perr("failed to allocate ide host\n"); +		return -ENOMEM; +	} + +	/* setup Static Memory Controller - PIO 0 as default */ +	apply_timings(board->chipselect, 0, ide_timing_find_mode(XFER_PIO_0), 0); + +	/* with GPIO interrupt we have to do quirks in handler */ +	if (board->irq_pin >= PIN_BASE) +		host->irq_handler = at91_irq_handler; + +	host->ports[0]->select_data = board->chipselect; + +	ret = ide_host_register(host, &at91_ide_port_info, hws); +	if (ret) { +		perr("failed to register ide host\n"); +		goto err_free_host; +	} +	platform_set_drvdata(pdev, host); +	return 0; + +err_free_host: +	ide_host_free(host); +	return ret; +} + +static int __exit at91_ide_remove(struct platform_device *pdev) +{ +	struct ide_host *host = platform_get_drvdata(pdev); + +	ide_host_remove(host); +	return 0; +} + +static struct platform_driver at91_ide_driver = { +	.driver	= { +		.name = DRV_NAME, +		.owner = THIS_MODULE, +	}, +	.remove	= __exit_p(at91_ide_remove), +}; + +static int __init at91_ide_init(void) +{ +	return platform_driver_probe(&at91_ide_driver, at91_ide_probe); +} + +static void __exit at91_ide_exit(void) +{ +	platform_driver_unregister(&at91_ide_driver); +} + +module_init(at91_ide_init); +module_exit(at91_ide_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Stanislaw Gruszka <stf_xl@wp.pl>"); + diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index e96c0126059..e9d042dba0e 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c @@ -140,6 +140,12 @@ static void ide_queue_pc_head(ide_drive_t *drive, struct gendisk *disk,  	rq->cmd_flags |= REQ_PREEMPT;  	rq->buffer = (char *)pc;  	rq->rq_disk = disk; + +	if (pc->req_xfer) { +		rq->data = pc->buf; +		rq->data_len = pc->req_xfer; +	} +  	memcpy(rq->cmd, pc->c, 12);  	if (drive->media == ide_tape)  		rq->cmd[13] = REQ_IDETAPE_PC1; @@ -159,6 +165,12 @@ int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk,  	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);  	rq->cmd_type = REQ_TYPE_SPECIAL;  	rq->buffer = (char *)pc; + +	if (pc->req_xfer) { +		rq->data = pc->buf; +		rq->data_len = pc->req_xfer; +	} +  	memcpy(rq->cmd, pc->c, 12);  	if (drive->media == ide_tape)  		rq->cmd[13] = REQ_IDETAPE_PC1; diff --git a/drivers/ide/ide-disk_proc.c b/drivers/ide/ide-disk_proc.c index 1146f4204c6..1f86dcbd2b1 100644 --- a/drivers/ide/ide-disk_proc.c +++ b/drivers/ide/ide-disk_proc.c @@ -125,5 +125,5 @@ const struct ide_proc_devset ide_disk_settings[] = {  	IDE_PROC_DEVSET(multcount,	0,    16),  	IDE_PROC_DEVSET(nowerr,		0,     1),  	IDE_PROC_DEVSET(wcache,		0,     1), -	{ 0 }, +	{ NULL },  }; diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 72ebab0bc75..059c90bb5ad 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c @@ -128,6 +128,7 @@ int ide_build_sglist(ide_drive_t *drive, struct request *rq)  {  	ide_hwif_t *hwif = drive->hwif;  	struct scatterlist *sg = hwif->sg_table; +	int i;  	ide_map_sg(drive, rq); @@ -136,8 +137,13 @@ int ide_build_sglist(ide_drive_t *drive, struct request *rq)  	else  		hwif->sg_dma_direction = DMA_TO_DEVICE; -	return dma_map_sg(hwif->dev, sg, hwif->sg_nents, -			  hwif->sg_dma_direction); +	i = dma_map_sg(hwif->dev, sg, hwif->sg_nents, hwif->sg_dma_direction); +	if (i) { +		hwif->orig_sg_nents = hwif->sg_nents; +		hwif->sg_nents = i; +	} + +	return i;  }  EXPORT_SYMBOL_GPL(ide_build_sglist); @@ -156,7 +162,7 @@ void ide_destroy_dmatable(ide_drive_t *drive)  {  	ide_hwif_t *hwif = drive->hwif; -	dma_unmap_sg(hwif->dev, hwif->sg_table, hwif->sg_nents, +	dma_unmap_sg(hwif->dev, hwif->sg_table, hwif->orig_sg_nents,  		     hwif->sg_dma_direction);  }  EXPORT_SYMBOL_GPL(ide_destroy_dmatable); diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 3eab1c6c9b3..317ec62c33d 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -327,8 +327,10 @@ static ide_startstop_t ide_floppy_do_request(ide_drive_t *drive,  		return ide_stopped;  	} -	ide_init_sg_cmd(drive, rq); -	ide_map_sg(drive, rq); +	if (blk_fs_request(rq) || pc->req_xfer) { +		ide_init_sg_cmd(drive, rq); +		ide_map_sg(drive, rq); +	}  	pc->sg = hwif->sg_table;  	pc->sg_cnt = hwif->sg_nents; diff --git a/drivers/ide/ide-floppy_proc.c b/drivers/ide/ide-floppy_proc.c index 3ec762cb60a..fcd4d8153df 100644 --- a/drivers/ide/ide-floppy_proc.c +++ b/drivers/ide/ide-floppy_proc.c @@ -29,5 +29,5 @@ const struct ide_proc_devset ide_floppy_settings[] = {  	IDE_PROC_DEVSET(bios_head, 0,  255),  	IDE_PROC_DEVSET(bios_sect, 0,   63),  	IDE_PROC_DEVSET(ticks,	   0,  255), -	{ 0 }, +	{ NULL },  }; diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 9ee51adf567..a9a6c208288 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -908,7 +908,7 @@ void ide_timer_expiry (unsigned long data)  	ide_drive_t	*uninitialized_var(drive);  	ide_handler_t	*handler;  	unsigned long	flags; -	unsigned long	wait = -1; +	int		wait = -1;  	int		plug_device = 0;  	spin_lock_irqsave(&hwif->lock, flags); @@ -1162,6 +1162,7 @@ out_early:  	return irq_ret;  } +EXPORT_SYMBOL_GPL(ide_intr);  /**   *	ide_do_drive_cmd	-	issue IDE special command diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 753b92ebe0a..b1892bd95c6 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -315,6 +315,8 @@ void ide_output_data(ide_drive_t *drive, struct request *rq, void *buf,  	u8 io_32bit = drive->io_32bit;  	u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; +	len++; +  	if (io_32bit) {  		unsigned long uninitialized_var(flags); diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index ce0818a993f..ee8e3e7cad5 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -950,6 +950,7 @@ static int ide_port_setup_devices(ide_hwif_t *hwif)  static int init_irq (ide_hwif_t *hwif)  {  	struct ide_io_ports *io_ports = &hwif->io_ports; +	irq_handler_t irq_handler;  	int sa = 0;  	mutex_lock(&ide_cfg_mtx); @@ -959,6 +960,10 @@ static int init_irq (ide_hwif_t *hwif)  	hwif->timer.function = &ide_timer_expiry;  	hwif->timer.data = (unsigned long)hwif; +	irq_handler = hwif->host->irq_handler; +	if (irq_handler == NULL) +		irq_handler = ide_intr; +  #if defined(__mc68000__)  	sa = IRQF_SHARED;  #endif /* __mc68000__ */ @@ -969,7 +974,7 @@ static int init_irq (ide_hwif_t *hwif)  	if (io_ports->ctl_addr)  		hwif->tp_ops->set_irq(hwif, 1); -	if (request_irq(hwif->irq, &ide_intr, sa, hwif->name, hwif)) +	if (request_irq(hwif->irq, irq_handler, sa, hwif->name, hwif))  		goto out_up;  	if (!hwif->rqsize) { diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c index 1d8978b3314..a7b9287ee0d 100644 --- a/drivers/ide/ide-proc.c +++ b/drivers/ide/ide-proc.c @@ -231,7 +231,7 @@ static const struct ide_proc_devset ide_generic_settings[] = {  	IDE_PROC_DEVSET(pio_mode, 0, 255),  	IDE_PROC_DEVSET(unmaskirq, 0, 1),  	IDE_PROC_DEVSET(using_dma, 0, 1), -	{ 0 }, +	{ NULL },  };  static void proc_ide_settings_warn(void) diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index bb450a7608c..4e6181c7bbd 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c @@ -2166,7 +2166,7 @@ static const struct ide_proc_devset idetape_settings[] = {  	__IDE_PROC_DEVSET(speed,	0, 0xffff, NULL, NULL),  	__IDE_PROC_DEVSET(tdsc,		IDETAPE_DSC_RW_MIN, IDETAPE_DSC_RW_MAX,  					mulf_tdsc, divf_tdsc), -	{ 0 }, +	{ NULL },  };  #endif diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c index a01b4488208..4a65b96db2c 100644 --- a/drivers/infiniband/hw/nes/nes_cm.c +++ b/drivers/infiniband/hw/nes/nes_cm.c @@ -2490,12 +2490,14 @@ static int nes_disconnect(struct nes_qp *nesqp, int abrupt)  	int ret = 0;  	struct nes_vnic *nesvnic;  	struct nes_device *nesdev; +	struct nes_ib_device *nesibdev;  	nesvnic = to_nesvnic(nesqp->ibqp.device);  	if (!nesvnic)  		return -EINVAL;  	nesdev = nesvnic->nesdev; +	nesibdev = nesvnic->nesibdev;  	nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",  			atomic_read(&nesvnic->netdev->refcnt)); @@ -2507,6 +2509,8 @@ static int nes_disconnect(struct nes_qp *nesqp, int abrupt)  	} else {  		/* Need to free the Last Streaming Mode Message */  		if (nesqp->ietf_frame) { +			if (nesqp->lsmm_mr) +				nesibdev->ibdev.dereg_mr(nesqp->lsmm_mr);  			pci_free_consistent(nesdev->pcidev,  					nesqp->private_data_len+sizeof(struct ietf_mpa_frame),  					nesqp->ietf_frame, nesqp->ietf_frame_pbase); @@ -2543,6 +2547,12 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)  	u32 crc_value;  	int ret;  	int passive_state; +	struct nes_ib_device *nesibdev; +	struct ib_mr *ibmr = NULL; +	struct ib_phys_buf ibphysbuf; +	struct nes_pd *nespd; + +  	ibqp = nes_get_qp(cm_id->device, conn_param->qpn);  	if (!ibqp) @@ -2601,6 +2611,26 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)  	if (cm_id->remote_addr.sin_addr.s_addr !=  			cm_id->local_addr.sin_addr.s_addr) {  		u64temp = (unsigned long)nesqp; +		nesibdev = nesvnic->nesibdev; +		nespd = nesqp->nespd; +		ibphysbuf.addr = nesqp->ietf_frame_pbase; +		ibphysbuf.size = conn_param->private_data_len + +					sizeof(struct ietf_mpa_frame); +		ibmr = nesibdev->ibdev.reg_phys_mr((struct ib_pd *)nespd, +						&ibphysbuf, 1, +						IB_ACCESS_LOCAL_WRITE, +						(u64 *)&nesqp->ietf_frame); +		if (!ibmr) { +			nes_debug(NES_DBG_CM, "Unable to register memory region" +					"for lSMM for cm_node = %p \n", +					cm_node); +			return -ENOMEM; +		} + +		ibmr->pd = &nespd->ibpd; +		ibmr->device = nespd->ibpd.device; +		nesqp->lsmm_mr = ibmr; +  		u64temp |= NES_SW_CONTEXT_ALIGN>>1;  		set_wqe_64bit_value(wqe->wqe_words,  			NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX, @@ -2611,14 +2641,13 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)  		wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =  			cpu_to_le32(conn_param->private_data_len +  			sizeof(struct ietf_mpa_frame)); -		wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] = -			cpu_to_le32((u32)nesqp->ietf_frame_pbase); -		wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] = -			cpu_to_le32((u32)((u64)nesqp->ietf_frame_pbase >> 32)); +		set_wqe_64bit_value(wqe->wqe_words, +					NES_IWARP_SQ_WQE_FRAG0_LOW_IDX, +					(u64)nesqp->ietf_frame);  		wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =  			cpu_to_le32(conn_param->private_data_len +  			sizeof(struct ietf_mpa_frame)); -		wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0; +		wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = ibmr->lkey;  		nesqp->nesqp_context->ird_ord_sizes |=  			cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT | diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c index 4fdb72454f9..d93a6562817 100644 --- a/drivers/infiniband/hw/nes/nes_verbs.c +++ b/drivers/infiniband/hw/nes/nes_verbs.c @@ -1360,8 +1360,10 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,  					NES_QPCONTEXT_MISC_RQ_SIZE_SHIFT);  			nesqp->nesqp_context->misc |= cpu_to_le32((u32)nesqp->hwqp.sq_encoded_size <<  					NES_QPCONTEXT_MISC_SQ_SIZE_SHIFT); +			if (!udata) {  				nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_PRIV_EN);  				nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_FAST_REGISTER_EN); +			}  			nesqp->nesqp_context->cqs = cpu_to_le32(nesqp->nesscq->hw_cq.cq_number +  					((u32)nesqp->nesrcq->hw_cq.cq_number << 16));  			u64temp = (u64)nesqp->hwqp.sq_pbase; diff --git a/drivers/infiniband/hw/nes/nes_verbs.h b/drivers/infiniband/hw/nes/nes_verbs.h index 6c6b4da5184..ae0ca9bc83b 100644 --- a/drivers/infiniband/hw/nes/nes_verbs.h +++ b/drivers/infiniband/hw/nes/nes_verbs.h @@ -134,6 +134,7 @@ struct nes_qp {  	struct ietf_mpa_frame *ietf_frame;  	dma_addr_t            ietf_frame_pbase;  	wait_queue_head_t     state_waitq; +	struct ib_mr          *lsmm_mr;  	unsigned long         socket;  	struct nes_hw_qp      hwqp;  	struct work_struct    work; diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c index 18dd8aacbe8..831ddce1467 100644 --- a/drivers/isdn/gigaset/bas-gigaset.c +++ b/drivers/isdn/gigaset/bas-gigaset.c @@ -46,6 +46,9 @@ MODULE_PARM_DESC(cidmode, "Call-ID mode");  /* length limit according to Siemens 3070usb-protokoll.doc ch. 2.1 */  #define IF_WRITEBUF 264 +/* interrupt pipe message size according to ibid. ch. 2.2 */ +#define IP_MSGSIZE 3 +  /* Values for the Gigaset 307x */  #define USB_GIGA_VENDOR_ID      0x0681  #define USB_3070_PRODUCT_ID     0x0001 @@ -110,7 +113,7 @@ struct bas_cardstate {  	unsigned char		*rcvbuf;	/* AT reply receive buffer */  	struct urb		*urb_int_in;	/* URB for interrupt pipe */ -	unsigned char		int_in_buf[3]; +	unsigned char		*int_in_buf;  	spinlock_t		lock;		/* locks all following */  	int			basstate;	/* bitmap (BS_*) */ @@ -657,7 +660,7 @@ static void read_int_callback(struct urb *urb)  	}  	/* drop incomplete packets even if the missing bytes wouldn't matter */ -	if (unlikely(urb->actual_length < 3)) { +	if (unlikely(urb->actual_length < IP_MSGSIZE)) {  		dev_warn(cs->dev, "incomplete interrupt packet (%d bytes)\n",  			 urb->actual_length);  		goto resubmit; @@ -2127,6 +2130,7 @@ static void gigaset_reinitbcshw(struct bc_state *bcs)  static void gigaset_freecshw(struct cardstate *cs)  {  	/* timers, URBs and rcvbuf are disposed of in disconnect */ +	kfree(cs->hw.bas->int_in_buf);  	kfree(cs->hw.bas);  	cs->hw.bas = NULL;  } @@ -2140,6 +2144,12 @@ static int gigaset_initcshw(struct cardstate *cs)  		pr_err("out of memory\n");  		return 0;  	} +	ucs->int_in_buf = kmalloc(IP_MSGSIZE, GFP_KERNEL); +	if (!ucs->int_in_buf) { +		kfree(ucs); +		pr_err("out of memory\n"); +		return 0; +	}  	ucs->urb_cmd_in = NULL;  	ucs->urb_cmd_out = NULL; @@ -2292,7 +2302,7 @@ static int gigaset_probe(struct usb_interface *interface,  	usb_fill_int_urb(ucs->urb_int_in, udev,  			 usb_rcvintpipe(udev,  					(endpoint->bEndpointAddress) & 0x0f), -			 ucs->int_in_buf, 3, read_int_callback, cs, +			 ucs->int_in_buf, IP_MSGSIZE, read_int_callback, cs,  			 endpoint->bInterval);  	if ((rc = usb_submit_urb(ucs->urb_int_in, GFP_KERNEL)) != 0) {  		dev_err(cs->dev, "could not submit interrupt URB: %s\n", diff --git a/drivers/lguest/lguest_device.c b/drivers/lguest/lguest_device.c index b4d44e571d7..8132533d71f 100644 --- a/drivers/lguest/lguest_device.c +++ b/drivers/lguest/lguest_device.c @@ -212,6 +212,9 @@ static void lg_notify(struct virtqueue *vq)  	hcall(LHCALL_NOTIFY, lvq->config.pfn << PAGE_SHIFT, 0, 0);  } +/* An extern declaration inside a C file is bad form.  Don't do it. */ +extern void lguest_setup_irq(unsigned int irq); +  /* This routine finds the first virtqueue described in the configuration of   * this device and sets it up.   * @@ -266,6 +269,9 @@ static struct virtqueue *lg_find_vq(struct virtio_device *vdev,  		goto unmap;  	} +	/* Make sure the interrupt is allocated. */ +	lguest_setup_irq(lvq->config.irq); +  	/* Tell the interrupt for this virtqueue to go to the virtio_ring  	 * interrupt handler. */  	/* FIXME: We used to have a flag for the Host to tell us we could use diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 35bda49796f..bfefd079a95 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -60,6 +60,7 @@ struct dm_crypt_io {  };  struct dm_crypt_request { +	struct convert_context *ctx;  	struct scatterlist sg_in;  	struct scatterlist sg_out;  }; @@ -335,6 +336,18 @@ static void crypt_convert_init(struct crypt_config *cc,  	init_completion(&ctx->restart);  } +static struct dm_crypt_request *dmreq_of_req(struct crypt_config *cc, +					     struct ablkcipher_request *req) +{ +	return (struct dm_crypt_request *)((char *)req + cc->dmreq_start); +} + +static struct ablkcipher_request *req_of_dmreq(struct crypt_config *cc, +					       struct dm_crypt_request *dmreq) +{ +	return (struct ablkcipher_request *)((char *)dmreq - cc->dmreq_start); +} +  static int crypt_convert_block(struct crypt_config *cc,  			       struct convert_context *ctx,  			       struct ablkcipher_request *req) @@ -345,10 +358,11 @@ static int crypt_convert_block(struct crypt_config *cc,  	u8 *iv;  	int r = 0; -	dmreq = (struct dm_crypt_request *)((char *)req + cc->dmreq_start); +	dmreq = dmreq_of_req(cc, req);  	iv = (u8 *)ALIGN((unsigned long)(dmreq + 1),  			 crypto_ablkcipher_alignmask(cc->tfm) + 1); +	dmreq->ctx = ctx;  	sg_init_table(&dmreq->sg_in, 1);  	sg_set_page(&dmreq->sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT,  		    bv_in->bv_offset + ctx->offset_in); @@ -395,8 +409,9 @@ static void crypt_alloc_req(struct crypt_config *cc,  		cc->req = mempool_alloc(cc->req_pool, GFP_NOIO);  	ablkcipher_request_set_tfm(cc->req, cc->tfm);  	ablkcipher_request_set_callback(cc->req, CRYPTO_TFM_REQ_MAY_BACKLOG | -					     CRYPTO_TFM_REQ_MAY_SLEEP, -					     kcryptd_async_done, ctx); +					CRYPTO_TFM_REQ_MAY_SLEEP, +					kcryptd_async_done, +					dmreq_of_req(cc, cc->req));  }  /* @@ -553,19 +568,22 @@ static void crypt_inc_pending(struct dm_crypt_io *io)  static void crypt_dec_pending(struct dm_crypt_io *io)  {  	struct crypt_config *cc = io->target->private; +	struct bio *base_bio = io->base_bio; +	struct dm_crypt_io *base_io = io->base_io; +	int error = io->error;  	if (!atomic_dec_and_test(&io->pending))  		return; -	if (likely(!io->base_io)) -		bio_endio(io->base_bio, io->error); +	mempool_free(io, cc->io_pool); + +	if (likely(!base_io)) +		bio_endio(base_bio, error);  	else { -		if (io->error && !io->base_io->error) -			io->base_io->error = io->error; -		crypt_dec_pending(io->base_io); +		if (error && !base_io->error) +			base_io->error = error; +		crypt_dec_pending(base_io);  	} - -	mempool_free(io, cc->io_pool);  }  /* @@ -821,7 +839,8 @@ static void kcryptd_crypt_read_convert(struct dm_crypt_io *io)  static void kcryptd_async_done(struct crypto_async_request *async_req,  			       int error)  { -	struct convert_context *ctx = async_req->data; +	struct dm_crypt_request *dmreq = async_req->data; +	struct convert_context *ctx = dmreq->ctx;  	struct dm_crypt_io *io = container_of(ctx, struct dm_crypt_io, ctx);  	struct crypt_config *cc = io->target->private; @@ -830,7 +849,7 @@ static void kcryptd_async_done(struct crypto_async_request *async_req,  		return;  	} -	mempool_free(ablkcipher_request_cast(async_req), cc->req_pool); +	mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool);  	if (!atomic_dec_and_test(&ctx->pending))  		return; diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index f14813be4ef..36e2b5e46a6 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -292,6 +292,8 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,  					     (PAGE_SIZE >> SECTOR_SHIFT));  		num_bvecs = 1 + min_t(int, bio_get_nr_vecs(where->bdev),  				      num_bvecs); +		if (unlikely(num_bvecs > BIO_MAX_PAGES)) +			num_bvecs = BIO_MAX_PAGES;  		bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios);  		bio->bi_sector = where->sector + (where->count - remaining);  		bio->bi_bdev = where->bdev; diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 54d0588fc1f..f01096549a9 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c @@ -704,7 +704,8 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size)  	char *new_name = (char *) param + param->data_start;  	if (new_name < param->data || -	    invalid_str(new_name, (void *) param + param_size)) { +	    invalid_str(new_name, (void *) param + param_size) || +	    strlen(new_name) > DM_NAME_LEN - 1) {  		DMWARN("Invalid new logical volume name supplied.");  		return -EINVAL;  	} @@ -1063,7 +1064,7 @@ static int table_load(struct dm_ioctl *param, size_t param_size)  	r = populate_table(t, param, param_size);  	if (r) { -		dm_table_put(t); +		dm_table_destroy(t);  		goto out;  	} @@ -1071,7 +1072,7 @@ static int table_load(struct dm_ioctl *param, size_t param_size)  	hc = dm_get_mdptr(md);  	if (!hc || hc->md != md) {  		DMWARN("device has been removed from the dev hash table."); -		dm_table_put(t); +		dm_table_destroy(t);  		up_write(&_hash_lock);  		r = -ENXIO;  		goto out; diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 51ba1db4b3e..8d40f27cce8 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -525,9 +525,12 @@ static int __noflush_suspending(struct mapped_device *md)  static void dec_pending(struct dm_io *io, int error)  {  	unsigned long flags; +	int io_error; +	struct bio *bio; +	struct mapped_device *md = io->md;  	/* Push-back supersedes any I/O errors */ -	if (error && !(io->error > 0 && __noflush_suspending(io->md))) +	if (error && !(io->error > 0 && __noflush_suspending(md)))  		io->error = error;  	if (atomic_dec_and_test(&io->io_count)) { @@ -537,24 +540,27 @@ static void dec_pending(struct dm_io *io, int error)  			 * This must be handled before the sleeper on  			 * suspend queue merges the pushback list.  			 */ -			spin_lock_irqsave(&io->md->pushback_lock, flags); -			if (__noflush_suspending(io->md)) -				bio_list_add(&io->md->pushback, io->bio); +			spin_lock_irqsave(&md->pushback_lock, flags); +			if (__noflush_suspending(md)) +				bio_list_add(&md->pushback, io->bio);  			else  				/* noflush suspend was interrupted. */  				io->error = -EIO; -			spin_unlock_irqrestore(&io->md->pushback_lock, flags); +			spin_unlock_irqrestore(&md->pushback_lock, flags);  		}  		end_io_acct(io); -		if (io->error != DM_ENDIO_REQUEUE) { -			trace_block_bio_complete(io->md->queue, io->bio); +		io_error = io->error; +		bio = io->bio; -			bio_endio(io->bio, io->error); -		} +		free_io(md, io); + +		if (io_error != DM_ENDIO_REQUEUE) { +			trace_block_bio_complete(md->queue, bio); -		free_io(io->md, io); +			bio_endio(bio, io_error); +		}  	}  } @@ -562,6 +568,7 @@ static void clone_endio(struct bio *bio, int error)  {  	int r = 0;  	struct dm_target_io *tio = bio->bi_private; +	struct dm_io *io = tio->io;  	struct mapped_device *md = tio->io->md;  	dm_endio_fn endio = tio->ti->type->end_io; @@ -585,15 +592,14 @@ static void clone_endio(struct bio *bio, int error)  		}  	} -	dec_pending(tio->io, error); -  	/*  	 * Store md for cleanup instead of tio which is about to get freed.  	 */  	bio->bi_private = md->bs; -	bio_put(bio);  	free_tio(md, tio); +	bio_put(bio); +	dec_pending(io, error);  }  static sector_t max_io_len(struct mapped_device *md, diff --git a/drivers/md/md.c b/drivers/md/md.c index 03b4cd0a634..a307f87eb90 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -214,12 +214,7 @@ static inline mddev_t *mddev_get(mddev_t *mddev)  	return mddev;  } -static void mddev_delayed_delete(struct work_struct *ws) -{ -	mddev_t *mddev = container_of(ws, mddev_t, del_work); -	kobject_del(&mddev->kobj); -	kobject_put(&mddev->kobj); -} +static void mddev_delayed_delete(struct work_struct *ws);  static void mddev_put(mddev_t *mddev)  { @@ -3542,6 +3537,21 @@ static struct kobj_type md_ktype = {  int mdp_major = 0; +static void mddev_delayed_delete(struct work_struct *ws) +{ +	mddev_t *mddev = container_of(ws, mddev_t, del_work); + +	if (mddev->private == &md_redundancy_group) { +		sysfs_remove_group(&mddev->kobj, &md_redundancy_group); +		if (mddev->sysfs_action) +			sysfs_put(mddev->sysfs_action); +		mddev->sysfs_action = NULL; +		mddev->private = NULL; +	} +	kobject_del(&mddev->kobj); +	kobject_put(&mddev->kobj); +} +  static int md_alloc(dev_t dev, char *name)  {  	static DEFINE_MUTEX(disks_mutex); @@ -4033,13 +4043,9 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)  			mddev->queue->merge_bvec_fn = NULL;  			mddev->queue->unplug_fn = NULL;  			mddev->queue->backing_dev_info.congested_fn = NULL; -			if (mddev->pers->sync_request) { -				sysfs_remove_group(&mddev->kobj, &md_redundancy_group); -				if (mddev->sysfs_action) -					sysfs_put(mddev->sysfs_action); -				mddev->sysfs_action = NULL; -			}  			module_put(mddev->pers->owner); +			if (mddev->pers->sync_request) +				mddev->private = &md_redundancy_group;  			mddev->pers = NULL;  			/* tell userspace to handle 'inactive' */  			sysfs_notify_dirent(mddev->sysfs_state); diff --git a/drivers/media/dvb/bt8xx/dst.c b/drivers/media/dvb/bt8xx/dst.c index 29e8f1546ab..fec1d77fa85 100644 --- a/drivers/media/dvb/bt8xx/dst.c +++ b/drivers/media/dvb/bt8xx/dst.c @@ -1683,7 +1683,7 @@ static int dst_tune_frontend(struct dvb_frontend* fe,  static int dst_get_tuning_algo(struct dvb_frontend *fe)  { -	return dst_algo; +	return dst_algo ? DVBFE_ALGO_HW : DVBFE_ALGO_SW;  }  static int dst_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 84340778508..8dcb3fbf7ac 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -1290,9 +1290,6 @@ static int dtv_property_process_set(struct dvb_frontend *fe,  		dprintk("%s() Finalised property cache\n", __func__);  		dtv_property_cache_submit(fe); -		/* Request the search algorithm to search */ -		fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN; -  		r |= dvb_frontend_ioctl_legacy(inode, file, FE_SET_FRONTEND,  			&fepriv->parameters);  		break; @@ -1717,6 +1714,10 @@ static int dvb_frontend_ioctl_legacy(struct inode *inode, struct file *file,  			fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;  		fepriv->state = FESTATE_RETUNE; + +		/* Request the search algorithm to search */ +		fepriv->algo_status |= DVBFE_ALGO_SEARCH_AGAIN; +  		dvb_frontend_wakeup(fe);  		dvb_frontend_add_event(fe, 0);  		fepriv->status = 0; diff --git a/drivers/media/dvb/frontends/stb0899_algo.c b/drivers/media/dvb/frontends/stb0899_algo.c index a67d1775a43..2da55ec2039 100644 --- a/drivers/media/dvb/frontends/stb0899_algo.c +++ b/drivers/media/dvb/frontends/stb0899_algo.c @@ -156,7 +156,7 @@ static void stb0899_first_subrange(struct stb0899_state *state)  	}  	if (range > 0) -		internal->sub_range = MIN(internal->srch_range, range); +		internal->sub_range = min(internal->srch_range, range);  	else  		internal->sub_range = 0; @@ -185,7 +185,7 @@ static enum stb0899_status stb0899_check_tmg(struct stb0899_state *state)  	timing = stb0899_read_reg(state, STB0899_RTF);  	if (lock >= 42) { -		if ((lock > 48) && (ABS(timing) >= 110)) { +		if ((lock > 48) && (abs(timing) >= 110)) {  			internal->status = ANALOGCARRIER;  			dprintk(state->verbose, FE_DEBUG, 1, "-->ANALOG Carrier !");  		} else { @@ -222,7 +222,7 @@ static enum stb0899_status stb0899_search_tmg(struct stb0899_state *state)  		index++;  		derot_freq += index * internal->direction * derot_step;	/* next derot zig zag position	*/ -		if (ABS(derot_freq) > derot_limit) +		if (abs(derot_freq) > derot_limit)  			next_loop--;  		if (next_loop) { @@ -298,7 +298,7 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state)  			last_derot_freq = derot_freq;  			derot_freq += index * internal->direction * internal->derot_step; /* next zig zag derotator position */ -			if(ABS(derot_freq) > derot_limit) +			if(abs(derot_freq) > derot_limit)  				next_loop--;  			if (next_loop) { @@ -400,7 +400,7 @@ static enum stb0899_status stb0899_search_data(struct stb0899_state *state)  		if ((internal->status != CARRIEROK) || (stb0899_check_data(state) != DATAOK)) {  			derot_freq += index * internal->direction * derot_step;	/* next zig zag derotator position */ -			if (ABS(derot_freq) > derot_limit) +			if (abs(derot_freq) > derot_limit)  				next_loop--;  			if (next_loop) { @@ -467,7 +467,7 @@ static void next_sub_range(struct stb0899_state *state)  	if (internal->sub_dir > 0) {  		old_sub_range = internal->sub_range; -		internal->sub_range = MIN((internal->srch_range / 2) - +		internal->sub_range = min((internal->srch_range / 2) -  					  (internal->tuner_offst + internal->sub_range / 2),  					   internal->sub_range); @@ -771,7 +771,7 @@ static long Log2Int(int number)  	int i;  	i = 0; -	while ((1 << i) <= ABS(number)) +	while ((1 << i) <= abs(number))  		i++;  	if (number == 0) diff --git a/drivers/media/dvb/frontends/stb0899_drv.c b/drivers/media/dvb/frontends/stb0899_drv.c index 10613acf18f..a04c782fff8 100644 --- a/drivers/media/dvb/frontends/stb0899_drv.c +++ b/drivers/media/dvb/frontends/stb0899_drv.c @@ -794,7 +794,7 @@ static int stb0899_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t  	reg = stb0899_read_reg(state, STB0899_DISCNTRL1);  	old_state = reg;  	/* set to burst mode	*/ -	STB0899_SETFIELD_VAL(DISEQCMODE, reg, 0x02); +	STB0899_SETFIELD_VAL(DISEQCMODE, reg, 0x03);  	STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0x01);  	stb0899_write_reg(state, STB0899_DISCNTRL1, reg);  	switch (burst) { diff --git a/drivers/media/dvb/frontends/stb0899_priv.h b/drivers/media/dvb/frontends/stb0899_priv.h index 24619e3689d..82395b91281 100644 --- a/drivers/media/dvb/frontends/stb0899_priv.h +++ b/drivers/media/dvb/frontends/stb0899_priv.h @@ -59,10 +59,6 @@  #define MAKEWORD32(a, b, c, d)			(((a) << 24) | ((b) << 16) | ((c) << 8) | (d))  #define MAKEWORD16(a, b)			(((a) << 8) | (b)) -#define MIN(x, y)				((x) <= (y) ? (x) : (y)) -#define MAX(x, y)				((x) >= (y) ? (x) : (y)) -#define ABS(x)					((x) >= 0 ? (x) : -(x)) -  #define LSB(x)					((x & 0xff))  #define MSB(y)					((y >> 8) & 0xff) @@ -168,10 +164,10 @@ struct stb0899_internal {  	u32			freq;			/* Demod internal Frequency		*/  	u32			srate;			/* Demod internal Symbol rate		*/  	enum stb0899_fec	fecrate;		/* Demod internal FEC rate		*/ -	u32			srch_range;		/* Demod internal Search Range		*/ -	u32			sub_range;		/* Demod current sub range (Hz)		*/ -	u32			tuner_step;		/* Tuner step (Hz)			*/ -	u32			tuner_offst;		/* Relative offset to carrier (Hz)	*/ +	s32			srch_range;		/* Demod internal Search Range		*/ +	s32			sub_range;		/* Demod current sub range (Hz)		*/ +	s32			tuner_step;		/* Tuner step (Hz)			*/ +	s32			tuner_offst;		/* Relative offset to carrier (Hz)	*/  	u32			tuner_bw;		/* Current bandwidth of the tuner (Hz)	*/  	s32			mclk;			/* Masterclock Divider factor (binary)	*/ diff --git a/drivers/media/dvb/frontends/stb6100.c b/drivers/media/dvb/frontends/stb6100.c index ff39275ab49..1ed5a7db4c5 100644 --- a/drivers/media/dvb/frontends/stb6100.c +++ b/drivers/media/dvb/frontends/stb6100.c @@ -427,11 +427,11 @@ static int stb6100_init(struct dvb_frontend *fe)  	status->refclock	= 27000000;	/* Hz	*/  	status->iqsense		= 1;  	status->bandwidth	= 36000;	/* kHz	*/ -	state->bandwidth	= status->bandwidth * 1000;	/* MHz	*/ +	state->bandwidth	= status->bandwidth * 1000;	/* Hz	*/  	state->reference	= status->refclock / 1000;	/* kHz	*/  	/* Set default bandwidth.	*/ -	return stb6100_set_bandwidth(fe, status->bandwidth); +	return stb6100_set_bandwidth(fe, state->bandwidth);  }  static int stb6100_get_state(struct dvb_frontend *fe, diff --git a/drivers/media/dvb/frontends/zl10353.c b/drivers/media/dvb/frontends/zl10353.c index 170720b0281..b150ed30669 100644 --- a/drivers/media/dvb/frontends/zl10353.c +++ b/drivers/media/dvb/frontends/zl10353.c @@ -590,7 +590,7 @@ static int zl10353_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)  	struct zl10353_state *state = fe->demodulator_priv;  	u8 val = 0x0a; -	if (state->config.no_tuner) { +	if (state->config.disable_i2c_gate_ctrl) {  		/* No tuner attached to the internal I2C bus */  		/* If set enable I2C bridge, the main I2C bus stopped hardly */  		return 0; diff --git a/drivers/media/dvb/frontends/zl10353.h b/drivers/media/dvb/frontends/zl10353.h index fdbb88ff75f..2287bac4624 100644 --- a/drivers/media/dvb/frontends/zl10353.h +++ b/drivers/media/dvb/frontends/zl10353.h @@ -38,6 +38,9 @@ struct zl10353_config  	/* set if parallel ts output is required */  	int parallel_ts; + +	/* set if i2c_gate_ctrl disable is required */ +	u8 disable_i2c_gate_ctrl:1;  };  #if defined(CONFIG_DVB_ZL10353) || (defined(CONFIG_DVB_ZL10353_MODULE) && defined(MODULE)) diff --git a/drivers/media/video/cx88/cx88-alsa.c b/drivers/media/video/cx88/cx88-alsa.c index 66c755c116d..ce98d955231 100644 --- a/drivers/media/video/cx88/cx88-alsa.c +++ b/drivers/media/video/cx88/cx88-alsa.c @@ -803,9 +803,10 @@ static int __devinit cx88_audio_initdev(struct pci_dev *pci,  		return (-ENOENT);  	} -	card = snd_card_new(index[devno], id[devno], THIS_MODULE, sizeof(snd_cx88_card_t)); -	if (!card) -		return (-ENOMEM); +	err = snd_card_create(index[devno], id[devno], THIS_MODULE, +			      sizeof(snd_cx88_card_t), &card); +	if (err < 0) +		return err;  	card->private_free = snd_cx88_dev_free; diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c index 2ac738fa6a0..f132e31f6ed 100644 --- a/drivers/media/video/em28xx/em28xx-audio.c +++ b/drivers/media/video/em28xx/em28xx-audio.c @@ -448,9 +448,10 @@ static int em28xx_audio_init(struct em28xx *dev)  	printk(KERN_INFO "em28xx-audio.c: Copyright (C) 2006 Markus "  			 "Rechberger\n"); -	card = snd_card_new(index[devnr], "Em28xx Audio", THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[devnr], "Em28xx Audio", THIS_MODULE, 0, +			      &card); +	if (err < 0) +		return err;  	spin_lock_init(&adev->slock);  	err = snd_pcm_new(card, "Em28xx Audio", 0, 0, 1, &pcm); diff --git a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c index e564a61a72d..48892b5715d 100644 --- a/drivers/media/video/gspca/m5602/m5602_s5k4aa.c +++ b/drivers/media/video/gspca/m5602/m5602_s5k4aa.c @@ -102,7 +102,11 @@ int s5k4aa_probe(struct sd *sd)  	}  	/* Test some registers, but we don't know their exact meaning yet */ -	if (m5602_read_sensor(sd, 0x00, prod_id, sizeof(prod_id))) +	if (m5602_read_sensor(sd, 0x00, prod_id, 2)) +		return -ENODEV; +	if (m5602_read_sensor(sd, 0x02, prod_id+2, 2)) +		return -ENODEV; +	if (m5602_read_sensor(sd, 0x04, prod_id+4, 2))  		return -ENODEV;  	if (memcmp(prod_id, expected_prod_id, sizeof(prod_id))) diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c index c750d3dd57d..8b0b64a8987 100644 --- a/drivers/media/video/saa7134/saa7134-alsa.c +++ b/drivers/media/video/saa7134/saa7134-alsa.c @@ -990,10 +990,10 @@ static int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum)  	if (!enable[devnum])  		return -ENODEV; -	card = snd_card_new(index[devnum], id[devnum], THIS_MODULE, sizeof(snd_card_saa7134_t)); - -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[devnum], id[devnum], THIS_MODULE, +			      sizeof(snd_card_saa7134_t), &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "SAA7134"); diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index 0776ecf56d2..b5370b3e1a3 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c @@ -860,6 +860,7 @@ static struct zl10353_config behold_h6_config = {  	.demod_address = 0x1e>>1,  	.no_tuner      = 1,  	.parallel_ts   = 1, +	.disable_i2c_gate_ctrl = 1,  };  /* ================================================================== diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c index 5aeccb301ce..076ed5bf48b 100644 --- a/drivers/media/video/tvaudio.c +++ b/drivers/media/video/tvaudio.c @@ -54,7 +54,7 @@ MODULE_LICENSE("GPL");  /* ---------------------------------------------------------------------- */  /* our structs                                                            */ -#define MAXREGS 64 +#define MAXREGS 256  struct CHIPSTATE;  typedef int  (*getvalue)(int); diff --git a/drivers/media/video/zoran/Kconfig b/drivers/media/video/zoran/Kconfig index 4ea5fa71de8..8666e19f31a 100644 --- a/drivers/media/video/zoran/Kconfig +++ b/drivers/media/video/zoran/Kconfig @@ -68,6 +68,7 @@ config VIDEO_ZORAN_AVS6EYES  	tristate "AverMedia 6 Eyes support (EXPERIMENTAL)"  	depends on VIDEO_ZORAN_ZR36060 && EXPERIMENTAL && VIDEO_V4L1  	select VIDEO_BT856 if VIDEO_HELPER_CHIPS_AUTO +	select VIDEO_BT866 if VIDEO_HELPER_CHIPS_AUTO  	select VIDEO_KS0127 if VIDEO_HELPER_CHIPS_AUTO  	help  	  Support for the AverMedia 6 Eyes video surveillance card. diff --git a/drivers/mfd/wm8350-core.c b/drivers/mfd/wm8350-core.c index 84d5ea1ec17..b457a05b28d 100644 --- a/drivers/mfd/wm8350-core.c +++ b/drivers/mfd/wm8350-core.c @@ -1383,6 +1383,11 @@ int wm8350_device_init(struct wm8350 *wm8350, int irq,  			wm8350->power.rev_g_coeff = 1;  			break; +		case 1: +			dev_info(wm8350->dev, "WM8351 Rev B\n"); +			wm8350->power.rev_g_coeff = 1; +			break; +  		default:  			dev_err(wm8350->dev, "Unknown WM8351 CHIP_REV\n");  			ret = -ENODEV; diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c index 9c50e6f1c23..34ce2703d29 100644 --- a/drivers/mmc/core/mmc_ops.c +++ b/drivers/mmc/core/mmc_ops.c @@ -248,12 +248,15 @@ mmc_send_cxd_data(struct mmc_card *card, struct mmc_host *host,  	sg_init_one(&sg, data_buf, len); -	/* -	 * The spec states that CSR and CID accesses have a timeout -	 * of 64 clock cycles. -	 */ -	data.timeout_ns = 0; -	data.timeout_clks = 64; +	if (opcode == MMC_SEND_CSD || opcode == MMC_SEND_CID) { +		/* +		 * The spec states that CSR and CID accesses have a timeout +		 * of 64 clock cycles. +		 */ +		data.timeout_ns = 0; +		data.timeout_clks = 64; +	} else +		mmc_set_data_timeout(&data, card);  	mmc_wait_for_req(host, &mrq); diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c index f4a67c65d30..2db166b7096 100644 --- a/drivers/mmc/host/s3cmci.c +++ b/drivers/mmc/host/s3cmci.c @@ -793,8 +793,7 @@ static void s3cmci_dma_setup(struct s3cmci_host *host,  			      host->mem->start + host->sdidata);  	if (!setup_ok) { -		s3c2410_dma_config(host->dma, 4, -			(S3C2410_DCON_HWTRIG | S3C2410_DCON_CH0_SDI)); +		s3c2410_dma_config(host->dma, 4, 0);  		s3c2410_dma_set_buffdone_fn(host->dma,  					    s3cmci_dma_done_callback);  		s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART); diff --git a/drivers/mtd/devices/Kconfig b/drivers/mtd/devices/Kconfig index bc33200535f..6fde0a2e356 100644 --- a/drivers/mtd/devices/Kconfig +++ b/drivers/mtd/devices/Kconfig @@ -120,13 +120,6 @@ config MTD_PHRAM  	  doesn't have access to, memory beyond the mem=xxx limit, nvram,  	  memory on the video card, etc... -config MTD_PS3VRAM -	tristate "PS3 video RAM" -	depends on FB_PS3 -	help -	  This driver allows you to use excess PS3 video RAM as volatile -	  storage or system swap. -  config MTD_LART  	tristate "28F160xx flash driver for LART"  	depends on SA1100_LART diff --git a/drivers/mtd/devices/Makefile b/drivers/mtd/devices/Makefile index e51521df4e4..0993d5cf392 100644 --- a/drivers/mtd/devices/Makefile +++ b/drivers/mtd/devices/Makefile @@ -16,4 +16,3 @@ obj-$(CONFIG_MTD_LART)		+= lart.o  obj-$(CONFIG_MTD_BLOCK2MTD)	+= block2mtd.o  obj-$(CONFIG_MTD_DATAFLASH)	+= mtd_dataflash.o  obj-$(CONFIG_MTD_M25P80)	+= m25p80.o -obj-$(CONFIG_MTD_PS3VRAM)	+= ps3vram.o diff --git a/drivers/mtd/devices/mtd_dataflash.c b/drivers/mtd/devices/mtd_dataflash.c index d44f741ae22..6d9f810565c 100644 --- a/drivers/mtd/devices/mtd_dataflash.c +++ b/drivers/mtd/devices/mtd_dataflash.c @@ -821,7 +821,8 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi)  					if (!(info->flags & IS_POW2PS))  						return info;  				} -			} +			} else +				return info;  		}  	} diff --git a/drivers/mtd/devices/ps3vram.c b/drivers/mtd/devices/ps3vram.c deleted file mode 100644 index d21e9beb7ed..00000000000 --- a/drivers/mtd/devices/ps3vram.c +++ /dev/null @@ -1,768 +0,0 @@ -/** - * ps3vram - Use extra PS3 video ram as MTD block device. - * - * Copyright (c) 2007-2008 Jim Paris <jim@jtan.com> - * Added support RSX DMA Vivien Chappelier <vivien.chappelier@free.fr> - */ - -#include <linux/io.h> -#include <linux/mm.h> -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/list.h> -#include <linux/module.h> -#include <linux/moduleparam.h> -#include <linux/slab.h> -#include <linux/version.h> -#include <linux/gfp.h> -#include <linux/delay.h> -#include <linux/mtd/mtd.h> - -#include <asm/lv1call.h> -#include <asm/ps3.h> - -#define DEVICE_NAME		"ps3vram" - -#define XDR_BUF_SIZE (2 * 1024 * 1024) /* XDR buffer (must be 1MiB aligned) */ -#define XDR_IOIF 0x0c000000 - -#define FIFO_BASE XDR_IOIF -#define FIFO_SIZE (64 * 1024) - -#define DMA_PAGE_SIZE (4 * 1024) - -#define CACHE_PAGE_SIZE (256 * 1024) -#define CACHE_PAGE_COUNT ((XDR_BUF_SIZE - FIFO_SIZE) / CACHE_PAGE_SIZE) - -#define CACHE_OFFSET CACHE_PAGE_SIZE -#define FIFO_OFFSET 0 - -#define CTRL_PUT 0x10 -#define CTRL_GET 0x11 -#define CTRL_TOP 0x15 - -#define UPLOAD_SUBCH	1 -#define DOWNLOAD_SUBCH	2 - -#define NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN	0x0000030c -#define NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY	0x00000104 - -#define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT 0x601 - -struct mtd_info ps3vram_mtd; - -#define CACHE_PAGE_PRESENT 1 -#define CACHE_PAGE_DIRTY   2 - -struct ps3vram_tag { -	unsigned int address; -	unsigned int flags; -}; - -struct ps3vram_cache { -	unsigned int page_count; -	unsigned int page_size; -	struct ps3vram_tag *tags; -}; - -struct ps3vram_priv { -	u64 memory_handle; -	u64 context_handle; -	u32 *ctrl; -	u32 *reports; -	u8 __iomem *ddr_base; -	u8 *xdr_buf; - -	u32 *fifo_base; -	u32 *fifo_ptr; - -	struct device *dev; -	struct ps3vram_cache cache; - -	/* Used to serialize cache/DMA operations */ -	struct mutex lock; -}; - -#define DMA_NOTIFIER_HANDLE_BASE 0x66604200 /* first DMA notifier handle */ -#define DMA_NOTIFIER_OFFSET_BASE 0x1000     /* first DMA notifier offset */ -#define DMA_NOTIFIER_SIZE        0x40 -#define NOTIFIER 7	/* notifier used for completion report */ - -/* A trailing '-' means to subtract off ps3fb_videomemory.size */ -char *size = "256M-"; -module_param(size, charp, 0); -MODULE_PARM_DESC(size, "memory size"); - -static u32 *ps3vram_get_notifier(u32 *reports, int notifier) -{ -	return (void *) reports + -		DMA_NOTIFIER_OFFSET_BASE + -		DMA_NOTIFIER_SIZE * notifier; -} - -static void ps3vram_notifier_reset(struct mtd_info *mtd) -{ -	int i; - -	struct ps3vram_priv *priv = mtd->priv; -	u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER); -	for (i = 0; i < 4; i++) -		notify[i] = 0xffffffff; -} - -static int ps3vram_notifier_wait(struct mtd_info *mtd, unsigned int timeout_ms) -{ -	struct ps3vram_priv *priv = mtd->priv; -	u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER); -	unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms); - -	do { -		if (!notify[3]) -			return 0; -		msleep(1); -	} while (time_before(jiffies, timeout)); - -	return -ETIMEDOUT; -} - -static void ps3vram_init_ring(struct mtd_info *mtd) -{ -	struct ps3vram_priv *priv = mtd->priv; - -	priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET; -	priv->ctrl[CTRL_GET] = FIFO_BASE + FIFO_OFFSET; -} - -static int ps3vram_wait_ring(struct mtd_info *mtd, unsigned int timeout_ms) -{ -	struct ps3vram_priv *priv = mtd->priv; -	unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms); - -	do { -		if (priv->ctrl[CTRL_PUT] == priv->ctrl[CTRL_GET]) -			return 0; -		msleep(1); -	} while (time_before(jiffies, timeout)); - -	dev_dbg(priv->dev, "%s:%d: FIFO timeout (%08x/%08x/%08x)\n", __func__, -		__LINE__, priv->ctrl[CTRL_PUT], priv->ctrl[CTRL_GET], -		priv->ctrl[CTRL_TOP]); - -	return -ETIMEDOUT; -} - -static void ps3vram_out_ring(struct ps3vram_priv *priv, u32 data) -{ -	*(priv->fifo_ptr)++ = data; -} - -static void ps3vram_begin_ring(struct ps3vram_priv *priv, u32 chan, -				      u32 tag, u32 size) -{ -	ps3vram_out_ring(priv, (size << 18) | (chan << 13) | tag); -} - -static void ps3vram_rewind_ring(struct mtd_info *mtd) -{ -	struct ps3vram_priv *priv = mtd->priv; -	u64 status; - -	ps3vram_out_ring(priv, 0x20000000 | (FIFO_BASE + FIFO_OFFSET)); - -	priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET; - -	/* asking the HV for a blit will kick the fifo */ -	status = lv1_gpu_context_attribute(priv->context_handle, -					   L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT, -					   0, 0, 0, 0); -	if (status) -		dev_err(priv->dev, "%s:%d: lv1_gpu_context_attribute failed\n", -			__func__, __LINE__); - -	priv->fifo_ptr = priv->fifo_base; -} - -static void ps3vram_fire_ring(struct mtd_info *mtd) -{ -	struct ps3vram_priv *priv = mtd->priv; -	u64 status; - -	mutex_lock(&ps3_gpu_mutex); - -	priv->ctrl[CTRL_PUT] = FIFO_BASE + FIFO_OFFSET + -		(priv->fifo_ptr - priv->fifo_base) * sizeof(u32); - -	/* asking the HV for a blit will kick the fifo */ -	status = lv1_gpu_context_attribute(priv->context_handle, -					   L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT, -					   0, 0, 0, 0); -	if (status) -		dev_err(priv->dev, "%s:%d: lv1_gpu_context_attribute failed\n", -			__func__, __LINE__); - -	if ((priv->fifo_ptr - priv->fifo_base) * sizeof(u32) > -		FIFO_SIZE - 1024) { -		dev_dbg(priv->dev, "%s:%d: fifo full, rewinding\n", __func__, -			__LINE__); -		ps3vram_wait_ring(mtd, 200); -		ps3vram_rewind_ring(mtd); -	} - -	mutex_unlock(&ps3_gpu_mutex); -} - -static void ps3vram_bind(struct mtd_info *mtd) -{ -	struct ps3vram_priv *priv = mtd->priv; - -	ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0, 1); -	ps3vram_out_ring(priv, 0x31337303); -	ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x180, 3); -	ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER); -	ps3vram_out_ring(priv, 0xfeed0001);	/* DMA system RAM instance */ -	ps3vram_out_ring(priv, 0xfeed0000);     /* DMA video RAM instance */ - -	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0, 1); -	ps3vram_out_ring(priv, 0x3137c0de); -	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x180, 3); -	ps3vram_out_ring(priv, DMA_NOTIFIER_HANDLE_BASE + NOTIFIER); -	ps3vram_out_ring(priv, 0xfeed0000);	/* DMA video RAM instance */ -	ps3vram_out_ring(priv, 0xfeed0001);	/* DMA system RAM instance */ - -	ps3vram_fire_ring(mtd); -} - -static int ps3vram_upload(struct mtd_info *mtd, unsigned int src_offset, -			  unsigned int dst_offset, int len, int count) -{ -	struct ps3vram_priv *priv = mtd->priv; - -	ps3vram_begin_ring(priv, UPLOAD_SUBCH, -			   NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8); -	ps3vram_out_ring(priv, XDR_IOIF + src_offset); -	ps3vram_out_ring(priv, dst_offset); -	ps3vram_out_ring(priv, len); -	ps3vram_out_ring(priv, len); -	ps3vram_out_ring(priv, len); -	ps3vram_out_ring(priv, count); -	ps3vram_out_ring(priv, (1 << 8) | 1); -	ps3vram_out_ring(priv, 0); - -	ps3vram_notifier_reset(mtd); -	ps3vram_begin_ring(priv, UPLOAD_SUBCH, -			   NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1); -	ps3vram_out_ring(priv, 0); -	ps3vram_begin_ring(priv, UPLOAD_SUBCH, 0x100, 1); -	ps3vram_out_ring(priv, 0); -	ps3vram_fire_ring(mtd); -	if (ps3vram_notifier_wait(mtd, 200) < 0) { -		dev_dbg(priv->dev, "%s:%d: notifier timeout\n", __func__, -			__LINE__); -		return -1; -	} - -	return 0; -} - -static int ps3vram_download(struct mtd_info *mtd, unsigned int src_offset, -			    unsigned int dst_offset, int len, int count) -{ -	struct ps3vram_priv *priv = mtd->priv; - -	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, -			   NV_MEMORY_TO_MEMORY_FORMAT_OFFSET_IN, 8); -	ps3vram_out_ring(priv, src_offset); -	ps3vram_out_ring(priv, XDR_IOIF + dst_offset); -	ps3vram_out_ring(priv, len); -	ps3vram_out_ring(priv, len); -	ps3vram_out_ring(priv, len); -	ps3vram_out_ring(priv, count); -	ps3vram_out_ring(priv, (1 << 8) | 1); -	ps3vram_out_ring(priv, 0); - -	ps3vram_notifier_reset(mtd); -	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, -			   NV_MEMORY_TO_MEMORY_FORMAT_NOTIFY, 1); -	ps3vram_out_ring(priv, 0); -	ps3vram_begin_ring(priv, DOWNLOAD_SUBCH, 0x100, 1); -	ps3vram_out_ring(priv, 0); -	ps3vram_fire_ring(mtd); -	if (ps3vram_notifier_wait(mtd, 200) < 0) { -		dev_dbg(priv->dev, "%s:%d: notifier timeout\n", __func__, -			__LINE__); -		return -1; -	} - -	return 0; -} - -static void ps3vram_cache_evict(struct mtd_info *mtd, int entry) -{ -	struct ps3vram_priv *priv = mtd->priv; -	struct ps3vram_cache *cache = &priv->cache; - -	if (cache->tags[entry].flags & CACHE_PAGE_DIRTY) { -		dev_dbg(priv->dev, "%s:%d: flushing %d : 0x%08x\n", __func__, -			__LINE__, entry, cache->tags[entry].address); -		if (ps3vram_upload(mtd, -				   CACHE_OFFSET + entry * cache->page_size, -				   cache->tags[entry].address, -				   DMA_PAGE_SIZE, -				   cache->page_size / DMA_PAGE_SIZE) < 0) { -			dev_dbg(priv->dev, "%s:%d: failed to upload from " -				"0x%x to 0x%x size 0x%x\n", __func__, __LINE__, -				entry * cache->page_size, -				cache->tags[entry].address, cache->page_size); -		} -		cache->tags[entry].flags &= ~CACHE_PAGE_DIRTY; -	} -} - -static void ps3vram_cache_load(struct mtd_info *mtd, int entry, -			       unsigned int address) -{ -	struct ps3vram_priv *priv = mtd->priv; -	struct ps3vram_cache *cache = &priv->cache; - -	dev_dbg(priv->dev, "%s:%d: fetching %d : 0x%08x\n", __func__, __LINE__, -		entry, address); -	if (ps3vram_download(mtd, -			     address, -			     CACHE_OFFSET + entry * cache->page_size, -			     DMA_PAGE_SIZE, -			     cache->page_size / DMA_PAGE_SIZE) < 0) { -		dev_err(priv->dev, "%s:%d: failed to download from " -			"0x%x to 0x%x size 0x%x\n", __func__, __LINE__, address, -			entry * cache->page_size, cache->page_size); -	} - -	cache->tags[entry].address = address; -	cache->tags[entry].flags |= CACHE_PAGE_PRESENT; -} - - -static void ps3vram_cache_flush(struct mtd_info *mtd) -{ -	struct ps3vram_priv *priv = mtd->priv; -	struct ps3vram_cache *cache = &priv->cache; -	int i; - -	dev_dbg(priv->dev, "%s:%d: FLUSH\n", __func__, __LINE__); -	for (i = 0; i < cache->page_count; i++) { -		ps3vram_cache_evict(mtd, i); -		cache->tags[i].flags = 0; -	} -} - -static unsigned int ps3vram_cache_match(struct mtd_info *mtd, loff_t address) -{ -	struct ps3vram_priv *priv = mtd->priv; -	struct ps3vram_cache *cache = &priv->cache; -	unsigned int base; -	unsigned int offset; -	int i; -	static int counter; - -	offset = (unsigned int) (address & (cache->page_size - 1)); -	base = (unsigned int) (address - offset); - -	/* fully associative check */ -	for (i = 0; i < cache->page_count; i++) { -		if ((cache->tags[i].flags & CACHE_PAGE_PRESENT) && -		    cache->tags[i].address == base) { -			dev_dbg(priv->dev, "%s:%d: found entry %d : 0x%08x\n", -				__func__, __LINE__, i, cache->tags[i].address); -			return i; -		} -	} - -	/* choose a random entry */ -	i = (jiffies + (counter++)) % cache->page_count; -	dev_dbg(priv->dev, "%s:%d: using entry %d\n", __func__, __LINE__, i); - -	ps3vram_cache_evict(mtd, i); -	ps3vram_cache_load(mtd, i, base); - -	return i; -} - -static int ps3vram_cache_init(struct mtd_info *mtd) -{ -	struct ps3vram_priv *priv = mtd->priv; - -	priv->cache.page_count = CACHE_PAGE_COUNT; -	priv->cache.page_size = CACHE_PAGE_SIZE; -	priv->cache.tags = kzalloc(sizeof(struct ps3vram_tag) * -				   CACHE_PAGE_COUNT, GFP_KERNEL); -	if (priv->cache.tags == NULL) { -		dev_err(priv->dev, "%s:%d: could not allocate cache tags\n", -			__func__, __LINE__); -		return -ENOMEM; -	} - -	dev_info(priv->dev, "created ram cache: %d entries, %d KiB each\n", -		CACHE_PAGE_COUNT, CACHE_PAGE_SIZE / 1024); - -	return 0; -} - -static void ps3vram_cache_cleanup(struct mtd_info *mtd) -{ -	struct ps3vram_priv *priv = mtd->priv; - -	ps3vram_cache_flush(mtd); -	kfree(priv->cache.tags); -} - -static int ps3vram_erase(struct mtd_info *mtd, struct erase_info *instr) -{ -	struct ps3vram_priv *priv = mtd->priv; - -	if (instr->addr + instr->len > mtd->size) -		return -EINVAL; - -	mutex_lock(&priv->lock); - -	ps3vram_cache_flush(mtd); - -	/* Set bytes to 0xFF */ -	memset_io(priv->ddr_base + instr->addr, 0xFF, instr->len); - -	mutex_unlock(&priv->lock); - -	instr->state = MTD_ERASE_DONE; -	mtd_erase_callback(instr); - -	return 0; -} - -static int ps3vram_read(struct mtd_info *mtd, loff_t from, size_t len, -			size_t *retlen, u_char *buf) -{ -	struct ps3vram_priv *priv = mtd->priv; -	unsigned int cached, count; - -	dev_dbg(priv->dev, "%s:%d: from=0x%08x len=0x%zx\n", __func__, __LINE__, -		(unsigned int)from, len); - -	if (from >= mtd->size) -		return -EINVAL; - -	if (len > mtd->size - from) -		len = mtd->size - from; - -	/* Copy from vram to buf */ -	count = len; -	while (count) { -		unsigned int offset, avail; -		unsigned int entry; - -		offset = (unsigned int) (from & (priv->cache.page_size - 1)); -		avail  = priv->cache.page_size - offset; - -		mutex_lock(&priv->lock); - -		entry = ps3vram_cache_match(mtd, from); -		cached = CACHE_OFFSET + entry * priv->cache.page_size + offset; - -		dev_dbg(priv->dev, "%s:%d: from=%08x cached=%08x offset=%08x " -			"avail=%08x count=%08x\n", __func__, __LINE__, -			(unsigned int)from, cached, offset, avail, count); - -		if (avail > count) -			avail = count; -		memcpy(buf, priv->xdr_buf + cached, avail); - -		mutex_unlock(&priv->lock); - -		buf += avail; -		count -= avail; -		from += avail; -	} - -	*retlen = len; -	return 0; -} - -static int ps3vram_write(struct mtd_info *mtd, loff_t to, size_t len, -			 size_t *retlen, const u_char *buf) -{ -	struct ps3vram_priv *priv = mtd->priv; -	unsigned int cached, count; - -	if (to >= mtd->size) -		return -EINVAL; - -	if (len > mtd->size - to) -		len = mtd->size - to; - -	/* Copy from buf to vram */ -	count = len; -	while (count) { -		unsigned int offset, avail; -		unsigned int entry; - -		offset = (unsigned int) (to & (priv->cache.page_size - 1)); -		avail  = priv->cache.page_size - offset; - -		mutex_lock(&priv->lock); - -		entry = ps3vram_cache_match(mtd, to); -		cached = CACHE_OFFSET + entry * priv->cache.page_size + offset; - -		dev_dbg(priv->dev, "%s:%d: to=%08x cached=%08x offset=%08x " -			"avail=%08x count=%08x\n", __func__, __LINE__, -			(unsigned int)to, cached, offset, avail, count); - -		if (avail > count) -			avail = count; -		memcpy(priv->xdr_buf + cached, buf, avail); - -		priv->cache.tags[entry].flags |= CACHE_PAGE_DIRTY; - -		mutex_unlock(&priv->lock); - -		buf += avail; -		count -= avail; -		to += avail; -	} - -	*retlen = len; -	return 0; -} - -static int __devinit ps3vram_probe(struct ps3_system_bus_device *dev) -{ -	struct ps3vram_priv *priv; -	int status; -	u64 ddr_lpar; -	u64 ctrl_lpar; -	u64 info_lpar; -	u64 reports_lpar; -	u64 ddr_size; -	u64 reports_size; -	int ret = -ENOMEM; -	char *rest; - -	ret = -EIO; -	ps3vram_mtd.priv = kzalloc(sizeof(struct ps3vram_priv), GFP_KERNEL); -	if (!ps3vram_mtd.priv) -		goto out; -	priv = ps3vram_mtd.priv; - -	mutex_init(&priv->lock); -	priv->dev = &dev->core; - -	/* Allocate XDR buffer (1MiB aligned) */ -	priv->xdr_buf = (void *)__get_free_pages(GFP_KERNEL, -		get_order(XDR_BUF_SIZE)); -	if (priv->xdr_buf == NULL) { -		dev_dbg(&dev->core, "%s:%d: could not allocate XDR buffer\n", -			__func__, __LINE__); -		ret = -ENOMEM; -		goto out_free_priv; -	} - -	/* Put FIFO at begginning of XDR buffer */ -	priv->fifo_base = (u32 *) (priv->xdr_buf + FIFO_OFFSET); -	priv->fifo_ptr = priv->fifo_base; - -	/* XXX: Need to open GPU, in case ps3fb or snd_ps3 aren't loaded */ -	if (ps3_open_hv_device(dev)) { -		dev_err(&dev->core, "%s:%d: ps3_open_hv_device failed\n", -			__func__, __LINE__); -		ret = -EAGAIN; -		goto out_close_gpu; -	} - -	/* Request memory */ -	status = -1; -	ddr_size = memparse(size, &rest); -	if (*rest == '-') -		ddr_size -= ps3fb_videomemory.size; -	ddr_size = ALIGN(ddr_size, 1024*1024); -	if (ddr_size <= 0) { -		dev_err(&dev->core, "%s:%d: specified size is too small\n", -			__func__, __LINE__); -		ret = -EINVAL; -		goto out_close_gpu; -	} - -	while (ddr_size > 0) { -		status = lv1_gpu_memory_allocate(ddr_size, 0, 0, 0, 0, -						 &priv->memory_handle, -						 &ddr_lpar); -		if (!status) -			break; -		ddr_size -= 1024*1024; -	} -	if (status || ddr_size <= 0) { -		dev_err(&dev->core, "%s:%d: lv1_gpu_memory_allocate failed\n", -			__func__, __LINE__); -		ret = -ENOMEM; -		goto out_free_xdr_buf; -	} - -	/* Request context */ -	status = lv1_gpu_context_allocate(priv->memory_handle, -					  0, -					  &priv->context_handle, -					  &ctrl_lpar, -					  &info_lpar, -					  &reports_lpar, -					  &reports_size); -	if (status) { -		dev_err(&dev->core, "%s:%d: lv1_gpu_context_allocate failed\n", -			__func__, __LINE__); -		ret = -ENOMEM; -		goto out_free_memory; -	} - -	/* Map XDR buffer to RSX */ -	status = lv1_gpu_context_iomap(priv->context_handle, XDR_IOIF, -				       ps3_mm_phys_to_lpar(__pa(priv->xdr_buf)), -				       XDR_BUF_SIZE, 0); -	if (status) { -		dev_err(&dev->core, "%s:%d: lv1_gpu_context_iomap failed\n", -			__func__, __LINE__); -		ret = -ENOMEM; -		goto out_free_context; -	} - -	priv->ddr_base = ioremap_flags(ddr_lpar, ddr_size, _PAGE_NO_CACHE); - -	if (!priv->ddr_base) { -		dev_err(&dev->core, "%s:%d: ioremap failed\n", __func__, -			__LINE__); -		ret = -ENOMEM; -		goto out_free_context; -	} - -	priv->ctrl = ioremap(ctrl_lpar, 64 * 1024); -	if (!priv->ctrl) { -		dev_err(&dev->core, "%s:%d: ioremap failed\n", __func__, -			__LINE__); -		ret = -ENOMEM; -		goto out_unmap_vram; -	} - -	priv->reports = ioremap(reports_lpar, reports_size); -	if (!priv->reports) { -		dev_err(&dev->core, "%s:%d: ioremap failed\n", __func__, -			__LINE__); -		ret = -ENOMEM; -		goto out_unmap_ctrl; -	} - -	mutex_lock(&ps3_gpu_mutex); -	ps3vram_init_ring(&ps3vram_mtd); -	mutex_unlock(&ps3_gpu_mutex); - -	ps3vram_mtd.name = "ps3vram"; -	ps3vram_mtd.size = ddr_size; -	ps3vram_mtd.flags = MTD_CAP_RAM; -	ps3vram_mtd.erase = ps3vram_erase; -	ps3vram_mtd.point = NULL; -	ps3vram_mtd.unpoint = NULL; -	ps3vram_mtd.read = ps3vram_read; -	ps3vram_mtd.write = ps3vram_write; -	ps3vram_mtd.owner = THIS_MODULE; -	ps3vram_mtd.type = MTD_RAM; -	ps3vram_mtd.erasesize = CACHE_PAGE_SIZE; -	ps3vram_mtd.writesize = 1; - -	ps3vram_bind(&ps3vram_mtd); - -	mutex_lock(&ps3_gpu_mutex); -	ret = ps3vram_wait_ring(&ps3vram_mtd, 100); -	mutex_unlock(&ps3_gpu_mutex); -	if (ret < 0) { -		dev_err(&dev->core, "%s:%d: failed to initialize channels\n", -			__func__, __LINE__); -		ret = -ETIMEDOUT; -		goto out_unmap_reports; -	} - -	ps3vram_cache_init(&ps3vram_mtd); - -	if (add_mtd_device(&ps3vram_mtd)) { -		dev_err(&dev->core, "%s:%d: add_mtd_device failed\n", -			__func__, __LINE__); -		ret = -EAGAIN; -		goto out_cache_cleanup; -	} - -	dev_info(&dev->core, "reserved %u MiB of gpu memory\n", -		(unsigned int)(ddr_size / 1024 / 1024)); - -	return 0; - -out_cache_cleanup: -	ps3vram_cache_cleanup(&ps3vram_mtd); -out_unmap_reports: -	iounmap(priv->reports); -out_unmap_ctrl: -	iounmap(priv->ctrl); -out_unmap_vram: -	iounmap(priv->ddr_base); -out_free_context: -	lv1_gpu_context_free(priv->context_handle); -out_free_memory: -	lv1_gpu_memory_free(priv->memory_handle); -out_close_gpu: -	ps3_close_hv_device(dev); -out_free_xdr_buf: -	free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE)); -out_free_priv: -	kfree(ps3vram_mtd.priv); -	ps3vram_mtd.priv = NULL; -out: -	return ret; -} - -static int ps3vram_shutdown(struct ps3_system_bus_device *dev) -{ -	struct ps3vram_priv *priv; - -	priv = ps3vram_mtd.priv; - -	del_mtd_device(&ps3vram_mtd); -	ps3vram_cache_cleanup(&ps3vram_mtd); -	iounmap(priv->reports); -	iounmap(priv->ctrl); -	iounmap(priv->ddr_base); -	lv1_gpu_context_free(priv->context_handle); -	lv1_gpu_memory_free(priv->memory_handle); -	ps3_close_hv_device(dev); -	free_pages((unsigned long) priv->xdr_buf, get_order(XDR_BUF_SIZE)); -	kfree(priv); -	return 0; -} - -static struct ps3_system_bus_driver ps3vram_driver = { -	.match_id	= PS3_MATCH_ID_GPU, -	.match_sub_id	= PS3_MATCH_SUB_ID_GPU_RAMDISK, -	.core.name	= DEVICE_NAME, -	.core.owner	= THIS_MODULE, -	.probe		= ps3vram_probe, -	.remove		= ps3vram_shutdown, -	.shutdown	= ps3vram_shutdown, -}; - -static int __init ps3vram_init(void) -{ -	return ps3_system_bus_driver_register(&ps3vram_driver); -} - -static void __exit ps3vram_exit(void) -{ -	ps3_system_bus_driver_unregister(&ps3vram_driver); -} - -module_init(ps3vram_init); -module_exit(ps3vram_exit); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("Jim Paris <jim@jtan.com>"); -MODULE_DESCRIPTION("MTD driver for PS3 video RAM"); -MODULE_ALIAS(PS3_MODULE_ALIAS_GPU_RAMDISK); diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c index 4b122e7ab4b..229718222db 100644 --- a/drivers/mtd/maps/physmap.c +++ b/drivers/mtd/maps/physmap.c @@ -46,16 +46,19 @@ static int physmap_flash_remove(struct platform_device *dev)  	physmap_data = dev->dev.platform_data; +	if (info->cmtd) {  #ifdef CONFIG_MTD_PARTITIONS -	if (info->nr_parts) { -		del_mtd_partitions(info->cmtd); -		kfree(info->parts); -	} else if (physmap_data->nr_parts) -		del_mtd_partitions(info->cmtd); -	else -		del_mtd_device(info->cmtd); +		if (info->nr_parts || physmap_data->nr_parts) +			del_mtd_partitions(info->cmtd); +		else +			del_mtd_device(info->cmtd);  #else -	del_mtd_device(info->cmtd); +		del_mtd_device(info->cmtd); +#endif +	} +#ifdef CONFIG_MTD_PARTITIONS +	if (info->nr_parts) +		kfree(info->parts);  #endif  #ifdef CONFIG_MTD_CONCAT diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c index 917cf8d3ae9..c2dfd3ea353 100644 --- a/drivers/mtd/nand/orion_nand.c +++ b/drivers/mtd/nand/orion_nand.c @@ -149,7 +149,7 @@ static int __devexit orion_nand_remove(struct platform_device *pdev)  static struct platform_driver orion_nand_driver = {  	.probe		= orion_nand_probe, -	.remove		= orion_nand_remove, +	.remove		= __devexit_p(orion_nand_remove),  	.driver		= {  		.name	= "orion_nand",  		.owner	= THIS_MODULE, diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index a2f185fd707..62d732a886f 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -1040,6 +1040,17 @@ config NI65  	  To compile this driver as a module, choose M here. The module  	  will be called ni65. +config DNET +	tristate "Dave ethernet support (DNET)" +	depends on NET_ETHERNET && HAS_IOMEM +	select PHYLIB +	help +	  The Dave ethernet interface (DNET) is found on Qong Board FPGA. +	  Say Y to include support for the DNET chip. + +	  To compile this driver as a module, choose M here: the module +	  will be called dnet. +  source "drivers/net/tulip/Kconfig"  config AT1700 @@ -2619,6 +2630,8 @@ config QLGE  source "drivers/net/sfc/Kconfig" +source "drivers/net/benet/Kconfig" +  endif # NETDEV_10000  source "drivers/net/tokenring/Kconfig" diff --git a/drivers/net/Makefile b/drivers/net/Makefile index aca8492db65..471baaff229 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -22,6 +22,7 @@ obj-$(CONFIG_GIANFAR) += gianfar_driver.o  obj-$(CONFIG_TEHUTI) += tehuti.o  obj-$(CONFIG_ENIC) += enic/  obj-$(CONFIG_JME) += jme.o +obj-$(CONFIG_BE2NET) += benet/  gianfar_driver-objs := gianfar.o \  		gianfar_ethtool.o \ @@ -231,6 +232,7 @@ obj-$(CONFIG_ENC28J60) += enc28j60.o  obj-$(CONFIG_XTENSA_XT2000_SONIC) += xtsonic.o +obj-$(CONFIG_DNET) += dnet.o  obj-$(CONFIG_MACB) += macb.o  obj-$(CONFIG_ARM) += arm/ diff --git a/drivers/net/arm/Makefile b/drivers/net/arm/Makefile index c69c0cdba4a..811a3ccd14c 100644 --- a/drivers/net/arm/Makefile +++ b/drivers/net/arm/Makefile @@ -4,7 +4,7 @@  #  obj-$(CONFIG_ARM_AM79C961A)	+= am79c961a.o -obj-$(CONFIG_ARM_ETHERH)	+= etherh.o ../8390.o +obj-$(CONFIG_ARM_ETHERH)	+= etherh.o  obj-$(CONFIG_ARM_ETHER3)	+= ether3.o  obj-$(CONFIG_ARM_ETHER1)	+= ether1.o  obj-$(CONFIG_ARM_AT91_ETHER)	+= at91_ether.o diff --git a/drivers/net/arm/etherh.c b/drivers/net/arm/etherh.c index 54b52e5b182..f52f668c49b 100644 --- a/drivers/net/arm/etherh.c +++ b/drivers/net/arm/etherh.c @@ -641,15 +641,15 @@ static const struct net_device_ops etherh_netdev_ops = {  	.ndo_open		= etherh_open,  	.ndo_stop		= etherh_close,  	.ndo_set_config		= etherh_set_config, -	.ndo_start_xmit		= ei_start_xmit, -	.ndo_tx_timeout		= ei_tx_timeout, -	.ndo_get_stats		= ei_get_stats, -	.ndo_set_multicast_list = ei_set_multicast_list, +	.ndo_start_xmit		= __ei_start_xmit, +	.ndo_tx_timeout		= __ei_tx_timeout, +	.ndo_get_stats		= __ei_get_stats, +	.ndo_set_multicast_list = __ei_set_multicast_list,  	.ndo_validate_addr	= eth_validate_addr,  	.ndo_set_mac_address	= eth_mac_addr,  	.ndo_change_mtu		= eth_change_mtu,  #ifdef CONFIG_NET_POLL_CONTROLLER -	.ndo_poll_controller	= ei_poll, +	.ndo_poll_controller	= __ei_poll,  #endif  }; diff --git a/drivers/net/arm/ks8695net.c b/drivers/net/arm/ks8695net.c index 1cf2f949c0b..f3a12743489 100644 --- a/drivers/net/arm/ks8695net.c +++ b/drivers/net/arm/ks8695net.c @@ -560,7 +560,7 @@ ks8695_reset(struct ks8695_priv *ksp)  		msleep(1);  	} -	if (reset_timeout == 0) { +	if (reset_timeout < 0) {  		dev_crit(ksp->dev,  			 "Timeout waiting for DMA engines to reset\n");  		/* And blithely carry on */ diff --git a/drivers/net/benet/Kconfig b/drivers/net/benet/Kconfig new file mode 100644 index 00000000000..c6934f179c0 --- /dev/null +++ b/drivers/net/benet/Kconfig @@ -0,0 +1,7 @@ +config BE2NET +	tristate "ServerEngines' 10Gbps NIC - BladeEngine 2" +	depends on PCI && INET +	select INET_LRO +	help +	This driver implements the NIC functionality for ServerEngines' +	10Gbps network adapter - BladeEngine 2. diff --git a/drivers/net/benet/Makefile b/drivers/net/benet/Makefile new file mode 100644 index 00000000000..a60cd805113 --- /dev/null +++ b/drivers/net/benet/Makefile @@ -0,0 +1,7 @@ +# +# Makefile to build the network driver for ServerEngine's BladeEngine. +# + +obj-$(CONFIG_BE2NET) += be2net.o + +be2net-y :=  be_main.o be_cmds.o be_ethtool.o diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h new file mode 100644 index 00000000000..f327be57ca9 --- /dev/null +++ b/drivers/net/benet/be.h @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2005 - 2009 ServerEngines + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation.  The full GNU General + * Public License is included in this distribution in the file called COPYING. + * + * Contact Information: + * linux-drivers@serverengines.com + * + * ServerEngines + * 209 N. Fair Oaks Ave + * Sunnyvale, CA 94085 + */ + +#ifndef BE_H +#define BE_H + +#include <linux/pci.h> +#include <linux/etherdevice.h> +#include <linux/version.h> +#include <linux/delay.h> +#include <net/tcp.h> +#include <net/ip.h> +#include <net/ipv6.h> +#include <linux/if_vlan.h> +#include <linux/workqueue.h> +#include <linux/interrupt.h> +#include <linux/inet_lro.h> + +#include "be_hw.h" + +#define DRV_VER			"2.0.348" +#define DRV_NAME		"be2net" +#define BE_NAME			"ServerEngines BladeEngine2 10Gbps NIC" +#define DRV_DESC		BE_NAME "Driver" + +/* Number of bytes of an RX frame that are copied to skb->data */ +#define BE_HDR_LEN 		64 +#define BE_MAX_JUMBO_FRAME_SIZE	9018 +#define BE_MIN_MTU		256 + +#define BE_NUM_VLANS_SUPPORTED	64 +#define BE_MAX_EQD		96 +#define	BE_MAX_TX_FRAG_COUNT	30 + +#define EVNT_Q_LEN		1024 +#define TX_Q_LEN		2048 +#define TX_CQ_LEN		1024 +#define RX_Q_LEN		1024	/* Does not support any other value */ +#define RX_CQ_LEN		1024 +#define MCC_Q_LEN		64	/* total size not to exceed 8 pages */ +#define MCC_CQ_LEN		256 + +#define BE_NAPI_WEIGHT		64 +#define MAX_RX_POST 		BE_NAPI_WEIGHT /* Frags posted at a time */ +#define RX_FRAGS_REFILL_WM	(RX_Q_LEN - MAX_RX_POST) + +#define BE_MAX_LRO_DESCRIPTORS  16 +#define BE_MAX_FRAGS_PER_FRAME  16 + +struct be_dma_mem { +	void *va; +	dma_addr_t dma; +	u32 size; +}; + +struct be_queue_info { +	struct be_dma_mem dma_mem; +	u16 len; +	u16 entry_size;	/* Size of an element in the queue */ +	u16 id; +	u16 tail, head; +	bool created; +	atomic_t used;	/* Number of valid elements in the queue */ +}; + +struct be_ctrl_info { +	u8 __iomem *csr; +	u8 __iomem *db;		/* Door Bell */ +	u8 __iomem *pcicfg;	/* PCI config space */ +	int pci_func; + +	/* Mbox used for cmd request/response */ +	spinlock_t cmd_lock;	/* For serializing cmds to BE card */ +	struct be_dma_mem mbox_mem; +	/* Mbox mem is adjusted to align to 16 bytes. The allocated addr +	 * is stored for freeing purpose */ +	struct be_dma_mem mbox_mem_alloced; +}; + +#include "be_cmds.h" + +struct be_drvr_stats { +	u32 be_tx_reqs;		/* number of TX requests initiated */ +	u32 be_tx_stops;	/* number of times TX Q was stopped */ +	u32 be_fwd_reqs;	/* number of send reqs through forwarding i/f */ +	u32 be_tx_wrbs;		/* number of tx WRBs used */ +	u32 be_tx_events;	/* number of tx completion events  */ +	u32 be_tx_compl;	/* number of tx completion entries processed */ +	u64 be_tx_jiffies; +	ulong be_tx_bytes; +	ulong be_tx_bytes_prev; +	u32 be_tx_rate; + +	u32 cache_barrier[16]; + +	u32 be_ethrx_post_fail;/* number of ethrx buffer alloc failures */ +	u32 be_polls;		/* number of times NAPI called poll function */ +	u32 be_rx_events;	/* number of ucast rx completion events  */ +	u32 be_rx_compl;	/* number of rx completion entries processed */ +	u32 be_lro_hgram_data[8];	/* histogram of LRO data packets */ +	u32 be_lro_hgram_ack[8];	/* histogram of LRO ACKs */ +	u64 be_rx_jiffies; +	ulong be_rx_bytes; +	ulong be_rx_bytes_prev; +	u32 be_rx_rate; +	/* number of non ether type II frames dropped where +	 * frame len > length field of Mac Hdr */ +	u32 be_802_3_dropped_frames; +	/* number of non ether type II frames malformed where +	 * in frame len < length field of Mac Hdr */ +	u32 be_802_3_malformed_frames; +	u32 be_rxcp_err;	/* Num rx completion entries w/ err set. */ +	ulong rx_fps_jiffies;	/* jiffies at last FPS calc */ +	u32 be_rx_frags; +	u32 be_prev_rx_frags; +	u32 be_rx_fps;		/* Rx frags per second */ +}; + +struct be_stats_obj { +	struct be_drvr_stats drvr_stats; +	struct net_device_stats net_stats; +	struct be_dma_mem cmd; +}; + +struct be_eq_obj { +	struct be_queue_info q; +	char desc[32]; + +	/* Adaptive interrupt coalescing (AIC) info */ +	bool enable_aic; +	u16 min_eqd;		/* in usecs */ +	u16 max_eqd;		/* in usecs */ +	u16 cur_eqd;		/* in usecs */ + +	struct napi_struct napi; +}; + +struct be_tx_obj { +	struct be_queue_info q; +	struct be_queue_info cq; +	/* Remember the skbs that were transmitted */ +	struct sk_buff *sent_skb_list[TX_Q_LEN]; +}; + +/* Struct to remember the pages posted for rx frags */ +struct be_rx_page_info { +	struct page *page; +	dma_addr_t bus; +	u16 page_offset; +	bool last_page_user; +}; + +struct be_rx_obj { +	struct be_queue_info q; +	struct be_queue_info cq; +	struct be_rx_page_info page_info_tbl[RX_Q_LEN]; +	struct net_lro_mgr lro_mgr; +	struct net_lro_desc lro_desc[BE_MAX_LRO_DESCRIPTORS]; +}; + +#define BE_NUM_MSIX_VECTORS		2	/* 1 each for Tx and Rx */ +struct be_adapter { +	struct pci_dev *pdev; +	struct net_device *netdev; + +	/* Mbox, pci config, csr address information */ +	struct be_ctrl_info ctrl; + +	struct msix_entry msix_entries[BE_NUM_MSIX_VECTORS]; +	bool msix_enabled; +	bool isr_registered; + +	/* TX Rings */ +	struct be_eq_obj tx_eq; +	struct be_tx_obj tx_obj; + +	u32 cache_line_break[8]; + +	/* Rx rings */ +	struct be_eq_obj rx_eq; +	struct be_rx_obj rx_obj; +	u32 big_page_size;	/* Compounded page size shared by rx wrbs */ +	bool rx_post_starved;	/* Zero rx frags have been posted to BE */ + +	struct vlan_group *vlan_grp; +	u16 num_vlans; +	u8 vlan_tag[VLAN_GROUP_ARRAY_LEN]; + +	struct be_stats_obj stats; +	/* Work queue used to perform periodic tasks like getting statistics */ +	struct delayed_work work; + +	/* Ethtool knobs and info */ +	bool rx_csum; 		/* BE card must perform rx-checksumming */ +	u32 max_rx_coal; +	char fw_ver[FW_VER_LEN]; +	u32 if_handle;		/* Used to configure filtering */ +	u32 pmac_id;		/* MAC addr handle used by BE card */ + +	struct be_link_info link; +	u32 port_num; +}; + +extern struct ethtool_ops be_ethtool_ops; + +#define drvr_stats(adapter)		(&adapter->stats.drvr_stats) + +#define BE_SET_NETDEV_OPS(netdev, ops)	(netdev->netdev_ops = ops) + +static inline u32 MODULO(u16 val, u16 limit) +{ +	BUG_ON(limit & (limit - 1)); +	return val & (limit - 1); +} + +static inline void index_adv(u16 *index, u16 val, u16 limit) +{ +	*index = MODULO((*index + val), limit); +} + +static inline void index_inc(u16 *index, u16 limit) +{ +	*index = MODULO((*index + 1), limit); +} + +#define PAGE_SHIFT_4K		12 +#define PAGE_SIZE_4K		(1 << PAGE_SHIFT_4K) + +/* Returns number of pages spanned by the data starting at the given addr */ +#define PAGES_4K_SPANNED(_address, size) 				\ +		((u32)((((size_t)(_address) & (PAGE_SIZE_4K - 1)) + 	\ +			(size) + (PAGE_SIZE_4K - 1)) >> PAGE_SHIFT_4K)) + +/* Byte offset into the page corresponding to given address */ +#define OFFSET_IN_PAGE(addr)						\ +		 ((size_t)(addr) & (PAGE_SIZE_4K-1)) + +/* Returns bit offset within a DWORD of a bitfield */ +#define AMAP_BIT_OFFSET(_struct, field)  				\ +		(((size_t)&(((_struct *)0)->field))%32) + +/* Returns the bit mask of the field that is NOT shifted into location. */ +static inline u32 amap_mask(u32 bitsize) +{ +	return (bitsize == 32 ? 0xFFFFFFFF : (1 << bitsize) - 1); +} + +static inline void +amap_set(void *ptr, u32 dw_offset, u32 mask, u32 offset, u32 value) +{ +	u32 *dw = (u32 *) ptr + dw_offset; +	*dw &= ~(mask << offset); +	*dw |= (mask & value) << offset; +} + +#define AMAP_SET_BITS(_struct, field, ptr, val)				\ +		amap_set(ptr,						\ +			offsetof(_struct, field)/32,			\ +			amap_mask(sizeof(((_struct *)0)->field)),	\ +			AMAP_BIT_OFFSET(_struct, field),		\ +			val) + +static inline u32 amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset) +{ +	u32 *dw = (u32 *) ptr; +	return mask & (*(dw + dw_offset) >> offset); +} + +#define AMAP_GET_BITS(_struct, field, ptr)				\ +		amap_get(ptr,						\ +			offsetof(_struct, field)/32,			\ +			amap_mask(sizeof(((_struct *)0)->field)),	\ +			AMAP_BIT_OFFSET(_struct, field)) + +#define be_dws_cpu_to_le(wrb, len)	swap_dws(wrb, len) +#define be_dws_le_to_cpu(wrb, len)	swap_dws(wrb, len) +static inline void swap_dws(void *wrb, int len) +{ +#ifdef __BIG_ENDIAN +	u32 *dw = wrb; +	BUG_ON(len % 4); +	do { +		*dw = cpu_to_le32(*dw); +		dw++; +		len -= 4; +	} while (len); +#endif				/* __BIG_ENDIAN */ +} + +static inline u8 is_tcp_pkt(struct sk_buff *skb) +{ +	u8 val = 0; + +	if (ip_hdr(skb)->version == 4) +		val = (ip_hdr(skb)->protocol == IPPROTO_TCP); +	else if (ip_hdr(skb)->version == 6) +		val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_TCP); + +	return val; +} + +static inline u8 is_udp_pkt(struct sk_buff *skb) +{ +	u8 val = 0; + +	if (ip_hdr(skb)->version == 4) +		val = (ip_hdr(skb)->protocol == IPPROTO_UDP); +	else if (ip_hdr(skb)->version == 6) +		val = (ipv6_hdr(skb)->nexthdr == NEXTHDR_UDP); + +	return val; +} + +#endif				/* BE_H */ diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c new file mode 100644 index 00000000000..d444aed962b --- /dev/null +++ b/drivers/net/benet/be_cmds.c @@ -0,0 +1,861 @@ +/* + * Copyright (C) 2005 - 2009 ServerEngines + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation.  The full GNU General + * Public License is included in this distribution in the file called COPYING. + * + * Contact Information: + * linux-drivers@serverengines.com + * + * ServerEngines + * 209 N. Fair Oaks Ave + * Sunnyvale, CA 94085 + */ + +#include "be.h" + +static int be_mbox_db_ready_wait(void __iomem *db) +{ +	int cnt = 0, wait = 5; +	u32 ready; + +	do { +		ready = ioread32(db) & MPU_MAILBOX_DB_RDY_MASK; +		if (ready) +			break; + +		if (cnt > 200000) { +			printk(KERN_WARNING DRV_NAME +				": mbox_db poll timed out\n"); +			return -1; +		} + +		if (cnt > 50) +			wait = 200; +		cnt += wait; +		udelay(wait); +	} while (true); + +	return 0; +} + +/* + * Insert the mailbox address into the doorbell in two steps + */ +static int be_mbox_db_ring(struct be_ctrl_info *ctrl) +{ +	int status; +	u16 compl_status, extd_status; +	u32 val = 0; +	void __iomem *db = ctrl->db + MPU_MAILBOX_DB_OFFSET; +	struct be_dma_mem *mbox_mem = &ctrl->mbox_mem; +	struct be_mcc_mailbox *mbox = mbox_mem->va; +	struct be_mcc_cq_entry *cqe = &mbox->cqe; + +	memset(cqe, 0, sizeof(*cqe)); + +	val &= ~MPU_MAILBOX_DB_RDY_MASK; +	val |= MPU_MAILBOX_DB_HI_MASK; +	/* at bits 2 - 31 place mbox dma addr msb bits 34 - 63 */ +	val |= (upper_32_bits(mbox_mem->dma) >> 2) << 2; +	iowrite32(val, db); + +	/* wait for ready to be set */ +	status = be_mbox_db_ready_wait(db); +	if (status != 0) +		return status; + +	val = 0; +	val &= ~MPU_MAILBOX_DB_RDY_MASK; +	val &= ~MPU_MAILBOX_DB_HI_MASK; +	/* at bits 2 - 31 place mbox dma addr lsb bits 4 - 33 */ +	val |= (u32)(mbox_mem->dma >> 4) << 2; +	iowrite32(val, db); + +	status = be_mbox_db_ready_wait(db); +	if (status != 0) +		return status; + +	/* compl entry has been made now */ +	be_dws_le_to_cpu(cqe, sizeof(*cqe)); +	if (!(cqe->flags & CQE_FLAGS_VALID_MASK)) { +		printk(KERN_WARNING DRV_NAME ": ERROR invalid mbox compl\n"); +		return -1; +	} + +	compl_status = (cqe->status >> CQE_STATUS_COMPL_SHIFT) & +				CQE_STATUS_COMPL_MASK; +	if (compl_status != MCC_STATUS_SUCCESS) { +		extd_status = (cqe->status >> CQE_STATUS_EXTD_SHIFT) & +				CQE_STATUS_EXTD_MASK; +		printk(KERN_WARNING DRV_NAME +			": ERROR in cmd compl. status(compl/extd)=%d/%d\n", +			compl_status, extd_status); +	} + +	return compl_status; +} + +static int be_POST_stage_get(struct be_ctrl_info *ctrl, u16 *stage) +{ +	u32 sem = ioread32(ctrl->csr + MPU_EP_SEMAPHORE_OFFSET); + +	*stage = sem & EP_SEMAPHORE_POST_STAGE_MASK; +	if ((sem >> EP_SEMAPHORE_POST_ERR_SHIFT) & EP_SEMAPHORE_POST_ERR_MASK) +		return -1; +	else +		return 0; +} + +static int be_POST_stage_poll(struct be_ctrl_info *ctrl, u16 poll_stage) +{ +	u16 stage, cnt, error; +	for (cnt = 0; cnt < 5000; cnt++) { +		error = be_POST_stage_get(ctrl, &stage); +		if (error) +			return -1; + +		if (stage == poll_stage) +			break; +		udelay(1000); +	} +	if (stage != poll_stage) +		return -1; +	return 0; +} + + +int be_cmd_POST(struct be_ctrl_info *ctrl) +{ +	u16 stage, error; + +	error = be_POST_stage_get(ctrl, &stage); +	if (error) +		goto err; + +	if (stage == POST_STAGE_ARMFW_RDY) +		return 0; + +	if (stage != POST_STAGE_AWAITING_HOST_RDY) +		goto err; + +	/* On awaiting host rdy, reset and again poll on awaiting host rdy */ +	iowrite32(POST_STAGE_BE_RESET, ctrl->csr + MPU_EP_SEMAPHORE_OFFSET); +	error = be_POST_stage_poll(ctrl, POST_STAGE_AWAITING_HOST_RDY); +	if (error) +		goto err; + +	/* Now kickoff POST and poll on armfw ready */ +	iowrite32(POST_STAGE_HOST_RDY, ctrl->csr + MPU_EP_SEMAPHORE_OFFSET); +	error = be_POST_stage_poll(ctrl, POST_STAGE_ARMFW_RDY); +	if (error) +		goto err; + +	return 0; +err: +	printk(KERN_WARNING DRV_NAME ": ERROR, stage=%d\n", stage); +	return -1; +} + +static inline void *embedded_payload(struct be_mcc_wrb *wrb) +{ +	return wrb->payload.embedded_payload; +} + +static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb) +{ +	return &wrb->payload.sgl[0]; +} + +/* Don't touch the hdr after it's prepared */ +static void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len, +				bool embedded, u8 sge_cnt) +{ +	if (embedded) +		wrb->embedded |= MCC_WRB_EMBEDDED_MASK; +	else +		wrb->embedded |= (sge_cnt & MCC_WRB_SGE_CNT_MASK) << +				MCC_WRB_SGE_CNT_SHIFT; +	wrb->payload_length = payload_len; +	be_dws_cpu_to_le(wrb, 20); +} + +/* Don't touch the hdr after it's prepared */ +static void be_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr, +				u8 subsystem, u8 opcode, int cmd_len) +{ +	req_hdr->opcode = opcode; +	req_hdr->subsystem = subsystem; +	req_hdr->request_length = cpu_to_le32(cmd_len - sizeof(*req_hdr)); +} + +static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages, +			struct be_dma_mem *mem) +{ +	int i, buf_pages = min(PAGES_4K_SPANNED(mem->va, mem->size), max_pages); +	u64 dma = (u64)mem->dma; + +	for (i = 0; i < buf_pages; i++) { +		pages[i].lo = cpu_to_le32(dma & 0xFFFFFFFF); +		pages[i].hi = cpu_to_le32(upper_32_bits(dma)); +		dma += PAGE_SIZE_4K; +	} +} + +/* Converts interrupt delay in microseconds to multiplier value */ +static u32 eq_delay_to_mult(u32 usec_delay) +{ +#define MAX_INTR_RATE			651042 +	const u32 round = 10; +	u32 multiplier; + +	if (usec_delay == 0) +		multiplier = 0; +	else { +		u32 interrupt_rate = 1000000 / usec_delay; +		/* Max delay, corresponding to the lowest interrupt rate */ +		if (interrupt_rate == 0) +			multiplier = 1023; +		else { +			multiplier = (MAX_INTR_RATE - interrupt_rate) * round; +			multiplier /= interrupt_rate; +			/* Round the multiplier to the closest value.*/ +			multiplier = (multiplier + round/2) / round; +			multiplier = min(multiplier, (u32)1023); +		} +	} +	return multiplier; +} + +static inline struct be_mcc_wrb *wrb_from_mbox(struct be_dma_mem *mbox_mem) +{ +	return &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb; +} + +int be_cmd_eq_create(struct be_ctrl_info *ctrl, +		struct be_queue_info *eq, int eq_delay) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_eq_create *req = embedded_payload(wrb); +	struct be_cmd_resp_eq_create *resp = embedded_payload(wrb); +	struct be_dma_mem *q_mem = &eq->dma_mem; +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_EQ_CREATE, sizeof(*req)); + +	req->num_pages =  cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); + +	AMAP_SET_BITS(struct amap_eq_context, func, req->context, +			ctrl->pci_func); +	AMAP_SET_BITS(struct amap_eq_context, valid, req->context, 1); +	/* 4byte eqe*/ +	AMAP_SET_BITS(struct amap_eq_context, size, req->context, 0); +	AMAP_SET_BITS(struct amap_eq_context, count, req->context, +			__ilog2_u32(eq->len/256)); +	AMAP_SET_BITS(struct amap_eq_context, delaymult, req->context, +			eq_delay_to_mult(eq_delay)); +	be_dws_cpu_to_le(req->context, sizeof(req->context)); + +	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		eq->id = le16_to_cpu(resp->eq_id); +		eq->created = true; +	} +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_mac_addr_query(struct be_ctrl_info *ctrl, u8 *mac_addr, +			u8 type, bool permanent, u32 if_handle) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_mac_query *req = embedded_payload(wrb); +	struct be_cmd_resp_mac_query *resp = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_NTWK_MAC_QUERY, sizeof(*req)); + +	req->type = type; +	if (permanent) { +		req->permanent = 1; +	} else { +		req->if_id = cpu_to_le16((u16)if_handle); +		req->permanent = 0; +	} + +	status = be_mbox_db_ring(ctrl); +	if (!status) +		memcpy(mac_addr, resp->mac.addr, ETH_ALEN); + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_pmac_add(struct be_ctrl_info *ctrl, u8 *mac_addr, +		u32 if_id, u32 *pmac_id) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_pmac_add *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_NTWK_PMAC_ADD, sizeof(*req)); + +	req->if_id = cpu_to_le32(if_id); +	memcpy(req->mac_address, mac_addr, ETH_ALEN); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		struct be_cmd_resp_pmac_add *resp = embedded_payload(wrb); +		*pmac_id = le32_to_cpu(resp->pmac_id); +	} + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_pmac_del(struct be_ctrl_info *ctrl, u32 if_id, u32 pmac_id) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_pmac_del *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_NTWK_PMAC_DEL, sizeof(*req)); + +	req->if_id = cpu_to_le32(if_id); +	req->pmac_id = cpu_to_le32(pmac_id); + +	status = be_mbox_db_ring(ctrl); +	spin_unlock(&ctrl->cmd_lock); + +	return status; +} + +int be_cmd_cq_create(struct be_ctrl_info *ctrl, +		struct be_queue_info *cq, struct be_queue_info *eq, +		bool sol_evts, bool no_delay, int coalesce_wm) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_cq_create *req = embedded_payload(wrb); +	struct be_cmd_resp_cq_create *resp = embedded_payload(wrb); +	struct be_dma_mem *q_mem = &cq->dma_mem; +	void *ctxt = &req->context; +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_CQ_CREATE, sizeof(*req)); + +	req->num_pages =  cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size)); + +	AMAP_SET_BITS(struct amap_cq_context, coalescwm, ctxt, coalesce_wm); +	AMAP_SET_BITS(struct amap_cq_context, nodelay, ctxt, no_delay); +	AMAP_SET_BITS(struct amap_cq_context, count, ctxt, +			__ilog2_u32(cq->len/256)); +	AMAP_SET_BITS(struct amap_cq_context, valid, ctxt, 1); +	AMAP_SET_BITS(struct amap_cq_context, solevent, ctxt, sol_evts); +	AMAP_SET_BITS(struct amap_cq_context, eventable, ctxt, 1); +	AMAP_SET_BITS(struct amap_cq_context, eqid, ctxt, eq->id); +	AMAP_SET_BITS(struct amap_cq_context, armed, ctxt, 0); +	AMAP_SET_BITS(struct amap_cq_context, func, ctxt, ctrl->pci_func); +	be_dws_cpu_to_le(ctxt, sizeof(req->context)); + +	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		cq->id = le16_to_cpu(resp->cq_id); +		cq->created = true; +	} +	spin_unlock(&ctrl->cmd_lock); + +	return status; +} + +int be_cmd_txq_create(struct be_ctrl_info *ctrl, +			struct be_queue_info *txq, +			struct be_queue_info *cq) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_eth_tx_create *req = embedded_payload(wrb); +	struct be_dma_mem *q_mem = &txq->dma_mem; +	void *ctxt = &req->context; +	int status; +	u32 len_encoded; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_TX_CREATE, +		sizeof(*req)); + +	req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size); +	req->ulp_num = BE_ULP1_NUM; +	req->type = BE_ETH_TX_RING_TYPE_STANDARD; + +	len_encoded = fls(txq->len); /* log2(len) + 1 */ +	if (len_encoded == 16) +		len_encoded = 0; +	AMAP_SET_BITS(struct amap_tx_context, tx_ring_size, ctxt, len_encoded); +	AMAP_SET_BITS(struct amap_tx_context, pci_func_id, ctxt, +			ctrl->pci_func); +	AMAP_SET_BITS(struct amap_tx_context, ctx_valid, ctxt, 1); +	AMAP_SET_BITS(struct amap_tx_context, cq_id_send, ctxt, cq->id); + +	be_dws_cpu_to_le(ctxt, sizeof(req->context)); + +	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		struct be_cmd_resp_eth_tx_create *resp = embedded_payload(wrb); +		txq->id = le16_to_cpu(resp->cid); +		txq->created = true; +	} +	spin_unlock(&ctrl->cmd_lock); + +	return status; +} + +int be_cmd_rxq_create(struct be_ctrl_info *ctrl, +		struct be_queue_info *rxq, u16 cq_id, u16 frag_size, +		u16 max_frame_size, u32 if_id, u32 rss) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_eth_rx_create *req = embedded_payload(wrb); +	struct be_dma_mem *q_mem = &rxq->dma_mem; +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, OPCODE_ETH_RX_CREATE, +		sizeof(*req)); + +	req->cq_id = cpu_to_le16(cq_id); +	req->frag_size = fls(frag_size) - 1; +	req->num_pages = 2; +	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem); +	req->interface_id = cpu_to_le32(if_id); +	req->max_frame_size = cpu_to_le16(max_frame_size); +	req->rss_queue = cpu_to_le32(rss); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		struct be_cmd_resp_eth_rx_create *resp = embedded_payload(wrb); +		rxq->id = le16_to_cpu(resp->id); +		rxq->created = true; +	} +	spin_unlock(&ctrl->cmd_lock); + +	return status; +} + +/* Generic destroyer function for all types of queues */ +int be_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q, +		int queue_type) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_q_destroy *req = embedded_payload(wrb); +	u8 subsys = 0, opcode = 0; +	int status; + +	spin_lock(&ctrl->cmd_lock); + +	memset(wrb, 0, sizeof(*wrb)); +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	switch (queue_type) { +	case QTYPE_EQ: +		subsys = CMD_SUBSYSTEM_COMMON; +		opcode = OPCODE_COMMON_EQ_DESTROY; +		break; +	case QTYPE_CQ: +		subsys = CMD_SUBSYSTEM_COMMON; +		opcode = OPCODE_COMMON_CQ_DESTROY; +		break; +	case QTYPE_TXQ: +		subsys = CMD_SUBSYSTEM_ETH; +		opcode = OPCODE_ETH_TX_DESTROY; +		break; +	case QTYPE_RXQ: +		subsys = CMD_SUBSYSTEM_ETH; +		opcode = OPCODE_ETH_RX_DESTROY; +		break; +	default: +		printk(KERN_WARNING DRV_NAME ":bad Q type in Q destroy cmd\n"); +		status = -1; +		goto err; +	} +	be_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req)); +	req->id = cpu_to_le16(q->id); + +	status = be_mbox_db_ring(ctrl); +err: +	spin_unlock(&ctrl->cmd_lock); + +	return status; +} + +/* Create an rx filtering policy configuration on an i/f */ +int be_cmd_if_create(struct be_ctrl_info *ctrl, u32 flags, u8 *mac, +		bool pmac_invalid, u32 *if_handle, u32 *pmac_id) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_if_create *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req)); + +	req->capability_flags = cpu_to_le32(flags); +	req->enable_flags = cpu_to_le32(flags); +	if (!pmac_invalid) +		memcpy(req->mac_addr, mac, ETH_ALEN); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		struct be_cmd_resp_if_create *resp = embedded_payload(wrb); +		*if_handle = le32_to_cpu(resp->interface_id); +		if (!pmac_invalid) +			*pmac_id = le32_to_cpu(resp->pmac_id); +	} + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_if_destroy(struct be_ctrl_info *ctrl, u32 interface_id) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_if_destroy *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_NTWK_INTERFACE_DESTROY, sizeof(*req)); + +	req->interface_id = cpu_to_le32(interface_id); +	status = be_mbox_db_ring(ctrl); + +	spin_unlock(&ctrl->cmd_lock); + +	return status; +} + +/* Get stats is a non embedded command: the request is not embedded inside + * WRB but is a separate dma memory block + */ +int be_cmd_get_stats(struct be_ctrl_info *ctrl, struct be_dma_mem *nonemb_cmd) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_get_stats *req = nonemb_cmd->va; +	struct be_sge *sge = nonembedded_sgl(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	memset(req, 0, sizeof(*req)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, +		OPCODE_ETH_GET_STATISTICS, sizeof(*req)); +	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma)); +	sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF); +	sge->len = cpu_to_le32(nonemb_cmd->size); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		struct be_cmd_resp_get_stats *resp = nonemb_cmd->va; +		be_dws_le_to_cpu(&resp->hw_stats, sizeof(resp->hw_stats)); +	} + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_link_status_query(struct be_ctrl_info *ctrl, +			struct be_link_info *link) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_link_status *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_NTWK_LINK_STATUS_QUERY, sizeof(*req)); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		struct be_cmd_resp_link_status *resp = embedded_payload(wrb); +		link->speed = resp->mac_speed; +		link->duplex = resp->mac_duplex; +		link->fault = resp->mac_fault; +	} else { +		link->speed = PHY_LINK_SPEED_ZERO; +	} + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_get_fw_ver(struct be_ctrl_info *ctrl, char *fw_ver) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_get_fw_version *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_GET_FW_VERSION, sizeof(*req)); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb); +		strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN); +	} + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +/* set the EQ delay interval of an EQ to specified value */ +int be_cmd_modify_eqd(struct be_ctrl_info *ctrl, u32 eq_id, u32 eqd) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_modify_eq_delay *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req)); + +	req->num_eq = cpu_to_le32(1); +	req->delay[0].eq_id = cpu_to_le32(eq_id); +	req->delay[0].phase = 0; +	req->delay[0].delay_multiplier = cpu_to_le32(eqd); + +	status = be_mbox_db_ring(ctrl); + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_vlan_config(struct be_ctrl_info *ctrl, u32 if_id, u16 *vtag_array, +			u32 num, bool untagged, bool promiscuous) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_vlan_config *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_NTWK_VLAN_CONFIG, sizeof(*req)); + +	req->interface_id = if_id; +	req->promiscuous = promiscuous; +	req->untagged = untagged; +	req->num_vlan = num; +	if (!promiscuous) { +		memcpy(req->normal_vlan, vtag_array, +			req->num_vlan * sizeof(vtag_array[0])); +	} + +	status = be_mbox_db_ring(ctrl); + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_promiscuous_config(struct be_ctrl_info *ctrl, u8 port_num, bool en) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_promiscuous_config *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH, +		OPCODE_ETH_PROMISCUOUS, sizeof(*req)); + +	if (port_num) +		req->port1_promiscuous = en; +	else +		req->port0_promiscuous = en; + +	status = be_mbox_db_ring(ctrl); + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_mcast_mac_set(struct be_ctrl_info *ctrl, u32 if_id, u8 *mac_table, +			u32 num, bool promiscuous) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_mcast_mac_config *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_NTWK_MULTICAST_SET, sizeof(*req)); + +	req->interface_id = if_id; +	req->promiscuous = promiscuous; +	if (!promiscuous) { +		req->num_mac = cpu_to_le16(num); +		if (num) +			memcpy(req->mac, mac_table, ETH_ALEN * num); +	} + +	status = be_mbox_db_ring(ctrl); + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_set_flow_control(struct be_ctrl_info *ctrl, u32 tx_fc, u32 rx_fc) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_set_flow_control *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); + +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_SET_FLOW_CONTROL, sizeof(*req)); + +	req->tx_flow_control = cpu_to_le16((u16)tx_fc); +	req->rx_flow_control = cpu_to_le16((u16)rx_fc); + +	status = be_mbox_db_ring(ctrl); + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_get_flow_control(struct be_ctrl_info *ctrl, u32 *tx_fc, u32 *rx_fc) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_get_flow_control *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); + +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req)); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		struct be_cmd_resp_get_flow_control *resp = +						embedded_payload(wrb); +		*tx_fc = le16_to_cpu(resp->tx_flow_control); +		*rx_fc = le16_to_cpu(resp->rx_flow_control); +	} + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} + +int be_cmd_query_fw_cfg(struct be_ctrl_info *ctrl, u32 *port_num) +{ +	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem); +	struct be_cmd_req_query_fw_cfg *req = embedded_payload(wrb); +	int status; + +	spin_lock(&ctrl->cmd_lock); + +	memset(wrb, 0, sizeof(*wrb)); + +	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0); + +	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, +		OPCODE_COMMON_QUERY_FIRMWARE_CONFIG, sizeof(*req)); + +	status = be_mbox_db_ring(ctrl); +	if (!status) { +		struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb); +		*port_num = le32_to_cpu(resp->phys_port); +	} + +	spin_unlock(&ctrl->cmd_lock); +	return status; +} diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h new file mode 100644 index 00000000000..e499e2d5b8c --- /dev/null +++ b/drivers/net/benet/be_cmds.h @@ -0,0 +1,688 @@ +/* + * Copyright (C) 2005 - 2009 ServerEngines + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation.  The full GNU General + * Public License is included in this distribution in the file called COPYING. + * + * Contact Information: + * linux-drivers@serverengines.com + * + * ServerEngines + * 209 N. Fair Oaks Ave + * Sunnyvale, CA 94085 + */ + +/* + * The driver sends configuration and managements command requests to the + * firmware in the BE. These requests are communicated to the processor + * using Work Request Blocks (WRBs) submitted to the MCC-WRB ring or via one + * WRB inside a MAILBOX. + * The commands are serviced by the ARM processor in the BladeEngine's MPU. + */ + +struct be_sge { +	u32 pa_lo; +	u32 pa_hi; +	u32 len; +}; + +#define MCC_WRB_EMBEDDED_MASK	1 	/* bit 0 of dword 0*/ +#define MCC_WRB_SGE_CNT_SHIFT	3	/* bits 3 - 7 of dword 0 */ +#define MCC_WRB_SGE_CNT_MASK	0x1F	/* bits 3 - 7 of dword 0 */ +struct be_mcc_wrb { +	u32 embedded;		/* dword 0 */ +	u32 payload_length;	/* dword 1 */ +	u32 tag0;		/* dword 2 */ +	u32 tag1;		/* dword 3 */ +	u32 rsvd;		/* dword 4 */ +	union { +		u8 embedded_payload[236]; /* used by embedded cmds */ +		struct be_sge sgl[19];    /* used by non-embedded cmds */ +	} payload; +}; + +#define CQE_FLAGS_VALID_MASK 		(1 << 31) +#define CQE_FLAGS_ASYNC_MASK 		(1 << 30) +#define CQE_FLAGS_COMPLETED_MASK 	(1 << 28) +#define CQE_FLAGS_CONSUMED_MASK 	(1 << 27) + +/* Completion Status */ +enum { +	MCC_STATUS_SUCCESS = 0x0, +/* The client does not have sufficient privileges to execute the command */ +	MCC_STATUS_INSUFFICIENT_PRIVILEGES = 0x1, +/* A parameter in the command was invalid. */ +	MCC_STATUS_INVALID_PARAMETER = 0x2, +/* There are insufficient chip resources to execute the command */ +	MCC_STATUS_INSUFFICIENT_RESOURCES = 0x3, +/* The command is completing because the queue was getting flushed */ +	MCC_STATUS_QUEUE_FLUSHING = 0x4, +/* The command is completing with a DMA error */ +	MCC_STATUS_DMA_FAILED = 0x5 +}; + +#define CQE_STATUS_COMPL_MASK		0xFFFF +#define CQE_STATUS_COMPL_SHIFT		0	/* bits 0 - 15 */ +#define CQE_STATUS_EXTD_MASK		0xFFFF +#define CQE_STATUS_EXTD_SHIFT		0	/* bits 0 - 15 */ + +struct be_mcc_cq_entry { +	u32 status;		/* dword 0 */ +	u32 tag0;		/* dword 1 */ +	u32 tag1;		/* dword 2 */ +	u32 flags;		/* dword 3 */ +}; + +struct be_mcc_mailbox { +	struct be_mcc_wrb wrb; +	struct be_mcc_cq_entry cqe; +}; + +#define CMD_SUBSYSTEM_COMMON	0x1 +#define CMD_SUBSYSTEM_ETH 	0x3 + +#define OPCODE_COMMON_NTWK_MAC_QUERY			1 +#define OPCODE_COMMON_NTWK_MAC_SET			2 +#define OPCODE_COMMON_NTWK_MULTICAST_SET		3 +#define OPCODE_COMMON_NTWK_VLAN_CONFIG  		4 +#define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY		5 +#define OPCODE_COMMON_CQ_CREATE				12 +#define OPCODE_COMMON_EQ_CREATE				13 +#define OPCODE_COMMON_MCC_CREATE        		21 +#define OPCODE_COMMON_NTWK_RX_FILTER    		34 +#define OPCODE_COMMON_GET_FW_VERSION			35 +#define OPCODE_COMMON_SET_FLOW_CONTROL			36 +#define OPCODE_COMMON_GET_FLOW_CONTROL			37 +#define OPCODE_COMMON_SET_FRAME_SIZE			39 +#define OPCODE_COMMON_MODIFY_EQ_DELAY			41 +#define OPCODE_COMMON_FIRMWARE_CONFIG			42 +#define OPCODE_COMMON_NTWK_INTERFACE_CREATE 		50 +#define OPCODE_COMMON_NTWK_INTERFACE_DESTROY 		51 +#define OPCODE_COMMON_CQ_DESTROY        		54 +#define OPCODE_COMMON_EQ_DESTROY        		55 +#define OPCODE_COMMON_QUERY_FIRMWARE_CONFIG		58 +#define OPCODE_COMMON_NTWK_PMAC_ADD			59 +#define OPCODE_COMMON_NTWK_PMAC_DEL			60 + +#define OPCODE_ETH_ACPI_CONFIG				2 +#define OPCODE_ETH_PROMISCUOUS				3 +#define OPCODE_ETH_GET_STATISTICS			4 +#define OPCODE_ETH_TX_CREATE				7 +#define OPCODE_ETH_RX_CREATE            		8 +#define OPCODE_ETH_TX_DESTROY           		9 +#define OPCODE_ETH_RX_DESTROY           		10 + +struct be_cmd_req_hdr { +	u8 opcode;		/* dword 0 */ +	u8 subsystem;		/* dword 0 */ +	u8 port_number;		/* dword 0 */ +	u8 domain;		/* dword 0 */ +	u32 timeout;		/* dword 1 */ +	u32 request_length;	/* dword 2 */ +	u32 rsvd;		/* dword 3 */ +}; + +#define RESP_HDR_INFO_OPCODE_SHIFT	0	/* bits 0 - 7 */ +#define RESP_HDR_INFO_SUBSYS_SHIFT	8 	/* bits 8 - 15 */ +struct be_cmd_resp_hdr { +	u32 info;		/* dword 0 */ +	u32 status;		/* dword 1 */ +	u32 response_length;	/* dword 2 */ +	u32 actual_resp_len;	/* dword 3 */ +}; + +struct phys_addr { +	u32 lo; +	u32 hi; +}; + +/************************** + * BE Command definitions * + **************************/ + +/* Pseudo amap definition in which each bit of the actual structure is defined + * as a byte: used to calculate offset/shift/mask of each field */ +struct amap_eq_context { +	u8 cidx[13];		/* dword 0*/ +	u8 rsvd0[3];		/* dword 0*/ +	u8 epidx[13];		/* dword 0*/ +	u8 valid;		/* dword 0*/ +	u8 rsvd1;		/* dword 0*/ +	u8 size;		/* dword 0*/ +	u8 pidx[13];		/* dword 1*/ +	u8 rsvd2[3];		/* dword 1*/ +	u8 pd[10];		/* dword 1*/ +	u8 count[3];		/* dword 1*/ +	u8 solevent;		/* dword 1*/ +	u8 stalled;		/* dword 1*/ +	u8 armed;		/* dword 1*/ +	u8 rsvd3[4];		/* dword 2*/ +	u8 func[8];		/* dword 2*/ +	u8 rsvd4;		/* dword 2*/ +	u8 delaymult[10];	/* dword 2*/ +	u8 rsvd5[2];		/* dword 2*/ +	u8 phase[2];		/* dword 2*/ +	u8 nodelay;		/* dword 2*/ +	u8 rsvd6[4];		/* dword 2*/ +	u8 rsvd7[32];		/* dword 3*/ +} __packed; + +struct be_cmd_req_eq_create { +	struct be_cmd_req_hdr hdr; +	u16 num_pages;		/* sword */ +	u16 rsvd0;		/* sword */ +	u8 context[sizeof(struct amap_eq_context) / 8]; +	struct phys_addr pages[8]; +} __packed; + +struct be_cmd_resp_eq_create { +	struct be_cmd_resp_hdr resp_hdr; +	u16 eq_id;		/* sword */ +	u16 rsvd0;		/* sword */ +} __packed; + +/******************** Mac query ***************************/ +enum { +	MAC_ADDRESS_TYPE_STORAGE = 0x0, +	MAC_ADDRESS_TYPE_NETWORK = 0x1, +	MAC_ADDRESS_TYPE_PD = 0x2, +	MAC_ADDRESS_TYPE_MANAGEMENT = 0x3 +}; + +struct mac_addr { +	u16 size_of_struct; +	u8 addr[ETH_ALEN]; +} __packed; + +struct be_cmd_req_mac_query { +	struct be_cmd_req_hdr hdr; +	u8 type; +	u8 permanent; +	u16 if_id; +} __packed; + +struct be_cmd_resp_mac_query { +	struct be_cmd_resp_hdr hdr; +	struct mac_addr mac; +}; + +/******************** PMac Add ***************************/ +struct be_cmd_req_pmac_add { +	struct be_cmd_req_hdr hdr; +	u32 if_id; +	u8 mac_address[ETH_ALEN]; +	u8 rsvd0[2]; +} __packed; + +struct be_cmd_resp_pmac_add { +	struct be_cmd_resp_hdr hdr; +	u32 pmac_id; +}; + +/******************** PMac Del ***************************/ +struct be_cmd_req_pmac_del { +	struct be_cmd_req_hdr hdr; +	u32 if_id; +	u32 pmac_id; +}; + +/******************** Create CQ ***************************/ +/* Pseudo amap definition in which each bit of the actual structure is defined + * as a byte: used to calculate offset/shift/mask of each field */ +struct amap_cq_context { +	u8 cidx[11];		/* dword 0*/ +	u8 rsvd0;		/* dword 0*/ +	u8 coalescwm[2];	/* dword 0*/ +	u8 nodelay;		/* dword 0*/ +	u8 epidx[11];		/* dword 0*/ +	u8 rsvd1;		/* dword 0*/ +	u8 count[2];		/* dword 0*/ +	u8 valid;		/* dword 0*/ +	u8 solevent;		/* dword 0*/ +	u8 eventable;		/* dword 0*/ +	u8 pidx[11];		/* dword 1*/ +	u8 rsvd2;		/* dword 1*/ +	u8 pd[10];		/* dword 1*/ +	u8 eqid[8];		/* dword 1*/ +	u8 stalled;		/* dword 1*/ +	u8 armed;		/* dword 1*/ +	u8 rsvd3[4];		/* dword 2*/ +	u8 func[8];		/* dword 2*/ +	u8 rsvd4[20];		/* dword 2*/ +	u8 rsvd5[32];		/* dword 3*/ +} __packed; + +struct be_cmd_req_cq_create { +	struct be_cmd_req_hdr hdr; +	u16 num_pages; +	u16 rsvd0; +	u8 context[sizeof(struct amap_cq_context) / 8]; +	struct phys_addr pages[8]; +} __packed; + +struct be_cmd_resp_cq_create { +	struct be_cmd_resp_hdr hdr; +	u16 cq_id; +	u16 rsvd0; +} __packed; + +/******************** Create TxQ ***************************/ +#define BE_ETH_TX_RING_TYPE_STANDARD    	2 +#define BE_ULP1_NUM				1 + +/* Pseudo amap definition in which each bit of the actual structure is defined + * as a byte: used to calculate offset/shift/mask of each field */ +struct amap_tx_context { +	u8 rsvd0[16];		/* dword 0 */ +	u8 tx_ring_size[4];	/* dword 0 */ +	u8 rsvd1[26];		/* dword 0 */ +	u8 pci_func_id[8];	/* dword 1 */ +	u8 rsvd2[9];		/* dword 1 */ +	u8 ctx_valid;		/* dword 1 */ +	u8 cq_id_send[16];	/* dword 2 */ +	u8 rsvd3[16];		/* dword 2 */ +	u8 rsvd4[32];		/* dword 3 */ +	u8 rsvd5[32];		/* dword 4 */ +	u8 rsvd6[32];		/* dword 5 */ +	u8 rsvd7[32];		/* dword 6 */ +	u8 rsvd8[32];		/* dword 7 */ +	u8 rsvd9[32];		/* dword 8 */ +	u8 rsvd10[32];		/* dword 9 */ +	u8 rsvd11[32];		/* dword 10 */ +	u8 rsvd12[32];		/* dword 11 */ +	u8 rsvd13[32];		/* dword 12 */ +	u8 rsvd14[32];		/* dword 13 */ +	u8 rsvd15[32];		/* dword 14 */ +	u8 rsvd16[32];		/* dword 15 */ +} __packed; + +struct be_cmd_req_eth_tx_create { +	struct be_cmd_req_hdr hdr; +	u8 num_pages; +	u8 ulp_num; +	u8 type; +	u8 bound_port; +	u8 context[sizeof(struct amap_tx_context) / 8]; +	struct phys_addr pages[8]; +} __packed; + +struct be_cmd_resp_eth_tx_create { +	struct be_cmd_resp_hdr hdr; +	u16 cid; +	u16 rsvd0; +} __packed; + +/******************** Create RxQ ***************************/ +struct be_cmd_req_eth_rx_create { +	struct be_cmd_req_hdr hdr; +	u16 cq_id; +	u8 frag_size; +	u8 num_pages; +	struct phys_addr pages[2]; +	u32 interface_id; +	u16 max_frame_size; +	u16 rsvd0; +	u32 rss_queue; +} __packed; + +struct be_cmd_resp_eth_rx_create { +	struct be_cmd_resp_hdr hdr; +	u16 id; +	u8 cpu_id; +	u8 rsvd0; +} __packed; + +/******************** Q Destroy  ***************************/ +/* Type of Queue to be destroyed */ +enum { +	QTYPE_EQ = 1, +	QTYPE_CQ, +	QTYPE_TXQ, +	QTYPE_RXQ +}; + +struct be_cmd_req_q_destroy { +	struct be_cmd_req_hdr hdr; +	u16 id; +	u16 bypass_flush;	/* valid only for rx q destroy */ +} __packed; + +/************ I/f Create (it's actually I/f Config Create)**********/ + +/* Capability flags for the i/f */ +enum be_if_flags { +	BE_IF_FLAGS_RSS = 0x4, +	BE_IF_FLAGS_PROMISCUOUS = 0x8, +	BE_IF_FLAGS_BROADCAST = 0x10, +	BE_IF_FLAGS_UNTAGGED = 0x20, +	BE_IF_FLAGS_ULP = 0x40, +	BE_IF_FLAGS_VLAN_PROMISCUOUS = 0x80, +	BE_IF_FLAGS_VLAN = 0x100, +	BE_IF_FLAGS_MCAST_PROMISCUOUS = 0x200, +	BE_IF_FLAGS_PASS_L2_ERRORS = 0x400, +	BE_IF_FLAGS_PASS_L3L4_ERRORS = 0x800 +}; + +/* An RX interface is an object with one or more MAC addresses and + * filtering capabilities. */ +struct be_cmd_req_if_create { +	struct be_cmd_req_hdr hdr; +	u32 version;		/* ignore currntly */ +	u32 capability_flags; +	u32 enable_flags; +	u8 mac_addr[ETH_ALEN]; +	u8 rsvd0; +	u8 pmac_invalid; /* if set, don't attach the mac addr to the i/f */ +	u32 vlan_tag;	 /* not used currently */ +} __packed; + +struct be_cmd_resp_if_create { +	struct be_cmd_resp_hdr hdr; +	u32 interface_id; +	u32 pmac_id; +}; + +/****** I/f Destroy(it's actually I/f Config Destroy )**********/ +struct be_cmd_req_if_destroy { +	struct be_cmd_req_hdr hdr; +	u32 interface_id; +}; + +/*************** HW Stats Get **********************************/ +struct be_port_rxf_stats { +	u32 rx_bytes_lsd;	/* dword 0*/ +	u32 rx_bytes_msd;	/* dword 1*/ +	u32 rx_total_frames;	/* dword 2*/ +	u32 rx_unicast_frames;	/* dword 3*/ +	u32 rx_multicast_frames;	/* dword 4*/ +	u32 rx_broadcast_frames;	/* dword 5*/ +	u32 rx_crc_errors;	/* dword 6*/ +	u32 rx_alignment_symbol_errors;	/* dword 7*/ +	u32 rx_pause_frames;	/* dword 8*/ +	u32 rx_control_frames;	/* dword 9*/ +	u32 rx_in_range_errors;	/* dword 10*/ +	u32 rx_out_range_errors;	/* dword 11*/ +	u32 rx_frame_too_long;	/* dword 12*/ +	u32 rx_address_match_errors;	/* dword 13*/ +	u32 rx_vlan_mismatch;	/* dword 14*/ +	u32 rx_dropped_too_small;	/* dword 15*/ +	u32 rx_dropped_too_short;	/* dword 16*/ +	u32 rx_dropped_header_too_small;	/* dword 17*/ +	u32 rx_dropped_tcp_length;	/* dword 18*/ +	u32 rx_dropped_runt;	/* dword 19*/ +	u32 rx_64_byte_packets;	/* dword 20*/ +	u32 rx_65_127_byte_packets;	/* dword 21*/ +	u32 rx_128_256_byte_packets;	/* dword 22*/ +	u32 rx_256_511_byte_packets;	/* dword 23*/ +	u32 rx_512_1023_byte_packets;	/* dword 24*/ +	u32 rx_1024_1518_byte_packets;	/* dword 25*/ +	u32 rx_1519_2047_byte_packets;	/* dword 26*/ +	u32 rx_2048_4095_byte_packets;	/* dword 27*/ +	u32 rx_4096_8191_byte_packets;	/* dword 28*/ +	u32 rx_8192_9216_byte_packets;	/* dword 29*/ +	u32 rx_ip_checksum_errs;	/* dword 30*/ +	u32 rx_tcp_checksum_errs;	/* dword 31*/ +	u32 rx_udp_checksum_errs;	/* dword 32*/ +	u32 rx_non_rss_packets;	/* dword 33*/ +	u32 rx_ipv4_packets;	/* dword 34*/ +	u32 rx_ipv6_packets;	/* dword 35*/ +	u32 rx_ipv4_bytes_lsd;	/* dword 36*/ +	u32 rx_ipv4_bytes_msd;	/* dword 37*/ +	u32 rx_ipv6_bytes_lsd;	/* dword 38*/ +	u32 rx_ipv6_bytes_msd;	/* dword 39*/ +	u32 rx_chute1_packets;	/* dword 40*/ +	u32 rx_chute2_packets;	/* dword 41*/ +	u32 rx_chute3_packets;	/* dword 42*/ +	u32 rx_management_packets;	/* dword 43*/ +	u32 rx_switched_unicast_packets;	/* dword 44*/ +	u32 rx_switched_multicast_packets;	/* dword 45*/ +	u32 rx_switched_broadcast_packets;	/* dword 46*/ +	u32 tx_bytes_lsd;	/* dword 47*/ +	u32 tx_bytes_msd;	/* dword 48*/ +	u32 tx_unicastframes;	/* dword 49*/ +	u32 tx_multicastframes;	/* dword 50*/ +	u32 tx_broadcastframes;	/* dword 51*/ +	u32 tx_pauseframes;	/* dword 52*/ +	u32 tx_controlframes;	/* dword 53*/ +	u32 tx_64_byte_packets;	/* dword 54*/ +	u32 tx_65_127_byte_packets;	/* dword 55*/ +	u32 tx_128_256_byte_packets;	/* dword 56*/ +	u32 tx_256_511_byte_packets;	/* dword 57*/ +	u32 tx_512_1023_byte_packets;	/* dword 58*/ +	u32 tx_1024_1518_byte_packets;	/* dword 59*/ +	u32 tx_1519_2047_byte_packets;	/* dword 60*/ +	u32 tx_2048_4095_byte_packets;	/* dword 61*/ +	u32 tx_4096_8191_byte_packets;	/* dword 62*/ +	u32 tx_8192_9216_byte_packets;	/* dword 63*/ +	u32 rx_fifo_overflow;	/* dword 64*/ +	u32 rx_input_fifo_overflow;	/* dword 65*/ +}; + +struct be_rxf_stats { +	struct be_port_rxf_stats port[2]; +	u32 rx_drops_no_pbuf;	/* dword 132*/ +	u32 rx_drops_no_txpb;	/* dword 133*/ +	u32 rx_drops_no_erx_descr;	/* dword 134*/ +	u32 rx_drops_no_tpre_descr;	/* dword 135*/ +	u32 management_rx_port_packets;	/* dword 136*/ +	u32 management_rx_port_bytes;	/* dword 137*/ +	u32 management_rx_port_pause_frames;	/* dword 138*/ +	u32 management_rx_port_errors;	/* dword 139*/ +	u32 management_tx_port_packets;	/* dword 140*/ +	u32 management_tx_port_bytes;	/* dword 141*/ +	u32 management_tx_port_pause;	/* dword 142*/ +	u32 management_rx_port_rxfifo_overflow;	/* dword 143*/ +	u32 rx_drops_too_many_frags;	/* dword 144*/ +	u32 rx_drops_invalid_ring;	/* dword 145*/ +	u32 forwarded_packets;	/* dword 146*/ +	u32 rx_drops_mtu;	/* dword 147*/ +	u32 rsvd0[15]; +}; + +struct be_erx_stats { +	u32 rx_drops_no_fragments[44];     /* dwordS 0 to 43*/ +	u32 debug_wdma_sent_hold;          /* dword 44*/ +	u32 debug_wdma_pbfree_sent_hold;   /* dword 45*/ +	u32 debug_wdma_zerobyte_pbfree_sent_hold; /* dword 46*/ +	u32 debug_pmem_pbuf_dealloc;       /* dword 47*/ +}; + +struct be_hw_stats { +	struct be_rxf_stats rxf; +	u32 rsvd[48]; +	struct be_erx_stats erx; +}; + +struct be_cmd_req_get_stats { +	struct be_cmd_req_hdr hdr; +	u8 rsvd[sizeof(struct be_hw_stats)]; +}; + +struct be_cmd_resp_get_stats { +	struct be_cmd_resp_hdr hdr; +	struct be_hw_stats hw_stats; +}; + +struct be_cmd_req_vlan_config { +	struct be_cmd_req_hdr hdr; +	u8 interface_id; +	u8 promiscuous; +	u8 untagged; +	u8 num_vlan; +	u16 normal_vlan[64]; +} __packed; + +struct be_cmd_req_promiscuous_config { +	struct be_cmd_req_hdr hdr; +	u8 port0_promiscuous; +	u8 port1_promiscuous; +	u16 rsvd0; +} __packed; + +struct macaddr { +	u8 byte[ETH_ALEN]; +}; + +struct be_cmd_req_mcast_mac_config { +	struct be_cmd_req_hdr hdr; +	u16 num_mac; +	u8 promiscuous; +	u8 interface_id; +	struct macaddr mac[32]; +} __packed; + +static inline struct be_hw_stats * +hw_stats_from_cmd(struct be_cmd_resp_get_stats *cmd) +{ +	return &cmd->hw_stats; +} + +/******************** Link Status Query *******************/ +struct be_cmd_req_link_status { +	struct be_cmd_req_hdr hdr; +	u32 rsvd; +}; + +struct be_link_info { +	u8 duplex; +	u8 speed; +	u8 fault; +}; + +enum { +	PHY_LINK_DUPLEX_NONE = 0x0, +	PHY_LINK_DUPLEX_HALF = 0x1, +	PHY_LINK_DUPLEX_FULL = 0x2 +}; + +enum { +	PHY_LINK_SPEED_ZERO = 0x0, 	/* => No link */ +	PHY_LINK_SPEED_10MBPS = 0x1, +	PHY_LINK_SPEED_100MBPS = 0x2, +	PHY_LINK_SPEED_1GBPS = 0x3, +	PHY_LINK_SPEED_10GBPS = 0x4 +}; + +struct be_cmd_resp_link_status { +	struct be_cmd_resp_hdr hdr; +	u8 physical_port; +	u8 mac_duplex; +	u8 mac_speed; +	u8 mac_fault; +	u8 mgmt_mac_duplex; +	u8 mgmt_mac_speed; +	u16 rsvd0; +} __packed; + +/******************** Get FW Version *******************/ +#define FW_VER_LEN			32 +struct be_cmd_req_get_fw_version { +	struct be_cmd_req_hdr hdr; +	u8 rsvd0[FW_VER_LEN]; +	u8 rsvd1[FW_VER_LEN]; +} __packed; + +struct be_cmd_resp_get_fw_version { +	struct be_cmd_resp_hdr hdr; +	u8 firmware_version_string[FW_VER_LEN]; +	u8 fw_on_flash_version_string[FW_VER_LEN]; +} __packed; + +/******************** Set Flow Contrl *******************/ +struct be_cmd_req_set_flow_control { +	struct be_cmd_req_hdr hdr; +	u16 tx_flow_control; +	u16 rx_flow_control; +} __packed; + +/******************** Get Flow Contrl *******************/ +struct be_cmd_req_get_flow_control { +	struct be_cmd_req_hdr hdr; +	u32 rsvd; +}; + +struct be_cmd_resp_get_flow_control { +	struct be_cmd_resp_hdr hdr; +	u16 tx_flow_control; +	u16 rx_flow_control; +} __packed; + +/******************** Modify EQ Delay *******************/ +struct be_cmd_req_modify_eq_delay { +	struct be_cmd_req_hdr hdr; +	u32 num_eq; +	struct { +		u32 eq_id; +		u32 phase; +		u32 delay_multiplier; +	} delay[8]; +} __packed; + +struct be_cmd_resp_modify_eq_delay { +	struct be_cmd_resp_hdr hdr; +	u32 rsvd0; +} __packed; + +/******************** Get FW Config *******************/ +struct be_cmd_req_query_fw_cfg { +	struct be_cmd_req_hdr hdr; +	u32 rsvd[30]; +}; + +struct be_cmd_resp_query_fw_cfg { +	struct be_cmd_resp_hdr hdr; +	u32 be_config_number; +	u32 asic_revision; +	u32 phys_port; +	u32 function_mode; +	u32 rsvd[26]; +}; + +extern int be_pci_fnum_get(struct be_ctrl_info *ctrl); +extern int be_cmd_POST(struct be_ctrl_info *ctrl); +extern int be_cmd_mac_addr_query(struct be_ctrl_info *ctrl, u8 *mac_addr, +			u8 type, bool permanent, u32 if_handle); +extern int be_cmd_pmac_add(struct be_ctrl_info *ctrl, u8 *mac_addr, +			u32 if_id, u32 *pmac_id); +extern int be_cmd_pmac_del(struct be_ctrl_info *ctrl, u32 if_id, u32 pmac_id); +extern int be_cmd_if_create(struct be_ctrl_info *ctrl, u32 if_flags, u8 *mac, +			bool pmac_invalid, u32 *if_handle, u32 *pmac_id); +extern int be_cmd_if_destroy(struct be_ctrl_info *ctrl, u32 if_handle); +extern int be_cmd_eq_create(struct be_ctrl_info *ctrl, +			struct be_queue_info *eq, int eq_delay); +extern int be_cmd_cq_create(struct be_ctrl_info *ctrl, +			struct be_queue_info *cq, struct be_queue_info *eq, +			bool sol_evts, bool no_delay, +			int num_cqe_dma_coalesce); +extern int be_cmd_txq_create(struct be_ctrl_info *ctrl, +			struct be_queue_info *txq, +			struct be_queue_info *cq); +extern int be_cmd_rxq_create(struct be_ctrl_info *ctrl, +			struct be_queue_info *rxq, u16 cq_id, +			u16 frag_size, u16 max_frame_size, u32 if_id, +			u32 rss); +extern int be_cmd_q_destroy(struct be_ctrl_info *ctrl, struct be_queue_info *q, +			int type); +extern int be_cmd_link_status_query(struct be_ctrl_info *ctrl, +			struct be_link_info *link); +extern int be_cmd_reset(struct be_ctrl_info *ctrl); +extern int be_cmd_get_stats(struct be_ctrl_info *ctrl, +			struct be_dma_mem *nonemb_cmd); +extern int be_cmd_get_fw_ver(struct be_ctrl_info *ctrl, char *fw_ver); + +extern int be_cmd_modify_eqd(struct be_ctrl_info *ctrl, u32 eq_id, u32 eqd); +extern int be_cmd_vlan_config(struct be_ctrl_info *ctrl, u32 if_id, +			u16 *vtag_array, u32 num, bool untagged, +			bool promiscuous); +extern int be_cmd_promiscuous_config(struct be_ctrl_info *ctrl, +			u8 port_num, bool en); +extern int be_cmd_mcast_mac_set(struct be_ctrl_info *ctrl, u32 if_id, +			u8 *mac_table, u32 num, bool promiscuous); +extern int be_cmd_set_flow_control(struct be_ctrl_info *ctrl, +			u32 tx_fc, u32 rx_fc); +extern int be_cmd_get_flow_control(struct be_ctrl_info *ctrl, +			u32 *tx_fc, u32 *rx_fc); +extern int be_cmd_query_fw_cfg(struct be_ctrl_info *ctrl, u32 *port_num); diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c new file mode 100644 index 00000000000..04f4b73fa8d --- /dev/null +++ b/drivers/net/benet/be_ethtool.c @@ -0,0 +1,362 @@ +/* + * Copyright (C) 2005 - 2009 ServerEngines + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation.  The full GNU General + * Public License is included in this distribution in the file called COPYING. + * + * Contact Information: + * linux-drivers@serverengines.com + * + * ServerEngines + * 209 N. Fair Oaks Ave + * Sunnyvale, CA 94085 + */ + +#include "be.h" +#include <linux/ethtool.h> + +struct be_ethtool_stat { +	char desc[ETH_GSTRING_LEN]; +	int type; +	int size; +	int offset; +}; + +enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT, ERXSTAT}; +#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \ +					offsetof(_struct, field) +#define NETSTAT_INFO(field) 	#field, NETSTAT,\ +					FIELDINFO(struct net_device_stats,\ +						field) +#define DRVSTAT_INFO(field) 	#field, DRVSTAT,\ +					FIELDINFO(struct be_drvr_stats, field) +#define MISCSTAT_INFO(field) 	#field, MISCSTAT,\ +					FIELDINFO(struct be_rxf_stats, field) +#define PORTSTAT_INFO(field) 	#field, PORTSTAT,\ +					FIELDINFO(struct be_port_rxf_stats, \ +						field) +#define ERXSTAT_INFO(field) 	#field, ERXSTAT,\ +					FIELDINFO(struct be_erx_stats, field) + +static const struct be_ethtool_stat et_stats[] = { +	{NETSTAT_INFO(rx_packets)}, +	{NETSTAT_INFO(tx_packets)}, +	{NETSTAT_INFO(rx_bytes)}, +	{NETSTAT_INFO(tx_bytes)}, +	{NETSTAT_INFO(rx_errors)}, +	{NETSTAT_INFO(tx_errors)}, +	{NETSTAT_INFO(rx_dropped)}, +	{NETSTAT_INFO(tx_dropped)}, +	{DRVSTAT_INFO(be_tx_reqs)}, +	{DRVSTAT_INFO(be_tx_stops)}, +	{DRVSTAT_INFO(be_fwd_reqs)}, +	{DRVSTAT_INFO(be_tx_wrbs)}, +	{DRVSTAT_INFO(be_polls)}, +	{DRVSTAT_INFO(be_tx_events)}, +	{DRVSTAT_INFO(be_rx_events)}, +	{DRVSTAT_INFO(be_tx_compl)}, +	{DRVSTAT_INFO(be_rx_compl)}, +	{DRVSTAT_INFO(be_ethrx_post_fail)}, +	{DRVSTAT_INFO(be_802_3_dropped_frames)}, +	{DRVSTAT_INFO(be_802_3_malformed_frames)}, +	{DRVSTAT_INFO(be_tx_rate)}, +	{DRVSTAT_INFO(be_rx_rate)}, +	{PORTSTAT_INFO(rx_unicast_frames)}, +	{PORTSTAT_INFO(rx_multicast_frames)}, +	{PORTSTAT_INFO(rx_broadcast_frames)}, +	{PORTSTAT_INFO(rx_crc_errors)}, +	{PORTSTAT_INFO(rx_alignment_symbol_errors)}, +	{PORTSTAT_INFO(rx_pause_frames)}, +	{PORTSTAT_INFO(rx_control_frames)}, +	{PORTSTAT_INFO(rx_in_range_errors)}, +	{PORTSTAT_INFO(rx_out_range_errors)}, +	{PORTSTAT_INFO(rx_frame_too_long)}, +	{PORTSTAT_INFO(rx_address_match_errors)}, +	{PORTSTAT_INFO(rx_vlan_mismatch)}, +	{PORTSTAT_INFO(rx_dropped_too_small)}, +	{PORTSTAT_INFO(rx_dropped_too_short)}, +	{PORTSTAT_INFO(rx_dropped_header_too_small)}, +	{PORTSTAT_INFO(rx_dropped_tcp_length)}, +	{PORTSTAT_INFO(rx_dropped_runt)}, +	{PORTSTAT_INFO(rx_fifo_overflow)}, +	{PORTSTAT_INFO(rx_input_fifo_overflow)}, +	{PORTSTAT_INFO(rx_ip_checksum_errs)}, +	{PORTSTAT_INFO(rx_tcp_checksum_errs)}, +	{PORTSTAT_INFO(rx_udp_checksum_errs)}, +	{PORTSTAT_INFO(rx_non_rss_packets)}, +	{PORTSTAT_INFO(rx_ipv4_packets)}, +	{PORTSTAT_INFO(rx_ipv6_packets)}, +	{PORTSTAT_INFO(tx_unicastframes)}, +	{PORTSTAT_INFO(tx_multicastframes)}, +	{PORTSTAT_INFO(tx_broadcastframes)}, +	{PORTSTAT_INFO(tx_pauseframes)}, +	{PORTSTAT_INFO(tx_controlframes)}, +	{MISCSTAT_INFO(rx_drops_no_pbuf)}, +	{MISCSTAT_INFO(rx_drops_no_txpb)}, +	{MISCSTAT_INFO(rx_drops_no_erx_descr)}, +	{MISCSTAT_INFO(rx_drops_no_tpre_descr)}, +	{MISCSTAT_INFO(rx_drops_too_many_frags)}, +	{MISCSTAT_INFO(rx_drops_invalid_ring)}, +	{MISCSTAT_INFO(forwarded_packets)}, +	{MISCSTAT_INFO(rx_drops_mtu)}, +	{ERXSTAT_INFO(rx_drops_no_fragments)}, +}; +#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats) + +static void +be_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) +{ +	struct be_adapter *adapter = netdev_priv(netdev); + +	strcpy(drvinfo->driver, DRV_NAME); +	strcpy(drvinfo->version, DRV_VER); +	strncpy(drvinfo->fw_version, adapter->fw_ver, FW_VER_LEN); +	strcpy(drvinfo->bus_info, pci_name(adapter->pdev)); +	drvinfo->testinfo_len = 0; +	drvinfo->regdump_len = 0; +	drvinfo->eedump_len = 0; +} + +static int +be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	struct be_eq_obj *rx_eq = &adapter->rx_eq; +	struct be_eq_obj *tx_eq = &adapter->tx_eq; + +	coalesce->rx_max_coalesced_frames = adapter->max_rx_coal; + +	coalesce->rx_coalesce_usecs = rx_eq->cur_eqd; +	coalesce->rx_coalesce_usecs_high = rx_eq->max_eqd; +	coalesce->rx_coalesce_usecs_low = rx_eq->min_eqd; + +	coalesce->tx_coalesce_usecs = tx_eq->cur_eqd; +	coalesce->tx_coalesce_usecs_high = tx_eq->max_eqd; +	coalesce->tx_coalesce_usecs_low = tx_eq->min_eqd; + +	coalesce->use_adaptive_rx_coalesce = rx_eq->enable_aic; +	coalesce->use_adaptive_tx_coalesce = tx_eq->enable_aic; + +	return 0; +} + +/* + * This routine is used to set interrup coalescing delay *as well as* + * the number of pkts to coalesce for LRO. + */ +static int +be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	struct be_ctrl_info *ctrl = &adapter->ctrl; +	struct be_eq_obj *rx_eq = &adapter->rx_eq; +	struct be_eq_obj *tx_eq = &adapter->tx_eq; +	u32 tx_max, tx_min, tx_cur; +	u32 rx_max, rx_min, rx_cur; +	int status = 0; + +	if (coalesce->use_adaptive_tx_coalesce == 1) +		return -EINVAL; + +	adapter->max_rx_coal = coalesce->rx_max_coalesced_frames; +	if (adapter->max_rx_coal > MAX_SKB_FRAGS) +		adapter->max_rx_coal = MAX_SKB_FRAGS - 1; + +	/* if AIC is being turned on now, start with an EQD of 0 */ +	if (rx_eq->enable_aic == 0 && +		coalesce->use_adaptive_rx_coalesce == 1) { +		rx_eq->cur_eqd = 0; +	} +	rx_eq->enable_aic = coalesce->use_adaptive_rx_coalesce; + +	rx_max = coalesce->rx_coalesce_usecs_high; +	rx_min = coalesce->rx_coalesce_usecs_low; +	rx_cur = coalesce->rx_coalesce_usecs; + +	tx_max = coalesce->tx_coalesce_usecs_high; +	tx_min = coalesce->tx_coalesce_usecs_low; +	tx_cur = coalesce->tx_coalesce_usecs; + +	if (tx_cur > BE_MAX_EQD) +		tx_cur = BE_MAX_EQD; +	if (tx_eq->cur_eqd != tx_cur) { +		status = be_cmd_modify_eqd(ctrl, tx_eq->q.id, tx_cur); +		if (!status) +			tx_eq->cur_eqd = tx_cur; +	} + +	if (rx_eq->enable_aic) { +		if (rx_max > BE_MAX_EQD) +			rx_max = BE_MAX_EQD; +		if (rx_min > rx_max) +			rx_min = rx_max; +		rx_eq->max_eqd = rx_max; +		rx_eq->min_eqd = rx_min; +		if (rx_eq->cur_eqd > rx_max) +			rx_eq->cur_eqd = rx_max; +		if (rx_eq->cur_eqd < rx_min) +			rx_eq->cur_eqd = rx_min; +	} else { +		if (rx_cur > BE_MAX_EQD) +			rx_cur = BE_MAX_EQD; +		if (rx_eq->cur_eqd != rx_cur) { +			status = be_cmd_modify_eqd(ctrl, rx_eq->q.id, rx_cur); +			if (!status) +				rx_eq->cur_eqd = rx_cur; +		} +	} +	return 0; +} + +static u32 be_get_rx_csum(struct net_device *netdev) +{ +	struct be_adapter *adapter = netdev_priv(netdev); + +	return adapter->rx_csum; +} + +static int be_set_rx_csum(struct net_device *netdev, uint32_t data) +{ +	struct be_adapter *adapter = netdev_priv(netdev); + +	if (data) +		adapter->rx_csum = true; +	else +		adapter->rx_csum = false; + +	return 0; +} + +static void +be_get_ethtool_stats(struct net_device *netdev, +		struct ethtool_stats *stats, uint64_t *data) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	struct be_drvr_stats *drvr_stats = &adapter->stats.drvr_stats; +	struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va); +	struct be_rxf_stats *rxf_stats = &hw_stats->rxf; +	struct be_port_rxf_stats *port_stats = +			&rxf_stats->port[adapter->port_num]; +	struct net_device_stats *net_stats = &adapter->stats.net_stats; +	struct be_erx_stats *erx_stats = &hw_stats->erx; +	void *p = NULL; +	int i; + +	for (i = 0; i < ETHTOOL_STATS_NUM; i++) { +		switch (et_stats[i].type) { +		case NETSTAT: +			p = net_stats; +			break; +		case DRVSTAT: +			p = drvr_stats; +			break; +		case PORTSTAT: +			p = port_stats; +			break; +		case MISCSTAT: +			p = rxf_stats; +			break; +		case ERXSTAT: /* Currently only one ERX stat is provided */ +			p = (u32 *)erx_stats + adapter->rx_obj.q.id; +			break; +		} + +		p = (u8 *)p + et_stats[i].offset; +		data[i] = (et_stats[i].size == sizeof(u64)) ? +				*(u64 *)p: *(u32 *)p; +	} + +	return; +} + +static void +be_get_stat_strings(struct net_device *netdev, uint32_t stringset, +		uint8_t *data) +{ +	int i; +	switch (stringset) { +	case ETH_SS_STATS: +		for (i = 0; i < ETHTOOL_STATS_NUM; i++) { +			memcpy(data, et_stats[i].desc, ETH_GSTRING_LEN); +			data += ETH_GSTRING_LEN; +		} +		break; +	} +} + +static int be_get_stats_count(struct net_device *netdev) +{ +	return ETHTOOL_STATS_NUM; +} + +static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) +{ +	ecmd->speed = SPEED_10000; +	ecmd->duplex = DUPLEX_FULL; +	ecmd->autoneg = AUTONEG_DISABLE; +	return 0; +} + +static void +be_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring) +{ +	struct be_adapter *adapter = netdev_priv(netdev); + +	ring->rx_max_pending = adapter->rx_obj.q.len; +	ring->tx_max_pending = adapter->tx_obj.q.len; + +	ring->rx_pending = atomic_read(&adapter->rx_obj.q.used); +	ring->tx_pending = atomic_read(&adapter->tx_obj.q.used); +} + +static void +be_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd) +{ +	struct be_adapter *adapter = netdev_priv(netdev); + +	be_cmd_get_flow_control(&adapter->ctrl, &ecmd->tx_pause, +		&ecmd->rx_pause); +	ecmd->autoneg = AUTONEG_ENABLE; +} + +static int +be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	int status; + +	if (ecmd->autoneg != AUTONEG_ENABLE) +		return -EINVAL; + +	status = be_cmd_set_flow_control(&adapter->ctrl, ecmd->tx_pause, +			ecmd->rx_pause); +	if (!status) +		dev_warn(&adapter->pdev->dev, "Pause param set failed.\n"); + +	return status; +} + +struct ethtool_ops be_ethtool_ops = { +	.get_settings = be_get_settings, +	.get_drvinfo = be_get_drvinfo, +	.get_link = ethtool_op_get_link, +	.get_coalesce = be_get_coalesce, +	.set_coalesce = be_set_coalesce, +	.get_ringparam = be_get_ringparam, +	.get_pauseparam = be_get_pauseparam, +	.set_pauseparam = be_set_pauseparam, +	.get_rx_csum = be_get_rx_csum, +	.set_rx_csum = be_set_rx_csum, +	.get_tx_csum = ethtool_op_get_tx_csum, +	.set_tx_csum = ethtool_op_set_tx_csum, +	.get_sg = ethtool_op_get_sg, +	.set_sg = ethtool_op_set_sg, +	.get_tso = ethtool_op_get_tso, +	.set_tso = ethtool_op_set_tso, +	.get_strings = be_get_stat_strings, +	.get_stats_count = be_get_stats_count, +	.get_ethtool_stats = be_get_ethtool_stats, +}; diff --git a/drivers/net/benet/be_hw.h b/drivers/net/benet/be_hw.h new file mode 100644 index 00000000000..b132aa4893c --- /dev/null +++ b/drivers/net/benet/be_hw.h @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2005 - 2009 ServerEngines + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation.  The full GNU General + * Public License is included in this distribution in the file called COPYING. + * + * Contact Information: + * linux-drivers@serverengines.com + * + * ServerEngines + * 209 N. Fair Oaks Ave + * Sunnyvale, CA 94085 + */ + +/********* Mailbox door bell *************/ +/* Used for driver communication with the FW. + * The software must write this register twice to post any command. First, + * it writes the register with hi=1 and the upper bits of the physical address + * for the MAILBOX structure. Software must poll the ready bit until this + * is acknowledged. Then, sotware writes the register with hi=0 with the lower + * bits in the address. It must poll the ready bit until the command is + * complete. Upon completion, the MAILBOX will contain a valid completion + * queue entry. + */ +#define MPU_MAILBOX_DB_OFFSET	0x160 +#define MPU_MAILBOX_DB_RDY_MASK	0x1 	/* bit 0 */ +#define MPU_MAILBOX_DB_HI_MASK	0x2	/* bit 1 */ + +#define MPU_EP_CONTROL 		0 + +/********** MPU semphore ******************/ +#define MPU_EP_SEMAPHORE_OFFSET 	0xac +#define EP_SEMAPHORE_POST_STAGE_MASK	0x0000FFFF +#define EP_SEMAPHORE_POST_ERR_MASK	0x1 +#define EP_SEMAPHORE_POST_ERR_SHIFT	31 +/* MPU semphore POST stage values */ +#define POST_STAGE_AWAITING_HOST_RDY 	0x1 /* FW awaiting goahead from host */ +#define POST_STAGE_HOST_RDY 		0x2 /* Host has given go-ahed to FW */ +#define POST_STAGE_BE_RESET		0x3 /* Host wants to reset chip */ +#define POST_STAGE_ARMFW_RDY		0xc000	/* FW is done with POST */ + +/********* Memory BAR register ************/ +#define PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET 	0xfc +/* Host Interrupt Enable, if set interrupts are enabled although "PCI Interrupt + * Disable" may still globally block interrupts in addition to individual + * interrupt masks; a mechanism for the device driver to block all interrupts + * atomically without having to arbitrate for the PCI Interrupt Disable bit + * with the OS. + */ +#define MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK	(1 << 29) /* bit 29 */ +/* PCI physical function number */ +#define MEMBAR_CTRL_INT_CTRL_PFUNC_MASK  	0x7 	/* bits 26 - 28 */ +#define MEMBAR_CTRL_INT_CTRL_PFUNC_SHIFT	26 + +/********* Event Q door bell *************/ +#define DB_EQ_OFFSET			DB_CQ_OFFSET +#define DB_EQ_RING_ID_MASK		0x1FF	/* bits 0 - 8 */ +/* Clear the interrupt for this eq */ +#define DB_EQ_CLR_SHIFT			(9)	/* bit 9 */ +/* Must be 1 */ +#define DB_EQ_EVNT_SHIFT			(10)	/* bit 10 */ +/* Number of event entries processed */ +#define DB_EQ_NUM_POPPED_SHIFT		(16)	/* bits 16 - 28 */ +/* Rearm bit */ +#define DB_EQ_REARM_SHIFT		(29)	/* bit 29 */ + +/********* Compl Q door bell *************/ +#define DB_CQ_OFFSET 			0x120 +#define DB_CQ_RING_ID_MASK		0x3FF	/* bits 0 - 9 */ +/* Number of event entries processed */ +#define DB_CQ_NUM_POPPED_SHIFT		(16) 	/* bits 16 - 28 */ +/* Rearm bit */ +#define DB_CQ_REARM_SHIFT		(29) 	/* bit 29 */ + +/********** TX ULP door bell *************/ +#define DB_TXULP1_OFFSET		0x60 +#define DB_TXULP_RING_ID_MASK		0x7FF	/* bits 0 - 10 */ +/* Number of tx entries posted */ +#define DB_TXULP_NUM_POSTED_SHIFT	(16)	/* bits 16 - 29 */ +#define DB_TXULP_NUM_POSTED_MASK	0x3FFF	/* bits 16 - 29 */ + +/********** RQ(erx) door bell ************/ +#define DB_RQ_OFFSET 			0x100 +#define DB_RQ_RING_ID_MASK		0x3FF	/* bits 0 - 9 */ +/* Number of rx frags posted */ +#define DB_RQ_NUM_POSTED_SHIFT		(24)	/* bits 24 - 31 */ + +/* + * BE descriptors: host memory data structures whose formats + * are hardwired in BE silicon. + */ +/* Event Queue Descriptor */ +#define EQ_ENTRY_VALID_MASK 		0x1	/* bit 0 */ +#define EQ_ENTRY_RES_ID_MASK 		0xFFFF	/* bits 16 - 31 */ +#define EQ_ENTRY_RES_ID_SHIFT 		16 +struct be_eq_entry { +	u32 evt; +}; + +/* TX Queue Descriptor */ +#define ETH_WRB_FRAG_LEN_MASK		0xFFFF +struct be_eth_wrb { +	u32 frag_pa_hi;		/* dword 0 */ +	u32 frag_pa_lo;		/* dword 1 */ +	u32 rsvd0;		/* dword 2 */ +	u32 frag_len;		/* dword 3: bits 0 - 15 */ +} __packed; + +/* Pseudo amap definition for eth_hdr_wrb in which each bit of the + * actual structure is defined as a byte : used to calculate + * offset/shift/mask of each field */ +struct amap_eth_hdr_wrb { +	u8 rsvd0[32];		/* dword 0 */ +	u8 rsvd1[32];		/* dword 1 */ +	u8 complete;		/* dword 2 */ +	u8 event; +	u8 crc; +	u8 forward; +	u8 ipsec; +	u8 mgmt; +	u8 ipcs; +	u8 udpcs; +	u8 tcpcs; +	u8 lso; +	u8 vlan; +	u8 gso[2]; +	u8 num_wrb[5]; +	u8 lso_mss[14]; +	u8 len[16];		/* dword 3 */ +	u8 vlan_tag[16]; +} __packed; + +struct be_eth_hdr_wrb { +	u32 dw[4]; +}; + +/* TX Compl Queue Descriptor */ + +/* Pseudo amap definition for eth_tx_compl in which each bit of the + * actual structure is defined as a byte: used to calculate + * offset/shift/mask of each field */ +struct amap_eth_tx_compl { +	u8 wrb_index[16];	/* dword 0 */ +	u8 ct[2]; 		/* dword 0 */ +	u8 port[2];		/* dword 0 */ +	u8 rsvd0[8];		/* dword 0 */ +	u8 status[4];		/* dword 0 */ +	u8 user_bytes[16];	/* dword 1 */ +	u8 nwh_bytes[8];	/* dword 1 */ +	u8 lso;			/* dword 1 */ +	u8 cast_enc[2];		/* dword 1 */ +	u8 rsvd1[5];		/* dword 1 */ +	u8 rsvd2[32];		/* dword 2 */ +	u8 pkts[16];		/* dword 3 */ +	u8 ringid[11];		/* dword 3 */ +	u8 hash_val[4];		/* dword 3 */ +	u8 valid;		/* dword 3 */ +} __packed; + +struct be_eth_tx_compl { +	u32 dw[4]; +}; + +/* RX Queue Descriptor */ +struct be_eth_rx_d { +	u32 fragpa_hi; +	u32 fragpa_lo; +}; + +/* RX Compl Queue Descriptor */ + +/* Pseudo amap definition for eth_rx_compl in which each bit of the + * actual structure is defined as a byte: used to calculate + * offset/shift/mask of each field */ +struct amap_eth_rx_compl { +	u8 vlan_tag[16];	/* dword 0 */ +	u8 pktsize[14];		/* dword 0 */ +	u8 port;		/* dword 0 */ +	u8 ip_opt;		/* dword 0 */ +	u8 err;			/* dword 1 */ +	u8 rsshp;		/* dword 1 */ +	u8 ipf;			/* dword 1 */ +	u8 tcpf;		/* dword 1 */ +	u8 udpf;		/* dword 1 */ +	u8 ipcksm;		/* dword 1 */ +	u8 l4_cksm;		/* dword 1 */ +	u8 ip_version;		/* dword 1 */ +	u8 macdst[6];		/* dword 1 */ +	u8 vtp;			/* dword 1 */ +	u8 rsvd0;		/* dword 1 */ +	u8 fragndx[10];		/* dword 1 */ +	u8 ct[2];		/* dword 1 */ +	u8 sw;			/* dword 1 */ +	u8 numfrags[3];		/* dword 1 */ +	u8 rss_flush;		/* dword 2 */ +	u8 cast_enc[2];		/* dword 2 */ +	u8 qnq;			/* dword 2 */ +	u8 rss_bank;		/* dword 2 */ +	u8 rsvd1[23];		/* dword 2 */ +	u8 lro_pkt;		/* dword 2 */ +	u8 rsvd2[2];		/* dword 2 */ +	u8 valid;		/* dword 2 */ +	u8 rsshash[32];		/* dword 3 */ +} __packed; + +struct be_eth_rx_compl { +	u32 dw[4]; +}; diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c new file mode 100644 index 00000000000..0ecaffb70e5 --- /dev/null +++ b/drivers/net/benet/be_main.c @@ -0,0 +1,1911 @@ +/* + * Copyright (C) 2005 - 2009 ServerEngines + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation.  The full GNU General + * Public License is included in this distribution in the file called COPYING. + * + * Contact Information: + * linux-drivers@serverengines.com + * + * ServerEngines + * 209 N. Fair Oaks Ave + * Sunnyvale, CA 94085 + */ + +#include "be.h" + +MODULE_VERSION(DRV_VER); +MODULE_DEVICE_TABLE(pci, be_dev_ids); +MODULE_DESCRIPTION(DRV_DESC " " DRV_VER); +MODULE_AUTHOR("ServerEngines Corporation"); +MODULE_LICENSE("GPL"); + +static unsigned int rx_frag_size = 2048; +module_param(rx_frag_size, uint, S_IRUGO); +MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data."); + +#define BE_VENDOR_ID 		0x19a2 +#define BE2_DEVICE_ID_1 	0x0211 +static DEFINE_PCI_DEVICE_TABLE(be_dev_ids) = { +	{ PCI_DEVICE(BE_VENDOR_ID, BE2_DEVICE_ID_1) }, +	{ 0 } +}; +MODULE_DEVICE_TABLE(pci, be_dev_ids); + +static void be_queue_free(struct be_adapter *adapter, struct be_queue_info *q) +{ +	struct be_dma_mem *mem = &q->dma_mem; +	if (mem->va) +		pci_free_consistent(adapter->pdev, mem->size, +			mem->va, mem->dma); +} + +static int be_queue_alloc(struct be_adapter *adapter, struct be_queue_info *q, +		u16 len, u16 entry_size) +{ +	struct be_dma_mem *mem = &q->dma_mem; + +	memset(q, 0, sizeof(*q)); +	q->len = len; +	q->entry_size = entry_size; +	mem->size = len * entry_size; +	mem->va = pci_alloc_consistent(adapter->pdev, mem->size, &mem->dma); +	if (!mem->va) +		return -1; +	memset(mem->va, 0, mem->size); +	return 0; +} + +static inline void *queue_head_node(struct be_queue_info *q) +{ +	return q->dma_mem.va + q->head * q->entry_size; +} + +static inline void *queue_tail_node(struct be_queue_info *q) +{ +	return q->dma_mem.va + q->tail * q->entry_size; +} + +static inline void queue_head_inc(struct be_queue_info *q) +{ +	index_inc(&q->head, q->len); +} + +static inline void queue_tail_inc(struct be_queue_info *q) +{ +	index_inc(&q->tail, q->len); +} + +static void be_intr_set(struct be_ctrl_info *ctrl, bool enable) +{ +	u8 __iomem *addr = ctrl->pcicfg + PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET; +	u32 reg = ioread32(addr); +	u32 enabled = reg & MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK; +	if (!enabled && enable) { +		reg |= MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK; +	} else if (enabled && !enable) { +		reg &= ~MEMBAR_CTRL_INT_CTRL_HOSTINTR_MASK; +	} else { +		printk(KERN_WARNING DRV_NAME +			": bad value in membar_int_ctrl reg=0x%x\n", reg); +		return; +	} +	iowrite32(reg, addr); +} + +static void be_rxq_notify(struct be_ctrl_info *ctrl, u16 qid, u16 posted) +{ +	u32 val = 0; +	val |= qid & DB_RQ_RING_ID_MASK; +	val |= posted << DB_RQ_NUM_POSTED_SHIFT; +	iowrite32(val, ctrl->db + DB_RQ_OFFSET); +} + +static void be_txq_notify(struct be_ctrl_info *ctrl, u16 qid, u16 posted) +{ +	u32 val = 0; +	val |= qid & DB_TXULP_RING_ID_MASK; +	val |= (posted & DB_TXULP_NUM_POSTED_MASK) << DB_TXULP_NUM_POSTED_SHIFT; +	iowrite32(val, ctrl->db + DB_TXULP1_OFFSET); +} + +static void be_eq_notify(struct be_ctrl_info *ctrl, u16 qid, +		bool arm, bool clear_int, u16 num_popped) +{ +	u32 val = 0; +	val |= qid & DB_EQ_RING_ID_MASK; +	if (arm) +		val |= 1 << DB_EQ_REARM_SHIFT; +	if (clear_int) +		val |= 1 << DB_EQ_CLR_SHIFT; +	val |= 1 << DB_EQ_EVNT_SHIFT; +	val |= num_popped << DB_EQ_NUM_POPPED_SHIFT; +	iowrite32(val, ctrl->db + DB_EQ_OFFSET); +} + +static void be_cq_notify(struct be_ctrl_info *ctrl, u16 qid, +		bool arm, u16 num_popped) +{ +	u32 val = 0; +	val |= qid & DB_CQ_RING_ID_MASK; +	if (arm) +		val |= 1 << DB_CQ_REARM_SHIFT; +	val |= num_popped << DB_CQ_NUM_POPPED_SHIFT; +	iowrite32(val, ctrl->db + DB_CQ_OFFSET); +} + + +static int be_mac_addr_set(struct net_device *netdev, void *p) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	struct sockaddr *addr = p; +	int status = 0; + +	if (netif_running(netdev)) { +		status = be_cmd_pmac_del(&adapter->ctrl, adapter->if_handle, +				adapter->pmac_id); +		if (status) +			return status; + +		status = be_cmd_pmac_add(&adapter->ctrl, (u8 *)addr->sa_data, +				adapter->if_handle, &adapter->pmac_id); +	} + +	if (!status) +		memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); + +	return status; +} + +static void netdev_stats_update(struct be_adapter *adapter) +{ +	struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va); +	struct be_rxf_stats *rxf_stats = &hw_stats->rxf; +	struct be_port_rxf_stats *port_stats = +			&rxf_stats->port[adapter->port_num]; +	struct net_device_stats *dev_stats = &adapter->stats.net_stats; + +	dev_stats->rx_packets = port_stats->rx_total_frames; +	dev_stats->tx_packets = port_stats->tx_unicastframes + +		port_stats->tx_multicastframes + port_stats->tx_broadcastframes; +	dev_stats->rx_bytes = (u64) port_stats->rx_bytes_msd << 32 | +				(u64) port_stats->rx_bytes_lsd; +	dev_stats->tx_bytes = (u64) port_stats->tx_bytes_msd << 32 | +				(u64) port_stats->tx_bytes_lsd; + +	/* bad pkts received */ +	dev_stats->rx_errors = port_stats->rx_crc_errors + +		port_stats->rx_alignment_symbol_errors + +		port_stats->rx_in_range_errors + +		port_stats->rx_out_range_errors + port_stats->rx_frame_too_long; + +	/*  packet transmit problems */ +	dev_stats->tx_errors = 0; + +	/*  no space in linux buffers */ +	dev_stats->rx_dropped = 0; + +	/* no space available in linux */ +	dev_stats->tx_dropped = 0; + +	dev_stats->multicast = port_stats->tx_multicastframes; +	dev_stats->collisions = 0; + +	/* detailed rx errors */ +	dev_stats->rx_length_errors = port_stats->rx_in_range_errors + +		port_stats->rx_out_range_errors + port_stats->rx_frame_too_long; +	/* receive ring buffer overflow */ +	dev_stats->rx_over_errors = 0; +	dev_stats->rx_crc_errors = port_stats->rx_crc_errors; + +	/* frame alignment errors */ +	dev_stats->rx_frame_errors = port_stats->rx_alignment_symbol_errors; +	/* receiver fifo overrun */ +	/* drops_no_pbuf is no per i/f, it's per BE card */ +	dev_stats->rx_fifo_errors = port_stats->rx_fifo_overflow + +					port_stats->rx_input_fifo_overflow + +					rxf_stats->rx_drops_no_pbuf; +	/* receiver missed packetd */ +	dev_stats->rx_missed_errors = 0; +	/* detailed tx_errors */ +	dev_stats->tx_aborted_errors = 0; +	dev_stats->tx_carrier_errors = 0; +	dev_stats->tx_fifo_errors = 0; +	dev_stats->tx_heartbeat_errors = 0; +	dev_stats->tx_window_errors = 0; +} + +static void be_link_status_update(struct be_adapter *adapter) +{ +	struct be_link_info *prev = &adapter->link; +	struct be_link_info now = { 0 }; +	struct net_device *netdev = adapter->netdev; + +	be_cmd_link_status_query(&adapter->ctrl, &now); + +	/* If link came up or went down */ +	if (now.speed != prev->speed && (now.speed == PHY_LINK_SPEED_ZERO || +			prev->speed == PHY_LINK_SPEED_ZERO)) { +		if (now.speed == PHY_LINK_SPEED_ZERO) { +			netif_stop_queue(netdev); +			netif_carrier_off(netdev); +			printk(KERN_INFO "%s: Link down\n", netdev->name); +		} else { +			netif_start_queue(netdev); +			netif_carrier_on(netdev); +			printk(KERN_INFO "%s: Link up\n", netdev->name); +		} +	} +	*prev = now; +} + +/* Update the EQ delay n BE based on the RX frags consumed / sec */ +static void be_rx_eqd_update(struct be_adapter *adapter) +{ +	u32 eqd; +	struct be_ctrl_info *ctrl = &adapter->ctrl; +	struct be_eq_obj *rx_eq = &adapter->rx_eq; +	struct be_drvr_stats *stats = &adapter->stats.drvr_stats; + +	/* Update once a second */ +	if (((jiffies - stats->rx_fps_jiffies) < HZ) || rx_eq->enable_aic == 0) +		return; + +	stats->be_rx_fps = (stats->be_rx_frags - stats->be_prev_rx_frags) / +			((jiffies - stats->rx_fps_jiffies) / HZ); + +	stats->rx_fps_jiffies = jiffies; +	stats->be_prev_rx_frags = stats->be_rx_frags; +	eqd = stats->be_rx_fps / 110000; +	eqd = eqd << 3; +	if (eqd > rx_eq->max_eqd) +		eqd = rx_eq->max_eqd; +	if (eqd < rx_eq->min_eqd) +		eqd = rx_eq->min_eqd; +	if (eqd < 10) +		eqd = 0; +	if (eqd != rx_eq->cur_eqd) +		be_cmd_modify_eqd(ctrl, rx_eq->q.id, eqd); + +	rx_eq->cur_eqd = eqd; +} + +static struct net_device_stats *be_get_stats(struct net_device *dev) +{ +	struct be_adapter *adapter = netdev_priv(dev); + +	return &adapter->stats.net_stats; +} + +static void be_tx_stats_update(struct be_adapter *adapter, +			u32 wrb_cnt, u32 copied, bool stopped) +{ +	struct be_drvr_stats *stats = &adapter->stats.drvr_stats; +	stats->be_tx_reqs++; +	stats->be_tx_wrbs += wrb_cnt; +	stats->be_tx_bytes += copied; +	if (stopped) +		stats->be_tx_stops++; + +	/* Update tx rate once in two seconds */ +	if ((jiffies - stats->be_tx_jiffies) > 2 * HZ) { +		u32 r; +		r = (stats->be_tx_bytes - stats->be_tx_bytes_prev) / +			((u32) (jiffies - stats->be_tx_jiffies) / HZ); +		r = (r / 1000000);			/* M bytes/s */ +		stats->be_tx_rate = (r * 8);	/* M bits/s */ +		stats->be_tx_jiffies = jiffies; +		stats->be_tx_bytes_prev = stats->be_tx_bytes; +	} +} + +/* Determine number of WRB entries needed to xmit data in an skb */ +static u32 wrb_cnt_for_skb(struct sk_buff *skb, bool *dummy) +{ +	int cnt = 0; +	while (skb) { +		if (skb->len > skb->data_len) +			cnt++; +		cnt += skb_shinfo(skb)->nr_frags; +		skb = skb_shinfo(skb)->frag_list; +	} +	/* to account for hdr wrb */ +	cnt++; +	if (cnt & 1) { +		/* add a dummy to make it an even num */ +		cnt++; +		*dummy = true; +	} else +		*dummy = false; +	BUG_ON(cnt > BE_MAX_TX_FRAG_COUNT); +	return cnt; +} + +static inline void wrb_fill(struct be_eth_wrb *wrb, u64 addr, int len) +{ +	wrb->frag_pa_hi = upper_32_bits(addr); +	wrb->frag_pa_lo = addr & 0xFFFFFFFF; +	wrb->frag_len = len & ETH_WRB_FRAG_LEN_MASK; +} + +static void wrb_fill_hdr(struct be_eth_hdr_wrb *hdr, struct sk_buff *skb, +		bool vlan, u32 wrb_cnt, u32 len) +{ +	memset(hdr, 0, sizeof(*hdr)); + +	AMAP_SET_BITS(struct amap_eth_hdr_wrb, crc, hdr, 1); + +	if (skb_shinfo(skb)->gso_segs > 1 && skb_shinfo(skb)->gso_size) { +		AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso, hdr, 1); +		AMAP_SET_BITS(struct amap_eth_hdr_wrb, lso_mss, +			hdr, skb_shinfo(skb)->gso_size); +	} else if (skb->ip_summed == CHECKSUM_PARTIAL) { +		if (is_tcp_pkt(skb)) +			AMAP_SET_BITS(struct amap_eth_hdr_wrb, tcpcs, hdr, 1); +		else if (is_udp_pkt(skb)) +			AMAP_SET_BITS(struct amap_eth_hdr_wrb, udpcs, hdr, 1); +	} + +	if (vlan && vlan_tx_tag_present(skb)) { +		AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan, hdr, 1); +		AMAP_SET_BITS(struct amap_eth_hdr_wrb, vlan_tag, +			hdr, vlan_tx_tag_get(skb)); +	} + +	AMAP_SET_BITS(struct amap_eth_hdr_wrb, event, hdr, 1); +	AMAP_SET_BITS(struct amap_eth_hdr_wrb, complete, hdr, 1); +	AMAP_SET_BITS(struct amap_eth_hdr_wrb, num_wrb, hdr, wrb_cnt); +	AMAP_SET_BITS(struct amap_eth_hdr_wrb, len, hdr, len); +} + + +static int make_tx_wrbs(struct be_adapter *adapter, +		struct sk_buff *skb, u32 wrb_cnt, bool dummy_wrb) +{ +	u64 busaddr; +	u32 i, copied = 0; +	struct pci_dev *pdev = adapter->pdev; +	struct sk_buff *first_skb = skb; +	struct be_queue_info *txq = &adapter->tx_obj.q; +	struct be_eth_wrb *wrb; +	struct be_eth_hdr_wrb *hdr; + +	atomic_add(wrb_cnt, &txq->used); +	hdr = queue_head_node(txq); +	queue_head_inc(txq); + +	while (skb) { +		if (skb->len > skb->data_len) { +			int len = skb->len - skb->data_len; +			busaddr = pci_map_single(pdev, skb->data, len, +					PCI_DMA_TODEVICE); +			wrb = queue_head_node(txq); +			wrb_fill(wrb, busaddr, len); +			be_dws_cpu_to_le(wrb, sizeof(*wrb)); +			queue_head_inc(txq); +			copied += len; +		} + +		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { +			struct skb_frag_struct *frag = +				&skb_shinfo(skb)->frags[i]; +			busaddr = pci_map_page(pdev, frag->page, +					frag->page_offset, +					frag->size, PCI_DMA_TODEVICE); +			wrb = queue_head_node(txq); +			wrb_fill(wrb, busaddr, frag->size); +			be_dws_cpu_to_le(wrb, sizeof(*wrb)); +			queue_head_inc(txq); +			copied += frag->size; +		} +		skb = skb_shinfo(skb)->frag_list; +	} + +	if (dummy_wrb) { +		wrb = queue_head_node(txq); +		wrb_fill(wrb, 0, 0); +		be_dws_cpu_to_le(wrb, sizeof(*wrb)); +		queue_head_inc(txq); +	} + +	wrb_fill_hdr(hdr, first_skb, adapter->vlan_grp ? true : false, +		wrb_cnt, copied); +	be_dws_cpu_to_le(hdr, sizeof(*hdr)); + +	return copied; +} + +static int be_xmit(struct sk_buff *skb, struct net_device *netdev) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	struct be_tx_obj *tx_obj = &adapter->tx_obj; +	struct be_queue_info *txq = &tx_obj->q; +	u32 wrb_cnt = 0, copied = 0; +	u32 start = txq->head; +	bool dummy_wrb, stopped = false; + +	wrb_cnt = wrb_cnt_for_skb(skb, &dummy_wrb); + +	copied = make_tx_wrbs(adapter, skb, wrb_cnt, dummy_wrb); + +	/* record the sent skb in the sent_skb table */ +	BUG_ON(tx_obj->sent_skb_list[start]); +	tx_obj->sent_skb_list[start] = skb; + +	/* Ensure that txq has space for the next skb; Else stop the queue +	 * *BEFORE* ringing the tx doorbell, so that we serialze the +	 * tx compls of the current transmit which'll wake up the queue +	 */ +	if ((BE_MAX_TX_FRAG_COUNT + atomic_read(&txq->used)) >= txq->len) { +		netif_stop_queue(netdev); +		stopped = true; +	} + +	be_txq_notify(&adapter->ctrl, txq->id, wrb_cnt); + +	netdev->trans_start = jiffies; + +	be_tx_stats_update(adapter, wrb_cnt, copied, stopped); +	return NETDEV_TX_OK; +} + +static int be_change_mtu(struct net_device *netdev, int new_mtu) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	if (new_mtu < BE_MIN_MTU || +			new_mtu > BE_MAX_JUMBO_FRAME_SIZE) { +		dev_info(&adapter->pdev->dev, +			"MTU must be between %d and %d bytes\n", +			BE_MIN_MTU, BE_MAX_JUMBO_FRAME_SIZE); +		return -EINVAL; +	} +	dev_info(&adapter->pdev->dev, "MTU changed from %d to %d bytes\n", +			netdev->mtu, new_mtu); +	netdev->mtu = new_mtu; +	return 0; +} + +/* + * if there are BE_NUM_VLANS_SUPPORTED or lesser number of VLANS configured, + * program them in BE.  If more than BE_NUM_VLANS_SUPPORTED are configured, + * set the BE in promiscuous VLAN mode. + */ +static void be_vid_config(struct net_device *netdev) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	u16 vtag[BE_NUM_VLANS_SUPPORTED]; +	u16 ntags = 0, i; + +	if (adapter->num_vlans <= BE_NUM_VLANS_SUPPORTED)  { +		/* Construct VLAN Table to give to HW */ +		for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) { +			if (adapter->vlan_tag[i]) { +				vtag[ntags] = cpu_to_le16(i); +				ntags++; +			} +		} +		be_cmd_vlan_config(&adapter->ctrl, adapter->if_handle, +			vtag, ntags, 1, 0); +	} else { +		be_cmd_vlan_config(&adapter->ctrl, adapter->if_handle, +			NULL, 0, 1, 1); +	} +} + +static void be_vlan_register(struct net_device *netdev, struct vlan_group *grp) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	struct be_eq_obj *rx_eq = &adapter->rx_eq; +	struct be_eq_obj *tx_eq = &adapter->tx_eq; +	struct be_ctrl_info *ctrl = &adapter->ctrl; + +	be_eq_notify(ctrl, rx_eq->q.id, false, false, 0); +	be_eq_notify(ctrl, tx_eq->q.id, false, false, 0); +	adapter->vlan_grp = grp; +	be_eq_notify(ctrl, rx_eq->q.id, true, false, 0); +	be_eq_notify(ctrl, tx_eq->q.id, true, false, 0); +} + +static void be_vlan_add_vid(struct net_device *netdev, u16 vid) +{ +	struct be_adapter *adapter = netdev_priv(netdev); + +	adapter->num_vlans++; +	adapter->vlan_tag[vid] = 1; + +	be_vid_config(netdev); +} + +static void be_vlan_rem_vid(struct net_device *netdev, u16 vid) +{ +	struct be_adapter *adapter = netdev_priv(netdev); + +	adapter->num_vlans--; +	adapter->vlan_tag[vid] = 0; + +	vlan_group_set_device(adapter->vlan_grp, vid, NULL); +	be_vid_config(netdev); +} + +static void be_set_multicast_filter(struct net_device *netdev) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	struct dev_mc_list *mc_ptr; +	u8 mac_addr[32][ETH_ALEN]; +	int i = 0; + +	if (netdev->flags & IFF_ALLMULTI) { +		/* set BE in Multicast promiscuous */ +		be_cmd_mcast_mac_set(&adapter->ctrl, +					adapter->if_handle, NULL, 0, true); +		return; +	} + +	for (mc_ptr = netdev->mc_list; mc_ptr; mc_ptr = mc_ptr->next) { +		memcpy(&mac_addr[i][0], mc_ptr->dmi_addr, ETH_ALEN); +		if (++i >= 32) { +			be_cmd_mcast_mac_set(&adapter->ctrl, +				adapter->if_handle, &mac_addr[0][0], i, false); +			i = 0; +		} + +	} + +	if (i) { +		/* reset the promiscuous mode also. */ +		be_cmd_mcast_mac_set(&adapter->ctrl, +			adapter->if_handle, &mac_addr[0][0], i, false); +	} +} + +static void be_set_multicast_list(struct net_device *netdev) +{ +	struct be_adapter *adapter = netdev_priv(netdev); + +	if (netdev->flags & IFF_PROMISC) { +		be_cmd_promiscuous_config(&adapter->ctrl, adapter->port_num, 1); +	} else { +		be_cmd_promiscuous_config(&adapter->ctrl, adapter->port_num, 0); +		be_set_multicast_filter(netdev); +	} +} + +static void be_rx_rate_update(struct be_adapter *adapter, u32 pktsize, +			u16 numfrags) +{ +	struct be_drvr_stats *stats = &adapter->stats.drvr_stats; +	u32 rate; + +	stats->be_rx_compl++; +	stats->be_rx_frags += numfrags; +	stats->be_rx_bytes += pktsize; + +	/* Update the rate once in two seconds */ +	if ((jiffies - stats->be_rx_jiffies) < 2 * HZ) +		return; + +	rate = (stats->be_rx_bytes - stats->be_rx_bytes_prev) / +		((u32) (jiffies - stats->be_rx_jiffies) / HZ); +	rate = (rate / 1000000);	/* MB/Sec */ +	stats->be_rx_rate = (rate * 8); 	/* Mega Bits/Sec */ +	stats->be_rx_jiffies = jiffies; +	stats->be_rx_bytes_prev = stats->be_rx_bytes; +} + +static struct be_rx_page_info * +get_rx_page_info(struct be_adapter *adapter, u16 frag_idx) +{ +	struct be_rx_page_info *rx_page_info; +	struct be_queue_info *rxq = &adapter->rx_obj.q; + +	rx_page_info = &adapter->rx_obj.page_info_tbl[frag_idx]; +	BUG_ON(!rx_page_info->page); + +	if (rx_page_info->last_page_user) +		pci_unmap_page(adapter->pdev, pci_unmap_addr(rx_page_info, bus), +			adapter->big_page_size, PCI_DMA_FROMDEVICE); + +	atomic_dec(&rxq->used); +	return rx_page_info; +} + +/* Throwaway the data in the Rx completion */ +static void be_rx_compl_discard(struct be_adapter *adapter, +			struct be_eth_rx_compl *rxcp) +{ +	struct be_queue_info *rxq = &adapter->rx_obj.q; +	struct be_rx_page_info *page_info; +	u16 rxq_idx, i, num_rcvd; + +	rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp); +	num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp); + +	for (i = 0; i < num_rcvd; i++) { +		page_info = get_rx_page_info(adapter, rxq_idx); +		put_page(page_info->page); +		memset(page_info, 0, sizeof(*page_info)); +		index_inc(&rxq_idx, rxq->len); +	} +} + +/* + * skb_fill_rx_data forms a complete skb for an ether frame + * indicated by rxcp. + */ +static void skb_fill_rx_data(struct be_adapter *adapter, +			struct sk_buff *skb, struct be_eth_rx_compl *rxcp) +{ +	struct be_queue_info *rxq = &adapter->rx_obj.q; +	struct be_rx_page_info *page_info; +	u16 rxq_idx, i, num_rcvd; +	u32 pktsize, hdr_len, curr_frag_len; +	u8 *start; + +	rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp); +	pktsize = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp); +	num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp); + +	page_info = get_rx_page_info(adapter, rxq_idx); + +	start = page_address(page_info->page) + page_info->page_offset; +	prefetch(start); + +	/* Copy data in the first descriptor of this completion */ +	curr_frag_len = min(pktsize, rx_frag_size); + +	/* Copy the header portion into skb_data */ +	hdr_len = min((u32)BE_HDR_LEN, curr_frag_len); +	memcpy(skb->data, start, hdr_len); +	skb->len = curr_frag_len; +	if (curr_frag_len <= BE_HDR_LEN) { /* tiny packet */ +		/* Complete packet has now been moved to data */ +		put_page(page_info->page); +		skb->data_len = 0; +		skb->tail += curr_frag_len; +	} else { +		skb_shinfo(skb)->nr_frags = 1; +		skb_shinfo(skb)->frags[0].page = page_info->page; +		skb_shinfo(skb)->frags[0].page_offset = +					page_info->page_offset + hdr_len; +		skb_shinfo(skb)->frags[0].size = curr_frag_len - hdr_len; +		skb->data_len = curr_frag_len - hdr_len; +		skb->tail += hdr_len; +	} +	memset(page_info, 0, sizeof(*page_info)); + +	if (pktsize <= rx_frag_size) { +		BUG_ON(num_rcvd != 1); +		return; +	} + +	/* More frags present for this completion */ +	pktsize -= curr_frag_len; /* account for above copied frag */ +	for (i = 1; i < num_rcvd; i++) { +		index_inc(&rxq_idx, rxq->len); +		page_info = get_rx_page_info(adapter, rxq_idx); + +		curr_frag_len = min(pktsize, rx_frag_size); + +		skb_shinfo(skb)->frags[i].page = page_info->page; +		skb_shinfo(skb)->frags[i].page_offset = page_info->page_offset; +		skb_shinfo(skb)->frags[i].size = curr_frag_len; +		skb->len += curr_frag_len; +		skb->data_len += curr_frag_len; +		skb_shinfo(skb)->nr_frags++; +		pktsize -= curr_frag_len; + +		memset(page_info, 0, sizeof(*page_info)); +	} + +	be_rx_rate_update(adapter, pktsize, num_rcvd); +	return; +} + +/* Process the RX completion indicated by rxcp when LRO is disabled */ +static void be_rx_compl_process(struct be_adapter *adapter, +			struct be_eth_rx_compl *rxcp) +{ +	struct sk_buff *skb; +	u32 vtp, vid; +	int l4_cksm; + +	l4_cksm = AMAP_GET_BITS(struct amap_eth_rx_compl, l4_cksm, rxcp); +	vtp = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp); + +	skb = netdev_alloc_skb(adapter->netdev, BE_HDR_LEN + NET_IP_ALIGN); +	if (!skb) { +		if (net_ratelimit()) +			dev_warn(&adapter->pdev->dev, "skb alloc failed\n"); +		be_rx_compl_discard(adapter, rxcp); +		return; +	} + +	skb_reserve(skb, NET_IP_ALIGN); + +	skb_fill_rx_data(adapter, skb, rxcp); + +	if (l4_cksm && adapter->rx_csum) +		skb->ip_summed = CHECKSUM_UNNECESSARY; +	else +		skb->ip_summed = CHECKSUM_NONE; + +	skb->truesize = skb->len + sizeof(struct sk_buff); +	skb->protocol = eth_type_trans(skb, adapter->netdev); +	skb->dev = adapter->netdev; + +	if (vtp) { +		if (!adapter->vlan_grp || adapter->num_vlans == 0) { +			kfree_skb(skb); +			return; +		} +		vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp); +		vid = be16_to_cpu(vid); +		vlan_hwaccel_receive_skb(skb, adapter->vlan_grp, vid); +	} else { +		netif_receive_skb(skb); +	} + +	adapter->netdev->last_rx = jiffies; + +	return; +} + +/* Process the RX completion indicated by rxcp when LRO is enabled */ +static void be_rx_compl_process_lro(struct be_adapter *adapter, +			struct be_eth_rx_compl *rxcp) +{ +	struct be_rx_page_info *page_info; +	struct skb_frag_struct rx_frags[BE_MAX_FRAGS_PER_FRAME]; +	struct be_queue_info *rxq = &adapter->rx_obj.q; +	u32 num_rcvd, pkt_size, remaining, vlanf, curr_frag_len; +	u16 i, rxq_idx = 0, vid; + +	num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp); +	pkt_size = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp); +	vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp); +	rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp); + +	remaining = pkt_size; +	for (i = 0; i < num_rcvd; i++) { +		page_info = get_rx_page_info(adapter, rxq_idx); + +		curr_frag_len = min(remaining, rx_frag_size); + +		rx_frags[i].page = page_info->page; +		rx_frags[i].page_offset = page_info->page_offset; +		rx_frags[i].size = curr_frag_len; +		remaining -= curr_frag_len; + +		index_inc(&rxq_idx, rxq->len); + +		memset(page_info, 0, sizeof(*page_info)); +	} + +	if (likely(!vlanf)) { +		lro_receive_frags(&adapter->rx_obj.lro_mgr, rx_frags, pkt_size, +				pkt_size, NULL, 0); +	} else { +		vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp); +		vid = be16_to_cpu(vid); + +		if (!adapter->vlan_grp || adapter->num_vlans == 0) +			return; + +		lro_vlan_hwaccel_receive_frags(&adapter->rx_obj.lro_mgr, +			rx_frags, pkt_size, pkt_size, adapter->vlan_grp, +			vid, NULL, 0); +	} + +	be_rx_rate_update(adapter, pkt_size, num_rcvd); +	return; +} + +static struct be_eth_rx_compl *be_rx_compl_get(struct be_adapter *adapter) +{ +	struct be_eth_rx_compl *rxcp = queue_tail_node(&adapter->rx_obj.cq); + +	if (rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] == 0) +		return NULL; + +	be_dws_le_to_cpu(rxcp, sizeof(*rxcp)); + +	rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] = 0; + +	queue_tail_inc(&adapter->rx_obj.cq); +	return rxcp; +} + +static inline struct page *be_alloc_pages(u32 size) +{ +	gfp_t alloc_flags = GFP_ATOMIC; +	u32 order = get_order(size); +	if (order > 0) +		alloc_flags |= __GFP_COMP; +	return  alloc_pages(alloc_flags, order); +} + +/* + * Allocate a page, split it to fragments of size rx_frag_size and post as + * receive buffers to BE + */ +static void be_post_rx_frags(struct be_adapter *adapter) +{ +	struct be_rx_page_info *page_info_tbl = adapter->rx_obj.page_info_tbl; +	struct be_rx_page_info *page_info = NULL; +	struct be_queue_info *rxq = &adapter->rx_obj.q; +	struct page *pagep = NULL; +	struct be_eth_rx_d *rxd; +	u64 page_dmaaddr = 0, frag_dmaaddr; +	u32 posted, page_offset = 0; + + +	page_info = &page_info_tbl[rxq->head]; +	for (posted = 0; posted < MAX_RX_POST && !page_info->page; posted++) { +		if (!pagep) { +			pagep = be_alloc_pages(adapter->big_page_size); +			if (unlikely(!pagep)) { +				drvr_stats(adapter)->be_ethrx_post_fail++; +				break; +			} +			page_dmaaddr = pci_map_page(adapter->pdev, pagep, 0, +						adapter->big_page_size, +						PCI_DMA_FROMDEVICE); +			page_info->page_offset = 0; +		} else { +			get_page(pagep); +			page_info->page_offset = page_offset + rx_frag_size; +		} +		page_offset = page_info->page_offset; +		page_info->page = pagep; +		pci_unmap_addr_set(page_info, bus, page_dmaaddr); +		frag_dmaaddr = page_dmaaddr + page_info->page_offset; + +		rxd = queue_head_node(rxq); +		rxd->fragpa_lo = cpu_to_le32(frag_dmaaddr & 0xFFFFFFFF); +		rxd->fragpa_hi = cpu_to_le32(upper_32_bits(frag_dmaaddr)); +		queue_head_inc(rxq); + +		/* Any space left in the current big page for another frag? */ +		if ((page_offset + rx_frag_size + rx_frag_size) > +					adapter->big_page_size) { +			pagep = NULL; +			page_info->last_page_user = true; +		} +		page_info = &page_info_tbl[rxq->head]; +	} +	if (pagep) +		page_info->last_page_user = true; + +	if (posted) { +		atomic_add(posted, &rxq->used); +		be_rxq_notify(&adapter->ctrl, rxq->id, posted); +	} else if (atomic_read(&rxq->used) == 0) { +		/* Let be_worker replenish when memory is available */ +		adapter->rx_post_starved = true; +	} + +	return; +} + +static struct be_eth_tx_compl * +be_tx_compl_get(struct be_adapter *adapter) +{ +	struct be_queue_info *tx_cq = &adapter->tx_obj.cq; +	struct be_eth_tx_compl *txcp = queue_tail_node(tx_cq); + +	if (txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] == 0) +		return NULL; + +	be_dws_le_to_cpu(txcp, sizeof(*txcp)); + +	txcp->dw[offsetof(struct amap_eth_tx_compl, valid) / 32] = 0; + +	queue_tail_inc(tx_cq); +	return txcp; +} + +static void be_tx_compl_process(struct be_adapter *adapter, u16 last_index) +{ +	struct be_queue_info *txq = &adapter->tx_obj.q; +	struct be_eth_wrb *wrb; +	struct sk_buff **sent_skbs = adapter->tx_obj.sent_skb_list; +	struct sk_buff *sent_skb; +	u64 busaddr; +	u16 cur_index, num_wrbs = 0; + +	cur_index = txq->tail; +	sent_skb = sent_skbs[cur_index]; +	BUG_ON(!sent_skb); +	sent_skbs[cur_index] = NULL; + +	do { +		cur_index = txq->tail; +		wrb = queue_tail_node(txq); +		be_dws_le_to_cpu(wrb, sizeof(*wrb)); +		busaddr = ((u64)wrb->frag_pa_hi << 32) | (u64)wrb->frag_pa_lo; +		if (busaddr != 0) { +			pci_unmap_single(adapter->pdev, busaddr, +				wrb->frag_len, PCI_DMA_TODEVICE); +		} +		num_wrbs++; +		queue_tail_inc(txq); +	} while (cur_index != last_index); + +	atomic_sub(num_wrbs, &txq->used); + +	kfree_skb(sent_skb); +} + +static void be_rx_q_clean(struct be_adapter *adapter) +{ +	struct be_rx_page_info *page_info; +	struct be_queue_info *rxq = &adapter->rx_obj.q; +	struct be_queue_info *rx_cq = &adapter->rx_obj.cq; +	struct be_eth_rx_compl *rxcp; +	u16 tail; + +	/* First cleanup pending rx completions */ +	while ((rxcp = be_rx_compl_get(adapter)) != NULL) { +		be_rx_compl_discard(adapter, rxcp); +		be_cq_notify(&adapter->ctrl, rx_cq->id, true, 1); +	} + +	/* Then free posted rx buffer that were not used */ +	tail = (rxq->head + rxq->len - atomic_read(&rxq->used)) % rxq->len; +	for (; tail != rxq->head; index_inc(&tail, rxq->len)) { +		page_info = get_rx_page_info(adapter, tail); +		put_page(page_info->page); +		memset(page_info, 0, sizeof(*page_info)); +	} +	BUG_ON(atomic_read(&rxq->used)); +} + +static void be_tx_q_clean(struct be_adapter *adapter) +{ +	struct sk_buff **sent_skbs = adapter->tx_obj.sent_skb_list; +	struct sk_buff *sent_skb; +	struct be_queue_info *txq = &adapter->tx_obj.q; +	u16 last_index; +	bool dummy_wrb; + +	while (atomic_read(&txq->used)) { +		sent_skb = sent_skbs[txq->tail]; +		last_index = txq->tail; +		index_adv(&last_index, +			wrb_cnt_for_skb(sent_skb, &dummy_wrb) - 1, txq->len); +		be_tx_compl_process(adapter, last_index); +	} +} + +static void be_tx_queues_destroy(struct be_adapter *adapter) +{ +	struct be_queue_info *q; + +	q = &adapter->tx_obj.q; +	if (q->created) +		be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_TXQ); +	be_queue_free(adapter, q); + +	q = &adapter->tx_obj.cq; +	if (q->created) +		be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_CQ); +	be_queue_free(adapter, q); + +	/* No more tx completions can be rcvd now; clean up if there are +	 * any pending completions or pending tx requests */ +	be_tx_q_clean(adapter); + +	q = &adapter->tx_eq.q; +	if (q->created) +		be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_EQ); +	be_queue_free(adapter, q); +} + +static int be_tx_queues_create(struct be_adapter *adapter) +{ +	struct be_queue_info *eq, *q, *cq; + +	adapter->tx_eq.max_eqd = 0; +	adapter->tx_eq.min_eqd = 0; +	adapter->tx_eq.cur_eqd = 96; +	adapter->tx_eq.enable_aic = false; +	/* Alloc Tx Event queue */ +	eq = &adapter->tx_eq.q; +	if (be_queue_alloc(adapter, eq, EVNT_Q_LEN, sizeof(struct be_eq_entry))) +		return -1; + +	/* Ask BE to create Tx Event queue */ +	if (be_cmd_eq_create(&adapter->ctrl, eq, adapter->tx_eq.cur_eqd)) +		goto tx_eq_free; +	/* Alloc TX eth compl queue */ +	cq = &adapter->tx_obj.cq; +	if (be_queue_alloc(adapter, cq, TX_CQ_LEN, +			sizeof(struct be_eth_tx_compl))) +		goto tx_eq_destroy; + +	/* Ask BE to create Tx eth compl queue */ +	if (be_cmd_cq_create(&adapter->ctrl, cq, eq, false, false, 3)) +		goto tx_cq_free; + +	/* Alloc TX eth queue */ +	q = &adapter->tx_obj.q; +	if (be_queue_alloc(adapter, q, TX_Q_LEN, sizeof(struct be_eth_wrb))) +		goto tx_cq_destroy; + +	/* Ask BE to create Tx eth queue */ +	if (be_cmd_txq_create(&adapter->ctrl, q, cq)) +		goto tx_q_free; +	return 0; + +tx_q_free: +	be_queue_free(adapter, q); +tx_cq_destroy: +	be_cmd_q_destroy(&adapter->ctrl, cq, QTYPE_CQ); +tx_cq_free: +	be_queue_free(adapter, cq); +tx_eq_destroy: +	be_cmd_q_destroy(&adapter->ctrl, eq, QTYPE_EQ); +tx_eq_free: +	be_queue_free(adapter, eq); +	return -1; +} + +static void be_rx_queues_destroy(struct be_adapter *adapter) +{ +	struct be_queue_info *q; + +	q = &adapter->rx_obj.q; +	if (q->created) { +		be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_RXQ); +		be_rx_q_clean(adapter); +	} +	be_queue_free(adapter, q); + +	q = &adapter->rx_obj.cq; +	if (q->created) +		be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_CQ); +	be_queue_free(adapter, q); + +	q = &adapter->rx_eq.q; +	if (q->created) +		be_cmd_q_destroy(&adapter->ctrl, q, QTYPE_EQ); +	be_queue_free(adapter, q); +} + +static int be_rx_queues_create(struct be_adapter *adapter) +{ +	struct be_queue_info *eq, *q, *cq; +	int rc; + +	adapter->max_rx_coal = BE_MAX_FRAGS_PER_FRAME; +	adapter->big_page_size = (1 << get_order(rx_frag_size)) * PAGE_SIZE; +	adapter->rx_eq.max_eqd = BE_MAX_EQD; +	adapter->rx_eq.min_eqd = 0; +	adapter->rx_eq.cur_eqd = 0; +	adapter->rx_eq.enable_aic = true; + +	/* Alloc Rx Event queue */ +	eq = &adapter->rx_eq.q; +	rc = be_queue_alloc(adapter, eq, EVNT_Q_LEN, +				sizeof(struct be_eq_entry)); +	if (rc) +		return rc; + +	/* Ask BE to create Rx Event queue */ +	rc = be_cmd_eq_create(&adapter->ctrl, eq, adapter->rx_eq.cur_eqd); +	if (rc) +		goto rx_eq_free; + +	/* Alloc RX eth compl queue */ +	cq = &adapter->rx_obj.cq; +	rc = be_queue_alloc(adapter, cq, RX_CQ_LEN, +			sizeof(struct be_eth_rx_compl)); +	if (rc) +		goto rx_eq_destroy; + +	/* Ask BE to create Rx eth compl queue */ +	rc = be_cmd_cq_create(&adapter->ctrl, cq, eq, false, false, 3); +	if (rc) +		goto rx_cq_free; + +	/* Alloc RX eth queue */ +	q = &adapter->rx_obj.q; +	rc = be_queue_alloc(adapter, q, RX_Q_LEN, sizeof(struct be_eth_rx_d)); +	if (rc) +		goto rx_cq_destroy; + +	/* Ask BE to create Rx eth queue */ +	rc = be_cmd_rxq_create(&adapter->ctrl, q, cq->id, rx_frag_size, +		BE_MAX_JUMBO_FRAME_SIZE, adapter->if_handle, false); +	if (rc) +		goto rx_q_free; + +	return 0; +rx_q_free: +	be_queue_free(adapter, q); +rx_cq_destroy: +	be_cmd_q_destroy(&adapter->ctrl, cq, QTYPE_CQ); +rx_cq_free: +	be_queue_free(adapter, cq); +rx_eq_destroy: +	be_cmd_q_destroy(&adapter->ctrl, eq, QTYPE_EQ); +rx_eq_free: +	be_queue_free(adapter, eq); +	return rc; +} +static bool event_get(struct be_eq_obj *eq_obj, u16 *rid) +{ +	struct be_eq_entry *entry = queue_tail_node(&eq_obj->q); +	u32 evt = entry->evt; + +	if (!evt) +		return false; + +	evt = le32_to_cpu(evt); +	*rid = (evt >> EQ_ENTRY_RES_ID_SHIFT) & EQ_ENTRY_RES_ID_MASK; +	entry->evt = 0; +	queue_tail_inc(&eq_obj->q); +	return true; +} + +static int event_handle(struct be_ctrl_info *ctrl, +			struct be_eq_obj *eq_obj) +{ +	u16 rid = 0, num = 0; + +	while (event_get(eq_obj, &rid)) +		num++; + +	/* We can see an interrupt and no event */ +	be_eq_notify(ctrl, eq_obj->q.id, true, true, num); +	if (num) +		napi_schedule(&eq_obj->napi); + +	return num; +} + +static irqreturn_t be_intx(int irq, void *dev) +{ +	struct be_adapter *adapter = dev; +	struct be_ctrl_info *ctrl = &adapter->ctrl; +	int rx, tx; + +	tx = event_handle(ctrl, &adapter->tx_eq); +	rx = event_handle(ctrl, &adapter->rx_eq); + +	if (rx || tx) +		return IRQ_HANDLED; +	else +		return IRQ_NONE; +} + +static irqreturn_t be_msix_rx(int irq, void *dev) +{ +	struct be_adapter *adapter = dev; + +	event_handle(&adapter->ctrl, &adapter->rx_eq); + +	return IRQ_HANDLED; +} + +static irqreturn_t be_msix_tx(int irq, void *dev) +{ +	struct be_adapter *adapter = dev; + +	event_handle(&adapter->ctrl, &adapter->tx_eq); + +	return IRQ_HANDLED; +} + +static inline bool do_lro(struct be_adapter *adapter, +			struct be_eth_rx_compl *rxcp) +{ +	int err = AMAP_GET_BITS(struct amap_eth_rx_compl, err, rxcp); +	int tcp_frame = AMAP_GET_BITS(struct amap_eth_rx_compl, tcpf, rxcp); + +	if (err) +		drvr_stats(adapter)->be_rxcp_err++; + +	return (!tcp_frame || err || (adapter->max_rx_coal <= 1)) ? +		false : true; +} + +int be_poll_rx(struct napi_struct *napi, int budget) +{ +	struct be_eq_obj *rx_eq = container_of(napi, struct be_eq_obj, napi); +	struct be_adapter *adapter = +		container_of(rx_eq, struct be_adapter, rx_eq); +	struct be_queue_info *rx_cq = &adapter->rx_obj.cq; +	struct be_eth_rx_compl *rxcp; +	u32 work_done; + +	for (work_done = 0; work_done < budget; work_done++) { +		rxcp = be_rx_compl_get(adapter); +		if (!rxcp) +			break; + +		if (do_lro(adapter, rxcp)) +			be_rx_compl_process_lro(adapter, rxcp); +		else +			be_rx_compl_process(adapter, rxcp); +	} + +	lro_flush_all(&adapter->rx_obj.lro_mgr); + +	/* Refill the queue */ +	if (atomic_read(&adapter->rx_obj.q.used) < RX_FRAGS_REFILL_WM) +		be_post_rx_frags(adapter); + +	/* All consumed */ +	if (work_done < budget) { +		napi_complete(napi); +		be_cq_notify(&adapter->ctrl, rx_cq->id, true, work_done); +	} else { +		/* More to be consumed; continue with interrupts disabled */ +		be_cq_notify(&adapter->ctrl, rx_cq->id, false, work_done); +	} +	return work_done; +} + +/* For TX we don't honour budget; consume everything */ +int be_poll_tx(struct napi_struct *napi, int budget) +{ +	struct be_eq_obj *tx_eq = container_of(napi, struct be_eq_obj, napi); +	struct be_adapter *adapter = +		container_of(tx_eq, struct be_adapter, tx_eq); +	struct be_tx_obj *tx_obj = &adapter->tx_obj; +	struct be_queue_info *tx_cq = &tx_obj->cq; +	struct be_queue_info *txq = &tx_obj->q; +	struct be_eth_tx_compl *txcp; +	u32 num_cmpl = 0; +	u16 end_idx; + +	while ((txcp = be_tx_compl_get(adapter))) { +		end_idx = AMAP_GET_BITS(struct amap_eth_tx_compl, +					wrb_index, txcp); +		be_tx_compl_process(adapter, end_idx); +		num_cmpl++; +	} + +	/* As Tx wrbs have been freed up, wake up netdev queue if +	 * it was stopped due to lack of tx wrbs. +	 */ +	if (netif_queue_stopped(adapter->netdev) && +			atomic_read(&txq->used) < txq->len / 2) { +		netif_wake_queue(adapter->netdev); +	} + +	napi_complete(napi); + +	be_cq_notify(&adapter->ctrl, tx_cq->id, true, num_cmpl); + +	drvr_stats(adapter)->be_tx_events++; +	drvr_stats(adapter)->be_tx_compl += num_cmpl; + +	return 1; +} + +static void be_worker(struct work_struct *work) +{ +	struct be_adapter *adapter = +		container_of(work, struct be_adapter, work.work); +	int status; + +	/* Check link */ +	be_link_status_update(adapter); + +	/* Get Stats */ +	status = be_cmd_get_stats(&adapter->ctrl, &adapter->stats.cmd); +	if (!status) +		netdev_stats_update(adapter); + +	/* Set EQ delay */ +	be_rx_eqd_update(adapter); + +	if (adapter->rx_post_starved) { +		adapter->rx_post_starved = false; +		be_post_rx_frags(adapter); +	} + +	schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); +} + +static void be_msix_enable(struct be_adapter *adapter) +{ +	int i, status; + +	for (i = 0; i < BE_NUM_MSIX_VECTORS; i++) +		adapter->msix_entries[i].entry = i; + +	status = pci_enable_msix(adapter->pdev, adapter->msix_entries, +		BE_NUM_MSIX_VECTORS); +	if (status == 0) +		adapter->msix_enabled = true; +	return; +} + +static inline int be_msix_vec_get(struct be_adapter *adapter, u32 eq_id) +{ +	return adapter->msix_entries[eq_id - +			8 * adapter->ctrl.pci_func].vector; +} + +static int be_msix_register(struct be_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; +	struct be_eq_obj *tx_eq = &adapter->tx_eq; +	struct be_eq_obj *rx_eq = &adapter->rx_eq; +	int status, vec; + +	sprintf(tx_eq->desc, "%s-tx", netdev->name); +	vec = be_msix_vec_get(adapter, tx_eq->q.id); +	status = request_irq(vec, be_msix_tx, 0, tx_eq->desc, adapter); +	if (status) +		goto err; + +	sprintf(rx_eq->desc, "%s-rx", netdev->name); +	vec = be_msix_vec_get(adapter, rx_eq->q.id); +	status = request_irq(vec, be_msix_rx, 0, rx_eq->desc, adapter); +	if (status) { /* Free TX IRQ */ +		vec = be_msix_vec_get(adapter, tx_eq->q.id); +		free_irq(vec, adapter); +		goto err; +	} +	return 0; +err: +	dev_warn(&adapter->pdev->dev, +		"MSIX Request IRQ failed - err %d\n", status); +	pci_disable_msix(adapter->pdev); +	adapter->msix_enabled = false; +	return status; +} + +static int be_irq_register(struct be_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; +	int status; + +	if (adapter->msix_enabled) { +		status = be_msix_register(adapter); +		if (status == 0) +			goto done; +	} + +	/* INTx */ +	netdev->irq = adapter->pdev->irq; +	status = request_irq(netdev->irq, be_intx, IRQF_SHARED, netdev->name, +			adapter); +	if (status) { +		dev_err(&adapter->pdev->dev, +			"INTx request IRQ failed - err %d\n", status); +		return status; +	} +done: +	adapter->isr_registered = true; +	return 0; +} + +static void be_irq_unregister(struct be_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; +	int vec; + +	if (!adapter->isr_registered) +		return; + +	/* INTx */ +	if (!adapter->msix_enabled) { +		free_irq(netdev->irq, adapter); +		goto done; +	} + +	/* MSIx */ +	vec = be_msix_vec_get(adapter, adapter->tx_eq.q.id); +	free_irq(vec, adapter); +	vec = be_msix_vec_get(adapter, adapter->rx_eq.q.id); +	free_irq(vec, adapter); +done: +	adapter->isr_registered = false; +	return; +} + +static int be_open(struct net_device *netdev) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	struct be_ctrl_info *ctrl = &adapter->ctrl; +	struct be_eq_obj *rx_eq = &adapter->rx_eq; +	struct be_eq_obj *tx_eq = &adapter->tx_eq; +	u32 if_flags; +	int status; + +	if_flags = BE_IF_FLAGS_BROADCAST | BE_IF_FLAGS_PROMISCUOUS | +		BE_IF_FLAGS_MCAST_PROMISCUOUS | BE_IF_FLAGS_UNTAGGED | +		BE_IF_FLAGS_PASS_L3L4_ERRORS; +	status = be_cmd_if_create(ctrl, if_flags, netdev->dev_addr, +			false/* pmac_invalid */, &adapter->if_handle, +			&adapter->pmac_id); +	if (status != 0) +		goto do_none; + +	be_vid_config(netdev); + +	status = be_cmd_set_flow_control(ctrl, true, true); +	if (status != 0) +		goto if_destroy; + +	status = be_tx_queues_create(adapter); +	if (status != 0) +		goto if_destroy; + +	status = be_rx_queues_create(adapter); +	if (status != 0) +		goto tx_qs_destroy; + +	/* First time posting */ +	be_post_rx_frags(adapter); + +	napi_enable(&rx_eq->napi); +	napi_enable(&tx_eq->napi); + +	be_irq_register(adapter); + +	be_intr_set(ctrl, true); + +	/* The evt queues are created in the unarmed state; arm them */ +	be_eq_notify(ctrl, rx_eq->q.id, true, false, 0); +	be_eq_notify(ctrl, tx_eq->q.id, true, false, 0); + +	/* The compl queues are created in the unarmed state; arm them */ +	be_cq_notify(ctrl, adapter->rx_obj.cq.id, true, 0); +	be_cq_notify(ctrl, adapter->tx_obj.cq.id, true, 0); + +	be_link_status_update(adapter); + +	schedule_delayed_work(&adapter->work, msecs_to_jiffies(100)); +	return 0; + +tx_qs_destroy: +	be_tx_queues_destroy(adapter); +if_destroy: +	be_cmd_if_destroy(ctrl, adapter->if_handle); +do_none: +	return status; +} + +static int be_close(struct net_device *netdev) +{ +	struct be_adapter *adapter = netdev_priv(netdev); +	struct be_ctrl_info *ctrl = &adapter->ctrl; +	struct be_eq_obj *rx_eq = &adapter->rx_eq; +	struct be_eq_obj *tx_eq = &adapter->tx_eq; +	int vec; + +	cancel_delayed_work(&adapter->work); + +	netif_stop_queue(netdev); +	netif_carrier_off(netdev); +	adapter->link.speed = PHY_LINK_SPEED_ZERO; + +	be_intr_set(ctrl, false); + +	if (adapter->msix_enabled) { +		vec = be_msix_vec_get(adapter, tx_eq->q.id); +		synchronize_irq(vec); +		vec = be_msix_vec_get(adapter, rx_eq->q.id); +		synchronize_irq(vec); +	} else { +		synchronize_irq(netdev->irq); +	} +	be_irq_unregister(adapter); + +	napi_disable(&rx_eq->napi); +	napi_disable(&tx_eq->napi); + +	be_rx_queues_destroy(adapter); +	be_tx_queues_destroy(adapter); + +	be_cmd_if_destroy(ctrl, adapter->if_handle); +	return 0; +} + +static int be_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr, +				void **ip_hdr, void **tcpudp_hdr, +				u64 *hdr_flags, void *priv) +{ +	struct ethhdr *eh; +	struct vlan_ethhdr *veh; +	struct iphdr *iph; +	u8 *va = page_address(frag->page) + frag->page_offset; +	unsigned long ll_hlen; + +	prefetch(va); +	eh = (struct ethhdr *)va; +	*mac_hdr = eh; +	ll_hlen = ETH_HLEN; +	if (eh->h_proto != htons(ETH_P_IP)) { +		if (eh->h_proto == htons(ETH_P_8021Q)) { +			veh = (struct vlan_ethhdr *)va; +			if (veh->h_vlan_encapsulated_proto != htons(ETH_P_IP)) +				return -1; + +			ll_hlen += VLAN_HLEN; +		} else { +			return -1; +		} +	} +	*hdr_flags = LRO_IPV4; +	iph = (struct iphdr *)(va + ll_hlen); +	*ip_hdr = iph; +	if (iph->protocol != IPPROTO_TCP) +		return -1; +	*hdr_flags |= LRO_TCP; +	*tcpudp_hdr = (u8 *) (*ip_hdr) + (iph->ihl << 2); + +	return 0; +} + +static void be_lro_init(struct be_adapter *adapter, struct net_device *netdev) +{ +	struct net_lro_mgr *lro_mgr; + +	lro_mgr = &adapter->rx_obj.lro_mgr; +	lro_mgr->dev = netdev; +	lro_mgr->features = LRO_F_NAPI; +	lro_mgr->ip_summed = CHECKSUM_UNNECESSARY; +	lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY; +	lro_mgr->max_desc = BE_MAX_LRO_DESCRIPTORS; +	lro_mgr->lro_arr = adapter->rx_obj.lro_desc; +	lro_mgr->get_frag_header = be_get_frag_header; +	lro_mgr->max_aggr = BE_MAX_FRAGS_PER_FRAME; +} + +static struct net_device_ops be_netdev_ops = { +	.ndo_open		= be_open, +	.ndo_stop		= be_close, +	.ndo_start_xmit		= be_xmit, +	.ndo_get_stats		= be_get_stats, +	.ndo_set_rx_mode	= be_set_multicast_list, +	.ndo_set_mac_address	= be_mac_addr_set, +	.ndo_change_mtu		= be_change_mtu, +	.ndo_validate_addr	= eth_validate_addr, +	.ndo_vlan_rx_register	= be_vlan_register, +	.ndo_vlan_rx_add_vid	= be_vlan_add_vid, +	.ndo_vlan_rx_kill_vid	= be_vlan_rem_vid, +}; + +static void be_netdev_init(struct net_device *netdev) +{ +	struct be_adapter *adapter = netdev_priv(netdev); + +	netdev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO | +		NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_IP_CSUM | +		NETIF_F_IPV6_CSUM | NETIF_F_TSO6; + +	netdev->flags |= IFF_MULTICAST; + +	BE_SET_NETDEV_OPS(netdev, &be_netdev_ops); + +	SET_ETHTOOL_OPS(netdev, &be_ethtool_ops); + +	be_lro_init(adapter, netdev); + +	netif_napi_add(netdev, &adapter->rx_eq.napi, be_poll_rx, +		BE_NAPI_WEIGHT); +	netif_napi_add(netdev, &adapter->tx_eq.napi, be_poll_tx, +		BE_NAPI_WEIGHT); + +	netif_carrier_off(netdev); +	netif_stop_queue(netdev); +} + +static void be_unmap_pci_bars(struct be_adapter *adapter) +{ +	struct be_ctrl_info *ctrl = &adapter->ctrl; +	if (ctrl->csr) +		iounmap(ctrl->csr); +	if (ctrl->db) +		iounmap(ctrl->db); +	if (ctrl->pcicfg) +		iounmap(ctrl->pcicfg); +} + +static int be_map_pci_bars(struct be_adapter *adapter) +{ +	u8 __iomem *addr; + +	addr = ioremap_nocache(pci_resource_start(adapter->pdev, 2), +			pci_resource_len(adapter->pdev, 2)); +	if (addr == NULL) +		return -ENOMEM; +	adapter->ctrl.csr = addr; + +	addr = ioremap_nocache(pci_resource_start(adapter->pdev, 4), +			128 * 1024); +	if (addr == NULL) +		goto pci_map_err; +	adapter->ctrl.db = addr; + +	addr = ioremap_nocache(pci_resource_start(adapter->pdev, 1), +			pci_resource_len(adapter->pdev, 1)); +	if (addr == NULL) +		goto pci_map_err; +	adapter->ctrl.pcicfg = addr; + +	return 0; +pci_map_err: +	be_unmap_pci_bars(adapter); +	return -ENOMEM; +} + + +static void be_ctrl_cleanup(struct be_adapter *adapter) +{ +	struct be_dma_mem *mem = &adapter->ctrl.mbox_mem_alloced; + +	be_unmap_pci_bars(adapter); + +	if (mem->va) +		pci_free_consistent(adapter->pdev, mem->size, +			mem->va, mem->dma); +} + +/* Initialize the mbox required to send cmds to BE */ +static int be_ctrl_init(struct be_adapter *adapter) +{ +	struct be_ctrl_info *ctrl = &adapter->ctrl; +	struct be_dma_mem *mbox_mem_alloc = &ctrl->mbox_mem_alloced; +	struct be_dma_mem *mbox_mem_align = &ctrl->mbox_mem; +	int status; +	u32 val; + +	status = be_map_pci_bars(adapter); +	if (status) +		return status; + +	mbox_mem_alloc->size = sizeof(struct be_mcc_mailbox) + 16; +	mbox_mem_alloc->va = pci_alloc_consistent(adapter->pdev, +				mbox_mem_alloc->size, &mbox_mem_alloc->dma); +	if (!mbox_mem_alloc->va) { +		be_unmap_pci_bars(adapter); +		return -1; +	} +	mbox_mem_align->size = sizeof(struct be_mcc_mailbox); +	mbox_mem_align->va = PTR_ALIGN(mbox_mem_alloc->va, 16); +	mbox_mem_align->dma = PTR_ALIGN(mbox_mem_alloc->dma, 16); +	memset(mbox_mem_align->va, 0, sizeof(struct be_mcc_mailbox)); +	spin_lock_init(&ctrl->cmd_lock); + +	val = ioread32(ctrl->pcicfg + PCICFG_MEMBAR_CTRL_INT_CTRL_OFFSET); +	ctrl->pci_func = (val >> MEMBAR_CTRL_INT_CTRL_PFUNC_SHIFT) & +					MEMBAR_CTRL_INT_CTRL_PFUNC_MASK; +	return 0; +} + +static void be_stats_cleanup(struct be_adapter *adapter) +{ +	struct be_stats_obj *stats = &adapter->stats; +	struct be_dma_mem *cmd = &stats->cmd; + +	if (cmd->va) +		pci_free_consistent(adapter->pdev, cmd->size, +			cmd->va, cmd->dma); +} + +static int be_stats_init(struct be_adapter *adapter) +{ +	struct be_stats_obj *stats = &adapter->stats; +	struct be_dma_mem *cmd = &stats->cmd; + +	cmd->size = sizeof(struct be_cmd_req_get_stats); +	cmd->va = pci_alloc_consistent(adapter->pdev, cmd->size, &cmd->dma); +	if (cmd->va == NULL) +		return -1; +	return 0; +} + +static void __devexit be_remove(struct pci_dev *pdev) +{ +	struct be_adapter *adapter = pci_get_drvdata(pdev); +	if (!adapter) +		return; + +	unregister_netdev(adapter->netdev); + +	be_stats_cleanup(adapter); + +	be_ctrl_cleanup(adapter); + +	if (adapter->msix_enabled) { +		pci_disable_msix(adapter->pdev); +		adapter->msix_enabled = false; +	} + +	pci_set_drvdata(pdev, NULL); +	pci_release_regions(pdev); +	pci_disable_device(pdev); + +	free_netdev(adapter->netdev); +} + +static int be_hw_up(struct be_adapter *adapter) +{ +	struct be_ctrl_info *ctrl = &adapter->ctrl; +	int status; + +	status = be_cmd_POST(ctrl); +	if (status) +		return status; + +	status = be_cmd_get_fw_ver(ctrl, adapter->fw_ver); +	if (status) +		return status; + +	status = be_cmd_query_fw_cfg(ctrl, &adapter->port_num); +	return status; +} + +static int __devinit be_probe(struct pci_dev *pdev, +			const struct pci_device_id *pdev_id) +{ +	int status = 0; +	struct be_adapter *adapter; +	struct net_device *netdev; +	struct be_ctrl_info *ctrl; +	u8 mac[ETH_ALEN]; + +	status = pci_enable_device(pdev); +	if (status) +		goto do_none; + +	status = pci_request_regions(pdev, DRV_NAME); +	if (status) +		goto disable_dev; +	pci_set_master(pdev); + +	netdev = alloc_etherdev(sizeof(struct be_adapter)); +	if (netdev == NULL) { +		status = -ENOMEM; +		goto rel_reg; +	} +	adapter = netdev_priv(netdev); +	adapter->pdev = pdev; +	pci_set_drvdata(pdev, adapter); +	adapter->netdev = netdev; + +	be_msix_enable(adapter); + +	status = pci_set_dma_mask(pdev, DMA_64BIT_MASK); +	if (!status) { +		netdev->features |= NETIF_F_HIGHDMA; +	} else { +		status = pci_set_dma_mask(pdev, DMA_32BIT_MASK); +		if (status) { +			dev_err(&pdev->dev, "Could not set PCI DMA Mask\n"); +			goto free_netdev; +		} +	} + +	ctrl = &adapter->ctrl; +	status = be_ctrl_init(adapter); +	if (status) +		goto free_netdev; + +	status = be_stats_init(adapter); +	if (status) +		goto ctrl_clean; + +	status = be_hw_up(adapter); +	if (status) +		goto stats_clean; + +	status = be_cmd_mac_addr_query(ctrl, mac, MAC_ADDRESS_TYPE_NETWORK, +			true /* permanent */, 0); +	if (status) +		goto stats_clean; +	memcpy(netdev->dev_addr, mac, ETH_ALEN); + +	INIT_DELAYED_WORK(&adapter->work, be_worker); +	be_netdev_init(netdev); +	SET_NETDEV_DEV(netdev, &adapter->pdev->dev); + +	status = register_netdev(netdev); +	if (status != 0) +		goto stats_clean; + +	dev_info(&pdev->dev, BE_NAME " port %d\n", adapter->port_num); +	return 0; + +stats_clean: +	be_stats_cleanup(adapter); +ctrl_clean: +	be_ctrl_cleanup(adapter); +free_netdev: +	free_netdev(adapter->netdev); +rel_reg: +	pci_release_regions(pdev); +disable_dev: +	pci_disable_device(pdev); +do_none: +	dev_warn(&pdev->dev, BE_NAME " initialization failed\n"); +	return status; +} + +static int be_suspend(struct pci_dev *pdev, pm_message_t state) +{ +	struct be_adapter *adapter = pci_get_drvdata(pdev); +	struct net_device *netdev =  adapter->netdev; + +	netif_device_detach(netdev); +	if (netif_running(netdev)) { +		rtnl_lock(); +		be_close(netdev); +		rtnl_unlock(); +	} + +	pci_save_state(pdev); +	pci_disable_device(pdev); +	pci_set_power_state(pdev, pci_choose_state(pdev, state)); +	return 0; +} + +static int be_resume(struct pci_dev *pdev) +{ +	int status = 0; +	struct be_adapter *adapter = pci_get_drvdata(pdev); +	struct net_device *netdev =  adapter->netdev; + +	netif_device_detach(netdev); + +	status = pci_enable_device(pdev); +	if (status) +		return status; + +	pci_set_power_state(pdev, 0); +	pci_restore_state(pdev); + +	if (netif_running(netdev)) { +		rtnl_lock(); +		be_open(netdev); +		rtnl_unlock(); +	} +	netif_device_attach(netdev); +	return 0; +} + +static struct pci_driver be_driver = { +	.name = DRV_NAME, +	.id_table = be_dev_ids, +	.probe = be_probe, +	.remove = be_remove, +	.suspend = be_suspend, +	.resume = be_resume +}; + +static int __init be_init_module(void) +{ +	if (rx_frag_size != 8192 && rx_frag_size != 4096 +		&& rx_frag_size != 2048) { +		printk(KERN_WARNING DRV_NAME +			" : Module param rx_frag_size must be 2048/4096/8192." +			" Using 2048\n"); +		rx_frag_size = 2048; +	} +	/* Ensure rx_frag_size is aligned to chache line */ +	if (SKB_DATA_ALIGN(rx_frag_size) != rx_frag_size) { +		printk(KERN_WARNING DRV_NAME +			" : Bad module param rx_frag_size. Using 2048\n"); +		rx_frag_size = 2048; +	} + +	return pci_register_driver(&be_driver); +} +module_init(be_init_module); + +static void __exit be_exit_module(void) +{ +	pci_unregister_driver(&be_driver); +} +module_exit(be_exit_module); diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 6500b7c4739..6b6530ffdf1 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c @@ -57,8 +57,8 @@  #define DRV_MODULE_NAME		"bnx2"  #define PFX DRV_MODULE_NAME	": " -#define DRV_MODULE_VERSION	"1.9.2" -#define DRV_MODULE_RELDATE	"Feb 11, 2009" +#define DRV_MODULE_VERSION	"1.9.3" +#define DRV_MODULE_RELDATE	"March 17, 2009"  #define RUN_AT(x) (jiffies + (x)) @@ -5843,9 +5843,6 @@ bnx2_enable_msix(struct bnx2 *bp, int msix_vecs)  	for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {  		msix_ent[i].entry = i;  		msix_ent[i].vector = 0; - -		snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i); -		bp->irq_tbl[i].handler = bnx2_msi_1shot;  	}  	rc = pci_enable_msix(bp->pdev, msix_ent, BNX2_MAX_MSIX_VEC); @@ -5854,8 +5851,11 @@ bnx2_enable_msix(struct bnx2 *bp, int msix_vecs)  	bp->irq_nvecs = msix_vecs;  	bp->flags |= BNX2_FLAG_USING_MSIX | BNX2_FLAG_ONE_SHOT_MSI; -	for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) +	for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) {  		bp->irq_tbl[i].vector = msix_ent[i].vector; +		snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i); +		bp->irq_tbl[i].handler = bnx2_msi_1shot; +	}  }  static void diff --git a/drivers/net/bnx2x.h b/drivers/net/bnx2x.h index 15a5cf0f676..3cf2b92eef3 100644 --- a/drivers/net/bnx2x.h +++ b/drivers/net/bnx2x.h @@ -152,7 +152,7 @@ struct sw_rx_page {  #define PAGES_PER_SGE			(1 << PAGES_PER_SGE_SHIFT)  #define SGE_PAGE_SIZE			PAGE_SIZE  #define SGE_PAGE_SHIFT			PAGE_SHIFT -#define SGE_PAGE_ALIGN(addr)		PAGE_ALIGN(addr) +#define SGE_PAGE_ALIGN(addr)		PAGE_ALIGN((typeof(PAGE_SIZE))addr)  #define BCM_RX_ETH_PAYLOAD_ALIGN	64 diff --git a/drivers/net/bnx2x_init.h b/drivers/net/bnx2x_init.h index a6c0b3abba2..3b0c2499ef1 100644 --- a/drivers/net/bnx2x_init.h +++ b/drivers/net/bnx2x_init.h @@ -150,7 +150,6 @@ static void bnx2x_init_ind_wr(struct bnx2x *bp, u32 addr, const u32 *data,  static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len)  { -#ifdef USE_DMAE  	int offset = 0;  	if (bp->dmae_ready) { @@ -164,9 +163,6 @@ static void bnx2x_write_big_buf(struct bnx2x *bp, u32 addr, u32 len)  				 addr + offset, len);  	} else  		bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len); -#else -	bnx2x_init_str_wr(bp, addr, bp->gunzip_buf, len); -#endif  }  static void bnx2x_init_fill(struct bnx2x *bp, u32 addr, int fill, u32 len) diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c index d3e7775a9cc..2e346a5e98c 100644 --- a/drivers/net/bnx2x_main.c +++ b/drivers/net/bnx2x_main.c @@ -57,7 +57,7 @@  #include "bnx2x.h"  #include "bnx2x_init.h" -#define DRV_MODULE_VERSION	"1.45.26" +#define DRV_MODULE_VERSION	"1.45.27"  #define DRV_MODULE_RELDATE	"2009/01/26"  #define BNX2X_BC_VER		0x040200 @@ -4035,10 +4035,10 @@ static void bnx2x_zero_sb(struct bnx2x *bp, int sb_id)  {  	int port = BP_PORT(bp); -	bnx2x_init_fill(bp, BAR_USTRORM_INTMEM + +	bnx2x_init_fill(bp, USTORM_INTMEM_ADDR +  			USTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), 0,  			sizeof(struct ustorm_status_block)/4); -	bnx2x_init_fill(bp, BAR_CSTRORM_INTMEM + +	bnx2x_init_fill(bp, CSTORM_INTMEM_ADDR +  			CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id), 0,  			sizeof(struct cstorm_status_block)/4);  } @@ -4092,18 +4092,18 @@ static void bnx2x_zero_def_sb(struct bnx2x *bp)  {  	int func = BP_FUNC(bp); -	bnx2x_init_fill(bp, BAR_USTRORM_INTMEM + +	bnx2x_init_fill(bp, TSTORM_INTMEM_ADDR + +			TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0, +			sizeof(struct tstorm_def_status_block)/4); +	bnx2x_init_fill(bp, USTORM_INTMEM_ADDR +  			USTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,  			sizeof(struct ustorm_def_status_block)/4); -	bnx2x_init_fill(bp, BAR_CSTRORM_INTMEM + +	bnx2x_init_fill(bp, CSTORM_INTMEM_ADDR +  			CSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,  			sizeof(struct cstorm_def_status_block)/4); -	bnx2x_init_fill(bp, BAR_XSTRORM_INTMEM + +	bnx2x_init_fill(bp, XSTORM_INTMEM_ADDR +  			XSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0,  			sizeof(struct xstorm_def_status_block)/4); -	bnx2x_init_fill(bp, BAR_TSTRORM_INTMEM + -			TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(func), 0, -			sizeof(struct tstorm_def_status_block)/4);  }  static void bnx2x_init_def_sb(struct bnx2x *bp, @@ -4518,7 +4518,8 @@ static void bnx2x_init_context(struct bnx2x *bp)  				(USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA |  				 USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING);  			context->ustorm_st_context.common.sge_buff_size = -					(u16)(BCM_PAGE_SIZE*PAGES_PER_SGE); +				(u16)min((u32)SGE_PAGE_SIZE*PAGES_PER_SGE, +					 (u32)0xffff);  			context->ustorm_st_context.common.sge_page_base_hi =  						U64_HI(fp->rx_sge_mapping);  			context->ustorm_st_context.common.sge_page_base_lo = diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 9fb388388fb..3d76686dcec 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -3537,11 +3537,26 @@ static int bond_slave_netdev_event(unsigned long event, struct net_device *slave  		}  		break;  	case NETDEV_CHANGE: -		/* -		 * TODO: is this what we get if somebody -		 * sets up a hierarchical bond, then rmmod's -		 * one of the slave bonding devices? -		 */ +		if (bond->params.mode == BOND_MODE_8023AD || bond_is_lb(bond)) { +			struct slave *slave; + +			slave = bond_get_slave_by_dev(bond, slave_dev); +			if (slave) { +				u16 old_speed = slave->speed; +				u16 old_duplex = slave->duplex; + +				bond_update_speed_duplex(slave); + +				if (bond_is_lb(bond)) +					break; + +				if (old_speed != slave->speed) +					bond_3ad_adapter_speed_changed(slave); +				if (old_duplex != slave->duplex) +					bond_3ad_adapter_duplex_changed(slave); +			} +		} +  		break;  	case NETDEV_DOWN:  		/* @@ -4113,7 +4128,7 @@ static int bond_neigh_setup(struct net_device *dev, struct neigh_parms *parms)  		const struct net_device_ops *slave_ops  			= slave->dev->netdev_ops;  		if (slave_ops->ndo_neigh_setup) -			return slave_ops->ndo_neigh_setup(dev, parms); +			return slave_ops->ndo_neigh_setup(slave->dev, parms);  	}  	return 0;  } diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index bcf92917bbf..254ec62b5f5 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c @@ -930,13 +930,15 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id)  	struct net_device *dev = dev_id;  	board_info_t *db = netdev_priv(dev);  	int int_status; +	unsigned long flags;  	u8 reg_save;  	dm9000_dbg(db, 3, "entering %s\n", __func__);  	/* A real interrupt coming */ -	spin_lock(&db->lock); +	/* holders of db->lock must always block IRQs */ +	spin_lock_irqsave(&db->lock, flags);  	/* Save previous register address */  	reg_save = readb(db->io_addr); @@ -972,7 +974,7 @@ static irqreturn_t dm9000_interrupt(int irq, void *dev_id)  	/* Restore previous register address */  	writeb(reg_save, db->io_addr); -	spin_unlock(&db->lock); +	spin_unlock_irqrestore(&db->lock, flags);  	return IRQ_HANDLED;  } diff --git a/drivers/net/dnet.c b/drivers/net/dnet.c new file mode 100644 index 00000000000..1b4063222a8 --- /dev/null +++ b/drivers/net/dnet.c @@ -0,0 +1,994 @@ +/* + * Dave DNET Ethernet Controller driver + * + * Copyright (C) 2008 Dave S.r.l. <www.dave.eu> + * Copyright (C) 2009 Ilya Yanok, Emcraft Systems Ltd, <yanok@emcraft.com> + * + * This program is free software; you can redistribute it and/or modify + * 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/module.h> +#include <linux/moduleparam.h> +#include <linux/kernel.h> +#include <linux/types.h> +#include <linux/slab.h> +#include <linux/delay.h> +#include <linux/init.h> +#include <linux/netdevice.h> +#include <linux/etherdevice.h> +#include <linux/dma-mapping.h> +#include <linux/platform_device.h> +#include <linux/phy.h> +#include <linux/platform_device.h> + +#include "dnet.h" + +#undef DEBUG + +/* function for reading internal MAC register */ +u16 dnet_readw_mac(struct dnet *bp, u16 reg) +{ +	u16 data_read; + +	/* issue a read */ +	dnet_writel(bp, reg, MACREG_ADDR); + +	/* since a read/write op to the MAC is very slow, +	 * we must wait before reading the data */ +	ndelay(500); + +	/* read data read from the MAC register */ +	data_read = dnet_readl(bp, MACREG_DATA); + +	/* all done */ +	return data_read; +} + +/* function for writing internal MAC register */ +void dnet_writew_mac(struct dnet *bp, u16 reg, u16 val) +{ +	/* load data to write */ +	dnet_writel(bp, val, MACREG_DATA); + +	/* issue a write */ +	dnet_writel(bp, reg | DNET_INTERNAL_WRITE, MACREG_ADDR); + +	/* since a read/write op to the MAC is very slow, +	 * we must wait before exiting */ +	ndelay(500); +} + +static void __dnet_set_hwaddr(struct dnet *bp) +{ +	u16 tmp; + +	tmp = cpu_to_be16(*((u16 *) bp->dev->dev_addr)); +	dnet_writew_mac(bp, DNET_INTERNAL_MAC_ADDR_0_REG, tmp); +	tmp = cpu_to_be16(*((u16 *) (bp->dev->dev_addr + 2))); +	dnet_writew_mac(bp, DNET_INTERNAL_MAC_ADDR_1_REG, tmp); +	tmp = cpu_to_be16(*((u16 *) (bp->dev->dev_addr + 4))); +	dnet_writew_mac(bp, DNET_INTERNAL_MAC_ADDR_2_REG, tmp); +} + +static void __devinit dnet_get_hwaddr(struct dnet *bp) +{ +	u16 tmp; +	u8 addr[6]; + +	/* +	 * from MAC docs: +	 * "Note that the MAC address is stored in the registers in Hexadecimal +	 * form. For example, to set the MAC Address to: AC-DE-48-00-00-80 +	 * would require writing 0xAC (octet 0) to address 0x0B (high byte of +	 * Mac_addr[15:0]), 0xDE (octet 1) to address 0x0A (Low byte of +	 * Mac_addr[15:0]), 0x48 (octet 2) to address 0x0D (high byte of +	 * Mac_addr[15:0]), 0x00 (octet 3) to address 0x0C (Low byte of +	 * Mac_addr[15:0]), 0x00 (octet 4) to address 0x0F (high byte of +	 * Mac_addr[15:0]), and 0x80 (octet 5) to address * 0x0E (Low byte of +	 * Mac_addr[15:0]). +	 */ +	tmp = dnet_readw_mac(bp, DNET_INTERNAL_MAC_ADDR_0_REG); +	*((u16 *) addr) = be16_to_cpu(tmp); +	tmp = dnet_readw_mac(bp, DNET_INTERNAL_MAC_ADDR_1_REG); +	*((u16 *) (addr + 2)) = be16_to_cpu(tmp); +	tmp = dnet_readw_mac(bp, DNET_INTERNAL_MAC_ADDR_2_REG); +	*((u16 *) (addr + 4)) = be16_to_cpu(tmp); + +	if (is_valid_ether_addr(addr)) +		memcpy(bp->dev->dev_addr, addr, sizeof(addr)); +} + +static int dnet_mdio_read(struct mii_bus *bus, int mii_id, int regnum) +{ +	struct dnet *bp = bus->priv; +	u16 value; + +	while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG) +				& DNET_INTERNAL_GMII_MNG_CMD_FIN)) +		cpu_relax(); + +	/* only 5 bits allowed for phy-addr and reg_offset */ +	mii_id &= 0x1f; +	regnum &= 0x1f; + +	/* prepare reg_value for a read */ +	value = (mii_id << 8); +	value |= regnum; + +	/* write control word */ +	dnet_writew_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG, value); + +	/* wait for end of transfer */ +	while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG) +				& DNET_INTERNAL_GMII_MNG_CMD_FIN)) +		cpu_relax(); + +	value = dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_DAT_REG); + +	pr_debug("mdio_read %02x:%02x <- %04x\n", mii_id, regnum, value); + +	return value; +} + +static int dnet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, +			   u16 value) +{ +	struct dnet *bp = bus->priv; +	u16 tmp; + +	pr_debug("mdio_write %02x:%02x <- %04x\n", mii_id, regnum, value); + +	while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG) +				& DNET_INTERNAL_GMII_MNG_CMD_FIN)) +		cpu_relax(); + +	/* prepare for a write operation */ +	tmp = (1 << 13); + +	/* only 5 bits allowed for phy-addr and reg_offset */ +	mii_id &= 0x1f; +	regnum &= 0x1f; + +	/* only 16 bits on data */ +	value &= 0xffff; + +	/* prepare reg_value for a write */ +	tmp |= (mii_id << 8); +	tmp |= regnum; + +	/* write data to write first */ +	dnet_writew_mac(bp, DNET_INTERNAL_GMII_MNG_DAT_REG, value); + +	/* write control word */ +	dnet_writew_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG, tmp); + +	while (!(dnet_readw_mac(bp, DNET_INTERNAL_GMII_MNG_CTL_REG) +				& DNET_INTERNAL_GMII_MNG_CMD_FIN)) +		cpu_relax(); + +	return 0; +} + +static int dnet_mdio_reset(struct mii_bus *bus) +{ +	return 0; +} + +static void dnet_handle_link_change(struct net_device *dev) +{ +	struct dnet *bp = netdev_priv(dev); +	struct phy_device *phydev = bp->phy_dev; +	unsigned long flags; +	u32 mode_reg, ctl_reg; + +	int status_change = 0; + +	spin_lock_irqsave(&bp->lock, flags); + +	mode_reg = dnet_readw_mac(bp, DNET_INTERNAL_MODE_REG); +	ctl_reg = dnet_readw_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG); + +	if (phydev->link) { +		if (bp->duplex != phydev->duplex) { +			if (phydev->duplex) +				ctl_reg &= +				    ~(DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP); +			else +				ctl_reg |= +				    DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP; + +			bp->duplex = phydev->duplex; +			status_change = 1; +		} + +		if (bp->speed != phydev->speed) { +			status_change = 1; +			switch (phydev->speed) { +			case 1000: +				mode_reg |= DNET_INTERNAL_MODE_GBITEN; +				break; +			case 100: +			case 10: +				mode_reg &= ~DNET_INTERNAL_MODE_GBITEN; +				break; +			default: +				printk(KERN_WARNING +				       "%s: Ack!  Speed (%d) is not " +				       "10/100/1000!\n", dev->name, +				       phydev->speed); +				break; +			} +			bp->speed = phydev->speed; +		} +	} + +	if (phydev->link != bp->link) { +		if (phydev->link) { +			mode_reg |= +			    (DNET_INTERNAL_MODE_RXEN | DNET_INTERNAL_MODE_TXEN); +		} else { +			mode_reg &= +			    ~(DNET_INTERNAL_MODE_RXEN | +			      DNET_INTERNAL_MODE_TXEN); +			bp->speed = 0; +			bp->duplex = -1; +		} +		bp->link = phydev->link; + +		status_change = 1; +	} + +	if (status_change) { +		dnet_writew_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG, ctl_reg); +		dnet_writew_mac(bp, DNET_INTERNAL_MODE_REG, mode_reg); +	} + +	spin_unlock_irqrestore(&bp->lock, flags); + +	if (status_change) { +		if (phydev->link) +			printk(KERN_INFO "%s: link up (%d/%s)\n", +			       dev->name, phydev->speed, +			       DUPLEX_FULL == phydev->duplex ? "Full" : "Half"); +		else +			printk(KERN_INFO "%s: link down\n", dev->name); +	} +} + +static int dnet_mii_probe(struct net_device *dev) +{ +	struct dnet *bp = netdev_priv(dev); +	struct phy_device *phydev = NULL; +	int phy_addr; + +	/* find the first phy */ +	for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) { +		if (bp->mii_bus->phy_map[phy_addr]) { +			phydev = bp->mii_bus->phy_map[phy_addr]; +			break; +		} +	} + +	if (!phydev) { +		printk(KERN_ERR "%s: no PHY found\n", dev->name); +		return -ENODEV; +	} + +	/* TODO : add pin_irq */ + +	/* attach the mac to the phy */ +	if (bp->capabilities & DNET_HAS_RMII) { +		phydev = phy_connect(dev, dev_name(&phydev->dev), +				     &dnet_handle_link_change, 0, +				     PHY_INTERFACE_MODE_RMII); +	} else { +		phydev = phy_connect(dev, dev_name(&phydev->dev), +				     &dnet_handle_link_change, 0, +				     PHY_INTERFACE_MODE_MII); +	} + +	if (IS_ERR(phydev)) { +		printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); +		return PTR_ERR(phydev); +	} + +	/* mask with MAC supported features */ +	if (bp->capabilities & DNET_HAS_GIGABIT) +		phydev->supported &= PHY_GBIT_FEATURES; +	else +		phydev->supported &= PHY_BASIC_FEATURES; + +	phydev->supported |= SUPPORTED_Asym_Pause | SUPPORTED_Pause; + +	phydev->advertising = phydev->supported; + +	bp->link = 0; +	bp->speed = 0; +	bp->duplex = -1; +	bp->phy_dev = phydev; + +	return 0; +} + +static int dnet_mii_init(struct dnet *bp) +{ +	int err, i; + +	bp->mii_bus = mdiobus_alloc(); +	if (bp->mii_bus == NULL) +		return -ENOMEM; + +	bp->mii_bus->name = "dnet_mii_bus"; +	bp->mii_bus->read = &dnet_mdio_read; +	bp->mii_bus->write = &dnet_mdio_write; +	bp->mii_bus->reset = &dnet_mdio_reset; + +	snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0); + +	bp->mii_bus->priv = bp; + +	bp->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL); +	if (!bp->mii_bus->irq) { +		err = -ENOMEM; +		goto err_out; +	} + +	for (i = 0; i < PHY_MAX_ADDR; i++) +		bp->mii_bus->irq[i] = PHY_POLL; + +	platform_set_drvdata(bp->dev, bp->mii_bus); + +	if (mdiobus_register(bp->mii_bus)) { +		err = -ENXIO; +		goto err_out_free_mdio_irq; +	} + +	if (dnet_mii_probe(bp->dev) != 0) { +		err = -ENXIO; +		goto err_out_unregister_bus; +	} + +	return 0; + +err_out_unregister_bus: +	mdiobus_unregister(bp->mii_bus); +err_out_free_mdio_irq: +	kfree(bp->mii_bus->irq); +err_out: +	mdiobus_free(bp->mii_bus); +	return err; +} + +/* For Neptune board: LINK1000 as Link LED and TX as activity LED */ +int dnet_phy_marvell_fixup(struct phy_device *phydev) +{ +	return phy_write(phydev, 0x18, 0x4148); +} + +static void dnet_update_stats(struct dnet *bp) +{ +	u32 __iomem *reg = bp->regs + DNET_RX_PKT_IGNR_CNT; +	u32 *p = &bp->hw_stats.rx_pkt_ignr; +	u32 *end = &bp->hw_stats.rx_byte + 1; + +	WARN_ON((unsigned long)(end - p - 1) != +		(DNET_RX_BYTE_CNT - DNET_RX_PKT_IGNR_CNT) / 4); + +	for (; p < end; p++, reg++) +		*p += readl(reg); + +	reg = bp->regs + DNET_TX_UNICAST_CNT; +	p = &bp->hw_stats.tx_unicast; +	end = &bp->hw_stats.tx_byte + 1; + +	WARN_ON((unsigned long)(end - p - 1) != +		(DNET_TX_BYTE_CNT - DNET_TX_UNICAST_CNT) / 4); + +	for (; p < end; p++, reg++) +		*p += readl(reg); +} + +static int dnet_poll(struct napi_struct *napi, int budget) +{ +	struct dnet *bp = container_of(napi, struct dnet, napi); +	struct net_device *dev = bp->dev; +	int npackets = 0; +	unsigned int pkt_len; +	struct sk_buff *skb; +	unsigned int *data_ptr; +	u32 int_enable; +	u32 cmd_word; +	int i; + +	while (npackets < budget) { +		/* +		 * break out of while loop if there are no more +		 * packets waiting +		 */ +		if (!(dnet_readl(bp, RX_FIFO_WCNT) >> 16)) { +			napi_complete(napi); +			int_enable = dnet_readl(bp, INTR_ENB); +			int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF; +			dnet_writel(bp, int_enable, INTR_ENB); +			return 0; +		} + +		cmd_word = dnet_readl(bp, RX_LEN_FIFO); +		pkt_len = cmd_word & 0xFFFF; + +		if (cmd_word & 0xDF180000) +			printk(KERN_ERR "%s packet receive error %x\n", +			       __func__, cmd_word); + +		skb = dev_alloc_skb(pkt_len + 5); +		if (skb != NULL) { +			/* Align IP on 16 byte boundaries */ +			skb_reserve(skb, 2); +			/* +			 * 'skb_put()' points to the start of sk_buff +			 * data area. +			 */ +			data_ptr = (unsigned int *)skb_put(skb, pkt_len); +			for (i = 0; i < (pkt_len + 3) >> 2; i++) +				*data_ptr++ = dnet_readl(bp, RX_DATA_FIFO); +			skb->protocol = eth_type_trans(skb, dev); +			netif_receive_skb(skb); +			npackets++; +		} else +			printk(KERN_NOTICE +			       "%s: No memory to allocate a sk_buff of " +			       "size %u.\n", dev->name, pkt_len); +	} + +	budget -= npackets; + +	if (npackets < budget) { +		/* We processed all packets available.  Tell NAPI it can +		 * stop polling then re-enable rx interrupts */ +		napi_complete(napi); +		int_enable = dnet_readl(bp, INTR_ENB); +		int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF; +		dnet_writel(bp, int_enable, INTR_ENB); +		return 0; +	} + +	/* There are still packets waiting */ +	return 1; +} + +static irqreturn_t dnet_interrupt(int irq, void *dev_id) +{ +	struct net_device *dev = dev_id; +	struct dnet *bp = netdev_priv(dev); +	u32 int_src, int_enable, int_current; +	unsigned long flags; +	unsigned int handled = 0; + +	spin_lock_irqsave(&bp->lock, flags); + +	/* read and clear the DNET irq (clear on read) */ +	int_src = dnet_readl(bp, INTR_SRC); +	int_enable = dnet_readl(bp, INTR_ENB); +	int_current = int_src & int_enable; + +	/* restart the queue if we had stopped it for TX fifo almost full */ +	if (int_current & DNET_INTR_SRC_TX_FIFOAE) { +		int_enable = dnet_readl(bp, INTR_ENB); +		int_enable &= ~DNET_INTR_ENB_TX_FIFOAE; +		dnet_writel(bp, int_enable, INTR_ENB); +		netif_wake_queue(dev); +		handled = 1; +	} + +	/* RX FIFO error checking */ +	if (int_current & +	    (DNET_INTR_SRC_RX_CMDFIFOFF | DNET_INTR_SRC_RX_DATAFIFOFF)) { +		printk(KERN_ERR "%s: RX fifo error %x, irq %x\n", __func__, +		       dnet_readl(bp, RX_STATUS), int_current); +		/* we can only flush the RX FIFOs */ +		dnet_writel(bp, DNET_SYS_CTL_RXFIFOFLUSH, SYS_CTL); +		ndelay(500); +		dnet_writel(bp, 0, SYS_CTL); +		handled = 1; +	} + +	/* TX FIFO error checking */ +	if (int_current & +	    (DNET_INTR_SRC_TX_FIFOFULL | DNET_INTR_SRC_TX_DISCFRM)) { +		printk(KERN_ERR "%s: TX fifo error %x, irq %x\n", __func__, +		       dnet_readl(bp, TX_STATUS), int_current); +		/* we can only flush the TX FIFOs */ +		dnet_writel(bp, DNET_SYS_CTL_TXFIFOFLUSH, SYS_CTL); +		ndelay(500); +		dnet_writel(bp, 0, SYS_CTL); +		handled = 1; +	} + +	if (int_current & DNET_INTR_SRC_RX_CMDFIFOAF) { +		if (napi_schedule_prep(&bp->napi)) { +			/* +			 * There's no point taking any more interrupts +			 * until we have processed the buffers +			 */ +			/* Disable Rx interrupts and schedule NAPI poll */ +			int_enable = dnet_readl(bp, INTR_ENB); +			int_enable &= ~DNET_INTR_SRC_RX_CMDFIFOAF; +			dnet_writel(bp, int_enable, INTR_ENB); +			__napi_schedule(&bp->napi); +		} +		handled = 1; +	} + +	if (!handled) +		pr_debug("%s: irq %x remains\n", __func__, int_current); + +	spin_unlock_irqrestore(&bp->lock, flags); + +	return IRQ_RETVAL(handled); +} + +#ifdef DEBUG +static inline void dnet_print_skb(struct sk_buff *skb) +{ +	int k; +	printk(KERN_DEBUG PFX "data:"); +	for (k = 0; k < skb->len; k++) +		printk(" %02x", (unsigned int)skb->data[k]); +	printk("\n"); +} +#else +#define dnet_print_skb(skb)	do {} while (0) +#endif + +static int dnet_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + +	struct dnet *bp = netdev_priv(dev); +	u32 tx_status, irq_enable; +	unsigned int len, i, tx_cmd, wrsz; +	unsigned long flags; +	unsigned int *bufp; + +	tx_status = dnet_readl(bp, TX_STATUS); + +	pr_debug("start_xmit: len %u head %p data %p\n", +	       skb->len, skb->head, skb->data); +	dnet_print_skb(skb); + +	/* frame size (words) */ +	len = (skb->len + 3) >> 2; + +	spin_lock_irqsave(&bp->lock, flags); + +	tx_status = dnet_readl(bp, TX_STATUS); + +	bufp = (unsigned int *)(((unsigned long) skb->data) & ~0x3UL); +	wrsz = (u32) skb->len + 3; +	wrsz += ((unsigned long) skb->data) & 0x3; +	wrsz >>= 2; +	tx_cmd = ((((unsigned long)(skb->data)) & 0x03) << 16) | (u32) skb->len; + +	/* check if there is enough room for the current frame */ +	if (wrsz < (DNET_FIFO_SIZE - dnet_readl(bp, TX_FIFO_WCNT))) { +		for (i = 0; i < wrsz; i++) +			dnet_writel(bp, *bufp++, TX_DATA_FIFO); + +		/* +		 * inform MAC that a packet's written and ready to be +		 * shipped out +		 */ +		dnet_writel(bp, tx_cmd, TX_LEN_FIFO); +	} + +	if (dnet_readl(bp, TX_FIFO_WCNT) > DNET_FIFO_TX_DATA_AF_TH) { +		netif_stop_queue(dev); +		tx_status = dnet_readl(bp, INTR_SRC); +		irq_enable = dnet_readl(bp, INTR_ENB); +		irq_enable |= DNET_INTR_ENB_TX_FIFOAE; +		dnet_writel(bp, irq_enable, INTR_ENB); +	} + +	/* free the buffer */ +	dev_kfree_skb(skb); + +	spin_unlock_irqrestore(&bp->lock, flags); + +	dev->trans_start = jiffies; + +	return 0; +} + +static void dnet_reset_hw(struct dnet *bp) +{ +	/* put ts_mac in IDLE state i.e. disable rx/tx */ +	dnet_writew_mac(bp, DNET_INTERNAL_MODE_REG, DNET_INTERNAL_MODE_FCEN); + +	/* +	 * RX FIFO almost full threshold: only cmd FIFO almost full is +	 * implemented for RX side +	 */ +	dnet_writel(bp, DNET_FIFO_RX_CMD_AF_TH, RX_FIFO_TH); +	/* +	 * TX FIFO almost empty threshold: only data FIFO almost empty +	 * is implemented for TX side +	 */ +	dnet_writel(bp, DNET_FIFO_TX_DATA_AE_TH, TX_FIFO_TH); + +	/* flush rx/tx fifos */ +	dnet_writel(bp, DNET_SYS_CTL_RXFIFOFLUSH | DNET_SYS_CTL_TXFIFOFLUSH, +			SYS_CTL); +	msleep(1); +	dnet_writel(bp, 0, SYS_CTL); +} + +static void dnet_init_hw(struct dnet *bp) +{ +	u32 config; + +	dnet_reset_hw(bp); +	__dnet_set_hwaddr(bp); + +	config = dnet_readw_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG); + +	if (bp->dev->flags & IFF_PROMISC) +		/* Copy All Frames */ +		config |= DNET_INTERNAL_RXTX_CONTROL_ENPROMISC; +	if (!(bp->dev->flags & IFF_BROADCAST)) +		/* No BroadCast */ +		config |= DNET_INTERNAL_RXTX_CONTROL_RXMULTICAST; + +	config |= DNET_INTERNAL_RXTX_CONTROL_RXPAUSE | +	    DNET_INTERNAL_RXTX_CONTROL_RXBROADCAST | +	    DNET_INTERNAL_RXTX_CONTROL_DROPCONTROL | +	    DNET_INTERNAL_RXTX_CONTROL_DISCFXFCS; + +	dnet_writew_mac(bp, DNET_INTERNAL_RXTX_CONTROL_REG, config); + +	/* clear irq before enabling them */ +	config = dnet_readl(bp, INTR_SRC); + +	/* enable RX/TX interrupt, recv packet ready interrupt */ +	dnet_writel(bp, DNET_INTR_ENB_GLOBAL_ENABLE | DNET_INTR_ENB_RX_SUMMARY | +			DNET_INTR_ENB_TX_SUMMARY | DNET_INTR_ENB_RX_FIFOERR | +			DNET_INTR_ENB_RX_ERROR | DNET_INTR_ENB_RX_FIFOFULL | +			DNET_INTR_ENB_TX_FIFOFULL | DNET_INTR_ENB_TX_DISCFRM | +			DNET_INTR_ENB_RX_PKTRDY, INTR_ENB); +} + +static int dnet_open(struct net_device *dev) +{ +	struct dnet *bp = netdev_priv(dev); + +	/* if the phy is not yet register, retry later */ +	if (!bp->phy_dev) +		return -EAGAIN; + +	if (!is_valid_ether_addr(dev->dev_addr)) +		return -EADDRNOTAVAIL; + +	napi_enable(&bp->napi); +	dnet_init_hw(bp); + +	phy_start_aneg(bp->phy_dev); + +	/* schedule a link state check */ +	phy_start(bp->phy_dev); + +	netif_start_queue(dev); + +	return 0; +} + +static int dnet_close(struct net_device *dev) +{ +	struct dnet *bp = netdev_priv(dev); + +	netif_stop_queue(dev); +	napi_disable(&bp->napi); + +	if (bp->phy_dev) +		phy_stop(bp->phy_dev); + +	dnet_reset_hw(bp); +	netif_carrier_off(dev); + +	return 0; +} + +static inline void dnet_print_pretty_hwstats(struct dnet_stats *hwstat) +{ +	pr_debug("%s\n", __func__); +	pr_debug("----------------------------- RX statistics " +		 "-------------------------------\n"); +	pr_debug("RX_PKT_IGNR_CNT %-8x\n", hwstat->rx_pkt_ignr); +	pr_debug("RX_LEN_CHK_ERR_CNT %-8x\n", hwstat->rx_len_chk_err); +	pr_debug("RX_LNG_FRM_CNT %-8x\n", hwstat->rx_lng_frm); +	pr_debug("RX_SHRT_FRM_CNT %-8x\n", hwstat->rx_shrt_frm); +	pr_debug("RX_IPG_VIOL_CNT %-8x\n", hwstat->rx_ipg_viol); +	pr_debug("RX_CRC_ERR_CNT %-8x\n", hwstat->rx_crc_err); +	pr_debug("RX_OK_PKT_CNT %-8x\n", hwstat->rx_ok_pkt); +	pr_debug("RX_CTL_FRM_CNT %-8x\n", hwstat->rx_ctl_frm); +	pr_debug("RX_PAUSE_FRM_CNT %-8x\n", hwstat->rx_pause_frm); +	pr_debug("RX_MULTICAST_CNT %-8x\n", hwstat->rx_multicast); +	pr_debug("RX_BROADCAST_CNT %-8x\n", hwstat->rx_broadcast); +	pr_debug("RX_VLAN_TAG_CNT %-8x\n", hwstat->rx_vlan_tag); +	pr_debug("RX_PRE_SHRINK_CNT %-8x\n", hwstat->rx_pre_shrink); +	pr_debug("RX_DRIB_NIB_CNT %-8x\n", hwstat->rx_drib_nib); +	pr_debug("RX_UNSUP_OPCD_CNT %-8x\n", hwstat->rx_unsup_opcd); +	pr_debug("RX_BYTE_CNT %-8x\n", hwstat->rx_byte); +	pr_debug("----------------------------- TX statistics " +		 "-------------------------------\n"); +	pr_debug("TX_UNICAST_CNT %-8x\n", hwstat->tx_unicast); +	pr_debug("TX_PAUSE_FRM_CNT %-8x\n", hwstat->tx_pause_frm); +	pr_debug("TX_MULTICAST_CNT %-8x\n", hwstat->tx_multicast); +	pr_debug("TX_BRDCAST_CNT %-8x\n", hwstat->tx_brdcast); +	pr_debug("TX_VLAN_TAG_CNT %-8x\n", hwstat->tx_vlan_tag); +	pr_debug("TX_BAD_FCS_CNT %-8x\n", hwstat->tx_bad_fcs); +	pr_debug("TX_JUMBO_CNT %-8x\n", hwstat->tx_jumbo); +	pr_debug("TX_BYTE_CNT %-8x\n", hwstat->tx_byte); +} + +static struct net_device_stats *dnet_get_stats(struct net_device *dev) +{ + +	struct dnet *bp = netdev_priv(dev); +	struct net_device_stats *nstat = &dev->stats; +	struct dnet_stats *hwstat = &bp->hw_stats; + +	/* read stats from hardware */ +	dnet_update_stats(bp); + +	/* Convert HW stats into netdevice stats */ +	nstat->rx_errors = (hwstat->rx_len_chk_err + +			    hwstat->rx_lng_frm + hwstat->rx_shrt_frm + +			    /* ignore IGP violation error +			    hwstat->rx_ipg_viol + */ +			    hwstat->rx_crc_err + +			    hwstat->rx_pre_shrink + +			    hwstat->rx_drib_nib + hwstat->rx_unsup_opcd); +	nstat->tx_errors = hwstat->tx_bad_fcs; +	nstat->rx_length_errors = (hwstat->rx_len_chk_err + +				   hwstat->rx_lng_frm + +				   hwstat->rx_shrt_frm + hwstat->rx_pre_shrink); +	nstat->rx_crc_errors = hwstat->rx_crc_err; +	nstat->rx_frame_errors = hwstat->rx_pre_shrink + hwstat->rx_drib_nib; +	nstat->rx_packets = hwstat->rx_ok_pkt; +	nstat->tx_packets = (hwstat->tx_unicast + +			     hwstat->tx_multicast + hwstat->tx_brdcast); +	nstat->rx_bytes = hwstat->rx_byte; +	nstat->tx_bytes = hwstat->tx_byte; +	nstat->multicast = hwstat->rx_multicast; +	nstat->rx_missed_errors = hwstat->rx_pkt_ignr; + +	dnet_print_pretty_hwstats(hwstat); + +	return nstat; +} + +static int dnet_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ +	struct dnet *bp = netdev_priv(dev); +	struct phy_device *phydev = bp->phy_dev; + +	if (!phydev) +		return -ENODEV; + +	return phy_ethtool_gset(phydev, cmd); +} + +static int dnet_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ +	struct dnet *bp = netdev_priv(dev); +	struct phy_device *phydev = bp->phy_dev; + +	if (!phydev) +		return -ENODEV; + +	return phy_ethtool_sset(phydev, cmd); +} + +static int dnet_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +{ +	struct dnet *bp = netdev_priv(dev); +	struct phy_device *phydev = bp->phy_dev; + +	if (!netif_running(dev)) +		return -EINVAL; + +	if (!phydev) +		return -ENODEV; + +	return phy_mii_ioctl(phydev, if_mii(rq), cmd); +} + +static void dnet_get_drvinfo(struct net_device *dev, +			     struct ethtool_drvinfo *info) +{ +	strcpy(info->driver, DRV_NAME); +	strcpy(info->version, DRV_VERSION); +	strcpy(info->bus_info, "0"); +} + +static const struct ethtool_ops dnet_ethtool_ops = { +	.get_settings		= dnet_get_settings, +	.set_settings		= dnet_set_settings, +	.get_drvinfo		= dnet_get_drvinfo, +	.get_link		= ethtool_op_get_link, +}; + +static const struct net_device_ops dnet_netdev_ops = { +	.ndo_open		= dnet_open, +	.ndo_stop		= dnet_close, +	.ndo_get_stats		= dnet_get_stats, +	.ndo_start_xmit		= dnet_start_xmit, +	.ndo_do_ioctl		= dnet_ioctl, +	.ndo_set_mac_address	= eth_mac_addr, +	.ndo_validate_addr	= eth_validate_addr, +	.ndo_change_mtu		= eth_change_mtu, +}; + +static int __devinit dnet_probe(struct platform_device *pdev) +{ +	struct resource *res; +	struct net_device *dev; +	struct dnet *bp; +	struct phy_device *phydev; +	int err = -ENXIO; +	unsigned int mem_base, mem_size, irq; + +	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	if (!res) { +		dev_err(&pdev->dev, "no mmio resource defined\n"); +		goto err_out; +	} +	mem_base = res->start; +	mem_size = resource_size(res); +	irq = platform_get_irq(pdev, 0); + +	if (!request_mem_region(mem_base, mem_size, DRV_NAME)) { +		dev_err(&pdev->dev, "no memory region available\n"); +		err = -EBUSY; +		goto err_out; +	} + +	err = -ENOMEM; +	dev = alloc_etherdev(sizeof(*bp)); +	if (!dev) { +		dev_err(&pdev->dev, "etherdev alloc failed, aborting.\n"); +		goto err_out; +	} + +	/* TODO: Actually, we have some interesting features... */ +	dev->features |= 0; + +	bp = netdev_priv(dev); +	bp->dev = dev; + +	SET_NETDEV_DEV(dev, &pdev->dev); + +	spin_lock_init(&bp->lock); + +	bp->regs = ioremap(mem_base, mem_size); +	if (!bp->regs) { +		dev_err(&pdev->dev, "failed to map registers, aborting.\n"); +		err = -ENOMEM; +		goto err_out_free_dev; +	} + +	dev->irq = irq; +	err = request_irq(dev->irq, dnet_interrupt, 0, DRV_NAME, dev); +	if (err) { +		dev_err(&pdev->dev, "Unable to request IRQ %d (error %d)\n", +		       irq, err); +		goto err_out_iounmap; +	} + +	dev->netdev_ops = &dnet_netdev_ops; +	netif_napi_add(dev, &bp->napi, dnet_poll, 64); +	dev->ethtool_ops = &dnet_ethtool_ops; + +	dev->base_addr = (unsigned long)bp->regs; + +	bp->capabilities = dnet_readl(bp, VERCAPS) & DNET_CAPS_MASK; + +	dnet_get_hwaddr(bp); + +	if (!is_valid_ether_addr(dev->dev_addr)) { +		/* choose a random ethernet address */ +		random_ether_addr(dev->dev_addr); +		__dnet_set_hwaddr(bp); +	} + +	err = register_netdev(dev); +	if (err) { +		dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); +		goto err_out_free_irq; +	} + +	/* register the PHY board fixup (for Marvell 88E1111) */ +	err = phy_register_fixup_for_uid(0x01410cc0, 0xfffffff0, +					 dnet_phy_marvell_fixup); +	/* we can live without it, so just issue a warning */ +	if (err) +		dev_warn(&pdev->dev, "Cannot register PHY board fixup.\n"); + +	if (dnet_mii_init(bp) != 0) +		goto err_out_unregister_netdev; + +	dev_info(&pdev->dev, "Dave DNET at 0x%p (0x%08x) irq %d %pM\n", +	       bp->regs, mem_base, dev->irq, dev->dev_addr); +	dev_info(&pdev->dev, "has %smdio, %sirq, %sgigabit, %sdma \n", +	       (bp->capabilities & DNET_HAS_MDIO) ? "" : "no ", +	       (bp->capabilities & DNET_HAS_IRQ) ? "" : "no ", +	       (bp->capabilities & DNET_HAS_GIGABIT) ? "" : "no ", +	       (bp->capabilities & DNET_HAS_DMA) ? "" : "no "); +	phydev = bp->phy_dev; +	dev_info(&pdev->dev, "attached PHY driver [%s] " +	       "(mii_bus:phy_addr=%s, irq=%d)\n", +	       phydev->drv->name, dev_name(&phydev->dev), phydev->irq); + +	return 0; + +err_out_unregister_netdev: +	unregister_netdev(dev); +err_out_free_irq: +	free_irq(dev->irq, dev); +err_out_iounmap: +	iounmap(bp->regs); +err_out_free_dev: +	free_netdev(dev); +err_out: +	return err; +} + +static int __devexit dnet_remove(struct platform_device *pdev) +{ + +	struct net_device *dev; +	struct dnet *bp; + +	dev = platform_get_drvdata(pdev); + +	if (dev) { +		bp = netdev_priv(dev); +		if (bp->phy_dev) +			phy_disconnect(bp->phy_dev); +		mdiobus_unregister(bp->mii_bus); +		kfree(bp->mii_bus->irq); +		mdiobus_free(bp->mii_bus); +		unregister_netdev(dev); +		free_irq(dev->irq, dev); +		iounmap(bp->regs); +		free_netdev(dev); +	} + +	return 0; +} + +static struct platform_driver dnet_driver = { +	.probe		= dnet_probe, +	.remove		= __devexit_p(dnet_remove), +	.driver		= { +		.name		= "dnet", +	}, +}; + +static int __init dnet_init(void) +{ +	return platform_driver_register(&dnet_driver); +} + +static void __exit dnet_exit(void) +{ +	platform_driver_unregister(&dnet_driver); +} + +module_init(dnet_init); +module_exit(dnet_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Dave DNET Ethernet driver"); +MODULE_AUTHOR("Ilya Yanok <yanok@emcraft.com>, " +	      "Matteo Vit <matteo.vit@dave.eu>"); diff --git a/drivers/net/dnet.h b/drivers/net/dnet.h new file mode 100644 index 00000000000..37f5b30fa78 --- /dev/null +++ b/drivers/net/dnet.h @@ -0,0 +1,225 @@ +/* + * Dave DNET Ethernet Controller driver + * + * Copyright (C) 2008 Dave S.r.l. <www.dave.eu> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef _DNET_H +#define _DNET_H + +#define DRV_NAME		"dnet" +#define DRV_VERSION		"0.9.1" +#define PFX				DRV_NAME ": " + +/* Register access macros */ +#define dnet_writel(port, value, reg)	\ +	writel((value), (port)->regs + DNET_##reg) +#define dnet_readl(port, reg)	readl((port)->regs + DNET_##reg) + +/* ALL DNET FIFO REGISTERS */ +#define DNET_RX_LEN_FIFO		0x000	/* RX_LEN_FIFO */ +#define DNET_RX_DATA_FIFO		0x004	/* RX_DATA_FIFO */ +#define DNET_TX_LEN_FIFO		0x008	/* TX_LEN_FIFO */ +#define DNET_TX_DATA_FIFO		0x00C	/* TX_DATA_FIFO */ + +/* ALL DNET CONTROL/STATUS REGISTERS OFFSETS */ +#define DNET_VERCAPS			0x100	/* VERCAPS */ +#define DNET_INTR_SRC			0x104	/* INTR_SRC */ +#define DNET_INTR_ENB			0x108	/* INTR_ENB */ +#define DNET_RX_STATUS			0x10C	/* RX_STATUS */ +#define DNET_TX_STATUS			0x110	/* TX_STATUS */ +#define DNET_RX_FRAMES_CNT		0x114	/* RX_FRAMES_CNT */ +#define DNET_TX_FRAMES_CNT		0x118	/* TX_FRAMES_CNT */ +#define DNET_RX_FIFO_TH			0x11C	/* RX_FIFO_TH */ +#define DNET_TX_FIFO_TH			0x120	/* TX_FIFO_TH */ +#define DNET_SYS_CTL			0x124	/* SYS_CTL */ +#define DNET_PAUSE_TMR			0x128	/* PAUSE_TMR */ +#define DNET_RX_FIFO_WCNT		0x12C	/* RX_FIFO_WCNT */ +#define DNET_TX_FIFO_WCNT		0x130	/* TX_FIFO_WCNT */ + +/* ALL DNET MAC REGISTERS */ +#define DNET_MACREG_DATA		0x200	/* Mac-Reg Data */ +#define DNET_MACREG_ADDR		0x204	/* Mac-Reg Addr  */ + +/* ALL DNET RX STATISTICS COUNTERS  */ +#define DNET_RX_PKT_IGNR_CNT		0x300 +#define DNET_RX_LEN_CHK_ERR_CNT		0x304 +#define DNET_RX_LNG_FRM_CNT		0x308 +#define DNET_RX_SHRT_FRM_CNT		0x30C +#define DNET_RX_IPG_VIOL_CNT		0x310 +#define DNET_RX_CRC_ERR_CNT		0x314 +#define DNET_RX_OK_PKT_CNT		0x318 +#define DNET_RX_CTL_FRM_CNT		0x31C +#define DNET_RX_PAUSE_FRM_CNT		0x320 +#define DNET_RX_MULTICAST_CNT		0x324 +#define DNET_RX_BROADCAST_CNT		0x328 +#define DNET_RX_VLAN_TAG_CNT		0x32C +#define DNET_RX_PRE_SHRINK_CNT		0x330 +#define DNET_RX_DRIB_NIB_CNT		0x334 +#define DNET_RX_UNSUP_OPCD_CNT		0x338 +#define DNET_RX_BYTE_CNT		0x33C + +/* DNET TX STATISTICS COUNTERS */ +#define DNET_TX_UNICAST_CNT		0x400 +#define DNET_TX_PAUSE_FRM_CNT		0x404 +#define DNET_TX_MULTICAST_CNT		0x408 +#define DNET_TX_BRDCAST_CNT		0x40C +#define DNET_TX_VLAN_TAG_CNT		0x410 +#define DNET_TX_BAD_FCS_CNT		0x414 +#define DNET_TX_JUMBO_CNT		0x418 +#define DNET_TX_BYTE_CNT		0x41C + +/* SOME INTERNAL MAC-CORE REGISTER */ +#define DNET_INTERNAL_MODE_REG		0x0 +#define DNET_INTERNAL_RXTX_CONTROL_REG	0x2 +#define DNET_INTERNAL_MAX_PKT_SIZE_REG	0x4 +#define DNET_INTERNAL_IGP_REG		0x8 +#define DNET_INTERNAL_MAC_ADDR_0_REG	0xa +#define DNET_INTERNAL_MAC_ADDR_1_REG	0xc +#define DNET_INTERNAL_MAC_ADDR_2_REG	0xe +#define DNET_INTERNAL_TX_RX_STS_REG	0x12 +#define DNET_INTERNAL_GMII_MNG_CTL_REG	0x14 +#define DNET_INTERNAL_GMII_MNG_DAT_REG	0x16 + +#define DNET_INTERNAL_GMII_MNG_CMD_FIN	(1 << 14) + +#define DNET_INTERNAL_WRITE		(1 << 31) + +/* MAC-CORE REGISTER FIELDS */ + +/* MAC-CORE MODE REGISTER FIELDS */ +#define DNET_INTERNAL_MODE_GBITEN			(1 << 0) +#define DNET_INTERNAL_MODE_FCEN				(1 << 1) +#define DNET_INTERNAL_MODE_RXEN				(1 << 2) +#define DNET_INTERNAL_MODE_TXEN				(1 << 3) + +/* MAC-CORE RXTX CONTROL REGISTER FIELDS */ +#define DNET_INTERNAL_RXTX_CONTROL_RXSHORTFRAME		(1 << 8) +#define DNET_INTERNAL_RXTX_CONTROL_RXBROADCAST		(1 << 7) +#define DNET_INTERNAL_RXTX_CONTROL_RXMULTICAST		(1 << 4) +#define DNET_INTERNAL_RXTX_CONTROL_RXPAUSE		(1 << 3) +#define DNET_INTERNAL_RXTX_CONTROL_DISTXFCS		(1 << 2) +#define DNET_INTERNAL_RXTX_CONTROL_DISCFXFCS		(1 << 1) +#define DNET_INTERNAL_RXTX_CONTROL_ENPROMISC		(1 << 0) +#define DNET_INTERNAL_RXTX_CONTROL_DROPCONTROL		(1 << 6) +#define DNET_INTERNAL_RXTX_CONTROL_ENABLEHALFDUP	(1 << 5) + +/* SYSTEM CONTROL REGISTER FIELDS */ +#define DNET_SYS_CTL_IGNORENEXTPKT			(1 << 0) +#define DNET_SYS_CTL_SENDPAUSE				(1 << 2) +#define DNET_SYS_CTL_RXFIFOFLUSH			(1 << 3) +#define DNET_SYS_CTL_TXFIFOFLUSH			(1 << 4) + +/* TX STATUS REGISTER FIELDS */ +#define DNET_TX_STATUS_FIFO_ALMOST_EMPTY		(1 << 2) +#define DNET_TX_STATUS_FIFO_ALMOST_FULL			(1 << 1) + +/* INTERRUPT SOURCE REGISTER FIELDS */ +#define DNET_INTR_SRC_TX_PKTSENT			(1 << 0) +#define DNET_INTR_SRC_TX_FIFOAF				(1 << 1) +#define DNET_INTR_SRC_TX_FIFOAE				(1 << 2) +#define DNET_INTR_SRC_TX_DISCFRM			(1 << 3) +#define DNET_INTR_SRC_TX_FIFOFULL			(1 << 4) +#define DNET_INTR_SRC_RX_CMDFIFOAF			(1 << 8) +#define DNET_INTR_SRC_RX_CMDFIFOFF			(1 << 9) +#define DNET_INTR_SRC_RX_DATAFIFOFF			(1 << 10) +#define DNET_INTR_SRC_TX_SUMMARY			(1 << 16) +#define DNET_INTR_SRC_RX_SUMMARY			(1 << 17) +#define DNET_INTR_SRC_PHY				(1 << 19) + +/* INTERRUPT ENABLE REGISTER FIELDS */ +#define DNET_INTR_ENB_TX_PKTSENT			(1 << 0) +#define DNET_INTR_ENB_TX_FIFOAF				(1 << 1) +#define DNET_INTR_ENB_TX_FIFOAE				(1 << 2) +#define DNET_INTR_ENB_TX_DISCFRM			(1 << 3) +#define DNET_INTR_ENB_TX_FIFOFULL			(1 << 4) +#define DNET_INTR_ENB_RX_PKTRDY				(1 << 8) +#define DNET_INTR_ENB_RX_FIFOAF				(1 << 9) +#define DNET_INTR_ENB_RX_FIFOERR			(1 << 10) +#define DNET_INTR_ENB_RX_ERROR				(1 << 11) +#define DNET_INTR_ENB_RX_FIFOFULL			(1 << 12) +#define DNET_INTR_ENB_RX_FIFOAE				(1 << 13) +#define DNET_INTR_ENB_TX_SUMMARY			(1 << 16) +#define DNET_INTR_ENB_RX_SUMMARY			(1 << 17) +#define DNET_INTR_ENB_GLOBAL_ENABLE			(1 << 18) + +/* default values: + * almost empty = less than one full sized ethernet frame (no jumbo) inside + * the fifo almost full = can write less than one full sized ethernet frame + * (no jumbo) inside the fifo + */ +#define DNET_CFG_TX_FIFO_FULL_THRES	25 +#define DNET_CFG_RX_FIFO_FULL_THRES	20 + +/* + * Capabilities. Used by the driver to know the capabilities that the ethernet + * controller inside the FPGA have. + */ + +#define DNET_HAS_MDIO		(1 << 0) +#define DNET_HAS_IRQ		(1 << 1) +#define DNET_HAS_GIGABIT	(1 << 2) +#define DNET_HAS_DMA		(1 << 3) + +#define DNET_HAS_MII		(1 << 4) /* or GMII */ +#define DNET_HAS_RMII		(1 << 5) /* or RGMII */ + +#define DNET_CAPS_MASK		0xFFFF + +#define DNET_FIFO_SIZE		1024 /* 1K x 32 bit */ +#define DNET_FIFO_TX_DATA_AF_TH	(DNET_FIFO_SIZE - 384) /* 384 = 1536 / 4 */ +#define DNET_FIFO_TX_DATA_AE_TH	384 + +#define DNET_FIFO_RX_CMD_AF_TH	(1 << 16) /* just one frame inside the FIFO */ + +/* + * Hardware-collected statistics. + */ +struct dnet_stats { +	u32 rx_pkt_ignr; +	u32 rx_len_chk_err; +	u32 rx_lng_frm; +	u32 rx_shrt_frm; +	u32 rx_ipg_viol; +	u32 rx_crc_err; +	u32 rx_ok_pkt; +	u32 rx_ctl_frm; +	u32 rx_pause_frm; +	u32 rx_multicast; +	u32 rx_broadcast; +	u32 rx_vlan_tag; +	u32 rx_pre_shrink; +	u32 rx_drib_nib; +	u32 rx_unsup_opcd; +	u32 rx_byte; +	u32 tx_unicast; +	u32 tx_pause_frm; +	u32 tx_multicast; +	u32 tx_brdcast; +	u32 tx_vlan_tag; +	u32 tx_bad_fcs; +	u32 tx_jumbo; +	u32 tx_byte; +}; + +struct dnet { +	void __iomem			*regs; +	spinlock_t			lock; +	struct platform_device		*pdev; +	struct net_device		*dev; +	struct dnet_stats		hw_stats; +	unsigned int			capabilities; /* read from FPGA */ +	struct napi_struct		napi; + +	/* PHY stuff */ +	struct mii_bus			*mii_bus; +	struct phy_device		*phy_dev; +	unsigned int			link; +	unsigned int			speed; +	unsigned int			duplex; +}; + +#endif /* _DNET_H */ diff --git a/drivers/net/ibm_newemac/core.c b/drivers/net/ibm_newemac/core.c index 87a706694fb..6fd7aa61736 100644 --- a/drivers/net/ibm_newemac/core.c +++ b/drivers/net/ibm_newemac/core.c @@ -2594,6 +2594,9 @@ static int __devinit emac_init_config(struct emac_instance *dev)  		if (of_device_is_compatible(np, "ibm,emac-460ex") ||  		    of_device_is_compatible(np, "ibm,emac-460gt"))  			dev->features |= EMAC_FTR_460EX_PHY_CLK_FIX; +		if (of_device_is_compatible(np, "ibm,emac-405ex") || +		    of_device_is_compatible(np, "ibm,emac-405exr")) +			dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX;  	} else if (of_device_is_compatible(np, "ibm,emac4")) {  		dev->features |= EMAC_FTR_EMAC4;  		if (of_device_is_compatible(np, "ibm,emac-440gx")) diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index a50db5398fa..9dd13ad12ce 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c @@ -1023,11 +1023,10 @@ static int __devinit igb_probe(struct pci_dev *pdev,  	struct net_device *netdev;  	struct igb_adapter *adapter;  	struct e1000_hw *hw; -	struct pci_dev *us_dev;  	const struct e1000_info *ei = igb_info_tbl[ent->driver_data];  	unsigned long mmio_start, mmio_len; -	int i, err, pci_using_dac, pos; -	u16 eeprom_data = 0, state = 0; +	int i, err, pci_using_dac; +	u16 eeprom_data = 0;  	u16 eeprom_apme_mask = IGB_EEPROM_APME;  	u32 part_num;  	int bars, need_ioport; @@ -1062,27 +1061,6 @@ static int __devinit igb_probe(struct pci_dev *pdev,  		}  	} -	/* 82575 requires that the pci-e link partner disable the L0s state */ -	switch (pdev->device) { -	case E1000_DEV_ID_82575EB_COPPER: -	case E1000_DEV_ID_82575EB_FIBER_SERDES: -	case E1000_DEV_ID_82575GB_QUAD_COPPER: -		us_dev = pdev->bus->self; -		pos = pci_find_capability(us_dev, PCI_CAP_ID_EXP); -		if (pos) { -			pci_read_config_word(us_dev, pos + PCI_EXP_LNKCTL, -			                     &state); -			state &= ~PCIE_LINK_STATE_L0S; -			pci_write_config_word(us_dev, pos + PCI_EXP_LNKCTL, -			                      state); -			dev_info(&pdev->dev, -				 "Disabling ASPM L0s upstream switch port %s\n", -				 pci_name(us_dev)); -		} -	default: -		break; -	} -  	err = pci_request_selected_regions(pdev, bars, igb_driver_name);  	if (err)  		goto err_pci_reg; diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index d2f4d5f508b..5d364a96e35 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c @@ -3973,6 +3973,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {  	.ndo_stop		= ixgbe_close,  	.ndo_start_xmit		= ixgbe_xmit_frame,  	.ndo_get_stats		= ixgbe_get_stats, +	.ndo_set_rx_mode        = ixgbe_set_rx_mode,  	.ndo_set_multicast_list	= ixgbe_set_rx_mode,  	.ndo_validate_addr	= eth_validate_addr,  	.ndo_set_mac_address	= ixgbe_set_mac, diff --git a/drivers/net/jme.c b/drivers/net/jme.c index 08b34051c64..a6e1a35a13c 100644 --- a/drivers/net/jme.c +++ b/drivers/net/jme.c @@ -957,13 +957,14 @@ jme_process_receive(struct jme_adapter *jme, int limit)  		goto out_inc;  	i = atomic_read(&rxring->next_to_clean); -	while (limit-- > 0) { +	while (limit > 0) {  		rxdesc = rxring->desc;  		rxdesc += i;  		if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) ||  		!(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL))  			goto out; +		--limit;  		desccnt = rxdesc->descwb.desccnt & RXWBDCNT_DCNT; diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index 13f11f402a9..b0bc3bc18e9 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c @@ -2030,11 +2030,6 @@ static void port_start(struct mv643xx_eth_private *mp)  	}  	/* -	 * Add configured unicast address to address filter table. -	 */ -	mv643xx_eth_program_unicast_filter(mp->dev); - -	/*  	 * Receive all unmatched unicast, TCP, UDP, BPDU and broadcast  	 * frames to RX queue #0, and include the pseudo-header when  	 * calculating receive checksums. @@ -2047,6 +2042,11 @@ static void port_start(struct mv643xx_eth_private *mp)  	wrlp(mp, PORT_CONFIG_EXT, 0x00000000);  	/* +	 * Add configured unicast addresses to address filter table. +	 */ +	mv643xx_eth_program_unicast_filter(mp->dev); + +	/*  	 * Enable the receive queues.  	 */  	for (i = 0; i < mp->rxq_count; i++) { diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index f4dd9acb687..1ff066b2281 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h @@ -1595,7 +1595,6 @@ dma_watchdog_wakeup(struct netxen_adapter *adapter)  } -int netxen_is_flash_supported(struct netxen_adapter *adapter);  int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 *mac);  int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac);  extern void netxen_change_ringparam(struct netxen_adapter *adapter); diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 821cff68b3f..7fea7708810 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c @@ -706,28 +706,6 @@ int netxen_nic_change_mtu(struct net_device *netdev, int mtu)  	return rc;  } -int netxen_is_flash_supported(struct netxen_adapter *adapter) -{ -	const int locs[] = { 0, 0x4, 0x100, 0x4000, 0x4128 }; -	int addr, val01, val02, i, j; - -	/* if the flash size less than 4Mb, make huge war cry and die */ -	for (j = 1; j < 4; j++) { -		addr = j * NETXEN_NIC_WINDOW_MARGIN; -		for (i = 0; i < ARRAY_SIZE(locs); i++) { -			if (netxen_rom_fast_read(adapter, locs[i], &val01) == 0 -			    && netxen_rom_fast_read(adapter, (addr + locs[i]), -						    &val02) == 0) { -				if (val01 == val02) -					return -1; -			} else -				return -1; -		} -	} - -	return 0; -} -  static int netxen_get_flash_block(struct netxen_adapter *adapter, int base,  				  int size, __le32 * buf)  { diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 13087782ac4..c172b6e24a9 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c @@ -405,9 +405,6 @@ netxen_read_mac_addr(struct netxen_adapter *adapter)  	struct net_device *netdev = adapter->netdev;  	struct pci_dev *pdev = adapter->pdev; -	if (netxen_is_flash_supported(adapter) != 0) -		return -EIO; -  	if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {  		if (netxen_p3_get_mac_addr(adapter, &mac_addr) != 0)  			return -EIO; diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c index e5cb6b1f0eb..2404a838b1f 100644 --- a/drivers/net/pcmcia/3c574_cs.c +++ b/drivers/net/pcmcia/3c574_cs.c @@ -1035,7 +1035,8 @@ static int el3_rx(struct net_device *dev, int worklimit)  	DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",  		  dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));  	while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) && -		   (--worklimit >= 0)) { +			worklimit > 0) { +		worklimit--;  		if (rx_status & 0x4000) { /* Error, update stats. */  			short error = rx_status & 0x3800;  			dev->stats.rx_errors++; diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c index 73ecc657999..1e01b8a6dbf 100644 --- a/drivers/net/pcmcia/3c589_cs.c +++ b/drivers/net/pcmcia/3c589_cs.c @@ -857,7 +857,8 @@ static int el3_rx(struct net_device *dev)      DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",  	  dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RX_STATUS));      while (!((rx_status = inw(ioaddr + RX_STATUS)) & 0x8000) && -	   (--worklimit >= 0)) { +		    worklimit > 0) { +	worklimit--;  	if (rx_status & 0x4000) { /* Error, update stats. */  	    short error = rx_status & 0x3800;  	    dev->stats.rx_errors++; diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index e6fdce9206c..aff9c5fec73 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h @@ -927,6 +927,7 @@ struct ib_mac_iocb_rsp {  	u8 flags1;  #define IB_MAC_IOCB_RSP_OI	0x01	/* Overide intr delay */  #define IB_MAC_IOCB_RSP_I	0x02	/* Disble Intr Generation */ +#define IB_MAC_CSUM_ERR_MASK 0x1c	/* A mask to use for csum errs */  #define IB_MAC_IOCB_RSP_TE	0x04	/* Checksum error */  #define IB_MAC_IOCB_RSP_NU	0x08	/* No checksum rcvd */  #define IB_MAC_IOCB_RSP_IE	0x10	/* IPv4 checksum error */ diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 8ea72dc60f7..91191f761fb 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -1436,18 +1436,32 @@ static void ql_process_mac_rx_intr(struct ql_adapter *qdev,  	if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_P) {  		QPRINTK(qdev, RX_STATUS, DEBUG, "Promiscuous Packet.\n");  	} -	if (ib_mac_rsp->flags1 & (IB_MAC_IOCB_RSP_IE | IB_MAC_IOCB_RSP_TE)) { -		QPRINTK(qdev, RX_STATUS, ERR, -			"Bad checksum for this %s packet.\n", -			((ib_mac_rsp-> -			  flags2 & IB_MAC_IOCB_RSP_T) ? "TCP" : "UDP")); -		skb->ip_summed = CHECKSUM_NONE; -	} else if (qdev->rx_csum && -		   ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) || -		    ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) && -		     !(ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_NU)))) { -		QPRINTK(qdev, RX_STATUS, DEBUG, "RX checksum done!\n"); -		skb->ip_summed = CHECKSUM_UNNECESSARY; + +	skb->protocol = eth_type_trans(skb, ndev); +	skb->ip_summed = CHECKSUM_NONE; + +	/* If rx checksum is on, and there are no +	 * csum or frame errors. +	 */ +	if (qdev->rx_csum && +		!(ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) && +		!(ib_mac_rsp->flags1 & IB_MAC_CSUM_ERR_MASK)) { +		/* TCP frame. */ +		if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) { +			QPRINTK(qdev, RX_STATUS, DEBUG, +					"TCP checksum done!\n"); +			skb->ip_summed = CHECKSUM_UNNECESSARY; +		} else if ((ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) && +				(ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_V4)) { +		/* Unfragmented ipv4 UDP frame. */ +			struct iphdr *iph = (struct iphdr *) skb->data; +			if (!(iph->frag_off & +				cpu_to_be16(IP_MF|IP_OFFSET))) { +				skb->ip_summed = CHECKSUM_UNNECESSARY; +				QPRINTK(qdev, RX_STATUS, DEBUG, +						"TCP checksum done!\n"); +			} +		}  	}  	qdev->stats.rx_packets++;  	qdev->stats.rx_bytes += skb->len; @@ -1927,6 +1941,9 @@ static int qlge_send(struct sk_buff *skb, struct net_device *ndev)  	tx_ring = &qdev->tx_ring[tx_ring_idx]; +	if (skb_padto(skb, ETH_ZLEN)) +		return NETDEV_TX_OK; +  	if (unlikely(atomic_read(&tx_ring->tx_count) < 2)) {  		QPRINTK(qdev, TX_QUEUED, INFO,  			"%s: shutting down tx queue %d du to lack of resources.\n", @@ -2970,9 +2987,9 @@ static int ql_adapter_initialize(struct ql_adapter *qdev)  	mask = value << 16;  	ql_write32(qdev, SYS, mask | value); -	/* Set the default queue. */ -	value = NIC_RCV_CFG_DFQ; -	mask = NIC_RCV_CFG_DFQ_MASK; +	/* Set the default queue, and VLAN behavior. */ +	value = NIC_RCV_CFG_DFQ | NIC_RCV_CFG_RV; +	mask = NIC_RCV_CFG_DFQ_MASK | (NIC_RCV_CFG_RV << 16);  	ql_write32(qdev, NIC_RCV_CFG, (mask | value));  	/* Set the MPI interrupt to enabled. */ @@ -3149,6 +3166,11 @@ static int ql_adapter_down(struct ql_adapter *qdev)  	ql_tx_ring_clean(qdev); +	/* Call netif_napi_del() from common point. +	 */ +	for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++) +		netif_napi_del(&qdev->rx_ring[i].napi); +  	spin_lock(&qdev->hw_lock);  	status = ql_adapter_reset(qdev);  	if (status) @@ -3853,7 +3875,7 @@ static int qlge_suspend(struct pci_dev *pdev, pm_message_t state)  {  	struct net_device *ndev = pci_get_drvdata(pdev);  	struct ql_adapter *qdev = netdev_priv(ndev); -	int err, i; +	int err;  	netif_device_detach(ndev); @@ -3863,9 +3885,6 @@ static int qlge_suspend(struct pci_dev *pdev, pm_message_t state)  			return err;  	} -	for (i = qdev->rss_ring_first_cq_id; i < qdev->rx_ring_count; i++) -		netif_napi_del(&qdev->rx_ring[i].napi); -  	err = pci_save_state(pdev);  	if (err)  		return err; diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index b3473401c83..43fedb9eced 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -81,9 +81,9 @@ static const int multicast_filter_limit = 32;  #define RTL8169_TX_TIMEOUT	(6*HZ)  #define RTL8169_PHY_TIMEOUT	(10*HZ) -#define RTL_EEPROM_SIG		0x8129 +#define RTL_EEPROM_SIG		cpu_to_le32(0x8129) +#define RTL_EEPROM_SIG_MASK	cpu_to_le32(0xffff)  #define RTL_EEPROM_SIG_ADDR	0x0000 -#define RTL_EEPROM_MAC_ADDR	0x0007  /* write/read MMIO register */  #define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg)) @@ -293,11 +293,6 @@ enum rtl_register_content {  	/* Cfg9346Bits */  	Cfg9346_Lock	= 0x00,  	Cfg9346_Unlock	= 0xc0, -	Cfg9346_Program	= 0x80,		/* Programming mode */ -	Cfg9346_EECS	= 0x08,		/* Chip select */ -	Cfg9346_EESK	= 0x04,		/* Serial data clock */ -	Cfg9346_EEDI	= 0x02,		/* Data input */ -	Cfg9346_EEDO	= 0x01,		/* Data output */  	/* rx_mode_bits */  	AcceptErr	= 0x20, @@ -310,7 +305,6 @@ enum rtl_register_content {  	/* RxConfigBits */  	RxCfgFIFOShift	= 13,  	RxCfgDMAShift	=  8, -	RxCfg9356SEL	=  6, 		/* EEPROM type: 0 = 9346, 1 = 9356 */  	/* TxConfigBits */  	TxInterFrameGapShift = 24, @@ -1969,108 +1963,6 @@ static const struct net_device_ops rtl8169_netdev_ops = {  }; -/* Delay between EEPROM clock transitions. Force out buffered PCI writes. */ -#define RTL_EEPROM_DELAY()	RTL_R8(Cfg9346) -#define RTL_EEPROM_READ_CMD	6 - -/* read 16bit word stored in EEPROM. EEPROM is addressed by words. */ -static u16 rtl_eeprom_read(void __iomem *ioaddr, int addr) -{ -	u16 result = 0; -	int cmd, cmd_len, i; - -	/* check for EEPROM address size (in bits) */ -	if (RTL_R32(RxConfig) & (1 << RxCfg9356SEL)) { -		/* EEPROM is 93C56 */ -		cmd_len = 3 + 8; /* 3 bits for command id and 8 for address */ -		cmd = (RTL_EEPROM_READ_CMD << 8) | (addr & 0xff); -	} else { -		/* EEPROM is 93C46 */ -		cmd_len = 3 + 6; /* 3 bits for command id and 6 for address */ -		cmd = (RTL_EEPROM_READ_CMD << 6) | (addr & 0x3f); -	} - -	/* enter programming mode */ -	RTL_W8(Cfg9346, Cfg9346_Program | Cfg9346_EECS); -	RTL_EEPROM_DELAY(); - -	/* write command and requested address */ -	while (cmd_len--) { -		u8 x = Cfg9346_Program | Cfg9346_EECS; - -		x |= (cmd & (1 << cmd_len)) ? Cfg9346_EEDI : 0; - -		/* write a bit */ -		RTL_W8(Cfg9346, x); -		RTL_EEPROM_DELAY(); - -		/* raise clock */ -		RTL_W8(Cfg9346, x | Cfg9346_EESK); -		RTL_EEPROM_DELAY(); -	} - -	/* lower clock */ -	RTL_W8(Cfg9346, Cfg9346_Program | Cfg9346_EECS); -	RTL_EEPROM_DELAY(); - -	/* read back 16bit value */ -	for (i = 16; i > 0; i--) { -		/* raise clock */ -		RTL_W8(Cfg9346, Cfg9346_Program | Cfg9346_EECS | Cfg9346_EESK); -		RTL_EEPROM_DELAY(); - -		result <<= 1; -		result |= (RTL_R8(Cfg9346) & Cfg9346_EEDO) ? 1 : 0; - -		/* lower clock */ -		RTL_W8(Cfg9346, Cfg9346_Program | Cfg9346_EECS); -		RTL_EEPROM_DELAY(); -	} - -	RTL_W8(Cfg9346, Cfg9346_Program); -	/* leave programming mode */ -	RTL_W8(Cfg9346, Cfg9346_Lock); - -	return result; -} - -static void rtl_init_mac_address(struct rtl8169_private *tp, -				 void __iomem *ioaddr) -{ -	struct pci_dev *pdev = tp->pci_dev; -	u16 x; -	u8 mac[8]; - -	/* read EEPROM signature */ -	x = rtl_eeprom_read(ioaddr, RTL_EEPROM_SIG_ADDR); - -	if (x != RTL_EEPROM_SIG) { -		dev_info(&pdev->dev, "Missing EEPROM signature: %04x\n", x); -		return; -	} - -	/* read MAC address */ -	x = rtl_eeprom_read(ioaddr, RTL_EEPROM_MAC_ADDR); -	mac[0] = x & 0xff; -	mac[1] = x >> 8; -	x = rtl_eeprom_read(ioaddr, RTL_EEPROM_MAC_ADDR + 1); -	mac[2] = x & 0xff; -	mac[3] = x >> 8; -	x = rtl_eeprom_read(ioaddr, RTL_EEPROM_MAC_ADDR + 2); -	mac[4] = x & 0xff; -	mac[5] = x >> 8; - -	if (netif_msg_probe(tp)) { -		DECLARE_MAC_BUF(buf); - -		dev_info(&pdev->dev, "MAC address found in EEPROM: %s\n", -			 print_mac(buf, mac)); -	} - -	if (is_valid_ether_addr(mac)) -		rtl_rar_set(tp, mac); -} -  static int __devinit  rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  { @@ -2249,8 +2141,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	tp->mmio_addr = ioaddr; -	rtl_init_mac_address(tp, ioaddr); -  	/* Get MAC address */  	for (i = 0; i < MAC_ADDR_LEN; i++)  		dev->dev_addr[i] = RTL_R8(MAC0 + i); @@ -3363,13 +3253,6 @@ static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)  		opts1 |= FirstFrag;  	} else {  		len = skb->len; - -		if (unlikely(len < ETH_ZLEN)) { -			if (skb_padto(skb, ETH_ZLEN)) -				goto err_update_stats; -			len = ETH_ZLEN; -		} -  		opts1 |= FirstFrag | LastFrag;  		tp->tx_skb[entry].skb = skb;  	} @@ -3407,7 +3290,6 @@ out:  err_stop:  	netif_stop_queue(dev);  	ret = NETDEV_TX_BUSY; -err_update_stats:  	dev->stats.tx_dropped++;  	goto out;  } diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index 7f8e514eb5e..7b1882765a0 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c @@ -687,6 +687,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)  {  	struct net_device *ndev = netdev;  	struct sh_eth_private *mdp = netdev_priv(ndev); +	irqreturn_t ret = IRQ_NONE;  	u32 ioaddr, boguscnt = RX_RING_SIZE;  	u32 intr_status = 0; @@ -696,7 +697,13 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)  	/* Get interrpt stat */  	intr_status = ctrl_inl(ioaddr + EESR);  	/* Clear interrupt */ -	ctrl_outl(intr_status, ioaddr + EESR); +	if (intr_status & (EESR_FRC | EESR_RMAF | EESR_RRF | +			EESR_RTLF | EESR_RTSF | EESR_PRE | EESR_CERF | +			TX_CHECK | EESR_ERR_CHECK)) { +		ctrl_outl(intr_status, ioaddr + EESR); +		ret = IRQ_HANDLED; +	} else +		goto other_irq;  	if (intr_status & (EESR_FRC | /* Frame recv*/  			EESR_RMAF | /* Multi cast address recv*/ @@ -723,9 +730,10 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)  		       ndev->name, intr_status);  	} +other_irq:  	spin_unlock(&mdp->lock); -	return IRQ_HANDLED; +	return ret;  }  static void sh_eth_timer(unsigned long data) @@ -844,7 +852,13 @@ static int sh_eth_open(struct net_device *ndev)  	int ret = 0;  	struct sh_eth_private *mdp = netdev_priv(ndev); -	ret = request_irq(ndev->irq, &sh_eth_interrupt, 0, ndev->name, ndev); +	ret = request_irq(ndev->irq, &sh_eth_interrupt, +#if defined(CONFIG_CPU_SUBTYPE_SH7763) || defined(CONFIG_CPU_SUBTYPE_SH7764) +				IRQF_SHARED, +#else +				0, +#endif +				ndev->name, ndev);  	if (ret) {  		printk(KERN_ERR "Can not assign IRQ number to %s\n", CARDNAME);  		return ret; diff --git a/drivers/net/sh_eth.h b/drivers/net/sh_eth.h index 73bc7181cc1..1537e13e623 100644 --- a/drivers/net/sh_eth.h +++ b/drivers/net/sh_eth.h @@ -43,8 +43,8 @@  #define SH7763_SKB_ALIGN 32  /* Chip Base Address */ -# define SH_TSU_ADDR  0xFFE01800 -# define ARSTR 		  0xFFE01800 +# define SH_TSU_ADDR	0xFEE01800 +# define ARSTR			SH_TSU_ADDR  /* Chip Registers */  /* E-DMAC */ diff --git a/drivers/net/smc911x.h b/drivers/net/smc911x.h index 870b4c33f10..a45952e7201 100644 --- a/drivers/net/smc911x.h +++ b/drivers/net/smc911x.h @@ -42,6 +42,16 @@    #define SMC_USE_16BIT		0    #define SMC_USE_32BIT		1    #define SMC_IRQ_SENSE		IRQF_TRIGGER_LOW +#elif defined(CONFIG_ARCH_OMAP34XX) +  #define SMC_USE_16BIT		0 +  #define SMC_USE_32BIT		1 +  #define SMC_IRQ_SENSE		IRQF_TRIGGER_LOW +  #define SMC_MEM_RESERVED	1 +#elif defined(CONFIG_ARCH_OMAP24XX) +  #define SMC_USE_16BIT		0 +  #define SMC_USE_32BIT		1 +  #define SMC_IRQ_SENSE		IRQF_TRIGGER_LOW +  #define SMC_MEM_RESERVED	1  #else  /*   * Default configuration @@ -675,6 +685,7 @@ smc_pxa_dma_outsl(struct smc911x_local *lp, u_long physaddr,  #define CHIP_9116	0x0116  #define CHIP_9117	0x0117  #define CHIP_9118	0x0118 +#define CHIP_9211	0x9211  #define CHIP_9215	0x115A  #define CHIP_9217	0x117A  #define CHIP_9218	0x118A @@ -689,6 +700,7 @@ static const struct chip_id chip_ids[] =  {  	{ CHIP_9116, "LAN9116" },  	{ CHIP_9117, "LAN9117" },  	{ CHIP_9118, "LAN9118" }, +	{ CHIP_9211, "LAN9211" },  	{ CHIP_9215, "LAN9215" },  	{ CHIP_9217, "LAN9217" },  	{ CHIP_9218, "LAN9218" }, diff --git a/drivers/net/smsc911x.c b/drivers/net/smsc911x.c index 9a78daec2fe..d1590ac55e4 100644 --- a/drivers/net/smsc911x.c +++ b/drivers/net/smsc911x.c @@ -1225,6 +1225,10 @@ static int smsc911x_open(struct net_device *dev)  	dev_info(&dev->dev, "SMSC911x/921x identified at %#08lx, IRQ: %d\n",  		 (unsigned long)pdata->ioaddr, dev->irq); +	/* Reset the last known duplex and carrier */ +	pdata->last_duplex = -1; +	pdata->last_carrier = -1; +  	/* Bring the PHY up */  	phy_start(pdata->phy_dev); diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index 8d64b1da046..c9c7650826c 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c @@ -1229,7 +1229,7 @@ static void gem_reset(struct gem *gp)  			break;  	} while (val & (GREG_SWRST_TXRST | GREG_SWRST_RXRST)); -	if (limit <= 0) +	if (limit < 0)  		printk(KERN_ERR "%s: SW reset is ghetto.\n", gp->dev->name);  	if (gp->phy_type == phy_serialink || gp->phy_type == phy_serdes) @@ -2998,8 +2998,11 @@ static const struct net_device_ops gem_netdev_ops = {  	.ndo_do_ioctl		= gem_ioctl,  	.ndo_tx_timeout		= gem_tx_timeout,  	.ndo_change_mtu		= gem_change_mtu, -	.ndo_set_mac_address 	= eth_mac_addr,  	.ndo_validate_addr	= eth_validate_addr, +	.ndo_set_mac_address    = gem_set_mac_address, +#ifdef CONFIG_NET_POLL_CONTROLLER +	.ndo_poll_controller    = gem_poll_controller, +#endif  };  static int __devinit gem_init_one(struct pci_dev *pdev, @@ -3161,10 +3164,6 @@ static int __devinit gem_init_one(struct pci_dev *pdev,  	dev->watchdog_timeo = 5 * HZ;  	dev->irq = pdev->irq;  	dev->dma = 0; -	dev->set_mac_address = gem_set_mac_address; -#ifdef CONFIG_NET_POLL_CONTROLLER -	dev->poll_controller = gem_poll_controller; -#endif  	/* Set that now, in case PM kicks in now */  	pci_set_drvdata(pdev, dev); diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c index d4fb4acdbeb..4e9bd380a5c 100644 --- a/drivers/net/sunhme.c +++ b/drivers/net/sunhme.c @@ -2649,8 +2649,6 @@ static int __devinit happy_meal_sbus_probe_one(struct of_device *op, int is_qfe)  	int err = -ENODEV;  	sbus_dp = to_of_device(op->dev.parent)->node; -	if (is_qfe) -		sbus_dp = to_of_device(op->dev.parent->parent)->node;  	/* We can match PCI devices too, do not accept those here. */  	if (strcmp(sbus_dp->name, "sbus")) diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index b080f9493d8..dabdf59f801 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c @@ -1473,7 +1473,8 @@ static void tg3_phy_toggle_apd(struct tg3 *tp, bool enable)  {  	u32 reg; -	if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS)) +	if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) || +	    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)  		return;  	reg = MII_TG3_MISC_SHDW_WREN | diff --git a/drivers/net/tokenring/tmspci.c b/drivers/net/tokenring/tmspci.c index 5f601773c26..e2150b3c83d 100644 --- a/drivers/net/tokenring/tmspci.c +++ b/drivers/net/tokenring/tmspci.c @@ -121,11 +121,6 @@ static int __devinit tms_pci_attach(struct pci_dev *pdev, const struct pci_devic  		goto err_out_trdev;  	} -	ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED, -			  dev->name, dev); -	if (ret) -		goto err_out_region; -  	dev->base_addr	= pci_ioaddr;  	dev->irq 	= pci_irq_line;  	dev->dma	= 0; @@ -142,7 +137,7 @@ static int __devinit tms_pci_attach(struct pci_dev *pdev, const struct pci_devic  	ret = tmsdev_init(dev, &pdev->dev);  	if (ret) {  		printk("%s: unable to get memory for dev->priv.\n", dev->name); -		goto err_out_irq; +		goto err_out_region;  	}  	tp = netdev_priv(dev); @@ -157,6 +152,11 @@ static int __devinit tms_pci_attach(struct pci_dev *pdev, const struct pci_devic  	tp->tmspriv = cardinfo; +	ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED, +			  dev->name, dev); +	if (ret) +		goto err_out_tmsdev; +  	dev->open = tms380tr_open;  	dev->stop = tms380tr_close;  	pci_set_drvdata(pdev, dev); @@ -164,15 +164,15 @@ static int __devinit tms_pci_attach(struct pci_dev *pdev, const struct pci_devic  	ret = register_netdev(dev);  	if (ret) -		goto err_out_tmsdev; +		goto err_out_irq;  	return 0; +err_out_irq: +	free_irq(pdev->irq, dev);  err_out_tmsdev:  	pci_set_drvdata(pdev, NULL);  	tmsdev_term(dev); -err_out_irq: -	free_irq(pdev->irq, dev);  err_out_region:  	release_region(pci_ioaddr, TMS_PCI_IO_EXTENT);  err_out_trdev: diff --git a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c index bee75fa87a9..2abb5d3becc 100644 --- a/drivers/net/tulip/tulip_core.c +++ b/drivers/net/tulip/tulip_core.c @@ -255,6 +255,7 @@ const char tulip_media_cap[32] =  static void tulip_tx_timeout(struct net_device *dev);  static void tulip_init_ring(struct net_device *dev); +static void tulip_free_ring(struct net_device *dev);  static int tulip_start_xmit(struct sk_buff *skb, struct net_device *dev);  static int tulip_open(struct net_device *dev);  static int tulip_close(struct net_device *dev); @@ -502,16 +503,21 @@ tulip_open(struct net_device *dev)  {  	int retval; -	if ((retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev))) -		return retval; -  	tulip_init_ring (dev); +	retval = request_irq(dev->irq, &tulip_interrupt, IRQF_SHARED, dev->name, dev); +	if (retval) +		goto free_ring; +  	tulip_up (dev);  	netif_start_queue (dev);  	return 0; + +free_ring: +	tulip_free_ring (dev); +	return retval;  } @@ -768,23 +774,11 @@ static void tulip_down (struct net_device *dev)  	tulip_set_power_state (tp, 0, 1);  } - -static int tulip_close (struct net_device *dev) +static void tulip_free_ring (struct net_device *dev)  {  	struct tulip_private *tp = netdev_priv(dev); -	void __iomem *ioaddr = tp->base_addr;  	int i; -	netif_stop_queue (dev); - -	tulip_down (dev); - -	if (tulip_debug > 1) -		printk (KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n", -			dev->name, ioread32 (ioaddr + CSR5)); - -	free_irq (dev->irq, dev); -  	/* Free all the skbuffs in the Rx queue. */  	for (i = 0; i < RX_RING_SIZE; i++) {  		struct sk_buff *skb = tp->rx_buffers[i].skb; @@ -803,6 +797,7 @@ static int tulip_close (struct net_device *dev)  			dev_kfree_skb (skb);  		}  	} +  	for (i = 0; i < TX_RING_SIZE; i++) {  		struct sk_buff *skb = tp->tx_buffers[i].skb; @@ -814,6 +809,24 @@ static int tulip_close (struct net_device *dev)  		tp->tx_buffers[i].skb = NULL;  		tp->tx_buffers[i].mapping = 0;  	} +} + +static int tulip_close (struct net_device *dev) +{ +	struct tulip_private *tp = netdev_priv(dev); +	void __iomem *ioaddr = tp->base_addr; + +	netif_stop_queue (dev); + +	tulip_down (dev); + +	if (tulip_debug > 1) +		printk (KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n", +			dev->name, ioread32 (ioaddr + CSR5)); + +	free_irq (dev->irq, dev); + +	tulip_free_ring (dev);  	return 0;  } diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index e87986867ba..1f61e42c641 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -1536,32 +1536,15 @@ static void adjust_link(struct net_device *dev)  static int init_phy(struct net_device *dev)  {  	struct ucc_geth_private *priv = netdev_priv(dev); -	struct device_node *np = priv->node; -	struct device_node *phy, *mdio; -	const phandle *ph; -	char bus_name[MII_BUS_ID_SIZE]; -	const unsigned int *id; +	struct ucc_geth_info *ug_info = priv->ug_info;  	struct phy_device *phydev; -	char phy_id[BUS_ID_SIZE];  	priv->oldlink = 0;  	priv->oldspeed = 0;  	priv->oldduplex = -1; -	ph = of_get_property(np, "phy-handle", NULL); -	phy = of_find_node_by_phandle(*ph); -	mdio = of_get_parent(phy); - -	id = of_get_property(phy, "reg", NULL); - -	of_node_put(phy); -	of_node_put(mdio); - -	uec_mdio_bus_name(bus_name, mdio); -	snprintf(phy_id, sizeof(phy_id), "%s:%02x", -                                bus_name, *id); - -	phydev = phy_connect(dev, phy_id, &adjust_link, 0, priv->phy_interface); +	phydev = phy_connect(dev, ug_info->phy_bus_id, &adjust_link, 0, +			     priv->phy_interface);  	if (IS_ERR(phydev)) {  		printk("%s: Could not attach to PHY\n", dev->name); @@ -3629,10 +3612,12 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma  	ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);  	fixed_link = of_get_property(np, "fixed-link", NULL);  	if (fixed_link) { -		snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "0"); -		ug_info->phy_address = fixed_link[0]; +		snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id), +			 PHY_ID_FMT, "0", fixed_link[0]);  		phy = NULL;  	} else { +		char bus_name[MII_BUS_ID_SIZE]; +  		ph = of_get_property(np, "phy-handle", NULL);  		phy = of_find_node_by_phandle(*ph); @@ -3643,7 +3628,6 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma  		prop = of_get_property(phy, "reg", NULL);  		if (prop == NULL)  			return -1; -		ug_info->phy_address = *prop;  		/* Set the bus id */  		mdio = of_get_parent(phy); @@ -3657,7 +3641,9 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma  		if (err)  			return -1; -		snprintf(ug_info->mdio_bus, MII_BUS_ID_SIZE, "%x", res.start); +		uec_mdio_bus_name(bus_name, mdio); +		snprintf(ug_info->phy_bus_id, sizeof(ug_info->phy_bus_id), +			"%s:%02x", bus_name, *prop);  	}  	/* get the phy interface type, or default to MII */ diff --git a/drivers/net/ucc_geth.h b/drivers/net/ucc_geth.h index 16cbe42ba43..611bdef2402 100644 --- a/drivers/net/ucc_geth.h +++ b/drivers/net/ucc_geth.h @@ -1091,8 +1091,7 @@ struct ucc_geth_info {  	u32 eventRegMask;  	u16 pausePeriod;  	u16 extensionField; -	u8 phy_address; -	char mdio_bus[MII_BUS_ID_SIZE]; +	char phy_bus_id[BUS_ID_SIZE];  	u8 weightfactor[NUM_TX_QUEUES];  	u8 interruptcoalescingmaxvalue[NUM_RX_QUEUES];  	u8 l2qt[UCC_GETH_VLAN_PRIORITY_MAX]; diff --git a/drivers/net/ucc_geth_mii.c b/drivers/net/ucc_geth_mii.c index 54635911305..0ada4edd56e 100644 --- a/drivers/net/ucc_geth_mii.c +++ b/drivers/net/ucc_geth_mii.c @@ -107,7 +107,7 @@ int uec_mdio_read(struct mii_bus *bus, int mii_id, int regnum)  static int uec_mdio_reset(struct mii_bus *bus)  {  	struct ucc_mii_mng __iomem *regs = (void __iomem *)bus->priv; -	unsigned int timeout = PHY_INIT_TIMEOUT; +	int timeout = PHY_INIT_TIMEOUT;  	mutex_lock(&bus->mdio_lock); @@ -123,7 +123,7 @@ static int uec_mdio_reset(struct mii_bus *bus)  	mutex_unlock(&bus->mdio_lock); -	if (timeout <= 0) { +	if (timeout < 0) {  		printk(KERN_ERR "%s: The MII Bus is stuck!\n", bus->name);  		return -EBUSY;  	} diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 5b67bbf1987..81682c6defa 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c @@ -635,6 +635,10 @@ static const struct usb_device_id products[] = {  	USB_DEVICE(0x0a47, 0x9601),	/* Hirose USB-100 */  	.driver_info = (unsigned long)&dm9601_info,  	 }, +	{ +	USB_DEVICE(0x0fe6, 0x8101),	/* DM9601 USB to Fast Ethernet Adapter */ +	.driver_info = (unsigned long)&dm9601_info, +	 },  	{},			// END  }; diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index c5691fdb707..fb53ef872df 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c @@ -1838,17 +1838,19 @@ static void velocity_free_tx_buf(struct velocity_info *vptr, struct velocity_td_  {  	struct sk_buff *skb = tdinfo->skb;  	int i; +	int pktlen;  	/*  	 *	Don't unmap the pre-allocated tx_bufs  	 */  	if (tdinfo->skb_dma) { +		pktlen = (skb->len > ETH_ZLEN ? : ETH_ZLEN);  		for (i = 0; i < tdinfo->nskb_dma; i++) {  #ifdef VELOCITY_ZERO_COPY_SUPPORT  			pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i], le16_to_cpu(td->tdesc1.len), PCI_DMA_TODEVICE);  #else -			pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i], skb->len, PCI_DMA_TODEVICE); +			pci_unmap_single(vptr->pdev, tdinfo->skb_dma[i], pktlen, PCI_DMA_TODEVICE);  #endif  			tdinfo->skb_dma[i] = 0;  		} @@ -2080,17 +2082,14 @@ static int velocity_xmit(struct sk_buff *skb, struct net_device *dev)  	struct tx_desc *td_ptr;  	struct velocity_td_info *tdinfo;  	unsigned long flags; -	int pktlen = skb->len; +	int pktlen;  	__le16 len;  	int index; - -	if (skb->len < ETH_ZLEN) { -		if (skb_padto(skb, ETH_ZLEN)) -			goto out; -		pktlen = ETH_ZLEN; -	} +	if (skb_padto(skb, ETH_ZLEN)) +		goto out; +	pktlen = max_t(unsigned int, skb->len, ETH_ZLEN);  	len = cpu_to_le16(pktlen); diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index c68808336c8..e67d16c2e5f 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -612,6 +612,7 @@ static struct ethtool_ops virtnet_ethtool_ops = {  	.set_tx_csum = virtnet_set_tx_csum,  	.set_sg = ethtool_op_set_sg,  	.set_tso = ethtool_op_set_tso, +	.get_link = ethtool_op_get_link,  };  #define MIN_MTU 68 @@ -739,6 +740,8 @@ static int virtnet_probe(struct virtio_device *vdev)  		goto unregister;  	} +	netif_carrier_on(dev); +  	pr_debug("virtnet: registered device %s\n", dev->name);  	return 0; diff --git a/drivers/net/wireless/ath9k/ath9k.h b/drivers/net/wireless/ath9k/ath9k.h index d2781350295..6650f609ece 100644 --- a/drivers/net/wireless/ath9k/ath9k.h +++ b/drivers/net/wireless/ath9k/ath9k.h @@ -587,8 +587,8 @@ struct ath9k_country_entry {  	u8 iso[3];  }; -#define REG_WRITE(_ah, _reg, _val) iowrite32(_val, _ah->ah_sh + _reg) -#define REG_READ(_ah, _reg) ioread32(_ah->ah_sh + _reg) +#define REG_WRITE(_ah, _reg, _val) ath9k_iowrite32((_ah), (_reg), (_val)) +#define REG_READ(_ah, _reg) ath9k_ioread32((_ah), (_reg))  #define SM(_v, _f)  (((_v) << _f##_S) & _f)  #define MS(_v, _f)  (((_v) & _f) >> _f##_S) diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h index 4ca2aed236e..139566cbbf6 100644 --- a/drivers/net/wireless/ath9k/core.h +++ b/drivers/net/wireless/ath9k/core.h @@ -701,6 +701,7 @@ struct ath_softc {  	struct ath_hal *sc_ah;  	void __iomem *mem;  	spinlock_t sc_resetlock; +	spinlock_t sc_serial_rw;  	struct mutex mutex;  	u8 sc_curbssid[ETH_ALEN]; @@ -751,4 +752,36 @@ int ath_get_hal_qnum(u16 queue, struct ath_softc *sc);  int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc);  int ath_cabq_update(struct ath_softc *); +/* + * Read and write, they both share the same lock. We do this to serialize + * reads and writes on Atheros 802.11n PCI devices only. This is required + * as the FIFO on these devices can only accept sanely 2 requests. After + * that the device goes bananas. Serializing the reads/writes prevents this + * from happening. + */ + +static inline void ath9k_iowrite32(struct ath_hal *ah, u32 reg_offset, u32 val) +{ +	if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) { +		unsigned long flags; +		spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags); +		iowrite32(val, ah->ah_sc->mem + reg_offset); +		spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags); +	} else +		iowrite32(val, ah->ah_sc->mem + reg_offset); +} + +static inline unsigned int ath9k_ioread32(struct ath_hal *ah, u32 reg_offset) +{ +	u32 val; +	if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) { +		unsigned long flags; +		spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags); +		val = ioread32(ah->ah_sc->mem + reg_offset); +		spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags); +	} else +		val = ioread32(ah->ah_sc->mem + reg_offset); +	return val; +} +  #endif /* CORE_H */ diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c index 34474edefc9..c38a00bbce6 100644 --- a/drivers/net/wireless/ath9k/hw.c +++ b/drivers/net/wireless/ath9k/hw.c @@ -437,6 +437,25 @@ static void ath9k_hw_set_defaults(struct ath_hal *ah)  	}  	ah->ah_config.intr_mitigation = 1; + +	/* +	 * We need this for PCI devices only (Cardbus, PCI, miniPCI) +	 * _and_ if on non-uniprocessor systems (Multiprocessor/HT). +	 * This means we use it for all AR5416 devices, and the few +	 * minor PCI AR9280 devices out there. +	 * +	 * Serialization is required because these devices do not handle +	 * well the case of two concurrent reads/writes due to the latency +	 * involved. During one read/write another read/write can be issued +	 * on another CPU while the previous read/write may still be working +	 * on our hardware, if we hit this case the hardware poops in a loop. +	 * We prevent this by serializing reads and writes. +	 * +	 * This issue is not present on PCI-Express devices or pre-AR5416 +	 * devices (legacy, 802.11abg). +	 */ +	if (num_possible_cpus() > 1) +		ah->ah_config.serialize_regmode = SER_REG_MODE_AUTO;  }  static struct ath_hal_5416 *ath9k_hw_newstate(u16 devid, @@ -668,7 +687,8 @@ static struct ath_hal *ath9k_hw_do_attach(u16 devid, struct ath_softc *sc,  	}  	if (ah->ah_config.serialize_regmode == SER_REG_MODE_AUTO) { -		if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI) { +		if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI || +		    (AR_SREV_9280(ah) && !ah->ah_isPciExpress)) {  			ah->ah_config.serialize_regmode =  				SER_REG_MODE_ON;  		} else { diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c index 0e80990d8e8..3c04044a60b 100644 --- a/drivers/net/wireless/ath9k/main.c +++ b/drivers/net/wireless/ath9k/main.c @@ -1336,6 +1336,7 @@ static int ath_init(u16 devid, struct ath_softc *sc)  		printk(KERN_ERR "Unable to create debugfs files\n");  	spin_lock_init(&sc->sc_resetlock); +	spin_lock_init(&sc->sc_serial_rw);  	mutex_init(&sc->mutex);  	tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);  	tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet, diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 36bafeb353c..129e2d330ab 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c @@ -3868,7 +3868,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	}  	err = iwl_eeprom_check_version(priv);  	if (err) -		goto out_iounmap; +		goto out_free_eeprom;  	/* extract MAC Address */  	iwl_eeprom_get_mac(priv, priv->mac_addr); @@ -3945,6 +3945,8 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	return 0;   out_remove_sysfs: +	destroy_workqueue(priv->workqueue); +	priv->workqueue = NULL;  	sysfs_remove_group(&pdev->dev.kobj, &iwl_attribute_group);   out_uninit_drv:  	iwl_uninit_drv(priv); @@ -3953,8 +3955,8 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)   out_iounmap:  	pci_iounmap(pdev, priv->hw_base);   out_pci_release_regions: -	pci_release_regions(pdev);  	pci_set_drvdata(pdev, NULL); +	pci_release_regions(pdev);   out_pci_disable_device:  	pci_disable_device(pdev);   out_ieee80211_free_hw: diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 93be74a1f13..57dd34e256d 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c @@ -7911,7 +7911,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e  				CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000);  	if (err < 0) {  		IWL_DEBUG_INFO("Failed to init the card\n"); -		goto out_remove_sysfs; +		goto out_iounmap;  	}  	/*********************** @@ -7921,7 +7921,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e  	err = iwl3945_eeprom_init(priv);  	if (err) {  		IWL_ERROR("Unable to init EEPROM\n"); -		goto out_remove_sysfs; +		goto out_iounmap;  	}  	/* MAC Address location in EEPROM same for 3945/4965 */  	get_eeprom_mac(priv, priv->mac_addr); @@ -7975,7 +7975,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e  	err = iwl3945_init_channel_map(priv);  	if (err) {  		IWL_ERROR("initializing regulatory failed: %d\n", err); -		goto out_release_irq; +		goto out_unset_hw_setting;  	}  	err = iwl3945_init_geos(priv); @@ -8045,25 +8045,22 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e  	return 0;   out_remove_sysfs: +	destroy_workqueue(priv->workqueue); +	priv->workqueue = NULL;  	sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);   out_free_geos:  	iwl3945_free_geos(priv);   out_free_channel_map:  	iwl3945_free_channel_map(priv); - - - out_release_irq: -	destroy_workqueue(priv->workqueue); -	priv->workqueue = NULL; + out_unset_hw_setting:  	iwl3945_unset_hw_setting(priv); -   out_iounmap:  	pci_iounmap(pdev, priv->hw_base);   out_pci_release_regions:  	pci_release_regions(pdev);   out_pci_disable_device: -	pci_disable_device(pdev);  	pci_set_drvdata(pdev, NULL); +	pci_disable_device(pdev);   out_ieee80211_free_hw:  	ieee80211_free_hw(priv->hw);   out: diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 34561e6e816..f170106bf0a 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c @@ -710,10 +710,11 @@ static struct sk_buff *p54_find_tx_entry(struct ieee80211_hw *dev,  					   __le32 req_id)  {  	struct p54_common *priv = dev->priv; -	struct sk_buff *entry = priv->tx_queue.next; +	struct sk_buff *entry;  	unsigned long flags;  	spin_lock_irqsave(&priv->tx_queue.lock, flags); +	entry = priv->tx_queue.next;  	while (entry != (struct sk_buff *)&priv->tx_queue) {  		struct p54_hdr *hdr = (struct p54_hdr *) entry->data; @@ -732,7 +733,7 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb)  	struct p54_common *priv = dev->priv;  	struct p54_hdr *hdr = (struct p54_hdr *) skb->data;  	struct p54_frame_sent *payload = (struct p54_frame_sent *) hdr->data; -	struct sk_buff *entry = (struct sk_buff *) priv->tx_queue.next; +	struct sk_buff *entry;  	u32 addr = le32_to_cpu(hdr->req_id) - priv->headroom;  	struct memrecord *range = NULL;  	u32 freed = 0; @@ -741,6 +742,7 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb)  	int count, idx;  	spin_lock_irqsave(&priv->tx_queue.lock, flags); +	entry = (struct sk_buff *) priv->tx_queue.next;  	while (entry != (struct sk_buff *)&priv->tx_queue) {  		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);  		struct p54_hdr *entry_hdr; @@ -976,7 +978,7 @@ static int p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb,  			       struct p54_hdr *data, u32 len)  {  	struct p54_common *priv = dev->priv; -	struct sk_buff *entry = priv->tx_queue.next; +	struct sk_buff *entry;  	struct sk_buff *target_skb = NULL;  	struct ieee80211_tx_info *info;  	struct memrecord *range; @@ -1014,6 +1016,7 @@ static int p54_assign_address(struct ieee80211_hw *dev, struct sk_buff *skb,  		}  	} +	entry = priv->tx_queue.next;  	while (left--) {  		u32 hole_size;  		info = IEEE80211_SKB_CB(entry); diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index af6b5847be5..3e2ac2bbb12 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c @@ -1952,6 +1952,8 @@ static struct usb_device_id rt2500usb_device_table[] = {  	{ USB_DEVICE(0x13b1, 0x000d), USB_DEVICE_DATA(&rt2500usb_ops) },  	{ USB_DEVICE(0x13b1, 0x0011), USB_DEVICE_DATA(&rt2500usb_ops) },  	{ USB_DEVICE(0x13b1, 0x001a), USB_DEVICE_DATA(&rt2500usb_ops) }, +	/* CNet */ +	{ USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt2500usb_ops) },  	/* Conceptronic */  	{ USB_DEVICE(0x14b2, 0x3c02), USB_DEVICE_DATA(&rt2500usb_ops) },  	/* D-LINK */ @@ -1976,14 +1978,20 @@ static struct usb_device_id rt2500usb_device_table[] = {  	{ USB_DEVICE(0x148f, 0x2570), USB_DEVICE_DATA(&rt2500usb_ops) },  	{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt2500usb_ops) },  	{ USB_DEVICE(0x148f, 0x9020), USB_DEVICE_DATA(&rt2500usb_ops) }, +	/* Sagem */ +	{ USB_DEVICE(0x079b, 0x004b), USB_DEVICE_DATA(&rt2500usb_ops) },  	/* Siemens */  	{ USB_DEVICE(0x0681, 0x3c06), USB_DEVICE_DATA(&rt2500usb_ops) },  	/* SMC */  	{ USB_DEVICE(0x0707, 0xee13), USB_DEVICE_DATA(&rt2500usb_ops) },  	/* Spairon */  	{ USB_DEVICE(0x114b, 0x0110), USB_DEVICE_DATA(&rt2500usb_ops) }, +	/* SURECOM */ +	{ USB_DEVICE(0x0769, 0x11f3), USB_DEVICE_DATA(&rt2500usb_ops) },  	/* Trust */  	{ USB_DEVICE(0x0eb0, 0x9020), USB_DEVICE_DATA(&rt2500usb_ops) }, +	/* VTech */ +	{ USB_DEVICE(0x0f88, 0x3012), USB_DEVICE_DATA(&rt2500usb_ops) },  	/* Zinwell */  	{ USB_DEVICE(0x5a57, 0x0260), USB_DEVICE_DATA(&rt2500usb_ops) },  	{ 0, } diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 96a8d69f879..cefee1b26cd 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c @@ -2281,7 +2281,18 @@ static const struct rt2x00_ops rt73usb_ops = {   */  static struct usb_device_id rt73usb_device_table[] = {  	/* AboCom */ +	{ USB_DEVICE(0x07b8, 0xb21b), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x07b8, 0xb21c), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x07b8, 0xb21d), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x07b8, 0xb21e), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x07b8, 0xb21f), USB_DEVICE_DATA(&rt73usb_ops) }, +	/* AL */ +	{ USB_DEVICE(0x14b2, 0x3c10), USB_DEVICE_DATA(&rt73usb_ops) }, +	/* Amigo */ +	{ USB_DEVICE(0x148f, 0x9021), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x0eb0, 0x9021), USB_DEVICE_DATA(&rt73usb_ops) }, +	/* AMIT  */ +	{ USB_DEVICE(0x18c5, 0x0002), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Askey */  	{ USB_DEVICE(0x1690, 0x0722), USB_DEVICE_DATA(&rt73usb_ops) },  	/* ASUS */ @@ -2294,7 +2305,9 @@ static struct usb_device_id rt73usb_device_table[] = {  	{ USB_DEVICE(0x050d, 0x905c), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Billionton */  	{ USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x08dd, 0x0120), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Buffalo */ +	{ USB_DEVICE(0x0411, 0x00d8), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x0411, 0x00f4), USB_DEVICE_DATA(&rt73usb_ops) },  	/* CNet */  	{ USB_DEVICE(0x1371, 0x9022), USB_DEVICE_DATA(&rt73usb_ops) }, @@ -2308,6 +2321,11 @@ static struct usb_device_id rt73usb_device_table[] = {  	{ USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x07d1, 0x3c06), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) }, +	/* Edimax */ +	{ USB_DEVICE(0x7392, 0x7318), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x7392, 0x7618), USB_DEVICE_DATA(&rt73usb_ops) }, +	/* EnGenius */ +	{ USB_DEVICE(0x1740, 0x3701), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Gemtek */  	{ USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Gigabyte */ @@ -2328,22 +2346,34 @@ static struct usb_device_id rt73usb_device_table[] = {  	{ USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Ralink */ +	{ USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x148f, 0x2671), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Qcom */  	{ USB_DEVICE(0x18e8, 0x6196), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x18e8, 0x6229), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x18e8, 0x6238), USB_DEVICE_DATA(&rt73usb_ops) }, +	/* Samsung */ +	{ USB_DEVICE(0x04e8, 0x4471), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Senao */  	{ USB_DEVICE(0x1740, 0x7100), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Sitecom */ -	{ USB_DEVICE(0x0df6, 0x9712), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x0df6, 0x0024), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x0df6, 0x0027), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x0df6, 0x002f), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x0df6, 0x90ac), USB_DEVICE_DATA(&rt73usb_ops) }, +	{ USB_DEVICE(0x0df6, 0x9712), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Surecom */  	{ USB_DEVICE(0x0769, 0x31f3), USB_DEVICE_DATA(&rt73usb_ops) }, +	/* Philips */ +	{ USB_DEVICE(0x0471, 0x200a), USB_DEVICE_DATA(&rt73usb_ops) },  	/* Planex */  	{ USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) },  	{ USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) }, +	/* Zcom */ +	{ USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) }, +	/* ZyXEL */ +	{ USB_DEVICE(0x0586, 0x3415), USB_DEVICE_DATA(&rt73usb_ops) },  	{ 0, }  }; diff --git a/drivers/net/wireless/zd1211rw/zd_mac.c b/drivers/net/wireless/zd1211rw/zd_mac.c index a611ad85798..847057d682b 100644 --- a/drivers/net/wireless/zd1211rw/zd_mac.c +++ b/drivers/net/wireless/zd1211rw/zd_mac.c @@ -575,13 +575,17 @@ static int zd_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)  	r = fill_ctrlset(mac, skb);  	if (r) -		return r; +		goto fail;  	info->rate_driver_data[0] = hw;  	r = zd_usb_tx(&mac->chip.usb, skb);  	if (r) -		return r; +		goto fail; +	return 0; + +fail: +	dev_kfree_skb(skb);  	return 0;  } diff --git a/drivers/parisc/dino.c b/drivers/parisc/dino.c index d539d9df88e..bb5a1c9597c 100644 --- a/drivers/parisc/dino.c +++ b/drivers/parisc/dino.c @@ -479,7 +479,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr)  	res = &dino_dev->hba.lmmio_space;  	res->flags = IORESOURCE_MEM;  	size = scnprintf(name, sizeof(name), "Dino LMMIO (%s)",  -			 bus->bridge->bus_id); +			 dev_name(bus->bridge));  	res->name = kmalloc(size+1, GFP_KERNEL);  	if(res->name)  		strcpy((char *)res->name, name); @@ -493,7 +493,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr)  		struct list_head *ln, *tmp_ln;  		printk(KERN_ERR "Dino: cannot attach bus %s\n", -		       bus->bridge->bus_id); +		       dev_name(bus->bridge));  		/* kill the bus, we can't do anything with it */  		list_for_each_safe(ln, tmp_ln, &bus->devices) {  			struct pci_dev *dev = pci_dev_b(ln); @@ -587,7 +587,7 @@ dino_fixup_bus(struct pci_bus *bus)  			bus->resource[i+1] = &res[i];  		} -	} else if(bus->self) { +	} else if (bus->parent) {  		int i;  		pci_read_bridge_bases(bus); @@ -611,12 +611,12 @@ dino_fixup_bus(struct pci_bus *bus)  			}  			DBG("DEBUG %s assigning %d [0x%lx,0x%lx]\n", -			    bus->self->dev.bus_id, i, +			    dev_name(&bus->self->dev), i,  			    bus->self->resource[i].start,  			    bus->self->resource[i].end);  			pci_assign_resource(bus->self, i);  			DBG("DEBUG %s after assign %d [0x%lx,0x%lx]\n", -			    bus->self->dev.bus_id, i, +			    dev_name(&bus->self->dev), i,  			    bus->self->resource[i].start,  			    bus->self->resource[i].end);  		} @@ -1026,7 +1026,8 @@ static int __init dino_probe(struct parisc_device *dev)  		dino_current_bus = bus->subordinate + 1;  		pci_bus_assign_resources(bus);  	} else { -		printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n", dev->dev.bus_id, dino_current_bus); +		printk(KERN_ERR "ERROR: failed to scan PCI bus on %s (probably duplicate bus number %d)\n", +		       dev_name(&dev->dev), dino_current_bus);  		/* increment the bus number in case of duplicates */  		dino_current_bus++;  	} diff --git a/drivers/parisc/gsc.c b/drivers/parisc/gsc.c index e76db9e4d50..d3363291769 100644 --- a/drivers/parisc/gsc.c +++ b/drivers/parisc/gsc.c @@ -186,29 +186,34 @@ void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp)  	*irqp = irq;  } -static struct device *next_device(struct klist_iter *i) +struct gsc_fixup_struct { +	void (*choose_irq)(struct parisc_device *, void *); +	void *ctrl; +}; + +static int gsc_fixup_irqs_callback(struct device *dev, void *data)  { -	struct klist_node * n = klist_next(i); -	return n ? container_of(n, struct device, knode_parent) : NULL; +	struct parisc_device *padev = to_parisc_device(dev); +	struct gsc_fixup_struct *gf = data; + +	/* work-around for 715/64 and others which have parent +	   at path [5] and children at path [5/0/x] */ +	if (padev->id.hw_type == HPHW_FAULTY) +		gsc_fixup_irqs(padev, gf->ctrl, gf->choose_irq); +	gf->choose_irq(padev, gf->ctrl); + +	return 0;  }  void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,  			void (*choose_irq)(struct parisc_device *, void *))  { -	struct device *dev; -	struct klist_iter i; - -	klist_iter_init(&parent->dev.klist_children, &i); -	while ((dev = next_device(&i))) { -		struct parisc_device *padev = to_parisc_device(dev); +	struct gsc_fixup_struct data = { +		.choose_irq	= choose_irq, +		.ctrl		= ctrl, +	}; -		/* work-around for 715/64 and others which have parent  -		   at path [5] and children at path [5/0/x] */ -		if (padev->id.hw_type == HPHW_FAULTY) -			return gsc_fixup_irqs(padev, ctrl, choose_irq); -		choose_irq(padev, ctrl); -	} -	klist_iter_exit(&i); +	device_for_each_child(&parent->dev, &data, gsc_fixup_irqs_callback);  }  int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic) diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index 0797659ee01..501aaf1f253 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c @@ -487,7 +487,7 @@ iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev)  	}  	/* Check if pcidev behind a PPB */ -	if (NULL != pcidev->bus->self) { +	if (pcidev->bus->parent) {  		/* Convert pcidev INTR_PIN into something we  		** can lookup in the IRT.  		*/ @@ -523,10 +523,9 @@ iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev)  #endif /* PCI_BRIDGE_FUNCS */  		/* -		** Locate the host slot the PPB nearest the Host bus -		** adapter. -		*/ -		while (NULL != p->parent->self) +		 * Locate the host slot of the PPB. +		 */ +		while (p->parent->parent)  			p = p->parent;  		intr_slot = PCI_SLOT(p->self->devfn); @@ -709,11 +708,14 @@ static void iosapic_set_affinity_irq(unsigned int irq,  	struct vector_info *vi = iosapic_get_vector(irq);  	u32 d0, d1, dummy_d0;  	unsigned long flags; +	int dest_cpu; -	if (cpu_check_affinity(irq, dest)) +	dest_cpu = cpu_check_affinity(irq, dest); +	if (dest_cpu < 0)  		return; -	vi->txn_addr = txn_affinity_addr(irq, cpumask_first(dest)); +	irq_desc[irq].affinity = cpumask_of_cpu(dest_cpu); +	vi->txn_addr = txn_affinity_addr(irq, dest_cpu);  	spin_lock_irqsave(&iosapic_lock, flags);  	/* d1 contains the destination CPU, so only want to set that diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index d8233de8c75..59fbbf12836 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -644,7 +644,7 @@ lba_fixup_bus(struct pci_bus *bus)  	** Properly Setup MMIO resources for this bus.  	** pci_alloc_primary_bus() mangles this.  	*/ -	if (bus->self) { +	if (bus->parent) {  		int i;  		/* PCI-PCI Bridge */  		pci_read_bridge_bases(bus); @@ -802,7 +802,7 @@ lba_fixup_bus(struct pci_bus *bus)  ** Can't fixup here anyway....garr...  */  	if (fbb_enable) { -		if (bus->self) { +		if (bus->parent) {  			u8 control;  			/* enable on PPB */  			(void) pci_read_config_byte(bus->self, PCI_BRIDGE_CONTROL, &control); diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c index a70cf16ee1a..e5999c4cedc 100644 --- a/drivers/parisc/sba_iommu.c +++ b/drivers/parisc/sba_iommu.c @@ -1206,31 +1206,49 @@ sba_alloc_pdir(unsigned int pdir_size)  	return (void *) pdir_base;  } -static struct device *next_device(struct klist_iter *i) +struct ibase_data_struct { +	struct ioc *ioc; +	int ioc_num; +}; + +static int setup_ibase_imask_callback(struct device *dev, void *data)  { -        struct klist_node * n = klist_next(i); -        return n ? container_of(n, struct device, knode_parent) : NULL; +	/* lba_set_iregs() is in drivers/parisc/lba_pci.c */ +        extern void lba_set_iregs(struct parisc_device *, u32, u32); +	struct parisc_device *lba = to_parisc_device(dev); +	struct ibase_data_struct *ibd = data; +	int rope_num = (lba->hpa.start >> 13) & 0xf; +	if (rope_num >> 3 == ibd->ioc_num) +		lba_set_iregs(lba, ibd->ioc->ibase, ibd->ioc->imask); +	return 0;  }  /* setup Mercury or Elroy IBASE/IMASK registers. */  static void   setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num)  { -	/* lba_set_iregs() is in drivers/parisc/lba_pci.c */ -        extern void lba_set_iregs(struct parisc_device *, u32, u32); -	struct device *dev; -	struct klist_iter i; +	struct ibase_data_struct ibase_data = { +		.ioc		= ioc, +		.ioc_num	= ioc_num, +	}; -	klist_iter_init(&sba->dev.klist_children, &i); -	while ((dev = next_device(&i))) { -		struct parisc_device *lba = to_parisc_device(dev); -		int rope_num = (lba->hpa.start >> 13) & 0xf; -		if (rope_num >> 3 == ioc_num) -			lba_set_iregs(lba, ioc->ibase, ioc->imask); -	} -	klist_iter_exit(&i); +	device_for_each_child(&sba->dev, &ibase_data, +			      setup_ibase_imask_callback);  } +#ifdef SBA_AGP_SUPPORT +static int +sba_ioc_find_quicksilver(struct device *dev, void *data) +{ +	int *agp_found = data; +	struct parisc_device *lba = to_parisc_device(dev); + +	if (IS_QUICKSILVER(lba)) +		*agp_found = 1; +	return 0; +} +#endif +  static void  sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)  { @@ -1332,9 +1350,6 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)  	WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM);  #ifdef SBA_AGP_SUPPORT -{ -	struct klist_iter i; -	struct device *dev = NULL;  	/*  	** If an AGP device is present, only use half of the IOV space @@ -1344,13 +1359,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)  	** We program the next pdir index after we stop w/ a key for  	** the GART code to handshake on.  	*/ -	klist_iter_init(&sba->dev.klist_children, &i); -	while ((dev = next_device(&i))) { -		struct parisc_device *lba = to_parisc_device(dev); -		if (IS_QUICKSILVER(lba)) -			agp_found = 1; -	} -	klist_iter_exit(&i); +	device_for_each_child(&sba->dev, &agp_found, sba_ioc_find_quicksilver);  	if (agp_found && sba_reserve_agpgart) {  		printk(KERN_INFO "%s: reserving %dMb of IOVA space for agpgart\n", @@ -1358,9 +1367,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)  		ioc->pdir_size /= 2;  		ioc->pdir_base[PDIR_INDEX(iova_space_size/2)] = SBA_AGPGART_COOKIE;  	} -}  #endif /*SBA_AGP_SUPPORT*/ -  }  static void diff --git a/drivers/pci/hotplug/Kconfig b/drivers/pci/hotplug/Kconfig index eacfb13998b..9aa4fe100a0 100644 --- a/drivers/pci/hotplug/Kconfig +++ b/drivers/pci/hotplug/Kconfig @@ -143,7 +143,7 @@ config HOTPLUG_PCI_SHPC  config HOTPLUG_PCI_RPA  	tristate "RPA PCI Hotplug driver" -	depends on PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE +	depends on PPC_PSERIES && EEH && !HOTPLUG_PCI_FAKE  	help  	  Say Y here if you have a RPA system that supports PCI Hotplug. diff --git a/drivers/pci/pcie/aer/aerdrv_core.c b/drivers/pci/pcie/aer/aerdrv_core.c index d0c97368586..38257500738 100644 --- a/drivers/pci/pcie/aer/aerdrv_core.c +++ b/drivers/pci/pcie/aer/aerdrv_core.c @@ -133,6 +133,9 @@ static void set_downstream_devices_error_reporting(struct pci_dev *dev,  						   bool enable)  {  	set_device_error_reporting(dev, &enable); + +	if (!dev->subordinate) +		return;  	pci_walk_bus(dev->subordinate, set_device_error_reporting, &enable);  } diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 248b4db9155..5ea566e20b3 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c @@ -103,6 +103,7 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev,  static void pcie_portdrv_remove (struct pci_dev *dev)  {  	pcie_port_device_remove(dev); +	pci_disable_device(dev);  	kfree(pci_get_drvdata(dev));  } diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index f20d55368ed..92b9efe9bca 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -23,6 +23,7 @@  #include <linux/acpi.h>  #include <linux/kallsyms.h>  #include <linux/dmi.h> +#include <linux/pci-aspm.h>  #include "pci.h"  int isa_dma_bridge_buggy; @@ -1749,6 +1750,30 @@ static void __devinit quirk_e100_interrupt(struct pci_dev *dev)  }  DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt); +/* + * The 82575 and 82598 may experience data corruption issues when transitioning + * out of L0S.  To prevent this we need to disable L0S on the pci-e link + */ +static void __devinit quirk_disable_aspm_l0s(struct pci_dev *dev) +{ +	dev_info(&dev->dev, "Disabling L0s\n"); +	pci_disable_link_state(dev, PCIE_LINK_STATE_L0S); +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a7, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a9, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10b6, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c6, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c7, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c8, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10d6, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10db, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10dd, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10e1, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10ec, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f1, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f4, quirk_disable_aspm_l0s); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1508, quirk_disable_aspm_l0s); +  static void __devinit fixup_rev1_53c810(struct pci_dev* dev)  {  	/* rev 1 ncr53c810 chips don't set the class at all which means @@ -2097,7 +2122,7 @@ static void __devinit ht_disable_msi_mapping(struct pci_dev *dev)  		if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,  					 &flags) == 0) { -			dev_info(&dev->dev, "Enabling HT MSI Mapping\n"); +			dev_info(&dev->dev, "Disabling HT MSI Mapping\n");  			pci_write_config_byte(dev, pos + HT_MSI_FLAGS,  					      flags & ~HT_MSI_FLAGS_ENABLE); @@ -2141,6 +2166,10 @@ static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev)  	int pos;  	int found; +	/* Enabling HT MSI mapping on this device breaks MCP51 */ +	if (dev->device == 0x270) +		return; +  	/* check if there is HT MSI cap or enabled on this device */  	found = ht_check_msi_mapping(dev); diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index b3866ad5022..3608081bc3e 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig @@ -15,8 +15,7 @@ menuconfig X86_PLATFORM_DEVICES  if X86_PLATFORM_DEVICES  config ACER_WMI -	tristate "Acer WMI Laptop Extras (EXPERIMENTAL)" -	depends on EXPERIMENTAL +	tristate "Acer WMI Laptop Extras"  	depends on ACPI  	depends on LEDS_CLASS  	depends on NEW_LEDS @@ -39,9 +38,9 @@ config ASUS_LAPTOP  	tristate "Asus Laptop Extras (EXPERIMENTAL)"  	depends on ACPI  	depends on EXPERIMENTAL && !ACPI_ASUS -	depends on LEDS_CLASS -	depends on NEW_LEDS -	depends on BACKLIGHT_CLASS_DEVICE +	select LEDS_CLASS +	select NEW_LEDS +	select BACKLIGHT_CLASS_DEVICE  	depends on INPUT  	---help---  	  This is the new Linux driver for Asus laptops. It may also support some @@ -185,11 +184,11 @@ config SONYPI_COMPAT  config THINKPAD_ACPI  	tristate "ThinkPad ACPI Laptop Extras"  	depends on ACPI +	depends on INPUT  	select BACKLIGHT_LCD_SUPPORT  	select BACKLIGHT_CLASS_DEVICE  	select HWMON  	select NVRAM -	select INPUT  	select NEW_LEDS  	select LEDS_CLASS  	select NET @@ -315,9 +314,8 @@ config EEEPC_LAPTOP  config ACPI_WMI -	tristate "WMI (EXPERIMENTAL)" +	tristate "WMI"  	depends on ACPI -	depends on EXPERIMENTAL  	help  	  This driver adds support for the ACPI-WMI (Windows Management  	  Instrumentation) mapper device (PNP0C14) found on some systems. diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 94c9f911824..a6a42e8c060 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c @@ -1026,7 +1026,7 @@ static void acer_rfkill_exit(void)  	kfree(wireless_rfkill->data);  	rfkill_unregister(wireless_rfkill);  	if (has_cap(ACER_CAP_BLUETOOTH)) { -		kfree(wireless_rfkill->data); +		kfree(bluetooth_rfkill->data);  		rfkill_unregister(bluetooth_rfkill);  	}  	return; @@ -1297,7 +1297,7 @@ static int __init acer_wmi_init(void)  	set_quirks(); -	if (!acpi_video_backlight_support() && has_cap(ACER_CAP_BRIGHTNESS)) { +	if (acpi_video_backlight_support() && has_cap(ACER_CAP_BRIGHTNESS)) {  		interface->capability &= ~ACER_CAP_BRIGHTNESS;  		printk(ACER_INFO "Brightness must be controlled by "  		       "generic video driver\n"); diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c index 56af6cf385b..eeafc6c0160 100644 --- a/drivers/platform/x86/asus-laptop.c +++ b/drivers/platform/x86/asus-laptop.c @@ -815,6 +815,7 @@ static int asus_setkeycode(struct input_dev *dev, int scancode, int keycode)  static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)  {  	static struct key_entry *key; +	u16 count;  	/* TODO Find a better way to handle events count. */  	if (!hotk) @@ -832,9 +833,11 @@ static void asus_hotk_notify(acpi_handle handle, u32 event, void *data)  		lcd_blank(FB_BLANK_POWERDOWN);  	} +	count = hotk->event_count[event % 128]++; +	acpi_bus_generate_proc_event(hotk->device, event, count);  	acpi_bus_generate_netlink_event(hotk->device->pnp.device_class,  					dev_name(&hotk->device->dev), event, -					hotk->event_count[event % 128]++); +					count);  	if (hotk->inputdev) {  		key = asus_get_entry_by_scancode(event); diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index 786ed8661cb..6f54fd1757c 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c @@ -557,13 +557,17 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)  static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data)  {  	static struct key_entry *key; +	u16 count; +  	if (!ehotk)  		return;  	if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX)  		notify_brn(); +	count = ehotk->event_count[event % 128]++; +	acpi_bus_generate_proc_event(ehotk->device, event, count);  	acpi_bus_generate_netlink_event(ehotk->device->pnp.device_class,  					dev_name(&ehotk->device->dev), event, -					ehotk->event_count[event % 128]++); +					count);  	if (ehotk->inputdev) {  		key = eepc_get_entry_by_scancode(event);  		if (key) { diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index bcbc05107ba..d2433204a40 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c @@ -7532,7 +7532,7 @@ MODULE_ALIAS(TPACPI_DRVR_SHORTNAME);   * if it is not there yet.   */  #define IBM_BIOS_MODULE_ALIAS(__type) \ -	MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW") +	MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*")  /* Non-ancient thinkpads */  MODULE_ALIAS("dmi:bvnIBM:*:svnIBM:*:pvrThinkPad*:rvnIBM:*"); @@ -7541,9 +7541,9 @@ MODULE_ALIAS("dmi:bvnLENOVO:*:svnLENOVO:*:pvrThinkPad*:rvnLENOVO:*");  /* Ancient thinkpad BIOSes have to be identified by   * BIOS type or model number, and there are far less   * BIOS types than model numbers... */ -IBM_BIOS_MODULE_ALIAS("I[B,D,H,I,M,N,O,T,W,V,Y,Z]"); -IBM_BIOS_MODULE_ALIAS("1[0,3,6,8,A-G,I,K,M-P,S,T]"); -IBM_BIOS_MODULE_ALIAS("K[U,X-Z]"); +IBM_BIOS_MODULE_ALIAS("I[BDHIMNOTWVYZ]"); +IBM_BIOS_MODULE_ALIAS("1[0368A-GIKM-PST]"); +IBM_BIOS_MODULE_ALIAS("K[UX-Z]");  MODULE_AUTHOR("Borislav Deianov, Henrique de Moraes Holschuh");  MODULE_DESCRIPTION(TPACPI_DESC); diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index 8a8b377712c..2f269e117b8 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c @@ -708,7 +708,7 @@ static int __init acpi_wmi_add(struct acpi_device *device)  static int __init acpi_wmi_init(void)  { -	acpi_status result; +	int result;  	INIT_LIST_HEAD(&wmi_blocks.list); diff --git a/drivers/power/ds2760_battery.c b/drivers/power/ds2760_battery.c index 1d768928e0b..a52d4a11652 100644 --- a/drivers/power/ds2760_battery.c +++ b/drivers/power/ds2760_battery.c @@ -180,10 +180,13 @@ static int ds2760_battery_read_status(struct ds2760_device_info *di)  	di->empty_uAh = battery_interpolate(scale, di->temp_C / 10);  	di->empty_uAh *= 1000; /* convert to µAh */ -	/* From Maxim Application Note 131: remaining capacity = -	 * ((ICA - Empty Value) / (Full Value - Empty Value)) x 100% */ -	di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) / -			    (di->full_active_uAh - di->empty_uAh); +	if (di->full_active_uAh == di->empty_uAh) +		di->rem_capacity = 0; +	else +		/* From Maxim Application Note 131: remaining capacity = +		 * ((ICA - Empty Value) / (Full Value - Empty Value)) x 100% */ +		di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) / +				    (di->full_active_uAh - di->empty_uAh);  	if (di->rem_capacity < 0)  		di->rem_capacity = 0; diff --git a/drivers/sbus/char/bbc_i2c.c b/drivers/sbus/char/bbc_i2c.c index f08e169ba1b..7e30e5f6e03 100644 --- a/drivers/sbus/char/bbc_i2c.c +++ b/drivers/sbus/char/bbc_i2c.c @@ -129,7 +129,7 @@ static int wait_for_pin(struct bbc_i2c_bus *bp, u8 *status)  	bp->waiting = 1;  	add_wait_queue(&bp->wq, &wait);  	while (limit-- > 0) { -		unsigned long val; +		long val;  		val = wait_event_interruptible_timeout(  				bp->wq, diff --git a/drivers/sbus/char/jsflash.c b/drivers/sbus/char/jsflash.c index a9a9893a5f9..e6d1fc8c54f 100644 --- a/drivers/sbus/char/jsflash.c +++ b/drivers/sbus/char/jsflash.c @@ -38,9 +38,6 @@  #include <linux/string.h>  #include <linux/genhd.h>  #include <linux/blkdev.h> - -#define MAJOR_NR	JSFD_MAJOR -  #include <asm/uaccess.h>  #include <asm/pgtable.h>  #include <asm/io.h> diff --git a/drivers/sbus/char/openprom.c b/drivers/sbus/char/openprom.c index 29dc735e1a2..124f660a038 100644 --- a/drivers/sbus/char/openprom.c +++ b/drivers/sbus/char/openprom.c @@ -51,6 +51,7 @@ MODULE_AUTHOR("Thomas K. Dyas (tdyas@noc.rutgers.edu) and Eddie C. Dost  (ecd@sk  MODULE_DESCRIPTION("OPENPROM Configuration Driver");  MODULE_LICENSE("GPL");  MODULE_VERSION("1.0"); +MODULE_ALIAS_MISCDEV(SUN_OPENPROM_MINOR);  /* Private data kept by the driver for each descriptor. */  typedef struct openprom_private_data diff --git a/drivers/scsi/fcoe/fc_transport_fcoe.c b/drivers/scsi/fcoe/fc_transport_fcoe.c index bf7fe6fc082..8862758006c 100644 --- a/drivers/scsi/fcoe/fc_transport_fcoe.c +++ b/drivers/scsi/fcoe/fc_transport_fcoe.c @@ -33,19 +33,19 @@ static LIST_HEAD(fcoe_transports);  static DEFINE_MUTEX(fcoe_transports_lock);  /** - * fcoe_transport_default - returns ptr to the default transport fcoe_sw - **/ + * fcoe_transport_default() - Returns ptr to the default transport fcoe_sw + */  struct fcoe_transport *fcoe_transport_default(void)  {  	return &fcoe_sw_transport;  }  /** - * fcoe_transport_to_pcidev - get the pci dev from a netdev + * fcoe_transport_to_pcidev() - get the pci dev from a netdev   * @netdev: the netdev that pci dev will be retrived from   *   * Returns: NULL or the corrsponding pci_dev - **/ + */  struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev)  {  	if (!netdev->dev.parent) @@ -54,18 +54,17 @@ struct pci_dev *fcoe_transport_pcidev(const struct net_device *netdev)  }  /** - * fcoe_transport_device_lookup - find out netdev is managed by the - * transport - * assign a transport to a device + * fcoe_transport_device_lookup() - Lookup a transport   * @netdev: the netdev the transport to be attached to   *   * This will look for existing offload driver, if not found, it falls back to   * the default sw hba (fcoe_sw) as its fcoe transport.   *   * Returns: 0 for success - **/ -static struct fcoe_transport_internal *fcoe_transport_device_lookup( -	struct fcoe_transport *t, struct net_device *netdev) + */ +static struct fcoe_transport_internal * +fcoe_transport_device_lookup(struct fcoe_transport *t, +			     struct net_device *netdev)  {  	struct fcoe_transport_internal *ti; @@ -81,14 +80,14 @@ static struct fcoe_transport_internal *fcoe_transport_device_lookup(  	return NULL;  }  /** - * fcoe_transport_device_add - assign a transport to a device + * fcoe_transport_device_add() - Assign a transport to a device   * @netdev: the netdev the transport to be attached to   *   * This will look for existing offload driver, if not found, it falls back to   * the default sw hba (fcoe_sw) as its fcoe transport.   *   * Returns: 0 for success - **/ + */  static int fcoe_transport_device_add(struct fcoe_transport *t,  				     struct net_device *netdev)  { @@ -123,14 +122,14 @@ static int fcoe_transport_device_add(struct fcoe_transport *t,  }  /** - * fcoe_transport_device_remove - remove a device from its transport + * fcoe_transport_device_remove() - Remove a device from its transport   * @netdev: the netdev the transport to be attached to   * - * this removes the device from the transport so the given transport will + * This removes the device from the transport so the given transport will   * not manage this device any more   *   * Returns: 0 for success - **/ + */  static int fcoe_transport_device_remove(struct fcoe_transport *t,  					struct net_device *netdev)  { @@ -155,13 +154,13 @@ static int fcoe_transport_device_remove(struct fcoe_transport *t,  }  /** - * fcoe_transport_device_remove_all - remove all from transport devlist + * fcoe_transport_device_remove_all() - Remove all from transport devlist   * - * this removes the device from the transport so the given transport will + * This removes the device from the transport so the given transport will   * not manage this device any more   *   * Returns: 0 for success - **/ + */  static void fcoe_transport_device_remove_all(struct fcoe_transport *t)  {  	struct fcoe_transport_internal *ti, *tmp; @@ -175,18 +174,18 @@ static void fcoe_transport_device_remove_all(struct fcoe_transport *t)  }  /** - * fcoe_transport_match - use the bus device match function to match the hw - * @t: the fcoe transport - * @netdev: + * fcoe_transport_match() - Use the bus device match function to match the hw + * @t: The fcoe transport to check + * @netdev: The netdev to match against   * - * This function is used to check if the givne transport wants to manage the + * This function is used to check if the given transport wants to manage the   * input netdev. if the transports implements the match function, it will be   * called, o.w. we just compare the pci vendor and device id.   *   * Returns: true for match up - **/ + */  static bool fcoe_transport_match(struct fcoe_transport *t, -				struct net_device *netdev) +				 struct net_device *netdev)  {  	/* match transport by vendor and device id */  	struct pci_dev *pci; @@ -210,17 +209,17 @@ static bool fcoe_transport_match(struct fcoe_transport *t,  }  /** - * fcoe_transport_lookup - check if the transport is already registered + * fcoe_transport_lookup() - Check if the transport is already registered   * @t: the transport to be looked up   *   * This compares the parent device (pci) vendor and device id   *   * Returns: NULL if not found   * - * TODO - return default sw transport if no other transport is found - **/ -static struct fcoe_transport *fcoe_transport_lookup( -	struct net_device *netdev) + * TODO: return default sw transport if no other transport is found + */ +static struct fcoe_transport * +fcoe_transport_lookup(struct net_device *netdev)  {  	struct fcoe_transport *t; @@ -239,11 +238,11 @@ static struct fcoe_transport *fcoe_transport_lookup(  }  /** - * fcoe_transport_register - adds a fcoe transport to the fcoe transports list + * fcoe_transport_register() - Adds a fcoe transport to the fcoe transports list   * @t: ptr to the fcoe transport to be added   *   * Returns: 0 for success - **/ + */  int fcoe_transport_register(struct fcoe_transport *t)  {  	struct fcoe_transport *tt; @@ -259,9 +258,6 @@ int fcoe_transport_register(struct fcoe_transport *t)  	list_add_tail(&t->list, &fcoe_transports);  	mutex_unlock(&fcoe_transports_lock); -	mutex_init(&t->devlock); -	INIT_LIST_HEAD(&t->devlist); -  	printk(KERN_DEBUG "fcoe_transport_register:%s\n", t->name);  	return 0; @@ -269,11 +265,11 @@ int fcoe_transport_register(struct fcoe_transport *t)  EXPORT_SYMBOL_GPL(fcoe_transport_register);  /** - * fcoe_transport_unregister - remove the tranport fro the fcoe transports list + * fcoe_transport_unregister() - Remove the tranport fro the fcoe transports list   * @t: ptr to the fcoe transport to be removed   *   * Returns: 0 for success - **/ + */  int fcoe_transport_unregister(struct fcoe_transport *t)  {  	struct fcoe_transport *tt, *tmp; @@ -294,8 +290,8 @@ int fcoe_transport_unregister(struct fcoe_transport *t)  }  EXPORT_SYMBOL_GPL(fcoe_transport_unregister); -/* - * fcoe_load_transport_driver - load an offload driver by alias name +/** + * fcoe_load_transport_driver() - Load an offload driver by alias name   * @netdev: the target net device   *   * Requests for an offload driver module as the fcoe transport, if fails, it @@ -307,7 +303,7 @@ EXPORT_SYMBOL_GPL(fcoe_transport_unregister);   * 	3. pure hw fcoe hba may not have netdev   *   * Returns: 0 for success - **/ + */  int fcoe_load_transport_driver(struct net_device *netdev)  {  	struct pci_dev *pci; @@ -335,14 +331,14 @@ int fcoe_load_transport_driver(struct net_device *netdev)  EXPORT_SYMBOL_GPL(fcoe_load_transport_driver);  /** - * fcoe_transport_attach - load transport to fcoe + * fcoe_transport_attach() - Load transport to fcoe   * @netdev: the netdev the transport to be attached to   *   * This will look for existing offload driver, if not found, it falls back to   * the default sw hba (fcoe_sw) as its fcoe transport.   *   * Returns: 0 for success - **/ + */  int fcoe_transport_attach(struct net_device *netdev)  {  	struct fcoe_transport *t; @@ -373,11 +369,11 @@ int fcoe_transport_attach(struct net_device *netdev)  EXPORT_SYMBOL_GPL(fcoe_transport_attach);  /** - * fcoe_transport_release - unload transport from fcoe + * fcoe_transport_release() - Unload transport from fcoe   * @netdev: the net device on which fcoe is to be released   *   * Returns: 0 for success - **/ + */  int fcoe_transport_release(struct net_device *netdev)  {  	struct fcoe_transport *t; @@ -410,12 +406,12 @@ int fcoe_transport_release(struct net_device *netdev)  EXPORT_SYMBOL_GPL(fcoe_transport_release);  /** - * fcoe_transport_init - initializes fcoe transport layer + * fcoe_transport_init() - Initializes fcoe transport layer   *   * This prepares for the fcoe transport layer   *   * Returns: none - **/ + */  int __init fcoe_transport_init(void)  {  	INIT_LIST_HEAD(&fcoe_transports); @@ -424,12 +420,13 @@ int __init fcoe_transport_init(void)  }  /** - * fcoe_transport_exit - cleans up the fcoe transport layer + * fcoe_transport_exit() - Cleans up the fcoe transport layer + *   * This cleans up the fcoe transport layer. removing any transport on the list,   * note that the transport destroy func is not called here.   *   * Returns: none - **/ + */  int __exit fcoe_transport_exit(void)  {  	struct fcoe_transport *t, *tmp; diff --git a/drivers/scsi/fcoe/fcoe_sw.c b/drivers/scsi/fcoe/fcoe_sw.c index dc4cd5e2576..da210eba194 100644 --- a/drivers/scsi/fcoe/fcoe_sw.c +++ b/drivers/scsi/fcoe/fcoe_sw.c @@ -104,19 +104,19 @@ static struct scsi_host_template fcoe_sw_shost_template = {  	.max_sectors = 0xffff,  }; -/* - * fcoe_sw_lport_config - sets up the fc_lport +/** + * fcoe_sw_lport_config() - sets up the fc_lport   * @lp: ptr to the fc_lport   * @shost: ptr to the parent scsi host   *   * Returns: 0 for success - *   */  static int fcoe_sw_lport_config(struct fc_lport *lp)  {  	int i = 0; -	lp->link_status = 0; +	lp->link_up = 0; +	lp->qfull = 0;  	lp->max_retry_count = 3;  	lp->e_d_tov = 2 * 1000;	/* FC-FS default */  	lp->r_a_tov = 2 * 2 * 1000; @@ -136,16 +136,14 @@ static int fcoe_sw_lport_config(struct fc_lport *lp)  	return 0;  } -/* - * fcoe_sw_netdev_config - sets up fcoe_softc for lport and network - * related properties +/** + * fcoe_sw_netdev_config() - Set up netdev for SW FCoE   * @lp : ptr to the fc_lport   * @netdev : ptr to the associated netdevice struct   *   * Must be called after fcoe_sw_lport_config() as it will use lport mutex   *   * Returns : 0 for success - *   */  static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)  { @@ -181,9 +179,8 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)  	if (fc_set_mfs(lp, mfs))  		return -EINVAL; -	lp->link_status = ~FC_PAUSE & ~FC_LINK_UP;  	if (!fcoe_link_ok(lp)) -		lp->link_status |= FC_LINK_UP; +		lp->link_up = 1;  	/* offload features support */  	if (fc->real_dev->features & NETIF_F_SG) @@ -191,6 +188,7 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)  	skb_queue_head_init(&fc->fcoe_pending_queue); +	fc->fcoe_pending_queue_active = 0;  	/* setup Source Mac Address */  	memcpy(fc->ctl_src_addr, fc->real_dev->dev_addr, @@ -224,16 +222,15 @@ static int fcoe_sw_netdev_config(struct fc_lport *lp, struct net_device *netdev)  	return 0;  } -/* - * fcoe_sw_shost_config - sets up fc_lport->host +/** + * fcoe_sw_shost_config() - Sets up fc_lport->host   * @lp : ptr to the fc_lport   * @shost : ptr to the associated scsi host   * @dev : device associated to scsi host   * - * Must be called after fcoe_sw_lport_config) and fcoe_sw_netdev_config() + * Must be called after fcoe_sw_lport_config() and fcoe_sw_netdev_config()   *   * Returns : 0 for success - *   */  static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost,  				struct device *dev) @@ -261,8 +258,8 @@ static int fcoe_sw_shost_config(struct fc_lport *lp, struct Scsi_Host *shost,  	return 0;  } -/* - * fcoe_sw_em_config - allocates em for this lport +/** + * fcoe_sw_em_config() - allocates em for this lport   * @lp: the port that em is to allocated for   *   * Returns : 0 on success @@ -279,8 +276,8 @@ static inline int fcoe_sw_em_config(struct fc_lport *lp)  	return 0;  } -/* - * fcoe_sw_destroy - FCoE software HBA tear-down function +/** + * fcoe_sw_destroy() - FCoE software HBA tear-down function   * @netdev: ptr to the associated net_device   *   * Returns: 0 if link is OK for use by FCoE. @@ -301,7 +298,7 @@ static int fcoe_sw_destroy(struct net_device *netdev)  	if (!lp)  		return -ENODEV; -	fc = fcoe_softc(lp); +	fc = lport_priv(lp);  	/* Logout of the fabric */  	fc_fabric_logoff(lp); @@ -353,8 +350,8 @@ static struct libfc_function_template fcoe_sw_libfc_fcn_templ = {  	.frame_send = fcoe_xmit,  }; -/* - * fcoe_sw_create - this function creates the fcoe interface +/** + * fcoe_sw_create() - this function creates the fcoe interface   * @netdev: pointer the associated netdevice   *   * Creates fc_lport struct and scsi_host for lport, configures lport @@ -440,8 +437,8 @@ out_host_put:  	return rc;  } -/* - * fcoe_sw_match - the fcoe sw transport match function +/** + * fcoe_sw_match() - The FCoE SW transport match function   *   * Returns : false always   */ @@ -461,8 +458,8 @@ struct fcoe_transport fcoe_sw_transport = {  	.device = 0xffff,  }; -/* - * fcoe_sw_init - registers fcoe_sw_transport +/** + * fcoe_sw_init() - Registers fcoe_sw_transport   *   * Returns : 0 on success   */ @@ -471,17 +468,22 @@ int __init fcoe_sw_init(void)  	/* attach to scsi transport */  	scsi_transport_fcoe_sw =  		fc_attach_transport(&fcoe_sw_transport_function); +  	if (!scsi_transport_fcoe_sw) {  		printk(KERN_ERR "fcoe_sw_init:fc_attach_transport() failed\n");  		return -ENODEV;  	} + +	mutex_init(&fcoe_sw_transport.devlock); +	INIT_LIST_HEAD(&fcoe_sw_transport.devlist); +  	/* register sw transport */  	fcoe_transport_register(&fcoe_sw_transport);  	return 0;  } -/* - * fcoe_sw_exit - unregisters fcoe_sw_transport +/** + * fcoe_sw_exit() - Unregisters fcoe_sw_transport   *   * Returns : 0 on success   */ diff --git a/drivers/scsi/fcoe/libfcoe.c b/drivers/scsi/fcoe/libfcoe.c index e419f486cdb..5548bf3bb58 100644 --- a/drivers/scsi/fcoe/libfcoe.c +++ b/drivers/scsi/fcoe/libfcoe.c @@ -49,6 +49,7 @@  static int debug_fcoe;  #define FCOE_MAX_QUEUE_DEPTH  256 +#define FCOE_LOW_QUEUE_DEPTH  32  /* destination address mode */  #define FCOE_GW_ADDR_MODE	    0x00 @@ -69,8 +70,6 @@ struct fcoe_percpu_s *fcoe_percpu[NR_CPUS];  /* Function Prototyes */  static int fcoe_check_wait_queue(struct fc_lport *); -static void fcoe_insert_wait_queue_head(struct fc_lport *, struct sk_buff *); -static void fcoe_insert_wait_queue(struct fc_lport *, struct sk_buff *);  static void fcoe_recv_flogi(struct fcoe_softc *, struct fc_frame *, u8 *);  #ifdef CONFIG_HOTPLUG_CPU  static int fcoe_cpu_callback(struct notifier_block *, ulong, void *); @@ -91,13 +90,13 @@ static struct notifier_block fcoe_cpu_notifier = {  };  /** - * fcoe_create_percpu_data - creates the associated cpu data + * fcoe_create_percpu_data() - creates the associated cpu data   * @cpu: index for the cpu where fcoe cpu data will be created   *   * create percpu stats block, from cpu add notifier   *   * Returns: none - **/ + */  static void fcoe_create_percpu_data(int cpu)  {  	struct fc_lport *lp; @@ -115,13 +114,13 @@ static void fcoe_create_percpu_data(int cpu)  }  /** - * fcoe_destroy_percpu_data - destroys the associated cpu data + * fcoe_destroy_percpu_data() - destroys the associated cpu data   * @cpu: index for the cpu where fcoe cpu data will destroyed   *   * destroy percpu stats block called by cpu add/remove notifier   *   * Retuns: none - **/ + */  static void fcoe_destroy_percpu_data(int cpu)  {  	struct fc_lport *lp; @@ -137,7 +136,7 @@ static void fcoe_destroy_percpu_data(int cpu)  }  /** - * fcoe_cpu_callback - fcoe cpu hotplug event callback + * fcoe_cpu_callback() - fcoe cpu hotplug event callback   * @nfb: callback data block   * @action: event triggering the callback   * @hcpu: index for the cpu of this event @@ -145,7 +144,7 @@ static void fcoe_destroy_percpu_data(int cpu)   * this creates or destroys per cpu data for fcoe   *   * Returns NOTIFY_OK always. - **/ + */  static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action,  			     void *hcpu)  { @@ -166,7 +165,7 @@ static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action,  #endif /* CONFIG_HOTPLUG_CPU */  /** - * fcoe_rcv - this is the fcoe receive function called by NET_RX_SOFTIRQ + * fcoe_rcv() - this is the fcoe receive function called by NET_RX_SOFTIRQ   * @skb: the receive skb   * @dev: associated net device   * @ptype: context @@ -175,7 +174,7 @@ static int fcoe_cpu_callback(struct notifier_block *nfb, unsigned long action,   * this function will receive the packet and build fc frame and pass it up   *   * Returns: 0 for success - **/ + */  int fcoe_rcv(struct sk_buff *skb, struct net_device *dev,  	     struct packet_type *ptype, struct net_device *olddev)  { @@ -265,11 +264,11 @@ err2:  EXPORT_SYMBOL_GPL(fcoe_rcv);  /** - * fcoe_start_io - pass to netdev to start xmit for fcoe + * fcoe_start_io() - pass to netdev to start xmit for fcoe   * @skb: the skb to be xmitted   *   * Returns: 0 for success - **/ + */  static inline int fcoe_start_io(struct sk_buff *skb)  {  	int rc; @@ -283,12 +282,12 @@ static inline int fcoe_start_io(struct sk_buff *skb)  }  /** - * fcoe_get_paged_crc_eof - in case we need alloc a page for crc_eof + * fcoe_get_paged_crc_eof() - in case we need alloc a page for crc_eof   * @skb: the skb to be xmitted   * @tlen: total len   *   * Returns: 0 for success - **/ + */  static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen)  {  	struct fcoe_percpu_s *fps; @@ -326,13 +325,12 @@ static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen)  }  /** - * fcoe_fc_crc - calculates FC CRC in this fcoe skb + * fcoe_fc_crc() - calculates FC CRC in this fcoe skb   * @fp: the fc_frame containg data to be checksummed   *   * This uses crc32() to calculate the crc for fc frame   * Return   : 32 bit crc - * - **/ + */  u32 fcoe_fc_crc(struct fc_frame *fp)  {  	struct sk_buff *skb = fp_skb(fp); @@ -363,13 +361,12 @@ u32 fcoe_fc_crc(struct fc_frame *fp)  EXPORT_SYMBOL_GPL(fcoe_fc_crc);  /** - * fcoe_xmit - FCoE frame transmit function + * fcoe_xmit() - FCoE frame transmit function   * @lp:	the associated local port   * @fp: the fc_frame to be transmitted   *   * Return   : 0 for success - * - **/ + */  int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)  {  	int wlen, rc = 0; @@ -389,7 +386,7 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)  	WARN_ON((fr_len(fp) % sizeof(u32)) != 0); -	fc = fcoe_softc(lp); +	fc = lport_priv(lp);  	/*  	 * if it is a flogi then we need to learn gw-addr  	 * and my own fcid @@ -439,7 +436,7 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)  	if (skb_is_nonlinear(skb)) {  		skb_frag_t *frag;  		if (fcoe_get_paged_crc_eof(skb, tlen)) { -			kfree(skb); +			kfree_skb(skb);  			return -ENOMEM;  		}  		frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1]; @@ -502,21 +499,22 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)  		rc = fcoe_start_io(skb);  	if (rc) { -		fcoe_insert_wait_queue(lp, skb); +		spin_lock_bh(&fc->fcoe_pending_queue.lock); +		__skb_queue_tail(&fc->fcoe_pending_queue, skb); +		spin_unlock_bh(&fc->fcoe_pending_queue.lock);  		if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) -			fc_pause(lp); +			lp->qfull = 1;  	}  	return 0;  }  EXPORT_SYMBOL_GPL(fcoe_xmit); -/* - * fcoe_percpu_receive_thread - recv thread per cpu +/** + * fcoe_percpu_receive_thread() - recv thread per cpu   * @arg: ptr to the fcoe per cpu struct   *   * Return: 0 for success - *   */  int fcoe_percpu_receive_thread(void *arg)  { @@ -533,7 +531,7 @@ int fcoe_percpu_receive_thread(void *arg)  	struct fcoe_softc *fc;  	struct fcoe_hdr *hp; -	set_user_nice(current, 19); +	set_user_nice(current, -20);  	while (!kthread_should_stop()) { @@ -658,7 +656,7 @@ int fcoe_percpu_receive_thread(void *arg)  }  /** - * fcoe_recv_flogi - flogi receive function + * fcoe_recv_flogi() - flogi receive function   * @fc: associated fcoe_softc   * @fp: the recieved frame   * @sa: the source address of this flogi @@ -667,7 +665,7 @@ int fcoe_percpu_receive_thread(void *arg)   * mac address for the initiator, eitehr OUI based or GW based.   *   * Returns: none - **/ + */  static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa)  {  	struct fc_frame_header *fh; @@ -715,32 +713,23 @@ static void fcoe_recv_flogi(struct fcoe_softc *fc, struct fc_frame *fp, u8 *sa)  }  /** - * fcoe_watchdog - fcoe timer callback + * fcoe_watchdog() - fcoe timer callback   * @vp:   * - * This checks the pending queue length for fcoe and put fcoe to be paused state + * This checks the pending queue length for fcoe and set lport qfull   * if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the   * fcoe_hostlist.   *   * Returns: 0 for success - **/ + */  void fcoe_watchdog(ulong vp)  { -	struct fc_lport *lp;  	struct fcoe_softc *fc; -	int paused = 0;  	read_lock(&fcoe_hostlist_lock);  	list_for_each_entry(fc, &fcoe_hostlist, list) { -		lp = fc->lp; -		if (lp) { -			if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) -				paused = 1; -			if (fcoe_check_wait_queue(lp) <	 FCOE_MAX_QUEUE_DEPTH) { -				if (paused) -					fc_unpause(lp); -			} -		} +		if (fc->lp) +			fcoe_check_wait_queue(fc->lp);  	}  	read_unlock(&fcoe_hostlist_lock); @@ -750,96 +739,64 @@ void fcoe_watchdog(ulong vp)  /** - * fcoe_check_wait_queue - put the skb into fcoe pending xmit queue + * fcoe_check_wait_queue() - put the skb into fcoe pending xmit queue   * @lp: the fc_port for this skb   * @skb: the associated skb to be xmitted   *   * This empties the wait_queue, dequeue the head of the wait_queue queue   * and calls fcoe_start_io() for each packet, if all skb have been - * transmitted, return 0 if a error occurs, then restore wait_queue and - * try again later. + * transmitted, return qlen or -1 if a error occurs, then restore + * wait_queue and  try again later.   *   * The wait_queue is used when the skb transmit fails. skb will go   * in the wait_queue which will be emptied by the time function OR   * by the next skb transmit.   *   * Returns: 0 for success - **/ + */  static int fcoe_check_wait_queue(struct fc_lport *lp)  { -	int rc, unpause = 0; -	int paused = 0; +	struct fcoe_softc *fc = lport_priv(lp);  	struct sk_buff *skb; -	struct fcoe_softc *fc; +	int rc = -1; -	fc = fcoe_softc(lp);  	spin_lock_bh(&fc->fcoe_pending_queue.lock); +	if (fc->fcoe_pending_queue_active) +		goto out; +	fc->fcoe_pending_queue_active = 1; -	/* -	 * is this interface paused? -	 */ -	if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH) -		paused = 1; -	if (fc->fcoe_pending_queue.qlen) { -		while ((skb = __skb_dequeue(&fc->fcoe_pending_queue)) != NULL) { -			spin_unlock_bh(&fc->fcoe_pending_queue.lock); -			rc = fcoe_start_io(skb); -			if (rc) { -				fcoe_insert_wait_queue_head(lp, skb); -				return rc; -			} -			spin_lock_bh(&fc->fcoe_pending_queue.lock); -		} -		if (fc->fcoe_pending_queue.qlen < FCOE_MAX_QUEUE_DEPTH) -			unpause = 1; -	} -	spin_unlock_bh(&fc->fcoe_pending_queue.lock); -	if ((unpause) && (paused)) -		fc_unpause(lp); -	return fc->fcoe_pending_queue.qlen; -} - -/** - * fcoe_insert_wait_queue_head - puts skb to fcoe pending queue head - * @lp: the fc_port for this skb - * @skb: the associated skb to be xmitted - * - * Returns: none - **/ -static void fcoe_insert_wait_queue_head(struct fc_lport *lp, -					struct sk_buff *skb) -{ -	struct fcoe_softc *fc; +	while (fc->fcoe_pending_queue.qlen) { +		/* keep qlen > 0 until fcoe_start_io succeeds */ +		fc->fcoe_pending_queue.qlen++; +		skb = __skb_dequeue(&fc->fcoe_pending_queue); -	fc = fcoe_softc(lp); -	spin_lock_bh(&fc->fcoe_pending_queue.lock); -	__skb_queue_head(&fc->fcoe_pending_queue, skb); -	spin_unlock_bh(&fc->fcoe_pending_queue.lock); -} +		spin_unlock_bh(&fc->fcoe_pending_queue.lock); +		rc = fcoe_start_io(skb); +		spin_lock_bh(&fc->fcoe_pending_queue.lock); -/** - * fcoe_insert_wait_queue - put the skb into fcoe pending queue tail - * @lp: the fc_port for this skb - * @skb: the associated skb to be xmitted - * - * Returns: none - **/ -static void fcoe_insert_wait_queue(struct fc_lport *lp, -				   struct sk_buff *skb) -{ -	struct fcoe_softc *fc; +		if (rc) { +			__skb_queue_head(&fc->fcoe_pending_queue, skb); +			/* undo temporary increment above */ +			fc->fcoe_pending_queue.qlen--; +			break; +		} +		/* undo temporary increment above */ +		fc->fcoe_pending_queue.qlen--; +	} -	fc = fcoe_softc(lp); -	spin_lock_bh(&fc->fcoe_pending_queue.lock); -	__skb_queue_tail(&fc->fcoe_pending_queue, skb); +	if (fc->fcoe_pending_queue.qlen < FCOE_LOW_QUEUE_DEPTH) +		lp->qfull = 0; +	fc->fcoe_pending_queue_active = 0; +	rc = fc->fcoe_pending_queue.qlen; +out:  	spin_unlock_bh(&fc->fcoe_pending_queue.lock); +	return rc;  }  /** - * fcoe_dev_setup - setup link change notification interface - * - **/ -static void fcoe_dev_setup(void) + * fcoe_dev_setup() - setup link change notification interface + */ +static void fcoe_dev_setup()  {  	/*  	 * here setup a interface specific wd time to @@ -849,15 +806,15 @@ static void fcoe_dev_setup(void)  }  /** - * fcoe_dev_setup - cleanup link change notification interface - **/ + * fcoe_dev_setup() - cleanup link change notification interface + */  static void fcoe_dev_cleanup(void)  {  	unregister_netdevice_notifier(&fcoe_notifier);  }  /** - * fcoe_device_notification - netdev event notification callback + * fcoe_device_notification() - netdev event notification callback   * @notifier: context of the notification   * @event: type of event   * @ptr: fixed array for output parsed ifname @@ -865,7 +822,7 @@ static void fcoe_dev_cleanup(void)   * This function is called by the ethernet driver in case of link change event   *   * Returns: 0 for success - **/ + */  static int fcoe_device_notification(struct notifier_block *notifier,  				    ulong event, void *ptr)  { @@ -873,7 +830,7 @@ static int fcoe_device_notification(struct notifier_block *notifier,  	struct net_device *real_dev = ptr;  	struct fcoe_softc *fc;  	struct fcoe_dev_stats *stats; -	u16 new_status; +	u32 new_link_up;  	u32 mfs;  	int rc = NOTIFY_OK; @@ -890,17 +847,15 @@ static int fcoe_device_notification(struct notifier_block *notifier,  		goto out;  	} -	new_status = lp->link_status; +	new_link_up = lp->link_up;  	switch (event) {  	case NETDEV_DOWN:  	case NETDEV_GOING_DOWN: -		new_status &= ~FC_LINK_UP; +		new_link_up = 0;  		break;  	case NETDEV_UP:  	case NETDEV_CHANGE: -		new_status &= ~FC_LINK_UP; -		if (!fcoe_link_ok(lp)) -			new_status |= FC_LINK_UP; +		new_link_up = !fcoe_link_ok(lp);  		break;  	case NETDEV_CHANGEMTU:  		mfs = fc->real_dev->mtu - @@ -908,17 +863,15 @@ static int fcoe_device_notification(struct notifier_block *notifier,  			 sizeof(struct fcoe_crc_eof));  		if (mfs >= FC_MIN_MAX_FRAME)  			fc_set_mfs(lp, mfs); -		new_status &= ~FC_LINK_UP; -		if (!fcoe_link_ok(lp)) -			new_status |= FC_LINK_UP; +		new_link_up = !fcoe_link_ok(lp);  		break;  	case NETDEV_REGISTER:  		break;  	default:  		FC_DBG("unknown event %ld call", event);  	} -	if (lp->link_status != new_status) { -		if ((new_status & FC_LINK_UP) == FC_LINK_UP) +	if (lp->link_up != new_link_up) { +		if (new_link_up)  			fc_linkup(lp);  		else {  			stats = lp->dev_stats[smp_processor_id()]; @@ -933,12 +886,12 @@ out:  }  /** - * fcoe_if_to_netdev - parse a name buffer to get netdev + * fcoe_if_to_netdev() - parse a name buffer to get netdev   * @ifname: fixed array for output parsed ifname   * @buffer: incoming buffer to be copied   *   * Returns: NULL or ptr to netdeive - **/ + */  static struct net_device *fcoe_if_to_netdev(const char *buffer)  {  	char *cp; @@ -955,13 +908,13 @@ static struct net_device *fcoe_if_to_netdev(const char *buffer)  }  /** - * fcoe_netdev_to_module_owner - finds out the nic drive moddule of the netdev + * fcoe_netdev_to_module_owner() - finds out the nic drive moddule of the netdev   * @netdev: the target netdev   *   * Returns: ptr to the struct module, NULL for failure - **/ -static struct module *fcoe_netdev_to_module_owner( -	const struct net_device *netdev) + */ +static struct module * +fcoe_netdev_to_module_owner(const struct net_device *netdev)  {  	struct device *dev; @@ -979,12 +932,14 @@ static struct module *fcoe_netdev_to_module_owner(  }  /** - * fcoe_ethdrv_get - holds the nic driver module by  try_module_get() for - * the corresponding netdev. + * fcoe_ethdrv_get() - Hold the Ethernet driver   * @netdev: the target netdev   * + * Holds the Ethernet driver module by try_module_get() for + * the corresponding netdev. + *   * Returns: 0 for succsss - **/ + */  static int fcoe_ethdrv_get(const struct net_device *netdev)  {  	struct module *owner; @@ -999,12 +954,14 @@ static int fcoe_ethdrv_get(const struct net_device *netdev)  }  /** - * fcoe_ethdrv_get - releases the nic driver module by module_put for - * the corresponding netdev. + * fcoe_ethdrv_put() - Release the Ethernet driver   * @netdev: the target netdev   * + * Releases the Ethernet driver module by module_put for + * the corresponding netdev. + *   * Returns: 0 for succsss - **/ + */  static int fcoe_ethdrv_put(const struct net_device *netdev)  {  	struct module *owner; @@ -1020,12 +977,12 @@ static int fcoe_ethdrv_put(const struct net_device *netdev)  }  /** - * fcoe_destroy- handles the destroy from sysfs + * fcoe_destroy() - handles the destroy from sysfs   * @buffer: expcted to be a eth if name   * @kp: associated kernel param   *   * Returns: 0 for success - **/ + */  static int fcoe_destroy(const char *buffer, struct kernel_param *kp)  {  	int rc; @@ -1058,12 +1015,12 @@ out_nodev:  }  /** - * fcoe_create - handles the create call from sysfs + * fcoe_create() - Handles the create call from sysfs   * @buffer: expcted to be a eth if name   * @kp: associated kernel param   *   * Returns: 0 for success - **/ + */  static int fcoe_create(const char *buffer, struct kernel_param *kp)  {  	int rc; @@ -1104,8 +1061,8 @@ module_param_call(destroy, fcoe_destroy, NULL, NULL, S_IWUSR);  __MODULE_PARM_TYPE(destroy, "string");  MODULE_PARM_DESC(destroy, "Destroy fcoe port"); -/* - * fcoe_link_ok - check if link is ok for the fc_lport +/** + * fcoe_link_ok() - Check if link is ok for the fc_lport   * @lp: ptr to the fc_lport   *   * Any permanently-disqualifying conditions have been previously checked. @@ -1120,7 +1077,7 @@ MODULE_PARM_DESC(destroy, "Destroy fcoe port");   */  int fcoe_link_ok(struct fc_lport *lp)  { -	struct fcoe_softc *fc = fcoe_softc(lp); +	struct fcoe_softc *fc = lport_priv(lp);  	struct net_device *dev = fc->real_dev;  	struct ethtool_cmd ecmd = { ETHTOOL_GSET };  	int rc = 0; @@ -1149,9 +1106,8 @@ int fcoe_link_ok(struct fc_lport *lp)  }  EXPORT_SYMBOL_GPL(fcoe_link_ok); -/* - * fcoe_percpu_clean - frees skb of the corresponding lport from the per - * cpu queue. +/** + * fcoe_percpu_clean() - Clear the pending skbs for an lport   * @lp: the fc_lport   */  void fcoe_percpu_clean(struct fc_lport *lp) @@ -1185,11 +1141,11 @@ void fcoe_percpu_clean(struct fc_lport *lp)  EXPORT_SYMBOL_GPL(fcoe_percpu_clean);  /** - * fcoe_clean_pending_queue - dequeue skb and free it + * fcoe_clean_pending_queue() - Dequeue a skb and free it   * @lp: the corresponding fc_lport   *   * Returns: none - **/ + */  void fcoe_clean_pending_queue(struct fc_lport *lp)  {  	struct fcoe_softc  *fc = lport_priv(lp); @@ -1206,21 +1162,21 @@ void fcoe_clean_pending_queue(struct fc_lport *lp)  EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue);  /** - * libfc_host_alloc - allocate a Scsi_Host with room for the fc_lport + * libfc_host_alloc() - Allocate a Scsi_Host with room for the fc_lport   * @sht: ptr to the scsi host templ   * @priv_size: size of private data after fc_lport   *   * Returns: ptr to Scsi_Host - * TODO - to libfc? + * TODO: to libfc?   */ -static inline struct Scsi_Host *libfc_host_alloc( -	struct scsi_host_template *sht, int priv_size) +static inline struct Scsi_Host * +libfc_host_alloc(struct scsi_host_template *sht, int priv_size)  {  	return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size);  }  /** - * fcoe_host_alloc - allocate a Scsi_Host with room for the fcoe_softc + * fcoe_host_alloc() - Allocate a Scsi_Host with room for the fcoe_softc   * @sht: ptr to the scsi host templ   * @priv_size: size of private data after fc_lport   * @@ -1232,8 +1188,8 @@ struct Scsi_Host *fcoe_host_alloc(struct scsi_host_template *sht, int priv_size)  }  EXPORT_SYMBOL_GPL(fcoe_host_alloc); -/* - * fcoe_reset - resets the fcoe +/** + * fcoe_reset() - Resets the fcoe   * @shost: shost the reset is from   *   * Returns: always 0 @@ -1246,8 +1202,8 @@ int fcoe_reset(struct Scsi_Host *shost)  }  EXPORT_SYMBOL_GPL(fcoe_reset); -/* - * fcoe_wwn_from_mac - converts 48-bit IEEE MAC address to 64-bit FC WWN. +/** + * fcoe_wwn_from_mac() - Converts 48-bit IEEE MAC address to 64-bit FC WWN.   * @mac: mac address   * @scheme: check port   * @port: port indicator for converting @@ -1286,14 +1242,15 @@ u64 fcoe_wwn_from_mac(unsigned char mac[MAX_ADDR_LEN],  	return wwn;  }  EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac); -/* - * fcoe_hostlist_lookup_softc - find the corresponding lport by a given device + +/** + * fcoe_hostlist_lookup_softc() - find the corresponding lport by a given device   * @device: this is currently ptr to net_device   *   * Returns: NULL or the located fcoe_softc   */ -static struct fcoe_softc *fcoe_hostlist_lookup_softc( -	const struct net_device *dev) +static struct fcoe_softc * +fcoe_hostlist_lookup_softc(const struct net_device *dev)  {  	struct fcoe_softc *fc; @@ -1308,8 +1265,8 @@ static struct fcoe_softc *fcoe_hostlist_lookup_softc(  	return NULL;  } -/* - * fcoe_hostlist_lookup - find the corresponding lport by netdev +/** + * fcoe_hostlist_lookup() - Find the corresponding lport by netdev   * @netdev: ptr to net_device   *   * Returns: 0 for success @@ -1324,8 +1281,8 @@ struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev)  }  EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup); -/* - * fcoe_hostlist_add - add a lport to lports list +/** + * fcoe_hostlist_add() - Add a lport to lports list   * @lp: ptr to the fc_lport to badded   *   * Returns: 0 for success @@ -1336,7 +1293,7 @@ int fcoe_hostlist_add(const struct fc_lport *lp)  	fc = fcoe_hostlist_lookup_softc(fcoe_netdev(lp));  	if (!fc) { -		fc = fcoe_softc(lp); +		fc = lport_priv(lp);  		write_lock_bh(&fcoe_hostlist_lock);  		list_add_tail(&fc->list, &fcoe_hostlist);  		write_unlock_bh(&fcoe_hostlist_lock); @@ -1345,8 +1302,8 @@ int fcoe_hostlist_add(const struct fc_lport *lp)  }  EXPORT_SYMBOL_GPL(fcoe_hostlist_add); -/* - * fcoe_hostlist_remove - remove a lport from lports list +/** + * fcoe_hostlist_remove() - remove a lport from lports list   * @lp: ptr to the fc_lport to badded   *   * Returns: 0 for success @@ -1366,12 +1323,12 @@ int fcoe_hostlist_remove(const struct fc_lport *lp)  EXPORT_SYMBOL_GPL(fcoe_hostlist_remove);  /** - * fcoe_libfc_config - sets up libfc related properties for lport + * fcoe_libfc_config() - sets up libfc related properties for lport   * @lp: ptr to the fc_lport   * @tt: libfc function template   *   * Returns : 0 for success - **/ + */  int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt)  {  	/* Set the function pointers set by the LLDD */ @@ -1389,14 +1346,14 @@ int fcoe_libfc_config(struct fc_lport *lp, struct libfc_function_template *tt)  EXPORT_SYMBOL_GPL(fcoe_libfc_config);  /** - * fcoe_init - fcoe module loading initialization + * fcoe_init() - fcoe module loading initialization   *   * Initialization routine   * 1. Will create fc transport software structure   * 2. initialize the link list of port information structure   *   * Returns 0 on success, negative on failure - **/ + */  static int __init fcoe_init(void)  {  	int cpu; @@ -1433,7 +1390,6 @@ static int __init fcoe_init(void)  			} else {  				fcoe_percpu[cpu] = NULL;  				kfree(p); -  			}  		}  	} @@ -1443,11 +1399,9 @@ static int __init fcoe_init(void)  	 */  	fcoe_dev_setup(); -	init_timer(&fcoe_timer); -	fcoe_timer.data = 0; -	fcoe_timer.function = fcoe_watchdog; -	fcoe_timer.expires = (jiffies + (10 * HZ)); -	add_timer(&fcoe_timer); +	setup_timer(&fcoe_timer, fcoe_watchdog, 0); + +	mod_timer(&fcoe_timer, jiffies + (10 * HZ));  	/* initiatlize the fcoe transport */  	fcoe_transport_init(); @@ -1459,10 +1413,10 @@ static int __init fcoe_init(void)  module_init(fcoe_init);  /** - * fcoe_exit - fcoe module unloading cleanup + * fcoe_exit() - fcoe module unloading cleanup   *   * Returns 0 on success, negative on failure - **/ + */  static void __exit fcoe_exit(void)  {  	u32 idx; @@ -1483,7 +1437,7 @@ static void __exit fcoe_exit(void)  	 */  	del_timer_sync(&fcoe_timer); -	/* releases the assocaited fcoe transport for each lport */ +	/* releases the associated fcoe transport for each lport */  	list_for_each_entry_safe(fc, tmp, &fcoe_hostlist, list)  		fcoe_transport_release(fc->real_dev); diff --git a/drivers/scsi/lasi700.c b/drivers/scsi/lasi700.c index 4a4e6954ec7..f23c4ca9a2e 100644 --- a/drivers/scsi/lasi700.c +++ b/drivers/scsi/lasi700.c @@ -103,7 +103,7 @@ lasi700_probe(struct parisc_device *dev)  	hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL);  	if (!hostdata) { -		dev_printk(KERN_ERR, dev, "Failed to allocate host data\n"); +		dev_printk(KERN_ERR, &dev->dev, "Failed to allocate host data\n");  		return -ENOMEM;  	} diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c index dd1564c9e04..e57556ea5b4 100644 --- a/drivers/scsi/libfc/fc_disc.c +++ b/drivers/scsi/libfc/fc_disc.c @@ -64,7 +64,7 @@ static void fc_disc_single(struct fc_disc *, struct fc_disc_port *);  static void fc_disc_restart(struct fc_disc *);  /** - * fc_disc_lookup_rport - lookup a remote port by port_id + * fc_disc_lookup_rport() - lookup a remote port by port_id   * @lport: Fibre Channel host port instance   * @port_id: remote port port_id to match   */ @@ -92,7 +92,7 @@ struct fc_rport *fc_disc_lookup_rport(const struct fc_lport *lport,  }  /** - * fc_disc_stop_rports - delete all the remote ports associated with the lport + * fc_disc_stop_rports() - delete all the remote ports associated with the lport   * @disc: The discovery job to stop rports on   *   * Locking Note: This function expects that the lport mutex is locked before @@ -117,7 +117,7 @@ void fc_disc_stop_rports(struct fc_disc *disc)  }  /** - * fc_disc_rport_callback - Event handler for rport events + * fc_disc_rport_callback() - Event handler for rport events   * @lport: The lport which is receiving the event   * @rport: The rport which the event has occured on   * @event: The event that occured @@ -151,7 +151,7 @@ static void fc_disc_rport_callback(struct fc_lport *lport,  }  /** - * fc_disc_recv_rscn_req - Handle Registered State Change Notification (RSCN) + * fc_disc_recv_rscn_req() - Handle Registered State Change Notification (RSCN)   * @sp: Current sequence of the RSCN exchange   * @fp: RSCN Frame   * @lport: Fibre Channel host port instance @@ -246,7 +246,7 @@ static void fc_disc_recv_rscn_req(struct fc_seq *sp, struct fc_frame *fp,  			list_del(&dp->peers);  			rport = lport->tt.rport_lookup(lport, dp->ids.port_id);  			if (rport) { -				rdata = RPORT_TO_PRIV(rport); +				rdata = rport->dd_data;  				list_del(&rdata->peers);  				lport->tt.rport_logoff(rport);  			} @@ -265,7 +265,7 @@ reject:  }  /** - * fc_disc_recv_req - Handle incoming requests + * fc_disc_recv_req() - Handle incoming requests   * @sp: Current sequence of the request exchange   * @fp: The frame   * @lport: The FC local port @@ -294,7 +294,7 @@ static void fc_disc_recv_req(struct fc_seq *sp, struct fc_frame *fp,  }  /** - * fc_disc_restart - Restart discovery + * fc_disc_restart() - Restart discovery   * @lport: FC discovery context   *   * Locking Note: This function expects that the disc mutex @@ -322,7 +322,7 @@ static void fc_disc_restart(struct fc_disc *disc)  }  /** - * fc_disc_start - Fibre Channel Target discovery + * fc_disc_start() - Fibre Channel Target discovery   * @lport: FC local port   *   * Returns non-zero if discovery cannot be started. @@ -383,7 +383,7 @@ static struct fc_rport_operations fc_disc_rport_ops = {  };  /** - * fc_disc_new_target - Handle new target found by discovery + * fc_disc_new_target() - Handle new target found by discovery   * @lport: FC local port   * @rport: The previous FC remote port (NULL if new remote port)   * @ids: Identifiers for the new FC remote port @@ -396,7 +396,7 @@ static int fc_disc_new_target(struct fc_disc *disc,  			      struct fc_rport_identifiers *ids)  {  	struct fc_lport *lport = disc->lport; -	struct fc_rport_libfc_priv *rp; +	struct fc_rport_libfc_priv *rdata;  	int error = 0;  	if (rport && ids->port_name) { @@ -430,15 +430,15 @@ static int fc_disc_new_target(struct fc_disc *disc,  				dp.ids.port_name = ids->port_name;  				dp.ids.node_name = ids->node_name;  				dp.ids.roles = ids->roles; -				rport = fc_rport_rogue_create(&dp); +				rport = lport->tt.rport_create(&dp);  			}  			if (!rport)  				error = -ENOMEM;  		}  		if (rport) { -			rp = rport->dd_data; -			rp->ops = &fc_disc_rport_ops; -			rp->rp_state = RPORT_ST_INIT; +			rdata = rport->dd_data; +			rdata->ops = &fc_disc_rport_ops; +			rdata->rp_state = RPORT_ST_INIT;  			lport->tt.rport_login(rport);  		}  	} @@ -446,20 +446,20 @@ static int fc_disc_new_target(struct fc_disc *disc,  }  /** - * fc_disc_del_target - Delete a target + * fc_disc_del_target() - Delete a target   * @disc: FC discovery context   * @rport: The remote port to be removed   */  static void fc_disc_del_target(struct fc_disc *disc, struct fc_rport *rport)  {  	struct fc_lport *lport = disc->lport; -	struct fc_rport_libfc_priv *rdata = RPORT_TO_PRIV(rport); +	struct fc_rport_libfc_priv *rdata = rport->dd_data;  	list_del(&rdata->peers);  	lport->tt.rport_logoff(rport);  }  /** - * fc_disc_done - Discovery has been completed + * fc_disc_done() - Discovery has been completed   * @disc: FC discovery context   */  static void fc_disc_done(struct fc_disc *disc) @@ -479,7 +479,7 @@ static void fc_disc_done(struct fc_disc *disc)  }  /** - * fc_disc_error - Handle error on dNS request + * fc_disc_error() - Handle error on dNS request   * @disc: FC discovery context   * @fp: The frame pointer   */ @@ -519,7 +519,7 @@ static void fc_disc_error(struct fc_disc *disc, struct fc_frame *fp)  }  /** - * fc_disc_gpn_ft_req - Send Get Port Names by FC-4 type (GPN_FT) request + * fc_disc_gpn_ft_req() - Send Get Port Names by FC-4 type (GPN_FT) request   * @lport: FC discovery context   *   * Locking Note: This function expects that the disc_mutex is locked @@ -553,7 +553,7 @@ err:  }  /** - * fc_disc_gpn_ft_parse - Parse the list of IDs and names resulting from a request + * fc_disc_gpn_ft_parse() - Parse the list of IDs and names resulting from a request   * @lport: Fibre Channel host port instance   * @buf: GPN_FT response buffer   * @len: size of response buffer @@ -617,7 +617,7 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)  		if ((dp.ids.port_id != fc_host_port_id(lport->host)) &&  		    (dp.ids.port_name != lport->wwpn)) { -			rport = fc_rport_rogue_create(&dp); +			rport = lport->tt.rport_create(&dp);  			if (rport) {  				rdata = rport->dd_data;  				rdata->ops = &fc_disc_rport_ops; @@ -658,7 +658,10 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)  	return error;  } -/* +/** + * fc_disc_timeout() - Retry handler for the disc component + * @work: Structure holding disc obj that needs retry discovery + *   * Handle retry of memory allocation for remote ports.   */  static void fc_disc_timeout(struct work_struct *work) @@ -673,7 +676,7 @@ static void fc_disc_timeout(struct work_struct *work)  }  /** - * fc_disc_gpn_ft_resp - Handle a response frame from Get Port Names (GPN_FT) + * fc_disc_gpn_ft_resp() - Handle a response frame from Get Port Names (GPN_FT)   * @sp: Current sequence of GPN_FT exchange   * @fp: response frame   * @lp_arg: Fibre Channel host port instance @@ -712,9 +715,7 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp,  			       fr_len(fp));  		} else if (ntohs(cp->ct_cmd) == FC_FS_ACC) { -			/* -			 * Accepted.  Parse response. -			 */ +			/* Accepted, parse the response. */  			buf = cp + 1;  			len -= sizeof(*cp);  		} else if (ntohs(cp->ct_cmd) == FC_FS_RJT) { @@ -746,7 +747,7 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp,  }  /** - * fc_disc_single - Discover the directory information for a single target + * fc_disc_single() - Discover the directory information for a single target   * @lport: FC local port   * @dp: The port to rediscover   * @@ -769,7 +770,7 @@ static void fc_disc_single(struct fc_disc *disc, struct fc_disc_port *dp)  	if (rport)  		fc_disc_del_target(disc, rport); -	new_rport = fc_rport_rogue_create(dp); +	new_rport = lport->tt.rport_create(dp);  	if (new_rport) {  		rdata = new_rport->dd_data;  		rdata->ops = &fc_disc_rport_ops; @@ -782,7 +783,7 @@ out:  }  /** - * fc_disc_stop - Stop discovery for a given lport + * fc_disc_stop() - Stop discovery for a given lport   * @lport: The lport that discovery should stop for   */  void fc_disc_stop(struct fc_lport *lport) @@ -796,7 +797,7 @@ void fc_disc_stop(struct fc_lport *lport)  }  /** - * fc_disc_stop_final - Stop discovery for a given lport + * fc_disc_stop_final() - Stop discovery for a given lport   * @lport: The lport that discovery should stop for   *   * This function will block until discovery has been @@ -809,7 +810,7 @@ void fc_disc_stop_final(struct fc_lport *lport)  }  /** - * fc_disc_init - Initialize the discovery block + * fc_disc_init() - Initialize the discovery block   * @lport: FC local port   */  int fc_disc_init(struct fc_lport *lport) diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c index 66db08a5f27..505825b6124 100644 --- a/drivers/scsi/libfc/fc_exch.c +++ b/drivers/scsi/libfc/fc_exch.c @@ -32,8 +32,6 @@  #include <scsi/libfc.h>  #include <scsi/fc_encode.h> -#define	  FC_DEF_R_A_TOV      (10 * 1000) /* resource allocation timeout */ -  /*   * fc_exch_debug can be set in debugger or at compile time to get more logs.   */ @@ -627,7 +625,6 @@ static struct fc_exch *fc_exch_resp(struct fc_exch_mgr *mp, struct fc_frame *fp)  {  	struct fc_exch *ep;  	struct fc_frame_header *fh; -	u16 rxid;  	ep = mp->lp->tt.exch_get(mp->lp, fp);  	if (ep) { @@ -654,18 +651,6 @@ static struct fc_exch *fc_exch_resp(struct fc_exch_mgr *mp, struct fc_frame *fp)  		if ((ntoh24(fh->fh_f_ctl) & FC_FC_SEQ_INIT) == 0)  			ep->esb_stat &= ~ESB_ST_SEQ_INIT; -		/* -		 * Set the responder ID in the frame header. -		 * The old one should've been 0xffff. -		 * If it isn't, don't assign one. -		 * Incoming basic link service frames may specify -		 * a referenced RX_ID. -		 */ -		if (fh->fh_type != FC_TYPE_BLS) { -			rxid = ntohs(fh->fh_rx_id); -			WARN_ON(rxid != FC_XID_UNKNOWN); -			fh->fh_rx_id = htons(ep->rxid); -		}  		fc_exch_hold(ep);	/* hold for caller */  		spin_unlock_bh(&ep->ex_lock);	/* lock from exch_get */  	} @@ -677,8 +662,8 @@ static struct fc_exch *fc_exch_resp(struct fc_exch_mgr *mp, struct fc_frame *fp)   * If fc_pf_rjt_reason is FC_RJT_NONE then this function will have a hold   * on the ep that should be released by the caller.   */ -static enum fc_pf_rjt_reason -fc_seq_lookup_recip(struct fc_exch_mgr *mp, struct fc_frame *fp) +static enum fc_pf_rjt_reason fc_seq_lookup_recip(struct fc_exch_mgr *mp, +						 struct fc_frame *fp)  {  	struct fc_frame_header *fh = fc_frame_header_get(fp);  	struct fc_exch *ep = NULL; @@ -996,9 +981,9 @@ static void fc_seq_send_ack(struct fc_seq *sp, const struct fc_frame *rx_fp)   * Send BLS Reject.   * This is for rejecting BA_ABTS only.   */ -static void -fc_exch_send_ba_rjt(struct fc_frame *rx_fp, enum fc_ba_rjt_reason reason, -		    enum fc_ba_rjt_explan explan) +static void fc_exch_send_ba_rjt(struct fc_frame *rx_fp, +				enum fc_ba_rjt_reason reason, +				enum fc_ba_rjt_explan explan)  {  	struct fc_frame *fp;  	struct fc_frame_header *rx_fh; @@ -1096,7 +1081,7 @@ static void fc_exch_recv_abts(struct fc_exch *ep, struct fc_frame *rx_fp)  		ap->ba_high_seq_cnt = fh->fh_seq_cnt;  		ap->ba_low_seq_cnt = htons(sp->cnt);  	} -	sp = fc_seq_start_next(sp); +	sp = fc_seq_start_next_locked(sp);  	spin_unlock_bh(&ep->ex_lock);  	fc_seq_send_last(sp, fp, FC_RCTL_BA_ACC, FC_TYPE_BLS);  	fc_frame_free(rx_fp); @@ -1480,10 +1465,11 @@ static void fc_exch_reset(struct fc_exch *ep)   * If sid is non-zero, reset only exchanges we source from that FID.   * If did is non-zero, reset only exchanges destined to that FID.   */ -void fc_exch_mgr_reset(struct fc_exch_mgr *mp, u32 sid, u32 did) +void fc_exch_mgr_reset(struct fc_lport *lp, u32 sid, u32 did)  {  	struct fc_exch *ep;  	struct fc_exch *next; +	struct fc_exch_mgr *mp = lp->emp;  	spin_lock_bh(&mp->em_lock);  restart: @@ -1607,7 +1593,7 @@ static void fc_exch_rrq_resp(struct fc_seq *sp, struct fc_frame *fp, void *arg)  	if (IS_ERR(fp)) {  		int err = PTR_ERR(fp); -		if (err == -FC_EX_CLOSED) +		if (err == -FC_EX_CLOSED || err == -FC_EX_TIMEOUT)  			goto cleanup;  		FC_DBG("Cannot process RRQ, because of frame error %d\n", err);  		return; diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c index 404e63ff46b..2a631d7dbce 100644 --- a/drivers/scsi/libfc/fc_fcp.c +++ b/drivers/scsi/libfc/fc_fcp.c @@ -161,7 +161,7 @@ static struct fc_fcp_pkt *fc_fcp_pkt_alloc(struct fc_lport *lp, gfp_t gfp)  }  /** - * fc_fcp_pkt_release - release hold on scsi_pkt packet + * fc_fcp_pkt_release() - release hold on scsi_pkt packet   * @fsp:	fcp packet struct   *   * This is used by upper layer scsi driver. @@ -183,8 +183,7 @@ static void fc_fcp_pkt_hold(struct fc_fcp_pkt *fsp)  }  /** - * fc_fcp_pkt_destory - release hold on scsi_pkt packet - * + * fc_fcp_pkt_destory() - release hold on scsi_pkt packet   * @seq:		exchange sequence   * @fsp:	fcp packet struct   * @@ -199,7 +198,7 @@ static void fc_fcp_pkt_destroy(struct fc_seq *seq, void *fsp)  }  /** - * fc_fcp_lock_pkt - lock a packet and get a ref to it. + * fc_fcp_lock_pkt() - lock a packet and get a ref to it.   * @fsp:	fcp packet   *   * We should only return error if we return a command to scsi-ml before @@ -291,9 +290,7 @@ static void fc_fcp_recv_data(struct fc_fcp_pkt *fsp, struct fc_frame *fp)  	buf = fc_frame_payload_get(fp, 0);  	if (offset + len > fsp->data_len) { -		/* -		 * this should never happen -		 */ +		/* this should never happen */  		if ((fr_flags(fp) & FCPHF_CRC_UNCHECKED) &&  		    fc_frame_crc_check(fp))  			goto crc_err; @@ -387,8 +384,8 @@ crc_err:  		fc_fcp_complete_locked(fsp);  } -/* - * fc_fcp_send_data -  Send SCSI data to target. +/** + * fc_fcp_send_data() -  Send SCSI data to target.   * @fsp: ptr to fc_fcp_pkt   * @sp: ptr to this sequence   * @offset: starting offset for this data request @@ -610,8 +607,8 @@ static void fc_fcp_abts_resp(struct fc_fcp_pkt *fsp, struct fc_frame *fp)  	}  } -/* - * fc_fcp_reduce_can_queue - drop can_queue +/** + * fc_fcp_reduce_can_queue() - drop can_queue   * @lp: lport to drop queueing for   *   * If we are getting memory allocation failures, then we may @@ -642,9 +639,11 @@ done:  	spin_unlock_irqrestore(lp->host->host_lock, flags);  } -/* - * exch mgr calls this routine to process scsi - * exchanges. +/** + * fc_fcp_recv() - Reveive FCP frames + * @seq: The sequence the frame is on + * @fp: The FC frame + * @arg: The related FCP packet   *   * Return   : None   * Context  : called from Soft IRQ context @@ -832,7 +831,7 @@ err:  }  /** - * fc_fcp_complete_locked - complete processing of a fcp packet + * fc_fcp_complete_locked() - complete processing of a fcp packet   * @fsp:	fcp packet   *   * This function may sleep if a timer is pending. The packet lock must be @@ -900,7 +899,7 @@ static void fc_fcp_cleanup_cmd(struct fc_fcp_pkt *fsp, int error)  }  /** - * fc_fcp_cleanup_each_cmd - run fn on each active command + * fc_fcp_cleanup_each_cmd() - Cleanup active commads   * @lp:		logical port   * @id:		target id   * @lun:	lun @@ -952,7 +951,7 @@ static void fc_fcp_abort_io(struct fc_lport *lp)  }  /** - * fc_fcp_pkt_send - send a fcp packet to the lower level. + * fc_fcp_pkt_send() - send a fcp packet to the lower level.   * @lp:		fc lport   * @fsp:	fc packet.   * @@ -1621,7 +1620,7 @@ out:  static inline int fc_fcp_lport_queue_ready(struct fc_lport *lp)  {  	/* lock ? */ -	return (lp->state == LPORT_ST_READY) && (lp->link_status & FC_LINK_UP); +	return (lp->state == LPORT_ST_READY) && lp->link_up && !lp->qfull;  }  /** @@ -1727,7 +1726,7 @@ out:  EXPORT_SYMBOL(fc_queuecommand);  /** - * fc_io_compl -  Handle responses for completed commands + * fc_io_compl() -  Handle responses for completed commands   * @fsp:	scsi packet   *   * Translates a error to a Linux SCSI error. @@ -1810,12 +1809,12 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)  		sc_cmd->result = DID_ERROR << 16;  		break;  	case FC_DATA_UNDRUN: -		if (fsp->cdb_status == 0) { +		if ((fsp->cdb_status == 0) && !(fsp->req_flags & FC_SRB_READ)) {  			/*  			 * scsi status is good but transport level -			 * underrun. for read it should be an error?? +			 * underrun.  			 */ -			sc_cmd->result = (DID_OK << 16) | fsp->cdb_status; +			sc_cmd->result = DID_OK << 16;  		} else {  			/*  			 * scsi got underrun, this is an error @@ -1857,7 +1856,7 @@ static void fc_io_compl(struct fc_fcp_pkt *fsp)  }  /** - * fc_fcp_complete - complete processing of a fcp packet + * fc_fcp_complete() - complete processing of a fcp packet   * @fsp:	fcp packet   *   * This function may sleep if a fsp timer is pending. @@ -1874,9 +1873,10 @@ void fc_fcp_complete(struct fc_fcp_pkt *fsp)  EXPORT_SYMBOL(fc_fcp_complete);  /** - * fc_eh_abort - Abort a command...from scsi host template + * fc_eh_abort() - Abort a command   * @sc_cmd:	scsi command to abort   * + * From scsi host template.   * send ABTS to the target device  and wait for the response   * sc_cmd is the pointer to the command to be aborted.   */ @@ -1890,7 +1890,7 @@ int fc_eh_abort(struct scsi_cmnd *sc_cmd)  	lp = shost_priv(sc_cmd->device->host);  	if (lp->state != LPORT_ST_READY)  		return rc; -	else if (!(lp->link_status & FC_LINK_UP)) +	else if (!lp->link_up)  		return rc;  	spin_lock_irqsave(lp->host->host_lock, flags); @@ -1920,7 +1920,7 @@ release_pkt:  EXPORT_SYMBOL(fc_eh_abort);  /** - * fc_eh_device_reset: Reset a single LUN + * fc_eh_device_reset() Reset a single LUN   * @sc_cmd:	scsi command   *   * Set from scsi host template to send tm cmd to the target and wait for the @@ -1973,7 +1973,7 @@ out:  EXPORT_SYMBOL(fc_eh_device_reset);  /** - * fc_eh_host_reset - The reset function will reset the ports on the host. + * fc_eh_host_reset() - The reset function will reset the ports on the host.   * @sc_cmd:	scsi command   */  int fc_eh_host_reset(struct scsi_cmnd *sc_cmd) @@ -1999,7 +1999,7 @@ int fc_eh_host_reset(struct scsi_cmnd *sc_cmd)  EXPORT_SYMBOL(fc_eh_host_reset);  /** - * fc_slave_alloc - configure queue depth + * fc_slave_alloc() - configure queue depth   * @sdev:	scsi device   *   * Configures queue depth based on host's cmd_per_len. If not set diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c index 0b9bdb1fb80..2ae50a1188e 100644 --- a/drivers/scsi/libfc/fc_lport.c +++ b/drivers/scsi/libfc/fc_lport.c @@ -139,7 +139,7 @@ static int fc_frame_drop(struct fc_lport *lport, struct fc_frame *fp)  }  /** - * fc_lport_rport_callback - Event handler for rport events + * fc_lport_rport_callback() - Event handler for rport events   * @lport: The lport which is receiving the event   * @rport: The rport which the event has occured on   * @event: The event that occured @@ -195,7 +195,7 @@ static void fc_lport_rport_callback(struct fc_lport *lport,  }  /** - * fc_lport_state - Return a string which represents the lport's state + * fc_lport_state() - Return a string which represents the lport's state   * @lport: The lport whose state is to converted to a string   */  static const char *fc_lport_state(struct fc_lport *lport) @@ -209,7 +209,7 @@ static const char *fc_lport_state(struct fc_lport *lport)  }  /** - * fc_lport_ptp_setup - Create an rport for point-to-point mode + * fc_lport_ptp_setup() - Create an rport for point-to-point mode   * @lport: The lport to attach the ptp rport to   * @fid: The FID of the ptp rport   * @remote_wwpn: The WWPN of the ptp rport @@ -232,7 +232,7 @@ static void fc_lport_ptp_setup(struct fc_lport *lport,  		lport->ptp_rp = NULL;  	} -	lport->ptp_rp = fc_rport_rogue_create(&dp); +	lport->ptp_rp = lport->tt.rport_create(&dp);  	lport->tt.rport_login(lport->ptp_rp); @@ -250,7 +250,7 @@ void fc_get_host_port_state(struct Scsi_Host *shost)  {  	struct fc_lport *lp = shost_priv(shost); -	if ((lp->link_status & FC_LINK_UP) == FC_LINK_UP) +	if (lp->link_up)  		fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;  	else  		fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE; @@ -351,7 +351,7 @@ static void fc_lport_add_fc4_type(struct fc_lport *lport, enum fc_fh_type type)  }  /** - * fc_lport_recv_rlir_req - Handle received Registered Link Incident Report. + * fc_lport_recv_rlir_req() - Handle received Registered Link Incident Report.   * @lport: Fibre Channel local port recieving the RLIR   * @sp: current sequence in the RLIR exchange   * @fp: RLIR request frame @@ -370,7 +370,7 @@ static void fc_lport_recv_rlir_req(struct fc_seq *sp, struct fc_frame *fp,  }  /** - * fc_lport_recv_echo_req - Handle received ECHO request + * fc_lport_recv_echo_req() - Handle received ECHO request   * @lport: Fibre Channel local port recieving the ECHO   * @sp: current sequence in the ECHO exchange   * @fp: ECHO request frame @@ -412,7 +412,7 @@ static void fc_lport_recv_echo_req(struct fc_seq *sp, struct fc_frame *in_fp,  }  /** - * fc_lport_recv_echo_req - Handle received Request Node ID data request + * fc_lport_recv_echo_req() - Handle received Request Node ID data request   * @lport: Fibre Channel local port recieving the RNID   * @sp: current sequence in the RNID exchange   * @fp: RNID request frame @@ -479,7 +479,7 @@ static void fc_lport_recv_rnid_req(struct fc_seq *sp, struct fc_frame *in_fp,  }  /** - * fc_lport_recv_adisc_req - Handle received Address Discovery Request + * fc_lport_recv_adisc_req() - Handle received Address Discovery Request   * @lport: Fibre Channel local port recieving the ADISC   * @sp: current sequence in the ADISC exchange   * @fp: ADISC request frame @@ -529,7 +529,7 @@ static void fc_lport_recv_adisc_req(struct fc_seq *sp, struct fc_frame *in_fp,  }  /** - * fc_lport_recv_logo_req - Handle received fabric LOGO request + * fc_lport_recv_logo_req() - Handle received fabric LOGO request   * @lport: Fibre Channel local port recieving the LOGO   * @sp: current sequence in the LOGO exchange   * @fp: LOGO request frame @@ -546,7 +546,7 @@ static void fc_lport_recv_logo_req(struct fc_seq *sp, struct fc_frame *fp,  }  /** - * fc_fabric_login - Start the lport state machine + * fc_fabric_login() - Start the lport state machine   * @lport: The lport that should log into the fabric   *   * Locking Note: This function should not be called @@ -568,7 +568,7 @@ int fc_fabric_login(struct fc_lport *lport)  EXPORT_SYMBOL(fc_fabric_login);  /** - * fc_linkup - Handler for transport linkup events + * fc_linkup() - Handler for transport linkup events   * @lport: The lport whose link is up   */  void fc_linkup(struct fc_lport *lport) @@ -577,8 +577,8 @@ void fc_linkup(struct fc_lport *lport)  		       fc_host_port_id(lport->host));  	mutex_lock(&lport->lp_mutex); -	if ((lport->link_status & FC_LINK_UP) != FC_LINK_UP) { -		lport->link_status |= FC_LINK_UP; +	if (!lport->link_up) { +		lport->link_up = 1;  		if (lport->state == LPORT_ST_RESET)  			fc_lport_enter_flogi(lport); @@ -588,7 +588,7 @@ void fc_linkup(struct fc_lport *lport)  EXPORT_SYMBOL(fc_linkup);  /** - * fc_linkdown - Handler for transport linkdown events + * fc_linkdown() - Handler for transport linkdown events   * @lport: The lport whose link is down   */  void fc_linkdown(struct fc_lport *lport) @@ -597,8 +597,8 @@ void fc_linkdown(struct fc_lport *lport)  	FC_DEBUG_LPORT("Link is down for port (%6x)\n",  		       fc_host_port_id(lport->host)); -	if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP) { -		lport->link_status &= ~(FC_LINK_UP); +	if (lport->link_up) { +		lport->link_up = 0;  		fc_lport_enter_reset(lport);  		lport->tt.fcp_cleanup(lport);  	} @@ -607,48 +607,25 @@ void fc_linkdown(struct fc_lport *lport)  EXPORT_SYMBOL(fc_linkdown);  /** - * fc_pause - Pause the flow of frames - * @lport: The lport to be paused - */ -void fc_pause(struct fc_lport *lport) -{ -	mutex_lock(&lport->lp_mutex); -	lport->link_status |= FC_PAUSE; -	mutex_unlock(&lport->lp_mutex); -} -EXPORT_SYMBOL(fc_pause); - -/** - * fc_unpause - Unpause the flow of frames - * @lport: The lport to be unpaused - */ -void fc_unpause(struct fc_lport *lport) -{ -	mutex_lock(&lport->lp_mutex); -	lport->link_status &= ~(FC_PAUSE); -	mutex_unlock(&lport->lp_mutex); -} -EXPORT_SYMBOL(fc_unpause); - -/** - * fc_fabric_logoff - Logout of the fabric + * fc_fabric_logoff() - Logout of the fabric   * @lport:	      fc_lport pointer to logoff the fabric   *   * Return value:   *	0 for success, -1 for failure - **/ + */  int fc_fabric_logoff(struct fc_lport *lport)  {  	lport->tt.disc_stop_final(lport);  	mutex_lock(&lport->lp_mutex);  	fc_lport_enter_logo(lport);  	mutex_unlock(&lport->lp_mutex); +	cancel_delayed_work_sync(&lport->retry_work);  	return 0;  }  EXPORT_SYMBOL(fc_fabric_logoff);  /** - * fc_lport_destroy - unregister a fc_lport + * fc_lport_destroy() - unregister a fc_lport   * @lport:	      fc_lport pointer to unregister   *   * Return value: @@ -658,26 +635,25 @@ EXPORT_SYMBOL(fc_fabric_logoff);   * clean-up all the allocated memory   * and free up other system resources.   * - **/ + */  int fc_lport_destroy(struct fc_lport *lport)  {  	lport->tt.frame_send = fc_frame_drop;  	lport->tt.fcp_abort_io(lport); -	lport->tt.exch_mgr_reset(lport->emp, 0, 0); +	lport->tt.exch_mgr_reset(lport, 0, 0);  	return 0;  }  EXPORT_SYMBOL(fc_lport_destroy);  /** - * fc_set_mfs - sets up the mfs for the corresponding fc_lport + * fc_set_mfs() - sets up the mfs for the corresponding fc_lport   * @lport: fc_lport pointer to unregister   * @mfs: the new mfs for fc_lport   *   * Set mfs for the given fc_lport to the new mfs.   *   * Return: 0 for success - * - **/ + */  int fc_set_mfs(struct fc_lport *lport, u32 mfs)  {  	unsigned int old_mfs; @@ -706,7 +682,7 @@ int fc_set_mfs(struct fc_lport *lport, u32 mfs)  EXPORT_SYMBOL(fc_set_mfs);  /** - * fc_lport_disc_callback - Callback for discovery events + * fc_lport_disc_callback() - Callback for discovery events   * @lport: FC local port   * @event: The discovery event   */ @@ -731,7 +707,7 @@ void fc_lport_disc_callback(struct fc_lport *lport, enum fc_disc_event event)  }  /** - * fc_rport_enter_ready - Enter the ready state and start discovery + * fc_rport_enter_ready() - Enter the ready state and start discovery   * @lport: Fibre Channel local port that is ready   *   * Locking Note: The lport lock is expected to be held before calling @@ -748,7 +724,7 @@ static void fc_lport_enter_ready(struct fc_lport *lport)  }  /** - * fc_lport_recv_flogi_req - Receive a FLOGI request + * fc_lport_recv_flogi_req() - Receive a FLOGI request   * @sp_in: The sequence the FLOGI is on   * @rx_fp: The frame the FLOGI is in   * @lport: The lport that recieved the request @@ -838,7 +814,7 @@ out:  }  /** - * fc_lport_recv_req - The generic lport request handler + * fc_lport_recv_req() - The generic lport request handler   * @lport: The lport that received the request   * @sp: The sequence the request is on   * @fp: The frame the request is in @@ -934,7 +910,7 @@ static void fc_lport_recv_req(struct fc_lport *lport, struct fc_seq *sp,  }  /** - * fc_lport_reset - Reset an lport + * fc_lport_reset() - Reset an lport   * @lport: The lport which should be reset   *   * Locking Note: This functions should not be called with the @@ -942,6 +918,7 @@ static void fc_lport_recv_req(struct fc_lport *lport, struct fc_seq *sp,   */  int fc_lport_reset(struct fc_lport *lport)  { +	cancel_delayed_work_sync(&lport->retry_work);  	mutex_lock(&lport->lp_mutex);  	fc_lport_enter_reset(lport);  	mutex_unlock(&lport->lp_mutex); @@ -950,7 +927,7 @@ int fc_lport_reset(struct fc_lport *lport)  EXPORT_SYMBOL(fc_lport_reset);  /** - * fc_rport_enter_reset - Reset the local port + * fc_rport_enter_reset() - Reset the local port   * @lport: Fibre Channel local port to be reset   *   * Locking Note: The lport lock is expected to be held before calling @@ -973,16 +950,16 @@ static void fc_lport_enter_reset(struct fc_lport *lport)  	lport->tt.disc_stop(lport); -	lport->tt.exch_mgr_reset(lport->emp, 0, 0); +	lport->tt.exch_mgr_reset(lport, 0, 0);  	fc_host_fabric_name(lport->host) = 0;  	fc_host_port_id(lport->host) = 0; -	if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP) +	if (lport->link_up)  		fc_lport_enter_flogi(lport);  }  /** - * fc_lport_error - Handler for any errors + * fc_lport_error() - Handler for any errors   * @lport: The fc_lport object   * @fp: The frame pointer   * @@ -1029,8 +1006,8 @@ static void fc_lport_error(struct fc_lport *lport, struct fc_frame *fp)  }  /** - * fc_lport_rft_id_resp - Handle response to Register Fibre - *			  Channel Types by ID (RPN_ID) request + * fc_lport_rft_id_resp() - Handle response to Register Fibre + *			    Channel Types by ID (RPN_ID) request   * @sp: current sequence in RPN_ID exchange   * @fp: response frame   * @lp_arg: Fibre Channel host port instance @@ -1053,17 +1030,17 @@ static void fc_lport_rft_id_resp(struct fc_seq *sp, struct fc_frame *fp,  	FC_DEBUG_LPORT("Received a RFT_ID response\n"); +	if (IS_ERR(fp)) { +		fc_lport_error(lport, fp); +		goto err; +	} +  	if (lport->state != LPORT_ST_RFT_ID) {  		FC_DBG("Received a RFT_ID response, but in state %s\n",  		       fc_lport_state(lport));  		goto out;  	} -	if (IS_ERR(fp)) { -		fc_lport_error(lport, fp); -		goto err; -	} -  	fh = fc_frame_header_get(fp);  	ct = fc_frame_payload_get(fp, sizeof(*ct)); @@ -1081,8 +1058,8 @@ err:  }  /** - * fc_lport_rpn_id_resp - Handle response to Register Port - *			  Name by ID (RPN_ID) request + * fc_lport_rpn_id_resp() - Handle response to Register Port + *			    Name by ID (RPN_ID) request   * @sp: current sequence in RPN_ID exchange   * @fp: response frame   * @lp_arg: Fibre Channel host port instance @@ -1105,17 +1082,17 @@ static void fc_lport_rpn_id_resp(struct fc_seq *sp, struct fc_frame *fp,  	FC_DEBUG_LPORT("Received a RPN_ID response\n"); +	if (IS_ERR(fp)) { +		fc_lport_error(lport, fp); +		goto err; +	} +  	if (lport->state != LPORT_ST_RPN_ID) {  		FC_DBG("Received a RPN_ID response, but in state %s\n",  		       fc_lport_state(lport));  		goto out;  	} -	if (IS_ERR(fp)) { -		fc_lport_error(lport, fp); -		goto err; -	} -  	fh = fc_frame_header_get(fp);  	ct = fc_frame_payload_get(fp, sizeof(*ct));  	if (fh && ct && fh->fh_type == FC_TYPE_CT && @@ -1133,7 +1110,7 @@ err:  }  /** - * fc_lport_scr_resp - Handle response to State Change Register (SCR) request + * fc_lport_scr_resp() - Handle response to State Change Register (SCR) request   * @sp: current sequence in SCR exchange   * @fp: response frame   * @lp_arg: Fibre Channel lport port instance that sent the registration request @@ -1155,17 +1132,17 @@ static void fc_lport_scr_resp(struct fc_seq *sp, struct fc_frame *fp,  	FC_DEBUG_LPORT("Received a SCR response\n"); +	if (IS_ERR(fp)) { +		fc_lport_error(lport, fp); +		goto err; +	} +  	if (lport->state != LPORT_ST_SCR) {  		FC_DBG("Received a SCR response, but in state %s\n",  		       fc_lport_state(lport));  		goto out;  	} -	if (IS_ERR(fp)) { -		fc_lport_error(lport, fp); -		goto err; -	} -  	op = fc_frame_payload_op(fp);  	if (op == ELS_LS_ACC)  		fc_lport_enter_ready(lport); @@ -1179,7 +1156,7 @@ err:  }  /** - * fc_lport_enter_scr - Send a State Change Register (SCR) request + * fc_lport_enter_scr() - Send a State Change Register (SCR) request   * @lport: Fibre Channel local port to register for state changes   *   * Locking Note: The lport lock is expected to be held before calling @@ -1206,7 +1183,7 @@ static void fc_lport_enter_scr(struct fc_lport *lport)  }  /** - * fc_lport_enter_rft_id - Register FC4-types with the name server + * fc_lport_enter_rft_id() - Register FC4-types with the name server   * @lport: Fibre Channel local port to register   *   * Locking Note: The lport lock is expected to be held before calling @@ -1248,7 +1225,7 @@ static void fc_lport_enter_rft_id(struct fc_lport *lport)  }  /** - * fc_rport_enter_rft_id - Register port name with the name server + * fc_rport_enter_rft_id() - Register port name with the name server   * @lport: Fibre Channel local port to register   *   * Locking Note: The lport lock is expected to be held before calling @@ -1281,7 +1258,7 @@ static struct fc_rport_operations fc_lport_rport_ops = {  };  /** - * fc_rport_enter_dns - Create a rport to the name server + * fc_rport_enter_dns() - Create a rport to the name server   * @lport: Fibre Channel local port requesting a rport for the name server   *   * Locking Note: The lport lock is expected to be held before calling @@ -1304,7 +1281,7 @@ static void fc_lport_enter_dns(struct fc_lport *lport)  	fc_lport_state_enter(lport, LPORT_ST_DNS); -	rport = fc_rport_rogue_create(&dp); +	rport = lport->tt.rport_create(&dp);  	if (!rport)  		goto err; @@ -1318,7 +1295,7 @@ err:  }  /** - * fc_lport_timeout - Handler for the retry_work timer. + * fc_lport_timeout() - Handler for the retry_work timer.   * @work: The work struct of the fc_lport   */  static void fc_lport_timeout(struct work_struct *work) @@ -1359,7 +1336,7 @@ static void fc_lport_timeout(struct work_struct *work)  }  /** - * fc_lport_logo_resp - Handle response to LOGO request + * fc_lport_logo_resp() - Handle response to LOGO request   * @sp: current sequence in LOGO exchange   * @fp: response frame   * @lp_arg: Fibre Channel lport port instance that sent the LOGO request @@ -1381,17 +1358,17 @@ static void fc_lport_logo_resp(struct fc_seq *sp, struct fc_frame *fp,  	FC_DEBUG_LPORT("Received a LOGO response\n"); +	if (IS_ERR(fp)) { +		fc_lport_error(lport, fp); +		goto err; +	} +  	if (lport->state != LPORT_ST_LOGO) {  		FC_DBG("Received a LOGO response, but in state %s\n",  		       fc_lport_state(lport));  		goto out;  	} -	if (IS_ERR(fp)) { -		fc_lport_error(lport, fp); -		goto err; -	} -  	op = fc_frame_payload_op(fp);  	if (op == ELS_LS_ACC)  		fc_lport_enter_reset(lport); @@ -1405,7 +1382,7 @@ err:  }  /** - * fc_rport_enter_logo - Logout of the fabric + * fc_rport_enter_logo() - Logout of the fabric   * @lport: Fibre Channel local port to be logged out   *   * Locking Note: The lport lock is expected to be held before calling @@ -1437,7 +1414,7 @@ static void fc_lport_enter_logo(struct fc_lport *lport)  }  /** - * fc_lport_flogi_resp - Handle response to FLOGI request + * fc_lport_flogi_resp() - Handle response to FLOGI request   * @sp: current sequence in FLOGI exchange   * @fp: response frame   * @lp_arg: Fibre Channel lport port instance that sent the FLOGI request @@ -1465,17 +1442,17 @@ static void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,  	FC_DEBUG_LPORT("Received a FLOGI response\n"); +	if (IS_ERR(fp)) { +		fc_lport_error(lport, fp); +		goto err; +	} +  	if (lport->state != LPORT_ST_FLOGI) {  		FC_DBG("Received a FLOGI response, but in state %s\n",  		       fc_lport_state(lport));  		goto out;  	} -	if (IS_ERR(fp)) { -		fc_lport_error(lport, fp); -		goto err; -	} -  	fh = fc_frame_header_get(fp);  	did = ntoh24(fh->fh_d_id);  	if (fc_frame_payload_op(fp) == ELS_LS_ACC && did != 0) { @@ -1532,7 +1509,7 @@ err:  }  /** - * fc_rport_enter_flogi - Send a FLOGI request to the fabric manager + * fc_rport_enter_flogi() - Send a FLOGI request to the fabric manager   * @lport: Fibre Channel local port to be logged in to the fabric   *   * Locking Note: The lport lock is expected to be held before calling diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c index e780d8caf70..dae65133a83 100644 --- a/drivers/scsi/libfc/fc_rport.c +++ b/drivers/scsi/libfc/fc_rport.c @@ -81,6 +81,7 @@ static void fc_rport_recv_logo_req(struct fc_rport *,  				   struct fc_seq *, struct fc_frame *);  static void fc_rport_timeout(struct work_struct *);  static void fc_rport_error(struct fc_rport *, struct fc_frame *); +static void fc_rport_error_retry(struct fc_rport *, struct fc_frame *);  static void fc_rport_work(struct work_struct *);  static const char *fc_rport_state_names[] = { @@ -145,7 +146,7 @@ struct fc_rport *fc_rport_rogue_create(struct fc_disc_port *dp)  }  /** - * fc_rport_state - return a string for the state the rport is in + * fc_rport_state() - return a string for the state the rport is in   * @rport: The rport whose state we want to get a string for   */  static const char *fc_rport_state(struct fc_rport *rport) @@ -160,7 +161,7 @@ static const char *fc_rport_state(struct fc_rport *rport)  }  /** - * fc_set_rport_loss_tmo - Set the remote port loss timeout in seconds. + * fc_set_rport_loss_tmo() - Set the remote port loss timeout in seconds.   * @rport: Pointer to Fibre Channel remote port structure   * @timeout: timeout in seconds   */ @@ -174,12 +175,12 @@ void fc_set_rport_loss_tmo(struct fc_rport *rport, u32 timeout)  EXPORT_SYMBOL(fc_set_rport_loss_tmo);  /** - * fc_plogi_get_maxframe - Get max payload from the common service parameters + * fc_plogi_get_maxframe() - Get max payload from the common service parameters   * @flp: FLOGI payload structure   * @maxval: upper limit, may be less than what is in the service parameters   */ -static unsigned int -fc_plogi_get_maxframe(struct fc_els_flogi *flp, unsigned int maxval) +static unsigned int fc_plogi_get_maxframe(struct fc_els_flogi *flp, +					  unsigned int maxval)  {  	unsigned int mfs; @@ -197,7 +198,7 @@ fc_plogi_get_maxframe(struct fc_els_flogi *flp, unsigned int maxval)  }  /** - * fc_rport_state_enter - Change the rport's state + * fc_rport_state_enter() - Change the rport's state   * @rport: The rport whose state should change   * @new: The new state of the rport   * @@ -214,6 +215,7 @@ static void fc_rport_state_enter(struct fc_rport *rport,  static void fc_rport_work(struct work_struct *work)  { +	u32 port_id;  	struct fc_rport_libfc_priv *rdata =  		container_of(work, struct fc_rport_libfc_priv, event_work);  	enum fc_rport_event event; @@ -279,14 +281,18 @@ static void fc_rport_work(struct work_struct *work)  			rport_ops->event_callback(lport, rport, event);  		if (trans_state == FC_PORTSTATE_ROGUE)  			put_device(&rport->dev); -		else +		else { +			port_id = rport->port_id;  			fc_remote_port_delete(rport); +			lport->tt.exch_mgr_reset(lport, 0, port_id); +			lport->tt.exch_mgr_reset(lport, port_id, 0); +		}  	} else  		mutex_unlock(&rdata->rp_mutex);  }  /** - * fc_rport_login - Start the remote port login state machine + * fc_rport_login() - Start the remote port login state machine   * @rport: Fibre Channel remote port   *   * Locking Note: Called without the rport lock held. This @@ -309,7 +315,7 @@ int fc_rport_login(struct fc_rport *rport)  }  /** - * fc_rport_logoff - Logoff and remove an rport + * fc_rport_logoff() - Logoff and remove an rport   * @rport: Fibre Channel remote port to be removed   *   * Locking Note: Called without the rport lock held. This @@ -347,7 +353,7 @@ int fc_rport_logoff(struct fc_rport *rport)  }  /** - * fc_rport_enter_ready - The rport is ready + * fc_rport_enter_ready() - The rport is ready   * @rport: Fibre Channel remote port that is ready   *   * Locking Note: The rport lock is expected to be held before calling @@ -366,7 +372,7 @@ static void fc_rport_enter_ready(struct fc_rport *rport)  }  /** - * fc_rport_timeout - Handler for the retry_work timer. + * fc_rport_timeout() - Handler for the retry_work timer.   * @work: The work struct of the fc_rport_libfc_priv   *   * Locking Note: Called without the rport lock held. This @@ -405,59 +411,75 @@ static void fc_rport_timeout(struct work_struct *work)  }  /** - * fc_rport_error - Handler for any errors + * fc_rport_error() - Error handler, called once retries have been exhausted   * @rport: The fc_rport object   * @fp: The frame pointer   * - * If the error was caused by a resource allocation failure - * then wait for half a second and retry, otherwise retry - * immediately. - *   * Locking Note: The rport lock is expected to be held before   * calling this routine   */  static void fc_rport_error(struct fc_rport *rport, struct fc_frame *fp)  {  	struct fc_rport_libfc_priv *rdata = rport->dd_data; -	unsigned long delay = 0;  	FC_DEBUG_RPORT("Error %ld in state %s, retries %d\n",  		       PTR_ERR(fp), fc_rport_state(rport), rdata->retries); -	if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) { -		/* -		 * Memory allocation failure, or the exchange timed out. -		 *  Retry after delay -		 */ -		if (rdata->retries < rdata->local_port->max_retry_count) { -			rdata->retries++; -			if (!fp) -				delay = msecs_to_jiffies(500); -			get_device(&rport->dev); -			schedule_delayed_work(&rdata->retry_work, delay); -		} else { -			switch (rdata->rp_state) { -			case RPORT_ST_PLOGI: -			case RPORT_ST_PRLI: -			case RPORT_ST_LOGO: -				rdata->event = RPORT_EV_FAILED; -				queue_work(rport_event_queue, -					   &rdata->event_work); -				break; -			case RPORT_ST_RTV: -				fc_rport_enter_ready(rport); -				break; -			case RPORT_ST_NONE: -			case RPORT_ST_READY: -			case RPORT_ST_INIT: -				break; -			} -		} +	switch (rdata->rp_state) { +	case RPORT_ST_PLOGI: +	case RPORT_ST_PRLI: +	case RPORT_ST_LOGO: +		rdata->event = RPORT_EV_FAILED; +		queue_work(rport_event_queue, +			   &rdata->event_work); +		break; +	case RPORT_ST_RTV: +		fc_rport_enter_ready(rport); +		break; +	case RPORT_ST_NONE: +	case RPORT_ST_READY: +	case RPORT_ST_INIT: +		break; +	} +} + +/** + * fc_rport_error_retry() - Error handler when retries are desired + * @rport: The fc_rport object + * @fp: The frame pointer + * + * If the error was an exchange timeout retry immediately, + * otherwise wait for E_D_TOV. + * + * Locking Note: The rport lock is expected to be held before + * calling this routine + */ +static void fc_rport_error_retry(struct fc_rport *rport, struct fc_frame *fp) +{ +	struct fc_rport_libfc_priv *rdata = rport->dd_data; +	unsigned long delay = FC_DEF_E_D_TOV; + +	/* make sure this isn't an FC_EX_CLOSED error, never retry those */ +	if (PTR_ERR(fp) == -FC_EX_CLOSED) +		return fc_rport_error(rport, fp); + +	if (rdata->retries < rdata->local_port->max_retry_count) { +		FC_DEBUG_RPORT("Error %ld in state %s, retrying\n", +			       PTR_ERR(fp), fc_rport_state(rport)); +		rdata->retries++; +		/* no additional delay on exchange timeouts */ +		if (PTR_ERR(fp) == -FC_EX_TIMEOUT) +			delay = 0; +		get_device(&rport->dev); +		schedule_delayed_work(&rdata->retry_work, delay); +		return;  	} + +	return fc_rport_error(rport, fp);  }  /** - * fc_rport_plogi_recv_resp - Handle incoming ELS PLOGI response + * fc_rport_plogi_recv_resp() - Handle incoming ELS PLOGI response   * @sp: current sequence in the PLOGI exchange   * @fp: response frame   * @rp_arg: Fibre Channel remote port @@ -483,17 +505,17 @@ static void fc_rport_plogi_resp(struct fc_seq *sp, struct fc_frame *fp,  	FC_DEBUG_RPORT("Received a PLOGI response from port (%6x)\n",  		       rport->port_id); +	if (IS_ERR(fp)) { +		fc_rport_error_retry(rport, fp); +		goto err; +	} +  	if (rdata->rp_state != RPORT_ST_PLOGI) {  		FC_DBG("Received a PLOGI response, but in state %s\n",  		       fc_rport_state(rport));  		goto out;  	} -	if (IS_ERR(fp)) { -		fc_rport_error(rport, fp); -		goto err; -	} -  	op = fc_frame_payload_op(fp);  	if (op == ELS_LS_ACC &&  	    (plp = fc_frame_payload_get(fp, sizeof(*plp))) != NULL) { @@ -522,7 +544,7 @@ static void fc_rport_plogi_resp(struct fc_seq *sp, struct fc_frame *fp,  		else  			fc_rport_enter_prli(rport);  	} else -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  out:  	fc_frame_free(fp); @@ -532,7 +554,7 @@ err:  }  /** - * fc_rport_enter_plogi - Send Port Login (PLOGI) request to peer + * fc_rport_enter_plogi() - Send Port Login (PLOGI) request to peer   * @rport: Fibre Channel remote port to send PLOGI to   *   * Locking Note: The rport lock is expected to be held before calling @@ -552,20 +574,20 @@ static void fc_rport_enter_plogi(struct fc_rport *rport)  	rport->maxframe_size = FC_MIN_MAX_PAYLOAD;  	fp = fc_frame_alloc(lport, sizeof(struct fc_els_flogi));  	if (!fp) { -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  		return;  	}  	rdata->e_d_tov = lport->e_d_tov;  	if (!lport->tt.elsct_send(lport, rport, fp, ELS_PLOGI,  				  fc_rport_plogi_resp, rport, lport->e_d_tov)) -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  	else  		get_device(&rport->dev);  }  /** - * fc_rport_prli_resp - Process Login (PRLI) response handler + * fc_rport_prli_resp() - Process Login (PRLI) response handler   * @sp: current sequence in the PRLI exchange   * @fp: response frame   * @rp_arg: Fibre Channel remote port @@ -592,17 +614,17 @@ static void fc_rport_prli_resp(struct fc_seq *sp, struct fc_frame *fp,  	FC_DEBUG_RPORT("Received a PRLI response from port (%6x)\n",  		       rport->port_id); +	if (IS_ERR(fp)) { +		fc_rport_error_retry(rport, fp); +		goto err; +	} +  	if (rdata->rp_state != RPORT_ST_PRLI) {  		FC_DBG("Received a PRLI response, but in state %s\n",  		       fc_rport_state(rport));  		goto out;  	} -	if (IS_ERR(fp)) { -		fc_rport_error(rport, fp); -		goto err; -	} -  	op = fc_frame_payload_op(fp);  	if (op == ELS_LS_ACC) {  		pp = fc_frame_payload_get(fp, sizeof(*pp)); @@ -635,7 +657,7 @@ err:  }  /** - * fc_rport_logo_resp - Logout (LOGO) response handler + * fc_rport_logo_resp() - Logout (LOGO) response handler   * @sp: current sequence in the LOGO exchange   * @fp: response frame   * @rp_arg: Fibre Channel remote port @@ -657,7 +679,7 @@ static void fc_rport_logo_resp(struct fc_seq *sp, struct fc_frame *fp,  		       rport->port_id);  	if (IS_ERR(fp)) { -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  		goto err;  	} @@ -684,7 +706,7 @@ err:  }  /** - * fc_rport_enter_prli - Send Process Login (PRLI) request to peer + * fc_rport_enter_prli() - Send Process Login (PRLI) request to peer   * @rport: Fibre Channel remote port to send PRLI to   *   * Locking Note: The rport lock is expected to be held before calling @@ -707,19 +729,19 @@ static void fc_rport_enter_prli(struct fc_rport *rport)  	fp = fc_frame_alloc(lport, sizeof(*pp));  	if (!fp) { -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  		return;  	}  	if (!lport->tt.elsct_send(lport, rport, fp, ELS_PRLI,  				  fc_rport_prli_resp, rport, lport->e_d_tov)) -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  	else  		get_device(&rport->dev);  }  /** - * fc_rport_els_rtv_resp - Request Timeout Value response handler + * fc_rport_els_rtv_resp() - Request Timeout Value response handler   * @sp: current sequence in the RTV exchange   * @fp: response frame   * @rp_arg: Fibre Channel remote port @@ -742,17 +764,17 @@ static void fc_rport_rtv_resp(struct fc_seq *sp, struct fc_frame *fp,  	FC_DEBUG_RPORT("Received a RTV response from port (%6x)\n",  		       rport->port_id); +	if (IS_ERR(fp)) { +		fc_rport_error(rport, fp); +		goto err; +	} +  	if (rdata->rp_state != RPORT_ST_RTV) {  		FC_DBG("Received a RTV response, but in state %s\n",  		       fc_rport_state(rport));  		goto out;  	} -	if (IS_ERR(fp)) { -		fc_rport_error(rport, fp); -		goto err; -	} -  	op = fc_frame_payload_op(fp);  	if (op == ELS_LS_ACC) {  		struct fc_els_rtv_acc *rtv; @@ -785,7 +807,7 @@ err:  }  /** - * fc_rport_enter_rtv - Send Request Timeout Value (RTV) request to peer + * fc_rport_enter_rtv() - Send Request Timeout Value (RTV) request to peer   * @rport: Fibre Channel remote port to send RTV to   *   * Locking Note: The rport lock is expected to be held before calling @@ -804,19 +826,19 @@ static void fc_rport_enter_rtv(struct fc_rport *rport)  	fp = fc_frame_alloc(lport, sizeof(struct fc_els_rtv));  	if (!fp) { -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  		return;  	}  	if (!lport->tt.elsct_send(lport, rport, fp, ELS_RTV,  				     fc_rport_rtv_resp, rport, lport->e_d_tov)) -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  	else  		get_device(&rport->dev);  }  /** - * fc_rport_enter_logo - Send Logout (LOGO) request to peer + * fc_rport_enter_logo() - Send Logout (LOGO) request to peer   * @rport: Fibre Channel remote port to send LOGO to   *   * Locking Note: The rport lock is expected to be held before calling @@ -835,20 +857,20 @@ static void fc_rport_enter_logo(struct fc_rport *rport)  	fp = fc_frame_alloc(lport, sizeof(struct fc_els_logo));  	if (!fp) { -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  		return;  	}  	if (!lport->tt.elsct_send(lport, rport, fp, ELS_LOGO,  				  fc_rport_logo_resp, rport, lport->e_d_tov)) -		fc_rport_error(rport, fp); +		fc_rport_error_retry(rport, fp);  	else  		get_device(&rport->dev);  }  /** - * fc_rport_recv_req - Receive a request from a rport + * fc_rport_recv_req() - Receive a request from a rport   * @sp: current sequence in the PLOGI exchange   * @fp: response frame   * @rp_arg: Fibre Channel remote port @@ -909,7 +931,7 @@ void fc_rport_recv_req(struct fc_seq *sp, struct fc_frame *fp,  }  /** - * fc_rport_recv_plogi_req - Handle incoming Port Login (PLOGI) request + * fc_rport_recv_plogi_req() - Handle incoming Port Login (PLOGI) request   * @rport: Fibre Channel remote port that initiated PLOGI   * @sp: current sequence in the PLOGI exchange   * @fp: PLOGI request frame @@ -1031,7 +1053,7 @@ static void fc_rport_recv_plogi_req(struct fc_rport *rport,  }  /** - * fc_rport_recv_prli_req - Handle incoming Process Login (PRLI) request + * fc_rport_recv_prli_req() - Handle incoming Process Login (PRLI) request   * @rport: Fibre Channel remote port that initiated PRLI   * @sp: current sequence in the PRLI exchange   * @fp: PRLI request frame @@ -1182,7 +1204,7 @@ static void fc_rport_recv_prli_req(struct fc_rport *rport,  }  /** - * fc_rport_recv_prlo_req - Handle incoming Process Logout (PRLO) request + * fc_rport_recv_prlo_req() - Handle incoming Process Logout (PRLO) request   * @rport: Fibre Channel remote port that initiated PRLO   * @sp: current sequence in the PRLO exchange   * @fp: PRLO request frame @@ -1213,7 +1235,7 @@ static void fc_rport_recv_prlo_req(struct fc_rport *rport, struct fc_seq *sp,  }  /** - * fc_rport_recv_logo_req - Handle incoming Logout (LOGO) request + * fc_rport_recv_logo_req() - Handle incoming Logout (LOGO) request   * @rport: Fibre Channel remote port that initiated LOGO   * @sp: current sequence in the LOGO exchange   * @fp: LOGO request frame @@ -1249,6 +1271,9 @@ static void fc_rport_flush_queue(void)  int fc_rport_init(struct fc_lport *lport)  { +	if (!lport->tt.rport_create) +		lport->tt.rport_create = fc_rport_rogue_create; +  	if (!lport->tt.rport_login)  		lport->tt.rport_login = fc_rport_login; @@ -1285,7 +1310,7 @@ void fc_rport_terminate_io(struct fc_rport *rport)  	struct fc_rport_libfc_priv *rdata = rport->dd_data;  	struct fc_lport *lport = rdata->local_port; -	lport->tt.exch_mgr_reset(lport->emp, 0, rport->port_id); -	lport->tt.exch_mgr_reset(lport->emp, rport->port_id, 0); +	lport->tt.exch_mgr_reset(lport, 0, rport->port_id); +	lport->tt.exch_mgr_reset(lport, rport->port_id, 0);  }  EXPORT_SYMBOL(fc_rport_terminate_io); diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index f4c57227ec1..ee9d4015243 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -244,12 +244,6 @@ qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj,  		if (ha->optrom_state != QLA_SWAITING)  			break; -		if (start & 0xfff) { -			qla_printk(KERN_WARNING, ha, -			    "Invalid start region 0x%x/0x%x.\n", start, size); -			return -EINVAL; -		} -  		ha->optrom_region_start = start;  		ha->optrom_region_size = start + size > ha->optrom_size ?  		    ha->optrom_size - start : size; @@ -303,8 +297,7 @@ qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj,  		else if (start == (ha->flt_region_boot * 4) ||  		    start == (ha->flt_region_fw * 4))  			valid = 1; -		else if ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && -		    start == (ha->flt_region_vpd_nvram * 4)) +		else if (IS_QLA25XX(ha) || IS_QLA81XX(ha))  		    valid = 1;  		if (!valid) {  			qla_printk(KERN_WARNING, ha, diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 986501759ad..87f9abc7146 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -1308,8 +1308,12 @@ qla2x00_init_rings(scsi_qla_host_t *vha)  	DEBUG(printk("scsi(%ld): Issue init firmware.\n", vha->host_no)); -	if (ha->flags.npiv_supported) +	if (ha->flags.npiv_supported) { +		if (ha->operating_mode == LOOP) +			ha->max_npiv_vports = MIN_MULTI_ID_FABRIC - 1;  		mid_init_cb->count = cpu_to_le16(ha->max_npiv_vports); +	} +  	mid_init_cb->options = __constant_cpu_to_le16(BIT_1); @@ -2610,6 +2614,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,  	port_id_t	wrap, nxt_d_id;  	struct qla_hw_data *ha = vha->hw;  	struct scsi_qla_host *vp, *base_vha = pci_get_drvdata(ha->pdev); +	struct scsi_qla_host *tvp;  	rval = QLA_SUCCESS; @@ -2709,7 +2714,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,  		/* Bypass virtual ports of the same host. */  		found = 0;  		if (ha->num_vhosts) { -			list_for_each_entry(vp, &ha->vp_list, list) { +			list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {  				if (new_fcport->d_id.b24 == vp->d_id.b24) {  					found = 1;  					break; @@ -2832,6 +2837,7 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev)  	uint16_t first_loop_id;  	struct qla_hw_data *ha = vha->hw;  	struct scsi_qla_host *vp; +	struct scsi_qla_host *tvp;  	rval = QLA_SUCCESS; @@ -2856,7 +2862,7 @@ qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev)  		/* Check for loop ID being already in use. */  		found = 0;  		fcport = NULL; -		list_for_each_entry(vp, &ha->vp_list, list) { +		list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {  			list_for_each_entry(fcport, &vp->vp_fcports, list) {  				if (fcport->loop_id == dev->loop_id &&  								fcport != dev) { @@ -3291,6 +3297,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)  	uint8_t        status = 0;  	struct qla_hw_data *ha = vha->hw;  	struct scsi_qla_host *vp; +	struct scsi_qla_host *tvp;  	struct req_que *req = ha->req_q_map[0];  	if (vha->flags.online) { @@ -3306,7 +3313,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)  		if (atomic_read(&vha->loop_state) != LOOP_DOWN) {  			atomic_set(&vha->loop_state, LOOP_DOWN);  			qla2x00_mark_all_devices_lost(vha, 0); -			list_for_each_entry(vp, &ha->vp_list, list) +			list_for_each_entry_safe(vp, tvp, &ha->vp_list, list)  			       qla2x00_mark_all_devices_lost(vp, 0);  		} else {  			if (!atomic_read(&vha->loop_down_timer)) @@ -3403,7 +3410,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)  		DEBUG(printk(KERN_INFO  				"qla2x00_abort_isp(%ld): succeeded.\n",  				vha->host_no)); -		list_for_each_entry(vp, &ha->vp_list, list) { +		list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {  			if (vp->vp_idx)  				qla2x00_vp_abort_isp(vp);  		} @@ -3428,7 +3435,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)  static int  qla2x00_restart_isp(scsi_qla_host_t *vha)  { -	uint8_t		status = 0; +	int status = 0;  	uint32_t wait_time;  	struct qla_hw_data *ha = vha->hw;  	struct req_que *req = ha->req_q_map[0]; diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 4c7504cb399..4aab7acf752 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c @@ -2685,6 +2685,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,  	uint16_t stat = le16_to_cpu(rptid_entry->vp_idx);  	struct qla_hw_data *ha = vha->hw;  	scsi_qla_host_t *vp; +	scsi_qla_host_t *tvp;  	if (rptid_entry->entry_status != 0)  		return; @@ -2710,7 +2711,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,  		if (MSB(stat) == 1)  			return; -		list_for_each_entry(vp, &ha->vp_list, list) +		list_for_each_entry_safe(vp, tvp, &ha->vp_list, list)  			if (vp_idx == vp->vp_idx)  				break;  		if (!vp) diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index 3f23932210c..785c61279e6 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c @@ -69,9 +69,10 @@ static scsi_qla_host_t *  qla24xx_find_vhost_by_name(struct qla_hw_data *ha, uint8_t *port_name)  {  	scsi_qla_host_t *vha; +	struct scsi_qla_host *tvha;  	/* Locate matching device in database. */ -	list_for_each_entry(vha, &ha->vp_list, list) { +	list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) {  		if (!memcmp(port_name, vha->port_name, WWN_SIZE))  			return vha;  	} @@ -194,11 +195,11 @@ qla24xx_configure_vp(scsi_qla_host_t *vha)  void  qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb)  { -	scsi_qla_host_t *vha; +	scsi_qla_host_t *vha, *tvha;  	struct qla_hw_data *ha = rsp->hw;  	int i = 0; -	list_for_each_entry(vha, &ha->vp_list, list) { +	list_for_each_entry_safe(vha, tvha, &ha->vp_list, list) {  		if (vha->vp_idx) {  			switch (mb[0]) {  			case MBA_LIP_OCCURRED: @@ -300,6 +301,7 @@ qla2x00_do_dpc_all_vps(scsi_qla_host_t *vha)  	int ret;  	struct qla_hw_data *ha = vha->hw;  	scsi_qla_host_t *vp; +	struct scsi_qla_host *tvp;  	if (vha->vp_idx)  		return; @@ -308,7 +310,7 @@ qla2x00_do_dpc_all_vps(scsi_qla_host_t *vha)  	clear_bit(VP_DPC_NEEDED, &vha->dpc_flags); -	list_for_each_entry(vp, &ha->vp_list, list) { +	list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {  		if (vp->vp_idx)  			ret = qla2x00_do_dpc_vp(vp);  	} diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 2f5f72531e2..3ddfa889e94 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -2222,10 +2222,6 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,  {  	char	name[16]; -	ha->init_cb_size = sizeof(init_cb_t); -	if (IS_QLA2XXX_MIDTYPE(ha)) -		ha->init_cb_size = sizeof(struct mid_init_cb_24xx); -  	ha->init_cb = dma_alloc_coherent(&ha->pdev->dev, ha->init_cb_size,  		&ha->init_cb_dma, GFP_KERNEL);  	if (!ha->init_cb) @@ -2568,7 +2564,7 @@ qla2x00_do_work(struct scsi_qla_host *vha)  void qla2x00_relogin(struct scsi_qla_host *vha)  {  	fc_port_t       *fcport; -	uint8_t         status; +	int status;  	uint16_t        next_loopid = 0;  	struct qla_hw_data *ha = vha->hw; diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index 79f7053da99..a772eab2f0e 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h @@ -7,7 +7,7 @@  /*   * Driver version   */ -#define QLA2XXX_VERSION      "8.03.00-k3" +#define QLA2XXX_VERSION      "8.03.00-k4"  #define QLA_DRIVER_MAJOR_VER	8  #define QLA_DRIVER_MINOR_VER	3 diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 55310dbc10a..4970ae4a62d 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1167,23 +1167,19 @@ sd_spinup_disk(struct scsi_disk *sdkp)  		/*  		 * The device does not want the automatic start to be issued.  		 */ -		if (sdkp->device->no_start_on_add) { +		if (sdkp->device->no_start_on_add)  			break; -		} - -		/* -		 * If manual intervention is required, or this is an -		 * absent USB storage device, a spinup is meaningless. -		 */ -		if (sense_valid && -		    sshdr.sense_key == NOT_READY && -		    sshdr.asc == 4 && sshdr.ascq == 3) { -			break;		/* manual intervention required */ -		/* -		 * Issue command to spin up drive when not ready -		 */ -		} else if (sense_valid && sshdr.sense_key == NOT_READY) { +		if (sense_valid && sshdr.sense_key == NOT_READY) { +			if (sshdr.asc == 4 && sshdr.ascq == 3) +				break;	/* manual intervention required */ +			if (sshdr.asc == 4 && sshdr.ascq == 0xb) +				break;	/* standby */ +			if (sshdr.asc == 4 && sshdr.ascq == 0xc) +				break;	/* unavailable */ +			/* +			 * Issue command to spin up drive when not ready +			 */  			if (!spintime) {  				sd_printk(KERN_NOTICE, sdkp, "Spinning up disk...");  				cmd[0] = START_STOP; diff --git a/drivers/scsi/zalon.c b/drivers/scsi/zalon.c index a8d61a62522..97f3158fa7b 100644 --- a/drivers/scsi/zalon.c +++ b/drivers/scsi/zalon.c @@ -137,7 +137,7 @@ zalon_probe(struct parisc_device *dev)  		goto fail;  	if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) { -	  dev_printk(KERN_ERR, dev, "irq problem with %d, detaching\n ", +	  dev_printk(KERN_ERR, &dev->dev, "irq problem with %d, detaching\n ",  		     dev->irq);  		goto fail;  	} diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index ce6badded47..211af86a6c5 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -73,8 +73,6 @@ source "drivers/staging/rt2860/Kconfig"  source "drivers/staging/rt2870/Kconfig" -source "drivers/staging/benet/Kconfig" -  source "drivers/staging/comedi/Kconfig"  source "drivers/staging/asus_oled/Kconfig" diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 9ddcc2bb336..47a56f5ffab 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -19,7 +19,6 @@ obj-$(CONFIG_AGNX)		+= agnx/  obj-$(CONFIG_OTUS)		+= otus/  obj-$(CONFIG_RT2860)		+= rt2860/  obj-$(CONFIG_RT2870)		+= rt2870/ -obj-$(CONFIG_BENET)		+= benet/  obj-$(CONFIG_COMEDI)		+= comedi/  obj-$(CONFIG_ASUS_OLED)		+= asus_oled/  obj-$(CONFIG_PANEL)		+= panel/ diff --git a/drivers/staging/benet/Kconfig b/drivers/staging/benet/Kconfig deleted file mode 100644 index f6806074f99..00000000000 --- a/drivers/staging/benet/Kconfig +++ /dev/null @@ -1,7 +0,0 @@ -config BENET -	tristate "ServerEngines 10Gb NIC - BladeEngine" -	depends on PCI && INET -	select INET_LRO -	help -	  This driver implements the NIC functionality for ServerEngines -	  10Gb network adapter BladeEngine (EC 3210). diff --git a/drivers/staging/benet/MAINTAINERS b/drivers/staging/benet/MAINTAINERS deleted file mode 100644 index d5ce340218b..00000000000 --- a/drivers/staging/benet/MAINTAINERS +++ /dev/null @@ -1,6 +0,0 @@ -SERVER ENGINES 10Gbe NIC - BLADE-ENGINE -P:	Subbu Seetharaman -M:	subbus@serverengines.com -L:	netdev@vger.kernel.org -W:	http://www.serverengines.com -S:	Supported diff --git a/drivers/staging/benet/Makefile b/drivers/staging/benet/Makefile deleted file mode 100644 index 460b923b99b..00000000000 --- a/drivers/staging/benet/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# -# Makefile to build the network driver for ServerEngine's BladeEngine -# -obj-$(CONFIG_BENET) += benet.o - -benet-y :=  be_init.o \ -			be_int.o \ -			be_netif.o \ -			be_ethtool.o \ -			funcobj.o \ -			cq.o \ -			eq.o \ -			mpu.o \ -			eth.o diff --git a/drivers/staging/benet/TODO b/drivers/staging/benet/TODO deleted file mode 100644 index a51dfb59a62..00000000000 --- a/drivers/staging/benet/TODO +++ /dev/null @@ -1,6 +0,0 @@ -TODO: -	- remove wrappers around common iowrite functions -	- full netdev audit of common problems/issues - -Please send all patches and questions to Subbu Seetharaman -<subbus@serverengines.com> and Greg Kroah-Hartman <greg@kroah.com> diff --git a/drivers/staging/benet/asyncmesg.h b/drivers/staging/benet/asyncmesg.h deleted file mode 100644 index d1e779adb84..00000000000 --- a/drivers/staging/benet/asyncmesg.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __asyncmesg_amap_h__ -#define __asyncmesg_amap_h__ -#include "fwcmd_common.h" - -/* --- ASYNC_EVENT_CODES --- */ -#define ASYNC_EVENT_CODE_LINK_STATE     (1) -#define ASYNC_EVENT_CODE_ISCSI          (2) - -/* --- ASYNC_LINK_STATES --- */ -#define ASYNC_EVENT_LINK_DOWN           (0)	/* Link Down on a port */ -#define ASYNC_EVENT_LINK_UP             (1)	/* Link Up on a port */ - -/* - * The last 4 bytes of the async events have this common format.  It allows - * the driver to distinguish [link]MCC_CQ_ENTRY[/link] structs from - * asynchronous events.  Both arrive on the same completion queue.  This - * structure also contains the common fields used to decode the async event. - */ -struct BE_ASYNC_EVENT_TRAILER_AMAP { -	u8 rsvd0[8];	/* DWORD 0 */ -	u8 event_code[8];	/* DWORD 0 */ -	u8 event_type[8];	/* DWORD 0 */ -	u8 rsvd1[6];	/* DWORD 0 */ -	u8 async_event;	/* DWORD 0 */ -	u8 valid;		/* DWORD 0 */ -} __packed; -struct ASYNC_EVENT_TRAILER_AMAP { -	u32 dw[1]; -}; - -/* - * Applicable in Initiator, Target and NIC modes. - * A link state async event is seen by all device drivers as soon they - * create an MCC ring. Thereafter, anytime the link status changes the - * drivers will receive a link state async event. Notifications continue to - * be sent until a driver destroys its MCC ring. A link down event is - * reported when either port loses link. A link up event is reported - * when either port regains link. When BE's failover mechanism is enabled, a - * link down on the active port causes traffic to be diverted to the standby - * port by the BE's ARM firmware (assuming the standby port has link). In - * this case, the standy port assumes the active status. Note: when link is - * restored on the failed port, traffic continues on the currently active - * port. The ARM firmware does not attempt to 'fail back' traffic to - * the restored port. - */ -struct BE_ASYNC_EVENT_LINK_STATE_AMAP { -	u8 port0_link_status[8]; -	u8 port1_link_status[8]; -	u8 active_port[8]; -	u8 rsvd0[8];	/* DWORD 0 */ -	u8 port0_duplex[8]; -	u8 port0_speed[8]; -	u8 port1_duplex[8]; -	u8 port1_speed[8]; -	u8 port0_fault[8]; -	u8 port1_fault[8]; -	u8 rsvd1[2][8];	/* DWORD 2 */ -	struct BE_ASYNC_EVENT_TRAILER_AMAP trailer; -} __packed; -struct ASYNC_EVENT_LINK_STATE_AMAP { -	u32 dw[4]; -}; -#endif /* __asyncmesg_amap_h__ */ diff --git a/drivers/staging/benet/be_cm.h b/drivers/staging/benet/be_cm.h deleted file mode 100644 index b7a1dfd20c3..00000000000 --- a/drivers/staging/benet/be_cm.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __be_cm_amap_h__ -#define __be_cm_amap_h__ -#include "be_common.h" -#include "etx_context.h" -#include "mpu_context.h" - -/* - * --- CEV_WATERMARK_ENUM --- - * CQ/EQ Watermark Encodings. Encoded as number of free entries in - * Queue when Watermark is reached. - */ -#define CEV_WMARK_0        (0)	/* Watermark when Queue full */ -#define CEV_WMARK_16       (1)	/* Watermark at 16 free entries */ -#define CEV_WMARK_32       (2)	/* Watermark at 32 free entries */ -#define CEV_WMARK_48       (3)	/* Watermark at 48 free entries */ -#define CEV_WMARK_64       (4)	/* Watermark at 64 free entries */ -#define CEV_WMARK_80       (5)	/* Watermark at 80 free entries */ -#define CEV_WMARK_96       (6)	/* Watermark at 96 free entries */ -#define CEV_WMARK_112      (7)	/* Watermark at 112 free entries */ -#define CEV_WMARK_128      (8)	/* Watermark at 128 free entries */ -#define CEV_WMARK_144      (9)	/* Watermark at 144 free entries */ -#define CEV_WMARK_160      (10)	/* Watermark at 160 free entries */ -#define CEV_WMARK_176      (11)	/* Watermark at 176 free entries */ -#define CEV_WMARK_192      (12)	/* Watermark at 192 free entries */ -#define CEV_WMARK_208      (13)	/* Watermark at 208 free entries */ -#define CEV_WMARK_224      (14)	/* Watermark at 224 free entries */ -#define CEV_WMARK_240      (15)	/* Watermark at 240 free entries */ - -/* - * --- CQ_CNT_ENUM --- - * Completion Queue Count Encodings. - */ -#define CEV_CQ_CNT_256                  (0)	/* CQ has 256 entries */ -#define CEV_CQ_CNT_512                  (1)	/* CQ has 512 entries */ -#define CEV_CQ_CNT_1024                 (2)	/* CQ has 1024 entries */ - -/* - * --- EQ_CNT_ENUM --- - * Event Queue Count Encodings. - */ -#define CEV_EQ_CNT_256     (0)	/* EQ has 256 entries (16-byte EQEs only) */ -#define CEV_EQ_CNT_512     (1)	/* EQ has 512 entries (16-byte EQEs only) */ -#define CEV_EQ_CNT_1024    (2)	/* EQ has 1024 entries (4-byte or */ -				/* 16-byte EQEs only) */ -#define CEV_EQ_CNT_2048    (3)	/* EQ has 2048 entries (4-byte or */ -				/* 16-byte EQEs only) */ -#define CEV_EQ_CNT_4096    (4)	/* EQ has 4096 entries (4-byte EQEs only) */ - -/* - * --- EQ_SIZE_ENUM --- - * Event Queue Entry Size Encoding. - */ -#define CEV_EQ_SIZE_4                   (0)	/* EQE is 4 bytes */ -#define CEV_EQ_SIZE_16                  (1)	/* EQE is 16 bytes */ - -/* - * Completion Queue Context Table Entry. Contains the state of a CQ. - * Located in RAM within the CEV block. - */ -struct BE_CQ_CONTEXT_AMAP { -	u8 Cidx[11];	/* DWORD 0 */ -	u8 Watermark[4];	/* DWORD 0 */ -	u8 NoDelay;		/* DWORD 0 */ -	u8 EPIdx[11];	/* DWORD 0 */ -	u8 Count[2];	/* DWORD 0 */ -	u8 valid;		/* DWORD 0 */ -	u8 SolEvent;	/* DWORD 0 */ -	u8 Eventable;	/* DWORD 0 */ -	u8 Pidx[11];	/* DWORD 1 */ -	u8 PD[10];		/* DWORD 1 */ -	u8 EQID[7];		/* DWORD 1 */ -	u8 Func;		/* DWORD 1 */ -	u8 WME;		/* DWORD 1 */ -	u8 Stalled;		/* DWORD 1 */ -	u8 Armed;		/* DWORD 1 */ -} __packed; -struct CQ_CONTEXT_AMAP { -	u32 dw[2]; -}; - -/* - * Event Queue Context Table Entry. Contains the state of an EQ. - * Located in RAM in the CEV block. - */ -struct BE_EQ_CONTEXT_AMAP { -	u8 Cidx[13];	/* DWORD 0 */ -	u8 rsvd0[2];	/* DWORD 0 */ -	u8 Func;		/* DWORD 0 */ -	u8 EPIdx[13];	/* DWORD 0 */ -	u8 valid;		/* DWORD 0 */ -	u8 rsvd1;		/* DWORD 0 */ -	u8 Size;		/* DWORD 0 */ -	u8 Pidx[13];	/* DWORD 1 */ -	u8 rsvd2[3];	/* DWORD 1 */ -	u8 PD[10];		/* DWORD 1 */ -	u8 Count[3];	/* DWORD 1 */ -	u8 SolEvent;	/* DWORD 1 */ -	u8 Stalled;		/* DWORD 1 */ -	u8 Armed;		/* DWORD 1 */ -	u8 Watermark[4];	/* DWORD 2 */ -	u8 WME;		/* DWORD 2 */ -	u8 rsvd3[3];	/* DWORD 2 */ -	u8 EventVect[6];	/* DWORD 2 */ -	u8 rsvd4[2];	/* DWORD 2 */ -	u8 Delay[8];	/* DWORD 2 */ -	u8 rsvd5[6];	/* DWORD 2 */ -	u8 TMR;		/* DWORD 2 */ -	u8 rsvd6;		/* DWORD 2 */ -	u8 rsvd7[32];	/* DWORD 3 */ -} __packed; -struct EQ_CONTEXT_AMAP { -	u32 dw[4]; -}; - -#endif /* __be_cm_amap_h__ */ diff --git a/drivers/staging/benet/be_common.h b/drivers/staging/benet/be_common.h deleted file mode 100644 index 7e63dc5e334..00000000000 --- a/drivers/staging/benet/be_common.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __be_common_amap_h__ -#define __be_common_amap_h__ - -/* Physical Address. */ -struct BE_PHYS_ADDR_AMAP { -	u8 lo[32];		/* DWORD 0 */ -	u8 hi[32];		/* DWORD 1 */ -} __packed; -struct PHYS_ADDR_AMAP { -	u32 dw[2]; -}; - -/* Virtual Address. */ -struct BE_VIRT_ADDR_AMAP { -	u8 lo[32];		/* DWORD 0 */ -	u8 hi[32];		/* DWORD 1 */ -} __packed; -struct VIRT_ADDR_AMAP { -	u32 dw[2]; -}; - -/* Scatter gather element. */ -struct BE_SGE_AMAP { -	u8 addr_hi[32];	/* DWORD 0 */ -	u8 addr_lo[32];	/* DWORD 1 */ -	u8 rsvd0[32];	/* DWORD 2 */ -	u8 len[16];		/* DWORD 3 */ -	u8 rsvd1[16];	/* DWORD 3 */ -} __packed; -struct SGE_AMAP { -	u32 dw[4]; -}; - -#endif /* __be_common_amap_h__ */ diff --git a/drivers/staging/benet/be_ethtool.c b/drivers/staging/benet/be_ethtool.c deleted file mode 100644 index 027af85707a..00000000000 --- a/drivers/staging/benet/be_ethtool.c +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * be_ethtool.c - * - * 	This file contains various functions that ethtool can use - * 	to talk to the driver and the BE H/W. - */ - -#include "benet.h" - -#include <linux/ethtool.h> - -static const char benet_gstrings_stats[][ETH_GSTRING_LEN] = { -/* net_device_stats */ -	"rx_packets", -	"tx_packets", -	"rx_bytes", -	"tx_bytes", -	"rx_errors", -	"tx_errors", -	"rx_dropped", -	"tx_dropped", -	"multicast", -	"collisions", -	"rx_length_errors", -	"rx_over_errors", -	"rx_crc_errors", -	"rx_frame_errors", -	"rx_fifo_errors", -	"rx_missed_errors", -	"tx_aborted_errors", -	"tx_carrier_errors", -	"tx_fifo_errors", -	"tx_heartbeat_errors", -	"tx_window_errors", -	"rx_compressed", -	"tc_compressed", -/* BE driver Stats */ -	"bes_tx_reqs", -	"bes_tx_fails", -	"bes_fwd_reqs", -	"bes_tx_wrbs", -	"bes_interrupts", -	"bes_events", -	"bes_tx_events", -	"bes_rx_events", -	"bes_tx_compl", -	"bes_rx_compl", -	"bes_ethrx_post_fail", -	"bes_802_3_dropped_frames", -	"bes_802_3_malformed_frames", -	"bes_rx_misc_pkts", -	"bes_eth_tx_rate", -	"bes_eth_rx_rate", -	"Num Packets collected", -	"Num Times Flushed", -}; - -#define NET_DEV_STATS_LEN \ -	(sizeof(struct net_device_stats)/sizeof(unsigned long)) - -#define BENET_STATS_LEN  ARRAY_SIZE(benet_gstrings_stats) - -static void -be_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; - -	strncpy(drvinfo->driver, be_driver_name, 32); -	strncpy(drvinfo->version, be_drvr_ver, 32); -	strncpy(drvinfo->fw_version, be_fw_ver, 32); -	strcpy(drvinfo->bus_info, pci_name(adapter->pdev)); -	drvinfo->testinfo_len = 0; -	drvinfo->regdump_len = 0; -	drvinfo->eedump_len = 0; -} - -static int -be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; - -	coalesce->rx_max_coalesced_frames = adapter->max_rx_coal; - -	coalesce->rx_coalesce_usecs = adapter->cur_eqd; -	coalesce->rx_coalesce_usecs_high = adapter->max_eqd; -	coalesce->rx_coalesce_usecs_low = adapter->min_eqd; - -	coalesce->tx_coalesce_usecs = adapter->cur_eqd; -	coalesce->tx_coalesce_usecs_high = adapter->max_eqd; -	coalesce->tx_coalesce_usecs_low = adapter->min_eqd; - -	coalesce->use_adaptive_rx_coalesce = adapter->enable_aic; -	coalesce->use_adaptive_tx_coalesce = adapter->enable_aic; - -	return 0; -} - -/* - * This routine is used to set interrup coalescing delay *as well as* - * the number of pkts to coalesce for LRO. - */ -static int -be_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; -	struct be_eq_object *eq_objectp; -	u32 max, min, cur; -	int status; - -	adapter->max_rx_coal = coalesce->rx_max_coalesced_frames; -	if (adapter->max_rx_coal >= BE_LRO_MAX_PKTS) -		adapter->max_rx_coal = BE_LRO_MAX_PKTS; - -	if (adapter->enable_aic == 0 && -		coalesce->use_adaptive_rx_coalesce == 1) { -		/* if AIC is being turned on now, start with an EQD of 0 */ -		adapter->cur_eqd = 0; -	} -	adapter->enable_aic = coalesce->use_adaptive_rx_coalesce; - -	/* round off to nearest multiple of 8 */ -	max = (((coalesce->rx_coalesce_usecs_high + 4) >> 3) << 3); -	min = (((coalesce->rx_coalesce_usecs_low + 4) >> 3) << 3); -	cur = (((coalesce->rx_coalesce_usecs + 4) >> 3) << 3); - -	if (adapter->enable_aic) { -		/* accept low and high if AIC is enabled */ -		if (max > MAX_EQD) -			max = MAX_EQD; -		if (min > max) -			min = max; -		adapter->max_eqd = max; -		adapter->min_eqd = min; -		if (adapter->cur_eqd > max) -			adapter->cur_eqd = max; -		if (adapter->cur_eqd < min) -			adapter->cur_eqd = min; -	} else { -		/* accept specified coalesce_usecs only if AIC is disabled */ -		if (cur > MAX_EQD) -			cur = MAX_EQD; -		eq_objectp = &pnob->event_q_obj; -		status = -		    be_eq_modify_delay(&pnob->fn_obj, 1, &eq_objectp, &cur, -				       NULL, NULL, NULL); -		if (status == BE_SUCCESS) -			adapter->cur_eqd = cur; -	} -	return 0; -} - -static u32 be_get_rx_csum(struct net_device *netdev) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; -	return adapter->rx_csum; -} - -static int be_set_rx_csum(struct net_device *netdev, uint32_t data) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; - -	if (data) -		adapter->rx_csum = 1; -	else -		adapter->rx_csum = 0; - -	return 0; -} - -static void -be_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data) -{ -	switch (stringset) { -	case ETH_SS_STATS: -		memcpy(data, *benet_gstrings_stats, -		       sizeof(benet_gstrings_stats)); -		break; -	} -} - -static int be_get_stats_count(struct net_device *netdev) -{ -	return BENET_STATS_LEN; -} - -static void -be_get_ethtool_stats(struct net_device *netdev, -		     struct ethtool_stats *stats, uint64_t *data) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; -	int i; - -	benet_get_stats(netdev); - -	for (i = 0; i <= NET_DEV_STATS_LEN; i++) -		data[i] = ((unsigned long *)&adapter->benet_stats)[i]; - -	data[i] = adapter->be_stat.bes_tx_reqs; -	data[i++] = adapter->be_stat.bes_tx_fails; -	data[i++] = adapter->be_stat.bes_fwd_reqs; -	data[i++] = adapter->be_stat.bes_tx_wrbs; - -	data[i++] = adapter->be_stat.bes_ints; -	data[i++] = adapter->be_stat.bes_events; -	data[i++] = adapter->be_stat.bes_tx_events; -	data[i++] = adapter->be_stat.bes_rx_events; -	data[i++] = adapter->be_stat.bes_tx_compl; -	data[i++] = adapter->be_stat.bes_rx_compl; -	data[i++] = adapter->be_stat.bes_ethrx_post_fail; -	data[i++] = adapter->be_stat.bes_802_3_dropped_frames; -	data[i++] = adapter->be_stat.bes_802_3_malformed_frames; -	data[i++] = adapter->be_stat.bes_rx_misc_pkts; -	data[i++] = adapter->be_stat.bes_eth_tx_rate; -	data[i++] = adapter->be_stat.bes_eth_rx_rate; -	data[i++] = adapter->be_stat.bes_rx_coal; -	data[i++] = adapter->be_stat.bes_rx_flush; - -} - -static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) -{ -	ecmd->speed = SPEED_10000; -	ecmd->duplex = DUPLEX_FULL; -	ecmd->autoneg = AUTONEG_DISABLE; -	return 0; -} - -/* Get the Ring parameters from the pnob */ -static void -be_get_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring) -{ -	struct be_net_object *pnob = netdev_priv(netdev); - -	/* Pre Set Maxims */ -	ring->rx_max_pending = pnob->rx_q_len; -	ring->rx_mini_max_pending = ring->rx_mini_max_pending; -	ring->rx_jumbo_max_pending = ring->rx_jumbo_max_pending; -	ring->tx_max_pending = pnob->tx_q_len; - -	/* Current hardware Settings                */ -	ring->rx_pending = atomic_read(&pnob->rx_q_posted); -	ring->rx_mini_pending = ring->rx_mini_pending; -	ring->rx_jumbo_pending = ring->rx_jumbo_pending; -	ring->tx_pending = atomic_read(&pnob->tx_q_used); - -} - -static void -be_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	bool rxfc, txfc; -	int status; - -	status = be_eth_get_flow_control(&pnob->fn_obj, &txfc, &rxfc); -	if (status != BE_SUCCESS) { -		dev_info(&netdev->dev, "Unable to get pause frame settings\n"); -		/* return defaults */ -		ecmd->rx_pause = 1; -		ecmd->tx_pause = 0; -		ecmd->autoneg = AUTONEG_ENABLE; -		return; -	} - -	if (txfc == true) -		ecmd->tx_pause = 1; -	else -		ecmd->tx_pause = 0; - -	if (rxfc == true) -		ecmd->rx_pause = 1; -	else -		ecmd->rx_pause = 0; - -	ecmd->autoneg = AUTONEG_ENABLE; -} - -static int -be_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *ecmd) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	bool txfc, rxfc; -	int status; - -	if (ecmd->autoneg != AUTONEG_ENABLE) -		return -EINVAL; - -	if (ecmd->tx_pause) -		txfc = true; -	else -		txfc = false; - -	if (ecmd->rx_pause) -		rxfc = true; -	else -		rxfc = false; - -	status = be_eth_set_flow_control(&pnob->fn_obj, txfc, rxfc); -	if (status != BE_SUCCESS) { -		dev_info(&netdev->dev, "Unable to set pause frame settings\n"); -		return -1; -	} -	return 0; -} - -struct ethtool_ops be_ethtool_ops = { -	.get_settings = be_get_settings, -	.get_drvinfo = be_get_drvinfo, -	.get_link = ethtool_op_get_link, -	.get_coalesce = be_get_coalesce, -	.set_coalesce = be_set_coalesce, -	.get_ringparam = be_get_ringparam, -	.get_pauseparam = be_get_pauseparam, -	.set_pauseparam = be_set_pauseparam, -	.get_rx_csum = be_get_rx_csum, -	.set_rx_csum = be_set_rx_csum, -	.get_tx_csum = ethtool_op_get_tx_csum, -	.set_tx_csum = ethtool_op_set_tx_csum, -	.get_sg = ethtool_op_get_sg, -	.set_sg = ethtool_op_set_sg, -	.get_tso = ethtool_op_get_tso, -	.set_tso = ethtool_op_set_tso, -	.get_strings = be_get_strings, -	.get_stats_count = be_get_stats_count, -	.get_ethtool_stats = be_get_ethtool_stats, -}; diff --git a/drivers/staging/benet/be_init.c b/drivers/staging/benet/be_init.c deleted file mode 100644 index 12a026c3f9e..00000000000 --- a/drivers/staging/benet/be_init.c +++ /dev/null @@ -1,1382 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#include <linux/etherdevice.h> -#include "benet.h" - -#define  DRVR_VERSION  "1.0.728" - -static const struct pci_device_id be_device_id_table[] = { -	{PCI_DEVICE(0x19a2, 0x0201)}, -	{0} -}; - -MODULE_DEVICE_TABLE(pci, be_device_id_table); - -MODULE_VERSION(DRVR_VERSION); - -#define DRV_DESCRIPTION "ServerEngines BladeEngine Network Driver Version " - -MODULE_DESCRIPTION(DRV_DESCRIPTION DRVR_VERSION); -MODULE_AUTHOR("ServerEngines"); -MODULE_LICENSE("GPL"); - -static unsigned int msix = 1; -module_param(msix, uint, S_IRUGO); -MODULE_PARM_DESC(msix, "Use MSI-x interrupts"); - -static unsigned int rxbuf_size = 2048;	/* Default RX frag size */ -module_param(rxbuf_size, uint, S_IRUGO); -MODULE_PARM_DESC(rxbuf_size, "Size of buffers to hold Rx data"); - -const char be_drvr_ver[] = DRVR_VERSION; -char be_fw_ver[32];		/* F/W version filled in by be_probe */ -char be_driver_name[] = "benet"; - -/* - * Number of entries in each queue. - */ -#define EVENT_Q_LEN		1024 -#define ETH_TXQ_LEN		2048 -#define ETH_TXCQ_LEN		1024 -#define ETH_RXQ_LEN		1024	/* Does not support any other value */ -#define ETH_UC_RXCQ_LEN		1024 -#define ETH_BC_RXCQ_LEN		256 -#define MCC_Q_LEN               64	/* total size not to exceed 8 pages */ -#define MCC_CQ_LEN              256 - -/* Bit mask describing events of interest to be traced */ -unsigned int trace_level; - -static int -init_pci_be_function(struct be_adapter *adapter, struct pci_dev *pdev) -{ -	u64 pa; - -	/* CSR */ -	pa = pci_resource_start(pdev, 2); -	adapter->csr_va = ioremap_nocache(pa, pci_resource_len(pdev, 2)); -	if (adapter->csr_va == NULL) -		return -ENOMEM; - -	/* Door Bell */ -	pa = pci_resource_start(pdev, 4); -	adapter->db_va = ioremap_nocache(pa, (128 * 1024)); -	if (adapter->db_va == NULL) { -		iounmap(adapter->csr_va); -		return -ENOMEM; -	} - -	/* PCI */ -	pa = pci_resource_start(pdev, 1); -	adapter->pci_va = ioremap_nocache(pa, pci_resource_len(pdev, 1)); -	if (adapter->pci_va == NULL) { -		iounmap(adapter->csr_va); -		iounmap(adapter->db_va); -		return -ENOMEM; -	} -	return 0; -} - -/* -   This function enables the interrupt corresponding to the Event -   queue ID for the given NetObject -*/ -void be_enable_eq_intr(struct be_net_object *pnob) -{ -	struct CQ_DB_AMAP cqdb; -	cqdb.dw[0] = 0; -	AMAP_SET_BITS_PTR(CQ_DB, event, &cqdb, 1); -	AMAP_SET_BITS_PTR(CQ_DB, rearm, &cqdb, 1); -	AMAP_SET_BITS_PTR(CQ_DB, num_popped, &cqdb, 0); -	AMAP_SET_BITS_PTR(CQ_DB, qid, &cqdb, pnob->event_q_id); -	PD_WRITE(&pnob->fn_obj, cq_db, cqdb.dw[0]); -} - -/* -   This function disables the interrupt corresponding to the Event -   queue ID for the given NetObject -*/ -void be_disable_eq_intr(struct be_net_object *pnob) -{ -	struct CQ_DB_AMAP cqdb; -	cqdb.dw[0] = 0; -	AMAP_SET_BITS_PTR(CQ_DB, event, &cqdb, 1); -	AMAP_SET_BITS_PTR(CQ_DB, rearm, &cqdb, 0); -	AMAP_SET_BITS_PTR(CQ_DB, num_popped, &cqdb, 0); -	AMAP_SET_BITS_PTR(CQ_DB, qid, &cqdb, pnob->event_q_id); -	PD_WRITE(&pnob->fn_obj, cq_db, cqdb.dw[0]); -} - -/* -    This function enables the interrupt from the  network function -    of the BladeEngine. Use the function be_disable_eq_intr() -    to enable the interrupt from the event queue of only one specific -    NetObject -*/ -void be_enable_intr(struct be_net_object *pnob) -{ -	struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP ctrl; -	u32 host_intr; - -	ctrl.dw[0] = PCICFG1_READ(&pnob->fn_obj, host_timer_int_ctrl); -	host_intr = AMAP_GET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR, -							hostintr, ctrl.dw); -	if (!host_intr) { -		AMAP_SET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR, -			hostintr, ctrl.dw, 1); -		PCICFG1_WRITE(&pnob->fn_obj, host_timer_int_ctrl, -			ctrl.dw[0]); -	} -} - -/* -   This function disables the interrupt from the network function of -   the BladeEngine.  Use the function be_disable_eq_intr() to -   disable the interrupt from the event queue of only one specific NetObject -*/ -void be_disable_intr(struct be_net_object *pnob) -{ - -	struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP ctrl; -	u32 host_intr; -	ctrl.dw[0] = PCICFG1_READ(&pnob->fn_obj, host_timer_int_ctrl); -	host_intr = AMAP_GET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR, -							hostintr, ctrl.dw); -	if (host_intr) { -		AMAP_SET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR, hostintr, -			ctrl.dw, 0); -		PCICFG1_WRITE(&pnob->fn_obj, host_timer_int_ctrl, -			ctrl.dw[0]); -	} -} - -static int be_enable_msix(struct be_adapter *adapter) -{ -	int i, ret; - -	if (!msix) -		return -1; - -	for (i = 0; i < BE_MAX_REQ_MSIX_VECTORS; i++) -		adapter->msix_entries[i].entry = i; - -	ret = pci_enable_msix(adapter->pdev, adapter->msix_entries, -		BE_MAX_REQ_MSIX_VECTORS); - -	if (ret == 0) -		adapter->msix_enabled = 1; -	return ret; -} - -static int be_register_isr(struct be_adapter *adapter, -		struct be_net_object *pnob) -{ -	struct net_device *netdev = pnob->netdev; -	int intx = 0, r; - -	netdev->irq = adapter->pdev->irq; -	r = be_enable_msix(adapter); - -	if (r == 0) { -		r = request_irq(adapter->msix_entries[0].vector, -				be_int, IRQF_SHARED, netdev->name, netdev); -		if (r) { -			printk(KERN_WARNING -				"MSIX Request IRQ failed - Errno %d\n", r); -			intx = 1; -			pci_disable_msix(adapter->pdev); -			adapter->msix_enabled = 0; -		} -	} else { -		intx = 1; -	} - -	if (intx) { -		r = request_irq(netdev->irq, be_int, IRQF_SHARED, -				netdev->name, netdev); -		if (r) { -			printk(KERN_WARNING -				"INTx Request IRQ failed - Errno %d\n", r); -			return -1; -		} -	} -	adapter->isr_registered = 1; -	return 0; -} - -static void be_unregister_isr(struct be_adapter *adapter) -{ -	struct net_device *netdev = adapter->netdevp; -	if (adapter->isr_registered) { -		if (adapter->msix_enabled) { -			free_irq(adapter->msix_entries[0].vector, netdev); -			pci_disable_msix(adapter->pdev); -			adapter->msix_enabled = 0; -		} else { -			free_irq(netdev->irq, netdev); -		} -		adapter->isr_registered = 0; -	} -} - -/* -    This function processes the Flush Completions that are issued by the -    ARM F/W, when a Recv Ring is destroyed.  A flush completion is -    identified when a Rx COmpl descriptor has the tcpcksum and udpcksum -    set and the pktsize is 32.  These completions are received on the -    Rx Completion Queue. -*/ -static u32 be_process_rx_flush_cmpl(struct be_net_object *pnob) -{ -	struct ETH_RX_COMPL_AMAP *rxcp; -	unsigned int i = 0; -	while ((rxcp = be_get_rx_cmpl(pnob)) != NULL) { -		be_notify_cmpl(pnob, 1, pnob->rx_cq_id, 1); -		i++; -	} -	return i; -} - -static void be_tx_q_clean(struct be_net_object *pnob) -{ -	while (atomic_read(&pnob->tx_q_used)) -		process_one_tx_compl(pnob, tx_compl_lastwrb_idx_get(pnob)); -} - -static void be_rx_q_clean(struct be_net_object *pnob) -{ -	if (pnob->rx_ctxt) { -		int i; -		struct be_rx_page_info *rx_page_info; -		for (i = 0; i < pnob->rx_q_len; i++) { -			rx_page_info = &(pnob->rx_page_info[i]); -			if (!pnob->rx_pg_shared || rx_page_info->page_offset) { -				pci_unmap_page(pnob->adapter->pdev, -				       pci_unmap_addr(rx_page_info, bus), -					       pnob->rx_buf_size, -					       PCI_DMA_FROMDEVICE); -			} -			if (rx_page_info->page) -				put_page(rx_page_info->page); -			memset(rx_page_info, 0, sizeof(struct be_rx_page_info)); -		} -		pnob->rx_pg_info_hd = 0; -	} -} - -static void be_destroy_netobj(struct be_net_object *pnob) -{ -	int status; - -	if (pnob->tx_q_created) { -		status = be_eth_sq_destroy(&pnob->tx_q_obj); -		pnob->tx_q_created = 0; -	} - -	if (pnob->rx_q_created) { -		status = be_eth_rq_destroy(&pnob->rx_q_obj); -		if (status != 0) { -			status = be_eth_rq_destroy_options(&pnob->rx_q_obj, 0, -						      NULL, NULL); -			BUG_ON(status); -		} -		pnob->rx_q_created = 0; -	} - -	be_process_rx_flush_cmpl(pnob); - -	if (pnob->tx_cq_created) { -		status = be_cq_destroy(&pnob->tx_cq_obj); -		pnob->tx_cq_created = 0; -	} - -	if (pnob->rx_cq_created) { -		status = be_cq_destroy(&pnob->rx_cq_obj); -		pnob->rx_cq_created = 0; -	} - -	if (pnob->mcc_q_created) { -		status = be_mcc_ring_destroy(&pnob->mcc_q_obj); -		pnob->mcc_q_created = 0; -	} -	if (pnob->mcc_cq_created) { -		status = be_cq_destroy(&pnob->mcc_cq_obj); -		pnob->mcc_cq_created = 0; -	} - -	if (pnob->event_q_created) { -		status = be_eq_destroy(&pnob->event_q_obj); -		pnob->event_q_created = 0; -	} -	be_function_cleanup(&pnob->fn_obj); -} - -/* - * free all resources associated with a pnob - * Called at the time of module cleanup as well a any error during - * module init.  Some resources may be partially allocated in a NetObj. - */ -static void netobject_cleanup(struct be_adapter *adapter, -			struct be_net_object *pnob) -{ -	struct net_device *netdev = adapter->netdevp; - -	if (netif_running(netdev)) { -		netif_stop_queue(netdev); -		be_wait_nic_tx_cmplx_cmpl(pnob); -		be_disable_eq_intr(pnob); -	} - -	be_unregister_isr(adapter); - -	if (adapter->tasklet_started) { -		tasklet_kill(&(adapter->sts_handler)); -		adapter->tasklet_started = 0; -	} -	if (pnob->fn_obj_created) -		be_disable_intr(pnob); - -	if (adapter->dev_state != BE_DEV_STATE_NONE) -		unregister_netdev(netdev); - -	if (pnob->fn_obj_created) -		be_destroy_netobj(pnob); - -	adapter->net_obj = NULL; -	adapter->netdevp = NULL; - -	be_rx_q_clean(pnob); -	if (pnob->rx_ctxt) { -		kfree(pnob->rx_page_info); -		kfree(pnob->rx_ctxt); -	} - -	be_tx_q_clean(pnob); -	kfree(pnob->tx_ctxt); - -	if (pnob->mcc_q) -		pci_free_consistent(adapter->pdev, pnob->mcc_q_size, -			pnob->mcc_q, pnob->mcc_q_bus); - -	if (pnob->mcc_wrb_ctxt) -		free_pages((unsigned long)pnob->mcc_wrb_ctxt, -			   get_order(pnob->mcc_wrb_ctxt_size)); - -	if (pnob->mcc_cq) -		pci_free_consistent(adapter->pdev, pnob->mcc_cq_size, -			pnob->mcc_cq, pnob->mcc_cq_bus); - -	if (pnob->event_q) -		pci_free_consistent(adapter->pdev, pnob->event_q_size, -			pnob->event_q, pnob->event_q_bus); - -	if (pnob->tx_cq) -		pci_free_consistent(adapter->pdev, pnob->tx_cq_size, -			pnob->tx_cq, pnob->tx_cq_bus); - -	if (pnob->tx_q) -		pci_free_consistent(adapter->pdev, pnob->tx_q_size, -			pnob->tx_q, pnob->tx_q_bus); - -	if (pnob->rx_q) -		pci_free_consistent(adapter->pdev, pnob->rx_q_size, -			pnob->rx_q, pnob->rx_q_bus); - -	if (pnob->rx_cq) -		pci_free_consistent(adapter->pdev, pnob->rx_cq_size, -			pnob->rx_cq, pnob->rx_cq_bus); - - -	if (pnob->mb_ptr) -		pci_free_consistent(adapter->pdev, pnob->mb_size, pnob->mb_ptr, -			pnob->mb_bus); - -	free_netdev(netdev); -} - - -static int be_nob_ring_alloc(struct be_adapter *adapter, -	struct be_net_object *pnob) -{ -	u32 size; - -	/* Mail box rd; mailbox pointer needs to be 16 byte aligned */ -	pnob->mb_size = sizeof(struct MCC_MAILBOX_AMAP) + 16; -	pnob->mb_ptr = pci_alloc_consistent(adapter->pdev, pnob->mb_size, -				&pnob->mb_bus); -	if (!pnob->mb_bus) -		return -1; -	memset(pnob->mb_ptr, 0, pnob->mb_size); -	pnob->mb_rd.va = PTR_ALIGN(pnob->mb_ptr, 16); -	pnob->mb_rd.pa = PTR_ALIGN(pnob->mb_bus, 16); -	pnob->mb_rd.length = sizeof(struct MCC_MAILBOX_AMAP); -	/* -	 * Event queue -	 */ -	pnob->event_q_len = EVENT_Q_LEN; -	pnob->event_q_size = pnob->event_q_len * sizeof(struct EQ_ENTRY_AMAP); -	pnob->event_q = pci_alloc_consistent(adapter->pdev, pnob->event_q_size, -				&pnob->event_q_bus); -	if (!pnob->event_q_bus) -		return -1; -	memset(pnob->event_q, 0, pnob->event_q_size); -	/* -	 * Eth TX queue -	 */ -	pnob->tx_q_len = ETH_TXQ_LEN; -	pnob->tx_q_port = 0; -	pnob->tx_q_size =  pnob->tx_q_len * sizeof(struct ETH_WRB_AMAP); -	pnob->tx_q = pci_alloc_consistent(adapter->pdev, pnob->tx_q_size, -				&pnob->tx_q_bus); -	if (!pnob->tx_q_bus) -		return -1; -	memset(pnob->tx_q, 0, pnob->tx_q_size); -	/* -	 * Eth TX Compl queue -	 */ -	pnob->txcq_len = ETH_TXCQ_LEN; -	pnob->tx_cq_size = pnob->txcq_len * sizeof(struct ETH_TX_COMPL_AMAP); -	pnob->tx_cq = pci_alloc_consistent(adapter->pdev, pnob->tx_cq_size, -				&pnob->tx_cq_bus); -	if (!pnob->tx_cq_bus) -		return -1; -	memset(pnob->tx_cq, 0, pnob->tx_cq_size); -	/* -	 * Eth RX queue -	 */ -	pnob->rx_q_len = ETH_RXQ_LEN; -	pnob->rx_q_size =  pnob->rx_q_len * sizeof(struct ETH_RX_D_AMAP); -	pnob->rx_q = pci_alloc_consistent(adapter->pdev, pnob->rx_q_size, -				&pnob->rx_q_bus); -	if (!pnob->rx_q_bus) -		return -1; -	memset(pnob->rx_q, 0, pnob->rx_q_size); -	/* -	 * Eth Unicast RX Compl queue -	 */ -	pnob->rx_cq_len = ETH_UC_RXCQ_LEN; -	pnob->rx_cq_size =  pnob->rx_cq_len * -			sizeof(struct ETH_RX_COMPL_AMAP); -	pnob->rx_cq = pci_alloc_consistent(adapter->pdev, pnob->rx_cq_size, -				&pnob->rx_cq_bus); -	if (!pnob->rx_cq_bus) -		return -1; -	memset(pnob->rx_cq, 0, pnob->rx_cq_size); - -	/* TX resources */ -	size = pnob->tx_q_len * sizeof(void **); -	pnob->tx_ctxt = kzalloc(size, GFP_KERNEL); -	if (pnob->tx_ctxt == NULL) -		return -1; - -	/* RX resources */ -	size = pnob->rx_q_len * sizeof(void *); -	pnob->rx_ctxt = kzalloc(size, GFP_KERNEL); -	if (pnob->rx_ctxt == NULL) -		return -1; - -	size = (pnob->rx_q_len * sizeof(struct be_rx_page_info)); -	pnob->rx_page_info = kzalloc(size, GFP_KERNEL); -	if (pnob->rx_page_info == NULL) -		return -1; - -	adapter->eth_statsp = kzalloc(sizeof(struct FWCMD_ETH_GET_STATISTICS), -				GFP_KERNEL); -	if (adapter->eth_statsp == NULL) -		return -1; -	pnob->rx_buf_size = rxbuf_size; -	return 0; -} - -/* -    This function initializes the be_net_object for subsequent -    network operations. - -    Before calling this function, the driver  must have allocated -    space for the NetObject structure, initialized the structure, -    allocated DMAable memory for all the network queues that form -    part of the NetObject and populated the start address (virtual) -    and number of entries allocated for each queue in the NetObject structure. - -    The driver must also have allocated memory to hold the -    mailbox structure (MCC_MAILBOX) and post the physical address, -    virtual addresses and the size of the mailbox memory in the -    NetObj.mb_rd.  This structure is used by BECLIB for -    initial communication with the embedded MCC processor. BECLIB -    uses the mailbox until MCC rings are created for  more  efficient -    communication with the MCC processor. - -    If the driver wants to create multiple network interface for more -    than one protection domain, it can call be_create_netobj() -    multiple times  once for each protection domain.  A Maximum of -    32 protection domains are supported. - -*/ -static int -be_create_netobj(struct be_net_object *pnob, u8 __iomem *csr_va, -	u8 __iomem *db_va, u8 __iomem *pci_va) -{ -	int status = 0; -	bool  eventable = false, tx_no_delay = false, rx_no_delay = false; -	struct be_eq_object *eq_objectp = NULL; -	struct be_function_object *pfob = &pnob->fn_obj; -	struct ring_desc rd; -	u32 set_rxbuf_size; -	u32 tx_cmpl_wm = CEV_WMARK_96;	/* 0xffffffff to disable */ -	u32 rx_cmpl_wm = CEV_WMARK_160;	/* 0xffffffff to disable */ -	u32 eq_delay = 0; /* delay in 8usec units. 0xffffffff to disable */ - -	memset(&rd, 0, sizeof(struct ring_desc)); - -	status = be_function_object_create(csr_va, db_va, pci_va, -			BE_FUNCTION_TYPE_NETWORK, &pnob->mb_rd, pfob); -	if (status != BE_SUCCESS) -		return status; -	pnob->fn_obj_created = true; - -	if (tx_cmpl_wm == 0xffffffff) -		tx_no_delay = true; -	if (rx_cmpl_wm == 0xffffffff) -		rx_no_delay = true; -	/* -	 * now create the necessary rings -	 * Event Queue first. -	 */ -	if (pnob->event_q_len) { -		rd.va = pnob->event_q; -		rd.pa = pnob->event_q_bus; -		rd.length = pnob->event_q_size; - -		status = be_eq_create(pfob, &rd, 4, pnob->event_q_len, -				(u32) -1,	/* CEV_WMARK_* or -1 */ -				eq_delay,	/* in 8us units, or -1 */ -				&pnob->event_q_obj); -		if (status != BE_SUCCESS) -			goto error_ret; -		pnob->event_q_id = pnob->event_q_obj.eq_id; -		pnob->event_q_created = 1; -		eventable = true; -		eq_objectp = &pnob->event_q_obj; -	} -	/* -	 * Now Eth Tx Compl. queue. -	 */ -	if (pnob->txcq_len) { -		rd.va = pnob->tx_cq; -		rd.pa = pnob->tx_cq_bus; -		rd.length = pnob->tx_cq_size; - -		status = be_cq_create(pfob, &rd, -			pnob->txcq_len * sizeof(struct ETH_TX_COMPL_AMAP), -			false,	/* solicted events,  */ -			tx_no_delay,	/* nodelay  */ -			tx_cmpl_wm,	/* Watermark encodings */ -			eq_objectp, &pnob->tx_cq_obj); -		if (status != BE_SUCCESS) -			goto error_ret; - -		pnob->tx_cq_id = pnob->tx_cq_obj.cq_id; -		pnob->tx_cq_created = 1; -	} -	/* -	 * Eth Tx queue -	 */ -	if (pnob->tx_q_len) { -		struct be_eth_sq_parameters ex_params = { 0 }; -		u32 type; - -		if (pnob->tx_q_port) { -			/* TXQ to be bound to a specific port */ -			type = BE_ETH_TX_RING_TYPE_BOUND; -			ex_params.port = pnob->tx_q_port - 1; -		} else -			type = BE_ETH_TX_RING_TYPE_STANDARD; - -		rd.va = pnob->tx_q; -		rd.pa = pnob->tx_q_bus; -		rd.length = pnob->tx_q_size; - -		status = be_eth_sq_create_ex(pfob, &rd, -				pnob->tx_q_len * sizeof(struct ETH_WRB_AMAP), -				type, 2, &pnob->tx_cq_obj, -				&ex_params, &pnob->tx_q_obj); - -		if (status != BE_SUCCESS) -			goto error_ret; - -		pnob->tx_q_id = pnob->tx_q_obj.bid; -		pnob->tx_q_created = 1; -	} -	/* -	 * Now Eth Rx compl. queue.  Always needed. -	 */ -	rd.va = pnob->rx_cq; -	rd.pa = pnob->rx_cq_bus; -	rd.length = pnob->rx_cq_size; - -	status = be_cq_create(pfob, &rd, -			pnob->rx_cq_len * sizeof(struct ETH_RX_COMPL_AMAP), -			false,	/* solicted events,  */ -			rx_no_delay,	/* nodelay  */ -			rx_cmpl_wm,	/* Watermark encodings */ -			eq_objectp, &pnob->rx_cq_obj); -	if (status != BE_SUCCESS) -		goto error_ret; - -	pnob->rx_cq_id = pnob->rx_cq_obj.cq_id; -	pnob->rx_cq_created = 1; - -	status = be_eth_rq_set_frag_size(pfob, pnob->rx_buf_size, -			(u32 *) &set_rxbuf_size); -	if (status != BE_SUCCESS) { -		be_eth_rq_get_frag_size(pfob, (u32 *) &pnob->rx_buf_size); -		if ((pnob->rx_buf_size != 2048) && (pnob->rx_buf_size != 4096) -		    && (pnob->rx_buf_size != 8192)) -			goto error_ret; -	} else { -		if (pnob->rx_buf_size != set_rxbuf_size) -			pnob->rx_buf_size = set_rxbuf_size; -	} -	/* -	 * Eth RX queue. be_eth_rq_create() always assumes 2 pages size -	 */ -	rd.va = pnob->rx_q; -	rd.pa = pnob->rx_q_bus; -	rd.length = pnob->rx_q_size; - -	status = be_eth_rq_create(pfob, &rd, &pnob->rx_cq_obj, -			     &pnob->rx_cq_obj, &pnob->rx_q_obj); - -	if (status != BE_SUCCESS) -		goto error_ret; - -	pnob->rx_q_id = pnob->rx_q_obj.rid; -	pnob->rx_q_created = 1; - -	return BE_SUCCESS;	/* All required queues created. */ - -error_ret: -	be_destroy_netobj(pnob); -	return status; -} - -static int be_nob_ring_init(struct be_adapter *adapter, -				struct be_net_object *pnob) -{ -	int status; - -	pnob->event_q_tl = 0; - -	pnob->tx_q_hd = 0; -	pnob->tx_q_tl = 0; - -	pnob->tx_cq_tl = 0; - -	pnob->rx_cq_tl = 0; - -	memset(pnob->event_q, 0, pnob->event_q_size); -	memset(pnob->tx_cq, 0, pnob->tx_cq_size); -	memset(pnob->tx_ctxt, 0, pnob->tx_q_len * sizeof(void **)); -	memset(pnob->rx_ctxt, 0, pnob->rx_q_len * sizeof(void *)); -	pnob->rx_pg_info_hd = 0; -	pnob->rx_q_hd = 0; -	atomic_set(&pnob->rx_q_posted, 0); - -	status = be_create_netobj(pnob, adapter->csr_va, adapter->db_va, -				adapter->pci_va); -	if (status != BE_SUCCESS) -		return -1; - -	be_post_eth_rx_buffs(pnob); -	return 0; -} - -/* This function handles async callback for link status */ -static void -be_link_status_async_callback(void *context, u32 event_code, void *event) -{ -	struct ASYNC_EVENT_LINK_STATE_AMAP *link_status = event; -	struct be_adapter *adapter = context; -	bool link_enable = false; -	struct be_net_object *pnob; -	struct ASYNC_EVENT_TRAILER_AMAP *async_trailer; -	struct net_device *netdev; -	u32 async_event_code, async_event_type, active_port; -	u32 port0_link_status, port1_link_status, port0_duplex, port1_duplex; -	u32 port0_speed, port1_speed; - -	if (event_code != ASYNC_EVENT_CODE_LINK_STATE) { -		/* Not our event to handle */ -		return; -	} -	async_trailer = (struct ASYNC_EVENT_TRAILER_AMAP *) -	    ((u8 *) event + sizeof(struct MCC_CQ_ENTRY_AMAP) - -	     sizeof(struct ASYNC_EVENT_TRAILER_AMAP)); - -	async_event_code = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER, event_code, -					     async_trailer); -	BUG_ON(async_event_code != ASYNC_EVENT_CODE_LINK_STATE); - -	pnob = adapter->net_obj; -	netdev = pnob->netdev; - -	/* Determine if this event is a switch VLD or a physical link event */ -	async_event_type = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER, event_type, -					     async_trailer); -	active_port = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE, -					active_port, link_status); -	port0_link_status = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE, -					      port0_link_status, link_status); -	port1_link_status = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE, -					      port1_link_status, link_status); -	port0_duplex = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE, -					 port0_duplex, link_status); -	port1_duplex = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE, -					 port1_duplex, link_status); -	port0_speed = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE, -					port0_speed, link_status); -	port1_speed = AMAP_GET_BITS_PTR(ASYNC_EVENT_LINK_STATE, -					port1_speed, link_status); -	if (async_event_type == NTWK_LINK_TYPE_VIRTUAL) { -		adapter->be_stat.bes_link_change_virtual++; -		if (adapter->be_link_sts->active_port != active_port) { -			dev_notice(&netdev->dev, -			       "Active port changed due to VLD on switch\n"); -		} else { -			dev_notice(&netdev->dev, "Link status update\n"); -		} - -	} else { -		adapter->be_stat.bes_link_change_physical++; -		if (adapter->be_link_sts->active_port != active_port) { -			dev_notice(&netdev->dev, -			       "Active port changed due to port link" -			       " status change\n"); -		} else { -			dev_notice(&netdev->dev, "Link status update\n"); -		} -	} - -	memset(adapter->be_link_sts, 0, sizeof(adapter->be_link_sts)); - -	if ((port0_link_status == ASYNC_EVENT_LINK_UP) || -	    (port1_link_status == ASYNC_EVENT_LINK_UP)) { -		if ((adapter->port0_link_sts == BE_PORT_LINK_DOWN) && -		    (adapter->port1_link_sts == BE_PORT_LINK_DOWN)) { -			/* Earlier both the ports are down So link is up */ -			link_enable = true; -		} - -		if (port0_link_status == ASYNC_EVENT_LINK_UP) { -			adapter->port0_link_sts = BE_PORT_LINK_UP; -			adapter->be_link_sts->mac0_duplex = port0_duplex; -			adapter->be_link_sts->mac0_speed = port0_speed; -			if (active_port == NTWK_PORT_A) -				adapter->be_link_sts->active_port = 0; -		} else -			adapter->port0_link_sts = BE_PORT_LINK_DOWN; - -		if (port1_link_status == ASYNC_EVENT_LINK_UP) { -			adapter->port1_link_sts = BE_PORT_LINK_UP; -			adapter->be_link_sts->mac1_duplex = port1_duplex; -			adapter->be_link_sts->mac1_speed = port1_speed; -			if (active_port == NTWK_PORT_B) -				adapter->be_link_sts->active_port = 1; -		} else -			adapter->port1_link_sts = BE_PORT_LINK_DOWN; - -		printk(KERN_INFO "Link Properties for %s:\n", netdev->name); -		dev_info(&netdev->dev, "Link Properties:\n"); -		be_print_link_info(adapter->be_link_sts); - -		if (!link_enable) -			return; -		/* -		 * Both ports were down previously, but atleast one of -		 * them has come up if this netdevice's carrier is not up, -		 * then indicate to stack -		 */ -		if (!netif_carrier_ok(netdev)) { -			netif_start_queue(netdev); -			netif_carrier_on(netdev); -		} -		return; -	} - -	/* Now both the ports are down. Tell the stack about it */ -	dev_info(&netdev->dev, "Both ports are down\n"); -	adapter->port0_link_sts = BE_PORT_LINK_DOWN; -	adapter->port1_link_sts = BE_PORT_LINK_DOWN; -	if (netif_carrier_ok(netdev)) { -		netif_carrier_off(netdev); -		netif_stop_queue(netdev); -	} -	return; -} - -static int be_mcc_create(struct be_adapter *adapter) -{ -	struct be_net_object *pnob; - -	pnob = adapter->net_obj; -	/* -	 * Create the MCC ring so that all further communication with -	 * MCC can go thru the ring. we do this at the end since -	 * we do not want to be dealing with interrupts until the -	 * initialization is complete. -	 */ -	pnob->mcc_q_len = MCC_Q_LEN; -	pnob->mcc_q_size = pnob->mcc_q_len * sizeof(struct MCC_WRB_AMAP); -	pnob->mcc_q =  pci_alloc_consistent(adapter->pdev, pnob->mcc_q_size, -				&pnob->mcc_q_bus); -	if (!pnob->mcc_q_bus) -		return -1; -	/* -	 * space for MCC WRB context -	 */ -	pnob->mcc_wrb_ctxtLen = MCC_Q_LEN; -	pnob->mcc_wrb_ctxt_size =  pnob->mcc_wrb_ctxtLen * -		sizeof(struct be_mcc_wrb_context); -	pnob->mcc_wrb_ctxt = (void *)__get_free_pages(GFP_KERNEL, -		get_order(pnob->mcc_wrb_ctxt_size)); -	if (pnob->mcc_wrb_ctxt == NULL) -		return -1; -	/* -	 * Space for MCC compl. ring -	 */ -	pnob->mcc_cq_len = MCC_CQ_LEN; -	pnob->mcc_cq_size = pnob->mcc_cq_len * sizeof(struct MCC_CQ_ENTRY_AMAP); -	pnob->mcc_cq = pci_alloc_consistent(adapter->pdev, pnob->mcc_cq_size, -				&pnob->mcc_cq_bus); -	if (!pnob->mcc_cq_bus) -		return -1; -	return 0; -} - -/* -    This function creates the MCC request and completion ring required -    for communicating with the ARM processor.  The caller must have -    allocated required amount of memory for the MCC ring and MCC -    completion ring and posted the virtual address and number of -    entries in the corresponding members (mcc_q and mcc_cq) in the -    NetObject struture. - -    When this call is completed, all further communication with -    ARM will switch from mailbox to this ring. - -    pnob	- Pointer to the NetObject structure. This NetObject should -		  have been created using a previous call to be_create_netobj() -*/ -int be_create_mcc_rings(struct be_net_object *pnob) -{ -	int status = 0; -	struct ring_desc rd; -	struct be_function_object *pfob = &pnob->fn_obj; - -	memset(&rd, 0, sizeof(struct ring_desc)); -	if (pnob->mcc_cq_len) { -		rd.va = pnob->mcc_cq; -		rd.pa = pnob->mcc_cq_bus; -		rd.length = pnob->mcc_cq_size; - -		status = be_cq_create(pfob, &rd, -			pnob->mcc_cq_len * sizeof(struct MCC_CQ_ENTRY_AMAP), -			false,	/* solicted events,  */ -			true,	/* nodelay  */ -			0,	/* 0 Watermark since Nodelay is true */ -			&pnob->event_q_obj, -			&pnob->mcc_cq_obj); - -		if (status != BE_SUCCESS) -			return status; - -		pnob->mcc_cq_id = pnob->mcc_cq_obj.cq_id; -		pnob->mcc_cq_created = 1; -	} -	if (pnob->mcc_q_len) { -		rd.va = pnob->mcc_q; -		rd.pa = pnob->mcc_q_bus; -		rd.length = pnob->mcc_q_size; - -		status = be_mcc_ring_create(pfob, &rd, -				pnob->mcc_q_len * sizeof(struct MCC_WRB_AMAP), -				pnob->mcc_wrb_ctxt, pnob->mcc_wrb_ctxtLen, -				&pnob->mcc_cq_obj, &pnob->mcc_q_obj); - -		if (status != BE_SUCCESS) -			return status; - -		pnob->mcc_q_created = 1; -	} -	return BE_SUCCESS; -} - -static int be_mcc_init(struct be_adapter *adapter) -{ -	u32 r; -	struct be_net_object *pnob; - -	pnob = adapter->net_obj; -	memset(pnob->mcc_q, 0, pnob->mcc_q_size); -	pnob->mcc_q_hd = 0; - -	memset(pnob->mcc_wrb_ctxt, 0, pnob->mcc_wrb_ctxt_size); - -	memset(pnob->mcc_cq, 0, pnob->mcc_cq_size); -	pnob->mcc_cq_tl = 0; - -	r = be_create_mcc_rings(adapter->net_obj); -	if (r != BE_SUCCESS) -		return -1; - -	return 0; -} - -static void be_remove(struct pci_dev *pdev) -{ -	struct be_net_object *pnob; -	struct be_adapter *adapter; - -	adapter = pci_get_drvdata(pdev); -	if (!adapter) -		return; - -	pci_set_drvdata(pdev, NULL); -	pnob = (struct be_net_object *)adapter->net_obj; - -	flush_scheduled_work(); - -	if (pnob) { -		/* Unregister async callback function for link status updates */ -		if (pnob->mcc_q_created) -			be_mcc_add_async_event_callback(&pnob->mcc_q_obj, -								NULL, NULL); -		netobject_cleanup(adapter, pnob); -	} - -	if (adapter->csr_va) -		iounmap(adapter->csr_va); -	if (adapter->db_va) -		iounmap(adapter->db_va); -	if (adapter->pci_va) -		iounmap(adapter->pci_va); - -	pci_release_regions(adapter->pdev); -	pci_disable_device(adapter->pdev); - -	kfree(adapter->be_link_sts); -	kfree(adapter->eth_statsp); - -	if (adapter->timer_ctxt.get_stats_timer.function) -		del_timer_sync(&adapter->timer_ctxt.get_stats_timer); -	kfree(adapter); -} - -/* - * This function is called by the PCI sub-system when it finds a PCI - * device with dev/vendor IDs that match with one of our devices. - * All of the driver initialization is done in this function. - */ -static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id) -{ -	int status = 0; -	struct be_adapter *adapter; -	struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD get_fwv; -	struct be_net_object *pnob; -	struct net_device *netdev; - -	status = pci_enable_device(pdev); -	if (status) -		goto error; - -	status = pci_request_regions(pdev, be_driver_name); -	if (status) -		goto error_pci_req; - -	pci_set_master(pdev); -	adapter = kzalloc(sizeof(struct be_adapter), GFP_KERNEL); -	if (adapter == NULL) { -		status = -ENOMEM; -		goto error_adapter; -	} -	adapter->dev_state = BE_DEV_STATE_NONE; -	adapter->pdev = pdev; -	pci_set_drvdata(pdev, adapter); - -	adapter->enable_aic = 1; -	adapter->max_eqd = MAX_EQD; -	adapter->min_eqd = 0; -	adapter->cur_eqd = 0; - -	status = pci_set_dma_mask(pdev, DMA_64BIT_MASK); -	if (!status) { -		adapter->dma_64bit_cap = true; -	} else { -		adapter->dma_64bit_cap = false; -		status = pci_set_dma_mask(pdev, DMA_32BIT_MASK); -		if (status != 0) { -			printk(KERN_ERR "Could not set PCI DMA Mask\n"); -			goto cleanup; -		} -	} - -	status = init_pci_be_function(adapter, pdev); -	if (status != 0) { -		printk(KERN_ERR "Failed to map PCI BARS\n"); -		status = -ENOMEM; -		goto cleanup; -	} - -	be_trace_set_level(DL_ALWAYS | DL_ERR); - -	adapter->be_link_sts = kmalloc(sizeof(struct BE_LINK_STATUS), -					GFP_KERNEL); -	if (adapter->be_link_sts == NULL) { -		printk(KERN_ERR "Memory allocation for link status " -		       "buffer failed\n"); -		goto cleanup; -	} -	spin_lock_init(&adapter->txq_lock); - -	netdev = alloc_etherdev(sizeof(struct be_net_object)); -	if (netdev == NULL) { -		status = -ENOMEM; -		goto cleanup; -	} -	pnob = netdev_priv(netdev); -	adapter->net_obj = pnob; -	adapter->netdevp = netdev; -	pnob->adapter = adapter; -	pnob->netdev = netdev; - -	status = be_nob_ring_alloc(adapter, pnob); -	if (status != 0) -		goto cleanup; - -	status = be_nob_ring_init(adapter, pnob); -	if (status != 0) -		goto cleanup; - -	be_rxf_mac_address_read_write(&pnob->fn_obj, false, false, false, -		false, false, netdev->dev_addr, NULL, NULL); - -	netdev->init = &benet_init; -	netif_carrier_off(netdev); -	netif_stop_queue(netdev); - -	SET_NETDEV_DEV(netdev, &(adapter->pdev->dev)); - -	netif_napi_add(netdev, &pnob->napi, be_poll, 64); - -	/* if the rx_frag size if 2K, one page is shared as two RX frags */ -	pnob->rx_pg_shared = -		(pnob->rx_buf_size <= PAGE_SIZE / 2) ? true : false; -	if (pnob->rx_buf_size != rxbuf_size) { -		printk(KERN_WARNING -		       "Could not set Rx buffer size to %d. Using %d\n", -				       rxbuf_size, pnob->rx_buf_size); -		rxbuf_size = pnob->rx_buf_size; -	} - -	tasklet_init(&(adapter->sts_handler), be_process_intr, -		     (unsigned long)adapter); -	adapter->tasklet_started = 1; -	spin_lock_init(&(adapter->int_lock)); - -	status = be_register_isr(adapter, pnob); -	if (status != 0) -		goto cleanup; - -	adapter->rx_csum = 1; -	adapter->max_rx_coal = BE_LRO_MAX_PKTS; - -	memset(&get_fwv, 0, -	       sizeof(struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD)); -	printk(KERN_INFO "BladeEngine Driver version:%s. " -	       "Copyright ServerEngines, Corporation 2005 - 2008\n", -			       be_drvr_ver); -	status = be_function_get_fw_version(&pnob->fn_obj, &get_fwv, NULL, -					    NULL); -	if (status == BE_SUCCESS) { -		strncpy(be_fw_ver, get_fwv.firmware_version_string, 32); -		printk(KERN_INFO "BladeEngine Firmware Version:%s\n", -		       get_fwv.firmware_version_string); -	} else { -		printk(KERN_WARNING "Unable to get BE Firmware Version\n"); -	} - -	sema_init(&adapter->get_eth_stat_sem, 0); -	init_timer(&adapter->timer_ctxt.get_stats_timer); -	atomic_set(&adapter->timer_ctxt.get_stat_flag, 0); -	adapter->timer_ctxt.get_stats_timer.function = -	    &be_get_stats_timer_handler; - -	status = be_mcc_create(adapter); -	if (status < 0) -		goto cleanup; -	status = be_mcc_init(adapter); -	if (status < 0) -		goto cleanup; - - -	status = be_mcc_add_async_event_callback(&adapter->net_obj->mcc_q_obj, -			 be_link_status_async_callback, (void *)adapter); -	if (status != BE_SUCCESS) { -		printk(KERN_WARNING "add_async_event_callback failed"); -		printk(KERN_WARNING -		       "Link status changes may not be reflected\n"); -	} - -	status = register_netdev(netdev); -	if (status != 0) -		goto cleanup; -	be_update_link_status(adapter); -	adapter->dev_state = BE_DEV_STATE_INIT; -	return 0; - -cleanup: -	be_remove(pdev); -	return status; -error_adapter: -	pci_release_regions(pdev); -error_pci_req: -	pci_disable_device(pdev); -error: -	printk(KERN_ERR "BladeEngine initalization failed\n"); -	return status; -} - -/* - * Get the current link status and print the status on console - */ -void be_update_link_status(struct be_adapter *adapter) -{ -	int status; -	struct be_net_object *pnob = adapter->net_obj; - -	status = be_rxf_link_status(&pnob->fn_obj, adapter->be_link_sts, NULL, -			NULL, NULL); -	if (status == BE_SUCCESS) { -		if (adapter->be_link_sts->mac0_speed && -		    adapter->be_link_sts->mac0_duplex) -			adapter->port0_link_sts = BE_PORT_LINK_UP; -		else -			adapter->port0_link_sts = BE_PORT_LINK_DOWN; - -		if (adapter->be_link_sts->mac1_speed && -		    adapter->be_link_sts->mac1_duplex) -			adapter->port1_link_sts = BE_PORT_LINK_UP; -		else -			adapter->port1_link_sts = BE_PORT_LINK_DOWN; - -		dev_info(&pnob->netdev->dev, "Link Properties:\n"); -		be_print_link_info(adapter->be_link_sts); -		return; -	} -	dev_info(&pnob->netdev->dev, "Could not get link status\n"); -	return; -} - - -#ifdef CONFIG_PM -static void -be_pm_cleanup(struct be_adapter *adapter, -	      struct be_net_object *pnob, struct net_device *netdev) -{ -	netif_carrier_off(netdev); -	netif_stop_queue(netdev); - -	be_wait_nic_tx_cmplx_cmpl(pnob); -	be_disable_eq_intr(pnob); - -	if (adapter->tasklet_started) { -		tasklet_kill(&adapter->sts_handler); -		adapter->tasklet_started = 0; -	} - -	be_unregister_isr(adapter); -	be_disable_intr(pnob); - -	be_tx_q_clean(pnob); -	be_rx_q_clean(pnob); - -	be_destroy_netobj(pnob); -} - -static int be_suspend(struct pci_dev *pdev, pm_message_t state) -{ -	struct be_adapter *adapter = pci_get_drvdata(pdev); -	struct net_device *netdev =  adapter->netdevp; -	struct be_net_object *pnob = netdev_priv(netdev); - -	adapter->dev_pm_state = adapter->dev_state; -	adapter->dev_state = BE_DEV_STATE_SUSPEND; - -	netif_device_detach(netdev); -	if (netif_running(netdev)) -		be_pm_cleanup(adapter, pnob, netdev); - -	pci_enable_wake(pdev, 3, 1); -	pci_enable_wake(pdev, 4, 1);	/* D3 Cold = 4 */ -	pci_save_state(pdev); -	pci_disable_device(pdev); -	pci_set_power_state(pdev, pci_choose_state(pdev, state)); -	return 0; -} - -static void be_up(struct be_adapter *adapter) -{ -	struct be_net_object *pnob = adapter->net_obj; - -	if (pnob->num_vlans != 0) -		be_rxf_vlan_config(&pnob->fn_obj, false, pnob->num_vlans, -			pnob->vlan_tag, NULL, NULL, NULL); - -} - -static int be_resume(struct pci_dev *pdev) -{ -	int status = 0; -	struct be_adapter *adapter = pci_get_drvdata(pdev); -	struct net_device *netdev =  adapter->netdevp; -	struct be_net_object *pnob = netdev_priv(netdev); - -	netif_device_detach(netdev); - -	status = pci_enable_device(pdev); -	if (status) -		return status; - -	pci_set_power_state(pdev, 0); -	pci_restore_state(pdev); -	pci_enable_wake(pdev, 3, 0); -	pci_enable_wake(pdev, 4, 0);	/* 4 is D3 cold */ - -	netif_carrier_on(netdev); -	netif_start_queue(netdev); - -	if (netif_running(netdev)) { -		be_rxf_mac_address_read_write(&pnob->fn_obj, false, false, -			false, true, false, netdev->dev_addr, NULL, NULL); - -		status = be_nob_ring_init(adapter, pnob); -		if (status < 0) -			return status; - -		tasklet_init(&(adapter->sts_handler), be_process_intr, -			     (unsigned long)adapter); -		adapter->tasklet_started = 1; - -		if (be_register_isr(adapter, pnob) != 0) { -			printk(KERN_ERR "be_register_isr failed\n"); -			return status; -		} - - -		status = be_mcc_init(adapter); -		if (status < 0) { -			printk(KERN_ERR "be_mcc_init failed\n"); -			return status; -		} -		be_update_link_status(adapter); -		/* -		 * Register async call back function to handle link -		 * status updates -		 */ -		status = be_mcc_add_async_event_callback( -				&adapter->net_obj->mcc_q_obj, -				be_link_status_async_callback, (void *)adapter); -		if (status != BE_SUCCESS) { -			printk(KERN_WARNING "add_async_event_callback failed"); -			printk(KERN_WARNING -			       "Link status changes may not be reflected\n"); -		} -		be_enable_intr(pnob); -		be_enable_eq_intr(pnob); -		be_up(adapter); -	} -	netif_device_attach(netdev); -	adapter->dev_state = adapter->dev_pm_state; -	return 0; - -} - -#endif - -/* Wait until no more pending transmits  */ -void be_wait_nic_tx_cmplx_cmpl(struct be_net_object *pnob) -{ -	int i; - -	/* Wait for 20us * 50000 (= 1s) and no more */ -	i = 0; -	while ((pnob->tx_q_tl != pnob->tx_q_hd) && (i < 50000)) { -		++i; -		udelay(20); -	} - -	/* Check for no more pending transmits */ -	if (i >= 50000) { -		printk(KERN_WARNING -		       "Did not receive completions for all TX requests\n"); -	} -} - -static struct pci_driver be_driver = { -	.name = be_driver_name, -	.id_table = be_device_id_table, -	.probe = be_probe, -#ifdef CONFIG_PM -	.suspend = be_suspend, -	.resume = be_resume, -#endif -	.remove = be_remove -}; - -/* - * Module init entry point. Registers our our device and return. - * Our probe will be called if the device is found. - */ -static int __init be_init_module(void) -{ -	int ret; - -	if (rxbuf_size != 8192 && rxbuf_size != 4096 && rxbuf_size != 2048) { -		printk(KERN_WARNING -		       "Unsupported receive buffer size (%d) requested\n", -		       rxbuf_size); -		printk(KERN_WARNING -		       "Must be 2048, 4096 or 8192. Defaulting to 2048\n"); -		rxbuf_size = 2048; -	} - -	ret = pci_register_driver(&be_driver); - -	return ret; -} - -module_init(be_init_module); - -/* - * be_exit_module - Driver Exit Cleanup Routine - */ -static void __exit be_exit_module(void) -{ -	pci_unregister_driver(&be_driver); -} - -module_exit(be_exit_module); diff --git a/drivers/staging/benet/be_int.c b/drivers/staging/benet/be_int.c deleted file mode 100644 index cba95d09a8b..00000000000 --- a/drivers/staging/benet/be_int.c +++ /dev/null @@ -1,863 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#include <linux/if_vlan.h> -#include <linux/inet_lro.h> - -#include "benet.h" - -/* number of bytes of RX frame that are copied to skb->data */ -#define BE_HDR_LEN 64 - -#define NETIF_RX(skb) netif_receive_skb(skb) -#define VLAN_ACCEL_RX(skb, pnob, vt) \ -		vlan_hwaccel_rx(skb, pnob->vlan_grp, vt) - -/* -    This function notifies BladeEngine of the number of completion -    entries processed from the specified completion queue by writing -    the number of popped entries to the door bell. - -    pnob	- Pointer to the NetObject structure -    n		- Number of completion entries processed -    cq_id	- Queue ID of the completion queue for which notification -			is being done. -    re_arm	- 1  - rearm the completion ring to generate an event. -		- 0  - dont rearm the completion ring to generate an event -*/ -void be_notify_cmpl(struct be_net_object *pnob, int n, int cq_id, int re_arm) -{ -	struct CQ_DB_AMAP cqdb; - -	cqdb.dw[0] = 0; -	AMAP_SET_BITS_PTR(CQ_DB, qid, &cqdb, cq_id); -	AMAP_SET_BITS_PTR(CQ_DB, rearm, &cqdb, re_arm); -	AMAP_SET_BITS_PTR(CQ_DB, num_popped, &cqdb, n); -	PD_WRITE(&pnob->fn_obj, cq_db, cqdb.dw[0]); -} - -/* - * adds additional receive frags indicated by BE starting from given - * frag index (fi) to specified skb's frag list - */ -static void -add_skb_frags(struct be_net_object *pnob, struct sk_buff *skb, -	      u32 nresid, u32 fi) -{ -	struct be_adapter *adapter = pnob->adapter; -	u32 sk_frag_idx, n; -	struct be_rx_page_info *rx_page_info; -	u32 frag_sz = pnob->rx_buf_size; - -	sk_frag_idx = skb_shinfo(skb)->nr_frags; -	while (nresid) { -		index_inc(&fi, pnob->rx_q_len); - -		rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi]; -		pnob->rx_ctxt[fi] = NULL; -		if ((rx_page_info->page_offset) || -		    (pnob->rx_pg_shared == false)) { -			pci_unmap_page(adapter->pdev, -				       pci_unmap_addr(rx_page_info, bus), -				       frag_sz, PCI_DMA_FROMDEVICE); -		} - -		n = min(nresid, frag_sz); -		skb_shinfo(skb)->frags[sk_frag_idx].page = rx_page_info->page; -		skb_shinfo(skb)->frags[sk_frag_idx].page_offset -		    = rx_page_info->page_offset; -		skb_shinfo(skb)->frags[sk_frag_idx].size = n; - -		sk_frag_idx++; -		skb->len += n; -		skb->data_len += n; -		skb_shinfo(skb)->nr_frags++; -		nresid -= n; - -		memset(rx_page_info, 0, sizeof(struct be_rx_page_info)); -		atomic_dec(&pnob->rx_q_posted); -	} -} - -/* - * This function processes incoming nic packets over various Rx queues. - * This function takes the adapter, the current Rx status descriptor - * entry and the Rx completion queue ID as argument. - */ -static inline int process_nic_rx_completion(struct be_net_object *pnob, -					    struct ETH_RX_COMPL_AMAP *rxcp) -{ -	struct be_adapter *adapter = pnob->adapter; -	struct sk_buff *skb; -	int udpcksm, tcpcksm; -	int n; -	u32 nresid, fi; -	u32 frag_sz = pnob->rx_buf_size; -	u8 *va; -	struct be_rx_page_info *rx_page_info; -	u32 numfrags, vtp, vtm, vlan_tag, pktsize; - -	fi = AMAP_GET_BITS_PTR(ETH_RX_COMPL, fragndx, rxcp); -	BUG_ON(fi >= (int)pnob->rx_q_len); -	BUG_ON(fi < 0); - -	rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi]; -	BUG_ON(!rx_page_info->page); -	pnob->rx_ctxt[fi] = NULL; - -	/* -	 * If one page is used per fragment or if this is the second half of -	 *  of the page, unmap the page here -	 */ -	if ((rx_page_info->page_offset) || (pnob->rx_pg_shared == false)) { -		pci_unmap_page(adapter->pdev, -			       pci_unmap_addr(rx_page_info, bus), frag_sz, -			       PCI_DMA_FROMDEVICE); -	} - -	atomic_dec(&pnob->rx_q_posted); -	udpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, udpcksm, rxcp); -	tcpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, tcpcksm, rxcp); -	pktsize = AMAP_GET_BITS_PTR(ETH_RX_COMPL, pktsize, rxcp); -	/* -	 * get rid of RX flush completions first. -	 */ -	if ((tcpcksm) && (udpcksm) && (pktsize == 32)) { -		put_page(rx_page_info->page); -		memset(rx_page_info, 0, sizeof(struct be_rx_page_info)); -		return 0; -	} -	skb = netdev_alloc_skb(pnob->netdev, BE_HDR_LEN + NET_IP_ALIGN); -	if (skb == NULL) { -		dev_info(&pnob->netdev->dev, "alloc_skb() failed\n"); -		put_page(rx_page_info->page); -		memset(rx_page_info, 0, sizeof(struct be_rx_page_info)); -		goto free_frags; -	} -	skb_reserve(skb, NET_IP_ALIGN); - -	skb->dev = pnob->netdev; - -	n = min(pktsize, frag_sz); - -	va = page_address(rx_page_info->page) + rx_page_info->page_offset; -	prefetch(va); - -	skb->len = n; -	skb->data_len = n; -	if (n <= BE_HDR_LEN) { -		memcpy(skb->data, va, n); -		put_page(rx_page_info->page); -		skb->data_len -= n; -		skb->tail += n; -	} else { - -		/* Setup the SKB with page buffer information */ -		skb_shinfo(skb)->frags[0].page = rx_page_info->page; -		skb_shinfo(skb)->nr_frags++; - -		/* Copy the header into the skb_data */ -		memcpy(skb->data, va, BE_HDR_LEN); -		skb_shinfo(skb)->frags[0].page_offset = -		    rx_page_info->page_offset + BE_HDR_LEN; -		skb_shinfo(skb)->frags[0].size = n - BE_HDR_LEN; -		skb->data_len -= BE_HDR_LEN; -		skb->tail += BE_HDR_LEN; -	} -	memset(rx_page_info, 0, sizeof(struct be_rx_page_info)); -	nresid = pktsize - n; - -	skb->protocol = eth_type_trans(skb, pnob->netdev); - -	if ((tcpcksm || udpcksm) && adapter->rx_csum) -		skb->ip_summed = CHECKSUM_UNNECESSARY; -	else -		skb->ip_summed = CHECKSUM_NONE; -	/* -	 * if we have more bytes left, the frame has been -	 * given to us in multiple fragments.  This happens -	 * with Jumbo frames. Add the remaining fragments to -	 * skb->frags[] array. -	 */ -	if (nresid) -		add_skb_frags(pnob, skb, nresid, fi); - -	/* update the the true size of the skb. */ -	skb->truesize = skb->len + sizeof(struct sk_buff); - -	/* -	 * If a 802.3 frame or 802.2 LLC frame -	 * (i.e) contains length field in MAC Hdr -	 * and frame len is greater than 64 bytes -	 */ -	if (((skb->protocol == ntohs(ETH_P_802_2)) || -	     (skb->protocol == ntohs(ETH_P_802_3))) -	    && (pktsize > BE_HDR_LEN)) { -		/* -		 * If the length given in Mac Hdr is less than frame size -		 * Erraneous frame, Drop it -		 */ -		if ((ntohs(*(u16 *) (va + 12)) + ETH_HLEN) < pktsize) { -			/* Increment Non Ether type II frames dropped */ -			adapter->be_stat.bes_802_3_dropped_frames++; - -			kfree_skb(skb); -			return 0; -		} -		/* -		 * else if the length given in Mac Hdr is greater than -		 * frame size, should not be seeing this sort of frames -		 * dump the pkt and pass to stack -		 */ -		else if ((ntohs(*(u16 *) (va + 12)) + ETH_HLEN) > pktsize) { -			/* Increment Non Ether type II frames malformed */ -			adapter->be_stat.bes_802_3_malformed_frames++; -		} -	} - -	vtp = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtp, rxcp); -	vtm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtm, rxcp); -	if (vtp && vtm) { -		/* Vlan tag present in pkt and BE found -		 * that the tag matched an entry in VLAN table -		 */ -		if (!pnob->vlan_grp || pnob->num_vlans == 0) { -			/* But we have no VLANs configured. -			 * This should never happen.  Drop the packet. -			 */ -			dev_info(&pnob->netdev->dev, -			       "BladeEngine: Unexpected vlan tagged packet\n"); -			kfree_skb(skb); -			return 0; -		} -		/* pass the VLAN packet to stack */ -		vlan_tag = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vlan_tag, rxcp); -		VLAN_ACCEL_RX(skb, pnob, be16_to_cpu(vlan_tag)); - -	} else { -		NETIF_RX(skb); -	} -	return 0; - -free_frags: -	/* free all frags associated with the current rxcp */ -	numfrags = AMAP_GET_BITS_PTR(ETH_RX_COMPL, numfrags, rxcp); -	while (numfrags-- > 1) { -		index_inc(&fi, pnob->rx_q_len); - -		rx_page_info = (struct be_rx_page_info *) -		    pnob->rx_ctxt[fi]; -		pnob->rx_ctxt[fi] = (void *)NULL; -		if (rx_page_info->page_offset || !pnob->rx_pg_shared) { -			pci_unmap_page(adapter->pdev, -				       pci_unmap_addr(rx_page_info, bus), -				       frag_sz, PCI_DMA_FROMDEVICE); -		} - -		put_page(rx_page_info->page); -		memset(rx_page_info, 0, sizeof(struct be_rx_page_info)); -		atomic_dec(&pnob->rx_q_posted); -	} -	return -ENOMEM; -} - -static void process_nic_rx_completion_lro(struct be_net_object *pnob, -					  struct ETH_RX_COMPL_AMAP *rxcp) -{ -	struct be_adapter *adapter = pnob->adapter; -	struct skb_frag_struct rx_frags[BE_MAX_FRAGS_PER_FRAME]; -	unsigned int udpcksm, tcpcksm; -	u32 numfrags, vlanf, vtm, vlan_tag, nresid; -	u16 vlant; -	unsigned int fi, idx, n; -	struct be_rx_page_info *rx_page_info; -	u32 frag_sz = pnob->rx_buf_size, pktsize; -	bool rx_coal = (adapter->max_rx_coal <= 1) ? 0 : 1; -	u8 err, *va; -	__wsum csum = 0; - -	if (AMAP_GET_BITS_PTR(ETH_RX_COMPL, ipsec, rxcp)) { -		/*  Drop the pkt and move to the next completion.  */ -		adapter->be_stat.bes_rx_misc_pkts++; -		return; -	} -	err = AMAP_GET_BITS_PTR(ETH_RX_COMPL, err, rxcp); -	if (err || !rx_coal) { -		/* We won't coalesce Rx pkts if the err bit set. -		 * take the path of normal completion processing */ -		process_nic_rx_completion(pnob, rxcp); -		return; -	} - -	fi = AMAP_GET_BITS_PTR(ETH_RX_COMPL, fragndx, rxcp); -	BUG_ON(fi >= (int)pnob->rx_q_len); -	BUG_ON(fi < 0); -	rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi]; -	BUG_ON(!rx_page_info->page); -	pnob->rx_ctxt[fi] = (void *)NULL; -	/*  If one page is used per fragment or if this is the -	 * second half of the page, unmap the page here -	 */ -	if (rx_page_info->page_offset || !pnob->rx_pg_shared) { -		pci_unmap_page(adapter->pdev, -			       pci_unmap_addr(rx_page_info, bus), -			       frag_sz, PCI_DMA_FROMDEVICE); -	} - -	numfrags = AMAP_GET_BITS_PTR(ETH_RX_COMPL, numfrags, rxcp); -	udpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, udpcksm, rxcp); -	tcpcksm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, tcpcksm, rxcp); -	vlan_tag = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vlan_tag, rxcp); -	vlant = be16_to_cpu(vlan_tag); -	vlanf = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtp, rxcp); -	vtm = AMAP_GET_BITS_PTR(ETH_RX_COMPL, vtm, rxcp); -	pktsize = AMAP_GET_BITS_PTR(ETH_RX_COMPL, pktsize, rxcp); - -	atomic_dec(&pnob->rx_q_posted); - -	if (tcpcksm && udpcksm && pktsize == 32) { -		/* flush completion entries */ -		put_page(rx_page_info->page); -		memset(rx_page_info, 0, sizeof(struct be_rx_page_info)); -		return; -	} -	/* Only one of udpcksum and tcpcksum can be set */ -	BUG_ON(udpcksm && tcpcksm); - -	/* jumbo frames could come in multiple fragments */ -	BUG_ON(numfrags != ((pktsize + (frag_sz - 1)) / frag_sz)); -	n = min(pktsize, frag_sz); -	nresid = pktsize - n;	/* will be useful for jumbo pkts */ -	idx = 0; - -	va = page_address(rx_page_info->page) + rx_page_info->page_offset; -	prefetch(va); -	rx_frags[idx].page = rx_page_info->page; -	rx_frags[idx].page_offset = (rx_page_info->page_offset); -	rx_frags[idx].size = n; -	memset(rx_page_info, 0, sizeof(struct be_rx_page_info)); - -	/* If we got multiple fragments, we have more data. */ -	while (nresid) { -		idx++; -		index_inc(&fi, pnob->rx_q_len); - -		rx_page_info = (struct be_rx_page_info *)pnob->rx_ctxt[fi]; -		pnob->rx_ctxt[fi] = (void *)NULL; -		if (rx_page_info->page_offset || !pnob->rx_pg_shared) { -			pci_unmap_page(adapter->pdev, -				       pci_unmap_addr(rx_page_info, bus), -				       frag_sz, PCI_DMA_FROMDEVICE); -		} - -		n = min(nresid, frag_sz); -		rx_frags[idx].page = rx_page_info->page; -		rx_frags[idx].page_offset = (rx_page_info->page_offset); -		rx_frags[idx].size = n; - -		nresid -= n; -		memset(rx_page_info, 0, sizeof(struct be_rx_page_info)); -		atomic_dec(&pnob->rx_q_posted); -	} - -	if (likely(!(vlanf && vtm))) { -		lro_receive_frags(&pnob->lro_mgr, rx_frags, -				  pktsize, pktsize, -				  (void *)(unsigned long)csum, csum); -	} else { -		/* Vlan tag present in pkt and BE found -		 * that the tag matched an entry in VLAN table -		 */ -		if (unlikely(!pnob->vlan_grp || pnob->num_vlans == 0)) { -			/* But we have no VLANs configured. -			 * This should never happen.  Drop the packet. -			 */ -			dev_info(&pnob->netdev->dev, -			       "BladeEngine: Unexpected vlan tagged packet\n"); -			return; -		} -		/* pass the VLAN packet to stack */ -		lro_vlan_hwaccel_receive_frags(&pnob->lro_mgr, -					       rx_frags, pktsize, pktsize, -					       pnob->vlan_grp, vlant, -					       (void *)(unsigned long)csum, -					       csum); -	} - -	adapter->be_stat.bes_rx_coal++; -} - -struct ETH_RX_COMPL_AMAP *be_get_rx_cmpl(struct be_net_object *pnob) -{ -	struct ETH_RX_COMPL_AMAP *rxcp = &pnob->rx_cq[pnob->rx_cq_tl]; -	u32 valid, ct; - -	valid = AMAP_GET_BITS_PTR(ETH_RX_COMPL, valid, rxcp); -	if (valid == 0) -		return NULL; - -	ct = AMAP_GET_BITS_PTR(ETH_RX_COMPL, ct, rxcp); -	if (ct != 0) { -		/* Invalid chute #. treat as error */ -		AMAP_SET_BITS_PTR(ETH_RX_COMPL, err, rxcp, 1); -	} - -	be_adv_rxcq_tl(pnob); -	AMAP_SET_BITS_PTR(ETH_RX_COMPL, valid, rxcp, 0); -	return rxcp; -} - -static void update_rx_rate(struct be_adapter *adapter) -{ -	/* update the rate once in two seconds */ -	if ((jiffies - adapter->eth_rx_jiffies) > 2 * (HZ)) { -		u32 r; -		r = adapter->eth_rx_bytes / -		    ((jiffies - adapter->eth_rx_jiffies) / (HZ)); -		r = (r / 1000000);	/* MB/Sec */ - -		/* Mega Bits/Sec */ -		adapter->be_stat.bes_eth_rx_rate = (r * 8); -		adapter->eth_rx_jiffies = jiffies; -		adapter->eth_rx_bytes = 0; -	} -} - -static int process_rx_completions(struct be_net_object *pnob, int max_work) -{ -	struct be_adapter *adapter = pnob->adapter; -	struct ETH_RX_COMPL_AMAP *rxcp; -	u32 nc = 0; -	unsigned int pktsize; - -	while (max_work && (rxcp = be_get_rx_cmpl(pnob))) { -		prefetch(rxcp); -		pktsize = AMAP_GET_BITS_PTR(ETH_RX_COMPL, pktsize, rxcp); -		process_nic_rx_completion_lro(pnob, rxcp); -		adapter->eth_rx_bytes += pktsize; -		update_rx_rate(adapter); -		nc++; -		max_work--; -		adapter->be_stat.bes_rx_compl++; -	} -	if (likely(adapter->max_rx_coal > 1)) { -		adapter->be_stat.bes_rx_flush++; -		lro_flush_all(&pnob->lro_mgr); -	} - -	/* Refill the queue */ -	if (atomic_read(&pnob->rx_q_posted) < 900) -		be_post_eth_rx_buffs(pnob); - -	return nc; -} - -static struct ETH_TX_COMPL_AMAP *be_get_tx_cmpl(struct be_net_object *pnob) -{ -	struct ETH_TX_COMPL_AMAP *txcp = &pnob->tx_cq[pnob->tx_cq_tl]; -	u32 valid; - -	valid = AMAP_GET_BITS_PTR(ETH_TX_COMPL, valid, txcp); -	if (valid == 0) -		return NULL; - -	AMAP_SET_BITS_PTR(ETH_TX_COMPL, valid, txcp, 0); -	be_adv_txcq_tl(pnob); -	return txcp; - -} - -void process_one_tx_compl(struct be_net_object *pnob, u32 end_idx) -{ -	struct be_adapter *adapter = pnob->adapter; -	int cur_index, tx_wrbs_completed = 0; -	struct sk_buff *skb; -	u64 busaddr, pa, pa_lo, pa_hi; -	struct ETH_WRB_AMAP *wrb; -	u32 frag_len, last_index, j; - -	last_index = tx_compl_lastwrb_idx_get(pnob); -	BUG_ON(last_index != end_idx); -	pnob->tx_ctxt[pnob->tx_q_tl] = NULL; -	do { -		cur_index = pnob->tx_q_tl; -		wrb = &pnob->tx_q[cur_index]; -		pa_hi = AMAP_GET_BITS_PTR(ETH_WRB, frag_pa_hi, wrb); -		pa_lo = AMAP_GET_BITS_PTR(ETH_WRB, frag_pa_lo, wrb); -		frag_len = AMAP_GET_BITS_PTR(ETH_WRB, frag_len, wrb); -		busaddr = (pa_hi << 32) | pa_lo; -		if (busaddr != 0) { -			pa = le64_to_cpu(busaddr); -			pci_unmap_single(adapter->pdev, pa, -					 frag_len, PCI_DMA_TODEVICE); -		} -		if (cur_index == last_index) { -			skb = (struct sk_buff *)pnob->tx_ctxt[cur_index]; -			BUG_ON(!skb); -			for (j = 0; j < skb_shinfo(skb)->nr_frags; j++) { -				struct skb_frag_struct *frag; -				frag = &skb_shinfo(skb)->frags[j]; -				pci_unmap_page(adapter->pdev, -					       (ulong) frag->page, frag->size, -					       PCI_DMA_TODEVICE); -			} -			kfree_skb(skb); -			pnob->tx_ctxt[cur_index] = NULL; -		} else { -			BUG_ON(pnob->tx_ctxt[cur_index]); -		} -		tx_wrbs_completed++; -		be_adv_txq_tl(pnob); -	} while (cur_index != last_index); -	atomic_sub(tx_wrbs_completed, &pnob->tx_q_used); -} - -/* there is no need to take an SMP lock here since currently - * we have only one instance of the tasklet that does completion - * processing. - */ -static void process_nic_tx_completions(struct be_net_object *pnob) -{ -	struct be_adapter *adapter = pnob->adapter; -	struct ETH_TX_COMPL_AMAP *txcp; -	struct net_device *netdev = pnob->netdev; -	u32 end_idx, num_processed = 0; - -	adapter->be_stat.bes_tx_events++; - -	while ((txcp = be_get_tx_cmpl(pnob))) { -		end_idx = AMAP_GET_BITS_PTR(ETH_TX_COMPL, wrb_index, txcp); -		process_one_tx_compl(pnob, end_idx); -		num_processed++; -		adapter->be_stat.bes_tx_compl++; -	} -	be_notify_cmpl(pnob, num_processed, pnob->tx_cq_id, 1); -	/* -	 * We got Tx completions and have usable WRBs. -	 * If the netdev's queue has been stopped -	 * because we had run out of WRBs, wake it now. -	 */ -	spin_lock(&adapter->txq_lock); -	if (netif_queue_stopped(netdev) -	    && atomic_read(&pnob->tx_q_used) < pnob->tx_q_len / 2) { -		netif_wake_queue(netdev); -	} -	spin_unlock(&adapter->txq_lock); -} - -static u32 post_rx_buffs(struct be_net_object *pnob, struct list_head *rxbl) -{ -	u32 nposted = 0; -	struct ETH_RX_D_AMAP *rxd = NULL; -	struct be_recv_buffer *rxbp; -	void **rx_ctxp; -	struct RQ_DB_AMAP rqdb; - -	rx_ctxp = pnob->rx_ctxt; - -	while (!list_empty(rxbl) && -	       (rx_ctxp[pnob->rx_q_hd] == NULL) && nposted < 255) { - -		rxbp = list_first_entry(rxbl, struct be_recv_buffer, rxb_list); -		list_del(&rxbp->rxb_list); -		rxd = pnob->rx_q + pnob->rx_q_hd; -		AMAP_SET_BITS_PTR(ETH_RX_D, fragpa_lo, rxd, rxbp->rxb_pa_lo); -		AMAP_SET_BITS_PTR(ETH_RX_D, fragpa_hi, rxd, rxbp->rxb_pa_hi); - -		rx_ctxp[pnob->rx_q_hd] = rxbp->rxb_ctxt; -		be_adv_rxq_hd(pnob); -		nposted++; -	} - -	if (nposted) { -		/* Now press the door bell to notify BladeEngine. */ -		rqdb.dw[0] = 0; -		AMAP_SET_BITS_PTR(RQ_DB, numPosted, &rqdb, nposted); -		AMAP_SET_BITS_PTR(RQ_DB, rq, &rqdb, pnob->rx_q_id); -		PD_WRITE(&pnob->fn_obj, erx_rq_db, rqdb.dw[0]); -	} -	atomic_add(nposted, &pnob->rx_q_posted); -	return nposted; -} - -void be_post_eth_rx_buffs(struct be_net_object *pnob) -{ -	struct be_adapter *adapter = pnob->adapter; -	u32 num_bufs, r; -	u64 busaddr = 0, tmp_pa; -	u32 max_bufs, pg_hd; -	u32 frag_size; -	struct be_recv_buffer *rxbp; -	struct list_head rxbl; -	struct be_rx_page_info *rx_page_info; -	struct page *page = NULL; -	u32 page_order = 0; -	gfp_t alloc_flags = GFP_ATOMIC; - -	BUG_ON(!adapter); - -	max_bufs = 64;		/* should be even # <= 255. */ - -	frag_size = pnob->rx_buf_size; -	page_order = get_order(frag_size); - -	if (frag_size == 8192) -		alloc_flags |= (gfp_t) __GFP_COMP; -	/* -	 * Form a linked list of RECV_BUFFFER structure to be be posted. -	 * We will post even number of buffer so that pages can be -	 * shared. -	 */ -	INIT_LIST_HEAD(&rxbl); - -	for (num_bufs = 0; num_bufs < max_bufs && -		!pnob->rx_page_info[pnob->rx_pg_info_hd].page; ++num_bufs) { - -		rxbp = &pnob->eth_rx_bufs[num_bufs]; -		pg_hd = pnob->rx_pg_info_hd; -		rx_page_info = &pnob->rx_page_info[pg_hd]; - -		if (!page) { -			page = alloc_pages(alloc_flags, page_order); -			if (unlikely(page == NULL)) { -				adapter->be_stat.bes_ethrx_post_fail++; -				pnob->rxbuf_post_fail++; -				break; -			} -			pnob->rxbuf_post_fail = 0; -			busaddr = pci_map_page(adapter->pdev, page, 0, -					       frag_size, PCI_DMA_FROMDEVICE); -			rx_page_info->page_offset = 0; -			rx_page_info->page = page; -			/* -			 * If we are sharing a page among two skbs, -			 * alloc a new one on the next iteration -			 */ -			if (pnob->rx_pg_shared == false) -				page = NULL; -		} else { -			get_page(page); -			rx_page_info->page_offset += frag_size; -			rx_page_info->page = page; -			/* -			 * We are finished with the alloced page, -			 * Alloc a new one on the next iteration -			 */ -			page = NULL; -		} -		rxbp->rxb_ctxt = (void *)rx_page_info; -		index_inc(&pnob->rx_pg_info_hd, pnob->rx_q_len); - -		pci_unmap_addr_set(rx_page_info, bus, busaddr); -		tmp_pa = busaddr + rx_page_info->page_offset; -		rxbp->rxb_pa_lo = (tmp_pa & 0xFFFFFFFF); -		rxbp->rxb_pa_hi = (tmp_pa >> 32); -		rxbp->rxb_len = frag_size; -		list_add_tail(&rxbp->rxb_list, &rxbl); -	}			/* End of for */ - -	r = post_rx_buffs(pnob, &rxbl); -	BUG_ON(r != num_bufs); -	return; -} - -/* - * Interrupt service for network function.  We just schedule the - * tasklet which does all completion processing. - */ -irqreturn_t be_int(int irq, void *dev) -{ -	struct net_device *netdev = dev; -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; -	u32 isr; - -	isr = CSR_READ(&pnob->fn_obj, cev.isr1); -	if (unlikely(!isr)) -		return IRQ_NONE; - -	spin_lock(&adapter->int_lock); -	adapter->isr |= isr; -	spin_unlock(&adapter->int_lock); - -	adapter->be_stat.bes_ints++; - -	tasklet_schedule(&adapter->sts_handler); -	return IRQ_HANDLED; -} - -/* - * Poll function called by NAPI with a work budget. - * We process as many UC. BC and MC receive completions - * as the budget allows and return the actual number of - * RX ststutses processed. - */ -int be_poll(struct napi_struct *napi, int budget) -{ -	struct be_net_object *pnob = -			container_of(napi, struct be_net_object, napi); -	u32 work_done; - -	pnob->adapter->be_stat.bes_polls++; -	work_done = process_rx_completions(pnob, budget); -	BUG_ON(work_done > budget); - -	/* All consumed */ -	if (work_done < budget) { -		netif_rx_complete(napi); -		/* enable intr */ -		be_notify_cmpl(pnob, work_done, pnob->rx_cq_id, 1); -	} else { -		/* More to be consumed; continue with interrupts disabled */ -		be_notify_cmpl(pnob, work_done, pnob->rx_cq_id, 0); -	} -	return work_done; -} - -static struct EQ_ENTRY_AMAP *get_event(struct be_net_object *pnob) -{ -	struct EQ_ENTRY_AMAP *eqp = &(pnob->event_q[pnob->event_q_tl]); -	if (!AMAP_GET_BITS_PTR(EQ_ENTRY, Valid, eqp)) -		return NULL; -	be_adv_eq_tl(pnob); -	return eqp; -} - -/* - * Processes all valid events in the event ring associated with given - * NetObject.  Also, notifies BE the number of events processed. - */ -static inline u32 process_events(struct be_net_object *pnob) -{ -	struct be_adapter *adapter = pnob->adapter; -	struct EQ_ENTRY_AMAP *eqp; -	u32 rid, num_events = 0; -	struct net_device *netdev = pnob->netdev; - -	while ((eqp = get_event(pnob)) != NULL) { -		adapter->be_stat.bes_events++; -		rid = AMAP_GET_BITS_PTR(EQ_ENTRY, ResourceID, eqp); -		if (rid == pnob->rx_cq_id) { -			adapter->be_stat.bes_rx_events++; -			netif_rx_schedule(&pnob->napi); -		} else if (rid == pnob->tx_cq_id) { -			process_nic_tx_completions(pnob); -		} else if (rid == pnob->mcc_cq_id) { -			be_mcc_process_cq(&pnob->mcc_q_obj, 1); -		} else { -			dev_info(&netdev->dev, -					"Invalid EQ ResourceID %d\n", rid); -		} -		AMAP_SET_BITS_PTR(EQ_ENTRY, Valid, eqp, 0); -		AMAP_SET_BITS_PTR(EQ_ENTRY, ResourceID, eqp, 0); -		num_events++; -	} -	return num_events; -} - -static void update_eqd(struct be_adapter *adapter, struct be_net_object *pnob) -{ -	int status; -	struct be_eq_object *eq_objectp; - -	/* update once a second */ -	if ((jiffies - adapter->ips_jiffies) > 1 * (HZ)) { -		/* One second elapsed since last update  */ -		u32 r, new_eqd = -1; -		r = adapter->be_stat.bes_ints - adapter->be_stat.bes_prev_ints; -		r = r / ((jiffies - adapter->ips_jiffies) / (HZ)); -		adapter->be_stat.bes_ips = r; -		adapter->ips_jiffies = jiffies; -		adapter->be_stat.bes_prev_ints = adapter->be_stat.bes_ints; -		if (r > IPS_HI_WM && adapter->cur_eqd < adapter->max_eqd) -			new_eqd = (adapter->cur_eqd + 8); -		if (r < IPS_LO_WM && adapter->cur_eqd > adapter->min_eqd) -			new_eqd = (adapter->cur_eqd - 8); -		if (adapter->enable_aic && new_eqd != -1) { -			eq_objectp = &pnob->event_q_obj; -			status = be_eq_modify_delay(&pnob->fn_obj, 1, -						    &eq_objectp, &new_eqd, NULL, -						    NULL, NULL); -			if (status == BE_SUCCESS) -				adapter->cur_eqd = new_eqd; -		} -	} -} - -/* -    This function notifies BladeEngine of how many events were processed -    from the event queue by ringing the corresponding door bell and -    optionally re-arms the event queue. -    n		- number of events processed -    re_arm	- 1 - re-arm the EQ, 0 - do not re-arm the EQ - -*/ -static void be_notify_event(struct be_net_object *pnob, int n, int re_arm) -{ -	struct CQ_DB_AMAP eqdb; -	eqdb.dw[0] = 0; - -	AMAP_SET_BITS_PTR(CQ_DB, qid, &eqdb, pnob->event_q_id); -	AMAP_SET_BITS_PTR(CQ_DB, rearm, &eqdb, re_arm); -	AMAP_SET_BITS_PTR(CQ_DB, event, &eqdb, 1); -	AMAP_SET_BITS_PTR(CQ_DB, num_popped, &eqdb, n); -	/* -	 * Under some situations we see an interrupt and no valid -	 * EQ entry.  To keep going, we need to ring the DB even if -	 * numPOsted is 0. -	 */ -	PD_WRITE(&pnob->fn_obj, cq_db, eqdb.dw[0]); -	return; -} - -/* - * Called from the tasklet scheduled by ISR.  All real interrupt processing - * is done here. - */ -void be_process_intr(unsigned long context) -{ -	struct be_adapter *adapter = (struct be_adapter *)context; -	struct be_net_object *pnob = adapter->net_obj; -	u32 isr, n; -	ulong flags = 0; - -	isr = adapter->isr; - -	/* -	 * we create only one NIC event queue in Linux. Event is -	 * expected only in the first event queue -	 */ -	BUG_ON(isr & 0xfffffffe); -	if ((isr & 1) == 0) -		return;		/* not our interrupt */ -	n = process_events(pnob); -	/* -	 * Clear the event bit. adapter->isr is  set by -	 * hard interrupt.  Prevent race with lock. -	 */ -	spin_lock_irqsave(&adapter->int_lock, flags); -	adapter->isr &= ~1; -	spin_unlock_irqrestore(&adapter->int_lock, flags); -	be_notify_event(pnob, n, 1); -	/* -	 * If previous allocation attempts had failed and -	 * BE has used up all posted buffers, post RX buffers here -	 */ -	if (pnob->rxbuf_post_fail && atomic_read(&pnob->rx_q_posted) == 0) -		be_post_eth_rx_buffs(pnob); -	update_eqd(adapter, pnob); -	return; -} diff --git a/drivers/staging/benet/be_netif.c b/drivers/staging/benet/be_netif.c deleted file mode 100644 index 2b8daf63dc7..00000000000 --- a/drivers/staging/benet/be_netif.c +++ /dev/null @@ -1,705 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * be_netif.c - * - * This file contains various entry points of drivers seen by tcp/ip stack. - */ - -#include <linux/if_vlan.h> -#include <linux/in.h> -#include "benet.h" -#include <linux/ip.h> -#include <linux/inet_lro.h> - -/* Strings to print Link properties */ -static const char *link_speed[] = { -	"Invalid link Speed Value", -	"10 Mbps", -	"100 Mbps", -	"1 Gbps", -	"10 Gbps" -}; - -static const char *link_duplex[] = { -	"Invalid Duplex Value", -	"Half Duplex", -	"Full Duplex" -}; - -static const char *link_state[] = { -	"", -	"(active)" -}; - -void be_print_link_info(struct BE_LINK_STATUS *lnk_status) -{ -	u16 si, di, ai; - -	/* Port 0 */ -	if (lnk_status->mac0_speed && lnk_status->mac0_duplex) { -		/* Port is up and running */ -		si = (lnk_status->mac0_speed < 5) ? lnk_status->mac0_speed : 0; -		di = (lnk_status->mac0_duplex < 3) ? -		    lnk_status->mac0_duplex : 0; -		ai = (lnk_status->active_port == 0) ? 1 : 0; -		printk(KERN_INFO "PortNo. 0: Speed - %s %s %s\n", -		       link_speed[si], link_duplex[di], link_state[ai]); -	} else -		printk(KERN_INFO "PortNo. 0: Down\n"); - -	/* Port 1 */ -	if (lnk_status->mac1_speed && lnk_status->mac1_duplex) { -		/* Port is up and running */ -		si = (lnk_status->mac1_speed < 5) ? lnk_status->mac1_speed : 0; -		di = (lnk_status->mac1_duplex < 3) ? -		    lnk_status->mac1_duplex : 0; -		ai = (lnk_status->active_port == 0) ? 1 : 0; -		printk(KERN_INFO "PortNo. 1: Speed - %s %s %s\n", -		       link_speed[si], link_duplex[di], link_state[ai]); -	} else -		printk(KERN_INFO "PortNo. 1: Down\n"); - -	return; -} - -static int -be_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr, -		   void **ip_hdr, void **tcpudp_hdr, -		   u64 *hdr_flags, void *priv) -{ -	struct ethhdr *eh; -	struct vlan_ethhdr *veh; -	struct iphdr *iph; -	u8 *va = page_address(frag->page) + frag->page_offset; -	unsigned long ll_hlen; - -	/* find the mac header, abort if not IPv4 */ - -	prefetch(va); -	eh = (struct ethhdr *)va; -	*mac_hdr = eh; -	ll_hlen = ETH_HLEN; -	if (eh->h_proto != htons(ETH_P_IP)) { -		if (eh->h_proto == htons(ETH_P_8021Q)) { -			veh = (struct vlan_ethhdr *)va; -			if (veh->h_vlan_encapsulated_proto != htons(ETH_P_IP)) -				return -1; - -			ll_hlen += VLAN_HLEN; - -		} else { -			return -1; -		} -	} -	*hdr_flags = LRO_IPV4; - -	iph = (struct iphdr *)(va + ll_hlen); -	*ip_hdr = iph; -	if (iph->protocol != IPPROTO_TCP) -		return -1; -	*hdr_flags |= LRO_TCP; -	*tcpudp_hdr = (u8 *) (*ip_hdr) + (iph->ihl << 2); - -	return 0; -} - -static int benet_open(struct net_device *netdev) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; -	struct net_lro_mgr *lro_mgr; - -	if (adapter->dev_state < BE_DEV_STATE_INIT) -		return -EAGAIN; - -	lro_mgr = &pnob->lro_mgr; -	lro_mgr->dev = netdev; - -	lro_mgr->features = LRO_F_NAPI; -	lro_mgr->ip_summed = CHECKSUM_UNNECESSARY; -	lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY; -	lro_mgr->max_desc = BE_MAX_LRO_DESCRIPTORS; -	lro_mgr->lro_arr = pnob->lro_desc; -	lro_mgr->get_frag_header = be_get_frag_header; -	lro_mgr->max_aggr = adapter->max_rx_coal; -	lro_mgr->frag_align_pad = 2; -	if (lro_mgr->max_aggr > MAX_SKB_FRAGS) -		lro_mgr->max_aggr = MAX_SKB_FRAGS; - -	adapter->max_rx_coal = BE_LRO_MAX_PKTS; - -	be_update_link_status(adapter); - -	/* -	 * Set carrier on only if Physical Link up -	 * Either of the port link status up signifies this -	 */ -	if ((adapter->port0_link_sts == BE_PORT_LINK_UP) || -	    (adapter->port1_link_sts == BE_PORT_LINK_UP)) { -		netif_start_queue(netdev); -		netif_carrier_on(netdev); -	} - -	adapter->dev_state = BE_DEV_STATE_OPEN; -	napi_enable(&pnob->napi); -	be_enable_intr(pnob); -	be_enable_eq_intr(pnob); -	/* -	 * RX completion queue may be in dis-armed state. Arm it. -	 */ -	be_notify_cmpl(pnob, 0, pnob->rx_cq_id, 1); - -	return 0; -} - -static int benet_close(struct net_device *netdev) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; - -	netif_stop_queue(netdev); -	synchronize_irq(netdev->irq); - -	be_wait_nic_tx_cmplx_cmpl(pnob); -	adapter->dev_state = BE_DEV_STATE_INIT; -	netif_carrier_off(netdev); - -	adapter->port0_link_sts = BE_PORT_LINK_DOWN; -	adapter->port1_link_sts = BE_PORT_LINK_DOWN; -	be_disable_intr(pnob); -	be_disable_eq_intr(pnob); -	napi_disable(&pnob->napi); - -	return 0; -} - -/* - * Setting a Mac Address for BE - * Takes netdev and a void pointer as arguments. - * The pointer holds the new addres to be used. - */ -static int benet_set_mac_addr(struct net_device *netdev, void *p) -{ -	struct sockaddr *addr = p; -	struct be_net_object *pnob = netdev_priv(netdev); - -	memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); -	be_rxf_mac_address_read_write(&pnob->fn_obj, 0, 0, false, true, false, -				netdev->dev_addr, NULL, NULL); -	/* -	 * Since we are doing Active-Passive failover, both -	 * ports should have matching MAC addresses everytime. -	 */ -	be_rxf_mac_address_read_write(&pnob->fn_obj, 1, 0, false, true, false, -				      netdev->dev_addr, NULL, NULL); - -	return 0; -} - -void be_get_stats_timer_handler(unsigned long context) -{ -	struct be_timer_ctxt *ctxt = (struct be_timer_ctxt *)context; - -	if (atomic_read(&ctxt->get_stat_flag)) { -		atomic_dec(&ctxt->get_stat_flag); -		up((void *)ctxt->get_stat_sem_addr); -	} -	del_timer(&ctxt->get_stats_timer); -	return; -} - -void be_get_stat_cb(void *context, int status, -		    struct MCC_WRB_AMAP *optional_wrb) -{ -	struct be_timer_ctxt *ctxt = (struct be_timer_ctxt *)context; -	/* -	 * just up the semaphore if the get_stat_flag -	 * reads 1. so that the waiter can continue. -	 * If it is 0, then it was handled by the timer handler. -	 */ -	del_timer(&ctxt->get_stats_timer); -	if (atomic_read(&ctxt->get_stat_flag)) { -		atomic_dec(&ctxt->get_stat_flag); -		up((void *)ctxt->get_stat_sem_addr); -	} -} - -struct net_device_stats *benet_get_stats(struct net_device *dev) -{ -	struct be_net_object *pnob = netdev_priv(dev); -	struct be_adapter *adapter = pnob->adapter; -	u64 pa; -	struct be_timer_ctxt *ctxt = &adapter->timer_ctxt; - -	if (adapter->dev_state != BE_DEV_STATE_OPEN) { -		/* Return previously read stats */ -		return &(adapter->benet_stats); -	} -	/* Get Physical Addr */ -	pa = pci_map_single(adapter->pdev, adapter->eth_statsp, -			    sizeof(struct FWCMD_ETH_GET_STATISTICS), -			    PCI_DMA_FROMDEVICE); -	ctxt->get_stat_sem_addr = (unsigned long)&adapter->get_eth_stat_sem; -	atomic_inc(&ctxt->get_stat_flag); - -	be_rxf_query_eth_statistics(&pnob->fn_obj, adapter->eth_statsp, -				    cpu_to_le64(pa), be_get_stat_cb, ctxt, -				    NULL); - -	ctxt->get_stats_timer.data = (unsigned long)ctxt; -	mod_timer(&ctxt->get_stats_timer, (jiffies + (HZ * 2))); -	down((void *)ctxt->get_stat_sem_addr);	/* callback will unblock us */ - -	/* Adding port0 and port1 stats. */ -	adapter->benet_stats.rx_packets = -	    adapter->eth_statsp->params.response.p0recvdtotalframes + -	    adapter->eth_statsp->params.response.p1recvdtotalframes; -	adapter->benet_stats.tx_packets = -	    adapter->eth_statsp->params.response.p0xmitunicastframes + -	    adapter->eth_statsp->params.response.p1xmitunicastframes; -	adapter->benet_stats.tx_bytes = -	    adapter->eth_statsp->params.response.p0xmitbyteslsd + -	    adapter->eth_statsp->params.response.p1xmitbyteslsd; -	adapter->benet_stats.rx_errors = -	    adapter->eth_statsp->params.response.p0crcerrors + -	    adapter->eth_statsp->params.response.p1crcerrors; -	adapter->benet_stats.rx_errors += -	    adapter->eth_statsp->params.response.p0alignmentsymerrs + -	    adapter->eth_statsp->params.response.p1alignmentsymerrs; -	adapter->benet_stats.rx_errors += -	    adapter->eth_statsp->params.response.p0inrangelenerrors + -	    adapter->eth_statsp->params.response.p1inrangelenerrors; -	adapter->benet_stats.rx_bytes = -	    adapter->eth_statsp->params.response.p0recvdtotalbytesLSD + -	    adapter->eth_statsp->params.response.p1recvdtotalbytesLSD; -	adapter->benet_stats.rx_crc_errors = -	    adapter->eth_statsp->params.response.p0crcerrors + -	    adapter->eth_statsp->params.response.p1crcerrors; - -	adapter->benet_stats.tx_packets += -	    adapter->eth_statsp->params.response.p0xmitmulticastframes + -	    adapter->eth_statsp->params.response.p1xmitmulticastframes; -	adapter->benet_stats.tx_packets += -	    adapter->eth_statsp->params.response.p0xmitbroadcastframes + -	    adapter->eth_statsp->params.response.p1xmitbroadcastframes; -	adapter->benet_stats.tx_errors = 0; - -	adapter->benet_stats.multicast = -	    adapter->eth_statsp->params.response.p0xmitmulticastframes + -	    adapter->eth_statsp->params.response.p1xmitmulticastframes; - -	adapter->benet_stats.rx_fifo_errors = -	    adapter->eth_statsp->params.response.p0rxfifooverflowdropped + -	    adapter->eth_statsp->params.response.p1rxfifooverflowdropped; -	adapter->benet_stats.rx_frame_errors = -	    adapter->eth_statsp->params.response.p0alignmentsymerrs + -	    adapter->eth_statsp->params.response.p1alignmentsymerrs; -	adapter->benet_stats.rx_length_errors = -	    adapter->eth_statsp->params.response.p0inrangelenerrors + -	    adapter->eth_statsp->params.response.p1inrangelenerrors; -	adapter->benet_stats.rx_length_errors += -	    adapter->eth_statsp->params.response.p0outrangeerrors + -	    adapter->eth_statsp->params.response.p1outrangeerrors; -	adapter->benet_stats.rx_length_errors += -	    adapter->eth_statsp->params.response.p0frametoolongerrors + -	    adapter->eth_statsp->params.response.p1frametoolongerrors; - -	pci_unmap_single(adapter->pdev, (ulong) adapter->eth_statsp, -			 sizeof(struct FWCMD_ETH_GET_STATISTICS), -			 PCI_DMA_FROMDEVICE); -	return &(adapter->benet_stats); - -} - -static void be_start_tx(struct be_net_object *pnob, u32 nposted) -{ -#define CSR_ETH_MAX_SQPOSTS 255 -	struct SQ_DB_AMAP sqdb; - -	sqdb.dw[0] = 0; - -	AMAP_SET_BITS_PTR(SQ_DB, cid, &sqdb, pnob->tx_q_id); -	while (nposted) { -		if (nposted > CSR_ETH_MAX_SQPOSTS) { -			AMAP_SET_BITS_PTR(SQ_DB, numPosted, &sqdb, -					  CSR_ETH_MAX_SQPOSTS); -			nposted -= CSR_ETH_MAX_SQPOSTS; -		} else { -			AMAP_SET_BITS_PTR(SQ_DB, numPosted, &sqdb, nposted); -			nposted = 0; -		} -		PD_WRITE(&pnob->fn_obj, etx_sq_db, sqdb.dw[0]); -	} - -	return; -} - -static void update_tx_rate(struct be_adapter *adapter) -{ -	/* update the rate once in two seconds */ -	if ((jiffies - adapter->eth_tx_jiffies) > 2 * (HZ)) { -		u32 r; -		r = adapter->eth_tx_bytes / -		    ((jiffies - adapter->eth_tx_jiffies) / (HZ)); -		r = (r / 1000000);	/* M bytes/s */ -		adapter->be_stat.bes_eth_tx_rate = (r * 8); /* M bits/s */ -		adapter->eth_tx_jiffies = jiffies; -		adapter->eth_tx_bytes = 0; -	} -} - -static int wrb_cnt_in_skb(struct sk_buff *skb) -{ -	int cnt = 0; -	while (skb) { -		if (skb->len > skb->data_len) -			cnt++; -		cnt += skb_shinfo(skb)->nr_frags; -		skb = skb_shinfo(skb)->frag_list; -	} -	BUG_ON(cnt > BE_MAX_TX_FRAG_COUNT); -	return cnt; -} - -static void wrb_fill(struct ETH_WRB_AMAP *wrb, u64 addr, int len) -{ -	AMAP_SET_BITS_PTR(ETH_WRB, frag_pa_hi, wrb, addr >> 32); -	AMAP_SET_BITS_PTR(ETH_WRB, frag_pa_lo, wrb, addr & 0xFFFFFFFF); -	AMAP_SET_BITS_PTR(ETH_WRB, frag_len, wrb, len); -} - -static void wrb_fill_extra(struct ETH_WRB_AMAP *wrb, struct sk_buff *skb, -			   struct be_net_object *pnob) -{ -	wrb->dw[2] = 0; -	wrb->dw[3] = 0; -	AMAP_SET_BITS_PTR(ETH_WRB, crc, wrb, 1); -	if (skb_shinfo(skb)->gso_segs > 1 && skb_shinfo(skb)->gso_size) { -		AMAP_SET_BITS_PTR(ETH_WRB, lso, wrb, 1); -		AMAP_SET_BITS_PTR(ETH_WRB, lso_mss, wrb, -				  skb_shinfo(skb)->gso_size); -	} else if (skb->ip_summed == CHECKSUM_PARTIAL) { -		u8 proto = ((struct iphdr *)ip_hdr(skb))->protocol; -		if (proto == IPPROTO_TCP) -			AMAP_SET_BITS_PTR(ETH_WRB, tcpcs, wrb, 1); -		else if (proto == IPPROTO_UDP) -			AMAP_SET_BITS_PTR(ETH_WRB, udpcs, wrb, 1); -	} -	if (pnob->vlan_grp && vlan_tx_tag_present(skb)) { -		AMAP_SET_BITS_PTR(ETH_WRB, vlan, wrb, 1); -		AMAP_SET_BITS_PTR(ETH_WRB, vlan_tag, wrb, vlan_tx_tag_get(skb)); -	} -} - -static inline void wrb_copy_extra(struct ETH_WRB_AMAP *to, -				  struct ETH_WRB_AMAP *from) -{ - -	to->dw[2] = from->dw[2]; -	to->dw[3] = from->dw[3]; -} - -/* Returns the actual count of wrbs used including a possible dummy */ -static int copy_skb_to_txq(struct be_net_object *pnob, struct sk_buff *skb, -			   u32 wrb_cnt, u32 *copied) -{ -	u64 busaddr; -	struct ETH_WRB_AMAP *wrb = NULL, *first = NULL; -	u32 i; -	bool dummy = true; -	struct pci_dev *pdev = pnob->adapter->pdev; - -	if (wrb_cnt & 1) -		wrb_cnt++; -	else -		dummy = false; - -	atomic_add(wrb_cnt, &pnob->tx_q_used); - -	while (skb) { -		if (skb->len > skb->data_len) { -			int len = skb->len - skb->data_len; -			busaddr = pci_map_single(pdev, skb->data, len, -						 PCI_DMA_TODEVICE); -			busaddr = cpu_to_le64(busaddr); -			wrb = &pnob->tx_q[pnob->tx_q_hd]; -			if (first == NULL) { -				wrb_fill_extra(wrb, skb, pnob); -				first = wrb; -			} else { -				wrb_copy_extra(wrb, first); -			} -			wrb_fill(wrb, busaddr, len); -			be_adv_txq_hd(pnob); -			*copied += len; -		} - -		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { -			struct skb_frag_struct *frag = -			    &skb_shinfo(skb)->frags[i]; -			busaddr = pci_map_page(pdev, frag->page, -					       frag->page_offset, frag->size, -					       PCI_DMA_TODEVICE); -			busaddr = cpu_to_le64(busaddr); -			wrb = &pnob->tx_q[pnob->tx_q_hd]; -			if (first == NULL) { -				wrb_fill_extra(wrb, skb, pnob); -				first = wrb; -			} else { -				wrb_copy_extra(wrb, first); -			} -			wrb_fill(wrb, busaddr, frag->size); -			be_adv_txq_hd(pnob); -			*copied += frag->size; -		} -		skb = skb_shinfo(skb)->frag_list; -	} - -	if (dummy) { -		wrb = &pnob->tx_q[pnob->tx_q_hd]; -		BUG_ON(first == NULL); -		wrb_copy_extra(wrb, first); -		wrb_fill(wrb, 0, 0); -		be_adv_txq_hd(pnob); -	} -	AMAP_SET_BITS_PTR(ETH_WRB, complete, wrb, 1); -	AMAP_SET_BITS_PTR(ETH_WRB, last, wrb, 1); -	return wrb_cnt; -} - -/* For each skb transmitted, tx_ctxt stores the num of wrbs in the - * start index and skb pointer in the end index - */ -static inline void be_tx_wrb_info_remember(struct be_net_object *pnob, -					   struct sk_buff *skb, int wrb_cnt, -					   u32 start) -{ -	*(u32 *) (&pnob->tx_ctxt[start]) = wrb_cnt; -	index_adv(&start, wrb_cnt - 1, pnob->tx_q_len); -	pnob->tx_ctxt[start] = skb; -} - -static int benet_xmit(struct sk_buff *skb, struct net_device *netdev) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; -	u32 wrb_cnt, copied = 0; -	u32 start = pnob->tx_q_hd; - -	adapter->be_stat.bes_tx_reqs++; - -	wrb_cnt = wrb_cnt_in_skb(skb); -	spin_lock_bh(&adapter->txq_lock); -	if ((pnob->tx_q_len - 2 - atomic_read(&pnob->tx_q_used)) <= wrb_cnt) { -		netif_stop_queue(pnob->netdev); -		spin_unlock_bh(&adapter->txq_lock); -		adapter->be_stat.bes_tx_fails++; -		return NETDEV_TX_BUSY; -	} -	spin_unlock_bh(&adapter->txq_lock); - -	wrb_cnt = copy_skb_to_txq(pnob, skb, wrb_cnt, &copied); -	be_tx_wrb_info_remember(pnob, skb, wrb_cnt, start); - -	be_start_tx(pnob, wrb_cnt); - -	adapter->eth_tx_bytes += copied; -	adapter->be_stat.bes_tx_wrbs += wrb_cnt; -	update_tx_rate(adapter); -	netdev->trans_start = jiffies; - -	return NETDEV_TX_OK; -} - -/* - * This is the driver entry point to change the mtu of the device - * Returns 0 for success and errno for failure. - */ -static int benet_change_mtu(struct net_device *netdev, int new_mtu) -{ -	/* -	 * BE supports jumbo frame size upto 9000 bytes including the link layer -	 * header. Considering the different variants of frame formats possible -	 * like VLAN, SNAP/LLC, the maximum possible value for MTU is 8974 bytes -	 */ - -	if (new_mtu < (ETH_ZLEN + ETH_FCS_LEN) || (new_mtu > BE_MAX_MTU)) { -		dev_info(&netdev->dev, "Invalid MTU requested. " -			       "Must be between %d and %d bytes\n", -				       (ETH_ZLEN + ETH_FCS_LEN), BE_MAX_MTU); -		return -EINVAL; -	} -	dev_info(&netdev->dev, "MTU changed from %d to %d\n", -						netdev->mtu, new_mtu); -	netdev->mtu = new_mtu; -	return 0; -} - -/* - * This is the driver entry point to register a vlan with the device - */ -static void benet_vlan_register(struct net_device *netdev, -				struct vlan_group *grp) -{ -	struct be_net_object *pnob = netdev_priv(netdev); - -	be_disable_eq_intr(pnob); -	pnob->vlan_grp = grp; -	pnob->num_vlans = 0; -	be_enable_eq_intr(pnob); -} - -/* - * This is the driver entry point to add a vlan vlan_id - * with the device netdev - */ -static void benet_vlan_add_vid(struct net_device *netdev, u16 vlan_id) -{ -	struct be_net_object *pnob = netdev_priv(netdev); - -	if (pnob->num_vlans == (BE_NUM_VLAN_SUPPORTED - 1)) { -		/* no  way to return an error */ -		dev_info(&netdev->dev, -		       "BladeEngine: Cannot configure more than %d Vlans\n", -			       BE_NUM_VLAN_SUPPORTED); -		return; -	} -	/* The new vlan tag will be in the slot indicated by num_vlans. */ -	pnob->vlan_tag[pnob->num_vlans++] = vlan_id; -	be_rxf_vlan_config(&pnob->fn_obj, false, pnob->num_vlans, -			   pnob->vlan_tag, NULL, NULL, NULL); -} - -/* - * This is the driver entry point to remove a vlan vlan_id - * with the device netdev - */ -static void benet_vlan_rem_vid(struct net_device *netdev, u16 vlan_id) -{ -	struct be_net_object *pnob = netdev_priv(netdev); - -	u32 i, value; - -	/* -	 * In Blade Engine, we support 32 vlan tag filters across both ports. -	 * To program a vlan tag, the RXF_RTPR_CSR register is used. -	 * Each 32-bit value of RXF_RTDR_CSR can address 2 vlan tag entries. -	 * The Vlan table is of depth 16. thus we support 32 tags. -	 */ - -	value = vlan_id | VLAN_VALID_BIT; -	for (i = 0; i < BE_NUM_VLAN_SUPPORTED; i++) { -		if (pnob->vlan_tag[i] == vlan_id) -			break; -	} - -	if (i == BE_NUM_VLAN_SUPPORTED) -		return; -	/* Now compact the vlan tag array by removing hole created. */ -	while ((i + 1) < BE_NUM_VLAN_SUPPORTED) { -		pnob->vlan_tag[i] = pnob->vlan_tag[i + 1]; -		i++; -	} -	if ((i + 1) == BE_NUM_VLAN_SUPPORTED) -		pnob->vlan_tag[i] = (u16) 0x0; -	pnob->num_vlans--; -	be_rxf_vlan_config(&pnob->fn_obj, false, pnob->num_vlans, -			   pnob->vlan_tag, NULL, NULL, NULL); -} - -/* - * This function is called to program multicast - * address in the multicast filter of the ASIC. - */ -static void be_set_multicast_filter(struct net_device *netdev) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct dev_mc_list *mc_ptr; -	u8 mac_addr[32][ETH_ALEN]; -	int i; - -	if (netdev->flags & IFF_ALLMULTI) { -		/* set BE in Multicast promiscuous */ -		be_rxf_multicast_config(&pnob->fn_obj, true, 0, NULL, NULL, -					NULL, NULL); -		return; -	} - -	for (mc_ptr = netdev->mc_list, i = 0; mc_ptr; -	     mc_ptr = mc_ptr->next, i++) { -		memcpy(&mac_addr[i][0], mc_ptr->dmi_addr, ETH_ALEN); -	} - -	/* reset the promiscuous mode also. */ -	be_rxf_multicast_config(&pnob->fn_obj, false, i, -				&mac_addr[0][0], NULL, NULL, NULL); -} - -/* - * This is the driver entry point to set multicast list - * with the device netdev. This function will be used to - * set promiscuous mode or multicast promiscuous mode - * or multicast mode.... - */ -static void benet_set_multicast_list(struct net_device *netdev) -{ -	struct be_net_object *pnob = netdev_priv(netdev); - -	if (netdev->flags & IFF_PROMISC) { -		be_rxf_promiscuous(&pnob->fn_obj, 1, 1, NULL, NULL, NULL); -	} else { -		be_rxf_promiscuous(&pnob->fn_obj, 0, 0, NULL, NULL, NULL); -		be_set_multicast_filter(netdev); -	} -} - -int benet_init(struct net_device *netdev) -{ -	struct be_net_object *pnob = netdev_priv(netdev); -	struct be_adapter *adapter = pnob->adapter; - -	ether_setup(netdev); - -	netdev->open = &benet_open; -	netdev->stop = &benet_close; -	netdev->hard_start_xmit = &benet_xmit; - -	netdev->get_stats = &benet_get_stats; - -	netdev->set_multicast_list = &benet_set_multicast_list; - -	netdev->change_mtu = &benet_change_mtu; -	netdev->set_mac_address = &benet_set_mac_addr; - -	netdev->vlan_rx_register = benet_vlan_register; -	netdev->vlan_rx_add_vid = benet_vlan_add_vid; -	netdev->vlan_rx_kill_vid = benet_vlan_rem_vid; - -	netdev->features = -	    NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_HW_VLAN_RX | NETIF_F_TSO | -	    NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_IP_CSUM; - -	netdev->flags |= IFF_MULTICAST; - -	/* If device is DAC Capable, set the HIGHDMA flag for netdevice. */ -	if (adapter->dma_64bit_cap) -		netdev->features |= NETIF_F_HIGHDMA; - -	SET_ETHTOOL_OPS(netdev, &be_ethtool_ops); -	return 0; -} diff --git a/drivers/staging/benet/benet.h b/drivers/staging/benet/benet.h deleted file mode 100644 index 09a1f081772..00000000000 --- a/drivers/staging/benet/benet.h +++ /dev/null @@ -1,429 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#ifndef _BENET_H_ -#define _BENET_H_ - -#include <linux/pci.h> -#include <linux/netdevice.h> -#include <linux/inet_lro.h> -#include "hwlib.h" - -#define _SA_MODULE_NAME "net-driver" - -#define VLAN_VALID_BIT		0x8000 -#define BE_NUM_VLAN_SUPPORTED	32 -#define BE_PORT_LINK_DOWN       0000 -#define BE_PORT_LINK_UP         0001 -#define	BE_MAX_TX_FRAG_COUNT		(30) - -/* Flag bits for send operation */ -#define IPCS            (1 << 0)	/* Enable IP checksum offload */ -#define UDPCS           (1 << 1)	/* Enable UDP checksum offload */ -#define TCPCS           (1 << 2)	/* Enable TCP checksum offload */ -#define LSO             (1 << 3)	/* Enable Large Segment  offload */ -#define ETHVLAN         (1 << 4)	/* Enable VLAN insert */ -#define ETHEVENT        (1 << 5)	/* Generate  event on completion */ -#define ETHCOMPLETE     (1 << 6)	/* Generate completion when done */ -#define IPSEC           (1 << 7)	/* Enable IPSEC */ -#define FORWARD         (1 << 8)	/* Send the packet in forwarding path */ -#define FIN             (1 << 9)	/* Issue FIN segment */ - -#define BE_MAX_MTU	8974 - -#define BE_MAX_LRO_DESCRIPTORS			8 -#define BE_LRO_MAX_PKTS				64 -#define BE_MAX_FRAGS_PER_FRAME			6 - -extern const char be_drvr_ver[]; -extern char be_fw_ver[]; -extern char be_driver_name[]; - -extern struct ethtool_ops be_ethtool_ops; - -#define BE_DEV_STATE_NONE 0 -#define BE_DEV_STATE_INIT 1 -#define BE_DEV_STATE_OPEN 2 -#define BE_DEV_STATE_SUSPEND 3 - -/* This structure is used to describe physical fragments to use - * for DMAing data from NIC. - */ -struct be_recv_buffer { -	struct list_head rxb_list;	/* for maintaining a linked list */ -	void *rxb_va;		/* buffer virtual address */ -	u32 rxb_pa_lo;		/* low part of physical address */ -	u32 rxb_pa_hi;		/* high part of physical address */ -	u32 rxb_len;		/* length of recv buffer */ -	void *rxb_ctxt;		/* context for OSM driver to use */ -}; - -/* - * fragment list to describe scattered data. - */ -struct be_tx_frag_list { -	u32 txb_len;		/* Size of this fragment */ -	u32 txb_pa_lo;		/* Lower 32 bits of 64 bit physical addr */ -	u32 txb_pa_hi;		/* Higher 32 bits of 64 bit physical addr */ -}; - -struct be_rx_page_info { -	struct page *page; -	dma_addr_t bus; -	u16 page_offset; -}; - -/* - *  This structure is the main tracking structure for a NIC interface. - */ -struct be_net_object { -	/* MCC Ring - used to send fwcmds to embedded ARM processor */ -	struct MCC_WRB_AMAP *mcc_q;	/* VA of the start of the ring */ -	u32 mcc_q_len;			/* # of WRB entries in this ring */ -	u32 mcc_q_size; -	u32 mcc_q_hd;			/* MCC ring head */ -	u8 mcc_q_created;		/* flag to help cleanup */ -	struct be_mcc_object mcc_q_obj;	/* BECLIB's MCC ring Object */ -	dma_addr_t mcc_q_bus;		/* DMA'ble bus address */ - -	/* MCC Completion Ring - FW responses to fwcmds sent from MCC ring */ -	struct MCC_CQ_ENTRY_AMAP *mcc_cq; /* VA of the start of the ring */ -	u32 mcc_cq_len;			/* # of compl. entries in this ring */ -	u32 mcc_cq_size; -	u32 mcc_cq_tl;			/* compl. ring tail */ -	u8 mcc_cq_created;		/* flag to help cleanup */ -	struct be_cq_object mcc_cq_obj;	/* BECLIB's MCC compl. ring object */ -	u32 mcc_cq_id;			/* MCC ring ID */ -	dma_addr_t mcc_cq_bus;		/* DMA'ble bus address */ - -	struct ring_desc mb_rd;		/* RD for MCC_MAIL_BOX */ -	void *mb_ptr;			/* mailbox ptr to be freed  */ -	dma_addr_t mb_bus;		/* DMA'ble bus address */ -	u32 mb_size; - -	/* BEClib uses an array of context objects to track outstanding -	 * requests to the MCC.  We need allocate the same number of -	 * conext entries as the number of entries in the MCC WRB ring -	 */ -	u32 mcc_wrb_ctxt_size; -	void *mcc_wrb_ctxt;		/* pointer to the context area */ -	u32 mcc_wrb_ctxtLen;		/* Number of entries in the context */ -	/* -	 * NIC send request ring - used for xmitting raw ether frames. -	 */ -	struct ETH_WRB_AMAP *tx_q;	/* VA of the start of the ring */ -	u32 tx_q_len;			/* # if entries in the send ring */ -	u32 tx_q_size; -	u32 tx_q_hd;			/* Head index. Next req. goes here */ -	u32 tx_q_tl;			/* Tail indx. oldest outstanding req. */ -	u8 tx_q_created;		/* flag to help cleanup */ -	struct be_ethsq_object tx_q_obj;/* BECLIB's send Q handle */ -	dma_addr_t tx_q_bus;		/* DMA'ble bus address */ -	u32 tx_q_id;			/* send queue ring ID */ -	u32 tx_q_port;			/* 0 no binding, 1 port A,  2 port B */ -	atomic_t tx_q_used;		/* # of WRBs used */ -	/* ptr to an array in which we store context info for each send req. */ -	void **tx_ctxt; -	/* -	 * NIC Send compl. ring - completion status for all NIC frames xmitted. -	 */ -	struct ETH_TX_COMPL_AMAP *tx_cq;/* VA of start of the ring */ -	u32 txcq_len;			/* # of entries in the ring */ -	u32 tx_cq_size; -	/* -	 * index into compl ring where the host expects next completion entry -	 */ -	u32 tx_cq_tl; -	u32 tx_cq_id;			/* completion queue id */ -	u8 tx_cq_created;		/* flag to help cleanup */ -	struct be_cq_object tx_cq_obj; -	dma_addr_t tx_cq_bus;		/* DMA'ble bus address */ -	/* -	 * Event Queue - all completion entries post events here. -	 */ -	struct EQ_ENTRY_AMAP *event_q;	/* VA of start of event queue */ -	u32 event_q_len;		/* # of entries */ -	u32 event_q_size; -	u32 event_q_tl;			/* Tail of the event queue */ -	u32 event_q_id;			/* Event queue ID */ -	u8 event_q_created;		/* flag to help cleanup */ -	struct be_eq_object event_q_obj; /* Queue handle */ -	dma_addr_t event_q_bus;		/* DMA'ble bus address */ -	/* -	 * NIC receive queue - Data buffers to be used for receiving unicast, -	 * broadcast and multi-cast frames  are posted here. -	 */ -	struct ETH_RX_D_AMAP *rx_q;	/* VA of start of the queue */ -	u32 rx_q_len;			/* # of entries */ -	u32 rx_q_size; -	u32 rx_q_hd;			/* Head of the queue */ -	atomic_t rx_q_posted;		/* number of posted buffers */ -	u32 rx_q_id;			/* queue ID */ -	u8 rx_q_created;		/* flag to help cleanup */ -	struct be_ethrq_object rx_q_obj;	/* NIC RX queue handle */ -	dma_addr_t rx_q_bus;		/* DMA'ble bus address */ -	/* -	 * Pointer to an array of opaque context object for use by OSM driver -	 */ -	void **rx_ctxt; -	/* -	 * NIC unicast RX completion queue - all unicast ether frame completion -	 * statuses from BE come here. -	 */ -	struct ETH_RX_COMPL_AMAP *rx_cq;	/* VA of start of the queue */ -	u32 rx_cq_len;		/* # of entries */ -	u32 rx_cq_size; -	u32 rx_cq_tl;			/* Tail of the queue */ -	u32 rx_cq_id;			/* queue ID */ -	u8 rx_cq_created;		/* flag to help cleanup */ -	struct be_cq_object rx_cq_obj;	/* queue handle */ -	dma_addr_t rx_cq_bus;		/* DMA'ble bus address */ -	struct be_function_object fn_obj;	/* function object   */ -	bool	fn_obj_created; -	u32 rx_buf_size;		/* Size of the RX buffers */ - -	struct net_device *netdev; -	struct be_recv_buffer eth_rx_bufs[256];	/* to pass Rx buffer -							   addresses */ -	struct be_adapter *adapter;	/* Pointer to OSM adapter */ -	u32 devno;		/* OSM, network dev no. */ -	u32 use_port;		/* Current active port */ -	struct be_rx_page_info *rx_page_info;	/* Array of Rx buf pages */ -	u32 rx_pg_info_hd;	/* Head of queue */ -	int rxbuf_post_fail;	/* RxBuff posting fail count */ -	bool rx_pg_shared;	/* Is an allocsted page shared as two frags ? */ -	struct vlan_group *vlan_grp; -	u32 num_vlans;		/* Number of vlans in BE's filter */ -	u16 vlan_tag[BE_NUM_VLAN_SUPPORTED]; /* vlans currently configured */ -	struct napi_struct napi; -	struct net_lro_mgr lro_mgr; -	struct net_lro_desc lro_desc[BE_MAX_LRO_DESCRIPTORS]; -}; - -#define NET_FH(np)       (&(np)->fn_obj) - -/* - * BE driver statistics. - */ -struct be_drvr_stat { -	u32 bes_tx_reqs;	/* number of TX requests initiated */ -	u32 bes_tx_fails;	/* number of TX requests that failed */ -	u32 bes_fwd_reqs;	/* number of send reqs through forwarding i/f */ -	u32 bes_tx_wrbs;	/* number of tx WRBs used */ - -	u32 bes_ints;		/* number of interrupts */ -	u32 bes_polls;		/* number of times NAPI called poll function */ -	u32 bes_events;		/* total evet entries processed */ -	u32 bes_tx_events;	/* number of tx completion events  */ -	u32 bes_rx_events;	/* number of ucast rx completion events  */ -	u32 bes_tx_compl;	/* number of tx completion entries processed */ -	u32 bes_rx_compl;	/* number of rx completion entries -				   processed */ -	u32 bes_ethrx_post_fail;	/* number of ethrx buffer alloc -					   failures */ -	/* -	 * number of non ether type II frames dropped where -	 * frame len > length field of Mac Hdr -	 */ -	u32 bes_802_3_dropped_frames; -	/* -	 * number of non ether type II frames malformed where -	 * in frame len < length field of Mac Hdr -	 */ -	u32 bes_802_3_malformed_frames; -	u32 bes_ips;		/*  interrupts / sec */ -	u32 bes_prev_ints;	/* bes_ints at last IPS calculation  */ -	u16 bes_eth_tx_rate;	/*  ETH TX rate - Mb/sec */ -	u16 bes_eth_rx_rate;	/*  ETH RX rate - Mb/sec */ -	u32 bes_rx_coal;	/* Num pkts coalasced */ -	u32 bes_rx_flush;	/* Num times coalasced */ -	u32 bes_link_change_physical;	/*Num of times physical link changed */ -	u32 bes_link_change_virtual;	/*Num of times virtual link changed */ -	u32 bes_rx_misc_pkts;	/* Misc pkts received */ -}; - -/* Maximum interrupt delay (in microseconds) allowed */ -#define MAX_EQD				120 - -/* - * timer to prevent system shutdown hang for ever if h/w stops responding - */ -struct be_timer_ctxt { -	atomic_t get_stat_flag; -	struct timer_list get_stats_timer; -	unsigned long get_stat_sem_addr; -} ; - -/* This structure is the main BladeEngine driver context.  */ -struct be_adapter { -	struct net_device *netdevp; -	struct be_drvr_stat be_stat; -	struct net_device_stats benet_stats; - -	/* PCI BAR mapped addresses */ -	u8 __iomem *csr_va;	/* CSR */ -	u8 __iomem *db_va;	/* Door  Bell  */ -	u8 __iomem *pci_va;	/* PCI Config */ - -	struct tasklet_struct sts_handler; -	struct timer_list cq_timer; -	spinlock_t int_lock;	/* to protect the isr field in adapter */ - -	struct FWCMD_ETH_GET_STATISTICS *eth_statsp; -	/* -	 * This will enable the use of ethtool to enable or disable -	 * Checksum on Rx pkts to be obeyed or disobeyed. -	 * If this is true = 1, then whatever is the checksum on the -	 * Received pkt as per BE, it will be given to the stack. -	 * Else the stack will re calculate it. -	 */ -	bool rx_csum; -	/* -	 * This will enable the use of ethtool to enable or disable -	 * Coalese on Rx pkts to be obeyed or disobeyed. -	 * If this is grater than 0 and less than 16 then coalascing -	 * is enabled else it is disabled -	 */ -	u32 max_rx_coal; -	struct pci_dev *pdev;	/* Pointer to OS's PCI dvice */ - -	spinlock_t txq_lock;	/* to stop/wake queue based on tx_q_used */ - -	u32 isr;		/* copy of Intr status reg. */ - -	u32 port0_link_sts;	/* Port 0 link status */ -	u32 port1_link_sts;	/* port 1 list status */ -	struct BE_LINK_STATUS *be_link_sts; - -	/* pointer to the first netobject of this adapter */ -	struct be_net_object *net_obj; - -	/*  Flags to indicate what to clean up */ -	bool tasklet_started; -	bool isr_registered; -	/* -	 * adaptive interrupt coalescing (AIC) related -	 */ -	bool enable_aic;	/* 1 if AIC is enabled */ -	u16 min_eqd;		/* minimum EQ delay in usec */ -	u16 max_eqd;		/* minimum EQ delay in usec */ -	u16 cur_eqd;		/* current EQ delay in usec */ -	/* -	 * book keeping for interrupt / sec and TX/RX rate calculation -	 */ -	ulong ips_jiffies;	/* jiffies at last IPS calc */ -	u32 eth_tx_bytes; -	ulong eth_tx_jiffies; -	u32 eth_rx_bytes; -	ulong eth_rx_jiffies; - -	struct semaphore get_eth_stat_sem; - -	/* timer ctxt to prevent shutdown hanging due to un-responsive BE */ -	struct be_timer_ctxt timer_ctxt; - -#define BE_MAX_MSIX_VECTORS             32 -#define BE_MAX_REQ_MSIX_VECTORS         1 /* only one EQ in Linux driver */ -	struct msix_entry msix_entries[BE_MAX_MSIX_VECTORS]; -	bool msix_enabled; -	bool dma_64bit_cap;	/* the Device DAC capable  or not */ -	u8 dev_state;	/* The current state of the device */ -	u8 dev_pm_state; /* The State of device before going to suspend */ -}; - -/* - * Every second we look at the ints/sec and adjust eq_delay - * between adapter->min_eqd and adapter->max_eqd to keep the ints/sec between - * IPS_HI_WM and IPS_LO_WM. - */ -#define IPS_HI_WM	18000 -#define IPS_LO_WM	8000 - - -static inline void index_adv(u32 *index, u32 val,  u32 limit) -{ -	BUG_ON(limit & (limit-1)); -	*index = (*index + val) & (limit - 1); -} - -static inline void index_inc(u32 *index, u32 limit) -{ -	BUG_ON(limit & (limit-1)); -	*index = (*index + 1) & (limit - 1); -} - -static inline void be_adv_eq_tl(struct be_net_object *pnob) -{ -	index_inc(&pnob->event_q_tl, pnob->event_q_len); -} - -static inline void be_adv_txq_hd(struct be_net_object *pnob) -{ -	index_inc(&pnob->tx_q_hd, pnob->tx_q_len); -} - -static inline void be_adv_txq_tl(struct be_net_object *pnob) -{ -	index_inc(&pnob->tx_q_tl, pnob->tx_q_len); -} - -static inline void be_adv_txcq_tl(struct be_net_object *pnob) -{ -	index_inc(&pnob->tx_cq_tl, pnob->txcq_len); -} - -static inline void be_adv_rxq_hd(struct be_net_object *pnob) -{ -	index_inc(&pnob->rx_q_hd, pnob->rx_q_len); -} - -static inline void be_adv_rxcq_tl(struct be_net_object *pnob) -{ -	index_inc(&pnob->rx_cq_tl, pnob->rx_cq_len); -} - -static inline u32 tx_compl_lastwrb_idx_get(struct be_net_object *pnob) -{ -	return (pnob->tx_q_tl + *(u32 *)&pnob->tx_ctxt[pnob->tx_q_tl] - 1) -		    & (pnob->tx_q_len - 1); -} - -int benet_init(struct net_device *); -int be_ethtool_ioctl(struct net_device *, struct ifreq *); -struct net_device_stats *benet_get_stats(struct net_device *); -void be_process_intr(unsigned long context); -irqreturn_t be_int(int irq, void *dev); -void be_post_eth_rx_buffs(struct be_net_object *); -void be_get_stat_cb(void *, int, struct MCC_WRB_AMAP *); -void be_get_stats_timer_handler(unsigned long); -void be_wait_nic_tx_cmplx_cmpl(struct be_net_object *); -void be_print_link_info(struct BE_LINK_STATUS *); -void be_update_link_status(struct be_adapter *); -void be_init_procfs(struct be_adapter *); -void be_cleanup_procfs(struct be_adapter *); -int be_poll(struct napi_struct *, int); -struct ETH_RX_COMPL_AMAP *be_get_rx_cmpl(struct be_net_object *); -void be_notify_cmpl(struct be_net_object *, int, int, int); -void be_enable_intr(struct be_net_object *); -void be_enable_eq_intr(struct be_net_object *); -void be_disable_intr(struct be_net_object *); -void be_disable_eq_intr(struct be_net_object *); -int be_set_uc_mac_adr(struct be_net_object *, u8, u8, u8, -		    u8 *, mcc_wrb_cqe_callback, void *); -int be_get_flow_ctl(struct be_function_object *pFnObj, bool *, bool *); -void process_one_tx_compl(struct be_net_object *pnob, u32 end_idx); - -#endif /* _BENET_H_ */ diff --git a/drivers/staging/benet/bestatus.h b/drivers/staging/benet/bestatus.h deleted file mode 100644 index 59c7a4b6222..00000000000 --- a/drivers/staging/benet/bestatus.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#ifndef _BESTATUS_H_ -#define _BESTATUS_H_ - -#define BE_SUCCESS                      (0x00000000L) -/* - * MessageId: BE_PENDING - *  The BladeEngine Driver call succeeded, and pended operation. - */ -#define BE_PENDING                       (0x20070001L) -#define BE_STATUS_PENDING                (BE_PENDING) -/* - * MessageId: BE_NOT_OK - *  An error occurred. - */ -#define BE_NOT_OK                        (0xE0070002L) -/* - * MessageId: BE_STATUS_SYSTEM_RESOURCES - *  Insufficient host system resources exist to complete the API. - */ -#define BE_STATUS_SYSTEM_RESOURCES       (0xE0070003L) -/* - * MessageId: BE_STATUS_CHIP_RESOURCES - *  Insufficient chip resources exist to complete the API. - */ -#define BE_STATUS_CHIP_RESOURCES         (0xE0070004L) -/* - * MessageId: BE_STATUS_NO_RESOURCE - *  Insufficient resources to complete request. - */ -#define BE_STATUS_NO_RESOURCE            (0xE0070005L) -/* - * MessageId: BE_STATUS_BUSY - *  Resource is currently busy. - */ -#define BE_STATUS_BUSY                   (0xE0070006L) -/* - * MessageId: BE_STATUS_INVALID_PARAMETER - *  Invalid Parameter in request. - */ -#define BE_STATUS_INVALID_PARAMETER      (0xE0000007L) -/* - * MessageId: BE_STATUS_NOT_SUPPORTED - *  Requested operation is not supported. - */ -#define BE_STATUS_NOT_SUPPORTED          (0xE000000DL) - -/* - * *************************************************************************** - *                     E T H E R N E T   S T A T U S - * *************************************************************************** - */ - -/* - * MessageId: BE_ETH_TX_ERROR - *  The Ethernet device driver failed to transmit a packet. - */ -#define BE_ETH_TX_ERROR                  (0xE0070101L) - -/* - * *************************************************************************** - *                     S H A R E D   S T A T U S - * *************************************************************************** - */ - -/* - * MessageId: BE_STATUS_VBD_INVALID_VERSION - *  The device driver is not compatible with this version of the VBD. - */ -#define BE_STATUS_INVALID_VERSION    (0xE0070402L) -/* - * MessageId: BE_STATUS_DOMAIN_DENIED - *  The operation failed to complete due to insufficient access - *  rights for the requesting domain. - */ -#define BE_STATUS_DOMAIN_DENIED          (0xE0070403L) -/* - * MessageId: BE_STATUS_TCP_NOT_STARTED - *  The embedded TCP/IP stack has not been started. - */ -#define BE_STATUS_TCP_NOT_STARTED        (0xE0070409L) -/* - * MessageId: BE_STATUS_NO_MCC_WRB - *  No free MCC WRB are available for posting the request. - */ -#define BE_STATUS_NO_MCC_WRB                 (0xE0070414L) - -#endif /* _BESTATUS_ */ diff --git a/drivers/staging/benet/cev.h b/drivers/staging/benet/cev.h deleted file mode 100644 index 30996920a54..00000000000 --- a/drivers/staging/benet/cev.h +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __cev_amap_h__ -#define __cev_amap_h__ -#include "ep.h" - -/* - * Host Interrupt Status Register 0. The first of four application - * interrupt status registers. This register contains the interrupts - * for Event Queues EQ0 through EQ31. - */ -struct BE_CEV_ISR0_CSR_AMAP { -	u8 interrupt0;	/* DWORD 0 */ -	u8 interrupt1;	/* DWORD 0 */ -	u8 interrupt2;	/* DWORD 0 */ -	u8 interrupt3;	/* DWORD 0 */ -	u8 interrupt4;	/* DWORD 0 */ -	u8 interrupt5;	/* DWORD 0 */ -	u8 interrupt6;	/* DWORD 0 */ -	u8 interrupt7;	/* DWORD 0 */ -	u8 interrupt8;	/* DWORD 0 */ -	u8 interrupt9;	/* DWORD 0 */ -	u8 interrupt10;	/* DWORD 0 */ -	u8 interrupt11;	/* DWORD 0 */ -	u8 interrupt12;	/* DWORD 0 */ -	u8 interrupt13;	/* DWORD 0 */ -	u8 interrupt14;	/* DWORD 0 */ -	u8 interrupt15;	/* DWORD 0 */ -	u8 interrupt16;	/* DWORD 0 */ -	u8 interrupt17;	/* DWORD 0 */ -	u8 interrupt18;	/* DWORD 0 */ -	u8 interrupt19;	/* DWORD 0 */ -	u8 interrupt20;	/* DWORD 0 */ -	u8 interrupt21;	/* DWORD 0 */ -	u8 interrupt22;	/* DWORD 0 */ -	u8 interrupt23;	/* DWORD 0 */ -	u8 interrupt24;	/* DWORD 0 */ -	u8 interrupt25;	/* DWORD 0 */ -	u8 interrupt26;	/* DWORD 0 */ -	u8 interrupt27;	/* DWORD 0 */ -	u8 interrupt28;	/* DWORD 0 */ -	u8 interrupt29;	/* DWORD 0 */ -	u8 interrupt30;	/* DWORD 0 */ -	u8 interrupt31;	/* DWORD 0 */ -} __packed; -struct CEV_ISR0_CSR_AMAP { -	u32 dw[1]; -}; - -/* - * Host Interrupt Status Register 1. The second of four application - * interrupt status registers. This register contains the interrupts - * for Event Queues EQ32 through EQ63. - */ -struct BE_CEV_ISR1_CSR_AMAP { -	u8 interrupt32;	/* DWORD 0 */ -	u8 interrupt33;	/* DWORD 0 */ -	u8 interrupt34;	/* DWORD 0 */ -	u8 interrupt35;	/* DWORD 0 */ -	u8 interrupt36;	/* DWORD 0 */ -	u8 interrupt37;	/* DWORD 0 */ -	u8 interrupt38;	/* DWORD 0 */ -	u8 interrupt39;	/* DWORD 0 */ -	u8 interrupt40;	/* DWORD 0 */ -	u8 interrupt41;	/* DWORD 0 */ -	u8 interrupt42;	/* DWORD 0 */ -	u8 interrupt43;	/* DWORD 0 */ -	u8 interrupt44;	/* DWORD 0 */ -	u8 interrupt45;	/* DWORD 0 */ -	u8 interrupt46;	/* DWORD 0 */ -	u8 interrupt47;	/* DWORD 0 */ -	u8 interrupt48;	/* DWORD 0 */ -	u8 interrupt49;	/* DWORD 0 */ -	u8 interrupt50;	/* DWORD 0 */ -	u8 interrupt51;	/* DWORD 0 */ -	u8 interrupt52;	/* DWORD 0 */ -	u8 interrupt53;	/* DWORD 0 */ -	u8 interrupt54;	/* DWORD 0 */ -	u8 interrupt55;	/* DWORD 0 */ -	u8 interrupt56;	/* DWORD 0 */ -	u8 interrupt57;	/* DWORD 0 */ -	u8 interrupt58;	/* DWORD 0 */ -	u8 interrupt59;	/* DWORD 0 */ -	u8 interrupt60;	/* DWORD 0 */ -	u8 interrupt61;	/* DWORD 0 */ -	u8 interrupt62;	/* DWORD 0 */ -	u8 interrupt63;	/* DWORD 0 */ -} __packed; -struct CEV_ISR1_CSR_AMAP { -	u32 dw[1]; -}; -/* - * Host Interrupt Status Register 2. The third of four application - * interrupt status registers. This register contains the interrupts - * for Event Queues EQ64 through EQ95. - */ -struct BE_CEV_ISR2_CSR_AMAP { -	u8 interrupt64;	/* DWORD 0 */ -	u8 interrupt65;	/* DWORD 0 */ -	u8 interrupt66;	/* DWORD 0 */ -	u8 interrupt67;	/* DWORD 0 */ -	u8 interrupt68;	/* DWORD 0 */ -	u8 interrupt69;	/* DWORD 0 */ -	u8 interrupt70;	/* DWORD 0 */ -	u8 interrupt71;	/* DWORD 0 */ -	u8 interrupt72;	/* DWORD 0 */ -	u8 interrupt73;	/* DWORD 0 */ -	u8 interrupt74;	/* DWORD 0 */ -	u8 interrupt75;	/* DWORD 0 */ -	u8 interrupt76;	/* DWORD 0 */ -	u8 interrupt77;	/* DWORD 0 */ -	u8 interrupt78;	/* DWORD 0 */ -	u8 interrupt79;	/* DWORD 0 */ -	u8 interrupt80;	/* DWORD 0 */ -	u8 interrupt81;	/* DWORD 0 */ -	u8 interrupt82;	/* DWORD 0 */ -	u8 interrupt83;	/* DWORD 0 */ -	u8 interrupt84;	/* DWORD 0 */ -	u8 interrupt85;	/* DWORD 0 */ -	u8 interrupt86;	/* DWORD 0 */ -	u8 interrupt87;	/* DWORD 0 */ -	u8 interrupt88;	/* DWORD 0 */ -	u8 interrupt89;	/* DWORD 0 */ -	u8 interrupt90;	/* DWORD 0 */ -	u8 interrupt91;	/* DWORD 0 */ -	u8 interrupt92;	/* DWORD 0 */ -	u8 interrupt93;	/* DWORD 0 */ -	u8 interrupt94;	/* DWORD 0 */ -	u8 interrupt95;	/* DWORD 0 */ -} __packed; -struct CEV_ISR2_CSR_AMAP { -	u32 dw[1]; -}; - -/* - * Host Interrupt Status Register 3. The fourth of four application - * interrupt status registers. This register contains the interrupts - * for Event Queues EQ96 through EQ127. - */ -struct BE_CEV_ISR3_CSR_AMAP { -	u8 interrupt96;	/* DWORD 0 */ -	u8 interrupt97;	/* DWORD 0 */ -	u8 interrupt98;	/* DWORD 0 */ -	u8 interrupt99;	/* DWORD 0 */ -	u8 interrupt100;	/* DWORD 0 */ -	u8 interrupt101;	/* DWORD 0 */ -	u8 interrupt102;	/* DWORD 0 */ -	u8 interrupt103;	/* DWORD 0 */ -	u8 interrupt104;	/* DWORD 0 */ -	u8 interrupt105;	/* DWORD 0 */ -	u8 interrupt106;	/* DWORD 0 */ -	u8 interrupt107;	/* DWORD 0 */ -	u8 interrupt108;	/* DWORD 0 */ -	u8 interrupt109;	/* DWORD 0 */ -	u8 interrupt110;	/* DWORD 0 */ -	u8 interrupt111;	/* DWORD 0 */ -	u8 interrupt112;	/* DWORD 0 */ -	u8 interrupt113;	/* DWORD 0 */ -	u8 interrupt114;	/* DWORD 0 */ -	u8 interrupt115;	/* DWORD 0 */ -	u8 interrupt116;	/* DWORD 0 */ -	u8 interrupt117;	/* DWORD 0 */ -	u8 interrupt118;	/* DWORD 0 */ -	u8 interrupt119;	/* DWORD 0 */ -	u8 interrupt120;	/* DWORD 0 */ -	u8 interrupt121;	/* DWORD 0 */ -	u8 interrupt122;	/* DWORD 0 */ -	u8 interrupt123;	/* DWORD 0 */ -	u8 interrupt124;	/* DWORD 0 */ -	u8 interrupt125;	/* DWORD 0 */ -	u8 interrupt126;	/* DWORD 0 */ -	u8 interrupt127;	/* DWORD 0 */ -} __packed; -struct CEV_ISR3_CSR_AMAP { -	u32 dw[1]; -}; - -/*  Completions and Events block Registers.  */ -struct BE_CEV_CSRMAP_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -	u8 rsvd1[32];	/* DWORD 1 */ -	u8 rsvd2[32];	/* DWORD 2 */ -	u8 rsvd3[32];	/* DWORD 3 */ -	struct BE_CEV_ISR0_CSR_AMAP isr0; -	struct BE_CEV_ISR1_CSR_AMAP isr1; -	struct BE_CEV_ISR2_CSR_AMAP isr2; -	struct BE_CEV_ISR3_CSR_AMAP isr3; -	u8 rsvd4[32];	/* DWORD 8 */ -	u8 rsvd5[32];	/* DWORD 9 */ -	u8 rsvd6[32];	/* DWORD 10 */ -	u8 rsvd7[32];	/* DWORD 11 */ -	u8 rsvd8[32];	/* DWORD 12 */ -	u8 rsvd9[32];	/* DWORD 13 */ -	u8 rsvd10[32];	/* DWORD 14 */ -	u8 rsvd11[32];	/* DWORD 15 */ -	u8 rsvd12[32];	/* DWORD 16 */ -	u8 rsvd13[32];	/* DWORD 17 */ -	u8 rsvd14[32];	/* DWORD 18 */ -	u8 rsvd15[32];	/* DWORD 19 */ -	u8 rsvd16[32];	/* DWORD 20 */ -	u8 rsvd17[32];	/* DWORD 21 */ -	u8 rsvd18[32];	/* DWORD 22 */ -	u8 rsvd19[32];	/* DWORD 23 */ -	u8 rsvd20[32];	/* DWORD 24 */ -	u8 rsvd21[32];	/* DWORD 25 */ -	u8 rsvd22[32];	/* DWORD 26 */ -	u8 rsvd23[32];	/* DWORD 27 */ -	u8 rsvd24[32];	/* DWORD 28 */ -	u8 rsvd25[32];	/* DWORD 29 */ -	u8 rsvd26[32];	/* DWORD 30 */ -	u8 rsvd27[32];	/* DWORD 31 */ -	u8 rsvd28[32];	/* DWORD 32 */ -	u8 rsvd29[32];	/* DWORD 33 */ -	u8 rsvd30[192];	/* DWORD 34 */ -	u8 rsvd31[192];	/* DWORD 40 */ -	u8 rsvd32[160];	/* DWORD 46 */ -	u8 rsvd33[160];	/* DWORD 51 */ -	u8 rsvd34[160];	/* DWORD 56 */ -	u8 rsvd35[96];	/* DWORD 61 */ -	u8 rsvd36[192][32];	/* DWORD 64 */ -} __packed; -struct CEV_CSRMAP_AMAP { -	u32 dw[256]; -}; - -#endif /* __cev_amap_h__ */ diff --git a/drivers/staging/benet/cq.c b/drivers/staging/benet/cq.c deleted file mode 100644 index 65045864543..00000000000 --- a/drivers/staging/benet/cq.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#include "hwlib.h" -#include "bestatus.h" - -/* - * Completion Queue Objects - */ -/* - *============================================================================ - *                  P U B L I C  R O U T I N E S - *============================================================================ - */ - -/* -    This routine creates a completion queue based on the client completion -    queue configuration information. - - -    FunctionObject      - Handle to a function object -    CqBaseVa            - Base VA for a the CQ ring -    NumEntries          - CEV_CQ_CNT_* values -    solEventEnable      - 0 = All CQEs can generate Events if CQ is eventable -			1 = only CQEs with solicited bit set are eventable -    eventable           - Eventable CQ, generates interrupts. -    nodelay             - 1 = Force interrupt, relevent if CQ eventable. -			Interrupt is asserted immediately after EQE -			write is confirmed, regardless of EQ Timer -			or watermark settings. -    wme                 - Enable watermark based coalescing -    wmThresh            - High watermark(CQ fullness at which event -			or interrupt should be asserted).  These are the -			CEV_WATERMARK encoded values. -    EqObject            - EQ Handle to assign to this CQ -    ppCqObject          - Internal CQ Handle returned. - -    Returns BE_SUCCESS if successfull, otherwise a useful error code is -	returned. - -    IRQL < DISPATCH_LEVEL - -*/ -int be_cq_create(struct be_function_object *pfob, -	struct ring_desc *rd, u32 length, bool solicited_eventable, -	bool no_delay, u32 wm_thresh, -	struct be_eq_object *eq_object, struct be_cq_object *cq_object) -{ -	int status = BE_SUCCESS; -	u32 num_entries_encoding; -	u32 num_entries = length / sizeof(struct MCC_CQ_ENTRY_AMAP); -	struct FWCMD_COMMON_CQ_CREATE *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	u32 n; -	unsigned long irql; - -	ASSERT(rd); -	ASSERT(cq_object); -	ASSERT(length % sizeof(struct MCC_CQ_ENTRY_AMAP) == 0); - -	switch (num_entries) { -	case 256: -		num_entries_encoding = CEV_CQ_CNT_256; -		break; -	case 512: -		num_entries_encoding = CEV_CQ_CNT_512; -		break; -	case 1024: -		num_entries_encoding = CEV_CQ_CNT_1024; -		break; -	default: -		ASSERT(0); -		return BE_STATUS_INVALID_PARAMETER; -	} - -	/* -	 * All cq entries all the same size.  Use iSCSI version -	 * as a test for the proper rd length. -	 */ -	memset(cq_object, 0, sizeof(*cq_object)); - -	atomic_set(&cq_object->ref_count, 0); -	cq_object->parent_function = pfob; -	cq_object->eq_object = eq_object; -	cq_object->num_entries = num_entries; -	/* save for MCC cq processing */ -	cq_object->va = rd->va; - -	/* map into UT. */ -	length = num_entries * sizeof(struct MCC_CQ_ENTRY_AMAP); - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		ASSERT(wrb); -		TRACE(DL_ERR, "No free MCC WRBs in create EQ."); -		status = BE_STATUS_NO_MCC_WRB; -		goto Error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_CQ_CREATE); - -	fwcmd->params.request.num_pages = PAGES_SPANNED(OFFSET_IN_PAGE(rd->va), -									length); - -	AMAP_SET_BITS_PTR(CQ_CONTEXT, valid, &fwcmd->params.request.context, 1); -	n = pfob->pci_function_number; -	AMAP_SET_BITS_PTR(CQ_CONTEXT, Func, &fwcmd->params.request.context, n); - -	n = (eq_object != NULL); -	AMAP_SET_BITS_PTR(CQ_CONTEXT, Eventable, -				&fwcmd->params.request.context, n); -	AMAP_SET_BITS_PTR(CQ_CONTEXT, Armed, &fwcmd->params.request.context, 1); - -	n = eq_object ? eq_object->eq_id : 0; -	AMAP_SET_BITS_PTR(CQ_CONTEXT, EQID, &fwcmd->params.request.context, n); -	AMAP_SET_BITS_PTR(CQ_CONTEXT, Count, -			&fwcmd->params.request.context, num_entries_encoding); - -	n = 0; /* Protection Domain is always 0 in  Linux  driver */ -	AMAP_SET_BITS_PTR(CQ_CONTEXT, PD, &fwcmd->params.request.context, n); -	AMAP_SET_BITS_PTR(CQ_CONTEXT, NoDelay, -				&fwcmd->params.request.context, no_delay); -	AMAP_SET_BITS_PTR(CQ_CONTEXT, SolEvent, -			&fwcmd->params.request.context, solicited_eventable); - -	n = (wm_thresh != 0xFFFFFFFF); -	AMAP_SET_BITS_PTR(CQ_CONTEXT, WME, &fwcmd->params.request.context, n); - -	n = (n ? wm_thresh : 0); -	AMAP_SET_BITS_PTR(CQ_CONTEXT, Watermark, -				&fwcmd->params.request.context, n); -	/* Create a page list for the FWCMD. */ -	be_rd_to_pa_list(rd, fwcmd->params.request.pages, -			  ARRAY_SIZE(fwcmd->params.request.pages)); - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -			NULL, NULL, fwcmd, NULL); -	if (status != BE_SUCCESS) { -		TRACE(DL_ERR, "MCC to create CQ failed."); -		goto Error; -	} -	/* Remember the CQ id. */ -	cq_object->cq_id = fwcmd->params.response.cq_id; - -	/* insert this cq into eq_object reference */ -	if (eq_object) { -		atomic_inc(&eq_object->ref_count); -		list_add_tail(&cq_object->cqlist_for_eq, -					&eq_object->cq_list_head); -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* - -    Deferences the given object. Once the object's reference count drops to -    zero, the object is destroyed and all resources that are held by this object -    are released.  The on-chip context is also destroyed along with the queue -    ID, and any mappings made into the UT. - -    cq_object            - CQ handle returned from cq_object_create. - -    returns the current reference count on the object - -    IRQL: IRQL < DISPATCH_LEVEL -*/ -int be_cq_destroy(struct be_cq_object *cq_object) -{ -	int status = 0; - -	/* Nothing should reference this CQ at this point. */ -	ASSERT(atomic_read(&cq_object->ref_count) == 0); - -	/* Send fwcmd to destroy the CQ. */ -	status = be_function_ring_destroy(cq_object->parent_function, -		     cq_object->cq_id, FWCMD_RING_TYPE_CQ, -					NULL, NULL, NULL, NULL); -	ASSERT(status == 0); - -	/* Remove reference if this is an eventable CQ. */ -	if (cq_object->eq_object) { -		atomic_dec(&cq_object->eq_object->ref_count); -		list_del(&cq_object->cqlist_for_eq); -	} -	return BE_SUCCESS; -} - diff --git a/drivers/staging/benet/descriptors.h b/drivers/staging/benet/descriptors.h deleted file mode 100644 index 8da438c407d..00000000000 --- a/drivers/staging/benet/descriptors.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __descriptors_amap_h__ -#define __descriptors_amap_h__ - -/* - * --- IPC_NODE_ID_ENUM --- - * IPC processor id values - */ -#define TPOST_NODE_ID                   (0)	/* TPOST ID */ -#define TPRE_NODE_ID                    (1)	/* TPRE ID */ -#define TXULP0_NODE_ID                  (2)	/* TXULP0 ID */ -#define TXULP1_NODE_ID                  (3)	/* TXULP1 ID */ -#define TXULP2_NODE_ID                  (4)	/* TXULP2 ID */ -#define RXULP0_NODE_ID                  (5)	/* RXULP0 ID */ -#define RXULP1_NODE_ID                  (6)	/* RXULP1 ID */ -#define RXULP2_NODE_ID                  (7)	/* RXULP2 ID */ -#define MPU_NODE_ID                     (15)	/* MPU ID */ - -/* - * --- MAC_ID_ENUM --- - * Meaning of the mac_id field in rxpp_eth_d - */ -#define PORT0_HOST_MAC0    (0)  /* PD 0, Port 0, host networking, MAC 0. */ -#define PORT0_HOST_MAC1    (1)	/* PD 0, Port 0, host networking, MAC 1. */ -#define PORT0_STORAGE_MAC0 (2)	/* PD 0, Port 0, host storage, MAC 0. */ -#define PORT0_STORAGE_MAC1 (3)	/* PD 0, Port 0, host storage, MAC 1. */ -#define PORT1_HOST_MAC0    (4)	/* PD 0, Port 1 host networking, MAC 0. */ -#define PORT1_HOST_MAC1    (5)	/* PD 0, Port 1 host networking, MAC 1. */ -#define PORT1_STORAGE_MAC0 (6)	/* PD 0, Port 1 host storage, MAC 0. */ -#define PORT1_STORAGE_MAC1 (7)	/* PD 0, Port 1 host storage, MAC 1. */ -#define FIRST_VM_MAC       (8)	/* PD 1 MAC. Protection domains have IDs */ -				/* from 0x8-0x26, one per PD. */ -#define LAST_VM_MAC        (38)	/* PD 31 MAC. */ -#define MGMT_MAC           (39)	/* Management port MAC. */ -#define MARBLE_MAC0        (59)	/* Used for flushing function 0 receive */ -				  /* -				   * queues before re-using a torn-down -				   * receive ring. the DA = -				   * 00-00-00-00-00-00, and the MSB of the -				   * SA = 00 -				   */ -#define MARBLE_MAC1        (60)	/* Used for flushing function 1 receive */ -				  /* -				   * queues before re-using a torn-down -				   * receive ring. the DA = -				   * 00-00-00-00-00-00, and the MSB of the -				   * SA != 00 -				   */ -#define NULL_MAC           (61)	/* Promiscuous mode, indicates no match */ -#define MCAST_MAC          (62)	/* Multicast match. */ -#define BCAST_MATCH        (63)	/* Broadcast match. */ - -#endif /* __descriptors_amap_h__ */ diff --git a/drivers/staging/benet/doorbells.h b/drivers/staging/benet/doorbells.h deleted file mode 100644 index 550cc4d5d6f..00000000000 --- a/drivers/staging/benet/doorbells.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __doorbells_amap_h__ -#define __doorbells_amap_h__ - -/* The TX/RDMA send queue doorbell. */ -struct BE_SQ_DB_AMAP { -	u8 cid[11];		/* DWORD 0 */ -	u8 rsvd0[5];	/* DWORD 0 */ -	u8 numPosted[14];	/* DWORD 0 */ -	u8 rsvd1[2];	/* DWORD 0 */ -} __packed; -struct SQ_DB_AMAP { -	u32 dw[1]; -}; - -/* The receive queue doorbell. */ -struct BE_RQ_DB_AMAP { -	u8 rq[10];		/* DWORD 0 */ -	u8 rsvd0[13];	/* DWORD 0 */ -	u8 Invalidate;	/* DWORD 0 */ -	u8 numPosted[8];	/* DWORD 0 */ -} __packed; -struct RQ_DB_AMAP { -	u32 dw[1]; -}; - -/* - * The CQ/EQ doorbell. Software MUST set reserved fields in this - * descriptor to zero, otherwise (CEV) hardware will not execute the - * doorbell (flagging a bad_db_qid error instead). - */ -struct BE_CQ_DB_AMAP { -	u8 qid[10];		/* DWORD 0 */ -	u8 rsvd0[4];	/* DWORD 0 */ -	u8 rearm;		/* DWORD 0 */ -	u8 event;		/* DWORD 0 */ -	u8 num_popped[13];	/* DWORD 0 */ -	u8 rsvd1[3];	/* DWORD 0 */ -} __packed; -struct CQ_DB_AMAP { -	u32 dw[1]; -}; - -struct BE_TPM_RQ_DB_AMAP { -	u8 qid[10];		/* DWORD 0 */ -	u8 rsvd0[6];	/* DWORD 0 */ -	u8 numPosted[11];	/* DWORD 0 */ -	u8 mss_cnt[5];	/* DWORD 0 */ -} __packed; -struct TPM_RQ_DB_AMAP { -	u32 dw[1]; -}; - -/* - * Post WRB Queue Doorbell Register used by the host Storage stack - * to notify the controller of a posted Work Request Block - */ -struct BE_WRB_POST_DB_AMAP { -	u8 wrb_cid[10];	/* DWORD 0 */ -	u8 rsvd0[6];	/* DWORD 0 */ -	u8 wrb_index[8];	/* DWORD 0 */ -	u8 numberPosted[8];	/* DWORD 0 */ -} __packed; -struct WRB_POST_DB_AMAP { -	u32 dw[1]; -}; - -/* - * Update Default PDU Queue Doorbell Register used to communicate - * to the controller that the driver has stopped processing the queue - * and where in the queue it stopped, this is - * a CQ Entry Type. Used by storage driver. - */ -struct BE_DEFAULT_PDU_DB_AMAP { -	u8 qid[10];		/* DWORD 0 */ -	u8 rsvd0[4];	/* DWORD 0 */ -	u8 rearm;		/* DWORD 0 */ -	u8 event;		/* DWORD 0 */ -	u8 cqproc[14];	/* DWORD 0 */ -	u8 rsvd1[2];	/* DWORD 0 */ -} __packed; -struct DEFAULT_PDU_DB_AMAP { -	u32 dw[1]; -}; - -/* Management Command and Controller default fragment ring */ -struct BE_MCC_DB_AMAP { -	u8 rid[11];		/* DWORD 0 */ -	u8 rsvd0[5];	/* DWORD 0 */ -	u8 numPosted[14];	/* DWORD 0 */ -	u8 rsvd1[2];	/* DWORD 0 */ -} __packed; -struct MCC_DB_AMAP { -	u32 dw[1]; -}; - -/* - * Used for bootstrapping the Host interface. This register is - * used for driver communication with the MPU when no MCC Rings exist. - * The software must write this register twice to post any MCC - * command. First, it writes the register with hi=1 and the upper bits of - * the  physical address for the MCC_MAILBOX structure.  Software must poll - * the ready bit until this is acknowledged.  Then, sotware writes the - * register with hi=0 with the lower bits in the address.  It must - * poll the ready bit until the MCC command is complete.  Upon completion, - * the MCC_MAILBOX will contain a valid completion queue  entry. - */ -struct BE_MPU_MAILBOX_DB_AMAP { -	u8 ready;		/* DWORD 0 */ -	u8 hi;		/* DWORD 0 */ -	u8 address[30];	/* DWORD 0 */ -} __packed; -struct MPU_MAILBOX_DB_AMAP { -	u32 dw[1]; -}; - -/* - *  This is the protection domain doorbell register map. Note that - *  while this map shows doorbells for all Blade Engine supported - *  protocols, not all of these may be valid in a given function or - *  protection domain. It is the responsibility of the application - *  accessing the doorbells to know which are valid. Each doorbell - *  occupies 32 bytes of space, but unless otherwise specified, - *  only the first 4 bytes should be written.  There are 32 instances - *  of these doorbells for the host and 31 virtual machines respectively. - *  The host and VMs will only map the doorbell pages belonging to its - *  protection domain. It will not be able to touch the doorbells for - *  another VM. The doorbells are the only registers directly accessible - *  by a virtual machine. Similarly, there are 511 additional - *  doorbells for RDMA protection domains. PD 0 for RDMA shares - *  the same physical protection domain doorbell page as ETH/iSCSI. - * - */ -struct BE_PROTECTION_DOMAIN_DBMAP_AMAP { -	u8 rsvd0[512];	/* DWORD 0 */ -	struct BE_SQ_DB_AMAP rdma_sq_db; -	u8 rsvd1[7][32];	/* DWORD 17 */ -	struct BE_WRB_POST_DB_AMAP iscsi_wrb_post_db; -	u8 rsvd2[7][32];	/* DWORD 25 */ -	struct BE_SQ_DB_AMAP etx_sq_db; -	u8 rsvd3[7][32];	/* DWORD 33 */ -	struct BE_RQ_DB_AMAP rdma_rq_db; -	u8 rsvd4[7][32];	/* DWORD 41 */ -	struct BE_DEFAULT_PDU_DB_AMAP iscsi_default_pdu_db; -	u8 rsvd5[7][32];	/* DWORD 49 */ -	struct BE_TPM_RQ_DB_AMAP tpm_rq_db; -	u8 rsvd6[7][32];	/* DWORD 57 */ -	struct BE_RQ_DB_AMAP erx_rq_db; -	u8 rsvd7[7][32];	/* DWORD 65 */ -	struct BE_CQ_DB_AMAP cq_db; -	u8 rsvd8[7][32];	/* DWORD 73 */ -	struct BE_MCC_DB_AMAP mpu_mcc_db; -	u8 rsvd9[7][32];	/* DWORD 81 */ -	struct BE_MPU_MAILBOX_DB_AMAP mcc_bootstrap_db; -	u8 rsvd10[935][32];	/* DWORD 89 */ -} __packed; -struct PROTECTION_DOMAIN_DBMAP_AMAP { -	u32 dw[1024]; -}; - -#endif /* __doorbells_amap_h__ */ diff --git a/drivers/staging/benet/ep.h b/drivers/staging/benet/ep.h deleted file mode 100644 index 72fcf64a9ff..00000000000 --- a/drivers/staging/benet/ep.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __ep_amap_h__ -#define __ep_amap_h__ - -/* General Control and Status Register. */ -struct BE_EP_CONTROL_CSR_AMAP { -	u8 m0_RxPbuf;	/* DWORD 0 */ -	u8 m1_RxPbuf;	/* DWORD 0 */ -	u8 m2_RxPbuf;	/* DWORD 0 */ -	u8 ff_en;		/* DWORD 0 */ -	u8 rsvd0[27];	/* DWORD 0 */ -	u8 CPU_reset;	/* DWORD 0 */ -} __packed; -struct EP_CONTROL_CSR_AMAP { -	u32 dw[1]; -}; - -/* Semaphore Register. */ -struct BE_EP_SEMAPHORE_CSR_AMAP { -	u8 value[32];	/* DWORD 0 */ -} __packed; -struct EP_SEMAPHORE_CSR_AMAP { -	u32 dw[1]; -}; - -/* Embedded Processor Specific Registers. */ -struct BE_EP_CSRMAP_AMAP { -	struct BE_EP_CONTROL_CSR_AMAP ep_control; -	u8 rsvd0[32];	/* DWORD 1 */ -	u8 rsvd1[32];	/* DWORD 2 */ -	u8 rsvd2[32];	/* DWORD 3 */ -	u8 rsvd3[32];	/* DWORD 4 */ -	u8 rsvd4[32];	/* DWORD 5 */ -	u8 rsvd5[8][128];	/* DWORD 6 */ -	u8 rsvd6[32];	/* DWORD 38 */ -	u8 rsvd7[32];	/* DWORD 39 */ -	u8 rsvd8[32];	/* DWORD 40 */ -	u8 rsvd9[32];	/* DWORD 41 */ -	u8 rsvd10[32];	/* DWORD 42 */ -	struct BE_EP_SEMAPHORE_CSR_AMAP ep_semaphore; -	u8 rsvd11[32];	/* DWORD 44 */ -	u8 rsvd12[19][32];	/* DWORD 45 */ -} __packed; -struct EP_CSRMAP_AMAP { -	u32 dw[64]; -}; - -#endif /* __ep_amap_h__ */ diff --git a/drivers/staging/benet/eq.c b/drivers/staging/benet/eq.c deleted file mode 100644 index db92ccd8fed..00000000000 --- a/drivers/staging/benet/eq.c +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#include "hwlib.h" -#include "bestatus.h" -/* -    This routine creates an event queue based on the client completion -    queue configuration information. - -    FunctionObject      - Handle to a function object -    EqBaseVa            - Base VA for a the EQ ring -    SizeEncoding        - The encoded size for the EQ entries. This value is -			either CEV_EQ_SIZE_4 or CEV_EQ_SIZE_16 -    NumEntries          - CEV_CQ_CNT_* values. -    Watermark           - Enables watermark based coalescing.  This parameter -			must be of the type CEV_WMARK_* if watermarks -			are enabled.  If watermarks to to be disabled -			this value should be-1. -    TimerDelay          - If a timer delay is enabled this value should be the -			time of the delay in 8 microsecond units.  If -			delays are not used this parameter should be -			set to -1. -    ppEqObject          - Internal EQ Handle returned. - -    Returns BE_SUCCESS if successfull,, otherwise a useful error code -	is returned. - -    IRQL < DISPATCH_LEVEL -*/ -int -be_eq_create(struct be_function_object *pfob, -		struct ring_desc *rd, u32 eqe_size, u32 num_entries, -		u32 watermark,	/* CEV_WMARK_* or -1 */ -		u32 timer_delay,	/* in 8us units, or -1 */ -		struct be_eq_object *eq_object) -{ -	int status = BE_SUCCESS; -	u32 num_entries_encoding, eqe_size_encoding, length; -	struct FWCMD_COMMON_EQ_CREATE *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	u32 n; -	unsigned long irql; - -	ASSERT(rd); -	ASSERT(eq_object); - -	switch (num_entries) { -	case 256: -		num_entries_encoding = CEV_EQ_CNT_256; -		break; -	case 512: -		num_entries_encoding = CEV_EQ_CNT_512; -		break; -	case 1024: -		num_entries_encoding = CEV_EQ_CNT_1024; -		break; -	case 2048: -		num_entries_encoding = CEV_EQ_CNT_2048; -		break; -	case 4096: -		num_entries_encoding = CEV_EQ_CNT_4096; -		break; -	default: -		ASSERT(0); -		return BE_STATUS_INVALID_PARAMETER; -	} - -	switch (eqe_size) { -	case 4: -		eqe_size_encoding = CEV_EQ_SIZE_4; -		break; -	case 16: -		eqe_size_encoding = CEV_EQ_SIZE_16; -		break; -	default: -		ASSERT(0); -		return BE_STATUS_INVALID_PARAMETER; -	} - -	if ((eqe_size == 4 && num_entries < 1024) || -	    (eqe_size == 16 && num_entries == 4096)) { -		TRACE(DL_ERR, "Bad EQ size. eqe_size:%d num_entries:%d", -		      eqe_size, num_entries); -		ASSERT(0); -		return BE_STATUS_INVALID_PARAMETER; -	} - -	memset(eq_object, 0, sizeof(*eq_object)); - -	atomic_set(&eq_object->ref_count, 0); -	eq_object->parent_function = pfob; -	eq_object->eq_id = 0xFFFFFFFF; - -	INIT_LIST_HEAD(&eq_object->cq_list_head); - -	length = num_entries * eqe_size; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		ASSERT(wrb); -		TRACE(DL_ERR, "No free MCC WRBs in create EQ."); -		status = BE_STATUS_NO_MCC_WRB; -		goto Error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_EQ_CREATE); - -	fwcmd->params.request.num_pages = PAGES_SPANNED(OFFSET_IN_PAGE(rd->va), -									length); -	n = pfob->pci_function_number; -	AMAP_SET_BITS_PTR(EQ_CONTEXT, Func, &fwcmd->params.request.context, n); - -	AMAP_SET_BITS_PTR(EQ_CONTEXT, valid, &fwcmd->params.request.context, 1); - -	AMAP_SET_BITS_PTR(EQ_CONTEXT, Size, -			&fwcmd->params.request.context, eqe_size_encoding); - -	n = 0; /* Protection Domain is always 0 in  Linux  driver */ -	AMAP_SET_BITS_PTR(EQ_CONTEXT, PD, &fwcmd->params.request.context, n); - -	/* Let the caller ARM the EQ with the doorbell. */ -	AMAP_SET_BITS_PTR(EQ_CONTEXT, Armed, &fwcmd->params.request.context, 0); - -	AMAP_SET_BITS_PTR(EQ_CONTEXT, Count, &fwcmd->params.request.context, -					num_entries_encoding); - -	n = pfob->pci_function_number * 32; -	AMAP_SET_BITS_PTR(EQ_CONTEXT, EventVect, -				&fwcmd->params.request.context, n); -	if (watermark != -1) { -		AMAP_SET_BITS_PTR(EQ_CONTEXT, WME, -				&fwcmd->params.request.context, 1); -		AMAP_SET_BITS_PTR(EQ_CONTEXT, Watermark, -				&fwcmd->params.request.context, watermark); -		ASSERT(watermark <= CEV_WMARK_240); -	} else -		AMAP_SET_BITS_PTR(EQ_CONTEXT, WME, -					&fwcmd->params.request.context, 0); -	if (timer_delay != -1) { -		AMAP_SET_BITS_PTR(EQ_CONTEXT, TMR, -					&fwcmd->params.request.context, 1); - -		ASSERT(timer_delay <= 250);	/* max value according to EAS */ -		timer_delay = min(timer_delay, (u32)250); - -		AMAP_SET_BITS_PTR(EQ_CONTEXT, Delay, -				&fwcmd->params.request.context, timer_delay); -	} else { -		AMAP_SET_BITS_PTR(EQ_CONTEXT, TMR, -				&fwcmd->params.request.context, 0); -	} -	/* Create a page list for the FWCMD. */ -	be_rd_to_pa_list(rd, fwcmd->params.request.pages, -			  ARRAY_SIZE(fwcmd->params.request.pages)); - -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -					NULL, NULL, fwcmd, NULL); -	if (status != BE_SUCCESS) { -		TRACE(DL_ERR, "MCC to create EQ failed."); -		goto Error; -	} -	/* Get the EQ id.  The MPU allocates the IDs. */ -	eq_object->eq_id = fwcmd->params.response.eq_id; - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* -    Deferences the given object. Once the object's reference count drops to -    zero, the object is destroyed and all resources that are held by this -    object are released.  The on-chip context is also destroyed along with -    the queue ID, and any mappings made into the UT. - -    eq_object            - EQ handle returned from eq_object_create. - -    Returns BE_SUCCESS if successfull, otherwise a useful error code -	is returned. - -    IRQL: IRQL < DISPATCH_LEVEL -*/ -int be_eq_destroy(struct be_eq_object *eq_object) -{ -	int status = 0; - -	ASSERT(atomic_read(&eq_object->ref_count) == 0); -	/* no CQs should reference this EQ now */ -	ASSERT(list_empty(&eq_object->cq_list_head)); - -	/* Send fwcmd to destroy the EQ. */ -	status = be_function_ring_destroy(eq_object->parent_function, -			     eq_object->eq_id, FWCMD_RING_TYPE_EQ, -					NULL, NULL, NULL, NULL); -	ASSERT(status == 0); - -	return BE_SUCCESS; -} -/* - *--------------------------------------------------------------------------- - * Function: be_eq_modify_delay - *   Changes the EQ delay for a group of EQs. - * num_eq             - The number of EQs in the eq_array to adjust. - * 			This also is the number of delay values in - * 			the eq_delay_array. - * eq_array           - Array of struct be_eq_object pointers to adjust. - * eq_delay_array     - Array of "num_eq" timer delays in units - * 			of microseconds. The be_eq_query_delay_range - * 			fwcmd returns the resolution and range of - *                      legal EQ delays. - * cb           - - * cb_context   - - * q_ctxt             - Optional. Pointer to a previously allocated - * 			struct. If the MCC WRB ring is full, this - * 			structure is used to queue the operation. It - *                      will be posted to the MCC ring when space - *                      becomes available. All queued commands will - *                      be posted to the ring in the order they are - *                      received. It is always valid to pass a pointer to - *                      a generic be_generic_q_cntxt. However, - *                      the specific context structs - *                      are generally smaller than the generic struct. - * return pend_status - BE_SUCCESS (0) on success. - * 			BE_PENDING (postive value) if the FWCMD - *                      completion is pending. Negative error code on failure. - *------------------------------------------------------------------------- - */ -int -be_eq_modify_delay(struct be_function_object *pfob, -		   u32 num_eq, struct be_eq_object **eq_array, -		   u32 *eq_delay_array, mcc_wrb_cqe_callback cb, -		   void *cb_context, struct be_eq_modify_delay_q_ctxt *q_ctxt) -{ -	struct FWCMD_COMMON_MODIFY_EQ_DELAY *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	struct be_generic_q_ctxt *gen_ctxt = NULL; -	u32 i; -	unsigned long irql; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		if (q_ctxt && cb) { -			wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header; -			gen_ctxt = (struct be_generic_q_ctxt *) q_ctxt; -			gen_ctxt->context.bytes = sizeof(*q_ctxt); -		} else { -			status = BE_STATUS_NO_MCC_WRB; -			goto Error; -		} -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_MODIFY_EQ_DELAY); - -	ASSERT(num_eq > 0); -	ASSERT(num_eq <= ARRAY_SIZE(fwcmd->params.request.delay)); -	fwcmd->params.request.num_eq = num_eq; -	for (i = 0; i < num_eq; i++) { -		fwcmd->params.request.delay[i].eq_id = eq_array[i]->eq_id; -		fwcmd->params.request.delay[i].delay_in_microseconds = -		    eq_delay_array[i]; -	} - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, gen_ctxt, -			cb, cb_context, NULL, NULL, fwcmd, NULL); - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - diff --git a/drivers/staging/benet/eth.c b/drivers/staging/benet/eth.c deleted file mode 100644 index f641b6260d0..00000000000 --- a/drivers/staging/benet/eth.c +++ /dev/null @@ -1,1273 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#include <linux/if_ether.h> -#include "hwlib.h" -#include "bestatus.h" - -/* - *--------------------------------------------------------- - * Function: be_eth_sq_create_ex - *   Creates an ethernet send ring - extended version with - *   additional parameters. - * pfob - - * rd             - ring address - * length_in_bytes - - * type            - The type of ring to create. - * ulp             - The requested ULP number for the ring. - * 		     This should be zero based, i.e. 0,1,2. This must - * 		     be valid NIC ULP based on the firmware config. - *                   All doorbells for this ring must be sent to - *                   this ULP. The first network ring allocated for - *                   each ULP are higher performance than subsequent rings. - * cq_object       - cq object for completions - * ex_parameters   - Additional parameters (that may increase in - * 		     future revisions). These parameters are only used - * 		     for certain ring types -- see - *                   struct be_eth_sq_parameters for details. - * eth_sq          - - * return status   - BE_SUCCESS (0) on success. Negative error code on failure. - *--------------------------------------------------------- - */ -int -be_eth_sq_create_ex(struct be_function_object *pfob, struct ring_desc *rd, -		u32 length, u32 type, u32 ulp, struct be_cq_object *cq_object, -		struct be_eth_sq_parameters *ex_parameters, -		struct be_ethsq_object *eth_sq) -{ -	struct FWCMD_COMMON_ETH_TX_CREATE *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	u32 n; -	unsigned long irql; - -	ASSERT(rd); -	ASSERT(eth_sq); -	ASSERT(ex_parameters); - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	memset(eth_sq, 0, sizeof(*eth_sq)); - -	eth_sq->parent_function = pfob; -	eth_sq->bid = 0xFFFFFFFF; -	eth_sq->cq_object = cq_object; - -	/* Translate hwlib interface to arm interface. */ -	switch (type) { -	case BE_ETH_TX_RING_TYPE_FORWARDING: -		type = ETH_TX_RING_TYPE_FORWARDING; -		break; -	case BE_ETH_TX_RING_TYPE_STANDARD: -		type = ETH_TX_RING_TYPE_STANDARD; -		break; -	case BE_ETH_TX_RING_TYPE_BOUND: -		ASSERT(ex_parameters->port < 2); -		type = ETH_TX_RING_TYPE_BOUND; -		break; -	default: -		TRACE(DL_ERR, "Invalid eth tx ring type:%d", type); -		return BE_NOT_OK; -		break; -	} - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		ASSERT(wrb); -		TRACE(DL_ERR, "No free MCC WRBs in create EQ."); -		status = BE_STATUS_NO_MCC_WRB; -		goto Error; -	} -	/* NIC must be supported by the current config. */ -	ASSERT(pfob->fw_config.nic_ulp_mask); - -	/* -	 * The ulp parameter must select a valid NIC ULP -	 * for the current config. -	 */ -	ASSERT((1 << ulp) & pfob->fw_config.nic_ulp_mask); - -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_ETH_TX_CREATE); -	fwcmd->header.request.port_number = ex_parameters->port; - -	AMAP_SET_BITS_PTR(ETX_CONTEXT, pd_id, -				&fwcmd->params.request.context, 0); - -	n = be_ring_length_to_encoding(length, sizeof(struct ETH_WRB_AMAP)); -	AMAP_SET_BITS_PTR(ETX_CONTEXT, tx_ring_size, -					&fwcmd->params.request.context, n); - -	AMAP_SET_BITS_PTR(ETX_CONTEXT, cq_id_send, -			&fwcmd->params.request.context, cq_object->cq_id); - -	n = pfob->pci_function_number; -	AMAP_SET_BITS_PTR(ETX_CONTEXT, func, &fwcmd->params.request.context, n); - -	fwcmd->params.request.type = type; -	fwcmd->params.request.ulp_num  = (1 << ulp); -	fwcmd->params.request.num_pages = DIV_ROUND_UP(length, PAGE_SIZE); -	ASSERT(PAGES_SPANNED(rd->va, rd->length) >= -				fwcmd->params.request.num_pages); - -	/* Create a page list for the FWCMD. */ -	be_rd_to_pa_list(rd, fwcmd->params.request.pages, -			  ARRAY_SIZE(fwcmd->params.request.pages)); - -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -					NULL, NULL, fwcmd, NULL); -	if (status != BE_SUCCESS) { -		TRACE(DL_ERR, "MCC to create etx queue failed."); -		goto Error; -	} -	/* save the butler ID */ -	eth_sq->bid = fwcmd->params.response.cid; - -	/* add a reference to the corresponding CQ */ -	atomic_inc(&cq_object->ref_count); - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - - -/* -    This routine destroys an ethernet send queue - -    EthSq - EthSq Handle returned from EthSqCreate - -    This function always return BE_SUCCESS. - -    This function frees memory allocated by EthSqCreate for the EthSq Object. - -*/ -int be_eth_sq_destroy(struct be_ethsq_object *eth_sq) -{ -	int status = 0; - -	/* Send fwcmd to destroy the queue. */ -	status = be_function_ring_destroy(eth_sq->parent_function, eth_sq->bid, -		     FWCMD_RING_TYPE_ETH_TX, NULL, NULL, NULL, NULL); -	ASSERT(status == 0); - -	/* Derefence any associated CQs. */ -	atomic_dec(ð_sq->cq_object->ref_count); -	return status; -} -/* -    This routine attempts to set the transmit flow control parameters. - -    FunctionObject      - Handle to a function object - -    txfc_enable         - transmit flow control enable - true for -			  enable, false for disable - -    rxfc_enable         - receive flow control enable - true for -				enable, false for disable - -    Returns BE_SUCCESS if successfull, otherwise a useful int error -    code is returned. - -    IRQL: < DISPATCH_LEVEL - -    This function always fails in non-privileged machine context. -*/ -int -be_eth_set_flow_control(struct be_function_object *pfob, -			bool txfc_enable, bool rxfc_enable) -{ -	struct FWCMD_COMMON_SET_FLOW_CONTROL *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	unsigned long irql; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_SET_FLOW_CONTROL); - -	fwcmd->params.request.rx_flow_control = rxfc_enable; -	fwcmd->params.request.tx_flow_control = txfc_enable; - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -					NULL, NULL, fwcmd, NULL); - -	if (status != 0) { -		TRACE(DL_ERR, "set flow control fwcmd failed."); -		goto error; -	} - -error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* -    This routine attempts to get the transmit flow control parameters. - -    pfob      - Handle to a function object - -    txfc_enable         - transmit flow control enable - true for -			enable, false for disable - -    rxfc_enable         - receive flow control enable - true for enable, -			false for disable - -    Returns BE_SUCCESS if successfull, otherwise a useful int error code -			is returned. - -    IRQL: < DISPATCH_LEVEL - -    This function always fails in non-privileged machine context. -*/ -int -be_eth_get_flow_control(struct be_function_object *pfob, -			bool *txfc_enable, bool *rxfc_enable) -{ -	struct FWCMD_COMMON_GET_FLOW_CONTROL *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	unsigned long irql; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_GET_FLOW_CONTROL); - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -						NULL, NULL, fwcmd, NULL); - -	if (status != 0) { -		TRACE(DL_ERR, "get flow control fwcmd failed."); -		goto error; -	} - -	*txfc_enable = fwcmd->params.response.tx_flow_control; -	*rxfc_enable = fwcmd->params.response.rx_flow_control; - -error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* - *--------------------------------------------------------- - * Function: be_eth_set_qos - *   This function sets the ethernet transmit Quality of Service (QoS) - *   characteristics of BladeEngine for the domain. All ethernet - *   transmit rings of the domain will evenly share the bandwidth. - *   The exeception to sharing is the host primary (super) ethernet - *   transmit ring as well as the host ethernet forwarding ring - *   for missed offload data. - * pfob - - * max_bps         - the maximum bits per second in units of - * 			10 Mbps (valid 0-100) - * max_pps         - the maximum packets per second in units - * 			of 1 Kpps (0 indicates no limit) - * return status   - BE_SUCCESS (0) on success. Negative error code on failure. - *--------------------------------------------------------- - */ -int -be_eth_set_qos(struct be_function_object *pfob, u32 max_bps, u32 max_pps) -{ -	struct FWCMD_COMMON_SET_QOS *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	unsigned long irql; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_SET_QOS); - -	/* Set fields in fwcmd */ -	fwcmd->params.request.max_bits_per_second_NIC = max_bps; -	fwcmd->params.request.max_packets_per_second_NIC = max_pps; -	fwcmd->params.request.valid_flags = QOS_BITS_NIC | QOS_PKTS_NIC; - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -					NULL, NULL, fwcmd, NULL); - -	if (status != 0) -		TRACE(DL_ERR, "network set qos fwcmd failed."); - -error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* - *--------------------------------------------------------- - * Function: be_eth_get_qos - *   This function retrieves the ethernet transmit Quality of Service (QoS) - *   characteristics for the domain. - * max_bps         - the maximum bits per second in units of - * 			10 Mbps (valid 0-100) - * max_pps         - the maximum packets per second in units of - * 			1 Kpps (0 indicates no limit) - * return status   - BE_SUCCESS (0) on success. Negative error code on failure. - *--------------------------------------------------------- - */ -int -be_eth_get_qos(struct be_function_object *pfob, u32 *max_bps, u32 *max_pps) -{ -	struct FWCMD_COMMON_GET_QOS *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	unsigned long irql; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_GET_QOS); - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -					NULL, NULL, fwcmd, NULL); - -	if (status != 0) { -		TRACE(DL_ERR, "network get qos fwcmd failed."); -		goto error; -	} - -	*max_bps = fwcmd->params.response.max_bits_per_second_NIC; -	*max_pps = fwcmd->params.response.max_packets_per_second_NIC; - -error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* - *--------------------------------------------------------- - * Function: be_eth_set_frame_size - *   This function sets the ethernet maximum frame size. The previous - *   values are returned. - * pfob - - * tx_frame_size   - maximum transmit frame size in bytes - * rx_frame_size   - maximum receive frame size in bytes - * return status   - BE_SUCCESS (0) on success. Negative error code on failure. - *--------------------------------------------------------- - */ -int -be_eth_set_frame_size(struct be_function_object *pfob, -		      u32 *tx_frame_size, u32 *rx_frame_size) -{ -	struct FWCMD_COMMON_SET_FRAME_SIZE *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	unsigned long irql; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_SET_FRAME_SIZE); -	fwcmd->params.request.max_tx_frame_size = *tx_frame_size; -	fwcmd->params.request.max_rx_frame_size = *rx_frame_size; - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -						NULL, NULL, fwcmd, NULL); - -	if (status != 0) { -		TRACE(DL_ERR, "network set frame size fwcmd failed."); -		goto error; -	} - -	*tx_frame_size = fwcmd->params.response.chip_max_tx_frame_size; -	*rx_frame_size = fwcmd->params.response.chip_max_rx_frame_size; - -error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - - -/* -    This routine creates a Ethernet receive ring. - -    pfob      - handle to a function object -    rq_base_va            - base VA for the default receive ring. this must be -			exactly 8K in length and continguous physical memory. -    cq_object            - handle to a previously created CQ to be associated -			with the RQ. -    pp_eth_rq             - pointer to an opqaue handle where an eth -			receive object is returned. -    Returns BE_SUCCESS if successfull, , otherwise a useful -    int error code is returned. - -    IRQL: < DISPATCH_LEVEL -    this function allocates a struct be_ethrq_object *object. -    there must be no more than 1 of these per function object, unless the -    function object supports RSS (is networking and on the host). -    the rq_base_va must point to a buffer of exactly 8K. -    the erx::host_cqid (or host_stor_cqid) register and erx::ring_page registers -    will be updated as appropriate on return -*/ -int -be_eth_rq_create(struct be_function_object *pfob, -			struct ring_desc *rd, struct be_cq_object *cq_object, -			struct be_cq_object *bcmc_cq_object, -			struct be_ethrq_object *eth_rq) -{ -	int status = 0; -	struct MCC_WRB_AMAP *wrb = NULL; -	struct FWCMD_COMMON_ETH_RX_CREATE *fwcmd = NULL; -	unsigned long irql; - -	/* MPU will set the  */ -	ASSERT(rd); -	ASSERT(eth_rq); - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	eth_rq->parent_function = pfob; -	eth_rq->cq_object = cq_object; - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto Error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_ETH_RX_CREATE); - -	fwcmd->params.request.num_pages = 2;	/* required length */ -	fwcmd->params.request.cq_id = cq_object->cq_id; - -	if (bcmc_cq_object) -		fwcmd->params.request.bcmc_cq_id = bcmc_cq_object->cq_id; -	else -		fwcmd->params.request.bcmc_cq_id = 0xFFFF; - -	/* Create a page list for the FWCMD. */ -	be_rd_to_pa_list(rd, fwcmd->params.request.pages, -			  ARRAY_SIZE(fwcmd->params.request.pages)); - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -						NULL, NULL, fwcmd, NULL); -	if (status != BE_SUCCESS) { -		TRACE(DL_ERR, "fwcmd to map eth rxq frags failed."); -		goto Error; -	} -	/* Save the ring ID for cleanup. */ -	eth_rq->rid = fwcmd->params.response.id; - -	atomic_inc(&cq_object->ref_count); - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* -    This routine destroys an Ethernet receive queue - -    eth_rq - ethernet receive queue handle returned from eth_rq_create - -    Returns BE_SUCCESS on success and an appropriate int on failure. - -    This function frees resourcs allocated by EthRqCreate. -    The erx::host_cqid (or host_stor_cqid) register and erx::ring_page -    registers will be updated as appropriate on return -    IRQL: < DISPATCH_LEVEL -*/ - -static void be_eth_rq_destroy_internal_cb(void *context, int status, -					 struct MCC_WRB_AMAP *wrb) -{ -	struct be_ethrq_object *eth_rq = (struct be_ethrq_object *) context; - -	if (status != BE_SUCCESS) { -		TRACE(DL_ERR, "Destroy eth rq failed in internal callback.\n"); -	} else { -		/* Dereference any CQs associated with this queue. */ -		atomic_dec(ð_rq->cq_object->ref_count); -	} - -	return; -} - -int be_eth_rq_destroy(struct be_ethrq_object *eth_rq) -{ -	int status = BE_SUCCESS; - -	/* Send fwcmd to destroy the RQ. */ -	status = be_function_ring_destroy(eth_rq->parent_function, -			eth_rq->rid, FWCMD_RING_TYPE_ETH_RX, NULL, NULL, -			be_eth_rq_destroy_internal_cb, eth_rq); - -	return status; -} - -/* - *--------------------------------------------------------------------------- - * Function: be_eth_rq_destroy_options - *   Destroys an ethernet receive ring with finer granularity options - *   than the standard be_eth_rq_destroy() API function. - * eth_rq           - - * flush            - Set to 1 to flush the ring, set to 0 to bypass the flush - * cb               - Callback function on completion - * cb_context       - Callback context - * return status    - BE_SUCCESS (0) on success. Negative error code on failure. - *---------------------------------------------------------------------------- - */ -int -be_eth_rq_destroy_options(struct be_ethrq_object *eth_rq, bool flush, -		mcc_wrb_cqe_callback cb, void *cb_context) -{ -	struct FWCMD_COMMON_RING_DESTROY *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = BE_SUCCESS; -	struct be_function_object *pfob = NULL; -	unsigned long irql; - -	pfob = eth_rq->parent_function; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	TRACE(DL_INFO, "Destroy eth_rq ring id:%d, flush:%d", eth_rq->rid, -	      flush); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		ASSERT(wrb); -		TRACE(DL_ERR, "No free MCC WRBs in destroy eth_rq ring."); -		status = BE_STATUS_NO_MCC_WRB; -		goto Error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_RING_DESTROY); - -	fwcmd->params.request.id = eth_rq->rid; -	fwcmd->params.request.ring_type = FWCMD_RING_TYPE_ETH_RX; -	fwcmd->params.request.bypass_flush = ((0 == flush) ? 1 : 0); - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb, cb_context, -			be_eth_rq_destroy_internal_cb, eth_rq, fwcmd, NULL); - -	if (status != BE_SUCCESS && status != BE_PENDING) { -		TRACE(DL_ERR, "eth_rq ring destroy failed. id:%d, flush:%d", -		      eth_rq->rid, flush); -		goto Error; -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* -    This routine queries the frag size for erx. - -    pfob      - handle to a function object - -    frag_size_bytes       - erx frag size in bytes that is/was set. - -    Returns BE_SUCCESS if successfull, otherwise a useful int error -    code is returned. - -    IRQL: < DISPATCH_LEVEL - -*/ -int -be_eth_rq_get_frag_size(struct be_function_object *pfob, u32 *frag_size_bytes) -{ -	struct FWCMD_ETH_GET_RX_FRAG_SIZE *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	unsigned long irql; - -	ASSERT(frag_size_bytes); - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		return BE_STATUS_NO_MCC_WRB; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, ETH_GET_RX_FRAG_SIZE); - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -				NULL, NULL, fwcmd, NULL); - -	if (status != 0) { -		TRACE(DL_ERR, "get frag size fwcmd failed."); -		goto error; -	} - -	*frag_size_bytes = 1 << fwcmd->params.response.actual_fragsize_log2; - -error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* -    This routine attempts to set the frag size for erx.  If the frag size is -    already set, the attempt fails and the current frag size is returned. - -    pfob      - Handle to a function object - -    frag_size       - Erx frag size in bytes that is/was set. - -    current_frag_size_bytes    - Pointer to location where currrent frag -				 is to be rturned - -    Returns BE_SUCCESS if successfull, otherwise a useful int error -    code is returned. - -    IRQL: < DISPATCH_LEVEL - -    This function always fails in non-privileged machine context. -*/ -int -be_eth_rq_set_frag_size(struct be_function_object *pfob, -			u32 frag_size, u32 *frag_size_bytes) -{ -	struct FWCMD_ETH_SET_RX_FRAG_SIZE *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	unsigned long irql; - -	ASSERT(frag_size_bytes); - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, ETH_SET_RX_FRAG_SIZE); - -	ASSERT(frag_size >= 128 && frag_size <= 16 * 1024); - -	/* This is the log2 of the fragsize.  This is not the exact -	 * ERX encoding. */ -	fwcmd->params.request.new_fragsize_log2 = __ilog2_u32(frag_size); - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -				NULL, NULL, fwcmd, NULL); - -	if (status != 0) { -		TRACE(DL_ERR, "set frag size fwcmd failed."); -		goto error; -	} - -	*frag_size_bytes = 1 << fwcmd->params.response.actual_fragsize_log2; -error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); - -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - - -/* -    This routine gets or sets a mac address for a domain -    given the port and mac. - -    FunctionObject  - Function object handle. -    port1           - Set to TRUE if this function will set/get the Port 1 -			address.  Only the host may set this to TRUE. -    mac1            - Set to TRUE if this function will set/get the -			MAC 1 address.  Only the host may set this to TRUE. -    write           - Set to TRUE if this function should write the mac address. -    mac_address      - Buffer of the mac address to read or write. - -    Returns BE_SUCCESS if successfull, otherwise a useful int is returned. - -    IRQL: < DISPATCH_LEVEL -*/ -int be_rxf_mac_address_read_write(struct be_function_object *pfob, -		bool port1,	/* VM must always set to false */ -		bool mac1,	/* VM must always set to false */ -		bool mgmt, bool write, -		bool permanent, u8 *mac_address, -		mcc_wrb_cqe_callback cb,	/* optional */ -		void *cb_context)	/* optional */ -{ -	int status = BE_SUCCESS; -	union { -		struct FWCMD_COMMON_NTWK_MAC_QUERY *query; -		struct FWCMD_COMMON_NTWK_MAC_SET *set; -	} fwcmd = {NULL}; -	struct MCC_WRB_AMAP *wrb = NULL; -	u32 type = 0; -	unsigned long irql; -	struct be_mcc_wrb_response_copy rc; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	ASSERT(mac_address); - -	ASSERT(port1 == false); -	ASSERT(mac1 == false); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto Error; -	} - -	if (mgmt) { -		type = MAC_ADDRESS_TYPE_MANAGEMENT; -	} else { -		if (pfob->type == BE_FUNCTION_TYPE_NETWORK) -			type = MAC_ADDRESS_TYPE_NETWORK; -		else -			type = MAC_ADDRESS_TYPE_STORAGE; -	} - -	if (write) { -		/* Prepares an embedded fwcmd, including -		 * request/response sizes. -		 */ -		fwcmd.set = BE_PREPARE_EMBEDDED_FWCMD(pfob, -					       wrb, COMMON_NTWK_MAC_SET); - -		fwcmd.set->params.request.invalidate = 0; -		fwcmd.set->params.request.mac1 = (mac1 ? 1 : 0); -		fwcmd.set->params.request.port = (port1 ? 1 : 0); -		fwcmd.set->params.request.type = type; - -		/* Copy the mac address to set. */ -		fwcmd.set->params.request.mac.SizeOfStructure = -			    sizeof(fwcmd.set->params.request.mac); -		memcpy(fwcmd.set->params.request.mac.MACAddress, -			mac_address, ETH_ALEN); - -		/* Post the f/w command */ -		status = be_function_post_mcc_wrb(pfob, wrb, NULL, -				cb, cb_context, NULL, NULL, fwcmd.set, NULL); - -	} else { - -		/* -		 * Prepares an embedded fwcmd, including -		 * request/response sizes. -		 */ -		fwcmd.query = BE_PREPARE_EMBEDDED_FWCMD(pfob, -					       wrb, COMMON_NTWK_MAC_QUERY); - -		fwcmd.query->params.request.mac1 = (mac1 ? 1 : 0); -		fwcmd.query->params.request.port = (port1 ? 1 : 0); -		fwcmd.query->params.request.type = type; -		fwcmd.query->params.request.permanent = permanent; - -		rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_NTWK_MAC_QUERY, -						params.response.mac.MACAddress); -		rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_NTWK_MAC_QUERY, -						params.response.mac.MACAddress); -		rc.va = mac_address; -		/* Post the f/w command (with a copy for the response) */ -		status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb, -				cb_context, NULL, NULL, fwcmd.query, &rc); -	} - -	if (status < 0) { -		TRACE(DL_ERR, "mac set/query failed."); -		goto Error; -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* -    This routine writes data to context memory. - -    pfob  - Function object handle. -    mac_table     - Set to the 128-bit multicast address hash table. - -    Returns BE_SUCCESS if successfull, otherwise a useful int is returned. - -    IRQL: < DISPATCH_LEVEL -*/ - -int be_rxf_multicast_config(struct be_function_object *pfob, -		bool promiscuous, u32 num, u8 *mac_table, -		mcc_wrb_cqe_callback cb,	/* optional */ -		void *cb_context, -		struct be_multicast_q_ctxt *q_ctxt) -{ -	int status = BE_SUCCESS; -	struct FWCMD_COMMON_NTWK_MULTICAST_SET *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	struct be_generic_q_ctxt *generic_ctxt = NULL; -	unsigned long irql; - -	ASSERT(num <= ARRAY_SIZE(fwcmd->params.request.mac)); - -	if (num > ARRAY_SIZE(fwcmd->params.request.mac)) { -		TRACE(DL_ERR, "Too many multicast addresses. BE supports %d.", -		      (int) ARRAY_SIZE(fwcmd->params.request.mac)); -		return BE_NOT_OK; -	} - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		if (q_ctxt && cb) { -			wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header; -			generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt; -			generic_ctxt->context.bytes = sizeof(*q_ctxt); -		} else { -			status = BE_STATUS_NO_MCC_WRB; -			goto Error; -		} -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_NTWK_MULTICAST_SET); - -	fwcmd->params.request.promiscuous = promiscuous; -	if (!promiscuous) { -		fwcmd->params.request.num_mac = num; -		if (num > 0) { -			ASSERT(mac_table); -			memcpy(fwcmd->params.request.mac, -						mac_table, ETH_ALEN * num); -		} -	} - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt, -			cb, cb_context, NULL, NULL, fwcmd, NULL); -	if (status < 0) { -		TRACE(DL_ERR, "multicast fwcmd failed."); -		goto Error; -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* -    This routine adds or removes a vlan tag from the rxf table. - -    FunctionObject  - Function object handle. -    VLanTag         - VLan tag to add or remove. -    Add             - Set to TRUE if this will add a vlan tag - -    Returns BE_SUCCESS if successfull, otherwise a useful int is returned. - -    IRQL: < DISPATCH_LEVEL -*/ -int be_rxf_vlan_config(struct be_function_object *pfob, -		bool promiscuous, u32 num, u16 *vlan_tag_array, -		mcc_wrb_cqe_callback cb,	/* optional */ -		void *cb_context, -		struct be_vlan_q_ctxt *q_ctxt)	/* optional */ -{ -	int status = BE_SUCCESS; -	struct FWCMD_COMMON_NTWK_VLAN_CONFIG *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	struct be_generic_q_ctxt *generic_ctxt = NULL; -	unsigned long irql; - -	if (num > ARRAY_SIZE(fwcmd->params.request.vlan_tag)) { -		TRACE(DL_ERR, "Too many VLAN tags."); -		return BE_NOT_OK; -	} - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		if (q_ctxt && cb) { -			wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header; -			generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt; -			generic_ctxt->context.bytes = sizeof(*q_ctxt); -		} else { -			status = BE_STATUS_NO_MCC_WRB; -			goto Error; -		} -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_NTWK_VLAN_CONFIG); - -	fwcmd->params.request.promiscuous = promiscuous; -	if (!promiscuous) { -		fwcmd->params.request.num_vlan = num; - -		if (num > 0) { -			ASSERT(vlan_tag_array); -			memcpy(fwcmd->params.request.vlan_tag, vlan_tag_array, -				  num * sizeof(vlan_tag_array[0])); -		} -	} - -	/* Post the commadn */ -	status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt, -			cb, cb_context, NULL, NULL, fwcmd, NULL); -	if (status < 0) { -		TRACE(DL_ERR, "vlan fwcmd failed."); -		goto Error; -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - - -int be_rxf_link_status(struct be_function_object *pfob, -		struct BE_LINK_STATUS *link_status, -		mcc_wrb_cqe_callback cb, -		void *cb_context, -		struct be_link_status_q_ctxt *q_ctxt) -{ -	struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	struct be_generic_q_ctxt *generic_ctxt = NULL; -	unsigned long irql; -	struct be_mcc_wrb_response_copy rc; - -	ASSERT(link_status); - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); - -	if (!wrb) { -		if (q_ctxt && cb) { -			wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header; -			generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt; -			generic_ctxt->context.bytes = sizeof(*q_ctxt); -		} else { -			status = BE_STATUS_NO_MCC_WRB; -			goto Error; -		} -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, -					       COMMON_NTWK_LINK_STATUS_QUERY); - -	rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY, -					params.response); -	rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY, -					params.response); -	rc.va = link_status; -	/* Post or queue the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt, -			cb, cb_context, NULL, NULL, fwcmd, &rc); - -	if (status < 0) { -		TRACE(DL_ERR, "link status fwcmd failed."); -		goto Error; -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -int -be_rxf_query_eth_statistics(struct be_function_object *pfob, -		    struct FWCMD_ETH_GET_STATISTICS *va_for_fwcmd, -		    u64 pa_for_fwcmd, mcc_wrb_cqe_callback cb, -		    void *cb_context, -		    struct be_nonembedded_q_ctxt *q_ctxt) -{ -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	struct be_generic_q_ctxt *generic_ctxt = NULL; -	unsigned long irql; - -	ASSERT(va_for_fwcmd); -	ASSERT(pa_for_fwcmd); - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); - -	if (!wrb) { -		if (q_ctxt && cb) { -			wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header; -			generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt; -			generic_ctxt->context.bytes = sizeof(*q_ctxt); -		} else { -			status = BE_STATUS_NO_MCC_WRB; -			goto Error; -		} -	} - -	TRACE(DL_INFO, "Query eth stats. fwcmd va:%p pa:0x%08x_%08x", -	      va_for_fwcmd, upper_32_bits(pa_for_fwcmd), (u32)pa_for_fwcmd); - -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	va_for_fwcmd = BE_PREPARE_NONEMBEDDED_FWCMD(pfob, wrb, -			  va_for_fwcmd, pa_for_fwcmd, ETH_GET_STATISTICS); - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt, -		cb, cb_context, NULL, NULL, va_for_fwcmd, NULL); -	if (status < 0) { -		TRACE(DL_ERR, "eth stats fwcmd failed."); -		goto Error; -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -int -be_rxf_promiscuous(struct be_function_object *pfob, -		   bool enable_port0, bool enable_port1, -		   mcc_wrb_cqe_callback cb, void *cb_context, -		   struct be_promiscuous_q_ctxt *q_ctxt) -{ -	struct FWCMD_ETH_PROMISCUOUS *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	struct be_generic_q_ctxt *generic_ctxt = NULL; -	unsigned long irql; - - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); - -	if (!wrb) { -		if (q_ctxt && cb) { -			wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header; -			generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt; -			generic_ctxt->context.bytes = sizeof(*q_ctxt); -		} else { -			status = BE_STATUS_NO_MCC_WRB; -			goto Error; -		} -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, ETH_PROMISCUOUS); - -	fwcmd->params.request.port0_promiscuous = enable_port0; -	fwcmd->params.request.port1_promiscuous = enable_port1; - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt, -			cb, cb_context, NULL, NULL, fwcmd, NULL); - -	if (status < 0) { -		TRACE(DL_ERR, "promiscuous fwcmd failed."); -		goto Error; -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - - -/* - *------------------------------------------------------------------------- - * Function: be_rxf_filter_config - *   Configures BladeEngine ethernet receive filter settings. - * pfob    - - * settings           - Pointer to the requested filter settings. - * 			The response from BladeEngine will be placed back - * 			in this structure. - * cb                 - optional - * cb_context         - optional - * q_ctxt             - Optional. Pointer to a previously allocated struct. - * 			If the MCC WRB ring is full, this structure is - * 			used to queue the operation. It will be posted - * 			to the MCC ring when space becomes available. All - *                      queued commands will be posted to the ring in - *                      the order they are received. It is always valid - *                      to pass a pointer to a generic - *                      be_generic_q_ctxt. However, the specific - *                      context structs are generally smaller than - *                      the generic struct. - * return pend_status - BE_SUCCESS (0) on success. - * 			BE_PENDING (postive value) if the FWCMD - *                      completion is pending. Negative error code on failure. - *--------------------------------------------------------------------------- - */ -int -be_rxf_filter_config(struct be_function_object *pfob, -		     struct NTWK_RX_FILTER_SETTINGS *settings, -		     mcc_wrb_cqe_callback cb, void *cb_context, -		     struct be_rxf_filter_q_ctxt *q_ctxt) -{ -	struct FWCMD_COMMON_NTWK_RX_FILTER *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	struct be_generic_q_ctxt *generic_ctxt = NULL; -	unsigned long irql; -	struct be_mcc_wrb_response_copy rc; - -	ASSERT(settings); - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); - -	if (!wrb) { -		if (q_ctxt && cb) { -			wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header; -			generic_ctxt = (struct be_generic_q_ctxt *) q_ctxt; -			generic_ctxt->context.bytes = sizeof(*q_ctxt); -		} else { -			status = BE_STATUS_NO_MCC_WRB; -			goto Error; -		} -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_NTWK_RX_FILTER); -	memcpy(&fwcmd->params.request, settings, sizeof(*settings)); - -	rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_NTWK_RX_FILTER, -					params.response); -	rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_NTWK_RX_FILTER, -					params.response); -	rc.va = settings; -	/* Post or queue the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, generic_ctxt, -			cb, cb_context, NULL, NULL, fwcmd, &rc); - -	if (status < 0) { -		TRACE(DL_ERR, "RXF/ERX filter config fwcmd failed."); -		goto Error; -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} diff --git a/drivers/staging/benet/etx_context.h b/drivers/staging/benet/etx_context.h deleted file mode 100644 index 554fbe5d127..00000000000 --- a/drivers/staging/benet/etx_context.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __etx_context_amap_h__ -#define __etx_context_amap_h__ - -/* ETX ring  context structure. */ -struct BE_ETX_CONTEXT_AMAP { -	u8 tx_cidx[11];	/* DWORD 0 */ -	u8 rsvd0[5];	/* DWORD 0 */ -	u8 rsvd1[16];	/* DWORD 0 */ -	u8 tx_pidx[11];	/* DWORD 1 */ -	u8 rsvd2;		/* DWORD 1 */ -	u8 tx_ring_size[4];	/* DWORD 1 */ -	u8 pd_id[5];	/* DWORD 1 */ -	u8 pd_id_not_valid;	/* DWORD 1 */ -	u8 cq_id_send[10];	/* DWORD 1 */ -	u8 rsvd3[32];	/* DWORD 2 */ -	u8 rsvd4[32];	/* DWORD 3 */ -	u8 cur_bytes[32];	/* DWORD 4 */ -	u8 max_bytes[32];	/* DWORD 5 */ -	u8 time_stamp[32];	/* DWORD 6 */ -	u8 rsvd5[11];	/* DWORD 7 */ -	u8 func;		/* DWORD 7 */ -	u8 rsvd6[20];	/* DWORD 7 */ -	u8 cur_txd_count[32];	/* DWORD 8 */ -	u8 max_txd_count[32];	/* DWORD 9 */ -	u8 rsvd7[32];	/* DWORD 10 */ -	u8 rsvd8[32];	/* DWORD 11 */ -	u8 rsvd9[32];	/* DWORD 12 */ -	u8 rsvd10[32];	/* DWORD 13 */ -	u8 rsvd11[32];	/* DWORD 14 */ -	u8 rsvd12[32];	/* DWORD 15 */ -} __packed; -struct ETX_CONTEXT_AMAP { -	u32 dw[16]; -}; - -#endif /* __etx_context_amap_h__ */ diff --git a/drivers/staging/benet/funcobj.c b/drivers/staging/benet/funcobj.c deleted file mode 100644 index 0f57eb58dae..00000000000 --- a/drivers/staging/benet/funcobj.c +++ /dev/null @@ -1,565 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#include "hwlib.h" -#include "bestatus.h" - - -int -be_function_internal_query_firmware_config(struct be_function_object *pfob, -				   struct BE_FIRMWARE_CONFIG *config) -{ -	struct FWCMD_COMMON_FIRMWARE_CONFIG *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	unsigned long irql; -	struct be_mcc_wrb_response_copy rc; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_FIRMWARE_CONFIG); - -	rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_FIRMWARE_CONFIG, -					params.response); -	rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_FIRMWARE_CONFIG, -					params.response); -	rc.va = config; - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, -					NULL, NULL, NULL, fwcmd, &rc); -error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* -    This allocates and initializes a function object based on the information -    provided by upper layer drivers. - -    Returns BE_SUCCESS on success and an appropriate int on failure. - -    A function object represents a single BladeEngine (logical) PCI function. -    That is a function object either represents -    the networking side of BladeEngine or the iSCSI side of BladeEngine. - -    This routine will also detect and create an appropriate PD object for the -    PCI function as needed. -*/ -int -be_function_object_create(u8 __iomem *csr_va, u8 __iomem *db_va, -		u8 __iomem *pci_va, u32 function_type, -		struct ring_desc *mailbox, struct be_function_object *pfob) -{ -	int status; - -	ASSERT(pfob);	/* not a magic assert */ -	ASSERT(function_type <= 2); - -	TRACE(DL_INFO, "Create function object. type:%s object:0x%p", -	      (function_type == BE_FUNCTION_TYPE_ISCSI ? "iSCSI" : -	       (function_type == BE_FUNCTION_TYPE_NETWORK ? "Network" : -		"Arm")), pfob); - -	memset(pfob, 0, sizeof(*pfob)); - -	pfob->type = function_type; -	pfob->csr_va = csr_va; -	pfob->db_va = db_va; -	pfob->pci_va = pci_va; - -	spin_lock_init(&pfob->cq_lock); -	spin_lock_init(&pfob->post_lock); -	spin_lock_init(&pfob->mcc_context_lock); - - -	pfob->pci_function_number = 1; - - -	pfob->emulate = false; -	TRACE(DL_NOTE, "Non-emulation mode"); -	status = be_drive_POST(pfob); -	if (status != BE_SUCCESS) { -		TRACE(DL_ERR, "BladeEngine POST failed."); -		goto error; -	} - -	/* Initialize the mailbox */ -	status = be_mpu_init_mailbox(pfob, mailbox); -	if (status != BE_SUCCESS) { -		TRACE(DL_ERR, "Failed to initialize mailbox."); -		goto error; -	} -	/* -	 * Cache the firmware config for ASSERTs in hwclib and later -	 * driver queries. -	 */ -	status = be_function_internal_query_firmware_config(pfob, -					       &pfob->fw_config); -	if (status != BE_SUCCESS) { -		TRACE(DL_ERR, "Failed to query firmware config."); -		goto error; -	} - -error: -	if (status != BE_SUCCESS) { -		/* No cleanup necessary */ -		TRACE(DL_ERR, "Failed to create function."); -		memset(pfob, 0, sizeof(*pfob)); -	} -	return status; -} - -/* -    This routine drops the reference count on a given function object. Once -    the reference count falls to zero, the function object is destroyed and all -    resources held are freed. - -    FunctionObject      - The function object to drop the reference to. -*/ -int be_function_object_destroy(struct be_function_object *pfob) -{ -	TRACE(DL_INFO, "Destroy pfob. Object:0x%p", -	      pfob); - - -	ASSERT(pfob->mcc == NULL); - -	return BE_SUCCESS; -} - -int be_function_cleanup(struct be_function_object *pfob) -{ -	int status = 0; -	u32 isr; -	u32 host_intr; -	struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP ctrl; - - -	if (pfob->type == BE_FUNCTION_TYPE_NETWORK) { -		status = be_rxf_multicast_config(pfob, false, 0, -						NULL, NULL, NULL, NULL); -		ASSERT(status == BE_SUCCESS); -	} -	/* VLAN */ -	status = be_rxf_vlan_config(pfob, false, 0, NULL, NULL, NULL, NULL); -	ASSERT(status == BE_SUCCESS); -	/* -	 * MCC Queue -- Switches to mailbox mode.  May want to destroy -	 * all but the MCC CQ before this call if polling CQ is much better -	 * performance than polling mailbox register. -	 */ -	if (pfob->mcc) -		status = be_mcc_ring_destroy(pfob->mcc); -	/* -	 * If interrupts are disabled, clear any CEV interrupt assertions that -	 * fired after we stopped processing EQs. -	 */ -	ctrl.dw[0] = PCICFG1_READ(pfob, host_timer_int_ctrl); -	host_intr = AMAP_GET_BITS_PTR(PCICFG_HOST_TIMER_INT_CTRL_CSR, -							hostintr, ctrl.dw); -	if (!host_intr) -		if (pfob->type == BE_FUNCTION_TYPE_NETWORK) -			isr = CSR_READ(pfob, cev.isr1); -		else -			isr = CSR_READ(pfob, cev.isr0); -	else -		/* This should never happen... */ -		TRACE(DL_ERR, "function_cleanup called with interrupt enabled"); -	/* Function object destroy */ -	status = be_function_object_destroy(pfob); -	ASSERT(status == BE_SUCCESS); - -	return status; -} - - -void * -be_function_prepare_embedded_fwcmd(struct be_function_object *pfob, -	struct MCC_WRB_AMAP *wrb, u32 payld_len, u32 request_length, -	u32 response_length, u32 opcode, u32 subsystem) -{ -	struct FWCMD_REQUEST_HEADER *header = NULL; -	u32 n; - -	ASSERT(wrb); - -	n = offsetof(struct BE_MCC_WRB_AMAP, payload)/8; -	AMAP_SET_BITS_PTR(MCC_WRB, embedded, wrb, 1); -	AMAP_SET_BITS_PTR(MCC_WRB, payload_length, wrb, min(payld_len, n)); -	header = (struct FWCMD_REQUEST_HEADER *)((u8 *)wrb + n); - -	header->timeout = 0; -	header->domain = 0; -	header->request_length = max(request_length, response_length); -	header->opcode = opcode; -	header->subsystem = subsystem; - -	return header; -} - -void * -be_function_prepare_nonembedded_fwcmd(struct be_function_object *pfob, -	struct MCC_WRB_AMAP *wrb, -	void *fwcmd_va, u64 fwcmd_pa, -	u32 payld_len, -	u32 request_length, -	u32 response_length, -	u32 opcode, u32 subsystem) -{ -	struct FWCMD_REQUEST_HEADER *header = NULL; -	u32 n; -	struct MCC_WRB_PAYLOAD_AMAP *plp; - -	ASSERT(wrb); -	ASSERT(fwcmd_va); - -	header = (struct FWCMD_REQUEST_HEADER *) fwcmd_va; - -	AMAP_SET_BITS_PTR(MCC_WRB, embedded, wrb, 0); -	AMAP_SET_BITS_PTR(MCC_WRB, payload_length, wrb, payld_len); - -	/* -	 * Assume one fragment. The caller may override the SGL by -	 * rewriting the 0th length and adding more entries.  They -	 * will also need to update the sge_count. -	 */ -	AMAP_SET_BITS_PTR(MCC_WRB, sge_count, wrb, 1); - -	n = offsetof(struct BE_MCC_WRB_AMAP, payload)/8; -	plp = (struct MCC_WRB_PAYLOAD_AMAP *)((u8 *)wrb + n); -	AMAP_SET_BITS_PTR(MCC_WRB_PAYLOAD, sgl[0].length, plp, payld_len); -	AMAP_SET_BITS_PTR(MCC_WRB_PAYLOAD, sgl[0].pa_lo, plp, (u32)fwcmd_pa); -	AMAP_SET_BITS_PTR(MCC_WRB_PAYLOAD, sgl[0].pa_hi, plp, -					upper_32_bits(fwcmd_pa)); - -	header->timeout = 0; -	header->domain = 0; -	header->request_length = max(request_length, response_length); -	header->opcode = opcode; -	header->subsystem = subsystem; - -	return header; -} - -struct MCC_WRB_AMAP * -be_function_peek_mcc_wrb(struct be_function_object *pfob) -{ -	struct MCC_WRB_AMAP *wrb = NULL; -	u32 offset; - -	if (pfob->mcc) -		wrb = _be_mpu_peek_ring_wrb(pfob->mcc, false); -	else { -		offset = offsetof(struct BE_MCC_MAILBOX_AMAP, wrb)/8; -		wrb = (struct MCC_WRB_AMAP *) ((u8 *) pfob->mailbox.va + -				offset); -	} - -	if (wrb) -		memset(wrb, 0, sizeof(struct MCC_WRB_AMAP)); - -	return wrb; -} - -#if defined(BE_DEBUG) -void be_function_debug_print_wrb(struct be_function_object *pfob, -		struct MCC_WRB_AMAP *wrb, void *optional_fwcmd_va, -		struct be_mcc_wrb_context *wrb_context) -{ - -	struct FWCMD_REQUEST_HEADER *header = NULL; -	u8 embedded; -	u32 n; - -	embedded = AMAP_GET_BITS_PTR(MCC_WRB, embedded, wrb); - -	if (embedded) { -		n = offsetof(struct BE_MCC_WRB_AMAP, payload)/8; -		header = (struct FWCMD_REQUEST_HEADER *)((u8 *)wrb + n); -	} else { -		header = (struct FWCMD_REQUEST_HEADER *) optional_fwcmd_va; -	} - -	/* Save the completed count before posting for a debug assert. */ - -	if (header) { -		wrb_context->opcode = header->opcode; -		wrb_context->subsystem = header->subsystem; - -	} else { -		wrb_context->opcode = 0; -		wrb_context->subsystem = 0; -	} -} -#else -#define be_function_debug_print_wrb(a_, b_, c_, d_) -#endif - -int -be_function_post_mcc_wrb(struct be_function_object *pfob, -		struct MCC_WRB_AMAP *wrb, -		struct be_generic_q_ctxt *q_ctxt, -		mcc_wrb_cqe_callback cb, void *cb_context, -		mcc_wrb_cqe_callback internal_cb, -		void *internal_cb_context, void *optional_fwcmd_va, -		struct be_mcc_wrb_response_copy *rc) -{ -	int status; -	struct be_mcc_wrb_context *wrb_context = NULL; -	u64 *p; - -	if (q_ctxt) { -		/* Initialize context.         */ -		q_ctxt->context.internal_cb = internal_cb; -		q_ctxt->context.internal_cb_context = internal_cb_context; -		q_ctxt->context.cb = cb; -		q_ctxt->context.cb_context = cb_context; -		if (rc) { -			q_ctxt->context.copy.length = rc->length; -			q_ctxt->context.copy.fwcmd_offset = rc->fwcmd_offset; -			q_ctxt->context.copy.va = rc->va; -		} else -			q_ctxt->context.copy.length = 0; - -		q_ctxt->context.optional_fwcmd_va = optional_fwcmd_va; - -		/* Queue this request */ -		status = be_function_queue_mcc_wrb(pfob, q_ctxt); - -		goto Error; -	} -	/* -	 * Allocate a WRB context struct to hold the callback pointers, -	 * status, etc.  This is required if commands complete out of order. -	 */ -	wrb_context = _be_mcc_allocate_wrb_context(pfob); -	if (!wrb_context) { -		TRACE(DL_WARN, "Failed to allocate MCC WRB context."); -		status = BE_STATUS_SYSTEM_RESOURCES; -		goto Error; -	} -	/* Initialize context. */ -	memset(wrb_context, 0, sizeof(*wrb_context)); -	wrb_context->internal_cb = internal_cb; -	wrb_context->internal_cb_context = internal_cb_context; -	wrb_context->cb = cb; -	wrb_context->cb_context = cb_context; -	if (rc) { -		wrb_context->copy.length = rc->length; -		wrb_context->copy.fwcmd_offset = rc->fwcmd_offset; -		wrb_context->copy.va = rc->va; -	} else -		wrb_context->copy.length = 0; -	wrb_context->wrb = wrb; - -	/* -	 * Copy the context pointer into the WRB opaque tag field. -	 * Verify assumption of 64-bit tag with a compile time assert. -	 */ -	p = (u64 *) ((u8 *)wrb + offsetof(struct BE_MCC_WRB_AMAP, tag)/8); -	*p = (u64)(size_t)wrb_context; - -	/* Print info about this FWCMD for debug builds. */ -	be_function_debug_print_wrb(pfob, wrb, optional_fwcmd_va, wrb_context); - -	/* -	 * issue the WRB to the MPU as appropriate -	 */ -	if (pfob->mcc) { -		/* -		 * we're in WRB mode, pass to the mcc layer -		 */ -		status = _be_mpu_post_wrb_ring(pfob->mcc, wrb, wrb_context); -	} else { -		/* -		 * we're in mailbox mode -		 */ -		status = _be_mpu_post_wrb_mailbox(pfob, wrb, wrb_context); - -		/* mailbox mode always completes synchronously */ -		ASSERT(status != BE_STATUS_PENDING); -	} - -Error: - -	return status; -} - -int -be_function_ring_destroy(struct be_function_object *pfob, -		u32 id, u32 ring_type, mcc_wrb_cqe_callback cb, -		void *cb_context, mcc_wrb_cqe_callback internal_cb, -		void *internal_cb_context) -{ - -	struct FWCMD_COMMON_RING_DESTROY *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	int status = 0; -	unsigned long irql; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	TRACE(DL_INFO, "Destroy ring id:%d type:%d", id, ring_type); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		ASSERT(wrb); -		TRACE(DL_ERR, "No free MCC WRBs in destroy ring."); -		status = BE_STATUS_NO_MCC_WRB; -		goto Error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_RING_DESTROY); - -	fwcmd->params.request.id = id; -	fwcmd->params.request.ring_type = ring_type; - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb, cb_context, -				internal_cb, internal_cb_context, fwcmd, NULL); -	if (status != BE_SUCCESS && status != BE_PENDING) { -		TRACE(DL_ERR, "Ring destroy fwcmd failed. id:%d ring_type:%d", -			id, ring_type); -		goto Error; -	} - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -void -be_rd_to_pa_list(struct ring_desc *rd, struct PHYS_ADDR *pa_list, u32 max_num) -{ -	u32 num_pages = PAGES_SPANNED(rd->va, rd->length); -	u32 i = 0; -	u64 pa = rd->pa; -	__le64 lepa; - -	ASSERT(pa_list); -	ASSERT(pa); - -	for (i = 0; i < min(num_pages, max_num); i++) { -		lepa = cpu_to_le64(pa); -		pa_list[i].lo = (u32)lepa; -		pa_list[i].hi = upper_32_bits(lepa); -		pa += PAGE_SIZE; -	} -} - - - -/*----------------------------------------------------------------------------- - * Function: be_function_get_fw_version - *   Retrieves the firmware version on the adpater. If the callback is - *   NULL this call executes synchronously. If the callback is not NULL, - *   the returned status will be BE_PENDING if the command was issued - *   successfully. - * pfob    - - * fwv         - Pointer to response buffer if callback is NULL. - * cb           - Callback function invoked when the FWCMD completes. - * cb_context   - Passed to the callback function. - * return pend_status - BE_SUCCESS (0) on success. - * 			BE_PENDING (postive value) if the FWCMD - *                      completion is pending. Negative error code on failure. - *--------------------------------------------------------------------------- - */ -int -be_function_get_fw_version(struct be_function_object *pfob, -		struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD *fwv, -		mcc_wrb_cqe_callback cb, void *cb_context) -{ -	int status = BE_SUCCESS; -	struct MCC_WRB_AMAP *wrb = NULL; -	struct FWCMD_COMMON_GET_FW_VERSION *fwcmd = NULL; -	unsigned long irql; -	struct be_mcc_wrb_response_copy rc; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		TRACE(DL_ERR, "MCC wrb peek failed."); -		status = BE_STATUS_NO_MCC_WRB; -		goto Error; -	} - -	if (!cb && !fwv) { -		TRACE(DL_ERR, "callback and response buffer NULL!"); -		status = BE_NOT_OK; -		goto Error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_GET_FW_VERSION); - -	rc.length = FIELD_SIZEOF(struct FWCMD_COMMON_GET_FW_VERSION, -					params.response); -	rc.fwcmd_offset = offsetof(struct FWCMD_COMMON_GET_FW_VERSION, -					params.response); -	rc.va = fwv; - -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, cb, -				cb_context, NULL, NULL, fwcmd, &rc); - -Error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -int -be_function_queue_mcc_wrb(struct be_function_object *pfob, -			  struct be_generic_q_ctxt *q_ctxt) -{ -	int status; - -	ASSERT(q_ctxt); - -	/* -	 * issue the WRB to the MPU as appropriate -	 */ -	if (pfob->mcc) { - -		/* We're in ring mode.  Queue this item. */ -		pfob->mcc->backlog_length++; -		list_add_tail(&q_ctxt->context.list, &pfob->mcc->backlog); -		status = BE_PENDING; -	} else { -		status = BE_NOT_OK; -	} -	return status; -} - diff --git a/drivers/staging/benet/fwcmd_common.h b/drivers/staging/benet/fwcmd_common.h deleted file mode 100644 index 406e0d6fa98..00000000000 --- a/drivers/staging/benet/fwcmd_common.h +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __fwcmd_common_amap_h__ -#define __fwcmd_common_amap_h__ -#include "host_struct.h" - -/* --- PHY_LINK_DUPLEX_ENUM --- */ -#define PHY_LINK_DUPLEX_NONE            (0) -#define PHY_LINK_DUPLEX_HALF            (1) -#define PHY_LINK_DUPLEX_FULL            (2) - -/* --- PHY_LINK_SPEED_ENUM --- */ -#define PHY_LINK_SPEED_ZERO             (0)	/* No link. */ -#define PHY_LINK_SPEED_10MBPS           (1)	/* 10 Mbps */ -#define PHY_LINK_SPEED_100MBPS          (2)	/* 100 Mbps */ -#define PHY_LINK_SPEED_1GBPS            (3)	/* 1 Gbps */ -#define PHY_LINK_SPEED_10GBPS           (4)	/* 10 Gbps */ - -/* --- PHY_LINK_FAULT_ENUM --- */ -#define PHY_LINK_FAULT_NONE             (0)	/* No fault status -							available or detected */ -#define PHY_LINK_FAULT_LOCAL            (1)	/* Local fault detected */ -#define PHY_LINK_FAULT_REMOTE           (2)	/* Remote fault detected */ - -/* --- BE_ULP_MASK --- */ -#define BE_ULP0_MASK                    (1) -#define BE_ULP1_MASK                    (2) -#define BE_ULP2_MASK                    (4) - -/* --- NTWK_ACTIVE_PORT --- */ -#define NTWK_PORT_A                     (0)	/* Port A is currently active */ -#define NTWK_PORT_B                     (1)	/* Port B is currently active */ -#define NTWK_NO_ACTIVE_PORT             (15)	/* Both ports have lost link */ - -/* --- NTWK_LINK_TYPE --- */ -#define NTWK_LINK_TYPE_PHYSICAL         (0)	/* link up/down event -						   applies to BladeEngine's -						   Physical Ports -						   */ -#define NTWK_LINK_TYPE_VIRTUAL          (1)	/* Virtual link up/down event -						   reported by BladeExchange. -						   This applies only when the -						   VLD feature is enabled -						   */ - -/* - * --- FWCMD_MAC_TYPE_ENUM --- - * This enum defines the types of MAC addresses in the RXF MAC Address Table. - */ -#define MAC_ADDRESS_TYPE_STORAGE        (0)	/* Storage MAC Address */ -#define MAC_ADDRESS_TYPE_NETWORK        (1)	/* Network MAC Address */ -#define MAC_ADDRESS_TYPE_PD             (2)	/* Protection Domain MAC Addr */ -#define MAC_ADDRESS_TYPE_MANAGEMENT     (3)	/* Managment MAC Address */ - - -/* --- FWCMD_RING_TYPE_ENUM --- */ -#define FWCMD_RING_TYPE_ETH_RX          (1)	/* Ring created with */ -					/* FWCMD_COMMON_ETH_RX_CREATE. */ -#define FWCMD_RING_TYPE_ETH_TX          (2)	/* Ring created with */ -					/* FWCMD_COMMON_ETH_TX_CREATE. */ -#define FWCMD_RING_TYPE_ISCSI_WRBQ      (3)	/* Ring created with */ -					/* FWCMD_COMMON_ISCSI_WRBQ_CREATE. */ -#define FWCMD_RING_TYPE_ISCSI_DEFQ      (4)	/* Ring created with */ -					/* FWCMD_COMMON_ISCSI_DEFQ_CREATE. */ -#define FWCMD_RING_TYPE_TPM_WRBQ        (5)	/* Ring created with */ -					/* FWCMD_COMMON_TPM_WRBQ_CREATE. */ -#define FWCMD_RING_TYPE_TPM_DEFQ        (6)	/* Ring created with */ -					/* FWCMD_COMMONTPM_TDEFQ_CREATE. */ -#define FWCMD_RING_TYPE_TPM_RQ          (7)	/* Ring created with */ -					/* FWCMD_COMMON_TPM_RQ_CREATE. */ -#define FWCMD_RING_TYPE_MCC             (8)	/* Ring created with */ -					/* FWCMD_COMMON_MCC_CREATE. */ -#define FWCMD_RING_TYPE_CQ              (9)	/* Ring created with */ -					/* FWCMD_COMMON_CQ_CREATE. */ -#define FWCMD_RING_TYPE_EQ              (10)	/* Ring created with */ -					/* FWCMD_COMMON_EQ_CREATE. */ -#define FWCMD_RING_TYPE_QP              (11)	/* Ring created with */ -					/* FWCMD_RDMA_QP_CREATE. */ - - -/* --- ETH_TX_RING_TYPE_ENUM --- */ -#define ETH_TX_RING_TYPE_FORWARDING     (1)	/* Ethernet ring for -						   forwarding packets */ -#define ETH_TX_RING_TYPE_STANDARD       (2)	/* Ethernet ring for sending -						   network packets. */ -#define ETH_TX_RING_TYPE_BOUND          (3)	/* Ethernet ring bound to the -						   port specified in the command -						   header.port_number field. -						   Rings of this type are -						   NOT subject to the -						   failover logic implemented -						   in the BladeEngine. -						   */ - -/* --- FWCMD_COMMON_QOS_TYPE_ENUM --- */ -#define QOS_BITS_NIC                    (1)	/* max_bits_per_second_NIC */ -						  /* field is valid.  */ -#define QOS_PKTS_NIC                    (2)	/* max_packets_per_second_NIC */ -						  /* field is valid.  */ -#define QOS_IOPS_ISCSI                  (4)	/* max_ios_per_second_iSCSI */ -						  /*field is valid.  */ -#define QOS_VLAN_TAG                    (8)	/* domain_VLAN_tag field -						   is valid. */ -#define QOS_FABRIC_ID                   (16)	/* fabric_domain_ID field -						   is valid. */ -#define QOS_OEM_PARAMS                  (32)	/* qos_params_oem field -						   is valid. */ -#define QOS_TPUT_ISCSI                  (64)	/* max_bytes_per_second_iSCSI -						   field  is valid.  */ - - -/* - * --- FAILOVER_CONFIG_ENUM --- - * Failover configuration setting used in FWCMD_COMMON_FORCE_FAILOVER - */ -#define FAILOVER_CONFIG_NO_CHANGE       (0)	/* No change to automatic */ -						  /* port failover setting. */ -#define FAILOVER_CONFIG_ON              (1)	/* Automatic port failover -						   on link down  is enabled. */ -#define FAILOVER_CONFIG_OFF             (2)	/* Automatic port failover -						   on link down is disabled. */ - -/* - * --- FAILOVER_PORT_ENUM --- - * Failover port setting used in FWCMD_COMMON_FORCE_FAILOVER - */ -#define FAILOVER_PORT_A                 (0)	/* Selects port A. */ -#define FAILOVER_PORT_B                 (1)	/* Selects port B. */ -#define FAILOVER_PORT_NONE              (15)	/* No port change requested. */ - - -/* - * --- MGMT_FLASHROM_OPCODE --- - * Flash ROM operation code - */ -#define MGMT_FLASHROM_OPCODE_FLASH      (1)	/* Commit downloaded data -						   to Flash ROM */ -#define MGMT_FLASHROM_OPCODE_SAVE       (2)	/* Save downloaded data to -						   ARM's DDR - do not flash */ -#define MGMT_FLASHROM_OPCODE_CLEAR      (3)	/* Erase specified component -						   from FlashROM */ -#define MGMT_FLASHROM_OPCODE_REPORT     (4)	/* Read specified component -						   from Flash ROM */ -#define MGMT_FLASHROM_OPCODE_IMAGE_INFO (5)	/* Returns size of a -						   component */ - -/* - * --- MGMT_FLASHROM_OPTYPE --- - * Flash ROM operation type - */ -#define MGMT_FLASHROM_OPTYPE_CODE_FIRMWARE (0)	/* Includes ARM firmware, -						   IPSec (optional) and EP -						   firmware  */ -#define MGMT_FLASHROM_OPTYPE_CODE_REDBOOT (1) -#define MGMT_FLASHROM_OPTYPE_CODE_BIOS  (2) -#define MGMT_FLASHROM_OPTYPE_CODE_PXE_BIOS (3) -#define MGMT_FLASHROM_OPTYPE_CODE_CTRLS (4) -#define MGMT_FLASHROM_OPTYPE_CFG_IPSEC  (5) -#define MGMT_FLASHROM_OPTYPE_CFG_INI    (6) -#define MGMT_FLASHROM_OPTYPE_ROM_OFFSET_SPECIFIED (7) - -/* - * --- FLASHROM_TYPE --- - * Flash ROM manufacturers supported in the f/w - */ -#define INTEL                           (0) -#define SPANSION                        (1) -#define MICRON                          (2) - -/* --- DDR_CAS_TYPE --- */ -#define CAS_3                           (0) -#define CAS_4                           (1) -#define CAS_5                           (2) - -/* --- DDR_SIZE_TYPE --- */ -#define SIZE_256MB                      (0) -#define SIZE_512MB                      (1) - -/* --- DDR_MODE_TYPE --- */ -#define DDR_NO_ECC                      (0) -#define DDR_ECC                         (1) - -/* --- INTERFACE_10GB_TYPE --- */ -#define CX4_TYPE                        (0) -#define XFP_TYPE                        (1) - -/* --- BE_CHIP_MAX_MTU --- */ -#define CHIP_MAX_MTU                    (9000) - -/* --- XAUI_STATE_ENUM --- */ -#define XAUI_STATE_ENABLE               (0)	/* This MUST be the default -						   value for all requests -						   which set/change -						   equalization parameter.  */ -#define XAUI_STATE_DISABLE              (255)	/* The XAUI for both ports -						   may be disabled for EMI -						   tests. There is no -						   provision for turning off -						   individual ports. -						   */ -/* --- BE_ASIC_REVISION --- */ -#define BE_ASIC_REV_A0                  (1) -#define BE_ASIC_REV_A1                  (2) - -#endif /* __fwcmd_common_amap_h__ */ diff --git a/drivers/staging/benet/fwcmd_common_bmap.h b/drivers/staging/benet/fwcmd_common_bmap.h deleted file mode 100644 index a007cf27650..00000000000 --- a/drivers/staging/benet/fwcmd_common_bmap.h +++ /dev/null @@ -1,717 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __fwcmd_common_bmap_h__ -#define __fwcmd_common_bmap_h__ -#include "fwcmd_types_bmap.h" -#include "fwcmd_hdr_bmap.h" - -#if defined(__BIG_ENDIAN) -   /* Physical Address. */ -struct PHYS_ADDR { -	union { -		struct { -			u32 lo;	/* DWORD 0 */ -			u32 hi;	/* DWORD 1 */ -		} __packed;	/* unnamed struct */ -		u32 dw[2];	/* dword union */ -	};			/* unnamed union */ -} __packed ; - - -#else -   /* Physical Address. */ -struct PHYS_ADDR { -	union { -		struct { -			u32 lo;	/* DWORD 0 */ -			u32 hi;	/* DWORD 1 */ -		} __packed;	/* unnamed struct */ -		u32 dw[2];	/* dword union */ -	};			/* unnamed union */ -} __packed ; - -struct BE_LINK_STATUS { -	u8 mac0_duplex; -	u8 mac0_speed; -	u8 mac1_duplex; -	u8 mac1_speed; -	u8 mgmt_mac_duplex; -	u8 mgmt_mac_speed; -	u8 active_port; -	u8 rsvd0; -	u8 mac0_fault; -	u8 mac1_fault; -	u16 rsvd1; -} __packed; -#endif - -struct FWCMD_COMMON_ANON_170_REQUEST { -	u32 rsvd0; -} __packed; - -union LINK_STATUS_QUERY_PARAMS { -	struct BE_LINK_STATUS response; -	struct FWCMD_COMMON_ANON_170_REQUEST request; -} __packed; - -/* - *  Queries the the link status for all ports.  The valid values below - *  DO NOT indicate that  a particular duplex or speed is supported by - *  BladeEngine. These enumerations simply  list all possible duplexes - *  and speeds for any port. Consult BladeEngine product  documentation - *  for the supported parameters. - */ -struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY { -	union FWCMD_HEADER header; -	union LINK_STATUS_QUERY_PARAMS params; -} __packed; - -struct FWCMD_COMMON_ANON_171_REQUEST { -	u8 type; -	u8 port; -	u8 mac1; -	u8 permanent; -} __packed; - -struct FWCMD_COMMON_ANON_172_RESPONSE { -	struct MAC_ADDRESS_FORMAT mac; -} __packed; - -union NTWK_MAC_QUERY_PARAMS { -	struct FWCMD_COMMON_ANON_171_REQUEST request; -	struct FWCMD_COMMON_ANON_172_RESPONSE response; -} __packed; - -/* Queries one MAC address.  */ -struct FWCMD_COMMON_NTWK_MAC_QUERY { -	union FWCMD_HEADER header; -	union NTWK_MAC_QUERY_PARAMS params; -} __packed; - -struct MAC_SET_PARAMS_IN { -	u8 type; -	u8 port; -	u8 mac1; -	u8 invalidate; -	struct MAC_ADDRESS_FORMAT mac; -} __packed; - -struct MAC_SET_PARAMS_OUT { -	u32 rsvd0; -} __packed; - -union MAC_SET_PARAMS { -	struct MAC_SET_PARAMS_IN request; -	struct MAC_SET_PARAMS_OUT response; -} __packed; - -/* Sets a MAC address.  */ -struct FWCMD_COMMON_NTWK_MAC_SET { -	union FWCMD_HEADER header; -	union MAC_SET_PARAMS params; -} __packed; - -/* MAC address list. */ -struct NTWK_MULTICAST_MAC_LIST { -	u8 byte[6]; -} __packed; - -struct FWCMD_COMMON_NTWK_MULTICAST_SET_REQUEST_PAYLOAD { -	u16 num_mac; -	u8 promiscuous; -	u8 rsvd0; -	struct NTWK_MULTICAST_MAC_LIST mac[32]; -} __packed; - -struct FWCMD_COMMON_ANON_174_RESPONSE { -	u32 rsvd0; -} __packed; - -union FWCMD_COMMON_ANON_173_PARAMS { -	struct FWCMD_COMMON_NTWK_MULTICAST_SET_REQUEST_PAYLOAD request; -	struct FWCMD_COMMON_ANON_174_RESPONSE response; -} __packed; - -/* - *  Sets multicast address hash. The MPU will merge the MAC address lists - *  from all clients,  including the networking and storage functions. - *  This command may fail if the final merged  list of MAC addresses exceeds - *  32 entries. - */ -struct FWCMD_COMMON_NTWK_MULTICAST_SET { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_173_PARAMS params; -} __packed; - -struct FWCMD_COMMON_NTWK_VLAN_CONFIG_REQUEST_PAYLOAD { -	u16 num_vlan; -	u8 promiscuous; -	u8 rsvd0; -	u16 vlan_tag[32]; -} __packed; - -struct FWCMD_COMMON_ANON_176_RESPONSE { -	u32 rsvd0; -} __packed; - -union FWCMD_COMMON_ANON_175_PARAMS { -	struct FWCMD_COMMON_NTWK_VLAN_CONFIG_REQUEST_PAYLOAD request; -	struct FWCMD_COMMON_ANON_176_RESPONSE response; -} __packed; - -/* - *  Sets VLAN tag filter. The MPU will merge the VLAN tag list from all - *  clients, including  the networking and storage functions. This command - *  may fail if the final vlan_tag array  (from all functions) is longer - *  than 32 entries. - */ -struct FWCMD_COMMON_NTWK_VLAN_CONFIG { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_175_PARAMS params; -} __packed; - -struct RING_DESTROY_REQUEST { -	u16 ring_type; -	u16 id; -	u8 bypass_flush; -	u8 rsvd0; -	u16 rsvd1; -} __packed; - -struct FWCMD_COMMON_ANON_190_RESPONSE { -	u32 rsvd0; -} __packed; - -union FWCMD_COMMON_ANON_189_PARAMS { -	struct RING_DESTROY_REQUEST request; -	struct FWCMD_COMMON_ANON_190_RESPONSE response; -} __packed; -/* - *  Command for destroying any ring. The connection(s) using the ring should - *  be quiesced  before destroying the ring. - */ -struct FWCMD_COMMON_RING_DESTROY { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_189_PARAMS params; -} __packed; - -struct FWCMD_COMMON_ANON_192_REQUEST { -	u16 num_pages; -	u16 rsvd0; -	struct CQ_CONTEXT_AMAP context; -	struct PHYS_ADDR pages[4]; -} __packed ; - -struct FWCMD_COMMON_ANON_193_RESPONSE { -	u16 cq_id; -} __packed ; - -union FWCMD_COMMON_ANON_191_PARAMS { -	struct FWCMD_COMMON_ANON_192_REQUEST request; -	struct FWCMD_COMMON_ANON_193_RESPONSE response; -} __packed ; - -/* - *  Command for creating a completion queue. A Completion Queue must span - *  at least 1 page and  at most 4 pages. Each completion queue entry - *  is 16 bytes regardless of CQ entry format.  Thus the ring must be - *  at least 256 entries deep (corresponding to 1 page) and can be at - *   most 1024 entries deep (corresponding to 4 pages). The number of - *  pages posted must  contain the CQ ring size as encoded in the context. - * - */ -struct FWCMD_COMMON_CQ_CREATE { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_191_PARAMS params; -} __packed ; - -struct FWCMD_COMMON_ANON_198_REQUEST { -	u16 num_pages; -	u16 rsvd0; -	struct EQ_CONTEXT_AMAP context; -	struct PHYS_ADDR pages[8]; -} __packed ; - -struct FWCMD_COMMON_ANON_199_RESPONSE { -	u16 eq_id; -} __packed ; - -union FWCMD_COMMON_ANON_197_PARAMS { -	struct FWCMD_COMMON_ANON_198_REQUEST request; -	struct FWCMD_COMMON_ANON_199_RESPONSE response; -} __packed ; - -/* - *  Command for creating a event queue. An Event Queue must span at least - *  1 page and at most  8 pages. The number of pages posted must contain - *  the EQ ring. The ring is defined by  the size of the EQ entries (encoded - *  in the context) and the number of EQ entries (also  encoded in the - *  context). - */ -struct FWCMD_COMMON_EQ_CREATE { -	union  FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_197_PARAMS params; -} __packed ; - -struct FWCMD_COMMON_ANON_201_REQUEST { -	u16 cq_id; -	u16 bcmc_cq_id; -	u16 num_pages; -	u16 rsvd0; -	struct PHYS_ADDR pages[2]; -} __packed; - -struct FWCMD_COMMON_ANON_202_RESPONSE { -	u16 id; -} __packed; - -union FWCMD_COMMON_ANON_200_PARAMS { -	struct FWCMD_COMMON_ANON_201_REQUEST request; -	struct FWCMD_COMMON_ANON_202_RESPONSE response; -} __packed; - -/* - *  Command for creating Ethernet receive ring.  An ERX ring contains ETH_RX_D - *  entries (8  bytes each). An ERX ring must be 1024 entries deep - *  (corresponding to 2 pages). - */ -struct FWCMD_COMMON_ETH_RX_CREATE { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_200_PARAMS params; -} __packed; - -struct FWCMD_COMMON_ANON_204_REQUEST { -	u16 num_pages; -	u8 ulp_num; -	u8 type; -	struct ETX_CONTEXT_AMAP context; -	struct PHYS_ADDR pages[8]; -} __packed ; - -struct FWCMD_COMMON_ANON_205_RESPONSE { -	u16 cid; -	u8 ulp_num; -	u8 rsvd0; -} __packed ; - -union FWCMD_COMMON_ANON_203_PARAMS { -	struct FWCMD_COMMON_ANON_204_REQUEST request; -	struct FWCMD_COMMON_ANON_205_RESPONSE response; -} __packed ; - -/* - *  Command for creating an Ethernet transmit ring.  An ETX ring contains - *  ETH_WRB entries (16  bytes each). An ETX ring must be at least 256 - *  entries deep (corresponding to 1 page)  and at most 2k entries deep - *  (corresponding to 8 pages). - */ -struct FWCMD_COMMON_ETH_TX_CREATE { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_203_PARAMS params; -} __packed ; - -struct FWCMD_COMMON_ANON_222_REQUEST { -	u16 num_pages; -	u16 rsvd0; -	struct MCC_RING_CONTEXT_AMAP context; -	struct PHYS_ADDR pages[8]; -} __packed ; - -struct FWCMD_COMMON_ANON_223_RESPONSE { -	u16 id; -} __packed ; - -union FWCMD_COMMON_ANON_221_PARAMS { -	struct FWCMD_COMMON_ANON_222_REQUEST request; -	struct FWCMD_COMMON_ANON_223_RESPONSE response; -} __packed ; - -/* - *  Command for creating the MCC ring. An MCC ring must be at least 16 - *  entries deep  (corresponding to 1 page) and at most 128 entries deep - *  (corresponding to 8 pages). - */ -struct FWCMD_COMMON_MCC_CREATE { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_221_PARAMS params; -} __packed ; - -struct GET_QOS_IN { -	u32 qos_params_rsvd; -} __packed; - -struct GET_QOS_OUT { -	u32 max_bits_per_second_NIC; -	u32 max_packets_per_second_NIC; -	u32 max_ios_per_second_iSCSI; -	u32 max_bytes_per_second_iSCSI; -	u16 domain_VLAN_tag; -	u16 fabric_domain_ID; -	u32 qos_params_oem[4]; -} __packed; - -union GET_QOS_PARAMS { -	struct GET_QOS_IN request; -	struct GET_QOS_OUT response; -} __packed; - -/* QOS/Bandwidth settings per domain. Applicable only in VMs.  */ -struct FWCMD_COMMON_GET_QOS { -	union FWCMD_HEADER header; -	union GET_QOS_PARAMS params; -} __packed; - -struct SET_QOS_IN { -	u32 valid_flags; -	u32 max_bits_per_second_NIC; -	u32 max_packets_per_second_NIC; -	u32 max_ios_per_second_iSCSI; -	u32 max_bytes_per_second_iSCSI; -	u16 domain_VLAN_tag; -	u16 fabric_domain_ID; -	u32 qos_params_oem[4]; -} __packed; - -struct SET_QOS_OUT { -	u32 qos_params_rsvd; -} __packed; - -union SET_QOS_PARAMS { -	struct SET_QOS_IN request; -	struct SET_QOS_OUT response; -} __packed; - -/* QOS/Bandwidth settings per domain. Applicable only in VMs.  */ -struct FWCMD_COMMON_SET_QOS { -	union FWCMD_HEADER header; -	union SET_QOS_PARAMS params; -} __packed; - -struct SET_FRAME_SIZE_IN { -	u32 max_tx_frame_size; -	u32 max_rx_frame_size; -} __packed; - -struct SET_FRAME_SIZE_OUT { -	u32 chip_max_tx_frame_size; -	u32 chip_max_rx_frame_size; -} __packed; - -union SET_FRAME_SIZE_PARAMS { -	struct SET_FRAME_SIZE_IN request; -	struct SET_FRAME_SIZE_OUT response; -} __packed; - -/* Set frame size command. Only host domain may issue this command.  */ -struct FWCMD_COMMON_SET_FRAME_SIZE { -	union FWCMD_HEADER header; -	union SET_FRAME_SIZE_PARAMS params; -} __packed; - -struct FORCE_FAILOVER_IN { -	u32 move_to_port; -	u32 failover_config; -} __packed; - -struct FWCMD_COMMON_ANON_231_RESPONSE { -	u32 rsvd0; -} __packed; - -union FWCMD_COMMON_ANON_230_PARAMS { -	struct FORCE_FAILOVER_IN request; -	struct FWCMD_COMMON_ANON_231_RESPONSE response; -} __packed; - -/* - *  Use this command to control failover in BladeEngine. It may be used - *  to failback to a  restored port or to forcibly move traffic from - *  one port to another. It may also be used  to enable or disable the - *  automatic failover feature. This command can only be issued by  domain - *  0. - */ -struct FWCMD_COMMON_FORCE_FAILOVER { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_230_PARAMS params; -} __packed; - -struct FWCMD_COMMON_ANON_240_REQUEST { -	u64 context; -} __packed; - -struct FWCMD_COMMON_ANON_241_RESPONSE { -	u64 context; -} __packed; - -union FWCMD_COMMON_ANON_239_PARAMS { -	struct FWCMD_COMMON_ANON_240_REQUEST request; -	struct FWCMD_COMMON_ANON_241_RESPONSE response; -} __packed; - -/* - *  This command can be used by clients as a no-operation request. Typical - *  uses for drivers  are as a heartbeat mechanism, or deferred processing - *  catalyst. The ARM will always  complete this command with a good completion. - *  The 64-bit parameter is not touched by the  ARM processor. - */ -struct FWCMD_COMMON_NOP { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_239_PARAMS params; -} __packed; - -struct NTWK_RX_FILTER_SETTINGS { -	u8 promiscuous; -	u8 ip_cksum; -	u8 tcp_cksum; -	u8 udp_cksum; -	u8 pass_err; -	u8 pass_ckerr; -	u8 strip_crc; -	u8 mcast_en; -	u8 bcast_en; -	u8 mcast_promiscuous_en; -	u8 unicast_en; -	u8 vlan_promiscuous; -} __packed; - -union FWCMD_COMMON_ANON_242_PARAMS { -	struct NTWK_RX_FILTER_SETTINGS request; -	struct NTWK_RX_FILTER_SETTINGS response; -} __packed; - -/* - *  This command is used to modify the ethernet receive filter configuration. - *  Only domain 0  network function drivers may issue this command. The - *  applied configuration is returned in  the response payload. Note: - *  Some receive packet filter settings are global on  BladeEngine and - *  can affect both the storage and network function clients that the - *   BladeEngine hardware and firmware serve. Additionaly, depending - *  on the revision of  BladeEngine, some ethernet receive filter settings - *  are dependent on others. If a  dependency exists between settings - *  for the BladeEngine revision, and the command request  settings do - *  not meet the dependency requirement, the invalid settings will not - *  be  applied despite the comand succeeding. For example: a driver may - *  request to enable  broadcast packets, but not enable multicast packets. - *  On early revisions of BladeEngine,  there may be no distinction between - *  broadcast and multicast filters, so broadcast could  not be enabled - *  without enabling multicast. In this scenario, the comand would still - *   succeed, but the response payload would indicate the previously - *  configured broadcast  and multicast setting. - */ -struct FWCMD_COMMON_NTWK_RX_FILTER { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_242_PARAMS params; -} __packed; - - -struct FWCMD_COMMON_ANON_244_REQUEST { -	u32 rsvd0; -} __packed; - -struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD { -	u8 firmware_version_string[32]; -	u8 fw_on_flash_version_string[32]; -} __packed; - -union FWCMD_COMMON_ANON_243_PARAMS { -	struct FWCMD_COMMON_ANON_244_REQUEST request; -	struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD response; -} __packed; - -/* This comand retrieves the firmware version.  */ -struct FWCMD_COMMON_GET_FW_VERSION { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_243_PARAMS params; -} __packed; - -struct FWCMD_COMMON_ANON_246_REQUEST { -	u16 tx_flow_control; -	u16 rx_flow_control; -} __packed; - -struct FWCMD_COMMON_ANON_247_RESPONSE { -	u32 rsvd0; -} __packed; - -union FWCMD_COMMON_ANON_245_PARAMS { -	struct FWCMD_COMMON_ANON_246_REQUEST request; -	struct FWCMD_COMMON_ANON_247_RESPONSE response; -} __packed; - -/* - *  This comand is used to program BladeEngine flow control behavior. - *  Only the host  networking driver is allowed to use this comand. - */ -struct FWCMD_COMMON_SET_FLOW_CONTROL { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_245_PARAMS params; -} __packed; - -struct FWCMD_COMMON_ANON_249_REQUEST { -	u32 rsvd0; -} __packed; - -struct FWCMD_COMMON_ANON_250_RESPONSE { -	u16 tx_flow_control; -	u16 rx_flow_control; -} __packed; - -union FWCMD_COMMON_ANON_248_PARAMS { -	struct FWCMD_COMMON_ANON_249_REQUEST request; -	struct FWCMD_COMMON_ANON_250_RESPONSE response; -} __packed; - -/* This comand is used to read BladeEngine flow control settings.  */ -struct FWCMD_COMMON_GET_FLOW_CONTROL { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_248_PARAMS params; -} __packed; - -struct EQ_DELAY_PARAMS { -	u32 eq_id; -	u32 delay_in_microseconds; -} __packed; - -struct FWCMD_COMMON_ANON_257_REQUEST { -	u32 num_eq; -	u32 rsvd0; -	struct EQ_DELAY_PARAMS delay[16]; -} __packed; - -struct FWCMD_COMMON_ANON_258_RESPONSE { -	u32 delay_resolution_in_microseconds; -	u32 delay_max_in_microseconds; -} __packed; - -union MODIFY_EQ_DELAY_PARAMS { -	struct FWCMD_COMMON_ANON_257_REQUEST request; -	struct FWCMD_COMMON_ANON_258_RESPONSE response; -} __packed; - -/* This comand changes the EQ delay for a given set of EQs.  */ -struct FWCMD_COMMON_MODIFY_EQ_DELAY { -	union FWCMD_HEADER header; -	union MODIFY_EQ_DELAY_PARAMS params; -} __packed; - -struct FWCMD_COMMON_ANON_260_REQUEST { -	u32 rsvd0; -} __packed; - -struct BE_FIRMWARE_CONFIG { -	u16 be_config_number; -	u16 asic_revision; -	u32 nic_ulp_mask; -	u32 tulp_mask; -	u32 iscsi_ulp_mask; -	u32 rdma_ulp_mask; -	u32 rsvd0[4]; -	u32 eth_tx_id_start; -	u32 eth_tx_id_count; -	u32 eth_rx_id_start; -	u32 eth_rx_id_count; -	u32 tpm_wrbq_id_start; -	u32 tpm_wrbq_id_count; -	u32 tpm_defq_id_start; -	u32 tpm_defq_id_count; -	u32 iscsi_wrbq_id_start; -	u32 iscsi_wrbq_id_count; -	u32 iscsi_defq_id_start; -	u32 iscsi_defq_id_count; -	u32 rdma_qp_id_start; -	u32 rdma_qp_id_count; -	u32 rsvd1[8]; -} __packed; - -union FWCMD_COMMON_ANON_259_PARAMS { -	struct FWCMD_COMMON_ANON_260_REQUEST request; -	struct BE_FIRMWARE_CONFIG response; -} __packed; - -/* - *  This comand queries the current firmware configuration parameters. - *   The static  configuration type is defined by be_config_number. This - *  differentiates different  BladeEngine builds, such as iSCSI Initiator - *  versus iSCSI Target.  For a given static  configuration, the Upper - *  Layer Protocol (ULP) processors may be reconfigured to support  different - *  protocols. Each ULP processor supports one or more protocols. The - *  masks  indicate which processors are configured for each protocol. - *   For a given static  configuration, the number of TCP connections - *  supported for each protocol may vary. The  *_id_start and *_id_count - *  variables define a linear range of IDs that are available for  each - *  supported protocol. The *_id_count may be used by the driver to allocate - *  the  appropriate number of connection resources. The *_id_start may - *  be used to map the  arbitrary range of IDs to a zero-based range - *  of indices. - */ -struct FWCMD_COMMON_FIRMWARE_CONFIG { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_259_PARAMS params; -} __packed; - -struct FWCMD_COMMON_PORT_EQUALIZATION_PARAMS { -	u32 emph_lev_sel_port0; -	u32 emph_lev_sel_port1; -	u8 xaui_vo_sel; -	u8 xaui_state; -	u16 rsvd0; -	u32 xaui_eq_vector; -} __packed; - -struct FWCMD_COMMON_ANON_262_REQUEST { -	u32 rsvd0; -} __packed; - -union FWCMD_COMMON_ANON_261_PARAMS { -	struct FWCMD_COMMON_ANON_262_REQUEST request; -	struct FWCMD_COMMON_PORT_EQUALIZATION_PARAMS response; -} __packed; - -/* - *  This comand can be used to read XAUI equalization parameters. The - *  ARM firmware applies  default equalization parameters during initialization. - *  These parameters may be  customer-specific when derived from the - *  SEEPROM. See SEEPROM_DATA for equalization  specific fields. - */ -struct FWCMD_COMMON_GET_PORT_EQUALIZATION { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_261_PARAMS params; -} __packed; - -struct FWCMD_COMMON_ANON_264_RESPONSE { -	u32 rsvd0; -} __packed; - -union FWCMD_COMMON_ANON_263_PARAMS { -	struct FWCMD_COMMON_PORT_EQUALIZATION_PARAMS request; -	struct FWCMD_COMMON_ANON_264_RESPONSE response; -} __packed; - -/* - *  This comand can be used to set XAUI equalization parameters. The ARM - *  firmware applies  default equalization parameters during initialization. - *  These parameters may be  customer-specific when derived from the - *  SEEPROM. See SEEPROM_DATA for equalization  specific fields. - */ -struct FWCMD_COMMON_SET_PORT_EQUALIZATION { -	union FWCMD_HEADER header; -	union FWCMD_COMMON_ANON_263_PARAMS params; -} __packed; - -#endif /* __fwcmd_common_bmap_h__ */ diff --git a/drivers/staging/benet/fwcmd_eth_bmap.h b/drivers/staging/benet/fwcmd_eth_bmap.h deleted file mode 100644 index 234b179eace..00000000000 --- a/drivers/staging/benet/fwcmd_eth_bmap.h +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __fwcmd_eth_bmap_h__ -#define __fwcmd_eth_bmap_h__ -#include "fwcmd_hdr_bmap.h" -#include "fwcmd_types_bmap.h" - -struct MIB_ETH_STATISTICS_PARAMS_IN { -	u32 rsvd0; -} __packed; - -struct BE_RXF_STATS { -	u32 p0recvdtotalbytesLSD;	/* DWORD 0 */ -	u32 p0recvdtotalbytesMSD;	/* DWORD 1 */ -	u32 p0recvdtotalframes;	/* DWORD 2 */ -	u32 p0recvdunicastframes;	/* DWORD 3 */ -	u32 p0recvdmulticastframes;	/* DWORD 4 */ -	u32 p0recvdbroadcastframes;	/* DWORD 5 */ -	u32 p0crcerrors;	/* DWORD 6 */ -	u32 p0alignmentsymerrs;	/* DWORD 7 */ -	u32 p0pauseframesrecvd;	/* DWORD 8 */ -	u32 p0controlframesrecvd;	/* DWORD 9 */ -	u32 p0inrangelenerrors;	/* DWORD 10 */ -	u32 p0outrangeerrors;	/* DWORD 11 */ -	u32 p0frametoolongerrors;	/* DWORD 12 */ -	u32 p0droppedaddressmatch;	/* DWORD 13 */ -	u32 p0droppedvlanmismatch;	/* DWORD 14 */ -	u32 p0ipdroppedtoosmall;	/* DWORD 15 */ -	u32 p0ipdroppedtooshort;	/* DWORD 16 */ -	u32 p0ipdroppedhdrtoosmall;	/* DWORD 17 */ -	u32 p0tcpdroppedlen;	/* DWORD 18 */ -	u32 p0droppedrunt;	/* DWORD 19 */ -	u32 p0recvd64;		/* DWORD 20 */ -	u32 p0recvd65_127;	/* DWORD 21 */ -	u32 p0recvd128_256;	/* DWORD 22 */ -	u32 p0recvd256_511;	/* DWORD 23 */ -	u32 p0recvd512_1023;	/* DWORD 24 */ -	u32 p0recvd1518_1522;	/* DWORD 25 */ -	u32 p0recvd1522_2047;	/* DWORD 26 */ -	u32 p0recvd2048_4095;	/* DWORD 27 */ -	u32 p0recvd4096_8191;	/* DWORD 28 */ -	u32 p0recvd8192_9216;	/* DWORD 29 */ -	u32 p0rcvdipcksmerrs;	/* DWORD 30 */ -	u32 p0recvdtcpcksmerrs;	/* DWORD 31 */ -	u32 p0recvdudpcksmerrs;	/* DWORD 32 */ -	u32 p0recvdnonrsspackets;	/* DWORD 33 */ -	u32 p0recvdippackets;	/* DWORD 34 */ -	u32 p0recvdchute1packets;	/* DWORD 35 */ -	u32 p0recvdchute2packets;	/* DWORD 36 */ -	u32 p0recvdchute3packets;	/* DWORD 37 */ -	u32 p0recvdipsecpackets;	/* DWORD 38 */ -	u32 p0recvdmanagementpackets;	/* DWORD 39 */ -	u32 p0xmitbyteslsd;	/* DWORD 40 */ -	u32 p0xmitbytesmsd;	/* DWORD 41 */ -	u32 p0xmitunicastframes;	/* DWORD 42 */ -	u32 p0xmitmulticastframes;	/* DWORD 43 */ -	u32 p0xmitbroadcastframes;	/* DWORD 44 */ -	u32 p0xmitpauseframes;	/* DWORD 45 */ -	u32 p0xmitcontrolframes;	/* DWORD 46 */ -	u32 p0xmit64;		/* DWORD 47 */ -	u32 p0xmit65_127;	/* DWORD 48 */ -	u32 p0xmit128_256;	/* DWORD 49 */ -	u32 p0xmit256_511;	/* DWORD 50 */ -	u32 p0xmit512_1023;	/* DWORD 51 */ -	u32 p0xmit1518_1522;	/* DWORD 52 */ -	u32 p0xmit1522_2047;	/* DWORD 53 */ -	u32 p0xmit2048_4095;	/* DWORD 54 */ -	u32 p0xmit4096_8191;	/* DWORD 55 */ -	u32 p0xmit8192_9216;	/* DWORD 56 */ -	u32 p0rxfifooverflowdropped;	/* DWORD 57 */ -	u32 p0ipseclookupfaileddropped;	/* DWORD 58 */ -	u32 p1recvdtotalbytesLSD;	/* DWORD 59 */ -	u32 p1recvdtotalbytesMSD;	/* DWORD 60 */ -	u32 p1recvdtotalframes;	/* DWORD 61 */ -	u32 p1recvdunicastframes;	/* DWORD 62 */ -	u32 p1recvdmulticastframes;	/* DWORD 63 */ -	u32 p1recvdbroadcastframes;	/* DWORD 64 */ -	u32 p1crcerrors;	/* DWORD 65 */ -	u32 p1alignmentsymerrs;	/* DWORD 66 */ -	u32 p1pauseframesrecvd;	/* DWORD 67 */ -	u32 p1controlframesrecvd;	/* DWORD 68 */ -	u32 p1inrangelenerrors;	/* DWORD 69 */ -	u32 p1outrangeerrors;	/* DWORD 70 */ -	u32 p1frametoolongerrors;	/* DWORD 71 */ -	u32 p1droppedaddressmatch;	/* DWORD 72 */ -	u32 p1droppedvlanmismatch;	/* DWORD 73 */ -	u32 p1ipdroppedtoosmall;	/* DWORD 74 */ -	u32 p1ipdroppedtooshort;	/* DWORD 75 */ -	u32 p1ipdroppedhdrtoosmall;	/* DWORD 76 */ -	u32 p1tcpdroppedlen;	/* DWORD 77 */ -	u32 p1droppedrunt;	/* DWORD 78 */ -	u32 p1recvd64;		/* DWORD 79 */ -	u32 p1recvd65_127;	/* DWORD 80 */ -	u32 p1recvd128_256;	/* DWORD 81 */ -	u32 p1recvd256_511;	/* DWORD 82 */ -	u32 p1recvd512_1023;	/* DWORD 83 */ -	u32 p1recvd1518_1522;	/* DWORD 84 */ -	u32 p1recvd1522_2047;	/* DWORD 85 */ -	u32 p1recvd2048_4095;	/* DWORD 86 */ -	u32 p1recvd4096_8191;	/* DWORD 87 */ -	u32 p1recvd8192_9216;	/* DWORD 88 */ -	u32 p1rcvdipcksmerrs;	/* DWORD 89 */ -	u32 p1recvdtcpcksmerrs;	/* DWORD 90 */ -	u32 p1recvdudpcksmerrs;	/* DWORD 91 */ -	u32 p1recvdnonrsspackets;	/* DWORD 92 */ -	u32 p1recvdippackets;	/* DWORD 93 */ -	u32 p1recvdchute1packets;	/* DWORD 94 */ -	u32 p1recvdchute2packets;	/* DWORD 95 */ -	u32 p1recvdchute3packets;	/* DWORD 96 */ -	u32 p1recvdipsecpackets;	/* DWORD 97 */ -	u32 p1recvdmanagementpackets;	/* DWORD 98 */ -	u32 p1xmitbyteslsd;	/* DWORD 99 */ -	u32 p1xmitbytesmsd;	/* DWORD 100 */ -	u32 p1xmitunicastframes;	/* DWORD 101 */ -	u32 p1xmitmulticastframes;	/* DWORD 102 */ -	u32 p1xmitbroadcastframes;	/* DWORD 103 */ -	u32 p1xmitpauseframes;	/* DWORD 104 */ -	u32 p1xmitcontrolframes;	/* DWORD 105 */ -	u32 p1xmit64;		/* DWORD 106 */ -	u32 p1xmit65_127;	/* DWORD 107 */ -	u32 p1xmit128_256;	/* DWORD 108 */ -	u32 p1xmit256_511;	/* DWORD 109 */ -	u32 p1xmit512_1023;	/* DWORD 110 */ -	u32 p1xmit1518_1522;	/* DWORD 111 */ -	u32 p1xmit1522_2047;	/* DWORD 112 */ -	u32 p1xmit2048_4095;	/* DWORD 113 */ -	u32 p1xmit4096_8191;	/* DWORD 114 */ -	u32 p1xmit8192_9216;	/* DWORD 115 */ -	u32 p1rxfifooverflowdropped;	/* DWORD 116 */ -	u32 p1ipseclookupfaileddropped;	/* DWORD 117 */ -	u32 pxdroppednopbuf;	/* DWORD 118 */ -	u32 pxdroppednotxpb;	/* DWORD 119 */ -	u32 pxdroppednoipsecbuf;	/* DWORD 120 */ -	u32 pxdroppednoerxdescr;	/* DWORD 121 */ -	u32 pxdroppednotpredescr;	/* DWORD 122 */ -	u32 pxrecvdmanagementportpackets;	/* DWORD 123 */ -	u32 pxrecvdmanagementportbytes;	/* DWORD 124 */ -	u32 pxrecvdmanagementportpauseframes;	/* DWORD 125 */ -	u32 pxrecvdmanagementporterrors;	/* DWORD 126 */ -	u32 pxxmitmanagementportpackets;	/* DWORD 127 */ -	u32 pxxmitmanagementportbytes;	/* DWORD 128 */ -	u32 pxxmitmanagementportpause;	/* DWORD 129 */ -	u32 pxxmitmanagementportrxfifooverflow;	/* DWORD 130 */ -	u32 pxrecvdipsecipcksmerrs;	/* DWORD 131 */ -	u32 pxrecvdtcpsecipcksmerrs;	/* DWORD 132 */ -	u32 pxrecvdudpsecipcksmerrs;	/* DWORD 133 */ -	u32 pxipsecrunt;	/* DWORD 134 */ -	u32 pxipsecaddressmismatchdropped;	/* DWORD 135 */ -	u32 pxipsecrxfifooverflowdropped;	/* DWORD 136 */ -	u32 pxipsecframestoolong;	/* DWORD 137 */ -	u32 pxipsectotalipframes;	/* DWORD 138 */ -	u32 pxipseciptoosmall;	/* DWORD 139 */ -	u32 pxipseciptooshort;	/* DWORD 140 */ -	u32 pxipseciphdrtoosmall;	/* DWORD 141 */ -	u32 pxipsectcphdrbad;	/* DWORD 142 */ -	u32 pxrecvdipsecchute1;	/* DWORD 143 */ -	u32 pxrecvdipsecchute2;	/* DWORD 144 */ -	u32 pxrecvdipsecchute3;	/* DWORD 145 */ -	u32 pxdropped7frags;	/* DWORD 146 */ -	u32 pxdroppedfrags;	/* DWORD 147 */ -	u32 pxdroppedinvalidfragring;	/* DWORD 148 */ -	u32 pxnumforwardedpackets;	/* DWORD 149 */ -} __packed; - -union MIB_ETH_STATISTICS_PARAMS { -	struct MIB_ETH_STATISTICS_PARAMS_IN request; -	struct BE_RXF_STATS response; -} __packed; - -/* - *  Query ethernet statistics. All domains may issue this command. The - *  host domain drivers  may optionally reset internal statistic counters - *  with a query. - */ -struct FWCMD_ETH_GET_STATISTICS { -	union FWCMD_HEADER header; -	union MIB_ETH_STATISTICS_PARAMS params; -} __packed; - - -struct FWCMD_ETH_ANON_175_REQUEST { -	u8 port0_promiscuous; -	u8 port1_promiscuous; -	u16 rsvd0; -} __packed; - -struct FWCMD_ETH_ANON_176_RESPONSE { -	u32 rsvd0; -} __packed; - -union FWCMD_ETH_ANON_174_PARAMS { -	struct FWCMD_ETH_ANON_175_REQUEST request; -	struct FWCMD_ETH_ANON_176_RESPONSE response; -} __packed; - -/* Enables/Disables promiscuous ethernet receive mode.  */ -struct FWCMD_ETH_PROMISCUOUS { -	union FWCMD_HEADER header; -	union FWCMD_ETH_ANON_174_PARAMS params; -} __packed; - -struct FWCMD_ETH_ANON_178_REQUEST { -	u32 new_fragsize_log2; -} __packed; - -struct FWCMD_ETH_ANON_179_RESPONSE { -	u32 actual_fragsize_log2; -} __packed; - -union FWCMD_ETH_ANON_177_PARAMS { -	struct FWCMD_ETH_ANON_178_REQUEST request; -	struct FWCMD_ETH_ANON_179_RESPONSE response; -} __packed; - -/* - *  Sets the Ethernet RX fragment size. Only host (domain 0) networking - *  drivers may issue  this command.  This call will fail for non-host - *  protection domains. In this situation the  MCC CQ status will indicate - *  a failure due to insufficient priviledges. The response  should be - *  ignored, and the driver should use the FWCMD_ETH_GET_FRAG_SIZE to - *  query the  existing ethernet receive fragment size. It must use this - *  fragment size for all  fragments in the ethernet receive ring.  If - *  the command succeeds, the driver must use the  frag size indicated - *  in the command response since the requested frag size may not be  applied - *  until the next reboot. When the requested fragsize matches the response - *   fragsize, this indicates the request was applied immediately. - */ -struct FWCMD_ETH_SET_RX_FRAG_SIZE { -	union FWCMD_HEADER header; -	union FWCMD_ETH_ANON_177_PARAMS params; -} __packed; - -struct FWCMD_ETH_ANON_181_REQUEST { -	u32 rsvd0; -} __packed; - -struct FWCMD_ETH_ANON_182_RESPONSE { -	u32 actual_fragsize_log2; -} __packed; - -union FWCMD_ETH_ANON_180_PARAMS { -	struct FWCMD_ETH_ANON_181_REQUEST request; -	struct FWCMD_ETH_ANON_182_RESPONSE response; -} __packed; - -/* - *  Queries the Ethernet RX fragment size. All domains may issue this - *  command.  The driver  should call this command to determine the minimum - *  required fragment size for the ethernet  RX ring buffers. Drivers - *  may choose to use a larger size for each fragment buffer, but  BladeEngine - *  will use up to the configured minimum required fragsize in each ethernet - *   receive fragment buffer. For example, if the ethernet receive fragment - *  size is  configured to 4kB, and a driver uses 8kB fragments, a 6kB - *  ethernet packet received by  BladeEngine will be split accross two - *  of the driver's receive framgents (4kB in one  fragment buffer, and - *  2kB in the subsequent fragment buffer). - */ -struct FWCMD_ETH_GET_RX_FRAG_SIZE { -	union FWCMD_HEADER header; -	union FWCMD_ETH_ANON_180_PARAMS params; -} __packed; - -#endif /* __fwcmd_eth_bmap_h__ */ diff --git a/drivers/staging/benet/fwcmd_hdr_bmap.h b/drivers/staging/benet/fwcmd_hdr_bmap.h deleted file mode 100644 index 28b45328fe7..00000000000 --- a/drivers/staging/benet/fwcmd_hdr_bmap.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __fwcmd_hdr_bmap_h__ -#define __fwcmd_hdr_bmap_h__ - -struct FWCMD_REQUEST_HEADER { -	u8 opcode; -	u8 subsystem; -	u8 port_number; -	u8 domain; -	u32 timeout; -	u32 request_length; -	u32 rsvd0; -} __packed; - -struct FWCMD_RESPONSE_HEADER { -	u8 opcode; -	u8 subsystem; -	u8 rsvd0; -	u8 domain; -	u8 status; -	u8 additional_status; -	u16 rsvd1; -	u32 response_length; -	u32 actual_response_length; -} __packed; - -/* - *  The firmware/driver overwrites the input FWCMD_REQUEST_HEADER with - *  the output  FWCMD_RESPONSE_HEADER. - */ -union FWCMD_HEADER { -	struct FWCMD_REQUEST_HEADER request; -	struct FWCMD_RESPONSE_HEADER response; -} __packed; - -#endif /* __fwcmd_hdr_bmap_h__ */ diff --git a/drivers/staging/benet/fwcmd_mcc.h b/drivers/staging/benet/fwcmd_mcc.h deleted file mode 100644 index 9eeca878c1f..00000000000 --- a/drivers/staging/benet/fwcmd_mcc.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __fwcmd_mcc_amap_h__ -#define __fwcmd_mcc_amap_h__ -#include "fwcmd_opcodes.h" -/* - * Where applicable, a WRB, may contain a list of Scatter-gather elements. - * Each element supports a 64 bit address and a 32bit length field. - */ -struct BE_MCC_SGE_AMAP { -	u8 pa_lo[32];	/* DWORD 0 */ -	u8 pa_hi[32];	/* DWORD 1 */ -	u8 length[32];	/* DWORD 2 */ -} __packed; -struct MCC_SGE_AMAP { -	u32 dw[3]; -}; -/* - * The design of an MCC_SGE allows up to 19 elements to be embedded - * in a WRB, supporting 64KB data transfers (assuming a 4KB page size). - */ -struct BE_MCC_WRB_PAYLOAD_AMAP { -	union { -		struct BE_MCC_SGE_AMAP sgl[19]; -		u8 embedded[59][32];	/* DWORD 0 */ -	}; -} __packed; -struct MCC_WRB_PAYLOAD_AMAP { -	u32 dw[59]; -}; - -/* - * This is the structure of the MCC Command WRB for commands - * sent to the Management Processing Unit (MPU). See section - * for usage in embedded and non-embedded modes. - */ -struct BE_MCC_WRB_AMAP { -	u8 embedded;	/* DWORD 0 */ -	u8 rsvd0[2];	/* DWORD 0 */ -	u8 sge_count[5];	/* DWORD 0 */ -	u8 rsvd1[16];	/* DWORD 0 */ -	u8 special[8];	/* DWORD 0 */ -	u8 payload_length[32];	/* DWORD 1 */ -	u8 tag[2][32];	/* DWORD 2 */ -	u8 rsvd2[32];	/* DWORD 4 */ -	struct BE_MCC_WRB_PAYLOAD_AMAP payload; -} __packed; -struct MCC_WRB_AMAP { -	u32 dw[64]; -}; - -/*  This is the structure of the MCC Completion queue entry  */ -struct BE_MCC_CQ_ENTRY_AMAP { -	u8 completion_status[16];	/* DWORD 0 */ -	u8 extended_status[16];	/* DWORD 0 */ -	u8 mcc_tag[2][32];	/* DWORD 1 */ -	u8 rsvd0[27];	/* DWORD 3 */ -	u8 consumed;	/* DWORD 3 */ -	u8 completed;	/* DWORD 3 */ -	u8 hpi_buffer_completion;	/* DWORD 3 */ -	u8 async_event;	/* DWORD 3 */ -	u8 valid;		/* DWORD 3 */ -} __packed; -struct MCC_CQ_ENTRY_AMAP { -	u32 dw[4]; -}; - -/* Mailbox structures used by the MPU during bootstrap */ -struct BE_MCC_MAILBOX_AMAP { -	struct BE_MCC_WRB_AMAP wrb; -	struct BE_MCC_CQ_ENTRY_AMAP cq; -} __packed; -struct MCC_MAILBOX_AMAP { -	u32 dw[68]; -}; - -#endif /* __fwcmd_mcc_amap_h__ */ diff --git a/drivers/staging/benet/fwcmd_opcodes.h b/drivers/staging/benet/fwcmd_opcodes.h deleted file mode 100644 index 23d569386b4..00000000000 --- a/drivers/staging/benet/fwcmd_opcodes.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __fwcmd_opcodes_amap_h__ -#define __fwcmd_opcodes_amap_h__ - -/* - * --- FWCMD_SUBSYSTEMS --- - * The commands are grouped into the following subsystems. The subsystem - * code along with the opcode uniquely identify a particular fwcmd. - */ -#define FWCMD_SUBSYSTEM_RSVD  (0)	/* This subsystem is reserved. It is */ -						  /* never used. */ -#define FWCMD_SUBSYSTEM_COMMON (1)	/* CMDs in this group are common to -					* all subsystems. See -					* COMMON_SUBSYSTEM_OPCODES for opcodes -					* and Common Host Configuration CMDs -					* for the FWCMD descriptions. -					*/ -#define FWCMD_SUBSYSTEM_COMMON_ISCSI    (2) /* CMDs in this group are */ -					/* -					* common to Initiator and Target. See -					* COMMON_ISCSI_SUBSYSTEM_OPCODES and -					* Common iSCSI Initiator and Target -					* CMDs for the command descriptions. -					*/ -#define FWCMD_SUBSYSTEM_ETH             (3)	/* This subsystem is used to -						execute  Ethernet commands.  */ - -#define FWCMD_SUBSYSTEM_TPM             (4)	/* This subsystem is used -						 to execute TPM  commands.  */ -#define FWCMD_SUBSYSTEM_PXE_UNDI        (5)	/* This subsystem is used -						* to execute PXE -						* and UNDI specific commands. -						*/ - -#define FWCMD_SUBSYSTEM_ISCSI_INI       (6)	/* This subsystem is used to -						execute ISCSI Initiator -						specific commands. -						*/ -#define FWCMD_SUBSYSTEM_ISCSI_TGT       (7)	/* This subsystem is used -						to execute iSCSI Target -						specific commands.between -						PTL and ARM firmware. -						*/ -#define FWCMD_SUBSYSTEM_MILI_PTL        (8)	/* This subsystem is used to -						execute iSCSI Target specific -						commands.between MILI -						and PTL.  */ -#define FWCMD_SUBSYSTEM_MILI_TMD        (9)	/* This subsystem is used to -						execute iSCSI Target specific -						commands between MILI -						and TMD.  */ -#define FWCMD_SUBSYSTEM_PROXY           (11)	/* This subsystem is used -						to execute proxied commands -						within the host at the -						explicit request of a -						non priviledged domain. -						This 'subsystem' is entirely -						virtual from the controller -						and firmware perspective as -						it is implemented in host -						drivers. -						*/ - -/* - * --- COMMON_SUBSYSTEM_OPCODES --- - * These opcodes are common to both networking and storage PCI - * functions. They are used to reserve resources and configure - * BladeEngine. These opcodes all use the FWCMD_SUBSYSTEM_COMMON - * subsystem code. - */ -#define OPCODE_COMMON_NTWK_MAC_QUERY    (1) -#define SUBSYSTEM_COMMON_NTWK_MAC_QUERY (1) -#define SUBSYSTEM_COMMON_NTWK_MAC_SET   (1) -#define SUBSYSTEM_COMMON_NTWK_MULTICAST_SET (1) -#define SUBSYSTEM_COMMON_NTWK_VLAN_CONFIG (1) -#define SUBSYSTEM_COMMON_NTWK_LINK_STATUS_QUERY (1) -#define SUBSYSTEM_COMMON_READ_FLASHROM  (1) -#define SUBSYSTEM_COMMON_WRITE_FLASHROM (1) -#define SUBSYSTEM_COMMON_QUERY_MAX_FWCMD_BUFFER_SIZE (1) -#define SUBSYSTEM_COMMON_ADD_PAGE_TABLES (1) -#define SUBSYSTEM_COMMON_REMOVE_PAGE_TABLES (1) -#define SUBSYSTEM_COMMON_RING_DESTROY   (1) -#define SUBSYSTEM_COMMON_CQ_CREATE      (1) -#define SUBSYSTEM_COMMON_EQ_CREATE      (1) -#define SUBSYSTEM_COMMON_ETH_RX_CREATE  (1) -#define SUBSYSTEM_COMMON_ETH_TX_CREATE  (1) -#define SUBSYSTEM_COMMON_ISCSI_DEFQ_CREATE (1) -#define SUBSYSTEM_COMMON_ISCSI_WRBQ_CREATE (1) -#define SUBSYSTEM_COMMON_MCC_CREATE     (1) -#define SUBSYSTEM_COMMON_JELL_CONFIG    (1) -#define SUBSYSTEM_COMMON_FORCE_FAILOVER (1) -#define SUBSYSTEM_COMMON_ADD_TEMPLATE_HEADER_BUFFERS (1) -#define SUBSYSTEM_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS (1) -#define SUBSYSTEM_COMMON_POST_ZERO_BUFFER (1) -#define SUBSYSTEM_COMMON_GET_QOS        (1) -#define SUBSYSTEM_COMMON_SET_QOS        (1) -#define SUBSYSTEM_COMMON_TCP_GET_STATISTICS (1) -#define SUBSYSTEM_COMMON_SEEPROM_READ   (1) -#define SUBSYSTEM_COMMON_TCP_STATE_QUERY (1) -#define SUBSYSTEM_COMMON_GET_CNTL_ATTRIBUTES (1) -#define SUBSYSTEM_COMMON_NOP            (1) -#define SUBSYSTEM_COMMON_NTWK_RX_FILTER (1) -#define SUBSYSTEM_COMMON_GET_FW_VERSION (1) -#define SUBSYSTEM_COMMON_SET_FLOW_CONTROL (1) -#define SUBSYSTEM_COMMON_GET_FLOW_CONTROL (1) -#define SUBSYSTEM_COMMON_SET_TCP_PARAMETERS (1) -#define SUBSYSTEM_COMMON_SET_FRAME_SIZE (1) -#define SUBSYSTEM_COMMON_GET_FAT        (1) -#define SUBSYSTEM_COMMON_MODIFY_EQ_DELAY (1) -#define SUBSYSTEM_COMMON_FIRMWARE_CONFIG (1) -#define SUBSYSTEM_COMMON_ENABLE_DISABLE_DOMAINS (1) -#define SUBSYSTEM_COMMON_GET_DOMAIN_CONFIG (1) -#define SUBSYSTEM_COMMON_SET_VLD_CONFIG (1) -#define SUBSYSTEM_COMMON_GET_VLD_CONFIG (1) -#define SUBSYSTEM_COMMON_GET_PORT_EQUALIZATION (1) -#define SUBSYSTEM_COMMON_SET_PORT_EQUALIZATION (1) -#define SUBSYSTEM_COMMON_RED_CONFIG     (1) -#define OPCODE_COMMON_NTWK_MAC_SET      (2) -#define OPCODE_COMMON_NTWK_MULTICAST_SET (3) -#define OPCODE_COMMON_NTWK_VLAN_CONFIG  (4) -#define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY (5) -#define OPCODE_COMMON_READ_FLASHROM     (6) -#define OPCODE_COMMON_WRITE_FLASHROM    (7) -#define OPCODE_COMMON_QUERY_MAX_FWCMD_BUFFER_SIZE (8) -#define OPCODE_COMMON_ADD_PAGE_TABLES   (9) -#define OPCODE_COMMON_REMOVE_PAGE_TABLES (10) -#define OPCODE_COMMON_RING_DESTROY      (11) -#define OPCODE_COMMON_CQ_CREATE         (12) -#define OPCODE_COMMON_EQ_CREATE         (13) -#define OPCODE_COMMON_ETH_RX_CREATE     (14) -#define OPCODE_COMMON_ETH_TX_CREATE     (15) -#define OPCODE_COMMON_NET_RESERVED0     (16)	/* Reserved */ -#define OPCODE_COMMON_NET_RESERVED1     (17)	/* Reserved */ -#define OPCODE_COMMON_NET_RESERVED2     (18)	/* Reserved */ -#define OPCODE_COMMON_ISCSI_DEFQ_CREATE (19) -#define OPCODE_COMMON_ISCSI_WRBQ_CREATE (20) -#define OPCODE_COMMON_MCC_CREATE        (21) -#define OPCODE_COMMON_JELL_CONFIG       (22) -#define OPCODE_COMMON_FORCE_FAILOVER    (23) -#define OPCODE_COMMON_ADD_TEMPLATE_HEADER_BUFFERS (24) -#define OPCODE_COMMON_REMOVE_TEMPLATE_HEADER_BUFFERS (25) -#define OPCODE_COMMON_POST_ZERO_BUFFER  (26) -#define OPCODE_COMMON_GET_QOS           (27) -#define OPCODE_COMMON_SET_QOS           (28) -#define OPCODE_COMMON_TCP_GET_STATISTICS (29) -#define OPCODE_COMMON_SEEPROM_READ      (30) -#define OPCODE_COMMON_TCP_STATE_QUERY   (31) -#define OPCODE_COMMON_GET_CNTL_ATTRIBUTES (32) -#define OPCODE_COMMON_NOP               (33) -#define OPCODE_COMMON_NTWK_RX_FILTER    (34) -#define OPCODE_COMMON_GET_FW_VERSION    (35) -#define OPCODE_COMMON_SET_FLOW_CONTROL  (36) -#define OPCODE_COMMON_GET_FLOW_CONTROL  (37) -#define OPCODE_COMMON_SET_TCP_PARAMETERS (38) -#define OPCODE_COMMON_SET_FRAME_SIZE    (39) -#define OPCODE_COMMON_GET_FAT           (40) -#define OPCODE_COMMON_MODIFY_EQ_DELAY   (41) -#define OPCODE_COMMON_FIRMWARE_CONFIG   (42) -#define OPCODE_COMMON_ENABLE_DISABLE_DOMAINS (43) -#define OPCODE_COMMON_GET_DOMAIN_CONFIG (44) -#define OPCODE_COMMON_SET_VLD_CONFIG    (45) -#define OPCODE_COMMON_GET_VLD_CONFIG    (46) -#define OPCODE_COMMON_GET_PORT_EQUALIZATION (47) -#define OPCODE_COMMON_SET_PORT_EQUALIZATION (48) -#define OPCODE_COMMON_RED_CONFIG        (49) - - - -/* - * --- ETH_SUBSYSTEM_OPCODES --- - * These opcodes are used for configuring the Ethernet interfaces. These - * opcodes all use the FWCMD_SUBSYSTEM_ETH subsystem code. - */ -#define OPCODE_ETH_RSS_CONFIG           (1) -#define OPCODE_ETH_ACPI_CONFIG          (2) -#define SUBSYSTEM_ETH_RSS_CONFIG        (3) -#define SUBSYSTEM_ETH_ACPI_CONFIG       (3) -#define OPCODE_ETH_PROMISCUOUS          (3) -#define SUBSYSTEM_ETH_PROMISCUOUS       (3) -#define SUBSYSTEM_ETH_GET_STATISTICS    (3) -#define SUBSYSTEM_ETH_GET_RX_FRAG_SIZE  (3) -#define SUBSYSTEM_ETH_SET_RX_FRAG_SIZE  (3) -#define OPCODE_ETH_GET_STATISTICS       (4) -#define OPCODE_ETH_GET_RX_FRAG_SIZE     (5) -#define OPCODE_ETH_SET_RX_FRAG_SIZE     (6) - - - - - -/* - * --- MCC_STATUS_CODE --- - * These are the global status codes used by all subsystems - */ -#define MCC_STATUS_SUCCESS              (0)	/* Indicates a successful -						completion of  the command */ -#define MCC_STATUS_INSUFFICIENT_PRIVILEGES (1)	/* The client does not have -						sufficient privileges to -						execute the command */ -#define MCC_STATUS_INVALID_PARAMETER    (2)	/* A parameter in the command -						was invalid. The extended -						status contains the index -						of the parameter */ -#define MCC_STATUS_INSUFFICIENT_RESOURCES (3)	/* There are insufficient -						chip resources to execute -						the command */ -#define MCC_STATUS_QUEUE_FLUSHING       (4)	/* The command is completing -						because the queue was -						getting flushed */ -#define MCC_STATUS_DMA_FAILED           (5)	/* The command is completing -						with a DMA error */ - -/* - * --- MGMT_ERROR_CODES --- - * Error Codes returned in the status field of the FWCMD response header - */ -#define MGMT_STATUS_SUCCESS             (0)	/* The FWCMD completed -						without errors */ -#define MGMT_STATUS_FAILED              (1)	/* Error status in the Status -						field of  the -						struct FWCMD_RESPONSE_HEADER */ -#define MGMT_STATUS_ILLEGAL_REQUEST     (2)	/* Invalid FWCMD opcode */ -#define MGMT_STATUS_ILLEGAL_FIELD       (3)	/* Invalid parameter in -						the FWCMD  payload */ - -#endif /* __fwcmd_opcodes_amap_h__ */ diff --git a/drivers/staging/benet/fwcmd_types_bmap.h b/drivers/staging/benet/fwcmd_types_bmap.h deleted file mode 100644 index 92217aff3a1..00000000000 --- a/drivers/staging/benet/fwcmd_types_bmap.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __fwcmd_types_bmap_h__ -#define __fwcmd_types_bmap_h__ - -/* MAC address format  */ -struct MAC_ADDRESS_FORMAT { -	u16 SizeOfStructure; -	u8 MACAddress[6]; -} __packed; - -#endif /* __fwcmd_types_bmap_h__ */ diff --git a/drivers/staging/benet/host_struct.h b/drivers/staging/benet/host_struct.h deleted file mode 100644 index 3de6722b980..00000000000 --- a/drivers/staging/benet/host_struct.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __host_struct_amap_h__ -#define __host_struct_amap_h__ -#include "be_cm.h" -#include "be_common.h" -#include "descriptors.h" - -/* --- EQ_COMPLETION_MAJOR_CODE_ENUM --- */ -#define EQ_MAJOR_CODE_COMPLETION        (0)	/* Completion event on a */ -						  /* qcompletion ueue. */ -#define EQ_MAJOR_CODE_ETH               (1)	/* Affiliated Ethernet Event. */ -#define EQ_MAJOR_CODE_RESERVED          (2)	/* Reserved */ -#define EQ_MAJOR_CODE_RDMA              (3)	/* Affiliated RDMA Event. */ -#define EQ_MAJOR_CODE_ISCSI             (4)	/* Affiliated ISCSI Event */ -#define EQ_MAJOR_CODE_UNAFFILIATED      (5)	/* Unaffiliated Event */ - -/* --- EQ_COMPLETION_MINOR_CODE_ENUM --- */ -#define EQ_MINOR_CODE_COMPLETION        (0)	/* Completion event on a */ -						  /* completion queue. */ -#define EQ_MINOR_CODE_OTHER             (1)	/* Other Event (TBD). */ - -/* Queue Entry Definition for all 4 byte event queue types. */ -struct BE_EQ_ENTRY_AMAP { -	u8 Valid;		/* DWORD 0 */ -	u8 MajorCode[3];	/* DWORD 0 */ -	u8 MinorCode[12];	/* DWORD 0 */ -	u8 ResourceID[16];	/* DWORD 0 */ -} __packed; -struct EQ_ENTRY_AMAP { -	u32 dw[1]; -}; - -/* - * --- ETH_EVENT_CODE --- - * These codes are returned by the MPU when one of these events has occurred, - * and the event is configured to report to an Event Queue when an event - * is detected. - */ -#define ETH_EQ_LINK_STATUS              (0)	/* Link status change event */ -						  /* detected. */ -#define ETH_EQ_WATERMARK                (1)	/* watermark event detected. */ -#define ETH_EQ_MAGIC_PKT                (2)	/* magic pkt event detected. */ -#define ETH_EQ_ACPI_PKT0                (3)	/* ACPI interesting packet */ -						  /* detected. */ -#define ETH_EQ_ACPI_PKT1                (3)	/* ACPI interesting packet */ -						  /* detected. */ -#define ETH_EQ_ACPI_PKT2                (3)	/* ACPI interesting packet */ -						  /* detected. */ -#define ETH_EQ_ACPI_PKT3                (3)	/* ACPI interesting packet */ -						  /* detected. */ - -/* - * --- ETH_TX_COMPL_STATUS_ENUM --- - * Status codes contained in Ethernet TX completion descriptors. - */ -#define ETH_COMP_VALID                  (0) -#define ETH_COMP_ERROR                  (1) -#define ETH_COMP_INVALID                (15) - -/* - * --- ETH_TX_COMPL_PORT_ENUM --- - * Port indicator contained in Ethernet TX completion descriptors. - */ -#define ETH_COMP_PORT0                  (0) -#define ETH_COMP_PORT1                  (1) -#define ETH_COMP_MGMT                   (2) - -/* - * --- ETH_TX_COMPL_CT_ENUM --- - * Completion type indicator contained in Ethernet TX completion descriptors. - */ -#define ETH_COMP_ETH                    (0) - -/* - * Work request block that the driver issues to the chip for - * Ethernet transmissions. All control fields must be valid in each WRB for - * a message. The controller, as specified by the flags, optionally writes - * an entry to the Completion Ring and generate an event. - */ -struct BE_ETH_WRB_AMAP { -	u8 frag_pa_hi[32];	/* DWORD 0 */ -	u8 frag_pa_lo[32];	/* DWORD 1 */ -	u8 complete;	/* DWORD 2 */ -	u8 event;		/* DWORD 2 */ -	u8 crc;		/* DWORD 2 */ -	u8 forward;		/* DWORD 2 */ -	u8 ipsec;		/* DWORD 2 */ -	u8 mgmt;		/* DWORD 2 */ -	u8 ipcs;		/* DWORD 2 */ -	u8 udpcs;		/* DWORD 2 */ -	u8 tcpcs;		/* DWORD 2 */ -	u8 lso;		/* DWORD 2 */ -	u8 last;		/* DWORD 2 */ -	u8 vlan;		/* DWORD 2 */ -	u8 dbg[3];		/* DWORD 2 */ -	u8 hash_val[3];	/* DWORD 2 */ -	u8 lso_mss[14];	/* DWORD 2 */ -	u8 frag_len[16];	/* DWORD 3 */ -	u8 vlan_tag[16];	/* DWORD 3 */ -} __packed; -struct ETH_WRB_AMAP { -	u32 dw[4]; -}; - -/* This is an Ethernet transmit completion descriptor */ -struct BE_ETH_TX_COMPL_AMAP { -	u8 user_bytes[16];	/* DWORD 0 */ -	u8 nwh_bytes[8];	/* DWORD 0 */ -	u8 lso;		/* DWORD 0 */ -	u8 rsvd0[7];	/* DWORD 0 */ -	u8 wrb_index[16];	/* DWORD 1 */ -	u8 ct[2];		/* DWORD 1 */ -	u8 port[2];		/* DWORD 1 */ -	u8 rsvd1[8];	/* DWORD 1 */ -	u8 status[4];	/* DWORD 1 */ -	u8 rsvd2[16];	/* DWORD 2 */ -	u8 ringid[11];	/* DWORD 2 */ -	u8 hash_val[4];	/* DWORD 2 */ -	u8 valid;		/* DWORD 2 */ -	u8 rsvd3[32];	/* DWORD 3 */ -} __packed; -struct ETH_TX_COMPL_AMAP { -	u32 dw[4]; -}; - -/* Ethernet Receive Buffer descriptor */ -struct BE_ETH_RX_D_AMAP { -	u8 fragpa_hi[32];	/* DWORD 0 */ -	u8 fragpa_lo[32];	/* DWORD 1 */ -} __packed; -struct ETH_RX_D_AMAP { -	u32 dw[2]; -}; - -/* This is an Ethernet Receive Completion Descriptor */ -struct BE_ETH_RX_COMPL_AMAP { -	u8 vlan_tag[16];	/* DWORD 0 */ -	u8 pktsize[14];	/* DWORD 0 */ -	u8 port;		/* DWORD 0 */ -	u8 rsvd0;		/* DWORD 0 */ -	u8 err;		/* DWORD 1 */ -	u8 rsshp;		/* DWORD 1 */ -	u8 ipf;		/* DWORD 1 */ -	u8 tcpf;		/* DWORD 1 */ -	u8 udpf;		/* DWORD 1 */ -	u8 ipcksm;		/* DWORD 1 */ -	u8 tcpcksm;		/* DWORD 1 */ -	u8 udpcksm;		/* DWORD 1 */ -	u8 macdst[6];	/* DWORD 1 */ -	u8 vtp;		/* DWORD 1 */ -	u8 vtm;		/* DWORD 1 */ -	u8 fragndx[10];	/* DWORD 1 */ -	u8 ct[2];		/* DWORD 1 */ -	u8 ipsec;		/* DWORD 1 */ -	u8 numfrags[3];	/* DWORD 1 */ -	u8 rsvd1[31];	/* DWORD 2 */ -	u8 valid;		/* DWORD 2 */ -	u8 rsshash[32];	/* DWORD 3 */ -} __packed; -struct ETH_RX_COMPL_AMAP { -	u32 dw[4]; -}; - -#endif /* __host_struct_amap_h__ */ diff --git a/drivers/staging/benet/hwlib.h b/drivers/staging/benet/hwlib.h deleted file mode 100644 index afedf4dc590..00000000000 --- a/drivers/staging/benet/hwlib.h +++ /dev/null @@ -1,830 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#ifndef __hwlib_h__ -#define __hwlib_h__ - -#include <linux/module.h> -#include <linux/io.h> -#include <linux/list.h> -#include <linux/spinlock.h> - -#include "regmap.h"		/* srcgen array map output */ - -#include "asyncmesg.h" -#include "fwcmd_opcodes.h" -#include "post_codes.h" -#include "fwcmd_mcc.h" - -#include "fwcmd_types_bmap.h" -#include "fwcmd_common_bmap.h" -#include "fwcmd_eth_bmap.h" -#include "bestatus.h" -/* - * - * Macros for reading/writing a protection domain or CSR registers - * in BladeEngine. - */ -#define PD_READ(fo, field)	ioread32((fo)->db_va + \ -		offsetof(struct BE_PROTECTION_DOMAIN_DBMAP_AMAP, field)/8) - -#define PD_WRITE(fo, field, val) iowrite32(val, (fo)->db_va + \ -		offsetof(struct BE_PROTECTION_DOMAIN_DBMAP_AMAP, field)/8) - -#define CSR_READ(fo, field)	ioread32((fo)->csr_va + \ -		offsetof(struct BE_BLADE_ENGINE_CSRMAP_AMAP, field)/8) - -#define CSR_WRITE(fo, field, val)	iowrite32(val, (fo)->csr_va + \ -		offsetof(struct BE_BLADE_ENGINE_CSRMAP_AMAP, field)/8) - -#define PCICFG0_READ(fo, field)	ioread32((fo)->pci_va + \ -		offsetof(struct BE_PCICFG0_CSRMAP_AMAP, field)/8) - -#define PCICFG0_WRITE(fo, field, val)	iowrite32(val, (fo)->pci_va + \ -		offsetof(struct BE_PCICFG0_CSRMAP_AMAP, field)/8) - -#define PCICFG1_READ(fo, field)	ioread32((fo)->pci_va + \ -		offsetof(struct BE_PCICFG1_CSRMAP_AMAP, field)/8) - -#define PCICFG1_WRITE(fo, field, val)	iowrite32(val, (fo)->pci_va + \ -		offsetof(struct BE_PCICFG1_CSRMAP_AMAP, field)/8) - -#ifdef BE_DEBUG -#define ASSERT(c)       BUG_ON(!(c)); -#else -#define ASSERT(c) -#endif - -/* debug levels */ -enum BE_DEBUG_LEVELS { -	DL_ALWAYS = 0,		/* cannot be masked */ -	DL_ERR = 0x1,		/* errors that should never happen */ -	DL_WARN = 0x2,		/* something questionable. -				   recoverable errors */ -	DL_NOTE = 0x4,		/* infrequent, important debug info */ -	DL_INFO = 0x8,		/* debug information */ -	DL_VERBOSE = 0x10,	/* detailed info, such as buffer traces */ -	BE_DL_MIN_VALUE = 0x1,	/* this is the min value used */ -	BE_DL_MAX_VALUE = 0x80	/* this is the higheset value used */ -} ; - -extern unsigned int trace_level; - -#define TRACE(lm, fmt, args...)  {				\ -		if (trace_level & lm) {				\ -			printk(KERN_NOTICE "BE: %s:%d \n" fmt,	\ -			__FILE__ , __LINE__ , ## args);		\ -		}						\ -	} - -static inline unsigned int be_trace_set_level(unsigned int level) -{ -	unsigned int old_level = trace_level; -	trace_level = level; -	return old_level; -} - -#define be_trace_get_level() 	trace_level -/* - * Returns number of pages spanned by the size of data - * starting at the given address. - */ -#define PAGES_SPANNED(_address, _size) \ -   ((u32)((((size_t)(_address) & (PAGE_SIZE - 1)) + \ -		(_size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)) -/* Byte offset into the page corresponding to given address */ -#define OFFSET_IN_PAGE(_addr_) ((size_t)(_addr_) & (PAGE_SIZE-1)) - -/* - * circular subtract. - * Returns a - b assuming a circular number system, where a and b are - * in range (0, maxValue-1). If a==b, zero is returned so the - * highest value possible with this subtraction is maxValue-1. - */ -static inline u32 be_subc(u32 a, u32 b, u32 max) -{ -	ASSERT(a <= max && b <= max); -	ASSERT(max > 0); -	return a >= b ? (a - b) : (max - b + a); -} - -static inline u32 be_addc(u32 a, u32 b, u32 max) -{ -	ASSERT(a < max); -	ASSERT(max > 0); -	return (max - a > b) ? (a + b) : (b + a - max); -} - -/* descriptor for a physically contiguous memory used for ring */ -struct ring_desc { -	u32 length;	/* length in bytes */ -	void *va; 	/* virtual address */ -	u64 pa;		/* bus address */ -} ; - -/* - * This structure stores information about a ring shared between hardware - * and software.  Each ring is allocated by the driver in the uncached - * extension and mapped into BladeEngine's unified table. - */ -struct mp_ring { -	u32 pages;		/* queue size in pages */ -	u32 id;			/* queue id assigned by beklib */ -	u32 num;		/* number of elements in queue */ -	u32 cidx;		/* consumer index */ -	u32 pidx;		/* producer index -- not used by most rings */ -	u32 itemSize;		/* size in bytes of one object */ - -	void *va;		/* The virtual address of the ring. -				   This should be last to allow 32 & 64 -				   bit debugger extensions to work. */ -} ; - -/*-----------  amap bit filed get / set macros and functions -----*/ -/* - * Structures defined in the map header files (under fw/amap/) with names - * in the format BE_<name>_AMAP are pseudo structures with members - * of type u8. These structures are templates that are used in - * conjuntion with the structures with names in the format - * <name>_AMAP to calculate the bit masks and bit offsets to get or set - * bit fields in structures. The structures <name>_AMAP are arrays - * of 32 bits words and have the correct size.  The following macros - * provide convenient ways to get and set the various members - * in the structures without using strucctures with bit fields. - * Always use the macros AMAP_GET_BITS_PTR and AMAP_SET_BITS_PTR - * macros to extract and set various members. - */ - -/* - * Returns the a bit mask for the register that is NOT shifted into location. - * That means return values always look like: 0x1, 0xFF, 0x7FF, etc... - */ -static inline u32 amap_mask(u32 bit_size) -{ -	return bit_size == 32 ? 0xFFFFFFFF : (1 << bit_size) - 1; -} - -#define AMAP_BIT_MASK(_struct_, field)       \ -	amap_mask(AMAP_BIT_SIZE(_struct_, field)) - -/* - * non-optimized set bits function. First clears the bits and then assigns them. - * This does not require knowledge of the particular DWORD you are setting. - * e.g. AMAP_SET_BITS_PTR (struct, field1, &contextMemory, 123); - */ -static inline void -amap_set(void *ptr, u32 dw_offset, u32 mask, u32 offset, u32 value) -{ -	u32 *dw = (u32 *)ptr; -	*(dw + dw_offset) &= ~(mask << offset); -	*(dw + dw_offset) |= (mask & value) << offset; -} - -#define AMAP_SET_BITS_PTR(_struct_, field, _structPtr_, val)	\ -	amap_set(_structPtr_, AMAP_WORD_OFFSET(_struct_, field),\ -		AMAP_BIT_MASK(_struct_, field),			\ -		AMAP_BIT_OFFSET(_struct_, field), val) -/* - * Non-optimized routine that gets the bits without knowing the correct DWORD. - * e.g. fieldValue = AMAP_GET_BITS_PTR (struct, field1, &contextMemory); - */ -static inline u32 -amap_get(void *ptr, u32 dw_offset, u32 mask, u32 offset) -{ -	u32 *dw = (u32 *)ptr; -	return mask & (*(dw + dw_offset) >> offset); -} -#define AMAP_GET_BITS_PTR(_struct_, field, _structPtr_)			\ -	amap_get(_structPtr_, AMAP_WORD_OFFSET(_struct_, field),	\ -		AMAP_BIT_MASK(_struct_, field),				\ -		AMAP_BIT_OFFSET(_struct_, field)) - -/* Returns 0-31 representing bit offset within a DWORD of a bitfield. */ -#define AMAP_BIT_OFFSET(_struct_, field)                  \ -	(offsetof(struct BE_ ## _struct_ ## _AMAP, field) % 32) - -/* Returns 0-n representing DWORD offset of bitfield within the structure. */ -#define AMAP_WORD_OFFSET(_struct_, field)  \ -		  (offsetof(struct BE_ ## _struct_ ## _AMAP, field)/32) - -/* Returns size of bitfield in bits. */ -#define AMAP_BIT_SIZE(_struct_, field) \ -		sizeof(((struct BE_ ## _struct_ ## _AMAP*)0)->field) - -struct be_mcc_wrb_response_copy { -	u16 length;		/* bytes in response */ -	u16 fwcmd_offset;	/* offset within the wrb of the response */ -	void *va;		/* user's va to copy response into */ - -} ; -typedef void (*mcc_wrb_cqe_callback) (void *context, int status, -				struct MCC_WRB_AMAP *optional_wrb); -struct be_mcc_wrb_context { - -	mcc_wrb_cqe_callback internal_cb;	/* Function to call on -						completion */ -	void *internal_cb_context;	/* Parameter to pass -						   to completion function */ - -	mcc_wrb_cqe_callback cb;	/* Function to call on completion */ -	void *cb_context;	/* Parameter to pass to completion function */ - -	int *users_final_status;	/* pointer to a local -						variable for synchronous -						commands */ -	struct MCC_WRB_AMAP *wrb;	/* pointer to original wrb for embedded -						commands only */ -	struct list_head next;	/* links context structs together in -				   free list */ - -	struct be_mcc_wrb_response_copy copy;	/* Optional parameters to copy -					   embedded response to user's va */ - -#if defined(BE_DEBUG) -	u16 subsystem, opcode;	/* Track this FWCMD for debug builds. */ -	struct MCC_WRB_AMAP *ring_wrb; -	u32 consumed_count; -#endif -} ; - -/* -    Represents a function object for network or storage.  This -    is used to manage per-function resources like MCC CQs, etc. -*/ -struct be_function_object { - -	u32 magic;		/*!< magic for detecting memory corruption. */ - -	/* PCI BAR mapped addresses */ -	u8 __iomem *csr_va;	/* CSR */ -	u8 __iomem *db_va;	/* Door Bell */ -	u8 __iomem *pci_va;	/* PCI config space */ -	u32 emulate;		/* if set, MPU is not available. -				  Emulate everything.     */ -	u32 pend_queue_driving;	/* if set, drive the queued WRBs -				   after releasing the WRB lock */ - -	spinlock_t post_lock;	/* lock for verifying one thread posting wrbs */ -	spinlock_t cq_lock;	/* lock for verifying one thread -				   processing cq */ -	spinlock_t mcc_context_lock;	/* lock for protecting mcc -					   context free list */ -	unsigned long post_irq; -	unsigned long cq_irq; - -	u32 type; -	u32 pci_function_number; - -	struct be_mcc_object *mcc;	/* mcc rings. */ - -	struct { -		struct MCC_MAILBOX_AMAP *va;	/* VA to the mailbox */ -		u64 pa;	/* PA to the mailbox */ -		u32 length;	/* byte length of mailbox */ - -		/* One default context struct used for posting at -		 * least one MCC_WRB -		 */ -		struct be_mcc_wrb_context default_context; -		bool default_context_allocated; -	} mailbox; - -	struct { - -		/* Wake on lans configured. */ -		u32 wol_bitmask;	/* bits 0,1,2,3 are set if -					   corresponding index is enabled */ -	} config; - - -	struct BE_FIRMWARE_CONFIG fw_config; -} ; - -/* -      Represents an Event Queue -*/ -struct be_eq_object { -	u32 magic; -	atomic_t ref_count; - -	struct be_function_object *parent_function; - -	struct list_head eq_list; -	struct list_head cq_list_head; - -	u32 eq_id; -	void *cb_context; - -} ; - -/* -    Manages a completion queue -*/ -struct be_cq_object { -	u32 magic; -	atomic_t ref_count; - -	struct be_function_object *parent_function; -	struct be_eq_object *eq_object; - -	struct list_head cq_list; -	struct list_head cqlist_for_eq; - -	void *va; -	u32 num_entries; - -	void *cb_context; - -	u32 cq_id; - -} ; - -/* -    Manages an ethernet send queue -*/ -struct be_ethsq_object { -	u32 magic; - -	struct list_head list; - -	struct be_function_object *parent_function; -	struct be_cq_object *cq_object; -	u32 bid; - -} ; - -/* -@brief -    Manages an ethernet receive queue -*/ -struct be_ethrq_object { -	u32 magic; -	struct list_head list; -	struct be_function_object *parent_function; -	u32 rid; -	struct be_cq_object *cq_object; -	struct be_cq_object *rss_cq_object[4]; - -} ; - -/* -    Manages an MCC -*/ -typedef void (*mcc_async_event_callback) (void *context, u32 event_code, -				void *event); -struct be_mcc_object { -	u32 magic; - -	struct be_function_object *parent_function; -	struct list_head mcc_list; - -	struct be_cq_object *cq_object; - -	/* Async event callback for MCC CQ. */ -	mcc_async_event_callback async_cb; -	void *async_context; - -	struct { -		struct be_mcc_wrb_context *base; -		u32 num; -		struct list_head list_head; -	} wrb_context; - -	struct { -		struct ring_desc *rd; -		struct mp_ring ring; -	} sq; - -	struct { -		struct mp_ring ring; -	} cq; - -	u32 processing;		/* flag indicating that one thread -				   is processing CQ */ -	u32 rearm;		/* doorbell rearm setting to make -				   sure the active processing thread */ -	/* rearms the CQ if any of the threads requested it. */ - -	struct list_head backlog; -	u32 backlog_length; -	u32 driving_backlog; -	u32 consumed_index; - -} ; - - -/* Queue context header -- the required software information for - * queueing a WRB. - */ -struct be_queue_driver_context { -	mcc_wrb_cqe_callback internal_cb;	/* Function to call on -						   completion */ -	void *internal_cb_context;	/* Parameter to pass -						   to completion function */ - -	mcc_wrb_cqe_callback cb;	/* Function to call on completion */ -	void *cb_context;	/* Parameter to pass to completion function */ - -	struct be_mcc_wrb_response_copy copy;	/* Optional parameters to copy -					   embedded response to user's va */ -	void *optional_fwcmd_va; -	struct list_head list; -	u32 bytes; -} ; - -/* - * Common MCC WRB header that all commands require. - */ -struct be_mcc_wrb_header { -	u8 rsvd[offsetof(struct BE_MCC_WRB_AMAP, payload)/8]; -} ; - -/* - * All non embedded commands supported by hwlib functions only allow - * 1 SGE.  This queue context handles them all. - */ -struct be_nonembedded_q_ctxt { -	struct be_queue_driver_context context; -	struct be_mcc_wrb_header wrb_header; -	struct MCC_SGE_AMAP sge[1]; -} ; - -/* - * ------------------------------------------------------------------------ - *  This section contains the specific queue struct for each command. - *  The user could always provide a be_generic_q_ctxt but this is a - *  rather large struct.  By using the specific struct, memory consumption - *  can be reduced. - * ------------------------------------------------------------------------ - */ - -struct be_link_status_q_ctxt { -	struct be_queue_driver_context context; -	struct be_mcc_wrb_header wrb_header; -	struct FWCMD_COMMON_NTWK_LINK_STATUS_QUERY fwcmd; -} ; - -struct be_multicast_q_ctxt { -	struct be_queue_driver_context context; -	struct be_mcc_wrb_header wrb_header; -	struct FWCMD_COMMON_NTWK_MULTICAST_SET fwcmd; -} ; - - -struct be_vlan_q_ctxt { -	struct be_queue_driver_context context; -	struct be_mcc_wrb_header wrb_header; -	struct FWCMD_COMMON_NTWK_VLAN_CONFIG fwcmd; -} ; - -struct be_promiscuous_q_ctxt { -	struct be_queue_driver_context context; -	struct be_mcc_wrb_header wrb_header; -	struct FWCMD_ETH_PROMISCUOUS fwcmd; -} ; - -struct be_force_failover_q_ctxt { -	struct be_queue_driver_context context; -	struct be_mcc_wrb_header wrb_header; -	struct FWCMD_COMMON_FORCE_FAILOVER fwcmd; -} ; - - -struct be_rxf_filter_q_ctxt { -	struct be_queue_driver_context context; -	struct be_mcc_wrb_header wrb_header; -	struct FWCMD_COMMON_NTWK_RX_FILTER fwcmd; -} ; - -struct be_eq_modify_delay_q_ctxt { -	struct be_queue_driver_context context; -	struct be_mcc_wrb_header wrb_header; -	struct FWCMD_COMMON_MODIFY_EQ_DELAY fwcmd; -} ; - -/* - * The generic context is the largest size that would be required. - * It is the software context plus an entire WRB. - */ -struct be_generic_q_ctxt { -	struct be_queue_driver_context context; -	struct be_mcc_wrb_header wrb_header; -	struct MCC_WRB_PAYLOAD_AMAP payload; -} ; - -/* - * Types for the BE_QUEUE_CONTEXT object. - */ -#define BE_QUEUE_INVALID	(0) -#define BE_QUEUE_LINK_STATUS	(0xA006) -#define BE_QUEUE_ETH_STATS	(0xA007) -#define BE_QUEUE_TPM_STATS	(0xA008) -#define BE_QUEUE_TCP_STATS	(0xA009) -#define BE_QUEUE_MULTICAST	(0xA00A) -#define BE_QUEUE_VLAN		(0xA00B) -#define BE_QUEUE_RSS		(0xA00C) -#define BE_QUEUE_FORCE_FAILOVER	(0xA00D) -#define BE_QUEUE_PROMISCUOUS	(0xA00E) -#define BE_QUEUE_WAKE_ON_LAN	(0xA00F) -#define BE_QUEUE_NOP		(0xA010) - -/* --- BE_FUNCTION_ENUM --- */ -#define BE_FUNCTION_TYPE_ISCSI          (0) -#define BE_FUNCTION_TYPE_NETWORK        (1) -#define BE_FUNCTION_TYPE_ARM            (2) - -/* --- BE_ETH_TX_RING_TYPE_ENUM --- */ -#define BE_ETH_TX_RING_TYPE_FORWARDING  (1) 	/* Ether ring for forwarding */ -#define BE_ETH_TX_RING_TYPE_STANDARD    (2)	/* Ether ring for sending */ -						/* network packets. */ -#define BE_ETH_TX_RING_TYPE_BOUND       (3)	/* Ethernet ring for sending */ -						/* network packets, bound */ -						/* to a physical port. */ -/* - * ---------------------------------------------------------------------- - *   API MACROS - * ---------------------------------------------------------------------- - */ -#define BE_FWCMD_NAME(_short_name_)     struct FWCMD_##_short_name_ -#define BE_OPCODE_NAME(_short_name_)    OPCODE_##_short_name_ -#define BE_SUBSYSTEM_NAME(_short_name_) SUBSYSTEM_##_short_name_ - - -#define BE_PREPARE_EMBEDDED_FWCMD(_pfob_, _wrb_, _short_name_)	\ -	((BE_FWCMD_NAME(_short_name_) *)				\ -	be_function_prepare_embedded_fwcmd(_pfob_, _wrb_,	\ -		sizeof(BE_FWCMD_NAME(_short_name_)),		\ -		FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.request), \ -		FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.response), \ -		BE_OPCODE_NAME(_short_name_),				\ -		BE_SUBSYSTEM_NAME(_short_name_))); - -#define BE_PREPARE_NONEMBEDDED_FWCMD(_pfob_, _wrb_, _iva_, _ipa_, _short_name_)\ -	((BE_FWCMD_NAME(_short_name_) *)				\ -	be_function_prepare_nonembedded_fwcmd(_pfob_, _wrb_, (_iva_), (_ipa_), \ -		sizeof(BE_FWCMD_NAME(_short_name_)),		\ -		FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.request), \ -		FIELD_SIZEOF(BE_FWCMD_NAME(_short_name_), params.response), \ -		BE_OPCODE_NAME(_short_name_),				\ -		BE_SUBSYSTEM_NAME(_short_name_))); - -int be_function_object_create(u8 __iomem *csr_va, u8 __iomem *db_va, -	u8 __iomem *pci_va, u32 function_type, struct ring_desc *mailbox_rd, -	  struct be_function_object *pfob); - -int be_function_object_destroy(struct be_function_object *pfob); -int be_function_cleanup(struct be_function_object *pfob); - - -int be_function_get_fw_version(struct be_function_object *pfob, -	struct FWCMD_COMMON_GET_FW_VERSION_RESPONSE_PAYLOAD *fw_version, -	mcc_wrb_cqe_callback cb, void *cb_context); - - -int be_eq_modify_delay(struct be_function_object *pfob, -		   u32 num_eq, struct be_eq_object **eq_array, -		   u32 *eq_delay_array, mcc_wrb_cqe_callback cb, -		   void *cb_context, -		   struct be_eq_modify_delay_q_ctxt *q_ctxt); - - - -int be_eq_create(struct be_function_object *pfob, -	     struct ring_desc *rd, u32 eqe_size, u32 num_entries, -	     u32 watermark, u32 timer_delay, struct be_eq_object *eq_object); - -int be_eq_destroy(struct be_eq_object *eq); - -int be_cq_create(struct be_function_object *pfob, -	struct ring_desc *rd, u32 length, -	bool solicited_eventable, bool no_delay, -	u32 wm_thresh, struct be_eq_object *eq_object, -	struct be_cq_object *cq_object); - -int be_cq_destroy(struct be_cq_object *cq); - -int be_mcc_ring_create(struct be_function_object *pfob, -		   struct ring_desc *rd, u32 length, -		   struct be_mcc_wrb_context *context_array, -		   u32 num_context_entries, -		   struct be_cq_object *cq, struct be_mcc_object *mcc); -int be_mcc_ring_destroy(struct be_mcc_object *mcc_object); - -int be_mcc_process_cq(struct be_mcc_object *mcc_object, bool rearm); - -int be_mcc_add_async_event_callback(struct be_mcc_object *mcc_object, -		mcc_async_event_callback cb, void *cb_context); - -int be_pci_soft_reset(struct be_function_object *pfob); - - -int be_drive_POST(struct be_function_object *pfob); - - -int be_eth_sq_create(struct be_function_object *pfob, -		struct ring_desc *rd, u32 length_in_bytes, -		u32 type, u32 ulp, struct be_cq_object *cq_object, -		struct be_ethsq_object *eth_sq); - -struct be_eth_sq_parameters { -	u32 port; -	u32 rsvd0[2]; -} ; - -int be_eth_sq_create_ex(struct be_function_object *pfob, -		    struct ring_desc *rd, u32 length_in_bytes, -		    u32 type, u32 ulp, struct be_cq_object *cq_object, -		    struct be_eth_sq_parameters *ex_parameters, -		    struct be_ethsq_object *eth_sq); -int be_eth_sq_destroy(struct be_ethsq_object *eth_sq); - -int be_eth_set_flow_control(struct be_function_object *pfob, -			bool txfc_enable, bool rxfc_enable); - -int be_eth_get_flow_control(struct be_function_object *pfob, -			bool *txfc_enable, bool *rxfc_enable); -int be_eth_set_qos(struct be_function_object *pfob, u32 max_bps, u32 max_pps); - -int be_eth_get_qos(struct be_function_object *pfob, u32 *max_bps, u32 *max_pps); - -int be_eth_set_frame_size(struct be_function_object *pfob, -		      u32 *tx_frame_size, u32 *rx_frame_size); - -int be_eth_rq_create(struct be_function_object *pfob, -		 struct ring_desc *rd, struct be_cq_object *cq_object, -		 struct be_cq_object *bcmc_cq_object, -		 struct be_ethrq_object *eth_rq); - -int be_eth_rq_destroy(struct be_ethrq_object *eth_rq); - -int be_eth_rq_destroy_options(struct be_ethrq_object *eth_rq, bool flush, -		mcc_wrb_cqe_callback cb, void *cb_context); -int be_eth_rq_set_frag_size(struct be_function_object *pfob, -		u32 new_frag_size_bytes, u32 *actual_frag_size_bytes); -int be_eth_rq_get_frag_size(struct be_function_object *pfob, -						u32 *frag_size_bytes); - -void *be_function_prepare_embedded_fwcmd(struct be_function_object *pfob, -		   struct MCC_WRB_AMAP *wrb, -		   u32 payload_length, u32 request_length, -		   u32 response_length, u32 opcode, u32 subsystem); -void *be_function_prepare_nonembedded_fwcmd(struct be_function_object *pfob, -	struct MCC_WRB_AMAP *wrb, void *fwcmd_header_va, u64 fwcmd_header_pa, -	u32 payload_length, u32 request_length, u32 response_length, -	u32 opcode, u32 subsystem); - - -struct MCC_WRB_AMAP * -be_function_peek_mcc_wrb(struct be_function_object *pfob); - -int be_rxf_mac_address_read_write(struct be_function_object *pfob, -	      bool port1, bool mac1, bool mgmt, -	      bool write, bool permanent, u8 *mac_address, -	      mcc_wrb_cqe_callback cb, -	      void *cb_context); - -int be_rxf_multicast_config(struct be_function_object *pfob, -			bool promiscuous, u32 num, u8 *mac_table, -			mcc_wrb_cqe_callback cb, -			void *cb_context, -			struct be_multicast_q_ctxt *q_ctxt); - -int be_rxf_vlan_config(struct be_function_object *pfob, -	   bool promiscuous, u32 num, u16 *vlan_tag_array, -	   mcc_wrb_cqe_callback cb, void *cb_context, -	   struct be_vlan_q_ctxt *q_ctxt); - - -int be_rxf_link_status(struct be_function_object *pfob, -		   struct BE_LINK_STATUS *link_status, -		   mcc_wrb_cqe_callback cb, -		   void *cb_context, -		   struct be_link_status_q_ctxt *q_ctxt); - - -int be_rxf_query_eth_statistics(struct be_function_object *pfob, -		struct FWCMD_ETH_GET_STATISTICS *va_for_fwcmd, -		u64 pa_for_fwcmd, mcc_wrb_cqe_callback cb, -		void *cb_context, -		struct be_nonembedded_q_ctxt *q_ctxt); - -int be_rxf_promiscuous(struct be_function_object *pfob, -		   bool enable_port0, bool enable_port1, -		   mcc_wrb_cqe_callback cb, void *cb_context, -		   struct be_promiscuous_q_ctxt *q_ctxt); - - -int be_rxf_filter_config(struct be_function_object *pfob, -		     struct NTWK_RX_FILTER_SETTINGS *settings, -		     mcc_wrb_cqe_callback cb, -		     void *cb_context, -		     struct be_rxf_filter_q_ctxt *q_ctxt); - -/* - * ------------------------------------------------------ - *  internal functions used by hwlib - * ------------------------------------------------------ - */ - - -int be_function_ring_destroy(struct be_function_object *pfob, -		       u32 id, u32 ring_type, mcc_wrb_cqe_callback cb, -		       void *cb_context, -		       mcc_wrb_cqe_callback internal_cb, -		       void *internal_callback_context); - -int be_function_post_mcc_wrb(struct be_function_object *pfob, -		struct MCC_WRB_AMAP *wrb, -		struct be_generic_q_ctxt *q_ctxt, -		mcc_wrb_cqe_callback cb, void *cb_context, -		mcc_wrb_cqe_callback internal_cb, -		void *internal_cb_context, void *optional_fwcmd_va, -		struct be_mcc_wrb_response_copy *response_copy); - -int be_function_queue_mcc_wrb(struct be_function_object *pfob, -			  struct be_generic_q_ctxt *q_ctxt); - -/* - * ------------------------------------------------------ - *  MCC QUEUE - * ------------------------------------------------------ - */ - -int be_mpu_init_mailbox(struct be_function_object *pfob, struct ring_desc *rd); - - -struct MCC_WRB_AMAP * -_be_mpu_peek_ring_wrb(struct be_mcc_object *mcc, bool driving_queue); - -struct be_mcc_wrb_context * -_be_mcc_allocate_wrb_context(struct be_function_object *pfob); - -void _be_mcc_free_wrb_context(struct be_function_object *pfob, -			 struct be_mcc_wrb_context *context); - -int _be_mpu_post_wrb_mailbox(struct be_function_object *pfob, -	 struct MCC_WRB_AMAP *wrb, struct be_mcc_wrb_context *wrb_context); - -int _be_mpu_post_wrb_ring(struct be_mcc_object *mcc, -	struct MCC_WRB_AMAP *wrb, struct be_mcc_wrb_context *wrb_context); - -void be_drive_mcc_wrb_queue(struct be_mcc_object *mcc); - - -/* - * ------------------------------------------------------ - *  Ring Sizes - * ------------------------------------------------------ - */ -static inline u32 be_ring_encoding_to_length(u32 encoding, u32 object_size) -{ - -	ASSERT(encoding != 1);	/* 1 is rsvd */ -	ASSERT(encoding < 16); -	ASSERT(object_size > 0); - -	if (encoding == 0)	/* 32k deep */ -		encoding = 16; - -	return (1 << (encoding - 1)) * object_size; -} - -static inline -u32 be_ring_length_to_encoding(u32 length_in_bytes, u32 object_size) -{ - -	u32 count, encoding; - -	ASSERT(object_size > 0); -	ASSERT(length_in_bytes % object_size == 0); - -	count = length_in_bytes / object_size; - -	ASSERT(count > 1); -	ASSERT(count <= 32 * 1024); -	ASSERT(length_in_bytes <= 8 * PAGE_SIZE); /* max ring size in UT */ - -	encoding = __ilog2_u32(count) + 1; - -	if (encoding == 16) -		encoding = 0;	/* 32k deep */ - -	return encoding; -} - -void be_rd_to_pa_list(struct ring_desc *rd, struct PHYS_ADDR *pa_list, -						u32 max_num); -#endif /* __hwlib_h__ */ diff --git a/drivers/staging/benet/mpu.c b/drivers/staging/benet/mpu.c deleted file mode 100644 index 269cc11d305..00000000000 --- a/drivers/staging/benet/mpu.c +++ /dev/null @@ -1,1364 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -#include <linux/delay.h> -#include "hwlib.h" -#include "bestatus.h" - -static -inline void mp_ring_create(struct mp_ring *ring, u32 num, u32 size, void *va) -{ -	ASSERT(ring); -	memset(ring, 0, sizeof(struct mp_ring)); -	ring->num = num; -	ring->pages = DIV_ROUND_UP(num * size, PAGE_SIZE); -	ring->itemSize = size; -	ring->va = va; -} - -/* - * ----------------------------------------------------------------------- - * Interface for 2 index rings. i.e. consumer/producer rings - * -------------------------------------------------------------------------- - */ - -/* Returns number items pending on ring. */ -static inline u32 mp_ring_num_pending(struct mp_ring *ring) -{ -	ASSERT(ring); -	if (ring->num == 0) -		return 0; -	return be_subc(ring->pidx, ring->cidx, ring->num); -} - -/* Returns number items free on ring. */ -static inline u32 mp_ring_num_empty(struct mp_ring *ring) -{ -	ASSERT(ring); -	return ring->num - 1 - mp_ring_num_pending(ring); -} - -/* Consume 1 item */ -static inline void mp_ring_consume(struct mp_ring *ring) -{ -	ASSERT(ring); -	ASSERT(ring->pidx != ring->cidx); - -	ring->cidx = be_addc(ring->cidx, 1, ring->num); -} - -/* Produce 1 item */ -static inline void mp_ring_produce(struct mp_ring *ring) -{ -	ASSERT(ring); -	ring->pidx = be_addc(ring->pidx, 1, ring->num); -} - -/* Consume count items */ -static inline void mp_ring_consume_multiple(struct mp_ring *ring, u32 count) -{ -	ASSERT(ring); -	ASSERT(mp_ring_num_pending(ring) >= count); -	ring->cidx = be_addc(ring->cidx, count, ring->num); -} - -static inline void *mp_ring_item(struct mp_ring *ring, u32 index) -{ -	ASSERT(ring); -	ASSERT(index < ring->num); -	ASSERT(ring->itemSize > 0); -	return (u8 *) ring->va + index * ring->itemSize; -} - -/* Ptr to produce item */ -static inline void *mp_ring_producer_ptr(struct mp_ring *ring) -{ -	ASSERT(ring); -	return mp_ring_item(ring, ring->pidx); -} - -/* - * Returns a pointer to the current location in the ring. - * This is used for rings with 1 index. - */ -static inline void *mp_ring_current(struct mp_ring *ring) -{ -	ASSERT(ring); -	ASSERT(ring->pidx == 0);	/* not used */ - -	return mp_ring_item(ring, ring->cidx); -} - -/* - * Increment index for rings with only 1 index. - * This is used for rings with 1 index. - */ -static inline void *mp_ring_next(struct mp_ring *ring) -{ -	ASSERT(ring); -	ASSERT(ring->num > 0); -	ASSERT(ring->pidx == 0);	/* not used */ - -	ring->cidx = be_addc(ring->cidx, 1, ring->num); -	return mp_ring_current(ring); -} - -/* -    This routine waits for a previously posted mailbox WRB to be completed. -    Specifically it waits for the mailbox to say that it's ready to accept -    more data by setting the LSB of the mailbox pd register to 1. - -    pcontroller      - The function object to post this data to - -    IRQL < DISPATCH_LEVEL -*/ -static void be_mcc_mailbox_wait(struct be_function_object *pfob) -{ -	struct MPU_MAILBOX_DB_AMAP mailbox_db; -	u32 i = 0; -	u32 ready; - -	if (pfob->emulate) { -		/* No waiting for mailbox in emulated mode. */ -		return; -	} - -	mailbox_db.dw[0] = PD_READ(pfob, mcc_bootstrap_db); -	ready = AMAP_GET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db); - -	while (ready == false) { -		if ((++i & 0x3FFFF) == 0) { -			TRACE(DL_WARN, "Waiting for mailbox ready - %dk polls", -								i / 1000); -		} -		udelay(1); -		mailbox_db.dw[0] = PD_READ(pfob, mcc_bootstrap_db); -		ready = AMAP_GET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db); -	} -} - -/* -    This routine tells the MCC mailbox that there is data to processed -    in the mailbox. It does this by setting the physical address for the -    mailbox location and clearing the LSB.  This routine returns immediately -    and does not wait for the WRB to be processed. - -    pcontroller      - The function object to post this data to - -    IRQL < DISPATCH_LEVEL - -*/ -static void be_mcc_mailbox_notify(struct be_function_object *pfob) -{ -	struct MPU_MAILBOX_DB_AMAP mailbox_db; -	u32 pa; - -	ASSERT(pfob->mailbox.pa); -	ASSERT(pfob->mailbox.va); - -	/* If emulated, do not ring the mailbox */ -	if (pfob->emulate) { -		TRACE(DL_WARN, "MPU disabled. Skipping mailbox notify."); -		return; -	} - -	/* form the higher bits in the address */ -	mailbox_db.dw[0] = 0;	/* init */ -	AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, hi, &mailbox_db, 1); -	AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db, 0); - -	/* bits 34 to 63 */ -	pa = (u32) (pfob->mailbox.pa >> 34); -	AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, address, &mailbox_db, pa); - -	/* Wait for the MPU to be ready */ -	be_mcc_mailbox_wait(pfob); - -	/* Ring doorbell 1st time */ -	PD_WRITE(pfob, mcc_bootstrap_db, mailbox_db.dw[0]); - -	/* Wait for 1st write to be acknowledged. */ -	be_mcc_mailbox_wait(pfob); - -	/* lower bits 30 bits from 4th bit (bits 4 to 33)*/ -	pa = (u32) (pfob->mailbox.pa >> 4) & 0x3FFFFFFF; - -	AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, hi, &mailbox_db, 0); -	AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, ready, &mailbox_db, 0); -	AMAP_SET_BITS_PTR(MPU_MAILBOX_DB, address, &mailbox_db, pa); - -	/* Ring doorbell 2nd time */ -	PD_WRITE(pfob, mcc_bootstrap_db, mailbox_db.dw[0]); -} - -/* -    This routine tells the MCC mailbox that there is data to processed -    in the mailbox. It does this by setting the physical address for the -    mailbox location and clearing the LSB.  This routine spins until the -    MPU writes a 1 into the LSB indicating that the data has been received -    and is ready to be processed. - -    pcontroller      - The function object to post this data to - -    IRQL < DISPATCH_LEVEL -*/ -static void -be_mcc_mailbox_notify_and_wait(struct be_function_object *pfob) -{ -	/* -	 * Notify it -	 */ -	be_mcc_mailbox_notify(pfob); -	/* -	 * Now wait for completion of WRB -	 */ -	be_mcc_mailbox_wait(pfob); -} - -void -be_mcc_process_cqe(struct be_function_object *pfob, -				struct MCC_CQ_ENTRY_AMAP *cqe) -{ -	struct be_mcc_wrb_context *wrb_context = NULL; -	u32 offset, status; -	u8 *p; - -	ASSERT(cqe); -	/* -	 * A command completed.  Commands complete out-of-order. -	 * Determine which command completed from the TAG. -	 */ -	offset = offsetof(struct BE_MCC_CQ_ENTRY_AMAP, mcc_tag)/8; -	p = (u8 *) cqe + offset; -	wrb_context = (struct be_mcc_wrb_context *)(void *)(size_t)(*(u64 *)p); -	ASSERT(wrb_context); - -	/* -	 * Perform a response copy if requested. -	 * Only copy data if the FWCMD is successful. -	 */ -	status = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, completion_status, cqe); -	if (status == MGMT_STATUS_SUCCESS && wrb_context->copy.length > 0) { -		ASSERT(wrb_context->wrb); -		ASSERT(wrb_context->copy.va); -		p = (u8 *)wrb_context->wrb + -				offsetof(struct BE_MCC_WRB_AMAP, payload)/8; -		memcpy(wrb_context->copy.va, -			  (u8 *)p + wrb_context->copy.fwcmd_offset, -			  wrb_context->copy.length); -	} - -	if (status) -		status = BE_NOT_OK; -	/* internal callback */ -	if (wrb_context->internal_cb) { -		wrb_context->internal_cb(wrb_context->internal_cb_context, -						status, wrb_context->wrb); -	} - -	/* callback */ -	if (wrb_context->cb) { -		wrb_context->cb(wrb_context->cb_context, -					      status, wrb_context->wrb); -	} -	/* Free the context structure */ -	_be_mcc_free_wrb_context(pfob, wrb_context); -} - -void be_drive_mcc_wrb_queue(struct be_mcc_object *mcc) -{ -	struct be_function_object *pfob = NULL; -	int status = BE_PENDING; -	struct be_generic_q_ctxt *q_ctxt; -	struct MCC_WRB_AMAP *wrb; -	struct MCC_WRB_AMAP *queue_wrb; -	u32 length, payload_length, sge_count, embedded; -	unsigned long irql; - -	BUILD_BUG_ON((sizeof(struct be_generic_q_ctxt) < -			  sizeof(struct be_queue_driver_context) + -					sizeof(struct MCC_WRB_AMAP))); -	pfob = mcc->parent_function; - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	if (mcc->driving_backlog) { -		spin_unlock_irqrestore(&pfob->post_lock, irql); -		if (pfob->pend_queue_driving && pfob->mcc) { -			pfob->pend_queue_driving = 0; -			be_drive_mcc_wrb_queue(pfob->mcc); -		} -		return; -	} -	/* Acquire the flag to limit 1 thread to redrive posts. */ -	mcc->driving_backlog = 1; - -	while (!list_empty(&mcc->backlog)) { -		wrb = _be_mpu_peek_ring_wrb(mcc, true);	/* Driving the queue */ -		if (!wrb) -			break;	/* No space in the ring yet. */ -		/* Get the next queued entry to process. */ -		q_ctxt = list_first_entry(&mcc->backlog, -				struct be_generic_q_ctxt, context.list); -		list_del(&q_ctxt->context.list); -		pfob->mcc->backlog_length--; -		/* -		 * Compute the required length of the WRB. -		 * Since the queue element may be smaller than -		 * the complete WRB, copy only the required number of bytes. -		 */ -		queue_wrb = (struct MCC_WRB_AMAP *) &q_ctxt->wrb_header; -		embedded = AMAP_GET_BITS_PTR(MCC_WRB, embedded, queue_wrb); -		if (embedded) { -			payload_length = AMAP_GET_BITS_PTR(MCC_WRB, -						payload_length, queue_wrb); -			length = sizeof(struct be_mcc_wrb_header) + -								payload_length; -		} else { -			sge_count = AMAP_GET_BITS_PTR(MCC_WRB, sge_count, -								queue_wrb); -			ASSERT(sge_count == 1); /* only 1 frag. */ -			length = sizeof(struct be_mcc_wrb_header) + -			    sge_count * sizeof(struct MCC_SGE_AMAP); -		} - -		/* -		 * Truncate the length based on the size of the -		 * queue element.  Some elements that have output parameters -		 * can be smaller than the payload_length field would -		 * indicate.  We really only need to copy the request -		 * parameters, not the response. -		 */ -		length = min(length, (u32) (q_ctxt->context.bytes - -			offsetof(struct be_generic_q_ctxt, wrb_header))); - -		/* Copy the queue element WRB into the ring. */ -		memcpy(wrb, &q_ctxt->wrb_header, length); - -		/* Post the wrb.  This should not fail assuming we have -		 * enough context structs. */ -		status = be_function_post_mcc_wrb(pfob, wrb, NULL, -			   q_ctxt->context.cb, q_ctxt->context.cb_context, -			   q_ctxt->context.internal_cb, -			   q_ctxt->context.internal_cb_context, -			   q_ctxt->context.optional_fwcmd_va, -			   &q_ctxt->context.copy); - -		if (status == BE_SUCCESS) { -			/* -			 * Synchronous completion. Since it was queued, -			 * we will invoke the callback. -			 * To the user, this is an asynchronous request. -			 */ -			spin_unlock_irqrestore(&pfob->post_lock, irql); -			if (pfob->pend_queue_driving && pfob->mcc) { -				pfob->pend_queue_driving = 0; -				be_drive_mcc_wrb_queue(pfob->mcc); -			} - -			ASSERT(q_ctxt->context.cb); - -			q_ctxt->context.cb( -				q_ctxt->context.cb_context, -						BE_SUCCESS, NULL); - -			spin_lock_irqsave(&pfob->post_lock, irql); - -		} else if (status != BE_PENDING) { -			/* -			 * Another resource failed.  Should never happen -			 * if we have sufficient MCC_WRB_CONTEXT structs. -			 * Return to head of the queue. -			 */ -			TRACE(DL_WARN, "Failed to post a queued WRB. 0x%x", -			      status); -			list_add(&q_ctxt->context.list, &mcc->backlog); -			pfob->mcc->backlog_length++; -			break; -		} -	} - -	/* Free the flag to limit 1 thread to redrive posts. */ -	mcc->driving_backlog = 0; -	spin_unlock_irqrestore(&pfob->post_lock, irql); -} - -/* This function asserts that the WRB was consumed in order. */ -#ifdef BE_DEBUG -u32 be_mcc_wrb_consumed_in_order(struct be_mcc_object *mcc, -					struct MCC_CQ_ENTRY_AMAP *cqe) -{ -	struct be_mcc_wrb_context *wrb_context = NULL; -	u32 wrb_index; -	u32 wrb_consumed_in_order; -	u32 offset; -	u8 *p; - -	ASSERT(cqe); -	/* -	 * A command completed.  Commands complete out-of-order. -	 * Determine which command completed from the TAG. -	 */ -	offset = offsetof(struct BE_MCC_CQ_ENTRY_AMAP, mcc_tag)/8; -	p = (u8 *) cqe + offset; -	wrb_context = (struct be_mcc_wrb_context *)(void *)(size_t)(*(u64 *)p); - -	ASSERT(wrb_context); - -	wrb_index = (u32) (((u64)(size_t)wrb_context->ring_wrb - -		(u64)(size_t)mcc->sq.ring.va) / sizeof(struct MCC_WRB_AMAP)); - -	ASSERT(wrb_index < mcc->sq.ring.num); - -	wrb_consumed_in_order = (u32) (wrb_index == mcc->consumed_index); -	mcc->consumed_index = be_addc(mcc->consumed_index, 1, mcc->sq.ring.num); -	return wrb_consumed_in_order; -} -#endif - -int be_mcc_process_cq(struct be_mcc_object *mcc, bool rearm) -{ -	struct be_function_object *pfob = NULL; -	struct MCC_CQ_ENTRY_AMAP *cqe; -	struct CQ_DB_AMAP db; -	struct mp_ring *cq_ring = &mcc->cq.ring; -	struct mp_ring *mp_ring = &mcc->sq.ring; -	u32 num_processed = 0; -	u32 consumed = 0, valid, completed, cqe_consumed, async_event; - -	pfob = mcc->parent_function; - -	spin_lock_irqsave(&pfob->cq_lock, pfob->cq_irq); - -	/* -	 * Verify that only one thread is processing the CQ at once. -	 * We cannot hold the lock while processing the CQ due to -	 * the callbacks into the OS.  Therefore, this flag is used -	 * to control it.  If any of the threads want to -	 * rearm the CQ, we need to honor that. -	 */ -	if (mcc->processing != 0) { -		mcc->rearm = mcc->rearm || rearm; -		goto Error; -	} else { -		mcc->processing = 1;	/* lock processing for this thread. */ -		mcc->rearm = rearm;	/* set our rearm setting */ -	} - -	spin_unlock_irqrestore(&pfob->cq_lock, pfob->cq_irq); - -	cqe = mp_ring_current(cq_ring); -	valid = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, valid, cqe); -	while (valid) { - -		if (num_processed >= 8) { -			/* coalesce doorbells, but free space in cq -			 * ring while processing. */ -			db.dw[0] = 0;	/* clear */ -			AMAP_SET_BITS_PTR(CQ_DB, qid, &db, cq_ring->id); -			AMAP_SET_BITS_PTR(CQ_DB, rearm, &db, false); -			AMAP_SET_BITS_PTR(CQ_DB, event, &db, false); -			AMAP_SET_BITS_PTR(CQ_DB, num_popped, &db, -							num_processed); -			num_processed = 0; - -			PD_WRITE(pfob, cq_db, db.dw[0]); -		} - -		async_event = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, async_event, cqe); -		if (async_event) { -			/* This is an asynchronous event. */ -			struct ASYNC_EVENT_TRAILER_AMAP *async_trailer = -			    (struct ASYNC_EVENT_TRAILER_AMAP *) -			    ((u8 *) cqe + sizeof(struct MCC_CQ_ENTRY_AMAP) - -			     sizeof(struct ASYNC_EVENT_TRAILER_AMAP)); -			u32 event_code; -			async_event = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER, -						async_event, async_trailer); -			ASSERT(async_event == 1); - - -			valid = AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER, -						valid, async_trailer); -			ASSERT(valid == 1); - -			/* Call the async event handler if it is installed. */ -			if (mcc->async_cb) { -				event_code = -					AMAP_GET_BITS_PTR(ASYNC_EVENT_TRAILER, -						event_code, async_trailer); -				mcc->async_cb(mcc->async_context, -					    (u32) event_code, (void *) cqe); -			} - -		} else { -			/* This is a completion entry. */ - -			/* No vm forwarding in this driver. */ - -			cqe_consumed = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, -						consumed, cqe); -			if (cqe_consumed) { -				/* -				 * A command on the MCC ring was consumed. -				 * Update the consumer index. -				 * These occur in order. -				 */ -				ASSERT(be_mcc_wrb_consumed_in_order(mcc, cqe)); -				consumed++; -			} - -			completed = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, -					completed, cqe); -			if (completed) { -				/* A command completed.  Use tag to -				 * determine which command.  */ -				be_mcc_process_cqe(pfob, cqe); -			} -		} - -		/* Reset the CQE */ -		AMAP_SET_BITS_PTR(MCC_CQ_ENTRY, valid, cqe, false); -		num_processed++; - -		/* Update our tracking for the CQ ring. */ -		cqe = mp_ring_next(cq_ring); -		valid = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, valid, cqe); -	} - -	TRACE(DL_INFO, "num_processed:0x%x, and consumed:0x%x", -	      num_processed, consumed); -	/* -	 * Grab the CQ lock to synchronize the "rearm" setting for -	 * the doorbell, and for clearing the "processing" flag. -	 */ -	spin_lock_irqsave(&pfob->cq_lock, pfob->cq_irq); - -	/* -	 * Rearm the cq.  This is done based on the global mcc->rearm -	 * flag which combines the rearm parameter from the current -	 * call to process_cq and any other threads -	 * that tried to process the CQ while this one was active. -	 * This handles the situation where a sync. fwcmd was processing -	 * the CQ while the interrupt/dpc tries to process it. -	 * The sync process gets to continue -- but it is now -	 * responsible for the rearming. -	 */ -	if (num_processed > 0 || mcc->rearm == true) { -		db.dw[0] = 0;	/* clear */ -		AMAP_SET_BITS_PTR(CQ_DB, qid, &db, cq_ring->id); -		AMAP_SET_BITS_PTR(CQ_DB, rearm, &db, mcc->rearm); -		AMAP_SET_BITS_PTR(CQ_DB, event, &db, false); -		AMAP_SET_BITS_PTR(CQ_DB, num_popped, &db, num_processed); - -		PD_WRITE(pfob, cq_db, db.dw[0]); -	} -	/* -	 * Update the consumer index after ringing the CQ doorbell. -	 * We don't want another thread to post more WRBs before we -	 * have CQ space available. -	 */ -	mp_ring_consume_multiple(mp_ring, consumed); - -	/* Clear the processing flag. */ -	mcc->processing = 0; - -Error: -	spin_unlock_irqrestore(&pfob->cq_lock, pfob->cq_irq); -	/* -	 * Use the local variable to detect if the current thread -	 * holds the WRB post lock.  If rearm is false, this is -	 * either a synchronous command, or the upper layer driver is polling -	 * from a thread.  We do not drive the queue from that -	 * context since the driver may hold the -	 * wrb post lock already. -	 */ -	if (rearm) -		be_drive_mcc_wrb_queue(mcc); -	else -		pfob->pend_queue_driving = 1; - -	return BE_SUCCESS; -} - -/* - *============================================================================ - *                  P U B L I C  R O U T I N E S - *============================================================================ - */ - -/* -    This routine creates an MCC object.  This object contains an MCC send queue -    and a CQ private to the MCC. - -    pcontroller      - Handle to a function object - -    EqObject            - EQ object that will be used to dispatch this MCC - -    ppMccObject         - Pointer to an internal Mcc Object returned. - -    Returns BE_SUCCESS if successfull,, otherwise a useful error code -	is returned. - -    IRQL < DISPATCH_LEVEL - -*/ -int -be_mcc_ring_create(struct be_function_object *pfob, -		   struct ring_desc *rd, u32 length, -		   struct be_mcc_wrb_context *context_array, -		   u32 num_context_entries, -		   struct be_cq_object *cq, struct be_mcc_object *mcc) -{ -	int status = 0; - -	struct FWCMD_COMMON_MCC_CREATE *fwcmd = NULL; -	struct MCC_WRB_AMAP *wrb = NULL; -	u32 num_entries_encoded, n, i; -	void *va = NULL; -	unsigned long irql; - -	if (length < sizeof(struct MCC_WRB_AMAP) * 2) { -		TRACE(DL_ERR, "Invalid MCC ring length:%d", length); -		return BE_NOT_OK; -	} -	/* -	 * Reduce the actual ring size to be less than the number -	 * of context entries.  This ensures that we run out of -	 * ring WRBs first so the queuing works correctly.  We never -	 * queue based on context structs. -	 */ -	if (num_context_entries + 1 < -			length / sizeof(struct MCC_WRB_AMAP) - 1) { - -		u32 max_length = -		    (num_context_entries + 2) * sizeof(struct MCC_WRB_AMAP); - -		if (is_power_of_2(max_length)) -			length = __roundup_pow_of_two(max_length+1) / 2; -		else -			length = __roundup_pow_of_two(max_length) / 2; - -		ASSERT(length <= max_length); - -		TRACE(DL_WARN, -			"MCC ring length reduced based on context entries." -			" length:%d wrbs:%d context_entries:%d", length, -			(int) (length / sizeof(struct MCC_WRB_AMAP)), -			num_context_entries); -	} - -	spin_lock_irqsave(&pfob->post_lock, irql); - -	num_entries_encoded = -	    be_ring_length_to_encoding(length, sizeof(struct MCC_WRB_AMAP)); - -	/* Init MCC object. */ -	memset(mcc, 0, sizeof(*mcc)); -	mcc->parent_function = pfob; -	mcc->cq_object = cq; - -	INIT_LIST_HEAD(&mcc->backlog); - -	wrb = be_function_peek_mcc_wrb(pfob); -	if (!wrb) { -		ASSERT(wrb); -		TRACE(DL_ERR, "No free MCC WRBs in create EQ."); -		status = BE_STATUS_NO_MCC_WRB; -		goto error; -	} -	/* Prepares an embedded fwcmd, including request/response sizes. */ -	fwcmd = BE_PREPARE_EMBEDDED_FWCMD(pfob, wrb, COMMON_MCC_CREATE); - -	fwcmd->params.request.num_pages = DIV_ROUND_UP(length, PAGE_SIZE); -	/* -	 * Program MCC ring context -	 */ -	AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, pdid, -			&fwcmd->params.request.context, 0); -	AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, invalid, -			&fwcmd->params.request.context, false); -	AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, ring_size, -			&fwcmd->params.request.context, num_entries_encoded); - -	n = cq->cq_id; -	AMAP_SET_BITS_PTR(MCC_RING_CONTEXT, -				cq_id, &fwcmd->params.request.context, n); -	be_rd_to_pa_list(rd, fwcmd->params.request.pages, -				ARRAY_SIZE(fwcmd->params.request.pages)); -	/* Post the f/w command */ -	status = be_function_post_mcc_wrb(pfob, wrb, NULL, NULL, NULL, -						NULL, NULL, fwcmd, NULL); -	if (status != BE_SUCCESS) { -		TRACE(DL_ERR, "MCC to create CQ failed."); -		goto error; -	} -	/* -	 * Create a linked list of context structures -	 */ -	mcc->wrb_context.base = context_array; -	mcc->wrb_context.num = num_context_entries; -	INIT_LIST_HEAD(&mcc->wrb_context.list_head); -	memset(context_array, 0, -		    sizeof(struct be_mcc_wrb_context) * num_context_entries); -	for (i = 0; i < mcc->wrb_context.num; i++) { -		list_add_tail(&context_array[i].next, -					&mcc->wrb_context.list_head); -	} - -	/* -	 * -	 * Create an mcc_ring for tracking WRB hw ring -	 */ -	va = rd->va; -	ASSERT(va); -	mp_ring_create(&mcc->sq.ring, length / sizeof(struct MCC_WRB_AMAP), -				sizeof(struct MCC_WRB_AMAP), va); -	mcc->sq.ring.id = fwcmd->params.response.id; -	/* -	 * Init a mcc_ring for tracking the MCC CQ. -	 */ -	ASSERT(cq->va); -	mp_ring_create(&mcc->cq.ring, cq->num_entries, -		       sizeof(struct MCC_CQ_ENTRY_AMAP), cq->va); -	mcc->cq.ring.id = cq->cq_id; - -	/* Force zeroing of CQ. */ -	memset(cq->va, 0, cq->num_entries * sizeof(struct MCC_CQ_ENTRY_AMAP)); - -	/* Initialize debug index. */ -	mcc->consumed_index = 0; - -	atomic_inc(&cq->ref_count); -	pfob->mcc = mcc; - -	TRACE(DL_INFO, "MCC ring created. id:%d bytes:%d cq_id:%d cq_entries:%d" -	      " num_context:%d", mcc->sq.ring.id, length, -	      cq->cq_id, cq->num_entries, num_context_entries); - -error: -	spin_unlock_irqrestore(&pfob->post_lock, irql); -	if (pfob->pend_queue_driving && pfob->mcc) { -		pfob->pend_queue_driving = 0; -		be_drive_mcc_wrb_queue(pfob->mcc); -	} -	return status; -} - -/* -    This routine destroys an MCC send queue - -    MccObject         - Internal Mcc Object to be destroyed. - -    Returns BE_SUCCESS if successfull, otherwise an error code is returned. - -    IRQL < DISPATCH_LEVEL - -    The caller of this routine must ensure that no other WRB may be posted -    until this routine returns. - -*/ -int be_mcc_ring_destroy(struct be_mcc_object *mcc) -{ -	int status = 0; -	struct be_function_object *pfob = mcc->parent_function; - - -	ASSERT(mcc->processing == 0); - -	/* -	 * Remove the ring from the function object. -	 * This transitions back to mailbox mode. -	 */ -	pfob->mcc = NULL; - -	/* Send fwcmd to destroy the queue.  (Using the mailbox.) */ -	status = be_function_ring_destroy(mcc->parent_function, mcc->sq.ring.id, -			     FWCMD_RING_TYPE_MCC, NULL, NULL, NULL, NULL); -	ASSERT(status == 0); - -	/* Release the SQ reference to the CQ */ -	atomic_dec(&mcc->cq_object->ref_count); - -	return status; -} - -static void -mcc_wrb_sync_cb(void *context, int staus, struct MCC_WRB_AMAP *wrb) -{ -	struct be_mcc_wrb_context *wrb_context = -				(struct be_mcc_wrb_context *) context; -	ASSERT(wrb_context); -	*wrb_context->users_final_status = staus; -} - -/* -    This routine posts a command to the MCC send queue - -    mcc       - Internal Mcc Object to be destroyed. - -    wrb             - wrb to post. - -    Returns BE_SUCCESS if successfull, otherwise an error code is returned. - -    IRQL < DISPATCH_LEVEL if CompletionCallback is not NULL -    IRQL <=DISPATCH_LEVEL if CompletionCallback is  NULL - -    If this routine is called with CompletionCallback != NULL the -    call is considered to be asynchronous and will return as soon -    as the WRB is posted to the MCC with BE_PENDING. - -    If CompletionCallback is NULL, then this routine will not return until -    a completion for this MCC command has been processed. -    If called at DISPATCH_LEVEL the CompletionCallback must be NULL. - -    This routine should only be called if the MPU has been boostraped past -    mailbox mode. - - -*/ -int -_be_mpu_post_wrb_ring(struct be_mcc_object *mcc, struct MCC_WRB_AMAP *wrb, -				struct be_mcc_wrb_context *wrb_context) -{ - -	struct MCC_WRB_AMAP *ring_wrb = NULL; -	int status = BE_PENDING; -	int final_status = BE_PENDING; -	mcc_wrb_cqe_callback cb = NULL; -	struct MCC_DB_AMAP mcc_db; -	u32 embedded; - -	ASSERT(mp_ring_num_empty(&mcc->sq.ring) > 0); -	/* -	 * Input wrb is most likely the next wrb in the ring, since the client -	 * can peek at the address. -	 */ -	ring_wrb = mp_ring_producer_ptr(&mcc->sq.ring); -	if (wrb != ring_wrb) { -		/* If not equal, copy it into the ring. */ -		memcpy(ring_wrb, wrb, sizeof(struct MCC_WRB_AMAP)); -	} -#ifdef BE_DEBUG -	wrb_context->ring_wrb = ring_wrb; -#endif -	embedded = AMAP_GET_BITS_PTR(MCC_WRB, embedded, ring_wrb); -	if (embedded) { -		/* embedded commands will have the response within the WRB. */ -		wrb_context->wrb = ring_wrb; -	} else { -		/* -		 * non-embedded commands will not have the response -		 * within the WRB, and they may complete out-of-order. -		 * The WRB will not be valid to inspect -		 * during the completion. -		 */ -		wrb_context->wrb = NULL; -	} -	cb = wrb_context->cb; - -	if (cb == NULL) { -		/* Assign our internal callback if this is a -		 * synchronous call. */ -		wrb_context->cb = mcc_wrb_sync_cb; -		wrb_context->cb_context = wrb_context; -		wrb_context->users_final_status = &final_status; -	} -	/* Increment producer index */ - -	mcc_db.dw[0] = 0;		/* initialize */ -	AMAP_SET_BITS_PTR(MCC_DB, rid, &mcc_db, mcc->sq.ring.id); -	AMAP_SET_BITS_PTR(MCC_DB, numPosted, &mcc_db, 1); - -	mp_ring_produce(&mcc->sq.ring); -	PD_WRITE(mcc->parent_function, mpu_mcc_db, mcc_db.dw[0]); -	TRACE(DL_INFO, "pidx: %x and cidx: %x.", mcc->sq.ring.pidx, -	      mcc->sq.ring.cidx); - -	if (cb == NULL) { -		int polls = 0;	/* At >= 1 us per poll   */ -		/* Wait until this command completes, polling the CQ. */ -		do { -			TRACE(DL_INFO, "FWCMD submitted in the poll mode."); -			/* Do not rearm CQ in this context. */ -			be_mcc_process_cq(mcc, false); - -			if (final_status == BE_PENDING) { -				if ((++polls & 0x7FFFF) == 0) { -					TRACE(DL_WARN, -					      "Warning : polling MCC CQ for %d" -					      "ms.", polls / 1000); -				} - -				udelay(1); -			} - -			/* final_status changed when the command completes */ -		} while (final_status == BE_PENDING); - -		status = final_status; -	} - -	return status; -} - -struct MCC_WRB_AMAP * -_be_mpu_peek_ring_wrb(struct be_mcc_object *mcc, bool driving_queue) -{ -	/* If we have queued items, do not allow a post to bypass the queue. */ -	if (!driving_queue && !list_empty(&mcc->backlog)) -		return NULL; - -	if (mp_ring_num_empty(&mcc->sq.ring) <= 0) -		return NULL; -	return (struct MCC_WRB_AMAP *) mp_ring_producer_ptr(&mcc->sq.ring); -} - -int -be_mpu_init_mailbox(struct be_function_object *pfob, struct ring_desc *mailbox) -{ -	ASSERT(mailbox); -	pfob->mailbox.va = mailbox->va; -	pfob->mailbox.pa =  cpu_to_le64(mailbox->pa); -	pfob->mailbox.length = mailbox->length; - -	ASSERT(((u32)(size_t)pfob->mailbox.va & 0xf) == 0); -	ASSERT(((u32)(size_t)pfob->mailbox.pa & 0xf) == 0); -	/* -	 * Issue the WRB to set MPU endianness -	 */ -	{ -		u64 *endian_check = (u64 *) (pfob->mailbox.va + -				offsetof(struct BE_MCC_MAILBOX_AMAP, wrb)/8); -		*endian_check = 0xFF1234FFFF5678FFULL; -	} - -	be_mcc_mailbox_notify_and_wait(pfob); - -	return BE_SUCCESS; -} - - -/* -    This routine posts a command to the MCC mailbox. - -    FuncObj         - Function Object to post the WRB on behalf of. -    wrb             - wrb to post. -    CompletionCallback  - Address of a callback routine to invoke once the WRB -				is completed. -    CompletionCallbackContext - Opaque context to be passed during the call to -				the CompletionCallback. -    Returns BE_SUCCESS if successfull, otherwise an error code is returned. - -    IRQL <=DISPATCH_LEVEL if CompletionCallback is  NULL - -    This routine will block until a completion for this MCC command has been -    processed. If called at DISPATCH_LEVEL the CompletionCallback must be NULL. - -    This routine should only be called if the MPU has not been boostraped past -    mailbox mode. -*/ -int -_be_mpu_post_wrb_mailbox(struct be_function_object *pfob, -	 struct MCC_WRB_AMAP *wrb, struct be_mcc_wrb_context *wrb_context) -{ -	struct MCC_MAILBOX_AMAP *mailbox = NULL; -	struct MCC_WRB_AMAP *mb_wrb; -	struct MCC_CQ_ENTRY_AMAP *mb_cq; -	u32 offset, status; - -	ASSERT(pfob->mcc == NULL); -	mailbox = pfob->mailbox.va; -	ASSERT(mailbox); - -	offset = offsetof(struct BE_MCC_MAILBOX_AMAP, wrb)/8; -	mb_wrb = (struct MCC_WRB_AMAP *) (u8 *)mailbox + offset; -	if (mb_wrb != wrb) { -		memset(mailbox, 0, sizeof(*mailbox)); -		memcpy(mb_wrb, wrb, sizeof(struct MCC_WRB_AMAP)); -	} -	/* The callback can inspect the final WRB to get output parameters. */ -	wrb_context->wrb = mb_wrb; - -	be_mcc_mailbox_notify_and_wait(pfob); - -	/* A command completed.  Use tag to determine which command. */ -	offset = offsetof(struct BE_MCC_MAILBOX_AMAP, cq)/8; -	mb_cq = (struct MCC_CQ_ENTRY_AMAP *) ((u8 *)mailbox + offset); -	be_mcc_process_cqe(pfob, mb_cq); - -	status = AMAP_GET_BITS_PTR(MCC_CQ_ENTRY, completion_status, mb_cq); -	if (status) -		status = BE_NOT_OK; -	return status; -} - -struct be_mcc_wrb_context * -_be_mcc_allocate_wrb_context(struct be_function_object *pfob) -{ -	struct be_mcc_wrb_context *context = NULL; -	unsigned long irq; - -	spin_lock_irqsave(&pfob->mcc_context_lock, irq); - -	if (!pfob->mailbox.default_context_allocated) { -		/* Use the single default context that we -		 * always have allocated. */ -		pfob->mailbox.default_context_allocated = true; -		context = &pfob->mailbox.default_context; -	} else if (pfob->mcc) { -		/* Get a context from the free list. If any are available. */ -		if (!list_empty(&pfob->mcc->wrb_context.list_head)) { -			context = list_first_entry( -				&pfob->mcc->wrb_context.list_head, -					 struct be_mcc_wrb_context, next); -		} -	} - -	spin_unlock_irqrestore(&pfob->mcc_context_lock, irq); - -	return context; -} - -void -_be_mcc_free_wrb_context(struct be_function_object *pfob, -			 struct be_mcc_wrb_context *context) -{ -	unsigned long irq; - -	ASSERT(context); -	/* -	 * Zero during free to try and catch any bugs where the context -	 * is accessed after a free. -	 */ -	memset(context, 0, sizeof(context)); - -	spin_lock_irqsave(&pfob->mcc_context_lock, irq); - -	if (context == &pfob->mailbox.default_context) { -		/* Free the default context. */ -		ASSERT(pfob->mailbox.default_context_allocated); -		pfob->mailbox.default_context_allocated = false; -	} else { -		/* Add to free list. */ -		ASSERT(pfob->mcc); -		list_add_tail(&context->next, -				&pfob->mcc->wrb_context.list_head); -	} - -	spin_unlock_irqrestore(&pfob->mcc_context_lock, irq); -} - -int -be_mcc_add_async_event_callback(struct be_mcc_object *mcc_object, -		mcc_async_event_callback cb, void *cb_context) -{ -	/* Lock against anyone trying to change the callback/context pointers -	 * while being used. */ -	spin_lock_irqsave(&mcc_object->parent_function->cq_lock, -		mcc_object->parent_function->cq_irq); - -	/* Assign the async callback. */ -	mcc_object->async_context = cb_context; -	mcc_object->async_cb = cb; - -	spin_unlock_irqrestore(&mcc_object->parent_function->cq_lock, -					mcc_object->parent_function->cq_irq); - -	return BE_SUCCESS; -} - -#define MPU_EP_CONTROL 0 -#define MPU_EP_SEMAPHORE 0xac - -/* - *------------------------------------------------------------------- - * Function: be_wait_for_POST_complete - *   Waits until the BladeEngine POST completes (either in error or success). - * pfob - - * return status   - BE_SUCCESS (0) on success. Negative error code on failure. - *------------------------------------------------------------------- - */ -static int be_wait_for_POST_complete(struct be_function_object *pfob) -{ -	struct MGMT_HBA_POST_STATUS_STRUCT_AMAP status; -	int s; -	u32 post_error, post_stage; - -	const u32 us_per_loop = 1000;	/* 1000us */ -	const u32 print_frequency_loops = 1000000 / us_per_loop; -	const u32 max_loops = 60 * print_frequency_loops; -	u32 loops = 0; - -	/* -	 * Wait for arm fw indicating it is done or a fatal error happened. -	 * Note: POST can take some time to complete depending on configuration -	 * settings (consider ARM attempts to acquire an IP address -	 * over DHCP!!!). -	 * -	 */ -	do { -		status.dw[0] = ioread32(pfob->csr_va + MPU_EP_SEMAPHORE); -		post_error = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, -						error, &status); -		post_stage = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, -						stage, &status); -		if (0 == (loops % print_frequency_loops)) { -			/* Print current status */ -			TRACE(DL_INFO, "POST status = 0x%x (stage = 0x%x)", -				status.dw[0], post_stage); -		} -		udelay(us_per_loop); -	} while ((post_error != 1) && -		 (post_stage != POST_STAGE_ARMFW_READY) && -		 (++loops < max_loops)); - -	if (post_error == 1) { -		TRACE(DL_ERR, "POST error! Status = 0x%x (stage = 0x%x)", -		      status.dw[0], post_stage); -		s = BE_NOT_OK; -	} else if (post_stage != POST_STAGE_ARMFW_READY) { -		TRACE(DL_ERR, "POST time-out! Status = 0x%x (stage = 0x%x)", -		      status.dw[0], post_stage); -		s = BE_NOT_OK; -	} else { -		s = BE_SUCCESS; -	} -	return s; -} - -/* - *------------------------------------------------------------------- - * Function: be_kickoff_and_wait_for_POST - *   Interacts with the BladeEngine management processor to initiate POST, and - *   subsequently waits until POST completes (either in error or success). - *   The caller must acquire the reset semaphore before initiating POST - *   to prevent multiple drivers interacting with the management processor. - *   Once POST is complete the caller must release the reset semaphore. - *   Callers who only want to wait for POST complete may call - *   be_wait_for_POST_complete. - * pfob - - * return status   - BE_SUCCESS (0) on success. Negative error code on failure. - *------------------------------------------------------------------- - */ -static int -be_kickoff_and_wait_for_POST(struct be_function_object *pfob) -{ -	struct MGMT_HBA_POST_STATUS_STRUCT_AMAP status; -	int s; - -	const u32 us_per_loop = 1000;	/* 1000us */ -	const u32 print_frequency_loops = 1000000 / us_per_loop; -	const u32 max_loops = 5 * print_frequency_loops; -	u32 loops = 0; -	u32 post_error, post_stage; - -	/* Wait for arm fw awaiting host ready or a fatal error happened. */ -	TRACE(DL_INFO, "Wait for BladeEngine ready to POST"); -	do { -		status.dw[0] = ioread32(pfob->csr_va + MPU_EP_SEMAPHORE); -		post_error = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, -						error, &status); -		post_stage = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, -						stage, &status); -		if (0 == (loops % print_frequency_loops)) { -			/* Print current status */ -			TRACE(DL_INFO, "POST status = 0x%x (stage = 0x%x)", -			      status.dw[0], post_stage); -		} -		udelay(us_per_loop); -	} while ((post_error != 1) && -		 (post_stage < POST_STAGE_AWAITING_HOST_RDY) && -		 (++loops < max_loops)); - -	if (post_error == 1) { -		TRACE(DL_ERR, "Pre-POST error! Status = 0x%x (stage = 0x%x)", -		      status.dw[0], post_stage); -		s = BE_NOT_OK; -	} else if (post_stage == POST_STAGE_AWAITING_HOST_RDY) { -		iowrite32(POST_STAGE_HOST_RDY, pfob->csr_va + MPU_EP_SEMAPHORE); - -		/* Wait for POST to complete */ -		s = be_wait_for_POST_complete(pfob); -	} else { -		/* -		 * Either a timeout waiting for host ready signal or POST has -		 * moved ahead without requiring a host ready signal. -		 * Might as well give POST a chance to complete -		 * (or timeout again). -		 */ -		s = be_wait_for_POST_complete(pfob); -	} -	return s; -} - -/* - *------------------------------------------------------------------- - * Function: be_pci_soft_reset - *   This function is called to issue a BladeEngine soft reset. - *   Callers should acquire the soft reset semaphore before calling this - *   function. Additionaly, callers should ensure they cannot be pre-empted - *   while the routine executes. Upon completion of this routine, callers - *   should release the reset semaphore. This routine implicitly waits - *   for BladeEngine POST to complete. - * pfob - - * return status   - BE_SUCCESS (0) on success. Negative error code on failure. - *------------------------------------------------------------------- - */ -int be_pci_soft_reset(struct be_function_object *pfob) -{ -	struct PCICFG_SOFT_RESET_CSR_AMAP soft_reset; -	struct PCICFG_ONLINE0_CSR_AMAP pciOnline0; -	struct PCICFG_ONLINE1_CSR_AMAP pciOnline1; -	struct EP_CONTROL_CSR_AMAP epControlCsr; -	int status = BE_SUCCESS; -	u32 i, soft_reset_bit; - -	TRACE(DL_NOTE, "PCI reset..."); - -	/* Issue soft reset #1 to get BladeEngine into a known state. */ -	soft_reset.dw[0] = PCICFG0_READ(pfob, soft_reset); -	AMAP_SET_BITS_PTR(PCICFG_SOFT_RESET_CSR, softreset, soft_reset.dw, 1); -	PCICFG0_WRITE(pfob, host_timer_int_ctrl, soft_reset.dw[0]); -	/* -	 * wait til soft reset is deasserted - hardware -	 * deasserts after some time. -	 */ -	i = 0; -	do { -		udelay(50); -		soft_reset.dw[0] = PCICFG0_READ(pfob, soft_reset); -		soft_reset_bit = AMAP_GET_BITS_PTR(PCICFG_SOFT_RESET_CSR, -					softreset, soft_reset.dw); -	} while (soft_reset_bit  && (i++ < 1024)); -	if (soft_reset_bit != 0) { -		TRACE(DL_ERR, "Soft-reset #1 did not deassert as expected."); -		status = BE_NOT_OK; -		goto Error_label; -	} -	/* Mask everything  */ -	PCICFG0_WRITE(pfob, ue_status_low_mask, 0xFFFFFFFF); -	PCICFG0_WRITE(pfob, ue_status_hi_mask, 0xFFFFFFFF); -	/* -	 * Set everything offline except MPU IRAM (it is offline with -	 * the soft-reset, but soft-reset does not reset the PCICFG registers!) -	 */ -	pciOnline0.dw[0] = 0; -	pciOnline1.dw[0] = 0; -	AMAP_SET_BITS_PTR(PCICFG_ONLINE1_CSR, mpu_iram_online, -				pciOnline1.dw, 1); -	PCICFG0_WRITE(pfob, online0, pciOnline0.dw[0]); -	PCICFG0_WRITE(pfob, online1, pciOnline1.dw[0]); - -	udelay(20000); - -	/* Issue soft reset #2. */ -	AMAP_SET_BITS_PTR(PCICFG_SOFT_RESET_CSR, softreset, soft_reset.dw, 1); -	PCICFG0_WRITE(pfob, host_timer_int_ctrl, soft_reset.dw[0]); -	/* -	 * wait til soft reset is deasserted - hardware -	 * deasserts after some time. -	 */ -	i = 0; -	do { -		udelay(50); -		soft_reset.dw[0] = PCICFG0_READ(pfob, soft_reset); -		soft_reset_bit = AMAP_GET_BITS_PTR(PCICFG_SOFT_RESET_CSR, -					softreset, soft_reset.dw); -	} while (soft_reset_bit  && (i++ < 1024)); -	if (soft_reset_bit != 0) { -		TRACE(DL_ERR, "Soft-reset #1 did not deassert as expected."); -		status = BE_NOT_OK; -		goto Error_label; -	} - - -	udelay(20000); - -	/* Take MPU out of reset. */ - -	epControlCsr.dw[0] = ioread32(pfob->csr_va + MPU_EP_CONTROL); -	AMAP_SET_BITS_PTR(EP_CONTROL_CSR, CPU_reset, &epControlCsr, 0); -	iowrite32((u32)epControlCsr.dw[0], pfob->csr_va + MPU_EP_CONTROL); - -	/* Kickoff BE POST and wait for completion */ -	status = be_kickoff_and_wait_for_POST(pfob); - -Error_label: -	return status; -} - - -/* - *------------------------------------------------------------------- - * Function: be_pci_reset_required - *   This private function is called to detect if a host entity is - *   required to issue a PCI soft reset and subsequently drive - *   BladeEngine POST. Scenarios where this is required: - *   1) BIOS-less configuration - *   2) Hot-swap/plug/power-on - * pfob - - * return   true if a reset is required, false otherwise - *------------------------------------------------------------------- - */ -static bool be_pci_reset_required(struct be_function_object *pfob) -{ -	struct MGMT_HBA_POST_STATUS_STRUCT_AMAP status; -	bool do_reset = false; -	u32 post_error, post_stage; - -	/* -	 * Read the POST status register -	 */ -	status.dw[0] = ioread32(pfob->csr_va + MPU_EP_SEMAPHORE); -	post_error = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, error, -								&status); -	post_stage = AMAP_GET_BITS_PTR(MGMT_HBA_POST_STATUS_STRUCT, stage, -								&status); -	if (post_stage <= POST_STAGE_AWAITING_HOST_RDY) { -		/* -		 * If BladeEngine is waiting for host ready indication, -		 * we want to do a PCI reset. -		 */ -		do_reset = true; -	} - -	return do_reset; -} - -/* - *------------------------------------------------------------------- - * Function: be_drive_POST - *   This function is called to drive BladeEngine POST. The - *   caller should ensure they cannot be pre-empted while this routine executes. - * pfob - - * return status   - BE_SUCCESS (0) on success. Negative error code on failure. - *------------------------------------------------------------------- - */ -int be_drive_POST(struct be_function_object *pfob) -{ -	int status; - -	if (false != be_pci_reset_required(pfob)) { -		/* PCI reset is needed (implicitly starts and waits for POST) */ -		status = be_pci_soft_reset(pfob); -	} else { -		/* No PCI reset is needed, start POST */ -		status = be_kickoff_and_wait_for_POST(pfob); -	} - -	return status; -} diff --git a/drivers/staging/benet/mpu.h b/drivers/staging/benet/mpu.h deleted file mode 100644 index 41f3f87516e..00000000000 --- a/drivers/staging/benet/mpu.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __mpu_amap_h__ -#define __mpu_amap_h__ -#include "ep.h" - -/* Provide control parameters for the Managment Processor Unit. */ -struct BE_MPU_CSRMAP_AMAP { -	struct BE_EP_CSRMAP_AMAP ep; -	u8 rsvd0[128];	/* DWORD 64 */ -	u8 rsvd1[32];	/* DWORD 68 */ -	u8 rsvd2[192];	/* DWORD 69 */ -	u8 rsvd3[192];	/* DWORD 75 */ -	u8 rsvd4[32];	/* DWORD 81 */ -	u8 rsvd5[32];	/* DWORD 82 */ -	u8 rsvd6[32];	/* DWORD 83 */ -	u8 rsvd7[32];	/* DWORD 84 */ -	u8 rsvd8[32];	/* DWORD 85 */ -	u8 rsvd9[32];	/* DWORD 86 */ -	u8 rsvd10[32];	/* DWORD 87 */ -	u8 rsvd11[32];	/* DWORD 88 */ -	u8 rsvd12[32];	/* DWORD 89 */ -	u8 rsvd13[32];	/* DWORD 90 */ -	u8 rsvd14[32];	/* DWORD 91 */ -	u8 rsvd15[32];	/* DWORD 92 */ -	u8 rsvd16[32];	/* DWORD 93 */ -	u8 rsvd17[32];	/* DWORD 94 */ -	u8 rsvd18[32];	/* DWORD 95 */ -	u8 rsvd19[32];	/* DWORD 96 */ -	u8 rsvd20[32];	/* DWORD 97 */ -	u8 rsvd21[32];	/* DWORD 98 */ -	u8 rsvd22[32];	/* DWORD 99 */ -	u8 rsvd23[32];	/* DWORD 100 */ -	u8 rsvd24[32];	/* DWORD 101 */ -	u8 rsvd25[32];	/* DWORD 102 */ -	u8 rsvd26[32];	/* DWORD 103 */ -	u8 rsvd27[32];	/* DWORD 104 */ -	u8 rsvd28[96];	/* DWORD 105 */ -	u8 rsvd29[32];	/* DWORD 108 */ -	u8 rsvd30[32];	/* DWORD 109 */ -	u8 rsvd31[32];	/* DWORD 110 */ -	u8 rsvd32[32];	/* DWORD 111 */ -	u8 rsvd33[32];	/* DWORD 112 */ -	u8 rsvd34[96];	/* DWORD 113 */ -	u8 rsvd35[32];	/* DWORD 116 */ -	u8 rsvd36[32];	/* DWORD 117 */ -	u8 rsvd37[32];	/* DWORD 118 */ -	u8 rsvd38[32];	/* DWORD 119 */ -	u8 rsvd39[32];	/* DWORD 120 */ -	u8 rsvd40[32];	/* DWORD 121 */ -	u8 rsvd41[134][32];	/* DWORD 122 */ -} __packed; -struct MPU_CSRMAP_AMAP { -	u32 dw[256]; -}; - -#endif /* __mpu_amap_h__ */ diff --git a/drivers/staging/benet/mpu_context.h b/drivers/staging/benet/mpu_context.h deleted file mode 100644 index 8ce90f9c46c..00000000000 --- a/drivers/staging/benet/mpu_context.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __mpu_context_amap_h__ -#define __mpu_context_amap_h__ - -/* - * Management command and control ring context. The MPUs BTLR_CTRL1 CSR - * controls the writeback behavior of the producer and consumer index values. - */ -struct BE_MCC_RING_CONTEXT_AMAP { -	u8 con_index[16];	/* DWORD 0 */ -	u8 ring_size[4];	/* DWORD 0 */ -	u8 cq_id[11];	/* DWORD 0 */ -	u8 rsvd0;		/* DWORD 0 */ -	u8 prod_index[16];	/* DWORD 1 */ -	u8 pdid[15];	/* DWORD 1 */ -	u8 invalid;		/* DWORD 1 */ -	u8 cmd_pending_current[7];	/* DWORD 2 */ -	u8 rsvd1[25];	/* DWORD 2 */ -	u8 hpi_port_cq_id[11];	/* DWORD 3 */ -	u8 rsvd2[5];	/* DWORD 3 */ -	u8 cmd_pending_max[7];	/* DWORD 3 */ -	u8 rsvd3[9];	/* DWORD 3 */ -} __packed; -struct MCC_RING_CONTEXT_AMAP { -	u32 dw[4]; -}; - -#endif /* __mpu_context_amap_h__ */ diff --git a/drivers/staging/benet/pcicfg.h b/drivers/staging/benet/pcicfg.h deleted file mode 100644 index 7c15684adf4..00000000000 --- a/drivers/staging/benet/pcicfg.h +++ /dev/null @@ -1,825 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __pcicfg_amap_h__ -#define __pcicfg_amap_h__ - -/* Vendor and Device ID Register. */ -struct BE_PCICFG_ID_CSR_AMAP { -	u8 vendorid[16];	/* DWORD 0 */ -	u8 deviceid[16];	/* DWORD 0 */ -} __packed; -struct PCICFG_ID_CSR_AMAP { -	u32 dw[1]; -}; - -/* IO Bar Register. */ -struct BE_PCICFG_IOBAR_CSR_AMAP { -	u8 iospace;		/* DWORD 0 */ -	u8 rsvd0[7];	/* DWORD 0 */ -	u8 iobar[24];	/* DWORD 0 */ -} __packed; -struct PCICFG_IOBAR_CSR_AMAP { -	u32 dw[1]; -}; - -/* Memory BAR 0 Register. */ -struct BE_PCICFG_MEMBAR0_CSR_AMAP { -	u8 memspace;	/* DWORD 0 */ -	u8 type[2];		/* DWORD 0 */ -	u8 pf;		/* DWORD 0 */ -	u8 rsvd0[10];	/* DWORD 0 */ -	u8 membar0[18];	/* DWORD 0 */ -} __packed; -struct PCICFG_MEMBAR0_CSR_AMAP { -	u32 dw[1]; -}; - -/* Memory BAR 1 - Low Address Register. */ -struct BE_PCICFG_MEMBAR1_LO_CSR_AMAP { -	u8 memspace;	/* DWORD 0 */ -	u8 type[2];		/* DWORD 0 */ -	u8 pf;		/* DWORD 0 */ -	u8 rsvd0[13];	/* DWORD 0 */ -	u8 membar1lo[15];	/* DWORD 0 */ -} __packed; -struct PCICFG_MEMBAR1_LO_CSR_AMAP { -	u32 dw[1]; -}; - -/* Memory BAR 1 - High Address Register. */ -struct BE_PCICFG_MEMBAR1_HI_CSR_AMAP { -	u8 membar1hi[32];	/* DWORD 0 */ -} __packed; -struct PCICFG_MEMBAR1_HI_CSR_AMAP { -	u32 dw[1]; -}; - -/* Memory BAR 2 - Low Address Register. */ -struct BE_PCICFG_MEMBAR2_LO_CSR_AMAP { -	u8 memspace;	/* DWORD 0 */ -	u8 type[2];		/* DWORD 0 */ -	u8 pf;		/* DWORD 0 */ -	u8 rsvd0[17];	/* DWORD 0 */ -	u8 membar2lo[11];	/* DWORD 0 */ -} __packed; -struct PCICFG_MEMBAR2_LO_CSR_AMAP { -	u32 dw[1]; -}; - -/* Memory BAR 2 - High Address Register. */ -struct BE_PCICFG_MEMBAR2_HI_CSR_AMAP { -	u8 membar2hi[32];	/* DWORD 0 */ -} __packed; -struct PCICFG_MEMBAR2_HI_CSR_AMAP { -	u32 dw[1]; -}; - -/* Subsystem Vendor and ID (Function 0) Register. */ -struct BE_PCICFG_SUBSYSTEM_ID_F0_CSR_AMAP { -	u8 subsys_vendor_id[16];	/* DWORD 0 */ -	u8 subsys_id[16];	/* DWORD 0 */ -} __packed; -struct PCICFG_SUBSYSTEM_ID_F0_CSR_AMAP { -	u32 dw[1]; -}; - -/* Subsystem Vendor and ID (Function 1) Register. */ -struct BE_PCICFG_SUBSYSTEM_ID_F1_CSR_AMAP { -	u8 subsys_vendor_id[16];	/* DWORD 0 */ -	u8 subsys_id[16];	/* DWORD 0 */ -} __packed; -struct PCICFG_SUBSYSTEM_ID_F1_CSR_AMAP { -	u32 dw[1]; -}; - -/* Semaphore Register. */ -struct BE_PCICFG_SEMAPHORE_CSR_AMAP { -	u8 locked;		/* DWORD 0 */ -	u8 rsvd0[31];	/* DWORD 0 */ -} __packed; -struct PCICFG_SEMAPHORE_CSR_AMAP { -	u32 dw[1]; -}; - -/* Soft Reset Register. */ -struct BE_PCICFG_SOFT_RESET_CSR_AMAP { -	u8 rsvd0[7];	/* DWORD 0 */ -	u8 softreset;	/* DWORD 0 */ -	u8 rsvd1[16];	/* DWORD 0 */ -	u8 nec_ll_rcvdetect_i[8];	/* DWORD 0 */ -} __packed; -struct PCICFG_SOFT_RESET_CSR_AMAP { -	u32 dw[1]; -}; - -/* Unrecoverable Error Status (Low) Register. Each bit corresponds to - * an internal Unrecoverable Error.  These are set by hardware and may be - * cleared by writing a one to the respective bit(s) to be cleared.  Any - * bit being set that is also unmasked will result in Unrecoverable Error - * interrupt notification to the host CPU and/or Server Management chip - * and the transitioning of BladeEngine to an Offline state. - */ -struct BE_PCICFG_UE_STATUS_LOW_CSR_AMAP { -	u8 cev_ue_status;	/* DWORD 0 */ -	u8 ctx_ue_status;	/* DWORD 0 */ -	u8 dbuf_ue_status;	/* DWORD 0 */ -	u8 erx_ue_status;	/* DWORD 0 */ -	u8 host_ue_status;	/* DWORD 0 */ -	u8 mpu_ue_status;	/* DWORD 0 */ -	u8 ndma_ue_status;	/* DWORD 0 */ -	u8 ptc_ue_status;	/* DWORD 0 */ -	u8 rdma_ue_status;	/* DWORD 0 */ -	u8 rxf_ue_status;	/* DWORD 0 */ -	u8 rxips_ue_status;	/* DWORD 0 */ -	u8 rxulp0_ue_status;	/* DWORD 0 */ -	u8 rxulp1_ue_status;	/* DWORD 0 */ -	u8 rxulp2_ue_status;	/* DWORD 0 */ -	u8 tim_ue_status;	/* DWORD 0 */ -	u8 tpost_ue_status;	/* DWORD 0 */ -	u8 tpre_ue_status;	/* DWORD 0 */ -	u8 txips_ue_status;	/* DWORD 0 */ -	u8 txulp0_ue_status;	/* DWORD 0 */ -	u8 txulp1_ue_status;	/* DWORD 0 */ -	u8 uc_ue_status;	/* DWORD 0 */ -	u8 wdma_ue_status;	/* DWORD 0 */ -	u8 txulp2_ue_status;	/* DWORD 0 */ -	u8 host1_ue_status;	/* DWORD 0 */ -	u8 p0_ob_link_ue_status;	/* DWORD 0 */ -	u8 p1_ob_link_ue_status;	/* DWORD 0 */ -	u8 host_gpio_ue_status;	/* DWORD 0 */ -	u8 mbox_netw_ue_status;	/* DWORD 0 */ -	u8 mbox_stor_ue_status;	/* DWORD 0 */ -	u8 axgmac0_ue_status;	/* DWORD 0 */ -	u8 axgmac1_ue_status;	/* DWORD 0 */ -	u8 mpu_intpend_ue_status;	/* DWORD 0 */ -} __packed; -struct PCICFG_UE_STATUS_LOW_CSR_AMAP { -	u32 dw[1]; -}; - -/* Unrecoverable Error Status (High) Register. Each bit corresponds to - * an internal Unrecoverable Error.  These are set by hardware and may be - * cleared by writing a one to the respective bit(s) to be cleared.  Any - * bit being set that is also unmasked will result in Unrecoverable Error - * interrupt notification to the host CPU and/or Server Management chip; - * and the transitioning of BladeEngine to an Offline state. - */ -struct BE_PCICFG_UE_STATUS_HI_CSR_AMAP { -	u8 jtag_ue_status;	/* DWORD 0 */ -	u8 lpcmemhost_ue_status;	/* DWORD 0 */ -	u8 mgmt_mac_ue_status;	/* DWORD 0 */ -	u8 mpu_iram_ue_status;	/* DWORD 0 */ -	u8 pcs0online_ue_status;	/* DWORD 0 */ -	u8 pcs1online_ue_status;	/* DWORD 0 */ -	u8 pctl0_ue_status;	/* DWORD 0 */ -	u8 pctl1_ue_status;	/* DWORD 0 */ -	u8 pmem_ue_status;	/* DWORD 0 */ -	u8 rr_ue_status;	/* DWORD 0 */ -	u8 rxpp_ue_status;	/* DWORD 0 */ -	u8 txpb_ue_status;	/* DWORD 0 */ -	u8 txp_ue_status;	/* DWORD 0 */ -	u8 xaui_ue_status;	/* DWORD 0 */ -	u8 arm_ue_status;	/* DWORD 0 */ -	u8 ipc_ue_status;	/* DWORD 0 */ -	u8 rsvd0[16];	/* DWORD 0 */ -} __packed; -struct PCICFG_UE_STATUS_HI_CSR_AMAP { -	u32 dw[1]; -}; - -/* Unrecoverable Error Mask (Low) Register. Each bit, when set to one, - * will mask the associated Unrecoverable  Error status bit from notification - * of Unrecoverable Error to the host CPU and/or Server Managment chip and the - * transitioning of all BladeEngine units to an Offline state. - */ -struct BE_PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP { -	u8 cev_ue_mask;	/* DWORD 0 */ -	u8 ctx_ue_mask;	/* DWORD 0 */ -	u8 dbuf_ue_mask;	/* DWORD 0 */ -	u8 erx_ue_mask;	/* DWORD 0 */ -	u8 host_ue_mask;	/* DWORD 0 */ -	u8 mpu_ue_mask;	/* DWORD 0 */ -	u8 ndma_ue_mask;	/* DWORD 0 */ -	u8 ptc_ue_mask;	/* DWORD 0 */ -	u8 rdma_ue_mask;	/* DWORD 0 */ -	u8 rxf_ue_mask;	/* DWORD 0 */ -	u8 rxips_ue_mask;	/* DWORD 0 */ -	u8 rxulp0_ue_mask;	/* DWORD 0 */ -	u8 rxulp1_ue_mask;	/* DWORD 0 */ -	u8 rxulp2_ue_mask;	/* DWORD 0 */ -	u8 tim_ue_mask;	/* DWORD 0 */ -	u8 tpost_ue_mask;	/* DWORD 0 */ -	u8 tpre_ue_mask;	/* DWORD 0 */ -	u8 txips_ue_mask;	/* DWORD 0 */ -	u8 txulp0_ue_mask;	/* DWORD 0 */ -	u8 txulp1_ue_mask;	/* DWORD 0 */ -	u8 uc_ue_mask;	/* DWORD 0 */ -	u8 wdma_ue_mask;	/* DWORD 0 */ -	u8 txulp2_ue_mask;	/* DWORD 0 */ -	u8 host1_ue_mask;	/* DWORD 0 */ -	u8 p0_ob_link_ue_mask;	/* DWORD 0 */ -	u8 p1_ob_link_ue_mask;	/* DWORD 0 */ -	u8 host_gpio_ue_mask;	/* DWORD 0 */ -	u8 mbox_netw_ue_mask;	/* DWORD 0 */ -	u8 mbox_stor_ue_mask;	/* DWORD 0 */ -	u8 axgmac0_ue_mask;	/* DWORD 0 */ -	u8 axgmac1_ue_mask;	/* DWORD 0 */ -	u8 mpu_intpend_ue_mask;	/* DWORD 0 */ -} __packed; -struct PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP { -	u32 dw[1]; -}; - -/* Unrecoverable Error Mask (High) Register. Each bit, when set to one, - * will mask the associated Unrecoverable Error status bit from notification - * of Unrecoverable Error to the host CPU and/or Server Managment chip and the - * transitioning of all BladeEngine units to an Offline state. - */ -struct BE_PCICFG_UE_STATUS_HI_MASK_CSR_AMAP { -	u8 jtag_ue_mask;	/* DWORD 0 */ -	u8 lpcmemhost_ue_mask;	/* DWORD 0 */ -	u8 mgmt_mac_ue_mask;	/* DWORD 0 */ -	u8 mpu_iram_ue_mask;	/* DWORD 0 */ -	u8 pcs0online_ue_mask;	/* DWORD 0 */ -	u8 pcs1online_ue_mask;	/* DWORD 0 */ -	u8 pctl0_ue_mask;	/* DWORD 0 */ -	u8 pctl1_ue_mask;	/* DWORD 0 */ -	u8 pmem_ue_mask;	/* DWORD 0 */ -	u8 rr_ue_mask;	/* DWORD 0 */ -	u8 rxpp_ue_mask;	/* DWORD 0 */ -	u8 txpb_ue_mask;	/* DWORD 0 */ -	u8 txp_ue_mask;	/* DWORD 0 */ -	u8 xaui_ue_mask;	/* DWORD 0 */ -	u8 arm_ue_mask;	/* DWORD 0 */ -	u8 ipc_ue_mask;	/* DWORD 0 */ -	u8 rsvd0[16];	/* DWORD 0 */ -} __packed; -struct PCICFG_UE_STATUS_HI_MASK_CSR_AMAP { -	u32 dw[1]; -}; - -/* Online Control Register 0. This register controls various units within - * BladeEngine being in an Online or Offline state. - */ -struct BE_PCICFG_ONLINE0_CSR_AMAP { -	u8 cev_online;	/* DWORD 0 */ -	u8 ctx_online;	/* DWORD 0 */ -	u8 dbuf_online;	/* DWORD 0 */ -	u8 erx_online;	/* DWORD 0 */ -	u8 host_online;	/* DWORD 0 */ -	u8 mpu_online;	/* DWORD 0 */ -	u8 ndma_online;	/* DWORD 0 */ -	u8 ptc_online;	/* DWORD 0 */ -	u8 rdma_online;	/* DWORD 0 */ -	u8 rxf_online;	/* DWORD 0 */ -	u8 rxips_online;	/* DWORD 0 */ -	u8 rxulp0_online;	/* DWORD 0 */ -	u8 rxulp1_online;	/* DWORD 0 */ -	u8 rxulp2_online;	/* DWORD 0 */ -	u8 tim_online;	/* DWORD 0 */ -	u8 tpost_online;	/* DWORD 0 */ -	u8 tpre_online;	/* DWORD 0 */ -	u8 txips_online;	/* DWORD 0 */ -	u8 txulp0_online;	/* DWORD 0 */ -	u8 txulp1_online;	/* DWORD 0 */ -	u8 uc_online;	/* DWORD 0 */ -	u8 wdma_online;	/* DWORD 0 */ -	u8 txulp2_online;	/* DWORD 0 */ -	u8 host1_online;	/* DWORD 0 */ -	u8 p0_ob_link_online;	/* DWORD 0 */ -	u8 p1_ob_link_online;	/* DWORD 0 */ -	u8 host_gpio_online;	/* DWORD 0 */ -	u8 mbox_netw_online;	/* DWORD 0 */ -	u8 mbox_stor_online;	/* DWORD 0 */ -	u8 axgmac0_online;	/* DWORD 0 */ -	u8 axgmac1_online;	/* DWORD 0 */ -	u8 mpu_intpend_online;	/* DWORD 0 */ -} __packed; -struct PCICFG_ONLINE0_CSR_AMAP { -	u32 dw[1]; -}; - -/* Online Control Register 1. This register controls various units within - * BladeEngine being in an Online or Offline state. - */ -struct BE_PCICFG_ONLINE1_CSR_AMAP { -	u8 jtag_online;	/* DWORD 0 */ -	u8 lpcmemhost_online;	/* DWORD 0 */ -	u8 mgmt_mac_online;	/* DWORD 0 */ -	u8 mpu_iram_online;	/* DWORD 0 */ -	u8 pcs0online_online;	/* DWORD 0 */ -	u8 pcs1online_online;	/* DWORD 0 */ -	u8 pctl0_online;	/* DWORD 0 */ -	u8 pctl1_online;	/* DWORD 0 */ -	u8 pmem_online;	/* DWORD 0 */ -	u8 rr_online;	/* DWORD 0 */ -	u8 rxpp_online;	/* DWORD 0 */ -	u8 txpb_online;	/* DWORD 0 */ -	u8 txp_online;	/* DWORD 0 */ -	u8 xaui_online;	/* DWORD 0 */ -	u8 arm_online;	/* DWORD 0 */ -	u8 ipc_online;	/* DWORD 0 */ -	u8 rsvd0[16];	/* DWORD 0 */ -} __packed; -struct PCICFG_ONLINE1_CSR_AMAP { -	u32 dw[1]; -}; - -/* Host Timer Register. */ -struct BE_PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP { -	u8 hosttimer[24];	/* DWORD 0 */ -	u8 hostintr;	/* DWORD 0 */ -	u8 rsvd0[7];	/* DWORD 0 */ -} __packed; -struct PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP { -	u32 dw[1]; -}; - -/* Scratchpad Register (for software use). */ -struct BE_PCICFG_SCRATCHPAD_CSR_AMAP { -	u8 scratchpad[32];	/* DWORD 0 */ -} __packed; -struct PCICFG_SCRATCHPAD_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express Capabilities Register. */ -struct BE_PCICFG_PCIE_CAP_CSR_AMAP { -	u8 capid[8];	/* DWORD 0 */ -	u8 nextcap[8];	/* DWORD 0 */ -	u8 capver[4];	/* DWORD 0 */ -	u8 devport[4];	/* DWORD 0 */ -	u8 rsvd0[6];	/* DWORD 0 */ -	u8 rsvd1[2];	/* DWORD 0 */ -} __packed; -struct PCICFG_PCIE_CAP_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express Device Capabilities Register. */ -struct BE_PCICFG_PCIE_DEVCAP_CSR_AMAP { -	u8 payload[3];	/* DWORD 0 */ -	u8 rsvd0[3];	/* DWORD 0 */ -	u8 lo_lat[3];	/* DWORD 0 */ -	u8 l1_lat[3];	/* DWORD 0 */ -	u8 rsvd1[3];	/* DWORD 0 */ -	u8 rsvd2[3];	/* DWORD 0 */ -	u8 pwr_value[8];	/* DWORD 0 */ -	u8 pwr_scale[2];	/* DWORD 0 */ -	u8 rsvd3[4];	/* DWORD 0 */ -} __packed; -struct PCICFG_PCIE_DEVCAP_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express Device Control/Status Registers. */ -struct BE_PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP { -	u8 CorrErrReportEn;	/* DWORD 0 */ -	u8 NonFatalErrReportEn;	/* DWORD 0 */ -	u8 FatalErrReportEn;	/* DWORD 0 */ -	u8 UnsuppReqReportEn;	/* DWORD 0 */ -	u8 EnableRelaxOrder;	/* DWORD 0 */ -	u8 Max_Payload_Size[3];	/* DWORD 0 */ -	u8 ExtendTagFieldEnable;	/* DWORD 0 */ -	u8 PhantomFnEnable;	/* DWORD 0 */ -	u8 AuxPwrPMEnable;	/* DWORD 0 */ -	u8 EnableNoSnoop;	/* DWORD 0 */ -	u8 Max_Read_Req_Size[3];	/* DWORD 0 */ -	u8 rsvd0;		/* DWORD 0 */ -	u8 CorrErrDetect;	/* DWORD 0 */ -	u8 NonFatalErrDetect;	/* DWORD 0 */ -	u8 FatalErrDetect;	/* DWORD 0 */ -	u8 UnsuppReqDetect;	/* DWORD 0 */ -	u8 AuxPwrDetect;	/* DWORD 0 */ -	u8 TransPending;	/* DWORD 0 */ -	u8 rsvd1[10];	/* DWORD 0 */ -} __packed; -struct PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express Link Capabilities Register. */ -struct BE_PCICFG_PCIE_LINK_CAP_CSR_AMAP { -	u8 MaxLinkSpeed[4];	/* DWORD 0 */ -	u8 MaxLinkWidth[6];	/* DWORD 0 */ -	u8 ASPMSupport[2];	/* DWORD 0 */ -	u8 L0sExitLat[3];	/* DWORD 0 */ -	u8 L1ExitLat[3];	/* DWORD 0 */ -	u8 rsvd0[6];	/* DWORD 0 */ -	u8 PortNum[8];	/* DWORD 0 */ -} __packed; -struct PCICFG_PCIE_LINK_CAP_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express Link Status Register. */ -struct BE_PCICFG_PCIE_LINK_STATUS_CSR_AMAP { -	u8 ASPMCtl[2];	/* DWORD 0 */ -	u8 rsvd0;		/* DWORD 0 */ -	u8 ReadCmplBndry;	/* DWORD 0 */ -	u8 LinkDisable;	/* DWORD 0 */ -	u8 RetrainLink;	/* DWORD 0 */ -	u8 CommonClkConfig;	/* DWORD 0 */ -	u8 ExtendSync;	/* DWORD 0 */ -	u8 rsvd1[8];	/* DWORD 0 */ -	u8 LinkSpeed[4];	/* DWORD 0 */ -	u8 NegLinkWidth[6];	/* DWORD 0 */ -	u8 LinkTrainErr;	/* DWORD 0 */ -	u8 LinkTrain;	/* DWORD 0 */ -	u8 SlotClkConfig;	/* DWORD 0 */ -	u8 rsvd2[3];	/* DWORD 0 */ -} __packed; -struct PCICFG_PCIE_LINK_STATUS_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express MSI Configuration Register. */ -struct BE_PCICFG_MSI_CSR_AMAP { -	u8 capid[8];	/* DWORD 0 */ -	u8 nextptr[8];	/* DWORD 0 */ -	u8 tablesize[11];	/* DWORD 0 */ -	u8 rsvd0[3];	/* DWORD 0 */ -	u8 funcmask;	/* DWORD 0 */ -	u8 en;		/* DWORD 0 */ -} __packed; -struct PCICFG_MSI_CSR_AMAP { -	u32 dw[1]; -}; - -/* MSI-X Table Offset Register. */ -struct BE_PCICFG_MSIX_TABLE_CSR_AMAP { -	u8 tablebir[3];	/* DWORD 0 */ -	u8 offset[29];	/* DWORD 0 */ -} __packed; -struct PCICFG_MSIX_TABLE_CSR_AMAP { -	u32 dw[1]; -}; - -/* MSI-X PBA Offset Register. */ -struct BE_PCICFG_MSIX_PBA_CSR_AMAP { -	u8 pbabir[3];	/* DWORD 0 */ -	u8 offset[29];	/* DWORD 0 */ -} __packed; -struct PCICFG_MSIX_PBA_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express MSI-X Message Vector Control Register. */ -struct BE_PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP { -	u8 vector_control;	/* DWORD 0 */ -	u8 rsvd0[31];	/* DWORD 0 */ -} __packed; -struct PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express MSI-X Message Data Register. */ -struct BE_PCICFG_MSIX_MSG_DATA_CSR_AMAP { -	u8 data[16];	/* DWORD 0 */ -	u8 rsvd0[16];	/* DWORD 0 */ -} __packed; -struct PCICFG_MSIX_MSG_DATA_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express MSI-X Message Address Register - High Part. */ -struct BE_PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP { -	u8 addr[32];	/* DWORD 0 */ -} __packed; -struct PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP { -	u32 dw[1]; -}; - -/* PCI Express MSI-X Message Address Register - Low Part. */ -struct BE_PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP { -	u8 rsvd0[2];	/* DWORD 0 */ -	u8 addr[30];	/* DWORD 0 */ -} __packed; -struct PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP { -	u32 dw[1]; -}; - -struct BE_PCICFG_ANON_18_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -} __packed; -struct PCICFG_ANON_18_RSVD_AMAP { -	u32 dw[1]; -}; - -struct BE_PCICFG_ANON_19_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -} __packed; -struct PCICFG_ANON_19_RSVD_AMAP { -	u32 dw[1]; -}; - -struct BE_PCICFG_ANON_20_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -	u8 rsvd1[25][32];	/* DWORD 1 */ -} __packed; -struct PCICFG_ANON_20_RSVD_AMAP { -	u32 dw[26]; -}; - -struct BE_PCICFG_ANON_21_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -	u8 rsvd1[1919][32];	/* DWORD 1 */ -} __packed; -struct PCICFG_ANON_21_RSVD_AMAP { -	u32 dw[1920]; -}; - -struct BE_PCICFG_ANON_22_MESSAGE_AMAP { -	struct BE_PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP vec_ctrl; -	struct BE_PCICFG_MSIX_MSG_DATA_CSR_AMAP msg_data; -	struct BE_PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP addr_hi; -	struct BE_PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP addr_low; -} __packed; -struct PCICFG_ANON_22_MESSAGE_AMAP { -	u32 dw[4]; -}; - -struct BE_PCICFG_ANON_23_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -	u8 rsvd1[895][32];	/* DWORD 1 */ -} __packed; -struct PCICFG_ANON_23_RSVD_AMAP { -	u32 dw[896]; -}; - -/* These PCI Configuration Space registers are for the Storage  Function of - * BladeEngine (Function 0). In the memory map of the registers below their - * table, - */ -struct BE_PCICFG0_CSRMAP_AMAP { -	struct BE_PCICFG_ID_CSR_AMAP id; -	u8 rsvd0[32];	/* DWORD 1 */ -	u8 rsvd1[32];	/* DWORD 2 */ -	u8 rsvd2[32];	/* DWORD 3 */ -	struct BE_PCICFG_IOBAR_CSR_AMAP iobar; -	struct BE_PCICFG_MEMBAR0_CSR_AMAP membar0; -	struct BE_PCICFG_MEMBAR1_LO_CSR_AMAP membar1_lo; -	struct BE_PCICFG_MEMBAR1_HI_CSR_AMAP membar1_hi; -	struct BE_PCICFG_MEMBAR2_LO_CSR_AMAP membar2_lo; -	struct BE_PCICFG_MEMBAR2_HI_CSR_AMAP membar2_hi; -	u8 rsvd3[32];	/* DWORD 10 */ -	struct BE_PCICFG_SUBSYSTEM_ID_F0_CSR_AMAP subsystem_id; -	u8 rsvd4[32];	/* DWORD 12 */ -	u8 rsvd5[32];	/* DWORD 13 */ -	u8 rsvd6[32];	/* DWORD 14 */ -	u8 rsvd7[32];	/* DWORD 15 */ -	struct BE_PCICFG_SEMAPHORE_CSR_AMAP semaphore[4]; -	struct BE_PCICFG_SOFT_RESET_CSR_AMAP soft_reset; -	u8 rsvd8[32];	/* DWORD 21 */ -	struct BE_PCICFG_SCRATCHPAD_CSR_AMAP scratchpad; -	u8 rsvd9[32];	/* DWORD 23 */ -	u8 rsvd10[32];	/* DWORD 24 */ -	u8 rsvd11[32];	/* DWORD 25 */ -	u8 rsvd12[32];	/* DWORD 26 */ -	u8 rsvd13[32];	/* DWORD 27 */ -	u8 rsvd14[2][32];	/* DWORD 28 */ -	u8 rsvd15[32];	/* DWORD 30 */ -	u8 rsvd16[32];	/* DWORD 31 */ -	u8 rsvd17[8][32];	/* DWORD 32 */ -	struct BE_PCICFG_UE_STATUS_LOW_CSR_AMAP ue_status_low; -	struct BE_PCICFG_UE_STATUS_HI_CSR_AMAP ue_status_hi; -	struct BE_PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP ue_status_low_mask; -	struct BE_PCICFG_UE_STATUS_HI_MASK_CSR_AMAP ue_status_hi_mask; -	struct BE_PCICFG_ONLINE0_CSR_AMAP online0; -	struct BE_PCICFG_ONLINE1_CSR_AMAP online1; -	u8 rsvd18[32];	/* DWORD 46 */ -	u8 rsvd19[32];	/* DWORD 47 */ -	u8 rsvd20[32];	/* DWORD 48 */ -	u8 rsvd21[32];	/* DWORD 49 */ -	struct BE_PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP host_timer_int_ctrl; -	u8 rsvd22[32];	/* DWORD 51 */ -	struct BE_PCICFG_PCIE_CAP_CSR_AMAP pcie_cap; -	struct BE_PCICFG_PCIE_DEVCAP_CSR_AMAP pcie_devcap; -	struct BE_PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP pcie_control_status; -	struct BE_PCICFG_PCIE_LINK_CAP_CSR_AMAP pcie_link_cap; -	struct BE_PCICFG_PCIE_LINK_STATUS_CSR_AMAP pcie_link_status; -	struct BE_PCICFG_MSI_CSR_AMAP msi; -	struct BE_PCICFG_MSIX_TABLE_CSR_AMAP msix_table_offset; -	struct BE_PCICFG_MSIX_PBA_CSR_AMAP msix_pba_offset; -	u8 rsvd23[32];	/* DWORD 60 */ -	u8 rsvd24[32];	/* DWORD 61 */ -	u8 rsvd25[32];	/* DWORD 62 */ -	u8 rsvd26[32];	/* DWORD 63 */ -	u8 rsvd27[32];	/* DWORD 64 */ -	u8 rsvd28[32];	/* DWORD 65 */ -	u8 rsvd29[32];	/* DWORD 66 */ -	u8 rsvd30[32];	/* DWORD 67 */ -	u8 rsvd31[32];	/* DWORD 68 */ -	u8 rsvd32[32];	/* DWORD 69 */ -	u8 rsvd33[32];	/* DWORD 70 */ -	u8 rsvd34[32];	/* DWORD 71 */ -	u8 rsvd35[32];	/* DWORD 72 */ -	u8 rsvd36[32];	/* DWORD 73 */ -	u8 rsvd37[32];	/* DWORD 74 */ -	u8 rsvd38[32];	/* DWORD 75 */ -	u8 rsvd39[32];	/* DWORD 76 */ -	u8 rsvd40[32];	/* DWORD 77 */ -	u8 rsvd41[32];	/* DWORD 78 */ -	u8 rsvd42[32];	/* DWORD 79 */ -	u8 rsvd43[32];	/* DWORD 80 */ -	u8 rsvd44[32];	/* DWORD 81 */ -	u8 rsvd45[32];	/* DWORD 82 */ -	u8 rsvd46[32];	/* DWORD 83 */ -	u8 rsvd47[32];	/* DWORD 84 */ -	u8 rsvd48[32];	/* DWORD 85 */ -	u8 rsvd49[32];	/* DWORD 86 */ -	u8 rsvd50[32];	/* DWORD 87 */ -	u8 rsvd51[32];	/* DWORD 88 */ -	u8 rsvd52[32];	/* DWORD 89 */ -	u8 rsvd53[32];	/* DWORD 90 */ -	u8 rsvd54[32];	/* DWORD 91 */ -	u8 rsvd55[32];	/* DWORD 92 */ -	u8 rsvd56[832];	/* DWORD 93 */ -	u8 rsvd57[32];	/* DWORD 119 */ -	u8 rsvd58[32];	/* DWORD 120 */ -	u8 rsvd59[32];	/* DWORD 121 */ -	u8 rsvd60[32];	/* DWORD 122 */ -	u8 rsvd61[32];	/* DWORD 123 */ -	u8 rsvd62[32];	/* DWORD 124 */ -	u8 rsvd63[32];	/* DWORD 125 */ -	u8 rsvd64[32];	/* DWORD 126 */ -	u8 rsvd65[32];	/* DWORD 127 */ -	u8 rsvd66[61440];	/* DWORD 128 */ -	struct BE_PCICFG_ANON_22_MESSAGE_AMAP message[32]; -	u8 rsvd67[28672];	/* DWORD 2176 */ -	u8 rsvd68[32];	/* DWORD 3072 */ -	u8 rsvd69[1023][32];	/* DWORD 3073 */ -} __packed; -struct PCICFG0_CSRMAP_AMAP { -	u32 dw[4096]; -}; - -struct BE_PCICFG_ANON_24_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -} __packed; -struct PCICFG_ANON_24_RSVD_AMAP { -	u32 dw[1]; -}; - -struct BE_PCICFG_ANON_25_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -} __packed; -struct PCICFG_ANON_25_RSVD_AMAP { -	u32 dw[1]; -}; - -struct BE_PCICFG_ANON_26_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -} __packed; -struct PCICFG_ANON_26_RSVD_AMAP { -	u32 dw[1]; -}; - -struct BE_PCICFG_ANON_27_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -	u8 rsvd1[32];	/* DWORD 1 */ -} __packed; -struct PCICFG_ANON_27_RSVD_AMAP { -	u32 dw[2]; -}; - -struct BE_PCICFG_ANON_28_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -	u8 rsvd1[3][32];	/* DWORD 1 */ -} __packed; -struct PCICFG_ANON_28_RSVD_AMAP { -	u32 dw[4]; -}; - -struct BE_PCICFG_ANON_29_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -	u8 rsvd1[36][32];	/* DWORD 1 */ -} __packed; -struct PCICFG_ANON_29_RSVD_AMAP { -	u32 dw[37]; -}; - -struct BE_PCICFG_ANON_30_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -	u8 rsvd1[1930][32];	/* DWORD 1 */ -} __packed; -struct PCICFG_ANON_30_RSVD_AMAP { -	u32 dw[1931]; -}; - -struct BE_PCICFG_ANON_31_MESSAGE_AMAP { -	struct BE_PCICFG_MSIX_VECTOR_CONTROL_CSR_AMAP vec_ctrl; -	struct BE_PCICFG_MSIX_MSG_DATA_CSR_AMAP msg_data; -	struct BE_PCICFG_MSIX_MSG_ADDR_HI_CSR_AMAP addr_hi; -	struct BE_PCICFG_MSIX_MSG_ADDR_LO_CSR_AMAP addr_low; -} __packed; -struct PCICFG_ANON_31_MESSAGE_AMAP { -	u32 dw[4]; -}; - -struct BE_PCICFG_ANON_32_RSVD_AMAP { -	u8 rsvd0[32];	/* DWORD 0 */ -	u8 rsvd1[895][32];	/* DWORD 1 */ -} __packed; -struct PCICFG_ANON_32_RSVD_AMAP { -	u32 dw[896]; -}; - -/* This PCI configuration space register map is for the  Networking Function of - * BladeEngine (Function 1). - */ -struct BE_PCICFG1_CSRMAP_AMAP { -	struct BE_PCICFG_ID_CSR_AMAP id; -	u8 rsvd0[32];	/* DWORD 1 */ -	u8 rsvd1[32];	/* DWORD 2 */ -	u8 rsvd2[32];	/* DWORD 3 */ -	struct BE_PCICFG_IOBAR_CSR_AMAP iobar; -	struct BE_PCICFG_MEMBAR0_CSR_AMAP membar0; -	struct BE_PCICFG_MEMBAR1_LO_CSR_AMAP membar1_lo; -	struct BE_PCICFG_MEMBAR1_HI_CSR_AMAP membar1_hi; -	struct BE_PCICFG_MEMBAR2_LO_CSR_AMAP membar2_lo; -	struct BE_PCICFG_MEMBAR2_HI_CSR_AMAP membar2_hi; -	u8 rsvd3[32];	/* DWORD 10 */ -	struct BE_PCICFG_SUBSYSTEM_ID_F1_CSR_AMAP subsystem_id; -	u8 rsvd4[32];	/* DWORD 12 */ -	u8 rsvd5[32];	/* DWORD 13 */ -	u8 rsvd6[32];	/* DWORD 14 */ -	u8 rsvd7[32];	/* DWORD 15 */ -	struct BE_PCICFG_SEMAPHORE_CSR_AMAP semaphore[4]; -	struct BE_PCICFG_SOFT_RESET_CSR_AMAP soft_reset; -	u8 rsvd8[32];	/* DWORD 21 */ -	struct BE_PCICFG_SCRATCHPAD_CSR_AMAP scratchpad; -	u8 rsvd9[32];	/* DWORD 23 */ -	u8 rsvd10[32];	/* DWORD 24 */ -	u8 rsvd11[32];	/* DWORD 25 */ -	u8 rsvd12[32];	/* DWORD 26 */ -	u8 rsvd13[32];	/* DWORD 27 */ -	u8 rsvd14[2][32];	/* DWORD 28 */ -	u8 rsvd15[32];	/* DWORD 30 */ -	u8 rsvd16[32];	/* DWORD 31 */ -	u8 rsvd17[8][32];	/* DWORD 32 */ -	struct BE_PCICFG_UE_STATUS_LOW_CSR_AMAP ue_status_low; -	struct BE_PCICFG_UE_STATUS_HI_CSR_AMAP ue_status_hi; -	struct BE_PCICFG_UE_STATUS_LOW_MASK_CSR_AMAP ue_status_low_mask; -	struct BE_PCICFG_UE_STATUS_HI_MASK_CSR_AMAP ue_status_hi_mask; -	struct BE_PCICFG_ONLINE0_CSR_AMAP online0; -	struct BE_PCICFG_ONLINE1_CSR_AMAP online1; -	u8 rsvd18[32];	/* DWORD 46 */ -	u8 rsvd19[32];	/* DWORD 47 */ -	u8 rsvd20[32];	/* DWORD 48 */ -	u8 rsvd21[32];	/* DWORD 49 */ -	struct BE_PCICFG_HOST_TIMER_INT_CTRL_CSR_AMAP host_timer_int_ctrl; -	u8 rsvd22[32];	/* DWORD 51 */ -	struct BE_PCICFG_PCIE_CAP_CSR_AMAP pcie_cap; -	struct BE_PCICFG_PCIE_DEVCAP_CSR_AMAP pcie_devcap; -	struct BE_PCICFG_PCIE_CONTROL_STATUS_CSR_AMAP pcie_control_status; -	struct BE_PCICFG_PCIE_LINK_CAP_CSR_AMAP pcie_link_cap; -	struct BE_PCICFG_PCIE_LINK_STATUS_CSR_AMAP pcie_link_status; -	struct BE_PCICFG_MSI_CSR_AMAP msi; -	struct BE_PCICFG_MSIX_TABLE_CSR_AMAP msix_table_offset; -	struct BE_PCICFG_MSIX_PBA_CSR_AMAP msix_pba_offset; -	u8 rsvd23[64];	/* DWORD 60 */ -	u8 rsvd24[32];	/* DWORD 62 */ -	u8 rsvd25[32];	/* DWORD 63 */ -	u8 rsvd26[32];	/* DWORD 64 */ -	u8 rsvd27[32];	/* DWORD 65 */ -	u8 rsvd28[32];	/* DWORD 66 */ -	u8 rsvd29[32];	/* DWORD 67 */ -	u8 rsvd30[32];	/* DWORD 68 */ -	u8 rsvd31[32];	/* DWORD 69 */ -	u8 rsvd32[32];	/* DWORD 70 */ -	u8 rsvd33[32];	/* DWORD 71 */ -	u8 rsvd34[32];	/* DWORD 72 */ -	u8 rsvd35[32];	/* DWORD 73 */ -	u8 rsvd36[32];	/* DWORD 74 */ -	u8 rsvd37[128];	/* DWORD 75 */ -	u8 rsvd38[32];	/* DWORD 79 */ -	u8 rsvd39[1184];	/* DWORD 80 */ -	u8 rsvd40[61792];	/* DWORD 117 */ -	struct BE_PCICFG_ANON_31_MESSAGE_AMAP message[32]; -	u8 rsvd41[28672];	/* DWORD 2176 */ -	u8 rsvd42[32];	/* DWORD 3072 */ -	u8 rsvd43[1023][32];	/* DWORD 3073 */ -} __packed; -struct PCICFG1_CSRMAP_AMAP { -	u32 dw[4096]; -}; - -#endif /* __pcicfg_amap_h__ */ diff --git a/drivers/staging/benet/post_codes.h b/drivers/staging/benet/post_codes.h deleted file mode 100644 index 6d1621f5f5f..00000000000 --- a/drivers/staging/benet/post_codes.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __post_codes_amap_h__ -#define __post_codes_amap_h__ - -/* --- MGMT_HBA_POST_STAGE_ENUM --- */ -#define POST_STAGE_POWER_ON_RESET   (0)	/* State after a cold or warm boot. */ -#define POST_STAGE_AWAITING_HOST_RDY (1)	/* ARM boot code awaiting a -						go-ahed from  the host. */ -#define POST_STAGE_HOST_RDY (2)	/* Host has given go-ahed to ARM. */ -#define POST_STAGE_BE_RESET (3)	/* Host wants to reset chip, this is a  chip -						workaround  */ -#define POST_STAGE_SEEPROM_CS_START (256)	/* SEEPROM checksum -						test start. */ -#define POST_STAGE_SEEPROM_CS_DONE  (257)	/* SEEPROM checksum test -							done. */ -#define POST_STAGE_DDR_CONFIG_START (512)	/* DDR configuration start. */ -#define POST_STAGE_DDR_CONFIG_DONE  (513)	/* DDR configuration done. */ -#define POST_STAGE_DDR_CALIBRATE_START  (768)	/* DDR calibration start. */ -#define POST_STAGE_DDR_CALIBRATE_DONE   (769)	/* DDR calibration done. */ -#define POST_STAGE_DDR_TEST_START   (1024)	/* DDR memory test start. */ -#define POST_STAGE_DDR_TEST_DONE    (1025)	/* DDR memory test done. */ -#define POST_STAGE_REDBOOT_INIT_START   (1536)	/* Redboot starts execution. */ -#define POST_STAGE_REDBOOT_INIT_DONE (1537)	/* Redboot done execution. */ -#define POST_STAGE_FW_IMAGE_LOAD_START (1792)	/* Firmware image load to -							DDR start. */ -#define POST_STAGE_FW_IMAGE_LOAD_DONE   (1793)	/* Firmware image load -							to DDR done. */ -#define POST_STAGE_ARMFW_START          (2048)	/* ARMfw runtime code -						starts execution. */ -#define POST_STAGE_DHCP_QUERY_START     (2304)	/* DHCP server query start. */ -#define POST_STAGE_DHCP_QUERY_DONE      (2305)	/* DHCP server query done. */ -#define POST_STAGE_BOOT_TARGET_DISCOVERY_START (2560)	/* Boot Target -						Discovery Start. */ -#define POST_STAGE_BOOT_TARGET_DISCOVERY_DONE (2561)	/* Boot Target -						Discovery Done. */ -#define POST_STAGE_RC_OPTION_SET        (2816)	/* Remote configuration -						option is set in  SEEPROM  */ -#define POST_STAGE_SWITCH_LINK          (2817)	/* Wait for link up on switch */ -#define POST_STAGE_SEND_ICDS_MESSAGE    (2818)	/* Send the ICDS message -						to switch */ -#define POST_STAGE_PERFROM_TFTP         (2819)	/* Download xml using TFTP */ -#define POST_STAGE_PARSE_XML            (2820)	/* Parse XML file */ -#define POST_STAGE_DOWNLOAD_IMAGE       (2821)	/* Download IMAGE from -						TFTP server */ -#define POST_STAGE_FLASH_IMAGE          (2822)	/* Flash the IMAGE */ -#define POST_STAGE_RC_DONE              (2823)	/* Remote configuration -						complete */ -#define POST_STAGE_REBOOT_SYSTEM        (2824)	/* Upgrade IMAGE done, -						reboot required */ -#define POST_STAGE_MAC_ADDRESS          (3072)	/* MAC Address Check */ -#define POST_STAGE_ARMFW_READY          (49152)	/* ARMfw is done with POST -						and ready. */ -#define POST_STAGE_ARMFW_UE             (61440)	/* ARMfw has asserted an -						unrecoverable error. The -						lower 3 hex digits of the -						stage code identify the -						unique error code. -						*/ - -/* This structure defines the format of the MPU semaphore - * register when used for POST. - */ -struct BE_MGMT_HBA_POST_STATUS_STRUCT_AMAP { -	u8 stage[16];	/* DWORD 0 */ -	u8 rsvd0[10];	/* DWORD 0 */ -	u8 iscsi_driver_loaded;	/* DWORD 0 */ -	u8 option_rom_installed;	/* DWORD 0 */ -	u8 iscsi_ip_conflict;	/* DWORD 0 */ -	u8 iscsi_no_ip;	/* DWORD 0 */ -	u8 backup_fw;	/* DWORD 0 */ -	u8 error;		/* DWORD 0 */ -} __packed; -struct MGMT_HBA_POST_STATUS_STRUCT_AMAP { -	u32 dw[1]; -}; - -/* --- MGMT_HBA_POST_DUMMY_BITS_ENUM --- */ -#define POST_BIT_ISCSI_LOADED           (26) -#define POST_BIT_OPTROM_INST            (27) -#define POST_BIT_BAD_IP_ADDR            (28) -#define POST_BIT_NO_IP_ADDR             (29) -#define POST_BIT_BACKUP_FW              (30) -#define POST_BIT_ERROR                  (31) - -/* --- MGMT_HBA_POST_DUMMY_VALUES_ENUM --- */ -#define POST_ISCSI_DRIVER_LOADED        (67108864) -#define POST_OPTROM_INSTALLED           (134217728) -#define POST_ISCSI_IP_ADDRESS_CONFLICT  (268435456) -#define POST_ISCSI_NO_IP_ADDRESS        (536870912) -#define POST_BACKUP_FW_LOADED           (1073741824) -#define POST_FATAL_ERROR                (2147483648) - -#endif /* __post_codes_amap_h__ */ diff --git a/drivers/staging/benet/regmap.h b/drivers/staging/benet/regmap.h deleted file mode 100644 index e816ba210e8..00000000000 --- a/drivers/staging/benet/regmap.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2005 - 2008 ServerEngines - * All rights reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation.  The full GNU General - * Public License is included in this distribution in the file called COPYING. - * - * Contact Information: - * linux-drivers@serverengines.com - * - * ServerEngines - * 209 N. Fair Oaks Ave - * Sunnyvale, CA 94085 - */ -/* - * Autogenerated by srcgen version: 0127 - */ -#ifndef __regmap_amap_h__ -#define __regmap_amap_h__ -#include "pcicfg.h" -#include "ep.h" -#include "cev.h" -#include "mpu.h" -#include "doorbells.h" - -/* - * This is the control and status register map for BladeEngine, showing - * the relative size and offset of each sub-module. The CSR registers - * are identical for the network and storage PCI functions. The - * CSR map is shown below, followed by details of each block, - * in sub-sections.  The sub-sections begin with a description - * of CSRs that are instantiated in multiple blocks. - */ -struct BE_BLADE_ENGINE_CSRMAP_AMAP { -	struct BE_MPU_CSRMAP_AMAP mpu; -	u8 rsvd0[8192];	/* DWORD 256 */ -	u8 rsvd1[8192];	/* DWORD 512 */ -	struct BE_CEV_CSRMAP_AMAP cev; -	u8 rsvd2[8192];	/* DWORD 1024 */ -	u8 rsvd3[8192];	/* DWORD 1280 */ -	u8 rsvd4[8192];	/* DWORD 1536 */ -	u8 rsvd5[8192];	/* DWORD 1792 */ -	u8 rsvd6[8192];	/* DWORD 2048 */ -	u8 rsvd7[8192];	/* DWORD 2304 */ -	u8 rsvd8[8192];	/* DWORD 2560 */ -	u8 rsvd9[8192];	/* DWORD 2816 */ -	u8 rsvd10[8192];	/* DWORD 3072 */ -	u8 rsvd11[8192];	/* DWORD 3328 */ -	u8 rsvd12[8192];	/* DWORD 3584 */ -	u8 rsvd13[8192];	/* DWORD 3840 */ -	u8 rsvd14[8192];	/* DWORD 4096 */ -	u8 rsvd15[8192];	/* DWORD 4352 */ -	u8 rsvd16[8192];	/* DWORD 4608 */ -	u8 rsvd17[8192];	/* DWORD 4864 */ -	u8 rsvd18[8192];	/* DWORD 5120 */ -	u8 rsvd19[8192];	/* DWORD 5376 */ -	u8 rsvd20[8192];	/* DWORD 5632 */ -	u8 rsvd21[8192];	/* DWORD 5888 */ -	u8 rsvd22[8192];	/* DWORD 6144 */ -	u8 rsvd23[17152][32];	/* DWORD 6400 */ -} __packed; -struct BLADE_ENGINE_CSRMAP_AMAP { -	u32 dw[23552]; -}; - -#endif /* __regmap_amap_h__ */ diff --git a/drivers/staging/go7007/snd-go7007.c b/drivers/staging/go7007/snd-go7007.c index a7de401f61a..cd19be6c00e 100644 --- a/drivers/staging/go7007/snd-go7007.c +++ b/drivers/staging/go7007/snd-go7007.c @@ -248,10 +248,11 @@ int go7007_snd_init(struct go7007 *go)  	spin_lock_init(&gosnd->lock);  	gosnd->hw_ptr = gosnd->w_idx = gosnd->avail = 0;  	gosnd->capturing = 0; -	gosnd->card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (gosnd->card == NULL) { +	ret = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, +			      &gosnd->card); +	if (ret < 0) {  		kfree(gosnd); -		return -ENOMEM; +		return ret;  	}  	ret = snd_device_new(gosnd->card, SNDRV_DEV_LOWLEVEL, go,  			&go7007_snd_device_ops); diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c index 5ed4ae07bac..6789089e246 100644 --- a/drivers/usb/atm/cxacru.c +++ b/drivers/usb/atm/cxacru.c @@ -485,7 +485,7 @@ static int cxacru_cm(struct cxacru_data *instance, enum cxacru_cm_request cm,  			usb_err(instance->usbatm, "requested transfer size too large (%d, %d)\n",  				wbuflen, rbuflen);  		ret = -ENOMEM; -		goto fail; +		goto err;  	}  	mutex_lock(&instance->cm_serialize); @@ -565,6 +565,7 @@ static int cxacru_cm(struct cxacru_data *instance, enum cxacru_cm_request cm,  	dbg("cm %#x", cm);  fail:  	mutex_unlock(&instance->cm_serialize); +err:  	return ret;  } diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 0f5c05f6f9d..c40a9b284cc 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c @@ -50,6 +50,7 @@  static struct usb_device_id usbtmc_devices[] = {  	{ USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 0), }, +	{ USB_INTERFACE_INFO(USB_CLASS_APP_SPEC, 3, 1), },  	{ 0, } /* terminating entry */  };  MODULE_DEVICE_TABLE(usb, usbtmc_devices); @@ -106,12 +107,13 @@ static int usbtmc_open(struct inode *inode, struct file *filp)  {  	struct usb_interface *intf;  	struct usbtmc_device_data *data; -	int retval = -ENODEV; +	int retval = 0;  	intf = usb_find_interface(&usbtmc_driver, iminor(inode));  	if (!intf) {  		printk(KERN_ERR KBUILD_MODNAME  		       ": can not find device for minor %d", iminor(inode)); +		retval = -ENODEV;  		goto exit;  	} diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 7513bb083c1..6585f527e38 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -359,11 +359,6 @@ static void destroy_async(struct dev_state *ps, struct list_head *list)  		spin_lock_irqsave(&ps->lock, flags);  	}  	spin_unlock_irqrestore(&ps->lock, flags); -	as = async_getcompleted(ps); -	while (as) { -		free_async(as); -		as = async_getcompleted(ps); -	}  }  static void destroy_async_on_interface(struct dev_state *ps, @@ -643,6 +638,7 @@ static int usbdev_release(struct inode *inode, struct file *file)  	struct dev_state *ps = file->private_data;  	struct usb_device *dev = ps->dev;  	unsigned int ifnum; +	struct async *as;  	usb_lock_device(dev); @@ -661,6 +657,12 @@ static int usbdev_release(struct inode *inode, struct file *file)  	usb_unlock_device(dev);  	usb_put_dev(dev);  	put_pid(ps->disc_pid); + +	as = async_getcompleted(ps); +	while (as) { +		free_async(as); +		as = async_getcompleted(ps); +	}  	kfree(ps);  	return 0;  } diff --git a/drivers/usb/gadget/gmidi.c b/drivers/usb/gadget/gmidi.c index 60d3f9e9b51..14e09abbddf 100644 --- a/drivers/usb/gadget/gmidi.c +++ b/drivers/usb/gadget/gmidi.c @@ -1099,10 +1099,9 @@ static int gmidi_register_card(struct gmidi_device *dev)  		.dev_free = gmidi_snd_free,  	}; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (!card) { -		ERROR(dev, "snd_card_new failed\n"); -		err = -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) { +		ERROR(dev, "snd_card_create failed\n");  		goto fail;  	}  	dev->card = card; diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 3712b925b31..ecc9b66c03c 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c @@ -1095,7 +1095,8 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)  	prev->qh_next = qh->qh_next;  	wmb (); -	if (unlikely (ehci_to_hcd(ehci)->state == HC_STATE_HALT)) { +	/* If the controller isn't running, we don't have to wait for it */ +	if (unlikely(!HC_IS_RUNNING(ehci_to_hcd(ehci)->state))) {  		/* if (unlikely (qh->reclaim != 0))  		 *	this will recurse, probably not much  		 */ diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 07bcb931021..1d0b49e3f19 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -1536,7 +1536,7 @@ itd_link_urb (  					struct ehci_itd, itd_list);  			list_move_tail (&itd->itd_list, &stream->td_list);  			itd->stream = iso_stream_get (stream); -			itd->urb = usb_get_urb (urb); +			itd->urb = urb;  			itd_init (ehci, stream, itd);  		} @@ -1645,7 +1645,7 @@ itd_complete (  	(void) disable_periodic(ehci);  	ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; -	if (unlikely (list_empty (&stream->td_list))) { +	if (unlikely(list_is_singular(&stream->td_list))) {  		ehci_to_hcd(ehci)->self.bandwidth_allocated  				-= stream->bandwidth;  		ehci_vdbg (ehci, @@ -1656,7 +1656,6 @@ itd_complete (  	iso_stream_put (ehci, stream);  done: -	usb_put_urb(urb);  	itd->urb = NULL;  	if (ehci->clock_frame != itd->frame || itd->index[7] != -1) {  		/* OK to recycle this ITD now. */ @@ -1949,7 +1948,7 @@ sitd_link_urb (  				struct ehci_sitd, sitd_list);  		list_move_tail (&sitd->sitd_list, &stream->td_list);  		sitd->stream = iso_stream_get (stream); -		sitd->urb = usb_get_urb (urb); +		sitd->urb = urb;  		sitd_patch(ehci, stream, sitd, sched, packet);  		sitd_link (ehci, (next_uframe >> 3) % ehci->periodic_size, @@ -2034,7 +2033,7 @@ sitd_complete (  	(void) disable_periodic(ehci);  	ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--; -	if (list_empty (&stream->td_list)) { +	if (list_is_singular(&stream->td_list)) {  		ehci_to_hcd(ehci)->self.bandwidth_allocated  				-= stream->bandwidth;  		ehci_vdbg (ehci, @@ -2045,7 +2044,6 @@ sitd_complete (  	iso_stream_put (ehci, stream);  	/* OK to recycle this SITD now that its completion callback ran. */  done: -	usb_put_urb(urb);  	sitd->urb = NULL;  	sitd->stream = NULL;  	list_move(&sitd->sitd_list, &stream->free_list); diff --git a/drivers/usb/image/mdc800.c b/drivers/usb/image/mdc800.c index 878c77ca086..972f20b3406 100644 --- a/drivers/usb/image/mdc800.c +++ b/drivers/usb/image/mdc800.c @@ -499,6 +499,7 @@ static int mdc800_usb_probe (struct usb_interface *intf,  	retval = usb_register_dev(intf, &mdc800_class);  	if (retval) {  		dev_err(&intf->dev, "Not able to get a minor for this device.\n"); +		mutex_unlock(&mdc800->io_lock);  		return -ENODEV;  	} diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c index 7b6922e08ed..20352654201 100644 --- a/drivers/usb/misc/adutux.c +++ b/drivers/usb/misc/adutux.c @@ -376,7 +376,7 @@ static int adu_release(struct inode *inode, struct file *file)  	if (dev->open_count <= 0) {  		dbg(1," %s : device not opened", __func__);  		retval = -ENODEV; -		goto exit; +		goto unlock;  	}  	adu_release_internal(dev); @@ -385,9 +385,9 @@ static int adu_release(struct inode *inode, struct file *file)  		if (!dev->open_count)	/* ... and we're the last user */  			adu_delete(dev);  	} - -exit: +unlock:  	mutex_unlock(&adutux_mutex); +exit:  	dbg(2," %s : leave, return value %d", __func__, retval);  	return retval;  } diff --git a/drivers/usb/misc/vstusb.c b/drivers/usb/misc/vstusb.c index 63dff9ba73c..f26ea8dc157 100644 --- a/drivers/usb/misc/vstusb.c +++ b/drivers/usb/misc/vstusb.c @@ -401,6 +401,7 @@ static ssize_t vstusb_write(struct file *file, const char __user *buffer,  	}  	if (copy_from_user(buf, buffer, count)) { +		mutex_unlock(&vstdev->lock);  		dev_err(&dev->dev, "%s: can't copy_from_user\n", __func__);  		retval = -EFAULT;  		goto exit; diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index 027f4b7dde8..9b4082b58c5 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c @@ -79,6 +79,7 @@ static struct usb_device_id id_table [] = {  	{ USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */  	{ USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */  	{ USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ +	{ USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */  	{ USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */  	{ USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */  	{ USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index f92f4d77337..ae84c326a54 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -663,6 +663,11 @@ static struct usb_device_id id_table_combined [] = {  	{ USB_DEVICE(ALTI2_VID, ALTI2_N3_PID) },  	{ USB_DEVICE(FTDI_VID, DIEBOLD_BCS_SE923_PID) },  	{ USB_DEVICE(FTDI_VID, FTDI_NDI_HUC_PID) }, +	{ USB_DEVICE(ATMEL_VID, STK541_PID) }, +	{ USB_DEVICE(DE_VID, STB_PID) }, +	{ USB_DEVICE(DE_VID, WHT_PID) }, +	{ USB_DEVICE(ADI_VID, ADI_GNICE_PID), +		.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },  	{ },					/* Optional parameter entry */  	{ }					/* Terminating entry */  }; diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index e300c840f8c..daaf63db0b5 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h @@ -893,6 +893,26 @@  #define DIEBOLD_BCS_SE923_PID	0xfb99  /* + * Atmel STK541 + */ +#define ATMEL_VID		0x03eb /* Vendor ID */ +#define STK541_PID		0x2109 /* Zigbee Controller */ + +/* + * Dresden Elektronic Sensor Terminal Board + */ +#define DE_VID			0x1cf1 /* Vendor ID */ +#define STB_PID			0x0001 /* Sensor Terminal Board */ +#define WHT_PID			0x0004 /* Wireless Handheld Terminal */ + +/* + * Blackfin gnICE JTAG + * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice + */ +#define ADI_VID 		0x0456 +#define ADI_GNICE_PID 		0xF000 + +/*   *   BmRequestType:  1100 0000b   *   bRequest:       FTDI_E2_READ   *   wValue:         0 diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index b7c132bded7..61ebddc4849 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -89,6 +89,7 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po  #define OPTION_PRODUCT_ETNA_MODEM_GT		0x7041  #define OPTION_PRODUCT_ETNA_MODEM_EX		0x7061  #define OPTION_PRODUCT_ETNA_KOI_MODEM		0x7100 +#define OPTION_PRODUCT_GTM380_MODEM		0x7201  #define HUAWEI_VENDOR_ID			0x12D1  #define HUAWEI_PRODUCT_E600			0x1001 @@ -197,6 +198,7 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po  /* OVATION PRODUCTS */  #define NOVATELWIRELESS_PRODUCT_MC727		0x4100  #define NOVATELWIRELESS_PRODUCT_MC950D		0x4400 +#define NOVATELWIRELESS_PRODUCT_U727		0x5010  /* FUTURE NOVATEL PRODUCTS */  #define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED	0X6000 @@ -288,15 +290,11 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po  /* ZTE PRODUCTS */  #define ZTE_VENDOR_ID				0x19d2 +#define ZTE_PRODUCT_MF622			0x0001  #define ZTE_PRODUCT_MF628			0x0015  #define ZTE_PRODUCT_MF626			0x0031  #define ZTE_PRODUCT_CDMA_TECH			0xfffe -/* Ericsson products */ -#define ERICSSON_VENDOR_ID			0x0bdb -#define ERICSSON_PRODUCT_F3507G_1		0x1900 -#define ERICSSON_PRODUCT_F3507G_2		0x1902 -  #define BENQ_VENDOR_ID				0x04a5  #define BENQ_PRODUCT_H10			0x4068 @@ -325,6 +323,7 @@ static struct usb_device_id option_ids[] = {  	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },  	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },  	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) }, +	{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTM380_MODEM) },  	{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q101) },  	{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_Q111) },  	{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) }, @@ -415,6 +414,7 @@ static struct usb_device_id option_ids[] = {  	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */  	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */  	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */ +	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel MC727/U727/USB727 */  	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */  	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */  	{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */ @@ -442,7 +442,6 @@ static struct usb_device_id option_ids[] = {  	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) },	/* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */  	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) },	/* Dell Wireless HSDPA 5520 */  	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) },	/* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ -	{ USB_DEVICE(DELL_VENDOR_ID, 0x8147) },					/* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */  	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) },	/* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */  	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) },	/* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */  	{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, 	/* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */ @@ -510,11 +509,10 @@ static struct usb_device_id option_ids[] = {  	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */  	{ USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */  	{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, +	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622) },  	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },  	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },  	{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) }, -	{ USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G_1) }, -	{ USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G_2) },  	{ USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },  	{ USB_DEVICE(0x1da5, 0x4515) }, /* BenQ H20 */  	{ } /* Terminating entry */ diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 6f59c8e510e..cfde74a6faa 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h @@ -226,7 +226,7 @@ UNUSUAL_DEV(  0x0421, 0x047c, 0x0370, 0x0610,  		US_FL_MAX_SECTORS_64 ),  /* Reported by Manuel Osdoba <manuel.osdoba@tu-ilmenau.de> */ -UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x0452, +UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x9999,  		"Nokia",  		"Nokia 6233",  		US_SC_DEVICE, US_PR_DEVICE, NULL, @@ -951,7 +951,9 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001,  		US_FL_FIX_CAPACITY ),  /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */ -UNUSUAL_DEV( 0x067b, 0x2507, 0x0100, 0x0100, +/* Change to bcdDeviceMin (0x0100 to 0x0001) reported by + * Thomas Bartosik <tbartdev@gmx-topmail.de> */ +UNUSUAL_DEV( 0x067b, 0x2507, 0x0001, 0x0100,  		"Prolific Technology Inc.",  		"Mass Storage Device",  		US_SC_DEVICE, US_PR_DEVICE, NULL, @@ -1390,6 +1392,16 @@ UNUSUAL_DEV( 0x0af0, 0x7401, 0x0000, 0x0000,  		US_SC_DEVICE, US_PR_DEVICE, NULL,  		0 ), +/* Reported by Jan Dumon <j.dumon@option.com> + * This device (wrongly) has a vendor-specific device descriptor. + * The entry is needed so usb-storage can bind to it's mass-storage + * interface as an interface driver */ +UNUSUAL_DEV( 0x0af0, 0x7501, 0x0000, 0x0000, +		"Option", +		"GI 0431 SD-Card", +		US_SC_DEVICE, US_PR_DEVICE, NULL, +		0 ), +  /* Reported by Ben Efros <ben@pc-doctor.com> */  UNUSUAL_DEV( 0x0bc2, 0x3010, 0x0000, 0x0000,  		"Seagate", diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c index 238a96aee3a..613a5fc490d 100644 --- a/drivers/usb/wusbcore/wa-xfer.c +++ b/drivers/usb/wusbcore/wa-xfer.c @@ -921,8 +921,10 @@ static void wa_urb_enqueue_b(struct wa_xfer *xfer)  	result = -ENODEV;  	/* FIXME: segmentation broken -- kills DWA */  	mutex_lock(&wusbhc->mutex);		/* get a WUSB dev */ -	if (urb->dev == NULL) +	if (urb->dev == NULL) { +		mutex_unlock(&wusbhc->mutex);  		goto error_dev_gone; +	}  	wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, urb->dev);  	if (wusb_dev == NULL) {  		mutex_unlock(&wusbhc->mutex); diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c index 2181ce4d7eb..35e8eb02b9e 100644 --- a/drivers/video/aty/aty128fb.c +++ b/drivers/video/aty/aty128fb.c @@ -1853,13 +1853,14 @@ static void aty128_bl_exit(struct backlight_device *bd)   *  Initialisation   */ -#ifdef CONFIG_PPC_PMAC +#ifdef CONFIG_PPC_PMAC__disabled  static void aty128_early_resume(void *data)  {          struct aty128fb_par *par = data;  	if (try_acquire_console_sem())  		return; +	pci_restore_state(par->pdev);  	aty128_do_resume(par->pdev);  	release_console_sem();  } @@ -1907,7 +1908,14 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i  		/* Indicate sleep capability */  		if (par->chip_gen == rage_M3) {  			pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, NULL, 0, 1); +#if 0 /* Disable the early video resume hack for now as it's causing problems, among +       * others we now rely on the PCI core restoring the config space for us, which +       * isn't the case with that hack, and that code path causes various things to +       * be called with interrupts off while they shouldn't. I'm leaving the code in +       * as it can be useful for debugging purposes +       */  			pmac_set_early_video_resume(aty128_early_resume, par); +#endif  		}  		/* Find default mode */ diff --git a/drivers/video/aty/radeon_pm.c b/drivers/video/aty/radeon_pm.c index ca5f0dc2854..c6d7cc76516 100644 --- a/drivers/video/aty/radeon_pm.c +++ b/drivers/video/aty/radeon_pm.c @@ -2507,6 +2507,25 @@ static void radeon_reinitialize_QW(struct radeonfb_info *rinfo)  #endif /* CONFIG_PPC_OF */ +static void radeonfb_whack_power_state(struct radeonfb_info *rinfo, pci_power_t state) +{ +	u16 pwr_cmd; + +	for (;;) { +		pci_read_config_word(rinfo->pdev, +				     rinfo->pm_reg+PCI_PM_CTRL, +				     &pwr_cmd); +		if (pwr_cmd & 2) +			break; +		pwr_cmd = (pwr_cmd & ~PCI_PM_CTRL_STATE_MASK) | 2; +		pci_write_config_word(rinfo->pdev, +				      rinfo->pm_reg+PCI_PM_CTRL, +				      pwr_cmd); +		msleep(500); +	} +	rinfo->pdev->current_state = state; +} +  static void radeon_set_suspend(struct radeonfb_info *rinfo, int suspend)  {  	u32 tmp; @@ -2558,6 +2577,11 @@ static void radeon_set_suspend(struct radeonfb_info *rinfo, int suspend)  		/* Switch PCI power management to D2. */  		pci_disable_device(rinfo->pdev);  		pci_save_state(rinfo->pdev); +		/* The chip seems to need us to whack the PM register +		 * repeatedly until it sticks. We do that -prior- to +		 * calling pci_set_power_state() +		 */ +		radeonfb_whack_power_state(rinfo, PCI_D2);  		pci_set_power_state(rinfo->pdev, PCI_D2);  	} else {  		printk(KERN_DEBUG "radeonfb (%s): switching to D0 state...\n", @@ -2762,12 +2786,13 @@ int radeonfb_pci_resume(struct pci_dev *pdev)  	return rc;  } -#ifdef CONFIG_PPC_OF +#ifdef CONFIG_PPC_OF__disabled  static void radeonfb_early_resume(void *data)  {          struct radeonfb_info *rinfo = data;  	rinfo->no_schedule = 1; +	pci_restore_state(rinfo->pdev);  	radeonfb_pci_resume(rinfo->pdev);  	rinfo->no_schedule = 0;  } @@ -2834,7 +2859,14 @@ void radeonfb_pm_init(struct radeonfb_info *rinfo, int dynclk, int ignore_devlis  		 */  		if (rinfo->pm_mode != radeon_pm_none) {  			pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, rinfo->of_node, 0, 1); +#if 0 /* Disable the early video resume hack for now as it's causing problems, among +       * others we now rely on the PCI core restoring the config space for us, which +       * isn't the case with that hack, and that code path causes various things to +       * be called with interrupts off while they shouldn't. I'm leaving the code in +       * as it can be useful for debugging purposes +       */  			pmac_set_early_video_resume(radeonfb_early_resume, rinfo); +#endif  		}  #if 0 diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c index a24e680d2b9..2e940199fc8 100644 --- a/drivers/video/i810/i810_main.c +++ b/drivers/video/i810/i810_main.c @@ -993,6 +993,7 @@ static int i810_check_params(struct fb_var_screeninfo *var,  	struct i810fb_par *par = info->par;  	int line_length, vidmem, mode_valid = 0, retval = 0;  	u32 vyres = var->yres_virtual, vxres = var->xres_virtual; +  	/*  	 *  Memory limit  	 */ @@ -1002,12 +1003,12 @@ static int i810_check_params(struct fb_var_screeninfo *var,  	if (vidmem > par->fb.size) {  		vyres = par->fb.size/line_length;  		if (vyres < var->yres) { -			vyres = yres; +			vyres = info->var.yres;  			vxres = par->fb.size/vyres;  			vxres /= var->bits_per_pixel >> 3;  			line_length = get_line_length(par, vxres,   						      var->bits_per_pixel); -			vidmem = line_length * yres; +			vidmem = line_length * info->var.yres;  			if (vxres < var->xres) {  				printk("i810fb: required video memory, "  				       "%d bytes, for %dx%d-%d (virtual) " diff --git a/drivers/video/logo/logo_linux_clut224.ppm b/drivers/video/logo/logo_linux_clut224.ppm index 3c14e43b82f..de93ff3fc1a 100644 --- a/drivers/video/logo/logo_linux_clut224.ppm +++ b/drivers/video/logo/logo_linux_clut224.ppm @@ -1,1604 +1,2828 @@  P3 -# Standard 224-color Linux logo -80 80 +145 113  255 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6   6   6   6  10  10  10  10  10  10 - 10  10  10   6   6   6   6   6   6   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   6   6   6  10  10  10  14  14  14 - 22  22  22  26  26  26  30  30  30  34  34  34 - 30  30  30  30  30  30  26  26  26  18  18  18 - 14  14  14  10  10  10   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   1   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6  14  14  14  26  26  26  42  42  42 - 54  54  54  66  66  66  78  78  78  78  78  78 - 78  78  78  74  74  74  66  66  66  54  54  54 - 42  42  42  26  26  26  18  18  18  10  10  10 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   1   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 22  22  22  42  42  42  66  66  66  86  86  86 - 66  66  66  38  38  38  38  38  38  22  22  22 - 26  26  26  34  34  34  54  54  54  66  66  66 - 86  86  86  70  70  70  46  46  46  26  26  26 - 14  14  14   6   6   6   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   1   0   0   1   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  10  10  10  26  26  26 - 50  50  50  82  82  82  58  58  58   6   6   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  6   6   6  54  54  54  86  86  86  66  66  66 - 38  38  38  18  18  18   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   6   6   6  22  22  22  50  50  50 - 78  78  78  34  34  34   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   6   6   6  70  70  70 - 78  78  78  46  46  46  22  22  22   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   1   0   0   1   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6  18  18  18  42  42  42  82  82  82 - 26  26  26   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  14  14  14 - 46  46  46  34  34  34   6   6   6   2   2   6 - 42  42  42  78  78  78  42  42  42  18  18  18 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   1   0   0   0   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 10  10  10  30  30  30  66  66  66  58  58  58 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  26  26  26 - 86  86  86 101 101 101  46  46  46  10  10  10 -  2   2   6  58  58  58  70  70  70  34  34  34 - 10  10  10   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   1   0   0   1   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 14  14  14  42  42  42  86  86  86  10  10  10 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  30  30  30 - 94  94  94  94  94  94  58  58  58  26  26  26 -  2   2   6   6   6   6  78  78  78  54  54  54 - 22  22  22   6   6   6   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 22  22  22  62  62  62  62  62  62   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  26  26  26 - 54  54  54  38  38  38  18  18  18  10  10  10 -  2   2   6   2   2   6  34  34  34  82  82  82 - 38  38  38  14  14  14   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   1   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 30  30  30  78  78  78  30  30  30   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  10  10  10 - 10  10  10   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  78  78  78 - 50  50  50  18  18  18   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   1   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 38  38  38  86  86  86  14  14  14   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  54  54  54 - 66  66  66  26  26  26   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   1   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 42  42  42  82  82  82   2   2   6   2   2   6 -  2   2   6   6   6   6  10  10  10   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   6   6   6 - 14  14  14  10  10  10   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  18  18  18 - 82  82  82  34  34  34  10  10  10   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   1   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 46  46  46  86  86  86   2   2   6   2   2   6 -  6   6   6   6   6   6  22  22  22  34  34  34 -  6   6   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6  18  18  18  34  34  34 - 10  10  10  50  50  50  22  22  22   2   2   6 -  2   2   6   2   2   6   2   2   6  10  10  10 - 86  86  86  42  42  42  14  14  14   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   1   0   0   1   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 46  46  46  86  86  86   2   2   6   2   2   6 - 38  38  38 116 116 116  94  94  94  22  22  22 - 22  22  22   2   2   6   2   2   6   2   2   6 - 14  14  14  86  86  86 138 138 138 162 162 162 -154 154 154  38  38  38  26  26  26   6   6   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 86  86  86  46  46  46  14  14  14   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 46  46  46  86  86  86   2   2   6  14  14  14 -134 134 134 198 198 198 195 195 195 116 116 116 - 10  10  10   2   2   6   2   2   6   6   6   6 -101  98  89 187 187 187 210 210 210 218 218 218 -214 214 214 134 134 134  14  14  14   6   6   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 86  86  86  50  50  50  18  18  18   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   1   0   0   0 -  0   0   1   0   0   1   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 46  46  46  86  86  86   2   2   6  54  54  54 -218 218 218 195 195 195 226 226 226 246 246 246 - 58  58  58   2   2   6   2   2   6  30  30  30 -210 210 210 253 253 253 174 174 174 123 123 123 -221 221 221 234 234 234  74  74  74   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 70  70  70  58  58  58  22  22  22   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 46  46  46  82  82  82   2   2   6 106 106 106 -170 170 170  26  26  26  86  86  86 226 226 226 -123 123 123  10  10  10  14  14  14  46  46  46 -231 231 231 190 190 190   6   6   6  70  70  70 - 90  90  90 238 238 238 158 158 158   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 70  70  70  58  58  58  22  22  22   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   1   0   0   0 -  0   0   1   0   0   1   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 42  42  42  86  86  86   6   6   6 116 116 116 -106 106 106   6   6   6  70  70  70 149 149 149 -128 128 128  18  18  18  38  38  38  54  54  54 -221 221 221 106 106 106   2   2   6  14  14  14 - 46  46  46 190 190 190 198 198 198   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 74  74  74  62  62  62  22  22  22   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   1   0   0   0 -  0   0   1   0   0   0   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 42  42  42  94  94  94  14  14  14 101 101 101 -128 128 128   2   2   6  18  18  18 116 116 116 -118  98  46 121  92   8 121  92   8  98  78  10 -162 162 162 106 106 106   2   2   6   2   2   6 -  2   2   6 195 195 195 195 195 195   6   6   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 74  74  74  62  62  62  22  22  22   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   1   0   0   1 -  0   0   1   0   0   0   0   0   1   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 38  38  38  90  90  90  14  14  14  58  58  58 -210 210 210  26  26  26  54  38   6 154 114  10 -226 170  11 236 186  11 225 175  15 184 144  12 -215 174  15 175 146  61  37  26   9   2   2   6 - 70  70  70 246 246 246 138 138 138   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 70  70  70  66  66  66  26  26  26   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 38  38  38  86  86  86  14  14  14  10  10  10 -195 195 195 188 164 115 192 133   9 225 175  15 -239 182  13 234 190  10 232 195  16 232 200  30 -245 207  45 241 208  19 232 195  16 184 144  12 -218 194 134 211 206 186  42  42  42   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 50  50  50  74  74  74  30  30  30   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 34  34  34  86  86  86  14  14  14   2   2   6 -121  87  25 192 133   9 219 162  10 239 182  13 -236 186  11 232 195  16 241 208  19 244 214  54 -246 218  60 246 218  38 246 215  20 241 208  19 -241 208  19 226 184  13 121  87  25   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 50  50  50  82  82  82  34  34  34  10  10  10 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 34  34  34  82  82  82  30  30  30  61  42   6 -180 123   7 206 145  10 230 174  11 239 182  13 -234 190  10 238 202  15 241 208  19 246 218  74 -246 218  38 246 215  20 246 215  20 246 215  20 -226 184  13 215 174  15 184 144  12   6   6   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 26  26  26  94  94  94  42  42  42  14  14  14 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 30  30  30  78  78  78  50  50  50 104  69   6 -192 133   9 216 158  10 236 178  12 236 186  11 -232 195  16 241 208  19 244 214  54 245 215  43 -246 215  20 246 215  20 241 208  19 198 155  10 -200 144  11 216 158  10 156 118  10   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  6   6   6  90  90  90  54  54  54  18  18  18 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 30  30  30  78  78  78  46  46  46  22  22  22 -137  92   6 210 162  10 239 182  13 238 190  10 -238 202  15 241 208  19 246 215  20 246 215  20 -241 208  19 203 166  17 185 133  11 210 150  10 -216 158  10 210 150  10 102  78  10   2   2   6 -  6   6   6  54  54  54  14  14  14   2   2   6 -  2   2   6  62  62  62  74  74  74  30  30  30 - 10  10  10   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 34  34  34  78  78  78  50  50  50   6   6   6 - 94  70  30 139 102  15 190 146  13 226 184  13 -232 200  30 232 195  16 215 174  15 190 146  13 -168 122  10 192 133   9 210 150  10 213 154  11 -202 150  34 182 157 106 101  98  89   2   2   6 -  2   2   6  78  78  78 116 116 116  58  58  58 -  2   2   6  22  22  22  90  90  90  46  46  46 - 18  18  18   6   6   6   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 38  38  38  86  86  86  50  50  50   6   6   6 -128 128 128 174 154 114 156 107  11 168 122  10 -198 155  10 184 144  12 197 138  11 200 144  11 -206 145  10 206 145  10 197 138  11 188 164 115 -195 195 195 198 198 198 174 174 174  14  14  14 -  2   2   6  22  22  22 116 116 116 116 116 116 - 22  22  22   2   2   6  74  74  74  70  70  70 - 30  30  30  10  10  10   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  18  18  18 - 50  50  50 101 101 101  26  26  26  10  10  10 -138 138 138 190 190 190 174 154 114 156 107  11 -197 138  11 200 144  11 197 138  11 192 133   9 -180 123   7 190 142  34 190 178 144 187 187 187 -202 202 202 221 221 221 214 214 214  66  66  66 -  2   2   6   2   2   6  50  50  50  62  62  62 -  6   6   6   2   2   6  10  10  10  90  90  90 - 50  50  50  18  18  18   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  10  10  10  34  34  34 - 74  74  74  74  74  74   2   2   6   6   6   6 -144 144 144 198 198 198 190 190 190 178 166 146 -154 121  60 156 107  11 156 107  11 168 124  44 -174 154 114 187 187 187 190 190 190 210 210 210 -246 246 246 253 253 253 253 253 253 182 182 182 -  6   6   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  62  62  62 - 74  74  74  34  34  34  14  14  14   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  10  10  10  22  22  22  54  54  54 - 94  94  94  18  18  18   2   2   6  46  46  46 -234 234 234 221 221 221 190 190 190 190 190 190 -190 190 190 187 187 187 187 187 187 190 190 190 -190 190 190 195 195 195 214 214 214 242 242 242 -253 253 253 253 253 253 253 253 253 253 253 253 - 82  82  82   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  14  14  14 - 86  86  86  54  54  54  22  22  22   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6  18  18  18  46  46  46  90  90  90 - 46  46  46  18  18  18   6   6   6 182 182 182 -253 253 253 246 246 246 206 206 206 190 190 190 -190 190 190 190 190 190 190 190 190 190 190 190 -206 206 206 231 231 231 250 250 250 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -202 202 202  14  14  14   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 42  42  42  86  86  86  42  42  42  18  18  18 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 14  14  14  38  38  38  74  74  74  66  66  66 -  2   2   6   6   6   6  90  90  90 250 250 250 -253 253 253 253 253 253 238 238 238 198 198 198 -190 190 190 190 190 190 195 195 195 221 221 221 -246 246 246 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253  82  82  82   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6  78  78  78  70  70  70  34  34  34 - 14  14  14   6   6   6   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 34  34  34  66  66  66  78  78  78   6   6   6 -  2   2   6  18  18  18 218 218 218 253 253 253 -253 253 253 253 253 253 253 253 253 246 246 246 -226 226 226 231 231 231 246 246 246 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 178 178 178   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6  18  18  18  90  90  90  62  62  62 - 30  30  30  10  10  10   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  10  10  10  26  26  26 - 58  58  58  90  90  90  18  18  18   2   2   6 -  2   2   6 110 110 110 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -250 250 250 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 231 231 231  18  18  18   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6  18  18  18  94  94  94 - 54  54  54  26  26  26  10  10  10   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   6   6   6  22  22  22  50  50  50 - 90  90  90  26  26  26   2   2   6   2   2   6 - 14  14  14 195 195 195 250 250 250 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -250 250 250 242 242 242  54  54  54   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6  38  38  38 - 86  86  86  50  50  50  22  22  22   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6  14  14  14  38  38  38  82  82  82 - 34  34  34   2   2   6   2   2   6   2   2   6 - 42  42  42 195 195 195 246 246 246 253 253 253 -253 253 253 253 253 253 253 253 253 250 250 250 -242 242 242 242 242 242 250 250 250 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 250 250 250 246 246 246 238 238 238 -226 226 226 231 231 231 101 101 101   6   6   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 - 38  38  38  82  82  82  42  42  42  14  14  14 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 10  10  10  26  26  26  62  62  62  66  66  66 -  2   2   6   2   2   6   2   2   6   6   6   6 - 70  70  70 170 170 170 206 206 206 234 234 234 -246 246 246 250 250 250 250 250 250 238 238 238 -226 226 226 231 231 231 238 238 238 250 250 250 -250 250 250 250 250 250 246 246 246 231 231 231 -214 214 214 206 206 206 202 202 202 202 202 202 -198 198 198 202 202 202 182 182 182  18  18  18 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6  62  62  62  66  66  66  30  30  30 - 10  10  10   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 14  14  14  42  42  42  82  82  82  18  18  18 -  2   2   6   2   2   6   2   2   6  10  10  10 - 94  94  94 182 182 182 218 218 218 242 242 242 -250 250 250 253 253 253 253 253 253 250 250 250 -234 234 234 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 246 246 246 -238 238 238 226 226 226 210 210 210 202 202 202 -195 195 195 195 195 195 210 210 210 158 158 158 -  6   6   6  14  14  14  50  50  50  14  14  14 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   6   6   6  86  86  86  46  46  46 - 18  18  18   6   6   6   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 22  22  22  54  54  54  70  70  70   2   2   6 -  2   2   6  10  10  10   2   2   6  22  22  22 -166 166 166 231 231 231 250 250 250 253 253 253 -253 253 253 253 253 253 253 253 253 250 250 250 -242 242 242 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 246 246 246 -231 231 231 206 206 206 198 198 198 226 226 226 - 94  94  94   2   2   6   6   6   6  38  38  38 - 30  30  30   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6  62  62  62  66  66  66 - 26  26  26  10  10  10   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 30  30  30  74  74  74  50  50  50   2   2   6 - 26  26  26  26  26  26   2   2   6 106 106 106 -238 238 238 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 246 246 246 218 218 218 202 202 202 -210 210 210  14  14  14   2   2   6   2   2   6 - 30  30  30  22  22  22   2   2   6   2   2   6 -  2   2   6   2   2   6  18  18  18  86  86  86 - 42  42  42  14  14  14   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 42  42  42  90  90  90  22  22  22   2   2   6 - 42  42  42   2   2   6  18  18  18 218 218 218 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 250 250 250 221 221 221 -218 218 218 101 101 101   2   2   6  14  14  14 - 18  18  18  38  38  38  10  10  10   2   2   6 -  2   2   6   2   2   6   2   2   6  78  78  78 - 58  58  58  22  22  22   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  18  18  18 - 54  54  54  82  82  82   2   2   6  26  26  26 - 22  22  22   2   2   6 123 123 123 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 250 250 250 -238 238 238 198 198 198   6   6   6  38  38  38 - 58  58  58  26  26  26  38  38  38   2   2   6 -  2   2   6   2   2   6   2   2   6  46  46  46 - 78  78  78  30  30  30  10  10  10   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  10  10  10  30  30  30 - 74  74  74  58  58  58   2   2   6  42  42  42 -  2   2   6  22  22  22 231 231 231 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 250 250 250 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 246 246 246  46  46  46  38  38  38 - 42  42  42  14  14  14  38  38  38  14  14  14 -  2   2   6   2   2   6   2   2   6   6   6   6 - 86  86  86  46  46  46  14  14  14   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   6   6   6  14  14  14  42  42  42 - 90  90  90  18  18  18  18  18  18  26  26  26 -  2   2   6 116 116 116 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 250 250 250 238 238 238 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253  94  94  94   6   6   6 -  2   2   6   2   2   6  10  10  10  34  34  34 -  2   2   6   2   2   6   2   2   6   2   2   6 - 74  74  74  58  58  58  22  22  22   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  10  10  10  26  26  26  66  66  66 - 82  82  82   2   2   6  38  38  38   6   6   6 - 14  14  14 210 210 210 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 246 246 246 242 242 242 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 144 144 144   2   2   6 -  2   2   6   2   2   6   2   2   6  46  46  46 -  2   2   6   2   2   6   2   2   6   2   2   6 - 42  42  42  74  74  74  30  30  30  10  10  10 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6  14  14  14  42  42  42  90  90  90 - 26  26  26   6   6   6  42  42  42   2   2   6 - 74  74  74 250 250 250 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 242 242 242 242 242 242 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 182 182 182   2   2   6 -  2   2   6   2   2   6   2   2   6  46  46  46 -  2   2   6   2   2   6   2   2   6   2   2   6 - 10  10  10  86  86  86  38  38  38  10  10  10 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 10  10  10  26  26  26  66  66  66  82  82  82 -  2   2   6  22  22  22  18  18  18   2   2   6 -149 149 149 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 234 234 234 242 242 242 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 206 206 206   2   2   6 -  2   2   6   2   2   6   2   2   6  38  38  38 -  2   2   6   2   2   6   2   2   6   2   2   6 -  6   6   6  86  86  86  46  46  46  14  14  14 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 18  18  18  46  46  46  86  86  86  18  18  18 -  2   2   6  34  34  34  10  10  10   6   6   6 -210 210 210 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 234 234 234 242 242 242 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 221 221 221   6   6   6 -  2   2   6   2   2   6   6   6   6  30  30  30 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6  82  82  82  54  54  54  18  18  18 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 26  26  26  66  66  66  62  62  62   2   2   6 -  2   2   6  38  38  38  10  10  10  26  26  26 -238 238 238 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 231 231 231 238 238 238 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 231 231 231   6   6   6 -  2   2   6   2   2   6  10  10  10  30  30  30 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6  66  66  66  58  58  58  22  22  22 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 38  38  38  78  78  78   6   6   6   2   2   6 -  2   2   6  46  46  46  14  14  14  42  42  42 -246 246 246 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 231 231 231 242 242 242 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 234 234 234  10  10  10 -  2   2   6   2   2   6  22  22  22  14  14  14 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6  66  66  66  62  62  62  22  22  22 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  18  18  18 - 50  50  50  74  74  74   2   2   6   2   2   6 - 14  14  14  70  70  70  34  34  34  62  62  62 -250 250 250 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 231 231 231 246 246 246 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 234 234 234  14  14  14 -  2   2   6   2   2   6  30  30  30   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6  66  66  66  62  62  62  22  22  22 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  18  18  18 - 54  54  54  62  62  62   2   2   6   2   2   6 -  2   2   6  30  30  30  46  46  46  70  70  70 -250 250 250 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 231 231 231 246 246 246 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 226 226 226  10  10  10 -  2   2   6   6   6   6  30  30  30   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6  66  66  66  58  58  58  22  22  22 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  22  22  22 - 58  58  58  62  62  62   2   2   6   2   2   6 -  2   2   6   2   2   6  30  30  30  78  78  78 -250 250 250 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 231 231 231 246 246 246 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 206 206 206   2   2   6 - 22  22  22  34  34  34  18  14   6  22  22  22 - 26  26  26  18  18  18   6   6   6   2   2   6 -  2   2   6  82  82  82  54  54  54  18  18  18 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  26  26  26 - 62  62  62 106 106 106  74  54  14 185 133  11 -210 162  10 121  92   8   6   6   6  62  62  62 -238 238 238 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 231 231 231 246 246 246 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 158 158 158  18  18  18 - 14  14  14   2   2   6   2   2   6   2   2   6 -  6   6   6  18  18  18  66  66  66  38  38  38 -  6   6   6  94  94  94  50  50  50  18  18  18 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 10  10  10  10  10  10  18  18  18  38  38  38 - 78  78  78 142 134 106 216 158  10 242 186  14 -246 190  14 246 190  14 156 118  10  10  10  10 - 90  90  90 238 238 238 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 231 231 231 250 250 250 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 246 230 190 -238 204  91 238 204  91 181 142  44  37  26   9 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6  38  38  38  46  46  46 - 26  26  26 106 106 106  54  54  54  18  18  18 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   6   6   6  14  14  14  22  22  22 - 30  30  30  38  38  38  50  50  50  70  70  70 -106 106 106 190 142  34 226 170  11 242 186  14 -246 190  14 246 190  14 246 190  14 154 114  10 -  6   6   6  74  74  74 226 226 226 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 231 231 231 250 250 250 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 228 184  62 -241 196  14 241 208  19 232 195  16  38  30  10 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   6   6   6  30  30  30  26  26  26 -203 166  17 154 142  90  66  66  66  26  26  26 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6  18  18  18  38  38  38  58  58  58 - 78  78  78  86  86  86 101 101 101 123 123 123 -175 146  61 210 150  10 234 174  13 246 186  14 -246 190  14 246 190  14 246 190  14 238 190  10 -102  78  10   2   2   6  46  46  46 198 198 198 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 234 234 234 242 242 242 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 224 178  62 -242 186  14 241 196  14 210 166  10  22  18   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   6   6   6 121  92   8 -238 202  15 232 195  16  82  82  82  34  34  34 - 10  10  10   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 14  14  14  38  38  38  70  70  70 154 122  46 -190 142  34 200 144  11 197 138  11 197 138  11 -213 154  11 226 170  11 242 186  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -225 175  15  46  32   6   2   2   6  22  22  22 -158 158 158 250 250 250 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 250 250 250 242 242 242 224 178  62 -239 182  13 236 186  11 213 154  11  46  32   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6  61  42   6 225 175  15 -238 190  10 236 186  11 112 100  78  42  42  42 - 14  14  14   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 22  22  22  54  54  54 154 122  46 213 154  11 -226 170  11 230 174  11 226 170  11 226 170  11 -236 178  12 242 186  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -241 196  14 184 144  12  10  10  10   2   2   6 -  6   6   6 116 116 116 242 242 242 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 231 231 231 198 198 198 214 170  54 -236 178  12 236 178  12 210 150  10 137  92   6 - 18  14   6   2   2   6   2   2   6   2   2   6 -  6   6   6  70  47   6 200 144  11 236 178  12 -239 182  13 239 182  13 124 112  88  58  58  58 - 22  22  22   6   6   6   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 30  30  30  70  70  70 180 133  36 226 170  11 -239 182  13 242 186  14 242 186  14 246 186  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 232 195  16  98  70   6   2   2   6 -  2   2   6   2   2   6  66  66  66 221 221 221 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 206 206 206 198 198 198 214 166  58 -230 174  11 230 174  11 216 158  10 192 133   9 -163 110   8 116  81   8 102  78  10 116  81   8 -167 114   7 197 138  11 226 170  11 239 182  13 -242 186  14 242 186  14 162 146  94  78  78  78 - 34  34  34  14  14  14   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 30  30  30  78  78  78 190 142  34 226 170  11 -239 182  13 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 241 196  14 203 166  17  22  18   6 -  2   2   6   2   2   6   2   2   6  38  38  38 -218 218 218 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -250 250 250 206 206 206 198 198 198 202 162  69 -226 170  11 236 178  12 224 166  10 210 150  10 -200 144  11 197 138  11 192 133   9 197 138  11 -210 150  10 226 170  11 242 186  14 246 190  14 -246 190  14 246 186  14 225 175  15 124 112  88 - 62  62  62  30  30  30  14  14  14   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 30  30  30  78  78  78 174 135  50 224 166  10 -239 182  13 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 241 196  14 139 102  15 -  2   2   6   2   2   6   2   2   6   2   2   6 - 78  78  78 250 250 250 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -250 250 250 214 214 214 198 198 198 190 150  46 -219 162  10 236 178  12 234 174  13 224 166  10 -216 158  10 213 154  11 213 154  11 216 158  10 -226 170  11 239 182  13 246 190  14 246 190  14 -246 190  14 246 190  14 242 186  14 206 162  42 -101 101 101  58  58  58  30  30  30  14  14  14 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 30  30  30  74  74  74 174 135  50 216 158  10 -236 178  12 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 241 196  14 226 184  13 - 61  42   6   2   2   6   2   2   6   2   2   6 - 22  22  22 238 238 238 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 226 226 226 187 187 187 180 133  36 -216 158  10 236 178  12 239 182  13 236 178  12 -230 174  11 226 170  11 226 170  11 230 174  11 -236 178  12 242 186  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 186  14 239 182  13 -206 162  42 106 106 106  66  66  66  34  34  34 - 14  14  14   6   6   6   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 26  26  26  70  70  70 163 133  67 213 154  11 -236 178  12 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 241 196  14 -190 146  13  18  14   6   2   2   6   2   2   6 - 46  46  46 246 246 246 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 221 221 221  86  86  86 156 107  11 -216 158  10 236 178  12 242 186  14 246 186  14 -242 186  14 239 182  13 239 182  13 242 186  14 -242 186  14 246 186  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -242 186  14 225 175  15 142 122  72  66  66  66 - 30  30  30  10  10  10   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 26  26  26  70  70  70 163 133  67 210 150  10 -236 178  12 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -232 195  16 121  92   8  34  34  34 106 106 106 -221 221 221 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -242 242 242  82  82  82  18  14   6 163 110   8 -216 158  10 236 178  12 242 186  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 242 186  14 163 133  67 - 46  46  46  18  18  18   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  10  10  10 - 30  30  30  78  78  78 163 133  67 210 150  10 -236 178  12 246 186  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -241 196  14 215 174  15 190 178 144 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 218 218 218 - 58  58  58   2   2   6  22  18   6 167 114   7 -216 158  10 236 178  12 246 186  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 186  14 242 186  14 190 150  46 - 54  54  54  22  22  22   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 38  38  38  86  86  86 180 133  36 213 154  11 -236 178  12 246 186  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 232 195  16 190 146  13 214 214 214 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 250 250 250 170 170 170  26  26  26 -  2   2   6   2   2   6  37  26   9 163 110   8 -219 162  10 239 182  13 246 186  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 186  14 236 178  12 224 166  10 142 122  72 - 46  46  46  18  18  18   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  18  18  18 - 50  50  50 109 106  95 192 133   9 224 166  10 -242 186  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -242 186  14 226 184  13 210 162  10 142 110  46 -226 226 226 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -253 253 253 253 253 253 253 253 253 253 253 253 -198 198 198  66  66  66   2   2   6   2   2   6 -  2   2   6   2   2   6  50  34   6 156 107  11 -219 162  10 239 182  13 246 186  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 242 186  14 -234 174  13 213 154  11 154 122  46  66  66  66 - 30  30  30  10  10  10   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  22  22  22 - 58  58  58 154 121  60 206 145  10 234 174  13 -242 186  14 246 186  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 186  14 236 178  12 210 162  10 163 110   8 - 61  42   6 138 138 138 218 218 218 250 250 250 -253 253 253 253 253 253 253 253 253 250 250 250 -242 242 242 210 210 210 144 144 144  66  66  66 -  6   6   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6  61  42   6 163 110   8 -216 158  10 236 178  12 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 239 182  13 230 174  11 216 158  10 -190 142  34 124 112  88  70  70  70  38  38  38 - 18  18  18   6   6   6   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  22  22  22 - 62  62  62 168 124  44 206 145  10 224 166  10 -236 178  12 239 182  13 242 186  14 242 186  14 -246 186  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 236 178  12 216 158  10 175 118   6 - 80  54   7   2   2   6   6   6   6  30  30  30 - 54  54  54  62  62  62  50  50  50  38  38  38 - 14  14  14   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   6   6   6  80  54   7 167 114   7 -213 154  11 236 178  12 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 190  14 242 186  14 239 182  13 239 182  13 -230 174  11 210 150  10 174 135  50 124 112  88 - 82  82  82  54  54  54  34  34  34  18  18  18 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  18  18  18 - 50  50  50 158 118  36 192 133   9 200 144  11 -216 158  10 219 162  10 224 166  10 226 170  11 -230 174  11 236 178  12 239 182  13 239 182  13 -242 186  14 246 186  14 246 190  14 246 190  14 -246 190  14 246 190  14 246 190  14 246 190  14 -246 186  14 230 174  11 210 150  10 163 110   8 -104  69   6  10  10  10   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   6   6   6  91  60   6 167 114   7 -206 145  10 230 174  11 242 186  14 246 190  14 -246 190  14 246 190  14 246 186  14 242 186  14 -239 182  13 230 174  11 224 166  10 213 154  11 -180 133  36 124 112  88  86  86  86  58  58  58 - 38  38  38  22  22  22  10  10  10   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  14  14  14 - 34  34  34  70  70  70 138 110  50 158 118  36 -167 114   7 180 123   7 192 133   9 197 138  11 -200 144  11 206 145  10 213 154  11 219 162  10 -224 166  10 230 174  11 239 182  13 242 186  14 -246 186  14 246 186  14 246 186  14 246 186  14 -239 182  13 216 158  10 185 133  11 152  99   6 -104  69   6  18  14   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   2   2   6   2   2   6   2   2   6 -  2   2   6   6   6   6  80  54   7 152  99   6 -192 133   9 219 162  10 236 178  12 239 182  13 -246 186  14 242 186  14 239 182  13 236 178  12 -224 166  10 206 145  10 192 133   9 154 121  60 - 94  94  94  62  62  62  42  42  42  22  22  22 - 14  14  14   6   6   6   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 18  18  18  34  34  34  58  58  58  78  78  78 -101  98  89 124 112  88 142 110  46 156 107  11 -163 110   8 167 114   7 175 118   6 180 123   7 -185 133  11 197 138  11 210 150  10 219 162  10 -226 170  11 236 178  12 236 178  12 234 174  13 -219 162  10 197 138  11 163 110   8 130  83   6 - 91  60   6  10  10  10   2   2   6   2   2   6 - 18  18  18  38  38  38  38  38  38  38  38  38 - 38  38  38  38  38  38  38  38  38  38  38  38 - 38  38  38  38  38  38  26  26  26   2   2   6 -  2   2   6   6   6   6  70  47   6 137  92   6 -175 118   6 200 144  11 219 162  10 230 174  11 -234 174  13 230 174  11 219 162  10 210 150  10 -192 133   9 163 110   8 124 112  88  82  82  82 - 50  50  50  30  30  30  14  14  14   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6  14  14  14  22  22  22  34  34  34 - 42  42  42  58  58  58  74  74  74  86  86  86 -101  98  89 122 102  70 130  98  46 121  87  25 -137  92   6 152  99   6 163 110   8 180 123   7 -185 133  11 197 138  11 206 145  10 200 144  11 -180 123   7 156 107  11 130  83   6 104  69   6 - 50  34   6  54  54  54 110 110 110 101  98  89 - 86  86  86  82  82  82  78  78  78  78  78  78 - 78  78  78  78  78  78  78  78  78  78  78  78 - 78  78  78  82  82  82  86  86  86  94  94  94 -106 106 106 101 101 101  86  66  34 124  80   6 -156 107  11 180 123   7 192 133   9 200 144  11 -206 145  10 200 144  11 192 133   9 175 118   6 -139 102  15 109 106  95  70  70  70  42  42  42 - 22  22  22  10  10  10   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   6   6   6  10  10  10 - 14  14  14  22  22  22  30  30  30  38  38  38 - 50  50  50  62  62  62  74  74  74  90  90  90 -101  98  89 112 100  78 121  87  25 124  80   6 -137  92   6 152  99   6 152  99   6 152  99   6 -138  86   6 124  80   6  98  70   6  86  66  30 -101  98  89  82  82  82  58  58  58  46  46  46 - 38  38  38  34  34  34  34  34  34  34  34  34 - 34  34  34  34  34  34  34  34  34  34  34  34 - 34  34  34  34  34  34  38  38  38  42  42  42 - 54  54  54  82  82  82  94  86  76  91  60   6 -134  86   6 156 107  11 167 114   7 175 118   6 -175 118   6 167 114   7 152  99   6 121  87  25 -101  98  89  62  62  62  34  34  34  18  18  18 -  6   6   6   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   6   6   6   6   6   6  10  10  10 - 18  18  18  22  22  22  30  30  30  42  42  42 - 50  50  50  66  66  66  86  86  86 101  98  89 -106  86  58  98  70   6 104  69   6 104  69   6 -104  69   6  91  60   6  82  62  34  90  90  90 - 62  62  62  38  38  38  22  22  22  14  14  14 - 10  10  10  10  10  10  10  10  10  10  10  10 - 10  10  10  10  10  10   6   6   6  10  10  10 - 10  10  10  10  10  10  10  10  10  14  14  14 - 22  22  22  42  42  42  70  70  70  89  81  66 - 80  54   7 104  69   6 124  80   6 137  92   6 -134  86   6 116  81   8 100  82  52  86  86  86 - 58  58  58  30  30  30  14  14  14   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   6   6   6  10  10  10  14  14  14 - 18  18  18  26  26  26  38  38  38  54  54  54 - 70  70  70  86  86  86  94  86  76  89  81  66 - 89  81  66  86  86  86  74  74  74  50  50  50 - 30  30  30  14  14  14   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6  18  18  18  34  34  34  58  58  58 - 82  82  82  89  81  66  89  81  66  89  81  66 - 94  86  66  94  86  76  74  74  74  50  50  50 - 26  26  26  14  14  14   6   6   6   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  6   6   6   6   6   6  14  14  14  18  18  18 - 30  30  30  38  38  38  46  46  46  54  54  54 - 50  50  50  42  42  42  30  30  30  18  18  18 - 10  10  10   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   6   6   6  14  14  14  26  26  26 - 38  38  38  50  50  50  58  58  58  58  58  58 - 54  54  54  42  42  42  30  30  30  18  18  18 - 10  10  10   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 -  6   6   6  10  10  10  14  14  14  18  18  18 - 18  18  18  14  14  14  10  10  10   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   6   6   6 - 14  14  14  18  18  18  22  22  22  22  22  22 - 18  18  18  14  14  14  10  10  10   6   6   6 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  3 4 4  6 7 7 +8 10 10  8 10 10  6 8 8  6 7 7  3 4 4  2 2 2 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  4 5 5  17 18 17 +27 29 28  35 37 36  40 43 41  43 45 43  40 43 41  37 39 37 +32 34 33  27 30 29  23 25 24  17 21 21  15 18 18  12 15 15 +11 13 13  8 10 10  6 7 7  3 4 4  1 1 1  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  13 13 13  32 34 33  49 51 48  60 60 56  58 59 55 +55 57 54  55 56 53  49 51 48  43 45 43  39 40 39  33 37 35 +28 31 30  23 27 26  20 23 23  17 20 20  14 17 17  13 16 16 +11 14 14  10 13 13  10 12 12  9 11 11  8 10 10  6 7 7 +2 3 3  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  6 7 7  12 15 15 +12 15 15  8 9 9  2 3 3  0 0 0  1 1 1  25 27 26 +55 56 53  68 70 65  65 66 61  65 66 61  63 64 60  63 64 60 +58 59 55  51 52 50  47 48 46  41 42 42  35 37 36  30 32 31 +26 28 27  20 24 24  18 22 22  16 19 19  14 17 17  13 16 16 +12 15 15  11 14 14  10 13 13  10 12 12  9 11 11  8 10 10 +8 9 9  6 8 8  3 3 3  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  6 7 7  20 24 24  23 27 26 +23 27 26  18 22 22  11 13 13  23 24 24  61 63 57  72 73 67 +72 73 67  68 70 65  68 70 65  68 70 65  63 64 60  58 59 55 +55 56 53  47 48 46  41 42 42  35 37 36  30 32 31  26 28 27 +20 24 24  18 22 22  16 20 20  15 19 19  14 17 17  13 16 16 +12 15 15  12 15 15  11 14 14  10 13 13  10 12 12  9 11 11 +8 10 10  8 9 9  7 9 9  6 7 7  1 2 2  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  1 1 1  4 5 5  5 6 5  4 5 5 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  15 19 19  40 41 39  53 55 47 +33 36 34  27 30 29  51 52 50  72 73 67  72 73 67  72 73 67 +72 73 67  68 70 65  68 70 65  63 64 60  58 59 55  51 52 50 +47 48 46  40 43 41  33 37 35  30 32 31  26 28 27  20 24 24 +18 22 22  17 21 21  16 19 19  14 18 18  14 17 17  13 17 17 +13 16 16  12 15 15  12 15 15  11 14 14  10 13 13  10 12 12 +9 11 11  8 10 10  8 9 9  7 9 9  6 8 8  3 4 4 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +2 2 2  6 8 8  10 12 12  10 12 12  10 12 12  10 12 12 +6 8 8  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  20 23 23  71 71 57  131 127 93 +115 113 82  63 64 60  72 73 67  72 73 67  72 73 67  72 73 67 +68 70 65  65 66 61  61 63 57  55 57 54  49 51 48  43 45 43 +39 40 39  33 36 34  28 31 30  23 27 26  20 24 24  20 23 23 +17 21 21  16 20 20  15 19 19  15 18 18  14 18 18  14 17 17 +13 17 17  13 16 16  12 15 15  12 15 15  11 14 14  10 13 13 +10 12 12  9 11 11  8 10 10  7 9 9  7 9 9  6 8 8 +4 5 5  0 0 0  0 0 0  0 0 0  1 1 1  6 7 7 +10 12 12  10 12 12  10 12 12  10 12 12  10 12 12  10 12 12 +10 12 12  3 4 4  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  18 22 22  71 71 57  144 139 99 +84 83 72  68 70 65  72 73 67  72 73 67  68 70 65  65 66 61 +63 64 60  55 57 54  51 52 50  47 48 46  40 43 41  35 37 36 +30 32 31  27 29 28  23 27 26  20 24 24  18 22 22  17 21 21 +16 20 20  15 19 19  15 19 19  15 19 19  15 18 18  14 18 18 +14 17 17  13 17 17  13 16 16  12 15 15  12 15 15  11 14 14 +10 13 13  9 12 12  9 11 11  8 10 10  7 9 9  6 8 8 +6 8 8  3 4 4  0 0 0  2 2 2  8 10 10  10 12 12 +10 12 12  10 12 12  11 13 13  36 38 35  61 61 53  48 49 45 +10 12 12  7 9 9  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  15 19 19  61 61 53  84 83 72 +68 70 65  72 73 67  68 70 65  68 70 65  63 64 60  58 59 55 +51 52 50  47 48 46  41 42 42  37 39 37  32 35 33  28 31 30 +23 27 26  20 24 24  20 23 23  18 22 22  17 21 21  17 21 21 +17 21 21  17 21 21  17 20 20  16 20 20  16 20 20  16 19 19 +15 18 18  14 18 18  13 17 17  13 16 16  12 15 15  12 15 15 +11 14 14  10 13 13  9 12 12  9 11 11  8 10 10  7 9 9 +6 8 8  6 8 8  5 6 5  9 11 11  10 12 12  10 12 12 +19 20 18  82 81 62  149 145 103  160 154 106  142 137 94  96 95 69 +10 12 12  10 12 12  1 1 1  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  10 12 12  44 46 43  68 70 65 +72 73 67  68 70 65  68 70 65  63 64 60  55 57 54  49 51 48 +43 45 43  39 40 39  33 37 35  30 32 31  26 28 27  23 27 26 +20 24 24  18 22 22  18 22 22  18 22 22  18 22 22  20 23 23 +20 24 24  23 25 24  23 25 24  22 24 23  20 23 23  18 22 22 +17 20 20  15 19 19  15 18 18  14 17 17  13 16 16  12 15 15 +11 14 14  11 13 13  10 12 12  9 11 11  8 10 10  8 9 9 +7 9 9  7 9 9  10 12 12  10 12 12  10 12 12  71 71 57 +164 159 111  186 182 128  186 182 128  171 165 117  151 147 98  96 95 69 +10 12 12  10 12 12  3 3 3  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  8 10 10  63 64 60  68 70 65 +72 73 67  68 70 65  63 64 60  55 57 54  47 48 46  40 43 41 +33 37 35  30 32 31  27 29 28  23 27 26  20 24 24  20 23 23 +18 22 22  18 22 22  20 23 22  21 25 23  23 27 26  27 29 28 +28 31 30  31 33 31  31 33 31  31 33 31  28 31 30  26 28 27 +23 25 24  20 23 22  16 20 20  15 18 18  14 17 17  13 16 16 +12 15 15  11 14 14  10 13 13  10 12 12  9 11 11  8 10 10 +10 12 12  10 13 13  10 12 12  12 14 14  96 95 69  165 161 109 +186 182 128  192 187 134  192 187 134  176 171 126  160 154 106  103 101 77 +10 12 12  10 12 12  5 6 5  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  35 37 36  68 70 65  72 73 67 +68 70 65  65 66 61  58 59 55  49 51 48  40 43 41  33 37 35 +28 31 30  23 27 26  20 24 24  20 23 23  18 22 22  18 22 22 +18 22 22  20 23 23  23 27 26  27 30 29  32 35 33  37 39 37 +40 43 41  44 46 43  46 47 43  44 46 43  40 43 41  36 38 35 +31 33 31  27 29 28  22 24 23  17 21 21  15 18 18  14 17 17 +13 16 16  12 15 15  11 14 14  11 14 14  11 13 13  13 16 16 +13 16 16  11 14 14  10 12 12  79 78 62  142 137 94  164 159 111 +178 174 128  192 187 134  192 187 134  176 171 126  160 154 106  96 95 69 +10 12 12  10 12 12  6 7 7  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  55 57 54  68 70 65  72 73 67 +68 70 65  63 64 60  55 56 53  43 45 43  35 37 36  28 31 30 +23 27 26  20 24 24  18 22 22  17 21 21  17 21 21  17 21 21 +20 24 24  25 27 26  31 33 31  38 39 37  46 47 43  53 55 47 +61 61 53  66 65 55  66 65 55  66 65 55  61 61 53  53 55 47 +46 47 43  37 39 37  30 33 30  24 26 24  17 21 21  15 18 18 +13 17 17  12 15 15  12 15 15  13 16 16  14 18 18  14 18 18 +14 17 17  12 15 15  30 31 28  118 116 76  134 131 96  160 154 106 +174 170 121  178 174 128  178 174 128  171 165 117  151 147 98  96 95 69 +10 12 12  10 12 12  6 8 8  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  63 64 60  68 70 65  68 70 65 +65 66 61  58 59 55  49 51 48  39 40 39  30 32 31  23 27 26 +20 24 24  18 22 22  17 21 21  16 20 20  17 21 21  20 23 23 +25 27 26  32 35 33  43 44 41  53 55 47  66 65 55  75 75 61 +82 81 62  84 83 72  87 86 72  87 86 72  82 81 62  75 75 61 +66 65 55  53 55 47  40 41 39  31 33 31  23 25 24  17 20 20 +14 18 18  13 16 16  12 15 15  12 15 15  13 17 17  14 18 18 +14 18 18  13 16 16  46 47 43  96 95 69  125 122 87  142 137 94 +160 154 106  165 161 109  164 159 111  155 149 109  142 137 94  75 75 61 +10 12 12  10 12 12  6 8 8  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  60 60 56  68 70 65  68 70 65 +63 64 60  55 57 54  46 47 45  35 37 36  27 30 29  23 25 24 +18 22 22  17 21 21  16 20 20  17 21 21  18 22 22  23 27 26 +31 33 31  43 44 41  55 56 53  71 71 57  84 83 72  92 91 72 +103 101 77  92 91 72  82 81 62  82 81 62  87 86 72  92 91 72 +84 83 72  71 71 57  55 56 53  43 44 41  30 33 30  22 24 23 +16 19 19  14 17 17  12 15 15  12 15 15  13 16 16  14 18 18 +14 18 18  14 17 17  43 44 41  82 81 62  118 116 76  125 122 87 +142 137 94  144 139 99  144 139 99  134 131 96  118 116 76  53 55 47 +10 12 12  10 12 12  6 8 8  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  47 48 46  63 64 60  63 64 60 +55 57 54  49 51 48  40 43 41  32 34 33  26 28 27  20 24 24 +18 22 22  16 20 20  16 20 20  17 21 21  20 24 24  28 31 30 +40 41 39  53 55 47  75 75 61  90 89 73  87 86 72  48 49 45 +14 14 13  2 2 2  1 2 2  1 1 1  1 1 1  2 2 2 +19 20 18  43 44 41  66 65 55  53 55 47  38 39 37  26 28 27 +18 22 22  14 18 18  13 16 16  12 15 15  12 15 15  13 17 17 +14 18 18  14 18 18  30 31 28  66 65 55  96 95 69  103 101 77 +118 116 76  118 116 76  118 116 76  118 116 76  103 101 77  36 38 35 +10 12 12  10 12 12  6 7 7  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  28 31 30  55 57 54  51 52 50 +49 51 48  41 42 42  35 37 36  28 31 30  23 27 26  20 23 23 +17 21 21  16 20 20  16 20 20  18 22 22  23 27 26  33 36 34 +48 49 45  71 71 57  82 81 62  43 44 41  8 9 9  6 7 7 +6 7 7  6 7 7  6 7 7  5 6 5  4 5 5  3 4 4 +2 3 3  1 2 2  4 5 4  36 38 35  48 49 45  32 35 33 +21 25 23  16 19 19  13 17 17  12 15 15  12 15 15  13 16 16 +14 18 18  14 18 18  16 18 16  36 38 35  61 61 53  82 81 62 +96 95 69  96 95 69  96 95 69  96 95 69  79 78 62  19 20 18 +10 12 12  10 12 12  4 5 5  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  13 13 13  46 47 45  43 45 43 +40 43 41  35 37 36  30 32 31  23 27 26  20 24 24  18 22 22 +17 21 21  16 20 20  17 21 21  20 23 23  27 30 29  40 41 39 +61 61 53  53 55 47  16 17 16  9 11 11  10 12 12  10 12 12 +10 12 12  10 12 12  10 12 12  9 11 11  8 10 10  8 9 9 +6 8 8  5 6 5  4 5 5  2 3 3  19 20 18  38 39 37 +26 28 27  17 21 21  14 17 17  13 16 16  12 15 15  12 15 15 +13 17 17  14 18 18  12 15 15  13 12 7  30 31 28  46 47 43 +53 55 47  66 65 55  66 65 55  53 55 47  36 38 35  10 12 12 +10 12 12  10 12 12  2 3 3  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  1 1 1  33 37 35  35 37 36 +32 35 33  28 31 30  23 27 26  20 24 24  18 22 22  17 21 21 +16 20 20  16 20 20  17 21 21  21 25 23  31 33 31  44 46 43 +31 33 31  11 13 13  12 14 14  12 15 15  13 16 16  14 17 17 +14 17 17  14 17 17  14 17 17  13 16 16  12 15 15  12 14 14 +11 13 13  9 11 11  8 10 10  6 8 8  4 5 5  17 18 17 +30 33 30  20 23 22  15 18 18  13 16 16  12 15 15  12 14 14 +13 16 16  14 17 17  14 18 18  11 12 11  7 7 5  16 17 12 +21 22 20  30 31 28  25 27 25  21 22 20  14 14 13  10 12 12 +10 12 12  9 11 11  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  18 22 22  27 30 29 +27 29 28  40 41 39  53 55 47  53 55 47  53 55 47  46 47 43 +25 27 25  16 20 20  17 21 21  23 25 24  31 33 31  20 20 20 +12 15 15  14 17 17  15 19 19  16 20 20  17 21 21  18 22 22 +18 22 22  18 22 22  18 22 22  17 21 21  17 21 21  16 19 19 +15 18 18  13 16 16  12 15 15  10 12 12  8 10 10  6 8 8 +21 22 21  22 24 23  15 19 19  13 17 17  13 16 16  12 15 15 +12 15 15  13 17 17  14 18 18  14 18 18  13 15 14  10 9 6 +7 7 5  7 7 5  7 7 5  9 11 11  10 12 12  10 12 12 +10 12 12  6 7 7  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  16 17 12  82 81 62 +118 116 76  118 116 76  161 156 96  161 156 96  161 156 96  118 116 76 +118 116 76  96 95 69  53 55 47  22 24 23  14 17 17  13 16 16 +15 19 19  17 21 21  18 22 22  20 24 24  20 24 24  23 27 26 +23 27 26  23 27 26  23 27 26  23 27 26  23 27 26  20 24 24 +20 23 23  17 21 21  16 19 19  14 17 17  12 15 15  10 12 12 +9 11 11  20 23 22  16 19 19  14 17 17  13 16 16  12 15 15 +11 14 14  13 16 16  14 17 17  14 18 18  14 17 17  12 15 15 +10 12 12  10 12 12  10 12 12  10 12 12  10 12 12  10 12 12 +9 11 11  1 1 1  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  53 55 47  161 156 96 +161 156 96  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  161 156 96  118 116 76  96 95 69  21 22 20  16 19 19 +18 22 22  20 24 24  23 27 26  23 27 26  26 28 27  27 30 29 +27 30 29  18 22 22  12 14 14  8 10 10  9 11 11  17 21 21 +23 27 26  23 27 26  20 24 24  18 22 22  16 20 20  14 17 17 +12 14 14  14 17 17  16 20 20  14 17 17  13 17 17  13 16 16 +12 15 15  12 15 15  13 17 17  14 18 18  14 17 17  13 16 16 +11 13 13  10 12 12  10 12 12  10 12 12  10 12 12  10 12 12 +4 5 5  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  13 12 7  118 116 76  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  161 156 96  118 116 76  30 31 28 +20 24 24  23 27 26  27 30 29  28 31 30  30 32 31  23 27 26 +16 19 19  17 21 21  12 15 15  9 11 11  10 12 12  9 11 11 +20 24 24  28 31 30  26 28 27  23 27 26  20 24 24  17 21 21 +15 19 19  13 16 16  16 19 19  14 18 18  14 17 17  13 16 16 +12 15 15  11 14 14  13 16 16  14 17 17  14 18 18  14 17 17 +12 15 15  10 12 12  10 12 12  10 12 12  10 12 12  8 9 9 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  82 81 62  161 156 96  230 229 82 +230 229 82  233 233 100  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  161 156 96  118 116 76 +27 29 28  27 30 29  30 32 31  30 32 31  23 27 26  20 24 24 +26 28 27  17 21 21  6 7 7  72 73 67  145 141 105  15 15 15 +14 17 17  33 37 35  30 32 31  28 31 30  26 28 27  23 27 26 +20 23 23  16 20 20  15 19 19  14 18 18  14 17 17  13 16 16 +12 15 15  11 14 14  12 15 15  13 17 17  14 18 18  14 17 17 +13 16 16  11 13 13  10 12 12  10 12 12  9 11 11  1 1 1 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  16 17 12  161 156 96  230 229 82  230 229 82 +243 242 120  235 234 117  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  161 156 96 +82 81 62  28 31 30  28 31 30  27 30 29  28 31 30  30 32 31 +33 37 35  13 16 16  3 3 3  105 104 92  210 208 158  12 14 14 +17 21 21  33 37 35  33 37 35  32 35 33  30 32 31  27 30 29 +23 27 26  20 23 23  17 20 20  15 18 18  14 18 18  13 17 17 +13 16 16  12 15 15  11 14 14  13 16 16  14 17 17  14 18 18 +13 17 17  12 15 15  10 12 12  10 12 12  3 4 4  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  96 95 69  230 229 82  230 229 82  244 244 132 +241 241 143  243 242 120  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +161 156 96  46 47 43  32 35 33  33 37 35  33 37 35  33 37 35 +40 43 41  23 27 26  1 1 1  2 2 2  24 26 24  14 17 17 +23 27 26  33 37 35  33 37 35  33 37 35  33 37 35  30 32 31 +27 30 29  23 27 26  20 23 23  15 18 18  14 18 18  14 17 17 +13 16 16  12 15 15  11 14 14  12 15 15  13 17 17  14 17 17 +14 17 17  13 16 16  11 13 13  6 8 8  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  16 17 12  161 156 96  230 229 82  235 234 117  239 239 170 +239 239 170  236 236 101  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  118 116 76  33 37 35  33 37 35  37 39 37  37 39 37 +43 45 43  49 51 48  20 24 24  8 10 10  17 20 20  35 37 36 +33 37 35  40 43 41  37 39 37  35 37 36  33 37 35  33 37 35 +30 32 31  27 30 29  23 27 26  15 19 19  14 18 18  14 17 17 +13 17 17  13 16 16  12 15 15  11 14 14  13 16 16  14 17 17 +14 17 17  13 17 17  11 14 14  4 5 5  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  96 95 69  230 229 82  230 229 82  239 239 170  251 251 187 +241 241 143  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  161 156 96  36 38 35  33 37 35  33 37 35  33 37 35 +37 39 37  47 48 46  55 57 54  55 57 54  49 51 48  43 45 43 +43 45 43  43 45 43  40 43 41  40 43 41  37 39 37  33 37 35 +33 37 35  28 31 30  26 28 27  16 20 20  15 18 18  14 18 18 +14 17 17  13 16 16  12 15 15  11 14 14  12 15 15  13 17 17 +14 17 17  14 17 17  8 10 10  5 7 7  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +16 17 12  230 229 82  230 229 82  243 242 120  251 251 187  251 251 187 +246 246 123  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  66 65 55  30 32 31  32 35 33  33 37 35 +33 37 35  37 39 37  40 43 41  47 48 46  49 51 48  51 52 50 +55 57 54  55 57 54  51 52 50  47 48 46  43 45 43  39 40 39 +33 37 35  30 32 31  26 28 27  17 21 21  15 19 19  14 18 18 +14 17 17  13 16 16  12 15 15  12 14 14  11 14 14  13 16 16 +14 17 17  12 15 15  7 9 9  6 8 8  1 1 1  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +96 95 69  230 229 82  230 229 82  239 239 170  251 251 187  239 239 170 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  96 95 69  27 30 29  28 31 30  30 32 31 +33 37 35  40 43 41  46 47 45  55 57 54  63 64 60  72 73 67 +72 73 67  72 73 67  72 73 67  65 66 61  55 57 54  47 48 46 +39 40 39  32 35 33  27 30 29  17 21 21  15 19 19  15 18 18 +14 18 18  13 17 17  13 16 16  12 15 15  11 14 14  12 14 14 +13 16 16  9 11 11  7 9 9  9 11 11  66 65 55  115 113 82 +21 22 20  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  13 12 7 +230 229 82  230 229 82  236 236 101  251 251 187  251 251 187  246 246 123 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  118 116 76  23 27 26  26 28 27  32 35 33 +51 52 50  90 89 73  110 109 94  145 141 105  168 163 120  177 172 135 +177 172 135  188 184 146  188 184 146  181 176 137  194 191 148  188 184 146 +184 179 149  188 184 146  188 184 146  156 151 111  177 172 135  181 176 137 +177 172 135  168 163 120  168 163 120  158 153 112  156 151 111  158 153 112 +156 151 111  158 153 112  177 172 135  188 184 146  188 184 146  194 189 146 +36 38 35  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  82 81 62 +230 229 82  230 229 82  244 244 132  251 251 187  244 244 132  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  161 156 96  82 81 62 +96 95 69  230 229 82  181 178 103  110 109 94  156 151 111  188 184 146 +188 184 146  197 193 154  188 184 146  184 181 136  188 184 146  168 163 120 +168 163 120  178 174 128  156 151 111  158 153 112  174 170 121  156 151 111 +156 151 111  158 153 112  156 151 111  168 163 120  178 174 128  181 176 137 +176 171 126  178 174 128  184 181 136  176 171 126  178 174 128  184 181 136 +176 171 126  178 174 128  184 181 136  164 159 111  155 149 109  96 95 69 +1 1 1  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  2 2 1  161 156 96 +230 229 82  230 229 82  244 244 132  244 244 132  236 236 101  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  46 47 43  82 81 62 +158 153 112  197 193 154  194 189 146  184 181 136  188 184 146  168 163 120 +156 151 111  137 133 100  131 127 93  137 133 100  137 133 100  158 153 112 +121 119 87  137 133 100  156 151 111  145 141 105  99 98 80  84 83 72 +63 64 60  52 53 49  40 43 41  33 36 34  36 38 35  36 38 35 +38 39 37  43 44 41  43 44 41  46 47 43  48 49 45  48 49 45 +46 47 43  36 38 35  30 31 28  19 20 18  6 7 7  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  36 38 35  230 229 82 +230 229 82  230 229 82  246 246 123  236 236 101  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  53 55 47  121 119 87 +176 171 126  171 165 117  161 156 96  82 81 62  53 55 47  33 37 35 +39 40 39  63 64 60  99 98 80  121 119 87  137 133 100  177 172 135 +176 171 126  184 181 136  131 127 93  131 127 93  110 109 94  84 83 72 +51 52 50  39 40 39  27 29 28  18 22 22  16 19 19  15 19 19 +15 19 19  14 18 18  14 17 17  13 16 16  12 15 15  11 14 14 +10 13 13  9 12 12  9 11 11  8 9 9  7 9 9  1 1 1 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  118 116 76  230 229 82 +230 229 82  230 229 82  236 236 101  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  96 95 69  71 71 57 +36 38 35  118 116 76  118 116 76  12 15 15  15 18 18  20 24 24 +33 37 35  55 56 53  84 83 72  110 109 94  145 141 105  110 109 94 +168 163 120  121 119 87  156 151 111  131 127 93  87 86 72  61 63 57 +47 48 46  28 31 30  18 22 22  15 19 19  15 18 18  15 19 19 +15 19 19  14 18 18  14 17 17  13 17 17  13 16 16  12 15 15 +11 13 13  10 12 12  9 11 11  8 10 10  7 9 9  3 3 3 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  1 1 0  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  161 156 96 +161 156 96  230 229 82  118 116 76  11 14 14  14 17 17  18 22 22 +27 30 29  40 43 41  60 60 56  84 83 72  105 104 92  110 109 94 +110 109 94  110 109 94  99 98 80  90 89 73  68 70 65  47 48 46 +32 34 33  23 25 24  20 23 23  17 21 21  15 19 19  14 17 17 +15 19 19  15 18 18  14 18 18  13 17 17  13 16 16  12 15 15 +11 14 14  10 12 12  9 11 11  8 10 10  7 9 9  4 5 5 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  16 17 12  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  161 156 96  118 116 76  11 13 13  13 16 16  15 19 19 +20 24 24  30 32 31  40 43 41  51 52 50  63 64 60  72 73 67 +65 66 61  65 66 61  65 66 61  55 57 54  46 47 45  33 37 35 +27 29 28  20 24 24  17 21 21  16 20 20  16 20 20  15 19 19 +15 19 19  15 19 19  14 18 18  14 17 17  13 16 16  12 15 15 +11 14 14  10 13 13  9 12 12  8 10 10  7 9 9  6 7 7 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  53 55 47  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +161 156 96  118 116 76  53 55 47  10 13 13  12 15 15  14 17 17 +17 20 20  20 24 24  27 29 28  32 34 33  37 39 37  40 43 41 +43 45 43  41 42 42  35 37 36  30 32 31  28 31 30  23 27 26 +20 23 23  17 21 21  16 20 20  16 20 20  16 20 20  16 19 19 +15 19 19  15 19 19  14 18 18  14 17 17  13 16 16  12 15 15 +11 14 14  10 13 13  9 12 12  9 11 11  8 10 10  10 12 12 +1 1 1  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  82 81 62  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  161 156 96  161 156 96 +118 116 76  82 81 62  13 14 12  10 13 13  12 15 15  13 17 17 +15 19 19  16 20 20  20 23 23  20 24 24  23 27 26  26 28 27 +26 28 27  26 28 27  23 27 26  18 22 22  20 23 23  17 21 21 +17 21 21  16 20 20  16 20 20  16 20 20  16 20 20  16 19 19 +15 19 19  15 19 19  15 18 18  14 17 17  13 17 17  13 16 16 +12 15 15  12 14 14  12 14 14  12 14 14  12 14 14  23 24 24 +6 8 8  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  118 116 76  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  161 156 96  161 156 96  118 116 76 +71 71 57  13 14 12  9 12 12  10 13 13  12 15 15  13 17 17 +15 18 18  15 19 19  16 20 20  17 21 21  17 21 21  18 22 22 +18 22 22  18 22 22  17 21 21  16 19 19  15 18 18  14 18 18 +16 19 19  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +15 19 19  15 19 19  15 18 18  14 18 18  16 20 20  23 25 24 +17 21 21  25 27 26  47 48 46  47 48 46  51 52 50  72 73 67 +33 36 34  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  118 116 76  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  161 156 96  118 116 76  118 116 76  46 47 43 +9 11 11  9 11 11  10 12 12  11 13 13  12 15 15  14 17 17 +15 18 18  15 19 19  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +15 19 19  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +15 19 19  16 20 20  20 24 24  55 56 53  32 34 33  84 83 72 +90 89 73  110 109 94  110 109 94  105 104 92  110 109 94  110 109 94 +72 73 67  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  96 95 69  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  161 156 96  118 116 76  82 81 62  16 17 12  9 11 11 +9 11 11  9 12 12  10 13 13  12 14 14  13 16 16  14 18 18 +15 19 19  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 19 19  33 36 34  99 98 80  156 151 111  145 141 105  184 179 149 +168 163 120  184 179 149  177 172 135  156 151 111  145 141 105  110 109 94 +90 89 73  2 2 2  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  71 71 57  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  230 229 82 +230 229 82  161 156 96  230 229 82  230 229 82  230 229 82  161 156 96 +118 116 76  82 81 62  30 31 28  9 11 11  9 11 11  9 11 11 +10 12 12  10 13 13  11 14 14  13 16 16  14 17 17  15 18 18 +15 19 19  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +18 22 22  58 59 55  137 133 100  197 193 154  214 212 158  210 208 158 +197 193 154  184 179 149  184 179 149  137 133 100  110 109 94  99 98 80 +84 83 72  10 10 9  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  16 17 12  230 229 82  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  230 229 82  161 156 96 +161 156 96  161 156 96  161 156 96  161 156 96  118 116 76  71 71 57 +21 22 20  12 14 14  11 13 13  10 12 12  10 12 12  10 13 13 +11 13 13  12 15 15  13 16 16  14 17 17  14 18 18  15 19 19 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  17 21 21 +23 27 26  84 83 72  184 179 149  251 251 187  210 208 158  184 179 149 +184 179 149  156 151 111  110 109 94  84 83 72  63 64 60  51 52 50 +18 22 22  6 8 8  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  118 116 76  230 229 82 +230 229 82  230 229 82  230 229 82  230 229 82  161 156 96  161 156 96 +161 156 96  161 156 96  118 116 76  53 55 47  20 23 22  16 19 19 +13 16 16  12 15 15  12 14 14  11 14 14  11 14 14  11 14 14 +12 15 15  13 16 16  14 17 17  15 19 19  16 20 20  17 21 21 +23 27 26  18 22 22  20 24 24  23 27 26  30 32 31  17 21 21 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +23 27 26  33 37 35  137 133 100  156 151 111  158 153 112  105 104 92 +105 104 92  68 70 65  39 40 39  18 22 22  12 14 14  12 15 15 +9 11 11  4 5 5  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  16 17 12  230 229 82 +230 229 82  230 229 82  230 229 82  161 156 96  118 116 76  118 116 76 +118 116 76  66 65 55  43 45 43  32 34 33  25 27 26  20 23 22 +17 20 20  15 18 18  14 17 17  15 18 18  13 16 16  14 17 17 +14 18 18  16 20 20  32 34 33  55 57 54  58 59 55  72 73 67 +105 104 92  55 57 54  65 66 61  63 64 60  40 43 41  33 37 35 +41 42 42  20 24 24  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +17 21 21  26 28 27  30 32 31  35 37 36  68 70 65  39 40 39 +23 27 26  15 18 18  13 16 16  11 14 14  9 12 12  8 10 10 +7 9 9  6 7 7  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  36 38 35 +230 229 82  230 229 82  230 229 82  96 95 69  30 31 28  49 51 48 +90 89 73  68 70 65  55 57 54  47 48 46  47 48 46  43 45 43 +32 34 33  43 45 43  43 45 43  23 27 26  25 27 26  40 43 41 +40 43 41  90 89 73  110 109 94  145 141 105  156 151 111  156 151 111 +184 179 149  184 179 149  177 172 135  184 179 149  137 133 100  84 83 72 +105 104 92  63 64 60  49 51 48  47 48 46  28 31 30  18 22 22 +16 20 20  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  15 19 19  15 19 19  15 19 19  18 22 22  15 19 19 +13 16 16  12 15 15  11 14 14  10 13 13  9 12 12  9 11 11 +8 10 10  6 8 8  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +30 31 28  230 229 82  71 71 57  2 2 1  0 0 0  58 59 55 +105 104 92  84 83 72  65 66 61  84 83 72  110 109 94  110 109 94 +145 141 105  105 104 92  110 109 94  110 109 94  84 83 72  110 109 94 +158 153 112  197 193 154  197 193 154  239 239 170  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  210 208 158  197 193 154 +197 193 154  184 179 149  145 141 105  137 133 100  105 104 92  47 48 46 +20 23 23  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 19 19  15 19 19  15 19 19  14 18 18  14 17 17 +13 17 17  13 16 16  12 14 14  12 14 14  13 13 13  13 13 13 +13 13 13  12 12 12  10 10 9  6 7 7  2 2 2  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  1 1 0  0 0 0  0 0 0  65 66 61 +105 104 92  84 83 72  84 83 72  110 109 94  184 179 149  210 208 158 +210 208 158  210 208 158  214 212 158  197 193 154  214 212 158  210 208 158 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  251 251 187  239 239 170  251 251 187  184 179 149  84 83 72 +26 28 27  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  15 19 19  15 19 19  15 18 18  14 18 18 +13 17 17  13 16 16  15 15 15  14 14 13  14 14 13  14 14 13 +13 13 13  13 13 13  12 12 12  12 12 12  12 12 12  3 4 4 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  72 73 67 +105 104 92  99 98 80  84 83 72  99 98 80  177 172 135  197 193 154 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  214 212 158  197 193 154  99 98 80 +23 27 26  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  15 19 19  15 19 19  15 18 18  14 18 18 +14 17 17  16 16 16  16 16 16  16 16 16  15 15 15  14 14 13 +14 14 13  13 13 13  13 13 13  12 12 12  12 12 12  12 12 12 +3 3 3  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  84 83 72 +110 109 94  99 98 80  72 73 67  63 64 60  99 98 80  177 172 135 +184 179 149  210 208 158  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  210 208 158  184 179 149  177 172 135  110 109 94  33 37 35 +17 21 21  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +16 20 20  16 20 20  15 19 19  15 19 19  15 19 19  14 18 18 +15 18 18  18 19 18  18 19 18  17 17 17  16 16 16  15 15 15 +14 14 13  13 13 13  13 13 13  12 12 12  12 12 12  12 12 12 +10 10 9  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  2 2 2  105 104 92 +108 107 93  99 98 80  72 73 67  63 64 60  51 52 50  87 86 72 +105 104 92  110 109 94  108 107 93  156 151 111  184 179 149  184 179 149 +197 193 154  197 193 154  197 193 154  184 179 149  184 179 149  177 172 135 +197 193 154  156 151 111  177 172 135  184 179 149  168 163 120  137 133 100 +145 141 105  110 109 94  99 98 80  47 48 46  55 57 54  15 19 19 +16 19 19  16 20 20  16 20 20  16 20 20  16 20 20  16 20 20 +17 20 20  17 21 21  16 20 20  16 19 19  15 19 19  16 19 19 +20 20 20  21 22 21  20 20 20  19 20 19  18 19 18  16 16 16 +15 15 15  14 14 13  13 13 13  13 13 13  12 12 12  12 12 12 +12 12 12  4 5 5  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  58 59 55  110 109 94 +105 104 92  90 89 73  72 73 67  55 57 54  43 45 43  39 40 39 +43 45 43  46 47 45  43 45 43  68 70 65  65 66 61  63 64 60 +108 107 93  72 73 67  105 104 92  90 89 73  72 73 67  40 43 41 +72 73 67  68 70 65  68 70 65  58 59 55  63 64 60  49 51 48 +43 45 43  33 36 34  27 30 29  20 24 24  16 20 20  15 19 19 +15 19 19  15 19 19  15 19 19  16 19 19  16 20 20  16 20 20 +17 21 21  20 24 24  20 23 22  17 21 21  17 20 20  20 20 20 +21 22 21  21 22 21  21 22 21  21 22 21  20 20 20  18 19 18 +16 16 16  15 15 15  13 13 13  13 13 13  12 12 12  12 12 12 +12 12 12  10 10 9  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  21 22 21  110 109 94  110 109 94 +105 104 92  84 83 72  68 70 65  51 52 50  41 42 42  33 37 35 +28 31 30  23 27 26  20 23 23  18 22 22  17 20 20  25 27 26 +26 28 27  27 30 29  25 27 26  20 23 23  23 27 26  30 32 31 +20 24 24  17 21 21  18 22 22  15 19 19  26 28 27  20 23 23 +14 18 18  15 19 19  15 18 18  15 19 19  15 19 19  15 19 19 +15 19 19  15 19 19  15 19 19  15 19 19  15 19 19  16 19 19 +16 20 20  22 24 23  24 26 24  22 24 23  20 23 22  22 24 23 +24 26 24  24 26 24  23 24 24  22 24 23  21 22 21  19 20 19 +17 17 17  15 15 15  14 14 13  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  2 2 2  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  2 2 2  99 98 80  110 109 94  108 107 93 +105 104 92  84 83 72  63 64 60  49 51 48  39 40 39  32 34 33 +27 30 29  23 25 24  20 23 23  17 20 20  15 19 19  14 18 18 +14 17 17  13 17 17  13 17 17  13 17 17  13 17 17  13 17 17 +14 17 17  14 17 17  14 17 17  14 17 17  14 17 17  14 17 17 +14 18 18  14 18 18  14 18 18  14 18 18  15 18 18  15 19 19 +15 19 19  15 19 19  15 19 19  15 19 19  15 19 19  15 19 19 +15 19 19  17 21 21  27 29 28  26 28 27  25 27 26  25 27 26 +27 29 28  27 29 28  26 28 27  24 26 24  21 22 21  20 20 20 +18 19 18  16 16 16  14 14 13  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  4 5 5  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  51 52 50  110 109 94  110 109 94  105 104 92 +90 89 73  72 73 67  55 57 54  43 45 43  35 37 36  30 32 31 +26 28 27  20 24 24  17 21 21  16 19 19  15 18 18  14 17 17 +13 16 16  13 16 16  13 16 16  13 16 16  13 16 16  13 16 16 +13 16 16  13 16 16  13 16 16  13 17 17  13 17 17  14 17 17 +14 17 17  14 17 17  14 17 17  14 18 18  14 18 18  14 18 18 +15 18 18  15 18 18  15 19 19  15 19 19  15 19 19  15 19 19 +15 19 19  15 19 19  27 29 28  32 34 33  28 31 30  27 29 28 +30 32 31  30 32 31  30 31 28  26 28 27  23 24 24  21 22 21 +19 20 19  16 16 16  14 14 13  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  6 7 7  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  3 3 3  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  10 10 9  108 107 93  110 109 94  108 107 93  99 98 80 +84 83 72  63 64 60  49 51 48  40 43 41  33 36 34  27 30 29 +23 27 26  18 22 22  17 20 20  15 18 18  14 17 17  13 16 16 +13 16 16  13 16 16  12 15 15  12 15 15  12 15 15  12 15 15 +13 16 16  13 16 16  13 16 16  13 16 16  13 16 16  13 16 16 +13 17 17  13 17 17  14 17 17  14 17 17  14 17 17  14 18 18 +14 18 18  14 18 18  15 18 18  15 18 18  15 19 19  15 19 19 +15 19 19  15 19 19  17 21 21  33 36 34  32 34 33  31 33 31 +33 36 34  33 36 34  31 33 31  27 29 28  25 27 26  21 22 21 +19 20 19  17 17 17  15 15 15  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  8 8 7  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  63 64 60  137 133 100  43 45 43  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  68 70 65  110 109 94  110 109 94  105 104 92  84 83 72 +68 70 65  55 57 54  43 45 43  35 37 36  30 32 31  26 28 27 +20 24 24  17 21 21  16 19 19  14 17 17  13 16 16  12 15 15 +12 15 15  12 15 15  12 15 15  12 15 15  12 15 15  12 15 15 +12 15 15  12 15 15  12 15 15  12 15 15  12 15 15  13 16 16 +13 16 16  13 16 16  13 16 16  13 17 17  13 17 17  14 17 17 +14 17 17  14 17 17  14 18 18  14 18 18  14 18 18  15 18 18 +15 19 19  15 19 19  15 19 19  20 24 24  32 34 33  35 37 36 +37 39 37  35 37 36  33 36 34  30 32 31  26 28 27  22 24 23 +20 20 20  17 17 17  15 15 15  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  8 8 7  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +1 1 1  99 98 80  184 179 149  184 179 149  68 70 65  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +15 15 15  110 109 94  110 109 94  108 107 93  99 98 80  72 73 67 +61 63 57  49 51 48  39 40 39  33 36 34  27 30 29  23 25 24 +18 22 22  16 19 19  14 17 17  13 16 16  12 15 15  12 15 15 +11 14 14  11 14 14  11 14 14  11 14 14  11 14 14  11 14 14 +11 14 14  11 14 14  12 14 14  12 15 15  12 15 15  12 15 15 +12 15 15  13 16 16  13 16 16  13 16 16  13 16 16  13 16 16 +13 17 17  14 17 17  14 17 17  14 17 17  14 18 18  14 18 18 +14 18 18  15 18 18  15 19 19  15 19 19  30 32 31  38 39 37 +39 40 39  39 40 39  35 37 36  31 33 31  27 29 28  22 24 23 +20 20 20  17 17 17  15 15 15  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  8 8 7  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  3 3 3 +110 109 94  197 193 154  210 208 158  184 179 149  68 70 65  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +68 70 65  110 109 94  110 109 94  105 104 92  84 83 72  65 66 61 +51 52 50  43 45 43  35 37 36  30 32 31  25 27 26  20 23 23 +17 20 20  15 18 18  13 16 16  12 15 15  12 15 15  11 14 14 +11 14 14  11 14 14  11 13 13  11 13 13  11 13 13  11 13 13 +11 14 14  11 14 14  11 14 14  11 14 14  11 14 14  11 14 14 +12 15 15  12 15 15  12 15 15  12 15 15  13 16 16  13 16 16 +13 16 16  13 16 16  13 17 17  13 17 17  14 17 17  14 17 17 +14 18 18  14 18 18  14 18 18  16 19 19  37 39 37  41 42 42 +41 42 42  41 42 42  38 39 37  32 34 33  27 29 28  23 24 24 +21 22 21  17 17 17  15 15 15  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  8 8 7  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  11 11 11  137 133 100 +197 193 154  251 251 187  239 239 170  184 179 149  31 33 31  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  12 12 12 +110 109 94  110 109 94  105 104 92  90 89 73  72 73 67  58 59 55 +46 47 45  37 39 37  31 33 31  26 28 27  20 24 24  17 21 21 +15 18 18  13 16 16  12 15 15  12 14 14  11 13 13  11 13 13 +10 13 13  10 13 13  10 13 13  10 13 13  10 13 13  10 13 13 +10 13 13  10 13 13  11 13 13  11 13 13  11 14 14  11 14 14 +11 14 14  11 14 14  12 14 14  12 15 15  12 15 15  12 15 15 +13 16 16  13 16 16  13 16 16  13 16 16  13 17 17  13 17 17 +14 17 17  14 17 17  14 18 18  23 27 26  41 42 42  41 42 42 +43 45 43  41 42 42  39 40 39  33 36 34  27 29 28  23 24 24 +21 22 21  17 17 17  15 15 15  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  6 7 7  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  27 29 28  168 163 120  210 208 158 +251 251 187  251 251 187  210 208 158  137 133 100  1 1 1  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  60 60 56 +110 109 94  105 104 92  105 104 92  84 83 72  65 66 61  51 52 50 +40 43 41  33 36 34  27 30 29  23 25 24  18 22 22  16 19 19 +14 17 17  12 15 15  11 14 14  11 14 14  10 13 13  10 13 13 +10 13 13  10 12 12  10 12 12  10 12 12  10 12 12  10 12 12 +10 12 12  10 12 12  10 13 13  10 13 13  10 13 13  11 13 13 +11 13 13  11 14 14  11 14 14  11 14 14  11 14 14  12 15 15 +12 15 15  12 15 15  12 15 15  13 16 16  13 16 16  13 16 16 +13 17 17  13 17 17  14 17 17  32 34 33  43 45 43  43 45 43 +43 45 43  43 45 43  39 40 39  33 36 34  27 29 28  23 24 24 +21 22 21  17 17 17  15 15 15  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  6 7 7  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  1 1 1  68 70 65  184 179 149  210 208 158  251 251 187 +251 251 187  214 212 158  184 179 149  37 39 37  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  6 7 7  105 104 92 +105 104 92  105 104 92  99 98 80  72 73 67  58 59 55  46 47 45 +35 37 36  30 32 31  25 27 26  20 23 23  16 19 19  14 17 17 +12 15 15  12 14 14  11 13 13  10 13 13  10 12 12  10 12 12 +10 12 12  10 12 12  9 12 12  9 12 12  9 12 12  9 12 12 +10 12 12  10 12 12  10 12 12  10 12 12  10 12 12  10 13 13 +10 13 13  10 13 13  11 13 13  11 13 13  11 14 14  11 14 14 +11 14 14  12 15 15  12 15 15  12 15 15  12 15 15  13 16 16 +13 16 16  13 16 16  17 20 20  41 42 42  46 47 45  46 47 45 +46 47 45  43 45 43  40 41 39  33 36 34  27 29 28  23 24 24 +20 20 20  17 17 17  15 15 15  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  4 5 5  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +15 15 15  110 109 94  197 193 154  214 212 158  251 251 187  251 251 187 +239 239 170  184 179 149  84 83 72  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  47 48 46  105 104 92 +105 104 92  99 98 80  84 83 72  68 70 65  51 52 50  40 43 41 +32 34 33  27 29 28  22 24 23  17 21 21  15 18 18  13 16 16 +12 15 15  11 13 13  10 13 13  10 12 12  9 12 12  9 12 12 +9 12 12  9 12 12  9 11 11  9 11 11  9 11 11  9 11 11 +9 12 12  9 12 12  9 12 12  9 12 12  10 12 12  10 12 12 +10 12 12  10 12 12  10 13 13  10 13 13  10 13 13  11 13 13 +11 14 14  11 14 14  11 14 14  12 14 14  12 15 15  12 15 15 +12 15 15  13 16 16  28 31 30  43 45 43  47 48 46  47 48 46 +47 48 46  43 45 43  40 41 39  33 36 34  27 29 28  22 24 23 +20 20 20  17 17 17  15 15 15  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  3 4 4  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  1 1 1  60 60 56 +177 172 135  197 193 154  251 251 187  251 251 187  251 251 187  251 251 187 +184 179 149  110 109 94  3 4 4  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  1 1 1  99 98 80  105 104 92 +99 98 80  87 86 72  84 83 72  63 64 60  46 47 45  35 37 36 +30 32 31  25 27 26  18 22 22  16 19 19  14 17 17  12 15 15 +11 14 14  10 13 13  9 12 12  9 12 12  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 11 11  9 12 12  9 12 12 +9 12 12  10 12 12  10 12 12  10 12 12  10 13 13  10 13 13 +10 13 13  11 13 13  11 14 14  11 14 14  11 14 14  12 15 15 +12 15 15  14 17 17  41 42 42  47 48 46  49 51 48  51 52 50 +47 48 46  43 45 43  40 41 39  33 36 34  27 29 28  22 24 23 +19 20 19  16 16 16  14 14 13  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  2 2 2  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  23 24 24  137 133 100  184 179 149 +210 208 158  251 251 187  251 251 187  251 251 187  251 251 187  184 179 149 +110 109 94  13 13 13  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  30 32 31  105 104 92  99 98 80 +84 83 72  84 83 72  72 73 67  55 57 54  41 42 42  32 34 33 +27 29 28  20 24 24  17 20 20  14 17 17  13 16 16  12 14 14 +10 13 13  10 12 12  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 12 12  9 12 12  10 12 12  10 12 12  10 12 12 +10 13 13  10 13 13  10 13 13  11 13 13  11 14 14  11 14 14 +11 14 14  27 29 28  55 56 53  72 73 67  51 52 50  51 52 50 +49 51 48  43 45 43  39 40 39  32 34 33  26 28 27  21 22 21 +19 20 19  16 16 16  18 19 17  13 13 13  12 12 12  12 12 12 +12 12 12  12 12 12  1 1 1  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  8 8 7  84 83 72  184 179 149  197 193 154  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  184 179 149  145 141 105 +19 20 19  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  14 14 13  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  72 73 67  105 104 92  84 83 72 +72 73 67  84 83 72  68 70 65  49 51 48  39 40 39  30 32 31 +25 27 26  18 22 22  15 18 18  13 16 16  12 15 15  11 13 13 +10 12 12  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 12 12  9 12 12  9 12 12 +10 12 12  10 12 12  10 12 12  10 13 13  10 13 13  11 13 13 +13 16 16  41 42 42  99 98 80  158 153 112  65 66 61  51 52 50 +49 51 48  43 45 43  39 40 39  31 33 31  25 27 26  21 22 21 +21 22 21  68 70 65  55 56 53  13 13 13  12 12 12  12 12 12 +12 12 12  11 11 11  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  3 3 3 +63 64 60  158 153 112  184 179 149  210 208 158  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  184 179 149  137 133 100  27 29 28 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +21 22 21  110 109 94  5 6 5  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  13 13 13  105 104 92  90 89 73  72 73 67 +68 70 65  84 83 72  63 64 60  46 47 45  35 37 36  27 29 28 +22 24 23  17 20 20  14 17 17  12 15 15  11 14 14  10 12 12 +10 12 12  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 12 12  9 12 12  10 12 12  10 12 12  10 13 13  10 13 13 +30 32 31  47 48 46  177 172 135  210 208 158  137 133 100  55 56 53 +49 51 48  43 45 43  38 39 37  31 33 31  25 27 26  22 24 23 +110 109 94  184 179 149  63 64 60  13 13 13  12 12 12  12 12 12 +12 12 12  8 9 9  0 0 0  1 1 1  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  21 22 21  105 104 92 +184 179 149  210 208 158  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  251 251 187  184 179 149  145 141 105  23 24 24  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +68 70 65  184 179 149  105 104 92  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  51 52 50  99 98 80  84 83 72  63 64 60 +68 70 65  72 73 67  55 57 54  41 42 42  32 34 33  25 27 26 +20 23 23  16 19 19  13 16 16  12 14 14  10 13 13  10 12 12 +9 11 11  9 11 11  9 11 11  9 11 11  9 11 11  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 11 11  9 12 12  9 12 12  10 12 12  17 20 20 +46 47 45  72 73 67  210 208 158  251 251 187  210 208 158  63 64 60 +49 51 48  43 45 43  37 39 37  30 32 31  24 26 24  105 104 92 +210 208 158  197 193 154  47 48 46  13 13 13  12 12 12  12 12 12 +12 12 12  6 7 7  33 36 34  48 49 45  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  8 8 7  23 24 24  55 56 53  110 109 94 +210 208 158  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  184 179 149  110 109 94  20 20 20  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +110 109 94  251 251 187  210 208 158  47 48 46  0 0 0  0 0 0 +0 0 0  1 1 1  90 89 73  90 89 73  72 73 67  55 56 53 +72 73 67  68 70 65  51 52 50  37 39 37  28 31 30  23 25 24 +17 21 21  15 18 18  12 15 15  11 14 14  10 13 13  9 12 12 +9 11 11  9 11 11  9 11 11  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  9 11 11  9 11 11  9 11 11  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  9 12 12  13 16 16  41 42 42 +49 51 48  110 109 94  251 251 187  251 251 187  251 251 187  105 104 92 +49 51 48  43 45 43  35 37 36  30 31 28  47 48 46  197 193 154 +251 251 187  197 193 154  31 33 31  12 12 12  12 12 12  12 12 12 +12 12 12  51 52 50  184 179 149  72 73 67  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  2 2 2 +11 11 11  21 22 21  30 32 31  40 41 39  60 60 56  145 141 105 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  214 212 158 +184 179 149  110 109 94  13 13 13  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  4 5 4  61 61 53  48 49 45  3 4 3 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +156 151 111  251 251 187  251 251 187  184 179 149  11 11 11  0 0 0 +0 0 0  26 28 27  99 98 80  84 83 72  60 60 56  43 45 43 +72 73 67  65 66 61  49 51 48  35 37 36  27 29 28  20 24 24 +17 20 20  14 17 17  12 15 15  11 13 13  10 12 12  9 11 11 +9 11 11  9 11 11  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  9 11 11  9 11 11 +9 11 11  9 11 11  9 11 11  11 13 13  37 39 37  47 48 46 +51 52 50  184 179 149  251 251 187  251 251 187  251 251 187  145 141 105 +47 48 46  41 42 42  35 37 36  27 29 28  137 133 100  251 251 187 +251 251 187  197 193 154  19 20 19  12 12 12  12 12 12  12 12 12 +27 29 28  184 179 149  214 212 158  63 64 60  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  1 1 1  6 7 7  16 16 16  24 26 24 +30 32 31  38 39 37  47 48 46  55 57 54  68 70 65  110 109 94 +197 193 154  251 251 187  251 251 187  251 251 187  210 208 158  184 179 149 +105 104 92  8 8 7  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  65 66 61  184 179 149  156 151 111 +30 32 31  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +168 163 120  251 251 187  251 251 187  251 251 187  110 109 94  0 0 0 +0 0 0  60 60 56  84 83 72  68 70 65  51 52 50  38 39 37 +84 83 72  63 64 60  43 45 43  33 36 34  25 27 26  20 23 22 +15 18 18  13 16 16  12 14 14  10 13 13  9 12 12  9 11 11 +9 11 11  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +9 11 11  9 11 11  10 12 12  33 36 34  46 47 45  51 52 50 +72 73 67  210 208 158  251 251 187  251 251 187  251 251 187  177 172 135 +47 48 46  41 42 42  35 37 36  37 39 37  184 179 149  251 251 187 +251 251 187  197 193 154  13 13 13  12 12 12  12 12 12  12 12 12 +110 109 94  251 251 187  251 251 187  37 39 37  0 0 0  0 0 0 +0 0 0  21 22 20  2 2 1  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +4 5 5  12 12 12  21 22 21  25 27 26  30 32 31  38 39 37 +46 47 45  55 56 53  60 60 56  65 66 61  68 70 65  105 104 92 +110 109 94  197 193 154  210 208 158  197 193 154  184 179 149  84 83 72 +2 2 2  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  13 13 13  184 179 149  251 251 187 +197 193 154  43 44 41  0 0 0  0 0 0  0 0 0  0 0 0 +145 141 105  251 251 187  251 251 187  251 251 187  214 212 158  43 45 43 +2 2 2  84 83 72  72 73 67  58 59 55  41 42 42  38 39 37 +72 73 67  58 59 55  41 42 42  31 33 31  25 27 26  18 22 22 +14 17 17  12 15 15  12 14 14  10 12 12  9 12 12  9 11 11 +9 11 11  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  9 12 12  31 33 31  43 45 43  49 51 48  55 56 53 +110 109 94  251 251 187  251 251 187  251 251 187  251 251 187  168 163 120 +47 48 46  41 42 42  33 36 34  63 64 60  197 193 154  251 251 187 +251 251 187  184 179 149  13 13 13  12 12 12  12 12 12  16 16 16 +197 193 154  251 251 187  239 239 170  20 20 20  0 0 0  2 2 1 +108 107 93  110 109 94  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  1 1 1  4 5 5  11 11 11  18 19 18 +22 24 23  26 28 27  32 34 33  39 40 39  46 47 45  51 52 50 +55 57 54  60 60 56  63 64 60  63 64 60  63 64 60  58 59 55 +63 64 60  99 98 80  145 141 105  137 133 100  43 45 43  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  3 4 3  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  110 109 94  251 251 187 +251 251 187  184 179 149  25 27 26  0 0 0  0 0 0  0 0 0 +99 98 80  251 251 187  251 251 187  251 251 187  251 251 187  156 151 111 +25 27 26  84 83 72  65 66 61  47 48 46  32 34 33  39 40 39 +72 73 67  55 57 54  40 41 39  30 32 31  23 25 24  18 22 22 +14 17 17  12 15 15  11 13 13  10 12 12  9 11 11  9 11 11 +9 11 11  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +9 11 11  28 31 30  41 42 42  47 48 46  55 56 53  58 59 55 +137 133 100  251 251 187  251 251 187  251 251 187  210 208 158  137 133 100 +47 48 46  40 41 39  32 34 33  75 75 61  184 179 149  239 239 170 +251 251 187  177 172 135  13 13 13  12 12 12  12 12 12  43 44 41 +197 193 154  251 251 187  210 208 158  10 10 9  0 0 0  84 83 72 +251 251 187  84 83 72  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  1 1 1 +6 7 7  11 11 11  17 17 17  20 20 20  23 24 24  27 29 28 +32 34 33  38 39 37  43 45 43  47 48 46  51 52 50  55 56 53 +58 59 55  58 59 55  55 57 54  55 56 53  47 48 46  41 42 42 +35 37 36  31 33 31  47 48 46  14 14 13  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  66 65 55  99 98 80  20 20 20 +0 0 0  0 0 0  0 0 0  0 0 0  43 45 43  214 212 158 +251 251 187  251 251 187  145 141 105  3 3 3  0 0 0  0 0 0 +48 49 45  184 179 149  239 239 170  251 251 187  239 239 170  177 172 135 +84 83 72  72 73 67  55 56 53  39 40 39  26 28 27  39 40 39 +68 70 65  51 52 50  39 40 39  28 31 30  22 24 23  17 20 20 +14 17 17  12 14 14  10 13 13  9 11 11  9 11 11  9 11 11 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +27 29 28  40 41 39  46 47 45  51 52 50  55 57 54  63 64 60 +131 127 93  197 193 154  210 208 158  197 193 154  168 163 120  96 95 69 +47 48 46  40 41 39  32 34 33  71 71 57  145 141 105  184 179 149 +184 179 149  131 127 93  13 13 13  12 12 12  12 12 12  48 49 45 +168 163 120  184 179 149  156 151 111  6 7 7  14 14 13  177 172 135 +239 239 170  40 41 39  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  3 3 3  6 7 7  11 11 11  16 16 16 +18 19 18  21 22 21  23 24 24  27 29 28  32 34 33  37 39 37 +41 42 42  43 45 43  47 48 46  51 52 50  51 52 50  51 52 50 +51 52 50  49 51 48  46 47 45  40 41 39  32 34 33  25 27 26 +20 20 20  14 14 13  2 2 2  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  33 36 34  197 193 154  184 179 149 +41 42 42  0 0 0  0 0 0  0 0 0  3 3 3  184 179 149 +251 251 187  251 251 187  184 179 149  48 49 45  0 0 0  0 0 0 +16 17 12  121 119 87  177 172 135  194 189 146  188 184 146  145 141 105 +82 81 62  63 64 60  46 47 45  31 33 31  21 22 21  35 37 36 +68 70 65  51 52 50  37 39 37  27 30 29  22 24 23  17 20 20 +13 16 16  12 14 14  10 13 13  9 11 11  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  25 27 26 +38 39 37  43 45 43  51 52 50  55 56 53  60 60 56  63 64 60 +92 91 72  158 153 112  176 171 126  171 165 117  149 143 98  82 81 62 +44 46 43  38 39 37  30 32 31  71 71 57  131 127 93  160 154 106 +149 143 98  82 81 62  13 13 13  12 12 12  12 12 12  46 47 43 +121 119 87  134 131 96  96 95 69  7 7 6  38 39 37  131 127 93 +145 141 105  12 13 12  0 0 0  1 1 1  3 3 3  6 7 7 +10 10 9  12 12 12  14 14 13  16 16 16  18 19 18  21 22 21 +22 24 23  26 28 27  30 31 28  33 36 34  37 39 37  40 41 39 +41 42 42  43 45 43  46 47 45  46 47 45  46 47 45  43 45 43 +41 42 42  37 39 37  31 33 31  26 28 27  21 22 21  16 16 16 +6 7 7  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  177 172 135  251 251 187 +197 193 154  27 29 28  0 0 0  0 0 0  0 0 0  110 109 94 +239 239 170  239 239 170  184 179 149  87 86 72  2 2 1  0 0 0 +1 1 1  82 81 62  142 137 94  165 161 109  165 161 109  131 127 93 +75 75 61  55 56 53  37 39 37  25 27 26  19 20 19  32 34 33 +65 66 61  49 51 48  35 37 36  27 29 28  20 23 23  16 19 19 +13 16 16  13 13 13  10 12 12  9 11 11  8 10 10  8 10 10 +8 9 9  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  22 24 23  35 37 36 +41 42 42  47 48 46  55 56 53  58 59 55  63 64 60  65 66 61 +71 71 57  131 127 93  160 154 106  160 154 106  142 137 94  82 81 62 +46 47 43  40 41 39  33 36 34  66 65 55  125 122 87  149 143 98 +142 137 94  82 81 62  17 17 17  18 19 17  14 14 13  46 47 43 +118 116 76  125 122 87  96 95 69  16 17 12  71 71 57  103 101 77 +82 81 62  11 11 11  11 11 11  13 13 13  14 14 13  14 14 13 +15 15 15  16 16 16  17 17 17  19 20 19  21 22 21  23 24 24 +26 28 27  27 29 28  31 33 31  33 36 34  35 37 36  38 39 37 +39 40 39  39 40 39  38 39 37  37 39 37  35 37 36  31 33 31 +27 29 28  24 26 24  21 22 21  17 17 17  12 12 12  2 2 2 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  68 70 65  251 251 187 +251 251 187  156 151 111  2 2 1  0 0 0  0 0 0  43 44 41 +177 172 135  184 179 149  158 153 112  103 101 77  19 20 18  0 0 0 +0 0 0  46 47 43  131 127 93  160 154 106  160 154 106  131 127 93 +71 71 57  43 45 43  30 32 31  21 22 21  16 16 16  26 28 27 +63 64 60  47 48 46  35 37 36  26 28 27  20 23 23  16 19 19 +13 16 16  13 13 13  10 12 12  9 11 11  8 10 10  8 10 10 +7 9 9  7 9 9  8 9 9  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  20 20 20  33 36 34  40 41 39 +46 47 45  51 52 50  55 57 54  60 60 56  63 64 60  65 66 61 +66 65 55  118 116 76  151 147 98  165 161 109  151 147 98  121 119 87 +96 95 69  96 95 69  96 95 69  103 101 77  142 137 94  151 147 98 +142 137 94  103 101 77  82 81 62  82 81 62  82 81 62  96 95 69 +131 127 93  142 137 94  103 101 77  46 47 43  96 95 69  118 116 76 +71 71 57  14 14 13  14 14 13  15 15 15  15 15 15  16 16 16 +16 16 16  17 17 17  18 19 18  20 20 20  21 22 21  23 24 24 +25 27 26  27 29 28  30 31 28  30 32 31  31 33 31  31 33 31 +31 33 31  31 33 31  30 31 28  27 29 28  25 27 26  22 24 23 +20 20 20  16 16 16  13 13 13  6 7 7  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +58 59 55  68 70 65  8 8 7  0 0 0  10 10 9  210 208 158 +251 251 187  184 179 149  38 39 37  0 0 0  0 0 0  8 8 7 +103 101 77  149 143 98  149 143 98  118 116 76  40 41 39  25 27 25 +53 55 47  82 81 62  144 139 99  165 161 109  165 161 109  142 137 94 +71 71 57  35 37 36  24 26 24  18 19 18  15 15 15  22 24 23 +63 64 60  46 47 45  33 36 34  26 28 27  20 23 22  17 18 17 +12 15 15  11 13 13  10 12 12  9 11 11  8 10 10  8 10 10 +7 9 9  7 9 9  7 9 9  7 9 9  8 9 9  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  16 16 16  30 31 28  35 37 36  41 42 42 +47 48 46  55 56 53  58 59 55  63 64 60  65 66 61  65 66 61 +61 61 53  103 101 77  151 147 98  171 165 117  171 165 117  168 163 120 +158 153 112  158 153 112  155 149 109  151 147 98  151 147 98  160 154 106 +151 147 98  149 143 98  142 137 94  149 143 98  149 143 98  149 143 98 +155 149 109  151 147 98  131 127 93  103 101 77  125 122 87  118 116 76 +71 71 57  16 16 16  16 16 16  16 16 16  17 17 17  17 17 17 +17 17 17  17 17 17  18 19 18  19 20 19  20 20 20  21 22 21 +23 24 24  24 26 24  25 27 26  26 28 27  26 28 27  26 28 27 +25 27 26  24 26 24  22 24 23  21 22 21  19 20 19  16 16 16 +14 14 13  8 8 7  1 1 1  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +20 20 20  184 179 149  168 163 120  21 22 21  0 0 0  105 104 92 +177 172 135  145 141 105  71 71 57  0 0 0  0 0 0  0 0 0 +66 65 55  131 127 93  151 147 98  142 137 94  118 116 76  121 119 87 +145 141 105  158 153 112  176 171 126  178 174 128  176 171 126  149 145 103 +96 95 69  31 33 31  21 22 21  16 16 16  14 14 13  18 19 18 +60 60 56  46 47 45  33 36 34  25 27 26  21 22 21  15 18 18 +12 15 15  11 13 13  9 11 11  8 10 10  8 10 10  8 9 9 +7 9 9  7 9 9  7 9 9  7 9 9  7 9 9  8 9 9 +8 9 9  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  10 12 12  26 28 27  31 33 31  38 39 37  43 45 43 +51 52 50  55 56 53  60 60 56  63 64 60  65 66 61  68 70 65 +63 64 60  96 95 69  158 153 112  178 174 128  188 184 146  194 189 146 +194 189 146  188 184 146  184 181 136  176 171 126  171 165 117  173 167 111 +173 167 111  165 161 109  171 165 117  174 170 121  176 171 126  178 174 128 +178 174 128  174 170 121  160 154 106  149 143 98  149 143 98  125 122 87 +71 71 57  16 16 16  16 16 16  17 17 17  17 17 17  17 17 17 +17 17 17  17 17 17  17 17 17  18 19 18  19 20 19  20 20 20 +21 22 21  21 22 21  21 22 21  22 24 23  21 22 21  21 22 21 +21 22 21  19 20 19  18 19 18  16 16 16  14 14 13  11 11 11 +3 3 3  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  105 104 92  197 193 154  110 109 94  9 9 8  36 38 35 +121 119 87  131 127 93  96 95 69  18 19 17  30 31 28  66 65 55 +96 95 69  142 137 94  160 154 106  160 154 106  160 154 106  168 163 120 +184 181 136  194 191 148  197 193 154  197 193 154  194 189 146  168 163 120 +125 122 87  46 47 43  18 19 18  15 15 15  13 13 13  14 14 13 +55 57 54  43 45 43  32 34 33  25 27 26  18 22 22  17 17 17 +12 14 14  10 12 12  9 11 11  8 10 10  8 9 9  7 9 9 +6 8 8  7 9 9  7 9 9  7 9 9  7 9 9  7 9 9 +7 9 9  8 9 9  8 9 9  8 10 10  8 10 10  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  32 34 33  41 42 42  35 37 36  39 40 39  37 39 37 +35 37 36  55 57 54  60 60 56  63 64 60  65 66 61  65 66 61 +61 63 57  115 113 82  168 163 120  194 191 148  204 201 155  210 208 158 +210 208 158  210 208 158  197 193 154  194 189 146  186 182 128  176 171 126 +174 170 121  176 171 126  186 182 128  190 186 136  194 191 148  197 193 154 +197 193 154  188 184 146  181 176 137  174 170 121  165 161 109  142 137 94 +82 81 62  24 26 24  16 16 16  16 16 16  16 16 16  16 16 16 +17 17 17  17 17 17  17 17 17  17 17 17  18 19 18  19 20 19 +19 20 19  19 20 19  20 20 20  19 20 19  19 20 19  18 19 18 +17 17 17  15 15 15  13 13 13  12 12 12  6 7 7  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  17 18 17  137 133 100  115 113 82  53 55 47  19 20 18 +103 101 77  144 139 99  137 133 100  115 113 82  137 133 100  156 151 111 +158 153 112  164 159 111  171 165 117  174 170 121  178 174 128  194 189 146 +204 201 155  214 212 158  214 212 158  214 212 158  210 208 158  188 184 146 +158 153 112  87 86 72  17 17 17  13 13 13  13 13 13  15 15 15 +55 56 53  43 45 43  32 34 33  24 26 24  17 20 20  16 16 16 +12 14 14  10 12 12  8 10 10  8 10 10  7 9 9  6 8 8 +6 8 8  6 8 8  6 8 8  7 9 9  7 9 9  7 9 9 +7 9 9  7 9 9  7 9 9  7 9 9  8 9 9  8 10 10 +8 10 10  8 10 10  8 10 10  8 10 10  8 10 10  8 10 10 +8 10 10  110 109 94  84 83 72  49 51 48  26 28 27  8 10 10 +8 9 9  51 52 50  58 59 55  63 64 60  63 64 60  63 64 60 +66 65 55  134 131 96  181 176 137  210 208 158  214 212 158  239 239 170 +239 239 170  224 223 159  210 208 158  204 201 155  194 189 146  186 182 128 +186 182 128  184 181 136  194 189 146  204 201 155  210 208 158  210 208 158 +210 208 158  210 208 158  197 193 154  190 186 136  176 171 126  155 149 109 +118 116 76  36 38 35  15 15 15  16 16 16  16 16 16  16 16 16 +16 16 16  16 16 16  16 16 16  16 16 16  16 16 16  17 17 17 +17 17 17  17 17 17  17 17 17  16 16 16  16 16 16  15 15 15 +13 13 13  12 12 12  8 8 7  2 2 2  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  53 55 47  103 101 77  96 95 69  53 55 47 +103 101 77  158 153 112  177 172 135  184 179 149  188 184 146  197 193 154 +194 189 146  190 186 136  184 181 136  184 181 136  194 189 146  210 208 158 +214 212 158  239 239 170  251 251 187  251 251 187  224 223 159  204 201 155 +177 172 135  121 119 87  30 31 28  13 13 13  12 12 12  39 40 39 +60 60 56  43 45 43  32 34 33  23 25 24  18 19 18  13 16 16 +13 13 13  9 11 11  8 10 10  8 9 9  6 8 8  6 8 8 +6 8 8  6 8 8  6 8 8  6 8 8  6 8 8  7 9 9 +7 9 9  7 9 9  7 9 9  7 9 9  7 9 9  7 9 9 +7 9 9  8 9 9  8 9 9  8 10 10  8 10 10  8 10 10 +14 17 17  197 193 154  158 153 112  55 57 54  7 9 9  7 9 9 +8 10 10  51 52 50  58 59 55  60 60 56  63 64 60  63 64 60 +71 71 57  155 149 109  194 191 148  214 212 158  251 251 187  251 251 187 +251 251 187  251 251 187  239 239 170  210 208 158  197 193 154  190 186 136 +190 186 136  194 189 146  204 201 155  210 208 158  224 223 159  239 239 170 +239 239 170  224 223 159  210 208 158  204 201 155  190 186 136  164 159 111 +125 122 87  40 41 39  15 15 15  15 15 15  15 15 15  15 15 15 +16 16 16  16 16 16  16 16 16  16 16 16  16 16 16  16 16 16 +16 16 16  16 16 16  15 15 15  14 14 13  13 13 13  12 12 12 +8 9 9  3 3 3  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  21 22 20  96 95 69  125 122 87  121 119 87 +144 139 99  177 172 135  197 193 154  210 208 158  214 212 158  214 212 158 +210 208 158  204 201 155  194 191 148  194 189 146  204 201 155  214 212 158 +239 239 170  251 251 187  251 251 187  251 251 187  251 251 187  214 212 158 +188 184 146  145 141 105  53 55 47  12 12 12  15 15 15  63 64 60 +63 64 60  41 42 42  31 33 31  23 24 24  17 18 17  12 15 15 +11 13 13  9 11 11  8 9 9  7 9 9  6 8 8  6 8 8 +6 7 7  6 7 7  6 8 8  6 8 8  6 8 8  6 8 8 +6 8 8  7 9 9  7 9 9  7 9 9  7 9 9  7 9 9 +7 9 9  7 9 9  7 9 9  7 9 9  7 9 9  8 8 7 +43 45 43  251 251 187  156 151 111  8 10 10  7 9 9  7 9 9 +21 22 21  51 52 50  55 56 53  55 57 54  58 59 55  58 59 55 +75 75 61  158 153 112  197 193 154  224 223 159  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  214 212 158  204 201 155  194 189 146 +190 186 136  197 193 154  210 208 158  224 223 159  251 251 187  251 251 187 +251 251 187  251 251 187  239 239 170  210 208 158  197 193 154  176 171 126 +125 122 87  36 38 35  14 14 13  14 14 13  15 15 15  15 15 15 +15 15 15  15 15 15  15 15 15  15 15 15  15 15 15  15 15 15 +15 15 15  14 14 13  13 13 13  12 12 12  10 10 9  3 4 4 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  7 7 5  71 71 57  131 127 93  158 153 112 +177 172 135  197 193 154  214 212 158  239 239 170  251 251 187  251 251 187 +238 237 168  210 208 158  204 201 155  197 193 154  204 201 155  214 212 158 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  214 212 158 +197 193 154  156 151 111  66 65 55  12 12 12  37 39 37  58 59 55 +58 59 55  41 42 42  31 33 31  22 24 23  17 17 17  12 14 14 +10 12 12  8 10 10  6 8 8  6 8 8  6 7 7  6 7 7 +6 7 7  5 7 7  6 7 7  6 7 7  6 8 8  6 8 8 +6 8 8  6 8 8  6 8 8  7 9 9  7 9 9  7 9 9 +7 9 9  6 8 8  6 8 8  6 8 8  6 8 8  6 8 8 +61 63 57  197 193 154  16 19 19  6 8 8  6 8 8  8 9 9 +41 42 42  47 48 46  51 52 50  51 52 50  55 56 53  55 56 53 +71 71 57  158 153 112  197 193 154  224 223 159  251 251 187  251 251 187 +251 251 187  251 251 187  239 239 170  214 212 158  204 201 155  194 189 146 +190 186 136  197 193 154  210 208 158  239 239 170  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  224 223 159  204 201 155  177 172 135 +121 119 87  30 31 28  13 13 13  14 14 13  14 14 13  14 14 13 +14 14 13  14 14 13  15 15 15  15 15 15  14 14 13  13 13 13 +12 12 12  12 12 12  10 10 9  4 5 5  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  48 49 45  131 127 93  174 170 121 +194 189 146  210 208 158  239 239 170  251 251 187  251 251 187  251 251 187 +251 251 187  214 212 158  204 201 155  197 193 154  204 201 155  210 208 158 +239 239 170  251 251 187  251 251 187  251 251 187  239 239 170  214 212 158 +194 191 148  156 151 111  71 71 57  19 20 19  51 52 50  51 52 50 +51 52 50  41 42 42  30 32 31  21 22 21  17 17 17  13 13 13 +9 11 11  8 9 9  6 8 8  6 7 7  6 7 7  5 7 7 +5 6 5  5 6 5  5 7 7  5 7 7  6 7 7  6 7 7 +6 8 8  6 8 8  6 8 8  6 7 7  6 7 7  6 7 7 +6 7 7  6 8 8  6 8 8  6 8 8  6 8 8  6 8 8 +55 56 53  43 45 43  6 8 8  6 8 8  6 8 8  47 48 46 +60 60 56  47 48 46  46 47 45  47 48 46  38 39 37  10 12 12 +66 65 55  145 141 105  197 193 154  214 212 158  251 251 187  251 251 187 +251 251 187  251 251 187  224 223 159  210 208 158  194 191 148  184 181 136 +184 181 136  194 189 146  204 201 155  224 223 159  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  239 239 170  210 208 158  181 176 137 +115 113 82  21 22 20  13 13 13  13 13 13  13 13 13  13 13 13 +14 14 13  13 13 13  13 13 13  13 13 13  12 12 12  11 11 11 +10 10 9  6 7 7  1 1 1  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  2 2 1  66 65 55  144 139 99  178 174 128 +204 201 155  214 212 158  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  214 212 158  204 201 155  194 191 148  197 193 154  204 201 155 +214 212 158  239 239 170  239 239 170  239 239 170  214 212 158  210 208 158 +184 181 136  149 145 103  66 65 55  41 42 42  47 48 46  46 47 45 +43 45 43  39 40 39  28 31 30  21 22 21  16 16 16  10 12 12 +8 10 10  6 8 8  6 7 7  6 7 7  5 6 5  5 6 5 +5 6 5  5 6 5  5 6 5  5 6 5  5 7 7  5 7 7 +6 7 7  6 7 7  6 7 7  5 7 7  5 7 7  5 7 7 +5 7 7  6 7 7  6 7 7  6 7 7  6 7 7  6 8 8 +6 8 8  6 8 8  6 7 7  6 7 7  46 47 45  156 151 111 +105 104 92  58 59 55  43 45 43  32 34 33  6 8 8  6 8 8 +49 51 48  125 122 87  181 176 137  204 201 155  214 212 158  239 239 170 +239 239 170  214 212 158  210 208 158  197 193 154  181 176 137  176 171 126 +176 171 126  184 181 136  197 193 154  210 208 158  239 239 170  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  210 208 158  177 172 135 +99 98 80  13 13 13  12 12 12  12 12 12  13 13 13  12 12 12 +12 12 12  12 12 12  11 11 11  11 11 11  8 9 9  4 5 5 +1 1 1  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  1 1 0  61 61 53  142 137 94  181 176 137 +204 201 155  224 223 159  251 251 187  251 251 187  251 251 187  251 251 187 +251 251 187  214 212 158  197 193 154  190 186 136  184 181 136  188 184 146 +197 193 154  204 201 155  210 208 158  210 208 158  204 201 155  194 189 146 +176 171 126  134 131 96  66 65 55  43 45 43  41 42 42  39 40 39 +35 37 36  33 36 34  27 29 28  20 20 20  15 15 15  9 11 11 +8 9 9  6 7 7  5 6 5  5 6 5  4 5 5  4 5 5 +4 5 5  4 5 5  4 5 5  4 5 5  5 6 5  4 5 5 +4 5 5  5 6 5  4 5 5  5 6 5  5 6 5  5 6 5 +5 7 7  5 7 7  5 7 7  5 7 7  5 7 7  5 7 7 +6 7 7  6 7 7  6 7 7  28 31 30  184 179 149  184 179 149 +145 141 105  84 83 72  27 29 28  5 7 7  5 6 5  16 16 16 +43 44 41  96 95 69  158 153 112  188 184 146  204 201 155  210 208 158 +204 201 155  197 193 154  184 179 149  177 172 135  168 163 120  164 159 111 +164 159 111  174 170 121  184 181 136  197 193 154  214 212 158  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  210 208 158  177 172 135 +71 71 57  11 11 11  12 12 12  11 11 11  11 11 11  11 11 11 +10 10 9  10 10 9  8 8 7  3 4 4  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  31 33 31  121 119 87  176 171 126 +197 193 154  214 212 158  251 251 187  251 251 187  251 251 187  251 251 187 +239 239 170  210 208 158  194 189 146  178 174 128  174 170 121  176 171 126 +177 172 135  181 176 137  184 179 149  184 179 149  181 176 137  178 174 128 +158 153 112  121 119 87  53 55 47  37 39 37  33 36 34  30 32 31 +27 29 28  25 27 26  24 26 24  19 20 19  13 13 13  8 10 10 +6 8 8  6 7 7  5 6 5  4 5 5  4 5 5  4 5 5 +4 5 5  4 5 5  4 5 5  3 4 4  3 4 4  4 5 5 +4 5 5  4 5 5  4 5 5  4 5 5  4 5 5  4 5 5 +5 6 5  5 6 5  5 6 5  5 6 5  5 6 5  5 6 5 +5 6 5  5 6 5  12 14 14  145 141 105  184 179 149  177 172 135 +90 89 73  21 22 21  5 6 5  5 6 5  4 5 5  37 39 37 +38 39 37  61 61 53  134 131 96  168 163 120  184 181 136  188 184 146 +184 179 149  177 172 135  168 163 120  164 159 111  155 149 109  151 147 98 +151 147 98  164 159 111  176 171 126  184 179 149  210 208 158  239 239 170 +251 251 187  251 251 187  251 251 187  239 239 170  210 208 158  158 153 112 +46 47 43  10 10 9  10 10 9  10 10 9  8 9 9  8 9 9 +6 7 7  3 3 3  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  13 12 7  82 81 62  158 153 112 +188 184 146  210 208 158  239 239 170  251 251 187  251 251 187  251 251 187 +224 223 159  204 201 155  184 181 136  171 165 117  164 159 111  160 154 106 +158 153 112  164 159 111  168 163 120  168 163 120  168 163 120  164 159 111 +142 137 94  96 95 69  43 44 41  27 29 28  26 28 27  23 24 24 +21 22 21  18 19 18  17 17 17  18 19 18  13 13 13  8 8 7 +6 7 7  5 6 5  4 5 5  3 4 4  3 4 4  3 4 4 +3 4 4  3 4 4  3 3 3  3 3 3  3 4 4  3 4 4 +3 4 4  3 4 4  4 5 5  4 5 5  4 5 5  4 5 5 +4 5 5  4 5 5  4 5 5  4 5 5  4 5 5  4 5 5 +4 5 5  4 5 5  4 5 5  4 5 5  4 5 5  4 5 5 +4 5 5  4 5 5  4 5 5  4 5 5  31 33 31  65 66 61 +37 39 37  38 39 37  96 95 69  144 139 99  168 163 120  174 170 121 +168 163 120  164 159 111  155 149 109  149 145 103  149 143 98  142 137 94 +149 143 98  151 147 98  164 159 111  177 172 135  197 193 154  210 208 158 +251 251 187  251 251 187  251 251 187  239 239 170  197 193 154  137 133 100 +24 26 24  8 9 9  8 9 9  8 8 7  6 7 7  2 2 2 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  46 47 43  125 122 87 +176 171 126  197 193 154  210 208 158  239 239 170  251 251 187  239 239 170 +214 212 158  197 193 154  181 176 137  164 159 111  151 147 98  149 143 98 +149 143 98  149 143 98  149 145 103  155 149 109  160 154 106  149 143 98 +118 116 76  82 81 62  30 31 28  21 22 21  19 20 19  17 17 17 +14 14 13  12 12 12  10 10 9  12 12 12  10 12 12  6 8 8 +4 5 5  3 4 4  3 4 4  3 4 4  3 3 3  3 3 3 +3 3 3  3 3 3  3 3 3  3 3 3  2 3 3  2 3 3 +3 4 4  3 4 4  3 4 4  3 4 4  3 4 4  4 5 5 +4 5 5  3 4 4  3 4 4  3 4 4  3 4 4  3 4 4 +4 5 5  4 5 5  4 5 5  4 5 5  4 5 5  4 5 5 +4 5 5  3 4 4  3 4 4  23 24 24  110 109 94  72 73 67 +39 40 39  22 24 23  46 47 43  103 101 77  142 137 94  155 149 109 +160 154 106  155 149 109  149 143 98  142 137 94  142 137 94  142 137 94 +142 137 94  149 143 98  155 149 109  176 171 126  184 179 149  210 208 158 +239 239 170  251 251 187  251 251 187  214 212 158  184 179 149  105 104 92 +10 10 9  6 7 7  3 4 4  1 1 1  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  12 12 9  82 81 62 +149 145 103  181 176 137  197 193 154  210 208 158  214 212 158  214 212 158 +210 208 158  197 193 154  177 172 135  158 153 112  149 143 98  142 137 94 +142 137 94  142 137 94  149 143 98  151 147 98  151 147 98  131 127 93 +103 101 77  71 71 57  22 24 23  15 15 15  13 13 13  11 11 11 +8 9 9  6 7 7  6 7 7  4 5 5  8 9 9  6 7 7 +4 5 5  3 3 3  3 3 3  3 3 3  3 3 3  2 2 2 +2 2 2  2 2 2  2 2 2  2 2 2  2 2 2  2 3 3 +2 3 3  2 3 3  2 3 3  3 4 4  3 4 4  3 4 4 +3 4 4  3 4 4  3 3 3  3 4 4  3 4 4  3 4 4 +3 4 4  3 4 4  3 4 4  3 4 4  3 4 4  3 4 4 +3 4 4  3 4 4  21 22 21  145 141 105  145 141 105  72 73 67 +17 18 17  3 4 4  21 22 20  66 65 55  118 116 76  142 137 94 +149 143 98  151 147 98  149 143 98  142 137 94  142 137 94  142 137 94 +142 137 94  149 143 98  155 149 109  168 163 120  184 179 149  210 208 158 +239 239 170  251 251 187  251 251 187  210 208 158  177 172 135  71 71 57 +3 3 3  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  36 38 35 +115 113 82  158 153 112  181 176 137  197 193 154  204 201 155  210 208 158 +204 201 155  188 184 146  177 172 135  164 159 111  149 145 103  142 137 94 +142 137 94  142 137 94  149 143 98  151 147 98  149 143 98  125 122 87 +96 95 69  61 61 53  16 17 12  8 9 9  8 8 7  6 7 7 +4 5 5  3 4 4  3 3 3  3 3 3  3 3 3  5 6 5 +3 4 4  2 3 3  2 2 2  2 2 2  2 2 2  2 2 2 +2 2 2  2 2 2  2 2 2  2 2 2  2 2 2  1 2 2 +2 2 2  2 2 2  2 3 3  2 3 3  2 3 3  2 3 3 +3 3 3  3 3 3  3 3 3  3 3 3  3 3 3  3 3 3 +3 3 3  2 3 3  2 3 3  3 4 4  3 4 4  3 4 4 +3 4 4  3 4 4  3 4 4  8 9 9  8 8 7  3 3 3 +3 3 3  3 3 3  9 9 8  36 38 35  82 81 62  118 116 76 +142 137 94  151 147 98  151 147 98  151 147 98  149 143 98  149 143 98 +149 143 98  151 147 98  160 154 106  176 171 126  188 184 146  210 208 158 +239 239 170  251 251 187  239 239 170  210 208 158  156 151 111  31 33 31 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  7 7 5 +66 65 55  125 122 87  158 153 112  181 176 137  194 189 146  197 193 154 +197 193 154  184 179 149  177 172 135  168 163 120  156 151 111  151 147 98 +151 147 98  151 147 98  151 147 98  161 156 96  149 143 98  118 116 76 +82 81 62  53 55 47  12 12 9  4 5 5  3 4 4  3 3 3 +3 3 3  3 3 3  2 2 2  2 2 2  1 1 1  1 2 2 +3 3 3  2 2 2  2 2 2  2 2 2  2 2 2  2 2 2 +1 1 1  1 1 1  1 1 1  1 1 1  1 2 2  1 2 2 +1 2 2  1 2 2  1 2 2  2 2 2  2 2 2  2 3 3 +2 3 3  2 3 3  2 3 3  2 3 3  2 2 2  2 2 2 +2 3 3  2 3 3  2 3 3  2 3 3  2 3 3  2 3 3 +2 3 3  2 3 3  2 3 3  2 3 3  2 3 3  3 3 3 +3 3 3  3 3 3  72 73 67  61 61 53  53 55 47  96 95 69 +131 127 93  151 147 98  161 156 96  161 156 96  151 147 98  151 147 98 +161 156 96  160 154 106  164 159 111  177 172 135  197 193 154  210 208 158 +239 239 170  251 251 187  224 223 159  197 193 154  131 127 93  9 9 8 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +24 26 24  82 81 62  131 127 93  164 159 111  178 174 128  188 184 146 +188 184 146  188 184 146  181 176 137  176 171 126  168 163 120  164 159 111 +160 154 106  160 154 106  160 154 106  160 154 106  151 147 98  125 122 87 +82 81 62  61 61 53  12 12 9  3 3 3  3 3 3  2 2 2 +2 2 2  1 1 1  1 1 1  1 1 1  0 0 0  0 0 0 +0 0 0  2 2 2  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 2 2  1 2 2  1 2 2  1 2 2 +1 2 2  2 2 2  2 2 2  2 2 2  2 2 2  2 2 2 +2 2 2  2 2 2  2 2 2  2 2 2  2 2 2  2 2 2 +2 3 3  2 3 3  2 3 3  2 3 3  2 3 3  2 3 3 +2 3 3  30 32 31  72 73 67  31 33 31  36 38 35  82 81 62 +118 116 76  149 143 98  161 156 96  161 156 96  161 156 96  160 154 106 +165 161 109  165 161 109  176 171 126  188 184 146  204 201 155  214 212 158 +239 239 170  239 239 170  214 212 158  184 179 149  82 81 62  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +2 2 2  43 44 41  96 95 69  131 127 93  160 154 106  176 171 126 +184 181 136  184 181 136  184 181 136  181 176 137  178 174 128  174 170 121 +171 165 117  173 167 111  173 167 111  173 167 111  160 154 106  131 127 93 +96 95 69  66 65 55  16 17 12  2 2 2  1 1 1  1 1 1 +1 1 1  1 1 1  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 2 2  1 2 2  1 2 2  1 2 2  1 2 2  2 2 2 +2 2 2  2 2 2  2 2 2  2 2 2  2 2 2  2 2 2 +2 2 2  2 2 2  2 2 2  2 2 2  2 2 2  2 2 2 +2 2 2  2 2 2  2 2 2  10 9 6  30 31 28  71 71 57 +118 116 76  149 143 98  165 161 109  165 161 109  165 161 109  173 167 111 +173 167 111  176 171 126  184 181 136  197 193 154  210 208 158  224 223 159 +251 251 187  239 239 170  210 208 158  168 163 120  40 41 39  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  13 12 7  61 61 53  96 95 69  131 127 93  160 154 106 +176 171 126  184 181 136  184 181 136  188 184 146  184 181 136  184 181 136 +184 181 136  186 182 128  186 182 128  178 174 128  174 170 121  149 145 103 +118 116 76  82 81 62  21 22 20  1 1 1  1 1 1  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 2 2 +1 2 2  1 2 2  1 2 2  1 2 2  1 2 2  2 2 2 +2 2 2  2 2 2  2 2 2  2 2 2  2 2 2  2 2 2 +2 2 2  2 2 2  2 2 2  3 3 3  30 31 28  66 65 55 +118 116 76  149 143 98  165 161 109  173 167 111  173 167 111  174 170 121 +186 182 128  190 186 136  197 193 154  210 208 158  224 223 159  251 251 187 +251 251 187  239 239 170  197 193 154  137 133 100  12 12 9  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  30 31 28  71 71 57  103 101 77  134 131 96 +164 159 111  176 171 126  184 181 136  188 184 146  194 189 146  197 193 154 +197 193 154  197 193 154  194 191 148  194 189 146  190 186 136  176 171 126 +145 141 105  103 101 77  40 41 39  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 2 2  1 2 2 +1 2 2  1 2 2  1 2 2  1 2 2  1 2 2  1 2 2 +1 2 2  1 2 2  1 2 2  1 2 2  30 31 28  71 71 57 +118 116 76  160 154 106  173 167 111  178 174 128  186 182 128  190 186 136 +194 191 148  204 201 155  210 208 158  224 223 159  251 251 187  251 251 187 +251 251 187  214 212 158  184 179 149  84 83 72  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  5 5 3  43 44 41  82 81 62  103 101 77 +142 137 94  165 161 109  178 174 128  190 186 136  197 193 154  204 201 155 +210 208 158  210 208 158  210 208 158  210 208 158  210 208 158  197 193 154 +177 172 135  145 141 105  79 78 62  5 4 3  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 2 2  1 2 2  30 31 28  82 81 62 +142 137 94  165 161 109  178 174 128  190 186 136  194 191 148  204 201 155 +210 208 158  214 212 158  239 239 170  251 251 187  251 251 187  251 251 187 +251 251 187  210 208 158  168 163 120  36 38 35  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  16 17 12  53 55 47  82 81 62 +118 116 76  151 147 98  171 165 117  184 181 136  194 191 148  210 208 158 +214 212 158  224 223 159  239 239 170  239 239 170  224 223 159  214 212 158 +197 193 154  176 171 126  115 113 82  24 26 24  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  40 41 39  103 101 77 +151 147 98  176 171 126  190 186 136  197 193 154  210 208 158  214 212 158 +239 239 170  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +239 239 170  197 193 154  110 109 94  3 4 3  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  30 31 28  66 65 55 +96 95 69  125 122 87  160 154 106  178 174 128  194 189 146  204 201 155 +214 212 158  239 239 170  251 251 187  251 251 187  251 251 187  239 239 170 +210 208 158  188 184 146  149 145 103  61 61 53  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  61 61 53  131 127 93 +164 159 111  184 181 136  197 193 154  210 208 158  224 223 159  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  251 251 187 +210 208 158  168 163 120  43 44 41  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  4 3 2  36 38 35 +71 71 57  96 95 69  142 137 94  165 161 109  184 181 136  197 193 154 +210 208 158  239 239 170  251 251 187  251 251 187  251 251 187  251 251 187 +214 212 158  197 193 154  168 163 120  103 101 77  7 7 5  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +1 1 1  0 0 0  0 0 0  0 0 0  82 81 62  142 137 94 +174 170 121  194 189 146  210 208 158  224 223 159  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  251 251 187  224 223 159 +184 179 149  99 98 80  3 3 3  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  7 7 5 +43 44 41  82 81 62  118 116 76  142 137 94  171 165 117  190 186 136 +204 201 155  224 223 159  251 251 187  251 251 187  251 251 187  251 251 187 +214 212 158  197 193 154  174 170 121  125 122 87  30 31 28  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  1 1 1 +1 1 1  1 1 1  1 1 1  1 1 1  1 1 1  1 1 1 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  3 4 3  82 81 62  149 143 98 +176 171 126  194 191 148  210 208 158  239 239 170  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  251 251 187  239 239 170  204 201 155 +145 141 105  30 31 28  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +10 9 6  46 47 43  82 81 62  118 116 76  149 143 98  174 170 121 +194 189 146  210 208 158  224 223 159  251 251 187  251 251 187  224 223 159 +210 208 158  194 191 148  174 170 121  134 131 96  53 55 47  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  7 7 5  96 95 69  149 143 98 +176 171 126  194 191 148  210 208 158  239 239 170  251 251 187  251 251 187 +251 251 187  251 251 187  251 251 187  239 239 170  210 208 158  177 172 135 +75 75 61  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  10 9 6  46 47 43  82 81 62  118 116 76  149 143 98 +176 171 126  194 191 148  210 208 158  214 212 158  214 212 158  210 208 158 +197 193 154  184 181 136  164 159 111  131 127 93  53 55 47  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  7 7 5  96 95 69  149 143 98 +174 170 121  194 189 146  204 201 155  214 212 158  239 239 170  251 251 187 +251 251 187  251 251 187  239 239 170  210 208 158  184 179 149  110 109 94 +12 12 9  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  10 9 6  43 44 41  82 81 62  115 113 82 +144 139 99  168 163 120  188 184 146  197 193 154  197 193 154  194 189 146 +184 181 136  174 170 121  151 147 98  118 116 76  36 38 35  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  4 3 2  82 81 62  142 137 94 +171 165 117  186 182 128  194 191 148  210 208 158  214 212 158  224 223 159 +239 239 170  224 223 159  210 208 158  184 179 149  137 133 100  36 38 35 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  7 7 5  36 38 35  71 71 57 +103 101 77  131 127 93  155 149 109  168 163 120  168 163 120  168 163 120 +164 159 111  149 143 98  125 122 87  82 81 62  13 12 7  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  61 61 53  125 122 87 +160 154 106  174 170 121  184 181 136  194 189 146  204 201 155  210 208 158 +210 208 158  204 201 155  184 179 149  145 141 105  61 61 53  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  3 3 2  30 31 28 +61 61 53  82 81 62  103 101 77  121 119 87  125 122 87  125 122 87 +118 116 76  103 101 77  79 78 62  24 26 24  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  25 27 25  96 95 69 +142 137 94  160 154 106  171 165 117  178 174 128  184 181 136  184 181 136 +181 176 137  177 172 135  145 141 105  75 75 61  5 5 3  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +16 17 12  40 41 39  61 61 53  71 71 57  71 71 57  71 71 57 +66 65 55  43 44 41  12 12 9  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  1 1 1  46 47 43 +96 95 69  125 122 87  142 137 94  149 145 103  155 149 109  155 149 109 +145 141 105  121 119 87  66 65 55  7 7 5  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  1 1 1  16 17 12  24 26 24  25 27 25  19 20 18 +7 7 5  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  2 2 1 +25 27 25  61 61 53  82 81 62  96 95 69  96 95 69  82 81 62 +61 61 53  25 27 25  2 2 1  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  5 6 5  13 12 7  10 9 6  3 4 3 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0 diff --git a/drivers/video/logo/logo_linux_vga16.ppm b/drivers/video/logo/logo_linux_vga16.ppm index 1850c15e6fe..12ac3a5454c 100644 --- a/drivers/video/logo/logo_linux_vga16.ppm +++ b/drivers/video/logo/logo_linux_vga16.ppm @@ -1,1604 +1,2739 @@  P3 -# Standard 16-color Linux logo -80 80 +142 114  255 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85  85  85  85  85  85  85  85  85  85 - 85  85  85  85  85  85  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85  85  85  85 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 - 85  85  85  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85 170 170 170   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -170 170 170 170 170 170  85  85  85   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0  85  85  85 170 170 170   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 170 170 170 170 170 170 -170 170 170   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 - 85  85  85 170 170 170 170 170 170 170 170 170 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0 170 170 170 255 255 255 255 255 255 -255 255 255 170 170 170   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0  85  85  85 -170 170 170 170 170 170 255 255 255 255 255 255 -  0   0   0   0   0   0   0   0   0   0   0   0 -170 170 170 255 255 255 170 170 170 170 170 170 -255 255 255 170 170 170   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0  85  85  85 -170 170 170   0   0   0   0   0   0 255 255 255 - 85  85  85   0   0   0   0   0   0   0   0   0 -255 255 255 170 170 170   0   0   0  85  85  85 -170 170 170 255 255 255 170 170 170   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0  85  85  85 - 85  85  85   0   0   0   0   0   0 170 170 170 - 85  85  85   0   0   0   0   0   0   0   0   0 -255 255 255  85  85  85   0   0   0   0   0   0 - 85  85  85 255 255 255 170 170 170   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0  85  85  85 -170 170 170   0   0   0   0   0   0 170 170 170 - 85  85  85  85  85  85  85  85  85  85  85  85 -255 255 255  85  85  85   0   0   0   0   0   0 - 85  85  85 255 255 255 170 170 170   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -255 255 255   0   0   0   0   0   0 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0   0   0   0   0   0   0 - 85  85  85 255 255 255   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -170 170 170 170 170 170 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170 170 170 170 170 170   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85  85  85  85   0   0   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 170  85   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85  85  85  85   0   0   0 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 170  85   0 -170  85   0 170  85   0  85  85  85   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85  85  85  85   0   0   0 - 85  85  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170  85   0 170  85   0  85  85  85   0   0   0 -  0   0   0  85  85  85 170 170 170  85  85  85 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85  85  85  85   0   0   0 - 85  85  85 170  85   0 170  85   0 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170 170 170 170 170 170 170 170 170   0   0   0 -  0   0   0   0   0   0 170 170 170 170 170 170 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 - 85  85  85 170 170 170 170  85   0 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170  85   0 170  85   0 170 170 170 170 170 170 -170 170 170 170 170 170 170 170 170  85  85  85 -  0   0   0   0   0   0  85  85  85  85  85  85 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 - 85  85  85 170 170 170 170 170 170 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170 170 170 170 170 170 170 170 170 170 170 170 -255 255 255 255 255 255 255 255 255 170 170 170 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0  85  85  85 -255 255 255 255 255 255 170 170 170 170 170 170 -170 170 170 170 170 170 170 170 170 170 170 170 -170 170 170 170 170 170 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0 170 170 170 -255 255 255 255 255 255 170 170 170 170 170 170 -170 170 170 170 170 170 170 170 170 170 170 170 -170 170 170 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -170 170 170   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0  85  85  85 255 255 255 -255 255 255 255 255 255 255 255 255 170 170 170 -170 170 170 170 170 170 170 170 170 170 170 170 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0  85  85  85 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0  85  85  85 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 170 170 170   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0  85  85  85 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 - 85  85  85 170 170 170 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85 170 170 170 170 170 170 170 170 170 -255 255 255 255 255 255 255 255 255 170 170 170 -170 170 170 170 170 170 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -170 170 170 170 170 170 170 170 170 170 170 170 -170 170 170 170 170 170 170 170 170  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -170 170 170 170 170 170 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -170 170 170 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 170 170 170 -170 170 170 170 170 170 170 170 170  85  85  85 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -170 170 170 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 170 170 170 170 170 170 170 170 170 -  0   0   0   0   0   0   0   0   0  85  85  85 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 - 85  85  85   0   0   0   0   0   0  85  85  85 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 170 170 170 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0 170 170 170 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -170 170 170  85  85  85   0   0   0   0   0   0 -  0   0   0  85  85  85  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0  85  85  85 -  0   0   0   0   0   0  85  85  85 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 170 170 170   0   0   0  85  85  85 - 85  85  85   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0  85  85  85 -  0   0   0  85  85  85 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 170 170 170   0   0   0  85  85  85 - 85  85  85   0   0   0  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0  85  85  85 -  0   0   0 170 170 170 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0  85  85  85   0   0   0 -  0   0   0 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0  85  85  85   0   0   0 - 85  85  85 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0  85  85  85   0   0   0   0   0   0 -170 170 170 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0  85  85  85 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0  85  85  85 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85  85  85  85 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255   0   0   0 - 85  85  85  85  85  85  85  85  85  85  85  85 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85   0   0   0 170  85   0 -255 255  85 170  85   0   0   0   0   0   0   0 - 85  85  85 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0  85  85  85  85  85  85   0   0   0 -  0   0   0  85  85  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0   0   0   0 -  0   0   0  85  85  85 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255  85 170  85   0 255 255  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85  85  85  85 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -  0   0   0   0   0   0  85  85  85 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255  85 -170  85   0 255 255  85 170  85   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -170  85   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0   0   0   0   0   0   0  85  85  85 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 170  85   0 -255 255  85 170  85   0 255 255  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0 170  85   0 -255 255  85 170  85   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85   0   0   0   0   0   0   0   0   0 - 85  85  85 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255  85 -170  85   0 255 255  85 170  85   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0 255 255  85 -170  85   0 255 255  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85   0   0   0   0   0   0 -  0   0   0  85  85  85 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 255 255  85 170  85   0 -255 255  85 170  85   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85   0   0   0 -  0   0   0   0   0   0  85  85  85 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 170 170 170 170 170 170 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 170 170 170 170 170 170 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 170 170 170 170 170 170 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0   0   0   0   0   0   0   0   0   0 -  0   0   0 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 170 170 170 170 170 170 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85   0   0   0   0   0   0   0   0   0 - 85  85  85 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 170 170 170  85  85  85 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85  85  85  85  85  85  85 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -170 170 170  85  85  85  85  85  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 170 170 170 - 85  85  85   0   0   0   0   0   0 170  85   0 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170  85  85  85 -  0   0   0   0   0   0   0   0   0 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -170 170 170 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -170 170 170  85  85  85  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0 170  85   0 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 170  85   0 -170  85   0 170 170 170 255 255 255 255 255 255 -255 255 255 255 255 255 255 255 255 255 255 255 -255 255 255 255 255 255 170 170 170  85  85  85 - 85  85  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -170  85   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85 170  85   0 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 170  85   0 170  85   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 170  85   0 -170  85   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -170  85   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -170  85   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0  85  85  85 170  85   0 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 170  85   0 170  85   0 170  85   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 170  85   0 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 170  85   0 -170  85   0   0   0   0   0   0   0   0   0   0 - 85  85  85  85  85  85  85  85  85  85  85  85 - 85  85  85  85  85  85  85  85  85  85  85  85 - 85  85  85  85  85  85  85  85  85   0   0   0 -  0   0   0   0   0   0   0   0   0 170  85   0 -170  85   0 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 255 255  85 170  85   0 -170  85   0 170  85   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0 170  85   0 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170  85   0 170  85   0 255 255  85 170  85   0 -255 255  85 170  85   0 170  85   0 170  85   0 - 85  85  85  85  85  85  85  85  85  85  85  85 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0  85  85  85 - 85  85  85  85  85  85  85  85  85 170  85   0 -170  85   0 170  85   0 170  85   0 255 255  85 -170  85   0 255 255  85 170  85   0 170  85   0 -170  85   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170  85   0 170  85   0 170  85   0 170  85   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0 170  85   0 170  85   0 170  85   0 -170  85   0 170  85   0 170  85   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -170  85   0 170  85   0 170  85   0 170  85   0 -170  85   0 170  85   0 170  85   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 -  0   0   0   0   0   0   0   0   0   0   0   0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  85 85 85  0 0 0  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  85 85 85  85 85 85  85 85 85 +0 0 0  85 85 85  85 85 85  0 0 0  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  170 170 170 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +85 85 85  0 0 0  85 85 85  85 85 85  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  170 170 170  170 85 0  170 170 170  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +170 170 170  255 255 85  170 170 170  170 170 170  170 170 170  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  170 170 170 +255 255 85  170 170 170  170 170 170  170 85 0  85 255 85  170 85 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  170 170 170  170 85 0 +170 170 170  170 170 170  255 255 85  170 170 170  170 170 170  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  170 85 0  170 170 170 +170 170 170  170 85 0  170 170 170  170 170 170  170 85 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  85 85 85  85 85 85  85 255 85 +255 85 85  85 255 85  170 170 170  170 85 0  170 170 170  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  170 85 0  85 85 85  85 85 85 +170 170 170  170 85 0  170 170 170  85 85 85  170 85 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  85 85 85  170 85 0 +85 85 85  85 85 85  170 85 0  85 255 85  85 85 85  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  85 85 85  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  170 85 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 170 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +170 85 0  85 255 85  170 85 0  170 85 0  170 85 0  85 255 85 +170 85 0  170 85 0  0 170 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 170 0  170 85 0 +255 255 85  170 85 0  255 255 85  255 255 85  255 255 85  170 85 0 +255 255 85  85 255 85  170 85 0  170 85 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 85 0  255 255 85 +85 255 85  255 255 85  255 255 85  170 85 0  255 255 85  255 255 85 +255 255 85  170 85 0  255 255 85  85 255 85  170 85 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  255 255 85  170 85 0 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  170 85 0 +255 255 85  255 255 85  255 255 85  255 255 85  170 85 0  85 255 85 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  170 170 170  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  170 85 0  255 255 85  255 255 85 +255 255 85  255 255 85  170 85 0  255 255 85  85 255 85  255 255 85 +255 255 85  170 85 0  255 255 85  170 85 0  255 255 85  170 85 0 +170 85 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  170 170 170  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  170 85 0  255 255 85  85 255 85  255 255 85 +170 170 170  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  85 255 85  255 255 85  255 255 85  255 255 85 +85 255 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  170 85 0  255 255 85  255 255 85  255 255 85 +255 255 255  255 255 85  255 255 85  170 85 0  255 255 85  170 85 0 +255 255 85  255 255 85  255 255 85  255 255 85  170 85 0  255 255 85 +170 85 0  170 85 0  0 170 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  170 85 0  85 255 85  255 255 85  170 170 170  255 255 255 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  170 85 0  255 255 85  85 255 85  255 255 85 +255 255 85  85 255 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  255 255 85  255 255 85  255 255 85  255 255 255  255 255 85 +255 255 85  255 255 85  85 255 85  255 255 85  255 255 85  85 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  170 85 0 +255 255 85  170 85 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +85 85 85  0 0 0  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +170 85 0  170 85 0  255 255 85  255 255 85  255 255 255  170 170 170 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +170 85 0  255 255 85  255 255 85  170 85 0  255 255 85  255 255 85 +255 255 85  85 255 85  170 85 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +255 255 85  85 255 85  255 255 85  170 170 170  255 255 255  255 255 85 +255 255 85  255 255 85  170 85 0  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  85 255 85  170 85 0 +255 255 85  170 85 0  170 85 0  0 0 0  85 85 85  0 0 0 +85 85 85  85 85 85  85 85 85  170 170 170  170 170 170  170 170 170 +85 255 85  170 170 170  170 170 170  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  170 170 170  255 255 85  170 170 170 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 170 0 +170 85 0  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  85 255 85  255 255 85  170 85 0  170 85 0 +170 85 0  85 255 85  255 255 85  85 85 85  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  85 255 85  170 170 170  170 170 170 +85 85 85  170 170 170  170 170 170  170 85 0  170 170 170  170 170 170 +85 255 85  170 170 170  170 85 0  170 170 170  85 255 85  255 85 85 +85 255 85  170 170 170  255 255 85  85 85 85  255 255 85  170 170 170 +85 255 85  170 170 170  255 255 85  170 170 170  170 170 170  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 255  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  170 85 0 +255 255 85  255 255 85  255 255 85  170 85 0  0 170 0  85 85 85 +170 170 170  170 170 170  255 255 85  170 170 170  170 170 170  85 255 85 +255 85 85  85 255 85  85 85 85  255 85 85  85 85 85  170 170 170 +170 85 0  170 170 170  85 85 85  85 255 85  85 85 85  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +170 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  255 255 85 +170 85 0  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  170 85 0  255 255 85  85 85 85  85 85 85 +255 255 85  170 170 170  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  85 85 85  170 170 170  170 85 0  170 170 170 +170 170 170  255 255 85  170 170 170  85 85 85  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 85 0  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  170 85 0  170 85 0  0 170 0 +0 0 0  170 85 0  170 85 0  0 170 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  85 85 85  170 170 170  85 85 85 +170 170 170  85 85 85  85 85 85  170 170 170  170 85 0  85 85 85 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  255 255 85  170 85 0 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  170 85 0 +255 255 85  255 255 85  255 255 85  170 85 0  255 255 85  255 255 85 +170 85 0  255 255 85  85 255 85  255 255 85  255 255 85  170 85 0 +170 85 0  255 255 85  170 85 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  255 255 85  255 255 85 +255 255 85  255 255 85  170 85 0  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  170 85 0  255 255 85  255 255 85 +85 255 85  170 85 0  0 170 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 170 0  170 85 0  255 255 85 +85 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +170 85 0  255 255 85  85 255 85  255 255 85  255 255 85  170 85 0 +85 255 85  170 85 0  170 85 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  170 85 0  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  170 85 0  255 255 85  85 255 85  255 255 85  170 85 0 +255 255 85  255 255 85  170 85 0  255 255 85  170 85 0  85 255 85 +170 85 0  170 85 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  255 255 85  170 85 0 +255 255 85  170 85 0  255 255 85  170 85 0  255 255 85  85 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  170 85 0  255 255 85  85 255 85  170 85 0  170 85 0 +0 170 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  170 85 0  255 255 85  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  255 255 85  170 85 0  255 255 85  170 85 0  85 255 85 +255 255 85  85 255 85  170 85 0  170 85 0  85 255 85  170 85 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  255 255 85  85 255 85 +255 255 85  255 255 85  85 255 85  255 255 85  255 255 85  255 255 85 +255 255 85  170 85 0  255 255 85  85 255 85  255 255 85  255 255 85 +170 85 0  170 85 0  85 255 85  170 85 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  85 85 85  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  170 170 170  170 170 170  85 85 85 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  255 255 85  255 255 85 +170 85 0  255 255 85  255 255 85  170 85 0  255 255 85  170 85 0 +255 255 85  85 255 85  170 85 0  255 255 85  170 85 0  85 255 85 +170 85 0  170 85 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  170 170 170  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  85 85 85  85 85 85  85 85 85 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 85 0  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  255 255 85  85 255 85 +170 85 0  255 255 85  170 85 0  85 255 85  170 85 0  170 85 0 +0 170 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  170 170 170  170 170 170  255 255 255  170 170 170 +170 170 170  170 170 170  85 85 85  85 85 85  85 85 85  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 255 85  255 255 85 +170 85 0  255 255 85  255 255 85  170 85 0  85 255 85  170 85 0 +255 255 85  170 85 0  0 170 0  170 85 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  170 170 170  170 170 170  170 170 170  85 85 85 +85 85 85  85 85 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  255 255 85 +255 255 85  255 255 85  255 255 85  255 255 85  170 85 0  170 85 0 +0 170 0  85 85 85  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +255 255 85  255 255 85  170 85 0  0 170 0  85 85 85  85 85 85 +85 85 85  85 85 85  0 0 0  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  85 85 85  85 85 85  170 170 170  170 170 170  85 85 85 +170 170 170  170 170 170  170 170 170  170 170 170  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  170 85 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  85 85 85  85 85 85  170 170 170  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +170 170 170  170 170 170  170 170 170  170 170 170  255 255 255  255 255 255 +255 255 255  255 255 255  255 255 255  170 170 170  255 255 255  170 170 170 +170 170 170  170 170 170  170 170 170  85 85 85  85 85 85  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  170 170 170  170 170 170 +255 255 255  255 255 255  255 255 255  170 170 170  255 255 255  170 170 170 +255 255 255  255 255 255  255 255 255  255 255 255  255 255 255  255 255 255 +255 255 255  255 255 255  255 255 255  255 255 255  255 255 255  255 255 255 +255 255 255  255 255 255  170 170 170  255 255 255  170 170 170  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  170 170 170  170 170 170 +255 255 255  170 170 170  255 255 255  255 255 255  255 255 255  255 255 255 +255 255 255  255 255 255  255 255 255  255 255 255  255 255 255  170 170 170 +255 255 255  255 255 255  170 170 170  255 255 255  255 255 255  255 255 255 +255 255 255  255 255 255  255 255 255  255 255 255  170 170 170  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  170 170 170 +170 170 170  170 170 170  255 255 255  170 170 170  255 255 255  170 170 170 +255 255 255  170 170 170  255 255 255  170 170 170  255 255 255  255 255 255 +255 255 255  170 170 170  255 255 255  170 170 170  255 255 255  170 170 170 +170 170 170  170 170 170  170 170 170  170 170 170  85 85 85  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  85 85 85  85 85 85  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  170 170 170  85 85 85  170 170 170 +170 170 170  170 170 170  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +170 170 170  85 85 85  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 170 170  85 85 85 +85 85 85  85 85 85  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  170 170 170  85 85 85 +85 85 85  85 85 85  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  85 85 85  170 170 170  85 85 85  85 85 85 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  170 170 170  170 170 170 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  170 170 170  85 85 85  85 85 85  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  255 255 255  170 170 170 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  170 170 170 +170 170 170  255 255 255  170 170 170  170 170 170 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 170 170  170 170 170 +255 255 255  255 255 255  170 170 170  170 170 170 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  170 170 170  170 170 170  255 255 255 +255 255 255  170 170 170  170 170 170  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +170 170 170  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  170 170 170  255 255 255  255 255 255  255 255 255 +170 170 170  170 170 170  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +170 170 170  170 170 170  255 255 255  255 255 255  255 255 255  170 170 170 +170 170 170  170 170 170  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 170 170  170 170 170 +170 170 170  255 255 255  255 255 255  255 255 255  170 170 170  170 170 170 +170 170 170  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  85 85 85  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  170 170 170  170 170 170  170 170 170 +255 255 255  255 255 255  255 255 255  255 255 255  170 170 170  170 170 170 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  85 85 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  170 170 170  255 255 255  255 255 255  255 255 255 +255 255 255  255 255 255  170 170 170  170 170 170  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  170 170 170  255 255 255  85 85 85  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +170 170 170  170 170 170  255 255 255  170 170 170  255 255 255  255 255 255 +255 255 255  255 255 255  170 170 170  170 170 170  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  170 170 170  255 255 255  170 170 170  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +255 255 255  170 170 170  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +255 255 255  255 255 255  255 255 255  255 255 255  255 255 255  255 255 255 +170 170 170  170 170 170  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  255 255 255  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  255 255 255  255 255 255  255 255 255  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  170 170 170 +255 255 255  170 170 170  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  170 170 170 +170 170 170  255 255 255  255 255 255  255 255 255  255 255 255  170 170 170 +170 170 170  170 170 170  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +170 170 170  255 255 255  255 255 255  170 170 170  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +85 85 85  170 170 170  255 255 255  255 255 255  255 255 255  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  255 255 255 +255 255 255  170 170 170  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  85 85 85  85 85 85  85 85 85 +170 170 170  255 255 255  255 255 255  255 255 255  170 170 170  170 170 170 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  170 170 170  170 170 170 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +170 170 170  255 255 255  255 255 255  255 255 255  85 85 85  0 0 0 +0 0 0  85 85 85  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  170 170 170  255 255 255  255 255 255  255 255 255  170 170 170 +0 0 0  85 85 85  0 0 0  85 85 85  170 170 170  255 255 255 +255 255 255  170 170 170  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  255 255 255  255 255 255  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  85 85 85  0 0 0  85 85 85  85 85 85 +170 170 170  170 170 170  170 170 170  170 170 170  170 170 170  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 170 170  255 255 255 +170 170 170  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  255 255 255  255 255 255  255 255 255  255 255 255  0 0 0 +0 0 0  85 85 85  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  255 255 255  255 255 255  255 255 255  170 170 170  170 170 170 +85 85 85  0 0 0  0 0 0  85 85 85  170 170 170  255 255 255 +255 255 255  170 170 170  0 0 0  0 0 0  0 0 0  0 0 0 +170 170 170  255 255 255  170 170 170  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  85 85 85  0 0 0  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  170 170 170  85 85 85  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  170 170 170 +255 255 255  170 170 170  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  255 255 255  255 255 255  255 255 255  170 170 170 +0 0 0  85 85 85  85 85 85  85 85 85  0 0 0  0 0 0 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +170 170 170  170 170 170  255 255 255  170 170 170  255 255 255  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  170 170 170  255 255 255 +170 170 170  170 170 170  0 0 0  0 0 0  0 0 0  85 85 85 +170 170 170  255 255 255  255 255 255  0 0 0  0 0 0  85 85 85 +255 255 255  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  85 85 85 +85 85 85  0 0 0  85 85 85  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  255 255 255 +255 255 255  255 255 255  170 170 170  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  255 255 255  170 170 170  170 170 170  170 170 170 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  85 85 85 +85 85 85  170 170 170  255 255 255  170 170 170  170 170 170  85 85 85 +85 85 85  0 0 0  85 85 85  85 85 85  85 85 85  170 170 170 +170 170 170  85 85 85  85 85 85  0 0 0  0 0 0  85 85 85 +170 170 170  170 170 170  85 85 85  0 0 0  0 0 0  170 170 170 +170 170 170  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 170 170  170 170 170 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  170 170 170 +255 255 255  170 170 170  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  170 170 170  170 170 170  255 255 85  85 85 85 +85 85 85  85 85 85  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  85 85 85  0 0 0  85 85 85 +85 85 85  170 170 170  170 170 170  170 170 170  170 85 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  170 170 170  170 85 0 +170 170 170  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +170 85 0  170 170 170  85 85 85  0 0 0  85 85 85  85 85 85 +170 170 170  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 170 170  255 255 255 +170 170 170  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +255 255 255  170 170 170  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  170 85 0  170 170 170  170 170 170  85 85 85 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  85 85 85 +85 85 85  170 85 0  85 255 85  170 85 0  170 170 170  85 85 85 +85 85 85  0 0 0  0 0 0  85 85 85  170 85 0  85 255 85 +170 85 0  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +85 85 85  85 85 85  170 85 0  0 0 0  85 85 85  85 85 85 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  255 255 255 +255 255 255  170 170 170  0 0 0  0 0 0  0 0 0  0 0 0 +170 170 170  170 170 170  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  170 170 170  170 85 0  170 170 170  170 85 0 +85 85 85  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  255 85 85  170 170 170  85 255 85  170 85 0 +85 85 85  85 85 85  170 85 0  85 85 85  170 170 170  85 85 85 +170 170 170  170 85 0  85 85 85  85 85 85  85 85 85  85 85 85 +170 85 0  85 255 85  85 85 85  85 85 85  85 85 85  170 85 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  0 0 0  0 0 0  0 0 0  170 170 170 +255 255 255  170 170 170  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 85 0  170 170 170  170 85 0  85 85 85  0 0 0 +85 85 85  85 85 85  85 255 85  170 170 170  170 170 170  170 85 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +0 0 0  85 85 85  85 85 85  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  85 255 85  255 85 85  170 170 170  170 170 170 +170 170 170  85 255 85  170 170 170  170 85 0  170 170 170  170 85 0 +170 170 170  85 85 85  85 255 85  170 85 0  170 170 170  170 85 0 +170 170 170  170 170 170  170 85 0  85 85 85  85 85 85  85 255 85 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  170 170 170  170 170 170  0 0 0  0 0 0  85 85 85 +170 170 170  170 170 170  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  255 255 85  85 85 85  85 85 85  85 85 85 +85 255 85  255 85 85  170 170 170  170 85 0  170 170 170  85 255 85 +85 85 85  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  170 85 0  170 170 170  170 170 170  255 255 85 +170 170 170  255 85 85  170 170 170  170 170 170  255 255 85  170 170 170 +85 255 85  170 170 170  255 85 85  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  170 85 0  170 170 170  170 85 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  170 170 170  85 85 85  0 0 0  85 85 85 +85 85 85  170 85 0  85 85 85  0 0 0  85 85 85  85 85 85 +85 85 85  170 85 0  170 170 170  170 170 170  255 255 85  170 170 170 +170 170 170  170 170 170  255 255 85  170 170 170  170 170 170  255 85 85 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  85 85 85  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  170 170 170  255 255 85  170 170 170  170 170 170 +170 170 170  255 255 85  170 170 170  170 170 170  170 170 170  170 85 0 +170 170 170  255 255 85  170 170 170  255 255 85  170 170 170  255 255 85 +170 170 170  255 255 85  170 170 170  170 170 170  85 255 85  170 85 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  170 170 170  85 85 85  85 85 85  0 0 0 +85 85 85  85 85 85  170 170 170  85 85 85  170 170 170  170 85 0 +170 170 170  85 255 85  170 170 170  170 85 0  170 170 170  170 170 170 +255 255 85  170 170 170  170 170 170  255 255 255  255 255 85  170 170 170 +255 255 85  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  85 85 85  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  170 85 0  170 170 170  170 170 170  170 170 170  255 255 255 +170 170 170  255 255 255  255 255 85  170 170 170  255 255 85  170 170 170 +255 255 85  170 170 170  170 170 170  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  255 85 85  170 170 170  170 170 170 +85 85 85  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  170 85 0  85 85 85 +85 85 85  255 255 85  170 170 170  170 170 170  170 170 170  170 170 170 +255 255 85  170 170 170  170 170 170  255 255 85  170 170 170  170 170 170 +170 170 170  255 255 255  255 255 255  170 170 170  255 255 255  170 170 170 +170 170 170  85 85 85  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  85 255 85  170 170 170  255 255 85  255 255 255  255 255 255 +255 255 255  170 170 170  255 255 255  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  255 255 85  170 170 170  255 255 85  255 255 255 +255 255 85  255 255 255  255 255 85  170 170 170  170 170 170  170 85 0 +170 170 170  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  170 170 170  255 255 85  170 170 170  255 255 85  170 170 170 +170 170 170  255 255 85  170 170 170  170 170 170  170 170 170  255 255 85 +255 255 255  255 255 255  255 255 85  255 255 255  255 255 255  170 170 170 +255 255 85  85 85 85  85 85 85  0 0 0  0 0 0  85 85 85 +85 85 85  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  170 170 170  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  170 170 170  170 170 170  170 170 170  255 255 255  170 170 170 +255 255 255  255 255 255  255 255 255  170 170 170  170 170 170  255 255 85 +170 170 170  255 255 85  170 170 170  255 255 255  170 170 170  255 255 255 +255 255 255  255 255 255  170 170 170  255 255 85  170 170 170  255 255 85 +85 85 85  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  170 85 0  170 170 170 +255 255 85  170 170 170  170 170 170  255 255 255  255 255 255  255 255 255 +170 170 170  170 170 170  170 170 170  255 255 85  170 170 170  170 170 170 +255 255 255  170 170 170  255 255 255  255 255 255  170 170 170  255 255 255 +170 170 170  170 170 170  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 170 170  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  85 85 85  85 85 85  0 0 0 +85 85 85  170 85 0  255 255 255  170 170 170  255 255 255  255 255 255 +255 255 85  255 255 255  170 170 170  255 255 85  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  255 255 85  255 255 255  255 255 255 +170 170 170  255 255 255  255 255 255  170 170 170  170 170 170  170 170 170 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 255 85  170 170 170 +170 170 170  255 255 85  170 170 170  255 255 255  170 170 170  255 255 255 +255 255 255  255 255 255  255 255 85  170 170 170  170 170 170  255 255 255 +170 170 170  255 255 255  255 255 255  170 170 170  255 255 255  255 255 85 +170 170 170  170 85 0  85 85 85  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  170 170 170  170 170 170  255 255 85  170 170 170  255 255 255 +255 255 255  170 170 170  255 255 255  170 170 170  170 170 170  255 255 85 +170 170 170  255 255 85  170 170 170  255 255 255  170 170 170  255 255 255 +255 255 255  255 255 255  255 255 255  255 255 255  170 170 170  255 255 85 +85 85 85  85 85 85  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  170 85 0  170 170 170 +170 170 170  255 255 255  255 255 255  255 255 255  255 255 255  255 255 255 +170 170 170  170 170 170  170 170 170  170 170 170  255 255 85  170 170 170 +255 255 85  255 255 255  170 170 170  255 255 255  170 170 170  170 170 170 +170 170 170  170 170 170  85 85 85  0 0 0  85 85 85  85 85 85 +0 0 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +85 85 85  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +85 85 85  85 85 85  170 170 170  170 170 170  255 255 255  170 170 170 +255 255 255  170 170 170  255 255 85  170 170 170  170 170 170  170 170 170 +255 85 85  170 170 170  170 170 170  170 170 170  255 255 255  255 255 255 +170 170 170  255 255 255  255 255 255  170 170 170  255 255 255  170 170 170 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  170 170 170 +255 255 85  170 170 170  255 255 255  170 170 170  255 255 255  255 255 255 +255 255 85  255 255 255  170 170 170  255 255 85  170 170 170  170 170 170 +170 170 170  170 170 170  255 255 85  170 170 170  170 170 170  255 255 85 +170 170 170  170 85 0  85 85 85  0 0 0  85 85 85  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  170 170 170  170 170 170 +170 170 170  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  170 170 170  255 255 85  170 170 170  170 170 170 +255 255 85  170 170 170  170 170 170  170 170 170  170 170 170  255 85 85 +85 255 85  170 170 170  170 170 170  170 170 170  255 255 85  170 170 170 +255 255 255  255 255 255  255 255 255  255 255 85  170 170 170  170 170 170 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  255 255 85 +170 170 170  170 170 170  255 255 255  255 255 255  255 255 255  170 170 170 +255 255 255  170 170 170  170 170 170  170 170 170  170 170 170  255 85 85 +170 170 170  170 170 170  170 170 170  170 170 170  170 170 170  170 170 170 +170 170 170  85 85 85  85 85 85  0 0 0  85 85 85  0 0 0 +85 85 85  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  170 170 170  170 170 170  170 170 170 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  170 85 0  170 170 170  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  170 85 0  170 170 170  85 255 85 +255 85 85  170 170 170  255 255 85  170 170 170  170 170 170  255 255 255 +255 255 255  170 170 170  255 255 255  255 255 255  170 170 170  170 170 170 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  170 170 170 +170 170 170  255 255 85  170 170 170  255 255 85  255 255 255  255 255 255 +170 170 170  170 170 170  255 255 85  170 170 170  255 85 85  85 255 85 +170 170 170  170 85 0  170 170 170  170 170 170  255 255 85  170 170 170 +170 85 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  85 85 85  85 85 85  85 85 85  170 170 170  255 255 85 +170 170 170  170 85 0  170 170 170  170 170 170  170 85 0  85 85 85 +170 170 170  170 85 0  85 85 85  170 170 170  170 170 170  170 170 170 +170 170 170  255 255 255  255 255 255  255 255 85  170 170 170  170 170 170 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  170 85 0 +170 170 170  170 170 170  255 255 255  170 170 170  255 255 255  170 170 170 +255 255 255  170 170 170  170 170 170  170 85 0  170 170 170  85 85 85 +170 170 170  170 170 170  170 85 0  170 170 170  170 85 0  85 85 85 +85 255 85  85 85 85  0 0 0  0 0 0  0 0 0  85 85 85 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +85 85 85  0 0 0  85 85 85  170 85 0  85 85 85  170 170 170 +170 85 0  170 170 170  85 255 85  170 85 0  170 170 170  85 85 85 +170 85 0  170 170 170  170 170 170  255 255 85  170 170 170  255 255 255 +255 255 85  255 255 255  170 170 170  170 170 170  170 170 170  170 85 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +170 170 170  170 170 170  170 170 170  170 170 170  170 170 170  255 255 85 +170 170 170  255 255 85  170 170 170  170 170 170  85 255 85  170 170 170 +170 85 0  170 85 0  170 170 170  85 255 85  85 85 85  170 170 170 +170 85 0  85 85 85  0 0 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  170 170 170  85 85 85 +0 0 0  0 0 0  0 0 0  85 85 85  170 85 0  85 85 85 +170 170 170  170 85 0  170 170 170  85 85 85  170 170 170  170 85 0 +170 170 170  85 255 85  170 85 0  170 170 170  170 170 170  170 170 170 +255 255 255  170 170 170  255 255 255  255 255 255  170 170 170  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +170 85 0  170 170 170  255 255 85  170 170 170  255 255 255  170 170 170 +170 170 170  170 170 170  170 170 170  170 85 0  170 170 170  170 85 0 +170 170 170  85 255 85  170 85 0  170 170 170  170 85 0  85 85 85 +85 85 85  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +85 255 85  170 170 170  170 85 0  170 170 170  170 85 0  85 255 85 +170 170 170  170 85 0  170 170 170  170 170 170  170 170 170  255 255 85 +170 170 170  255 255 255  170 170 170  170 170 170  170 170 170  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 85 0  85 85 85  170 170 170  255 255 85  170 170 170 +170 170 170  255 255 85  170 170 170  170 170 170  170 170 170  170 85 0 +170 170 170  85 85 85  170 170 170  170 85 0  170 170 170  85 85 85 +170 85 0  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  0 0 0  85 85 85  170 85 0 +85 85 85  255 85 85  85 255 85  170 85 0  170 170 170  170 170 170 +170 85 0  170 170 170  85 85 85  255 255 85  170 170 170  170 170 170 +255 255 255  170 170 170  255 255 255  255 255 85  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  170 170 170  170 85 0  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  255 255 85  85 85 85  170 170 170 +85 255 85  255 85 85  170 170 170  85 255 85  255 85 85  85 255 85 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  85 85 85  0 0 0  85 85 85 +85 85 85  85 255 85  255 85 85  170 170 170  85 255 85  170 85 0 +170 170 170  170 170 170  255 255 85  170 170 170  170 170 170  255 255 255 +170 170 170  255 255 255  170 170 170  170 170 170  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  170 170 170  85 85 85  255 255 85 +170 170 170  255 255 85  170 170 170  170 170 170  170 170 170  255 255 85 +85 85 85  255 255 85  170 170 170  170 85 0  170 170 170  85 85 85 +170 85 0  85 85 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +170 170 170  170 85 0  170 170 170  170 85 0  170 170 170  170 170 170 +170 85 0  170 170 170  170 170 170  170 170 170  255 255 85  170 170 170 +255 255 85  255 255 255  170 170 170  170 170 170  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  170 85 0  85 85 85  170 170 170 +170 85 0  170 170 170  170 170 170  255 255 85  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  255 255 85  170 170 170  170 85 0 +85 85 85  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +170 85 0  85 255 85  170 170 170  170 170 170  255 255 85  170 170 170 +255 255 85  170 170 170  170 170 170  170 170 170  255 255 255  255 255 255 +255 255 255  170 170 170  255 255 85  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  170 85 0 +170 170 170  170 170 170  170 170 170  170 170 170  170 170 170  255 255 85 +170 170 170  255 255 85  170 170 170  170 170 170  170 170 170  170 170 170 +170 170 170  85 85 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  170 85 0  170 170 170  170 85 0  170 170 170  170 170 170 +170 170 170  255 255 85  170 170 170  255 255 85  170 170 170  255 255 255 +170 170 170  255 255 255  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  85 85 85  85 85 85  85 85 85 +170 85 0  170 170 170  170 85 0  255 255 85  170 170 170  170 170 170 +170 170 170  170 170 170  255 255 85  170 170 170  255 255 85  170 170 170 +255 255 85  85 85 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +85 85 85  170 170 170  255 255 85  170 170 170  255 255 85  170 170 170 +170 170 170  255 255 255  255 255 255  255 255 255  255 255 255  255 255 255 +170 170 170  170 170 170  170 170 170  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 170 0  85 85 85 +170 85 0  85 255 85  170 170 170  170 170 170  170 170 170  255 255 85 +255 255 255  170 170 170  255 255 255  170 170 170  255 255 255  170 170 170 +170 170 170  255 255 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +170 85 0  170 170 170  170 170 170  170 170 170  170 170 170  255 255 85 +170 170 170  255 255 255  170 170 170  255 255 255  170 170 170  255 255 255 +255 255 255  255 255 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  170 85 0  170 170 170  170 170 170  255 255 85  170 170 170 +170 170 170  255 255 255  255 255 255  255 255 255  170 170 170  255 255 255 +170 170 170  170 170 170  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 255 85 +170 170 170  255 255 85  170 170 170  255 255 85  255 255 255  255 255 255 +255 255 255  255 255 255  255 255 255  255 255 255  255 255 255  170 170 170 +170 170 170  170 170 170  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  85 85 85  170 85 0  170 170 170  170 170 170 +255 255 85  170 170 170  255 255 255  255 255 85  255 255 255  255 255 255 +170 170 170  255 255 85  170 170 170  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  170 85 0 +170 170 170  170 170 170  170 170 170  255 255 255  170 170 170  255 255 255 +170 170 170  255 255 255  170 170 170  255 255 255  255 255 85  255 255 255 +170 170 170  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  170 85 0  85 85 85  170 170 170  170 170 170  170 170 170 +170 170 170  255 255 255  170 170 170  255 255 255  255 255 255  170 170 170 +255 255 85  170 170 170  170 170 170  170 85 0  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  170 170 170 +255 255 85  170 170 170  255 255 85  170 170 170  255 255 255  255 255 255 +255 255 255  255 255 255  255 255 255  255 255 255  170 170 170  170 170 170 +170 170 170  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  85 85 85  85 85 85  170 85 0  170 170 170 +255 255 85  170 170 170  255 255 85  255 255 255  170 170 170  255 255 255 +170 170 170  170 170 170  170 170 170  170 170 170  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  170 170 170 +170 85 0  170 170 170  255 255 255  170 170 170  255 255 255  170 170 170 +255 255 255  255 255 255  170 170 170  255 255 255  255 255 85  170 170 170 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  85 85 85  170 85 0  85 85 85  170 170 170 +170 170 170  170 170 170  170 170 170  170 170 170  255 255 85  170 170 170 +255 255 85  170 170 170  170 85 0  85 255 85  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  170 85 0 +170 170 170  170 170 170  255 255 85  170 170 170  255 255 255  255 255 255 +255 255 85  255 255 255  170 170 170  255 255 255  170 170 170  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +170 85 0  170 170 170  170 170 170  255 255 85  170 170 170  170 170 170 +170 170 170  170 170 170  170 170 170  170 85 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +255 255 85  170 170 170  170 170 170  170 170 170  255 255 85  170 170 170 +255 255 255  170 170 170  255 255 85  170 170 170  85 85 85  85 85 85 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +85 85 85  170 85 0  170 170 170  170 170 170  170 170 170  170 170 170 +170 85 0  170 170 170  170 85 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  85 85 85  85 85 85 +170 170 170  170 170 170  255 255 85  170 170 170  170 170 170  170 170 170 +170 170 170  255 255 255  170 170 170  170 170 170  85 85 85  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +85 85 85  85 85 85  85 85 85  170 85 0  85 85 85  170 85 0 +85 85 85  85 85 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  170 85 0 +85 85 85  170 85 0  170 170 170  170 170 170  170 170 170  255 255 85 +170 170 170  170 170 170  170 85 0  85 85 85  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  85 85 85  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  85 85 85 +85 85 85  85 255 85  170 85 0  170 170 170  170 85 0  170 170 170 +85 85 85  85 85 85  85 85 85  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  85 85 85  85 85 85  85 85 85  85 85 85  85 85 85 +85 85 85  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0  0 0 0  0 0 0 +0 0 0  0 0 0  0 0 0  0 0 0 diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index 48ff701d3a7..2552b9f325e 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c @@ -2230,7 +2230,7 @@ static int __devexit pxafb_remove(struct platform_device *dev)  static struct platform_driver pxafb_driver = {  	.probe		= pxafb_probe, -	.remove 	= pxafb_remove, +	.remove 	= __devexit_p(pxafb_remove),  	.suspend	= pxafb_suspend,  	.resume		= pxafb_resume,  	.driver		= { diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index 0e2b8fd24df..2c5d069e5f0 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c @@ -446,7 +446,6 @@ static void sh_mobile_lcdc_stop(struct sh_mobile_lcdc_priv *priv)  {  	struct sh_mobile_lcdc_chan *ch;  	struct sh_mobile_lcdc_board_cfg	*board_cfg; -	unsigned long tmp;  	int k;  	/* tell the board code to disable the panel */ @@ -456,9 +455,8 @@ static void sh_mobile_lcdc_stop(struct sh_mobile_lcdc_priv *priv)  		if (board_cfg->display_off)  			board_cfg->display_off(board_cfg->board_data); -		/* cleanup deferred io if SYS bus */ -		tmp = ch->cfg.sys_bus_cfg.deferred_io_msec; -		if (ch->ldmt1r_value & (1 << 12) && tmp) { +		/* cleanup deferred io if enabled */ +		if (ch->info.fbdefio) {  			fb_deferred_io_cleanup(&ch->info);  			ch->info.fbdefio = NULL;  		} diff --git a/drivers/w1/masters/w1-gpio.c b/drivers/w1/masters/w1-gpio.c index 9e1138a75e8..a411702413d 100644 --- a/drivers/w1/masters/w1-gpio.c +++ b/drivers/w1/masters/w1-gpio.c @@ -39,7 +39,7 @@ static u8 w1_gpio_read_bit(void *data)  {  	struct w1_gpio_platform_data *pdata = data; -	return gpio_get_value(pdata->pin); +	return gpio_get_value(pdata->pin) ? 1 : 0;  }  static int __init w1_gpio_probe(struct platform_device *pdev) diff --git a/drivers/watchdog/gef_wdt.c b/drivers/watchdog/gef_wdt.c index f0c2b7a1a17..734d9806a87 100644 --- a/drivers/watchdog/gef_wdt.c +++ b/drivers/watchdog/gef_wdt.c @@ -269,7 +269,7 @@ static int __devinit gef_wdt_probe(struct of_device *dev,  	bus_clk = 133; /* in MHz */  	freq = fsl_get_sys_freq(); -	if (freq > 0) +	if (freq != -1)  		bus_clk = freq;  	/* Map devices registers into memory */ diff --git a/drivers/watchdog/ks8695_wdt.c b/drivers/watchdog/ks8695_wdt.c index 0b798fdaa37..74c92d38411 100644 --- a/drivers/watchdog/ks8695_wdt.c +++ b/drivers/watchdog/ks8695_wdt.c @@ -21,6 +21,7 @@  #include <linux/watchdog.h>  #include <linux/io.h>  #include <linux/uaccess.h> +#include <mach/timex.h>  #include <mach/regs-timer.h>  #define WDT_DEFAULT_TIME	5	/* seconds */ diff --git a/drivers/watchdog/orion5x_wdt.c b/drivers/watchdog/orion5x_wdt.c index 14a339f58b6..b64ae1a1783 100644 --- a/drivers/watchdog/orion5x_wdt.c +++ b/drivers/watchdog/orion5x_wdt.c @@ -29,6 +29,7 @@  #define  WDT_EN			0x0010  #define WDT_VAL			(TIMER_VIRT_BASE + 0x0024) +#define ORION5X_TCLK		166666667  #define WDT_MAX_DURATION	(0xffffffff / ORION5X_TCLK)  #define WDT_IN_USE		0  #define WDT_OK_TO_CLOSE		1 diff --git a/drivers/watchdog/rc32434_wdt.c b/drivers/watchdog/rc32434_wdt.c index 57027f4653c..f3553fa40b1 100644 --- a/drivers/watchdog/rc32434_wdt.c +++ b/drivers/watchdog/rc32434_wdt.c @@ -34,104 +34,89 @@  #include <asm/time.h>  #include <asm/mach-rc32434/integ.h> -#define MAX_TIMEOUT			20 -#define RC32434_WDT_INTERVAL		(15 * HZ) - -#define VERSION "0.2" +#define VERSION "0.4"  static struct { -	struct completion stop; -	int running; -	struct timer_list timer; -	int queue; -	int default_ticks;  	unsigned long inuse;  } rc32434_wdt_device;  static struct integ __iomem *wdt_reg; -static int ticks = 100 * HZ;  static int expect_close; -static int timeout; + +/* Board internal clock speed in Hz, + * the watchdog timer ticks at. */ +extern unsigned int idt_cpu_freq; + +/* translate wtcompare value to seconds and vice versa */ +#define WTCOMP2SEC(x)	(x / idt_cpu_freq) +#define SEC2WTCOMP(x)	(x * idt_cpu_freq) + +/* Use a default timeout of 20s. This should be + * safe for CPU clock speeds up to 400MHz, as + * ((2 ^ 32) - 1) / (400MHz / 2) = 21s.  */ +#define WATCHDOG_TIMEOUT 20 + +static int timeout = WATCHDOG_TIMEOUT;  static int nowayout = WATCHDOG_NOWAYOUT;  module_param(nowayout, int, 0);  MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="  	__MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); +/* apply or and nand masks to data read from addr and write back */ +#define SET_BITS(addr, or, nand) \ +	writel((readl(&addr) | or) & ~nand, &addr)  static void rc32434_wdt_start(void)  { -	u32 val; - -	if (!rc32434_wdt_device.inuse) { -		writel(0, &wdt_reg->wtcount); +	u32 or, nand; -		val = RC32434_ERR_WRE; -		writel(readl(&wdt_reg->errcs) | val, &wdt_reg->errcs); +	/* zero the counter before enabling */ +	writel(0, &wdt_reg->wtcount); -		val = RC32434_WTC_EN; -		writel(readl(&wdt_reg->wtc) | val, &wdt_reg->wtc); -	} -	rc32434_wdt_device.running++; -} +	/* don't generate a non-maskable interrupt, +	 * do a warm reset instead */ +	nand = 1 << RC32434_ERR_WNE; +	or = 1 << RC32434_ERR_WRE; -static void rc32434_wdt_stop(void) -{ -	u32 val; +	/* reset the ERRCS timeout bit in case it's set */ +	nand |= 1 << RC32434_ERR_WTO; -	if (rc32434_wdt_device.running) { +	SET_BITS(wdt_reg->errcs, or, nand); -		val = ~RC32434_WTC_EN; -		writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc); +	/* reset WTC timeout bit and enable WDT */ +	nand = 1 << RC32434_WTC_TO; +	or = 1 << RC32434_WTC_EN; -		val = ~RC32434_ERR_WRE; -		writel(readl(&wdt_reg->errcs) & val, &wdt_reg->errcs); +	SET_BITS(wdt_reg->wtc, or, nand); +} -		rc32434_wdt_device.running = 0; -	} +static void rc32434_wdt_stop(void) +{ +	/* Disable WDT */ +	SET_BITS(wdt_reg->wtc, 0, 1 << RC32434_WTC_EN);  } -static void rc32434_wdt_set(int new_timeout) +static int rc32434_wdt_set(int new_timeout)  { -	u32 cmp = new_timeout * HZ; -	u32 state, val; +	int max_to = WTCOMP2SEC((u32)-1); +	if (new_timeout < 0 || new_timeout > max_to) { +		printk(KERN_ERR KBUILD_MODNAME +			": timeout value must be between 0 and %d", +			max_to); +		return -EINVAL; +	}  	timeout = new_timeout; -	/* -	 * store and disable WTC -	 */ -	state = (u32)(readl(&wdt_reg->wtc) & RC32434_WTC_EN); -	val = ~RC32434_WTC_EN; -	writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc); - -	writel(0, &wdt_reg->wtcount); -	writel(cmp, &wdt_reg->wtcompare); - -	/* -	 * restore WTC -	 */ - -	writel(readl(&wdt_reg->wtc) | state, &wdt_reg); -} +	writel(SEC2WTCOMP(timeout), &wdt_reg->wtcompare); -static void rc32434_wdt_reset(void) -{ -	ticks = rc32434_wdt_device.default_ticks; +	return 0;  } -static void rc32434_wdt_update(unsigned long unused) +static void rc32434_wdt_ping(void)  { -	if (rc32434_wdt_device.running) -		ticks--; -  	writel(0, &wdt_reg->wtcount); - -	if (rc32434_wdt_device.queue && ticks) -		mod_timer(&rc32434_wdt_device.timer, -			jiffies + RC32434_WDT_INTERVAL); -	else -		complete(&rc32434_wdt_device.stop);  }  static int rc32434_wdt_open(struct inode *inode, struct file *file) @@ -142,19 +127,23 @@ static int rc32434_wdt_open(struct inode *inode, struct file *file)  	if (nowayout)  		__module_get(THIS_MODULE); +	rc32434_wdt_start(); +	rc32434_wdt_ping(); +  	return nonseekable_open(inode, file);  }  static int rc32434_wdt_release(struct inode *inode, struct file *file)  { -	if (expect_close && nowayout == 0) { +	if (expect_close == 42) {  		rc32434_wdt_stop();  		printk(KERN_INFO KBUILD_MODNAME ": disabling watchdog timer\n");  		module_put(THIS_MODULE); -	} else +	} else {  		printk(KERN_CRIT KBUILD_MODNAME  			": device closed unexpectedly. WDT will not stop !\n"); - +		rc32434_wdt_ping(); +	}  	clear_bit(0, &rc32434_wdt_device.inuse);  	return 0;  } @@ -174,10 +163,10 @@ static ssize_t rc32434_wdt_write(struct file *file, const char *data,  				if (get_user(c, data + i))  					return -EFAULT;  				if (c == 'V') -					expect_close = 1; +					expect_close = 42;  			}  		} -		rc32434_wdt_update(0); +		rc32434_wdt_ping();  		return len;  	}  	return 0; @@ -197,11 +186,11 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd,  	};  	switch (cmd) {  	case WDIOC_KEEPALIVE: -		rc32434_wdt_reset(); +		rc32434_wdt_ping();  		break;  	case WDIOC_GETSTATUS:  	case WDIOC_GETBOOTSTATUS: -		value = readl(&wdt_reg->wtcount); +		value = 0;  		if (copy_to_user(argp, &value, sizeof(int)))  			return -EFAULT;  		break; @@ -218,6 +207,7 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd,  			break;  		case WDIOS_DISABLECARD:  			rc32434_wdt_stop(); +			break;  		default:  			return -EINVAL;  		} @@ -225,11 +215,9 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd,  	case WDIOC_SETTIMEOUT:  		if (copy_from_user(&new_timeout, argp, sizeof(int)))  			return -EFAULT; -		if (new_timeout < 1) +		if (rc32434_wdt_set(new_timeout))  			return -EINVAL; -		if (new_timeout > MAX_TIMEOUT) -			return -EINVAL; -		rc32434_wdt_set(new_timeout); +		/* Fall through */  	case WDIOC_GETTIMEOUT:  		return copy_to_user(argp, &timeout, sizeof(int));  	default: @@ -254,15 +242,15 @@ static struct miscdevice rc32434_wdt_miscdev = {  	.fops	= &rc32434_wdt_fops,  }; -static char banner[] = KERN_INFO KBUILD_MODNAME +static char banner[] __devinitdata = KERN_INFO KBUILD_MODNAME  		": Watchdog Timer version " VERSION ", timer margin: %d sec\n"; -static int rc32434_wdt_probe(struct platform_device *pdev) +static int __devinit rc32434_wdt_probe(struct platform_device *pdev)  {  	int ret;  	struct resource *r; -	r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb500_wdt_res"); +	r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb532_wdt_res");  	if (!r) {  		printk(KERN_ERR KBUILD_MODNAME  			"failed to retrieve resources\n"); @@ -277,24 +265,12 @@ static int rc32434_wdt_probe(struct platform_device *pdev)  	}  	ret = misc_register(&rc32434_wdt_miscdev); -  	if (ret < 0) {  		printk(KERN_ERR KBUILD_MODNAME  			"failed to register watchdog device\n");  		goto unmap;  	} -	init_completion(&rc32434_wdt_device.stop); -	rc32434_wdt_device.queue = 0; - -	clear_bit(0, &rc32434_wdt_device.inuse); - -	setup_timer(&rc32434_wdt_device.timer, rc32434_wdt_update, 0L); - -	rc32434_wdt_device.default_ticks = ticks; - -	rc32434_wdt_start(); -  	printk(banner, timeout);  	return 0; @@ -304,23 +280,17 @@ unmap:  	return ret;  } -static int rc32434_wdt_remove(struct platform_device *pdev) +static int __devexit rc32434_wdt_remove(struct platform_device *pdev)  { -	if (rc32434_wdt_device.queue) { -		rc32434_wdt_device.queue = 0; -		wait_for_completion(&rc32434_wdt_device.stop); -	}  	misc_deregister(&rc32434_wdt_miscdev); -  	iounmap(wdt_reg); -  	return 0;  }  static struct platform_driver rc32434_wdt = {  	.probe	= rc32434_wdt_probe, -	.remove = rc32434_wdt_remove, -	.driver = { +	.remove	= __devexit_p(rc32434_wdt_remove), +	.driver	= {  		.name = "rc32434_wdt",  	}  }; @@ -443,7 +443,7 @@ static struct kiocb *__aio_get_req(struct kioctx *ctx)  	req->private = NULL;  	req->ki_iovec = NULL;  	INIT_LIST_HEAD(&req->ki_run_list); -	req->ki_eventfd = ERR_PTR(-EINVAL); +	req->ki_eventfd = NULL;  	/* Check if the completion queue has enough free space to  	 * accept an event from this io. @@ -485,8 +485,6 @@ static inline void really_put_req(struct kioctx *ctx, struct kiocb *req)  {  	assert_spin_locked(&ctx->ctx_lock); -	if (!IS_ERR(req->ki_eventfd)) -		fput(req->ki_eventfd);  	if (req->ki_dtor)  		req->ki_dtor(req);  	if (req->ki_iovec != &req->ki_inline_vec) @@ -508,8 +506,11 @@ static void aio_fput_routine(struct work_struct *data)  		list_del(&req->ki_list);  		spin_unlock_irq(&fput_lock); -		/* Complete the fput */ -		__fput(req->ki_filp); +		/* Complete the fput(s) */ +		if (req->ki_filp != NULL) +			__fput(req->ki_filp); +		if (req->ki_eventfd != NULL) +			__fput(req->ki_eventfd);  		/* Link the iocb into the context's free list */  		spin_lock_irq(&ctx->ctx_lock); @@ -527,12 +528,14 @@ static void aio_fput_routine(struct work_struct *data)   */  static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)  { +	int schedule_putreq = 0; +  	dprintk(KERN_DEBUG "aio_put(%p): f_count=%ld\n",  		req, atomic_long_read(&req->ki_filp->f_count));  	assert_spin_locked(&ctx->ctx_lock); -	req->ki_users --; +	req->ki_users--;  	BUG_ON(req->ki_users < 0);  	if (likely(req->ki_users))  		return 0; @@ -540,10 +543,23 @@ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)  	req->ki_cancel = NULL;  	req->ki_retry = NULL; -	/* Must be done under the lock to serialise against cancellation. -	 * Call this aio_fput as it duplicates fput via the fput_work. +	/* +	 * Try to optimize the aio and eventfd file* puts, by avoiding to +	 * schedule work in case it is not __fput() time. In normal cases, +	 * we would not be holding the last reference to the file*, so +	 * this function will be executed w/out any aio kthread wakeup.  	 */ -	if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count))) { +	if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count))) +		schedule_putreq++; +	else +		req->ki_filp = NULL; +	if (req->ki_eventfd != NULL) { +		if (unlikely(atomic_long_dec_and_test(&req->ki_eventfd->f_count))) +			schedule_putreq++; +		else +			req->ki_eventfd = NULL; +	} +	if (unlikely(schedule_putreq)) {  		get_ioctx(ctx);  		spin_lock(&fput_lock);  		list_add(&req->ki_list, &fput_head); @@ -571,7 +587,7 @@ int aio_put_req(struct kiocb *req)  static struct kioctx *lookup_ioctx(unsigned long ctx_id)  {  	struct mm_struct *mm = current->mm; -	struct kioctx *ctx = NULL; +	struct kioctx *ctx, *ret = NULL;  	struct hlist_node *n;  	rcu_read_lock(); @@ -579,12 +595,13 @@ static struct kioctx *lookup_ioctx(unsigned long ctx_id)  	hlist_for_each_entry_rcu(ctx, n, &mm->ioctx_list, list) {  		if (ctx->user_id == ctx_id && !ctx->dead) {  			get_ioctx(ctx); +			ret = ctx;  			break;  		}  	}  	rcu_read_unlock(); -	return ctx; +	return ret;  }  /* @@ -1009,7 +1026,7 @@ int aio_complete(struct kiocb *iocb, long res, long res2)  	 * eventfd. The eventfd_signal() function is safe to be called  	 * from IRQ context.  	 */ -	if (!IS_ERR(iocb->ki_eventfd)) +	if (iocb->ki_eventfd != NULL)  		eventfd_signal(iocb->ki_eventfd, 1);  put_rq: @@ -1608,6 +1625,7 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,  		req->ki_eventfd = eventfd_fget((int) iocb->aio_resfd);  		if (IS_ERR(req->ki_eventfd)) {  			ret = PTR_ERR(req->ki_eventfd); +			req->ki_eventfd = NULL;  			goto out_put_req;  		}  	} diff --git a/fs/bio-integrity.c b/fs/bio-integrity.c index 549b0144da1..fe2b1aa2464 100644 --- a/fs/bio-integrity.c +++ b/fs/bio-integrity.c @@ -685,19 +685,20 @@ EXPORT_SYMBOL(bio_integrity_split);   * bio_integrity_clone - Callback for cloning bios with integrity metadata   * @bio:	New bio   * @bio_src:	Original bio + * @gfp_mask:	Memory allocation mask   * @bs:		bio_set to allocate bip from   *   * Description:	Called to allocate a bip when cloning a bio   */  int bio_integrity_clone(struct bio *bio, struct bio *bio_src, -			struct bio_set *bs) +			gfp_t gfp_mask, struct bio_set *bs)  {  	struct bio_integrity_payload *bip_src = bio_src->bi_integrity;  	struct bio_integrity_payload *bip;  	BUG_ON(bip_src == NULL); -	bip = bio_integrity_alloc_bioset(bio, GFP_NOIO, bip_src->bip_vcnt, bs); +	bip = bio_integrity_alloc_bioset(bio, gfp_mask, bip_src->bip_vcnt, bs);  	if (bip == NULL)  		return -EIO; @@ -463,10 +463,12 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask)  	if (bio_integrity(bio)) {  		int ret; -		ret = bio_integrity_clone(b, bio, fs_bio_set); +		ret = bio_integrity_clone(b, bio, gfp_mask, fs_bio_set); -		if (ret < 0) +		if (ret < 0) { +			bio_put(b);  			return NULL; +		}  	}  	return b; diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 42491d728e9..37f31b5529a 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -277,7 +277,7 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,  	if (*cow_ret == buf)  		unlock_orig = 1; -	WARN_ON(!btrfs_tree_locked(buf)); +	btrfs_assert_tree_locked(buf);  	if (parent)  		parent_start = parent->start; @@ -2365,7 +2365,7 @@ static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root  	if (slot >= btrfs_header_nritems(upper) - 1)  		return 1; -	WARN_ON(!btrfs_tree_locked(path->nodes[1])); +	btrfs_assert_tree_locked(path->nodes[1]);  	right = read_node_slot(root, upper, slot + 1);  	btrfs_tree_lock(right); @@ -2562,7 +2562,7 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root  	if (right_nritems == 0)  		return 1; -	WARN_ON(!btrfs_tree_locked(path->nodes[1])); +	btrfs_assert_tree_locked(path->nodes[1]);  	left = read_node_slot(root, path->nodes[1], slot - 1);  	btrfs_tree_lock(left); @@ -4101,7 +4101,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)  		next = read_node_slot(root, c, slot);  		if (!path->skip_locking) { -			WARN_ON(!btrfs_tree_locked(c)); +			btrfs_assert_tree_locked(c);  			btrfs_tree_lock(next);  			btrfs_set_lock_blocking(next);  		} @@ -4126,7 +4126,7 @@ int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)  			reada_for_search(root, path, level, slot, 0);  		next = read_node_slot(root, next, 0);  		if (!path->skip_locking) { -			WARN_ON(!btrfs_tree_locked(path->nodes[level])); +			btrfs_assert_tree_locked(path->nodes[level]);  			btrfs_tree_lock(next);  			btrfs_set_lock_blocking(next);  		} diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 82491ba8fa4..5e1d4e30e9d 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -784,7 +784,14 @@ struct btrfs_fs_info {  	struct list_head dirty_cowonly_roots;  	struct btrfs_fs_devices *fs_devices; + +	/* +	 * the space_info list is almost entirely read only.  It only changes +	 * when we add a new raid type to the FS, and that happens +	 * very rarely.  RCU is used to protect it. +	 */  	struct list_head space_info; +  	spinlock_t delalloc_lock;  	spinlock_t new_trans_lock;  	u64 delalloc_bytes; @@ -1797,6 +1804,8 @@ int btrfs_cleanup_reloc_trees(struct btrfs_root *root);  int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len);  u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags);  void btrfs_set_inode_space_info(struct btrfs_root *root, struct inode *ionde); +void btrfs_clear_space_info_full(struct btrfs_fs_info *info); +  int btrfs_check_metadata_free_space(struct btrfs_root *root);  int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode,  				u64 bytes); diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index adda739a021..3e18175248e 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -857,7 +857,7 @@ int clean_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root,  	struct inode *btree_inode = root->fs_info->btree_inode;  	if (btrfs_header_generation(buf) ==  	    root->fs_info->running_transaction->transid) { -		WARN_ON(!btrfs_tree_locked(buf)); +		btrfs_assert_tree_locked(buf);  		/* ugh, clear_extent_buffer_dirty can be expensive */  		btrfs_set_lock_blocking(buf); @@ -2361,7 +2361,7 @@ void btrfs_mark_buffer_dirty(struct extent_buffer *buf)  	btrfs_set_lock_blocking(buf); -	WARN_ON(!btrfs_tree_locked(buf)); +	btrfs_assert_tree_locked(buf);  	if (transid != root->fs_info->generation) {  		printk(KERN_CRIT "btrfs transid mismatch buffer %llu, "  		       "found %llu running %llu\n", diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 6b5966aacf4..fefe83ad205 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -20,6 +20,7 @@  #include <linux/writeback.h>  #include <linux/blkdev.h>  #include <linux/sort.h> +#include <linux/rcupdate.h>  #include "compat.h"  #include "hash.h"  #include "crc32c.h" @@ -330,13 +331,33 @@ static struct btrfs_space_info *__find_space_info(struct btrfs_fs_info *info,  {  	struct list_head *head = &info->space_info;  	struct btrfs_space_info *found; -	list_for_each_entry(found, head, list) { -		if (found->flags == flags) + +	rcu_read_lock(); +	list_for_each_entry_rcu(found, head, list) { +		if (found->flags == flags) { +			rcu_read_unlock();  			return found; +		}  	} +	rcu_read_unlock();  	return NULL;  } +/* + * after adding space to the filesystem, we need to clear the full flags + * on all the space infos. + */ +void btrfs_clear_space_info_full(struct btrfs_fs_info *info) +{ +	struct list_head *head = &info->space_info; +	struct btrfs_space_info *found; + +	rcu_read_lock(); +	list_for_each_entry_rcu(found, head, list) +		found->full = 0; +	rcu_read_unlock(); +} +  static u64 div_factor(u64 num, int factor)  {  	if (factor == 10) @@ -1903,7 +1924,6 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags,  	if (!found)  		return -ENOMEM; -	list_add(&found->list, &info->space_info);  	INIT_LIST_HEAD(&found->block_groups);  	init_rwsem(&found->groups_sem);  	spin_lock_init(&found->lock); @@ -1917,6 +1937,7 @@ static int update_space_info(struct btrfs_fs_info *info, u64 flags,  	found->full = 0;  	found->force_alloc = 0;  	*space_info = found; +	list_add_rcu(&found->list, &info->space_info);  	return 0;  } @@ -4418,13 +4439,13 @@ int btrfs_drop_subtree(struct btrfs_trans_handle *trans,  	path = btrfs_alloc_path();  	BUG_ON(!path); -	BUG_ON(!btrfs_tree_locked(parent)); +	btrfs_assert_tree_locked(parent);  	parent_level = btrfs_header_level(parent);  	extent_buffer_get(parent);  	path->nodes[parent_level] = parent;  	path->slots[parent_level] = btrfs_header_nritems(parent); -	BUG_ON(!btrfs_tree_locked(node)); +	btrfs_assert_tree_locked(node);  	level = btrfs_header_level(node);  	extent_buffer_get(node);  	path->nodes[level] = node; @@ -6320,6 +6341,7 @@ out:  int btrfs_free_block_groups(struct btrfs_fs_info *info)  {  	struct btrfs_block_group_cache *block_group; +	struct btrfs_space_info *space_info;  	struct rb_node *n;  	spin_lock(&info->block_group_cache_lock); @@ -6341,6 +6363,23 @@ int btrfs_free_block_groups(struct btrfs_fs_info *info)  		spin_lock(&info->block_group_cache_lock);  	}  	spin_unlock(&info->block_group_cache_lock); + +	/* now that all the block groups are freed, go through and +	 * free all the space_info structs.  This is only called during +	 * the final stages of unmount, and so we know nobody is +	 * using them.  We call synchronize_rcu() once before we start, +	 * just to be on the safe side. +	 */ +	synchronize_rcu(); + +	while(!list_empty(&info->space_info)) { +		space_info = list_entry(info->space_info.next, +					struct btrfs_space_info, +					list); + +		list_del(&space_info->list); +		kfree(space_info); +	}  	return 0;  } diff --git a/fs/btrfs/locking.c b/fs/btrfs/locking.c index 85506c4a3af..47b0a88c12a 100644 --- a/fs/btrfs/locking.c +++ b/fs/btrfs/locking.c @@ -220,8 +220,8 @@ int btrfs_tree_unlock(struct extent_buffer *eb)  	return 0;  } -int btrfs_tree_locked(struct extent_buffer *eb) +void btrfs_assert_tree_locked(struct extent_buffer *eb)  { -	return test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags) || -			spin_is_locked(&eb->lock); +	if (!test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags)) +		assert_spin_locked(&eb->lock);  } diff --git a/fs/btrfs/locking.h b/fs/btrfs/locking.h index 6bb0afbff92..6c4ce457168 100644 --- a/fs/btrfs/locking.h +++ b/fs/btrfs/locking.h @@ -21,11 +21,11 @@  int btrfs_tree_lock(struct extent_buffer *eb);  int btrfs_tree_unlock(struct extent_buffer *eb); -int btrfs_tree_locked(struct extent_buffer *eb);  int btrfs_try_tree_lock(struct extent_buffer *eb);  int btrfs_try_spin_lock(struct extent_buffer *eb);  void btrfs_set_lock_blocking(struct extent_buffer *eb);  void btrfs_clear_lock_blocking(struct extent_buffer *eb); +void btrfs_assert_tree_locked(struct extent_buffer *eb);  #endif diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 1316139bf9e..dd06e18e5aa 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -1374,6 +1374,12 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path)  		ret = btrfs_add_device(trans, root, device);  	} +	/* +	 * we've got more storage, clear any full flags on the space +	 * infos +	 */ +	btrfs_clear_space_info_full(root->fs_info); +  	unlock_chunks(root);  	btrfs_commit_transaction(trans, root); @@ -1459,6 +1465,8 @@ static int __btrfs_grow_device(struct btrfs_trans_handle *trans,  	device->fs_devices->total_rw_bytes += diff;  	device->total_bytes = new_size; +	btrfs_clear_space_info_full(device->dev_root->fs_info); +  	return btrfs_update_device(trans, device);  } diff --git a/fs/buffer.c b/fs/buffer.c index 9f697419ed8..891e1c78e4f 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -760,15 +760,9 @@ EXPORT_SYMBOL(mark_buffer_dirty_inode);   * If warn is true, then emit a warning if the page is not uptodate and has   * not been truncated.   */ -static int __set_page_dirty(struct page *page, +static void __set_page_dirty(struct page *page,  		struct address_space *mapping, int warn)  { -	if (unlikely(!mapping)) -		return !TestSetPageDirty(page); - -	if (TestSetPageDirty(page)) -		return 0; -  	spin_lock_irq(&mapping->tree_lock);  	if (page->mapping) {	/* Race with truncate? */  		WARN_ON_ONCE(warn && !PageUptodate(page)); @@ -785,8 +779,6 @@ static int __set_page_dirty(struct page *page,  	}  	spin_unlock_irq(&mapping->tree_lock);  	__mark_inode_dirty(mapping->host, I_DIRTY_PAGES); - -	return 1;  }  /* @@ -816,6 +808,7 @@ static int __set_page_dirty(struct page *page,   */  int __set_page_dirty_buffers(struct page *page)  { +	int newly_dirty;  	struct address_space *mapping = page_mapping(page);  	if (unlikely(!mapping)) @@ -831,9 +824,12 @@ int __set_page_dirty_buffers(struct page *page)  			bh = bh->b_this_page;  		} while (bh != head);  	} +	newly_dirty = !TestSetPageDirty(page);  	spin_unlock(&mapping->private_lock); -	return __set_page_dirty(page, mapping, 1); +	if (newly_dirty) +		__set_page_dirty(page, mapping, 1); +	return newly_dirty;  }  EXPORT_SYMBOL(__set_page_dirty_buffers); @@ -1262,8 +1258,11 @@ void mark_buffer_dirty(struct buffer_head *bh)  			return;  	} -	if (!test_set_buffer_dirty(bh)) -		__set_page_dirty(bh->b_page, page_mapping(bh->b_page), 0); +	if (!test_set_buffer_dirty(bh)) { +		struct page *page = bh->b_page; +		if (!TestSetPageDirty(page)) +			__set_page_dirty(page, page_mapping(page), 0); +	}  }  /* diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index 5f3231b9633..bff4052b05e 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c @@ -198,9 +198,6 @@ static int mknod_ptmx(struct super_block *sb)  	fsi->ptmx_dentry = dentry;  	rc = 0; - -	printk(KERN_DEBUG "Created ptmx node in devpts ino %lu\n", -			inode->i_ino);  out:  	mutex_unlock(&root->d_inode->i_mutex);  	return rc; @@ -369,8 +366,6 @@ static int new_pts_mount(struct file_system_type *fs_type, int flags,  	struct pts_fs_info *fsi;  	struct pts_mount_opts *opts; -	printk(KERN_NOTICE "devpts: newinstance mount\n"); -  	err = get_sb_nodev(fs_type, flags, data, devpts_fill_super, mnt);  	if (err)  		return err; diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index f6caeb1d110..8b65f289ee0 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c @@ -946,6 +946,8 @@ static int ecryptfs_copy_mount_wide_sigs_to_inode_sigs(  	list_for_each_entry(global_auth_tok,  			    &mount_crypt_stat->global_auth_tok_list,  			    mount_crypt_stat_list) { +		if (global_auth_tok->flags & ECRYPTFS_AUTH_TOK_FNEK) +			continue;  		rc = ecryptfs_add_keysig(crypt_stat, global_auth_tok->sig);  		if (rc) {  			printk(KERN_ERR "Error adding keysig; rc = [%d]\n", rc); @@ -1322,14 +1324,13 @@ static int ecryptfs_write_headers_virt(char *page_virt, size_t max,  }  static int -ecryptfs_write_metadata_to_contents(struct ecryptfs_crypt_stat *crypt_stat, -				    struct dentry *ecryptfs_dentry, -				    char *virt) +ecryptfs_write_metadata_to_contents(struct dentry *ecryptfs_dentry, +				    char *virt, size_t virt_len)  {  	int rc;  	rc = ecryptfs_write_lower(ecryptfs_dentry->d_inode, virt, -				  0, crypt_stat->num_header_bytes_at_front); +				  0, virt_len);  	if (rc)  		printk(KERN_ERR "%s: Error attempting to write header "  		       "information to lower file; rc = [%d]\n", __func__, @@ -1339,7 +1340,6 @@ ecryptfs_write_metadata_to_contents(struct ecryptfs_crypt_stat *crypt_stat,  static int  ecryptfs_write_metadata_to_xattr(struct dentry *ecryptfs_dentry, -				 struct ecryptfs_crypt_stat *crypt_stat,  				 char *page_virt, size_t size)  {  	int rc; @@ -1349,6 +1349,17 @@ ecryptfs_write_metadata_to_xattr(struct dentry *ecryptfs_dentry,  	return rc;  } +static unsigned long ecryptfs_get_zeroed_pages(gfp_t gfp_mask, +					       unsigned int order) +{ +	struct page *page; + +	page = alloc_pages(gfp_mask | __GFP_ZERO, order); +	if (page) +		return (unsigned long) page_address(page); +	return 0; +} +  /**   * ecryptfs_write_metadata   * @ecryptfs_dentry: The eCryptfs dentry @@ -1365,7 +1376,9 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry)  {  	struct ecryptfs_crypt_stat *crypt_stat =  		&ecryptfs_inode_to_private(ecryptfs_dentry->d_inode)->crypt_stat; +	unsigned int order;  	char *virt; +	size_t virt_len;  	size_t size = 0;  	int rc = 0; @@ -1381,33 +1394,35 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry)  		rc = -EINVAL;  		goto out;  	} +	virt_len = crypt_stat->num_header_bytes_at_front; +	order = get_order(virt_len);  	/* Released in this function */ -	virt = (char *)get_zeroed_page(GFP_KERNEL); +	virt = (char *)ecryptfs_get_zeroed_pages(GFP_KERNEL, order);  	if (!virt) {  		printk(KERN_ERR "%s: Out of memory\n", __func__);  		rc = -ENOMEM;  		goto out;  	} -	rc = ecryptfs_write_headers_virt(virt, PAGE_CACHE_SIZE, &size, -					 crypt_stat, ecryptfs_dentry); +	rc = ecryptfs_write_headers_virt(virt, virt_len, &size, crypt_stat, +					 ecryptfs_dentry);  	if (unlikely(rc)) {  		printk(KERN_ERR "%s: Error whilst writing headers; rc = [%d]\n",  		       __func__, rc);  		goto out_free;  	}  	if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) -		rc = ecryptfs_write_metadata_to_xattr(ecryptfs_dentry, -						      crypt_stat, virt, size); +		rc = ecryptfs_write_metadata_to_xattr(ecryptfs_dentry, virt, +						      size);  	else -		rc = ecryptfs_write_metadata_to_contents(crypt_stat, -							 ecryptfs_dentry, virt); +		rc = ecryptfs_write_metadata_to_contents(ecryptfs_dentry, virt, +							 virt_len);  	if (rc) {  		printk(KERN_ERR "%s: Error writing metadata out to lower file; "  		       "rc = [%d]\n", __func__, rc);  		goto out_free;  	}  out_free: -	free_page((unsigned long)virt); +	free_pages((unsigned long)virt, order);  out:  	return rc;  } @@ -2206,17 +2221,19 @@ int ecryptfs_decode_and_decrypt_filename(char **plaintext_name,  					 struct dentry *ecryptfs_dir_dentry,  					 const char *name, size_t name_size)  { +	struct ecryptfs_mount_crypt_stat *mount_crypt_stat = +		&ecryptfs_superblock_to_private( +			ecryptfs_dir_dentry->d_sb)->mount_crypt_stat;  	char *decoded_name;  	size_t decoded_name_size;  	size_t packet_size;  	int rc = 0; -	if ((name_size > ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE) +	if ((mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES) +	    && !(mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) +	    && (name_size > ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE)  	    && (strncmp(name, ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX,  			ECRYPTFS_FNEK_ENCRYPTED_FILENAME_PREFIX_SIZE) == 0)) { -		struct ecryptfs_mount_crypt_stat *mount_crypt_stat = -			&ecryptfs_superblock_to_private( -				ecryptfs_dir_dentry->d_sb)->mount_crypt_stat;  		const char *orig_name = name;  		size_t orig_name_size = name_size; diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index c11fc95714a..ac749d4d644 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h @@ -328,6 +328,7 @@ struct ecryptfs_dentry_info {   */  struct ecryptfs_global_auth_tok {  #define ECRYPTFS_AUTH_TOK_INVALID 0x00000001 +#define ECRYPTFS_AUTH_TOK_FNEK    0x00000002  	u32 flags;  	struct list_head mount_crypt_stat_list;  	struct key *global_auth_tok_key; @@ -619,7 +620,6 @@ int ecryptfs_interpose(struct dentry *hidden_dentry,  		       u32 flags);  int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,  					struct dentry *lower_dentry, -					struct ecryptfs_crypt_stat *crypt_stat,  					struct inode *ecryptfs_dir_inode,  					struct nameidata *ecryptfs_nd);  int ecryptfs_decode_and_decrypt_filename(char **decrypted_name, @@ -696,7 +696,7 @@ ecryptfs_write_header_metadata(char *virt,  int ecryptfs_add_keysig(struct ecryptfs_crypt_stat *crypt_stat, char *sig);  int  ecryptfs_add_global_auth_tok(struct ecryptfs_mount_crypt_stat *mount_crypt_stat, -			   char *sig); +			   char *sig, u32 global_auth_tok_flags);  int ecryptfs_get_global_auth_tok_for_sig(  	struct ecryptfs_global_auth_tok **global_auth_tok,  	struct ecryptfs_mount_crypt_stat *mount_crypt_stat, char *sig); diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 5697899a168..55b3145b807 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -246,7 +246,6 @@ out:   */  int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,  					struct dentry *lower_dentry, -					struct ecryptfs_crypt_stat *crypt_stat,  					struct inode *ecryptfs_dir_inode,  					struct nameidata *ecryptfs_nd)  { @@ -254,6 +253,7 @@ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,  	struct vfsmount *lower_mnt;  	struct inode *lower_inode;  	struct ecryptfs_mount_crypt_stat *mount_crypt_stat; +	struct ecryptfs_crypt_stat *crypt_stat;  	char *page_virt = NULL;  	u64 file_size;  	int rc = 0; @@ -314,6 +314,11 @@ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,  			goto out_free_kmem;  		}  	} +	crypt_stat = &ecryptfs_inode_to_private( +					ecryptfs_dentry->d_inode)->crypt_stat; +	/* TODO: lock for crypt_stat comparison */ +	if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)) +			ecryptfs_set_default_sizes(crypt_stat);  	rc = ecryptfs_read_and_validate_header_region(page_virt,  						      ecryptfs_dentry->d_inode);  	if (rc) { @@ -362,9 +367,7 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode,  {  	char *encrypted_and_encoded_name = NULL;  	size_t encrypted_and_encoded_name_size; -	struct ecryptfs_crypt_stat *crypt_stat = NULL;  	struct ecryptfs_mount_crypt_stat *mount_crypt_stat = NULL; -	struct ecryptfs_inode_info *inode_info;  	struct dentry *lower_dir_dentry, *lower_dentry;  	int rc = 0; @@ -388,26 +391,15 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode,  	}  	if (lower_dentry->d_inode)  		goto lookup_and_interpose; -	inode_info =  ecryptfs_inode_to_private(ecryptfs_dentry->d_inode); -	if (inode_info) { -		crypt_stat = &inode_info->crypt_stat; -		/* TODO: lock for crypt_stat comparison */ -		if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)) -			ecryptfs_set_default_sizes(crypt_stat); -	} -	if (crypt_stat) -		mount_crypt_stat = crypt_stat->mount_crypt_stat; -	else -		mount_crypt_stat = &ecryptfs_superblock_to_private( -			ecryptfs_dentry->d_sb)->mount_crypt_stat; -	if (!(crypt_stat && (crypt_stat->flags & ECRYPTFS_ENCRYPT_FILENAMES)) -	    && !(mount_crypt_stat && (mount_crypt_stat->flags -				     & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES))) +	mount_crypt_stat = &ecryptfs_superblock_to_private( +				ecryptfs_dentry->d_sb)->mount_crypt_stat; +	if (!(mount_crypt_stat +	    && (mount_crypt_stat->flags & ECRYPTFS_GLOBAL_ENCRYPT_FILENAMES)))  		goto lookup_and_interpose;  	dput(lower_dentry);  	rc = ecryptfs_encrypt_and_encode_filename(  		&encrypted_and_encoded_name, &encrypted_and_encoded_name_size, -		crypt_stat, mount_crypt_stat, ecryptfs_dentry->d_name.name, +		NULL, mount_crypt_stat, ecryptfs_dentry->d_name.name,  		ecryptfs_dentry->d_name.len);  	if (rc) {  		printk(KERN_ERR "%s: Error attempting to encrypt and encode " @@ -426,7 +418,7 @@ static struct dentry *ecryptfs_lookup(struct inode *ecryptfs_dir_inode,  	}  lookup_and_interpose:  	rc = ecryptfs_lookup_and_interpose_lower(ecryptfs_dentry, lower_dentry, -						 crypt_stat, ecryptfs_dir_inode, +						 ecryptfs_dir_inode,  						 ecryptfs_nd);  	goto out;  out_d_drop: diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index ff539420cc6..e4a6223c314 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c @@ -2375,7 +2375,7 @@ struct kmem_cache *ecryptfs_global_auth_tok_cache;  int  ecryptfs_add_global_auth_tok(struct ecryptfs_mount_crypt_stat *mount_crypt_stat, -			     char *sig) +			     char *sig, u32 global_auth_tok_flags)  {  	struct ecryptfs_global_auth_tok *new_auth_tok;  	int rc = 0; @@ -2389,6 +2389,7 @@ ecryptfs_add_global_auth_tok(struct ecryptfs_mount_crypt_stat *mount_crypt_stat,  		goto out;  	}  	memcpy(new_auth_tok->sig, sig, ECRYPTFS_SIG_SIZE_HEX); +	new_auth_tok->flags = global_auth_tok_flags;  	new_auth_tok->sig[ECRYPTFS_SIG_SIZE_HEX] = '\0';  	mutex_lock(&mount_crypt_stat->global_auth_tok_list_mutex);  	list_add(&new_auth_tok->mount_crypt_stat_list, diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 789cf2e1be1..aed56c25539 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c @@ -319,7 +319,7 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options)  		case ecryptfs_opt_ecryptfs_sig:  			sig_src = args[0].from;  			rc = ecryptfs_add_global_auth_tok(mount_crypt_stat, -							  sig_src); +							  sig_src, 0);  			if (rc) {  				printk(KERN_ERR "Error attempting to register "  				       "global sig; rc = [%d]\n", rc); @@ -370,7 +370,8 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options)  				ECRYPTFS_SIG_SIZE_HEX] = '\0';  			rc = ecryptfs_add_global_auth_tok(  				mount_crypt_stat, -				mount_crypt_stat->global_default_fnek_sig); +				mount_crypt_stat->global_default_fnek_sig, +				ECRYPTFS_AUTH_TOK_FNEK);  			if (rc) {  				printk(KERN_ERR "Error attempting to register "  				       "global fnek sig [%s]; rc = [%d]\n", diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index e2eab196875..e0aa4fe4f59 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -1122,7 +1122,8 @@ ext4_ext_search_right(struct inode *inode, struct ext4_ext_path *path,  	struct ext4_extent_idx *ix;  	struct ext4_extent *ex;  	ext4_fsblk_t block; -	int depth, ee_len; +	int depth;	/* Note, NOT eh_depth; depth from top of tree */ +	int ee_len;  	BUG_ON(path == NULL);  	depth = path->p_depth; @@ -1179,7 +1180,8 @@ got_index:  		if (bh == NULL)  			return -EIO;  		eh = ext_block_hdr(bh); -		if (ext4_ext_check_header(inode, eh, depth)) { +		/* subtract from p_depth to get proper eh_depth */ +		if (ext4_ext_check_header(inode, eh, path->p_depth - depth)) {  			put_bh(bh);  			return -EIO;  		} diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index f18a919be70..2d2b3585ee9 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -188,7 +188,7 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)  	struct ext4_group_desc *gdp;  	struct ext4_super_block *es;  	struct ext4_sb_info *sbi; -	int fatal = 0, err, count; +	int fatal = 0, err, count, cleared;  	ext4_group_t flex_group;  	if (atomic_read(&inode->i_count) > 1) { @@ -248,8 +248,10 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)  		goto error_return;  	/* Ok, now we can actually update the inode bitmaps.. */ -	if (!ext4_clear_bit_atomic(sb_bgl_lock(sbi, block_group), -					bit, bitmap_bh->b_data)) +	spin_lock(sb_bgl_lock(sbi, block_group)); +	cleared = ext4_clear_bit(bit, bitmap_bh->b_data); +	spin_unlock(sb_bgl_lock(sbi, block_group)); +	if (!cleared)  		ext4_error(sb, "ext4_free_inode",  			   "bit already cleared for inode %lu", ino);  	else { @@ -696,6 +698,7 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode)  	struct inode *ret;  	ext4_group_t i;  	int free = 0; +	static int once = 1;  	ext4_group_t flex_group;  	/* Cannot create files in a deleted directory */ @@ -717,7 +720,8 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode)  		ret2 = find_group_flex(sb, dir, &group);  		if (ret2 == -1) {  			ret2 = find_group_other(sb, dir, &group); -			if (ret2 == 0 && printk_ratelimit()) +			if (ret2 == 0 && once) +				once = 0;  				printk(KERN_NOTICE "ext4: find_group_flex "  				       "failed, fallback succeeded dir %lu\n",  				       dir->i_ino); diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 4415beeb0b6..9f61e62f435 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -1447,7 +1447,7 @@ static void ext4_mb_measure_extent(struct ext4_allocation_context *ac,  	struct ext4_free_extent *gex = &ac->ac_g_ex;  	BUG_ON(ex->fe_len <= 0); -	BUG_ON(ex->fe_len >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb)); +	BUG_ON(ex->fe_len > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));  	BUG_ON(ex->fe_start >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));  	BUG_ON(ac->ac_status != AC_STATUS_CONTINUE); @@ -3292,7 +3292,7 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,  	}  	BUG_ON(start + size <= ac->ac_o_ex.fe_logical &&  			start > ac->ac_o_ex.fe_logical); -	BUG_ON(size <= 0 || size >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb)); +	BUG_ON(size <= 0 || size > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));  	/* now prepare goal request */ @@ -3589,6 +3589,7 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac,  			struct super_block *sb, struct ext4_prealloc_space *pa)  {  	ext4_group_t grp; +	ext4_fsblk_t grp_blk;  	if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0)  		return; @@ -3603,8 +3604,12 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac,  	pa->pa_deleted = 1;  	spin_unlock(&pa->pa_lock); -	/* -1 is to protect from crossing allocation group */ -	ext4_get_group_no_and_offset(sb, pa->pa_pstart - 1, &grp, NULL); +	grp_blk = pa->pa_pstart; +	/* If linear, pa_pstart may be in the next group when pa is used up */ +	if (pa->pa_linear) +		grp_blk--; + +	ext4_get_group_no_and_offset(sb, grp_blk, &grp, NULL);  	/*  	 * possible race: diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 6b74d09adbe..de0004fe6e0 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -202,9 +202,9 @@ static sector_t _fat_bmap(struct address_space *mapping, sector_t block)  	sector_t blocknr;  	/* fat_get_cluster() assumes the requested blocknr isn't truncated. */ -	mutex_lock(&mapping->host->i_mutex); +	down_read(&mapping->host->i_alloc_sem);  	blocknr = generic_block_bmap(mapping, block, fat_get_block); -	mutex_unlock(&mapping->host->i_mutex); +	up_read(&mapping->host->i_alloc_sem);  	return blocknr;  } diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index e5eaa62fd17..e3fe9918faa 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -274,6 +274,7 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc)  	int ret;  	BUG_ON(inode->i_state & I_SYNC); +	WARN_ON(inode->i_state & I_NEW);  	/* Set I_SYNC, reset I_DIRTY */  	dirty = inode->i_state & I_DIRTY; @@ -298,6 +299,7 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc)  	}  	spin_lock(&inode_lock); +	WARN_ON(inode->i_state & I_NEW);  	inode->i_state &= ~I_SYNC;  	if (!(inode->i_state & I_FREEING)) {  		if (!(inode->i_state & I_DIRTY) && @@ -470,6 +472,11 @@ void generic_sync_sb_inodes(struct super_block *sb,  			break;  		} +		if (inode->i_state & I_NEW) { +			requeue_io(inode); +			continue; +		} +  		if (wbc->nonblocking && bdi_write_congested(bdi)) {  			wbc->encountered_congestion = 1;  			if (!sb_is_blkdev_sb(sb)) @@ -531,7 +538,7 @@ void generic_sync_sb_inodes(struct super_block *sb,  		list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {  			struct address_space *mapping; -			if (inode->i_state & (I_FREEING|I_WILL_FREE)) +			if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW))  				continue;  			mapping = inode->i_mapping;  			if (mapping->nrpages == 0) diff --git a/fs/inode.c b/fs/inode.c index 913ab2d9a5d..826fb0b9d1c 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -359,6 +359,7 @@ static int invalidate_list(struct list_head *head, struct list_head *dispose)  		invalidate_inode_buffers(inode);  		if (!atomic_read(&inode->i_count)) {  			list_move(&inode->i_list, dispose); +			WARN_ON(inode->i_state & I_NEW);  			inode->i_state |= I_FREEING;  			count++;  			continue; @@ -460,6 +461,7 @@ static void prune_icache(int nr_to_scan)  				continue;  		}  		list_move(&inode->i_list, &freeable); +		WARN_ON(inode->i_state & I_NEW);  		inode->i_state |= I_FREEING;  		nr_pruned++;  	} @@ -656,6 +658,7 @@ void unlock_new_inode(struct inode *inode)  	 * just created it (so there can be no old holders  	 * that haven't tested I_LOCK).  	 */ +	WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW));  	inode->i_state &= ~(I_LOCK|I_NEW);  	wake_up_inode(inode);  } @@ -1145,6 +1148,7 @@ void generic_delete_inode(struct inode *inode)  	list_del_init(&inode->i_list);  	list_del_init(&inode->i_sb_list); +	WARN_ON(inode->i_state & I_NEW);  	inode->i_state |= I_FREEING;  	inodes_stat.nr_inodes--;  	spin_unlock(&inode_lock); @@ -1186,16 +1190,19 @@ static void generic_forget_inode(struct inode *inode)  			spin_unlock(&inode_lock);  			return;  		} +		WARN_ON(inode->i_state & I_NEW);  		inode->i_state |= I_WILL_FREE;  		spin_unlock(&inode_lock);  		write_inode_now(inode, 1);  		spin_lock(&inode_lock); +		WARN_ON(inode->i_state & I_NEW);  		inode->i_state &= ~I_WILL_FREE;  		inodes_stat.nr_unused--;  		hlist_del_init(&inode->i_hash);  	}  	list_del_init(&inode->i_list);  	list_del_init(&inode->i_sb_list); +	WARN_ON(inode->i_state & I_NEW);  	inode->i_state |= I_FREEING;  	inodes_stat.nr_inodes--;  	spin_unlock(&inode_lock); diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index 1f3b0fc0d35..aedc47a264c 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c @@ -139,6 +139,55 @@ int nlmclnt_block(struct nlm_wait *block, struct nlm_rqst *req, long timeout)  	return 0;  } +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +static const struct in6_addr *nlmclnt_map_v4addr(const struct sockaddr *sap, +						 struct in6_addr *addr_mapped) +{ +	const struct sockaddr_in *sin = (const struct sockaddr_in *)sap; + +	switch (sap->sa_family) { +	case AF_INET6: +		return &((const struct sockaddr_in6 *)sap)->sin6_addr; +	case AF_INET: +		ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, addr_mapped); +		return addr_mapped; +	} + +	return NULL; +} + +/* + * If lockd is using a PF_INET6 listener, all incoming requests appear + * to come from AF_INET6 remotes.  The address of AF_INET remotes are + * mapped to AF_INET6 automatically by the network layer.  In case the + * user passed an AF_INET server address at mount time, ensure both + * addresses are AF_INET6 before comparing them. + */ +static int nlmclnt_cmp_addr(const struct nlm_host *host, +			    const struct sockaddr *sap) +{ +	const struct in6_addr *addr1; +	const struct in6_addr *addr2; +	struct in6_addr addr1_mapped; +	struct in6_addr addr2_mapped; + +	addr1 = nlmclnt_map_v4addr(nlm_addr(host), &addr1_mapped); +	if (likely(addr1 != NULL)) { +		addr2 = nlmclnt_map_v4addr(sap, &addr2_mapped); +		if (likely(addr2 != NULL)) +			return ipv6_addr_equal(addr1, addr2); +	} + +	return 0; +} +#else	/* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ +static int nlmclnt_cmp_addr(const struct nlm_host *host, +			    const struct sockaddr *sap) +{ +	return nlm_cmp_addr(nlm_addr(host), sap); +} +#endif	/* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ +  /*   * The server lockd has called us back to tell us the lock was granted   */ @@ -166,7 +215,7 @@ __be32 nlmclnt_grant(const struct sockaddr *addr, const struct nlm_lock *lock)  		 */  		if (fl_blocked->fl_u.nfs_fl.owner->pid != lock->svid)  			continue; -		if (!nlm_cmp_addr(nlm_addr(block->b_host), addr)) +		if (!nlmclnt_cmp_addr(block->b_host, addr))  			continue;  		if (nfs_compare_fh(NFS_FH(fl_blocked->fl_file->f_path.dentry->d_inode) ,fh) != 0)  			continue; diff --git a/fs/minix/inode.c b/fs/minix/inode.c index d1d1eb84679..618865b3128 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c @@ -3,7 +3,7 @@   *   *  Copyright (C) 1991, 1992  Linus Torvalds   * - *  Copyright (C) 1996  Gertjan van Wingerde    (gertjan@cs.vu.nl) + *  Copyright (C) 1996  Gertjan van Wingerde   *	Minix V2 fs support.   *   *  Modified for 680x0 by Andreas Schwab diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 9b728f3565a..574158ae239 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c @@ -255,6 +255,32 @@ static int nfs_sockaddr_match_ipaddr(const struct sockaddr *sa1,  	}  	return 0;  } + +/* + * Test if two ip6 socket addresses refer to the same socket by + * comparing relevant fields. The padding bytes specifically, are not + * compared. sin6_flowinfo is not compared because it only affects QoS + * and sin6_scope_id is only compared if the address is "link local" + * because "link local" addresses need only be unique to a specific + * link. Conversely, ordinary unicast addresses might have different + * sin6_scope_id. + * + * The caller should ensure both socket addresses are AF_INET6. + */ +static int nfs_sockaddr_cmp_ip6(const struct sockaddr *sa1, +				const struct sockaddr *sa2) +{ +	const struct sockaddr_in6 *saddr1 = (const struct sockaddr_in6 *)sa1; +	const struct sockaddr_in6 *saddr2 = (const struct sockaddr_in6 *)sa2; + +	if (!ipv6_addr_equal(&saddr1->sin6_addr, +			     &saddr1->sin6_addr)) +		return 0; +	if (ipv6_addr_scope(&saddr1->sin6_addr) == IPV6_ADDR_SCOPE_LINKLOCAL && +	    saddr1->sin6_scope_id != saddr2->sin6_scope_id) +		return 0; +	return saddr1->sin6_port == saddr2->sin6_port; +}  #else  static int nfs_sockaddr_match_ipaddr4(const struct sockaddr_in *sa1,  				 const struct sockaddr_in *sa2) @@ -270,9 +296,52 @@ static int nfs_sockaddr_match_ipaddr(const struct sockaddr *sa1,  	return nfs_sockaddr_match_ipaddr4((const struct sockaddr_in *)sa1,  			(const struct sockaddr_in *)sa2);  } + +static int nfs_sockaddr_cmp_ip6(const struct sockaddr * sa1, +				const struct sockaddr * sa2) +{ +	return 0; +}  #endif  /* + * Test if two ip4 socket addresses refer to the same socket, by + * comparing relevant fields. The padding bytes specifically, are + * not compared. + * + * The caller should ensure both socket addresses are AF_INET. + */ +static int nfs_sockaddr_cmp_ip4(const struct sockaddr *sa1, +				const struct sockaddr *sa2) +{ +	const struct sockaddr_in *saddr1 = (const struct sockaddr_in *)sa1; +	const struct sockaddr_in *saddr2 = (const struct sockaddr_in *)sa2; + +	if (saddr1->sin_addr.s_addr != saddr2->sin_addr.s_addr) +		return 0; +	return saddr1->sin_port == saddr2->sin_port; +} + +/* + * Test if two socket addresses represent the same actual socket, + * by comparing (only) relevant fields. + */ +static int nfs_sockaddr_cmp(const struct sockaddr *sa1, +			    const struct sockaddr *sa2) +{ +	if (sa1->sa_family != sa2->sa_family) +		return 0; + +	switch (sa1->sa_family) { +	case AF_INET: +		return nfs_sockaddr_cmp_ip4(sa1, sa2); +	case AF_INET6: +		return nfs_sockaddr_cmp_ip6(sa1, sa2); +	} +	return 0; +} + +/*   * Find a client by IP address and protocol version   * - returns NULL if no such client   */ @@ -344,8 +413,10 @@ struct nfs_client *nfs_find_client_next(struct nfs_client *clp)  static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *data)  {  	struct nfs_client *clp; +	const struct sockaddr *sap = data->addr;  	list_for_each_entry(clp, &nfs_client_list, cl_share_link) { +	        const struct sockaddr *clap = (struct sockaddr *)&clp->cl_addr;  		/* Don't match clients that failed to initialise properly */  		if (clp->cl_cons_state < 0)  			continue; @@ -358,7 +429,7 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat  			continue;  		/* Match the full socket address */ -		if (memcmp(&clp->cl_addr, data->addr, sizeof(clp->cl_addr)) != 0) +		if (!nfs_sockaddr_cmp(sap, clap))  			continue;  		atomic_inc(&clp->cl_count); diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index e35c8199f82..672368f865c 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -1892,8 +1892,14 @@ static int nfs_do_access(struct inode *inode, struct rpc_cred *cred, int mask)  	cache.cred = cred;  	cache.jiffies = jiffies;  	status = NFS_PROTO(inode)->access(inode, &cache); -	if (status != 0) +	if (status != 0) { +		if (status == -ESTALE) { +			nfs_zap_caches(inode); +			if (!S_ISDIR(inode->i_mode)) +				set_bit(NFS_INO_STALE, &NFS_I(inode)->flags); +		}  		return status; +	}  	nfs_access_add_cache(inode, &cache);  out:  	if ((mask & ~cache.mask & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0) diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c index cef62557c87..6bbf0e6daad 100644 --- a/fs/nfs/nfs3acl.c +++ b/fs/nfs/nfs3acl.c @@ -292,7 +292,7 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,  {  	struct nfs_server *server = NFS_SERVER(inode);  	struct nfs_fattr fattr; -	struct page *pages[NFSACL_MAXPAGES] = { }; +	struct page *pages[NFSACL_MAXPAGES];  	struct nfs3_setaclargs args = {  		.inode = inode,  		.mask = NFS_ACL, @@ -303,7 +303,7 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,  		.rpc_argp	= &args,  		.rpc_resp	= &fattr,  	}; -	int status, count; +	int status;  	status = -EOPNOTSUPP;  	if (!nfs_server_capable(inode, NFS_CAP_ACLS)) @@ -319,6 +319,20 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,  	if (S_ISDIR(inode->i_mode)) {  		args.mask |= NFS_DFACL;  		args.acl_default = dfacl; +		args.len = nfsacl_size(acl, dfacl); +	} else +		args.len = nfsacl_size(acl, NULL); + +	if (args.len > NFS_ACL_INLINE_BUFSIZE) { +		unsigned int npages = 1 + ((args.len - 1) >> PAGE_SHIFT); + +		status = -ENOMEM; +		do { +			args.pages[args.npages] = alloc_page(GFP_KERNEL); +			if (args.pages[args.npages] == NULL) +				goto out_freepages; +			args.npages++; +		} while (args.npages < npages);  	}  	dprintk("NFS call setacl\n"); @@ -329,10 +343,6 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,  	nfs_zap_acl_cache(inode);  	dprintk("NFS reply setacl: %d\n", status); -	/* pages may have been allocated at the xdr layer. */ -	for (count = 0; count < NFSACL_MAXPAGES && args.pages[count]; count++) -		__free_page(args.pages[count]); -  	switch (status) {  		case 0:  			status = nfs_refresh_inode(inode, &fattr); @@ -346,6 +356,11 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,  		case -ENOTSUPP:  			status = -EOPNOTSUPP;  	} +out_freepages: +	while (args.npages != 0) { +		args.npages--; +		__free_page(args.pages[args.npages]); +	}  out:  	return status;  } diff --git a/fs/nfs/nfs3xdr.c b/fs/nfs/nfs3xdr.c index 11cdddec143..6cdeacffde4 100644 --- a/fs/nfs/nfs3xdr.c +++ b/fs/nfs/nfs3xdr.c @@ -82,8 +82,10 @@  #define NFS3_commitres_sz	(1+NFS3_wcc_data_sz+2)  #define ACL3_getaclargs_sz	(NFS3_fh_sz+1) -#define ACL3_setaclargs_sz	(NFS3_fh_sz+1+2*(2+5*3)) -#define ACL3_getaclres_sz	(1+NFS3_post_op_attr_sz+1+2*(2+5*3)) +#define ACL3_setaclargs_sz	(NFS3_fh_sz+1+ \ +				XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE)) +#define ACL3_getaclres_sz	(1+NFS3_post_op_attr_sz+1+ \ +				XDR_QUADLEN(NFS_ACL_INLINE_BUFSIZE))  #define ACL3_setaclres_sz	(1+NFS3_post_op_attr_sz)  /* @@ -703,28 +705,18 @@ nfs3_xdr_setaclargs(struct rpc_rqst *req, __be32 *p,                     struct nfs3_setaclargs *args)  {  	struct xdr_buf *buf = &req->rq_snd_buf; -	unsigned int base, len_in_head, len = nfsacl_size( -		(args->mask & NFS_ACL)   ? args->acl_access  : NULL, -		(args->mask & NFS_DFACL) ? args->acl_default : NULL); -	int count, err; +	unsigned int base; +	int err;  	p = xdr_encode_fhandle(p, NFS_FH(args->inode));  	*p++ = htonl(args->mask); -	base = (char *)p - (char *)buf->head->iov_base; -	/* put as much of the acls into head as possible. */ -	len_in_head = min_t(unsigned int, buf->head->iov_len - base, len); -	len -= len_in_head; -	req->rq_slen = xdr_adjust_iovec(req->rq_svec, p + (len_in_head >> 2)); +	req->rq_slen = xdr_adjust_iovec(req->rq_svec, p); +	base = req->rq_slen; -	for (count = 0; (count << PAGE_SHIFT) < len; count++) { -		args->pages[count] = alloc_page(GFP_KERNEL); -		if (!args->pages[count]) { -			while (count) -				__free_page(args->pages[--count]); -			return -ENOMEM; -		} -	} -	xdr_encode_pages(buf, args->pages, 0, len); +	if (args->npages != 0) +		xdr_encode_pages(buf, args->pages, 0, args->len); +	else +		req->rq_slen += args->len;  	err = nfsacl_encode(buf, base, args->inode,  			    (args->mask & NFS_ACL) ? diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c index 30befc39b3c..2a2a0a7143a 100644 --- a/fs/nfs/nfs4namespace.c +++ b/fs/nfs/nfs4namespace.c @@ -21,7 +21,9 @@  #define NFSDBG_FACILITY		NFSDBG_VFS  /* - * Check if fs_root is valid + * Convert the NFSv4 pathname components into a standard posix path. + * + * Note that the resulting string will be placed at the end of the buffer   */  static inline char *nfs4_pathname_string(const struct nfs4_pathname *pathname,  					 char *buffer, ssize_t buflen) @@ -99,21 +101,20 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata,  {  	struct vfsmount *mnt = ERR_PTR(-ENOENT);  	char *mnt_path; -	int page2len; +	unsigned int maxbuflen;  	unsigned int s;  	mnt_path = nfs4_pathname_string(&location->rootpath, page2, PAGE_SIZE);  	if (IS_ERR(mnt_path))  		return mnt;  	mountdata->mnt_path = mnt_path; -	page2 += strlen(mnt_path) + 1; -	page2len = PAGE_SIZE - strlen(mnt_path) - 1; +	maxbuflen = mnt_path - 1 - page2;  	for (s = 0; s < location->nservers; s++) {  		const struct nfs4_string *buf = &location->servers[s];  		struct sockaddr_storage addr; -		if (buf->len <= 0 || buf->len >= PAGE_SIZE) +		if (buf->len <= 0 || buf->len >= maxbuflen)  			continue;  		mountdata->addr = (struct sockaddr *)&addr; @@ -126,8 +127,8 @@ static struct vfsmount *try_location(struct nfs_clone_mount *mountdata,  			continue;  		nfs_set_port(mountdata->addr, NFS_PORT); -		strncpy(page2, buf->data, page2len); -		page2[page2len] = '\0'; +		memcpy(page2, buf->data, buf->len); +		page2[buf->len] = '\0';  		mountdata->hostname = page2;  		snprintf(page, PAGE_SIZE, "%s:%s", diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index f65953be39c..9250067943d 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2596,6 +2596,7 @@ static nfsd4_enc nfsd4_enc_ops[] = {  	[OP_LOOKUPP]		= (nfsd4_enc)nfsd4_encode_noop,  	[OP_NVERIFY]		= (nfsd4_enc)nfsd4_encode_noop,  	[OP_OPEN]		= (nfsd4_enc)nfsd4_encode_open, +	[OP_OPENATTR]		= (nfsd4_enc)nfsd4_encode_noop,  	[OP_OPEN_CONFIRM]	= (nfsd4_enc)nfsd4_encode_open_confirm,  	[OP_OPEN_DOWNGRADE]	= (nfsd4_enc)nfsd4_encode_open_downgrade,  	[OP_PUTFH]		= (nfsd4_enc)nfsd4_encode_noop, diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index 3a9e5deed74..19e3a96aa02 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c @@ -176,7 +176,8 @@ static int ocfs2_dinode_insert_check(struct inode *inode,  	BUG_ON(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL);  	mlog_bug_on_msg(!ocfs2_sparse_alloc(osb) && -			(OCFS2_I(inode)->ip_clusters != rec->e_cpos), +			(OCFS2_I(inode)->ip_clusters != +			 le32_to_cpu(rec->e_cpos)),  			"Device %s, asking for sparse allocation: inode %llu, "  			"cpos %u, clusters %u\n",  			osb->dev_str, diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index a067a6cffb0..8e1709a679b 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -227,7 +227,7 @@ int ocfs2_read_inline_data(struct inode *inode, struct page *page,  	size = i_size_read(inode);  	if (size > PAGE_CACHE_SIZE || -	    size > ocfs2_max_inline_data(inode->i_sb)) { +	    size > ocfs2_max_inline_data_with_xattr(inode->i_sb, di)) {  		ocfs2_error(inode->i_sb,  			    "Inode %llu has with inline data has bad size: %Lu",  			    (unsigned long long)OCFS2_I(inode)->ip_blkno, @@ -1555,6 +1555,7 @@ static int ocfs2_try_to_write_inline_data(struct address_space *mapping,  	int ret, written = 0;  	loff_t end = pos + len;  	struct ocfs2_inode_info *oi = OCFS2_I(inode); +	struct ocfs2_dinode *di = NULL;  	mlog(0, "Inode %llu, write of %u bytes at off %llu. features: 0x%x\n",  	     (unsigned long long)oi->ip_blkno, len, (unsigned long long)pos, @@ -1587,7 +1588,9 @@ static int ocfs2_try_to_write_inline_data(struct address_space *mapping,  	/*  	 * Check whether the write can fit.  	 */ -	if (mmap_page || end > ocfs2_max_inline_data(inode->i_sb)) +	di = (struct ocfs2_dinode *)wc->w_di_bh->b_data; +	if (mmap_page || +	    end > ocfs2_max_inline_data_with_xattr(inode->i_sb, di))  		return 0;  do_inline_write: diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 084aba86c3b..4b11762f249 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c @@ -532,7 +532,8 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb,  		fe->i_dyn_features = cpu_to_le16(feat | OCFS2_INLINE_DATA_FL); -		fe->id2.i_data.id_count = cpu_to_le16(ocfs2_max_inline_data(osb->sb)); +		fe->id2.i_data.id_count = cpu_to_le16( +				ocfs2_max_inline_data_with_xattr(osb->sb, fe));  	} else {  		fel = &fe->id2.i_list;  		fel->l_tree_depth = 0; diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h index c7ae45aaa36..2332ef740f4 100644 --- a/fs/ocfs2/ocfs2_fs.h +++ b/fs/ocfs2/ocfs2_fs.h @@ -1070,12 +1070,6 @@ static inline int ocfs2_fast_symlink_chars(struct super_block *sb)  		 offsetof(struct ocfs2_dinode, id2.i_symlink);  } -static inline int ocfs2_max_inline_data(struct super_block *sb) -{ -	return sb->s_blocksize - -		offsetof(struct ocfs2_dinode, id2.i_data.id_data); -} -  static inline int ocfs2_max_inline_data_with_xattr(struct super_block *sb,  						   struct ocfs2_dinode *di)  { diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index 4ddd788add6..2563df89fc2 100644 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c @@ -547,8 +547,12 @@ int ocfs2_calc_xattr_init(struct inode *dir,  	 * when blocksize = 512, may reserve one more cluser for  	 * xattr bucket, otherwise reserve one metadata block  	 * for them is ok. +	 * If this is a new directory with inline data, +	 * we choose to reserve the entire inline area for +	 * directory contents and force an external xattr block.  	 */  	if (dir->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE || +	    (S_ISDIR(mode) && ocfs2_supports_inline_data(osb)) ||  	    (s_size + a_size) > OCFS2_XATTR_FREE_IN_IBODY) {  		ret = ocfs2_reserve_new_metadata_blocks(osb, 1, xattr_ac);  		if (ret) { @@ -4791,19 +4795,33 @@ static int ocfs2_xattr_bucket_set_value_outside(struct inode *inode,  						char *val,  						int value_len)  { -	int offset; +	int ret, offset, block_off;  	struct ocfs2_xattr_value_root *xv;  	struct ocfs2_xattr_entry *xe = xs->here; +	struct ocfs2_xattr_header *xh = bucket_xh(xs->bucket); +	void *base;  	BUG_ON(!xs->base || !xe || ocfs2_xattr_is_local(xe)); -	offset = le16_to_cpu(xe->xe_name_offset) + -		 OCFS2_XATTR_SIZE(xe->xe_name_len); +	ret = ocfs2_xattr_bucket_get_name_value(inode, xh, +						xe - xh->xh_entries, +						&block_off, +						&offset); +	if (ret) { +		mlog_errno(ret); +		goto out; +	} -	xv = (struct ocfs2_xattr_value_root *)(xs->base + offset); +	base = bucket_block(xs->bucket, block_off); +	xv = (struct ocfs2_xattr_value_root *)(base + offset + +		 OCFS2_XATTR_SIZE(xe->xe_name_len)); -	return __ocfs2_xattr_set_value_outside(inode, handle, -					       xv, val, value_len); +	ret = __ocfs2_xattr_set_value_outside(inode, handle, +					      xv, val, value_len); +	if (ret) +		mlog_errno(ret); +out: +	return ret;  }  static int ocfs2_rm_xattr_cluster(struct inode *inode, diff --git a/fs/pipe.c b/fs/pipe.c index 3a48ba5179d..14f502b89cf 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -699,12 +699,12 @@ pipe_rdwr_fasync(int fd, struct file *filp, int on)  	int retval;  	mutex_lock(&inode->i_mutex); -  	retval = fasync_helper(fd, filp, on, &pipe->fasync_readers); - -	if (retval >= 0) +	if (retval >= 0) {  		retval = fasync_helper(fd, filp, on, &pipe->fasync_writers); - +		if (retval < 0) /* this can happen only if on == T */ +			fasync_helper(-1, filp, 0, &pipe->fasync_readers); +	}  	mutex_unlock(&inode->i_mutex);  	if (retval < 0) diff --git a/fs/proc/base.c b/fs/proc/base.c index 0c9de19a163..beaa0ce3b82 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -3066,7 +3066,6 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi  	int retval = -ENOENT;  	ino_t ino;  	int tid; -	unsigned long pos = filp->f_pos;  /* avoiding "long long" filp->f_pos */  	struct pid_namespace *ns;  	task = get_proc_task(inode); @@ -3083,18 +3082,18 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi  		goto out_no_task;  	retval = 0; -	switch (pos) { +	switch ((unsigned long)filp->f_pos) {  	case 0:  		ino = inode->i_ino; -		if (filldir(dirent, ".", 1, pos, ino, DT_DIR) < 0) +		if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) < 0)  			goto out; -		pos++; +		filp->f_pos++;  		/* fall through */  	case 1:  		ino = parent_ino(dentry); -		if (filldir(dirent, "..", 2, pos, ino, DT_DIR) < 0) +		if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) < 0)  			goto out; -		pos++; +		filp->f_pos++;  		/* fall through */  	} @@ -3104,9 +3103,9 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi  	ns = filp->f_dentry->d_sb->s_fs_info;  	tid = (int)filp->f_version;  	filp->f_version = 0; -	for (task = first_tid(leader, tid, pos - 2, ns); +	for (task = first_tid(leader, tid, filp->f_pos - 2, ns);  	     task; -	     task = next_tid(task), pos++) { +	     task = next_tid(task), filp->f_pos++) {  		tid = task_pid_nr_ns(task, ns);  		if (proc_task_fill_cache(filp, dirent, filldir, task, tid) < 0) {  			/* returning this tgid failed, save it as the first @@ -3117,7 +3116,6 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi  		}  	}  out: -	filp->f_pos = pos;  	put_task_struct(leader);  out_no_task:  	return retval; diff --git a/fs/proc/page.c b/fs/proc/page.c index 2d1345112a4..e9983837d08 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -80,7 +80,7 @@ static const struct file_operations proc_kpagecount_operations = {  #define KPF_RECLAIM    9  #define KPF_BUDDY     10 -#define kpf_copy_bit(flags, srcpos, dstpos) (((flags >> srcpos) & 1) << dstpos) +#define kpf_copy_bit(flags, dstpos, srcpos) (((flags >> srcpos) & 1) << dstpos)  static ssize_t kpageflags_read(struct file *file, char __user *buf,  			     size_t count, loff_t *ppos) diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index b9b567a2837..5d7c7ececa6 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c @@ -114,6 +114,9 @@ int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize)  		if (!pagevec_add(&lru_pvec, page))  			__pagevec_lru_add_file(&lru_pvec); +		/* prevent the page from being discarded on memory pressure */ +		SetPageDirty(page); +  		unlock_page(page);  	} @@ -126,6 +129,7 @@ int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize)  	return -EFBIG;   add_error: +	pagevec_lru_add_file(&lru_pvec);  	page_cache_release(pages + loop);  	for (loop++; loop < npages; loop++)  		__free_page(pages + loop); diff --git a/fs/squashfs/block.c b/fs/squashfs/block.c index c837dfc2b3c..2a796031034 100644 --- a/fs/squashfs/block.c +++ b/fs/squashfs/block.c @@ -80,7 +80,7 @@ static struct buffer_head *get_block_length(struct super_block *sb,   * generated a larger block - this does occasionally happen with zlib).   */  int squashfs_read_data(struct super_block *sb, void **buffer, u64 index, -			int length, u64 *next_index, int srclength) +			int length, u64 *next_index, int srclength, int pages)  {  	struct squashfs_sb_info *msblk = sb->s_fs_info;  	struct buffer_head **bh; @@ -184,7 +184,7 @@ int squashfs_read_data(struct super_block *sb, void **buffer, u64 index,  				offset = 0;  			} -			if (msblk->stream.avail_out == 0) { +			if (msblk->stream.avail_out == 0 && page < pages) {  				msblk->stream.next_out = buffer[page++];  				msblk->stream.avail_out = PAGE_CACHE_SIZE;  			} @@ -201,25 +201,20 @@ int squashfs_read_data(struct super_block *sb, void **buffer, u64 index,  				zlib_init = 1;  			} -			zlib_err = zlib_inflate(&msblk->stream, Z_NO_FLUSH); +			zlib_err = zlib_inflate(&msblk->stream, Z_SYNC_FLUSH);  			if (msblk->stream.avail_in == 0 && k < b)  				put_bh(bh[k++]);  		} while (zlib_err == Z_OK);  		if (zlib_err != Z_STREAM_END) { -			ERROR("zlib_inflate returned unexpected result" -				" 0x%x, srclength %d, avail_in %d," -				" avail_out %d\n", zlib_err, srclength, -				msblk->stream.avail_in, -				msblk->stream.avail_out); +			ERROR("zlib_inflate error, data probably corrupt\n");  			goto release_mutex;  		}  		zlib_err = zlib_inflateEnd(&msblk->stream);  		if (zlib_err != Z_OK) { -			ERROR("zlib_inflateEnd returned unexpected result 0x%x," -				" srclength %d\n", zlib_err, srclength); +			ERROR("zlib_inflate error, data probably corrupt\n");  			goto release_mutex;  		}  		length = msblk->stream.total_out; @@ -268,7 +263,8 @@ block_release:  		put_bh(bh[k]);  read_failure: -	ERROR("sb_bread failed reading block 0x%llx\n", cur_index); +	ERROR("squashfs_read_data failed to read block 0x%llx\n", +					(unsigned long long) index);  	kfree(bh);  	return -EIO;  } diff --git a/fs/squashfs/cache.c b/fs/squashfs/cache.c index f29eda16d25..1c4739e33af 100644 --- a/fs/squashfs/cache.c +++ b/fs/squashfs/cache.c @@ -119,7 +119,7 @@ struct squashfs_cache_entry *squashfs_cache_get(struct super_block *sb,  			entry->length = squashfs_read_data(sb, entry->data,  				block, length, &entry->next_index, -				cache->block_size); +				cache->block_size, cache->pages);  			spin_lock(&cache->lock); @@ -406,7 +406,7 @@ int squashfs_read_table(struct super_block *sb, void *buffer, u64 block,  	for (i = 0; i < pages; i++, buffer += PAGE_CACHE_SIZE)  		data[i] = buffer;  	res = squashfs_read_data(sb, data, block, length | -		SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length); +		SQUASHFS_COMPRESSED_BIT_BLOCK, NULL, length, pages);  	kfree(data);  	return res;  } diff --git a/fs/squashfs/inode.c b/fs/squashfs/inode.c index 7a63398bb85..9101dbde39e 100644 --- a/fs/squashfs/inode.c +++ b/fs/squashfs/inode.c @@ -133,7 +133,8 @@ int squashfs_read_inode(struct inode *inode, long long ino)  	type = le16_to_cpu(sqshb_ino->inode_type);  	switch (type) {  	case SQUASHFS_REG_TYPE: { -		unsigned int frag_offset, frag_size, frag; +		unsigned int frag_offset, frag; +		int frag_size;  		u64 frag_blk;  		struct squashfs_reg_inode *sqsh_ino = &squashfs_ino.reg; @@ -175,7 +176,8 @@ int squashfs_read_inode(struct inode *inode, long long ino)  		break;  	}  	case SQUASHFS_LREG_TYPE: { -		unsigned int frag_offset, frag_size, frag; +		unsigned int frag_offset, frag; +		int frag_size;  		u64 frag_blk;  		struct squashfs_lreg_inode *sqsh_ino = &squashfs_ino.lreg; diff --git a/fs/squashfs/squashfs.h b/fs/squashfs/squashfs.h index 6b2515d027d..0e9feb6adf7 100644 --- a/fs/squashfs/squashfs.h +++ b/fs/squashfs/squashfs.h @@ -34,7 +34,7 @@ static inline struct squashfs_inode_info *squashfs_i(struct inode *inode)  /* block.c */  extern int squashfs_read_data(struct super_block *, void **, u64, int, u64 *, -				int); +				int, int);  /* cache.c */  extern struct squashfs_cache *squashfs_cache_init(char *, int, int); diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 071df5b5b49..681ec0d8379 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c @@ -389,7 +389,7 @@ static int __init init_squashfs_fs(void)  		return err;  	} -	printk(KERN_INFO "squashfs: version 4.0 (2009/01/03) " +	printk(KERN_INFO "squashfs: version 4.0 (2009/01/31) "  		"Phillip Lougher\n");  	return 0; diff --git a/fs/super.c b/fs/super.c index 8349ed6b141..6ce501447ad 100644 --- a/fs/super.c +++ b/fs/super.c @@ -371,8 +371,10 @@ retry:  				continue;  			if (!grab_super(old))  				goto retry; -			if (s) +			if (s) { +				up_write(&s->s_umount);  				destroy_super(s); +			}  			return old;  		}  	} @@ -387,6 +389,7 @@ retry:  	err = set(s, data);  	if (err) {  		spin_unlock(&sb_lock); +		up_write(&s->s_umount);  		destroy_super(s);  		return ERR_PTR(err);  	} diff --git a/fs/ufs/super.c b/fs/ufs/super.c index e65212dfb60..261a1c2f22d 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c @@ -41,7 +41,7 @@   * Stefan Reinauer <stepan@home.culture.mipt.ru>   *   * Module usage counts added on 96/04/29 by - * Gertjan van Wingerde <gertjan@cs.vu.nl> + * Gertjan van Wingerde <gwingerde@gmail.com>   *   * Clean swab support on 19970406 by   * Francois-Rene Rideau <fare@tunes.org> diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index cb329edc925..aa1016bb913 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -34,6 +34,12 @@  #include <linux/backing-dev.h>  #include <linux/freezer.h> +#include "xfs_sb.h" +#include "xfs_inum.h" +#include "xfs_ag.h" +#include "xfs_dmapi.h" +#include "xfs_mount.h" +  static kmem_zone_t *xfs_buf_zone;  STATIC int xfsbufd(void *);  STATIC int xfsbufd_wakeup(int, gfp_t); @@ -1435,10 +1441,12 @@ xfs_unregister_buftarg(  void  xfs_free_buftarg( -	xfs_buftarg_t		*btp) +	struct xfs_mount	*mp, +	struct xfs_buftarg	*btp)  {  	xfs_flush_buftarg(btp, 1); -	xfs_blkdev_issue_flush(btp); +	if (mp->m_flags & XFS_MOUNT_BARRIER) +		xfs_blkdev_issue_flush(btp);  	xfs_free_bufhash(btp);  	iput(btp->bt_mapping->host); diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index 288ae7c4c80..9b4d666ad31 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h @@ -413,7 +413,7 @@ static inline int XFS_bwrite(xfs_buf_t *bp)   *	Handling of buftargs.   */  extern xfs_buftarg_t *xfs_alloc_buftarg(struct block_device *, int); -extern void xfs_free_buftarg(xfs_buftarg_t *); +extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *);  extern void xfs_wait_buftarg(xfs_buftarg_t *);  extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int);  extern int xfs_flush_buftarg(xfs_buftarg_t *, int); diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index c71e226da7f..32ae5028e96 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c @@ -734,15 +734,15 @@ xfs_close_devices(  {  	if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {  		struct block_device *logdev = mp->m_logdev_targp->bt_bdev; -		xfs_free_buftarg(mp->m_logdev_targp); +		xfs_free_buftarg(mp, mp->m_logdev_targp);  		xfs_blkdev_put(logdev);  	}  	if (mp->m_rtdev_targp) {  		struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev; -		xfs_free_buftarg(mp->m_rtdev_targp); +		xfs_free_buftarg(mp, mp->m_rtdev_targp);  		xfs_blkdev_put(rtdev);  	} -	xfs_free_buftarg(mp->m_ddev_targp); +	xfs_free_buftarg(mp, mp->m_ddev_targp);  }  /* @@ -811,9 +811,9 @@ xfs_open_devices(   out_free_rtdev_targ:  	if (mp->m_rtdev_targp) -		xfs_free_buftarg(mp->m_rtdev_targp); +		xfs_free_buftarg(mp, mp->m_rtdev_targp);   out_free_ddev_targ: -	xfs_free_buftarg(mp->m_ddev_targp); +	xfs_free_buftarg(mp, mp->m_ddev_targp);   out_close_rtdev:  	if (rtdev)  		xfs_blkdev_put(rtdev); diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index e2fb6210d4c..478e587087f 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -246,9 +246,6 @@ xfs_iget_cache_miss(  		goto out_destroy;  	} -	if (lock_flags) -		xfs_ilock(ip, lock_flags); -  	/*  	 * Preload the radix tree so we can insert safely under the  	 * write spinlock. Note that we cannot sleep inside the preload @@ -256,7 +253,16 @@ xfs_iget_cache_miss(  	 */  	if (radix_tree_preload(GFP_KERNEL)) {  		error = EAGAIN; -		goto out_unlock; +		goto out_destroy; +	} + +	/* +	 * Because the inode hasn't been added to the radix-tree yet it can't +	 * be found by another thread, so we can do the non-sleeping lock here. +	 */ +	if (lock_flags) { +		if (!xfs_ilock_nowait(ip, lock_flags)) +			BUG();  	}  	mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1); @@ -284,7 +290,6 @@ xfs_iget_cache_miss(  out_preload_end:  	write_unlock(&pag->pag_ici_lock);  	radix_tree_preload_end(); -out_unlock:  	if (lock_flags)  		xfs_iunlock(ip, lock_flags);  out_destroy: diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index b1047de2fff..61af610d79b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1455,10 +1455,19 @@ xlog_recover_add_to_trans(  	item = item->ri_prev;  	if (item->ri_total == 0) {		/* first region to be added */ -		item->ri_total	= in_f->ilf_size; -		ASSERT(item->ri_total <= XLOG_MAX_REGIONS_IN_ITEM); -		item->ri_buf = kmem_zalloc((item->ri_total * -					    sizeof(xfs_log_iovec_t)), KM_SLEEP); +		if (in_f->ilf_size == 0 || +		    in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) { +			xlog_warn( +	"XFS: bad number of regions (%d) in inode log format", +				  in_f->ilf_size); +			ASSERT(0); +			return XFS_ERROR(EIO); +		} + +		item->ri_total = in_f->ilf_size; +		item->ri_buf = +			kmem_zalloc(item->ri_total * sizeof(xfs_log_iovec_t), +				    KM_SLEEP);  	}  	ASSERT(item->ri_total > item->ri_cnt);  	/* Description region is ri_buf[0] */ diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index ff8d27af478..a11cc9d3259 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -69,8 +69,8 @@ struct detailed_pixel_timing {  	u8 hborder;  	u8 vborder;  	u8 unknown0:1; -	u8 vsync_positive:1;  	u8 hsync_positive:1; +	u8 vsync_positive:1;  	u8 separate_sync:2;  	u8 stereo:1;  	u8 unknown6:1; diff --git a/include/linux/ata.h b/include/linux/ata.h index 08a86d5cdf1..9a061accd8b 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h @@ -89,6 +89,8 @@ enum {  	ATA_ID_DLF		= 128,  	ATA_ID_CSFO		= 129,  	ATA_ID_CFA_POWER	= 160, +	ATA_ID_CFA_KEY_MGMT	= 162, +	ATA_ID_CFA_MODES	= 163,  	ATA_ID_ROT_SPEED	= 217,  	ATA_ID_PIO4		= (1 << 1), diff --git a/include/linux/bio.h b/include/linux/bio.h index 1b16108a541..d8bd43bfdcf 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -531,7 +531,7 @@ extern void bio_integrity_endio(struct bio *, int);  extern void bio_integrity_advance(struct bio *, unsigned int);  extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int);  extern void bio_integrity_split(struct bio *, struct bio_pair *, int); -extern int bio_integrity_clone(struct bio *, struct bio *, struct bio_set *); +extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t, struct bio_set *);  extern int bioset_integrity_create(struct bio_set *, int);  extern void bioset_integrity_free(struct bio_set *);  extern void bio_integrity_init_slab(void); @@ -542,7 +542,7 @@ extern void bio_integrity_init_slab(void);  #define bioset_integrity_create(a, b)	(0)  #define bio_integrity_prep(a)		(0)  #define bio_integrity_enabled(a)	(0) -#define bio_integrity_clone(a, b, c)	(0) +#define bio_integrity_clone(a, b, c,d )	(0)  #define bioset_integrity_free(a)	do { } while (0)  #define bio_integrity_free(a, b)	do { } while (0)  #define bio_integrity_endio(a, b)	do { } while (0) diff --git a/include/linux/capability.h b/include/linux/capability.h index 1b987255613..4864a43b2b4 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h @@ -393,8 +393,10 @@ struct cpu_vfs_cap_data {  # define CAP_FULL_SET     ((kernel_cap_t){{ ~0, ~0 }})  # define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }})  # define CAP_FS_SET       ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } }) -# define CAP_NFSD_SET     ((kernel_cap_t){{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \ -					CAP_FS_MASK_B1 } }) +# define CAP_NFSD_SET     ((kernel_cap_t){{ CAP_FS_MASK_B0 \ +					    | CAP_TO_MASK(CAP_SYS_RESOURCE) \ +					    | CAP_TO_MASK(CAP_MKNOD), \ +					    CAP_FS_MASK_B1 } })  #endif /* _KERNEL_CAPABILITY_U32S != 2 */ diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 1514d534dee..a3ed7cb8ca3 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h @@ -52,7 +52,15 @@  #define __deprecated			__attribute__((deprecated))  #define __packed			__attribute__((packed))  #define __weak				__attribute__((weak)) -#define __naked				__attribute__((naked)) + +/* + * it doesn't make sense on ARM (currently the only user of __naked) to trace + * naked functions because then mcount is called without stack and frame pointer + * being set up and there is no chance to restore the lr register to the value + * before mcount was called. + */ +#define __naked				__attribute__((naked)) notrace +  #define __noreturn			__attribute__((noreturn))  /* diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 384b38d3e8e..161042746af 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -234,7 +234,6 @@ struct cpufreq_driver {  	int	(*suspend)	(struct cpufreq_policy *policy, pm_message_t pmsg);  	int	(*resume)	(struct cpufreq_policy *policy);  	struct freq_attr	**attr; -	bool			hide_interface;  };  /* flags */ diff --git a/include/linux/dca.h b/include/linux/dca.h index b00a753eda5..9c20c7e87d0 100644 --- a/include/linux/dca.h +++ b/include/linux/dca.h @@ -1,3 +1,23 @@ +/* + * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston, MA  02111-1307, USA. + * + * The full GNU General Public License is included in this distribution in the + * file called COPYING. + */  #ifndef DCA_H  #define DCA_H  /* DCA Provider API */ diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index f0413845f20..1956c8d46d3 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h @@ -97,7 +97,6 @@ typedef struct { DECLARE_BITMAP(bits, DMA_TX_TYPE_END); } dma_cap_mask_t;  /**   * struct dma_chan_percpu - the per-CPU part of struct dma_chan - * @refcount: local_t used for open-coded "bigref" counting   * @memcpy_count: transaction counter   * @bytes_transferred: byte counter   */ @@ -114,9 +113,6 @@ struct dma_chan_percpu {   * @cookie: last cookie value returned to client   * @chan_id: channel ID for sysfs   * @dev: class device for sysfs - * @refcount: kref, used in "bigref" slow-mode - * @slow_ref: indicates that the DMA channel is free - * @rcu: the DMA channel's RCU head   * @device_node: used to add this to the device chan list   * @local: per-cpu pointer to a struct dma_chan_percpu   * @client-count: how many clients are using this channel @@ -213,8 +209,6 @@ struct dma_async_tx_descriptor {   * @global_node: list_head for global dma_device_list   * @cap_mask: one or more dma_capability flags   * @max_xor: maximum number of xor sources, 0 if no capability - * @refcount: reference count - * @done: IO completion struct   * @dev_id: unique device ID   * @dev: struct device reference for dma mapping api   * @device_alloc_chan_resources: allocate resources and return the @@ -227,6 +221,7 @@ struct dma_async_tx_descriptor {   * @device_prep_dma_interrupt: prepares an end of chain interrupt operation   * @device_prep_slave_sg: prepares a slave dma operation   * @device_terminate_all: terminate all pending operations + * @device_is_tx_complete: poll for transaction completion   * @device_issue_pending: push pending transactions to hardware   */  struct dma_device { diff --git a/include/linux/hdreg.h b/include/linux/hdreg.h index c37e9241fae..ed21bd3dbd2 100644 --- a/include/linux/hdreg.h +++ b/include/linux/hdreg.h @@ -511,7 +511,6 @@ struct hd_driveid {  	unsigned short	words69_70[2];	/* reserved words 69-70  					 * future command overlap and queuing  					 */ -	/* HDIO_GET_IDENTITY currently returns only words 0 through 70 */  	unsigned short	words71_74[4];	/* reserved words 71-74  					 * for IDENTIFY PACKET DEVICE command  					 */ diff --git a/include/linux/ide.h b/include/linux/ide.h index fe235b65207..25087aead65 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -797,6 +797,7 @@ typedef struct hwif_s {  	struct scatterlist *sg_table;  	int sg_max_nents;		/* Maximum number of entries in it */  	int sg_nents;			/* Current number of entries in it */ +	int orig_sg_nents;  	int sg_dma_direction;		/* dma transfer direction */  	/* data phase of the active command (currently only valid for PIO/DMA) */ @@ -866,6 +867,7 @@ struct ide_host {  	unsigned int	n_ports;  	struct device	*dev[2];  	unsigned int	(*init_chipset)(struct pci_dev *); +	irq_handler_t	irq_handler;  	unsigned long	host_flags;  	void		*host_priv;  	ide_hwif_t	*cur_port;	/* for hosts requiring serialization */ diff --git a/include/linux/input.h b/include/linux/input.h index 1249a0c20a3..6b28048fc56 100644 --- a/include/linux/input.h +++ b/include/linux/input.h @@ -661,6 +661,7 @@ struct input_absinfo {  #define SW_DOCK			0x05  /* set = plugged into dock */  #define SW_LINEOUT_INSERT	0x06  /* set = inserted */  #define SW_JACK_PHYSICAL_INSERT 0x07  /* set = mechanical switch set */ +#define SW_VIDEOOUT_INSERT	0x08  /* set = inserted */  #define SW_MAX			0x0f  #define SW_CNT			(SW_MAX+1) diff --git a/include/linux/libata.h b/include/linux/libata.h index 5d87bc09a1f..dc18b87ed72 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -275,7 +275,7 @@ enum {  	 * advised to wait only for the following duration before  	 * doing SRST.  	 */ -	ATA_TMOUT_PMP_SRST_WAIT	= 1000, +	ATA_TMOUT_PMP_SRST_WAIT	= 5000,  	/* ATA bus states */  	BUS_UNKNOWN		= 0, @@ -530,6 +530,7 @@ struct ata_queued_cmd {  	unsigned long		flags;		/* ATA_QCFLAG_xxx */  	unsigned int		tag;  	unsigned int		n_elem; +	unsigned int		orig_n_elem;  	int			dma_dir; @@ -750,7 +751,8 @@ struct ata_port {  	acpi_handle		acpi_handle;  	struct ata_acpi_gtm	__acpi_init_gtm; /* use ata_acpi_init_gtm() */  #endif -	u8			sector_buf[ATA_SECT_SIZE]; /* owned by EH */ +	/* owned by EH */ +	u8			sector_buf[ATA_SECT_SIZE] ____cacheline_aligned;  };  /* The following initializer overrides a method to NULL whether one of diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index aa6fe7026de..51855dfd8ad 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h @@ -346,6 +346,7 @@ static inline int __nlm_cmp_addr4(const struct sockaddr *sap1,  	return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr;  } +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)  static inline int __nlm_cmp_addr6(const struct sockaddr *sap1,  				  const struct sockaddr *sap2)  { @@ -353,6 +354,13 @@ static inline int __nlm_cmp_addr6(const struct sockaddr *sap1,  	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2;  	return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr);  } +#else	/* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */ +static inline int __nlm_cmp_addr6(const struct sockaddr *sap1, +				  const struct sockaddr *sap2) +{ +	return 0; +} +#endif	/* !(CONFIG_IPV6 || CONFIG_IPV6_MODULE) */  /*   * Compare two host addresses diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 92915e81443..d84feb7bdbf 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -276,4 +276,7 @@ struct mm_struct {  #endif  }; +/* Future-safe accessor for struct mm_struct's cpu_vm_mask. */ +#define mm_cpumask(mm) (&(mm)->cpu_vm_mask) +  #endif /* _LINUX_MM_TYPES_H */ diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ec54785d34f..659366734f3 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1079,6 +1079,7 @@ extern void		synchronize_net(void);  extern int 		register_netdevice_notifier(struct notifier_block *nb);  extern int		unregister_netdevice_notifier(struct notifier_block *nb);  extern int		init_dummy_netdev(struct net_device *dev); +extern void		netdev_resync_ops(struct net_device *dev);  extern int call_netdevice_notifiers(unsigned long val, struct net_device *dev);  extern struct net_device	*dev_get_by_index(struct net *net, int ifindex); diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index a550b528319..2e5f00066af 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -406,6 +406,8 @@ struct nfs3_setaclargs {  	int			mask;  	struct posix_acl *	acl_access;  	struct posix_acl *	acl_default; +	size_t			len; +	unsigned int		npages;  	struct page **		pages;  }; diff --git a/include/linux/nfsacl.h b/include/linux/nfsacl.h index 54487a99beb..43011b69297 100644 --- a/include/linux/nfsacl.h +++ b/include/linux/nfsacl.h @@ -37,6 +37,9 @@  #define NFSACL_MAXPAGES		((2*(8+12*NFS_ACL_MAX_ENTRIES) + PAGE_SIZE-1) \  				 >> PAGE_SHIFT) +#define NFS_ACL_MAX_ENTRIES_INLINE	(5) +#define NFS_ACL_INLINE_BUFSIZE	((2*(2+3*NFS_ACL_MAX_ENTRIES_INLINE)) << 2) +  static inline unsigned int  nfsacl_size(struct posix_acl *acl_access, struct posix_acl *acl_default)  { diff --git a/include/linux/rcuclassic.h b/include/linux/rcuclassic.h index f3f697df1d7..80044a4f3ab 100644 --- a/include/linux/rcuclassic.h +++ b/include/linux/rcuclassic.h @@ -181,4 +181,10 @@ extern long rcu_batches_completed_bh(void);  #define rcu_enter_nohz()	do { } while (0)  #define rcu_exit_nohz()		do { } while (0) +/* A context switch is a grace period for rcuclassic. */ +static inline int rcu_blocking_is_gp(void) +{ +	return num_online_cpus() == 1; +} +  #endif /* __LINUX_RCUCLASSIC_H */ diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 921340a7b71..528343e6da5 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -52,6 +52,9 @@ struct rcu_head {  	void (*func)(struct rcu_head *head);  }; +/* Internal to kernel, but needed by rcupreempt.h. */ +extern int rcu_scheduler_active; +  #if defined(CONFIG_CLASSIC_RCU)  #include <linux/rcuclassic.h>  #elif defined(CONFIG_TREE_RCU) @@ -265,6 +268,7 @@ extern void rcu_barrier_sched(void);  /* Internal to kernel */  extern void rcu_init(void); +extern void rcu_scheduler_starting(void);  extern int rcu_needs_cpu(int cpu);  #endif /* __LINUX_RCUPDATE_H */ diff --git a/include/linux/rcupreempt.h b/include/linux/rcupreempt.h index 3e05c09b54a..74304b4538d 100644 --- a/include/linux/rcupreempt.h +++ b/include/linux/rcupreempt.h @@ -142,4 +142,19 @@ static inline void rcu_exit_nohz(void)  #define rcu_exit_nohz()		do { } while (0)  #endif /* CONFIG_NO_HZ */ +/* + * A context switch is a grace period for rcupreempt synchronize_rcu() + * only during early boot, before the scheduler has been initialized. + * So, how the heck do we get a context switch?  Well, if the caller + * invokes synchronize_rcu(), they are willing to accept a context + * switch, so we simply pretend that one happened. + * + * After boot, there might be a blocked or preempted task in an RCU + * read-side critical section, so we cannot then take the fastpath. + */ +static inline int rcu_blocking_is_gp(void) +{ +	return num_online_cpus() == 1 && !rcu_scheduler_active; +} +  #endif /* __LINUX_RCUPREEMPT_H */ diff --git a/include/linux/rcutree.h b/include/linux/rcutree.h index d4368b7975c..a722fb67bb2 100644 --- a/include/linux/rcutree.h +++ b/include/linux/rcutree.h @@ -326,4 +326,10 @@ static inline void rcu_exit_nohz(void)  }  #endif /* CONFIG_NO_HZ */ +/* A context switch is a grace period for rcutree. */ +static inline int rcu_blocking_is_gp(void) +{ +	return num_online_cpus() == 1; +} +  #endif /* __LINUX_RCUTREE_H */ diff --git a/include/linux/sched.h b/include/linux/sched.h index 8981e52c714..011db2f4c94 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1419,6 +1419,9 @@ struct task_struct {  #endif  }; +/* Future-safe accessor for struct task_struct's cpus_allowed. */ +#define tsk_cpumask(tsk) (&(tsk)->cpus_allowed) +  /*   * Priority of a process goes from 0..MAX_PRIO-1, valid RT   * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH @@ -2291,9 +2294,13 @@ extern long sched_group_rt_runtime(struct task_group *tg);  extern int sched_group_set_rt_period(struct task_group *tg,  				      long rt_period_us);  extern long sched_group_rt_period(struct task_group *tg); +extern int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk);  #endif  #endif +extern int task_can_switch_user(struct user_struct *up, +					struct task_struct *tsk); +  #ifdef CONFIG_TASK_XACCT  static inline void add_rchar(struct task_struct *tsk, ssize_t amt)  { diff --git a/include/linux/serio.h b/include/linux/serio.h index 1bcb357a01a..e0417e4d3f1 100644 --- a/include/linux/serio.h +++ b/include/linux/serio.h @@ -212,7 +212,7 @@ static inline void serio_unpin_driver(struct serio *serio)  #define SERIO_FUJITSU	0x35  #define SERIO_ZHENHUA	0x36  #define SERIO_INEXIO	0x37 -#define SERIO_TOUCHIT213	0x37 +#define SERIO_TOUCHIT213	0x38  #define SERIO_W8001	0x39  #endif diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 6fc13d905c5..ded434b032a 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -109,11 +109,6 @@ extern struct list_head net_namespace_list;  #ifdef CONFIG_NET_NS  extern void __put_net(struct net *net); -static inline int net_alive(struct net *net) -{ -	return net && atomic_read(&net->count); -} -  static inline struct net *get_net(struct net *net)  {  	atomic_inc(&net->count); @@ -145,11 +140,6 @@ int net_eq(const struct net *net1, const struct net *net2)  }  #else -static inline int net_alive(struct net *net) -{ -	return 1; -} -  static inline struct net *get_net(struct net *net)  {  	return net; @@ -234,6 +224,23 @@ struct pernet_operations {  	void (*exit)(struct net *net);  }; +/* + * Use these carefully.  If you implement a network device and it + * needs per network namespace operations use device pernet operations, + * otherwise use pernet subsys operations. + * + * This is critically important.  Most of the network code cleanup + * runs with the assumption that dev_remove_pack has been called so no + * new packets will arrive during and after the cleanup functions have + * been called.  dev_remove_pack is not per namespace so instead the + * guarantee of no more packets arriving in a network namespace is + * provided by ensuring that all network devices and all sockets have + * left the network namespace before the cleanup methods are called. + * + * For the longest time the ipv4 icmp code was registered as a pernet + * device which caused kernel oops, and panics during network + * namespace cleanup.   So please don't get this wrong. + */  extern int register_pernet_subsys(struct pernet_operations *);  extern void unregister_pernet_subsys(struct pernet_operations *);  extern int register_pernet_gen_subsys(int *id, struct pernet_operations *); diff --git a/include/net/netfilter/nf_conntrack_core.h b/include/net/netfilter/nf_conntrack_core.h index c25068e3851..5a449b44ba3 100644 --- a/include/net/netfilter/nf_conntrack_core.h +++ b/include/net/netfilter/nf_conntrack_core.h @@ -62,7 +62,8 @@ static inline int nf_conntrack_confirm(struct sk_buff *skb)  	if (ct && ct != &nf_conntrack_untracked) {  		if (!nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct))  			ret = __nf_conntrack_confirm(skb); -		nf_ct_deliver_cached_events(ct); +		if (likely(ret == NF_ACCEPT)) +			nf_ct_deliver_cached_events(ct);  	}  	return ret;  } diff --git a/include/scsi/fc/fc_fcoe.h b/include/scsi/fc/fc_fcoe.h index 57aaa8f0d61..f271d9cc0fc 100644 --- a/include/scsi/fc/fc_fcoe.h +++ b/include/scsi/fc/fc_fcoe.h @@ -31,10 +31,6 @@  #define	ETH_P_FCOE	0x8906		/* FCOE ether type */  #endif -#ifndef ETH_P_8021Q -#define	ETH_P_8021Q	0x8100 -#endif -  /*   * FC_FCOE_OUI hasn't been standardized yet.   XXX TBD.   */ diff --git a/include/scsi/fc/fc_fs.h b/include/scsi/fc/fc_fs.h index 3e4801d2bdb..1b7af3a64c7 100644 --- a/include/scsi/fc/fc_fs.h +++ b/include/scsi/fc/fc_fs.h @@ -337,4 +337,9 @@ enum fc_pf_rjt_reason {  	FC_RJT_VENDOR =		0xff,	/* vendor specific reject */  }; +/* default timeout values */ + +#define FC_DEF_E_D_TOV	2000UL +#define FC_DEF_R_A_TOV	10000UL +  #endif /* _FC_FS_H_ */ diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h index 9f2876397dd..a2e126b86e3 100644 --- a/include/scsi/libfc.h +++ b/include/scsi/libfc.h @@ -68,9 +68,6 @@  /*   * FC HBA status   */ -#define FC_PAUSE		    (1 << 1) -#define FC_LINK_UP		    (1 << 0) -  enum fc_lport_state {  	LPORT_ST_NONE = 0,  	LPORT_ST_FLOGI, @@ -339,31 +336,17 @@ struct fc_exch {  struct libfc_function_template { -	/** -	 * Mandatory Fields -	 * -	 * These handlers must be implemented by the LLD. -	 */ -  	/*  	 * Interface to send a FC frame -	 */ -	int (*frame_send)(struct fc_lport *lp, struct fc_frame *fp); - -	/** -	 * Optional Fields  	 * -	 * The LLD may choose to implement any of the following handlers. -	 * If LLD doesn't specify hander and leaves its pointer NULL then -	 * the default libfc function will be used for that handler. -	 */ - -	/** -	 * ELS/CT interfaces +	 * STATUS: REQUIRED  	 */ +	int (*frame_send)(struct fc_lport *lp, struct fc_frame *fp);  	/* -	 * elsct_send - sends ELS/CT frame +	 * Interface to send ELS/CT frames +	 * +	 * STATUS: OPTIONAL  	 */  	struct fc_seq *(*elsct_send)(struct fc_lport *lport,  				     struct fc_rport *rport, @@ -373,9 +356,6 @@ struct libfc_function_template {  					     struct fc_frame *fp,  					     void *arg),  				     void *arg, u32 timer_msec); -	/** -	 * Exhance Manager interfaces -	 */  	/*  	 * Send the FC frame payload using a new exchange and sequence. @@ -407,6 +387,8 @@ struct libfc_function_template {  	 * timer_msec argument is specified. The timer is canceled when  	 * it fires or when the exchange is done. The exchange timeout handler  	 * is registered by EM layer. +	 * +	 * STATUS: OPTIONAL  	 */  	struct fc_seq *(*exch_seq_send)(struct fc_lport *lp,  					struct fc_frame *fp, @@ -418,14 +400,18 @@ struct libfc_function_template {  					void *arg, unsigned int timer_msec);  	/* -	 * send a frame using existing sequence and exchange. +	 * Send a frame using an existing sequence and exchange. +	 * +	 * STATUS: OPTIONAL  	 */  	int (*seq_send)(struct fc_lport *lp, struct fc_seq *sp,  			struct fc_frame *fp);  	/* -	 * Send ELS response using mainly infomation -	 * in exchange and sequence in EM layer. +	 * Send an ELS response using infomation from a previous +	 * exchange and sequence. +	 * +	 * STATUS: OPTIONAL  	 */  	void (*seq_els_rsp_send)(struct fc_seq *sp, enum fc_els_cmd els_cmd,  				 struct fc_seq_els_data *els_data); @@ -437,6 +423,8 @@ struct libfc_function_template {  	 * A timer_msec can be specified for abort timeout, if non-zero  	 * timer_msec value is specified then exchange resp handler  	 * will be called with timeout error if no response to abort. +	 * +	 * STATUS: OPTIONAL  	 */  	int (*seq_exch_abort)(const struct fc_seq *req_sp,  			      unsigned int timer_msec); @@ -444,6 +432,8 @@ struct libfc_function_template {  	/*  	 * Indicate that an exchange/sequence tuple is complete and the memory  	 * allocated for the related objects may be freed. +	 * +	 * STATUS: OPTIONAL  	 */  	void (*exch_done)(struct fc_seq *sp); @@ -451,6 +441,8 @@ struct libfc_function_template {  	 * Assigns a EM and a free XID for an new exchange and then  	 * allocates a new exchange and sequence pair.  	 * The fp can be used to determine free XID. +	 * +	 * STATUS: OPTIONAL  	 */  	struct fc_exch *(*exch_get)(struct fc_lport *lp, struct fc_frame *fp); @@ -458,12 +450,16 @@ struct libfc_function_template {  	 * Release previously assigned XID by exch_get API.  	 * The LLD may implement this if XID is assigned by LLD  	 * in exch_get(). +	 * +	 * STATUS: OPTIONAL  	 */  	void (*exch_put)(struct fc_lport *lp, struct fc_exch_mgr *mp,  			 u16 ex_id);  	/*  	 * Start a new sequence on the same exchange/sequence tuple. +	 * +	 * STATUS: OPTIONAL  	 */  	struct fc_seq *(*seq_start_next)(struct fc_seq *sp); @@ -471,26 +467,38 @@ struct libfc_function_template {  	 * Reset an exchange manager, completing all sequences and exchanges.  	 * If s_id is non-zero, reset only exchanges originating from that FID.  	 * If d_id is non-zero, reset only exchanges sending to that FID. +	 * +	 * STATUS: OPTIONAL  	 */ -	void (*exch_mgr_reset)(struct fc_exch_mgr *, +	void (*exch_mgr_reset)(struct fc_lport *,  			       u32 s_id, u32 d_id); -	void (*rport_flush_queue)(void); -	/** -	 * Local Port interfaces +	/* +	 * Flush the rport work queue. Generally used before shutdown. +	 * +	 * STATUS: OPTIONAL  	 */ +	void (*rport_flush_queue)(void);  	/* -	 * Receive a frame to a local port. +	 * Receive a frame for a local port. +	 * +	 * STATUS: OPTIONAL  	 */  	void (*lport_recv)(struct fc_lport *lp, struct fc_seq *sp,  			   struct fc_frame *fp); +	/* +	 * Reset the local port. +	 * +	 * STATUS: OPTIONAL +	 */  	int (*lport_reset)(struct fc_lport *); -	/** -	 * Remote Port interfaces +	/* +	 * Create a remote port  	 */ +	struct fc_rport *(*rport_create)(struct fc_disc_port *);  	/*  	 * Initiates the RP state machine. It is called from the LP module. @@ -500,26 +508,33 @@ struct libfc_function_template {  	 * - PLOGI  	 * - PRLI  	 * - RTV +	 * +	 * STATUS: OPTIONAL  	 */  	int (*rport_login)(struct fc_rport *rport);  	/*  	 * Logoff, and remove the rport from the transport if  	 * it had been added. This will send a LOGO to the target. +	 * +	 * STATUS: OPTIONAL  	 */  	int (*rport_logoff)(struct fc_rport *rport);  	/*  	 * Recieve a request from a remote port. +	 * +	 * STATUS: OPTIONAL  	 */  	void (*rport_recv_req)(struct fc_seq *, struct fc_frame *,  			       struct fc_rport *); -	struct fc_rport *(*rport_lookup)(const struct fc_lport *, u32); - -	/** -	 * FCP interfaces +	/* +	 * lookup an rport by it's port ID. +	 * +	 * STATUS: OPTIONAL  	 */ +	struct fc_rport *(*rport_lookup)(const struct fc_lport *, u32);  	/*  	 * Send a fcp cmd from fsp pkt. @@ -527,30 +542,38 @@ struct libfc_function_template {  	 *  	 * The resp handler is called when FCP_RSP received.  	 * +	 * STATUS: OPTIONAL  	 */  	int (*fcp_cmd_send)(struct fc_lport *lp, struct fc_fcp_pkt *fsp,  			    void (*resp)(struct fc_seq *, struct fc_frame *fp,  					 void *arg));  	/* -	 * Used at least durring linkdown and reset +	 * Cleanup the FCP layer, used durring link down and reset +	 * +	 * STATUS: OPTIONAL  	 */  	void (*fcp_cleanup)(struct fc_lport *lp);  	/*  	 * Abort all I/O on a local port +	 * +	 * STATUS: OPTIONAL  	 */  	void (*fcp_abort_io)(struct fc_lport *lp); -	/** -	 * Discovery interfaces +	/* +	 * Receive a request for the discovery layer. +	 * +	 * STATUS: OPTIONAL  	 */ -  	void (*disc_recv_req)(struct fc_seq *,  			      struct fc_frame *, struct fc_lport *);  	/*  	 * Start discovery for a local port. +	 * +	 * STATUS: OPTIONAL  	 */  	void (*disc_start)(void (*disc_callback)(struct fc_lport *,  						 enum fc_disc_event), @@ -559,6 +582,8 @@ struct libfc_function_template {  	/*  	 * Stop discovery for a given lport. This will remove  	 * all discovered rports +	 * +	 * STATUS: OPTIONAL  	 */  	void (*disc_stop) (struct fc_lport *); @@ -566,6 +591,8 @@ struct libfc_function_template {  	 * Stop discovery for a given lport. This will block  	 * until all discovered rports are deleted from the  	 * FC transport class +	 * +	 * STATUS: OPTIONAL  	 */  	void (*disc_stop_final) (struct fc_lport *);  }; @@ -603,7 +630,8 @@ struct fc_lport {  	/* Operational Information */  	struct libfc_function_template tt; -	u16			link_status; +	u8			link_up; +	u8			qfull;  	enum fc_lport_state	state;  	unsigned long		boot_time; @@ -637,7 +665,7 @@ struct fc_lport {  	struct delayed_work	disc_work;  }; -/** +/*   * FC_LPORT HELPER FUNCTIONS   *****************************/  static inline void *lport_priv(const struct fc_lport *lp) @@ -669,7 +697,7 @@ static inline void fc_lport_state_enter(struct fc_lport *lp,  } -/** +/*   * LOCAL PORT LAYER   *****************************/  int fc_lport_init(struct fc_lport *lp); @@ -704,12 +732,6 @@ void fc_linkup(struct fc_lport *);  void fc_linkdown(struct fc_lport *);  /* - * Pause and unpause traffic. - */ -void fc_pause(struct fc_lport *); -void fc_unpause(struct fc_lport *); - -/*   * Configure the local port.   */  int fc_lport_config(struct fc_lport *); @@ -725,19 +747,19 @@ int fc_lport_reset(struct fc_lport *);  int fc_set_mfs(struct fc_lport *lp, u32 mfs); -/** +/*   * REMOTE PORT LAYER   *****************************/  int fc_rport_init(struct fc_lport *lp);  void fc_rport_terminate_io(struct fc_rport *rp); -/** +/*   * DISCOVERY LAYER   *****************************/  int fc_disc_init(struct fc_lport *lp); -/** +/*   * SCSI LAYER   *****************************/  /* @@ -798,7 +820,7 @@ int fc_change_queue_type(struct scsi_device *sdev, int tag_type);   */  void fc_fcp_destroy(struct fc_lport *); -/** +/*   * ELS/CT interface   *****************************/  /* @@ -807,7 +829,7 @@ void fc_fcp_destroy(struct fc_lport *);  int fc_elsct_init(struct fc_lport *lp); -/** +/*   * EXCHANGE MANAGER LAYER   *****************************/  /* @@ -916,7 +938,7 @@ struct fc_seq *fc_seq_start_next(struct fc_seq *sp);   * If s_id is non-zero, reset only exchanges originating from that FID.   * If d_id is non-zero, reset only exchanges sending to that FID.   */ -void fc_exch_mgr_reset(struct fc_exch_mgr *, u32 s_id, u32 d_id); +void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id);  /*   * Functions for fc_functions_template diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h index 89fdbb9a6a1..941818f29f5 100644 --- a/include/scsi/libfcoe.h +++ b/include/scsi/libfcoe.h @@ -46,6 +46,7 @@ struct fcoe_softc {  	struct net_device *phys_dev;		/* device with ethtool_ops */  	struct packet_type  fcoe_packet_type;  	struct sk_buff_head fcoe_pending_queue; +	u8	fcoe_pending_queue_active;  	u8 dest_addr[ETH_ALEN];  	u8 ctl_src_addr[ETH_ALEN]; @@ -58,16 +59,10 @@ struct fcoe_softc {  	u8 address_mode;  }; -static inline struct fcoe_softc *fcoe_softc( -	const struct fc_lport *lp) -{ -	return (struct fcoe_softc *)lport_priv(lp); -} -  static inline struct net_device *fcoe_netdev(  	const struct fc_lport *lp)  { -	return fcoe_softc(lp)->real_dev; +	return ((struct fcoe_softc *)lport_priv(lp))->real_dev;  }  static inline struct fcoe_hdr *skb_fcoe_header(const struct sk_buff *skb) diff --git a/include/sound/asound.h b/include/sound/asound.h index 1c02ed1d7c4..fad3e0c7b93 100644 --- a/include/sound/asound.h +++ b/include/sound/asound.h @@ -126,12 +126,10 @@ struct snd_hwdep_dsp_image {  	unsigned long driver_data;	/* W: driver-specific data */  }; -enum { -	SNDRV_HWDEP_IOCTL_PVERSION = _IOR ('H', 0x00, int), -	SNDRV_HWDEP_IOCTL_INFO = _IOR ('H', 0x01, struct snd_hwdep_info), -	SNDRV_HWDEP_IOCTL_DSP_STATUS = _IOR('H', 0x02, struct snd_hwdep_dsp_status), -	SNDRV_HWDEP_IOCTL_DSP_LOAD   = _IOW('H', 0x03, struct snd_hwdep_dsp_image) -}; +#define SNDRV_HWDEP_IOCTL_PVERSION	_IOR ('H', 0x00, int) +#define SNDRV_HWDEP_IOCTL_INFO		_IOR ('H', 0x01, struct snd_hwdep_info) +#define SNDRV_HWDEP_IOCTL_DSP_STATUS	_IOR('H', 0x02, struct snd_hwdep_dsp_status) +#define SNDRV_HWDEP_IOCTL_DSP_LOAD	_IOW('H', 0x03, struct snd_hwdep_dsp_image)  /*****************************************************************************   *                                                                           * @@ -451,40 +449,35 @@ enum {  	SNDRV_PCM_TSTAMP_TYPE_LAST = SNDRV_PCM_TSTAMP_TYPE_MONOTONIC,  }; -enum { -	SNDRV_PCM_IOCTL_PVERSION = _IOR('A', 0x00, int), -	SNDRV_PCM_IOCTL_INFO = _IOR('A', 0x01, struct snd_pcm_info), -	SNDRV_PCM_IOCTL_TSTAMP = _IOW('A', 0x02, int), -	SNDRV_PCM_IOCTL_TTSTAMP = _IOW('A', 0x03, int), -	SNDRV_PCM_IOCTL_HW_REFINE = _IOWR('A', 0x10, struct snd_pcm_hw_params), -	SNDRV_PCM_IOCTL_HW_PARAMS = _IOWR('A', 0x11, struct snd_pcm_hw_params), -	SNDRV_PCM_IOCTL_HW_FREE = _IO('A', 0x12), -	SNDRV_PCM_IOCTL_SW_PARAMS = _IOWR('A', 0x13, struct snd_pcm_sw_params), -	SNDRV_PCM_IOCTL_STATUS = _IOR('A', 0x20, struct snd_pcm_status), -	SNDRV_PCM_IOCTL_DELAY = _IOR('A', 0x21, snd_pcm_sframes_t), -	SNDRV_PCM_IOCTL_HWSYNC = _IO('A', 0x22), -	SNDRV_PCM_IOCTL_SYNC_PTR = _IOWR('A', 0x23, struct snd_pcm_sync_ptr), -	SNDRV_PCM_IOCTL_CHANNEL_INFO = _IOR('A', 0x32, struct snd_pcm_channel_info), -	SNDRV_PCM_IOCTL_PREPARE = _IO('A', 0x40), -	SNDRV_PCM_IOCTL_RESET = _IO('A', 0x41), -	SNDRV_PCM_IOCTL_START = _IO('A', 0x42), -	SNDRV_PCM_IOCTL_DROP = _IO('A', 0x43), -	SNDRV_PCM_IOCTL_DRAIN = _IO('A', 0x44), -	SNDRV_PCM_IOCTL_PAUSE = _IOW('A', 0x45, int), -	SNDRV_PCM_IOCTL_REWIND = _IOW('A', 0x46, snd_pcm_uframes_t), -	SNDRV_PCM_IOCTL_RESUME = _IO('A', 0x47), -	SNDRV_PCM_IOCTL_XRUN = _IO('A', 0x48), -	SNDRV_PCM_IOCTL_FORWARD = _IOW('A', 0x49, snd_pcm_uframes_t), -	SNDRV_PCM_IOCTL_WRITEI_FRAMES = _IOW('A', 0x50, struct snd_xferi), -	SNDRV_PCM_IOCTL_READI_FRAMES = _IOR('A', 0x51, struct snd_xferi), -	SNDRV_PCM_IOCTL_WRITEN_FRAMES = _IOW('A', 0x52, struct snd_xfern), -	SNDRV_PCM_IOCTL_READN_FRAMES = _IOR('A', 0x53, struct snd_xfern), -	SNDRV_PCM_IOCTL_LINK = _IOW('A', 0x60, int), -	SNDRV_PCM_IOCTL_UNLINK = _IO('A', 0x61), -}; - -/* Trick to make alsa-lib/acinclude.m4 happy */ -#define SNDRV_PCM_IOCTL_REWIND SNDRV_PCM_IOCTL_REWIND +#define SNDRV_PCM_IOCTL_PVERSION	_IOR('A', 0x00, int) +#define SNDRV_PCM_IOCTL_INFO		_IOR('A', 0x01, struct snd_pcm_info) +#define SNDRV_PCM_IOCTL_TSTAMP		_IOW('A', 0x02, int) +#define SNDRV_PCM_IOCTL_TTSTAMP		_IOW('A', 0x03, int) +#define SNDRV_PCM_IOCTL_HW_REFINE	_IOWR('A', 0x10, struct snd_pcm_hw_params) +#define SNDRV_PCM_IOCTL_HW_PARAMS	_IOWR('A', 0x11, struct snd_pcm_hw_params) +#define SNDRV_PCM_IOCTL_HW_FREE		_IO('A', 0x12) +#define SNDRV_PCM_IOCTL_SW_PARAMS	_IOWR('A', 0x13, struct snd_pcm_sw_params) +#define SNDRV_PCM_IOCTL_STATUS		_IOR('A', 0x20, struct snd_pcm_status) +#define SNDRV_PCM_IOCTL_DELAY		_IOR('A', 0x21, snd_pcm_sframes_t) +#define SNDRV_PCM_IOCTL_HWSYNC		_IO('A', 0x22) +#define SNDRV_PCM_IOCTL_SYNC_PTR	_IOWR('A', 0x23, struct snd_pcm_sync_ptr) +#define SNDRV_PCM_IOCTL_CHANNEL_INFO	_IOR('A', 0x32, struct snd_pcm_channel_info) +#define SNDRV_PCM_IOCTL_PREPARE		_IO('A', 0x40) +#define SNDRV_PCM_IOCTL_RESET		_IO('A', 0x41) +#define SNDRV_PCM_IOCTL_START		_IO('A', 0x42) +#define SNDRV_PCM_IOCTL_DROP		_IO('A', 0x43) +#define SNDRV_PCM_IOCTL_DRAIN		_IO('A', 0x44) +#define SNDRV_PCM_IOCTL_PAUSE		_IOW('A', 0x45, int) +#define SNDRV_PCM_IOCTL_REWIND		_IOW('A', 0x46, snd_pcm_uframes_t) +#define SNDRV_PCM_IOCTL_RESUME		_IO('A', 0x47) +#define SNDRV_PCM_IOCTL_XRUN		_IO('A', 0x48) +#define SNDRV_PCM_IOCTL_FORWARD		_IOW('A', 0x49, snd_pcm_uframes_t) +#define SNDRV_PCM_IOCTL_WRITEI_FRAMES	_IOW('A', 0x50, struct snd_xferi) +#define SNDRV_PCM_IOCTL_READI_FRAMES	_IOR('A', 0x51, struct snd_xferi) +#define SNDRV_PCM_IOCTL_WRITEN_FRAMES	_IOW('A', 0x52, struct snd_xfern) +#define SNDRV_PCM_IOCTL_READN_FRAMES	_IOR('A', 0x53, struct snd_xfern) +#define SNDRV_PCM_IOCTL_LINK		_IOW('A', 0x60, int) +#define SNDRV_PCM_IOCTL_UNLINK		_IO('A', 0x61)  /*****************************************************************************   *                                                                           * @@ -538,14 +531,12 @@ struct snd_rawmidi_status {  	unsigned char reserved[16];	/* reserved for future use */  }; -enum { -	SNDRV_RAWMIDI_IOCTL_PVERSION = _IOR('W', 0x00, int), -	SNDRV_RAWMIDI_IOCTL_INFO = _IOR('W', 0x01, struct snd_rawmidi_info), -	SNDRV_RAWMIDI_IOCTL_PARAMS = _IOWR('W', 0x10, struct snd_rawmidi_params), -	SNDRV_RAWMIDI_IOCTL_STATUS = _IOWR('W', 0x20, struct snd_rawmidi_status), -	SNDRV_RAWMIDI_IOCTL_DROP = _IOW('W', 0x30, int), -	SNDRV_RAWMIDI_IOCTL_DRAIN = _IOW('W', 0x31, int), -}; +#define SNDRV_RAWMIDI_IOCTL_PVERSION	_IOR('W', 0x00, int) +#define SNDRV_RAWMIDI_IOCTL_INFO	_IOR('W', 0x01, struct snd_rawmidi_info) +#define SNDRV_RAWMIDI_IOCTL_PARAMS	_IOWR('W', 0x10, struct snd_rawmidi_params) +#define SNDRV_RAWMIDI_IOCTL_STATUS	_IOWR('W', 0x20, struct snd_rawmidi_status) +#define SNDRV_RAWMIDI_IOCTL_DROP	_IOW('W', 0x30, int) +#define SNDRV_RAWMIDI_IOCTL_DRAIN	_IOW('W', 0x31, int)  /*   *  Timer section - /dev/snd/timer @@ -654,23 +645,21 @@ struct snd_timer_status {  	unsigned char reserved[64];	/* reserved */  }; -enum { -	SNDRV_TIMER_IOCTL_PVERSION = _IOR('T', 0x00, int), -	SNDRV_TIMER_IOCTL_NEXT_DEVICE = _IOWR('T', 0x01, struct snd_timer_id), -	SNDRV_TIMER_IOCTL_TREAD = _IOW('T', 0x02, int), -	SNDRV_TIMER_IOCTL_GINFO = _IOWR('T', 0x03, struct snd_timer_ginfo), -	SNDRV_TIMER_IOCTL_GPARAMS = _IOW('T', 0x04, struct snd_timer_gparams), -	SNDRV_TIMER_IOCTL_GSTATUS = _IOWR('T', 0x05, struct snd_timer_gstatus), -	SNDRV_TIMER_IOCTL_SELECT = _IOW('T', 0x10, struct snd_timer_select), -	SNDRV_TIMER_IOCTL_INFO = _IOR('T', 0x11, struct snd_timer_info), -	SNDRV_TIMER_IOCTL_PARAMS = _IOW('T', 0x12, struct snd_timer_params), -	SNDRV_TIMER_IOCTL_STATUS = _IOR('T', 0x14, struct snd_timer_status), -	/* The following four ioctls are changed since 1.0.9 due to confliction */ -	SNDRV_TIMER_IOCTL_START = _IO('T', 0xa0), -	SNDRV_TIMER_IOCTL_STOP = _IO('T', 0xa1), -	SNDRV_TIMER_IOCTL_CONTINUE = _IO('T', 0xa2), -	SNDRV_TIMER_IOCTL_PAUSE = _IO('T', 0xa3), -}; +#define SNDRV_TIMER_IOCTL_PVERSION	_IOR('T', 0x00, int) +#define SNDRV_TIMER_IOCTL_NEXT_DEVICE	_IOWR('T', 0x01, struct snd_timer_id) +#define SNDRV_TIMER_IOCTL_TREAD		_IOW('T', 0x02, int) +#define SNDRV_TIMER_IOCTL_GINFO		_IOWR('T', 0x03, struct snd_timer_ginfo) +#define SNDRV_TIMER_IOCTL_GPARAMS	_IOW('T', 0x04, struct snd_timer_gparams) +#define SNDRV_TIMER_IOCTL_GSTATUS	_IOWR('T', 0x05, struct snd_timer_gstatus) +#define SNDRV_TIMER_IOCTL_SELECT	_IOW('T', 0x10, struct snd_timer_select) +#define SNDRV_TIMER_IOCTL_INFO		_IOR('T', 0x11, struct snd_timer_info) +#define SNDRV_TIMER_IOCTL_PARAMS	_IOW('T', 0x12, struct snd_timer_params) +#define SNDRV_TIMER_IOCTL_STATUS	_IOR('T', 0x14, struct snd_timer_status) +/* The following four ioctls are changed since 1.0.9 due to confliction */ +#define SNDRV_TIMER_IOCTL_START		_IO('T', 0xa0) +#define SNDRV_TIMER_IOCTL_STOP		_IO('T', 0xa1) +#define SNDRV_TIMER_IOCTL_CONTINUE	_IO('T', 0xa2) +#define SNDRV_TIMER_IOCTL_PAUSE		_IO('T', 0xa3)  struct snd_timer_read {  	unsigned int resolution; @@ -847,33 +836,31 @@ struct snd_ctl_tlv {          unsigned int tlv[0];	/* first TLV */  }; -enum { -	SNDRV_CTL_IOCTL_PVERSION = _IOR('U', 0x00, int), -	SNDRV_CTL_IOCTL_CARD_INFO = _IOR('U', 0x01, struct snd_ctl_card_info), -	SNDRV_CTL_IOCTL_ELEM_LIST = _IOWR('U', 0x10, struct snd_ctl_elem_list), -	SNDRV_CTL_IOCTL_ELEM_INFO = _IOWR('U', 0x11, struct snd_ctl_elem_info), -	SNDRV_CTL_IOCTL_ELEM_READ = _IOWR('U', 0x12, struct snd_ctl_elem_value), -	SNDRV_CTL_IOCTL_ELEM_WRITE = _IOWR('U', 0x13, struct snd_ctl_elem_value), -	SNDRV_CTL_IOCTL_ELEM_LOCK = _IOW('U', 0x14, struct snd_ctl_elem_id), -	SNDRV_CTL_IOCTL_ELEM_UNLOCK = _IOW('U', 0x15, struct snd_ctl_elem_id), -	SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS = _IOWR('U', 0x16, int), -	SNDRV_CTL_IOCTL_ELEM_ADD = _IOWR('U', 0x17, struct snd_ctl_elem_info), -	SNDRV_CTL_IOCTL_ELEM_REPLACE = _IOWR('U', 0x18, struct snd_ctl_elem_info), -	SNDRV_CTL_IOCTL_ELEM_REMOVE = _IOWR('U', 0x19, struct snd_ctl_elem_id), -	SNDRV_CTL_IOCTL_TLV_READ = _IOWR('U', 0x1a, struct snd_ctl_tlv), -	SNDRV_CTL_IOCTL_TLV_WRITE = _IOWR('U', 0x1b, struct snd_ctl_tlv), -	SNDRV_CTL_IOCTL_TLV_COMMAND = _IOWR('U', 0x1c, struct snd_ctl_tlv), -	SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE = _IOWR('U', 0x20, int), -	SNDRV_CTL_IOCTL_HWDEP_INFO = _IOR('U', 0x21, struct snd_hwdep_info), -	SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE = _IOR('U', 0x30, int), -	SNDRV_CTL_IOCTL_PCM_INFO = _IOWR('U', 0x31, struct snd_pcm_info), -	SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE = _IOW('U', 0x32, int), -	SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE = _IOWR('U', 0x40, int), -	SNDRV_CTL_IOCTL_RAWMIDI_INFO = _IOWR('U', 0x41, struct snd_rawmidi_info), -	SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE = _IOW('U', 0x42, int), -	SNDRV_CTL_IOCTL_POWER = _IOWR('U', 0xd0, int), -	SNDRV_CTL_IOCTL_POWER_STATE = _IOR('U', 0xd1, int), -}; +#define SNDRV_CTL_IOCTL_PVERSION	_IOR('U', 0x00, int) +#define SNDRV_CTL_IOCTL_CARD_INFO	_IOR('U', 0x01, struct snd_ctl_card_info) +#define SNDRV_CTL_IOCTL_ELEM_LIST	_IOWR('U', 0x10, struct snd_ctl_elem_list) +#define SNDRV_CTL_IOCTL_ELEM_INFO	_IOWR('U', 0x11, struct snd_ctl_elem_info) +#define SNDRV_CTL_IOCTL_ELEM_READ	_IOWR('U', 0x12, struct snd_ctl_elem_value) +#define SNDRV_CTL_IOCTL_ELEM_WRITE	_IOWR('U', 0x13, struct snd_ctl_elem_value) +#define SNDRV_CTL_IOCTL_ELEM_LOCK	_IOW('U', 0x14, struct snd_ctl_elem_id) +#define SNDRV_CTL_IOCTL_ELEM_UNLOCK	_IOW('U', 0x15, struct snd_ctl_elem_id) +#define SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS _IOWR('U', 0x16, int) +#define SNDRV_CTL_IOCTL_ELEM_ADD	_IOWR('U', 0x17, struct snd_ctl_elem_info) +#define SNDRV_CTL_IOCTL_ELEM_REPLACE	_IOWR('U', 0x18, struct snd_ctl_elem_info) +#define SNDRV_CTL_IOCTL_ELEM_REMOVE	_IOWR('U', 0x19, struct snd_ctl_elem_id) +#define SNDRV_CTL_IOCTL_TLV_READ	_IOWR('U', 0x1a, struct snd_ctl_tlv) +#define SNDRV_CTL_IOCTL_TLV_WRITE	_IOWR('U', 0x1b, struct snd_ctl_tlv) +#define SNDRV_CTL_IOCTL_TLV_COMMAND	_IOWR('U', 0x1c, struct snd_ctl_tlv) +#define SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE _IOWR('U', 0x20, int) +#define SNDRV_CTL_IOCTL_HWDEP_INFO	_IOR('U', 0x21, struct snd_hwdep_info) +#define SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE	_IOR('U', 0x30, int) +#define SNDRV_CTL_IOCTL_PCM_INFO	_IOWR('U', 0x31, struct snd_pcm_info) +#define SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE _IOW('U', 0x32, int) +#define SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE _IOWR('U', 0x40, int) +#define SNDRV_CTL_IOCTL_RAWMIDI_INFO	_IOWR('U', 0x41, struct snd_rawmidi_info) +#define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int) +#define SNDRV_CTL_IOCTL_POWER		_IOWR('U', 0xd0, int) +#define SNDRV_CTL_IOCTL_POWER_STATE	_IOR('U', 0xd1, int)  /*   *  Read interface. @@ -919,18 +906,4 @@ struct snd_ctl_event {  #define SNDRV_CTL_NAME_IEC958_PCM_STREAM		"PCM Stream"  #define SNDRV_CTL_NAME_IEC958(expl,direction,what)	"IEC958 " expl SNDRV_CTL_NAME_##direction SNDRV_CTL_NAME_IEC958_##what -/* - * - */ - -struct snd_xferv { -	const struct iovec *vector; -	unsigned long count; -}; - -enum { -	SNDRV_IOCTL_READV = _IOW('K', 0x00, struct snd_xferv), -	SNDRV_IOCTL_WRITEV = _IOW('K', 0x01, struct snd_xferv), -}; -  #endif /* __SOUND_ASOUND_H */ diff --git a/include/sound/control.h b/include/sound/control.h index 4721b4bba05..ef96f07aa03 100644 --- a/include/sound/control.h +++ b/include/sound/control.h @@ -171,6 +171,54 @@ int snd_ctl_boolean_stereo_info(struct snd_kcontrol *kcontrol,   */  struct snd_kcontrol *snd_ctl_make_virtual_master(char *name,  						 const unsigned int *tlv); -int snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave); -		       +int _snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave, +		       unsigned int flags); +/* optional flags for slave */ +#define SND_CTL_SLAVE_NEED_UPDATE	(1 << 0) + +/** + * snd_ctl_add_slave - Add a virtual slave control + * @master: vmaster element + * @slave: slave element to add + * + * Add a virtual slave control to the given master element created via + * snd_ctl_create_virtual_master() beforehand. + * Returns zero if successful or a negative error code. + * + * All slaves must be the same type (returning the same information + * via info callback).  The fucntion doesn't check it, so it's your + * responsibility. + * + * Also, some additional limitations: + * at most two channels, + * logarithmic volume control (dB level) thus no linear volume, + * master can only attenuate the volume without gain + */ +static inline int +snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave) +{ +	return _snd_ctl_add_slave(master, slave, 0); +} + +/** + * snd_ctl_add_slave_uncached - Add a virtual slave control + * @master: vmaster element + * @slave: slave element to add + * + * Add a virtual slave control to the given master. + * Unlike snd_ctl_add_slave(), the element added via this function + * is supposed to have volatile values, and get callback is called + * at each time quried from the master. + * + * When the control peeks the hardware values directly and the value + * can be changed by other means than the put callback of the element, + * this function should be used to keep the value always up-to-date. + */ +static inline int +snd_ctl_add_slave_uncached(struct snd_kcontrol *master, +			   struct snd_kcontrol *slave) +{ +	return _snd_ctl_add_slave(master, slave, SND_CTL_SLAVE_NEED_UPDATE); +} +  #endif	/* __SOUND_CONTROL_H */ diff --git a/include/sound/core.h b/include/sound/core.h index f632484bc74..3dea79829ac 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -97,9 +97,9 @@ struct snd_device {  struct snd_monitor_file {  	struct file *file; -	struct snd_monitor_file *next;  	const struct file_operations *disconnected_f_op; -	struct list_head shutdown_list; +	struct list_head shutdown_list;	/* still need to shutdown */ +	struct list_head list;	/* link of monitor files */  };  /* main structure for soundcard */ @@ -134,7 +134,7 @@ struct snd_card {  	struct snd_info_entry *proc_id;	/* the card id */  	struct proc_dir_entry *proc_root_link;	/* number link to real id */ -	struct snd_monitor_file *files; /* all files associated to this card */ +	struct list_head files_list;	/* all files associated to this card */  	struct snd_shutdown_f_ops *s_f_ops; /* file operations in the shutdown  								state */  	spinlock_t files_lock;		/* lock the files for this card */ @@ -296,8 +296,20 @@ int snd_card_locked(int card);  extern int (*snd_mixer_oss_notify_callback)(struct snd_card *card, int cmd);  #endif +int snd_card_create(int idx, const char *id, +		    struct module *module, int extra_size, +		    struct snd_card **card_ret); + +static inline __deprecated  struct snd_card *snd_card_new(int idx, const char *id, -			 struct module *module, int extra_size); +			      struct module *module, int extra_size) +{ +	struct snd_card *card; +	if (snd_card_create(idx, id, module, extra_size, &card) < 0) +		return NULL; +	return card; +} +  int snd_card_disconnect(struct snd_card *card);  int snd_card_free(struct snd_card *card);  int snd_card_free_when_closed(struct snd_card *card); @@ -446,21 +458,33 @@ static inline int __snd_bug_on(int cond)  struct snd_pci_quirk {  	unsigned short subvendor;	/* PCI subvendor ID */  	unsigned short subdevice;	/* PCI subdevice ID */ +	unsigned short subdevice_mask;	/* bitmask to match */  	int value;			/* value */  #ifdef CONFIG_SND_DEBUG_VERBOSE  	const char *name;		/* name of the device (optional) */  #endif  }; -#define _SND_PCI_QUIRK_ID(vend,dev) \ -	.subvendor = (vend), .subdevice = (dev) +#define _SND_PCI_QUIRK_ID_MASK(vend, mask, dev)	\ +	.subvendor = (vend), .subdevice = (dev), .subdevice_mask = (mask) +#define _SND_PCI_QUIRK_ID(vend, dev) \ +	_SND_PCI_QUIRK_ID_MASK(vend, 0xffff, dev)  #define SND_PCI_QUIRK_ID(vend,dev) {_SND_PCI_QUIRK_ID(vend, dev)}  #ifdef CONFIG_SND_DEBUG_VERBOSE  #define SND_PCI_QUIRK(vend,dev,xname,val) \  	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val), .name = (xname)} +#define SND_PCI_QUIRK_VENDOR(vend, xname, val)			\ +	{_SND_PCI_QUIRK_ID_MASK(vend, 0, 0), .value = (val), .name = (xname)} +#define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val)			\ +	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev),			\ +			.value = (val), .name = (xname)}  #else  #define SND_PCI_QUIRK(vend,dev,xname,val) \  	{_SND_PCI_QUIRK_ID(vend, dev), .value = (val)} +#define SND_PCI_QUIRK_MASK(vend, mask, dev, xname, val)			\ +	{_SND_PCI_QUIRK_ID_MASK(vend, mask, dev), .value = (val)} +#define SND_PCI_QUIRK_VENDOR(vend, xname, val)			\ +	{_SND_PCI_QUIRK_ID_MASK(vend, 0, 0), .value = (val)}  #endif  const struct snd_pci_quirk * diff --git a/include/sound/hwdep.h b/include/sound/hwdep.h index d9eea013c75..8c05e47a409 100644 --- a/include/sound/hwdep.h +++ b/include/sound/hwdep.h @@ -27,18 +27,28 @@  struct snd_hwdep; +/* hwdep file ops; all ops can be NULL */  struct snd_hwdep_ops { -	long long (*llseek) (struct snd_hwdep *hw, struct file * file, long long offset, int orig); -	long (*read) (struct snd_hwdep *hw, char __user *buf, long count, loff_t *offset); -	long (*write) (struct snd_hwdep *hw, const char __user *buf, long count, loff_t *offset); -	int (*open) (struct snd_hwdep * hw, struct file * file); -	int (*release) (struct snd_hwdep *hw, struct file * file); -	unsigned int (*poll) (struct snd_hwdep *hw, struct file * file, poll_table * wait); -	int (*ioctl) (struct snd_hwdep *hw, struct file * file, unsigned int cmd, unsigned long arg); -	int (*ioctl_compat) (struct snd_hwdep *hw, struct file * file, unsigned int cmd, unsigned long arg); -	int (*mmap) (struct snd_hwdep *hw, struct file * file, struct vm_area_struct * vma); -	int (*dsp_status) (struct snd_hwdep *hw, struct snd_hwdep_dsp_status *status); -	int (*dsp_load) (struct snd_hwdep *hw, struct snd_hwdep_dsp_image *image); +	long long (*llseek)(struct snd_hwdep *hw, struct file *file, +			    long long offset, int orig); +	long (*read)(struct snd_hwdep *hw, char __user *buf, +		     long count, loff_t *offset); +	long (*write)(struct snd_hwdep *hw, const char __user *buf, +		      long count, loff_t *offset); +	int (*open)(struct snd_hwdep *hw, struct file * file); +	int (*release)(struct snd_hwdep *hw, struct file * file); +	unsigned int (*poll)(struct snd_hwdep *hw, struct file *file, +			     poll_table *wait); +	int (*ioctl)(struct snd_hwdep *hw, struct file *file, +		     unsigned int cmd, unsigned long arg); +	int (*ioctl_compat)(struct snd_hwdep *hw, struct file *file, +			    unsigned int cmd, unsigned long arg); +	int (*mmap)(struct snd_hwdep *hw, struct file *file, +		    struct vm_area_struct *vma); +	int (*dsp_status)(struct snd_hwdep *hw, +			  struct snd_hwdep_dsp_status *status); +	int (*dsp_load)(struct snd_hwdep *hw, +			struct snd_hwdep_dsp_image *image);  };  struct snd_hwdep { @@ -61,9 +71,9 @@ struct snd_hwdep {  	void (*private_free) (struct snd_hwdep *hwdep);  	struct mutex open_mutex; -	int used; -	unsigned int dsp_loaded; -	unsigned int exclusive: 1; +	int used;			/* reference counter */ +	unsigned int dsp_loaded;	/* bit fields of loaded dsp indices */ +	unsigned int exclusive:1;	/* exclusive access mode */  };  extern int snd_hwdep_new(struct snd_card *card, char *id, int device, diff --git a/include/sound/jack.h b/include/sound/jack.h index 2e0315cdd0d..6b013c6f6a0 100644 --- a/include/sound/jack.h +++ b/include/sound/jack.h @@ -30,6 +30,9 @@ struct input_dev;  /**   * Jack types which can be reported.  These values are used as a   * bitmask. + * + * Note that this must be kept in sync with the lookup table in + * sound/core/jack.c.   */  enum snd_jack_types {  	SND_JACK_HEADPHONE	= 0x0001, @@ -37,6 +40,8 @@ enum snd_jack_types {  	SND_JACK_HEADSET	= SND_JACK_HEADPHONE | SND_JACK_MICROPHONE,  	SND_JACK_LINEOUT	= 0x0004,  	SND_JACK_MECHANICAL	= 0x0008, /* If detected separately */ +	SND_JACK_VIDEOOUT	= 0x0010, +	SND_JACK_AVOUT		= SND_JACK_LINEOUT | SND_JACK_VIDEOOUT,  };  struct snd_jack { diff --git a/include/sound/rawmidi.h b/include/sound/rawmidi.h index b550a416d07..c23c2658570 100644 --- a/include/sound/rawmidi.h +++ b/include/sound/rawmidi.h @@ -42,7 +42,6 @@  #define SNDRV_RAWMIDI_LFLG_INPUT	(1<<1)  #define SNDRV_RAWMIDI_LFLG_OPEN		(3<<0)  #define SNDRV_RAWMIDI_LFLG_APPEND	(1<<2) -#define	SNDRV_RAWMIDI_LFLG_NOOPENLOCK	(1<<3)  struct snd_rawmidi;  struct snd_rawmidi_substream; diff --git a/include/sound/sfnt_info.h b/include/sound/sfnt_info.h index 5d1ab9c4950..1bce7fd1725 100644 --- a/include/sound/sfnt_info.h +++ b/include/sound/sfnt_info.h @@ -202,13 +202,11 @@ struct snd_emux_misc_mode {  	int value2;	/* reserved */  }; -enum { -	SNDRV_EMUX_IOCTL_VERSION = _IOR('H', 0x80, unsigned int), -	SNDRV_EMUX_IOCTL_LOAD_PATCH = _IOWR('H', 0x81, struct soundfont_patch_info), -	SNDRV_EMUX_IOCTL_RESET_SAMPLES = _IO('H', 0x82), -	SNDRV_EMUX_IOCTL_REMOVE_LAST_SAMPLES = _IO('H', 0x83), -	SNDRV_EMUX_IOCTL_MEM_AVAIL = _IOW('H', 0x84, int), -	SNDRV_EMUX_IOCTL_MISC_MODE = _IOWR('H', 0x84, struct snd_emux_misc_mode), -}; +#define SNDRV_EMUX_IOCTL_VERSION	_IOR('H', 0x80, unsigned int) +#define SNDRV_EMUX_IOCTL_LOAD_PATCH	_IOWR('H', 0x81, struct soundfont_patch_info) +#define SNDRV_EMUX_IOCTL_RESET_SAMPLES	_IO('H', 0x82) +#define SNDRV_EMUX_IOCTL_REMOVE_LAST_SAMPLES _IO('H', 0x83) +#define SNDRV_EMUX_IOCTL_MEM_AVAIL	_IOW('H', 0x84, int) +#define SNDRV_EMUX_IOCTL_MISC_MODE	_IOWR('H', 0x84, struct snd_emux_misc_mode)  #endif /* __SOUND_SFNT_INFO_H */ diff --git a/init/Kconfig b/init/Kconfig index f068071fcc5..6a5c5fed66c 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -675,6 +675,9 @@ config CC_OPTIMIZE_FOR_SIZE  config SYSCTL  	bool +config ANON_INODES +	bool +  menuconfig EMBEDDED  	bool "Configure standard kernel features (for small systems)"  	help @@ -780,18 +783,6 @@ config PCSPKR_PLATFORM            This option allows to disable the internal PC-Speaker            support, saving some memory. -config COMPAT_BRK -	bool "Disable heap randomization" -	default y -	help -	  Randomizing heap placement makes heap exploits harder, but it -	  also breaks ancient binaries (including anything libc5 based). -	  This option changes the bootup default to heap randomization -	  disabled, and can be overriden runtime by setting -	  /proc/sys/kernel/randomize_va_space to 2. - -	  On non-ancient distros (post-2000 ones) N is usually a safe choice. -  config BASE_FULL  	default y  	bool "Enable full-sized data structures for core" if EMBEDDED @@ -809,9 +800,6 @@ config FUTEX  	  support for "fast userspace mutexes".  The resulting kernel may not  	  run glibc-based applications correctly. -config ANON_INODES -	bool -  config EPOLL  	bool "Enable eventpoll support" if EMBEDDED  	default y @@ -897,6 +885,18 @@ config SLUB_DEBUG  	  SLUB sysfs support. /sys/slab will not exist and there will be  	  no support for cache validation etc. +config COMPAT_BRK +	bool "Disable heap randomization" +	default y +	help +	  Randomizing heap placement makes heap exploits harder, but it +	  also breaks ancient binaries (including anything libc5 based). +	  This option changes the bootup default to heap randomization +	  disabled, and can be overriden runtime by setting +	  /proc/sys/kernel/randomize_va_space to 2. + +	  On non-ancient distros (post-2000 ones) N is usually a safe choice. +  choice  	prompt "Choose SLAB allocator"  	default SLUB diff --git a/init/main.c b/init/main.c index 844209453c0..83697e160b3 100644 --- a/init/main.c +++ b/init/main.c @@ -97,7 +97,7 @@ static inline void mark_rodata_ro(void) { }  extern void tc_init(void);  #endif -enum system_states system_state; +enum system_states system_state __read_mostly;  EXPORT_SYMBOL(system_state);  /* @@ -463,6 +463,7 @@ static noinline void __init_refok rest_init(void)  	 * at least once to get things moving:  	 */  	init_idle_bootup_task(current); +	rcu_scheduler_starting();  	preempt_enable_no_resched();  	schedule();  	preempt_disable(); diff --git a/kernel/fork.c b/kernel/fork.c index a66fbde2071..4854c2c4a82 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1179,10 +1179,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,  #endif  	clear_all_latency_tracing(p); -	/* Our parent execution domain becomes current domain -	   These must match for thread signalling to apply */ -	p->parent_exec_id = p->self_exec_id; -  	/* ok, now we should be set up.. */  	p->exit_signal = (clone_flags & CLONE_THREAD) ? -1 : (clone_flags & CSIGNAL);  	p->pdeath_signal = 0; @@ -1220,10 +1216,13 @@ static struct task_struct *copy_process(unsigned long clone_flags,  		set_task_cpu(p, smp_processor_id());  	/* CLONE_PARENT re-uses the old parent */ -	if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) +	if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) {  		p->real_parent = current->real_parent; -	else +		p->parent_exec_id = current->parent_exec_id; +	} else {  		p->real_parent = current; +		p->parent_exec_id = current->self_exec_id; +	}  	spin_lock(¤t->sighand->siglock); diff --git a/kernel/module.c b/kernel/module.c index ba22484a987..1196f5d1170 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2015,14 +2015,6 @@ static noinline struct module *load_module(void __user *umod,  	if (err < 0)  		goto free_mod; -#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP) -	mod->refptr = percpu_modalloc(sizeof(local_t), __alignof__(local_t), -				      mod->name); -	if (!mod->refptr) { -		err = -ENOMEM; -		goto free_mod; -	} -#endif  	if (pcpuindex) {  		/* We have a special allocation for this section. */  		percpu = percpu_modalloc(sechdrs[pcpuindex].sh_size, @@ -2030,7 +2022,7 @@ static noinline struct module *load_module(void __user *umod,  					 mod->name);  		if (!percpu) {  			err = -ENOMEM; -			goto free_percpu; +			goto free_mod;  		}  		sechdrs[pcpuindex].sh_flags &= ~(unsigned long)SHF_ALLOC;  		mod->percpu = percpu; @@ -2082,6 +2074,14 @@ static noinline struct module *load_module(void __user *umod,  	/* Module has been moved. */  	mod = (void *)sechdrs[modindex].sh_addr; +#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP) +	mod->refptr = percpu_modalloc(sizeof(local_t), __alignof__(local_t), +				      mod->name); +	if (!mod->refptr) { +		err = -ENOMEM; +		goto free_init; +	} +#endif  	/* Now we've moved module, initialize linked lists, etc. */  	module_unload_init(mod); @@ -2288,15 +2288,17 @@ static noinline struct module *load_module(void __user *umod,  	ftrace_release(mod->module_core, mod->core_size);   free_unload:  	module_unload_free(mod); + free_init: +#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP) +	percpu_modfree(mod->refptr); +#endif  	module_free(mod, mod->module_init);   free_core:  	module_free(mod, mod->module_core); +	/* mod will be freed with core. Don't access it beyond this line! */   free_percpu:  	if (percpu)  		percpu_modfree(percpu); -#if defined(CONFIG_MODULE_UNLOAD) && defined(CONFIG_SMP) -	percpu_modfree(mod->refptr); -#endif   free_mod:  	kfree(args);   free_hdr: diff --git a/kernel/rcuclassic.c b/kernel/rcuclassic.c index bd5a9003497..654c640a6b9 100644 --- a/kernel/rcuclassic.c +++ b/kernel/rcuclassic.c @@ -679,8 +679,8 @@ int rcu_needs_cpu(int cpu)  void rcu_check_callbacks(int cpu, int user)  {  	if (user || -	    (idle_cpu(cpu) && !in_softirq() && -				hardirq_count() <= (1 << HARDIRQ_SHIFT))) { +	    (idle_cpu(cpu) && rcu_scheduler_active && +	     !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT))) {  		/*  		 * Get here if this CPU took its interrupt from user diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index d92a76a881a..cae8a059cf4 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c @@ -44,6 +44,7 @@  #include <linux/cpu.h>  #include <linux/mutex.h>  #include <linux/module.h> +#include <linux/kernel_stat.h>  enum rcu_barrier {  	RCU_BARRIER_STD, @@ -55,6 +56,7 @@ static DEFINE_PER_CPU(struct rcu_head, rcu_barrier_head) = {NULL};  static atomic_t rcu_barrier_cpu_count;  static DEFINE_MUTEX(rcu_barrier_mutex);  static struct completion rcu_barrier_completion; +int rcu_scheduler_active __read_mostly;  /*   * Awaken the corresponding synchronize_rcu() instance now that a @@ -80,6 +82,10 @@ void wakeme_after_rcu(struct rcu_head  *head)  void synchronize_rcu(void)  {  	struct rcu_synchronize rcu; + +	if (rcu_blocking_is_gp()) +		return; +  	init_completion(&rcu.completion);  	/* Will wake me after RCU finished. */  	call_rcu(&rcu.head, wakeme_after_rcu); @@ -175,3 +181,9 @@ void __init rcu_init(void)  	__rcu_init();  } +void rcu_scheduler_starting(void) +{ +	WARN_ON(num_online_cpus() != 1); +	WARN_ON(nr_context_switches() > 0); +	rcu_scheduler_active = 1; +} diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c index 33cfc50781f..5d59e850fb7 100644 --- a/kernel/rcupreempt.c +++ b/kernel/rcupreempt.c @@ -1181,6 +1181,9 @@ void __synchronize_sched(void)  {  	struct rcu_synchronize rcu; +	if (num_online_cpus() == 1) +		return;  /* blocking is gp if only one CPU! */ +  	init_completion(&rcu.completion);  	/* Will wake me after RCU finished. */  	call_rcu_sched(&rcu.head, wakeme_after_rcu); diff --git a/kernel/rcutree.c b/kernel/rcutree.c index b2fd602a6f6..97ce31579ec 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c @@ -948,8 +948,8 @@ static void rcu_do_batch(struct rcu_data *rdp)  void rcu_check_callbacks(int cpu, int user)  {  	if (user || -	    (idle_cpu(cpu) && !in_softirq() && -				hardirq_count() <= (1 << HARDIRQ_SHIFT))) { +	    (idle_cpu(cpu) && rcu_scheduler_active && +	     !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT))) {  		/*  		 * Get here if this CPU took its interrupt from user diff --git a/kernel/sched.c b/kernel/sched.c index 410eec40413..8e2558c2ba6 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -223,7 +223,7 @@ static void start_rt_bandwidth(struct rt_bandwidth *rt_b)  {  	ktime_t now; -	if (rt_bandwidth_enabled() && rt_b->rt_runtime == RUNTIME_INF) +	if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF)  		return;  	if (hrtimer_active(&rt_b->rt_period_timer)) @@ -9224,6 +9224,16 @@ static int sched_rt_global_constraints(void)  	return ret;  } + +int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk) +{ +	/* Don't accept realtime tasks when there is no way for them to run */ +	if (rt_task(tsk) && tg->rt_bandwidth.rt_runtime == 0) +		return 0; + +	return 1; +} +  #else /* !CONFIG_RT_GROUP_SCHED */  static int sched_rt_global_constraints(void)  { @@ -9317,8 +9327,7 @@ cpu_cgroup_can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,  		      struct task_struct *tsk)  {  #ifdef CONFIG_RT_GROUP_SCHED -	/* Don't accept realtime tasks when there is no way for them to run */ -	if (rt_task(tsk) && cgroup_tg(cgrp)->rt_bandwidth.rt_runtime == 0) +	if (!sched_rt_can_attach(cgroup_tg(cgrp), tsk))  		return -EINVAL;  #else  	/* We don't support RT-tasks being in separate groups */ diff --git a/kernel/signal.c b/kernel/signal.c index 2a74fe87c0d..1c8814481a1 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1575,7 +1575,15 @@ static void ptrace_stop(int exit_code, int clear_code, siginfo_t *info)  	read_lock(&tasklist_lock);  	if (may_ptrace_stop()) {  		do_notify_parent_cldstop(current, CLD_TRAPPED); +		/* +		 * Don't want to allow preemption here, because +		 * sys_ptrace() needs this task to be inactive. +		 * +		 * XXX: implement read_unlock_no_resched(). +		 */ +		preempt_disable();  		read_unlock(&tasklist_lock); +		preempt_enable_no_resched();  		schedule();  	} else {  		/* diff --git a/kernel/softirq.c b/kernel/softirq.c index bdbe9de9cd8..9041ea7948f 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -626,6 +626,7 @@ static int ksoftirqd(void * __bind_cpu)  			preempt_enable_no_resched();  			cond_resched();  			preempt_disable(); +			rcu_qsctr_inc((long)__bind_cpu);  		}  		preempt_enable();  		set_current_state(TASK_INTERRUPTIBLE); diff --git a/kernel/sys.c b/kernel/sys.c index f145c415bc1..37f458e6882 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -559,7 +559,7 @@ error:  	abort_creds(new);  	return retval;  } -   +  /*   * change the user struct in a credentials set to match the new UID   */ @@ -571,6 +571,11 @@ static int set_user(struct cred *new)  	if (!new_user)  		return -EAGAIN; +	if (!task_can_switch_user(new_user, current)) { +		free_uid(new_user); +		return -EINVAL; +	} +  	if (atomic_read(&new_user->processes) >=  				current->signal->rlim[RLIMIT_NPROC].rlim_cur &&  			new_user != INIT_USER) { @@ -631,10 +636,11 @@ SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid)  			goto error;  	} -	retval = -EAGAIN; -	if (new->uid != old->uid && set_user(new) < 0) -		goto error; - +	if (new->uid != old->uid) { +		retval = set_user(new); +		if (retval < 0) +			goto error; +	}  	if (ruid != (uid_t) -1 ||  	    (euid != (uid_t) -1 && euid != old->uid))  		new->suid = new->euid; @@ -680,9 +686,10 @@ SYSCALL_DEFINE1(setuid, uid_t, uid)  	retval = -EPERM;  	if (capable(CAP_SETUID)) {  		new->suid = new->uid = uid; -		if (uid != old->uid && set_user(new) < 0) { -			retval = -EAGAIN; -			goto error; +		if (uid != old->uid) { +			retval = set_user(new); +			if (retval < 0) +				goto error;  		}  	} else if (uid != old->uid && uid != new->suid) {  		goto error; @@ -734,11 +741,13 @@ SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)  			goto error;  	} -	retval = -EAGAIN;  	if (ruid != (uid_t) -1) {  		new->uid = ruid; -		if (ruid != old->uid && set_user(new) < 0) -			goto error; +		if (ruid != old->uid) { +			retval = set_user(new); +			if (retval < 0) +				goto error; +		}  	}  	if (euid != (uid_t) -1)  		new->euid = euid; diff --git a/kernel/tsacct.c b/kernel/tsacct.c index 43f891b05a4..00d59d048ed 100644 --- a/kernel/tsacct.c +++ b/kernel/tsacct.c @@ -122,8 +122,10 @@ void acct_update_integrals(struct task_struct *tsk)  	if (likely(tsk->mm)) {  		cputime_t time, dtime;  		struct timeval value; +		unsigned long flags;  		u64 delta; +		local_irq_save(flags);  		time = tsk->stime + tsk->utime;  		dtime = cputime_sub(time, tsk->acct_timexpd);  		jiffies_to_timeval(cputime_to_jiffies(dtime), &value); @@ -131,10 +133,12 @@ void acct_update_integrals(struct task_struct *tsk)  		delta = delta * USEC_PER_SEC + value.tv_usec;  		if (delta == 0) -			return; +			goto out;  		tsk->acct_timexpd = time;  		tsk->acct_rss_mem1 += delta * get_mm_rss(tsk->mm);  		tsk->acct_vm_mem1 += delta * tsk->mm->total_vm; +	out: +		local_irq_restore(flags);  	}  } diff --git a/kernel/user.c b/kernel/user.c index 3551ac74239..fbb300e6191 100644 --- a/kernel/user.c +++ b/kernel/user.c @@ -286,14 +286,12 @@ int __init uids_sysfs_init(void)  /* work function to remove sysfs directory for a user and free up   * corresponding structures.   */ -static void remove_user_sysfs_dir(struct work_struct *w) +static void cleanup_user_struct(struct work_struct *w)  {  	struct user_struct *up = container_of(w, struct user_struct, work);  	unsigned long flags;  	int remove_user = 0; -	if (up->user_ns != &init_user_ns) -		return;  	/* Make uid_hash_remove() + sysfs_remove_file() + kobject_del()  	 * atomic.  	 */ @@ -312,9 +310,11 @@ static void remove_user_sysfs_dir(struct work_struct *w)  	if (!remove_user)  		goto done; -	kobject_uevent(&up->kobj, KOBJ_REMOVE); -	kobject_del(&up->kobj); -	kobject_put(&up->kobj); +	if (up->user_ns == &init_user_ns) { +		kobject_uevent(&up->kobj, KOBJ_REMOVE); +		kobject_del(&up->kobj); +		kobject_put(&up->kobj); +	}  	sched_destroy_user(up);  	key_put(up->uid_keyring); @@ -335,7 +335,7 @@ static void free_user(struct user_struct *up, unsigned long flags)  	atomic_inc(&up->__count);  	spin_unlock_irqrestore(&uidhash_lock, flags); -	INIT_WORK(&up->work, remove_user_sysfs_dir); +	INIT_WORK(&up->work, cleanup_user_struct);  	schedule_work(&up->work);  } @@ -362,6 +362,24 @@ static void free_user(struct user_struct *up, unsigned long flags)  #endif +#if defined(CONFIG_RT_GROUP_SCHED) && defined(CONFIG_USER_SCHED) +/* + * We need to check if a setuid can take place. This function should be called + * before successfully completing the setuid. + */ +int task_can_switch_user(struct user_struct *up, struct task_struct *tsk) +{ + +	return sched_rt_can_attach(up->tg, tsk); + +} +#else +int task_can_switch_user(struct user_struct *up, struct task_struct *tsk) +{ +	return 1; +} +#endif +  /*   * Locate the user_struct for the passed UID.  If found, take a ref on it.  The   * caller must undo that ref with free_uid(). diff --git a/lib/bitmap.c b/lib/bitmap.c index 1338469ac84..35a1f7ff414 100644 --- a/lib/bitmap.c +++ b/lib/bitmap.c @@ -948,15 +948,15 @@ done:   */  int bitmap_find_free_region(unsigned long *bitmap, int bits, int order)  { -	int pos;		/* scans bitmap by regions of size order */ +	int pos, end;		/* scans bitmap by regions of size order */ -	for (pos = 0; pos < bits; pos += (1 << order)) -		if (__reg_op(bitmap, pos, order, REG_OP_ISFREE)) -			break; -	if (pos == bits) -		return -ENOMEM; -	__reg_op(bitmap, pos, order, REG_OP_ALLOC); -	return pos; +	for (pos = 0 ; (end = pos + (1 << order)) <= bits; pos = end) { +		if (!__reg_op(bitmap, pos, order, REG_OP_ISFREE)) +			continue; +		__reg_op(bitmap, pos, order, REG_OP_ALLOC); +		return pos; +	} +	return -ENOMEM;  }  EXPORT_SYMBOL(bitmap_find_free_region); diff --git a/lib/idr.c b/lib/idr.c index c11c5765cde..dab4bca86f5 100644 --- a/lib/idr.c +++ b/lib/idr.c @@ -449,6 +449,7 @@ void idr_remove_all(struct idr *idp)  	n = idp->layers * IDR_BITS;  	p = idp->top; +	rcu_assign_pointer(idp->top, NULL);  	max = 1 << n;  	id = 0; @@ -467,7 +468,6 @@ void idr_remove_all(struct idr *idp)  			p = *--paa;  		}  	} -	rcu_assign_pointer(idp->top, NULL);  	idp->layers = 0;  }  EXPORT_SYMBOL(idr_remove_all); diff --git a/mm/vmscan.c b/mm/vmscan.c index 6177e3bcd66..56ddf41149e 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1262,7 +1262,6 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone,  	 * Move the pages to the [file or anon] inactive list.  	 */  	pagevec_init(&pvec, 1); -	pgmoved = 0;  	lru = LRU_BASE + file * LRU_FILE;  	spin_lock_irq(&zone->lru_lock); @@ -1274,6 +1273,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone,  	 */  	reclaim_stat->recent_rotated[!!file] += pgmoved; +	pgmoved = 0;  	while (!list_empty(&l_inactive)) {  		page = lru_to_page(&l_inactive);  		prefetchw_prev_lru_page(page, &l_inactive, flags); @@ -1469,7 +1469,7 @@ static void shrink_zone(int priority, struct zone *zone,  		int file = is_file_lru(l);  		int scan; -		scan = zone_page_state(zone, NR_LRU_BASE + l); +		scan = zone_nr_pages(zone, sc, l);  		if (priority) {  			scan >>= priority;  			scan = (scan * percent[file]) / 100; diff --git a/net/802/tr.c b/net/802/tr.c index 158150fee46..f47ae289d83 100644 --- a/net/802/tr.c +++ b/net/802/tr.c @@ -668,3 +668,5 @@ module_init(rif_init);  EXPORT_SYMBOL(tr_type_trans);  EXPORT_SYMBOL(alloc_trdev); + +MODULE_LICENSE("GPL"); diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 4a19acd3a32..1b34135cf99 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c @@ -553,7 +553,7 @@ static int vlan_dev_neigh_setup(struct net_device *dev, struct neigh_parms *pa)  	int err = 0;  	if (netif_device_present(real_dev) && ops->ndo_neigh_setup) -		err = ops->ndo_neigh_setup(dev, pa); +		err = ops->ndo_neigh_setup(real_dev, pa);  	return err;  } @@ -639,6 +639,7 @@ static int vlan_dev_init(struct net_device *dev)  		dev->hard_header_len = real_dev->hard_header_len + VLAN_HLEN;  		dev->netdev_ops         = &vlan_netdev_ops;  	} +	netdev_resync_ops(dev);  	if (is_vlan_dev(real_dev))  		subclass = 1; diff --git a/net/core/dev.c b/net/core/dev.c index 72b0d26fd46..e3fe5c70560 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2267,12 +2267,6 @@ int netif_receive_skb(struct sk_buff *skb)  	rcu_read_lock(); -	/* Don't receive packets in an exiting network namespace */ -	if (!net_alive(dev_net(skb->dev))) { -		kfree_skb(skb); -		goto out; -	} -  #ifdef CONFIG_NET_CLS_ACT  	if (skb->tc_verd & TC_NCLS) {  		skb->tc_verd = CLR_TC_NCLS(skb->tc_verd); @@ -2594,9 +2588,9 @@ static int process_backlog(struct napi_struct *napi, int quota)  		local_irq_disable();  		skb = __skb_dequeue(&queue->input_pkt_queue);  		if (!skb) { -			__napi_complete(napi);  			local_irq_enable(); -			break; +			napi_complete(napi); +			goto out;  		}  		local_irq_enable(); @@ -2605,6 +2599,7 @@ static int process_backlog(struct napi_struct *napi, int quota)  	napi_gro_flush(napi); +out:  	return work;  } @@ -2677,7 +2672,7 @@ void netif_napi_del(struct napi_struct *napi)  	struct sk_buff *skb, *next;  	list_del_init(&napi->dev_list); -	kfree(napi->skb); +	kfree_skb(napi->skb);  	for (skb = napi->gro_list; skb; skb = next) {  		next = skb->next; @@ -4288,6 +4283,39 @@ unsigned long netdev_fix_features(unsigned long features, const char *name)  }  EXPORT_SYMBOL(netdev_fix_features); +/* Some devices need to (re-)set their netdev_ops inside + * ->init() or similar.  If that happens, we have to setup + * the compat pointers again. + */ +void netdev_resync_ops(struct net_device *dev) +{ +#ifdef CONFIG_COMPAT_NET_DEV_OPS +	const struct net_device_ops *ops = dev->netdev_ops; + +	dev->init = ops->ndo_init; +	dev->uninit = ops->ndo_uninit; +	dev->open = ops->ndo_open; +	dev->change_rx_flags = ops->ndo_change_rx_flags; +	dev->set_rx_mode = ops->ndo_set_rx_mode; +	dev->set_multicast_list = ops->ndo_set_multicast_list; +	dev->set_mac_address = ops->ndo_set_mac_address; +	dev->validate_addr = ops->ndo_validate_addr; +	dev->do_ioctl = ops->ndo_do_ioctl; +	dev->set_config = ops->ndo_set_config; +	dev->change_mtu = ops->ndo_change_mtu; +	dev->neigh_setup = ops->ndo_neigh_setup; +	dev->tx_timeout = ops->ndo_tx_timeout; +	dev->get_stats = ops->ndo_get_stats; +	dev->vlan_rx_register = ops->ndo_vlan_rx_register; +	dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid; +	dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid; +#ifdef CONFIG_NET_POLL_CONTROLLER +	dev->poll_controller = ops->ndo_poll_controller; +#endif +#endif +} +EXPORT_SYMBOL(netdev_resync_ops); +  /**   *	register_netdevice	- register a network device   *	@dev: device to register @@ -4332,27 +4360,7 @@ int register_netdevice(struct net_device *dev)  	 * This is temporary until all network devices are converted.  	 */  	if (dev->netdev_ops) { -		const struct net_device_ops *ops = dev->netdev_ops; - -		dev->init = ops->ndo_init; -		dev->uninit = ops->ndo_uninit; -		dev->open = ops->ndo_open; -		dev->change_rx_flags = ops->ndo_change_rx_flags; -		dev->set_rx_mode = ops->ndo_set_rx_mode; -		dev->set_multicast_list = ops->ndo_set_multicast_list; -		dev->set_mac_address = ops->ndo_set_mac_address; -		dev->validate_addr = ops->ndo_validate_addr; -		dev->do_ioctl = ops->ndo_do_ioctl; -		dev->set_config = ops->ndo_set_config; -		dev->change_mtu = ops->ndo_change_mtu; -		dev->tx_timeout = ops->ndo_tx_timeout; -		dev->get_stats = ops->ndo_get_stats; -		dev->vlan_rx_register = ops->ndo_vlan_rx_register; -		dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid; -		dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid; -#ifdef CONFIG_NET_POLL_CONTROLLER -		dev->poll_controller = ops->ndo_poll_controller; -#endif +		netdev_resync_ops(dev);  	} else {  		char drivername[64];  		pr_info("%s (%s): not using net_device_ops yet\n", diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 6ac29a46e23..484f58750eb 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c @@ -77,7 +77,9 @@ static ssize_t netdev_store(struct device *dev, struct device_attribute *attr,  	if (endp == buf)  		goto err; -	rtnl_lock(); +	if (!rtnl_trylock()) +		return -ERESTARTSYS; +  	if (dev_isalive(net)) {  		if ((ret = (*set)(net, new)) == 0)  			ret = len; diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 2adb1a7d361..e3bebd36f05 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -157,9 +157,6 @@ static void cleanup_net(struct work_struct *work)  	struct pernet_operations *ops;  	struct net *net; -	/* Be very certain incoming network packets will not find us */ -	rcu_barrier(); -  	net = container_of(work, struct net, work);  	mutex_lock(&net_mutex); diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 705b33b184a..fc562d29cc4 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c @@ -1205,7 +1205,7 @@ static struct pernet_operations __net_initdata icmp_sk_ops = {  int __init icmp_init(void)  { -	return register_pernet_device(&icmp_sk_ops); +	return register_pernet_subsys(&icmp_sk_ops);  }  EXPORT_SYMBOL(icmp_err_convert); diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index 6659ac000ee..7985346653b 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c @@ -463,6 +463,7 @@ err:  static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,  			 struct net_device *dev)  { +	struct net *net = container_of(qp->q.net, struct net, ipv4.frags);  	struct iphdr *iph;  	struct sk_buff *fp, *head = qp->q.fragments;  	int len; @@ -548,7 +549,7 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,  	iph = ip_hdr(head);  	iph->frag_off = 0;  	iph->tot_len = htons(len); -	IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_REASMOKS); +	IP_INC_STATS_BH(net, IPSTATS_MIB_REASMOKS);  	qp->q.fragments = NULL;  	return 0; diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 19d7b429a26..cf74c416831 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -2443,7 +2443,7 @@ static struct pernet_operations __net_initdata tcp_sk_ops = {  void __init tcp_v4_init(void)  {  	inet_hashinfo_init(&tcp_hashinfo); -	if (register_pernet_device(&tcp_sk_ops)) +	if (register_pernet_subsys(&tcp_sk_ops))  		panic("Failed to create the TCP control socket.\n");  } diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index f9afb452249..1220e2c7831 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -493,15 +493,17 @@ static void addrconf_forward_change(struct net *net, __s32 newf)  	read_unlock(&dev_base_lock);  } -static void addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old) +static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old)  {  	struct net *net;  	net = (struct net *)table->extra2;  	if (p == &net->ipv6.devconf_dflt->forwarding) -		return; +		return 0; + +	if (!rtnl_trylock()) +		return -ERESTARTSYS; -	rtnl_lock();  	if (p == &net->ipv6.devconf_all->forwarding) {  		__s32 newf = net->ipv6.devconf_all->forwarding;  		net->ipv6.devconf_dflt->forwarding = newf; @@ -512,6 +514,7 @@ static void addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old)  	if (*p)  		rt6_purge_dflt_routers(net); +	return 1;  }  #endif @@ -2608,9 +2611,6 @@ static int addrconf_ifdown(struct net_device *dev, int how)  	ASSERT_RTNL(); -	if ((dev->flags & IFF_LOOPBACK) && how == 1) -		how = 0; -  	rt6_ifdown(net, dev);  	neigh_ifdown(&nd_tbl, dev); @@ -3983,7 +3983,7 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write, struct file * filp,  	ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);  	if (write) -		addrconf_fixup_forwarding(ctl, valp, val); +		ret = addrconf_fixup_forwarding(ctl, valp, val);  	return ret;  } @@ -4019,8 +4019,7 @@ static int addrconf_sysctl_forward_strategy(ctl_table *table,  	}  	*valp = new; -	addrconf_fixup_forwarding(table, valp, val); -	return 1; +	return addrconf_fixup_forwarding(table, valp, val);  }  static struct addrconf_sysctl_table @@ -4446,25 +4445,6 @@ int unregister_inet6addr_notifier(struct notifier_block *nb)  EXPORT_SYMBOL(unregister_inet6addr_notifier); -static void addrconf_net_exit(struct net *net) -{ -	struct net_device *dev; - -	rtnl_lock(); -	/* clean dev list */ -	for_each_netdev(net, dev) { -		if (__in6_dev_get(dev) == NULL) -			continue; -		addrconf_ifdown(dev, 1); -	} -	addrconf_ifdown(net->loopback_dev, 2); -	rtnl_unlock(); -} - -static struct pernet_operations addrconf_net_ops = { -	.exit = addrconf_net_exit, -}; -  /*   *	Init / cleanup code   */ @@ -4506,10 +4486,6 @@ int __init addrconf_init(void)  	if (err)  		goto errlo; -	err = register_pernet_device(&addrconf_net_ops); -	if (err) -		return err; -  	register_netdevice_notifier(&ipv6_dev_notf);  	addrconf_verify(0); @@ -4539,15 +4515,22 @@ errlo:  void addrconf_cleanup(void)  {  	struct inet6_ifaddr *ifa; +	struct net_device *dev;  	int i;  	unregister_netdevice_notifier(&ipv6_dev_notf); -	unregister_pernet_device(&addrconf_net_ops); -  	unregister_pernet_subsys(&addrconf_ops);  	rtnl_lock(); +	/* clean dev list */ +	for_each_netdev(&init_net, dev) { +		if (__in6_dev_get(dev) == NULL) +			continue; +		addrconf_ifdown(dev, 1); +	} +	addrconf_ifdown(init_net.loopback_dev, 2); +  	/*  	 *	Check hash table.  	 */ @@ -4568,6 +4551,4 @@ void addrconf_cleanup(void)  	del_timer(&addr_chk_timer);  	rtnl_unlock(); - -	unregister_pernet_subsys(&addrconf_net_ops);  } diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index c802bc1658a..9c8309ed35c 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -72,6 +72,10 @@ MODULE_LICENSE("GPL");  static struct list_head inetsw6[SOCK_MAX];  static DEFINE_SPINLOCK(inetsw6_lock); +static int disable_ipv6 = 0; +module_param_named(disable, disable_ipv6, int, 0); +MODULE_PARM_DESC(disable, "Disable IPv6 such that it is non-functional"); +  static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk)  {  	const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo); @@ -991,10 +995,21 @@ static int __init inet6_init(void)  {  	struct sk_buff *dummy_skb;  	struct list_head *r; -	int err; +	int err = 0;  	BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb)); +	/* Register the socket-side information for inet6_create.  */ +	for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r) +		INIT_LIST_HEAD(r); + +	if (disable_ipv6) { +		printk(KERN_INFO +		       "IPv6: Loaded, but administratively disabled, " +		       "reboot required to enable\n"); +		goto out; +	} +  	err = proto_register(&tcpv6_prot, 1);  	if (err)  		goto out; @@ -1012,10 +1027,6 @@ static int __init inet6_init(void)  		goto out_unregister_udplite_proto; -	/* Register the socket-side information for inet6_create.  */ -	for(r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r) -		INIT_LIST_HEAD(r); -  	/* We MUST register RAW sockets before we create the ICMP6,  	 * IGMP6, or NDISC control sockets.  	 */ @@ -1181,6 +1192,9 @@ module_init(inet6_init);  static void __exit inet6_exit(void)  { +	if (disable_ipv6) +		return; +  	/* First of all disallow new sockets creation. */  	sock_unregister(PF_INET6);  	/* Disallow any further netlink messages */ diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index ed4d79a9e4a..058a5e4a60c 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c @@ -528,14 +528,14 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff)  		if (!ipv6_ext_hdr(nexthdr)) {  			return -1;  		} -		if (len < (int)sizeof(struct ipv6_opt_hdr)) { -			pr_debug("too short\n"); -			return -1; -		}  		if (nexthdr == NEXTHDR_NONE) {  			pr_debug("next header is none\n");  			return -1;  		} +		if (len < (int)sizeof(struct ipv6_opt_hdr)) { +			pr_debug("too short\n"); +			return -1; +		}  		if (skb_copy_bits(skb, start, &hdr, sizeof(hdr)))  			BUG();  		if (nexthdr == NEXTHDR_AUTH) diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 3c575118fca..e9ac7a12f59 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c @@ -452,6 +452,7 @@ err:  static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,  			  struct net_device *dev)  { +	struct net *net = container_of(fq->q.net, struct net, ipv6.frags);  	struct sk_buff *fp, *head = fq->q.fragments;  	int    payload_len;  	unsigned int nhoff; @@ -551,8 +552,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,  					  head->csum);  	rcu_read_lock(); -	IP6_INC_STATS_BH(dev_net(dev), -			 __in6_dev_get(dev), IPSTATS_MIB_REASMOKS); +	IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMOKS);  	rcu_read_unlock();  	fq->q.fragments = NULL;  	return 1; @@ -566,8 +566,7 @@ out_oom:  		printk(KERN_DEBUG "ip6_frag_reasm: no memory for reassembly\n");  out_fail:  	rcu_read_lock(); -	IP6_INC_STATS_BH(dev_net(dev), -			 __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS); +	IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS);  	rcu_read_unlock();  	return -1;  } diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index d3467e563f0..5cee2bcbcec 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c @@ -188,9 +188,9 @@ static struct ip_tunnel * ipip6_tunnel_locate(struct net *net,  	}  	nt = netdev_priv(dev); -	ipip6_tunnel_init(dev);  	nt->parms = *parms; +	ipip6_tunnel_init(dev);  	if (parms->i_flags & SIT_ISATAP)  		dev->priv_flags |= IFF_ISATAP; diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 94de5033f0b..37e3d5ef7e3 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c @@ -752,6 +752,8 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx)  		skb_copy_queue_mapping(frag, first);  		frag->do_not_encrypt = first->do_not_encrypt; +		frag->dev = first->dev; +		frag->iif = first->iif;  		pos += copylen;  		left -= copylen; diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 90ce9ddb945..f4935e344b6 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -726,7 +726,7 @@ nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum,  	NF_CT_ASSERT(skb->nfct);  	ret = l4proto->packet(ct, skb, dataoff, ctinfo, pf, hooknum); -	if (ret < 0) { +	if (ret <= 0) {  		/* Invalid: inverse of the return code tells  		 * the netfilter core what to do */  		pr_debug("nf_conntrack_in: Can't track with proto module\n"); diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index cb78aa00399..ed6d873ad38 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c @@ -1780,6 +1780,7 @@ ctnetlink_create_expect(struct nlattr *cda[], u_int8_t u3, u32 pid, int report)  		goto out;  	} +	exp->class = 0;  	exp->expectfn = NULL;  	exp->flags = 0;  	exp->master = ct; diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index a1edb9c1ade..f3fd154d1dd 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c @@ -859,7 +859,7 @@ static int tcp_packet(struct nf_conn *ct,  			 */  			if (nf_ct_kill(ct))  				return -NF_REPEAT; -			return -NF_DROP; +			return NF_DROP;  		}  		/* Fall through */  	case TCP_CONNTRACK_IGNORE: @@ -892,7 +892,7 @@ static int tcp_packet(struct nf_conn *ct,  				nf_log_packet(pf, 0, skb, NULL, NULL, NULL,  					  "nf_ct_tcp: killing out of sync session ");  			nf_ct_kill(ct); -			return -NF_DROP; +			return NF_DROP;  		}  		ct->proto.tcp.last_index = index;  		ct->proto.tcp.last_dir = dir; diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 9eb895c7a2a..3ae3cb81656 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -1084,6 +1084,13 @@ out:  	return 0;  } +/** + * netlink_set_err - report error to broadcast listeners + * @ssk: the kernel netlink socket, as returned by netlink_kernel_create() + * @pid: the PID of a process that we want to skip (if any) + * @groups: the broadcast group that will notice the error + * @code: error code, must be negative (as usual in kernelspace) + */  void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code)  {  	struct netlink_set_err_data info; @@ -1093,7 +1100,8 @@ void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code)  	info.exclude_sk = ssk;  	info.pid = pid;  	info.group = group; -	info.code = code; +	/* sk->sk_err wants a positive error value */ +	info.code = -code;  	read_lock(&nl_table_lock); diff --git a/net/sched/act_police.c b/net/sched/act_police.c index 5c72a116b1a..f8f047b6124 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c @@ -183,13 +183,6 @@ override:  		if (R_tab == NULL)  			goto failure; -		if (!est && (ret == ACT_P_CREATED || -			     !gen_estimator_active(&police->tcf_bstats, -						   &police->tcf_rate_est))) { -			err = -EINVAL; -			goto failure; -		} -  		if (parm->peakrate.rate) {  			P_tab = qdisc_get_rtab(&parm->peakrate,  					       tb[TCA_POLICE_PEAKRATE]); @@ -205,6 +198,12 @@ override:  					    &police->tcf_lock, est);  		if (err)  			goto failure_unlock; +	} else if (tb[TCA_POLICE_AVRATE] && +		   (ret == ACT_P_CREATED || +		    !gen_estimator_active(&police->tcf_bstats, +					  &police->tcf_rate_est))) { +		err = -EINVAL; +		goto failure_unlock;  	}  	/* No failure allowed after this point */ diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index 4c8d9f45ce0..905fda582b9 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c @@ -111,7 +111,8 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,  		if (sctp_addip_enable) {  			auth_chunks->chunks[0] = SCTP_CID_ASCONF;  			auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK; -			auth_chunks->param_hdr.length += htons(2); +			auth_chunks->param_hdr.length = +					htons(sizeof(sctp_paramhdr_t) + 2);  		}  	} diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index b78e3be6901..c4986d0f741 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -717,15 +717,20 @@ static int sctp_inetaddr_event(struct notifier_block *this, unsigned long ev,  static int sctp_ctl_sock_init(void)  {  	int err; -	sa_family_t family; +	sa_family_t family = PF_INET;  	if (sctp_get_pf_specific(PF_INET6))  		family = PF_INET6; -	else -		family = PF_INET;  	err = inet_ctl_sock_create(&sctp_ctl_sock, family,  				   SOCK_SEQPACKET, IPPROTO_SCTP, &init_net); + +	/* If IPv6 socket could not be created, try the IPv4 socket */ +	if (err < 0 && family == PF_INET6) +		err = inet_ctl_sock_create(&sctp_ctl_sock, AF_INET, +					   SOCK_SEQPACKET, IPPROTO_SCTP, +					   &init_net); +  	if (err < 0) {  		printk(KERN_ERR  		       "SCTP: Failed to create the SCTP control socket.\n"); @@ -1322,9 +1327,8 @@ SCTP_STATIC __init int sctp_init(void)  out:  	return status;  err_v6_add_protocol: -	sctp_v6_del_protocol(); -err_add_protocol:  	sctp_v4_del_protocol(); +err_add_protocol:  	inet_ctl_sock_destroy(sctp_ctl_sock);  err_ctl_sock_init:  	sctp_v6_protosw_exit(); @@ -1335,7 +1339,6 @@ err_protosw_init:  	sctp_v4_pf_exit();  	sctp_v6_pf_exit();  	sctp_sysctl_unregister(); -	list_del(&sctp_af_inet.list);  	free_pages((unsigned long)sctp_port_hashtable,  		   get_order(sctp_port_hashsize *  			     sizeof(struct sctp_bind_hashbucket))); @@ -1383,7 +1386,6 @@ SCTP_STATIC __exit void sctp_exit(void)  	sctp_v4_pf_exit();  	sctp_sysctl_unregister(); -	list_del(&sctp_af_inet.list);  	free_pages((unsigned long)sctp_assoc_hashtable,  		   get_order(sctp_assoc_hashsize * diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index e1d6076b4f5..b5495aecab6 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c @@ -787,36 +787,48 @@ static void sctp_cmd_process_operr(sctp_cmd_seq_t *cmds,  				   struct sctp_association *asoc,  				   struct sctp_chunk *chunk)  { -	struct sctp_operr_chunk *operr_chunk;  	struct sctp_errhdr *err_hdr; +	struct sctp_ulpevent *ev; -	operr_chunk = (struct sctp_operr_chunk *)chunk->chunk_hdr; -	err_hdr = &operr_chunk->err_hdr; +	while (chunk->chunk_end > chunk->skb->data) { +		err_hdr = (struct sctp_errhdr *)(chunk->skb->data); -	switch (err_hdr->cause) { -	case SCTP_ERROR_UNKNOWN_CHUNK: -	{ -		struct sctp_chunkhdr *unk_chunk_hdr; +		ev = sctp_ulpevent_make_remote_error(asoc, chunk, 0, +						     GFP_ATOMIC); +		if (!ev) +			return; -		unk_chunk_hdr = (struct sctp_chunkhdr *)err_hdr->variable; -		switch (unk_chunk_hdr->type) { -		/* ADDIP 4.1 A9) If the peer responds to an ASCONF with an -		 * ERROR chunk reporting that it did not recognized the ASCONF -		 * chunk type, the sender of the ASCONF MUST NOT send any -		 * further ASCONF chunks and MUST stop its T-4 timer. -		 */ -		case SCTP_CID_ASCONF: -			asoc->peer.asconf_capable = 0; -			sctp_add_cmd_sf(cmds, SCTP_CMD_TIMER_STOP, +		sctp_ulpq_tail_event(&asoc->ulpq, ev); + +		switch (err_hdr->cause) { +		case SCTP_ERROR_UNKNOWN_CHUNK: +		{ +			sctp_chunkhdr_t *unk_chunk_hdr; + +			unk_chunk_hdr = (sctp_chunkhdr_t *)err_hdr->variable; +			switch (unk_chunk_hdr->type) { +			/* ADDIP 4.1 A9) If the peer responds to an ASCONF with +			 * an ERROR chunk reporting that it did not recognized +			 * the ASCONF chunk type, the sender of the ASCONF MUST +			 * NOT send any further ASCONF chunks and MUST stop its +			 * T-4 timer. +			 */ +			case SCTP_CID_ASCONF: +				if (asoc->peer.asconf_capable == 0) +					break; + +				asoc->peer.asconf_capable = 0; +				sctp_add_cmd_sf(cmds, SCTP_CMD_TIMER_STOP,  					SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO)); +				break; +			default: +				break; +			}  			break; +		}  		default:  			break;  		} -		break; -	} -	default: -		break;  	}  } diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 3a0cd075914..f88dfded0e3 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c @@ -3163,7 +3163,6 @@ sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep,  					sctp_cmd_seq_t *commands)  {  	struct sctp_chunk *chunk = arg; -	struct sctp_ulpevent *ev;  	if (!sctp_vtag_verify(chunk, asoc))  		return sctp_sf_pdiscard(ep, asoc, type, arg, commands); @@ -3173,21 +3172,10 @@ sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep,  		return sctp_sf_violation_chunklen(ep, asoc, type, arg,  						  commands); -	while (chunk->chunk_end > chunk->skb->data) { -		ev = sctp_ulpevent_make_remote_error(asoc, chunk, 0, -						     GFP_ATOMIC); -		if (!ev) -			goto nomem; +	sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR, +			SCTP_CHUNK(chunk)); -		sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, -				SCTP_ULPEVENT(ev)); -		sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR, -				SCTP_CHUNK(chunk)); -	}  	return SCTP_DISPOSITION_CONSUME; - -nomem: -	return SCTP_DISPOSITION_NOMEM;  }  /* diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index 385f427beda..ff50a054686 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c @@ -293,11 +293,6 @@ static void rpc_make_runnable(struct rpc_task *task)  	rpc_clear_queued(task);  	if (rpc_test_and_set_running(task))  		return; -	/* We might have raced */ -	if (RPC_IS_QUEUED(task)) { -		rpc_clear_running(task); -		return; -	}  	if (RPC_IS_ASYNC(task)) {  		int status; @@ -607,7 +602,9 @@ void rpc_release_calldata(const struct rpc_call_ops *ops, void *calldata)   */  static void __rpc_execute(struct rpc_task *task)  { -	int		status = 0; +	struct rpc_wait_queue *queue; +	int task_is_async = RPC_IS_ASYNC(task); +	int status = 0;  	dprintk("RPC: %5u __rpc_execute flags=0x%x\n",  			task->tk_pid, task->tk_flags); @@ -647,15 +644,25 @@ static void __rpc_execute(struct rpc_task *task)  		 */  		if (!RPC_IS_QUEUED(task))  			continue; -		rpc_clear_running(task); -		if (RPC_IS_ASYNC(task)) { -			/* Careful! we may have raced... */ -			if (RPC_IS_QUEUED(task)) -				return; -			if (rpc_test_and_set_running(task)) -				return; +		/* +		 * The queue->lock protects against races with +		 * rpc_make_runnable(). +		 * +		 * Note that once we clear RPC_TASK_RUNNING on an asynchronous +		 * rpc_task, rpc_make_runnable() can assign it to a +		 * different workqueue. We therefore cannot assume that the +		 * rpc_task pointer may still be dereferenced. +		 */ +		queue = task->tk_waitqueue; +		spin_lock_bh(&queue->lock); +		if (!RPC_IS_QUEUED(task)) { +			spin_unlock_bh(&queue->lock);  			continue;  		} +		rpc_clear_running(task); +		spin_unlock_bh(&queue->lock); +		if (task_is_async) +			return;  		/* sync task: sleep here */  		dprintk("RPC: %5u sync task going to sleep\n", task->tk_pid); diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 29e401bb612..62098d101a1 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -663,7 +663,7 @@ void xprt_connect(struct rpc_task *task)  			xprt, (xprt_connected(xprt) ? "is" : "is not"));  	if (!xprt_bound(xprt)) { -		task->tk_status = -EIO; +		task->tk_status = -EAGAIN;  		return;  	}  	if (!xprt_lock_write(xprt, task)) diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 5cbb404c4cd..29c71e645b2 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -467,7 +467,7 @@ static int xs_sendpages(struct socket *sock, struct sockaddr *addr, int addrlen,  	int err, sent = 0;  	if (unlikely(!sock)) -		return -ENOTCONN; +		return -ENOTSOCK;  	clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags);  	if (base != 0) { @@ -577,6 +577,8 @@ static int xs_udp_send_request(struct rpc_task *task)  				req->rq_svec->iov_base,  				req->rq_svec->iov_len); +	if (!xprt_bound(xprt)) +		return -ENOTCONN;  	status = xs_sendpages(transport->sock,  			      xs_addr(xprt),  			      xprt->addrlen, xdr, @@ -594,6 +596,10 @@ static int xs_udp_send_request(struct rpc_task *task)  	}  	switch (status) { +	case -ENOTSOCK: +		status = -ENOTCONN; +		/* Should we call xs_close() here? */ +		break;  	case -EAGAIN:  		xs_nospace(task);  		break; @@ -693,6 +699,10 @@ static int xs_tcp_send_request(struct rpc_task *task)  	}  	switch (status) { +	case -ENOTSOCK: +		status = -ENOTCONN; +		/* Should we call xs_close() here? */ +		break;  	case -EAGAIN:  		xs_nospace(task);  		break; @@ -1523,7 +1533,7 @@ static void xs_udp_connect_worker4(struct work_struct *work)  	struct socket *sock = transport->sock;  	int err, status = -EIO; -	if (xprt->shutdown || !xprt_bound(xprt)) +	if (xprt->shutdown)  		goto out;  	/* Start by resetting any existing state */ @@ -1564,7 +1574,7 @@ static void xs_udp_connect_worker6(struct work_struct *work)  	struct socket *sock = transport->sock;  	int err, status = -EIO; -	if (xprt->shutdown || !xprt_bound(xprt)) +	if (xprt->shutdown)  		goto out;  	/* Start by resetting any existing state */ @@ -1648,6 +1658,9 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)  		write_unlock_bh(&sk->sk_callback_lock);  	} +	if (!xprt_bound(xprt)) +		return -ENOTCONN; +  	/* Tell the socket layer to start connecting... */  	xprt->stat.connect_count++;  	xprt->stat.connect_start = jiffies; @@ -1668,7 +1681,7 @@ static void xs_tcp_connect_worker4(struct work_struct *work)  	struct socket *sock = transport->sock;  	int err, status = -EIO; -	if (xprt->shutdown || !xprt_bound(xprt)) +	if (xprt->shutdown)  		goto out;  	if (!sock) { @@ -1728,7 +1741,7 @@ static void xs_tcp_connect_worker6(struct work_struct *work)  	struct socket *sock = transport->sock;  	int err, status = -EIO; -	if (xprt->shutdown || !xprt_bound(xprt)) +	if (xprt->shutdown)  		goto out;  	if (!sock) { diff --git a/net/wireless/Kconfig b/net/wireless/Kconfig index e28e2b8fa43..092ae6faccc 100644 --- a/net/wireless/Kconfig +++ b/net/wireless/Kconfig @@ -102,3 +102,13 @@ config LIB80211_CRYPT_CCMP  config LIB80211_CRYPT_TKIP  	tristate + +config LIB80211_DEBUG +	bool "lib80211 debugging messages" +	depends on LIB80211 +	default n +	---help--- +	  You can enable this if you want verbose debugging messages +	  from lib80211. + +	  If unsure, say N. diff --git a/net/wireless/lib80211_crypt_ccmp.c b/net/wireless/lib80211_crypt_ccmp.c index db428194c16..2301dc1edc4 100644 --- a/net/wireless/lib80211_crypt_ccmp.c +++ b/net/wireless/lib80211_crypt_ccmp.c @@ -337,6 +337,7 @@ static int lib80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv)  	pos += 8;  	if (ccmp_replay_check(pn, key->rx_pn)) { +#ifdef CONFIG_LIB80211_DEBUG  		if (net_ratelimit()) {  			printk(KERN_DEBUG "CCMP: replay detected: STA=%pM "  				 "previous PN %02x%02x%02x%02x%02x%02x " @@ -346,6 +347,7 @@ static int lib80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv)  				 key->rx_pn[3], key->rx_pn[4], key->rx_pn[5],  				 pn[0], pn[1], pn[2], pn[3], pn[4], pn[5]);  		} +#endif  		key->dot11RSNAStatsCCMPReplays++;  		return -4;  	} diff --git a/net/wireless/lib80211_crypt_tkip.c b/net/wireless/lib80211_crypt_tkip.c index 7e8e22bfed9..c36287399d7 100644 --- a/net/wireless/lib80211_crypt_tkip.c +++ b/net/wireless/lib80211_crypt_tkip.c @@ -465,12 +465,14 @@ static int lib80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)  	pos += 8;  	if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) { +#ifdef CONFIG_LIB80211_DEBUG  		if (net_ratelimit()) {  			printk(KERN_DEBUG "TKIP: replay detected: STA=%pM"  			       " previous TSC %08x%04x received TSC "  			       "%08x%04x\n", hdr->addr2,  			       tkey->rx_iv32, tkey->rx_iv16, iv32, iv16);  		} +#endif  		tkey->dot11RSNAStatsTKIPReplays++;  		return -4;  	} @@ -505,10 +507,12 @@ static int lib80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)  			 * it needs to be recalculated for the next packet. */  			tkey->rx_phase1_done = 0;  		} +#ifdef CONFIG_LIB80211_DEBUG  		if (net_ratelimit()) {  			printk(KERN_DEBUG "TKIP: ICV error detected: STA="  			       "%pM\n", hdr->addr2);  		} +#endif  		tkey->dot11RSNAStatsTKIPICVErrors++;  		return -5;  	} diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 1e728fff474..31b807af323 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -1908,6 +1908,11 @@ static int nl80211_get_mesh_params(struct sk_buff *skb,  	if (err)  		return err; +	if (!drv->ops->get_mesh_params) { +		err = -EOPNOTSUPP; +		goto out; +	} +  	/* Get the mesh params */  	rtnl_lock();  	err = drv->ops->get_mesh_params(&drv->wiphy, dev, &cur_params); @@ -2017,6 +2022,11 @@ static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info)  	if (err)  		return err; +	if (!drv->ops->set_mesh_params) { +		err = -EOPNOTSUPP; +		goto out; +	} +  	/* This makes sure that there aren't more than 32 mesh config  	 * parameters (otherwise our bitfield scheme would not work.) */  	BUILD_BUG_ON(NL80211_MESHCONF_ATTR_MAX > 32); @@ -2061,6 +2071,7 @@ static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info)  	err = drv->ops->set_mesh_params(&drv->wiphy, dev, &cfg, mask);  	rtnl_unlock(); + out:  	/* cleanup */  	cfg80211_put_dev(drv);  	dev_put(dev); diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 85c9034c59b..bd0a16c3de5 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c @@ -380,7 +380,8 @@ static bool is_valid_reg_rule(const struct ieee80211_reg_rule *rule)  	freq_diff = freq_range->end_freq_khz - freq_range->start_freq_khz; -	if (freq_diff <= 0 || freq_range->max_bandwidth_khz > freq_diff) +	if (freq_range->end_freq_khz <= freq_range->start_freq_khz || +			freq_range->max_bandwidth_khz > freq_diff)  		return false;  	return true; diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index e25ff62ab2a..62a5425cc6a 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -748,12 +748,51 @@ static void xfrm_hash_grow_check(struct net *net, int have_hash_collision)  		schedule_work(&net->xfrm.state_hash_work);  } +static void xfrm_state_look_at(struct xfrm_policy *pol, struct xfrm_state *x, +			       struct flowi *fl, unsigned short family, +			       xfrm_address_t *daddr, xfrm_address_t *saddr, +			       struct xfrm_state **best, int *acq_in_progress, +			       int *error) +{ +	/* Resolution logic: +	 * 1. There is a valid state with matching selector. Done. +	 * 2. Valid state with inappropriate selector. Skip. +	 * +	 * Entering area of "sysdeps". +	 * +	 * 3. If state is not valid, selector is temporary, it selects +	 *    only session which triggered previous resolution. Key +	 *    manager will do something to install a state with proper +	 *    selector. +	 */ +	if (x->km.state == XFRM_STATE_VALID) { +		if ((x->sel.family && +		     !xfrm_selector_match(&x->sel, fl, x->sel.family)) || +		    !security_xfrm_state_pol_flow_match(x, pol, fl)) +			return; + +		if (!*best || +		    (*best)->km.dying > x->km.dying || +		    ((*best)->km.dying == x->km.dying && +		     (*best)->curlft.add_time < x->curlft.add_time)) +			*best = x; +	} else if (x->km.state == XFRM_STATE_ACQ) { +		*acq_in_progress = 1; +	} else if (x->km.state == XFRM_STATE_ERROR || +		   x->km.state == XFRM_STATE_EXPIRED) { +		if (xfrm_selector_match(&x->sel, fl, x->sel.family) && +		    security_xfrm_state_pol_flow_match(x, pol, fl)) +			*error = -ESRCH; +	} +} +  struct xfrm_state *  xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,  		struct flowi *fl, struct xfrm_tmpl *tmpl,  		struct xfrm_policy *pol, int *err,  		unsigned short family)  { +	static xfrm_address_t saddr_wildcard = { };  	struct net *net = xp_net(pol);  	unsigned int h;  	struct hlist_node *entry; @@ -773,40 +812,27 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,  		    xfrm_state_addr_check(x, daddr, saddr, family) &&  		    tmpl->mode == x->props.mode &&  		    tmpl->id.proto == x->id.proto && -		    (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) { -			/* Resolution logic: -			   1. There is a valid state with matching selector. -			      Done. -			   2. Valid state with inappropriate selector. Skip. - -			   Entering area of "sysdeps". +		    (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) +			xfrm_state_look_at(pol, x, fl, family, daddr, saddr, +					   &best, &acquire_in_progress, &error); +	} +	if (best) +		goto found; -			   3. If state is not valid, selector is temporary, -			      it selects only session which triggered -			      previous resolution. Key manager will do -			      something to install a state with proper -			      selector. -			 */ -			if (x->km.state == XFRM_STATE_VALID) { -				if ((x->sel.family && !xfrm_selector_match(&x->sel, fl, x->sel.family)) || -				    !security_xfrm_state_pol_flow_match(x, pol, fl)) -					continue; -				if (!best || -				    best->km.dying > x->km.dying || -				    (best->km.dying == x->km.dying && -				     best->curlft.add_time < x->curlft.add_time)) -					best = x; -			} else if (x->km.state == XFRM_STATE_ACQ) { -				acquire_in_progress = 1; -			} else if (x->km.state == XFRM_STATE_ERROR || -				   x->km.state == XFRM_STATE_EXPIRED) { -				if (xfrm_selector_match(&x->sel, fl, x->sel.family) && -				    security_xfrm_state_pol_flow_match(x, pol, fl)) -					error = -ESRCH; -			} -		} +	h = xfrm_dst_hash(net, daddr, &saddr_wildcard, tmpl->reqid, family); +	hlist_for_each_entry(x, entry, net->xfrm.state_bydst+h, bydst) { +		if (x->props.family == family && +		    x->props.reqid == tmpl->reqid && +		    !(x->props.flags & XFRM_STATE_WILDRECV) && +		    xfrm_state_addr_check(x, daddr, saddr, family) && +		    tmpl->mode == x->props.mode && +		    tmpl->id.proto == x->id.proto && +		    (tmpl->id.spi == x->id.spi || !tmpl->id.spi)) +			xfrm_state_look_at(pol, x, fl, family, daddr, saddr, +					   &best, &acquire_in_progress, &error);  	} +found:  	x = best;  	if (!x && !error && !acquire_in_progress) {  		if (tmpl->id.spi && diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 3e1057f885c..d190092c3b6 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -11,6 +11,7 @@  #include <time.h>  #include <unistd.h>  #include <sys/stat.h> +#include <sys/time.h>  #define LKC_DIRECT_LINK  #include "lkc.h" @@ -464,9 +465,22 @@ int main(int ac, char **av)  			input_mode = set_yes;  			break;  		case 'r': +		{ +			struct timeval now; +			unsigned int seed; + +			/* +			 * Use microseconds derived seed, +			 * compensate for systems where it may be zero +			 */ +			gettimeofday(&now, NULL); + +			seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1)); +			srand(seed); +  			input_mode = set_random; -			srand(time(NULL));  			break; +		}  		case 'h':  			printf(_("See README for usage info\n"));  			exit(0); diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 830d9eae11f..273d73888f9 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -843,7 +843,7 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)  			default:  				continue;  			} -			if (!sym_is_choice(sym) || mode != def_random) +			if (!(sym_is_choice(sym) && mode == def_random))  				sym->flags |= SYMBOL_DEF_USER;  			break;  		default: @@ -856,28 +856,49 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)  	if (mode != def_random)  		return; - +	/* +	 * We have different type of choice blocks. +	 * If curr.tri equal to mod then we can select several +	 * choice symbols in one block. +	 * In this case we do nothing. +	 * If curr.tri equal yes then only one symbol can be +	 * selected in a choice block and we set it to yes, +	 * and the rest to no. +	 */  	for_all_symbols(i, csym) {  		if (sym_has_value(csym) || !sym_is_choice(csym))  			continue;  		sym_calc_value(csym); + +		if (csym->curr.tri != yes) +			continue; +  		prop = sym_get_choice_prop(csym); -		def = -1; -		while (1) { -			cnt = 0; -			expr_list_for_each_sym(prop->expr, e, sym) { -				if (sym->visible == no) -					continue; -				if (def == cnt++) { -					csym->def[S_DEF_USER].val = sym; -					break; -				} + +		/* count entries in choice block */ +		cnt = 0; +		expr_list_for_each_sym(prop->expr, e, sym) +			cnt++; + +		/* +		 * find a random value and set it to yes, +		 * set the rest to no so we have only one set +		 */ +		def = (rand() % cnt); + +		cnt = 0; +		expr_list_for_each_sym(prop->expr, e, sym) { +			if (def == cnt++) { +				sym->def[S_DEF_USER].tri = yes; +				csym->def[S_DEF_USER].val = sym; +			} +			else { +				sym->def[S_DEF_USER].tri = no;  			} -			if (def >= 0 || cnt < 2) -				break; -			def = (rand() % cnt) + 1;  		}  		csym->flags |= SYMBOL_DEF_USER; +		/* clear VALID to get value calculated */ +		csym->flags &= ~(SYMBOL_VALID);  	}  } diff --git a/scripts/package/Makefile b/scripts/package/Makefile index 8c6b7b09606..fa4a0a17b7e 100644 --- a/scripts/package/Makefile +++ b/scripts/package/Makefile @@ -35,9 +35,10 @@ $(objtree)/kernel.spec: $(MKSPEC) $(srctree)/Makefile  rpm-pkg rpm: $(objtree)/kernel.spec FORCE  	$(MAKE) clean  	$(PREV) ln -sf $(srctree) $(KERNELPATH) +	$(CONFIG_SHELL) $(srctree)/scripts/setlocalversion > $(objtree)/.scmversion  	$(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/.  	$(PREV) rm $(KERNELPATH) - +	rm -f $(objtree)/.scmversion  	set -e; \  	$(CONFIG_SHELL) $(srctree)/scripts/mkversion > $(objtree)/.tmp_version  	set -e; \ diff --git a/scripts/package/mkspec b/scripts/package/mkspec index ee448cdc6a2..3d93f8c8125 100755 --- a/scripts/package/mkspec +++ b/scripts/package/mkspec @@ -96,7 +96,7 @@ echo "%endif"  echo ""  echo "%clean" -echo '#echo -rf $RPM_BUILD_ROOT' +echo 'rm -rf $RPM_BUILD_ROOT'  echo ""  echo "%files"  echo '%defattr (-, root, root)' diff --git a/scripts/unifdef.c b/scripts/unifdef.c index 552025e72ac..05a31a6c7e1 100644 --- a/scripts/unifdef.c +++ b/scripts/unifdef.c @@ -206,7 +206,7 @@ static void             done(void);  static void             error(const char *);  static int              findsym(const char *);  static void             flushline(bool); -static Linetype         getline(void); +static Linetype         get_line(void);  static Linetype         ifeval(const char **);  static void             ignoreoff(void);  static void             ignoreon(void); @@ -512,7 +512,7 @@ process(void)  	for (;;) {  		linenum++; -		lineval = getline(); +		lineval = get_line();  		trans_table[ifstate[depth]][lineval]();  		debug("process %s -> %s depth %d",  		    linetype_name[lineval], @@ -526,7 +526,7 @@ process(void)   * help from skipcomment().   */  static Linetype -getline(void) +get_line(void)  {  	const char *cp;  	int cursym; diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 0278bc08304..e7ded1326b0 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -1498,58 +1498,31 @@ static int smack_socket_post_create(struct socket *sock, int family,   * looks for host based access restrictions   *   * This version will only be appropriate for really small - * sets of single label hosts. Because of the masking - * it cannot shortcut out on the first match. There are - * numerious ways to address the problem, but none of them - * have been applied here. + * sets of single label hosts.   *   * Returns the label of the far end or NULL if it's not special.   */  static char *smack_host_label(struct sockaddr_in *sip)  {  	struct smk_netlbladdr *snp; -	char *bestlabel = NULL;  	struct in_addr *siap = &sip->sin_addr; -	struct in_addr *liap; -	struct in_addr *miap; -	struct in_addr bestmask;  	if (siap->s_addr == 0)  		return NULL; -	bestmask.s_addr = 0; -  	for (snp = smack_netlbladdrs; snp != NULL; snp = snp->smk_next) { -		liap = &snp->smk_host.sin_addr; -		miap = &snp->smk_mask; -		/* -		 * If the addresses match after applying the list entry mask -		 * the entry matches the address. If it doesn't move along to -		 * the next entry. -		 */ -		if ((liap->s_addr & miap->s_addr) != -		    (siap->s_addr & miap->s_addr)) -			continue;  		/* -		 * If the list entry mask identifies a single address -		 * it can't get any more specific. +		 * we break after finding the first match because +		 * the list is sorted from longest to shortest mask +		 * so we have found the most specific match  		 */ -		if (miap->s_addr == 0xffffffff) +		if ((&snp->smk_host.sin_addr)->s_addr  == +			(siap->s_addr & (&snp->smk_mask)->s_addr)) {  			return snp->smk_label; -		/* -		 * If the list entry mask is less specific than the best -		 * already found this entry is uninteresting. -		 */ -		if ((miap->s_addr | bestmask.s_addr) == bestmask.s_addr) -			continue; -		/* -		 * This is better than any entry found so far. -		 */ -		bestmask.s_addr = miap->s_addr; -		bestlabel = snp->smk_label; +		}  	} -	return bestlabel; +	return NULL;  }  /** diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c index 8e42800878f..51f0efc50da 100644 --- a/security/smack/smackfs.c +++ b/security/smack/smackfs.c @@ -650,10 +650,6 @@ static void *netlbladdr_seq_next(struct seq_file *s, void *v, loff_t *pos)  	return skp;  } -/* -#define BEMASK	0x80000000 -*/ -#define BEMASK	0x00000001  #define BEBITS	(sizeof(__be32) * 8)  /* @@ -663,12 +659,10 @@ static int netlbladdr_seq_show(struct seq_file *s, void *v)  {  	struct smk_netlbladdr *skp = (struct smk_netlbladdr *) v;  	unsigned char *hp = (char *) &skp->smk_host.sin_addr.s_addr; -	__be32 bebits; -	int maskn = 0; +	int maskn; +	u32 temp_mask = be32_to_cpu(skp->smk_mask.s_addr); -	for (bebits = BEMASK; bebits != 0; maskn++, bebits <<= 1) -		if ((skp->smk_mask.s_addr & bebits) == 0) -			break; +	for (maskn = 0; temp_mask; temp_mask <<= 1, maskn++);  	seq_printf(s, "%u.%u.%u.%u/%d %s\n",  		hp[0], hp[1], hp[2], hp[3], maskn, skp->smk_label); @@ -702,6 +696,42 @@ static int smk_open_netlbladdr(struct inode *inode, struct file *file)  }  /** + * smk_netlbladdr_insert + * @new : netlabel to insert + * + * This helper insert netlabel in the smack_netlbladdrs list + * sorted by netmask length (longest to smallest) + */ +static void smk_netlbladdr_insert(struct smk_netlbladdr *new) +{ +	struct smk_netlbladdr *m; + +	if (smack_netlbladdrs == NULL) { +		smack_netlbladdrs = new; +		return; +	} + +	/* the comparison '>' is a bit hacky, but works */ +	if (new->smk_mask.s_addr > smack_netlbladdrs->smk_mask.s_addr) { +		new->smk_next = smack_netlbladdrs; +		smack_netlbladdrs = new; +		return; +	} +	for (m = smack_netlbladdrs; m != NULL; m = m->smk_next) { +		if (m->smk_next == NULL) { +			m->smk_next = new; +			return; +		} +		if (new->smk_mask.s_addr > m->smk_next->smk_mask.s_addr) { +			new->smk_next = m->smk_next; +			m->smk_next = new; +			return; +		} +	} +} + + +/**   * smk_write_netlbladdr - write() for /smack/netlabel   * @filp: file pointer, not actually used   * @buf: where to get the data from @@ -724,8 +754,9 @@ static ssize_t smk_write_netlbladdr(struct file *file, const char __user *buf,  	struct netlbl_audit audit_info;  	struct in_addr mask;  	unsigned int m; -	__be32 bebits = BEMASK; +	u32 mask_bits = (1<<31);  	__be32 nsa; +	u32 temp_mask;  	/*  	 * Must have privilege. @@ -761,10 +792,13 @@ static ssize_t smk_write_netlbladdr(struct file *file, const char __user *buf,  	if (sp == NULL)  		return -EINVAL; -	for (mask.s_addr = 0; m > 0; m--) { -		mask.s_addr |= bebits; -		bebits <<= 1; +	for (temp_mask = 0; m > 0; m--) { +		temp_mask |= mask_bits; +		mask_bits >>= 1;  	} +	mask.s_addr = cpu_to_be32(temp_mask); + +	newname.sin_addr.s_addr &= mask.s_addr;  	/*  	 * Only allow one writer at a time. Writes should be  	 * quite rare and small in any case. @@ -772,6 +806,7 @@ static ssize_t smk_write_netlbladdr(struct file *file, const char __user *buf,  	mutex_lock(&smk_netlbladdr_lock);  	nsa = newname.sin_addr.s_addr; +	/* try to find if the prefix is already in the list */  	for (skp = smack_netlbladdrs; skp != NULL; skp = skp->smk_next)  		if (skp->smk_host.sin_addr.s_addr == nsa &&  		    skp->smk_mask.s_addr == mask.s_addr) @@ -787,9 +822,8 @@ static ssize_t smk_write_netlbladdr(struct file *file, const char __user *buf,  			rc = 0;  			skp->smk_host.sin_addr.s_addr = newname.sin_addr.s_addr;  			skp->smk_mask.s_addr = mask.s_addr; -			skp->smk_next = smack_netlbladdrs;  			skp->smk_label = sp; -			smack_netlbladdrs = skp; +			smk_netlbladdr_insert(skp);  		}  	} else {  		rc = netlbl_cfg_unlbl_static_del(&init_net, NULL, diff --git a/sound/aoa/core/alsa.c b/sound/aoa/core/alsa.c index 61785046358..0fa3855b479 100644 --- a/sound/aoa/core/alsa.c +++ b/sound/aoa/core/alsa.c @@ -23,9 +23,10 @@ int aoa_alsa_init(char *name, struct module *mod, struct device *dev)  		/* cannot be EEXIST due to usage in aoa_fabric_register */  		return -EBUSY; -	alsa_card = snd_card_new(index, name, mod, sizeof(struct aoa_card)); -	if (!alsa_card) -		return -ENOMEM; +	err = snd_card_create(index, name, mod, sizeof(struct aoa_card), +			      &alsa_card); +	if (err < 0) +		return err;  	aoa_card = alsa_card->private_data;  	aoa_card->alsa_card = alsa_card;  	alsa_card->dev = dev; diff --git a/sound/arm/aaci.c b/sound/arm/aaci.c index 772901e41ec..7fbd68fab94 100644 --- a/sound/arm/aaci.c +++ b/sound/arm/aaci.c @@ -995,10 +995,11 @@ static struct aaci * __devinit aaci_init_card(struct amba_device *dev)  {  	struct aaci *aaci;  	struct snd_card *card; +	int err; -	card = snd_card_new(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, -			    THIS_MODULE, sizeof(struct aaci)); -	if (card == NULL) +	err = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, +			      THIS_MODULE, sizeof(struct aaci), &card); +	if (err < 0)  		return NULL;  	card->private_free = aaci_free_card; diff --git a/sound/arm/pxa2xx-ac97.c b/sound/arm/pxa2xx-ac97.c index 85cf591d4e1..7ed100c80a5 100644 --- a/sound/arm/pxa2xx-ac97.c +++ b/sound/arm/pxa2xx-ac97.c @@ -173,10 +173,9 @@ static int __devinit pxa2xx_ac97_probe(struct platform_device *dev)  	struct snd_ac97_template ac97_template;  	int ret; -	ret = -ENOMEM; -	card = snd_card_new(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, -			    THIS_MODULE, 0); -	if (!card) +	ret = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, +			      THIS_MODULE, 0, &card); +	if (ret < 0)  		goto err;  	card->dev = &dev->dev; diff --git a/sound/arm/sa11xx-uda1341.c b/sound/arm/sa11xx-uda1341.c index 1dcd51d81d1..51d708c31e6 100644 --- a/sound/arm/sa11xx-uda1341.c +++ b/sound/arm/sa11xx-uda1341.c @@ -887,9 +887,10 @@ static int __devinit sa11xx_uda1341_probe(struct platform_device *devptr)  	struct sa11xx_uda1341 *chip;  	/* register the soundcard */ -	card = snd_card_new(-1, id, THIS_MODULE, sizeof(struct sa11xx_uda1341)); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(-1, id, THIS_MODULE, +			      sizeof(struct sa11xx_uda1341), &card); +	if (err < 0) +		return err;  	chip = card->private_data;  	spin_lock_init(&chip->s[0].dma_lock); diff --git a/sound/core/hwdep.c b/sound/core/hwdep.c index 195cafc5a55..a70ee7f1ed9 100644 --- a/sound/core/hwdep.c +++ b/sound/core/hwdep.c @@ -99,9 +99,6 @@ static int snd_hwdep_open(struct inode *inode, struct file * file)  	if (hw == NULL)  		return -ENODEV; -	if (!hw->ops.open) -		return -ENXIO; -  	if (!try_module_get(hw->card->module))  		return -EFAULT; @@ -113,6 +110,10 @@ static int snd_hwdep_open(struct inode *inode, struct file * file)  			err = -EBUSY;  			break;  		} +		if (!hw->ops.open) { +			err = 0; +			break; +		}  		err = hw->ops.open(hw, file);  		if (err >= 0)  			break; @@ -151,7 +152,7 @@ static int snd_hwdep_open(struct inode *inode, struct file * file)  static int snd_hwdep_release(struct inode *inode, struct file * file)  { -	int err = -ENXIO; +	int err = 0;  	struct snd_hwdep *hw = file->private_data;  	struct module *mod = hw->card->module; diff --git a/sound/core/init.c b/sound/core/init.c index 0d5520c415d..fd56afe846e 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -121,31 +121,44 @@ static inline int init_info_for_card(struct snd_card *card)  #endif  /** - *  snd_card_new - create and initialize a soundcard structure + *  snd_card_create - create and initialize a soundcard structure   *  @idx: card index (address) [0 ... (SNDRV_CARDS-1)]   *  @xid: card identification (ASCII string)   *  @module: top level module for locking   *  @extra_size: allocate this extra size after the main soundcard structure + *  @card_ret: the pointer to store the created card instance   *   *  Creates and initializes a soundcard structure.   * - *  Returns kmallocated snd_card structure. Creates the ALSA control interface - *  (which is blocked until snd_card_register function is called). + *  The function allocates snd_card instance via kzalloc with the given + *  space for the driver to use freely.  The allocated struct is stored + *  in the given card_ret pointer. + * + *  Returns zero if successful or a negative error code.   */ -struct snd_card *snd_card_new(int idx, const char *xid, -			 struct module *module, int extra_size) +int snd_card_create(int idx, const char *xid, +		    struct module *module, int extra_size, +		    struct snd_card **card_ret)  {  	struct snd_card *card;  	int err, idx2; +	if (snd_BUG_ON(!card_ret)) +		return -EINVAL; +	*card_ret = NULL; +  	if (extra_size < 0)  		extra_size = 0;  	card = kzalloc(sizeof(*card) + extra_size, GFP_KERNEL); -	if (card == NULL) -		return NULL; +	if (!card) +		return -ENOMEM;  	if (xid) { -		if (!snd_info_check_reserved_words(xid)) +		if (!snd_info_check_reserved_words(xid)) { +			snd_printk(KERN_ERR +				   "given id string '%s' is reserved.\n", xid); +			err = -EBUSY;  			goto __error; +		}  		strlcpy(card->id, xid, sizeof(card->id));  	}  	err = 0; @@ -195,6 +208,7 @@ struct snd_card *snd_card_new(int idx, const char *xid,  	INIT_LIST_HEAD(&card->controls);  	INIT_LIST_HEAD(&card->ctl_files);  	spin_lock_init(&card->files_lock); +	INIT_LIST_HEAD(&card->files_list);  	init_waitqueue_head(&card->shutdown_sleep);  #ifdef CONFIG_PM  	mutex_init(&card->power_lock); @@ -202,26 +216,28 @@ struct snd_card *snd_card_new(int idx, const char *xid,  #endif  	/* the control interface cannot be accessed from the user space until */  	/* snd_cards_bitmask and snd_cards are set with snd_card_register */ -	if ((err = snd_ctl_create(card)) < 0) { -		snd_printd("unable to register control minors\n"); +	err = snd_ctl_create(card); +	if (err < 0) { +		snd_printk(KERN_ERR "unable to register control minors\n");  		goto __error;  	} -	if ((err = snd_info_card_create(card)) < 0) { -		snd_printd("unable to create card info\n"); +	err = snd_info_card_create(card); +	if (err < 0) { +		snd_printk(KERN_ERR "unable to create card info\n");  		goto __error_ctl;  	}  	if (extra_size > 0)  		card->private_data = (char *)card + sizeof(struct snd_card); -	return card; +	*card_ret = card; +	return 0;        __error_ctl:  	snd_device_free_all(card, SNDRV_DEV_CMD_PRE);        __error:  	kfree(card); -      	return NULL; +  	return err;  } - -EXPORT_SYMBOL(snd_card_new); +EXPORT_SYMBOL(snd_card_create);  /* return non-zero if a card is already locked */  int snd_card_locked(int card) @@ -259,6 +275,7 @@ static int snd_disconnect_release(struct inode *inode, struct file *file)  	list_for_each_entry(_df, &shutdown_files, shutdown_list) {  		if (_df->file == file) {  			df = _df; +			list_del_init(&df->shutdown_list);  			break;  		}  	} @@ -347,8 +364,7 @@ int snd_card_disconnect(struct snd_card *card)  	/* phase 2: replace file->f_op with special dummy operations */  	spin_lock(&card->files_lock); -	mfile = card->files; -	while (mfile) { +	list_for_each_entry(mfile, &card->files_list, list) {  		file = mfile->file;  		/* it's critical part, use endless loop */ @@ -361,8 +377,6 @@ int snd_card_disconnect(struct snd_card *card)  		mfile->file->f_op = &snd_shutdown_f_ops;  		fops_get(mfile->file->f_op); -		 -		mfile = mfile->next;  	}  	spin_unlock(&card->files_lock);	 @@ -442,7 +456,7 @@ int snd_card_free_when_closed(struct snd_card *card)  		return ret;  	spin_lock(&card->files_lock); -	if (card->files == NULL) +	if (list_empty(&card->files_list))  		free_now = 1;  	else  		card->free_on_last_close = 1; @@ -462,7 +476,7 @@ int snd_card_free(struct snd_card *card)  		return ret;  	/* wait, until all devices are ready for the free operation */ -	wait_event(card->shutdown_sleep, card->files == NULL); +	wait_event(card->shutdown_sleep, list_empty(&card->files_list));  	snd_card_do_free(card);  	return 0;  } @@ -809,15 +823,13 @@ int snd_card_file_add(struct snd_card *card, struct file *file)  		return -ENOMEM;  	mfile->file = file;  	mfile->disconnected_f_op = NULL; -	mfile->next = NULL;  	spin_lock(&card->files_lock);  	if (card->shutdown) {  		spin_unlock(&card->files_lock);  		kfree(mfile);  		return -ENODEV;  	} -	mfile->next = card->files; -	card->files = mfile; +	list_add(&mfile->list, &card->files_list);  	spin_unlock(&card->files_lock);  	return 0;  } @@ -839,29 +851,20 @@ EXPORT_SYMBOL(snd_card_file_add);   */  int snd_card_file_remove(struct snd_card *card, struct file *file)  { -	struct snd_monitor_file *mfile, *pfile = NULL; +	struct snd_monitor_file *mfile, *found = NULL;  	int last_close = 0;  	spin_lock(&card->files_lock); -	mfile = card->files; -	while (mfile) { +	list_for_each_entry(mfile, &card->files_list, list) {  		if (mfile->file == file) { -			if (pfile) -				pfile->next = mfile->next; -			else -				card->files = mfile->next; +			list_del(&mfile->list); +			if (mfile->disconnected_f_op) +				fops_put(mfile->disconnected_f_op); +			found = mfile;  			break;  		} -		pfile = mfile; -		mfile = mfile->next; -	} -	if (mfile && mfile->disconnected_f_op) { -		fops_put(mfile->disconnected_f_op); -		spin_lock(&shutdown_lock); -		list_del(&mfile->shutdown_list); -		spin_unlock(&shutdown_lock);  	} -	if (card->files == NULL) +	if (list_empty(&card->files_list))  		last_close = 1;  	spin_unlock(&card->files_lock);  	if (last_close) { @@ -869,11 +872,11 @@ int snd_card_file_remove(struct snd_card *card, struct file *file)  		if (card->free_on_last_close)  			snd_card_do_free(card);  	} -	if (!mfile) { +	if (!found) {  		snd_printk(KERN_ERR "ALSA card file remove problem (%p)\n", file);  		return -ENOENT;  	} -	kfree(mfile); +	kfree(found);  	return 0;  } diff --git a/sound/core/jack.c b/sound/core/jack.c index 077a85262c1..c8254c667c6 100644 --- a/sound/core/jack.c +++ b/sound/core/jack.c @@ -23,6 +23,14 @@  #include <sound/jack.h>  #include <sound/core.h> +static int jack_types[] = { +	SW_HEADPHONE_INSERT, +	SW_MICROPHONE_INSERT, +	SW_LINEOUT_INSERT, +	SW_JACK_PHYSICAL_INSERT, +	SW_VIDEOOUT_INSERT, +}; +  static int snd_jack_dev_free(struct snd_device *device)  {  	struct snd_jack *jack = device->device_data; @@ -79,6 +87,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,  {  	struct snd_jack *jack;  	int err; +	int i;  	static struct snd_device_ops ops = {  		.dev_free = snd_jack_dev_free,  		.dev_register = snd_jack_dev_register, @@ -100,18 +109,10 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,  	jack->type = type; -	if (type & SND_JACK_HEADPHONE) -		input_set_capability(jack->input_dev, EV_SW, -				     SW_HEADPHONE_INSERT); -	if (type & SND_JACK_LINEOUT) -		input_set_capability(jack->input_dev, EV_SW, -				     SW_LINEOUT_INSERT); -	if (type & SND_JACK_MICROPHONE) -		input_set_capability(jack->input_dev, EV_SW, -				     SW_MICROPHONE_INSERT); -	if (type & SND_JACK_MECHANICAL) -		input_set_capability(jack->input_dev, EV_SW, -				     SW_JACK_PHYSICAL_INSERT); +	for (i = 0; i < ARRAY_SIZE(jack_types); i++) +		if (type & (1 << i)) +			input_set_capability(jack->input_dev, EV_SW, +					     jack_types[i]);  	err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops);  	if (err < 0) @@ -154,21 +155,17 @@ EXPORT_SYMBOL(snd_jack_set_parent);   */  void snd_jack_report(struct snd_jack *jack, int status)  { +	int i; +  	if (!jack)  		return; -	if (jack->type & SND_JACK_HEADPHONE) -		input_report_switch(jack->input_dev, SW_HEADPHONE_INSERT, -				    status & SND_JACK_HEADPHONE); -	if (jack->type & SND_JACK_LINEOUT) -		input_report_switch(jack->input_dev, SW_LINEOUT_INSERT, -				    status & SND_JACK_LINEOUT); -	if (jack->type & SND_JACK_MICROPHONE) -		input_report_switch(jack->input_dev, SW_MICROPHONE_INSERT, -				    status & SND_JACK_MICROPHONE); -	if (jack->type & SND_JACK_MECHANICAL) -		input_report_switch(jack->input_dev, SW_JACK_PHYSICAL_INSERT, -				    status & SND_JACK_MECHANICAL); +	for (i = 0; i < ARRAY_SIZE(jack_types); i++) { +		int testbit = 1 << i; +		if (jack->type & testbit) +			input_report_switch(jack->input_dev, jack_types[i], +					    status & testbit); +	}  	input_sync(jack->input_dev);  } diff --git a/sound/core/misc.c b/sound/core/misc.c index 38524f615d9..a9710e0c97a 100644 --- a/sound/core/misc.c +++ b/sound/core/misc.c @@ -95,12 +95,14 @@ snd_pci_quirk_lookup(struct pci_dev *pci, const struct snd_pci_quirk *list)  {  	const struct snd_pci_quirk *q; -	for (q = list; q->subvendor; q++) -		if (q->subvendor == pci->subsystem_vendor && -		    (!q->subdevice || q->subdevice == pci->subsystem_device)) +	for (q = list; q->subvendor; q++) { +		if (q->subvendor != pci->subsystem_vendor) +			continue; +		if (!q->subdevice || +		    (pci->subsystem_device & q->subdevice_mask) == q->subdevice)  			return q; +	}  	return NULL;  } -  EXPORT_SYMBOL(snd_pci_quirk_lookup);  #endif diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c index 4690b8b5681..e570649184e 100644 --- a/sound/core/oss/mixer_oss.c +++ b/sound/core/oss/mixer_oss.c @@ -692,6 +692,9 @@ static int snd_mixer_oss_put_volume1(struct snd_mixer_oss_file *fmixer,  		snd_mixer_oss_put_volume1_vol(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_PVOLUME], left, right);  		if (slot->present & SNDRV_MIXER_OSS_PRESENT_CVOLUME)  			snd_mixer_oss_put_volume1_vol(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_CVOLUME], left, right); +	} else if (slot->present & SNDRV_MIXER_OSS_PRESENT_CVOLUME) { +		snd_mixer_oss_put_volume1_vol(fmixer, pslot, +			slot->numid[SNDRV_MIXER_OSS_ITEM_CVOLUME], left, right);  	} else if (slot->present & SNDRV_MIXER_OSS_PRESENT_GVOLUME) {  		snd_mixer_oss_put_volume1_vol(fmixer, pslot, slot->numid[SNDRV_MIXER_OSS_ITEM_GVOLUME], left, right);  	} else if (slot->present & SNDRV_MIXER_OSS_PRESENT_GLOBAL) { diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index 0a1798eafb0..699d2890535 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c @@ -2872,7 +2872,7 @@ static void snd_pcm_oss_proc_write(struct snd_info_entry *entry,  			setup = kmalloc(sizeof(*setup), GFP_KERNEL);  			if (! setup) {  				buffer->error = -ENOMEM; -				mutex_lock(&pstr->oss.setup_mutex); +				mutex_unlock(&pstr->oss.setup_mutex);  				return;  			}  			if (pstr->oss.setup_list == NULL) @@ -2886,7 +2886,7 @@ static void snd_pcm_oss_proc_write(struct snd_info_entry *entry,  			if (! template.task_name) {  				kfree(setup);  				buffer->error = -ENOMEM; -				mutex_lock(&pstr->oss.setup_mutex); +				mutex_unlock(&pstr->oss.setup_mutex);  				return;  			}  		} diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index 002777ba336..473247c8e6d 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c @@ -224,156 +224,143 @@ int snd_rawmidi_drain_input(struct snd_rawmidi_substream *substream)  	return 0;  } -int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, -			    int mode, struct snd_rawmidi_file * rfile) +/* look for an available substream for the given stream direction; + * if a specific subdevice is given, try to assign it + */ +static int assign_substream(struct snd_rawmidi *rmidi, int subdevice, +			    int stream, int mode, +			    struct snd_rawmidi_substream **sub_ret) +{ +	struct snd_rawmidi_substream *substream; +	struct snd_rawmidi_str *s = &rmidi->streams[stream]; +	static unsigned int info_flags[2] = { +		[SNDRV_RAWMIDI_STREAM_OUTPUT] = SNDRV_RAWMIDI_INFO_OUTPUT, +		[SNDRV_RAWMIDI_STREAM_INPUT] = SNDRV_RAWMIDI_INFO_INPUT, +	}; + +	if (!(rmidi->info_flags & info_flags[stream])) +		return -ENXIO; +	if (subdevice >= 0 && subdevice >= s->substream_count) +		return -ENODEV; +	if (s->substream_opened >= s->substream_count) +		return -EAGAIN; + +	list_for_each_entry(substream, &s->substreams, list) { +		if (substream->opened) { +			if (stream == SNDRV_RAWMIDI_STREAM_INPUT || +			    !(mode & SNDRV_RAWMIDI_LFLG_APPEND)) +				continue; +		} +		if (subdevice < 0 || subdevice == substream->number) { +			*sub_ret = substream; +			return 0; +		} +	} +	return -EAGAIN; +} + +/* open and do ref-counting for the given substream */ +static int open_substream(struct snd_rawmidi *rmidi, +			  struct snd_rawmidi_substream *substream, +			  int mode) +{ +	int err; + +	err = snd_rawmidi_runtime_create(substream); +	if (err < 0) +		return err; +	err = substream->ops->open(substream); +	if (err < 0) +		return err; +	substream->opened = 1; +	if (substream->use_count++ == 0) +		substream->active_sensing = 1; +	if (mode & SNDRV_RAWMIDI_LFLG_APPEND) +		substream->append = 1; +	rmidi->streams[substream->stream].substream_opened++; +	return 0; +} + +static void close_substream(struct snd_rawmidi *rmidi, +			    struct snd_rawmidi_substream *substream, +			    int cleanup); + +static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode, +			     struct snd_rawmidi_file *rfile)  { -	struct snd_rawmidi *rmidi; -	struct list_head *list1, *list2;  	struct snd_rawmidi_substream *sinput = NULL, *soutput = NULL; -	struct snd_rawmidi_runtime *input = NULL, *output = NULL;  	int err; -	if (rfile) -		rfile->input = rfile->output = NULL; -	mutex_lock(®ister_mutex); -	rmidi = snd_rawmidi_search(card, device); -	mutex_unlock(®ister_mutex); -	if (rmidi == NULL) { -		err = -ENODEV; -		goto __error1; -	} -	if (!try_module_get(rmidi->card->module)) { -		err = -EFAULT; -		goto __error1; -	} -	if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) -		mutex_lock(&rmidi->open_mutex); +	rfile->input = rfile->output = NULL;  	if (mode & SNDRV_RAWMIDI_LFLG_INPUT) { -		if (!(rmidi->info_flags & SNDRV_RAWMIDI_INFO_INPUT)) { -			err = -ENXIO; -			goto __error; -		} -		if (subdevice >= 0 && (unsigned int)subdevice >= rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substream_count) { -			err = -ENODEV; -			goto __error; -		} -		if (rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substream_opened >= -		    rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substream_count) { -			err = -EAGAIN; +		err = assign_substream(rmidi, subdevice, +				       SNDRV_RAWMIDI_STREAM_INPUT, +				       mode, &sinput); +		if (err < 0)  			goto __error; -		}  	}  	if (mode & SNDRV_RAWMIDI_LFLG_OUTPUT) { -		if (!(rmidi->info_flags & SNDRV_RAWMIDI_INFO_OUTPUT)) { -			err = -ENXIO; -			goto __error; -		} -		if (subdevice >= 0 && (unsigned int)subdevice >= rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substream_count) { -			err = -ENODEV; -			goto __error; -		} -		if (rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substream_opened >= -		    rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substream_count) { -			err = -EAGAIN; +		err = assign_substream(rmidi, subdevice, +				       SNDRV_RAWMIDI_STREAM_OUTPUT, +				       mode, &soutput); +		if (err < 0)  			goto __error; -		}  	} -	list1 = rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams.next; -	while (1) { -		if (list1 == &rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams) { -			sinput = NULL; -			if (mode & SNDRV_RAWMIDI_LFLG_INPUT) { -				err = -EAGAIN; -				goto __error; -			} -			break; -		} -		sinput = list_entry(list1, struct snd_rawmidi_substream, list); -		if ((mode & SNDRV_RAWMIDI_LFLG_INPUT) && sinput->opened) -			goto __nexti; -		if (subdevice < 0 || (subdevice >= 0 && subdevice == sinput->number)) -			break; -	      __nexti: -		list1 = list1->next; -	} -	list2 = rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams.next; -	while (1) { -		if (list2 == &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams) { -			soutput = NULL; -			if (mode & SNDRV_RAWMIDI_LFLG_OUTPUT) { -				err = -EAGAIN; -				goto __error; -			} -			break; -		} -		soutput = list_entry(list2, struct snd_rawmidi_substream, list); -		if (mode & SNDRV_RAWMIDI_LFLG_OUTPUT) { -			if (mode & SNDRV_RAWMIDI_LFLG_APPEND) { -				if (soutput->opened && !soutput->append) -					goto __nexto; -			} else { -				if (soutput->opened) -					goto __nexto; -			} -		} -		if (subdevice < 0 || (subdevice >= 0 && subdevice == soutput->number)) -			break; -	      __nexto: -		list2 = list2->next; -	} -	if (mode & SNDRV_RAWMIDI_LFLG_INPUT) { -		if ((err = snd_rawmidi_runtime_create(sinput)) < 0) -			goto __error; -		input = sinput->runtime; -		if ((err = sinput->ops->open(sinput)) < 0) + +	if (sinput) { +		err = open_substream(rmidi, sinput, mode); +		if (err < 0)  			goto __error; -		sinput->opened = 1; -		rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substream_opened++; -	} else { -		sinput = NULL;  	} -	if (mode & SNDRV_RAWMIDI_LFLG_OUTPUT) { -		if (soutput->opened) -			goto __skip_output; -		if ((err = snd_rawmidi_runtime_create(soutput)) < 0) { -			if (mode & SNDRV_RAWMIDI_LFLG_INPUT) -				sinput->ops->close(sinput); +	if (soutput) { +		err = open_substream(rmidi, soutput, mode); +		if (err < 0) { +			if (sinput) +				close_substream(rmidi, sinput, 0);  			goto __error;  		} -		output = soutput->runtime; -		if ((err = soutput->ops->open(soutput)) < 0) { -			if (mode & SNDRV_RAWMIDI_LFLG_INPUT) -				sinput->ops->close(sinput); -			goto __error; -		} -	      __skip_output: -		soutput->opened = 1; -		if (mode & SNDRV_RAWMIDI_LFLG_APPEND) -			soutput->append = 1; -	      	if (soutput->use_count++ == 0) -			soutput->active_sensing = 1; -		rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substream_opened++; -	} else { -		soutput = NULL; -	} -	if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) -		mutex_unlock(&rmidi->open_mutex); -	if (rfile) { -		rfile->rmidi = rmidi; -		rfile->input = sinput; -		rfile->output = soutput;  	} + +	rfile->rmidi = rmidi; +	rfile->input = sinput; +	rfile->output = soutput;  	return 0;        __error: -	if (input != NULL) +	if (sinput && sinput->runtime)  		snd_rawmidi_runtime_free(sinput); -	if (output != NULL) +	if (soutput && soutput->runtime)  		snd_rawmidi_runtime_free(soutput); -	module_put(rmidi->card->module); -	if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) -		mutex_unlock(&rmidi->open_mutex); -      __error1: +	return err; +} + +/* called from sound/core/seq/seq_midi.c */ +int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, +			    int mode, struct snd_rawmidi_file * rfile) +{ +	struct snd_rawmidi *rmidi; +	int err; + +	if (snd_BUG_ON(!rfile)) +		return -EINVAL; + +	mutex_lock(®ister_mutex); +	rmidi = snd_rawmidi_search(card, device); +	if (rmidi == NULL) { +		mutex_unlock(®ister_mutex); +		return -ENODEV; +	} +	if (!try_module_get(rmidi->card->module)) { +		mutex_unlock(®ister_mutex); +		return -ENXIO; +	} +	mutex_unlock(®ister_mutex); + +	mutex_lock(&rmidi->open_mutex); +	err = rawmidi_open_priv(rmidi, subdevice, mode, rfile); +	mutex_unlock(&rmidi->open_mutex); +	if (err < 0) +		module_put(rmidi->card->module);  	return err;  } @@ -385,10 +372,13 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)  	unsigned short fflags;  	int err;  	struct snd_rawmidi *rmidi; -	struct snd_rawmidi_file *rawmidi_file; +	struct snd_rawmidi_file *rawmidi_file = NULL;  	wait_queue_t wait;  	struct snd_ctl_file *kctl; +	if ((file->f_flags & O_APPEND) && !(file->f_flags & O_NONBLOCK))  +		return -EINVAL;		/* invalid combination */ +  	if (maj == snd_major) {  		rmidi = snd_lookup_minor_data(iminor(inode),  					      SNDRV_DEVICE_TYPE_RAWMIDI); @@ -402,24 +392,25 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)  	if (rmidi == NULL)  		return -ENODEV; -	if ((file->f_flags & O_APPEND) && !(file->f_flags & O_NONBLOCK))  -		return -EINVAL;		/* invalid combination */ + +	if (!try_module_get(rmidi->card->module)) +		return -ENXIO; + +	mutex_lock(&rmidi->open_mutex);  	card = rmidi->card;  	err = snd_card_file_add(card, file);  	if (err < 0) -		return -ENODEV; +		goto __error_card;  	fflags = snd_rawmidi_file_flags(file);  	if ((file->f_flags & O_APPEND) || maj == SOUND_MAJOR) /* OSS emul? */  		fflags |= SNDRV_RAWMIDI_LFLG_APPEND; -	fflags |= SNDRV_RAWMIDI_LFLG_NOOPENLOCK;  	rawmidi_file = kmalloc(sizeof(*rawmidi_file), GFP_KERNEL);  	if (rawmidi_file == NULL) { -		snd_card_file_remove(card, file); -		return -ENOMEM; +		err = -ENOMEM; +		goto __error;  	}  	init_waitqueue_entry(&wait, current);  	add_wait_queue(&rmidi->open_wait, &wait); -	mutex_lock(&rmidi->open_mutex);  	while (1) {  		subdevice = -1;  		read_lock(&card->ctl_files_rwlock); @@ -431,8 +422,7 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)  			}  		}  		read_unlock(&card->ctl_files_rwlock); -		err = snd_rawmidi_kernel_open(rmidi->card, rmidi->device, -					      subdevice, fflags, rawmidi_file); +		err = rawmidi_open_priv(rmidi, subdevice, fflags, rawmidi_file);  		if (err >= 0)  			break;  		if (err == -EAGAIN) { @@ -451,67 +441,89 @@ static int snd_rawmidi_open(struct inode *inode, struct file *file)  			break;  		}  	} +	remove_wait_queue(&rmidi->open_wait, &wait); +	if (err < 0) { +		kfree(rawmidi_file); +		goto __error; +	}  #ifdef CONFIG_SND_OSSEMUL  	if (rawmidi_file->input && rawmidi_file->input->runtime)  		rawmidi_file->input->runtime->oss = (maj == SOUND_MAJOR);  	if (rawmidi_file->output && rawmidi_file->output->runtime)  		rawmidi_file->output->runtime->oss = (maj == SOUND_MAJOR);  #endif -	remove_wait_queue(&rmidi->open_wait, &wait); -	if (err >= 0) { -		file->private_data = rawmidi_file; -	} else { -		snd_card_file_remove(card, file); -		kfree(rawmidi_file); -	} +	file->private_data = rawmidi_file; +	mutex_unlock(&rmidi->open_mutex); +	return 0; + + __error: +	snd_card_file_remove(card, file); + __error_card:  	mutex_unlock(&rmidi->open_mutex); +	module_put(rmidi->card->module);  	return err;  } -int snd_rawmidi_kernel_release(struct snd_rawmidi_file * rfile) +static void close_substream(struct snd_rawmidi *rmidi, +			    struct snd_rawmidi_substream *substream, +			    int cleanup)  { -	struct snd_rawmidi *rmidi; -	struct snd_rawmidi_substream *substream; -	struct snd_rawmidi_runtime *runtime; +	rmidi->streams[substream->stream].substream_opened--; +	if (--substream->use_count) +		return; -	if (snd_BUG_ON(!rfile)) -		return -ENXIO; -	rmidi = rfile->rmidi; -	mutex_lock(&rmidi->open_mutex); -	if (rfile->input != NULL) { -		substream = rfile->input; -		rfile->input = NULL; -		runtime = substream->runtime; -		snd_rawmidi_input_trigger(substream, 0); -		substream->ops->close(substream); -		if (runtime->private_free != NULL) -			runtime->private_free(substream); -		snd_rawmidi_runtime_free(substream); -		substream->opened = 0; -		rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substream_opened--; -	} -	if (rfile->output != NULL) { -		substream = rfile->output; -		rfile->output = NULL; -		if (--substream->use_count == 0) { -			runtime = substream->runtime; +	if (cleanup) { +		if (substream->stream == SNDRV_RAWMIDI_STREAM_INPUT) +			snd_rawmidi_input_trigger(substream, 0); +		else {  			if (substream->active_sensing) {  				unsigned char buf = 0xfe; -				/* sending single active sensing message to shut the device up */ +				/* sending single active sensing message +				 * to shut the device up +				 */  				snd_rawmidi_kernel_write(substream, &buf, 1);  			}  			if (snd_rawmidi_drain_output(substream) == -ERESTARTSYS)  				snd_rawmidi_output_trigger(substream, 0); -			substream->ops->close(substream); -			if (runtime->private_free != NULL) -				runtime->private_free(substream); -			snd_rawmidi_runtime_free(substream); -			substream->opened = 0; -			substream->append = 0;  		} -		rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substream_opened--;  	} +	substream->ops->close(substream); +	if (substream->runtime->private_free) +		substream->runtime->private_free(substream); +	snd_rawmidi_runtime_free(substream); +	substream->opened = 0; +	substream->append = 0; +} + +static void rawmidi_release_priv(struct snd_rawmidi_file *rfile) +{ +	struct snd_rawmidi *rmidi; + +	rmidi = rfile->rmidi; +	mutex_lock(&rmidi->open_mutex); +	if (rfile->input) { +		close_substream(rmidi, rfile->input, 1); +		rfile->input = NULL; +	} +	if (rfile->output) { +		close_substream(rmidi, rfile->output, 1); +		rfile->output = NULL; +	} +	rfile->rmidi = NULL;  	mutex_unlock(&rmidi->open_mutex); +	wake_up(&rmidi->open_wait); +} + +/* called from sound/core/seq/seq_midi.c */ +int snd_rawmidi_kernel_release(struct snd_rawmidi_file *rfile) +{ +	struct snd_rawmidi *rmidi; + +	if (snd_BUG_ON(!rfile)) +		return -ENXIO; +	 +	rmidi = rfile->rmidi; +	rawmidi_release_priv(rfile);  	module_put(rmidi->card->module);  	return 0;  } @@ -520,15 +532,14 @@ static int snd_rawmidi_release(struct inode *inode, struct file *file)  {  	struct snd_rawmidi_file *rfile;  	struct snd_rawmidi *rmidi; -	int err;  	rfile = file->private_data; -	err = snd_rawmidi_kernel_release(rfile);  	rmidi = rfile->rmidi; -	wake_up(&rmidi->open_wait); +	rawmidi_release_priv(rfile);  	kfree(rfile);  	snd_card_file_remove(rmidi->card, file); -	return err; +	module_put(rmidi->card->module); +	return 0;  }  static int snd_rawmidi_info(struct snd_rawmidi_substream *substream, diff --git a/sound/core/sgbuf.c b/sound/core/sgbuf.c index d4564edd61d..4e7ec2b4987 100644 --- a/sound/core/sgbuf.c +++ b/sound/core/sgbuf.c @@ -38,6 +38,10 @@ int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab)  	if (! sgbuf)  		return -EINVAL; +	if (dmab->area) +		vunmap(dmab->area); +	dmab->area = NULL; +  	tmpb.dev.type = SNDRV_DMA_TYPE_DEV;  	tmpb.dev.dev = sgbuf->dev;  	for (i = 0; i < sgbuf->pages; i++) { @@ -48,9 +52,6 @@ int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab)  		tmpb.bytes = (sgbuf->table[i].addr & ~PAGE_MASK) << PAGE_SHIFT;  		snd_dma_free_pages(&tmpb);  	} -	if (dmab->area) -		vunmap(dmab->area); -	dmab->area = NULL;  	kfree(sgbuf->table);  	kfree(sgbuf->page_table); diff --git a/sound/core/vmaster.c b/sound/core/vmaster.c index 4cc57f902e2..257624bd199 100644 --- a/sound/core/vmaster.c +++ b/sound/core/vmaster.c @@ -50,18 +50,38 @@ struct link_slave {  	struct link_master *master;  	struct link_ctl_info info;  	int vals[2];		/* current values */ +	unsigned int flags;  	struct snd_kcontrol slave; /* the copy of original control entry */  }; +static int slave_update(struct link_slave *slave) +{ +	struct snd_ctl_elem_value *uctl; +	int err, ch; + +	uctl = kmalloc(sizeof(*uctl), GFP_KERNEL); +	if (!uctl) +		return -ENOMEM; +	uctl->id = slave->slave.id; +	err = slave->slave.get(&slave->slave, uctl); +	for (ch = 0; ch < slave->info.count; ch++) +		slave->vals[ch] = uctl->value.integer.value[ch]; +	kfree(uctl); +	return 0; +} +  /* get the slave ctl info and save the initial values */  static int slave_init(struct link_slave *slave)  {  	struct snd_ctl_elem_info *uinfo; -	struct snd_ctl_elem_value *uctl; -	int err, ch; +	int err; -	if (slave->info.count) -		return 0; /* already initialized */ +	if (slave->info.count) { +		/* already initialized */ +		if (slave->flags & SND_CTL_SLAVE_NEED_UPDATE) +			return slave_update(slave); +		return 0; +	}  	uinfo = kmalloc(sizeof(*uinfo), GFP_KERNEL);  	if (!uinfo) @@ -85,15 +105,7 @@ static int slave_init(struct link_slave *slave)  	slave->info.max_val = uinfo->value.integer.max;  	kfree(uinfo); -	uctl = kmalloc(sizeof(*uctl), GFP_KERNEL); -	if (!uctl) -		return -ENOMEM; -	uctl->id = slave->slave.id; -	err = slave->slave.get(&slave->slave, uctl); -	for (ch = 0; ch < slave->info.count; ch++) -		slave->vals[ch] = uctl->value.integer.value[ch]; -	kfree(uctl); -	return 0; +	return slave_update(slave);  }  /* initialize master volume */ @@ -229,7 +241,8 @@ static void slave_free(struct snd_kcontrol *kcontrol)   * - logarithmic volume control (dB level), no linear volume   * - master can only attenuate the volume, no gain   */ -int snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave) +int _snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave, +		       unsigned int flags)  {  	struct link_master *master_link = snd_kcontrol_chip(master);  	struct link_slave *srec; @@ -241,6 +254,7 @@ int snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave)  	srec->slave = *slave;  	memcpy(srec->slave.vd, slave->vd, slave->count * sizeof(*slave->vd));  	srec->master = master_link; +	srec->flags = flags;  	/* override callbacks */  	slave->info = slave_info; @@ -254,8 +268,7 @@ int snd_ctl_add_slave(struct snd_kcontrol *master, struct snd_kcontrol *slave)  	list_add_tail(&srec->list, &master_link->slaves);  	return 0;  } - -EXPORT_SYMBOL(snd_ctl_add_slave); +EXPORT_SYMBOL(_snd_ctl_add_slave);  /*   * ctl callbacks for master controls @@ -327,8 +340,20 @@ static void master_free(struct snd_kcontrol *kcontrol)  } -/* - * Create a virtual master control with the given name +/** + * snd_ctl_make_virtual_master - Create a virtual master control + * @name: name string of the control element to create + * @tlv: optional TLV int array for dB information + * + * Creates a virtual matster control with the given name string. + * Returns the created control element, or NULL for errors (ENOMEM). + * + * After creating a vmaster element, you can add the slave controls + * via snd_ctl_add_slave() or snd_ctl_add_slave_uncached(). + * + * The optional argument @tlv can be used to specify the TLV information + * for dB scale of the master control.  It should be a single element + * with #SNDRV_CTL_TLVT_DB_SCALE type, and should be the max 0dB.   */  struct snd_kcontrol *snd_ctl_make_virtual_master(char *name,  						 const unsigned int *tlv) @@ -367,5 +392,4 @@ struct snd_kcontrol *snd_ctl_make_virtual_master(char *name,  	return kctl;  } -  EXPORT_SYMBOL(snd_ctl_make_virtual_master); diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c index 73be7e14a60..54239d2e099 100644 --- a/sound/drivers/dummy.c +++ b/sound/drivers/dummy.c @@ -588,10 +588,10 @@ static int __devinit snd_dummy_probe(struct platform_device *devptr)  	int idx, err;  	int dev = devptr->id; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_dummy)); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_dummy), &card); +	if (err < 0) +		return err;  	dummy = card->private_data;  	dummy->card = card;  	for (idx = 0; idx < MAX_PCM_DEVICES && idx < pcm_devs[dev]; idx++) { diff --git a/sound/drivers/ml403-ac97cr.c b/sound/drivers/ml403-ac97cr.c index 7783843ca9a..1950ffce2b5 100644 --- a/sound/drivers/ml403-ac97cr.c +++ b/sound/drivers/ml403-ac97cr.c @@ -1279,9 +1279,9 @@ static int __devinit snd_ml403_ac97cr_probe(struct platform_device *pfdev)  	if (!enable[dev])  		return -ENOENT; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	err = snd_ml403_ac97cr_create(card, pfdev, &ml403_ac97cr);  	if (err < 0) {  		PDEBUG(INIT_FAILURE, "probe(): create failed!\n"); diff --git a/sound/drivers/mpu401/mpu401.c b/sound/drivers/mpu401/mpu401.c index 5b996f3faba..149d05a8202 100644 --- a/sound/drivers/mpu401/mpu401.c +++ b/sound/drivers/mpu401/mpu401.c @@ -73,9 +73,9 @@ static int snd_mpu401_create(int dev, struct snd_card **rcard)  		snd_printk(KERN_ERR "the uart_enter option is obsolete; remove it\n");  	*rcard = NULL; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "MPU-401 UART");  	strcpy(card->shortname, card->driver);  	sprintf(card->longname, "%s at %#lx, ", card->shortname, port[dev]); diff --git a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c index 48b64e6b267..0e17d2b5ce1 100644 --- a/sound/drivers/mtpav.c +++ b/sound/drivers/mtpav.c @@ -696,9 +696,9 @@ static int __devinit snd_mtpav_probe(struct platform_device *dev)  	int err;  	struct mtpav *mtp_card; -	card = snd_card_new(index, id, THIS_MODULE, sizeof(*mtp_card)); -	if (! card) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, sizeof(*mtp_card), &card); +	if (err < 0) +		return err;  	mtp_card = card->private_data;  	spin_lock_init(&mtp_card->spinlock); diff --git a/sound/drivers/mts64.c b/sound/drivers/mts64.c index 87ba1ddc011..33d9db782e0 100644 --- a/sound/drivers/mts64.c +++ b/sound/drivers/mts64.c @@ -957,10 +957,10 @@ static int __devinit snd_mts64_probe(struct platform_device *pdev)  	if ((err = snd_mts64_probe_port(p)) < 0)  		return err; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) { +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) {  		snd_printd("Cannot create card\n"); -		return -ENOMEM; +		return err;  	}  	strcpy(card->driver, DRIVER_NAME);  	strcpy(card->shortname, "ESI " CARD_NAME); diff --git a/sound/drivers/pcsp/pcsp.c b/sound/drivers/pcsp/pcsp.c index a4049eb94d3..aa2ae07a76d 100644 --- a/sound/drivers/pcsp/pcsp.c +++ b/sound/drivers/pcsp/pcsp.c @@ -98,9 +98,9 @@ static int __devinit snd_card_pcsp_probe(int devnum, struct device *dev)  	hrtimer_init(&pcsp_chip.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);  	pcsp_chip.timer.function = pcsp_do_timer; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (!card) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	err = snd_pcsp_create(card);  	if (err < 0) { diff --git a/sound/drivers/portman2x4.c b/sound/drivers/portman2x4.c index b1c047ec19a..60158e2e0ea 100644 --- a/sound/drivers/portman2x4.c +++ b/sound/drivers/portman2x4.c @@ -746,10 +746,10 @@ static int __devinit snd_portman_probe(struct platform_device *pdev)  	if ((err = snd_portman_probe_port(p)) < 0)  		return err; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) { +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) {  		snd_printd("Cannot create card\n"); -		return -ENOMEM; +		return err;  	}  	strcpy(card->driver, DRIVER_NAME);  	strcpy(card->shortname, CARD_NAME); diff --git a/sound/drivers/serial-u16550.c b/sound/drivers/serial-u16550.c index d8aab9da97c..891d081e482 100644 --- a/sound/drivers/serial-u16550.c +++ b/sound/drivers/serial-u16550.c @@ -936,9 +936,9 @@ static int __devinit snd_serial_probe(struct platform_device *devptr)  		return -ENODEV;  	} -	card  = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err  = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "Serial");  	strcpy(card->shortname, "Serial MIDI (UART16550A)"); diff --git a/sound/drivers/virmidi.c b/sound/drivers/virmidi.c index f79e3614079..6f48711818f 100644 --- a/sound/drivers/virmidi.c +++ b/sound/drivers/virmidi.c @@ -90,10 +90,10 @@ static int __devinit snd_virmidi_probe(struct platform_device *devptr)  	int idx, err;  	int dev = devptr->id; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_card_virmidi)); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_card_virmidi), &card); +	if (err < 0) +		return err;  	vmidi = (struct snd_card_virmidi *)card->private_data;  	vmidi->card = card; diff --git a/sound/drivers/vx/vx_hwdep.c b/sound/drivers/vx/vx_hwdep.c index 8d6362e2d4c..46df8817c18 100644 --- a/sound/drivers/vx/vx_hwdep.c +++ b/sound/drivers/vx/vx_hwdep.c @@ -119,16 +119,6 @@ void snd_vx_free_firmware(struct vx_core *chip)  #else /* old style firmware loading */ -static int vx_hwdep_open(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} - -static int vx_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} -  static int vx_hwdep_dsp_status(struct snd_hwdep *hw,  			       struct snd_hwdep_dsp_status *info)  { @@ -243,8 +233,6 @@ int snd_vx_setup_firmware(struct vx_core *chip)  	hw->iface = SNDRV_HWDEP_IFACE_VX;  	hw->private_data = chip; -	hw->ops.open = vx_hwdep_open; -	hw->ops.release = vx_hwdep_release;  	hw->ops.dsp_status = vx_hwdep_dsp_status;  	hw->ops.dsp_load = vx_hwdep_dsp_load;  	hw->exclusive = 1; diff --git a/sound/isa/ad1816a/ad1816a.c b/sound/isa/ad1816a/ad1816a.c index 77524244a84..9660e598232 100644 --- a/sound/isa/ad1816a/ad1816a.c +++ b/sound/isa/ad1816a/ad1816a.c @@ -157,9 +157,10 @@ static int __devinit snd_card_ad1816a_probe(int dev, struct pnp_card_link *pcard  	struct snd_ad1816a *chip;  	struct snd_opl3 *opl3; -	if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, -				 sizeof(struct snd_card_ad1816a))) == NULL) -		return -ENOMEM; +	error = snd_card_create(index[dev], id[dev], THIS_MODULE, +				sizeof(struct snd_card_ad1816a), &card); +	if (error < 0) +		return error;  	acard = (struct snd_card_ad1816a *)card->private_data;  	if ((error = snd_card_ad1816a_pnp(dev, acard, pcard, pid))) { diff --git a/sound/isa/ad1848/ad1848.c b/sound/isa/ad1848/ad1848.c index 223a6c03881..4beeb6f98e0 100644 --- a/sound/isa/ad1848/ad1848.c +++ b/sound/isa/ad1848/ad1848.c @@ -91,9 +91,9 @@ static int __devinit snd_ad1848_probe(struct device *dev, unsigned int n)  	struct snd_pcm *pcm;  	int error; -	card = snd_card_new(index[n], id[n], THIS_MODULE, 0); -	if (!card) -		return -EINVAL; +	error = snd_card_create(index[n], id[n], THIS_MODULE, 0, &card); +	if (error < 0) +		return error;  	error = snd_wss_create(card, port[n], -1, irq[n], dma1[n], -1,  			thinkpad[n] ? WSS_HW_THINKPAD : WSS_HW_DETECT, diff --git a/sound/isa/adlib.c b/sound/isa/adlib.c index 374b7177e11..7465ae036e0 100644 --- a/sound/isa/adlib.c +++ b/sound/isa/adlib.c @@ -53,10 +53,10 @@ static int __devinit snd_adlib_probe(struct device *dev, unsigned int n)  	struct snd_opl3 *opl3;  	int error; -	card = snd_card_new(index[n], id[n], THIS_MODULE, 0); -	if (!card) { +	error = snd_card_create(index[n], id[n], THIS_MODULE, 0, &card); +	if (error < 0) {  		dev_err(dev, "could not create card\n"); -		return -EINVAL; +		return error;  	}  	card->private_data = request_region(port[n], 4, CRD_NAME); diff --git a/sound/isa/als100.c b/sound/isa/als100.c index f1ce30f379c..5fd52e4d707 100644 --- a/sound/isa/als100.c +++ b/sound/isa/als100.c @@ -163,9 +163,10 @@ static int __devinit snd_card_als100_probe(int dev,  	struct snd_card_als100 *acard;  	struct snd_opl3 *opl3; -	if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, -				 sizeof(struct snd_card_als100))) == NULL) -		return -ENOMEM; +	error = snd_card_create(index[dev], id[dev], THIS_MODULE, +				sizeof(struct snd_card_als100), &card); +	if (error < 0) +		return error;  	acard = card->private_data;  	if ((error = snd_card_als100_pnp(dev, acard, pcard, pid))) { diff --git a/sound/isa/azt2320.c b/sound/isa/azt2320.c index 3e74d1a3928..f7aa637b0d1 100644 --- a/sound/isa/azt2320.c +++ b/sound/isa/azt2320.c @@ -184,9 +184,10 @@ static int __devinit snd_card_azt2320_probe(int dev,  	struct snd_wss *chip;  	struct snd_opl3 *opl3; -	if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, -				 sizeof(struct snd_card_azt2320))) == NULL) -		return -ENOMEM; +	error = snd_card_create(index[dev], id[dev], THIS_MODULE, +				sizeof(struct snd_card_azt2320), &card); +	if (error < 0) +		return error;  	acard = (struct snd_card_azt2320 *)card->private_data;  	if ((error = snd_card_azt2320_pnp(dev, acard, pcard, pid))) { diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c index e49aec700a5..24e60902f8c 100644 --- a/sound/isa/cmi8330.c +++ b/sound/isa/cmi8330.c @@ -467,20 +467,22 @@ static int snd_cmi8330_resume(struct snd_card *card)  #define PFX	"cmi8330: " -static struct snd_card *snd_cmi8330_card_new(int dev) +static int snd_cmi8330_card_new(int dev, struct snd_card **cardp)  {  	struct snd_card *card;  	struct snd_cmi8330 *acard; +	int err; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_cmi8330)); -	if (card == NULL) { +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_cmi8330), &card); +	if (err < 0) {  		snd_printk(KERN_ERR PFX "could not get a new card\n"); -		return NULL; +		return err;  	}  	acard = card->private_data;  	acard->card = card; -	return card; +	*cardp = card; +	return 0;  }  static int __devinit snd_cmi8330_probe(struct snd_card *card, int dev) @@ -564,9 +566,9 @@ static int __devinit snd_cmi8330_isa_probe(struct device *pdev,  	struct snd_card *card;  	int err; -	card = snd_cmi8330_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_cmi8330_card_new(dev, &card); +	if (err < 0) +		return err;  	snd_card_set_dev(card, pdev);  	if ((err = snd_cmi8330_probe(card, dev)) < 0) {  		snd_card_free(card); @@ -628,9 +630,9 @@ static int __devinit snd_cmi8330_pnp_detect(struct pnp_card_link *pcard,  	if (dev >= SNDRV_CARDS)  		return -ENODEV; -	card = snd_cmi8330_card_new(dev); -	if (! card) -		return -ENOMEM; +	res = snd_cmi8330_card_new(dev, &card); +	if (res < 0) +		return res;  	if ((res = snd_cmi8330_pnp(dev, card->private_data, pcard, pid)) < 0) {  		snd_printk(KERN_ERR PFX "PnP detection failed\n");  		snd_card_free(card); diff --git a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c index f019d449e2d..cb9153e75b8 100644 --- a/sound/isa/cs423x/cs4231.c +++ b/sound/isa/cs423x/cs4231.c @@ -95,9 +95,9 @@ static int __devinit snd_cs4231_probe(struct device *dev, unsigned int n)  	struct snd_pcm *pcm;  	int error; -	card = snd_card_new(index[n], id[n], THIS_MODULE, 0); -	if (!card) -		return -EINVAL; +	error = snd_card_create(index[n], id[n], THIS_MODULE, 0, &card); +	if (error < 0) +		return error;  	error = snd_wss_create(card, port[n], -1, irq[n], dma1[n], dma2[n],  			WSS_HW_DETECT, 0, &chip); diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c index 019c9401663..f7845986f46 100644 --- a/sound/isa/cs423x/cs4236.c +++ b/sound/isa/cs423x/cs4236.c @@ -382,16 +382,18 @@ static void snd_card_cs4236_free(struct snd_card *card)  	release_and_free_resource(acard->res_sb_port);  } -static struct snd_card *snd_cs423x_card_new(int dev) +static int snd_cs423x_card_new(int dev, struct snd_card **cardp)  {  	struct snd_card *card; +	int err; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_card_cs4236)); -	if (card == NULL) -		return NULL; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_card_cs4236), &card); +	if (err < 0) +		return err;  	card->private_free = snd_card_cs4236_free; -	return card; +	*cardp = card; +	return 0;  }  static int __devinit snd_cs423x_probe(struct snd_card *card, int dev) @@ -512,9 +514,9 @@ static int __devinit snd_cs423x_isa_probe(struct device *pdev,  	struct snd_card *card;  	int err; -	card = snd_cs423x_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_cs423x_card_new(dev, &card); +	if (err < 0) +		return err;  	snd_card_set_dev(card, pdev);  	if ((err = snd_cs423x_probe(card, dev)) < 0) {  		snd_card_free(card); @@ -594,9 +596,9 @@ static int __devinit snd_cs4232_pnpbios_detect(struct pnp_dev *pdev,  	if (dev >= SNDRV_CARDS)  		return -ENODEV; -	card = snd_cs423x_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_cs423x_card_new(dev, &card); +	if (err < 0) +		return err;  	if ((err = snd_card_cs4232_pnp(dev, card->private_data, pdev)) < 0) {  		printk(KERN_ERR "PnP BIOS detection failed for " IDENT "\n");  		snd_card_free(card); @@ -656,9 +658,9 @@ static int __devinit snd_cs423x_pnpc_detect(struct pnp_card_link *pcard,  	if (dev >= SNDRV_CARDS)  		return -ENODEV; -	card = snd_cs423x_card_new(dev); -	if (! card) -		return -ENOMEM; +	res = snd_cs423x_card_new(dev, &card); +	if (res < 0) +		return res;  	if ((res = snd_card_cs423x_pnpc(dev, card->private_data, pcard, pid)) < 0) {  		printk(KERN_ERR "isapnp detection failed and probing for " IDENT  		       " is not supported\n"); diff --git a/sound/isa/dt019x.c b/sound/isa/dt019x.c index a0242c3b613..80f5b1af9be 100644 --- a/sound/isa/dt019x.c +++ b/sound/isa/dt019x.c @@ -150,9 +150,10 @@ static int __devinit snd_card_dt019x_probe(int dev, struct pnp_card_link *pcard,  	struct snd_card_dt019x *acard;  	struct snd_opl3 *opl3; -	if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, -				 sizeof(struct snd_card_dt019x))) == NULL) -		return -ENOMEM; +	error = snd_card_create(index[dev], id[dev], THIS_MODULE, +				sizeof(struct snd_card_dt019x), &card); +	if (error < 0) +		return error;  	acard = card->private_data;  	snd_card_set_dev(card, &pcard->card->dev); diff --git a/sound/isa/es1688/es1688.c b/sound/isa/es1688/es1688.c index b46377139cf..d746750410e 100644 --- a/sound/isa/es1688/es1688.c +++ b/sound/isa/es1688/es1688.c @@ -122,9 +122,9 @@ static int __devinit snd_es1688_probe(struct device *dev, unsigned int n)  	struct snd_pcm *pcm;  	int error; -	card = snd_card_new(index[n], id[n], THIS_MODULE, 0); -	if (!card) -		return -EINVAL; +	error = snd_card_create(index[n], id[n], THIS_MODULE, 0, &card); +	if (error < 0) +		return error;  	error = snd_es1688_legacy_create(card, dev, n, &chip);  	if (error < 0) diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c index 90498e4ca26..8cfbff73a83 100644 --- a/sound/isa/es18xx.c +++ b/sound/isa/es18xx.c @@ -2125,10 +2125,10 @@ static int __devinit snd_audiodrive_pnpc(int dev, struct snd_audiodrive *acard,  #define is_isapnp_selected(dev)		0  #endif -static struct snd_card *snd_es18xx_card_new(int dev) +static int snd_es18xx_card_new(int dev, struct snd_card **cardp)  { -	return snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_audiodrive)); +	return snd_card_create(index[dev], id[dev], THIS_MODULE, +			       sizeof(struct snd_audiodrive), cardp);  }  static int __devinit snd_audiodrive_probe(struct snd_card *card, int dev) @@ -2197,9 +2197,9 @@ static int __devinit snd_es18xx_isa_probe1(int dev, struct device *devptr)  	struct snd_card *card;  	int err; -	card = snd_es18xx_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_es18xx_card_new(dev, &card); +	if (err < 0) +		return err;  	snd_card_set_dev(card, devptr);  	if ((err = snd_audiodrive_probe(card, dev)) < 0) {  		snd_card_free(card); @@ -2303,9 +2303,9 @@ static int __devinit snd_audiodrive_pnp_detect(struct pnp_dev *pdev,  	if (dev >= SNDRV_CARDS)  		return -ENODEV; -	card = snd_es18xx_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_es18xx_card_new(dev, &card); +	if (err < 0) +		return err;  	if ((err = snd_audiodrive_pnp(dev, card->private_data, pdev)) < 0) {  		snd_card_free(card);  		return err; @@ -2362,9 +2362,9 @@ static int __devinit snd_audiodrive_pnpc_detect(struct pnp_card_link *pcard,  	if (dev >= SNDRV_CARDS)  		return -ENODEV; -	card = snd_es18xx_card_new(dev); -	if (! card) -		return -ENOMEM; +	res = snd_es18xx_card_new(dev, &card); +	if (res < 0) +		return res;  	if ((res = snd_audiodrive_pnpc(dev, card->private_data, pcard, pid)) < 0) {  		snd_card_free(card); diff --git a/sound/isa/gus/gusclassic.c b/sound/isa/gus/gusclassic.c index 426532a4d73..086b8f0e0f9 100644 --- a/sound/isa/gus/gusclassic.c +++ b/sound/isa/gus/gusclassic.c @@ -148,9 +148,9 @@ static int __devinit snd_gusclassic_probe(struct device *dev, unsigned int n)  	struct snd_gus_card *gus;  	int error; -	card = snd_card_new(index[n], id[n], THIS_MODULE, 0); -	if (!card) -		return -EINVAL; +	error = snd_card_create(index[n], id[n], THIS_MODULE, 0, &card); +	if (error < 0) +		return error;  	if (pcm_channels[n] < 2)  		pcm_channels[n] = 2; diff --git a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c index 7ad4c3b41a8..180a8dea6bd 100644 --- a/sound/isa/gus/gusextreme.c +++ b/sound/isa/gus/gusextreme.c @@ -241,9 +241,9 @@ static int __devinit snd_gusextreme_probe(struct device *dev, unsigned int n)  	struct snd_opl3 *opl3;  	int error; -	card = snd_card_new(index[n], id[n], THIS_MODULE, 0); -	if (!card) -		return -EINVAL; +	error = snd_card_create(index[n], id[n], THIS_MODULE, 0, &card); +	if (error < 0) +		return error;  	if (mpu_port[n] == SNDRV_AUTO_PORT)  		mpu_port[n] = 0; diff --git a/sound/isa/gus/gusmax.c b/sound/isa/gus/gusmax.c index f94c1976e63..f26eac8d811 100644 --- a/sound/isa/gus/gusmax.c +++ b/sound/isa/gus/gusmax.c @@ -214,10 +214,10 @@ static int __devinit snd_gusmax_probe(struct device *pdev, unsigned int dev)  	struct snd_wss *wss;  	struct snd_gusmax *maxcard; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_gusmax)); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_gusmax), &card); +	if (err < 0) +		return err;  	card->private_free = snd_gusmax_free;  	maxcard = (struct snd_gusmax *)card->private_data;  	maxcard->card = card; diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c index 5faecfb602d..50e429a120d 100644 --- a/sound/isa/gus/interwave.c +++ b/sound/isa/gus/interwave.c @@ -626,20 +626,22 @@ static void snd_interwave_free(struct snd_card *card)  		free_irq(iwcard->irq, (void *)iwcard);  } -static struct snd_card *snd_interwave_card_new(int dev) +static int snd_interwave_card_new(int dev, struct snd_card **cardp)  {  	struct snd_card *card;  	struct snd_interwave *iwcard; +	int err; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_interwave)); -	if (card == NULL) -		return NULL; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_interwave), &card); +	if (err < 0) +		return err;  	iwcard = card->private_data;  	iwcard->card = card;  	iwcard->irq = -1;  	card->private_free = snd_interwave_free; -	return card; +	*cardp = card; +	return 0;  }  static int __devinit snd_interwave_probe(struct snd_card *card, int dev) @@ -778,9 +780,9 @@ static int __devinit snd_interwave_isa_probe1(int dev, struct device *devptr)  	struct snd_card *card;  	int err; -	card = snd_interwave_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_interwave_card_new(dev, &card); +	if (err < 0) +		return err;  	snd_card_set_dev(card, devptr);  	if ((err = snd_interwave_probe(card, dev)) < 0) { @@ -876,9 +878,9 @@ static int __devinit snd_interwave_pnp_detect(struct pnp_card_link *pcard,  	if (dev >= SNDRV_CARDS)  		return -ENODEV; -	card = snd_interwave_card_new(dev); -	if (! card) -		return -ENOMEM; +	res = snd_interwave_card_new(dev, &card); +	if (res < 0) +		return res;  	if ((res = snd_interwave_pnp(dev, card->private_data, pcard, pid)) < 0) {  		snd_card_free(card); diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c index 58c972b2af0..63e51373ddc 100644 --- a/sound/isa/opl3sa2.c +++ b/sound/isa/opl3sa2.c @@ -550,21 +550,27 @@ static int __devinit snd_opl3sa2_mixer(struct snd_card *card)  #ifdef CONFIG_PM  static int snd_opl3sa2_suspend(struct snd_card *card, pm_message_t state)  { -	struct snd_opl3sa2 *chip = card->private_data; +	if (card) { +		struct snd_opl3sa2 *chip = card->private_data; -	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); -	chip->wss->suspend(chip->wss); -	/* power down */ -	snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3); +		snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); +		chip->wss->suspend(chip->wss); +		/* power down */ +		snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3); +	}  	return 0;  }  static int snd_opl3sa2_resume(struct snd_card *card)  { -	struct snd_opl3sa2 *chip = card->private_data; +	struct snd_opl3sa2 *chip;  	int i; +	if (!card) +		return 0; + +	chip = card->private_data;  	/* power up */  	snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0); @@ -617,21 +623,24 @@ static void snd_opl3sa2_free(struct snd_card *card)  	release_and_free_resource(chip->res_port);  } -static struct snd_card *snd_opl3sa2_card_new(int dev) +static int snd_opl3sa2_card_new(int dev, struct snd_card **cardp)  {  	struct snd_card *card;  	struct snd_opl3sa2 *chip; +	int err; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, sizeof(struct snd_opl3sa2)); -	if (card == NULL) -		return NULL; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_opl3sa2), &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "OPL3SA2");  	strcpy(card->shortname, "Yamaha OPL3-SA2");  	chip = card->private_data;  	spin_lock_init(&chip->reg_lock);  	chip->irq = -1;  	card->private_free = snd_opl3sa2_free; -	return card; +	*cardp = card; +	return 0;  }  static int __devinit snd_opl3sa2_probe(struct snd_card *card, int dev) @@ -723,9 +732,9 @@ static int __devinit snd_opl3sa2_pnp_detect(struct pnp_dev *pdev,  	if (dev >= SNDRV_CARDS)  		return -ENODEV; -	card = snd_opl3sa2_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_opl3sa2_card_new(dev, &card); +	if (err < 0) +		return err;  	if ((err = snd_opl3sa2_pnp(dev, card->private_data, pdev)) < 0) {  		snd_card_free(card);  		return err; @@ -789,9 +798,9 @@ static int __devinit snd_opl3sa2_pnp_cdetect(struct pnp_card_link *pcard,  	if (dev >= SNDRV_CARDS)  		return -ENODEV; -	card = snd_opl3sa2_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_opl3sa2_card_new(dev, &card); +	if (err < 0) +		return err;  	if ((err = snd_opl3sa2_pnp(dev, card->private_data, pdev)) < 0) {  		snd_card_free(card);  		return err; @@ -870,9 +879,9 @@ static int __devinit snd_opl3sa2_isa_probe(struct device *pdev,  	struct snd_card *card;  	int err; -	card = snd_opl3sa2_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_opl3sa2_card_new(dev, &card); +	if (err < 0) +		return err;  	snd_card_set_dev(card, pdev);  	if ((err = snd_opl3sa2_probe(card, dev)) < 0) {  		snd_card_free(card); diff --git a/sound/isa/opti9xx/miro.c b/sound/isa/opti9xx/miro.c index 440755cc001..02e30d7c6a9 100644 --- a/sound/isa/opti9xx/miro.c +++ b/sound/isa/opti9xx/miro.c @@ -1228,9 +1228,10 @@ static int __devinit snd_miro_probe(struct device *devptr, unsigned int n)  	struct snd_pcm *pcm;  	struct snd_rawmidi *rmidi; -	if (!(card = snd_card_new(index, id, THIS_MODULE, -				  sizeof(struct snd_miro)))) -		return -ENOMEM; +	error = snd_card_create(index, id, THIS_MODULE, +				sizeof(struct snd_miro), &card); +	if (error < 0) +		return error;  	card->private_free = snd_card_miro_free;  	miro = card->private_data; diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c index 19706b0d849..cd6e60a6a4e 100644 --- a/sound/isa/opti9xx/opti92x-ad1848.c +++ b/sound/isa/opti9xx/opti92x-ad1848.c @@ -830,15 +830,18 @@ static int __devinit snd_opti9xx_probe(struct snd_card *card)  	return snd_card_register(card);  } -static struct snd_card *snd_opti9xx_card_new(void) +static int snd_opti9xx_card_new(struct snd_card **cardp)  {  	struct snd_card *card; +	int err; -	card = snd_card_new(index, id, THIS_MODULE, sizeof(struct snd_opti9xx)); -	if (! card) -		return NULL; +	err = snd_card_create(index, id, THIS_MODULE, +			      sizeof(struct snd_opti9xx), &card); +	if (err < 0) +		return err;  	card->private_free = snd_card_opti9xx_free; -	return card; +	*cardp = card; +	return 0;  }  static int __devinit snd_opti9xx_isa_match(struct device *devptr, @@ -903,9 +906,9 @@ static int __devinit snd_opti9xx_isa_probe(struct device *devptr,  	}  #endif -	card = snd_opti9xx_card_new(); -	if (! card) -		return -ENOMEM; +	error = snd_opti9xx_card_new(&card); +	if (error < 0) +		return error;  	if ((error = snd_card_opti9xx_detect(card, card->private_data)) < 0) {  		snd_card_free(card); @@ -950,9 +953,9 @@ static int __devinit snd_opti9xx_pnp_probe(struct pnp_card_link *pcard,  		return -EBUSY;  	if (! isapnp)  		return -ENODEV; -	card = snd_opti9xx_card_new(); -	if (! card) -		return -ENOMEM; +	error = snd_opti9xx_card_new(&card); +	if (error < 0) +		return error;  	chip = card->private_data;  	hw = snd_card_opti9xx_pnp(chip, pcard, pid); diff --git a/sound/isa/sb/es968.c b/sound/isa/sb/es968.c index c8c8e214c84..cafc3a7316a 100644 --- a/sound/isa/sb/es968.c +++ b/sound/isa/sb/es968.c @@ -108,9 +108,10 @@ static int __devinit snd_card_es968_probe(int dev,  	struct snd_card *card;  	struct snd_card_es968 *acard; -	if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, -				 sizeof(struct snd_card_es968))) == NULL) -		return -ENOMEM; +	error = snd_card_create(index[dev], id[dev], THIS_MODULE, +				sizeof(struct snd_card_es968), &card); +	if (error < 0) +		return error;  	acard = card->private_data;  	if ((error = snd_card_es968_pnp(dev, acard, pcard, pid))) {  		snd_card_free(card); diff --git a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c index 2c201f78ce5..519c36346de 100644 --- a/sound/isa/sb/sb16.c +++ b/sound/isa/sb/sb16.c @@ -324,14 +324,18 @@ static void snd_sb16_free(struct snd_card *card)  #define is_isapnp_selected(dev)		0  #endif -static struct snd_card *snd_sb16_card_new(int dev) +static int snd_sb16_card_new(int dev, struct snd_card **cardp)  { -	struct snd_card *card = snd_card_new(index[dev], id[dev], THIS_MODULE, -					sizeof(struct snd_card_sb16)); -	if (card == NULL) -		return NULL; +	struct snd_card *card; +	int err; + +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_card_sb16), &card); +	if (err < 0) +		return err;  	card->private_free = snd_sb16_free; -	return card; +	*cardp = card; +	return 0;  }  static int __devinit snd_sb16_probe(struct snd_card *card, int dev) @@ -489,9 +493,9 @@ static int __devinit snd_sb16_isa_probe1(int dev, struct device *pdev)  	struct snd_card *card;  	int err; -	card = snd_sb16_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_sb16_card_new(dev, &card); +	if (err < 0) +		return err;  	acard = card->private_data;  	/* non-PnP FM port address is hardwired with base port address */ @@ -610,9 +614,9 @@ static int __devinit snd_sb16_pnp_detect(struct pnp_card_link *pcard,  	for ( ; dev < SNDRV_CARDS; dev++) {  		if (!enable[dev] || !isapnp[dev])  			continue; -		card = snd_sb16_card_new(dev); -		if (! card) -			return -ENOMEM; +		res = snd_sb16_card_new(dev, &card); +		if (res < 0) +			return res;  		snd_card_set_dev(card, &pcard->card->dev);  		if ((res = snd_card_sb16_pnp(dev, card->private_data, pcard, pid)) < 0 ||  		    (res = snd_sb16_probe(card, dev)) < 0) { diff --git a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c index ea06877be4b..3cd57ee5466 100644 --- a/sound/isa/sb/sb8.c +++ b/sound/isa/sb/sb8.c @@ -103,10 +103,10 @@ static int __devinit snd_sb8_probe(struct device *pdev, unsigned int dev)  	struct snd_opl3 *opl3;  	int err; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_sb8)); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_sb8), &card); +	if (err < 0) +		return err;  	acard = card->private_data;  	card->private_free = snd_sb8_free; diff --git a/sound/isa/sc6000.c b/sound/isa/sc6000.c index ca35924dc3b..7a1470376c6 100644 --- a/sound/isa/sc6000.c +++ b/sound/isa/sc6000.c @@ -489,9 +489,9 @@ static int __devinit snd_sc6000_probe(struct device *devptr, unsigned int dev)  	char __iomem *vmss_port; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (!card) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if (xirq == SNDRV_AUTO_IRQ) {  		xirq = snd_legacy_find_free_irq(possible_irqs); diff --git a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c index 2c7503bf127..6fe27b9d944 100644 --- a/sound/isa/sgalaxy.c +++ b/sound/isa/sgalaxy.c @@ -243,9 +243,9 @@ static int __devinit snd_sgalaxy_probe(struct device *devptr, unsigned int dev)  	struct snd_card *card;  	struct snd_wss *chip; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	xirq = irq[dev];  	if (xirq == SNDRV_AUTO_IRQ) { diff --git a/sound/isa/sscape.c b/sound/isa/sscape.c index 48a16d86583..4025fb558c5 100644 --- a/sound/isa/sscape.c +++ b/sound/isa/sscape.c @@ -1357,10 +1357,10 @@ static int __devinit snd_sscape_probe(struct device *pdev, unsigned int dev)  	struct soundscape *sscape;  	int ret; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct soundscape)); -	if (!card) -		return -ENOMEM; +	ret = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct soundscape), &card); +	if (ret < 0) +		return ret;  	sscape = get_card_soundscape(card);  	sscape->type = SSCAPE; @@ -1462,10 +1462,10 @@ static int __devinit sscape_pnp_detect(struct pnp_card_link *pcard,  	 * Create a new ALSA sound card entry, in anticipation  	 * of detecting our hardware ...  	 */ -	card = snd_card_new(index[idx], id[idx], THIS_MODULE, -			    sizeof(struct soundscape)); -	if (!card) -		return -ENOMEM; +	ret = snd_card_create(index[idx], id[idx], THIS_MODULE, +			      sizeof(struct soundscape), &card); +	if (ret < 0) +		return ret;  	sscape = get_card_soundscape(card); diff --git a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c index 4c095bc7c72..95898b2b7b5 100644 --- a/sound/isa/wavefront/wavefront.c +++ b/sound/isa/wavefront/wavefront.c @@ -338,15 +338,16 @@ snd_wavefront_free(struct snd_card *card)  	}  } -static struct snd_card *snd_wavefront_card_new(int dev) +static int snd_wavefront_card_new(int dev, struct snd_card **cardp)  {  	struct snd_card *card;  	snd_wavefront_card_t *acard; +	int err; -	card = snd_card_new (index[dev], id[dev], THIS_MODULE, -			     sizeof(snd_wavefront_card_t)); -	if (card == NULL) -		return NULL; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(snd_wavefront_card_t), &card); +	if (err < 0) +		return err;  	acard = card->private_data;  	acard->wavefront.irq = -1; @@ -357,7 +358,8 @@ static struct snd_card *snd_wavefront_card_new(int dev)  	acard->wavefront.card = card;  	card->private_free = snd_wavefront_free; -	return card; +	*cardp = card; +	return 0;  }  static int __devinit @@ -567,9 +569,9 @@ static int __devinit snd_wavefront_isa_probe(struct device *pdev,  	struct snd_card *card;  	int err; -	card = snd_wavefront_card_new(dev); -	if (! card) -		return -ENOMEM; +	err = snd_wavefront_card_new(dev, &card); +	if (err < 0) +		return err;  	snd_card_set_dev(card, pdev);  	if ((err = snd_wavefront_probe(card, dev)) < 0) {  		snd_card_free(card); @@ -616,9 +618,9 @@ static int __devinit snd_wavefront_pnp_detect(struct pnp_card_link *pcard,  	if (dev >= SNDRV_CARDS)  		return -ENODEV; -	card = snd_wavefront_card_new(dev); -	if (! card) -		return -ENOMEM; +	res = snd_wavefront_card_new(dev, &card); +	if (res < 0) +		return res;  	if (snd_wavefront_pnp (dev, card->private_data, pcard, pid) < 0) {  		if (cs4232_pcm_port[dev] == SNDRV_AUTO_PORT) { diff --git a/sound/mips/au1x00.c b/sound/mips/au1x00.c index 1881cec11e7..99e1391b2eb 100644 --- a/sound/mips/au1x00.c +++ b/sound/mips/au1x00.c @@ -636,9 +636,10 @@ au1000_init(void)  	struct snd_card *card;  	struct snd_au1000 *au1000; -	card = snd_card_new(-1, "AC97", THIS_MODULE, sizeof(struct snd_au1000)); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(-1, "AC97", THIS_MODULE, +			      sizeof(struct snd_au1000), &card); +	if (err < 0) +		return err;  	card->private_free = snd_au1000_free;  	au1000 = card->private_data; diff --git a/sound/mips/hal2.c b/sound/mips/hal2.c index db495be0186..c52691c2fc4 100644 --- a/sound/mips/hal2.c +++ b/sound/mips/hal2.c @@ -878,9 +878,9 @@ static int __devinit hal2_probe(struct platform_device *pdev)  	struct snd_hal2 *chip;  	int err; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	err = hal2_create(card, &chip);  	if (err < 0) { diff --git a/sound/mips/sgio2audio.c b/sound/mips/sgio2audio.c index 4c63504348d..66f3b48ceaf 100644 --- a/sound/mips/sgio2audio.c +++ b/sound/mips/sgio2audio.c @@ -936,9 +936,9 @@ static int __devinit snd_sgio2audio_probe(struct platform_device *pdev)  	struct snd_sgio2audio *chip;  	int err; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	err = snd_sgio2audio_create(card, &chip);  	if (err < 0) { diff --git a/sound/parisc/harmony.c b/sound/parisc/harmony.c index 41f870f8a11..6055fd6d3b3 100644 --- a/sound/parisc/harmony.c +++ b/sound/parisc/harmony.c @@ -975,9 +975,9 @@ snd_harmony_probe(struct parisc_device *padev)  	struct snd_card *card;  	struct snd_harmony *h; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	err = snd_harmony_create(card, padev, &h);  	if (err < 0) diff --git a/sound/pci/ad1889.c b/sound/pci/ad1889.c index a7f38e63303..d1f242bd0ac 100644 --- a/sound/pci/ad1889.c +++ b/sound/pci/ad1889.c @@ -995,10 +995,10 @@ snd_ad1889_probe(struct pci_dev *pci,  	}  	/* (2) */ -	card = snd_card_new(index[devno], id[devno], THIS_MODULE, 0); +	err = snd_card_create(index[devno], id[devno], THIS_MODULE, 0, &card);  	/* XXX REVISIT: we can probably allocate chip in this call */ -	if (card == NULL) -		return -ENOMEM; +	if (err < 0) +		return err;  	strcpy(card->driver, "AD1889");  	strcpy(card->shortname, "Analog Devices AD1889"); diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index 1a0fd65ec28..b36c551da56 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c @@ -2307,9 +2307,9 @@ static int __devinit snd_ali_probe(struct pci_dev *pci,  	snd_ali_printk("probe ...\n"); -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (!card) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	err = snd_ali_create(card, pci, pcm_channels, spdif, &codec);  	if (err < 0) diff --git a/sound/pci/als300.c b/sound/pci/als300.c index 8df6824b51c..f557c155db4 100644 --- a/sound/pci/als300.c +++ b/sound/pci/als300.c @@ -812,10 +812,10 @@ static int __devinit snd_als300_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); -	if (card == NULL) -		return -ENOMEM; +	if (err < 0) +		return err;  	chip_type = pci_id->driver_data; diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c index ba570053d4d..542a0c65a92 100644 --- a/sound/pci/als4000.c +++ b/sound/pci/als4000.c @@ -889,12 +889,13 @@ static int __devinit snd_card_als4000_probe(struct pci_dev *pci,  	pci_write_config_word(pci, PCI_COMMAND, word | PCI_COMMAND_IO);  	pci_set_master(pci); -	card = snd_card_new(index[dev], id[dev], THIS_MODULE,  -			    sizeof(*acard) /* private_data: acard */); -	if (card == NULL) { +	err = snd_card_create(index[dev], id[dev], THIS_MODULE,  +			      sizeof(*acard) /* private_data: acard */, +			      &card); +	if (err < 0) {  		pci_release_regions(pci);  		pci_disable_device(pci); -		return -ENOMEM; +		return err;  	}  	acard = card->private_data; diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c index 226fe8237d3..9ce8548c03e 100644 --- a/sound/pci/atiixp.c +++ b/sound/pci/atiixp.c @@ -1645,9 +1645,9 @@ static int __devinit snd_atiixp_probe(struct pci_dev *pci,  	struct atiixp *chip;  	int err; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	strcpy(card->driver, spdif_aclink ? "ATIIXP" : "ATIIXP-SPDMA");  	strcpy(card->shortname, "ATI IXP"); diff --git a/sound/pci/atiixp_modem.c b/sound/pci/atiixp_modem.c index 0e6e5cc1c50..c3136cccc55 100644 --- a/sound/pci/atiixp_modem.c +++ b/sound/pci/atiixp_modem.c @@ -1288,9 +1288,9 @@ static int __devinit snd_atiixp_probe(struct pci_dev *pci,  	struct atiixp_modem *chip;  	int err; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "ATIIXP-MODEM");  	strcpy(card->shortname, "ATI IXP Modem"); diff --git a/sound/pci/au88x0/au88x0.c b/sound/pci/au88x0/au88x0.c index a36d4d1fd41..9ec122383ee 100644 --- a/sound/pci/au88x0/au88x0.c +++ b/sound/pci/au88x0/au88x0.c @@ -250,9 +250,9 @@ snd_vortex_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)  		return -ENOENT;  	}  	// (2) -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	// (3)  	if ((err = snd_vortex_create(card, pci, &chip)) < 0) { diff --git a/sound/pci/aw2/aw2-alsa.c b/sound/pci/aw2/aw2-alsa.c index c7c54e7748e..8eea29fc42f 100644 --- a/sound/pci/aw2/aw2-alsa.c +++ b/sound/pci/aw2/aw2-alsa.c @@ -368,9 +368,9 @@ static int __devinit snd_aw2_probe(struct pci_dev *pci,  	}  	/* (2) Create card instance */ -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	/* (3) Create main component */  	err = snd_aw2_create(card, pci, &chip); diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c index 333007c523a..1df96e76c48 100644 --- a/sound/pci/azt3328.c +++ b/sound/pci/azt3328.c @@ -2216,9 +2216,9 @@ snd_azf3328_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "AZF3328");  	strcpy(card->shortname, "Aztech AZF3328 (PCI168)"); diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c index 1aa1c040254..a299340519d 100644 --- a/sound/pci/bt87x.c +++ b/sound/pci/bt87x.c @@ -888,9 +888,9 @@ static int __devinit snd_bt87x_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (!card) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	err = snd_bt87x_create(card, pci, &chip);  	if (err < 0) diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c index 0e62205d408..b116456e770 100644 --- a/sound/pci/ca0106/ca0106_main.c +++ b/sound/pci/ca0106/ca0106_main.c @@ -1707,9 +1707,9 @@ static int __devinit snd_ca0106_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	err = snd_ca0106_create(dev, card, pci, &chip);  	if (err < 0) diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c index 1a74ca62c31..c7899c32aba 100644 --- a/sound/pci/cmipci.c +++ b/sound/pci/cmipci.c @@ -3272,9 +3272,9 @@ static int __devinit snd_cmipci_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	switch (pci->device) {  	case PCI_DEVICE_ID_CMEDIA_CM8738: diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c index 192e7842e18..b9b07f46463 100644 --- a/sound/pci/cs4281.c +++ b/sound/pci/cs4281.c @@ -1925,9 +1925,9 @@ static int __devinit snd_cs4281_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if ((err = snd_cs4281_create(card, pci, &chip, dual_codec[dev])) < 0) {  		snd_card_free(card); diff --git a/sound/pci/cs46xx/cs46xx.c b/sound/pci/cs46xx/cs46xx.c index e876b3263e4..c9b3e3d48cb 100644 --- a/sound/pci/cs46xx/cs46xx.c +++ b/sound/pci/cs46xx/cs46xx.c @@ -88,9 +88,9 @@ static int __devinit snd_card_cs46xx_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if ((err = snd_cs46xx_create(card, pci,  				     external_amp[dev], thinkpad[dev],  				     &chip)) < 0) { diff --git a/sound/pci/cs5530.c b/sound/pci/cs5530.c index 6dea5b5cc77..dc464321d0f 100644 --- a/sound/pci/cs5530.c +++ b/sound/pci/cs5530.c @@ -258,10 +258,10 @@ static int __devinit snd_cs5530_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); -	if (card == NULL) -		return -ENOMEM; +	if (err < 0) +		return err;  	err = snd_cs5530_create(card, pci, &chip);  	if (err < 0) { diff --git a/sound/pci/cs5535audio/cs5535audio.c b/sound/pci/cs5535audio/cs5535audio.c index 826e6dec2e9..ac1d72e0a1e 100644 --- a/sound/pci/cs5535audio/cs5535audio.c +++ b/sound/pci/cs5535audio/cs5535audio.c @@ -353,9 +353,9 @@ static int __devinit snd_cs5535audio_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if ((err = snd_cs5535audio_create(card, pci, &cs5535au)) < 0)  		goto probefail_out; diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c index 8dbc5c4ba42..9d015a76eb6 100644 --- a/sound/pci/echoaudio/echoaudio.c +++ b/sound/pci/echoaudio/echoaudio.c @@ -1997,9 +1997,9 @@ static int __devinit snd_echo_probe(struct pci_dev *pci,  	DE_INIT(("Echoaudio driver starting...\n"));  	i = 0; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	snd_card_set_dev(card, &pci->dev); diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c index 8354c1a8331..c7f3b994101 100644 --- a/sound/pci/emu10k1/emu10k1.c +++ b/sound/pci/emu10k1/emu10k1.c @@ -114,9 +114,9 @@ static int __devinit snd_card_emu10k1_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if (max_buffer_size[dev] < 32)  		max_buffer_size[dev] = 32;  	else if (max_buffer_size[dev] > 1024) diff --git a/sound/pci/emu10k1/emu10k1x.c b/sound/pci/emu10k1/emu10k1x.c index 5ff4dbb62da..31542adc6b7 100644 --- a/sound/pci/emu10k1/emu10k1x.c +++ b/sound/pci/emu10k1/emu10k1x.c @@ -1544,9 +1544,9 @@ static int __devinit snd_emu10k1x_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if ((err = snd_emu10k1x_create(card, pci, &chip)) < 0) {  		snd_card_free(card); diff --git a/sound/pci/ens1370.c b/sound/pci/ens1370.c index 9bf95367c88..e00614cbcef 100644 --- a/sound/pci/ens1370.c +++ b/sound/pci/ens1370.c @@ -2409,9 +2409,9 @@ static int __devinit snd_audiopci_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if ((err = snd_ensoniq_create(card, pci, &ensoniq)) < 0) {  		snd_card_free(card); diff --git a/sound/pci/es1938.c b/sound/pci/es1938.c index 4cd9a1faaec..34a78afc26d 100644 --- a/sound/pci/es1938.c +++ b/sound/pci/es1938.c @@ -1799,9 +1799,9 @@ static int __devinit snd_es1938_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	for (idx = 0; idx < 5; idx++) {  		if (pci_resource_start(pci, idx) == 0 ||  		    !(pci_resource_flags(pci, idx) & IORESOURCE_IO)) { diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c index e9c3794bbcb..dc97e811614 100644 --- a/sound/pci/es1968.c +++ b/sound/pci/es1968.c @@ -2645,9 +2645,9 @@ static int __devinit snd_es1968_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (!card) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if (total_bufsize[dev] < 128)  		total_bufsize[dev] = 128; diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index c129f9e2072..60cdb9e0b68 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c @@ -1468,9 +1468,9 @@ static int __devinit snd_card_fm801_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if ((err = snd_fm801_create(card, pci, tea575x_tuner[dev], &chip)) < 0) {  		snd_card_free(card);  		return err; diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 5e909e0da04..3683978324e 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -2059,26 +2059,31 @@ static int __devinit check_position_fix(struct azx *chip, int fix)  {  	const struct snd_pci_quirk *q; -	/* Check VIA HD Audio Controller exist */ -	if (chip->pci->vendor == PCI_VENDOR_ID_VIA && -	    chip->pci->device == VIA_HDAC_DEVICE_ID) { +	switch (fix) { +	case POS_FIX_LPIB: +	case POS_FIX_POSBUF: +		return fix; +	} + +	/* Check VIA/ATI HD Audio Controller exist */ +	switch (chip->driver_type) { +	case AZX_DRIVER_VIA: +	case AZX_DRIVER_ATI:  		chip->via_dmapos_patch = 1;  		/* Use link position directly, avoid any transfer problem. */  		return POS_FIX_LPIB;  	}  	chip->via_dmapos_patch = 0; -	if (fix == POS_FIX_AUTO) { -		q = snd_pci_quirk_lookup(chip->pci, position_fix_list); -		if (q) { -			printk(KERN_INFO -				    "hda_intel: position_fix set to %d " -				    "for device %04x:%04x\n", -				    q->value, q->subvendor, q->subdevice); -			return q->value; -		} +	q = snd_pci_quirk_lookup(chip->pci, position_fix_list); +	if (q) { +		printk(KERN_INFO +		       "hda_intel: position_fix set to %d " +		       "for device %04x:%04x\n", +		       q->value, q->subvendor, q->subdevice); +		return q->value;  	} -	return fix; +	return POS_FIX_AUTO;  }  /* @@ -2210,9 +2215,17 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,  	gcap = azx_readw(chip, GCAP);  	snd_printdd("chipset global capabilities = 0x%x\n", gcap); +	/* ATI chips seems buggy about 64bit DMA addresses */ +	if (chip->driver_type == AZX_DRIVER_ATI) +		gcap &= ~0x01; +  	/* allow 64bit DMA address if supported by H/W */  	if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK))  		pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK); +	else { +		pci_set_dma_mask(pci, DMA_32BIT_MASK); +		pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK); +	}  	/* read number of streams from GCAP register instead of using  	 * hardcoded value @@ -2334,10 +2347,10 @@ static int __devinit azx_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (!card) { +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) {  		snd_printk(KERN_ERR SFX "Error creating card!\n"); -		return -ENOMEM; +		return err;  	}  	err = azx_create(card, pci, dev, pci_id->driver_data, &chip); diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 3bc427645da..6094344fb22 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -1207,7 +1207,7 @@ static const char *slave_vols[] = {  	"LFE Playback Volume",  	"Side Playback Volume",  	"Headphone Playback Volume", -	"Headphone Playback Volume", +	"Headphone2 Playback Volume",  	"Speaker Playback Volume",  	"External Speaker Playback Volume",  	"Speaker2 Playback Volume", @@ -1221,7 +1221,7 @@ static const char *slave_sws[] = {  	"LFE Playback Switch",  	"Side Playback Switch",  	"Headphone Playback Switch", -	"Headphone Playback Switch", +	"Headphone2 Playback Switch",  	"Speaker Playback Switch",  	"External Speaker Playback Switch",  	"Speaker2 Playback Switch", @@ -3516,6 +3516,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out  	if (! spec->autocfg.line_outs)  		return 0; /* can't find valid pin config */ +#if 0 /* FIXME: temporarily disabled */  	/* If we have no real line-out pin and multiple hp-outs, HPs should  	 * be set up as multi-channel outputs.  	 */ @@ -3535,6 +3536,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out  		spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;  		spec->autocfg.hp_outs = 0;  	} +#endif /* FIXME: temporarily disabled */  	if (spec->autocfg.mono_out_pin) {  		int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) &  			(AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP); diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index 58d7cda03de..bab1c700f49 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c @@ -2648,9 +2648,9 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "ICE1712");  	strcpy(card->shortname, "ICEnsemble ICE1712"); diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index bb8d8c766b9..7ff36d3f0f4 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c @@ -2456,9 +2456,9 @@ static int __devinit snd_vt1724_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "ICE1724");  	strcpy(card->shortname, "ICEnsemble ICE1724"); diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c index e900cdc8484..608655e9275 100644 --- a/sound/pci/intel8x0.c +++ b/sound/pci/intel8x0.c @@ -3058,9 +3058,9 @@ static int __devinit snd_intel8x0_probe(struct pci_dev *pci,  	int err;  	struct shortname_table *name; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if (spdif_aclink < 0)  		spdif_aclink = check_default_spdif_aclink(pci); diff --git a/sound/pci/intel8x0m.c b/sound/pci/intel8x0m.c index 93449e46456..33a843c1931 100644 --- a/sound/pci/intel8x0m.c +++ b/sound/pci/intel8x0m.c @@ -1269,9 +1269,9 @@ static int __devinit snd_intel8x0m_probe(struct pci_dev *pci,  	int err;  	struct shortname_table *name; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "ICH-MODEM");  	strcpy(card->shortname, "Intel ICH"); diff --git a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c index 5f8006b4275..8b79969034b 100644 --- a/sound/pci/korg1212/korg1212.c +++ b/sound/pci/korg1212/korg1212.c @@ -2443,9 +2443,9 @@ snd_korg1212_probe(struct pci_dev *pci,  		dev++;  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -        if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;          if ((err = snd_korg1212_create(card, pci, &korg1212)) < 0) {  		snd_card_free(card); diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c index 59bbaf8f3e5..70141548f25 100644 --- a/sound/pci/maestro3.c +++ b/sound/pci/maestro3.c @@ -2691,9 +2691,9 @@ snd_m3_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	switch (pci->device) {  	case PCI_DEVICE_ID_ESS_ALLEGRO: diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c index f23a73577c2..c1eb84a14c4 100644 --- a/sound/pci/mixart/mixart.c +++ b/sound/pci/mixart/mixart.c @@ -607,6 +607,7 @@ static int snd_mixart_hw_params(struct snd_pcm_substream *subs,  	/* set the format to the board */  	err = mixart_set_format(stream, format);  	if(err < 0) { +		mutex_unlock(&mgr->setup_mutex);  		return err;  	} @@ -1365,12 +1366,12 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci,  		else  			idx = index[dev] + i;  		snprintf(tmpid, sizeof(tmpid), "%s-%d", id[dev] ? id[dev] : "MIXART", i); -		card = snd_card_new(idx, tmpid, THIS_MODULE, 0); +		err = snd_card_create(idx, tmpid, THIS_MODULE, 0, &card); -		if (! card) { +		if (err < 0) {  			snd_printk(KERN_ERR "cannot allocate the card %d\n", i);  			snd_mixart_free(mgr); -			return -ENOMEM; +			return err;  		}  		strcpy(card->driver, CARD_NAME); diff --git a/sound/pci/mixart/mixart_hwdep.c b/sound/pci/mixart/mixart_hwdep.c index 3782b52bc0e..fa4de985fc4 100644 --- a/sound/pci/mixart/mixart_hwdep.c +++ b/sound/pci/mixart/mixart_hwdep.c @@ -581,16 +581,6 @@ MODULE_FIRMWARE("mixart/miXart8AES.xlx");  /* miXart hwdep interface id string */  #define SND_MIXART_HWDEP_ID       "miXart Loader" -static int mixart_hwdep_open(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} - -static int mixart_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} -  static int mixart_hwdep_dsp_status(struct snd_hwdep *hw,  				   struct snd_hwdep_dsp_status *info)  { @@ -643,8 +633,6 @@ int snd_mixart_setup_firmware(struct mixart_mgr *mgr)  	hw->iface = SNDRV_HWDEP_IFACE_MIXART;  	hw->private_data = mgr; -	hw->ops.open = mixart_hwdep_open; -	hw->ops.release = mixart_hwdep_release;  	hw->ops.dsp_status = mixart_hwdep_dsp_status;  	hw->ops.dsp_load = mixart_hwdep_dsp_load;  	hw->exclusive = 1; diff --git a/sound/pci/nm256/nm256.c b/sound/pci/nm256/nm256.c index 50c9f8a0508..522a040855d 100644 --- a/sound/pci/nm256/nm256.c +++ b/sound/pci/nm256/nm256.c @@ -1668,9 +1668,9 @@ static int __devinit snd_nm256_probe(struct pci_dev *pci,  		}  	} -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	switch (pci->device) {  	case PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO: diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c index 84f481d41ef..9c81e0b0511 100644 --- a/sound/pci/oxygen/oxygen_lib.c +++ b/sound/pci/oxygen/oxygen_lib.c @@ -459,10 +459,10 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,  	struct oxygen *chip;  	int err; -	card = snd_card_new(index, id, model->owner, -			    sizeof *chip + model->model_data_size); -	if (!card) -		return -ENOMEM; +	err = snd_card_create(index, id, model->owner, +			      sizeof(*chip) + model->model_data_size, &card); +	if (err < 0) +		return err;  	chip = card->private_data;  	chip->card = card; diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c index 27cf2c28d11..7f95459c8b1 100644 --- a/sound/pci/pcxhr/pcxhr.c +++ b/sound/pci/pcxhr/pcxhr.c @@ -1510,12 +1510,12 @@ static int __devinit pcxhr_probe(struct pci_dev *pci,  		snprintf(tmpid, sizeof(tmpid), "%s-%d",  			 id[dev] ? id[dev] : card_name, i); -		card = snd_card_new(idx, tmpid, THIS_MODULE, 0); +		err = snd_card_create(idx, tmpid, THIS_MODULE, 0, &card); -		if (! card) { +		if (err < 0) {  			snd_printk(KERN_ERR "cannot allocate the card %d\n", i);  			pcxhr_free(mgr); -			return -ENOMEM; +			return err;  		}  		strcpy(card->driver, DRIVER_NAME); diff --git a/sound/pci/pcxhr/pcxhr_hwdep.c b/sound/pci/pcxhr/pcxhr_hwdep.c index 592743a298b..17cb1233a90 100644 --- a/sound/pci/pcxhr/pcxhr_hwdep.c +++ b/sound/pci/pcxhr/pcxhr_hwdep.c @@ -471,16 +471,6 @@ static int pcxhr_hwdep_dsp_load(struct snd_hwdep *hw,  	return 0;  } -static int pcxhr_hwdep_open(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} - -static int pcxhr_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} -  int pcxhr_setup_firmware(struct pcxhr_mgr *mgr)  {  	int err; @@ -495,8 +485,6 @@ int pcxhr_setup_firmware(struct pcxhr_mgr *mgr)  	hw->iface = SNDRV_HWDEP_IFACE_PCXHR;  	hw->private_data = mgr; -	hw->ops.open = pcxhr_hwdep_open; -	hw->ops.release = pcxhr_hwdep_release;  	hw->ops.dsp_status = pcxhr_hwdep_dsp_status;  	hw->ops.dsp_load = pcxhr_hwdep_dsp_load;  	hw->exclusive = 1; diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c index 3caacfb9d8e..6f1034417a0 100644 --- a/sound/pci/riptide/riptide.c +++ b/sound/pci/riptide/riptide.c @@ -2102,9 +2102,9 @@ snd_card_riptide_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if ((err = snd_riptide_create(card, pci, &chip)) < 0) {  		snd_card_free(card);  		return err; diff --git a/sound/pci/rme32.c b/sound/pci/rme32.c index e7ef3a1a25a..d7b966e7c4c 100644 --- a/sound/pci/rme32.c +++ b/sound/pci/rme32.c @@ -1941,9 +1941,10 @@ snd_rme32_probe(struct pci_dev *pci, const struct pci_device_id *pci_id)  		return -ENOENT;  	} -	if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, -				 sizeof(struct rme32))) == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct rme32), &card); +	if (err < 0) +		return err;  	card->private_free = snd_rme32_card_free;  	rme32 = (struct rme32 *) card->private_data;  	rme32->card = card; diff --git a/sound/pci/rme96.c b/sound/pci/rme96.c index 3fdd488d097..55fb1c131f5 100644 --- a/sound/pci/rme96.c +++ b/sound/pci/rme96.c @@ -2348,9 +2348,10 @@ snd_rme96_probe(struct pci_dev *pci,  		dev++;  		return -ENOENT;  	} -	if ((card = snd_card_new(index[dev], id[dev], THIS_MODULE, -				 sizeof(struct rme96))) == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct rme96), &card); +	if (err < 0) +		return err;  	card->private_free = snd_rme96_card_free;  	rme96 = (struct rme96 *)card->private_data;	  	rme96->card = card; diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c index 44d0c15e2b7..bacfdd12619 100644 --- a/sound/pci/rme9652/hdsp.c +++ b/sound/pci/rme9652/hdsp.c @@ -4413,13 +4413,6 @@ static int snd_hdsp_capture_release(struct snd_pcm_substream *substream)  	return 0;  } -static int snd_hdsp_hwdep_dummy_op(struct snd_hwdep *hw, struct file *file) -{ -	/* we have nothing to initialize but the call is required */ -	return 0; -} - -  /* helper functions for copying meter values */  static inline int copy_u32_le(void __user *dest, void __iomem *src)  { @@ -4738,9 +4731,7 @@ static int snd_hdsp_create_hwdep(struct snd_card *card, struct hdsp *hdsp)  	hw->private_data = hdsp;  	strcpy(hw->name, "HDSP hwdep interface"); -	hw->ops.open = snd_hdsp_hwdep_dummy_op;  	hw->ops.ioctl = snd_hdsp_hwdep_ioctl; -	hw->ops.release = snd_hdsp_hwdep_dummy_op;  	return 0;  } @@ -5158,8 +5149,10 @@ static int __devinit snd_hdsp_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	if (!(card = snd_card_new(index[dev], id[dev], THIS_MODULE, sizeof(struct hdsp)))) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct hdsp), &card); +	if (err < 0) +		return err;  	hdsp = (struct hdsp *) card->private_data;  	card->private_free = snd_hdsp_card_free; diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index 71231cf1b2b..bac2dc0c5d8 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c @@ -4100,13 +4100,6 @@ static int snd_hdspm_capture_release(struct snd_pcm_substream *substream)  	return 0;  } -static int snd_hdspm_hwdep_dummy_op(struct snd_hwdep * hw, struct file *file) -{ -	/* we have nothing to initialize but the call is required */ -	return 0; -} - -  static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file,  				 unsigned int cmd, unsigned long arg)  { @@ -4213,9 +4206,7 @@ static int __devinit snd_hdspm_create_hwdep(struct snd_card *card,  	hw->private_data = hdspm;  	strcpy(hw->name, "HDSPM hwdep interface"); -	hw->ops.open = snd_hdspm_hwdep_dummy_op;  	hw->ops.ioctl = snd_hdspm_hwdep_ioctl; -	hw->ops.release = snd_hdspm_hwdep_dummy_op;  	return 0;  } @@ -4503,10 +4494,10 @@ static int __devinit snd_hdspm_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], -			    THIS_MODULE, sizeof(struct hdspm)); -	if (!card) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], +			      THIS_MODULE, sizeof(struct hdspm), &card); +	if (err < 0) +		return err;  	hdspm = card->private_data;  	card->private_free = snd_hdspm_card_free; diff --git a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c index 2570907134d..bc539abb210 100644 --- a/sound/pci/rme9652/rme9652.c +++ b/sound/pci/rme9652/rme9652.c @@ -2594,11 +2594,11 @@ static int __devinit snd_rme9652_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_rme9652)); +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_rme9652), &card); -	if (!card) -		return -ENOMEM; +	if (err < 0) +		return err;  	rme9652 = (struct snd_rme9652 *) card->private_data;  	card->private_free = snd_rme9652_card_free; diff --git a/sound/pci/sis7019.c b/sound/pci/sis7019.c index df2007e3be7..baf6d8e3dab 100644 --- a/sound/pci/sis7019.c +++ b/sound/pci/sis7019.c @@ -1387,9 +1387,8 @@ static int __devinit snd_sis7019_probe(struct pci_dev *pci,  	if (!enable)  		goto error_out; -	rc = -ENOMEM; -	card = snd_card_new(index, id, THIS_MODULE, sizeof(*sis)); -	if (!card) +	rc = snd_card_create(index, id, THIS_MODULE, sizeof(*sis), &card); +	if (rc < 0)  		goto error_out;  	strcpy(card->driver, "SiS7019"); diff --git a/sound/pci/sonicvibes.c b/sound/pci/sonicvibes.c index cd408b86c83..c5601b0ad7c 100644 --- a/sound/pci/sonicvibes.c +++ b/sound/pci/sonicvibes.c @@ -1423,9 +1423,9 @@ static int __devinit snd_sonic_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	for (idx = 0; idx < 5; idx++) {  		if (pci_resource_start(pci, idx) == 0 ||  		    !(pci_resource_flags(pci, idx) & IORESOURCE_IO)) { diff --git a/sound/pci/trident/trident.c b/sound/pci/trident/trident.c index d94b16ffb38..21cef97d478 100644 --- a/sound/pci/trident/trident.c +++ b/sound/pci/trident/trident.c @@ -89,9 +89,9 @@ static int __devinit snd_trident_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if ((err = snd_trident_create(card, pci,  				      pcm_channels[dev], diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index 1aafe956ee2..d8705547dae 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c @@ -2433,9 +2433,9 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci,  	unsigned int i;  	int err; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	card_type = pci_id->driver_data;  	switch (card_type) { diff --git a/sound/pci/via82xx_modem.c b/sound/pci/via82xx_modem.c index 5bd79d2a5a1..c086b762c15 100644 --- a/sound/pci/via82xx_modem.c +++ b/sound/pci/via82xx_modem.c @@ -1167,9 +1167,9 @@ static int __devinit snd_via82xx_probe(struct pci_dev *pci,  	unsigned int i;  	int err; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	card_type = pci_id->driver_data;  	switch (card_type) { diff --git a/sound/pci/vx222/vx222.c b/sound/pci/vx222/vx222.c index acc352f4a44..fc9136c3e0d 100644 --- a/sound/pci/vx222/vx222.c +++ b/sound/pci/vx222/vx222.c @@ -204,9 +204,9 @@ static int __devinit snd_vx222_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	switch ((int)pci_id->driver_data) {  	case VX_PCI_VX222_OLD: diff --git a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c index 2631a554845..4af66661f9b 100644 --- a/sound/pci/ymfpci/ymfpci.c +++ b/sound/pci/ymfpci/ymfpci.c @@ -187,9 +187,9 @@ static int __devinit snd_card_ymfpci_probe(struct pci_dev *pci,  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	switch (pci_id->device) {  	case 0x0004: str = "YMF724";  model = "DS-1"; break; diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.c b/sound/pcmcia/pdaudiocf/pdaudiocf.c index 819aaaac432..7dea74b71cf 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.c +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.c @@ -91,7 +91,7 @@ static int snd_pdacf_dev_free(struct snd_device *device)   */  static int snd_pdacf_probe(struct pcmcia_device *link)  { -	int i; +	int i, err;  	struct snd_pdacf *pdacf;  	struct snd_card *card;  	static struct snd_device_ops ops = { @@ -112,20 +112,23 @@ static int snd_pdacf_probe(struct pcmcia_device *link)  		return -ENODEV; /* disabled explicitly */  	/* ok, create a card instance */ -	card = snd_card_new(index[i], id[i], THIS_MODULE, 0); -	if (card == NULL) { +	err = snd_card_create(index[i], id[i], THIS_MODULE, 0, &card); +	if (err < 0) {  		snd_printk(KERN_ERR "pdacf: cannot create a card instance\n"); -		return -ENOMEM; +		return err;  	}  	pdacf = snd_pdacf_create(card); -	if (! pdacf) -		return -EIO; +	if (!pdacf) { +		snd_card_free(card); +		return -ENOMEM; +	} -	if (snd_device_new(card, SNDRV_DEV_LOWLEVEL, pdacf, &ops) < 0) { +	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, pdacf, &ops); +	if (err < 0) {  		kfree(pdacf);  		snd_card_free(card); -		return -ENODEV; +		return err;  	}  	snd_card_set_dev(card, &handle_to_dev(link)); diff --git a/sound/pcmcia/vx/vxpocket.c b/sound/pcmcia/vx/vxpocket.c index 706602a4060..7445cc8a47d 100644 --- a/sound/pcmcia/vx/vxpocket.c +++ b/sound/pcmcia/vx/vxpocket.c @@ -130,23 +130,26 @@ static struct snd_vx_hardware vxp440_hw = {  /*   * create vxpocket instance   */ -static struct snd_vxpocket *snd_vxpocket_new(struct snd_card *card, int ibl, -					     struct pcmcia_device *link) +static int snd_vxpocket_new(struct snd_card *card, int ibl, +			    struct pcmcia_device *link, +			    struct snd_vxpocket **chip_ret)  {  	struct vx_core *chip;  	struct snd_vxpocket *vxp;  	static struct snd_device_ops ops = {  		.dev_free =	snd_vxpocket_dev_free,  	}; +	int err;  	chip = snd_vx_create(card, &vxpocket_hw, &snd_vxpocket_ops,  			     sizeof(struct snd_vxpocket) - sizeof(struct vx_core)); -	if (! chip) -		return NULL; +	if (!chip) +		return -ENOMEM; -	if (snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops) < 0) { +	err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); +	if (err < 0) {  		kfree(chip); -		return NULL; +		return err;  	}  	chip->ibl.size = ibl; @@ -169,7 +172,8 @@ static struct snd_vxpocket *snd_vxpocket_new(struct snd_card *card, int ibl,  	link->conf.ConfigIndex = 1;  	link->conf.Present = PRESENT_OPTION; -	return vxp; +	*chip_ret = vxp; +	return 0;  } @@ -292,7 +296,7 @@ static int vxpocket_probe(struct pcmcia_device *p_dev)  {  	struct snd_card *card;  	struct snd_vxpocket *vxp; -	int i; +	int i, err;  	/* find an empty slot from the card list */  	for (i = 0; i < SNDRV_CARDS; i++) { @@ -307,16 +311,16 @@ static int vxpocket_probe(struct pcmcia_device *p_dev)  		return -ENODEV; /* disabled explicitly */  	/* ok, create a card instance */ -	card = snd_card_new(index[i], id[i], THIS_MODULE, 0); -	if (card == NULL) { +	err = snd_card_create(index[i], id[i], THIS_MODULE, 0, &card); +	if (err < 0) {  		snd_printk(KERN_ERR "vxpocket: cannot create a card instance\n"); -		return -ENOMEM; +		return err;  	} -	vxp = snd_vxpocket_new(card, ibl[i], p_dev); -	if (! vxp) { +	err = snd_vxpocket_new(card, ibl[i], p_dev, &vxp); +	if (err < 0) {  		snd_card_free(card); -		return -ENODEV; +		return err;  	}  	card->private_data = vxp; diff --git a/sound/ppc/powermac.c b/sound/ppc/powermac.c index c936225771b..2e18ed0ea89 100644 --- a/sound/ppc/powermac.c +++ b/sound/ppc/powermac.c @@ -58,9 +58,9 @@ static int __init snd_pmac_probe(struct platform_device *devptr)  	char *name_ext;  	int err; -	card = snd_card_new(index, id, THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index, id, THIS_MODULE, 0, &card); +	if (err < 0) +		return err;  	if ((err = snd_pmac_new(card, &chip)) < 0)  		goto __error; diff --git a/sound/ppc/snd_ps3.c b/sound/ppc/snd_ps3.c index ff321110ec0..f361c26506a 100644 --- a/sound/ppc/snd_ps3.c +++ b/sound/ppc/snd_ps3.c @@ -969,11 +969,9 @@ static int __init snd_ps3_driver_probe(struct ps3_system_bus_device *dev)  	}  	/* create card instance */ -	the_card.card = snd_card_new(index, id, THIS_MODULE, 0); -	if (!the_card.card) { -		ret = -ENXIO; +	ret = snd_card_create(index, id, THIS_MODULE, 0, &the_card.card); +	if (ret < 0)  		goto clean_irq; -	}  	strcpy(the_card.card->driver, "PS3");  	strcpy(the_card.card->shortname, "PS3"); diff --git a/sound/sh/aica.c b/sound/sh/aica.c index 7c920f3e7fe..f551233c5a0 100644 --- a/sound/sh/aica.c +++ b/sound/sh/aica.c @@ -609,11 +609,11 @@ static int __devinit snd_aica_probe(struct platform_device *devptr)  	dreamcastcard = kmalloc(sizeof(struct snd_card_aica), GFP_KERNEL);  	if (unlikely(!dreamcastcard))  		return -ENOMEM; -	dreamcastcard->card = -	    snd_card_new(index, SND_AICA_DRIVER, THIS_MODULE, 0); -	if (unlikely(!dreamcastcard->card)) { +	err = snd_card_create(index, SND_AICA_DRIVER, THIS_MODULE, 0, +			      &dreamcastcard->card); +	if (unlikely(err < 0)) {  		kfree(dreamcastcard); -		return -ENODEV; +		return err;  	}  	strcpy(dreamcastcard->card->driver, "snd_aica");  	strcpy(dreamcastcard->card->shortname, SND_AICA_DRIVER); diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index ec3f8bb4b51..637f0d1ea98 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -1311,17 +1311,17 @@ int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid)  {  	struct snd_soc_codec *codec = socdev->codec;  	struct snd_soc_card *card = socdev->card; -	int ret = 0, i; +	int ret, i;  	mutex_lock(&codec->mutex);  	/* register a sound card */ -	codec->card = snd_card_new(idx, xid, codec->owner, 0); -	if (!codec->card) { +	ret = snd_card_create(idx, xid, codec->owner, 0, &codec->card); +	if (ret < 0) {  		printk(KERN_ERR "asoc: can't create sound card for codec %s\n",  			codec->name);  		mutex_unlock(&codec->mutex); -		return -ENODEV; +		return ret;  	}  	codec->card->dev = socdev->dev; diff --git a/sound/sparc/amd7930.c b/sound/sparc/amd7930.c index f87933e4881..ba38912614b 100644 --- a/sound/sparc/amd7930.c +++ b/sound/sparc/amd7930.c @@ -1018,9 +1018,10 @@ static int __devinit amd7930_sbus_probe(struct of_device *op, const struct of_de  		return -ENOENT;  	} -	card = snd_card_new(index[dev_num], id[dev_num], THIS_MODULE, 0); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev_num], id[dev_num], THIS_MODULE, 0, +			      &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "AMD7930");  	strcpy(card->shortname, "Sun AMD7930"); diff --git a/sound/sparc/cs4231.c b/sound/sparc/cs4231.c index 41c38758747..7d93fa705cc 100644 --- a/sound/sparc/cs4231.c +++ b/sound/sparc/cs4231.c @@ -1563,6 +1563,7 @@ static int __init cs4231_attach_begin(struct snd_card **rcard)  {  	struct snd_card *card;  	struct snd_cs4231 *chip; +	int err;  	*rcard = NULL; @@ -1574,10 +1575,10 @@ static int __init cs4231_attach_begin(struct snd_card **rcard)  		return -ENOENT;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_cs4231)); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_cs4231), &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "CS4231");  	strcpy(card->shortname, "Sun CS4231"); diff --git a/sound/sparc/dbri.c b/sound/sparc/dbri.c index 23ed6f04a71..af95ff1e126 100644 --- a/sound/sparc/dbri.c +++ b/sound/sparc/dbri.c @@ -2612,10 +2612,10 @@ static int __devinit dbri_probe(struct of_device *op, const struct of_device_id  		return -ENODEV;  	} -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct snd_dbri)); -	if (card == NULL) -		return -ENOMEM; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct snd_dbri), &card); +	if (err < 0) +		return err;  	strcpy(card->driver, "DBRI");  	strcpy(card->shortname, "Sun DBRI"); diff --git a/sound/spi/at73c213.c b/sound/spi/at73c213.c index 09802e8a6fb..4c7b051f9d1 100644 --- a/sound/spi/at73c213.c +++ b/sound/spi/at73c213.c @@ -965,12 +965,11 @@ static int __devinit snd_at73c213_probe(struct spi_device *spi)  		return PTR_ERR(board->dac_clk);  	} -	retval = -ENOMEM; -  	/* Allocate "card" using some unused identifiers. */  	snprintf(id, sizeof id, "at73c213_%d", board->ssc_id); -	card = snd_card_new(-1, id, THIS_MODULE, sizeof(struct snd_at73c213)); -	if (!card) +	retval = snd_card_create(-1, id, THIS_MODULE, +				 sizeof(struct snd_at73c213), &card); +	if (retval < 0)  		goto out;  	chip = card->private_data; diff --git a/sound/synth/emux/emux_hwdep.c b/sound/synth/emux/emux_hwdep.c index 0a5391436ad..ff0b2a8fd25 100644 --- a/sound/synth/emux/emux_hwdep.c +++ b/sound/synth/emux/emux_hwdep.c @@ -24,25 +24,6 @@  #include <asm/uaccess.h>  #include "emux_voice.h" -/* - * open the hwdep device - */ -static int -snd_emux_hwdep_open(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} - - -/* - * close the device - */ -static int -snd_emux_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} -  #define TMP_CLIENT_ID	0x1001 @@ -146,8 +127,6 @@ snd_emux_init_hwdep(struct snd_emux *emu)  	emu->hwdep = hw;  	strcpy(hw->name, SNDRV_EMUX_HWDEP_NAME);  	hw->iface = SNDRV_HWDEP_IFACE_EMUX_WAVETABLE; -	hw->ops.open = snd_emux_hwdep_open; -	hw->ops.release = snd_emux_hwdep_release;  	hw->ops.ioctl = snd_emux_hwdep_ioctl;  	hw->exclusive = 1;  	hw->private_data = emu; diff --git a/sound/usb/caiaq/caiaq-device.c b/sound/usb/caiaq/caiaq-device.c index 41c36b055f6..09aed2363cc 100644 --- a/sound/usb/caiaq/caiaq-device.c +++ b/sound/usb/caiaq/caiaq-device.c @@ -336,9 +336,10 @@ static void __devinit setup_card(struct snd_usb_caiaqdev *dev)  		log("Unable to set up control system (ret=%d)\n", ret);  } -static struct snd_card* create_card(struct usb_device* usb_dev) +static int create_card(struct usb_device* usb_dev, struct snd_card **cardp)  {  	int devnum; +	int err;  	struct snd_card *card;  	struct snd_usb_caiaqdev *dev; @@ -347,12 +348,12 @@ static struct snd_card* create_card(struct usb_device* usb_dev)  			break;  	if (devnum >= SNDRV_CARDS) -		return NULL; +		return -ENODEV; -	card = snd_card_new(index[devnum], id[devnum], THIS_MODULE,  -					sizeof(struct snd_usb_caiaqdev)); -	if (!card) -		return NULL; +	err = snd_card_create(index[devnum], id[devnum], THIS_MODULE,  +			      sizeof(struct snd_usb_caiaqdev), &card); +	if (err < 0) +		return err;  	dev = caiaqdev(card);  	dev->chip.dev = usb_dev; @@ -362,7 +363,8 @@ static struct snd_card* create_card(struct usb_device* usb_dev)  	spin_lock_init(&dev->spinlock);  	snd_card_set_dev(card, &usb_dev->dev); -	return card; +	*cardp = card; +	return 0;  }  static int __devinit init_card(struct snd_usb_caiaqdev *dev) @@ -441,10 +443,10 @@ static int __devinit snd_probe(struct usb_interface *intf,  	struct snd_card *card;  	struct usb_device *device = interface_to_usbdev(intf); -	card = create_card(device); +	ret = create_card(device, &card); -	if (!card) -		return -ENOMEM; +	if (ret < 0) +		return ret;  	usb_set_intfdata(intf, card);  	ret = init_card(caiaqdev(card)); diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 19e37451c21..8f3cdb37a0e 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c @@ -3466,10 +3466,10 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,  		return -ENXIO;  	} -	card = snd_card_new(index[idx], id[idx], THIS_MODULE, 0); -	if (card == NULL) { +	err = snd_card_create(index[idx], id[idx], THIS_MODULE, 0, &card); +	if (err < 0) {  		snd_printk(KERN_ERR "cannot create card instance %d\n", idx); -		return -ENOMEM; +		return err;  	}  	chip = kzalloc(sizeof(*chip), GFP_KERNEL); diff --git a/sound/usb/usbmixer.c b/sound/usb/usbmixer.c index 00397c8a765..2bde79216fa 100644 --- a/sound/usb/usbmixer.c +++ b/sound/usb/usbmixer.c @@ -78,7 +78,6 @@ struct usb_mixer_interface {  	/* Sound Blaster remote control stuff */  	const struct rc_config *rc_cfg; -	unsigned long rc_hwdep_open;  	u32 rc_code;  	wait_queue_head_t rc_waitq;  	struct urb *rc_urb; @@ -1797,24 +1796,6 @@ static void snd_usb_soundblaster_remote_complete(struct urb *urb)  	wake_up(&mixer->rc_waitq);  } -static int snd_usb_sbrc_hwdep_open(struct snd_hwdep *hw, struct file *file) -{ -	struct usb_mixer_interface *mixer = hw->private_data; - -	if (test_and_set_bit(0, &mixer->rc_hwdep_open)) -		return -EBUSY; -	return 0; -} - -static int snd_usb_sbrc_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ -	struct usb_mixer_interface *mixer = hw->private_data; - -	clear_bit(0, &mixer->rc_hwdep_open); -	smp_mb__after_clear_bit(); -	return 0; -} -  static long snd_usb_sbrc_hwdep_read(struct snd_hwdep *hw, char __user *buf,  				     long count, loff_t *offset)  { @@ -1867,9 +1848,8 @@ static int snd_usb_soundblaster_remote_init(struct usb_mixer_interface *mixer)  	hwdep->iface = SNDRV_HWDEP_IFACE_SB_RC;  	hwdep->private_data = mixer;  	hwdep->ops.read = snd_usb_sbrc_hwdep_read; -	hwdep->ops.open = snd_usb_sbrc_hwdep_open; -	hwdep->ops.release = snd_usb_sbrc_hwdep_release;  	hwdep->ops.poll = snd_usb_sbrc_hwdep_poll; +	hwdep->exclusive = 1;  	mixer->rc_urb = usb_alloc_urb(0, GFP_KERNEL);  	if (!mixer->rc_urb) diff --git a/sound/usb/usx2y/us122l.c b/sound/usb/usx2y/us122l.c index 73e59f4403a..98276aafefe 100644 --- a/sound/usb/usx2y/us122l.c +++ b/sound/usb/usx2y/us122l.c @@ -478,19 +478,21 @@ static bool us122l_create_card(struct snd_card *card)  	return true;  } -static struct snd_card *usx2y_create_card(struct usb_device *device) +static int usx2y_create_card(struct usb_device *device, struct snd_card **cardp)  {  	int		dev;  	struct snd_card *card; +	int err; +  	for (dev = 0; dev < SNDRV_CARDS; ++dev)  		if (enable[dev] && !snd_us122l_card_used[dev])  			break;  	if (dev >= SNDRV_CARDS) -		return NULL; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, -			    sizeof(struct us122l)); -	if (!card) -		return NULL; +		return -ENODEV; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct us122l), &card); +	if (err < 0) +		return err;  	snd_us122l_card_used[US122L(card)->chip.index = dev] = 1;  	US122L(card)->chip.dev = device; @@ -509,46 +511,57 @@ static struct snd_card *usx2y_create_card(struct usb_device *device)  		US122L(card)->chip.dev->devnum  		);  	snd_card_set_dev(card, &device->dev); -	return card; +	*cardp = card; +	return 0;  } -static void *us122l_usb_probe(struct usb_interface *intf, -			      const struct usb_device_id *device_id) +static int us122l_usb_probe(struct usb_interface *intf, +			    const struct usb_device_id *device_id, +			    struct snd_card **cardp)  {  	struct usb_device *device = interface_to_usbdev(intf); -	struct snd_card *card = usx2y_create_card(device); +	struct snd_card *card; +	int err; -	if (!card) -		return NULL; +	err = usx2y_create_card(device, &card); +	if (err < 0) +		return err; -	if (!us122l_create_card(card) || -	    snd_card_register(card) < 0) { +	if (!us122l_create_card(card)) {  		snd_card_free(card); -		return NULL; +		return -EINVAL; +	} + +	err = snd_card_register(card); +	if (err < 0) { +		snd_card_free(card); +		return err;  	}  	usb_get_dev(device); -	return card; +	*cardp = card; +	return 0;  }  static int snd_us122l_probe(struct usb_interface *intf,  			    const struct usb_device_id *id)  {  	struct snd_card *card; +	int err; +  	snd_printdd(KERN_DEBUG"%p:%i\n",  		    intf, intf->cur_altsetting->desc.bInterfaceNumber);  	if (intf->cur_altsetting->desc.bInterfaceNumber != 1)  		return 0; -	card = us122l_usb_probe(usb_get_intf(intf), id); - -	if (card) { -		usb_set_intfdata(intf, card); -		return 0; +	err = us122l_usb_probe(usb_get_intf(intf), id, &card); +	if (err < 0) { +		usb_put_intf(intf); +		return err;  	} -	usb_put_intf(intf); -	return -EIO; +	usb_set_intfdata(intf, card); +	return 0;  }  static void snd_us122l_disconnect(struct usb_interface *intf) diff --git a/sound/usb/usx2y/usX2Yhwdep.c b/sound/usb/usx2y/usX2Yhwdep.c index 1558a5c4094..a26d8d83d3e 100644 --- a/sound/usb/usx2y/usX2Yhwdep.c +++ b/sound/usb/usx2y/usX2Yhwdep.c @@ -106,16 +106,6 @@ static unsigned int snd_us428ctls_poll(struct snd_hwdep *hw, struct file *file,  } -static int snd_usX2Y_hwdep_open(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} - -static int snd_usX2Y_hwdep_release(struct snd_hwdep *hw, struct file *file) -{ -	return 0; -} -  static int snd_usX2Y_hwdep_dsp_status(struct snd_hwdep *hw,  				      struct snd_hwdep_dsp_status *info)  { @@ -267,8 +257,6 @@ int usX2Y_hwdep_new(struct snd_card *card, struct usb_device* device)  	hw->iface = SNDRV_HWDEP_IFACE_USX2Y;  	hw->private_data = usX2Y(card); -	hw->ops.open = snd_usX2Y_hwdep_open; -	hw->ops.release = snd_usX2Y_hwdep_release;  	hw->ops.dsp_status = snd_usX2Y_hwdep_dsp_status;  	hw->ops.dsp_load = snd_usX2Y_hwdep_dsp_load;  	hw->ops.mmap = snd_us428ctls_mmap; diff --git a/sound/usb/usx2y/usbusx2y.c b/sound/usb/usx2y/usbusx2y.c index 11639bd72a5..af8b8495405 100644 --- a/sound/usb/usx2y/usbusx2y.c +++ b/sound/usb/usx2y/usbusx2y.c @@ -333,18 +333,21 @@ static struct usb_device_id snd_usX2Y_usb_id_table[] = {  	{ /* terminator */ }  }; -static struct snd_card *usX2Y_create_card(struct usb_device *device) +static int usX2Y_create_card(struct usb_device *device, struct snd_card **cardp)  {  	int		dev;  	struct snd_card *	card; +	int err; +  	for (dev = 0; dev < SNDRV_CARDS; ++dev)  		if (enable[dev] && !snd_usX2Y_card_used[dev])  			break;  	if (dev >= SNDRV_CARDS) -		return NULL; -	card = snd_card_new(index[dev], id[dev], THIS_MODULE, sizeof(struct usX2Ydev)); -	if (!card) -		return NULL; +		return -ENODEV; +	err = snd_card_create(index[dev], id[dev], THIS_MODULE, +			      sizeof(struct usX2Ydev), &card); +	if (err < 0) +		return err;  	snd_usX2Y_card_used[usX2Y(card)->chip.index = dev] = 1;  	card->private_free = snd_usX2Y_card_private_free;  	usX2Y(card)->chip.dev = device; @@ -362,26 +365,36 @@ static struct snd_card *usX2Y_create_card(struct usb_device *device)  		usX2Y(card)->chip.dev->bus->busnum, usX2Y(card)->chip.dev->devnum  		);  	snd_card_set_dev(card, &device->dev); -	return card; +	*cardp = card; +	return 0;  } -static void *usX2Y_usb_probe(struct usb_device *device, struct usb_interface *intf, const struct usb_device_id *device_id) +static int usX2Y_usb_probe(struct usb_device *device, +			   struct usb_interface *intf, +			   const struct usb_device_id *device_id, +			   struct snd_card **cardp)  {  	int		err;  	struct snd_card *	card; + +	*cardp = NULL;  	if (le16_to_cpu(device->descriptor.idVendor) != 0x1604 ||  	    (le16_to_cpu(device->descriptor.idProduct) != USB_ID_US122 &&  	     le16_to_cpu(device->descriptor.idProduct) != USB_ID_US224 && -	     le16_to_cpu(device->descriptor.idProduct) != USB_ID_US428) || -	    !(card = usX2Y_create_card(device))) -		return NULL; +	     le16_to_cpu(device->descriptor.idProduct) != USB_ID_US428)) +		return -EINVAL; + +	err = usX2Y_create_card(device, &card); +	if (err < 0) +		return err;  	if ((err = usX2Y_hwdep_new(card, device)) < 0  ||  	    (err = snd_card_register(card)) < 0) {  		snd_card_free(card); -		return NULL; +		return err;  	} -	return card; +	*cardp = card; +	return 0;  }  /* @@ -389,13 +402,14 @@ static void *usX2Y_usb_probe(struct usb_device *device, struct usb_interface *in   */  static int snd_usX2Y_probe(struct usb_interface *intf, const struct usb_device_id *id)  { -	void *chip; -	chip = usX2Y_usb_probe(interface_to_usbdev(intf), intf, id); -	if (chip) { -		usb_set_intfdata(intf, chip); -		return 0; -	} else -		return -EIO; +	struct snd_card *card; +	int err; + +	err = usX2Y_usb_probe(interface_to_usbdev(intf), intf, id, &card); +	if (err < 0) +		return err; +	dev_set_drvdata(&intf->dev, card); +	return 0;  }  static void snd_usX2Y_disconnect(struct usb_interface *intf)  |