From anemo@mba.ocn.ne.jp Mon Jan  2 12:58:10 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 02 Jan 2006 12:58:30 +0000 (GMT)
Received: from mba.ocn.ne.jp ([210.190.142.172]:51429 "HELO smtp.mba.ocn.ne.jp")
	by ftp.linux-mips.org with SMTP id S8133394AbWABM6K (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 2 Jan 2006 12:58:10 +0000
Received: from localhost (p6207-ipad27funabasi.chiba.ocn.ne.jp [220.107.197.207])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP
	id AD3303953; Mon,  2 Jan 2006 22:00:23 +0900 (JST)
Date:	Mon, 02 Jan 2006 21:59:49 +0900 (JST)
Message-Id: <20060102.215949.41198615.anemo@mba.ocn.ne.jp>
To:	ralf@linux-mips.org
Cc:	dom@mips.com, macro@linux-mips.org, linux-mips@linux-mips.org
Subject: Re: ieee754[sd]p_neg workaround
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
In-Reply-To: <20050421.161945.79301612.nemoto@toshiba-tops.co.jp>
References: <16998.20933.14301.397793@arsenal.mips.com>
	<20050420131304.GF5212@linux-mips.org>
	<20050421.161945.79301612.nemoto@toshiba-tops.co.jp>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 3.3 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9763
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips

>>>>> On Thu, 21 Apr 2005 16:19:45 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> said:

>>> So file a bug against glibc, but we should fix the emulator so it
>>> correctly imitates the MIPS instruction set...

ralf> As a matter of defensive design I think we should try to follow
ralf> the establish behaviour if nothing more specific is defined
ralf> anywhere.

anemo> OK, I sent a bug reoport to glibc bugzilla. (Bug# 864)

The bug was resolved ... marked as WONTFIX.

glibc developers said math-emu should be fixed.  Please look at:

http://sourceware.org/bugzilla/show_bug.cgi?id=864

for their comments.

So I send a patch for math-emu again.

Description:

It looks glibc's pow() assume an unary '-' operation for any number
(including NaNs) always invert its sign bit (though IEEE754 does not
specify the sign bit for NaNs).  This patch make the kernel math-emu
emulates real MIPS neg.[ds] instruction.

Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>

diff --git a/arch/mips/math-emu/dp_simple.c b/arch/mips/math-emu/dp_simple.c
index 495c1ac..1c555e6 100644
--- a/arch/mips/math-emu/dp_simple.c
+++ b/arch/mips/math-emu/dp_simple.c
@@ -48,16 +48,22 @@ ieee754dp ieee754dp_neg(ieee754dp x)
 	CLEARCX;
 	FLUSHXDP;
 
+	/*
+	 * Invert the sign ALWAYS to prevent an endless recursion on
+	 * pow() in libc.
+	 */
+	/* quick fix up */
+	DPSIGN(x) ^= 1;
+
 	if (xc == IEEE754_CLASS_SNAN) {
+		ieee754dp y = ieee754dp_indef();
 		SETCX(IEEE754_INVALID_OPERATION);
-		return ieee754dp_nanxcpt(ieee754dp_indef(), "neg");
+		DPSIGN(y) = DPSIGN(x);
+		return ieee754dp_nanxcpt(y, "neg");
 	}
 
 	if (ieee754dp_isnan(x))	/* but not infinity */
 		return ieee754dp_nanxcpt(x, "neg", x);
-
-	/* quick fix up */
-	DPSIGN(x) ^= 1;
 	return x;
 }
 
diff --git a/arch/mips/math-emu/sp_simple.c b/arch/mips/math-emu/sp_simple.c
index c809830..770f0f4 100644
--- a/arch/mips/math-emu/sp_simple.c
+++ b/arch/mips/math-emu/sp_simple.c
@@ -48,16 +48,22 @@ ieee754sp ieee754sp_neg(ieee754sp x)
 	CLEARCX;
 	FLUSHXSP;
 
+	/*
+	 * Invert the sign ALWAYS to prevent an endless recursion on
+	 * pow() in libc.
+	 */
+	/* quick fix up */
+	SPSIGN(x) ^= 1;
+
 	if (xc == IEEE754_CLASS_SNAN) {
+		ieee754sp y = ieee754sp_indef();
 		SETCX(IEEE754_INVALID_OPERATION);
-		return ieee754sp_nanxcpt(ieee754sp_indef(), "neg");
+		SPSIGN(y) = SPSIGN(x);
+		return ieee754sp_nanxcpt(y, "neg");
 	}
 
 	if (ieee754sp_isnan(x))	/* but not infinity */
 		return ieee754sp_nanxcpt(x, "neg", x);
-
-	/* quick fix up */
-	SPSIGN(x) ^= 1;
 	return x;
 }
 

From matej.kupljen@ultra.si Tue Jan  3 14:23:10 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 03 Jan 2006 14:23:30 +0000 (GMT)
Received: from deliver-1.mx.triera.net ([213.161.0.31]:37331 "HELO
	deliver-1.mx.triera.net") by ftp.linux-mips.org with SMTP
	id S8133761AbWACOXI (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 3 Jan 2006 14:23:08 +0000
Received: from localhost (in-1.mx.triera.net [213.161.0.25])
	by deliver-1.mx.triera.net (Postfix) with ESMTP id 7A7EAC008;
	Tue,  3 Jan 2006 15:25:25 +0100 (CET)
Received: from smtp.triera.net (smtp.triera.net [213.161.0.30])
	by in-1.mx.triera.net (Postfix) with SMTP id 309651BC084;
	Tue,  3 Jan 2006 15:25:28 +0100 (CET)
Received: from [172.18.1.53] (unknown [213.161.20.162])
	by smtp.triera.net (Postfix) with ESMTP id 9BFBD1A18B6;
	Tue,  3 Jan 2006 15:25:27 +0100 (CET)
Subject: Re: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI)
From:	Matej Kupljen <matej.kupljen@ultra.si>
To:	Jordan Crouse <jordan.crouse@amd.com>
Cc:	linux-mips@linux-mips.org, linux-usb-devel@lists.sourceforge.net,
	matthias.lenk@amd.com
In-Reply-To: <20051208210042.GB17458@cosmic.amd.com>
References: <20051208210042.GB17458@cosmic.amd.com>
Content-Type: text/plain
Date:	Tue, 03 Jan 2006 15:25:29 +0100
Message-Id: <1136298329.6765.22.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.2.3 
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: Triera AV Service
Return-Path: <matej.kupljen@ultra.si>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9764
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: matej.kupljen@ultra.si
Precedence: bulk
X-list: linux-mips

Hi

> Ok, here we go.  I give you the OHCI/EHCI host controller support for
> the Alchemy AU1200 processor.  I'm sending this up, partly because I have
> it ready to go, but also because it seems that enough folks are getting their
> hands on AU1200 parts to make this a hot topic.  

I tried you patch, and this is what I get on 2.6.16-rc5:

[4294668.576000] Creating 3 MTD partitions on "Db1200 Flash":
[4294668.581000] 0x00000000-0x03c00000 : "User FS"
[4294668.587000] 0x03c00000-0x03d00000 : "YAMON"
[4294668.593000] 0x03d00000-0x03fc0000 : "raw kernel"
[4294668.602000] CPU 0 Unable to handle kernel paging request at virtual
address 00000008, epc == 80350764, ra == 80350760
[4294668.613000] Oops[#1]:
[4294668.613000] Cpu 0
[4294668.613000] $ 0   : 00000000 1000fc00 8054a000 00000000
[4294668.613000] $ 4   : 8054b000 00000000 00000000 8107d530
[4294668.613000] $ 8   : 00000000 802a4030 8107d520 8053d57c
[4294668.613000] $12   : ffffffff ffffffff 00100100 00200200
[4294668.613000] $16   : 8053c0d0 8053c000 00001000 80460000
[4294668.613000] $20   : 8041dcb0 00000000 00000000 00000000
[4294668.613000] $24   : 00000008 00000000                  
[4294668.613000] $28   : 804f2000 804f3e58 00000000 80350760
[4294668.613000] Hi    : 00000000
[4294668.613000] Lo    : 00000000
[4294668.613000] epc   : 80350764 ehci_init+0x190/0x2c0     Not tainted
[4294668.613000] ra    : 80350760 ehci_init+0x18c/0x2c0
[4294668.613000] Status: 1000fc03    KERNEL EXL IE 
[4294668.613000] Cause : 00800008
[4294668.613000] BadVA : 00000008
[4294668.613000] PrId  : 04030201
[4294668.613000] Modules linked in:
[4294668.613000] Process swapper (pid: 1, threadinfo=804f2000,
task=804eec00)
[4294668.613000] Stack : 8013044c 8033e100 804f2000 804f3e88 00001000
80352018 1000fc03 000301ff
[4294668.613000]         8053c000 fffffff4 8045e138 803520bc 804f3e78
804689e0 804f3ef8 811bb5c0
[4294668.613000]         00000010 00000000 8045e138 8045e140 80471cfc
8045e204 00000000 803521e0
[4294668.613000]         804f3e88 810756a0 00000000 00000000 00000000
00000000 00000000 802e3cd0
[4294668.613000]         8045e18c 804f3f30 8045e18c 8040d780 8045e140
804c0000 80471cfc 802e40a0
[4294668.613000]         ...
[4294668.613000] Call Trace:
[4294668.613000]  [<8013044c>] __request_region+0x38/0xb4
[4294668.613000]  [<8033e100>] usb_create_hcd+0x4c/0xc8
[4294668.613000]  [<80352018>] usb_ehci_au1xxx_probe+0xc0/0x1f8
[4294668.613000]  [<803520bc>] usb_ehci_au1xxx_probe+0x164/0x1f8
[4294668.613000]  [<803521e0>] ehci_hcd_au1xxx_drv_probe+0x38/0x50
[4294668.613000]  [<802e3cd0>] driver_probe_device+0x4c/0xe8
[4294668.613000]  [<8040d780>] klist_next+0x40/0x70
[4294668.613000]  [<802e40a0>] __driver_attach+0x178/0x1a0
[4294668.613000]  [<802e3f28>] __driver_attach+0x0/0x1a0
[4294668.613000]  [<802e3024>] next_device+0x10/0x28
[4294668.613000]  [<802e3f28>] __driver_attach+0x0/0x1a0
[4294668.613000]  [<802e3090>] bus_for_each_dev+0x54/0x90
[4294668.613000]  [<8029e468>] kobject_register+0x4c/0x8c
[4294668.613000]  [<802e374c>] bus_add_driver+0xa8/0x18c
[4294668.613000]  [<8027bb80>] debugfs_create_dir+0x1c/0x28
[4294668.613000]  [<802e47a4>] driver_register+0x40/0x50
[4294668.613000]  [<80100510>] init+0xac/0x2dc
[4294668.613000]  [<80105ee0>] kernel_thread_helper+0x10/0x18
[4294668.613000]  [<80105ed0>] kernel_thread_helper+0x0/0x18
[4294668.613000] 
[4294668.613000] 
[4294668.613000] Code: 0c0a8fd0  00063080  8e030000 <8c660008> 7000003f
10400046  00061102  24020008  ae020028 
[4294668.866000] Kernel panic - not syncing: Attempted to kill init!

Any ideas?

BR,
Matej


From jcrouse@cosmic.amd.com Tue Jan  3 15:47:53 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 03 Jan 2006 15:48:14 +0000 (GMT)
Received: from amdext3.amd.com ([139.95.251.6]:24726 "EHLO amdext3.amd.com")
	by ftp.linux-mips.org with ESMTP id S8133767AbWACPrx (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Tue, 3 Jan 2006 15:47:53 +0000
Received: from SSVLGW02.amd.com (ssvlgw02.amd.com [139.95.250.170])
	by amdext3.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k03FoAiA015439;
	Tue, 3 Jan 2006 07:50:13 -0800
Received: from 139.95.250.1 by SSVLGW01.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Tue, 03 Jan 2006 07:47:47 -0800
X-Server-Uuid: 89466532-923C-4A88-82C1-66ACAA0041DF
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k03FlkVP007317; Tue, 3
 Jan 2006 07:47:46 -0800 (PST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id 7C9192028; Tue, 3 Jan 2006
 08:47:46 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k03FslWV031984; Tue, 3 Jan 2006 08:54:47
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k03FslCm031983; Tue, 3 Jan 2006 08:54:47 -0700
Date:	Tue, 3 Jan 2006 08:54:47 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	"Matej Kupljen" <matej.kupljen@ultra.si>
cc:	linux-mips@linux-mips.org, linux-usb-devel@lists.sourceforge.net,
	matthias.lenk@amd.com
Subject: Re: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI)
Message-ID: <20060103155447.GI15770@cosmic.amd.com>
References: <20051208210042.GB17458@cosmic.amd.com>
 <1136298329.6765.22.camel@localhost.localdomain>
MIME-Version: 1.0
In-Reply-To: <1136298329.6765.22.camel@localhost.localdomain>
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FA443292BK1531058-01-01
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9765
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips

> I tried you patch, and this is what I get on 2.6.16-rc5:

Well, thats a fun one.  I'm assuming you tried to boot with a device
plugged in.  I'm a bit confused by the __reqest_region coming from
usb_create_hcd - I quickly glanced at the function, and I don't see anything
that would have called request_region / request_mem_region.  However,
there *is* a request_mem_region call immediately after the usb_create_hcd
call in usb_ehci_au1xxx_probe, and I wonder that might be the guilty party.

Matthias, any thoughts?
Jordan

--
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>


From matej.kupljen@ultra.si Tue Jan  3 20:39:20 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 03 Jan 2006 20:39:38 +0000 (GMT)
Received: from deliver-1.mx.triera.net ([213.161.0.31]:39556 "HELO
	deliver-1.mx.triera.net") by ftp.linux-mips.org with SMTP
	id S8133788AbWACUjU (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 3 Jan 2006 20:39:20 +0000
Received: from localhost (in-3.mx.triera.net [213.161.0.27])
	by deliver-1.mx.triera.net (Postfix) with ESMTP id 4C95FC002;
	Tue,  3 Jan 2006 21:41:35 +0100 (CET)
Received: from smtp.triera.net (smtp.triera.net [213.161.0.30])
	by in-3.mx.triera.net (Postfix) with SMTP id BC9C71BC08C;
	Tue,  3 Jan 2006 21:41:37 +0100 (CET)
Received: from orionlinux.starfleet.com (cmb58-52.dial-up.arnes.si [153.5.49.52])
	by smtp.triera.net (Postfix) with ESMTP id 2EA541A18B9;
	Tue,  3 Jan 2006 21:41:36 +0100 (CET)
Subject: Re: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI)
From:	Matej Kupljen <matej.kupljen@ultra.si>
To:	Jordan Crouse <jordan.crouse@amd.com>
Cc:	linux-mips@linux-mips.org, linux-usb-devel@lists.sourceforge.net,
	matthias.lenk@amd.com
In-Reply-To: <20060103155447.GI15770@cosmic.amd.com>
References: <20051208210042.GB17458@cosmic.amd.com>
	 <1136298329.6765.22.camel@localhost.localdomain>
	 <20060103155447.GI15770@cosmic.amd.com>
Content-Type: text/plain
Organization: Ultra d.o.o.
Date:	Tue, 03 Jan 2006 22:45:22 +0100
Message-Id: <1136324722.12175.20.camel@orionlinux.starfleet.com>
Mime-Version: 1.0
X-Mailer: Evolution 2.2.3 
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: Triera AV Service
Return-Path: <matej.kupljen@ultra.si>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9766
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: matej.kupljen@ultra.si
Precedence: bulk
X-list: linux-mips

Hi

> > I tried you patch, and this is what I get on 2.6.16-rc5:

I meant, 2.5.15-rc5 of course, and NOT 2.6.15-rc5. Sorry.

> Well, thats a fun one.  I'm assuming you tried to boot with a device
> plugged in.  I'm a bit confused by the __reqest_region coming from
> usb_create_hcd - I quickly glanced at the function, and I don't see anything
> that would have called request_region / request_mem_region.  However,
> there *is* a request_mem_region call immediately after the usb_create_hcd
> call in usb_ehci_au1xxx_probe, and I wonder that might be the guilty party.

I set up my BDI and tried to debug this. This is what I can tell you,
and maybe you can then be able to help me:

I get past the request_mem_region and ioremap in ehci-au1xxx.c.
I get to line 144:
if ((retval = driver->reset (hcd)) < 0) {

now, driver->reset points to the 
(gdb) p driver->reset
$6 = (int (*)(struct usb_hcd *)) 0x803505d4 <ehci_init>

I step into the call and I get to ehci_init in
drivers/usb/host/ehci-hcd.c. 

If I continue, i get to the  ehci_mem_init in the
drivers/usb/host/ehci-mem.c

On line:
228  memset (ehci->pshadow, 0, ehci->periodic_size * sizeof (void *));

If I do next in gdb, I end up in include/asm-mips/io.h, line
425 BUILDIO_MEM(l, u32) 
(Well, I am lost here now)

Now if I disassemble at $pc:
(gdb) x/20i $pc
0x80350760 <ehci_init+396>:     lw      v1,0(s0)
0x80350764 <ehci_init+400>:     lw      a2,8(v1)
0x80350768 <ehci_init+404>:     andi    v0,a2,0x80
0x8035076c <ehci_init+408>:     beqz    v0,0x80350888 <ehci_init+692>
0x80350770 <ehci_init+412>:     srl     v0,a2,0x4
0x80350774 <ehci_init+416>:     li      v0,8
0x80350778 <ehci_init+420>:     sw      v0,40(s0)
0x8035077c <ehci_init+424>:     lw      v0,24(s0)
0x80350780 <ehci_init+428>:     lw      a1,16(s0)
0x80350784 <ehci_init+432>:     li      v1,-2
0x80350788 <ehci_init+436>:     and     v0,v0,v1
0x8035078c <ehci_init+440>:     li      v1,-1
0x80350790 <ehci_init+444>:     sw      v1,48(s0)
0x80350794 <ehci_init+448>:     sw      v0,24(s0)
0x80350798 <ehci_init+452>:     sw      zero,20(s0)
0x8035079c <ehci_init+456>:     sw      zero,72(a1)
0x803507a0 <ehci_init+460>:     lw      a0,16(s0)
0x803507a4 <ehci_init+464>:     li      v1,-32
0x803507a8 <ehci_init+468>:     li      a1,1
0x803507ac <ehci_init+472>:     lw      v0,68(a0)
(gdb) p $s0
$9 = 0x8053c0d0
(gdb) x/x $s0
0x8053c0d0:     0x00000000

So I guess, that the instruction at 0x80350764 is loading from location
0 and offset 8, which can be seen also in the original post:

[4294668.602000] CPU 0 Unable to handle kernel paging request at virtual
address 00000008, epc == 80350764, ra == 80350760

What is going on here?
Is this some stack corruption, because of all this strange jumps
over the source code (I know optimisation is turned on, but still).

I hope this can help someone, I still have a lot of learning
to do to figure this out.

BR,
Matej

-- 
Matej Kupljen <matej.kupljen@ultra.si>
Ultra d.o.o.


From matej.kupljen@ultra.si Wed Jan  4 07:16:04 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jan 2006 07:16:21 +0000 (GMT)
Received: from deliver-1.mx.triera.net ([213.161.0.31]:6557 "HELO
	deliver-1.mx.triera.net") by ftp.linux-mips.org with SMTP
	id S8133443AbWADHQE (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jan 2006 07:16:04 +0000
Received: from localhost (in-1.mx.triera.net [213.161.0.25])
	by deliver-1.mx.triera.net (Postfix) with ESMTP id 43256C074;
	Wed,  4 Jan 2006 08:18:28 +0100 (CET)
Received: from smtp.triera.net (smtp.triera.net [213.161.0.30])
	by in-1.mx.triera.net (Postfix) with SMTP id A26C71BC084;
	Wed,  4 Jan 2006 08:18:29 +0100 (CET)
Received: from [172.18.1.53] (unknown [213.161.20.162])
	by smtp.triera.net (Postfix) with ESMTP id 28FF11A18AD;
	Wed,  4 Jan 2006 08:18:28 +0100 (CET)
Subject: Re: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI)
From:	Matej Kupljen <matej.kupljen@ultra.si>
To:	Jordan Crouse <jordan.crouse@amd.com>
Cc:	linux-mips@linux-mips.org, linux-usb-devel@lists.sourceforge.net,
	matthias.lenk@amd.com
In-Reply-To: <1136324722.12175.20.camel@orionlinux.starfleet.com>
References: <20051208210042.GB17458@cosmic.amd.com>
	 <1136298329.6765.22.camel@localhost.localdomain>
	 <20060103155447.GI15770@cosmic.amd.com>
	 <1136324722.12175.20.camel@orionlinux.starfleet.com>
Content-Type: text/plain
Date:	Wed, 04 Jan 2006 08:18:25 +0100
Message-Id: <1136359105.27748.2.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.2.3 
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: Triera AV Service
Return-Path: <matej.kupljen@ultra.si>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9767
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: matej.kupljen@ultra.si
Precedence: bulk
X-list: linux-mips

Hi

> > > I tried you patch, and this is what I get on 2.6.16-rc5:
> 
> I meant, 2.5.15-rc5 of course, and NOT 2.6.15-rc5. Sorry.

Wov, I did it again :(
Now I said 2.5.15-rc5 :( :(

The version I am testing this on is:
2.6.15-rc5.

Sorry for all this.

BR,
Matej


From matej.kupljen@ultra.si Wed Jan  4 12:09:44 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jan 2006 12:10:02 +0000 (GMT)
Received: from deliver-1.mx.triera.net ([213.161.0.31]:19656 "HELO
	deliver-1.mx.triera.net") by ftp.linux-mips.org with SMTP
	id S8133488AbWADMJo (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jan 2006 12:09:44 +0000
Received: from localhost (in-1.mx.triera.net [213.161.0.25])
	by deliver-1.mx.triera.net (Postfix) with ESMTP id 6E894C091;
	Wed,  4 Jan 2006 13:12:07 +0100 (CET)
Received: from smtp.triera.net (smtp.triera.net [213.161.0.30])
	by in-1.mx.triera.net (Postfix) with SMTP id 14E0E1BC085;
	Wed,  4 Jan 2006 13:12:10 +0100 (CET)
Received: from [172.18.1.53] (unknown [213.161.20.162])
	by smtp.triera.net (Postfix) with ESMTP id 743181A18B0;
	Wed,  4 Jan 2006 13:12:09 +0100 (CET)
Subject: Re: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI)
From:	Matej Kupljen <matej.kupljen@ultra.si>
To:	Jordan Crouse <jordan.crouse@amd.com>
Cc:	linux-mips@linux-mips.org, linux-usb-devel@lists.sourceforge.net,
	matthias.lenk@amd.com
In-Reply-To: <20060103155447.GI15770@cosmic.amd.com>
References: <20051208210042.GB17458@cosmic.amd.com>
	 <1136298329.6765.22.camel@localhost.localdomain>
	 <20060103155447.GI15770@cosmic.amd.com>
Content-Type: text/plain
Date:	Wed, 04 Jan 2006 13:12:06 +0100
Message-Id: <1136376726.27748.32.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.2.3 
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: Triera AV Service
Return-Path: <matej.kupljen@ultra.si>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9768
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: matej.kupljen@ultra.si
Precedence: bulk
X-list: linux-mips

Hi

(After some confusion about kernel version, I think I found the
problem, sorry about that).

I used binutils 2.15 and 2.16.1, but did not work.

The code in the ehci-hcd.c looks like this:
----------------------------------------------------------------------------
	ehci->periodic_size = DEFAULT_I_TDPS;
	if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0)
		return retval;

	/* controllers may cache some of the periodic schedule ... */
	hcc_params = readl(&ehci->caps->hcc_params);
	if (HCC_ISOC_CACHE(hcc_params)) 	// full frame cache
		ehci->i_thresh = 8;
	else					// N microframes cached
		ehci->i_thresh = 2 + HCC_ISOC_THRES(hcc_params);
----------------------------------------------------------------------------

The problem is *AFTER* the call to ehci_mem_init, where a read from
ehci->caps->hcc_params is attempted, but caps is NULL.

This can be seen by this assembly code form Insight:
----------------------------------------------------------------------------
0x80350758	jal	0x802a3f40 <memset>
0x8035075c	sll	a2,a2,0x2
0x80350760	lw	v1,0(s0)
0x80350764	lw	a2,8(v1)

s0 points to ehci
at offset 0 from ehci is caps
and at offset 8 from caps is hcc_params
----------------------------------------------------------------------------

Where should the caps be initialized?
The only place, where it is set in drivers/usb/ is in
drivers/usb/host/ehci-pci.c:
----------------------------------------------------------------------------
/* called during probe() after chip reset completes */
static int ehci_pci_setup(struct usb_hcd *hcd)
{
        struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
        struct pci_dev          *pdev =
to_pci_dev(hcd->self.controller);
        u32                     temp;
        int                     retval;

        ehci->caps = hcd->regs;
----------------------------------------------------------------------------
But the ehci-pci.c is not included in the compilation, because at the
end of ehci-hcd.c we find:
----------------------------------------------------------------------------
#if defined(CONFIG_SOC_AU1X00)
#include "ehci-au1xxx.c"
#elif defined(CONFIG_PCI)
#include "ehci-pci.c"
#else
#error "missing bus glue for ehci-hcd"
#endif
----------------------------------------------------------------------------

What should be done?
I hope this helps.

BR,
Matej


From matthias.lenk@amd.com Wed Jan  4 12:32:06 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jan 2006 12:32:24 +0000 (GMT)
Received: from amdext3.amd.com ([139.95.251.6]:11444 "EHLO amdext3.amd.com")
	by ftp.linux-mips.org with ESMTP id S8133488AbWADMcG (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Wed, 4 Jan 2006 12:32:06 +0000
Received: from SSVLGW01.amd.com (ssvlgw01.amd.com [139.95.250.169])
	by amdext3.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k04CYVc7017371;
	Wed, 4 Jan 2006 04:34:31 -0800
Received: from 163.181.250.1 by SSVLGW01.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Wed, 04 Jan 2006 04:32:21 -0800
X-Server-Uuid: 89466532-923C-4A88-82C1-66ACAA0041DF
Received: from elbe.amd.com (elbe.amd.com [172.20.31.2]) by
 amdint2.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k04CWHh5023833; Wed,
 4 Jan 2006 06:32:18 -0600 (CST)
Received: from bobritzsch.amd.com by elbe.amd.com (8.8.8+Sun/AMD-S-2.0)
 id NAA29633; Wed, 4 Jan 2006 13:32:17 +0100 (MET)
From:	"Matthias Lenk" <matthias.lenk@amd.com>
Reply-to: matthias.lenk@amd.com
Organization: AMD
To:	"Matej Kupljen" <matej.kupljen@ultra.si>
Subject: Re: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI)
Date:	Wed, 4 Jan 2006 13:32:15 +0100
User-Agent: KMail/1.8.2
cc:	"Jordan Crouse" <jordan.crouse@amd.com>, linux-mips@linux-mips.org,
	linux-usb-devel@lists.sourceforge.net
References: <20051208210042.GB17458@cosmic.amd.com>
 <20060103155447.GI15770@cosmic.amd.com>
 <1136376726.27748.32.camel@localhost.localdomain>
In-Reply-To: <1136376726.27748.32.camel@localhost.localdomain>
MIME-Version: 1.0
Message-ID: <200601041332.16043.matthias.lenk@amd.com>
X-WSS-ID: 6FA51FDE2BK1886933-01-01
Content-Type: text/plain;
 charset=utf-8
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Return-Path: <matthias.lenk@amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9769
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: matthias.lenk@amd.com
Precedence: bulk
X-list: linux-mips

Hi Matej ,

I looked into the issue and came to the same conclusions as you. Something 
significant has changed from 2.6.15rc2 (what the patch was made for) to 
2.6.15rc5. I added the initialization of the caps and regs fields of the ehci 
structure to the probe function in ehci-au1xxx.c. The driver doesn't crash 
anymore but does not work either.

I also tried the Au1xxx OHCI and it hangs while loading the module with rc7. 
So it'll probably take some time to port the Au1200 EHCI and OHCI drivers to 
2.6.15rc7 (again!). 

Any hints on what has changed are appreciated.

Thanks,

Matthias

On Wednesday 04 January 2006 13:12, Matej Kupljen wrote:
> Hi
>
> (After some confusion about kernel version, I think I found the
> problem, sorry about that).
>
> I used binutils 2.15 and 2.16.1, but did not work.
>
> The code in the ehci-hcd.c looks like this:
> ---------------------------------------------------------------------------
>- ehci->periodic_size = DEFAULT_I_TDPS;
> 	if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0)
> 		return retval;
>
> 	/* controllers may cache some of the periodic schedule ... */
> 	hcc_params = readl(&ehci->caps->hcc_params);
> 	if (HCC_ISOC_CACHE(hcc_params)) 	// full frame cache
> 		ehci->i_thresh = 8;
> 	else					// N microframes cached
> 		ehci->i_thresh = 2 + HCC_ISOC_THRES(hcc_params);
> ---------------------------------------------------------------------------
>-
>
> The problem is *AFTER* the call to ehci_mem_init, where a read from
> ehci->caps->hcc_params is attempted, but caps is NULL.
>
> This can be seen by this assembly code form Insight:
> ---------------------------------------------------------------------------
>- 0x80350758	jal	0x802a3f40 <memset>
> 0x8035075c	sll	a2,a2,0x2
> 0x80350760	lw	v1,0(s0)
> 0x80350764	lw	a2,8(v1)
>
> s0 points to ehci
> at offset 0 from ehci is caps
> and at offset 8 from caps is hcc_params
> ---------------------------------------------------------------------------
>-
>
> Where should the caps be initialized?
> The only place, where it is set in drivers/usb/ is in
> drivers/usb/host/ehci-pci.c:
> ---------------------------------------------------------------------------
>- /* called during probe() after chip reset completes */
> static int ehci_pci_setup(struct usb_hcd *hcd)
> {
>         struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
>         struct pci_dev          *pdev =
> to_pci_dev(hcd->self.controller);
>         u32                     temp;
>         int                     retval;
>
>         ehci->caps = hcd->regs;
> ---------------------------------------------------------------------------
>- But the ehci-pci.c is not included in the compilation, because at the end
> of ehci-hcd.c we find:
> ---------------------------------------------------------------------------
>- #if defined(CONFIG_SOC_AU1X00)
> #include "ehci-au1xxx.c"
> #elif defined(CONFIG_PCI)
> #include "ehci-pci.c"
> #else
> #error "missing bus glue for ehci-hcd"
> #endif
> ---------------------------------------------------------------------------
>-
>
> What should be done?
> I hope this helps.
>
> BR,
> Matej


From satheshbabu.edara@analog.com Wed Jan  4 12:48:23 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jan 2006 12:48:41 +0000 (GMT)
Received: from nwd2mail3.analog.com ([137.71.25.52]:39598 "EHLO
	nwd2mail3.analog.com") by ftp.linux-mips.org with ESMTP
	id S8133488AbWADMsX (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jan 2006 12:48:23 +0000
Received: from nwd2mhb2.analog.com (nwd2mhb2.analog.com [137.71.6.12])
	by nwd2mail3.analog.com (8.12.10/8.12.10) with ESMTP id k04CoxHU017592;
	Wed, 4 Jan 2006 07:50:59 -0500
Received: from lilac.hdcindia.analog.com ([10.121.13.31])
	by nwd2mhb2.analog.com (8.9.3 (PHNE_28810+JAGae91741)/8.9.3) with ESMTP id HAA15593;
	Wed, 4 Jan 2006 07:50:51 -0500 (EST)
Received: from SEdaraL01 ([10.121.13.96])
	by lilac.hdcindia.analog.com (8.12.10+Sun/8.12.10) with ESMTP id k04CoGaZ025481;
	Wed, 4 Jan 2006 18:20:17 +0530 (IST)
Message-Id: <200601041250.k04CoGaZ025481@lilac.hdcindia.analog.com>
From:	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>
To:	<linux-mips-bounce@linux-mips.org>, <linux-mips@linux-mips.org>
Subject: 
Date:	Wed, 4 Jan 2006 18:20:45 +0530
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit
X-Mailer: Microsoft Office Outlook, Build 11.0.6353
In-Reply-To: <1136324722.12175.20.camel@orionlinux.starfleet.com>
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
Thread-Index: AcYQpiusjPo1a8yfR1inJpoGQLVGMgAgcRZA
X-Scanned-By: MIMEDefang 2.49 on 137.71.25.52
Return-Path: <satheshbabu.edara@analog.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9770
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: satheshbabu.edara@analog.com
Precedence: bulk
X-list: linux-mips

 

Hi,
   We have ported linux-2.6.12 kernel onto MIPS processor (LX4189) and the
processor speed is 200Mhz.
By default Linux-2.6.12 kernel comes with HZ value 1000.Will this HZ value
cause an overhead on the 200MHZ CPU.Can someone advise me on whether going
back to HZ vaule of 100 like Linux-2.4 will reduce the overhead on this
CPU.What are the side effects this change can cause?.

Regards,
Sathesh 


From kevink@mips.com Wed Jan  4 13:02:38 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jan 2006 13:02:55 +0000 (GMT)
Received: from 209-232-97-206.ded.pacbell.net ([209.232.97.206]:3292 "EHLO
	dns0.mips.com") by ftp.linux-mips.org with ESMTP id S8133500AbWADNCi
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jan 2006 13:02:38 +0000
Received: from mercury.mips.com (sbcns-dmz [209.232.97.193])
	by dns0.mips.com (8.12.11/8.12.11) with ESMTP id k04D4kml013356;
	Wed, 4 Jan 2006 05:04:47 -0800 (PST)
Received: from [192.168.236.16] (grendel [192.168.236.16])
	by mercury.mips.com (8.12.9/8.12.11) with ESMTP id k04D4iJq010899;
	Wed, 4 Jan 2006 05:04:45 -0800 (PST)
Message-ID: <43BBC85C.4040405@mips.com>
Date:	Wed, 04 Jan 2006 14:06:36 +0100
From:	"Kevin D. Kissell" <kevink@mips.com>
User-Agent: Thunderbird 1.5 (X11/20051025)
MIME-Version: 1.0
To:	Sathesh Babu Edara <satheshbabu.edara@analog.com>
CC:	linux-mips-bounce@linux-mips.org, linux-mips@linux-mips.org
Subject: Re: 
References: <200601041250.k04CoGaZ025481@lilac.hdcindia.analog.com>
In-Reply-To: <200601041250.k04CoGaZ025481@lilac.hdcindia.analog.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.39
Return-Path: <kevink@mips.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9771
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: kevink@mips.com
Precedence: bulk
X-list: linux-mips

Sathesh Babu Edara wrote:
>  
> 
> Hi,
>    We have ported linux-2.6.12 kernel onto MIPS processor (LX4189) and the
> processor speed is 200Mhz.
> By default Linux-2.6.12 kernel comes with HZ value 1000.Will this HZ value
> cause an overhead on the 200MHZ CPU.Can someone advise me on whether going
> back to HZ vaule of 100 like Linux-2.4 will reduce the overhead on this
> CPU.What are the side effects this change can cause?.

The 1000Hz clock should not actually cause any problems with a 200MHz
CPU, but it will suck up an annoyingly high percentage of available
cycles. Backing off to 100Hz may cause some degradation of some
real-time/interactive response times, but the improved overall
performance will probably more than make up for it.  I never build
with a HZ value greater than 100 these days, but then again, I'm
mostly running on FPGAs and other hardware emulators where the CPU
clock frequencies may be less than 1MHz, and are never more than 33MHz.
Note that a HZ  value of less than 100 may cause some kernel macros
to generate divide-by-zero operations/exceptions.

		Regards,

		Kevin K.


From matej.kupljen@ultra.si Wed Jan  4 13:05:28 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jan 2006 13:05:46 +0000 (GMT)
Received: from deliver-1.mx.triera.net ([213.161.0.31]:36817 "HELO
	deliver-1.mx.triera.net") by ftp.linux-mips.org with SMTP
	id S8133500AbWADNF2 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jan 2006 13:05:28 +0000
Received: from localhost (in-3.mx.triera.net [213.161.0.27])
	by deliver-1.mx.triera.net (Postfix) with ESMTP id E3C8EC089;
	Wed,  4 Jan 2006 14:07:51 +0100 (CET)
Received: from smtp.triera.net (smtp.triera.net [213.161.0.30])
	by in-3.mx.triera.net (Postfix) with SMTP id 739561BC08D;
	Wed,  4 Jan 2006 14:07:54 +0100 (CET)
Received: from [172.18.1.53] (unknown [213.161.20.162])
	by smtp.triera.net (Postfix) with ESMTP id 10C351A18B3;
	Wed,  4 Jan 2006 14:07:55 +0100 (CET)
Subject: Re: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI)
From:	Matej Kupljen <matej.kupljen@ultra.si>
To:	matthias.lenk@amd.com
Cc:	Jordan Crouse <jordan.crouse@amd.com>, linux-mips@linux-mips.org,
	linux-usb-devel@lists.sourceforge.net
In-Reply-To: <200601041332.16043.matthias.lenk@amd.com>
References: <20051208210042.GB17458@cosmic.amd.com>
	 <20060103155447.GI15770@cosmic.amd.com>
	 <1136376726.27748.32.camel@localhost.localdomain>
	 <200601041332.16043.matthias.lenk@amd.com>
Content-Type: text/plain
Date:	Wed, 04 Jan 2006 14:07:51 +0100
Message-Id: <1136380071.27748.49.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.2.3 
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: Triera AV Service
Return-Path: <matej.kupljen@ultra.si>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9772
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: matej.kupljen@ultra.si
Precedence: bulk
X-list: linux-mips

Hi

> I looked into the issue and came to the same conclusions as you. Something 
> significant has changed from 2.6.15rc2 (what the patch was made for) to 
> 2.6.15rc5. I added the initialization of the caps and regs fields of the ehci 
> structure to the probe function in ehci-au1xxx.c. The driver doesn't crash 
> anymore but does not work either.

Where did you put it?
I don't know much about USB, but by looking into the ehci-pci.c I added
this to the ehci-au1xxx.c, after ioremap of hcd->regs:

ehci = hcd_to_ehci(hcd);
ehci->caps = hcd->regs;
ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase));

Is this O.K.?

Now, with this I get:

[4294668.620000] au1xxx-ehci au1xxx-ehci.0: Au1xxx EHCI
[4294668.626000] au1xxx-ehci au1xxx-ehci.0: new USB bus registered,
assigned bus number 1
[4294668.634000] au1xxx-ehci au1xxx-ehci.0: irq 29, io mem 0x14020200
[4294668.640000] au1xxx-ehci au1xxx-ehci.0: USB 0.0 started, EHCI 1.00,
driver 10 Dec 2004
[4294668.649000] hub 1-0:1.0: USB hub found
[4294668.653000] hub 1-0:1.0: 0 ports detected
[4294668.762000] au1xxx-ohci au1xxx-ohci.0: Au1xxx OHCI
[4294668.767000] au1xxx-ohci au1xxx-ohci.0: new USB bus registered,
assigned bus number 2
[4294668.775000] au1xxx-ohci au1xxx-ohci.0: irq 29, io mem 0x14020100
[4294678.361000] BUG: soft lockup detected on CPU#0!
[4294678.361000] Cpu 0
[4294678.361000] $ 0   : 00000000 1000fc01 807c856c 807c856c
[4294678.361000] $ 4   : 807c8570 80721710 00000000 b4020100
[4294678.361000] $ 8   : 80000000 802a4030 00000000 8045a000
[4294678.361000] $12   : 80721108 fffffffb ffffffff 0000000a
[4294678.361000] $16   : 807214d0 80721400 80721400 80470000
[4294678.361000] $20   : 00000002 804c0000 24000000 0000001d
[4294678.361000] $24   : 00000018 81281d51                  
[4294678.361000] $28   : 81280000 81281e28 00000000 80355484
[4294678.361000] Hi    : 000301ff
[4294678.361000] Lo    : fc85b000
[4294678.361000] epc   : 80139c78 notifier_chain_register+0x18/0x54
Not tainted
[4294678.361000] ra    : 80355484 ohci_au1xxx_start+0x644/0x678
[4294678.361000] Status: 1000fc03    KERNEL EXL IE 
[4294678.361000] Cause : 00808000
[4294678.361000] PrId  : 04030201

Well, a little further :(

> I also tried the Au1xxx OHCI and it hangs while loading the module with rc7. 
> So it'll probably take some time to port the Au1200 EHCI and OHCI drivers to 
> 2.6.15rc7 (again!). 

I think Bora Sahin said he used OHCI successfully on 2.5.15-rc4.
Bora, can you confirm this?

> Any hints on what has changed are appreciated.

I disabled EHCI in .config and tried again. This is what I got:

[4294668.621000] au1xxx-ohci au1xxx-ohci.0: Au1xxx OHCI
[4294668.626000] au1xxx-ohci au1xxx-ohci.0: new USB bus registered,
assigned bus number 1
[4294668.635000] au1xxx-ohci au1xxx-ohci.0: irq 29, io mem 0x14020100
[4294668.725000] hub 1-0:1.0: USB hub found
[4294668.729000] hub 1-0:1.0: 2 ports detected

When I plug in USB 2.0 Flash key (with the vfat module lodaed):

/root # [4294868.810000] usb 1-1: new full speed USB device using
au1xxx-ohci and address 2
[4294877.045000] kobject_register failed for usbcore (-17)
[4294877.050000] Call Trace:
[4294877.053000]  [<8029e490>] kobject_register+0x74/0x8c
[4294877.058000]  [<8029e440>] kobject_register+0x24/0x8c
[4294877.063000]  [<8014c070>] load_module+0xec4/0x1810
[4294877.068000]  [<8014c04c>] load_module+0xea0/0x1810
[4294877.073000]  [<80206ed4>] do_setlk+0x1cc/0x40c
[4294877.078000]  [<801640f8>] vma_prio_tree_insert+0x28/0x5c
[4294877.084000]  [<8016ae64>] __vma_link+0x34/0x80
[4294877.089000]  [<801533d8>] generic_file_mmap+0x68/0x70
[4294877.094000]  [<8016af40>] vma_link+0x90/0x160
[4294877.099000]  [<8016aef0>] vma_link+0x40/0x160
[4294877.103000]  [<8014cab4>] sys_init_module+0xd0/0x890
[4294877.108000]  [<8010daac>] stack_done+0x20/0x40
[4294877.113000] 
[4294878.449000] Initializing USB Mass Storage driver...
[4294878.508000] scsi0 : SCSI emulation for USB Mass Storage devices
[4294878.606000] usbcore: registered new driver usb-storage
[4294878.612000] USB Mass Storage support registered.
[4294883.623000]   Vendor: Generic   Model: STORAGE DEVICE    Rev: 1.04
[4294883.630000]   Type:   Direct-Access                      ANSI SCSI
revision: 00
[4294883.913000] SCSI device sda: 256000 512-byte hdwr sectors (131 MB)
[4294883.928000] sda: Write Protect is on
[4294883.932000] sda: assuming drive cache: write through
[4294883.965000] SCSI device sda: 256000 512-byte hdwr sectors (131 MB)
[4294883.980000] sda: Write Protect is on
[4294883.984000] sda: assuming drive cache: write through
[4294883.989000]  sda: sda1
[4294884.005000] sd 0:0:0:0: Attached scsi removable disk sda
[4294884.028000] sd 0:0:0:0: Attached scsi generic sg0 type 0

And I can mount /dev/sda1.
I'll try with only EHCI now, then I'll look into this
kobject_register.

BR,
Matej


From bora.sahin@ttnet.net.tr Wed Jan  4 13:51:57 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jan 2006 13:52:16 +0000 (GMT)
Received: from neptune.nocserver.net ([209.59.140.34]:43173 "EHLO
	neptune.nocserver.net") by ftp.linux-mips.org with ESMTP
	id S8133503AbWADNv5 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jan 2006 13:51:57 +0000
Received: from [81.214.210.213] (port=32805 helo=boras)
	by neptune.nocserver.net with esmtpsa (TLSv1:RC4-MD5:128)
	(Exim 4.52)
	id 1Eu95V-0002jU-M9; Wed, 04 Jan 2006 08:54:02 -0500
From:	bora.sahin@ttnet.net.tr
To:	Matej Kupljen <matej.kupljen@ultra.si>
Subject: Re: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI)
Date:	Wed, 4 Jan 2006 15:54:29 +0200
User-Agent: KMail/1.7.2
Cc:	matthias.lenk@amd.com, Jordan Crouse <jordan.crouse@amd.com>,
	linux-mips@linux-mips.org, linux-usb-devel@lists.sourceforge.net
References: <20051208210042.GB17458@cosmic.amd.com> <200601041332.16043.matthias.lenk@amd.com> <1136380071.27748.49.camel@localhost.localdomain>
In-Reply-To: <1136380071.27748.49.camel@localhost.localdomain>
MIME-Version: 1.0
Content-Type: text/plain;
  charset="Iso-8859-9"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200601041554.29497.bora.sahin@ttnet.net.tr>
X-AntiAbuse: This header was added to track abuse, please include it with any abuse report
X-AntiAbuse: Primary Hostname - neptune.nocserver.net
X-AntiAbuse: Original Domain - linux-mips.org
X-AntiAbuse: Originator/Caller UID/GID - [0 0] / [47 12]
X-AntiAbuse: Sender Address Domain - ttnet.net.tr
X-Source: 
X-Source-Args: 
X-Source-Dir: 
Return-Path: <bora.sahin@ttnet.net.tr>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9773
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: bora.sahin@ttnet.net.tr
Precedence: bulk
X-list: linux-mips

Hi,

> I think Bora Sahin said he used OHCI successfully on 2.5.15-rc4.
> Bora, can you confirm this?

Yes, it works both in my version of patch and Jordan's...

But my kernel version is 
	#define UTS_RELEASE "2.6.15-rc4-g2b269cc6"
not 2.5.15-rc4

--
Bora SAHIN

From matej.kupljen@ultra.si Wed Jan  4 14:15:18 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jan 2006 14:15:36 +0000 (GMT)
Received: from deliver-1.mx.triera.net ([213.161.0.31]:52954 "HELO
	deliver-1.mx.triera.net") by ftp.linux-mips.org with SMTP
	id S8133500AbWADOPS (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jan 2006 14:15:18 +0000
Received: from localhost (in-1.mx.triera.net [213.161.0.25])
	by deliver-1.mx.triera.net (Postfix) with ESMTP id E0F3BC090;
	Wed,  4 Jan 2006 15:17:41 +0100 (CET)
Received: from smtp.triera.net (smtp.triera.net [213.161.0.30])
	by in-1.mx.triera.net (Postfix) with SMTP id 82BC51BC07F;
	Wed,  4 Jan 2006 15:17:45 +0100 (CET)
Received: from [172.18.1.53] (unknown [213.161.20.162])
	by smtp.triera.net (Postfix) with ESMTP id 366331A18B1;
	Wed,  4 Jan 2006 15:17:45 +0100 (CET)
Subject: Re: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI)
From:	Matej Kupljen <matej.kupljen@ultra.si>
To:	bora.sahin@ttnet.net.tr
Cc:	matthias.lenk@amd.com, Jordan Crouse <jordan.crouse@amd.com>,
	linux-mips@linux-mips.org, linux-usb-devel@lists.sourceforge.net
In-Reply-To: <200601041554.29497.bora.sahin@ttnet.net.tr>
References: <20051208210042.GB17458@cosmic.amd.com>
	 <200601041332.16043.matthias.lenk@amd.com>
	 <1136380071.27748.49.camel@localhost.localdomain>
	 <200601041554.29497.bora.sahin@ttnet.net.tr>
Content-Type: text/plain
Date:	Wed, 04 Jan 2006 15:17:42 +0100
Message-Id: <1136384262.27748.52.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.2.3 
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: Triera AV Service
Return-Path: <matej.kupljen@ultra.si>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9774
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: matej.kupljen@ultra.si
Precedence: bulk
X-list: linux-mips

Hi

> > I think Bora Sahin said he used OHCI successfully on 2.5.15-rc4.
> > Bora, can you confirm this?
> 
> Yes, it works both in my version of patch and Jordan's...
> 
> But my kernel version is 
> 	#define UTS_RELEASE "2.6.15-rc4-g2b269cc6"
> not 2.5.15-rc4

Yes, I meant the right one: 2.6.15-rc4
(I don't know what is wrong with me and those kernel versions).

So, there was some change between rc4 and rc5, that 
broke USB on Alchemey?

BR,
Matej


From matej.kupljen@ultra.si Wed Jan  4 21:21:27 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 04 Jan 2006 21:21:47 +0000 (GMT)
Received: from deliver-1.mx.triera.net ([213.161.0.31]:31900 "HELO
	deliver-1.mx.triera.net") by ftp.linux-mips.org with SMTP
	id S8133540AbWADVV1 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 4 Jan 2006 21:21:27 +0000
Received: from localhost (in-1.mx.triera.net [213.161.0.25])
	by deliver-1.mx.triera.net (Postfix) with ESMTP id 6D740C0B5;
	Wed,  4 Jan 2006 22:23:44 +0100 (CET)
Received: from smtp.triera.net (smtp.triera.net [213.161.0.30])
	by in-1.mx.triera.net (Postfix) with SMTP id 09C1C1BC07F;
	Wed,  4 Jan 2006 22:23:50 +0100 (CET)
Received: from orionlinux.starfleet.com (cmb58-52.dial-up.arnes.si [153.5.49.52])
	by smtp.triera.net (Postfix) with ESMTP id 9E92E1A18B6;
	Wed,  4 Jan 2006 22:23:49 +0100 (CET)
Subject: Re: smc91x support
From:	Matej Kupljen <matej.kupljen@ultra.si>
To:	ppopov@embeddedalley.com
Cc:	"'linux-mips@linux-mips.org'" <linux-mips@linux-mips.org>
In-Reply-To: <1131636585.4890.14.camel@localhost.localdomain>
References: <1131634331.18165.30.camel@localhost.localdomain>
	 <1131636585.4890.14.camel@localhost.localdomain>
Content-Type: text/plain
Organization: Ultra d.o.o.
Date:	Wed, 04 Jan 2006 22:23:52 +0100
Message-Id: <1136409832.11317.54.camel@orionlinux.starfleet.com>
Mime-Version: 1.0
X-Mailer: Evolution 2.2.3 
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: Triera AV Service
Return-Path: <matej.kupljen@ultra.si>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9776
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: matej.kupljen@ultra.si
Precedence: bulk
X-list: linux-mips
Content-Length: 386
Lines: 18

Hi 

> > smc91x platform support; requires patch to smc91x.h which was sent
> >         upstream.
> > 
> > Any news about this?
> > What is the patch required for smc91x.h?
> 
> I have to check with Nicolas Pitre.

Pete, did you see this:
http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2006-January/033064.html

Will it work for MIPS and especially for DBAU12100?

BR,
Matej


From ppopov@embeddedalley.com Thu Jan  5 02:40:06 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Thu, 05 Jan 2006 02:40:26 +0000 (GMT)
Received: from smtp101.biz.mail.mud.yahoo.com ([68.142.200.236]:35205 "HELO
	smtp101.biz.mail.mud.yahoo.com") by ftp.linux-mips.org with SMTP
	id S3465743AbWAECkF (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Thu, 5 Jan 2006 02:40:05 +0000
Received: (qmail 61472 invoked from network); 5 Jan 2006 02:42:29 -0000
Received: from unknown (HELO ?192.168.1.102?) (ppopov@embeddedalley.com@63.194.214.47 with plain)
  by smtp101.biz.mail.mud.yahoo.com with SMTP; 5 Jan 2006 02:42:29 -0000
Subject: Re: smc91x support
From:	Pete Popov <ppopov@embeddedalley.com>
Reply-To: ppopov@embeddedalley.com
To:	Matej Kupljen <matej.kupljen@ultra.si>
Cc:	"'linux-mips@linux-mips.org'" <linux-mips@linux-mips.org>
In-Reply-To: <1136409832.11317.54.camel@orionlinux.starfleet.com>
References: <1131634331.18165.30.camel@localhost.localdomain>
	 <1131636585.4890.14.camel@localhost.localdomain>
	 <1136409832.11317.54.camel@orionlinux.starfleet.com>
Content-Type: text/plain
Organization: Embedded Alley Solutions, Inc
Date:	Wed, 04 Jan 2006 18:42:28 -0800
Message-Id: <1136428948.8379.2.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.4.1 
Content-Transfer-Encoding: 7bit
Return-Path: <ppopov@embeddedalley.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9777
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ppopov@embeddedalley.com
Precedence: bulk
X-list: linux-mips
Content-Length: 643
Lines: 22

On Wed, 2006-01-04 at 22:23 +0100, Matej Kupljen wrote:
> Hi 
> 
> > > smc91x platform support; requires patch to smc91x.h which was sent
> > >         upstream.
> > > 
> > > Any news about this?
> > > What is the patch required for smc91x.h?
> > 
> > I have to check with Nicolas Pitre.
> 
> Pete, did you see this:
> http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2006-January/033064.html
> 
> Will it work for MIPS and especially for DBAU12100?

Someone has to try it and send Nicolas an incremental patch if it
doesn't work for the dbau1200.  I have a dbau1200 so I'll try it at some
point but Jordan might beat me to it.

Pete


From matej.kupljen@ultra.si Thu Jan  5 13:24:28 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Thu, 05 Jan 2006 13:24:46 +0000 (GMT)
Received: from deliver-1.mx.triera.net ([213.161.0.31]:52106 "HELO
	deliver-1.mx.triera.net") by ftp.linux-mips.org with SMTP
	id S8133529AbWAENY2 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Thu, 5 Jan 2006 13:24:28 +0000
Received: from localhost (in-2.mx.triera.net [213.161.0.26])
	by deliver-1.mx.triera.net (Postfix) with ESMTP id 5D37FC0EF;
	Thu,  5 Jan 2006 14:26:58 +0100 (CET)
Received: from smtp.triera.net (smtp.triera.net [213.161.0.30])
	by in-2.mx.triera.net (Postfix) with SMTP id D8C301BC08E;
	Thu,  5 Jan 2006 14:26:59 +0100 (CET)
Received: from [172.18.1.53] (unknown [213.161.20.162])
	by smtp.triera.net (Postfix) with ESMTP id C7F191A18B4;
	Thu,  5 Jan 2006 14:26:59 +0100 (CET)
Subject: ALCHEMY:  AU1200 USB Host Controller (OHCI/EHCI) PROGRESS
From:	Matej Kupljen <matej.kupljen@ultra.si>
To:	Jordan Crouse <jordan.crouse@amd.com>
Cc:	linux-usb-devel@lists.sourceforge.net, matthias.lenk@amd.com,
	linux-mips@linux-mips.org
Content-Type: text/plain
Date:	Thu, 05 Jan 2006 14:26:52 +0100
Message-Id: <1136467612.6378.15.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.2.3 
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: Triera AV Service
Return-Path: <matej.kupljen@ultra.si>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9778
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: matej.kupljen@ultra.si
Precedence: bulk
X-list: linux-mips
Content-Length: 4655
Lines: 98

Hi

Made some progress in the AU1200 USB OHCI/EHCI.

Previously, if both were selected we got:
------------------------------------------------------------------------
[4294669.339000] au1xxx-ehci au1xxx-ehci.0: Au1xxx EHCI
[4294669.347000] au1xxx-ehci au1xxx-ehci.0: new USB bus registered,
assigned bus number 1
[4294669.355000] au1xxx-ehci au1xxx-ehci.0: irq 29, io mem 0x14020200
[4294669.361000] au1xxx-ehci au1xxx-ehci.0: USB 0.0 started, EHCI 1.00,
driver 10 Dec 2004
[4294669.374000] hub 1-0:1.0: USB hub found
[4294669.378000] hub 1-0:1.0: 0 ports detected
[4294669.488000] au1xxx-ohci au1xxx-ohci.0: Au1xxx OHCI
[4294669.495000] au1xxx-ohci au1xxx-ohci.0: new USB bus registered,
assigned bus number 2
[4294669.504000] au1xxx-ohci au1xxx-ohci.0: irq 29, io mem 0x14020100
[4294679.372000] BUG: soft lockup detected on CPU#0!
[4294679.372000] Cpu 0
[4294679.372000] $ 0   : 00000000 1000fc01 8f6278bc 8f6278bc
[4294679.372000] $ 4   : 00000000 804471d0 00030200 80000000
[4294679.372000] $ 8   : 00000000 802b1df0 00000000 8046e000
[4294679.372000] $12   : 8f63b610 fffffffb ffffffff 0000000a
[4294679.372000] $16   : 8f6278c0 8f63bbe4 80470000 8f63b8c4
[4294679.372000] $20   : 00000002 804e0000 0000001d 24000000
[4294679.372000] $24   : 00000018 00000000                  
[4294679.372000] $28   : 80524000 80525df0 00000000 8013aa48
[4294679.372000] Hi    : 000301ff
[4294679.372000] Lo    : fc85b000
[4294679.372000] epc   : 8013aa68 notifier_chain_register+0x48/0xb8
Not tainted
[4294679.372000] ra    : 8013aa48 notifier_chain_register+0x28/0xb8
[4294679.372000] Status: 1000fc03    KERNEL EXL IE 
[4294679.372000] Cause : 00808000
[4294679.372000] PrId  : 04030201
------------------------------------------------------------------------

The problem was in the ehci-au1xxx.c in usb_ehci_au1xxx_probe before the
call to usb_add_hcd the driver called driver->reset (hcd). 
Reset points to ehci_init which at the end of function calls:
register_reboot_notifier(&ehci->reboot_notifier);

After that the usb_ehci_au1xxx_probe calls usb_add_hcd which *AGAIN*
calls ehci_init *AND* register_reboot_notifer and thus creating
reboot_notifier_list->next pointing to reboot_notifier_list!
------------------------------------------------------------------------
If I remove a call to reset, I get:
[4294669.337000] au1xxx-ehci au1xxx-ehci.0: Au1xxx EHCI
[4294669.344000] au1xxx-ehci au1xxx-ehci.0: new USB bus registered,
assigned bus number 1
[4294669.352000] au1xxx-ehci au1xxx-ehci.0: irq 29, io mem 0x14020200
[4294669.359000] au1xxx-ehci au1xxx-ehci.0: USB 0.0 started, EHCI 1.00,
driver 10 Dec 2004
[4294669.371000] hub 1-0:1.0: USB hub found
[4294669.375000] hub 1-0:1.0: 0 ports detected
[4294669.486000] au1xxx-ohci au1xxx-ohci.0: Au1xxx OHCI
[4294669.493000] au1xxx-ohci au1xxx-ohci.0: new USB bus registered,
assigned bus number 2
[4294669.502000] au1xxx-ohci au1xxx-ohci.0: irq 29, io mem 0x14020100
[4294669.595000] hub 2-0:1.0: USB hub found
[4294669.599000] hub 2-0:1.0: 2 ports detected
------------------------------------------------------------------------

But it still does not work right. If I plug in USB 2.0 memory
stick, I get:
------------------------------------------------------------------------
/root # [4294699.429000] usb 2-1: new full speed USB device using
au1xxx-ohci and address 2
[4294699.438000] au1xxx-ehci au1xxx-ehci.0: fatal error
[4294699.438000] au1xxx-ehci au1xxx-ehci.0: HC died; cleaning up
[4294699.579000] usb 2-1: not running at top speed; connect to a high
speed hub
[4294709.001000] Initializing USB Mass Storage driver...
[4294709.077000] scsi0 : SCSI emulation for USB Mass Storage devices
[4294709.251000] usbcore: registered new driver usb-storage
[4294709.257000] USB Mass Storage support registered.
[4294714.269000]   Vendor: Generic   Model: STORAGE DEVICE    Rev: 1.04
[4294714.276000]   Type:   Direct-Access                      ANSI SCSI
revision: 00
[4294714.562000] SCSI device sda: 256000 512-byte hdwr sectors (131 MB)
[4294714.577000] sda: Write Protect is on
[4294714.581000] sda: assuming drive cache: write through
[4294714.619000] SCSI device sda: 256000 512-byte hdwr sectors (131 MB)
[4294714.635000] sda: Write Protect is on
[4294714.639000] sda: assuming drive cache: write through
[4294714.644000]  sda: sda1
[4294714.663000] sd 0:0:0:0: Attached scsi removable disk sda
[4294714.708000] sd 0:0:0:0: Attached scsi generic sg0 type 0
------------------------------------------------------------------------

Well, back to work.
I just wanted to keep you posted, because I know somebody else is also
working on it and I wouldn't like to duplicate the effort.

BR,
Matej


From anemo@mba.ocn.ne.jp Thu Jan  5 15:12:13 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Thu, 05 Jan 2006 15:12:31 +0000 (GMT)
Received: from mba.ocn.ne.jp ([210.190.142.172]:35271 "HELO smtp.mba.ocn.ne.jp")
	by ftp.linux-mips.org with SMTP id S8133546AbWAEPMN (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Thu, 5 Jan 2006 15:12:13 +0000
Received: from localhost (p4083-ipad30funabasi.chiba.ocn.ne.jp [221.184.79.83])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP
	id 70B0AA538; Fri,  6 Jan 2006 00:14:45 +0900 (JST)
Date:	Fri, 06 Jan 2006 00:14:12 +0900 (JST)
Message-Id: <20060106.001412.93019293.anemo@mba.ocn.ne.jp>
To:	rmk@arm.linux.org.uk
Cc:	sshtylyov@ru.mvista.com, linux-mips@linux-mips.org,
	ralf@linux-mips.org
Subject: Re: [PATCH] serial_txx9: forcibly init the spinlock for PCI UART
 used as a console
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
In-Reply-To: <20051227184152.GA4474@flint.arm.linux.org.uk>
References: <43B143EE.6070700@ru.mvista.com>
	<20051228.003457.74752441.anemo@mba.ocn.ne.jp>
	<20051227184152.GA4474@flint.arm.linux.org.uk>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 3.3 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9779
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips
Content-Length: 1183
Lines: 32

>>>>> On Tue, 27 Dec 2005 18:41:52 +0000, Russell King <rmk@arm.linux.org.uk> said:

>> Yes, you are right.  I missed the register_console call in
>> uart_add_one_port().  So your patch will fix the problem.  But I
>> suppose the spinlock should be initialized in serial_core.  How
>> about this?

rmk> I think you're layering work-around on top of work-around on top
rmk> of work-around here.

Russell, could you tell me where is the right place to initialize
port's spinlock ?

Currently, serial_core do initialize the spinlock in uart_set_options
(for console) and uart_add_one_port (for other ports).  And some low
level drivers also initialize it in some place.
(serial8250_isa_init_ports, etc.)

A.  The initialization in serial_core is just for failsafe and low
    level drivers should initialize the spinlock.

B.  Those initializations in low level drivers are there just by
    historical (or any other) reason and now redundant.  They can be
    omitted because serial_core is responsible to initialize the
    spinlock.

Which is right ? (if both are wrong, could you correct me ?)

I will update and send patch(es) based on your answer.  Thank you.

---
Atsushi Nemoto

From christi.garvin@lantronix.com Thu Jan  5 16:12:45 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Thu, 05 Jan 2006 16:13:02 +0000 (GMT)
Received: from ltrxmail.lantronix.com ([67.134.254.86]:10821 "EHLO
	double-bogey.int.lantronix.com") by ftp.linux-mips.org with ESMTP
	id S8133546AbWAEQMo convert rfc822-to-8bit (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Thu, 5 Jan 2006 16:12:44 +0000
X-MessageTextProcessor:	DisclaimIt (2.00.201) on double-bogey.int.lantronix.com
Received: from 3putt.int.lantronix.com ([172.16.1.16]) by double-bogey.int.lantronix.com with Microsoft SMTPSVC(6.0.3790.211); Thu, 5 Jan 2006 08:15:15 -0800
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.326
Content-Class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 8BIT
Subject: iptables/vmalloc issues on alchemy (revisited)
Date:	Thu, 5 Jan 2006 08:15:13 -0800
Message-ID: <2F0FC2A92C0B154BB406D5E74CB3E693010849F5@3putt.int.lantronix.com>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: iptables/vmalloc issues on alchemy (revisited)
thread-index: AcYSEzU4znvuLfZaQv6+6AVntEqEWg==
Importance: normal
From:	"Christi Garvin" <christi.garvin@lantronix.com>
Priority: normal
To:	<linux-mips@linux-mips.org>
Cc:	<dan@embeddededge.com>
X-OriginalArrivalTime: 05 Jan 2006 16:15:15.0408 (UTC) FILETIME=[3676ED00:01C61213]
Return-Path: <christi.garvin@lantronix.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9780
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: christi.garvin@lantronix.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2320
Lines: 43

This issue was reported on this mailing list back in April '05....
 
On Tue, 2005-04-26 at 10:43 +0200, Herbert Valerio Riedel wrote:
> ... 
> The problem seems to be so far, that when modifying the iptables
> structures by adding/flushing the rules, a state can be reached sooner
> or later (indeterministic! smells like race) where the data structure
> becomes invalid (although there are checks in the kernel which would
> prevent that); the result is either ip_tables.c:ipt_do_tables() causing
> an oops due to bad pointer dereferencing (or the kernel freezing w/o
> further notice at all), or the iptables tool being unable to
> retrieve/modify the rules from the kernel (and getting ENOMEM/EINVAL) or
> simply segfaulting due to other inconsistencies with the data...
it appears the problem was found...
On Wed, 2005-04-27 at 15:06 -0400, Dan Malek wrote:
> Oh wait ....  I found a bug a while ago from someone trying to load
> large modules.  There is a problem if the kernel grows to need
> additional PTE tables, the top level pointers don't get propagated
> correctly and subsequent access by a thread that didn't actually
> do the allocation would fail.  I'm looking into this, including your
> past message about 64-bit PTEs.
 
and possibly fixed:
 
> From: Dan Malek [mailto:dan@embeddededge.com] 
> Sent: Thursday, April 28, 2005 3:57 PM
> Subject: Re: iptables/vmalloc issues on alchemy
>
> I've just been talking about 2.6, so "long time ago" can't be
> that long :-)  I have the updates to the exception handler so
> the PTEs get loaded correctly, that's on the way.  I think 2.4
> should be OK if anyone is using that.
 
I am encountering this same problem with 2.6.11 and iptables 1.2.11, 
and I've searched for an appropriate patch/fix, and cannot find one....
Can you tell me if this has been fixed, and if so, point me in the
direction of the patch?
 
regards,
christi garvin
**********************************************************************
This e-mail is the property of Lantronix. It is intended only for the person or entity to which it is addressed and may contain information that is privileged, confidential, or otherwise protected from disclosure. Distribution or copying of this e-mail, or the information contained herein, to anyone other than the intended recipient is prohibited.


From bunk@stusta.de Thu Jan  5 17:34:26 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Thu, 05 Jan 2006 17:34:47 +0000 (GMT)
Received: from mailout.stusta.mhn.de ([141.84.69.5]:27410 "HELO
	mailout.stusta.mhn.de") by ftp.linux-mips.org with SMTP
	id S8133560AbWAERe0 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Thu, 5 Jan 2006 17:34:26 +0000
Received: (qmail 10042 invoked from network); 5 Jan 2006 17:36:57 -0000
Received: from r063144.stusta.swh.mhn.de (10.150.63.144)
  by mailout.stusta.mhn.de with SMTP; 5 Jan 2006 17:36:57 -0000
Received: by r063144.stusta.swh.mhn.de (Postfix, from userid 1000)
	id 315FE197670; Thu,  5 Jan 2006 18:36:58 +0100 (CET)
Date:	Thu, 5 Jan 2006 18:36:57 +0100
From:	Adrian Bunk <bunk@stusta.de>
To:	Andrew Morton <akpm@osdl.org>
Cc:	Ralf Baechle <ralf@linux-mips.org>,
	Domen Puncer <domen@coderock.org>, linux-mips@linux-mips.org,
	linux-kernel@vger.kernel.org, davem@davemloft.net
Subject: [2.6 patch] Remove arch/mips/arc/salone.c
Message-ID: <20060105173657.GA12313@stusta.de>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.11
Return-Path: <bunk@stusta.de>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9781
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: bunk@stusta.de
Precedence: bulk
X-list: linux-mips
Content-Length: 1746
Lines: 58

From: Domen Puncer <domen@coderock.org>

ArcLoad(), ArcInvoke(), ArcExecute() aren't used.

Signed-off-by: Domen Puncer <domen@coderock.org>
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Adrian Bunk <bunk@stusta.de>

---

This patch was sent by Alexey Dobriyan on:
- 8 Nov 2005

 arch/mips/arc/Makefile |    2 +-
 arch/mips/arc/salone.c |   25 -------------------------
 2 files changed, 1 insertion(+), 26 deletions(-)

--- linux-kj.orig/arch/mips/arc/Makefile	2005-11-08 20:46:24.000000000 +0300
+++ linux-kj/arch/mips/arc/Makefile	2005-11-08 20:47:36.000000000 +0300
@@ -3,7 +3,7 @@
 #
 
 lib-y				+= cmdline.o env.o file.o identify.o init.o \
-				   misc.o salone.o time.o tree.o
+				   misc.o time.o tree.o
 
 lib-$(CONFIG_ARC_MEMORY)	+= memory.o
 lib-$(CONFIG_ARC_CONSOLE)	+= arc_con.o
Index: linux-kj/arch/mips/arc/salone.c
===================================================================
--- linux-kj.orig/arch/mips/arc/salone.c	2005-11-08 20:46:24.000000000 +0300
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,24 +0,0 @@
-/*
- * Routines to load into memory and execute stand-along program images using
- * ARCS PROM firmware.
- *
- * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
- */
-#include <linux/init.h>
-#include <asm/sgialib.h>
-
-LONG __init ArcLoad(CHAR *Path, ULONG TopAddr, ULONG *ExecAddr, ULONG *LowAddr)
-{
-	return ARC_CALL4(load, Path, TopAddr, ExecAddr, LowAddr);
-}
-
-LONG __init ArcInvoke(ULONG ExecAddr, ULONG StackAddr, ULONG Argc, CHAR *Argv[],
-	CHAR *Envp[])
-{
-	return ARC_CALL5(invoke, ExecAddr, StackAddr, Argc, Argv, Envp);
-}
-
-LONG __init ArcExecute(CHAR *Path, LONG Argc, CHAR *Argv[], CHAR *Envp[])
-{
-	return ARC_CALL4(exec, Path, Argc, Argv, Envp);
-}


From robert@linuxdevelopment.de Thu Jan  5 22:22:39 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Thu, 05 Jan 2006 22:22:58 +0000 (GMT)
Received: from moutng.kundenserver.de ([212.227.126.171]:9414 "EHLO
	moutng.kundenserver.de") by ftp.linux-mips.org with ESMTP
	id S8133495AbWAEWWj (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Thu, 5 Jan 2006 22:22:39 +0000
Received: from [85.212.191.62] (helo=[10.0.0.4])
	by mrelayeu.kundenserver.de (node=mrelayeu6) with ESMTP (Nemesis),
	id 0ML29c-1EudXp2Loy-0001QF; Thu, 05 Jan 2006 23:25:18 +0100
Message-ID: <43BD9D93.40005@linuxdevelopment.de>
Date:	Thu, 05 Jan 2006 23:28:35 +0100
From:	Robert Woerle <robert@linuxdevelopment.de>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.12) Gecko/20050921
X-Accept-Language: de, en
MIME-Version: 1.0
To:	linux-mips@linux-mips.org
Subject: diet-X11 fails /include/bits/types.h
X-Enigmail-Version: 0.90.1.0
X-Enigmail-Supports: pgp-inline, pgp-mime
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Provags-ID: kundenserver.de abuse@kundenserver.de login:3a738c603c23670681f156cc7e748d26
Return-Path: <robert@linuxdevelopment.de>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9782
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: robert@linuxdevelopment.de
Precedence: bulk
X-list: linux-mips
Content-Length: 2868
Lines: 65

Hi

i am new to mips and i am compiling a familiar gpe image for mips based
systems .
Now diet-X11 and X11 are breaking to compile on the below error.
I googled  and found various occasions of this /include/bits/types.h
causing problems

i guess that has something todo with combination on compiler and glibc
seems also glibc-2.3.5 fails on that

i am using for that build
glibc-2.3.3
gcc-cross-3.3.4

make[2]: Entering directory
`/home/bob/Handhelds/oe/stuff/mips-build/tmp/work/diet-x11-6.2.1cvs20050226-r5/X11/src/util'
| if gcc -DHAVE_CONFIG_H -I.
-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/work/diet-x11-6.2.1cvs20050226-r5/X11/src/util
-I../../src  
-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include
-Wall -Wpointer-arith -Wstrict-prototypes        -Wmissing-prototypes
-Wmissing-declarations     -Wnested-externs -fno-strict-aliasing
-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include
-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/X11/Xtrans  
-D_XOPEN_SOURCE=500
-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include  
-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include
-fexpensive-optimizations -fomit-frame-pointer -frename-registers -O2
-MT makekeys-makekeys.o -MD -MP -MF ".deps/makekeys-makekeys.Tpo" -c -o
makekeys-makekeys.o `test -f 'makekeys.c' || echo
'/home/bob/Handhelds/oe/stuff/mips-build/tmp/work/diet-x11-6.2.1cvs20050226-r5/X11/src/util/'`makekeys.c;
\
| then mv -f ".deps/makekeys-makekeys.Tpo" ".deps/makekeys-makekeys.Po";
else rm -f ".deps/makekeys-makekeys.Tpo"; exit 1; fi
| In file included from
/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/sys/types.h:31,
|                  from
/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/X11/Xos.h:59,
|                  from makekeys.c:34:
|
/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:127:3:
#error
| In file included from
/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/sys/types.h:31,
|                  from
/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/X11/Xos.h:59,
|                  from makekeys.c:34:
|
/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:136:
error: syntax error before "__dev_t"
|
/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:136:
warning: type defaults to `int' in declaration of `__dev_t'
|
/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:136:
warning: data definition has no type or storage class
|
/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:140:
error: syntax error before "__ino64_t"

any hint is greatly appriciated
regards

rob_w

From zzh.hust@gmail.com Fri Jan  6 06:38:19 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 06:38:39 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.202]:1116 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133383AbWAFGiT convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Fri, 6 Jan 2006 06:38:19 +0000
Received: by wproxy.gmail.com with SMTP id 36so2791421wra
        for <linux-mips@linux-mips.org>; Thu, 05 Jan 2006 22:40:59 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=VSeGgt4S2M4PxIGqPsI+fIZSkBdqnlmfNAmpCFTItSHin11lDhZVDw2hqyTPIw1Z1mbnlq1cvYzqCAn9cLVRZkVPMANFUovk7rnnNdfQ3ltwfAHOqxljD5GXAw9Qd6LSwbsn4Cs1VR4GUJEWxILtLOsnEwV90NJkuwQ0L9gS3ZY=
Received: by 10.54.149.8 with SMTP id w8mr4557050wrd;
        Thu, 05 Jan 2006 22:40:58 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Thu, 5 Jan 2006 22:40:58 -0800 (PST)
Message-ID: <50c9a2250601052240n5696e353teb2b798ecbf802f0@mail.gmail.com>
Date:	Fri, 6 Jan 2006 14:40:58 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	"linux-mips@linux-mips.org" <linux-mips@linux-mips.org>
Subject: sometimes get "crc error" while uncompressed ramdisk
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9783
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 225
Lines: 9

i make a ramdisk by myself, and sometimes the kernel boot the ramdisk
correctly but sometimes it printk "crc error" while uncompressed
ramdisk, did someone meet this situation?
thanks for any hints

Best regards


zhuzhenhua

From jaypee@hotpop.com Fri Jan  6 08:53:34 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 08:54:03 +0000 (GMT)
Received: from smtp-out.hotpop.com ([38.113.3.61]:61839 "EHLO
	smtp-out.hotpop.com") by ftp.linux-mips.org with ESMTP
	id S8133528AbWAFIxe (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Fri, 6 Jan 2006 08:53:34 +0000
Received: from hotpop.com (kubrick.hotpop.com [38.113.3.105])
	by smtp-out.hotpop.com (Postfix) with SMTP id 91A062222269
	for <linux-mips@linux-mips.org>; Fri,  6 Jan 2006 08:56:02 +0000 (UTC)
Received: from [10.8.64.42] (unknown [62.253.252.7])
	by smtp-2.hotpop.com (Postfix) with ESMTP
	id 48AF622221A0; Fri,  6 Jan 2006 08:56:00 +0000 (UTC)
Subject: Re: sometimes get "crc error" while uncompressed ramdisk
From:	jp <jaypee@hotpop.com>
To:	zhuzhenhua <zzh.hust@gmail.com>,
	linux-mips <linux-mips@linux-mips.org>
In-Reply-To: <50c9a2250601052240n5696e353teb2b798ecbf802f0@mail.gmail.com>
References: <50c9a2250601052240n5696e353teb2b798ecbf802f0@mail.gmail.com>
Content-Type: text/plain
Date:	Fri, 06 Jan 2006 08:56:53 +0000
Message-Id: <1136537813.5239.23.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.5.3 
Content-Transfer-Encoding: 7bit
X-HotPOP: -----------------------------------------------
                   Sent By HotPOP.com FREE Email
             Get your FREE POP email at www.HotPOP.com
          -----------------------------------------------
Return-Path: <jaypee@hotpop.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9784
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jaypee@hotpop.com
Precedence: bulk
X-list: linux-mips
Content-Length: 825
Lines: 25

On Fri, 2006-01-06 at 14:40 +0800, zhuzhenhua wrote:
> i make a ramdisk by myself, and sometimes the kernel boot the ramdisk
> correctly but sometimes it printk "crc error" while uncompressed
> ramdisk, did someone meet this situation?
> thanks for any hints
> 

Assuming your build and everything else is as it should be it may be a
RAM fault. Are you using a custom board?

I had some prototype boards here with some really long tracks to RAM.
(and some really short ones too!)

Memory tests such walking ones worked fine but the decompress of the
ramdisk works RAM pretty hard and it showed up intermittent faults like
you describe. Tended to be worse when the board was warm. I'd spray some
Freezit on and it would go back to working OK.

You could also try running the RAM slower and see if the fault
disappears.


JP



From langabe@gmail.com Fri Jan  6 10:38:49 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 10:39:07 +0000 (GMT)
Received: from nproxy.gmail.com ([64.233.182.194]:5982 "EHLO nproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133370AbWAFKit convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Fri, 6 Jan 2006 10:38:49 +0000
Received: by nproxy.gmail.com with SMTP id k27so7427nfc
        for <linux-mips@linux-mips.org>; Fri, 06 Jan 2006 02:41:31 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=H+zeV1IM68ru1z0EnFJ1P574MPc/WNHRLz+aqvXZHWat1Hi7BaoRTFtRUQE6XMPgLRS60eb89FTbBU/8Wh41mAZee83c2PVcrouBjpERjvfdpGAULdpAZTUDSv5dfTWaLJQS59qUc6E2XfvTxX970j9ogVfTgC1/gvTBuDpznbw=
Received: by 10.48.249.2 with SMTP id w2mr651197nfh;
        Fri, 06 Jan 2006 02:41:30 -0800 (PST)
Received: by 10.48.225.20 with HTTP; Fri, 6 Jan 2006 02:41:30 -0800 (PST)
Message-ID: <c58a7a270601060241u765acb76s61bb30d443c420f1@mail.gmail.com>
Date:	Fri, 6 Jan 2006 10:41:30 +0000
From:	Alex Gonzalez <langabe@gmail.com>
To:	linux-mips@linux-mips.org
Subject: Jump/branch to external symbol
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <langabe@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9785
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: langabe@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1377
Lines: 36

Hi,

I am having GNU gas related problems when compiling assembler files
which contain jumps to external symbols, for example when jumping from
an assembler to a C function.

Using binutils-2.15 GAS will produce a "Cannot branch to undefined
symbol" error. Applying the patch at
http://sources.redhat.com/ml/binutils/2004-04/msg00476.html, which
creates an "allow_branch_to_undefined" option I am able to succesfully
compile an executable. I am happy with this as I only need to apply
the option to the problematic files and it does not change the
behaviour of gas in general.

Now, my crosscompiler toolchain is based on binutils-2.13. When I try
to apply the same patch to it, I get a different error, "Can not
represent BFD_RELOC_16_PCREL_S2 relocation in this object file
format".

There are various posts around referring to this problems. As a
consequence I have read different opinions, solutions that apply to
specific version or binutils, solutions more or less accepted by
everyone, and as usual I am very confused.

If I compile with "-mno-abicalls -fno-pic" gas reports no errors
(which I believe is what the Linux kernel does), but I need to link
with some pic libraries which use glibc, so this is not a valid
solution for me.

I am happy with the patch for binutils-2.15, and I would need a
solution for binutils-2.13.

Can anybody offer any help?

Thanks,
Alex

From macro@linux-mips.org Fri Jan  6 11:49:15 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 11:49:32 +0000 (GMT)
Received: from pollux.ds.pg.gda.pl ([153.19.208.7]:30995 "EHLO
	pollux.ds.pg.gda.pl") by ftp.linux-mips.org with ESMTP
	id S8133571AbWAFLtP (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Fri, 6 Jan 2006 11:49:15 +0000
Received: from localhost (localhost [127.0.0.1])
	by pollux.ds.pg.gda.pl (Postfix) with ESMTP id 6A3B0E1C9B;
	Fri,  6 Jan 2006 12:51:54 +0100 (CET)
Received: from pollux.ds.pg.gda.pl ([127.0.0.1])
 by localhost (pollux [127.0.0.1]) (amavisd-new, port 10024) with ESMTP
 id 04961-05; Fri,  6 Jan 2006 12:51:54 +0100 (CET)
Received: from piorun.ds.pg.gda.pl (piorun.ds.pg.gda.pl [153.19.208.8])
	by pollux.ds.pg.gda.pl (Postfix) with ESMTP id 27997E1C81;
	Fri,  6 Jan 2006 12:51:54 +0100 (CET)
Received: from blysk.ds.pg.gda.pl (macro@blysk.ds.pg.gda.pl [153.19.208.6])
	by piorun.ds.pg.gda.pl (8.13.3/8.13.1) with ESMTP id k06Bplme002297;
	Fri, 6 Jan 2006 12:51:47 +0100
Date:	Fri, 6 Jan 2006 11:51:56 +0000 (GMT)
From:	"Maciej W. Rozycki" <macro@linux-mips.org>
To:	Alex Gonzalez <langabe@gmail.com>
Cc:	linux-mips@linux-mips.org
Subject: Re: Jump/branch to external symbol
In-Reply-To: <c58a7a270601060241u765acb76s61bb30d443c420f1@mail.gmail.com>
Message-ID: <Pine.LNX.4.64N.0601061147540.25759@blysk.ds.pg.gda.pl>
References: <c58a7a270601060241u765acb76s61bb30d443c420f1@mail.gmail.com>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Virus-Scanned: ClamAV 0.87.1/1231/Thu Jan  5 23:51:25 2006 on piorun.ds.pg.gda.pl
X-Virus-Status:	Clean
X-Virus-Scanned: by amavisd-new at pollux.ds.pg.gda.pl
Return-Path: <macro@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9786
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: macro@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 368
Lines: 12

On Fri, 6 Jan 2006, Alex Gonzalez wrote:

> I am happy with the patch for binutils-2.15, and I would need a
> solution for binutils-2.13.
> 
> Can anybody offer any help?

 Well, the most obvious solution is upgrading to the current release, 
which is 2.16.1 now.  Otherwise you are probably on your own -- 2.15 is 
already somewhat old and 2.13 is ancient.

  Maciej

From drow@nevyn.them.org Fri Jan  6 14:49:36 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 14:49:53 +0000 (GMT)
Received: from nevyn.them.org ([66.93.172.17]:16515 "EHLO nevyn.them.org")
	by ftp.linux-mips.org with ESMTP id S8133576AbWAFOtg (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Fri, 6 Jan 2006 14:49:36 +0000
Received: from drow by nevyn.them.org with local (Exim 4.54)
	id 1Euswy-0001mv-K9; Fri, 06 Jan 2006 09:52:16 -0500
Date:	Fri, 6 Jan 2006 09:52:16 -0500
From:	Daniel Jacobowitz <dan@debian.org>
To:	"Maciej W. Rozycki" <macro@linux-mips.org>
Cc:	Alex Gonzalez <langabe@gmail.com>, linux-mips@linux-mips.org
Subject: Re: Jump/branch to external symbol
Message-ID: <20060106145216.GA6849@nevyn.them.org>
References: <c58a7a270601060241u765acb76s61bb30d443c420f1@mail.gmail.com> <Pine.LNX.4.64N.0601061147540.25759@blysk.ds.pg.gda.pl>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <Pine.LNX.4.64N.0601061147540.25759@blysk.ds.pg.gda.pl>
User-Agent: Mutt/1.5.8i
Return-Path: <drow@nevyn.them.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9787
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: dan@debian.org
Precedence: bulk
X-list: linux-mips
Content-Length: 546
Lines: 17

On Fri, Jan 06, 2006 at 11:51:56AM +0000, Maciej W. Rozycki wrote:
> On Fri, 6 Jan 2006, Alex Gonzalez wrote:
> 
> > I am happy with the patch for binutils-2.15, and I would need a
> > solution for binutils-2.13.
> > 
> > Can anybody offer any help?
> 
>  Well, the most obvious solution is upgrading to the current release, 
> which is 2.16.1 now.  Otherwise you are probably on your own -- 2.15 is 
> already somewhat old and 2.13 is ancient.

Or better yet to trunk and you won't need any patches for this.

-- 
Daniel Jacobowitz
CodeSourcery

From robert@linuxdevelopment.de Fri Jan  6 15:00:54 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 15:01:12 +0000 (GMT)
Received: from moutng.kundenserver.de ([212.227.126.187]:26075 "EHLO
	moutng.kundenserver.de") by ftp.linux-mips.org with ESMTP
	id S8133576AbWAFPAy (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Fri, 6 Jan 2006 15:00:54 +0000
Received: from [85.212.192.127] (helo=[10.0.0.4])
	by mrelayeu.kundenserver.de (node=mrelayeu5) with ESMTP (Nemesis),
	id 0ML25U-1Eut7t1QiI-0008Br; Fri, 06 Jan 2006 16:03:33 +0100
Message-ID: <43BE878D.6080105@linuxdevelopment.de>
Date:	Fri, 06 Jan 2006 16:06:53 +0100
From:	Robert Woerle <robert@linuxdevelopment.de>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; de-AT; rv:1.7.12) Gecko/20050921
X-Accept-Language: de, en
MIME-Version: 1.0
To:	linux-mips@linux-mips.org
Subject: Re: diet-X11 fails /include/bits/types.h
References: <43BD9D93.40005@linuxdevelopment.de>
In-Reply-To: <43BD9D93.40005@linuxdevelopment.de>
X-Enigmail-Version: 0.90.1.0
X-Enigmail-Supports: pgp-inline, pgp-mime
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Provags-ID: kundenserver.de abuse@kundenserver.de login:3a738c603c23670681f156cc7e748d26
Return-Path: <robert@linuxdevelopment.de>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9788
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: robert@linuxdevelopment.de
Precedence: bulk
X-list: linux-mips
Content-Length: 3153
Lines: 75

Ok check that types.h and to me it looks that nothing in my toolchain
provides WORDSIZE
so i used the WORDSIZE=32 values and filled them in the 3rd else statement .
now all compiles fine


Robert Woerle schrieb:
>Hi
>
>i am new to mips and i am compiling a familiar gpe image for mips based
>systems .
>Now diet-X11 and X11 are breaking to compile on the below error.
>I googled  and found various occasions of this /include/bits/types.h
>causing problems
>
>i guess that has something todo with combination on compiler and glibc
>seems also glibc-2.3.5 fails on that
>
>i am using for that build
>glibc-2.3.3
>gcc-cross-3.3.4
>
>make[2]: Entering directory
>`/home/bob/Handhelds/oe/stuff/mips-build/tmp/work/diet-x11-6.2.1cvs20050226-r5/X11/src/util'
>| if gcc -DHAVE_CONFIG_H -I.
>-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/work/diet-x11-6.2.1cvs20050226-r5/X11/src/util
>-I../../src  
>-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include
>-Wall -Wpointer-arith -Wstrict-prototypes        -Wmissing-prototypes
>-Wmissing-declarations     -Wnested-externs -fno-strict-aliasing
>-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include
>-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/X11/Xtrans  
>-D_XOPEN_SOURCE=500
>-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include  
>-I/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include
>-fexpensive-optimizations -fomit-frame-pointer -frename-registers -O2
>-MT makekeys-makekeys.o -MD -MP -MF ".deps/makekeys-makekeys.Tpo" -c -o
>makekeys-makekeys.o `test -f 'makekeys.c' || echo
>'/home/bob/Handhelds/oe/stuff/mips-build/tmp/work/diet-x11-6.2.1cvs20050226-r5/X11/src/util/'`makekeys.c;
>\
>| then mv -f ".deps/makekeys-makekeys.Tpo" ".deps/makekeys-makekeys.Po";
>else rm -f ".deps/makekeys-makekeys.Tpo"; exit 1; fi
>| In file included from
>/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/sys/types.h:31,
>|                  from
>/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/X11/Xos.h:59,
>|                  from makekeys.c:34:
>|
>/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:127:3:
>#error
>| In file included from
>/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/sys/types.h:31,
>|                  from
>/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/X11/Xos.h:59,
>|                  from makekeys.c:34:
>|
>/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:136:
>error: syntax error before "__dev_t"
>|
>/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:136:
>warning: type defaults to `int' in declaration of `__dev_t'
>|
>/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:136:
>warning: data definition has no type or storage class
>|
>/home/bob/Handhelds/oe/stuff/mips-build/tmp/staging/mipsel-linux/include/bits/types.h:140:
>error: syntax error before "__ino64_t"
>
>any hint is greatly appriciated
>regards
>
>rob_w
>
>
>  

From sshtylyov@ru.mvista.com Fri Jan  6 16:29:42 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 16:30:00 +0000 (GMT)
Received: from rtsoft2.corbina.net ([85.21.88.2]:25520 "HELO
	mail.dev.rtsoft.ru") by ftp.linux-mips.org with SMTP
	id S8133585AbWAFQ3m (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Fri, 6 Jan 2006 16:29:42 +0000
Received: (qmail 5312 invoked from network); 6 Jan 2006 16:32:17 -0000
Received: from wasted.dev.rtsoft.ru (HELO ?192.168.1.248?) (192.168.1.248)
  by mail.dev.rtsoft.ru with SMTP; 6 Jan 2006 16:32:17 -0000
Message-ID: <43BE9C20.2040805@ru.mvista.com>
Date:	Fri, 06 Jan 2006 19:34:40 +0300
From:	Sergei Shtylylov <sshtylyov@ru.mvista.com>
Organization: MostaVista Software Inc.
User-Agent: Mozilla/5.0 (X11; U; Linux i686; rv:1.7.2) Gecko/20040803
X-Accept-Language: ru, en-us, en-gb
MIME-Version: 1.0
To:	linux-mips@linux-mips.org
CC:	Manish Lachwani <mlachwani@mvista.com>,
	Jordan Crouse <jordan.crouse@amd.com>, ralf@linux-mips.org
Subject: [PATCH] Make KGDB compile for AMD Au1200
Content-Type: multipart/mixed;
 boundary="------------040105000905030801070202"
Return-Path: <sshtylyov@ru.mvista.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9789
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: sshtylyov@ru.mvista.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1179
Lines: 41

This is a multi-part message in MIME format.
--------------040105000905030801070202
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Hello.

     AMD Au1200 SOC just doesn't have UART3, so KGDB won't even compile for it 
as is, here's the fix to make KGDB use UART1. Note that I haven't really 
tested KGDB itself...

WBR, Sergei


--------------040105000905030801070202
Content-Type: text/plain;
 name="DBAu1200-fix-KGDB-UART.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="DBAu1200-fix-KGDB-UART.patch"

diff --git a/include/asm-mips/mach-au1x00/au1000.h b/include/asm-mips/mach-au1x00/au1000.h
index 8e1d7ed..4686e17 100644
--- a/include/asm-mips/mach-au1x00/au1000.h
+++ b/include/asm-mips/mach-au1x00/au1000.h
@@ -1198,7 +1198,11 @@ extern au1xxx_irq_map_t au1xxx_irq_map[]
 
 /* UARTS 0-3 */
 #define UART_BASE                 UART0_ADDR
+#ifdef	CONFIG_SOC_AU1200
+#define UART_DEBUG_BASE           UART1_ADDR
+#else
 #define UART_DEBUG_BASE           UART3_ADDR
+#endif
 
 #define UART_RX		0	/* Receive buffer */
 #define UART_TX		4	/* Transmit buffer */



--------------040105000905030801070202--

From sshtylyov@ru.mvista.com Fri Jan  6 16:33:05 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 16:33:23 +0000 (GMT)
Received: from rtsoft2.corbina.net ([85.21.88.2]:46768 "HELO
	mail.dev.rtsoft.ru") by ftp.linux-mips.org with SMTP
	id S8133585AbWAFQdF (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Fri, 6 Jan 2006 16:33:05 +0000
Received: (qmail 5346 invoked from network); 6 Jan 2006 16:35:42 -0000
Received: from wasted.dev.rtsoft.ru (HELO ?192.168.1.248?) (192.168.1.248)
  by mail.dev.rtsoft.ru with SMTP; 6 Jan 2006 16:35:42 -0000
Message-ID: <43BE9CED.3080207@ru.mvista.com>
Date:	Fri, 06 Jan 2006 19:38:05 +0300
From:	Sergei Shtylylov <sshtylyov@ru.mvista.com>
Organization: MostaVista Software Inc.
User-Agent: Mozilla/5.0 (X11; U; Linux i686; rv:1.7.2) Gecko/20040803
X-Accept-Language: ru, en-us, en-gb
MIME-Version: 1.0
To:	Linux MIPS <linux-mips@linux-mips.org>
CC:	Manish Lachwani <mlachwani@mvista.com>, ralf@linux-mips.org
Subject: [PATCH] Make KGDB compile again
Content-Type: multipart/mixed;
 boundary="------------030207070504090609040403"
Return-Path: <sshtylyov@ru.mvista.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9790
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: sshtylyov@ru.mvista.com
Precedence: bulk
X-list: linux-mips
Content-Length: 976
Lines: 38

This is a multi-part message in MIME format.
--------------030207070504090609040403
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Hello.

     The last commit to arch/mips/kernel/gdb-stub.c introduced a stupid typo
into the spinlock initializer, here's the fix...

WBR, Sergei


--------------030207070504090609040403
Content-Type: text/plain;
 name="KGDB-fix-spinlock-init.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="KGDB-fix-spinlock-init.patch"

diff --git a/arch/mips/kernel/gdb-stub.c b/arch/mips/kernel/gdb-stub.c
index 96d18c4..0b2c44f 100644
--- a/arch/mips/kernel/gdb-stub.c
+++ b/arch/mips/kernel/gdb-stub.c
@@ -178,7 +178,7 @@ int kgdb_enabled;
  */
 static DEFINE_SPINLOCK(kgdb_lock);
 static raw_spinlock_t kgdb_cpulock[NR_CPUS] = {
-	[0 ... NR_CPUS-1] = __RAW_SPIN_LOCK_UNLOCKED;
+	[0 ... NR_CPUS-1] = __RAW_SPIN_LOCK_UNLOCKED
 };
 
 /*




--------------030207070504090609040403--

From jcrouse@cosmic.amd.com Fri Jan  6 16:34:47 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 16:35:09 +0000 (GMT)
Received: from amdext3.amd.com ([139.95.251.6]:9654 "EHLO amdext3.amd.com")
	by ftp.linux-mips.org with ESMTP id S8133585AbWAFQer (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Fri, 6 Jan 2006 16:34:47 +0000
Received: from SSVLGW02.amd.com (ssvlgw02.amd.com [139.95.250.170])
	by amdext3.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k06GY0Ar000480;
	Fri, 6 Jan 2006 08:36:31 -0800
Received: from 139.95.250.1 by SSVLGW02.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Fri, 06 Jan 2006 08:36:21 -0800
X-Server-Uuid: 519AC16A-9632-469E-B354-112C592D09E8
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k06GaLVP007358; Fri, 6
 Jan 2006 08:36:21 -0800 (PST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id C5CD9202D; Fri, 6 Jan 2006
 09:36:20 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k06Gi9Yc016061; Fri, 6 Jan 2006 09:44:09
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k06Gi6Wn016060; Fri, 6 Jan 2006 09:44:06 -0700
Date:	Fri, 6 Jan 2006 09:44:06 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	linux-mips@linux-mips.org, rmk+lkml@arm.linux.org.uk,
	drzeus@drzeus.cx
Subject: [PATCH]  Force MMC/SD to 512 byte block sizes
Message-ID: <20060106164406.GA15617@cosmic.amd.com>
MIME-Version: 1.0
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FA0430F2C42669973-01-01
Content-Type: multipart/mixed;
 boundary=45Z9DzgjV8m4Oswq
Content-Disposition: inline
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9791
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 3279
Lines: 103


--45Z9DzgjV8m4Oswq
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit

This patch is not specific to the AU1200 SD driver, but thats what
we used to debug and verify this, so thats why it is applied against
the linux-mips tree.   Pierre, I'm sending this to you too, because I thought
you may be interested.

Large SD cards (>=2GB) report a physical block size greater then 512 bytes
(2GB reports 1024, and 4GB reports 2048).  However, a sample of different 
brands of USB attached SD readers have shown that the logical block size 
is still forced to 512 bytes.

The original mmc_block code was setting the block size to whatever the
card was reporting, thereby causing much pain and suffering when using
a card initialized elsewhere (bad partition tables, invalid FAT tables, etc).

This patch forces the block size to be 512 bytes, and adjusts the 
capacity accordingly.   With this you should be able to happily use very
large cards interchangeably between platforms.  At least, it has worked for
us.

Comments welcome,
Jordan

-- 
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>

--45Z9DzgjV8m4Oswq
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: attachment;
 filename=mmc_fix.patch
Content-Transfer-Encoding: 7bit

PATCH: Force MMC/SD to 512 byte block sizes.

Angry customers and investigation into USB attached MMC/SD
readers have lead us to believe that the SD device block size should
be fixed at 512 bytes regardless of the block size reported by the card.
This comes into play with >2G cards.  After applying this fix, filesystems
written with a USB card reader can be read by the MMC subsystem and 
vice-versa.

Signed-off-by: Jordan Crouse <jordan.crouse@amd.com>
---

 drivers/mmc/mmc_block.c |   16 +++++++++++++---
 1 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/mmc_block.c b/drivers/mmc/mmc_block.c
index d91fcf7..96fa121 100644
--- a/drivers/mmc/mmc_block.c
+++ b/drivers/mmc/mmc_block.c
@@ -303,6 +303,7 @@ static struct mmc_blk_data *mmc_blk_allo
 {
 	struct mmc_blk_data *md;
 	int devidx, ret;
+	unsigned long cap;
 
 	devidx = find_first_zero_bit(dev_use, MMC_NUM_MINORS);
 	if (devidx >= MMC_NUM_MINORS)
@@ -356,10 +357,19 @@ static struct mmc_blk_data *mmc_blk_allo
 		sprintf(md->disk->disk_name, "mmcblk%d", devidx);
 		sprintf(md->disk->devfs_name, "mmc/blk%d", devidx);
 
-		md->block_bits = card->csd.read_blkbits;
+		if (card->csd.read_blkbits > 9) {
+			md->block_bits = 9;
+
+			cap = card->csd.capacity <<
+				(card->csd.read_blkbits - 9);
+		}
+		else {
+			md->block_bits = card->csd.read_blkbits;
+			cap = card->csd.capacity;
+		}
 
 		blk_queue_hardsect_size(md->queue.queue, 1 << md->block_bits);
-		set_capacity(md->disk, card->csd.capacity);
+		set_capacity(md->disk, cap);
 	}
  out:
 	return md;
@@ -373,7 +383,7 @@ mmc_blk_set_blksize(struct mmc_blk_data 
 
 	mmc_card_claim_host(card);
 	cmd.opcode = MMC_SET_BLOCKLEN;
-	cmd.arg = 1 << card->csd.read_blkbits;
+	cmd.arg = 1 << ((card->csd.read_blkbits > 9) ? 9 : card->csd.read_blkbits);
 	cmd.flags = MMC_RSP_R1;
 	err = mmc_wait_for_cmd(card->host, &cmd, 5);
 	mmc_card_release_host(card);

--45Z9DzgjV8m4Oswq--


From rmk+linux-mips=linux-mips.org@arm.linux.org.uk Fri Jan  6 16:56:53 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 16:57:11 +0000 (GMT)
Received: from caramon.arm.linux.org.uk ([212.18.232.186]:22285 "EHLO
	caramon.arm.linux.org.uk") by ftp.linux-mips.org with ESMTP
	id S8133583AbWAFQ4x (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Fri, 6 Jan 2006 16:56:53 +0000
Received: from flint.arm.linux.org.uk ([2002:d412:e8ba:1:201:2ff:fe14:8fad])
	by caramon.arm.linux.org.uk with esmtpsa (TLSv1:DES-CBC3-SHA:168)
	(Exim 4.52)
	id 1Euuw8-0001Qt-UD; Fri, 06 Jan 2006 16:59:33 +0000
Received: from rmk by flint.arm.linux.org.uk with local (Exim 4.52)
	id 1Euuw6-0007xQ-Me; Fri, 06 Jan 2006 16:59:31 +0000
Date:	Fri, 6 Jan 2006 16:59:30 +0000
From:	Russell King <rmk@arm.linux.org.uk>
To:	Jordan Crouse <jordan.crouse@amd.com>
Cc:	linux-mips@linux-mips.org, drzeus@drzeus.cx
Subject: Re: [PATCH]  Force MMC/SD to 512 byte block sizes
Message-ID: <20060106165930.GC16093@flint.arm.linux.org.uk>
References: <20060106164406.GA15617@cosmic.amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20060106164406.GA15617@cosmic.amd.com>
User-Agent: Mutt/1.4.1i
Return-Path: <rmk+linux-mips=linux-mips.org@arm.linux.org.uk>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9792
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: rmk@arm.linux.org.uk
Precedence: bulk
X-list: linux-mips
Content-Length: 687
Lines: 17

On Fri, Jan 06, 2006 at 09:44:06AM -0700, Jordan Crouse wrote:
> This patch is not specific to the AU1200 SD driver, but thats what
> we used to debug and verify this, so thats why it is applied against
> the linux-mips tree.   Pierre, I'm sending this to you too, because I thought
> you may be interested.

NACK.  Please wait until the next round of patches get merged and then
revalidate this.

It's obviously wrong in the case of cards which do not support partial
block writes, and it does nothing to detect this (apart from violating
their advertised capabilities.)

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 Serial core

From drzeus@drzeus.cx Fri Jan  6 17:01:44 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 17:02:01 +0000 (GMT)
Received: from [85.8.13.51] ([85.8.13.51]:31681 "EHLO smtp.drzeus.cx")
	by ftp.linux-mips.org with ESMTP id S8133583AbWAFRBo (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Fri, 6 Jan 2006 17:01:44 +0000
Received: from [10.8.0.5] (apollo.drzeus.cx [::ffff:10.8.0.5])
  (AUTH: PLAIN drzeus, TLS: TLSv1/SSLv3,256bits,AES256-SHA)
  by smtp.drzeus.cx with esmtp; Fri, 06 Jan 2006 18:04:24 +0100
  id 00062716.43BEA318.00007826
Message-ID: <43BEA317.8010203@drzeus.cx>
Date:	Fri, 06 Jan 2006 18:04:23 +0100
From:	Pierre Ossman <drzeus@drzeus.cx>
User-Agent: Mozilla Thunderbird 1.0.7-2.1.fc4.nr (X11/20051011)
X-Accept-Language: en-us, en
MIME-Version: 1.0
To:	Jordan Crouse <jordan.crouse@amd.com>
CC:	linux-mips@linux-mips.org, rmk+lkml@arm.linux.org.uk
Subject: Re: [PATCH]  Force MMC/SD to 512 byte block sizes
References: <20060106164406.GA15617@cosmic.amd.com>
In-Reply-To: <20060106164406.GA15617@cosmic.amd.com>
X-Enigmail-Version: 0.90.1.0
X-Enigmail-Supports: pgp-inline, pgp-mime
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Return-Path: <drzeus@drzeus.cx>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9793
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: drzeus@drzeus.cx
Precedence: bulk
X-list: linux-mips
Content-Length: 1933
Lines: 49

Jordan Crouse wrote:
> This patch is not specific to the AU1200 SD driver, but thats what
> we used to debug and verify this, so thats why it is applied against
> the linux-mips tree.   Pierre, I'm sending this to you too, because I thought
> you may be interested.

Much appreciated. :)

> 
> Large SD cards (>=2GB) report a physical block size greater then 512 bytes
> (2GB reports 1024, and 4GB reports 2048).  However, a sample of different 
> brands of USB attached SD readers have shown that the logical block size 
> is still forced to 512 bytes.
> 
> The original mmc_block code was setting the block size to whatever the
> card was reporting, thereby causing much pain and suffering when using
> a card initialized elsewhere (bad partition tables, invalid FAT tables, etc).
> 
> This patch forces the block size to be 512 bytes, and adjusts the 
> capacity accordingly.   With this you should be able to happily use very
> large cards interchangeably between platforms.  At least, it has worked for
> us.
> 
> 
> @@ -373,7 +383,7 @@ mmc_blk_set_blksize(struct mmc_blk_data 
>  
>  	mmc_card_claim_host(card);
>  	cmd.opcode = MMC_SET_BLOCKLEN;
> -	cmd.arg = 1 << card->csd.read_blkbits;
> +	cmd.arg = 1 << ((card->csd.read_blkbits > 9) ? 9 : card->csd.read_blkbits);
>  	cmd.flags = MMC_RSP_R1;
>  	err = mmc_wait_for_cmd(card->host, &cmd, 5);
>  	mmc_card_release_host(card);

This will not work. Some cards do not accept block sizes larger than the
one they've specified.

This issue has been discussed on the arm kernel ml and Russell has begun
producing patches to resolve the issue.

To solve the issue you're seeing we should lie to the block layer, not
the card. Which will cause problems when the block layer issues request
that cannot be mapped to a integer number of card blocks.

The issue is more complex than your patch suggests and I do not know
enough about the block layer to propose a way out.

Rgds
Pierre

From jcrouse@cosmic.amd.com Fri Jan  6 17:32:23 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 17:32:46 +0000 (GMT)
Received: from amdext4.amd.com ([163.181.251.6]:21978 "EHLO amdext4.amd.com")
	by ftp.linux-mips.org with ESMTP id S8133821AbWAFRcX (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Fri, 6 Jan 2006 17:32:23 +0000
Received: from SAUSGW02.amd.com (sausgw02.amd.com [163.181.250.22])
	by amdext4.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k06HYWIK013993;
	Fri, 6 Jan 2006 11:34:42 -0600
Received: from 163.181.250.1 by SAUSGW02.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Fri, 06 Jan 2006 11:34:35 -0600
X-Server-Uuid: 5FC0E2DF-CD44-48CD-883A-0ED95B391E89
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint2.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k06HYZh5002156; Fri,
 6 Jan 2006 11:34:35 -0600 (CST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id EBF1B2028; Fri, 6 Jan 2006
 10:34:34 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k06HgO0T016686; Fri, 6 Jan 2006 10:42:24
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k06HgNS2016685; Fri, 6 Jan 2006 10:42:23 -0700
Date:	Fri, 6 Jan 2006 10:42:23 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	"Russell King" <rmk@arm.linux.org.uk>
cc:	linux-mips@linux-mips.org, drzeus@drzeus.cx
Subject: Re: Force MMC/SD to 512 byte block sizes
Message-ID: <20060106174223.GB15617@cosmic.amd.com>
References: <20060106164406.GA15617@cosmic.amd.com>
 <20060106165930.GC16093@flint.arm.linux.org.uk>
MIME-Version: 1.0
In-Reply-To: <20060106165930.GC16093@flint.arm.linux.org.uk>
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FA075A10T02055239-01-01
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9794
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1181
Lines: 32

On 06/01/06 16:59 +0000, Russell King wrote:
> On Fri, Jan 06, 2006 at 09:44:06AM -0700, Jordan Crouse wrote:
> > This patch is not specific to the AU1200 SD driver, but thats what
> > we used to debug and verify this, so thats why it is applied against
> > the linux-mips tree.   Pierre, I'm sending this to you too, because I thought
> > you may be interested.
> 
> NACK.  Please wait until the next round of patches get merged and then
> revalidate this.

Fair enough - I am only getting what Ralf and Linus put in their git tree -
I probably should have checked your tree before assuming the code was
current.

> It's obviously wrong in the case of cards which do not support partial
> block writes, and it does nothing to detect this (apart from violating
> their advertised capabilities.)

Ok - I can understand that - its unlikely that such cards would have a 
physical block size > 512 bytes, but its always better to be safe then sorry.
Thats a fairly straight forward fix, and I'll do it while waiting for your
code to bubble through.

Regards,
Jordan

-- 
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>


From jcrouse@cosmic.amd.com Fri Jan  6 17:40:07 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 17:40:29 +0000 (GMT)
Received: from amdext4.amd.com ([163.181.251.6]:7387 "EHLO amdext4.amd.com")
	by ftp.linux-mips.org with ESMTP id S8133835AbWAFRkH (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Fri, 6 Jan 2006 17:40:07 +0000
Received: from SAUSGW01.amd.com (sausgw01.amd.com [163.181.250.21])
	by amdext4.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k06HgGth015227;
	Fri, 6 Jan 2006 11:42:31 -0600
Received: from 163.181.250.1 by SAUSGW02.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Fri, 06 Jan 2006 11:42:20 -0600
X-Server-Uuid: 5FC0E2DF-CD44-48CD-883A-0ED95B391E89
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint2.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k06HgKh5002423; Fri,
 6 Jan 2006 11:42:20 -0600 (CST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id D70262028; Fri, 6 Jan 2006
 10:42:19 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k06Ho9cp016715; Fri, 6 Jan 2006 10:50:09
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k06Ho8Zs016714; Fri, 6 Jan 2006 10:50:08 -0700
Date:	Fri, 6 Jan 2006 10:50:08 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	"Pierre Ossman" <drzeus@drzeus.cx>
cc:	linux-mips@linux-mips.org, rmk+lkml@arm.linux.org.uk
Subject: Re: Force MMC/SD to 512 byte block sizes
Message-ID: <20060106175008.GC15617@cosmic.amd.com>
References: <20060106164406.GA15617@cosmic.amd.com>
 <43BEA317.8010203@drzeus.cx>
MIME-Version: 1.0
In-Reply-To: <43BEA317.8010203@drzeus.cx>
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FA074760T02056895-01-01
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9795
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 717
Lines: 22

On 06/01/06 18:04 +0100, Pierre Ossman wrote:
> This will not work. Some cards do not accept block sizes larger than the
> one they've specified.
>
> This issue has been discussed on the arm kernel ml and Russell has begun
> producing patches to resolve the issue.

Which just goes to prove that if I'm going to do SD development, I need
to start watching the right mailing lists.

I'll defer to the previous work on this - I do know that this has
worked for pretty much every 2G and 4G card we could get our hands on,
so that was enough for me to throw it at you guys and see what sticks.

Jordan

-- 
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>


From linux-mips@packetvision.com Fri Jan  6 17:48:34 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Fri, 06 Jan 2006 17:48:51 +0000 (GMT)
Received: from mra02.ch.as12513.net ([82.153.252.24]:13224 "EHLO
	mra02.ch.as12513.net") by ftp.linux-mips.org with ESMTP
	id S8133842AbWAFRse (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Fri, 6 Jan 2006 17:48:34 +0000
Received: from localhost (localhost [127.0.0.1])
	by mra02.ch.as12513.net (Postfix) with ESMTP id 936F8D4504;
	Fri,  6 Jan 2006 17:51:10 +0000 (GMT)
Received: from mra02.ch.as12513.net ([127.0.0.1])
 by localhost (mra02.ch.as12513.net [127.0.0.1]) (amavisd-new, port 10024)
 with LMTP id 29495-01-21; Fri,  6 Jan 2006 17:51:10 +0000 (GMT)
Received: from [192.168.1.212] (unknown [82.152.104.245])
	by mra02.ch.as12513.net (Postfix) with ESMTP id 8F099D45B3;
	Fri,  6 Jan 2006 17:51:09 +0000 (GMT)
Subject: Re: Jump/branch to external symbol
From:	Alex Gonzalez <linux-mips@packetvision.com>
Reply-To: linux-mips@alexgg.plus.com
To:	Daniel Jacobowitz <dan@debian.org>
Cc:	"Maciej W. Rozycki" <macro@linux-mips.org>,
	Alex Gonzalez <langabe@gmail.com>, linux-mips@linux-mips.org
In-Reply-To: <20060106145216.GA6849@nevyn.them.org>
References: <c58a7a270601060241u765acb76s61bb30d443c420f1@mail.gmail.com>
	 <Pine.LNX.4.64N.0601061147540.25759@blysk.ds.pg.gda.pl>
	 <20060106145216.GA6849@nevyn.them.org>
Content-Type: text/plain
Date:	Fri, 06 Jan 2006 17:50:20 +0000
Message-Id: <1136569820.9887.24.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.4.1 
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: by Eclipse VIRUSshield at eclipse.net.uk
Return-Path: <linux-mips@packetvision.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9796
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: linux-mips@packetvision.com
Precedence: bulk
X-list: linux-mips
Content-Length: 671
Lines: 19

Thanks, that works. Somehow it didn't occurred to me to try it.
Alex 

On Fri, 2006-01-06 at 09:52 -0500, Daniel Jacobowitz wrote:
> On Fri, Jan 06, 2006 at 11:51:56AM +0000, Maciej W. Rozycki wrote:
> > On Fri, 6 Jan 2006, Alex Gonzalez wrote:
> > 
> > > I am happy with the patch for binutils-2.15, and I would need a
> > > solution for binutils-2.13.
> > > 
> > > Can anybody offer any help?
> > 
> >  Well, the most obvious solution is upgrading to the current release, 
> > which is 2.16.1 now.  Otherwise you are probably on your own -- 2.15 is 
> > already somewhat old and 2.13 is ancient.
> 
> Or better yet to trunk and you won't need any patches for this.
> 


From zzh.hust@gmail.com Sat Jan  7 03:36:48 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sat, 07 Jan 2006 03:37:05 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.206]:19296 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133835AbWAGDgs convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sat, 7 Jan 2006 03:36:48 +0000
Received: by wproxy.gmail.com with SMTP id 36so2988747wra
        for <linux-mips@linux-mips.org>; Fri, 06 Jan 2006 19:39:33 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=I1kW2CCPDtkoxj+NvQlmBT8FTYN8gBBu+hcqO4jrpkgO6DlfvRGnnrvBSPx0OUt4yj+o2CiSXcHHf/YqfFTmm6so8e34lzzCU/4OryKPJZbdEBHU5SFhM5B3qWDncIHXXqq6wt6qKJSSXD5fHLpDXT2Wo6lsooeOtkKttmZz8e0=
Received: by 10.54.158.2 with SMTP id g2mr1596625wre;
        Fri, 06 Jan 2006 19:38:46 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Fri, 6 Jan 2006 19:39:32 -0800 (PST)
Message-ID: <50c9a2250601061939j42c4cc85n1c0246d9f8068938@mail.gmail.com>
Date:	Sat, 7 Jan 2006 11:39:32 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	jp <jaypee@hotpop.com>
Subject: Re: sometimes get "crc error" while uncompressed ramdisk
Cc:	linux-mips <linux-mips@linux-mips.org>
In-Reply-To: <1136537813.5239.23.camel@localhost.localdomain>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601052240n5696e353teb2b798ecbf802f0@mail.gmail.com>
	 <1136537813.5239.23.camel@localhost.localdomain>
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9797
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1112
Lines: 36

On 1/6/06, jp <jaypee@hotpop.com> wrote:
> On Fri, 2006-01-06 at 14:40 +0800, zhuzhenhua wrote:
> > i make a ramdisk by myself, and sometimes the kernel boot the ramdisk
> > correctly but sometimes it printk "crc error" while uncompressed
> > ramdisk, did someone meet this situation?
> > thanks for any hints
> >
>
> Assuming your build and everything else is as it should be it may be a
> RAM fault. Are you using a custom board?
>
> I had some prototype boards here with some really long tracks to RAM.
> (and some really short ones too!)
>
> Memory tests such walking ones worked fine but the decompress of the
> ramdisk works RAM pretty hard and it showed up intermittent faults like
> you describe. Tended to be worse when the board was warm. I'd spray some
> Freezit on and it would go back to working OK.
>
> You could also try running the RAM slower and see if the fault
> disappears.
>
>
> JP
>
>
>
maybe you are right, because i work on our FPGA board, and the
situation is similiar as your description. i will try to slow down the
sdram and to see what will happen

thanks!

Best regards

zhuzhenhua

From lhrkernelcoder@gmail.com Sat Jan  7 06:59:51 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sat, 07 Jan 2006 07:00:09 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.207]:42318 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8126484AbWAGG7v convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sat, 7 Jan 2006 06:59:51 +0000
Received: by wproxy.gmail.com with SMTP id 36so3005044wra
        for <linux-mips@linux-mips.org>; Fri, 06 Jan 2006 23:02:37 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=YxkG56eHgDUukODYCBCprgk+yrQAsIJBInd2m0rabMIsK0c/+vqNtizBmfDzRLcK3tYbdJ0p/Yt9vJen9H/ujuWADjjFIXGvnTg8Arf+FVJ32qqtbuZMs2+g3Ccmv13YWIZZEWQ8Bsr9mykYJOmb9xp8fSFFVZ37CTiOOUfqXwE=
Received: by 10.54.139.2 with SMTP id m2mr5774314wrd;
        Fri, 06 Jan 2006 23:02:37 -0800 (PST)
Received: by 10.54.147.20 with HTTP; Fri, 6 Jan 2006 23:02:37 -0800 (PST)
Message-ID: <f69849430601062302if424acey70e98f86e0de36e6@mail.gmail.com>
Date:	Fri, 6 Jan 2006 23:02:37 -0800
From:	kernel coder <lhrkernelcoder@gmail.com>
To:	linux-mips@linux-mips.org
Subject: Almost 80% of UDP packets dropped
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <lhrkernelcoder@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9798
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: lhrkernelcoder@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1314
Lines: 30

hi,
    I was trying to measure the UDP reception speed on my borad which
has MIPS 4kc processor with 133 MHZ speed.I was transfering 10mb file
from intel pentium 4 machine to MIPS board,but the recieved file was
only 900kB.

When i further investigated the problem ,i came to know that the user
application was not getting enough opportunities to get data from
socket queue which caused almost 80% of packets to be dropped as
socket queue had no free space.

When i increased the socket recieve buffer size,it resulted in
increase in no. of packets recieved .When i slow slowed down the
transmitter , it also caused more packets to be recieved.

But the above mentioned mechanism only decreased no. of lost
packets.But there was no way that i could increase UDP reception speed
because the user application was not getting enough opportunities to
read packets in burst of UDP packets.

I noticed that user application started recieveing packets after
Kernel had recieved all the UDP packets.

Please tell me how can i make sure that user application or udp client
running MIPS 4kc processor gets enough opportunities to dequeue
packets from socket buffer so that lost of packets could be reduced to
minimal and also the size of UDP recieved file in a specific interval
of time could be increased.

lhrkernelcoder

From fosterb@uoguelph.ca Sat Jan  7 07:35:29 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sat, 07 Jan 2006 07:35:49 +0000 (GMT)
Received: from dragonboat.cs.uoguelph.ca ([131.104.96.108]:39624 "EHLO
	dragonboat.cs.uoguelph.ca") by ftp.linux-mips.org with ESMTP
	id S8126484AbWAGHf2 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sat, 7 Jan 2006 07:35:28 +0000
Received: from beddie.cis.uoguelph.ca (marvin.cis.uoguelph.ca [131.104.48.131])
	by dragonboat.cs.uoguelph.ca (8.13.1/8.13.1) with ESMTP id k077cDWd021183;
	Sat, 7 Jan 2006 02:38:13 -0500
Received: from localhost (localhost.localdomain [127.0.0.1])
	by beddie.cis.uoguelph.ca (Postfix) with ESMTP id 53BA17E8F;
	Sat,  7 Jan 2006 02:36:17 -0500 (EST)
Received: from beddie.cis.uoguelph.ca ([127.0.0.1])
	by localhost (beddie [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id 21768-06; Sat, 7 Jan 2006 02:36:16 -0500 (EST)
Received: from [192.168.0.104] (CPE001217cc2ab6-CM001371143eca.cpe.net.cable.rogers.com [70.30.137.118])
	by beddie.cis.uoguelph.ca (Postfix) with ESMTP id 685557D0D;
	Sat,  7 Jan 2006 02:36:16 -0500 (EST)
Message-ID: <43BF6FE3.7030600@uoguelph.ca>
Date:	Sat, 07 Jan 2006 02:38:11 -0500
From:	Brett Foster <fosterb@uoguelph.ca>
User-Agent: Mozilla Thunderbird 1.0 (Windows/20041206)
X-Accept-Language: en-us, en
MIME-Version: 1.0
To:	kernel coder <lhrkernelcoder@gmail.com>
CC:	linux-mips@linux-mips.org
Subject: Re: Almost 80% of UDP packets dropped
References: <f69849430601062302if424acey70e98f86e0de36e6@mail.gmail.com>
In-Reply-To: <f69849430601062302if424acey70e98f86e0de36e6@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at cs-club.org
X-Scanned-By: MIMEDefang 2.52 on 131.104.96.108
Return-Path: <fosterb@uoguelph.ca>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9799
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: fosterb@uoguelph.ca
Precedence: bulk
X-list: linux-mips
Content-Length: 875
Lines: 25

kernel coder wrote:

>hi,
>    I was trying to measure the UDP reception speed on my borad which
>has MIPS 4kc processor with 133 MHZ speed.I was transfering 10mb file
>from intel pentium 4 machine to MIPS board,but the recieved file was
>only 900kB.
>  
>
UDP was not designed with reliability in mind -- it really isn't meant 
for sending a 10 meg file without a packet loss.

>When i further investigated the problem ,i came to know that the user
>application was not getting enough opportunities to get data from
>socket queue which caused almost 80% of packets to be dropped as
>socket queue had no free space.
>  
>
(Among other sources) I'm pretty sure this behaviour was discussed in:
Unix Network Programming, Vol. 1: The Sockets Networking API, Third Edition
(Something like page 257.)

I don't know if there is anything else going on with the kernel but...

Brett

From KevinK@mips.com Sat Jan  7 09:22:08 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sat, 07 Jan 2006 09:22:25 +0000 (GMT)
Received: from 209-232-97-206.ded.pacbell.net ([209.232.97.206]:37098 "EHLO
	dns0.mips.com") by ftp.linux-mips.org with ESMTP id S8133363AbWAGJWI
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sat, 7 Jan 2006 09:22:08 +0000
Received: from mercury.mips.com (sbcns-dmz [209.232.97.193])
	by dns0.mips.com (8.12.11/8.12.11) with ESMTP id k079Oipt001546;
	Sat, 7 Jan 2006 01:24:44 -0800 (PST)
Received: from Ulysses (laptop-ying-ho.mips.com [192.168.2.2] (may be forged))
	by mercury.mips.com (8.12.9/8.12.11) with SMTP id k079OdYr004772;
	Sat, 7 Jan 2006 01:24:40 -0800 (PST)
Message-ID: <001d01c6136c$2a77ae40$0202a8c0@Ulysses>
From:	"Kevin D. Kissell" <KevinK@mips.com>
To:	"kernel coder" <lhrkernelcoder@gmail.com>,
	<linux-mips@linux-mips.org>
References: <f69849430601062302if424acey70e98f86e0de36e6@mail.gmail.com>
Subject: Re: Almost 80% of UDP packets dropped
Date:	Sat, 7 Jan 2006 10:24:29 +0100
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2800.1506
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
X-Scanned-By: MIMEDefang 2.39
Return-Path: <KevinK@mips.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9800
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: KevinK@mips.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1706
Lines: 42

What value of HZ are you using?  If you're still at the 2.6 default of 1000,
try reducing it to 100 and see if things improve...

----- Original Message ----- 
From: "kernel coder" <lhrkernelcoder@gmail.com>
To: <linux-mips@linux-mips.org>
Sent: Saturday, January 07, 2006 8:02 AM
Subject: Almost 80% of UDP packets dropped


> hi,
>     I was trying to measure the UDP reception speed on my borad which
> has MIPS 4kc processor with 133 MHZ speed.I was transfering 10mb file
> from intel pentium 4 machine to MIPS board,but the recieved file was
> only 900kB.
> 
> When i further investigated the problem ,i came to know that the user
> application was not getting enough opportunities to get data from
> socket queue which caused almost 80% of packets to be dropped as
> socket queue had no free space.
> 
> When i increased the socket recieve buffer size,it resulted in
> increase in no. of packets recieved .When i slow slowed down the
> transmitter , it also caused more packets to be recieved.
> 
> But the above mentioned mechanism only decreased no. of lost
> packets.But there was no way that i could increase UDP reception speed
> because the user application was not getting enough opportunities to
> read packets in burst of UDP packets.
> 
> I noticed that user application started recieveing packets after
> Kernel had recieved all the UDP packets.
> 
> Please tell me how can i make sure that user application or udp client
> running MIPS 4kc processor gets enough opportunities to dequeue
> packets from socket buffer so that lost of packets could be reduced to
> minimal and also the size of UDP recieved file in a specific interval
> of time could be increased.
> 
> lhrkernelcoder
> 
> 

From alan@lxorguk.ukuu.org.uk Sat Jan  7 09:42:57 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sat, 07 Jan 2006 09:43:14 +0000 (GMT)
Received: from [81.2.110.250] ([81.2.110.250]:22931 "EHLO lxorguk.ukuu.org.uk")
	by ftp.linux-mips.org with ESMTP id S8133363AbWAGJm5 (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Sat, 7 Jan 2006 09:42:57 +0000
Received: from localhost.localdomain (localhost.localdomain [127.0.0.1])
	by lxorguk.ukuu.org.uk (8.13.4/8.13.4) with ESMTP id k079meLo010775;
	Sat, 7 Jan 2006 09:48:41 GMT
Received: (from alan@localhost)
	by localhost.localdomain (8.13.4/8.13.4/Submit) id k079md6L010774;
	Sat, 7 Jan 2006 09:48:39 GMT
X-Authentication-Warning: localhost.localdomain: alan set sender to alan@lxorguk.ukuu.org.uk using -f
Subject: Re: Almost 80% of UDP packets dropped
From:	Alan Cox <alan@lxorguk.ukuu.org.uk>
To:	kernel coder <lhrkernelcoder@gmail.com>
Cc:	linux-mips@linux-mips.org
In-Reply-To: <f69849430601062302if424acey70e98f86e0de36e6@mail.gmail.com>
References: <f69849430601062302if424acey70e98f86e0de36e6@mail.gmail.com>
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Date:	Sat, 07 Jan 2006 09:48:35 +0000
Message-Id: <1136627315.3748.30.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.2.3 (2.2.3-2.fc4) 
Return-Path: <alan@lxorguk.ukuu.org.uk>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9801
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: alan@lxorguk.ukuu.org.uk
Precedence: bulk
X-list: linux-mips
Content-Length: 613
Lines: 14

On Gwe, 2006-01-06 at 23:02 -0800, kernel coder wrote:
> I noticed that user application started recieveing packets after
> Kernel had recieved all the UDP packets.

If your network chip/ram/processor combination is not fast enough to run
user space applications and handle a full speed network packet stream
then you either need to send more slowly, make the kernel network driver
more efficient or add some kind of interrupt/polling code to reduce
system load to avoid this. The NAPI layer in the networking code is
designed to make this possible.

Probably worth discussing further on netdev@oss.sgi.com

Alan

From ralf@linux-mips.org Sat Jan  7 11:13:07 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sat, 07 Jan 2006 11:13:32 +0000 (GMT)
Received: from p549F5FA9.dip.t-dialin.net ([84.159.95.169]:10085 "EHLO
	mail.linux-mips.net") by ftp.linux-mips.org with ESMTP
	id S8133382AbWAGLNH (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sat, 7 Jan 2006 11:13:07 +0000
Received: from fluff.linux-mips.net (localhost.localdomain [127.0.0.1])
	by mail.linux-mips.net (8.13.4/8.13.1) with ESMTP id k07BFkOm032650;
	Sat, 7 Jan 2006 12:15:46 +0100
Received: (from ralf@localhost)
	by fluff.linux-mips.net (8.13.4/8.13.4/Submit) id k07BFewS032649;
	Sat, 7 Jan 2006 12:15:40 +0100
Date:	Sat, 7 Jan 2006 12:15:40 +0100
From:	Ralf Baechle <ralf@linux-mips.org>
To:	"Maciej W. Rozycki" <macro@linux-mips.org>
Cc:	Alex Gonzalez <langabe@gmail.com>, linux-mips@linux-mips.org
Subject: Re: Jump/branch to external symbol
Message-ID: <20060107111540.GA30498@linux-mips.org>
References: <c58a7a270601060241u765acb76s61bb30d443c420f1@mail.gmail.com> <Pine.LNX.4.64N.0601061147540.25759@blysk.ds.pg.gda.pl>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <Pine.LNX.4.64N.0601061147540.25759@blysk.ds.pg.gda.pl>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9802
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 463
Lines: 14

On Fri, Jan 06, 2006 at 11:51:56AM +0000, Maciej W. Rozycki wrote:

> > solution for binutils-2.13.
> > 
> > Can anybody offer any help?
> 
>  Well, the most obvious solution is upgrading to the current release, 
> which is 2.16.1 now.  Otherwise you are probably on your own -- 2.15 is 
> already somewhat old and 2.13 is ancient.

Binutils 2.15 may crash when building particular configurations, so 2.15
is no longer acceptable for building the kernel.

  Ralf

From bunk@stusta.de Sun Jan  8 15:29:22 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 08 Jan 2006 15:29:40 +0000 (GMT)
Received: from emailhub.stusta.mhn.de ([141.84.69.5]:55563 "HELO
	mailout.stusta.mhn.de") by ftp.linux-mips.org with SMTP
	id S8133634AbWAHP3W (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 8 Jan 2006 15:29:22 +0000
Received: (qmail 8984 invoked from network); 8 Jan 2006 15:32:09 -0000
Received: from r063144.stusta.swh.mhn.de (10.150.63.144)
  by mailout.stusta.mhn.de with SMTP; 8 Jan 2006 15:32:09 -0000
Received: by r063144.stusta.swh.mhn.de (Postfix, from userid 1000)
	id EF7981479CF; Sun,  8 Jan 2006 16:32:09 +0100 (CET)
Date:	Sun, 8 Jan 2006 16:32:09 +0100
From:	Adrian Bunk <bunk@stusta.de>
To:	ralf@linux-mips.org, schwidefsky@de.ibm.com, linux390@de.ibm.com
Cc:	linux-390@vm.marist.edu, linux-mips@linux-mips.org,
	linux-kernel@vger.kernel.org
Subject: [2.6 patch] mips/s390: remove -finline-limit=10000{,0}
Message-ID: <20060108153209.GM3774@stusta.de>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.11
Return-Path: <bunk@stusta.de>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9803
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: bunk@stusta.de
Precedence: bulk
X-list: linux-mips
Content-Length: 1042
Lines: 33

-finline-limit might have been required for older compilers, but 
nowadays it does no longer make sense.


Signed-off-by: Adrian Bunk <bunk@stusta.de>

---

 arch/mips/Makefile |    1 -
 arch/s390/Makefile |    1 -
 2 files changed, 2 deletions(-)

--- linux-2.6.15-mm2-full/arch/mips/Makefile.old	2006-01-08 16:25:35.000000000 +0100
+++ linux-2.6.15-mm2-full/arch/mips/Makefile	2006-01-08 16:25:46.000000000 +0100
@@ -93,7 +93,6 @@
 #
 cflags-y			+= -I $(TOPDIR)/include/asm/gcc
 cflags-y			+= -G 0 -mno-abicalls -fno-pic -pipe
-cflags-y			+= $(call cc-option, -finline-limit=100000)
 LDFLAGS_vmlinux			+= -G 0 -static -n -nostdlib
 MODFLAGS			+= -mlong-calls
 
--- linux-2.6.15-mm2-full/arch/s390/Makefile.old	2006-01-08 16:25:53.000000000 +0100
+++ linux-2.6.15-mm2-full/arch/s390/Makefile	2006-01-08 16:25:59.000000000 +0100
@@ -67,7 +67,6 @@
 endif
 
 CFLAGS		+= -mbackchain -msoft-float $(cflags-y)
-CFLAGS		+= $(call cc-option,-finline-limit=10000)
 CFLAGS 		+= -pipe -fno-strength-reduce -Wno-sign-compare 
 AFLAGS		+= $(aflags-y)
 


From zzh.hust@gmail.com Mon Jan  9 01:44:51 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 01:45:09 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.203]:60679 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133656AbWAIBov convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 01:44:51 +0000
Received: by wproxy.gmail.com with SMTP id 36so3202370wra
        for <linux-mips@linux-mips.org>; Sun, 08 Jan 2006 17:47:47 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=rDwoPTCDVsMQMxA15EIOhSGBTNf9jU/jF1tvm/EP9gduGxN18bmTwQo2KXLAzGUZFq5Bfmr6B7hlaH86IGVw4T20+i2HZGvg1x5pvd2+9jNHYv1vuZv/z1oB4hK6fcgZXrGNJeUti6Aoiu4ui4l2jDqjTi8kZsNEMREgL5XD/D8=
Received: by 10.54.60.10 with SMTP id i10mr5897478wra;
        Sun, 08 Jan 2006 17:47:46 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Sun, 8 Jan 2006 17:47:46 -0800 (PST)
Message-ID: <50c9a2250601081747l55c5b03p1601329141047c3d@mail.gmail.com>
Date:	Mon, 9 Jan 2006 09:47:46 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	linux-mips <linux-mips@linux-mips.org>
Subject: Re: sometimes get "crc error" while uncompressed ramdisk
In-Reply-To: <50c9a2250601061939j42c4cc85n1c0246d9f8068938@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601052240n5696e353teb2b798ecbf802f0@mail.gmail.com>
	 <1136537813.5239.23.camel@localhost.localdomain>
	 <50c9a2250601061939j42c4cc85n1c0246d9f8068938@mail.gmail.com>
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9804
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2003
Lines: 75

and i find the ramdisk sometimes uncompressed correctly, sometimes not.
if if uncorrect, if often stop at
generic_file_write_nolock -> __grab_cache_page
->add_to_page_cache_unique
->__add_to_page_cache->add_page_to_hash_queue

static void add_page_to_hash_queue(struct page * page, struct page **p)
{
	struct page *next = *p;

	*p = page;
	page->next_hash = next;
	page->pprev_hash = p;
	if (next)
		next->pprev_hash = &page->next_hash;
	if (page->buffers)
		PAGE_BUG(page);
~~~~~~~~~~~~~~~~~~~~~~~~~~
	atomic_inc(&page_cache_size);
}

it occur oops at
	if (page->buffers)
		PAGE_BUG(page);

i am not sure it may caused by hardware or uncorrect initialized of sdram?
or maybe uncorrect-maked ramdisk can cause this?

thanks for any hints!

Best regards!

Zhuzhenhua




On 1/7/06, zhuzhenhua <zzh.hust@gmail.com> wrote:
> On 1/6/06, jp <jaypee@hotpop.com> wrote:
> > On Fri, 2006-01-06 at 14:40 +0800, zhuzhenhua wrote:
> > > i make a ramdisk by myself, and sometimes the kernel boot the ramdisk
> > > correctly but sometimes it printk "crc error" while uncompressed
> > > ramdisk, did someone meet this situation?
> > > thanks for any hints
> > >
> >
> > Assuming your build and everything else is as it should be it may be a
> > RAM fault. Are you using a custom board?
> >
> > I had some prototype boards here with some really long tracks to RAM.
> > (and some really short ones too!)
> >
> > Memory tests such walking ones worked fine but the decompress of the
> > ramdisk works RAM pretty hard and it showed up intermittent faults like
> > you describe. Tended to be worse when the board was warm. I'd spray some
> > Freezit on and it would go back to working OK.
> >
> > You could also try running the RAM slower and see if the fault
> > disappears.
> >
> >
> > JP
> >
> >
> >
> maybe you are right, because i work on our FPGA board, and the
> situation is similiar as your description. i will try to slow down the
> sdram and to see what will happen
>
> thanks!
>
> Best regards
>
> zhuzhenhua
>

From satheshbabu.edara@analog.com Mon Jan  9 04:51:23 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 04:51:43 +0000 (GMT)
Received: from nwd2mail1.analog.com ([137.71.25.50]:5781 "EHLO
	nwd2mail1.analog.com") by ftp.linux-mips.org with ESMTP
	id S8133437AbWAIEvX (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 04:51:23 +0000
Received: from nwd2mhb1.analog.com (nwd2mhb1.analog.com [137.71.5.12])
	by nwd2mail1.analog.com (8.12.10/8.12.10) with ESMTP id k094sSQN008663;
	Sun, 8 Jan 2006 23:54:28 -0500
Received: from lilac.hdcindia.analog.com ([10.121.13.31])
	by nwd2mhb1.analog.com (8.9.3 (PHNE_28810+JAGae91741)/8.9.3) with ESMTP id XAA15620;
	Sun, 8 Jan 2006 23:54:17 -0500 (EST)
Received: from SEdaraL01 ([10.121.13.96])
	by lilac.hdcindia.analog.com (8.12.10+Sun/8.12.10) with ESMTP id k094rfaZ028956;
	Mon, 9 Jan 2006 10:23:42 +0530 (IST)
Message-Id: <200601090453.k094rfaZ028956@lilac.hdcindia.analog.com>
From:	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>
To:	<linux-mips-bounce@linux-mips.org>, <linux-mips@linux-mips.org>
Subject: LL and SC instruction simulation
Date:	Mon, 9 Jan 2006 10:24:14 +0530
MIME-Version: 1.0
Content-Type: text/plain;
	charset="US-ASCII"
Content-Transfer-Encoding: 7bit
X-Mailer: Microsoft Office Outlook, Build 11.0.6353
In-Reply-To: <43BBC85C.4040405@mips.com>
Thread-Index: AcYRL2wEZATk27YPQauJfmdzF9yApgDpTFIA
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
X-Scanned-By: MIMEDefang 2.49 on 137.71.25.50
Return-Path: <satheshbabu.edara@analog.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9805
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: satheshbabu.edara@analog.com
Precedence: bulk
X-list: linux-mips
Content-Length: 645
Lines: 25

 
Hi,
   We have ported linux-2.4.18 and linux-2-6.12 kernel (mips.org)onto MIPS
processor (CPU type lx4189).

 We observed that on 2.4 kernel,ll and sc instruction exception handlers
hitting very often.
Where as on linux-2.6.12 this is not happening.

Can anybody have idea why this instructions are hitting on 2.4.18 kernel and
not on 2-6.12 kernel.

What is the significance of these instructions?.

Note :
   For linux-2.4.18 : We use GCC version -3.3.4 binutils version -2.15 and
uClibc version -0.9.26
For linux-2.6.12 : We use GCC version -3.4.3 binutils version -2.15 and
uClibc version -0.9.28.

Thanks in advance.

Regards,
Sathesh  


From satheshbabu.edara@analog.com Mon Jan  9 05:16:52 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 05:17:10 +0000 (GMT)
Received: from nwd2mail2.analog.com ([137.71.25.51]:57228 "EHLO
	nwd2mail2.analog.com") by ftp.linux-mips.org with ESMTP
	id S8134493AbWAIFQw (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 05:16:52 +0000
Received: from nwd2mhb1.analog.com (nwd2mhb1.analog.com [137.71.5.12])
	by nwd2mail2.analog.com (8.12.10/8.12.10) with ESMTP id k095Jtai002350;
	Mon, 9 Jan 2006 00:19:55 -0500
Received: from lilac.hdcindia.analog.com ([10.121.13.31])
	by nwd2mhb1.analog.com (8.9.3 (PHNE_28810+JAGae91741)/8.9.3) with ESMTP id AAA20923;
	Mon, 9 Jan 2006 00:19:46 -0500 (EST)
Received: from SEdaraL01 ([10.121.13.96])
	by lilac.hdcindia.analog.com (8.12.10+Sun/8.12.10) with ESMTP id k095JAaZ000965;
	Mon, 9 Jan 2006 10:49:10 +0530 (IST)
Message-Id: <200601090519.k095JAaZ000965@lilac.hdcindia.analog.com>
From:	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>
To:	<linux-mips-bounce@linux-mips.org>, <linux-mips@linux-mips.org>
Subject:  LL and SC instruction simulation
Date:	Mon, 9 Jan 2006 10:49:44 +0530
MIME-Version: 1.0
Content-Type: text/plain;
	charset="US-ASCII"
Content-Transfer-Encoding: 7bit
X-Mailer: Microsoft Office Outlook, Build 11.0.6353
In-Reply-To: 
Thread-Index: AcYRL2wEZATk27YPQauJfmdzF9yApgDpTFIAAAHm3mA=
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
X-Scanned-By: MIMEDefang 2.49 on 137.71.25.51
Return-Path: <satheshbabu.edara@analog.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9806
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: satheshbabu.edara@analog.com
Precedence: bulk
X-list: linux-mips
Content-Length: 648
Lines: 26

 

 
Hi,
   We have ported linux-2.4.18 and linux-2-6.12 kernel (mips.org)onto MIPS
processor (CPU type lx4189).

 We observed that on 2.4 kernel,ll and sc instruction exception handlers
hitting very often.
Where as on linux-2.6.12 this is not happening.

Can anybody have idea why this instructions are hitting on 2.4.18 kernel and
not on 2-6.12 kernel.

What is the significance of these instructions?.

Note :
   For linux-2.4.18 : We use GCC version -3.3.4 binutils version -2.15 and
uClibc version -0.9.26 For linux-2.6.12 : We use GCC version -3.4.3 binutils
version -2.15 and uClibc version -0.9.28.

Thanks in advance.

Regards,
Sathesh  


From zzh.hust@gmail.com Mon Jan  9 05:56:38 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 05:56:58 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.200]:64780 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133698AbWAIF4i convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 05:56:38 +0000
Received: by wproxy.gmail.com with SMTP id 36so3227774wra
        for <linux-mips@linux-mips.org>; Sun, 08 Jan 2006 21:59:35 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=ggurlyqscqXQNsCt0Cn2BH6NDH4/sX92fNmjp1pbOt3OSdpirlIKNgNtLTu/T6GKkoBu+vPC/uxd2l1hzIuTUvU04SIeB3yCw+2Jmxjf2bn4R6BR+1oHlMsLkfulDRpFf8yoBjw3bU10x/D3lpaxZZUxRM9Oxsvj7UbCWQf8GDU=
Received: by 10.54.136.13 with SMTP id j13mr4808306wrd;
        Sun, 08 Jan 2006 21:59:35 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Sun, 8 Jan 2006 21:59:34 -0800 (PST)
Message-ID: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
Date:	Mon, 9 Jan 2006 13:59:34 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	linux-mips <linux-mips@linux-mips.org>
Subject: why the early_initcall(au1x00_setup) do not work?
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9807
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 396
Lines: 11

i download a standard 2.6.14 kernel, and compile it for dbau1100, and
i find the early_initcall(au1x00_setup) was not compiled into the
vmlinux.
and i find at the linux-mips cvs, it used plat_setup instead of early_initcall.
does it means my toolchain is not correct to compile the
early_initcall, or in the standard 2.6.14 kernel, the early_initcall
do not work well?

Best regards!

zhuzhenhua

From satheshbabu.edara@analog.com Mon Jan  9 07:40:31 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 07:40:50 +0000 (GMT)
Received: from nwd2mail3.analog.com ([137.71.25.52]:63464 "EHLO
	nwd2mail3.analog.com") by ftp.linux-mips.org with ESMTP
	id S8133646AbWAIHkb (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 07:40:31 +0000
Received: from nwd2mhb1.analog.com (nwd2mhb1.analog.com [137.71.5.12])
	by nwd2mail3.analog.com (8.12.10/8.12.10) with ESMTP id k097hXGY026063;
	Mon, 9 Jan 2006 02:43:33 -0500
Received: from lilac.hdcindia.analog.com ([10.121.13.31])
	by nwd2mhb1.analog.com (8.9.3 (PHNE_28810+JAGae91741)/8.9.3) with ESMTP id CAA07620;
	Mon, 9 Jan 2006 02:43:19 -0500 (EST)
Received: from SEdaraL01 ([10.121.13.96])
	by lilac.hdcindia.analog.com (8.12.10+Sun/8.12.10) with ESMTP id k097gYaZ017304;
	Mon, 9 Jan 2006 13:12:40 +0530 (IST)
Message-Id: <200601090742.k097gYaZ017304@lilac.hdcindia.analog.com>
From:	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>
To:	"'Kevin D. Kissell'" <kevink@mips.com>,
	<linux-mips-bounce@linux-mips.org>, <linux-mips@linux-mips.org>
Subject: RE: 
Date:	Mon, 9 Jan 2006 13:13:06 +0530
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit
X-Mailer: Microsoft Office Outlook, Build 11.0.6353
Thread-Index: AcYRL2wEZATk27YPQauJfmdzF9yApgDvyQ4g
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
In-Reply-To: <43BBC85C.4040405@mips.com>
X-Scanned-By: MIMEDefang 2.49 on 137.71.25.52
Return-Path: <satheshbabu.edara@analog.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9808
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: satheshbabu.edara@analog.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1452
Lines: 42

 
Hi,
  Appreciate your response .

  What is the ideal HZ value if the processor speed is 200Mhz?.

Regards,
Sathesh
-----Original Message-----
From: Kevin D. Kissell [mailto:kevink@mips.com] 
Sent: Wednesday, January 04, 2006 6:37 PM
To: Sathesh Babu Edara
Cc: linux-mips-bounce@linux-mips.org; linux-mips@linux-mips.org
Subject: Re: 

Sathesh Babu Edara wrote:
>  
> 
> Hi,
>    We have ported linux-2.6.12 kernel onto MIPS processor (LX4189) and 
> the processor speed is 200Mhz.
> By default Linux-2.6.12 kernel comes with HZ value 1000.Will this HZ 
> value cause an overhead on the 200MHZ CPU.Can someone advise me on 
> whether going back to HZ vaule of 100 like Linux-2.4 will reduce the 
> overhead on this CPU.What are the side effects this change can cause?.

The 1000Hz clock should not actually cause any problems with a 200MHz CPU,
but it will suck up an annoyingly high percentage of available cycles.
Backing off to 100Hz may cause some degradation of some
real-time/interactive response times, but the improved overall performance
will probably more than make up for it.  I never build with a HZ value
greater than 100 these days, but then again, I'm mostly running on FPGAs and
other hardware emulators where the CPU clock frequencies may be less than
1MHz, and are never more than 33MHz.
Note that a HZ  value of less than 100 may cause some kernel macros to
generate divide-by-zero operations/exceptions.

		Regards,

		Kevin K.



From satheshbabu.edara@analog.com Mon Jan  9 07:46:59 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 07:47:16 +0000 (GMT)
Received: from nwd2mail2.analog.com ([137.71.25.51]:21405 "EHLO
	nwd2mail2.analog.com") by ftp.linux-mips.org with ESMTP
	id S8133612AbWAIHq7 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 07:46:59 +0000
Received: from nwd2mhb1.analog.com (nwd2mhb1.analog.com [137.71.5.12])
	by nwd2mail2.analog.com (8.12.10/8.12.10) with ESMTP id k097o3ai018631;
	Mon, 9 Jan 2006 02:50:03 -0500
Received: from lilac.hdcindia.analog.com ([10.121.13.31])
	by nwd2mhb1.analog.com (8.9.3 (PHNE_28810+JAGae91741)/8.9.3) with ESMTP id CAA08995;
	Mon, 9 Jan 2006 02:49:51 -0500 (EST)
Received: from SEdaraL01 ([10.121.13.96])
	by lilac.hdcindia.analog.com (8.12.10+Sun/8.12.10) with ESMTP id k097nFaZ017891;
	Mon, 9 Jan 2006 13:19:15 +0530 (IST)
Message-Id: <200601090749.k097nFaZ017891@lilac.hdcindia.analog.com>
From:	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>
To:	<linux-mips-bounce@linux-mips.org>, <linux-mips@linux-mips.org>
Subject:  LL and SC instruction simulation
Date:	Mon, 9 Jan 2006 13:19:46 +0530
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit
X-Mailer: Microsoft Office Outlook, Build 11.0.6353
Thread-Index: AcYRL2wEZATk27YPQauJfmdzF9yApgDvyQ4gAACXUrA=
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
In-Reply-To: <200601090742.k097gYaZ017304@lilac.hdcindia.analog.com>
X-Scanned-By: MIMEDefang 2.49 on 137.71.25.51
Return-Path: <satheshbabu.edara@analog.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9809
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: satheshbabu.edara@analog.com
Precedence: bulk
X-list: linux-mips
Content-Length: 646
Lines: 25

 

Hi,
   We have ported linux-2.4.18 and linux-2-6.12 kernel (mips.org)onto MIPS
processor (CPU type lx4189).

 We observed that on 2.4 kernel,ll and sc instruction exception handlers
hitting very often.
Where as on linux-2.6.12 this is not happening.

Can anybody have idea why this instructions are hitting on 2.4.18 kernel and
not on 2-6.12 kernel.

What is the significance of these instructions?.

Note :
   For linux-2.4.18 : We use GCC version -3.3.4 binutils version -2.15 and
uClibc version -0.9.26 For linux-2.6.12 : We use GCC version -3.4.3 binutils
version -2.15 and uClibc version -0.9.28.

Thanks in advance.

Regards,
Sathesh  


From kevink@mips.com Mon Jan  9 08:56:23 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 08:56:43 +0000 (GMT)
Received: from 209-232-97-206.ded.pacbell.net ([209.232.97.206]:23021 "EHLO
	dns0.mips.com") by ftp.linux-mips.org with ESMTP id S8133706AbWAII4X
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 08:56:23 +0000
Received: from mercury.mips.com (sbcns-dmz [209.232.97.193])
	by dns0.mips.com (8.12.11/8.12.11) with ESMTP id k098wuDR010905;
	Mon, 9 Jan 2006 00:58:57 -0800 (PST)
Received: from grendel (grendel [192.168.236.16])
	by mercury.mips.com (8.12.9/8.12.11) with SMTP id k098wtYr002864;
	Mon, 9 Jan 2006 00:58:56 -0800 (PST)
Message-ID: <005a01c614fb$2fe76b00$10eca8c0@grendel>
From:	"Kevin D. Kissell" <kevink@mips.com>
To:	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>,
	<linux-mips-bounce@linux-mips.org>, <linux-mips@linux-mips.org>
References: <200601090742.k097gYaZ017304@lilac.hdcindia.analog.com>
Subject: Re: 
Date:	Mon, 9 Jan 2006 10:00:48 +0100
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2800.1506
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
X-Scanned-By: MIMEDefang 2.39
Return-Path: <kevink@mips.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9810
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: kevink@mips.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2355
Lines: 64

There is no "ideal" value for a given processor frequency.
The lower the value, the less interrupt processing overhead,
but the slower the response time to events that are detected
or serviced during clock interrupts. 1000 HZ *may* be a sensible
value (I have my doubts, personally) for 2+ GHz PC processors, 
but it's excessive (IMHO) for a 200MHz processor and unworkable 
for a 20MHz CPU. I think that 100HZ is still a reasonable value
for an embedded RISC CPU, but the "ideal" value is going to
be a function of the application.

        Regards,

        Kevin K.

----- Original Message ----- 
From: "Sathesh Babu Edara" <satheshbabu.edara@analog.com>
To: "'Kevin D. Kissell'" <kevink@mips.com>; <linux-mips-bounce@linux-mips.org>; <linux-mips@linux-mips.org>
Sent: Monday, January 09, 2006 8:43 AM
Subject: RE: 


> 
> Hi,
>   Appreciate your response .
> 
>   What is the ideal HZ value if the processor speed is 200Mhz?.
> 
> Regards,
> Sathesh
> -----Original Message-----
> From: Kevin D. Kissell [mailto:kevink@mips.com] 
> Sent: Wednesday, January 04, 2006 6:37 PM
> To: Sathesh Babu Edara
> Cc: linux-mips-bounce@linux-mips.org; linux-mips@linux-mips.org
> Subject: Re: 
> 
> Sathesh Babu Edara wrote:
> >  
> > 
> > Hi,
> >    We have ported linux-2.6.12 kernel onto MIPS processor (LX4189) and 
> > the processor speed is 200Mhz.
> > By default Linux-2.6.12 kernel comes with HZ value 1000.Will this HZ 
> > value cause an overhead on the 200MHZ CPU.Can someone advise me on 
> > whether going back to HZ vaule of 100 like Linux-2.4 will reduce the 
> > overhead on this CPU.What are the side effects this change can cause?.
> 
> The 1000Hz clock should not actually cause any problems with a 200MHz CPU,
> but it will suck up an annoyingly high percentage of available cycles.
> Backing off to 100Hz may cause some degradation of some
> real-time/interactive response times, but the improved overall performance
> will probably more than make up for it.  I never build with a HZ value
> greater than 100 these days, but then again, I'm mostly running on FPGAs and
> other hardware emulators where the CPU clock frequencies may be less than
> 1MHz, and are never more than 33MHz.
> Note that a HZ  value of less than 100 may cause some kernel macros to
> generate divide-by-zero operations/exceptions.
> 
> Regards,
> 
> Kevin K.
> 
> 
> 

From ralf@linux-mips.org Mon Jan  9 14:51:36 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 14:51:53 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:12059 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8134414AbWAIOvf (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 14:51:35 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k09EsPre005527;
	Mon, 9 Jan 2006 14:54:26 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k09EsP66005526;
	Mon, 9 Jan 2006 14:54:25 GMT
Date:	Mon, 9 Jan 2006 14:54:25 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	Sathesh Babu Edara <satheshbabu.edara@analog.com>
Cc:	linux-mips-bounce@linux-mips.org, linux-mips@linux-mips.org
Subject: Re: LL and SC instruction simulation
Message-ID: <20060109145425.GA4286@linux-mips.org>
References: <200601090742.k097gYaZ017304@lilac.hdcindia.analog.com> <200601090749.k097nFaZ017891@lilac.hdcindia.analog.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <200601090749.k097nFaZ017891@lilac.hdcindia.analog.com>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9811
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 766
Lines: 21

On Mon, Jan 09, 2006 at 01:19:46PM +0530, Sathesh Babu Edara wrote:

>    We have ported linux-2.4.18 and linux-2-6.12 kernel (mips.org)onto MIPS
> processor (CPU type lx4189).
> 
>  We observed that on 2.4 kernel,ll and sc instruction exception handlers
> hitting very often.
> Where as on linux-2.6.12 this is not happening.

> Can anybody have idea why this instructions are hitting on 2.4.18 kernel and
> not on 2-6.12 kernel.

Only ll/sc instructions in application software can be emulated, so it
would seem your application is behaving different on 2.4 and 2.6 kernels.

> What is the significance of these instructions?.

All sorts of atomic operations.  I suggest you read up on them in See MIPS
Run or short of that in the MIPS32/64 specification.

  Ralf

From ralf@linux-mips.org Mon Jan  9 14:53:18 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 14:53:35 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:35359 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8134414AbWAIOxS (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 14:53:18 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k09EuB7g005590;
	Mon, 9 Jan 2006 14:56:11 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k09EuAwv005589;
	Mon, 9 Jan 2006 14:56:10 GMT
Date:	Mon, 9 Jan 2006 14:56:10 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	zhuzhenhua <zzh.hust@gmail.com>
Cc:	linux-mips <linux-mips@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Message-ID: <20060109145610.GB4286@linux-mips.org>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9812
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 621
Lines: 16

On Mon, Jan 09, 2006 at 01:59:34PM +0800, zhuzhenhua wrote:

> i download a standard 2.6.14 kernel, and compile it for dbau1100, and
> i find the early_initcall(au1x00_setup) was not compiled into the
> vmlinux.
> and i find at the linux-mips cvs, it used plat_setup instead of early_initcall.
> does it means my toolchain is not correct to compile the
> early_initcall, or in the standard 2.6.14 kernel, the early_initcall
> do not work well?

You've downloaded a kernel.org kernel it would seem - doesn't fly for MIPS.
Instead get a kernel from linux-mips.org.

The early_initcall() construct has been removed.

  Ralf

From kevink@mips.com Mon Jan  9 15:13:16 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 15:13:33 +0000 (GMT)
Received: from 209-232-97-206.ded.pacbell.net ([209.232.97.206]:50925 "EHLO
	dns0.mips.com") by ftp.linux-mips.org with ESMTP id S8134420AbWAIPNQ
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 15:13:16 +0000
Received: from mercury.mips.com (sbcns-dmz [209.232.97.193])
	by dns0.mips.com (8.12.11/8.12.11) with ESMTP id k09FFxrM011933;
	Mon, 9 Jan 2006 07:16:00 -0800 (PST)
Received: from grendel (grendel [192.168.236.16])
	by mercury.mips.com (8.12.9/8.12.11) with SMTP id k09FFvYr007330;
	Mon, 9 Jan 2006 07:15:57 -0800 (PST)
Message-ID: <00af01c6152f$dc1863f0$10eca8c0@grendel>
From:	"Kevin D. Kissell" <kevink@mips.com>
To:	"Ralf Baechle" <ralf@linux-mips.org>,
	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>
Cc:	<linux-mips-bounce@linux-mips.org>, <linux-mips@linux-mips.org>
References: <200601090742.k097gYaZ017304@lilac.hdcindia.analog.com> <200601090749.k097nFaZ017891@lilac.hdcindia.analog.com> <20060109145425.GA4286@linux-mips.org>
Subject: Re: LL and SC instruction simulation
Date:	Mon, 9 Jan 2006 16:17:50 +0100
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2800.1506
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
X-Scanned-By: MIMEDefang 2.39
Return-Path: <kevink@mips.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9813
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: kevink@mips.com
Precedence: bulk
X-list: linux-mips
Content-Length: 789
Lines: 22

Ralf writes:
> On Mon, Jan 09, 2006 at 01:19:46PM +0530, Sathesh Babu Edara wrote:
> 
> >    We have ported linux-2.4.18 and linux-2-6.12 kernel (mips.org)onto MIPS
> > processor (CPU type lx4189).
> > 
> >  We observed that on 2.4 kernel,ll and sc instruction exception handlers
> > hitting very often.
> > Where as on linux-2.6.12 this is not happening.
> 
> > Can anybody have idea why this instructions are hitting on 2.4.18 kernel and
> > not on 2-6.12 kernel.
> 
> Only ll/sc instructions in application software can be emulated, so it
> would seem your application is behaving different on 2.4 and 2.6 kernels.

Is there an interface where 2.6 might be telling library code to use system calls
instead LL/SC, where the 2.4 kernel didn't?

            Regards,

            Kevin K.

From p_christ@hol.gr Mon Jan  9 15:17:33 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 15:17:51 +0000 (GMT)
Received: from [62.38.114.37] ([62.38.114.37]:35229 "EHLO pfn3.pefnos")
	by ftp.linux-mips.org with ESMTP id S8134416AbWAIPRd (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 9 Jan 2006 15:17:33 +0000
Received: from xorhgos2.pefnos (xorhgos2.pefnos [192.168.0.3])
	by pfn3.pefnos (Postfix) with ESMTP id 7338D1F101;
	Mon,  9 Jan 2006 17:20:08 +0200 (EET)
From:	"P. Christeas" <p_christ@hol.gr>
To:	Ralf Baechle <ralf@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Date:	Mon, 9 Jan 2006 17:20:01 +0200
User-Agent: KMail/1.9
Cc:	linux-mips@linux-mips.org, zhuzhenhua <zzh.hust@gmail.com>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <20060109145610.GB4286@linux-mips.org>
In-Reply-To: <20060109145610.GB4286@linux-mips.org>
MIME-Version: 1.0
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200601091720.03822.p_christ@hol.gr>
Return-Path: <p_christ@hol.gr>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9814
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: p_christ@hol.gr
Precedence: bulk
X-list: linux-mips
Content-Length: 347
Lines: 12

On Monday 09 January 2006 4:56 pm, Ralf Baechle wrote:

> You've downloaded a kernel.org kernel it would seem - doesn't fly for MIPS.
> Instead get a kernel from linux-mips.org.
>
> The early_initcall() construct has been removed.
>
>   Ralf

What's the difference between the trees?
Aren't the MIPS patches supposed to be merged to Linus' tree?


From ralf@linux-mips.org Mon Jan  9 15:19:00 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 15:19:18 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:53019 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8134416AbWAIPTA (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 15:19:00 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k09FLpvh006413;
	Mon, 9 Jan 2006 15:21:51 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k09FLmvR006411;
	Mon, 9 Jan 2006 15:21:48 GMT
Date:	Mon, 9 Jan 2006 15:21:48 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	"Kevin D. Kissell" <kevink@mips.com>
Cc:	Sathesh Babu Edara <satheshbabu.edara@analog.com>,
	linux-mips-bounce@linux-mips.org, linux-mips@linux-mips.org
Subject: Re: LL and SC instruction simulation
Message-ID: <20060109152148.GD4286@linux-mips.org>
References: <200601090742.k097gYaZ017304@lilac.hdcindia.analog.com> <200601090749.k097nFaZ017891@lilac.hdcindia.analog.com> <20060109145425.GA4286@linux-mips.org> <00af01c6152f$dc1863f0$10eca8c0@grendel>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <00af01c6152f$dc1863f0$10eca8c0@grendel>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9815
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 366
Lines: 11

On Mon, Jan 09, 2006 at 04:17:50PM +0100, Kevin D. Kissell wrote:

> > Only ll/sc instructions in application software can be emulated, so it
> > would seem your application is behaving different on 2.4 and 2.6 kernels.
> 
> Is there an interface where 2.6 might be telling library code to use system calls
> instead LL/SC, where the 2.4 kernel didn't?

No.

  Ralf

From ralf@linux-mips.org Mon Jan  9 15:21:49 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 15:22:06 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:16670 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8134425AbWAIPVt (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 15:21:49 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k09FOUNj006512;
	Mon, 9 Jan 2006 15:24:30 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k09FOTb0006511;
	Mon, 9 Jan 2006 15:24:29 GMT
Date:	Mon, 9 Jan 2006 15:24:29 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	"P. Christeas" <p_christ@hol.gr>
Cc:	linux-mips@linux-mips.org, zhuzhenhua <zzh.hust@gmail.com>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Message-ID: <20060109152429.GE4286@linux-mips.org>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <20060109145610.GB4286@linux-mips.org> <200601091720.03822.p_christ@hol.gr>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <200601091720.03822.p_christ@hol.gr>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9816
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 582
Lines: 19

On Mon, Jan 09, 2006 at 05:20:01PM +0200, P. Christeas wrote:

> > You've downloaded a kernel.org kernel it would seem - doesn't fly for MIPS.
> > Instead get a kernel from linux-mips.org.
> >
> > The early_initcall() construct has been removed.
> >
> >   Ralf
> 
> What's the difference between the trees?

All the MIPS work is happening in the linux-mips.org tree.

> Aren't the MIPS patches supposed to be merged to Linus' tree?

In 2.6.15 things were alomst fully merged but several megabytes of
patches are between the linux-mips.org and kernel.org versions of 2.6.14.

  Ralf

From ralf@linux-mips.org Mon Jan  9 15:27:37 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 15:27:55 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:3867 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8134428AbWAIP1h (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 15:27:37 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k09FUS1L006702;
	Mon, 9 Jan 2006 15:30:28 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k09FUSP4006701;
	Mon, 9 Jan 2006 15:30:28 GMT
Date:	Mon, 9 Jan 2006 15:30:28 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	"Kevin D. Kissell" <kevink@mips.com>
Cc:	Sathesh Babu Edara <satheshbabu.edara@analog.com>,
	linux-mips-bounce@linux-mips.org, linux-mips@linux-mips.org
Subject: Re: LL and SC instruction simulation
Message-ID: <20060109153028.GA6542@linux-mips.org>
References: <200601090742.k097gYaZ017304@lilac.hdcindia.analog.com> <200601090749.k097nFaZ017891@lilac.hdcindia.analog.com> <20060109145425.GA4286@linux-mips.org> <00af01c6152f$dc1863f0$10eca8c0@grendel> <20060109152148.GD4286@linux-mips.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20060109152148.GD4286@linux-mips.org>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9817
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 732
Lines: 17

On Mon, Jan 09, 2006 at 03:21:48PM +0000, Ralf Baechle wrote:

> > > Only ll/sc instructions in application software can be emulated, so it
> > > would seem your application is behaving different on 2.4 and 2.6 kernels.
> > 
> > Is there an interface where 2.6 might be telling library code to use system calls
> > instead LL/SC, where the 2.4 kernel didn't?
> 
> No.

And I think it's not really worth it.  MIPS II did introduce ll/sc in
1991 and it was becoming widely available with MIPS III and some pseudo-
MIPS II R3000 variants also in the embedded markets and MIPS32/MIPS64
were based on that.  So ll/sc-less processors are a very small part of
the market of Linux/MIPS these days, not really worth to optimize for.

  Ralf

From kevink@mips.com Mon Jan  9 15:42:24 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 15:42:41 +0000 (GMT)
Received: from 209-232-97-206.ded.pacbell.net ([209.232.97.206]:55277 "EHLO
	dns0.mips.com") by ftp.linux-mips.org with ESMTP id S8134425AbWAIPmX
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 15:42:23 +0000
Received: from mercury.mips.com (sbcns-dmz [209.232.97.193])
	by dns0.mips.com (8.12.11/8.12.11) with ESMTP id k09Fj9Iq012017;
	Mon, 9 Jan 2006 07:45:10 -0800 (PST)
Received: from grendel (grendel [192.168.236.16])
	by mercury.mips.com (8.12.9/8.12.11) with SMTP id k09Fj7Yr007778;
	Mon, 9 Jan 2006 07:45:08 -0800 (PST)
Message-ID: <00fd01c61533$ef797e30$10eca8c0@grendel>
From:	"Kevin D. Kissell" <kevink@mips.com>
To:	"Ralf Baechle" <ralf@linux-mips.org>
Cc:	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>,
	<linux-mips-bounce@linux-mips.org>, <linux-mips@linux-mips.org>
References: <200601090742.k097gYaZ017304@lilac.hdcindia.analog.com> <200601090749.k097nFaZ017891@lilac.hdcindia.analog.com> <20060109145425.GA4286@linux-mips.org> <00af01c6152f$dc1863f0$10eca8c0@grendel> <20060109152148.GD4286@linux-mips.org> <20060109153028.GA6542@linux-mips.org>
Subject: Re: LL and SC instruction simulation
Date:	Mon, 9 Jan 2006 16:47:01 +0100
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2800.1506
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
X-Scanned-By: MIMEDefang 2.39
Return-Path: <kevink@mips.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9818
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: kevink@mips.com
Precedence: bulk
X-list: linux-mips
Content-Length: 759
Lines: 18

> > > Is there an interface where 2.6 might be telling library code to use system calls
> > > instead LL/SC, where the 2.4 kernel didn't?
> > 
> > No.
> 
> And I think it's not really worth it.  MIPS II did introduce ll/sc in
> 1991 and it was becoming widely available with MIPS III and some pseudo-
> MIPS II R3000 variants also in the embedded markets and MIPS32/MIPS64
> were based on that.  So ll/sc-less processors are a very small part of
> the market of Linux/MIPS these days, not really worth to optimize for.

Hmm.  I can think of at least one *very* high volume MIPS Linux platform still
manufactured by a very large Japanese electronics company where LL/SC
either isn't implemented or doesn't work...  

            Regards,

            Kevin K.

From ralf@linux-mips.org Mon Jan  9 15:48:59 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 15:49:18 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:10268 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8134423AbWAIPs7 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 15:48:59 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k09Fpqqf012712;
	Mon, 9 Jan 2006 15:51:52 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k09FpqnB012711;
	Mon, 9 Jan 2006 15:51:52 GMT
Date:	Mon, 9 Jan 2006 15:51:52 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	"Kevin D. Kissell" <kevink@mips.com>
Cc:	Sathesh Babu Edara <satheshbabu.edara@analog.com>,
	linux-mips@linux-mips.org
Subject: Re: LL and SC instruction simulation
Message-ID: <20060109155152.GF4286@linux-mips.org>
References: <200601090742.k097gYaZ017304@lilac.hdcindia.analog.com> <200601090749.k097nFaZ017891@lilac.hdcindia.analog.com> <20060109145425.GA4286@linux-mips.org> <00af01c6152f$dc1863f0$10eca8c0@grendel> <20060109152148.GD4286@linux-mips.org> <20060109153028.GA6542@linux-mips.org> <00fd01c61533$ef797e30$10eca8c0@grendel>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <00fd01c61533$ef797e30$10eca8c0@grendel>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9819
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 478
Lines: 11

On Mon, Jan 09, 2006 at 04:47:01PM +0100, Kevin D. Kissell wrote:

> Hmm.  I can think of at least one *very* high volume MIPS Linux platform still
> manufactured by a very large Japanese electronics company where LL/SC
> either isn't implemented or doesn't work...  

The user community of that platform of that four letter vendor still
hasn't managed to upgrade their kernels to something that would even be
remotely contemporary, so any 2.6 questions don't apply ...

  Ralf

From jcrouse@cosmic.amd.com Mon Jan  9 17:40:24 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 17:40:46 +0000 (GMT)
Received: from p549F4907.dip.t-dialin.net ([84.159.73.7]:60594 "EHLO
	p549F4907.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133636AbWAIRkY (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 17:40:24 +0000
Received: from amdext3.amd.com ([IPv6:::ffff:139.95.251.6]:16104 "EHLO
	amdext3.amd.com") by linux-mips.net with ESMTP id <S869096AbWAIRm7>;
	Mon, 9 Jan 2006 18:42:59 +0100
Received: from SSVLGW02.amd.com (ssvlgw02.amd.com [139.95.250.170])
	by amdext3.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k09HdbeW031656;
	Mon, 9 Jan 2006 09:41:13 -0800
Received: from 139.95.250.1 by SSVLGW01.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Mon, 09 Jan 2006 09:41:01 -0800
X-Server-Uuid: 89466532-923C-4A88-82C1-66ACAA0041DF
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k09Hf1VP019320; Mon, 9
 Jan 2006 09:41:01 -0800 (PST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id E40DB2028; Mon, 9 Jan 2006
 10:41:00 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k09Hnb4V008738; Mon, 9 Jan 2006 10:49:37
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k09HnasZ008737; Mon, 9 Jan 2006 10:49:36 -0700
Date:	Mon, 9 Jan 2006 10:49:36 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	"Russell King" <rmk@arm.linux.org.uk>
cc:	linux-mips@linux-mips.org, drzeus@drzeus.cx
Subject: Re: Force MMC/SD to 512 byte block sizes
Message-ID: <20060109174936.GJ17575@cosmic.amd.com>
References: <20060106164406.GA15617@cosmic.amd.com>
 <20060106165930.GC16093@flint.arm.linux.org.uk>
MIME-Version: 1.0
In-Reply-To: <20060106165930.GC16093@flint.arm.linux.org.uk>
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FDC7FA72BK3549672-01-01
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9820
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1079
Lines: 28

On 06/01/06 16:59 +0000, Russell King wrote:
> On Fri, Jan 06, 2006 at 09:44:06AM -0700, Jordan Crouse wrote:
> > This patch is not specific to the AU1200 SD driver, but thats what
> > we used to debug and verify this, so thats why it is applied against
> > the linux-mips tree.   Pierre, I'm sending this to you too, because I thought
> > you may be interested.
> 
> NACK.  Please wait until the next round of patches get merged and then
> revalidate this.

Ok - I saw your fixes.  Looks good to me.

I'm still sticking to the (assumption|hypothesis|foolish fantasy) that
even cards that do not support partial block writes will still support
512 byte writes - mainly because I just don't see those ASICs in the 
el-Cheapo card readers being capable of doing the advanced buffering
to convert 512 <-> 1024 or 2048, and hopefully one of these days I'll
find a card to prove that.  Until then, I don't have a leg to stand on,
so I'll quietly hang back.

Jordan

-- 
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>


From giometti@enneenne.com Mon Jan  9 17:43:52 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 17:44:10 +0000 (GMT)
Received: from 81-174-11-161.f5.ngi.it ([81.174.11.161]:27809 "EHLO
	gundam.enneenne.com") by ftp.linux-mips.org with ESMTP
	id S8133636AbWAIRnw (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 17:43:52 +0000
Received: from giometti by gundam.enneenne.com with local (Exim 3.36 #1 (Debian))
	id 1Ew14r-0007vB-00; Mon, 09 Jan 2006 18:45:05 +0100
Date:	Mon, 9 Jan 2006 18:45:05 +0100
From:	Rodolfo Giometti <giometti@linux.it>
To:	Jordan Crouse <jordan.crouse@amd.com>
Cc:	linux-mips@linux-mips.org
Subject: Re: ALCHEMY:  Add SD support to AU1200 MMC/SD driver
Message-ID: <20060109174505.GD1373@gundam.enneenne.com>
References: <20051202190108.GF28227@cosmic.amd.com> <20051214134139.GN22061@hulk.enneenne.com> <20051214155324.GC9734@cosmic.amd.com>
Mime-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha1;
	protocol="application/pgp-signature"; boundary="VUDLurXRWRKrGuMn"
Content-Disposition: inline
In-Reply-To: <20051214155324.GC9734@cosmic.amd.com>
Organization: Programmi e soluzioni GNU/Linux
X-PGP-Key: gpg --keyserver keyserver.penguin.de --recv-keys D25A5633
User-Agent: Mutt/1.5.5.1+cvs20040105i
Return-Path: <giometti@enneenne.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9821
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: giometti@linux.it
Precedence: bulk
X-list: linux-mips
Content-Length: 7683
Lines: 134


--VUDLurXRWRKrGuMn
Content-Type: multipart/mixed; boundary="GpGaEY17fSl8rd50"
Content-Disposition: inline


--GpGaEY17fSl8rd50
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Wed, Dec 14, 2005 at 08:53:25AM -0700, Jordan Crouse wrote:
> Well, hopefully everything will Just Work (TM), but you'll want to make
> sure that all the various definitions are enabled for the AU1100.  I'll
> have to give you my standard disclaimer that I haven't compiled this
> for anything but a DB1200 and PB1200, so I can't promise that it will wor=
k,
> but there is nothing in the code that says it won't.

I'm just trying to run your driver on a Au1100 based board and I got
some problems...

First of all I needed to disable the DMA support (dma =3D 0) and using
the FIFO mode, since Au1100 dma support seems not well implemented (or
not implemented at all) and my board freeze.

After that, when I insert a 256MB MMC card I get the attached messages
and the system refuses to power up the card (please, see the last
message who reports the power status).

Have you any suggestions? :)

Thanks in advance,

Rodolfo

--=20

GNU/Linux Solutions                  e-mail:    giometti@enneenne.com
Linux Device Driver                             giometti@gnudd.com
Embedded Systems                     		giometti@linux.it
UNIX programming                     phone:     +39 349 2432127

--GpGaEY17fSl8rd50
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=mmc_output

Jan  1 00:01:17 hostname kernel: set_ios (id=0, power=1, clock=0Hz, vdd=23, mode=1)
Jan  1 00:01:17 hostname kernel: set_ios (id=0, power=2, clock=450000Hz, vdd=23, mode=1)
Jan  1 00:01:17 hostname kernel: WWPC: power 1
Jan  1 00:01:17 hostname kernel: set_ios (id=0, power=2, clock=450000Hz, vdd=23, mode=1)
Jan  1 00:01:17 hostname kernel: WWPC: power 1
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 00 arg 00000000 flags 00000000
Jan  1 00:01:17 hostname kernel: MMC: req done (00): 0: 00000000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: set_ios (id=0, power=2, clock=450000Hz, vdd=23, mode=1)
Jan  1 00:01:17 hostname kernel: WWPC: power 1
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 2: 3fffffff 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 0: 00000120 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 29 arg 00000000 flags 00000001
Jan  1 00:01:17 hostname kernel: MMC: req done (29): 0: 00ff8000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: set_ios (id=0, power=2, clock=450000Hz, vdd=15, mode=1)
Jan  1 00:01:17 hostname kernel: WWPC: power 1
Jan  1 00:01:17 hostname kernel: set_ios (id=0, power=2, clock=450000Hz, vdd=15, mode=1)
Jan  1 00:01:17 hostname kernel: WWPC: power 1
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 00 arg 00000000 flags 00000000
Jan  1 00:01:17 hostname kernel: MMC: req done (00): 0: 00000000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: set_ios (id=0, power=2, clock=450000Hz, vdd=15, mode=1)
Jan  1 00:01:17 hostname kernel: WWPC: power 1
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 0: 00000120 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 29 arg 00018000 flags 00000001
Jan  1 00:01:17 hostname kernel: MMC: req done (29): 0: 00ff8000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 0: 00000120 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 29 arg 00018000 flags 00000001
Jan  1 00:01:17 hostname kernel: MMC: req done (29): 0: 00ff8000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 0: 00000120 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 29 arg 00018000 flags 00000001
Jan  1 00:01:17 hostname kernel: MMC: req done (29): 0: 00ff8000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 1: 00000000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 1: 00000000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 0: 00000120 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 29 arg 00018000 flags 00000001
Jan  1 00:01:17 hostname kernel: MMC: req done (29): 0: 00ff8000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 0: 00000120 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 29 arg 00018000 flags 00000001
Jan  1 00:01:17 hostname kernel: MMC: req done (29): 0: 00ff8000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 0: 00000120 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 29 arg 00018000 flags 00000001
Jan  1 00:01:17 hostname kernel: MMC: req done (29): 0: 00ff8000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 0: 00000120 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 29 arg 00018000 flags 00000001
Jan  1 00:01:17 hostname kernel: MMC: req done (29): 0: 00ff8000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 1: 00000000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 1: 00000000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 1: 00000000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 37 arg 00000000 flags 00000009
Jan  1 00:01:17 hostname kernel: MMC: req done (37): 1: 00000000 00000000 00000000 00000000
Jan  1 00:01:17 hostname kernel: MMC: starting cmd 02 arg 00000000 flags 0000000a
Jan  1 00:01:17 hostname kernel: MMC: req done (02): 1: 00000000 00000000 00000000 00000000
Jan  1 00:01:17 hostname last message repeated 3 times
Jan  1 00:01:17 hostname kernel: set_ios (id=0, power=2, clock=450000Hz, vdd=15, mode=2)
Jan  1 00:01:17 hostname kernel: WWPC: power 1
Jan  1 00:01:17 hostname kernel: set_ios (id=0, power=0, clock=0Hz, vdd=0, mode=1)
Jan  1 00:01:17 hostname kernel: WWPC: power 0

--GpGaEY17fSl8rd50--

--VUDLurXRWRKrGuMn
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: Digital signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)

iD8DBQFDwqEhQaTCYNJaVjMRArOqAJsFwn3pQfPW2I8+W/IGf4GU8Ad+uwCg1k7P
3j4X9JyhxEXVrTzJydIKS5Q=
=S5Ke
-----END PGP SIGNATURE-----

--VUDLurXRWRKrGuMn--

From jcrouse@cosmic.amd.com Mon Jan  9 17:54:49 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 17:56:16 +0000 (GMT)
Received: from amdext4.amd.com ([163.181.251.6]:12673 "EHLO amdext4.amd.com")
	by ftp.linux-mips.org with ESMTP id S8134429AbWAIRyt (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 9 Jan 2006 17:54:49 +0000
Received: from SAUSGW01.amd.com (sausgw01.amd.com [163.181.250.21])
	by amdext4.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k09HsquB029478;
	Mon, 9 Jan 2006 11:55:33 -0600
Received: from 163.181.250.1 by SAUSGW01.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Mon, 09 Jan 2006 11:55:22 -0600
X-Server-Uuid: 8C3DB987-180B-4465-9446-45C15473FD3E
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint2.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k09HtLh5024379; Mon,
 9 Jan 2006 11:55:21 -0600 (CST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id D33852028; Mon, 9 Jan 2006
 10:55:20 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k09I3vb9009795; Mon, 9 Jan 2006 11:03:57
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k09I3uMN009794; Mon, 9 Jan 2006 11:03:56 -0700
Date:	Mon, 9 Jan 2006 11:03:56 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	linux-usb-devel@lists.sourceforge.net
cc:	linux-mips@linux-mips.org, linux-kernel@vger.kernel.org,
	info-linux@ldcmail.amd.com, thomas.dahlmann@amd.com
Subject: [PATCH] UDC support for MIPS/AU1200 and Geode/CS5536
Message-ID: <20060109180356.GA8855@cosmic.amd.com>
MIME-Version: 1.0
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FDC7C003982713031-01-01
Content-Type: multipart/mixed;
 boundary=3MwIy2ne0vdjdPXF
Content-Disposition: inline
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9822
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 333301
Lines: 9959


--3MwIy2ne0vdjdPXF
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit

From the "two-birds-one-stone" department, I am pleased to present USB UDC
support for both the MIPS Au1200 SoC and the Geode CS5535 south bridge.  
Also, coming soon (in the next few days), OTG, which has been removed from
the usb_host patch, and put into its own patch (as per David's comments).

This patch is against current linux-mips git, but it should apply for Linus's
tree as well.

Regards,
Jordan

--3MwIy2ne0vdjdPXF
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline;
 filename=udc.patch
Content-Transfer-Encoding: 7bit

PATCH:  Add UDC support for MIPS/AU1200 and Geode/CS5536

This patch adds UDC support for the AU1200 processor and the Geode CS5536
southbridge.  

Signed-off-by: Jordan Crouse <jordan.crouse@amd.com>
---

 Documentation/usb/au1200udc.txt   |  185 +
 drivers/usb/gadget/Kconfig        |   86 +
 drivers/usb/gadget/Makefile       |    9 
 drivers/usb/gadget/au1200otg.h    |  147 +
 drivers/usb/gadget/au1200udc.c    | 4880 +++++++++++++++++++++++++++++++++++++
 drivers/usb/gadget/au1200udc.h    |  936 +++++++
 drivers/usb/gadget/au1200uoc.c    | 2015 +++++++++++++++
 drivers/usb/gadget/au1200uoc.h    | 1338 ++++++++++
 drivers/usb/gadget/ether.c        |   65 
 drivers/usb/gadget/file_storage.c |    8 
 drivers/usb/gadget/gadget_chips.h |    8 
 drivers/usb/gadget/zero.c         |   10 
 12 files changed, 9684 insertions(+), 3 deletions(-)

diff --git a/Documentation/usb/au1200udc.txt b/Documentation/usb/au1200udc.txt
new file mode 100644
index 0000000..20f4d58
--- /dev/null
+++ b/Documentation/usb/au1200udc.txt
@@ -0,0 +1,185 @@
+-------------------------------------------------------------------------------
+Howto for Linux device driver for the AU1200 USB Device Controller (UDC)
+for gadget driver stack
+-------------------------------------------------------------------------------
+
+Author: Thomas Dahlmann
+
+INTRODUCTION:
+
+The AU1200 UDC is part of AMD MIPS CPU Au1200 and AMD5536 chip (south-
+bridge of AMD Geode LX Processor).
+It is a DMA capable usb device controller. The usb port is shared
+between host and UDC. The Au1200 on-chip OTG controller is used to switch the
+usb port between host, UDC and neutral. So au1200otg driver is needed
+to get the UDC operating.
+
+Current gadget support: file_storage, ether, zero
+
+-------------------------------------------------------------------------------
+WHAT YOU NEED:
+-------------------------------------------------------------------------------
+
+copy/replace following files to /usr/src/linux/drivers/usb/gadget
+        au1200udc.c
+        au1200udc.h
+        au1200otg.h
+        au1200uoc.c
+        au1200uoc.h
+        ether.c
+        file_storage.c
+        zero.c
+        gadget_chips.h
+        Makefile
+        Kconfig 
+
+-------------------------------------------------------------------------------
+HOW TO INSTALL IT:
+-------------------------------------------------------------------------------
+
+change to directory /usr/src/linux
+
+configure gadget as module:
+        "make menuconfig"
+        under "Code maturity level options" choose "Prompt for development ..."
+        goto "Device Drivers"
+        goto "USB support" -> "USB Gadget support"
+        choose "Support for USB Gadgets" as module
+        under choice "USB Peripheral Controller" choose "AU1200UDC"
+        under "USB Gadget Drivers"
+        choose "Gadget Zero" as module or
+        choose "Ethernet Gagdet" as module or
+        choose "File-backed Storage Gadget" as module
+        choose "AU1200 USB portmux control (On-The-Go support)"
+        under choice "OTG port functionality" choose "Gadget only"
+        exit and save config
+
+compile and install modules:
+        "make modules modules_install"
+
+-------------------------------------------------------------------------------
+HOW TO USE IT:
+-------------------------------------------------------------------------------
+
+*** How to load FILE-BACKED STORAGE gadget driver - mass storage ***
+enable USB mass storage support for linux host:
+        change to directory /usr/src/linux
+        "make menuconfig"
+        under "File systems" choose "DOS/FAT/NT filesystems"
+        choose "MSDOS fs support"
+        under "Device Drivers" under "SCSI device support"
+                choose "SCSI device support"
+                choose "SCSI generic support"
+        under "Device Drivers" under "USB support" in section 
+                "USB Device Class drivers" choose
+                "USB Mass Storage support"
+        compile new kernel
+create disk file:
+        "dd bs=1M count=128 if=/dev/zero of=/tmp/disk"
+        => creates a 128Mbyte image file /tmp/disk
+load modules:
+        "modprobe au1200udc"  
+        "modprobe g_file_storage file=/tmp/disk"
+        "modprobe au1200otg"
+create a primary FAT16 disk partition via linux host site:
+        "fdisk /dev/sda", make FAT16 prim. partition
+        => "n", "p", "1", "<RETURN>", "<RETURN>", "t", "6", "w",
+        "mkdosfs /dev/sda1"
+        "sync"
+create primary disk partition via Windows XP host site:
+        right click on "My Computer"
+        choose "Manage" => "Disk Management"
+        choose usb disk and follow instructions of partition menu
+mount usb mass storage device on linux host:
+        make directory "/mnt/gadget/"
+        "mount -t msdos /dev/sda1 /mnt/gadget"
+
+***  How to access files of disk image on UDC side ***
+When files were copied from host to UDC mass storage device then files
+are inside the monolitic disk image (see above) on UDC side. This
+disk image can be mounted via the loopback device driver to a 
+directory on UDC side to access these files.
+Steps on UDC side:
+        enable kernel support for loopback device
+        change to directory /usr/src/linux
+        "make menuconfig"
+        under "Block devices" choose "Loopback device support"
+                and recompile the kernel
+        determine offset inside disk image:
+        "fdisk -l -u disk_image", output is like:
+>> You must set cylinders.
+>> You can do this from the extra functions menu.
+>>
+>> Disk /tmp/disk128: 5 heads, 52 sectors, 0 cylinders
+>> Units = sectors of 1 * 512 bytes
+>>
+>>         Device Boot    Start       End    Blocks   Id  System
+>> /tmp/disk128p1            52    262079    131014    6  FAT16
+
+        get offset my multiplying start value by sector size:
+        52 * 512 = 26624
+        mount disk image:
+        "mount -o loop,offset=26624 -t msdos disk_image /mnt"
+
+
+*** How to load ZERO gadget driver - simple BULK loop back ***
+load modules:
+UDC driver:
+        (a) Slave/Fifo mode:       "modprobe au1200udc use_dma=0"
+        (b) DMA Buffer Fill mode:  "modprobe au1200udc use_dma=1" 
+        default:
+        (c) DMA PPBNDU mode:       "modprobe au1200udc"  
+        (d) DMA PPBDU mode:        "modprobe au1200udc use_dma=1 use_dma_ppb=1 use_dma_ppb_du=1"  
+        (e) fullspeed mode:        "modprobe au1200udc use_fullspeed=1", can be combined
+                                    with all dma modes  
+        (f) special higspeed
+            tx buffer size:        "modprobe au1200udc hs_tx_buf=<buf_size in dwords>"
+                                   example: "modprobe au1200udc use_dma=1 hs_tx_buf=128"
+                                            => buffer size = 512 bytes (=bulk max packet)
+Gadget Zero driver:
+        (a) Bulk loop:             "modprobe g_zero"
+        (b) Int loop:              "modprobe g_zero use_interrupt_traffic=1"
+        (c) Source/Sink            "modprobe g_zero loopdefault=0"
+                                   OUT data must all be zero's
+        (d) Source/Sink count      "modprobe g_zero loopdefault=0 pattern=1"
+                                   each OUT packet must count modulo63 (0,1,..,62,0,1,..) 
+OTG driver:                        "modprobe au1200otg"
+example:
+        "modprobe au1200udc"
+        "modprobe g_zero"
+        "modprobe au1200otg"
+        => loads driver for DMA PPBNDU mode and Bulk loop  
+
+
+*** How to use ETHERNET gadget driver (CDC protocol) ***
+                   with Linux Host
+UDC side bringup: 
+        load gadget modules
+        "modprobe au1200udc"  
+        "modprobe g_ether"
+        "modprobe au1200otg"
+        "ifconfig usb0 192.168.0.2"  
+Host side bringup: 
+        install support for CDC Ethernet:
+        change to directory /usr/src/linux
+        "make menuconfig"
+        under "Device Drivers" under "USB support" under
+        "USB Network adapters" choose
+        "Multi-purpose USB Networking Framework"
+        choose "CDC Ethernet support"
+        compile mew kernel
+        "modprobe CDCEther"
+        "ifconfig eth1 192.168.0.1"
+        note: assuming there is one network card assigned to eth0,
+                otherwise kernel messages of CDC Ethernet module show
+                which interface (ethX) is used 
+Use network connection: 
+        after bringup of host and UDC side it behaves like a normal
+                ethernet connection between host and UDC
+        test the connection:
+        host side: "ping -I eth1 192.168.0.2"
+        UDC side : "ping -I usb0 192.168.0.1"
+        note: the "-I" option assures that the USB cable is used, the
+                option can be omitted when the routing table is setup to avoid
+                using other network interfaces as eth0
+
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index ff075a5..2a3b652 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -89,7 +89,27 @@ config USB_NET2280
 	depends on USB_GADGET_NET2280
 	default USB_GADGET
 	select USB_GADGET_SELECTED
+config USB_GADGET_AU1200UDC
+	boolean "AU1200UDC"
+	depends on PCI || SOC_AU1200
+	select USB_GADGET_DUALSPEED
+	help
+	   AU1200 UDC is a PCI based USB peripheral controller which
+	   supports both full and high speed USB 2.0 data transfers.  
+	   
+	   It has four configurable endpoints, as well as endpoint zero
+	   (for control transfers).
+
+	   Say "y" to link the driver statically, or "m" to build a
+	   dynamically linked module called "au1200udc" and force all
+	   gadget drivers to also be dynamically linked.
 
+config USB_AU1200UDC
+	tristate
+	depends on USB_GADGET_AU1200UDC
+	default USB_GADGET
+	select USB_GADGET_SELECTED
+        select USB_PORT_AU1200OTG
 config USB_GADGET_PXA2XX
 	boolean "PXA 25x or IXP 4xx"
 	depends on (ARCH_PXA && PXA25x) || ARCH_IXP4XX
@@ -322,7 +342,7 @@ config USB_ETH
 
 config USB_ETH_RNDIS
 	bool "RNDIS support (EXPERIMENTAL)"
-	depends on USB_ETH && EXPERIMENTAL
+	depends on USB_ETH && EXPERIMENTAL && !(USB_GADGET_AU1200UDC)
 	default y
 	help
 	   Microsoft Windows XP bundles the "Remote NDIS" (RNDIS) protocol,
@@ -395,4 +415,68 @@ config USB_G_SERIAL
 
 endchoice
 
+#
+# AU1200 USB OTG options
+#
+config USB_PORT_AU1200OTG
+	boolean "AU1200 USB portmux control (On-The-Go support)"
+	depends on USB_GADGET_AU1200UDC || USB_EHCI_HCD || USB_OHCI_HCD
+	default n
+	help
+	   The AU1200 and Au1200 USB device port can be used as
+	   either a host port or a device port.
+	   Say "y" here if you want to use both or if you want to
+	   setup this port to fit into your board configuration.
+
+	   If the AU1200UDC driver is configured to be statically
+	   linked this module will be linked into the kernel image
+	   as well otherwise an additional module called
+	   "au1200otg" will be built.
+
+config USB_AU1200OTG
+	tristate
+	depends on USB_PORT_AU1200OTG
+	default USB_AU1200UDC
+
+choice
+	prompt "OTG port functionality"
+	depends on USB_PORT_AU1200OTG
+	default USB_OTGMUX_GADGET
+
+config USB_OTGMUX_HOST
+	boolean "Host only"
+	depends on !USB_GADGET_AU1200UDC && (USB_EHCI_HCD || USB_OHCI_HCD)
+	help
+	   Select this if your device port is connected to a
+	   Standard-A or a Mini-A connector.
+	   It is possible to choose this with a Mini-AB connector
+	   if the device controller is not to be used.
+
+config USB_OTGMUX_GADGET
+	boolean "Gadget only"
+	depends on USB_GADGET_AU1200UDC
+	help
+	   Select this if your device port is connected to a
+	   Standard-B or a Mini-B connector.
+	   It is possible to choose this with a Mini-AB connector
+	   if the host controller is not to be used at this port.
+
+config USB_OTGMUX_IDPIN
+	boolean "Cable select"
+	depends on USB_GADGET_AU1200UDC && (USB_EHCI_HCD || USB_OHCI_HCD)
+	help
+	   Choose this if you want to use both host and device at
+	   this port. The port multiplexer is controlled by the
+	   connectors ID pin. If an A-plug is connected the port
+	   it is routed to the host otherwise it's routed to the
+	   device controller. 
+
+           This is useful for validation platforms which use AB
+           receptacle in order to share one port between host and device.
+           It is not a USB compliant option.
+
+	   Select this only if your device port is connected to
+	   a Mini-AB connector.
+
+endchoice
 endmenu
diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile
index d5fd04d..0298250 100644
--- a/drivers/usb/gadget/Makefile
+++ b/drivers/usb/gadget/Makefile
@@ -3,6 +3,7 @@
 #
 obj-$(CONFIG_USB_DUMMY_HCD)	+= dummy_hcd.o
 obj-$(CONFIG_USB_NET2280)	+= net2280.o
+obj-$(CONFIG_USB_AU1200UDC)	+= au1200udc.o
 obj-$(CONFIG_USB_PXA2XX)	+= pxa2xx_udc.o
 obj-$(CONFIG_USB_GOKU)		+= goku_udc.o
 obj-$(CONFIG_USB_OMAP)		+= omap_udc.o
@@ -28,3 +29,11 @@ obj-$(CONFIG_USB_GADGETFS)	+= gadgetfs.o
 obj-$(CONFIG_USB_FILE_STORAGE)	+= g_file_storage.o
 obj-$(CONFIG_USB_G_SERIAL)	+= g_serial.o
 
+#
+# AU1200 USB OTG options
+#
+ifeq ($(CONFIG_USB_PORT_AU1200OTG),y)
+obj-$(CONFIG_USB_AU1200OTG)	+= au1200otg.o
+
+au1200otg-objs			:= au1200uoc.o
+endif
diff --git a/drivers/usb/gadget/au1200otg.h b/drivers/usb/gadget/au1200otg.h
new file mode 100644
index 0000000..2b05703
--- /dev/null
+++ b/drivers/usb/gadget/au1200otg.h
@@ -0,0 +1,147 @@
+/*
+ * AMD Au1200 USB OTG driver
+ */
+
+/*
+ * Copyright (C) 2005 AMD (http://www.amd.com)
+ * Author: Karsten Boge 
+ *
+ * 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
+ */
+#ifndef AU1200OTG_H
+#define AU1200OTG_H
+
+/* log Bug 5395 */
+#define OTG_HNP_ERR_LOG
+
+/*****************************************************************************
+*  Constants
+*****************************************************************************/
+
+
+/**********************************
+ * OTG sub-state definitions
+***********************************/
+
+#define OTG_STATE_MASK                  0x0F
+
+#define OTG_STATE_B_HOST_WT             (0x10 | OTG_STATE_B_HOST)
+#define OTG_STATE_B_PERIPHERAL_WT       (0x10 | OTG_STATE_B_PERIPHERAL)
+#define OTG_STATE_B_PERIPHERAL_DC       (0x20 | OTG_STATE_B_PERIPHERAL)
+#define OTG_STATE_B_SRP_WAIT_SE0        (0x10 | OTG_STATE_B_SRP_INIT)
+#define OTG_STATE_B_SRP_D_PULSE         (0x20 | OTG_STATE_B_SRP_INIT)
+#define OTG_STATE_B_SRP_V_PULSE         (0x30 | OTG_STATE_B_SRP_INIT)
+#define OTG_STATE_B_SRP_V_DCHRG         (0x40 | OTG_STATE_B_SRP_INIT)
+#define OTG_STATE_B_SRP_WAIT_VBUS       (0x50 | OTG_STATE_B_SRP_INIT)
+
+#define OTG_STATE_A_IDLE_WAIT_DP        (0x10 | OTG_STATE_A_IDLE)
+#define OTG_STATE_A_IDLE_WAIT_VP        (0x20 | OTG_STATE_A_IDLE)
+#define OTG_STATE_A_IDLE_WAIT_MP        (0x30 | OTG_STATE_A_IDLE)
+#define OTG_STATE_A_IDLE_WAIT_DV        (0x40 | OTG_STATE_A_IDLE)
+#define OTG_STATE_A_WAIT_BCON_VB        (0x10 | OTG_STATE_A_WAIT_BCON)
+#define OTG_STATE_A_WAIT_VFALL_DN       (0x10 | OTG_STATE_A_WAIT_VFALL)
+
+
+/**********************************
+*  typical timer values
+**********************************/
+
+#define OTG_TMR_WAIT_VFALL     10   /* (  ) A waits for VBus                 */
+#define OTG_TMR_A_WAIT_VRISE   100  /* (  ) A waits for VBus                 */
+#define OTG_TMR_A_WAIT_BCON    200  /* (  ) A waits for B-connect (1.. s)    */
+#define OTG_TMR_A_IDLE_BDIS    250  /* (ms) A waits for B-disc (200.. ms)    */
+#define OTG_TMR_B_WAIT_ADISCON 600  /* (us) B waits for A to disconnect <1ms */
+#define OTG_TMR_B_ACON_BRST    200  /* (us) B waits before starting reset    */
+#define OTG_TMR_B_ASE0_BRST    5    /* (ms) B waits for A-conn (3.125.. ms)  */
+#define OTG_TMR_B_AIDL_BDIS    50   /* (ms) B waits before dc (5..150ms)     */
+#define OTG_TMR_SRP_WAIT_SE0   2    /* (  ) B SRP idle wait                  */
+#define OTG_TMR_SRP_WAIT_DP    7    /* (ms) B SRP D_PULSE (5..10ms)          */
+#define OTG_TMR_SRP_WAIT_VP    80   /* (ms) B SRP V_PULSE (5..100ms)         */
+#define OTG_TMR_SRP_DCHRG_V    30   /* (  ) B SRP VBus discharge             */
+#define OTG_TMR_SRP_WAIT_VRS   5800 /* (ms) B SRP waits for VBus (5..6s)     */
+#define OTG_TMR_ASRP_WAIT_MP   4    /* (  ) A SRP min. pulse                 */
+#define OTG_TMR_ASRP_WAIT_DP   10   /* (ms) A SRP D_PULSE TO                 */
+#define OTG_TMR_ASRP_WAIT_VP   200  /* (ms) A SRP V_PULSE TO                 */
+#define OTG_TMR_ASRP_WAIT_DV   200  /* (  ) A SRP waits for V_PULSE          */
+#define OTG_TMR_A_BCON_VB      50   /* (  ) A waits for VBus after connect   */
+
+#define OTG_TMR_IDSNS_WAIT     10   /* (ms) ID sense wait                    */
+
+/*********************************/
+
+#define TIMER_PERIOD           1000      /* 10 ms, if longer than 10ms       */
+
+/**********************************
+ * OTG state parameters
+ **********************************/
+
+#define OTG_HOST_READY         (1<<20)   /* indicates a USB host driver is   */
+                                         /* running                          */
+#define OTG_GADGET_READY       (1<<21)   /* indicates a USB gadget driver is */
+                                         /* running                          */
+#define OTG_A_BUS_REQ          (1<<22)   /* used by appl-SW to request a     */
+                                         /* VBus rise, auto-reset by driver  */
+#define OTG_A_BUS_DROP         (1<<23)   /* used by appl-SW to request a     */
+                                         /* VBus drop, auto-reset by driver  */
+#define OTG_A_CLR_ERR          (1<<24)   /* used by appl-SW to request VBerr */
+                                         /* clean-up, auto-reset by driver   */
+#define OTG_AB_HNP_REQ         (1<<25)   /* used by appl-SW to initiate      */
+                                         /* HNP, auto-reset by driver        */
+#define OTG_B_BUS_REQ          (1<<26)   /* used by appl-SW to request       */
+                                         /* B-device functionality, ...      */
+#define OTG_B_BUS_DIS          (1<<27)   /* used by appl-SW to request       */
+                                         /* disable B-device functionality   */
+#define OTG_B_aSSN_REQ         (1<<28)   /* used by appl-SW to initiate SRP, */
+                                         /* auto-reset by the driver         */
+#define OTG_B_SRP_ERROR        (1<<29)   /* indicates invalid HW conditions  */
+                                         /* during SRP, reset by writing "1" */
+#define OTG_A_VBUS_FAILED      (1<<30)   /* indicates a VBus error, reset by */
+                                         /* writing "1", when setting        */
+                                         /* CLR_ERR or when leaving A-states */
+#define OTG_UDC_RWK_REQ        (1<<31)   /* call UDC function to force a     */
+                                         /* remote wake-up                   */
+
+#define SW_REQUEST_MASK        (OTG_A_BUS_REQ | OTG_A_BUS_DROP | \
+                                OTG_A_CLR_ERR | OTG_B_aSSN_REQ | \
+                                OTG_B_BUS_REQ | OTG_B_BUS_DIS | \
+                                OTG_UDC_RWK_REQ)
+
+/*********************************************************************/
+
+/*
+ * gadget events for notify function
+ */
+#define OTG_GADGET_EVT_SVDROP  (1<<0)    /* Session valid drop       */
+#define OTG_GADGET_EVT_SVALID  (1<<1)    /* Session valid            */
+#define OTG_GADGET_REQ_WAKE    (1<<2)    /* Request remote wake-up   */
+
+/*** HS-A0 WA: gadget phy suspend issue                            ***/
+#define OTG_FLAGS_UDC_SUSP     (1<<17)   /* gadget phy suspended     */
+
+#ifdef OTG_HNP_ERR_LOG
+#define OTG_FLAGS_HNP_ERR     (1<<18)   /* HNP error bug 5395 occured  */
+#endif
+
+/*****************************************************************************
+*  Data
+*****************************************************************************/
+
+struct usb_otg_gadget_extension {
+	int (*request) (u32);	/* function call for state change requests */
+	u32 (*query) (int);	/* function call to query state            */
+	void (*notify) (u32);   /* filled in by gadget for notification    */
+};
+
+#endif /* AU1200OTG_H */
diff --git a/drivers/usb/gadget/au1200udc.c b/drivers/usb/gadget/au1200udc.c
new file mode 100644
index 0000000..7153902
--- /dev/null
+++ b/drivers/usb/gadget/au1200udc.c
@@ -0,0 +1,4880 @@
+/*
+ * AMD Au1200 UDC high/full speed USB device controller driver.
+ *
+ * Note: Driver also works with AMD Geode LX southbridge AMD5536 
+ */
+
+/*
+ * Copyright (C) 2005 AMD (http://www.amd.com)
+ * Author: Thomas Dahlmann 
+ *
+ * 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
+ */
+
+/*****************************************************************************
+ * Defines
+ *****************************************************************************/
+
+/* debug control */
+#undef UDC_DEBUG
+/* #define UDC_DEBUG     1 */
+#undef UDC_VERBOSE
+/* #define UDC_VERBOSE */        
+/* #define UDC_REGISTER_DUMP */
+
+/* Driver strings */
+#define UDC_MOD_DESCRIPTION         "AMD Au1200 UDC - USB Device Controller"
+#define UDC_DRIVER_VERSION_STRING   "01.00.0204 - $Revision: #4 $"
+
+/*****************************************************************************
+ *  Includes
+ *****************************************************************************/
+
+/* system */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/kernel.h>
+#include <linux/version.h>
+#include <linux/delay.h>
+#include <linux/ioport.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/smp_lock.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/timer.h>
+#include <linux/list.h>
+#include <linux/interrupt.h>
+#include <linux/ioctl.h>
+#include <linux/fs.h>
+#include <linux/dmapool.h>
+#include <linux/moduleparam.h>
+#include <linux/device.h>
+#include <asm/byteorder.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/unaligned.h>
+
+/* MIPS config */
+#ifdef CONFIG_SOC_AU1200
+#include <asm/mach-au1x00/au1000.h>
+#include <linux/platform_device.h>
+#endif
+
+/* gadget stack */
+#include <linux/usb_ch9.h>
+#include <linux/usb_gadget.h>
+#include <linux/usb_otg.h>
+
+/* udc/uoc specific */
+#include "au1200udc.h"
+#include "au1200uoc.h"
+
+
+/* use RDE timer for new kernel only */
+#define UDC_USE_TIMER
+/*****************************************************************************
+ *  Static Function Declarations
+ *****************************************************************************/
+
+void udc_tasklet_disconnect(unsigned long);
+#ifdef UDC_USE_TIMER
+void udc_timer_function(unsigned long v);
+void udc_pollstall_timer_function(unsigned long v);
+#endif
+static int udc_rxfifo_read_dwords(struct udc* dev, u32* buf, int dwords);
+static void empty_req_queue (struct udc_ep *);
+static int udc_probe (struct udc* dev);
+static void udc_basic_init (struct udc *dev);
+static void udc_setup_endpoints (struct udc *dev);
+static void udc_soft_reset(struct udc* dev);
+#ifdef UDC_DEBUG
+static void dump_buffer(u8* buf, u32 bytes);
+static int udc_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
+static int udc_open (struct inode *inode, struct file *file);
+static int udc_release (struct inode *inode, struct file *file);
+#endif
+static struct udc_data_dma* udc_get_last_dma_desc(struct udc_request* req);
+static u32 udc_get_ppbdu_rxbytes(struct udc_request* req);
+static int udc_free_dma_chain(struct udc* dev, struct udc_request* req);
+static int udc_create_dma_chain(struct udc_ep* ep, struct udc_request* req, unsigned long buf_len, int gfp_flags);
+static inline int startup_registers(struct udc* dev);
+#ifdef CONFIG_SOC_AU1200
+void au1200_sync(void);
+#endif
+static int udc_remote_wakeup(struct udc* dev);
+#if   defined(CONFIG_SOC_AU1200)
+static int udc_suspend(struct udc* dev);
+static int udc_resume(struct udc* dev);
+#else
+static int udc_pci_probe (struct pci_dev *pdev, const struct pci_device_id *id);
+static void udc_pci_remove (struct pci_dev *pdev);
+#endif
+
+/*****************************************************************************
+ *  Data
+ *****************************************************************************/
+
+/* description */
+static const char mod_desc [] = UDC_MOD_DESCRIPTION;
+static const char name [] =     DRIVER_NAME_FOR_PRINT; 
+
+/* structure to hold endpoint function pointers */
+static struct usb_ep_ops udc_ep_ops;
+
+/* received setup data */
+static union udc_setup_data setup_data;
+
+/* pointer to device object */      
+static struct udc       *udc;
+
+/* irq spin lock for soft reset */
+spinlock_t udc_irq_spinlock;
+/* stall spin lock */
+spinlock_t udc_stall_spinlock;
+
+/* this is used for dma chaining */
+static int udc_gfp_flags = 0;
+        
+/* slave mode: pending bytes in rx fifo after nyet,
+used if EPIN irq came but no req was available */
+static unsigned int udc_rxfifo_pending = 0;
+
+/* count soft resets after suspend to avoid loop */
+static int soft_reset_occured = 0;
+#ifdef UDC_IPBUG_3958_WORKAROUND
+static int soft_reset_after_usbreset_occured = 0;
+#endif
+
+#ifdef UDC_USE_TIMER
+/* timer */
+static struct timer_list udc_timer;
+static int stop_timer = 0;
+int set_rde = -1;
+DECLARE_COMPLETION(on_exit);
+static struct timer_list udc_pollstall_timer;
+static int stop_pollstall_timer = 0;
+DECLARE_COMPLETION(on_pollstall_exit);
+#endif
+
+/* tasklet for usb disconnect */
+DECLARE_TASKLET(disconnect_tasklet, udc_tasklet_disconnect, (unsigned long) &udc);
+
+#ifdef USE_AU1200_PCI_DUMMY
+static struct pci_dev pdev_dummy;
+static struct pci_dev* pdev = &pdev_dummy;
+#endif
+
+#ifdef UDC_IPBUG_3958_WORKAROUND
+/* CNAK pending field: bit0 = ep0in, bit16 = ep0out */
+static u32 cnak_pending = 0;
+#define UDC_QUEUE_CNAK(ep, num) \
+        if (readl(&((ep)->regs->ctl)) & AMD_BIT(UDC_EPCTL_NAK)) { \
+                DBG("NAK could not be cleared for ep%d\n", num); \
+                cnak_pending |= 1 << (num); \
+                (ep)->naking = 1; \
+        } \
+        else \
+                cnak_pending = cnak_pending & (~(1<<(num))); 
+#else
+#define UDC_QUEUE_CNAK(ep, num) {} 
+#endif
+
+#ifdef UDC_IPBUG_3943_WORKAROUND
+/* otg registering count */
+static u32 otg_reg_count = 0;
+#endif
+/* gadget registering count */
+static u32 gadget_bind_count = 0;
+
+/* endpoint names used for print */
+static const char ep0_string[] = "ep0in";
+static const char *ep_string[] = {
+        ep0_string,
+        "ep1in-int", "ep2in-bulk", "ep3in-bulk", "ep4in-bulk", "ep5in-bulk", "ep6in-bulk", "ep7in-bulk", "ep8in-bulk",
+        "ep9in-bulk", "ep10in-bulk", "ep11in-bulk", "ep12in-bulk", "ep13in-bulk", "ep14in-bulk", "ep15in-bulk", "ep0out",
+        "ep1out-bulk", "ep2out-bulk", "ep3out-bulk", "ep4out-bulk", "ep5out-bulk", "ep6out-bulk", "ep7out-bulk", "ep8out-bulk",
+        "ep9out-bulk", "ep10out-bulk", "ep11out-bulk", "ep12out-bulk", "ep13out-bulk", "ep14out-bulk", "ep15out-bulk" 
+};
+
+#ifdef UDC_DEBUG
+/* driver callback functions */
+static struct file_operations udc_fops = {
+        owner:          THIS_MODULE,
+
+        read:           NULL,
+        write:          NULL,
+        ioctl:          udc_ioctl,
+        open:           udc_open,
+        release:        udc_release,
+};
+#endif
+
+/* PCI device parameters */
+static struct pci_device_id pci_id[] = {{
+        .vendor =       UDC_PCI_VENID,
+        .device =       UDC_PCI_DEVID,
+        .class =        UDC_PCI_CLASS,
+        .class_mask =   UDC_PCI_CLASS_MASK,
+        .subvendor =    PCI_ANY_ID,
+        .subdevice =    PCI_ANY_ID,
+},
+{}
+};
+
+#if  !defined(CONFIG_SOC_AU1200)
+/* PCI functions */
+static struct pci_driver udc_pci_driver = {
+        .name =         (char *) name,
+        .id_table =     pci_id,
+        .probe =        udc_pci_probe,
+        .remove =       udc_pci_remove,
+};
+#endif
+
+#ifdef UDC_DEBUG
+/* data for debuging only */
+static unsigned long no_pref_req = 0;
+static unsigned long no_req = 0;
+static u32 same_cfg = 0;
+static u32 num_enums = 0;
+#endif
+
+/****** following flags can be set by module parameters */
+/* DMA usage flag */
+static int use_dma = 1;
+/* packet per buffer dma */
+static int use_dma_ppb = 1;
+/* with per descr. update */
+static int use_dma_ppb_du = 0;
+/* buffer fill mode */
+static int use_dma_bufferfill_mode = 0;
+/* full speed only mode */
+static int use_fullspeed = 0;
+/* tx buffer size for high speed */
+static unsigned long hs_tx_buf = UDC_EPIN_BUFF_SIZE;
+
+/* module parameters */
+MODULE_PARM (use_dma, "i");
+MODULE_PARM_DESC (use_dma, "true for DMA");
+MODULE_PARM (use_dma_ppb, "i");
+MODULE_PARM_DESC (use_dma_ppb, "true for DMA in packet per buffer mode");
+MODULE_PARM (use_dma_ppb_du, "i");
+MODULE_PARM_DESC (use_dma_ppb_du, "true for DMA in packet per buffer mode with descriptor update");
+MODULE_PARM (use_fullspeed, "i");
+MODULE_PARM_DESC (use_fullspeed, "true for fullspeed only");
+MODULE_PARM (hs_tx_buf, "l");
+MODULE_PARM_DESC (hs_tx_buf, "high speed tx buffer size for data endpoints in dwords");
+
+MODULE_DESCRIPTION (UDC_MOD_DESCRIPTION);
+MODULE_AUTHOR ("Thomas Dahlmann");
+MODULE_LICENSE("GPL");
+
+#ifndef USE_AU1200_PCI_DUMMY
+MODULE_DEVICE_TABLE (pci, pci_id);
+#endif
+
+/*****************************************************************************
+ *  Function Definitions
+ *****************************************************************************/
+
+/* AU specific */
+#ifdef CONFIG_SOC_AU1200
+void au1200_sync(void)
+{
+        au1200_sync_delay();
+}
+#endif
+
+#ifdef UDC_DEBUG
+/**
+ * Dumps byte read access
+ * 
+ * \param a address pointer
+ * \return read byte
+ */
+static void print_td(struct udc_data_dma *p)
+{
+        INFO("td = %08lx: status=%08lx bufptr=%08lx next=%08lx\n", 
+             (unsigned long) p,
+             (unsigned long) p->status,
+             (unsigned long) p->bufptr,
+             (unsigned long) p->next);
+}
+#endif
+
+/* printing registers --------------------------------------------------------*/
+/**
+ * Prints UDC device registers and endpoint irq registers
+ * 
+ * \param dev pointer to device struct 
+ */
+static void print_regs(struct udc* dev)
+{
+#ifndef UDC_IPBUG_3943_WORKAROUND
+        DBG( "------- Device registers -------\n");
+        DBG( "dev config     = %08lx\n", (unsigned long) dev->regs->cfg);
+        DBG( "dev control    = %08lx\n", (unsigned long) dev->regs->ctl);
+        DBG( "dev status     = %08lx\n", (unsigned long) dev->regs->sts);
+        DBG( "\n");
+        DBG( "dev int's      = %08lx\n", (unsigned long) dev->regs->irqsts);
+        DBG( "dev intmask    = %08lx\n", (unsigned long) dev->regs->irqmsk);
+        DBG( "\n");
+        DBG( "dev ep int's   = %08lx\n", (unsigned long) dev->regs->ep_irqsts);
+        DBG( "dev ep intmask = %08lx\n", (unsigned long) dev->regs->ep_irqmsk);
+        DBG( "\n");
+#endif
+        DBG( "USE DMA        = %d\n", use_dma);
+        if (use_dma && use_dma_ppb && !use_dma_ppb_du) {
+                DBG( "DMA mode       = PPBNDU (packet per buffer WITHOUT desc. update)\n");
+#ifndef UDC_DEBUG
+                INFO( "DMA mode (PPBNDU)\n");
+#endif
+        } 
+        else if (use_dma && use_dma_ppb_du && use_dma_ppb_du) {
+                DBG( "DMA mode       = PPBDU (packet per buffer WITH desc. update)\n");
+#ifndef UDC_DEBUG
+                INFO( "DMA mode (PPBDU)\n");
+#endif
+        } 
+        if (use_dma && use_dma_bufferfill_mode) {
+                DBG( "DMA mode       = BF (buffer fill mode)\n");
+#ifndef UDC_DEBUG
+                INFO( "DMA mode (BF)\n");
+#endif
+        } 
+#ifndef UDC_DEBUG
+        if (!use_dma) {
+                INFO( "FIFO mode\n");
+        } 
+#endif
+#ifdef UDC_USE_TIMER
+        INFO("RDE timer is used\n");
+#endif
+        DBG("-------------------------------------------------------\n");       
+}
+
+/**
+ * Prints snapshot of ep registers
+ * 
+ * \param dev   pointer to device struct
+ */
+#ifdef UDC_DEBUG
+static void print_ep_regs(struct udc* dev, struct udc_ep_regs* ep_regs)
+{
+        INFO( "ep control  = %08lx\n", (unsigned long) ep_regs->ctl);
+        INFO( "ep status   = %08lx\n", (unsigned long) ep_regs->sts);
+        INFO( "--------------------------------\n");
+}
+
+/**
+ * Prints misc information, to be removed
+ * 
+ * \param dev           pointer to device struct
+ */
+static void print_misc(struct udc* dev)
+{
+        print_regs(dev);
+ 
+        if (use_dma) {
+
+                INFO("no_req=%ld no_pref_req=%ld\n", no_req, no_pref_req);
+        }
+}
+#endif
+
+/* driver functions ----------------------------------------------------------*/
+/**
+ * Called by OS for insmod 
+ * 
+ * \param inode         file node
+ * \param               file struct
+ * \return read byte
+ */
+#ifdef UDC_DEBUG
+static int udc_open (struct inode *inode, struct file *file)
+{
+        int retval = 0;
+        return retval;
+}
+
+/**
+ * Called by OS for rmmod 
+ * 
+ * \param inode         file node
+ * \param file          file struct
+ * \return read byte
+ */
+static int udc_release (struct inode *inode, struct file *file)
+{
+        int retval = 0;
+        return retval;
+}
+
+/**
+ * Called by OS for ioctl() from user space
+ * 
+ * \param inode         file node
+ * \param file          file struct
+ * \param command       ioctl command code
+ * \param argument      ioctl argument
+ * \return 0 if success 
+ */
+static int udc_ioctl (struct inode *inode, 
+                      struct file *file, 
+                      unsigned int command,
+                      unsigned long argument)
+{
+        struct udc* dev = udc;
+        
+        if (!dev)
+                return -EINVAL;
+     
+        /* for testing PM */ 
+        switch (command)
+        {
+                case 1:
+                        udc_remote_wakeup(udc);
+                        break;
+                case 5:
+                        udc_suspend(udc);
+                        break;
+                case 6:
+                        udc_resume(udc);
+                        break;
+        }
+ 
+        INFO( "ioctl called\n");
+
+        return 0;
+}
+
+/**
+ *  Prints a buffers contents 
+ *  \param buf          pointer to buffer
+ *  \param bytes        number bytes to print
+ */
+static void dump_buffer(u8* buf, u32 bytes)
+{
+        int i;
+
+        printk("\nbuffer %lx = %d bytes:\n", (unsigned long) buf, bytes);
+        for (i = 0; i < bytes; i++) {
+                printk("%02x", *(buf + i));
+                if ((i+1)%16 == 0)
+                        printk("\n");
+        }
+        printk("\n");
+}
+#endif
+
+/**
+ * Masks unused interrupts 
+ * 
+ * \param dev           pointer to device struct
+ * \return 0 if success 
+ */
+static int udc_mask_unused_interrupts(struct udc* dev)
+{
+        u32 tmp;
+
+        /* mask all dev interrupts */
+        tmp =   AMD_BIT(UDC_DEVINT_SVC) |
+                AMD_BIT(UDC_DEVINT_ENUM) |
+                AMD_BIT(UDC_DEVINT_US) |
+                AMD_BIT(UDC_DEVINT_UR) |
+                AMD_BIT(UDC_DEVINT_ES) |
+                AMD_BIT(UDC_DEVINT_SI) |
+                AMD_BIT(UDC_DEVINT_SOF)|
+                AMD_BIT(UDC_DEVINT_SC);
+        writel(tmp, &dev->regs->irqmsk);        
+        
+        /* mask all ep interrupts */
+        writel(UDC_EPINT_MSK_DISABLE_ALL, &dev->regs->ep_irqmsk);        
+
+        return 0;
+}
+
+/**
+ * Enables endpoint 0 interrupts 
+ * 
+ * \param dev           pointer to device struct
+ * \return 0 if success 
+ */
+static int udc_enable_ep0_interrupts(struct udc* dev)
+{
+        u32 tmp;
+
+        DBG("udc_enable_ep0_interrupts()\n");
+
+        /* read irq mask */
+        tmp = readl(&dev->regs->ep_irqmsk);
+        /* enable ep0 irq's */
+        tmp &= AMD_UNMASK_BIT(UDC_EPINT_IN_EP0)
+               & AMD_UNMASK_BIT(UDC_EPINT_OUT_EP0);  
+        writel(tmp, &dev->regs->ep_irqmsk);        
+
+        return 0;
+}
+
+/**
+ * Enables device interrupts for SET_INTF and SET_CONFIG
+ * 
+ * \param dev           pointer to device struct
+ * \return 0 if success 
+ */
+static int udc_enable_dev_setup_interrupts(struct udc* dev)
+{
+        u32 tmp;
+
+        DBG("enable device interrupts for setup data\n");
+
+        /* read irq mask */
+        tmp = readl(&dev->regs->irqmsk);
+       
+        /* enable SET_INTERFACE, SET_CONFIG and other needed irq's */
+        tmp &= AMD_UNMASK_BIT(UDC_DEVINT_SI)
+               & AMD_UNMASK_BIT(UDC_DEVINT_SC)  
+               & AMD_UNMASK_BIT(UDC_DEVINT_UR)  
+#ifndef UDC_IPBUG_3943_WORKAROUND
+               & AMD_UNMASK_BIT(UDC_DEVINT_US)  
+#endif
+#ifndef UDC_IPBUG_3950_WORKAROUND
+               & AMD_UNMASK_BIT(UDC_DEVINT_SVC)
+#endif
+               & AMD_UNMASK_BIT(UDC_DEVINT_ENUM);
+        writel(tmp, &dev->regs->irqmsk);        
+
+        return 0;
+}
+
+/**
+ * Calculates fifo start of endpoint based on preceeding endpoints
+ * 
+ * \param ep           pointer to ep struct
+ * \return 0 if success 
+ */
+static int udc_set_txfifo_addr(struct udc_ep *ep)
+{
+        struct udc      *dev;
+        u32 tmp;
+        int i;
+
+        if (!ep || !(ep->in))
+                return -EINVAL;
+        
+        dev = ep->dev;
+        ep->txfifo = dev->txfifo;
+
+        /* traverse ep's */
+        for (i = 0; i < ep->num; i++) {
+                if (dev->ep[i].regs) {
+                        /* read fifo size */
+                        tmp = readl(&dev->ep[i].regs->bufin_framenum);
+                        tmp = AMD_GETBITS(tmp, UDC_EPIN_BUFF_SIZE);
+                        ep->txfifo+= tmp;
+                }
+        }
+        return 0;
+}
+
+/**
+ * Enables endpoint, is called by gadget driver
+ * 
+ * \param usbep         pointer to ep struct
+ * \param desc          pointer to endpoint descriptor
+ * \return 0 if success 
+ */
+static int
+udc_enable (struct usb_ep *usbep, const struct usb_endpoint_descriptor *desc)
+{
+        struct udc_ep           *ep;
+        struct udc              *dev;
+        u32                     tmp;
+        unsigned long           iflags;
+        u8 udc_csr_epix;
+
+        VDBG("udc_enable()\n");        
+        
+        ep = container_of (usbep, struct udc_ep, ep);
+        if (!usbep 
+            || usbep->name == ep0_string
+            || !desc 
+            || desc->bDescriptorType != USB_DT_ENDPOINT) {
+                ERR("udc_enable: !usbep=%d !desc=%d ep->desc!=NULL=%d usbep->name==ep0_string=%d desc->bDescriptorType!=USB_DT_ENDPOINT=%d\n",
+                     !usbep, !desc, ep->desc != NULL, usbep->name == ep0_string, desc->bDescriptorType != USB_DT_ENDPOINT);
+                return -EINVAL;
+        }
+        
+        DBG("udc_enable() ep %d\n", ep->num);
+
+        dev = ep->dev;
+
+        /* exit on suspend */
+        if (dev->sys_suspended) 
+              return -ESHUTDOWN;
+
+        if (!dev->driver
+            || dev->gadget.speed == USB_SPEED_UNKNOWN)
+                return -ESHUTDOWN;
+
+        spin_lock_irqsave (&dev->lock, iflags);
+        ep->desc = desc;
+
+        ep->halted = 0;
+
+        /* set traffic type */
+        tmp = readl(&dev->ep[ep->num].regs->ctl);
+        tmp = AMD_ADDBITS(tmp, desc->bmAttributes, UDC_EPCTL_ET);
+        writel(tmp, &dev->ep[ep->num].regs->ctl);
+
+        /* set max packet size */
+        tmp = readl(&dev->ep[ep->num].regs->bufout_maxpkt);
+        tmp = AMD_ADDBITS(tmp, desc->wMaxPacketSize, UDC_EP_MAX_PKT_SIZE);
+        ep->ep.maxpacket = desc->wMaxPacketSize;
+        writel(tmp, &dev->ep[ep->num].regs->bufout_maxpkt);
+
+        /* IN ep */
+        if (ep->in) {
+                
+                /* ep ix in UDC CSR register space */
+                udc_csr_epix = ep->num;
+                
+                /* set buffer size (tx fifo entries) */
+                tmp = readl(&dev->ep[ep->num].regs->bufin_framenum);
+                /* double buffering: fifo size = 2 x max packet size */
+                tmp = AMD_ADDBITS(
+                              tmp,
+                              desc->wMaxPacketSize * UDC_EPIN_BUFF_SIZE_MULT /
+                                                     UDC_DWORD_BYTES,
+                              UDC_EPIN_BUFF_SIZE);                 
+                writel(tmp, &dev->ep[ep->num].regs->bufin_framenum);
+
+                /* calc. tx fifo base addr */
+                udc_set_txfifo_addr(ep); 
+
+                /* flush fifo */
+                tmp = readl(&ep->regs->ctl);
+                tmp |= AMD_BIT(UDC_EPCTL_F); 
+                writel(tmp, &ep->regs->ctl);
+                
+        } /* OUT ep */
+        else {
+                /* ep ix in UDC CSR register space */
+                udc_csr_epix = ep->num - UDC_CSR_EP_OUT_IX_OFS;
+
+                /* set max packet size UDC CSR  */
+                tmp = readl(&dev->csr->ne[ep->num - UDC_CSR_EP_OUT_IX_OFS]);
+                tmp = AMD_ADDBITS(tmp, desc->wMaxPacketSize, UDC_CSR_NE_MAX_PKT);
+                writel(tmp, &dev->csr->ne[ep->num - UDC_CSR_EP_OUT_IX_OFS]);
+
+                if (ep->num != UDC_EP0OUT_IX) 
+                        dev->data_ep_enabled = 1;
+        }
+
+        /***** UDC CSR reg ****************************/
+        /* set ep values  */
+        tmp = readl(&dev->csr->ne[udc_csr_epix]);
+        /* max packet */
+        tmp = AMD_ADDBITS(tmp, desc->wMaxPacketSize, UDC_CSR_NE_MAX_PKT);
+        /* ep number */
+        tmp = AMD_ADDBITS(tmp, desc->bEndpointAddress, UDC_CSR_NE_NUM);
+        /* ep direction */
+        tmp = AMD_ADDBITS(tmp, ep->in, UDC_CSR_NE_DIR);
+        /* ep type */
+        tmp = AMD_ADDBITS(tmp, desc->bmAttributes, UDC_CSR_NE_TYPE);
+        /* ep config */
+        tmp = AMD_ADDBITS(tmp, ep->dev->cur_config, UDC_CSR_NE_CFG);
+        /* ep interface */
+        tmp = AMD_ADDBITS(tmp, ep->dev->cur_intf, UDC_CSR_NE_INTF);
+        /* ep alt */
+        tmp = AMD_ADDBITS(tmp, ep->dev->cur_alt, UDC_CSR_NE_ALT);
+        /* write reg */
+        writel(tmp, &dev->csr->ne[udc_csr_epix]);
+        
+        /* enable ep irq */
+        tmp = readl(&dev->regs->ep_irqmsk);
+        tmp &= AMD_UNMASK_BIT(ep->num);
+        writel(tmp, &dev->regs->ep_irqmsk);        
+
+        /* clear NAK by writing CNAK */
+        /* avoid BNA for DMA,  dont clear NAK until DMA desc. written */
+        if (!use_dma) {
+                tmp = readl(&ep->regs->ctl);
+                tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                writel(tmp, &ep->regs->ctl);
+                ep->naking = 0;
+                UDC_QUEUE_CNAK(ep, ep->num);
+        }
+        tmp = desc->bEndpointAddress;
+        DBG( "%s enabled\n",
+                usbep->name);
+
+        spin_unlock_irqrestore (&dev->lock, iflags);
+        return 0;
+}
+/**
+ * Resets endpoint
+ * 
+ * \param regs          pointer to device register struct
+ * \param ep            pointer to endpoint
+ */
+static void ep_init (struct udc_regs *regs, struct udc_ep *ep)
+{
+        u32             tmp;
+
+        VDBG("ep-%d reset\n", ep->num);
+        ep->desc = 0;
+        ep->ep.ops = &udc_ep_ops;
+        INIT_LIST_HEAD (&ep->queue);
+
+        ep->ep.maxpacket = (u16) ~0;
+        if (!(ep->dev->sys_suspended)) {
+                /* set NAK  */
+                tmp = readl(&ep->regs->ctl);
+                tmp |= AMD_BIT(UDC_EPCTL_SNAK); 
+                writel(tmp, &ep->regs->ctl);
+                ep->naking = 1;
+                
+                /* disable interrupt */
+                tmp = readl(&regs->ep_irqmsk);
+                tmp |= AMD_BIT(ep->num);
+                writel(tmp, &regs->ep_irqmsk);        
+
+                if (ep->in) {
+                        /* unset P and IN bit of potential former DMA */
+                        tmp = readl(&ep->regs->ctl);
+                        tmp &= AMD_UNMASK_BIT(UDC_EPCTL_P);
+                        writel(tmp, &ep->regs->ctl);
+
+                        tmp = readl(&ep->regs->sts);
+                        tmp |= AMD_BIT(UDC_EPSTS_IN);
+                        writel(tmp, &ep->regs->sts);
+
+                        /* flush the fifo */
+                        tmp = readl(&ep->regs->ctl);
+                        tmp |= AMD_BIT(UDC_EPCTL_F); 
+                        writel(tmp, &ep->regs->ctl);
+
+                }
+                /* reset desc pointer */
+                writel(0, &ep->regs->desptr);
+        }
+
+
+}
+
+/**
+ * Disables endpoint, is called by gadget driver
+ * 
+ * \param usbep            pointer to ep struct
+ * \return 0 if success 
+ */
+static int udc_disable (struct usb_ep *usbep)
+{
+        struct udc_ep   *ep = NULL;
+        unsigned long           iflags;
+
+        if (!usbep)
+                return -EINVAL;
+ 
+        ep = container_of (usbep, struct udc_ep, ep);
+        if (usbep->name == ep0_string
+            || !ep->desc)
+                return -EINVAL;
+
+        DBG("Disable ep-%d\n", ep->num);
+
+        spin_lock_irqsave(&ep->dev->lock, iflags);
+        empty_req_queue(ep);
+        ep_init(ep->dev->regs, ep);
+        spin_unlock_irqrestore(&ep->dev->lock, iflags);
+
+        return 0;
+}
+
+/**
+ * Allocates request packet, called by gadget driver
+ * 
+ * \param _ep           pointer to usb ep struct
+ * \param gfp_flags     flags for kmalloc
+ * \return allocated request packet, 0 if error
+ */
+static struct usb_request *
+udc_alloc_request (struct usb_ep *usbep, gfp_t gfp)
+{
+        struct udc_request      *req;
+        struct udc_data_dma     *dma_desc;
+        struct udc_ep   *ep;
+
+        VDBG("udc_alloc_req()\n");
+        if (!usbep)
+                return 0;
+
+        ep = container_of (usbep, struct udc_ep, ep);
+        udc_gfp_flags = gfp;
+
+        VDBG("udc_alloc_req(): ep%d\n", ep->num);
+        req = kmalloc (sizeof (struct udc_request), gfp);
+        if (!req)
+                return 0;
+
+        memset (req, 0, sizeof *req);
+        req->req.dma = DMA_DONT_USE;
+        INIT_LIST_HEAD (&req->queue);
+
+        if (ep->dma) {
+
+#if defined(CONFIG_SOC_AU1200)
+                gfp = GFP_ATOMIC | GFP_DMA;
+#endif
+                /* ep0 in requests are allocated from data pool here */
+                dma_desc = dma_pool_alloc (ep->dev->data_requests, gfp,
+                                           &req->td_phys);
+                if (!dma_desc) {
+                        kfree (req);
+                        return 0;
+                }
+
+                VDBG("udc_alloc_req: req = %lx dma_desc = %lx, req->td_phys = %lx\n",
+                     (unsigned long) req, (unsigned long) dma_desc, (unsigned long)req->td_phys);
+                /* prevent from using desc. - set HOST BUSY */
+                dma_desc->status = AMD_ADDBITS(dma_desc->status,
+                                          UDC_DMA_STP_STS_BS_HOST_BUSY,
+                                          UDC_DMA_STP_STS_BS);  
+                dma_desc->bufptr = __constant_cpu_to_le32 (DMA_DONT_USE);
+                req->td_data = dma_desc;
+                req->td_data_last = NULL;
+                req->chain_len = 1;
+        }
+
+        return &req->req;
+}
+
+/**
+ * Frees request packet, called by gadget driver
+ * 
+ * \param usbep   pointer to usb ep struct
+ * \param usbreq  pointer to request packet to be freed
+ */
+static void
+udc_free_request (struct usb_ep *usbep, struct usb_request *usbreq)
+{
+        struct udc_ep   *ep;
+        struct udc_request      *req;
+
+        if (!usbep || !usbreq)
+                return;
+
+        ep = container_of (usbep, struct udc_ep, ep);
+        req = container_of (usbreq, struct udc_request, req);
+        VDBG("free_req req=%lx\n", (unsigned long) req);
+        WARN_ON(!list_empty (&req->queue));
+        if (req->td_data) {
+                VDBG("req->td_data=%lx\n", (unsigned long) req->td_data);
+
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+                /* re-link broken chain  */
+                if (req->td_data_last) {
+                        req->td_data_last->next = req->td_data_last_next;
+                }
+#endif
+                /* free dma chain if created */
+                if (req->chain_len > 1) {
+                        udc_free_dma_chain(ep->dev, req);
+                }
+
+                dma_pool_free (ep->dev->data_requests, req->td_data, req->td_phys);
+        }
+        kfree (req);
+}
+
+/* choose dma buffer allocation method */
+#undef USE_KMALLOC
+#if     defined(CONFIG_X86)
+#define USE_KMALLOC
+#elif   defined(CONFIG_SOC_AU1200)
+#ifdef CONFIG_DMA_COHERENT
+#define USE_KMALLOC
+#endif /* CONFIG_DMA_COHERENT */
+#endif
+
+/**
+ * Allocates data buffer for request packet, called by gadget driver
+ * 
+ * \param usbep         pointer to usb ep struct
+ * \param bytes         number bytes to allocate
+ * \param dma           pointer to dma struct
+ * \param gfp_flags     flags for allocate 
+ * \return pointer to allocated buffer, 0 if error
+ */
+static void *
+udc_alloc_buffer (
+        struct usb_ep           *usbep,
+        unsigned                len,
+        dma_addr_t              *dma,
+        gfp_t                   gfp
+)
+{
+        void            *ptr;
+        struct udc_ep   *ep;
+        VDBG("alloc_buffer(): %s\n", usbep->name);
+
+        ep = container_of (usbep, struct udc_ep, ep);
+        *dma = DMA_DONT_USE;
+
+        if (!usbep)
+                return 0;
+
+        if (ep->dma) {
+#if     defined(USE_KMALLOC)
+
+#if defined(CONFIG_SOC_AU1200)
+                gfp = GFP_ATOMIC | GFP_DMA;
+#endif
+                ptr = kmalloc(len, gfp);
+
+                if (ptr)
+                        *dma = virt_to_phys(ptr);
+
+#else
+                ptr = dma_alloc_coherent (&ep->dev->pdev->dev, len, dma, gfp);
+#endif
+        } else
+                ptr = kmalloc(len, gfp);
+
+        VDBG("alloc_buffer() ptr = %lx dma=%lx\n", (unsigned long) ptr, (unsigned long) *dma);
+        return ptr;
+}
+
+
+/**
+ * Free data buffer for request packet, called by gadget driver
+ * 
+ * \param usbep         pointer to usb ep struct
+ * \param buf           pointer to buffer to be freed
+ * \param dma           pointer to dma struct
+ * \param len           number bytes to be freed 
+ * \return pointer to allocated buffer, 0 if error
+ */
+static void
+udc_free_buffer (
+        struct usb_ep *usbep,
+        void *buf,
+        dma_addr_t dma,
+        unsigned len
+) {
+        struct udc_ep   *ep;
+
+        VDBG ("ep %s - free buffer %lx\n", usbep->name, (unsigned long) buf);
+
+        /* null pointer ? */
+        if (!buf) {
+                return;
+        }
+
+        ep = container_of(usbep, struct udc_ep, ep);
+        if (!ep)
+                return;
+
+#ifndef USE_KMALLOC
+        if (dma != DMA_DONT_USE) {
+                dma_free_coherent (&ep->dev->pdev->dev, len, buf, dma);
+        } else
+#endif
+        {
+                if (!(ep->dma))
+                        kfree (buf);
+        }
+
+}
+
+/**
+ * Write data to TX fifo for IN packets 
+ * 
+ * \param ep            pointer to ep struct
+ * \param req           pointer to request packet
+ * \return allocated request packet, 0 if error
+ */
+static void
+udc_txfifo_write (struct udc_ep *ep, struct usb_request *req)
+{
+        u8                      *req_buf;
+        u32                     *buf;
+        int i,j;
+        unsigned                bytes = 0;
+        unsigned                remaining = 0;
+
+        VDBG("udc_txfifo_write()\n");
+
+        if (!req || !ep)
+                return;
+
+        req_buf = req->buf + req->actual;
+        prefetch (req_buf);
+        remaining = req->length - req->actual;
+       
+        buf = (u32*) req_buf;        
+ 
+        bytes = ep->ep.maxpacket;
+        if (bytes > remaining)
+                bytes = remaining;
+	
+        /* dwords first */
+        for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) {
+                writel(*(buf + i), ep->txfifo);
+        }
+
+        /* remaining bytes must be written by byte access */
+        for (j = 0; j < bytes % UDC_DWORD_BYTES; j++) {
+                writeb((u8) (*(buf + i) >> (j << UDC_BITS_PER_BYTE_SHIFT)),
+                       ep->txfifo);
+        }
+
+#ifdef UDC_IPBUG_2253_WORKAROUND
+        {
+                u32 tmp;
+
+                /* NAK if small packet until write confirm completed */
+                if (bytes < UDC_SMALL_PACKET) {
+                        /* set NAK */
+                        tmp = readl(&ep->regs->ctl);
+                        tmp |= AMD_BIT(UDC_EPCTL_SNAK); 
+                        writel(tmp, &ep->regs->ctl);
+                        ep->naking = 1;
+                        wb_flush();
+                }
+
+                /* dummy write confirm */
+                writel(0, &ep->regs->confirm); 
+
+                /* stop NAKing after small packet DMA */
+                if (ep->naking) {
+                        /* clear NAK by writing CNAK */
+                        tmp = readl(&ep->regs->ctl);
+                        tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                        writel(tmp, &ep->regs->ctl);
+                        ep->naking = 0;
+                        UDC_QUEUE_CNAK(ep, ep->num);
+                }
+        }
+#else
+        /* dummy write confirm */
+        writel(0, &ep->regs->confirm); 
+#endif
+}
+
+/**
+ * Read dwords from RX fifo for OUT transfers
+ * 
+ * \param dev           pointer to device struct
+ * \param buf           pointer to buffer to be filled
+ * \param dwords        number of dwords to be read
+ * \return allocated request packet, 0 if error
+ */
+static int udc_rxfifo_read_dwords(struct udc* dev, u32* buf, int dwords)
+{
+        int i;
+        
+        VDBG("udc_read_dwords(): %d dwords\n", dwords);
+
+        for (i = 0; i < dwords; i++)
+        {
+                *(buf + i) = readl(dev->rxfifo);
+        }        
+        return 0;
+}
+
+/**
+ * Read bytes from RX fifo for OUT transfers
+ * 
+ * \param dev           pointer to device struct
+ * \param buf           pointer to buffer to be filled
+ * \param bytes         number of bytes to be read
+ * \return allocated request packet, 0 if error
+ */
+static int udc_rxfifo_read_bytes(struct udc* dev, u8* buf, int bytes)
+{
+        int i,j;
+        u32 tmp;
+        
+        VDBG("udc_read_bytes(): %d bytes\n", bytes);
+
+        /* dwords first */
+        for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) {
+               *((u32*) (buf + (i<<2))) = readl(dev->rxfifo); 
+        }
+
+        /* remaining bytes must be read by byte access */
+        if (bytes % UDC_DWORD_BYTES) {
+                tmp = readl(dev->rxfifo);
+                for (j = 0; j < bytes % UDC_DWORD_BYTES; j++) {
+                        *(buf + (i<<2) + j) = (u8) (tmp & UDC_BYTE_MASK);
+                        tmp = tmp >> UDC_BITS_PER_BYTE;
+                }
+        }
+        
+        return 0;
+}
+
+/**
+ * Read data from RX fifo for OUT transfers
+ * 
+ * \param ep            pointer to ep struct
+ * \param req           pointer to request packet
+ * \return true if request completes for short or max packet, false otherwise   
+ */
+static int
+udc_rxfifo_read(struct udc_ep *ep, struct udc_request *req)
+{
+        u8 *buf;
+        unsigned buf_space;
+        unsigned bytes = 0; 
+        unsigned finished = 0;
+
+        /* received number bytes */
+        bytes = readl(&ep->regs->sts);
+        bytes = AMD_GETBITS(bytes, UDC_EPSTS_RX_PKT_SIZE);
+        
+        buf_space = req->req.length - req->req.actual;
+        buf = req->req.buf + req->req.actual;
+        if (bytes > buf_space) {
+                if ((buf_space % ep->ep.maxpacket) != 0) {
+                        ERR( "%s: received %d bytes, rx-buffer space =  %d bytes => buffer overrun\n",
+                                ep->ep.name, bytes, buf_space);
+                        req->req.status = -EOVERFLOW;
+                }
+                bytes = buf_space;
+        }
+        req->req.actual += bytes;
+
+        /* last packet ? */
+        if (((bytes % ep->ep.maxpacket) != 0)
+            || (!bytes)
+            || ((req->req.actual == req->req.length) && !req->req.zero))
+                finished = 1;
+
+        /* read rx fifo bytes */
+        VDBG("ep %s: rxfifo read %d bytes\n", ep->ep.name, bytes);
+        udc_rxfifo_read_bytes(ep->dev, buf, bytes); 
+        
+        return finished;
+}
+
+/**
+ * create/re-init a DMA descriptor or a DMA descriptor chain
+ *
+ * \param ep            pointer to endpoint struct 
+ * \param req           pointer to request packet
+ */
+static int prep_dma (struct udc_ep *ep, struct udc_request *req)
+{
+        int retval = 0;
+        u32                     tmp;
+        VDBG("prep_dma\n");
+        VDBG("prep_dma ep%d req->td_data=%lx\n",
+              ep->num, (unsigned long) req->td_data);
+
+        /* set buffer pointer */
+        req->td_data->bufptr   = req->req.dma;
+
+        /* set last bit */
+        req->td_data->status |= AMD_BIT(UDC_DMA_IN_STS_L);
+       
+        /* build/re-init dma chain if maxpkt scatter mode, not for EP0 */
+        if (use_dma_ppb && ep->num != UDC_EP0OUT_IX && ep->num != UDC_EP0IN_IX) {
+
+                retval = udc_create_dma_chain(ep, req, ep->ep.maxpacket, udc_gfp_flags);
+                if (retval != 0)
+                {
+                        if (retval == -ENOMEM)
+                                INFO("Out of DMA memory (allocation failed)\n");       
+                        return retval;
+                }
+                if (ep->in) {
+                        if (req->req.length == ep->ep.maxpacket) {
+                                /* write tx bytes */
+                                req->td_data->status = AMD_ADDBITS(req->td_data->status,
+                                                ep->ep.maxpacket,
+                                                UDC_DMA_IN_STS_TXBYTES); 
+
+                        }
+                }
+                
+        }
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+        else { /* EP0 */
+                /* point to itself */
+                req->td_data->next = req->td_phys;
+        }
+#endif
+        
+        if (ep->in) {
+                VDBG("IN: use_dma_ppb=%d req->req.length=%d ep->ep.maxpacket=%d ep%d\n",
+                      use_dma_ppb, req->req.length, ep->ep.maxpacket, ep->num);
+                /* if bytes < max packet then tx bytes must */
+                /* be written in packet per buffer mode */
+                if (!use_dma_ppb || req->req.length < ep->ep.maxpacket
+                    || ep->num == UDC_EP0OUT_IX || ep->num == UDC_EP0IN_IX) {
+                        /* write tx bytes */
+                        req->td_data->status = AMD_ADDBITS(req->td_data->status,
+                                                            req->req.length,
+                                                            UDC_DMA_IN_STS_TXBYTES); 
+                        /* reset frame num */
+                        req->td_data->status = AMD_ADDBITS(req->td_data->status,
+                                                            0,
+                                                            UDC_DMA_IN_STS_FRAMENUM); 
+                }
+                /* set HOST BUSY */
+                req->td_data->status 
+                      = AMD_ADDBITS(req->td_data->status,
+                                    UDC_DMA_STP_STS_BS_HOST_BUSY,
+                                    UDC_DMA_STP_STS_BS);
+        }
+        else {
+                VDBG("OUT set host ready\n");
+                /* set HOST READY */
+                req->td_data->status 
+                      = AMD_ADDBITS(req->td_data->status,
+                                    UDC_DMA_STP_STS_BS_HOST_READY,
+                                    UDC_DMA_STP_STS_BS);
+
+ 
+                        /* clear NAK by writing CNAK */
+                        if (ep->naking) {
+                                tmp = readl(&ep->regs->ctl);
+                                tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                                writel(tmp, &ep->regs->ctl);
+                                ep->naking = 0;
+                                UDC_QUEUE_CNAK(ep, ep->num);
+                        }
+
+        }
+
+        return retval;
+}
+
+/**
+ * Completes request packet 
+ * 
+ * \param ep            pointer to ep struct
+ * \param req           pointer to request packet
+ * \param sts           status of request
+ */
+static void
+complete_req(struct udc_ep *ep, struct udc_request *req, int sts)
+{
+        struct udc              *dev;
+        unsigned                halted;
+
+        VDBG("complete_req(): ep%d\n", ep->num);
+
+        dev = ep->dev;
+        /* unmap DMA */
+        if (req->dma_mapping) {
+#if   defined(CONFIG_SOC_AU1200)
+                if (ep->in)
+                        dma_unmap_single(0,
+                                         req->req.dma,
+                                         req->req.length,
+                                         PCI_DMA_TODEVICE);
+                else
+                        dma_unmap_single(0,
+                                         req->req.dma,
+                                         req->req.length,
+                                         PCI_DMA_FROMDEVICE);
+#else
+                if (ep->in)
+                        pci_unmap_single(dev->pdev,
+                                         req->req.dma,
+                                         req->req.length,
+                                         PCI_DMA_TODEVICE);
+                else
+                        pci_unmap_single(dev->pdev,
+                                         req->req.dma,
+                                         req->req.length,
+                                         PCI_DMA_FROMDEVICE);
+#endif
+                req->dma_mapping = 0;
+                req->req.dma = DMA_DONT_USE;
+        }
+
+        halted = ep->halted;
+        ep->halted = 1;
+
+        /* set new status if pending */
+        if (req->req.status == -EINPROGRESS)
+                req->req.status = sts;
+
+        /* remove from ep queue */
+        list_del_init (&req->queue);
+
+        VDBG( "req %p => complete %d bytes at %s with sts %d\n",
+                       &req->req, req->req.length, ep->ep.name, sts);
+        if (spin_is_locked(&dev->lock)) {
+                spin_unlock (&dev->lock);
+                req->req.complete (&ep->ep, &req->req);
+                spin_lock (&dev->lock);
+        }
+        else {
+                req->req.complete (&ep->ep, &req->req);
+        }
+        ep->halted = halted;
+}
+
+/**
+ * frees pci pool descriptors of a DMA chain 
+ * 
+ * \param dev           pointer to device struct
+ * \param req           pointer to request packet
+ * \return 0 if success
+ */
+static int udc_free_dma_chain(struct udc* dev, struct udc_request* req)
+{
+
+        int ret_val = 0;
+        struct udc_data_dma     *td;
+        struct udc_data_dma     *td_last = NULL;
+        unsigned int i;
+
+        DBG("free chain req = %lx\n", (unsigned long) req);
+
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+        /* re-link broken chain  */
+        if (req->td_data_last) {
+                req->td_data_last->next = req->td_data_last_next;
+        }
+#endif
+        /* do not free first desc., will be done by free for request */
+        td_last = req->td_data;
+#if defined (CONFIG_SOC_AU1200) && !defined(CONFIG_DMA_COHERENT)
+        td = UNCAC_ADDR(phys_to_virt(td_last->next));
+#else
+        td = phys_to_virt(td_last->next);
+#endif
+
+        for (i = 1; i < req->chain_len; i++) {
+
+                dma_pool_free (dev->data_requests, td,
+                                (dma_addr_t) td_last->next);
+                td_last = td;
+#if defined (CONFIG_SOC_AU1200) && !defined(CONFIG_DMA_COHERENT)
+                td = UNCAC_ADDR(phys_to_virt(td_last->next));
+#else
+                td = phys_to_virt(td_last->next);
+#endif
+        }
+
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+        req->td_data_last = NULL;
+#endif
+        return ret_val;        
+}
+
+/**
+ * Iterates to the end of a DMA chain and returns last descriptor 
+ * 
+ * \param req           pointer to request packet
+ * \return pointer to last descriptori of chain
+ */
+static struct udc_data_dma* udc_get_last_dma_desc(struct udc_request* req)
+{
+        struct udc_data_dma     *td;
+
+        td = req->td_data;
+        while (td && !(td->status & AMD_BIT(UDC_DMA_IN_STS_L))) {
+#if defined (CONFIG_SOC_AU1200) && !defined(CONFIG_DMA_COHERENT)
+                td = UNCAC_ADDR(phys_to_virt(td->next));
+#else
+                td = phys_to_virt(td->next);
+#endif
+        }
+
+        return td;
+
+}
+
+/**
+ * Iterates to the end of a DMA chain and counts bytes received 
+ * 
+ * \param req           pointer to request packet
+ * \return number of received bytes
+ */
+static u32 udc_get_ppbdu_rxbytes(struct udc_request* req)
+{
+        struct udc_data_dma     *td;
+        u32 count;
+
+        td = req->td_data;
+        /* received number bytes */
+        count = AMD_GETBITS(td->status, UDC_DMA_OUT_STS_RXBYTES); 
+        
+        while (td && !(td->status & AMD_BIT(UDC_DMA_IN_STS_L))) {
+#if defined (CONFIG_SOC_AU1200) && !defined(CONFIG_DMA_COHERENT)
+                td = UNCAC_ADDR(phys_to_virt(td->next));
+#else
+                td = phys_to_virt(td->next);
+#endif
+                /* received number bytes */
+                if (td) {
+                        count += AMD_GETBITS(td->status, UDC_DMA_OUT_STS_RXBYTES);
+                }
+        }
+
+        return count;
+
+}
+
+/**
+ * Creates or re-inits a DMA chain 
+ *
+ * \param ep            pointer to endpoint struct 
+ * \param req           pointer to request packet
+ * \param buf_len       number of buffer bytes per descriptor (except last short)
+ */
+static int udc_create_dma_chain(struct udc_ep* ep, struct udc_request* req, unsigned long buf_len, int gfp_flags)
+{
+        unsigned long bytes = req->req.length;
+        unsigned int i;
+        dma_addr_t dma_addr;
+        struct udc_data_dma     *td = NULL;
+        struct udc_data_dma     *last = NULL;
+        unsigned long txbytes;
+        unsigned create_new_chain = 0;
+        unsigned len;
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+        dma_addr_t last_next = DMA_DONT_USE;
+#endif
+
+        VDBG("udc_create_dma_chain: bytes=%ld buf_len=%ld\n", bytes, buf_len);
+        dma_addr = DMA_DONT_USE;
+
+        /* unset L bit in first desc for OUT */
+        if (!ep->in) {
+                req->td_data->status &= AMD_CLEAR_BIT(UDC_DMA_IN_STS_L);
+        }
+        
+        /* alloc only new desc's if not already available */
+        len = req->req.length / ep->ep.maxpacket;
+        if (req->req.length % ep->ep.maxpacket) {
+                len++;
+        }
+
+        if (len > req->chain_len) {
+                /* shorter chain already allocated before */
+                if (req->chain_len > 1) {
+                        udc_free_dma_chain(ep->dev, req);
+                }
+                req->chain_len = len;
+                create_new_chain = 1;
+        }
+
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+        /* re-link broken chain  */
+        if (req->td_data_last) {
+                req->td_data_last->next = req->td_data_last_next;
+        }
+        /* if only one td then last_next is root td */
+        last_next = req->td_phys;
+#endif
+
+        td = req->td_data; 
+        /* gen. required number of descriptors and buffers */
+        for (i = buf_len; i < bytes; i += buf_len)
+        {
+                /* create or determine next desc. */
+                if (create_new_chain) {
+
+#if defined(CONFIG_SOC_AU1200)
+                        gfp_flags = GFP_ATOMIC | GFP_DMA;
+#endif
+                        td = dma_pool_alloc (ep->dev->data_requests, gfp_flags,
+                                             &dma_addr);
+                        if (!td) 
+                                return -ENOMEM;
+
+                        td->status = 0;
+                }
+                else if (i == buf_len)
+                {
+                        /* first td */
+#if defined (CONFIG_SOC_AU1200) && !defined(CONFIG_DMA_COHERENT)
+                        td = (struct udc_data_dma*) UNCAC_ADDR(phys_to_virt(req->td_data->next));
+#else
+                        td = (struct udc_data_dma*) phys_to_virt(req->td_data->next);
+#endif
+                        td->status = 0;
+                }
+                else {
+#if defined (CONFIG_SOC_AU1200) && !defined(CONFIG_DMA_COHERENT)
+                        td = (struct udc_data_dma*) UNCAC_ADDR(phys_to_virt(last->next));
+#else
+                        td = (struct udc_data_dma*) phys_to_virt(last->next);
+#endif
+                        td->status = 0;
+                }
+                        
+
+                if (td) {
+                        /* assign buffer */
+                       td->bufptr = req->req.dma + i; 
+                }
+                else {
+                        break;
+                }
+
+                /* short packet ? */
+                if ((bytes - i) >= buf_len) {
+                        txbytes = buf_len;
+                }
+                else {
+                        /* short packet */
+                        txbytes = bytes - i;
+                }
+         
+                /* link td and assign tx bytes */
+                if (i == buf_len) {
+                        if (create_new_chain) {
+                                req->td_data->next = dma_addr;
+                        }
+                        else {
+                                /* req->td_data->next = virt_to_phys(td); */
+                        }
+                        /* write tx bytes */
+                        if (ep->in) {
+                                /* first desc */
+                                req->td_data->status = AMD_ADDBITS(req->td_data->status,
+                                                                    ep->ep.maxpacket,
+                                                                    UDC_DMA_IN_STS_TXBYTES);
+                                /* second desc */
+                                td->status = AMD_ADDBITS(td->status,
+                                                          txbytes,
+                                                          UDC_DMA_IN_STS_TXBYTES); 
+                        } 
+
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+                        last_next = req->td_data->next;
+#endif
+                }
+                else {
+                        if (create_new_chain) {
+                                last->next = dma_addr;
+                        }
+                        else { 
+                                /* last->next = virt_to_phys(td); */
+                        }
+                        if (ep->in) {
+                                /* write tx bytes */
+                                td->status = AMD_ADDBITS(td->status,
+                                                          txbytes,
+                                                          UDC_DMA_IN_STS_TXBYTES); 
+                        }
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+                        last_next = last->next;
+#endif
+                }
+                last = td;
+        }
+        /* set last bit */
+        if (td) {
+                td->status |= AMD_BIT(UDC_DMA_IN_STS_L);
+                /* last desc. points to itself */
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+                /* remember broken chain next pointer */
+                req->td_data_last_next = td->next;
+                /* point to itself */
+                td->next = last_next;
+#endif
+                req->td_data_last = td;
+        }
+
+        return 0;
+}
+
+/**
+ * Enabling RX DMA  
+ *
+ * \param dev           pointer to UDC device object    
+ */
+static inline void udc_set_rde(struct udc* dev)
+{
+        u32 tmp;
+
+        VDBG("udc_set_rde()\n");
+#ifdef UDC_USE_TIMER
+        /* stop RDE timer */ 
+        if (timer_pending(&udc_timer)) {
+                set_rde = 0;
+                mod_timer(&udc_timer, jiffies - 1);
+        }
+#endif
+        /* set RDE */
+        tmp = readl(&dev->regs->ctl);
+        tmp |= AMD_BIT(UDC_DEVCTL_RDE);
+        writel(tmp, &dev->regs->ctl);                
+}
+
+/**
+ * Queues a request packet, called by gadget driver
+ * 
+ * \param usbep         pointer to usb ep struct
+ * \param usbreq        pointer to request packet to be freed
+ * \param gfp           flags for alloc
+ * \return 0 if success
+ */
+static int
+udc_queue (struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp)
+{
+        int retval = 0;
+        unsigned long           iflags;
+        struct udc_ep   *ep;
+        struct udc_request      *req;
+        struct udc              *dev;
+        u32 tmp;
+        
+        VDBG ("udc_queue()\n");
+
+        /* check the inputs */
+        req = container_of (usbreq, struct udc_request, req);
+        VDBG("!usbep=%d !req=%d !buf=%d !compl=%d !empty_list=%d \n",
+                !usbep, !usbreq, !usbreq->buf, !usbreq->complete,
+                !list_empty(&req->queue));
+
+        if (!usbep || !usbreq || !usbreq->complete || !usbreq->buf
+                        || !list_empty (&req->queue))
+                return -EINVAL;
+
+        ep = container_of (usbep, struct udc_ep, ep);
+        if (!ep->desc && (ep->num != 0 && ep->num != UDC_EP0OUT_IX))
+                return -EINVAL;
+
+        VDBG("udc_queue(): ep%d-in=%d\n", ep->num, ep->in);
+        dev = ep->dev;
+
+        /* exit on suspend */
+        if (dev->sys_suspended) 
+              return -ESHUTDOWN;
+
+        if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)
+                return -ESHUTDOWN;
+
+        /* map dma (usally done before) */
+        if (ep->dma && usbreq->length != 0 && usbreq->dma == DMA_DONT_USE) {
+                VDBG("DMA map req %lx\n", (unsigned long) req);
+#if   defined(CONFIG_SOC_AU1200)
+                if (ep->in)
+                        usbreq->dma = dma_map_single(dev->pdev,
+                                                     usbreq->buf,
+                                                     usbreq->length,
+                                                     PCI_DMA_TODEVICE);
+                else
+                        usbreq->dma = dma_map_single(dev->pdev,
+                                                     usbreq->buf,
+                                                     usbreq->length,
+                                                     PCI_DMA_FROMDEVICE);
+#else
+                if (ep->in)
+                        usbreq->dma = pci_map_single(dev->pdev,
+                                                     usbreq->buf,
+                                                     usbreq->length,
+                                                     PCI_DMA_TODEVICE);
+                else
+                        usbreq->dma = pci_map_single(dev->pdev,
+                                                     usbreq->buf,
+                                                     usbreq->length,
+                                                     PCI_DMA_FROMDEVICE);
+#endif
+                req->dma_mapping = 1;
+        }
+
+        VDBG( "%s queue req %p, len %d req->td_data=%lx buf %p\n",
+                        usbep->name, usbreq, usbreq->length, (unsigned long) req->td_data, usbreq->buf);
+
+        spin_lock_irqsave (&dev->lock, iflags);
+        usbreq->actual = 0;
+        usbreq->status = -EINPROGRESS;
+        req->dma_done = 0;
+        
+        /* on empty queue just do first transfer */
+        if (list_empty (&ep->queue)) {
+                /* zlp */
+                if (ep->in && usbreq->length == 0) {
+                        /* IN zlp's are handled by hardware */
+                        complete_req(ep, req, 0);
+                        VDBG( "%s: zlp\n", ep->ep.name);
+                        /* if set_config or set_intf is waiting for ack by zlp
+                           then set CSR_DONE */
+                        if (dev->set_cfg_not_acked) {
+                                tmp = readl(&dev->regs->ctl);
+                                tmp |= AMD_BIT(UDC_DEVCTL_CSR_DONE);
+                                writel(tmp, &dev->regs->ctl);
+                                dev->set_cfg_not_acked = 0;
+                        }
+                        /* setup command is ACK'ed now by zlp */
+                        if (dev->waiting_zlp_ack_ep0in) {
+                                /* clear NAK by writing CNAK in EP0_IN */
+                                tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->ctl);
+                                tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                                writel(tmp, &dev->ep[UDC_EP0IN_IX].regs->ctl);
+                                dev->ep[UDC_EP0IN_IX].naking = 0;
+                                UDC_QUEUE_CNAK(&dev->ep[UDC_EP0IN_IX], UDC_EP0IN_IX);
+                                dev->waiting_zlp_ack_ep0in = 0;
+                        }
+                        goto finished;
+                }
+                if (ep->dma) {
+                        retval = prep_dma(ep, req);
+                        if (retval != 0)
+                                goto finished;
+                        /* write desc pointer to enable DMA */
+                        if (ep->in) {
+                                /* set HOST READY */
+                                req->td_data->status 
+                                      = AMD_ADDBITS(req->td_data->status,
+                                                    UDC_DMA_IN_STS_BS_HOST_READY, 
+                                                    UDC_DMA_IN_STS_BS);
+                        }
+
+                        /* write desc pointer */
+                        writel(req->td_phys, &ep->regs->desptr);
+                        /* clear NAK by writing CNAK */
+                        if (ep->naking) {
+                                tmp = readl(&ep->regs->ctl);
+                                tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                                writel(tmp, &ep->regs->ctl);
+                                ep->naking = 0;
+                                UDC_QUEUE_CNAK(ep, ep->num);
+                        }
+                
+                        if (!ep->in) {
+                                /* enable DMA */
+                                udc_set_rde(dev);
+                                if (ep->num != UDC_EP0OUT_IX) 
+                                        dev->data_ep_queued = 1;
+                        }
+#ifdef UDC_DISABLE_IRQ_IF_EMPTY_IN_QUEUE
+                        else {
+                                /* enable ep irq */
+                                tmp = readl(&dev->regs->ep_irqmsk);
+                                tmp &= AMD_UNMASK_BIT(ep->num);
+                                writel(tmp, &dev->regs->ep_irqmsk);        
+                        }
+#endif
+                }
+
+        } else if (ep->dma) {
+
+                /* prep_dma not used for OUT ep's, this is not possible
+                   for PPB modes, because of chain creation reasons */
+                if (ep->in) {
+                        retval = prep_dma(ep, req);
+                        if (retval != 0)
+                                goto finished;
+                }
+
+        }
+        VDBG("list_add\n");
+        /* add request to ep queue */
+        if (req) {
+        
+                list_add_tail (&req->queue, &ep->queue);
+
+                /* stop OUT naking */
+                if (!ep->in) {
+                        if (!use_dma && udc_rxfifo_pending) {
+                                DBG("udc_queue(): pending bytes in rxfifo after nyet\n");
+                                /* read pending bytes afer nyet: referring to isr */
+                                if (udc_rxfifo_read(ep, req)) {
+                                        /* finish */
+                                        complete_req(ep, req, 0);
+                                }
+                                udc_rxfifo_pending = 0;
+
+                        }
+                }
+
+        }
+
+finished:
+        spin_unlock_irqrestore (&dev->lock, iflags);
+        return retval;
+}
+
+/**
+ * Empty request queue of an endpoint 
+ * 
+ * \param ep            pointer to ep struct
+ */
+static void empty_req_queue(struct udc_ep *ep)
+{
+        struct udc_request      *req;
+
+        ep->halted = 1;
+        while (!list_empty (&ep->queue)) {
+                req = list_entry(ep->queue.next,
+                               struct udc_request,
+                               queue);
+                complete_req(ep, req, -ESHUTDOWN);
+        }
+}
+
+/**
+ * Dequeues a request packet, called by gadget driver
+ * 
+ * \param usbep           pointer to usb ep struct
+ * \param usbreq          pointer to request packet to be freed
+ * \return 0 if success
+ */
+static int udc_dequeue (struct usb_ep *usbep, struct usb_request *usbreq)
+{
+        struct udc_ep   *ep;
+        struct udc_request      *req;
+        unsigned                req_may_used = 0;
+        unsigned                halted;
+        unsigned long           iflags;
+
+        ep = container_of (usbep, struct udc_ep, ep);
+        if (!usbep
+            || !usbreq
+            || (!ep->desc && (ep->num != 0 && ep->num != UDC_EP0OUT_IX)))
+                return -EINVAL;
+
+        req = container_of (usbreq, struct udc_request, req);
+
+        spin_lock_irqsave (&ep->dev->lock, iflags);
+        halted = ep->halted;
+        ep->halted = 1;
+        /* request in processing or next one */
+        if (ep->queue.next == &req->queue) {
+                req_may_used = 1;
+        }
+        complete_req(ep, req, -ECONNRESET);
+        ep->halted = halted;
+
+        spin_unlock_irqrestore (&ep->dev->lock, iflags);
+        if (req_may_used)
+                return -EOPNOTSUPP;
+        else
+                return 0;
+}
+
+/**
+ * Halt or clear halt of endpoint 
+ * 
+ * \param usbe          pointer to ep struct
+ * \param halt          1 - halt, 0 - clear halt
+ * \return 0 if success 
+ */
+static int
+udc_set_halt (struct usb_ep *usbep, int halt)
+{
+        struct udc_ep   *ep;
+        u32 tmp;
+        unsigned long iflags;
+        int retval = 0;
+
+        if (!usbep)
+                return -EINVAL;
+
+        DBG("set_halt %s: halt=%d\n", usbep->name, halt);
+
+        ep = container_of (usbep, struct udc_ep, ep);
+        if (!ep->desc && (ep->num != 0 && ep->num != UDC_EP0OUT_IX))
+                return -EINVAL;
+        if (!ep->dev->driver
+            || ep->dev->gadget.speed == USB_SPEED_UNKNOWN)
+                return -ESHUTDOWN;
+
+        /* exit on suspend */
+        if (ep->dev->sys_suspended) 
+                return -ESHUTDOWN;
+
+        spin_lock_irqsave (&udc_stall_spinlock, iflags);
+        /* halt or clear halt */
+        if (halt) {
+                if (ep->num == 0)
+                        ep->dev->stall_ep0in = 1;
+                else {
+                        /* set STALL */
+                        /* rxfifo empty not taken into acount */
+                        tmp = readl(&ep->regs->ctl);
+                        tmp |= AMD_BIT(UDC_EPCTL_S);
+                        writel(tmp, &ep->regs->ctl);
+                        ep->halted = 1;
+
+#ifdef UDC_USE_TIMER
+                        /* setup poll timer */
+                        if (!timer_pending(&udc_pollstall_timer)) {
+                                udc_pollstall_timer.expires = jiffies + HZ 
+                                        * UDC_POLLSTALL_TIMER_USECONDS
+                                        / (1000 * 1000);
+                                if (!stop_pollstall_timer) {
+                                        DBG("start polltimer\n");
+                                        add_timer(&udc_pollstall_timer);
+                                }
+                        }
+#endif
+                }
+        } else {
+                /* ep is halted by set_halt() before */
+                if (ep->halted) {
+                        tmp = readl(&ep->regs->ctl);
+                        /* clear stall bit */
+                        tmp = tmp & AMD_CLEAR_BIT(UDC_EPCTL_S);
+                        /* clear NAK by writing CNAK */
+                        tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                        writel(tmp, &ep->regs->ctl);
+                        ep->halted = 0;
+                        UDC_QUEUE_CNAK(ep, ep->num);
+                }
+        }
+        spin_unlock_irqrestore (&udc_stall_spinlock, iflags);
+        return retval;
+}
+
+/**
+ * Return fifo fill state (not used, not implemented)
+ * 
+ * \param usbep            pointer to usb ep struct
+ * \return available bytes in fifo 
+ */
+static int
+udc_fifo_status (struct usb_ep *usbep)
+{
+        return 0;
+}
+
+/**
+ * Flush the endpoint fifo (not implemented)
+ * 
+ * \param usbep            pointer to usb ep struct
+ */
+static void
+udc_fifo_flush (struct usb_ep *usbep)
+{
+        return;
+}
+
+/* gadget interface */
+static struct usb_ep_ops udc_ep_ops = {
+        .enable         = udc_enable,
+        .disable        = udc_disable,
+
+        .queue          = udc_queue,
+        .dequeue        = udc_dequeue,
+
+        .alloc_request  = udc_alloc_request,
+        .free_request   = udc_free_request,
+
+        .alloc_buffer   = udc_alloc_buffer,
+        .free_buffer    = udc_free_buffer,
+
+        .set_halt       = udc_set_halt,
+        .fifo_status    = udc_fifo_status,
+        .fifo_flush     = udc_fifo_flush,
+};
+
+/*-------------------------------------------------------------------------*/
+
+/**
+ * Get frame count fifo (not implemented)
+ * 
+ * \param gadget            pointer to gadget struct
+ * \return frame count
+ */
+static int udc_get_frame (struct usb_gadget *gadget)
+{
+        return 0;
+}
+
+/**
+ * Remote wakeup gadget interface
+ * 
+ * \param gadget            pointer to gadget struct
+ * \return 0 if success
+ */
+static int udc_wakeup (struct usb_gadget *gadget)
+{
+        struct udc              *dev;
+
+        if (!gadget)
+                return -EINVAL;
+        dev = container_of (gadget, struct udc, gadget);
+        udc_remote_wakeup(dev);
+
+        return 0;
+}
+
+/**
+ * gadget ioctl, used for OTG support notification
+ * 
+ * \param gadget            pointer to gadget struct
+ * \param cmd               command
+ * \param par               parmater
+ * \return 1 if OTG supported, else 0
+ */
+static int udc_gadget_ioctl (struct usb_gadget *gadget, unsigned cmd, unsigned long par)
+{
+        struct udc              *dev;
+        int                     retval = 0;
+        unsigned long           iflags;
+        u32 tmp;
+
+        if (!gadget)
+                return -ENODEV;
+        dev = container_of (gadget, struct udc, gadget);
+        spin_lock_irqsave (&dev->lock, iflags);
+        tmp = readl(&dev->regs->cfg);
+        
+        if (tmp & AMD_BIT(UDC_DEVCFG_HNPSFEN))
+                retval = 1;
+        else
+                retval = 0;
+        spin_unlock_irqrestore (&dev->lock, iflags);
+        return retval;
+}
+
+/* gadget operations */
+static const struct usb_gadget_ops udc_ops = {
+        .wakeup         = udc_wakeup,
+        .get_frame      = udc_get_frame,
+        .ioctl          = udc_gadget_ioctl, 
+};
+
+/**
+ * Setups endpoint parameters, adds endpoints to linked list
+ * 
+ * \param dev           pointer to dev struct
+ */
+static void make_ep_lists(struct udc *dev)
+{
+        /* make gadget ep lists */
+        INIT_LIST_HEAD (&dev->gadget.ep_list);
+        list_add_tail (&dev->ep [UDC_EPIN_STATUS_IX].ep.ep_list, &dev->gadget.ep_list);
+        list_add_tail (&dev->ep [UDC_EPIN_IX].ep.ep_list, &dev->gadget.ep_list);
+        list_add_tail (&dev->ep [UDC_EPOUT_IX].ep.ep_list, &dev->gadget.ep_list);
+        
+        /* fifo config */
+        dev->ep [UDC_EPIN_STATUS_IX].fifo_depth = UDC_EPIN_SMALLINT_BUFF_SIZE;
+        if (dev->gadget.speed == USB_SPEED_FULL)
+                dev->ep [UDC_EPIN_IX].fifo_depth = UDC_FS_EPIN_BUFF_SIZE; 
+        else if (dev->gadget.speed == USB_SPEED_HIGH)
+                dev->ep [UDC_EPIN_IX].fifo_depth = hs_tx_buf; 
+        dev->ep [UDC_EPOUT_IX].fifo_depth = UDC_RXFIFO_SIZE;
+}
+
+/**
+ * Sets fifo mode, called by gadget driver
+ * 
+ * \param gadget        pointer to gadget struct
+ * \param md            not used
+ * \return 0 if success 
+ */
+int au1200udc_set_fifo_mode (struct usb_gadget *gadget, int md)
+{
+        struct udc              *dev;
+        unsigned long           iflags;
+
+        if (!gadget)
+                return -ENODEV;
+
+        dev = container_of (gadget, struct udc, gadget);
+
+        spin_lock_irqsave (&dev->lock, iflags);
+        make_ep_lists(dev);
+        spin_unlock_irqrestore (&dev->lock, iflags);
+
+        return 0;
+}
+EXPORT_SYMBOL (au1200udc_set_fifo_mode);
+
+/**
+ * \brief
+ * init registers at driver load time 
+ *
+ * \param dev        pointer to device struc
+ * \return 0 if success
+ */
+static int startup_registers(struct udc* dev)
+{
+        u32 tmp;
+
+        /* init controller by soft reset */
+        udc_soft_reset(dev);
+
+        /* mask not needed interrupts */
+        udc_mask_unused_interrupts(dev);
+
+        /* put into initial config */
+        udc_basic_init (dev);
+        /* link up all endpoints */
+        udc_setup_endpoints (dev);
+       
+        /* program speed */
+        tmp = readl(&dev->regs->cfg);
+        if (use_fullspeed) {
+                tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_FS, UDC_DEVCFG_SPD);
+        }
+        else {
+                tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_HS, UDC_DEVCFG_SPD);
+        }
+        writel(tmp, &dev->regs->cfg);
+
+        return 0;
+}
+
+/**
+ * Inits UDC context 
+ * 
+ * \param dev           pointer to device struct
+ */
+static void udc_basic_init (struct udc *dev)
+{
+        u32     tmp;
+
+        DBG("udc_basic_init()\n");        
+        
+        dev->gadget.speed = USB_SPEED_UNKNOWN;
+
+#ifdef UDC_USE_TIMER
+        /* stop RDE timer */ 
+        if (timer_pending(&udc_timer)) {
+                set_rde = 0;
+                mod_timer(&udc_timer, jiffies - 1);
+        }
+        /* stop poll stall timer */ 
+        if (timer_pending(&udc_pollstall_timer)) {
+                mod_timer(&udc_pollstall_timer, jiffies - 1);
+        }
+#endif
+        /* disable DMA */
+        tmp = readl(&dev->regs->ctl);
+        tmp &= AMD_UNMASK_BIT(UDC_DEVCTL_RDE);
+        tmp &= AMD_UNMASK_BIT(UDC_DEVCTL_TDE);
+        writel(tmp, &dev->regs->ctl);                
+
+        /* enable dynamic CSR programming */
+        tmp =  readl(&dev->regs->cfg);
+        tmp |= AMD_BIT(UDC_DEVCFG_CSR_PRG);
+        /* set self powered */
+        tmp |= AMD_BIT(UDC_DEVCFG_SP);
+        /* set remote wakeupable */
+        tmp |= AMD_BIT(UDC_DEVCFG_RWKP);
+        writel(tmp, &dev->regs->cfg);                     
+
+        make_ep_lists(dev);
+
+        dev->data_ep_enabled = 0;
+        dev->data_ep_queued = 0;
+}
+
+/**
+ * Sets initial endpoint parameters
+ * 
+ * \param dev           pointer to device struct
+ */
+static void udc_setup_endpoints(struct udc *dev)
+{
+        struct udc_ep   *ep;
+        u32     tmp;
+        u32     reg;
+
+        DBG("udc_setup_endpoints()\n");
+
+        /* read enum speed */
+        tmp = readl(&dev->regs->sts);
+        tmp = AMD_GETBITS(tmp, UDC_DEVSTS_ENUM_SPEED);        
+        if (tmp ==  UDC_DEVSTS_ENUM_SPEED_HIGH) {
+                dev->gadget.speed = USB_SPEED_HIGH;
+        }
+        else if (tmp ==  UDC_DEVSTS_ENUM_SPEED_FULL) {
+                dev->gadget.speed = USB_SPEED_FULL;
+        }
+        
+        /* set basic ep parameters */
+        for (tmp = 0; tmp < UDC_EP_NUM; tmp++) {
+                ep = &dev->ep[tmp];
+                ep->dev = dev;
+                ep->ep.name = ep_string [tmp];
+                ep->num = tmp;
+                /* txfifo size is calculated at enable time */
+                ep->txfifo = dev->txfifo;
+
+                /* fifo size */
+                if (tmp < UDC_EPIN_NUM) {
+                        ep->fifo_depth = UDC_TXFIFO_SIZE;
+                        ep->in = 1;
+                }
+                else {
+                        ep->fifo_depth = UDC_RXFIFO_SIZE;
+                        ep->in = 0;
+
+                }
+                ep->regs = &dev->ep_regs[tmp];
+                /* ep will be reset only if ep was not enabled before to avoid
+                   disabling ep interrupts when ENUM interrupt occurs but ep is
+                   not enabled by gadget driver  */
+                if (!ep->desc) {
+                        ep_init (dev->regs, ep);
+                }
+
+                if (use_dma) {
+                        /* ep->dma is not really used, just to indicate that */
+                        /* DMA is active: remove this */
+                        /* dma regs = dev control regs */        
+                        ep->dma = (u32*) &dev->regs->ctl;       
+
+                        /* nak OUT endpoints until enable - not for ep0*/
+                        if (tmp != UDC_EP0IN_IX
+                            && tmp != UDC_EP0OUT_IX
+                            && tmp > UDC_EPIN_NUM) {
+                                /* set NAK  */
+                                reg = readl(&dev->ep[tmp].regs->ctl);
+                                reg |= AMD_BIT(UDC_EPCTL_SNAK); 
+                                writel(reg, &dev->ep[tmp].regs->ctl);
+                                dev->ep[tmp].naking = 1;
+                                       
+                        }
+                }
+        }
+        /* EP0 max packet */
+        if (dev->gadget.speed == USB_SPEED_FULL) {
+                dev->ep [UDC_EP0IN_IX].ep.maxpacket = UDC_FS_EP0IN_MAX_PKT_SIZE;
+                dev->ep [UDC_EP0OUT_IX].ep.maxpacket = UDC_FS_EP0OUT_MAX_PKT_SIZE;
+        }
+        else if (dev->gadget.speed == USB_SPEED_HIGH) {
+                dev->ep [UDC_EP0IN_IX].ep.maxpacket = UDC_EP0IN_MAX_PKT_SIZE;
+                dev->ep [UDC_EP0OUT_IX].ep.maxpacket = UDC_EP0OUT_MAX_PKT_SIZE;
+        }
+
+        /* with suspend bug workaround, ep0 params for gadget driver
+        are set at gadget driver bind() call */
+        dev->gadget.ep0 = &dev->ep [UDC_EP0IN_IX].ep;
+        dev->ep [UDC_EP0IN_IX].halted = 0;
+        INIT_LIST_HEAD (&dev->gadget.ep0->ep_list);
+
+        /* init cfg/alt/int */
+        dev->cur_config = 0;
+        dev->cur_intf = 0;
+        dev->cur_alt = 0;
+}
+
+/**
+ * Bringup after Connect event,
+ * initial bringup to be ready for ep0 events 
+ * 
+ * \param dev           pointer to device struct
+ */
+static void usb_connect (struct udc *dev) {
+
+                INFO("USB Connect\n");
+
+                dev->connected = 1;
+
+                /* put into initial config */
+                udc_basic_init (dev);
+
+                /* enable device setup interrupts */
+                udc_enable_dev_setup_interrupts(dev);
+}
+
+/**
+ * Calls gadget with disconnect event and resets the UDC and makes
+ * initial bringup to be ready for ep0 events 
+ * 
+ * \param dev           pointer to device struct
+ */
+static void usb_disconnect (struct udc *dev) {
+
+                INFO("USB Disconnect\n");
+
+                dev->connected = 0;
+
+                /* mask interrupts */
+                udc_mask_unused_interrupts(dev);
+
+                tasklet_schedule(&disconnect_tasklet);
+}
+
+/**
+ * Tasklet for disconnect to be outside of interrupt 
+ * context 
+ * 
+ * \param par   pointer to device struct pointer
+ */
+void udc_tasklet_disconnect(unsigned long par)
+{
+        struct udc* dev = (struct udc*) (*((struct udc**) par));
+        u32 tmp;
+
+        DBG("Tasklet disconnect\n");
+
+        if (dev->driver) {
+                /* call gadget to reset configs etc. */
+                if (spin_is_locked(&dev->lock)) {
+                        spin_unlock(&dev->lock);
+                        dev->driver->disconnect (&dev->gadget);
+                        spin_lock(&dev->lock);
+                }
+                else
+                        dev->driver->disconnect (&dev->gadget);
+
+                /* empty queues */
+                for (tmp = 0; tmp < UDC_EP_NUM; tmp++) {
+                        empty_req_queue (&dev->ep [tmp]);
+                }
+        }	
+
+        /* disable ep0 */
+        ep_init (dev->regs,
+                        &dev->ep [UDC_EP0IN_IX]);
+        
+
+        if (!soft_reset_occured) {
+                /* init controller by soft reset */
+#ifdef UDC_IPCASE_8000018724_WORKAROUND
+                udc_soft_reset(dev);
+#endif
+                soft_reset_occured++;
+        }
+#ifndef UDC_IPBUG_3950_WORKAROUND
+        /* re-enable dev interrupts */
+        udc_enable_dev_setup_interrupts(dev);
+#endif
+        /* back to full speed ? */
+        if (use_fullspeed) {
+                tmp = readl(&dev->regs->cfg);
+                tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_FS, UDC_DEVCFG_SPD);
+                writel(tmp, &dev->regs->cfg);
+        }
+}
+
+/**
+ * Reset the UDC core 
+ * 
+ * \param dev           pointer to device struct
+ */
+static void udc_soft_reset(struct udc* dev)
+{
+        DBG("Soft reset\n");
+        /* reset possible waiting interrupts, because int.
+           status is lost after soft reset */
+        /* ep int. status reset */ 
+        writel(UDC_EPINT_MSK_DISABLE_ALL, &dev->regs->ep_irqsts);
+        /* device int. status reset */ 
+        writel(UDC_DEV_MSK_DISABLE, &dev->regs->irqsts);
+
+        spin_lock_irq(&udc_irq_spinlock);
+        writel(AMD_BIT(UDC_DEVCFG_SOFTRESET), &dev->regs->cfg);
+        readl(&dev->regs->cfg);
+        spin_unlock_irq(&udc_irq_spinlock);
+        
+}
+
+#ifdef UDC_USE_TIMER
+/**
+ * RDE timer callback to set RDE bit 
+ * 
+ * \param v           timer callback argument
+ */
+void udc_timer_function(unsigned long v)
+{
+        u32 tmp;
+        unsigned int i;
+        unsigned int bulk_data_arrived;
+        spin_lock_irq(&udc_irq_spinlock);
+        if (set_rde) {
+                /* open the fifo if fifo was filled on last timer call */
+                if (set_rde > 1) {
+                        bulk_data_arrived = 0;
+                        /* check wether OUT bulk data is arrived */
+                        for (i = UDC_EPIN_NUM + 1; i < UDC_EP_NUM; i++) {
+                                tmp = readl(&udc->ep [i].regs->sts);
+                                if (AMD_GETBITS(tmp, UDC_EPSTS_OUT)
+                                    == UDC_EPSTS_OUT_DATA) {
+                                        bulk_data_arrived = 1;
+                                        break;
+                                }
+                        }
+                        /* if OUT bulk data in fifo wait for queueing which
+                           sets RDE, if not open fifo for setup packet */
+                        if (!bulk_data_arrived) {
+                                /* set RDE */
+                                tmp = readl(&udc->regs->ctl);
+                                tmp |= AMD_BIT(UDC_DEVCTL_RDE);
+                                writel(tmp, &udc->regs->ctl);                
+                        }
+                        else 
+                                INFO("ep%d - queueing delay longer than %d second(s)\n",
+                                     i, UDC_RDE_TIMER_SECONDS);
+                        set_rde = -1;
+                }
+                else if (readl(&udc->regs->sts) & 
+                         AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) {
+                        /* if fifo empty setup polling, do not just
+                           open the fifo */
+                        udc_timer.expires = jiffies + HZ/UDC_RDE_TIMER_DIV;
+                        if (!stop_timer) {
+                                add_timer(&udc_timer);
+                        }
+                }
+                else {
+                        /* fifo contains data now, setup timer for opening
+                           the fifo when timer expires to be able to receive
+                           setup packets, when data packets gets queued by
+                           gadget layer then timer will forced to expire with
+                           set_rde=0 (RDE is set in udc_queue()) */
+                        set_rde++;
+                        /* debug: lhadmot_timer_start = 221070 */
+                        udc_timer.expires = jiffies + HZ*UDC_RDE_TIMER_SECONDS;
+                        if (!stop_timer) {
+                                add_timer(&udc_timer);
+                        }
+                }
+                        
+        }
+        else
+                set_rde = -1; /* RDE was set by udc_queue() */
+        spin_unlock_irq(&udc_irq_spinlock);
+        if (stop_timer)
+                complete(&on_exit);
+        
+}
+
+/**
+ *  Handle halt state, used in stall poll timer 
+ * 
+ * \param ep    pointer to endpoint struct           
+ */
+static inline void udc_handle_halt_state(struct udc_ep* ep)
+{
+        u32 tmp;
+        /* set stall as long not halted */
+        if (ep->halted == 1) {
+                tmp = readl(&ep->regs->ctl);
+                /* STALL cleared ? */
+                if (!(tmp & AMD_BIT(UDC_EPCTL_S))) {
+                        DBG("ep %d: set STALL again\n", ep->num);
+                        /* set STALL again */
+                        tmp |= AMD_BIT(UDC_EPCTL_S);
+                        writel(tmp, &ep->regs->ctl);
+                }
+        } 
+}
+
+/**
+ *  Stall timer callback to poll S bit and set it again after
+ *  CLEAR_FEATURE 
+ * 
+ * \param v           timer callback argument
+ */
+void udc_pollstall_timer_function(unsigned long v)
+{
+        struct udc_ep *ep;
+        int halted = 0;
+        unsigned long iflags;
+
+        spin_lock_irqsave (&udc_stall_spinlock, iflags);
+        /* only one IN and OUT endpoints are handled */
+        /* IN poll stall */ 
+        ep = &udc->ep [UDC_EPIN_IX];
+        udc_handle_halt_state(ep); 
+        if (ep->halted)
+                halted = 1;
+        /* OUT poll stall  */ 
+        ep = &udc->ep [UDC_EPOUT_IX];
+        udc_handle_halt_state(ep); 
+        if (ep->halted)
+                halted = 1;
+
+        /* setup timer again when still halted */
+        if (!stop_pollstall_timer && halted) {
+                udc_pollstall_timer.expires = jiffies + HZ 
+                                              * UDC_POLLSTALL_TIMER_USECONDS
+                                              / (1000 * 1000);
+                add_timer(&udc_pollstall_timer);
+        }
+        spin_unlock_irqrestore (&udc_stall_spinlock, iflags);
+
+        if (stop_pollstall_timer)
+                complete(&on_pollstall_exit);
+}
+#endif
+
+#if defined(UDC_IPBUG_3950_WORKAROUND) \
+    || defined(UDC_IPCASE_8000018724_WORKAROUND) \
+    && !defined(UDC_HSB1)
+/**
+ * Called by OTG driver to notify us regarding an OTG event
+ * 
+ * \param code           notify code
+ */
+void otg_notify(unsigned int code) {
+        VDBG("OTG notify code=%d\n", code);
+        switch (code) {
+                case OTG_GADGET_EVT_SVDROP:
+                        /* disconnect event */
+                        usb_disconnect(udc);
+                        break;
+                case OTG_GADGET_EVT_SVALID:
+                        /* connect event */
+                        usb_connect(udc);
+                        break;
+                case OTG_GADGET_REQ_WAKE:
+                        /* remote wakeup event */
+                        udc_remote_wakeup(udc);
+                        break;
+        }  
+}
+#endif
+
+/**
+ * Inits endpoint 0 so that SETUP packets are processed
+ * 
+ * \param dev           pointer to device struct
+ */
+static void activate_control_endpoints (struct udc *dev)
+{
+        u32 tmp;
+
+        DBG("activate_control_endpoints\n");
+
+        /* flush fifo */
+        tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->ctl);
+        tmp |= AMD_BIT(UDC_EPCTL_F); 
+        writel(tmp, &dev->ep[UDC_EP0IN_IX].regs->ctl);
+
+        /* set ep0 directions */
+        dev->ep[UDC_EP0IN_IX].in = 1;
+        dev->ep[UDC_EP0OUT_IX].in = 0;
+
+        /* set buffer size (tx fifo entries) of EP0_IN */
+        tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->bufin_framenum);
+        if (dev->gadget.speed == USB_SPEED_FULL)
+                tmp = AMD_ADDBITS(tmp, UDC_FS_EPIN0_BUFF_SIZE, UDC_EPIN_BUFF_SIZE);
+        else if (dev->gadget.speed == USB_SPEED_HIGH)
+                tmp = AMD_ADDBITS(tmp, UDC_EPIN0_BUFF_SIZE, UDC_EPIN_BUFF_SIZE);
+        writel(tmp, &dev->ep[UDC_EP0IN_IX].regs->bufin_framenum);
+        
+        /* set max packet size of EP0_IN */
+        tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->bufout_maxpkt);
+        if (dev->gadget.speed == USB_SPEED_FULL)
+                tmp = AMD_ADDBITS(tmp, UDC_FS_EP0IN_MAX_PKT_SIZE, UDC_EP_MAX_PKT_SIZE);
+        else if (dev->gadget.speed == USB_SPEED_HIGH)
+                tmp = AMD_ADDBITS(tmp, UDC_EP0IN_MAX_PKT_SIZE, UDC_EP_MAX_PKT_SIZE);
+        writel(tmp, &dev->ep[UDC_EP0IN_IX].regs->bufout_maxpkt);
+
+        /* set max packet size of EP0_OUT */
+        tmp = readl(&dev->ep[UDC_EP0OUT_IX].regs->bufout_maxpkt);
+        if (dev->gadget.speed == USB_SPEED_FULL)
+                tmp = AMD_ADDBITS(tmp, UDC_FS_EP0OUT_MAX_PKT_SIZE, UDC_EP_MAX_PKT_SIZE);
+        else if (dev->gadget.speed == USB_SPEED_HIGH)
+                tmp = AMD_ADDBITS(tmp, UDC_EP0OUT_MAX_PKT_SIZE, UDC_EP_MAX_PKT_SIZE);
+        writel(tmp, &dev->ep[UDC_EP0OUT_IX].regs->bufout_maxpkt);
+
+        /* set max packet size of EP0 in UDC CSR  */
+        tmp = readl(&dev->csr->ne[0]);
+        if (dev->gadget.speed == USB_SPEED_FULL)
+                tmp = AMD_ADDBITS(tmp, UDC_FS_EP0OUT_MAX_PKT_SIZE, UDC_CSR_NE_MAX_PKT);
+        else if (dev->gadget.speed == USB_SPEED_HIGH)
+                tmp = AMD_ADDBITS(tmp, UDC_EP0OUT_MAX_PKT_SIZE, UDC_CSR_NE_MAX_PKT);
+        writel(tmp, &dev->csr->ne[0]);
+
+        if (use_dma) {
+                dev->ep [UDC_EP0OUT_IX].td->status |= AMD_BIT(UDC_DMA_OUT_STS_L);
+                /* write dma desc address */
+                writel(dev->ep [UDC_EP0OUT_IX].td_stp_dma, &dev->ep[UDC_EP0OUT_IX].regs->subptr);
+                writel(dev->ep [UDC_EP0OUT_IX].td_phys, &dev->ep[UDC_EP0OUT_IX].regs->desptr);
+#ifdef UDC_USE_TIMER
+                /* stop RDE timer */ 
+                if (timer_pending(&udc_timer)) {
+                        set_rde = 0;
+                        mod_timer(&udc_timer, jiffies - 1);
+                }
+                /* stop pollstall timer */ 
+                if (timer_pending(&udc_pollstall_timer)) {
+                        mod_timer(&udc_pollstall_timer, jiffies - 1);
+                }
+#endif
+                /* enable DMA */
+                tmp = readl(&dev->regs->ctl);
+                tmp |= AMD_BIT(UDC_DEVCTL_MODE)
+                                | AMD_BIT(UDC_DEVCTL_RDE)
+                                | AMD_BIT(UDC_DEVCTL_TDE);
+                if (use_dma_bufferfill_mode) {
+                        tmp |= AMD_BIT(UDC_DEVCTL_BF);
+                } 
+                else if (use_dma_ppb_du) {
+                        tmp |= AMD_BIT(UDC_DEVCTL_DU);
+                }
+                writel(tmp, &dev->regs->ctl);                
+        }
+
+        /* clear NAK by writing CNAK for EP0IN */
+        tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->ctl);
+        tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+        writel(tmp, &dev->ep[UDC_EP0IN_IX].regs->ctl);
+        dev->ep[UDC_EP0IN_IX].naking = 0;
+        UDC_QUEUE_CNAK(&dev->ep[UDC_EP0IN_IX], UDC_EP0IN_IX);
+        
+        /* clear NAK by writing CNAK for EP0OUT */
+        tmp = readl(&dev->ep[UDC_EP0OUT_IX].regs->ctl);
+        tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+        writel(tmp, &dev->ep[UDC_EP0OUT_IX].regs->ctl);
+        dev->ep[UDC_EP0OUT_IX].naking = 0;
+        UDC_QUEUE_CNAK(&dev->ep[UDC_EP0OUT_IX], UDC_EP0OUT_IX);
+}
+
+/**
+ * \brief
+ * Make endpoint 0 ready for control traffic
+ *
+ * \param dev        pointer to device struc
+ * \return 0 if success
+ */
+static int setup_ep0(struct udc *dev)
+{
+        activate_control_endpoints (dev);
+        /* enable ep0 interrupts */
+        udc_enable_ep0_interrupts(dev);
+        /* enable device setup interrupts */
+        udc_enable_dev_setup_interrupts(dev);
+
+        return 0;
+}
+
+/**
+ * \brief
+ * Called by gadget driver to register itself
+ *
+ * \param driver        pointer to gadget driver struct
+ * \return 0 if success
+ */
+int usb_gadget_register_driver (struct usb_gadget_driver *driver)
+{
+        struct udc              *dev = udc;
+        int                     retval;
+	u32 tmp;
+
+        if (!driver || !driver->bind
+                    || !driver->unbind
+                    || !driver->setup
+                    || driver->speed != USB_SPEED_HIGH)
+                return -EINVAL;
+        if (!dev)
+                return -ENODEV;
+        if (dev->driver)
+                return -EBUSY;
+
+        driver->driver.bus = 0;
+        dev->driver = driver;
+        dev->gadget.dev.driver = &driver->driver;
+
+#ifndef CONFIG_SOC_AU1200
+        /*device_create_file (&dev->pdev->dev, &dev_attr_function);
+        device_create_file (&dev->pdev->dev, &dev_attr_queues);*/
+#endif
+
+#ifdef CONFIG_USB_OTG
+	dev->gadget.is_otg = 1;
+#endif
+        retval = driver->bind (&dev->gadget);
+        /* e.g. ether gadget needs driver_data on both ep0 endpoints */
+        dev->ep[UDC_EP0OUT_IX].ep.driver_data =
+                dev->ep [UDC_EP0IN_IX].ep.driver_data;
+        
+        gadget_bind_count++;
+        if (retval) {
+                DBG( "binding to  %s returning %d\n",
+                                driver->driver.name, retval);
+                dev->driver = 0;
+                dev->gadget.dev.driver = 0;
+                return retval;
+        }
+
+        /* if otg driver already registered */
+        /* call otg bind() to mux udc to phy */
+        if (dev->otg_transceiver) {
+                dev->otg_transceiver->set_peripheral(
+                        dev->otg_transceiver, &dev->gadget);
+		/* clear SD */
+		tmp = readl(&dev->regs->ctl);
+		tmp = tmp & AMD_CLEAR_BIT(UDC_DEVCTL_SD);
+		writel(tmp, &dev->regs->ctl);
+        }
+#ifndef UDC_IPBUG_3950_WORKAROUND
+        usb_connect(dev);
+#endif
+
+        return 0;
+}
+EXPORT_SYMBOL (usb_gadget_register_driver);
+
+/**
+ * Called by OTG driver to register itself
+ * 
+ *
+ * \param get_transceiver  function pointer to get OTG info
+ * \return 0 if success
+ */
+int usb_gadget_register_otg (struct otg_transceiver * (*get_transceiver)(void))
+{
+        struct udc              *dev = udc;
+        int                     retval;
+	u32 tmp;
+        
+        if (!get_transceiver)
+                return -EINVAL;
+        if (!dev)
+                return -ENODEV;
+        if (dev->otg_transceiver)
+                return -EBUSY;
+
+        dev->otg_transceiver = get_transceiver ();
+
+#if !defined(UDC_HSB1)	
+        if (!(transceiver_to_otg(dev->otg_transceiver)->otg_priv))
+                return -EINVAL;
+        dev->otg_driver = (struct usb_otg_gadget_extension *)
+                          transceiver_to_otg(dev->otg_transceiver)->otg_priv;
+#endif	
+
+#ifdef UDC_IPBUG_3943_WORKAROUND
+        /* init registers here first with suspend bug */
+        if (!otg_reg_count) {
+                startup_registers(dev);
+                otg_reg_count++; 
+        }
+#endif
+
+#ifdef UDC_IPBUG_3950_WORKAROUND
+        /* set notify function */
+        dev->otg_driver->notify = otg_notify;
+#endif
+        /* if gadget driver already registered */
+        /* call gadget bind() to switch to mux udc to phy */
+        if (dev->driver) {
+
+               /* otg driver bind() */
+                retval = dev->otg_transceiver->set_peripheral(
+                                dev->otg_transceiver, &dev->gadget);
+               if (retval) {
+                       DBG( "error bind to uoc driver\n");
+#if !defined(UDC_HSB1)	
+                        dev->otg_driver = NULL;
+#endif			
+                        dev->otg_transceiver = NULL;
+                       return retval;
+               }
+                /* get ready for ep0 traffic */
+                setup_ep0(dev);
+
+		/* clear SD */
+		tmp = readl(&dev->regs->ctl);
+		tmp = tmp & AMD_CLEAR_BIT(UDC_DEVCTL_SD);
+		writel(tmp, &dev->regs->ctl);
+        }
+
+        INFO( "registered uoc driver\n");
+
+        return 0;
+}
+EXPORT_SYMBOL (usb_gadget_register_otg);
+
+/**
+ * Called by OTG driver to unregister itself
+ * 
+ *
+ * \return 0 if success
+ */
+int usb_gadget_unregister_otg (void)
+{
+        struct udc      *dev = udc;
+        unsigned long   flags;
+        u32 tmp;
+
+        if (!dev)
+                return -ENODEV;
+
+        spin_lock_irqsave (&dev->lock, flags);
+
+        /* mask not needed interrupts */
+        udc_mask_unused_interrupts(dev);
+
+        spin_unlock_irqrestore (&dev->lock, flags);
+
+        dev->otg_supported = 0;
+        if (dev->otg_transceiver) {
+                dev->otg_transceiver->set_peripheral(dev->otg_transceiver, NULL);
+                dev->otg_transceiver = NULL;
+        }
+#if !defined(UDC_HSB1)	
+        if (dev->otg_driver) {
+#ifdef UDC_IPBUG_3950_WORKAROUND
+                dev->otg_driver->notify = NULL;
+#endif
+		dev->otg_driver = NULL;
+        }
+#endif	
+
+        /* set SD */
+        tmp = readl(&dev->regs->ctl);
+        tmp |= AMD_BIT(UDC_DEVCTL_SD);
+        writel(tmp, &dev->regs->ctl);
+
+        DBG( "unregistered uoc driver\n");
+        return 0;
+}
+EXPORT_SYMBOL (usb_gadget_unregister_otg);
+
+/**
+ *  shutdown requests and disconnect from gadget 
+ */
+static void
+shutdown(struct udc *dev, struct usb_gadget_driver *driver)
+{
+        int tmp;
+
+        /* empty queues and init hardware */
+        udc_basic_init(dev);
+        for (tmp = 0; tmp < UDC_EP_NUM; tmp++) {
+                empty_req_queue (&dev->ep [tmp]);
+        }
+
+        if (dev->gadget.speed != USB_SPEED_UNKNOWN) {
+                spin_unlock (&dev->lock);
+                driver->disconnect (&dev->gadget);
+                spin_lock (&dev->lock);
+        }
+        /* init */
+        udc_setup_endpoints (dev);
+}
+
+/**
+ * Called by gadget driver to unregister itself
+ *
+ * \param driver        pointer to gadget driver struct
+ * \return 0 if success
+ */
+int usb_gadget_unregister_driver (struct usb_gadget_driver *driver)
+{
+        struct udc      *dev = udc;
+        unsigned long   iflags;
+        u32 tmp;
+
+        if (!dev)
+                return -ENODEV;
+        if (!driver || driver != dev->driver)
+                return -EINVAL;
+        if (gadget_bind_count) {
+                spin_lock_irqsave (&dev->lock, iflags);
+                shutdown(dev, driver);
+                spin_unlock_irqrestore (&dev->lock, iflags);
+        }
+
+        /* unbind from otg driver first */
+        if (dev->otg_transceiver) {
+                dev->otg_transceiver->set_peripheral(
+                        dev->otg_transceiver, NULL);
+        }
+
+        if (gadget_bind_count) {
+                driver->unbind (&dev->gadget);
+        }
+        gadget_bind_count = 0;
+        dev->driver = 0;
+
+        /* set SD */
+        tmp = readl(&dev->regs->ctl);
+        tmp |= AMD_BIT(UDC_DEVCTL_SD);
+        writel(tmp, &dev->regs->ctl);
+
+
+        DBG( "%s: unregistered\n", driver->driver.name);
+
+        return 0;
+}
+EXPORT_SYMBOL (usb_gadget_unregister_driver);
+
+
+#ifdef UDC_IPBUG_3958_WORKAROUND
+/**
+ * Clear pending NAK bits  
+ *
+ * \param dev           pointer to UDC device object    
+ * \return 0 if success
+ */
+static void udc_process_cnak_queue(struct udc* dev)
+{
+        u32 tmp;
+        u32 reg;
+        /* check epin's */
+        DBG("CNAK pending queue processing\n");
+        for (tmp = 0; tmp < UDC_EPIN_NUM_USED; tmp++) {
+                if (cnak_pending & (1 << tmp)) {
+                        DBG("CNAK pending for ep%d\n", tmp);
+                        /* clear NAK by writing CNAK */
+                        reg = readl(&dev->ep[tmp].regs->ctl);
+                        reg |= AMD_BIT(UDC_EPCTL_CNAK); 
+                        writel(reg, &dev->ep[tmp].regs->ctl);
+                        dev->ep[tmp].naking = 0;
+                        UDC_QUEUE_CNAK(&dev->ep[tmp], dev->ep[tmp].num);
+                } 
+        }
+        /* ...  and ep0out */
+        if (cnak_pending & (1 << UDC_EP0OUT_IX)) {
+                DBG("CNAK pending for ep%d\n", UDC_EP0OUT_IX);
+                /* clear NAK by writing CNAK */
+                reg = readl(&dev->ep[UDC_EP0OUT_IX].regs->ctl);
+                reg |= AMD_BIT(UDC_EPCTL_CNAK); 
+                writel(reg, &dev->ep[UDC_EP0OUT_IX].regs->ctl);
+                dev->ep[UDC_EP0OUT_IX].naking = 0;
+                UDC_QUEUE_CNAK(&dev->ep[UDC_EP0OUT_IX], 
+                                dev->ep[UDC_EP0OUT_IX].num);
+        }
+}
+#endif
+
+/**
+ * Enabling RX DMA after setup packet  
+ *
+ * \param dev           pointer to UDC device object    
+ */
+static inline void udc_ep0_set_rde(struct udc* dev)
+{
+        if (use_dma) {
+#ifndef UDC_USE_TIMER
+                udc_set_rde(dev);
+#else
+                /* only enable RXDMA when no data endpoint enabled	
+                   or data is queued */
+                if (!dev->data_ep_enabled || dev->data_ep_queued) {
+                        udc_set_rde(dev);
+                }
+                else {
+                        /* setup timer for enabling RDE (to not enable
+                           RXFIFO DMA for data endpoints to early) */
+                        if (set_rde != 0 && !timer_pending(&udc_timer)) {
+                                udc_timer.expires = jiffies + HZ/UDC_RDE_TIMER_DIV;
+                                set_rde = 1;
+                                if (!stop_timer) {
+                                        add_timer(&udc_timer);
+                                }
+                        }
+                }
+#endif
+        }
+}
+
+
+/**
+ * Interrupt handler for data OUT traffic  
+ *
+ * \param dev           pointer to UDC device object    
+ * \param ep_ix         endpoint index    
+ * \return 0 if success
+ */
+static inline int udc_data_out_isr(struct udc* dev, int ep_ix)
+{
+        int ret_val = 0;
+        u32 tmp;
+        struct udc_ep   *ep;
+        struct udc_request              *req;
+        unsigned int count;
+        struct udc_data_dma     *td = NULL;
+        unsigned dma_done;
+
+        VDBG("ep%d irq\n", ep_ix); 
+        ep = &dev->ep [ep_ix];
+
+        tmp = readl(&ep->regs->sts);
+        if (use_dma) {
+                /* BNA event ? */
+                if (tmp & AMD_BIT(UDC_EPSTS_BNA)) {
+                        ERR("BNA ep%dout occured - DESPTR = %lx \n", ep->num, (unsigned long) readl(&ep->regs->desptr));
+                        
+                        /* clear BNA */
+                        writel(tmp | AMD_BIT(UDC_EPSTS_BNA), &ep->regs->sts); 
+                        return 1;                       
+                } 
+        }
+        /* HE event ? */
+        if (tmp & AMD_BIT(UDC_EPSTS_HE)) {
+                ERR("HE ep%dout occured\n", ep->num);
+                
+                /* clear HE */
+                writel(tmp | AMD_BIT(UDC_EPSTS_HE), &ep->regs->sts); 
+                return 1;                       
+        } 
+
+        if (!list_empty (&ep->queue)) {
+
+                /* next request */ 
+                req = list_entry (ep->queue.next,
+                        struct udc_request, queue);
+        }
+        else
+        {
+                req = 0;
+#ifdef UDC_DEBUG
+                no_req++;
+#endif
+                udc_rxfifo_pending = 1;
+        }
+        VDBG("req = %lx\n", (unsigned long) req);
+        /* fifo mode ****************/
+        if (!use_dma) {
+
+                /* read fifo */
+                if (req && udc_rxfifo_read(ep, req)) {
+                        /* finish */
+                        complete_req (ep, req, 0);
+                        /* next request */
+                        if (!list_empty (&ep->queue) && !ep->halted) {
+                                req = list_entry (ep->queue.next,
+                                        struct udc_request, queue);
+                        } 
+                        else
+                                req = 0;
+                }
+
+        } /* DMA ********************/
+        else if (req) {
+
+                /* check for DMA done */
+                if (!use_dma_ppb) {
+                        dma_done = AMD_GETBITS(req->td_data->status, UDC_DMA_OUT_STS_BS); 
+                } /* packet per buffer mode - rx bytes */
+                else {
+                        td = udc_get_last_dma_desc(req);
+                        dma_done = AMD_GETBITS(td->status, UDC_DMA_OUT_STS_BS); 
+                }
+                if (dma_done == UDC_DMA_OUT_STS_BS_DMA_DONE) {
+                        /* buffer fill mode - rx bytes */
+                        if (!use_dma_ppb) {
+                                /* received number bytes */
+                                count = AMD_GETBITS(req->td_data->status, UDC_DMA_OUT_STS_RXBYTES); 
+                                VDBG("rx bytes=%lx\n", (unsigned long) count);
+                        } /* packet per buffer mode - rx bytes */
+                        else {
+                                VDBG("req->td_data=%lx\n", (unsigned long) req->td_data);
+                                VDBG("last desc = %lx\n", (unsigned long) td);
+                                /* received number bytes */
+                                if (use_dma_ppb_du) {
+                                        /* every desc. counts bytes */
+                                        count = udc_get_ppbdu_rxbytes(req);
+                                }
+                                else {
+                                        /* last desc. counts bytes */
+                                        count = AMD_GETBITS(td->status, UDC_DMA_OUT_STS_RXBYTES);
+                                        if (!count) {
+                                                /* on 64k packets the RXBYTES field is zero */
+                                                if (req->req.length == UDC_DMA_MAXPACKET)
+                                                        count = UDC_DMA_MAXPACKET; 
+                                        }
+                                }
+                                VDBG("last desc rx bytes=%lx\n", (unsigned long) count);
+                        }
+
+                        tmp = req->req.length - req->req.actual;
+                        if (count > tmp) {
+                                if ((tmp % ep->ep.maxpacket) != 0) {
+                                        ERR( "%s: received %d bytes, rx-buffer space =  %d bytes => buffer overrun\n",
+                                                ep->ep.name, count, tmp);
+                                        req->req.status = -EOVERFLOW;
+                                }
+                                count = tmp;
+                        }
+                        req->req.actual += count;
+
+                        /* complete request */ 
+                        complete_req(ep, req, 0);
+                        
+                        /* next request */
+                        if (!list_empty (&ep->queue) && !ep->halted) {
+                                req = list_entry(ep->queue.next,
+                                                 struct udc_request,
+                                                 queue);
+
+                                /* next dma */
+                                ret_val = prep_dma(ep, req);
+                                if (ret_val != 0)
+                                        goto finished;
+                                /* write desc pointer */
+                                writel(req->td_phys, &ep->regs->desptr);
+
+                                /* enable DMA */
+                                udc_set_rde(dev);
+                        }       
+                        else {
+#ifdef UDC_DEBUG
+                                no_pref_req++;
+                                VDBG("OUT queue empty\n");
+#endif
+                                /* schedule timer for setting RDE if queue remains empty
+                                 * to allow ep0 packets pass through */
+#ifdef UDC_USE_TIMER
+                                if (set_rde != 0 && !timer_pending(&udc_timer)) {
+                                        udc_timer.expires = jiffies + HZ*UDC_RDE_TIMER_SECONDS;
+                                        set_rde = 1;
+                                        if (!stop_timer) {
+                                                add_timer(&udc_timer);
+                                        }
+                                }
+#endif
+                                if (ep->num != UDC_EP0OUT_IX) 
+                                        dev->data_ep_queued = 0;
+                        }
+
+               } 
+               else {
+                        /* RX DMA must be reenabled for each desc in PPBDU mode */
+                        if (use_dma_ppb_du) {
+                                udc_set_rde(dev);
+                        }
+               } 
+                
+        }
+
+#ifdef UDC_IPBUG_3958_WORKAROUND
+        /* check pending CNAKS */
+        if (cnak_pending) {
+                /* CNAk processing when rxfifo empty only */
+                if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) {
+                        udc_process_cnak_queue(dev);
+                }
+        }
+#endif       
+
+        /* clear OUT bits in ep status */
+        writel(UDC_EPSTS_OUT_DATA_CLEAR, &ep->regs->sts);
+finished:
+        return ret_val;
+}
+
+/**
+ * Interrupt handler for data IN traffic  
+ *
+ * \param dev           pointer to UDC device object    
+ * \param ep_ix         endpoint index    
+ * \return 0 if success
+ */
+static inline int udc_data_in_isr(struct udc* dev, int ep_ix)
+{
+        int ret_val = 0;
+        u32 tmp;
+        u32 epsts;
+        struct udc_ep  *ep;
+        struct udc_request *req;
+        struct udc_data_dma *td;
+        unsigned dma_done;
+        unsigned len;
+
+        ep = &dev->ep[ep_ix];
+        
+        epsts = readl(&ep->regs->sts);
+        if (use_dma) {
+                /* BNA ? */
+                if (epsts & AMD_BIT(UDC_EPSTS_BNA)) {
+                        ERR("BNA ep%din occured - DESPTR = %08lx \n",
+                            ep->num, (unsigned long) readl(&ep->regs->desptr));
+                        
+                        /* clear BNA */
+                        writel(epsts, &ep->regs->sts); 
+
+                        return 1;                       
+                } 
+        }
+        /* HE event ? */
+        if (epsts & AMD_BIT(UDC_EPSTS_HE)) {
+                ERR("HE ep%dn occured -  DESPTR = %08lx \n",
+                     ep->num, (unsigned long) readl(&ep->regs->desptr));
+                
+                /* clear HE */
+                writel(epsts | AMD_BIT(UDC_EPSTS_HE), &ep->regs->sts); 
+                return 1;                       
+        } 
+
+        /* DMA completion */
+        if (epsts & AMD_BIT(UDC_EPSTS_TDC)) {
+                VDBG("TDC set- completion\n");
+                if (!list_empty (&ep->queue)) {
+                       req = list_entry (ep->queue.next,
+                                        struct udc_request, queue);
+                       if (req) { 
+                                /* lengh bytes transfered */
+                                /* check dma done of last desc. in PPBDU mode */
+                                if (use_dma_ppb_du) {
+                                        td = udc_get_last_dma_desc(req);
+                                        if (td) {
+                                                dma_done = 
+                                                   AMD_GETBITS(td->status, UDC_DMA_IN_STS_BS); 
+                                                /* don't care DMA done */
+                                                /* if (dma_done == UDC_DMA_IN_STS_BS_DMA_DONE) */
+                                                        req->req.actual = req->req.length;
+                                        }
+                                }
+                                else {
+                                        /* assume all bytes transferred */
+                                        /* TODO check error status */
+                                        req->req.actual = req->req.length;
+                                }
+
+                                if (req->req.actual == req->req.length) { 
+#ifdef UDC_IPBUG_2253_WORKAROUND
+                                        /* stop NAKing after small packet DMA */
+                                        if (ep->naking) {
+                                                /* clear NAK by writing CNAK */
+                                                tmp = readl(&ep->regs->ctl);
+                                                tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                                                writel(tmp, &ep->regs->ctl);
+                                                ep->naking = 0;
+                                                UDC_QUEUE_CNAK(ep, ep->num);
+                                        }
+#endif
+                                        /* complete req */
+                                        complete_req(ep, req, 0);
+                                        req->dma_going = 0;
+#ifdef UDC_DISABLE_IRQ_IF_EMPTY_IN_QUEUE
+                                        /* further request available ? */
+                                        if (list_empty (&ep->queue)) {
+                                                /* disable interrupt */
+                                                tmp = readl(&dev->regs->ep_irqmsk);
+                                                tmp |= AMD_BIT(ep->num);
+                                                writel(tmp, &dev->regs->ep_irqmsk);        
+                                        } 
+#endif
+
+                                }
+                       }
+               }
+                 
+        } /* status reg has IN bit set and TDC not set (if TDC was handled,
+             IN must not be handled (UDC defect) ? */
+        if ((epsts & AMD_BIT(UDC_EPSTS_IN)) && !(epsts & AMD_BIT(UDC_EPSTS_TDC))) {
+                if (!list_empty (&ep->queue))
+                {
+                        /* next request */
+                        req = list_entry (ep->queue.next,
+                                        struct udc_request, queue);
+                        /* FIFO mode ********/ 
+                        if (!use_dma) {
+                                /* write fifo */
+                                udc_txfifo_write(ep, &(req->req));
+                                len = req->req.length - req->req.actual;
+				if (len > ep->ep.maxpacket)
+					len = ep->ep.maxpacket;
+				req->req.actual += len;
+                                if (req->req.actual == req->req.length 
+                                    || (len != ep->ep.maxpacket)) {
+                                    /* && (!req->req.zero || len != ep->ep.maxpacket)) { */
+                                        /* complete req */
+                                        complete_req (ep, req, 0);
+                                }
+                        } /* DMA *****************/
+                        else if (req && !req->dma_going) { 
+                                VDBG("IN DMA : req=%lx req->td_data=%lx\n",
+                                     (unsigned long) req, (unsigned long) req->td_data);
+                                if (req->td_data) {
+
+                                        req->dma_going = 1;
+
+                                        /* unset L bit of first desc. for chain */
+                                        if (use_dma_ppb && req->req.length > ep->ep.maxpacket) {
+                                                req->td_data->status &= AMD_CLEAR_BIT(UDC_DMA_IN_STS_L);
+                                        }
+
+                                        /* write desc pointer */
+                                        writel(req->td_phys, &ep->regs->desptr);
+
+                                        wb_flush();                                        
+                                        /* set HOST READY */
+                                        req->td_data->status 
+                                              = AMD_ADDBITS(req->td_data->status,
+                                                            UDC_DMA_IN_STS_BS_HOST_READY,
+                                                            UDC_DMA_IN_STS_BS);
+
+                                        wb_flush();
+
+#ifdef UDC_IPBUG_2253_WORKAROUND
+                                        /* NAK if small packet until TDC interrupt */
+                                        if (req->req.length < UDC_SMALL_PACKET) {
+                                                /* set NAK */
+                                                tmp = readl(&ep->regs->ctl);
+                                                tmp |= AMD_BIT(UDC_EPCTL_SNAK); 
+                                                writel(tmp, &ep->regs->ctl);
+                                                ep->naking = 1;
+                                                wb_flush();
+                                        }
+#endif
+                                        /* set poll demand bit */
+                                        tmp = readl(&ep->regs->ctl);
+                                        tmp |= AMD_BIT(UDC_EPCTL_P);
+                                        writel(tmp, &ep->regs->ctl);
+                                }
+                        }
+
+                } 
+        }
+        /* clear status bits */
+        writel(epsts, &ep->regs->sts);
+       
+        return ret_val;
+ 
+}
+
+/**
+ * Interrupt handler for Control OUT traffic  
+ *
+ * \param dev           pointer to UDC device object    
+ * \return 0 if success
+ */
+static inline int udc_control_out_isr(struct udc* dev)
+{
+        int ret_val = 0;
+        u32 tmp;
+        int setup_supported;
+        u32 count;
+        int set = 0;       
+        struct udc_ep   *ep;
+        struct udc_ep   *ep_tmp;
+
+        ep = &dev->ep[UDC_EP0OUT_IX];
+ 
+        /* clear irq */
+        writel(AMD_BIT(UDC_EPINT_OUT_EP0), &dev->regs->ep_irqsts);
+
+        tmp = readl(&dev->ep[UDC_EP0OUT_IX].regs->sts);
+        /* check BNA and clear if set */
+        if (tmp & AMD_BIT(UDC_EPSTS_BNA)) {
+                VDBG("BNA set\n");       
+                writel(AMD_BIT(UDC_EPSTS_BNA), &dev->ep[UDC_EP0OUT_IX].regs->sts);
+        }
+        
+        /* type of data: SETUP or DATA 0 bytes */
+        tmp = AMD_GETBITS(tmp, UDC_EPSTS_OUT);
+        VDBG( "data_typ = %lx\n", (unsigned long) tmp);
+        /* setup data */
+        if (tmp == UDC_EPSTS_OUT_SETUP) {
+
+                ep->dev->stall_ep0in = 0;
+                dev->waiting_zlp_ack_ep0in = 0;
+
+                /* set NAK for EP0_IN */
+                tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->ctl);
+                tmp |= AMD_BIT(UDC_EPCTL_SNAK); 
+                writel(tmp, &dev->ep[UDC_EP0IN_IX].regs->ctl);
+                dev->ep[UDC_EP0IN_IX].naking = 1;
+                /* get setup data */
+                if (use_dma) {
+
+                        /* clear OUT bits in ep status */
+                        writel(UDC_EPSTS_OUT_SETUP_CLEAR, &dev->ep[UDC_EP0OUT_IX].regs->sts);
+
+                        setup_data.data[0] = dev->ep[UDC_EP0OUT_IX].td_stp->data12;
+                        setup_data.data[1] = dev->ep[UDC_EP0OUT_IX].td_stp->data34;
+                        /* set HOST READY */
+                        writel(UDC_DMA_STP_STS_BS_HOST_READY,
+                               &dev->ep[UDC_EP0OUT_IX].td_stp->status);
+                }
+                else {
+                        /* read fifo */
+                        udc_rxfifo_read_dwords(dev, setup_data.data, 2);
+                }
+
+                /* determine direction of control data */
+                if ((setup_data.request.bRequestType & USB_DIR_IN) != 0) {
+	                dev->gadget.ep0 = &dev->ep [UDC_EP0IN_IX].ep;
+                        /* enable RDE */
+                        udc_ep0_set_rde(dev);
+                        set = 0;
+                }
+                else {
+	                dev->gadget.ep0 = &dev->ep [UDC_EP0OUT_IX].ep;
+#ifdef UDC_USE_TIMER
+                        set = 1;
+                        dev->ep[UDC_EP0OUT_IX].naking = 1;
+                        /* setup timer for enabling RDE (to not enable
+                           RXFIFO DMA for data to early) */
+                        set_rde = 1;
+                        if (!timer_pending(&udc_timer)) {
+                                udc_timer.expires = jiffies + HZ/UDC_RDE_TIMER_DIV;
+                                if (!stop_timer) {
+                                        add_timer(&udc_timer);
+                                }
+                        }
+#endif
+                }
+                /* mass storage reset must be processed here because
+                   next packet may be a CLEAR_FEATURE HALT which would not
+                   clear the stall bit when no STALL handshale was received before
+                   (autostall can cause this) */
+                if (setup_data.data[0] == UDC_MSCRES_DWORD0 &&
+                    setup_data.data[1] == UDC_MSCRES_DWORD1) {
+                        DBG("MSC Reset\n");
+                        /* clear stall bits */
+                        /* only one IN and OUT endpoints are handled */
+                        ep_tmp = &udc->ep [UDC_EPIN_IX];
+                        udc_set_halt (&ep_tmp->ep, 0);
+                        ep_tmp = &udc->ep [UDC_EPOUT_IX];
+                        udc_set_halt (&ep_tmp->ep, 0);
+                }
+
+                /* call gadget with setup data received */
+                spin_unlock (&dev->lock);
+                setup_supported = dev->driver->setup (&dev->gadget,
+                                                      &setup_data.request);
+                spin_lock (&dev->lock);
+
+                tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->ctl);
+                /* ep0 in returns data (not zlp) on IN phase */
+                if (setup_supported >= 0 && setup_supported < UDC_EP0IN_MAXPACKET) {
+                        /* clear NAK by writing CNAK in EP0_IN */
+                        tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                        writel(tmp, &dev->ep[UDC_EP0IN_IX].regs->ctl);
+                        dev->ep[UDC_EP0IN_IX].naking = 0;
+                        UDC_QUEUE_CNAK(&dev->ep[UDC_EP0IN_IX], UDC_EP0IN_IX);
+                }
+                else if (setup_supported < 0) {
+                /* if unsupported request then stall */
+                        tmp |= AMD_BIT(UDC_EPCTL_S);
+                        writel(tmp, &dev->ep[UDC_EP0IN_IX].regs->ctl);
+                }
+                else
+                        dev->waiting_zlp_ack_ep0in = 1;
+
+
+                /* clear NAK by writing CNAK in EP0_OUT */
+                if (!set) {
+                        tmp = readl(&dev->ep[UDC_EP0OUT_IX].regs->ctl);
+                        tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                        writel(tmp, &dev->ep[UDC_EP0OUT_IX].regs->ctl);
+                        dev->ep[UDC_EP0OUT_IX].naking = 0;
+                        UDC_QUEUE_CNAK(&dev->ep[UDC_EP0OUT_IX], UDC_EP0OUT_IX);
+                }
+               
+                if (!use_dma) { 
+                        /* clear OUT bits in ep status */
+                        writel(UDC_EPSTS_OUT_SETUP_CLEAR, &dev->ep[UDC_EP0OUT_IX].regs->sts);
+                }
+
+        } /* data packet 0 bytes */
+        else if (tmp == UDC_EPSTS_OUT_DATA) {
+                /* clear OUT bits in ep status */
+                writel(UDC_EPSTS_OUT_DATA_CLEAR, &dev->ep[UDC_EP0OUT_IX].regs->sts);
+                
+                /* get setup data: only 0 packet */
+                if (use_dma) {
+                        /* no req if 0 packet, just reactivate */
+                        if (list_empty (&dev->ep[UDC_EP0OUT_IX].queue)) {
+                                VDBG("ZLP\n");
+
+                                /* set HOST READY */
+                                dev->ep[UDC_EP0OUT_IX].td->status =
+                                        AMD_ADDBITS(dev->ep[UDC_EP0OUT_IX].td->status,
+                                                    UDC_DMA_OUT_STS_BS_HOST_READY,
+                                                    UDC_DMA_OUT_STS_BS);
+                                /* enable RDE */
+                                udc_ep0_set_rde(dev);
+                        }
+                        else {
+                                /* control write */
+                                udc_data_out_isr(dev, UDC_EP0OUT_IX);
+                                /* re-program desc. pointer for possible ZLPs */
+                                writel(dev->ep [UDC_EP0OUT_IX].td_phys,
+                                        &dev->ep[UDC_EP0OUT_IX].regs->desptr);
+                                /* enable RDE */
+                                udc_ep0_set_rde(dev);
+                        }
+                }
+                else {
+
+                        /* received number bytes */
+                        count = readl(&dev->ep[UDC_EP0OUT_IX].regs->sts);
+                        count = AMD_GETBITS(count, UDC_EPSTS_RX_PKT_SIZE);
+                        /* out data for fifo mode not working */
+                        count = 0;
+
+                        /* 0 packet or real data ? */
+                        if (count != 0) {
+                                udc_data_out_isr(dev, UDC_EP0OUT_IX);
+                        }
+                        else {
+                                /* dummy read confirm */
+                                readl(&dev->ep[UDC_EP0OUT_IX].regs->confirm);
+                        }
+                }
+        }
+
+#ifdef UDC_IPBUG_3958_WORKAROUND
+        /* check pending CNAKS */
+        if (cnak_pending) {
+                /* CNAk processing when rxfifo empty only */
+                if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) {
+                        udc_process_cnak_queue(dev);
+                }
+        }
+#endif       
+ 
+        return ret_val;                       
+}
+
+/**
+ * Interrupt handler for Control IN traffic  
+ *
+ * \param dev           pointer to UDC device object    
+ * \return 0 if success
+ */
+static inline int udc_control_in_isr(struct udc* dev)
+{
+        int ret_val = 0;
+        u32 tmp;
+        struct udc_ep *ep;
+        struct udc_request *req;
+        unsigned len;
+
+        ep = &dev->ep [UDC_EP0IN_IX];
+
+        /* clear irq */
+        writel(AMD_BIT(UDC_EPINT_IN_EP0), &dev->regs->ep_irqsts);
+        
+        tmp= readl(&dev->ep[UDC_EP0IN_IX].regs->sts);
+        /* DMA completion */
+        if (tmp & AMD_BIT(UDC_EPSTS_TDC)) {
+                VDBG("isr: TDC clear \n");
+#ifdef UDC_IPBUG_2253_WORKAROUND
+                /* stop NAKing after small packet DMA */
+                if (ep->naking) {
+                        /* clear NAK by writing CNAK */
+                        tmp = readl(&ep->regs->ctl);
+                        tmp |= AMD_BIT(UDC_EPCTL_CNAK); 
+                        writel(tmp, &ep->regs->ctl);
+                        ep->naking = 0;
+                        UDC_QUEUE_CNAK(ep, ep->num);
+                }
+#endif
+                /* clear TDC bit */
+                writel(AMD_BIT(UDC_EPSTS_TDC),&dev->ep[UDC_EP0IN_IX].regs->sts);
+        } /* status reg has IN bit set ? */
+        else if (tmp & AMD_BIT(UDC_EPSTS_IN)) {
+                if (ep->dma) {
+                        /* clear IN bit */
+                        writel(AMD_BIT(UDC_EPSTS_IN),&dev->ep[UDC_EP0IN_IX].regs->sts);
+                }
+                if (dev->stall_ep0in) {
+                        DBG("stall ep0in\n");
+                        /* halt ep0in */ 
+                        tmp = readl(&ep->regs->ctl);
+                        tmp |= AMD_BIT(UDC_EPCTL_S);
+                        writel(tmp, &ep->regs->ctl);
+                }
+                else {
+                        if (!list_empty (&ep->queue))
+                        {
+                                /* next request */
+                                req = list_entry (ep->queue.next,
+                                                struct udc_request, queue);
+
+                                if (ep->dma) {
+                                        /* write desc pointer */
+                                        writel(req->td_phys, &ep->regs->desptr);
+                                        /* set HOST READY */
+                                        req->td_data->status 
+                                                = AMD_ADDBITS(req->td_data->status,
+                                                                UDC_DMA_STP_STS_BS_HOST_READY,
+                                                                UDC_DMA_STP_STS_BS);
+                                        wb_flush();
+
+#ifdef UDC_IPBUG_2253_WORKAROUND
+                                        /* NAK if small packet until TDC interrupt */
+                                        if (req->req.length < UDC_SMALL_PACKET) {
+                                                /* set NAK */
+                                                tmp = readl(&ep->regs->ctl);
+                                                tmp |= AMD_BIT(UDC_EPCTL_SNAK); 
+                                                writel(tmp, &ep->regs->ctl);
+                                                ep->naking = 1;
+                                                wb_flush();
+                                        }
+#endif
+                                        /* set poll demand bit */
+                                        tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->ctl);
+                                        tmp |= AMD_BIT(UDC_EPCTL_P);
+                                        writel(tmp, &dev->ep[UDC_EP0IN_IX].regs->ctl);
+
+                                        /* all bytes will be transferred */
+                                        req->req.actual = req->req.length;
+
+                                        /* complete req */
+                                        complete_req(ep, req, 0);
+
+                                }
+                                else {
+                                        /* write fifo */
+                                        udc_txfifo_write(ep, &(req->req));
+
+                                        /* lengh bytes transfered */
+                                        len = req->req.length - req->req.actual;
+                                        if (len > ep->ep.maxpacket)
+                                                len = ep->ep.maxpacket;
+
+                                        req->req.actual += len;
+                                        if (req->req.actual == req->req.length
+                                                        || (len != ep->ep.maxpacket)) {
+                                                /* && (!req->req.zero || len != ep->ep.maxpacket)) { */
+                                                /* complete req */
+                                                complete_req(ep, req, 0);
+                                        }
+                                        }
+
+                                }
+                } 
+                ep->halted = 0;
+                dev->stall_ep0in = 0;
+                if (!ep->dma) {
+                        /* clear IN bit */
+                        writel(AMD_BIT(UDC_EPSTS_IN),&dev->ep[UDC_EP0IN_IX].regs->sts);
+                }
+        }
+
+        return ret_val;
+}
+
+
+/**
+ * Interrupt handler for global device events  
+ *
+ * \param dev           pointer to UDC device object    
+ * \param dev_irq       device interrupt bit of DEVINT register    
+ * \return 0 if success
+ */
+static inline int udc_dev_isr(struct udc* dev, u32 dev_irq)
+{
+        int ret_val = 0;
+        u32 tmp;
+        u32 cfg;
+        struct udc_ep *ep;
+        u16 i;
+        u8 udc_csr_epix;
+
+        /* SET_CONFIG irq ? */
+        if (dev_irq & AMD_BIT(UDC_DEVINT_SC)) {
+
+                /* read config value */
+                tmp = readl(&dev->regs->sts);
+                cfg = AMD_GETBITS(tmp, UDC_DEVSTS_CFG);
+#ifdef UDC_DEBUG
+                /* this is needed for debug only */
+                if (cfg == dev->cur_config) {
+                        same_cfg = 1;
+                }
+                else {
+                        same_cfg = 0;
+                }
+                VDBG("same_cfg=%d\n", same_cfg);
+#endif
+                DBG("SET_CONFIG interrupt: config=%d\n", cfg);
+                dev->cur_config = cfg;
+                dev->set_cfg_not_acked = 1;
+
+                /* make usb request for gadget driver */
+                memset(&setup_data, 0 , sizeof(union udc_setup_data));
+                setup_data.request.bRequest = USB_REQ_SET_CONFIGURATION;
+                setup_data.request.wValue = dev->cur_config;
+
+                /* programm the NE registers */
+                /* TODO - put this to extra function or use udc_setup_endpoints() or udc_enable() */
+                for (i = 0; i < UDC_EP_NUM; i++) {
+                        ep = &dev->ep[i];
+                        if (ep->in) {
+                                
+                                /* ep ix in UDC CSR register space */
+                                udc_csr_epix = ep->num;
+
+                                
+                        } /* OUT ep */
+                        else {
+                                /* ep ix in UDC CSR register space */
+                                udc_csr_epix = ep->num - UDC_CSR_EP_OUT_IX_OFS;
+                        }
+
+                        tmp = readl(&dev->csr->ne[udc_csr_epix]);
+                        /* ep cfg */
+                        tmp = AMD_ADDBITS(tmp, ep->dev->cur_config, UDC_CSR_NE_CFG);
+                        /* write reg */
+                        writel(tmp, &dev->csr->ne[udc_csr_epix]);
+
+                        /* clear stall bits */
+                        ep->halted = 0;
+                        tmp = readl(&ep->regs->ctl);
+                        tmp = tmp & AMD_CLEAR_BIT(UDC_EPCTL_S);
+                        writel(tmp, &ep->regs->ctl);
+                }
+                /* call gadget zero with setup data received */
+                spin_unlock (&dev->lock);
+                tmp = dev->driver->setup (&dev->gadget, &setup_data.request);
+                spin_lock (&dev->lock);
+
+        } /* SET_INTERFACE ? */
+        if (dev_irq & AMD_BIT(UDC_DEVINT_SI)) {
+                dev->set_cfg_not_acked = 1;
+                /* read interface and alt setting values */
+                tmp = readl(&dev->regs->sts);
+                dev->cur_alt = AMD_GETBITS(tmp, UDC_DEVSTS_ALT);
+                dev->cur_intf = AMD_GETBITS(tmp, UDC_DEVSTS_INTF);
+                                      
+                /* make usb request for gadget driver */
+                memset(&setup_data, 0 , sizeof(union udc_setup_data));
+                setup_data.request.bRequest = USB_REQ_SET_INTERFACE;
+                setup_data.request.bRequestType = USB_RECIP_INTERFACE;
+                setup_data.request.wValue = dev->cur_alt;
+                setup_data.request.wIndex = dev->cur_intf;
+                
+                DBG("SET_INTERFACE interrupt: alt=%d intf=%d\n", dev->cur_alt, dev->cur_intf);
+
+                /* programm the NE registers */
+                /* TODO - put this to extra function or use udc_setup_endpoints() or udc_enable() */
+                for (i = 0; i < UDC_EP_NUM; i++) {
+                        ep = &dev->ep[i];
+                        if (ep->in) {
+                                
+                                /* ep ix in UDC CSR register space */
+                                udc_csr_epix = ep->num;
+
+                                
+                        } /* OUT ep */
+                        else {
+                                /* ep ix in UDC CSR register space */
+                                udc_csr_epix = ep->num - UDC_CSR_EP_OUT_IX_OFS;
+                        }
+
+                        /***** UDC CSR reg ****************************/
+                        /* set ep values  */
+                        tmp = readl(&dev->csr->ne[udc_csr_epix]);
+                        /* ep interface */
+                        tmp = AMD_ADDBITS(tmp, ep->dev->cur_intf, UDC_CSR_NE_INTF);
+                        /* tmp = AMD_ADDBITS(tmp, 2, UDC_CSR_NE_INTF); */
+                        /* ep alt */
+                        tmp = AMD_ADDBITS(tmp, ep->dev->cur_alt, UDC_CSR_NE_ALT);
+                        /* tmp = AMD_ADDBITS(tmp, 1, UDC_CSR_NE_ALT); */
+                        /* write reg */
+                        writel(tmp, &dev->csr->ne[udc_csr_epix]);
+
+                        /* clear stall bits */
+                        ep->halted = 0;
+                        tmp = readl(&ep->regs->ctl);
+                        tmp = tmp & AMD_CLEAR_BIT(UDC_EPCTL_S);
+                        writel(tmp, &ep->regs->ctl);
+                }
+
+                /* call gadget zero with setup data received */
+                spin_unlock (&dev->lock);
+                tmp = dev->driver->setup (&dev->gadget, &setup_data.request);
+                spin_lock (&dev->lock);
+
+        } /* USB reset */
+        if (dev_irq & AMD_BIT(UDC_DEVINT_UR)) {
+                DBG("USB Reset interrupt\n");
+
+                /* allow soft reset when suspend occurs */
+                soft_reset_occured = 0;
+
+                dev->waiting_zlp_ack_ep0in = 0;
+                dev->set_cfg_not_acked = 0;
+
+                /* mask not needed interrupts */
+                udc_mask_unused_interrupts(dev);
+
+                /* call gadget to reset configs etc. */
+                spin_unlock(&dev->lock);
+                dev->driver->disconnect(&dev->gadget);
+                spin_lock(&dev->lock);
+
+                /* disable ep0 to empty req queue */
+                empty_req_queue (&dev->ep [UDC_EP0IN_IX]);
+                ep_init(dev->regs,
+                          &dev->ep [UDC_EP0IN_IX]);
+
+#ifdef UDC_IPBUG_3958_WORKAROUND_SOFT_RESET_ON_USBRESET
+                /* soft reset when rxfifo not empty */
+                tmp = readl(&dev->regs->sts);
+                if (!(tmp & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) && 
+                    !soft_reset_after_usbreset_occured) {
+                        udc_soft_reset(dev);
+                        soft_reset_after_usbreset_occured++;
+                } 
+#endif
+
+                /* DMA reset to kill potential old DMA hw hang, */
+                /* POLL bit is already reset by ep_init() through */
+                /* disconnect() */
+                UDC_DMARST(tmp,dev);
+                
+                /* put into initial config */
+                udc_basic_init (dev);
+
+                /* enable device setup interrupts */
+                udc_enable_dev_setup_interrupts(dev);
+
+        } /* USB suspend */
+#ifndef UDC_IPBUG_3943_WORKAROUND
+        if (dev_irq & AMD_BIT(UDC_DEVINT_US)) {
+                DBG("USB Suspend interrupt\n");
+
+        } /* new speed ? */
+#endif
+        if (dev_irq & AMD_BIT(UDC_DEVINT_ENUM)) {
+                DBG("ENUM interrupt\n");
+#ifdef UDC_DEBUG
+                num_enums++;
+                DBG("%d enumerations !\n", num_enums);
+#endif
+                soft_reset_after_usbreset_occured = 0;
+
+                /* disable ep0 to empty req queue */
+                empty_req_queue (&dev->ep [UDC_EP0IN_IX]);
+                ep_init (dev->regs,
+                          &dev->ep [UDC_EP0IN_IX]);
+
+                /* link up all endpoints */
+                udc_setup_endpoints (dev);
+                if (dev->gadget.speed == USB_SPEED_HIGH) {
+                        INFO("Connect: Speed = HIGH_SPEED\n");
+                }
+                else if (dev->gadget.speed == USB_SPEED_FULL) {
+                        INFO("Connect: Speed = FULL_SPEED\n");
+                }
+
+                /* init ep 0 */
+                activate_control_endpoints(dev);
+
+                /* enable ep0 interrupts */
+                udc_enable_ep0_interrupts(dev);
+        }
+#ifndef UDC_IPBUG_3950_WORKAROUND 
+        /* session valid change interrupt */
+        if (dev_irq & AMD_BIT(UDC_DEVINT_SVC)) {
+                DBG("USB SVC interrupt\n");
+
+                /* check that session is not valid to detect disconnect */
+                tmp = readl(&dev->regs->sts);
+                if (!(tmp & AMD_BIT(UDC_DEVSTS_SESSVLD))) {
+                        DBG("USB Disconnect (session valid low)\n");
+                        /* cleanup on disconnect */
+                        usb_disconnect(udc);
+                }
+
+        }
+#endif
+
+        return ret_val;
+}
+
+/**
+ * Interrupt Service Routine, see Linux Kernel Doc for parameters  
+ *
+ * \param irq           irq number
+ * \param pdev          pointer to device object
+ * \param ptregs        don't used
+ */
+static irqreturn_t udc_irq (int irq, void *pdev, struct pt_regs * ptregs)
+{
+        struct udc *dev = pdev;
+        u32 reg;
+        u16 i;
+        u32 ep_irq;
+
+
+#ifdef UDC_IPBUG_3943_WORKAROUND
+        /* If UDC is suspended, then don't touch any register, otherwise
+           system hangs in endless retry => possibly hang !!! */
+        if (dev->otg_driver && dev->otg_driver->query) {
+                if (dev->otg_driver->query(0) & OTG_FLAGS_UDC_SUSP) {
+                        return IRQ_HANDLED;
+                }     
+        }
+        else
+                return IRQ_HANDLED;
+#endif 
+       
+        if (dev->sys_suspended)
+                return IRQ_HANDLED;
+
+        spin_lock (&dev->lock);
+
+
+        /* check for ep irq */
+        reg = readl(&dev->regs->ep_irqsts);
+        if (reg)
+        {
+                /* EP0 OUT */
+                if (reg & AMD_BIT(UDC_EPINT_OUT_EP0))
+                {
+                        udc_control_out_isr(dev);
+                } /* EP0 IN */
+                if (reg & AMD_BIT(UDC_EPINT_IN_EP0)) {
+                        udc_control_in_isr(dev);
+                        
+                } 
+
+                /* data endpoint */
+                /* iterate ep's */
+                for (i = 1; i < UDC_EP_NUM; i++) {
+                        ep_irq = 1 << i;
+                        /* irq for out ep ? */
+                        if ((reg & ep_irq) && i > UDC_EPIN_NUM) {      
+                                /* clear irq */
+                                writel(ep_irq, &dev->regs->ep_irqsts);
+                                udc_data_out_isr(dev,i);
+                        } /* irq for in ep ? */
+                        if ((reg & ep_irq) && i < UDC_EPIN_NUM && i > 0) {      
+                                /* clear irq */
+                                writel(ep_irq, &dev->regs->ep_irqsts);
+                                udc_data_in_isr(dev,i);
+                        }
+                        
+                }
+                                          
+        }
+
+
+        /* check for dev irq */
+        reg = readl(&dev->regs->irqsts);
+        if (reg) {
+                /* clear irq */
+                writel(reg, &dev->regs->irqsts);
+                udc_dev_isr(dev, reg);
+        }
+  
+
+        spin_unlock (&dev->lock);
+        return IRQ_HANDLED;
+}
+
+/**
+ * Tears down device 
+ *
+ * \param pdev        pointer to device struct
+ */
+static void gadget_release (struct device *pdev)
+{
+        struct au1200udc *dev = dev_get_drvdata(pdev);
+        kfree (dev);
+}
+
+/**
+ * Cleanup on device remove
+ *
+ * \param dev        pointer to udc struct
+ */
+static void udc_remove(struct udc* dev)
+{
+#ifdef CONFIG_SOC_AU1200 
+        {
+                u32 tmp;
+                /* disable UDC memory, DMA and clock */
+                tmp = readl((u32*) (USB_MSR_BASE + USB_MSR_MCFG));
+                tmp &= AMD_CLEAR_BIT(USBMSRMCFG_DMEMEN)
+                       & AMD_CLEAR_BIT(USBMSRMCFG_DBMEN) 
+                       & AMD_CLEAR_BIT(USBMSRMCFG_UDCCLKEN);
+                writel(tmp, USB_MSR_BASE + USB_MSR_MCFG); 
+        }
+#endif
+
+#if     defined(CONFIG_SOC_AU1200)
+        /* done by gadget.dev.release() in kernel 2.6.x 
+         * TMP26: device registration currently disabled for Au1200 */
+        kfree (dev);
+#endif
+#ifdef UDC_USE_TIMER
+        /* remove timer */
+        stop_timer++;
+        if (timer_pending(&udc_timer))
+                wait_for_completion(&on_exit);
+	if (udc_timer.data)
+		del_timer_sync(&udc_timer);
+        /* remove pollstall timer */
+        stop_pollstall_timer++;
+        if (timer_pending(&udc_pollstall_timer))
+                wait_for_completion(&on_pollstall_exit);
+	if (udc_pollstall_timer.data)
+		del_timer_sync(&udc_pollstall_timer);
+#endif
+        udc = 0;
+}
+
+#if   defined(CONFIG_SOC_AU1200)
+/**
+ * Reset all context
+ *
+ * \param pdev        pointer to device struct
+ */
+static void udc_drv_remove (struct device *_dev)
+{
+	struct platform_device *pdev = to_platform_device(_dev);
+	struct udc *dev = dev_get_drvdata (_dev);
+
+#ifdef UDC_DEBUG
+        /* debug */
+        print_misc(dev);
+#endif
+        /* gadget driver registered ? */
+        if (dev->driver) {
+                WARN( "unregistering %s on driver remove\n", dev->driver->driver.name);
+                usb_gadget_unregister_driver (dev->driver);
+        }
+        /* otg driver registered ? */
+        if (dev->otg_transceiver) {
+                /* should have been done already by driver model core */
+                WARN( "uoc driver is still registered\n");
+        }
+        /* dma pool cleanup */
+        if (dev->data_requests) {
+                dma_pool_destroy (dev->data_requests);
+        }
+        if (dev->stp_requests) {
+                /* cleanup DMA desc's for ep0in */
+                dma_pool_free (dev->stp_requests,
+                               dev->ep [UDC_EP0OUT_IX].td_stp,
+                               dev->ep [UDC_EP0OUT_IX].td_stp_dma);
+                dma_pool_free (dev->stp_requests,
+                               dev->ep [UDC_EP0OUT_IX].td,
+                               dev->ep [UDC_EP0OUT_IX].td_phys);
+
+                dma_pool_destroy (dev->stp_requests);
+        }
+
+        /* init controller by soft reset */
+        writel(AMD_BIT(UDC_DEVCFG_SOFTRESET), &dev->regs->cfg);
+
+        if (dev->irq_registered)
+                free_irq (pdev->resource[1].start, dev);
+        if (dev->regs)
+                iounmap (dev->regs);
+        if (dev->mem_region)
+                release_mem_region (pdev->resource[0].start,
+                                    pdev->resource[0].end + 1
+                                    - pdev->resource[0].start);
+
+        device_unregister (&dev->gadget.dev);
+        /* device_remove_file (&pdev->dev, &dev_attr_registers); */
+        dev_set_drvdata (_dev, 0);
+
+        udc_remove(dev);
+}
+#endif
+
+#if   !defined(CONFIG_SOC_AU1200)
+/**
+ * Reset all pci context
+ *
+ * \param pdev        pointer to pci device struct
+ */
+static void udc_pci_remove (struct pci_dev *pdev)
+{
+        struct udc              *dev;
+
+        dev = pci_get_drvdata(pdev);
+#ifdef UDC_DEBUG
+        /* debug */
+        print_misc(dev);
+#endif
+        /* gadget driver registered ? */
+        if (dev->driver) {
+                WARN( "unregistering %s on pci remove\n", dev->driver->driver.name);
+                usb_gadget_unregister_driver (dev->driver);
+        }
+        /* otg driver registered ? */
+        if (dev->otg_transceiver) {
+                /* should have been done already by driver model core */
+                WARN( "uoc driver is still registered\n");
+        }
+        /* dma pool cleanup */
+        if (dev->data_requests) {
+                dma_pool_destroy (dev->data_requests);
+        }
+        if (dev->stp_requests) {
+                /* cleanup DMA desc's for ep0in */
+                dma_pool_free (dev->stp_requests,
+                               dev->ep [UDC_EP0OUT_IX].td_stp,
+                               dev->ep [UDC_EP0OUT_IX].td_stp_dma);
+                dma_pool_free (dev->stp_requests,
+                               dev->ep [UDC_EP0OUT_IX].td,
+                               dev->ep [UDC_EP0OUT_IX].td_phys);
+
+                dma_pool_destroy (dev->stp_requests);
+        }
+
+        /* init controller by soft reset */
+        writel(AMD_BIT(UDC_DEVCFG_SOFTRESET), &dev->regs->cfg);
+        if (dev->irq_registered)
+                free_irq (pdev->irq, dev);
+        if (dev->regs)
+                iounmap (dev->regs);
+        if (dev->mem_region)
+                release_mem_region (pci_resource_start (pdev, 0),
+                                pci_resource_len (pdev, 0));
+#ifndef USE_AU1200_PCI_DUMMY
+        if (dev->active)
+                pci_disable_device (pdev);
+#endif
+
+        /* device file system not working for Au1200 */
+        device_unregister (&dev->gadget.dev);
+        /* device_remove_file (&pdev->dev, &dev_attr_registers); */
+        pci_set_drvdata (pdev,0);
+
+        udc_remove(dev);
+}
+#endif
+
+/**
+ * create dma pools on init  
+ *
+ * \param dev   pointer to udc device struct
+ * \return 0 if success
+ */
+__init static int init_dma_pools(struct udc* dev)
+{
+        struct udc_stp_dma      *td_stp;
+        struct udc_data_dma     *td_data;
+        int retval;
+
+        /* consistent DMA mode setting ? */
+        if (use_dma_ppb) {
+                use_dma_bufferfill_mode = 0;
+        }
+        else {
+                use_dma_ppb_du = 0;
+                use_dma_bufferfill_mode = 1;
+        }
+
+        /* DMA setup */
+        dev->data_requests = dma_pool_create ("data_requests", NULL,
+                sizeof (struct udc_data_dma),
+                UDC_PCIPOOL_ALIGN,
+                UDC_PCIPOOL_CROSS);
+        if (!dev->data_requests) {
+                DBG( "can't get request data pool\n");
+                retval = -ENOMEM;
+                goto finished;
+        }
+
+        /* EP0 in dma regs = dev control regs */        
+        dev->ep[UDC_EP0IN_IX].dma = &dev->regs->ctl;       
+
+        /* dma desc for setup data */
+        dev->stp_requests = dma_pool_create ("setup requests", NULL,
+                sizeof (struct udc_stp_dma),
+                UDC_PCIPOOL_ALIGN,
+                UDC_PCIPOOL_CROSS);
+        if (!dev->stp_requests) {
+                DBG( "can't get stp request pool\n");
+                retval = -ENOMEM;
+                goto finished;
+        }
+        /* setup */
+        td_stp = dma_pool_alloc (dev->stp_requests, UDC_PCIPOOL_GFP_STP,
+                                &dev->ep [UDC_EP0OUT_IX].td_stp_dma);
+        if (td_stp == NULL){
+                retval = -ENOMEM;
+                goto finished;
+        }
+        dev->ep [UDC_EP0OUT_IX].td_stp = td_stp;
+        /* data: 0 packets !? */
+        td_data = dma_pool_alloc (dev->stp_requests, UDC_PCIPOOL_GFP_STP,
+                                &dev->ep [UDC_EP0OUT_IX].td_phys);
+        if (td_data == NULL){
+                retval = -ENOMEM;
+                goto finished;
+        }
+        dev->ep [UDC_EP0OUT_IX].td = td_data;
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+        /* point to itself */
+        dev->ep [UDC_EP0OUT_IX].td->next = dev->ep [UDC_EP0OUT_IX].td_phys;
+#endif
+        return 0;
+
+finished:
+        return retval;
+}
+
+#if   defined(CONFIG_SOC_AU1200)
+/**
+ * Called by kernel  init device context
+ *
+ * \param dev        pointer to device struct
+ * \return 0 if success
+ */
+static int udc_drv_probe (struct device* _dev)
+{
+        char                    tmp[8];
+        struct udc              *dev;
+	struct platform_device *pdev = to_platform_device(_dev);
+	u32                     resource;
+        u32                     len;
+        u32                     irq;
+        int                     retval = 0;
+#ifdef CONFIG_SOC_AU1200
+        u32                     reg;
+
+        /* basic init */
+        reg = readl((u32*) (USB_MSR_BASE + USB_MSR_MCFG));
+        if (reg == 0) {
+                /* default value */
+                reg = USBMSRMCFG_DEFAULT;        
+                writel(reg, USB_MSR_BASE + USB_MSR_MCFG); 
+                readl((u32*) USB_MSR_BASE + USB_MSR_MCFG); 
+                udelay(1000);
+        }
+        /* enable UDC memory, DMA, clock, cacheable memory,
+         * read combining and prefetch enable */
+        reg |= AMD_BIT(USBMSRMCFG_DMEMEN) | AMD_BIT(USBMSRMCFG_DBMEN)
+                | AMD_BIT(USBMSRMCFG_UDCCLKEN)
+                | AMD_BIT(USBMSRMCFG_PHYPLLEN)
+#ifdef CONFIG_DMA_COHERENT
+                | AMD_BIT(USBMSRMCFG_UCAM)
+#endif
+                | AMD_BIT(USBMSRMCFG_RDCOMB)
+                | AMD_BIT(USBMSRMCFG_PFEN);
+        writel(reg, USB_MSR_BASE + USB_MSR_MCFG); 
+#endif
+
+        /* one udc only */
+        if (udc) {
+                WARN("already probed: %04x/%04x\n", UDC_PCI_VENID, UDC_PCI_DEVID);
+                return -EBUSY;
+        }
+
+        /* init */
+        dev = kmalloc (sizeof (struct udc), SLAB_KERNEL);
+        if (!dev) {
+                retval = -ENOMEM;
+                goto finished;
+        }
+        memset (dev, 0, sizeof(struct udc));
+
+	dev->pdev = _dev;
+
+        /* check platform resources */
+	if (pdev->resource[0].flags != IORESOURCE_MEM) {
+		ERR ("resource[0] must be IORESOURCE_MEM\n");
+		retval = -ENOMEM;
+		goto finished;
+	}
+	resource = pdev->resource[0].start;
+	len = pdev->resource[0].end + 1 - pdev->resource[0].start;
+	if (pdev->resource[1].flags != IORESOURCE_IRQ) {
+		ERR ("resource[1] must be IORESOURCE_IRQ\n");
+		retval = -ENOMEM;
+		goto finished;
+	}
+	irq = pdev->resource[1].start;
+
+        /* platform device resource allocation */
+        /* mem */
+	if (!request_mem_region (resource, len, name)) {
+		ERR ("controller already in use\n");
+		retval = -EBUSY;
+		goto finished;
+	}
+	dev->mem_region = 1;
+
+        dev->virt_addr = ioremap_nocache(resource, len);
+        if (dev->virt_addr == NULL) {
+                DBG( "start address cannot be mapped\n");
+                retval = -EFAULT;
+                goto finished;
+        }
+
+        /* irq */
+        if (!irq) {
+                ERR( "irq not set\n");
+                retval = -ENODEV;
+                goto finished;
+        }
+        snprintf (tmp, sizeof tmp, "%d", irq);
+        if (request_irq (irq, udc_irq, SA_SHIRQ, name, dev) != 0) {
+                ERR( "error on request_irq() with %s\n", tmp);
+                retval = -EBUSY;
+                goto finished;
+        }
+        dev->irq_registered = 1;
+
+        dev_set_drvdata (_dev, dev);
+
+        /* chip revision */
+        dev->chiprev = 0;
+
+        /* chip rev for Au1200 */
+        dev->chiprev = (u16) read_c0_prid() & 0xff;
+
+        /* init dma pools */
+        if (use_dma) {
+                retval = init_dma_pools(dev);
+                if (retval != 0)
+                        goto finished; 
+        }
+
+        dev->phys_addr = resource;
+        dev->irq = irq;
+        dev->gadget.dev.parent = _dev;
+        dev->gadget.dev.dma_mask = _dev->dma_mask;
+        /* general probing */
+        if (udc_probe(dev) != 0)
+                goto finished;
+        return retval;        
+
+finished:
+        if (dev)
+                udc_drv_remove (_dev);
+        return retval;
+}
+#endif
+
+#if  !defined(CONFIG_SOC_AU1200)
+/**
+ * Called by pci bus driver to init pci context
+ *
+ * \param pdev        pointer to pci device struct
+ * \param id          pointer to pci device id
+ * \return 0 if success
+ */
+static int udc_pci_probe (struct pci_dev *pdev, const struct pci_device_id *id)
+{
+        char                    tmp[8];
+        struct udc              *dev;
+        unsigned long           resource;
+        unsigned long           len;
+        int retval = 0;;
+
+        VDBG("udc_pci_probe()\n");
+
+#ifdef CONFIG_SOC_AU1200
+        {
+                u32     tmp;
+                /*
+                 * Fill in the dummy pci_dev
+                 */
+                memset(pdev, 0, sizeof(struct pci_dev));
+                pdev->resource[0].name = "UDC Registers";
+                pdev->resource[0].start = USB_UDC_BASE;
+                pdev->resource[0].end = USB_UDC_BASE + USB_UDC_LEN - 1;
+                pdev->resource[0].flags = 0;
+                pdev->irq = AU1200_USB_INT;
+
+                tmp = readl((u32*) (USB_MSR_BASE + USB_MSR_MCFG));
+                if (tmp == 0) {
+                        /* default value */
+                        tmp = USBMSRMCFG_DEFAULT;        
+                        writel(tmp, USB_MSR_BASE + USB_MSR_MCFG); 
+                        readl((u32*) USB_MSR_BASE + USB_MSR_MCFG); 
+                        udelay(1000);
+                }
+                /* enable UDC memory, DMA, clock, cacheable memory,
+                 * read combining and prefetch enable */
+                tmp |= AMD_BIT(USBMSRMCFG_DMEMEN) | AMD_BIT(USBMSRMCFG_DBMEN)
+                        | AMD_BIT(USBMSRMCFG_UDCCLKEN)
+                        | AMD_BIT(USBMSRMCFG_PHYPLLEN)
+#ifdef CONFIG_DMA_COHERENT
+                        | AMD_BIT(USBMSRMCFG_UCAM)
+#endif
+                        | AMD_BIT(USBMSRMCFG_RDCOMB)
+                        | AMD_BIT(USBMSRMCFG_PFEN);
+                writel(tmp, USB_MSR_BASE + USB_MSR_MCFG); 
+        }
+#endif
+        /* one udc only */
+        if (udc) {
+                WARN("already probed: %04x/%04x\n", UDC_PCI_VENID, UDC_PCI_DEVID);
+                return -EBUSY;
+        }
+
+        /* init */
+        dev = kmalloc (sizeof (struct udc), SLAB_KERNEL);
+        if (!dev) {
+                retval = -ENOMEM;
+                goto finished;
+        }
+        memset (dev, 0, sizeof(struct udc));
+
+        /* pci setup */
+#ifndef USE_AU1200_PCI_DUMMY
+        if (pci_enable_device (pdev) < 0) {
+                retval = -ENODEV;
+                goto finished;
+        }
+#endif
+        dev->active = 1;
+
+        /* PCI resource allocation */
+        resource = pci_resource_start(pdev, 0);
+        len = pci_resource_len (pdev, 0);
+
+        if (!request_mem_region (resource, len, name)) {
+                DBG( "pci device used already\n");
+                retval = -EBUSY;
+                goto finished;
+        }
+        dev->mem_region = 1;
+
+        dev->virt_addr = ioremap_nocache(resource, len);
+        if (dev->virt_addr == NULL) {
+                DBG( "start address cannot be mapped\n");
+                retval = -EFAULT;
+                goto finished;
+        }
+
+        if (!pdev->irq) {
+                ERR( "pdev->irq not set\n");
+                retval = -ENODEV;
+                goto finished;
+        }
+
+        snprintf (tmp, sizeof tmp, "%d", pdev->irq);
+
+        if (request_irq (pdev->irq, udc_irq, SA_SHIRQ, name, dev) != 0) {
+                ERR( "error on request_irq() with %s\n", tmp);
+                retval = -EBUSY;
+                goto finished;
+        }
+        dev->irq_registered = 1;
+
+        pci_set_drvdata (pdev, dev);
+
+        /* chip revision */
+        dev->chiprev = 0;
+
+#ifndef CONFIG_SOC_AU1200 
+        pci_set_master (pdev);
+#ifdef  HAVE_PCI_SET_MWI
+        pci_set_mwi (pdev);
+#endif
+        /* chip rev for Hs AU1200 */
+        pci_read_config_byte(pdev, PCI_REVISION_ID, (u8*) &dev->chiprev);
+#else
+        /* chip rev for Au1200 */
+        dev->chiprev = (u16) read_c0_prid() & 0xff;
+#endif
+        /* init dma pools */
+        if (use_dma) {
+                retval = init_dma_pools(dev);
+                if (retval != 0)
+                        goto finished; 
+        }
+
+        dev->phys_addr = resource;
+        dev->irq = pdev->irq;
+        dev->pdev = pdev;
+        dev->gadget.dev.parent = &pdev->dev;
+        dev->gadget.dev.dma_mask = pdev->dev.dma_mask;
+
+        /* general probing */
+        if (udc_probe(dev) != 0)
+                goto finished;
+        return retval;        
+
+finished:
+        if (dev)
+                udc_pci_remove (pdev);
+        return retval;
+}
+#endif
+
+/**
+ * general probe
+ *
+ * \param dev   pointer to udc device struct
+ * \return 0 if success
+ */
+__init int udc_probe(struct udc* dev)
+{
+        char                    tmp[128];
+	u32 reg;
+        int retval;
+
+	/* mark timer as not initialized */
+        udc_timer.data = 0;
+        udc_pollstall_timer.data = 0;
+	
+        /* device struct setup */
+        spin_lock_init(&dev->lock);
+        spin_lock_init(&udc_irq_spinlock);
+        spin_lock_init(&udc_stall_spinlock);
+        dev->gadget.ops = &udc_ops;
+
+        strcpy(dev->gadget.dev.bus_id, "gadget");
+        dev->gadget.dev.release = gadget_release;
+        dev->gadget.name = name;
+	dev->gadget.is_dualspeed = 1;
+
+        /* udc csr registers base */
+        dev->csr = (struct udc_csrs*) (dev->virt_addr + UDC_CSR_ADDR);
+        /* dev registers base */
+        dev->regs = (struct udc_regs *) (dev->virt_addr + UDC_DEVCFG_ADDR);                
+        /* ep registers base */
+        dev->ep_regs = (struct udc_ep_regs *) (dev->virt_addr + UDC_EPREGS_ADDR);                
+        /* fifo's base */
+        dev->rxfifo = (u32*) (dev->virt_addr + UDC_RXFIFO_ADDR);                
+        dev->txfifo = (u32*) (dev->virt_addr + UDC_TXFIFO_ADDR);                
+
+        /* init registers, interrupts, ... */
+#ifndef UDC_IPBUG_3943_WORKAROUND
+        startup_registers(dev);
+#else
+        {
+                u32 tmp;
+
+                /* TODO put this to extra function,
+                 * this all is extracted from usb_init() and
+                 * udc_basic_init() but without register access */
+                dev->gadget.ep0 = &dev->ep [UDC_EP0IN_IX].ep;
+                dev->ep [UDC_EP0IN_IX].halted = 0;
+                INIT_LIST_HEAD (&dev->gadget.ep0->ep_list);
+                dev->gadget.speed = USB_SPEED_HIGH;
+                make_ep_lists(dev);
+                /* basic endpoint init */
+                for (tmp = 0; tmp < UDC_EP_NUM; tmp++) {
+                        struct udc_ep   *ep = &dev->ep[tmp];
+
+                        ep->ep.name = ep_string[tmp];
+                        ep->dev = dev;
+                        ep->num = tmp;
+                        /* txfifo size is calculated at enable time */
+                        ep->txfifo = dev->txfifo;
+
+                        /* fifo size */
+                        if (tmp < UDC_EPIN_NUM) {
+                                ep->fifo_depth = UDC_TXFIFO_SIZE;
+                                ep->in = 1;
+                        }
+                        else {
+                                ep->fifo_depth = UDC_RXFIFO_SIZE;
+                                ep->in = 0;
+
+                        }
+
+                        ep->regs = &dev->ep_regs [tmp];
+                        if (!ep->desc) {
+                                ep->desc = 0;
+                                INIT_LIST_HEAD (&ep->queue);
+
+                                ep->ep.maxpacket = ~0;
+                                ep->ep.ops = &udc_ep_ops;
+                        }
+                        if (use_dma) {
+                                /* ep->dma is not really used, just to indicate that */
+                                /* DMA is active */
+                                /* dma regs = dev control regs */        
+                                ep->dma = (u32*) &dev->regs->ctl;       
+                        }
+                }
+                dev->ep [UDC_EP0IN_IX].ep.maxpacket = UDC_EP0IN_MAX_PKT_SIZE;
+                dev->ep [UDC_EP0OUT_IX].ep.maxpacket = UDC_EP0OUT_MAX_PKT_SIZE;
+        }
+#endif
+
+
+        INFO( "%s\n", mod_desc);
+
+        snprintf (tmp, sizeof tmp, "%d", dev->irq);
+#ifdef CONFIG_SOC_AU1200
+        INFO( "irq %s, mem %08lx, chip rev %02x (Au1200 %s)\n",
+                        tmp, dev->phys_addr, dev->chiprev, (dev->chiprev == 0) ? "AB" : "AC");
+        strcpy(tmp, UDC_DRIVER_VERSION_STRING);
+#ifdef CONFIG_DMA_COHERENT
+        /* coherent DMA not possible with AB silicon */
+        if (dev->chiprev == UDC_AUAB_REV) {
+                ERR("Your chip revision is %s, it must be at least %s to use coherent DMA. \nPlease change DMA_COHERENT to DMA_NONCOHERENT in arch/mips/Kconfig and re-compile .\n",
+                    "AB", "AC");
+                retval = -ENODEV;
+                goto finished;
+        }
+#endif
+        
+#ifdef UDC_AUA1
+        if (dev->chiprev < UDC_AUA1) {
+                ERR("Your chip revision is %s, it must be at least %s\n",
+                    "AB", "AC");
+                retval = -ENODEV;
+                goto finished;
+        }
+        INFO("driver version: %s (for Au1200 AC)\n", tmp);
+#else
+        INFO("driver version: %s (for Au1200 AB)\n", tmp);
+#endif
+#ifdef CONFIG_DMA_COHERENT
+        INFO("Compiled for coherent memory.\n");
+#endif
+#ifdef CONFIG_DMA_NONCOHERENT
+        INFO("Compiled for non-coherent memory.\n");
+#endif
+#else
+        INFO("irq %s, pci mem %08lx, chip rev %02x (Geode5536 %s)\n",
+              tmp, dev->phys_addr, dev->chiprev, (dev->chiprev == UDC_HSA0_REV) ? "A0" : "B1");
+        strcpy(tmp, UDC_DRIVER_VERSION_STRING);
+#ifdef UDC_HSB1
+        if (dev->chiprev == UDC_HSA0_REV) {
+                ERR("Your chip revision is %s, it must be at least %s\n",
+                    "A0", "B1");
+                retval = -ENODEV;
+                goto finished;
+        }
+        INFO("driver version: %s (for Geode5536 B1)\n", tmp);
+#else
+        INFO("driver version: %s (for Geode5536 A0)\n", tmp);
+#endif
+#endif
+        udc = dev;
+
+        device_register (&dev->gadget.dev);
+        /* device_create_file (&pdev->dev, &dev_attr_registers); */
+
+#ifdef UDC_USE_TIMER
+        /* timer init */
+        init_timer(&udc_timer);
+        udc_timer.function = udc_timer_function;
+        udc_timer.data = 1;
+        /* timer pollstall init */
+        init_timer(&udc_pollstall_timer);
+        udc_pollstall_timer.function = udc_pollstall_timer_function;
+        udc_pollstall_timer.data = 1;
+#endif
+
+        /* set SD */
+        reg = readl(&dev->regs->ctl);
+        reg |= AMD_BIT(UDC_DEVCTL_SD);
+        writel(reg, &dev->regs->ctl);
+
+        /* print dev register info */
+        print_regs(dev);
+
+        return 0;
+
+finished:
+        return retval;
+}
+
+
+/**
+ *  Initiates a remote wakeup 
+ *
+ * \return 0 if success
+ */
+/* initiate remote wakeup */
+static int udc_remote_wakeup(struct udc* dev)
+{
+        u32 tmp;
+
+        INFO("UDC initiates remote wakeup\n");
+        
+        tmp =  readl(&dev->regs->ctl);
+        tmp |= AMD_BIT(UDC_DEVCTL_RES);
+        writel(tmp, &dev->regs->ctl);                     
+        /* wait 1ms before clear resume bit */
+        /* udelay(1000); */
+        tmp &= AMD_CLEAR_BIT(UDC_DEVCTL_RES);
+        writel(tmp, &dev->regs->ctl);                     
+
+        return 0;
+}
+
+#if   defined(CONFIG_SOC_AU1200)
+/**
+ *  Suspends UDC 
+ *
+ * \return 0 if success
+ */
+static int udc_suspend(struct udc* dev)
+{
+        int retval = 0;
+
+        INFO("UDC suspend\n");
+#ifdef CONFIG_SOC_AU1200
+        u32 tmp;
+        /* mask interrupts */
+        udc_mask_unused_interrupts(dev);
+
+        if (dev->driver && dev->driver->disconnect) {
+                /* call gadget to reset context */
+                if (spin_is_locked(&dev->lock)) {
+                        spin_unlock(&dev->lock);
+                        dev->driver->disconnect (&dev->gadget);
+                        spin_lock(&dev->lock);
+                }
+                else
+                        dev->driver->disconnect (&dev->gadget);
+
+                /* disable ep0 to empty req queue */
+                empty_req_queue (&dev->ep [UDC_EP0IN_IX]);
+                ep_init (dev->regs,
+                          &dev->ep [UDC_EP0IN_IX]);
+
+                /* init controller by soft reset */
+                udc_soft_reset(dev);
+
+        }
+        if (dev->otg_driver && dev->otg_transceiver 
+            && dev->otg_transceiver->set_peripheral) {
+                /* if UDC is supended by Host or already disconnected then
+                   don't force disconnect by unbind() */
+                if (dev->otg_driver->query) {
+                        if (!(dev->otg_driver->query(0) & OTG_FLAGS_UDC_SUSP)) {
+                                /* unbind from otg driver -> host disconnect */
+                                dev->otg_transceiver->set_peripheral(dev->otg_transceiver, NULL);
+                                dev->connected = 0;
+                        }
+                }
+                else
+                {
+                        /* unbind from otg driver -> host disconnect */
+                        dev->otg_transceiver->set_peripheral (dev->otg_transceiver, NULL);
+                        dev->connected = 0;
+                }
+        }
+                
+        dev->sys_suspended = 1;
+
+        /* switch off UDC clock */
+        tmp = readl((u32*) (USB_MSR_BASE + USB_MSR_MCFG));
+        tmp &= AMD_CLEAR_BIT(USBMSRMCFG_UDCCLKEN);
+        writel(tmp, USB_MSR_BASE + USB_MSR_MCFG); 
+
+#endif        
+
+        return retval;
+}
+
+/**
+ *  Resumes UDC 
+ *
+ * \return 0 if success
+ */
+static int udc_resume(struct udc* dev)
+{
+        int retval = 0;
+
+        INFO("UDC resume\n");
+#ifdef CONFIG_SOC_AU1200
+        u32 tmp;
+        /* switch on UDC clock */
+        tmp = readl((u32*) (USB_MSR_BASE + USB_MSR_MCFG));
+        tmp |= AMD_BIT(USBMSRMCFG_UDCCLKEN);
+        writel(tmp, USB_MSR_BASE + USB_MSR_MCFG); 
+
+        dev->sys_suspended = 0;
+
+        usb_connect(dev);
+        if (dev->otg_transceiver && dev->otg_transceiver->set_peripheral) {
+                /* bind to otg driver */
+                dev->otg_transceiver->set_peripheral(dev->otg_transceiver, &dev->gadget);
+        }
+        
+#endif
+
+        return retval;
+}
+
+static int udc_au1xxx_drv_probe(struct device *dev)
+{
+	int retval;
+
+	DBG("udc_au1xxx_drv_probe()\n");
+        retval = udc_drv_probe(dev);
+	return retval;
+}
+
+static int udc_au1xxx_drv_remove(struct device *dev)
+{
+	DBG("udc_au1xxx_drv_remove()\n");
+        udc_drv_remove(dev);
+	return 0;
+}
+
+static int udc_au1xxx_drv_suspend(struct device *dev, pm_message_t state)
+{
+	struct udc *udc_dev = dev_get_drvdata(dev);
+        return udc_suspend(udc_dev);
+}
+
+static int udc_au1xxx_drv_resume(struct device *dev)
+{
+	struct udc *udc_dev = dev_get_drvdata(dev);
+        return udc_resume(udc_dev);
+}
+
+static struct device_driver udc_au1xxx_driver = {
+	.name		= "au1xxx-udc",
+	.bus		= &platform_bus_type,
+	.probe		= udc_au1xxx_drv_probe,
+	.remove		= udc_au1xxx_drv_remove,
+	.suspend	= udc_au1xxx_drv_suspend,
+	.resume	        = udc_au1xxx_drv_resume,
+};
+#endif
+
+
+/**
+ * Inits driver
+ *
+ * \return 0 if success
+ */
+static int __init init(void)
+{
+        int rc;
+
+#ifdef UDC_DEBUG
+        /* register char device */
+        rc = register_chrdev(UDC_MAJOR_NUM, UDC_DEVICE_NAME, &udc_fops);
+        if (rc < 0)
+        {
+                printk("Error registering udc char device");
+        }
+#endif        
+
+#ifdef CONFIG_SOC_AU1200 
+        /* probe by device system */
+        rc = driver_register(&udc_au1xxx_driver); 
+#else
+        /* probe by PCI bus driver */
+        rc = pci_module_init (&udc_pci_driver);
+#endif
+
+        return rc;
+}
+module_init (init);
+
+/**
+ * Cleans driver
+ */
+static void __exit cleanup(void)
+{
+#ifdef UDC_DEBUG
+        /* unregister char device */
+        unregister_chrdev(UDC_MAJOR_NUM, UDC_DEVICE_NAME);
+#endif
+
+#ifdef CONFIG_SOC_AU1200 
+        /* unregister at device system */
+        driver_unregister(&udc_au1xxx_driver); 
+#else
+        /* unregister at PCI bus driver */
+        pci_unregister_driver (&udc_pci_driver);
+#endif
+
+}
+module_exit (cleanup);
+
diff --git a/drivers/usb/gadget/au1200udc.h b/drivers/usb/gadget/au1200udc.h
new file mode 100644
index 0000000..d7d8491
--- /dev/null
+++ b/drivers/usb/gadget/au1200udc.h
@@ -0,0 +1,936 @@
+/*
+ * Header for driver for AMD Au1200 UDC high/full speed USB device controller
+ */
+
+/*
+ * Copyright (C) 2005 AMD (http://www.amd.com)
+ * Author: Thomas Dahlmann 
+ *
+ * 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
+ */
+
+#ifndef AU1200UDC_H
+#define AU1200UDC_H
+
+/*****************************************************************************
+*  Constants
+*****************************************************************************/
+
+/* Driver  constants -------------------------------------------------------*/
+#define DRIVER_NAME_FOR_PRINT "au1200udc"
+
+/* PCI constants -----------------------------------------------------------*/
+#define UDC_PCI_VENID 0x1022
+#define UDC_PCI_DEVID 0x2096
+#define UDC_PCI_CLASS ((PCI_CLASS_SERIAL_USB << 8) | 0xfe)
+#define UDC_PCI_CLASS_MASK 0xffffffff
+
+/* Platform specific -------------------------------------------------------*/
+#if defined(CONFIG_SOC_AU1200)
+#define UDC_PCIPOOL_ALIGN       32 
+#define UDC_PCIPOOL_CROSS       4096
+#define UDC_PCIPOOL_GFP_STP     (GFP_ATOMIC | GFP_DMA)
+#else
+#define UDC_PCIPOOL_ALIGN       0 
+#define UDC_PCIPOOL_CROSS       0 
+#define UDC_PCIPOOL_GFP_STP     (GFP_KERNEL)
+#endif
+
+/* temp define for AU1200, will live in au1000.h normally */
+#ifndef USB_UDC_BASE
+#define USB_UDC_BASE              0x14022000
+#define USB_UDC_LEN               0x2000
+#define USB_MSR_BASE              0xB4020000
+#define USB_MSR_MCFG              4
+#define USBMSRMCFG_DMEMEN         4
+#define USBMSRMCFG_DBMEN          5
+#define USBMSRMCFG_UDCCLKEN       18
+#define USBMSRMCFG_PHYPLLEN       19
+#define USBMSRMCFG_RDCOMB         30
+#define USBMSRMCFG_PFEN           31
+#define AU1200_USB_INT            29
+#endif
+#ifndef USBMSRMCFG_UCAM           
+#define USBMSRMCFG_UCAM           7
+#endif
+#define USBMSRMCFG_DEFAULT        0x00d02000
+
+/* other constants */
+#define UDC_RDE_TIMER_SECONDS                   1
+#define UDC_RDE_TIMER_DIV                       10
+#define UDC_POLLSTALL_TIMER_USECONDS            500
+
+/* Special optimization for certain gadgets ------------------------------- */ 
+/* use hardware NAK if IN queue empty, this can be used to 
+* avoid interrupt flood as for the ethernet gadget where host side
+* sends IN tokens permamently */
+#define UDC_DISABLE_IRQ_IF_EMPTY_IN_QUEUE
+/*#undef UDC_DISABLE_IRQ_IF_EMPTY_IN_QUEUE*/                                       
+
+/* IP core defect/bug/case workarounds ---------------------------------------- */
+/* Hs AU1200 A0 workarounds */
+/* Description: "Last descriptor loop */
+#define UDC_IPDEFECT_9000004946_WORKAROUND
+/* Description: "DMA machine not restartable" */
+#define UDC_IPCASE_8000018724_WORKAROUND
+/* Description: "UDC not accessible when phy is suspended */
+#define UDC_IPBUG_3943_WORKAROUND
+/* Description: "USB device needs session-valid status information */
+#define UDC_IPBUG_3950_WORKAROUND
+/* Description: "Clearing endpoint NAK bits not possible if RxFIFO
+   not empty (PCS#1503) */
+#define UDC_IPBUG_3958_WORKAROUND
+/* UDC data errors during loop test (DMA) 
+   - found only with Au1200 but used for Hs too, bug entry
+     is in Au1200 bugzilla
+   - the workaround applies only for small packets */
+#define UDC_IPBUG_2253_WORKAROUND
+#define UDC_SMALL_PACKET        32
+
+/* Disable workarounds which don't apply to Hs AU1200 B1/ Au1200 A1 */
+/* And enable new features */
+ 
+/* Hs AU1200 A0 flag */
+/* #define UDC_HSA0 */
+/* Hs AU1200 B1 flag */
+#define UDC_HSB1
+
+/* Hs AU1200 chip rev. */
+#define UDC_HSA0_REV 1
+#define UDC_HSB1_REV 2
+
+/* consistency */
+#ifdef UDC_HSB1
+#undef UDC_HSA0
+#endif
+
+/* Au1200 rev. */
+#if defined(CONFIG_SOC_AU1200)
+#undef UDC_HSB1
+#undef UDC_HSA0
+/* revision value */
+#define UDC_AUAB_REV 0
+#define UDC_AUAC_REV 1
+#define UDC_AUA0 0
+/* Au1200 AC flag */
+/* #define UDC_AUA1 1 */
+#endif
+
+/* disable workarounds for newer chip revisions */
+#ifdef UDC_HSB1
+#undef UDC_IPBUG_3943_WORKAROUND
+#undef UDC_IPBUG_3950_WORKAROUND
+#define UDC_DMARST_AVAIL
+#endif
+#ifdef UDC_AUA1
+#undef UDC_IPBUG_3943_WORKAROUND
+#endif
+
+/* SETUP usb commands 
+*  needed, because some SETUP's are handled in hw, but must be passed to 
+*  gadget driver above -----------------------------------------------------*/
+/* SET_CONFIG */
+#define UDC_SETCONFIG_DWORD0                    0x00000900
+#define UDC_SETCONFIG_DWORD0_VALUE_MASK         0xffff0000 
+#define UDC_SETCONFIG_DWORD0_VALUE_OFS          16 
+
+#define UDC_SETCONFIG_DWORD1                    0x00000000
+
+/* SET_INTERFACE */
+#define UDC_SETINTF_DWORD0                      0x00000b00
+#define UDC_SETINTF_DWORD0_ALT_MASK             0xffff0000 
+#define UDC_SETINTF_DWORD0_ALT_OFS              16
+
+#define UDC_SETINTF_DWORD1                      0x00000000
+#define UDC_SETINTF_DWORD1_INTF_MASK            0x0000ffff 
+#define UDC_SETINTF_DWORD1_INTF_OFS             0 
+
+/* Mass storage reset */
+#define UDC_MSCRES_DWORD0                       0x0000ff21
+#define UDC_MSCRES_DWORD1                       0x00000000
+
+/* Global CSR's -------------------------------------------------------------*/
+/* UDC CSR's */
+#define UDC_CSR_ADDR                            0x500 
+
+/* EP NE bits */
+/* EP number */
+#define UDC_CSR_NE_NUM_MASK                     0x0000000f 
+#define UDC_CSR_NE_NUM_OFS                      0 
+/* EP direction */
+#define UDC_CSR_NE_DIR_MASK                     0x00000010 
+#define UDC_CSR_NE_DIR_OFS                      4 
+/* EP type */
+#define UDC_CSR_NE_TYPE_MASK                    0x00000060
+#define UDC_CSR_NE_TYPE_OFS                     5
+/* EP config number */
+#define UDC_CSR_NE_CFG_MASK                     0x00000780
+#define UDC_CSR_NE_CFG_OFS                      7
+/* EP interface number */
+#define UDC_CSR_NE_INTF_MASK                    0x00007800
+#define UDC_CSR_NE_INTF_OFS                     11 
+/* EP alt setting */
+#define UDC_CSR_NE_ALT_MASK                     0x00078000
+#define UDC_CSR_NE_ALT_OFS                      15
+ 
+/* max pkt */
+#define UDC_CSR_NE_MAX_PKT_MASK                 0x3ff80000 
+#define UDC_CSR_NE_MAX_PKT_OFS                  19 
+
+/* Device Config Register ---------------------------------------------------*/
+#define UDC_DEVCFG_ADDR                         0x400 
+
+#define UDC_DEVCFG_SOFTRESET                    31
+#define UDC_DEVCFG_HNPSFEN                      30
+#define UDC_DEVCFG_DMARST                       29
+#define UDC_DEVCFG_SET_DESC                     18
+#define UDC_DEVCFG_CSR_PRG                      17
+#define UDC_DEVCFG_STATUS                       7
+#define UDC_DEVCFG_DIR                          6
+#define UDC_DEVCFG_PI                           5
+#define UDC_DEVCFG_SS                           4
+#define UDC_DEVCFG_SP                           3
+#define UDC_DEVCFG_RWKP                         2
+
+#define UDC_DEVCFG_SPD_MASK                     0x3
+#define UDC_DEVCFG_SPD_OFS                      0
+#define UDC_DEVCFG_SPD_HS                       0x0
+#define UDC_DEVCFG_SPD_FS                       0x1
+#define UDC_DEVCFG_SPD_LS                       0x2
+/*#define UDC_DEVCFG_SPD_FS                     0x3*/
+
+
+/* Device Control Register --------------------------------------------------*/
+#define UDC_DEVCTL_ADDR                         0x404 
+
+#define UDC_DEVCTL_THLEN_MASK                   0xff000000 
+#define UDC_DEVCTL_THLEN_OFS                    24 
+
+#define UDC_DEVCTL_BRLEN_MASK                   0x00ff0000 
+#define UDC_DEVCTL_BRLEN_OFS                    16 
+
+#define UDC_DEVCTL_CSR_DONE                     13
+#define UDC_DEVCTL_DEVNAK                       12
+#define UDC_DEVCTL_SD                           10
+#define UDC_DEVCTL_MODE                         9 
+#define UDC_DEVCTL_BREN                         8
+#define UDC_DEVCTL_THE                          7
+#define UDC_DEVCTL_BF                           6
+#define UDC_DEVCTL_BE                           5
+#define UDC_DEVCTL_DU                           4
+#define UDC_DEVCTL_TDE                          3
+#define UDC_DEVCTL_RDE                          2
+#define UDC_DEVCTL_RES                          0
+
+
+/* Device Status Register ---------------------------------------------------*/
+#define UDC_DEVSTS_ADDR                         0x408
+
+#define UDC_DEVSTS_TS_MASK                      0xfffc0000
+#define UDC_DEVSTS_TS_OFS                       18
+
+#define UDC_DEVSTS_SESSVLD                      17
+#define UDC_DEVSTS_PHY_ERROR                    16
+#define UDC_DEVSTS_RXFIFO_EMPTY                 15
+
+#define UDC_DEVSTS_ENUM_SPEED_MASK              0x00006000
+#define UDC_DEVSTS_ENUM_SPEED_OFS               13
+#define UDC_DEVSTS_ENUM_SPEED_FULL              1
+#define UDC_DEVSTS_ENUM_SPEED_HIGH              0
+
+#define UDC_DEVSTS_SUSP                         12
+
+#define UDC_DEVSTS_ALT_MASK                     0x00000f00
+#define UDC_DEVSTS_ALT_OFS                      8
+
+#define UDC_DEVSTS_INTF_MASK                    0x000000f0
+#define UDC_DEVSTS_INTF_OFS                     4
+
+#define UDC_DEVSTS_CFG_MASK                     0x0000000f
+#define UDC_DEVSTS_CFG_OFS                      0
+
+
+/* Device Interrupt Register ------------------------------------------------*/
+#define UDC_DEVINT_ADDR                         0x40c
+
+#define UDC_DEVINT_SVC                          7
+#define UDC_DEVINT_ENUM                         6
+#define UDC_DEVINT_SOF                          5
+#define UDC_DEVINT_US                           4
+#define UDC_DEVINT_UR                           3
+#define UDC_DEVINT_ES                           2
+#define UDC_DEVINT_SI                           1
+#define UDC_DEVINT_SC                           0
+
+/* Device Interrupt Mask Register -------------------------------------------*/
+#define UDC_DEVINT_MSK_ADDR                     0x410
+
+#define UDC_DEVINT_MSK                          0x7f
+
+/* Endpoint Interrupt Register ----------------------------------------------*/
+#define UDC_EPINT_ADDR                          0x414           
+
+#define UDC_EPINT_OUT_MASK                      0xffff0000           
+#define UDC_EPINT_OUT_OFS                       16           
+#define UDC_EPINT_IN_MASK                       0x0000ffff           
+#define UDC_EPINT_IN_OFS                        0 
+
+#define UDC_EPINT_IN_EP0                        0 
+#define UDC_EPINT_IN_EP1                        1 
+#define UDC_EPINT_IN_EP2                        2 
+#define UDC_EPINT_IN_EP3                        3 
+#define UDC_EPINT_OUT_EP0                       16 
+#define UDC_EPINT_OUT_EP1                       17
+#define UDC_EPINT_OUT_EP2                       18 
+#define UDC_EPINT_OUT_EP3                       19 
+
+#define UDC_EPINT_EP0_ENABLE_MSK                0x001e001e    
+
+/* Endpoint Interrupt Mask Register -----------------------------------------*/
+#define UDC_EPINT_MSK_ADDR                      0x418           
+
+#define UDC_EPINT_OUT_MSK_MASK                  0xffff0000           
+#define UDC_EPINT_OUT_MSK_OFS                   16           
+#define UDC_EPINT_IN_MSK_MASK                   0x0000ffff           
+#define UDC_EPINT_IN_MSK_OFS                    0 
+
+#define UDC_EPINT_MSK_DISABLE_ALL               0xffffffff
+/* mask non-EP0 endpoints */
+#define UDC_EPDATAINT_MSK_DISABLE               0xfffefffe
+/* mask all dev interrupts */
+#define UDC_DEV_MSK_DISABLE                     0x7f
+
+/* Endpoint-specific CSR's --------------------------------------------------*/
+/* Endpoint Control Registers -----------------------------------------------*/
+#define UDC_EPREGS_ADDR                         0x0
+#define UDC_EPIN_REGS_ADDR                      0x0
+#define UDC_EPOUT_REGS_ADDR                     0x200
+
+#define UDC_EPCTL_ADDR                          0x0
+
+#define UDC_EPCTL_RRDY                          9
+#define UDC_EPCTL_CNAK                          8
+#define UDC_EPCTL_SNAK                          7
+#define UDC_EPCTL_NAK                           6
+
+#define UDC_EPCTL_ET_MASK                       0x00000030
+#define UDC_EPCTL_ET_OFS                        4
+#define UDC_EPCTL_ET_CONTROL                    0
+#define UDC_EPCTL_ET_ISO                        1 
+#define UDC_EPCTL_ET_BULK                       2
+#define UDC_EPCTL_ET_INTERRUPT                  3
+
+#define UDC_EPCTL_P                             3
+#define UDC_EPCTL_SN                            2
+#define UDC_EPCTL_F                             1
+#define UDC_EPCTL_S                             0
+
+/* Endpoint Status Registers ------------------------------------------------*/
+#define UDC_EPSTS_ADDR                          0x4
+
+#define UDC_EPSTS_RX_PKT_SIZE_MASK              0x007ff800
+#define UDC_EPSTS_RX_PKT_SIZE_OFS               11
+
+#define UDC_EPSTS_TDC                           10
+#define UDC_EPSTS_HE                            9
+#define UDC_EPSTS_BNA                           7
+#define UDC_EPSTS_IN                            6
+
+#define UDC_EPSTS_OUT_MASK                      0x00000030
+#define UDC_EPSTS_OUT_OFS                       4 
+#define UDC_EPSTS_OUT_DATA                      1
+#define UDC_EPSTS_OUT_DATA_CLEAR                0x10
+#define UDC_EPSTS_OUT_SETUP                     2
+#define UDC_EPSTS_OUT_SETUP_CLEAR               0x20
+
+/* Endpoint Buffer Size IN/ Receive Packet Frame Number OUT  Registers ------*/
+#define UDC_EPIN_BUFF_SIZE_ADDR                 0x8
+#define UDC_EPOUT_FRAME_NUMBER_ADDR             0x8
+
+#define UDC_EPIN_BUFF_SIZE_MASK                 0x0000ffff
+#define UDC_EPIN_BUFF_SIZE_OFS                  0
+/*  EP0in txfifo = 128 bytes*/ 
+#define UDC_EPIN0_BUFF_SIZE                     32
+/*  EP0in fullspeed txfifo = 128 bytes*/ 
+#define UDC_FS_EPIN0_BUFF_SIZE                  32
+
+/* fifo size mult = fifo size / max packet */
+#define UDC_EPIN_BUFF_SIZE_MULT                 2
+
+/* EPin data fifo size = 1024 bytes DOUBLE BUFFERING */
+#define UDC_EPIN_BUFF_SIZE                      256 
+/* EPin small INT data fifo size = 128 bytes */
+#define UDC_EPIN_SMALLINT_BUFF_SIZE             32 
+
+/* EPin fullspeed data fifo size = 128 bytes DOUBLE BUFFERING */
+#define UDC_FS_EPIN_BUFF_SIZE                   32 
+
+#define UDC_EPOUT_FRAME_NUMBER_MASK             0x0000ffff
+#define UDC_EPOUT_FRAME_NUMBER_OFS              0 
+
+/* Endpoint Buffer Size OUT/Max Packet Size Registers -----------------------*/
+#define UDC_EPOUT_BUFF_SIZE_ADDR                0x0c
+#define UDC_EP_MAX_PKT_SIZE_ADDR                0x0c
+
+#define UDC_EPOUT_BUFF_SIZE_MASK                0xffff0000
+#define UDC_EPOUT_BUFF_SIZE_OFS                 16 
+#define UDC_EP_MAX_PKT_SIZE_MASK                0x0000ffff
+#define UDC_EP_MAX_PKT_SIZE_OFS                 0
+/* EP0in max packet size = 64 bytes */
+#define UDC_EP0IN_MAX_PKT_SIZE                  64
+/* EP0out max packet size = 64 bytes */
+#define UDC_EP0OUT_MAX_PKT_SIZE                 64
+/* EP0in fullspeed max packet size = 64 bytes */
+#define UDC_FS_EP0IN_MAX_PKT_SIZE               64   
+/* EP0out fullspeed max packet size = 64 bytes */
+#define UDC_FS_EP0OUT_MAX_PKT_SIZE              64
+
+/* Endpoint dma descriptors ------------------------------------------------*/
+/* Setup data */
+/* Status dword */
+#define UDC_DMA_STP_STS_CFG_MASK                0x0fff0000
+#define UDC_DMA_STP_STS_CFG_OFS                 16
+#define UDC_DMA_STP_STS_CFG_ALT_MASK            0x000f0000     
+#define UDC_DMA_STP_STS_CFG_ALT_OFS             16     
+#define UDC_DMA_STP_STS_CFG_INTF_MASK           0x00f00000     
+#define UDC_DMA_STP_STS_CFG_INTF_OFS            20     
+#define UDC_DMA_STP_STS_CFG_NUM_MASK            0x0f000000     
+#define UDC_DMA_STP_STS_CFG_NUM_OFS             24     
+#define UDC_DMA_STP_STS_RX_MASK                 0x30000000
+#define UDC_DMA_STP_STS_RX_OFS                  28 
+#define UDC_DMA_STP_STS_BS_MASK                 0xc0000000
+#define UDC_DMA_STP_STS_BS_OFS                  30 
+#define UDC_DMA_STP_STS_BS_HOST_READY           0 
+#define UDC_DMA_STP_STS_BS_DMA_BUSY             1 
+#define UDC_DMA_STP_STS_BS_DMA_DONE             2 
+#define UDC_DMA_STP_STS_BS_HOST_BUSY            3 
+/* IN data */
+/* Status dword */
+#define UDC_DMA_IN_STS_TXBYTES_MASK            0x0000ffff
+#define UDC_DMA_IN_STS_TXBYTES_OFS             0
+#define UDC_DMA_IN_STS_FRAMENUM_MASK           0x07ff0000
+#define UDC_DMA_IN_STS_FRAMENUM_OFS            0
+#define UDC_DMA_IN_STS_L                       27
+#define UDC_DMA_IN_STS_TX_MASK                 0x30000000
+#define UDC_DMA_IN_STS_TX_OFS                  28 
+#define UDC_DMA_IN_STS_BS_MASK                 0xc0000000
+#define UDC_DMA_IN_STS_BS_OFS                  30 
+#define UDC_DMA_IN_STS_BS_HOST_READY           0 
+#define UDC_DMA_IN_STS_BS_DMA_BUSY             1 
+#define UDC_DMA_IN_STS_BS_DMA_DONE             2 
+#define UDC_DMA_IN_STS_BS_HOST_BUSY            3 
+/* OUT data */
+/* Status dword */
+#define UDC_DMA_OUT_STS_RXBYTES_MASK            0x0000ffff
+#define UDC_DMA_OUT_STS_RXBYTES_OFS             0
+#define UDC_DMA_OUT_STS_FRAMENUM_MASK           0x07ff0000
+#define UDC_DMA_OUT_STS_FRAMENUM_OFS            0
+#define UDC_DMA_OUT_STS_L                       27
+#define UDC_DMA_OUT_STS_RX_MASK                 0x30000000
+#define UDC_DMA_OUT_STS_RX_OFS                  28 
+#define UDC_DMA_OUT_STS_BS_MASK                 0xc0000000
+#define UDC_DMA_OUT_STS_BS_OFS                  30 
+#define UDC_DMA_OUT_STS_BS_HOST_READY           0 
+#define UDC_DMA_OUT_STS_BS_DMA_BUSY             1 
+#define UDC_DMA_OUT_STS_BS_DMA_DONE             2 
+#define UDC_DMA_OUT_STS_BS_HOST_BUSY            3 
+/* other constants */
+/* max ep0in packet */
+#define UDC_EP0IN_MAXPACKET                     1000
+/* max dma packet */
+#define UDC_DMA_MAXPACKET                       65536 
+/* DMA buffer len for temp request, should be the same as the upper
+layer gadget is using */
+#define UDC_DMA_TEMP_BUFFER_LEN                 4096 
+/* un-usable DMA address */
+#define DMA_DONT_USE                           (~(dma_addr_t) 0 )
+
+/* other Endpoint register addresses and values-----------------------------*/
+#define UDC_EP_SUBPTR_ADDR                      0x10
+#define UDC_EP_DESPTR_ADDR                      0x14
+#define UDC_EP_WRITE_CONFIRM_ADDR               0x1c
+
+/* EP number as layouted in AHB space */
+#define UDC_EP_NUM                              32
+#define UDC_EPIN_NUM                            16
+#define UDC_EPIN_NUM_USED                       5
+#define UDC_EPOUT_NUM                           16
+/* EP number of EP's really used = EP0 + 8 data EP's */
+#define UDC_USED_EP_NUM                         9
+/* UDC CSR regs are aligned but AHB regs not - offset for OUT EP's */
+#define UDC_CSR_EP_OUT_IX_OFS                   12
+
+#define UDC_EP0OUT_IX                           16
+#define UDC_EP0IN_IX                            0
+
+/* max packet */
+#define UDC_HS_BULK_MAXPKT                      512
+
+/* Rx fifo address and size = 1k -------------------------------------------*/
+#define UDC_RXFIFO_ADDR                         0x800
+#define UDC_RXFIFO_SIZE                         0x400
+
+/* Tx fifo address and size = 1.5k -----------------------------------------*/
+#define UDC_TXFIFO_ADDR                         0xc00
+#define UDC_TXFIFO_SIZE                         0x600
+
+/* default data endpoints --------------------------------------------------*/
+#define UDC_EPIN_STATUS_IX                      1                            
+#define UDC_EPIN_IX                             2                            
+#define UDC_EPOUT_IX                            18                            
+
+/* general constants -------------------------------------------------------*/ 
+#define UDC_DWORD_BYTES                         4
+#define UDC_BITS_PER_BYTE_SHIFT                 3
+#define UDC_BYTE_MASK                           0xff
+#define UDC_BITS_PER_BYTE                       8
+
+/* char device constants ---------------------------------------------------*/
+/* names */
+#ifdef UDC_DEBUG
+#ifdef UDC_DRIVER_NAME
+#define UDC_DEVICE_NAME UDC_DRIVER_NAME
+#else
+#define UDC_DEVICE_NAME "au1200udc"
+#endif
+#define UDC_DEVICE_FILE_NAME "au1200udc_dev"
+#define UDC_DEVICE_FILE_INODE "/dev/au1200udc_dev"
+/* major number */
+#define UDC_MAJOR_NUM   240
+#endif
+
+#ifdef __KERNEL__
+/* kernel wrappers */
+#define device_create_file(x,y) do {} while (0)
+#define device_remove_file device_create_file
+
+#ifndef WARN_ON
+#define WARN_ON(a) do {} while (0)
+#endif
+
+#ifndef BUG_ON
+#define BUG_ON(cond)do {if (unlikely((cond) != 0)) BUG();} while(0)
+#endif
+
+#ifndef likely
+#define likely(a) (a)
+#define unlikely(a) (a)
+#endif
+
+#ifndef container_of
+#define container_of list_entry
+#endif
+
+#ifndef        IRQ_NONE
+typedef void irqreturn_t;
+#define IRQ_HANDLED
+#define IRQ_NONE
+#define IRQ_RETVAL(a)
+#endif
+#endif 
+
+/* MIPS specific -----------------------------------------------------------*/
+#if defined(CONFIG_SOC_AU1200)
+/* sync does it without refilling the pipe,
+   so read after write can bypass write */
+#define au1200_sync_delay() {\
+  asm(".set noreorder"); \
+  asm("b l1");\
+  asm("l1:");\
+  asm("sync");\
+  asm("nop");\
+  asm("nop");\
+  asm("nop");\
+  asm("nop");\
+  asm("b l2");\
+  asm("l2:");\
+  asm("nop");\
+  asm("nop");\
+  asm(".set reorder");\
+}
+
+/* #define wb_flush() au1200_sync() */
+#define wb_flush() __asm__ volatile ("sync")
+
+/* special write functions for MIPS (with write buffer flush) */
+#undef writel
+#undef writeb
+#define writel(d,a) {((*(volatile unsigned int *)(a))=(d));wb_flush();}
+#define writeb(d,a) {((*(volatile unsigned char *)(a))=(d));wb_flush();}
+#else
+#define wb_flush() {}
+#endif
+
+/*****************************************************************************
+* Includes 
+*****************************************************************************/
+
+#if !defined(UDC_HSB1)	
+#include "au1200otg.h"
+#endif
+
+/*****************************************************************************
+*  Types
+*****************************************************************************/
+
+/* UDC CSR's */
+struct udc_csrs {
+        
+        /* sca - setup command address */
+        u32 sca;
+
+        /* ep ne's */
+        u32 ne[UDC_USED_EP_NUM];
+} __attribute__ ((packed));
+
+/* AHB subsystem CSR registers */
+struct udc_regs {
+
+        /* device configuration */
+        u32 cfg;
+
+        /* device control */
+        u32 ctl;
+
+        /* device status */
+        u32 sts;
+
+        /* device interrupt */
+        u32 irqsts;
+
+        /* device interrupt mask */
+        u32 irqmsk;
+        
+        /* endpoint interrupt  */
+        u32 ep_irqsts;
+
+        /* endpoint interrupt mask */
+        u32 ep_irqmsk;
+} __attribute__ ((packed));
+
+/* endpoint specific registers */
+struct udc_ep_regs {
+
+        /* endpoint control */
+        u32 ctl;
+
+        /* endpoint status */
+        u32 sts;
+
+        /* endpoint buffer size in/ receive packet frame number out  */
+        u32 bufin_framenum;
+
+        /* endpoint buffer size out/max packet size */
+        u32 bufout_maxpkt;        
+
+        /* endpoint setup buffer pointer */
+        u32 subptr; 
+        
+        /* endpoint data descriptor pointer */
+        u32 desptr;
+
+        /* reserverd */
+        u32 reserved;
+
+        /* write/read confirmation */
+        u32 confirm;
+
+}  __attribute__ ((packed));
+
+#ifdef __KERNEL__
+/* control data DMA desc */
+struct udc_stp_dma {
+        /* status quadlet */
+        u32     status;
+        /* reserved */
+        u32     _reserved;
+        /* first setup word */
+        u32     data12;
+        /* second setup word */
+        u32     data34;
+} __attribute__ ((aligned (16)));
+
+/* normal data DMA desc */
+struct udc_data_dma {
+        /* status quadlet */
+        u32     status;
+        /* reserved */
+        u32     _reserved;
+        /* buffer pointer */
+        u32     bufptr;
+        /* next descriptor pointer */
+        u32     next;
+} __attribute__ ((aligned (16)));
+
+/* request packet */
+struct udc_request {
+        /* embedded gadget ep */
+        struct usb_request                  req;
+
+        /* flags */
+        unsigned                            dma_going : 1,
+                                            dma_mapping : 1,
+                                            dma_done : 1;
+        /* phys. address */
+        dma_addr_t                          td_phys;
+        /* first dma desc. of chain */
+        struct udc_data_dma                 *td_data;
+        /* last dma desc. of chain */
+        struct udc_data_dma                 *td_data_last;
+#ifdef UDC_IPDEFECT_9000004946_WORKAROUND
+        /* next pointer of broken chain */
+        dma_addr_t                          td_data_last_next; 
+#endif
+
+        struct list_head                    queue;
+
+        /* chain length */
+        unsigned                            chain_len;
+
+};
+
+/* UDC specific endpoint parameters */
+struct udc_ep {
+        struct usb_ep                       ep;
+        struct udc_ep_regs                  *regs;
+        u32                                 *txfifo;
+        u32*                                dma;
+        dma_addr_t                          td_phys;
+        dma_addr_t                          td_stp_dma;        
+        struct udc_stp_dma                  *td_stp;
+        struct udc_data_dma                 *td;
+        /* temp request */
+        struct udc_request                  *req;
+        unsigned                            req_used;        
+        unsigned                            req_completed;        
+        /* NAK state */
+        unsigned                            naking;        
+
+        struct udc                          *dev;
+
+        /* queue for requests */
+        struct list_head                        queue;
+        const struct usb_endpoint_descriptor    *desc;
+        unsigned                                halted;
+        unsigned                                num : 5,
+                                                fifo_depth : 14,
+                                                in : 1;
+};
+
+/* device struct */
+struct udc {
+        struct usb_gadget               gadget;
+        spinlock_t                      lock;
+        /* all endpoints */
+        struct udc_ep                   ep[UDC_EP_NUM];
+        struct usb_gadget_driver        *driver;
+        struct otg_transceiver          *otg_transceiver;
+#if !defined(UDC_HSB1)	
+        struct usb_otg_gadget_extension *otg_driver;
+#endif
+        /* operational flags */
+        unsigned                        active : 1,
+                                        stall_ep0in : 1,
+                                        waiting_zlp_ack_ep0in : 1,
+                                        set_cfg_not_acked : 1,
+                                        irq_registered : 1,
+                                        otg_supported : 1,
+                                        data_ep_enabled : 1,
+                                        data_ep_queued : 1,
+                                        mem_region : 1,
+                                        selfpowered : 1,
+                                        sys_suspended : 1,
+                                        connected;
+
+        u16                             chiprev;
+
+        /* registers */
+#if defined(CONFIG_SOC_AU1200) && !defined(USE_AU1200_PCI_DUMMY)
+        struct device                   *pdev;
+#else
+        struct pci_dev                  *pdev;
+#endif
+        struct udc_csrs                 *csr;
+        struct udc_regs                 *regs;
+        struct udc_ep_regs              *ep_regs;
+        u32*                            rxfifo;
+        u32*                            txfifo;
+
+        /* DMA desc pools */
+#if   defined(CONFIG_SOC_AU1200)
+        struct dma_pool                 *data_requests;
+        struct dma_pool                 *stp_requests;
+#else
+        struct pci_pool                 *data_requests;
+        struct pci_pool                 *stp_requests;
+#endif
+
+        /* device data */
+        unsigned long                   phys_addr;
+        void*                           virt_addr; 
+        unsigned                        irq;
+
+        /* states */
+        u16                             cur_config;
+        u16                             cur_intf;
+        u16                             cur_alt;
+};
+
+/* setup request data */
+union udc_setup_data {
+        u32                        data[2];
+        struct usb_ctrlrequest     request;
+};
+#endif /*__KERNEL__*/
+
+/*****************************************************************************
+*  Macros
+*****************************************************************************/
+
+/***************************************
+* SET and GET bitfields in u32 values
+* via constants for mask/offset:
+* <bit_field_stub_name> is the text between
+* UDC_ and _MASK|_OFS of appropiate
+* constant
+****************************************/
+/* set bitfield value in u32 u32Val */
+#define AMD_ADDBITS(u32Val, bitfield_val, bitfield_stub_name)\
+        (((u32Val) & (((u32) ~((u32) bitfield_stub_name##_MASK))))\
+        |(((bitfield_val) << ((u32) bitfield_stub_name##_OFS))\
+        & ((u32) bitfield_stub_name##_MASK)))
+
+/* set bitfield value in zero-initialized u32 u32Val */
+/* => bitfield bits in u32Val are all zero */
+#define AMD_INIT_SETBITS(u32Val, bitfield_val, bitfield_stub_name)\
+        ((u32Val)\
+        |(((bitfield_val) << ((u32) bitfield_stub_name##_OFS))\
+        &((u32) bitfield_stub_name##_MASK)))
+
+/* get bitfield value from u32 u32Val */
+#define AMD_GETBITS(u32Val, bitfield_stub_name)\
+        ((u32Val & ((u32) bitfield_stub_name##_MASK))\
+        >> ((u32) bitfield_stub_name##_OFS))
+
+/* SET and GET bits in u32 values ------------------------------------------*/
+#define AMD_BIT(bit_stub_name) (1 << bit_stub_name)
+#define AMD_UNMASK_BIT(bit_stub_name) (~AMD_BIT(bit_stub_name))
+#define AMD_CLEAR_BIT(bit_stub_name) (~AMD_BIT(bit_stub_name))
+
+/* misc --------------------------------------------------------------------*/
+#define        DIR_STRING(bAddress) (((bAddress) & USB_DIR_IN) ? "in" : "out")
+
+/* UDC specific macros -----------------------------------------------------*/
+#ifdef UDC_DMARST_AVAIL
+#define UDC_DMARST(tmp, dev) \
+        DBG("DMA machine reset\n"); \
+        tmp = readl(&dev->regs->cfg); \
+        writel(tmp | AMD_BIT(UDC_DEVCFG_DMARST), &dev->regs->cfg); \
+        writel(tmp, &dev->regs->cfg);
+#else
+#define UDC_DMARST(tmp, dev) {} 
+#endif
+
+/* print macros ------------------------------------------------------------*/
+
+#ifdef UDC_VERBOSE
+#ifndef UDC_DEBUG
+#define UDC_DEBUG
+#endif
+#endif
+
+/**
+ * \brief
+ * Macro for printing information in drivers
+ * 
+ * This macro is used for printing kernel messages in driver source code.
+ * It should be used for printing useful information about states and called
+ * functions for normal operation (not for errors and warnings).
+ * 
+ * \param fmt is format string for printk
+ * \param args... are arguments given to printk (number depends on <fmt>)
+ * \return code from printk
+ */
+#define INFO(args...) \
+        printk(KERN_INFO DRIVER_NAME_FOR_PRINT ": " args)
+
+/**
+ * \brief
+ * Macro for printing warnings in drivers
+ * 
+ * This macro is used for printing kernel messages in driver source code.
+ * It should be used for printing warnings.
+ * 
+ * \param fmt is format string for printk
+ * \param args... are arguments given to printk (number depends on <fmt>)
+ * \return code from printk
+ */
+#define WARN(args...) \
+        printk(KERN_WARNING DRIVER_NAME_FOR_PRINT " warning: " args)
+
+/**
+ * \brief
+ * Macro for printing errors in drivers
+ * 
+ * This macro is used for printing kernel messages in driver source code.
+ * It should be used for printing errors.
+ * 
+ * \param fmt is format string for printk
+ * \param args... are arguments given to printk (number depends on <fmt>)
+ * \return code from printk
+ */
+#define ERR(args...) \
+        printk(KERN_ERR DRIVER_NAME_FOR_PRINT " error: " args)
+
+/**
+ * \brief
+ * Macro for printing debug messages in drivers
+ * 
+ * This macro is used for printing kernel messages in driver source code
+ * when UDC_DEBUG is defined 
+ * It should be used for printing debug messages.
+ * 
+ * \param fmt is format string for printk
+ * \param args... are arguments given to printk (number depends on <fmt>)
+ * \return code from printk
+ */
+#ifdef UDC_DEBUG
+#define DBG(args...) \
+        printk(KERN_DEBUG DRIVER_NAME_FOR_PRINT " debug: " args)
+#else
+
+#define DBG(args...) \
+        do {} while (0)
+#endif
+
+/**
+ * \brief
+ * Macro for printing verbose debug messages in drivers
+ * 
+ * This macro is used for printing kernel messages in driver source code
+ * when UDC_DEBUG and UDC_VERBOSE is defined
+ * It should be used for printing debug messages.
+ * 
+ * \param fmt is format string for printk
+ * \param args... are arguments given to printk (number depends on <fmt>)
+ * \return code from printk
+ */
+#ifdef UDC_VERBOSE
+#define VDBG DBG
+#else
+#define VDBG(args...) \
+	do {} while (0)
+#endif
+#endif /* #ifdef  AU1200UDC_H */
diff --git a/drivers/usb/gadget/au1200uoc.c b/drivers/usb/gadget/au1200uoc.c
new file mode 100644
index 0000000..5297eee
--- /dev/null
+++ b/drivers/usb/gadget/au1200uoc.c
@@ -0,0 +1,2015 @@
+/*
+ * AMD Au1200 USB OTG controller driver
+ */
+
+/*
+ * Copyright (C) 2005 AMD (http://www.amd.com)
+ * Author: Karsten Boge 
+ *
+ * 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
+ */
+
+
+/*****************************************************************************
+ *  Includes
+ *****************************************************************************/
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/kernel.h>
+#include <linux/version.h>
+#include <linux/delay.h>
+#include <linux/ioport.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/smp_lock.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/timer.h>
+#include <linux/list.h>
+#include <linux/interrupt.h>
+
+#include <asm/byteorder.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/unaligned.h>
+
+#ifdef CONFIG_USB_OTG_TEST_INTERFACE
+#ifndef CONFIG_USB_OTG
+#define CONFIG_USB_OTG
+#endif
+#endif
+
+/* #define DEBUG */
+/* #define VERBOSE */
+
+#ifdef CONFIG_SOC_AU1200
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1000_gpio.h>
+#include <linux/platform_device.h>
+#endif
+
+#include <linux/usb.h>
+#include <linux/usb_gadget.h>
+#include <linux/usb_otg.h>
+
+#define	DRIVER_DESC		"AMD Au1200 USB OTG Controller"
+#define	DRIVER_VERSION		"01.00.0201 - $Revision: #3 $"
+#define DRIVER_NAME_FOR_PRINT   OTG_DRIVER_NAME
+
+#include "au1200otg.h"
+#include "au1200uoc.h"
+
+
+/*****************************************************************************
+ *  Function Declarations
+ *****************************************************************************/
+
+#ifdef CONFIG_USB_OTG_TEST_INTERFACE
+static int otg_test_bind(struct otg **);
+static int otg_test_unbind(struct otg **);
+#endif
+#ifdef CONFIG_USB_OTG
+static int otg_app_request(u32);
+static int otg1200_set_host (struct otg_transceiver *, struct usb_bus *);
+static int otg1200_set_power (struct otg_transceiver *, unsigned);
+static int otg1200_start_srp (struct otg_transceiver *);
+static int otg1200_start_hnp (struct otg_transceiver *);
+#endif
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+static u32 otg_app_query(int);
+static int otg1200_set_peripheral (struct otg_transceiver *,
+                                   struct usb_gadget *);
+#endif
+
+
+/*****************************************************************************
+ *  Data
+ *****************************************************************************/
+
+static const char driver_name [] = OTG_DRIVER_NAME;
+static const char driver_desc [] = DRIVER_DESC;
+
+static struct otg *the_controller;
+static const char *transceiver_label = "au1200_otg";
+
+static u32 init_state = 0;
+#ifdef OTG_HNP_ERR_LOG
+int hnp_err = 0;
+#endif
+
+#ifdef CONFIG_USB_OTG_TEST_INTERFACE
+static struct usb_otg_test_extension otg_test_extension = {
+	.bind    = otg_test_bind,
+	.unbind  = otg_test_unbind,
+	.request = otg_app_request,
+	.query   = otg_app_query
+};
+#endif
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+struct usb_otg_gadget_extension otg_gadget_extension = {
+#ifdef CONFIG_USB_OTG
+	.request = otg_app_request,
+#else
+	.request = NULL,
+#endif
+	.query   = otg_app_query,
+	.notify  = NULL
+};
+
+static u32 state_mask;
+u32 otg_tmr_high_count = 0;
+#endif
+
+#ifdef CONFIG_SOC_AU1200
+#ifdef USE_AU1200_PCI_DUMMY
+static struct pci_dev pdev_dummy;
+#endif
+#endif
+
+
+/*****************************************************************************
+ *  Function Definitions
+ *****************************************************************************/
+
+/**
+ * \brief
+ * fill OTG transceiver struct
+ *
+ * \param  transceiver  OTG transceiver
+ *
+ * \return              void
+ */
+static inline void otg_init_transceiver (struct otg_transceiver *transceiver)
+{
+        transceiver_to_otg(transceiver)->prv_state = OTG_STATE_UNDEFINED;
+	transceiver_to_otg(transceiver)->params    = 0;
+	transceiver_to_otg(transceiver)->hostcount = 0;
+	transceiver_to_otg(transceiver)->otg_priv       = (void *) &otg_gadget_extension;
+
+	transceiver->dev            = NULL;
+	transceiver->label          = transceiver_label;
+	transceiver->default_a      = 0;
+	transceiver->state          = OTG_STATE_UNDEFINED;
+	transceiver->host           = NULL;
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+	transceiver->companion      = NULL;
+#endif
+	transceiver->gadget         = NULL;
+	transceiver->port_status    = 0;
+	transceiver->port_change    = 0;
+#ifdef CONFIG_USB_OTG
+	transceiver->set_host       = otg1200_set_host;
+	transceiver->set_peripheral = otg1200_set_peripheral;
+	transceiver->set_power      = otg1200_set_power;
+	transceiver->start_srp      = otg1200_start_srp;
+	transceiver->start_hnp      = otg1200_start_hnp;
+#else
+	transceiver->set_host       = NULL;
+	transceiver->set_peripheral = otg1200_set_peripheral;
+	transceiver->set_power      = NULL;
+	transceiver->start_srp      = NULL;
+	transceiver->start_hnp      = NULL;
+#endif
+}
+
+#ifdef CONFIG_USB_OTGMUX_GADGET
+/**
+ * \brief
+ * OTG state change
+ *
+ * subset of OTG states to support the gadget only or
+ * ID pin configuration
+ *
+ * \param  otg          OTG controller info
+ * \param  event_code   event that requested a state change
+ * \param  pEvt_mask
+ *
+ * \return              events that were not handled here
+ */
+u32 otg_change_state (struct otg *otg, u32 _event, u32 *pEvt_mask)
+{
+	u32  event_code = _event;
+	u32  uoc_status = get_status (otg);
+
+	if (GOT_EVENT (OTG_GADGET_READY, event_code)
+
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+
+	    || GOT_EVENT (OTG_HOST_READY, event_code)
+#endif
+	   ) {
+
+		if (((IS_FLAG_RES (otg, OTG_GADGET_READY))
+
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+
+		     || (IS_FLAG_RES (otg, OTG_HOST_READY))
+#endif
+            )
+
+		    && ((otg->transceiver.state & OTG_STATE_MASK) !=
+		        OTG_STATE_UNDEFINED)) {
+
+			/* driver unload, back to "not ready" state          */
+
+			CHANGE_STATE (otg, OTG_STATE_UNDEFINED, pEvt_mask);
+			RES_EVENT ((OTG_GADGET_READY | OTG_HOST_READY),
+			           event_code);
+		}
+	}
+	if ((OTG_INT_TMX & event_code) && otg_tmr_high_count) {
+
+		/* a long timer is running : decrement the high part         */
+
+		restart_timer (otg);
+		otg_tmr_high_count--;
+		RES_EVENT (OTG_INT_TMX, event_code);
+	}
+
+	do switch (otg->transceiver.state & OTG_STATE_MASK) {
+
+	/* NOT_ASSIGNED (yet): init state, 1st time after loading            */
+	/* ======================================================            */
+
+	case OTG_STATE_UNDEFINED :
+
+		CHECK_STATE (otg, OTG_STATE_UNDEFINED, pEvt_mask);
+
+		if (IS_FLAG_RES (otg, OTG_FLAGS_ACTIV)) {
+
+			/* seems to be the first time: let it run !          */
+
+			SET_FLAG (otg, OTG_FLAGS_ACTIV);
+		}
+
+		/*      muxer is still neutral                               */
+
+		RES_EVENT ((OTG_GADGET_READY | OTG_HOST_READY |
+		            OTG_INT_IDC | OTG_INT_TMX), event_code);
+
+		if ((IS_FLAG_SET (otg, OTG_GADGET_READY))
+
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+
+		    || (IS_FLAG_SET (otg, OTG_HOST_READY))
+#endif
+		    ) {
+
+			/* NOT_READY (substate): drivers now ready           */
+			/* =======================================           */
+
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+
+			if (IS_BIT_RES (OTG_STS_ID, uoc_status)) {
+
+				/* ID pin connected: A-device (host)         */
+
+				CHANGE_STATE (otg, OTG_STATE_A_HOST,
+					      pEvt_mask);
+			}
+			else {
+				/* ID pin not connected: disable (neutral)   */
+#endif
+				CHANGE_STATE (otg, OTG_STATE_B_IDLE,
+					      pEvt_mask);
+
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+			}
+#endif
+		}
+		break;
+
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+
+	/* A: ID pin is connected, A-device drives VBus                      */
+	/* ============================================                      */
+
+	case OTG_STATE_A_HOST :
+
+		CHECK_STATE (otg, OTG_STATE_A_HOST, pEvt_mask);
+
+		if (IS_BIT_SET (OTG_STS_ID, uoc_status)) {
+
+			/* ID change => B_IDLE                               */
+
+			RES_EVENT ((OTG_INT_IDC | OTG_INT_PCC), event_code);
+			CHANGE_STATE (otg, OTG_STATE_B_IDLE, pEvt_mask);
+		}
+		break;
+
+	/* B: ID pin is not connected                                        */
+	/* ==========================                                        */
+#endif
+
+	case OTG_STATE_B_IDLE :
+
+		/* B_IDLE: init state for B-devices                          */
+		/*         monitor VBus, no connection, no activity          */
+
+		CHECK_STATE (otg, OTG_STATE_B_IDLE, pEvt_mask);
+
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+
+		if (IS_BIT_RES (OTG_STS_ID, uoc_status)) {
+
+			/* ID pin changed => A_HOST                          */
+
+			RES_EVENT (OTG_INT_IDC, event_code);
+			CHANGE_STATE (otg, OTG_STATE_A_HOST, pEvt_mask);
+		}
+		else if (IS_BIT_SET (OTG_STS_SESSVLD, uoc_status))
+#else
+		if (IS_BIT_SET (OTG_STS_SESSVLD, uoc_status))
+#endif
+		{
+			/* Session valid => B_PERIPHERAL                     */
+
+			RES_EVENT (OTG_INT_SVC, event_code);
+			CHANGE_STATE (otg, OTG_STATE_B_PERIPHERAL, pEvt_mask);
+#ifndef CONFIG_TEST_MODE_ONLY
+			if (otg_gadget_extension.notify) {
+				otg_gadget_extension.notify (
+					OTG_GADGET_EVT_SVALID);
+			}
+#endif
+		}
+		break;
+
+	case OTG_STATE_B_PERIPHERAL :
+
+		/* B_PERIPHERAL: connected to A-host, responding             */
+		/*               VBus driven by A, remote activity           */
+
+		CHECK_STATE (otg, OTG_STATE_B_PERIPHERAL, pEvt_mask);
+
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+
+		if (IS_BIT_RES (OTG_STS_ID, uoc_status) ||
+		    IS_BIT_RES (OTG_STS_SESSVLD, uoc_status))
+#else
+		if (IS_BIT_RES (OTG_STS_SESSVLD, uoc_status))
+#endif
+		{
+			/* ID pin changed | ~Session valid => B_IDLE         */
+
+			RES_EVENT ((OTG_INT_IDC | OTG_INT_SVC), event_code);
+			CHANGE_STATE (otg, OTG_STATE_B_IDLE, pEvt_mask);
+#ifndef CONFIG_TEST_MODE_ONLY
+			if (otg_gadget_extension.notify) {
+				otg_gadget_extension.notify (
+					OTG_GADGET_EVT_SVDROP);
+			}
+#endif
+		}
+		break;
+
+	/* unlikely */ default :
+
+		/* something went wrong */
+
+		BUG ();
+		break;
+	}
+	while ((otg->transceiver.state ^ otg->prv_state) &
+	       OTG_STATE_MASK);
+
+	DBG ("OTG-state change done\n");
+
+	return event_code;
+}
+#endif /* CONFIG_USB_OTGMUX_GADGET */
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+/**
+ * \brief
+ * OTG state change request
+ *
+ * \param  dev    OTG device info
+ * \param  params
+ *
+ * \return void
+ */
+static inline void otg_req_state_chg (struct otg *otg, u32 params)
+{
+	u32 temp, tmp2, flags;
+
+	local_irq_save (flags);
+
+	/* disable global OTG interrupt, clear int status:                   */
+	temp = ~((u32) OTG_INT_GLOBAL) & readl (&otg->regs->inten);
+	writel (temp, &otg->regs->inten);
+	tmp2 = readl (&otg->regs->intr);
+	writel (tmp2, &otg->regs->intr);
+	temp &= tmp2;
+
+	/* update OTG state:                                                 */
+	otg_change_state (otg, (params | temp), &temp);
+
+	/* enable global OTG interrupt:                                      */
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3950: gadget needs disconnect notification              ***/
+#ifdef UDC_HSA0_WORKAROUNDS
+	state_mask = ~temp & OTG_INT_ADDS;
+	writel ((OTG_INT_ADDS | temp | OTG_INT_GLOBAL), &otg->regs->inten);
+#else
+	writel ((temp | OTG_INT_GLOBAL), &otg->regs->inten);
+#endif
+	local_irq_restore (flags);
+}
+#endif /* CONFIG_USB_OTG || CONFIG_USB_OTGMUX_GADGET */
+
+#ifdef CONFIG_USB_OTG_TEST_INTERFACE
+
+/**
+ * \brief
+ * Bind the OTG controller to the test driver
+ *
+ * \param  dev   otg controller info
+ *
+ * \return error code
+ */
+static int otg_test_bind (struct otg **otg)
+{
+	*otg = the_controller;
+	if (!*otg)
+		return -EINVAL;
+#ifdef CONFIG_TEST_MODE_ONLY
+	INFO ("bind OTG driver to the test driver, enable device\n");
+	SET_FLAG (*otg, OTG_HOST_READY | OTG_GADGET_READY);
+	if (IS_FLAG_SET (*otg, OTG_FLAGS_ACTIV)) {
+		otg_req_state_chg (*otg, OTG_HOST_READY | OTG_GADGET_READY);
+	}
+	(*otg)->transceiver.gadget = (struct usb_gadget *) 1;
+#else
+	INFO ("bind OTG driver to the test interface\n");
+#endif
+	return 0;
+}
+
+/**
+ * \brief
+ * Unbind the OTG controller from the test driver
+ *
+ * \param  dev   otg controller info
+ *
+ * \return error code
+ */
+static int otg_test_unbind (struct otg **otg)
+{
+#ifdef CONFIG_TEST_MODE_ONLY
+	INFO ("unbind OTG driver from the test driver, disable device\n");
+	(*otg)->transceiver.gadget = NULL;
+	RES_FLAG (*otg, OTG_HOST_READY | OTG_GADGET_READY);
+	if (IS_FLAG_SET (*otg, OTG_FLAGS_ACTIV)) {
+		otg_req_state_chg (*otg, OTG_HOST_READY | OTG_GADGET_READY);
+	}
+	*otg = NULL;
+	return otg_unbind_gadget ();
+#else
+	INFO ("unbind OTG driver from the test interface\n");
+	*otg = NULL;
+	return 0;
+#endif
+}
+#endif /* CONFIG_USB_OTG_TEST_INTERFACE */
+
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+/**
+ * \brief
+ * OTG set transceiver:
+ *
+ * \param  pointer to transceiver struct
+ *
+ * \return void
+ */
+int otg_set_transceiver (struct otg_transceiver *transceiver)
+{
+	struct otg *otg = the_controller;
+
+	if (unlikely (transceiver != otg_to_transceiver (otg))) {
+		ERR ("USB OTG: unknown transceiver\n");
+		return -EINVAL;
+	}
+	else {
+		return 0;
+	}
+}
+
+/**
+ * \brief
+ * OTG get transceiver: provide info to others
+ *
+ * \param  void
+ *
+ * \return pointer to transceiver struct
+ */
+struct otg_transceiver * otg_get_transceiver (void)
+{
+	return otg_to_transceiver (the_controller);
+}
+#endif
+
+#ifdef CONFIG_USB_OTG
+
+/**
+ * \brief
+ * Bind/unbind the OTG controller to/from usbcore
+ *
+ * \param  transceiver  this transceiver
+ * \param  bus          usb bus the host is assigned to
+ *
+ * \return error code
+ */
+static int otg1200_set_host (struct otg_transceiver *transceiver,
+                             struct usb_bus *bus)
+{
+	struct otg *otg = the_controller;
+	int flag, count = 0;
+
+	if (unlikely (transceiver != otg_to_transceiver (otg))) {
+		ERR ("USB OTG: unknown transceiver\n");
+		return -EINVAL;
+	}
+	if (bus) {
+
+		/* This bus supports OTG */
+
+		if (transceiver->host) {
+			count++;
+		}
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+		if (transceiver->companion) {
+			count++;
+		}
+		/* Now checking consistence ...                              */
+		/* Depending on the driver loading sequence is possible      */
+		/* that the "Load state defaults" function was already       */
+		/*  called so the state could be inconsistent.               */
+		if (transceiver->host && transceiver->companion) {
+			flag = (transceiver->host->is_b_host |
+			        transceiver->companion->is_b_host);
+			if (transceiver->gadget &&
+			    !transceiver->gadget->is_a_peripheral) {
+				flag |= 1;
+			}
+			transceiver->host->is_b_host = flag;
+			transceiver->companion->is_b_host = flag;
+		}
+#endif
+		DBG ("USB OTG: bind host: bus %d, port %d (OTG host #%d)\n",
+		     bus->busnum, bus->otg_port, count);
+		if (IS_FLAG_RES (otg, OTG_HOST_READY)) {
+			RES_FLAG (otg, OTG_A_BUS_DROP);
+			SET_FLAG (otg, OTG_HOST_READY | OTG_A_BUS_REQ);
+			if (IS_FLAG_SET (otg, OTG_FLAGS_ACTIV)) {
+				otg_req_state_chg (otg, OTG_HOST_READY);
+			}
+		}
+	}
+	else {
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+		if (transceiver->companion) {
+			count++;
+		}
+#endif
+		if (transceiver->host) {
+			count++;
+		}
+		DBG ("USB OTG: unbind host (actual OTG hosts: %d)\n", count);
+		if (!count) {
+			RES_FLAG (otg, OTG_HOST_READY | OTG_A_BUS_REQ);
+			SET_FLAG (otg, OTG_A_BUS_DROP);
+			if (IS_FLAG_SET (otg, OTG_FLAGS_ACTIV)) {
+				otg_req_state_chg (otg, OTG_HOST_READY);
+			}
+		}
+	}
+	return 0;
+}
+#endif /* CONFIG_USB_OTG */
+
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+/**
+ * \brief
+ * Bind/unbind the OTG controller to/from usb gadget
+ *
+ * \param  transceiver  this transceiver
+ * \param  gadget       usb gadget info
+ *
+ * \return error code
+ */
+static int otg1200_set_peripheral (struct otg_transceiver *transceiver,
+                                   struct usb_gadget *gadget)
+{
+	struct otg *otg = the_controller;
+	int flag = 0;
+
+	if (unlikely (transceiver != otg_to_transceiver (otg))) {
+		ERR ("USB OTG: unknown transceiver\n");
+		return -EINVAL;
+	}
+	if (gadget) {
+		if (transceiver->gadget) {
+			ERR ("USB gadget: OTG driver already registered\n");
+			return -EBUSY;
+		}
+		DBG ("bind OTG driver to USB gadget\n");
+		transceiver->gadget = gadget;
+		SET_FLAG (otg, OTG_GADGET_READY | OTG_B_BUS_REQ);
+
+		/* Now checking consistence ...                              */
+		/* Depending on the driver loading sequence is possible      */
+		/* that the "Load state defaults" function was already       */
+		/*  called so the state could be inconsistent.               */
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+		if (transceiver->companion &&
+		    !transceiver->companion->is_b_host) {
+			flag |= 1;
+		}
+#endif
+		if (transceiver->host && !transceiver->host->is_b_host) {
+			flag |= 1;
+		}
+		transceiver->gadget->is_a_peripheral = flag;
+
+		if (IS_FLAG_SET (otg, OTG_FLAGS_ACTIV)) {
+			otg_req_state_chg (otg, OTG_GADGET_READY);
+		}
+		if (IS_BIT_SET (OTG_STS_SESSVLD, readl (&otg->regs->sts)) &&
+		    (otg->transceiver.state & OTG_STATE_MASK)
+		     == OTG_STATE_B_PERIPHERAL) {
+			VDBG ("calling gadget: connect\n");
+			if (otg_gadget_extension.notify) {
+				otg_gadget_extension.notify (
+				OTG_GADGET_EVT_SVALID);
+			}
+		}
+		return 0;
+	}
+	else {
+		DBG ("unbind OTG driver from USB gadget\n");
+		RES_FLAG (otg, OTG_GADGET_READY | OTG_B_BUS_REQ);
+		if (IS_FLAG_SET (otg, OTG_FLAGS_ACTIV)) {
+			otg_req_state_chg (otg, OTG_GADGET_READY);
+		}
+		transceiver->gadget = NULL;
+		return 0;
+	}
+}
+#endif /* CONFIG_USB_OTGMUX || CONFIG_USB_OTGMUX_GADGET */
+
+#ifdef CONFIG_USB_OTG
+
+/**
+ * \brief
+ * Set host controllers power budget
+ *
+ * \param  transceiver  this transceiver
+ * \param  mA           value to fill in
+ *
+ * \return error code
+ */
+static int otg1200_set_power (struct otg_transceiver *transceiver,
+                              unsigned mA)
+{
+	struct otg *otg = the_controller;
+
+	if (unlikely (transceiver != otg_to_transceiver (otg))) {
+		ERR ("USB OTG: unknown transceiver\n");
+		return -EINVAL;
+	}
+	/* TODO kboge: do we need to support this ?                          */
+
+	DBG ("USB OTG: power budget change not supported\n");
+	return 0;
+}
+
+/**
+ * \brief
+ * Start a HNP request
+ *
+ * \param  transceiver  this transceiver
+ *
+ * \return error code
+ */
+static int otg1200_start_hnp (struct otg_transceiver *transceiver)
+{
+	struct otg *otg = the_controller;
+
+	if (unlikely (transceiver != otg_to_transceiver (otg))) {
+		ERR ("USB OTG: unknown transceiver\n");
+		return -ENODEV;
+	}
+	if (transceiver->default_a
+	    && (!transceiver->host || !transceiver->host->b_hnp_enable)
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+	    && (!transceiver->companion || !transceiver->companion->b_hnp_enable)
+#endif
+	   )
+		return -ENOTCONN;
+	if (!transceiver->default_a &&
+	    (!transceiver->gadget || !transceiver->gadget->b_hnp_enable))
+		return -ENOTCONN;
+
+	switch (transceiver->state & OTG_STATE_MASK) {
+	case OTG_STATE_B_HOST:
+	case OTG_STATE_A_HOST:
+	case OTG_STATE_A_PERIPHERAL:
+		break;
+	default:
+		ERR ("USB OTG: wrong OTG state for role swap\n");
+		return -EILSEQ;
+	}
+	return 0;
+}
+
+/**
+ * \brief
+ * Start a SRP request
+ *
+ * \param  transceiver  this transceiver
+ *
+ * \return error code
+ */
+static int otg1200_start_srp (struct otg_transceiver *transceiver)
+{
+	struct otg *otg = the_controller;
+
+	if (unlikely (transceiver != otg_to_transceiver (otg))) {
+		ERR ("USB OTG: unknown transceiver\n");
+		return -EINVAL;
+	}
+	if ((transceiver->state & OTG_STATE_MASK) != OTG_STATE_B_IDLE) {
+		RES_FLAG (otg, OTG_B_aSSN_REQ);
+		ERR ("USB OTG: wrong OTG state for SRP\n");
+		return -EBUSY;
+	}
+	SET_FLAG (otg, OTG_B_aSSN_REQ);
+	otg_req_state_chg (otg, OTG_B_aSSN_REQ);
+	return 0;
+}
+
+/**
+ * \brief
+ * Start a USB host enumeration
+ *
+ * \param  transceiver  this transceiver
+ *
+ * \return error code
+ */
+int otg_hnp_start_enum (struct otg_transceiver *transceiver)
+{
+	struct otg *otg = the_controller;
+	struct usb_bus *bus;
+	int status = 0;
+
+	if (unlikely (transceiver != otg_to_transceiver (otg))) {
+		ERR ("USB OTG: unknown transceiver\n");
+		return -EINVAL;
+	}
+	if (otg->transceiver.state == OTG_STATE_B_HOST) {
+
+		bus = otg->transceiver.host;
+
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+
+		if (!bus || !bus->is_b_host) {
+			bus = otg->transceiver.companion;
+		}
+#endif
+		if (bus && bus->is_b_host) {
+			DBG ("USB OTG: in HNP, start enumeration ...\n");
+			status = usb_bus_start_enum (bus, bus->otg_port);
+		}
+		else {
+			DBG ("USB OTG: no device to enumerate\n");
+		}
+	}
+	else {
+		DBG ("USB OTG: in HNP: wrong state %02x\n",
+		      otg->transceiver.state);
+	}
+	return status;
+}
+
+/**
+ * \brief
+ * OTG application request
+ *
+ * \param  params
+ *
+ * \return OTG_APP_REQ_ACK
+ */
+static int otg_app_request (u32 params)
+{
+	struct otg *otg = the_controller;
+	u32  flags = params;
+	struct usb_bus *bus;
+
+	if (OTG_UDC_RWK_REQ & flags) {
+
+		if (otg_gadget_extension.notify) {
+			otg_gadget_extension.notify (OTG_GADGET_REQ_WAKE);
+		}
+		flags &= ~((u32) OTG_UDC_RWK_REQ);
+	}
+
+	if (OTG_AB_HNP_REQ & flags) {
+
+		/* request HNP */
+
+		bus = otg->transceiver.host;
+		if (!bus->b_hnp_enable) {
+
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+			bus = otg->transceiver.companion;
+		}
+		if (!bus->b_hnp_enable) {
+#endif
+			INFO ("HNP not enabled, ignoring request\n");
+		}
+		else {
+			if (!otg1200_start_hnp (&otg->transceiver) &&
+			    bus->root_hub->children [bus->otg_port - 1]) {
+				usb_suspend_device (bus->root_hub->children [bus->otg_port - 1],
+				                    PM_SUSPEND_MEM);
+			}
+			else {
+				ERR ("no device found for HNP\n");
+			}
+		}
+		flags &= ~((u32) OTG_AB_HNP_REQ);
+	}
+
+	if (OTG_A_CLR_ERR & flags) {
+
+		/* request to clear error flags                              */
+
+		flags |= OTG_A_VBUS_FAILED;
+	}
+
+	/* create mask of flags to clear                                     */
+
+	flags &= (OTG_B_SRP_ERROR | OTG_A_VBUS_FAILED);
+
+	if (flags) {
+
+		/* reset error flags if requested                            */
+
+		RES_FLAG (otg, (flags));
+	}
+
+	/* prepare for pending requests (no more actions on OTG_A_bHNP_EN)   */
+
+	flags = params & SW_REQUEST_MASK;
+	SET_FLAG (otg, (flags));
+
+	if (OTG_A_BUS_DROP & flags) {
+
+		/* request to drop A-VBus: reset "rise" request if pending   */
+
+		flags &= ~OTG_A_BUS_REQ;
+		RES_FLAG (otg, OTG_A_BUS_REQ);
+	}
+	if (OTG_A_BUS_REQ & flags) {
+
+		/* request to rise A-VBus: reset "drop" request if pending   */
+
+		RES_FLAG (otg, OTG_A_BUS_DROP);
+	}
+	if (OTG_B_BUS_DIS & flags) {
+
+		/* request to disable B-dev: reset "ena" request if pending  */
+
+		flags &= ~OTG_B_BUS_REQ;
+		RES_FLAG (otg, OTG_B_BUS_REQ);
+	}
+	if (OTG_B_BUS_REQ & flags) {
+
+		/* request to enable B-dev: reset "disa" request if pending  */
+
+		RES_FLAG (otg, OTG_B_BUS_DIS);
+	}
+	if (flags) {
+
+		/* request still pending may force a state change            */
+
+		otg_req_state_chg (otg, flags);
+	}
+	return OTG_APP_REQ_ACK;
+}
+#endif /* CONFIG_USB_OTG */
+
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+/**
+ * \brief
+ * OTG application query
+ *
+ * \param  index   select status info data
+ *
+ * \return status
+ */
+static u32 otg_app_query (int index)
+{
+	struct otg *otg = the_controller;
+	u32  temp = 0;
+
+	if (index == 0) {
+		temp = otg->params |
+		       readl (&otg->regs->sts);
+
+/*** HS-A0 WA: BUG-3943: gadget phy suspend issue                          ***/
+#ifdef UDC_HSA0_WORKAROUNDS
+		if (((readl (&otg->regs->ctl) & OTG_CTL_MUX_MASK) ==
+		     OTG_CTL_ENABLE_UDC) &&
+		    ((temp & OTG_STS_PSUS) || (~temp & OTG_STS_VBUSVLD))) {
+			temp |= OTG_FLAGS_UDC_SUSP;
+		}
+#endif
+	}
+	else if (index == 1) {
+		temp = otg->transceiver.state;
+	}
+#ifdef OTG_HNP_ERR_LOG
+    if (hnp_err) {
+        temp |= OTG_FLAGS_HNP_ERR;
+    }
+#endif
+	return temp;
+}
+
+/**
+ * \brief
+ * OTG ISR calling the main state machine
+ *
+ * \param  irq    IRQ number
+ * \param  _dev  
+ * \param  r     
+ *
+ * \return IRQ_HANDLED (system code)
+ */
+static irqreturn_t otg_isr (int irq, void *dev, struct pt_regs *r)
+{
+	struct otg *otg = (struct otg *) dev;
+	u32         interrupts, int_mask, temp;
+
+	int_mask = readl (&otg->regs->inten);
+	if ((OTG_INT_GLOBAL & int_mask) &&
+	    (int_mask &= ~((u32) OTG_INT_GLOBAL)) &&
+	    (interrupts = int_mask &
+		          (temp = readl (&otg->regs->intr)))) {
+
+		writel (int_mask, &otg->regs->inten);
+		/* clear interrupt status */
+		writel (temp, &otg->regs->intr);
+/*
+#ifdef CONFIG_USB_OTG
+
+		if (GOT_EVENT (OTG_INT_PCC, interrupts) &&
+		    IS_BIT_SET (OTG_STS_PCON, readl (&otg->regs->sts))) {
+			otg_hnp_start_enum (&otg->transceiver);
+		}
+#endif */
+		/* filter out additional WA interrupts, they're done         */
+		/*       don't want to see them in the state machine         */
+
+		if (interrupts & ~state_mask) {
+
+			/* events pending for the state machine              */
+
+			otg_change_state (otg, (interrupts & ~state_mask),
+			                  &int_mask);
+		}
+
+		/* enable interrupts and keep information about WA ints:     */
+
+		state_mask = OTG_INT_ADDS & ~int_mask;
+		writel ((OTG_INT_ADDS | int_mask | OTG_INT_GLOBAL),
+		        &otg->regs->inten);
+	}
+	return IRQ_HANDLED;
+}
+#endif /* CONFIG_USB_OTG || CONFIG_USB_OTGMUX_GADGET */
+
+/**
+ * \brief
+ * OTG probe: init hardware, register the driver
+ *
+ * \param  otg   otg controller info
+ *
+ * \return  success
+ */
+static inline int __init otg_probe (struct otg *otg)
+{
+	int         retval;
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+	u32         temp;
+	int         i;
+#endif
+
+	/* initialize the OTG controller */
+
+	VDBG ("OTG init ...\n");
+
+#ifdef VERBOSE
+	/* print regs */
+	print_regs (otg);
+#endif
+	/* Make sure we'll remember the initial state                        */
+	init_state = readl (&otg->regs->ctl);
+	VDBG ("  OTG init state was %08x\n", init_state);
+
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	/* turn on the OTG controller                                        */
+
+	writel ((init_state | OTG_CTL_PADEN), &otg->regs->ctl);
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+#ifndef UDC_HSA0_WORKAROUNDS
+
+	/* Enable OTG hardware (incl. auto pull-up enable)                   */
+
+	writel ((readl (&dev->regs->cap) | OTG_CAP_APU), &otg->regs->cap);
+#endif
+
+	/* initialize flags                                                  */
+	otg->params = 0;
+#endif
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	/* make sure all interrupts are disabled                             */
+
+	writel (OTG_INT_DISALL, &otg->regs->inten);
+	writel (OTG_INT_ENALL, &otg->regs->intr);
+
+	/* Set multiplexer to neutral, get power control, drop VBus          */
+
+	if (((init_state & OTG_CTL_MUX_MASK) == OTG_CTL_ENABLE_UHC) &&
+	    ((((init_state & OTG_CTL_PPO) && (init_state & OTG_CTL_PPWR))) ||
+	     ((~init_state & OTG_CTL_PPO) &&
+	      (readl (&otg->regs->sts) & OTG_STS_SESSVLD)))) {
+
+		/* VBus still powered try to discharge VBus and set timer    */
+
+		DBG ("Setting init state, trying to discharge VBus ...\n");
+
+		for (i = 0; i < 4; i++) {
+			writel (TIMER_PERIOD, &otg->regs->tmr);
+			writel ((OTG_CTL_PADEN | OTG_CTL_IDSNSEN |
+			         OTG_CTL_PPO | OTG_CTL_DISCHRG |
+			         OTG_CTL_TMR_UNCOND), &otg->regs->ctl);
+			do { }
+			while (!(readl (&otg->regs->sts) & OTG_STS_TMH));
+		}
+		writel ((OTG_CTL_PADEN | OTG_CTL_IDSNSEN | OTG_CTL_PPO),
+		        &otg->regs->ctl);
+		writel (OTG_INT_ENALL, &otg->regs->intr);
+#ifdef DEBUG
+		if (readl (&otg->regs->sts) & OTG_STS_SESSVLD) {
+
+			DBG ("  VBus still high, external host connected\n");
+		}
+		else {
+
+			DBG ("  VBus discharged\n");
+		}
+#endif
+	}
+	else {
+		DBG ("Setting init state\n");
+
+		writel ((OTG_CTL_PADEN | OTG_CTL_IDSNSEN | OTG_CTL_PPO),
+		        &otg->regs->ctl);
+	}
+#endif /* CONFIG_USB_OTG || CONFIG_USB_OTGMUX_GADGET */
+
+#ifdef CONFIG_USB_OTGMUX_HOST
+
+	/* Set multiplexer to host                                           */
+	writel ((readl (&otg->regs->cap) & ~((u32) OTG_CAP_APU)),
+	        &otg->regs->cap);
+
+#ifdef CONFIG_SOC_AU1200
+
+	writel ((OTG_CTL_ENABLE_UHC | OTG_CTL_PPO | OTG_CTL_PPWR),
+	        &otg->regs->ctl);
+
+	/* Turn on VBus                                                      */
+	AU1000GPIO_CLR_BIT (USB_VBUS_GPIO);
+#else
+	writel (OTG_CTL_ENABLE_UHC, &otg->regs->ctl);
+#endif
+
+	INFO ("OTG functionality is disabled, port is assigned to host\n");
+#endif
+	VDBG ("OTG init done\n");
+
+#ifdef CONFIG_USB_OTG_TEST_INTERFACE
+
+	/* registering to the test driver */
+	usb_otg_test_register_driver (&otg_test_extension);
+#endif
+#ifndef CONFIG_TEST_MODE_ONLY
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	/* registering to the device driver */
+	if (usb_gadget_register_otg (otg_get_transceiver)) {
+		ERR ("gadget driver registration failed\n");
+		retval = -ENODEV;
+		goto err1;
+	}
+#endif
+#ifdef CONFIG_USB_OTG
+
+	/* registering to the usbcore */
+	if (usb_host_register_otg (otg_get_transceiver)) {
+		ERR ("usbcore registration failed\n");
+		retval = -ENODEV;
+		goto err2;
+	}
+#endif
+#endif
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	/* finally activate OTG functionality */
+	/* Enable timer interrupt, start timer, set state                    */
+
+	SET_OTG_TIMER (otg, IDSNS_WAIT);
+	CHANGE_STATE (otg, OTG_STATE_UNDEFINED, &temp);
+	CHECK_STATE (otg, OTG_STATE_UNDEFINED, &temp);
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget needs disconnect notification              ***/
+
+	/* clear all interrupts before enable */
+	writel (readl (&otg->regs->intr), &otg->regs->intr);
+
+	state_mask = ~temp & OTG_INT_ADDS;
+	writel ((OTG_INT_ADDS | temp | OTG_INT_GLOBAL), &otg->regs->inten);
+
+	DBG ("OTG-HW initialized, now checking ID ...\n");
+#endif
+
+	return 0;
+
+#ifndef CONFIG_TEST_MODE_ONLY
+#ifdef CONFIG_USB_OTG
+
+err2:
+
+#endif
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	usb_gadget_unregister_otg ();
+err1:
+
+#endif
+#endif
+#ifdef CONFIG_USB_OTG_TEST_INTERFACE
+
+	usb_otg_test_unregister_driver ();
+#endif
+	return retval;
+}
+
+/**
+ * \brief
+ * OTG remove: deregister the driver, clean-up hardware
+ *
+ * \param  otg   otg controller info
+ *
+ * \return void
+ */
+static inline void __exit otg_remove (struct otg *otg)
+{
+	int muxer;
+
+#ifndef CONFIG_TEST_MODE_ONLY
+#ifdef CONFIG_USB_OTG
+
+	/* unregistering from the usb core */
+	usb_host_deregister_otg ();
+#endif
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	/* unregistering from the usb gadget */
+	usb_gadget_unregister_otg ();
+
+#endif
+#endif
+#ifdef CONFIG_USB_OTG_TEST_INTERFACE
+
+	/* unregistering from the test driver */
+	usb_otg_test_unregister_driver ();
+#endif
+
+	/* clean up the OTG controller */
+
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	/* Disable all interrupts                                            */
+	writel (OTG_INT_DISALL, &otg->regs->inten);
+	writel (OTG_INT_ENALL, &otg->regs->intr);
+
+	/* reset state, terminate all connections                            */
+	CHANGE_STATE (otg, OTG_STATE_UNDEFINED, &state_mask);
+	CHECK_STATE (otg, OTG_STATE_UNDEFINED, &state_mask);
+	otg->params = 0;
+#endif
+
+	muxer = init_state & (OTG_CTL_ENABLE_UHC | OTG_CTL_ENABLE_UDC);
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+#ifdef UDC_HSA0_WORKAROUNDS
+
+	/* Don't assign the port to the device controller                    */
+
+	if (!(muxer ^ OTG_CTL_ENABLE_UDC)) {
+
+		init_state &= ~((u32) (OTG_CTL_MUX_MASK | OTG_CTL_PUEN));
+		muxer = OTG_CTL_DISABLE_ALL;
+	}
+	VDBG ("OTG writing back corrected init state: %08x\n", init_state);
+#else
+	/* Reset APU                                                         */
+
+	writel ((readl (&otg->regs->cap) & ~((u32) OTG_CAP_APU)),
+	        &otg->regs->cap);
+
+	VDBG ("OTG writing back init state: %08x\n", init_state);
+#endif
+	/* Now, that's the moment to remember                                */
+	/* Set dev muxer and pull up bits, turn off the OTG controller       */
+
+#ifdef CONFIG_SOC_AU1200
+
+	/* Turn off VBus                                                     */
+	AU1000GPIO_SET_BIT (USB_VBUS_GPIO);
+#endif
+	writel (init_state, &otg->regs->ctl);
+
+	if (!(muxer ^ OTG_CTL_ENABLE_UHC)) {
+		INFO ("disabling OTG-HW, port is assigned to host\n");
+	}
+	else if (!(muxer ^ OTG_CTL_ENABLE_UDC)) {
+		INFO ("disabling OTG-HW, port is assigned to device\n");
+	}
+	else {
+		INFO ("disabling OTG-HW, port is not assigned\n");
+	}
+
+	VDBG ("OTG exit: OTG-HW disabled\n");
+
+	if (!muxer) {
+		INFO ("OTG HW disabled, port is not assigned\n");
+	}
+}
+
+#ifdef CONFIG_SOC_AU1200
+#ifdef USE_AU1200_PCI_DUMMY
+
+/**
+ * \brief
+ * OTG dev probe: enable, init controller hardware
+ *
+ * \param pdev   dummy pci device pointer
+ *
+ * \return  success
+ */
+static int __init otg_pci_probe (struct pci_dev *pdev)
+{
+	struct otg *otg;
+	void       *base;
+	int         retval;
+	char        buf [8] = {0,0,0,0,0,0,0,0}, *bufp;
+
+	/* alloc, and start init */
+	otg = (struct otg *) kmalloc (sizeof(struct otg), SLAB_KERNEL);
+	if (!otg) {
+		ERR ("couldn't allocate memory for OTG driver\n");
+		retval = -ENOMEM;
+		goto err1;
+	}
+	DBG ( "kmalloc: OTG driver: %p\n", otg);
+
+	/* hold global device pointer */
+	the_controller = otg;
+
+	memset (otg, 0, sizeof(struct otg));
+	spin_lock_init (&otg->lock);
+
+	/*
+	* Fill in the dummy pci_dev. Only those members actually
+	* dereferenced in this driver are initialized.
+	*/
+	memset(pdev, 0, sizeof(struct pci_dev));
+	pdev->resource[0].name = "UOC Registers";
+	pdev->resource[0].start = USB_UOC_BASE;
+	pdev->resource[0].end = USB_UOC_BASE + USB_UOC_LEN - 1;
+	pdev->resource[0].flags = 0;
+	pdev->irq = AU1200_USB_INT;
+
+	otg->pdev = pdev;
+
+	au_writel ((au_readl (USB_MSR_BASE + USB_MSR_MCFG) |
+	            (1 << USBMSRMCFG_GMEMEN)), (USB_MSR_BASE + USB_MSR_MCFG));
+	au_readl (USB_MSR_BASE + USB_MSR_MCFG);
+	/* au_sync (); */
+	udelay (1000);
+	if (AU1000GPIO_INIT_BIT (USB_VBUS_GPIO))
+		WARN ("Couldn't initialize power switch GPIO\n");
+	otg->enabled = 1;
+
+	if (!request_mem_region (pdev->resource[0].start,
+	                         pdev->resource[0].end + 1
+	                         - pdev->resource[0].start,
+	                         driver_name)) {
+		ERR ("controller already in use\n");
+		retval = -EBUSY;
+		goto err3;
+	}
+	otg->region = 1;
+
+	base = ioremap_nocache (pdev->resource[0].start,
+	                        pdev->resource[0].end + 1
+	                        - pdev->resource[0].start);
+	if (!base) {
+		ERR ("couldn't map memory\n");
+		retval = -EFAULT;
+		goto err4;
+	}
+	otg->regs = (struct otg_regs *) base;
+	bufp = buf;
+
+	otg->chiprev = (u16) read_c0_prid() & 0xff;
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	/* OTG transceiver info */
+	otg->transceiver.dev = &pdev->dev;
+	otg_init_transceiver (otg_to_transceiver (otg));
+
+	/* make sure all interrupts are disabled */
+	writel (OTG_INT_DISALL, &otg->regs->inten);
+	writel (OTG_INT_ENALL, &otg->regs->intr);
+	readl (&otg->regs->inten);
+
+	/* irq setup after old hardware is cleaned up */
+	if (!pdev->irq) {
+		ERR ("No IRQ. Check system setup!\n");
+		retval = -ENODEV;
+		goto err5;
+	}
+	snprintf (buf, sizeof buf, "%d", pdev->irq);
+	bufp = buf;
+	if (request_irq (pdev->irq, otg_isr, SA_INTERRUPT | SA_SHIRQ,
+	                 driver_name, otg) != 0) {
+		ERR ("request interrupt %s failed\n", bufp);
+		retval = -EBUSY;
+		goto err5;
+	}
+	otg->got_irq = 1;
+
+	/* done */
+	INFO ("%s\n", driver_desc);
+	INFO ("irq %s, mem %08lx, chip rev %02x (Au1200 %s)\n",
+	      bufp, pdev->resource[0].start, otg->chiprev,
+	      (otg->chiprev ? "AC" : "AB"));
+
+#else /* CONFIG_USB_OTG || CONFIG_USB_OTGMUX_GADGET */
+
+	INFO ("%s\n", driver_desc);
+	INFO ("mem %08lx, chip rev %02x (Au1200 %s)\n",
+	      pdev->resource[0].start, otg->chiprev,
+	      (otg->chiprev ? "AC" : "AB"));
+#endif
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_IDPIN) || defined(CONFIG_USB_OTGMUX_HOST)
+
+	INFO ("using GPIO_%d for VBus control\n", USB_VBUS_GPIO);
+#endif
+	bufp = DRIVER_VERSION;
+	INFO ("driver version: %s\n", bufp);
+
+	if ((retval = otg_probe (otg)) == 0) {
+		pci_set_drvdata (pdev, otg);
+		return 0;
+	}
+
+	/* something went wrong */
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	otg->got_irq = 0;
+	free_irq (pdev->irq, otg);
+err5:
+
+#endif
+	otg->regs = NULL;
+	iounmap (base);
+err4:
+	otg->region = 0;
+	release_mem_region (pdev->resource[0].start,
+	                    pdev->resource[0].end + 1
+	                    - pdev->resource[0].start);
+err3:
+	otg->enabled = 0;
+	AU1000GPIO_TERM_BIT (USB_VBUS_GPIO);
+	au_writel ((au_readl (USB_MSR_BASE + USB_MSR_MCFG) &
+	            ~((u32) (1 << USBMSRMCFG_GMEMEN))),
+	           (USB_MSR_BASE + USB_MSR_MCFG));
+	au_readl (USB_MSR_BASE + USB_MSR_MCFG);
+	/* au_sync (); */
+	udelay (1000);
+
+	otg->pdev = NULL;
+	the_controller = NULL;
+	DBG ( "kfree: OTG driver: %p\n", otg);
+	kfree (otg);
+err1:
+	otg = NULL;
+	return retval;
+}
+
+/**
+ * \brief
+ * OTG dev remove: clean-up, disable controller hardware
+ *
+ * \param  pdev   dummy pci device info
+ *
+ * \return void
+ */
+static void __exit otg_pci_remove (struct pci_dev *pdev)
+{
+	struct otg *otg = pci_get_drvdata (pdev);
+
+	otg_remove (otg);
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	otg->got_irq = 0;
+	free_irq (pdev->irq, otg);
+#endif
+	iounmap (otg->regs);
+	otg->regs = NULL;
+	otg->region = 0;
+	release_mem_region (pdev->resource[0].start,
+	                    pdev->resource[0].end + 1
+	                    - pdev->resource[0].start);
+	otg->enabled = 0;
+	AU1000GPIO_TERM_BIT (USB_VBUS_GPIO);
+/*	au_writel ((au_readl (USB_MSR_BASE + USB_MSR_MCFG) &
+	            ~((u32) (1 << USBMSRMCFG_GMEMEN))),
+	           (USB_MSR_BASE + USB_MSR_MCFG)); */
+	au_readl (USB_MSR_BASE + USB_MSR_MCFG);
+	/* au_sync (); */
+	udelay (1000);
+	otg->pdev = NULL;
+	the_controller = NULL;
+	DBG ( "kfree: OTG driver: %p\n", otg);
+	kfree (otg);
+	otg = NULL;
+	pci_set_drvdata(pdev, NULL);
+}
+#else
+
+/**
+ * \brief
+ * OTG dev probe: enable, init controller hardware
+ *
+ * \param  dev   platform device info
+ *
+ * \return success
+ */
+static int __init otg_drv_probe (struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct otg *otg;
+	u32         resource, len, irq;
+	void       *base;
+	int         retval;
+	char        buf [8] = {0,0,0,0,0,0,0,0}, *bufp;
+
+	/* alloc, and start init */
+	otg = (struct otg *) kmalloc (sizeof(struct otg), SLAB_KERNEL);
+	if (!otg) {
+		ERR ("couldn't allocate memory for OTG driver\n");
+		retval = -ENOMEM;
+		goto err1;
+	}
+	DBG ( "kmalloc: OTG driver: %p\n", otg);
+
+	/* hold global device pointer */
+	the_controller = otg;
+
+	memset (otg, 0, sizeof(struct otg));
+	spin_lock_init (&otg->lock);
+
+	if (pdev->resource[0].flags != IORESOURCE_MEM) {
+		ERR ("resource is not IORESOURCE_MEM\n");
+		retval = -ENOMEM;
+		goto err2;
+	}
+	resource = pdev->resource[0].start;
+	len = pdev->resource[0].end + 1 - pdev->resource[0].start;
+	if (pdev->resource[1].flags != IORESOURCE_IRQ) {
+		ERR ("resource is not IORESOURCE_IRQ\n");
+		retval = -ENOMEM;
+		goto err2;
+	}
+	irq = pdev->resource[1].start;
+
+	otg->pdev = pdev;
+
+	au_writel ((au_readl (USB_MSR_BASE + USB_MSR_MCFG) |
+	            (1 << USBMSRMCFG_GMEMEN)), (USB_MSR_BASE + USB_MSR_MCFG));
+	au_readl (USB_MSR_BASE + USB_MSR_MCFG);
+	/* au_sync (); */
+	udelay (1000);
+	if (AU1000GPIO_INIT_BIT (USB_VBUS_GPIO))
+		WARN ("Couldn't initialize power switch GPIO\n");
+	otg->enabled = 1;
+
+	if (!request_mem_region (resource, len, driver_name)) {
+		ERR ("controller already in use\n");
+		retval = -EBUSY;
+		goto err3;
+	}
+	otg->region = 1;
+
+	base = ioremap_nocache (resource, len);
+	if (!base) {
+		ERR ("couldn't map memory\n");
+		retval = -EFAULT;
+		goto err4;
+	}
+	otg->regs = (struct otg_regs *) base;
+	bufp = buf;
+
+	otg->chiprev = (u16) read_c0_prid() & 0xff;
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	/* OTG transceiver info */
+	otg->transceiver.dev = dev;
+	otg_init_transceiver (otg_to_transceiver (otg));
+
+	/* make sure all interrupts are disabled */
+	writel (OTG_INT_DISALL, &otg->regs->inten);
+	writel (OTG_INT_ENALL, &otg->regs->intr);
+	readl (&otg->regs->inten);
+
+	/* irq setup after old hardware is cleaned up */
+	if (!irq) {
+		ERR ("No IRQ. Check system setup!\n");
+		retval = -ENODEV;
+		goto err5;
+	}
+	snprintf (buf, sizeof buf, "%d", irq);
+	bufp = buf;
+	if (request_irq (irq, otg_isr, SA_INTERRUPT | SA_SHIRQ,
+	                 driver_name, otg) != 0) {
+		ERR ("request interrupt %s failed\n", bufp);
+		retval = -EBUSY;
+		goto err5;
+	}
+	otg->got_irq = 1;
+
+	/* done */
+	INFO ("%s\n", driver_desc);
+	INFO ("irq %s, mem %08x, chip rev %02x (Au1200 %s)\n",
+	      bufp, resource, otg->chiprev, (otg->chiprev ? "AC" : "AB"));
+
+#else /* CONFIG_USB_OTG || CONFIG_USB_OTGMUX_GADGET */
+
+	INFO ("%s\n", driver_desc);
+	INFO ("mem %08x, chip rev %02x (Au1200 %s)\n",
+	      resource, otg->chiprev, (otg->chiprev ? "AC" : "AB"));
+#endif
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_IDPIN) || defined(CONFIG_USB_OTGMUX_HOST)
+
+	INFO ("using GPIO_%d for VBus control\n", USB_VBUS_GPIO);
+#endif
+	bufp = DRIVER_VERSION;
+	INFO ("driver version: %s\n", bufp);
+
+	if ((retval = otg_probe (otg)) == 0) {
+		dev_set_drvdata (dev, otg);
+		return 0;
+	}
+
+	/* something went wrong */
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	otg->got_irq = 0;
+	free_irq (irq, otg);
+err5:
+
+#endif
+	otg->regs = NULL;
+	iounmap (base);
+err4:
+	otg->region = 0;
+	release_mem_region (resource, len);
+err3:
+	otg->enabled = 0;
+	AU1000GPIO_TERM_BIT (USB_VBUS_GPIO);
+	au_writel ((au_readl (USB_MSR_BASE + USB_MSR_MCFG) &
+	            ~((u32) (1 << USBMSRMCFG_GMEMEN))),
+	           (USB_MSR_BASE + USB_MSR_MCFG));
+	au_readl (USB_MSR_BASE + USB_MSR_MCFG);
+	/* au_sync (); */
+	udelay (1000);
+err2:
+	otg->pdev = NULL;
+	the_controller = NULL;
+	DBG ( "kfree: OTG driver: %p\n", otg);
+	kfree (otg);
+err1:
+	otg = NULL;
+
+	return retval;
+}
+
+/**
+ * \brief
+ * OTG dev remove: clean-up, disable controller hardware
+ *
+ * \param  dev   platform device info
+ *
+ * \return void
+ */
+static int __exit otg_drv_remove (struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct otg *otg = dev_get_drvdata (dev);
+
+	otg_remove (otg);
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	otg->got_irq = 0;
+	free_irq (pdev->resource[1].start, otg);
+#endif
+	iounmap (otg->regs);
+	otg->regs = NULL;
+	otg->region = 0;
+	release_mem_region (pdev->resource[0].start,
+	                    pdev->resource[0].end + 1
+	                    - pdev->resource[0].start);
+	otg->enabled = 0;
+	AU1000GPIO_TERM_BIT (USB_VBUS_GPIO);
+/*	au_writel ((au_readl (USB_MSR_BASE + USB_MSR_MCFG) &
+	            ~((u32) (1 << USBMSRMCFG_GMEMEN))),
+	           (USB_MSR_BASE + USB_MSR_MCFG)); */
+	au_readl (USB_MSR_BASE + USB_MSR_MCFG);
+	/* au_sync (); */
+	udelay (1000);
+	otg->pdev = NULL;
+	the_controller = NULL;
+	DBG ( "kfree: OTG driver: %p\n", otg);
+	kfree (otg);
+	otg = NULL;
+	dev_set_drvdata(dev, NULL);
+	return 0;
+}
+#endif
+#else
+#ifdef CONFIG_PCI
+
+/**
+ * \brief
+ * OTG PCI probe: enable, init controller hardware
+ *
+ * \param  pdev   pci device info
+ * \param  id     pci ids
+ *
+ * \return  success
+ */
+static int __init otg_pci_probe (struct pci_dev *pdev,
+                                 const struct pci_device_id *id)
+{
+	struct otg *otg;
+	u32         resource, len;
+	void       *base;
+	int         retval;
+	char        buf [8] = {0,0,0,0,0,0,0,0}, *bufp;
+
+	/* alloc, and start init */
+	otg = (struct otg *) kmalloc (sizeof(struct otg), SLAB_KERNEL);
+	if (!otg) {
+		ERR ("couldn't allocate memory for OTG driver\n");
+		retval = -ENOMEM;
+		goto err1;
+	}
+	DBG ( "kmalloc: OTG driver: %p\n", otg);
+
+	/* hold global device pointer */
+	the_controller = otg;
+
+	memset (otg, 0, sizeof(struct otg));
+	spin_lock_init (&otg->lock);
+
+	otg->pdev = pdev;
+
+	/* now all the pci goodies ...                                       */
+	if (pci_enable_device (pdev) < 0) {
+		ERR ("couldn't enable PCI device\n");
+		retval = -ENODEV;
+		goto err2;
+	}
+	otg->enabled = 1;
+
+	resource = pci_resource_start (pdev, 0);
+	len = pci_resource_len (pdev, 0);
+
+	if (!request_mem_region (resource, len, driver_name)) {
+		ERR ("controller already in use\n");
+		retval = -EBUSY;
+		goto err3;
+	}
+	otg->region = 1;
+
+	base = ioremap_nocache (resource, len);
+	if (!base) {
+		ERR ("couldn't map memory\n");
+		retval = -EFAULT;
+		goto err4;
+	}
+	otg->regs = (struct otg_regs *) base;
+	bufp = buf;
+
+	pci_read_config_byte (pdev, PCI_REVISION_ID, (u8*) &otg->chiprev);
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	/* OTG transceiver info */
+
+	otg->transceiver.dev = &pdev->dev;
+	otg_init_transceiver (otg_to_transceiver (otg));
+
+	/* make sure all interrupts are disabled */
+	writel (OTG_INT_DISALL, &otg->regs->inten);
+	writel (OTG_INT_ENALL, &otg->regs->intr);
+	readl (&otg->regs->inten);
+
+	/* irq setup after old hardware is cleaned up */
+	if (!pdev->irq) {
+		ERR ("No IRQ. Check PCI setup!\n");
+		retval = -ENODEV;
+		goto err5;
+	}
+#ifndef __sparc__
+	snprintf (buf, sizeof buf, "%d", pdev->irq);
+	bufp = buf;
+#else
+	bufp = __irq_itoa(pdev->irq);
+#endif
+	if (request_irq (pdev->irq, otg_isr, SA_INTERRUPT | SA_SHIRQ,
+	                 driver_name, otg) != 0) {
+		ERR ("request interrupt %s failed\n", bufp);
+		retval = -EBUSY;
+		goto err5;
+	}
+	otg->got_irq = 1;
+
+	/* done */
+	INFO ("%s\n", driver_desc);
+	INFO ("irq %s, pci mem %08x, chip rev %02x (Geode5536 %s)\n",
+	      bufp, resource, otg->chiprev, (otg->chiprev - 1 ? "B1" : "A0"));
+
+#else /* CONFIG_USB_OTG || CONFIG_USB_OTGMUX_GADGET */
+
+	INFO ("%s\n", driver_desc);
+	INFO ("pci mem %08x, chip rev %02x (Geode5536 %s)\n",
+	      resource, otg->chiprev, (otg->chiprev - 1 ? "B1" : "A0"));
+#endif
+	bufp = DRIVER_VERSION;
+	INFO ("driver version: %s\n", bufp);
+
+	if ((retval = otg_probe (otg)) == 0) {
+		pci_set_drvdata (pdev, otg);
+		return 0;
+	}
+
+	/* something went wrong */
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	otg->got_irq = 0;
+	free_irq (pdev->irq, otg);
+err5:
+
+#endif
+	otg->regs = NULL;
+	iounmap (base);
+err4:
+	otg->region = 0;
+	release_mem_region (resource, len);
+err3:
+	otg->enabled = 0;
+	pci_disable_device (pdev);
+err2:
+	otg->pdev = NULL;
+	the_controller = NULL;
+	DBG ( "kfree: OTG driver: %p\n", otg);
+	kfree (otg);
+err1:
+	otg = NULL;
+	return retval;
+}
+
+/**
+ * \brief
+ * OTG PCI remove: clean-up, disable controller hardware
+ *
+ * \param  pdev   pci device info
+ *
+ * \return void
+ */
+static void __exit otg_pci_remove (struct pci_dev *pdev)
+{
+	struct otg *otg = pci_get_drvdata (pdev);
+
+	otg_remove (otg);
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/*** HS-A0 WA: BUG-3950: gadget disconnect notification                    ***/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+	otg->got_irq = 0;
+	free_irq (pdev->irq, otg);
+#endif
+	iounmap (otg->regs);
+	otg->regs = NULL;
+	otg->region = 0;
+	release_mem_region (pci_resource_start(pdev, 0),
+	                    pci_resource_len(pdev, 0));
+	otg->enabled = 0;
+	pci_disable_device (pdev);
+	otg->pdev = NULL;
+	the_controller = NULL;
+	DBG ( "kfree: OTG driver: %p\n", otg);
+	kfree (otg);
+	otg = NULL;
+	pci_set_drvdata(pdev, NULL);
+}
+#endif
+#endif
+
+
+/*****************************************************************************
+ *  More data
+ *****************************************************************************/
+
+#ifdef CONFIG_SOC_AU1200
+#ifndef USE_AU1200_PCI_DUMMY
+/**
+ * \brief
+ * driver struct to be used for driver registration
+ *
+ */
+static struct device_driver otg_device_driver = {
+	.name =		"au1xxx-uoc",
+	.bus =		&platform_bus_type,
+	.probe =	otg_drv_probe,
+	.remove =	otg_drv_remove,
+/* 	.suspend =	otg_drv_suspend, */
+/* 	.resume =	otg_drv_resume, */
+};
+#endif
+#else
+#ifdef CONFIG_PCI
+/**
+ * \brief
+ * PCI ID table
+ *
+ */
+static struct pci_device_id pci_ids [] = { {
+	.vendor =	PCI_VENDOR_ID_AMD,
+	.device =	PCI_DEVICE_ID_AMD_CS5536_UOC,
+	.subvendor =	PCI_ANY_ID,
+	.subdevice =	PCI_ANY_ID,
+	.class = 	0,
+	.class_mask = 	0,
+
+}, { /* end: all zeroes */ }
+};
+
+/**
+ * \brief
+ * PCI driver struct to be used for driver registration
+ * ( this is a "new style" PCI driver module )
+ *
+ */
+static struct pci_driver otg_pci_driver = {
+	.name =		(char *) driver_name,
+	.id_table =	pci_ids,
+	.probe =	otg_pci_probe,
+	.remove =	otg_pci_remove,
+/* 	.suspend =	otg_pci_suspend, */
+/* 	.resume =	otg_pci_resume, */
+};
+MODULE_DEVICE_TABLE (pci, pci_ids);
+#endif
+#endif
+
+/* This comment closes the module definition from above. There can be multiple 
+   definitions of this kind in a file. See the doxygen documentation for more
+   information. */
+/** \}*/
+
+MODULE_DESCRIPTION (DRIVER_DESC);
+MODULE_AUTHOR ("Karsten Boge");
+MODULE_LICENSE ("GPL");
+
+#ifdef CONFIG_SOC_AU1200
+#ifdef USE_AU1200_PCI_DUMMY
+
+static int __init init (void)
+{
+	return otg_pci_probe (&pdev_dummy);
+}
+static void __exit cleanup (void)
+{
+	otg_pci_remove (&pdev_dummy);
+}
+#else
+
+static int __init init (void)
+{
+        return driver_register (&otg_device_driver);
+}
+static void __exit cleanup (void)
+{
+	driver_unregister (&otg_device_driver);
+}
+#endif
+#else
+#ifdef CONFIG_PCI
+
+static int __init init (void)
+{
+        return pci_module_init (&otg_pci_driver);
+}
+static void __exit cleanup (void)
+{
+	pci_unregister_driver (&otg_pci_driver);
+}
+#endif
+#endif
+
+module_init (init);
+module_exit (cleanup);
diff --git a/drivers/usb/gadget/au1200uoc.h b/drivers/usb/gadget/au1200uoc.h
new file mode 100644
index 0000000..9b4503e
--- /dev/null
+++ b/drivers/usb/gadget/au1200uoc.h
@@ -0,0 +1,1338 @@
+/*
+ * AMD Au1200 USB OTG controller driver
+ */
+
+/*
+ * Copyright (C) 2005 AMD (http://www.amd.com)
+ * Author: Karsten Boge 
+ *
+ * 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
+ */
+#ifndef AU1200UOC_H
+#define AU1200UOC_H
+
+
+/*****************************************************************************
+*  Config options
+*****************************************************************************/
+
+#ifndef UDC_HSA0_WORKAROUNDS
+#define UDC_HSA0_WORKAROUNDS
+#endif
+
+/* #define USE_AU1200_PCI_DUMMY */
+#undef USE_AU1200_PCI_DUMMY
+
+#ifdef CONFIG_USB_OTG
+#undef CONFIG_USB_OTGMUX_HOST
+#undef CONFIG_USB_OTGMUX_GADGET
+#undef CONFIG_USB_OTGMUX_IDPIN
+#endif
+
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+#undef CONFIG_USB_OTGMUX_HOST
+#ifndef CONFIG_USB_OTGMUX_GADGET
+#define CONFIG_USB_OTGMUX_GADGET
+#endif
+#endif
+
+#ifndef OTG_HSA0_HNP_WA
+#define OTG_HSA0_HNP_WA
+#endif
+
+#ifdef VERBOSE
+#ifndef DEBUG
+#define DEBUG
+#endif
+#endif
+
+
+/*****************************************************************************
+*  Constants
+*****************************************************************************/
+
+#define OTG_DRIVER_NAME        "au1200otg"
+
+#define OTG_CHIPREV            0
+
+#define OTG_FLAGS_ACTIV        (1<<19)   /* full OTG functionality is activ  */
+
+#ifndef CONFIG_SOC_AU1200
+#ifdef CONFIG_PCI
+#ifndef PCI_VENDOR_ID_AMD
+#define PCI_VENDOR_ID_AMD             0x1022
+#endif
+#ifndef PCI_DEVICE_ID_AMD_CS5536_UOC
+#define PCI_DEVICE_ID_AMD_CS5536_UOC  0x2097
+#endif
+#else
+#error "!!! UNKNOWN SYSTEM BUS TYPE !!!"
+#endif
+#endif
+
+#ifdef CONFIG_SOC_AU1200
+#define GPIO_2_BASE                   200
+#define GPIO_215                      215
+#define SYS_PINFUNC_P0A_GPIO          (2<<17)
+#ifdef CONFIG_MIPS_PB1200
+#define USB_VBUS_GPIO                 3     /* AU1000_GPIO_3 */
+#endif
+#ifdef CONFIG_MIPS_DB1200
+#define USB_VBUS_GPIO                 GPIO_215
+#endif
+#if !(defined(CONFIG_MIPS_PB1200) || defined(CONFIG_MIPS_DB1200))
+#error "!!! UNKNOWN AU1200 BOARD !!!"
+#endif
+#endif
+
+
+/**********************************
+*  UOC Register definitions
+**********************************/
+
+/* capabilities */
+#define OTG_CAP_APU            (1<<15)   /* automatic pull-up enable         */
+
+/* multiplexer */
+#define OTG_MUX_DISABLE_ALL    0         /* not assigned                     */
+#define OTG_MUX_ENABLE_UHC     (2<<0)    /* assigned to host                 */
+#define OTG_MUX_ENABLE_UDC     (3<<0)    /* assigned to device               */
+#define OTG_MUX_PUEN           (1<<2)    /* pull-up enable                   */
+#define OTG_MUX_VBUSVLD        (1<<8)    /* VBus valid                       */
+
+/* status */
+#define OTG_STS_ID             (1<<0)    /* ID pin status                    */
+#define OTG_STS_VBUSVLD        (1<<1)    /* VBus valid                       */
+#define OTG_STS_SESSVLD        (1<<2)    /* Session valid                    */
+#define OTG_STS_SESSEND        (1<<3)    /* Session end                      */
+#define OTG_STS_LST            (3<<4)    /* Line state                       */
+#define OTG_STS_LST_J          (1<<4)    /* Line state                       */
+#define OTG_STS_LST_K          (2<<4)    /* Line state                       */
+#define OTG_STS_PSPD           (3<<6)    /* Port speed                       */
+#define OTG_STS_PSPD_LS        (2<<6)    /* Port speed                       */
+#define OTG_STS_PSPD_FS        (1<<6)    /* Port speed                       */
+#define OTG_STS_FSOE           (1<<8)    /* FS output enable (OHC)           */
+#define OTG_STS_PCON           (1<<9)    /* Port connected                   */
+#define OTG_STS_PSUS           (1<<10)   /* Port suspended                   */
+#define OTG_STS_TMH            (1<<11)   /* Timer halted                     */
+#define OTG_STS_HNP_EN         (1<<12)   /* HNP enabled for B-dev            */
+#define OTG_STS_HNP_SUPP       (1<<13)   /* A-host supports HNP              */
+#define OTG_STS_HNP_ALTSUPP    (1<<14)   /* A-host supports alt. HNP         */
+#define OTG_STS_HNPSTS         (OTG_STS_HNP_EN | OTG_STS_HNP_SUPP | \
+                                OTG_STS_HNP_ALTSUPP)
+#define OTG_STS_OC             (1<<15)   /* over-current                     */
+#define OTG_STS_DPR            (1<<16)   /* Downstream port reset            */
+
+/* control */
+#define OTG_CTL_DISABLE_ALL    0         /* not assigned                     */
+#define OTG_CTL_ENABLE_UHC     (2<<0)    /* assigned to host                 */
+#define OTG_CTL_ENABLE_UDC     (3<<0)    /* assigned to device               */
+#define OTG_CTL_MUX_MASK       (3<<0)    /* port mux mask                    */
+#define OTG_CTL_PPWR           (1<<2)    /* port power switch                */
+#define OTG_CTL_PPO            (1<<3)    /* port power override              */
+#define OTG_CTL_CHRG           (1<<4)    /* charge VBus                      */
+#define OTG_CTL_DISCHRG        (1<<5)    /* discharge VBus                   */
+#define OTG_CTL_IDSNSEN        (1<<6)    /* ID sense enable, ID-PU           */
+#define OTG_CTL_PADEN          (1<<7)
+#define OTG_CTL_PUEN           (1<<8)    /* pull-up enable                   */
+#define OTG_CTL_DMPDEN         (1<<9)    /* pull-down enable                 */
+#define OTG_CTL_HNPSFEN        (1<<10)   /* HNP SET_FEATURE enable           */
+#define OTG_CTL_WPCS_DEAS      (2<<16)   /* deassert port connect            */
+#define OTG_CTL_WPCS_ASRT      (3<<16)   /* assert port connect              */
+#define OTG_CTL_WPSS_DEAS      (2<<18)   /* deassert port suspend            */
+#define OTG_CTL_WPSS_ASRT      (3<<18)   /* assert port suspend              */
+/* timer conditions */
+#define OTG_CTL_TMR_RLP        (1<<28)   /* timer reload policy              */
+#define OTG_CTL_TMR_ALL        (0xf<<24) /* stop timer                       */
+#define OTG_CTL_TMR_STOP       0         /* timer disabled                   */
+#define OTG_CTL_TMR_UNCOND     (1<<24)   /* count unconditionally            */
+#define OTG_CTL_TMR_SE0        (2<<24)   /* count if LSt = FS-SE0            */
+#define OTG_CTL_TMR_FSJ        (3<<24)   /* count if LSt = FS-J              */
+#define OTG_CTL_TMR_FSK        (4<<24)   /* count if LSt = FS-K              */
+#define OTG_CTL_TMR_NOSE0      (5<<24)   /* count if LSt <> FS-SE0           */
+#define OTG_CTL_TMR_NORX       (6<<24)   /* count if Rx inactiv              */
+#define OTG_CTL_TMR_ID         (7<<24)   /* count if ID = 0                  */
+
+/* interrupts */
+#define OTG_INT_GLOBAL         (1<<31)   /* global interrupt enable          */
+#define OTG_INT_ENALL          0x7fff    /* enable all                       */
+#define OTG_INT_DISALL         0         /* disable all                      */
+#define OTG_INT_IDC            (1<<0)    /* ID pin change                    */
+#define OTG_INT_VBVC           (1<<1)    /* VBUS valid change                */
+#define OTG_INT_SVC            (1<<2)    /* Session valid change             */
+#define OTG_INT_SEC            (1<<3)    /* Session end change               */
+#define OTG_INT_LSTC           (1<<4)    /* Line state change                */
+#define OTG_INT_PSPDC          (1<<5)    /* Port speed change                */
+#define OTG_INT_FSOEC          (1<<6)    /* FS/LS OE change                  */
+#define OTG_INT_HSDD           (1<<7)    /* HS disconnect detected           */
+#define OTG_INT_RXACT          (1<<8)    /* Rx activity detected             */
+#define OTG_INT_PCC            (1<<9)    /* Port connect change              */
+#define OTG_INT_PSC            (1<<10)   /* Port suspend change              */
+#define OTG_INT_TMX            (1<<11)   /* Timer expired                    */
+#define OTG_INT_HNPFC          (1<<12)   /* HNP feature change               */
+#define OTG_INT_OCD            (1<<13)   /* over current detected            */
+#define OTG_INT_DPRC           (1<<14)   /* Downstream port reset change     */
+
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3950: gadget SV notification                            ***/
+#ifdef UDC_HSA0_WORKAROUNDS
+#define OTG_INT_ADDS   OTG_INT_SVC
+#endif
+
+
+/**********************************
+*  OTG state dependend data
+**********************************/
+
+/*
+ * generic
+ */
+#define OTG_CTL_DEFAULT                      (OTG_CTL_PADEN | \
+                                              OTG_CTL_IDSNSEN)
+#define OTG_CTL_HOST_DEFAULT                 (OTG_CTL_DEFAULT | \
+                                              OTG_CTL_ENABLE_UHC)
+#ifdef UDC_HSA0_WORKAROUNDS
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+#ifdef CONFIG_USB_OTG
+#define OTG_CTL_PERIPHERAL_DEFAULT           (OTG_CTL_DEFAULT | \
+                                              OTG_CTL_HNPSFEN | \
+                                              OTG_CTL_ENABLE_UDC | \
+                                              OTG_CTL_PPO | OTG_CTL_PUEN)
+#else
+#define OTG_CTL_PERIPHERAL_DEFAULT           (OTG_CTL_DEFAULT | \
+                                              OTG_CTL_ENABLE_UDC | \
+                                              OTG_CTL_PPO | OTG_CTL_PUEN)
+#endif
+#else
+#ifdef CONFIG_USB_OTG
+#define OTG_CTL_PERIPHERAL_DEFAULT           (OTG_CTL_DEFAULT | \
+                                              OTG_CTL_HNPSFEN | \
+                                              OTG_CTL_ENABLE_UDC | OTG_CTL_PPO)
+#else
+#define OTG_CTL_PERIPHERAL_DEFAULT           (OTG_CTL_DEFAULT | \
+                                              OTG_CTL_ENABLE_UDC | OTG_CTL_PPO)
+#endif
+#endif
+
+#define OTG_INT_DEFAULT                      OTG_INT_IDC
+
+/*
+ * OTG_STATE_UNDEFINED
+ */
+#define OTG_STATE_UNDEFINED_CONTROL          (OTG_CTL_DEFAULT | OTG_CTL_PPO | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_UNDEFINED_STATUS           0
+#define OTG_STATE_UNDEFINED_STATUS_MASK      0
+#define OTG_STATE_UNDEFINED_INTERRUPTS       OTG_INT_TMX
+
+/*
+ * OTG_STATE_A_IDLE
+ */
+#define OTG_STATE_A_IDLE_CONTROL             (OTG_CTL_DEFAULT | OTG_CTL_PPO)
+#define OTG_STATE_A_IDLE_STATUS              0
+#define OTG_STATE_A_IDLE_STATUS_MASK         0
+#define OTG_STATE_A_IDLE_INTERRUPTS          (OTG_INT_DEFAULT | OTG_INT_SVC | \
+                                              OTG_INT_LSTC)
+
+/*
+ * OTG_STATE_A_IDLE_WAIT_DP
+ */
+#define OTG_STATE_A_IDLE_WAIT_DP_CONTROL     (OTG_STATE_A_IDLE_CONTROL | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_A_IDLE_WAIT_DP_STATUS      0
+#define OTG_STATE_A_IDLE_WAIT_DP_STATUS_MASK 0
+#define OTG_STATE_A_IDLE_WAIT_DP_INTERRUPTS  (OTG_STATE_A_IDLE_INTERRUPTS | \
+                                              OTG_INT_TMX)
+
+/*
+ * OTG_STATE_A_IDLE_WAIT_VP
+ */
+#define OTG_STATE_A_IDLE_WAIT_VP_CONTROL     (OTG_STATE_A_IDLE_CONTROL | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_A_IDLE_WAIT_VP_STATUS      0
+#define OTG_STATE_A_IDLE_WAIT_VP_STATUS_MASK 0
+#define OTG_STATE_A_IDLE_WAIT_VP_INTERRUPTS  (OTG_STATE_A_IDLE_INTERRUPTS | \
+                                              OTG_INT_TMX)
+
+/*
+ * OTG_STATE_A_IDLE_WAIT_MP
+ */
+#define OTG_STATE_A_IDLE_WAIT_MP_CONTROL     (OTG_STATE_A_IDLE_CONTROL | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_A_IDLE_WAIT_MP_STATUS      0
+#define OTG_STATE_A_IDLE_WAIT_MP_STATUS_MASK 0
+#define OTG_STATE_A_IDLE_WAIT_MP_INTERRUPTS  (OTG_STATE_A_IDLE_INTERRUPTS | \
+                                              OTG_INT_TMX)
+
+/*
+ * OTG_STATE_A_IDLE_WAIT_DV
+ */
+#define OTG_STATE_A_IDLE_WAIT_DV_CONTROL     (OTG_STATE_A_IDLE_CONTROL | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_A_IDLE_WAIT_DV_STATUS      0
+#define OTG_STATE_A_IDLE_WAIT_DV_STATUS_MASK 0
+#define OTG_STATE_A_IDLE_WAIT_DV_INTERRUPTS  (OTG_STATE_A_IDLE_INTERRUPTS | \
+                                              OTG_INT_TMX)
+
+/*
+ * OTG_STATE_A_WAIT_VRISE
+ */
+#define OTG_STATE_A_WAIT_VRISE_CONTROL       (OTG_CTL_HOST_DEFAULT | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_A_WAIT_VRISE_STATUS        0
+#define OTG_STATE_A_WAIT_VRISE_STATUS_MASK   0
+#define OTG_STATE_A_WAIT_VRISE_INTERRUPTS    (OTG_INT_DEFAULT | OTG_INT_TMX | \
+                                              OTG_INT_VBVC)
+
+/*
+ * OTG_STATE_A_WAIT_BCON
+ */
+#define OTG_STATE_A_WAIT_BCON_CONTROL        OTG_CTL_HOST_DEFAULT
+#define OTG_STATE_A_WAIT_BCON_STATUS         0
+#define OTG_STATE_A_WAIT_BCON_STATUS_MASK    0
+#define OTG_STATE_A_WAIT_BCON_INTERRUPTS     (OTG_INT_DEFAULT | OTG_INT_TMX | \
+                                              OTG_INT_VBVC | OTG_INT_PCC)
+
+/*
+ * OTG_STATE_A_WAIT_BCON_VB
+ */
+#define OTG_STATE_A_WAIT_BCON_VB_CONTROL     (OTG_STATE_A_WAIT_BCON_CONTROL | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_A_WAIT_BCON_VB_STATUS      0
+#define OTG_STATE_A_WAIT_BCON_VB_STATUS_MASK 0
+#define OTG_STATE_A_WAIT_BCON_VB_INTERRUPTS  OTG_STATE_A_WAIT_BCON_INTERRUPTS
+
+/*
+ * OTG_STATE_A_HOST
+ */
+#define OTG_STATE_A_HOST_CONTROL             OTG_CTL_HOST_DEFAULT
+#define OTG_STATE_A_HOST_STATUS              0
+#define OTG_STATE_A_HOST_STATUS_MASK         0
+#ifdef CONFIG_USB_OTG
+#ifndef VERBOSE
+#define OTG_STATE_A_HOST_INTERRUPTS          (OTG_INT_DEFAULT | \
+                                              OTG_INT_VBVC | OTG_INT_DPRC | \
+                                              OTG_INT_PCC | OTG_INT_PSC)
+#else
+#define OTG_STATE_A_HOST_INTERRUPTS          (OTG_INT_DEFAULT | \
+                                              OTG_INT_VBVC | OTG_INT_DPRC | \
+                                              OTG_INT_PCC | OTG_INT_PSC | \
+                                              OTG_INT_PSPDC)
+                                              /* OTG_INT_LSTC */
+#endif
+#else
+        /* IDPIN mode only                                                   */
+#define OTG_STATE_A_HOST_INTERRUPTS          OTG_INT_IDC
+#endif
+
+/*
+ * OTG_STATE_A_SUSPEND
+ */
+#define OTG_STATE_A_SUSPEND_CONTROL          (OTG_CTL_HOST_DEFAULT | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_A_SUSPEND_STATUS           0
+#define OTG_STATE_A_SUSPEND_STATUS_MASK      0
+#define OTG_STATE_A_SUSPEND_INTERRUPTS       (OTG_INT_DEFAULT | OTG_INT_TMX | \
+                                              OTG_INT_VBVC |  OTG_INT_DPRC | \
+                                              OTG_INT_PCC | OTG_INT_PSC)
+
+/*
+ * OTG_STATE_A_PERIPHERAL
+ */
+#define OTG_STATE_A_PERIPHERAL_CONTROL       (OTG_CTL_PERIPHERAL_DEFAULT | \
+                                              OTG_CTL_PPWR | OTG_CTL_DMPDEN)
+#define OTG_STATE_A_PERIPHERAL_STATUS        0
+#define OTG_STATE_A_PERIPHERAL_STATUS_MASK   0
+#ifndef VERBOSE
+#define OTG_STATE_A_PERIPHERAL_INTERRUPTS    (OTG_INT_DEFAULT | \
+                                              OTG_INT_VBVC | OTG_INT_OCD | \
+                                              OTG_INT_PCC | OTG_INT_PSC)
+#else
+#define OTG_STATE_A_PERIPHERAL_INTERRUPTS    (OTG_INT_DEFAULT | \
+                                              OTG_INT_VBVC | OTG_INT_OCD | \
+                                              OTG_INT_PCC | OTG_INT_PSC | \
+                                              OTG_INT_PSPDC)
+                                              /* OTG_INT_LSTC */
+#endif
+
+/*
+ * OTG_STATE_A_VBUS_ERR
+ */
+#define OTG_STATE_A_VBUS_ERR_CONTROL         (OTG_CTL_HOST_DEFAULT | \
+                                              OTG_CTL_PPO | OTG_CTL_DISCHRG)
+#define OTG_STATE_A_VBUS_ERR_STATUS          0
+#define OTG_STATE_A_VBUS_ERR_STATUS_MASK     0
+#define OTG_STATE_A_VBUS_ERR_INTERRUPTS      OTG_INT_DEFAULT
+
+/*
+ * OTG_STATE_A_WAIT_VFALL
+ */
+#define OTG_STATE_A_WAIT_VFALL_CONTROL       (OTG_CTL_HOST_DEFAULT | \
+                                              OTG_CTL_PPO)
+#define OTG_STATE_A_WAIT_VFALL_STATUS        0
+#define OTG_STATE_A_WAIT_VFALL_STATUS_MASK   0
+#define OTG_STATE_A_WAIT_VFALL_INTERRUPTS    (OTG_INT_DEFAULT | OTG_INT_SEC)
+
+/*
+ * OTG_STATE_A_WAIT_VFALL_DN
+ */
+#define OTG_STATE_A_WAIT_VFALL_DN_CONTROL    (OTG_STATE_A_WAIT_VFALL_CONTROL | \
+                                              OTG_CTL_DISCHRG)
+#define OTG_STATE_A_WAIT_VFALL_DN_STATUS      0
+#define OTG_STATE_A_WAIT_VFALL_DN_STATUS_MASK 0
+#define OTG_STATE_A_WAIT_VFALL_DN_INTERRUPTS  OTG_STATE_A_WAIT_VFALL_INTERRUPTS
+
+/*
+ * OTG_STATE_A_WAIT_BDISCON
+ */
+#define OTG_STATE_A_WAIT_BDISCON_CONTROL     (OTG_CTL_DEFAULT | \
+                                              OTG_CTL_PPO | OTG_CTL_PPWR | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_A_WAIT_BDISCON_STATUS      0
+#define OTG_STATE_A_WAIT_BDISCON_STATUS_MASK 0
+#define OTG_STATE_A_WAIT_BDISCON_INTERRUPTS  (OTG_INT_DEFAULT | OTG_INT_TMX | \
+                                              OTG_INT_VBVC | OTG_INT_OCD | \
+                                              OTG_INT_PSPDC | OTG_INT_LSTC)
+
+/*
+ * OTG_STATE_B_IDLE
+ */
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+#ifdef UDC_HSA0_WORKAROUNDS
+#define OTG_STATE_B_IDLE_CONTROL             (OTG_CTL_PERIPHERAL_DEFAULT & \
+                                              ~((u32) (OTG_CTL_PUEN | \
+                                                       OTG_CTL_ENABLE_UDC)))
+#else
+#define OTG_STATE_B_IDLE_CONTROL             OTG_CTL_PERIPHERAL_DEFAULT
+#endif
+#define OTG_STATE_B_IDLE_STATUS              0
+#define OTG_STATE_B_IDLE_STATUS_MASK         0
+#ifdef CONFIG_USB_OTG
+#define OTG_STATE_B_IDLE_INTERRUPTS          (OTG_INT_DEFAULT | OTG_INT_SVC)
+#else
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+        /* IDPIN mode                                                        */
+#define OTG_STATE_B_IDLE_INTERRUPTS          (OTG_INT_IDC | OTG_INT_SVC)
+#else
+        /* gadget mode                                                       */
+#define OTG_STATE_B_IDLE_INTERRUPTS          OTG_INT_SVC
+#endif
+#endif
+
+/*
+ * OTG_STATE_B_PERIPHERAL
+ */
+#define OTG_STATE_B_PERIPHERAL_CONTROL       (OTG_CTL_PERIPHERAL_DEFAULT | \
+                                              OTG_CTL_DMPDEN)
+#define OTG_STATE_B_PERIPHERAL_STATUS        0
+#define OTG_STATE_B_PERIPHERAL_STATUS_MASK   0
+#ifdef CONFIG_USB_OTG
+#ifndef VERBOSE
+#define OTG_STATE_B_PERIPHERAL_INTERRUPTS    (OTG_INT_DEFAULT | OTG_INT_SVC | \
+                                              OTG_INT_PCC | OTG_INT_PSC | \
+                                              OTG_INT_HNPFC)
+#else
+#define OTG_STATE_B_PERIPHERAL_INTERRUPTS    (OTG_INT_DEFAULT | OTG_INT_SVC | \
+                                              OTG_INT_PCC | OTG_INT_PSC | \
+                                              OTG_INT_HNPFC | OTG_INT_PSPDC)
+                                              /* OTG_INT_LSTC */
+#endif
+#else
+#ifdef CONFIG_USB_OTGMUX_IDPIN
+        /* IDPIN mode                                                        */
+#define OTG_STATE_B_PERIPHERAL_INTERRUPTS    (OTG_INT_IDC | OTG_INT_SVC)
+#else
+        /* gadget mode                                                       */
+#define OTG_STATE_B_PERIPHERAL_INTERRUPTS    OTG_INT_SVC
+#endif
+#endif
+
+/*
+ * OTG_STATE_B_PERIPHERAL_WT
+ */
+#define OTG_STATE_B_PERIPHERAL_WT_CONTROL    (OTG_STATE_B_PERIPHERAL_CONTROL | \
+                                              OTG_CTL_PPO | OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_B_PERIPHERAL_WT_STATUS      0
+#define OTG_STATE_B_PERIPHERAL_WT_STATUS_MASK 0
+#define OTG_STATE_B_PERIPHERAL_WT_INTERRUPTS (OTG_STATE_B_PERIPHERAL_INTERRUPTS \
+                                              | OTG_INT_TMX)
+
+/*
+ * OTG_STATE_B_PERIPHERAL_DC
+ */
+#define OTG_STATE_B_PERIPHERAL_DC_CONTROL    (OTG_CTL_HOST_DEFAULT | \
+                                              OTG_CTL_PPO | OTG_CTL_DMPDEN | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_B_PERIPHERAL_DC_STATUS      0
+#define OTG_STATE_B_PERIPHERAL_DC_STATUS_MASK 0
+#define OTG_STATE_B_PERIPHERAL_DC_INTERRUPTS (OTG_STATE_B_PERIPHERAL_INTERRUPTS \
+                                              | OTG_INT_TMX | OTG_INT_LSTC)
+
+/*
+ * OTG_STATE_B_WAIT_ACON
+ */
+#define OTG_STATE_B_WAIT_ACON_CONTROL        (OTG_CTL_HOST_DEFAULT | \
+                                              OTG_CTL_PPO | OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_B_WAIT_ACON_STATUS         0
+#define OTG_STATE_B_WAIT_ACON_STATUS_MASK    0
+#define OTG_STATE_B_WAIT_ACON_INTERRUPTS     (OTG_INT_DEFAULT | OTG_INT_SVC | \
+                                              OTG_INT_PCC | OTG_INT_PSC | \
+                                              OTG_INT_HNPFC | OTG_INT_TMX)
+
+/*
+ * OTG_STATE_B_HOST
+ */
+#define OTG_STATE_B_HOST_CONTROL             (OTG_CTL_HOST_DEFAULT | \
+                                              OTG_CTL_PPO)
+#define OTG_STATE_B_HOST_STATUS              0
+#define OTG_STATE_B_HOST_STATUS_MASK         0
+#ifndef VERBOSE
+#define OTG_STATE_B_HOST_INTERRUPTS          (OTG_INT_DEFAULT | OTG_INT_SVC | \
+                                              OTG_INT_PCC)
+#else
+#define OTG_STATE_B_HOST_INTERRUPTS          (OTG_INT_DEFAULT | OTG_INT_SVC | \
+                                              OTG_INT_PCC | OTG_INT_SVC | \
+                                              OTG_INT_PSPDC)
+                                              /* OTG_INT_LSTC */
+#endif
+
+/*
+ * OTG_STATE_B_HOST_WT
+ */
+#define OTG_STATE_B_HOST_WT_CONTROL          (OTG_STATE_B_HOST_CONTROL | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_B_HOST_WT_STATUS           0
+#define OTG_STATE_B_HOST_WT_STATUS_MASK      0
+#ifndef VERBOSE
+#define OTG_STATE_B_HOST_WT_INTERRUPTS       (OTG_INT_DEFAULT | OTG_INT_SVC | \
+                                              OTG_INT_PCC | OTG_INT_TMX)
+#else
+#define OTG_STATE_B_HOST_WT_INTERRUPTS       (OTG_STATE_B_HOST_INTERRUPTS | \
+                                              OTG_INT_TMX)
+/*
+#define OTG_STATE_B_HOST_WT_INTERRUPTS       (OTG_INT_DEFAULT | OTG_INT_SVC | \
+                                              OTG_INT_PCC | OTG_INT_DPRC | \
+                                              OTG_INT_TMX | OTG_INT_PSPDC) */
+                                              /* OTG_INT_LSTC */
+#endif
+
+/*
+ * OTG_STATE_B_SRP_INIT
+ */
+#define OTG_STATE_B_SRP_INIT_CONTROL         OTG_STATE_B_IDLE_CONTROL
+#define OTG_STATE_B_SRP_INIT_STATUS          0
+#define OTG_STATE_B_SRP_INIT_STATUS_MASK     0
+#define OTG_STATE_B_SRP_INIT_INTERRUPTS      OTG_INT_DEFAULT 
+
+/*
+ * OTG_STATE_B_SRP_WTSE0
+ */
+#define OTG_STATE_B_SRP_WAIT_SE0_CONTROL     (OTG_STATE_B_SRP_INIT_CONTROL | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_B_SRP_WAIT_SE0_STATUS      0
+#define OTG_STATE_B_SRP_WAIT_SE0_STATUS_MASK 0
+#define OTG_STATE_B_SRP_WAIT_SE0_INTERRUPTS  (OTG_STATE_B_SRP_INIT_INTERRUPTS \
+                                              | OTG_INT_TMX | OTG_INT_LSTC)
+
+/*
+ * OTG_STATE_B_SRP_D_PLS
+ *
+ * note: changing to this state requires an additional call:
+ *       set_srp_conditions (dev);
+ *       reset_srp_conditions (dev) is required for the next state
+ */
+/*** HS-A0 WA: BUG-3885: VB_SESS_VLD value too high                        ***/
+/*** HS-A0 WA: BUG-3943: gadget suspend issue                              ***/
+/* note: set_/reset_srp_conditions is not needed if HS-A0 WAs are active
+ */
+#ifdef UDC_HSA0_WORKAROUNDS
+#define OTG_STATE_B_SRP_D_PULSE_CONTROL      (OTG_CTL_PERIPHERAL_DEFAULT | \
+                                              OTG_CTL_PUEN | \
+                                              OTG_CTL_TMR_UNCOND)
+#else
+#define OTG_STATE_B_SRP_D_PULSE_CONTROL      (OTG_STATE_B_SRP_INIT_CONTROL | \
+                                              OTG_CTL_PUEN | \
+                                              OTG_CTL_TMR_UNCOND)
+#endif
+#define OTG_STATE_B_SRP_D_PULSE_STATUS       0
+#define OTG_STATE_B_SRP_D_PULSE_STATUS_MASK  0
+#define OTG_STATE_B_SRP_D_PULSE_INTERRUPTS   (OTG_STATE_B_SRP_INIT_INTERRUPTS \
+                                              | OTG_INT_SEC | OTG_INT_TMX)
+
+/*
+ * OTG_STATE_B_SRP_V_PLS
+ */
+#define OTG_STATE_B_SRP_V_PULSE_CONTROL      (OTG_STATE_B_SRP_INIT_CONTROL | \
+                                              OTG_CTL_CHRG | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_B_SRP_V_PULSE_STATUS       0
+#define OTG_STATE_B_SRP_V_PULSE_STATUS_MASK  0
+#define OTG_STATE_B_SRP_V_PULSE_INTERRUPTS   (OTG_STATE_B_SRP_INIT_INTERRUPTS \
+                                              | OTG_INT_TMX)
+
+/*
+ * OTG_STATE_B_SRP_V_DCG
+ */
+#define OTG_STATE_B_SRP_V_DCHRG_CONTROL      (OTG_STATE_B_SRP_INIT_CONTROL | \
+                                              OTG_CTL_DISCHRG | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_B_SRP_V_DCHRG_STATUS       0
+#define OTG_STATE_B_SRP_V_DCHRG_STATUS_MASK  0
+#define OTG_STATE_B_SRP_V_DCHRG_INTERRUPTS   (OTG_STATE_B_SRP_INIT_INTERRUPTS \
+                                              | OTG_INT_TMX)
+
+/*
+ * OTG_STATE_B_SRP_WTVB
+ */
+#define OTG_STATE_B_SRP_WAIT_VBUS_CONTROL    (OTG_STATE_B_SRP_INIT_CONTROL | \
+                                              OTG_CTL_TMR_UNCOND)
+#define OTG_STATE_B_SRP_WAIT_VBUS_STATUS      0
+#define OTG_STATE_B_SRP_WAIT_VBUS_STATUS_MASK 0
+#define OTG_STATE_B_SRP_WAIT_VBUS_INTERRUPTS (OTG_STATE_B_SRP_INIT_INTERRUPTS \
+                                              | OTG_INT_SVC | OTG_INT_TMX)
+
+/*********************************/
+
+/* other */
+
+#define OTG_APP_REQ_ACK        0
+
+
+/*****************************************************************************
+*  Types
+*****************************************************************************/
+
+
+/*****************************************************************************
+*  Macros
+*****************************************************************************/
+
+/* printing messages */
+#ifndef INFO
+#define INFO(args...) \
+        printk(KERN_INFO DRIVER_NAME_FOR_PRINT ": " args)
+#endif
+
+#ifndef WARN
+#define WARN(args...) \
+        printk(KERN_WARNING DRIVER_NAME_FOR_PRINT " warning: " args)
+#endif
+
+#ifndef ERR
+#define ERR(args...) \
+        printk(KERN_ERR DRIVER_NAME_FOR_PRINT " error: " args)
+#endif
+
+#ifndef DBG 
+#ifdef DEBUG
+#define DBG(args...) \
+        printk(KERN_DEBUG DRIVER_NAME_FOR_PRINT " debug: " args)
+#else
+#define DBG(args...) \
+        do {} while (0)
+#endif
+#endif
+
+#ifndef VDBG 
+#ifdef VERBOSE
+#define VDBG DBG
+#else
+#define VDBG(args...) \
+	do { } while (0)
+#endif
+#endif
+
+/****************************************************************************/
+
+/* this should always return "1" and print something in verbose mode */
+#ifdef VERBOSE
+#define VDBG_SPC(fmt,args...) \
+	(VDBG (fmt, args) ? 1 : 1)
+#else
+#define VDBG_SPC(fmt,args...) 1
+#endif
+
+/* query bit(s) (long: 32-bit access) */
+#define IS_BIT_RES(data, code) \
+	(!((data) & (code)) ? \
+	 (VDBG_SPC ("  OTG HW status: %s is reset\n", #data)) : 0)
+
+#define IS_BIT_SET(data, code) \
+	(((data) & (code)) ? \
+	 (VDBG_SPC ("  OTG HW status: %s is set\n", #data)) : 0)
+
+/* query SW flag(s) */
+#define IS_FLAG_RES(dev, data) \
+	(!((data) & (dev)->params) ? \
+	 (VDBG_SPC ("  OTG SW status: %s is reset\n", #data)) : 0)
+
+#define IS_FLAG_SET(dev, data) \
+	(((data) & (dev)->params) ? \
+	 (VDBG_SPC ("  OTG SW status: %s is set\n", #data)) : 0)
+
+/* query event bit(s) */
+#define GOT_EVENT(data, code) \
+	(((data) & (code)) ? \
+	 (VDBG_SPC ("  OTG event: %s\n", #data)) : 0)
+
+/* set SW flag */
+#ifdef VERBOSE
+#define SET_FLAG(dev, data) \
+	if (!((data) & (dev)->params)) \
+		DBG ("  OTG SW status change: set flag %s\n", #data); \
+	(dev)->params |= (data)
+#else
+#define SET_FLAG(dev, data) \
+	(dev)->params |= (data)
+#endif
+
+/* reset SW flag */
+#ifdef VERBOSE
+#define RES_FLAG(dev, data) \
+	if ((data) & (dev)->params) \
+		DBG ("  OTG SW status change: reset flag %s\n", #data); \
+	(dev)->params &= ~((u32) (data))
+#else
+#define RES_FLAG(dev, data) \
+	(dev)->params &= ~((u32) (data))
+#endif
+
+/* reset event bit */
+#define RES_EVENT(data, code) \
+	(code) &= ~((u32) (data))
+/* NOTE: this is not really needed so far, might be replaced with */
+/* #define RES_EVENT(data, code) \                                */
+/* 	do {} while (0)                                           */
+
+/* change OTG state */
+#ifdef CONFIG_USB_OTG
+#define PREPARE_STATE_CHANGE_1ST(dev, new_state) \
+	switch ((new_state) & OTG_STATE_MASK) { \
+	case OTG_STATE_UNDEFINED: \
+		set_undef_state_defaults((dev)); \
+		break; \
+	case OTG_STATE_A_IDLE: \
+		set_a_state_defaults((dev)); \
+		break; \
+	case OTG_STATE_B_IDLE: \
+		set_b_state_defaults((dev)); \
+		break; \
+	default: \
+		break; \
+	} \
+	do {} while (0)
+#else
+#define PREPARE_STATE_CHANGE_1ST(dev, new_state) \
+	do {} while (0)
+#endif
+
+#ifdef CONFIG_SOC_AU1200
+
+#if (USB_VBUS_GPIO < GPIO_2_BASE)
+#define AU1000GPIO_SET_BIT(data) \
+	au1000gpio_bit_set (data)
+#define AU1000GPIO_CLR_BIT(data) \
+	au1000gpio_bit_clear (data)
+#define AU1000GPIO_INIT_BIT(data) \
+	au1000gpio_bit_init (data)
+#define AU1000GPIO_TERM_BIT(data) \
+	au1000gpio_bit_term (data)
+#else
+#define AU1000GPIO_SET_BIT(data) \
+	au1000gpio2_bit_set (data)
+#define AU1000GPIO_CLR_BIT(data) \
+	au1000gpio2_bit_clear (data)
+#define AU1000GPIO_INIT_BIT(data) \
+	au1000gpio2_bit_init (data)
+#define AU1000GPIO_TERM_BIT(data) \
+	au1000gpio2_bit_term (data)
+#endif
+
+#define PREPARE_STATE_CHANGE_2ND(new_state_control) \
+	if (((new_state_control) & OTG_CTL_PPO) && \
+	    (~(new_state_control) & OTG_CTL_PPWR)) \
+		AU1000GPIO_SET_BIT(USB_VBUS_GPIO); \
+	else \
+		AU1000GPIO_CLR_BIT(USB_VBUS_GPIO)
+#else
+#define PREPARE_STATE_CHANGE_2ND(new_state_control) \
+	do {} while (0)
+#endif
+
+#define CHANGE_STATE(dev, new_state, pMask) \
+	PREPARE_STATE_CHANGE_1ST(dev, new_state); \
+	PREPARE_STATE_CHANGE_2ND(new_state##_CONTROL); \
+	writel ((new_state##_CONTROL), &(dev)->regs->ctl); \
+	*(pMask) = (new_state##_INTERRUPTS); \
+	(dev)->transceiver.state = (new_state); \
+	DBG ("OTG new state: %s\n", #new_state)
+
+/* verify OTG state */
+#ifndef CONFIG_OTG_TEST_MODE
+
+#define CHECK_STATE(dev, act_state, pMask) \
+	*(pMask) = (act_state##_INTERRUPTS); \
+	(dev)->prv_state = (act_state); \
+	VDBG ("OTG state: %s\n", #act_state)
+#else
+#define CHECK_STATE(dev, act_state, pMask) \
+	*(pMask) = (act_state##_INTERRUPTS); \
+	(dev)->prv_state = (act_state); \
+	if (((readl (&(dev)->regs->sts) ^ (act_state##_STATUS))) & \
+	    act_state##_STATUS_MASK) \
+		WARN ("OTG warning: incorrect status\n"); \
+	VDBG ("OTG state: %s\n", #act_state)
+#endif
+
+/* set timer */
+#define SET_OTG_TIMER(dev, val) \
+	set_timer ((dev), ((OTG_TMR_##val) * 100))
+
+/* set timer ( <1ms ) */
+#define SET_OTG_TIMER_SHORT(dev, val) \
+	set_timer ((dev), ((OTG_TMR_##val) / 10))
+
+/* set timer ( >10ms ) */
+#define SET_OTG_TIMER_LONG(dev, val) \
+	set_timer_long ((dev), ((OTG_TMR_##val) / 10))
+
+#ifdef VERBOSE
+#define HS_DISCON_WARNING() \
+	if (!(OTG_CTL_ENABLE_UHC ^ \
+	      (OTG_CTL_MUX_MASK & readl (&dev->regs->ctl))) && \
+	    !(OTG_STS_PSPD & readl (&dev->regs->sts))) \
+		DBG ("  OTG warning: disable UHC from HS-mode\n")
+#else
+#define HS_DISCON_WARNING() \
+	do { } while (0)
+#endif
+
+
+/*****************************************************************************
+*  Data
+*****************************************************************************/
+struct otg_regs {
+	u32  cap;               /* capabilities */
+	u32  mux;               /* mux */
+	u32  sts;               /* status */
+	u32  ctl;               /* control */
+	u32  tmr;               /* timer */
+	u32  intr;              /* interrupt request */
+	u32  inten;             /* interrupt enable */
+} __attribute__ ((packed));
+
+struct otg {
+	spinlock_t              lock;
+	unsigned                enabled : 1,
+	                        got_irq : 1,
+	                        region : 1;
+	u16                     chiprev;
+
+        /* state variables */
+        u8                      prv_state;
+        u32                     params;
+        void                    *otg_priv;
+        u8                      hostcount;
+
+#ifdef CONFIG_SOC_AU1200
+#ifdef USE_AU1200_PCI_DUMMY
+
+	struct pci_dev          *pdev;
+#else
+	struct platform_device  *pdev;
+#endif
+#else
+	struct pci_dev          *pdev;
+#endif
+	struct otg_regs         *regs;
+	struct otg_transceiver  transceiver;
+};
+#define transceiver_to_otg(pTransceiver) \
+	container_of (pTransceiver, struct otg, transceiver)
+#define otg_to_transceiver(pOtg) \
+	&pOtg->transceiver
+
+#ifdef CONFIG_USB_OTG_TEST_INTERFACE
+struct usb_otg_test_extension {
+	int (*bind) (struct otg **);
+	int (*unbind) (struct otg **);
+	int (*request) (u32);	/* function call for state change requests */
+	u32 (*query) (int);	/* function call to query state */
+};
+#endif
+
+#ifdef	__KERNEL__
+
+/* 2.5 and 2.4.older portability changes ... */
+
+#ifndef container_of
+#define	container_of	list_entry
+#endif
+
+#ifndef likely
+#define likely(x) (x)
+#define unlikely(x) (x)
+#endif
+
+#ifndef BUG_ON
+#define BUG_ON(condition) do { if (unlikely((condition)!=0)) BUG(); } while(0)
+#endif
+
+#ifndef WARN_ON
+#define	WARN_ON(x)	do { } while (0)
+#endif
+
+#endif	/* __KERNEL__ */
+
+/*****************************************************************************
+*  Functions
+*****************************************************************************/
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+extern int usb_gadget_register_otg (struct otg_transceiver * (
+                                    *get_transceiver)(void));
+extern int usb_gadget_unregister_otg (void);
+
+#endif
+#ifdef CONFIG_USB_OTG
+u32 otg_change_state (struct otg *, u32, u32 *);
+int otg_hnp_start_enum (struct otg_transceiver *);
+#endif
+
+void otg_init_state (struct otg *);
+int otg_exit_state (struct otg *);
+
+#ifdef DEBUG
+static void print_regs (struct otg *);
+#endif  /* DEBUG */
+
+#ifdef CONFIG_USB_OTG_TEST_INTERFACE
+int usb_otg_test_register_driver (struct usb_otg_test_extension *);
+int usb_otg_test_unregister_driver (void);
+#endif
+
+/*****************************************************************************
+*  Inline Functions
+*****************************************************************************/
+
+extern u32 otg_tmr_high_count;
+extern struct otg_ctl *otg_ctl;
+
+#ifdef CONFIG_USB_OTG
+/**
+ * \brief
+ * set neutral state information
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return void
+ */
+static inline void set_undef_state_defaults (struct otg *dev)
+{
+	dev->transceiver.default_a = 0;
+	if (dev->transceiver.host) {
+		dev->transceiver.host->is_b_host = 0;
+	}
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+	if (dev->transceiver.companion) {
+		dev->transceiver.companion->is_b_host = 0;
+	}
+#endif
+	if (dev->transceiver.gadget) {
+		dev->transceiver.gadget->is_a_peripheral = 0;
+	}
+}
+
+/**
+ * \brief
+ * set A state information
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return void
+ */
+static inline void set_a_state_defaults (struct otg *dev)
+{
+	dev->transceiver.default_a = 1;
+	if (dev->transceiver.host) {
+		dev->transceiver.host->is_b_host = 0;
+	}
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+	if (dev->transceiver.companion) {
+		dev->transceiver.companion->is_b_host = 0;
+	}
+#endif
+	if (dev->transceiver.gadget) {
+		dev->transceiver.gadget->is_a_peripheral = 1;
+	}
+}
+
+/**
+ * \brief
+ * set B state information
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return void
+ */
+static inline void set_b_state_defaults (struct otg *dev)
+{
+	dev->transceiver.default_a = 0;
+	if (dev->transceiver.host) {
+		dev->transceiver.host->is_b_host = 1;
+	}
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+	if (dev->transceiver.companion) {
+		dev->transceiver.companion->is_b_host = 1;
+	}
+#endif
+	if (dev->transceiver.gadget) {
+		dev->transceiver.gadget->is_a_peripheral = 0;
+	}
+}
+
+/**
+ * \brief
+ * set B state information
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return void
+ */
+static inline void reset_b_hnp_enable (struct otg *dev)
+{
+	if (dev->transceiver.host) {
+		dev->transceiver.host->b_hnp_enable = 0;
+	}
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+	if (dev->transceiver.companion) {
+		dev->transceiver.companion->b_hnp_enable = 0;
+	}
+#endif
+	VDBG ("  OTG action: HNP disabled in B-device\n");
+}
+
+/**
+ * \brief
+ * set B state information
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return void
+ */
+static inline int is_b_hnp_enabled (struct otg *dev)
+{
+	int retVal = 0;
+
+	if (dev->transceiver.host &&
+		dev->transceiver.host->b_hnp_enable) {
+		VDBG ("  OTG status: HNP is enabled in HS-B-device\n");
+		retVal = 1;
+	}
+#ifdef CONFIG_USB_OTG_HIGHSPEED
+	else if (dev->transceiver.companion &&
+		dev->transceiver.companion->b_hnp_enable) {
+		VDBG ("  OTG status: HNP is enabled in FS-B-device\n");
+		retVal = 1;
+	}
+#endif
+#ifdef VERBOSE
+	else {
+		DBG ("  OTG status: HNP is disabled in B-device\n");
+	}
+#endif
+	return retVal;
+}
+#endif
+
+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_OTGMUX_GADGET)
+
+/**
+ * \brief
+ * Read the status register
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return status
+ */
+static inline u32 get_status (struct otg *dev)
+{
+	return (readl (&dev->regs->sts));
+}
+
+/**
+ * \brief
+ * Load and start the timer for an unconditional run
+ *
+ * \param  dev   OTG controller info
+ * \param  val   Value to load
+ *
+ * \return void
+ */
+static inline void set_timer (struct otg *dev, u32 val)
+{
+	otg_tmr_high_count = 0;
+
+	writel ((val), &dev->regs->tmr);
+	VDBG ("  OTG action: start timer: %d0 us\n", val);
+}
+
+/**
+ * \brief
+ * Load and start the timer for an unconditional run
+ *
+ * \param  dev   OTG controller info
+ * \param  val   Value to load
+ *
+ * \return void
+ */
+static inline void set_timer_long (struct otg *dev, u32 val)
+{
+	otg_tmr_high_count = val - 1;
+
+	writel (TIMER_PERIOD, &dev->regs->tmr);
+	VDBG ("  OTG action: start timer: %d0 ms\n", val);
+}
+
+/**
+ * \brief
+ * Re-start the timer (value already loaded)
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return void
+ */
+static inline void restart_timer (struct otg *dev)
+{
+	writel ((readl (&dev->regs->ctl) | OTG_CTL_TMR_UNCOND),
+	        &dev->regs->ctl);
+}
+
+/**
+ * \brief
+ * Reset the timer while running (value already loaded)
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return void
+ */
+static inline void reset_timer (struct otg *dev)
+{
+	u32 temp;
+
+	temp = readl (&dev->regs->ctl);
+	writel ((temp & ~((u32) OTG_CTL_TMR_ALL)), &dev->regs->ctl);
+	writel (temp, &dev->regs->ctl);
+	VDBG ("  OTG action: re-start timer\n");
+}
+
+/**
+ * \brief
+ * Prepare the D-pulse
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return void
+ */
+static inline void set_srp_conditions (struct otg *dev)
+{
+#ifdef UDC_HSA0_WORKAROUNDS
+	VDBG ("  OTG action: SRP init: no action needed due to A0 WAs\n");
+#else
+	writel ((readl (&dev->regs->cap) & ~((u32) OTG_CAP_APU)),
+	        &dev->regs->cap);
+	VDBG ("  OTG action: set SRP conditions: disable APU\n");
+#endif
+}
+
+/**
+ * \brief
+ * Reset conditions after SRP
+ *
+ * activates the auto-pull-up feature so after SRP the host
+ * will detect a device connect after calling this function
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return void
+ */
+static inline void reset_srp_conditions (struct otg *dev)
+{
+#ifdef UDC_HSA0_WORKAROUNDS
+	VDBG ("  OTG action: SRP done: no action needed due to A0 WAs\n");
+#else
+	writel ((readl (&dev->regs->cap) | OTG_CAP_APU),
+	        &dev->regs->cap);
+	VDBG ("  OTG action: reset SRP conditions: enable APU\n");
+#endif
+}
+
+/**
+ * \brief
+ * enable HNP for both devices
+ *
+ * \param  dev   OTG controller info
+ *
+ * \return success
+ */
+static inline int otg_enable_hnp (struct otg *dev)
+{
+	int  retVal = 0;
+
+/*	if (!dev->device) {
+		ERR ("Tried to send OTG request, device pointer not valid\n");
+		retVal = -ENODEV;
+	}
+	else {
+		retVal = usb_otg_enable_b_hnp (dev->device);
+		DBG ("  OTG action: enabled HNP in B-device\n");
+	}
+	if (retVal < 0) {
+		RES_FLAG (OTG_A_bHNP_EN);
+	}
+	else {
+		SET_FLAG (OTG_A_bHNP_EN);
+	}*/
+	return retVal;
+}
+
+#endif /* CONFIG_USB_OTG || CONFIG_USB_OTGMUX_GADGET */
+#ifdef DEBUG
+/**
+ * \brief
+ * Print OTG controller registers (debug mode only)
+ *
+ * \param dev    OTG controller info
+ *
+ * \return void
+ */
+static inline void print_regs (struct otg *dev)
+{
+	DBG( "-- UOC registers ---\n");
+	DBG( "otg cap   = %08x\n", readl (&dev->regs->cap));
+	DBG( "otg mux   = %08x\n", readl (&dev->regs->mux));
+	DBG( "otg sts   = %08x\n", readl (&dev->regs->sts));
+	DBG( "otg ctl   = %08x\n", readl (&dev->regs->ctl));
+	DBG( "otg tmr   = %08x\n", readl (&dev->regs->tmr));
+	DBG( "otg intr  = %08x\n", readl (&dev->regs->intr));
+	DBG( "otg inten = %08x\n", readl (&dev->regs->inten));
+	DBG( "--------------------\n");
+}
+#endif /* DEBUG */
+
+#ifdef CONFIG_SOC_AU1200
+
+/**
+ * \brief
+ * GPIO functions (Au1200 only)
+ *
+ * \param  data  pin info
+ *
+ * \return success
+ */
+static inline int au1000gpio_bit_get (u32 data)
+{
+	return (au_readl ((SYS_PINSTATERD & (1 << data)) ? 1 : 0));
+}
+
+#ifdef CONFIG_AU1X00_GPIO
+
+	/* GPIO functions are defined in drivers/char/au1000_gpio.c          */
+
+#else
+
+static inline int au1000gpio_bit_tristate (u32 data)
+{
+	au_writel ((1 << data), SYS_TRIOUTCLR);
+	return 0;
+}
+
+static inline int au1000gpio_bit_set (u32 data)
+{
+	au_writel ((1 << data), SYS_OUTPUTSET);
+	return 0;
+}
+
+static inline int au1000gpio_bit_clear (u32 data)
+{
+	au_writel ((1 << data), SYS_OUTPUTCLR);
+	return 0;
+}
+
+static inline int au1000gpio_bit_init (u32 data)
+{
+	return au1000gpio_bit_set (data);
+}
+
+static inline int au1000gpio_bit_term (u32 data)
+{
+	return au1000gpio_bit_set (data);
+}
+
+static inline int au1000gpio2_bit_set (u32 data)
+{
+	au_writel (((1 << (data - GPIO_2_BASE)) |
+	            (1 << (data - GPIO_2_BASE + 0x10))), GPIO2_OUTPUT);
+	au_sync();
+	return 0;
+}
+
+static inline int au1000gpio2_bit_clear (u32 data)
+{
+	au_writel ((1 << (data - GPIO_2_BASE + 0x10)), GPIO2_OUTPUT);
+	au_sync();
+	return 0;
+}
+
+static inline int au1000gpio2_bit_init (u32 data)
+{
+	u32 temp = au_readl (GPIO2_ENABLE);
+
+	if (!(temp | 1)) {
+		au_writel (temp | 1, GPIO2_ENABLE);
+		au_readl (GPIO2_ENABLE);
+		udelay (20);
+	}
+	if (temp | 2) {
+		au_writel (((temp & 0xfffffffd) | 1), GPIO2_ENABLE);
+		au_readl (GPIO2_ENABLE);
+	}
+
+	/* FIXME: check the system impact of the P0A setting                 */
+	/* DbAu1200 pin (GPIO_215) pin is shared w/ PSC0 functions           */
+	/* setting this field to GPIO affects also GPIO_16, GPIO_31          */
+
+	if (data == GPIO_215) {
+		au_writel (((au_readl (SYS_PINFUNC) &
+		             ~((u32) SYS_PINFUNC_P0A)) | SYS_PINFUNC_P0A_GPIO),
+			   SYS_PINFUNC);
+	}
+	au_writel (au_readl (GPIO2_INTENABLE) & ~(1 << (data - GPIO_2_BASE)),
+	           GPIO2_INTENABLE);
+	au_writel (au_readl (GPIO2_DIR) | (1 << (data - GPIO_2_BASE)),
+	           GPIO2_DIR);
+	au_sync();
+	return 0;
+}
+
+static inline int au1000gpio2_bit_term (u32 data)
+{
+	return au1000gpio2_bit_set (data);
+}
+#endif
+#endif /* CONFIG_SOC_AU1200 */
+
+#endif /* AU1200UOC_H */
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 8f402f8..e147883 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -91,6 +91,13 @@ static const char driver_desc [] = DRIVE
 
 #define RX_EXTRA	20		/* guard against rx overflows */
 
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+/*
+ * AMD UDC supports dword aligned DMA buffers only, so skbuf buffers
+ * from network layer must be copied
+ */
+#define UDC_MAX_BUFLEN 2048            /* size of dword aligned buffer */
+#endif
 #include "rndis.h"
 
 #ifndef	CONFIG_USB_ETH_RNDIS
@@ -151,8 +158,13 @@ struct eth_dev {
 /* Thanks to NetChip Technologies for donating this product ID.
  * It's for devices with only CDC Ethernet configurations.
  */
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+#define CDC_VENDOR_NUM	0x0438		/* AMD */
+#define CDC_PRODUCT_NUM	0xdc01		/* AMD Linux-USB Ethernet Gadget (temporary) */
+#else
 #define CDC_VENDOR_NUM	0x0525		/* NetChip */
 #define CDC_PRODUCT_NUM	0xa4a1		/* Linux-USB Ethernet Gadget */
+#endif
 
 /* For hardware that can't talk CDC, we use the same vendor ID that
  * ARM Linux has used for ethernet-over-usb, both with sa1100 and
@@ -253,6 +265,10 @@ MODULE_PARM_DESC(host_addr, "Host Ethern
 #define DEV_CONFIG_CDC
 #endif
 
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+#define	DEV_CONFIG_CDC
+#endif
+
 
 /* For CDC-incapable hardware, choose the simple cdc subset.
  * Anything that talks bulk (without notable bugs) can do this.
@@ -1056,6 +1072,10 @@ static void eth_reset_config (struct eth
 			req = container_of (dev->tx_reqs.next,
 						struct usb_request, list);
 			list_del (&req->list);
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+                        if (req->buf)
+                                usb_ep_free_buffer (dev->in_ep, req->buf, req->dma, UDC_MAX_BUFLEN);
+#endif
 			usb_ep_free_request (dev->in_ep, req);
 		}
 	}
@@ -1065,6 +1085,10 @@ static void eth_reset_config (struct eth
 			req = container_of (dev->rx_reqs.next,
 						struct usb_request, list);
 			list_del (&req->list);
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+                        if (req->buf)
+                                usb_ep_free_buffer (dev->out_ep, req->buf, req->dma, UDC_MAX_BUFLEN);
+#endif
 			usb_ep_free_request (dev->out_ep, req);
 		}
 	}
@@ -1632,7 +1656,9 @@ rx_submit (struct eth_dev *dev, struct u
 	 */
 	skb_reserve(skb, NET_IP_ALIGN);
 
+#ifndef CONFIG_USB_GADGET_AU1200UDC
 	req->buf = skb->data;
+#endif
 	req->length = size;
 	req->complete = rx_complete;
 	req->context = skb;
@@ -1674,6 +1700,16 @@ static void rx_complete (struct usb_ep *
 			break;
 		}
 
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+                /* we need to copy here because AMD UDC needs dword aligned buffers */
+                VDEBUG(dev, "memcpy( skb->data %lx,req->buf %lx,req->actual %d)\n",  skb->data,req->buf,req->actual);
+                if (req->actual <= UDC_MAX_BUFLEN) {
+                        memcpy(skb->data, req->buf, req->actual);
+                }
+                else {
+                        ERROR(dev, "memcpy of %d bytes bigger than max %d\n", req->actual, UDC_MAX_BUFLEN);
+                }
+#endif
 		skb->dev = dev->net;
 		skb->protocol = eth_type_trans (skb, dev->net);
 		dev->stats.rx_packets++;
@@ -1742,6 +1778,15 @@ static int prealloc (struct list_head *l
 		req = usb_ep_alloc_request (ep, gfp_flags);
 		if (!req)
 			return list_empty (list) ? -ENOMEM : 0;
+
+
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+                /* allocate buffer which must be dword aligned for AMD UDC */
+                req->buf = usb_ep_alloc_buffer (ep, UDC_MAX_BUFLEN, 
+                                &req->dma, GFP_ATOMIC);
+#endif
+
+
 		list_add (&req->list, list);
 	}
 	return 0;
@@ -1753,6 +1798,10 @@ extra:
 
 		next = req->list.next;
 		list_del (&req->list);
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+                if (req->buf)
+                        usb_ep_free_buffer (ep, req->buf, req->dma, UDC_MAX_BUFLEN);
+#endif
 		usb_ep_free_request (ep, req);
 
 		if (next == list)
@@ -1905,7 +1954,19 @@ static int eth_start_xmit (struct sk_buf
 		rndis_add_hdr (skb);
 		length = skb->len;
 	}
-	req->buf = skb->data;
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+        /* we need to copy here because AMD UDC needs dword aligned buffers */
+        VDEBUG(dev, "memcpy(req->buf %lx, skb->data %lx, length %d)", req->buf, skb->data, length);
+        if (length <= UDC_MAX_BUFLEN) {
+                memcpy(req->buf, skb->data, length);
+        }
+        else {
+                ERROR(dev, "memcpy of %d bytes bigger than max %d\n", length, UDC_MAX_BUFLEN);
+        }
+        VDEBUG(dev, "past memcpy(req->buf %lx, skb->data %lx, length %d)", req->buf, skb->data, length);
+#else
+        req->buf = skb->data;
+#endif
 	req->context = skb;
 	req->complete = tx_complete;
 
@@ -2202,6 +2263,8 @@ eth_bind (struct usb_gadget *gadget)
 		/* sh doesn't support multiple interfaces or configs */
 		cdc = 0;
 		rndis = 0;
+	} else if (gadget_is_au1200udc(gadget)) {
+		rndis = 0;
 	} else if (gadget_is_sa1100 (gadget)) {
 		/* hardware can't write zlps */
 		zlp = 0;
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c
index ea09aaa..ae800e6 100644
--- a/drivers/usb/gadget/file_storage.c
+++ b/drivers/usb/gadget/file_storage.c
@@ -263,8 +263,14 @@ MODULE_LICENSE("Dual BSD/GPL");
  *
  * DO NOT REUSE THESE IDs with any other driver!!  Ever!!
  * Instead:  allocate your own, using normal USB-IF procedures. */
+
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+#define DRIVER_VENDOR_ID	0x0438  // AMD
+#define DRIVER_PRODUCT_ID	0xdc02	// AMD Linux-USB File-backed Storage Gadget (temporary)
+#else
 #define DRIVER_VENDOR_ID	0x0525	// NetChip
 #define DRIVER_PRODUCT_ID	0xa4a5	// Linux-USB File-backed Storage Gadget
+#endif
 
 
 /*
@@ -3717,6 +3723,8 @@ static int __init check_parameters(struc
 		mod_data.can_stall = 0;
 
 	if (mod_data.release == 0xffff) {	// Parameter wasn't set
+		if (gadget_is_au1200udc(fsg->gadget))
+			mod_data.can_stall = 0;
 		/* The sa1100 controller is not supported */
 		if (gadget_is_sa1100(fsg->gadget))
 			gcnum = -1;
diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h
index 8cbae21..541fbd0 100644
--- a/drivers/usb/gadget/gadget_chips.h
+++ b/drivers/usb/gadget/gadget_chips.h
@@ -15,6 +15,12 @@
 #define	gadget_is_net2280(g)	0
 #endif
 
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+#define	gadget_is_au1200udc(g)	!strcmp("au1200udc", (g)->name)
+#else
+#define	gadget_is_au1200udc(g)	0
+#endif
+
 #ifdef CONFIG_USB_GADGET_DUMMY_HCD
 #define	gadget_is_dummy(g)	!strcmp("dummy_udc", (g)->name)
 #else
@@ -143,5 +149,7 @@ static inline int usb_gadget_controller_
 		return 0x13;
 	else if (gadget_is_imx(gadget))
 		return 0x14;
+	else if (gadget_is_au1200udc(gadget))
+		return 0x15;
 	return -ENOENT;
 }
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c
index 6c58636..4ec28bb 100644
--- a/drivers/usb/gadget/zero.c
+++ b/drivers/usb/gadget/zero.c
@@ -193,6 +193,10 @@ module_param (loopdefault, bool, S_IRUGO
  * DO NOT REUSE THESE IDs with a protocol-incompatible driver!!  Ever!!
  * Instead:  allocate your own, using normal USB-IF procedures.
  */
+#ifdef CONFIG_USB_GADGET_AU1200UDC
+#define DRIVER_VENDOR_NUM	0x0438		/* AMD */
+#define DRIVER_PRODUCT_NUM	0xdc00		/* AMD Linux-USB "Gadget Zero" (temporary) */
+#else
 #ifndef	CONFIG_USB_ZERO_HNPTEST
 #define DRIVER_VENDOR_NUM	0x0525		/* NetChip */
 #define DRIVER_PRODUCT_NUM	0xa4a0		/* Linux-USB "Gadget Zero" */
@@ -200,6 +204,7 @@ module_param (loopdefault, bool, S_IRUGO
 #define DRIVER_VENDOR_NUM	0x1a0a		/* OTG test device IDs */
 #define DRIVER_PRODUCT_NUM	0xbadd
 #endif
+#endif
 
 /*-------------------------------------------------------------------------*/
 
@@ -1127,8 +1132,11 @@ zero_unbind (struct usb_gadget *gadget)
 	DBG (dev, "unbind\n");
 
 	/* we've already been disconnected ... no i/o is active */
-	if (dev->req)
+	if (dev->req) {
+                /* free with original length */
+                dev->req->length = USB_BUFSIZ;
 		free_ep_req (gadget->ep0, dev->req);
+        }
 	del_timer_sync (&dev->resume);
 	kfree (dev);
 	set_gadget_data (gadget, NULL);

--3MwIy2ne0vdjdPXF--


From jcrouse@cosmic.amd.com Mon Jan  9 18:08:45 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 18:09:10 +0000 (GMT)
Received: from amdext3.amd.com ([139.95.251.6]:22252 "EHLO amdext3.amd.com")
	by ftp.linux-mips.org with ESMTP id S8133655AbWAISIp (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 9 Jan 2006 18:08:45 +0000
Received: from SSVLGW02.amd.com (ssvlgw02.amd.com [139.95.250.170])
	by amdext3.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k09IB2Pc005743;
	Mon, 9 Jan 2006 10:11:03 -0800
Received: from 139.95.250.1 by SSVLGW02.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Mon, 09 Jan 2006 10:10:49 -0800
X-Server-Uuid: 519AC16A-9632-469E-B354-112C592D09E8
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k09IAmVP020146; Mon, 9
 Jan 2006 10:10:49 -0800 (PST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id 99DF82028; Mon, 9 Jan 2006
 11:10:48 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k09IJPak009954; Mon, 9 Jan 2006 11:19:25
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k09IJODT009953; Mon, 9 Jan 2006 11:19:24 -0700
Date:	Mon, 9 Jan 2006 11:19:24 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	"Rodolfo Giometti" <giometti@linux.it>
cc:	linux-mips@linux-mips.org
Subject: Re: ALCHEMY:  Add SD support to AU1200 MMC/SD driver
Message-ID: <20060109181924.GK17575@cosmic.amd.com>
References: <20051202190108.GF28227@cosmic.amd.com>
 <20051214134139.GN22061@hulk.enneenne.com>
 <20051214155324.GC9734@cosmic.amd.com>
 <20060109174505.GD1373@gundam.enneenne.com>
MIME-Version: 1.0
In-Reply-To: <20060109174505.GD1373@gundam.enneenne.com>
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FDC78A32C43579203-01-01
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9823
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1440
Lines: 35

On 09/01/06 18:45 +0100, Rodolfo Giometti wrote:
> First of all I needed to disable the DMA support (dma = 0) and using
> the FIFO mode, since Au1100 dma support seems not well implemented (or
> not implemented at all) and my board freeze.

That sound you heard was me smacking my head because I'm an idiot.  Of
course, the DMA won't work for the AU1100, at least not that engine, so
you would certainly need to go for just PIO mode.

> After that, when I insert a 256MB MMC card I get the attached messages
> and the system refuses to power up the card (please, see the last
> message who reports the power status).

That message is innocent - it simply states that we couldn't identify your
card, so we're powering it down.  It looks like the card wasn't replying
to the CMD2, so the controller figured that there was nothing on the line.

> Have you any suggestions? :)

Well, first of all make sure that the driver is correct - I wrote it against
the AU1200 spec, so if there is something different in the AU1100 spec,
we'll have to #ifdef it.  Secondly, make sure the card really works.
Thirdly, you'll have to stick in printk() statements in the driver, to
make sure we're actually sending out the commands.  Finally, you might have
to stick a scope on the bus to make sure the protocol is sane on the
line.

Jordan

--
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>


From jcrouse@cosmic.amd.com Mon Jan  9 18:10:50 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 18:11:18 +0000 (GMT)
Received: from amdext4.amd.com ([163.181.251.6]:13699 "EHLO amdext4.amd.com")
	by ftp.linux-mips.org with ESMTP id S8134432AbWAISKu (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 9 Jan 2006 18:10:50 +0000
Received: from SAUSGW02.amd.com (sausgw02.amd.com [163.181.250.22])
	by amdext4.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k09IDe7P000365;
	Mon, 9 Jan 2006 12:13:40 -0600
Received: from 163.181.250.1 by SAUSGW01.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Mon, 09 Jan 2006 12:13:19 -0600
X-Server-Uuid: 8C3DB987-180B-4465-9446-45C15473FD3E
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint2.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k09IDIh5025523; Mon,
 9 Jan 2006 12:13:18 -0600 (CST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id 5428D2028; Mon, 9 Jan 2006
 11:13:18 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k09ILsiN009983; Mon, 9 Jan 2006 11:21:54
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k09ILsPc009982; Mon, 9 Jan 2006 11:21:54 -0700
Date:	Mon, 9 Jan 2006 11:21:54 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	linux-usb-devel@lists.sourceforge.net
cc:	linux-mips@linux-mips.org, linux-kernel@vger.kernel.org,
	info-linux@ldcmail.amd.com, thomas.dahlmann@amd.com
Subject: Re: UDC support for MIPS/AU1200 and Geode/CS5536
Message-ID: <20060109182154.GL17575@cosmic.amd.com>
References: <20060109180356.GA8855@cosmic.amd.com>
MIME-Version: 1.0
In-Reply-To: <20060109180356.GA8855@cosmic.amd.com>
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FDC78353982717051-01-01
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9824
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 453
Lines: 15

On 09/01/06 11:03 -0700, Jordan Crouse wrote:

> From the "two-birds-one-stone" department, I am pleased to present USB UDC
> support for both the MIPS Au1200 SoC and the Geode CS5535 south bridge.  
                                                     ^^^^^^
Of course, I meant the CS5536 - this *won't* work for the CS5535.

Jordan

-- 
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>


From jcrouse@cosmic.amd.com Mon Jan  9 18:44:58 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 18:45:17 +0000 (GMT)
Received: from amdext4.amd.com ([163.181.251.6]:3975 "EHLO amdext4.amd.com")
	by ftp.linux-mips.org with ESMTP id S8133657AbWAISo6 (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 9 Jan 2006 18:44:58 +0000
Received: from SAUSGW02.amd.com (sausgw02.amd.com [163.181.250.22])
	by amdext4.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k09IlrFP006887;
	Mon, 9 Jan 2006 12:47:53 -0600
Received: from 163.181.250.1 by SAUSGW02.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Mon, 09 Jan 2006 12:47:41 -0600
X-Server-Uuid: 5FC0E2DF-CD44-48CD-883A-0ED95B391E89
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint2.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k09Ilfh5027308; Mon,
 9 Jan 2006 12:47:41 -0600 (CST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id E71E12028; Mon, 9 Jan 2006
 11:47:40 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k09IuH7J011581; Mon, 9 Jan 2006 11:56:17
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k09IuHSu011580; Mon, 9 Jan 2006 11:56:17 -0700
Date:	Mon, 9 Jan 2006 11:56:17 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	linux-mips@linux-mips.org
cc:	ralf@linux-mips.org
Subject: [PATCH] Cleanups for au1000/common/time.c
Message-ID: <20060109185617.GN17575@cosmic.amd.com>
MIME-Version: 1.0
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FDC70470T02739764-01-01
Content-Type: multipart/mixed;
 boundary="ibTvN161/egqYuK8"
Content-Disposition: inline
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9825
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1592
Lines: 59


--ibTvN161/egqYuK8
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit

Cleaning out my pending queue, this is a patch from Sergei Shtylyov
that just does some minor cleanups in au1000/common/time.c - fairly
trivial stuff.

Jordan

--ibTvN161/egqYuK8
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline;
 filename=Au1xx0-time-cleanup.patch
Content-Transfer-Encoding: 7bit

Cleanups in arch/mips/au1000/common/time.c

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
---

 arch/mips/au1000/common/time.c |    9 ++-------
 1 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/arch/mips/au1000/common/time.c b/arch/mips/au1000/common/time.c
index 883d3f3..fe883d4 100644
--- a/arch/mips/au1000/common/time.c
+++ b/arch/mips/au1000/common/time.c
@@ -50,10 +50,6 @@
 #include <linux/mc146818rtc.h>
 #include <linux/timex.h>
 
-extern void do_softirq(void);
-extern volatile unsigned long wall_jiffies;
-unsigned long missed_heart_beats = 0;
-
 static unsigned long r4k_offset; /* Amount to increment compare reg each time */
 static unsigned long r4k_cur;    /* What counter should be at next timer irq */
 int	no_au1xxx_32khz;
@@ -387,10 +383,9 @@ static unsigned long do_fast_pm_gettimeo
 }
 #endif
 
-void au1xxx_timer_setup(struct irqaction *irq)
+void __init au1xxx_timer_setup(struct irqaction *irq)
 {
-        unsigned int est_freq;
-	extern unsigned long (*do_gettimeoffset)(void);
+	unsigned int est_freq;
 
 	printk("calculating r4koff... ");
 	r4k_offset = cal_r4koff();

--ibTvN161/egqYuK8--


From wd@denx.de Mon Jan  9 21:20:39 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 21:20:58 +0000 (GMT)
Received: from mail-out.m-online.net ([212.18.0.9]:2758 "EHLO
	mail-out.m-online.net") by ftp.linux-mips.org with ESMTP
	id S8133646AbWAIVUi (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 21:20:38 +0000
Received: from mail01.m-online.net (svr21.m-online.net [192.168.3.149])
	by mail-out.m-online.net (Postfix) with ESMTP id 5F5A9708CE;
	Mon,  9 Jan 2006 22:23:40 +0100 (CET)
X-Auth-Info: 9rjmi9LVaZAfXEmq1oWowzyjKRYS8/8gJ+kKZWZYKBM=
X-Auth-Info: 9rjmi9LVaZAfXEmq1oWowzyjKRYS8/8gJ+kKZWZYKBM=
X-Auth-Info: 9rjmi9LVaZAfXEmq1oWowzyjKRYS8/8gJ+kKZWZYKBM=
Received: from mail.denx.de (p54966F34.dip.t-dialin.net [84.150.111.52])
	by smtp-auth.mnet-online.de (Postfix) with ESMTP id 46146B96D9;
	Mon,  9 Jan 2006 22:23:40 +0100 (CET)
Received: from atlas.denx.de (atlas.denx.de [10.0.0.14])
	by mail.denx.de (Postfix) with ESMTP id D7A556D00A8;
	Mon,  9 Jan 2006 22:23:39 +0100 (MET)
Received: from atlas.denx.de (localhost.localdomain [127.0.0.1])
	by atlas.denx.de (Postfix) with ESMTP id C8289353A66;
	Mon,  9 Jan 2006 22:23:39 +0100 (MET)
To:	"Kevin D. Kissell" <kevink@mips.com>
cc:	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>,
	linux-mips@linux-mips.org
From:	Wolfgang Denk <wd@denx.de>
Subject: Re: [processor frequency]
Mime-version: 1.0
Content-type: text/plain; charset=ISO-8859-1
Content-transfer-encoding: 8bit
In-reply-to: Your message of "Mon, 09 Jan 2006 10:00:48 +0100."
             <005a01c614fb$2fe76b00$10eca8c0@grendel> 
Date:	Mon, 09 Jan 2006 22:23:39 +0100
Message-Id: <20060109212339.C8289353A66@atlas.denx.de>
Return-Path: <wd@denx.de>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9826
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: wd@denx.de
Precedence: bulk
X-list: linux-mips
Content-Length: 1136
Lines: 25

In message <005a01c614fb$2fe76b00$10eca8c0@grendel> you wrote:
> There is no "ideal" value for a given processor frequency.
> The lower the value, the less interrupt processing overhead,
> but the slower the response time to events that are detected
> or serviced during clock interrupts. 1000 HZ *may* be a sensible
> value (I have my doubts, personally) for 2+ GHz PC processors, 
> but it's excessive (IMHO) for a 200MHz processor and unworkable 
> for a 20MHz CPU. I think that 100HZ is still a reasonable value
> for an embedded RISC CPU, but the "ideal" value is going to
> be a function of the application.

We did some tests of the performance impact of 100 vs. 1000 Hz  clock
frequency on low end systems (50 MHz PowerPC); for details please see
http://www.denx.de/wiki/view/Know/Clock100vs1000Hz

Best regards,

Wolfgang Denk

-- 
Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
Our missions are peaceful -- not for conquest.  When we do battle, it
is only because we have no choice.
	-- Kirk, "The Squire of Gothos", stardate 2124.5

From kevink@mips.com Mon Jan  9 21:49:15 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 21:49:35 +0000 (GMT)
Received: from 209-232-97-206.ded.pacbell.net ([209.232.97.206]:20463 "EHLO
	dns0.mips.com") by ftp.linux-mips.org with ESMTP id S8133508AbWAIVtP
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 21:49:15 +0000
Received: from mercury.mips.com (sbcns-dmz [209.232.97.193])
	by dns0.mips.com (8.12.11/8.12.11) with ESMTP id k09LplR0013566;
	Mon, 9 Jan 2006 13:51:48 -0800 (PST)
Received: from [192.168.236.16] (grendel [192.168.236.16])
	by mercury.mips.com (8.12.9/8.12.11) with ESMTP id k09LphYr015673;
	Mon, 9 Jan 2006 13:51:44 -0800 (PST)
Message-ID: <43C2DB61.7090704@mips.com>
Date:	Mon, 09 Jan 2006 22:53:37 +0100
From:	"Kevin D. Kissell" <kevink@mips.com>
User-Agent: Thunderbird 1.5 (X11/20051025)
MIME-Version: 1.0
To:	Wolfgang Denk <wd@denx.de>
CC:	Sathesh Babu Edara <satheshbabu.edara@analog.com>,
	linux-mips@linux-mips.org
Subject: Re: [processor frequency]
References: <20060109212339.C8289353A66@atlas.denx.de>
In-Reply-To: <20060109212339.C8289353A66@atlas.denx.de>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.39
Return-Path: <kevink@mips.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9827
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: kevink@mips.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1485
Lines: 31

Wolfgang Denk wrote:
> In message <005a01c614fb$2fe76b00$10eca8c0@grendel> you wrote:
>> There is no "ideal" value for a given processor frequency.
>> The lower the value, the less interrupt processing overhead,
>> but the slower the response time to events that are detected
>> or serviced during clock interrupts. 1000 HZ *may* be a sensible
>> value (I have my doubts, personally) for 2+ GHz PC processors, 
>> but it's excessive (IMHO) for a 200MHz processor and unworkable 
>> for a 20MHz CPU. I think that 100HZ is still a reasonable value
>> for an embedded RISC CPU, but the "ideal" value is going to
>> be a function of the application.
> 
> We did some tests of the performance impact of 100 vs. 1000 Hz  clock
> frequency on low end systems (50 MHz PowerPC); for details please see
> http://www.denx.de/wiki/view/Know/Clock100vs1000Hz

My own results, on an SMP 2.6 kernel (as opposed to the uniprocessor
2.4 kernel used for the experiments reported) have been rather different.
Certainly the degradations I observed were far worse than the 5-10% reported
in the document you cite.  I'll try to repeat your experiment when I get
the time.

BTW, I'm puzzled by the "context switch" benchmark test results.  By what
mechanism - or by what definition of "context switch" - can having more
frequent interrupts make context switches happen more quickly?  It seems
to me that those results must be due to a systematic measurement error
being added/removed.

		Regards,

		Kevin K

From earlm@mips.com Mon Jan  9 21:59:21 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 21:59:38 +0000 (GMT)
Received: from 209-232-97-206.ded.pacbell.net ([209.232.97.206]:24559 "EHLO
	dns0.mips.com") by ftp.linux-mips.org with ESMTP id S8133508AbWAIV7V convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 21:59:21 +0000
Received: from mercury.mips.com (sbcns-dmz [209.232.97.193])
	by dns0.mips.com (8.12.11/8.12.11) with ESMTP id k09M1DcR013598;
	Mon, 9 Jan 2006 14:01:14 -0800 (PST)
Received: from exchange.MIPS.COM (exchange [192.168.20.29])
	by mercury.mips.com (8.12.9/8.12.11) with ESMTP id k09M1DYr015869;
	Mon, 9 Jan 2006 14:01:14 -0800 (PST)
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 8BIT
X-MimeOLE: Produced By Microsoft Exchange V6.5.7226.0
Subject: RE: [processor frequency]
Date:	Mon, 9 Jan 2006 14:00:50 -0800
Message-ID: <3CB54817FDF733459B230DD27C690CEC010495E3@Exchange.MIPS.COM>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: [processor frequency]
Thread-Index: AcYVYxdD0AdhrbWSQZmY/XYAU4nEFQAAlBdg
From:	"Mitchell, Earl" <earlm@mips.com>
To:	"Wolfgang Denk" <wd@denx.de>, "Kevin D. Kissell" <kevink@mips.com>
Cc:	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>,
	<linux-mips@linux-mips.org>
X-Scanned-By: MIMEDefang 2.39
Return-Path: <earlm@mips.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9828
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: earlm@mips.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2045
Lines: 52


Wolfgang, 

In your summary you mention ...

 "This probably explains why many developers who never use low-end embedded processors don't care about (and usually don't even know of) these problems in the 2.6 kernel."

The desktop/server guys typically use much larger caches (i.e. >= 512K)
and most have L2, compared to embedded systems which typically use less
without an L2. So I'd also expect embedded guys using small caches to see 
larger decreases in performance due to more cache misses (i.e. more 
interrupts produce more evictions). 

-earlm


> -----Original Message-----
> From: linux-mips-bounce@linux-mips.org
> [mailto:linux-mips-bounce@linux-mips.org]On Behalf Of Wolfgang Denk
> Sent: Monday, January 09, 2006 1:24 PM
> To: Kevin D. Kissell
> Cc: Sathesh Babu Edara; linux-mips@linux-mips.org
> Subject: Re: [processor frequency]
> 
> 
> In message <005a01c614fb$2fe76b00$10eca8c0@grendel> you wrote:
> > There is no "ideal" value for a given processor frequency.
> > The lower the value, the less interrupt processing overhead,
> > but the slower the response time to events that are detected
> > or serviced during clock interrupts. 1000 HZ *may* be a sensible
> > value (I have my doubts, personally) for 2+ GHz PC processors, 
> > but it's excessive (IMHO) for a 200MHz processor and unworkable 
> > for a 20MHz CPU. I think that 100HZ is still a reasonable value
> > for an embedded RISC CPU, but the "ideal" value is going to
> > be a function of the application.
> 
> We did some tests of the performance impact of 100 vs. 1000 Hz  clock
> frequency on low end systems (50 MHz PowerPC); for details please see
> http://www.denx.de/wiki/view/Know/Clock100vs1000Hz
> 
> Best regards,
> 
> Wolfgang Denk
> 
> -- 
> Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
> Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
> Our missions are peaceful -- not for conquest.  When we do battle, it
> is only because we have no choice.
> 	-- Kirk, "The Squire of Gothos", stardate 2124.5
> 
> 

From oliver@neukum.org Mon Jan  9 22:41:47 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 22:42:04 +0000 (GMT)
Received: from mail1.kontent.de ([81.88.34.36]:64898 "EHLO Mail1.KONTENT.De")
	by ftp.linux-mips.org with ESMTP id S8133508AbWAIWlr (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 9 Jan 2006 22:41:47 +0000
Received: from p549A1508.dip0.t-ipconnect.de (p549A1508.dip0.t-ipconnect.de [84.154.21.8])
	by Mail1.KONTENT.De (Postfix) with ESMTP id 0AE4210D7EF6;
	Mon,  9 Jan 2006 23:44:58 +0100 (CET)
From:	Oliver Neukum <oliver@neukum.org>
To:	linux-usb-devel@lists.sourceforge.net
Subject: Re: [linux-usb-devel] [PATCH] UDC support for MIPS/AU1200 and Geode/CS5536
Date:	Mon, 9 Jan 2006 23:44:55 +0100
User-Agent: KMail/1.8
Cc:	"Jordan Crouse" <jordan.crouse@amd.com>, linux-mips@linux-mips.org,
	linux-kernel@vger.kernel.org, info-linux@ldcmail.amd.com,
	thomas.dahlmann@amd.com
References: <20060109180356.GA8855@cosmic.amd.com>
In-Reply-To: <20060109180356.GA8855@cosmic.amd.com>
MIME-Version: 1.0
Content-Type: text/plain;
  charset="utf-8"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200601092344.55988.oliver@neukum.org>
Return-Path: <oliver@neukum.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9829
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: oliver@neukum.org
Precedence: bulk
X-list: linux-mips
Content-Length: 769
Lines: 23

Am Montag, 9. Januar 2006 19:03 schrieb Jordan Crouse:
> >From the "two-birds-one-stone" department, I am pleased to present USB UDC
> support for both the MIPS Au1200 SoC and the Geode CS5535 south bridge.  
> Also, coming soon (in the next few days), OTG, which has been removed from
> the usb_host patch, and put into its own patch (as per David's comments).
> 
> This patch is against current linux-mips git, but it should apply for Linus's
> tree as well.
> 
> Regards,
> Jordan
> 
+        VDBG("udc_read_bytes(): %d bytes\n", bytes);
+
+        /* dwords first */
+        for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) {
+               *((u32*) (buf + (i<<2))) = readl(dev->rxfifo); 
+        }

Is there any reason you don't increment by 4?

	Regards
		Oliver

From wd@denx.de Mon Jan  9 22:58:46 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 22:59:03 +0000 (GMT)
Received: from mail-out.m-online.net ([212.18.0.9]:3288 "EHLO
	mail-out.m-online.net") by ftp.linux-mips.org with ESMTP
	id S8133508AbWAIW6n (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 22:58:43 +0000
Received: from mail01.m-online.net (svr21.m-online.net [192.168.3.149])
	by mail-out.m-online.net (Postfix) with ESMTP id C9DD170467;
	Tue, 10 Jan 2006 00:01:42 +0100 (CET)
X-Auth-Info: /dHVD3Y4gS4wvlw+cdjISgOenRl4Gd81VHHP7i1LL9A=
X-Auth-Info: /dHVD3Y4gS4wvlw+cdjISgOenRl4Gd81VHHP7i1LL9A=
X-Auth-Info: /dHVD3Y4gS4wvlw+cdjISgOenRl4Gd81VHHP7i1LL9A=
Received: from mail.denx.de (p54966F34.dip.t-dialin.net [84.150.111.52])
	by smtp-auth.mnet-online.de (Postfix) with ESMTP id B3C56B8F14;
	Tue, 10 Jan 2006 00:01:42 +0100 (CET)
Received: from atlas.denx.de (atlas.denx.de [10.0.0.14])
	by mail.denx.de (Postfix) with ESMTP id 5E9466D00A8;
	Tue, 10 Jan 2006 00:01:42 +0100 (MET)
Received: from atlas.denx.de (localhost.localdomain [127.0.0.1])
	by atlas.denx.de (Postfix) with ESMTP id 51979354115;
	Tue, 10 Jan 2006 00:01:42 +0100 (MET)
To:	"Kevin D. Kissell" <kevink@mips.com>
cc:	Sathesh Babu Edara <satheshbabu.edara@analog.com>,
	linux-mips@linux-mips.org
From:	Wolfgang Denk <wd@denx.de>
Subject: Re: [processor frequency] 
Mime-version: 1.0
Content-type: text/plain; charset=ISO-8859-1
Content-transfer-encoding: 8bit
In-reply-to: Your message of "Mon, 09 Jan 2006 22:53:37 +0100."
             <43C2DB61.7090704@mips.com> 
Date:	Tue, 10 Jan 2006 00:01:42 +0100
Message-Id: <20060109230142.51979354115@atlas.denx.de>
Return-Path: <wd@denx.de>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9830
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: wd@denx.de
Precedence: bulk
X-list: linux-mips
Content-Length: 912
Lines: 22

In message <43C2DB61.7090704@mips.com> you wrote:
>
> BTW, I'm puzzled by the "context switch" benchmark test results.  By what
> mechanism - or by what definition of "context switch" - can having more
> frequent interrupts make context switches happen more quickly?  It seems
> to me that those results must be due to a systematic measurement error
> being added/removed.

I have to admit that I don't have a good explanation for this either.
It's what I got with (repeated) measurements.  Cache  (flush)  issues
might  play  a  role  here - but without closer analysis this is just
speculation.

Best regards,

Wolfgang Denk

-- 
Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
If you can't beat it or corrupt it, you pretend it was your  idea  in
the first place.                 - Terry Pratchett, _Guards! Guards!_

From wd@denx.de Mon Jan  9 23:02:53 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 09 Jan 2006 23:03:11 +0000 (GMT)
Received: from mail-out.m-online.net ([212.18.0.9]:33752 "EHLO
	mail-out.m-online.net") by ftp.linux-mips.org with ESMTP
	id S8133508AbWAIXCx (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 9 Jan 2006 23:02:53 +0000
Received: from mail01.m-online.net (svr21.m-online.net [192.168.3.149])
	by mail-out.m-online.net (Postfix) with ESMTP id E0FDC709A4;
	Tue, 10 Jan 2006 00:05:55 +0100 (CET)
X-Auth-Info: DoUMI+ncKDIHJ3bvPx28S3wmpFjkruShDtx+NMfL6yM=
X-Auth-Info: DoUMI+ncKDIHJ3bvPx28S3wmpFjkruShDtx+NMfL6yM=
X-Auth-Info: DoUMI+ncKDIHJ3bvPx28S3wmpFjkruShDtx+NMfL6yM=
X-Auth-Info: DoUMI+ncKDIHJ3bvPx28S3wmpFjkruShDtx+NMfL6yM=
Received: from mail.denx.de (p54966F34.dip.t-dialin.net [84.150.111.52])
	by smtp-auth.mnet-online.de (Postfix) with ESMTP id C7905B8CE8;
	Tue, 10 Jan 2006 00:05:55 +0100 (CET)
Received: from atlas.denx.de (atlas.denx.de [10.0.0.14])
	by mail.denx.de (Postfix) with ESMTP id 6B62A6D00A8;
	Tue, 10 Jan 2006 00:05:55 +0100 (MET)
Received: from atlas.denx.de (localhost.localdomain [127.0.0.1])
	by atlas.denx.de (Postfix) with ESMTP id 5A961354115;
	Tue, 10 Jan 2006 00:05:55 +0100 (MET)
To:	"Mitchell, Earl" <earlm@mips.com>
Cc:	"Kevin D. Kissell" <kevink@mips.com>,
	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>,
	linux-mips@linux-mips.org
From:	Wolfgang Denk <wd@denx.de>
Subject: Re: [processor frequency] 
Mime-version: 1.0
Content-type: text/plain; charset=ISO-8859-1
Content-transfer-encoding: 8bit
In-reply-to: Your message of "Mon, 09 Jan 2006 14:00:50 PST."
             <3CB54817FDF733459B230DD27C690CEC010495E3@Exchange.MIPS.COM> 
Date:	Tue, 10 Jan 2006 00:05:55 +0100
Message-Id: <20060109230555.5A961354115@atlas.denx.de>
Return-Path: <wd@denx.de>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9831
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: wd@denx.de
Precedence: bulk
X-list: linux-mips
Content-Length: 922
Lines: 23

Hello,

in message <3CB54817FDF733459B230DD27C690CEC010495E3@Exchange.MIPS.COM> you wrote:
> 
> The desktop/server guys typically use much larger caches (i.e. >= 512K)
> and most have L2, compared to embedded systems which typically use less
> without an L2. So I'd also expect embedded guys using small caches to see 
> larger decreases in performance due to more cache misses (i.e. more 
> interrupts produce more evictions). 

Corrent. FYI: the system used in my tests is a PowerPC at 50 MHz  CPU
clock with 4 kB I-Cache and 4 kB D-Cache ...

Best regards,

Wolfgang Denk

-- 
Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
Every program has at least one bug and can be shortened by  at  least
one instruction - from which, by induction, one can deduce that every
program can be reduced to one instruction which doesn't work.

From zzh.hust@gmail.com Tue Jan 10 00:59:42 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 01:00:00 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.206]:7103 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8134419AbWAJA7m convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 00:59:42 +0000
Received: by wproxy.gmail.com with SMTP id 36so65034wra
        for <linux-mips@linux-mips.org>; Mon, 09 Jan 2006 17:02:44 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=mlQWPMnA3akhkZEApBJr2eMBLnHHoB5unlK5Vo82fmDQM6RIZbD5VTlUU6b1m6q0Hhgbm3NozKDrWcfjoxB2v7WQuGFGEedHpPJDwRrmlqNgwuXqbwW6UqZ6qkYLLN8F/q6kE6ZLbvlUY4hs8Q6vm7sUhOn18BQ7P4vXNB9ySsE=
Received: by 10.54.108.2 with SMTP id g2mr220355wrc;
        Mon, 09 Jan 2006 17:02:43 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Mon, 9 Jan 2006 17:02:43 -0800 (PST)
Message-ID: <50c9a2250601091702g7e48c75br178868a3c91d48f4@mail.gmail.com>
Date:	Tue, 10 Jan 2006 09:02:43 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	Ralf Baechle <ralf@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
In-Reply-To: <20060109152429.GE4286@linux-mips.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
	 <20060109145610.GB4286@linux-mips.org>
	 <200601091720.03822.p_christ@hol.gr>
	 <20060109152429.GE4286@linux-mips.org>
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9832
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 748
Lines: 25

On 1/9/06, Ralf Baechle <ralf@linux-mips.org> wrote:
> On Mon, Jan 09, 2006 at 05:20:01PM +0200, P. Christeas wrote:
>
> > > You've downloaded a kernel.org kernel it would seem - doesn't fly for MIPS.
> > > Instead get a kernel from linux-mips.org.
> > >
> > > The early_initcall() construct has been removed.
> > >
> > >   Ralf
> >
> > What's the difference between the trees?
>
> All the MIPS work is happening in the linux-mips.org tree.
>
> > Aren't the MIPS patches supposed to be merged to Linus' tree?
>
> In 2.6.15 things were alomst fully merged but several megabytes of
> patches are between the linux-mips.org and kernel.org versions of 2.6.14.
>
>   Ralf
>

in linux-mips, where to download the patches for standard kernel?

zhuzhenhua

From zzh.hust@gmail.com Tue Jan 10 06:00:16 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 06:00:34 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.206]:43376 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133398AbWAJGAQ convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 06:00:16 +0000
Received: by wproxy.gmail.com with SMTP id 36so96011wra
        for <linux-mips@linux-mips.org>; Mon, 09 Jan 2006 22:03:19 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=CnjSUQSGiictdoYY6r8TPbMHWb/4A2a5FnDv9iX+eJR4b/SjNaCZJBx84dtjYBwlCWtyDWpRYIdnn4hRnET07U23rXupT8YgDT9xU2kGqcmU49XQEkmabl1JcHYiZ2xFYCssE5ubPPC9yceFa+gsJ/mWNiM/+1rnNJlOWbX3Nlw=
Received: by 10.54.151.9 with SMTP id y9mr442986wrd;
        Mon, 09 Jan 2006 22:03:19 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Mon, 9 Jan 2006 22:03:19 -0800 (PST)
Message-ID: <50c9a2250601092203y2cd68d65rf712174e31d41806@mail.gmail.com>
Date:	Tue, 10 Jan 2006 14:03:19 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	linux-mips <linux-mips@linux-mips.org>
Subject: how to make zImage in linux 2.6?
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9833
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 285
Lines: 8

i download a 2.6.14 kernel, i find it can compile vmlinux,
vmlinux.srec, but i can't find how to make zImage.
In 2.4.x, there is a arch/mips/zboot/ to add board-special code to make zImage.
and i do not find similiar codes in 2.6.does the 2.6 support zImage?

Best regards

zhuzhenhua

From dom@mips.com Tue Jan 10 09:33:29 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 09:33:51 +0000 (GMT)
Received: from alg145.algor.co.uk ([62.254.210.145]:51206 "EHLO
	dmz.algor.co.uk") by ftp.linux-mips.org with ESMTP id S8133415AbWAJJd3
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 09:33:29 +0000
Received: from alg158.algor.co.uk ([62.254.210.158] helo=olympia.mips.com)
	by dmz.algor.co.uk with esmtp (Exim 3.35 #1 (Debian))
	id 1EwFsa-00040s-00; Tue, 10 Jan 2006 09:33:24 +0000
Received: from olympia.mips.com ([192.168.192.128] helo=boris)
	by olympia.mips.com with esmtp (Exim 3.36 #1 (Debian))
	id 1EwFvE-0005hQ-00; Tue, 10 Jan 2006 09:36:08 +0000
From:	Dominic Sweetman <dom@mips.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-ID: <17347.32817.144103.968382@mips.com>
Date:	Tue, 10 Jan 2006 09:36:49 +0000
To:	"Mitchell, Earl" <earlm@mips.com>
Cc:	"Wolfgang Denk" <wd@denx.de>, "Kevin D. Kissell" <kevink@mips.com>,
	"Sathesh Babu Edara" <satheshbabu.edara@analog.com>,
	<linux-mips@linux-mips.org>
Subject: RE: [processor frequency]
In-Reply-To: <3CB54817FDF733459B230DD27C690CEC010495E3@Exchange.MIPS.COM>
References: <3CB54817FDF733459B230DD27C690CEC010495E3@Exchange.MIPS.COM>
X-Mailer: VM 7.17 under 21.4 (patch 17) "Jumbo Shrimp" XEmacs Lucid
X-MTUK-Scanner:	Found to be clean
X-MTUK-SpamCheck: not spam (whitelisted), SpamAssassin (score=-4.856,
	required 4, AWL, BAYES_00)
Return-Path: <dom@mips.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9834
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: dom@mips.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1246
Lines: 30


My colleague Earl writes:

> The desktop/server guys typically use much larger caches (i.e. >= 512K)
> and most have L2, compared to embedded systems which typically use less
> without an L2. So I'd also expect embedded guys using small caches to see 
> larger decreases in performance due to more cache misses (i.e. more 
> interrupts produce more evictions). 

It's certainly true that running an interrupt routine (even one which
doesn't lead to any scheduling activity) will cause some cache
traffic.  But it is important to keep the relative timescales in mind.
With an averagely bad memory system, evicting and replacing a cache
line costs 150ns read latency, with a 100ns writeback (notionally done
"in the background" just after the read) on about one miss in four...

Let's make some pessimistic assumptions.  Suppose an interrupt routine
displaces 2KB of code and data and uses 32-byte cache lines, and we
assume the process happens twice as the background process refills the
cache to its liking.  Then we'll get 120 odd reads, which will cost
about 20us, about 2% of total time on a 1KHz clock.  That doesn't
sound like it should be a huge effect.

It would be better to measure it, though.

--
Dominic Sweetman
MIPS Technologies.



From giometti@enneenne.com Tue Jan 10 10:30:10 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 10:30:31 +0000 (GMT)
Received: from 81-174-11-161.f5.ngi.it ([81.174.11.161]:38316 "EHLO
	gundam.enneenne.com") by ftp.linux-mips.org with ESMTP
	id S8133415AbWAJKaK (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 10:30:10 +0000
Received: from giometti by gundam.enneenne.com with local (Exim 3.36 #1 (Debian))
	id 1EwGoR-0007ta-00
	for <linux-mips@linux-mips.org>; Tue, 10 Jan 2006 11:33:11 +0100
Date:	Tue, 10 Jan 2006 11:33:11 +0100
From:	Rodolfo Giometti <giometti@linux.it>
To:	linux-mips@linux-mips.org
Subject: [PATCH] IrDA support for au1000/au1100
Message-ID: <20060110103311.GE1373@gundam.enneenne.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="5Mfx4RzfBqgnTE/w"
Content-Disposition: inline
Organization: Programmi e soluzioni GNU/Linux
X-PGP-Key: gpg --keyserver keyserver.penguin.de --recv-keys D25A5633
User-Agent: Mutt/1.5.5.1+cvs20040105i
Return-Path: <giometti@enneenne.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9835
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: giometti@linux.it
Precedence: bulk
X-list: linux-mips
Content-Length: 11665
Lines: 361


--5Mfx4RzfBqgnTE/w
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hello.

Here a patch for IrDA support on au1000 and au1100 CPUs in order to
work with linux 2.6.x.

I tested the software with an au1100 based board.

Ciao,

Rodolfo

-- 

GNU/Linux Solutions                  e-mail:    giometti@enneenne.com
Linux Device Driver                             giometti@gnudd.com
Embedded Systems                     		giometti@linux.it
UNIX programming                     phone:     +39 349 2432127

--5Mfx4RzfBqgnTE/w
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="au1000_irda.patch"

diff --git a/drivers/net/irda/Kconfig b/drivers/net/irda/Kconfig
index d54156f..190138e 100644
--- a/drivers/net/irda/Kconfig
+++ b/drivers/net/irda/Kconfig
@@ -342,8 +342,8 @@ config TOSHIBA_FIR
 	  donauboe.
 
 config AU1000_FIR
-	tristate "Alchemy Au1000 SIR/FIR"
-	depends on MIPS_AU1000 && IRDA
+	tristate "Alchemy Au1000/Au1100 SIR/FIR"
+	depends on ( SOC_AU1000 || SOC_AU1100 ) && IRDA
 
 config SMC_IRCC_FIR
 	tristate "SMSC IrCC (EXPERIMENTAL)"
diff --git a/drivers/net/irda/au1k_ir.c b/drivers/net/irda/au1k_ir.c
index e6b1985..34071f3 100644
--- a/drivers/net/irda/au1k_ir.c
+++ b/drivers/net/irda/au1k_ir.c
@@ -5,6 +5,8 @@
  * Author: MontaVista Software, Inc.
  *         	ppopov@mvista.com or source@mvista.com
  *
+ * Driver ported to Linux 2.6.x by Rodolfo Giometti <giometti@linux.it>
+ *
  *  This program is free software; you can distribute it and/or modify it
  *  under the terms of the GNU General Public License (Version 2) as
  *  published by the Free Software Foundation.
@@ -32,19 +34,13 @@
 
 #include <asm/irq.h>
 #include <asm/io.h>
-#include <asm/au1000.h>
-#if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100)
-#include <asm/pb1000.h>
-#elif defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
-#include <asm/db1x00.h>
-#else 
-#error au1k_ir: unsupported board
-#endif
 
 #include <net/irda/irda.h>
 #include <net/irda/irmod.h>
 #include <net/irda/wrapper.h>
 #include <net/irda/irda_device.h>
+
+#include <au1xxx.h>
 #include "au1000_ircc.h"
 
 static int au1k_irda_net_init(struct net_device *);
@@ -52,7 +48,7 @@ static int au1k_irda_start(struct net_de
 static int au1k_irda_stop(struct net_device *dev);
 static int au1k_irda_hard_xmit(struct sk_buff *, struct net_device *);
 static int au1k_irda_rx(struct net_device *);
-static void au1k_irda_interrupt(int, void *, struct pt_regs *);
+static irqreturn_t au1k_irda_interrupt(int, void *, struct pt_regs *);
 static void au1k_tx_timeout(struct net_device *);
 static struct net_device_stats *au1k_irda_stats(struct net_device *);
 static int au1k_irda_ioctl(struct net_device *, struct ifreq *, int);
@@ -78,12 +74,16 @@ static DEFINE_SPINLOCK(ir_lock);
  * IrDA peripheral bug. You have to read the register
  * twice to get the right value.
  */
-u32 read_ir_reg(u32 addr) 
+static inline u32 read_ir_reg(unsigned long addr) 
 { 
-	readl(addr);
-	return readl(addr);
+	au_readl(addr);
+	return au_readl(addr);
 }
 
+static inline void write_ir_reg(u32 data, unsigned long addr) 
+{ 
+	au_writel(data, addr);
+}
 
 /*
  * Buffer allocation/deallocation routines. The buffer descriptor returned
@@ -259,7 +259,7 @@ static int au1k_irda_net_init(struct net
 	/* attach a data buffer to each descriptor */
 	for (i=0; i<NUM_IR_DESC; i++) {
 		pDB = GetFreeDB(aup);
-		if (!pDB) goto out;
+		if (!pDB) goto out3;
 		aup->rx_ring[i]->addr_0 = (u8)(pDB->dma_addr & 0xff);
 		aup->rx_ring[i]->addr_1 = (u8)((pDB->dma_addr>>8) & 0xff);
 		aup->rx_ring[i]->addr_2 = (u8)((pDB->dma_addr>>16) & 0xff);
@@ -268,7 +268,7 @@ static int au1k_irda_net_init(struct net
 	}
 	for (i=0; i<NUM_IR_DESC; i++) {
 		pDB = GetFreeDB(aup);
-		if (!pDB) goto out;
+		if (!pDB) goto out4;
 		aup->tx_ring[i]->addr_0 = (u8)(pDB->dma_addr & 0xff);
 		aup->tx_ring[i]->addr_1 = (u8)((pDB->dma_addr>>8) & 0xff);
 		aup->tx_ring[i]->addr_2 = (u8)((pDB->dma_addr>>16) & 0xff);
@@ -288,6 +288,9 @@ static int au1k_irda_net_init(struct net
 
 	return 0;
 
+out4:
+	ReleaseDB(aup, pDB);
+
 out3:
 	dma_free((void *)aup->rx_ring[0],
 		2 * MAX_NUM_IR_DESC*(sizeof(ring_dest_t)));
@@ -320,22 +323,22 @@ static int au1k_init(struct net_device *
 		aup->rx_ring[i]->flags = AU_OWN;
 	}
 
-	writel(control, IR_INTERFACE_CONFIG);
+	write_ir_reg(control, IR_INTERFACE_CONFIG);
 	au_sync_delay(10);
 
-	writel(read_ir_reg(IR_ENABLE) & ~0x8000, IR_ENABLE); /* disable PHY */
+	write_ir_reg(read_ir_reg(IR_ENABLE) & ~0x8000, IR_ENABLE); /* disable PHY */
 	au_sync_delay(1);
 
-	writel(MAX_BUF_SIZE, IR_MAX_PKT_LEN);
+	write_ir_reg(MAX_BUF_SIZE, IR_MAX_PKT_LEN);
 
 	ring_address = (u32)virt_to_phys((void *)aup->rx_ring[0]);
-	writel(ring_address >> 26, IR_RING_BASE_ADDR_H);
-	writel((ring_address >> 10) & 0xffff, IR_RING_BASE_ADDR_L);
+	write_ir_reg(ring_address >> 26, IR_RING_BASE_ADDR_H);
+	write_ir_reg((ring_address >> 10) & 0xffff, IR_RING_BASE_ADDR_L);
 
-	writel(RING_SIZE_64<<8 | RING_SIZE_64<<12, IR_RING_SIZE);
+	write_ir_reg(RING_SIZE_64<<8 | RING_SIZE_64<<12, IR_RING_SIZE);
 
-	writel(1<<2 | IR_ONE_PIN, IR_CONFIG_2); /* 48MHz */
-	writel(0, IR_RING_ADDR_CMPR);
+	write_ir_reg(1<<2 | IR_ONE_PIN, IR_CONFIG_2); /* 48MHz */
+	write_ir_reg(0, IR_RING_ADDR_CMPR);
 
 	au1k_irda_set_speed(dev, 9600);
 	return 0;
@@ -352,13 +355,13 @@ static int au1k_irda_start(struct net_de
 		return retval;
 	}
 
-	if ((retval = request_irq(AU1000_IRDA_TX_INT, &au1k_irda_interrupt, 
+	if ((retval = request_irq(AU1000_IRDA_TX_INT, au1k_irda_interrupt, 
 					0, dev->name, dev))) {
 		printk(KERN_ERR "%s: unable to get IRQ %d\n", 
 				dev->name, dev->irq);
 		return retval;
 	}
-	if ((retval = request_irq(AU1000_IRDA_RX_INT, &au1k_irda_interrupt, 
+	if ((retval = request_irq(AU1000_IRDA_RX_INT, au1k_irda_interrupt, 
 					0, dev->name, dev))) {
 		free_irq(AU1000_IRDA_TX_INT, dev);
 		printk(KERN_ERR "%s: unable to get IRQ %d\n", 
@@ -371,7 +374,7 @@ static int au1k_irda_start(struct net_de
 	aup->irlap = irlap_open(dev, &aup->qos, hwname);
 	netif_start_queue(dev);
 
-	writel(read_ir_reg(IR_CONFIG_2) | 1<<8, IR_CONFIG_2); /* int enable */
+	write_ir_reg(read_ir_reg(IR_CONFIG_2) | 1<<8, IR_CONFIG_2); /* int enable */
 
 	aup->timer.expires = RUN_AT((3*HZ)); 
 	aup->timer.data = (unsigned long)dev;
@@ -383,9 +386,9 @@ static int au1k_irda_stop(struct net_dev
 	struct au1k_private *aup = netdev_priv(dev);
 
 	/* disable interrupts */
-	writel(read_ir_reg(IR_CONFIG_2) & ~(1<<8), IR_CONFIG_2);
-	writel(0, IR_CONFIG_1); 
-	writel(0, IR_INTERFACE_CONFIG); /* disable clock */
+	write_ir_reg(read_ir_reg(IR_CONFIG_2) & ~(1<<8), IR_CONFIG_2);
+	write_ir_reg(0, IR_CONFIG_1); 
+	write_ir_reg(0, IR_INTERFACE_CONFIG); /* disable clock */
 	au_sync();
 
 	if (aup->irlap) {
@@ -462,12 +465,12 @@ static void au1k_tx_ack(struct net_devic
 			aup->newspeed = 0;
 		}
 		else {
-			writel(read_ir_reg(IR_CONFIG_1) & ~IR_TX_ENABLE, 
+			write_ir_reg(read_ir_reg(IR_CONFIG_1) & ~IR_TX_ENABLE, 
 					IR_CONFIG_1); 
 			au_sync();
-			writel(read_ir_reg(IR_CONFIG_1) | IR_RX_ENABLE, 
+			write_ir_reg(read_ir_reg(IR_CONFIG_1) | IR_RX_ENABLE, 
 					IR_CONFIG_1); 
-			writel(0, IR_RING_PROMPT);
+			write_ir_reg(0, IR_RING_PROMPT);
 			au_sync();
 		}
 	}
@@ -543,8 +546,8 @@ static int au1k_irda_hard_xmit(struct sk
 	ptxd->flags |= AU_OWN;
 	au_sync();
 
-	writel(read_ir_reg(IR_CONFIG_1) | IR_TX_ENABLE, IR_CONFIG_1); 
-	writel(0, IR_RING_PROMPT);
+	write_ir_reg(read_ir_reg(IR_CONFIG_1) | IR_TX_ENABLE, IR_CONFIG_1); 
+	write_ir_reg(0, IR_RING_PROMPT);
 	au_sync();
 
 	dev_kfree_skb(skb);
@@ -615,7 +618,7 @@ static int au1k_irda_rx(struct net_devic
 		}
 		prxd->flags |= AU_OWN;
 		aup->rx_head = (aup->rx_head + 1) & (NUM_IR_DESC - 1);
-		writel(0, IR_RING_PROMPT);
+		write_ir_reg(0, IR_RING_PROMPT);
 		au_sync();
 
 		/* next descriptor */
@@ -628,19 +631,21 @@ static int au1k_irda_rx(struct net_devic
 }
 
 
-void au1k_irda_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t au1k_irda_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	struct net_device *dev = (struct net_device *) dev_id;
 
 	if (dev == NULL) {
 		printk(KERN_ERR "%s: isr: null dev ptr\n", dev->name);
-		return;
+		return IRQ_NONE;
 	}
 
-	writel(0, IR_INT_CLEAR); /* ack irda interrupts */
+	write_ir_reg(0, IR_INT_CLEAR); /* ack irda interrupts */
 
 	au1k_irda_rx(dev);
 	au1k_tx_ack(dev);
+
+	return IRQ_HANDLED;
 }
 
 
@@ -683,10 +688,10 @@ au1k_irda_set_speed(struct net_device *d
 	spin_lock_irqsave(&ir_lock, flags);
 
 	/* disable PHY first */
-	writel(read_ir_reg(IR_ENABLE) & ~0x8000, IR_ENABLE);
+	write_ir_reg(read_ir_reg(IR_ENABLE) & ~0x8000, IR_ENABLE);
 
 	/* disable RX/TX */
-	writel(read_ir_reg(IR_CONFIG_1) & ~(IR_RX_ENABLE|IR_TX_ENABLE), 
+	write_ir_reg(read_ir_reg(IR_CONFIG_1) & ~(IR_RX_ENABLE|IR_TX_ENABLE), 
 			IR_CONFIG_1);
 	au_sync_delay(1);
 	while (read_ir_reg(IR_ENABLE) & (IR_RX_STATUS | IR_TX_STATUS)) {
@@ -699,7 +704,7 @@ au1k_irda_set_speed(struct net_device *d
 	}
 
 	/* disable DMA */
-	writel(read_ir_reg(IR_CONFIG_1) & ~IR_DMA_ENABLE, IR_CONFIG_1);
+	write_ir_reg(read_ir_reg(IR_CONFIG_1) & ~IR_DMA_ENABLE, IR_CONFIG_1);
 	au_sync_delay(1);
 
 	/* 
@@ -724,42 +729,42 @@ au1k_irda_set_speed(struct net_device *d
 	if (speed == 4000000) {
 #if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
 		bcsr->resets |= BCSR_RESETS_FIR_SEL;
-#else /* Pb1000 and Pb1100 */
-		writel(1<<13, CPLD_AUX1);
+#elif defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100)
+		write_ir_reg(1<<13, CPLD_AUX1);
 #endif
 	}
 	else {
 #if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100)
 		bcsr->resets &= ~BCSR_RESETS_FIR_SEL;
-#else /* Pb1000 and Pb1100 */
-		writel(readl(CPLD_AUX1) & ~(1<<13), CPLD_AUX1);
+#elif defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_PB1100)
+		write_ir_reg(readl(CPLD_AUX1) & ~(1<<13), CPLD_AUX1);
 #endif
 	}
 
 	switch (speed) {
 	case 9600:	
-		writel(11<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
-		writel(IR_SIR_MODE, IR_CONFIG_1); 
+		write_ir_reg(11<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
+		write_ir_reg(IR_SIR_MODE, IR_CONFIG_1); 
 		break;
 	case 19200:	
-		writel(5<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
-		writel(IR_SIR_MODE, IR_CONFIG_1); 
+		write_ir_reg(5<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
+		write_ir_reg(IR_SIR_MODE, IR_CONFIG_1); 
 		break;
 	case 38400:
-		writel(2<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
-		writel(IR_SIR_MODE, IR_CONFIG_1); 
+		write_ir_reg(2<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
+		write_ir_reg(IR_SIR_MODE, IR_CONFIG_1); 
 		break;
 	case 57600:	
-		writel(1<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
-		writel(IR_SIR_MODE, IR_CONFIG_1); 
+		write_ir_reg(1<<10 | 12<<5, IR_WRITE_PHY_CONFIG); 
+		write_ir_reg(IR_SIR_MODE, IR_CONFIG_1); 
 		break;
 	case 115200: 
-		writel(12<<5, IR_WRITE_PHY_CONFIG); 
-		writel(IR_SIR_MODE, IR_CONFIG_1); 
+		write_ir_reg(12<<5, IR_WRITE_PHY_CONFIG); 
+		write_ir_reg(IR_SIR_MODE, IR_CONFIG_1); 
 		break;
 	case 4000000:
-		writel(0xF, IR_WRITE_PHY_CONFIG);
-		writel(IR_FIR|IR_DMA_ENABLE|IR_RX_ENABLE, IR_CONFIG_1); 
+		write_ir_reg(0xF, IR_WRITE_PHY_CONFIG);
+		write_ir_reg(IR_FIR|IR_DMA_ENABLE|IR_RX_ENABLE, IR_CONFIG_1); 
 		break;
 	default:
 		printk(KERN_ERR "%s unsupported speed %x\n", dev->name, speed);
@@ -768,11 +773,11 @@ au1k_irda_set_speed(struct net_device *d
 	}
 
 	aup->speed = speed;
-	writel(read_ir_reg(IR_ENABLE) | 0x8000, IR_ENABLE);
+	write_ir_reg(read_ir_reg(IR_ENABLE) | 0x8000, IR_ENABLE);
 	au_sync();
 
 	control = read_ir_reg(IR_ENABLE);
-	writel(0, IR_RING_PROMPT);
+	write_ir_reg(0, IR_RING_PROMPT);
 	au_sync();
 
 	if (control & (1<<14)) {

--5Mfx4RzfBqgnTE/w--

From thomas.dahlmann@amd.com Tue Jan 10 11:00:20 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 11:00:39 +0000 (GMT)
Received: from amdext4.amd.com ([163.181.251.6]:44936 "EHLO amdext4.amd.com")
	by ftp.linux-mips.org with ESMTP id S8133428AbWAJLAU (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Tue, 10 Jan 2006 11:00:20 +0000
Received: from SAUSGW01.amd.com (sausgw01.amd.com [163.181.250.21])
	by amdext4.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k0AB3KZO001003;
	Tue, 10 Jan 2006 05:03:20 -0600
Received: from 163.181.250.1 by SAUSGW01.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Tue, 10 Jan 2006 05:03:11 -0600
X-Server-Uuid: 8C3DB987-180B-4465-9446-45C15473FD3E
Received: from elbe.amd.com (elbe.amd.com [172.20.31.2]) by
 amdint2.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k0AB38h5013642; Tue,
 10 Jan 2006 05:03:09 -0600 (CST)
Received: from [172.20.36.124] by elbe.amd.com (8.8.8+Sun/AMD-S-2.0) id
 MAA06856; Tue, 10 Jan 2006 12:03:08 +0100 (MET)
Message-ID: <43C39431.6020308@amd.com>
Date:	Tue, 10 Jan 2006 12:02:09 +0100
From:	"Thomas Dahlmann" <thomas.dahlmann@amd.com>
User-Agent: Mozilla Thunderbird 0.9 (X11/20041103)
X-Accept-Language: en-us, en
MIME-Version: 1.0
To:	"Oliver Neukum" <oliver@neukum.org>
cc:	linux-usb-devel@lists.sourceforge.net,
	"Jordan Crouse" <jordan.crouse@amd.com>, linux-mips@linux-mips.org,
	linux-kernel@vger.kernel.org, info-linux@ldcmail.amd.com
Subject: Re: [linux-usb-devel] [PATCH] UDC support for MIPS/AU1200 and
 Geode/CS5536
References: <20060109180356.GA8855@cosmic.amd.com>
 <200601092344.55988.oliver@neukum.org>
In-Reply-To: <200601092344.55988.oliver@neukum.org>
X-WSS-ID: 6FDD4BE53982923370-01-01
Content-Type: text/plain;
 charset=utf-8;
 format=flowed
Content-Transfer-Encoding: 7bit
Return-Path: <thomas.dahlmann@amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9836
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: thomas.dahlmann@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1182
Lines: 47


Oliver Neukum wrote:

>Am Montag, 9. Januar 2006 19:03 schrieb Jordan Crouse:
>  
>
>>>From the "two-birds-one-stone" department, I am pleased to present USB UDC
>>support for both the MIPS Au1200 SoC and the Geode CS5535 south bridge.  
>>Also, coming soon (in the next few days), OTG, which has been removed from
>>the usb_host patch, and put into its own patch (as per David's comments).
>>
>>This patch is against current linux-mips git, but it should apply for Linus's
>>tree as well.
>>
>>Regards,
>>Jordan
>>
>>    
>>
>+        VDBG("udc_read_bytes(): %d bytes\n", bytes);
>+
>+        /* dwords first */
>+        for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) {
>+               *((u32*) (buf + (i<<2))) = readl(dev->rxfifo); 
>+        }
>
>Is there any reason you don't increment by 4?
>
>	Regards
>		Oliver
>
>
>
>  
>
The loop is for reading dwords only, so "i < bytes / UDC_DWORD_BYTES" cuts
off remaining 1,2 or 3 bytes which are handled by the next loop.
But you are right, incrementing by 4 may look better,  as

        for (i = 0; i < bytes - bytes % UDC_DWORD_BYTES; i+=4) {
               *((u32*) (buf + i)) = readl(dev->rxfifo); 
        }


Thanks,
Thomas


From dvrabel@cantab.net Tue Jan 10 13:13:54 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 13:14:13 +0000 (GMT)
Received: from webapps.arcom.com ([194.200.159.168]:14597 "EHLO
	webapps.arcom.com") by ftp.linux-mips.org with ESMTP
	id S8133428AbWAJNNy (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 13:13:54 +0000
Received: from [10.2.2.14] ([10.2.2.14]) by webapps.arcom.com with Microsoft SMTPSVC(6.0.3790.211);
	 Tue, 10 Jan 2006 13:20:42 +0000
Message-ID: <43C3B3C3.6080204@cantab.net>
Date:	Tue, 10 Jan 2006 13:16:51 +0000
From:	David Vrabel <dvrabel@cantab.net>
User-Agent: Debian Thunderbird 1.0.7 (X11/20051017)
X-Accept-Language: en-us, en
MIME-Version: 1.0
To:	Thomas Dahlmann <thomas.dahlmann@amd.com>
CC:	Oliver Neukum <oliver@neukum.org>,
	linux-usb-devel@lists.sourceforge.net,
	Jordan Crouse <jordan.crouse@amd.com>,
	linux-mips@linux-mips.org, linux-kernel@vger.kernel.org,
	info-linux@ldcmail.amd.com
Subject: Re: [linux-usb-devel] [PATCH] UDC support for MIPS/AU1200 and Geode/CS5536
References: <20060109180356.GA8855@cosmic.amd.com> <200601092344.55988.oliver@neukum.org> <43C39431.6020308@amd.com>
In-Reply-To: <43C39431.6020308@amd.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
X-OriginalArrivalTime: 10 Jan 2006 13:20:42.0578 (UTC) FILETIME=[A83CA320:01C615E8]
Return-Path: <dvrabel@cantab.net>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9837
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: dvrabel@cantab.net
Precedence: bulk
X-list: linux-mips
Content-Length: 373
Lines: 13

Thomas Dahlmann wrote:
> 
> The loop is for reading dwords only, so "i < bytes / UDC_DWORD_BYTES" cuts
> off remaining 1,2 or 3 bytes which are handled by the next loop.
> But you are right, incrementing by 4 may look better,  as
> 
>        for (i = 0; i < bytes - bytes % UDC_DWORD_BYTES; i+=4) {

    for (i = 0; i <= bytes - UDC_DWORD_BYTES; i += 4) {

?

David Vrabel

From oliver@neukum.org Tue Jan 10 13:37:27 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 13:37:48 +0000 (GMT)
Received: from mail1.kontent.de ([81.88.34.36]:59827 "EHLO Mail1.KONTENT.De")
	by ftp.linux-mips.org with ESMTP id S3465568AbWAJNh1 (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Tue, 10 Jan 2006 13:37:27 +0000
Received: from p549A12AB.dip0.t-ipconnect.de (p549A12AB.dip0.t-ipconnect.de [84.154.18.171])
	by Mail1.KONTENT.De (Postfix) with ESMTP id 0973F100EDC3;
	Tue, 10 Jan 2006 14:40:35 +0100 (CET)
From:	Oliver Neukum <oliver@neukum.org>
To:	"Thomas Dahlmann" <thomas.dahlmann@amd.com>
Subject: Re: [linux-usb-devel] [PATCH] UDC support for MIPS/AU1200 and Geode/CS5536
Date:	Tue, 10 Jan 2006 14:40:38 +0100
User-Agent: KMail/1.8
Cc:	linux-usb-devel@lists.sourceforge.net,
	"Jordan Crouse" <jordan.crouse@amd.com>, linux-mips@linux-mips.org,
	linux-kernel@vger.kernel.org, info-linux@ldcmail.amd.com
References: <20060109180356.GA8855@cosmic.amd.com> <200601092344.55988.oliver@neukum.org> <43C39431.6020308@amd.com>
In-Reply-To: <43C39431.6020308@amd.com>
MIME-Version: 1.0
Content-Type: text/plain;
  charset="utf-8"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200601101440.38853.oliver@neukum.org>
Return-Path: <oliver@neukum.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9838
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: oliver@neukum.org
Precedence: bulk
X-list: linux-mips
Content-Length: 1493
Lines: 50

Am Dienstag, 10. Januar 2006 12:02 schrieb Thomas Dahlmann:
> 
> Oliver Neukum wrote:
> 
> >Am Montag, 9. Januar 2006 19:03 schrieb Jordan Crouse:
> >  
> >
> >>>From the "two-birds-one-stone" department, I am pleased to present USB UDC
> >>support for both the MIPS Au1200 SoC and the Geode CS5535 south bridge.  
> >>Also, coming soon (in the next few days), OTG, which has been removed from
> >>the usb_host patch, and put into its own patch (as per David's comments).
> >>
> >>This patch is against current linux-mips git, but it should apply for Linus's
> >>tree as well.
> >>
> >>Regards,
> >>Jordan
> >>
> >>    
> >>
> >+        VDBG("udc_read_bytes(): %d bytes\n", bytes);
> >+
> >+        /* dwords first */
> >+        for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) {
> >+               *((u32*) (buf + (i<<2))) = readl(dev->rxfifo); 
> >+        }
> >
> >Is there any reason you don't increment by 4?
> >
> >	Regards
> >		Oliver
> >
> >
> >
> >  
> >
> The loop is for reading dwords only, so "i < bytes / UDC_DWORD_BYTES" cuts
> off remaining 1,2 or 3 bytes which are handled by the next loop.
> But you are right, incrementing by 4 may look better,  as
> 
>         for (i = 0; i < bytes - bytes % UDC_DWORD_BYTES; i+=4) {
>                *((u32*) (buf + i)) = readl(dev->rxfifo); 
>         }

Not only will it look better, but it'll save you a shift operation.
You might even compute start and finish values before the loop and
save an addition in the body.

	Regards
		Oliver

From ralf@linux-mips.org Tue Jan 10 14:16:30 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 14:16:48 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:49431 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S3465573AbWAJOQa (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 14:16:30 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k0AEJPYc013935;
	Tue, 10 Jan 2006 14:19:25 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k0AEJPGZ013934;
	Tue, 10 Jan 2006 14:19:25 GMT
Date:	Tue, 10 Jan 2006 14:19:24 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	zhuzhenhua <zzh.hust@gmail.com>
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Message-ID: <20060110141924.GA13779@linux-mips.org>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <20060109145610.GB4286@linux-mips.org> <200601091720.03822.p_christ@hol.gr> <20060109152429.GE4286@linux-mips.org> <50c9a2250601091702g7e48c75br178868a3c91d48f4@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <50c9a2250601091702g7e48c75br178868a3c91d48f4@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9839
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 371
Lines: 13

On Tue, Jan 10, 2006 at 09:02:43AM +0800, zhuzhenhua wrote:

> > In 2.6.15 things were alomst fully merged but several megabytes of
> > patches are between the linux-mips.org and kernel.org versions of 2.6.14.
> >
> >   Ralf
> >
> 
> in linux-mips, where to download the patches for standard kernel?

I don't publish such patches - but they're eassy to generate.

  Ralf

From anemo@mba.ocn.ne.jp Tue Jan 10 15:21:59 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 15:22:17 +0000 (GMT)
Received: from mba.ocn.ne.jp ([210.190.142.172]:38366 "HELO smtp.mba.ocn.ne.jp")
	by ftp.linux-mips.org with SMTP id S8133373AbWAJPV7 (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Tue, 10 Jan 2006 15:21:59 +0000
Received: from localhost (p5252-ipad212funabasi.chiba.ocn.ne.jp [58.91.169.252])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP id DFD18A348
	for <linux-mips@linux-mips.org>; Wed, 11 Jan 2006 00:25:01 +0900 (JST)
Date:	Wed, 11 Jan 2006 00:24:31 +0900 (JST)
Message-Id: <20060111.002431.93019846.anemo@mba.ocn.ne.jp>
To:	linux-mips@linux-mips.org
Subject: QEMU and kernel 2.6.15
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 3.3 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9840
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips
Content-Length: 2468
Lines: 58

Hi.  I'm a QEMU newbie.  Does anybody tried QEMU 0.8.0 with recent
linux-mips kernel ?

I got following output and the kernel hangs.

$ qemu-system-mips -kernel ../build-qemu/arch/mips/boot/vmlinux.bin -m 16 -nographic
(qemu) mips_r4k_init: start
mips_r4k_init: load BIOS '/usr/local/share/qemu/mips_bios.bin' size 131072
Linux version 2.6.15-gb3880251 (anemo@debian) (gcc version 3.4.5) #12 Tue Jan 10 23:50:55 JST 2006
CPU revision is: 00018000
Determined physical RAM map:
 memory: 01000000 @ 00000000 (usable)
On node 0 totalpages: 4096
  DMA zone: 4096 pages, LIFO batch:0
  DMA32 zone: 0 pages, LIFO batch:0
  Normal zone: 0 pages, LIFO batch:0
  HighMem zone: 0 pages, LIFO batch:0
Built 1 zonelists
Kernel command line: console=ttyS0 debug ip=172.20.0.2:172.20.0.1::255.255.0.0
Primary instruction cache 2kB, physically tagged, 2-way, linesize 16 bytes.
Primary data cache 2kB, 2-way, linesize 16 bytes.
Synthesized TLB refill handler (19 instructions).
Synthesized TLB load handler fastpath (31 instructions).
Synthesized TLB store handler fastpath (31 instructions).
Synthesized TLB modify handler fastpath (30 instructions).
PID hash table entries: 128 (order: 7, 2048 bytes)
Using 100.000 MHz high precision timer.
Console: colour VGA+ 80x25
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 13916k/16384k available (1702k kernel code, 2468k reserved, 321k data, 112k init, 0k highmem)
Calibrating delay loop... 478.41 BogoMIPS (lpj=2392064)
Mount-cache hash table entries: 512
Checking for 'wait' instruction...  available.


I can get qemu prompt by typing C-a c and 'info register' shows
PC=0x80010d40 (qemu_handle_int+0xe0).

(qemu) info registers
pc=0x80010d40 HI=0x00000000 LO=0x00000000 ds 0000 801b6cd8 0
GPR00: r0 00000000 at 10008401 v0 8027fbe8 v1 00000000
GPR04: a0 80281f0c a1 80281e9c a2 8027fbe8 a3 80281f0c
GPR08: t0 10008400 t1 1000001f t2 00000000 t3 00000000
GPR12: t4 7fffffff t5 ffffffff t6 00100100 t7 7fffffff
GPR16: s0 00000002 s1 80281f08 s2 00000000 s3 00000000
GPR20: s4 00000000 s5 00000000 s6 00000000 s7 00000000
GPR24: t8 00000000 t9 00000001 k0 80281e80 k1 80281e80
GPR28: gp 80280000 sp 80281dd0 s8 80281e80 ra 801b74f8
CP0 Status  0x10008400 Cause   0x80000400 EPC    0x801b74f4
    Config0 0x80008081 Config1 0x1e190c8a LLAddr 0x00000001


Whant's going on ?  An interrupt is not cleared?

Any advise is welcome.  Thanks.
---
Atsushi Nemoto

From ralf@linux-mips.org Tue Jan 10 15:33:51 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 15:34:08 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:22811 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8133442AbWAJPdv (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 15:33:51 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k0AFargA016926;
	Tue, 10 Jan 2006 15:36:53 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k0AFaqKg016925;
	Tue, 10 Jan 2006 15:36:52 GMT
Date:	Tue, 10 Jan 2006 15:36:52 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc:	linux-mips@linux-mips.org
Subject: Re: QEMU and kernel 2.6.15
Message-ID: <20060110153652.GA4871@linux-mips.org>
References: <20060111.002431.93019846.anemo@mba.ocn.ne.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20060111.002431.93019846.anemo@mba.ocn.ne.jp>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9841
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 185
Lines: 7

On Wed, Jan 11, 2006 at 12:24:31AM +0900, Atsushi Nemoto wrote:

> Whant's going on ?  An interrupt is not cleared?

Qemu is still work in progress and needs further debugging.

  Ralf

From ivan.korzakow@gmail.com Tue Jan 10 15:37:08 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 15:37:26 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.206]:49340 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133442AbWAJPhI convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 15:37:08 +0000
Received: by wproxy.gmail.com with SMTP id 71so3657227wri
        for <linux-mips@linux-mips.org>; Tue, 10 Jan 2006 07:40:14 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=rlQw1LZMfLQvP6jpTs6worMMhgMxHbvrb3B64wCgAn76qajTJCK4RgkZdNmZBVMG9sgmVMcEwPgLUNDFMm91+4gqzxzrlWbOX9wS1ZUpoBnasu5LITNaqViLyKu8Ux+MZlGYV/8VHxcGrRbfjpTS7UD7wqs9M/6cZHF/Z9lMMK4=
Received: by 10.54.84.1 with SMTP id h1mr9604365wrb;
        Tue, 10 Jan 2006 07:40:12 -0800 (PST)
Received: by 10.54.69.5 with HTTP; Tue, 10 Jan 2006 07:40:12 -0800 (PST)
Message-ID: <a59861030601100740r432904d9o@mail.gmail.com>
Date:	Tue, 10 Jan 2006 16:40:12 +0100
From:	Ivan Korzakow <ivan.korzakow@gmail.com>
To:	Ralf Baechle <ralf@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Cc:	zhuzhenhua <zzh.hust@gmail.com>, "P. Christeas" <p_christ@hol.gr>,
	linux-mips@linux-mips.org
In-Reply-To: <20060110141924.GA13779@linux-mips.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
	 <20060109145610.GB4286@linux-mips.org>
	 <200601091720.03822.p_christ@hol.gr>
	 <20060109152429.GE4286@linux-mips.org>
	 <50c9a2250601091702g7e48c75br178868a3c91d48f4@mail.gmail.com>
	 <20060110141924.GA13779@linux-mips.org>
Return-Path: <ivan.korzakow@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9842
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ivan.korzakow@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 512
Lines: 16

2006/1/10, Ralf Baechle <ralf@linux-mips.org>:
> On Tue, Jan 10, 2006 at 09:02:43AM +0800, zhuzhenhua wrote:
>
> > > In 2.6.15 things were alomst fully merged but several megabytes of
> > > patches are between the linux-mips.org and kernel.org versions of 2.6.14.
> > >
> > >   Ralf
> > >
> >
> > in linux-mips, where to download the patches for standard kernel?
>
> I don't publish such patches - but they're eassy to generate.
>
Could you be a bit more explicit about that "easy" way you generate them ?

Ivan

From ralf@linux-mips.org Tue Jan 10 15:41:32 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 15:41:51 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:30222 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8133373AbWAJPlc (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 15:41:32 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k0AFiYHk017187
	for <linux-mips@linux-mips.org>; Tue, 10 Jan 2006 15:44:34 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k0AFiYEH017186
	for linux-mips@linux-mips.org; Tue, 10 Jan 2006 15:44:34 GMT
Date:	Tue, 10 Jan 2006 15:44:34 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	linux-mips@linux-mips.org
Subject: [ADMIN] linux-mips.org moving ...
Message-ID: <20060110154434.GB4871@linux-mips.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9843
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 180
Lines: 5

Starting on Thursday, January 12, MIPS UK where linux-mips.org is hosted
will be moving to a new site.  This will result in a some downtime for
the linux-mips.org machine.

  Ralf

From p_christ@hol.gr Tue Jan 10 15:52:09 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 15:52:26 +0000 (GMT)
Received: from [62.38.108.96] ([62.38.108.96]:18404 "EHLO pfn3.pefnos")
	by ftp.linux-mips.org with ESMTP id S8133373AbWAJPwJ (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Tue, 10 Jan 2006 15:52:09 +0000
Received: from xorhgos2.pefnos (xorhgos2.pefnos [192.168.0.3])
	by pfn3.pefnos (Postfix) with ESMTP id 3995B1F101;
	Tue, 10 Jan 2006 17:55:06 +0200 (EET)
From:	"P. Christeas" <p_christ@hol.gr>
To:	linux-mips@linux-mips.org
Subject: Re: QEMU and kernel 2.6.15
Date:	Tue, 10 Jan 2006 17:54:52 +0200
User-Agent: KMail/1.9
Cc:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
References: <20060111.002431.93019846.anemo@mba.ocn.ne.jp>
In-Reply-To: <20060111.002431.93019846.anemo@mba.ocn.ne.jp>
MIME-Version: 1.0
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200601101754.53791.p_christ@hol.gr>
Return-Path: <p_christ@hol.gr>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9844
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: p_christ@hol.gr
Precedence: bulk
X-list: linux-mips
Content-Length: 774
Lines: 19

On Tuesday 10 January 2006 5:24 pm, Atsushi Nemoto wrote:
> Hi.  I'm a QEMU newbie.  Does anybody tried QEMU 0.8.0 with recent
> linux-mips kernel ?
>
> I got following output and the kernel hangs.
>
>...
> Memory: 13916k/16384k available (1702k kernel code, 2468k reserved, 321k 
> data, 112k init, 0k highmem) Calibrating delay loop... 478.41 BogoMIPS
> (lpj=2392064)
> Mount-cache hash table entries: 512
> Checking for 'wait' instruction...  available.
>
>
However, this *does* resemble the bug I'm having in real hw.
I generally get instablilities nearly always after the memory mapping and 
'wait' instruction on a 4Kc core with 2.6.15.
I'm not a MIPS expert nor have I the time to learn its internals. So, anything 
that might give me a hint is worth investigating..

From p_christ@hol.gr Tue Jan 10 15:54:56 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 15:55:14 +0000 (GMT)
Received: from [62.38.108.96] ([62.38.108.96]:48007 "EHLO pfn3.pefnos")
	by ftp.linux-mips.org with ESMTP id S8133373AbWAJPy4 (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Tue, 10 Jan 2006 15:54:56 +0000
Received: from xorhgos2.pefnos (xorhgos2.pefnos [192.168.0.3])
	by pfn3.pefnos (Postfix) with ESMTP id 9B2AF1F101;
	Tue, 10 Jan 2006 17:57:56 +0200 (EET)
From:	"P. Christeas" <p_christ@hol.gr>
To:	linux-mips@linux-mips.org
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Date:	Tue, 10 Jan 2006 17:57:44 +0200
User-Agent: KMail/1.9
Cc:	Ivan Korzakow <ivan.korzakow@gmail.com>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <20060110141924.GA13779@linux-mips.org> <a59861030601100740r432904d9o@mail.gmail.com>
In-Reply-To: <a59861030601100740r432904d9o@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200601101757.45297.p_christ@hol.gr>
Return-Path: <p_christ@hol.gr>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9845
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: p_christ@hol.gr
Precedence: bulk
X-list: linux-mips
Content-Length: 715
Lines: 18

On Tuesday 10 January 2006 5:40 pm, Ivan Korzakow wrote:
> 2006/1/10, Ralf Baechle <ralf@linux-mips.org>:
> > On Tue, Jan 10, 2006 at 09:02:43AM +0800, zhuzhenhua wrote:
> > > > In 2.6.15 things were alomst fully merged but several megabytes of
> > > > patches are between the linux-mips.org and kernel.org versions of
> > > > 2.6.14.
> > > >
> > > >   Ralf
> > >
> > > in linux-mips, where to download the patches for standard kernel?
> >
> > I don't publish such patches - but they're eassy to generate.
>
> Could you be a bit more explicit about that "easy" way you generate them ?
>
> Ivan
You make sure you have the two trees and diff them.
They 're both in git and typically you could do that only using git.

From ivan.korzakow@gmail.com Tue Jan 10 16:35:50 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 16:36:15 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.198]:36568 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133431AbWAJQfu convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 16:35:50 +0000
Received: by wproxy.gmail.com with SMTP id 71so3673081wri
        for <linux-mips@linux-mips.org>; Tue, 10 Jan 2006 08:38:55 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=N+GidnhpSkoEOOOji69+4LjcQCC91aJk2xE88LuHKJIuH9XFkg4vLXYuOcY/X/CbDNlCF5Zq+EygMig3ZjKyjRoZvH8sllQM3RxuaDGXLHixLQ9aqnj9DBg7H+BPqK9lGSrePvVWwXhG6Y0ebpKOh1y7cC2yUvykGvcqyqTFcFM=
Received: by 10.54.67.10 with SMTP id p10mr5463219wra;
        Tue, 10 Jan 2006 08:38:55 -0800 (PST)
Received: by 10.54.69.5 with HTTP; Tue, 10 Jan 2006 08:38:55 -0800 (PST)
Message-ID: <a59861030601100838oa89ac84n@mail.gmail.com>
Date:	Tue, 10 Jan 2006 17:38:55 +0100
From:	Ivan Korzakow <ivan.korzakow@gmail.com>
To:	"P. Christeas" <p_christ@hol.gr>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Cc:	linux-mips@linux-mips.org
In-Reply-To: <200601101757.45297.p_christ@hol.gr>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
	 <20060110141924.GA13779@linux-mips.org>
	 <a59861030601100740r432904d9o@mail.gmail.com>
	 <200601101757.45297.p_christ@hol.gr>
Return-Path: <ivan.korzakow@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9846
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ivan.korzakow@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1449
Lines: 37

2006/1/10, P. Christeas <p_christ@hol.gr>:
> On Tuesday 10 January 2006 5:40 pm, Ivan Korzakow wrote:
> > 2006/1/10, Ralf Baechle <ralf@linux-mips.org>:
> > > On Tue, Jan 10, 2006 at 09:02:43AM +0800, zhuzhenhua wrote:
> > > > > In 2.6.15 things were alomst fully merged but several megabytes of
> > > > > patches are between the linux-mips.org and kernel.org versions of
> > > > > 2.6.14.
> > > > >
> > > > >   Ralf
> > > >
> > > > in linux-mips, where to download the patches for standard kernel?
> > >
> > > I don't publish such patches - but they're eassy to generate.
> >
> > Could you be a bit more explicit about that "easy" way you generate them ?
> >
> > Ivan
> You make sure you have the two trees and diff them.
> They 're both in git and typically you could do that only using git.
>

Have you ever tried what you're talking about or is it a guess ?
For example, let's say that there's a bug introduced when merging
Linus tree with mips branch. How do you easily "bisect" in order to do
a binary seek of this bug ?

BTW, I noticed that Linux mips repository have several branches. Each
branch is tracking each kernel minor version. I think this is
completly useless :
1 - it makes the repository huge by keeping history since 2.2 (It's
pointless for most people)
2 - The way branches are made is broken : you can not fetch separate
branches without doing some "grafts" things

Why not simply ask Linus to pull from the mips tree ?

Ivan

From p_christ@hol.gr Tue Jan 10 16:54:44 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 16:55:22 +0000 (GMT)
Received: from [62.38.108.96] ([62.38.108.96]:10206 "EHLO pfn3.pefnos")
	by ftp.linux-mips.org with ESMTP id S8133452AbWAJQyn (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Tue, 10 Jan 2006 16:54:43 +0000
Received: from xorhgos2.pefnos (xorhgos2.pefnos [192.168.0.3])
	by pfn3.pefnos (Postfix) with ESMTP id 4783F1F101;
	Tue, 10 Jan 2006 18:57:40 +0200 (EET)
From:	"P. Christeas" <p_christ@hol.gr>
To:	linux-mips@linux-mips.org, Ralf Baechle <ralf@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Date:	Tue, 10 Jan 2006 18:57:24 +0200
User-Agent: KMail/1.9
Cc:	Ivan Korzakow <ivan.korzakow@gmail.com>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <200601101757.45297.p_christ@hol.gr> <a59861030601100838oa89ac84n@mail.gmail.com>
In-Reply-To: <a59861030601100838oa89ac84n@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200601101857.26978.p_christ@hol.gr>
Return-Path: <p_christ@hol.gr>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9847
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: p_christ@hol.gr
Precedence: bulk
X-list: linux-mips
Content-Length: 1013
Lines: 20

On Tuesday 10 January 2006 6:38 pm, Ivan Korzakow wrote:
> 2006/1/10, P. Christeas <p_christ@hol.gr>:

> > You make sure you have the two trees and diff them.
> > They 're both in git and typically you could do that only using git.
>
> Have you ever tried what you're talking about or is it a guess ?
> For example, let's say that there's a bug introduced when merging
> Linus tree with mips branch. How do you easily "bisect" in order to do
> a binary seek of this bug ?

 I was about to mention the git incompatibility as I gave you the first 
answer. It's true what you say and I also find it annoying. That's why I use 
Linus tree.
I cannot, though, complaint to Ralph about this practice. It seems that he has 
done his best to preserve the CVS history of his tree. We can only thank him 
for that. It is just a lot of work to trim the tree and make it 
Linus-parallel.
There is also things that I don't know about git, so I won't jump to 
conclusions yet (as to whether it is feasible to merge with Linus).

From ivan.korzakow@gmail.com Tue Jan 10 17:12:13 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 17:12:42 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.197]:14383 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133442AbWAJRMN convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 17:12:13 +0000
Received: by wproxy.gmail.com with SMTP id 71so3682921wri
        for <linux-mips@linux-mips.org>; Tue, 10 Jan 2006 09:15:19 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=djh5j5BiFviIDAWhc37UPmvdEM9hKVUH2l4wBPV+d8+LqDyQI0ZrHyfkak97Y/p/1wjWPOP3V38gB21Xldg53Lfg2NgMFPgxuJOBc8UP0ZBeKca9cgU32k9/Cbyxsl/aB8S9zvYipc8oS51A1RA/Z6Yb/gOXHH9wImFd9Ajev0U=
Received: by 10.54.76.4 with SMTP id y4mr9711599wra;
        Tue, 10 Jan 2006 09:15:18 -0800 (PST)
Received: by 10.54.69.5 with HTTP; Tue, 10 Jan 2006 09:15:18 -0800 (PST)
Message-ID: <a59861030601100915q6ffb4896v@mail.gmail.com>
Date:	Tue, 10 Jan 2006 18:15:18 +0100
From:	Ivan Korzakow <ivan.korzakow@gmail.com>
To:	"P. Christeas" <p_christ@hol.gr>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Cc:	linux-mips@linux-mips.org, Ralf Baechle <ralf@linux-mips.org>
In-Reply-To: <200601101857.26978.p_christ@hol.gr>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
	 <200601101757.45297.p_christ@hol.gr>
	 <a59861030601100838oa89ac84n@mail.gmail.com>
	 <200601101857.26978.p_christ@hol.gr>
Return-Path: <ivan.korzakow@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9848
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ivan.korzakow@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1153
Lines: 24

2006/1/10, P. Christeas <p_christ@hol.gr>:
> On Tuesday 10 January 2006 6:38 pm, Ivan Korzakow wrote:
> > 2006/1/10, P. Christeas <p_christ@hol.gr>:
>
> > > You make sure you have the two trees and diff them.
> > > They 're both in git and typically you could do that only using git.
> >
> > Have you ever tried what you're talking about or is it a guess ?
> > For example, let's say that there's a bug introduced when merging
> > Linus tree with mips branch. How do you easily "bisect" in order to do
> > a binary seek of this bug ?
>
>  I was about to mention the git incompatibility as I gave you the first
> answer. It's true what you say and I also find it annoying. That's why I use
> Linus tree.
> I cannot, though, complaint to Ralph about this practice. It seems that he has
> done his best to preserve the CVS history of his tree. We can only thank him
> for that. It is just a lot of work to trim the tree and make it
> Linus-parallel.
Why not simply keep CVS repository available for 1% of people willing
to browse the history ? And make life easier for 99% of people willing
to work on 2.6 ... (2.4 work may continue to use CVS too).

Ivan

From jcrouse@cosmic.amd.com Tue Jan 10 17:26:40 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 17:27:07 +0000 (GMT)
Received: from amdext3.amd.com ([139.95.251.6]:30116 "EHLO amdext3.amd.com")
	by ftp.linux-mips.org with ESMTP id S8133466AbWAJR0k (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Tue, 10 Jan 2006 17:26:40 +0000
Received: from SSVLGW01.amd.com (ssvlgw01.amd.com [139.95.250.169])
	by amdext3.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k0AHTUVM029893;
	Tue, 10 Jan 2006 09:29:30 -0800
Received: from 139.95.250.1 by SSVLGW02.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Tue, 10 Jan 2006 09:29:22 -0800
X-Server-Uuid: 519AC16A-9632-469E-B354-112C592D09E8
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k0AHTMVP023896; Tue,
 10 Jan 2006 09:29:22 -0800 (PST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id BC6F82028; Tue, 10 Jan 2006
 10:29:21 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k0AHcDlC029945; Tue, 10 Jan 2006 10:38:13
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k0AHcDYp029944; Tue, 10 Jan 2006 10:38:13
 -0700
Date:	Tue, 10 Jan 2006 10:38:13 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	"Ivan Korzakow" <ivan.korzakow@gmail.com>
cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Message-ID: <20060110173813.GA25480@cosmic.amd.com>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
 <20060110141924.GA13779@linux-mips.org>
 <a59861030601100740r432904d9o@mail.gmail.com>
 <200601101757.45297.p_christ@hol.gr>
 <a59861030601100838oa89ac84n@mail.gmail.com>
MIME-Version: 1.0
In-Reply-To: <a59861030601100838oa89ac84n@mail.gmail.com>
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FDD31782C43938785-01-01
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9849
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 963
Lines: 36

> Have you ever tried what you're talking about or is it a guess ?

I just did that.  I have Linus's tree and tags, and Ralf's tree:

git checkout mips
git diff v2.6.14..HEAD

the nice thing about git is that it was written to do exactly the sort 
of things we need it to do, like this.

> For example, let's say that there's a bug introduced when merging
> Linus tree with mips branch. How do you easily "bisect" in order to do
> a binary seek of this bug ?

Linus wrote a HOWTO on that very subject:

http://www.kernel.org/pub/software/scm/git/docs/howto/isolate-bugs-with-bisect.txt

> 2 - The way branches are made is broken : you can not fetch separate
> branches without doing some "grafts" things

I'm no git expert, but can't you just

git-pull rsync://ftp.linux-mips.org/git/linux.git remote:local

That works for me.

Regards,
Jordan

-- 
Jordan Crouse
Senior Linux Engineer
AMD - Personal Connectivity Solutions Group
<www.amd.com/embeddedprocessors>


From ralf@linux-mips.org Tue Jan 10 21:50:32 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Tue, 10 Jan 2006 21:50:53 +0000 (GMT)
Received: from alg138.algor.co.uk ([62.254.210.138]:23245 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8133460AbWAJVuc (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Tue, 10 Jan 2006 21:50:32 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k0ALrOhe029027;
	Tue, 10 Jan 2006 21:53:25 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k0ALrMXn029026;
	Tue, 10 Jan 2006 21:53:22 GMT
Date:	Tue, 10 Jan 2006 21:53:22 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	"P. Christeas" <p_christ@hol.gr>
Cc:	linux-mips@linux-mips.org, Ivan Korzakow <ivan.korzakow@gmail.com>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Message-ID: <20060110215322.GA27577@linux-mips.org>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <200601101757.45297.p_christ@hol.gr> <a59861030601100838oa89ac84n@mail.gmail.com> <200601101857.26978.p_christ@hol.gr>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <200601101857.26978.p_christ@hol.gr>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9850
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 1207
Lines: 25

On Tue, Jan 10, 2006 at 06:57:24PM +0200, P. Christeas wrote:

> > > You make sure you have the two trees and diff them.
> > > They 're both in git and typically you could do that only using git.
> >
> > Have you ever tried what you're talking about or is it a guess ?
> > For example, let's say that there's a bug introduced when merging
> > Linus tree with mips branch. How do you easily "bisect" in order to do
> > a binary seek of this bug ?
> 
>  I was about to mention the git incompatibility as I gave you the first 
> answer. It's true what you say and I also find it annoying. That's why I use 
> Linus tree.
> I cannot, though, complaint to Ralph about this practice. It seems that he has 
> done his best to preserve the CVS history of his tree. We can only thank him 
> for that. It is just a lot of work to trim the tree and make it 
> Linus-parallel.
> There is also things that I don't know about git, so I won't jump to 
> conclusions yet (as to whether it is feasible to merge with Linus).

It is possible to keep both Linus's and the lmo tree in the same
repository with a _little_ care.  I do that all the time.  When compressed
this will result in a bloat of just about 10-20MB.

  Ralf

From zzh.hust@gmail.com Wed Jan 11 02:01:43 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 02:02:03 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.198]:54930 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133476AbWAKCBn convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 11 Jan 2006 02:01:43 +0000
Received: by wproxy.gmail.com with SMTP id 36so38470wra
        for <linux-mips@linux-mips.org>; Tue, 10 Jan 2006 18:04:51 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=UPo/ePkmPiK6vePRpeI3OY9vRzEbiX9ZK5ZlUJ69X0mQsH4Dor5jLjCJ4HQ1c8vRygAv+CXmtFy8/wLeZo2Rb9iFsgRwWevpsTouFqxnL8vMlqLD5R7DE7Z4fdnvcmOMSU4qjWoJe0vyS/z1pYK460mqL4FjLzfZ4lgry+Odwe8=
Received: by 10.54.151.9 with SMTP id y9mr1514792wrd;
        Tue, 10 Jan 2006 18:04:50 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Tue, 10 Jan 2006 18:04:50 -0800 (PST)
Message-ID: <50c9a2250601101804h73aa933dyf3434635aa7bde55@mail.gmail.com>
Date:	Wed, 11 Jan 2006 10:04:50 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	Ralf Baechle <ralf@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
In-Reply-To: <20060110141924.GA13779@linux-mips.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
	 <20060109145610.GB4286@linux-mips.org>
	 <200601091720.03822.p_christ@hol.gr>
	 <20060109152429.GE4286@linux-mips.org>
	 <50c9a2250601091702g7e48c75br178868a3c91d48f4@mail.gmail.com>
	 <20060110141924.GA13779@linux-mips.org>
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9851
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 768
Lines: 29

On 1/10/06, Ralf Baechle <ralf@linux-mips.org> wrote:
> On Tue, Jan 10, 2006 at 09:02:43AM +0800, zhuzhenhua wrote:
>
> > > In 2.6.15 things were alomst fully merged but several megabytes of
> > > patches are between the linux-mips.org and kernel.org versions of 2.6.14.
> > >
> > >   Ralf
> > >
> >
> > in linux-mips, where to download the patches for standard kernel?
>
> I don't publish such patches - but they're eassy to generate.
i find on http://www.linux-mips.org/pub/linux/mips/kernel/v2.6/ can
download the kernel tarball, i compire the 2.6.14 with the stand
kernel, and found they are not same.

is the tarball in
http://www.linux-mips.org/pub/linux/mips/kernel/v2.6/ is tared with
the cvs tree code in linux-mips?



>
>   Ralf
>

Best regards

zhuzhenhua

From ivan.korzakow@gmail.com Wed Jan 11 11:06:55 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 11:07:16 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.205]:31897 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133429AbWAKLGz convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 11 Jan 2006 11:06:55 +0000
Received: by wproxy.gmail.com with SMTP id 71so126698wri
        for <linux-mips@linux-mips.org>; Wed, 11 Jan 2006 03:10:05 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=gjDTX9iblrfg7cC2ZZ1IEQHMmRVGUFGGkjCjBvxpaV3356sImMbFhh2wMPbK2aLHgUqgmheTBMC6o6JoRQiPcrTzj922qst+wSU0lNVy8jZtA9gfUqfiyiRsa2FMfgpcEOHNgsI1224WartvbwVcMF0mCdyav2RzaOZ05DJ4Q80=
Received: by 10.54.72.5 with SMTP id u5mr798317wra;
        Wed, 11 Jan 2006 03:10:05 -0800 (PST)
Received: by 10.54.69.5 with HTTP; Wed, 11 Jan 2006 03:10:05 -0800 (PST)
Message-ID: <a59861030601110310gca74f54o@mail.gmail.com>
Date:	Wed, 11 Jan 2006 12:10:05 +0100
From:	Ivan Korzakow <ivan.korzakow@gmail.com>
To:	Ralf Baechle <ralf@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
In-Reply-To: <20060110215322.GA27577@linux-mips.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
	 <200601101757.45297.p_christ@hol.gr>
	 <a59861030601100838oa89ac84n@mail.gmail.com>
	 <200601101857.26978.p_christ@hol.gr>
	 <20060110215322.GA27577@linux-mips.org>
Return-Path: <ivan.korzakow@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9852
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ivan.korzakow@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1444
Lines: 33

2006/1/10, Ralf Baechle <ralf@linux-mips.org>:
> On Tue, Jan 10, 2006 at 06:57:24PM +0200, P. Christeas wrote:
>
> > > > You make sure you have the two trees and diff them.
> > > > They 're both in git and typically you could do that only using git.
> > >
> > > Have you ever tried what you're talking about or is it a guess ?
> > > For example, let's say that there's a bug introduced when merging
> > > Linus tree with mips branch. How do you easily "bisect" in order to do
> > > a binary seek of this bug ?
> >
> >  I was about to mention the git incompatibility as I gave you the first
> > answer. It's true what you say and I also find it annoying. That's why I use
> > Linus tree.
> > I cannot, though, complaint to Ralph about this practice. It seems that he has
> > done his best to preserve the CVS history of his tree. We can only thank him
> > for that. It is just a lot of work to trim the tree and make it
> > Linus-parallel.
> > There is also things that I don't know about git, so I won't jump to
> > conclusions yet (as to whether it is feasible to merge with Linus).
>
> It is possible to keep both Linus's and the lmo tree in the same
> repository with a _little_ care.  I do that all the time.  When compressed
> this will result in a bloat of just about 10-20MB.
>

It would be great to be a little bit more explicit by giving some
_little_ examples ! Why not enlighting us directly instead of being so
vague.

Thanks

Ivan

From ralf@linux-mips.org Wed Jan 11 11:16:58 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 11:17:19 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:4118 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8133376AbWAKLQ6 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 11 Jan 2006 11:16:58 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k0BBK1x7005085;
	Wed, 11 Jan 2006 11:20:02 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k0BBK110005084;
	Wed, 11 Jan 2006 11:20:01 GMT
Date:	Wed, 11 Jan 2006 11:20:01 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	Ivan Korzakow <ivan.korzakow@gmail.com>
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Message-ID: <20060111112001.GA4403@linux-mips.org>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <200601101757.45297.p_christ@hol.gr> <a59861030601100838oa89ac84n@mail.gmail.com> <200601101857.26978.p_christ@hol.gr> <20060110215322.GA27577@linux-mips.org> <a59861030601110310gca74f54o@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <a59861030601110310gca74f54o@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9853
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 506
Lines: 15

On Wed, Jan 11, 2006 at 12:10:05PM +0100, Ivan Korzakow wrote:

> It would be great to be a little bit more explicit by giving some
> _little_ examples ! Why not enlighting us directly instead of being so
> vague.

In books that kind of stuff is usually marked as "left as an exercise to
the reader" ;-)

  git-clone rsync://ftp.linux-mips.org/pub/scm/linux.git repository
  cd repository
  git-fetch git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 master:linus
  git-repack -a -d

  Ralf

From ralf@linux-mips.org Wed Jan 11 11:45:56 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 11:46:17 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:5405 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8133429AbWAKLp4 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 11 Jan 2006 11:45:56 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k0BBmv9s005995;
	Wed, 11 Jan 2006 11:48:57 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k0ANK6lS003667;
	Tue, 10 Jan 2006 23:20:06 GMT
Date:	Tue, 10 Jan 2006 23:20:06 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	Ivan Korzakow <ivan.korzakow@gmail.com>
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Message-ID: <20060110232006.GA3519@linux-mips.org>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <200601101757.45297.p_christ@hol.gr> <a59861030601100838oa89ac84n@mail.gmail.com> <200601101857.26978.p_christ@hol.gr> <a59861030601100915q6ffb4896v@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <a59861030601100915q6ffb4896v@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9854
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 692
Lines: 16

On Tue, Jan 10, 2006 at 06:15:18PM +0100, Ivan Korzakow wrote:

> Why not simply keep CVS repository available for 1% of people willing
> to browse the history ? And make life easier for 99% of people willing
> to work on 2.6 ... (2.4 work may continue to use CVS too).

The CVS repository is still available - and will stay for a long time so
people have a chance to do diffs against their existing checked out trees.
But no more changes.

Note, this does not affect the other projects in the CVS server.  Each
of them is maintained independantly and for each the decission to use CVS,
git or some flying saucer technology to use is made by whoever is the
caretaker of that project.

  Ralf

From ralf@linux-mips.org Wed Jan 11 12:13:47 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 12:14:18 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:19734 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8133429AbWAKMNr (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 11 Jan 2006 12:13:47 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k0BCGk8d006778;
	Wed, 11 Jan 2006 12:16:47 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k0BCGjBY006776;
	Wed, 11 Jan 2006 12:16:45 GMT
Date:	Wed, 11 Jan 2006 12:16:45 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	zhuzhenhua <zzh.hust@gmail.com>
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Message-ID: <20060111121645.GB4403@linux-mips.org>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <20060109145610.GB4286@linux-mips.org> <200601091720.03822.p_christ@hol.gr> <20060109152429.GE4286@linux-mips.org> <50c9a2250601091702g7e48c75br178868a3c91d48f4@mail.gmail.com> <20060110141924.GA13779@linux-mips.org> <50c9a2250601101804h73aa933dyf3434635aa7bde55@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <50c9a2250601101804h73aa933dyf3434635aa7bde55@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9855
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 1038
Lines: 28

On Wed, Jan 11, 2006 at 10:04:50AM +0800, zhuzhenhua wrote:

> On 1/10/06, Ralf Baechle <ralf@linux-mips.org> wrote:
> > On Tue, Jan 10, 2006 at 09:02:43AM +0800, zhuzhenhua wrote:
> >
> > > > In 2.6.15 things were alomst fully merged but several megabytes of
> > > > patches are between the linux-mips.org and kernel.org versions of 2.6.14.
> > > >
> > > >   Ralf
> > > >
> > >
> > > in linux-mips, where to download the patches for standard kernel?
> >
> > I don't publish such patches - but they're eassy to generate.
> i find on http://www.linux-mips.org/pub/linux/mips/kernel/v2.6/ can
> download the kernel tarball, i compire the 2.6.14 with the stand
> kernel, and found they are not same.
> 
> is the tarball in
> http://www.linux-mips.org/pub/linux/mips/kernel/v2.6/ is tared with
> the cvs tree code in linux-mips?

Some tarballs were rather old, were created before the switch to git.
The 2.4 and 2.6 tarballs were created from the git tags.

In case of doubt you could always try git-get-tar-commit-id on the tarball.

  Ralf

From drow@nevyn.them.org Wed Jan 11 14:40:46 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 14:41:10 +0000 (GMT)
Received: from nevyn.them.org ([66.93.172.17]:9698 "EHLO nevyn.them.org")
	by ftp.linux-mips.org with ESMTP id S8133475AbWAKOkq (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Wed, 11 Jan 2006 14:40:46 +0000
Received: from drow by nevyn.them.org with local (Exim 4.54)
	id 1EwhCe-0004WV-OI; Wed, 11 Jan 2006 09:43:56 -0500
Date:	Wed, 11 Jan 2006 09:43:56 -0500
From:	Daniel Jacobowitz <dan@debian.org>
To:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc:	linux-mips@linux-mips.org
Subject: Re: QEMU and kernel 2.6.15
Message-ID: <20060111144355.GA17275@nevyn.them.org>
References: <20060111.002431.93019846.anemo@mba.ocn.ne.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20060111.002431.93019846.anemo@mba.ocn.ne.jp>
User-Agent: Mutt/1.5.8i
Return-Path: <drow@nevyn.them.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9856
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: dan@debian.org
Precedence: bulk
X-list: linux-mips
Content-Length: 1213
Lines: 33

On Wed, Jan 11, 2006 at 12:24:31AM +0900, Atsushi Nemoto wrote:
> Hi.  I'm a QEMU newbie.  Does anybody tried QEMU 0.8.0 with recent
> linux-mips kernel ?

You've configured the kernel for QEMU, right?  And are usin QEMU from
CVS?

> Checking for 'wait' instruction...  available.
> 
> 
> I can get qemu prompt by typing C-a c and 'info register' shows
> PC=0x80010d40 (qemu_handle_int+0xe0).
> 
> (qemu) info registers
> pc=0x80010d40 HI=0x00000000 LO=0x00000000 ds 0000 801b6cd8 0
> GPR00: r0 00000000 at 10008401 v0 8027fbe8 v1 00000000
> GPR04: a0 80281f0c a1 80281e9c a2 8027fbe8 a3 80281f0c
> GPR08: t0 10008400 t1 1000001f t2 00000000 t3 00000000
> GPR12: t4 7fffffff t5 ffffffff t6 00100100 t7 7fffffff
> GPR16: s0 00000002 s1 80281f08 s2 00000000 s3 00000000
> GPR20: s4 00000000 s5 00000000 s6 00000000 s7 00000000
> GPR24: t8 00000000 t9 00000001 k0 80281e80 k1 80281e80
> GPR28: gp 80280000 sp 80281dd0 s8 80281e80 ra 801b74f8
> CP0 Status  0x10008400 Cause   0x80000400 EPC    0x801b74f4
>     Config0 0x80008081 Config1 0x1e190c8a LLAddr 0x00000001

It worked for me the last time I tried, but that was a couple
of weeks ago.  The port may have gotten broken...


-- 
Daniel Jacobowitz
CodeSourcery

From ivan.korzakow@gmail.com Wed Jan 11 15:04:20 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 15:04:42 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.194]:36220 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133542AbWAKPEU convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 11 Jan 2006 15:04:20 +0000
Received: by wproxy.gmail.com with SMTP id 71so174746wri
        for <linux-mips@linux-mips.org>; Wed, 11 Jan 2006 07:07:26 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=TjZf2N6P1+iBm60Ef1Bm67+hUa+ehDozsLkwHWax9t2eR3ZsUekaVRR/q0WcrLrnDurPfRsEqCuEs5J88lbU2WNaZpX7fficMt/mPxSGH2MskY4rS8mCvvJPzZf7mc5WRS6skid2fwJGLucPhuNh3EvTPJW6vgDnf30fvnk2D+A=
Received: by 10.54.83.7 with SMTP id g7mr998314wrb;
        Wed, 11 Jan 2006 07:07:25 -0800 (PST)
Received: by 10.54.69.5 with HTTP; Wed, 11 Jan 2006 07:07:25 -0800 (PST)
Message-ID: <a59861030601110707u16f5d366m@mail.gmail.com>
Date:	Wed, 11 Jan 2006 16:07:25 +0100
From:	Ivan Korzakow <ivan.korzakow@gmail.com>
To:	Ralf Baechle <ralf@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
In-Reply-To: <20060111112001.GA4403@linux-mips.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
	 <200601101757.45297.p_christ@hol.gr>
	 <a59861030601100838oa89ac84n@mail.gmail.com>
	 <200601101857.26978.p_christ@hol.gr>
	 <20060110215322.GA27577@linux-mips.org>
	 <a59861030601110310gca74f54o@mail.gmail.com>
	 <20060111112001.GA4403@linux-mips.org>
Return-Path: <ivan.korzakow@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9857
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ivan.korzakow@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1220
Lines: 33

2006/1/11, Ralf Baechle <ralf@linux-mips.org>:
> On Wed, Jan 11, 2006 at 12:10:05PM +0100, Ivan Korzakow wrote:
>
> > It would be great to be a little bit more explicit by giving some
> > _little_ examples ! Why not enlighting us directly instead of being so
> > vague.
>
> In books that kind of stuff is usually marked as "left as an exercise to
> the reader" ;-)

yeah, but we are chating on a forum ;0)

>
>   git-clone rsync://ftp.linux-mips.org/pub/scm/linux.git repository
>   cd repository
>   git-fetch git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 master:linus
>   git-repack -a -d
>

I know that but you miss my point. GIT is a tool to ease work on linux
kernel, but the way you use it makes harder life of users of your
tree. For example your tree contains more than 350 000 objects ! That
makes a lot of git commands running slow...

Let's say I'm developing a net drivers on ARM platform. I'm actually
do not care about ARM development, but I do care about net tree. To do
that, I just need to clone net tree because I know that ARM should be
OK with this tree. What about MIPS ?

I'm just wondering why not asking to Linus to pull from your tree like
every others maintainers do ?

Ivan

From anemo@mba.ocn.ne.jp Wed Jan 11 15:06:31 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 15:06:56 +0000 (GMT)
Received: from mba.ocn.ne.jp ([210.190.142.172]:57567 "HELO smtp.mba.ocn.ne.jp")
	by ftp.linux-mips.org with SMTP id S8133731AbWAKPGb (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Wed, 11 Jan 2006 15:06:31 +0000
Received: from localhost (p8236-ipad03funabasi.chiba.ocn.ne.jp [219.160.88.236])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP
	id 01BC9B12C; Thu, 12 Jan 2006 00:09:34 +0900 (JST)
Date:	Thu, 12 Jan 2006 00:09:04 +0900 (JST)
Message-Id: <20060112.000904.74752908.anemo@mba.ocn.ne.jp>
To:	dan@debian.org
Cc:	linux-mips@linux-mips.org
Subject: Re: QEMU and kernel 2.6.15
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
In-Reply-To: <20060111144355.GA17275@nevyn.them.org>
References: <20060111.002431.93019846.anemo@mba.ocn.ne.jp>
	<20060111144355.GA17275@nevyn.them.org>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 3.3 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9858
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips
Content-Length: 865
Lines: 30

>>>>> On Wed, 11 Jan 2006 09:43:56 -0500, Daniel Jacobowitz <dan@debian.org> said:

dan> You've configured the kernel for QEMU, right?  And are usin QEMU
dan> from CVS?

Yes, I configured the kernel with qemu_defconfig.  I tried both QEMU
0.8.0 and tried current CVS today, but got same results.

Here is my instructions:

kernel:
make O=../build-qemu qemu_defconfig
make O=../build-qemu

QEMU:
./configure --target-list=mips-softmmu --disable-gfx-check
make

Then:
mips-softmmu/qemu-system-mips -kernel /home/git/build-qemu/arch/mips/boot/vmlinux.bin -m 16 -nographic

dan> It worked for me the last time I tried, but that was a couple of
dan> weeks ago.  The port may have gotten broken...

While QEMU 0.8.0 was released on Dec 19 and it seems there was not so
much changes on kernel's arch/mips in last few weeks, we should be
very close ...

---
Atsushi Nemoto

From ivan.korzakow@gmail.com Wed Jan 11 15:10:54 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 15:11:16 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.203]:3731 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133475AbWAKPKx convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 11 Jan 2006 15:10:53 +0000
Received: by wproxy.gmail.com with SMTP id 71so176420wri
        for <linux-mips@linux-mips.org>; Wed, 11 Jan 2006 07:14:05 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=InXUtVKzGoETskmJlvDMSxBC3g77aqHnhI5Sno6QiXWUXNaTh5B1ry0nAzSnYPw6yM+C8d4rZsjdtFYEe5l4FfyvehOWPTCBISGhhike8xPdzIHCUnSVbx4N8fjrSeMHXM1IXS0Q4mOU/77ClmM94EmiRdIAbut9O1+UKsb7oO0=
Received: by 10.54.115.5 with SMTP id n5mr940737wrc;
        Wed, 11 Jan 2006 07:14:04 -0800 (PST)
Received: by 10.54.69.5 with HTTP; Wed, 11 Jan 2006 07:14:04 -0800 (PST)
Message-ID: <a59861030601110714n2134ed42w@mail.gmail.com>
Date:	Wed, 11 Jan 2006 16:14:04 +0100
From:	Ivan Korzakow <ivan.korzakow@gmail.com>
To:	Ralf Baechle <ralf@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
In-Reply-To: <20060110215322.GA27577@linux-mips.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
	 <200601101757.45297.p_christ@hol.gr>
	 <a59861030601100838oa89ac84n@mail.gmail.com>
	 <200601101857.26978.p_christ@hol.gr>
	 <20060110215322.GA27577@linux-mips.org>
Return-Path: <ivan.korzakow@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9859
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ivan.korzakow@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 608
Lines: 26

2006/1/10, Ralf Baechle <ralf@linux-mips.org>:
> It is possible to keep both Linus's and the lmo tree in the same
> repository with a _little_ care.  I do that all the time.  When compressed
> this will result in a bloat of just about 10-20MB.
>

well, in a MIPS repo:

$ git repack -a -d
$ git prune-packed
$ git prune
$ du .git
266M    .git
$ tree .git/objects/
.git/objects/
|-- info
|   `-- packs
`-- pack
    |-- pack-77ee75692f2944708c9dd65d6ba9100f6647b414.idx
    `-- pack-77ee75692f2944708c9dd65d6ba9100f6647b414.pack

2 directories, 3 files

What kind of magical git commands are you using ?

Ivan

From ivan.korzakow@gmail.com Wed Jan 11 15:14:46 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 15:15:08 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.200]:21823 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133464AbWAKPOp convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 11 Jan 2006 15:14:45 +0000
Received: by wproxy.gmail.com with SMTP id 71so177354wri
        for <linux-mips@linux-mips.org>; Wed, 11 Jan 2006 07:17:57 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references;
        b=JSPyKQQ6uPE8V5EuPZZfVm84EIASVdoPVRtzt+UIKDEH+zo/hHU3GVQ/y5qvkeYK8/BCXw4s7kWtgZFBTe1UvWPprDU4wa6rRLVWm89VyzPpzCM5Lpj0583W7uUcpB/rw0vj0RwGvKCKrdnRR4NJL+X3tnOvmiUAMjgX93fCB30=
Received: by 10.54.120.12 with SMTP id s12mr907192wrc;
        Wed, 11 Jan 2006 07:17:56 -0800 (PST)
Received: by 10.54.69.5 with HTTP; Wed, 11 Jan 2006 07:17:55 -0800 (PST)
Message-ID: <a59861030601110717n5708beeci@mail.gmail.com>
Date:	Wed, 11 Jan 2006 16:17:55 +0100
From:	Ivan Korzakow <ivan.korzakow@gmail.com>
To:	Ralf Baechle <ralf@linux-mips.org>
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
In-Reply-To: <20060110232006.GA3519@linux-mips.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com>
	 <200601101757.45297.p_christ@hol.gr>
	 <a59861030601100838oa89ac84n@mail.gmail.com>
	 <200601101857.26978.p_christ@hol.gr>
	 <a59861030601100915q6ffb4896v@mail.gmail.com>
	 <20060110232006.GA3519@linux-mips.org>
Return-Path: <ivan.korzakow@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9860
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ivan.korzakow@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 615
Lines: 16

2006/1/11, Ralf Baechle <ralf@linux-mips.org>:
> On Tue, Jan 10, 2006 at 06:15:18PM +0100, Ivan Korzakow wrote:
>
> > Why not simply keep CVS repository available for 1% of people willing
> > to browse the history ? And make life easier for 99% of people willing
> > to work on 2.6 ... (2.4 work may continue to use CVS too).
>
> The CVS repository is still available - and will stay for a long time so
> people have a chance to do diffs against their existing checked out trees.
> But no more changes.
>

again why not letting 2.2 2.4 stay in CVS ? I don't think there are
any active development, isn't it ?

Ivan

From ralf@linux-mips.org Wed Jan 11 19:04:44 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 19:05:07 +0000 (GMT)
Received: from extgw-uk.mips.com ([62.254.210.129]:47624 "EHLO
	bacchus.net.dhis.org") by ftp.linux-mips.org with ESMTP
	id S8133424AbWAKTEo (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Wed, 11 Jan 2006 19:04:44 +0000
Received: from denk.linux-mips.net (denk.linux-mips.net [127.0.0.1])
	by bacchus.net.dhis.org (8.13.4/8.13.4) with ESMTP id k0BJ7j9A025388;
	Wed, 11 Jan 2006 19:07:46 GMT
Received: (from ralf@localhost)
	by denk.linux-mips.net (8.13.4/8.13.4/Submit) id k0BJ7hEa025381;
	Wed, 11 Jan 2006 19:07:43 GMT
Date:	Wed, 11 Jan 2006 19:07:43 +0000
From:	Ralf Baechle <ralf@linux-mips.org>
To:	Ivan Korzakow <ivan.korzakow@gmail.com>
Cc:	"P. Christeas" <p_christ@hol.gr>, linux-mips@linux-mips.org
Subject: Re: why the early_initcall(au1x00_setup) do not work?
Message-ID: <20060111190743.GE4403@linux-mips.org>
References: <50c9a2250601082159p238cacd6r930709da9305479e@mail.gmail.com> <200601101757.45297.p_christ@hol.gr> <a59861030601100838oa89ac84n@mail.gmail.com> <200601101857.26978.p_christ@hol.gr> <20060110215322.GA27577@linux-mips.org> <a59861030601110310gca74f54o@mail.gmail.com> <20060111112001.GA4403@linux-mips.org> <a59861030601110707u16f5d366m@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <a59861030601110707u16f5d366m@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Return-Path: <ralf@linux-mips.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9861
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ralf@linux-mips.org
Precedence: bulk
X-list: linux-mips
Content-Length: 1006
Lines: 23

On Wed, Jan 11, 2006 at 04:07:25PM +0100, Ivan Korzakow wrote:

> I know that but you miss my point. GIT is a tool to ease work on linux
> kernel, but the way you use it makes harder life of users of your
> tree. For example your tree contains more than 350 000 objects ! That
> makes a lot of git commands running slow...

Linus promised too look into that.  He has too - it's what his tree would
be facing in the not too distant future, otherwise.

> Let's say I'm developing a net drivers on ARM platform. I'm actually
> do not care about ARM development, but I do care about net tree. To do
> that, I just need to clone net tree because I know that ARM should be
> OK with this tree. What about MIPS ?
> 
> I'm just wondering why not asking to Linus to pull from your tree like
> every others maintainers do ?

Like most other developers I create throw-away trees for that purpose, see
the upstream-linus tree.  Due to the way the Linux release process is
working anything else is unrealistic.

  Ralf

From yzzhang@sy-imatec.com Wed Jan 11 19:57:40 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 19:57:59 +0000 (GMT)
Received: from vweb.sina.net ([202.108.3.191]:42231 "EHLO vweb.sina.net")
	by ftp.linux-mips.org with ESMTP id S8133732AbWAKT5k (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Wed, 11 Jan 2006 19:57:40 +0000
Received: (qmail 21488 invoked by uid 99); 11 Jan 2006 20:00:35 -0000
Message-ID: <20060111200035.21487.qmail@sina.com>
From:	yzzhang@sy-imatec.com
To:	linux-mips@linux-mips.org
CC:	linux-cvs@linux-mips.org
Subject: au1200 mae mmap problem
Date:	Thu, 12 Jan 2006 04:00:35 +0800
X-Mailer: SinaMail(3.0)
X-Priority: 3
MIME-Version: 1.0
Content-Type: text/plain;
  charset="gb2312"
Content-Transfer-Encoding: 7bit
Return-Path: <yzzhang@sy-imatec.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9862
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: yzzhang@sy-imatec.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2058
Lines: 58

I wrote a simple program to test Au1200 MAE.
The result is always that program will return -1 because pmms->struct_size=0, though it is assigned
a value of 0xdc during initialization in the kernel.
anyone could explain the reason for me? Thanks in advance. 
-----------------------------------------------------------------------
In user space:
  if ((fmae = open("/dev/mae", O_RDWR)) < 0) {
        printf("mae open failed.\n");
        return -1;
    }
 gMemSize = ioctl(fmae, AU1XXXMAE_INIT, &ioc);
 maeaddr = mmap (0, gMemSize, PROT_READ|PROT_WRITE, MAP_SHARED | MAP_NONCACHED, fmae, 0);
 if (maeaddr == MAP_FAILED)
    {
        printf("mae: attempt to map memory failed.\n");
        return -1;
    }
 pmms = (PMAE_MASTER_T)maeaddr;
 if (pmms->struct_size < sizeof(MAE_MASTER_T))
    {
      printf("mae_driver, structure size mismatch: driver=%x interface=%d\n",pmms->struct_size, sizeof(MAE_MASTER_T));
        return -1;
    }

-----------------------------------------------------------------------------------------
In kernel space,au1200's driver is listed as below: 

int au1xxxmae_mmap(struct file *filp, struct vm_area_struct *vma ) 
{
    unsigned long size = vma->vm_end - vma->vm_start;
    unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
    offset += mae_phys_address;
    vma->vm_page_prot = pgprot_cached(vma->vm_page_prot);    
    if(remap_pfn_range(vma, vma->vm_start, offset >> PAGE_SHIFT, size, vma->vm_page_prot))    
    {
         DBGPRINT(ERRORS,"Could not remap the page range\n");
         return -EFAULT;
    }

    vma->vm_flags &= ~VM_IO;
    vma->vm_ops = &au1xxx_vmaops;
    au1xxx_vma_open(vma);
    return 0;
}

void init_mae_structs(void) 
{
    unsigned char k,x[10];

    pmms = (PMAE_MASTER_T) KRNL_MAE_MASTER_STRUCT; // pmms means ptr to mae master struct
    // initialize the master structure
    memset((PVOID)KRNL_MAE_MASTER_STRUCT, 0, sizeof(MAE_MASTER_T));
    pmms->struct_size=sizeof(MAE_MASTER_T);   //pmms->struct_size = 0xdc
    ... ... 
}




From yzzhang@sy-imatec.com Wed Jan 11 19:58:30 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 19:58:54 +0000 (GMT)
Received: from vweb.sina.net ([202.108.3.191]:52430 "EHLO vweb.sina.net")
	by ftp.linux-mips.org with ESMTP id S8133655AbWAKT5m (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Wed, 11 Jan 2006 19:57:42 +0000
Received: (qmail 51146 invoked by uid 99); 11 Jan 2006 20:00:45 -0000
Message-ID: <20060111200045.51145.qmail@sina.com>
From:	yzzhang@sy-imatec.com
To:	linux-mips@linux-mips.org
CC:	linux-cvs@linux-mips.org
Subject: au1200 mae mmap problem
Date:	Thu, 12 Jan 2006 04:00:45 +0800
X-Mailer: SinaMail(3.0)
X-Priority: 3
MIME-Version: 1.0
Content-Type: text/plain;
  charset="gb2312"
Content-Transfer-Encoding: 7bit
Return-Path: <yzzhang@sy-imatec.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9863
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: yzzhang@sy-imatec.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2058
Lines: 58

I wrote a simple program to test Au1200 MAE.
The result is always that program will return -1 because pmms->struct_size=0, though it is assigned
a value of 0xdc during initialization in the kernel.
anyone could explain the reason for me? Thanks in advance. 
-----------------------------------------------------------------------
In user space:
  if ((fmae = open("/dev/mae", O_RDWR)) < 0) {
        printf("mae open failed.\n");
        return -1;
    }
 gMemSize = ioctl(fmae, AU1XXXMAE_INIT, &ioc);
 maeaddr = mmap (0, gMemSize, PROT_READ|PROT_WRITE, MAP_SHARED | MAP_NONCACHED, fmae, 0);
 if (maeaddr == MAP_FAILED)
    {
        printf("mae: attempt to map memory failed.\n");
        return -1;
    }
 pmms = (PMAE_MASTER_T)maeaddr;
 if (pmms->struct_size < sizeof(MAE_MASTER_T))
    {
      printf("mae_driver, structure size mismatch: driver=%x interface=%d\n",pmms->struct_size, sizeof(MAE_MASTER_T));
        return -1;
    }

-----------------------------------------------------------------------------------------
In kernel space,au1200's driver is listed as below: 

int au1xxxmae_mmap(struct file *filp, struct vm_area_struct *vma ) 
{
    unsigned long size = vma->vm_end - vma->vm_start;
    unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
    offset += mae_phys_address;
    vma->vm_page_prot = pgprot_cached(vma->vm_page_prot);    
    if(remap_pfn_range(vma, vma->vm_start, offset >> PAGE_SHIFT, size, vma->vm_page_prot))    
    {
         DBGPRINT(ERRORS,"Could not remap the page range\n");
         return -EFAULT;
    }

    vma->vm_flags &= ~VM_IO;
    vma->vm_ops = &au1xxx_vmaops;
    au1xxx_vma_open(vma);
    return 0;
}

void init_mae_structs(void) 
{
    unsigned char k,x[10];

    pmms = (PMAE_MASTER_T) KRNL_MAE_MASTER_STRUCT; // pmms means ptr to mae master struct
    // initialize the master structure
    memset((PVOID)KRNL_MAE_MASTER_STRUCT, 0, sizeof(MAE_MASTER_T));
    pmms->struct_size=sizeof(MAE_MASTER_T);   //pmms->struct_size = 0xdc
    ... ... 
}




From yzzhang@sy-imatec.com Wed Jan 11 20:03:29 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 20:03:49 +0000 (GMT)
Received: from vweb.sina.net ([202.108.3.191]:58338 "EHLO vweb.sina.net")
	by ftp.linux-mips.org with ESMTP id S8133542AbWAKUD3 (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Wed, 11 Jan 2006 20:03:29 +0000
Received: (qmail 79165 invoked by uid 99); 11 Jan 2006 20:06:32 -0000
Message-ID: <20060111200632.79164.qmail@sina2-84.sina.net>
From:	yzzhang@sy-imatec.com
To:	linux-mips@linux-mips.org
Subject: au1200 mae mmap problem
Date:	Thu, 12 Jan 2006 04:06:32 +0800
X-Mailer: SinaMail(3.0)
X-Priority: 3
MIME-Version: 1.0
Content-Type: text/plain;
  charset="gb2312"
Content-Transfer-Encoding: 7bit
Return-Path: <yzzhang@sy-imatec.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9864
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: yzzhang@sy-imatec.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2058
Lines: 58

I wrote a simple program to test Au1200 MAE.
The result is always that program will return -1 because pmms->struct_size=0, though it is assigned
a value of 0xdc during initialization in the kernel.
anyone could explain the reason for me? Thanks in advance. 
-----------------------------------------------------------------------
In user space:
  if ((fmae = open("/dev/mae", O_RDWR)) < 0) {
        printf("mae open failed.\n");
        return -1;
    }
 gMemSize = ioctl(fmae, AU1XXXMAE_INIT, &ioc);
 maeaddr = mmap (0, gMemSize, PROT_READ|PROT_WRITE, MAP_SHARED | MAP_NONCACHED, fmae, 0);
 if (maeaddr == MAP_FAILED)
    {
        printf("mae: attempt to map memory failed.\n");
        return -1;
    }
 pmms = (PMAE_MASTER_T)maeaddr;
 if (pmms->struct_size < sizeof(MAE_MASTER_T))
    {
      printf("mae_driver, structure size mismatch: driver=%x interface=%d\n",pmms->struct_size, sizeof(MAE_MASTER_T));
        return -1;
    }

-----------------------------------------------------------------------------------------
In kernel space,au1200's driver is listed as below: 

int au1xxxmae_mmap(struct file *filp, struct vm_area_struct *vma ) 
{
    unsigned long size = vma->vm_end - vma->vm_start;
    unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
    offset += mae_phys_address;
    vma->vm_page_prot = pgprot_cached(vma->vm_page_prot);    
    if(remap_pfn_range(vma, vma->vm_start, offset >> PAGE_SHIFT, size, vma->vm_page_prot))    
    {
         DBGPRINT(ERRORS,"Could not remap the page range\n");
         return -EFAULT;
    }

    vma->vm_flags &= ~VM_IO;
    vma->vm_ops = &au1xxx_vmaops;
    au1xxx_vma_open(vma);
    return 0;
}

void init_mae_structs(void) 
{
    unsigned char k,x[10];

    pmms = (PMAE_MASTER_T) KRNL_MAE_MASTER_STRUCT; // pmms means ptr to mae master struct
    // initialize the master structure
    memset((PVOID)KRNL_MAE_MASTER_STRUCT, 0, sizeof(MAE_MASTER_T));
    pmms->struct_size=sizeof(MAE_MASTER_T);   //pmms->struct_size = 0xdc
    ... ... 
}




From drow@nevyn.them.org Wed Jan 11 20:10:43 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Wed, 11 Jan 2006 20:11:08 +0000 (GMT)
Received: from nevyn.them.org ([66.93.172.17]:44712 "EHLO nevyn.them.org")
	by ftp.linux-mips.org with ESMTP id S8133429AbWAKUKn (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Wed, 11 Jan 2006 20:10:43 +0000
Received: from drow by nevyn.them.org with local (Exim 4.54)
	id 1EwmLy-0005y9-Ma; Wed, 11 Jan 2006 15:13:54 -0500
Date:	Wed, 11 Jan 2006 15:13:54 -0500
From:	Daniel Jacobowitz <dan@debian.org>
To:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc:	linux-mips@linux-mips.org
Subject: Re: QEMU and kernel 2.6.15
Message-ID: <20060111201354.GA22873@nevyn.them.org>
References: <20060111.002431.93019846.anemo@mba.ocn.ne.jp> <20060111144355.GA17275@nevyn.them.org> <20060112.000904.74752908.anemo@mba.ocn.ne.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20060112.000904.74752908.anemo@mba.ocn.ne.jp>
User-Agent: Mutt/1.5.8i
Return-Path: <drow@nevyn.them.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9865
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: dan@debian.org
Precedence: bulk
X-list: linux-mips
Content-Length: 381
Lines: 11

On Thu, Jan 12, 2006 at 12:09:04AM +0900, Atsushi Nemoto wrote:
> mips-softmmu/qemu-system-mips -kernel /home/git/build-qemu/arch/mips/boot/vmlinux.bin -m 16 -nographic

Just to check, could you try -m 32 or -m 128?  It shouldn't rely on
more than 16MB, but the boundary condition may be wrong.

Beyond that, I have no idea what might be wrong.

-- 
Daniel Jacobowitz
CodeSourcery

From langabe@gmail.com Thu Jan 12 10:14:49 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Thu, 12 Jan 2006 10:15:14 +0000 (GMT)
Received: from nproxy.gmail.com ([64.233.182.203]:13551 "EHLO nproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8126506AbWALKOt convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Thu, 12 Jan 2006 10:14:49 +0000
Received: by nproxy.gmail.com with SMTP id y38so265768nfb
        for <linux-mips@linux-mips.org>; Thu, 12 Jan 2006 02:18:03 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=gPxCBSUvwNgh9bxaqBqCk9Re1QztVkkArI9NFZTo2BGzOT3FopmT04N4xXdhs82ca7aPfEYoTeIQzuwy1DpLXhLFIsJoEl6jzDv5jZ/9TrxMVpvNHo2KsEou0vx278d1LRaPIOhBAVwWe1lmW0t6gXMEXiT6Xqd5k/D0SrZwwys=
Received: by 10.48.238.3 with SMTP id l3mr114893nfh;
        Thu, 12 Jan 2006 02:18:03 -0800 (PST)
Received: by 10.48.225.20 with HTTP; Thu, 12 Jan 2006 02:18:03 -0800 (PST)
Message-ID: <c58a7a270601120218r77ec0d8drf2d14663138a13c2@mail.gmail.com>
Date:	Thu, 12 Jan 2006 10:18:03 +0000
From:	Alex Gonzalez <langabe@gmail.com>
To:	linux-mips <linux-mips@linux-mips.org>
Subject: Compiling a non-pic glibc
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <langabe@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9866
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: langabe@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2037
Lines: 41

Hi,

What is the correct way of cross-compiling a non-pic static glibc?

I thought something like,

env CC="mips64-linux-gnu-gcc -mabi=n32 -mno-abicalls -fno-pic -mips4"
../glibc-src/configure --host=mips64-linux-gnu
--build=i686-pc-linux-gnulibc2.2 --prefix=/usr
--with-headers=/mips64-linux-gnu/sys-root/usr/include/
--enable-add-ons=linuxthreads --without-cvs --with-fp --disable-shared

and 'make' will do it, but it fails with,

make[2]: Entering directory `/home/alex/projects/glibc-src/iconv'
/opt/redhat/mips64linux-031001/H-i686-pc-linux-gnulibc2.2/bin/mips64-linux-gnu-gcc
-mabi=n32 -mno-abicalls -fno-pic -mips4 -nostdlib -nostartfiles -o
/home/alex/projects/glibc-build/iconv/iconvconfig     
/home/alex/projects/glibc-build/csu/crt1.o
/home/alex/projects/glibc-build/csu/crti.o
`/opt/redhat/mips64linux-031001/H-i686-pc-linux-gnulibc2.2/bin/mips64-linux-gnu-gcc
-mabi=n32 -mno-abicalls -fno-pic -mips4 --print-file-name=crtbegin.o`
/home/alex/projects/glibc-build/iconv/iconvconfig.o
/home/alex/projects/glibc-build/iconv/strtab.o
/home/alex/projects/glibc-build/iconv/xmalloc.o 
/home/alex/projects/glibc-build/libc.a  -lgcc
/home/alex/projects/glibc-build/libc.a -lgcc
`/opt/redhat/mips64linux-031001/H-i686-pc-linux-gnulibc2.2/bin/mips64-linux-gnu-gcc
-mabi=n32 -mno-abicalls -fno-pic -mips4 --print-file-name=crtend.o`
/home/alex/projects/glibc-build/csu/crtn.o
/opt/redhat/mips64linux-031001/H-i686-pc-linux-gnulibc2.2/lib/gcc-lib/mips64-linux-gnu/3.3-mips64linux-031001/../../../../mips64-linux-gnu/bin/ld:
/opt/redhat/mips64linux-031001/H-i686-pc-linux-gnulibc2.2/lib/gcc-lib/mips64-linux-gnu/3.3-mips64linux-031001/32/crtbegin.o:
warning: linking PIC files with non-PIC files
/opt/redhat/mips64linux-031001/H-i686-pc-linux-gnulibc2.2/lib/gcc-lib/mips64-linux-gnu/3.3-mips64linux-031001/../../../../mips64-linux-gnu/bin/ld:
/home/alex/projects/glibc-build/iconv/iconvconfig.o: warning: linking
PIC files with non-PIC files

Just in case, I am trying to build glibc-2.3.1 with a gcc 3.3 based toolchain.

Thanks,
Alex

From anemo@mba.ocn.ne.jp Sun Jan 15 18:03:05 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:03:29 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:20106 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133356AbWAOSCw (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 18:02:52 +0000
Received: from [IPv6:::ffff:210.190.142.172] ([IPv6:::ffff:210.190.142.172]:62915
	"HELO smtp.mba.ocn.ne.jp") by linux-mips.net with SMTP
	id <S870688AbWALOmr>; Thu, 12 Jan 2006 15:42:47 +0100
Received: from localhost (p3016-ipad205funabasi.chiba.ocn.ne.jp [222.146.98.16])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP
	id 121C384F5; Thu, 12 Jan 2006 23:41:08 +0900 (JST)
Date:	Thu, 12 Jan 2006 23:40:38 +0900 (JST)
Message-Id: <20060112.234038.07644223.anemo@mba.ocn.ne.jp>
To:	dan@debian.org
Cc:	linux-mips@linux-mips.org
Subject: Re: QEMU and kernel 2.6.15
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
In-Reply-To: <20060111201354.GA22873@nevyn.them.org>
References: <20060111144355.GA17275@nevyn.them.org>
	<20060112.000904.74752908.anemo@mba.ocn.ne.jp>
	<20060111201354.GA22873@nevyn.them.org>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 3.3 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9867
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips
Content-Length: 347
Lines: 10

>>>>> On Wed, 11 Jan 2006 15:13:54 -0500, Daniel Jacobowitz <dan@debian.org> said:

dan> Just to check, could you try -m 32 or -m 128?  It shouldn't rely
dan> on more than 16MB, but the boundary condition may be wrong.

dan> Beyond that, I have no idea what might be wrong.

I tried both but it did not help.  Thank you anyway.
---
Atsushi Nemoto

From anemo@mba.ocn.ne.jp Sun Jan 15 18:04:13 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:04:47 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:24714 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133479AbWAOSEL (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 18:04:11 +0000
Received: from mba.ocn.ne.jp ([IPv6:::ffff:210.190.142.172]:17645 "HELO
	smtp.mba.ocn.ne.jp") by linux-mips.net with SMTP id <S870928AbWALQVR>;
	Thu, 12 Jan 2006 17:21:17 +0100
Received: from localhost (p3016-ipad205funabasi.chiba.ocn.ne.jp [222.146.98.16])
	by smtp.mba.ocn.ne.jp (Postfix) with ESMTP
	id A3D8365E; Fri, 13 Jan 2006 01:19:56 +0900 (JST)
Date:	Fri, 13 Jan 2006 01:19:27 +0900 (JST)
Message-Id: <20060113.011927.75184433.anemo@mba.ocn.ne.jp>
To:	ralf@linux-mips.org
Cc:	linux-mips@linux-mips.org
Subject: Re: QEMU and kernel 2.6.15
From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
In-Reply-To: <20060110153652.GA4871@linux-mips.org>
References: <20060111.002431.93019846.anemo@mba.ocn.ne.jp>
	<20060110153652.GA4871@linux-mips.org>
X-Fingerprint: 6ACA 1623 39BD 9A94 9B1A  B746 CA77 FE94 2874 D52F
X-Pgp-Public-Key: http://wwwkeys.pgp.net/pks/lookup?op=get&search=0x2874D52F
X-Mailer: Mew version 3.3 on Emacs 21.4 / Mule 5.0 (SAKAKI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Return-Path: <anemo@mba.ocn.ne.jp>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9868
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: anemo@mba.ocn.ne.jp
Precedence: bulk
X-list: linux-mips
Content-Length: 505
Lines: 16

>>>>> On Tue, 10 Jan 2006 15:36:52 +0000, Ralf Baechle <ralf@linux-mips.org> said:

ralf> Qemu is still work in progress and needs further debugging.

Do you mean QEMU itself or Qemu port of the kernel?

It looks timer setting in arch/mips/qemu is somewhat broken.

qemu_timer_setup() installs the timer interrupt handler on irq 0, but
do_qemu_int() also calls ll_timer_interrupt() directly.

Which timer interrupt source does the kernel expect?  r4k counter
interrupt or i8259 timer?

---
Atsushi Nemoto

From zzh.hust@gmail.com Sun Jan 15 18:17:41 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:18:09 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:47498 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133352AbWAOSRl (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 18:17:41 +0000
Received: from wproxy.gmail.com ([IPv6:::ffff:64.233.184.204]:58313 "EHLO
	wproxy.gmail.com") by linux-mips.net with ESMTP id <S872498AbWAMClp> convert rfc822-to-8bit;
	Fri, 13 Jan 2006 03:41:45 +0100
Received: by wproxy.gmail.com with SMTP id 36so584812wra
        for <linux-mips@linux-mips.org>; Thu, 12 Jan 2006 18:39:40 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=XT5o5SMjyZOtBeNWWxP1LOUty6gXqDaqz81iZauvCj4OYFDid540L/QRk9PBv5EIvp21PXwIewcrJXdEdkoFbAPStB1/MYVa4482HJVykLbdPZol1Ypu6SldB0ovDHGM7LeagiOl6nMrkk0VcWdSBB6MdrCWYL860Mb59CcDCK8=
Received: by 10.54.94.16 with SMTP id r16mr4357288wrb;
        Thu, 12 Jan 2006 18:39:40 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Thu, 12 Jan 2006 18:39:40 -0800 (PST)
Message-ID: <50c9a2250601121839n3d96327ald74e129aea19b56a@mail.gmail.com>
Date:	Fri, 13 Jan 2006 10:39:40 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	linux-mips <linux-mips@linux-mips.org>
Subject: does the linux kernel use k0, k1 regs?
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9869
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 473
Lines: 15

i have to handle a NMI interrupt in bootloader(0xBFC00000),
 and i want to return to linux after the NMI interrupt,  i think other
regs maybe be useing by linux-kernel, i think the NMI handle only can
use K0, K1.

and i do not find the use of K0, K1 in linux-kernel interrupt or
exception handle
so i think if the NMI interrupt a linux interrupt handle, there is
still no conflict.

i am not sure my thinking is right, anyone can give some hints?

Best regards

zhuzhenhua

From zzh.hust@gmail.com Sun Jan 15 18:21:15 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:21:35 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:56458 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8126537AbWAOSVO (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 18:21:14 +0000
Received: from wproxy.gmail.com ([IPv6:::ffff:64.233.184.198]:47286 "EHLO
	wproxy.gmail.com") by linux-mips.net with ESMTP id <S872756AbWAMHGY> convert rfc822-to-8bit;
	Fri, 13 Jan 2006 08:06:24 +0100
Received: by wproxy.gmail.com with SMTP id 36so632604wra
        for <linux-mips@linux-mips.org>; Thu, 12 Jan 2006 23:04:22 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=mDhYhbr16xM1hSi9THZplb5bghvhDefj3tHs483uh0TXxGyY5ngxmMcFJS8Xtnz+n88o2F83b5YhcCJFDMOMg0P6LpkYklnCZ+ACzeJb+q114q9VatICwNNGIAE7HajDgICUUZ6AYrDtMzUGwyKx+TrlNwhEQZGQxIg8sM2xoVQ=
Received: by 10.54.132.17 with SMTP id f17mr4593145wrd;
        Thu, 12 Jan 2006 23:04:22 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Thu, 12 Jan 2006 23:04:21 -0800 (PST)
Message-ID: <50c9a2250601122304idfa535dt7066274b6dce2d43@mail.gmail.com>
Date:	Fri, 13 Jan 2006 15:04:21 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	linux-mips <linux-mips@linux-mips.org>
Subject: does not the kernel support embedded ramdisk too larget?
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9870
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 362
Lines: 11

i compile the ramdisk.gz into the vmlinux, and if the ramdisk.gz is
not too large, it works fine. it the ramdisk.gz is too large about 4M.
it get error when uncomrpessed ramdisk
"invalid compressed format(err=1)"

My sdram is 64M, and i download uImage to 0x82000000,and then bootm 0x82000000
does anyone meet this?
thanks for any hints

Best regards
Zhuzhenhua

From ivan.korzakow@gmail.com Sun Jan 15 18:25:43 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:26:12 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:64138 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133356AbWAOSZn (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 18:25:43 +0000
Received: from wproxy.gmail.com ([IPv6:::ffff:64.233.184.196]:12779 "EHLO
	wproxy.gmail.com") by linux-mips.net with ESMTP id <S872952AbWAMJWt> convert rfc822-to-8bit;
	Fri, 13 Jan 2006 10:22:49 +0100
Received: by wproxy.gmail.com with SMTP id 71so622125wri
        for <linux-mips@linux-mips.org>; Fri, 13 Jan 2006 01:20:47 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=L20i5tpr3BBMdQM426soZQW+OAVgr+gOphYpnfUfoXFyinXQwJ8+eLkWVktNV77M7TR5BqHVAPSjWL190pHOeuKoyPmCVBCppDBtl4fJEV4OknxRZ8CY8xCpReiWRH0cBEJ74wi0mcUC5nL5Px2bboDbZjvTHMCJK2VqY86Z16g=
Received: by 10.54.145.12 with SMTP id s12mr3761256wrd;
        Fri, 13 Jan 2006 01:20:47 -0800 (PST)
Received: by 10.54.69.11 with HTTP; Fri, 13 Jan 2006 01:20:47 -0800 (PST)
Message-ID: <a59861030601130120y3456b6dat@mail.gmail.com>
Date:	Fri, 13 Jan 2006 10:20:47 +0100
From:	Ivan Korzakow <ivan.korzakow@gmail.com>
To:	linux-mips@linux-mips.org
Subject: How to apply 2.6.15-git7 patchset ?
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <ivan.korzakow@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9871
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: ivan.korzakow@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 223
Lines: 8

Hi

Could anybody tell me why I can't apply cleanly the
"patch-2.6.15-git7.bz2" patchset on a mips repository ? Of course I
tried to apply this patch on a 2.6.15 tree...
Actually only mips files failed to be patched.

Ivan

From thomas.dahlmann@amd.com Sun Jan 15 18:27:28 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:27:51 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:907 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8126537AbWAOS00 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 18:26:26 +0000
Received: from [IPv6:::ffff:163.181.251.6] ([IPv6:::ffff:163.181.251.6]:54926
	"EHLO amdext4.amd.com") by linux-mips.net with ESMTP
	id <S873030AbWAMKMI>; Fri, 13 Jan 2006 11:12:08 +0100
Received: from SAUSGW02.amd.com (sausgw02.amd.com [163.181.250.22])
	by amdext4.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k0DA7p8b011365;
	Fri, 13 Jan 2006 04:08:42 -0600
Received: from 163.181.250.1 by SAUSGW01.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Fri, 13 Jan 2006 04:08:23 -0600
X-Server-Uuid: 8C3DB987-180B-4465-9446-45C15473FD3E
Received: from elbe.amd.com (elbe.amd.com [172.20.31.2]) by
 amdint2.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k0DA8Kh5009974; Fri,
 13 Jan 2006 04:08:20 -0600 (CST)
Received: from [172.20.32.126] by elbe.amd.com (8.8.8+Sun/AMD-S-2.0) id
 LAA20341; Fri, 13 Jan 2006 11:08:19 +0100 (MET)
Message-ID: <43C77C1D.3030702@amd.com>
Date:	Fri, 13 Jan 2006 11:08:29 +0100
From:	"Thomas Dahlmann" <thomas.dahlmann@amd.com>
User-Agent: Mozilla Thunderbird 1.0.6 (Windows/20050716)
X-Accept-Language: en-us, en
MIME-Version: 1.0
To:	"Oliver Neukum" <oliver@neukum.org>
cc:	linux-usb-devel@lists.sourceforge.net,
	"Jordan Crouse" <jordan.crouse@amd.com>, linux-mips@linux-mips.org,
	linux-kernel@vger.kernel.org, info-linux@ldcmail.amd.com
Subject: Re: [linux-usb-devel] [PATCH] UDC support for MIPS/AU1200 and
 Geode/CS5536
References: <20060109180356.GA8855@cosmic.amd.com>
 <200601092344.55988.oliver@neukum.org> <43C39431.6020308@amd.com>
 <200601101440.38853.oliver@neukum.org>
In-Reply-To: <200601101440.38853.oliver@neukum.org>
X-WSS-ID: 6FD9A39D3983386203-01-01
Content-Type: text/plain;
 charset=utf-8;
 format=flowed
Content-Transfer-Encoding: 7bit
Return-Path: <thomas.dahlmann@amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9872
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: thomas.dahlmann@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1691
Lines: 74

Oliver Neukum wrote:

>Am Dienstag, 10. Januar 2006 12:02 schrieb Thomas Dahlmann:
>  
>
>>Oliver Neukum wrote:
>>
>>    
>>
>>>Am Montag, 9. Januar 2006 19:03 schrieb Jordan Crouse:
>>> 
>>>
>>>      
>>>
>>>>>From the "two-birds-one-stone" department, I am pleased to present USB UDC
>>>>support for both the MIPS Au1200 SoC and the Geode CS5535 south bridge.  
>>>>Also, coming soon (in the next few days), OTG, which has been removed from
>>>>the usb_host patch, and put into its own patch (as per David's comments).
>>>>
>>>>This patch is against current linux-mips git, but it should apply for Linus's
>>>>tree as well.
>>>>
>>>>Regards,
>>>>Jordan
>>>>
>>>>   
>>>>
>>>>        
>>>>
>>>+        VDBG("udc_read_bytes(): %d bytes\n", bytes);
>>>+
>>>+        /* dwords first */
>>>+        for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) {
>>>+               *((u32*) (buf + (i<<2))) = readl(dev->rxfifo); 
>>>+        }
>>>
>>>Is there any reason you don't increment by 4?
>>>
>>>	Regards
>>>		Oliver
>>>
>>>
>>>
>>> 
>>>
>>>      
>>>
>>The loop is for reading dwords only, so "i < bytes / UDC_DWORD_BYTES" cuts
>>off remaining 1,2 or 3 bytes which are handled by the next loop.
>>But you are right, incrementing by 4 may look better,  as
>>
>>        for (i = 0; i < bytes - bytes % UDC_DWORD_BYTES; i+=4) {
>>               *((u32*) (buf + i)) = readl(dev->rxfifo); 
>>        }
>>    
>>
>
>Not only will it look better, but it'll save you a shift operation.
>You might even compute start and finish values before the loop and
>save an addition in the body.
>
>	Regards
>		Oliver
>
>
>
>  
>
I have changed this for the next patch release. Thanks for the input !

Regards,
Thomas



From jcrouse@cosmic.amd.com Sun Jan 15 18:36:53 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:37:27 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:26251 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133502AbWAOSgW (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 18:36:22 +0000
Received: from amdext4.amd.com ([IPv6:::ffff:163.181.251.6]:3255 "EHLO
	amdext4.amd.com") by linux-mips.net with ESMTP id <S874051AbWAMSYa>;
	Fri, 13 Jan 2006 19:24:30 +0100
Received: from SAUSGW02.amd.com (sausgw02.amd.com [163.181.250.22])
	by amdext4.amd.com (8.12.11/8.12.11/AMD) with ESMTP id k0DIKgOr008005;
	Fri, 13 Jan 2006 12:21:08 -0600
Received: from 163.181.250.1 by SAUSGW02.amd.com with ESMTP (AMD SMTP
 Relay (Email Firewall v6.1.0)); Fri, 13 Jan 2006 12:21:00 -0600
X-Server-Uuid: 5FC0E2DF-CD44-48CD-883A-0ED95B391E89
Received: from ldcmail.amd.com (ldcmail.amd.com [147.5.200.40]) by
 amdint2.amd.com (8.12.8/8.12.8/AMD) with ESMTP id k0DIKxh5000164; Fri,
 13 Jan 2006 12:20:59 -0600 (CST)
Received: from cosmic.amd.com (cosmic.amd.com [147.5.201.206]) by
 ldcmail.amd.com (Postfix) with ESMTP id 766E82028; Fri, 13 Jan 2006
 11:20:59 -0700 (MST)
Received: from cosmic.amd.com (localhost [127.0.0.1]) by cosmic.amd.com
 (8.13.4/8.13.4) with ESMTP id k0DIUcEX028910; Fri, 13 Jan 2006 11:30:38
 -0700
Received: (from jcrouse@localhost) by cosmic.amd.com (
 8.13.4/8.13.4/Submit) id k0DIUc72028909; Fri, 13 Jan 2006 11:30:38
 -0700
Date:	Fri, 13 Jan 2006 11:30:38 -0700
From:	"Jordan Crouse" <jordan.crouse@amd.com>
To:	linux-usb-devel@lists.sourceforge.net, linux-mips@linux-mips.org
cc:	thomas.dahlmann@amd.com
Subject: [PATCH] EHCI support for the AU1200
Message-ID: <20060113183038.GK8925@cosmic.amd.com>
MIME-Version: 1.0
User-Agent: Mutt/1.5.11
X-WSS-ID: 6FD930060T03439990-01-01
Content-Type: multipart/mixed;
 boundary=LyciRD1jyfeSSjG0
Content-Disposition: inline
Return-Path: <jcrouse@cosmic.amd.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9873
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: jordan.crouse@amd.com
Precedence: bulk
X-list: linux-mips
Content-Length: 20036
Lines: 681


--LyciRD1jyfeSSjG0
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: 7bit

This is the re-send and fixed up version of the patch I sent out a few
weeks ago, to be applied against latest linux-mips GIT.  Unless somebody
finds something horrible,  I think these are ready to go into Greg's tree
and sent on upstream.

Here is the changelog:

* All OTG references are removed and moved to their own patch (which will
  be forthcoming soon).
* Fixed up some coding issues with the move from PCI, including the
  mapping of EHCI capability and operations registers (causing the bugs
  that were posted here).
* Cached the cap register for speed
* Au1200 init and remove routines were in the wrong place
* reboot_notifier was registered twice

Jordan

--LyciRD1jyfeSSjG0
Content-Type: text/plain;
 charset=us-ascii
Content-Disposition: inline;
 filename=usb_host.patch
Content-Transfer-Encoding: 7bit

ALCHEMY:  Add EHCI support for AU1200

Signed-off-by: Jordan Crouse <jordan.crouse@amd.com>
---

 arch/mips/au1000/common/cputable.c                 |    2 
 arch/mips/au1000/common/platform.c                 |    4 
 drivers/usb/Kconfig                                |    8 -
 drivers/usb/host/Kconfig                           |    2 
 drivers/usb/host/ehci-au1xxx.c                     |  299 ++++++++++++++++++++
 drivers/usb/host/ehci-hcd.c                        |    8 -
 drivers/usb/host/ohci-au1xxx.c                     |  105 ++++++-
 include/asm-mips/mach-mips/cpu-feature-overrides.h |    4 
 8 files changed, 405 insertions(+), 27 deletions(-)

diff --git a/arch/mips/au1000/common/cputable.c b/arch/mips/au1000/common/cputable.c
index 4dbde82..d8df5fd 100644
--- a/arch/mips/au1000/common/cputable.c
+++ b/arch/mips/au1000/common/cputable.c
@@ -38,7 +38,7 @@ struct cpu_spec	cpu_specs[] = {
     { 0xffffffff, 0x02030204, "Au1100 BE", 0, 1 },
     { 0xffffffff, 0x03030200, "Au1550 AA", 0, 1 },
     { 0xffffffff, 0x04030200, "Au1200 AB", 0, 0 },
-    { 0xffffffff, 0x04030201, "Au1200 AC", 0, 1 },
+    { 0xffffffff, 0x04030201, "Au1200 AC", 1, 0 },
     { 0x00000000, 0x00000000, "Unknown Au1xxx", 1, 0 },
 };
 
diff --git a/arch/mips/au1000/common/platform.c b/arch/mips/au1000/common/platform.c
index 48d3f54..dbb4ee7 100644
--- a/arch/mips/au1000/common/platform.c
+++ b/arch/mips/au1000/common/platform.c
@@ -20,7 +20,7 @@
 static struct resource au1xxx_usb_ohci_resources[] = {
 	[0] = {
 		.start		= USB_OHCI_BASE,
-		.end		= USB_OHCI_BASE + USB_OHCI_LEN,
+		.end		= USB_OHCI_BASE + USB_OHCI_LEN - 1,
 		.flags		= IORESOURCE_MEM,
 	},
 	[1] = {
@@ -278,9 +278,7 @@ static struct platform_device *au1xxx_pl
 	&au1100_lcd_device,
 #endif
 #ifdef CONFIG_SOC_AU1200
-#if 0	/* fixme */
 	&au1xxx_usb_ehci_device,
-#endif
 	&au1xxx_usb_gdt_device,
 	&au1xxx_usb_otg_device,
 	&au1200_lcd_device,
diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index 85dacc9..bff1258 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -9,10 +9,16 @@ menu "USB support"
 # NOTE:  SL-811 option should be board-specific ...
 config USB_ARCH_HAS_HCD
 	boolean
-	default y if USB_ARCH_HAS_OHCI
+	default y if USB_ARCH_HAS_OHCI || USB_ARCH_HAS_EHCI
 	default y if ARM				# SL-811
 	default PCI
 
+# some non-PCI hcds implement EHCI
+config USB_ARCH_HAS_EHCI
+	boolean
+	default y if SOC_AU1200
+	default PCI
+
 # many non-PCI SOC chips embed OHCI
 config USB_ARCH_HAS_OHCI
 	boolean
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index ed1899d..4a4db1a 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -6,7 +6,7 @@ comment "USB Host Controller Drivers"
 
 config USB_EHCI_HCD
 	tristate "EHCI HCD (USB 2.0) support"
-	depends on USB && PCI
+	depends on USB && USB_ARCH_HAS_EHCI
 	---help---
 	  The Enhanced Host Controller Interface (EHCI) is standard for USB 2.0
 	  "high speed" (480 Mbit/sec, 60 Mbyte/sec) host controller hardware.
diff --git a/drivers/usb/host/ehci-au1xxx.c b/drivers/usb/host/ehci-au1xxx.c
new file mode 100644
index 0000000..28faeaf
--- /dev/null
+++ b/drivers/usb/host/ehci-au1xxx.c
@@ -0,0 +1,299 @@
+/*
+ * EHCI HCD (Host Controller Driver) for USB.
+ *
+ * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net>
+ *
+ * Bus Glue for AMD Alchemy Au1xxx
+ *
+ * Based on "ohci-au1xxx.c" by Matt Porter <mporter@kernel.crashing.org>
+ *
+ * Modified for AMD Alchemy Au1200 EHC
+ *  by K.Boge <karsten.boge@amd.com>
+ *
+ * This file is licenced under the GPL.
+ */
+
+#include <linux/platform_device.h>
+#include <asm/mach-au1x00/au1000.h>
+
+#ifndef CONFIG_SOC_AU1200
+#error "Alchemy chip doesn't have EHC"
+#else   /* Au1200 */
+
+#define USB_HOST_CONFIG   (USB_MSR_BASE + USB_MSR_MCFG)
+#define USB_MCFG_PFEN     (1<<31)
+#define USB_MCFG_RDCOMB   (1<<30)
+#define USB_MCFG_SSDEN    (1<<23)
+#define USB_MCFG_PHYPLLEN (1<<19)
+#define USB_MCFG_EHCCLKEN (1<<17)
+#define USB_MCFG_UCAM     (1<<7)
+#define USB_MCFG_EBMEN    (1<<3)
+#define USB_MCFG_EMEMEN   (1<<2)
+
+#define USBH_ENABLE_CE    (USB_MCFG_PHYPLLEN | USB_MCFG_EHCCLKEN)
+#ifdef CONFIG_DMA_COHERENT
+#define USBH_ENABLE_INIT  (USBH_ENABLE_CE \
+                         | USB_MCFG_PFEN | USB_MCFG_RDCOMB \
+                         | USB_MCFG_SSDEN | USB_MCFG_UCAM \
+                         | USB_MCFG_EBMEN | USB_MCFG_EMEMEN)
+#else
+#define USBH_ENABLE_INIT  (USBH_ENABLE_CE \
+                         | USB_MCFG_PFEN | USB_MCFG_RDCOMB \
+                         | USB_MCFG_SSDEN \
+                         | USB_MCFG_EBMEN | USB_MCFG_EMEMEN)
+#endif
+#define USBH_DISABLE      (USB_MCFG_EBMEN | USB_MCFG_EMEMEN)
+
+#endif  /* Au1200 */
+
+extern int usb_disabled(void);
+
+/*-------------------------------------------------------------------------*/
+
+static void au1xxx_start_ehc(struct platform_device *dev)
+{
+	pr_debug(__FILE__ ": starting Au1xxx EHCI USB Controller\n");
+
+	/* write HW defaults again in case Yamon cleared them */
+	if (au_readl(USB_HOST_CONFIG) == 0) {
+		au_writel(0x00d02000, USB_HOST_CONFIG);
+		au_readl(USB_HOST_CONFIG);
+		udelay(1000);
+	}
+	/* enable host controller */
+	au_writel(USBH_ENABLE_CE | au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
+	au_readl(USB_HOST_CONFIG);
+	udelay(1000);
+	au_writel(USBH_ENABLE_INIT | au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
+	au_readl(USB_HOST_CONFIG);
+	udelay(1000);
+
+	pr_debug(__FILE__ ": Clock to USB host has been enabled\n");
+}
+
+static void au1xxx_stop_ehc(struct platform_device *dev)
+{
+	pr_debug(__FILE__ ": stopping Au1xxx EHCI USB Controller\n");
+
+	/* Disable mem */
+	au_writel(~USBH_DISABLE & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
+	udelay(1000);
+	/* Disable clock */
+	au_writel(~USB_MCFG_EHCCLKEN & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
+	au_readl(USB_HOST_CONFIG);
+}
+
+/*-------------------------------------------------------------------------*/
+
+/* configure so an HC device and id are always provided */
+/* always called with process context; sleeping is OK */
+
+
+/**
+ * usb_ehci_au1xxx_probe - initialize Au1xxx-based HCDs
+ * Context: !in_interrupt()
+ *
+ * Allocates basic resources for this USB host controller, and
+ * then invokes the start() method for the HCD associated with it
+ * through the hotplug entry's driver_data.
+ *
+ */
+int usb_ehci_au1xxx_probe (const struct hc_driver *driver,
+			   struct usb_hcd **hcd_out,
+			   struct platform_device *dev)
+{
+	int retval;
+	struct usb_hcd *hcd;
+        struct ehci_hcd *ehci;
+
+#if defined(CONFIG_SOC_AU1200) && defined(CONFIG_DMA_COHERENT)
+
+	/* Au1200 AB USB does not support coherent memory */
+	if (!(read_c0_prid() & 0xff)) {
+	pr_info ("Au1200 ohci: !!! This is chip revision AB                     !!!\n");
+	pr_info ("             !!! update your board or re-configure the kernel !!!\n");
+	return -ENODEV;
+	}
+#endif
+
+	au1xxx_start_ehc(dev);
+
+	if (dev->resource[1].flags != IORESOURCE_IRQ) {
+	pr_debug ("resource[1] is not IORESOURCE_IRQ");
+	retval = -ENOMEM;
+	}
+	hcd = usb_create_hcd(driver, &dev->dev, "Au1xxx");
+	if (!hcd)
+		return -ENOMEM;
+	hcd->rsrc_start = dev->resource[0].start;
+	hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1;
+
+	if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
+		pr_debug("request_mem_region failed");
+		retval = -EBUSY;
+		goto err1;
+	}
+
+	hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
+	if (!hcd->regs) {
+		pr_debug("ioremap failed");
+		retval = -ENOMEM;
+		goto err2;
+	}
+
+        ehci = hcd_to_ehci(hcd);
+        ehci->caps = hcd->regs;
+        ehci->regs = hcd->regs + HC_LENGTH(readl(&ehci->caps->hc_capbase));
+	/* cache this readonly data; minimize chip reads */
+	ehci->hcs_params = readl(&ehci->caps->hcs_params);
+
+	/* ehci_hcd_init(hcd_to_ehci(hcd)); */
+
+	retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT | SA_SHIRQ);
+	if (retval == 0)
+		return retval;
+
+	au1xxx_stop_ehc(dev);
+	iounmap(hcd->regs);
+ err2:
+	release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+ err1:
+	usb_put_hcd(hcd);
+ return retval;
+}
+
+
+/* may be called without controller electrically present */
+/* may be called with controller, bus, and devices active */
+
+/**
+ * usb_ehci_hcd_au1xxx_remove - shutdown processing for Au1xxx-based HCDs
+ * @dev: USB Host Controller being removed
+ * Context: !in_interrupt()
+ *
+ * Reverses the effect of usb_ehci_hcd_au1xxx_probe(), first invoking
+ * the HCD's stop() method.  It is always called from a thread
+ * context, normally "rmmod", "apmd", or something similar.
+ *
+ */
+void usb_ehci_au1xxx_remove (struct usb_hcd *hcd, struct platform_device *dev)
+{
+	usb_remove_hcd(hcd);
+	iounmap(hcd->regs);
+	release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+	usb_put_hcd(hcd);
+	au1xxx_stop_ehc(dev);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static const struct hc_driver ehci_au1xxx_hc_driver = {
+	.description =		hcd_name,
+	.product_desc =		"Au1xxx EHCI",
+	.hcd_priv_size =	sizeof(struct ehci_hcd),
+
+	/*
+	 * generic hardware linkage
+	 */
+	.irq =			ehci_irq,
+	.flags =		HCD_MEMORY | HCD_USB2,
+
+	/*
+	 * basic lifecycle operations
+	 */
+	.reset =		ehci_init,
+	.start =		ehci_run,
+#ifdef	CONFIG_PM
+	/* suspend:		ehci_au1xxx_suspend,  -- tbd */
+	/* resume:		ehci_au1xxx_resume,   -- tbd */
+#endif /*CONFIG_PM*/
+	.stop =			ehci_stop,
+
+	/*
+	 * managing i/o requests and associated device resources
+	 */
+	.urb_enqueue =		ehci_urb_enqueue,
+	.urb_dequeue =		ehci_urb_dequeue,
+	.endpoint_disable =	ehci_endpoint_disable,
+
+	/*
+	 * scheduling support
+	 */
+	.get_frame_number =	ehci_get_frame,
+
+	/*
+	 * root hub support
+	 */
+	.hub_status_data =	ehci_hub_status_data,
+	.hub_control =		ehci_hub_control,
+#ifdef	CONFIG_USB_SUSPEND
+	.hub_suspend =		ehci_hub_suspend,
+	.hub_resume =		ehci_hub_resume,
+#endif
+};
+
+/*-------------------------------------------------------------------------*/
+
+static int ehci_hcd_au1xxx_drv_probe(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct usb_hcd *hcd = NULL;
+	int ret;
+
+	pr_debug ("In ehci_hcd_au1xxx_drv_probe\n");
+
+	if (usb_disabled())
+		return -ENODEV;
+
+	ret = usb_ehci_au1xxx_probe(&ehci_au1xxx_hc_driver, &hcd, pdev);
+	return ret;
+}
+
+static int ehci_hcd_au1xxx_drv_remove(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct usb_hcd *hcd = dev_get_drvdata(dev);
+
+	usb_ehci_au1xxx_remove(hcd, pdev);
+	return 0;
+}
+	/*TBD*/
+/*static int ehci_hcd_au1xxx_drv_suspend(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct usb_hcd *hcd = dev_get_drvdata(dev);
+
+	return 0;
+}
+static int ehci_hcd_au1xxx_drv_resume(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct usb_hcd *hcd = dev_get_drvdata(dev);
+
+	return 0;
+}
+*/
+
+static struct device_driver ehci_hcd_au1xxx_driver = {
+	.name		= "au1xxx-ehci",
+	.bus		= &platform_bus_type,
+	.probe		= ehci_hcd_au1xxx_drv_probe,
+	.remove		= ehci_hcd_au1xxx_drv_remove,
+	/*.suspend	= ehci_hcd_au1xxx_drv_suspend, */
+	/*.resume	= ehci_hcd_au1xxx_drv_resume, */
+};
+
+static int __init ehci_hcd_au1xxx_init (void)
+{
+	pr_debug (DRIVER_INFO " (Au1xxx)\n");
+
+	return driver_register(&ehci_hcd_au1xxx_driver);
+}
+
+static void __exit ehci_hcd_au1xxx_cleanup (void)
+{
+	driver_unregister(&ehci_hcd_au1xxx_driver);
+}
+
+module_init (ehci_hcd_au1xxx_init);
+module_exit (ehci_hcd_au1xxx_cleanup);
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 29f52a4..30833fe 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -894,10 +894,10 @@ MODULE_DESCRIPTION (DRIVER_INFO);
 MODULE_AUTHOR (DRIVER_AUTHOR);
 MODULE_LICENSE ("GPL");
 
-#ifdef CONFIG_PCI
+#if defined(CONFIG_SOC_AU1X00)
+#include "ehci-au1xxx.c"
+#elif defined(CONFIG_PCI)
 #include "ehci-pci.c"
-#endif
-
-#if !defined(CONFIG_PCI)
+#else
 #error "missing bus glue for ehci-hcd"
 #endif
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c
index 486202d..56c488e 100644
--- a/drivers/usb/host/ohci-au1xxx.c
+++ b/drivers/usb/host/ohci-au1xxx.c
@@ -19,9 +19,10 @@
  */
 
 #include <linux/platform_device.h>
-
 #include <asm/mach-au1x00/au1000.h>
 
+#ifndef CONFIG_SOC_AU1200
+
 #define USBH_ENABLE_BE (1<<0)
 #define USBH_ENABLE_C  (1<<1)
 #define USBH_ENABLE_E  (1<<2)
@@ -36,16 +37,46 @@
 #error not byte order defined
 #endif
 
+#else   /* Au1200 */
+
+#define USB_HOST_CONFIG    (USB_MSR_BASE + USB_MSR_MCFG)
+#define USB_MCFG_PFEN     (1<<31)
+#define USB_MCFG_RDCOMB   (1<<30)
+#define USB_MCFG_SSDEN    (1<<23)
+#define USB_MCFG_OHCCLKEN (1<<16)
+#define USB_MCFG_UCAM     (1<<7)
+#define USB_MCFG_OBMEN    (1<<1)
+#define USB_MCFG_OMEMEN   (1<<0)
+
+#define USBH_ENABLE_CE    USB_MCFG_OHCCLKEN
+#ifdef CONFIG_DMA_COHERENT
+#define USBH_ENABLE_INIT  (USB_MCFG_OHCCLKEN \
+                         | USB_MCFG_PFEN | USB_MCFG_RDCOMB \
+                         | USB_MCFG_SSDEN | USB_MCFG_UCAM \
+                         | USB_MCFG_OBMEN | USB_MCFG_OMEMEN)
+#else
+#define USBH_ENABLE_INIT  (USB_MCFG_OHCCLKEN \
+                         | USB_MCFG_PFEN | USB_MCFG_RDCOMB \
+                         | USB_MCFG_SSDEN \
+                         | USB_MCFG_OBMEN | USB_MCFG_OMEMEN)
+#endif
+#define USBH_DISABLE      (USB_MCFG_OBMEN | USB_MCFG_OMEMEN)
+
+#endif  /* Au1200 */
+
 extern int usb_disabled(void);
 
 /*-------------------------------------------------------------------------*/
 
-static void au1xxx_start_hc(struct platform_device *dev)
+static void au1xxx_start_ohc(struct platform_device *dev)
 {
 	printk(KERN_DEBUG __FILE__
 		": starting Au1xxx OHCI USB Controller\n");
 
 	/* enable host controller */
+	
+#ifndef CONFIG_SOC_AU1200
+
 	au_writel(USBH_ENABLE_CE, USB_HOST_CONFIG);
 	udelay(1000);
 	au_writel(USBH_ENABLE_INIT, USB_HOST_CONFIG);
@@ -56,17 +87,46 @@ static void au1xxx_start_hc(struct platf
 		!(au_readl(USB_HOST_CONFIG) & USBH_ENABLE_RD))
 		udelay(1000);
 
+#else   /* Au1200 */
+
+	/* write HW defaults again in case Yamon cleared them */
+	if (au_readl(USB_HOST_CONFIG) == 0) {
+	au_writel(0x00d02000, USB_HOST_CONFIG);
+	au_readl(USB_HOST_CONFIG);
+	udelay(1000);
+	}
+	au_writel(USBH_ENABLE_CE | au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
+	au_readl(USB_HOST_CONFIG);
+	udelay(1000);
+	au_writel(USBH_ENABLE_INIT | au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
+	au_readl(USB_HOST_CONFIG);
+	udelay(1000);
+
+#endif  /* Au1200 */
+
 	printk(KERN_DEBUG __FILE__
 	": Clock to USB host has been enabled \n");
 }
 
-static void au1xxx_stop_hc(struct platform_device *dev)
+static void au1xxx_stop_ohc(struct platform_device *dev)
 {
 	printk(KERN_DEBUG __FILE__
 	       ": stopping Au1xxx OHCI USB Controller\n");
 
+#ifndef CONFIG_SOC_AU1200
+
 	/* Disable clock */
 	au_writel(readl((void *)USB_HOST_CONFIG) & ~USBH_ENABLE_CE, USB_HOST_CONFIG);
+
+#else   /* Au1200 */
+
+	/* Disable mem */
+	au_writel(~USBH_DISABLE & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
+	udelay(1000);
+	/* Disable clock */
+	au_writel(~USBH_ENABLE_CE & au_readl(USB_HOST_CONFIG), USB_HOST_CONFIG);
+	au_readl(USB_HOST_CONFIG);
+#endif  /* Au1200 */
 }
 
 
@@ -85,14 +145,24 @@ static void au1xxx_stop_hc(struct platfo
  * through the hotplug entry's driver_data.
  *
  */
-int usb_hcd_au1xxx_probe (const struct hc_driver *driver,
+int usb_ohci_au1xxx_probe (const struct hc_driver *driver,
 			  struct platform_device *dev)
 {
 	int retval;
 	struct usb_hcd *hcd;
 
+#if defined(CONFIG_SOC_AU1200) && defined(CONFIG_DMA_COHERENT)
+
+	/* Au1200 AB USB does not support coherent memory */
+	if (!(read_c0_prid() & 0xff)) {
+	pr_info ("Au1200 ohci: !!! This is chip revision AB                     !!!\n");
+	pr_info ("             !!! update your board or re-configure the kernel !!!\n");
+	return -ENODEV;
+	}
+#endif
+
 	if (dev->resource[1].flags != IORESOURCE_IRQ) {
-		pr_debug ("resource[1] is not IORESOURCE_IRQ");
+		pr_debug ("resource[1] is not IORESOURCE_IRQ\n");
 		retval = -ENOMEM;
 	}
 
@@ -103,26 +173,26 @@ int usb_hcd_au1xxx_probe (const struct h
 	hcd->rsrc_len = dev->resource[0].end - dev->resource[0].start + 1;
 
 	if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
-		pr_debug("request_mem_region failed");
+		pr_debug("request_mem_region failed\n");
 		retval = -EBUSY;
 		goto err1;
 	}
 
 	hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
 	if (!hcd->regs) {
-		pr_debug("ioremap failed");
+		pr_debug("ioremap failed\n");
 		retval = -ENOMEM;
 		goto err2;
 	}
 
-	au1xxx_start_hc(dev);
+	au1xxx_start_ohc(dev);
 	ohci_hcd_init(hcd_to_ohci(hcd));
 
-	retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT);
+	retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT | SA_SHIRQ);
 	if (retval == 0)
 		return retval;
 
-	au1xxx_stop_hc(dev);
+	au1xxx_stop_ohc(dev);
 	iounmap(hcd->regs);
  err2:
 	release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
@@ -145,10 +215,10 @@ int usb_hcd_au1xxx_probe (const struct h
  * context, normally "rmmod", "apmd", or something similar.
  *
  */
-void usb_hcd_au1xxx_remove (struct usb_hcd *hcd, struct platform_device *dev)
+void usb_ohci_au1xxx_remove (struct usb_hcd *hcd, struct platform_device *dev)
 {
 	usb_remove_hcd(hcd);
-	au1xxx_stop_hc(dev);
+	au1xxx_stop_ohc(dev);
 	iounmap(hcd->regs);
 	release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
 	usb_put_hcd(hcd);
@@ -216,9 +286,9 @@ static const struct hc_driver ohci_au1xx
 	 */
 	.hub_status_data =	ohci_hub_status_data,
 	.hub_control =		ohci_hub_control,
-#ifdef	CONFIG_PM
-	.bus_suspend =		ohci_bus_suspend,
-	.bus_resume =		ohci_bus_resume,
+#ifdef	CONFIG_USB_SUSPEND
+	.hub_suspend =		ohci_hub_suspend,
+	.hub_resume =		ohci_hub_resume,
 #endif
 	.start_port_reset =	ohci_start_port_reset,
 };
@@ -234,7 +304,7 @@ static int ohci_hcd_au1xxx_drv_probe(str
 	if (usb_disabled())
 		return -ENODEV;
 
-	ret = usb_hcd_au1xxx_probe(&ohci_au1xxx_hc_driver, pdev);
+	ret = usb_ohci_au1xxx_probe(&ohci_au1xxx_hc_driver, pdev);
 	return ret;
 }
 
@@ -242,7 +312,7 @@ static int ohci_hcd_au1xxx_drv_remove(st
 {
 	struct usb_hcd *hcd = platform_get_drvdata(pdev);
 
-	usb_hcd_au1xxx_remove(hcd, pdev);
+	usb_ohci_au1xxx_remove(hcd, pdev);
 	return 0;
 }
 	/*TBD*/
@@ -287,3 +357,4 @@ static void __exit ohci_hcd_au1xxx_clean
 
 module_init (ohci_hcd_au1xxx_init);
 module_exit (ohci_hcd_au1xxx_cleanup);
+
diff --git a/include/asm-mips/mach-mips/cpu-feature-overrides.h b/include/asm-mips/mach-mips/cpu-feature-overrides.h
index 9f92aed..e06af6c 100644
--- a/include/asm-mips/mach-mips/cpu-feature-overrides.h
+++ b/include/asm-mips/mach-mips/cpu-feature-overrides.h
@@ -29,7 +29,11 @@
 /* #define cpu_has_prefetch	? */
 #define cpu_has_mcheck		1
 /* #define cpu_has_ejtag	? */
+#ifdef CONFIG_CPU_HAS_LLSC
 #define cpu_has_llsc		1
+#else
+#define cpu_has_llsc		0
+#endif
 /* #define cpu_has_vtag_icache	? */
 /* #define cpu_has_dc_aliases	? */
 /* #define cpu_has_ic_fills_f_dc ? */

--LyciRD1jyfeSSjG0--


From bunk@stusta.de Sun Jan 15 18:45:27 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:45:53 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:39307 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133578AbWAOSp1 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 18:45:27 +0000
Received: from mailout.stusta.mhn.de ([IPv6:::ffff:141.84.69.5]:3602 "HELO
	mailout.stusta.mhn.de") by linux-mips.net with SMTP
	id <S875130AbWANBfq>; Sat, 14 Jan 2006 02:35:46 +0100
Received: (qmail 4174 invoked from network); 14 Jan 2006 01:34:40 -0000
Received: from r063144.stusta.swh.mhn.de (10.150.63.144)
  by mailout.stusta.mhn.de with SMTP; 14 Jan 2006 01:34:40 -0000
Received: by r063144.stusta.swh.mhn.de (Postfix, from userid 1000)
	id 7CD0319F917; Sat, 14 Jan 2006 02:34:41 +0100 (CET)
Date:	Sat, 14 Jan 2006 02:34:41 +0100
From:	Adrian Bunk <bunk@stusta.de>
To:	Andrew Morton <akpm@osdl.org>
Cc:	Ralf Baechle <ralf@linux-mips.org>,
	Domen Puncer <domen@coderock.org>, linux-mips@linux-mips.org,
	linux-kernel@vger.kernel.org, davem@davemloft.net
Subject: [2.6 patch] Remove arch/mips/arc/salone.c
Message-ID: <20060114013440.GV29663@stusta.de>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.11
Return-Path: <bunk@stusta.de>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9874
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: bunk@stusta.de
Precedence: bulk
X-list: linux-mips
Content-Length: 1792
Lines: 61

From: Domen Puncer <domen@coderock.org>

ArcLoad(), ArcInvoke(), ArcExecute() aren't used.

Signed-off-by: Domen Puncer <domen@coderock.org>
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Adrian Bunk <bunk@stusta.de>

---

This patch was already sent on:
- 5 Jan 2006

This patch was sent by Alexey Dobriyan on:
- 8 Nov 2005

 arch/mips/arc/Makefile |    2 +-
 arch/mips/arc/salone.c |   25 -------------------------
 2 files changed, 1 insertion(+), 26 deletions(-)

--- linux-kj.orig/arch/mips/arc/Makefile	2005-11-08 20:46:24.000000000 +0300
+++ linux-kj/arch/mips/arc/Makefile	2005-11-08 20:47:36.000000000 +0300
@@ -3,7 +3,7 @@
 #
 
 lib-y				+= cmdline.o env.o file.o identify.o init.o \
-				   misc.o salone.o time.o tree.o
+				   misc.o time.o tree.o
 
 lib-$(CONFIG_ARC_MEMORY)	+= memory.o
 lib-$(CONFIG_ARC_CONSOLE)	+= arc_con.o
Index: linux-kj/arch/mips/arc/salone.c
===================================================================
--- linux-kj.orig/arch/mips/arc/salone.c	2005-11-08 20:46:24.000000000 +0300
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,24 +0,0 @@
-/*
- * Routines to load into memory and execute stand-along program images using
- * ARCS PROM firmware.
- *
- * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
- */
-#include <linux/init.h>
-#include <asm/sgialib.h>
-
-LONG __init ArcLoad(CHAR *Path, ULONG TopAddr, ULONG *ExecAddr, ULONG *LowAddr)
-{
-	return ARC_CALL4(load, Path, TopAddr, ExecAddr, LowAddr);
-}
-
-LONG __init ArcInvoke(ULONG ExecAddr, ULONG StackAddr, ULONG Argc, CHAR *Argv[],
-	CHAR *Envp[])
-{
-	return ARC_CALL5(invoke, ExecAddr, StackAddr, Argc, Argv, Envp);
-}
-
-LONG __init ArcExecute(CHAR *Path, LONG Argc, CHAR *Argv[], CHAR *Envp[])
-{
-	return ARC_CALL4(exec, Path, Argc, Argv, Envp);
-}


From p_christ@hol.gr Sun Jan 15 18:48:17 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:48:47 +0000 (GMT)
Received: from [62.38.115.213] ([62.38.115.213]:12165 "EHLO pfn3.pefnos")
	by ftp.linux-mips.org with ESMTP id S8126537AbWAOSsB (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Sun, 15 Jan 2006 18:48:01 +0000
Received: from xorhgos2.pefnos (xorhgos2.pefnos [192.168.0.3])
	by pfn3.pefnos (Postfix) with ESMTP id 643501F31B;
	Sun, 15 Jan 2006 20:51:15 +0200 (EET)
From:	"P. Christeas" <p_christ@hol.gr>
To:	Ivan Korzakow <ivan.korzakow@gmail.com>
Subject: Re: How to apply 2.6.15-git7 patchset ?
Date:	Sun, 15 Jan 2006 20:50:57 +0200
User-Agent: KMail/1.9
Cc:	linux-mips@linux-mips.org
References: <a59861030601130120y3456b6dat@mail.gmail.com>
In-Reply-To: <a59861030601130120y3456b6dat@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200601152050.59057.p_christ@hol.gr>
Return-Path: <p_christ@hol.gr>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9875
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: p_christ@hol.gr
Precedence: bulk
X-list: linux-mips
Content-Length: 425
Lines: 13

On Friday 13 January 2006 11:20 am, Ivan Korzakow wrote:
> Hi
>
> Could anybody tell me why I can't apply cleanly the
> "patch-2.6.15-git7.bz2" patchset on a mips repository ? Of course I
> tried to apply this patch on a 2.6.15 tree...
> Actually only mips files failed to be patched.
>
If it's only one file, you could resolve it manually.
It is common that, if you apply Linus' patch to a MIPS tree, sth may fail.


> Ivan

From drow@nevyn.them.org Sun Jan 15 18:57:33 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 18:57:54 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:5516 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133455AbWAOS5c (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 18:57:32 +0000
Received: from nevyn.them.org ([IPv6:::ffff:66.93.172.17]:9962 "EHLO
	nevyn.them.org") by linux-mips.net with ESMTP id <S876298AbWANViF>;
	Sat, 14 Jan 2006 22:38:05 +0100
Received: from drow by nevyn.them.org with local (Exim 4.54)
	id 1Ext2x-0005Xo-MM; Sat, 14 Jan 2006 16:34:51 -0500
Date:	Sat, 14 Jan 2006 16:34:51 -0500
From:	Daniel Jacobowitz <dan@debian.org>
To:	Alex Gonzalez <langabe@gmail.com>
Cc:	linux-mips <linux-mips@linux-mips.org>
Subject: Re: Compiling a non-pic glibc
Message-ID: <20060114213451.GA21268@nevyn.them.org>
References: <c58a7a270601120218r77ec0d8drf2d14663138a13c2@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <c58a7a270601120218r77ec0d8drf2d14663138a13c2@mail.gmail.com>
User-Agent: Mutt/1.5.8i
Return-Path: <drow@nevyn.them.org>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9876
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: dan@debian.org
Precedence: bulk
X-list: linux-mips
Content-Length: 417
Lines: 13

On Thu, Jan 12, 2006 at 10:18:03AM +0000, Alex Gonzalez wrote:
> Hi,
> 
> What is the correct way of cross-compiling a non-pic static glibc?

You can't.  MIPS/Linux userspace toolchains only support PIC out of the
box; if you want to mess around with non-PIC toolchains expect to have
to hack glibc (and possibly other places).  In this case it looks like
GCC's CRT files are PIC.

-- 
Daniel Jacobowitz
CodeSourcery

From zzh.hust@gmail.com Sun Jan 15 19:00:29 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 19:00:53 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:14988 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133595AbWAOTAA (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 19:00:00 +0000
Received: from wproxy.gmail.com ([IPv6:::ffff:64.233.184.199]:3576 "EHLO
	wproxy.gmail.com") by linux-mips.net with ESMTP id <S876567AbWAOEY2> convert rfc822-to-8bit;
	Sun, 15 Jan 2006 05:24:28 +0100
Received: by wproxy.gmail.com with SMTP id 36so966233wra
        for <linux-mips@linux-mips.org>; Sat, 14 Jan 2006 20:22:23 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=bd1lOwud8+TYXsa+osp5z3Vfi44BaaJ3/gRqr5YugrCrILhL2yDFleRxJrYsu3lYLwnX/SEdM1lQVJnjc71WoJKVrHMAjHQ9zdSg0opXVWZ2pI414DlrRRDnIL0c318V8HpY9lL0J58CRkycUEvmj5yTjUKaGJYoQaPIESCFlTs=
Received: by 10.54.136.13 with SMTP id j13mr6987843wrd;
        Sat, 14 Jan 2006 20:22:23 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Sat, 14 Jan 2006 20:22:23 -0800 (PST)
Message-ID: <50c9a2250601142022k6e4a855r6fc0274e4cfb8369@mail.gmail.com>
Date:	Sun, 15 Jan 2006 12:22:23 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	linux-mips <linux-mips@linux-mips.org>
Subject: how to emdedded ramdisk.gz in vmlinux for linux-2.6.14?
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9877
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 274
Lines: 11

I download the kernel from linux-mips, and select to embedded
ramdisk.gz into vmlinux.
but  i can't find where to place the ramdisk.gz.
I try to put ramdisk.gz  under top dir, or arch/mips/boot/, but it
does not work.
 can someone give any hints?


Best regards

zhuzhenhua

From tpoynor@mvista.com Sun Jan 15 19:15:03 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Sun, 15 Jan 2006 19:15:37 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:49036 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8133443AbWAOTPD (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Sun, 15 Jan 2006 19:15:03 +0000
Received: from gateway-1237.mvista.com ([IPv6:::ffff:12.44.186.158]:47352 "EHLO
	hermes.mvista.com") by linux-mips.net with ESMTP id <S871174AbWALSYM>;
	Thu, 12 Jan 2006 19:24:12 +0100
Received: from [10.0.10.193] (slurryseal.ddns.mvista.com [10.0.10.193])
	by hermes.mvista.com (Postfix) with ESMTP
	id 14FAB1AD12; Thu, 12 Jan 2006 10:23:33 -0800 (PST)
Message-ID: <43C69EC2.2070601@mvista.com>
Date:	Thu, 12 Jan 2006 10:24:02 -0800
From:	Todd Poynor <tpoynor@mvista.com>
User-Agent: Thunderbird 1.5 (X11/20051201)
MIME-Version: 1.0
To:	"Vladimir A. Barinov" <vbarinov@ru.mvista.com>
Cc:	linux-mtd@lists.infradead.org, linux-mips@linux-mips.org
Subject: Re: [PATCH] PNX8550 NAND flash driver
References: <43A2F819.1040106@ru.mvista.com>
In-Reply-To: <43A2F819.1040106@ru.mvista.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Return-Path: <tpoynor@mvista.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9878
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tpoynor@mvista.com
Precedence: bulk
X-list: linux-mips
Content-Length: 25655
Lines: 834

Vladimir A. Barinov wrote:
> Hi All,
> 
> Attached patch is NAND flash driver for PNX8550 based platforms.
> Any comments and suggestions are highly appreciated.
> 
> Vladimir
> 
> 
> ------------------------------------------------------------------------
> 
> Signed-off-by: vbarinov@ru.mvista.com
> 
>  drivers/mtd/nand/Kconfig   |    6 
>  drivers/mtd/nand/Makefile  |    1 
>  drivers/mtd/nand/pnx8550.c |  747 +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 754 insertions(+)
> 
> Index: linux-2.6.15_0/drivers/mtd/nand/Kconfig
> ===================================================================
> --- linux-2.6.15_0.orig/drivers/mtd/nand/Kconfig
> +++ linux-2.6.15_0/drivers/mtd/nand/Kconfig
> @@ -90,6 +90,12 @@ config MTD_NAND_S3C2410
>  	  No board specfic support is done by this driver, each board
>  	  must advertise a platform_device for the driver to attach.
>  
> +config MTD_NAND_PNX8550
> +	tristate "NAND Flash support for PNX8550"
> +	depends on PNX8550 && MTD_NAND
> +	help
> +	  This enables the NAND flash controller on the PNX8550.
> +
>  config MTD_NAND_S3C2410_DEBUG
>  	bool "S3C2410 NAND driver debug"
>  	depends on MTD_NAND_S3C2410
> Index: linux-2.6.15_0/drivers/mtd/nand/pnx8550.c
> ===================================================================
> --- /dev/null
> +++ linux-2.6.15_0/drivers/mtd/nand/pnx8550.c
> @@ -0,0 +1,747 @@
> +/*
> + * Copyright (C) 2005 Koninklijke Philips Electronics N.V.
> + * All Rights Reserved.
> + *
> + * Based on: drivers/mtd/nand/pnx8550.c by Torbjorn Lundberg
> + * $Id: pnx8550_nand.c,v 1.8 2004/11/12 10:46:58 tobbe Exp $
> + *
> + * 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.
> + * 
> + * Overview:
> + *   This is a device driver for the NAND flash device found on the
> + *   PNX8550 board which utilizes the Samsung K9F5616U0C part. This is
> + *   a 32MByte (16M x 16 bits) NAND flash device.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/init.h>
> +#include <linux/slab.h>
> +#include <linux/module.h>
> +#include <linux/delay.h>
> +#include <linux/errno.h>
> +#include <linux/sched.h>
> +#include <linux/string.h>
> +#include <linux/types.h>
> +#include <linux/mtd/mtd.h>
> +#include <linux/mtd/nand.h>
> +#include <linux/mtd/nand_ecc.h>
> +#include <linux/mtd/compatmac.h>
> +#include <linux/interrupt.h>
> +#include <linux/mtd/partitions.h>
> +#include <asm/io.h>
> +#include <asm/mach-pnx8550/nand.h>
> +
> +#define UBTM_NAME                 "microBTM"
> +#define UBTM_BLOCK_START         ( 0x00000000)
> +#define UBTM_BLOCK_END           ( 0x00004000)	/* 16K size, first block */
> +#define UBTM_SIZE                ( UBTM_BLOCK_END - UBTM_BLOCK_START)
> +
> +#define BOOTLOADER_NAME           "bootloader"
> +#define BOOTLOADER_BLOCK_START   ( UBTM_BLOCK_END)
> +#define BOOTLOADER_BLOCK_END     ( 0x00040000)	/* 256K -  16K = 240K    */
> +#define BOOTLOADER_SIZE          ( BOOTLOADER_BLOCK_END - BOOTLOADER_BLOCK_START)
> +
> +#define ROMFS_SYS_NAME            "ROMFS-Tools"
> +#define ROMFS_SYS_BLOCK_START    ( BOOTLOADER_BLOCK_END)
> +#define ROMFS_SYS_BLOCK_END      ( 0x00600000)	/*   6M - 256K = 5.75M   */
> +#define ROMFS_SYS_SIZE           ( ROMFS_SYS_BLOCK_END - ROMFS_SYS_BLOCK_START)
> +
> +#define ROMFS_APP_NAME            "ROMFS-User"
> +#define ROMFS_APP_BLOCK_START    ( ROMFS_SYS_BLOCK_END)
> +#define ROMFS_APP_BLOCK_END      ( 0x01000000)	/*  16M -   6M = 10M     */
> +#define ROMFS_APP_SIZE           ( ROMFS_APP_BLOCK_END - ROMFS_APP_BLOCK_START)
> +
> +#define USER_NAME                 "User"
> +#define USER_BLOCK_START         ( ROMFS_APP_BLOCK_END)
> +#define USER_BLOCK_END           ( 0x02000000)	/*  32M -  16M = 16M     */
> +#define USER_SIZE                ( USER_BLOCK_END - USER_BLOCK_START)
> +
> +#define NAND_ADDR(_col, _page) ((_col) & (mtd->oobblock - 1)) + ((_page) << this->page_shift)
> +
> +#define NAND_ADDR_SEND(_addr) pNandAddr[(_addr)/sizeof(u16)] = 0
> +
> +#define NAND_TRANSFER_TO(_addr, _buffer, _bytes) pnx8550_nand_transfer((_buffer), ((u8*)pNandAddr) + (_addr), (_bytes), 1)
> +
> +#define NAND_TRANSFER_FROM(_addr, _buffer, _bytes) pnx8550_nand_transfer(((u8*)pNandAddr) + (_addr), (_buffer), (_bytes), 0)
> +
> +static void pnx8550_nand_register_setup(u_char cmd_no, u_char addr_no,
> +					u_char include_data, u_char monitor_ACK,
> +					u_char enable64M, int cmd_a, int cmd_b);
> +
> +static inline void pnx8550_nand_wait_for_dev_ready(void);
> +
> +static void pnx8550_nand_transfer(void *from, void *to, int bytes, int toxio);
> +
> +static void pnx8550_nand_transferDMA(void *from, void *to, int bytes,
> +				     int toxio);
> +
> +/*
> + * Define partitions for flash device
> + */
> +#define NUM_PARTITIONS 5
> +const static struct mtd_partition partition_info[NUM_PARTITIONS] = {
> +	{
> +	 .name = UBTM_NAME,
> +	 .offset = UBTM_BLOCK_START,
> +	 .size = UBTM_SIZE},
> +	{
> +	 .name = BOOTLOADER_NAME,
> +	 .offset = BOOTLOADER_BLOCK_START,
> +	 .size = BOOTLOADER_SIZE},
> +	{
> +	 .name = ROMFS_SYS_NAME,
> +	 .offset = ROMFS_SYS_BLOCK_START,
> +	 .size = ROMFS_SYS_SIZE},
> +	{
> +	 .name = ROMFS_APP_NAME,
> +	 .offset = ROMFS_APP_BLOCK_START,
> +	 .size = ROMFS_APP_SIZE},
> +	{
> +	 .name = USER_NAME,
> +	 .offset = USER_BLOCK_START,
> +	 .size = USER_SIZE}
> +};
> +
> +/* Bad block descriptor for 16Bit nand flash */
> +static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
> +static struct nand_bbt_descr nand16bit_memorybased = {
> +	.options = 0,
> +	.offs = 0,
> +	.len = 2,
> +	.pattern = scan_ff_pattern
> +};
> +
> +/* OOB Placement information that lines up with the boot loader code */
> +static struct nand_oobinfo nand16bit_oob_16 = {
> +	.useecc = MTD_NANDECC_AUTOPLACE,
> +	.eccbytes = 6,
> +	.eccpos = {2, 3, 4, 5, 6, 7},
> +	.oobfree = {{8, 8}}
> +};
> +
> +/* Pointer into XIO for access to the 16Bit NAND flash device */
> +static volatile u16 *pNandAddr;
> +
> +/* Last command sent to the pnx8550_nand_command function */
> +static int last_command = -1;
> +/*
> +  Next column address to read/write, set by pnx8550_nand_command
> +  updated by the read/write functions
> +*/
> +static int last_col_addr = -1;
> +/*
> +  Next page address to read/write, set by pnx8550_nand_command
> +  updated by the read/write functions
> +*/
> +static int last_page_addr = -1;
> +
> +/*
> +    32bit Aligned/DMA buffer
> +*/
> +static u_char *transferBuffer = NULL;
> +
> +static struct mtd_info pnx8550_mtd;
> +static struct nand_chip pnx8550_nand;
> +
> +/**
> + * Transfer data to/from the NAND chip.
> + * This function decides whether to use DMA or not depending on
> + * the amount of data to transfer and the alignment of the buffers.
> + *
> + * @from:  Address to transfer data from
> + * @to:    Address to transfer the data to
> + * @bytes: Number of bytes to transfer
> + * @toxio: Whether the transfer is going to XIO or not.
> + */
> +static void pnx8550_nand_transfer(void *from, void *to, int bytes, int toxio)
> +{
> +	u16 *from16 = (u16 *) from;
> +	u16 *to16 = (u16 *) to;
> +
> +	int i;
> +
> +	if ((u32) from & 3) {
> +		printk
> +		    ("%s: from buffer not 32bit aligned, will not use fastest transfer mechanism\n",
> +		     __FUNCTION__);
> +	}
> +	if ((u32) to & 3) {
> +		printk
> +		    ("%s: to buffer not 32bit aligned, will not use fastest transfer mechanism\n",
> +		     __FUNCTION__);

Those printks could get old pretty fast.  Debugging info, not needed for 
normal operation.

> +	}
> +
> +	if (((bytes & 3) || (bytes < 16)) || ((u32) to & 3) || ((u32) from & 3)) {
> +		if (((bytes & 1) == 0) &&
> +		    (((u32) to & 1) == 0) && (((u32) from & 1) == 0)) {
> +			int words = bytes / 2;
> +
> +			local_irq_disable();
> +			for (i = 0; i < words; i++) {
> +				to16[i] = from16[i];
> +			}
> +			local_irq_enable();

Really necessary to disable all irqs around this transfer?  How long can 
interrupts be off during that time?

> +		} else {
> +			printk
> +			    ("%s: Transfer failed, byte-aligned transfers no allowed!\n",

"non-word-aligned"?

> +			     __FUNCTION__);
> +		}
> +	} else {
> +		pnx8550_nand_transferDMA(from, to, bytes, toxio);
> +	}
> +}
> +
> +/**
> + * Transfer data to/from the NAND chip using DMA
> + *
> + * @from:  Address to transfer data from
> + * @to:    Address to transfer the data to
> + * @bytes: Number of bytes to transfer
> + * @toxio: Whether the transfer is going to XIO or not.
> + */
> +static void pnx8550_nand_transferDMA(void *from, void *to, int bytes, int toxio)
> +{
> +	int cmd = 0;
> +	u32 internal;
> +	u32 external;
> +
> +	if (toxio) {
> +		cmd = PNX8550_DMA_CTRL_PCI_CMD_WRITE;
> +		dma_cache_wback(from, bytes);
> +		internal = (u32) virt_to_phys(from);
> +		external = (u32) to - KSEG1;
> +	} else {
> +		cmd = PNX8550_DMA_CTRL_PCI_CMD_READ;
> +		internal = (u32) virt_to_phys(to);
> +		external = (u32) from - KSEG1;
> +	}
> +
> +	local_irq_disable();
> +	PNX8550_DMA_TRANS_SIZE = bytes >> 2;	/* Length in words */
> +	PNX8550_DMA_EXT_ADDR = external;
> +	PNX8550_DMA_INT_ADDR = internal;
> +	PNX8550_DMA_INT_CLEAR = 0xffff;
> +	PNX8550_DMA_CTRL = PNX8550_DMA_CTRL_BURST_512 |
> +	    PNX8550_DMA_CTRL_SND2XIO | PNX8550_DMA_CTRL_INIT_DMA | cmd;
> +
> +	while ((PNX8550_DMA_INT_STATUS & PNX8550_DMA_INT_COMPL) == 0) ;
> +
> +	if (!toxio) {
> +		dma_cache_inv(to, bytes);
> +	}
> +	local_irq_enable();

Again, necessary to prevent interrupts?
> +}
> +
> +/**
> + * pnx8550_nand_read_byte - read one byte endianess aware from the chip
> + * @mtd:	MTD device structure
> + *
> + */
> +static u_char pnx8550_nand_read_byte(struct mtd_info *mtd)
> +{
> +	struct nand_chip *this = mtd->priv;
> +	u16 data = 0;
> +	int addr = NAND_ADDR(last_col_addr, last_page_addr);
> +	/*
> +	   Read ID is a special case as we have to read BOTH bytes at the same
> +	   time otherwise it doesn't work, once we have both bytes we work out
> +	   which one we want.
> +	 */
> +	if (last_command == NAND_CMD_READID) {
> +		u32 *pNandAddr32 = (u32 *) pNandAddr;
> +		u32 data32;
> +		data32 = cpu_to_le32(pNandAddr32[0]);
> +		if (last_col_addr) {
> +			data = (u16) (data32 >> 16);
> +		} else {
> +			data = (u16) data32;
> +		}
> +	} else {
> +		data = cpu_to_le16(pNandAddr[(addr / sizeof(u16))]);
> +		if ((addr & 0x1) == 1) {
> +			data = (data & 0xff00) >> 16;
> +		}
> +	}
> +	/*
> +	   Status is a special case, we don't need to increment the address
> +	   because the address isn't used by the chip
> +	 */
> +	if (last_command != NAND_CMD_STATUS) {
> +		last_col_addr++;
> +	}
> +	return data & 0xff;
> +}
> +
> +/**
> + * pnx8550_nand_read_word - read one word from the chip
> + * @mtd:	MTD device structure
> + *
> + * Read function for 16bit buswith without
> + * endianess conversion
> + */
> +static u16 pnx8550_nand_read_word(struct mtd_info *mtd)
> +{
> +	struct nand_chip *this = mtd->priv;
> +	int addr = NAND_ADDR(last_col_addr, last_page_addr);
> +	u16 data = pNandAddr[(addr / sizeof(u16))];
> +	return data;
> +}
> +
> +/**
> + * pnx8550_nand_write_byte - write one byte endianess aware to the chip
> + * @mtd:	MTD device structure
> + * @byte:	pointer to data byte to write
> + *
> + * Write function for 16bit buswith with
> + * endianess conversion
> + */
> +static void pnx8550_nand_write_byte(struct mtd_info *mtd, u_char byte)
> +{
> +	struct nand_chip *this = mtd->priv;
> +	int addr = NAND_ADDR(last_col_addr, last_page_addr);
> +	pNandAddr[(addr / sizeof(u16))] = le16_to_cpu((u16) byte);
> +}
> +
> +/**
> + * pnx8550_nand_write_word - write one word to the chip
> + * @mtd:	MTD device structure
> + * @word:	data word to write
> + *
> + * Write function for 16bit buswith without
> + * endianess conversion
> + */
> +static void pnx8550_nand_write_word(struct mtd_info *mtd, u16 word)
> +{
> +	struct nand_chip *this = mtd->priv;
> +	int addr = NAND_ADDR(last_col_addr, last_page_addr);
> +	pNandAddr[(addr / sizeof(u16))] = word;
> +}
> +
> +/**
> + * pnx8550_nand_write_buf - write buffer to chip
> + * @mtd:	MTD device structure
> + * @buf:	data buffer
> + * @len:	number of bytes to write
> + *
> + */
> +static void pnx8550_nand_write_buf(struct mtd_info *mtd, const u_char * buf,
> +				   int len)
> +{
> +	struct nand_chip *this = mtd->priv;
> +	int addr = NAND_ADDR(last_col_addr, last_page_addr);
> +	int pageLen;
> +	int oobLen = 0;
> +	u_char *transBuf = (u_char *) buf;
> +
> +	/* some sanity checking, word access only please */
> +	if (len & 1) {
> +		printk("%s: non-word aligned length requested!\n",
> +		       __FUNCTION__);
> +	}
> +
> +	memcpy(transferBuffer, buf, len);
> +	transBuf = transferBuffer;
> +
> +	/*
> +	   Work out whether we are going to write to the OOB area
> +	   after a standard page write.
> +	   This is not the case when the command function is called
> +	   with a column address > page size. Then we write as though
> +	   it is to the page rather than the OOB as the command function
> +	   has already selected the OOB area.
> +	 */
> +	if ((last_col_addr + len) > mtd->oobblock)
> +		oobLen = (last_col_addr + len) - mtd->oobblock;
> +	pageLen = len - oobLen;
> +
> +	/* Clear the done flag */
> +	PNX8550_GPXIO_CTRL |= PNX8550_GPXIO_CLR_DONE;
> +	if (pageLen > 0) {
> +		NAND_TRANSFER_TO(addr, transBuf, pageLen);
> +	}
> +	if (oobLen > 0) {
> +		pnx8550_nand_wait_for_dev_ready();
> +
> +		pnx8550_nand_register_setup(1, 0, 0, 1, 0, NAND_CMD_READOOB, 0);
> +		/* Work out where in the OOB we are going to start to write */
> +		addr = NAND_ADDR(last_col_addr - mtd->oobblock, last_page_addr);
> +		NAND_ADDR_SEND(addr);
> +		pnx8550_nand_register_setup(2, 3, 1, 1, 0, NAND_CMD_SEQIN,
> +					    NAND_CMD_PAGEPROG);
> +
> +		/* Clear the done flag */
> +		PNX8550_GPXIO_CTRL |= PNX8550_GPXIO_CLR_DONE;
> +		NAND_TRANSFER_TO(addr, transBuf + pageLen, oobLen);
> +	}
> +
> +	/*
> +	   Increment the address so on the next write we write in the
> +	   correct place.
> +	 */
> +	last_col_addr += len;
> +	if (last_col_addr >= mtd->oobblock + mtd->oobsize) {
> +		last_col_addr -= mtd->oobblock + mtd->oobsize;
> +		last_page_addr++;
> +	}
> +}
> +
> +/**
> + * pnx8550_nand_read_buf - read chip data into buffer
> + * @mtd:	MTD device structure
> + * @buf:	buffer to store date
> + * @len:	number of bytes to read
> + *
> + */
> +static void pnx8550_nand_read_buf(struct mtd_info *mtd, u_char * buf, int len)
> +{
> +	struct nand_chip *this = mtd->priv;
> +	int addr = NAND_ADDR(last_col_addr, last_page_addr);
> +	int pageLen;
> +	int oobLen = 0;
> +	u_char *transBuf = buf;
> +
> +	/* some sanity checking, word access only please */
> +	if (len & 1) {
> +		printk("%s: non-word aligned length\n", __FUNCTION__);
> +	}
> +
> +	transBuf = transferBuffer;
> +
> +	/*
> +	   Work out whether we are going to read the OOB area
> +	   after a standard page read.
> +	   This is not the case when the command function is called
> +	   with a column address > page size. Then we read as though
> +	   it is from the page rather than the OOB as the command
> +	   function has already selected the OOB area.
> +	 */
> +	if ((last_col_addr + len) > mtd->oobblock)
> +		oobLen = (last_col_addr + len) - mtd->oobblock;
> +	pageLen = len - oobLen;
> +
> +	if (pageLen) {
> +		NAND_TRANSFER_FROM(addr, transBuf, pageLen);
> +	}
> +	if (oobLen > 0) {
> +		pnx8550_nand_register_setup(1, 3, 1, 1, 0, NAND_CMD_READOOB, 0);
> +		addr = NAND_ADDR(last_col_addr - mtd->oobblock, last_page_addr);
> +		NAND_TRANSFER_FROM(addr, transBuf + pageLen, oobLen);
> +	}
> +	if (transBuf != buf) {
> +		memcpy(buf, transBuf, len);
> +	}
> +
> +	/*
> +	   Increment the address so on the next read we read from the
> +	   correct place.
> +	 */
> +	last_col_addr += len;
> +	if (last_col_addr > mtd->oobblock + mtd->oobsize) {
> +		last_col_addr -= mtd->oobblock + mtd->oobsize;
> +		last_page_addr++;
> +	}
> +	return;
> +}
> +
> +/**
> + * pnx8550_nand_verify_buf -  Verify chip data against buffer
> + * @mtd:	MTD device structure
> + * @buf:	buffer containing the data to compare
> + * @len:	number of bytes to compare
> + *
> + */
> +static int pnx8550_nand_verify_buf(struct mtd_info *mtd, const u_char * buf,
> +				   int len)
> +{
> +	int result = 0;
> +
> +	/* some sanity checking, word access only please */
> +	if (len & 1) {
> +		printk("%s: non-word aligned length\n", __FUNCTION__);
> +	}
> +
> +	pnx8550_nand_read_buf(mtd, transferBuffer, len);
> +	if (memcmp(buf, transferBuffer, len)) {
> +		result = -EFAULT;
> +	}
> +
> +	return result;
> +
> +}
> +
> +/**
> + * pnx8550_nand_command - Send command to NAND device
> + * @mtd:	MTD device structure
> + * @command:	the command to be sent
> + * @column:	the column address for this command, -1 if none
> + * @page_addr:	the page address for this command, -1 if none
> + *
> + * Send command to NAND device.
> + */
> +static void pnx8550_nand_command(struct mtd_info *mtd, unsigned command,
> +				 int column, int page_addr)
> +{
> +	register struct nand_chip *this = mtd->priv;
> +	u_char addr_no = 0;
> +	u_char spare = 0;
> +	int addr;
> +	/*
> +	   If we are starting a write work out whether it is to the
> +	   OOB or the main page and position the pointer correctly.
> +	 */
> +	if (command == NAND_CMD_SEQIN) {
> +		int readcmd;
> +		int col = column;
> +		if (column >= mtd->oobblock) {
> +			/* OOB area */
> +			col -= mtd->oobblock;
> +			readcmd = NAND_CMD_READOOB;
> +			spare = 1;
> +		} else {
> +			readcmd = NAND_CMD_READ0;
> +		}
> +		pnx8550_nand_register_setup(1, 0, 0, 1, 0, readcmd, 0);
> +		addr = NAND_ADDR(col, page_addr);
> +		NAND_ADDR_SEND(addr);
> +	}
> +
> +	/* Check the number of address bytes */
> +	if ((column == -1) && (page_addr == -1)) {
> +		addr_no = 0;
> +		column = 0;
> +		page_addr = 0;
> +	} else if ((column == -1) && (page_addr != -1)) {
> +		addr_no = 2;
> +		column = 0;
> +	} else if ((column != -1) && (page_addr == -1)) {
> +		addr_no = 1;
> +		page_addr = 0;
> +	} else {
> +		addr_no = 3;
> +	}
> +
> +	last_command = command;
> +	last_col_addr = column;
> +	last_page_addr = page_addr;
> +
> +	switch (command) {
> +
> +	case NAND_CMD_PAGEPROG:
> +		// Nothing to do, we've already done it!
> +		return;
> +
> +	case NAND_CMD_SEQIN:
> +		if (addr_no != 3)
> +			printk
> +			    ("NAND: Error. Command %02x needs 3 byte address, but addr_no = %d\n",
> +			     command, addr_no);
> +		pnx8550_nand_register_setup(2, 3, 1, 1, spare, NAND_CMD_SEQIN,
> +					    NAND_CMD_PAGEPROG);
> +		return;
> +
> +	case NAND_CMD_ERASE1:
> +		if (addr_no != 2)
> +			printk
> +			    ("NAND: Error. Command %02x needs 2 byte address, but addr_no = %d\n",
> +			     command, addr_no);
> +
> +		PNX8550_GPXIO_CTRL |= PNX8550_GPXIO_CLR_DONE;
> +
> +		pnx8550_nand_register_setup(2, 2, 0, 1, 0, NAND_CMD_ERASE1,
> +					    NAND_CMD_ERASE2);
> +		addr = NAND_ADDR(column, page_addr);
> +		NAND_ADDR_SEND(addr);
> +		return;
> +
> +	case NAND_CMD_ERASE2:
> +		// Nothing to do, we've already done it!
> +		return;
> +
> +	case NAND_CMD_STATUS:
> +		if (addr_no != 0)
> +			printk
> +			    ("NAND: Error. Command %02x needs 0 byte address, but addr_no = %d\n",
> +			     command, addr_no);
> +		pnx8550_nand_register_setup(1, 0, 1, 0, 0, NAND_CMD_STATUS, 0);
> +		return;
> +
> +	case NAND_CMD_RESET:
> +		if (addr_no != 0)
> +			printk
> +			    ("NAND: Error. Command %02x needs 0 byte address, but addr_no = %d\n",
> +			     command, addr_no);
> +		pnx8550_nand_register_setup(1, 0, 0, 0, 0, NAND_CMD_RESET, 0);
> +		addr = NAND_ADDR(column, page_addr);
> +		NAND_ADDR_SEND(addr);
> +		return;
> +
> +	case NAND_CMD_READ0:
> +		if (addr_no != 3)
> +			printk
> +			    ("NAND: Error. Command %02x needs 3 byte address, but addr_no = %d\n",
> +			     command, addr_no);
> +
> +		pnx8550_nand_register_setup(1, 3, 1, 1, 0, NAND_CMD_READ0, 0);
> +		return;
> +
> +	case NAND_CMD_READ1:
> +		printk("Wrong command: %02x\n", command);
> +		return;
> +
> +	case NAND_CMD_READOOB:
> +		if (addr_no != 3)
> +			printk
> +			    ("NAND: Error. Command %02x needs 3 byte address, but addr_no = %d\n",
> +			     command, addr_no);
> +		pnx8550_nand_register_setup(1, 3, 1, 1, 0, NAND_CMD_READOOB, 0);
> +		return;
> +
> +	case NAND_CMD_READID:
> +		if (addr_no != 1)
> +			printk
> +			    ("NAND: Error. Command %02x needs 1 byte address, but addr_no = %d\n",
> +			     command, addr_no);
> +		pnx8550_nand_register_setup(1, 1, 1, 0, 0, NAND_CMD_READID, 0);
> +		return;
> +	}
> +}
> +
> +/*
> + * Setup the registers in PCIXIO
> + */
> +static void pnx8550_nand_register_setup(u_char cmd_no,
> +					u_char addr_no,
> +					u_char include_data,
> +					u_char monitor_ACK,
> +					u_char enable64M, int cmd_a, int cmd_b)
> +{
> +	unsigned int reg_nand = 0;
> +	reg_nand |= enable64M ? PNX8550_XIO_FLASH_64MB : 0;
> +	reg_nand |= include_data ? PNX8550_XIO_FLASH_INC_DATA : 0;
> +	reg_nand |= PNX8550_XIO_FLASH_CMD_PH(cmd_no);
> +	reg_nand |= PNX8550_XIO_FLASH_ADR_PH(addr_no);
> +	reg_nand |= PNX8550_XIO_FLASH_CMD_A(cmd_a);
> +	reg_nand |= PNX8550_XIO_FLASH_CMD_B(cmd_b);
> +	PNX8550_XIO_FLASH_CTRL = reg_nand;
> +	barrier();
> +}
> +
> +/*
> + * Wait for the device to be ready for the next command
> + */
> +static inline void pnx8550_nand_wait_for_dev_ready(void)
> +{
> +	while ((PNX8550_XIO_CTRL & PNX8550_XIO_CTRL_XIO_ACK) == 0) ;
> +}
> +
> +/*
> + * Return true if the device is ready, false otherwise
> + */
> +static int pnx8550_nand_dev_ready(struct mtd_info *mtd)
> +{
> +	return ((PNX8550_XIO_CTRL & PNX8550_XIO_CTRL_XIO_ACK) != 0);
> +}
> +
> +/*
> + *	hardware specific access to control-lines
> + */
> +static void pnx8550_nand_hwcontrol(struct mtd_info *mtd, int cmd)
> +{
> +	// Nothing to do here, its all done by the XIO block
> +}
> +
> +/*
> + * Main initialization routine
> + */
> +int __init pnx8550_nand_init(void)
> +{
> +	struct nand_chip *this;
> +
> +	/* Get pointer to private data */
> +	this = &pnx8550_nand;
> +
> +	/* Initialize structures */
> +	memset((char *)&pnx8550_mtd, 0, sizeof(struct mtd_info));
> +	memset((char *)this, 0, sizeof(struct nand_chip));
> +
> +	/* Work out address of Nand Flash */
> +	pNandAddr = (u16 *) (KSEG1 | (PNX8550_BASE18_ADDR & (~0x7)));
> +
> +	pNandAddr = (u16 *) (((u32) pNandAddr) +
> +			     ((PNX8550_XIO_SEL0 & PNX8550_XIO_SEL0_OFFSET_MASK)
> +			      >> PNX8550_XIO_SEL0_OFFSET_SHIFT) * 8 * 1024 *
> +			     1024);
> +
> +	/* Link the private data with the MTD structure */
> +	pnx8550_mtd.priv = this;
> +	this->chip_delay = 15;
> +	this->options = NAND_BUSWIDTH_16;
> +	this->cmdfunc = pnx8550_nand_command;
> +	this->read_byte = pnx8550_nand_read_byte;
> +	this->read_word = pnx8550_nand_read_word;
> +	this->read_buf = pnx8550_nand_read_buf;
> +	this->write_byte = pnx8550_nand_write_byte;
> +	this->write_word = pnx8550_nand_write_word;
> +	this->write_buf = pnx8550_nand_write_buf;
> +	this->verify_buf = pnx8550_nand_verify_buf;
> +	this->dev_ready = pnx8550_nand_dev_ready;
> +	this->hwcontrol = pnx8550_nand_hwcontrol;
> +	this->eccmode = NAND_ECC_SOFT;
> +	this->badblock_pattern = &nand16bit_memorybased;
> +	this->autooob = &nand16bit_oob_16;
> +
> +	transferBuffer =
> +	    kmalloc(pnx8550_mtd.oobblock + pnx8550_mtd.oobsize,
> +		    GFP_DMA | GFP_KERNEL);
> +	if (!transferBuffer) {
> +		printk(KERN_ERR
> +		       "Unable to allocate NAND data buffer for PNX8550.\n");
> +		return -ENOMEM;
> +	}
> +
> +	/* Scan to find existence of the device */
> +	if (nand_scan(&pnx8550_mtd, 1)) {
> +		printk("%s: Exiting No Devices\n", __FUNCTION__);
> +		return -ENXIO;

Need kfree(transferBuffer)

> +	}
> +
> +	/* Register the partitions */
> +	add_mtd_partitions(&pnx8550_mtd, partition_info, NUM_PARTITIONS);

Need Kconfig to select MTD_PARTITIONS if required.

> +
> +	/* Return happy */
> +	return 0;
> +}
> +
> +module_init(pnx8550_nand_init);
> +
> +/*
> + * Clean up routine
> + */
> +#ifdef MODULE
> +static void __exit pnx8550_nand_cleanup(void)
> +{
> +	/* Unregister the device */
> +	del_mtd_device(&pnx8550_mtd);

Need del_mtd_partitions I think?

> +	if (transferBuffer) {
> +		kfree(transferBuffer);

"if (transferBuffer)" not needed and is discouraged
.
> +	}
> +}
> +
> +module_exit(pnx8550_nand_cleanup);
> +#endif
> +
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Adam Charrett");
> +MODULE_DESCRIPTION("Driver for 16Bit NAND Flash on the XIO bus for PNX8550");
> Index: linux-2.6.15_0/drivers/mtd/nand/Makefile
> ===================================================================
> --- linux-2.6.15_0.orig/drivers/mtd/nand/Makefile
> +++ linux-2.6.15_0/drivers/mtd/nand/Makefile
> @@ -18,5 +18,6 @@ obj-$(CONFIG_MTD_NAND_H1900)		+= h1910.o
>  obj-$(CONFIG_MTD_NAND_RTC_FROM4)	+= rtc_from4.o
>  obj-$(CONFIG_MTD_NAND_SHARPSL)		+= sharpsl.o
>  obj-$(CONFIG_MTD_NAND_NANDSIM)		+= nandsim.o
> +obj-$(CONFIG_MTD_NAND_PNX8550)		+= pnx8550.o
>  
>  nand-objs = nand_base.o nand_bbt.o
> 
> 
> ------------------------------------------------------------------------
> 
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/


-- 
Todd

From shuveb@gmail.com Mon Jan 16 06:31:00 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 06:31:34 +0000 (GMT)
Received: from p549F60EF.dip.t-dialin.net ([84.159.96.239]:2452 "EHLO
	p549F60EF.dip.t-dialin.net") by ftp.linux-mips.org with ESMTP
	id S8126482AbWAPGbA (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 06:31:00 +0000
Received: from uproxy.gmail.com ([IPv6:::ffff:66.249.92.194]:63554 "EHLO
	uproxy.gmail.com") by linux-mips.net with ESMTP id <S870856AbWAOUS1>;
	Sun, 15 Jan 2006 21:18:27 +0100
Received: by uproxy.gmail.com with SMTP id m3so441836uge
        for <linux-mips@linux-mips.org>; Sun, 15 Jan 2006 12:16:22 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type;
        b=LeoYH3cEg8epsaq4CyEI646CbHGOVHf/LG+pqLxprxnMgZ0PJ6Ge21N9rmpebFHALAdy75urokJlmyWN+pKwx6/O7JEWpTEWMvusVeQXJbfDZPWUF4TcstGYSVIW+rp1jQKW1HxJHmMaV+e5MIA/s655jVvNj0DAmWqO8XePL9s=
Received: by 10.49.28.3 with SMTP id f3mr185718nfj;
        Sun, 15 Jan 2006 12:16:22 -0800 (PST)
Received: by 10.49.29.1 with HTTP; Sun, 15 Jan 2006 12:16:21 -0800 (PST)
Message-ID: <c24555040601151216r5e2d0c5fua690854d5f2c8712@mail.gmail.com>
Date:	Mon, 16 Jan 2006 01:46:21 +0530
From:	Shuveb Hussain <shuveb@gmail.com>
To:	linux-mips@linux-mips.org
Subject: Arcload Ext2FS patch
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_19961_16340785.1137356181819"
Return-Path: <shuveb@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9879
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: shuveb@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 188757
Lines: 2474

------=_Part_19961_16340785.1137356181819
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Dear List,

Attached is the patch that adds Ext2FS reading capability to ArcLoad.
This patch is based on onion's patch for arcboot. I have to compress
it since it is somewhat large in size.

Some notes:
* The arc.cf file needs to be in /etc.
* The kernels can be anywhere in OSLoadPartition, usually "/"
* As usual, arcload needs to be in the DVH, pointed to by SystemPartition
* OSLoader is the arcload filename in DVH
* OSLoadFilename determines which of the kernels is loaded with whatever op=
tions

Problems:
I cross compiled arcload on x86 and used TFTP to test, there are 2
directories in the e2fslib directories, "et" and "util" that seem to
cause problems when cross compiling. Native compilation does not cause
any errors. This compile time problem, can however be fixed by
excuting make directly after doing a "cd" into these directories
manually. The top level makefile is screwing things up somehow, and
since I'm no make guru, can't figure out why. It is using
mips-linux-gcc, rather than the native gcc.

I have also put the patch here:
http://shuveb.f2g.net/arcload-e2fs-shuveb.patch.bz2


Thanks,
--shuveb

------=_Part_19961_16340785.1137356181819
Content-Type: application/x-bzip2; name=arcload-e2fs-shuveb.patch.bz2
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="arcload-e2fs-shuveb.patch.bz2"

QlpoOTFBWSZTWXJX3JADWad/gH//5Ih///////////////9jDP54AKUPsCm5tQPtC5dxejQChV9W
yoBQ7zACYs4u90dvutX2vSqXawK0BpVWYAU1pT32729sD0AHkFGvvo++uvLO2nbK2dXjSgQq1vFg
Pc896hnmdfWJ7x9e7j167ZfXx7de9UJQlmH2yQHZ97vO8Pud2qrY1F5d748+zB7fQG489nhs7U84
3uzDuvZdxL2xfLAh0z3Yz49awe8+4EnkC97fF7XXePO72+cr6+90+9qzavt9db6UuVPrtz17u+93
c9xprvDST1H164N7M9983e+ToHQ53d2wol6Br74dWX3dzfe8r40Aq+ypmqqurao9VEB89dz7g73v
vsGNOuAAk687U1qqVQXWRBG2giieLvt6odrLd73tye9az32yehbclvcB0Fz32e6+vj3nPe2AQkiC
nvCgduBm7A5ySw9b2HdkUFPPnOS6KNN7HKV20pQK61KOq2+6PZpe0FEXtkpFTZkKKFAIKjWbad8V
gdSSUkAKXm0AACvbVKAASOw0UCJCFPbuNKBrKQHowltgAAAALtgEJAqEoJTFlFUgvdN12fRnsAD6
qCewm95doqJrtvXu1jwLfdnPd97727wz2wXqnd3db7eunilPJl6X10+berZMvca0e9ed4MAHkKAi
Wz0A9AAegAoAAHdjhAUCiigoAhKO74a+uhRooALDpw6VNmWjvSThYH0Qg+2AAAABRQAr3dwVESAA
qnbPuPnvn3u1m99zPc6mH2O1Xuq+AfIFKlRRbXe573sAaAALd3XvZfNEjH33pWPmtvuQr7e++Hdv
fAMegdPT032jPfXvXrfXu5N1Gg2vt7uvnp8+3gqPe1sfeDelZD1odEs72569sKlQNbrU1ivrrhXb
QQqD1fe8BGhjwPZkACgSSKSUVSgPoDJIASU9mAodMcjB0Pt9lt9sbSzNtdF2W8grjjdVusu29m9g
yvWq2zlWq97cr7Po4KcfO6kdvo6tx6ZXm3ri262x9Xb7gKDPW9Y+Tqlvd9PGhvpoNt8ny6vYwqSX
dzj133nLprazQetSKjX3PXIr61Ut8+731o7YLryUBV3jhZlL23x9q+9JRrWlASU9tx3cbO4dfXuZ
vXlyCRbZX3s9e88Ut73egp9H3pRz3J3pm3bc3MRO3rLq9to7GXffd31b6o3vln0G4S2+5sE5jvee
vamfPu6fbHX23dvX3Z28+9nnu7W5twzV7dPd5e3W8zrRQ47a+2r2NPtvveVszuevscfPPr1KG6+7
e7muNqW9956eauN6973u9e29Mt7vXkm9nOvve776+2vUeLjN1Xdkvuk6z0bzrXvfVe7771rvJ4nf
Q988CtOr7nR1u7dSlG3s7ovazzvavr49VXnfe7l7531vBnrzr73Pe9s+93vUe3p9nn23qdbvrDoH
hyUjc577nwmfV7e+9p9Bq8+3g9vN2mlZU0Cn11FW1E499bvubLVwu+46q9rdW99vd7vR7z2+e9d1
7WuWbaHQB3MFAe891AAAAD6H0KAfQUAAB6AAwqAD6AHvb7rA0Xr1NtFdu7YMxFx6AUA7p6a+7udt
ymbLttdb089693t719x66mvd6BR99ler4fWT4bD6vt9gDoe8761y83PZY+tru0F7b7W97q97U6Bb
aDQ563Dd3NuuC7LszUL27lu9eu3m3XuXrDPOPXu3u9u0e9ve2N2EO7Liub3b3u7uuzHTNNtzae5y
uuXjnsQAQTtoiB0993fF9Dnt3eXd2+33dPABRdD7vo7dhRLrk2u98AD717vjxu3Hr057zPXu3pzn
V3JuY0ZrpwLkp73nvdOzdcAn1j3vncPd7vQvTDtkNc1hXnc7wPc4HSm9Ps95pn01Cn3j777ey8+i
Wfefb33pPjZOutruA3N7V3W4eHqu17sOu9u9BbPt6eeGZ3fffBpUuWefe7b292GW202ylPR0U5dL
U+8D6nvtfBQdeh6K5u9r2ge7crt10nX3e+2+xkBUAqrvt2NddeiSnO7dp3scbba0AG1rjsN9h4Ht
CC9Zq7Q+5rudhVetpZvdnPbKebe33nvteWu33nHm3fHr2++Oq+lPr33ffPvbd83OOuz33q47INlA
KPM47ZJfdlvd6957Yw0bOAHu7nvZvVZ4ZLq9cvYL2UuO7drd3Q7V9tJXN7XfcGc0X33we5hQG2AU
p9DQAKtnF9AfPsPDvE++ffWTz59i+7rvXN73ZmXdV7L77rg+7fe6ru93eryHpn3uuvX1SWOvamHp
H3N9603s8+pQN8MN9VkMp4Pduvbu5GgzsD2b0AFAUAD0LsZbZ2zOWccwoPZW2e7dV7verWoveSO7
vep3uS7ebe3XYKuQd55gFcGDY3tpq28O9O8t9Z9NJ5e4O4bXwozdWzfbe2t7cM03ds4XvXvt99Pl
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
hjdCcIqF2xLJFQ1KJZOuXFjXaacz70dxLOvud2YnTkxwycaPKprtM54QlPlMyhd0GSqeGXYip4qc
OJVVhWlRTrm08kvLl1mlRh4VCfCsT9H8a644PuLb+v+P7J1rQSIOBUdtmzXP931zLPM5pjdDA/vl
mxNpL+O5/z1SP0rMxZ9aFZ8GiMZJT13WQKIjO1bowMX+yRYBIdyPuwkUjf8T2+2p/Pp4T8qJGKdU
T6YXsQ6AlHosmq0md9XZSO/SEItJbldG0chRFUfJZCA107NkfJGsL7q/yrxso0NSebIOEuYAobEU
Ufku6Sicu9o25ryX3q6cdCLrDWV3uLMzF+BdoLPkx8SOsw0sJPfsx5QlXGsbo0NbEqULpoZvGrwn
1POGBfGumvUrMWne6YjldFmuwnir73VtsLrdHg32S9DUGTt36x0CHK0Tyt9ef9PXz7vl9dVVVVVV
KqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrVVVVVVVVV
VVVVVVf3dr7H7XP0P9Dny9Kqqqv2tVWtVVa1VV+b8mqrnjWq9vlr4enp+p48eP3K5XNV45VVrVcq
qqqqqqq1qtVrVVqqqqqqqqqqqqqqr2+GvT7XpX7XjlfDXtzlVWq1VavrF8NZ/w/X8PJxfutO2bS3
7cb/taU/I8OPZf+rZ5y4yokKxVG2MSL9DGlipicJpVT6s1y2+N9WvPXN5OXsPkRH73+w7KaJiKPs
AFnd8jW6YRvs56ru1DMkLXtxQ19WSOiLwf7L4VbX4PqkUjYqv/rKqnZOMCNNC97Z2JUorad3ZJpy
YsrCviWarJWT4wxL4ztungqt/AU/tNkqyMRE4GCg8cJkbZqcpz16p2ZRboPC8v65wsT9cuUnktlz
WXTgaIedGUIYz3Xasok4415WmOrGy7WTMnt36o1S+sHbAo7yLBK5gSZXbZPuOj9EDcDagPtW79F2
3bnvnqmYJt26m+RLaocxRIWohrwp2dZi5gVe1VyM3ef+K85PcZ8X2lm+05VGEiog+vZ5A47b3s+0
Si7GEsTEYz1526bpUz2wvSXtP3bvLl577c1DmH3X+wnJuSnJfu3v5xTceYt2NPcfLFxv7NDkE8Be
T+0J8gXqw9eWvrFcscJePMqKRQk0xDHfFGLPPG1umgzdJTc1d2pTsqWWzFOpWJw20msSYkp3biy3
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
N+W+cLZ1VNPdX9sXq6ZSo/9Y7JxTF7/duj7OWM+UnwtlCeNc4T/QalpR6zqW1dpZvPww2Rabysjf
fCvonOoiKa++B6YtZL0Qey3RR6LsZh0s0kJCX2P+3qYlpuwnkd6EhISEhISEhISFI8zHvkbDVOx2
1ReIjhPCC349uJemxL6sIDCl22krsYO6sTNSwZ9qj/VmlxRaRC+N36IKTRihCpiUo/VUy2cdD7Ze
rzNKm3M/4cfNG547PHM8cb4hJ9ZrDrfT+zHf8M96xxKlyON2V2Z4XCx2/txvNliDX1G7xtaP683b
vKzKv4TPz47BWXmflV2yttTJTzmixG+U1bx7TqdrwuzeLA3Uqm92Nb9i7FtH895/p69euLFtXX6i
2tu3MMfxtzFNMs5vjjD0Qi1bZRNZGN4PqXcC6tRW170zravmonwPg768/LxLqjArvcm5puvsolHG
2eOUbeXnZ0fW8ueeRrRdhozwxgJyEIz7nIa2s5BDXOPOcIyQ2syutkRkdc8YoGL4DhfUO/Kul5fh
eWQifqsjG6HdiNdIexTFjaEjFcN65aXNY4yGB0MkhKCUcVJZIZKDXyqA5YG2wHWNj2+0hjfhN5O0
XT277RhtVIf0irNa3RsLxz3zuDzJsVYqrv3KXfi5RKiC+IzNC+tGE9e6cY8eWs1gkztiKbrmmoEg
vhxIIj5v02tWWoMIjBuhxzunRnZy7t8eRPq8UytEHkaclfPTo4676jkVeElU9184RuhCr8ONZsw2
tNrvYcW5rEEgm8GukOYUzI0NrHLioj/niLXrnBhwHrrHsJ9vWRlPtHIxe3Ner6nKL6PTlDHajYat
hnLV77Nes0s4tUl4QwpO79P5Tz34qB7Zerpr5dnruwyYywwvmk27o7RG9mtYGQ0G/2amKXafVz8r
uvJLGSsp11OuCM4yGKpgcE58gy/5ZHvAxVeZqUP0NVEUFVNFMFU0VVNVFF3qPMHTgPqXkNYkT57u
waLdzv1Gk7LToGPV8ak7ttFYk/2jrYYST0teifGXBPnvcFk8CoPWxJP5unyfS75Edykgj0Tl3H1i
LGIJgEmEkUvpbq4Rt28XJnor/+7uz3l13gao9xa5j1YpYTbSEFTN9MHy+xQUF98q5Rz+/KsdNj2r
ScZ2vpHCkUjc/lwym83usqu/PDXgQq5rragg3KHFmNbmFhreA1Ox3PSO4DJJDMJGjVLaECUAHe5f
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
P1ufTP9OSKuOU4KUvT93jNEWfBkjcvn7uREREREREREREREREQiIiIiIiIiIiIiIiIiIiIiIiIiI
iIiIiIiIiIiIiI/UNERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
REREREREREREREREREREREREREREREREVVVVVVVVfe/xcOSV7pLHPOc2LKtS1sUe2mSJG9IbHw/8
2GYybl8vL04LX9fOcF9BWKryJJj5LpZlwCzFACwcQWSMY5ORBpTcY1CSVC7FmF+Td+vx4G84KUpS
lL9fD09OOg4nIpSlLo2dOz5G84KUvjOXoNp2WXDaaLvMKUv8vuZNF5z3cNi1e5N5GhenUqTJNW8j
vE/sN9h3FTk/3MiOixIjRCKOiQike1VUnQqGJqYQspf4vVMW2imi6rjs13B9HUiIiIiIiIiVVVVV
VVdpsXqde42Jz2/Xz5TctllS4euJ8ldjablKUpfYUo/n5bayaYJxolA2eTg3R33lWtBAgVgZAR2R
aQUpfvPSaN3JPGxtHPnxjwkk6R31mj1I3WrEm0kwpS7d/w9zablKXFmCCDRKKP1n6WD4wgBkWfOm
M9AlL6p8/rPrn1mtSYUqX5neQjbTmc5Cliu+riYzIwtFlKUstdxjAD8r2k0AW/2gMA3X7L/d64wi
+LMTdQSTRjFolT2VxNNtQXjNxSj+hxStYyUz8CIAJj9W5gqlVr7nDm5Ob9Lh7NiB3V15nXUyrY2h
pCGp9xoDgWzC+OM683i4STSaxJIpEd6Tf9UAAcmTiAyEo1pmUBUbKZe9LBUlyJy7QlmA42aOYMMT
/djK2F1gnniZnmja6eN+vtvrvvtwwg+HxY4324/jNYWYTvhZhDDKscsrp43OB/RG7b9m7gr52EBr
V1Ky52mJgsQfkf5DdbC+j0++J6tOoaOnj9w/4jJBpXeQXws3w+tkz4berXq/p5bR7E16a/i9cKBP
/lC6HQD/ojz1g7KVqAoKCh+qNp+r8MQ5w7XWoaIiLYVR3VHOZ35qBqv/hrjSNqJ7bGP2xjZDzX/L
WetM1EoNtXbPP7oJgxhXJB0fWOJSoeV0/6ZlScrqw3pDa/NPvn/CAff1uvD5Wyk/FgAJDM0xmnp/
kf7N/4LfNZkmAAXbiJAxl6SR2biCfDMi3nfdr4a8azfEWifiUjYnOLioEj++M4QeWMBFlxrjPCwc
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
x//xdyRThQkHJX3JAA==
------=_Part_19961_16340785.1137356181819--

From florian.delizy@sagem.com Mon Jan 16 07:21:05 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 07:21:25 +0000 (GMT)
Received: from ns1.sagem.com ([62.160.59.65]:6068 "EHLO mx1.sagem.com")
	by ftp.linux-mips.org with ESMTP id S8133351AbWAPHVF (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 16 Jan 2006 07:21:05 +0000
To:	linux-mips <linux-mips@linux-mips.org>
Subject: =?ISO-8859-1?Q?R=E9f=2E_=3A_does_the_linux_kernel_use_k0=2C_k1_regs=3F?=
MIME-Version: 1.0
Message-ID: <OF4F21A98A.1F732941-ONC12570F8.00283714-C12570F8.0028B1BE@sagem.com>
From:	Florian DELIZY <florian.delizy@sagem.com>
Date:	Mon, 16 Jan 2006 08:24:27 +0100
Content-Type: multipart/alternative; boundary="=_alternative 0028B1A5C12570F8_="
Return-Path: <florian.delizy@sagem.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9880
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: florian.delizy@sagem.com
Precedence: bulk
X-list: linux-mips
Content-Length: 3744
Lines: 124

Message en plusieurs parties au format MIME
--=_alternative 0028B1A5C12570F8_=
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

k0, k1 registers are used in SAVE=5FALL and RESTORE=5FALL macros mainly, to=
=20
save all registers on the kernel stack,
once all registered are properly saved, you can use them, and restore them =

after, that's why kernel interrupt code does not=20
uise k0,k1, and let them for critical interruption code (save/restore=20
context)


Have a look in include/asm-mips/stackframe.h (grep is your friend)

-- Florian Delizy






zhuzhenhua <zzh.hust@gmail.com>

Envoy=E9 par : linux-mips-bounce@linux-mips.org
13/01/2006 03:39
Remis le : 15/01/2006 19:29

=20
        Pour :  linux-mips <linux-mips@linux-mips.org>
        cc :    (ccc : Florian DELIZY/EXT/SAGEM)
        Objet : does the linux kernel use k0, k1 regs?



i have to handle a NMI interrupt in bootloader(0xBFC00000),
 and i want to return to linux after the NMI interrupt,  i think other
regs maybe be useing by linux-kernel, i think the NMI handle only can
use K0, K1.

and i do not find the use of K0, K1 in linux-kernel interrupt or
exception handle
so i think if the NMI interrupt a linux interrupt handle, there is
still no conflict.

i am not sure my thinking is right, anyone can give some hints?

Best regards

zhuzhenhua




--=_alternative 0028B1A5C12570F8_=
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


<br><font size=3D2 face=3D"sans-serif">k0, k1 registers are used in SAVE=5F=
ALL and RESTORE=5FALL macros mainly, to save all registers on the kernel st=
ack,</font>
<br><font size=3D2 face=3D"sans-serif">once all registered are properly sav=
ed, you can use them, and restore them after, that's why kernel interrupt c=
ode does not </font>
<br><font size=3D2 face=3D"sans-serif">uise k0,k1, and let them for critica=
l interruption code (save/restore context)</font>
<br>
<br>
<br><font size=3D2 face=3D"sans-serif">Have a look in include/asm-mips/stac=
kframe.h (grep is your friend)</font>
<br>
<br><font size=3D2 face=3D"sans-serif">-- Florian Delizy</font>
<br>
<br>
<br>
<br>
<br>
<table width=3D100%>
<tr valign=3Dtop>
<td>
<td><font size=3D1 face=3D"sans-serif"><b>zhuzhenhua &lt;zzh.hust@gmail.com=
&gt;</b></font>
<br>
<br><font size=3D1 face=3D"sans-serif">Envoy=E9 par : linux-mips-bounce@lin=
ux-mips.org</font>
<p><font size=3D1 face=3D"sans-serif">13/01/2006 03:39</font>
<br><font size=3D1 face=3D"sans-serif">Remis le : 15/01/2006 19:29</font>
<br>
<td><font size=3D1 face=3D"Arial">&nbsp; &nbsp; &nbsp; &nbsp; </font>
<br><font size=3D1 face=3D"sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; Pour : &=
nbsp; &nbsp; &nbsp; &nbsp;linux-mips &lt;linux-mips@linux-mips.org&gt;</fon=
t>
<br><font size=3D1 face=3D"sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; cc : &nb=
sp; &nbsp; &nbsp; &nbsp;(ccc : Florian DELIZY/EXT/SAGEM)</font>
<br><font size=3D1 face=3D"sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; Objet : =
&nbsp; &nbsp; &nbsp; &nbsp;does the linux kernel use k0, k1 regs?</font>
<br></table>
<br>
<br>
<br><font size=3D2 face=3D"Courier New">i have to handle a NMI interrupt in=
 bootloader(0xBFC00000),<br>
 and i want to return to linux after the NMI interrupt, &nbsp;i think other=
<br>
regs maybe be useing by linux-kernel, i think the NMI handle only can<br>
use K0, K1.<br>
<br>
and i do not find the use of K0, K1 in linux-kernel interrupt or<br>
exception handle<br>
so i think if the NMI interrupt a linux interrupt handle, there is<br>
still no conflict.<br>
<br>
i am not sure my thinking is right, anyone can give some hints?<br>
<br>
Best regards<br>
<br>
zhuzhenhua<br>
<br>
</font>
<br>
<br>
--=_alternative 0028B1A5C12570F8_=--

From colin@realtek.com.tw Mon Jan 16 08:13:59 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 08:14:19 +0000 (GMT)
Received: from mf2.realtek.com.tw ([60.248.182.46]:17679 "EHLO
	mf2.realtek.com.tw") by ftp.linux-mips.org with ESMTP
	id S3457192AbWAPIN7 (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 08:13:59 +0000
Received: from msx.realtek.com.tw (unverified [172.21.1.77]) by mf2.realtek.com.tw
 (Clearswift SMTPRS 5.1.7) with ESMTP id <T75e06cae14dc803816c34@mf2.realtek.com.tw> for <linux-mips@linux-mips.org>;
 Mon, 16 Jan 2006 16:19:52 +0800
Received: from rtpdii3098 ([172.21.98.16])
          by msx.realtek.com.tw (Lotus Domino Release 6.5.3)
          with ESMTP id 2006011616174962-447378 ;
          Mon, 16 Jan 2006 16:17:49 +0800 
Message-ID: <005101c61a75$43edc6b0$106215ac@realtek.com.tw>
From:	"colin" <colin@realtek.com.tw>
To:	<linux-mips@linux-mips.org>
Subject: Can I use this kind of performance counters to implement oProfile?
Date:	Mon, 16 Jan 2006 16:17:17 +0800
MIME-Version: 1.0
X-Priority: 3 (Normal)
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2800.1506
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
X-MIMETrack: Itemize by SMTP Server on msx/Realtek(Release 6.5.3|September 14, 2004) at
 2006/01/16 =?Bog5?B?pFWkyCAwNDoxNzo0OQ==?=,
	Serialize by Router on msx/Realtek(Release 6.5.3|September 14, 2004) at
 2006/01/16 =?Bog5?B?pFWkyCAwNDoxNzo1MQ==?=,
	Serialize complete at 2006/01/16 =?Bog5?B?pFWkyCAwNDoxNzo1MQ==?=
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset="big5"
Return-Path: <colin@realtek.com.tw>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9881
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: colin@realtek.com.tw
Precedence: bulk
X-list: linux-mips
Content-Length: 522
Lines: 22


Hi all,
Our SOC has performance counters, and we would like to use oProfile on it.
After surveying the oProfile doc, I found that the model of our performance
counters donot seem to fit oProfile.
This is because oProfile uses the interrupts caused by overflow of, say,
cache miss count to estimate the probability of this event in every portion.
Our SOC doesn't emit interrupt when event count overflow. Therefore,
oProfile cannot be used to estimate cache miss event on our chip. Is that
right?

Regards,
Colin










From langabe@gmail.com Mon Jan 16 10:01:10 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 10:01:29 +0000 (GMT)
Received: from uproxy.gmail.com ([66.249.92.204]:19766 "EHLO uproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S3458532AbWAPKBJ convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 10:01:09 +0000
Received: by uproxy.gmail.com with SMTP id u40so564150ugc
        for <linux-mips@linux-mips.org>; Mon, 16 Jan 2006 02:04:40 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=gtCIoGfHk6Ubj2h6fvo3EFsPLsc/vZEtodYZ+R3+sFegTSwL8w++jB24d+JpT5/U3fT8vKT1K1Mh2cuPtbd88Je4XJN1IgKAxYmEalwnAUGenLSnTBDgcQpYYFCM1BWdCX/nPD054TWJ5JyzdorBTX8vxohDASeM9NBj1Q1fwRs=
Received: by 10.48.4.9 with SMTP id 9mr215207nfd;
        Mon, 16 Jan 2006 02:04:40 -0800 (PST)
Received: by 10.48.225.20 with HTTP; Mon, 16 Jan 2006 02:04:39 -0800 (PST)
Message-ID: <c58a7a270601160204h41e5dca7pa9c26578b6b29f6f@mail.gmail.com>
Date:	Mon, 16 Jan 2006 10:04:39 +0000
From:	Alex Gonzalez <langabe@gmail.com>
To:	linux-mips <linux-mips@linux-mips.org>
Subject: Setting gp on pic code
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <langabe@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9882
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: langabe@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 838
Lines: 28

Hi,

I am trying to set the gp register on pic code as follows:

"la gp,_gp"

Disassembling the resulting code,

"lw gp,0(gp)"

I am confused as to why it uses a gp-relative address instead of an
absolute address for _gp. How I am supposed to reset gp then?

A bit of background. I am working on a dual core chip, with each core
running independently. They both boot from the same startup code, then
the second core waits until the first one sets all the hardware and
loads a pic binary into a shared memory region.

The second core is then released and should reset gp and jump to the
new binary (which is compiled separately from the startup code).

This arrangement seems to work OK if the binary is compiled non-pic,
but for pic code  the gp register is not set to the correct value.

Any insight into this appreciated.

Thanks,
Alex

From zzh.hust@gmail.com Mon Jan 16 11:58:19 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 11:58:39 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.202]:36801 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133443AbWAPL6T (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 16 Jan 2006 11:58:19 +0000
Received: by wproxy.gmail.com with SMTP id 36so1147524wra
        for <linux-mips@linux-mips.org>; Mon, 16 Jan 2006 04:01:50 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references;
        b=n6MjQek7XczpBZ47AxDHBbcftZ7cfba97ejI4Q+JRXnl/TeC1eesE0V6dTlK8bMdMKSL8SCRXUdHuKUBI3H5mVIbBaozfEA0UK0tDPfwu7bcZB7kBJdirFY8/lFflO30Wa8CTYjwcfO5KLav5ACdgLz0Kvhw47pn1FLmPw7Ldi8=
Received: by 10.54.104.14 with SMTP id b14mr949085wrc;
        Mon, 16 Jan 2006 04:01:49 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Mon, 16 Jan 2006 04:01:49 -0800 (PST)
Message-ID: <50c9a2250601160401ifa8337cs2f8638f0077f37ed@mail.gmail.com>
Date:	Mon, 16 Jan 2006 20:01:49 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	Florian DELIZY <florian.delizy@sagem.com>
Subject: =?ISO-8859-1?Q?Re:_R=E9f._:_does_the_linux_kernel_use_k0,_k1_regs=3F?=
Cc:	linux-mips <linux-mips@linux-mips.org>
In-Reply-To: <OF4F21A98A.1F732941-ONC12570F8.00283714-C12570F8.0028B1BE@sagem.com>
MIME-Version: 1.0
Content-Type: multipart/alternative; 
	boundary="----=_Part_11679_22905433.1137412909940"
References: <OF4F21A98A.1F732941-ONC12570F8.00283714-C12570F8.0028B1BE@sagem.com>
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9883
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 4995
Lines: 149

------=_Part_11679_22905433.1137412909940
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

thanks for all
now in my NMI interrupt, i first move k0 value to Desave, then use k0 to
handle, and then eret.
it can work.

On 1/16/06, Florian DELIZY <florian.delizy@sagem.com> wrote:
>
>
> k0, k1 registers are used in SAVE_ALL and RESTORE_ALL macros mainly, to
> save all registers on the kernel stack,
> once all registered are properly saved, you can use them, and restore the=
m
> after, that's why kernel interrupt code does not
> uise k0,k1, and let them for critical interruption code (save/restore
> context)
>
>
> Have a look in include/asm-mips/stackframe.h (grep is your friend)
>
> -- Florian Delizy
>
>
>
>
>
> *zhuzhenhua <zzh.hust@gmail.com>*
>
> Envoy=E9 par : linux-mips-bounce@linux-mips.org
>
> 13/01/2006 03:39
> Remis le : 15/01/2006 19:29
>
>         Pour :        linux-mips <linux-mips@linux-mips.org>
>         cc :        (ccc : Florian DELIZY/EXT/SAGEM)
>         Objet :        does the linux kernel use k0, k1 regs?
>
>
>
> i have to handle a NMI interrupt in bootloader(0xBFC00000),
> and i want to return to linux after the NMI interrupt,  i think other
> regs maybe be useing by linux-kernel, i think the NMI handle only can
> use K0, K1.
>
> and i do not find the use of K0, K1 in linux-kernel interrupt or
> exception handle
> so i think if the NMI interrupt a linux interrupt handle, there is
> still no conflict.
>
> i am not sure my thinking is right, anyone can give some hints?
>
> Best regards
>
> zhuzhenhua
>
>
>
>

------=_Part_11679_22905433.1137412909940
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

thanks for all<br>
now in my NMI interrupt, i first move k0 value to Desave, then use k0 to ha=
ndle, and then eret.<br>
it can work.<br><br><div><span class=3D"gmail_quote">On 1/16/06, <b class=
=3D"gmail_sendername">Florian DELIZY</b> &lt;<a href=3D"mailto:florian.deli=
zy@sagem.com">florian.delizy@sagem.com</a>&gt; wrote:</span><blockquote cla=
ss=3D"gmail_quote" style=3D"border-left: 1px solid rgb(204, 204, 204); marg=
in: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<br><font face=3D"sans-serif" size=3D"2">k0, k1 registers are used in SAVE_=
ALL and RESTORE_ALL macros mainly, to save all registers on the kernel stac=
k,</font>
<br><font face=3D"sans-serif" size=3D"2">once all registered are properly s=
aved, you can use them, and restore them after, that's why kernel interrupt=
 code does not </font>
<br><font face=3D"sans-serif" size=3D"2">uise k0,k1, and let them for criti=
cal interruption code (save/restore context)</font>
<br>
<br>
<br><font face=3D"sans-serif" size=3D"2">Have a look in include/asm-mips/st=
ackframe.h (grep is your friend)</font>
<br>
<br><font face=3D"sans-serif" size=3D"2">-- Florian Delizy</font>
<br>
<br>
<br>
<br>
<br>
<table width=3D"100%">
<tbody><tr valign=3D"top">
<td>
        <br>
</td><td><font face=3D"sans-serif" size=3D"1"><b>zhuzhenhua &lt;<a href=3D"=
mailto:zzh.hust@gmail.com" target=3D"_blank" onclick=3D"return top.js.OpenE=
xtLink(window,event,this)">zzh.hust@gmail.com</a>&gt;</b></font>
<br>
<br><font face=3D"sans-serif" size=3D"1">Envoy=E9 par : <a href=3D"mailto:l=
inux-mips-bounce@linux-mips.org" target=3D"_blank" onclick=3D"return top.js=
.OpenExtLink(window,event,this)">linux-mips-bounce@linux-mips.org</a></font=
>
<p><font face=3D"sans-serif" size=3D"1">13/01/2006 03:39</font>
<br><font face=3D"sans-serif" size=3D"1">Remis le : 15/01/2006 19:29</font>
<br>
</p></td><td><font face=3D"Arial" size=3D"1">&nbsp; &nbsp; &nbsp; &nbsp; </=
font>
<br><font face=3D"sans-serif" size=3D"1">&nbsp; &nbsp; &nbsp; &nbsp; Pour :=
 &nbsp; &nbsp; &nbsp; &nbsp;linux-mips &lt;<a href=3D"mailto:linux-mips@lin=
ux-mips.org" target=3D"_blank" onclick=3D"return top.js.OpenExtLink(window,=
event,this)">linux-mips@linux-mips.org</a>&gt;
</font>
<br><font face=3D"sans-serif" size=3D"1">&nbsp; &nbsp; &nbsp; &nbsp; cc : &=
nbsp; &nbsp; &nbsp; &nbsp;(ccc : Florian DELIZY/EXT/SAGEM)</font>
<br><font face=3D"sans-serif" size=3D"1">&nbsp; &nbsp; &nbsp; &nbsp; Objet =
: &nbsp; &nbsp; &nbsp; &nbsp;does the linux kernel use k0, k1 regs?</font>
<br></td></tr></tbody></table>
<br>
<br>
<br><font face=3D"Courier New" size=3D"2">i have to handle a NMI interrupt =
in bootloader(0xBFC00000),<br>
 and i want to return to linux after the NMI interrupt, &nbsp;i think other=
<br>
regs maybe be useing by linux-kernel, i think the NMI handle only can<br>
use K0, K1.<br>
<br>
and i do not find the use of K0, K1 in linux-kernel interrupt or<br>
exception handle<br>
so i think if the NMI interrupt a linux interrupt handle, there is<br>
still no conflict.<br>
<br>
i am not sure my thinking is right, anyone can give some hints?<br>
<br>
Best regards<br>
<br>
zhuzhenhua<br>
<br>
</font>
<br>
<br>
</blockquote></div><br>

------=_Part_11679_22905433.1137412909940--

From zzh.hust@gmail.com Mon Jan 16 12:06:15 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 12:06:39 +0000 (GMT)
Received: from wproxy.gmail.com ([64.233.184.195]:57709 "EHLO wproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133443AbWAPMGP convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 12:06:15 +0000
Received: by wproxy.gmail.com with SMTP id 36so1149085wra
        for <linux-mips@linux-mips.org>; Mon, 16 Jan 2006 04:09:41 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition;
        b=SUe5vb0ZRb6iyfK+nni6/bN1gHovvqRGl6fh+J9+iyXQ9TS/QgOJjYX/tEPNe4H22bqzUVGGfbpRdZATsV6GycNJMp1PUY3nuTtBXm+4YMEIUdCNHpoVtHWrLusKDCIFUorwjgRjqsRjeHTOW7jEa+Mrpx7+3CAtDsasf0AmU+4=
Received: by 10.54.154.10 with SMTP id b10mr4096720wre;
        Mon, 16 Jan 2006 04:09:41 -0800 (PST)
Received: by 10.54.156.1 with HTTP; Mon, 16 Jan 2006 04:09:41 -0800 (PST)
Message-ID: <50c9a2250601160409v2d931490u9123d7b9ad93bfb7@mail.gmail.com>
Date:	Mon, 16 Jan 2006 20:09:41 +0800
From:	zhuzhenhua <zzh.hust@gmail.com>
To:	linux-mips <linux-mips@linux-mips.org>
Subject: Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8BIT
Content-Disposition: inline
Return-Path: <zzh.hust@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9884
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: zzh.hust@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 17041
Lines: 881

i download a linux 2.6.14 kernel from
http://www.linux-mips.org/pub/linux/mips/kernel/.
 and i added arch/mips/ramdisk directory  to embedded the ramdisk.gz in vmliux
i also modify the arch/mips/Makefile and arch/mips/Kconfig
but when i bootm the vmlinux, it has panic
"Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)"
thanks for any hints!

Best regards!

zhuzhenhua



the arch/mips/ramdisk/Makefile as follow

#
# Makefile for a ramdisk image
#

obj-y += ramdisk.o


O_FORMAT = $(shell $(OBJDUMP) -i | head -n 2 | grep elf32)
img := $(subst ",,$(CONFIG_EMBEDDED_RAMDISK_IMAGE))
# add $(src) when $(img) is relative
img := $(subst $(src)//,/,$(src)/$(img))

quiet_cmd_ramdisk = LD      $@
define cmd_ramdisk
	$(LD) -T $(srctree)/$(src)/ld.script -b binary --oformat $(O_FORMAT) \
		-o $@ $(img)
endef

$(obj)/ramdisk.o: $(img) $(srctree)/$(src)/ld.script
	$(call cmd,ramdisk)


the arch/mips/ramdisk/ld.script as follow
OUTPUT_ARCH(mips)
SECTIONS
{
  .initrd :
  {
       *(.data)
  }
}


as follow is my .config
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.14
# Mon Jan 16 19:13:36 2006
#
CONFIG_MIPS=y

#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32

#
# General setup
#
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
# CONFIG_POSIX_MQUEUE is not set
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
CONFIG_HOTPLUG=y
CONFIG_KOBJECT_UEVENT=y
# CONFIG_IKCONFIG is not set
CONFIG_INITRAMFS_SOURCE=""
CONFIG_EMBEDDED=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0
# CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0

#
# Loadable module support
#
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_KMOD=y

#
# Machine selection
#
CONFIG_MYCPU_EVA=y
# CONFIG_MIPS_MTX1 is not set
# CONFIG_MIPS_BOSPORUS is not set
# CONFIG_MIPS_PB1000 is not set
# CONFIG_MIPS_PB1100 is not set
# CONFIG_MIPS_PB1500 is not set
# CONFIG_MIPS_PB1550 is not set
# CONFIG_MIPS_PB1200 is not set
# CONFIG_MIPS_DB1000 is not set
# CONFIG_MIPS_DB1100 is not set
# CONFIG_MIPS_DB1500 is not set
# CONFIG_MIPS_DB1550 is not set
# CONFIG_MIPS_DB1200 is not set
# CONFIG_MIPS_MIRAGE is not set
# CONFIG_MIPS_COBALT is not set
# CONFIG_MACH_DECSTATION is not set
# CONFIG_MIPS_EV64120 is not set
# CONFIG_MIPS_EV96100 is not set
# CONFIG_MIPS_IVR is not set
# CONFIG_MIPS_ITE8172 is not set
# CONFIG_MACH_JAZZ is not set
# CONFIG_LASAT is not set
# CONFIG_MIPS_ATLAS is not set
# CONFIG_MIPS_MALTA is not set
# CONFIG_MIPS_SEAD is not set
# CONFIG_MIPS_SIM is not set
# CONFIG_MOMENCO_JAGUAR_ATX is not set
# CONFIG_MOMENCO_OCELOT is not set
# CONFIG_MOMENCO_OCELOT_3 is not set
# CONFIG_MOMENCO_OCELOT_C is not set
# CONFIG_MOMENCO_OCELOT_G is not set
# CONFIG_MIPS_XXS1500 is not set
# CONFIG_PNX8550_V2PCI is not set
# CONFIG_PNX8550_JBS is not set
# CONFIG_DDB5074 is not set
# CONFIG_DDB5476 is not set
# CONFIG_DDB5477 is not set
# CONFIG_MACH_VR41XX is not set
# CONFIG_PMC_YOSEMITE is not set
# CONFIG_QEMU is not set
# CONFIG_SGI_IP22 is not set
# CONFIG_SGI_IP27 is not set
# CONFIG_SGI_IP32 is not set
# CONFIG_SIBYTE_BIGSUR is not set
# CONFIG_SIBYTE_SWARM is not set
# CONFIG_SIBYTE_SENTOSA is not set
# CONFIG_SIBYTE_RHONE is not set
# CONFIG_SIBYTE_CARMEL is not set
# CONFIG_SIBYTE_PTSWARM is not set
# CONFIG_SIBYTE_LITTLESUR is not set
# CONFIG_SIBYTE_CRHINE is not set
# CONFIG_SIBYTE_CRHONE is not set
# CONFIG_SNI_RM200_PCI is not set
# CONFIG_TOSHIBA_JMR3927 is not set
# CONFIG_TOSHIBA_RBTX4927 is not set
# CONFIG_TOSHIBA_RBTX4938 is not set
CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_DMA_NONCOHERENT=y
CONFIG_DMA_NEED_PCI_MAP_STATE=y
# CONFIG_CPU_BIG_ENDIAN is not set
CONFIG_CPU_LITTLE_ENDIAN=y
CONFIG_SYS_SUPPORTS_LITTLE_ENDIAN=y
CONFIG_SOC_MYCPU=y
CONFIG_SOC_MYCORE=y
CONFIG_MIPS_L1_CACHE_SHIFT=5

#
# CPU selection
#
CONFIG_CPU_MIPS32_R1=y
# CONFIG_CPU_MIPS32_R2 is not set
# CONFIG_CPU_MIPS64_R1 is not set
# CONFIG_CPU_MIPS64_R2 is not set
# CONFIG_CPU_R3000 is not set
# CONFIG_CPU_TX39XX is not set
# CONFIG_CPU_VR41XX is not set
# CONFIG_CPU_R4300 is not set
# CONFIG_CPU_R4X00 is not set
# CONFIG_CPU_TX49XX is not set
# CONFIG_CPU_R5000 is not set
# CONFIG_CPU_R5432 is not set
# CONFIG_CPU_R6000 is not set
# CONFIG_CPU_NEVADA is not set
# CONFIG_CPU_R8000 is not set
# CONFIG_CPU_R10000 is not set
# CONFIG_CPU_RM7000 is not set
# CONFIG_CPU_RM9000 is not set
# CONFIG_CPU_SB1 is not set
CONFIG_SYS_HAS_CPU_MIPS32_R1=y
CONFIG_CPU_MIPS32=y
CONFIG_CPU_MIPSR1=y
CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y

#
# Kernel type
#
CONFIG_32BIT=y
# CONFIG_64BIT is not set
CONFIG_PAGE_SIZE_4KB=y
# CONFIG_PAGE_SIZE_8KB is not set
# CONFIG_PAGE_SIZE_16KB is not set
# CONFIG_PAGE_SIZE_64KB is not set
CONFIG_CPU_HAS_PREFETCH=y
# CONFIG_MIPS_MT is not set
# CONFIG_64BIT_PHYS_ADDR is not set
# CONFIG_CPU_ADVANCED is not set
CONFIG_CPU_HAS_LLSC=y
CONFIG_CPU_HAS_SYNC=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_ARCH_FLATMEM_ENABLE=y
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_PREEMPT_NONE=y
# CONFIG_PREEMPT_VOLUNTARY is not set
# CONFIG_PREEMPT is not set

#
# Bus options (PCI, PCMCIA, EISA, ISA, TC)
#
CONFIG_MMU=y

#
# PCCARD (PCMCIA/CardBus) support
#
# CONFIG_PCCARD is not set

#
# PCI Hotplug Support
#

#
# Executable file formats
#
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
CONFIG_TRAD_SIGNALS=y
# CONFIG_ACTPM is not set

#
# MIPS initrd options
#
CONFIG_EMBEDDED_RAMDISK=y
CONFIG_EMBEDDED_RAMDISK_IMAGE="ramdisk.gz"

#
# Networking
#
CONFIG_NET=y

#
# Networking options
#
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
CONFIG_UNIX=y
CONFIG_XFRM=y
CONFIG_XFRM_USER=m
CONFIG_NET_KEY=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_FIB_HASH=y
CONFIG_IP_PNP=y
# CONFIG_IP_PNP_DHCP is not set
CONFIG_IP_PNP_BOOTP=y
# CONFIG_IP_PNP_RARP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
CONFIG_INET_TUNNEL=m
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_BIC=y

#
# IP: Virtual Server Configuration
#
# CONFIG_IP_VS is not set
# CONFIG_IPV6 is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m

#
# IP: Netfilter Configuration
#
# CONFIG_IP_NF_CONNTRACK is not set
# CONFIG_IP_NF_QUEUE is not set
# CONFIG_IP_NF_IPTABLES is not set
# CONFIG_IP_NF_ARPTABLES is not set

#
# DCCP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_DCCP is not set

#
# SCTP Configuration (EXPERIMENTAL)
#
# CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set

#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
CONFIG_IEEE80211=m
# CONFIG_IEEE80211_DEBUG is not set
CONFIG_IEEE80211_CRYPT_WEP=m
CONFIG_IEEE80211_CRYPT_CCMP=m
CONFIG_IEEE80211_CRYPT_TKIP=m

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set

#
# Connector - unified userspace <-> kernelspace linker
#
CONFIG_CONNECTOR=m

#
# Memory Technology Devices (MTD)
#
# CONFIG_MTD is not set

#
# Parallel port support
#
# CONFIG_PARPORT is not set

#
# Plug and Play support
#

#
# Block devices
#
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
# CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
# CONFIG_LBD is not set
# CONFIG_CDROM_PKTCDVD is not set

#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_ATA_OVER_ETH=y

#
# ATA/ATAPI/MFM/RLL support
#
# CONFIG_IDE is not set

#
# SCSI device support
#
# CONFIG_RAID_ATTRS is not set
# CONFIG_SCSI is not set

#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set

#
# Fusion MPT device support
#
# CONFIG_FUSION is not set

#
# IEEE 1394 (FireWire) support
#

#
# I2O device support
#

#
# Network device support
#
CONFIG_NETDEVICES=y
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set

#
# PHY device support
#
CONFIG_PHYLIB=m
CONFIG_PHYCONTROL=y

#
# MII PHY device drivers
#
CONFIG_MARVELL_PHY=m
CONFIG_DAVICOM_PHY=m
CONFIG_QSEMI_PHY=m
CONFIG_LXT_PHY=m
CONFIG_CICADA_PHY=m

#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
CONFIG_MII=m

#
# Ethernet (1000 Mbit)
#

#
# Ethernet (10000 Mbit)
#

#
# Token Ring devices
#

#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set

#
# Wan interfaces
#
# CONFIG_WAN is not set
CONFIG_PPP=m
CONFIG_PPP_MULTILINK=y
# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=m
# CONFIG_PPP_SYNC_TTY is not set
CONFIG_PPP_DEFLATE=m
# CONFIG_PPP_BSDCOMP is not set
CONFIG_PPPOE=m
# CONFIG_SLIP is not set
# CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set

#
# ISDN subsystem
#
# CONFIG_ISDN is not set

#
# Telephony Support
#
# CONFIG_PHONE is not set

#
# Input device support
#
CONFIG_INPUT=y

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
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

#
# Input Device Drivers
#
# CONFIG_INPUT_KEYBOARD is not set
# CONFIG_INPUT_MOUSE is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set

#
# Hardware I/O ports
#
CONFIG_SERIO=y
# CONFIG_SERIO_I8042 is not set
CONFIG_SERIO_SERPORT=y
CONFIG_SERIO_LIBPS2=m
CONFIG_SERIO_RAW=m
# CONFIG_GAMEPORT is not set

#
# Character devices
#
CONFIG_VT=y
# CONFIG_VT_CONSOLE is not set
CONFIG_HW_CONSOLE=y
# CONFIG_SERIAL_NONSTANDARD is not set

#
# Serial drivers
#
# CONFIG_SERIAL_8250 is not set

#
# Non-8250 serial port support
#
CONFIG_SERIAL_MYCORE=y
CONFIG_SERIAL_MYCORE_CONSOLE=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256

#
# IPMI
#
# CONFIG_IPMI_HANDLER is not set

#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
# CONFIG_RTC is not set
# CONFIG_GEN_RTC is not set
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set

#
# Ftape, the floppy tape device driver
#
# CONFIG_RAW_DRIVER is not set

#
# TPM devices
#

#
# I2C support
#
# CONFIG_I2C is not set

#
# Dallas's 1-wire bus
#
# CONFIG_W1 is not set

#
# Hardware Monitoring support
#
# CONFIG_HWMON is not set
# CONFIG_HWMON_VID is not set

#
# Misc devices
#

#
# Multimedia Capabilities Port drivers
#

#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set

#
# Digital Video Broadcasting Devices
#
# CONFIG_DVB is not set

#
# Graphics support
#
# CONFIG_FB is not set

#
# Console display driver support
#
# CONFIG_VGA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y

#
# Sound
#
# CONFIG_SOUND is not set

#
# USB support
#
# CONFIG_USB_ARCH_HAS_HCD is not set
# CONFIG_USB_ARCH_HAS_OHCI is not set

#
# USB Gadget Support
#
# CONFIG_USB_GADGET is not set

#
# MMC/SD Card support
#
# CONFIG_MMC is not set

#
# InfiniBand support
#

#
# SN Devices
#

#
# File systems
#
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
# CONFIG_EXT2_FS_SECURITY is not set
# CONFIG_EXT2_FS_XIP is not set
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_FS_MBCACHE=y
CONFIG_REISERFS_FS=m
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
CONFIG_REISERFS_FS_XATTR=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_SECURITY=y
# CONFIG_JFS_FS is not set
CONFIG_FS_POSIX_ACL=y
# CONFIG_XFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set
CONFIG_INOTIFY=y
# CONFIG_QUOTA is not set
CONFIG_DNOTIFY=y
CONFIG_AUTOFS_FS=m
CONFIG_AUTOFS4_FS=m
CONFIG_FUSE_FS=m

#
# CD-ROM/DVD Filesystems
#
# CONFIG_ISO9660_FS is not set
# CONFIG_UDF_FS is not set

#
# DOS/FAT/NT Filesystems
#
# CONFIG_MSDOS_FS is not set
# CONFIG_VFAT_FS is not set
# CONFIG_NTFS_FS is not set

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
# CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y
CONFIG_RELAYFS_FS=m

#
# Miscellaneous filesystems
#
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
CONFIG_CRAMFS=m
# CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set

#
# Network File Systems
#
CONFIG_NFS_FS=y
# CONFIG_NFS_V3 is not set
# CONFIG_NFS_V4 is not set
# CONFIG_NFS_DIRECTIO is not set
CONFIG_NFSD=m
# CONFIG_NFSD_V3 is not set
# CONFIG_NFSD_TCP is not set
CONFIG_ROOT_NFS=y
CONFIG_LOCKD=y
CONFIG_EXPORTFS=m
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y
# CONFIG_RPCSEC_GSS_KRB5 is not set
# CONFIG_RPCSEC_GSS_SPKM3 is not set
CONFIG_SMB_FS=m
# CONFIG_SMB_NLS_DEFAULT is not set
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set
# CONFIG_9P_FS is not set

#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y

#
# Native Language Support
#
CONFIG_NLS=m
CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_CODEPAGE_437 is not set
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ASCII is not set
# CONFIG_NLS_ISO8859_1 is not set
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
# CONFIG_NLS_UTF8 is not set

#
# Profiling support
#
# CONFIG_PROFILING is not set

#
# Kernel hacking
#
# CONFIG_PRINTK_TIME is not set
# CONFIG_DEBUG_KERNEL is not set
CONFIG_LOG_BUF_SHIFT=14
CONFIG_CROSSCOMPILE=y
CONFIG_CMDLINE=""

#
# Security options
#
CONFIG_KEYS=y
CONFIG_KEYS_DEBUG_PROC_KEYS=y
# CONFIG_SECURITY is not set

#
# Cryptographic options
#
CONFIG_CRYPTO=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_MD5=m
CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_TGR192=m
CONFIG_CRYPTO_DES=m
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_AES=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_KHAZAD=m
CONFIG_CRYPTO_ANUBIS=m
CONFIG_CRYPTO_DEFLATE=m
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_CRC32C=m
# CONFIG_CRYPTO_TEST is not set

#
# Hardware crypto devices
#

#
# Library routines
#
CONFIG_CRC_CCITT=m
CONFIG_CRC16=m
CONFIG_CRC32=y
CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=m
CONFIG_ZLIB_DEFLATE=m

From fosterb@uoguelph.ca Mon Jan 16 12:08:25 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 12:08:48 +0000 (GMT)
Received: from aeryn.cs.uoguelph.ca ([131.104.20.160]:9355 "EHLO
	aeryn.cs.uoguelph.ca") by ftp.linux-mips.org with ESMTP
	id S8133443AbWAPMIY (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 12:08:24 +0000
Received: from beddie.cis.uoguelph.ca (marvin.cis.uoguelph.ca [131.104.48.131])
	by aeryn.cs.uoguelph.ca (8.13.1/8.13.1) with ESMTP id k0GCBrWb016884;
	Mon, 16 Jan 2006 07:11:53 -0500
Received: from localhost (localhost.localdomain [127.0.0.1])
	by beddie.cis.uoguelph.ca (Postfix) with ESMTP id 2443B1EB20;
	Mon, 16 Jan 2006 07:09:47 -0500 (EST)
Received: from beddie.cis.uoguelph.ca ([127.0.0.1])
	by localhost (localhost.localdomain [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id 30690-08; Mon, 16 Jan 2006 07:09:47 -0500 (EST)
Received: from [192.168.0.103] (CPE001217cc2ab6-CM001371143eca.cpe.net.cable.rogers.com [70.30.137.118])
	by beddie.cis.uoguelph.ca (Postfix) with ESMTP id CC59F1EA74;
	Mon, 16 Jan 2006 07:09:46 -0500 (EST)
Message-ID: <43CB8D89.6070308@uoguelph.ca>
Date:	Mon, 16 Jan 2006 07:11:53 -0500
From:	Brett Foster <fosterb@uoguelph.ca>
User-Agent: Mozilla Thunderbird 1.0 (Windows/20041206)
X-Accept-Language: en-us, en
MIME-Version: 1.0
To:	Alex Gonzalez <langabe@gmail.com>
CC:	linux-mips <linux-mips@linux-mips.org>
Subject: Re: Setting gp on pic code
References: <c58a7a270601160204h41e5dca7pa9c26578b6b29f6f@mail.gmail.com>
In-Reply-To: <c58a7a270601160204h41e5dca7pa9c26578b6b29f6f@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.52 on 131.104.20.160
Return-Path: <fosterb@uoguelph.ca>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9885
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: fosterb@uoguelph.ca
Precedence: bulk
X-list: linux-mips
Content-Length: 297
Lines: 17

Alex Gonzalez wrote:

>Hi,
>
>I am trying to set the gp register on pic code as follows:
>
>"la gp,_gp"
>
>Disassembling the resulting code,
>
>"lw gp,0(gp)"
>  
>
Yes, this is normal... Use the following to set up the GP:
        //init GP
        lui     gp,%HI(_gp)
        ori     gp,%LO(_gp)

From hellokishore@gmail.com Mon Jan 16 12:19:55 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 12:20:18 +0000 (GMT)
Received: from zproxy.gmail.com ([64.233.162.201]:39960 "EHLO zproxy.gmail.com")
	by ftp.linux-mips.org with ESMTP id S8133443AbWAPMTz (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 16 Jan 2006 12:19:55 +0000
Received: by zproxy.gmail.com with SMTP id l8so1101018nzf
        for <linux-mips@linux-mips.org>; Mon, 16 Jan 2006 04:23:26 -0800 (PST)
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
        s=beta; d=gmail.com;
        h=received:message-id:date:from:to:subject:mime-version:content-type;
        b=CzCmpjC7U17TekwL70HqBBvVcj8+1QGL1iCtDPBNzixDoTYrA7Z3cEQnMJfcV4KgvU1gzUeH22NGEBERellrm5XfKFwpq+pha2E3/l/wggKKkaV0pAVGRBZhy7snLTkGC2i92YH3gc1Yk0g/uzycVGIvdr9uUlZTfxct2fnNvJ0=
Received: by 10.36.101.3 with SMTP id y3mr4818948nzb;
        Mon, 16 Jan 2006 04:23:26 -0800 (PST)
Received: by 10.36.49.4 with HTTP; Mon, 16 Jan 2006 04:23:26 -0800 (PST)
Message-ID: <f07e6e0601160423h5ce1c0d7lcb7e38f8509c4116@mail.gmail.com>
Date:	Mon, 16 Jan 2006 17:53:26 +0530
From:	Kishore K <hellokishore@gmail.com>
To:	linux-mips@linux-mips.org
Subject: gcc -3.4.4 and linux-2.4.32
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_5435_18690732.1137414206474"
Return-Path: <hellokishore@gmail.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9886
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: hellokishore@gmail.com
Precedence: bulk
X-list: linux-mips
Content-Length: 5019
Lines: 113

------=_Part_5435_18690732.1137414206474
Content-Type: multipart/alternative; 
	boundary="----=_Part_5436_32105947.1137414206474"

------=_Part_5436_32105947.1137414206474
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

hi
When 2.4.32 kernel (from linux-mips) is compiled with the tool chain based
on gcc 3.4.4 and binutils 2.16.1, the kernel crashes on malta board. The
crash file is enclosed along with the mail. If the same kernel is compiled
with the tool chain based on gcc 3.3.6, no problem is observed.

May I know, whether it is because of the changes in ABI in gcc 3.4. If so,
has any one got the patch to make 2.4.x kernels work with gcc 3.4 compilers=
?
From the changelog, I can infer that, some changes have been done in
2.4.28kernel to work with gcc
3.4 for i386. If so, has the same thing been done for MIPS as well.

TIA,
--kishore

------=_Part_5436_32105947.1137414206474
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

hi<br>
When 2.4.32 kernel (from linux-mips) is compiled with the tool chain
based on gcc 3.4.4 and binutils 2.16.1, the kernel crashes on malta
board. The crash file is enclosed along with the mail. If the same
kernel is compiled with the tool chain based on gcc 3.3.6, no problem
is observed.<br>
<br>
May I know, whether it is because of the changes in ABI in gcc 3.4. If
so, has any one got the patch to make 2.4.x kernels work with gcc 3.4
compilers? From the changelog, I can infer that, some changes have been
done in 2.4.28 kernel to work with gcc 3.4 for i386. If so, has the
same thing been done for MIPS as well.<br>
<br>
TIA,<br>
--kishore<br>
<br>

------=_Part_5436_32105947.1137414206474--

------=_Part_5435_18690732.1137414206474
Content-Type: application/octet-stream; name=crash
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="crash"

Start = 0x802c2040, range = (0x80100000,0x802fafff), format = SREC
                                                                                                                             
LINUX started...
CPU revision is: 00018005
Primary instruction cache 16kB, physically tagged, 4-way, linesize 16 bytes.
Primary data cache 16kB, 4-way, linesize 16 bytes.
Linux version 2.4.32 (inca@localhost.localdomain) (gcc version 3.4.4) #2 Mon Jan 16 17:24:34 IST 2006
Determined physical RAM map:
 memory: 00001000 @ 00000000 (reserved)
 memory: 000ef000 @ 00001000 (ROM data)
 memory: 00010000 @ 000f0000 (reserved)
 memory: 0022a000 @ 00100000 (reserved)
 memory: 03cd6000 @ 0032a000 (usable)
On node 0 totalpages: 16384
zone(0): 16384 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: ip=10.1.1.100:10.1.1.99:10.1.1.99:255.0.0.0:malta:eth0:off root=/dev/nfs nfsroot=/root/kishore/r1-alpha0calculating r4koff... 0009899a(625050)
CPU frequency 125.01 MHz
Using 62.505 MHz high precision timer.
Calibrating delay loop... 124.51 BogoMIPS
Memory: 61584k/62296k available (1787k kernel code, 712k reserved, 112k data, 108k init, 0k highmem)
Dentry cache hash table entries: 8192 (order: 4, 65536 bytes)
Inode cache hash table entries: 4096 (order: 3, 32768 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 4096 (order: 2, 16384 bytes)
Page-cache hash table entries: 16384 (order: 4, 65536 bytes)
Checking for 'wait' instruction...  available.
POSIX conformance testing by UNIFIX
Unable to handle kernel paging request at virtual address 00000014, epc == 8014579c, ra == 801457a4
Oops in fault.c::do_page_fault, line 206:
$0 : 00000000 1000fc00 00000000 810fb0a0 802ec184 810fb120 00000000 810fb000
$8 : 00000030 80285240 00000000 000010fb 802ebb80 00000000 1000fc01 80300000
$16: 80100784 810fb0a0 00010f00 810fb120 ffffffe9 00000001 80300000 00000000
$24: 0000002c ba2e8ba3                   802c0000 802c1e30 802dc300 801457a4
Hi : 00000000
Lo : 00000080
epc   : 8014579c    Not tainted
Status: 1000fc03
Cause : 90800008
PrId  : 00018005
Process swapper (pid: 0, stackpage=802c0000)
Stack:    80300000 0000059c 80300000 80300000 80300000 80300000 000f41ff
 80317248 802feb7c 80310000 0000059c 802ea920 802ff10c 00000060 00000000
 ba2e8ba3 80100784 00000000 00010f00 00000000 802dc300 00000001 80290000
 00000000 802dc300 8010726c 802c1ea8 801ac834 00000000 8032b428 000001f0
 8032b420 80107d00 00000001 00010f00 00000000 802c1f68 ffffffff 000001f0
 00000578 ...
Call Trace:   [<80100784>] [<80290000>] [<8010726c>] [<801ac834>] [<80107d00>]
 [<8015fb60>] [<80160118>] [<80100784>] [<80290000>] [<8018c998>] [<80111348>]
 [<801601e0>] [<80102780>] [<80111348>]
                                                                                                                             
Code: 00409821  3c168030  8ec26320 <0c055173> 8c440014  104000b0  00408021  0c0515a0  00402021
Kernel panic: Attempted to kill the idle task!
In idle task - not syncing



------=_Part_5435_18690732.1137414206474--

From kevink@mips.com Mon Jan 16 12:21:38 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 12:21:58 +0000 (GMT)
Received: from 209-232-97-206.ded.pacbell.net ([209.232.97.206]:60811 "EHLO
	dns0.mips.com") by ftp.linux-mips.org with ESMTP id S8133495AbWAPMVi
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 12:21:38 +0000
Received: from mercury.mips.com (sbcns-dmz [209.232.97.193])
	by dns0.mips.com (8.12.11/8.12.11) with ESMTP id k0GCOw53018813;
	Mon, 16 Jan 2006 04:24:58 -0800 (PST)
Received: from [192.168.236.16] (grendel [192.168.236.16])
	by mercury.mips.com (8.12.9/8.12.11) with ESMTP id k0GCOtYr014855;
	Mon, 16 Jan 2006 04:24:55 -0800 (PST)
Message-ID: <43CB9110.7040003@mips.com>
Date:	Mon, 16 Jan 2006 13:26:56 +0100
From:	"Kevin D. Kissell" <kevink@mips.com>
User-Agent: Thunderbird 1.5 (X11/20051025)
MIME-Version: 1.0
To:	zhuzhenhua <zzh.hust@gmail.com>
CC:	Florian DELIZY <florian.delizy@sagem.com>,
	linux-mips <linux-mips@linux-mips.org>
Subject: Re: =?ISO-8859-1?Q?R=E9f=2E_=3A_does_the_linux_kernel_?=
 =?ISO-8859-1?Q?use_k0=2C_k1_regs=3F?=
References: <OF4F21A98A.1F732941-ONC12570F8.00283714-C12570F8.0028B1BE@sagem.com> <50c9a2250601160401ifa8337cs2f8638f0077f37ed@mail.gmail.com>
In-Reply-To: <50c9a2250601160401ifa8337cs2f8638f0077f37ed@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.39
Return-Path: <kevink@mips.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9887
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: kevink@mips.com
Precedence: bulk
X-list: linux-mips
Content-Length: 335
Lines: 13

zhuzhenhua wrote:
> thanks for all
> now in my NMI interrupt, i first move k0 value to Desave, then use k0 to
> handle, and then eret.
> it can work.

It can work as long as you understand that you can't use
EJTAG breakpoints or (more difficult to avoid) handle DINT
events that happen during your NMI handler.

		Regards,

		Kevin K.

From marck@ivivity.com Mon Jan 16 14:45:27 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 14:45:44 +0000 (GMT)
Received: from mail.ivivity.com ([64.238.111.98]:3913 "EHLO thoth.ivivity.com")
	by ftp.linux-mips.org with ESMTP id S8126497AbWAPOp0 convert rfc822-to-8bit
	(ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 14:45:26 +0000
X-MimeOLE: Produced By Microsoft Exchange V6.5.7226.0
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 8BIT
Subject: RE: how to emdedded ramdisk.gz in vmlinux for linux-2.6.14?
Date:	Mon, 16 Jan 2006 09:48:52 -0500
Message-ID: <0F31272A2BCBBE4FA01344C6E69DBF501EAB1B@thoth.ivivity.com>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: how to emdedded ramdisk.gz in vmlinux for linux-2.6.14?
Thread-Index: AcYaBp5cvCKPBJABTCiDdTHIotWWwgApSvdA
From:	"Marc Karasek" <marck@ivivity.com>
To:	"zhuzhenhua" <zzh.hust@gmail.com>,
	"linux-mips" <linux-mips@linux-mips.org>
Return-Path: <marck@ivivity.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9888
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: marck@ivivity.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1013
Lines: 33

Look under arch/mips/ramdisk (I think).  This is where you should put the ramdisk.gz image and the compiler will pick it up and put it into the vmlinux image for you.  

Any content within this email is provided "AS IS" for informational purposes only. No contract will be formed between the parties by virtue of this email.
<**************************>
Marc Karasek
System Lead Technical Engineer
iVivity Inc.
PH: 678-990-1550 x238
Fax: 678-990-1551
<**************************>



-----Original Message-----
From: linux-mips-bounce@linux-mips.org
[mailto:linux-mips-bounce@linux-mips.org]On Behalf Of zhuzhenhua
Sent: Saturday, January 14, 2006 11:22 PM
To: linux-mips
Subject: how to emdedded ramdisk.gz in vmlinux for linux-2.6.14?


I download the kernel from linux-mips, and select to embedded
ramdisk.gz into vmlinux.
but  i can't find where to place the ramdisk.gz.
I try to put ramdisk.gz  under top dir, or arch/mips/boot/, but it
does not work.
 can someone give any hints?


Best regards

zhuzhenhua


From fxzhang@ict.ac.cn Mon Jan 16 15:15:45 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 15:16:11 +0000 (GMT)
Received: from webmail.ict.ac.cn ([159.226.39.7]:53419 "HELO ict.ac.cn")
	by ftp.linux-mips.org with SMTP id S8133474AbWAPPPp (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 16 Jan 2006 15:15:45 +0000
Received: (qmail 10330 invoked by uid 507); 16 Jan 2006 14:48:21 -0000
Received: from unknown (HELO ?192.168.2.202?) (fxzhang@222.92.8.142)
  by ict.ac.cn with SMTP; 16 Jan 2006 14:48:21 -0000
Message-ID: <43CBB943.7080807@ict.ac.cn>
Date:	Mon, 16 Jan 2006 23:18:27 +0800
From:	Fuxin Zhang <fxzhang@ict.ac.cn>
User-Agent: Thunderbird 1.5 (Windows/20051201)
MIME-Version: 1.0
To:	colin <colin@realtek.com.tw>
CC:	linux-mips@linux-mips.org
Subject: Re: Can I use this kind of performance counters to implement oProfile?
References: <005101c61a75$43edc6b0$106215ac@realtek.com.tw>
In-Reply-To: <005101c61a75$43edc6b0$106215ac@realtek.com.tw>
X-Enigmail-Version: 0.93.0.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Return-Path: <fxzhang@ict.ac.cn>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9889
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: fxzhang@ict.ac.cn
Precedence: bulk
X-list: linux-mips
Content-Length: 836
Lines: 30

You should be able to accumulate counters during process switching or a
timer routine, I managed to implement perfctr(another profiling
software) for godson-2 cpu, for both cases with/without interrupt
support. You can look at generic perfctr code.

colin 写道:
> Hi all,
> Our SOC has performance counters, and we would like to use oProfile on it.
> After surveying the oProfile doc, I found that the model of our performance
> counters donot seem to fit oProfile.
> This is because oProfile uses the interrupts caused by overflow of, say,
> cache miss count to estimate the probability of this event in every portion.
> Our SOC doesn't emit interrupt when event count overflow. Therefore,
> oProfile cannot be used to estimate cache miss event on our chip. Is that
> right?
> 
> Regards,
> Colin
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 

From sbharathi@MidasComm.Com Mon Jan 16 15:28:10 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 15:28:28 +0000 (GMT)
Received: from midas-91-171-chn.midascomm.com ([203.196.171.91]:3296 "EHLO
	info.midascomm.com") by ftp.linux-mips.org with ESMTP
	id S8133443AbWAPP2J (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 15:28:09 +0000
Received: from bharathi.midascomm.com ([192.168.13.175])
	by info.midascomm.com (8.12.10/8.12.10) with ESMTP id k0GFVZkP000416
	for <linux-mips@linux-mips.org>; Mon, 16 Jan 2006 21:01:35 +0530
Date:	Mon, 16 Jan 2006 21:06:22 +0530 (IST)
From:	Bharathi Subramanian <sbharathi@MidasComm.Com>
To:	Linux MIPS <linux-mips@linux-mips.org>
Subject: Timer Interrupt
Message-ID: <Pine.LNX.4.44.0601162057330.31018-100000@bharathi.midascomm.com>
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-midascomm.com-MailScanner-Information: Please contact the ISP for more information
X-midascomm.com-MailScanner: Found to be clean
X-midascomm.com-MailScanner-From: sbharathi@midascomm.com
Return-Path: <sbharathi@MidasComm.Com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9890
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: sbharathi@MidasComm.Com
Precedence: bulk
X-list: linux-mips
Content-Length: 432
Lines: 16

Hi all,

We are trying to implement the CPU Clock down feature for saving the 
power. In this process, Whenever the CPU is put in 1/2 Clock then the 
Timer interrupt is also getting delayed.

Later I found that CPU Counter is used to generate the timer intr. How 
to make the Timer interrupt to happen at every 10ms, even if the CPU 
is in 1/2, 1/4 or 1/8 of the original clock??

Processor: MIPS 4Kc 32B

Thanks :)
-- 
Bharathi S


From tbm@cyrius.com Mon Jan 16 15:42:24 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 15:42:44 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:40209 "EHLO
	sorrow.cyrius.com") by ftp.linux-mips.org with ESMTP
	id S8133474AbWAPPmY (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 15:42:24 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id 1D3C964D54; Mon, 16 Jan 2006 15:45:53 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id 7E4838517; Mon, 16 Jan 2006 15:45:43 +0000 (GMT)
Date:	Mon, 16 Jan 2006 15:45:43 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	Peter Horton <pdh@colonel-panic.org>
Cc:	linux-mips@linux-mips.org, ralf@linux-mips.org
Subject: Re: [PATCH Cobalt 1/1] 64-bit fix
Message-ID: <20060116154543.GA26771@deprecation.cyrius.com>
References: <20050414185949.GA5578@skeleton-jack>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20050414185949.GA5578@skeleton-jack>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9891
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 3230
Lines: 105

* Peter Horton <pdh@colonel-panic.org> [2005-04-14 19:59]:
> This patch adds detection of broken 64-bit mode LL/SC on Cobalt units.
> With this patch my Qube2700 boots a 64-bit build fine. The later units
> have some problems with the Tulip driver.

Ralf, is this patch appropriate?  Can you please apply it or provide
some feedback.

> P.
> 
> --
> 
> Index: linux/arch/mips/kernel/cpu-probe.c
> ===================================================================
> --- linux.orig/arch/mips/kernel/cpu-probe.c	2005-04-11 23:19:17.000000000 +0100
> +++ linux/arch/mips/kernel/cpu-probe.c	2005-04-11 23:35:06.000000000 +0100
> @@ -131,6 +131,58 @@
>  	check_wait();
>  }
>  
> +#ifdef CONFIG_MIPS64
> +
> +/*
> + * On RM5230/5231 all accesses to XKPHYS by LL(D) are forced
> + * to be uncached, bits 61-59 of the address are ignored.
> + *
> + * Apparently fixed on RM5230A/5231A.
> + */
> +static inline int check_lld(void)
> +{
> +	unsigned long flags, value, match, phys, *addr;
> +
> +	printk("Checking for lld bug... ");
> +
> +	/* hope the stack is in the low 512MB */
> +	phys = CPHYSADDR((unsigned long) &value);
> +
> +	/* write value to memory */
> +	value = 0xfedcba9876543210;
> +	addr = (unsigned long *) PHYS_TO_XKPHYS(K_CALG_UNCACHED, phys);
> +	*addr = value;
> +
> +	/* stop spurious flushes */
> +	local_irq_save(flags);
> +
> +	/* flip cached value */
> +	value = ~value;
> +
> +	/* read value, supposedly from cache */
> +	addr = (unsigned long *) PHYS_TO_XKPHYS(K_CALG_NONCOHERENT, phys);
> +	asm volatile("lld %0, %1" : "=r" (match) : "m" (*addr));
> +
> +	local_irq_restore(flags);
> +
> +	match ^= value;
> +
> +	switch ((long) match) {
> +	case 0:
> +		printk("no.\n");
> +		break;
> +	case -1:
> +		printk("yes.\n");
> +		break;
> +	default:
> +		printk("yikes yes! (%lx/%lx@%p)\nPlease report to <linux-mips@linux-mips.org>.", value, match, &value);
> +	}
> +
> +	return !match;
> +}
> +
> +#endif
> +
>  /*
>   * Probe whether cpu has config register by trying to play with
>   * alternate cache bit and see whether it matters.
> @@ -347,7 +399,11 @@
>  		c->cputype = CPU_NEVADA;
>  		c->isa_level = MIPS_CPU_ISA_IV;
>  		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
> -		             MIPS_CPU_DIVEC | MIPS_CPU_LLSC;
> +		             MIPS_CPU_DIVEC;
> +#ifdef CONFIG_MIPS64
> +		if (check_lld())
> +#endif
> +			c->options |= MIPS_CPU_LLSC;
>  		c->tlbsize = 48;
>  		break;
>  	case PRID_IMP_R6000:
> Index: linux/include/asm-mips/addrspace.h
> ===================================================================
> --- linux.orig/include/asm-mips/addrspace.h	2005-04-11 23:19:17.000000000 +0100
> +++ linux/include/asm-mips/addrspace.h	2005-04-11 23:19:20.000000000 +0100
> @@ -120,7 +120,7 @@
>  #define PHYS_TO_XKSEG_UNCACHED(p)	PHYS_TO_XKPHYS(K_CALG_UNCACHED,(p))
>  #define PHYS_TO_XKSEG_CACHED(p)		PHYS_TO_XKPHYS(K_CALG_COH_SHAREABLE,(p))
>  #define XKPHYS_TO_PHYS(p)		((p) & TO_PHYS_MASK)
> -#define PHYS_TO_XKPHYS(cm,a)		(0x8000000000000000 | ((cm)<<59) | (a))
> +#define PHYS_TO_XKPHYS(cm,a)		(0x8000000000000000 | ((unsigned long)(cm)<<59) | (a))
>  
>  #if defined (CONFIG_CPU_R4300)						\
>      || defined (CONFIG_CPU_R4X00)					\

-- 
Martin Michlmayr
http://www.cyrius.com/

From tbm@cyrius.com Mon Jan 16 15:45:38 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 15:45:56 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:42513 "EHLO
	sorrow.cyrius.com") by ftp.linux-mips.org with ESMTP
	id S8133474AbWAPPpi (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 15:45:38 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id 9867F64D54; Mon, 16 Jan 2006 15:49:08 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id 306E48517; Mon, 16 Jan 2006 15:48:57 +0000 (GMT)
Date:	Mon, 16 Jan 2006 15:48:57 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	Andrew Isaacson <adi@broadcom.com>
Cc:	linux-mips@linux-mips.org
Subject: Re: [patch 1/5] SiByte fixes for 2.6.12
Message-ID: <20060116154856.GB26771@deprecation.cyrius.com>
References: <Pine.LNX.4.61L.0506231153080.17155@blysk.ds.pg.gda.pl> <20051001092807.GD14463@linux-mips.org> <20051003131551.GA19075@nevyn.them.org> <Pine.LNX.4.61L.0510031432410.8056@blysk.ds.pg.gda.pl> <20050622230042.GA17919@broadcom.com> <Pine.LNX.4.61L.0506231153080.17155@blysk.ds.pg.gda.pl> <20051001092807.GD14463@linux-mips.org> <20051003131551.GA19075@nevyn.them.org> <20050622230003.GA17725@broadcom.com> <20050622230042.GA17919@broadcom.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <Pine.LNX.4.61L.0510031432410.8056@blysk.ds.pg.gda.pl> <20051003131551.GA19075@nevyn.them.org> <20050622230042.GA17919@broadcom.com>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9892
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2017
Lines: 42

* Andrew Isaacson <adi@broadcom.com> [2005-06-22 16:00]:
> SB1 does not use the R4K TLB code.
> 
>  		c->cputype = CPU_SB1;
> +		c->options &= ~MIPS_CPU_4KTLB;
> +		c->options |= MIPS_CPU_TLB;
>  #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS

* Daniel Jacobowitz <dan@debian.org> [2005-10-03 09:15]:
> > >  Well, the flag is not really to specify whether the common code is to be 
> > > used or not.  It's about whether the TLB is like that of the R4k.  
> > > Actually it's always been a mystery for me why the common code cannot be 
> > > used for the SB1, but perhaps there is something specific that I could 
> > > only discover in that "SB-1 Core User Manual" that I yet have to see, 
> > > sigh...
> > >  Of course if your TLB is indeed different from that of the R4k, then you 
> > > shouldn't be setting cp0.config.mt to 1 in the first place...
> > The reason was primarily the tiny bit of extra performance because the
> > SB1 doesn't need the hazard handling overhead.  Also tlb-sb1 has a few
> > changes that are needed to initialize a TLB in undefined state after
> > powerup.  That was needed to run Linux on firmware-less SB1 cores.
> FYI, all I have is a piece of hard evidence: this patch was the
> difference between not booting and booting for a Sentosa with CFE. 
> Which isn't firmwareless and isn't a tiny bit of extra performance
> issue.
> 
> I'll try to give CVS HEAD a shot this week sometime.

* Maciej W. Rozycki <macro@linux-mips.org> [2005-10-03 14:35]:
> > FYI, all I have is a piece of hard evidence: this patch was the
> > difference between not booting and booting for a Sentosa with CFE. 
> > Which isn't firmwareless and isn't a tiny bit of extra performance
> > issue.
>  Actually workarounds have been floating around for some time. ;-)  But 
> I'm glad this has now been fixed properly.

There was some discussion regarding this patch but no real conclusion.
Is it working without this patch now, or should it be applied (or
modified? - how?).
-- 
Martin Michlmayr
http://www.cyrius.com/

From tbm@cyrius.com Mon Jan 16 15:47:54 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 15:48:12 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:44305 "EHLO
	sorrow.cyrius.com") by ftp.linux-mips.org with ESMTP
	id S8133495AbWAPPry (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 15:47:54 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id 8232A64D54; Mon, 16 Jan 2006 15:51:23 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id D70938517; Mon, 16 Jan 2006 15:51:10 +0000 (GMT)
Date:	Mon, 16 Jan 2006 15:51:10 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	Kaj-Michael Lang <milang@tal.org>
Cc:	linux-mips@linux-mips.org
Subject: Re: [PATCH] Fix serial console detection
Message-ID: <20060116155110.GC26771@deprecation.cyrius.com>
References: <Pine.LNX.4.61.0502141602080.24829@tori.tal.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <Pine.LNX.4.61.0502141602080.24829@tori.tal.org>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9893
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2021
Lines: 57

* Kaj-Michael Lang <milang@tal.org> [2005-02-14 16:08]:
> In ip22-setup.c the checks for serial/graphics console logic does
> not check if ARCS console=g but the machine is using serial console, as
> it does if no keyboard is attached.
> 
> This patch adds a check if ConsoleOut is serial. There might also be 
> support for other graphics than Newport soon...

Ralf, are there any objections to this patch or did you simply forget
to apply it?

> Index: arch/mips/sgi-ip22/ip22-setup.c
> ===================================================================
> RCS file: /home/cvs/linux/arch/mips/sgi-ip22/ip22-setup.c,v
> retrieving revision 1.44
> diff -u -r1.44 ip22-setup.c
> --- arch/mips/sgi-ip22/ip22-setup.c	10 Dec 2004 13:31:42 -0000	1.44
> +++ arch/mips/sgi-ip22/ip22-setup.c	14 Feb 2005 13:57:33 -0000
> @@ -56,6 +56,7 @@
>  static int __init ip22_setup(void)
>  {
>  	char *ctype;
> +	char *cserial;
> 
>  	board_be_init = ip22_be_init;
>  	ip22_time_init();
> @@ -81,9 +82,14 @@
>  	/* ARCS console environment variable is set to "g?" for
>  	 * graphics console, it is set to "d" for the first serial
>  	 * line and "d2" for the second serial line.
> +	 *
> +	 * Need to check if the case is 'g' but no keyboard:
> +	 * (ConsoleIn/Out = serial )
>  	 */
>  	ctype = ArcGetEnvironmentVariable("console");
> -	if (ctype && *ctype == 'd') {
> +	cserial = ArcGetEnvironmentVariable("ConsoleOut");
> +
> +	if ( (ctype && *ctype == 'd') || (cserial && *cserial == 's')) {
>  		static char options[8];
>  		char *baud = ArcGetEnvironmentVariable("dbaud");
>  		if (baud)
> @@ -91,7 +97,7 @@
>  		add_preferred_console("ttyS", *(ctype + 1) == '2' ? 1 : 0,
>  				      baud ? options : NULL);
>  	} else if (!ctype || *ctype != 'g') {
> -		/* Use ARC if we don't want serial ('d') or Newport ('g'). */
> +		/* Use ARC if we don't want serial ('d') or Graphics ('g'). 
> */
>  		prom_flags |= PROM_FLAG_USE_AS_CONSOLE;
>  		add_preferred_console("arc", 0, NULL);
>  	}
> 

-- 
Martin Michlmayr
http://www.cyrius.com/

From tbm@cyrius.com Mon Jan 16 15:48:46 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 15:49:09 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:45073 "EHLO
	sorrow.cyrius.com") by ftp.linux-mips.org with ESMTP
	id S8133495AbWAPPsq (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 15:48:46 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id C49D264D55; Mon, 16 Jan 2006 15:52:17 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id 2CD958517; Mon, 16 Jan 2006 15:52:08 +0000 (GMT)
Date:	Mon, 16 Jan 2006 15:52:08 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	linux-mips@linux-mips.org
Subject: Re: make meth eht0 on IP32
Message-ID: <20060116155208.GD26771@deprecation.cyrius.com>
References: <41E582A0.1050407@total-knowledge.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <41E582A0.1050407@total-knowledge.com>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9894
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1182
Lines: 37

* Ilya A. Volynets-Evenbakh <ilya@total-knowledge.com> [2005-01-12 12:03]:
> meth is built-in ethernet card on O2, and it would make sense for it to be
> eth0, even if there is also another network card in PCI slot.

This sounds like a good idea to me.  Can this patch be applied?

>    Ilya.
> 
> Index: drivers/net/Makefile
> ===================================================================
> RCS file: /home/cvs/linux/drivers/net/Makefile,v
> retrieving revision 1.107
> diff -u -r1.107 Makefile
> --- drivers/net/Makefile        15 Nov 2004 11:49:28 -0000      1.107
> +++ drivers/net/Makefile        12 Jan 2005 19:58:47 -0000
> @@ -28,6 +28,8 @@
> obj-$(CONFIG_MYRI_SBUS) += myri_sbus.o
> obj-$(CONFIG_SUNGEM) += sungem.o sungem_phy.o
> 
> +obj-$(CONFIG_SGI_O2MACE_ETH) += meth.o
> +
> obj-$(CONFIG_MACE) += mace.o
> obj-$(CONFIG_BMAC) += bmac.o
> 
> @@ -125,7 +127,6 @@
> obj-$(CONFIG_SUN3LANCE) += sun3lance.o
> obj-$(CONFIG_DEFXX) += defxx.o
> obj-$(CONFIG_SGISEEQ) += sgiseeq.o
> -obj-$(CONFIG_SGI_O2MACE_ETH) += meth.o
> obj-$(CONFIG_AT1700) += at1700.o
> obj-$(CONFIG_FMV18X) += fmv18x.o
> obj-$(CONFIG_EL1) += 3c501.o
> 

-- 
Martin Michlmayr
http://www.cyrius.com/

From tbm@cyrius.com Mon Jan 16 15:50:24 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 15:50:43 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:50193 "EHLO
	sorrow.cyrius.com") by ftp.linux-mips.org with ESMTP
	id S8133495AbWAPPuY (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 15:50:24 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id 7366564D54; Mon, 16 Jan 2006 15:53:54 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id DFF1A8517; Mon, 16 Jan 2006 15:53:43 +0000 (GMT)
Date:	Mon, 16 Jan 2006 15:53:43 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	Daniel Jacobowitz <dan@debian.org>
Cc:	ralf@linux-mips.org, linux-mips@linux-mips.org
Subject: Re: Support /proc/kcore for MIPS
Message-ID: <20060116155343.GE26771@deprecation.cyrius.com>
References: <20050121005954.GA10260@nevyn.them.org> <20050214020209.GA25335@nevyn.them.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20050214020209.GA25335@nevyn.them.org>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9895
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2312
Lines: 59

* Daniel Jacobowitz <dan@debian.org> [2005-02-13 21:02]:
> Ping.  I've now tested this patch in both 32-bit and 64-bit kernels.

Ralf, can this be applied or are there objections?

> On Thu, Jan 20, 2005 at 07:59:54PM -0500, Daniel Jacobowitz wrote:
> > I wanted to do live debugging on an ornery task_struct this morning, so I
> > hooked up /proc/kcore for MIPS.  I'm pretty sure that the CKSEG0 bits are
> > wrong, but I did need to cover that region - because the SB-1 kernel links
> > at 0xffffffff80100000 or so, disassembly and printing static variables don't
> > work unless the debugger can read that region.
> > 
> > Signed-off-by: Daniel Jacobowitz <dan@codesourcery.com>
> > 
> > Index: linux/arch/mips/mm/init.c
> > ===================================================================
> > --- linux.orig/arch/mips/mm/init.c	2005-01-20 16:26:58.791321462 -0500
> > +++ linux/arch/mips/mm/init.c	2005-01-20 16:34:27.231213174 -0500
> > @@ -24,6 +24,7 @@
> >  #include <linux/bootmem.h>
> >  #include <linux/highmem.h>
> >  #include <linux/swap.h>
> > +#include <linux/proc_fs.h>
> >  
> >  #include <asm/bootinfo.h>
> >  #include <asm/cachectl.h>
> > @@ -197,6 +198,11 @@
> >  	return 0;
> >  }
> >  
> > +static struct kcore_list kcore_mem, kcore_vmalloc;
> > +#ifdef CONFIG_MIPS64
> > +static struct kcore_list kcore_kseg0;
> > +#endif
> > +
> >  void __init mem_init(void)
> >  {
> >  	unsigned long codesize, reservedpages, datasize, initsize;
> > @@ -247,6 +253,16 @@
> >  	datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
> >  	initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
> >  
> > +#ifdef CONFIG_MIPS64
> > +	if ((unsigned long) &_text > (unsigned long) CKSEG0)
> > +		/* The -4 is a hack so that user tools don't have to handle
> > +		   the overflow.  */
> > +		kclist_add(&kcore_kseg0, (void *) CKSEG0, 0x80000000 - 4);
> > +#endif
> > +	kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT);
> > +	kclist_add(&kcore_vmalloc, (void *)VMALLOC_START,
> > +		   VMALLOC_END-VMALLOC_START);
> > +
> >  	printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, "
> >  	       "%ldk reserved, %ldk data, %ldk init, %ldk highmem)\n",
> >  	       (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),

-- 
Martin Michlmayr
http://www.cyrius.com/

From tbm@cyrius.com Mon Jan 16 15:56:09 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 15:56:26 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:60689 "EHLO
	sorrow.cyrius.com") by ftp.linux-mips.org with ESMTP
	id S8133495AbWAPP4I (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 15:56:08 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id 4D6EA64D54; Mon, 16 Jan 2006 15:59:40 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id A0AA98517; Mon, 16 Jan 2006 15:59:31 +0000 (GMT)
Date:	Mon, 16 Jan 2006 15:59:31 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	Ed Martini <martini@c2micro.com>
Cc:	linux-mips@linux-mips.org, macro@linux-mips.org
Subject: Re: inconsistent asm macro
Message-ID: <20060116155931.GF26771@deprecation.cyrius.com>
References: <424A04A9.9060703@c2micro.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <424A04A9.9060703@c2micro.com>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9896
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1491
Lines: 45

* Ed Martini <martini@c2micro.com> [2005-03-29 17:45]:
> In include/asm-mips/interrupt.h, the definition for local_irq_restore is 
> inconsistent in its use of .reorder/.noreorder assembler directives.  
> Other asm macros in interrupt.h are wrapped with '.set push' and '.set pop'.
> 
> It doesn't seem to be a problem with the 2.96 mipsel-linux- assembler, 
> but it caused me a problem with my 4.0-based toolchain.  (As it was the 
> local_irq_restore left the assembler in 'reorder' mode and a stack 
> pointer post-inc was reordered out of the return delay slot where it 
> belonged.)  Luckily we have a sharp compiler guy who figured it out.  
> Thanks.
> 
> As usual, there may be a reason for this, but it took me a whole day to 
> find it, and I thought I'd point it out.

Maciej, since you use gcc 4, can you please review this patch?

> Ed Martini
> 
> $ diff -uN interrupt.h interrupt-new.h
> --- interrupt.h 2005-03-29 17:35:02.922362384 -0800
> +++ interrupt-new.h     2005-03-29 17:33:26.350770293 -0800
> @@ -100,6 +100,7 @@
> 
> __asm__ (
>        ".macro\tlocal_irq_restore flags\n\t"
> +       ".set\tpush\n\t"
>        ".set\tnoreorder\n\t"
>        ".set\tnoat\n\t"
>        "mfc0\t$1, $12\n\t"
> @@ -109,8 +110,7 @@
>        "or\t\\flags, $1\n\t"
>        "mtc0\t\\flags, $12\n\t"
>        "irq_disable_hazard\n\t"
> -       ".set\tat\n\t"
> -       ".set\treorder\n\t"
> +       ".set\tpop\n\t"
>        ".endm");
> 
> 
> 

-- 
Martin Michlmayr
http://www.cyrius.com/

From tbm@cyrius.com Mon Jan 16 15:57:12 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 15:57:48 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:61201 "EHLO
	sorrow.cyrius.com") by ftp.linux-mips.org with ESMTP
	id S8133495AbWAPP5M (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 15:57:12 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id 3605464D54; Mon, 16 Jan 2006 16:00:41 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id DAF278517; Mon, 16 Jan 2006 16:00:31 +0000 (GMT)
Date:	Mon, 16 Jan 2006 16:00:31 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	Dave Johnson <djohnson+linuxmips@sw.starentnetworks.com>
Cc:	linux-mips@linux-mips.org
Subject: Re: [PATCH] gettimeofday jumps backwards then forwards
Message-ID: <20060116160031.GA28383@deprecation.cyrius.com>
References: <17118.25343.948383.547250@cortez.sw.starentnetworks.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <17118.25343.948383.547250@cortez.sw.starentnetworks.com>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9897
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 10934
Lines: 329

* Dave Johnson <djohnson+linuxmips@sw.starentnetworks.com> [2005-07-20 10:43]:
> Below are 2 fixes I made to 2.6.12 to do with time jumping around
> as reported by gettimeofday().  One is SB1250 specific and one appears
> generic.
> 
> The symptom is revealed by running multile copies (1 per cpu) of a
> simple test program that calls gettimeofday() as fast as possible
> looking for time to go backwards.
> 
> When a jump is detected the program outputs a few samples before and
> after each jump:

Does anyone have comments regarding this patch?

> value               delta
> 1121781527.912525:      1
> 1121781527.912525:      0
> 1121781527.912526:      1
> 1121781527.912526:      0
> 1121781527.912527:      1
> 1121781527.912527:      0
> 1121781527.912527:      0
> 1121781527.912527:      0
> 1121781527.911528:   -999
> 1121781527.911529:      1
> 1121781527.911530:      1
> 1121781527.912532:   1002
> 1121781527.912533:      1
> 1121781527.912533:      0
> 1121781527.912534:      1
> 1121781527.912534:      0
> 1121781527.912535:      1
> 1121781527.912536:      1
> 
> value               delta
> 1121781545.635524:      1
> 1121781545.635524:      0
> 1121781545.635525:      1
> 1121781545.635525:      0
> 1121781545.635526:      1
> 1121781545.635526:      0
> 1121781545.635527:      1
> 1121781545.635527:      0
> 1121781545.634527:  -1000
> 1121781545.635527:   1000
> 1121781545.635528:      1
> 1121781545.635529:      1
> 1121781545.635529:      0
> 1121781545.635530:      1
> 1121781545.635530:      0
> 1121781545.635531:      1
> 1121781545.635531:      0
> 1121781545.635532:      1
> 1121781545.635533:      1
> 
> Time jumps backwards 1msec then forwards 1msec a few usec
> later.  Usually lasts < 2us but I've seen it as long as 5us if the
> system is under load.
> 
> --
> 
> First problem I found is that sb1250_gettimeoffset() simply reads the
> current cpu 0 timer remaining value, however once this counter reaches
> 0 and the interrupt is raised, it immediately resets and begins to
> count down again.
> 
> If sb1250_gettimeoffset() is called on cpu 1 via do_gettimeofday()
> after the timer has reset but prior to cpu 0 processing the interrupt
> and taking write_seqlock() in timer_interrupt() it will return a
> full value (or close to it) causing time to jump backwards 1ms. Once
> cpu 0 handles the interrupt and timer_interrupt() gets far enough
> along it will jump forward 1ms.
> 
> To fix this problem I implemented mips_hpt_*() on sb1250 using a spare
> timer unrelated to the existing periodic interrupt timers. It runs at
> 1Mhz with a full 23bit counter.  This eliminated the custom
> do_gettimeoffset() for sb1250 and allowed use of the generic
> fixed_rate_gettimeoffset() using mips_hpt_*() and timerhi/timerlo.
> 
> --
> 
> The second problem is that more of timer_interrupt() needs to be
> protected by xtime_lock:
> 
> * do_timer() expects the arch-specific handler to take the lock as it
>   modifies jiffies[_64] and xtime.
> * writing timerhi/lo in timer_interrupt() will mess up
>   fixed_rate_gettimeoffset() which reads timerhi/lo.
> 
> --
> 
> With both changes do_gettimeofday() works correctly on both cpu 0 and
> cpu 1.
> 
> --
> 
> Other changes/cleanups:
> 
> The existing sb1250 periodic timers were slow by 999ppm (given a
> perfect 100mhz reference).  The timers need to be loaded with 1 less
> than the desired interval not the interval itself.
> 
> M_SCD_TIMER_INIT and M_SCD_TIMER_CNT had the wrong field width (should
> be 23 bits not 20 bits)
> 
> -- 
> Dave Johnson
> Starent Networks
> 
> ============
> 
> diff -Nru a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
> --- a/arch/mips/kernel/time.c	2005-07-20 10:25:22 -04:00
> +++ b/arch/mips/kernel/time.c	2005-07-20 10:25:22 -04:00
> @@ -424,6 +424,8 @@
>  	unsigned long j;
>  	unsigned int count;
>  
> +	write_seqlock(&xtime_lock);
> +
>  	count = mips_hpt_read();
>  	mips_timer_ack();
>  
> @@ -441,7 +443,6 @@
>  	 * CMOS clock accordingly every ~11 minutes. rtc_set_time() has to be
>  	 * called as close as possible to 500 ms before the new second starts.
>  	 */
> -	write_seqlock(&xtime_lock);
>  	if ((time_status & STA_UNSYNC) == 0 &&
>  	    xtime.tv_sec > last_rtc_update + 660 &&
>  	    (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
> @@ -453,7 +454,6 @@
>  			last_rtc_update = xtime.tv_sec - 600;
>  		}
>  	}
> -	write_sequnlock(&xtime_lock);
>  
>  	/*
>  	 * If jiffies has overflown in this timer_interrupt, we must
> @@ -495,6 +495,8 @@
>  			break;
>  		}
>  	}
> +
> +	write_sequnlock(&xtime_lock);
>  
>  	/*
>  	 * In UP mode, we call local_timer_interrupt() to do profiling
> diff -Nru a/arch/mips/sibyte/sb1250/time.c b/arch/mips/sibyte/sb1250/time.c
> --- a/arch/mips/sibyte/sb1250/time.c	2005-07-20 10:25:22 -04:00
> +++ b/arch/mips/sibyte/sb1250/time.c	2005-07-20 10:25:22 -04:00
> @@ -47,23 +47,51 @@
>  #define IMR_IP3_VAL	K_INT_MAP_I1
>  #define IMR_IP4_VAL	K_INT_MAP_I2
>  
> +#define SB1250_HPT_NUM		3
> +#define SB1250_HPT_VALUE	M_SCD_TIMER_CNT /* max value */
> +#define SB1250_HPT_SHIFT	((sizeof(unsigned int)*8)-V_SCD_TIMER_WIDTH)
> +
> +
>  extern int sb1250_steal_irq(int irq);
>  
> +static unsigned int sb1250_hpt_read(void);
> +static void sb1250_hpt_init(unsigned int);
> +
> +static unsigned int hpt_offset;
> +
> +void __init sb1250_hpt_setup(void)
> +{
> +	int cpu = smp_processor_id();
> +
> +	if (!cpu) {
> +		/* Setup hpt using timer #3 but do not enable irq for it */
> +		__raw_writeq(0, IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CFG)));
> +		__raw_writeq(SB1250_HPT_VALUE,
> +			     IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_INIT)));
> +		__raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS,
> +			     IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CFG)));
> +
> +		/*
> +		 * we need to fill 32 bits, so just use the upper 23 bits and pretend
> +		 * the timer is going 512Mhz instead of 1Mhz
> +		 */
> +		mips_hpt_frequency = V_SCD_TIMER_FREQ << SB1250_HPT_SHIFT;
> +		mips_hpt_init = sb1250_hpt_init;
> +		mips_hpt_read = sb1250_hpt_read;
> +	}
> +}
> +
> +
>  void sb1250_time_init(void)
>  {
>  	int cpu = smp_processor_id();
>  	int irq = K_INT_TIMER_0+cpu;
>  
> -	/* Only have 4 general purpose timers */
> -	if (cpu > 3) {
> +	/* Only have 4 general purpose timers, and we use last one as hpt */
> +	if (cpu > 2) {
>  		BUG();
>  	}
>  
> -	if (!cpu) {
> -		/* Use our own gettimeoffset() routine */
> -		do_gettimeoffset = sb1250_gettimeoffset;
> -	}
> -
>  	sb1250_mask_irq(cpu, irq);
>  
>  	/* Map the timer interrupt to ip[4] of this cpu */
> @@ -75,10 +103,10 @@
>  	/* Disable the timer and set up the count */
>  	__raw_writeq(0, IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG)));
>  #ifdef CONFIG_SIMULATION
> -	__raw_writeq(50000 / HZ,
> +	__raw_writeq((50000 / HZ) - 1,
>  		     IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT)));
>  #else
> -	__raw_writeq(1000000 / HZ,
> +	__raw_writeq((V_SCD_TIMER_FREQ / HZ) - 1,
>  		     IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_INIT)));
>  #endif
>  
> @@ -104,7 +132,7 @@
>  	int cpu = smp_processor_id();
>  	int irq = K_INT_TIMER_0 + cpu;
>  
> -	/* Reset the timer */
> +	/* ACK interrupt */
>  	____raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS,
>  		       IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG)));
>  
> @@ -122,15 +150,26 @@
>  }
>  
>  /*
> - * We use our own do_gettimeoffset() instead of the generic one,
> - * because the generic one does not work for SMP case.
> - * In addition, since we use general timer 0 for system time,
> - * we can get accurate intra-jiffy offset without calibration.
> + * The HPT is free running from SB1250_HPT_VALUE down to 0 then starts over
> + * again. There's no easy way to set to a specific value so store init value
> + * in hpt_offset and subtract each time.
> + *
> + * Note: Timer isn't full 32bits so shift it into the upper part making
> + *       it appear to run at a higher frequency.
>   */
> -unsigned long sb1250_gettimeoffset(void)
> +static unsigned int sb1250_hpt_read(void)
>  {
> -	unsigned long count =
> -		__raw_readq(IOADDR(A_SCD_TIMER_REGISTER(0, R_SCD_TIMER_CNT)));
> +	unsigned int count;
> +
> +	count = G_SCD_TIMER_CNT(__raw_readq(IOADDR(A_SCD_TIMER_REGISTER(SB1250_HPT_NUM, R_SCD_TIMER_CNT))));
>  
> -	return 1000000/HZ - count;
> - }
> +	count = (SB1250_HPT_VALUE - count) << SB1250_HPT_SHIFT;
> +
> +	return count - hpt_offset;
> +}
> +
> +static void sb1250_hpt_init(unsigned int count)
> +{
> +	hpt_offset = count;
> +	return;
> +}
> diff -Nru a/arch/mips/sibyte/swarm/setup.c b/arch/mips/sibyte/swarm/setup.c
> --- a/arch/mips/sibyte/swarm/setup.c	2005-07-20 10:25:22 -04:00
> +++ b/arch/mips/sibyte/swarm/setup.c	2005-07-20 10:25:22 -04:00
> @@ -64,6 +64,12 @@
>  	return "SiByte " SIBYTE_BOARD_NAME;
>  }
>  
> +void __init swarm_time_init(void)
> +{
> +	/* Setup HPT */
> +	sb1250_hpt_setup();
> +}
> +
>  void __init swarm_timer_setup(struct irqaction *irq)
>  {
>          /*
> @@ -96,6 +102,7 @@
>  
>  	panic_timeout = 5;  /* For debug.  */
>  
> +	board_time_init = swarm_time_init;
>  	board_timer_setup = swarm_timer_setup;
>  	board_be_handler = swarm_be_handler;
>  
> diff -Nru a/include/asm-mips/sibyte/sb1250.h b/include/asm-mips/sibyte/sb1250.h
> --- a/include/asm-mips/sibyte/sb1250.h	2005-07-20 10:25:22 -04:00
> +++ b/include/asm-mips/sibyte/sb1250.h	2005-07-20 10:25:22 -04:00
> @@ -41,8 +41,8 @@
>  extern unsigned int periph_rev;
>  extern unsigned int zbbus_mhz;
>  
> +extern void sb1250_hpt_setup(void);
>  extern void sb1250_time_init(void);
> -extern unsigned long sb1250_gettimeoffset(void);
>  extern void sb1250_mask_irq(int cpu, int irq);
>  extern void sb1250_unmask_irq(int cpu, int irq);
>  extern void sb1250_smp_finish(void);
> diff -Nru a/include/asm-mips/sibyte/sb1250_scd.h b/include/asm-mips/sibyte/sb1250_scd.h
> --- a/include/asm-mips/sibyte/sb1250_scd.h	2005-07-20 10:25:22 -04:00
> +++ b/include/asm-mips/sibyte/sb1250_scd.h	2005-07-20 10:25:22 -04:00
> @@ -307,14 +307,15 @@
>   */
>  
>  #define V_SCD_TIMER_FREQ            1000000
> +#define V_SCD_TIMER_WIDTH           23
>  
>  #define S_SCD_TIMER_INIT            0
> -#define M_SCD_TIMER_INIT            _SB_MAKEMASK(20,S_SCD_TIMER_INIT)
> +#define M_SCD_TIMER_INIT            _SB_MAKEMASK(V_SCD_TIMER_WIDTH,S_SCD_TIMER_INIT)
>  #define V_SCD_TIMER_INIT(x)         _SB_MAKEVALUE(x,S_SCD_TIMER_INIT)
>  #define G_SCD_TIMER_INIT(x)         _SB_GETVALUE(x,S_SCD_TIMER_INIT,M_SCD_TIMER_INIT)
>  
>  #define S_SCD_TIMER_CNT             0
> -#define M_SCD_TIMER_CNT             _SB_MAKEMASK(20,S_SCD_TIMER_CNT)
> +#define M_SCD_TIMER_CNT             _SB_MAKEMASK(V_SCD_TIMER_WIDTH,S_SCD_TIMER_CNT)
>  #define V_SCD_TIMER_CNT(x)         _SB_MAKEVALUE(x,S_SCD_TIMER_CNT)
>  #define G_SCD_TIMER_CNT(x)         _SB_GETVALUE(x,S_SCD_TIMER_CNT,M_SCD_TIMER_CNT)

-- 
Martin Michlmayr
http://www.cyrius.com/

From tbm@cyrius.com Mon Jan 16 16:01:15 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 16:01:36 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:65297 "EHLO
	sorrow.cyrius.com") by ftp.linux-mips.org with ESMTP
	id S8133495AbWAPQBP (ORCPT <rfc822;linux-mips@linux-mips.org>);
	Mon, 16 Jan 2006 16:01:15 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id 3BFB164D54; Mon, 16 Jan 2006 16:04:43 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id 856D88517; Mon, 16 Jan 2006 16:03:55 +0000 (GMT)
Date:	Mon, 16 Jan 2006 16:03:55 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	Jim Gifford <maillist@jg555.com>,
	Linux MIPS List <linux-mips@linux-mips.org>
Subject: Re: Tulip RaQ2 64 Bit Fix
Message-ID: <20060116160355.GB28383@deprecation.cyrius.com>
References: <4393CD9F.3090305@jg555.com> <20051205114456.GA2728@linux-mips.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20051205114456.GA2728@linux-mips.org>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9898
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 521
Lines: 15

* Ralf Baechle <ralf@linux-mips.org> [2005-12-05 11:44]:
> > The attached patch allows the tulip driver to work with the RaQ2's
> > network adapter. Without the patch under a 64 bit build, it will
> > never negotiate and will drop packets. This driver is part of
> > Linux Parisc, by Grant Grundler. It's currently in -mm, but Jeff
> > Garzick will not apply it to the main tree.
> 
> Why?

Jim, I don't think you ever responded to this.

Do you know the status of this patch?
-- 
Martin Michlmayr
http://www.cyrius.com/

From tbm@cyrius.com Mon Jan 16 16:02:56 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 16:03:16 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:2578 "EHLO sorrow.cyrius.com")
	by ftp.linux-mips.org with ESMTP id S8133495AbWAPQCy (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 16 Jan 2006 16:02:54 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id 3D08B64D54; Mon, 16 Jan 2006 16:06:25 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id A3E8E8517; Mon, 16 Jan 2006 16:05:42 +0000 (GMT)
Date:	Mon, 16 Jan 2006 16:05:42 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	Mark Mason <mason@broadcom.com>
Cc:	linux-mips@linux-mips.org
Subject: Re: Building the kernel for a Broadcom SB1
Message-ID: <20060116160542.GC28383@deprecation.cyrius.com>
References: <20050915205904.16380.qmail@web31515.mail.mud.yahoo.com> <4329ED24.50506@broadcom.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4329ED24.50506@broadcom.com>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9899
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1620
Lines: 40

* Mark Mason <mason@broadcom.com> [2005-09-15 14:52]:
> >I'm having a few issues building the current >2.6.14-rc1 for a
> Broadcom SB1 MIPS64 processor. (No >huge surprise there, building
> anything for that >processor is a pain.)
> >
> >Anyway, there are a few symbols undefined, which is >causing
> problems. First off the bat is TO_PHYS_MASK.  >There is no set of
> definitions in >include/asm-mips/addrspace.h for the SB1 processor.

> Here's the patch for that particular problem.  There's also a few other 
> patches for the SB1 floating around (check the email archives), but 
> there appears to be a backlog with getting them committed to the CVS 
> repository.

Can this patch be applied?

> HTH,
> Mark
> 
> Index: include/asm-mips/addrspace.h
> ===================================================================
> RCS file: /home/cvs/linux/include/asm-mips/addrspace.h,v
> retrieving revision 1.18
> diff -u -p -r1.18 addrspace.h
> --- include/asm-mips/addrspace.h    14 Jul 2005 12:05:08 -0000    1.18
> +++ include/asm-mips/addrspace.h    15 Sep 2005 21:46:56 -0000
> @@ -131,6 +131,8 @@
>     || defined (CONFIG_CPU_R5000)                    \
>     || defined (CONFIG_CPU_NEVADA)                    \
>     || defined (CONFIG_CPU_TX49XX)                    \
> +    || defined (CONFIG_CPU_SB1)                        \
> +    || defined (CONFIG_CPU_SB1A)                    \
>     || defined (CONFIG_CPU_MIPS64_R1)
> #define KUSIZE        _LLCONST_(0x0000010000000000)    /* 2^^40 */
> #define KUSIZE_64    _LLCONST_(0x0000010000000000)    /* 2^^40 */
> .
> 
-- 
Martin Michlmayr
http://www.cyrius.com/

From tbm@cyrius.com Mon Jan 16 16:06:13 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 16:06:31 +0000 (GMT)
Received: from sorrow.cyrius.com ([65.19.161.204]:6930 "EHLO sorrow.cyrius.com")
	by ftp.linux-mips.org with ESMTP id S8133509AbWAPQGN (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 16 Jan 2006 16:06:13 +0000
Received: by sorrow.cyrius.com (Postfix, from userid 10)
	id 2F61264D54; Mon, 16 Jan 2006 16:09:37 +0000 (UTC)
Received: by deprecation.cyrius.com (Postfix, from userid 1000)
	id 108F88517; Mon, 16 Jan 2006 16:09:25 +0000 (GMT)
Date:	Mon, 16 Jan 2006 16:09:25 +0000
From:	Martin Michlmayr <tbm@cyrius.com>
To:	Dave Johnson <djohnson+linuxmips@sw.starentnetworks.com>,
	Daniel Jacobowitz <dan@debian.org>
Cc:	linux-mips@linux-mips.org
Subject: Re: gdb gets confused with o32 core files, WANT_COMPAT_REG_H needed?
Message-ID: <20060116160925.GE28383@deprecation.cyrius.com>
References: <17162.16068.212165.340275@cortez.sw.starentnetworks.com> <20050828154530.GA26423@nevyn.them.org> <17162.16068.212165.340275@cortez.sw.starentnetworks.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20050828154530.GA26423@nevyn.them.org> <17162.16068.212165.340275@cortez.sw.starentnetworks.com>
User-Agent: Mutt/1.5.11
Return-Path: <tbm@cyrius.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9900
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: tbm@cyrius.com
Precedence: bulk
X-list: linux-mips
Content-Length: 2192
Lines: 62

* Dave Johnson <djohnson+linuxmips@sw.starentnetworks.com> [2005-08-22 17:08]:
> I've been trying to fix core file support for 64bit kernel with o32
> userspace (working against 2.6.12 cvs tag).
> 
> After applying the patch posted on 13 Feb 2005 from Daniel Jacobowitz
> to fix binfmt_elfo32.c (any reason this didn't make it into CVS?),
> I still ran into trouble with gdb not understanding the NT_PRSTATUS
> header in the core file.
> 
> While Dan's fix makes the kernel use elf32 definitions, gdb was still
> getting confused by pr_reg contained in the core file.
> 
> Dan's definition of ELF_CORE_COPY_REGS in binfmt_elfo32.c is copying
> the registers using EF_R0 as 0 not 6 producing results into offset 0
> through 37 not 6 through 43 as gdb expects for 32bit core files.
> 
> Below patch (applied after Dan's patch) writes the registers at offset
> 6 making gdb much happier.

* Daniel Jacobowitz <dan@debian.org> [2005-08-28 11:45]:
> > Below patch (applied after Dan's patch) writes the registers at offset
> > 6 making gdb much happier.
> 
> FYI, this has all been rearranged since - it did this correctly at the
> time.  I don't know why the patch was dropped.

Can this be applied?


> Fix o32 core files under 64bit kernel to use correct register
> offset in NT_PRSTATUS
> 
> Signed-off-by: Dave Johnson <djohnson+linuxmips@sw.starentnetworks.com>
> 
> ===== arch/mips/kernel/binfmt_elfo32.c 1.7 vs edited =====
> --- 1.7/arch/mips/kernel/binfmt_elfo32.c	2005-08-20 12:30:12 -04:00
> +++ edited/arch/mips/kernel/binfmt_elfo32.c	2005-08-22 16:09:59 -04:00
> @@ -51,6 +51,7 @@
>  #define TASK32_SIZE		0x7fff8000UL
>  #undef ELF_ET_DYN_BASE
>  #define ELF_ET_DYN_BASE         (TASK32_SIZE / 3 * 2)
> +#define WANT_COMPAT_REG_H
>  
>  #include <asm/processor.h>
>  #include <linux/module.h>
> ===== include/asm-mips/reg.h 1.1 vs edited =====
> --- 1.1/include/asm-mips/reg.h	2005-02-02 11:39:14 -05:00
> +++ edited/include/asm-mips/reg.h	2005-08-22 15:55:04 -04:00
> @@ -70,7 +70,7 @@
>  
>  #endif
>  
> -#if CONFIG_MIPS64
> +#if defined(CONFIG_MIPS64) && !defined(WANT_COMPAT_REG_H)
>  
>  #define EF_R0			 0
>  #define EF_R1			 1
> 

-- 
Martin Michlmayr
http://www.cyrius.com/

From maillist@jg555.com Mon Jan 16 16:24:37 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 16:24:56 +0000 (GMT)
Received: from Jg555.com ([64.30.195.78]:22183 "EHLO jg555.com")
	by ftp.linux-mips.org with ESMTP id S8133509AbWAPQYg (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 16 Jan 2006 16:24:36 +0000
Received: from [172.16.0.55] ([::ffff:172.16.0.55])
  (AUTH: PLAIN root, TLS: TLSv1/SSLv3,256bits,AES256-SHA)
  by jg555.com with esmtp; Mon, 16 Jan 2006 08:28:08 -0800
  id 001F0A6F.43CBC998.00007288
Message-ID: <43CBC97E.3090800@jg555.com>
Date:	Mon, 16 Jan 2006 08:27:42 -0800
From:	Jim Gifford <maillist@jg555.com>
User-Agent: Thunderbird 1.5 (Windows/20051201)
MIME-Version: 1.0
To:	Martin Michlmayr <tbm@cyrius.com>
CC:	Linux MIPS List <linux-mips@linux-mips.org>
Subject: Re: Tulip RaQ2 64 Bit Fix
References: <4393CD9F.3090305@jg555.com> <20051205114456.GA2728@linux-mips.org> <20060116160355.GB28383@deprecation.cyrius.com>
In-Reply-To: <20060116160355.GB28383@deprecation.cyrius.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Return-Path: <maillist@jg555.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9901
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: maillist@jg555.com
Precedence: bulk
X-list: linux-mips
Content-Length: 1811
Lines: 43

Martin Michlmayr wrote:
> * Ralf Baechle <ralf@linux-mips.org> [2005-12-05 11:44]:
>   
>>> The attached patch allows the tulip driver to work with the RaQ2's
>>> network adapter. Without the patch under a 64 bit build, it will
>>> never negotiate and will drop packets. This driver is part of
>>> Linux Parisc, by Grant Grundler. It's currently in -mm, but Jeff
>>> Garzick will not apply it to the main tree.
>>>       
>> Why?
>>     
>
> Jim, I don't think you ever responded to this.
>
> Do you know the status of this patch?
>   
Jeff Garzick refuses to apply it do to spinlocks. Andrew Morton is 
including in his tree because it fixes issue with Parisc and with MIPS 
based builds. So it's kinda of what is the right thing to do. I also use 
this driver on my x86 builds, and it actually performs better. Here is a 
little history of how Grant made the driver.

Grant Grundler is the network maintainer for Parisc Linux.
He discovered that the tulip driver didn't perform that well. He 
researched the manufactures documentation and found out how to fix the 
driver to work to its optimum performance. He did this back in 2003, has 
submitted it to Jeff Garzick several times with no response. Around late 
2004, I started to do test builds on 64 bit on my RaQ2 and discovered 
that the driver would not auto-negotiate transfer speeds. Talked to 
numerous people, then someone put me in touch with Grant. I tested the 
driver for about 2 weeks, ask Grant why it wasn't sent upstream, he told 
me about the spinlock issue. I then contacted Andrew Morton, explained 
everything as I am here, and he agreed it was needed and tried to get 
Jeff to add it. Jeff sends back a one liner say doing to it's use of 
spinlocks it's not accepted.

That's the gory history.

-- 
----
Jim Gifford
maillist@jg555.com


From maillist@jg555.com Mon Jan 16 16:29:41 2006
Received: with ECARTIS (v1.0.0; list linux-mips); Mon, 16 Jan 2006 16:30:01 +0000 (GMT)
Received: from Jg555.com ([64.30.195.78]:24487 "EHLO jg555.com")
	by ftp.linux-mips.org with ESMTP id S8133509AbWAPQ3l (ORCPT
	<rfc822;linux-mips@linux-mips.org>); Mon, 16 Jan 2006 16:29:41 +0000
Received: from [172.16.0.55] ([::ffff:172.16.0.55])
  (AUTH: PLAIN root, TLS: TLSv1/SSLv3,256bits,AES256-SHA)
  by jg555.com with esmtp; Mon, 16 Jan 2006 08:33:11 -0800
  id 001F0A73.43CBCAC7.00007371
Message-ID: <43CBCAAE.6030403@jg555.com>
Date:	Mon, 16 Jan 2006 08:32:46 -0800
From:	Jim Gifford <maillist@jg555.com>
User-Agent: Thunderbird 1.5 (Windows/20051201)
MIME-Version: 1.0
To:	Martin Michlmayr <tbm@cyrius.com>
CC:	Peter Horton <pdh@colonel-panic.org>, linux-mips@linux-mips.org,
	ralf@linux-mips.org
Subject: Re: [PATCH Cobalt 1/1] 64-bit fix
References: <20050414185949.GA5578@skeleton-jack> <20060116154543.GA26771@deprecation.cyrius.com>
In-Reply-To: <20060116154543.GA26771@deprecation.cyrius.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Return-Path: <maillist@jg555.com>
X-Envelope-To: <"|/home/ecartis/ecartis -s linux-mips"> (uid 0)
X-Orcpt: rfc822;linux-mips@linux-mips.org
Original-Recipient: rfc822;linux-mips@linux-mips.org
X-archive-position: 9902
X-ecartis-version: Ecartis v1.0.0
Sender: linux-mips-bounce@linux-mips.org
Errors-to: linux-mips-bounce@linux-mips.org
X-original-sender: maillist@jg555.com
Precedence: bulk
X-list: linux-mips
Content-Length: 10134
Lines: 334

Here's a link to the updated patch. Works under 2.6.15
http://www.linuxfromscratch.org/patches/downloads/linux/linux-2.6.15-mips_fix-1.patch

This include the iomap.c, which is not accepted by Ralf.

Submitted By: Jim Gifford (patches at jg555 dot com)
Date: 2006-01-09
Initial Package Version: 2.6.15
Origin: Jim Gifford
Upstream Status: Not Accepted
Description: Various Fixes for MIPS architectures

diff -Naur linux-2.6.15.orig/arch/mips/lib/Makefile 
linux-2.6.15/arch/mips/lib/Makefile
--- linux-2.6.15.orig/arch/mips/lib/Makefile    2006-01-09 
21:32:16.000000000 +0000
+++ linux-2.6.15/arch/mips/lib/Makefile    2006-01-09 21:37:56.000000000 
+0000
@@ -5,4 +5,6 @@
 lib-y    += csum_partial_copy.o memcpy.o promlib.o strlen_user.o 
strncpy_user.o \
        strnlen_user.o uncached.o
 
+obj-y    += iomap.o
+
 EXTRA_AFLAGS := $(CFLAGS)
diff -Naur linux-2.6.15.orig/arch/mips/lib/iomap.c 
linux-2.6.15/arch/mips/lib/iomap.c
--- linux-2.6.15.orig/arch/mips/lib/iomap.c    1970-01-01 
00:00:00.000000000 +0000
+++ linux-2.6.15/arch/mips/lib/iomap.c    2006-01-09 21:37:56.000000000 
+0000
@@ -0,0 +1,78 @@
+/*
+ *  iomap.c, Memory Mapped I/O routines for MIPS architecture.
+ *
+ *  This code is based on lib/iomap.c, by Linus Torvalds.
+ *
+ *  Copyright (C) 2004-2005  Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
+ *
+ *  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
+ */
+#include <linux/ioport.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+
+#include <asm/io.h>
+
+void __iomem *ioport_map(unsigned long port, unsigned int nr)
+{
+    unsigned long end;
+
+    end = port + nr - 1UL;
+    if (ioport_resource.start > port ||
+        ioport_resource.end < end || port > end)
+        return NULL;
+
+    return (void __iomem *)(mips_io_port_base + port);
+}
+
+void ioport_unmap(void __iomem *addr)
+{
+}
+EXPORT_SYMBOL(ioport_map);
+EXPORT_SYMBOL(ioport_unmap);
+
+void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
+{
+    unsigned long start, len, flags;
+
+    if (dev == NULL)
+        return NULL;
+
+    start = pci_resource_start(dev, bar);
+    len = pci_resource_len(dev, bar);
+    if (!start || !len)
+        return NULL;
+
+    if (maxlen != 0 && len > maxlen)
+        len = maxlen;
+
+    flags = pci_resource_flags(dev, bar);
+    if (flags & IORESOURCE_IO)
+        return ioport_map(start, len);
+    if (flags & IORESOURCE_MEM) {
+        if (flags & IORESOURCE_CACHEABLE)
+            return ioremap_cacheable_cow(start, len);
+        return ioremap_nocache(start, len);
+    }
+
+    return NULL;
+}
+
+void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
+{
+    iounmap(addr);
+}
+EXPORT_SYMBOL(pci_iomap);
+EXPORT_SYMBOL(pci_iounmap);
diff -Naur linux-2.6.15.orig/include/asm-mips/addrspace.h 
linux-2.6.15/include/asm-mips/addrspace.h
--- linux-2.6.15.orig/include/asm-mips/addrspace.h    2006-01-03 
03:21:10.000000000 +0000
+++ linux-2.6.15/include/asm-mips/addrspace.h    2006-01-09 
20:47:10.000000000 +0000
@@ -124,7 +124,7 @@
 #define PHYS_TO_XKSEG_CACHED(p)        
PHYS_TO_XKPHYS(K_CALG_COH_SHAREABLE,(p))
 #define XKPHYS_TO_PHYS(p)        ((p) & TO_PHYS_MASK)
 #define PHYS_TO_XKPHYS(cm,a)        (_LLCONST_(0x8000000000000000) | \
-                     ((cm)<<59) | (a))
+                     ((unsigned long)(cm)<<59) | (a))
 
 #if defined (CONFIG_CPU_R4300)                        \
     || defined (CONFIG_CPU_R4X00)                    \
diff -Naur 
linux-2.6.15.orig/include/asm-mips/cobalt/cpu-feature-overrides.h 
linux-2.6.15/include/asm-mips/cobalt/cpu-feature-overrides.h
--- linux-2.6.15.orig/include/asm-mips/cobalt/cpu-feature-overrides.h    
1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.15/include/asm-mips/cobalt/cpu-feature-overrides.h    
2006-01-09 20:52:18.000000000 +0000
@@ -0,0 +1,17 @@
+/*
+ * 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.
+ *
+ * Copyright (C) 2006 Ralf Baechle
+ */
+#ifndef __ASM_COBALT_CPU_FEATURE_OVERRIDES_H
+#define __ASM_COBALT_CPU_FEATURE_OVERRIDES_H
+
+#ifdef CONFIG_64BIT
+#define cpu_has_llsc            0
+#else
+#define cpu_has_llsc            1
+#endif
+
+#endif /* __ASM_COBALT_CPU_FEATURE_OVERRIDES_H */
diff -Naur linux-2.6.15.orig/include/asm-mips/cobalt/ide.h 
linux-2.6.15/include/asm-mips/cobalt/ide.h
--- linux-2.6.15.orig/include/asm-mips/cobalt/ide.h    1970-01-01 
00:00:00.000000000 +0000
+++ linux-2.6.15/include/asm-mips/cobalt/ide.h    2006-01-09 
20:47:10.000000000 +0000
@@ -0,0 +1,83 @@
+
+/*
+ * PIO "in" transfers can cause D-cache lines to be allocated
+ * to the data being read. If the target is the page cache then
+ * the kernel can create a user space mapping of the same page
+ * without flushing it from the D-cache. This has large potential
+ * to create cache aliases. The Cobalts seem to trigger this
+ * problem easily.
+ *
+ * MIPs doesn't have a flush_dcache_range() so we roll
+ * our own.
+ *
+ * -- pdh
+ */
+
+#define MAX_HWIFS            2
+
+#include <asm/r4kcache.h>
+
+static inline void __flush_dcache(void)
+{
+    unsigned long dc_size, dc_line, addr, end;
+
+    dc_size = current_cpu_data.dcache.ways << 
current_cpu_data.dcache.waybit;
+    dc_line = current_cpu_data.dcache.linesz;
+
+    addr = CKSEG0;
+    end = addr + dc_size;
+
+    for (; addr < end; addr += dc_line)
+        flush_dcache_line_indexed(addr);
+}
+
+static inline void __flush_dcache_range(unsigned long start, unsigned 
long end)
+{
+    unsigned long dc_size, dc_line, addr;
+
+    dc_size = current_cpu_data.dcache.ways << 
current_cpu_data.dcache.waybit;
+    dc_line = current_cpu_data.dcache.linesz;
+
+    addr = start & ~(d