[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