[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

wi.c::DELAY() vs MIPS port



深海です。

最近の wi.c の大きな変更の後、 mips port では wi.c がコンパイルができな
くなっています。 rev. 1.84 で for の中で DELAY() を使うような部分が追加
されているのですが、これが mips port では問題になるようです。
(i386 ではコンパイルできてしまいます)

DELAY() は sys/arch/*/include/param.h で定義されていて、 hpcmips では

#define	DELAY(n)	{ register int N = cpuspeed * (n); while (--N > 0); }

となっています。他の mips port でもほぼ同じ (なぜかちょっと違う ;) です。

sys/dev/ic/* では沢山 DELAY() が使われていますが、 for の中で使っている
物はなさそうでしたので、ちょっと書換えてみたらコンパイルできました。

パッチと、書き換え前のエラーを下に書いておきます。

たぶん書き換え前後で、タイミングとか待ち時間は変化しないような修正のつも
りなのですが... C 言語的に美しい書き方があれば、教えてください :)

category kern あたりに send-pr しときますので、フォローよろしくお願いし
ます。

(あとは route6d が動かないのをどうにかしないとだ...)

--
ふかうみ なおき

パッチ:
--- wi.c.orig	Fri Sep 27 10:52:24 2002
+++ wi.c	Fri Sep 27 17:30:52 2002
@@ -1407,9 +1407,10 @@
 	int			i, s = 0;
 
 	/* Wait 100us for the busy bit to clear. */
-	for (i = 10; i--; DELAY(10)) {
+	for (i = 10; i > 0; i--) {
 		if (!(CSR_READ_2(sc, WI_COMMAND) & WI_CMD_BUSY))
 			break;
+		DELAY(10);
 	}
 
 	if (i < 0) {
@@ -1426,7 +1427,7 @@
 	/* wait .4 second for the command to complete. study the
 	 * distribution of times.
 	 */
-	for (i = 2000; i--; DELAY(200)) {
+	for (i = 2000; i > 0; i--) {
 		/*
 		 * Wait for 'command complete' bit to be
 		 * set in the event status register.
@@ -1444,6 +1445,7 @@
 				return(EIO);
 			break;
 		}
+		DELAY(200);
 	}
 
 	if (i < 0) {
@@ -1468,9 +1470,10 @@
 	bzero(&sc->wi_current_bssid, sizeof(sc->wi_current_bssid));
 	bzero(&sc->wi_stats, sizeof(sc->wi_stats));
 
-	for (i = 5; i--; DELAY(5 * 1000)) {
+	for (i = 5; i > 0; i--) {
 		if (wi_cmd(sc, WI_CMD_INI, 0, 0, 0) == 0)
 			break;
+		DELAY(5 * 1000);
 	}
 	
 	if (i < 0)
@@ -1758,9 +1761,11 @@
 	CSR_WRITE_2(sc, selreg, id);
 	CSR_WRITE_2(sc, offreg, off);
 
-	for (i = WI_TIMEOUT; i--; DELAY(10))
+	for (i = WI_TIMEOUT; i > 0; i--) {
 		if (!(CSR_READ_2(sc, offreg) & (WI_OFF_BUSY|WI_OFF_ERR)))
 			break;
+		DELAY(10);
+	}
 
 	if (i < 0) {
 		printf("%s: timeout in wi_seek to %x/%x; last status %x\n",
@@ -1886,9 +1891,10 @@
 		return(ENOMEM);
 	}
 
-	for (i = WI_TIMEOUT; i--; DELAY(10)) {
+	for (i = WI_TIMEOUT; i > 0; i--) {
 		if (CSR_READ_2(sc, WI_EVENT_STAT) & WI_EV_ALLOC)
 			break;
+		DELAY(10);
 	}
 
 	if (i < 0) {

ログ:
depending the kern library objects
depending the compat library objects
/home/t/hpcmips/bin/mipsel--netbsd-gcc  -mips2 -EL -G 10 -mno-abicalls -mno-half-pic -ffreestanding  -Os -mmemcpy -Werror -Wall -Wno-main -Wno-format-zero-length -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes -Wno-uninitialized  -Dhpcmips -I.  -I/usr/src/sys/arch -I/usr/src/sys -nostdinc -DSOFTFLOAT -DMIPS3 -DMIPS3_4100 -DMIPS1 -DENABLE_MIPS_TX3900 -DKSEG2IOBUFSIZE="0x8000000" -DTX392X -DMSGBUFSIZE="0x2000" -DLKM -DMAXUSERS=16 -D_KERNEL -D_KERNEL_OPT   -c /usr/src/sys/dev/ic/wi.c
/usr/src/sys/dev/ic/wi.c: In function `wi_cmd':
/usr/src/sys/dev/ic/wi.c:1410: parse error before `{'
/usr/src/sys/dev/ic/wi.c:1410: `N' undeclared (first use in this function)
/usr/src/sys/dev/ic/wi.c:1410: (Each undeclared identifier is reported only once
/usr/src/sys/dev/ic/wi.c:1410: for each function it appears in.)
cc1: warnings being treated as errors
/usr/src/sys/dev/ic/wi.c:1407: warning: unused variable `s'
/usr/src/sys/dev/ic/wi.c:1410: warning: control reaches end of non-void function
/usr/src/sys/dev/ic/wi.c: At top level:
/usr/src/sys/dev/ic/wi.c:1410: parse error before `)'
/usr/src/sys/dev/ic/wi.c:1421: parse error before `bus_space_tag_t'
/usr/src/sys/dev/ic/wi.c:1422: parse error before `bus_space_tag_t'
/usr/src/sys/dev/ic/wi.c:1423: parse error before `bus_space_tag_t'
/usr/src/sys/dev/ic/wi.c:1424: parse error before `bus_space_tag_t'
/usr/src/sys/dev/ic/wi.c:1438: parse error before `bus_space_tag_t'
/usr/src/sys/dev/ic/wi.c: In function `wi_reset':
/usr/src/sys/dev/ic/wi.c:1471: parse error before `{'
/usr/src/sys/dev/ic/wi.c:1471: `N' undeclared (first use in this function)
/usr/src/sys/dev/ic/wi.c: At top level:
/usr/src/sys/dev/ic/wi.c:1471: parse error before `)'
/usr/src/sys/dev/ic/wi.c:1481: parse error before `bus_space_tag_t'
/usr/src/sys/dev/ic/wi.c:1482: parse error before `bus_space_tag_t'
/usr/src/sys/dev/ic/wi.c:1485: parse error before `&'
/usr/src/sys/dev/ic/wi.c:1485: warning: type defaults to `int' in declaration of `wi_write_record'
/usr/src/sys/dev/ic/wi.c:1485: warning: function declaration isn't a prototype
/usr/src/sys/dev/ic/wi.c:1485: warning: data definition has no type or storage class
/usr/src/sys/dev/ic/wi.c: In function `wi_seek':
/usr/src/sys/dev/ic/wi.c:1761: parse error before `{'
/usr/src/sys/dev/ic/wi.c:1761: `N' undeclared (first use in this function)
/usr/src/sys/dev/ic/wi.c:1726: warning: unused variable `status'
/usr/src/sys/dev/ic/wi.c:1761: warning: control reaches end of non-void function
/usr/src/sys/dev/ic/wi.c: At top level:
/usr/src/sys/dev/ic/wi.c:1761: parse error before `)'
/usr/src/sys/dev/ic/wi.c: In function `wi_alloc_nicmem':
/usr/src/sys/dev/ic/wi.c:1889: parse error before `{'
/usr/src/sys/dev/ic/wi.c:1889: `N' undeclared (first use in this function)
/usr/src/sys/dev/ic/wi.c:1889: warning: control reaches end of non-void function
/usr/src/sys/dev/ic/wi.c: At top level:
/usr/src/sys/dev/ic/wi.c:1889: parse error before `)'
/usr/src/sys/dev/ic/wi.c:1899: warning: type defaults to `int' in declaration of `id'
/usr/src/sys/dev/ic/wi.c:1899: `sc' undeclared here (not in a function)
/usr/src/sys/dev/ic/wi.c:1899: `sc' undeclared here (not in a function)
/usr/src/sys/dev/ic/wi.c:1899: `sc' undeclared here (not in a function)
/usr/src/sys/dev/ic/wi.c:1899: `sc' undeclared here (not in a function)
/usr/src/sys/dev/ic/wi.c:1899: warning: data definition has no type or storage class
/usr/src/sys/dev/ic/wi.c:1900: parse error before `bus_space_tag_t'
*** Error code 1

Stop.
nbmake: stopped in /usr/obj/hpcmips/sys/arch/hpcmips/compile/GENERIC