Browse Source

Plan 9 from Bell Labs 2007-09-01

David du Colombier 16 years ago
parent
commit
cd694134b7
100 changed files with 251 additions and 25002 deletions
  1. 44 213
      dist/replica/_plan9.db
  2. 24 173
      dist/replica/plan9.db
  3. 173 0
      dist/replica/plan9.log
  4. 0 3
      lib/ndb/local.complicated
  5. 3 3
      sys/man/3/ip
  6. 0 2
      sys/src/9/alphapc/apc
  7. 0 2
      sys/src/9/alphapc/apccpu
  8. 0 1
      sys/src/9/bitsy/bitsy
  9. 0 1408
      sys/src/9/ip/il.c
  10. 0 2
      sys/src/9/ip/ip.h
  11. 0 2
      sys/src/9/ip/netlog.c
  12. 0 2
      sys/src/9/mtx/mtx
  13. 0 2
      sys/src/9/mtx/mtxcpu
  14. 0 2
      sys/src/9/pc/pc
  15. 0 2
      sys/src/9/pc/pcauth
  16. 0 2
      sys/src/9/pc/pccd
  17. 0 2
      sys/src/9/pc/pccpu
  18. 0 2
      sys/src/9/pc/pccpuf
  19. 0 2
      sys/src/9/pc/pcdisk
  20. 0 2
      sys/src/9/pc/pcf
  21. 0 2
      sys/src/9/pc/pcfl
  22. 0 1
      sys/src/9/pc/pcflop
  23. 0 2
      sys/src/9/ppc/blast
  24. 0 2
      sys/src/9/ppc/ucu
  25. 7 1
      sys/src/cmd/ndb/dblookup.c
  26. 0 178
      sys/src/fs/9netics32.16k/9net32.16kfs.c
  27. 0 35
      sys/src/fs/9netics32.16k/dat.h
  28. 0 87
      sys/src/fs/9netics32.16k/fns.h
  29. 0 247
      sys/src/fs/9netics32.16k/io.h
  30. 0 85
      sys/src/fs/9netics32.16k/mem.h
  31. 0 145
      sys/src/fs/9netics32.16k/mkfile
  32. 0 178
      sys/src/fs/9netics64.8k/9net64.8kfs.c
  33. 0 35
      sys/src/fs/9netics64.8k/dat.h
  34. 0 87
      sys/src/fs/9netics64.8k/fns.h
  35. 0 247
      sys/src/fs/9netics64.8k/io.h
  36. 0 85
      sys/src/fs/9netics64.8k/mem.h
  37. 0 145
      sys/src/fs/9netics64.8k/mkfile
  38. 0 1
      sys/src/fs/GOING.AWAY
  39. 0 177
      sys/src/fs/choline/9cholinefs.c
  40. 0 35
      sys/src/fs/choline/dat.h
  41. 0 87
      sys/src/fs/choline/fns.h
  42. 0 247
      sys/src/fs/choline/io.h
  43. 0 85
      sys/src/fs/choline/mem.h
  44. 0 147
      sys/src/fs/choline/mkfile
  45. 0 773
      sys/src/fs/dev/apc.c
  46. 0 2271
      sys/src/fs/dev/cw.c
  47. 0 106
      sys/src/fs/dev/fworm.c
  48. 0 1153
      sys/src/fs/dev/juke.c
  49. 0 3
      sys/src/fs/dev/mkfile
  50. 0 283
      sys/src/fs/dev/mworm.c
  51. 0 132
      sys/src/fs/dev/wren.c
  52. 0 68
      sys/src/fs/doc/changes
  53. 0 28
      sys/src/fs/doc/words
  54. 0 128
      sys/src/fs/doc/worm.fs
  55. 0 81
      sys/src/fs/doc/worm.fs64
  56. 0 150
      sys/src/fs/doc/worms.32-bit
  57. 0 177
      sys/src/fs/emelie/9emeliefs.c
  58. 0 35
      sys/src/fs/emelie/dat.h
  59. 0 87
      sys/src/fs/emelie/fns.h
  60. 0 247
      sys/src/fs/emelie/io.h
  61. 0 85
      sys/src/fs/emelie/mem.h
  62. 0 147
      sys/src/fs/emelie/mkfile
  63. 0 181
      sys/src/fs/fs/9fsfs.c
  64. 0 35
      sys/src/fs/fs/dat.h
  65. 0 87
      sys/src/fs/fs/fns.h
  66. 0 247
      sys/src/fs/fs/io.h
  67. 0 85
      sys/src/fs/fs/mem.h
  68. 0 147
      sys/src/fs/fs/mkfile
  69. 0 192
      sys/src/fs/fs64/9fsfs64.c
  70. 0 35
      sys/src/fs/fs64/dat.h
  71. 0 92
      sys/src/fs/fs64/fns.h
  72. 0 247
      sys/src/fs/fs64/io.h
  73. 0 89
      sys/src/fs/fs64/mem.h
  74. 0 146
      sys/src/fs/fs64/mkfile
  75. 0 515
      sys/src/fs/ip/arp.c
  76. 0 65
      sys/src/fs/ip/icmp.c
  77. 0 1069
      sys/src/fs/ip/il.c
  78. 0 235
      sys/src/fs/ip/ip.c
  79. 0 286
      sys/src/fs/ip/ip.h
  80. 0 76
      sys/src/fs/ip/ipaux.c
  81. 0 425
      sys/src/fs/ip/iproute.c
  82. 0 3
      sys/src/fs/ip/mkfile
  83. 0 247
      sys/src/fs/ip/sntp.c
  84. 0 47
      sys/src/fs/ip/udp.c
  85. 0 25
      sys/src/fs/mkfile
  86. 0 382
      sys/src/fs/pc/8250.c
  87. 0 351
      sys/src/fs/pc/8253.c
  88. 0 101
      sys/src/fs/pc/cga.c
  89. 0 107
      sys/src/fs/pc/compat.c
  90. 0 86
      sys/src/fs/pc/compat.h
  91. 0 858
      sys/src/fs/pc/dosfs.c
  92. 0 107
      sys/src/fs/pc/dosfs.h
  93. 0 1426
      sys/src/fs/pc/ether2114x.c
  94. 0 775
      sys/src/fs/pc/ether8139.c
  95. 0 1133
      sys/src/fs/pc/ether8169.c
  96. 0 1363
      sys/src/fs/pc/ether82557.c
  97. 0 1112
      sys/src/fs/pc/ether82563.c
  98. 0 1136
      sys/src/fs/pc/ether83815.c
  99. 0 1363
      sys/src/fs/pc/ether83815.mii.c
  100. 0 4
      sys/src/fs/pc/etherdat.h

+ 44 - 213
dist/replica/_plan9.db

@@ -1,8 +1,8 @@
 386 - 20000000775 sys sys 1010957353 0
 386/9load - 775 sys sys 1181763625 313856
-386/9loaddebug - 775 sys sys 1187321104 435045
+386/9loaddebug - 775 sys sys 1188593351 435045
 386/9loadlite - 775 sys sys 1176519517 137148
-386/9loadlitedebug - 775 sys sys 1186776564 220555
+386/9loadlitedebug - 775 sys sys 1188593356 220555
 386/9pc - 775 sys sys 1186023393 1937795
 386/9pc.gz - 664 sys sys 1186023393 829787
 386/9pccpu - 775 sys sys 1186023409 1657423
@@ -18,7 +18,7 @@
 386/bin/8l - 775 sys sys 1148500567 115711
 386/bin/9660srv - 775 sys sys 1168402261 104975
 386/bin/aan - 775 sys sys 1184731221 129822
-386/bin/acid - 775 sys sys 1181507261 405141
+386/bin/acid - 775 sys sys 1188530145 405176
 386/bin/acme - 775 sys sys 1187925279 431027
 386/bin/ape - 20000000775 sys sys 1016944144 0
 386/bin/ape/basename - 775 sys sys 1173754547 134719
@@ -117,7 +117,7 @@
 386/bin/aux/mklatinkbd - 775 sys sys 1168402282 64407
 386/bin/aux/mnihongo - 775 sys sys 1179372074 140068
 386/bin/aux/mouse - 775 sys sys 1148500597 44061
-386/bin/aux/ms2 - 775 sys sys 1178939751 88464
+386/bin/aux/ms2 - 775 sys sys 1188530147 88499
 386/bin/aux/msexceltables - 775 sys sys 1168402283 82921
 386/bin/aux/mswordstrings - 775 sys sys 1168402283 65541
 386/bin/aux/na - 775 sys sys 1168402284 154423
@@ -231,7 +231,7 @@
 386/bin/faces - 775 sys sys 1181507266 193265
 386/bin/factor - 775 sys sys 1168402307 61699
 386/bin/fcp - 775 sys sys 1168402307 82433
-386/bin/file - 775 sys sys 1178939751 128125
+386/bin/file - 775 sys sys 1188530150 128160
 386/bin/fmt - 775 sys sys 1168402307 65567
 386/bin/fortune - 775 sys sys 1168402308 67356
 386/bin/fossil - 20000000775 sys sys 1042005470 0
@@ -321,8 +321,8 @@
 386/bin/join - 775 sys sys 1168402330 114382
 386/bin/jpg - 775 sys sys 1179372097 174971
 386/bin/kbmap - 775 sys sys 1179372097 144063
-386/bin/kprof - 775 sys sys 1178939752 106496
-386/bin/ktrace - 775 sys sys 1178939752 124176
+386/bin/kprof - 775 sys sys 1188530153 106531
+386/bin/ktrace - 775 sys sys 1188530155 124211
 386/bin/lens - 775 sys sys 1179372097 151167
 386/bin/lex - 775 sys sys 1168402332 99261
 386/bin/lnfs - 775 sys sys 1188447258 100597
@@ -340,12 +340,12 @@
 386/bin/mug - 775 sys sys 1179372099 176427
 386/bin/mv - 775 sys sys 1168402336 66629
 386/bin/ndb - 20000000775 sys sys 985743147 0
-386/bin/ndb/cs - 775 sys sys 1184529902 149014
+386/bin/ndb/cs - 775 sys sys 1188530160 148982
 386/bin/ndb/csquery - 775 sys sys 1176488418 61652
-386/bin/ndb/dns - 775 sys sys 1186716659 294300
-386/bin/ndb/dnsdebug - 775 sys sys 1186716660 269466
+386/bin/ndb/dns - 775 sys sys 1188530167 294302
+386/bin/ndb/dnsdebug - 775 sys sys 1188530173 269468
 386/bin/ndb/dnsquery - 775 sys sys 1185334136 64350
-386/bin/ndb/dnstcp - 775 sys sys 1186716661 267315
+386/bin/ndb/dnstcp - 775 sys sys 1188530179 267317
 386/bin/ndb/ipquery - 775 sys sys 1178568296 95524
 386/bin/ndb/mkdb - 775 sys sys 1168402340 64211
 386/bin/ndb/mkhash - 775 sys sys 1178568296 83312
@@ -355,7 +355,7 @@
 386/bin/netstat - 775 sys sys 1169612032 85184
 386/bin/news - 775 sys sys 1168402341 71956
 386/bin/nfs - 775 sys sys 1184731239 320151
-386/bin/nm - 775 sys sys 1178939752 130155
+386/bin/nm - 775 sys sys 1188530182 130190
 386/bin/nntpfs - 775 sys sys 1179372100 165285
 386/bin/ns - 775 sys sys 1168402343 65492
 386/bin/p - 775 sys sys 1168402343 65220
@@ -373,7 +373,7 @@
 386/bin/ppm - 775 sys sys 1179372101 149813
 386/bin/pr - 775 sys sys 1178568298 76251
 386/bin/primes - 775 sys sys 1172289653 63329
-386/bin/prof - 775 sys sys 1178939753 111959
+386/bin/prof - 775 sys sys 1188530184 111994
 386/bin/proof - 775 sys sys 1179372102 179158
 386/bin/ps - 775 sys sys 1168402346 68812
 386/bin/pwd - 775 sys sys 1148500685 36932
@@ -402,10 +402,10 @@
 386/bin/sed - 775 sys sys 1182482483 90481
 386/bin/seq - 775 sys sys 1162241047 38441
 386/bin/sha1sum - 775 sys sys 1188447277 62293
-386/bin/size - 775 sys sys 1178939753 79772
+386/bin/size - 775 sys sys 1188530186 79807
 386/bin/sleep - 775 sys sys 1158088708 3875
-386/bin/snap - 775 sys sys 1178939753 316147
-386/bin/snapfs - 775 sys sys 1179372105 390366
+386/bin/snap - 775 sys sys 1188530194 316182
+386/bin/snapfs - 775 sys sys 1188530202 390401
 386/bin/sniffer - 775 sys sys 1038443185 99028
 386/bin/snoopy - 775 sys sys 1187639427 190560
 386/bin/sort - 775 sys sys 1178568303 81057
@@ -418,7 +418,7 @@
 386/bin/sshnet - 775 sys sys 1188447288 289170
 386/bin/stats - 775 sys sys 1179372106 191091
 386/bin/strings - 775 sys sys 1168402350 62855
-386/bin/strip - 775 sys sys 1178939754 81761
+386/bin/strip - 775 sys sys 1188530204 81796
 386/bin/sum - 775 sys sys 1148500691 39505
 386/bin/swap - 775 sys sys 1168402350 62373
 386/bin/syscall - 775 sys sys 1178568305 73944
@@ -438,7 +438,7 @@
 386/bin/topng - 775 sys sys 1178568307 137219
 386/bin/toppm - 775 sys sys 1179372107 165664
 386/bin/touch - 775 sys sys 1178568308 62586
-386/bin/tprof - 775 sys sys 1178939755 300947
+386/bin/tprof - 775 sys sys 1188530211 300982
 386/bin/tr - 775 sys sys 1168402355 62088
 386/bin/trace - 775 sys sys 1184731242 180520
 386/bin/troff - 775 sys sys 1178853709 361158
@@ -472,8 +472,8 @@
 386/bin/upas/runq - 775 sys sys 1178568314 112842
 386/bin/upas/scanmail - 775 sys sys 1181507271 128207
 386/bin/upas/send - 775 sys sys 1181507272 192174
-386/bin/upas/smtp - 775 sys sys 1188447319 275145
-386/bin/upas/smtpd - 775 sys sys 1188447327 331945
+386/bin/upas/smtp - 775 sys sys 1188530218 275629
+386/bin/upas/smtpd - 775 sys sys 1188530227 332030
 386/bin/upas/spam - 775 sys sys 1064598366 36
 386/bin/upas/testscan - 775 sys sys 1181507272 83858
 386/bin/upas/token - 775 sys sys 1188447329 73042
@@ -564,7 +564,7 @@
 386/lib/libhttpd.a - 664 sys sys 1188447451 99734
 386/lib/libip.a - 664 sys sys 1187061208 34710
 386/lib/libl.a - 664 sys sys 1168402367 5372
-386/lib/libmach.a - 664 sys sys 1184380786 807390
+386/lib/libmach.a - 664 sys sys 1188530244 807480
 386/lib/libmemdraw.a - 664 sys sys 1168402369 284092
 386/lib/libmemlayer.a - 664 sys sys 1168402369 47360
 386/lib/libmp.a - 664 sys sys 1188447454 79978
@@ -5242,7 +5242,7 @@ lib/ndb/consoledb - 664 sys sys 960222421 95
 lib/ndb/dhcp - 20000000775 sys sys 1020895764 0
 lib/ndb/dnsdump - 664 sys sys 1032057649 61
 lib/ndb/local - 664 sys sys 1077723747 292
-lib/ndb/local.complicated - 664 sys sys 1105461604 2976
+lib/ndb/local.complicated - 664 sys sys 1188534891 2946
 lib/ndb/nfs - 664 sys sys 954036707 113
 lib/news - 20000000775 sys sys 1020895764 0
 lib/pci - 664 sys sys 1160617172 206912
@@ -7650,7 +7650,7 @@ sys/man/3/ether - 664 sys sys 1178597986 2890
 sys/man/3/floppy - 664 sys sys 954378905 881
 sys/man/3/fs - 664 sys sys 1186946771 3159
 sys/man/3/i82365 - 664 sys sys 954378906 884
-sys/man/3/ip - 664 sys sys 1188520355 25466
+sys/man/3/ip - 664 sys sys 1188581755 25468
 sys/man/3/kbmap - 664 sys sys 1131110122 1732
 sys/man/3/kprof - 664 sys sys 1018029972 1377
 sys/man/3/loopback - 664 sys sys 964662153 1995
@@ -7687,7 +7687,7 @@ sys/man/4/exportfs - 664 sys sys 1145881912 4655
 sys/man/4/ext2srv - 664 sys sys 1055692986 2409
 sys/man/4/factotum - 664 sys sys 1187721636 14843
 sys/man/4/fossil - 664 sys sys 1186820346 9592
-sys/man/4/fs - 664 sys sys 1188520557 3427
+sys/man/4/fs - 664 sys sys 1188531555 3441
 sys/man/4/ftpfs - 664 sys sys 1112563349 4410
 sys/man/4/httpfile - 664 sys sys 1128556957 1233
 sys/man/4/import - 664 sys sys 1179442944 3272
@@ -7795,7 +7795,7 @@ sys/man/8/disksim - 664 sys sys 1144150487 1476
 sys/man/8/drawterm - 664 sys sys 1181675938 1921
 sys/man/8/fossilcons - 664 sys sys 1187134504 18542
 sys/man/8/fs - 664 sys sys 1172956177 15086
-sys/man/8/fsconfig - 664 sys sys 1172956534 8878
+sys/man/8/fsconfig - 664 sys sys 1188530378 8890
 sys/man/8/fshalt - 664 sys sys 1173737264 862
 sys/man/8/getflags - 664 sys sys 1159419702 1713
 sys/man/8/gpsfs - 664 sys sys 1165623047 4918
@@ -7858,8 +7858,8 @@ sys/man/vol1.ps.gz - 664 sys sys 1020374752 2174519
 sys/src - 20000000775 sys sys 1140114432 0
 sys/src/9 - 20000000775 sys sys 1063857477 0
 sys/src/9/alphapc - 20000000775 sys sys 1137179966 0
-sys/src/9/alphapc/apc - 664 sys sys 1131289706 630
-sys/src/9/alphapc/apccpu - 664 sys sys 1142958706 532
+sys/src/9/alphapc/apc - 664 sys sys 1188582377 622
+sys/src/9/alphapc/apccpu - 664 sys sys 1188582377 524
 sys/src/9/alphapc/arch164.c - 664 sys sys 1173386682 6082
 sys/src/9/alphapc/audio.h - 664 sys sys 1015012783 349
 sys/src/9/alphapc/axp.h - 664 sys sys 1015012783 1090
@@ -7895,7 +7895,7 @@ sys/src/9/alphapc/sio.c - 664 sys sys 1015012787 293
 sys/src/9/alphapc/trap.c - 664 sys sys 1105030177 18099
 sys/src/9/bitsy - 20000000775 sys sys 1138505096 0
 sys/src/9/bitsy/Booting101 - 664 sys sys 1054798506 8841
-sys/src/9/bitsy/bitsy - 664 sys sys 1067722592 424
+sys/src/9/bitsy/bitsy - 664 sys sys 1188582377 420
 sys/src/9/bitsy/bitsyreset.s - 664 sys sys 1017695510 2352
 sys/src/9/bitsy/clock.c - 664 sys sys 1037028998 4835
 sys/src/9/bitsy/dat.h - 664 sys sys 1143129783 5829
@@ -7975,10 +7975,9 @@ sys/src/9/ip/gre.c - 664 sys sys 1187045851 5103
 sys/src/9/ip/icmp.c - 664 sys sys 1184946959 9498
 sys/src/9/ip/icmp6.c - 664 sys sys 1187036525 18131
 sys/src/9/ip/igmp.c - 664 sys sys 1055700768 5175
-sys/src/9/ip/il.c - 664 sys sys 1184946959 27225
 sys/src/9/ip/inferno.c - 664 sys sys 1022588098 517
 sys/src/9/ip/ip.c - 664 sys sys 1187735970 14553
-sys/src/9/ip/ip.h - 664 sys sys 1187735964 16671
+sys/src/9/ip/ip.h - 664 sys sys 1188581813 16639
 sys/src/9/ip/ipaux.c - 664 sys sys 1185486678 12341
 sys/src/9/ip/ipifc.c - 664 sys sys 1184794851 34006
 sys/src/9/ip/ipmux.c - 664 sys sys 1187047550 14991
@@ -7987,7 +7986,7 @@ sys/src/9/ip/ipv6.c - 664 sys sys 1187735957 14226
 sys/src/9/ip/ipv6.h - 664 sys sys 1187735924 4301
 sys/src/9/ip/loopbackmedium.c - 664 sys sys 1055701769 1671
 sys/src/9/ip/netdevmedium.c - 664 sys sys 1045063517 2675
-sys/src/9/ip/netlog.c - 664 sys sys 1184794933 4004
+sys/src/9/ip/netlog.c - 664 sys sys 1188581818 3953
 sys/src/9/ip/nullmedium.c - 664 sys sys 1086406910 492
 sys/src/9/ip/pktmedium.c - 664 sys sys 1084331746 1314
 sys/src/9/ip/ptclbsum.c - 664 sys sys 1022588099 1243
@@ -8016,8 +8015,8 @@ sys/src/9/mtx/main.c - 664 sys sys 1131289814 8307
 sys/src/9/mtx/mem.h - 664 sys sys 1026848200 5959
 sys/src/9/mtx/mkfile - 664 sys sys 1173788325 1612
 sys/src/9/mtx/mmu.c - 664 sys sys 1173788325 4695
-sys/src/9/mtx/mtx - 664 sys sys 1056336297 416
-sys/src/9/mtx/mtxcpu - 664 sys sys 1039753442 421
+sys/src/9/mtx/mtx - 664 sys sys 1188582377 408
+sys/src/9/mtx/mtxcpu - 664 sys sys 1188582378 413
 sys/src/9/mtx/pci.c - 664 sys sys 1087657434 16662
 sys/src/9/mtx/random.c - 664 sys sys 1036813598 1983
 sys/src/9/mtx/raven.c - 664 sys sys 1018721288 2587
@@ -8097,15 +8096,15 @@ sys/src/9/pc/mouse.c - 664 sys sys 1098479254 7057
 sys/src/9/pc/mp.c - 664 sys sys 1162388126 17349
 sys/src/9/pc/mp.h - 664 sys sys 1173288116 6799
 sys/src/9/pc/nv_dma.h - 664 sys sys 1081384508 12943
-sys/src/9/pc/pc - 664 sys sys 1143768293 1452
-sys/src/9/pc/pcauth - 664 sys sys 1131907692 715
-sys/src/9/pc/pccd - 664 sys sys 1158061762 1466
-sys/src/9/pc/pccpu - 664 sys sys 1155674606 925
-sys/src/9/pc/pccpuf - 664 sys sys 1155674479 1532
-sys/src/9/pc/pcdisk - 664 sys sys 1161302470 1495
-sys/src/9/pc/pcf - 664 sys sys 1161302469 1553
-sys/src/9/pc/pcfl - 664 sys sys 1161302470 1587
-sys/src/9/pc/pcflop - 664 sys sys 1158061762 1513
+sys/src/9/pc/pc - 664 sys sys 1188582378 1444
+sys/src/9/pc/pcauth - 664 sys sys 1188582378 707
+sys/src/9/pc/pccd - 664 sys sys 1188582378 1458
+sys/src/9/pc/pccpu - 664 sys sys 1188582378 917
+sys/src/9/pc/pccpuf - 664 sys sys 1188582378 1524
+sys/src/9/pc/pcdisk - 664 sys sys 1188582378 1487
+sys/src/9/pc/pcf - 664 sys sys 1188582378 1545
+sys/src/9/pc/pcfl - 664 sys sys 1188582378 1579
+sys/src/9/pc/pcflop - 664 sys sys 1188582378 1509
 sys/src/9/pc/pci.c - 664 sys sys 1185452613 29418
 sys/src/9/pc/pcmciamodem.c - 664 sys sys 1099761153 1586
 sys/src/9/pc/pcmkfile - 664 sys sys 1109303822 101
@@ -8251,7 +8250,7 @@ sys/src/9/port/tod.c - 664 sys sys 1146746630 5377
 sys/src/9/port/unthwack.c - 664 sys sys 1057323394 5249
 sys/src/9/port/xalloc.c - 664 sys sys 1169491770 4289
 sys/src/9/ppc - 20000000775 sys sys 1123676466 0
-sys/src/9/ppc/blast - 664 sys sys 1107436310 670
+sys/src/9/ppc/blast - 664 sys sys 1188582378 662
 sys/src/9/ppc/blast.h - 664 sys sys 1059490750 3109
 sys/src/9/ppc/clock.c - 664 sys sys 1131290066 1076
 sys/src/9/ppc/dat.h - 664 sys sys 1127274100 4735
@@ -8284,7 +8283,7 @@ sys/src/9/ppc/saturntimer.c - 664 sys sys 1072705482 1737
 sys/src/9/ppc/trap.c - 664 sys sys 1138469503 17084
 sys/src/9/ppc/uartsaturn.c - 664 sys sys 1059490754 7151
 sys/src/9/ppc/uartsmc.c - 664 sys sys 1131290162 9764
-sys/src/9/ppc/ucu - 664 sys sys 1067722849 672
+sys/src/9/ppc/ucu - 664 sys sys 1188582378 664
 sys/src/9/ppc/ucu.h - 664 sys sys 1059490754 531
 sys/src/NOTICE - 444 sys sys 1018803112 63
 sys/src/ape - 20000000775 sys sys 1039727537 0
@@ -12758,7 +12757,7 @@ sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1182554015 7035
 sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1186081796 11679
 sys/src/cmd/ndb/cs.c - 664 sys sys 1188515063 32892
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
-sys/src/cmd/ndb/dblookup.c - 664 sys sys 1188515055 25030
+sys/src/cmd/ndb/dblookup.c - 664 sys sys 1188581123 25260
 sys/src/cmd/ndb/dn.c - 664 sys sys 1186704098 36512
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1183866408 3217
@@ -14433,154 +14432,6 @@ sys/src/cmd/wikifs/wiki2text.c - 664 sys sys 1018211094 779
 sys/src/cmd/winwatch.c - 664 sys sys 1113312596 4869
 sys/src/cmd/xd.c - 664 sys sys 1124993597 5770
 sys/src/cmd/yacc.c - 664 sys sys 1161442160 58076
-sys/src/fs - 20000000775 sys sys 1140168020 0
-sys/src/fs/9netics32.16k - 20000000775 sys sys 1151739121 0
-sys/src/fs/9netics32.16k/9net32.16kfs.c - 664 sys sys 1140167903 3208
-sys/src/fs/9netics32.16k/dat.h - 664 sys sys 1140167904 612
-sys/src/fs/9netics32.16k/fns.h - 664 sys sys 1172679928 2168
-sys/src/fs/9netics32.16k/io.h - 664 sys sys 1157939328 6720
-sys/src/fs/9netics32.16k/mem.h - 664 sys sys 1140167906 2907
-sys/src/fs/9netics32.16k/mkfile - 664 sys sys 1157938805 1644
-sys/src/fs/9netics64.8k - 20000000775 sys sys 1151739122 0
-sys/src/fs/9netics64.8k/9net64.8kfs.c - 664 sys sys 1140167920 3235
-sys/src/fs/9netics64.8k/dat.h - 664 sys sys 1095751680 611
-sys/src/fs/9netics64.8k/fns.h - 664 sys sys 1172679928 2168
-sys/src/fs/9netics64.8k/io.h - 664 sys sys 1157939328 6720
-sys/src/fs/9netics64.8k/mem.h - 664 sys sys 1140167924 2907
-sys/src/fs/9netics64.8k/mkfile - 664 sys sys 1157938855 1637
-sys/src/fs/GOING.AWAY - 664 sys sys 1188510006 63
-sys/src/fs/choline - 20000000775 sys sys 1151739703 0
-sys/src/fs/choline/9cholinefs.c - 664 sys sys 1140168020 2989
-sys/src/fs/choline/dat.h - 664 sys sys 1140168017 612
-sys/src/fs/choline/fns.h - 664 sys sys 1172679929 2168
-sys/src/fs/choline/io.h - 664 sys sys 1157939328 6720
-sys/src/fs/choline/mem.h - 664 sys sys 1140168019 2909
-sys/src/fs/choline/mkfile - 664 sys sys 1157938939 1780
-sys/src/fs/dev - 20000000775 sys sys 1140168396 0
-sys/src/fs/dev/apc.c - 664 sys sys 1140167918 14910
-sys/src/fs/dev/cw.c - 664 sys sys 1097712558 43252
-sys/src/fs/dev/fworm.c - 664 sys sys 1140167912 1845
-sys/src/fs/dev/juke.c - 664 sys sys 1174081264 22925
-sys/src/fs/dev/mkfile - 664 sys sys 1015109974 132
-sys/src/fs/dev/mworm.c - 664 sys sys 1140167915 4264
-sys/src/fs/dev/wren.c - 664 sys sys 1140167916 2392
-sys/src/fs/doc - 20000000775 sys sys 1146803945 0
-sys/src/fs/doc/changes - 664 sys sys 1140168029 2967
-sys/src/fs/doc/words - 664 sys sys 1146803821 1162
-sys/src/fs/doc/worm.fs - 664 sys sys 1140168030 4057
-sys/src/fs/doc/worm.fs64 - 664 sys sys 1101811981 1554
-sys/src/fs/doc/worms.32-bit - 664 sys sys 1140168032 2806
-sys/src/fs/emelie - 20000000775 sys sys 1151739662 0
-sys/src/fs/emelie/9emeliefs.c - 664 sys sys 1140168026 2989
-sys/src/fs/emelie/dat.h - 664 sys sys 1140168023 612
-sys/src/fs/emelie/fns.h - 664 sys sys 1172679929 2168
-sys/src/fs/emelie/io.h - 664 sys sys 1157939329 6720
-sys/src/fs/emelie/mem.h - 664 sys sys 1140168025 2909
-sys/src/fs/emelie/mkfile - 664 sys sys 1157938976 1779
-sys/src/fs/fs - 20000000775 sys sys 1151739222 0
-sys/src/fs/fs/9fsfs.c - 664 sys sys 1140168015 3308
-sys/src/fs/fs/dat.h - 664 sys sys 1140168010 611
-sys/src/fs/fs/fns.h - 664 sys sys 1172679929 2168
-sys/src/fs/fs/io.h - 664 sys sys 1157939329 6720
-sys/src/fs/fs/mem.h - 664 sys sys 1140168013 2909
-sys/src/fs/fs/mkfile - 664 sys sys 1178933399 1708
-sys/src/fs/fs64 - 20000000775 sys sys 1157943044 0
-sys/src/fs/fs64/9fsfs64.c - 664 sys sys 1151399221 3612
-sys/src/fs/fs64/dat.h - 664 sys sys 1140168005 611
-sys/src/fs/fs64/fns.h - 664 sys sys 1172679929 2330
-sys/src/fs/fs64/io.h - 664 sys sys 1157939329 6720
-sys/src/fs/fs64/mem.h - 664 sys sys 1151398965 3041
-sys/src/fs/fs64/mkfile - 664 sys sys 1178933399 1648
-sys/src/fs/ip - 20000000775 sys sys 1140167931 0
-sys/src/fs/ip/arp.c - 664 sys sys 1097578954 8696
-sys/src/fs/ip/icmp.c - 664 sys sys 1015109981 991
-sys/src/fs/ip/il.c - 664 sys sys 1140167928 19479
-sys/src/fs/ip/ip.c - 664 sys sys 1097578933 3859
-sys/src/fs/ip/ip.h - 664 sys sys 1140167930 6691
-sys/src/fs/ip/ipaux.c - 664 sys sys 1015109986 1041
-sys/src/fs/ip/iproute.c - 664 sys sys 1097579099 7386
-sys/src/fs/ip/mkfile - 664 sys sys 1015109988 127
-sys/src/fs/ip/sntp.c - 664 sys sys 1037805108 5539
-sys/src/fs/ip/udp.c - 664 sys sys 1015109990 754
-sys/src/fs/mkfile - 664 sys sys 1140167932 231
-sys/src/fs/pc - 20000000775 sys sys 1157938367 0
-sys/src/fs/pc/8250.c - 664 sys sys 1140161725 6957
-sys/src/fs/pc/8253.c - 664 sys sys 1097579039 7264
-sys/src/fs/pc/cga.c - 664 sys sys 1015110034 1484
-sys/src/fs/pc/compat.c - 664 sys sys 1140164905 1575
-sys/src/fs/pc/compat.h - 664 sys sys 1140774918 2578
-sys/src/fs/pc/dosfs.c - 664 sys sys 1146784976 16619
-sys/src/fs/pc/dosfs.h - 664 sys sys 1140167937 2696
-sys/src/fs/pc/ether2114x.c - 664 sys sys 1015110044 31874
-sys/src/fs/pc/ether8139.c - 664 sys sys 1086569718 18552
-sys/src/fs/pc/ether8169.c - 664 sys sys 1157939501 25385
-sys/src/fs/pc/ether82557.c - 664 sys sys 1154067789 30710
-sys/src/fs/pc/ether82563.c - 664 sys sys 1178933417 26994
-sys/src/fs/pc/ether83815.c - 664 sys sys 1140335463 26764
-sys/src/fs/pc/ether83815.mii.c - 664 sys sys 1049156663 31622
-sys/src/fs/pc/etherdat.h - 664 sys sys 1157938367 72
-sys/src/fs/pc/etherdp83820.c - 664 sys sys 1146355081 32045
-sys/src/fs/pc/etherelnk3.c - 664 sys sys 1015110054 42732
-sys/src/fs/pc/etherga620.c - 664 sys sys 1146785153 24748
-sys/src/fs/pc/etherga620fw.h - 664 sys sys 1032126775 222295
-sys/src/fs/pc/etherif.c - 664 sys sys 1178933411 6667
-sys/src/fs/pc/etherif.h - 664 sys sys 1015110057 730
-sys/src/fs/pc/etherigbe.c - 664 sys sys 1141208695 46676
-sys/src/fs/pc/etherm10g.c - 664 sys sys 1174594317 25743
-sys/src/fs/pc/etherm10g2k.i - 664 sys sys 1174590598 36
-sys/src/fs/pc/etherm10g4k.i - 664 sys sys 1174590598 36
-sys/src/fs/pc/ethermii.c - 664 sys sys 1140167954 4689
-sys/src/fs/pc/ethermii.h - 664 sys sys 1140167955 3259
-sys/src/fs/pc/floppy.c - 664 sys sys 1097579636 14022
-sys/src/fs/pc/kbd.c - 664 sys sys 1015110060 6030
-sys/src/fs/pc/l.s - 664 sys sys 1096008336 10838
-sys/src/fs/pc/lock.c - 664 sys sys 1173736177 3672
-sys/src/fs/pc/malloc.c - 664 sys sys 1096789023 2840
-sys/src/fs/pc/mkfile - 664 sys sys 1140167942 426
-sys/src/fs/pc/mmu.c - 664 sys sys 1015110065 8414
-sys/src/fs/pc/nvr.c - 664 sys sys 1015110066 669
-sys/src/fs/pc/pc.c - 664 sys sys 1151401114 8004
-sys/src/fs/pc/pci.c - 664 sys sys 1157938218 12271
-sys/src/fs/pc/script.i - 664 sys sys 1015110072 27323
-sys/src/fs/pc/scsi.c - 664 sys sys 1151385561 8701
-sys/src/fs/pc/scsibuslogic.c - 664 sys sys 1015110077 28645
-sys/src/fs/pc/scsincr53c8xx.c - 664 sys sys 1146798658 53619
-sys/src/fs/pc/sdata.c - 664 sys sys 1178933365 64719
-sys/src/fs/pc/sdmv50xx.c - 664 sys sys 1151486130 39434
-sys/src/fs/pc/sdscsi.c - 664 sys sys 1146786984 7017
-sys/src/fs/pc/toy.c - 664 sys sys 1140167948 2166
-sys/src/fs/pc/trap.c - 664 sys sys 1173300812 7998
-sys/src/fs/port - 20000000775 sys sys 1151739200 0
-sys/src/fs/port/9p1.c - 664 sys sys 1140167971 29982
-sys/src/fs/port/9p1.h - 664 sys sys 1140167972 2128
-sys/src/fs/port/9p1lib.c - 664 sys sys 1101627232 7911
-sys/src/fs/port/9p2.c - 664 sys sys 1174941740 36357
-sys/src/fs/port/all.h - 664 sys sys 1146798594 1888
-sys/src/fs/port/auth.c - 664 sys sys 1146785221 7606
-sys/src/fs/port/chk.c - 664 sys sys 1097832483 15683
-sys/src/fs/port/clock.c - 664 sys sys 1097580538 4033
-sys/src/fs/port/con.c - 664 sys sys 1173736129 16296
-sys/src/fs/port/config.c - 664 sys sys 1157944410 20574
-sys/src/fs/port/console.c - 664 sys sys 1101627646 4886
-sys/src/fs/port/data.c - 664 sys sys 1140167986 4510
-sys/src/fs/port/dentry.c - 664 sys sys 1098156404 6345
-sys/src/fs/port/devcons.c - 664 sys sys 1157942528 4896
-sys/src/fs/port/devsd.c - 664 sys sys 1178933380 15116
-sys/src/fs/port/fcmd.c - 664 sys sys 1146785267 1255
-sys/src/fs/port/fs.h - 664 sys sys 1140168001 682
-sys/src/fs/port/iobuf.c - 664 sys sys 1140167988 4956
-sys/src/fs/port/lib.h - 664 sys sys 1146798595 3791
-sys/src/fs/port/lrand.c - 664 sys sys 1091803568 1093
-sys/src/fs/port/main.c - 664 sys sys 1157943089 7931
-sys/src/fs/port/mkfile - 664 sys sys 1140167991 214
-sys/src/fs/port/portdat.h - 664 sys sys 1151312767 19739
-sys/src/fs/port/portfns.h - 664 sys sys 1140167994 7526
-sys/src/fs/port/print.c - 664 sys sys 1015110022 153
-sys/src/fs/port/proc.c - 664 sys sys 1097580775 5364
-sys/src/fs/port/sd.h - 664 sys sys 1140774087 2305
-sys/src/fs/port/sub.c - 664 sys sys 1151380380 25860
-sys/src/fs/port/time.c - 664 sys sys 1173736121 6443
-sys/src/fs/port/uidgid.c - 664 sys sys 1097574050 9192
 sys/src/games - 20000000775 sys sys 1128271724 0
 sys/src/games/4s.c - 664 sys sys 1128271724 1285
 sys/src/games/5s.c - 664 sys sys 1128271724 3621
@@ -15780,23 +15631,3 @@ usr/glenda/lib/profile - 664 glenda glenda 1105128663 890
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
-386/bin/acid - 775 sys sys 1188530145 405176
-386/bin/snap - 775 sys sys 1188530194 316182
-386/bin/snapfs - 775 sys sys 1188530202 390401
-386/bin/file - 775 sys sys 1188530150 128160
-386/bin/kprof - 775 sys sys 1188530153 106531
-386/bin/ktrace - 775 sys sys 1188530155 124211
-386/bin/nm - 775 sys sys 1188530182 130190
-386/bin/prof - 775 sys sys 1188530184 111994
-386/bin/size - 775 sys sys 1188530186 79807
-386/bin/strip - 775 sys sys 1188530204 81796
-386/bin/aux/ms2 - 775 sys sys 1188530147 88499
-386/bin/ndb/cs - 775 sys sys 1188530160 148982
-386/bin/ndb/dns - 775 sys sys 1188530167 294302
-386/bin/ndb/dnsdebug - 775 sys sys 1188530173 269468
-386/bin/ndb/dnstcp - 775 sys sys 1188530179 267317
-386/bin/tprof - 775 sys sys 1188530211 300982
-386/bin/upas/smtp - 775 sys sys 1188530218 275629
-386/bin/upas/smtpd - 775 sys sys 1188530227 332030
-386/lib/libmach.a - 664 sys sys 1188530244 807480
-sys/man/8/fsconfig - 664 sys sys 1188530378 8890

+ 24 - 173
dist/replica/plan9.db

@@ -1,8 +1,8 @@
 386 - 20000000775 sys sys 1010957353 0
 386/9load - 775 sys sys 1181763625 313856
-386/9loaddebug - 775 sys sys 1187321104 435045
+386/9loaddebug - 775 sys sys 1188593351 435045
 386/9loadlite - 775 sys sys 1176519517 137148
-386/9loadlitedebug - 775 sys sys 1186776564 220555
+386/9loadlitedebug - 775 sys sys 1188593356 220555
 386/9pc - 775 sys sys 1186023393 1937795
 386/9pc.gz - 664 sys sys 1186023393 829787
 386/9pccpu - 775 sys sys 1186023409 1657423
@@ -5242,7 +5242,7 @@ lib/ndb/consoledb - 664 sys sys 960222421 95
 lib/ndb/dhcp - 20000000775 sys sys 1020895764 0
 lib/ndb/dnsdump - 664 sys sys 1032057649 61
 lib/ndb/local - 664 sys sys 1077723747 292
-lib/ndb/local.complicated - 664 sys sys 1105461604 2976
+lib/ndb/local.complicated - 664 sys sys 1188534891 2946
 lib/ndb/nfs - 664 sys sys 954036707 113
 lib/news - 20000000775 sys sys 1020895764 0
 lib/pci - 664 sys sys 1160617172 206912
@@ -7650,7 +7650,7 @@ sys/man/3/ether - 664 sys sys 1178597986 2890
 sys/man/3/floppy - 664 sys sys 954378905 881
 sys/man/3/fs - 664 sys sys 1186946771 3159
 sys/man/3/i82365 - 664 sys sys 954378906 884
-sys/man/3/ip - 664 sys sys 1188520355 25466
+sys/man/3/ip - 664 sys sys 1188581755 25468
 sys/man/3/kbmap - 664 sys sys 1131110122 1732
 sys/man/3/kprof - 664 sys sys 1018029972 1377
 sys/man/3/loopback - 664 sys sys 964662153 1995
@@ -7687,7 +7687,7 @@ sys/man/4/exportfs - 664 sys sys 1145881912 4655
 sys/man/4/ext2srv - 664 sys sys 1055692986 2409
 sys/man/4/factotum - 664 sys sys 1187721636 14843
 sys/man/4/fossil - 664 sys sys 1186820346 9592
-sys/man/4/fs - 664 sys sys 1188520557 3427
+sys/man/4/fs - 664 sys sys 1188531555 3441
 sys/man/4/ftpfs - 664 sys sys 1112563349 4410
 sys/man/4/httpfile - 664 sys sys 1128556957 1233
 sys/man/4/import - 664 sys sys 1179442944 3272
@@ -7858,8 +7858,8 @@ sys/man/vol1.ps.gz - 664 sys sys 1020374752 2174519
 sys/src - 20000000775 sys sys 1140114432 0
 sys/src/9 - 20000000775 sys sys 1063857477 0
 sys/src/9/alphapc - 20000000775 sys sys 1137179966 0
-sys/src/9/alphapc/apc - 664 sys sys 1131289706 630
-sys/src/9/alphapc/apccpu - 664 sys sys 1142958706 532
+sys/src/9/alphapc/apc - 664 sys sys 1188582377 622
+sys/src/9/alphapc/apccpu - 664 sys sys 1188582377 524
 sys/src/9/alphapc/arch164.c - 664 sys sys 1173386682 6082
 sys/src/9/alphapc/audio.h - 664 sys sys 1015012783 349
 sys/src/9/alphapc/axp.h - 664 sys sys 1015012783 1090
@@ -7895,7 +7895,7 @@ sys/src/9/alphapc/sio.c - 664 sys sys 1015012787 293
 sys/src/9/alphapc/trap.c - 664 sys sys 1105030177 18099
 sys/src/9/bitsy - 20000000775 sys sys 1138505096 0
 sys/src/9/bitsy/Booting101 - 664 sys sys 1054798506 8841
-sys/src/9/bitsy/bitsy - 664 sys sys 1067722592 424
+sys/src/9/bitsy/bitsy - 664 sys sys 1188582377 420
 sys/src/9/bitsy/bitsyreset.s - 664 sys sys 1017695510 2352
 sys/src/9/bitsy/clock.c - 664 sys sys 1037028998 4835
 sys/src/9/bitsy/dat.h - 664 sys sys 1143129783 5829
@@ -7975,10 +7975,9 @@ sys/src/9/ip/gre.c - 664 sys sys 1187045851 5103
 sys/src/9/ip/icmp.c - 664 sys sys 1184946959 9498
 sys/src/9/ip/icmp6.c - 664 sys sys 1187036525 18131
 sys/src/9/ip/igmp.c - 664 sys sys 1055700768 5175
-sys/src/9/ip/il.c - 664 sys sys 1184946959 27225
 sys/src/9/ip/inferno.c - 664 sys sys 1022588098 517
 sys/src/9/ip/ip.c - 664 sys sys 1187735970 14553
-sys/src/9/ip/ip.h - 664 sys sys 1187735964 16671
+sys/src/9/ip/ip.h - 664 sys sys 1188581813 16639
 sys/src/9/ip/ipaux.c - 664 sys sys 1185486678 12341
 sys/src/9/ip/ipifc.c - 664 sys sys 1184794851 34006
 sys/src/9/ip/ipmux.c - 664 sys sys 1187047550 14991
@@ -7987,7 +7986,7 @@ sys/src/9/ip/ipv6.c - 664 sys sys 1187735957 14226
 sys/src/9/ip/ipv6.h - 664 sys sys 1187735924 4301
 sys/src/9/ip/loopbackmedium.c - 664 sys sys 1055701769 1671
 sys/src/9/ip/netdevmedium.c - 664 sys sys 1045063517 2675
-sys/src/9/ip/netlog.c - 664 sys sys 1184794933 4004
+sys/src/9/ip/netlog.c - 664 sys sys 1188581818 3953
 sys/src/9/ip/nullmedium.c - 664 sys sys 1086406910 492
 sys/src/9/ip/pktmedium.c - 664 sys sys 1084331746 1314
 sys/src/9/ip/ptclbsum.c - 664 sys sys 1022588099 1243
@@ -8016,8 +8015,8 @@ sys/src/9/mtx/main.c - 664 sys sys 1131289814 8307
 sys/src/9/mtx/mem.h - 664 sys sys 1026848200 5959
 sys/src/9/mtx/mkfile - 664 sys sys 1173788325 1612
 sys/src/9/mtx/mmu.c - 664 sys sys 1173788325 4695
-sys/src/9/mtx/mtx - 664 sys sys 1056336297 416
-sys/src/9/mtx/mtxcpu - 664 sys sys 1039753442 421
+sys/src/9/mtx/mtx - 664 sys sys 1188582377 408
+sys/src/9/mtx/mtxcpu - 664 sys sys 1188582378 413
 sys/src/9/mtx/pci.c - 664 sys sys 1087657434 16662
 sys/src/9/mtx/random.c - 664 sys sys 1036813598 1983
 sys/src/9/mtx/raven.c - 664 sys sys 1018721288 2587
@@ -8097,15 +8096,15 @@ sys/src/9/pc/mouse.c - 664 sys sys 1098479254 7057
 sys/src/9/pc/mp.c - 664 sys sys 1162388126 17349
 sys/src/9/pc/mp.h - 664 sys sys 1173288116 6799
 sys/src/9/pc/nv_dma.h - 664 sys sys 1081384508 12943
-sys/src/9/pc/pc - 664 sys sys 1143768293 1452
-sys/src/9/pc/pcauth - 664 sys sys 1131907692 715
-sys/src/9/pc/pccd - 664 sys sys 1158061762 1466
-sys/src/9/pc/pccpu - 664 sys sys 1155674606 925
-sys/src/9/pc/pccpuf - 664 sys sys 1155674479 1532
-sys/src/9/pc/pcdisk - 664 sys sys 1161302470 1495
-sys/src/9/pc/pcf - 664 sys sys 1161302469 1553
-sys/src/9/pc/pcfl - 664 sys sys 1161302470 1587
-sys/src/9/pc/pcflop - 664 sys sys 1158061762 1513
+sys/src/9/pc/pc - 664 sys sys 1188582378 1444
+sys/src/9/pc/pcauth - 664 sys sys 1188582378 707
+sys/src/9/pc/pccd - 664 sys sys 1188582378 1458
+sys/src/9/pc/pccpu - 664 sys sys 1188582378 917
+sys/src/9/pc/pccpuf - 664 sys sys 1188582378 1524
+sys/src/9/pc/pcdisk - 664 sys sys 1188582378 1487
+sys/src/9/pc/pcf - 664 sys sys 1188582378 1545
+sys/src/9/pc/pcfl - 664 sys sys 1188582378 1579
+sys/src/9/pc/pcflop - 664 sys sys 1188582378 1509
 sys/src/9/pc/pci.c - 664 sys sys 1185452613 29418
 sys/src/9/pc/pcmciamodem.c - 664 sys sys 1099761153 1586
 sys/src/9/pc/pcmkfile - 664 sys sys 1109303822 101
@@ -8251,7 +8250,7 @@ sys/src/9/port/tod.c - 664 sys sys 1146746630 5377
 sys/src/9/port/unthwack.c - 664 sys sys 1057323394 5249
 sys/src/9/port/xalloc.c - 664 sys sys 1169491770 4289
 sys/src/9/ppc - 20000000775 sys sys 1123676466 0
-sys/src/9/ppc/blast - 664 sys sys 1107436310 670
+sys/src/9/ppc/blast - 664 sys sys 1188582378 662
 sys/src/9/ppc/blast.h - 664 sys sys 1059490750 3109
 sys/src/9/ppc/clock.c - 664 sys sys 1131290066 1076
 sys/src/9/ppc/dat.h - 664 sys sys 1127274100 4735
@@ -8284,7 +8283,7 @@ sys/src/9/ppc/saturntimer.c - 664 sys sys 1072705482 1737
 sys/src/9/ppc/trap.c - 664 sys sys 1138469503 17084
 sys/src/9/ppc/uartsaturn.c - 664 sys sys 1059490754 7151
 sys/src/9/ppc/uartsmc.c - 664 sys sys 1131290162 9764
-sys/src/9/ppc/ucu - 664 sys sys 1067722849 672
+sys/src/9/ppc/ucu - 664 sys sys 1188582378 664
 sys/src/9/ppc/ucu.h - 664 sys sys 1059490754 531
 sys/src/NOTICE - 444 sys sys 1018803112 63
 sys/src/ape - 20000000775 sys sys 1039727537 0
@@ -12758,7 +12757,7 @@ sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1182554015 7035
 sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1186081796 11679
 sys/src/cmd/ndb/cs.c - 664 sys sys 1188515063 32892
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
-sys/src/cmd/ndb/dblookup.c - 664 sys sys 1188515055 25030
+sys/src/cmd/ndb/dblookup.c - 664 sys sys 1188581123 25260
 sys/src/cmd/ndb/dn.c - 664 sys sys 1186704098 36512
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1183866408 3217
@@ -14433,154 +14432,6 @@ sys/src/cmd/wikifs/wiki2text.c - 664 sys sys 1018211094 779
 sys/src/cmd/winwatch.c - 664 sys sys 1113312596 4869
 sys/src/cmd/xd.c - 664 sys sys 1124993597 5770
 sys/src/cmd/yacc.c - 664 sys sys 1161442160 58076
-sys/src/fs - 20000000775 sys sys 1140168020 0
-sys/src/fs/9netics32.16k - 20000000775 sys sys 1151739121 0
-sys/src/fs/9netics32.16k/9net32.16kfs.c - 664 sys sys 1140167903 3208
-sys/src/fs/9netics32.16k/dat.h - 664 sys sys 1140167904 612
-sys/src/fs/9netics32.16k/fns.h - 664 sys sys 1172679928 2168
-sys/src/fs/9netics32.16k/io.h - 664 sys sys 1157939328 6720
-sys/src/fs/9netics32.16k/mem.h - 664 sys sys 1140167906 2907
-sys/src/fs/9netics32.16k/mkfile - 664 sys sys 1157938805 1644
-sys/src/fs/9netics64.8k - 20000000775 sys sys 1151739122 0
-sys/src/fs/9netics64.8k/9net64.8kfs.c - 664 sys sys 1140167920 3235
-sys/src/fs/9netics64.8k/dat.h - 664 sys sys 1095751680 611
-sys/src/fs/9netics64.8k/fns.h - 664 sys sys 1172679928 2168
-sys/src/fs/9netics64.8k/io.h - 664 sys sys 1157939328 6720
-sys/src/fs/9netics64.8k/mem.h - 664 sys sys 1140167924 2907
-sys/src/fs/9netics64.8k/mkfile - 664 sys sys 1157938855 1637
-sys/src/fs/GOING.AWAY - 664 sys sys 1188510006 63
-sys/src/fs/choline - 20000000775 sys sys 1151739703 0
-sys/src/fs/choline/9cholinefs.c - 664 sys sys 1140168020 2989
-sys/src/fs/choline/dat.h - 664 sys sys 1140168017 612
-sys/src/fs/choline/fns.h - 664 sys sys 1172679929 2168
-sys/src/fs/choline/io.h - 664 sys sys 1157939328 6720
-sys/src/fs/choline/mem.h - 664 sys sys 1140168019 2909
-sys/src/fs/choline/mkfile - 664 sys sys 1157938939 1780
-sys/src/fs/dev - 20000000775 sys sys 1140168396 0
-sys/src/fs/dev/apc.c - 664 sys sys 1140167918 14910
-sys/src/fs/dev/cw.c - 664 sys sys 1097712558 43252
-sys/src/fs/dev/fworm.c - 664 sys sys 1140167912 1845
-sys/src/fs/dev/juke.c - 664 sys sys 1174081264 22925
-sys/src/fs/dev/mkfile - 664 sys sys 1015109974 132
-sys/src/fs/dev/mworm.c - 664 sys sys 1140167915 4264
-sys/src/fs/dev/wren.c - 664 sys sys 1140167916 2392
-sys/src/fs/doc - 20000000775 sys sys 1146803945 0
-sys/src/fs/doc/changes - 664 sys sys 1140168029 2967
-sys/src/fs/doc/words - 664 sys sys 1146803821 1162
-sys/src/fs/doc/worm.fs - 664 sys sys 1140168030 4057
-sys/src/fs/doc/worm.fs64 - 664 sys sys 1101811981 1554
-sys/src/fs/doc/worms.32-bit - 664 sys sys 1140168032 2806
-sys/src/fs/emelie - 20000000775 sys sys 1151739662 0
-sys/src/fs/emelie/9emeliefs.c - 664 sys sys 1140168026 2989
-sys/src/fs/emelie/dat.h - 664 sys sys 1140168023 612
-sys/src/fs/emelie/fns.h - 664 sys sys 1172679929 2168
-sys/src/fs/emelie/io.h - 664 sys sys 1157939329 6720
-sys/src/fs/emelie/mem.h - 664 sys sys 1140168025 2909
-sys/src/fs/emelie/mkfile - 664 sys sys 1157938976 1779
-sys/src/fs/fs - 20000000775 sys sys 1151739222 0
-sys/src/fs/fs/9fsfs.c - 664 sys sys 1140168015 3308
-sys/src/fs/fs/dat.h - 664 sys sys 1140168010 611
-sys/src/fs/fs/fns.h - 664 sys sys 1172679929 2168
-sys/src/fs/fs/io.h - 664 sys sys 1157939329 6720
-sys/src/fs/fs/mem.h - 664 sys sys 1140168013 2909
-sys/src/fs/fs/mkfile - 664 sys sys 1178933399 1708
-sys/src/fs/fs64 - 20000000775 sys sys 1157943044 0
-sys/src/fs/fs64/9fsfs64.c - 664 sys sys 1151399221 3612
-sys/src/fs/fs64/dat.h - 664 sys sys 1140168005 611
-sys/src/fs/fs64/fns.h - 664 sys sys 1172679929 2330
-sys/src/fs/fs64/io.h - 664 sys sys 1157939329 6720
-sys/src/fs/fs64/mem.h - 664 sys sys 1151398965 3041
-sys/src/fs/fs64/mkfile - 664 sys sys 1178933399 1648
-sys/src/fs/ip - 20000000775 sys sys 1140167931 0
-sys/src/fs/ip/arp.c - 664 sys sys 1097578954 8696
-sys/src/fs/ip/icmp.c - 664 sys sys 1015109981 991
-sys/src/fs/ip/il.c - 664 sys sys 1140167928 19479
-sys/src/fs/ip/ip.c - 664 sys sys 1097578933 3859
-sys/src/fs/ip/ip.h - 664 sys sys 1140167930 6691
-sys/src/fs/ip/ipaux.c - 664 sys sys 1015109986 1041
-sys/src/fs/ip/iproute.c - 664 sys sys 1097579099 7386
-sys/src/fs/ip/mkfile - 664 sys sys 1015109988 127
-sys/src/fs/ip/sntp.c - 664 sys sys 1037805108 5539
-sys/src/fs/ip/udp.c - 664 sys sys 1015109990 754
-sys/src/fs/mkfile - 664 sys sys 1140167932 231
-sys/src/fs/pc - 20000000775 sys sys 1157938367 0
-sys/src/fs/pc/8250.c - 664 sys sys 1140161725 6957
-sys/src/fs/pc/8253.c - 664 sys sys 1097579039 7264
-sys/src/fs/pc/cga.c - 664 sys sys 1015110034 1484
-sys/src/fs/pc/compat.c - 664 sys sys 1140164905 1575
-sys/src/fs/pc/compat.h - 664 sys sys 1140774918 2578
-sys/src/fs/pc/dosfs.c - 664 sys sys 1146784976 16619
-sys/src/fs/pc/dosfs.h - 664 sys sys 1140167937 2696
-sys/src/fs/pc/ether2114x.c - 664 sys sys 1015110044 31874
-sys/src/fs/pc/ether8139.c - 664 sys sys 1086569718 18552
-sys/src/fs/pc/ether8169.c - 664 sys sys 1157939501 25385
-sys/src/fs/pc/ether82557.c - 664 sys sys 1154067789 30710
-sys/src/fs/pc/ether82563.c - 664 sys sys 1178933417 26994
-sys/src/fs/pc/ether83815.c - 664 sys sys 1140335463 26764
-sys/src/fs/pc/ether83815.mii.c - 664 sys sys 1049156663 31622
-sys/src/fs/pc/etherdat.h - 664 sys sys 1157938367 72
-sys/src/fs/pc/etherdp83820.c - 664 sys sys 1146355081 32045
-sys/src/fs/pc/etherelnk3.c - 664 sys sys 1015110054 42732
-sys/src/fs/pc/etherga620.c - 664 sys sys 1146785153 24748
-sys/src/fs/pc/etherga620fw.h - 664 sys sys 1032126775 222295
-sys/src/fs/pc/etherif.c - 664 sys sys 1178933411 6667
-sys/src/fs/pc/etherif.h - 664 sys sys 1015110057 730
-sys/src/fs/pc/etherigbe.c - 664 sys sys 1141208695 46676
-sys/src/fs/pc/etherm10g.c - 664 sys sys 1174594317 25743
-sys/src/fs/pc/etherm10g2k.i - 664 sys sys 1174590598 36
-sys/src/fs/pc/etherm10g4k.i - 664 sys sys 1174590598 36
-sys/src/fs/pc/ethermii.c - 664 sys sys 1140167954 4689
-sys/src/fs/pc/ethermii.h - 664 sys sys 1140167955 3259
-sys/src/fs/pc/floppy.c - 664 sys sys 1097579636 14022
-sys/src/fs/pc/kbd.c - 664 sys sys 1015110060 6030
-sys/src/fs/pc/l.s - 664 sys sys 1096008336 10838
-sys/src/fs/pc/lock.c - 664 sys sys 1173736177 3672
-sys/src/fs/pc/malloc.c - 664 sys sys 1096789023 2840
-sys/src/fs/pc/mkfile - 664 sys sys 1140167942 426
-sys/src/fs/pc/mmu.c - 664 sys sys 1015110065 8414
-sys/src/fs/pc/nvr.c - 664 sys sys 1015110066 669
-sys/src/fs/pc/pc.c - 664 sys sys 1151401114 8004
-sys/src/fs/pc/pci.c - 664 sys sys 1157938218 12271
-sys/src/fs/pc/script.i - 664 sys sys 1015110072 27323
-sys/src/fs/pc/scsi.c - 664 sys sys 1151385561 8701
-sys/src/fs/pc/scsibuslogic.c - 664 sys sys 1015110077 28645
-sys/src/fs/pc/scsincr53c8xx.c - 664 sys sys 1146798658 53619
-sys/src/fs/pc/sdata.c - 664 sys sys 1178933365 64719
-sys/src/fs/pc/sdmv50xx.c - 664 sys sys 1151486130 39434
-sys/src/fs/pc/sdscsi.c - 664 sys sys 1146786984 7017
-sys/src/fs/pc/toy.c - 664 sys sys 1140167948 2166
-sys/src/fs/pc/trap.c - 664 sys sys 1173300812 7998
-sys/src/fs/port - 20000000775 sys sys 1151739200 0
-sys/src/fs/port/9p1.c - 664 sys sys 1140167971 29982
-sys/src/fs/port/9p1.h - 664 sys sys 1140167972 2128
-sys/src/fs/port/9p1lib.c - 664 sys sys 1101627232 7911
-sys/src/fs/port/9p2.c - 664 sys sys 1174941740 36357
-sys/src/fs/port/all.h - 664 sys sys 1146798594 1888
-sys/src/fs/port/auth.c - 664 sys sys 1146785221 7606
-sys/src/fs/port/chk.c - 664 sys sys 1097832483 15683
-sys/src/fs/port/clock.c - 664 sys sys 1097580538 4033
-sys/src/fs/port/con.c - 664 sys sys 1173736129 16296
-sys/src/fs/port/config.c - 664 sys sys 1157944410 20574
-sys/src/fs/port/console.c - 664 sys sys 1101627646 4886
-sys/src/fs/port/data.c - 664 sys sys 1140167986 4510
-sys/src/fs/port/dentry.c - 664 sys sys 1098156404 6345
-sys/src/fs/port/devcons.c - 664 sys sys 1157942528 4896
-sys/src/fs/port/devsd.c - 664 sys sys 1178933380 15116
-sys/src/fs/port/fcmd.c - 664 sys sys 1146785267 1255
-sys/src/fs/port/fs.h - 664 sys sys 1140168001 682
-sys/src/fs/port/iobuf.c - 664 sys sys 1140167988 4956
-sys/src/fs/port/lib.h - 664 sys sys 1146798595 3791
-sys/src/fs/port/lrand.c - 664 sys sys 1091803568 1093
-sys/src/fs/port/main.c - 664 sys sys 1157943089 7931
-sys/src/fs/port/mkfile - 664 sys sys 1140167991 214
-sys/src/fs/port/portdat.h - 664 sys sys 1151312767 19739
-sys/src/fs/port/portfns.h - 664 sys sys 1140167994 7526
-sys/src/fs/port/print.c - 664 sys sys 1015110022 153
-sys/src/fs/port/proc.c - 664 sys sys 1097580775 5364
-sys/src/fs/port/sd.h - 664 sys sys 1140774087 2305
-sys/src/fs/port/sub.c - 664 sys sys 1151380380 25860
-sys/src/fs/port/time.c - 664 sys sys 1173736121 6443
-sys/src/fs/port/uidgid.c - 664 sys sys 1097574050 9192
 sys/src/games - 20000000775 sys sys 1128271724 0
 sys/src/games/4s.c - 664 sys sys 1128271724 1285
 sys/src/games/5s.c - 664 sys sys 1128271724 3621

+ 173 - 0
dist/replica/plan9.log

@@ -52188,3 +52188,176 @@
 1188531004 17 c 386/bin/upas/smtpd - 775 sys sys 1188530227 332030
 1188531004 18 c 386/lib/libmach.a - 664 sys sys 1188530244 807480
 1188531004 19 c sys/man/8/fsconfig - 664 sys sys 1188530378 8890
+1188532803 0 c sys/man/4/fs - 664 sys sys 1188531555 3441
+1188536405 0 c lib/ndb/local.complicated - 664 sys sys 1188534891 2946
+1188581404 0 c sys/src/cmd/ndb/dblookup.c - 664 sys sys 1188581123 25260
+1188583203 0 c sys/man/3/ip - 664 sys sys 1188581755 25468
+1188583203 1 c sys/src/9/alphapc/apc - 664 sys sys 1188582377 622
+1188583203 2 c sys/src/9/alphapc/apccpu - 664 sys sys 1188582377 524
+1188583203 3 c sys/src/9/bitsy/bitsy - 664 sys sys 1188582377 420
+1188583203 4 c sys/src/9/ip/ip.h - 664 sys sys 1188581813 16639
+1188583203 5 c sys/src/9/ip/netlog.c - 664 sys sys 1188581818 3953
+1188583203 6 c sys/src/9/mtx/mtx - 664 sys sys 1188582377 408
+1188583203 7 c sys/src/9/mtx/mtxcpu - 664 sys sys 1188582378 413
+1188583203 8 c sys/src/9/pc/pc - 664 sys sys 1188582378 1444
+1188583203 9 c sys/src/9/pc/pcauth - 664 sys sys 1188582378 707
+1188583203 10 c sys/src/9/pc/pccpu - 664 sys sys 1188582378 917
+1188583203 11 c sys/src/9/pc/pcdisk - 664 sys sys 1188582378 1487
+1188583203 12 c sys/src/9/pc/pcf - 664 sys sys 1188582378 1545
+1188583203 13 c sys/src/9/pc/pccd - 664 sys sys 1188582378 1458
+1188583203 14 c sys/src/9/pc/pccpuf - 664 sys sys 1188582378 1524
+1188583203 15 c sys/src/9/pc/pcfl - 664 sys sys 1188582378 1579
+1188583203 16 c sys/src/9/pc/pcflop - 664 sys sys 1188582378 1509
+1188583203 17 c sys/src/9/ppc/blast - 664 sys sys 1188582378 662
+1188583203 18 c sys/src/9/ppc/ucu - 664 sys sys 1188582378 664
+1188583203 19 d sys/src/fs/port/uidgid.c - 664 sys sys 1097574050 0
+1188583203 20 d sys/src/fs/port/time.c - 664 sys sys 1173736121 0
+1188583203 21 d sys/src/fs/port/sub.c - 664 sys sys 1151380380 0
+1188583203 22 d sys/src/fs/port/sd.h - 664 sys sys 1140774087 0
+1188583203 23 d sys/src/fs/port/proc.c - 664 sys sys 1097580775 0
+1188583203 24 d sys/src/fs/port/print.c - 664 sys sys 1015110022 0
+1188583203 25 d sys/src/fs/port/portfns.h - 664 sys sys 1140167994 0
+1188583203 26 d sys/src/fs/port/portdat.h - 664 sys sys 1151312767 0
+1188583203 27 d sys/src/fs/port/mkfile - 664 sys sys 1140167991 0
+1188583203 28 d sys/src/fs/port/main.c - 664 sys sys 1157943089 0
+1188583203 29 d sys/src/fs/port/lrand.c - 664 sys sys 1091803568 0
+1188583203 30 d sys/src/fs/port/lib.h - 664 sys sys 1146798595 0
+1188583203 31 d sys/src/fs/port/iobuf.c - 664 sys sys 1140167988 0
+1188583203 32 d sys/src/fs/port/fs.h - 664 sys sys 1140168001 0
+1188583203 33 d sys/src/fs/port/fcmd.c - 664 sys sys 1146785267 0
+1188583203 34 d sys/src/fs/port/devsd.c - 664 sys sys 1178933380 0
+1188583203 35 d sys/src/fs/port/devcons.c - 664 sys sys 1157942528 0
+1188583203 36 d sys/src/fs/port/dentry.c - 664 sys sys 1098156404 0
+1188583203 37 d sys/src/fs/port/data.c - 664 sys sys 1140167986 0
+1188583203 38 d sys/src/fs/port/console.c - 664 sys sys 1101627646 0
+1188583203 39 d sys/src/fs/port/config.c - 664 sys sys 1157944410 0
+1188583203 40 d sys/src/fs/port/con.c - 664 sys sys 1173736129 0
+1188583203 41 d sys/src/fs/port/clock.c - 664 sys sys 1097580538 0
+1188583203 42 d sys/src/fs/port/chk.c - 664 sys sys 1097832483 0
+1188583203 43 d sys/src/fs/port/auth.c - 664 sys sys 1146785221 0
+1188583203 44 d sys/src/fs/port/all.h - 664 sys sys 1146798594 0
+1188583203 45 d sys/src/fs/port/9p2.c - 664 sys sys 1174941740 0
+1188583203 46 d sys/src/fs/port/9p1lib.c - 664 sys sys 1101627232 0
+1188583203 47 d sys/src/fs/port/9p1.h - 664 sys sys 1140167972 0
+1188583203 48 d sys/src/fs/port/9p1.c - 664 sys sys 1140167971 0
+1188583203 49 d sys/src/fs/port - 20000000775 sys sys 1151739200 0
+1188583203 50 d sys/src/fs/pc/trap.c - 664 sys sys 1173300812 0
+1188583203 51 d sys/src/fs/pc/toy.c - 664 sys sys 1140167948 0
+1188583203 52 d sys/src/fs/pc/sdscsi.c - 664 sys sys 1146786984 0
+1188583203 53 d sys/src/fs/pc/sdmv50xx.c - 664 sys sys 1151486130 0
+1188583203 54 d sys/src/fs/pc/sdata.c - 664 sys sys 1178933365 0
+1188583203 55 d sys/src/fs/pc/scsincr53c8xx.c - 664 sys sys 1146798658 0
+1188583203 56 d sys/src/fs/pc/scsibuslogic.c - 664 sys sys 1015110077 0
+1188583203 57 d sys/src/fs/pc/scsi.c - 664 sys sys 1151385561 0
+1188583203 58 d sys/src/fs/pc/script.i - 664 sys sys 1015110072 0
+1188583203 59 d sys/src/fs/pc/pci.c - 664 sys sys 1157938218 0
+1188583203 60 d sys/src/fs/pc/pc.c - 664 sys sys 1151401114 0
+1188583203 61 d sys/src/fs/pc/nvr.c - 664 sys sys 1015110066 0
+1188583203 62 d sys/src/fs/pc/mmu.c - 664 sys sys 1015110065 0
+1188583203 63 d sys/src/fs/pc/mkfile - 664 sys sys 1140167942 0
+1188583203 64 d sys/src/fs/pc/malloc.c - 664 sys sys 1096789023 0
+1188583203 65 d sys/src/fs/pc/lock.c - 664 sys sys 1173736177 0
+1188583203 66 d sys/src/fs/pc/l.s - 664 sys sys 1096008336 0
+1188583203 67 d sys/src/fs/pc/kbd.c - 664 sys sys 1015110060 0
+1188583203 68 d sys/src/fs/pc/floppy.c - 664 sys sys 1097579636 0
+1188583203 69 d sys/src/fs/pc/ethermii.h - 664 sys sys 1140167955 0
+1188583203 70 d sys/src/fs/pc/ethermii.c - 664 sys sys 1140167954 0
+1188583203 71 d sys/src/fs/pc/etherm10g4k.i - 664 sys sys 1174590598 0
+1188583203 72 d sys/src/fs/pc/etherm10g2k.i - 664 sys sys 1174590598 0
+1188583203 73 d sys/src/fs/pc/etherm10g.c - 664 sys sys 1174594317 0
+1188583203 74 d sys/src/fs/pc/etherigbe.c - 664 sys sys 1141208695 0
+1188583203 75 d sys/src/fs/pc/etherif.h - 664 sys sys 1015110057 0
+1188583203 76 d sys/src/fs/pc/etherif.c - 664 sys sys 1178933411 0
+1188583203 77 d sys/src/fs/pc/etherga620fw.h - 664 sys sys 1032126775 0
+1188583203 78 d sys/src/fs/pc/etherga620.c - 664 sys sys 1146785153 0
+1188583203 79 d sys/src/fs/pc/etherelnk3.c - 664 sys sys 1015110054 0
+1188583203 80 d sys/src/fs/pc/etherdp83820.c - 664 sys sys 1146355081 0
+1188583203 81 d sys/src/fs/pc/etherdat.h - 664 sys sys 1157938367 0
+1188583203 82 d sys/src/fs/pc/ether83815.mii.c - 664 sys sys 1049156663 0
+1188583203 83 d sys/src/fs/pc/ether83815.c - 664 sys sys 1140335463 0
+1188583203 84 d sys/src/fs/pc/ether82563.c - 664 sys sys 1178933417 0
+1188583203 85 d sys/src/fs/pc/ether82557.c - 664 sys sys 1154067789 0
+1188583203 86 d sys/src/fs/pc/ether8169.c - 664 sys sys 1157939501 0
+1188583203 87 d sys/src/fs/pc/ether8139.c - 664 sys sys 1086569718 0
+1188583203 88 d sys/src/fs/pc/ether2114x.c - 664 sys sys 1015110044 0
+1188583203 89 d sys/src/fs/pc/dosfs.h - 664 sys sys 1140167937 0
+1188583203 90 d sys/src/fs/pc/dosfs.c - 664 sys sys 1146784976 0
+1188583203 91 d sys/src/fs/pc/compat.h - 664 sys sys 1140774918 0
+1188583203 92 d sys/src/fs/pc/compat.c - 664 sys sys 1140164905 0
+1188583203 93 d sys/src/fs/pc/cga.c - 664 sys sys 1015110034 0
+1188583203 94 d sys/src/fs/pc/8253.c - 664 sys sys 1097579039 0
+1188583203 95 d sys/src/fs/pc/8250.c - 664 sys sys 1140161725 0
+1188583203 96 d sys/src/fs/pc - 20000000775 sys sys 1157938367 0
+1188583203 97 d sys/src/fs/mkfile - 664 sys sys 1140167932 0
+1188583203 98 d sys/src/fs/ip/udp.c - 664 sys sys 1015109990 0
+1188583203 99 d sys/src/fs/ip/sntp.c - 664 sys sys 1037805108 0
+1188583203 100 d sys/src/fs/ip/mkfile - 664 sys sys 1015109988 0
+1188583203 101 d sys/src/fs/ip/iproute.c - 664 sys sys 1097579099 0
+1188583203 102 d sys/src/fs/ip/ipaux.c - 664 sys sys 1015109986 0
+1188583203 103 d sys/src/fs/ip/ip.h - 664 sys sys 1140167930 0
+1188583203 104 d sys/src/fs/ip/ip.c - 664 sys sys 1097578933 0
+1188583203 105 d sys/src/fs/ip/il.c - 664 sys sys 1140167928 0
+1188583203 106 d sys/src/fs/ip/icmp.c - 664 sys sys 1015109981 0
+1188583203 107 d sys/src/fs/ip/arp.c - 664 sys sys 1097578954 0
+1188583203 108 d sys/src/fs/ip - 20000000775 sys sys 1140167931 0
+1188583203 109 d sys/src/fs/fs64/mkfile - 664 sys sys 1178933399 0
+1188583203 110 d sys/src/fs/fs64/mem.h - 664 sys sys 1151398965 0
+1188583203 111 d sys/src/fs/fs64/io.h - 664 sys sys 1157939329 0
+1188583203 112 d sys/src/fs/fs64/fns.h - 664 sys sys 1172679929 0
+1188583203 113 d sys/src/fs/fs64/dat.h - 664 sys sys 1140168005 0
+1188583203 114 d sys/src/fs/fs64/9fsfs64.c - 664 sys sys 1151399221 0
+1188583203 115 d sys/src/fs/fs64 - 20000000775 sys sys 1157943044 0
+1188583203 116 d sys/src/fs/fs/mkfile - 664 sys sys 1178933399 0
+1188583203 117 d sys/src/fs/fs/mem.h - 664 sys sys 1140168013 0
+1188583203 118 d sys/src/fs/fs/io.h - 664 sys sys 1157939329 0
+1188583203 119 d sys/src/fs/fs/fns.h - 664 sys sys 1172679929 0
+1188583203 120 d sys/src/fs/fs/dat.h - 664 sys sys 1140168010 0
+1188583203 121 d sys/src/fs/fs/9fsfs.c - 664 sys sys 1140168015 0
+1188583203 122 d sys/src/fs/fs - 20000000775 sys sys 1151739222 0
+1188583203 123 d sys/src/fs/emelie/mkfile - 664 sys sys 1157938976 0
+1188583203 124 d sys/src/fs/emelie/mem.h - 664 sys sys 1140168025 0
+1188583203 125 d sys/src/fs/emelie/io.h - 664 sys sys 1157939329 0
+1188583203 126 d sys/src/fs/emelie/fns.h - 664 sys sys 1172679929 0
+1188583203 127 d sys/src/fs/emelie/dat.h - 664 sys sys 1140168023 0
+1188583203 128 d sys/src/fs/emelie/9emeliefs.c - 664 sys sys 1140168026 0
+1188583203 129 d sys/src/fs/emelie - 20000000775 sys sys 1151739662 0
+1188583203 130 d sys/src/fs/doc/worms.32-bit - 664 sys sys 1140168032 0
+1188583203 131 d sys/src/fs/doc/worm.fs64 - 664 sys sys 1101811981 0
+1188583203 132 d sys/src/fs/doc/worm.fs - 664 sys sys 1140168030 0
+1188583203 133 d sys/src/fs/doc/words - 664 sys sys 1146803821 0
+1188583203 134 d sys/src/fs/doc/changes - 664 sys sys 1140168029 0
+1188583203 135 d sys/src/fs/doc - 20000000775 sys sys 1146803945 0
+1188583203 136 d sys/src/fs/dev/wren.c - 664 sys sys 1140167916 0
+1188583203 137 d sys/src/fs/dev/mworm.c - 664 sys sys 1140167915 0
+1188583203 138 d sys/src/fs/dev/mkfile - 664 sys sys 1015109974 0
+1188583203 139 d sys/src/fs/dev/juke.c - 664 sys sys 1174081264 0
+1188583203 140 d sys/src/fs/dev/fworm.c - 664 sys sys 1140167912 0
+1188583203 141 d sys/src/fs/dev/cw.c - 664 sys sys 1097712558 0
+1188583203 142 d sys/src/fs/dev/apc.c - 664 sys sys 1140167918 0
+1188583203 143 d sys/src/fs/dev - 20000000775 sys sys 1140168396 0
+1188583203 144 d sys/src/fs/choline/mkfile - 664 sys sys 1157938939 0
+1188583203 145 d sys/src/fs/choline/mem.h - 664 sys sys 1140168019 0
+1188583203 146 d sys/src/fs/choline/io.h - 664 sys sys 1157939328 0
+1188583203 147 d sys/src/fs/choline/fns.h - 664 sys sys 1172679929 0
+1188583203 148 d sys/src/fs/choline/dat.h - 664 sys sys 1140168017 0
+1188583203 149 d sys/src/fs/choline/9cholinefs.c - 664 sys sys 1140168020 0
+1188583203 150 d sys/src/fs/choline - 20000000775 sys sys 1151739703 0
+1188583203 151 d sys/src/fs/GOING.AWAY - 664 sys sys 1188510006 0
+1188583203 152 d sys/src/fs/9netics64.8k/mkfile - 664 sys sys 1157938855 0
+1188583203 153 d sys/src/fs/9netics64.8k/mem.h - 664 sys sys 1140167924 0
+1188583203 154 d sys/src/fs/9netics64.8k/io.h - 664 sys sys 1157939328 0
+1188583203 155 d sys/src/fs/9netics64.8k/fns.h - 664 sys sys 1172679928 0
+1188583203 156 d sys/src/fs/9netics64.8k/dat.h - 664 sys sys 1095751680 0
+1188583203 157 d sys/src/fs/9netics64.8k/9net64.8kfs.c - 664 sys sys 1140167920 0
+1188583203 158 d sys/src/fs/9netics64.8k - 20000000775 sys sys 1151739122 0
+1188583203 159 d sys/src/fs/9netics32.16k/mkfile - 664 sys sys 1157938805 0
+1188583203 160 d sys/src/fs/9netics32.16k/mem.h - 664 sys sys 1140167906 0
+1188583203 161 d sys/src/fs/9netics32.16k/io.h - 664 sys sys 1157939328 0
+1188583203 162 d sys/src/fs/9netics32.16k/fns.h - 664 sys sys 1172679928 0
+1188583203 163 d sys/src/fs/9netics32.16k/dat.h - 664 sys sys 1140167904 0
+1188583203 164 d sys/src/fs/9netics32.16k/9net32.16kfs.c - 664 sys sys 1140167903 0
+1188583203 165 d sys/src/fs/9netics32.16k - 20000000775 sys sys 1151739121 0
+1188583203 166 d sys/src/fs - 20000000775 sys sys 1140168020 0
+1188583203 167 d sys/src/9/ip/il.c - 664 sys sys 1184946959 0
+1188594004 0 c 386/9loaddebug - 775 sys sys 1188593351 435045
+1188594004 1 c 386/9loadlitedebug - 775 sys sys 1188593356 220555

+ 0 - 3
lib/ndb/local.complicated

@@ -101,16 +101,13 @@ ipnet=mysubnetwork ip=10.0.1.0 ipmask=255.255.255.0
 ip=10.0.1.10 ether=0010dc724074 sys=fs
 	dom=myfileserver.myuniversity.edu 
 	bootf=/386/9pcfs
-	proto=il
 
 ip=10.0.1.11 ether=0010dc724075 sys=auth
 	dom=myauthserver.myuniversity.edu
 	bootf=/386/9pccpu
-	proto=il
 
 ip=10.0.1.12 ether=0010dc724076 sys=term
 	dom=myterminal.myuniversity.edu
 	bootf=/386/9pc
-	proto=il
 
 auth=sources.cs.bell-labs.com authdom=outside.plan9.bell-labs.com

+ 3 - 3
sys/man/3/ip

@@ -437,11 +437,11 @@ The possible items are:
 .BR fs ,
 .BR tcp ,
 .BR icmp ,
-.BR udb ,
+.BR udp ,
 .BR compress ,
-.BR ilmsg ,
 .BR gre ,
-.BR tcpmsg ,
+.BR tcpwin ,
+.BR tcprxmt ,
 .BR udpmsg ,
 .BR ipmsg ,
 and

+ 0 - 2
sys/src/9/alphapc/apc

@@ -46,7 +46,6 @@ misc
 	vgatvp3026	=cur
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -58,7 +57,6 @@ port
 
 boot
 	tcp
-	il
 
 bootdir
 	bootapc.out boot

+ 0 - 2
sys/src/9/alphapc/apccpu

@@ -38,7 +38,6 @@ misc
 	uarti8250
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -52,7 +51,6 @@ port
 
 boot cpu
 	tcp
-	il
 
 bootdir
 	bootapccpu.out boot

+ 0 - 1
sys/src/9/bitsy/bitsy

@@ -22,7 +22,6 @@ dev
 	sd
 
 ip
-	il
 	tcp
 	udp
 	ipifc

+ 0 - 1408
sys/src/9/ip/il.c

@@ -1,1408 +0,0 @@
-#include	"u.h"
-#include	"../port/lib.h"
-#include	"mem.h"
-#include	"dat.h"
-#include	"fns.h"
-#include	"../port/error.h"
-
-#include	"ip.h"
-
-enum				/* Connection state */
-{
-	Ilclosed,
-	Ilsyncer,
-	Ilsyncee,
-	Ilestablished,
-	Illistening,
-	Ilclosing,
-	Ilopening,		/* only for file server */
-};
-
-char	*ilstates[] = 
-{ 
-	"Closed",
-	"Syncer",
-	"Syncee",
-	"Established",
-	"Listen",
-	"Closing",
-	"Opening",		/* only for file server */
-};
-
-enum				/* Packet types */
-{
-	Ilsync,
-	Ildata,
-	Ildataquery,
-	Ilack,
-	Ilquery,
-	Ilstate,
-	Ilclose,
-};
-
-char	*iltype[] = 
-{	
-	"sync",
-	"data",
-	"dataquery",
-	"ack",
-	"query",
-	"state",
-	"close" 
-};
-
-enum
-{
-	Seconds		= 1000,
-	Iltickms 	= 50,		/* time base */
-	AckDelay	= 2*Iltickms,	/* max time twixt message rcvd & ack sent */
-	MaxTimeout 	= 30*Seconds,	/* max time between rexmit */
-	QueryTime	= 10*Seconds,	/* time between subsequent queries */
-	DeathTime	= 30*QueryTime,
-
-	MaxRexmit 	= 16,		/* max retransmissions before hangup */
-	Defaultwin	= 20,
-
-	LogAGain	= 3,
-	AGain		= 1<<LogAGain,
-	LogDGain	= 2,
-	DGain		= 1<<LogDGain,
-
-	DefByteRate	= 100,		/* assume a megabit link */
-	DefRtt		= 50,		/* cross country on a great day */
-
-	Maxrq		= 64*1024,
-};
-
-enum
-{
-	Nqt=	8,
-};
-
-typedef struct Ilcb Ilcb;
-struct Ilcb			/* Control block */
-{
-	int	state;		/* Connection state */
-	Conv	*conv;
-	QLock	ackq;		/* Unacknowledged queue */
-	Block	*unacked;
-	Block	*unackedtail;
-	ulong	unackedbytes;
-	QLock	outo;		/* Out of order packet queue */
-	Block	*outoforder;
-	ulong	next;		/* Id of next to send */
-	ulong	recvd;		/* Last packet received */
-	ulong	acksent;	/* Last packet acked */
-	ulong	start;		/* Local start id */
-	ulong	rstart;		/* Remote start id */
-	int	window;		/* Maximum receive window */
-	int	rxquery;	/* number of queries on this connection */
-	int	rxtot;		/* number of retransmits on this connection */
-	int	rexmit;		/* number of retransmits of *unacked */
-	ulong	qt[Nqt+1];	/* state table for query messages */
-	int	qtx;		/* ... index into qt */
-
-	/* if set, fasttimeout causes a connection request to terminate after 4*Iltickms */
-	int	fasttimeout;
-
-	/* timers */
-	ulong	lastxmit;	/* time of last xmit */
-	ulong	lastrecv;	/* time of last recv */
-	ulong	timeout;	/* retransmission time for *unacked */
-	ulong	acktime;	/* time to send next ack */
-	ulong	querytime;	/* time to send next query */
-
-	/* adaptive measurements */
-	int	delay;		/* Average of the fixed rtt delay */
-	int	rate;		/* Average uchar rate */
-	int	mdev;		/* Mean deviation of rtt */
-	int	maxrtt;		/* largest rtt seen */
-	ulong	rttack;		/* The ack we are waiting for */
-	int	rttlen;		/* Length of rttack packet */
-	uvlong	rttstart;	/* Time we issued rttack packet */
-};
-
-enum
-{
-	IL_IPSIZE 	= 20,
-	IL_HDRSIZE	= 18,	
-	IL_LISTEN	= 0,
-	IL_CONNECT	= 1,
-	IP_ILPROTO	= 40,
-};
-
-typedef struct Ilhdr Ilhdr;
-struct Ilhdr
-{
-	uchar	vihl;		/* Version and header length */
-	uchar	tos;		/* Type of service */
-	uchar	length[2];	/* packet length */
-	uchar	id[2];		/* Identification */
-	uchar	frag[2];	/* Fragment information */
-	uchar	ttl;		/* Time to live */
-	uchar	proto;		/* Protocol */
-	uchar	cksum[2];	/* Header checksum */
-	uchar	src[4];		/* Ip source */
-	uchar	dst[4];		/* Ip destination */
-	uchar	ilsum[2];	/* Checksum including header */
-	uchar	illen[2];	/* Packet length */
-	uchar	iltype;		/* Packet type */
-	uchar	ilspec;		/* Special */
-	uchar	ilsrc[2];	/* Src port */
-	uchar	ildst[2];	/* Dst port */
-	uchar	ilid[4];	/* Sequence id */
-	uchar	ilack[4];	/* Acked sequence */
-};
-
-enum
-{
-	InMsgs,
-	OutMsgs,
-	CsumErrs,		/* checksum errors */
-	HlenErrs,		/* header length error */
-	LenErrs,		/* short packet */
-	OutOfOrder,		/* out of order */
-	Retrans,		/* retransmissions */
-	DupMsg,
-	DupBytes,
-	DroppedMsgs,
-
-	Nstats,
-};
-
-static char *statnames[] =
-{
-[InMsgs]	"InMsgs",
-[OutMsgs]	"OutMsgs",
-[CsumErrs]	"CsumErrs",
-[HlenErrs]	"HlenErr",
-[LenErrs]	"LenErrs",
-[OutOfOrder]	"OutOfOrder",
-[Retrans]	"Retrans",
-[DupMsg]	"DupMsg",
-[DupBytes]	"DupBytes",
-[DroppedMsgs]	"DroppedMsgs",
-};
-
-typedef struct Ilpriv Ilpriv;
-struct Ilpriv
-{
-	Ipht	ht;
-
-	ulong	stats[Nstats];
-
-	ulong	csumerr;		/* checksum errors */
-	ulong	hlenerr;		/* header length error */
-	ulong	lenerr;			/* short packet */
-	ulong	order;			/* out of order */
-	ulong	rexmit;			/* retransmissions */
-	ulong	dup;
-	ulong	dupb;
-
-	/* keeping track of the ack kproc */
-	int	ackprocstarted;
-	QLock	apl;
-};
-
-/* state for query/dataquery messages */
-
-
-void	ilrcvmsg(Conv*, Block*);
-void	ilsendctl(Conv*, Ilhdr*, int, ulong, ulong, int);
-void	ilackq(Ilcb*, Block*);
-void	ilprocess(Conv*, Ilhdr*, Block*);
-void	ilpullup(Conv*);
-void	ilhangup(Conv*, char*);
-void	ilfreeq(Ilcb*);
-void	ilrexmit(Ilcb*);
-void	ilbackoff(Ilcb*);
-void	ilsettimeout(Ilcb*);
-char*	ilstart(Conv*, int, int);
-void	ilackproc(void*);
-void	iloutoforder(Conv*, Ilhdr*, Block*);
-void	iliput(Proto*, Ipifc*, Block*);
-void	iladvise(Proto*, Block*, char*);
-int	ilnextqt(Ilcb*);
-void	ilcbinit(Ilcb*);
-int	later(ulong, ulong, char*);
-void	ilreject(Fs*, Ilhdr*);
-void	illocalclose(Conv *c);
-	int 	ilcksum = 1;
-static 	int 	initseq = 25001;
-static	ulong	scalediv, scalemul;
-static	char	*etime = "connection timed out";
-
-static char*
-ilconnect(Conv *c, char **argv, int argc)
-{
-	char *e, *p;
-	int fast;
-
-	/* huge hack to quickly try an il connection */
-	fast = 0;
-	if(argc > 1){
-		p = strstr(argv[1], "!fasttimeout");
-		if(p != nil){
-			*p = 0;
-			fast = 1;
-		}
-	}
-
-	e = Fsstdconnect(c, argv, argc);
-	if(e != nil)
-		return e;
-	return ilstart(c, IL_CONNECT, fast);
-}
-
-static int
-ilstate(Conv *c, char *state, int n)
-{
-	Ilcb *ic;
-
-	ic = (Ilcb*)(c->ptcl);
-	return snprint(state, n, "%s qin %d qout %d del %5.5d Br %5.5d md %5.5d una %5.5lud rex %5.5d rxq %5.5d max %5.5d\n",
-		ilstates[ic->state],
-		c->rq ? qlen(c->rq) : 0,
-		c->wq ? qlen(c->wq) : 0,
-		ic->delay>>LogAGain, ic->rate>>LogAGain, ic->mdev>>LogDGain,
-		ic->unackedbytes, ic->rxtot, ic->rxquery, ic->maxrtt);
-}
-
-static int
-ilinuse(Conv *c)
-{
-	Ilcb *ic;
-
-	ic = (Ilcb*)(c->ptcl);
-	return ic->state != Ilclosed;
-
-}
-
-/* called with c locked */
-static char*
-ilannounce(Conv *c, char **argv, int argc)
-{
-	char *e;
-
-	e = Fsstdannounce(c, argv, argc);
-	if(e != nil)
-		return e;
-	e = ilstart(c, IL_LISTEN, 0);
-	if(e != nil)
-		return e;
-	Fsconnected(c, nil);
-
-	return nil;
-}
-
-void
-illocalclose(Conv *c)
-{
-	Ilcb *ic;
-	Ilpriv *ipriv;
-
-	ipriv = c->p->priv;
-	ic = (Ilcb*)c->ptcl;
-	ic->state = Ilclosed;
-	iphtrem(&ipriv->ht, c);
-	ipmove(c->laddr, IPnoaddr);
-	c->lport = 0;
-}
-
-static void
-ilclose(Conv *c)
-{
-	Ilcb *ic;
-
-	ic = (Ilcb*)c->ptcl;
-
-	qclose(c->rq);
-	qclose(c->wq);
-	qclose(c->eq);
-
-	switch(ic->state) {
-	case Ilclosing:
-	case Ilclosed:
-		break;
-	case Ilsyncer:
-	case Ilsyncee:
-	case Ilestablished:
-		ic->state = Ilclosing;
-		ilsettimeout(ic);
-		ilsendctl(c, nil, Ilclose, ic->next, ic->recvd, 0);
-		break;
-	case Illistening:
-		illocalclose(c);
-		break;
-	}
-	ilfreeq(ic);
-}
-
-void
-ilkick(void *x, Block *bp)
-{
-	Conv *c = x;
-	Ilhdr *ih;
-	Ilcb *ic;
-	int dlen;
-	ulong id, ack;
-	Fs *f;
-	Ilpriv *priv;
-
-	f = c->p->f;
-	priv = c->p->priv;
-	ic = (Ilcb*)c->ptcl;
-
-	if(bp == nil)
-		return;
-
-	switch(ic->state) {
-	case Ilclosed:
-	case Illistening:
-	case Ilclosing:
-		freeblist(bp);
-		qhangup(c->rq, nil);
-		return;
-	}
-
-	dlen = blocklen(bp);
-
-	/* Make space to fit il & ip */
-	bp = padblock(bp, IL_IPSIZE+IL_HDRSIZE);
-	ih = (Ilhdr *)(bp->rp);
-	ih->vihl = IP_VER4;
-
-	/* Ip fields */
-	ih->frag[0] = 0;
-	ih->frag[1] = 0;
-	v6tov4(ih->dst, c->raddr);
-	v6tov4(ih->src, c->laddr);
-	ih->proto = IP_ILPROTO;
-
-	/* Il fields */
-	hnputs(ih->illen, dlen+IL_HDRSIZE);
-	hnputs(ih->ilsrc, c->lport);
-	hnputs(ih->ildst, c->rport);
-
-	qlock(&ic->ackq);
-	id = ic->next++;
-	hnputl(ih->ilid, id);
-	ack = ic->recvd;
-	hnputl(ih->ilack, ack);
-	ic->acksent = ack;
-	ic->acktime = NOW + AckDelay;
-	ih->iltype = Ildata;
-	ih->ilspec = 0;
-	ih->ilsum[0] = 0;
-	ih->ilsum[1] = 0;
-
-	/* Checksum of ilheader plus data (not ip & no pseudo header) */
-	if(ilcksum)
-		hnputs(ih->ilsum, ptclcsum(bp, IL_IPSIZE, dlen+IL_HDRSIZE));
-
-	ilackq(ic, bp);
-	qunlock(&ic->ackq);
-
-	/* Start the round trip timer for this packet if the timer is free */
-	if(ic->rttack == 0) {
-		ic->rttack = id;
-		ic->rttstart = fastticks(nil);
-		ic->rttlen = dlen + IL_IPSIZE + IL_HDRSIZE;
-	}
-
-	if(later(NOW, ic->timeout, nil))
-		ilsettimeout(ic);
-	ipoput4(f, bp, 0, c->ttl, c->tos, c);
-	priv->stats[OutMsgs]++;
-}
-
-static void
-ilcreate(Conv *c)
-{
-	c->rq = qopen(Maxrq, 0, 0, c);
-	c->wq = qbypass(ilkick, c);
-}
-
-int
-ilxstats(Proto *il, char *buf, int len)
-{
-	Ilpriv *priv;
-	char *p, *e;
-	int i;
-
-	priv = il->priv;
-	p = buf;
-	e = p+len;
-	for(i = 0; i < Nstats; i++)
-		p = seprint(p, e, "%s: %lud\n", statnames[i], priv->stats[i]);
-	return p - buf;
-}
-
-void
-ilackq(Ilcb *ic, Block *bp)
-{
-	Block *np;
-	int n;
-
-	n = blocklen(bp);
-
-	/* Enqueue a copy on the unacked queue in case this one gets lost */
-	np = copyblock(bp, n);
-	if(ic->unacked)
-		ic->unackedtail->list = np;
-	else
-		ic->unacked = np;
-	ic->unackedtail = np;
-	np->list = nil;
-	ic->unackedbytes += n;
-}
-
-static
-void
-ilrttcalc(Ilcb *ic, Block *bp)
-{
-	int rtt, tt, pt, delay, rate;
-
-	rtt = fastticks(nil) - ic->rttstart;
-	rtt = (rtt*scalemul)/scalediv;
-	delay = ic->delay;
-	rate = ic->rate;
-
-	/* Guard against zero wrap */
-	if(rtt > 120000 || rtt < 0)
-		return;
-
-	/* this block had to be transmitted after the one acked so count its size */
-	ic->rttlen += blocklen(bp)  + IL_IPSIZE + IL_HDRSIZE;
-
-	if(ic->rttlen < 256){
-		/* guess fixed delay as rtt of small packets */
-		delay += rtt - (delay>>LogAGain);
-		if(delay < AGain)
-			delay = AGain;
-		ic->delay = delay;
-	} else {
-		/* if packet took longer than avg rtt delay, recalc rate */
-		tt = rtt - (delay>>LogAGain);
-		if(tt > 0){
-			rate += ic->rttlen/tt - (rate>>LogAGain);
-			if(rate < AGain)
-				rate = AGain;
-			ic->rate = rate;
-		}
-	}
-
-	/* mdev */
-	pt = ic->rttlen/(rate>>LogAGain) + (delay>>LogAGain);
-	ic->mdev += abs(rtt-pt) - (ic->mdev>>LogDGain);
-
-	if(rtt > ic->maxrtt)
-		ic->maxrtt = rtt;
-}
-
-void
-ilackto(Ilcb *ic, ulong ackto, Block *bp)
-{
-	Ilhdr *h;
-	ulong id;
-
-	if(ic->rttack == ackto)
-		ilrttcalc(ic, bp);
-
-	/* Cancel if we've passed the packet we were interested in */
-	if(ic->rttack <= ackto)
-		ic->rttack = 0;
-
-	qlock(&ic->ackq);
-	while(ic->unacked) {
-		h = (Ilhdr *)ic->unacked->rp;
-		id = nhgetl(h->ilid);
-		if(ackto < id)
-			break;
-
-		bp = ic->unacked;
-		ic->unacked = bp->list;
-		bp->list = nil;
-		ic->unackedbytes -= blocklen(bp);
-		freeblist(bp);
-		ic->rexmit = 0;
-		ilsettimeout(ic);
-	}
-	qunlock(&ic->ackq);
-}
-
-void
-iliput(Proto *il, Ipifc*, Block *bp)
-{
-	char *st;
-	Ilcb *ic;
-	Ilhdr *ih;
-	uchar raddr[IPaddrlen];
-	uchar laddr[IPaddrlen];
-	ushort sp, dp, csum;
-	int plen, illen;
-	Conv *new, *s;
-	Ilpriv *ipriv;
-
-	ipriv = il->priv;
-
-	ih = (Ilhdr *)bp->rp;
-	plen = blocklen(bp);
-	if(plen < IL_IPSIZE+IL_HDRSIZE){
-		netlog(il->f, Logil, "il: hlenerr\n");
-		ipriv->stats[HlenErrs]++;
-		goto raise;
-	}
-
-	illen = nhgets(ih->illen);
-	if(illen+IL_IPSIZE > plen){
-		netlog(il->f, Logil, "il: lenerr\n");
-		ipriv->stats[LenErrs]++;
-		goto raise;
-	}
-
-	sp = nhgets(ih->ildst);
-	dp = nhgets(ih->ilsrc);
-	v4tov6(raddr, ih->src);
-	v4tov6(laddr, ih->dst);
-
-	if((csum = ptclcsum(bp, IL_IPSIZE, illen)) != 0) {
-		if(ih->iltype > Ilclose)
-			st = "?";
-		else
-			st = iltype[ih->iltype];
-		ipriv->stats[CsumErrs]++;
-		netlog(il->f, Logil, "il: cksum %ux %ux, pkt(%s id %lud ack %lud %I/%d->%d)\n",
-			csum, st, nhgetl(ih->ilid), nhgetl(ih->ilack), raddr, sp, dp);
-		goto raise;
-	}
-
-	qlock(il);
-	s = iphtlook(&ipriv->ht, raddr, dp, laddr, sp);
-	if(s == nil){
-		if(ih->iltype == Ilsync)
-			ilreject(il->f, ih);		/* no listener */
-		qunlock(il);
-		goto raise;
-	}
-
-	ic = (Ilcb*)s->ptcl;
-	if(ic->state == Illistening){
-		if(ih->iltype != Ilsync){
-			qunlock(il);
-			if(ih->iltype > Ilclose)
-				st = "?";
-			else
-				st = iltype[ih->iltype];
-			ilreject(il->f, ih);		/* no channel and not sync */
-			netlog(il->f, Logil, "il: no channel, pkt(%s id %lud ack %lud %I/%ud->%ud)\n",
-				st, nhgetl(ih->ilid), nhgetl(ih->ilack), raddr, sp, dp); 
-			goto raise;
-		}
-
-		new = Fsnewcall(s, raddr, dp, laddr, sp, V4);
-		if(new == nil){
-			qunlock(il);
-			netlog(il->f, Logil, "il: bad newcall %I/%ud->%ud\n", raddr, sp, dp);
-			ilsendctl(s, ih, Ilclose, 0, nhgetl(ih->ilid), 0);
-			goto raise;
-		}
-		s = new;
-
-		ic = (Ilcb*)s->ptcl;
-	
-		ic->conv = s;
-		ic->state = Ilsyncee;
-		ilcbinit(ic);
-		ic->rstart = nhgetl(ih->ilid);
-		iphtadd(&ipriv->ht, s);
-	}
-
-	qlock(s);
-	qunlock(il);
-	if(waserror()){
-		qunlock(s);
-		nexterror();
-	}
-	ilprocess(s, ih, bp);
-	qunlock(s);
-	poperror();
-	return;
-raise:
-	freeblist(bp);
-}
-
-void
-_ilprocess(Conv *s, Ilhdr *h, Block *bp)
-{
-	Ilcb *ic;
-	ulong id, ack;
-	Ilpriv *priv;
-
-	id = nhgetl(h->ilid);
-	ack = nhgetl(h->ilack);
-
-	ic = (Ilcb*)s->ptcl;
-
-	ic->lastrecv = NOW;
-	ic->querytime = NOW + QueryTime;
-	priv = s->p->priv;
-	priv->stats[InMsgs]++;
-
-	switch(ic->state) {
-	default:
-		netlog(s->p->f, Logil, "il: unknown state %d\n", ic->state);
-	case Ilclosed:
-		freeblist(bp);
-		break;
-	case Ilsyncer:
-		switch(h->iltype) {
-		default:
-			break;
-		case Ilsync:
-			if(ack != ic->start)
-				ilhangup(s, "connection rejected");
-			else {
-				ic->recvd = id;
-				ic->rstart = id;
-				ilsendctl(s, nil, Ilack, ic->next, ic->recvd, 0);
-				ic->state = Ilestablished;
-				ic->fasttimeout = 0;
-				ic->rexmit = 0;
-				Fsconnected(s, nil);
-				ilpullup(s);
-			}
-			break;
-		case Ilclose:
-			if(ack == ic->start)
-				ilhangup(s, "connection rejected");
-			break;
-		}
-		freeblist(bp);
-		break;
-	case Ilsyncee:
-		switch(h->iltype) {
-		default:
-			break;
-		case Ilsync:
-			if(id != ic->rstart || ack != 0){
-				illocalclose(s);
-			} else {
-				ic->recvd = id;
-				ilsendctl(s, nil, Ilsync, ic->start, ic->recvd, 0);
-			}
-			break;
-		case Ilack:
-			if(ack == ic->start) {
-				ic->state = Ilestablished;
-				ic->fasttimeout = 0;
-				ic->rexmit = 0;
-				ilpullup(s);
-			}
-			break;
-		case Ildata:
-			if(ack == ic->start) {
-				ic->state = Ilestablished;
-				ic->fasttimeout = 0;
-				ic->rexmit = 0;
-				goto established;
-			}
-			break;
-		case Ilclose:
-			if(ack == ic->start)
-				ilhangup(s, "remote close");
-			break;
-		}
-		freeblist(bp);
-		break;
-	case Ilestablished:
-	established:
-		switch(h->iltype) {
-		case Ilsync:
-			if(id != ic->rstart)
-				ilhangup(s, "remote close");
-			else
-				ilsendctl(s, nil, Ilack, ic->next, ic->rstart, 0);
-			freeblist(bp);	
-			break;
-		case Ildata:
-			/*
-			 * avoid consuming all the mount rpc buffers in the
-			 * system.  if the input queue is too long, drop this
-			 * packet.
-			 */
-			if (s->rq && qlen(s->rq) >= Maxrq) {
-				priv->stats[DroppedMsgs]++;
-				freeblist(bp);
-				break;
-			}
-
-			ilackto(ic, ack, bp);
-			iloutoforder(s, h, bp);
-			ilpullup(s);
-			break;
-		case Ildataquery:
-			ilackto(ic, ack, bp);
-			iloutoforder(s, h, bp);
-			ilpullup(s);
-			ilsendctl(s, nil, Ilstate, ic->next, ic->recvd, h->ilspec);
-			break;
-		case Ilack:
-			ilackto(ic, ack, bp);
-			freeblist(bp);
-			break;
-		case Ilquery:
-			ilackto(ic, ack, bp);
-			ilsendctl(s, nil, Ilstate, ic->next, ic->recvd, h->ilspec);
-			freeblist(bp);
-			break;
-		case Ilstate:
-			if(ack >= ic->rttack)
-				ic->rttack = 0;
-			ilackto(ic, ack, bp);
-			if(h->ilspec > Nqt)
-				h->ilspec = 0;
-			if(ic->qt[h->ilspec] > ack){
-				ilrexmit(ic);
-				ilsettimeout(ic);
-			}
-			freeblist(bp);
-			break;
-		case Ilclose:
-			freeblist(bp);
-			if(ack < ic->start || ack > ic->next) 
-				break;
-			ic->recvd = id;
-			ilsendctl(s, nil, Ilclose, ic->next, ic->recvd, 0);
-			ic->state = Ilclosing;
-			ilsettimeout(ic);
-			ilfreeq(ic);
-			break;
-		}
-		break;
-	case Illistening:
-		freeblist(bp);
-		break;
-	case Ilclosing:
-		switch(h->iltype) {
-		case Ilclose:
-			ic->recvd = id;
-			ilsendctl(s, nil, Ilclose, ic->next, ic->recvd, 0);
-			if(ack == ic->next)
-				ilhangup(s, nil);
-			break;
-		default:
-			break;
-		}
-		freeblist(bp);
-		break;
-	}
-}
-
-void
-ilrexmit(Ilcb *ic)
-{
-	Ilhdr *h;
-	Block *nb;
-	Conv *c;
-	ulong id;
-	Ilpriv *priv;
-
-	nb = nil;
-	qlock(&ic->ackq);
-	if(ic->unacked)
-		nb = copyblock(ic->unacked, blocklen(ic->unacked));
-	qunlock(&ic->ackq);
-
-	if(nb == nil)
-		return;
-
-	h = (Ilhdr*)nb->rp;
-	h->vihl = IP_VER4;
-
-	h->iltype = Ildataquery;
-	hnputl(h->ilack, ic->recvd);
-	h->ilspec = ilnextqt(ic);
-	h->ilsum[0] = 0;
-	h->ilsum[1] = 0;
-	hnputs(h->ilsum, ptclcsum(nb, IL_IPSIZE, nhgets(h->illen)));
-
-	c = ic->conv;
-	id = nhgetl(h->ilid);
-	netlog(c->p->f, Logil, "il: rexmit %d %ud: %d %d: %i %d/%d\n", id, ic->recvd,
-		ic->rexmit, ic->timeout,
-		c->raddr, c->lport, c->rport);
-
-	ilbackoff(ic);
-
-	ipoput4(c->p->f, nb, 0, c->ttl, c->tos, c);
-
-	/* statistics */
-	ic->rxtot++;
-	priv = c->p->priv;
-	priv->rexmit++;
-}
-
-/* DEBUG */
-void
-ilprocess(Conv *s, Ilhdr *h, Block *bp)
-{
-	Ilcb *ic;
-
-	ic = (Ilcb*)s->ptcl;
-
-	USED(ic);
-	netlog(s->p->f, Logilmsg, "%11s rcv %d/%d snt %d/%d pkt(%s id %d ack %d %d->%d) ",
-		ilstates[ic->state],  ic->rstart, ic->recvd, ic->start, 
-		ic->next, iltype[h->iltype], nhgetl(h->ilid), 
-		nhgetl(h->ilack), nhgets(h->ilsrc), nhgets(h->ildst));
-
-	_ilprocess(s, h, bp);
-
-	netlog(s->p->f, Logilmsg, "%11s rcv %d snt %d\n", ilstates[ic->state], ic->recvd, ic->next);
-}
-
-void
-ilhangup(Conv *s, char *msg)
-{
-	Ilcb *ic;
-	int callout;
-
-	netlog(s->p->f, Logil, "il: hangup! %I %d/%d: %s\n", s->raddr,
-		s->lport, s->rport, msg?msg:"no reason");
-
-	ic = (Ilcb*)s->ptcl;
-	callout = ic->state == Ilsyncer;
-	illocalclose(s);
-
-	qhangup(s->rq, msg);
-	qhangup(s->wq, msg);
-
-	if(callout)
-		Fsconnected(s, msg);
-}
-
-void
-ilpullup(Conv *s)
-{
-	Ilcb *ic;
-	Ilhdr *oh;
-	Block *bp;
-	ulong oid, dlen;
-	Ilpriv *ipriv;
-
-	ic = (Ilcb*)s->ptcl;
-	if(ic->state != Ilestablished)
-		return;
-
-	qlock(&ic->outo);
-	while(ic->outoforder) {
-		bp = ic->outoforder;
-		oh = (Ilhdr*)bp->rp;
-		oid = nhgetl(oh->ilid);
-		if(oid <= ic->recvd) {
-			ic->outoforder = bp->list;
-			freeblist(bp);
-			continue;
-		}
-		if(oid != ic->recvd+1){
-			ipriv = s->p->priv;
-			ipriv->stats[OutOfOrder]++;
-			break;
-		}
-
-		ic->recvd = oid;
-		ic->outoforder = bp->list;
-
-		bp->list = nil;
-		dlen = nhgets(oh->illen)-IL_HDRSIZE;
-		bp = trimblock(bp, IL_IPSIZE+IL_HDRSIZE, dlen);
-		/*
-		 * Upper levels don't know about multiple-block
-		 * messages so copy all into one (yick).
-		 */
-		bp = concatblock(bp);
-		if(bp == 0)
-			panic("ilpullup");
-		bp = packblock(bp);
-		if(bp == 0)
-			panic("ilpullup2");
-		qpass(s->rq, bp);
-	}
-	qunlock(&ic->outo);
-}
-
-void
-iloutoforder(Conv *s, Ilhdr *h, Block *bp)
-{
-	Ilcb *ic;
-	uchar *lid;
-	Block *f, **l;
-	ulong id, newid;
-	Ilpriv *ipriv;
-
-	ipriv = s->p->priv;
-	ic = (Ilcb*)s->ptcl;
-	bp->list = nil;
-
-	id = nhgetl(h->ilid);
-	/* Window checks */
-	if(id <= ic->recvd || id > ic->recvd+ic->window) {
-		netlog(s->p->f, Logil, "il: message outside window %ud <%ud-%ud>: %i %d/%d\n",
-			id, ic->recvd, ic->recvd+ic->window, s->raddr, s->lport, s->rport);
-		freeblist(bp);
-		return;
-	}
-
-	/* Packet is acceptable so sort onto receive queue for pullup */
-	qlock(&ic->outo);
-	if(ic->outoforder == nil)
-		ic->outoforder = bp;
-	else {
-		l = &ic->outoforder;
-		for(f = *l; f; f = f->list) {
-			lid = ((Ilhdr*)(f->rp))->ilid;
-			newid = nhgetl(lid);
-			if(id <= newid) {
-				if(id == newid) {
-					ipriv->stats[DupMsg]++;
-					ipriv->stats[DupBytes] += blocklen(bp);
-					qunlock(&ic->outo);
-					freeblist(bp);
-					return;
-				}
-				bp->list = f;
-				*l = bp;
-				qunlock(&ic->outo);
-				return;
-			}
-			l = &f->list;
-		}
-		*l = bp;
-	}
-	qunlock(&ic->outo);
-}
-
-void
-ilsendctl(Conv *ipc, Ilhdr *inih, int type, ulong id, ulong ack, int ilspec)
-{
-	Ilhdr *ih;
-	Ilcb *ic;
-	Block *bp;
-	int ttl, tos;
-
-	bp = allocb(IL_IPSIZE+IL_HDRSIZE);
-	bp->wp += IL_IPSIZE+IL_HDRSIZE;
-
-	ih = (Ilhdr *)(bp->rp);
-	ih->vihl = IP_VER4;
-
-	/* Ip fields */
-	ih->proto = IP_ILPROTO;
-	hnputs(ih->illen, IL_HDRSIZE);
-	ih->frag[0] = 0;
-	ih->frag[1] = 0;
-	if(inih) {
-		hnputl(ih->dst, nhgetl(inih->src));
-		hnputl(ih->src, nhgetl(inih->dst));
-		hnputs(ih->ilsrc, nhgets(inih->ildst));
-		hnputs(ih->ildst, nhgets(inih->ilsrc));
-		hnputl(ih->ilid, nhgetl(inih->ilack));
-		hnputl(ih->ilack, nhgetl(inih->ilid));
-		ttl = MAXTTL;
-		tos = DFLTTOS;
-	}
-	else {
-		v6tov4(ih->dst, ipc->raddr);
-		v6tov4(ih->src, ipc->laddr);
-		hnputs(ih->ilsrc, ipc->lport);
-		hnputs(ih->ildst, ipc->rport);
-		hnputl(ih->ilid, id);
-		hnputl(ih->ilack, ack);
-		ic = (Ilcb*)ipc->ptcl;
-		ic->acksent = ack;
-		ic->acktime = NOW;
-		ttl = ipc->ttl;
-		tos = ipc->tos;
-	}
-	ih->iltype = type;
-	ih->ilspec = ilspec;
-	ih->ilsum[0] = 0;
-	ih->ilsum[1] = 0;
-
-	if(ilcksum)
-		hnputs(ih->ilsum, ptclcsum(bp, IL_IPSIZE, IL_HDRSIZE));
-
-if(ipc==nil)
-	panic("ipc is nil caller is %#p", getcallerpc(&ipc));
-if(ipc->p==nil)
-	panic("ipc->p is nil");
-
-	netlog(ipc->p->f, Logilmsg, "ctl(%s id %d ack %d %d->%d)\n",
-		iltype[ih->iltype], nhgetl(ih->ilid), nhgetl(ih->ilack), 
-		nhgets(ih->ilsrc), nhgets(ih->ildst));
-
-	ipoput4(ipc->p->f, bp, 0, ttl, tos, ipc);
-}
-
-void
-ilreject(Fs *f, Ilhdr *inih)
-{
-	Ilhdr *ih;
-	Block *bp;
-
-	bp = allocb(IL_IPSIZE+IL_HDRSIZE);
-	bp->wp += IL_IPSIZE+IL_HDRSIZE;
-
-	ih = (Ilhdr *)(bp->rp);
-	ih->vihl = IP_VER4;
-
-	/* Ip fields */
-	ih->proto = IP_ILPROTO;
-	hnputs(ih->illen, IL_HDRSIZE);
-	ih->frag[0] = 0;
-	ih->frag[1] = 0;
-	hnputl(ih->dst, nhgetl(inih->src));
-	hnputl(ih->src, nhgetl(inih->dst));
-	hnputs(ih->ilsrc, nhgets(inih->ildst));
-	hnputs(ih->ildst, nhgets(inih->ilsrc));
-	hnputl(ih->ilid, nhgetl(inih->ilack));
-	hnputl(ih->ilack, nhgetl(inih->ilid));
-	ih->iltype = Ilclose;
-	ih->ilspec = 0;
-	ih->ilsum[0] = 0;
-	ih->ilsum[1] = 0;
-
-	if(ilcksum)
-		hnputs(ih->ilsum, ptclcsum(bp, IL_IPSIZE, IL_HDRSIZE));
-
-	ipoput4(f, bp, 0, MAXTTL, DFLTTOS, nil);
-}
-
-void
-ilsettimeout(Ilcb *ic)
-{
-	ulong pt;
-
-	pt = (ic->delay>>LogAGain)
-		+ ic->unackedbytes/(ic->rate>>LogAGain)
-		+ (ic->mdev>>(LogDGain-1))
-		+ AckDelay;
-	if(pt > MaxTimeout)
-		pt = MaxTimeout;
-	ic->timeout = NOW + pt;
-}
-
-void
-ilbackoff(Ilcb *ic)
-{
-	ulong pt;
-	int i;
-
-	pt = (ic->delay>>LogAGain)
-		+ ic->unackedbytes/(ic->rate>>LogAGain)
-		+ (ic->mdev>>(LogDGain-1))
-		+ AckDelay;
-	for(i = 0; i < ic->rexmit; i++)
-		pt = pt + (pt>>1);
-	if(pt > MaxTimeout)
-		pt = MaxTimeout;
-	ic->timeout = NOW + pt;
-
-	if(ic->fasttimeout)
-		ic->timeout = NOW+Iltickms;
-
-	ic->rexmit++;
-}
-
-// complain if two numbers not within an hour of each other
-#define Tfuture (1000*60*60)
-int
-later(ulong t1, ulong t2, char *x)
-{
-	int dt;
-
-	dt = t1 - t2;
-	if(dt > 0) {
-		if(x != nil && dt > Tfuture)
-			print("%s: way future %d\n", x, dt);
-		return 1;
-	}
-	if(dt < -Tfuture) {
-		if(x != nil)
-			print("%s: way past %d\n", x, -dt);
-		return 1;
-	}
-	return 0;
-}
-
-void
-ilackproc(void *x)
-{
-	Ilcb *ic;
-	Conv **s, *p;
-	Proto *il;
-
-	il = x;
-
-loop:
-	tsleep(&up->sleep, return0, 0, Iltickms);
-	for(s = il->conv; s && *s; s++) {
-		p = *s;
-		ic = (Ilcb*)p->ptcl;
-
-		switch(ic->state) {
-		case Ilclosed:
-		case Illistening:
-			break;
-		case Ilclosing:
-			if(later(NOW, ic->timeout, "timeout0")) {
-				if(ic->rexmit > MaxRexmit){
-					ilhangup(p, nil);
-					break;
-				}
-				ilsendctl(p, nil, Ilclose, ic->next, ic->recvd, 0);
-				ilbackoff(ic);
-			}
-			break;
-
-		case Ilsyncee:
-		case Ilsyncer:
-			if(later(NOW, ic->timeout, "timeout1")) {
-				if(ic->rexmit > MaxRexmit){
-					ilhangup(p, etime);
-					break;
-				}
-				ilsendctl(p, nil, Ilsync, ic->start, ic->recvd, 0);
-				ilbackoff(ic);
-			}
-			break;
-
-		case Ilestablished:
-			if(ic->recvd != ic->acksent)
-			if(later(NOW, ic->acktime, "acktime"))
-				ilsendctl(p, nil, Ilack, ic->next, ic->recvd, 0);
-
-			if(later(NOW, ic->querytime, "querytime")){
-				if(later(NOW, ic->lastrecv+DeathTime, "deathtime")){
-					netlog(il->f, Logil, "il: hangup: deathtime\n");
-					ilhangup(p, etime);
-					break;
-				}
-				ilsendctl(p, nil, Ilquery, ic->next, ic->recvd, ilnextqt(ic));
-				ic->querytime = NOW + QueryTime;
-			}
-
-			if(ic->unacked != nil)
-			if(later(NOW, ic->timeout, "timeout2")) {
-				if(ic->rexmit > MaxRexmit){
-					netlog(il->f, Logil, "il: hangup: too many rexmits\n");
-					ilhangup(p, etime);
-					break;
-				}
-				ilsendctl(p, nil, Ilquery, ic->next, ic->recvd, ilnextqt(ic));
-				ic->rxquery++;
-				ilbackoff(ic);
-			}
-			break;
-		}
-	}
-	goto loop;
-}
-
-void
-ilcbinit(Ilcb *ic)
-{
-	ic->start = nrand(0x1000000);
-	ic->next = ic->start+1;
-	ic->recvd = 0;
-	ic->window = Defaultwin;
-	ic->unackedbytes = 0;
-	ic->unacked = nil;
-	ic->outoforder = nil;
-	ic->rexmit = 0;
-	ic->rxtot = 0;
-	ic->rxquery = 0;
-	ic->qtx = 1;
-	ic->fasttimeout = 0;
-
-	/* timers */
-	ic->delay = DefRtt<<LogAGain;
-	ic->mdev = DefRtt<<LogDGain;
-	ic->rate = DefByteRate<<LogAGain;
-	ic->querytime = NOW + QueryTime;
-	ic->lastrecv = NOW;	/* or we'll timeout right away */
-	ilsettimeout(ic);
-}
-
-char*
-ilstart(Conv *c, int type, int fasttimeout)
-{
-	Ilcb *ic;
-	Ilpriv *ipriv;
-	char kpname[KNAMELEN];
-
-	ipriv = c->p->priv;
-
-	if(ipriv->ackprocstarted == 0){
-		qlock(&ipriv->apl);
-		if(ipriv->ackprocstarted == 0){
-			sprint(kpname, "#I%dilack", c->p->f->dev);
-			kproc(kpname, ilackproc, c->p);
-			ipriv->ackprocstarted = 1;
-		}
-		qunlock(&ipriv->apl);
-	}
-
-	ic = (Ilcb*)c->ptcl;
-	ic->conv = c;
-
-	if(ic->state != Ilclosed)
-		return nil;
-
-	ilcbinit(ic);
-
-	if(fasttimeout){
-		/* timeout if we can't connect quickly */
-		ic->fasttimeout = 1;
-		ic->timeout = NOW+Iltickms;
-		ic->rexmit = MaxRexmit - 4;
-	};
-
-	switch(type) {
-	default:
-		netlog(c->p->f, Logil, "il: start: type %d\n", type);
-		break;
-	case IL_LISTEN:
-		ic->state = Illistening;
-		iphtadd(&ipriv->ht, c);
-		break;
-	case IL_CONNECT:
-		ic->state = Ilsyncer;
-		iphtadd(&ipriv->ht, c);
-		ilsendctl(c, nil, Ilsync, ic->start, ic->recvd, 0);
-		break;
-	}
-
-	return nil;
-}
-
-void
-ilfreeq(Ilcb *ic)
-{
-	Block *bp, *next;
-
-	qlock(&ic->ackq);
-	for(bp = ic->unacked; bp; bp = next) {
-		next = bp->list;
-		freeblist(bp);
-	}
-	ic->unacked = nil;
-	qunlock(&ic->ackq);
-
-	qlock(&ic->outo);
-	for(bp = ic->outoforder; bp; bp = next) {
-		next = bp->list;
-		freeblist(bp);
-	}
-	ic->outoforder = nil;
-	qunlock(&ic->outo);
-}
-
-void
-iladvise(Proto *il, Block *bp, char *msg)
-{
-	Ilhdr *h;
-	Ilcb *ic;		
-	uchar source[IPaddrlen], dest[IPaddrlen];
-	ushort psource;
-	Conv *s, **p;
-
-	h = (Ilhdr*)(bp->rp);
-
-	v4tov6(dest, h->dst);
-	v4tov6(source, h->src);
-	psource = nhgets(h->ilsrc);
-
-
-	/* Look for a connection, unfortunately the destination port is missing */
-	qlock(il);
-	for(p = il->conv; *p; p++) {
-		s = *p;
-		if(s->lport == psource)
-		if(ipcmp(s->laddr, source) == 0)
-		if(ipcmp(s->raddr, dest) == 0){
-			qunlock(il);
-			ic = (Ilcb*)s->ptcl;
-			switch(ic->state){
-			case Ilsyncer:
-				ilhangup(s, msg);
-				break;
-			}
-			freeblist(bp);
-			return;
-		}
-	}
-	qunlock(il);
-	freeblist(bp);
-}
-
-int
-ilnextqt(Ilcb *ic)
-{
-	int x;
-
-	qlock(&ic->ackq);
-	x = ic->qtx;
-	if(++x > Nqt)
-		x = 1;
-	ic->qtx = x;
-	ic->qt[x] = ic->next-1;	/* highest xmitted packet */
-	ic->qt[0] = ic->qt[x];	/* compatibility with old implementations */
-	qunlock(&ic->ackq);
-
-	return x;
-}
-
-/* calculate scale constants that converts fast ticks to ms (more or less) */
-static void
-inittimescale(void)
-{
-	uvlong hz;
-
-	fastticks(&hz);
-	if(hz > 1000){
-		scalediv = hz/1000;
-		scalemul = 1;
-	} else {
-		scalediv = 1;
-		scalemul = 1000/hz;
-	}
-}
-
-void
-ilinit(Fs *f)
-{
-	Proto *il;
-
-	inittimescale();
-
-	il = smalloc(sizeof(Proto));
-	il->priv = smalloc(sizeof(Ilpriv));
-	il->name = "il";
-	il->connect = ilconnect;
-	il->announce = ilannounce;
-	il->state = ilstate;
-	il->create = ilcreate;
-	il->close = ilclose;
-	il->rcv = iliput;
-	il->ctl = nil;
-	il->advise = iladvise;
-	il->stats = ilxstats;
-	il->inuse = ilinuse;
-	il->gc = nil;
-	il->ipproto = IP_ILPROTO;
-	il->nc = scalednconv();
-	il->ptclsize = sizeof(Ilcb);
-	Fsproto(f, il);
-}

+ 0 - 2
sys/src/9/ip/ip.h

@@ -408,11 +408,9 @@ enum
 	Logip=		1<<1,
 	Logtcp=		1<<2,
 	Logfs=		1<<3,
-	Logil=		1<<4,
 	Logicmp=	1<<5,
 	Logudp=		1<<6,
 	Logcompress=	1<<7,
-	Logilmsg=	1<<8,
 	Loggre=		1<<9,
 	Logppp=		1<<10,
 	Logtcprxmt=	1<<11,

+ 0 - 2
sys/src/9/ip/netlog.c

@@ -40,11 +40,9 @@ static Netlogflag flags[] =
 	{ "ip",		Logip, },
 	{ "fs",		Logfs, },
 	{ "tcp",	Logtcp, },
-	{ "il",		Logil, },
 	{ "icmp",	Logicmp, },
 	{ "udp",	Logudp, },
 	{ "compress",	Logcompress, },
-	{ "ilmsg",	Logil|Logilmsg, },
 	{ "gre",	Loggre, },
 	{ "tcpwin",	Logtcp|Logtcpwin, },
 	{ "tcprxmt",	Logtcp|Logtcprxmt, },

+ 0 - 2
sys/src/9/mtx/mtx

@@ -27,7 +27,6 @@ misc
 	uarti8250
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -38,7 +37,6 @@ port
 	int cpuserver = 0;
 
 boot
-	il
 
 bootdir
 	bootmtx.out boot

+ 0 - 2
sys/src/9/mtx/mtxcpu

@@ -27,7 +27,6 @@ misc
 	uarti8250
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -38,7 +37,6 @@ port
 	int cpuserver = 1;
 
 boot cpu
-	il
 
 bootdir
 	bootmtxcpu.out boot

+ 0 - 2
sys/src/9/pc/pc

@@ -99,7 +99,6 @@ misc
 	vgavmware	+cur
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -112,7 +111,6 @@ port
 
 boot
 	tcp
-	il
 
 bootdir
 	bootpc.out boot

+ 0 - 2
sys/src/9/pc/pcauth

@@ -47,7 +47,6 @@ misc
 	vgas3 		+cur vgasavage
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -59,7 +58,6 @@ port
 
 boot cpu boot #S/sdC0/
 	tcp
-	il
 	local
 
 bootdir

+ 0 - 2
sys/src/9/pc/pccd

@@ -97,7 +97,6 @@ misc
 	vgavmware	+cur
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -108,7 +107,6 @@ port
 	int cpuserver = 0;
 
 boot boot #S/sdD0/data
-	il
 	tcp
 	local
 

+ 0 - 2
sys/src/9/pc/pccpu

@@ -60,7 +60,6 @@ misc
 	sdmylex		pci sdscsi
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -76,7 +75,6 @@ port
 
 boot cpu
 	tcp
-	il
 
 bootdir
 	bootpccpu.out boot

+ 0 - 2
sys/src/9/pc/pccpuf

@@ -94,7 +94,6 @@ misc
 
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -110,7 +109,6 @@ port
 
 boot cpu boot #S/sdC0/
 	tcp
-	il
 	local
 
 bootdir

+ 0 - 2
sys/src/9/pc/pcdisk

@@ -96,7 +96,6 @@ misc
 	vgavmware	+cur
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -108,7 +107,6 @@ port
 
 boot boot #S/sdC0/
 	tcp
-	il
 	local
 
 bootdir

+ 0 - 2
sys/src/9/pc/pcf

@@ -98,7 +98,6 @@ misc
 	vgavmware	+cur
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -110,7 +109,6 @@ port
 
 boot boot #S/sdC0/
 	tcp
-	il
 	local
 
 bootdir

+ 0 - 2
sys/src/9/pc/pcfl

@@ -90,7 +90,6 @@ misc
 	vgavmware	+cur
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -101,7 +100,6 @@ port
 	int cpuserver = 0;
 
 boot boot #S/sdC0/
-	il
 	local
 
 bootdir

+ 0 - 1
sys/src/9/pc/pcflop

@@ -98,7 +98,6 @@ misc
 	vgavmware	+cur
 
 ip
-	il
 	tcp
 	udp
 	ipifc

+ 0 - 2
sys/src/9/ppc/blast

@@ -28,7 +28,6 @@ misc
 	m8260
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -39,7 +38,6 @@ port
 	int cpuserver = 1;
 
 boot cpu
-	il
 	tcp
 
 bootdir

+ 0 - 2
sys/src/9/ppc/ucu

@@ -27,7 +27,6 @@ misc
 	msaturn
 
 ip
-	il
 	tcp
 	udp
 	ipifc
@@ -38,7 +37,6 @@ port
 	int cpuserver = 1;
 
 boot cpu
-	il
 	tcp
 
 bootdir

+ 7 - 1
sys/src/cmd/ndb/dblookup.c

@@ -10,7 +10,13 @@ enum {
 	Nibmask = (1<<Nibwidth) - 1,
 	V6maxrevdomdepth = 128 / Nibwidth,	/* bits / bits-per-nibble */
 
-	Ptrttl = 300,		/* ttl for generated ptr records; was 0 */
+	/*
+	 * ttl for generated ptr records.  it was zero, which might seem
+	 * like a good idea, but some dns implementations seem to be
+	 * confused by a zero ttl, and instead of using the data and then
+	 * discarding the RR, they conclude that they don't have valid data.
+	 */
+	Ptrttl = 300,
 };
 
 static Ndb *db;

+ 0 - 178
sys/src/fs/9netics32.16k/9net32.16kfs.c

@@ -1,178 +0,0 @@
-#include "all.h"
-#include "mem.h"
-#include "io.h"
-#include "ureg.h"
-
-#include "../pc/dosfs.h"
-
-/*
- * setting this to zero permits the use of discs of different sizes, but
- * can make jukeinit() quite slow while the robotics work through each disc
- * twice (once per side).
- */
-int FIXEDSIZE = 1;
-
-#ifndef	DATE
-#define	DATE	1094098624L
-#endif
-
-Timet	mktime		= DATE;				/* set by mkfile */
-Startsb	startsb[] =
-{
-	"main",		2,	/* */
-	0
-};
-
-Dos dos;
-
-static struct
-{
-	char	*name;
-	Off	(*read)(int, void*, long);
-	Devsize	(*seek)(int, Devsize);
-	Off	(*write)(int, void*, long);
-	int	(*part)(int, char*);
-} nvrdevs[] = {
-	{ "fd", floppyread, floppyseek, floppywrite, 0, },
-	{ "hd", ataread,   ataseek,   atawrite,   setatapart, },
-	/* { "sd", scsiread,   scsiseek,   scsiwrite,   setscsipart, },  */
-	{ 0, },
-};
-
-void apcinit(void);
-
-void
-otherinit(void)
-{
-	int dev, i, nfd, nhd, s;
-	char *p, *q, buf[sizeof(nvrfile)+8];
-
-	kbdinit();
-	printcpufreq();
-	etherinit();
-	scsiinit();
-	apcinit();
-
-	s = spllo();
-	nhd = atainit();
-	nfd = floppyinit();
-	dev = 0;
-	if(p = getconf("nvr")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed nvrfile: %s\n", buf);
-		*p++ = 0;
-		*q++ = 0;
-		dev = strtoul(p, 0, 0);
-		strcpy(nvrfile, q);
-		p = buf;
-	} else
-	if(p = getconf("bootfile")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed bootfile: %s\n", buf);
-		*p++ = 0;
-		*q = 0;
-		dev = strtoul(p, 0, 0);
-		p = buf;
-	} else
-	if(nfd)
-		p = "fd";
-	else
-	if(nhd)
-		p = "hd";
-	else
-		p = "sd";
-
-	for(i = 0; nvrdevs[i].name; i++){
-		if(strcmp(p, nvrdevs[i].name) == 0){
-			dos.dev = dev;
-			if(nvrdevs[i].part && (*nvrdevs[i].part)(dos.dev, "disk") == 0)
-				break;
-			dos.read = nvrdevs[i].read;
-			dos.seek = nvrdevs[i].seek;
-			dos.write = nvrdevs[i].write;
-			break;
-		}
-	}
-	if(dos.read == 0)
-		panic("no device for nvram\n");
-	if(dosinit(&dos) < 0)
-		panic("can't init dos dosfs on %s\n", p);
-	splx(s);
-}
-
-void
-touser(void)
-{
-	int i;
-
-	settime(rtctime());
-	boottime = time();
-
-	print("sysinit\n");
-	sysinit();
-
-	userinit(floppyproc, 0, "floppyproc");
-	/*
-	 * Ethernet i/o processes
-	 */
-	etherstart();
-
-
-	/*
-	 * read ahead processes
-	 */
-	userinit(rahead, 0, "rah");
-
-	/*
-	 * server processes
-	 */
-	for(i=0; i<conf.nserve; i++)
-		userinit(serve, 0, "srv");
-
-	/*
-	 * worm "dump" copy process
-	 */
-	userinit(wormcopy, 0, "wcp");
-
-	/*
-	 * processes to read the console
-	 */
-	consserve();
-
-	/*
-	 * "sync" copy process
-	 * this doesn't return.
-	 */
-	u->text = "scp";
-	synccopy();
-}
-
-void
-localconfinit(void)
-{
-	/* conf.nfile = 60000; */	/* from emelie */
-	conf.nodump = 0;
-	conf.dumpreread = 0;
-	conf.firstsb = 0;	/* time- & jukebox-dependent optimisation */
-	conf.recovsb = 0;	/* 971531 is 24 june 2003, before w3 died */
-	conf.ripoff = 1;
-	conf.nlgmsg = 1100;	/* @8576 bytes, for packets */
-	conf.nsmmsg = 500;	/* @128 bytes */
-
-	conf.minuteswest = 8*60;
-	conf.dsttime = 1;
-}
-
-int (*fsprotocol[])(Msgbuf*) = {
-	serve9p1,		/* TODO: do we still need 9P1? */
-	serve9p2,
-	nil,
-};

+ 0 - 35
sys/src/fs/9netics32.16k/dat.h

@@ -1,35 +0,0 @@
-/*
- * The most fundamental constant.
- * The code will not compile with RBUFSIZE made a variable;
- * for one thing, RBUFSIZE determines FEPERBUF, which determines
- * the number of elements in a free-list-block array.
- */
-#define RBUFSIZE	(16*1024)	/* raw buffer size */
-
-#include "../port/portdat.h"
-
-extern	Mach	mach0;
-
-typedef struct Segdesc	Segdesc;
-struct Segdesc
-{
-	ulong	d0;
-	ulong	d1;
-};
-
-typedef struct Mbank {
-	ulong	base;
-	ulong	limit;
-} Mbank;
-
-#define MAXBANK		8
-
-typedef struct Mconf {
-	Lock;
-	Mbank	bank[MAXBANK];
-	int	nbank;
-	ulong	topofmem;
-} Mconf;
-extern Mconf mconf;
-
-extern char nvrfile[128];

+ 0 - 87
sys/src/fs/9netics32.16k/fns.h

@@ -1,87 +0,0 @@
-ulong	strtoul(char*, char**, int);
-vlong	strtoll(char*, char**, int);
-
-#include "../port/portfns.h"
-
-void	aamloop(int);
-void	cgaputc(int);
-void	cgaputs(char*, int);
-int	cistrcmp(char*, char*);
-int	cistrncmp(char*, char*, int);
-void	(*coherence)(void);
-void	etherinit(void);
-void	etherstart(void);
-int	floppyinit(void);
-void	floppyproc(void);
-Off	floppyread(int, void*, long);
-Devsize	floppyseek(int, Devsize);
-Off	floppywrite(int, void*, long);
-void	fpinit(void);
-char*	getconf(char*);
-ulong	getcr0(void);
-ulong	getcr2(void);
-ulong	getcr4(void);
-int	getfields(char*, char**, int, int, char*);
-ulong	getstatus(void);
-int	atainit(void);
-Off	ataread(int, void*, long);
-Devsize	ataseek(int, Devsize);
-Off	atawrite(int, void*, long);
-void	i8042a20(void);
-void	i8042reset(void);
-int	inb(int);
-void	insb(int, void*, int);
-ushort	ins(int);
-void	inss(int, void*, int);
-ulong	inl(int);
-void	insl(int, void*, int);
-void	kbdinit(void);
-int	kbdintr0(void);
-int	kbdgetc(void);
-long*	mapaddr(ulong);
-void	microdelay(int);
-void	mmuinit(void);
-uchar	nvramread(int);
-void	outb(int, int);
-void	outsb(int, void*, int);
-void	outs(int, ushort);
-void	outss(int, void*, int);
-void	outl(int, ulong);
-void	outsl(int, void*, int);
-void	printcpufreq(void);
-void	putgdt(Segdesc*, int);
-void	putidt(Segdesc*, int);
-void	putcr3(ulong);
-void	putcr4(ulong);
-void	puttr(ulong);
-void	rdmsr(int, vlong*);
-void	wrmsr(int, vlong);
-void	(*cycles)(uvlong*);
-void	scsiinit(void);
-Off	scsiread(int, void*, long);
-Devsize	scsiseek(int, Devsize);
-Off	scsiwrite(int, void*, long);
-int	setatapart(int, char*);
-int	setscsipart(int, char*);
-void	setvec(int, void (*)(Ureg*, void*), void*);
-int	tas(Lock*);
-void	trapinit(void);
-void	uartspecial(int, void (*)(int), int (*)(void), int);
-int	uartgetc(void);
-void	uartputc(int);
-void	wbflush(void);
-void	cpuid(char*, int*, int*);
-
-#define PADDR(a)	((ulong)(a)&~KZERO)
-
-/* pata */
-void	ideinit(Device *d);
-Devsize	idesize(Device *d);
-int	ideread(Device *d,  Devsize, void*);
-int	idewrite(Device *d, Devsize, void*);
-
-/* sata */
-void	mvideinit(Device *d);
-Devsize	mvidesize(Device *d);
-int	mvideread(Device *d,  Devsize, void*);
-int	mvidewrite(Device *d, Devsize, void*);

+ 0 - 247
sys/src/fs/9netics32.16k/io.h

@@ -1,247 +0,0 @@
-/*
- *  programmable interrupt vectors (for the 8259's)
- */
-enum
-{
-	Bptvec=		3,		/* breakpoints */
-	Mathemuvec=	7,		/* math coprocessor emulation interrupt */
-	Mathovervec=	9,		/* math coprocessor overrun interrupt */
-	Matherr1vec=	16,		/* math coprocessor error interrupt */
-	Faultvec=	14,		/* page fault */
-
-	Int0vec=	24,		/* first 8259 */
-	 Clockvec=	Int0vec+0,	/*  clock interrupts */
-	 Kbdvec=	Int0vec+1,	/*  keyboard interrupts */
-	 Uart1vec=	Int0vec+3,	/*  modem line */
-	 Uart0vec=	Int0vec+4,	/*  serial line */
-	 PCMCIAvec=	Int0vec+5,	/*  PCMCIA card change */
-	 Floppyvec=	Int0vec+6,	/*  floppy interrupts */
-	 Parallelvec=	Int0vec+7,	/*  parallel port interrupts */
-	Int1vec=	Int0vec+8,
-	 Ethervec=	Int0vec+10,	/*  ethernet interrupt */
-	 Mousevec=	Int0vec+12,	/*  mouse interrupt */
-	 Matherr2vec=	Int0vec+13,	/*  math coprocessor */
-	 ATA0vec=	Int0vec+14,	/*  hard disk */
-
-	Syscallvec=	64,
-};
-
-/*
- *  8259 interrupt controllers
- */
-enum
-{
-	Int0ctl=	0x20,		/* control port (ICW1, OCW2, OCW3) */
-	Int0aux=	0x21,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-	Int1ctl=	0xA0,		/* control port */
-	Int1aux=	0xA1,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-
-	Icw1=		0x10,		/* select bit in ctl register */
-	Ocw2=		0x00,
-	Ocw3=		0x08,
-
-	EOI=		0x20,		/* non-specific end of interrupt */
-
-	Elcr1=		0x4D0,		/* Edge/Level Triggered Register */
-	Elcr2=		0x4D1,
-};
-
-extern int	int0mask;		/* interrupts enabled for first 8259 */
-extern int	int1mask;		/* interrupts enabled for second 8259 */
-
-#define NVRAUTHADDR	0
-#define LINESIZE	0
-
-enum {
-	MaxEISA		= 16,
-	EISAconfig	= 0xC80,
-
-	MaxScsi		= 4,
-	NTarget		= 16,
-
-	MaxEther	= 4,
-};
-
-#define DMAOK(x, l)	((ulong)(((ulong)(x))+(l)) < (ulong)(KZERO|16*1024*1024))
-
-enum {
-	BusCBUS		= 0,		/* Corollary CBUS */
-	BusCBUSII,			/* Corollary CBUS II */
-	BusEISA,			/* Extended ISA */
-	BusFUTURE,			/* IEEE Futurebus */
-	BusINTERN,			/* Internal bus */
-	BusISA,				/* Industry Standard Architecture */
-	BusMBI,				/* Multibus I */
-	BusMBII,			/* Multibus II */
-	BusMCA,				/* Micro Channel Architecture */
-	BusMPI,				/* MPI */
-	BusMPSA,			/* MPSA */
-	BusNUBUS,			/* Apple Macintosh NuBus */
-	BusPCI,				/* Peripheral Component Interconnect */
-	BusPCMCIA,			/* PC Memory Card International Association */
-	BusTC,				/* DEC TurboChannel */
-	BusVL,				/* VESA Local bus */
-	BusVME,				/* VMEbus */
-	BusXPRESS,			/* Express System Bus */
-};
-
-#define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
-#define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
-#define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
-#define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
-#define BUSTYPE(tbdf)	((tbdf)>>24)
-#define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
-#define BUSUNKNOWN	(-1)
-
-/*
- * PCI support code.
- */
-enum {					/* type 0 and type 1 pre-defined header */
-	PciVID		= 0x00,		/* vendor ID */
-	PciDID		= 0x02,		/* device ID */
-	PciPCR		= 0x04,		/* command */
-	PciPSR		= 0x06,		/* status */
-	PciRID		= 0x08,		/* revision ID */
-	PciCCRp		= 0x09,		/* programming interface class code */
-	PciCCRu		= 0x0A,		/* sub-class code */
-	PciCCRb		= 0x0B,		/* base class code */
-	PciCLS		= 0x0C,		/* cache line size */
-	PciLTR		= 0x0D,		/* latency timer */
-	PciHDT		= 0x0E,		/* header type */
-	PciBST		= 0x0F,		/* BIST */
-
-	PciBAR0		= 0x10,		/* base address */
-	PciBAR1		= 0x14,
-
-	PciINTL		= 0x3C,		/* interrupt line */
-	PciINTP		= 0x3D,		/* interrupt pin */
-};
-
-enum {					/* type 0 pre-defined header */
-	PciBAR2		= 0x18,
-	PciBAR3		= 0x1C,
-	PciBAR4		= 0x20,
-	PciBAR5		= 0x24,
-	PciCIS		= 0x28,		/* cardbus CIS pointer */
-	PciSVID		= 0x2C,		/* subsystem vendor ID */
-	PciSID		= 0x2E,		/* cardbus CIS pointer */
-	PciEBAR0	= 0x30,		/* expansion ROM base address */
-	PciMGNT		= 0x3E,		/* burst period length */
-	PciMLT		= 0x3F,		/* maximum latency between bursts */
-};
-
-enum {					/* type 1 pre-defined header */
-	PciPBN		= 0x18,		/* primary bus number */
-	PciSBN		= 0x19,		/* secondary bus number */
-	PciUBN		= 0x1A,		/* subordinate bus number */
-	PciSLTR		= 0x1B,		/* secondary latency timer */
-	PciIBR		= 0x1C,		/* I/O base */
-	PciILR		= 0x1D,		/* I/O limit */
-	PciSPSR		= 0x1E,		/* secondary status */
-	PciMBR		= 0x20,		/* memory base */
-	PciMLR		= 0x22,		/* memory limit */
-	PciPMBR		= 0x24,		/* prefetchable memory base */
-	PciPMLR		= 0x26,		/* prefetchable memory limit */
-	PciPUBR		= 0x28,		/* prefetchable base upper 32 bits */
-	PciPULR		= 0x2C,		/* prefetchable limit upper 32 bits */
-	PciIUBR		= 0x30,		/* I/O base upper 16 bits */
-	PciIULR		= 0x32,		/* I/O limit upper 16 bits */
-	PciEBAR1	= 0x28,		/* expansion ROM base address */
-	PciBCR		= 0x3E,		/* bridge control register */
-};
-
-typedef struct Pcidev Pcidev;
-typedef struct Pcidev {
-	int	tbdf;			/* type+bus+device+function */
-	ushort	vid;			/* vendor ID */
-	ushort	did;			/* device ID */
-
-	struct {
-		ulong	bar;		/* base address */
-		int	size;
-	} mem[6];
-
-	uchar	rid;
-	uchar	ccrp;
-	uchar	ccrb;
-	uchar	intl;			/* interrupt line */
-	ushort	ccru;			/* is uchar in cpu kernel */
-	ulong	pcr;
-
-	Pcidev*	list;
-	Pcidev*	bridge;			/* down a bus */
-	Pcidev*	link;			/* next device on this bno */
-} Pcidev;
-
-extern int pcicfgr8(Pcidev*, int);
-extern int pcicfgr16(Pcidev*, int);
-extern int pcicfgr32(Pcidev*, int);
-extern void pcicfgw8(Pcidev*, int, int);
-extern void pcicfgw16(Pcidev*, int, int);
-extern void pcicfgw32(Pcidev*, int, int);
-extern void pciclrmwi(Pcidev*);
-extern void pcihinv(Pcidev*, ulong);
-extern Pcidev* pcimatch(Pcidev*, int, int);
-extern Pcidev* pcimatchtbdf(int);
-extern void pcireset(void);
-extern void pcisetbme(Pcidev*);
-extern void pciclrbme(Pcidev*);
-
-/*
- *  a parsed plan9.ini line
- */
-#define ISAOPTLEN	16
-#define NISAOPT		8
-
-typedef struct ISAConf {
-	char	type[NAMELEN];
-	ulong	port;
-	ulong	irq;
-	ulong	dma;
-	ulong	mem;
-	ulong	size;
-	ulong	freq;
-
-	int	nopt;
-	char	opt[NISAOPT][ISAOPTLEN];
-} ISAConf;
-
-extern int isaconfig(char*, int, ISAConf*);
-
-/*
- * SCSI support code.
- */
-enum {
-	STblank		=-6,		/* blank block */
-	STnomem		=-5,		/* buffer allocation failed */
-	STtimeout	=-4,		/* bus timeout */
-	STownid		=-3,		/* playing with myself */
-	STharderr	=-2,		/* controller error of some kind */
-	STinit		=-1,		/* */
-	STok		= 0,		/* good */
-	STcheck		= 0x02,		/* check condition */
-	STcondmet	= 0x04,		/* condition met/good */
-	STbusy		= 0x08,		/* busy */
-	STintok		= 0x10,		/* intermediate/good */
-	STintcondmet	= 0x14,		/* intermediate/condition met/good */
-	STresconf	= 0x18,		/* reservation conflict */
-	STterminated	= 0x22,		/* command terminated */
-	STqfull		= 0x28,		/* queue full */
-};
-
-typedef struct Target {
-	int	ctlrno;
-	int	targetno;
-	uchar*	inquiry;
-	uchar*	sense;
-
-	QLock;
-	char	id[NAMELEN];
-	int	ok;
-
-	char	fflag;
-	Filter	work[3];
-	Filter	rate[3];
-} Target;
-
-typedef int (*Scsiio)(Target*, int, uchar*, int, void*, int*);

+ 0 - 85
sys/src/fs/9netics32.16k/mem.h

@@ -1,85 +0,0 @@
-#define	BY2WD		4			/* bytes per word */
-#define BY2V		8			/* bytes per vlong */
-#define	BY2PG		4096			/* bytes per page */
-#define	PGSHIFT		12			/* log(BY2PG) */
-#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))
-#define MB		(1024*1024)
-
-#define	HZ		(82)			/* clock frequency */
-#define	TK2MS(t)	(((ulong)(t)*1000)/HZ)	/* ticks to milliseconds - beware rounding */
-#define	MS2TK(t)	(((ulong)(t)*HZ)/1000)	/* milliseconds to ticks - beware rounding */
-#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
-
-/*
- * Fundamental addresses
- */
-#define IDTADDR		0x80000800		/* idt */
-#define APBOOTSTRAP	0x80001000		/* AP bootstrap code */
-#define CONFADDR	0x80001200		/* info passed from boot loader */
-#define CPU0PDB		0x80002000		/* bootstrap processor PDB */
-#define CPU0PTE		0x80003000		/* bootstrap processor PTE's for 0-2MB */
-#define CPU0MACHPTE	0x80004000		/* bootstrap processor PTE for MACHADDR */
-#define CPU0MACH	0x80005000		/* Mach for bootstrap processor */
-
-#define	KZERO		0x80000000		/* base of kernel address space */
-#define	KTZERO		0x80100000		/* first address in kernel text */
-
-#define	MACHSIZE	4096
-
-/*
- *  known 80386 segments (in GDT) and their selectors
- */
-#define	NULLSEG	0	/* null segment */
-#define	KDSEG	1	/* kernel data/stack */
-#define	KESEG	2	/* kernel executable */
-#define	UDSEG	3	/* user data/stack */
-#define	UESEG	4	/* user executable */
-#define TSSSEG	5	/* task segment */
-#define N386SEG	6	/* number of segments */
-
-#define SELGDT	(0<<3)	/* selector is in gdt */
-#define	SELLDT	(1<<3)	/* selector is in ldt */
-
-#define SELECTOR(i, t, p)	(((i)<<3) | (t) | (p))
-
-#define NULLSEL	SELECTOR(NULLSEG, SELGDT, 0)
-#define KESEL	SELECTOR(KESEG, SELGDT, 0)
-#define KDSEL	SELECTOR(KDSEG, SELGDT, 0)
-#define UESEL	SELECTOR(UESEG, SELGDT, 3)
-#define UDSEL	SELECTOR(UDSEG, SELGDT, 3)
-#define TSSSEL	SELECTOR(TSSSEG, SELGDT, 0)
-
-/*
- *  fields in segment descriptors
- */
-#define SEGDATA	(0x10<<8)	/* data/stack segment */
-#define SEGEXEC	(0x18<<8)	/* executable segment */
-#define	SEGTSS	(0x9<<8)	/* TSS segment */
-#define SEGCG	(0x0C<<8)	/* call gate */
-#define	SEGIG	(0x0E<<8)	/* interrupt gate */
-#define SEGTG	(0x0F<<8)	/* task gate */
-#define SEGTYPE	(0x1F<<8)
-
-#define SEGP	(1<<15)		/* segment present */
-#define SEGPL(x) ((x)<<13)	/* priority level */
-#define SEGB	(1<<22)		/* granularity 1==4k (for expand-down) */
-#define SEGG	(1<<23)		/* granularity 1==4k (for other) */
-#define SEGE	(1<<10)		/* expand down */
-#define SEGW	(1<<9)		/* writable (for data/stack) */
-#define	SEGR	(1<<9)		/* readable (for code) */
-#define SEGD	(1<<22)		/* default 1==32bit (for code) */
-
-/*
- *  physical MMU
- */
-#define	PTEVALID	(1<<0)
-#define	PTEUNCACHED	(1<<4)
-#define PTEWRITE	(1<<1)
-#define	PTERONLY	(0<<1)
-#define	PTEKERNEL	(0<<2)
-#define	PTEUSER		(1<<2)
-#define PTESIZE		(1<<7)
-
-#define MACHADDR	((ulong)&mach0)		/* hack number 1 */
-
-#define IFLAG		0x200	/* psw: interrupt enable, to be accurate */

+ 0 - 145
sys/src/fs/9netics32.16k/mkfile

@@ -1,145 +0,0 @@
-CONF=net32.16k
-p=9
-
-objtype=386
-</$objtype/mkfile
-
-TARG=$p$CONF'fs'
-
-DEV=\
-	apc.$O\
-	cw.$O\
-	fworm.$O\
-	juke.$O\
-	mworm.$O\
-	wren.$O\
-
-IP=\
-	arp.$O\
-	icmp.$O\
-	il.$O\
-	ip.$O\
-	ipaux.$O\
-	iproute.$O\
-	sntp.$O\
-	udp.$O\
-
-PORT=\
-	9p1.$O\
-	9p1lib.$O\
-	9p2.$O\
-	auth.$O\
-	chk.$O\
-	clock.$O\
-	con.$O\
-	config.$O\
-	console.$O\
-	data.$O\
-	dentry.$O\
-	devcons.$O\
-	fcmd.$O\
-	iobuf.$O\
-	lrand.$O\
-	main.$O\
-	print.$O\
-	proc.$O\
-	sub.$O\
-	time.$O\
-	uidgid.$O\
-
-PC=\
-	l.$O\
-	8250.$O\
-	8253.$O\
-	cga.$O\
-	devsd.$O\
-	sdscsi.$O\
-	sdata.$O\
-	sdmv50xx.$O\
-	dosfs.$O\
-	floppy.$O\
-	kbd.$O\
-	lock.$O\
-	malloc.$O\
-	mmu.$O\
-	nvr.$O\
-	pc.$O\
-	pci.$O\
-	toy.$O\
-	trap.$O\
-
-ETHER=\
-	compat.$O\
-	ether2114x.$O\
-	ether8139.$O\
-	ether8169.$O\
-	ether82557.$O\
-	ether83815.$O\
-	etherdp83820.$O\
-	etherelnk3.$O\
-	etherga620.$O\
-	etherif.$O\
-	etherigbe.$O\
-	ethermii.$O\
-
-SCSI=\
-	scsi.$O\
-	scsibuslogic.$O\
-	scsincr53c8xx.$O\
-
-OBJ=\
-	$PC\
-	$PORT\
-	$DEV\
-	$IP\
-	$ETHER\
-	$SCSI\
-
-HFILES=\
-	../port/all.h\
-	../port/lib.h\
-	../port/portdat.h\
-	../port/portfns.h\
-	dat.h\
-	fns.h\
-	io.h\
-	mem.h\
-	/$objtype/include/u.h\
-	/$objtype/include/ureg.h\
-
-LIB=\
-	-lauthsrv\
-	-lc\
-	-lsec\
-
-# -I../pc & -DFS are for compat.h
-CFLAGS=-FTVw -I. -I../port -I../pc -DFS -DOLD
-
-all:V:	$TARG
-
-<../pc/mkfile
-<../port/mkfile
-<../dev/mkfile
-<../ip/mkfile
-
-$TARG:	$TARG.c $OBJ
-	$CC $CFLAGS -DDATE'='`{date -n} $TARG.c
-	$LD -o $target -l -T0x80100020 $OBJ $TARG.$O $LIB
-	size $target
-
-install:V: $TARG
-	cp $TARG /$objtype/
-#	9fs stand && cp -x $TARG /n/stand/$objtype
-
-$TARG.$O:	../pc/dosfs.h
-
-%.$O:	%.c
-	$CC $CFLAGS $stem.c
-
-%.$O:	%.s
-	$AS $stem.s
-
-%.$O:	$HFILES
-
-clean:V:
-	rm -f *.[$OS] [$OS].out $TARG

+ 0 - 178
sys/src/fs/9netics64.8k/9net64.8kfs.c

@@ -1,178 +0,0 @@
-#include "all.h"
-#include "mem.h"
-#include "io.h"
-#include "ureg.h"
-
-#include "../pc/dosfs.h"
-
-/*
- * setting this to zero permits the use of discs of different sizes, but
- * can make jukeinit() quite slow while the robotics work through each disc
- * twice (once per side).
- */
-int FIXEDSIZE = 1;
-
-#ifndef	DATE
-#define	DATE	1094098624L
-#endif
-
-Timet	mktime		= DATE;				/* set by mkfile */
-Startsb	startsb[] =
-{
-	"main",		2,	/* */
-	0
-};
-
-Dos dos;
-
-static struct
-{
-	char	*name;
-	Off	(*read)(int, void*, long);
-	Devsize	(*seek)(int, Devsize);
-	Off	(*write)(int, void*, long);
-	int	(*part)(int, char*);
-} nvrdevs[] = {
-	{ "fd", floppyread, floppyseek, floppywrite, 0, },
-	{ "hd", ataread,   ataseek,   atawrite,   setatapart, },
-	/* { "sd", scsiread,   scsiseek,   scsiwrite,   setscsipart, },  */
-	{ 0, },
-};
-
-void apcinit(void);
-
-void
-otherinit(void)
-{
-	int dev, i, nfd, nhd, s;
-	char *p, *q, buf[sizeof(nvrfile)+8];
-
-	kbdinit();
-	printcpufreq();
-	etherinit();
-	scsiinit();
-	apcinit();
-
-	s = spllo();
-	nhd = atainit();
-	nfd = floppyinit();
-	dev = 0;
-	if(p = getconf("nvr")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed nvrfile: %s\n", buf);
-		*p++ = 0;
-		*q++ = 0;
-		dev = strtoul(p, 0, 0);
-		strcpy(nvrfile, q);
-		p = buf;
-	} else
-	if(p = getconf("bootfile")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed bootfile: %s\n", buf);
-		*p++ = 0;
-		*q = 0;
-		dev = strtoul(p, 0, 0);
-		p = buf;
-	} else
-	if(nfd)
-		p = "fd";
-	else
-	if(nhd)
-		p = "hd";
-	else
-		p = "sd";
-
-	for(i = 0; nvrdevs[i].name; i++){
-		if(strcmp(p, nvrdevs[i].name) == 0){
-			dos.dev = dev;
-			if(nvrdevs[i].part && (*nvrdevs[i].part)(dos.dev, "disk") == 0)
-				break;
-			dos.read = nvrdevs[i].read;
-			dos.seek = nvrdevs[i].seek;
-			dos.write = nvrdevs[i].write;
-			break;
-		}
-	}
-	if(dos.read == 0)
-		panic("no device for nvram\n");
-	if(dosinit(&dos) < 0)
-		panic("can't init dos dosfs on %s\n", p);
-	splx(s);
-}
-
-void
-touser(void)
-{
-	int i;
-
-	settime(rtctime());
-	boottime = time();
-
-	print("sysinit\n");
-	sysinit();
-
-	userinit(floppyproc, 0, "floppyproc");
-	/*
-	 * Ethernet i/o processes
-	 */
-	etherstart();
-
-
-	/*
-	 * read ahead processes
-	 */
-	userinit(rahead, 0, "rah");
-
-	/*
-	 * server processes
-	 */
-	for(i=0; i<conf.nserve; i++)
-		userinit(serve, 0, "srv");
-
-	/*
-	 * worm "dump" copy process
-	 */
-	userinit(wormcopy, 0, "wcp");
-
-	/*
-	 * processes to read the console
-	 */
-	consserve();
-
-	/*
-	 * "sync" copy process
-	 * this doesn't return.
-	 */
-	u->text = "scp";
-	synccopy();
-}
-
-void
-localconfinit(void)
-{
-	/* conf.nfile = 60000; */	/* from emelie */
-	conf.nodump = 0;
-	conf.dumpreread = 0;
-	conf.firstsb = 0;	/* time- & jukebox-dependent optimisation */
-	conf.recovsb = 0;	/* 971531 is 24 june 2003, before w3 died */
-	conf.ripoff = 1;
-	conf.nlgmsg = 1100;	/* @8576 bytes, for packets */
-	conf.nsmmsg = 500;	/* @128 bytes */
-
-	conf.minuteswest = 8*60;
-	conf.dsttime = 1;
-}
-
-int (*fsprotocol[])(Msgbuf*) = {
-	/* 64-bit file servers can't serve 9P1 correctly: NAMELEN is too big */
-	serve9p2,
-	nil,
-};

+ 0 - 35
sys/src/fs/9netics64.8k/dat.h

@@ -1,35 +0,0 @@
-/*
- * The most fundamental constant.
- * The code will not compile with RBUFSIZE made a variable;
- * for one thing, RBUFSIZE determines FEPERBUF, which determines
- * the number of elements in a free-list-block array.
- */
-#define RBUFSIZE	(8*1024)	/* raw buffer size */
-
-#include "../port/portdat.h"
-
-extern	Mach	mach0;
-
-typedef struct Segdesc	Segdesc;
-struct Segdesc
-{
-	ulong	d0;
-	ulong	d1;
-};
-
-typedef struct Mbank {
-	ulong	base;
-	ulong	limit;
-} Mbank;
-
-#define MAXBANK		8
-
-typedef struct Mconf {
-	Lock;
-	Mbank	bank[MAXBANK];
-	int	nbank;
-	ulong	topofmem;
-} Mconf;
-extern Mconf mconf;
-
-extern char nvrfile[128];

+ 0 - 87
sys/src/fs/9netics64.8k/fns.h

@@ -1,87 +0,0 @@
-ulong	strtoul(char*, char**, int);
-vlong	strtoll(char*, char**, int);
-
-#include "../port/portfns.h"
-
-void	aamloop(int);
-void	cgaputc(int);
-void	cgaputs(char*, int);
-int	cistrcmp(char*, char*);
-int	cistrncmp(char*, char*, int);
-void	(*coherence)(void);
-void	etherinit(void);
-void	etherstart(void);
-int	floppyinit(void);
-void	floppyproc(void);
-Off	floppyread(int, void*, long);
-Devsize	floppyseek(int, Devsize);
-Off	floppywrite(int, void*, long);
-void	fpinit(void);
-char*	getconf(char*);
-ulong	getcr0(void);
-ulong	getcr2(void);
-ulong	getcr4(void);
-int	getfields(char*, char**, int, int, char*);
-ulong	getstatus(void);
-int	atainit(void);
-Off	ataread(int, void*, long);
-Devsize	ataseek(int, Devsize);
-Off	atawrite(int, void*, long);
-void	i8042a20(void);
-void	i8042reset(void);
-int	inb(int);
-void	insb(int, void*, int);
-ushort	ins(int);
-void	inss(int, void*, int);
-ulong	inl(int);
-void	insl(int, void*, int);
-void	kbdinit(void);
-int	kbdintr0(void);
-int	kbdgetc(void);
-long*	mapaddr(ulong);
-void	microdelay(int);
-void	mmuinit(void);
-uchar	nvramread(int);
-void	outb(int, int);
-void	outsb(int, void*, int);
-void	outs(int, ushort);
-void	outss(int, void*, int);
-void	outl(int, ulong);
-void	outsl(int, void*, int);
-void	printcpufreq(void);
-void	putgdt(Segdesc*, int);
-void	putidt(Segdesc*, int);
-void	putcr3(ulong);
-void	putcr4(ulong);
-void	puttr(ulong);
-void	rdmsr(int, vlong*);
-void	wrmsr(int, vlong);
-void	(*cycles)(uvlong*);
-void	scsiinit(void);
-Off	scsiread(int, void*, long);
-Devsize	scsiseek(int, Devsize);
-Off	scsiwrite(int, void*, long);
-int	setatapart(int, char*);
-int	setscsipart(int, char*);
-void	setvec(int, void (*)(Ureg*, void*), void*);
-int	tas(Lock*);
-void	trapinit(void);
-void	uartspecial(int, void (*)(int), int (*)(void), int);
-int	uartgetc(void);
-void	uartputc(int);
-void	wbflush(void);
-void	cpuid(char*, int*, int*);
-
-#define PADDR(a)	((ulong)(a)&~KZERO)
-
-/* pata */
-void	ideinit(Device *d);
-Devsize	idesize(Device *d);
-int	ideread(Device *d,  Devsize, void*);
-int	idewrite(Device *d, Devsize, void*);
-
-/* sata */
-void	mvideinit(Device *d);
-Devsize	mvidesize(Device *d);
-int	mvideread(Device *d,  Devsize, void*);
-int	mvidewrite(Device *d, Devsize, void*);

+ 0 - 247
sys/src/fs/9netics64.8k/io.h

@@ -1,247 +0,0 @@
-/*
- *  programmable interrupt vectors (for the 8259's)
- */
-enum
-{
-	Bptvec=		3,		/* breakpoints */
-	Mathemuvec=	7,		/* math coprocessor emulation interrupt */
-	Mathovervec=	9,		/* math coprocessor overrun interrupt */
-	Matherr1vec=	16,		/* math coprocessor error interrupt */
-	Faultvec=	14,		/* page fault */
-
-	Int0vec=	24,		/* first 8259 */
-	 Clockvec=	Int0vec+0,	/*  clock interrupts */
-	 Kbdvec=	Int0vec+1,	/*  keyboard interrupts */
-	 Uart1vec=	Int0vec+3,	/*  modem line */
-	 Uart0vec=	Int0vec+4,	/*  serial line */
-	 PCMCIAvec=	Int0vec+5,	/*  PCMCIA card change */
-	 Floppyvec=	Int0vec+6,	/*  floppy interrupts */
-	 Parallelvec=	Int0vec+7,	/*  parallel port interrupts */
-	Int1vec=	Int0vec+8,
-	 Ethervec=	Int0vec+10,	/*  ethernet interrupt */
-	 Mousevec=	Int0vec+12,	/*  mouse interrupt */
-	 Matherr2vec=	Int0vec+13,	/*  math coprocessor */
-	 ATA0vec=	Int0vec+14,	/*  hard disk */
-
-	Syscallvec=	64,
-};
-
-/*
- *  8259 interrupt controllers
- */
-enum
-{
-	Int0ctl=	0x20,		/* control port (ICW1, OCW2, OCW3) */
-	Int0aux=	0x21,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-	Int1ctl=	0xA0,		/* control port */
-	Int1aux=	0xA1,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-
-	Icw1=		0x10,		/* select bit in ctl register */
-	Ocw2=		0x00,
-	Ocw3=		0x08,
-
-	EOI=		0x20,		/* non-specific end of interrupt */
-
-	Elcr1=		0x4D0,		/* Edge/Level Triggered Register */
-	Elcr2=		0x4D1,
-};
-
-extern int	int0mask;		/* interrupts enabled for first 8259 */
-extern int	int1mask;		/* interrupts enabled for second 8259 */
-
-#define NVRAUTHADDR	0
-#define LINESIZE	0
-
-enum {
-	MaxEISA		= 16,
-	EISAconfig	= 0xC80,
-
-	MaxScsi		= 4,
-	NTarget		= 16,
-
-	MaxEther	= 4,
-};
-
-#define DMAOK(x, l)	((ulong)(((ulong)(x))+(l)) < (ulong)(KZERO|16*1024*1024))
-
-enum {
-	BusCBUS		= 0,		/* Corollary CBUS */
-	BusCBUSII,			/* Corollary CBUS II */
-	BusEISA,			/* Extended ISA */
-	BusFUTURE,			/* IEEE Futurebus */
-	BusINTERN,			/* Internal bus */
-	BusISA,				/* Industry Standard Architecture */
-	BusMBI,				/* Multibus I */
-	BusMBII,			/* Multibus II */
-	BusMCA,				/* Micro Channel Architecture */
-	BusMPI,				/* MPI */
-	BusMPSA,			/* MPSA */
-	BusNUBUS,			/* Apple Macintosh NuBus */
-	BusPCI,				/* Peripheral Component Interconnect */
-	BusPCMCIA,			/* PC Memory Card International Association */
-	BusTC,				/* DEC TurboChannel */
-	BusVL,				/* VESA Local bus */
-	BusVME,				/* VMEbus */
-	BusXPRESS,			/* Express System Bus */
-};
-
-#define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
-#define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
-#define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
-#define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
-#define BUSTYPE(tbdf)	((tbdf)>>24)
-#define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
-#define BUSUNKNOWN	(-1)
-
-/*
- * PCI support code.
- */
-enum {					/* type 0 and type 1 pre-defined header */
-	PciVID		= 0x00,		/* vendor ID */
-	PciDID		= 0x02,		/* device ID */
-	PciPCR		= 0x04,		/* command */
-	PciPSR		= 0x06,		/* status */
-	PciRID		= 0x08,		/* revision ID */
-	PciCCRp		= 0x09,		/* programming interface class code */
-	PciCCRu		= 0x0A,		/* sub-class code */
-	PciCCRb		= 0x0B,		/* base class code */
-	PciCLS		= 0x0C,		/* cache line size */
-	PciLTR		= 0x0D,		/* latency timer */
-	PciHDT		= 0x0E,		/* header type */
-	PciBST		= 0x0F,		/* BIST */
-
-	PciBAR0		= 0x10,		/* base address */
-	PciBAR1		= 0x14,
-
-	PciINTL		= 0x3C,		/* interrupt line */
-	PciINTP		= 0x3D,		/* interrupt pin */
-};
-
-enum {					/* type 0 pre-defined header */
-	PciBAR2		= 0x18,
-	PciBAR3		= 0x1C,
-	PciBAR4		= 0x20,
-	PciBAR5		= 0x24,
-	PciCIS		= 0x28,		/* cardbus CIS pointer */
-	PciSVID		= 0x2C,		/* subsystem vendor ID */
-	PciSID		= 0x2E,		/* cardbus CIS pointer */
-	PciEBAR0	= 0x30,		/* expansion ROM base address */
-	PciMGNT		= 0x3E,		/* burst period length */
-	PciMLT		= 0x3F,		/* maximum latency between bursts */
-};
-
-enum {					/* type 1 pre-defined header */
-	PciPBN		= 0x18,		/* primary bus number */
-	PciSBN		= 0x19,		/* secondary bus number */
-	PciUBN		= 0x1A,		/* subordinate bus number */
-	PciSLTR		= 0x1B,		/* secondary latency timer */
-	PciIBR		= 0x1C,		/* I/O base */
-	PciILR		= 0x1D,		/* I/O limit */
-	PciSPSR		= 0x1E,		/* secondary status */
-	PciMBR		= 0x20,		/* memory base */
-	PciMLR		= 0x22,		/* memory limit */
-	PciPMBR		= 0x24,		/* prefetchable memory base */
-	PciPMLR		= 0x26,		/* prefetchable memory limit */
-	PciPUBR		= 0x28,		/* prefetchable base upper 32 bits */
-	PciPULR		= 0x2C,		/* prefetchable limit upper 32 bits */
-	PciIUBR		= 0x30,		/* I/O base upper 16 bits */
-	PciIULR		= 0x32,		/* I/O limit upper 16 bits */
-	PciEBAR1	= 0x28,		/* expansion ROM base address */
-	PciBCR		= 0x3E,		/* bridge control register */
-};
-
-typedef struct Pcidev Pcidev;
-typedef struct Pcidev {
-	int	tbdf;			/* type+bus+device+function */
-	ushort	vid;			/* vendor ID */
-	ushort	did;			/* device ID */
-
-	struct {
-		ulong	bar;		/* base address */
-		int	size;
-	} mem[6];
-
-	uchar	rid;
-	uchar	ccrp;
-	uchar	ccrb;
-	uchar	intl;			/* interrupt line */
-	ushort	ccru;			/* is uchar in cpu kernel */
-	ulong	pcr;
-
-	Pcidev*	list;
-	Pcidev*	bridge;			/* down a bus */
-	Pcidev*	link;			/* next device on this bno */
-} Pcidev;
-
-extern int pcicfgr8(Pcidev*, int);
-extern int pcicfgr16(Pcidev*, int);
-extern int pcicfgr32(Pcidev*, int);
-extern void pcicfgw8(Pcidev*, int, int);
-extern void pcicfgw16(Pcidev*, int, int);
-extern void pcicfgw32(Pcidev*, int, int);
-extern void pciclrmwi(Pcidev*);
-extern void pcihinv(Pcidev*, ulong);
-extern Pcidev* pcimatch(Pcidev*, int, int);
-extern Pcidev* pcimatchtbdf(int);
-extern void pcireset(void);
-extern void pcisetbme(Pcidev*);
-extern void pciclrbme(Pcidev*);
-
-/*
- *  a parsed plan9.ini line
- */
-#define ISAOPTLEN	16
-#define NISAOPT		8
-
-typedef struct ISAConf {
-	char	type[NAMELEN];
-	ulong	port;
-	ulong	irq;
-	ulong	dma;
-	ulong	mem;
-	ulong	size;
-	ulong	freq;
-
-	int	nopt;
-	char	opt[NISAOPT][ISAOPTLEN];
-} ISAConf;
-
-extern int isaconfig(char*, int, ISAConf*);
-
-/*
- * SCSI support code.
- */
-enum {
-	STblank		=-6,		/* blank block */
-	STnomem		=-5,		/* buffer allocation failed */
-	STtimeout	=-4,		/* bus timeout */
-	STownid		=-3,		/* playing with myself */
-	STharderr	=-2,		/* controller error of some kind */
-	STinit		=-1,		/* */
-	STok		= 0,		/* good */
-	STcheck		= 0x02,		/* check condition */
-	STcondmet	= 0x04,		/* condition met/good */
-	STbusy		= 0x08,		/* busy */
-	STintok		= 0x10,		/* intermediate/good */
-	STintcondmet	= 0x14,		/* intermediate/condition met/good */
-	STresconf	= 0x18,		/* reservation conflict */
-	STterminated	= 0x22,		/* command terminated */
-	STqfull		= 0x28,		/* queue full */
-};
-
-typedef struct Target {
-	int	ctlrno;
-	int	targetno;
-	uchar*	inquiry;
-	uchar*	sense;
-
-	QLock;
-	char	id[NAMELEN];
-	int	ok;
-
-	char	fflag;
-	Filter	work[3];
-	Filter	rate[3];
-} Target;
-
-typedef int (*Scsiio)(Target*, int, uchar*, int, void*, int*);

+ 0 - 85
sys/src/fs/9netics64.8k/mem.h

@@ -1,85 +0,0 @@
-#define	BY2WD		4			/* bytes per word */
-#define BY2V		8			/* bytes per vlong */
-#define	BY2PG		4096			/* bytes per page */
-#define	PGSHIFT		12			/* log(BY2PG) */
-#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))
-#define MB		(1024*1024)
-
-#define	HZ		(82)			/* clock frequency */
-#define	TK2MS(t)	(((ulong)(t)*1000)/HZ)	/* ticks to milliseconds - beware rounding */
-#define	MS2TK(t)	(((ulong)(t)*HZ)/1000)	/* milliseconds to ticks - beware rounding */
-#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
-
-/*
- * Fundamental addresses
- */
-#define IDTADDR		0x80000800		/* idt */
-#define APBOOTSTRAP	0x80001000		/* AP bootstrap code */
-#define CONFADDR	0x80001200		/* info passed from boot loader */
-#define CPU0PDB		0x80002000		/* bootstrap processor PDB */
-#define CPU0PTE		0x80003000		/* bootstrap processor PTE's for 0-2MB */
-#define CPU0MACHPTE	0x80004000		/* bootstrap processor PTE for MACHADDR */
-#define CPU0MACH	0x80005000		/* Mach for bootstrap processor */
-
-#define	KZERO		0x80000000		/* base of kernel address space */
-#define	KTZERO		0x80100000		/* first address in kernel text */
-
-#define	MACHSIZE	4096
-
-/*
- *  known 80386 segments (in GDT) and their selectors
- */
-#define	NULLSEG	0	/* null segment */
-#define	KDSEG	1	/* kernel data/stack */
-#define	KESEG	2	/* kernel executable */
-#define	UDSEG	3	/* user data/stack */
-#define	UESEG	4	/* user executable */
-#define TSSSEG	5	/* task segment */
-#define N386SEG	6	/* number of segments */
-
-#define SELGDT	(0<<3)	/* selector is in gdt */
-#define	SELLDT	(1<<3)	/* selector is in ldt */
-
-#define SELECTOR(i, t, p)	(((i)<<3) | (t) | (p))
-
-#define NULLSEL	SELECTOR(NULLSEG, SELGDT, 0)
-#define KESEL	SELECTOR(KESEG, SELGDT, 0)
-#define KDSEL	SELECTOR(KDSEG, SELGDT, 0)
-#define UESEL	SELECTOR(UESEG, SELGDT, 3)
-#define UDSEL	SELECTOR(UDSEG, SELGDT, 3)
-#define TSSSEL	SELECTOR(TSSSEG, SELGDT, 0)
-
-/*
- *  fields in segment descriptors
- */
-#define SEGDATA	(0x10<<8)	/* data/stack segment */
-#define SEGEXEC	(0x18<<8)	/* executable segment */
-#define	SEGTSS	(0x9<<8)	/* TSS segment */
-#define SEGCG	(0x0C<<8)	/* call gate */
-#define	SEGIG	(0x0E<<8)	/* interrupt gate */
-#define SEGTG	(0x0F<<8)	/* task gate */
-#define SEGTYPE	(0x1F<<8)
-
-#define SEGP	(1<<15)		/* segment present */
-#define SEGPL(x) ((x)<<13)	/* priority level */
-#define SEGB	(1<<22)		/* granularity 1==4k (for expand-down) */
-#define SEGG	(1<<23)		/* granularity 1==4k (for other) */
-#define SEGE	(1<<10)		/* expand down */
-#define SEGW	(1<<9)		/* writable (for data/stack) */
-#define	SEGR	(1<<9)		/* readable (for code) */
-#define SEGD	(1<<22)		/* default 1==32bit (for code) */
-
-/*
- *  physical MMU
- */
-#define	PTEVALID	(1<<0)
-#define	PTEUNCACHED	(1<<4)
-#define PTEWRITE	(1<<1)
-#define	PTERONLY	(0<<1)
-#define	PTEKERNEL	(0<<2)
-#define	PTEUSER		(1<<2)
-#define PTESIZE		(1<<7)
-
-#define MACHADDR	((ulong)&mach0)		/* hack number 1 */
-
-#define IFLAG		0x200	/* psw: interrupt enable, to be accurate */

+ 0 - 145
sys/src/fs/9netics64.8k/mkfile

@@ -1,145 +0,0 @@
-CONF=net64.8k
-p=9
-
-objtype=386
-</$objtype/mkfile
-
-TARG=$p$CONF'fs'
-
-DEV=\
-	apc.$O\
-	cw.$O\
-	fworm.$O\
-	juke.$O\
-	mworm.$O\
-	wren.$O\
-
-IP=\
-	arp.$O\
-	icmp.$O\
-	il.$O\
-	ip.$O\
-	ipaux.$O\
-	iproute.$O\
-	sntp.$O\
-	udp.$O\
-
-PORT=\
-	9p1.$O\
-	9p1lib.$O\
-	9p2.$O\
-	auth.$O\
-	chk.$O\
-	clock.$O\
-	con.$O\
-	config.$O\
-	console.$O\
-	data.$O\
-	dentry.$O\
-	devcons.$O\
-	fcmd.$O\
-	iobuf.$O\
-	lrand.$O\
-	main.$O\
-	print.$O\
-	proc.$O\
-	sub.$O\
-	time.$O\
-	uidgid.$O\
-
-PC=\
-	l.$O\
-	8250.$O\
-	8253.$O\
-	cga.$O\
-	devsd.$O\
-	sdscsi.$O\
-	sdata.$O\
-	sdmv50xx.$O\
-	dosfs.$O\
-	floppy.$O\
-	kbd.$O\
-	lock.$O\
-	malloc.$O\
-	mmu.$O\
-	nvr.$O\
-	pc.$O\
-	pci.$O\
-	toy.$O\
-	trap.$O\
-
-ETHER=\
-	compat.$O\
-	ether2114x.$O\
-	ether8139.$O\
-	ether8169.$O\
-	ether82557.$O\
-	ether83815.$O\
-	etherdp83820.$O\
-	etherelnk3.$O\
-	etherga620.$O\
-	etherif.$O\
-	etherigbe.$O\
-	ethermii.$O\
-
-SCSI=\
-	scsi.$O\
-	scsibuslogic.$O\
-	scsincr53c8xx.$O\
-
-OBJ=\
-	$PC\
-	$PORT\
-	$DEV\
-	$IP\
-	$ETHER\
-	$SCSI\
-
-HFILES=\
-	../port/all.h\
-	../port/lib.h\
-	../port/portdat.h\
-	../port/portfns.h\
-	dat.h\
-	fns.h\
-	io.h\
-	mem.h\
-	/$objtype/include/u.h\
-	/$objtype/include/ureg.h\
-
-LIB=\
-	-lauthsrv\
-	-lc\
-	-lsec\
-
-# -I../pc & -DFS are for compat.h
-CFLAGS=-FTVw -I. -I../port -I../pc -DFS
-
-all:V:	$TARG
-
-<../pc/mkfile
-<../port/mkfile
-<../dev/mkfile
-<../ip/mkfile
-
-$TARG:	$TARG.c $OBJ
-	$CC $CFLAGS -DDATE'='`{date -n} $TARG.c
-	$LD -o $target -l -T0x80100020 $OBJ $TARG.$O $LIB
-	size $target
-
-install:V: $TARG
-	cp $TARG /$objtype/
-#	9fs stand && cp -x $TARG /n/stand/$objtype
-
-$TARG.$O:	../pc/dosfs.h
-
-%.$O:	%.c
-	$CC $CFLAGS $stem.c
-
-%.$O:	%.s
-	$AS $stem.s
-
-%.$O:	$HFILES
-
-clean:V:
-	rm -f *.[$OS] [$OS].out $TARG

+ 0 - 1
sys/src/fs/GOING.AWAY

@@ -1 +0,0 @@
-/sys/src/fs will be removed from the Plan 9 distribution soon.

+ 0 - 177
sys/src/fs/choline/9cholinefs.c

@@ -1,177 +0,0 @@
-#include "all.h"
-#include "mem.h"
-#include "io.h"
-#include "ureg.h"
-
-#include "../pc/dosfs.h"
-
-/*
- * setting this to zero permits the use of discs of different sizes, but
- * can make jukeinit() quite slow while the robotics work through each disc
- * twice (once per side).
- */
-int FIXEDSIZE = 1;
-
-#ifndef	DATE
-#define	DATE	1094098624L
-#endif
-
-Timet	mktime		= DATE;				/* set by mkfile */
-Startsb	startsb[] =
-{
-	"main",		2,
-	0
-};
-
-Dos dos;
-
-static struct
-{
-	char	*name;
-	Off	(*read)(int, void*, long);
-	Devsize	(*seek)(int, Devsize);
-	Off	(*write)(int, void*, long);
-	int	(*part)(int, char*);
-} nvrdevs[] = {
-	{ "fd", floppyread, floppyseek, floppywrite, 0, },
-	{ "hd", ataread,   ataseek,   atawrite,   setatapart, },
-	/* { "sd", scsiread,   scsiseek,   scsiwrite,   setscsipart, },  */
-	{ 0, },
-};
-
-void apcinit(void);
-
-void
-otherinit(void)
-{
-	int dev, i, nfd, nhd, s;
-	char *p, *q, buf[sizeof(nvrfile)+8];
-
-	kbdinit();
-	printcpufreq();
-	etherinit();
-	scsiinit();
-	apcinit();
-
-	s = spllo();
-	nhd = atainit();
-	nfd = floppyinit();
-	dev = 0;
-	if(p = getconf("nvr")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed nvrfile: %s\n", buf);
-		*p++ = 0;
-		*q++ = 0;
-		dev = strtoul(p, 0, 0);
-		strcpy(nvrfile, q);
-		p = buf;
-	} else
-	if(p = getconf("bootfile")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed bootfile: %s\n", buf);
-		*p++ = 0;
-		*q = 0;
-		dev = strtoul(p, 0, 0);
-		p = buf;
-	} else
-	if(nfd)
-		p = "fd";
-	else
-	if(nhd)
-		p = "hd";
-	else
-		p = "sd";
-
-	for(i = 0; nvrdevs[i].name; i++){
-		if(strcmp(p, nvrdevs[i].name) == 0){
-			dos.dev = dev;
-			if(nvrdevs[i].part && (*nvrdevs[i].part)(dos.dev, "disk") == 0)
-				break;
-			dos.read = nvrdevs[i].read;
-			dos.seek = nvrdevs[i].seek;
-			dos.write = nvrdevs[i].write;
-			break;
-		}
-	}
-	if(dos.read == 0)
-		panic("no device for nvram\n");
-	if(dosinit(&dos) < 0)
-		panic("can't init dos dosfs on %s\n", p);
-	splx(s);
-}
-
-void
-touser(void)
-{
-	int i;
-
-	settime(rtctime());
-	boottime = time();
-
-	print("sysinit\n");
-	sysinit();
-
-	userinit(floppyproc, 0, "floppyproc");
-	/*
-	 * Ethernet i/o processes
-	 */
-	etherstart();
-
-
-	/*
-	 * read ahead processes
-	 */
-	userinit(rahead, 0, "rah");
-
-	/*
-	 * server processes
-	 */
-	for(i=0; i<conf.nserve; i++)
-		userinit(serve, 0, "srv");
-
-	/*
-	 * worm "dump" copy process
-	 */
-	userinit(wormcopy, 0, "wcp");
-
-	/*
-	 * processes to read the console
-	 */
-	consserve();
-
-	/*
-	 * "sync" copy process
-	 * this doesn't return.
-	 */
-	u->text = "scp";
-	synccopy();
-}
-
-void
-localconfinit(void)
-{
-	conf.nfile = 60000;
-	conf.nodump = 0;
-	conf.firstsb = 12565379;
-	conf.recovsb = 0;
-	conf.ripoff = 1;
-	conf.nlgmsg = 100;
-	conf.nsmmsg = 500;
-
-	conf.minuteswest = 5*60;
-	conf.dsttime = 1;
-}
-
-int (*fsprotocol[])(Msgbuf*) = {
-	serve9p1,
-	serve9p2,
-	nil,
-};

+ 0 - 35
sys/src/fs/choline/dat.h

@@ -1,35 +0,0 @@
-/*
- * The most fundamental constant.
- * The code will not compile with RBUFSIZE made a variable;
- * for one thing, RBUFSIZE determines FEPERBUF, which determines
- * the number of elements in a free-list-block array.
- */
-#define RBUFSIZE	(16*1024)	/* raw buffer size */
-
-#include "../port/portdat.h"
-
-extern	Mach	mach0;
-
-typedef struct Segdesc	Segdesc;
-struct Segdesc
-{
-	ulong	d0;
-	ulong	d1;
-};
-
-typedef struct Mbank {
-	ulong	base;
-	ulong	limit;
-} Mbank;
-
-#define MAXBANK		8
-
-typedef struct Mconf {
-	Lock;
-	Mbank	bank[MAXBANK];
-	int	nbank;
-	ulong	topofmem;
-} Mconf;
-extern Mconf mconf;
-
-extern char nvrfile[128];

+ 0 - 87
sys/src/fs/choline/fns.h

@@ -1,87 +0,0 @@
-ulong	strtoul(char*, char**, int);
-vlong	strtoll(char*, char**, int);
-
-#include "../port/portfns.h"
-
-void	aamloop(int);
-void	cgaputc(int);
-void	cgaputs(char*, int);
-int	cistrcmp(char*, char*);
-int	cistrncmp(char*, char*, int);
-void	(*coherence)(void);
-void	etherinit(void);
-void	etherstart(void);
-int	floppyinit(void);
-void	floppyproc(void);
-Off	floppyread(int, void*, long);
-Devsize	floppyseek(int, Devsize);
-Off	floppywrite(int, void*, long);
-void	fpinit(void);
-char*	getconf(char*);
-ulong	getcr0(void);
-ulong	getcr2(void);
-ulong	getcr4(void);
-int	getfields(char*, char**, int, int, char*);
-ulong	getstatus(void);
-int	atainit(void);
-Off	ataread(int, void*, long);
-Devsize	ataseek(int, Devsize);
-Off	atawrite(int, void*, long);
-void	i8042a20(void);
-void	i8042reset(void);
-int	inb(int);
-void	insb(int, void*, int);
-ushort	ins(int);
-void	inss(int, void*, int);
-ulong	inl(int);
-void	insl(int, void*, int);
-void	kbdinit(void);
-int	kbdintr0(void);
-int	kbdgetc(void);
-long*	mapaddr(ulong);
-void	microdelay(int);
-void	mmuinit(void);
-uchar	nvramread(int);
-void	outb(int, int);
-void	outsb(int, void*, int);
-void	outs(int, ushort);
-void	outss(int, void*, int);
-void	outl(int, ulong);
-void	outsl(int, void*, int);
-void	printcpufreq(void);
-void	putgdt(Segdesc*, int);
-void	putidt(Segdesc*, int);
-void	putcr3(ulong);
-void	putcr4(ulong);
-void	puttr(ulong);
-void	rdmsr(int, vlong*);
-void	wrmsr(int, vlong);
-void	(*cycles)(uvlong*);
-void	scsiinit(void);
-Off	scsiread(int, void*, long);
-Devsize	scsiseek(int, Devsize);
-Off	scsiwrite(int, void*, long);
-int	setatapart(int, char*);
-int	setscsipart(int, char*);
-void	setvec(int, void (*)(Ureg*, void*), void*);
-int	tas(Lock*);
-void	trapinit(void);
-void	uartspecial(int, void (*)(int), int (*)(void), int);
-int	uartgetc(void);
-void	uartputc(int);
-void	wbflush(void);
-void	cpuid(char*, int*, int*);
-
-#define PADDR(a)	((ulong)(a)&~KZERO)
-
-/* pata */
-void	ideinit(Device *d);
-Devsize	idesize(Device *d);
-int	ideread(Device *d,  Devsize, void*);
-int	idewrite(Device *d, Devsize, void*);
-
-/* sata */
-void	mvideinit(Device *d);
-Devsize	mvidesize(Device *d);
-int	mvideread(Device *d,  Devsize, void*);
-int	mvidewrite(Device *d, Devsize, void*);

+ 0 - 247
sys/src/fs/choline/io.h

@@ -1,247 +0,0 @@
-/*
- *  programmable interrupt vectors (for the 8259's)
- */
-enum
-{
-	Bptvec=		3,		/* breakpoints */
-	Mathemuvec=	7,		/* math coprocessor emulation interrupt */
-	Mathovervec=	9,		/* math coprocessor overrun interrupt */
-	Matherr1vec=	16,		/* math coprocessor error interrupt */
-	Faultvec=	14,		/* page fault */
-
-	Int0vec=	24,		/* first 8259 */
-	 Clockvec=	Int0vec+0,	/*  clock interrupts */
-	 Kbdvec=	Int0vec+1,	/*  keyboard interrupts */
-	 Uart1vec=	Int0vec+3,	/*  modem line */
-	 Uart0vec=	Int0vec+4,	/*  serial line */
-	 PCMCIAvec=	Int0vec+5,	/*  PCMCIA card change */
-	 Floppyvec=	Int0vec+6,	/*  floppy interrupts */
-	 Parallelvec=	Int0vec+7,	/*  parallel port interrupts */
-	Int1vec=	Int0vec+8,
-	 Ethervec=	Int0vec+10,	/*  ethernet interrupt */
-	 Mousevec=	Int0vec+12,	/*  mouse interrupt */
-	 Matherr2vec=	Int0vec+13,	/*  math coprocessor */
-	 ATA0vec=	Int0vec+14,	/*  hard disk */
-
-	Syscallvec=	64,
-};
-
-/*
- *  8259 interrupt controllers
- */
-enum
-{
-	Int0ctl=	0x20,		/* control port (ICW1, OCW2, OCW3) */
-	Int0aux=	0x21,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-	Int1ctl=	0xA0,		/* control port */
-	Int1aux=	0xA1,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-
-	Icw1=		0x10,		/* select bit in ctl register */
-	Ocw2=		0x00,
-	Ocw3=		0x08,
-
-	EOI=		0x20,		/* non-specific end of interrupt */
-
-	Elcr1=		0x4D0,		/* Edge/Level Triggered Register */
-	Elcr2=		0x4D1,
-};
-
-extern int	int0mask;		/* interrupts enabled for first 8259 */
-extern int	int1mask;		/* interrupts enabled for second 8259 */
-
-#define NVRAUTHADDR	0
-#define LINESIZE	0
-
-enum {
-	MaxEISA		= 16,
-	EISAconfig	= 0xC80,
-
-	MaxScsi		= 4,
-	NTarget		= 16,
-
-	MaxEther	= 4,
-};
-
-#define DMAOK(x, l)	((ulong)(((ulong)(x))+(l)) < (ulong)(KZERO|16*1024*1024))
-
-enum {
-	BusCBUS		= 0,		/* Corollary CBUS */
-	BusCBUSII,			/* Corollary CBUS II */
-	BusEISA,			/* Extended ISA */
-	BusFUTURE,			/* IEEE Futurebus */
-	BusINTERN,			/* Internal bus */
-	BusISA,				/* Industry Standard Architecture */
-	BusMBI,				/* Multibus I */
-	BusMBII,			/* Multibus II */
-	BusMCA,				/* Micro Channel Architecture */
-	BusMPI,				/* MPI */
-	BusMPSA,			/* MPSA */
-	BusNUBUS,			/* Apple Macintosh NuBus */
-	BusPCI,				/* Peripheral Component Interconnect */
-	BusPCMCIA,			/* PC Memory Card International Association */
-	BusTC,				/* DEC TurboChannel */
-	BusVL,				/* VESA Local bus */
-	BusVME,				/* VMEbus */
-	BusXPRESS,			/* Express System Bus */
-};
-
-#define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
-#define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
-#define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
-#define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
-#define BUSTYPE(tbdf)	((tbdf)>>24)
-#define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
-#define BUSUNKNOWN	(-1)
-
-/*
- * PCI support code.
- */
-enum {					/* type 0 and type 1 pre-defined header */
-	PciVID		= 0x00,		/* vendor ID */
-	PciDID		= 0x02,		/* device ID */
-	PciPCR		= 0x04,		/* command */
-	PciPSR		= 0x06,		/* status */
-	PciRID		= 0x08,		/* revision ID */
-	PciCCRp		= 0x09,		/* programming interface class code */
-	PciCCRu		= 0x0A,		/* sub-class code */
-	PciCCRb		= 0x0B,		/* base class code */
-	PciCLS		= 0x0C,		/* cache line size */
-	PciLTR		= 0x0D,		/* latency timer */
-	PciHDT		= 0x0E,		/* header type */
-	PciBST		= 0x0F,		/* BIST */
-
-	PciBAR0		= 0x10,		/* base address */
-	PciBAR1		= 0x14,
-
-	PciINTL		= 0x3C,		/* interrupt line */
-	PciINTP		= 0x3D,		/* interrupt pin */
-};
-
-enum {					/* type 0 pre-defined header */
-	PciBAR2		= 0x18,
-	PciBAR3		= 0x1C,
-	PciBAR4		= 0x20,
-	PciBAR5		= 0x24,
-	PciCIS		= 0x28,		/* cardbus CIS pointer */
-	PciSVID		= 0x2C,		/* subsystem vendor ID */
-	PciSID		= 0x2E,		/* cardbus CIS pointer */
-	PciEBAR0	= 0x30,		/* expansion ROM base address */
-	PciMGNT		= 0x3E,		/* burst period length */
-	PciMLT		= 0x3F,		/* maximum latency between bursts */
-};
-
-enum {					/* type 1 pre-defined header */
-	PciPBN		= 0x18,		/* primary bus number */
-	PciSBN		= 0x19,		/* secondary bus number */
-	PciUBN		= 0x1A,		/* subordinate bus number */
-	PciSLTR		= 0x1B,		/* secondary latency timer */
-	PciIBR		= 0x1C,		/* I/O base */
-	PciILR		= 0x1D,		/* I/O limit */
-	PciSPSR		= 0x1E,		/* secondary status */
-	PciMBR		= 0x20,		/* memory base */
-	PciMLR		= 0x22,		/* memory limit */
-	PciPMBR		= 0x24,		/* prefetchable memory base */
-	PciPMLR		= 0x26,		/* prefetchable memory limit */
-	PciPUBR		= 0x28,		/* prefetchable base upper 32 bits */
-	PciPULR		= 0x2C,		/* prefetchable limit upper 32 bits */
-	PciIUBR		= 0x30,		/* I/O base upper 16 bits */
-	PciIULR		= 0x32,		/* I/O limit upper 16 bits */
-	PciEBAR1	= 0x28,		/* expansion ROM base address */
-	PciBCR		= 0x3E,		/* bridge control register */
-};
-
-typedef struct Pcidev Pcidev;
-typedef struct Pcidev {
-	int	tbdf;			/* type+bus+device+function */
-	ushort	vid;			/* vendor ID */
-	ushort	did;			/* device ID */
-
-	struct {
-		ulong	bar;		/* base address */
-		int	size;
-	} mem[6];
-
-	uchar	rid;
-	uchar	ccrp;
-	uchar	ccrb;
-	uchar	intl;			/* interrupt line */
-	ushort	ccru;			/* is uchar in cpu kernel */
-	ulong	pcr;
-
-	Pcidev*	list;
-	Pcidev*	bridge;			/* down a bus */
-	Pcidev*	link;			/* next device on this bno */
-} Pcidev;
-
-extern int pcicfgr8(Pcidev*, int);
-extern int pcicfgr16(Pcidev*, int);
-extern int pcicfgr32(Pcidev*, int);
-extern void pcicfgw8(Pcidev*, int, int);
-extern void pcicfgw16(Pcidev*, int, int);
-extern void pcicfgw32(Pcidev*, int, int);
-extern void pciclrmwi(Pcidev*);
-extern void pcihinv(Pcidev*, ulong);
-extern Pcidev* pcimatch(Pcidev*, int, int);
-extern Pcidev* pcimatchtbdf(int);
-extern void pcireset(void);
-extern void pcisetbme(Pcidev*);
-extern void pciclrbme(Pcidev*);
-
-/*
- *  a parsed plan9.ini line
- */
-#define ISAOPTLEN	16
-#define NISAOPT		8
-
-typedef struct ISAConf {
-	char	type[NAMELEN];
-	ulong	port;
-	ulong	irq;
-	ulong	dma;
-	ulong	mem;
-	ulong	size;
-	ulong	freq;
-
-	int	nopt;
-	char	opt[NISAOPT][ISAOPTLEN];
-} ISAConf;
-
-extern int isaconfig(char*, int, ISAConf*);
-
-/*
- * SCSI support code.
- */
-enum {
-	STblank		=-6,		/* blank block */
-	STnomem		=-5,		/* buffer allocation failed */
-	STtimeout	=-4,		/* bus timeout */
-	STownid		=-3,		/* playing with myself */
-	STharderr	=-2,		/* controller error of some kind */
-	STinit		=-1,		/* */
-	STok		= 0,		/* good */
-	STcheck		= 0x02,		/* check condition */
-	STcondmet	= 0x04,		/* condition met/good */
-	STbusy		= 0x08,		/* busy */
-	STintok		= 0x10,		/* intermediate/good */
-	STintcondmet	= 0x14,		/* intermediate/condition met/good */
-	STresconf	= 0x18,		/* reservation conflict */
-	STterminated	= 0x22,		/* command terminated */
-	STqfull		= 0x28,		/* queue full */
-};
-
-typedef struct Target {
-	int	ctlrno;
-	int	targetno;
-	uchar*	inquiry;
-	uchar*	sense;
-
-	QLock;
-	char	id[NAMELEN];
-	int	ok;
-
-	char	fflag;
-	Filter	work[3];
-	Filter	rate[3];
-} Target;
-
-typedef int (*Scsiio)(Target*, int, uchar*, int, void*, int*);

+ 0 - 85
sys/src/fs/choline/mem.h

@@ -1,85 +0,0 @@
-#define	BY2WD		4			/* bytes per word */
-#define BY2V		8			/* bytes per vlong */
-#define	BY2PG		4096			/* bytes per page */
-#define	PGSHIFT		12			/* log(BY2PG) */
-#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))
-#define MB		(1024*1024)
-
-#define	HZ		(82)			/* clock frequency */
-#define	TK2MS(t)	(((ulong)(t)*1000)/HZ)	/* ticks to milliseconds - beware rounding */
-#define	MS2TK(t)	(((ulong)(t)*HZ)/1000)	/* milliseconds to ticks - beware rounding */
-#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
-
-/*
- * Fundamental addresses
- */
-#define IDTADDR		0x80000800		/* idt */
-#define APBOOTSTRAP	0x80001000		/* AP bootstrap code */
-#define CONFADDR	0x80001200		/* info passed from boot loader */
-#define CPU0PDB		0x80002000		/* bootstrap processor PDB */
-#define CPU0PTE		0x80003000		/* bootstrap processor PTE's for 0-2MB */
-#define CPU0MACHPTE	0x80004000		/* bootstrap processor PTE for MACHADDR */
-#define CPU0MACH	0x80005000		/* Mach for bootstrap processor */
-
-#define	KZERO		0x80000000		/* base of kernel address space */
-#define	KTZERO		0x80100000		/* first address in kernel text */
-
-#define	MACHSIZE	4096
-
-/*
- *  known 80386 segments (in GDT) and their selectors
- */
-#define	NULLSEG	0	/* null segment */
-#define	KDSEG	1	/* kernel data/stack */
-#define	KESEG	2	/* kernel executable */	
-#define	UDSEG	3	/* user data/stack */
-#define	UESEG	4	/* user executable */
-#define TSSSEG	5	/* task segment */
-#define N386SEG	6	/* number of segments */
-
-#define SELGDT	(0<<3)	/* selector is in gdt */
-#define	SELLDT	(1<<3)	/* selector is in ldt */
-
-#define SELECTOR(i, t, p)	(((i)<<3) | (t) | (p))
-
-#define NULLSEL	SELECTOR(NULLSEG, SELGDT, 0)
-#define KESEL	SELECTOR(KESEG, SELGDT, 0)
-#define KDSEL	SELECTOR(KDSEG, SELGDT, 0)
-#define UESEL	SELECTOR(UESEG, SELGDT, 3)
-#define UDSEL	SELECTOR(UDSEG, SELGDT, 3)
-#define TSSSEL	SELECTOR(TSSSEG, SELGDT, 0)
-
-/*
- *  fields in segment descriptors
- */
-#define SEGDATA	(0x10<<8)	/* data/stack segment */
-#define SEGEXEC	(0x18<<8)	/* executable segment */
-#define	SEGTSS	(0x9<<8)	/* TSS segment */
-#define SEGCG	(0x0C<<8)	/* call gate */
-#define	SEGIG	(0x0E<<8)	/* interrupt gate */
-#define SEGTG	(0x0F<<8)	/* task gate */
-#define SEGTYPE	(0x1F<<8)
-
-#define SEGP	(1<<15)		/* segment present */
-#define SEGPL(x) ((x)<<13)	/* priority level */
-#define SEGB	(1<<22)		/* granularity 1==4k (for expand-down) */
-#define SEGG	(1<<23)		/* granularity 1==4k (for other) */
-#define SEGE	(1<<10)		/* expand down */
-#define SEGW	(1<<9)		/* writable (for data/stack) */
-#define	SEGR	(1<<9)		/* readable (for code) */
-#define SEGD	(1<<22)		/* default 1==32bit (for code) */
-
-/*
- *  physical MMU
- */
-#define	PTEVALID	(1<<0)
-#define	PTEUNCACHED	(1<<4)	
-#define PTEWRITE	(1<<1)
-#define	PTERONLY	(0<<1)
-#define	PTEKERNEL	(0<<2)
-#define	PTEUSER		(1<<2)
-#define PTESIZE		(1<<7)
-
-#define MACHADDR	((ulong)&mach0)		/* hack number 1 */
-
-#define IFLAG		0x200	/* psw: interrupt enable, to be accurate */

+ 0 - 147
sys/src/fs/choline/mkfile

@@ -1,147 +0,0 @@
-CONF=choline
-p=9
-
-objtype=386
-</$objtype/mkfile
-
-TARG=$p$CONF'fs'
-
-DEV=\
-	apc.$O\
-	cw.$O\
-	fworm.$O\
-	juke.$O\
-	mworm.$O\
-	wren.$O\
-
-IP=\
-	arp.$O\
-	icmp.$O\
-	il.$O\
-	ip.$O\
-	ipaux.$O\
-	iproute.$O\
-	sntp.$O\
-	udp.$O\
-
-PORT=\
-	9p1.$O\
-	9p1lib.$O\
-	9p2.$O\
-	auth.$O\
-	chk.$O\
-	clock.$O\
-	con.$O\
-	config.$O\
-	console.$O\
-	data.$O\
-	dentry.$O\
-	devcons.$O\
-	fcmd.$O\
-	iobuf.$O\
-	lrand.$O\
-	main.$O\
-	print.$O\
-	proc.$O\
-	sub.$O\
-	time.$O\
-	uidgid.$O\
-
-PC=\
-	l.$O\
-	8250.$O\
-	8253.$O\
-	cga.$O\
-	devsd.$O\
-	sdscsi.$O\
-	sdata.$O\
-	sdmv50xx.$O\
-	dosfs.$O\
-	floppy.$O\
-	kbd.$O\
-	lock.$O\
-	malloc.$O\
-	mmu.$O\
-	nvr.$O\
-	pc.$O\
-	pci.$O\
-	toy.$O\
-	trap.$O\
-
-ETHER=\
-	compat.$O\
-	ether2114x.$O\
-	ether8139.$O\
-	ether8169.$O\
-	ether82557.$O\
-	ether83815.$O\
-	etherdp83820.$O\
-	etherelnk3.$O\
-	etherga620.$O\
-	etherif.$O\
-	etherigbe.$O\
-	ethermii.$O\
-
-SCSI=\
-	scsi.$O\
-	scsibuslogic.$O\
-	scsincr53c8xx.$O\
-
-OBJ=\
-	$PC\
-	$PORT\
-	$DEV\
-	$IP\
-	$ETHER\
-	$SCSI\
-
-HFILES=\
-	../port/all.h\
-	../port/lib.h\
-	../port/portdat.h\
-	../port/portfns.h\
-	dat.h\
-	fns.h\
-	io.h\
-	mem.h\
-	/$objtype/include/u.h\
-	/$objtype/include/ureg.h\
-
-LIB=\
-	-lauthsrv\
-	-lc\
-	-lsec\
-
-# -I../pc & -DFS are for compat.h
-# -DOLD uses 32-bit file offsets instead of 64-bit ones
-CFLAGS=-FTVw -I. -I../port -I../pc -DFS -DOLD
-
-all:V:	$TARG
-
-<../pc/mkfile
-<../port/mkfile
-<../dev/mkfile
-<../ip/mkfile
-
-$TARG:	$TARG.c $OBJ
-	$CC $CFLAGS -DDATE'='`{date -n} $TARG.c
-	$LD -o $target -l -T0x80100020 $OBJ $TARG.$O $LIB
-	size $target
-
-install:V: $TARG
-	cp $TARG /$objtype/
-	import lookout / /n/lookout && cp $TARG /n/lookout/$objtype/
-	import boundary / /n/boundary && cp $TARG /n/boundary/$objtype/
-
-$TARG.$O:	../pc/dosfs.h
-
-%.$O:	%.c
-	$CC $CFLAGS $stem.c
-
-%.$O:	%.s
-	$AS $stem.s
-
-%.$O:	$HFILES
-
-clean:V:
-	rm -f *.[$OS] [$OS].out $TARG

+ 0 - 773
sys/src/fs/dev/apc.c

@@ -1,773 +0,0 @@
-/*
- * manage APC (American Power Corporation) UPS, notably shutting down
- * gracefully when power gets too low. enabled by "ups0=type=apc" in plan9.ini.
- * N.B.: connection to UPS is assumed to be on eia1 (2nd serial port)
- * at 2400 bps!  due to hardcoded use of uartputc1, etc., probably can't
- * override port with "port=0" in plan9.ini entry.
- */
-#include "all.h"
-#include "mem.h"
-#include "io.h"
-
-//#define DEBUG if(cons.flags&apc.flag)print
-#define DEBUG print
-
-#define STATUSCHANGE(bit, on) { \
-	if (((apc.status.bits&(bit)) != 0) != (on)) { \
-		apc.status.change |= (bit); \
-		apc.status.bits = (apc.status.bits&~(bit)) | ((on)? (bit): 0); \
-	} \
-}
-
-enum {
-	OnBattery = 1,
-	LowBattery = 2,
-	AbnormalCondition = 4,
-	Uartspeed = 2400,
-	Trustlowbatt = 0,	// trust the low-battery bit?  i don't.
-};
-enum { First, Reinit };
-enum { Timedout = -1, Kicked = -2, Event = -3 };	/* apcgetc return */
-
-typedef enum { General, Cycle } CmdType;
-typedef enum { UpsOff, JustOff } Action;	/* unimplemented to date */
-
-typedef struct Capability {
-	char	cmd;
-	int	n;
-	struct Capability *next;
-	char	*val[1];
-} Capability;
-
-static struct apc {
-	Lock;
-	int	flag;
-	int	gotreply;
-	int	kicked;
-	int	detected;
-	Rendez	r;
-	Rendez	doze;
-	struct {
-		Lock;
-		Rendez;
-		int	count;
-		uchar	buf[100];
-		uchar	*in;
-		uchar	*out;
-	} rxq;
-	struct {
-		Rendez;
-		int	done;
-		CmdType	cmdtype;
-		char	cmd;
-		void	*arg1, *arg2;
-		char	resp[500];	/* response */
-	} user;
-	/* hardware info */
-	char	model[50];
-	char	fwrev[10];		/* firmware revision */
-
-	Capability *cap;
-	struct {
-		ulong	bits;
-		ulong	change;
-	} status;
-	/* battery info */
-	Timet	battonticks;		/* ticks with battery on */
-	Timet	lastrepticks;		/* ticks at last report */
-	ulong	battpct;		/* battery percent */
-	ulong	battpctthen;
-
-	ulong	trigger;
-	Action	action;
-	int	port;
-} apc;
-
-extern void uartspecial1(int port, void (*rx)(int), int (*tx)(void), int baud);
-extern void uartputc1(int c);
-
-void idle(void);
-
-static int
-kicked(void*)
-{
-	return apc.kicked != 0;
-}
-
-static int
-apctxint(void)
-{
-	return -1;
-}
-
-static void
-apcputc(char c)
-{
-	uartputc1(c);
-}
-
-static void
-apcputs(char *s)
-{
-	while (*s) {
-		delay(10);
-		apcputc(*s++);
-	}
-}
-
-void
-apcrxint(int c)
-{
-	int s;
-	uchar *p;
-
-	s = splhi();
-	lock(&apc.rxq);
-	if (apc.rxq.count < sizeof(apc.rxq.buf)) {
-		p = apc.rxq.in;
-		*p++ = c;
-		if(p >= apc.rxq.buf + sizeof(apc.rxq.buf))
-			p = apc.rxq.buf;
-		apc.rxq.in = p;
-		apc.rxq.count++;
-		wakeup(&apc.rxq);
-	}
-	unlock(&apc.rxq);
-	splx(s);
-}
-
-static int
-done(void *p)
-{
-	return *(int *)p != 0;
-}
-
-static int
-eitherdone(void *)
-{
-	return apc.rxq.count != 0 || apc.kicked;
-}
-
-int
-apcgetc(int timo, int noevents)
-{
-	char c;
-	int s;
-
-loop:
-	if (timo < 0)
-		sleep(&apc.rxq, eitherdone, 0);
-	else
-		tsleep(&apc.rxq, eitherdone, 0, timo);
-	if (apc.kicked)
-		return Kicked;
-
-	s = splhi();
-	lock(&apc.rxq);
-	if (apc.rxq.count == 0) {
-		unlock(&apc.rxq);
-		splx(s);
-		if (timo >= 0)
-			return Timedout;
-		goto loop;
-	}
-	c = *apc.rxq.out++;
-	if (apc.rxq.out >= apc.rxq.buf + sizeof(apc.rxq.buf))
-		apc.rxq.out = apc.rxq.buf;
-	apc.rxq.count--;
-	unlock(&apc.rxq);
-	splx(s);
-
-	switch (c) {
-	case '!':
-		STATUSCHANGE(OnBattery, 1);
-report_event:
-		print("apc: event %c\n", c);
-		if (noevents)
-			goto loop;
-		return Event;
-	case '$':
-		STATUSCHANGE(OnBattery, 0);
-		goto report_event;
-	case '%':
-		STATUSCHANGE(LowBattery, 1);
-		goto report_event;
-	case '+':
-		STATUSCHANGE(LowBattery, 0);
-		goto report_event;
-	case '?':
-		STATUSCHANGE(AbnormalCondition, 1);
-		goto report_event;
-	case '=':
-		STATUSCHANGE(AbnormalCondition, 0);
-		goto report_event;
-	case '*':
-		print("apc: turning off\n");
-		goto loop;
-	case '#':
-		print("apc: replace battery\n");
-		goto loop;
-	case '&':
-		print("apc: check alarm register\n");
-		goto loop;
-	case 0x7c:
-		print("apc: eeprom modified\n");
-		goto loop;
-	default:
-		break;
-	}
-
-//	print("apc: got 0x%.2ux\n", c);
-	return c;
-}
-
-char *
-apcgets(char *buf, int len, int timo)
-{
-	char *q;
-	int c;
-
-	q = buf;
-	while ((c = apcgetc(timo, 1)) >= 0 && c != '\r')
-		if (q < buf + len - 1)
-			*q++ = c;
-	if (c < 0)
-		return nil;
-
-	c = apcgetc(timo, 1);
-	if (c < 0 || c != '\n')
-		return nil;
-
-	*q = 0;
-	return buf;
-}
-
-int
-apcexpect(char *s, int skiprubbish, int timo)
-{
-	int first = 1;
-
-	while (*s) {
-		int c = apcgetc(timo, 1);
-
-		if (c < 0)
-			return 0;
-		if (*s == c) {
-			s++;
-			first = 0;
-			continue;
-		}
-		if (!first)
-			return 0;
-		if (!skiprubbish)
-			return 0;
-		first = 0;
-	}
-	return 1;
-}
-
-int
-apcattention(void)				/* anybody home? */
-{
-	apcputc('Y');
-	if (!apcexpect("SM\r\n", 1, 1000))
-		return 0;
-	apc.detected = 1;
-	return 1;
-}
-
-char *
-apccmdstrresponse(char *cmd, char *buf, int len)
-{
-	char *s;
-
-	apcputs(cmd);
-	s = apcgets(buf, len, 1000);
-	if (s == nil) {
-		print("APC asleep...\n");
-		if (!apcattention())
-			return nil;
-		apcputs(cmd);
-		return apcgets(buf, len, 1000);
-	}
-	return s;
-}
-
-char *
-apccmdresponse(char cmd, char *buf, int len)
-{
-	char cmdstr[2];
-
-	cmdstr[0] = cmd;
-	cmdstr[1] = 0;
-	return apccmdstrresponse(cmdstr, buf, len);
-}
-
-static void
-parsecap(char *capstr, char locale)
-{
-	char cmd, lc, c;
-	int n, el, i, j, p;
-
-	while (*capstr) {
-		char *s;
-		Capability *cap;
-
-		cmd = *capstr++;
-		lc = *capstr++;
-		n = *capstr++ - '0';
-		el = *capstr++ - '0';
-		p = lc == '4' || lc == locale;
-		if (p) {
-			cap = ialloc(sizeof *cap + sizeof s*(n - 1), 0);
-			cap->cmd = cmd;
-			cap->n = n;
-			s = ialloc(n*(el + 1), 0);
-			for (i = 0; i < n; i++) {
-				cap->val[i] = s + i*(el + 1);
-				cap->val[i][el] = 0;
-			}
-		} else
-			cap = nil;
-		for (i = 0; i < n; i++)
-			for (j = 0; j < el; j++) {
-				c = *capstr++;
-				if (p)
-					cap->val[i][j] = c;
-			}
-		if (p) {
-			cap->next = apc.cap;
-			apc.cap = cap;
-		}
-	}
-}
-
-static char *
-cyclecmd(Capability *cap, int i)
-{
-	char *s;
-
-	for (;;) {
-		char resp[10];
-
-		s = apccmdresponse(cap->cmd, resp, sizeof(resp));
-		if (s == nil || strcmp(resp, cap->val[i]) == 0)
-			break;
-		s = apccmdresponse('-', resp, sizeof(resp));
-		if (s == nil)
-			break;
-	}
-	return s;
-}
-
-static ulong
-getfloat(char *p, int dp)
-{
-	ulong total;
-	int afterdp = -1;
-
-	total = 0;
-	for (; *p; p++)
-		if (*p == '.')
-			afterdp = 0;
-		else {
-			total = total*10 + *p - '0';
-			if (afterdp >= 0)
-				afterdp++;
-		}
-	if (afterdp < 0)
-		afterdp = 0;
-	while (afterdp > dp + 1) {
-		afterdp--;
-		total /= 10;
-	}
-	if (afterdp > dp) {
-		afterdp--;
-		total = (total + 5) / 10;
-	}
-	while (dp > afterdp) {
-		afterdp++;
-		total *= 10;
-	}
-	return total;
-}
-
-static int
-apcgetstatus(void)
-{
-	char resp[10];
-	ulong status, change;
-
-	do {
-		change = apc.status.change;
-		if (apccmdresponse('Q', resp, sizeof(resp)) == nil)
-			return 0;
-	} while (apc.status.change != change);
-	status = strtoul(resp, 0, 16);
-	if (status&(1 << 3) && apc.status.bits&OnBattery) {	/* online? */
-		apc.status.bits  &= ~OnBattery;
-		apc.status.change |= OnBattery;
-	}
-	if (status&(1 << 4) && apc.status.bits&OnBattery) {	/* on battery */
-//		apc.status.bits   |= OnBattery;
-		apc.status.change |= OnBattery;
-	}
-	if (((status&(1 << 6)) != 0) != ((apc.status.bits&LowBattery) != 0)) {
-		/* low battery */
-		apc.status.bits   ^= LowBattery;
-		apc.status.change |= LowBattery;
-	}
-	if (apccmdresponse('f', resp, sizeof(resp)) == nil)
-		return 0;
-	apc.battpct = getfloat(resp, 1);
-	return 1;
-}
-
-/*
- * shutdown the file server gracefully.
- */
-static void
-apcshuffle(char *why)
-{
-	char resp[10];
-
-	print("Shutting down due to %s\n", why);
-	wlock(&mainlock);	/* don't process incoming requests from net */
-	sync("powerfail");
-	apccmdstrresponse("@000",  resp, sizeof(resp));
-	print("APC responded: '%s'\n", resp);
-	print("File server is now idling.\n");
-	delay(2000);
-	splhi();
-	for (;;)
-		idle();		/* wait for the lights to go out */
-}
-
-static void
-apckick(void)
-{
-	if (apc.detected) {		/* don't blather once per minute */
-		print("No APC ups detected\n");
-		apc.detected = 0;
-	}
-	apc.kicked = 0;
-	tsleep(&apc.doze, kicked, 0, 1 * 60 * 1000);
-}
-
-static void
-apcsetup(int reinit)
-{
-	int dead;
-	Capability *cap;
-
-	if (reinit)
-		apckick();
-	do {
-		while (!apcattention())
-			apckick();
-
-		apcputc(1);
-		apcgets(apc.model, sizeof(apc.model), -1);
-		print("APC UPS model: %s\n", apc.model);
-
-		apcputc('b');
-		apcgets(apc.fwrev, sizeof(apc.fwrev), -1);
-		print("Firmware revision: %s\n", apc.fwrev);
-
-		apcputc('');
-		apcgets(apc.user.resp, sizeof(apc.user.resp), -1);
-		parsecap(apc.user.resp, apc.fwrev[strlen(apc.fwrev) - 1]);
-
-		for (cap = apc.cap; cap; cap = cap->next) {
-			int i;
-
-			print("%c %d", cap->cmd, cap->n);
-			for (i = 0; i < cap->n; i++)
-				print(" %s", cap->val[i]);
-			print("\n");
-		}
-
-		apc.status.change = 0;
-		dead = 0;
-		if (!apcgetstatus()) {
-			apckick();
-			dead = 1;
-		}
-	} while (dead);
-}
-
-static void
-apcbatton(void)
-{
-	Timet now, nextreport;
-
-	now = MACHP(0)->ticks;
-	if (apc.status.change & OnBattery) {
-		apc.lastrepticks = apc.battonticks = nextreport = now;
-		apc.battpctthen = apc.battpct;
-	} else
-		nextreport = apc.lastrepticks + MS2TK(30 * 1000);
-	if (now - nextreport >= 0) {
-		print("apc: on battery %lud seconds (%lud.%lud%%)",
-			TK2SEC(now - apc.battonticks),
-			apc.battpct / 10, apc.battpct % 10);
-		if (apc.battpct < apc.battpctthen - 10) {
-			Timet remaining = ((apc.battpct - apc.trigger) *
-			  TK2SEC(now - apc.battonticks)) /
-			  (apc.battpctthen - apc.battpct);
-
-			print(" - estimated %lud seconds left", remaining);
-		}
-		print("\n");
-		apc.lastrepticks = now;
-	}
-	if (apc.battpct <= apc.trigger)
-		apcshuffle("battery percent too low");
-	if (Trustlowbatt && apc.status.bits & LowBattery)
-		apcshuffle("low battery indicator");
-}
-
-void
-apctask(void)
-{
-	tsleep(&apc.doze, kicked, 0, 10 * 1000);
-
-	/* set up the serial port to the UPS */
-	DEBUG("apc: running: port %d trigger below %lud%% action %s\n",
-		apc.port, apc.trigger / 10,
-		(apc.action == UpsOff? "ups off": "just off"));
-	apc.rxq.in = apc.rxq.out = apc.rxq.buf;
-	uartspecial1(apc.port, apcrxint, apctxint, Uartspeed);
-
-	/*
-	 * pretend we've been talking to it so we'll get an
-	 * error message if it's not there.
-	 */
-	apc.detected = 1;
-	apcsetup(First);
-	for (;;) {
-		char *s;
-		int c;
-
-		if ((apc.status.bits & OnBattery))
-			apcbatton();
-		apc.kicked = 0;
-		apc.status.change = 0;
-
-		c = apcgetc(10 * 1000, 0);
-		if (c == Timedout || c == Event) {
-			if (!apcgetstatus())
-				apcsetup(Reinit);
-		} else if (c == Kicked) {
-			apc.kicked = 0;
-			switch (apc.user.cmdtype) {
-			case General:
-				s = apccmdresponse(apc.user.cmd,
-				  apc.user.resp, sizeof apc.user.resp);
-				break;
-			case Cycle:
-				s = cyclecmd((Capability *)apc.user.arg1,
-					(int)apc.user.arg2);
-				break;
-			default:
-				s = nil;
-				break;
-			}
-			apc.user.done = 1;
-			wakeup(&apc.user);
-			if (s == nil)
-				apcsetup(Reinit);
-		} else
-			print("apc: unexpected character '%c' (0x%.2ux)\n",
-				c, c);
-	}
-}
-
-static void
-enquiry(CmdType t, char c, void *arg1, void *arg2)
-{
-	apc.user.cmdtype = t;
-	apc.user.cmd = c;
-	apc.user.arg1 = arg1;
-	apc.user.arg2 = arg2;
-	apc.user.done = 0;
-	apc.kicked = 1;
-	apc.user.resp[0] = 0;
-	wakeup(&apc.rxq);
-	/*
-	 * BUG: can hang here forever if cable to UPS falls out or
-	 * is wired wrong (need a null modem).
-	 */
-	sleep(&apc.user, done, &apc.user.done);
-	if (apc.user.resp[0]) {
-		print("'%s'\n", apc.user.resp);
-		apc.user.resp[0] = 0;
-	}
-}
-
-static struct {
-	char ch;
-	char *cmd;
-} generalenquiries[] = {
-	{ '', "capabilities" },
-	{ 'B', "batteryvolts" },
-	{ 'C', "temperature" },
-	{ 'E', "selftestinterval" },
-	{ 'F', "frequency" },
-	{ 'L', "lineinvolts" },
-	{ 'M', "maxlineinvolts" },
-	{ 'N', "minlineinvolts" },
-	{ 'O', "lineoutvolts" },
-	{ 'P', "powerload" },
-	{ 'Q', "status" },
-	{ 'V', "firmware" },
-	{ 'X', "selftestresults" },
-	{ 'a', "protocol" },
-	{ 'b', "localid" },
-	{ 'e', "returnthresh" },
-	{ 'g', "nominalbatteryvolts" },
-	{ 'f', "battpct" },
-	{ 'h', "humidity" },
-	{ 'i', "contacts" },
-	{ 'j', "runtime" },
-	{ 'k', "alarmdelay" },
-	{ 'l', "lowtransfervolts" },
-	{ 'm', "manufactured" },
-	{ 'n', "serial" },
-	{ 'o', "onbatteryvolts" },
-	{ 'p', "grace" },
-	{ 'q', "lowbatterywarntime" },
-	{ 'r', "wakeupdelay" },
-	{ 's', "sensitivity" },
-	{ 'u', "uppertransfervolts" },
-	{ 'x', "lastbatterychange" },
-	{ 'y', "copyright" },
-	{ '~', "register1" },
-	{ ''', "register2" },
-	{ '7', "switches" },
-	{ '8', "register3" },
-	{ '9', "linequality" },
-	{ '>', "batterypacks" },
-	{ '-', "cycle" },
-};
-
-int
-vaguelyequal(char *a, char *b)
-{
-	return strcmp(a, b) == 0;
-}
-
-static void
-cycle(char *name, char *val)
-{
-	int g, i;
-	Capability *cap;
-
-	if (strcmp(name, "trigger") == 0) {
-		apc.trigger = getfloat(val, 1);
-		return;
-	}
-
-	/* convert name to enquiry */
-	for (g = 0; g < nelem(generalenquiries); g++)
-		if (strcmp(name, generalenquiries[g].cmd) == 0)
-			break;
-	if (g >= nelem(generalenquiries)) {
-		print("no such parameter '%s'\n", name);
-		return;
-	}
-	/* match enquiry to capability */
-	for (cap = apc.cap; cap; cap = cap->next)
-		if (cap->cmd == generalenquiries[g].ch)
-			break;
-	if (cap == nil) {
-		print("parameter %s cannot be set\n", name);
-		return;
-	}
-	/* search capability's legal values */
-	for (i = 0; i < cap->n; i++)
-		if (vaguelyequal(cap->val[i], val))
-			break;
-	if (i >= cap->n) {
-		print("%s: illegal value %s; try one of [", name, val);
-		for (i = 0; i < cap->n; i++) {
-			if (i > 0)
-				print(" ");
-			print("%s", cap->val[i]);
-		}
-		print("]\n");
-	} else
-		enquiry(Cycle, cap->cmd, cap, (void *)i);
-}
-
-void
-cmd_apc(int argc, char *argv[])
-{
-	int i, x;
-
-	if(argc <= 1) {
-		print("apc kick -- play now\n");
-		print("apc set var val -- set var to val\n");
-		print("apc enquiry... -- query the ups\n");
-		return;
-	}
-	for (i = 1; i < argc; i++) {
-		if(strcmp(argv[i], "kick") == 0) {
-			apc.kicked = 1;
-			wakeup(&apc.doze);
-			continue;
-		}
-		if(strcmp(argv[i], "set") == 0) {
-			if (argc - i >= 3)
-				cycle(argv[i + 1], argv[i + 2]);
-			i += 2;
-			continue;
-		}
-		for (x = 0; x < nelem(generalenquiries); x++)
-			if (strcmp(argv[i], generalenquiries[x].cmd) == 0)
-				break;
-		if (x < nelem(generalenquiries))
-			enquiry(General, generalenquiries[x].ch, nil, nil);
-		else {
-			print("no such parameter '%s'\n", argv[i]);
-			return;
-		}
-	}
-}
-
-void
-apcinit(void)
-{
-	ISAConf isa;
-	int o;
-
-	print("apcinit...");
-	memset(&isa, 0, sizeof isa);	/* prevent surprises */
-	isa.port = 1;			/* default port */
-	if (!isaconfig("ups", 0, &isa) || strcmp(isa.type, "apc") != 0) {
-		print("no ups in plan9.ini, or not type `apc'\n");
-		return;
-	}
-
-	cmd_install("apc", "subcommand -- apc ups driver", cmd_apc);
-	apc.flag = flag_install("apc", "-- verbose");
-
-	apc.trigger = 1000;
-	apc.action = UpsOff;
-
-	for (o = 0; o < isa.nopt; o++)
-		if (cistrncmp(isa.opt[o], "trigger=", 8) == 0)
-			apc.trigger = strtoul(isa.opt[o] + 8, 0, 0) * 10;
-		else if (cistrncmp(isa.opt[o], "action=", 7) == 0) {
-			if (strcmp(isa.opt[o] + 8, "off") == 0)
-				apc.action = JustOff;
-		}
-
-	apc.port = isa.port;
-	/*
-	 * it's a little early to be starting this, before config mode is
-	 * even started.
-	 */
-	print("apc...\n");
-	userinit(apctask, 0, "apc");
-}

+ 0 - 2271
sys/src/fs/dev/cw.c

@@ -1,2271 +0,0 @@
-#include "all.h"
-
-#define	DEBUG		0
-#define	FIRST		SUPER_ADDR
-
-#define	ADDFREE		(100)
-#define	CACHE_ADDR	SUPER_ADDR
-#define	MAXAGE		10000
-
-#define	CDEV(d)		(d->cw.c)
-#define	WDEV(d)		(d->cw.w)
-#define	RDEV(d)		(d->cw.ro)
-
-/* cache state */
-enum
-{
-	/* states -- beware these are recorded on the cache */
-				/*    cache    worm	*/
-	Cnone = 0,		/*	0	?	*/
-	Cdirty,			/*	1	0	*/
-	Cdump,			/*	1	0->1	*/
-	Cread,			/*	1	1	*/
-	Cwrite,			/*	2	1	*/
-	Cdump1,			/* inactive form of dump */
-	Cerror,
-
-	/* opcodes -- these are not recorded */
-	Onone,
-	Oread,
-	Owrite,
-	Ogrow,
-	Odump,
-	Orele,
-	Ofree,
-};
-
-typedef	struct	Cw	Cw;
-struct	Cw
-{
-	Device*	dev;
-	Device*	cdev;
-	Device*	wdev;
-	Device*	rodev;
-	Cw*	link;
-
-	Filter	ncwio[3];
-	int	dbucket;	/* last bucket dumped */
-	Off	daddr;		/* last block dumped */
-	Off	ncopy;
-	int	nodump;
-/*
- * following are cached variables for dumps
- */
-	Off	fsize;
-	Off	ndump;
-	int	depth;
-	int	all;		/* local flag to recur on modified directories */
-	int	allflag;	/* global flag to recur on modified directories */
-	Off	falsehits;	/* times recur found modified blocks */
-	struct
-	{
-		char	name[500];
-		char	namepad[NAMELEN+10];
-	};
-};
-
-static
-char*	cwnames[] =
-{
-	[Cnone]		"none",
-	[Cdirty]	"dirty",
-	[Cdump]		"dump",
-	[Cread]		"read",
-	[Cwrite]	"write",
-	[Cdump1]	"dump1",
-	[Cerror]	"error",
-
-	[Onone]		"none",
-	[Oread]		"read",
-	[Owrite]	"write",
-	[Ogrow]		"grow",
-	[Odump]		"dump",
-	[Orele]		"rele",
-};
-
-Centry*	getcentry(Bucket*, Off);
-int	cwio(Device*, Off, void*, int);
-void	cmd_cwcmd(int, char*[]);
-
-/*
- * console command
- * initiate a dump
- */
-void
-cmd_dump(int argc, char *argv[])
-{
-	Filsys *fs;
-
-	fs = cons.curfs;
-	if(argc > 1)
-		fs = fsstr(argv[1]);
-	if(fs == 0) {
-		print("%s: unknown file system\n", argv[1]);
-		return;
-	}
-	cfsdump(fs);
-}
-
-/*
- * console command
- * worm stats
- */
-static
-void
-cmd_statw(int, char*[])
-{
-	Filsys *fs;
-	Iobuf *p;
-	Superb *sb;
-	Cache *h;
-	Bucket *b;
-	Centry *c, *ce;
-	Off m, nw, bw, state[Onone];
-	Off sbfsize, sbcwraddr, sbroraddr, sblast, sbnext;
-	Off hmsize, hmaddr, dsize, dsizepct;
-	Device *dev;
-	Cw *cw;
-	int s;
-
-	fs = cons.curfs;
-	dev = fs->dev;
-	if(dev->type != Devcw) {
-		print("curfs not type cw\n");
-		return;
-	}
-
-	cw = dev->private;
-	if(cw == 0) {
-		print("curfs not inited\n");
-		return;
-	}
-
-	print("cwstats %s\n", fs->name);
-
-	sbfsize = 0;
-	sbcwraddr = 0;
-	sbroraddr = 0;
-	sblast = 0;
-	sbnext = 0;
-
-	print("	filesys %s\n", fs->name);
-	print("	nio   =%7W%7W%7W\n", cw->ncwio+0, cw->ncwio+1, cw->ncwio+2);
-	p = getbuf(dev, cwsaddr(dev), Bread);
-	if(!p || checktag(p, Tsuper, QPSUPER)) {
-		print("cwstats: checktag super\n");
-		if(p) {
-			putbuf(p);
-			p = 0;
-		}
-	}
-	if(p) {
-		sb = (Superb*)p->iobuf;
-		sbfsize = sb->fsize;
-		sbcwraddr = sb->cwraddr;
-		sbroraddr = sb->roraddr;
-		sblast = sb->last;
-		sbnext = sb->next;
-		putbuf(p);
-	}
-
-	p = getbuf(cw->cdev, CACHE_ADDR, Bread|Bres);
-	if(!p || checktag(p, Tcache, QPSUPER)) {
-		print("cwstats: checktag c bucket\n");
-		if(p)
-			putbuf(p);
-		return;
-	}
-	h = (Cache*)p->iobuf;
-	hmaddr = h->maddr;
-	hmsize = h->msize;
-
-	print("		maddr  = %8lld\n", (Wideoff)hmaddr);
-	print("		msize  = %8lld\n", (Wideoff)hmsize);
-	print("		caddr  = %8lld\n", (Wideoff)h->caddr);
-	print("		csize  = %8lld\n", (Wideoff)h->csize);
-	print("		sbaddr = %8lld\n", (Wideoff)h->sbaddr);
-	print("		craddr = %8lld %8lld\n", (Wideoff)h->cwraddr, (Wideoff)sbcwraddr);
-	print("		roaddr = %8lld %8lld\n", (Wideoff)h->roraddr, (Wideoff)sbroraddr);
-	/* print stats in terms of (first-)disc sides */
-	dsize = wormsizeside(dev, 0);
-	if (dsize < 1) {
-		if (DEBUG)
-			print("wormsizeside returned size %lld for %Z side 0\n",
-				(Wideoff)dsize, dev);
-		dsize = h->wsize;	/* it's probably a fake worm */
-		if (dsize < 1)
-			dsize = 1000;	/* don't divide by zero */
-	}
-	dsizepct = dsize/100;
-	print("		fsize  = %8lld %8lld %2lld+%2lld%%\n", (Wideoff)h->fsize,
-				(Wideoff)sbfsize, (Wideoff)h->fsize/dsize,
-				(Wideoff)(h->fsize%dsize)/dsizepct);
-	print("		slast  =          %8lld\n", (Wideoff)sblast);
-	print("		snext  =          %8lld\n", (Wideoff)sbnext);
-	print("		wmax   = %8lld          %2lld+%2lld%%\n", (Wideoff)h->wmax,
-				(Wideoff)h->wmax/dsize,
-				(Wideoff)(h->wmax%dsize)/dsizepct);
-	print("		wsize  = %8lld          %2lld+%2lld%%\n", (Wideoff)h->wsize,
-				(Wideoff)h->wsize/dsize,
-				(Wideoff)(h->wsize%dsize)/dsizepct);
-	putbuf(p);
-
-	bw = 0;	/* max filled bucket */
-	memset(state, 0, sizeof(state));
-	for(m=0; m<hmsize; m++) {
-		p = getbuf(cw->cdev, hmaddr + m/BKPERBLK, Bread);
-		if(!p || checktag(p, Tbuck, hmaddr + m/BKPERBLK)) {
-			print("cwstats: checktag c bucket\n");
-			if(p)
-				putbuf(p);
-			return;
-		}
-		b = (Bucket*)p->iobuf + m%BKPERBLK;
-		ce = b->entry + CEPERBK;
-		nw = 0;
-		for(c=b->entry; c<ce; c++) {
-			s = c->state;
-			state[s]++;
-			if(s != Cnone && s != Cread)
-				nw++;
-		}
-		putbuf(p);
-		if(nw > bw)
-			bw = nw;
-	}
-	for(s=Cnone; s<Cerror; s++)
-		print("		%6lld %s\n", (Wideoff)state[s], cwnames[s]);
-	print("		cache %2lld%% full\n", ((Wideoff)bw*100)/CEPERBK);
-}
-
-int
-dumpblock(Device *dev)
-{
-	Iobuf *p, *cb, *p1, *p2;
-	Cache *h;
-	Centry *c, *ce, *bc;
-	Bucket *b;
-	Off m, a, msize, maddr, wmax, caddr;
-	int s1, s2, count;
-	Cw *cw;
-
-	cw = dev->private;
-	if(cw == 0 || cw->nodump)
-		return 0;
-
-	cb = getbuf(cw->cdev, CACHE_ADDR, Bread|Bres);
-	h = (Cache*)cb->iobuf;
-	msize = h->msize;
-	maddr = h->maddr;
-	wmax = h->wmax;
-	caddr = h->caddr;
-	putbuf(cb);
-
-	for(m=msize; m>=0; m--) {
-		a = cw->dbucket + 1;
-		if(a < 0 || a >= msize)
-			a = 0;
-		cw->dbucket = a;
-		p = getbuf(cw->cdev, maddr + a/BKPERBLK, Bread);
-		b = (Bucket*)p->iobuf + a%BKPERBLK;
-		ce = b->entry + CEPERBK;
-		bc = 0;
-		for(c=b->entry; c<ce; c++)
-			if(c->state == Cdump) {
-				if(bc == 0) {
-					bc = c;
-					continue;
-				}
-				if(c->waddr < cw->daddr) {
-					if(bc->waddr < cw->daddr &&
-					   bc->waddr > c->waddr)
-						bc = c;
-					continue;
-				}
-				if(bc->waddr < cw->daddr ||
-				   bc->waddr > c->waddr)
-					bc = c;
-			}
-		if(bc) {
-			c = bc;
-			goto found;
-		}
-		putbuf(p);
-	}
-	if(cw->ncopy) {
-		print("%lld blocks copied to worm\n", (Wideoff)cw->ncopy);
-		cw->ncopy = 0;
-	}
-	cw->nodump = 1;
-	return 0;
-
-found:
-	a = a*CEPERBK + (c - b->entry) + caddr;
-	p1 = getbuf(devnone, Cwdump1, 0);
-	count = 0;
-
-retry:
-	count++;
-	if(count > 10)
-		goto stop;
-	if(devread(cw->cdev, a, p1->iobuf))
-		goto stop;
-	m = c->waddr;
-	cw->daddr = m;
-	s1 = devwrite(cw->wdev, m, p1->iobuf);
-	if(s1) {
-		p2 = getbuf(devnone, Cwdump2, 0);
-		s2 = devread(cw->wdev, m, p2->iobuf);
-		if(s2) {
-			if(s1 == 0x61 && s2 == 0x60) {
-				putbuf(p2);
-				goto retry;
-			}
-			goto stop1;
-		}
-		if(memcmp(p1->iobuf, p2->iobuf, RBUFSIZE))
-			goto stop1;
-		putbuf(p2);
-	}
-	/*
-	 * reread and compare
-	 */
-	if(conf.dumpreread) {
-		p2 = getbuf(devnone, Cwdump2, 0);
-		s1 = devread(cw->wdev, m, p2->iobuf);
-		if(s1)
-			goto stop1;
-		if(memcmp(p1->iobuf, p2->iobuf, RBUFSIZE)) {
-			print("reread C%lld W%lld didnt compare\n", (Wideoff)a, (Wideoff)m);
-			goto stop1;
-		}
-		putbuf(p2);
-	}
-
-	putbuf(p1);
-	c->state = Cread;
-	p->flags |= Bmod;
-	putbuf(p);
-
-	if(m > wmax) {
-		cb = getbuf(cw->cdev, CACHE_ADDR, Bread|Bmod|Bres);
-		h = (Cache*)cb->iobuf;
-		if(m > h->wmax)
-			h->wmax = m;
-		putbuf(cb);
-	}
-	cw->ncopy++;
-	return 1;
-
-stop1:
-	putbuf(p2);
-	putbuf(p1);
-	c->state = Cdump1;
-	p->flags |= Bmod;
-	putbuf(p);
-	return 1;
-
-stop:
-	putbuf(p1);
-	putbuf(p);
-	print("stopping dump!!\n");
-	cw->nodump = 1;
-	return 0;
-}
-
-void
-cwinit1(Device *dev)
-{
-	Cw *cw;
-	static int first;
-
-	cw = dev->private;
-	if(cw)
-		return;
-
-	if(first == 0) {
-		cmd_install("dump", "-- make dump backup to worm", cmd_dump);
-		cmd_install("statw", "-- cache/worm stats", cmd_statw);
-		cmd_install("cwcmd", "subcommand -- cache/worm errata", cmd_cwcmd);
-		roflag = flag_install("ro", "-- ro reads and writes");
-		first = 1;
-	}
-	cw = ialloc(sizeof(Cw), 0);
-	dev->private = cw;
-
-	cw->allflag = 0;
-	dofilter(cw->ncwio+0, C0a, C0b, 1);
-	dofilter(cw->ncwio+1, C1a, C1b, 1);
-	dofilter(cw->ncwio+2, C2a, C2b, 1);
-
-	cw->dev = dev;
-	cw->cdev = CDEV(dev);
-	cw->wdev = WDEV(dev);
-	cw->rodev = RDEV(dev);
-
-	devinit(cw->cdev);
-	devinit(cw->wdev);
-}
-
-void
-cwinit(Device *dev)
-{
-	Cw *cw;
-	Cache *h;
-	Iobuf *cb, *p;
-	Off l, m;
-
-	cwinit1(dev);
-
-	cw = dev->private;
-	l = devsize(cw->wdev);
-	cb = getbuf(cw->cdev, CACHE_ADDR, Bread|Bmod|Bres);
-	h = (Cache*)cb->iobuf;
-	h->toytime = toytime() + SECOND(30);
-	h->time = time();
-	m = h->wsize;
-	if(l != m) {
-		print("wdev changed size %lld to %lld\n", (Wideoff)m, (Wideoff)l);
-		h->wsize = l;
-		cb->flags |= Bmod;
-	}
-
-	for(m=0; m<h->msize; m++) {
-		p = getbuf(cw->cdev, h->maddr + m/BKPERBLK, Bread);
-		if(!p || checktag(p, Tbuck, h->maddr + m/BKPERBLK))
-			panic("cwinit: checktag c bucket");
-		putbuf(p);
-	}
-	putbuf(cb);
-}
-
-Off
-cwsaddr(Device *dev)
-{
-	Iobuf *cb;
-	Off sa;
-
-	cb = getbuf(CDEV(dev), CACHE_ADDR, Bread|Bres);
-	sa = ((Cache*)cb->iobuf)->sbaddr;
-	putbuf(cb);
-	return sa;
-}
-
-Off
-cwraddr(Device *dev)
-{
-	Iobuf *cb;
-	Off ra;
-
-	switch(dev->type) {
-	default:
-		print("unknown dev in cwraddr %Z\n", dev);
-		return 1;
-
-	case Devcw:
-		cb = getbuf(CDEV(dev), CACHE_ADDR, Bread|Bres);
-		ra = ((Cache*)cb->iobuf)->cwraddr;
-		break;
-
-	case Devro:
-		cb = getbuf(CDEV(dev->ro.parent), CACHE_ADDR, Bread|Bres);
-		ra = ((Cache*)cb->iobuf)->roraddr;
-		break;
-	}
-	putbuf(cb);
-	return ra;
-}
-
-Devsize
-cwsize(Device *dev)
-{
-	Iobuf *cb;
-	Devsize fs;
-
-	cb = getbuf(CDEV(dev), CACHE_ADDR, Bread|Bres);
-	fs = ((Cache*)cb->iobuf)->fsize;
-	putbuf(cb);
-	return fs;
-}
-
-int
-cwread(Device *dev, Off b, void *c)
-{
-	return cwio(dev, b, c, Oread) == Cerror;
-}
-
-int
-cwwrite(Device *dev, Off b, void *c)
-{
-	return cwio(dev, b, c, Owrite) == Cerror;
-}
-
-int
-roread(Device *dev, Off b, void *c)
-{
-	Device *d;
-	int s;
-
-	/*
-	 * maybe better is to try buffer pool first
-	 */
-	d = dev->ro.parent;
-	if(d == 0 || d->type != Devcw ||
-	   d->private == 0 || RDEV(d) != dev) {
-		print("bad rodev %Z\n", dev);
-		return 1;
-	}
-	s = cwio(d, b, 0, Onone);
-	if(s == Cdump || s == Cdump1 || s == Cread) {
-		s = cwio(d, b, c, Oread);
-		if(s == Cdump || s == Cdump1 || s == Cread) {
-			if(cons.flags & roflag)
-				print("roread: %Z %lld -> %Z(hit)\n", dev, (Wideoff)b, d);
-			return 0;
-		}
-	}
-	if(cons.flags & roflag)
-		print("roread: %Z %lld -> %Z(miss)\n", dev, (Wideoff)b, WDEV(d));
-	return devread(WDEV(d), b, c);
-}
-
-int
-cwio(Device *dev, Off addr, void *buf, int opcode)
-{
-	Iobuf *p, *p1, *p2, *cb;
-	Cache *h;
-	Bucket *b;
-	Centry *c;
-	Off bn, a1, a2, max, newmax;
-	int state;
-	Cw *cw;
-
-	cw = dev->private;
-	cw->ncwio[0].count++;
-	cw->ncwio[1].count++;
-	cw->ncwio[2].count++;
-
-	cb = getbuf(cw->cdev, CACHE_ADDR, Bread|Bres);
-	h = (Cache*)cb->iobuf;
-	if(toytime() >= h->toytime) {
-		cb->flags |= Bmod;
-		h->toytime = toytime() + SECOND(30);
-		h->time = time();
-	}
-
-	if(addr < 0) {
-		putbuf(cb);
-		return Cerror;
-	}
-
-	bn = addr % h->msize;
-	a1 = h->maddr + bn/BKPERBLK;
-	a2 = bn*CEPERBK + h->caddr;
-	max = h->wmax;
-
-	putbuf(cb);
-	newmax = 0;
-
-	p = getbuf(cw->cdev, a1, Bread|Bmod);
-	if(!p || checktag(p, Tbuck, a1))
-		panic("cwio: checktag c bucket");
-	b = (Bucket*)p->iobuf + bn%BKPERBLK;
-
-	c = getcentry(b, addr);
-	if(c == 0) {
-		putbuf(p);
-		print("%Z disk cache bucket %lld is full\n", cw->cdev, (Wideoff)a1);
-		return Cerror;
-	}
-	a2 += c - b->entry;
-
-	state = c->state;
-	switch(opcode)
-	{
-	default:
-		goto bad;
-
-	case Onone:
-		break;
-
-	case Oread:
-		switch(state) {
-		default:
-			goto bad;
-
-		case Cread:
-			if(!devread(cw->cdev, a2, buf))
-				break;
-			c->state = Cnone;
-
-		case Cnone:
-			if(devread(cw->wdev, addr, buf)) {
-				state = Cerror;
-				break;
-			}
-			if(addr > max)
-				newmax = addr;
-			if(!devwrite(cw->cdev, a2, buf))
-				c->state = Cread;
-			break;
-
-		case Cdirty:
-		case Cdump:
-		case Cdump1:
-		case Cwrite:
-			if(devread(cw->cdev, a2, buf))
-				state = Cerror;
-			break;
-		}
-		break;
-
-	case Owrite:
-		switch(state) {
-		default:
-			goto bad;
-
-		case Cdump:
-		case Cdump1:
-			/*
-			 * this is hard part -- a dump block must be
-			 * sent to the worm if it is rewritten.
-			 * if this causes an error, there is no
-			 * place to save the dump1 data. the block
-			 * is just reclassified as 'dump1' (botch)
-			 */
-			p1 = getbuf(devnone, Cwio1, 0);
-			if(devread(cw->cdev, a2, p1->iobuf)) {
-				putbuf(p1);
-				print("cwio: write induced dump error - r cache\n");
-
-			casenone:
-				if(devwrite(cw->cdev, a2, buf)) {
-					state = Cerror;
-					break;
-				}
-				c->state = Cdump1;
-				break;
-			}
-			if(devwrite(cw->wdev, addr, p1->iobuf)) {
-				p2 = getbuf(devnone, Cwio2, 0);
-				if(devread(cw->wdev, addr, p2->iobuf)) {
-					putbuf(p1);
-					putbuf(p2);
-					print("cwio: write induced dump error - r+w worm\n");
-					goto casenone;
-				}
-				if(memcmp(p1->iobuf, p2->iobuf, RBUFSIZE)) {
-					putbuf(p1);
-					putbuf(p2);
-					print("cwio: write induced dump error - w worm\n");
-					goto casenone;
-				}
-				putbuf(p2);
-			}
-			putbuf(p1);
-			c->state = Cread;
-			if(addr > max)
-				newmax = addr;
-			cw->ncopy++;
-
-		case Cnone:
-		case Cread:
-			if(devwrite(cw->cdev, a2, buf)) {
-				state = Cerror;
-				break;
-			}
-			c->state = Cwrite;
-			break;
-
-		case Cdirty:
-		case Cwrite:
-			if(devwrite(cw->cdev, a2, buf))
-				state = Cerror;
-			break;
-		}
-		break;
-
-	case Ogrow:
-		if(state != Cnone) {
-			print("%Z for block %lld cwgrow with state = %s\n",
-				cw->cdev, (Wideoff)addr, cwnames[state]);
-			break;
-		}
-		c->state = Cdirty;
-		break;
-
-	case Odump:
-		if(state != Cdirty) {	/* BOTCH */
-			print("%Z for block %lld cwdump with state = %s\n",
-				cw->cdev, (Wideoff)addr, cwnames[state]);
-			break;
-		}
-		c->state = Cdump;
-		cw->ndump++;	/* only called from dump command */
-		break;
-
-	case Orele:
-		if(state != Cwrite) {
-			if(state != Cdump1)
-				print("%Z for block %lld cwrele with state = %s\n",
-					cw->cdev, (Wideoff)addr, cwnames[state]);
-			break;
-		}
-		c->state = Cnone;
-		break;
-
-	case Ofree:
-		if(state == Cwrite || state == Cread)
-			c->state = Cnone;
-		break;
-	}
-	if(DEBUG)
-		print("cwio: %Z %lld s=%s o=%s ns=%s\n",
-			dev, (Wideoff)addr, cwnames[state],
-			cwnames[opcode],
-			cwnames[c->state]);
-	putbuf(p);
-	if(newmax) {
-		cb = getbuf(cw->cdev, CACHE_ADDR, Bread|Bmod|Bres);
-		h = (Cache*)cb->iobuf;
-		if(newmax > h->wmax)
-			h->wmax = newmax;
-		putbuf(cb);
-	}
-	return state;
-
-bad:
-	print("%Z block %lld cw state = %s; cw opcode = %s",
-		dev, (Wideoff)addr, cwnames[state], cwnames[opcode]);
-	return Cerror;
-}
-
-extern Filsys* dev2fs(Device *dev);
-
-int
-cwgrow(Device *dev, Superb *sb, int uid)
-{
-	char str[NAMELEN];
-	Iobuf *cb;
-	Cache *h;
-	Filsys *filsys;
-	Off fs, nfs, ws;
-
-	cb = getbuf(CDEV(dev), CACHE_ADDR, Bread|Bmod|Bres);
-	h = (Cache*)cb->iobuf;
-	ws = h->wsize;
-	fs = h->fsize;
-	if(fs >= ws)
-		return 0;
-	nfs = fs + ADDFREE;
-	if(nfs >= ws)
-		nfs = ws;
-	h->fsize = nfs;
-	putbuf(cb);
-
-	sb->fsize = nfs;
-	filsys = dev2fs(dev);
-	if (filsys == nil)
-		print("%Z", dev);
-	else
-		print("%s", filsys->name);
-	uidtostr(str, uid, 1);
-	print(" grow from %lld to %lld limit %lld by %s uid=%d\n",
-		(Wideoff)fs, (Wideoff)nfs, (Wideoff)ws, str, uid);
-	for(nfs--; nfs>=fs; nfs--) {
-		switch(cwio(dev, nfs, 0, Ogrow)) {
-		case Cerror:
-			return 0;
-		case Cnone:
-			addfree(dev, nfs, sb);
-		}
-	}
-	return 1;
-}
-
-int
-cwfree(Device *dev, Off addr)
-{
-	int state;
-
-	if(dev->type == Devcw) {
-		state = cwio(dev, addr, 0, Ofree);
-		if(state != Cdirty)
-			return 1;	/* do not put in freelist */
-	}
-	return 0;			/* put in freelist */
-}
-
-int
-bktcheck(Bucket *b)
-{
-	Centry *c, *c1, *c2, *ce;
-	int err;
-
-	err = 0;
-	if(b->agegen < CEPERBK || b->agegen > MAXAGE) {
-		print("agegen %ld\n", b->agegen);
-		err = 1;
-	}
-
-	ce = b->entry + CEPERBK;
-	c1 = 0;		/* lowest age last pass */
-	for(;;) {
-		c2 = 0;		/* lowest age this pass */
-		for(c = b->entry; c < ce; c++) {
-			if(c1 != 0 && c != c1) {
-				if(c->age == c1->age) {
-					print("same age %d\n", c->age);
-					err = 1;
-				}
-				if(c1->waddr == c->waddr)
-				if(c1->state != Cnone)
-				if(c->state != Cnone) {
-					print("same waddr %lld\n", (Wideoff)c->waddr);
-					err = 1;
-				}
-			}
-			if(c1 != 0 && c->age <= c1->age)
-				continue;
-			if(c2 == 0 || c->age < c2->age)
-				c2 = c;
-		}
-		if(c2 == 0)
-			break;
-		c1 = c2;
-		if(c1->age >= b->agegen) {
-			print("age >= generator %d %ld\n", c1->age, b->agegen);
-			err = 1;
-		}
-	}
-	return err;
-}
-
-void
-resequence(Bucket *b)
-{
-	Centry *c, *ce, *cr;
-	int age, i;
-
-	ce = b->entry + CEPERBK;
-	for(c = b->entry; c < ce; c++) {
-		c->age += CEPERBK;
-		if(c->age < CEPERBK)
-			c->age = MAXAGE;
-	}
-	b->agegen += CEPERBK;
-
-	age = 0;
-	for(i=0;; i++) {
-		cr = 0;
-		for(c = b->entry; c < ce; c++) {
-			if(c->age < i)
-				continue;
-			if(cr == 0 || c->age < age) {
-				cr = c;
-				age = c->age;
-			}
-		}
-		if(cr == 0)
-			break;
-		cr->age = i;
-	}
-	b->agegen = i;
-	cons.nreseq++;
-}
-
-Centry*
-getcentry(Bucket *b, Off addr)
-{
-	Centry *c, *ce, *cr;
-	int s, age;
-
-	/*
-	 * search for cache hit
-	 * find oldest block as byproduct
-	 */
-	ce = b->entry + CEPERBK;
-	age = 0;
-	cr = 0;
-	for(c = b->entry; c < ce; c++) {
-		s = c->state;
-		if(s == Cnone) {
-			cr = c;
-			age = 0;
-			continue;
-		}
-		if(c->waddr == addr)
-			goto found;
-		if(s == Cread) {
-			if(cr == 0 || c->age < age) {
-				cr = c;
-				age = c->age;
-			}
-		}
-	}
-
-	/*
-	 * remap entry
-	 */
-	c = cr;
-	if(c == 0)
-		return 0;	/* bucket is full */
-
-	c->state = Cnone;
-	c->waddr = addr;
-
-found:
-	/*
-	 * update the age to get filo cache.
-	 * small number in age means old
-	 */
-	if(!cons.noage || c->state == Cnone) {
-		age = b->agegen;
-		c->age = age;
-		age++;
-		b->agegen = age;
-		if(age < 0 || age >= MAXAGE)
-			resequence(b);
-	}
-	return c;
-}
-
-/*
- * ream the cache
- * calculate new buckets
- */
-Iobuf*
-cacheinit(Device *dev)
-{
-	Iobuf *cb, *p;
-	Cache *h;
-	Device *cdev;
-	Off m;
-
-	print("cache init %Z\n", dev);
-	cdev = CDEV(dev);
-	devinit(cdev);
-
-	cb = getbuf(cdev, CACHE_ADDR, Bmod|Bres);
-	memset(cb->iobuf, 0, RBUFSIZE);
-	settag(cb, Tcache, QPSUPER);
-	h = (Cache*)cb->iobuf;
-
-	/*
-	 * calculate csize such that
-	 * tsize = msize/BKPERBLK + csize and
-	 * msize = csize/CEPERBK
-	 */
-	h->maddr = CACHE_ADDR + 1;
-	m = devsize(cdev) - h->maddr;
-	h->csize = ((Devsize)(m-1) * CEPERBK*BKPERBLK) / (CEPERBK*BKPERBLK+1);
-	h->msize = h->csize/CEPERBK - 5;
-	while(!prime(h->msize))
-		h->msize--;
-	h->csize = h->msize*CEPERBK;
-	h->caddr = h->maddr + (h->msize+BKPERBLK-1)/BKPERBLK;
-	h->wsize = devsize(WDEV(dev));
-
-	if(h->msize <= 0)
-		panic("cache too small");
-	if(h->caddr + h->csize > m)
-		panic("cache size error");
-
-	/*
-	 * setup cache map
-	 */
-	for(m=h->maddr; m<h->caddr; m++) {
-		p = getbuf(cdev, m, Bmod);
-		memset(p->iobuf, 0, RBUFSIZE);
-		settag(p, Tbuck, m);
-		putbuf(p);
-	}
-	print("done cacheinit\n");
-	return cb;
-}
-
-Off
-getstartsb(Device *dev)
-{
-	Filsys *f;
-	Startsb *s;
-
-	for(f=filsys; f->name; f++)
-		if(devcmpr(f->dev, dev) == 0) {
-			for(s=startsb; s->name; s++)
-				if(strcmp(f->name, s->name) == 0)
-					return s->startsb;
-print("getstartsb: no special starting superblock for %Z %s\n", dev, f->name);
-			return FIRST;
-		}
-print("getstartsb: no filsys for device %Z\n", dev);
-	return FIRST;
-}
-
-/*
- * ream the cache
- * calculate new buckets
- * get superblock from
- * last worm dump block.
- */
-void
-cwrecover(Device *dev)
-{
-	Iobuf *p, *cb;
-	Cache *h;
-	Superb *s;
-	Off m, baddr;
-	Device *wdev;
-
-	cwinit1(dev);
-	wdev = WDEV(dev);
-
-	p = getbuf(devnone, Cwxx1, 0);
-	s = (Superb*)p->iobuf;
-	baddr = 0;
-	m = getstartsb(dev);
-	localconfinit();
-	if(conf.firstsb)
-		m = conf.firstsb;
-	for(;;) {
-		memset(p->iobuf, 0, RBUFSIZE);
-		if(devread(wdev, m, p->iobuf) ||
-		   checktag(p, Tsuper, QPSUPER))
-			break;
-		baddr = m;
-		m = s->next;
-		print("dump %lld is good; %lld next\n", (Wideoff)baddr, (Wideoff)m);
-		if(baddr == conf.recovsb)
-			break;
-	}
-	putbuf(p);
-	if(!baddr)
-		panic("recover: no superblock\n");
-
-	p = getbuf(wdev, baddr, Bread);
-	s = (Superb*)p->iobuf;
-
-	cb = cacheinit(dev);
-	h = (Cache*)cb->iobuf;
-	h->sbaddr = baddr;
-	h->cwraddr = s->cwraddr;
-	h->roraddr = s->roraddr;
-	h->fsize = s->fsize + 100;		/* this must be conservative */
-	if(conf.recovcw)
-		h->cwraddr = conf.recovcw;
-	if(conf.recovro)
-		h->roraddr = conf.recovro;
-
-	putbuf(cb);
-	putbuf(p);
-
-	p = getbuf(dev, baddr, Bread|Bmod);
-	s = (Superb*)p->iobuf;
-/* TODO: check s->magic byte order, arrange autoswabbing */
-
-	memset(&s->fbuf, 0, sizeof(s->fbuf));
-	s->fbuf.free[0] = 0;
-	s->fbuf.nfree = 1;
-	s->tfree = 0;
-	if(conf.recovcw)
-		s->cwraddr = conf.recovcw;
-	if(conf.recovro)
-		s->roraddr = conf.recovro;
-
-	putbuf(p);
-	print("done recover\n");
-}
-
-/*
- * ream the cache
- * calculate new buckets
- * initialize superblock.
- */
-void
-cwream(Device *dev)
-{
-	Iobuf *p, *cb;
-	Cache *h;
-	Superb *s;
-	Off m, baddr;
-	Device *cdev;
-
-	print("cwream %Z\n", dev);
-	cwinit1(dev);
-	cdev = CDEV(dev);
-	devinit(cdev);
-
-	baddr = FIRST;	/*	baddr   = super addr
-				baddr+1 = cw root
-				baddr+2 = ro root
-				baddr+3 = reserved next superblock */
-
-	cb = cacheinit(dev);
-	h = (Cache*)cb->iobuf;
-
-	h->sbaddr = baddr;
-	h->cwraddr = baddr+1;
-	h->roraddr = baddr+2;
-	h->fsize = 0;	/* prevents superream from freeing */
-
-	putbuf(cb);
-
-	for(m=0; m<3; m++)
-		cwio(dev, baddr+m, 0, Ogrow);
-	superream(dev, baddr);
-	rootream(dev, baddr+1);			/* cw root */
-	rootream(dev, baddr+2);			/* ro root */
-
-	cb = getbuf(cdev, CACHE_ADDR, Bread|Bmod|Bres);
-	h = (Cache*)cb->iobuf;
-	h->fsize = baddr+4;
-	putbuf(cb);
-
-	p = getbuf(dev, baddr, Bread|Bmod|Bimm);
-	s = (Superb*)p->iobuf;
-	s->last = baddr;
-	s->cwraddr = baddr+1;
-	s->roraddr = baddr+2;
-	s->next = baddr+3;
-	s->fsize = baddr+4;
-#ifdef AUTOSWAB
-	s->magic = 0x123456789abcdef0;
-#endif
-	putbuf(p);
-
-	for(m=0; m<3; m++)
-		cwio(dev, baddr+m, 0, Odump);
-}
-
-Off
-rewalk1(Cw *cw, Off addr, int slot, Wpath *up)
-{
-	Iobuf *p, *p1;
-	Dentry *d;
-
-	if(up == 0)
-		return cwraddr(cw->dev);
-	up->addr = rewalk1(cw, up->addr, up->slot, up->up);
-	p = getbuf(cw->dev, up->addr, Bread|Bmod);
-	d = getdir(p, up->slot);
-	if(!d || !(d->mode & DALLOC)) {
-		print("rewalk1 1\n");
-		if(p)
-			putbuf(p);
-		return addr;
-	}
-	p1 = dnodebuf(p, d, slot/DIRPERBUF, 0, 0);
-	if(!p1) {
-		print("rewalk1 2\n");
-		if(p)
-			putbuf(p);
-		return addr;
-	}
-	if(DEBUG)
-		print("rewalk1 %lld to %lld \"%s\"\n",
-			(Wideoff)addr, (Wideoff)p1->addr, d->name);
-	addr = p1->addr;
-	p1->flags |= Bmod;
-	putbuf(p1);
-	putbuf(p);
-	return addr;
-}
-
-Off
-rewalk2(Cw *cw, Off addr, int slot, Wpath *up)
-{
-	Iobuf *p, *p1;
-	Dentry *d;
-
-	if(up == 0)
-		return cwraddr(cw->rodev);
-	up->addr = rewalk2(cw, up->addr, up->slot, up->up);
-	p = getbuf(cw->rodev, up->addr, Bread);
-	d = getdir(p, up->slot);
-	if(!d || !(d->mode & DALLOC)) {
-		print("rewalk2 1\n");
-		if(p)
-			putbuf(p);
-		return addr;
-	}
-	p1 = dnodebuf(p, d, slot/DIRPERBUF, 0, 0);
-	if(!p1) {
-		print("rewalk2 2\n");
-		if(p)
-			putbuf(p);
-		return addr;
-	}
-	if(DEBUG)
-		print("rewalk2 %lld to %lld \"%s\"\n",
-			(Wideoff)addr, (Wideoff)p1->addr, d->name);
-	addr = p1->addr;
-	putbuf(p1);
-	putbuf(p);
-	return addr;
-}
-
-void
-rewalk(Cw *cw)
-{
-	int h;
-	File *f;
-
-	for(h=0; h<nelem(flist); h++) {
-		for(f=flist[h]; f; f=f->next) {
-			if(!f->fs)
-				continue;
-			if(cw->dev == f->fs->dev)
-				f->addr = rewalk1(cw, f->addr, f->slot, f->wpath);
-			else
-			if(cw->rodev == f->fs->dev)
-				f->addr = rewalk2(cw, f->addr, f->slot, f->wpath);
-		}
-	}
-}
-
-Off
-split(Cw *cw, Iobuf *p, Off addr)
-{
-	Off na;
-	int state;
-
-	na = 0;
-	if(p && (p->flags & Bmod)) {
-		p->flags |= Bimm;
-		putbuf(p);
-		p = 0;
-	}
-	state = cwio(cw->dev, addr, 0, Onone);	/* read the state (twice?) */
-	switch(state)
-	{
-	default:
-		panic("split: unknown state %s", cwnames[state]);
-
-	case Cerror:
-	case Cnone:
-	case Cdump:
-	case Cread:
-		break;
-
-	case Cdump1:
-	case Cwrite:
-		/*
-		 * botch.. could be done by relabeling
-		 */
-		if(!p) {
-			p = getbuf(cw->dev, addr, Bread);
-			if(!p) {
-				print("split: null getbuf\n");
-				break;
-			}
-		}
-		na = cw->fsize;
-		cw->fsize = na+1;
-		cwio(cw->dev, na, 0, Ogrow);
-		cwio(cw->dev, na, p->iobuf, Owrite);
-		cwio(cw->dev, na, 0, Odump);
-		cwio(cw->dev, addr, 0, Orele);
-		break;
-
-	case Cdirty:
-		cwio(cw->dev, addr, 0, Odump);
-		break;
-	}
-	if(p)
-		putbuf(p);
-	return na;
-}
-
-int
-isdirty(Cw *cw, Iobuf *p, Off addr, int tag)
-{
-	int s;
-
-	if(p && (p->flags & Bmod))
-		return 1;
-	s = cwio(cw->dev, addr, 0, Onone);
-	if(s == Cdirty || s == Cwrite)
-		return 1;
-	if(tag >= Tind1 && tag <= Tmaxind)
-		/* botch, get these modified */
-		if(s != Cnone)
-			return 1;
-	return 0;
-}
-
-Off
-cwrecur(Cw *cw, Off addr, int tag, int tag1, long qp)
-{
-	Iobuf *p;
-	Dentry *d;
-	int i, j, shouldstop;
-	Off na;
-	char *np;
-
-	shouldstop = 0;
-	p = getbuf(cw->dev, addr, Bprobe);
-	if(!isdirty(cw, p, addr, tag)) {
-		if(!cw->all) {
-			if(DEBUG)
-				print("cwrecur: %lld t=%s not dirty %s\n",
-					(Wideoff)addr, tagnames[tag], cw->name);
-			if(p)
-				putbuf(p);
-			return 0;
-		}
-		shouldstop = 1;
-	}
-	if(DEBUG)
-		print("cwrecur: %lld t=%s %s\n",
-			(Wideoff)addr, tagnames[tag], cw->name);
-	if(cw->depth >= 100) {
-		print("dump depth too great %s\n", cw->name);
-		if(p)
-			putbuf(p);
-		return 0;
-	}
-	cw->depth++;
-
-	switch(tag)
-	{
-	default:
-		print("cwrecur: unknown tag %d %s\n", tag, cw->name);
-
-	case Tfile:
-		break;
-
-	case Tsuper:
-	case Tdir:
-		if(!p) {
-			p = getbuf(cw->dev, addr, Bread);
-			if(!p) {
-				print("cwrecur: Tdir p null %s\n",
-					cw->name);
-				break;
-			}
-		}
-		if(tag == Tdir) {
-			cw->namepad[0] = 0;	/* force room */
-			np = strchr(cw->name, 0);
-			*np++ = '/';
-		} else {
-			np = 0;	/* set */
-			cw->name[0] = 0;
-		}
-
-		for(i=0; i<DIRPERBUF; i++) {
-			d = getdir(p, i);
-			if(!(d->mode & DALLOC))
-				continue;
-			qp = d->qid.path & ~QPDIR;
-			if(tag == Tdir)
-				strncpy(np, d->name, NAMELEN);
-			else
-			if(i > 0)
-				print("cwrecur: root with >1 directory\n");
-			tag1 = Tfile;
-			if(d->mode & DDIR)
-				tag1 = Tdir;
-			for(j=0; j<NDBLOCK; j++) {
-				na = d->dblock[j];
-				if(na) {
-					na = cwrecur(cw, na, tag1, 0, qp);
-					if(na) {
-						d->dblock[j] = na;
-						p->flags |= Bmod;
-					}
-				}
-			}
-			for (j = 0; j < NIBLOCK; j++) {
-				na = d->iblocks[j];
-				if(na) {
-					na = cwrecur(cw, na, Tind1+j, tag1, qp);
-					if(na) {
-						d->iblocks[j] = na;
-						p->flags |= Bmod;
-					}
-				}
-			}
-		}
-		break;
-
-	case Tind1:
-		j = tag1;
-		tag1 = 0;
-		goto tind;
-
-	case Tind2:
-#ifndef OLD
-	case Tind3:
-	case Tind4:
-	/* add more Tind tags here ... */
-#endif
-		j = tag-1;
-	tind:
-		if(!p) {
-			p = getbuf(cw->dev, addr, Bread);
-			if(!p) {
-				print("cwrecur: Tind p null %s\n", cw->name);
-				break;
-			}
-		}
-		for(i=0; i<INDPERBUF; i++) {
-			na = ((Off *)p->iobuf)[i];
-			if(na) {
-				na = cwrecur(cw, na, j, tag1, qp);
-				if(na) {
-					((Off *)p->iobuf)[i] = na;
-					p->flags |= Bmod;
-				}
-			}
-		}
-		break;
-	}
-	na = split(cw, p, addr);
-	cw->depth--;
-	if(na && shouldstop) {
-		if(cw->falsehits < 10)
-			print("shouldstop %lld %lld t=%s %s\n",
-				(Wideoff)addr, (Wideoff)na,
-				tagnames[tag], cw->name);
-		cw->falsehits++;
-	}
-	return na;
-}
-
-Timet	nextdump(Timet t);
-
-void
-cfsdump(Filsys *fs)
-{
-	long m, n, i;
-	Off orba, rba, oroa, roa, sba, a;
-	Timet tim;
-	char tstr[20];
-	Iobuf *pr, *p1, *p;
-	Dentry *dr, *d1, *d;
-	Cache *h;
-	Superb *s;
-	Cw *cw;
-
-	if(fs->dev->type != Devcw) {
-		print("cant dump; not cw device: %Z\n", fs->dev);
-		return;
-	}
-	cw = fs->dev->private;
-	if(cw == 0) {
-		print("cant dump: has not been inited: %Z\n", fs->dev);
-		return;
-	}
-
-	tim = toytime();
-	wlock(&mainlock);		/* dump */
-
-	/*
-	 * set up static structure
-	 * with frequent variables
-	 */
-	cw->ndump = 0;
-	cw->name[0] = 0;
-	cw->depth = 0;
-
-	/*
-	 * cw root
-	 */
-	sync("before dump");
-	cw->fsize = cwsize(cw->dev);
-	orba = cwraddr(cw->dev);
-	print("cwroot %lld", (Wideoff)orba);
-	cons.noage = 1;
-	cw->all = cw->allflag;
-	rba = cwrecur(cw, orba, Tsuper, 0, QPROOT);
-	if(rba == 0)
-		rba = orba;
-	print("->%lld\n", (Wideoff)rba);
-	sync("after cw");
-
-	/*
-	 * partial super block
-	 */
-	p = getbuf(cw->dev, cwsaddr(cw->dev), Bread|Bmod|Bimm);
-	s = (Superb*)p->iobuf;
-	s->fsize = cw->fsize;
-	s->cwraddr = rba;
-#ifdef AUTOSWAB
-	s->magic = 0x123456789abcdef0;
-#endif
-	putbuf(p);
-
-	/*
-	 * partial cache block
-	 */
-	p = getbuf(cw->cdev, CACHE_ADDR, Bread|Bmod|Bimm|Bres);
-	h = (Cache*)p->iobuf;
-	h->fsize = cw->fsize;
-	h->cwraddr = rba;
-	putbuf(p);
-
-	/*
-	 * ro root
-	 */
-	oroa = cwraddr(cw->rodev);
-	pr = getbuf(cw->dev, oroa, Bread|Bmod);
-	dr = getdir(pr, 0);
-
-	datestr(tstr, time());	/* tstr = "yyyymmdd" */
-	n = 0;
-	for(a=0;; a++) {
-		p1 = dnodebuf(pr, dr, a, Tdir, 0);
-		if(!p1)
-			goto bad;
-		n++;
-		for(i=0; i<DIRPERBUF; i++) {
-			d1 = getdir(p1, i);
-			if(!d1)
-				goto bad;
-			if(!(d1->mode & DALLOC))
-				goto found1;
-			if(!memcmp(d1->name, tstr, 4))
-				goto found2;	/* found entry */
-		}
-		putbuf(p1);
-	}
-
-	/*
-	 * no year directory, create one
-	 */
-found1:
-	p = getbuf(cw->dev, rba, Bread);
-	d = getdir(p, 0);
-	d1->qid = d->qid;
-	d1->qid.version += n;
-	memmove(d1->name, tstr, 4);
-	d1->mode = d->mode;
-	d1->uid = d->uid;
-	d1->gid = d->gid;
-	putbuf(p);
-	accessdir(p1, d1, FWRITE, 0);
-
-	/*
-	 * put mmdd[count] in year directory
-	 */
-found2:
-	accessdir(p1, d1, FREAD, 0);
-	putbuf(pr);
-	pr = p1;
-	dr = d1;
-
-	n = 0;
-	m = 0;
-	for(a=0;; a++) {
-		p1 = dnodebuf(pr, dr, a, Tdir, 0);
-		if(!p1)
-			goto bad;
-		n++;
-		for(i=0; i<DIRPERBUF; i++) {
-			d1 = getdir(p1, i);
-			if(!d1)
-				goto bad;
-			if(!(d1->mode & DALLOC))
-				goto found;
-			if(!memcmp(d1->name, tstr+4, 4))
-				m++;
-		}
-		putbuf(p1);
-	}
-
-	/*
-	 * empty slot put in root
-	 */
-found:
-	if(m)	/* how many dumps this date */
-		sprint(tstr+8, "%ld", m);
-
-	p = getbuf(cw->dev, rba, Bread);
-	d = getdir(p, 0);
-	*d1 = *d;				/* qid is QPROOT */
-	putbuf(p);
-	strcpy(d1->name, tstr+4);
-	d1->qid.version += n;
-	accessdir(p1, d1, FWRITE, 0);
-	putbuf(p1);
-	putbuf(pr);
-
-	cw->fsize = cwsize(cw->dev);
-	oroa = cwraddr(cw->rodev);		/* probably redundant */
-	print("roroot %lld", (Wideoff)oroa);
-
-	cons.noage = 0;
-	cw->all = 0;
-	roa = cwrecur(cw, oroa, Tsuper, 0, QPROOT);
-	if(roa == 0) {
-		print("[same]");
-		roa = oroa;
-	}
-	print("->%lld /%.4s/%s\n", (Wideoff)roa, tstr, tstr+4);
-	sync("after ro");
-
-	/*
-	 * final super block
-	 */
-	a = cwsaddr(cw->dev);
-	print("sblock %lld", (Wideoff)a);
-	p = getbuf(cw->dev, a, Bread|Bmod|Bimm);
-	s = (Superb*)p->iobuf;
-	s->last = a;
-	sba = s->next;
-	s->next = cw->fsize;
-	cw->fsize++;
-	s->fsize = cw->fsize;
-	s->roraddr = roa;
-#ifdef AUTOSWAB
-	s->magic = 0x123456789abcdef0;
-#endif
-
-	cwio(cw->dev, sba, 0, Ogrow);
-	cwio(cw->dev, sba, p->iobuf, Owrite);
-	cwio(cw->dev, sba, 0, Odump);
-	print("->%lld (->%lld)\n", (Wideoff)sba, (Wideoff)s->next);
-
-	putbuf(p);
-
-	/*
-	 * final cache block
-	 */
-	p = getbuf(cw->cdev, CACHE_ADDR, Bread|Bmod|Bimm|Bres);
-	h = (Cache*)p->iobuf;
-	h->fsize = cw->fsize;
-	h->roraddr = roa;
-	h->sbaddr = sba;
-	putbuf(p);
-
-	rewalk(cw);
-	sync("all done");
-
-	print("%lld blocks queued for worm\n", (Wideoff)cw->ndump);
-	print("%lld falsehits\n", (Wideoff)cw->falsehits);
-	cw->nodump = 0;
-
-	/*
-	 * extend all of the locks
-	 */
-	tim = toytime() - tim;
-	for(i=0; i<NTLOCK; i++)
-		if(tlocks[i].time > 0)
-			tlocks[i].time += tim;
-
-	wunlock(&mainlock);
-	nextdump(time());
-	return;
-
-bad:
-	panic("dump: bad");
-}
-
-void
-mvstates(Device *dev, int s1, int s2, int side)
-{
-	Iobuf *p, *cb;
-	Cache *h;
-	Bucket *b;
-	Centry *c, *ce;
-	Off m, lo, hi, msize, maddr;
-	Cw *cw;
-
-	cw = dev->private;
-	lo = 0;
-	hi = lo + devsize(dev->cw.w);	/* size of all sides totalled */
-	if(side >= 0) {
-		/* operate on only a single disc side */
-		Sidestarts ss;
-
-		wormsidestarts(dev, side, &ss);
-		lo = ss.sstart;
-		hi = ss.s1start;
-	}
-	cb = getbuf(cw->cdev, CACHE_ADDR, Bread|Bres);
-	if(!cb || checktag(cb, Tcache, QPSUPER))
-		panic("cwstats: checktag c bucket");
-	h = (Cache*)cb->iobuf;
-	msize = h->msize;
-	maddr = h->maddr;
-	putbuf(cb);
-
-	for(m=0; m<msize; m++) {
-		p = getbuf(cw->cdev, maddr + m/BKPERBLK, Bread|Bmod);
-		if(!p || checktag(p, Tbuck, maddr + m/BKPERBLK))
-			panic("cwtest: checktag c bucket");
-		b = (Bucket*)p->iobuf + m%BKPERBLK;
-		ce = b->entry + CEPERBK;
-		for(c=b->entry; c<ce; c++)
-			if(c->state == s1 && c->waddr >= lo && c->waddr < hi)
-				c->state = s2;
-		putbuf(p);
-	}
-}
-
-void
-prchain(Device *dev, Off m, int flg)
-{
-	Iobuf *p;
-	Superb *s;
-
-	if(m == 0) {
-		if(flg)
-			m = cwsaddr(dev);
-		else
-			m = getstartsb(dev);
-	}
-	p = getbuf(devnone, Cwxx2, 0);
-	s = (Superb*)p->iobuf;
-	for(;;) {
-		memset(p->iobuf, 0, RBUFSIZE);
-		if(devread(WDEV(dev), m, p->iobuf) ||
-		   checktag(p, Tsuper, QPSUPER))
-			break;
-		if(flg) {
-			print("dump %lld is good; %lld prev\n", (Wideoff)m,
-				(Wideoff)s->last);
-			print("\t%lld cwroot; %lld roroot\n", (Wideoff)s->cwraddr,
-				(Wideoff)s->roraddr);
-			if(m <= s->last)
-				break;
-			m = s->last;
-		} else {
-			print("dump %lld is good; %lld next\n", (Wideoff)m,
-				(Wideoff)s->next);
-			print("\t%lld cwroot; %lld roroot\n", (Wideoff)s->cwraddr,
-				(Wideoff)s->roraddr);
-			if(m >= s->next)
-				break;
-			m = s->next;
-		}
-	}
-	putbuf(p);
-}
-
-void
-touchsb(Device *dev)
-{
-	Iobuf *p;
-	Off m;
-
-	m = cwsaddr(dev);
-	p = getbuf(devnone, Cwxx2, 0);
-
-	memset(p->iobuf, 0, RBUFSIZE);
-	if(devread(WDEV(dev), m, p->iobuf) ||
-	   checktag(p, Tsuper, QPSUPER))
-		print("%Z block %lld WORM SUPER BLOCK READ FAILED\n",
-			WDEV(dev), (Wideoff)m);
-	else
-		print("%Z touch superblock %lld\n", WDEV(dev), (Wideoff)m);
-	putbuf(p);
-}
-
-void
-storesb(Device *dev, Off last, int doit)
-{
-	Iobuf *ph, *ps;
-	Cache *h;
-	Superb *s;
-	Off sbaddr, qidgen;
-
-	sbaddr = cwsaddr(dev);
-
-	ps = getbuf(devnone, Cwxx2, 0);
-	if(!ps) {
-		print("sbstore: getbuf\n");
-		return;
-	}
-
-	/*
-	 * try to read last sb
-	 */
-	memset(ps->iobuf, 0, RBUFSIZE);
-	if(devread(WDEV(dev), last, ps->iobuf) ||
-	   checktag(ps, Tsuper, QPSUPER))
-		print("read last failed\n");
-	else
-		print("read last succeeded\n");
-
-	s = (Superb*)ps->iobuf;
-	qidgen = s->qidgen;
-	if(qidgen == 0)
-		qidgen = 0x31415;
-	qidgen += 1000;
-	if(s->next != sbaddr)
-		print("next(last) is not sbaddr %lld %lld\n",
-			(Wideoff)s->next, (Wideoff)sbaddr);
-	else
-		print("next(last) is sbaddr\n");
-
-	/*
-	 * read cached superblock
-	 */
-	ph = getbuf(CDEV(dev), CACHE_ADDR, Bread|Bres);
-	if(!ph || checktag(ph, Tcache, QPSUPER)) {
-		print("cwstats: checktag c bucket\n");
-		if(ph)
-			putbuf(ph);
-		putbuf(ps);
-		return;
-	} else
-		print("read cached sb succeeded\n");
-
-	h = (Cache*)ph->iobuf;
-
-	memset(ps->iobuf, 0, RBUFSIZE);
-	settag(ps, Tsuper, QPSUPER);
-	ps->flags = 0;
-	s = (Superb*)ps->iobuf;
-
-	s->cwraddr = h->cwraddr;
-	s->roraddr = h->roraddr;
-	s->fsize = h->fsize;
-	s->fstart = 2;
-	s->last = last;
-	s->next = h->roraddr+1;
-
-	s->qidgen = qidgen;
-#ifdef AUTOSWAB
-	s->magic = 0x123456789abcdef0;
-#endif
-	putbuf(ph);
-
-	if(s->fsize-1 != s->next ||
-	   s->fsize-2 != s->roraddr ||
-	   s->fsize-5 != s->cwraddr) {
-		print("addrs not in relationship %lld %lld %lld %lld\n",
-			(Wideoff)s->cwraddr, (Wideoff)s->roraddr,
-			(Wideoff)s->next, (Wideoff)s->fsize);
-		putbuf(ps);
-		return;
-	} else
-		print("addresses in relation\n");
-
-	if(doit)
-	if(devwrite(WDEV(dev), sbaddr, ps->iobuf))
-		print("%Z block %lld WORM SUPER BLOCK WRITE FAILED\n",
-			WDEV(dev), (Wideoff)sbaddr);
-	ps->flags = 0;
-	putbuf(ps);
-}
-
-void
-savecache(Device *dev)
-{
-	Iobuf *p, *cb;
-	Cache *h;
-	Bucket *b;
-	Centry *c, *ce;
-	long n, left;
-	Off m, maddr, msize, *longp, nbyte;
-	Device *cdev;
-
-	if(walkto("/adm/cache") || con_open(FID2, OWRITE|OTRUNC)) {
-		print("cant open /adm/cache\n");
-		return;
-	}
-	cdev = CDEV(dev);
-	cb = getbuf(cdev, CACHE_ADDR, Bread|Bres);
-	if(!cb || checktag(cb, Tcache, QPSUPER))
-		panic("savecache: checktag c bucket");
-	h = (Cache*)cb->iobuf;
-	msize = h->msize;
-	maddr = h->maddr;
-	putbuf(cb);
-
-	n = BUFSIZE;			/* calculate write size */
-	if(n > MAXDAT)
-		n = MAXDAT;
-
-	cb = getbuf(devnone, Cwxx4, 0);
-	longp = (Off *)cb->iobuf;
-	left = n/sizeof(Off);
-	cons.offset = 0;
-
-	for(m=0; m<msize; m++) {
-		if(left < BKPERBLK) {
-			nbyte = (n/sizeof(Off) - left) * sizeof(Off);
-			con_write(FID2, cb->iobuf, cons.offset, nbyte);
-			cons.offset += nbyte;
-			longp = (Off *)cb->iobuf;
-			left = n/sizeof(Off);
-		}
-		p = getbuf(cdev, maddr + m/BKPERBLK, Bread);
-		if(!p || checktag(p, Tbuck, maddr + m/BKPERBLK))
-			panic("cwtest: checktag c bucket");
-		b = (Bucket*)p->iobuf + m%BKPERBLK;
-		ce = b->entry + CEPERBK;
-		for(c = b->entry; c < ce; c++)
-			if(c->state == Cread) {
-				*longp++ = c->waddr;
-				left--;
-			}
-		putbuf(p);
-	}
-	nbyte = (n/sizeof(Off) - left) * sizeof(Off);
-	con_write(FID2, cb->iobuf, cons.offset, nbyte);
-	putbuf(cb);
-}
-
-void
-loadcache(Device *dev, int dskno)
-{
-	Iobuf *p, *cb;
-	Off m, nbyte, *longp, count;
-	Sidestarts ss;
-
-	if(walkto("/adm/cache") || con_open(FID2, OREAD)) {
-		print("cant open /adm/cache\n");
-		return;
-	}
-
-	cb = getbuf(devnone, Cwxx4, 0);
-	cons.offset = 0;
-	count = 0;
-
-	if (dskno >= 0)
-		wormsidestarts(dev, dskno, &ss);
-	for(;;) {
-		memset(cb->iobuf, 0, BUFSIZE);
-		nbyte = con_read(FID2, cb->iobuf, cons.offset, 100) / sizeof(Off);
-		if(nbyte <= 0)
-			break;
-		cons.offset += nbyte * sizeof(Off);
-		longp = (Off *)cb->iobuf;
-		while(nbyte > 0) {
-			m = *longp++;
-			nbyte--;
-			if(m == 0)
-				continue;
-			/* if given a diskno, restrict to just that disc side */
-			if(dskno < 0 || m >= ss.sstart && m < ss.s1start) {
-				p = getbuf(dev, m, Bread);
-				if(p)
-					putbuf(p);
-				count++;
-			}
-		}
-	}
-	putbuf(cb);
-	print("%lld blocks loaded from worm %d\n", (Wideoff)count, dskno);
-}
-
-void
-morecache(Device *dev, int dskno, Off size)
-{
-	Iobuf *p;
-	Off m, ml, mh, mm, count;
-	Cache *h;
-	Sidestarts ss;
-
-	p = getbuf(CDEV(dev), CACHE_ADDR, Bread|Bres);
-	if(!p || checktag(p, Tcache, QPSUPER))
-		panic("savecache: checktag c bucket");
-	h = (Cache*)p->iobuf;
-	mm = h->wmax;
-	putbuf(p);
-
-	wormsidestarts(dev, dskno, &ss);
-	ml = ss.sstart;		/* start at beginning of disc side #dskno */
-	mh = ml + size;
-	if(mh > mm) {
-		mh = mm;
-		print("limited to %lld\n", (Wideoff)mh-ml);
-	}
-
-	count = 0;
-	for(m=ml; m < mh; m++) {
-		p = getbuf(dev, m, Bread);
-		if(p)
-			putbuf(p);
-		count++;
-	}
-	print("%lld blocks loaded from worm %d\n", (Wideoff)count, dskno);
-}
-
-void
-blockcmp(Device *dev, Off wa, Off ca)
-{
-	Iobuf *p1, *p2;
-	int i, c;
-
-	p1 = getbuf(WDEV(dev), wa, Bread);
-	if(!p1) {
-		print("blockcmp: wdev error\n");
-		return;
-	}
-
-	p2 = getbuf(CDEV(dev), ca, Bread);
-	if(!p2) {
-		print("blockcmp: cdev error\n");
-		putbuf(p1);
-		return;
-	}
-
-	c = 0;
-	for(i=0; i<RBUFSIZE; i++)
-		if(p1->iobuf[i] != p2->iobuf[i]) {
-			print("%4d: %.2x %.2x\n",
-				i,
-				p1->iobuf[i]&0xff,
-				p2->iobuf[i]&0xff);
-			c++;
-			if(c >= 10)
-				break;
-		}
-
-	if(c == 0)
-		print("no error\n");
-	putbuf(p1);
-	putbuf(p2);
-}
-
-void
-wblock(Device *dev, Off addr)
-{
-	Iobuf *p1;
-	int i;
-
-	p1 = getbuf(dev, addr, Bread);
-	if(p1) {
-		i = devwrite(WDEV(dev), addr, p1->iobuf);
-		print("i = %d\n", i);
-		putbuf(p1);
-	}
-}
-
-void
-cwtest(Device*)
-{
-}
-
-#ifdef	XXX
-/* garbage to change sb size
- * probably will need it someday
- */
-	fsz = number(0, 0, 10);
-	count = 0;
-	if(fsz == number(0, -1, 10))
-		count = -1;		/* really do it */
-	print("fsize = %ld\n", fsz);
-	cdev = CDEV(dev);
-	cb = getbuf(cdev, CACHE_ADDR, Bread|Bres);
-	if(!cb || checktag(cb, Tcache, QPSUPER))
-		panic("cwstats: checktag c bucket");
-	h = (Cache*)cb->iobuf;
-	for(m=0; m<h->msize; m++) {
-		p = getbuf(cdev, h->maddr + m/BKPERBLK, Bread|Bmod);
-		if(!p || checktag(p, Tbuck, h->maddr + m/BKPERBLK))
-			panic("cwtest: checktag c bucket");
-		b = (Bucket*)p->iobuf + m%BKPERBLK;
-		ce = b->entry + CEPERBK;
-		for(c=b->entry; c<ce; c++) {
-			if(c->waddr < fsz)
-				continue;
-			if(count < 0) {
-				c->state = Cnone;
-				continue;
-			}
-			if(c->state != Cdirty)
-				count++;
-		}
-		putbuf(p);
-	}
-	if(count < 0) {
-		print("old cache hsize = %ld\n", h->fsize);
-		h->fsize = fsz;
-		cb->flags |= Bmod;
-		p = getbuf(dev, h->sbaddr, Bread|Bmod);
-		s = (Superb*)p->iobuf;
-		print("old super hsize = %ld\n", s->fsize);
-		s->fsize = fsz;
-		putbuf(p);
-	}
-	putbuf(cb);
-	print("count = %lld\n", (Wideoff)count);
-#endif
-
-int
-convstate(char *name)
-{
-	int i;
-
-	for(i=0; i<nelem(cwnames); i++)
-		if(cwnames[i])
-			if(strcmp(cwnames[i], name) == 0)
-				return i;
-	return -1;
-}
-
-void
-searchtag(Device *d, Off a, int tag, int n)
-{
-	Iobuf *p;
-	Tag *t;
-	int i;
-
-	if(a == 0)
-		a = getstartsb(d);
-	p = getbuf(devnone, Cwxx2, 0);
-	t = (Tag*)(p->iobuf+BUFSIZE);
-	for(i=0; i<n; i++) {
-		memset(p->iobuf, 0, RBUFSIZE);
-		if(devread(WDEV(d), a+i, p->iobuf)) {
-			if(n == 1000)
-				break;
-			continue;
-		}
-		if(t->tag == tag) {
-			print("tag %d found at %Z %lld\n", tag, d, (Wideoff)a+i);
-			break;
-		}
-	}
-	putbuf(p);
-}
-
-void
-cmd_cwcmd(int argc, char *argv[])
-{
-	Device *dev;
-	char *arg;
-	char str[28];
-	Off s1, s2, a, b, n;
-	Cw *cw;
-
-	if(argc <= 1) {
-		print("	cwcmd mvstate state1 state2 [platter]\n");
-		print("	cwcmd prchain [start] [bakflg]\n");
-		print("	cwcmd searchtag [start] [tag] [blocks]\n");
-		print("	cwcmd touchsb\n");
-		print("	cwcmd savecache\n");
-		print("	cwcmd loadcache [dskno]\n");
-		print("	cwcmd morecache dskno [count]\n");
-		print("	cwcmd blockcmp wbno cbno\n");
-		print("	cwcmd startdump [01]\n");
-		print("	cwcmd acct\n");
-		print("	cwcmd clearacct\n");
-		return;
-	}
-	arg = argv[1];
-
-	/*
-	 * items not depend on a cw filesystem
-	 */
-	if(strcmp(arg, "acct") == 0) {
-		for(a=0; a<nelem(growacct); a++) {
-			b = growacct[a];
-			if(b) {
-				uidtostr(str, a, 1);
-				print("%10lld %s\n",
-					((Wideoff)b*ADDFREE*RBUFSIZE+500000)/1000000,
-					str);
-			}
-		}
-		return;
-	}
-	if(strcmp(arg, "clearacct") == 0) {
-		memset(growacct, 0, sizeof(growacct));
-		return;
-	}
-
-	/*
-	 * items depend on cw filesystem
-	 */
-	dev = cons.curfs->dev;
-	if(dev == 0 || dev->type != Devcw || dev->private == 0) {
-		print("cfs not a cw filesystem: %Z\n", dev);
-		return;
-	}
-	cw = dev->private;
-	if(strcmp(arg, "searchtag") == 0) {
-		a = 0;
-		if(argc > 2)
-			a = number(argv[2], 0, 10);
-		b = Tsuper;
-		if(argc > 3)
-			b = number(argv[3], 0, 10);
-		n = 1000;
-		if(argc > 4)
-			n = number(argv[4], 0, 10);
-		searchtag(dev, a, b, n);
-	} else if(strcmp(arg, "mvstate") == 0) {
-		if(argc < 4)
-			goto bad;
-		s1 = convstate(argv[2]);
-		s2 = convstate(argv[3]);
-		if(s1 < 0 || s2 < 0)
-			goto bad;
-		a = -1;
-		if(argc > 4)
-			a = number(argv[4], 0, 10);
-		mvstates(dev, s1, s2, a);
-		return;
-	bad:
-		print("cwcmd mvstate: bad args\n");
-	} else if(strcmp(arg, "prchain") == 0) {
-		a = 0;
-		if(argc > 2)
-			a = number(argv[2], 0, 10);
-		s1 = 0;
-		if(argc > 3)
-			s1 = number(argv[3], 0, 10);
-		prchain(dev, a, s1);
-	} else if(strcmp(arg, "touchsb") == 0)
-		touchsb(dev);
-	else if(strcmp(arg, "savecache") == 0)
-		savecache(dev);
-	else if(strcmp(arg, "loadcache") == 0) {
-		s1 = -1;
-		if(argc > 2)
-			s1 = number(argv[2], 0, 10);
-		loadcache(dev, s1);
-	} else if(strcmp(arg, "morecache") == 0) {
-		if(argc <= 2) {
-			print("arg count\n");
-			return;
-		}
-		s1 = number(argv[2], 0, 10);
-		if(argc > 3)
-			s2 = number(argv[3], 0, 10);
-		else
-			s2 = wormsizeside(dev, s1); /* default to 1 disc side */
-		morecache(dev, s1, s2);
-	} else if(strcmp(arg, "blockcmp") == 0) {
-		if(argc < 4) {
-			print("cannot arg count\n");
-			return;
-		}
-		s1 = number(argv[2], 0, 10);
-		s2 = number(argv[3], 0, 10);
-		blockcmp(dev, s1, s2);
-	} else if(strcmp(arg, "startdump") == 0) {
-		if(argc > 2)
-			cw->nodump = number(argv[2], 0, 10);
-		cw->nodump = !cw->nodump;
-		if(cw->nodump)
-			print("dump stopped\n");
-		else
-			print("dump allowed\n");
-	} else if(strcmp(arg, "allflag") == 0) {
-		if(argc > 2)
-			cw->allflag = number(argv[2], 0, 10);
-		else
-			cw->allflag = !cw->allflag;
-		print("allflag = %d; falsehits = %lld\n",
-			cw->allflag, (Wideoff)cw->falsehits);
-	} else if(strcmp(arg, "storesb") == 0) {
-		a = 4168344;
-		b = 0;
-		if(argc > 2)
-			a = number(argv[2], 4168344, 10);
-		if(argc > 3)
-			b = number(argv[3], 0, 10);
-		storesb(dev, a, b);
-	} else if(strcmp(arg, "test") == 0)
-		cwtest(dev);
-	else
-		print("unknown cwcmd %s\n", arg);
-}

+ 0 - 106
sys/src/fs/dev/fworm.c

@@ -1,106 +0,0 @@
-#include	"all.h"
-
-#define	DEBUG		0
-#define	FDEV(d)		(d->fw.fw)
-
-Devsize
-fwormsize(Device *d)
-{
-	Device *fdev;
-	Devsize l;
-
-	fdev = FDEV(d);
-	l = devsize(fdev);
-	l -= l/(BUFSIZE*8) + 1;
-	return l;
-}
-
-void
-fwormream(Device *d)
-{
-	Iobuf *p;
-	Device *fdev;
-	Off a, b;
-
-	print("fworm ream\n");
-	devinit(d);
-	fdev = FDEV(d);
-	a = fwormsize(d);
-	b = devsize(fdev);
-	print("	fwsize = %lld\n", (Wideoff)a);
-	print("	bwsize = %lld\n", (Wideoff)b-a);
-	for(; a < b; a++) {
-		p = getbuf(fdev, a, Bmod|Bres);
-		if(!p)
-			panic("fworm: init");
-		memset(p->iobuf, 0, RBUFSIZE);
-		settag(p, Tvirgo, a);
-		putbuf(p);
-	}
-}
-
-void
-fworminit(Device *d)
-{
-	print("fworm init\n");
-	devinit(FDEV(d));
-}
-
-int
-fwormread(Device *d, Off b, void *c)
-{
-	Iobuf *p;
-	Device *fdev;
-	Devsize l;
-
-	if(DEBUG)
-		print("fworm read  %lld\n", (Wideoff)b);
-	fdev = FDEV(d);
-	l = devsize(fdev);
-	l -= l/(BUFSIZE*8) + 1;
-	if(b >= l)
-		panic("fworm: rbounds %lld\n", (Wideoff)b);
-	l += b/(BUFSIZE*8);
-
-	p = getbuf(fdev, l, Bread|Bres);
-	if(!p || checktag(p, Tvirgo, l))
-		panic("fworm: checktag %lld\n", (Wideoff)l);
-	l = b % (BUFSIZE*8);
-	if(!(p->iobuf[l/8] & (1<<(l%8)))) {
-		putbuf(p);
-		print("fworm: read %lld\n", (Wideoff)b);
-		return 1;
-	}
-	putbuf(p);
-	return devread(fdev, b, c);
-}
-
-int
-fwormwrite(Device *d, Off b, void *c)
-{
-	Iobuf *p;
-	Device *fdev;
-	Devsize l;
-
-	if(DEBUG)
-		print("fworm write %lld\n", (Wideoff)b);
-	fdev = FDEV(d);
-	l = devsize(fdev);
-	l -= l/(BUFSIZE*8) + 1;
-	if(b >= l)
-		panic("fworm: wbounds %lld\n", (Wideoff)b);
-	l += b/(BUFSIZE*8);
-
-	p = getbuf(fdev, l, Bread|Bmod|Bres);
-	if(!p || checktag(p, Tvirgo, l))
-		panic("fworm: checktag %lld", (Wideoff)l);
-	l = b % (BUFSIZE*8);
-	if((p->iobuf[l/8] & (1<<(l%8)))) {
-		putbuf(p);
-		print("fworm: write %lld\n", (Wideoff)b);
-		return 1;
-	}
-	p->iobuf[l/8] |= 1<<(l%8);
-	putbuf(p);
-	return devwrite(fdev, b, c);
-}

+ 0 - 1153
sys/src/fs/dev/juke.c

@@ -1,1153 +0,0 @@
-#include	"all.h"
-
-#define	SCSInone	SCSIread
-#define	MAXDRIVE	10
-#define	MAXSIDE		500
-
-#define	TWORM		MINUTE(10)
-#define	THYSTER		SECOND(10)
-
-typedef	struct	Side	Side;
-struct	Side
-{
-	QLock;			/* protects loading/unloading */
-	int	elem;		/* element number */
-	int	drive;		/* if loaded, where */
-	uchar	status;		/* Sunload, etc */
-	uchar	rot;		/* if backside */
-	int	ord;		/* ordinal number for labeling */
-
-	Timet	time;		/* time since last access, to unspin */
-	Timet	stime;		/* time since last spinup, for hysteresis */
-	long	nblock;		/* number of native blocks */
-	long	block;		/* bytes per native block */
-	long	mult;		/* multiplier to get plan9 blocks */
-	long	max;		/* max size in plan9 blocks */
-};
-
-typedef	struct	Juke	Juke;
-struct	Juke
-{
-	QLock;				/* protects drive mechanism */
-	Side	side[MAXSIDE];
-	int	nside;			/* how many storage elements (*2 if rev) */
-	int	ndrive;			/* number of transfer elements */
-	Device*	juke;			/* devworm of changer */
-	Device*	drive[MAXDRIVE];	/* devworm for i/o */
-	uchar	offline[MAXDRIVE];	/* drives removed from service */
-	long	fixedsize;		/* one size fits all */
-	int	probeok;		/* wait for init to probe */
-
-	/*
-	 * geometry returned by mode sense.
-	 * a *0 number (such as mt0) is the `element number' of the
-	 * first element of that type (e.g., mt, or motor transport).
-	 * an n* number is the quantity of them.
-	 */
-	int	mt0,	nmt;	/* motor transports (robot pickers) */
-	int	se0,	nse;	/* storage elements (discs, slots) */
-	int	ie0,	nie;	/* interchange elements (mailbox slots) */
-	int	dt0,	ndt;	/* drives (data transfer?) */
-	int	rot;		/* if true, discs are double-sided */
-
-	Juke*	link;
-};
-static	Juke*	jukelist;
-
-enum
-{
-	Sempty = 0,	/* does not exist */
-	Sunload,	/* on the shelf */
-	Sstart,		/* loaded and spinning */
-};
-
-extern int FIXEDSIZE;
-
-static	int	wormsense(Device*);
-static	Side*	wormunit(Device*);
-static	void	shelves(void);
-static	int	mmove(Juke*, int, int, int, int);
-static	int	bestdrive(Juke*, int);
-static	void	waitready(Device*);
-static	void	element(Juke*, int);
-
-/*
- * mounts and spins up the device
- *	locks the structure
- */
-static
-Side*
-wormunit(Device *d)
-{
-	int p, s, drive;
-	Side *v;
-	Juke *w;
-	uchar cmd[10], buf[8];
-
-	w = d->private;
-	p = d->wren.targ;
-	if(p < 0 || p >= w->nside) {
-//		panic("wormunit partition %Z\n", d);
-		return 0;
-	}
-
-	/*
-	 * if disk is unloaded, must load it
-	 * into next (circular) logical unit
-	 */
-	v = &w->side[p];
-	qlock(v);
-	if(v->status == Sunload) {
-		for(;;) {
-			qlock(w);
-			drive = bestdrive(w, p);
-			if(drive >= 0)
-				break;
-			qunlock(w);
-			waitsec(100);
-		}
-		print("	load   r%ld drive %Z\n", v-w->side, w->drive[drive]);
-		if(mmove(w, w->mt0, v->elem, w->dt0+drive, v->rot)) {
-			qunlock(w);
-			goto sbad;
-		}
-		v->drive = drive;
-		v->status = Sstart;
-		v->stime = toytime();
-		qunlock(w);
-		waitready(w->drive[drive]);
-		v->stime = toytime();
-	}
-	if(v->status != Sstart) {
-		if(v->status == Sempty)
-			print("worm: unit empty %Z\n", d);
-		else
-			print("worm: not started %Z\n", d);
-		goto sbad;
-	}
-
-	v->time = toytime();
-	if(v->block)
-		return v;
-
-	/*
-	 * capacity command
-	 */
-	memset(cmd, 0, sizeof(cmd));
-	memset(buf, 0, sizeof(buf));
-	cmd[0] = 0x25;	/* read capacity */
-	s = scsiio(w->drive[v->drive], SCSIread,
-		cmd, sizeof(cmd), buf, sizeof(buf));
-	if(s)
-		goto sbad;
-
-	v->nblock =
-		(buf[0]<<24) |
-		(buf[1]<<16) |
-		(buf[2]<<8) |
-		(buf[3]<<0);
-	v->block =
-		(buf[4]<<24) |
-		(buf[5]<<16) |
-		(buf[6]<<8) |
-		(buf[7]<<0);
-	v->mult =
-		(RBUFSIZE + v->block - 1) /
-		v->block;
-	v->max =
-		(v->nblock + 1) / v->mult;
-
-	print("	worm %Z: drive %Z\n", d, w->drive[v->drive]);
-	print("		%ld blocks at %ld bytes each\n",
-		v->nblock, v->block);
-	print("		%ld logical blocks at %d bytes each\n",
-		v->max, RBUFSIZE);
-	print("		%ld multiplier\n",
-		v->mult);
-	if(d->type != Devlworm)
-		return v;
-	/* check for label */
-	print("label %Z ordinal %d\n", d, v->ord);
-	qunlock(v);
-	return wormunit(d);
-
-sbad:
-	qunlock(v);
-//	panic("wormunit sbad");
-	return 0;
-}
-
-static
-void
-waitready(Device *d)
-{
-	uchar cmd[6];
-	int s, e;
-
-	for(e=0;e<100;e++) {
-		memset(cmd, 0, sizeof(cmd));
-		s = scsiio(d, SCSInone, cmd, sizeof(cmd), cmd, 0);
-		if(s == 0)
-			break;
-		waitsec(100);
-	}
-}
-
-static
-int
-bestdrive(Juke *w, int side)
-{
-	Side *v, *bv[MAXDRIVE];
-	int i, s, e, drive;
-	Timet t, t0;
-
-loop:
-	/* build table of what platters on what drives */
-	for(i=0; i<w->ndt; i++)
-		bv[i] = 0;
-
-	v = &w->side[0];
-	for(i=0; i<w->nside; i++, v++) {
-		s = v->status;
-		if(s == Sstart) {
-			drive = v->drive;
-			if(drive >= 0 && drive < w->ndt)
-				bv[drive] = v;
-		}
-	}
-
-	/*
-	 * find oldest drive, but must be
-	 * at least THYSTER old.
-	 */
-	e = w->side[side].elem;
-	t0 = toytime() - THYSTER;
-	t = t0;
-	drive = -1;
-	for(i=0; i<w->ndt; i++) {
-		v = bv[i];
-		if(v == 0) {		/* 2nd priority: empty drive */
-			if(w->offline[i])
-				continue;
-			if(w->drive[i] != devnone) {
-				drive = i;
-				t = 0;
-			}
-			continue;
-		}
-		if(v->elem == e) {	/* 1st priority: other side */
-			drive = -1;
-			if(v->stime < t0)
-				drive = i;
-			break;
-		}
-		if(v->stime < t) {	/* 3rd priority: by time */
-			drive = i;
-			t = v->stime;
-		}
-	}
-
-	if(drive >= 0) {
-		v = bv[drive];
-		if(v) {
-			qlock(v);
-			if(v->status != Sstart) {
-				qunlock(v);
-				goto loop;
-			}
-			print("	unload r%ld drive %Z\n",
-				v-w->side, w->drive[drive]);
-			if(mmove(w, w->mt0, w->dt0+drive, v->elem, v->rot)) {
-				qunlock(v);
-				goto loop;
-			}
-			v->status = Sunload;
-			qunlock(v);
-		}
-	}
-	return drive;
-}
-
-Devsize
-wormsize(Device *d)
-{
-	Side *v;
-	Juke *w;
-	Devsize size;
-
-	w = d->private;
-	if(w->fixedsize)
-		size = w->fixedsize;
-	else {
-		v = wormunit(d);
-		if(v == 0)
-			return 0;
-		size = v->max;
-		qunlock(v);
-		if(FIXEDSIZE) // TODO? push FIXEDSIZE into Device or Juke struct
-			w->fixedsize = size;
-	}
-	if(d->type == Devlworm)
-		return size-1;
-	return size;
-}
-
-/*
- * return a Devjuke or an mcat (normally of sides) from within d (or nil).
- * if it's an mcat, the caller must walk it.
- */
-static Device *
-devtojuke(Device *d, Device *top)
-{
-	while (d != nil)
-		switch(d->type) {
-		default:
-			print("devtojuke: type of device %Z of %Z unknown\n",
-				d, top);
-			return nil;
-
-		case Devjuke:
-			/* jackpot!  d->private is a (Juke *) with nside, &c. */
-			/* FALL THROUGH */
-		case Devmcat:
-		case Devmlev:
-		case Devmirr:
-			/* squint hard & call an mlev or a mirr an mcat */
-			return d;
-
-		case Devworm:
-		case Devlworm:
-			/*
-			 * d->private is a (Juke *) with nside, etc.,
-			 * but we're not supposed to get here.
-			 */
-			print("devtojuke: (l)worm %Z of %Z encountered\n",
-				d, top);
-			/* FALL THROUGH */
-		case Devwren:
-		case Devide:
-		case Devmarvsata:
-			return nil;
-
-		case Devcw:
-			d = d->cw.w;			/* usually juke */
-			break;
-		case Devro:
-			d = d->ro.parent;		/* cw */
-			break;
-		case Devfworm:
-			d = d->fw.fw;
-			break;
-		case Devpart:
-			d = d->part.d;
-			break;
-		case Devswab:
-			d = d->swab.d;
-			break;
-		}
-	return d;
-}
-
-static int
-devisside(Device *d)
-{
-	return d->type == Devworm || d->type == Devlworm;
-}
-
-static Device *
-findside(Device *juke, int side, Device *top)
-{
-	int i = 0;
-	Device *mcat = juke->j.m, *x;
-	Juke *w = juke->private;
-
-	for (x = mcat->cat.first; x != nil; x = x->link) {
-		if (!devisside(x)) {
-			print("wormsizeside: %Z of %Z of %Z type not (l)worm\n",
-				x, mcat, top);
-			return nil;
-		}
-		i = x->wren.targ;
-		if (i < 0 || i >= w->nside)
-			panic("wormsizeside: side %d in %Z out of range",
-				i, mcat);
-		if (i == side)
-			break;
-	}
-	if (x == nil)
-		return nil;
-	if (w->side[i].time == 0) {
-		print("wormsizeside: side %d not in jukebox %Z\n", i, juke);
-		return nil;
-	}
-	return x;
-}
-
-typedef struct {
-	int	sleft;		/* sides still to visit to reach desired side */
-	int	starget;	/* side of topdev we want */
-	Device	*topdev;
-	int	sawjuke;	/* passed by a jukebox */
-	int	sized;		/* flag: asked wormsize for size of starget */
-} Visit;
-
-/*
- * walk the Device tree from d looking for Devjukes, counting sides.
- * the main complication is mcats and the like with Devjukes in them.
- * use Devjuke's d->private as Juke* and see sides.
- */
-static Off
-visitsides(Device *d, Device *parentj, Visit *vp)
-{
-	Off size = 0;
-	Device *x;
-	Juke *w;
-
-	/*
-	 * find the first juke or mcat.
-	 * d==nil means we couldn't find one; typically harmless, due to a
-	 * mirror of dissimilar devices.
-	 */
-	d = devtojuke(d, vp->topdev);
-	if (d == nil || vp->sleft < 0)
-		return 0;
-	if (d->type == Devjuke) {    /* jackpot!  d->private is a (Juke *) */
-		vp->sawjuke = 1;
-		w = d->private;
-		/*
-		 * if there aren't enough sides in this jukebox to reach
-		 * the desired one, subtract these sides and pass.
-		 */
-		if (vp->sleft >= w->nside) {
-			vp->sleft -= w->nside;
-			return 0;
-		}
-		/* else this is the right juke, paw through mcat of sides */
-		return visitsides(d->j.m, d, vp);
-	}
-
-	/*
-	 * d will usually be an mcat of sides, but it could be an mcat of
-	 * jukes, for example.  in that case, we need to walk the mcat,
-	 * recursing as needed, until we find the right juke, then stop at
-	 * the right side within its mcat of sides, by comparing side
-	 * numbers, not just by counting (to allow for unused slots).
-	 */
-	x = d->cat.first;
-	if (x == nil) {
-		print("visitsides: %Z of %Z: empty mcat\n", d, vp->topdev);
-		return 0;
-	}
-	if (!devisside(x)) {
-		for (; x != nil && !vp->sized; x = x->link)
-			size = visitsides(x, parentj, vp);
-		return size;
-	}
-
-	/* the side we want is in this jukebox, thus this mcat (d) */
-	if (parentj == nil) {
-		print("visitsides: no parent juke for sides mcat %Z\n", d);
-		vp->sleft = -1;
-		return 0;
-	}
-	if (d != parentj->j.m)
-		panic("visitsides: mcat mismatch %Z vs %Z", d, parentj->j.m);
-	x = findside(parentj, vp->sleft, vp->topdev);
-	if (x == nil) {
-		vp->sleft = -1;
-		return 0;
-	}
-
-	/* we've turned vp->starget into the right Device* */
-	vp->sleft = 0;
-	vp->sized = 1;
-	return wormsize(x);
-}
-
-/*
- * d must be, or be within, a filesystem config that also contains
- * the jukebox that `side' resides on.
- * d is normally a Devcw, but could be Devwren, Devide, Devpart, Devfworm,
- * etc. if called from chk.c Ctouch code.  Note too that the worm part of
- * the Devcw might be other than a Devjuke.
- */
-Devsize
-wormsizeside(Device *d, int side)
-{
-	Devsize size;
-	Visit visit;
-
-	memset(&visit, 0, sizeof visit);
-	visit.starget = visit.sleft = side;
-	visit.topdev = d;
-	size = visitsides(d, nil, &visit);
-	if (visit.sawjuke && (visit.sleft != 0 || !visit.sized)) {
-		print("wormsizeside: fewer than %d sides in %Z\n", side, d);
-		return 0;
-	}
-	return size;
-}
-
-/*
- * returns starts (in blocks) of side #side and #(side+1) of dev in *stp.
- * dev should be a Devcw.
- */
-void
-wormsidestarts(Device *dev, int side, Sidestarts *stp)
-{
-	int s;
-	Devsize dstart;
-
-	for (dstart = s = 0; s < side; s++)
-		dstart += wormsizeside(dev, s);
-	stp->sstart = dstart;
-	stp->s1start = dstart + wormsizeside(dev, side);
-}
-
-static
-int
-wormiocmd(Device *d, int io, Off b, void *c)
-{
-	Side *v;
-	Juke *w;
-	Off l;
-	int s;
-	long m;
-	uchar cmd[10];
-
-	w = d->private;
-	v = wormunit(d);
-	if(v == 0)
-		return 0x71;
-	if(b >= v->max) {
-		qunlock(v);
-		print("worm: wormiocmd out of range %Z(%lld)\n", d, (Wideoff)b);
-		return 0x071;
-	}
-
-	memset(cmd, 0, sizeof(cmd));
-	cmd[0] = 0x28;		/* extended read */
-	if(io != SCSIread)
-		cmd[0] = 0x2a;	/* extended write */
-
-	m = v->mult;
-	l = b * m;
-	cmd[2] = l>>24;
-	cmd[3] = l>>16;
-	cmd[4] = l>>8;
-	cmd[5] = l;
-
-	cmd[7] = m>>8;
-	cmd[8] = m;
-
-	s = scsiio(w->drive[v->drive], io, cmd, sizeof(cmd), c, RBUFSIZE);
-	qunlock(v);
-	return s;
-}
-
-int
-wormread(Device *d, Off b, void *c)
-{
-	int s;
-
-	s = wormiocmd(d, SCSIread, b, c);
-	if(s) {
-		print("wormread: %Z(%lld) bad status #%x\n", d, (Wideoff)b, s);
-		cons.nwormre++;
-		return s;
-	}
-	return 0;
-}
-
-int
-wormwrite(Device *d, Off b, void *c)
-{
-	int s;
-
-	s = wormiocmd(d, SCSIwrite, b, c);
-	if(s) {
-		print("wormwrite: %Z(%lld) bad status #%x\n", d, (Wideoff)b, s);
-		cons.nwormwe++;
-		return s;
-	}
-	return 0;
-}
-
-static
-int
-mmove(Juke *w, int trans, int from, int to, int rot)
-{
-	uchar cmd[12], buf[4];
-	int s;
-	static recur = 0;
-
-	memset(cmd, 0, sizeof(cmd));
-	cmd[0] = 0xa5;	/* move medium */
-	cmd[2] = trans>>8;
-	cmd[3] = trans;
-	cmd[4] = from>>8;
-	cmd[5] = from;
-	cmd[6] = to>>8;
-	cmd[7] = to;
-	if(rot)
-		cmd[10] = 1;
-	s = scsiio(w->juke, SCSInone, cmd, sizeof(cmd), buf, 0);
-	if(s) {
-		print("scsio status #%x\n", s);
-		print("move medium t=%d fr=%d to=%d rot=%d\n",
-			trans, from, to, rot);
-//		panic("mmove");
-		if(recur == 0) {
-			recur = 1;
-			print("element from=%d\n", from);
-			element(w, from);
-			print("element to=%d\n", to);
-			element(w, to);
-			print("element trans=%d\n", trans);
-			element(w, trans);
-			recur = 0;
-		}
-		return 1;
-	}
-	return 0;
-}
-
-static
-void
-geometry(Juke *w)
-{
-	int s;
-	uchar cmd[6], buf[4+20];
-
-	memset(cmd, 0, sizeof(cmd));
-	memset(buf, 0, sizeof(buf));
-	cmd[0] = 0x1a;		/* mode sense */
-	cmd[2] = 0x1d;		/* element address assignment */
-	cmd[4] = sizeof(buf);	/* allocation length */
-
-	s = scsiio(w->juke, SCSIread, cmd, sizeof(cmd), buf, sizeof(buf));
-	if(s)
-		panic("geometry #%x\n", s);
-
-	w->mt0 = (buf[4+2]<<8) | buf[4+3];
-	w->nmt = (buf[4+4]<<8) | buf[4+5];
-	w->se0 = (buf[4+6]<<8) | buf[4+7];
-	w->nse = (buf[4+8]<<8) | buf[4+9];
-	w->ie0 = (buf[4+10]<<8) | buf[4+11];
-	w->nie = (buf[4+12]<<8) | buf[4+13];
-	w->dt0 = (buf[4+14]<<8) | buf[4+15];
-	w->ndt = (buf[4+16]<<8) | buf[4+17];
-
-	memset(cmd, 0, 6);
-	memset(buf, 0, sizeof(buf));
-	cmd[0] = 0x1a;		/* mode sense */
-	cmd[2] = 0x1e;		/* transport geometry */
-	cmd[4] = sizeof(buf);	/* allocation length */
-
-	s = scsiio(w->juke, SCSIread, cmd, sizeof(cmd), buf, sizeof(buf));
-	if(s)
-		panic("geometry #%x\n", s);
-
-	w->rot = buf[4+2] & 1;
-
-	print("	mt %d %d\n", w->mt0, w->nmt);
-	print("	se %d %d\n", w->se0, w->nse);
-	print("	ie %d %d\n", w->ie0, w->nie);
-	print("	dt %d %d\n", w->dt0, w->ndt);
-	print("	rot %d\n", w->rot);
-	prflush();
-
-}
-
-static
-void
-element(Juke *w, int e)
-{
-	uchar cmd[12], buf[8+8+88];
-	int s, t;
-
-	memset(cmd, 0, sizeof(cmd));
-	memset(buf, 0, sizeof(buf));
-	cmd[0] = 0xb8;		/* read element status */
-	cmd[2] = e>>8;		/* starting element */
-	cmd[3] = e;
-	cmd[5] = 1;		/* number of elements */
-	cmd[9] = sizeof(buf);	/* allocation length */
-
-	s = scsiio(w->juke, SCSIread, cmd, sizeof(cmd), buf, sizeof(buf));
-	if(s) {
-		print("scsiio #%x\n", s);
-		goto bad;
-	}
-
-	s = (buf[0]<<8) | buf[1];
-	if(s != e) {
-		print("element = %d\n", s);
-		goto bad;
-	}
-	if(buf[3] != 1) {
-		print("number reported = %d\n", buf[3]);
-		goto bad;
-	}
-	s = (buf[8+8+0]<<8) | buf[8+8+1];
-	if(s != e) {
-		print("element1 = %d\n", s);
-		goto bad;
-	}
-
-	switch(buf[8+0]) {	/* element type */
-	default:
-		print("unknown element %d: %d\n", e, buf[8+0]);
-		goto bad;
-	case 1:			/* transport */
-		s = e - w->mt0;
-		if(s < 0 || s >= w->nmt)
-			goto bad;
-		if(buf[8+8+2] & 1)
-			print("transport %d full %d.%d\n", s,
-				(buf[8+8+10]<<8) | buf[8+8+11],
-				(buf[8+8+9]>>6) & 1);
-		break;
-	case 2:			/* storage */
-		s = e - w->se0;
-		if(s < 0 || s >= w->nse)
-			goto bad;
-		w->side[s].status = Sempty;
-		if(buf[8+8+2] & 1)
-			w->side[s].status = Sunload;
-		if(w->rot)
-			w->side[w->nse+s].status = w->side[s].status;
-		break;
-	case 3:			/* import/export */
-		s = e - w->ie0;
-		if(s < 0 || s >= w->nie)
-			goto bad;
-		print("import/export %d #%.2x %d.%d\n", s,
-			buf[8+8+2],
-			(buf[8+8+10]<<8) | buf[8+8+11],
-			(buf[8+8+9]>>6) & 1);
-		break;
-	case 4:			/* data transfer */
-		s = e - w->dt0;
-		if(s < 0 || s >= w->ndt)
-			goto bad;
-		print("data transfer %d #%.2x %d.%d\n", s,
-			buf[8+8+2],
-			(buf[8+8+10]<<8) | buf[8+8+11],
-			(buf[8+8+9]>>6) & 1);
-		if(buf[8+8+2] & 1) {
-			t = ((buf[8+8+10]<<8) | buf[8+8+11]) - w->se0;
-			if (t < 0 || t >= w->nse || t >= MAXSIDE ||
-			    s >= MAXDRIVE) {
-				print(
-		"element: juke %Z lies; claims side %d is in drive %d\n",
-					w->juke, t, s);	/* lying sack of ... */
-				/*
-				 * at minimum, we've avoided corrupting our
-				 * data structures.  if we know that numbers
-				 * like w->nside are valid here, we could use
-				 * them in more stringent tests.
-				 * perhaps should whack the jukebox upside the
-				 * head here to knock some sense into it.
-				 */
-				goto bad;
-			}
-			print("r%d in drive %d\n", t, s);
-			if(mmove(w, w->mt0, w->dt0+s, w->se0+t, (buf[8+8+9]>>6) & 1)) {
-				print("mmove initial unload\n");
-				goto bad;
-			}
-			w->side[t].status = Sunload;
-			if(w->rot)
-				w->side[w->nse+t].status = Sunload;
-		}
-		if(buf[8+8+2] & 4) {
-			print("drive w%d has exception #%.2x #%.2x\n", s,
-				buf[8+8+4], buf[8+8+5]);
-			goto bad;
-		}
-		break;
-	}
-	return;
-bad:
-	/* panic("element") */ ;
-}
-
-static
-void
-positions(Juke *w)
-{
-	int i, f;
-
-	/* mark empty shelves */
-	for(i=0; i<w->nse; i++)
-		element(w, w->se0+i);
-	for(i=0; i<w->nmt; i++)
-		element(w, w->mt0+i);
-	for(i=0; i<w->nie; i++)
-		element(w, w->ie0+i);
-	for(i=0; i<w->ndt; i++)
-		element(w, w->dt0+i);
-
-	f = 0;
-	for(i=0; i<w->nse; i++) {
-		if(w->side[i].status == Sempty) {
-			if(f) {
-				print("r%d\n", i-1);
-				f = 0;
-			}
-		} else {
-			if(!f) {
-				print("	shelves r%d-", i);
-				f = 1;
-			}
-		}
-	}
-	if(f)
-		print("r%d\n", i-1);
-}
-
-static
-void
-jinit(Juke *w, Device *d, int o)
-{
-	int p;
-	Device *dev = d;
-
-	switch(d->type) {
-	default:
-		print("juke platter not (devmcat of) dev(l)worm: %Z\n", d);
-		panic("jinit: type");
-
-	case Devmcat:
-		/*
-		 * we don't call mcatinit(d) here, so we have to set d->cat.ndev
-		 * ourselves.
-		 */
-		for(d=d->cat.first; d; d=d->link)
-			jinit(w, d, o++);
-		dev->cat.ndev = o;
-		break;
-
-	case Devlworm:
-		p = d->wren.targ;
-		if(p < 0 || p >= w->nside)
-			panic("jinit partition %Z\n", d);
-		w->side[p].ord = o;
-		/* FALL THROUGH */
-	case Devworm:
-		if(d->private) {
-			print("juke platter private pointer set %p\n",
-				d->private);
-			panic("jinit: private");
-		}
-		d->private = w;
-		break;
-	}
-}
-
-Side*
-wormi(char *arg)
-{
-	int i, j;
-	Juke *w;
-	Side *v;
-
-	i = number(arg, -1, 10) - 1;
-	w = jukelist;
-	if(i < 0 || i >= w->nside) {
-		print("bad unit number %s (%d)\n", arg, i+1);
-		return 0;
-	}
-	j = i;
-	if(j >= w->nse)
-		j -= w->nse;
-	if(j < w->nside) {
-		v = &w->side[j];
-		qlock(v);
-		if(v->status == Sstart) {
-			if(mmove(w, w->mt0, w->dt0+v->drive, v->elem, v->rot)) {
-				qunlock(v);
-				return 0;
-			}
-			v->status = Sunload;
-		}
-		qunlock(v);
-	}
-	j += w->nse;
-	if(j < w->nside) {
-		v = &w->side[j];
-		qlock(v);
-		if(v->status == Sstart) {
-			if(mmove(w, w->mt0, w->dt0+v->drive, v->elem, v->rot)) {
-				qunlock(v);
-				return 0;
-			}
-			v->status = Sunload;
-		}
-		qunlock(v);
-	}
-	v = &w->side[i];
-	qlock(v);
-	return v;
-}
-
-static
-void
-cmd_wormoffline(int argc, char *argv[])
-{
-	int u, i;
-	Juke *w;
-
-	if(argc <= 1) {
-		print("usage: wormoffline drive\n");
-		return;
-	}
-	u = number(argv[1], -1, 10);
-	w = jukelist;
-	if(u < 0 || u >= w->ndrive) {
-		print("bad drive %s (0<=%d<%d)\n", argv[1], u, w->ndrive);
-		return;
-	}
-	if(w->offline[u])
-		print("drive %d already offline\n", u);
-	w->offline[u] = 1;
-	for(i=0; i<w->ndrive; i++)
-		if(w->offline[i] == 0)
-			return;
-	print("that would take all drives offline\n");
-	w->offline[u] = 0;
-}
-
-static
-void
-cmd_wormonline(int argc, char *argv[])
-{
-	int u;
-	Juke *w;
-
-	if(argc <= 1) {
-		print("usage: wormonline drive\n");
-		return;
-	}
-	u = number(argv[1], -1, 10);
-	w = jukelist;
-	if(u < 0 || u >= w->ndrive) {
-		print("bad drive %s (0<=%d<%d)\n", argv[1], u, w->ndrive);
-		return;
-	}
-	if(w->offline[u] == 0)
-		print("drive %d already online\n", u);
-	w->offline[u] = 0;
-}
-
-static
-void
-cmd_wormreset(int, char *[])
-{
-	Juke *w;
-
-	for(w=jukelist; w; w=w->link) {
-		qlock(w);
-		positions(w);
-		qunlock(w);
-	}
-}
-
-static
-void
-cmd_wormeject(int argc, char *argv[])
-{
-	Juke *w;
-	Side *v;
-
-	if(argc <= 1) {
-		print("usage: wormeject unit\n");
-		return;
-	}
-	v = wormi(argv[1]);
-	if(v == 0)
-		return;
-	w = jukelist;
-	mmove(w, w->mt0, v->elem, w->ie0, 0);
-	qunlock(v);
-}
-
-static
-void
-cmd_wormingest(int argc, char *argv[])
-{
-	Juke *w;
-	Side *v;
-
-	if(argc <= 1) {
-		print("usage: wormingest unit\n");
-		return;
-	}
-	v = wormi(argv[1]);
-	if(v == 0)
-		return;
-	w = jukelist;
-	mmove(w, w->mt0, w->ie0, v->elem, 0);
-	qunlock(v);
-}
-
-void
-jukeinit(Device *d)
-{
-	Juke *w;
-	Device *xdev;
-	Side *v;
-	int i;
-
-	/* j(w<changer>w<station0>...)(r<platters>) */
-	xdev = d->j.j;
-	if(xdev->type != Devmcat) {
-		print("juke union not mcat\n");
-		goto bad;
-	}
-
-	/*
-	 * pick up the changer device
-	 */
-	xdev = xdev->cat.first;
-	if(xdev->type != Devwren) {
-		print("juke changer not wren %Z\n", xdev);
-		goto bad;
-	}
-	for(w=jukelist; w; w=w->link)
-		if(xdev == w->juke)
-			goto found;
-
-	/*
-	 * allocate a juke structure
-	 * no locking problems.
-	 */
-	w = ialloc(sizeof(Juke), 0);
-	w->link = jukelist;
-	jukelist = w;
-
-	print("alloc juke %Z\n", xdev);
-	qlock(w);
-	qunlock(w);
-	w->name = "juke";
-	w->juke = xdev;
-	geometry(w);
-
-	/*
-	 * pick up each side
-	 */
-	w->nside = w->nse;
-	if(w->rot)
-		w->nside += w->nside;
-	if(w->nside > MAXSIDE) {
-		print("too many sides: %d max %d\n", w->nside, MAXSIDE);
-		goto bad;
-	}
-	for(i=0; i<w->nse; i++) {
-		v = &w->side[i];
-		qlock(v);
-		qunlock(v);
-		v->name = "shelf";
-		v->elem = w->se0 + i;
-		v->rot = 0;
-		v->status = Sempty;
-		v->time = toytime();
-		if(w->rot) {
-			v += w->nse;
-			qlock(v);
-			qunlock(v);
-			v->name = "shelf";
-			v->elem = w->se0 + i;
-			v->rot = 1;
-			v->status = Sempty;
-			v->time = toytime();
-		}
-	}
-	positions(w);
-
-	w->ndrive = w->ndt;
-	if(w->ndrive > MAXDRIVE) {
-		print("ndrives truncated to %d\n", MAXDRIVE);
-		w->ndrive = MAXDRIVE;
-	}
-
-	/*
-	 * pick up each drive
-	 */
-	for(i=0; i<w->ndrive; i++)
-		w->drive[i] = devnone;
-
-	cmd_install("wormreset", "-- put drives back where jukebox thinks they belong", cmd_wormreset);
-	cmd_install("wormeject", "unit -- shelf to outside", cmd_wormeject);
-	cmd_install("wormingest", "unit -- outside to shelf", cmd_wormingest);
-	cmd_install("wormoffline", "unit -- disable drive", cmd_wormoffline);
-	cmd_install("wormonline", "unit -- enable drive", cmd_wormonline);
-
-found:
-	i = 0;
-	while(xdev = xdev->link) {
-		if(xdev->type != Devwren) {
-			print("drive not devwren: %Z\n", xdev);
-			goto bad;
-		}
-		if(w->drive[i]->type != Devnone &&
-		   xdev != w->drive[i]) {
-			print("double init drive %d %Z %Z\n", i, w->drive[i], xdev);
-			goto bad;
-		}
-		if(i >= w->ndrive) {
-			print("too many drives %Z\n", xdev);
-			goto bad;
-		}
-		w->drive[i++] = xdev;
-	}
-
-	if(i <= 0) {
-		print("no drives\n");
-		goto bad;
-	}
-
-	/*
-	 * put w pointer in each platter
-	 */
-	d->private = w;
-	jinit(w, d->j.m, 0);
-	w->probeok = 1;
-	return;
-
-bad:
-	panic("juke init");
-}
-
-/*
- * called periodically
- */
-void
-wormprobe(void)
-{
-	int i, drive;
-	Timet t;
-	Side *v;
-	Juke *w;
-
-	t = toytime() - TWORM;
-	for(w=jukelist; w; w=w->link) {
-		if(w->probeok == 0 || !canqlock(w))
-			continue;
-		for(i=0; i<w->nside; i++) {
-			v = &w->side[i];
-			if(!canqlock(v))
-				continue;
-			if(v->status == Sstart && t > v->time) {
-				drive = v->drive;
-				print("	time   r%ld drive %Z\n",
-					v-w->side, w->drive[drive]);
-				mmove(w, w->mt0, w->dt0+drive, v->elem, v->rot);
-				v->status = Sunload;
-			}
-			qunlock(v);
-		}
-		qunlock(w);
-	}
-}

+ 0 - 3
sys/src/fs/dev/mkfile

@@ -1,3 +0,0 @@
-DEVFILES=`{builtin cd ../dev;echo *.c | sed 's/ /|/g; s/\.c//g'}
-^($DEVFILES)\.$O:R:	'../dev/\1.c'
-	$CC $CFLAGS -I. ../dev/$stem1.c

+ 0 - 283
sys/src/fs/dev/mworm.c

@@ -1,283 +0,0 @@
-#include	"all.h"
-
-/*
- * multiple cat devices
- */
-void
-mcatinit(Device *d)
-{
-	Device *x, **list;
-
-	d->cat.ndev = 0;
-	for(x=d->cat.first; x; x=x->link) {
-		devinit(x);
-		d->cat.ndev++;
-	}
-
-	list = ialloc(d->cat.ndev*sizeof(Device*), 0);
-	d->private = list;
-	for(x=d->cat.first; x; x=x->link) {
-		*list++ = x;
-		x->size = devsize(x);
-	}
-}
-
-Devsize
-mcatsize(Device *d)
-{
-	Device *x;
-	Devsize l, m;
-
-	l = 0;
-	for(x=d->cat.first; x; x=x->link) {
-		m = x->size;
-		if(m == 0) {
-			m = devsize(x);
-			x->size = m;
-		}
-		l += m;
-	}
-	return l;
-}
-
-int
-mcatread(Device *d, Off b, void *c)
-{
-	Device *x;
-	Devsize l, m;
-
-	l = 0;
-	for(x=d->cat.first; x; x=x->link) {
-		m = x->size;
-		if(m == 0) {
-			m = devsize(x);
-			x->size = m;
-		}
-		if(b < l+m)
-			return devread(x, b-l, c);
-		l += m;
-	}
-	print("mcatread %lld %lld\n", (Wideoff)b, (Wideoff)l);
-	return 1;
-}
-
-int
-mcatwrite(Device *d, Off b, void *c)
-{
-	Device *x;
-	Devsize l, m;
-
-	l = 0;
-	for(x=d->cat.first; x; x=x->link) {
-		m = x->size;
-		if(m == 0) {
-			m = devsize(x);
-			x->size = m;
-		}
-		if(b < l+m)
-			return devwrite(x, b-l, c);
-		l += m;
-	}
-	print("mcatwrite %lld %lld\n", (Wideoff)b, (Wideoff)l);
-	return 1;
-}
-
-/*
- * multiple interleave devices
- */
-void
-mlevinit(Device *d)
-{
-	Device *x;
-
-	mcatinit(d);
-	for(x=d->cat.first; x; x=x->link)
-		x->size = devsize(x);
-}
-
-Devsize
-mlevsize(Device *d)
-{
-	Device *x;
-	int n;
-	Devsize m, min;
-
-	min = 0;
-	n = 0;
-	for(x=d->cat.first; x; x=x->link) {
-		m = x->size;
-		if(m == 0) {
-			m = devsize(x);
-			x->size = m;
-		}
-		if(min == 0 || m < min)
-			min = m;
-		n++;
-	}
-	return n * min;
-}
-
-int
-mlevread(Device *d, Off b, void *c)
-{
-	int n;
-	Device **list;
-
-	n = d->cat.ndev;
-	list = d->private;
-	return devread(list[b%n], b/n, c);
-}
-
-int
-mlevwrite(Device *d, Off b, void *c)
-{
-	int n;
-	Device **list;
-
-	n = d->cat.ndev;
-	list = d->private;
-	return devwrite(list[b%n], b/n, c);
-}
-
-/*
- * partition device
- */
-void
-partinit(Device *d)
-{
-
-	devinit(d->part.d);
-	d->part.d->size = devsize(d->part.d);
-}
-
-Devsize
-partsize(Device *d)
-{
-	Devsize size, l;
-
-	l = d->part.d->size / 100;
-	size = d->part.size * l;
-	if(size == 0)
-		size = l*100;
-	return size;
-}
-
-int
-partread(Device *d, Off b, void *c)
-{
-	Devsize base, size, l;
-
-	l = d->part.d->size / 100;
-	base = d->part.base * l;
-	size = d->part.size * l;
-	if(size == 0)
-		size = l*100;
-	if(b < size)
-		return devread(d->part.d, base+b, c);
-	print("partread %lld %lld\n", (Wideoff)b, (Wideoff)size);
-	return 1;
-}
-
-int
-partwrite(Device *d, Off b, void *c)
-{
-	Devsize base, size, l;
-
-	l = d->part.d->size / 100;
-	base = d->part.base * l;
-	size = d->part.size * l;
-	if(size == 0)
-		size = l*100;
-	if(b < size)
-		return devwrite(d->part.d, base+b, c);
-	print("partwrite %lld %lld\n", (Wideoff)b, (Wideoff)size);
-	return 1;
-}
-
-/*
- * mirror device
- */
-void
-mirrinit(Device *d)
-{
-	Device *x;
-
-	mcatinit(d);
-	for(x=d->cat.first; x; x=x->link)
-		x->size = devsize(x);
-}
-
-Devsize
-mirrsize(Device *d)
-{
-	Device *x;
-	int n;
-	Devsize m, min;
-
-	min = 0;
-	n = 0;
-	for(x=d->cat.first; x; x=x->link) {
-		m = x->size;
-		if(m == 0) {
-			m = devsize(x);
-			x->size = m;
-		}
-		if(min == 0 || m < min)
-			min = m;
-		n++;
-	}
-	return min;
-}
-
-int
-mirrread(Device *d, Off b, void *c)
-{
-	Device *x;
-
-	for(x=d->cat.first; x; x=x->link) {
-		if(x->size == 0)
-			x->size = devsize(x);
-		if (devread(x, b, c) == 0)	/* okay? */
-			return 0;
-	}
-	// DANGER WILL ROBINSON - all copies of this block were bad
-	print("mirrread %Z error at block %lld\n", d, (Wideoff)b);
-	return 1;
-}
-
-/*
- * write the mirror(s) first so that a power outage, for example, will
- * find the main device written only if the mirrors are too, thus
- * checking the main device will also correctly check the mirror(s).
- *
- * devread and devwrite are synchronous; all buffering must be
- * implemented at higher levels.
- */
-static int
-ewrite(Device *x, Off b, void *c)
-{
-	if(x->size == 0)
-		x->size = devsize(x);
-	if (devwrite(x, b, c) != 0) {
-		print("mirrwrite %Z error at block %lld\n", x, (Wideoff)b);
-		return 1;
-	}
-	return 0;
-}
-
-static int
-wrmirrs1st(Device *x, Off b, void *c)	// write any mirrors of x, then x
-{
-	int e;
-
-	if (x == nil)
-		return 0;
-	e = wrmirrs1st(x->link, b, c);
-	return e | ewrite(x, b, c);
-}
-
-int
-mirrwrite(Device *d, Off b, void *c)
-{
-	return wrmirrs1st(d->cat.first, b, c);
-}

+ 0 - 132
sys/src/fs/dev/wren.c

@@ -1,132 +0,0 @@
-#include	"all.h"
-
-typedef	struct	Wren	Wren;
-struct	Wren
-{
-	long	block;			/* size of a block -- from config */
-	Devsize	nblock;			/* number of blocks -- from config */
-	long	mult;			/* multiplier to get physical blocks */
-	Devsize	max;			/* number of logical blocks */
-};
-
-void
-wreninit(Device *d)
-{
-	int s;
-	uchar cmd[10], buf[8];
-	Wren *dr;
-
-	dr = d->private;
-	if(dr)
-		return;
-	dr = ialloc(sizeof(Wren), 0);
-	d->private = dr;
-
-loop:
-	memset(cmd, 0, sizeof(cmd));
-	cmd[0] = 0x25;					/* read capacity */
-	s = scsiio(d, SCSIread, cmd, sizeof(cmd), buf, sizeof(buf));
-	if(s) {
-		print("wreninit: %Z bad status %.4x\n", d, s);
-		delay(1000);
-		goto loop;
-	}
-	dr->nblock =
-		(buf[0]<<24) |
-		(buf[1]<<16) |
-		(buf[2]<<8) |
-		(buf[3]<<0);
-	dr->block =
-		(buf[4]<<24) |
-		(buf[5]<<16) |
-		(buf[6]<<8) |
-		(buf[7]<<0);
-	if(dr->block <= 0 || dr->block >= 16*1024) {
-		print("	wreninit %Z block size %ld setting to 512\n", d, dr->block);
-		dr->block = 512;
-	}
-	dr->mult =
-		(RBUFSIZE + dr->block - 1) /
-		dr->block;
-	dr->max =
-		(dr->nblock + 1) / dr->mult;
-	print("	drive %Z:\n", d);
-	print("		%lld blocks at %ld bytes each\n",
-		(Wideoff)dr->nblock, dr->block);
-	print("		%lld logical blocks at %d bytes each\n",
-		(Wideoff)dr->max, RBUFSIZE);
-	print("		%ld multiplier\n",
-		dr->mult);
-}
-
-Devsize
-wrensize(Device *d)
-{
-	Wren *dr;
-
-	dr = d->private;
-	return dr->max;
-}
-
-int
-wreniocmd(Device *d, int io, Off b, void *c)
-{
-	Off l, m;
-	uchar cmd[10];
-	Wren *dr;
-
-	dr = d->private;
-	if(d == 0) {
-		print("wreniocmd: no drive - a=%Z b=%lld\n", d, (Wideoff)b);
-		return 0x40;
-	}
-	if(b >= dr->max) {
-		print("wreniocmd out of range a=%Z b=%lld\n", d, (Wideoff)b);
-		return 0x40;
-	}
-
-	memset(cmd, 0, sizeof(cmd));
-	cmd[0] = 0x28;	/* extended read */
-	if(io != SCSIread)
-		cmd[0] = 0x2a;	/* extended write */
-
-	m = dr->mult;
-	l = b * m;
-	cmd[2] = l>>24;
-	cmd[3] = l>>16;
-	cmd[4] = l>>8;
-	cmd[5] = l;
-
-	cmd[7] = m>>8;
-	cmd[8] = m;
-
-	return scsiio(d, io, cmd, sizeof(cmd), c, RBUFSIZE);
-}
-
-int
-wrenread(Device *d, Off b, void *c)
-{
-	int s;
-
-	s = wreniocmd(d, SCSIread, b, c);
-	if(s) {
-		print("wrenread: %Z(%lld) bad status %.4x\n", d, (Wideoff)b, s);
-		cons.nwormre++;
-		return 1;
-	}
-	return 0;
-}
-
-int
-wrenwrite(Device *d, Off b, void *c)
-{
-	int s;
-
-	s = wreniocmd(d, SCSIwrite, b, c);
-	if(s) {
-		print("wrenwrite: %Z(%lld) bad status %.4x\n", d, (Wideoff)b, s);
-		cons.nwormwe++;
-		return 1;
-	}
-	return 0;
-}

+ 0 - 68
sys/src/fs/doc/changes

@@ -1,68 +0,0 @@
-	changes to Ken's file server to make this 63-bit file server
-
-		Geoff Collyer
-		July—October 2004
-
-note: 2⁶⁳=9,223,372,036,854,775,808 or 8EB (9.2×10ⁱ⁸)
-
-• identified longs that refer to offsets, sizes and block numbers, and
-changed them to type Off (vlong); fixed all print formats to match.
-fixed byte-swapping for the 'x' config to match.
-
-• fixed VLONG 9p1 message packing and unpacking macros to actually
-handle 64-bit offsets and sizes.
-
-• implemented triple-indirect blocks.  affected code in
-	dev/cw.c	port/con.c	port/dentry.c	port/sub.c
-	port/chk.c	port/console.c	port/portdat.h
-
-• Fri Aug  6 16:50:59 PDT 2004
-	; ./sizes
-	Plan 9 v4 63-bit file server
-		sizeof(Dentry) = 124
-		sizeof(Cache)  =  88
-
-• added long(er) file name components (56 bytes), long enough for all but one
-  name in my /.longnames file (68-byte .xml name).
-
-• Fri Aug  6 21:43:41 PDT 2004
-	; ./sizes
-	Plan 9 v4 63-bit file server sizes
-		sizeof(Dentry) = 160
-		sizeof(Cache)  =  88
-
-• touched up lib.h (from libc.h) to bring it up to date with formatting
-  functions, verbs & flags.
-• check now reports stack usage: 320 bytes upon entry to fsck first time,
-  92 bytes of stack per recursion.  given 16000 bytes of stack,
-  that's 170 recursions maximum.
-• booted xtc (terminal) from fs64 (used fs64 as main file system)
-
-note: current file server with triple-indirect blocks at 4k block size
-	has a maximum file size of ~505GB (5.42×10ⁱⁱ).
-	with quadruple-indirect blocks, max would be ~275TB @ 4k block size.
-
-• got igbe fs driver working (a couple small changes)
-• eliminated some gotos (started with 580, down to 454)
-• added quadruple indirect blocks: lets us reach 2⁶⁳ with a 32kB block size
-• got igbe boot driver & pxe booting working
-• on-disk qid paths are now Offs, but 9p1 qids on the wire are still ulongs
-• generalised & parameterised indirect block implementation
-• tested with plain w0 fs, cached fake worm on w0, cw jukebox (hp 160fx)
-• ip directories in fs & fs64 are identical except for whitespace and
-  goto-elimination
-• replaced most of nemo's ide code with newer ide code lifted from 9load,
-  then from cpu kernel (sdata.c & support).  this brings us dma, rwm & lba48,
-  finds ide controllers by itself, even pci ones, & copes with dead drives
-  (i.e., doesn't panic).
-• fixed long-standing bug that caused a 5-second delay before each console
-  prompt on systems without a serial console.
-• further type parameterisation: Userid (short), Timet (long), Devsize (vlong).
-    Comment on v7 kernel portability work, quoting scj & dmr from BSTJ v57
-    #6 part 2., p. 2038: ``The important data types used within the
-    system were identified and specified using typedef: disk offsets,
-    absolute times, internal device names, and the like.  This effort was
-    carried out by K. Thompson.''
-• corrected compat.h dependencies in mkfiles
-• eliminated all warnings
-• implemented truncation via wstat

+ 0 - 28
sys/src/fs/doc/words

@@ -1,28 +0,0 @@
-'emelie' is for any PC with supported hardware excluding the SONY
-jukebox, and will make an object '9emeliefs' and use a 16KB block
-size.  It's set up for the US Eastern time zone.  choline is similar,
-but with conf.nfile cranked up.
-
-fs uses a 4KB block size, rereads all blocks written to the WORM, and
-is configured for the US Pacific time zone and with more `large
-message' buffers than is usual (for gigabit Ethernet).  fs64 is
-similar but uses an 8KB block size and 64-bit (rather than 32-bit)
-file sizes, offsets and block numbers, and consequently can only serve
-9P2000, not 9P1.
-
-9netics32.16k is like fs, but uses a 16KB block size and does not
-reread blocks written to the WORM.  9netics64.8k is like fs64, but
-uses an 8KB block size and does not reread blocks written to the WORM.
-
-To spin-off a new version to play with, say 'test':
-
-	cd /sys/src/fs
-	mkdir test
-	cp emelie/9emeliefs.c test/9testfs.c
-	cp emelie/dat.h emelie/fns.h emelie/io.h emelie/mem.h test
-	sed '1s/emelie/test/' <emelie/mkfile >test/mkfile
-
-and hack as appropriate.
-
-The mkfiles aren't quite right yet to make this as automatic as it
-should be.  There are a lot of rough edges.

+ 0 - 128
sys/src/fs/doc/worm.fs

@@ -1,128 +0,0 @@
-# fs: new main file server on 633MHz machine with 4 IDE disks & 4K blocks
-# was called rosewood at first
-config h0
-service fs
-ip0     66.120.90.177
-ipgw0   66.120.90.186
-ipmask0 255.255.255.0
-ipsntp  66.120.90.185
-filsys main c{p(h0)0.25p(h2)0.25}f{p(h0)25.75p(h2)25.75}
-filsys dump o
-filsys other h3
-# later added: filsys spare h1
-# ream other
-# ream main
-# recover main
-allow
-end
-
-h0 20GB "main":  25% cache and 75% fake-worm;
-h1 40GB "spare": holds test venti used for backup
-h2 20GB "main":  (h1.0.0) a mirror of h0.
-h3 40GB "other": (h1.1.0) ``scratch'' space
-
----
-halted. press a key to reboot.
-
-ether#0: i82557: port 0x9400 irq 10: 00A0C9E02756
-dev A0 port 1F0 config 427A capabilities 2F00 mwdma 0007 udma 103F
-dev A0 port 170 config 427A capabilities 2F00 mwdma 0007 udma 043F
-dev B0 port 170 config 045A capabilities 0F00 mwdma 0007 udma 043F
-found 9PCFSIMR.    attr 0x0 start 0x423 len 391193
-.239705.............................+41712.....+181524=462941
-entry: 0x80100020
-cpu0: 635MHz GenuineIntel PentiumIII/Xeon (cpuid: AX 0x0686 DX 0x383f9ff)
-ether0: i82557: 100Mbps port 0x9400 irq 10: 00a0c9e02756
-
-iobufinit
-        114253 buffers; 14281 hashes
-        mem left = 44040191
-                out of = 528482304
-nvr read
-found plan9.nvr attr 0x0 start 0x18c len 677
-for config mode hit a key within 5 seconds
-
-config: filsys main c{p(h0)0.25p(h2)0.25}f{p(h0)25.75p(h2)25.75}
-config: filsys dump o
-config: filsys other h3
-config: recover main 
-config: ream other
-config: allow
-config: end
-ysinits
-config h0
-        devinit h0
-i hd0: DW CDW02E0-B00HB0F    lba/atapi/drqintr: 1/0/0  C/H/S: 0/0/0  CAP: 39102336
-hd0: LBA 39102336 sectors
-ideinit(device 9ce00948 ctrl 0 targ 0) driveno 0 dp 802eff24
-config block written
-config h0
-        devinit h0
-ideinit(device 9ce00988 ctrl 0 targ 0) driveno 0 dp 802eff24
-service    rosewood
-ipauth  0.0.0.0
-ipsntp  66.120.90.185
-ip0     66.120.90.194
-ipgw0   66.120.90.186
-ipmask0 255.255.255.0
-filsys main c{p(h0)0.25p(h2)0.25}f{p(h0)25.75p(h2)25.75}
-filsys dump o
-filsys other h3
-sysinit: main
-recover: c{p(h0)0.25p(h2)0.25}f{p(h0)25.75p(h2)25.75}
-        devinit {p(h0)0.25p(h2)0.25}
-        devinit p(h0)0.25
-        devinit h0
-ideinit(device 9ce00a68 ctrl 0 targ 0) driveno 0 dp 802eff24
-atasize(9ce00a68):  39102336 -> 4887552
-        devinit p(h2)0.25
-        devinit h2
-i hd2: DW CDW02E0-B00HB0F    lba/atapi/drqintr: 1/0/0  C/H/S: 0/0/0  CAP: 39102336
-hd2: LBA 39102336 sectors
-ideinit(device 9ce00ae8 ctrl 0 targ 2) driveno 2 dp 802f4324
-atasize(9ce00ae8):  39102336 -> 4887552
-        devinit f{p(h0)25.75p(h2)25.75}
-fworm init
-        devinit {p(h0)25.75p(h2)25.75}
-        devinit p(h0)25.75
-        devinit h0
-ideinit(device 9ce00bc8 ctrl 0 targ 0) driveno 0 dp 802eff24
-atasize(9ce00bc8):  39102336 -> 4887552
-        devinit p(h2)25.75
-        devinit h2
-ideinit(device 9ce00c48 ctrl 0 targ 2) driveno 2 dp 802f4324
-atasize(9ce00c48):  39102336 -> 4887552
-dump 2 is good; 5 next
-dump 5 is good; 494408 next
-dump 494408 is good; 495193 next
-dump 495193 is good; 495224 next
-dump 495224 is good; 496007 next
-dump 496007 is good; 496062 next
-dump 496062 is good; 496089 next
-dump 496089 is good; 496096 next
-dump 496096 is good; 496118 next
-dump 496118 is good; 496882 next
-fworm: read 496882
-cache init c{p(h0)0.25p(h2)0.25}f{p(h0)25.75p(h2)25.75}
-done cacheinit
-done recover
-        devinit c{p(h0)0.25p(h2)0.25}f{p(h0)25.75p(h2)25.75}
-sysinit: dump
-        devinit o{p(h0)0.25p(h2)0.25}f{p(h0)25.75p(h2)25.75}
-sysinit: other
-        devream: h3 1
-        devinit h3
-i hd3: AMTXRO4 0K042H        lba/atapi/drqintr: 1/0/0  C/H/S: 0/0/0  CAP: 78198750
-hd3: LBA 78198750 sectors
-ideinit(device 9ce00ca8 ctrl 0 targ 3) driveno 3 dp 802f44f0
-atasize(9ce00ca8):  78198750 -> 9774592
-ether0o: 00a0c9e02756 66.120.90.194
-ether0i: 00a0c9e02756 66.120.90.194
-next dump at Mon Sep 10 05:00:00 2001
-current fs is "main"
-il: allocating il!66.120.90.189!23230
-41 uids read, 21 groups used
-rosewood as of Sun Sep  9 16:27:27 2001
-        last boot Mon Sep 10 00:56:10 2001
-touch superblock 496118
-rosewood: 

+ 0 - 81
sys/src/fs/doc/worm.fs64

@@ -1,81 +0,0 @@
-# 4k blocks
-fs64: printconf
-config w0
-service fs64
-filsys main w0
-ipauth 0.0.0.0
-ipsntp 216.240.55.164
-ip0 216.240.55.167
-ipmask0 255.255.255.224
-end
-fs64: 
-
-# 4k blocks
-Wed Sep  1 17:46:10 PDT 2004
-fs64: printconf
-config w0
-service fs64
-filsys main cp(w0)0.20fp(w0)20.80
-filsys dump o
-ipauth 0.0.0.0
-ipsntp 216.240.55.164
-ip0 216.240.55.167
-ipmask0 255.255.255.224
-end
-fs64: 
-
-# 8k blocks, preparing for worm jukebox
-Thu Sep  2 00:17:19 PDT 2004
-fs64: printconf
-config w0
-service fs64
-filsys main cp(w0)0.20fp(w0)20.80
-filsys dump o
-ipauth 0.0.0.0
-ipsntp 216.240.55.164
-ip0 216.240.55.167
-ipmask0 255.255.255.224
-end
-fs64: 
-
-# 8k blocks with hp 160fx worm jukebox
-# only 1 MO disc inside currently
-Fri Sep  3 23:06:30 PDT 2004
-fs64: printconf
-config w0
-service fs64
-filsys main cp(w0)1.99j(w1.<1-5>.0)(l<0-15>l<16-31>)
-filsys dump o
-ipauth 0.0.0.0
-ipsntp 216.240.55.164
-ip0 216.240.55.167
-ipmask0 255.255.255.224
-end
-
-# add two ide disks: one is the juke's mirror, the other is new other
-Thu Sep 30 00:38:38 PDT 2004
-fs64: printconf
-config w0
-service fs64
-filsys main cp(w0)1.99{h0j(w1.<1-5>.0)(l<0-15>l<16-31>)}
-filsys dump o
-filsys other h2
-ipauth 0.0.0.0
-ipsntp 216.240.55.164
-ip0 216.240.55.167
-ipmask0 255.255.255.224
-end
-
-# now has 8 WO disks and 1 RW disk currently (25 nov 2004),
-# treat 8 WO disks as one set of disks.
-fs64: printconf
-config w0
-service fs64
-filsys main cp(w0)1.99{h0j(w1.<1-5>.0)(l<0-7>l<64-71>l<8-62>l<72-126>)}
-filsys dump o
-filsys other h2
-ipauth 0.0.0.0
-ipsntp 216.240.55.164
-ip0 216.240.55.167
-ipmask0 255.255.255.224
-end

+ 0 - 150
sys/src/fs/doc/worms.32-bit

@@ -1,150 +0,0 @@
-/* configuration commands */
-
-/* configuration commands */
-filsys main j(w6)(r5.<0-18>r5.<20-38>)
-e!0!helix:/386/9pcfs
-
-/* AUDIO */
-ip/dhcp
-ip/tftpd
-con /dev/eia1
-bootp()phaeton:/sys/src/fs/audio/audio
-
-/* AUDIO */
-touch superblock 2835710
-
-config w2
-service audio
-filsys main cw2j(w5w4)(l<0-39>)
-filsys dump o
-ip 135.104.3.106
-ipgw 135.104.3.1
-ipmask 255.255.255.0
-ipauth 135.104.9.7
-end
-
-/* RORO running 9pcfs (16KB blocks)  */
-config w2
-service roro
-filsys main [w2w3]
-ip 135.104.9.29
-ipgw 135.104.9.1
-ipmask 255.255.255.0
-ipauth 135.104.9.7
-end
-
-/* RORO running plan9pc (4KB blocks) */
-config w1
-service roro
-filsys main w1
-ip 135.104.9.29
-ipgw 135.104.9.1
-ipmask 255.255.255.0
-ipauth 135.104.9.7
-end
-
-/* EMELIE */
-e!0!helix:/usr/ken/fs/pc/9pcfs
-130 disks loaded
-
-/* BOOTES 00006b8244f8 */
-superblocks:
-bootes 44930632
-	dump 44945151 is good; 44945224 next
-        	44945220 cwroot; 44945223 roroot
-fornax 8917649
-	dump 8919157 is good; 8919167 next
-        	8919163 cwroot; 8919166 roroot
-	sbaddr =  8919379
-	craddr =  8919383  8919383
-
-/* BOOTES little endian */
-config xw5
-service bootes
-filsys main c[xw5]j(w1.1.8xw1.1.1)(r<0-44>r<50-94>)
-filsys dump o
-filsys fornax c[xw3]j(w1.2.8xw1.2.0)(r<0-18>)
-filsys fdump o
-ip 135.104.9.30
-ipgw 135.104.9.1
-ipmask 255.255.255.0
-ipauth 135.104.9.7
-end
-
-/* BOOTES little endian with only fornax filesystem */
-config xw5
-service bootes
-//filsys main c[xw5]j(w1.1.8xw1.1.1)(r<0-44>r<50-94>)
-//filsys dump o
-filsys main c[xw3]j(w1.2.8xw1.2.0)(r<0-18>)
-filsys dump o
-ip 135.104.9.30
-ipgw 135.104.9.1
-ipmask 255.255.255.0
-ipauth 135.104.9.7
-end
-
-/* BOOTES little endian with only bootes filesystem */
-config xw5
-service bootes
-filsys main c[xw5]j(w1.2.8xw1.2.1)(r<0-44>r<50-94>)
-filsys dump o
-ip 135.104.9.30
-ipgw 135.104.9.1
-ipmask 255.255.255.0
-ipauth 135.104.9.7
-end
-
-/* BOOTES 00006b8244f8 big endian */
-config w5
-service bootes
-filsys main c[w5]j(w0.1.8w0.1.1)(r<0-44>r<50-94>)
-filsys dump o
-//filsys fornax c[w3]j(w0.2.8w0.2.0)(r<0-18>)
-//filsys fdump o
-ip 135.104.9.30
-ipgw 135.104.9.1
-ipmask 255.255.255.0
-ipauth 135.104.9.7
-end
-
-// jukefs
-// DSIZE = 39815
-config w6
-service jukefs
-filsys main cw6j(w5w<1-4>)(r<0-140>r<144-284>)
-filsys dump o
-ip 135.104.9.10
-ipgw 135.104.9.1
-ipmask 255.255.255.0
-ipauth 135.104.9.7
-end
-
-// emelie
-// DSIZE = 157933
-config w1.0.0
-service emelie
-filsys main c[w1.<0-5>.0]j(w6w5w4w3w2)(l<0-236>l<238-474>)
-filsys dump o
-filsys other [w1.<9-14>.0]
-filsys temp [w1.8.0]
-ipauth  135.104.9.7
-ip     135.104.9.42
-ipgw   135.104.9.1
-ipmask 255.255.255.0
-ipsntp 135.104.9.52
-end
-
-// choline
-// DSIZE = 79563-1
-config w1.0.0
-service    choline
-filsys main c[w<1-3>]j(w1.<6-0>.0)(l<0-124>l<128-252>)
-filsys dump o
-filsys other [w<4-6>]
-ipauth  135.104.9.7
-ip	135.104.72.2
-ipgw	135.104.72.1
-ipmask	255.255.255.0
-ipsntp 135.104.9.52
-end

+ 0 - 177
sys/src/fs/emelie/9emeliefs.c

@@ -1,177 +0,0 @@
-#include "all.h"
-#include "mem.h"
-#include "io.h"
-#include "ureg.h"
-
-#include "../pc/dosfs.h"
-
-/*
- * setting this to zero permits the use of discs of different sizes, but
- * can make jukeinit() quite slow while the robotics work through each disc
- * twice (once per side).
- */
-int FIXEDSIZE = 1;
-
-#ifndef	DATE
-#define	DATE	1094098624L
-#endif
-
-Timet	mktime		= DATE;				/* set by mkfile */
-Startsb	startsb[] =
-{
-	"main",		2,
-	0
-};
-
-Dos dos;
-
-static struct
-{
-	char	*name;
-	Off	(*read)(int, void*, long);
-	Devsize	(*seek)(int, Devsize);
-	Off	(*write)(int, void*, long);
-	int	(*part)(int, char*);
-} nvrdevs[] = {
-	{ "fd", floppyread, floppyseek, floppywrite, 0, },
-	{ "hd", ataread,   ataseek,   atawrite,   setatapart, },
-	/* { "sd", scsiread,   scsiseek,   scsiwrite,   setscsipart, },  */
-	{ 0, },
-};
-
-void apcinit(void);
-
-void
-otherinit(void)
-{
-	int dev, i, nfd, nhd, s;
-	char *p, *q, buf[sizeof(nvrfile)+8];
-
-	kbdinit();
-	printcpufreq();
-	etherinit();
-	scsiinit();
-	apcinit();
-
-	s = spllo();
-	nhd = atainit();
-	nfd = floppyinit();
-	dev = 0;
-	if(p = getconf("nvr")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed nvrfile: %s\n", buf);
-		*p++ = 0;
-		*q++ = 0;
-		dev = strtoul(p, 0, 0);
-		strcpy(nvrfile, q);
-		p = buf;
-	} else
-	if(p = getconf("bootfile")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed bootfile: %s\n", buf);
-		*p++ = 0;
-		*q = 0;
-		dev = strtoul(p, 0, 0);
-		p = buf;
-	} else
-	if(nfd)
-		p = "fd";
-	else
-	if(nhd)
-		p = "hd";
-	else
-		p = "sd";
-
-	for(i = 0; nvrdevs[i].name; i++){
-		if(strcmp(p, nvrdevs[i].name) == 0){
-			dos.dev = dev;
-			if(nvrdevs[i].part && (*nvrdevs[i].part)(dos.dev, "disk") == 0)
-				break;
-			dos.read = nvrdevs[i].read;
-			dos.seek = nvrdevs[i].seek;
-			dos.write = nvrdevs[i].write;
-			break;
-		}
-	}
-	if(dos.read == 0)
-		panic("no device for nvram\n");
-	if(dosinit(&dos) < 0)
-		panic("can't init dos dosfs on %s\n", p);
-	splx(s);
-}
-
-void
-touser(void)
-{
-	int i;
-
-	settime(rtctime());
-	boottime = time();
-
-	print("sysinit\n");
-	sysinit();
-
-	userinit(floppyproc, 0, "floppyproc");
-	/*
-	 * Ethernet i/o processes
-	 */
-	etherstart();
-
-
-	/*
-	 * read ahead processes
-	 */
-	userinit(rahead, 0, "rah");
-
-	/*
-	 * server processes
-	 */
-	for(i=0; i<conf.nserve; i++)
-		userinit(serve, 0, "srv");
-
-	/*
-	 * worm "dump" copy process
-	 */
-	userinit(wormcopy, 0, "wcp");
-
-	/*
-	 * processes to read the console
-	 */
-	consserve();
-
-	/*
-	 * "sync" copy process
-	 * this doesn't return.
-	 */
-	u->text = "scp";
-	synccopy();
-}
-
-void
-localconfinit(void)
-{
-	conf.nfile = 40000;
-	conf.nodump = 0;
-	conf.firstsb = 13219302;
-	conf.recovsb = 0;
-	conf.ripoff = 1;
-	conf.nlgmsg = 100;
-	conf.nsmmsg = 500;
-
-	conf.minuteswest = 5*60;
-	conf.dsttime = 1;
-}
-
-int (*fsprotocol[])(Msgbuf*) = {
-	serve9p1,
-	serve9p2,
-	nil,
-};

+ 0 - 35
sys/src/fs/emelie/dat.h

@@ -1,35 +0,0 @@
-/*
- * The most fundamental constant.
- * The code will not compile with RBUFSIZE made a variable;
- * for one thing, RBUFSIZE determines FEPERBUF, which determines
- * the number of elements in a free-list-block array.
- */
-#define RBUFSIZE	(16*1024)	/* raw buffer size */
-
-#include "../port/portdat.h"
-
-extern	Mach	mach0;
-
-typedef struct Segdesc	Segdesc;
-struct Segdesc
-{
-	ulong	d0;
-	ulong	d1;
-};
-
-typedef struct Mbank {
-	ulong	base;
-	ulong	limit;
-} Mbank;
-
-#define MAXBANK		8
-
-typedef struct Mconf {
-	Lock;
-	Mbank	bank[MAXBANK];
-	int	nbank;
-	ulong	topofmem;
-} Mconf;
-extern Mconf mconf;
-
-extern char nvrfile[128];

+ 0 - 87
sys/src/fs/emelie/fns.h

@@ -1,87 +0,0 @@
-ulong	strtoul(char*, char**, int);
-vlong	strtoll(char*, char**, int);
-
-#include "../port/portfns.h"
-
-void	aamloop(int);
-void	cgaputc(int);
-void	cgaputs(char*, int);
-int	cistrcmp(char*, char*);
-int	cistrncmp(char*, char*, int);
-void	(*coherence)(void);
-void	etherinit(void);
-void	etherstart(void);
-int	floppyinit(void);
-void	floppyproc(void);
-Off	floppyread(int, void*, long);
-Devsize	floppyseek(int, Devsize);
-Off	floppywrite(int, void*, long);
-void	fpinit(void);
-char*	getconf(char*);
-ulong	getcr0(void);
-ulong	getcr2(void);
-ulong	getcr4(void);
-int	getfields(char*, char**, int, int, char*);
-ulong	getstatus(void);
-int	atainit(void);
-Off	ataread(int, void*, long);
-Devsize	ataseek(int, Devsize);
-Off	atawrite(int, void*, long);
-void	i8042a20(void);
-void	i8042reset(void);
-int	inb(int);
-void	insb(int, void*, int);
-ushort	ins(int);
-void	inss(int, void*, int);
-ulong	inl(int);
-void	insl(int, void*, int);
-void	kbdinit(void);
-int	kbdintr0(void);
-int	kbdgetc(void);
-long*	mapaddr(ulong);
-void	microdelay(int);
-void	mmuinit(void);
-uchar	nvramread(int);
-void	outb(int, int);
-void	outsb(int, void*, int);
-void	outs(int, ushort);
-void	outss(int, void*, int);
-void	outl(int, ulong);
-void	outsl(int, void*, int);
-void	printcpufreq(void);
-void	putgdt(Segdesc*, int);
-void	putidt(Segdesc*, int);
-void	putcr3(ulong);
-void	putcr4(ulong);
-void	puttr(ulong);
-void	rdmsr(int, vlong*);
-void	wrmsr(int, vlong);
-void	(*cycles)(uvlong*);
-void	scsiinit(void);
-Off	scsiread(int, void*, long);
-Devsize	scsiseek(int, Devsize);
-Off	scsiwrite(int, void*, long);
-int	setatapart(int, char*);
-int	setscsipart(int, char*);
-void	setvec(int, void (*)(Ureg*, void*), void*);
-int	tas(Lock*);
-void	trapinit(void);
-void	uartspecial(int, void (*)(int), int (*)(void), int);
-int	uartgetc(void);
-void	uartputc(int);
-void	wbflush(void);
-void	cpuid(char*, int*, int*);
-
-#define PADDR(a)	((ulong)(a)&~KZERO)
-
-/* pata */
-void	ideinit(Device *d);
-Devsize	idesize(Device *d);
-int	ideread(Device *d,  Devsize, void*);
-int	idewrite(Device *d, Devsize, void*);
-
-/* sata */
-void	mvideinit(Device *d);
-Devsize	mvidesize(Device *d);
-int	mvideread(Device *d,  Devsize, void*);
-int	mvidewrite(Device *d, Devsize, void*);

+ 0 - 247
sys/src/fs/emelie/io.h

@@ -1,247 +0,0 @@
-/*
- *  programmable interrupt vectors (for the 8259's)
- */
-enum
-{
-	Bptvec=		3,		/* breakpoints */
-	Mathemuvec=	7,		/* math coprocessor emulation interrupt */
-	Mathovervec=	9,		/* math coprocessor overrun interrupt */
-	Matherr1vec=	16,		/* math coprocessor error interrupt */
-	Faultvec=	14,		/* page fault */
-
-	Int0vec=	24,		/* first 8259 */
-	 Clockvec=	Int0vec+0,	/*  clock interrupts */
-	 Kbdvec=	Int0vec+1,	/*  keyboard interrupts */
-	 Uart1vec=	Int0vec+3,	/*  modem line */
-	 Uart0vec=	Int0vec+4,	/*  serial line */
-	 PCMCIAvec=	Int0vec+5,	/*  PCMCIA card change */
-	 Floppyvec=	Int0vec+6,	/*  floppy interrupts */
-	 Parallelvec=	Int0vec+7,	/*  parallel port interrupts */
-	Int1vec=	Int0vec+8,
-	 Ethervec=	Int0vec+10,	/*  ethernet interrupt */
-	 Mousevec=	Int0vec+12,	/*  mouse interrupt */
-	 Matherr2vec=	Int0vec+13,	/*  math coprocessor */
-	 ATA0vec=	Int0vec+14,	/*  hard disk */
-
-	Syscallvec=	64,
-};
-
-/*
- *  8259 interrupt controllers
- */
-enum
-{
-	Int0ctl=	0x20,		/* control port (ICW1, OCW2, OCW3) */
-	Int0aux=	0x21,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-	Int1ctl=	0xA0,		/* control port */
-	Int1aux=	0xA1,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-
-	Icw1=		0x10,		/* select bit in ctl register */
-	Ocw2=		0x00,
-	Ocw3=		0x08,
-
-	EOI=		0x20,		/* non-specific end of interrupt */
-
-	Elcr1=		0x4D0,		/* Edge/Level Triggered Register */
-	Elcr2=		0x4D1,
-};
-
-extern int	int0mask;		/* interrupts enabled for first 8259 */
-extern int	int1mask;		/* interrupts enabled for second 8259 */
-
-#define NVRAUTHADDR	0
-#define LINESIZE	0
-
-enum {
-	MaxEISA		= 16,
-	EISAconfig	= 0xC80,
-
-	MaxScsi		= 4,
-	NTarget		= 16,
-
-	MaxEther	= 4,
-};
-
-#define DMAOK(x, l)	((ulong)(((ulong)(x))+(l)) < (ulong)(KZERO|16*1024*1024))
-
-enum {
-	BusCBUS		= 0,		/* Corollary CBUS */
-	BusCBUSII,			/* Corollary CBUS II */
-	BusEISA,			/* Extended ISA */
-	BusFUTURE,			/* IEEE Futurebus */
-	BusINTERN,			/* Internal bus */
-	BusISA,				/* Industry Standard Architecture */
-	BusMBI,				/* Multibus I */
-	BusMBII,			/* Multibus II */
-	BusMCA,				/* Micro Channel Architecture */
-	BusMPI,				/* MPI */
-	BusMPSA,			/* MPSA */
-	BusNUBUS,			/* Apple Macintosh NuBus */
-	BusPCI,				/* Peripheral Component Interconnect */
-	BusPCMCIA,			/* PC Memory Card International Association */
-	BusTC,				/* DEC TurboChannel */
-	BusVL,				/* VESA Local bus */
-	BusVME,				/* VMEbus */
-	BusXPRESS,			/* Express System Bus */
-};
-
-#define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
-#define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
-#define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
-#define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
-#define BUSTYPE(tbdf)	((tbdf)>>24)
-#define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
-#define BUSUNKNOWN	(-1)
-
-/*
- * PCI support code.
- */
-enum {					/* type 0 and type 1 pre-defined header */
-	PciVID		= 0x00,		/* vendor ID */
-	PciDID		= 0x02,		/* device ID */
-	PciPCR		= 0x04,		/* command */
-	PciPSR		= 0x06,		/* status */
-	PciRID		= 0x08,		/* revision ID */
-	PciCCRp		= 0x09,		/* programming interface class code */
-	PciCCRu		= 0x0A,		/* sub-class code */
-	PciCCRb		= 0x0B,		/* base class code */
-	PciCLS		= 0x0C,		/* cache line size */
-	PciLTR		= 0x0D,		/* latency timer */
-	PciHDT		= 0x0E,		/* header type */
-	PciBST		= 0x0F,		/* BIST */
-
-	PciBAR0		= 0x10,		/* base address */
-	PciBAR1		= 0x14,
-
-	PciINTL		= 0x3C,		/* interrupt line */
-	PciINTP		= 0x3D,		/* interrupt pin */
-};
-
-enum {					/* type 0 pre-defined header */
-	PciBAR2		= 0x18,
-	PciBAR3		= 0x1C,
-	PciBAR4		= 0x20,
-	PciBAR5		= 0x24,
-	PciCIS		= 0x28,		/* cardbus CIS pointer */
-	PciSVID		= 0x2C,		/* subsystem vendor ID */
-	PciSID		= 0x2E,		/* cardbus CIS pointer */
-	PciEBAR0	= 0x30,		/* expansion ROM base address */
-	PciMGNT		= 0x3E,		/* burst period length */
-	PciMLT		= 0x3F,		/* maximum latency between bursts */
-};
-
-enum {					/* type 1 pre-defined header */
-	PciPBN		= 0x18,		/* primary bus number */
-	PciSBN		= 0x19,		/* secondary bus number */
-	PciUBN		= 0x1A,		/* subordinate bus number */
-	PciSLTR		= 0x1B,		/* secondary latency timer */
-	PciIBR		= 0x1C,		/* I/O base */
-	PciILR		= 0x1D,		/* I/O limit */
-	PciSPSR		= 0x1E,		/* secondary status */
-	PciMBR		= 0x20,		/* memory base */
-	PciMLR		= 0x22,		/* memory limit */
-	PciPMBR		= 0x24,		/* prefetchable memory base */
-	PciPMLR		= 0x26,		/* prefetchable memory limit */
-	PciPUBR		= 0x28,		/* prefetchable base upper 32 bits */
-	PciPULR		= 0x2C,		/* prefetchable limit upper 32 bits */
-	PciIUBR		= 0x30,		/* I/O base upper 16 bits */
-	PciIULR		= 0x32,		/* I/O limit upper 16 bits */
-	PciEBAR1	= 0x28,		/* expansion ROM base address */
-	PciBCR		= 0x3E,		/* bridge control register */
-};
-
-typedef struct Pcidev Pcidev;
-typedef struct Pcidev {
-	int	tbdf;			/* type+bus+device+function */
-	ushort	vid;			/* vendor ID */
-	ushort	did;			/* device ID */
-
-	struct {
-		ulong	bar;		/* base address */
-		int	size;
-	} mem[6];
-
-	uchar	rid;
-	uchar	ccrp;
-	uchar	ccrb;
-	uchar	intl;			/* interrupt line */
-	ushort	ccru;			/* is uchar in cpu kernel */
-	ulong	pcr;
-
-	Pcidev*	list;
-	Pcidev*	bridge;			/* down a bus */
-	Pcidev*	link;			/* next device on this bno */
-} Pcidev;
-
-extern int pcicfgr8(Pcidev*, int);
-extern int pcicfgr16(Pcidev*, int);
-extern int pcicfgr32(Pcidev*, int);
-extern void pcicfgw8(Pcidev*, int, int);
-extern void pcicfgw16(Pcidev*, int, int);
-extern void pcicfgw32(Pcidev*, int, int);
-extern void pciclrmwi(Pcidev*);
-extern void pcihinv(Pcidev*, ulong);
-extern Pcidev* pcimatch(Pcidev*, int, int);
-extern Pcidev* pcimatchtbdf(int);
-extern void pcireset(void);
-extern void pcisetbme(Pcidev*);
-extern void pciclrbme(Pcidev*);
-
-/*
- *  a parsed plan9.ini line
- */
-#define ISAOPTLEN	16
-#define NISAOPT		8
-
-typedef struct ISAConf {
-	char	type[NAMELEN];
-	ulong	port;
-	ulong	irq;
-	ulong	dma;
-	ulong	mem;
-	ulong	size;
-	ulong	freq;
-
-	int	nopt;
-	char	opt[NISAOPT][ISAOPTLEN];
-} ISAConf;
-
-extern int isaconfig(char*, int, ISAConf*);
-
-/*
- * SCSI support code.
- */
-enum {
-	STblank		=-6,		/* blank block */
-	STnomem		=-5,		/* buffer allocation failed */
-	STtimeout	=-4,		/* bus timeout */
-	STownid		=-3,		/* playing with myself */
-	STharderr	=-2,		/* controller error of some kind */
-	STinit		=-1,		/* */
-	STok		= 0,		/* good */
-	STcheck		= 0x02,		/* check condition */
-	STcondmet	= 0x04,		/* condition met/good */
-	STbusy		= 0x08,		/* busy */
-	STintok		= 0x10,		/* intermediate/good */
-	STintcondmet	= 0x14,		/* intermediate/condition met/good */
-	STresconf	= 0x18,		/* reservation conflict */
-	STterminated	= 0x22,		/* command terminated */
-	STqfull		= 0x28,		/* queue full */
-};
-
-typedef struct Target {
-	int	ctlrno;
-	int	targetno;
-	uchar*	inquiry;
-	uchar*	sense;
-
-	QLock;
-	char	id[NAMELEN];
-	int	ok;
-
-	char	fflag;
-	Filter	work[3];
-	Filter	rate[3];
-} Target;
-
-typedef int (*Scsiio)(Target*, int, uchar*, int, void*, int*);

+ 0 - 85
sys/src/fs/emelie/mem.h

@@ -1,85 +0,0 @@
-#define	BY2WD		4			/* bytes per word */
-#define BY2V		8			/* bytes per vlong */
-#define	BY2PG		4096			/* bytes per page */
-#define	PGSHIFT		12			/* log(BY2PG) */
-#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))
-#define MB		(1024*1024)
-
-#define	HZ		(82)			/* clock frequency */
-#define	TK2MS(t)	(((ulong)(t)*1000)/HZ)	/* ticks to milliseconds - beware rounding */
-#define	MS2TK(t)	(((ulong)(t)*HZ)/1000)	/* milliseconds to ticks - beware rounding */
-#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
-
-/*
- * Fundamental addresses
- */
-#define IDTADDR		0x80000800		/* idt */
-#define APBOOTSTRAP	0x80001000		/* AP bootstrap code */
-#define CONFADDR	0x80001200		/* info passed from boot loader */
-#define CPU0PDB		0x80002000		/* bootstrap processor PDB */
-#define CPU0PTE		0x80003000		/* bootstrap processor PTE's for 0-2MB */
-#define CPU0MACHPTE	0x80004000		/* bootstrap processor PTE for MACHADDR */
-#define CPU0MACH	0x80005000		/* Mach for bootstrap processor */
-
-#define	KZERO		0x80000000		/* base of kernel address space */
-#define	KTZERO		0x80100000		/* first address in kernel text */
-
-#define	MACHSIZE	4096
-
-/*
- *  known 80386 segments (in GDT) and their selectors
- */
-#define	NULLSEG	0	/* null segment */
-#define	KDSEG	1	/* kernel data/stack */
-#define	KESEG	2	/* kernel executable */	
-#define	UDSEG	3	/* user data/stack */
-#define	UESEG	4	/* user executable */
-#define TSSSEG	5	/* task segment */
-#define N386SEG	6	/* number of segments */
-
-#define SELGDT	(0<<3)	/* selector is in gdt */
-#define	SELLDT	(1<<3)	/* selector is in ldt */
-
-#define SELECTOR(i, t, p)	(((i)<<3) | (t) | (p))
-
-#define NULLSEL	SELECTOR(NULLSEG, SELGDT, 0)
-#define KESEL	SELECTOR(KESEG, SELGDT, 0)
-#define KDSEL	SELECTOR(KDSEG, SELGDT, 0)
-#define UESEL	SELECTOR(UESEG, SELGDT, 3)
-#define UDSEL	SELECTOR(UDSEG, SELGDT, 3)
-#define TSSSEL	SELECTOR(TSSSEG, SELGDT, 0)
-
-/*
- *  fields in segment descriptors
- */
-#define SEGDATA	(0x10<<8)	/* data/stack segment */
-#define SEGEXEC	(0x18<<8)	/* executable segment */
-#define	SEGTSS	(0x9<<8)	/* TSS segment */
-#define SEGCG	(0x0C<<8)	/* call gate */
-#define	SEGIG	(0x0E<<8)	/* interrupt gate */
-#define SEGTG	(0x0F<<8)	/* task gate */
-#define SEGTYPE	(0x1F<<8)
-
-#define SEGP	(1<<15)		/* segment present */
-#define SEGPL(x) ((x)<<13)	/* priority level */
-#define SEGB	(1<<22)		/* granularity 1==4k (for expand-down) */
-#define SEGG	(1<<23)		/* granularity 1==4k (for other) */
-#define SEGE	(1<<10)		/* expand down */
-#define SEGW	(1<<9)		/* writable (for data/stack) */
-#define	SEGR	(1<<9)		/* readable (for code) */
-#define SEGD	(1<<22)		/* default 1==32bit (for code) */
-
-/*
- *  physical MMU
- */
-#define	PTEVALID	(1<<0)
-#define	PTEUNCACHED	(1<<4)	
-#define PTEWRITE	(1<<1)
-#define	PTERONLY	(0<<1)
-#define	PTEKERNEL	(0<<2)
-#define	PTEUSER		(1<<2)
-#define PTESIZE		(1<<7)
-
-#define MACHADDR	((ulong)&mach0)		/* hack number 1 */
-
-#define IFLAG		0x200	/* psw: interrupt enable, to be accurate */

+ 0 - 147
sys/src/fs/emelie/mkfile

@@ -1,147 +0,0 @@
-CONF=emelie
-p=9
-
-objtype=386
-</$objtype/mkfile
-
-TARG=$p$CONF'fs'
-
-DEV=\
-	apc.$O\
-	cw.$O\
-	fworm.$O\
-	juke.$O\
-	mworm.$O\
-	wren.$O\
-
-IP=\
-	arp.$O\
-	icmp.$O\
-	il.$O\
-	ip.$O\
-	ipaux.$O\
-	iproute.$O\
-	sntp.$O\
-	udp.$O\
-
-PORT=\
-	9p1.$O\
-	9p1lib.$O\
-	9p2.$O\
-	auth.$O\
-	chk.$O\
-	clock.$O\
-	con.$O\
-	config.$O\
-	console.$O\
-	data.$O\
-	dentry.$O\
-	devcons.$O\
-	fcmd.$O\
-	iobuf.$O\
-	lrand.$O\
-	main.$O\
-	print.$O\
-	proc.$O\
-	sub.$O\
-	time.$O\
-	uidgid.$O\
-
-PC=\
-	l.$O\
-	8250.$O\
-	8253.$O\
-	cga.$O\
-	devsd.$O\
-	sdscsi.$O\
-	sdata.$O\
-	sdmv50xx.$O\
-	dosfs.$O\
-	floppy.$O\
-	kbd.$O\
-	lock.$O\
-	malloc.$O\
-	mmu.$O\
-	nvr.$O\
-	pc.$O\
-	pci.$O\
-	toy.$O\
-	trap.$O\
-
-ETHER=\
-	compat.$O\
-	ether2114x.$O\
-	ether8139.$O\
-	ether8169.$O\
-	ether82557.$O\
-	ether83815.$O\
-	etherdp83820.$O\
-	etherelnk3.$O\
-	etherga620.$O\
-	etherif.$O\
-	etherigbe.$O\
-	ethermii.$O\
-
-SCSI=\
-	scsi.$O\
-	scsibuslogic.$O\
-	scsincr53c8xx.$O\
-
-OBJ=\
-	$PC\
-	$PORT\
-	$DEV\
-	$IP\
-	$ETHER\
-	$SCSI\
-
-HFILES=\
-	../port/all.h\
-	../port/lib.h\
-	../port/portdat.h\
-	../port/portfns.h\
-	dat.h\
-	fns.h\
-	io.h\
-	mem.h\
-	/$objtype/include/u.h\
-	/$objtype/include/ureg.h\
-
-LIB=\
-	-lauthsrv\
-	-lc\
-	-lsec\
-
-# -I../pc & -DFS are for compat.h
-# -DOLD uses 32-bit file offsets instead of 64-bit ones
-CFLAGS=-FTVw -I. -I../port -I../pc -DFS -DOLD
-
-all:V:	$TARG
-
-<../pc/mkfile
-<../port/mkfile
-<../dev/mkfile
-<../ip/mkfile
-
-$TARG:	$TARG.c $OBJ
-	$CC $CFLAGS -DDATE'='`{date -n} $TARG.c
-	$LD -o $target -l -T0x80100020 $OBJ $TARG.$O $LIB
-	size $target
-
-install:V: $TARG
-	cp $TARG /$objtype/
-	import lookout / /n/lookout && cp $TARG /n/lookout/$objtype/
-	import boundary / /n/boundary && cp $TARG /n/boundary/$objtype/
-
-$TARG.$O:	../pc/dosfs.h
-
-%.$O:	%.c
-	$CC $CFLAGS $stem.c
-
-%.$O:	%.s
-	$AS $stem.s
-
-%.$O:	$HFILES
-
-clean:V:
-	rm -f *.[$OS] [$OS].out $TARG

+ 0 - 181
sys/src/fs/fs/9fsfs.c

@@ -1,181 +0,0 @@
-#include "all.h"
-#include "mem.h"
-#include "io.h"
-#include "ureg.h"
-
-#include "../pc/dosfs.h"
-
-/*
- * setting this to zero permits the use of discs of different sizes, but
- * can make jukeinit() quite slow while the robotics work through each disc
- * twice (once per side).
- */
-int FIXEDSIZE = 1;
-
-#ifndef	DATE
-#define	DATE	1094098624L
-#endif
-
-Timet	mktime		= DATE;				/* set by mkfile */
-Startsb	startsb[] =
-{
-/*	"main",		2,	*/
-	"main",		810988,	/* discontinuity before sb @ 696262 */
-	0
-};
-
-Dos dos;
-
-static struct
-{
-	char	*name;
-	Off	(*read)(int, void*, long);
-	Devsize	(*seek)(int, Devsize);
-	Off	(*write)(int, void*, long);
-	int	(*part)(int, char*);
-} nvrdevs[] = {
-	{ "fd", floppyread, floppyseek, floppywrite, 0, },
-	{ "hd", ataread,   ataseek,   atawrite,   setatapart, },
-	/* { "sd", scsiread,   scsiseek,   scsiwrite,   setscsipart, },  */
-	{ 0, },
-};
-
-void apcinit(void);
-
-void
-otherinit(void)
-{
-	int dev, i, nfd, nhd, s;
-	char *p, *q, buf[sizeof(nvrfile)+8];
-
-	kbdinit();
-	printcpufreq();
-	etherinit();
-	scsiinit();
-	apcinit();
-
-	s = spllo();
-	nhd = atainit();
-	nfd = floppyinit();
-	dev = 0;
-	if(p = getconf("nvr")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed nvrfile: %s\n", buf);
-		*p++ = 0;
-		*q++ = 0;
-		dev = strtoul(p, 0, 0);
-		strcpy(nvrfile, q);
-		p = buf;
-	} else
-	if(p = getconf("bootfile")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed bootfile: %s\n", buf);
-		*p++ = 0;
-		*q = 0;
-		dev = strtoul(p, 0, 0);
-		p = buf;
-	} else
-	if(nfd)
-		p = "fd";
-	else
-	if(nhd)
-		p = "hd";
-	else
-		p = "sd";
-
-	for(i = 0; nvrdevs[i].name; i++){
-		if(strcmp(p, nvrdevs[i].name) == 0){
-			dos.dev = dev;
-			if(nvrdevs[i].part && (*nvrdevs[i].part)(dos.dev, "disk") == 0)
-				break;
-			dos.read = nvrdevs[i].read;
-			dos.seek = nvrdevs[i].seek;
-			dos.write = nvrdevs[i].write;
-			break;
-		}
-	}
-	if(dos.read == 0)
-		panic("no device for nvram\n");
-	if(dosinit(&dos) < 0)
-		panic("can't init dos dosfs on %s\n", p);
-	splx(s);
-}
-
-void
-touser(void)
-{
-	int i;
-
-	settime(rtctime());
-	boottime = time();
-
-	print("sysinit\n");
-	sysinit();
-
-	userinit(floppyproc, 0, "floppyproc");
-	/*
-	 * Ethernet i/o processes
-	 */
-	etherstart();
-
-
-	/*
-	 * read ahead processes
-	 */
-	userinit(rahead, 0, "rah");
-
-	/*
-	 * server processes
-	 */
-	for(i=0; i<conf.nserve; i++)
-		userinit(serve, 0, "srv");
-
-	/*
-	 * worm "dump" copy process
-	 */
-	userinit(wormcopy, 0, "wcp");
-
-	/*
-	 * processes to read the console
-	 */
-	consserve();
-
-	/*
-	 * "sync" copy process
-	 * this doesn't return.
-	 */
-	u->text = "scp";
-	synccopy();
-}
-
-void
-localconfinit(void)
-{
-	/* conf.nfile = 60000; */	/* from emelie */
-	conf.nodump = 0;
-	conf.dumpreread = 1;
-	if (0)
-		conf.idedma = 0; /* for old machines */
-	conf.firstsb = 0;	/* time- & jukebox-dependent optimisation */
-	conf.recovsb = 0;	/* 971531 is 24 june 2003, before w3 died */
-	conf.ripoff = 1;
-	conf.nlgmsg = 1100;	/* @8576 bytes, for packets */
-	conf.nsmmsg = 500;	/* @128 bytes */
-
-	conf.minuteswest = 8*60;
-	conf.dsttime = 1;
-}
-
-int (*fsprotocol[])(Msgbuf*) = {
-	serve9p1,		/* do we still need 9P1? */
-	serve9p2,
-	nil,
-};

+ 0 - 35
sys/src/fs/fs/dat.h

@@ -1,35 +0,0 @@
-/*
- * The most fundamental constant.
- * The code will not compile with RBUFSIZE made a variable;
- * for one thing, RBUFSIZE determines FEPERBUF, which determines
- * the number of elements in a free-list-block array.
- */
-#define RBUFSIZE	(4*1024)	/* raw buffer size */
-
-#include "../port/portdat.h"
-
-extern	Mach	mach0;
-
-typedef struct Segdesc	Segdesc;
-struct Segdesc
-{
-	ulong	d0;
-	ulong	d1;
-};
-
-typedef struct Mbank {
-	ulong	base;
-	ulong	limit;
-} Mbank;
-
-#define MAXBANK		8
-
-typedef struct Mconf {
-	Lock;
-	Mbank	bank[MAXBANK];
-	int	nbank;
-	ulong	topofmem;
-} Mconf;
-extern Mconf mconf;
-
-extern char nvrfile[128];

+ 0 - 87
sys/src/fs/fs/fns.h

@@ -1,87 +0,0 @@
-ulong	strtoul(char*, char**, int);
-vlong	strtoll(char*, char**, int);
-
-#include "../port/portfns.h"
-
-void	aamloop(int);
-void	cgaputc(int);
-void	cgaputs(char*, int);
-int	cistrcmp(char*, char*);
-int	cistrncmp(char*, char*, int);
-void	(*coherence)(void);
-void	etherinit(void);
-void	etherstart(void);
-int	floppyinit(void);
-void	floppyproc(void);
-Off	floppyread(int, void*, long);
-Devsize	floppyseek(int, Devsize);
-Off	floppywrite(int, void*, long);
-void	fpinit(void);
-char*	getconf(char*);
-ulong	getcr0(void);
-ulong	getcr2(void);
-ulong	getcr4(void);
-int	getfields(char*, char**, int, int, char*);
-ulong	getstatus(void);
-int	atainit(void);
-Off	ataread(int, void*, long);
-Devsize	ataseek(int, Devsize);
-Off	atawrite(int, void*, long);
-void	i8042a20(void);
-void	i8042reset(void);
-int	inb(int);
-void	insb(int, void*, int);
-ushort	ins(int);
-void	inss(int, void*, int);
-ulong	inl(int);
-void	insl(int, void*, int);
-void	kbdinit(void);
-int	kbdintr0(void);
-int	kbdgetc(void);
-long*	mapaddr(ulong);
-void	microdelay(int);
-void	mmuinit(void);
-uchar	nvramread(int);
-void	outb(int, int);
-void	outsb(int, void*, int);
-void	outs(int, ushort);
-void	outss(int, void*, int);
-void	outl(int, ulong);
-void	outsl(int, void*, int);
-void	printcpufreq(void);
-void	putgdt(Segdesc*, int);
-void	putidt(Segdesc*, int);
-void	putcr3(ulong);
-void	putcr4(ulong);
-void	puttr(ulong);
-void	rdmsr(int, vlong*);
-void	wrmsr(int, vlong);
-void	(*cycles)(uvlong*);
-void	scsiinit(void);
-Off	scsiread(int, void*, long);
-Devsize	scsiseek(int, Devsize);
-Off	scsiwrite(int, void*, long);
-int	setatapart(int, char*);
-int	setscsipart(int, char*);
-void	setvec(int, void (*)(Ureg*, void*), void*);
-int	tas(Lock*);
-void	trapinit(void);
-void	uartspecial(int, void (*)(int), int (*)(void), int);
-int	uartgetc(void);
-void	uartputc(int);
-void	wbflush(void);
-void	cpuid(char*, int*, int*);
-
-#define PADDR(a)	((ulong)(a)&~KZERO)
-
-/* pata */
-void	ideinit(Device *d);
-Devsize	idesize(Device *d);
-int	ideread(Device *d,  Devsize, void*);
-int	idewrite(Device *d, Devsize, void*);
-
-/* sata */
-void	mvideinit(Device *d);
-Devsize	mvidesize(Device *d);
-int	mvideread(Device *d,  Devsize, void*);
-int	mvidewrite(Device *d, Devsize, void*);

+ 0 - 247
sys/src/fs/fs/io.h

@@ -1,247 +0,0 @@
-/*
- *  programmable interrupt vectors (for the 8259's)
- */
-enum
-{
-	Bptvec=		3,		/* breakpoints */
-	Mathemuvec=	7,		/* math coprocessor emulation interrupt */
-	Mathovervec=	9,		/* math coprocessor overrun interrupt */
-	Matherr1vec=	16,		/* math coprocessor error interrupt */
-	Faultvec=	14,		/* page fault */
-
-	Int0vec=	24,		/* first 8259 */
-	 Clockvec=	Int0vec+0,	/*  clock interrupts */
-	 Kbdvec=	Int0vec+1,	/*  keyboard interrupts */
-	 Uart1vec=	Int0vec+3,	/*  modem line */
-	 Uart0vec=	Int0vec+4,	/*  serial line */
-	 PCMCIAvec=	Int0vec+5,	/*  PCMCIA card change */
-	 Floppyvec=	Int0vec+6,	/*  floppy interrupts */
-	 Parallelvec=	Int0vec+7,	/*  parallel port interrupts */
-	Int1vec=	Int0vec+8,
-	 Ethervec=	Int0vec+10,	/*  ethernet interrupt */
-	 Mousevec=	Int0vec+12,	/*  mouse interrupt */
-	 Matherr2vec=	Int0vec+13,	/*  math coprocessor */
-	 ATA0vec=	Int0vec+14,	/*  hard disk */
-
-	Syscallvec=	64,
-};
-
-/*
- *  8259 interrupt controllers
- */
-enum
-{
-	Int0ctl=	0x20,		/* control port (ICW1, OCW2, OCW3) */
-	Int0aux=	0x21,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-	Int1ctl=	0xA0,		/* control port */
-	Int1aux=	0xA1,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-
-	Icw1=		0x10,		/* select bit in ctl register */
-	Ocw2=		0x00,
-	Ocw3=		0x08,
-
-	EOI=		0x20,		/* non-specific end of interrupt */
-
-	Elcr1=		0x4D0,		/* Edge/Level Triggered Register */
-	Elcr2=		0x4D1,
-};
-
-extern int	int0mask;		/* interrupts enabled for first 8259 */
-extern int	int1mask;		/* interrupts enabled for second 8259 */
-
-#define NVRAUTHADDR	0
-#define LINESIZE	0
-
-enum {
-	MaxEISA		= 16,
-	EISAconfig	= 0xC80,
-
-	MaxScsi		= 4,
-	NTarget		= 16,
-
-	MaxEther	= 4,
-};
-
-#define DMAOK(x, l)	((ulong)(((ulong)(x))+(l)) < (ulong)(KZERO|16*1024*1024))
-
-enum {
-	BusCBUS		= 0,		/* Corollary CBUS */
-	BusCBUSII,			/* Corollary CBUS II */
-	BusEISA,			/* Extended ISA */
-	BusFUTURE,			/* IEEE Futurebus */
-	BusINTERN,			/* Internal bus */
-	BusISA,				/* Industry Standard Architecture */
-	BusMBI,				/* Multibus I */
-	BusMBII,			/* Multibus II */
-	BusMCA,				/* Micro Channel Architecture */
-	BusMPI,				/* MPI */
-	BusMPSA,			/* MPSA */
-	BusNUBUS,			/* Apple Macintosh NuBus */
-	BusPCI,				/* Peripheral Component Interconnect */
-	BusPCMCIA,			/* PC Memory Card International Association */
-	BusTC,				/* DEC TurboChannel */
-	BusVL,				/* VESA Local bus */
-	BusVME,				/* VMEbus */
-	BusXPRESS,			/* Express System Bus */
-};
-
-#define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
-#define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
-#define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
-#define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
-#define BUSTYPE(tbdf)	((tbdf)>>24)
-#define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
-#define BUSUNKNOWN	(-1)
-
-/*
- * PCI support code.
- */
-enum {					/* type 0 and type 1 pre-defined header */
-	PciVID		= 0x00,		/* vendor ID */
-	PciDID		= 0x02,		/* device ID */
-	PciPCR		= 0x04,		/* command */
-	PciPSR		= 0x06,		/* status */
-	PciRID		= 0x08,		/* revision ID */
-	PciCCRp		= 0x09,		/* programming interface class code */
-	PciCCRu		= 0x0A,		/* sub-class code */
-	PciCCRb		= 0x0B,		/* base class code */
-	PciCLS		= 0x0C,		/* cache line size */
-	PciLTR		= 0x0D,		/* latency timer */
-	PciHDT		= 0x0E,		/* header type */
-	PciBST		= 0x0F,		/* BIST */
-
-	PciBAR0		= 0x10,		/* base address */
-	PciBAR1		= 0x14,
-
-	PciINTL		= 0x3C,		/* interrupt line */
-	PciINTP		= 0x3D,		/* interrupt pin */
-};
-
-enum {					/* type 0 pre-defined header */
-	PciBAR2		= 0x18,
-	PciBAR3		= 0x1C,
-	PciBAR4		= 0x20,
-	PciBAR5		= 0x24,
-	PciCIS		= 0x28,		/* cardbus CIS pointer */
-	PciSVID		= 0x2C,		/* subsystem vendor ID */
-	PciSID		= 0x2E,		/* cardbus CIS pointer */
-	PciEBAR0	= 0x30,		/* expansion ROM base address */
-	PciMGNT		= 0x3E,		/* burst period length */
-	PciMLT		= 0x3F,		/* maximum latency between bursts */
-};
-
-enum {					/* type 1 pre-defined header */
-	PciPBN		= 0x18,		/* primary bus number */
-	PciSBN		= 0x19,		/* secondary bus number */
-	PciUBN		= 0x1A,		/* subordinate bus number */
-	PciSLTR		= 0x1B,		/* secondary latency timer */
-	PciIBR		= 0x1C,		/* I/O base */
-	PciILR		= 0x1D,		/* I/O limit */
-	PciSPSR		= 0x1E,		/* secondary status */
-	PciMBR		= 0x20,		/* memory base */
-	PciMLR		= 0x22,		/* memory limit */
-	PciPMBR		= 0x24,		/* prefetchable memory base */
-	PciPMLR		= 0x26,		/* prefetchable memory limit */
-	PciPUBR		= 0x28,		/* prefetchable base upper 32 bits */
-	PciPULR		= 0x2C,		/* prefetchable limit upper 32 bits */
-	PciIUBR		= 0x30,		/* I/O base upper 16 bits */
-	PciIULR		= 0x32,		/* I/O limit upper 16 bits */
-	PciEBAR1	= 0x28,		/* expansion ROM base address */
-	PciBCR		= 0x3E,		/* bridge control register */
-};
-
-typedef struct Pcidev Pcidev;
-typedef struct Pcidev {
-	int	tbdf;			/* type+bus+device+function */
-	ushort	vid;			/* vendor ID */
-	ushort	did;			/* device ID */
-
-	struct {
-		ulong	bar;		/* base address */
-		int	size;
-	} mem[6];
-
-	uchar	rid;
-	uchar	ccrp;
-	uchar	ccrb;
-	uchar	intl;			/* interrupt line */
-	ushort	ccru;			/* is uchar in cpu kernel */
-	ulong	pcr;
-
-	Pcidev*	list;
-	Pcidev*	bridge;			/* down a bus */
-	Pcidev*	link;			/* next device on this bno */
-} Pcidev;
-
-extern int pcicfgr8(Pcidev*, int);
-extern int pcicfgr16(Pcidev*, int);
-extern int pcicfgr32(Pcidev*, int);
-extern void pcicfgw8(Pcidev*, int, int);
-extern void pcicfgw16(Pcidev*, int, int);
-extern void pcicfgw32(Pcidev*, int, int);
-extern void pciclrmwi(Pcidev*);
-extern void pcihinv(Pcidev*, ulong);
-extern Pcidev* pcimatch(Pcidev*, int, int);
-extern Pcidev* pcimatchtbdf(int);
-extern void pcireset(void);
-extern void pcisetbme(Pcidev*);
-extern void pciclrbme(Pcidev*);
-
-/*
- *  a parsed plan9.ini line
- */
-#define ISAOPTLEN	16
-#define NISAOPT		8
-
-typedef struct ISAConf {
-	char	type[NAMELEN];
-	ulong	port;
-	ulong	irq;
-	ulong	dma;
-	ulong	mem;
-	ulong	size;
-	ulong	freq;
-
-	int	nopt;
-	char	opt[NISAOPT][ISAOPTLEN];
-} ISAConf;
-
-extern int isaconfig(char*, int, ISAConf*);
-
-/*
- * SCSI support code.
- */
-enum {
-	STblank		=-6,		/* blank block */
-	STnomem		=-5,		/* buffer allocation failed */
-	STtimeout	=-4,		/* bus timeout */
-	STownid		=-3,		/* playing with myself */
-	STharderr	=-2,		/* controller error of some kind */
-	STinit		=-1,		/* */
-	STok		= 0,		/* good */
-	STcheck		= 0x02,		/* check condition */
-	STcondmet	= 0x04,		/* condition met/good */
-	STbusy		= 0x08,		/* busy */
-	STintok		= 0x10,		/* intermediate/good */
-	STintcondmet	= 0x14,		/* intermediate/condition met/good */
-	STresconf	= 0x18,		/* reservation conflict */
-	STterminated	= 0x22,		/* command terminated */
-	STqfull		= 0x28,		/* queue full */
-};
-
-typedef struct Target {
-	int	ctlrno;
-	int	targetno;
-	uchar*	inquiry;
-	uchar*	sense;
-
-	QLock;
-	char	id[NAMELEN];
-	int	ok;
-
-	char	fflag;
-	Filter	work[3];
-	Filter	rate[3];
-} Target;
-
-typedef int (*Scsiio)(Target*, int, uchar*, int, void*, int*);

+ 0 - 85
sys/src/fs/fs/mem.h

@@ -1,85 +0,0 @@
-#define	BY2WD		4			/* bytes per word */
-#define BY2V		8			/* bytes per vlong */
-#define	BY2PG		4096			/* bytes per page */
-#define	PGSHIFT		12			/* log(BY2PG) */
-#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))
-#define MB		(1024*1024)
-
-#define	HZ		(82)			/* clock frequency */
-#define	TK2MS(t)	(((ulong)(t)*1000)/HZ)	/* ticks to milliseconds - beware rounding */
-#define	MS2TK(t)	(((ulong)(t)*HZ)/1000)	/* milliseconds to ticks - beware rounding */
-#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
-
-/*
- * Fundamental addresses
- */
-#define IDTADDR		0x80000800		/* idt */
-#define APBOOTSTRAP	0x80001000		/* AP bootstrap code */
-#define CONFADDR	0x80001200		/* info passed from boot loader */
-#define CPU0PDB		0x80002000		/* bootstrap processor PDB */
-#define CPU0PTE		0x80003000		/* bootstrap processor PTE's for 0-2MB */
-#define CPU0MACHPTE	0x80004000		/* bootstrap processor PTE for MACHADDR */
-#define CPU0MACH	0x80005000		/* Mach for bootstrap processor */
-
-#define	KZERO		0x80000000		/* base of kernel address space */
-#define	KTZERO		0x80100000		/* first address in kernel text */
-
-#define	MACHSIZE	4096
-
-/*
- *  known 80386 segments (in GDT) and their selectors
- */
-#define	NULLSEG	0	/* null segment */
-#define	KDSEG	1	/* kernel data/stack */
-#define	KESEG	2	/* kernel executable */	
-#define	UDSEG	3	/* user data/stack */
-#define	UESEG	4	/* user executable */
-#define TSSSEG	5	/* task segment */
-#define N386SEG	6	/* number of segments */
-
-#define SELGDT	(0<<3)	/* selector is in gdt */
-#define	SELLDT	(1<<3)	/* selector is in ldt */
-
-#define SELECTOR(i, t, p)	(((i)<<3) | (t) | (p))
-
-#define NULLSEL	SELECTOR(NULLSEG, SELGDT, 0)
-#define KESEL	SELECTOR(KESEG, SELGDT, 0)
-#define KDSEL	SELECTOR(KDSEG, SELGDT, 0)
-#define UESEL	SELECTOR(UESEG, SELGDT, 3)
-#define UDSEL	SELECTOR(UDSEG, SELGDT, 3)
-#define TSSSEL	SELECTOR(TSSSEG, SELGDT, 0)
-
-/*
- *  fields in segment descriptors
- */
-#define SEGDATA	(0x10<<8)	/* data/stack segment */
-#define SEGEXEC	(0x18<<8)	/* executable segment */
-#define	SEGTSS	(0x9<<8)	/* TSS segment */
-#define SEGCG	(0x0C<<8)	/* call gate */
-#define	SEGIG	(0x0E<<8)	/* interrupt gate */
-#define SEGTG	(0x0F<<8)	/* task gate */
-#define SEGTYPE	(0x1F<<8)
-
-#define SEGP	(1<<15)		/* segment present */
-#define SEGPL(x) ((x)<<13)	/* priority level */
-#define SEGB	(1<<22)		/* granularity 1==4k (for expand-down) */
-#define SEGG	(1<<23)		/* granularity 1==4k (for other) */
-#define SEGE	(1<<10)		/* expand down */
-#define SEGW	(1<<9)		/* writable (for data/stack) */
-#define	SEGR	(1<<9)		/* readable (for code) */
-#define SEGD	(1<<22)		/* default 1==32bit (for code) */
-
-/*
- *  physical MMU
- */
-#define	PTEVALID	(1<<0)
-#define	PTEUNCACHED	(1<<4)	
-#define PTEWRITE	(1<<1)
-#define	PTERONLY	(0<<1)
-#define	PTEKERNEL	(0<<2)
-#define	PTEUSER		(1<<2)
-#define PTESIZE		(1<<7)
-
-#define MACHADDR	((ulong)&mach0)		/* hack number 1 */
-
-#define IFLAG		0x200	/* psw: interrupt enable, to be accurate */

+ 0 - 147
sys/src/fs/fs/mkfile

@@ -1,147 +0,0 @@
-CONF=fs
-p=9
-
-objtype=386
-</$objtype/mkfile
-
-TARG=$p$CONF'fs'
-
-DEV=\
-	apc.$O\
-	cw.$O\
-	fworm.$O\
-	juke.$O\
-	mworm.$O\
-	wren.$O\
-
-IP=\
-	arp.$O\
-	icmp.$O\
-	il.$O\
-	ip.$O\
-	ipaux.$O\
-	iproute.$O\
-	sntp.$O\
-	udp.$O\
-
-PORT=\
-	9p1.$O\
-	9p1lib.$O\
-	9p2.$O\
-	auth.$O\
-	chk.$O\
-	clock.$O\
-	con.$O\
-	config.$O\
-	console.$O\
-	data.$O\
-	dentry.$O\
-	devcons.$O\
-	fcmd.$O\
-	iobuf.$O\
-	lrand.$O\
-	main.$O\
-	print.$O\
-	proc.$O\
-	sub.$O\
-	time.$O\
-	uidgid.$O\
-
-PC=\
-	l.$O\
-	8250.$O\
-	8253.$O\
-	cga.$O\
-	devsd.$O\
-	sdscsi.$O\
-	sdata.$O\
-	sdmv50xx.$O\
-	dosfs.$O\
-	floppy.$O\
-	kbd.$O\
-	lock.$O\
-	malloc.$O\
-	mmu.$O\
-	nvr.$O\
-	pc.$O\
-	pci.$O\
-	toy.$O\
-	trap.$O\
-
-ETHER=\
-	compat.$O\
-	ether2114x.$O\
-	ether8139.$O\
-	ether8169.$O\
-	ether82557.$O\
-	ether82563.$O\
-	ether83815.$O\
-	etherdp83820.$O\
-	etherelnk3.$O\
-	etherga620.$O\
-	etherif.$O\
-	etherigbe.$O\
-	ethermii.$O\
-
-SCSI=\
-	scsi.$O\
-	scsibuslogic.$O\
-	scsincr53c8xx.$O\
-
-OBJ=\
-	$PC\
-	$PORT\
-	$DEV\
-	$IP\
-	$ETHER\
-	$SCSI\
-
-HFILES=\
-	../port/all.h\
-	../port/lib.h\
-	../port/portdat.h\
-	../port/portfns.h\
-	dat.h\
-	fns.h\
-	io.h\
-	mem.h\
-	/$objtype/include/u.h\
-	/$objtype/include/ureg.h\
-
-LIB=\
-	-lauthsrv\
-	-lc\
-	-lsec\
-
-# -I../pc & -DFS are for compat.h
-# -DOLD uses 32-bit file offsets instead of 64-bit ones
-CFLAGS=-FTVw -I. -I../port -I../pc -DFS -DOLD
-
-all:V:	$TARG
-
-<../pc/mkfile
-<../port/mkfile
-<../dev/mkfile
-<../ip/mkfile
-
-$TARG:	$TARG.c $OBJ
-	$CC $CFLAGS -DDATE'='`{date -n} $TARG.c
-	$LD -o $target -l -T0x80100020 $OBJ $TARG.$O $LIB
-	size $target
-
-install:V: $TARG
-	cp $TARG /$objtype/
-	9fs stand && cp -x $TARG /n/stand/$objtype
-
-$TARG.$O:	../pc/dosfs.h
-
-%.$O:	%.c
-	$CC $CFLAGS $stem.c
-
-%.$O:	%.s
-	$AS $stem.s
-
-%.$O:	$HFILES
-
-clean:V:
-	rm -f *.[$OS] [$OS].out $TARG

+ 0 - 192
sys/src/fs/fs64/9fsfs64.c

@@ -1,192 +0,0 @@
-#include "all.h"
-#include "mem.h"
-#include "io.h"
-#include "ureg.h"
-
-#include "../pc/dosfs.h"
-
-void	apcinit(void);
-int	sdinit(void);
-
-/*
- * setting this to zero permits the use of discs of different sizes, but
- * can make jukeinit() quite slow while the robotics work through each disc
- * twice (once per side).
- */
-int FIXEDSIZE = 1;
-
-#ifndef	DATE
-#define	DATE	1094098624L
-#endif
-
-Timet	mktime		= DATE;				/* set by mkfile */
-Startsb	startsb[] =
-{
-	"main",		2,	/* */
-/*	"main",		810988,	/* discontinuity before sb @ 696262 */
-	0
-};
-
-Dos dos;
-
-static struct
-{
-	char	*name;
-	Off	(*read)(int, void*, long);
-	Devsize	(*seek)(int, Devsize);
-	Off	(*write)(int, void*, long);
-	int	(*part)(int, char*);
-} nvrdevs[] = {
-	{ "fd", floppyread,	floppyseek,	floppywrite, 0, },
-	{ "hd", ataread,	ataseek,	atawrite,	setatapart, },
-	{ "md", mvsataread,	mvsataseek,	mvsatawrite,	setmv50part, },
-/*	{ "sd", scsiread,	scsiseek,	scsiwrite,	setscsipart, },  */
-	{ 0, },
-};
-
-void
-otherinit(void)
-{
-	int dev, i, nfd, nhd, s;
-	char *p, *q, buf[sizeof(nvrfile)+8];
-
-	kbdinit();
-	printcpufreq();
-	etherinit();
-	scsiinit();
-	apcinit();
-
-	s = spllo();
-	sdinit();
-	nhd = atainit();	/* harmless to call again */
-	mvsatainit();		/* harmless to call again */
-	nfd = floppyinit();
-	dev = 0;
-	if(p = getconf("nvr")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed nvrfile: %s\n", buf);
-		*p++ = 0;
-		*q++ = 0;
-		dev = strtoul(p, 0, 0);
-		strcpy(nvrfile, q);
-		p = buf;
-	} else
-	if(p = getconf("bootfile")){
-		strncpy(buf, p, sizeof(buf)-2);
-		buf[sizeof(buf)-1] = 0;
-		p = strchr(buf, '!');
-		q = strrchr(buf, '!');
-		if(p == 0 || q == 0 || strchr(p+1, '!') != q)
-			panic("malformed bootfile: %s\n", buf);
-		*p++ = 0;
-		*q = 0;
-		dev = strtoul(p, 0, 0);
-		p = buf;
-	} else
-	if(nfd)
-		p = "fd";
-	else
-	if(nhd)
-		p = "hd";
-	else
-		p = "sd";
-
-	for(i = 0; nvrdevs[i].name; i++){
-		if(strcmp(p, nvrdevs[i].name) == 0){
-			dos.dev = dev;
-			if (nvrdevs[i].part &&
-			    (*nvrdevs[i].part)(dos.dev, "disk") == 0)
-				break;
-			dos.read = nvrdevs[i].read;
-			dos.seek = nvrdevs[i].seek;
-			dos.write = nvrdevs[i].write;
-			break;
-		}
-	}
-	if(dos.read == 0)
-		panic("no device (%s) for nvram\n", p);
-	if(dosinit(&dos) < 0)
-		panic("can't init dos dosfs on %s\n", p);
-	splx(s);
-}
-
-static int
-isdawn(void *)
-{
-	return predawn == 0;
-}
-
-void
-touser(void)
-{
-	int i;
-
-	settime(rtctime());
-	boottime = time();
-
-	/* wait for predawn to change to zero to avoid confusing print */
-	sleep(&dawnrend, isdawn, 0);
-	print("sysinit\n");
-	sysinit();
-
-	userinit(floppyproc, 0, "floppyproc");
-	/*
-	 * Ethernet i/o processes
-	 */
-	etherstart();
-
-
-	/*
-	 * read ahead processes
-	 */
-	userinit(rahead, 0, "rah");
-
-	/*
-	 * server processes
-	 */
-	for(i=0; i<conf.nserve; i++)
-		userinit(serve, 0, "srv");
-
-	/*
-	 * worm "dump" copy process
-	 */
-	userinit(wormcopy, 0, "wcp");
-
-	/*
-	 * processes to read the console
-	 */
-	consserve();
-
-	/*
-	 * "sync" copy process
-	 * this doesn't return.
-	 */
-	u->text = "scp";
-	synccopy();
-}
-
-void
-localconfinit(void)
-{
-	/* conf.nfile = 60000; */	/* from emelie */
-	conf.nodump = 0;
-	conf.dumpreread = 1;
-	conf.firstsb = 0;	/* time- & jukebox-dependent optimisation */
-	conf.recovsb = 0;	/* 971531 is 24 june 2003, before w3 died */
-	conf.ripoff = 1;
-	conf.nlgmsg = 1100;	/* @8576 bytes, for packets */
-	conf.nsmmsg = 500;	/* @128 bytes */
-
-	conf.minuteswest = 8*60;
-	conf.dsttime = 1;
-}
-
-int (*fsprotocol[])(Msgbuf*) = {
-	/* 64-bit file servers can't serve 9P1 correctly: NAMELEN is too big */
-	serve9p2,
-	nil,
-};

+ 0 - 35
sys/src/fs/fs64/dat.h

@@ -1,35 +0,0 @@
-/*
- * The most fundamental constant.
- * The code will not compile with RBUFSIZE made a variable;
- * for one thing, RBUFSIZE determines FEPERBUF, which determines
- * the number of elements in a free-list-block array.
- */
-#define RBUFSIZE	(8*1024)	/* raw buffer size */
-
-#include "../port/portdat.h"
-
-extern	Mach	mach0;
-
-typedef struct Segdesc	Segdesc;
-struct Segdesc
-{
-	ulong	d0;
-	ulong	d1;
-};
-
-typedef struct Mbank {
-	ulong	base;
-	ulong	limit;
-} Mbank;
-
-#define MAXBANK		8
-
-typedef struct Mconf {
-	Lock;
-	Mbank	bank[MAXBANK];
-	int	nbank;
-	ulong	topofmem;
-} Mconf;
-extern Mconf mconf;
-
-extern char nvrfile[128];

+ 0 - 92
sys/src/fs/fs64/fns.h

@@ -1,92 +0,0 @@
-ulong	strtoul(char*, char**, int);
-vlong	strtoll(char*, char**, int);
-
-#include "../port/portfns.h"
-
-void	aamloop(int);
-void	cgaputc(int);
-void	cgaputs(char*, int);
-int	cistrcmp(char*, char*);
-int	cistrncmp(char*, char*, int);
-void	(*coherence)(void);
-void	etherinit(void);
-void	etherstart(void);
-int	floppyinit(void);
-void	floppyproc(void);
-Off	floppyread(int, void*, long);
-Devsize	floppyseek(int, Devsize);
-Off	floppywrite(int, void*, long);
-void	fpinit(void);
-char*	getconf(char*);
-ulong	getcr0(void);
-ulong	getcr2(void);
-ulong	getcr4(void);
-int	getfields(char*, char**, int, int, char*);
-ulong	getstatus(void);
-int	atainit(void);
-Off	ataread(int, void*, long);
-Devsize	ataseek(int, Devsize);
-Off	atawrite(int, void*, long);
-void	i8042a20(void);
-void	i8042reset(void);
-int	inb(int);
-void	insb(int, void*, int);
-ushort	ins(int);
-void	inss(int, void*, int);
-ulong	inl(int);
-void	insl(int, void*, int);
-void	kbdinit(void);
-int	kbdintr0(void);
-int	kbdgetc(void);
-long*	mapaddr(ulong);
-void	microdelay(int);
-void	mmuinit(void);
-uchar	nvramread(int);
-void	outb(int, int);
-void	outsb(int, void*, int);
-void	outs(int, ushort);
-void	outss(int, void*, int);
-void	outl(int, ulong);
-void	outsl(int, void*, int);
-void	printcpufreq(void);
-void	putgdt(Segdesc*, int);
-void	putidt(Segdesc*, int);
-void	putcr3(ulong);
-void	putcr4(ulong);
-void	puttr(ulong);
-void	rdmsr(int, vlong*);
-void	wrmsr(int, vlong);
-void	(*cycles)(uvlong*);
-void	scsiinit(void);
-Off	scsiread(int, void*, long);
-Devsize	scsiseek(int, Devsize);
-Off	scsiwrite(int, void*, long);
-int	setatapart(int, char*);
-int	setscsipart(int, char*);
-void	setvec(int, void (*)(Ureg*, void*), void*);
-int	tas(Lock*);
-void	trapinit(void);
-void	uartspecial(int, void (*)(int), int (*)(void), int);
-int	uartgetc(void);
-void	uartputc(int);
-void	wbflush(void);
-void	cpuid(char*, int*, int*);
-
-#define PADDR(a)	((ulong)(a)&~KZERO)
-
-/* pata */
-void	ideinit(Device *d);
-Devsize	idesize(Device *d);
-int	ideread(Device *d,  Devsize, void*);
-int	idewrite(Device *d, Devsize, void*);
-
-/* marvell sata */
-void	mvideinit(Device *d);
-Devsize	mvidesize(Device *d);
-int	mvideread(Device *d,  Devsize, void*);
-int	mvidewrite(Device *d, Devsize, void*);
-int	mvsatainit(void);
-Off	mvsataread(int, void*, long);
-Devsize	mvsataseek(int, Devsize);
-Off	mvsatawrite(int, void*, long);
-int	setmv50part(int, char*);

+ 0 - 247
sys/src/fs/fs64/io.h

@@ -1,247 +0,0 @@
-/*
- *  programmable interrupt vectors (for the 8259's)
- */
-enum
-{
-	Bptvec=		3,		/* breakpoints */
-	Mathemuvec=	7,		/* math coprocessor emulation interrupt */
-	Mathovervec=	9,		/* math coprocessor overrun interrupt */
-	Matherr1vec=	16,		/* math coprocessor error interrupt */
-	Faultvec=	14,		/* page fault */
-
-	Int0vec=	24,		/* first 8259 */
-	 Clockvec=	Int0vec+0,	/*  clock interrupts */
-	 Kbdvec=	Int0vec+1,	/*  keyboard interrupts */
-	 Uart1vec=	Int0vec+3,	/*  modem line */
-	 Uart0vec=	Int0vec+4,	/*  serial line */
-	 PCMCIAvec=	Int0vec+5,	/*  PCMCIA card change */
-	 Floppyvec=	Int0vec+6,	/*  floppy interrupts */
-	 Parallelvec=	Int0vec+7,	/*  parallel port interrupts */
-	Int1vec=	Int0vec+8,
-	 Ethervec=	Int0vec+10,	/*  ethernet interrupt */
-	 Mousevec=	Int0vec+12,	/*  mouse interrupt */
-	 Matherr2vec=	Int0vec+13,	/*  math coprocessor */
-	 ATA0vec=	Int0vec+14,	/*  hard disk */
-
-	Syscallvec=	64,
-};
-
-/*
- *  8259 interrupt controllers
- */
-enum
-{
-	Int0ctl=	0x20,		/* control port (ICW1, OCW2, OCW3) */
-	Int0aux=	0x21,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-	Int1ctl=	0xA0,		/* control port */
-	Int1aux=	0xA1,		/* everything else (ICW2, ICW3, ICW4, OCW1) */
-
-	Icw1=		0x10,		/* select bit in ctl register */
-	Ocw2=		0x00,
-	Ocw3=		0x08,
-
-	EOI=		0x20,		/* non-specific end of interrupt */
-
-	Elcr1=		0x4D0,		/* Edge/Level Triggered Register */
-	Elcr2=		0x4D1,
-};
-
-extern int	int0mask;		/* interrupts enabled for first 8259 */
-extern int	int1mask;		/* interrupts enabled for second 8259 */
-
-#define NVRAUTHADDR	0
-#define LINESIZE	0
-
-enum {
-	MaxEISA		= 16,
-	EISAconfig	= 0xC80,
-
-	MaxScsi		= 4,
-	NTarget		= 16,
-
-	MaxEther	= 4,
-};
-
-#define DMAOK(x, l)	((ulong)(((ulong)(x))+(l)) < (ulong)(KZERO|16*1024*1024))
-
-enum {
-	BusCBUS		= 0,		/* Corollary CBUS */
-	BusCBUSII,			/* Corollary CBUS II */
-	BusEISA,			/* Extended ISA */
-	BusFUTURE,			/* IEEE Futurebus */
-	BusINTERN,			/* Internal bus */
-	BusISA,				/* Industry Standard Architecture */
-	BusMBI,				/* Multibus I */
-	BusMBII,			/* Multibus II */
-	BusMCA,				/* Micro Channel Architecture */
-	BusMPI,				/* MPI */
-	BusMPSA,			/* MPSA */
-	BusNUBUS,			/* Apple Macintosh NuBus */
-	BusPCI,				/* Peripheral Component Interconnect */
-	BusPCMCIA,			/* PC Memory Card International Association */
-	BusTC,				/* DEC TurboChannel */
-	BusVL,				/* VESA Local bus */
-	BusVME,				/* VMEbus */
-	BusXPRESS,			/* Express System Bus */
-};
-
-#define MKBUS(t,b,d,f)	(((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8))
-#define BUSFNO(tbdf)	(((tbdf)>>8)&0x07)
-#define BUSDNO(tbdf)	(((tbdf)>>11)&0x1F)
-#define BUSBNO(tbdf)	(((tbdf)>>16)&0xFF)
-#define BUSTYPE(tbdf)	((tbdf)>>24)
-#define BUSBDF(tbdf)	((tbdf)&0x00FFFF00)
-#define BUSUNKNOWN	(-1)
-
-/*
- * PCI support code.
- */
-enum {					/* type 0 and type 1 pre-defined header */
-	PciVID		= 0x00,		/* vendor ID */
-	PciDID		= 0x02,		/* device ID */
-	PciPCR		= 0x04,		/* command */
-	PciPSR		= 0x06,		/* status */
-	PciRID		= 0x08,		/* revision ID */
-	PciCCRp		= 0x09,		/* programming interface class code */
-	PciCCRu		= 0x0A,		/* sub-class code */
-	PciCCRb		= 0x0B,		/* base class code */
-	PciCLS		= 0x0C,		/* cache line size */
-	PciLTR		= 0x0D,		/* latency timer */
-	PciHDT		= 0x0E,		/* header type */
-	PciBST		= 0x0F,		/* BIST */
-
-	PciBAR0		= 0x10,		/* base address */
-	PciBAR1		= 0x14,
-
-	PciINTL		= 0x3C,		/* interrupt line */
-	PciINTP		= 0x3D,		/* interrupt pin */
-};
-
-enum {					/* type 0 pre-defined header */
-	PciBAR2		= 0x18,
-	PciBAR3		= 0x1C,
-	PciBAR4		= 0x20,
-	PciBAR5		= 0x24,
-	PciCIS		= 0x28,		/* cardbus CIS pointer */
-	PciSVID		= 0x2C,		/* subsystem vendor ID */
-	PciSID		= 0x2E,		/* cardbus CIS pointer */
-	PciEBAR0	= 0x30,		/* expansion ROM base address */
-	PciMGNT		= 0x3E,		/* burst period length */
-	PciMLT		= 0x3F,		/* maximum latency between bursts */
-};
-
-enum {					/* type 1 pre-defined header */
-	PciPBN		= 0x18,		/* primary bus number */
-	PciSBN		= 0x19,		/* secondary bus number */
-	PciUBN		= 0x1A,		/* subordinate bus number */
-	PciSLTR		= 0x1B,		/* secondary latency timer */
-	PciIBR		= 0x1C,		/* I/O base */
-	PciILR		= 0x1D,		/* I/O limit */
-	PciSPSR		= 0x1E,		/* secondary status */
-	PciMBR		= 0x20,		/* memory base */
-	PciMLR		= 0x22,		/* memory limit */
-	PciPMBR		= 0x24,		/* prefetchable memory base */
-	PciPMLR		= 0x26,		/* prefetchable memory limit */
-	PciPUBR		= 0x28,		/* prefetchable base upper 32 bits */
-	PciPULR		= 0x2C,		/* prefetchable limit upper 32 bits */
-	PciIUBR		= 0x30,		/* I/O base upper 16 bits */
-	PciIULR		= 0x32,		/* I/O limit upper 16 bits */
-	PciEBAR1	= 0x28,		/* expansion ROM base address */
-	PciBCR		= 0x3E,		/* bridge control register */
-};
-
-typedef struct Pcidev Pcidev;
-typedef struct Pcidev {
-	int	tbdf;			/* type+bus+device+function */
-	ushort	vid;			/* vendor ID */
-	ushort	did;			/* device ID */
-
-	struct {
-		ulong	bar;		/* base address */
-		int	size;
-	} mem[6];
-
-	uchar	rid;
-	uchar	ccrp;
-	uchar	ccrb;
-	uchar	intl;			/* interrupt line */
-	ushort	ccru;			/* is uchar in cpu kernel */
-	ulong	pcr;
-
-	Pcidev*	list;
-	Pcidev*	bridge;			/* down a bus */
-	Pcidev*	link;			/* next device on this bno */
-} Pcidev;
-
-extern int pcicfgr8(Pcidev*, int);
-extern int pcicfgr16(Pcidev*, int);
-extern int pcicfgr32(Pcidev*, int);
-extern void pcicfgw8(Pcidev*, int, int);
-extern void pcicfgw16(Pcidev*, int, int);
-extern void pcicfgw32(Pcidev*, int, int);
-extern void pciclrmwi(Pcidev*);
-extern void pcihinv(Pcidev*, ulong);
-extern Pcidev* pcimatch(Pcidev*, int, int);
-extern Pcidev* pcimatchtbdf(int);
-extern void pcireset(void);
-extern void pcisetbme(Pcidev*);
-extern void pciclrbme(Pcidev*);
-
-/*
- *  a parsed plan9.ini line
- */
-#define ISAOPTLEN	16
-#define NISAOPT		8
-
-typedef struct ISAConf {
-	char	type[NAMELEN];
-	ulong	port;
-	ulong	irq;
-	ulong	dma;
-	ulong	mem;
-	ulong	size;
-	ulong	freq;
-
-	int	nopt;
-	char	opt[NISAOPT][ISAOPTLEN];
-} ISAConf;
-
-extern int isaconfig(char*, int, ISAConf*);
-
-/*
- * SCSI support code.
- */
-enum {
-	STblank		=-6,		/* blank block */
-	STnomem		=-5,		/* buffer allocation failed */
-	STtimeout	=-4,		/* bus timeout */
-	STownid		=-3,		/* playing with myself */
-	STharderr	=-2,		/* controller error of some kind */
-	STinit		=-1,		/* */
-	STok		= 0,		/* good */
-	STcheck		= 0x02,		/* check condition */
-	STcondmet	= 0x04,		/* condition met/good */
-	STbusy		= 0x08,		/* busy */
-	STintok		= 0x10,		/* intermediate/good */
-	STintcondmet	= 0x14,		/* intermediate/condition met/good */
-	STresconf	= 0x18,		/* reservation conflict */
-	STterminated	= 0x22,		/* command terminated */
-	STqfull		= 0x28,		/* queue full */
-};
-
-typedef struct Target {
-	int	ctlrno;
-	int	targetno;
-	uchar*	inquiry;
-	uchar*	sense;
-
-	QLock;
-	char	id[NAMELEN];
-	int	ok;
-
-	char	fflag;
-	Filter	work[3];
-	Filter	rate[3];
-} Target;
-
-typedef int (*Scsiio)(Target*, int, uchar*, int, void*, int*);

+ 0 - 89
sys/src/fs/fs64/mem.h

@@ -1,89 +0,0 @@
-#define	BY2WD		4			/* bytes per word */
-#define BY2V		8			/* bytes per vlong */
-#define	BY2PG		4096			/* bytes per page */
-#define	PGSHIFT		12			/* log(BY2PG) */
-#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))
-#define MB		(1024*1024)
-
-#define	HZ		(82)			/* clock frequency */
-#define	TK2MS(t)	(((ulong)(t)*1000)/HZ)	/* ticks to milliseconds - beware rounding */
-#define	MS2TK(t)	(((ulong)(t)*HZ)/1000)	/* milliseconds to ticks - beware rounding */
-#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
-
-/*
- * Fundamental addresses
- */
-/*
- * KZERO == 0 or 0x80000000 will work fine.  0x10000000 will work but limit
- * usable memory to 256MB.
- */
-#define	KZERO		0x80000000	/* base of kernel address space */
-#define	KTZERO		(KZERO+0x100000) /* first address in kernel text */
-
-#define IDTADDR		(KZERO+0x800)	/* idt */
-#define APBOOTSTRAP	(KZERO+0x1000)	/* AP bootstrap code */
-#define CONFADDR	(KZERO+0x1200)	/* info passed from boot loader */
-#define CPU0PDB		(KZERO+0x2000)	/* bootstrap processor PDB */
-#define CPU0PTE		(KZERO+0x3000)	/* bootstrap processor PTE's for 0-2MB */
-#define CPU0MACHPTE	(KZERO+0x4000)	/* bootstrap processor PTE for MACHADDR */
-#define CPU0MACH	(KZERO+0x5000)	/* Mach for bootstrap processor */
-
-#define	MACHSIZE	4096
-
-/*
- *  known 80386 segments (in GDT) and their selectors
- */
-#define	NULLSEG	0	/* null segment */
-#define	KDSEG	1	/* kernel data/stack */
-#define	KESEG	2	/* kernel executable */
-#define	UDSEG	3	/* user data/stack */
-#define	UESEG	4	/* user executable */
-#define TSSSEG	5	/* task segment */
-#define N386SEG	6	/* number of segments */
-
-#define SELGDT	(0<<3)	/* selector is in gdt */
-#define	SELLDT	(1<<3)	/* selector is in ldt */
-
-#define SELECTOR(i, t, p)	(((i)<<3) | (t) | (p))
-
-#define NULLSEL	SELECTOR(NULLSEG, SELGDT, 0)
-#define KESEL	SELECTOR(KESEG, SELGDT, 0)
-#define KDSEL	SELECTOR(KDSEG, SELGDT, 0)
-#define UESEL	SELECTOR(UESEG, SELGDT, 3)
-#define UDSEL	SELECTOR(UDSEG, SELGDT, 3)
-#define TSSSEL	SELECTOR(TSSSEG, SELGDT, 0)
-
-/*
- *  fields in segment descriptors
- */
-#define SEGDATA	(0x10<<8)	/* data/stack segment */
-#define SEGEXEC	(0x18<<8)	/* executable segment */
-#define	SEGTSS	(0x9<<8)	/* TSS segment */
-#define SEGCG	(0x0C<<8)	/* call gate */
-#define	SEGIG	(0x0E<<8)	/* interrupt gate */
-#define SEGTG	(0x0F<<8)	/* task gate */
-#define SEGTYPE	(0x1F<<8)
-
-#define SEGP	(1<<15)		/* segment present */
-#define SEGPL(x) ((x)<<13)	/* priority level */
-#define SEGB	(1<<22)		/* granularity 1==4k (for expand-down) */
-#define SEGG	(1<<23)		/* granularity 1==4k (for other) */
-#define SEGE	(1<<10)		/* expand down */
-#define SEGW	(1<<9)		/* writable (for data/stack) */
-#define	SEGR	(1<<9)		/* readable (for code) */
-#define SEGD	(1<<22)		/* default 1==32bit (for code) */
-
-/*
- *  physical MMU
- */
-#define	PTEVALID	(1<<0)
-#define	PTEUNCACHED	(1<<4)
-#define PTEWRITE	(1<<1)
-#define	PTERONLY	(0<<1)
-#define	PTEKERNEL	(0<<2)
-#define	PTEUSER		(1<<2)
-#define PTESIZE		(1<<7)
-
-#define MACHADDR	((ulong)&mach0)		/* hack number 1 */
-
-#define IFLAG		0x200	/* psw: interrupt enable, to be accurate */

+ 0 - 146
sys/src/fs/fs64/mkfile

@@ -1,146 +0,0 @@
-CONF=fs
-p=9
-
-objtype=386
-</$objtype/mkfile
-
-TARG=$p$CONF'fs64'
-
-DEV=\
-	apc.$O\
-	cw.$O\
-	fworm.$O\
-	juke.$O\
-	mworm.$O\
-	wren.$O\
-
-IP=\
-	arp.$O\
-	icmp.$O\
-	il.$O\
-	ip.$O\
-	ipaux.$O\
-	iproute.$O\
-	sntp.$O\
-	udp.$O\
-
-PORT=\
-	9p1.$O\
-	9p1lib.$O\
-	9p2.$O\
-	auth.$O\
-	chk.$O\
-	clock.$O\
-	con.$O\
-	config.$O\
-	console.$O\
-	data.$O\
-	dentry.$O\
-	devcons.$O\
-	fcmd.$O\
-	iobuf.$O\
-	lrand.$O\
-	main.$O\
-	print.$O\
-	proc.$O\
-	sub.$O\
-	time.$O\
-	uidgid.$O\
-
-PC=\
-	l.$O\
-	8250.$O\
-	8253.$O\
-	cga.$O\
-	devsd.$O\
-	sdscsi.$O\
-	sdata.$O\
-	sdmv50xx.$O\
-	dosfs.$O\
-	floppy.$O\
-	kbd.$O\
-	lock.$O\
-	malloc.$O\
-	mmu.$O\
-	nvr.$O\
-	pc.$O\
-	pci.$O\
-	toy.$O\
-	trap.$O\
-
-ETHER=\
-	compat.$O\
-	ether2114x.$O\
-	ether8139.$O\
-	ether8169.$O\
-	ether82557.$O\
-	ether82563.$O\
-	ether83815.$O\
-	etherdp83820.$O\
-	etherelnk3.$O\
-	etherga620.$O\
-	etherif.$O\
-	etherigbe.$O\
-	ethermii.$O\
-
-SCSI=\
-	scsi.$O\
-	scsibuslogic.$O\
-	scsincr53c8xx.$O\
-
-OBJ=\
-	$PC\
-	$PORT\
-	$DEV\
-	$IP\
-	$ETHER\
-	$SCSI\
-
-HFILES=\
-	../port/all.h\
-	../port/lib.h\
-	../port/portdat.h\
-	../port/portfns.h\
-	dat.h\
-	fns.h\
-	io.h\
-	mem.h\
-	/$objtype/include/u.h\
-	/$objtype/include/ureg.h\
-
-LIB=\
-	-lauthsrv\
-	-lc\
-	-lsec\
-
-# -I../pc & -DFS are for compat.h
-CFLAGS=-FTVw -I. -I../port -I../pc -DFS
-
-all:V:	$TARG
-
-<../pc/mkfile
-<../port/mkfile
-<../dev/mkfile
-<../ip/mkfile
-
-$TARG:	$TARG.c $OBJ
-	$CC $CFLAGS -DDATE'='`{date -n} $TARG.c
-	$LD -o $target -l -T0x80100020 $OBJ $TARG.$O $LIB
-	size $target
-
-install:V: $TARG
-	cp $TARG /$objtype/
-	9fs stand && cp -x $TARG /n/stand/$objtype
-
-$TARG.$O:	../pc/dosfs.h
-
-%.$O:	%.c
-	$CC $CFLAGS $stem.c
-
-%.$O:	%.s
-	$AS $stem.s
-
-%.$O:	$HFILES
-
-clean:V:
-	rm -f *.[$OS] [$OS].out $TARG

+ 0 - 515
sys/src/fs/ip/arp.c

@@ -1,515 +0,0 @@
-#include "all.h"
-
-#include "../ip/ip.h"
-
-#define	DEBUG	if(cons.flags&arpcache.flag)print
-#define	ORDER	1	/* 1 send last frag first, faster */
-
-typedef struct	Arpentry	Arpentry;
-typedef struct	Arpstats	Arpstats;
-typedef	struct	Arpe		Arpe;
-
-struct	Arpe
-{
-	uchar	tpa[Pasize];
-	uchar	tha[Easize];
-};
-
-static	int	ipahash(uchar*);
-static	void	cmd_arp(int, char*[]);
-
-static
-struct
-{
-	Lock;
-	uchar	null[Pasize];
-	int	start;
-	int	idgen;
-	ulong	flag;
-	Msgbuf*	unresol;
-	struct
-	{
-		int	laste;
-		Arpe	arpe[Ne];
-	} abkt[Nb];
-} arpcache;
-
-int
-nhgets(uchar *p)
-{
-	return (p[0]<<8) | p[1];
-}
-
-long
-nhgetl(uchar *p)
-{
-	return (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
-}
-
-void
-hnputs(uchar *p, int x)
-{
-	p[0] = x>>8;
-	p[1] = x;
-}
-
-void
-hnputl(uchar *p, long x)
-{
-	p[0] = x>>24;
-	p[1] = x>>16;
-	p[2] = x>>8;
-	p[3] = x;
-}
-
-void
-arpstart(void)
-{
-	if(arpcache.start == 0) {
-		lock(&arpcache);
-		if(arpcache.start == 0) {
-			cmd_install("arp", "subcommand -- arp protocol", cmd_arp);
-			arpcache.flag = flag_install("arp", "-- verbose");
-			arpcache.start = 1;
-			iprouteinit();
-		}
-		unlock(&arpcache);
-	}
-}
-
-void
-arpreceive(Enpkt *ep, int l, Ifc *ifc)
-{
-	Ilp* ilp;
-	Arppkt *p, *q;
-	Msgbuf *mb, **mbp;
-	Arpe *a;
-	uchar *tpa;
-	int type, i, h;
-	Timet t;
-
-	if(l < Ensize+Arpsize)
-		return;
-
-	p = (Arppkt*)ep;
-
-	if(nhgets(p->pro) != Iptype ||
-	   nhgets(p->hrd) != 1 ||
-	   p->pln != Pasize ||
-	   p->hln != Easize)
-		return;
-
-	type = nhgets(p->op);
-	switch(type) {
-	case Arprequest:
-		/* update entry for this source */
-		h = ipahash(p->spa);
-		a = arpcache.abkt[h].arpe;
-		lock(&arpcache);
-		for(i=0; i<Ne; i++,a++) {
-			if(memcmp(a->tpa, p->spa, Pasize) == 0) {
-				memmove(a->tha, p->sha, Easize);
-				break;
-			}
-		}
-		unlock(&arpcache);
-
-		if(memcmp(p->tpa, ifc->ipa, Pasize) != 0)
-			break;
-
-		DEBUG("rcv arp req for %I from %I\n", p->tpa, p->spa);
-
-		mb = mballoc(Ensize+Arpsize, 0, Mbarp1);
-		q = (Arppkt*)mb->data;
-
-		memmove(q, p, Ensize+Arpsize);
-
-		hnputs(q->op, Arpreply);
-		memmove(q->tha, p->sha, Easize);
-		memmove(q->tpa, p->spa, Pasize);
-		memmove(q->sha, ifc->ea, Easize);
-		memmove(q->spa, ifc->ipa, Pasize);
-		memmove(q->d, q->s, Easize);
-
-		send(ifc->reply, mb);
-		break;
-
-	case Arpreply:
-		DEBUG("rcv arp rpl for %I is %E\n", p->spa, p->sha);
-
-		h = ipahash(p->spa);
-		a = arpcache.abkt[h].arpe;
-		lock(&arpcache);
-		for(i=0; i<Ne; i++,a++) {
-			if(memcmp(a->tpa, p->spa, Pasize) == 0) {
-				memmove(a->tha, p->sha, Easize);
-				goto out;
-			}
-		}
-
-		i = arpcache.abkt[h].laste + 1;
-		if(i < 0 || i >= Ne)
-			i = 0;
-		arpcache.abkt[h].laste = i;
-
-		a = &arpcache.abkt[h].arpe[i];
-		memmove(a->tpa, p->spa, Pasize);
-		memmove(a->tha, p->sha, Easize);
-
-		/*
-		 * go thru unresolved queue
-		 */
-	out:
-		t = toytime();
-		mbp = &arpcache.unresol;
-		for(mb = *mbp; mb; mb = *mbp) {
-			if(t >= mb->param) {
-				*mbp = mb->next;
-				unlock(&arpcache);
-				mbfree(mb);
-				lock(&arpcache);
-				goto out;
-			}
-			ilp = mb->chan->pdata;
-			tpa = ilp->ipgate;
-			if(memcmp(a->tpa, tpa, Pasize) == 0) {
-				*mbp = mb->next;
-				mb->next = 0;
-				unlock(&arpcache);
-				ipsend(mb);
-				lock(&arpcache);
-				goto out;
-			}
-			mbp = &mb->next;
-		}
-		unlock(&arpcache);
-		break;
-	}
-}
-
-static
-int
-ipahash(uchar *p)
-{
-	ulong h;
-
-	h = p[0];
-	h = h*7 + p[1];
-	h = h*7 + p[2];
-	h = h*7 + p[3];
-	return h%Nb;
-}
-
-void
-ipsend1(Msgbuf *mb, Ifc *ifc, uchar *ipgate)
-{
-	Msgbuf **mbp, *m;
-	Ippkt *p;
-	Arppkt *q;
-	Arpe *a;
-	int i, id, len, dlen, off;
-	Timet t;
-
-	p = (Ippkt*)mb->data;
-
-	a = arpcache.abkt[ipahash(ipgate)].arpe;
-	lock(&arpcache);
-	for(i=0; i<Ne; i++,a++)
-		if(memcmp(a->tpa, ipgate, Pasize) == 0)
-			goto found;
-
-	/*
-	 * queue ip pkt to be resolved later
-	 */
-again:
-	i = 0;		// q length
-	t = toytime();
-	mbp = &arpcache.unresol;
-	for(m = *mbp; m; m = *mbp) {
-		if(t >= m->param) {
-			*mbp = m->next;
-			unlock(&arpcache);
-			mbfree(m);
-			lock(&arpcache);
-			goto again;
-		}
-		mbp = &m->next;
-		i++;
-	}
-	if(mb->chan && i < 10) {
-		mb->param = t + SECOND(10);
-		mb->next = 0;
-		*mbp = mb;
-		unlock(&arpcache);
-	} else {
-		unlock(&arpcache);
-		mbfree(mb);
-	}
-
-	/*
-	 * send an arp request
-	 */
-
-	m = mballoc(Ensize+Arpsize, 0, Mbarp2);
-	q = (Arppkt*)m->data;
-
-	DEBUG("snd arp req target %I ip dest %I\n", ipgate, p->dst);
-
-	memset(q->d, 0xff, Easize);		/* broadcast */
-	hnputs(q->type, Arptype);
-	hnputs(q->hrd, 1);
-	hnputs(q->pro, Iptype);
-	q->hln = Easize;
-	q->pln = Pasize;
-	hnputs(q->op, Arprequest);
-	memmove(q->sha, ifc->ea, Easize);
-	memmove(q->spa, ifc->ipa, Pasize);
-	memset(q->tha, 0, Easize);
-	memmove(q->tpa, ipgate, Pasize);
-
-	send(ifc->reply, m);
-
-	return;
-
-found:
-	len = mb->count;		/* includes Ensize+Ipsize+Ilsize */
-	memmove(p->d, a->tha, Easize);
-	p->vihl = IP_VER|IP_HLEN;
-	p->tos = 0;
-	p->ttl = 255;
-	id = arpcache.idgen;
-	if(id == 0)
-		id = toytime() * 80021;
-	arpcache.idgen = id+1;
-	unlock(&arpcache);
-	hnputs(p->id, id);
-	hnputs(p->type, Iptype);
-
-	/*
-	 * If we dont need to fragment just send it
-	 */
-	if(len <= ETHERMAXTU) {
-		hnputs(p->length, len-Ensize);
-		p->frag[0] = 0;
-		p->frag[1] = 0;
-		p->cksum[0] = 0;
-		p->cksum[1] = 0;
-		hnputs(p->cksum, ipcsum(&p->vihl));
-
-		send(ifc->reply, mb);
-		return;
-	}
-
-	off = 0;
-	len -= Ensize+Ipsize;		/* just ip data */
-
-	while(len > 0) {
-		dlen = (ETHERMAXTU-(Ensize+Ipsize)) & ~7;
-		if(dlen > len)
-			dlen = len;
-		len -= dlen;
-
-		/*
-		 * use first frag in place,
-		 * make copies of subsequent frags
-		 * this saves a copy of a MTU-size buffer
-		 */
-		if(ORDER && off == 0) {
-			m = 0;
-			mb->count = (Ensize+Ipsize)+dlen;
-			p = (Ippkt*)mb->data;
-		} else {
-			m = mballoc((Ensize+Ipsize)+dlen, 0, Mbip1);
-			p = (Ippkt*)m->data;
-
-			memmove(m->data, mb->data, Ensize+Ipsize);
-			memmove(m->data+(Ensize+Ipsize),
-				mb->data+(Ensize+Ipsize)+off, dlen);
-		}
-
-		hnputs(p->length, dlen+Ipsize);
-		if(len == 0)
-			hnputs(p->frag, off>>3);
-		else
-			hnputs(p->frag, (off>>3)|IP_MF);
-		p->cksum[0] = 0;
-		p->cksum[1] = 0;
-		hnputs(p->cksum, ipcsum(&p->vihl));
-
-		if(m)
-			send(ifc->reply, m);
-
-		off += dlen;
-	}
-	if(ORDER)
-		send(ifc->reply, mb);
-	else
-		mbfree(mb);
-}
-
-void
-ipsend(Msgbuf *mb)
-{
-	Ilp *ilp;
-	Chan *cp;
-
-	cp = mb->chan;
-	if(cp == 0) {
-		print("cp = 0\n");
-		mbfree(mb);
-		return;
-	}
-	ilp = cp->pdata;
-	ipsend1(mb, cp->ifc, ilp->ipgate);
-}
-
-int
-ipforme(uchar addr[Pasize], Ifc *ifc)
-{
-	ulong haddr;
-
-	if(memcmp(addr, ifc->ipa, Pasize) == 0)
-		return 1;
-
-	haddr = nhgetl(addr);
-
-	/* My subnet broadcast */
-	if((haddr&ifc->mask) == (ifc->ipaddr&ifc->mask))
-		return 1;
-
-	/* Real ip broadcast */
-	if(haddr == 0)
-		return 1;
-
-	/* Old style 255.255.255.255 address */
-	if(haddr == ~0)
-		return 1;
-
-	return 0;
-}
-
-/*
- * ipcsum - Compute internet header checksums
- */
-int
-ipcsum(uchar *addr)
-{
-	int len;
-	ulong sum = 0;
-
-	len = (addr[0]&0xf) << 2;
-
-	while(len > 0) {
-		sum += (addr[0]<<8) | addr[1] ;
-		len -= 2;
-		addr += 2;
-	}
-
-	sum = (sum & 0xffff) + (sum >> 16);
-	sum = (sum & 0xffff) + (sum >> 16);
-	return sum^0xffff;
-}
-
-/* 
- * protcol checksum routine
- */
-
-static	short	endian	= 1;
-static	char*	aendian	= (char*)&endian;
-#define	LITTLE	*aendian
-
-int
-ptclcsum(uchar *addr, int len)
-{
-	ulong losum, hisum, mdsum, x;
-	ulong t1, t2;
-
-	losum = 0;
-	hisum = 0;
-	mdsum = 0;
-
-	x = 0;
-	if((ulong)addr & 1) {
-		if(len) {
-			hisum += addr[0];
-			len--;
-			addr++;
-		}
-		x = 1;
-	}
-	while(len >= 16) {
-		t1 = *(ushort*)(addr+0);
-		t2 = *(ushort*)(addr+2);	mdsum += t1;
-		t1 = *(ushort*)(addr+4);	mdsum += t2;
-		t2 = *(ushort*)(addr+6);	mdsum += t1;
-		t1 = *(ushort*)(addr+8);	mdsum += t2;
-		t2 = *(ushort*)(addr+10);	mdsum += t1;
-		t1 = *(ushort*)(addr+12);	mdsum += t2;
-		t2 = *(ushort*)(addr+14);	mdsum += t1;
-		mdsum += t2;
-		len -= 16;
-		addr += 16;
-	}
-	while(len >= 2) {
-		mdsum += *(ushort*)addr;
-		len -= 2;
-		addr += 2;
-	}
-	if(x) {
-		if(len)
-			losum += addr[0];
-		if(LITTLE)
-			losum += mdsum;
-		else
-			hisum += mdsum;
-	} else {
-		if(len)
-			hisum += addr[0];
-		if(LITTLE)
-			hisum += mdsum;
-		else
-			losum += mdsum;
-	}
-
-	losum += hisum >> 8;
-	losum += (hisum & 0xff) << 8;
-	while(hisum = losum>>16)
-		losum = hisum + (losum & 0xffff);
-
-	return ~losum & 0xffff;
-}
-
-static
-void
-cmd_arp(int argc, char *argv[])
-{
-	int h, i, j;
-	Arpe *a;
-
-	if(argc <= 1) {
-		print("arp flush -- clear cache\n");
-		print("arp print -- print cache\n");
-		return;
-	}
-	for(i=1; i<argc; i++) {
-		if(strcmp(argv[i], "flush") == 0) {
-			lock(&arpcache);
-			for(h=0; h<Nb; h++)
-				memset(&arpcache.abkt[h], 0, sizeof(arpcache.abkt[0]));
-			unlock(&arpcache);
-			continue;
-		}
-		if(strcmp(argv[i], "print") == 0) {
-			for(h=0; h<Nb; h++) {
-				a = arpcache.abkt[h].arpe;
-				for(j=0; j<Ne; j++,a++) {
-					if(memcmp(arpcache.null, a->tpa, Pasize) == 0)
-						continue;
-					print("%-15I %E\n", a->tpa, a->tha);
-					prflush();
-				}
-			}
-			continue;
-		}
-	}
-}

+ 0 - 65
sys/src/fs/ip/icmp.c

@@ -1,65 +0,0 @@
-#include "all.h"
-#include "mem.h"
-
-#include "../ip/ip.h"
-
-enum			/* Packet Types */
-{
-	EchoReply	= 0,
-	Unreachable	= 3,
-	SrcQuench	= 4,
-	EchoRequest	= 8,
-	TimeExceed	= 11,
-	Timestamp	= 13,
-	TimestampReply	= 14,
-	InfoRequest	= 15,
-	InfoReply	= 16,
-};
-
-void
-icmprecv(Msgbuf *mb, Ifc *ifc)
-{
-	Icmppkt *p;
-	uchar tmp[Pasize];
-
-	p = (Icmppkt*)mb->data;
-
-	switch(p->icmptype) {
-	default:
-		goto drop;
-
-	case EchoRequest:
-		memmove(tmp, p->src, Pasize);
-		memmove(p->src, p->dst, Pasize);
-		memmove(p->dst, tmp, Pasize);
-		p->icmptype = EchoReply;
-		p->icmpsum[0] = 0;
-		p->icmpsum[1] = 0;
-		hnputs(p->icmpsum,
-			ptclcsum((uchar*)mb->data+(Ensize+Ipsize),
-				mb->count-(Ensize+Ipsize)));
-
-		/* note that tmp contains dst */
-		if((nhgetl(ifc->ipa)&ifc->mask) != (nhgetl(p->dst)&ifc->mask))
-			iproute(tmp, p->dst, ifc->netgate);
-		ipsend1(mb, ifc, tmp);
-		break;
-	}
-	return;
-
-drop:
-	mbfree(mb);
-}
-
-void
-igmprecv(Msgbuf *mb, Ifc*)
-{
-	mbfree(mb);
-}
-
-void
-tcprecv(Msgbuf *mb, Ifc*)
-{
-	mbfree(mb);
-}
-

+ 0 - 1069
sys/src/fs/ip/il.c

@@ -1,1069 +0,0 @@
-#include "all.h"
-#include "mem.h"
-
-#include "../ip/ip.h"
-
-#define	DEBUG	if(cons.flags&ilflag)print
-#define	msec	(MACHP(0)->ticks * (1000/HZ))
-
-enum
-{
-	Ilsync		= 0,		/* Packet types */
-	Ildata,
-	Ildataquery,
-	Ilack,
-	Ilquery,
-	Ilstate,
-	Ilclose,
-
-	Ilclosed	= 0,		/* Connection state */
-	Ilsyncer,
-	Ilsyncee,
-	Ilestablished,
-	Illistening,
-	Ilclosing,
-	Ilopening,
-
-	Seconds		= 1000,
-	Iltickms 	= 50,			/* time base */
-	AckDelay	= (Timet)(2*Iltickms),	/* max time twixt message rcvd & ack sent */
-	MaxTimeout 	= (Timet)(4*Seconds),	/* max time between rexmit */
-	QueryTime	= (Timet)(10*Seconds),	/* time between subsequent queries */
-	DeathTime	= (Timet)(30*QueryTime),
-
-	MaxRexmit 	= 16,		/* max retransmissions before hangup */
-	DefWin		= 20,
-
-	LogAGain	= 3,
-	AGain		= 1<<LogAGain,
-	LogDGain	= 2,
-	DGain		= 1<<LogDGain,
-
-	DefByteRate	= 100,		/* assume a megabit link */
-	DefRtt		= 50,		/* cross country on a great day */
-};
-
-static
-struct
-{
-	Lock;
-	Queue*	reply;
-	Chan*	chan;
-} il;
-
-static	void	ilout(void);
-static	void	ilprocess(Chan*, Msgbuf*);
-static	Chan*	getchan(Ifc*, Ilpkt*, Msgbuf*);
-static	void	ilhangup(Chan*, char*, int);
-static	void	ilsendctl(Chan*, Ilpkt*, int, ulong, ulong, int);
-static	void	ilpullup(Chan*);
-static	void	ilackto(Chan*, ulong, Msgbuf*);
-static	void	ilrexmit(Ilp*);
-static	void	iloutoforder(Chan*, Ilpkt*, Msgbuf*);
-static	void	ilfreeq(Chan*);
-static	void	ilackq(Chan*, Msgbuf*);
-static	void	ilbackoff(Ilp*);
-static	void	ilsettimeout(Ilp*);
-static	int	ilnextqt(Ilp*);
-static	void	iltimer(void);
-static void	ilgoaway(Msgbuf*, Ifc*);
-
-static
-char*	ilstate[] =
-{
-	"Closed",
-	"Syncer",
-	"Syncee",
-	"Established",
-	"Listening",
-	"Closing",
-	"Opening",
-};
-static
-char*	iltype[] =
-{
-	"sync",
-	"data",
-	"dataquery",
-	"ack",
-	"query",
-	"state",
-	"close",
-};
-static	Rendez	ild;
-static	int	ilflag;
-
-static void
-ilwhoprint(Chan* cp)
-{
-	Ilp *ilp;
-	Timet t;
-
-	if(cp->type != Devil)
-		return;
-
-	ilp = cp->pdata;
-	t = MACHP(0)->ticks * (1000/HZ);
-	print(" (%d,%d)", ilp->alloc, ilp->state);
-	print(" (%ld,%ld,%ld)",
-		ilp->timeout-t, ilp->querytime-t,
-		ilp->lastrecv-t);
-	print(" (%ld,%ld,%ld,%ld)", ilp->rate, ilp->delay,
-		ilp->mdev, ilp->unackedbytes);
-}
-
-static
-void
-ilpinit(Ilp *ilp)
-{
-	ilp->start = (toytime() * 80021) & 0x3fffffffUL;
-	ilp->next = ilp->start + 1;
-	ilp->rstart = 0;
-	ilp->recvd = 0;
-	ilp->window = DefWin;
-	ilp->unackedbytes = 0;
-	ilp->unacked = nil;
-	ilp->unackedtail = nil;
-	ilp->outoforder = nil;
-	ilp->rexmit = 0;
-
-	/* timers */
-	ilp->delay = DefRtt<<LogAGain;
-	ilp->mdev = DefRtt<<LogDGain;
-	ilp->rate = DefByteRate<<LogAGain;
-	ilp->querytime = msec + QueryTime;
-	ilp->lastrecv = msec;			/* to avoid immediate timeout */
-	ilsettimeout(ilp);
-}
-
-static
-Chan*
-getchan(Ifc *ifc, Ilpkt *p, Msgbuf *mb)
-{
-	Ilp *ilp;
-	Chan *cp, *xcp;
-	int srcp, dstp;
-
-	srcp = nhgets(p->ilsrc);
-	dstp = nhgets(p->ildst);
-
-	lock(&il);
-	xcp = 0;
-	for(cp = il.chan; cp; cp = ilp->chan) {
-		ilp = cp->pdata;
-		if(ilp->alloc == 0) {
-			xcp = cp;
-			continue;
-		}
-		if(srcp == ilp->srcp)
-		if(dstp == ilp->dstp)
-		if(memcmp(p->src, ilp->iphis, Pasize) == 0)
-		if(memcmp(p->dst, ifc->ipa, Pasize) == 0){
-			unlock(&il);
-			return cp;
-		}
-	}
-
-	if(il.reply == 0) {
-		il.reply = newqueue(Nqueue);
-		userinit(ilout, &il, "ilo");
-		userinit(iltimer, &il, "ilt");
-		ilflag = flag_install("il", "-- on errors");
-	}
-
-	if(dstp != Ilfsport) {
-		ilgoaway(mb, ifc);
-		unlock(&il);
-		DEBUG("open not fsport %I.%d -> %I.%d\n", p->src, srcp, p->dst, dstp);
-		return nil;
-	}
-
-	if(p->iltype != Ilsync) {
-		ilgoaway(mb, ifc);
-		unlock(&il);
-		DEBUG("open not sync %I.%d -> %I.%d\n", p->src, srcp, p->dst, dstp);
-		return nil;
-	}
-
-	cp = xcp;
-	if(cp == 0) {
-		cp = chaninit(Devil, 1, sizeof(Ilp));
-		ilp = cp->pdata;
-		ilp->chan = il.chan;
-		il.chan = cp;
-	}
-
-
-	cp->ifc = ifc;
-	ilp = cp->pdata;
-	memmove(ilp->iphis, p->src, Pasize);
-	memmove(ifc->ipa, p->dst, Pasize);
-	ilp->srcp = srcp;
-	ilp->dstp = dstp;
-	ilp->state = Ilopening;
-
-	ilpinit(ilp);
-
-	memmove(ilp->ipgate, ilp->iphis, Pasize);
-	if((nhgetl(ifc->ipa)&ifc->mask) != (nhgetl(p->src)&ifc->mask))
-		iproute(ilp->ipgate, p->src, ifc->netgate);
-
-	cp->send = serveq;
-	cp->reply = il.reply;
-	ilp->reply = ifc->reply;
-	cp->protocol = nil;
-	cp->msize = 0;
-	cp->whotime = 0;
-	sprint(cp->whochan, "il!%I!%d", p->src, srcp);
-	cp->whoprint = ilwhoprint;
-	ilp->alloc = 1;
-
-	unlock(&il);
-	return cp;
-}
-
-void
-ilrecv(Msgbuf *mb, Ifc *ifc)
-{
-	Ilpkt *ih;
-	Chan *cp;
-	Ilp *ilp;
-	int illen, plen;
-
-	ih = (Ilpkt*)mb->data;
-
-	plen = mb->count;
-	if(plen < Ensize+Ipsize+Ilsize)
-		goto drop;
-
-	illen = nhgets(ih->illen);
-	if(illen+Ilsize > plen)
-		goto drop;
-
-	if(ptclcsum((uchar*)ih+(Ensize+Ipsize), illen) != 0) {
-		print("il: cksum error %E %I\n", ih->s, ih->src);
-		ifc->sumerr++;
-		goto drop;
-	}
-
-	cp = getchan(ifc, ih, mb);
-	if(cp == nil)
-		goto drop;
-	mb->chan = cp;
-	ilp = cp->pdata;
-
-	if(ilp->state == Ilopening) {
-		ilp->state = Ilsyncee;
-		ilpinit(ilp);
-		ilp->rstart = nhgetl(ih->ilid);
-		print("il: allocating %s\n", cp->whochan);
-	}
-
-	ilprocess(cp, mb);
-	return;
-
-drop:
-	mbfree(mb);
-}
-
-/*
- * process to convert p9 to il/ip
- */
-static
-void
-ilout(void)
-{
-	Ifc *ifc;
-	Msgbuf *mb;
-	Ilp *ilp;
-	Ilpkt *ih;
-	Chan *cp;
-	int dlen;
-	ulong id, ack;
-
-	for (;;) {
-		while ((mb = recv(il.reply, 0)) == nil)
-			continue;
-
-		cp = mb->chan;
-		ilp = cp->pdata;
-
-		switch(ilp->state) {
-		case Ilclosed:
-		case Illistening:
-		case Ilclosing:
-			print("ilout: error\n");
-			mbfree(mb);
-			continue;
-		}
-
-		dlen = mb->count;
-		mb->data -= Ensize+Ipsize+Ilsize;    /* make room for header */
-		mb->count += Ensize+Ipsize+Ilsize;
-		if(mb->data < mb->xdata)
-			panic("ilout: no room for header");
-		ih = (Ilpkt*)mb->data;
-
-		/*
-		 * Ip fields
-		 */
-		ifc = cp->ifc;
-		memmove(ih->src, ifc->ipa, Pasize);
-		memmove(ih->dst, ilp->iphis, Pasize);
-		ih->proto = Ilproto;
-
-		/*
-		 * Il fields
-		 */
-		hnputs(ih->illen, Ilsize+dlen);
-		hnputs(ih->ilsrc, ilp->dstp);
-		hnputs(ih->ildst, ilp->srcp);
-		id = ilp->next++;
-		hnputl(ih->ilid, id);
-		ack = ilp->recvd;
-		hnputl(ih->ilack, ack);
-		ilp->acksent = ack;
-		ilp->acktime = msec + AckDelay;
-		ih->iltype = Ildata;
-		ih->ilspec = 0;
-		ih->ilsum[0] = 0;
-		ih->ilsum[1] = 0;
-
-		/*
-		 * checksum
-		 */
-		hnputs(ih->ilsum, ptclcsum((uchar*)ih+(Ensize+Ipsize),
-			dlen+Ilsize));
-
-		ilackq(cp, mb);
-
-		/*
-		 * Start the round trip timer for this packet if the timer
-		 * is free.
-		 */
-		if(ilp->rttack == 0) {
-			ilp->rttack = id;
-			ilp->rttstart = msec;
-			ilp->rttlen = dlen+Ipsize+Ilsize;
-		}
-
-		if(ilp->timeout <= msec)
-			ilsettimeout(ilp);
-		ipsend(mb);
-	}
-}
-
-static
-void
-ilackq(Chan *cp, Msgbuf *mb)
-{
-	Msgbuf *nmb;
-	Ilp *ilp;
-
-	/*
-	 * Enqueue a copy on the unacked queue in case this one gets lost
-	 */
-/* botch -- a reference count will save this copy */
-	nmb = mballoc(mb->count, cp, Mbil2);
-	memmove(nmb->data, mb->data, mb->count);
-	nmb->next = 0;
-
-	ilp = cp->pdata;
-	lock(ilp);
-	if(ilp->unacked)
-		ilp->unackedtail->next = nmb;
-	else
-		ilp->unacked = nmb;
-	ilp->unackedtail = nmb;
-	ilp->unackedbytes += nmb->count;
-	unlock(ilp);
-}
-
-static
-void
-ilprocess(Chan *cp, Msgbuf *mb)
-{
-	ulong id, ack;
-	Ilp* ilp;
-	Ilpkt *h;
-
-	ilp = cp->pdata;
-	h = (Ilpkt*)mb->data;
-
-	id = nhgetl(h->ilid);
-	ack = nhgetl(h->ilack);
-
-	ilp->lastrecv = msec;
-
-	switch(ilp->state) {
-	default:
-		print("il unknown state\n");
-	case Ilclosed:
-		mbfree(mb);
-		break;
-	case Ilsyncer:
-		switch(h->iltype) {
-		default:
-			break;
-		case Ilsync:
-			if(ack != ilp->start) {
-				ilp->state = Ilclosed;
-				ilhangup(cp, "connection rejected", 1);
-			} else {
-				ilp->recvd = id;
-				ilp->rstart = id;
-				ilsendctl(cp, 0, Ilack, ilp->next, ilp->recvd, 0);
-				ilp->state = Ilestablished;
-				wakeup(&ilp->syn);
-				ilpullup(cp);
-			}
-			break;
-		case Ilclose:
-			if(ack == ilp->start) {
-				ilp->state = Ilclosed;
-				ilhangup(cp, "remote close-1", 1);
-			}
-			break;
-		}
-		mbfree(mb);
-		break;
-
-	case Ilsyncee:
-		switch(h->iltype) {
-		default:
-			break;
-		case Ilsync:
-			if(id != ilp->rstart || ack != 0)
-				ilp->state = Ilclosed;
-			else {
-				ilp->recvd = id;
-				ilsendctl(cp, 0, Ilsync, ilp->start, ilp->recvd, 0);
-			}
-			break;
-		case Ilack:
-			if(ack == ilp->start) {
-				ilp->state = Ilestablished;
-				ilpullup(cp);
-			}
-			break;
-		case Ildata:
-			if(ack == ilp->start) {
-				ilp->state = Ilestablished;
-				goto established;
-			}
-			break;
-		case Ilclose:
-			if(id == ilp->next) {
-				ilp->state = Ilclosed;
-				ilhangup(cp, "remote close-2", 1);
-			}
-			break;
-		}
-		mbfree(mb);
-		break;
-
-	case Ilestablished:
-	established:
-		switch(h->iltype) {
-		default:
-			mbfree(mb);
-			break;
-		case Ilsync:
-			if(id != ilp->rstart) {
-				ilp->state = Ilclosed;
-				ilhangup(cp, "remote close-3", 1);
-			} else
-				ilsendctl(cp, 0, Ilack, ilp->next, ilp->rstart, 0);
-			mbfree(mb);
-			break;
-		case Ildata:
-			ilackto(cp, ack, mb);
-			iloutoforder(cp, h, mb);
-			ilpullup(cp);
-			break;
-		case Ildataquery:
-			ilackto(cp, ack, mb);
-			iloutoforder(cp, h, mb);
-			ilpullup(cp);
-			ilsendctl(cp, 0, Ilstate, ilp->next, ilp->recvd, h->ilspec);
-			break;
-		case Ilack:
-			ilackto(cp, ack, mb);
-			mbfree(mb);
-			break;
-		case Ilquery:
-			ilackto(cp, ack, mb);
-			ilsendctl(cp, 0, Ilstate, ilp->next, ilp->recvd, h->ilspec);
-			mbfree(mb);
-			break;
-		case Ilstate:
-			if(ack >= ilp->rttack)
-				ilp->rttack = 0;
-			ilackto(cp, ack, mb);
-			if(h->ilspec > Nqt)
-				h->ilspec = 0;
-			if(ilp->qt[h->ilspec] > ack){
-				ilrexmit(ilp);
-				ilsettimeout(ilp);
-			}
-			mbfree(mb);
-			break;
-		case Ilclose:
-			mbfree(mb);
-			if(ack < ilp->start || ack > ilp->next)
-				break;
-			ilp->recvd = id;
-			ilsendctl(cp, 0, Ilclose, ilp->next, ilp->recvd, 0);
-			ilp->state = Ilclosing;
-			ilfreeq(cp);
-			break;
-		}
-		break;
-
-	case Illistening:
-		mbfree(mb);
-		break;
-
-	case Ilclosing:
-		switch(h->iltype) {
-		case Ilclose:
-			ilp->recvd = id;
-			ilsendctl(cp, 0, Ilclose, ilp->next, ilp->recvd, 0);
-			if(ack == ilp->next) {
-				ilp->state = Ilclosed;
-				ilhangup(cp, "closed", 1);
-			}
-			break;
-		}
-		mbfree(mb);
-		break;
-	}
-}
-
-static
-void
-ilsendctl(Chan *cp, Ilpkt *inih, int type, ulong id, ulong ack, int ilspec)
-{
-	Ifc *ifc;
-	Ilpkt *ih;
-	Msgbuf *mb;
-	Ilp *ilp;
-
-	ilp = cp->pdata;
-	mb = mballoc(Ensize+Ipsize+Ilsize, cp, Mbil3);
-
-	ih = (Ilpkt*)mb->data;
-
-	ih->proto = Ilproto;
-	ifc = cp->ifc;
-	memmove(ih->src, ifc->ipa, Pasize);
-	hnputs(ih->illen, Ilsize);
-	if(inih) {
-		memmove(ih->dst, inih->src, Pasize);
-		memmove(ih->ilsrc, inih->ildst, sizeof(ih->ilsrc));
-		memmove(ih->ildst, inih->ilsrc, sizeof(ih->ildst));
-		memmove(ih->ilid, inih->ilack, sizeof(ih->ilid));
-		memmove(ih->ilack, inih->ilid, sizeof(ih->ilack));
-	} else {
-		memmove(ih->dst, ilp->iphis, Pasize);
-		hnputs(ih->ilsrc, ilp->dstp);
-		hnputs(ih->ildst, ilp->srcp);
-		hnputl(ih->ilid, id);
-		hnputl(ih->ilack, ack);
-		ilp->acksent = ack;
-		ilp->acktime = msec;
-	}
-	ih->iltype = type;
-	ih->ilspec = ilspec;
-	ih->ilsum[0] = 0;
-	ih->ilsum[1] = 0;
-
-	hnputs(ih->ilsum, ptclcsum((uchar*)mb->data+(Ensize+Ipsize), Ilsize));
-
-	ipsend(mb);
-}
-
-static
-void
-ilhangup(Chan *cp, char *msg, int dolock)
-{
-	Ilp *ilp;
-	int s;
-
-	ilp = cp->pdata;
-	s = ilp->state;
-	ilp->state = Ilclosed;
-	if(s == Ilsyncer)
-		wakeup(&ilp->syn);
-
-	if(msg != nil)
-		print("hangup! %s %d/%I.%d\n", msg, ilp->srcp,
-			ilp->iphis, ilp->dstp);
-	ilfreeq(cp);
-
-	fileinit(cp);
-	cp->whotime = 0;
-	strcpy(cp->whoname, "<none>");
-
-	if(dolock)
-		lock(&il);
-	ilp->alloc = 0;
-	ilp->srcp = 0;
-	ilp->dstp = 0;
-	memset(ilp->iphis, 0, sizeof(ilp->iphis));
-	if(dolock)
-		unlock(&il);
-}
-
-static
-void
-ilpullup(Chan *cp)
-{
-	Ilpkt *oh;
-	Msgbuf *mb;
-	Ilp *ilp;
-	ulong oid, dlen;
-
-	ilp = cp->pdata;
-	lock(ilp);
-
-	while(ilp->outoforder) {
-		mb = ilp->outoforder;
-		oh = (Ilpkt*)mb->data;
-		oid = nhgetl(oh->ilid);
-		if(oid <= ilp->recvd) {
-			ilp->outoforder = mb->next;
-			mbfree(mb);
-			continue;
-		}
-		if(oid != ilp->recvd+1)
-			break;
-
-		ilp->recvd = oid;
-		ilp->outoforder = mb->next;
-
-		/*
-		 * strip off the header
-		 */
-		dlen = nhgets(oh->illen)-Ilsize;
-		mb->data += Ensize+Ipsize+Ilsize;
-		mb->count = dlen;
-		send(cp->send, mb);
-	}
-	unlock(ilp);
-}
-
-static
-void
-iloutoforder(Chan *cp, Ilpkt *h, Msgbuf *mb)
-{
-	Msgbuf **l, *f;
-	Ilp *ilp;
-	ulong id, ilid;
-	uchar *lid;
-
-	ilp = cp->pdata;
-	id = nhgetl(h->ilid);
-
-	/*
-	 * Window checks
-	 */
-	if(id <= ilp->recvd || id > ilp->recvd+ilp->window) {
-		mbfree(mb);
-		return;
-	}
-
-	/*
-	 * Packet is acceptable so
-	 * sort onto receive queue for pullup
-	 */
-	mb->next = 0;
-	lock(ilp);
-	if(ilp->outoforder == 0) {
-		ilp->outoforder = mb;
-	} else {
-		l = &ilp->outoforder;
-		for(f = *l; f; f = f->next) {
-			lid = ((Ilpkt*)(f->data))->ilid;
-			ilid = nhgetl(lid);
-			if(id <= ilid) {
-				if(id == ilid) {
-					mbfree(mb);
-					unlock(ilp);
-					return;
-				}
-				mb->next = f;
-				break;
-			}
-			l = &f->next;
-		}
-		*l = mb;
-	}
-	unlock(ilp);
-}
-
-static
-void
-ilrttcalc(Ilp *ilp, Msgbuf *mb)
-{
-	int rtt, tt, pt, delay, rate;
-
-	rtt = msec - ilp->rttstart + TK2MS(1) - 1;
-	delay = ilp->delay;
-	rate = ilp->rate;
-
-	/* Guard against zero wrap */
-	if(rtt > 120000 || rtt < 0)
-		return;
-
-	/* this block had to be transmitted after the one acked so count its size */
-	ilp->rttlen += mb->count+Ipsize+Ilsize;
-
-	if(ilp->rttlen < 256){
-		/* guess fixed delay as rtt of small packets */
-		delay += rtt - (delay>>LogAGain);
-		if(delay < AGain)
-			delay = AGain;
-		ilp->delay = delay;
-	} else {
-		/* if packet took longer than avg rtt delay, recalc rate */
-		tt = rtt - (delay>>LogAGain);
-		if(tt > 0){
-			rate += ilp->rttlen/tt - (rate>>LogAGain);
-			if(rate < AGain)
-				rate = AGain;
-			ilp->rate = rate;
-		}
-	}
-
-	/* mdev */
-	pt = ilp->rttlen/(rate>>LogAGain) + (delay>>LogAGain);
-	ilp->mdev += abs(rtt-pt) - (ilp->mdev>>LogDGain);
-
-	if(rtt > ilp->maxrtt)
-		ilp->maxrtt = rtt;
-}
-
-static
-void
-ilackto(Chan *cp, ulong ackto, Msgbuf *mb)
-{
-	Ilpkt *h;
-	Ilp *ilp;
-	ulong id;
-
-	ilp = cp->pdata;
-	if(ilp->rttack == ackto)
-		ilrttcalc(ilp, mb);
-
-	/* Cancel if we lost the packet we were interested in */
-	if(ilp->rttack <= ackto)
-		ilp->rttack = 0;
-
-	lock(ilp);
-	while(ilp->unacked) {
-		h = (Ilpkt*)ilp->unacked->data;
-		id = nhgetl(h->ilid);
-		if(ackto < id)
-			break;
-
-		mb = ilp->unacked;
-		ilp->unacked = mb->next;
-		mb->next = 0;
-		ilp->unackedbytes -= mb->count;
-		mbfree(mb);
-		ilp->rexmit = 0;
-		ilsettimeout(ilp);
-	}
-	unlock(ilp);
-}
-
-static
-void
-ilrexmit(Ilp *ilp)
-{
-	Msgbuf *omb, *mb;
-	Ilpkt *h;
-
-	lock(ilp);
-	omb = ilp->unacked;
-	if(omb == 0) {
-		unlock(ilp);
-		return;
-	}
-
-/* botch -- a reference count will save this copy */
-	mb = mballoc(omb->count, omb->chan, Mbil4);
-	memmove(mb->data, omb->data, omb->count);
-	unlock(ilp);
-
-	h = (Ilpkt*)mb->data;
-
-	h->iltype = Ildataquery;
-	hnputl(h->ilack, ilp->recvd);
-	h->ilspec = ilnextqt(ilp);
-	h->ilsum[0] = 0;
-	h->ilsum[1] = 0;
-	hnputs(h->ilsum, ptclcsum((uchar*)mb->data+(Ensize+Ipsize), nhgets(h->illen)));
-
-	ilbackoff(ilp);
-
-	ipsend(mb);
-}
-
-static
-void
-ilfreeq(Chan *cp)
-{
-	Ilp *ilp;
-	Msgbuf *mb, *next;
-
-	ilp = cp->pdata;
-	lock(ilp);
-	for(mb = ilp->unacked; mb; mb = next) {
-		next = mb->next;
-		mbfree(mb);
-	}
-	ilp->unacked = 0;
-
-	for(mb = ilp->outoforder; mb; mb = next) {
-		next = mb->next;
-		mbfree(mb);
-	}
-	ilp->outoforder = 0;
-	unlock(ilp);
-}
-
-static
-void
-ilsettimeout(Ilp *ilp)
-{
-	Timet pt;
-
-	pt = (ilp->delay>>LogAGain)
-		+ ilp->unackedbytes/(ilp->rate>>LogAGain)
-		+ (ilp->mdev>>(LogDGain-1))
-		+ AckDelay;
-	if(pt > MaxTimeout)
-		pt = MaxTimeout;
-	ilp->timeout = msec + pt;
-}
-
-static
-void
-ilbackoff(Ilp *ilp)
-{
-	Timet pt;
-	int i;
-
-	pt = (ilp->delay>>LogAGain)
-		+ ilp->unackedbytes/(ilp->rate>>LogAGain)
-		+ (ilp->mdev>>(LogDGain-1))
-		+ AckDelay;
-	for(i = 0; i < ilp->rexmit; i++)
-		pt = pt + (pt>>1);
-	if(pt > MaxTimeout)
-		pt = MaxTimeout;
-	ilp->timeout = msec + pt;
-
-	ilp->rexmit++;
-}
-
-/*
- * il timer
- * every 100ms
- */
-static	Rendez	ilt;
-
-static
-void
-callil(Alarm *a, void *)
-{
-	cancel(a);
-	wakeup(&ilt);
-}
-
-// complain if two numbers not within an hour of each other
-#define Tfuture (1000*60*60)
-
-int
-later(Timet t1, Timet t2, char *x)
-{
-	Timet dt;
-
-	dt = t1 - t2;
-	if(dt > 0) {
-		if(dt > Tfuture)
-			print("%s: way future %ld\n", x, dt);
-		return 1;
-	}
-	if(dt < -Tfuture) {
-		print("%s: way past %ld\n", x, -dt);
-		return 1;
-	}
-	return 0;
-}
-
-
-static
-void
-iltimer(void)
-{
-	Chan *cp;
-	Ilp *ilp;
-
-loop:
-	lock(&il);
-	for(cp = il.chan; cp; cp = ilp->chan) {
-		ilp = cp->pdata;
-		if(ilp->alloc == 0)
-			continue;
-
-		switch(ilp->state) {
-		case Ilclosed:
-		case Illistening:
-			break;
-
-		case Ilclosing:
-			if(later(msec, ilp->timeout, "timeout")){
-				if(ilp->rexmit > MaxRexmit){
-					ilp->state = Ilclosed;
-					ilhangup(cp, "connection timed out-0", 0);
-					break;
-				}
-				ilsendctl(cp, 0, Ilclose, ilp->next, ilp->recvd, 0);
-				ilbackoff(ilp);
-			}
-			break;
-
-		case Ilsyncee:
-		case Ilsyncer:
-			if(later(msec, ilp->timeout, "timeout")){
-				if(ilp->rexmit > MaxRexmit){
-					ilp->state = Ilclosed;
-					ilhangup(cp, "connection timed out-1", 0);
-					break;
-				}
-				ilsendctl(cp, 0, Ilsync, ilp->start, ilp->recvd, 0);
-				ilbackoff(ilp);
-			}
-			break;
-
-		case Ilestablished:
-			if(ilp->recvd != ilp->acksent)
-			if(later(msec, ilp->acktime, "acktime"))
-				ilsendctl(cp, 0, Ilack, ilp->next, ilp->recvd, 0);
-
-			if(later(msec, ilp->querytime, "querytime")){
-				if(later(msec, ilp->lastrecv+DeathTime, "deathtime")){
-					ilhangup(cp, "connection timed out-2", 0);
-					break;
-				}
-				ilsendctl(cp, 0, Ilquery, ilp->next, ilp->recvd, ilnextqt(ilp));
-				ilp->querytime = msec + QueryTime;
-			}
-			if(ilp->unacked != nil)
-			if(later(msec, ilp->timeout, "timeout")) {
-				if(ilp->rexmit > MaxRexmit) {
-					ilp->state = Ilclosed;
-					ilhangup(cp, "connection timed out-3", 0);
-					break;
-				}
-				ilsendctl(cp, 0, Ilquery, ilp->next, ilp->recvd, ilnextqt(ilp));
-				ilbackoff(ilp);
-			}
-			break;
-		}
-	}
-	unlock(&il);
-	alarm(Iltickms, callil, 0);
-	sleep(&ilt, no, 0);
-	goto loop;
-}
-
-static
-int
-notsyncer(void *ic)
-{
-	return ((Ilp*)ic)->state != Ilsyncer;
-}
-
-static
-void
-callildial(Alarm *a, void*)
-{
-
-	cancel(a);
-	wakeup(&ild);
-}
-
-static
-int
-ilnextqt(Ilp *ilp)
-{
-	int x;
-
-	lock(ilp);
-	x = ilp->qtx;
-	if(++x > Nqt)
-		x = 1;
-	ilp->qtx = x;
-	ilp->qt[x] = ilp->next-1;	/* highest xmitted packet */
-	ilp->qt[0] = ilp->qt[x];	/* compatibility with old implementations */
-	unlock(ilp);
-
-	return x;
-}
-
-#define	HOWMANY(x, y)	(((x)+((y)-1))/(y))
-#define ROUNDUP(x, y)	(HOWMANY((x), (y))*(y))
-
-static void
-ilgoaway(Msgbuf *inmb, Ifc *ifc)
-{
-	Chan *cp;
-	int size;
-	Ilpkt *ih, *inih;
-	Msgbuf *mb;
-	Ilp *ilp;
-	uchar *p;
-
-	inih = (Ilpkt*)inmb->data;
-
-	/* allocate a temporary message, channel, and Ilp structure */
-	size = ROUNDUP(Ensize+Ipsize+Ilsize, BY2WD)+sizeof(Chan)+sizeof(Ilp);
-	mb = mballoc(size, nil, Mbil3);
-	p = mb->data;
-	p += ROUNDUP(Ensize+Ipsize+Ilsize, BY2WD);
-	cp = (Chan*)p;
-	p += sizeof(Chan);
-	ilp = (Ilp*)p;
-
-	/* link them together */
-	cp->ifc = ifc;
-	mb->chan = cp;
-	cp->pdata = ilp;
-
-	/* figure out next hop */
-	memmove(ilp->ipgate, inih->src, Pasize);
-	if((nhgetl(ifc->ipa)&ifc->mask) != (nhgetl(inih->src)&ifc->mask))
-		iproute(ilp->ipgate, inih->src, ifc->netgate);
-
-	/* create a close message */
-	ih = (Ilpkt*)mb->data;
-	ih->proto = Ilproto;
-	hnputs(ih->illen, Ilsize);
-	memmove(ih->src, ifc->ipa, Pasize);
-	memmove(ih->dst, inih->src, Pasize);
-	memmove(ih->ilsrc, inih->ildst, sizeof(ih->ilsrc));
-	memmove(ih->ildst, inih->ilsrc, sizeof(ih->ildst));
-	memmove(ih->ilid, inih->ilack, sizeof(ih->ilid));
-	memmove(ih->ilack, inih->ilid, sizeof(ih->ilack));
-	ih->iltype = Ilclose;
-	ih->ilspec = 0;
-	ih->ilsum[0] = 0;
-	ih->ilsum[1] = 0;
-	hnputs(ih->ilsum, ptclcsum((uchar*)mb->data+(Ensize+Ipsize), Ilsize));
-
-	ipsend(mb);
-}

+ 0 - 235
sys/src/fs/ip/ip.c

@@ -1,235 +0,0 @@
-#include "all.h"
-
-#include "../ip/ip.h"
-
-#define	DEBUG	if(1||cons.flags&Fip)print
-
-typedef	struct	Rock	Rock;
-typedef	struct	Frag	Frag;
-
-struct	Frag
-{
-	int	start;
-	int	end;
-};
-
-struct	Rock
-{
-	uchar	src[Pasize];
-	uchar	dst[Pasize];
-	int	id;		/* src,dst,id are address of the rock */
-	Msgbuf*	mb;		/* reassembly. if 0, the rock is empty */
-	Timet	age;		/* timeout to throw away */
-	int	last;		/* set to data size when last frag arrives */
-	int	nfrag;
-	Frag	frag[Nfrag];
-};
-
-static
-struct
-{
-	Lock;
-	Rock	rock[Nrock];
-} ip;
-
-void
-ipreceive(Enpkt *ep, int l, Ifc *ifc)
-{
-	Ippkt *p;
-	Msgbuf *mb;
-	Rock *r, *or;
-	Frag *f;
-	int len, id, frag, off, loff, i, n;
-	Ippkt pkt;
-	Timet t;
-
-	p = (Ippkt*)ep;
-	if(l < Ensize+Ipsize) {
-		ifc->sumerr++;
-		print("ip: en too small\n");
-		return;
-	}
-	if(l > LARGEBUF) {
-		ifc->sumerr++;
-		print("ip: en too large\n");
-		return;
-	}
-
-	memmove(&pkt, p, Ensize+Ipsize);	/* copy pkt to 'real' memory */
-	if(pkt.vihl != (IP_VER|IP_HLEN))
-		return;
-	if(!ipforme(pkt.dst, ifc))
-		return;
-	if(ipcsum(&pkt.vihl)) {
-		ifc->sumerr++;
-		print("ip: checksum error (from %I)\n", pkt.src);
-		return;
-	}
-
-	frag = nhgets(pkt.frag);
-	len = nhgets(pkt.length) - Ipsize;
-	id = nhgets(pkt.id);
-
-	/*
-	 * total ip msg fits into one frag
-	 */
-	if((frag & ~IP_DF) == 0) {
-		mb = mballoc(l, 0, Mbip3);
-		memmove(mb->data, &pkt, Ensize+Ipsize);
-		memmove(mb->data + (Ensize+Ipsize),
-			(uchar*)p + (Ensize+Ipsize), l-(Ensize+Ipsize));
-		goto send;
-	}
-
-	/*
-	 * throw away old rocks.
-	 */
-	t = toytime();
-	lock(&ip);
-	r = ip.rock;
-	for(i=0; i<Nrock; i++,r++)
-		if(r->mb && t >= r->age) {
-			mbfree(r->mb);
-			r->mb = 0;
-		}
-
-	/*
-	 * reassembly of fragments
-	 * look up rock by src, dst, id.
-	 */
-	or = 0;
-	r = ip.rock;
-	for(i=0; i<Nrock; i++,r++) {
-		if(r->mb == 0) {
-			if(or == 0)
-				or = r;
-			continue;
-		}
-		if(id == r->id)
-		if(memcmp(r->src, pkt.src, Pasize) == 0)
-		if(memcmp(r->dst, pkt.dst, Pasize) == 0)
-			goto found;
-	}
-	r = or;
-	if(r == 0) {
-		/* no available rocks */
-		r = ip.rock;
-		for(i=0; i<Nrock; i++,r++)
-			if(r->mb) {
-				mbfree(r->mb);
-				r->mb = 0;
-			}
-		r = ip.rock;
-	}
-	r->id = id;
-	r->mb = mballoc(LARGEBUF, 0, Mbip2);
-	memmove(r->src, pkt.src, Pasize);
-	memmove(r->dst, pkt.dst, Pasize);
-	r->nfrag = 0;
-	r->last = 0;
-
-found:
-	mb = r->mb;
-	r->age = t + SECOND(30);
-
-	off = (frag & ~(IP_DF|IP_MF)) << 3;
-	if(len+off+Ensize+Ipsize > mb->count) {
-		/* ip pkt too big */
-		mbfree(mb);
-		r->mb = 0;
-		goto uout;
-	}
-	if(!(frag & IP_MF))
-		r->last = off+len;		/* found the end */
-
-	memmove(mb->data+(Ensize+Ipsize)+off,
-		(uchar*)p + (Ensize+Ipsize), len);
-
-	/*
-	 * frag algorithm:
-	 * first entry is easy
-	 */
-	n = r->nfrag;
-	if(n == 0) {
-		r->frag[0].start = off;
-		r->frag[0].end = off+len;
-		r->nfrag = 1;
-		goto span;
-	}
-
-	/*
-	 * two in a row is easy
-	 */
-	if(r->frag[n-1].end == off) {
-		r->frag[n-1].end += len;
-		goto span;
-	}
-
-	/*
-	 * add this frag
-	 */
-	if(n >= Nfrag) {
-		/* too many frags */
-		mbfree(mb);
-		r->mb = 0;
-		goto uout;
-	}
-	r->frag[n].start = off;
-	r->frag[n].end = off+len;
-	n++;
-	r->nfrag = n;
-
-span:
-	/*
-	 * see if we span the whole list
-	 * can be O(n**2), but usually much smaller
-	 */
-	if(r->last == 0)
-		goto uout;
-	off = 0;
-
-spanloop:
-	loff = off;
-	f = r->frag;
-	for(i=0; i<n; i++,f++)
-		if(off >= f->start && off < f->end)
-			off = f->end;
-	if(loff == off)
-		goto uout;
-	if(off < r->last)
-		goto spanloop;
-
-	memmove(mb->data, &pkt, Ensize+Ipsize);
-	p = (Ippkt*)mb->data;
-	hnputs(p->length, r->last+Ipsize);
-	l = r->last + (Ensize+Ipsize);
-	mb->count = l;
-	r->mb = 0;
-	unlock(&ip);
-
-send:
-	switch(pkt.proto) {
-	default:
-		mbfree(mb);
-		break;
-	case Ilproto:
-		ilrecv(mb, ifc);
-		break;
-	case Udpproto:
-		udprecv(mb, ifc);
-		break;
-	case Icmpproto:
-		icmprecv(mb, ifc);
-		break;
-	case Igmpproto:
-		igmprecv(mb, ifc);
-		break;
-	case Tcpproto:
-		tcprecv(mb, ifc);
-		break;
-	}
-	return;
-
-uout:
-	unlock(&ip);
-}

+ 0 - 286
sys/src/fs/ip/ip.h

@@ -1,286 +0,0 @@
-typedef	struct	Enpkt	Enpkt;
-typedef	struct	Arppkt	Arppkt;
-typedef	struct	Ippkt	Ippkt;
-typedef	struct	Ilpkt	Ilpkt;
-typedef	struct	Udppkt	Udppkt;
-typedef	struct	Icmppkt	Icmppkt;
-typedef	struct	Ifc	Ifc;
-
-enum
-{
-	Easize		= 6,		/* Ether address size */
-	Pasize		= 4,		/* IP protocol address size */
-};
-
-enum
-{
-	Nqt=	8,
-};
-
-typedef
-struct	Ilp
-{
-	Queue*	reply;		/* ethernet output */
-	uchar	iphis[Pasize];	/* his ip address (index) */
-	uchar	ipgate[Pasize];	/* his ip/gateway address */
-	Chan*	chan;		/* list of il channels */
-
-	int	alloc;		/* 1 means allocated */
-	int	srcp;		/* source port (index) */
-	int	dstp;		/* dest port (index) */
-	int	state;		/* connection state */
-
-	Lock;
-
-	Msgbuf*	unacked;
-	Msgbuf*	unackedtail;
-
-	Msgbuf*	outoforder;
-
-	ulong	next;		/* id of next to send */
-	ulong	recvd;		/* last packet received */
-	ulong	start;		/* local start id */
-	ulong	rstart;		/* remote start id */
-	ulong	acksent;	/* Last packet acked */
-
-	Timet	lastxmit;	/* time of last xmit */
-	Timet	lastrecv;	/* time of last recv */
-	Timet	timeout;	/* time out counter */
-	Timet	acktime;	/* acknowledge timer */
-	Timet	querytime;	/* Query timer */
-
-	ulong	delay;		/* Average of the fixed rtt delay */
-	ulong	rate;		/* Average byte rate */
-	ulong	mdev;		/* Mean deviation of predicted to real rtt */
-	ulong	maxrtt;		/* largest rtt seen */
-	ulong	rttack;		/* The ack we are waiting for */
-	int	rttlen;		/* Length of rttack packet */
-	ulong	rttstart;	/* Time we issued rttack packet */
-	ulong	unackedbytes;
-	int	rexmit;		/* number of rexmits of *unacked */
-
-	ulong	qt[Nqt+1];	/* state table for query messages */
-	int	qtx;		/* ... index into qt */
-
-	int	window;		/* maximum receive window */
-
-	Rendez	syn;		/* connect hang out */
-} Ilp;
-
-/*
- * Ethernet header
- */
-enum
-{
-	ETHERMINTU	= 60,		/* minimum transmit size */
-	ETHERMAXTU	= 1514,		/* maximum transmit size */
-
-	Arptype		= 0x0806,
-	Iptype		= 0x0800,
-
-	Icmpproto	= 1,
-	Igmpproto	= 2,
-	Tcpproto	= 6,
-	Udpproto	= 17,
-	Ilproto		= 40,
-
-	Nqueue		= 20,
-	Nfrag		= 6,		/* max number of non-contig ip fragments */
-	Nrock		= 20,		/* number of partial ip assembly stations */
-	Nb		= 211,		/* number of arp hash buckets */
-	Ne		= 10,		/* number of entries in each arp hash bucket */
-
-	Ensize		= 14,		/* ether header size */
-	Ipsize		= 20,		/* ip header size -- doesnt include Ensize */
-	Arpsize		= 28,		/* arp header size -- doesnt include Ensize */
-	Ilsize		= 18,		/* il header size -- doesnt include Ipsize/Ensize */
-	Udpsize		= 8,		/* il header size -- doesnt include Ipsize/Ensize */
-	Udpphsize	= 12,		/* udp pseudo ip header size */
-
-	IP_VER		= 0x40,			/* Using IP version 4 */
-	IP_HLEN		= Ipsize/4,		/* Header length in longs */
-	IP_DF		= 0x4000,		/* Don't fragment */
-	IP_MF		= 0x2000,		/* More fragments */
-
-	Arprequest	= 1,
-	Arpreply,
-
-	Ilfsport	= 17008,
-	Ilauthport	= 17020,
-	Ilfsout		= 5000,
-	SNTP		= 123,
-	SNTP_LOCAL	= 6001,
-};
-
-struct	Enpkt
-{
-	uchar	d[Easize];		/* destination address */
-	uchar	s[Easize];		/* source address */
-	uchar	type[2];		/* packet type */
-
-	uchar	data[ETHERMAXTU-(6+6+2)];
-	uchar	crc[4];
-};
-
-struct	Arppkt
-{
-	uchar	d[Easize];			/* ether header */
-	uchar	s[Easize];
-	uchar	type[2];
-
-	uchar	hrd[2];				/* hardware type, must be ether==1 */
-	uchar	pro[2];				/* protocol, must be ip */
-	uchar	hln;				/* hardware address len, must be Easize */
-	uchar	pln;				/* protocol address len, must be Pasize */
-	uchar	op[2];
-	uchar	sha[Easize];
-	uchar	spa[Pasize];
-	uchar	tha[Easize];
-	uchar	tpa[Pasize];
-};
-
-struct	Ippkt
-{
-	uchar	d[Easize];		/* ether header */
-	uchar	s[Easize];
-	uchar	type[2];
-
-	uchar	vihl;			/* Version and header length */
-	uchar	tos;			/* Type of service */
-	uchar	length[2];		/* packet length */
-	uchar	id[2];			/* Identification */
-	uchar	frag[2];		/* Fragment information */
-	uchar	ttl;			/* Time to live */
-	uchar	proto;			/* Protocol */
-	uchar	cksum[2];		/* Header checksum */
-	uchar	src[Pasize];		/* Ip source */
-	uchar	dst[Pasize];		/* Ip destination */
-};
-
-struct	Ilpkt
-{
-	uchar	d[Easize];		/* ether header */
-	uchar	s[Easize];
-	uchar	type[2];
-
-	uchar	vihl;			/* ip header */
-	uchar	tos;
-	uchar	length[2];
-	uchar	id[2];
-	uchar	frag[2];
-	uchar	ttl;
-	uchar	proto;
-	uchar	cksum[2];
-	uchar	src[Pasize];
-	uchar	dst[Pasize];
-
-	uchar	ilsum[2];		/* Checksum including header */
-	uchar	illen[2];		/* Packet length */
-	uchar	iltype;			/* Packet type */
-	uchar	ilspec;			/* Special */
-	uchar	ilsrc[2];		/* Src port */
-	uchar	ildst[2];		/* Dst port */
-	uchar	ilid[4];		/* Sequence id */
-	uchar	ilack[4];		/* Acked sequence */
-};
-
-struct	Udppkt
-{
-	uchar	d[Easize];		/* ether header */
-	uchar	s[Easize];
-	uchar	type[2];
-
-	uchar	vihl;			/* ip header */
-	uchar	tos;
-	uchar	length[2];
-	uchar	id[2];
-	uchar	frag[2];
-	uchar	ttl;
-	uchar	proto;
-	uchar	cksum[2];
-	uchar	src[Pasize];
-	uchar	dst[Pasize];
-
-	uchar	udpsrc[2];		/* Src port */
-	uchar	udpdst[2];		/* Dst port */
-	uchar	udplen[2];		/* Packet length */
-	uchar	udpsum[2];		/* Checksum including header */
-};
-
-struct	Icmppkt
-{
-	uchar	d[Easize];		/* ether header */
-	uchar	s[Easize];
-	uchar	type[2];
-
-	uchar	vihl;			/* ip header */
-	uchar	tos;
-	uchar	length[2];
-	uchar	id[2];
-	uchar	frag[2];
-	uchar	ttl;
-	uchar	proto;
-	uchar	cksum[2];
-	uchar	src[Pasize];
-	uchar	dst[Pasize];
-
-	uchar	icmptype;		/* Src port */
-	uchar	icmpcode;		/* Dst port */
-	uchar	icmpsum[2];		/* Checksum including header */
-
-	uchar	icmpbody[10];		/* Depends on type */
-};
-
-struct	Ifc
-{
-	Lock;
-	Queue*	reply;
-	Filter	work[3];
-	Filter	rate[3];
-	ulong	rcverr;
-	ulong	txerr;
-	ulong	sumerr;
-	ulong	rxpkt;
-	ulong	txpkt;
-	uchar	ea[Easize];		/* my ether address */
-	uchar	ipa[Pasize];		/* my ip address, pulled from netdb */
-	uchar	netgate[Pasize];	/* my ip gateway, pulled from netdb */
-	ulong	ipaddr;
-	ulong	mask;
-	ulong	cmask;
-	Ifc	*next;			/* List of configured interfaces */
-};
-
-Ifc*	enets;			/* List of configured interfaces */
-
-void	riprecv(Msgbuf*, Ifc*);
-void	sntprecv(Msgbuf *mb, Ifc *ifc);
-
-void	arpreceive(Enpkt*, int, Ifc*);
-void	ipreceive(Enpkt*, int, Ifc*);
-void	ilrecv(Msgbuf*, Ifc*);
-void	udprecv(Msgbuf*, Ifc*);
-void	ilrecv(Msgbuf*, Ifc*);
-void	icmprecv(Msgbuf*, Ifc*);
-void	igmprecv(Msgbuf*, Ifc*);
-void	tcprecv(Msgbuf*, Ifc*);
-void	iprouteinit(void);
-long	ipclassmask(uchar*);
-void	iproute(uchar*, uchar*, uchar*);
-
-void	getipa(Ifc*, int);
-int	ipforme(uchar*, Ifc*);
-int	ipcsum(uchar*);
-
-int	ptclcsum(uchar*, int);
-void	ipsend(Msgbuf*);
-void	ipsend1(Msgbuf*, Ifc*, uchar*);
-
-uchar 	authip[Pasize];		/* ip address of server - from config block */
-uchar	sntpip[Pasize];		/* ip address of sntp server */
-struct
-{
-	uchar	sysip[Pasize];	/* my ip - from config block */
-	uchar	defmask[Pasize];/* ip mask - from config block */
-	uchar	defgwip[Pasize];/* gateway ip - from config block */
-} ipaddr[10];

+ 0 - 76
sys/src/fs/ip/ipaux.c

@@ -1,76 +0,0 @@
-#include "all.h"
-
-#include "../ip/ip.h"
-
-int
-chartoea(uchar *ea, char *cp)
-{
-	int i, h, c;
-
-	h = 0;
-	for(i=0; i<Easize*2; i++) {
-		c = *cp++;
-		if(c >= '0' && c <= '9')
-			c = c - '0';
-		else
-		if(c >= 'a' && c <= 'f')
-			c = c - 'a' + 10;
-		else
-		if(c >= 'A' && c <= 'F')
-			c = c - 'A' + 10;
-		else
-			return 1;
-		h = (h*16) + c;
-		if(i & 1) {
-			*ea++ = h;
-			h = 0;
-		}
-	}
-	if(*cp != 0)
-		return 1;
-	return 0;
-}
-
-int
-chartoip(uchar *pa, char *cp)
-{
-	int i, c, h;
-
-	for(i=0;;) {
-		h = 0;
-		for(;;) {
-			c = *cp++;
-			if(c < '0' || c > '9')
-				break;
-			h = (h*10) + (c-'0');
-		}
-		*pa++ = h;
-		i++;
-		if(i == Pasize) {
-			if(c != 0)
-				return 1;
-			return 0;
-		}
-		if(c != '.')
-			return 1;
-	}
-}
-
-void
-getipa(Ifc *ifc, int a)
-{
-
-	memmove(ifc->ipa, ipaddr[a].sysip, Pasize);
-	memmove(ifc->netgate, ipaddr[a].defgwip, Pasize);
-	ifc->ipaddr = nhgetl(ifc->ipa);
-	ifc->mask = nhgetl(ipaddr[a].defmask);
-	ifc->cmask = ipclassmask(ifc->ipa);
-}
-
-int
-isvalidip(uchar ip[Pasize])
-{
-	if(ip[0] || ip[1] || ip[2] || ip[3])
-		return 1;
-	return 0;
-}

+ 0 - 425
sys/src/fs/ip/iproute.c

@@ -1,425 +0,0 @@
-#include "all.h"
-
-#include "../ip/ip.h"
-
-#define	DEBUG	if(cons.flags&ralloc.flag)print
-
-enum
-{
-	Version=	1,
-
-	/*
-	 *  definitions that are innately tied to BSD
-	 */
-	AF_INET=	2,
-	AF_UNSPEC=	0,
-
-	/*
-	 *  Packet types.
-	 */
-	Request=	1,
-	Response=	2,
-	Traceon=	3,
-	Traceoff=	4,
-
-	Infinity=	16,	/* infinite hop count */
-	Maxpacket=	488,	/* largest packet body */
-};
-
-
-/*
- *  network info
- */
-typedef struct Rip	Rip;
-struct Rip
-{
-	uchar	family[2];
-	uchar	port[2];
-	uchar	addr[Pasize];
-	uchar	pad[8];
-	uchar	metric[4];
-};
-typedef struct Ripmsg	Ripmsg;
-struct Ripmsg
-{
-	uchar	type;
-	uchar	vers;
-	uchar	pad[2];
-	Rip	rip[1];		/* the rest of the packet consists of routes */
-};
-
-enum
-{
-	Maxroutes=	(Maxpacket-4)/sizeof(Ripmsg),
-};
-
-/*
- *  internal route info
- */
-enum
-{
-	Nroute	= 2*1024,
-	Nhash	= 256,		/* routing hash buckets */
-	Nifc	= 16,
-};
-
-typedef struct Route	Route;
-struct Route
-{
-	Route	*next;
-
-	uchar	dest[Pasize];
-	uchar	mask[Pasize];
-	uchar	gate[Pasize];
-	int	metric;
-	int	inuse;
-	Timet	time;
-};
-struct
-{
-	Lock;
-	Route	route[Nroute];
-	Route	*hash[Nhash];
-	int	nroute;
-	ulong	flag;
-	int 	dorip;
-} ralloc;
-
-uchar classmask[4][4] =
-{
-	0xff, 0x00, 0x00, 0x00,
-	0xff, 0x00, 0x00, 0x00,
-	0xff, 0xff, 0x00, 0x00,
-	0xff, 0xff, 0xff, 0x00,
-};
-
-#define CLASS(p) ((*(uchar*)(p))>>6)
-
-static void	considerroute(Route*);
-static void	deleteroute(Route*);
-static void	printroute(Route*);
-static void	printroutes(void);
-static void	installroute(Route*);
-static void	getmask(uchar*, uchar*);
-static void	maskip(uchar*, uchar*, uchar*);
-static int	equivip(uchar*, uchar*);
-static void	cmd_route(int, char*[]);
-static ulong	rhash(uchar*);
-
-void
-iprouteinit(void)
-{
-	cmd_install("route", "subcommand -- ip routes", cmd_route);
-	ralloc.flag = flag_install("route", "-- verbose");
-	if(!conf.ripoff)
-		ralloc.dorip = 1;
-}
-
-static void
-cmd_route(int argc, char *argv[])
-{
-	Route r;
-
-	if(argc < 2) {
-usage:
-		print("route add dest gate [mask] -- add a route\n");
-		print("route delete dest -- remote a route\n");
-		print("route print [dest] -- print routes\n");
-		print("route ripon -- listen to RIP packets\n");
-		print("route ripoff -- ignore RIP packets\n");
-		return;
-	}
-	if(strcmp(argv[1], "ripoff") == 0)
-		ralloc.dorip = 0;
-	else
-	if(strcmp(argv[1], "ripon") == 0)
-		ralloc.dorip = 1;
-	else
-	if(strcmp(argv[1], "add") == 0) {
-		switch(argc){
-		default:
-			goto usage;
-		case 4:
-			memmove(r.mask, classmask[CLASS(r.dest)], Pasize);
-			break;
-		case 5:
-			if(chartoip(r.mask, argv[4]))
-				goto usage;
-			break;
-		}
-		if(chartoip(r.dest, argv[2]) || chartoip(r.gate, argv[3]))
-			goto usage;
-		r.metric = 0;			/* rip can't nuke these */
-		deleteroute(&r);
-		considerroute(&r);
-	} else
-	if(strcmp(argv[1], "delete") == 0) {
-		if(argc != 3 || chartoip(r.dest, argv[2]))
-			goto usage;
-		deleteroute(&r);
-	} else
-	if(strcmp(argv[1], "print") == 0) {
-		if(argc == 3) {
-			if(chartoip(r.dest, argv[2]))
-				goto usage;
-			printroute(&r);
-		} else
-			printroutes();
-	}
-}
-
-/*
- *  consider installing a route.  Do so only if it is better than what
- *  we have.
- */
-static void
-considerroute(Route *r)
-{
-	ulong h, i;
-	ulong m, nm;
-	Route *hp, **l;
-
-	r->next = 0;
-	r->time = time();
-	r->inuse = 1;
-
-	lock(&ralloc);
-	h = rhash(r->dest);
-	for(hp = ralloc.hash[h]; hp; hp = hp->next) {
-		if(equivip(hp->dest, r->dest) && equivip(hp->mask, r->mask)) {
-			/*
-			 *  found a match, replace if better (or much newer)
-			 */
-			if(r->metric < hp->metric || time()-hp->time > 10*60) {
-				memmove(hp->gate, r->gate, Pasize);
-				hp->metric = r->metric;
-				DEBUG("route: replacement %I & %I -> %I (%d)\n",
-					hp->dest, hp->mask, hp->dest, hp->metric);
-			}
-			if(equivip(r->gate, hp->gate))
-				hp->time = time();
-			goto done;
-		}
-	}
-
-	/*
-	 *  no match, look for space
-	 */
-	for(hp = ralloc.route; hp < &ralloc.route[Nroute]; hp++)
-		if(hp->inuse == 0)
-			break;
-	if(hp == &ralloc.route[Nroute])
-		hp = 0;
-
-	/*
-	 *  look for an old entry
-	 */
-	for(i = 0; hp == 0 && i < Nhash; i++) {
-		l = &ralloc.hash[i];
-		for(hp = *l; hp; hp = *l) {
-			if(time() - hp->time > 10*60 && hp->metric > 0){
-				*l = hp->next;
-				break;
-			}
-			l = &hp->next;
-		}
-	}
-
-	if(hp == 0) {
-		print("no more routes");
-		goto done;
-	}
-
-	memmove(hp, r, sizeof(Route));
-
-	/*
-	 *  insert largest mask first
-	 */
-	m = nhgetl(hp->mask);
-	for(l = &ralloc.hash[h]; *l; l = &(*l)->next){
-		nm = nhgetl((*l)->mask);
-		if(nm < m)
-			break;
-	}
-	hp->next = *l;
-	*l = hp;
-	DEBUG("route: new %I & %I -> %I (%d)\n", hp->dest, hp->mask,
-		hp->dest, hp->metric);
-done:
-	unlock(&ralloc);
-}
-
-static void
-deleteroute(Route *r)
-{
-	int h;
-	Route *hp, **l;
-
-	lock(&ralloc);
-	for(h = 0; h < Nhash; h++) {
-		l = &ralloc.hash[h];
-		for(hp = *l; hp; hp = *l){
-			if(equivip(r->dest, hp->dest)) {
-				*l = hp->next;
-				hp->next = 0;
-				hp->inuse = 0;
-				break;
-			}
-			l = &hp->next;
-		}
-	}
-	unlock(&ralloc);
-}
-
-static void
-printroutes(void)
-{
-	Ifc *i;
-	int h;
-	Route *hp;
-	uchar mask[Pasize];
-
-	lock(&ralloc);
-	for(h = 0; h < Nhash; h++)
-		for(hp = ralloc.hash[h]; hp; hp = hp->next)
-			print("%I & %I -> %I\n", hp->dest, hp->mask, hp->gate);
-	unlock(&ralloc);
-
-	print("\nifc's\n");
-	for(i = enets; i; i = i->next) {
-		hnputl(mask, i->mask);
-		print("addr %I mask %I defgate %I\n", i->ipa, mask, i->netgate);
-	}
-}
-
-static void
-printroute(Route *r)
-{
-	int h;
-	Route *hp;
-	uchar net[Pasize];
-
-	h = rhash(r->dest);
-	for(hp = ralloc.hash[h]; hp; hp = hp->next){
-		maskip(r->dest, hp->mask, net);
-		if(equivip(hp->dest, net)){
-			print("%I & %I -> %I\n", hp->dest, hp->mask, hp->gate);
-			return;
-		}
-	}
-	print("default * -> %I\n", enets[0].netgate);
-}
-
-void
-iproute(uchar *to, uchar *dst, uchar *def)
-{
-	int h;
-	Route *hp;
-	uchar net[Pasize];
-
-	h = rhash(dst);
-	for(hp = ralloc.hash[h]; hp; hp = hp->next) {
-		maskip(dst, hp->mask, net);
-		if(equivip(hp->dest, net)) {
-			def = hp->gate;
-			break;
-		}
-	}
-	memmove(to, def, Pasize);
-}
-
-void
-riprecv(Msgbuf *mb, Ifc*)
-{
-	int n;
-	Rip *r;
-	Ripmsg *m;
-	Udppkt *uh;
-	Route route;
-
-	if(ralloc.dorip == 0)
-		goto drop;
-
-	uh = (Udppkt*)mb->data;
-	m = (Ripmsg*)(mb->data + Ensize + Ipsize + Udpsize);
-	if(m->type != Response || m->vers != Version)
-		goto drop;
-
-	n = nhgets(uh->udplen);
-	n -= Udpsize;
-	n = n/sizeof(Rip);
-
-	DEBUG("%d routes from %I\n", n, uh->src);
-
-	memmove(route.gate, uh->src, Pasize);
-	for(r = m->rip; r < &m->rip[n]; r++){
-		getmask(route.mask, r->addr);
-		maskip(r->addr, route.mask, route.dest);
-		route.metric = nhgetl(r->metric) + 1;
-		if(route.metric < 1)
-			continue;
-		considerroute(&route);
-	}
-drop:
-	mbfree(mb);
-}
-
-/*
- *  route's hashed by net, not subnet
- */
-static ulong
-rhash(uchar *d)
-{
-	ulong h;
-	uchar net[Pasize];
-
-	maskip(d, classmask[CLASS(d)], net);
-	h = net[0] + net[1] + net[2];
-	return h % Nhash;
-}
-
-/*
- *  figure out what mask to use, if we have a direct connected network
- *  with the same class net use its subnet mask.
- */
-static void
-getmask(uchar *mask, uchar *dest)
-{
-	Ifc *i;
-	long ip;
-
-	ip = nhgetl(dest);
-	for(i = enets; i; i = i->next)
-		if((i->ipaddr & i->cmask) == (ip & i->cmask)) {
-			hnputl(mask, i->mask);
-			return;
-		}
-
-	memmove(mask, classmask[CLASS(dest)], Pasize);
-}
-
-static void
-maskip(uchar *a, uchar *m, uchar *n)
-{
-	int i;
-
-	for(i = 0; i < 4; i++)
-		n[i] = a[i] & m[i];
-}
-
-static int
-equivip(uchar *a, uchar *b)
-{
-	int i;
-
-	for(i = 0; i < 4; i++)
-		if(a[i] != b[i])
-			return 0;
-	return 1;
-}
-
-long
-ipclassmask(uchar *ip)
-{
-	return nhgetl(classmask[CLASS(ip)]);
-}

+ 0 - 3
sys/src/fs/ip/mkfile

@@ -1,3 +0,0 @@
-IPFILES=`{builtin cd ../ip;echo *.c | sed 's/ /|/g; s/\.c//g'}
-^($IPFILES)\.$O:R:	'../ip/\1.c'
-	$CC $CFLAGS -I. ../ip/$stem1.c

+ 0 - 247
sys/src/fs/ip/sntp.c

@@ -1,247 +0,0 @@
-#include "all.h"
-
-#include "../ip/ip.h"
-
-typedef struct Sntppkt {
-	uchar	d[Easize];		/* ether header */
-	uchar	s[Easize];
-	uchar	type[2];
-
-	uchar	vihl;			/* ip header */
-	uchar	tos;
-	uchar	length[2];
-	uchar	id[2];
-	uchar	frag[2];
-	uchar	ttl;
-	uchar	proto;
-	uchar	cksum[2];
-	uchar	src[Pasize];
-	uchar	dst[Pasize];
-
-	uchar	udpsrc[2];		/* Src port */
-	uchar	udpdst[2];		/* Dst port */
-	uchar	udplen[2];		/* Packet length */
-	uchar	udpsum[2];		/* Checksum including header */
-	uchar	mode;			/* li:2, vn:3, mode:3 */
-	uchar	stratum;		/* level of local clock */
-	signed char poll;		/* log2(max interval between polls) */
-	signed char precision;		/* log2(clock precision) -6 => mains,
-					   -18 => us */
-	uchar rootdelay[4];		/* round trip delay to reference
-				   	   16.16 fraction */
-	uchar dispersion[4];		/* max error to reference */
-	uchar clockid[4];		/* reference clock identifier */
-	uchar reftime[8];		/* local time when clock set */
-	uchar orgtime[8];		/* local time when client sent request */
-	uchar rcvtime[8];		/* time request arrived */
-	uchar xmttime[8];		/* time reply sent */
-} Sntppkt;
-
-enum {
-	Sntpsize = 4 + 3 * 4 + 4 * 8,
-	Version = 1,
-	Stratum = 0,
-	Poll = 0,
-	LI = 0,
-	Symmetric = 2,
-	ClientMode = 3,
-	ServerMode = 4,
-	Epoch = 86400 * (365 * 70 + 17), /* 1900 to 1970 in seconds */
-};
-
-#define DEBUG if(cons.flags&sntp.flag)print
-
-static struct {
-	Lock;
-	int flag;
-	int gotreply;
-	int kicked;
-	Rendez r;
-	Rendez doze;
-} sntp;
-
-static int
-done(void*)
-{
-	return sntp.gotreply != 0;
-}
-
-static int
-kicked(void*)
-{
-	return sntp.kicked != 0;
-}
-
-void
-sntprecv(Msgbuf *mb, Ifc *ifc)
-{
-	Udppkt *uh;
-	Sntppkt *sh;
-	int v, li, m, now;
-
-	USED(ifc);
-	uh = (Udppkt *)mb->data;
-	DEBUG("sntp: receive from %I\n", uh->src);
-	if (memcmp(uh->src, sntpip, 4) != 0) {
-		DEBUG("sntp: wrong IP address\n");
-		goto overandout;
-	}
-	if (nhgets(uh->udplen) < Sntpsize) {
-		DEBUG("sntp: packet too small\n");
-		goto overandout;
-	}
-	sh = (Sntppkt *)mb->data;
-	v = (sh->mode >> 3) & 7;
-	li = (sh->mode >> 6);
-	m = sh->mode & 7;
-	/*
-	 * if reply from right place and contains time set gotreply
-	 * and wakeup r
-	 */
-	DEBUG("sntp: LI %d Version %d Mode %d\n", li, v, m);
-	if (sh->stratum == 1) {
-		char buf[5];
-		memmove(buf, sh->clockid, 4);
-		buf[4] = 0;
-		DEBUG("sntp: Stratum 1 (%s)\n", buf);
-	}
-	else {
-		DEBUG("sntp: Stratum %d\n", sh->stratum);
-	}
-	DEBUG("Poll %d Precision %d\n", sh->poll, sh->precision);
-	DEBUG("RootDelay %ld Dispersion %ld\n",
-	    nhgetl(sh->rootdelay), nhgetl(sh->dispersion));
-	if (v == 0 || v > 3) {
-		DEBUG("sntp: unsupported version\n");
-		goto overandout;
-	}
-	if (m >= 6 || m == ClientMode) {
-		DEBUG("sntp: wrong mode\n");
-		goto overandout;
-	}
-	now = nhgetl(sh->xmttime) - Epoch;
-	if (li == 3 || now == 0 || sh->stratum == 0) {
-		/* unsynchronized */
-		print("sntp: time server not synchronized\n");
-		goto overandout;
-	}
-	settime(now);
-	setrtc(now);
-	print("sntp: %d\n", now);
-	sntp.gotreply = 1;
-	wakeup(&sntp.r);
-overandout:
-	mbfree(mb);
-}
-
-void
-sntpsend(void)
-{
-	ushort sum;
-	Msgbuf *mb;
-	Sntppkt *s;
-	uchar tmp[Pasize];
-	Ifc *ifc;
-
-	/* find an interface on the same subnet as sntpip, if any */
-	for(ifc = enets; ifc; ifc = ifc->next) {
-		if(isvalidip(ifc->ipa) &&
-		   (nhgetl(ifc->ipa)&ifc->mask) == (nhgetl(sntpip)&ifc->mask))
-			break;
-	}
-	/* if none, find an interface with a default gateway */
-	if(ifc == nil)
-		for(ifc = enets; ifc; ifc = ifc->next)
-			if(isvalidip(ifc->ipa) && isvalidip(ifc->netgate))
-				break;
-	if(ifc == nil) {
-		DEBUG("sntp: can't send to %I; no ifc on same subnet or with default route\n", sntpip);
-		return;
-	}
-
-	/* compose a UDP sntp request */
-	DEBUG("sntp: sending to %I on ifc %I\n", sntpip, ifc->ipa);
-	mb = mballoc(Ensize+Ipsize+Udpsize+Sntpsize, 0, Mbsntp);
-	s = (Sntppkt *)mb->data;
-	/* IP fields */	
-	memmove(s->src, ifc->ipa, Pasize);
-	memmove(s->dst, sntpip, Pasize);
-	s->proto = Udpproto;
-	s->ttl = 0;
-	/* Udp fields */
-	hnputs(s->udpsrc, SNTP_LOCAL);
-	hnputs(s->udpdst, SNTP);
-	hnputs(s->udplen, Sntpsize + Udpsize);
-	/* Sntp fields */
-	memset(mb->data + Ensize+Ipsize+Udpsize, 0, Sntpsize);
-	s->mode = 010 | ClientMode;
-	s->poll = 6;
-	hnputl(s->orgtime, rtctime() + Epoch);	/* leave 0 fraction */
-	/* Compute the UDP sum - form psuedo header */
-	hnputs(s->cksum, Udpsize + Sntpsize);
-	hnputs(s->udpsum, 0);
-	sum = ptclcsum((uchar *)mb->data + Ensize + Ipsize - Udpphsize,
-	    Udpsize + Udpphsize + Sntpsize);
-	hnputs(s->udpsum, sum);
-	/*
-	  * now try to send it - cribbed from icmp.c
-	  */
-	memmove(tmp, s->dst, Pasize);
-	if((nhgetl(ifc->ipa)&ifc->mask) != (nhgetl(s->dst)&ifc->mask))
-		iproute(tmp, s->dst, ifc->netgate);
-	ipsend1(mb, ifc, tmp);
-}
-
-#define TRIES 3
-#define INTERVAL (60 * 60 * 1000)
-#define TIMO 1000
-
-void
-sntptask(void)
-{
-	DEBUG("sntp: running\n");
-	tsleep(&sntp.doze, kicked, 0, 2 * 60 * 1000);
-	for (;;) {
-		sntp.kicked = 0;
-		DEBUG("sntp: poll time!\n");
-		if (isvalidip(sntpip)) {
-			int i;
-			sntp.gotreply = 0;
-			for (i = 0; i < TRIES; i++)
-			{
-				sntpsend();
-				tsleep(&sntp.r, done, 0, TIMO);
-				if (sntp.gotreply)
-					break;
-			}
-			/* clock has been set */
-		}
-		tsleep(&sntp.doze, kicked, 0, INTERVAL);
-	}
-}
-
-void
-cmd_sntp(int argc, char *argv[])
-{
-	int i;
-
-	if(argc <= 1) {
-		print("sntp kick -- check time now\n");
-		return;
-	}
-	for(i=1; i<argc; i++) {
-		if(strcmp(argv[i], "kick") == 0) {
-			sntp.kicked = 1;
-			wakeup(&sntp.doze);
-			continue;
-		}
-	}
-}
-
-void
-sntpinit(void)
-{
-	cmd_install("sntp", "subcommand -- sntp protocol", cmd_sntp);
-	sntp.flag = flag_install("sntp", "-- verbose");
-	userinit(sntptask, 0, "sntp");
-}

+ 0 - 47
sys/src/fs/ip/udp.c

@@ -1,47 +0,0 @@
-#include "all.h"
-
-#include "../ip/ip.h"
-
-void
-udprecv(Msgbuf *mb, Ifc *ifc)
-{
-	Udppkt *uh;
-	int udplen, plen;
-
-	uh = (Udppkt*)mb->data;
-
-	plen = mb->count;
-	if(plen < Ensize+Ipsize+Udpsize)
-		goto drop;
-
-	udplen = nhgets(uh->udplen);
-	if(udplen+Ensize+Ipsize > plen)
-		goto drop;
-
-	/* construct pseudo hdr and check sum */
-	uh->ttl = 0;
-	hnputs(uh->cksum, udplen);
-	if(nhgets(uh->udpsum)
-	  && ptclcsum((uchar*)uh+(Ensize+Ipsize-Udpphsize), udplen + Udpphsize) != 0) {
-		if(ifc->sumerr < 3)
-			print("udp: cksum error %I\n", uh->src);
-		ifc->sumerr++;
-		goto drop;
-	}
-
-	switch(nhgets(uh->udpdst)) {
-	case 520:
-		riprecv(mb, ifc);
-		break;
-	case SNTP_LOCAL:
-		sntprecv(mb, ifc);
-		break;
-	default:
-		mbfree(mb);
-		break;
-	}
-	return;
-
-drop:
-	mbfree(mb);
-}

+ 0 - 25
sys/src/fs/mkfile

@@ -1,25 +0,0 @@
-ARCH=\
-	fs\
-	fs64\
-	9netics32.16k\
-	9netics64.8k\
-	choline\
-	emelie\
-
-all:V:
-	for(i in $ARCH)@{
-		cd $i
-		mk
-	}
-
-installall install:V:
-	for(i in $ARCH) @{
-		cd $i
-		mk install
-	}
-
-clean:V:
-	for(i in $ARCH) @{
-		cd $i
-		mk clean
-	}

+ 0 - 382
sys/src/fs/pc/8250.c

@@ -1,382 +0,0 @@
-#include "all.h"
-#include "mem.h"
-#include "ureg.h"
-#include "io.h"
-
-enum {
-	Development = 1,		/* i.e., debugging */
-	DLE = 0x10,			/* ^p == DLE */
-	Asciimask = 0x7f,
-};
-
-/*
- *  INS8250 uart
- */
-enum
-{
-	/*
-	 *  register numbers
-	 */
-	Data=	0,		/* xmit/rcv buffer */
-	Iena=	1,		/* interrupt enable */
-	 Ircv=	(1<<0),		/*  for char rcv'd */
-	 Ixmt=	(1<<1),		/*  for xmit buffer empty */
-	 Irstat=(1<<2),		/*  for change in rcv'er status */
-	 Imstat=(1<<3),		/*  for change in modem status */
-	Istat=	2,		/* interrupt flag (read) */
-	 Fenabd=(3<<6),		/*  on if fifo's enabled */
-	Fifoctl=2,		/* fifo control (write) */
-	 Fena=	(1<<0),		/*  enable xmit/rcv fifos */
-	 Ftrig=	(1<<6),		/*  trigger after 4 input characters */
-	 Fclear=(3<<1),		/*  clear xmit & rcv fifos */
-	Format=	3,		/* byte format */
-	 Bits8=	(3<<0),		/*  8 bits/byte */
-	 Stop2=	(1<<2),		/*  2 stop bits */
-	 Pena=	(1<<3),		/*  generate parity */
-	 Peven=	(1<<4),		/*  even parity */
-	 Pforce=(1<<5),		/*  force parity */
-	 Break=	(1<<6),		/*  generate a break */
-	 Dra=	(1<<7),		/*  address the divisor */
-	Mctl=	4,		/* modem control */
-	 Dtr=	(1<<0),		/*  data terminal ready */
-	 Rts=	(1<<1),		/*  request to send */
-	 Ri=	(1<<2),		/*  ring */
-	 Inton=	(1<<3),		/*  turn on interrupts */
-	 Loop=	(1<<4),		/*  loop back */
-	Lstat=	5,		/* line status */
-	 Inready=(1<<0),	/*  receive buffer full */
-	 Oerror=(1<<1),		/*  receiver overrun */
-	 Perror=(1<<2),		/*  receiver parity error */
-	 Ferror=(1<<3),		/*  rcv framing error */
-	 Outready=(1<<5),	/*  output buffer empty */
-	Mstat=	6,		/* modem status */
-	 Ctsc=	(1<<0),		/*  clear to send changed */
-	 Dsrc=	(1<<1),		/*  data set ready changed */
-	 Rire=	(1<<2),		/*  rising edge of ring indicator */
-	 Dcdc=	(1<<3),		/*  data carrier detect changed */
-	 Cts=	(1<<4),		/*  complement of clear to send line */
-	 Dsr=	(1<<5),		/*  complement of data set ready line */
-	 Ring=	(1<<6),		/*  complement of ring indicator line */
-	 Dcd=	(1<<7),		/*  complement of data carrier detect line */
-	Scratch=7,		/* scratchpad */
-	Dlsb=	0,		/* divisor lsb */
-	Dmsb=	1,		/* divisor msb */
-
-	Serial=	0,
-	Modem=	1,
-};
-
-typedef struct Uart	Uart;
-struct Uart
-{
-	int	port;
-	uchar	sticky[8];	/* sticky write register values */
-	int	nofifo;
-
-	void	(*rx)(int);	/* routine to take a received character */
-	int	(*tx)(void);	/* routine to get a character to transmit */
-
-	ulong	frame;
-	ulong	overrun;
-};
-
-/* externally-visible console-on-a-uart flag */
-int	uartcons;
-
-Uart	uart[2];
-
-#define UartFREQ 1843200
-
-#define uartwrreg(u,r,v)	outb((u)->port + r, (u)->sticky[r] | (v))
-#define uartrdreg(u,r)		inb((u)->port + r)
-
-/*
- *  set the baud rate by calculating and setting the baudrate
- *  generator constant.  This will work with fairly non-standard
- *  baud rates.
- */
-static void
-uartsetbaud(Uart *up, int rate)
-{
-	ulong brconst;
-
-	brconst = (UartFREQ+8*rate-1)/(16*rate);
-
-	uartwrreg(up, Format, Dra);
-	outb(up->port+Dmsb, (brconst>>8) & 0xff);
-	outb(up->port+Dlsb, brconst & 0xff);
-	uartwrreg(up, Format, 0);
-}
-
-/*
- *  toggle DTR
- */
-static void
-uartdtr(Uart *up, int n)
-{
-	if(n)
-		up->sticky[Mctl] |= Dtr;
-	else
-		up->sticky[Mctl] &= ~Dtr;
-	uartwrreg(up, Mctl, 0);
-}
-
-/*
- *  toggle RTS
- */
-static void
-uartrts(Uart *up, int n)
-{
-	if(n)
-		up->sticky[Mctl] |= Rts;
-	else
-		up->sticky[Mctl] &= ~Rts;
-	uartwrreg(up, Mctl, 0);
-}
-
-/*
- * Enable/disable FIFOs (if possible).
- */
-static void
-uartfifo(Uart *up, int n)
-{
-	int i, s;
-
-	if(up->nofifo)
-		return;
-
-	s = splhi();
-
-	/* reset fifos */
-	uartwrreg(up, Fifoctl, Fclear);
-
-	/* empty buffer and interrupt conditions */
-	for(i = 0; i < 16; i++){
-		uartrdreg(up, Istat);
-		uartrdreg(up, Data);
-	}
-
-	/* turn on fifo */
-	if(n){
-		uartwrreg(up, Fifoctl, Fena|Ftrig);
-
-		if((uartrdreg(up, Istat) & Fenabd) == 0){
-			/* didn't work, must be an earlier chip type */
-			up->nofifo = 1;
-		}
-	}
-
-	splx(s);
-}
-
-static void
-uartintr(Ureg *ur, void *arg)
-{
-	Uart *up;
-	int ch;
-	int s, l, loops;
-
-	USED(ur);
-
-	up = arg;
-	for(loops = 0; loops < 1024; loops++){
-		s = uartrdreg(up, Istat);
-		switch(s & 0x3F){
-		case 6:	/* receiver line status */
-			l = uartrdreg(up, Lstat);
-			if(l & Ferror)
-				up->frame++;
-			if(l & Oerror)
-				up->overrun++;
-			break;
-
-		case 4:	/* received data available */
-		case 12:
-			ch = inb(up->port+Data);
-			if (Development && (ch & Asciimask) == DLE)
-				firmware();
-			if(up->rx)
-				(*up->rx)(ch & Asciimask);
-			break;
-
-		case 2:	/* transmitter empty */
-			ch = -1;
-			if(up->tx)
-				ch = (*up->tx)();
-			if(ch != -1)
-				outb(up->port+Data, ch);
-			break;
-
-		case 0:	/* modem status */
-			uartrdreg(up, Mstat);
-			break;
-
-		default:
-			if(s&1)
-				return;
-			print("weird modem interrupt #%2.2ux\n", s);
-			break;
-		}
-	}
-	panic("uartintr: 0x%2.2ux\n", uartrdreg(up, Istat));
-}
-
-/*
- *  turn on a port's interrupts.  set DTR and RTS
- */
-static void
-uartenable(Uart *up)
-{
-	/*
- 	 *  turn on interrupts
-	 */
-	up->sticky[Iena] = 0;
-	if(up->tx)
-		up->sticky[Iena] |= Ixmt;
-	if(up->rx)
-		up->sticky[Iena] |= Ircv|Irstat;
-
-	/*
-	 *  turn on DTR and RTS
-	 */
-	uartdtr(up, 1);
-	uartrts(up, 1);
-	uartfifo(up, 1);
-
-	uartwrreg(up, Iena, 0);
-}
-
-void
-uartspecial(int port, void (*rx)(int), int (*tx)(void), int baud)
-{
-	Uart *up = &uart[0];
-
-	if(up->port)
-		return;
-
-	switch(port){
-
-	case 0:
-		up->port = 0x3F8;
-		setvec(Uart0vec, uartintr, up);
-		break;
-
-	case 1:
-		up->port = 0x2F8;
-		setvec(Uart1vec, uartintr, up);
-		break;
-
-	default:
-		return;
-	}
-
-	/*
-	 *  set rate to 9600 baud.
-	 *  8 bits/character.
-	 *  1 stop bit.
-	 *  interrupts enabled.
-	 */
-	uartsetbaud(up, 9600);
-	up->sticky[Format] = Bits8;
-	uartwrreg(up, Format, 0);
-	up->sticky[Mctl] |= Inton;
-	uartwrreg(up, Mctl, 0x0);
-
-	up->rx = rx;
-	up->tx = tx;
-	uartenable(up);
-	if(baud)
-		uartsetbaud(up, baud);
-	uartcons = 1;
-}
-
-int
-uartgetc(void)
-{
-	Uart *up = &uart[0];
-
-	if(uartrdreg(up, Lstat) & Inready)
-		return inb(up->port+Data);
-	return 0;
-}
-
-void
-uartputc(int c)
-{
-	Uart *up = &uart[0];
-	int i;
-
-	for(i = 0; i < 100; i++){
-		if(uartrdreg(up, Lstat) & Outready)
-			break;
-		delay(1);
-	}
-	outb(up->port+Data, c);
-}
-
-void
-uartspecial1(int port, void (*rx)(int), int (*tx)(void), int baud)
-{
-	Uart *up = &uart[1];
-
-	if(up->port)
-		return;
-
-	switch(port){
-
-	case 0:
-		up->port = 0x3F8;
-		setvec(Uart0vec, uartintr, up);
-		break;
-
-	case 1:
-		up->port = 0x2F8;
-		setvec(Uart1vec, uartintr, up);
-		break;
-
-	default:
-		return;
-	}
-
-	/*
-	 *  set rate to 9600 baud.
-	 *  8 bits/character.
-	 *  1 stop bit.
-	 *  interrupts enabled.
-	 */
-	uartsetbaud(up, 9600);
-	up->sticky[Format] = Bits8;
-	uartwrreg(up, Format, 0);
-	up->sticky[Mctl] |= Inton;
-	uartwrreg(up, Mctl, 0x0);
-
-	up->rx = rx;
-	up->tx = tx;
-	uartenable(up);
-	if(baud)
-		uartsetbaud(up, baud);
-}
-
-int
-uartgetc1(void)
-{
-	Uart *up = &uart[1];
-
-	if(uartrdreg(up, Lstat) & Inready)
-		return inb(up->port+Data);
-	return 0;
-}
-
-void
-uartputc1(int c)
-{
-	Uart *up = &uart[1];
-	int i;
-
-	for(i = 0; i < 100; i++){
-		if(uartrdreg(up, Lstat) & Outready)
-			break;
-		delay(1);
-	}
-	outb(up->port+Data, c);
-}

+ 0 - 351
sys/src/fs/pc/8253.c

@@ -1,351 +0,0 @@
-#include "all.h"
-#include "mem.h"
-#include "ureg.h"
-#include "io.h"
-
-/*
- *  8253 timer
- */
-enum
-{
-	T0cntr	= 0x40,		/* counter ports */
-	T1cntr	= 0x41,		/* ... */
-	T2cntr	= 0x42,		/* ... */
-	Tmode	= 0x43,		/* mode port */
-
-	/* commands */
-	Latch0	= 0x00,		/* latch counter 0's value */
-	Load0	= 0x30,		/* load counter 0 with 2 bytes */
-
-	/* modes */
-	Square	= 0x36,		/* periodic square wave */
-	Trigger	= 0x30,		/* interrupt on terminal count */
-
-	Freq	= 1193182,	/* Real clock frequency */
-};
-
-static uvlong cpufreq	= 66000000;
-static uvlong cpuhz;
-static int cpumhz	= 66;
-static int loopconst	= 100;
-/*static*/ int cpuidax, cpuiddx;
-static char cpuidid[16];
-static int havetsc;
-
-static void
-clockintr(Ureg *ur, void *v)
-{
-	USED(v);
-	clock(0, ur->pc);
-}
-
-#define STEPPING(x)	((x)&0xf)
-#define MODEL(x)	(((x)>>4)&0xf)
-#define FAMILY(x)	(((x)>>8)&0xf)
-
-enum
-{
-	/* flags */
-	CpuidFPU	= 0x001,	/* on-chip floating point unit */
-	CpuidMCE	= 0x080,	/* machine check exception */
-	CpuidCX8	= 0x100,	/* CMPXCHG8B instruction */
-};
-
-typedef struct
-{
-	int family;
-	int model;
-	int aalcycles;
-	char *name;
-} X86type;
-
-static X86type x86intel[] =
-{
-	{ 4,	0,	22,	"486DX", },	/* known chips */
-	{ 4,	1,	22,	"486DX50", },
-	{ 4,	2,	22,	"486SX", },
-	{ 4,	3,	22,	"486DX2", },
-	{ 4,	4,	22,	"486SL", },
-	{ 4,	5,	22,	"486SX2", },
-	{ 4,	7,	22,	"DX2WB", },	/* P24D */
-	{ 4,	8,	22,	"DX4", },	/* P24C */
-	{ 4,	9,	22,	"DX4WB", },	/* P24CT */
-	{ 5,	0,	23,	"P5", },
-	{ 5,	1,	23,	"P5", },
-	{ 5,	2,	23,	"P54C", },
-	{ 5,	3,	23,	"P24T", },
-	{ 5,	4,	23,	"P55C MMX", },
-	{ 5,	7,	23,	"P54C VRT", },
-	{ 6,	1,	16,	"PentiumPro", },/* trial and error */
-	{ 6,	3,	16,	"PentiumII", },
-	{ 6,	5,	16,	"PentiumII/Xeon", },
-	{ 6,	6,	16,	"Celeron", },
-	{ 6,	7,	16,	"PentiumIII/Xeon", },
-	{ 6,	8,	16,	"PentiumIII/Xeon", },
-	{ 6,	0xB,	16,	"PentiumIII/Xeon", },
-	{ 0xF,	1,	16,	"P4", },	/* P4 */
-	{ 0xF,	2,	16,	"PentiumIV/Xeon", },
-
-	{ 3,	-1,	32,	"386", },	/* family defaults */
-	{ 4,	-1,	22,	"486", },
-	{ 5,	-1,	23,	"P5", },
-	{ 6,	-1,	16,	"P6", },
-	{ 0xF,	-1,	16,	"P4", },	/* P4 */
-
-	{ -1,	-1,	16,	"unknown", },	/* total default */
-};
-
-/*
- * The AMD processors all implement the CPUID instruction.
- * The later ones also return the processor name via functions
- * 0x80000002, 0x80000003 and 0x80000004 in registers AX, BX, CX
- * and DX:
- *	K5	"AMD-K5(tm) Processor"
- *	K6	"AMD-K6tm w/ multimedia extensions"
- *	K6 3D	"AMD-K6(tm) 3D processor"
- *	K6 3D+	?
- */
-static X86type x86amd[] =
-{
-	{ 5,	0,	23,	"AMD-K5", },	/* guesswork */
-	{ 5,	1,	23,	"AMD-K5", },	/* guesswork */
-	{ 5,	2,	23,	"AMD-K5", },	/* guesswork */
-	{ 5,	3,	23,	"AMD-K5", },	/* guesswork */
-	{ 5,	6,	11,	"AMD-K6", },	/* trial and error */
-	{ 5,	7,	11,	"AMD-K6", },	/* trial and error */
-	{ 5,	8,	11,	"AMD-K6-2", },	/* trial and error */
-	{ 5,	9,	11,	"AMD-K6-III", },/* trial and error */
-
-	{ 6,	1,	11,	"AMD-Athlon", },/* trial and error */
-	{ 6,	2,	11,	"AMD-Athlon", },/* trial and error */
-
-	{ 4,	-1,	22,	"Am486", },	/* guesswork */
-	{ 5,	-1,	23,	"AMD-K5/K6", },	/* guesswork */
-	{ 6,	-1,	11,	"AMD-Athlon", },/* guesswork */
-	{ 0xF,	-1,	11,	"AMD64", },	/* guesswork */
-
-	{ -1,	-1,	23,	"unknown", },	/* total default */
-};
-
-/*
- * WinChip 240MHz
- */
-static X86type x86winchip[] =
-{
-	{5,	4,	23,	"Winchip",},	/* guesswork */
-	{6,	7,	23,	"Via C3 Samuel 2 or Ezra",},
-	{6,	8,	23,	"Via C3 Ezra-T",},
-	{ -1,	-1,	23,	"unknown", },	/* total default */
-};
-
-/*
- * SiS 55x
- */
-static X86type x86sis[] =
-{
-	{5,	0,	23,	"SiS 55x",},	/* guesswork */
-	{ -1,	-1,	23,	"unknown", },	/* total default */
-};
-
-static X86type	*cputype;
-
-static void
-simplecycles(uvlong*x)
-{
-	*x = m->ticks;
-}
-
-void	(*cycles)(uvlong*) = simplecycles;
-void	_cycles(uvlong*);	/* in l.s */
-
-static void
-nop(void)
-{
-}
-
-void (*coherence)(void) = nop;
-
-/*
- *  delay for l milliseconds more or less.  delayloop is set by
- *  clockinit() to match the actual CPU speed.
- */
-void
-delay(int l)
-{
-	l *= loopconst;
-	if(l <= 0)
-		l = 1;
-	aamloop(l);
-}
-
-/*
- *  microsecond delay
- */
-void
-microdelay(int l)
-{
-	l *= loopconst;
-	l /= 1000;
-	if(l <= 0)
-		l = 1;
-	aamloop(l);
-}
-
-void
-printcpufreq(void)
-{
-	int i;
-	char buf[128];
-
-	i = sprint(buf, "cpu%d: %dMHz ", 0, cpumhz);
-	if(cpuidid[0])
-		i += sprint(buf+i, "%s ", cpuidid);
-	sprint(buf+i, "%s (cpuid: AX 0x%4.4ux DX 0x%4.4ux)\n",
-		cputype->name, cpuidax, cpuiddx);
-	print(buf);
-}
-
-void
-clockinit(void)
-{
-	int x, y;	/* change in counter */
-	int family, model, loops, incr;
-	X86type *t;
-	uvlong a, b;
-
-	/*
-	 *  set vector for clock interrupts
-	 */
-	setvec(Clockvec, clockintr, 0);
-
-	/*
-	 *  figure out what we are
-	 */
-	cpuid(cpuidid, &cpuidax, &cpuiddx);
-	if(strncmp(cpuidid, "AuthenticAMD", 12) == 0)
-		t = x86amd;
-	else if(strncmp(cpuidid, "CentaurHauls", 12) == 0)
-		t = x86winchip;
-	else if(strncmp(cpuidid, "SiS SiS SiS ", 12) == 0)
-		t = x86sis;
-	else
-		t = x86intel;
-	family = FAMILY(cpuidax);
-	model = MODEL(cpuidax);
-	while(t->name){
-		if((t->family == family && t->model == model)
-		|| (t->family == family && t->model == -1)
-		|| (t->family == -1))
-			break;
-		t++;
-	}
-	cputype = t;
-
-	if(family >= 5)
-		coherence = wbflush;
-
-	/*
-	 *  if there is one, set tsc to a known value
-	 */
-	if(cpuiddx & 0x10){
-		havetsc = 1;
-		cycles = _cycles;
-		if(cpuiddx & 0x20)
-			wrmsr(0x10, 0);
-	}
-
-	/*
-	 *  set clock for 1/HZ seconds
-	 */
-	outb(Tmode, Load0|Square);
-	outb(T0cntr, (Freq/HZ));	/* low byte */
-	outb(T0cntr, (Freq/HZ)>>8);	/* high byte */
-
-	/*
-	 * Introduce a little delay to make sure the count is
-	 * latched and the timer is counting down; with a fast
-	 * enough processor this may not be the case.
-	 * The i8254 (which this probably is) has a read-back
-	 * command which can be used to make sure the counting
-	 * register has been written into the counting element.
-	 */
-	x = (Freq/HZ);
-	for(loops = 0; loops < 100000 && x >= (Freq/HZ); loops++){
-		outb(Tmode, Latch0);
-		x = inb(T0cntr);
-		x |= inb(T0cntr)<<8;
-	}
-
-	/* find biggest loop that doesn't wrap */
-	incr = 16000000/(t->aalcycles*HZ*2);
-	x = 2000;
-	for(loops = incr; loops < 64*1024; loops += incr) {
-
-		/*
-		 *  measure time for the loop
-		 *
-		 *			MOVL	loops,CX
-		 *	aaml1:	 	AAM
-		 *			LOOP	aaml1
-		 *
-		 *  the time for the loop should be independent of external
-		 *  cache and memory system since it fits in the execution
-		 *  prefetch buffer.
-		 *
-		 */
-		outb(Tmode, Latch0);
-		cycles(&a);
-		x = inb(T0cntr);
-		x |= inb(T0cntr)<<8;
-		aamloop(loops);
-		outb(Tmode, Latch0);
-		cycles(&b);
-		y = inb(T0cntr);
-		y |= inb(T0cntr)<<8;
-		x -= y;
-
-		if(x < 0)
-			x += Freq/HZ;
-
-		if(x > Freq/(3*HZ))
-			break;
-	}
-
-	/*
- 	 *  figure out clock frequency and a loop multiplier for delay().
-	 *  n.b. counter goes up by 2*Freq
-	 */
-	cpufreq = (vlong)loops*((t->aalcycles*2*Freq)/x);
-	loopconst = (cpufreq/1000)/t->aalcycles;	/* AAM+LOOP's for 1 ms */
-	if (0)
-		print("loops %d x %d cpufreq %,lld loopconst %d\n", loops, x, cpufreq, loopconst);
-
-	if(havetsc){
-		/* counter goes up by 2*Freq */
-		b = (b-a)<<1;
-		b *= Freq;
-		b /= x;
-
-		/*
-		 *  round to the nearest megahz
-		 */
-		cpumhz = (b+500000)/1000000L;
-		cpuhz = b;
-	} else {
-		/*
-		 *  add in possible 0.5% error and convert to MHz
-		 */
-		cpumhz = (cpufreq + cpufreq/200)/1000000;
-		cpuhz = cpufreq;
-	}
-	if (0) {
-		print("cpuhz %,lld cpumhz %d\n", cpuhz, cpumhz);
-		delay(10*1000);
-	}
-}
-
-void
-clockreload(Timet n)
-{
-	USED(n);
-}

+ 0 - 101
sys/src/fs/pc/cga.c

@@ -1,101 +0,0 @@
-#include "all.h"
-#include "mem.h"
-
-enum {
-	Width		= 160,
-	Height		= 25,
-
-	Attr		= 7,		/* white on black */
-};
-
-#define CGASCREENBASE	((uchar*)(KZERO|0xB8000))
-
-static int pos;
-static int screeninitdone;
-static Lock screenlock;
-
-static uchar
-cgaregr(int index)
-{
-	outb(0x3D4, index);
-	return inb(0x3D4+1) & 0xFF;
-}
-
-static void
-cgaregw(int index, int data)
-{
-	outb(0x3D4, index);
-	outb(0x3D4+1, data);
-}
-
-static void
-movecursor(void)
-{
-	cgaregw(0x0E, (pos/2>>8) & 0xFF);
-	cgaregw(0x0F, pos/2 & 0xFF);
-	CGASCREENBASE[pos+1] = Attr;
-}
-
-static void
-cgascreenputc(int c)
-{
-	int i;
-
-	if(c == '\r')
-		return;
-	if(c == '\n'){
-		pos = pos/Width;
-		pos = (pos+1)*Width;
-	}
-	else if(c == '\t'){
-		i = 4 - ((pos/2)&3);
-		while(i-->0)
-			cgascreenputc(' ');
-	}
-	else if(c == '\b'){
-		if(pos >= 2)
-			pos -= 2;
-		cgascreenputc(' ');
-		pos -= 2;
-	}
-	else{
-		CGASCREENBASE[pos++] = c;
-		CGASCREENBASE[pos++] = Attr;
-	}
-	if(pos >= Width*Height){
-		memmove(CGASCREENBASE, &CGASCREENBASE[Width], Width*(Height-1));
-		memset(&CGASCREENBASE[Width*(Height-1)], 0, Width);
-		pos = Width*(Height-1);
-	}
-	movecursor();
-}
-
-static void
-screeninit(void)
-{
-	lock(&screenlock);
-	if(screeninitdone == 0){
-		pos = cgaregr(0x0E)<<8;
-		pos |= cgaregr(0x0F);
-		pos *= 2;
-		screeninitdone = 1;
-	}
-	unlock(&screenlock);
-}
-
-void
-cgaputs(char* s, int n)
-{
-	if(screeninitdone == 0)
-		screeninit();
-	while(n-- > 0)
-		cgascreenputc(*s++);
-}
-
-void
-cgaputc(int c)
-{
-	if(screeninitdone == 0)
-		screeninit();
-	cgascreenputc(c);
-}

+ 0 - 107
sys/src/fs/pc/compat.c

@@ -1,107 +0,0 @@
-/*
- * fs kernel compatibility hacks for drivers from the cpu/terminal kernel
- */
-#include "all.h"
-#include "io.h"
-#include "mem.h"
-#include "../ip/ip.h"	/* for Ether */
-#include "etherif.h"	/* for Ether */
-#include "compat.h"
-
-enum {
-	VectorPIC	= 24,		/* external [A]PIC interrupts */
-};
-
-void
-free(void *p)		/* there's a struct member named "free".  sigh. */
-{
-	USED(p);
-}
-
-void *
-mallocz(ulong sz, int clr)
-{
-	void *p = malloc(sz);
-
-	if (clr && p != nil)
-		memset(p, '\0', sz);
-	return p;
-}
-
-void
-freeb(Block *b)
-{
-	mbfree(b);
-}
-
-/*
- *  free a list of blocks
- */
-void
-freeblist(Block *b)
-{
-	Block *next;
-
-	for(; b != 0; b = next){
-		next = b->next;
-		b->next = 0;
-		freeb(b);
-	}
-}
-
-int
-readstr(vlong, void *, int, char *)
-{
-	return 0;
-}
-
-void
-addethercard(char *, int (*)(struct Ether *))
-{
-}
-
-void
-kproc(char *name, void (*f)(void), void *arg)
-{
-	userinit(f, arg, strdup(name));
-}
-
-void
-intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name)
-{
-	setvec(irq+VectorPIC, f, a);
-	USED(tbdf, name);
-}
-
-int
-intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name)
-{
-	USED(irq, f, a, tbdf, name);
-	return -1;
-}
-
-/*
- * Atomically replace *p with copy of s
- */
-void
-kstrdup(char **p, char *s)
-{
-	int n;
-	char *t, *prev;
-	static Lock l;
-
-	n = strlen(s)+1;
-	/* if it's a user, we can wait for memory; if not, something's very wrong */
-	if(0 && u){
-		t = /* s */malloc(n);
-		// setmalloctag(t, getcallerpc(&p));
-	}else{
-		t = malloc(n);
-		if(t == nil)
-			panic("kstrdup: no memory");
-	}
-	memmove(t, s, n);
-	prev = *p;
-	*p = t;
-	free(prev);
-}

+ 0 - 86
sys/src/fs/pc/compat.h

@@ -1,86 +0,0 @@
-/*
- * fs kernel compatibility hacks for drivers from the cpu/terminal kernel
- */
-#define ETHERIQ(a, b, c) 	etheriq((a), (b))
-/*
- * cpu kernel uses bp->rp to point to start of packet and bp->wp to point
- * just past valid data in the packet.
- * fs kernel uses bp->data to point to start of packet and bp->data+bp->count
- * points just past valid data.
- * except beware that mballoc(count, ...) sets  bp->count = count(!)
- */
-#define BLEN(bp)		(bp)->count
-#define SETWPCNT(bp, cnt)	(bp)->count = (cnt)
-/* mballoc does:	mb->data = mb->xdata+256; */
-#define BLKRESET(bp)		((bp)->data = (bp)->xdata +256, (bp)->count = 0)
-#define INCRPTR(bp, incr)	(bp)->count += (incr)
-#define ENDDATA(bp)		((bp)->data + (bp)->count)
-
-#define	ROUND(s, sz)	(((s)+((sz)-1))&~((sz)-1))
-
-#define Block	Msgbuf
-#define rp	data			/* Block member → Msgbuf member */
-#define Etherpkt Enpkt
-#define Eaddrlen Easize
-#define ETHERHDRSIZE Ensize
-
-#ifndef CACHELINESZ
-#define CACHELINESZ	32		/* pentium & later */
-#endif
-
-#define KNAMELEN NAMELEN
-#define READSTR 128
-
-#define KADDR(a)	((void*)((ulong)(a)|KZERO))
-#define PCIWINDOW	0
-#define PCIWADDR(va)	(PADDR(va)+PCIWINDOW)
-
-#define iprint print
-
-/* buffers */
-#define allocb(sz)  mballoc((sz), 0, Maeth1)
-#define iallocb(sz) mballoc((sz), 0, Mbeth1)
-
-/* other memory */
-#define malloc(sz)  ialloc((sz), 0)
-#define xspanalloc(sz, align, span)	ialloc((sz)+(align)+(span), (align))
-/* offset==0 in all uses in fs */
-#define mallocalign(sz, align, offset, span) \
-			ialloc((sz)+(align)+(span), (align))
-/* sleazy hacks; really need better allocators */
-#define xalloc(sz) malloc(sz)
-#define xfree(p)
-#define smalloc(sz) malloc(sz)
-
-#define waserror() 0
-#define poperror()
-#define nexterror() return
-#define error(x) goto err
-
-#define qsetlimit(q, lim)
-#define ioalloc(a, b, c, d)	0
-#define iofree(p)
-#define strtol strtoul
-#define PROCARG(arg)
-#define GETARG(arg) getarg()
-
-#define vmap(bar, size) upamalloc(bar, size, 0)
-
-/* see portdat.h for Msgbuf flags */
-void	freeb(Block *b);
-void	freeblist(Block *b);
-void	free(void *p);
-void	*mallocz(ulong sz, int clr);
-char	*strdup(char *);			/* port/config.c */
-void	kstrdup(char **p, char *s);
-
-/* header files mysteriously fail to declare this */
-ulong	upamalloc(ulong addr, int size, int align);
-
-int	readstr(vlong, void *, int, char *);
-void	addethercard(char *, int (*)(struct Ether *));
-void	kproc(char *text, void (*f)(void), void *arg);
-
-/* pc-specific? */
-int	intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int, char *);
-void	intrenable(int irq, void (*f)(Ureg*, void*), void* a, int, char *name);

+ 0 - 858
sys/src/fs/pc/dosfs.c

@@ -1,858 +0,0 @@
-#include "all.h"
-#include "io.h"
-#include "mem.h"
-
-#include "dosfs.h"
-
-#define	GSHORT(p) (((p)[1]<<8)|(p)[0])
-#define	GLONG(p) ((GSHORT(p+2)<<16)|GSHORT(p))
-#define	GLSHORT(p) (((p)[0]<<8)|(p)[1])
-#define	GLLONG(p) ((GLSHORT(p)<<16)|GLSHORT(p+2))
-
-/*
- *  debugging
- */
-#define chatty	0
-#define	chat	if(chatty)print
-
-/*
- *  block io buffers
- */
-typedef struct Clustbuf	Clustbuf;
-
-struct Clustbuf
-{
-	int	flags;
-	int	age;
-	Devsize	sector;
-	uchar *	iobuf;
-	Dos *	dos;
-	int	size;
-	int	bufsize;
-};
-
-enum
-{
-	Nbio=	16,
-	LOCKED=	1,
-	MOD=	2,
-	IMMED=	4,
-};
-
-static void	puttime(Dosdir*);
-
-static Clustbuf	bio[Nbio];
-
-/*
- *  write an io buffer and update its flags
- */
-static void
-writeclust(Clustbuf *p)
-{
-	Dos *dos;
-	Off addr;
-
-	dos = p->dos;
-	addr = (p->sector+dos->start)*dos->sectbytes;
-	chat("writeclust @ %lld addr %lld...", (Wideoff)p->sector,
-		(Wideoff)addr);
-	if((*dos->seek)(dos->dev, addr) < 0)
-		panic("writeclust: seek");
-	if((*dos->write)(dos->dev, p->iobuf, p->size) != p->size)
-		panic("writeclust: write");
-	p->flags &= ~(MOD|IMMED);
-	chat("OK\n");
-}
-
-/*
- *  write any dirty buffers
- */
-static void
-syncclust(void)
-{
-	Clustbuf *p;
-
-	for(p = bio; p < &bio[Nbio]; p++){
-		if(p->flags & LOCKED)
-			panic("syncclust");
-		if(p->flags & MOD)
-			writeclust(p);
-	}
-}
-
-/*
- *  get an io buffer, possibly with valid data
- */
-static Clustbuf*
-getclust0(Dos *dos, Off sector)
-{
-	Clustbuf *p, *oldest;
-
-	chat("getclust0 @ %lld\n", (Wideoff)sector);
-
-	/*
-	 *  if we have it, just return it
-	 *  otherwise, reuse the oldest unlocked entry
-	 */
-	oldest = 0;
-	for(p = bio; p < &bio[Nbio]; p++){
-		if(sector == p->sector && dos == p->dos){
-			if(p->flags & LOCKED)
-				panic("getclust0 locked");
-			chat("getclust0 %lld in cache\n", (Wideoff)sector);
-			p->flags |= LOCKED;
-			return p;
-		}
-		if(p->flags & LOCKED)
-			continue;
-		if(oldest == 0 || p->age <= oldest->age)
-			oldest = p;
-	}
-	p = oldest;
-	if(p == 0)
-		panic("getclust0 all locked");
-	p->flags |= LOCKED;
-	if(p->flags & MOD)
-		writeclust(p);
-
-	/*
-	 *  make sure the buffer is big enough
-	 */
-	if(p->iobuf==0 || p->bufsize < dos->clustbytes){
-		p->bufsize = dos->clustbytes;
-		p->iobuf = ialloc(p->bufsize, 0);
-	}
-	if(sector >= dos->dataaddr)
-		p->size = dos->clustbytes;
-	else
-		p->size = dos->sectbytes;
-	p->dos = 0;	/* make it invalid */
-	return p;
-}
-
-/*
- *  get an io block from an io buffer
- */
-static Clustbuf*
-getclust(Dos *dos, Off sector)
-{
-	Clustbuf *p;
-	Off addr;
-
-	p = getclust0(dos, sector);
-	if(p->dos){
-		p->age = MACHP(0)->ticks;
-		return p;
-	}
-	addr = (sector+dos->start)*dos->sectbytes;
-	chat("getclust seek addr %lld\n", (Wideoff)addr);
-	if((*dos->seek)(dos->dev, addr) < 0){
-		chat("can't seek block\n");
-		return 0;
-	}
-	chat("getclust read addr %lld\n", (Wideoff)addr);
-	if((*dos->read)(dos->dev, p->iobuf, p->size) != p->size){
-		chat("can't read block\n");
-		return 0;
-	}
-
-	p->age = MACHP(0)->ticks;
-	p->dos = dos;
-	p->sector = sector;
-	chat("getclust %lld read\n", (Wideoff)sector);
-	return p;
-}
-
-/*
- *  get an io block from an io buffer;
- *  any current data is discarded.
- */
-static Clustbuf*
-getclustz(Dos *dos, Off sector)
-{
-	Clustbuf *p;
-
-	p = getclust0(dos, sector);
-	p->age = MACHP(0)->ticks;
-	p->dos = dos;
-	p->sector = sector;
-	memset(p->iobuf, 0, p->size);
-	p->flags |= MOD;
-	chat("getclustz %lld\n", (Wideoff)sector);
-	return p;
-}
-
-/*
- *  release an io buffer
- */
-static void
-putclust(Clustbuf *p)
-{
-	if(!(p->flags & LOCKED))
-		panic("putclust lock");
-	if((p->flags & (MOD|IMMED)) == (MOD|IMMED))
-		writeclust(p);
-	p->flags &= ~LOCKED;
-	chat("putclust @ sector %lld...", (Wideoff)p->sector);
-}
-
-/*
- *  walk the fat one level ( n is a current cluster number ).
- *  return the new cluster number or -1 if no more.
- */
-static long
-fatwalk(Dos *dos, int n)
-{
-	ulong k, sect;
-	Clustbuf *p;
-	int o;
-
-	chat("fatwalk %d\n", n);
-
-	if(n < 2 || n >= dos->fatclusters)
-		return -1;
-
-	switch(dos->fatbits){
-	case 12:
-		k = (3*n)/2; break;
-	case 16:
-		k = 2*n; break;
-	default:
-		return -1;
-	}
-	if(k >= dos->fatbytes)
-		panic("getfat");
-
-	sect = k/dos->sectbytes + dos->fataddr;
-	o = k%dos->sectbytes;
-	p = getclust(dos, sect);
-	k = p->iobuf[o++];
-	if(o >= dos->sectbytes){
-		putclust(p);
-		p = getclust(dos, sect+1);
-		o = 0;
-	}
-	k |= p->iobuf[o]<<8;
-	putclust(p);
-	if(dos->fatbits == 12){
-		if(n&1)
-			k >>= 4;
-		else
-			k &= 0xfff;
-		if(k >= 0xff8)
-			k |= 0xf000;
-	}
-	k = k < 0xfff8 ? k : -1;
-	chat("fatwalk %d -> %lud\n", n, k);
-	return k;
-}
-
-/*
- *  write a value into each copy of the fat.
- */
-static void
-fatwrite(Dos *dos, int n, int val)
-{
-	Off k, sect;
-	Clustbuf *p;
-	int i, o;
-
-	chat("fatwrite %d %d...", n, val);
-
-	if(n < 2 || n >= dos->fatclusters)
-		panic("fatwrite n");
-
-	switch(dos->fatbits){
-	case 12:
-		k = (3*n)/2; break;
-	case 16:
-		k = 2*n; break;
-	default:
-		panic("fatwrite fatbits");
-		return;
-	}
-	if(k >= dos->fatbytes)
-		panic("fatwrite k");
-
-	for(i=0; i<dos->nfats; i++, k+=dos->fatbytes){
-		sect = k/dos->sectbytes + dos->fataddr;
-		o = k%dos->sectbytes;
-		p = getclust(dos, sect);
-		if(p == 0)
-			panic("fatwrite getclust");
-		switch(dos->fatbits){
-		case 12:
-			if(n&1){
-				p->iobuf[o] &= 0x0f;
-				p->iobuf[o++] |= val<<4;
-			}else
-				p->iobuf[o++] = val;
-			if(o >= dos->sectbytes){
-				p->flags |= MOD;
-				putclust(p);
-				p = getclust(dos, sect+1);
-				if(p == 0)
-					panic("fatwrite getclust");
-				o = 0;
-			}
-			if(n&1)
-				p->iobuf[o] = val>>4;
-			else{
-				p->iobuf[o] &= 0xf0;
-				p->iobuf[o] |= (val>>8)&0x0f;
-			}
-			break;
-		case 16:
-			p->iobuf[o++] = val;
-			p->iobuf[o] = val>>8;
-			break;
-		}
-		p->flags |= MOD;
-		putclust(p);
-	}
-	chat("OK\n");
-}
-
-/*
- *  allocate a free cluster from the fat.
- */
-static int
-fatalloc(Dos *dos)
-{
-	Clustbuf *p;
-	int n;
-
-	n = dos->freeptr;
-	for(;;){
-		if(fatwalk(dos, n) == 0)
-			break;
-		if(++n >= dos->fatclusters)
-			n = 2;
-		if(n == dos->freeptr)
-			return -1;
-	}
-	dos->freeptr = n+1;
-	if(dos->freeptr >= dos->fatclusters)
-		dos->freeptr = 2;
-	fatwrite(dos, n, 0xffff);
-	p = getclustz(dos, dos->dataaddr + (n-2)*dos->clustsize);
-	putclust(p);
-	return n;
-}
-
-/*
- *  map a file's logical sector address to a physical sector address
- */
-static long
-fileaddr(Dosfile *fp, Off ltarget, Clustbuf *pdir)
-{
-	Dos *dos = fp->dos;
-	Dosdir *dp;
-	Off p;
-
-	chat("fileaddr %8.8s %lld\n", fp->name, (Wideoff)ltarget);
-	/*
-	 *  root directory is contiguous and easy
-	 */
-	if(fp->pdir == 0){
-		if(ltarget*dos->sectbytes >= dos->rootsize*sizeof(Dosdir))
-			return -1;
-		p = dos->rootaddr + ltarget;
-		chat("fileaddr %lld -> %lld\n", (Wideoff)ltarget, (Wideoff)p);
-		return p;
-	}
-	if(fp->pstart == 0){	/* empty file */
-		if(!pdir)
-			return -1;
-		p = fatalloc(dos);
-		if(p <= 0)
-			return -1;
-		chat("fileaddr initial alloc %lld\n", (Wideoff)p);
-		dp = (Dosdir *)(pdir->iobuf + fp->odir);
-		puttime(dp);
-		dp->start[0] = p;
-		dp->start[1] = p>>8;
-		pdir->flags |= MOD;
-		fp->pstart = p;
-		fp->pcurrent = p;
-		fp->lcurrent = 0;
-	}
-	/*
-	 *  anything else requires a walk through the fat
-	 *  [lp]current will point to the last cluster if we run off the end
-	 */
-	ltarget /= dos->clustsize;
-	if(fp->pcurrent == 0 || fp->lcurrent > ltarget){
-		/* go back to the beginning */
-		fp->lcurrent = 0;
-		fp->pcurrent = fp->pstart;
-	}
-	while(fp->lcurrent < ltarget){
-		/* walk the fat */
-		p = fatwalk(dos, fp->pcurrent);
-		if(p < 0){
-			if(!pdir)
-				return -1;
-			p = fatalloc(dos);
-			if(p < 0){
-				print("file system full\n");
-				return -1;
-			}
-			fatwrite(dos, fp->pcurrent, p);
-		}
-		fp->pcurrent = p;
-		++fp->lcurrent;
-	}
-
-	/*
-	 *  clusters start at 2 instead of 0 (why? - presotto)
-	 */
-	p = dos->dataaddr + (fp->pcurrent-2)*dos->clustsize;
-	chat("fileaddr %lld -> %lld\n", (Wideoff)ltarget, (Wideoff)p);
-	return p;
-}
-
-/*
- *  set up a dos file name
- */
-static void
-setname(char *name, char *ext, char *from)
-{
-	char *to;
-
-	memset(name, ' ', 8);
-	memset(ext, ' ', 3);
-
-	to = name;
-	for(; *from && to-name < 8; from++, to++){
-		if(*from == '.'){
-			from++;
-			break;
-		}
-		if(*from >= 'a' && *from <= 'z')
-			*to = *from + 'A' - 'a';
-		else
-			*to = *from;
-	}
-	to = ext;
-	for(; *from && to-ext < 3; from++, to++){
-		if(*from >= 'a' && *from <= 'z')
-			*to = *from + 'A' - 'a';
-		else
-			*to = *from;
-	}
-
-	chat("name is %8.8s %3.3s\n", name, ext);
-}
-
-/*
- *  walk a directory returns
- * 	-1 if something went wrong
- *	 0 if not found
- *	 1 if found
- */
-static int
-doswalk(Dosfile *fp, char *name)
-{
-	char dname[8], dext[3];
-	Clustbuf *p;
-	Dosdir *dp;
-	Off o, addr;
-
-	if((fp->attr & DOSDIR) == 0){
-		chat("walking non-directory!\n");
-		return -1;
-	}
-
-	setname(dname, dext, name);
-
-	fp->offset = 0;	/* start at the beginning */
-	for(;;){
-		addr = fileaddr(fp, fp->offset/fp->dos->sectbytes, 0);
-		if(addr < 0)
-			return 0;
-		p = getclust(fp->dos, addr);
-		if(p == 0)
-			return -1;
-		for(o=0; o<p->size; o += sizeof(Dosdir)){
-			dp = (Dosdir *)(p->iobuf + o);
-			chat("comparing to %8.8s.%3.3s\n", (char*)dp->name, (char*)dp->ext);
-			if(memcmp(dname, dp->name, sizeof(dp->name)) != 0)
-				continue;
-			if(memcmp(dext, dp->ext, sizeof(dp->ext)) == 0)
-				goto Found;
-		}
-		fp->offset += p->size;
-		putclust(p);
-	}
-
-Found:
-	fp->pdir = p->sector;
-	fp->odir = o;
-	putclust(p);
-	memmove(fp->name, dname, sizeof(fp->name));
-	memmove(fp->ext, dext, sizeof(fp->ext));
-	fp->attr = dp->attr;
-	fp->length = GLONG(dp->length);
-	fp->pstart = GSHORT(dp->start);
-	fp->pcurrent = 0;
-	fp->lcurrent = 0;
-	fp->offset = 0;
-	return 1;
-}
-
-static void
-bootdump(Dosboot *b)
-{
-	if(chatty == 0)
-		return;
-	print("magic: 0x%2.2x 0x%2.2x 0x%2.2x\n",
-		b->magic[0], b->magic[1], b->magic[2]);
-	print("version: \"%8.8s\"\n", (char*)b->version);
-	print("sectbytes: %d\n", GSHORT(b->sectbytes));
-	print("allocsize: %d\n", b->clustsize);
-	print("nresrv: %d\n", GSHORT(b->nresrv));
-	print("nfats: %d\n", b->nfats);
-	print("rootsize: %d\n", GSHORT(b->rootsize));
-	print("volsize: %d\n", GSHORT(b->volsize));
-	print("mediadesc: 0x%2.2x\n", b->mediadesc);
-	print("fatsize: %d\n", GSHORT(b->fatsize));
-	print("trksize: %d\n", GSHORT(b->trksize));
-	print("nheads: %d\n", GSHORT(b->nheads));
-	print("nhidden: %d\n", GLONG(b->nhidden));
-	print("bigvolsize: %d\n", GLONG(b->bigvolsize));
-	print("driveno: %d\n", b->driveno);
-	print("reserved0: 0x%2.2x\n", b->reserved0);
-	print("bootsig: 0x%2.2x\n", b->bootsig);
-	print("volid: 0x%8.8x\n", GLONG(b->volid));
-	print("label: \"%11.11s\"\n", (char*)b->label);
-}
-
-/*
- *  instructions that boot blocks can start with
- */
-#define	JMPSHORT	0xeb
-#define JMPNEAR		0xe9
-
-/*
- *  read dos file system properties
- */
-int
-dosinit(Dos *dos)
-{
-	Clustbuf *p;
-	Dospart *dp;
-	Dosboot *b;
-	int i;
-
-
-	/* defaults till we know better */
-	dos->start = 0;
-	dos->sectbytes = 512;
-	dos->clustsize = 1;
-	dos->clustbytes = 512;
-
-	/* get first sector */
-	p = getclust(dos, 0);
-	if(p == 0){
-		chat("can't read boot block\n");
-		return -1;
-	}
-	p->dos = 0;
-
-	/* if a hard disk format, look for an active partition */
-	b = (Dosboot *)p->iobuf;
-	if(b->magic[0] != JMPNEAR && (b->magic[0] != JMPSHORT || b->magic[2] != 0x90)){
-		if(p->iobuf[0x1fe] != 0x55 || p->iobuf[0x1ff] != 0xaa){
-			print("no dos file system or partition table\n");
-			putclust(p);
-			return -1;
-		}
-		dp = (Dospart*)&p->iobuf[0x1be];
-		for(i = 0; i < 4; i++, dp++)
-			if(dp->type && dp->flag == 0x80)
-				break;
-		if(i == 4){
-			putclust(p);
-			return -1;
-		}
-		dos->start = GLONG(dp->start);
-		putclust(p);
-		p = getclust(dos, 0);
-		if(p == 0){
-			chat("can't read boot block\n");
-			putclust(p);
-			return -1;
-		}
-		p->dos = 0;
-	}
-
-	b = (Dosboot *)p->iobuf;
-	if(b->magic[0] != JMPNEAR && (b->magic[0] != JMPSHORT || b->magic[2] != 0x90)){
-		print("no dos file system\n");
-		putclust(p);
-		return -1;
-	}
-
-	if(chatty)
-		bootdump(b);/**/
-
-	/*
-	 *  determine the systems' wondersous properties
-	 */
-	dos->sectbytes = GSHORT(b->sectbytes);
-	dos->clustsize = b->clustsize;
-	dos->clustbytes = dos->sectbytes*dos->clustsize;
-	dos->nresrv = GSHORT(b->nresrv);
-	dos->nfats = b->nfats;
-	dos->rootsize = GSHORT(b->rootsize);
-	dos->volsize = GSHORT(b->volsize);
-	if(dos->volsize == 0)
-		dos->volsize = GLONG(b->bigvolsize);
-	dos->mediadesc = b->mediadesc;
-	dos->fatsize = GSHORT(b->fatsize);
-	dos->fatbytes = dos->sectbytes*dos->fatsize;
-	dos->fataddr = dos->nresrv;
-	dos->rootaddr = dos->fataddr + dos->nfats*dos->fatsize;
-	i = dos->rootsize*sizeof(Dosdir) + dos->sectbytes - 1;
-	i = i/dos->sectbytes;
-	dos->dataaddr = dos->rootaddr + i;
-	dos->fatclusters = 2+(dos->volsize - dos->dataaddr)/dos->clustsize;
-	if(dos->fatclusters < 4087)
-		dos->fatbits = 12;
-	else
-		dos->fatbits = 16;
-	dos->freeptr = 2;
-	putclust(p);
-
-	/*
-	 *  set up the root
-	 */
-	dos->root.dos = dos;
-	dos->root.pdir = 0;
-	dos->root.odir = 0;
-	memmove(dos->root.name, "<root>  ", 8);
-	memmove(dos->root.ext, "   ", 3);
-	dos->root.attr = DOSDIR;
-	dos->root.length = dos->rootsize*sizeof(Dosdir);
-	dos->root.pstart = 0;
-	dos->root.lcurrent = 0;
-	dos->root.pcurrent = 0;
-	dos->root.offset = 0;
-
-	syncclust();
-	return 0;
-}
-
-static char *
-nextelem(char *path, char *elem)
-{
-	int i;
-
-	while(*path == '/')
-		path++;
-	if(*path==0 || *path==' ')
-		return 0;
-	for(i=0; *path && *path != '/' && *path != ' '; i++){
-		if(i >= NAMELEN){
-			print("name component too long\n");
-			return 0;
-		}
-		*elem++ = *path++;
-	}
-	*elem = 0;
-	return path;
-}
-
-static void
-puttime(Dosdir *d)
-{
-	Timet secs;
-	Rtc rtc;
-	ushort x;
-
-	secs = rtctime();
-	sec2rtc(secs, &rtc);
-	x = (rtc.hour<<11) | (rtc.min<<5) | (rtc.sec>>1);
-	d->time[0] = x;
-	d->time[1] = x>>8;
-	x = ((rtc.year-80)<<9) | ((rtc.mon+1)<<5) | rtc.mday;
-	d->date[0] = x;
-	d->date[1] = x>>8;
-}
-
-Dosfile*
-dosopen(Dos *dos, char *path, Dosfile *fp)
-{
-	char element[NAMELEN];
-
-	*fp = dos->root;
-	while(path = nextelem(path, element)){
-		switch(doswalk(fp, element)){
-		case -1:
-			print("error walking to %s\n", element);
-			return 0;
-		case 0:
-			print("%s not found\n", element);
-			return 0;
-		case 1:
-			print("found %s attr 0x%ux start 0x%llux len %lld\n",
-				element, fp->attr, (Wideoff)fp->pstart,
-				(Wideoff)fp->length);
-			break;
-		}
-	}
-
-	syncclust();
-	return fp;
-}
-
-/*
- *  read from a dos file
- */
-long
-dosread(Dosfile *fp, void *a, long n)
-{
-	Off addr, k, o;
-	Clustbuf *p;
-	uchar *to;
-
-	if((fp->attr & DOSDIR) == 0){
-		if(fp->offset >= fp->length)
-			return 0;
-		if(fp->offset+n > fp->length)
-			n = fp->length - fp->offset;
-	}
-	to = a;
-	while(n > 0){
-		/*
-		 *  read the data; sectors below dos->dataaddr
-		 *  are read one at a time.
-		 */
-		addr = fileaddr(fp, fp->offset/fp->dos->sectbytes, 0);
-		if(addr < 0)
-			return -1;
-		p = getclust(fp->dos, addr);
-		if(p == 0)
-			return -1;
-		/*
-		 *  copy the bytes we need
-		 */
-		o = fp->offset % p->size;
-		k = p->size - o;
-		if(k > n)
-			k = n;
-		memmove(to, p->iobuf+o, k);
-		putclust(p);
-		to += k;
-		fp->offset += k;
-		n -= k;
-	}
-	syncclust();
-	return to - (uchar *)a;
-}
-
-/*
- *  write to a dos file
- */
-long
-doswrite(Dosfile *fp, void *a, long n)
-{
-	Off blksize, addr, k, o;
-	Clustbuf *p, *pdir;
-	Dosdir *dp;
-	uchar *from;
-
-	if(fp->attr & DOSDIR){
-		print("write dir\n");
-		return -1;
-	}
-	if(fp->pdir){
-		pdir = getclust(fp->dos, fp->pdir);
-		/*
-		 *  should do consistency check if
-		 *  concurrent access is possible.
-		 */
-		if(pdir == 0)
-			panic("doswrite");
-	}else
-		pdir = 0;
-	blksize = pdir ? fp->dos->clustbytes : fp->dos->sectbytes;
-	from = a;
-	while(n > 0){
-		addr = fileaddr(fp, fp->offset/fp->dos->sectbytes, pdir);
-		if(addr < 0)
-			return -1;
-		o = fp->offset % blksize;
-		if(o == 0 && n >= blksize)
-			p = getclustz(fp->dos, addr);
-		else
-			p = getclust(fp->dos, addr);
-		if(p == 0)
-			return -1;
-		/*
-		 *  copy the bytes we need
-		 */
-		k = p->size - o;
-		if(k > n)
-			k = n;
-		memmove(p->iobuf+o, from, k);
-		p->flags |= MOD;
-		putclust(p);
-		from += k;
-		fp->offset += k;
-		n -= k;
-	}
-	if(pdir){
-		dp = (Dosdir *)(pdir->iobuf + fp->odir);
-		puttime(dp);
-		if(fp->offset > fp->length){
-			fp->length = fp->offset;
-			dp->length[0] = fp->length;
-			dp->length[1] = fp->length>>8;
-			dp->length[2] = fp->length>>16;
-			dp->length[3] = fp->length>>24;
-		}
-		pdir->flags |= MOD;
-		putclust(pdir);
-	}
-	syncclust();
-	return from - (uchar *)a;
-}
-
-/*
- *  truncate a dos file to zero length
- */
-int
-dostrunc(Dosfile *fp)
-{
-	Clustbuf *pdir;
-	Dosdir *dp;
-	Off p, np;
-
-	if(fp->attr & DOSDIR){
-		print("trunc dir\n");
-		return -1;
-	}
-	pdir = getclust(fp->dos, fp->pdir);
-	if(pdir == 0)
-		panic("dostrunc");
-	p = fatwalk(fp->dos, fp->pstart);
-	fatwrite(fp->dos, fp->pstart, 0xffff);
-	while(p >= 0){
-		np = fatwalk(fp->dos, p);
-		fatwrite(fp->dos, p, 0);
-		p = np;
-	}
-	fp->length = 0;
-	dp = (Dosdir *)(pdir->iobuf + fp->odir);
-	puttime(dp);
-	dp->length[0] = 0;
-	dp->length[1] = 0;
-	dp->length[2] = 0;
-	dp->length[3] = 0;
-	pdir->flags |= MOD;
-	putclust(pdir);
-	syncclust();
-	return 0;
-}

+ 0 - 107
sys/src/fs/pc/dosfs.h

@@ -1,107 +0,0 @@
-typedef struct Dosboot	Dosboot;
-typedef struct Dos	Dos;
-typedef struct Dosdir	Dosdir;
-typedef struct Dosfile	Dosfile;
-typedef struct Dospart	Dospart;
-
-struct Dospart
-{
-	uchar	flag;		/* active flag */
-	uchar	shead;		/* starting head */
-	uchar	scs[2];		/* starting cylinder/sector */
-	uchar	type;		/* partition type */
-	uchar	ehead;		/* ending head */
-	uchar	ecs[2];		/* ending cylinder/sector */
-	uchar	start[4];	/* starting sector */
-	uchar	len[4];		/* length in sectors */
-};
-
-struct Dosboot{
-	uchar	magic[3];
-	uchar	version[8];
-	uchar	sectbytes[2];
-	uchar	clustsize;
-	uchar	nresrv[2];
-	uchar	nfats;
-	uchar	rootsize[2];
-	uchar	volsize[2];
-	uchar	mediadesc;
-	uchar	fatsize[2];
-	uchar	trksize[2];
-	uchar	nheads[2];
-	uchar	nhidden[4];
-	uchar	bigvolsize[4];
-	uchar	driveno;
-	uchar	reserved0;
-	uchar	bootsig;
-	uchar	volid[4];
-	uchar	label[11];
-	uchar	reserved1[8];
-};
-
-struct Dosfile{
-	Dos *	dos;		/* owning dos file system */
-	int	pdir;		/* sector containing directory entry */
-	int	odir;		/* offset to same */
-	char	name[8];
-	char	ext[3];
-	uchar	attr;
-	Devsize	length;
-	Devsize	pstart;		/* physical start cluster address */
-	Devsize	pcurrent;	/* physical current cluster address */
-	Devsize	lcurrent;	/* logical current cluster address */
-	Devsize	offset;
-};
-
-struct Dos{
-	int	dev;				/* device id */
-	Off	(*read)(int, void*, long);	/* read routine */
-	Devsize	(*seek)(int, Devsize);		/* seek routine */
-	Off	(*write)(int, void*, long);	/* write routine */
-
-	int	start;		/* start of file system (sector no.) */
-	int	sectbytes;	/* size of a sector */
-	int	clustsize;	/* size of a cluster (in sectors) */
-	int	clustbytes;	/* size of a cluster (in bytes) */
-	int	nresrv;		/* sectors */
-	int	nfats;		/* usually 2 */
-	int	rootsize;	/* number of entries */
-	int	volsize;	/* in sectors */
-	int	mediadesc;
-	int	fatsize;	/* size of a fat (in sectors) */
-	int	fatbytes;	/* size of a fat (in bytes) */
-	int	fatclusters;	/* no. of clusters governed by fat */
-	int	fatbits;	/* 12 or 16 */
-	Devsize	fataddr;	/* sector address of first fat */
-	Devsize	rootaddr;	/* sector address of root directory */
-	Devsize	dataaddr;	/* sector address of first data block */
-	Devsize	freeptr;	/* for cluster allocation */
-
-	Dosfile	root;
-};
-
-struct Dosdir{
-	uchar	name[8];
-	uchar	ext[3];
-	uchar	attr;
-	uchar	reserved[10];
-	uchar	time[2];
-	uchar	date[2];
-	uchar	start[2];
-	uchar	length[4];
-};
-
-#define	DRONLY	0x01
-#define	DHIDDEN	0x02
-#define	DSYSTEM	0x04
-#define	DVLABEL	0x08
-#define	DOSDIR	0x10
-#define	DARCH	0x20
-
-extern int	dosinit(Dos*);
-extern Dosfile*	dosopen(Dos*, char*, Dosfile*);
-extern int	dostrunc(Dosfile*);
-extern long	dosread(Dosfile*, void*, long);
-extern long	doswrite(Dosfile*, void*, long);
-
-extern Dos	dos;

+ 0 - 1426
sys/src/fs/pc/ether2114x.c

@@ -1,1426 +0,0 @@
-/*
- * Digital Semiconductor DECchip 2114x PCI Fast Ethernet LAN Controller.
- * To do:
- *	thresholds;
- *	ring sizing;
- *	handle more error conditions;
- *	tidy setup packet mess;
- *	push initialisation back to attach;
- *	full SROM decoding.
- */
-#include "all.h"
-#include "io.h"
-#include "mem.h"
-
-#include "../ip/ip.h"
-#include "etherif.h"
-
-#define DEBUG		(0)
-#define debug		if(DEBUG)print
-
-enum {
-	Nrde		= 64,
-	Ntde		= 64,
-};
-
-#define Rbsz		ROUNDUP(sizeof(Enpkt)+4, 4)
-
-enum {					/* CRS0 - Bus Mode */
-	Swr		= 0x00000001,	/* Software Reset */
-	Bar		= 0x00000002,	/* Bus Arbitration */
-	Dsl		= 0x0000007C,	/* Descriptor Skip Length (field) */
-	Ble		= 0x00000080,	/* Big/Little Endian */
-	Pbl		= 0x00003F00,	/* Programmable Burst Length (field) */
-	Cal		= 0x0000C000,	/* Cache Alignment (field) */
-	Cal8		= 0x00004000,	/* 8 longword boundary alignment */
-	Cal16		= 0x00008000,	/* 16 longword boundary alignment */
-	Cal32		= 0x0000C000,	/* 32 longword boundary alignment */
-	Tap		= 0x000E0000,	/* Transmit Automatic Polling (field) */
-	Dbo		= 0x00100000,	/* Descriptor Byte Ordering Mode */
-	Rml		= 0x00200000,	/* Read Multiple */
-}; 
-
-enum {					/* CSR[57] - Status and Interrupt Enable */
-	Ti		= 0x00000001,	/* Transmit Interrupt */
-	Tps		= 0x00000002,	/* Transmit Process Stopped */
-	Tu		= 0x00000004,	/* Transmit buffer Unavailable */
-	Tjt		= 0x00000008,	/* Transmit Jabber Timeout */
-	Unf		= 0x00000020,	/* transmit UNderFlow */
-	Ri		= 0x00000040,	/* Receive Interrupt */
-	Ru		= 0x00000080,	/* Receive buffer Unavailable */
-	Rps		= 0x00000100,	/* Receive Process Stopped */
-	Rwt		= 0x00000200,	/* Receive Watchdog Timeout */
-	Eti		= 0x00000400,	/* Early Transmit Interrupt */
-	Gte		= 0x00000800,	/* General purpose Timer Expired */
-	Fbe		= 0x00002000,	/* Fatal Bit Error */
-	Ais		= 0x00008000,	/* Abnormal Interrupt Summary */
-	Nis		= 0x00010000,	/* Normal Interrupt Summary */
-	Rs		= 0x000E0000,	/* Receive process State (field) */
-	Ts		= 0x00700000,	/* Transmit process State (field) */
-	Eb		= 0x03800000,	/* Error bits */
-};
-
-enum {					/* CSR6 - Operating Mode */
-	Hp		= 0x00000001,	/* Hash/Perfect receive filtering mode */
-	Sr		= 0x00000002,	/* Start/stop Receive */
-	Ho		= 0x00000004,	/* Hash-Only filtering mode */
-	Pb		= 0x00000008,	/* Pass Bad frames */
-	If		= 0x00000010,	/* Inverse Filtering */
-	Sb		= 0x00000020,	/* Start/stop Backoff counter */
-	Pr		= 0x00000040,	/* Promiscuous Mode */
-	Pm		= 0x00000080,	/* Pass all Multicast */
-	Fd		= 0x00000200,	/* Full Duplex mode */
-	Om		= 0x00000C00,	/* Operating Mode (field) */
-	Fc		= 0x00001000,	/* Force Collision */
-	St		= 0x00002000,	/* Start/stop Transmission Command */
-	Tr		= 0x0000C000,	/* ThReshold control bits (field) */
-	Tr128		= 0x00000000,
-	Tr256		= 0x00004000,
-	Tr512		= 0x00008000,
-	Tr1024		= 0x0000C000,
-	Ca		= 0x00020000,	/* CApture effect enable */
-	Ps		= 0x00040000,	/* Port Select */
-	Hbd		= 0x00080000,	/* HeartBeat Disable */
-	Imm		= 0x00100000,	/* IMMediate mode */
-	Sf		= 0x00200000,	/* Store and Forward */
-	Ttm		= 0x00400000,	/* Transmit Threshold Mode */
-	Pcs		= 0x00800000,	/* PCS function */
-	Scr		= 0x01000000,	/* SCRambler mode */
-	Mbo		= 0x02000000,	/* Must Be One */
-	Ra		= 0x40000000,	/* Receive All */
-	Sc		= 0x80000000,	/* Special Capture effect enable */
-
-	TrMODE		= Tr512,	/* default transmission threshold */
-};
-
-enum {					/* CSR9 - ROM and MII Management */
-	Scs		= 0x00000001,	/* serial ROM chip select */
-	Sclk		= 0x00000002,	/* serial ROM clock */
-	Sdi		= 0x00000004,	/* serial ROM data in */
-	Sdo		= 0x00000008,	/* serial ROM data out */
-	Ss		= 0x00000800,	/* serial ROM select */
-	Wr		= 0x00002000,	/* write */
-	Rd		= 0x00004000,	/* read */
-
-	Mdc		= 0x00010000,	/* MII management clock */
-	Mdo		= 0x00020000,	/* MII management write data */
-	Mii		= 0x00040000,	/* MII management operation mode (W) */
-	Mdi		= 0x00080000,	/* MII management data in */
-};
-
-enum {					/* CSR12 - General-Purpose Port */
-	Gpc		= 0x00000100,	/* General Purpose Control */
-};
-
-typedef struct Des {
-	int	status;
-	int	control;
-	ulong	addr;
-	Msgbuf*	mb;
-} Des;
-
-enum {					/* status */
-	Of		= 0x00000001,	/* Rx: OverFlow */
-	Ce		= 0x00000002,	/* Rx: CRC Error */
-	Db		= 0x00000004,	/* Rx: Dribbling Bit */
-	Re		= 0x00000008,	/* Rx: Report on MII Error */
-	Rw		= 0x00000010,	/* Rx: Receive Watchdog */
-	Ft		= 0x00000020,	/* Rx: Frame Type */
-	Cs		= 0x00000040,	/* Rx: Collision Seen */
-	Tl		= 0x00000080,	/* Rx: Frame too Long */
-	Ls		= 0x00000100,	/* Rx: Last deScriptor */
-	Fs		= 0x00000200,	/* Rx: First deScriptor */
-	Mf		= 0x00000400,	/* Rx: Multicast Frame */
-	Rf		= 0x00000800,	/* Rx: Runt Frame */
-	Dt		= 0x00003000,	/* Rx: Data Type (field) */
-	De		= 0x00004000,	/* Rx: Descriptor Error */
-	Fl		= 0x3FFF0000,	/* Rx: Frame Length (field) */
-	Ff		= 0x40000000,	/* Rx: Filtering Fail */
-
-	Def		= 0x00000001,	/* Tx: DEFerred */
-	Uf		= 0x00000002,	/* Tx: UnderFlow error */
-	Lf		= 0x00000004,	/* Tx: Link Fail report */
-	Cc		= 0x00000078,	/* Tx: Collision Count (field) */
-	Hf		= 0x00000080,	/* Tx: Heartbeat Fail */
-	Ec		= 0x00000100,	/* Tx: Excessive Collisions */
-	Lc		= 0x00000200,	/* Tx: Late Collision */
-	Nc		= 0x00000400,	/* Tx: No Carrier */
-	Lo		= 0x00000800,	/* Tx: LOss of carrier */
-	To		= 0x00004000,	/* Tx: Transmission jabber timeOut */
-
-	Es		= 0x00008000,	/* [RT]x: Error Summary */
-	Own		= 0x80000000,	/* [RT]x: OWN bit */
-};
-
-enum {					/* control */
-	Bs1		= 0x000007FF,	/* [RT]x: Buffer 1 Size */
-	Bs2		= 0x003FF800,	/* [RT]x: Buffer 2 Size */
-
-	Ch		= 0x01000000,	/* [RT]x: second address CHained */
-	Er		= 0x02000000,	/* [RT]x: End of Ring */
-
-	Ft0		= 0x00400000,	/* Tx: Filtering Type 0 */
-	Dpd		= 0x00800000,	/* Tx: Disabled PaDding */
-	Ac		= 0x04000000,	/* Tx: Add CRC disable */
-	Set		= 0x08000000,	/* Tx: SETup packet */
-	Ft1		= 0x10000000,	/* Tx: Filtering Type 1 */
-	Fseg		= 0x20000000,	/* Tx: First SEGment */
-	Lseg		= 0x40000000,	/* Tx: Last SEGment */
-	Ic		= 0x80000000,	/* Tx: Interrupt on Completion */
-};
-
-enum {					/* PHY registers */
-	Bmcr		= 0,		/* Basic Mode Control */
-	Bmsr		= 1,		/* Basic Mode Status */
-	Phyidr1		= 2,		/* PHY Identifier #1 */
-	Phyidr2		= 3,		/* PHY Identifier #2 */
-	Anar		= 4,		/* Auto-Negotiation Advertisment */
-	Anlpar		= 5,		/* Auto-Negotiation Link Partner Ability */
-	Aner		= 6,		/* Auto-Negotiation Expansion */
-};
-
-enum {					/* Variants */
-	Tulip0		= (0x0009<<16)|0x1011,
-	Tulip3		= (0x0019<<16)|0x1011,
-	Pnic		= (0x0002<<16)|0x11AD,
-	Pnic2		= (0xC115<<16)|0x11AD,
-};
-
-typedef struct Ctlr Ctlr;
-typedef struct Ctlr {
-	int	port;
-	Pcidev*	pcidev;
-	Ctlr*	next;
-	int	active;
-	int	id;			/* (pcidev->did<<16)|pcidev->vid */
-
-	uchar	srom[128];
-	uchar*	sromea;			/* MAC address */
-	uchar*	leaf;
-	int	sct;			/* selected connection type */
-	int	k;			/* info block count */
-	uchar*	infoblock[16];
-	int	sctk;			/* sct block index */
-	int	curk;			/* current block index */
-	uchar*	type5block;
-
-	int	phy[32];		/* logical to physical map */
-	int	phyreset;		/* reset bitmap */
-	int	curphyad;
-	int	fdx;
-	int	ttm;
-
-	uchar	fd;			/* option */
-	int	medium;			/* option */
-
-	int	csr6;			/* CSR6 - operating mode */
-	int	mask;			/* CSR[57] - interrupt mask */
-	int	mbps;
-
-	Lock	lock;
-
-	Des*	rdr;			/* receive descriptor ring */
-	int	nrdr;			/* size of rdr */
-	int	rdrx;			/* index into rdr */
-
-	Lock	tlock;
-	Des*	tdr;			/* transmit descriptor ring */
-	int	ntdr;			/* size of tdr */
-	int	tdrh;			/* host index into tdr */
-	int	tdri;			/* interface index into tdr */
-	int	ntq;			/* descriptors active */
-	int	ntqmax;
-	Msgbuf*	setupmb;
-
-	ulong	of;			/* receive statistics */
-	ulong	ce;
-	ulong	cs;
-	ulong	tl;
-	ulong	rf;
-	ulong	de;
-
-	ulong	ru;
-	ulong	rps;
-	ulong	rwt;
-
-	ulong	uf;			/* transmit statistics */
-	ulong	ec;
-	ulong	lc;
-	ulong	nc;
-	ulong	lo;
-	ulong	to;
-
-	ulong	tps;
-	ulong	tu;
-	ulong	tjt;
-	ulong	unf;
-} Ctlr;
-
-static Ctlr* ctlrhead;
-static Ctlr* ctlrtail;
-
-#define csr32r(c, r)	(inl((c)->port+((r)*8)))
-#define csr32w(c, r, l)	(outl((c)->port+((r)*8), (ulong)(l)))
-
-static void
-attach(Ether* ether)
-{
-	Ctlr *ctlr;
-
-	ctlr = ether->ctlr;
-	ilock(&ctlr->lock);
-	if(!(ctlr->csr6 & Sr)){
-		ctlr->csr6 |= Sr;
-		csr32w(ctlr, 6, ctlr->csr6);
-	}
-	iunlock(&ctlr->lock);
-}
-
-static void
-txstart(Ether* ether)
-{
-	Ctlr *ctlr;
-	Msgbuf *mb;
-	Des *des;
-	int control;
-
-	ctlr = ether->ctlr;
-	while(ctlr->ntq < (ctlr->ntdr-1)){
-		if(ctlr->setupmb){
-			mb = ctlr->setupmb;
-			ctlr->setupmb = 0;
-			control = Ic|Set|mb->count;
-		}
-		else{
-			mb = etheroq(ether);
-			if(mb == nil)
-				break;
-			control = Ic|Lseg|Fseg|mb->count;
-		}
-
-		ctlr->tdr[PREV(ctlr->tdrh, ctlr->ntdr)].control &= ~Ic;
-		des = &ctlr->tdr[ctlr->tdrh];
-		des->mb = mb;
-		des->addr = PADDR(mb->data);
-		des->control |= control;
-		ctlr->ntq++;
-		coherence();
-		des->status = Own;
-		csr32w(ctlr, 1, 0);
-		ctlr->tdrh = NEXT(ctlr->tdrh, ctlr->ntdr);
-	}
-
-	if(ctlr->ntq > ctlr->ntqmax)
-		ctlr->ntqmax = ctlr->ntq;
-}
-
-static void
-transmit(Ether* ether)
-{
-	Ctlr *ctlr;
-
-	ctlr = ether->ctlr;
-	ilock(&ctlr->tlock);
-	txstart(ether);
-	iunlock(&ctlr->tlock);
-}
-
-static void
-interrupt(Ureg*, void* arg)
-{
-	Ctlr *ctlr;
-	Ether *ether;
-	int len, status;
-	Des *des;
-	Msgbuf *mb, *rmb;
-
-	ether = arg;
-	ctlr = ether->ctlr;
-
-	while((status = csr32r(ctlr, 5)) & (Nis|Ais)){
-		/*
-		 * Acknowledge the interrupts and mask-out
-		 * the ones that are implicitly handled.
-		 */
-		csr32w(ctlr, 5, status);
-		status &= (ctlr->mask & ~(Nis|Ti));
-
-		if(status & Ais){
-			if(status & Tps)
-				ctlr->tps++;
-			if(status & Tu)
-				ctlr->tu++;
-			if(status & Tjt)
-				ctlr->tjt++;
-			if(status & Ru)
-				ctlr->ru++;
-			if(status & Rps)
-				ctlr->rps++;
-			if(status & Rwt)
-				ctlr->rwt++;
-			status &= ~(Ais|Rwt|Rps|Ru|Tjt|Tu|Tps);
-		}
-
-		/*
-		 * Received packets.
-		 */
-		if(status & Ri){
-			des = &ctlr->rdr[ctlr->rdrx];
-			while(!(des->status & Own)){
-				if(des->status & Es){
-					if(des->status & Of)
-						ctlr->of++;
-					if(des->status & Ce)
-						ctlr->ce++;
-					if(des->status & Cs)
-						ctlr->cs++;
-					if(des->status & Tl)
-						ctlr->tl++;
-					if(des->status & Rf)
-						ctlr->rf++;
-					if(des->status & De)
-						ctlr->de++;
-				}
-				else if(mb = mballoc(Rbsz, 0, Mbeth1)){
-					rmb = des->mb;
-					rmb->count = ((des->status & Fl)>>16)-4;
-					etheriq(ether, rmb);
-					des->mb = mb;
-					des->addr = PADDR(mb->data);
-				}
-
-				des->control &= Er;
-				des->control |= Rbsz;
-				coherence();
-				des->status = Own;
-
-				ctlr->rdrx = NEXT(ctlr->rdrx, ctlr->nrdr);
-				des = &ctlr->rdr[ctlr->rdrx];
-			}
-			status &= ~Ri;
-		}
-
-		/*
-		 * Check the transmit side:
-		 *	check for Transmit Underflow and Adjust
-		 *	the threshold upwards;
-		 *	free any transmitted buffers and try to
-		 *	top-up the ring.
-		 */
-		if(status & Unf){
-			ctlr->unf++;
-			ilock(&ctlr->lock);
-			csr32w(ctlr, 6, ctlr->csr6 & ~St);
-			switch(ctlr->csr6 & Tr){
-			case Tr128:
-				len = Tr256;
-				break;
-			case Tr256:
-				len = Tr512;
-				break;
-			case Tr512:
-				len = Tr1024;
-				break;
-			default:
-			case Tr1024:
-				len = Sf;
-				break;
-			}
-			ctlr->csr6 = (ctlr->csr6 & ~Tr)|len;
-			csr32w(ctlr, 6, ctlr->csr6);
-			iunlock(&ctlr->lock);
-			csr32w(ctlr, 5, Tps);
-			status &= ~(Unf|Tps);
-		}
-
-		ilock(&ctlr->tlock);
-		while(ctlr->ntq){
-			des = &ctlr->tdr[ctlr->tdri];
-			if(des->status & Own)
-				break;
-
-			if(des->status & Es){
-				if(des->status & Uf)
-					ctlr->uf++;
-				if(des->status & Ec)
-					ctlr->ec++;
-				if(des->status & Lc)
-					ctlr->lc++;
-				if(des->status & Nc)
-					ctlr->nc++;
-				if(des->status & Lo)
-					ctlr->lo++;
-				if(des->status & To)
-					ctlr->to++;
-			}
-
-			mbfree(des->mb);
-			des->control &= Er;
-
-			ctlr->ntq--;
-			ctlr->tdri = NEXT(ctlr->tdri, ctlr->ntdr);
-		}
-		txstart(ether);
-		iunlock(&ctlr->tlock);
-
-		/*
-		 * Anything left not catered for?
-		 */
-		if(status)
-			panic("#l%d: status %8.8uX\n", ether->ctlrno, status);
-	}
-}
-
-static void
-ctlrinit(Ether* ether)
-{
-	Ctlr *ctlr;
-	Des *des;
-	Msgbuf *mb;
-	int i;
-	uchar bi[Easize*2];
-
-	ctlr = ether->ctlr;
-
-	/*
-	 * Allocate and initialise the receive ring;
-	 * allocate and initialise the transmit ring;
-	 * unmask interrupts and start the transmit side;
-	 * create and post a setup packet to initialise
-	 * the physical ethernet address.
-	 */
-	ctlr->rdr = ialloc(ctlr->nrdr*sizeof(Des), 8*sizeof(ulong));
-	for(des = ctlr->rdr; des < &ctlr->rdr[ctlr->nrdr]; des++){
-		des->mb = mballoc(Rbsz, 0, Mbeth2);
-		des->status = Own;
-		des->control = Rbsz;
-		des->addr = PADDR(des->mb->data);
-	}
-	ctlr->rdr[ctlr->nrdr-1].control |= Er;
-	ctlr->rdrx = 0;
-	csr32w(ctlr, 3, PADDR(ctlr->rdr));
-
-	ctlr->tdr = ialloc(ctlr->ntdr*sizeof(Des), 8*sizeof(ulong));
-	ctlr->tdr[ctlr->ntdr-1].control |= Er;
-	ctlr->tdrh = 0;
-	ctlr->tdri = 0;
-	csr32w(ctlr, 4, PADDR(ctlr->tdr));
-
-	/*
-	 * Clear any bits in the Status Register (CSR5) as
-	 * the PNIC has a different reset value from a true 2114x.
-	 */
-	ctlr->mask = Nis|Ais|Fbe|Rwt|Rps|Ru|Ri|Unf|Tjt|Tps|Ti;
-	csr32w(ctlr, 5, ctlr->mask);
-	csr32w(ctlr, 7, ctlr->mask);
-	ctlr->csr6 |= St;
-	csr32w(ctlr, 6, ctlr->csr6);
-
-	for(i = 0; i < Easize/2; i++){
-		bi[i*4] = ether->ea[i*2];
-		bi[i*4+1] = ether->ea[i*2+1];
-		bi[i*4+2] = ether->ea[i*2+1];
-		bi[i*4+3] = ether->ea[i*2];
-	}
-	mb = mballoc(Easize*2*16, 0, Mbeth3);
-	memset(mb->data, 0xFF, sizeof(bi));
-	for(i = sizeof(bi); i < sizeof(bi)*16; i += sizeof(bi))
-		memmove(mb->data+i, bi, sizeof(bi));
-	mb->count = sizeof(bi)*16;
-
-	ctlr->setupmb = mb;
-	transmit(ether);
-}
-
-static void
-csr9w(Ctlr* ctlr, int data)
-{
-	csr32w(ctlr, 9, data);
-	microdelay(1);
-}
-
-static int
-miimdi(Ctlr* ctlr, int n)
-{
-	int data, i;
-
-	/*
-	 * Read n bits from the MII Management Register.
-	 */
-	data = 0;
-	for(i = n-1; i >= 0; i--){
-		if(csr32r(ctlr, 9) & Mdi)
-			data |= (1<<i);
-		csr9w(ctlr, Mii|Mdc);
-		csr9w(ctlr, Mii);
-	}
-	csr9w(ctlr, 0);
-
-	return data;
-}
-
-static void
-miimdo(Ctlr* ctlr, int bits, int n)
-{
-	int i, mdo;
-
-	/*
-	 * Write n bits to the MII Management Register.
-	 */
-	for(i = n-1; i >= 0; i--){
-		if(bits & (1<<i))
-			mdo = Mdo;
-		else
-			mdo = 0;
-		csr9w(ctlr, mdo);
-		csr9w(ctlr, mdo|Mdc);
-		csr9w(ctlr, mdo);
-	}
-}
-
-static int
-miir(Ctlr* ctlr, int phyad, int regad)
-{
-	int data, i;
-
-	if(ctlr->id == Pnic){
-		i = 1000;
-		csr32w(ctlr, 20, 0x60020000|(phyad<<23)|(regad<<18));
-		do{
-			microdelay(1);
-			data = csr32r(ctlr, 20);
-		}while((data & 0x80000000) && --i);
-
-		if(i == 0)
-			return -1;
-		return data & 0xFFFF;
-	}
-
-	/*
-	 * Preamble;
-	 * ST+OP+PHYAD+REGAD;
-	 * TA + 16 data bits.
-	 */
-	miimdo(ctlr, 0xFFFFFFFF, 32);
-	miimdo(ctlr, 0x1800|(phyad<<5)|regad, 14);
-	data = miimdi(ctlr, 18);
-
-	if(data & 0x10000)
-		return -1;
-
-	return data & 0xFFFF;
-}
-
-static void
-miiw(Ctlr* ctlr, int phyad, int regad, int data)
-{
-	/*
-	 * Preamble;
-	 * ST+OP+PHYAD+REGAD+TA + 16 data bits;
-	 * Z.
-	 */
-	miimdo(ctlr, 0xFFFFFFFF, 32);
-	data &= 0xFFFF;
-	data |= (0x05<<(5+5+2+16))|(phyad<<(5+2+16))|(regad<<(2+16))|(0x02<<16);
-	miimdo(ctlr, data, 32);
-	csr9w(ctlr, Mdc);
-	csr9w(ctlr, 0);
-}
-
-static int
-sromr(Ctlr* ctlr, int r)
-{
-	int i, op, data;
-
-	if(ctlr->id == Pnic){
-		i = 1000;
-		csr32w(ctlr, 19, 0x600|r);
-		do{
-			microdelay(1);
-			data = csr32r(ctlr, 19);
-		}while((data & 0x80000000) && --i);
-
-		return csr32r(ctlr, 9) & 0xFFFF;
-	}
-
-	/*
-	 * This sequence for reading a 16-bit register 'r'
-	 * in the EEPROM is taken straight from Section
-	 * 7.4 of the 21140 Hardware Reference Manual.
-	 */
-	csr9w(ctlr, Rd|Ss);
-	csr9w(ctlr, Rd|Ss|Scs);
-	csr9w(ctlr, Rd|Ss|Sclk|Scs);
-	csr9w(ctlr, Rd|Ss);
-
-	op = 0x06;
-	for(i = 3-1; i >= 0; i--){
-		data = Rd|Ss|(((op>>i) & 0x01)<<2)|Scs;
-		csr9w(ctlr, data);
-		csr9w(ctlr, data|Sclk);
-		csr9w(ctlr, data);
-	}
-
-	for(i = 6-1; i >= 0; i--){
-		data = Rd|Ss|(((r>>i) & 0x01)<<2)|Scs;
-		csr9w(ctlr, data);
-		csr9w(ctlr, data|Sclk);
-		csr9w(ctlr, data);
-	}
-
-	data = 0;
-	for(i = 16-1; i >= 0; i--){
-		csr9w(ctlr, Rd|Ss|Sclk|Scs);
-		if(csr32r(ctlr, 9) & Sdo)
-			data |= (1<<i);
-		csr9w(ctlr, Rd|Ss|Scs);
-	}
-
-	csr9w(ctlr, 0);
-
-	return data & 0xFFFF;
-}
-
-static void
-softreset(Ctlr* ctlr)
-{
-	/*
-	 * Soft-reset the controller and initialise bus mode.
-	 * Delay should be >= 50 PCI cycles (2×S @ 25MHz).
-	 */
-	csr32w(ctlr, 0, Swr);
-	microdelay(10);
-	csr32w(ctlr, 0, Rml|Cal16);
-	delay(1);
-}
-
-static int
-type5block(Ctlr* ctlr, uchar* block)
-{
-	int csr15, i, len;
-
-	/*
-	 * Reset or GPR sequence. Reset should be once only,
-	 * before the GPR sequence.
-	 * Note 'block' is not a pointer to the block head but
-	 * a pointer to the data in the block starting at the
-	 * reset length value so type5block can be used for the
-	 * sequences contained in type 1 and type 3 blocks.
-	 * The SROM docs state the 21140 type 5 block is the
-	 * same as that for the 21143, but the two controllers
-	 * use different registers and sequence-element lengths
-	 * so the 21140 code here is a guess for a real type 5
-	 * sequence.
-	 */
-	len = *block++;
-	if(ctlr->id != Tulip3){
-		for(i = 0; i < len; i++){
-			csr32w(ctlr, 12, *block);
-			block++;
-		}
-		return len;
-	}
-
-	for(i = 0; i < len; i++){
-		csr15 = *block++<<16;
-		csr15 |= *block++<<24;
-		csr32w(ctlr, 15, csr15);
-		debug("%8.8uX ", csr15);
-	}
-	return 2*len;
-}
-
-static int
-typephylink(Ctlr* ctlr, uchar*)
-{
-	int an, bmcr, bmsr, csr6, x;
-
-	/*
-	 * Fail if
-	 *	auto-negotiataion enabled but not complete;
-	 *	no valid link established.
-	 */
-	bmcr = miir(ctlr, ctlr->curphyad, Bmcr);
-	miir(ctlr, ctlr->curphyad, Bmsr);
-	bmsr = miir(ctlr, ctlr->curphyad, Bmsr);
-	debug("bmcr 0x%2.2uX bmsr 0x%2.2uX\n", bmcr, bmsr);
-	if(((bmcr & 0x1000) && !(bmsr & 0x0020)) || !(bmsr & 0x0004))
-		return 0;
-
-	if(bmcr & 0x1000){
-		an = miir(ctlr, ctlr->curphyad, Anar);
-		an &= miir(ctlr, ctlr->curphyad, Anlpar) & 0x3E0;
-		debug("an 0x%2.uX 0x%2.2uX 0x%2.2uX\n",
-	    		miir(ctlr, ctlr->curphyad, Anar),
-			miir(ctlr, ctlr->curphyad, Anlpar),
-			an);
-	
-		if(an & 0x0100)
-			x = 0x4000;
-		else if(an & 0x0080)
-			x = 0x2000;
-		else if(an & 0x0040)
-			x = 0x1000;
-		else if(an & 0x0020)
-			x = 0x0800;
-		else
-			x = 0;
-	}
-	else if((bmcr & 0x2100) == 0x2100)
-		x = 0x4000;
-	else if(bmcr & 0x2000){
-		/*
-		 * If FD capable, force it if necessary.
-		 */
-		if((bmsr & 0x4000) && ctlr->fd){
-			miiw(ctlr, ctlr->curphyad, Bmcr, 0x2100);
-			x = 0x4000;
-		}
-		else
-			x = 0x2000;
-	}
-	else if(bmcr & 0x0100)
-		x = 0x1000;
-	else
-		x = 0x0800;
-
-	csr6 = Sc|Mbo|Hbd|Ps|Ca|Sb|TrMODE;
-	if(ctlr->fdx & x)
-		csr6 |= Fd;
-	if(ctlr->ttm & x)
-		csr6 |= Ttm;
-	debug("csr6 0x%8.8uX 0x%8.8uX 0x%8.8luX\n",
-		csr6, ctlr->csr6, csr32r(ctlr, 6));
-	if(csr6 != ctlr->csr6){
-		ctlr->csr6 = csr6;
-		csr32w(ctlr, 6, csr6);
-	}
-
-	return 1;
-}
-
-static int
-typephymode(Ctlr* ctlr, uchar* block, int wait)
-{
-	uchar *p;
-	int len, mc, nway, phyx, timeo;
-
-	if(DEBUG){
-		int i;
-
-		len = (block[0] & ~0x80)+1;
-		for(i = 0; i < len; i++)
-			debug("%2.2uX ", block[i]);
-		debug("\n");
-	}
-
-	if(block[1] == 1)
-		len = 1;
-	else if(block[1] == 3)
-		len = 2;
-	else
-		return -1;
-
-	/*
-	 * Snarf the media capabilities, nway advertisment,
-	 * FDX and TTM bitmaps.
-	 */
-	p = &block[5+len*block[3]+len*block[4+len*block[3]]];
-	mc = *p++;
-	mc |= *p++<<8;
-	nway = *p++;
-	nway |= *p++<<8;
-	ctlr->fdx = *p++;
-	ctlr->fdx |= *p++<<8;
-	ctlr->ttm = *p++;
-	ctlr->ttm |= *p<<8;
-	debug("mc %4.4uX nway %4.4uX fdx %4.4uX ttm %4.4uX\n",
-		mc, nway, ctlr->fdx, ctlr->ttm);
-	USED(mc);
-
-	phyx = block[2];
-	ctlr->curphyad = ctlr->phy[phyx];
-
-	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|Sb|TrMODE;
-	//csr32w(ctlr, 6, ctlr->csr6);
-	if(typephylink(ctlr, block))
-		return 0;
-
-	if(!(ctlr->phyreset & (1<<phyx))){
-		debug("reset seq: len %d: ", block[3]);
-		if(ctlr->type5block)
-			type5block(ctlr, &ctlr->type5block[2]);
-		else
-			type5block(ctlr, &block[4+len*block[3]]);
-		debug("\n");
-		ctlr->phyreset |= (1<<phyx);
-	}
-
-	/*
-	 * GPR sequence.
-	 */
-	debug("gpr seq: len %d: ", block[3]);
-	type5block(ctlr, &block[3]);
-	debug("\n");
-
-	ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|Sb|TrMODE;
-	//csr32w(ctlr, 6, ctlr->csr6);
-	if(typephylink(ctlr, block))
-		return 0;
-
-	/*
-	 * Turn off auto-negotiation, set the auto-negotiation
-	 * advertisment register then start the auto-negotiation
-	 * process again.
-	 */
-	miiw(ctlr, ctlr->curphyad, Bmcr, 0);
-	miiw(ctlr, ctlr->curphyad, Anar, nway|1);
-	miiw(ctlr, ctlr->curphyad, Bmcr, 0x1000);
-
-	if(!wait)
-		return 0;
-
-	for(timeo = 0; timeo < 30; timeo++){
-		if(typephylink(ctlr, block))
-			return 0;
-		delay(100);
-	}
-
-	return -1;
-}
-
-static int
-type0link(Ctlr* ctlr, uchar* block)
-{
-	int m, polarity, sense;
-
-	m = (block[3]<<8)|block[2];
-	sense = 1<<((m & 0x000E)>>1);
-	if(m & 0x0080)
-		polarity = sense;
-	else
-		polarity = 0;
-
-	return (csr32r(ctlr, 12) & sense)^polarity;
-}
-
-static int
-type0mode(Ctlr* ctlr, uchar* block, int wait)
-{
-	int csr6, m, timeo;
-
-	csr6 = Sc|Mbo|Hbd|Ca|Sb|TrMODE;
-debug("type0: medium 0x%uX, fd %d: 0x%2.2uX 0x%2.2uX 0x%2.2uX 0x%2.2uX\n",
-    ctlr->medium, ctlr->fd, block[0], block[1], block[2], block[3]); 
-	switch(block[0]){
-	default:
-		break;
-
-	case 0x04:			/* 10BASE-TFD */
-	case 0x05:			/* 100BASE-TXFD */
-	case 0x08:			/* 100BASE-FXFD */
-		/*
-		 * Don't attempt full-duplex
-		 * unless explicitly requested.
-		 */
-		if(!ctlr->fd)
-			return -1;
-		csr6 |= Fd;
-		break;
-	}
-
-	m = (block[3]<<8)|block[2];
-	if(m & 0x0001)
-		csr6 |= Ps;
-	if(m & 0x0010)
-		csr6 |= Ttm;
-	if(m & 0x0020)
-		csr6 |= Pcs;
-	if(m & 0x0040)
-		csr6 |= Scr;
-
-	csr32w(ctlr, 12, block[1]);
-	microdelay(10);
-	csr32w(ctlr, 6, csr6);
-	ctlr->csr6 = csr6;
-
-	if(!wait)
-		return 0;
-
-	for(timeo = 0; timeo < 30; timeo++){
-		if(type0link(ctlr, block))
-			return 0;
-		delay(100);
-	}
-
-	return -1;
-}
-
-static int
-mediaxx(Ether* ether, int wait)
-{
-	Ctlr* ctlr;
-	uchar *block;
-
-	ctlr = ether->ctlr;
-	block = ctlr->infoblock[ctlr->curk];
-	if(block[0] & 0x80){
-		switch(block[1]){
-		default:
-			return -1;
-		case 0:
-			if(ctlr->medium >= 0 && block[2] != ctlr->medium)
-				return 0;
-/* need this test? */	if(ctlr->sct != 0x0800 && (ctlr->sct & 0x3F) != block[2])
-				return 0;
-			if(type0mode(ctlr, block+2, wait))
-				return 0;
-			break;
-		case 1:
-			if(typephymode(ctlr, block, wait))
-				return 0;
-			break;
-		case 3:
-			if(typephymode(ctlr, block, wait))
-				return 0;
-			break;
-		}
-	}
-	else{
-		if(ctlr->medium >= 0 && block[0] != ctlr->medium)
-			return 0;
-/* need this test? */if(ctlr->sct != 0x0800 && (ctlr->sct & 0x3F) != block[0])
-			return 0;
-		if(type0mode(ctlr, block, wait))
-			return 0;
-	}
-
-	if(ctlr->csr6){
-		if(!(ctlr->csr6 & Ps) || (ctlr->csr6 & Ttm))
-			return 10;
-		return 100;
-	}
-
-	return 0;
-}
-
-static int
-media(Ether* ether, int wait)
-{
-	Ctlr* ctlr;
-	int k, mbps;
-
-	ctlr = ether->ctlr;
-	for(k = 0; k < ctlr->k; k++){
-		mbps = mediaxx(ether, wait);
-		if(mbps > 0)
-			return mbps;
-		if(ctlr->curk == 0)
-			ctlr->curk = ctlr->k-1;
-		else
-			ctlr->curk--;
-	}
-
-	return 0;
-}
-
-static char* mediatable[9] = {
-	"10BASE-T",				/* TP */
-	"10BASE-2",				/* BNC */
-	"10BASE-5",				/* AUI */
-	"100BASE-TX",
-	"10BASE-TFD",
-	"100BASE-TXFD",
-	"100BASE-T4",
-	"100BASE-FX",
-	"100BASE-FXFD",
-};
-
-static uchar en1207[] = {		/* Accton EN1207-COMBO */
-	0x00, 0x00, 0xE8,		/* [0]  vendor ethernet code */
-	0x00,				/* [3]  spare */
-
-	0x00, 0x08,			/* [4]  connection (LSB+MSB = 0x0800) */
-	0x1F,				/* [6]  general purpose control */
-	2,				/* [7]  block count */
-
-	0x00,				/* [8]  media code (10BASE-TX) */
-	0x0B,				/* [9]  general purpose port data */
-	0x9E, 0x00,			/* [10] command (LSB+MSB = 0x009E) */
-
-	0x03,				/* [8]  media code (100BASE-TX) */
-	0x1B,				/* [9]  general purpose port data */
-	0x6D, 0x00,			/* [10] command (LSB+MSB = 0x006D) */
-
-					/* There is 10BASE-2 as well, but... */
-};
-
-static uchar ana6910fx[] = {		/* Adaptec (Cogent) ANA-6910FX */
-	0x00, 0x00, 0x92,		/* [0]  vendor ethernet code */
-	0x00,				/* [3]  spare */
-
-	0x00, 0x08,			/* [4]  connection (LSB+MSB = 0x0800) */
-	0x3F,				/* [6]  general purpose control */
-	1,				/* [7]  block count */
-
-	0x07,				/* [8]  media code (100BASE-FX) */
-	0x03,				/* [9]  general purpose port data */
-	0x2D, 0x00			/* [10] command (LSB+MSB = 0x000D) */
-};
-
-static uchar smc9332[] = {		/* SMC 9332 */
-	0x00, 0x00, 0xC0,		/* [0]  vendor ethernet code */
-	0x00,				/* [3]  spare */
-
-	0x00, 0x08,			/* [4]  connection (LSB+MSB = 0x0800) */
-	0x1F,				/* [6]  general purpose control */
-	2,				/* [7]  block count */
-
-	0x00,				/* [8]  media code (10BASE-TX) */
-	0x00,				/* [9]  general purpose port data */
-	0x9E, 0x00,			/* [10] command (LSB+MSB = 0x009E) */
-
-	0x03,				/* [8]  media code (100BASE-TX) */
-	0x09,				/* [9]  general purpose port data */
-	0x6D, 0x00,			/* [10] command (LSB+MSB = 0x006D) */
-};
-
-static uchar* leaf21140[] = {
-	en1207,				/* Accton EN1207-COMBO */
-	ana6910fx,			/* Adaptec (Cogent) ANA-6910FX */
-	smc9332,			/* SMC 9332 */
-	nil,
-};
-
-/*
- * Copied to ctlr->srom at offset 20.
- */
-static uchar leafpnic[] = {
-	0x00, 0x00, 0x00, 0x00,		/* MAC address */
-	0x00, 0x00,
-	0x00,				/* controller 0 device number */
-	0x1E, 0x00,			/* controller 0 info leaf offset */
-	0x00,				/* reserved */
-	0x00, 0x08,			/* selected connection type */
-	0x00,				/* general purpose control */
-	0x01,				/* block count */
-
-	0x8C,				/* format indicator and count */
-	0x01,				/* block type */
-	0x00,				/* PHY number */
-	0x00,				/* GPR sequence length */
-	0x00,				/* reset sequence length */
-	0x00, 0x78,			/* media capabilities */
-	0xE0, 0x01,			/* Nway advertisment */
-	0x00, 0x50,			/* FDX bitmap */
-	0x00, 0x18,			/* TTM bitmap */
-};
-
-static int
-srom(Ctlr* ctlr)
-{
-	int i, k, oui, phy, x;
-	uchar *p;
-
-	/*
-	 * This is a partial decoding of the SROM format described in
-	 * 'Digital Semiconductor 21X4 Serial ROM Format, Version 4.05,
-	 * 2-Mar-98'. Only the 2114[03] are handled, support for other
-	 * controllers can be added as needed.
-	 */
-	for(i = 0; i < sizeof(ctlr->srom)/2; i++){
-		x = sromr(ctlr, i);
-		ctlr->srom[2*i] = x;
-		ctlr->srom[2*i+1] = x>>8;
-	}
-
-	/*
-	 * There are 2 SROM layouts:
-	 *	e.g. Digital EtherWORKS	station address at offset 20;
-	 *				this complies with the 21140A SROM
-	 *				application note from Digital;
-	 * 	e.g. SMC9332		station address at offset 0 followed by
-	 *				2 additional bytes, repeated at offset
-	 *				6; the 8 bytes are also repeated in
-	 *				reverse order at offset 8.
-	 * To check which it is, read the SROM and check for the repeating
-	 * patterns of the non-compliant cards; if that fails use the one at
-	 * offset 20.
-	 */
-	ctlr->sromea = ctlr->srom;
-	for(i = 0; i < 8; i++){
-		x = ctlr->srom[i];
-		if(x != ctlr->srom[15-i] || x != ctlr->srom[16+i]){
-			ctlr->sromea = &ctlr->srom[20];
-			break;
-		}
-	}
-
-	/*
-	 * Fake up the SROM for the PNIC.
-	 * It looks like a 21140 with a PHY.
-	 * The MAC address is byte-swapped in the orginal SROM data.
-	 */
-	if(ctlr->id == Pnic){
-		memmove(&ctlr->srom[20], leafpnic, sizeof(leafpnic));
-		for(i = 0; i < Easize; i += 2){
-			ctlr->srom[20+i] = ctlr->srom[i+1];
-			ctlr->srom[20+i+1] = ctlr->srom[i];
-		}
-	}
-
-	/*
-	 * Next, try to find the info leaf in the SROM for media detection.
-	 * If it's a non-conforming card try to match the vendor ethernet code
-	 * and point p at a fake info leaf with compact 21140 entries.
-	 */
-	if(ctlr->sromea == ctlr->srom){
-		p = nil;
-		for(i = 0; leaf21140[i] != nil; i++){
-			if(memcmp(leaf21140[i], ctlr->sromea, 3) == 0){
-				p = &leaf21140[i][4];
-				break;
-			}
-		}
-		if(p == nil)
-			return -1;
-	}
-	else
-		p = &ctlr->srom[(ctlr->srom[28]<<8)|ctlr->srom[27]];
-
-	/*
-	 * Set up the info needed for later media detection.
-	 * For the 21140, set the general-purpose mask in CSR12.
-	 * The info block entries are stored in order of increasing
-	 * precedence, so detection will work backwards through the
-	 * stored indexes into ctlr->srom.
-	 * If an entry is found which matches the selected connection
-	 * type, save the index. Otherwise, start at the last entry.
-	 * If any MII entries are found (type 1 and 3 blocks), scan
-	 * for PHYs.
-	 */
-	ctlr->leaf = p;
-	ctlr->sct = *p++;
-	ctlr->sct |= *p++<<8;
-	if(ctlr->id != Tulip3){
-		csr32w(ctlr, 12, Gpc|*p++);
-		delay(200);
-	}
-	ctlr->k = *p++;
-	if(ctlr->k >= nelem(ctlr->infoblock))
-		ctlr->k = nelem(ctlr->infoblock)-1;
-	ctlr->sctk = ctlr->k-1;
-	phy = 0;
-	for(k = 0; k < ctlr->k; k++){
-		ctlr->infoblock[k] = p;
-		/*
-		 * The RAMIX PMC665 has a badly-coded SROM,
-		 * hence the test for 21143 and type 3.
-		 */
-		if((*p & 0x80) || (ctlr->id == Tulip3 && *(p+1) == 3)){
-			*p |= 0x80;
-			if(*(p+1) == 1 || *(p+1) == 3)
-				phy = 1;
-			if(*(p+1) == 5)
-				ctlr->type5block = p;
-			p += (*p & ~0x80)+1;
-		}
-		else{
-			debug("type0: 0x%2.2uX 0x%2.2uX 0x%2.2uX 0x%2.2uX\n",
-				p[0], p[1], p[2], p[3]); 
-			if(ctlr->sct != 0x0800 && *p == (ctlr->sct & 0xFF))
-				ctlr->sctk = k;
-			p += 4;
-		}
-	}
-	ctlr->curk = ctlr->sctk;
-	debug("sct 0x%uX medium 0x%uX k %d curk %d phy %d\n",
-		ctlr->sct, ctlr->medium, ctlr->k, ctlr->curk, phy);
-
-	if(phy){
-		x = 0;
-		for(k = 0; k < nelem(ctlr->phy); k++){
-			if((oui = miir(ctlr, k, 2)) == -1 || oui == 0)
-				continue;
-			if(DEBUG){
-				oui = (oui & 0x3FF)<<6;
-				oui |= miir(ctlr, k, 3)>>10;
-				miir(ctlr, k, 1);
-				debug("phy%d: index %d oui %uX reg1 %uX\n",
-					x, k, oui, miir(ctlr, k, 1));
-				USED(oui);
-			}
-			ctlr->phy[x] = k;
-		}
-	}
-
-	ctlr->fd = 0;
-	ctlr->medium = -1;
-
-	return 0;
-}
-
-static void
-dec2114xpci(void)
-{
-	Ctlr *ctlr;
-	Pcidev *p;
-	int x;
-
-	p = nil;
-	while(p = pcimatch(p, 0, 0)){
-		if(p->ccru != ((0x02<<8)|0x00))
-			continue;
-		switch((p->did<<16)|p->vid){
-		default:
-			continue;
-
-		case Tulip3:			/* 21143 */
-			/*
-			 * Exit sleep mode.
-			 */
-			x = pcicfgr32(p, 0x40);
-			x &= ~0xc0000000;
-			pcicfgw32(p, 0x40, x);
-			/*FALLTHROUGH*/
-
-		case Pnic:			/* PNIC */
-		case Pnic2:			/* PNIC-II */
-		case Tulip0:			/* 21140 */
-			break;
-		}
-
-		/*
-		 * bar[0] is the I/O port register address and
-		 * bar[1] is the memory-mapped register address.
-		 */
-		ctlr = ialloc(sizeof(Ctlr), 0);
-		ctlr->port = p->mem[0].bar & ~0x01;
-		ctlr->pcidev = p;
-		ctlr->id = (p->did<<16)|p->vid;
-
-		/*
-		 * Some cards (e.g. ANA-6910FX) seem to need the Ps bit
-		 * set or they don't always work right after a hardware
-		 * reset.
-		 */
-		csr32w(ctlr, 6, Mbo|Ps);
-		softreset(ctlr);
-
-		if(srom(ctlr)){
-			//free(ctlr);
-			break;
-		}
-
-		switch(ctlr->id){
-		default:
-			break;
-
-		case Pnic:			/* PNIC */
-			/*
-			 * Turn off the jabber timer.
-			 */
-			csr32w(ctlr, 15, 0x00000001);
-			break;
-		}
-
-		if(ctlrhead != nil)
-			ctlrtail->next = ctlr;
-		else
-			ctlrhead = ctlr;
-		ctlrtail = ctlr;
-	}
-}
-
-int
-ether21140reset(Ether* ether)
-{
-	Ctlr *ctlr;
-	int i, x;
-	uchar ea[Easize];
-	static int scandone;
-
-	if(scandone == 0){
-		dec2114xpci();
-		scandone = 1;
-	}
-
-	/*
-	 * Any adapter matches if no ether->port is supplied,
-	 * otherwise the ports must match.
-	 */
-	for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
-		if(ctlr->active)
-			continue;
-		if(ether->port == 0 || ether->port == ctlr->port){
-			ctlr->active = 1;
-			break;
-		}
-	}
-	if(ctlr == nil)
-		return -1;
-
-	ether->ctlr = ctlr;
-	ether->port = ctlr->port;
-	ether->irq = ctlr->pcidev->intl;
-	ether->tbdf = ctlr->pcidev->tbdf;
-
-	/*
-	 * Check if the adapter's station address is to be overridden.
-	 * If not, read it from the EEPROM and set in ether->ea prior to
-	 * loading the station address in the hardware.
-	 */
-	memset(ea, 0, Easize);
-	if(memcmp(ea, ether->ea, Easize) == 0)
-		memmove(ether->ea, ctlr->sromea, Easize);
-
-	/*
-	 * Look for a medium override in case there's no autonegotiation
-	 * (no MII) or the autonegotiation fails.
-	 */
-	for(i = 0; i < ether->nopt; i++){
-		if(cistrcmp(ether->opt[i], "FD") == 0){
-			ctlr->fd = 1;
-			continue;
-		}
-		for(x = 0; x < nelem(mediatable); x++){
-			debug("compare <%s> <%s>\n", mediatable[x],
-				ether->opt[i]);
-			if(cistrcmp(mediatable[x], ether->opt[i]))
-				continue;
-			ctlr->medium = x;
-	
-			switch(ctlr->medium){
-			default:
-				ctlr->fd = 0;
-				break;
-	
-			case 0x04:		/* 10BASE-TFD */
-			case 0x05:		/* 100BASE-TXFD */
-			case 0x08:		/* 100BASE-FXFD */
-				ctlr->fd = 1;
-				break;
-			}
-			break;
-		}
-	}
-
-	ether->mbps = media(ether, 1);
-
-	/*
-	 * Initialise descriptor rings, ethernet address.
-	 */
-	ctlr->nrdr = Nrde;
-	ctlr->ntdr = Ntde;
-	pcisetbme(ctlr->pcidev);
-	ctlrinit(ether);
-
-	/*
-	 * Linkage to the generic ethernet driver.
-	 */
-	ether->attach = attach;
-	ether->transmit = transmit;
-	ether->interrupt = interrupt;
-
-	return 0;
-}

+ 0 - 775
sys/src/fs/pc/ether8139.c

@@ -1,775 +0,0 @@
-/*
- * Realtek 8139 (but not the 8129).
- * Error recovery for the various over/under -flow conditions
- * may need work.
- */
-#ifdef FS
-#include "all.h"
-#include "io.h"
-#include "mem.h"
-#include "../ip/ip.h"
-
-#else
-
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "io.h"
-#include "../port/error.h"
-#include "../port/netif.h"
-#endif			/* FS */
-
-#include "etherif.h"
-
-#include "compat.h"
-
-enum {					/* registers */
-	Idr0		= 0x0000,	/* MAC address */
-	Mar0		= 0x0008,	/* Multicast address */
-	Tsd0		= 0x0010,	/* Transmit Status Descriptor0 */
-	Tsad0		= 0x0020,	/* Transmit Start Address Descriptor0 */
-	Rbstart		= 0x0030,	/* Receive Buffer Start Address */
-	Erbcr		= 0x0034,	/* Early Receive Byte Count */
-	Ersr		= 0x0036,	/* Early Receive Status */
-	Cr		= 0x0037,	/* Command Register */
-	Capr		= 0x0038,	/* Current Address of Packet Read */
-	Cbr		= 0x003A,	/* Current Buffer Address */
-	Imr		= 0x003C,	/* Interrupt Mask */
-	Isr		= 0x003E,	/* Interrupt Status */
-	Tcr		= 0x0040,	/* Transmit Configuration */
-	Rcr		= 0x0044,	/* Receive Configuration */
-	Tctr		= 0x0048,	/* Timer Count */
-	Mpc		= 0x004C,	/* Missed Packet Counter */
-	Cr9346		= 0x0050,	/* 9346 Command Register */
-	Config0		= 0x0051,	/* Configuration Register 0 */
-	Config1		= 0x0052,	/* Configuration Register 1 */
-	TimerInt	= 0x0054,	/* Timer Interrupt */
-	Msr		= 0x0058,	/* Media Status */
-	Config3		= 0x0059,	/* Configuration Register 3 */
-	Config4		= 0x005A,	/* Configuration Register 4 */
-	Mulint		= 0x005C,	/* Multiple Interrupt Select */
-	RerID		= 0x005E,	/* PCI Revision ID */
-	Tsad		= 0x0060,	/* Transmit Status of all Descriptors */
-
-	Bmcr		= 0x0062,	/* Basic Mode Control */
-	Bmsr		= 0x0064,	/* Basic Mode Status */
-	Anar		= 0x0066,	/* Auto-Negotiation Advertisment */
-	Anlpar		= 0x0068,	/* Auto-Negotiation Link Partner */
-	Aner		= 0x006A,	/* Auto-Negotiation Expansion */
-	Dis		= 0x006C,	/* Disconnect Counter */
-	Fcsc		= 0x006E,	/* False Carrier Sense Counter */
-	Nwaytr		= 0x0070,	/* N-way Test */
-	Rec		= 0x0072,	/* RX_ER Counter */
-	Cscr		= 0x0074,	/* CS Configuration */
-	Phy1parm	= 0x0078,	/* PHY Parameter 1 */
-	Twparm		= 0x007C,	/* Twister Parameter */
-	Phy2parm	= 0x0080,	/* PHY Parameter 2 */
-};
-
-enum {					/* Cr */
-	Bufe		= 0x01,		/* Rx Buffer Empty */
-	Te		= 0x04,		/* Transmitter Enable */
-	Re		= 0x08,		/* Receiver Enable */
-	Rst		= 0x10,		/* Software Reset */
-};
-
-enum {					/* Imr/Isr */
-	Rok		= 0x0001,	/* Receive OK */
-	Rer		= 0x0002,	/* Receive Error */
-	Tok		= 0x0004,	/* Transmit OK */
-	Ter		= 0x0008,	/* Transmit Error */
-	Rxovw		= 0x0010,	/* Receive Buffer Overflow */
-	PunLc		= 0x0020,	/* Packet Underrun or Link Change */
-	Fovw		= 0x0040,	/* Receive FIFO Overflow */
-	Clc		= 0x2000,	/* Cable Length Change */
-	Timerbit	= 0x4000,	/* Timer */
-	Serr		= 0x8000,	/* System Error */
-};
-
-enum {					/* Tcr */
-	Clrabt		= 0x00000001,	/* Clear Abort */
-	TxrrSHIFT	= 4,		/* Transmit Retry Count */
-	TxrrMASK	= 0x000000F0,
-	MtxdmaSHIFT	= 8,		/* Max. DMA Burst Size */
-	MtxdmaMASK	= 0x00000700,
-	Mtxdma2048	= 0x00000700,
-	Acrc		= 0x00010000,	/* Append CRC (not) */
-	LbkSHIFT	= 17,		/* Loopback Test */
-	LbkMASK		= 0x00060000,
-	Rtl8139ArevG	= 0x00800000,	/* RTL8139A Rev. G ID */
-	IfgSHIFT	= 24,		/* Interframe Gap */
-	IfgMASK		= 0x03000000,
-	HwveridSHIFT	= 26,		/* Hardware Version ID */
-	HwveridMASK	= 0x7C000000,
-};
-
-enum {					/* Rcr */
-	Aap		= 0x00000001,	/* Accept All Packets */
-	Apm		= 0x00000002,	/* Accept Physical Match */
-	Am		= 0x00000004,	/* Accept Multicast */
-	Ab		= 0x00000008,	/* Accept Broadcast */
-	Ar		= 0x00000010,	/* Accept Runt */
-	Aer		= 0x00000020,	/* Accept Error */
-	Sel9356		= 0x00000040,	/* 9356 EEPROM used */
-	Wrap		= 0x00000080,	/* Rx Buffer Wrap Control */
-	MrxdmaSHIFT	= 8,		/* Max. DMA Burst Size */
-	MrxdmaMASK	= 0x00000700,
-	Mrxdmaunlimited	= 0x00000700,
-	RblenSHIFT	= 11,		/* Receive Buffer Length */
-	RblenMASK	= 0x00001800,
-	Rblen8K		= 0x00000000,	/* 8KB+16 */
-	Rblen16K	= 0x00000800,	/* 16KB+16 */
-	Rblen32K	= 0x00001000,	/* 32KB+16 */
-	Rblen64K	= 0x00001800,	/* 64KB+16 */
-	RxfthSHIFT	= 13,		/* Receive Buffer Length */
-	RxfthMASK	= 0x0000E000,
-	Rxfth256	= 0x00008000,
-	Rxfthnone	= 0x0000E000,
-	Rer8		= 0x00010000,	/* Accept Error Packets > 8 bytes */
-	MulERINT	= 0x00020000,	/* Multiple Early Interrupt Select */
-	ErxthSHIFT	= 24,		/* Early Rx Threshold */
-	ErxthMASK	= 0x0F000000,
-	Erxthnone	= 0x00000000,
-};
-
-enum {					/* Received Packet Status */
-	Rcok		= 0x0001,	/* Receive Completed OK */
-	Fae		= 0x0002,	/* Frame Alignment Error */
-	Crc		= 0x0004,	/* CRC Error */
-	Long		= 0x0008,	/* Long Packet */
-	Runt		= 0x0010,	/* Runt Packet Received */
-	Ise		= 0x0020,	/* Invalid Symbol Error */
-	Bar		= 0x2000,	/* Broadcast Address Received */
-	Pam		= 0x4000,	/* Physical Address Matched */
-	Mar		= 0x8000,	/* Multicast Address Received */
-};
-
-enum {					/* Media Status Register */
-	Rxpf		= 0x01,		/* Pause Flag */
-	Txpf		= 0x02,		/* Pause Flag */
-	Linkb		= 0x04,		/* Inverse of Link Status */
-	Speed10		= 0x08,		/* 10Mbps */
-	Auxstatus	= 0x10,		/* Aux. Power Present Status */
-	Rxfce		= 0x40,		/* Receive Flow Control Enable */
-	Txfce		= 0x80,		/* Transmit Flow Control Enable */
-};
-
-typedef struct {			/* Soft Transmit Descriptor */
-	int	tsd;
-	int	tsad;
-	uchar*	data;
-	Block*	bp;
-} Td;
-
-enum {					/* Tsd0 */
-	SizeSHIFT	= 0,		/* Descriptor Size */
-	SizeMASK	= 0x00001FFF,
-	Own		= 0x00002000,
-	Tun		= 0x00004000,	/* Transmit FIFO Underrun */
-	Tcok		= 0x00008000,	/* Transmit COmpleted OK */
-	EtxthSHIFT	= 16,		/* Early Tx Threshold */
-	EtxthMASK	= 0x001F0000,
-	NccSHIFT	= 24,		/* Number of Collisions Count */
-	NccMASK		= 0x0F000000,
-	Cdh		= 0x10000000,	/* CD Heartbeat */
-	Owc		= 0x20000000,	/* Out of Window Collision */
-	Tabt		= 0x40000000,	/* Transmit Abort */
-	Crs		= 0x80000000,	/* Carrier Sense Lost */
-};
-
-enum {
-	Rblen		= Rblen64K,	/* Receive Buffer Length */
-	Ntd		= 4,		/* Number of Transmit Descriptors */
-	Tdbsz		= ROUNDUP(sizeof(Etherpkt), 4),
-};
-
-typedef struct Ctlr Ctlr;
-typedef struct Ctlr {
-	int	port;
-	Pcidev*	pcidev;
-	Ctlr*	next;
-	int	active;
-	int	id;
-
-	QLock	alock;			/* attach */
-	Lock	ilock;			/* init */
-	void*	alloc;			/* base of per-Ctlr allocated data */
-
-	int	rcr;			/* receive configuration register */
-	uchar*	rbstart;		/* receive buffer */
-	int	rblen;			/* receive buffer length */
-	int	ierrs;			/* receive errors */
-
-	Lock	tlock;			/* transmit */
-	Td	td[Ntd];
-	int	ntd;			/* descriptors active */
-	int	tdh;			/* host index into td */
-	int	tdi;			/* interface index into td */
-	int	etxth;			/* early transmit threshold */
-	int	taligned;		/* packet required no alignment */
-	int	tunaligned;		/* packet required alignment */
-
-	int	dis;			/* disconnect counter */
-	int	fcsc;			/* false carrier sense counter */
-	int	rec;			/* RX_ER counter */
-} Ctlr;
-
-static Ctlr* ctlrhead;
-static Ctlr* ctlrtail;
-
-#define csr8r(c, r)	(inb((c)->port+(r)))
-#define csr16r(c, r)	(ins((c)->port+(r)))
-#define csr32r(c, r)	(inl((c)->port+(r)))
-#define csr8w(c, r, b)	(outb((c)->port+(r), (int)(b)))
-#define csr16w(c, r, w)	(outs((c)->port+(r), (ushort)(w)))
-#define csr32w(c, r, l)	(outl((c)->port+(r), (ulong)(l)))
-
-static void
-rtl8139promiscuous(void* arg, int on)
-{
-	Ether *edev;
-	Ctlr * ctlr;
-
-	edev = arg;
-	ctlr = edev->ctlr;
-	ilock(&ctlr->ilock);
-
-	if(on)
-		ctlr->rcr |= Aap;
-	else
-		ctlr->rcr &= ~Aap;
-	csr32w(ctlr, Rcr, ctlr->rcr);
-	iunlock(&ctlr->ilock);
-}
-
-static long
-rtl8139ifstat(Ether* edev, void* a, long n, ulong offset)
-{
-	int l;
-	char *p;
-	Ctlr *ctlr;
-
-	ctlr = edev->ctlr;
-	p = malloc(READSTR);
-	l = snprint(p, READSTR, "rcr %8.8uX\n", ctlr->rcr);
-	l += snprint(p+l, READSTR-l, "ierrs %d\n", ctlr->ierrs);
-	l += snprint(p+l, READSTR-l, "etxth %d\n", ctlr->etxth);
-	l += snprint(p+l, READSTR-l, "taligned %d\n", ctlr->taligned);
-	l += snprint(p+l, READSTR-l, "tunaligned %d\n", ctlr->tunaligned);
-	ctlr->dis += csr16r(ctlr, Dis);
-	l += snprint(p+l, READSTR-l, "dis %d\n", ctlr->dis);
-	ctlr->fcsc += csr16r(ctlr, Fcsc);
-	l += snprint(p+l, READSTR-l, "fcscnt %d\n", ctlr->fcsc);
-	ctlr->rec += csr16r(ctlr, Rec);
-	l += snprint(p+l, READSTR-l, "rec %d\n", ctlr->rec);
-
-	l += snprint(p+l, READSTR-l, "Tcr %8.8luX\n", csr32r(ctlr, Tcr));
-	l += snprint(p+l, READSTR-l, "Config0 %2.2uX\n", csr8r(ctlr, Config0));
-	l += snprint(p+l, READSTR-l, "Config1 %2.2uX\n", csr8r(ctlr, Config1));
-	l += snprint(p+l, READSTR-l, "Msr %2.2uX\n", csr8r(ctlr, Msr));
-	l += snprint(p+l, READSTR-l, "Config3 %2.2uX\n", csr8r(ctlr, Config3));
-	l += snprint(p+l, READSTR-l, "Config4 %2.2uX\n", csr8r(ctlr, Config4));
-
-	l += snprint(p+l, READSTR-l, "Bmcr %4.4uX\n", csr16r(ctlr, Bmcr));
-	l += snprint(p+l, READSTR-l, "Bmsr %4.4uX\n", csr16r(ctlr, Bmsr));
-	l += snprint(p+l, READSTR-l, "Anar %4.4uX\n", csr16r(ctlr, Anar));
-	l += snprint(p+l, READSTR-l, "Anlpar %4.4uX\n", csr16r(ctlr, Anlpar));
-	l += snprint(p+l, READSTR-l, "Aner %4.4uX\n", csr16r(ctlr, Aner));
-	l += snprint(p+l, READSTR-l, "Nwaytr %4.4uX\n", csr16r(ctlr, Nwaytr));
-	snprint(p+l, READSTR-l, "Cscr %4.4uX\n", csr16r(ctlr, Cscr));
-	n = readstr(offset, a, n, p);
-	free(p);
-
-	return n;
-}
-
-static int
-rtl8139reset(Ctlr* ctlr)
-{
-	int timeo;
-
-	/*
-	 * Soft reset the controller.
-	 */
-	csr8w(ctlr, Cr, Rst);
-	for(timeo = 0; timeo < 1000; timeo++){
-		if(!(csr8r(ctlr, Cr) & Rst))
-			return 0;
-		delay(1);
-	}
-
-	return -1;
-}
-
-static void
-rtl8139halt(Ctlr* ctlr)
-{
-	int i;
-
-	csr8w(ctlr, Cr, 0);
-	csr16w(ctlr, Imr, 0);
-	csr16w(ctlr, Isr, ~0);
-
-	for(i = 0; i < Ntd; i++){
-		if(ctlr->td[i].bp == nil)
-			continue;
-		freeb(ctlr->td[i].bp);
-		ctlr->td[i].bp = nil;
-	}
-}
-
-static void
-rtl8139init(Ether* edev)
-{
-	int i;
-	ulong r;
-	Ctlr *ctlr;
-	uchar *alloc;
-
-	ctlr = edev->ctlr;
-	ilock(&ctlr->ilock);
-
-	rtl8139halt(ctlr);
-
-	/*
-	 * MAC Address.
-	 */
-	r = (edev->ea[3]<<24)|(edev->ea[2]<<16)|(edev->ea[1]<<8)|edev->ea[0];
-	csr32w(ctlr, Idr0, r);
-	r = (edev->ea[5]<<8)|edev->ea[4];
-	csr32w(ctlr, Idr0+4, r);
-
-	/*
-	 * Receiver
-	 */
-	alloc = (uchar*)ROUNDUP((ulong)ctlr->alloc, 32);
-	ctlr->rbstart = alloc;
-	alloc += ctlr->rblen+16;
-	memset(ctlr->rbstart, 0, ctlr->rblen+16);
-	csr32w(ctlr, Rbstart, PCIWADDR(ctlr->rbstart));
-	ctlr->rcr = Rxfth256|Rblen|Mrxdmaunlimited|Ab|Apm;
-
-	/*
-	 * Transmitter.
-	 */
-	for(i = 0; i < Ntd; i++){
-		ctlr->td[i].tsd = Tsd0+i*4;
-		ctlr->td[i].tsad = Tsad0+i*4;
-		ctlr->td[i].data = alloc;
-		alloc += Tdbsz;
-		ctlr->td[i].bp = nil;
-	}
-	ctlr->ntd = ctlr->tdh = ctlr->tdi = 0;
-	ctlr->etxth = 128/32;
-
-	/*
-	 * Interrupts.
-	 */
-	csr32w(ctlr, TimerInt, 0);
-	csr16w(ctlr, Imr, Serr|Timerbit|Fovw|PunLc|Rxovw|Ter|Tok|Rer|Rok);
-	csr32w(ctlr, Mpc, 0);
-
-	/*
-	 * Enable receiver/transmitter.
-	 * Need to enable before writing the Rcr or it won't take.
-	 */
-	csr8w(ctlr, Cr, Te|Re);
-	csr32w(ctlr, Tcr, Mtxdma2048);
-	csr32w(ctlr, Rcr, ctlr->rcr);
-
-	iunlock(&ctlr->ilock);
-}
-
-static void
-rtl8139attach(Ether* edev)
-{
-	Ctlr *ctlr;
-
-	ctlr = edev->ctlr;
-	qlock(&ctlr->alock);
-	if(ctlr->alloc == nil){
-		ctlr->rblen = 1<<((Rblen>>RblenSHIFT)+13);
-		ctlr->alloc = mallocz(ctlr->rblen+16 + Ntd*Tdbsz + 32, 0);
-		rtl8139init(edev);
-	}
-	qunlock(&ctlr->alock);
-}
-
-static void
-rtl8139txstart(Ether* edev)
-{
-	Td *td;
-	int size;
-	Block *bp;
-	Ctlr *ctlr;
-
-	ctlr = edev->ctlr;
-	while(ctlr->ntd < Ntd){
-		bp = etheroq(edev);
-		if(bp == nil)
-			break;
-		size = BLEN(bp);
-
-		td = &ctlr->td[ctlr->tdh];
-		if(((int)bp->rp) & 0x03){
-			memmove(td->data, bp->rp, size);
-			freeb(bp);
-			csr32w(ctlr, td->tsad, PCIWADDR(td->data));
-			ctlr->tunaligned++;
-		}
-		else{
-			td->bp = bp;
-			csr32w(ctlr, td->tsad, PCIWADDR(bp->rp));
-			ctlr->taligned++;
-		}
-		csr32w(ctlr, td->tsd, (ctlr->etxth<<EtxthSHIFT)|size);
-
-		ctlr->ntd++;
-		ctlr->tdh = NEXT(ctlr->tdh, Ntd);
-	}
-}
-
-static void
-rtl8139transmit(Ether* edev)
-{
-	Ctlr *ctlr;
-
-	ctlr = edev->ctlr;
-	ilock(&ctlr->tlock);
-	rtl8139txstart(edev);
-	iunlock(&ctlr->tlock);
-}
-
-static void
-rtl8139receive(Ether* edev)
-{
-	Block *bp;
-	Ctlr *ctlr;
-	ushort capr;
-	uchar cr, *p;
-	int l, length, status;
-
-	ctlr = edev->ctlr;
-
-	/*
-	 * Capr is where the host is reading from,
-	 * Cbr is where the NIC is currently writing.
-	 */
-	capr = (csr16r(ctlr, Capr)+16) % ctlr->rblen;
-	while(!(csr8r(ctlr, Cr) & Bufe)){
-		p = ctlr->rbstart+capr;
-
-		/*
-		 * Apparently the packet length may be 0xFFF0 if
-		 * the NIC is still copying the packet into memory.
-		 */
-		length = (*(p+3)<<8)|*(p+2);
-		if(length == 0xFFF0)
-			break;
-		status = (*(p+1)<<8)|*p;
-
-		if(!(status & Rcok)){
-#ifndef FS
-			if(status & (Ise|Fae))
-				edev->frames++;
-			if(status & Crc)
-				edev->crcs++;
-			if(status & (Runt|Long))
-				edev->buffs++;
-#endif
-			/*
-			 * Reset the receiver.
-			 * Also may have to restore the multicast list
-			 * here too if it ever gets used.
-			 */
-			cr = csr8r(ctlr, Cr);
-			csr8w(ctlr, Cr, cr & ~Re);
-			csr32w(ctlr, Rbstart, PCIWADDR(ctlr->rbstart));
-			csr8w(ctlr, Cr, cr);
-			csr32w(ctlr, Rcr, ctlr->rcr);
-
-			continue;
-		}
-
-		/*
-		 * Receive Completed OK.
-		 * Very simplistic; there are ways this could be done
-		 * without copying, but the juice probably isn't worth
-		 * the squeeze.
-		 * The packet length includes a 4 byte CRC on the end.
-		 */
-		capr = (capr+4) % ctlr->rblen;
-		p = ctlr->rbstart+capr;
-		capr = (capr+length) % ctlr->rblen;
-
-		if((bp = iallocb(length)) != nil){
-			SETWPCNT(bp, 0);
-			if(p+length >= ctlr->rbstart+ctlr->rblen){
-				l = ctlr->rbstart+ctlr->rblen - p;
-				memmove(ENDDATA(bp), p, l);
-				INCRPTR(bp, l);
-				length -= l;
-				p = ctlr->rbstart;
-			}
-			if(length > 0){
-				memmove(ENDDATA(bp), p, length);
-				INCRPTR(bp, length);
-			}
-			INCRPTR(bp, -4);
-			if (BLEN(bp) < 0) {
-				print("rtl8139receive: input packet of negative length\n");
-				SETWPCNT(bp, 0);
-				freeb(bp);
-			} else
-				ETHERIQ(edev, bp, 1);
-		}
-
-		capr = ROUNDUP(capr, 4);
-		csr16w(ctlr, Capr, capr-16);
-	}
-}
-
-static void
-rtl8139interrupt(Ureg*, void* arg)
-{
-	Td *td;
-	Ctlr *ctlr;
-	Ether *edev;
-	int isr, msr, tsd;
-
-	edev = arg;
-	ctlr = edev->ctlr;
-
-	while((isr = csr16r(ctlr, Isr)) != 0){
-		csr16w(ctlr, Isr, isr);
-		if(isr & (Fovw|PunLc|Rxovw|Rer|Rok)){
-			rtl8139receive(edev);
-			if(!(isr & Rok))
-				ctlr->ierrs++;
-			isr &= ~(Fovw|Rxovw|Rer|Rok);
-		}
-
-		if(isr & (Ter|Tok)){
-			ilock(&ctlr->tlock);
-			while(ctlr->ntd){
-				td = &ctlr->td[ctlr->tdi];
-				tsd = csr32r(ctlr, td->tsd);
-				if(!(tsd & (Tabt|Tun|Tcok)))
-					break;
-
-				if(!(tsd & Tcok)){
-					if(tsd & Tun){
-						if(ctlr->etxth < ETHERMAXTU/32)
-							ctlr->etxth++;
-					}
-#ifndef FS
-					edev->oerrs++;
-#endif
-				}
-
-				if(td->bp != nil){
-					freeb(td->bp);
-					td->bp = nil;
-				}
-
-				ctlr->ntd--;
-				ctlr->tdi = NEXT(ctlr->tdi, Ntd);
-			}
-			rtl8139txstart(edev);
-			iunlock(&ctlr->tlock);
-			isr &= ~(Ter|Tok);
-		}
-
-		if(isr & PunLc){
-			/*
-			 * Maybe the link changed - do we care very much?
-			 */
-			msr = csr8r(ctlr, Msr);
-			if(!(msr & Linkb)){
-				if(!(msr & Speed10) && edev->mbps != 100){
-					edev->mbps = 100;
-					qsetlimit(edev->oq, 256*1024);
-				}
-				else if((msr & Speed10) && edev->mbps != 10){
-					edev->mbps = 10;
-					qsetlimit(edev->oq, 65*1024);
-				}
-			}
-			isr &= ~(Clc|PunLc);
-		}
-
-		/*
-		 * Only Serr|Timerbit should be left by now.
-		 * Should anything be done to tidy up? TimerInt isn't
-		 * used so that can be cleared. A PCI bus error is indicated
-		 * by Serr, that's pretty serious; is there anyhing to do
-		 * other than try to reinitialise the chip?
-		 */
-		if(isr != 0){
-			iprint("rtl8139interrupt: imr %4.4ux isr %4.4ux\n",
-				csr16r(ctlr, Imr), isr);
-			if(isr & Timerbit)
-				csr32w(ctlr, TimerInt, 0);
-			if(isr & Serr)
-				rtl8139init(edev);
-		}
-	}
-}
-
-static Ctlr*
-rtl8139match(Ether* edev, int id)
-{
-	int port;
-	Pcidev *p;
-	Ctlr *ctlr;
-
-	/*
-	 * Any adapter matches if no edev->port is supplied,
-	 * otherwise the ports must match.
-	 */
-	for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
-		if(ctlr->active)
-			continue;
-		p = ctlr->pcidev;
-		if(((p->did<<16)|p->vid) != id)
-			continue;
-		port = p->mem[0].bar & ~0x01;
-		if(edev->port != 0 && edev->port != port)
-			continue;
-
-		if(ioalloc(port, p->mem[0].size, 0, "rtl8139") < 0){
-			print("rtl8139: port 0x%ux in use\n", port);
-			continue;
-		}
-
-		ctlr->port = port;
-		if(rtl8139reset(ctlr))
-			continue;
-		pcisetbme(p);
-
-		ctlr->active = 1;
-		return ctlr;
-	}
-	return nil;
-}
-
-static struct {
-	char*	name;
-	int	id;
-} rtl8139pci[] = {
-	{ "rtl8139",	(0x8139<<16)|0x10EC, },	/* generic */
-	{ "smc1211",	(0x1211<<16)|0x1113, },	/* SMC EZ-Card */
-	{ "dfe-538tx",	(0x1300<<16)|0x1186, }, /* D-Link DFE-538TX */
-	{ "dfe-560txd",	(0x1340<<16)|0x1186, }, /* D-Link DFE-560TXD */
-	{ nil },
-};
-
-int
-rtl8139pnp(Ether* edev)
-{
-	int i, id;
-	Pcidev *p;
-	Ctlr *ctlr;
-	uchar ea[Eaddrlen];
-
-	/*
-	 * Make a list of all ethernet controllers
-	 * if not already done.
-	 */
-	if(ctlrhead == nil){
-		p = nil;
-		while(p = pcimatch(p, 0, 0)){
-#ifdef FS
-			if(p->ccru != ((0x02<<8)|0x00))
-#else
-			if(p->ccrb != 0x02 || p->ccru != 0)
-#endif
-				continue;
-			ctlr = malloc(sizeof(Ctlr));
-			ctlr->pcidev = p;
-			ctlr->id = (p->did<<16)|p->vid;
-
-			if(ctlrhead != nil)
-				ctlrtail->next = ctlr;
-			else
-				ctlrhead = ctlr;
-			ctlrtail = ctlr;
-		}
-	}
-
-	/*
-	 * Is it an RTL8139 under a different name?
-	 * Normally a search is made through all the found controllers
-	 * for one which matches any of the known vid+did pairs.
-	 * If a vid+did pair is specified a search is made for that
-	 * specific controller only.
-	 */
-	id = 0;
-	for(i = 0; i < edev->nopt; i++){
-		if(cistrncmp(edev->opt[i], "id=", 3) == 0)
-			id = strtol(&edev->opt[i][3], nil, 0);
-	}
-
-	ctlr = nil;
-	if(id != 0)
-		ctlr = rtl8139match(edev, id);
-	else for(i = 0; rtl8139pci[i].name; i++){
-		if((ctlr = rtl8139match(edev, rtl8139pci[i].id)) != nil)
-			break;
-	}
-	if(ctlr == nil)
-		return -1;
-
-	edev->ctlr = ctlr;
-	edev->port = ctlr->port;
-	edev->irq = ctlr->pcidev->intl;
-	edev->tbdf = ctlr->pcidev->tbdf;
-
-	/*
-	 * Check if the adapter's station address is to be overridden.
-	 * If not, read it from the device and set in edev->ea.
-	 */
-	memset(ea, 0, Eaddrlen);
-	if(memcmp(ea, edev->ea, Eaddrlen) == 0){
-		i = csr32r(ctlr, Idr0);
-		edev->ea[0] = i;
-		edev->ea[1] = i>>8;
-		edev->ea[2] = i>>16;
-		edev->ea[3] = i>>24;
-		i = csr32r(ctlr, Idr0+4);
-		edev->ea[4] = i;
-		edev->ea[5] = i>>8;
-	}
-
-	edev->attach = rtl8139attach;
-	edev->transmit = rtl8139transmit;
-	edev->interrupt = rtl8139interrupt;
-#ifndef FS
-	edev->ifstat = rtl8139ifstat;
-
-	edev->arg = edev;
-	edev->promiscuous = rtl8139promiscuous;
-#endif
-
-	/*
-	 * This should be much more dynamic but will do for now.
-	 */
-	if((csr8r(ctlr, Msr) & (Speed10|Linkb)) == 0)
-		edev->mbps = 100;
-
-	return 0;
-}
-
-void
-ether8139link(void)
-{
-	addethercard("rtl8139", rtl8139pnp);
-}
-
-void
-ether8139bothlink(void)
-{
-	ether8139link();
-}

+ 0 - 1133
sys/src/fs/pc/ether8169.c

@@ -1,1133 +0,0 @@
-/*
- * Realtek RTL8110S/8169S.
- * Mostly there. There are some magic register values used
- * which are not described in any datasheet or driver but seem
- * to be necessary.
- * No tuning has been done. Only tested on an RTL8110S, there
- * are slight differences between the chips in the series so some
- * tweaks may be needed.
- */
-#include "etherdat.h"
-#include "etherif.h"
-#include "ethermii.h"
-#include "compat.h"
-
-#define dprint(...)	print("ether 8169: " __VA_ARGS__);
-
-enum {					/* registers */
-	Idr0		= 0x00,		/* MAC address */
-	Mar0		= 0x08,		/* Multicast address */
-	Dtccr		= 0x10,		/* Dump Tally Counter Command */
-	Tnpds		= 0x20,		/* Transmit Normal Priority Descriptors */
-	Thpds		= 0x28,		/* Transmit High Priority Descriptors */
-	Flash		= 0x30,		/* Flash Memory Read/Write */
-	Erbcr		= 0x34,		/* Early Receive Byte Count */
-	Ersr		= 0x36,		/* Early Receive Status */
-	Cr		= 0x37,		/* Command Register */
-	Tppoll		= 0x38,		/* Transmit Priority Polling */
-	Imr		= 0x3C,		/* Interrupt Mask */
-	Isr		= 0x3E,		/* Interrupt Status */
-	Tcr		= 0x40,		/* Transmit Configuration */
-	Rcr		= 0x44,		/* Receive Configuration */
-	Tctr		= 0x48,		/* Timer Count */
-	Mpc		= 0x4C,		/* Missed Packet Counter */
-	Cr9346		= 0x50,		/* 9346 Command Register */
-	Config0		= 0x51,		/* Configuration Register 0 */
-	Config1		= 0x52,		/* Configuration Register 1 */
-	Config2		= 0x53,		/* Configuration Register 2 */
-	Config3		= 0x54,		/* Configuration Register 3 */
-	Config4		= 0x55,		/* Configuration Register 4 */
-	Config5		= 0x56,		/* Configuration Register 5 */
-	Timerint		= 0x58,		/* Timer Interrupt */
-	Mulint		= 0x5C,		/* Multiple Interrupt Select */
-	Phyar		= 0x60,		/* PHY Access */
-	Tbicsr0		= 0x64,		/* TBI Control and Status */
-	Tbianar		= 0x68,		/* TBI Auto-Negotiation Advertisment */
-	Tbilpar		= 0x6A,		/* TBI Auto-Negotiation Link Partner */
-	Phystatus	= 0x6C,		/* PHY Status */
-
-	Rms		= 0xDA,		/* Receive Packet Maximum Size */
-	Cplusc		= 0xE0,		/* C+ Command */
-	Rdsar		= 0xE4,		/* Receive Descriptor Start Address */
-	Mtps		= 0xEC,		/* Max. Transmit Packet Size */
-};
-
-enum {					/* Dtccr */
-	Cmd		= 0x00000008,	/* Command */
-};
-
-enum {					/* Cr */
-	Te		= 0x04,		/* Transmitter Enable */
-	Re		= 0x08,		/* Receiver Enable */
-	Rst		= 0x10,		/* Software Reset */
-};
-
-enum {					/* Tppoll */
-	Fswint		= 0x01,		/* Forced Software Interrupt */
-	Npq		= 0x40,		/* Normal Priority Queue polling */
-	Hpq		= 0x80,		/* High Priority Queue polling */
-};
-
-enum {					/* Imr/Isr */
-	Rok		= 0x0001,	/* Receive OK */
-	Rer		= 0x0002,	/* Receive Error */
-	Tok		= 0x0004,	/* Transmit OK */
-	Ter		= 0x0008,	/* Transmit Error */
-	Rdu		= 0x0010,	/* Receive Descriptor Unavailable */
-	Punlc		= 0x0020,	/* Packet Underrun or Link Change */
-	Fovw		= 0x0040,	/* Receive FIFO Overflow */
-	Tdu		= 0x0080,	/* Transmit Descriptor Unavailable */
-	Swint		= 0x0100,	/* Software Interrupt */
-	Timeout		= 0x4000,	/* Timer */
-	Serr		= 0x8000,	/* System Error */
-};
-
-enum {					/* Tcr */
-	MtxdmaSHIFT	= 8,		/* Max. DMA Burst Size */
-	MtxdmaMASK	= 0x00000700,
-	Mtxdmaunlimited	= 0x00000700,
-	Acrc		= 0x00010000,	/* Append CRC (not) */
-	Lbk0		= 0x00020000,	/* Loopback Test 0 */
-	Lbk1		= 0x00040000,	/* Loopback Test 1 */
-	Ifg2		= 0x00080000,	/* Interframe Gap 2 */
-	HwveridSHIFT	= 23,		/* Hardware Version ID */
-	HwveridMASK	= 0x7C800000,
-	Macv01		= 0x00000000,	/* RTL8169 */
-	Macv02		= 0x00800000,	/* RTL8169S/8110S */
-	Macv03		= 0x04000000,	/* RTL8169S/8110S */
-	Macv04		= 0x10000000,	/* RTL8169SB/8110SB */
-	Macv05		= 0x18000000,	/* RTL8169SC/8110SC */
-	Macv11		= 0x30000000,	/* RTL8168B/8111B */
-	Macv12		= 0x38000000,	/* RTL8169B/8111B */
-	Macv13		= 0x34000000,	/* RTL8101E */
-	Macv14		= 0x30800000,	/* RTL8100E */
-	Macv15		= 0x38800000,	/* RTL8100E */
-	Ifg0		= 0x01000000,	/* Interframe Gap 0 */
-	Ifg1		= 0x02000000,	/* Interframe Gap 1 */
-};
-
-enum {					/* Rcr */
-	Aap		= 0x00000001,	/* Accept All Packets */
-	Apm		= 0x00000002,	/* Accept Physical Match */
-	Am		= 0x00000004,	/* Accept Multicast */
-	Ab		= 0x00000008,	/* Accept Broadcast */
-	Ar		= 0x00000010,	/* Accept Runt */
-	Aer		= 0x00000020,	/* Accept Error */
-	Sel9356		= 0x00000040,	/* 9356 EEPROM used */
-	MrxdmaSHIFT	= 8,		/* Max. DMA Burst Size */
-	MrxdmaMASK	= 0x00000700,
-	Mrxdmaunlimited	= 0x00000700,
-	RxfthSHIFT	= 13,		/* Receive Buffer Length */
-	RxfthMASK	= 0x0000E000,
-	Rxfth256	= 0x00008000,
-	Rxfthnone	= 0x0000E000,
-	Rer8		= 0x00010000,	/* Accept Error Packets > 8 bytes */
-	MulERINT	= 0x01000000,	/* Multiple Early Interrupt Select */
-};
-
-enum {					/* Cr9346 */
-	Eedo		= 0x01,		/* */
-	Eedi		= 0x02,		/* */
-	Eesk		= 0x04,		/* */
-	Eecs		= 0x08,		/* */
-	Eem0		= 0x40,		/* Operating Mode */
-	Eem1		= 0x80,
-};
-
-enum {					/* Phyar */
-	DataMASK	= 0x0000FFFF,	/* 16-bit GMII/MII Register Data */
-	DataSHIFT	= 0,
-	RegaddrMASK	= 0x001F0000,	/* 5-bit GMII/MII Register Address */
-	RegaddrSHIFT	= 16,
-	PhyFlag		= 0x80000000,	/* */
-};
-
-enum {					/* Phystatus */
-	Fd		= 0x01,		/* Full Duplex */
-	Linksts		= 0x02,		/* Link Status */
-	Speed10		= 0x04,		/* */
-	Speed100	= 0x08,		/* */
-	Speed1000	= 0x10,		/* */
-	Rxflow		= 0x20,		/* */
-	Txflow		= 0x40,		/* */
-	Entbi		= 0x80,		/* */
-};
-
-enum {					/* Cplusc */
-	Mulrw		= 0x0008,	/* PCI Multiple R/W Enable */
-	Dac		= 0x0010,	/* PCI Dual Address Cycle Enable */
-	Rxchksum	= 0x0020,	/* Receive Checksum Offload Enable */
-	Rxvlan		= 0x0040,	/* Receive VLAN De-tagging Enable */
-	Endian		= 0x0200,	/* Endian Mode */
-};
-
-typedef struct D D;			/* Transmit/Receive Descriptor */
-struct D {
-	u32int	control;
-	u32int	vlan;
-	u32int	addrlo;
-	u32int	addrhi;
-};
-
-enum {					/* Transmit Descriptor control */
-	TxflMASK	= 0x0000FFFF,	/* Transmit Frame Length */
-	TxflSHIFT	= 0,
-	Tcps		= 0x00010000,	/* TCP Checksum Offload */
-	Udpcs		= 0x00020000,	/* UDP Checksum Offload */
-	Ipcs		= 0x00040000,	/* IP Checksum Offload */
-	Lgsen		= 0x08000000,	/* Large Send */
-};
-
-enum {					/* Receive Descriptor control */
-	RxflMASK	= 0x00003FFF,	/* Receive Frame Length */
-	RxflSHIFT	= 0,
-	Tcpf		= 0x00004000,	/* TCP Checksum Failure */
-	Udpf		= 0x00008000,	/* UDP Checksum Failure */
-	Ipf		= 0x00010000,	/* IP Checksum Failure */
-	Pid0		= 0x00020000,	/* Protocol ID0 */
-	Pid1		= 0x00040000,	/* Protocol ID1 */
-	Crce		= 0x00080000,	/* CRC Error */
-	Runt		= 0x00100000,	/* Runt Packet */
-	Res		= 0x00200000,	/* Receive Error Summary */
-	Rwt		= 0x00400000,	/* Receive Watchdog Timer Expired */
-	Fovf		= 0x00800000,	/* FIFO Overflow */
-	Bovf		= 0x01000000,	/* Buffer Overflow */
-	Bar		= 0x02000000,	/* Broadcast Address Received */
-	Pam		= 0x04000000,	/* Physical Address Matched */
-	Mar		= 0x08000000,	/* Multicast Address Received */
-};
-
-enum {					/* General Descriptor control */
-	Ls		= 0x10000000,	/* Last Segment Descriptor */
-	Fs		= 0x20000000,	/* First Segment Descriptor */
-	Eor		= 0x40000000,	/* End of Descriptor Ring */
-	Own		= 0x80000000,	/* Ownership */
-};
-
-/*
- */
-enum {					/* Ring sizes  (<= 1024) */
-	Ntd		= 32,		/* Transmit Ring */
-	Nrd		= 128,		/* Receive Ring */
-
-	Mps		= ROUNDUP(ETHERMAXTU+4, 128),
-};
-
-typedef struct Dtcc Dtcc;
-struct Dtcc {
-	u64int	txok;
-	u64int	rxok;
-	u64int	txer;
-	u32int	rxer;
-	u16int	misspkt;
-	u16int	fae;
-	u32int	tx1col;
-	u32int	txmcol;
-	u64int	rxokph;
-	u64int	rxokbrd;
-	u32int	rxokmu;
-	u16int	txabt;
-	u16int	txundrn;
-};
-
-enum {						/* Variants */
-	Rtl8100e 	= (0x8136<<16)|0x10EC,	/* RTL810[01]E ? */
-	Rtl8169c		= (0x0116<<16)|0x16EC,	/* RTL8169C+ (USR997902) */
-	Rtl8169sc	= (0x8167<<16)|0x10EC,	/* RTL8169SC */
-	Rtl8168b 	= (0x8168<<16)|0x10EC,	/* RTL8168B */
-	Rtl8169		= (0x8169<<16)|0x10EC,	/* RTL8169 */
-};
-
-typedef struct Ctlr Ctlr;
-typedef struct Ctlr {
-	int	port;
-	Pcidev*	pcidev;
-	Ctlr*	next;
-	int	active;
-
-	QLock	alock;			/* attach */
-	Lock	ilock;			/* init */
-	int	init;			/*  */
-
-	int	pciv;			/*  */
-	int	macv;			/* MAC version */
-	int	phyv;			/* PHY version */
-
-	Mii*	mii;
-
-	Lock	tlock;			/* transmit */
-	D*	td;			/* descriptor ring */
-	Block**	tb;			/* transmit buffers */
-	int	ntd;
-
-	int	tdh;			/* head - producer index (host) */
-	int	tdt;			/* tail - consumer index (NIC) */
-	int	ntdfree;
-	int	ntq;
-
-	int	mtps;			/* Max. Transmit Packet Size */
-
-	Lock	rlock;			/* receive */
-	D*	rd;			/* descriptor ring */
-	Block**	rb;			/* receive buffers */
-	int	nrd;
-
-	int	rdh;			/* head - producer index (NIC) */
-	int	rdt;			/* tail - consumer index (host) */
-	int	nrdfree;
-
-	int	tcr;			/* transmit configuration register */
-	int	rcr;			/* receive configuration register */
-	int	imr;
-
-	QLock	slock;			/* statistics */
-	Dtcc*	dtcc;
-	uint	txdu;
-	uint	tcpf;
-	uint	udpf;
-	uint	ipf;
-	uint	fovf;
-	uint	ierrs;
-	uint	rer;
-	uint	rdu;
-	uint	punlc;
-	uint	fovw;
-} Ctlr;
-
-static Ctlr* rtl8169ctlrhead;
-static Ctlr* rtl8169ctlrtail;
-
-#define csr8r(c, r)	(inb((c)->port+(r)))
-#define csr16r(c, r)	(ins((c)->port+(r)))
-#define csr32r(c, r)	(inl((c)->port+(r)))
-#define csr8w(c, r, b)	(outb((c)->port+(r), (u8int)(b)))
-#define csr16w(c, r, w)	(outs((c)->port+(r), (u16int)(w)))
-#define csr32w(c, r, l)	(outl((c)->port+(r), (u32int)(l)))
-
-static int
-rtl8169miimir(Mii* mii, int pa, int ra)
-{
-	uint r;
-	int timeo;
-	Ctlr *ctlr;
-
-	if(pa != 1)
-		return -1;
-	ctlr = mii->ctlr;
-
-	r = (ra<<16) & RegaddrMASK;
-	csr32w(ctlr, Phyar, r);
-	delay(1);
-	for(timeo = 0; timeo < 2000; timeo++){
-		if((r = csr32r(ctlr, Phyar)) & PhyFlag)
-			break;
-		microdelay(100);
-	}
-	if(!(r & PhyFlag))
-		return -1;
-
-	return (r & DataMASK)>>DataSHIFT;
-}
-
-static int
-rtl8169miimiw(Mii* mii, int pa, int ra, int data)
-{
-	uint r;
-	int timeo;
-	Ctlr *ctlr;
-
-	if(pa != 1)
-		return -1;
-	ctlr = mii->ctlr;
-
-	r = PhyFlag|((ra<<16) & RegaddrMASK)|((data<<DataSHIFT) & DataMASK);
-	csr32w(ctlr, Phyar, r);
-	delay(1);
-	for(timeo = 0; timeo < 2000; timeo++){
-		if(!((r = csr32r(ctlr, Phyar)) & PhyFlag))
-			break;
-		microdelay(100);
-	}
-	if(r & PhyFlag)
-		return -1;
-
-	return 0;
-}
-
-static int
-rtl8169mii(Ctlr* ctlr)
-{
-	MiiPhy *phy;
-
-	/*
-	 * Link management.
-	 */
-	if((ctlr->mii = malloc(sizeof(Mii))) == nil)
-		return -1;
-	ctlr->mii->mir = rtl8169miimir;
-	ctlr->mii->miw = rtl8169miimiw;
-	ctlr->mii->ctlr = ctlr;
-
-	/*
-	 * Get rev number out of Phyidr2 so can config properly.
-	 * There's probably more special stuff for Macv0[234] needed here.
-	 */
-	ctlr->phyv = rtl8169miimir(ctlr->mii, 1, Phyidr2) & 0x0F;
-	if(ctlr->macv == Macv02){
-		csr8w(ctlr, 0x82, 1);				/* magic */
-		rtl8169miimiw(ctlr->mii, 1, 0x0B, 0x0000);	/* magic */
-	}
-
-	if(mii(ctlr->mii, (1<<1)) == 0 || (phy = ctlr->mii->curphy) == nil){
-		free(ctlr->mii);
-		ctlr->mii = nil;
-		return -1;
-	}
-	print("oui %#ux phyno %d, macv = %#8.8ux phyv = %#4.4ux\n",
-		phy->oui, phy->phyno, ctlr->macv, ctlr->phyv);
-
-	miiane(ctlr->mii, ~0, ~0, ~0);
-
-	return 0;
-}
-
-void
-rtl8169promiscuous(void* arg, int on)
-{
-	Ether *edev;
-	Ctlr * ctlr;
-
-	edev = arg;
-	ctlr = edev->ctlr;
-	ilock(&ctlr->ilock);
-
-	if(on)
-		ctlr->rcr |= Aap;
-	else
-		ctlr->rcr &= ~Aap;
-	csr32w(ctlr, Rcr, ctlr->rcr);
-	iunlock(&ctlr->ilock);
-}
-
-#ifndef FS
-static long
-rtl8169ifstat(Ether* edev, void* a, long n, ulong offset)
-{
-	char *p;
-	Ctlr *ctlr;
-	Dtcc *dtcc;
-	int i, l, r, timeo;
-
-	ctlr = edev->ctlr;
-	qlock(&ctlr->slock);
-
-	p = nil;
-	if(waserror()){
-		qunlock(&ctlr->slock);
-		free(p);
-		nexterror();
-	}
-
-	csr32w(ctlr, Dtccr+4, 0);
-	csr32w(ctlr, Dtccr, PCIWADDR(ctlr->dtcc)|Cmd);
-	for(timeo = 0; timeo < 1000; timeo++){
-		if(!(csr32r(ctlr, Dtccr) & Cmd))
-			break;
-		delay(1);
-	}
-	if(csr32r(ctlr, Dtccr) & Cmd)
-		error(Eio);
-	dtcc = ctlr->dtcc;
-
-	edev->oerrs = dtcc->txer;
-	edev->crcs = dtcc->rxer;
-	edev->frames = dtcc->fae;
-	edev->buffs = dtcc->misspkt;
-	edev->overflows = ctlr->txdu+ctlr->rdu;
-
-	if(n == 0){
-		qunlock(&ctlr->slock);
-		poperror();
-		return 0;
-	}
-
-	if((p = malloc(READSTR)) == nil)
-		error(Enomem);
-
-	l = snprint(p, READSTR, "TxOk: %llud\n", dtcc->txok);
-	l += snprint(p+l, READSTR-l, "RxOk: %llud\n", dtcc->rxok);
-	l += snprint(p+l, READSTR-l, "TxEr: %llud\n", dtcc->txer);
-	l += snprint(p+l, READSTR-l, "RxEr: %ud\n", dtcc->rxer);
-	l += snprint(p+l, READSTR-l, "MissPkt: %ud\n", dtcc->misspkt);
-	l += snprint(p+l, READSTR-l, "FAE: %ud\n", dtcc->fae);
-	l += snprint(p+l, READSTR-l, "Tx1Col: %ud\n", dtcc->tx1col);
-	l += snprint(p+l, READSTR-l, "TxMCol: %ud\n", dtcc->txmcol);
-	l += snprint(p+l, READSTR-l, "RxOkPh: %llud\n", dtcc->rxokph);
-	l += snprint(p+l, READSTR-l, "RxOkBrd: %llud\n", dtcc->rxokbrd);
-	l += snprint(p+l, READSTR-l, "RxOkMu: %ud\n", dtcc->rxokmu);
-	l += snprint(p+l, READSTR-l, "TxAbt: %ud\n", dtcc->txabt);
-	l += snprint(p+l, READSTR-l, "TxUndrn: %ud\n", dtcc->txundrn);
-
-	l += snprint(p+l, READSTR-l, "txdu: %ud\n", ctlr->txdu);
-	l += snprint(p+l, READSTR-l, "tcpf: %ud\n", ctlr->tcpf);
-	l += snprint(p+l, READSTR-l, "udpf: %ud\n", ctlr->udpf);
-	l += snprint(p+l, READSTR-l, "ipf: %ud\n", ctlr->ipf);
-	l += snprint(p+l, READSTR-l, "fovf: %ud\n", ctlr->fovf);
-	l += snprint(p+l, READSTR-l, "ierrs: %ud\n", ctlr->ierrs);
-	l += snprint(p+l, READSTR-l, "rer: %ud\n", ctlr->rer);
-	l += snprint(p+l, READSTR-l, "rdu: %ud\n", ctlr->rdu);
-	l += snprint(p+l, READSTR-l, "punlc: %ud\n", ctlr->punlc);
-	l += snprint(p+l, READSTR-l, "fovw: %ud\n", ctlr->fovw);
-
-	l += snprint(p+l, READSTR-l, "tcr: %#8.8ux\n", ctlr->tcr);
-	l += snprint(p+l, READSTR-l, "rcr: %#8.8ux\n", ctlr->rcr);
-
-	if(ctlr->mii != nil && ctlr->mii->curphy != nil){
-		l += snprint(p+l, READSTR, "phy:   ");
-		for(i = 0; i < NMiiPhyr; i++){
-			if(i && ((i & 0x07) == 0))
-				l += snprint(p+l, READSTR-l, "\n       ");
-			r = miimir(ctlr->mii, i);
-			l += snprint(p+l, READSTR-l, " %4.4ux", r);
-		}
-		snprint(p+l, READSTR-l, "\n");
-	}
-
-	n = readstr(offset, a, n, p);
-
-	qunlock(&ctlr->slock);
-	poperror();
-	free(p);
-
-	return n;
-}
-#endif
-
-static void
-rtl8169halt(Ctlr* ctlr)
-{
-	csr8w(ctlr, Cr, 0);
-	csr16w(ctlr, Imr, 0);
-	csr16w(ctlr, Isr, ~0);
-}
-
-static int
-rtl8169reset(Ctlr* ctlr)
-{
-	u32int r;
-	int timeo;
-
-	/*
-	 * Soft reset the controller.
-	 */
-	csr8w(ctlr, Cr, Rst);
-	for(r = timeo = 0; timeo < 1000; timeo++){
-		r = csr8r(ctlr, Cr);
-		if(!(r & Rst))
-			break;
-		delay(1);
-	}
-	rtl8169halt(ctlr);
-
-	if(r & Rst)
-		return -1;
-	return 0;
-}
-
-static void
-rtl8169replenish(Ctlr* ctlr)
-{
-	D *d;
-	int rdt;
-	Block *bp;
-
-	rdt = ctlr->rdt;
-	while(NEXT(rdt, ctlr->nrd) != ctlr->rdh){
-		d = &ctlr->rd[rdt];
-		if(ctlr->rb[rdt] == nil){
-			/*
-			 * Simple allocation for now.
-			 * This better be aligned on 8.
-			 */
-			bp = iallocb(Mps);
-			if(bp == nil){
-				iprint("no available buffers\n");
-				break;
-			}
-			ctlr->rb[rdt] = bp;
-			d->addrlo = PCIWADDR(bp->rp);
-			d->addrhi = 0;
-		}
-		coherence();
-		d->control |= Own|Mps;
-		rdt = NEXT(rdt, ctlr->nrd);
-		ctlr->nrdfree++;
-	}
-	ctlr->rdt = rdt;
-}
-
-static int
-rtl8169init(Ether* edev)
-{
-	int i;
-	u32int r;
-	Block *bp;
-	Ctlr *ctlr;
-	u8int cplusc;
-
-	ctlr = edev->ctlr;
-	ilock(&ctlr->ilock);
-
-	rtl8169halt(ctlr);
-
-	/*
-	 * MAC Address.
-	 * Must put chip into config register write enable mode.
-	 */
-	csr8w(ctlr, Cr9346, Eem1|Eem0);
-	r = (edev->ea[3]<<24)|(edev->ea[2]<<16)|(edev->ea[1]<<8)|edev->ea[0];
-	csr32w(ctlr, Idr0, r);
-	r = (edev->ea[5]<<8)|edev->ea[4];
-	csr32w(ctlr, Idr0+4, r);
-
-	/*
-	 * Transmitter.
-	 */
-	memset(ctlr->td, 0, sizeof(D)*ctlr->ntd);
-	ctlr->tdh = ctlr->tdt = 0;
-	ctlr->td[ctlr->ntd-1].control = Eor;
-
-	/*
-	 * Receiver.
-	 * Need to do something here about the multicast filter.
-	 */
-	memset(ctlr->rd, 0, sizeof(D)*ctlr->nrd);
-	ctlr->nrdfree = ctlr->rdh = ctlr->rdt = 0;
-	ctlr->rd[ctlr->nrd-1].control = Eor;
-
-	for(i = 0; i < ctlr->nrd; i++){
-		if((bp = ctlr->rb[i]) != nil){
-			ctlr->rb[i] = nil;
-			freeb(bp);
-		}
-	}
-	rtl8169replenish(ctlr);
-	ctlr->rcr = Rxfthnone|Mrxdmaunlimited|Ab|Apm;
-
-	/*
-	 * Mtps is in units of 128 except for the RTL8169
-	 * where is is 32. If using jumbo frames should be
-	 * set to 0x3F.
-	 * Setting Mulrw in Cplusc disables the Tx/Rx DMA burst
-	 * settings in Tcr/Rcr; the (1<<14) is magic.
-	 */
-	ctlr->mtps = HOWMANY(Mps, 128);
-	cplusc = csr16r(ctlr, Cplusc) & ~(1<<14);
-	cplusc |= /*Rxchksum|*/Mulrw;
-	dprint("mac = %.2ux\n", ctlr->macv);
-	switch(ctlr->macv){
-	default:
-		print("bad mac %.2ux\n", ctlr->macv);
-		return -1;
-	case Macv01:
-		ctlr->mtps = HOWMANY(Mps, 32);
-		break;
-	case Macv02:
-	case Macv03:
-		cplusc |= (1<<14);			/* magic */
-		break;
-	case Macv05:
-		/*
-		 * This is interpreted from clearly bogus code
-		 * in the manufacturer-supplied driver, it could
-		 * be wrong. Untested.
-		 */
-		r = csr8r(ctlr, Config2) & 0x07;
-		if(r == 0x01)				/* 66MHz PCI */
-			csr32w(ctlr, 0x7C, 0x0007FFFF);	/* magic */
-		else
-			csr32w(ctlr, 0x7C, 0x0007FF00);	/* magic */
-		pciclrmwi(ctlr->pcidev);
-		break;
-	case Macv13:
-		/*
-		 * This is interpreted from clearly bogus code
-		 * in the manufacturer-supplied driver, it could
-		 * be wrong. Untested.
-		 */
-		pcicfgw8(ctlr->pcidev, 0x68, 0x00);	/* magic */
-		pcicfgw8(ctlr->pcidev, 0x69, 0x08);	/* magic */
-		break;
-	case Macv04:
-	case Macv11:
-	case Macv12:
-	case Macv14:
-	case Macv15:
-		break;
-	}
-
-	/*
-	 * Enable receiver/transmitter.
-	 * Need to do this first or some of the settings below
-	 * won't take.
-	 */
-	switch(ctlr->pciv){
-	default:
-		csr8w(ctlr, Cr, Te|Re);
-		csr32w(ctlr, Tcr, Ifg1|Ifg0|Mtxdmaunlimited);
-		csr32w(ctlr, Rcr, ctlr->rcr);
-	case Rtl8169sc:
-	case Rtl8168b:
-		break;
-	}
-
-	/*
-	 * Interrupts.
-	 * Disable Tdu|Tok for now, the transmit routine will tidy.
-	 * Tdu means the NIC ran out of descriptors to send, so it
-	 * doesn't really need to ever be on.
-	 */
-	csr32w(ctlr, Timerint, 0);
-	ctlr->imr = Serr|Timeout|Fovw|Punlc|Rdu|Ter|Rer|Rok;
-	csr16w(ctlr, Imr, ctlr->imr);
-
-	/*
-	 * Clear missed-packet counter;
-	 * initial early transmit threshold value;
-	 * set the descriptor ring base addresses;
-	 * set the maximum receive packet size;
-	 * no early-receive interrupts.
-	 */
-	csr32w(ctlr, Mpc, 0);
-	csr8w(ctlr, Mtps, ctlr->mtps);
-	csr32w(ctlr, Tnpds+4, 0);
-	csr32w(ctlr, Tnpds, PCIWADDR(ctlr->td));
-	csr32w(ctlr, Rdsar+4, 0);
-	csr32w(ctlr, Rdsar, PCIWADDR(ctlr->rd));
-	csr16w(ctlr, Rms, Mps);
-	r = csr16r(ctlr, Mulint) & 0xF000;
-	csr16w(ctlr, Mulint, r);
-	csr16w(ctlr, Cplusc, cplusc);
-
-	/*
-	 * Set configuration.
-	 */
-	switch(ctlr->pciv){
-	default:
-		break;
-	case Rtl8169sc:
-		csr16w(ctlr, 0xE2, 0);			/* magic */
-		csr8w(ctlr, Cr, Te|Re);
-		csr32w(ctlr, Tcr, Ifg1|Ifg0|Mtxdmaunlimited);
-		csr32w(ctlr, Rcr, ctlr->rcr);
-		break;
-	case Rtl8168b:
-	case Rtl8169c:
-		csr16w(ctlr, 0xE2, 0);			/* magic */
-		csr16w(ctlr, Cplusc, 0x2000);		/* magic */
-		csr8w(ctlr, Cr, Te|Re);
-		csr32w(ctlr, Tcr, Ifg1|Ifg0|Mtxdmaunlimited);
-		csr32w(ctlr, Rcr, ctlr->rcr);
-		csr16w(ctlr, Rms, 0x0800);
-		csr8w(ctlr, Mtps, 0x3F);
-		break;
-	}
-	ctlr->tcr = csr32r(ctlr, Tcr);
-	csr8w(ctlr, Cr9346, 0);
-
-	iunlock(&ctlr->ilock);
-
-//	rtl8169mii(ctlr);
-
-	return 0;
-}
-
-static void
-rtl8169attach(Ether* edev)
-{
-	int timeo;
-	Ctlr *ctlr;
-
-	ctlr = edev->ctlr;
-	qlock(&ctlr->alock);
-	if(ctlr->init == 0){
-		/*
-		 * Handle allocation/init errors here.
-		 */
-		ctlr->td = mallocalign(sizeof(D)*Ntd, 256, 0, 0);
-		ctlr->tb = malloc(Ntd*sizeof(Block*));
-		ctlr->ntd = Ntd;
-		ctlr->rd = mallocalign(sizeof(D)*Nrd, 256, 0, 0);
-		ctlr->rb = malloc(Nrd*sizeof(Block*));
-		ctlr->nrd = Nrd;
-		ctlr->dtcc = mallocalign(sizeof(Dtcc), 64, 0, 0);
-		rtl8169init(edev);
-		ctlr->init = 1;
-	}
-	qunlock(&ctlr->alock);
-
-	/*
-	 * Wait for link to be ready.
-	 */
-	for(timeo = 0; timeo < 3500; timeo++){
-		if(miistatus(ctlr->mii) == 0)
-			break;
-		delay(10);
-	}
-}
-
-static void
-rtl8169link(Ether* edev)
-{
-	uint r;
-	Ctlr *ctlr;
-
-	ctlr = edev->ctlr;
-
-	/*
-	 * Maybe the link changed - do we care very much?
-	 * Could stall transmits if no link, maybe?
-	 */
-	if(!((r = csr8r(ctlr, Phystatus)) & Linksts))
-		return;
-
-	if(r & Speed10)
-		edev->mbps = 10;
-	else if(r & Speed100)
-		edev->mbps = 100;
-	else if(r & Speed1000)
-		edev->mbps = 1000;
-}
-
-static void
-rtl8169transmit(Ether* edev)
-{
-	D *d;
-	Block *bp;
-	Ctlr *ctlr;
-	int control, x;
-
-	ctlr = edev->ctlr;
-
-	ilock(&ctlr->tlock);
-	for(x = ctlr->tdh; ctlr->ntq > 0; x = NEXT(x, ctlr->ntd)){
-		d = &ctlr->td[x];
-		if((control = d->control) & Own)
-			break;
-
-		/*
-		 * Check errors and log here.
-		 */
-		USED(control);
-
-		/*
-		 * Free it up.
-		 * Need to clean the descriptor here? Not really.
-		 * Simple freeb for now (no chain and freeblist).
-		 * Use ntq count for now.
-		 */
-		freeb(ctlr->tb[x]);
-		ctlr->tb[x] = nil;
-		d->control &= Eor;
-
-		ctlr->ntq--;
-	}
-	ctlr->tdh = x;
-
-	x = ctlr->tdt;
-	while(ctlr->ntq < (ctlr->ntd-1)){
-		if((bp = etheroq(edev)) == nil)
-			break;
-
-		d = &ctlr->td[x];
-		d->addrlo = PCIWADDR(bp->rp);
-		d->addrhi = 0;
-		ctlr->tb[x] = bp;
-		coherence();
-		d->control |= Own|Fs|Ls|((BLEN(bp)<<TxflSHIFT) & TxflMASK);
-
-		x = NEXT(x, ctlr->ntd);
-		ctlr->ntq++;
-	}
-	if(x != ctlr->tdt){
-		ctlr->tdt = x;
-		csr8w(ctlr, Tppoll, Npq);
-	}
-	else if(ctlr->ntq >= (ctlr->ntd-1))
-		ctlr->txdu++;
-
-	iunlock(&ctlr->tlock);
-}
-
-static void
-rtl8169receive(Ether* edev)
-{
-	D *d;
-	int rdh;
-	Block *bp;
-	Ctlr *ctlr;
-	u32int control;
-
-	ctlr = edev->ctlr;
-
-	rdh = ctlr->rdh;
-	for(;;){
-		d = &ctlr->rd[rdh];
-	
-		if(d->control & Own)
-			break;
-
-		control = d->control;
-		if((control & (Fs|Ls|Res)) == (Fs|Ls)){
-			bp = ctlr->rb[rdh];
-			ctlr->rb[rdh] = nil;
-			SETWPCNT(bp, ((control & RxflMASK)>>RxflSHIFT)-4);
-			bp->next = nil;
-
-#ifndef FS
-			if(control & Fovf)
-				ctlr->fovf++;
-#endif
-
-			switch(control & (Pid1|Pid0)){
-			default:
-				break;
-			case Pid0:
-				if(control & Tcpf){
-					ctlr->tcpf++;
-					break;
-				}
-#ifndef FS
-				bp->flag |= Btcpck;
-#endif
-				break;
-			case Pid1:
-				if(control & Udpf){
-					ctlr->udpf++;
-					break;
-				}
-#ifndef FS
-				bp->flag |= Budpck;
-#endif
-				break;
-			case Pid1|Pid0:
-				if(control & Ipf){
-					ctlr->ipf++;
-					break;
-				}
-#ifndef FS
-				bp->flag |= Bipck;
-#endif
-				break;
-			}
-			ETHERIQ(edev, bp, 1);
-		}
-		else{
-			/*
-			 * Error stuff here.
-			print("control %#8.8ux\n", control);
-			 */
-		}
-		d->control &= Eor;
-		ctlr->nrdfree--;
-		rdh = NEXT(rdh, ctlr->nrd);
-
-		if(ctlr->nrdfree < ctlr->nrd/2)
-			rtl8169replenish(ctlr);
-	}
-	ctlr->rdh = rdh;
-}
-
-static void
-rtl8169interrupt(Ureg*, void* arg)
-{
-	Ctlr *ctlr;
-	Ether *edev;
-	u32int isr;
-
-	edev = arg;
-	ctlr = edev->ctlr;
-
-	while((isr = csr16r(ctlr, Isr)) != 0 && isr != 0xFFFF){
-		csr16w(ctlr, Isr, isr);
-		if((isr & ctlr->imr) == 0)
-			break;
-		if(isr & (Fovw|Punlc|Rdu|Rer|Rok)){
-			rtl8169receive(edev);
-			if(!(isr & (Punlc|Rok)))
-				ctlr->ierrs++;
-			if(isr & Rer)
-				ctlr->rer++;
-			if(isr & Rdu)
-				ctlr->rdu++;
-			if(isr & Punlc)
-				ctlr->punlc++;
-			if(isr & Fovw)
-				ctlr->fovw++;
-			isr &= ~(Fovw|Rdu|Rer|Rok);
-		}
-
-		if(isr & (Tdu|Ter|Tok)){
-			rtl8169transmit(edev);
-			isr &= ~(Tdu|Ter|Tok);
-		}
-
-		if(isr & Punlc){
-			rtl8169link(edev);
-			isr &= ~Punlc;
-		}
-
-		/*
-		 * Some of the reserved bits get set sometimes...
-		 */
-		if(isr & (Serr|Timeout|Tdu|Fovw|Punlc|Rdu|Ter|Tok|Rer|Rok))
-			panic("rtl8169interrupt: imr %#4.4ux isr %#4.4ux\n",
-				csr16r(ctlr, Imr), isr);
-	}
-}
-
-static void
-rtl8169pci(void)
-{
-	Pcidev *p;
-	Ctlr *ctlr;
-	int i, port;
-
-	p = nil;
-	while(p = pcimatch(p, 0, 0)){
-#ifdef FS
-		if(p->ccru != ((0x02<<8)|0x00))
-#else
-		if(p->ccrb != 0x02 || p->ccru != 0)
-#endif
-			continue;
-
-		dprint("  pci: found  vid %ux did %ux\n", p->vid, p->did);
-		switch(i = ((p->did<<16)|p->vid)){
-		default:
-			continue;
-		case Rtl8100e:			/* RTL810[01]E ? */
-		case Rtl8169c:			/* RTL8169C */
-		case Rtl8169sc:			/* RTL8169SC */
-		case Rtl8168b:			/* RTL8168B */
-		case Rtl8169:			/* RTL8169 */
-			break;
-		case (0xC107<<16)|0x1259:	/* Corega CG-LAPCIGT */
-			i = Rtl8169;
-			break;
-		}
-
-		port = p->mem[0].bar & ~0x01;
-		if(ioalloc(port, p->mem[0].size, 0, "rtl8169") < 0){
-			print("rtl8169: port %#ux in use\n", port);
-			continue;
-		}
-
-		ctlr = malloc(sizeof(Ctlr));
-		ctlr->port = port;
-		ctlr->pcidev = p;
-		ctlr->pciv = i;
-
-#ifndef FS
-		if(pcigetpms(p) > 0){
-			pcisetpms(p, 0);
-	
-			for(i = 0; i < 6; i++)
-				pcicfgw32(p, PciBAR0+i*4, p->mem[i].bar);
-			pcicfgw8(p, PciINTL, p->intl);
-			pcicfgw8(p, PciLTR, p->ltr);
-			pcicfgw8(p, PciCLS, p->cls);
-			pcicfgw16(p, PciPCR, p->pcr);
-		}
-#endif
-
-		if(rtl8169reset(ctlr)){
-			iofree(port);
-			free(ctlr);
-			continue;
-		}
-
-		/*
-		 * Extract the chip hardware version,
-		 * needed to configure each properly.
-		 */
-		ctlr->macv = csr32r(ctlr, Tcr) & HwveridMASK;
-
-		rtl8169mii(ctlr);
-
-		pcisetbme(p);
-
-		if(rtl8169ctlrhead != nil)
-			rtl8169ctlrtail->next = ctlr;
-		else
-			rtl8169ctlrhead = ctlr;
-		rtl8169ctlrtail = ctlr;
-	}
-}
-
-int
-rtl8169pnp(Ether* edev)
-{
-	u32int r;
-	Ctlr *ctlr;
-	uchar ea[Eaddrlen];
-
-	if(rtl8169ctlrhead == nil)
-		rtl8169pci();
-
-	/*
-	 * Any adapter matches if no edev->port is supplied,
-	 * otherwise the ports must match.
-	 */
-	for(ctlr = rtl8169ctlrhead; ctlr != nil; ctlr = ctlr->next){
-		if(ctlr->active)
-			continue;
-		if(edev->port == 0 || edev->port == ctlr->port){
-			ctlr->active = 1;
-			break;
-		}
-	}
-	if(ctlr == nil)
-		return -1;
-
-	edev->ctlr = ctlr;
-	edev->port = ctlr->port;
-	edev->irq = ctlr->pcidev->intl;
-	edev->tbdf = ctlr->pcidev->tbdf;
-	edev->mbps = 100;
-
-	/*
-	 * Check if the adapter's station address is to be overridden.
-	 * If not, read it from the device and set in edev->ea.
-	 */
-	memset(ea, 0, Eaddrlen);
-	if(memcmp(ea, edev->ea, Eaddrlen) == 0){
-		r = csr32r(ctlr, Idr0);
-		edev->ea[0] = r;
-		edev->ea[1] = r>>8;
-		edev->ea[2] = r>>16;
-		edev->ea[3] = r>>24;
-		r = csr32r(ctlr, Idr0+4);
-		edev->ea[4] = r;
-		edev->ea[5] = r>>8;
-	}
-
-	edev->attach = rtl8169attach;
-	edev->transmit = rtl8169transmit;
-	edev->interrupt = rtl8169interrupt;
-#ifndef FS
-	edev->ifstat = rtl8169ifstat;
-
-	edev->arg = edev;
-	edev->promiscuous = rtl8169promiscuous;
-#endif
-	rtl8169link(edev);
-
-	return 0;
-}
-
-void
-ether8169link(void)
-{
-	addethercard("rtl8169", rtl8169pnp);
-}

+ 0 - 1363
sys/src/fs/pc/ether82557.c

@@ -1,1363 +0,0 @@
-/*
- * Intel 82557 Fast Ethernet PCI Bus LAN Controller
- * as found on the Intel EtherExpress PRO/100B. This chip is full
- * of smarts, unfortunately they're not all in the right place.
- * To do:
- *	the PCI scanning code could be made common to other adapters;
- *	auto-negotiation, full-duplex;
- *	optionally use memory-mapped registers;
- *	detach for PCI reset problems (also towards loadable drivers).
- */
-#ifdef FS
-#include "all.h"
-#include "io.h"
-#include "mem.h"
-#include "../ip/ip.h"
-
-#else
-
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "io.h"
-#include "../port/error.h"
-#include "../port/netif.h"
-#endif			/* FS */
-
-#include "etherif.h"
-#include "ethermii.h"
-#include "compat.h"
-
-enum {
-	Nrfd		= 64,		/* receive frame area */
-	Ncb		= 64,		/* maximum control blocks queued */
-
-	NullPointer	= 0xFFFFFFFF,	/* 82557 NULL pointer */
-};
-
-enum {					/* CSR */
-	Status		= 0x00,		/* byte or word (word includes Ack) */
-	Ack		= 0x01,		/* byte */
-	CommandR	= 0x02,		/* byte or word (word includes Interrupt) */
-	Interrupt	= 0x03,		/* byte */
-	General		= 0x04,		/* dword */
-	Port		= 0x08,		/* dword */
-	Fcr		= 0x0C,		/* Flash control register */
-	Ecr		= 0x0E,		/* EEPROM control register */
-	Mcr		= 0x10,		/* MDI control register */
-	Gstatus		= 0x1D,		/* General status register */
-};
-
-enum {					/* Status */
-	RUidle		= 0x0000,
-	RUsuspended	= 0x0004,
-	RUnoresources	= 0x0008,
-	RUready		= 0x0010,
-	RUrbd		= 0x0020,	/* bit */
-	RUstatus	= 0x003F,	/* mask */
-
-	CUidle		= 0x0000,
-	CUsuspended	= 0x0040,
-	CUactive	= 0x0080,
-	CUstatus	= 0x00C0,	/* mask */
-
-	StatSWI		= 0x0400,	/* SoftWare generated Interrupt */
-	StatMDI		= 0x0800,	/* MDI r/w done */
-	StatRNR		= 0x1000,	/* Receive unit Not Ready */
-	StatCNA		= 0x2000,	/* Command unit Not Active (Active->Idle) */
-	StatFR		= 0x4000,	/* Finished Receiving */
-	StatCX		= 0x8000,	/* Command eXecuted */
-	StatTNO		= 0x8000,	/* Transmit NOT OK */
-};
-
-enum {					/* Command (byte) */
-	CUnop		= 0x00,
-	CUstart		= 0x10,
-	CUresume	= 0x20,
-	LoadDCA		= 0x40,		/* Load Dump Counters Address */
-	DumpSC		= 0x50,		/* Dump Statistical Counters */
-	LoadCUB		= 0x60,		/* Load CU Base */
-	ResetSA		= 0x70,		/* Dump and Reset Statistical Counters */
-
-	RUstart		= 0x01,
-	RUresume	= 0x02,
-	RUabort		= 0x04,
-	LoadHDS		= 0x05,		/* Load Header Data Size */
-	LoadRUB		= 0x06,		/* Load RU Base */
-	RBDresume	= 0x07,		/* Resume frame reception */
-};
-
-enum {					/* Interrupt (byte) */
-	InterruptM	= 0x01,		/* interrupt Mask */
-	InterruptSI	= 0x02,		/* Software generated Interrupt */
-};
-
-enum {					/* Ecr */
-	EEsk		= 0x01,		/* serial clock */
-	EEcs		= 0x02,		/* chip select */
-	EEdi		= 0x04,		/* serial data in */
-	EEdo		= 0x08,		/* serial data out */
-
-	EEstart		= 0x04,		/* start bit */
-	EEread		= 0x02,		/* read opcode */
-};
-
-enum {					/* Mcr */
-	MDIread		= 0x08000000,	/* read opcode */
-	MDIwrite	= 0x04000000,	/* write opcode */
-	MDIready	= 0x10000000,	/* ready bit */
-	MDIie		= 0x20000000,	/* interrupt enable */
-};
-
-typedef struct Rfd {
-	int	field;
-	ulong	link;
-	ulong	rbd;
-	ushort	count;
-	ushort	size;
-
-	uchar	data[1700];
-} Rfd;
-
-enum {					/* field */
-	RfdCollision	= 0x00000001,
-	RfdIA		= 0x00000002,	/* IA match */
-	RfdRxerr	= 0x00000010,	/* PHY character error */
-	RfdType		= 0x00000020,	/* Type frame */
-	RfdRunt		= 0x00000080,
-	RfdOverrun	= 0x00000100,
-	RfdBuffer	= 0x00000200,
-	RfdAlignment	= 0x00000400,
-	RfdCRC		= 0x00000800,
-
-	RfdOK		= 0x00002000,	/* frame received OK */
-	RfdC		= 0x00008000,	/* reception Complete */
-	RfdSF		= 0x00080000,	/* Simplified or Flexible (1) Rfd */
-	RfdH		= 0x00100000,	/* Header RFD */
-
-	RfdI		= 0x20000000,	/* Interrupt after completion */
-	RfdS		= 0x40000000,	/* Suspend after completion */
-	RfdEL		= 0x80000000,	/* End of List */
-};
-
-enum {					/* count */
-	RfdF		= 0x4000,
-	RfdEOF		= 0x8000,
-};
-
-typedef struct Cb Cb;
-typedef struct Cb {
-	ushort	status;
-	ushort	command;
-	ulong	link;
-	union {
-		uchar	data[24];	/* CbIAS + CbConfigure */
-		struct {
-			ulong	tbd;
-			ushort	count;
-			uchar	threshold;
-			uchar	number;
-
-			ulong	tba;
-			ushort	tbasz;
-			ushort	pad;
-		};
-	};
-
-	Block*	bp;
-	Cb*	next;
-} Cb;
-
-enum {					/* action command */
-	CbU		= 0x1000,	/* transmit underrun */
-	CbOK		= 0x2000,	/* DMA completed OK */
-	CbC		= 0x8000,	/* execution Complete */
-
-	CbNOP		= 0x0000,
-	CbIAS		= 0x0001,	/* Individual Address Setup */
-	CbConfigure	= 0x0002,
-	CbMAS		= 0x0003,	/* Multicast Address Setup */
-	CbTransmit	= 0x0004,
-	CbDump		= 0x0006,
-	CbDiagnose	= 0x0007,
-	CbCommand	= 0x0007,	/* mask */
-
-	CbSF		= 0x0008,	/* Flexible-mode CbTransmit */
-
-	CbI		= 0x2000,	/* Interrupt after completion */
-	CbS		= 0x4000,	/* Suspend after completion */
-	CbEL		= 0x8000,	/* End of List */
-};
-
-enum {					/* CbTransmit count */
-	CbEOF		= 0x8000,
-};
-
-typedef struct Ctlr Ctlr;
-typedef struct Ctlr {
-	Lock	slock;			/* attach */
-	int	state;
-
-	int	port;
-	Pcidev*	pcidev;
-	Ctlr*	next;
-	int	active;
-
-	int	eepromsz;		/* address size in bits */
-	ushort*	eeprom;
-
-	Lock	miilock;
-
-	int	tick;
-
-	Lock	rlock;			/* registers */
-	int	command;		/* last command issued */
-
-	Block*	rfdhead;		/* receive side */
-	Block*	rfdtail;
-	int	nrfd;
-
-	Lock	cblock;			/* transmit side */
-	int	action;
-	int	nop;
-	uchar	configdata[24];
-	int	threshold;
-	int	ncb;
-	Cb*	cbr;
-	Cb*	cbhead;
-	Cb*	cbtail;
-	int	cbq;
-	int	cbqmax;
-	int	cbqmaxhw;
-
-	Rendez	timer;			/* for watchdog */
-
-	Lock	dlock;			/* dump statistical counters */
-	ulong	dump[17];
-} Ctlr;
-
-static Ctlr* ctlrhead;
-static Ctlr* ctlrtail;
-
-static uchar configdata[24] = {
-	0x16,				/* byte count */
-	0x08,				/* Rx/Tx FIFO limit */
-	0x00,				/* adaptive IFS */
-	0x00,	
-	0x00,				/* Rx DMA maximum byte count */
-//	0x80,				/* Tx DMA maximum byte count */
-	0x00,				/* Tx DMA maximum byte count */
-	0x32,				/* !late SCB, CNA interrupts */
-	0x03,				/* discard short Rx frames */
-	0x00,				/* 503/MII */
-
-	0x00,	
-	0x2E,				/* normal operation, NSAI */
-	0x00,				/* linear priority */
-	0x60,				/* inter-frame spacing */
-	0x00,	
-	0xF2,	
-	0xC8,				/* 503, promiscuous mode off */
-	0x00,	
-	0x40,	
-	0xF3,				/* transmit padding enable */
-	0x80,				/* full duplex pin enable */
-	0x3F,				/* no Multi IA */
-	0x05,				/* no Multi Cast ALL */
-};
-
-#define csr8r(c, r)	(inb((c)->port+(r)))
-#define csr16r(c, r)	(ins((c)->port+(r)))
-#define csr32r(c, r)	(inl((c)->port+(r)))
-#define csr8w(c, r, b)	(outb((c)->port+(r), (int)(b)))
-#define csr16w(c, r, w)	(outs((c)->port+(r), (ushort)(w)))
-#define csr32w(c, r, l)	(outl((c)->port+(r), (ulong)(l)))
-
-static void
-command(Ctlr* ctlr, int c, int v)
-{
-	int timeo;
-
-	ilock(&ctlr->rlock);
-
-	/*
-	 * Only back-to-back CUresume can be done
-	 * without waiting for any previous command to complete.
-	 * This should be the common case.
-	 * Unfortunately there's a chip errata where back-to-back
-	 * CUresumes can be lost, the fix is to always wait.
-	if(c == CUresume && ctlr->command == CUresume){
-		csr8w(ctlr, CommandR, c);
-		iunlock(&ctlr->rlock);
-		return;
-	}
-	 */
-
-	for(timeo = 0; timeo < 100; timeo++){
-		if(!csr8r(ctlr, CommandR))
-			break;
-		microdelay(1);
-	}
-	if(timeo >= 100){
-		ctlr->command = -1;
-		iunlock(&ctlr->rlock);
-		iprint("i82557: command %#ux %#ux timeout\n", c, v);
-		return;
-	}
-
-	switch(c){
-
-	case CUstart:
-	case LoadDCA:
-	case LoadCUB:
-	case RUstart:
-	case LoadHDS:
-	case LoadRUB:
-		csr32w(ctlr, General, v);
-		break;
-
-	/*
-	case CUnop:
-	case CUresume:
-	case DumpSC:
-	case ResetSA:
-	case RUresume:
-	case RUabort:
-	 */
-	default:
-		break;
-	}
-	csr8w(ctlr, CommandR, c);
-	ctlr->command = c;
-
-	iunlock(&ctlr->rlock);
-}
-
-static Block*
-rfdalloc(ulong link)
-{
-	Block *bp;
-	Rfd *rfd;
-
-	if(bp = iallocb(sizeof(Rfd))){
-		rfd = (Rfd*)bp->rp;
-		rfd->field = 0;
-		rfd->link = link;
-		rfd->rbd = NullPointer;
-		rfd->count = 0;
-		rfd->size = sizeof(Etherpkt);
-	}
-
-	return bp;
-}
-
-#ifdef FS
-static int
-return0(void*)
-{
-	return 0;
-}
-#endif
-
-static void
-watchdog(PROCARG(void* arg))
-{
-	Ether *ether;
-	Ctlr *ctlr;
-	static void txstart(Ether*);
-	static Rendez timer;		/* for FS */
-
-	ether = GETARG(arg);
-	for(;;){
-		tsleep(&timer, return0, 0, 4000);
-
-		/*
-		 * Hmmm. This doesn't seem right. Currently
-		 * the device can't be disabled but it may be in
-		 * the future.
-		 */
-		ctlr = ether->ctlr;
-		if(ctlr == nil || ctlr->state == 0){
-#ifdef FS
-			print("i82557: watchdog: exiting\n");
-			for (;;)
-				tsleep(&timer, return0, 0, 10000);
-#else
-			print("%s: exiting\n", up->text);
-			pexit("disabled", 0);
-#endif
-		}
-
-		ilock(&ctlr->cblock);
-		if(ctlr->tick++){
-			ctlr->action = CbMAS;
-			txstart(ether);
-		}
-		iunlock(&ctlr->cblock);
-	}
-}
-
-static void
-attach(Ether* ether)
-{
-	Ctlr *ctlr;
-	char name[KNAMELEN];
-
-	ctlr = ether->ctlr;
-	lock(&ctlr->slock);
-	if(ctlr->state == 0){
-		ilock(&ctlr->rlock);
-		csr8w(ctlr, Interrupt, 0);
-		iunlock(&ctlr->rlock);
-		command(ctlr, RUstart, PADDR(ctlr->rfdhead->rp));
-		ctlr->state = 1;
-
-		/*
-		 * Start the watchdog timer for the receive lockup errata
-		 * unless the EEPROM compatibility word indicates it may be
-		 * omitted.
-		 */
-		if((ctlr->eeprom[0x03] & 0x0003) != 0x0003){
-			snprint(name, KNAMELEN, "#l%dwatchdog", ether->ctlrno);
-			kproc(name, watchdog, ether);
-		}
-	}
-	unlock(&ctlr->slock);
-}
-
-#ifndef FS
-static long
-ifstat(Ether* ether, void* a, long n, ulong offset)
-{
-	char *p;
-	int i, len, phyaddr;
-	Ctlr *ctlr;
-	ulong dump[17];
-
-	ctlr = ether->ctlr;
-	lock(&ctlr->dlock);
-
-	/*
-	 * Start the command then
-	 * wait for completion status,
-	 * should be 0xA005.
-	 */
-	ctlr->dump[16] = 0;
-	command(ctlr, DumpSC, 0);
-	while(ctlr->dump[16] == 0)
-		;
-
-	ether->oerrs = ctlr->dump[1]+ctlr->dump[2]+ctlr->dump[3];
-	ether->crcs = ctlr->dump[10];
-	ether->frames = ctlr->dump[11];
-	ether->buffs = ctlr->dump[12]+ctlr->dump[15];
-	ether->overflows = ctlr->dump[13];
-
-	if(n == 0){
-		unlock(&ctlr->dlock);
-		return 0;
-	}
-
-	memmove(dump, ctlr->dump, sizeof(dump));
-	unlock(&ctlr->dlock);
-
-	p = malloc(READSTR);
-	len = snprint(p, READSTR, "transmit good frames: %lud\n", dump[0]);
-	len += snprint(p+len, READSTR-len, "transmit maximum collisions errors: %lud\n", dump[1]);
-	len += snprint(p+len, READSTR-len, "transmit late collisions errors: %lud\n", dump[2]);
-	len += snprint(p+len, READSTR-len, "transmit underrun errors: %lud\n", dump[3]);
-	len += snprint(p+len, READSTR-len, "transmit lost carrier sense: %lud\n", dump[4]);
-	len += snprint(p+len, READSTR-len, "transmit deferred: %lud\n", dump[5]);
-	len += snprint(p+len, READSTR-len, "transmit single collisions: %lud\n", dump[6]);
-	len += snprint(p+len, READSTR-len, "transmit multiple collisions: %lud\n", dump[7]);
-	len += snprint(p+len, READSTR-len, "transmit total collisions: %lud\n", dump[8]);
-	len += snprint(p+len, READSTR-len, "receive good frames: %lud\n", dump[9]);
-	len += snprint(p+len, READSTR-len, "receive CRC errors: %lud\n", dump[10]);
-	len += snprint(p+len, READSTR-len, "receive alignment errors: %lud\n", dump[11]);
-	len += snprint(p+len, READSTR-len, "receive resource errors: %lud\n", dump[12]);
-	len += snprint(p+len, READSTR-len, "receive overrun errors: %lud\n", dump[13]);
-	len += snprint(p+len, READSTR-len, "receive collision detect errors: %lud\n", dump[14]);
-	len += snprint(p+len, READSTR-len, "receive short frame errors: %lud\n", dump[15]);
-	len += snprint(p+len, READSTR-len, "nop: %d\n", ctlr->nop);
-	if(ctlr->cbqmax > ctlr->cbqmaxhw)
-		ctlr->cbqmaxhw = ctlr->cbqmax;
-	len += snprint(p+len, READSTR-len, "cbqmax: %d\n", ctlr->cbqmax);
-	ctlr->cbqmax = 0;
-	len += snprint(p+len, READSTR-len, "threshold: %d\n", ctlr->threshold);
-
-	len += snprint(p+len, READSTR-len, "eeprom:");
-	for(i = 0; i < (1<<ctlr->eepromsz); i++){
-		if(i && ((i & 0x07) == 0))
-			len += snprint(p+len, READSTR-len, "\n       ");
-		len += snprint(p+len, READSTR-len, " %4.4ux", ctlr->eeprom[i]);
-	}
-
-	if((ctlr->eeprom[6] & 0x1F00) && !(ctlr->eeprom[6] & 0x8000)){
-		phyaddr = ctlr->eeprom[6] & 0x00FF;
-		len += snprint(p+len, READSTR-len, "\nphy %2d:", phyaddr);
-		for(i = 0; i < 6; i++){
-			static int miir(Ctlr*, int, int);
-
-			len += snprint(p+len, READSTR-len, " %4.4ux",
-				miir(ctlr, phyaddr, i));
-		}
-	}
-
-	snprint(p+len, READSTR-len, "\n");
-	n = readstr(offset, a, n, p);
-	free(p);
-
-	return n;
-}
-#endif
-
-static void
-txstart(Ether* ether)
-{
-	Ctlr *ctlr;
-	Block *bp;
-	Cb *cb;
-
-	ctlr = ether->ctlr;
-	while(ctlr->cbq < (ctlr->ncb-1)){
-		cb = ctlr->cbhead->next;
-		if(ctlr->action == 0){
-			bp = etheroq(ether);
-			if(bp == nil)
-				break;
-
-			cb->command = CbS|CbSF|CbTransmit;
-			cb->tbd = PADDR(&cb->tba);
-			cb->count = 0;
-			cb->threshold = ctlr->threshold;
-			cb->number = 1;
-			cb->tba = PADDR(bp->rp);
-			cb->bp = bp;
-			cb->tbasz = BLEN(bp);
-		}
-		else if(ctlr->action == CbConfigure){
-			cb->command = CbS|CbConfigure;
-			memmove(cb->data, ctlr->configdata, sizeof(ctlr->configdata));
-			ctlr->action = 0;
-		}
-		else if(ctlr->action == CbIAS){
-			cb->command = CbS|CbIAS;
-			memmove(cb->data, ether->ea, Eaddrlen);
-			ctlr->action = 0;
-		}
-		else if(ctlr->action == CbMAS){
-			cb->command = CbS|CbMAS;
-			memset(cb->data, 0, sizeof(cb->data));
-			ctlr->action = 0;
-		}
-		else{
-			print("#l%d: action %#ux\n", ether->ctlrno, ctlr->action);
-			ctlr->action = 0;
-			break;
-		}
-		cb->status = 0;
-
-		coherence();
-		ctlr->cbhead->command &= ~CbS;
-		ctlr->cbhead = cb;
-		ctlr->cbq++;
-	}
-
-	/*
-	 * Workaround for some broken HUB chips
-	 * when connected at 10Mb/s half-duplex.
-	 */
-	if(ctlr->nop){
-		command(ctlr, CUnop, 0);
-		microdelay(1);
-	}
-	command(ctlr, CUresume, 0);
-
-	if(ctlr->cbq > ctlr->cbqmax)
-		ctlr->cbqmax = ctlr->cbq;
-}
-
-static void
-configure(Ether* ether, int promiscuous)
-{
-	Ctlr *ctlr;
-
-	ctlr = ether->ctlr;
-	ilock(&ctlr->cblock);
-	if(promiscuous){
-		ctlr->configdata[6] |= 0x80;		/* Save Bad Frames */
-		//ctlr->configdata[6] &= ~0x40;		/* !Discard Overrun Rx Frames */
-		ctlr->configdata[7] &= ~0x01;		/* !Discard Short Rx Frames */
-		ctlr->configdata[15] |= 0x01;		/* Promiscuous mode */
-		ctlr->configdata[18] &= ~0x01;		/* (!Padding enable?), !stripping enable */
-		ctlr->configdata[21] |= 0x08;		/* Multi Cast ALL */
-	}
-	else{
-		ctlr->configdata[6] &= ~0x80;
-		//ctlr->configdata[6] |= 0x40;
-		ctlr->configdata[7] |= 0x01;
-		ctlr->configdata[15] &= ~0x01;
-		ctlr->configdata[18] |= 0x01;		/* 0x03? */
-		ctlr->configdata[21] &= ~0x08;
-	}
-	ctlr->action = CbConfigure;
-	txstart(ether);
-	iunlock(&ctlr->cblock);
-}
-
-static void
-promiscuous(void* arg, int on)
-{
-	configure(arg, on);
-}
-
-static void
-multicast(void* arg, uchar *addr, int on)
-{
-	USED(addr, on);
-	configure(arg, 1);
-}
-
-static void
-transmit(Ether* ether)
-{
-	Ctlr *ctlr;
-
-	ctlr = ether->ctlr;
-	ilock(&ctlr->cblock);
-	txstart(ether);
-	iunlock(&ctlr->cblock);
-}
-
-static void
-receive(Ether* ether)
-{
-	Rfd *rfd;
-	Ctlr *ctlr;
-	int count;
-	Block *bp, *pbp, *xbp;
-
-	ctlr = ether->ctlr;
-	bp = ctlr->rfdhead;
-	for(rfd = (Rfd*)bp->rp; rfd->field & RfdC; rfd = (Rfd*)bp->rp){
-		/*
-		 * If it's an OK receive frame
-		 * 1) save the count 
-		 * 2) if it's small, try to allocate a block and copy
-		 *    the data, then adjust the necessary fields for reuse;
-		 * 3) if it's big, try to allocate a new Rfd and if
-		 *    successful
-		 *	adjust the received buffer pointers for the
-		 *	  actual data received;
-		 *	initialise the replacement buffer to point to
-		 *	  the next in the ring;
-		 *	initialise bp to point to the replacement;
-		 * 4) if there's a good packet, pass it on for disposal.
-		 */
-		if(rfd->field & RfdOK){
-			pbp = nil;
-			count = rfd->count & 0x3FFF;
-			if((count < ETHERMAXTU/4) && (pbp = iallocb(count))){
-				memmove(pbp->rp, bp->rp+offsetof(Rfd, data[0]), count);
-				SETWPCNT(pbp, count);
-				rfd->count = 0;
-				rfd->field = 0;
-			}
-			else if(xbp = rfdalloc(rfd->link)){
-				bp->rp += offsetof(Rfd, data[0]);
-				SETWPCNT(bp, count);
-
-				xbp->next = bp->next;
-				bp->next = 0;
-
-				pbp = bp;
-				bp = xbp;
-			}
-			if(pbp != nil)
-				ETHERIQ(ether, pbp, 1);
-		}
-		else{
-			rfd->count = 0;
-			rfd->field = 0;
-		}
-
-		/*
-		 * The ring tail pointer follows the head with with one
-		 * unused buffer in between to defeat hardware prefetch;
-		 * once the tail pointer has been bumped on to the next
-		 * and the new tail has the Suspend bit set, it can be
-		 * removed from the old tail buffer.
-		 * As a replacement for the current head buffer may have
-		 * been allocated above, ensure that the new tail points
-		 * to it (next and link).
-		 */
-		rfd = (Rfd*)ctlr->rfdtail->rp;
-		ctlr->rfdtail = ctlr->rfdtail->next;
-		ctlr->rfdtail->next = bp;
-		((Rfd*)ctlr->rfdtail->rp)->link = PADDR(bp->rp);
-		((Rfd*)ctlr->rfdtail->rp)->field |= RfdS;
-		coherence();
-		rfd->field &= ~RfdS;
-
-		/*
-		 * Finally done with the current (possibly replaced)
-		 * head, move on to the next and maintain the sentinel
-		 * between tail and head.
-		 */
-		ctlr->rfdhead = bp->next;
-		bp = ctlr->rfdhead;
-	}
-}
-
-static void
-interrupt(Ureg*, void* arg)
-{
-	Cb* cb;
-	Ctlr *ctlr;
-	Ether *ether;
-	int status;
-
-	ether = arg;
-	ctlr = ether->ctlr;
-
-	for(;;){
-		ilock(&ctlr->rlock);
-		status = csr16r(ctlr, Status);
-		csr8w(ctlr, Ack, (status>>8) & 0xFF);
-		iunlock(&ctlr->rlock);
-
-		if(!(status & (StatCX|StatFR|StatCNA|StatRNR|StatMDI|StatSWI)))
-			break;
-
-		/*
-		 * If the watchdog timer for the receiver lockup errata is running,
-		 * let it know the receiver is active.
-		 */
-		if(status & (StatFR|StatRNR)){
-			ilock(&ctlr->cblock);
-			ctlr->tick = 0;
-			iunlock(&ctlr->cblock);
-		}
-
-		if(status & StatFR){
-			receive(ether);
-			status &= ~StatFR;
-		}
-
-		if(status & StatRNR){
-			command(ctlr, RUresume, 0);
-			status &= ~StatRNR;
-		}
-
-		if(status & StatCNA){
-			ilock(&ctlr->cblock);
-
-			cb = ctlr->cbtail;
-			while(ctlr->cbq){
-				if(!(cb->status & CbC))
-					break;
-				if(cb->bp){
-					freeb(cb->bp);
-					cb->bp = nil;
-				}
-				if((cb->status & CbU) && ctlr->threshold < 0xE0)
-					ctlr->threshold++;
-
-				ctlr->cbq--;
-				cb = cb->next;
-			}
-			ctlr->cbtail = cb;
-
-			txstart(ether);
-			iunlock(&ctlr->cblock);
-
-			status &= ~StatCNA;
-		}
-
-		if(status & (StatCX|StatFR|StatCNA|StatRNR|StatMDI|StatSWI))
-			panic("#l%d: status %#ux\n", ether->ctlrno, status);
-	}
-}
-
-static void
-ctlrinit(Ctlr* ctlr)
-{
-	int i;
-	Block *bp;
-	Rfd *rfd;
-	ulong link;
-
-	/*
-	 * Create the Receive Frame Area (RFA) as a ring of allocated
-	 * buffers.
-	 * A sentinel buffer is maintained between the last buffer in
-	 * the ring (marked with RfdS) and the head buffer to defeat the
-	 * hardware prefetch of the next RFD and allow dynamic buffer
-	 * allocation.
-	 */
-	link = NullPointer;
-	for(i = 0; i < Nrfd; i++){
-		bp = rfdalloc(link);
-		if(ctlr->rfdhead == nil)
-			ctlr->rfdtail = bp;
-		bp->next = ctlr->rfdhead;
-		ctlr->rfdhead = bp;
-		link = PADDR(bp->rp);
-	}
-	ctlr->rfdtail->next = ctlr->rfdhead;
-	rfd = (Rfd*)ctlr->rfdtail->rp;
-	rfd->link = PADDR(ctlr->rfdhead->rp);
-	rfd->field |= RfdS;
-	ctlr->rfdhead = ctlr->rfdhead->next;
-
-	/*
-	 * Create a ring of control blocks for the
-	 * transmit side.
-	 */
-	ilock(&ctlr->cblock);
-	ctlr->cbr = malloc(ctlr->ncb*sizeof(Cb));
-	for(i = 0; i < ctlr->ncb; i++){
-		ctlr->cbr[i].status = CbC|CbOK;
-		ctlr->cbr[i].command = CbS|CbNOP;
-		ctlr->cbr[i].link = PADDR(&ctlr->cbr[NEXT(i, ctlr->ncb)].status);
-		ctlr->cbr[i].next = &ctlr->cbr[NEXT(i, ctlr->ncb)];
-	}
-	ctlr->cbhead = ctlr->cbr;
-	ctlr->cbtail = ctlr->cbr;
-	ctlr->cbq = 0;
-
-	memmove(ctlr->configdata, configdata, sizeof(configdata));
-	ctlr->threshold = 80;
-	ctlr->tick = 0;
-
-	iunlock(&ctlr->cblock);
-}
-
-static int
-miir(Ctlr* ctlr, int phyadd, int regadd)
-{
-	int mcr, timo;
-
-	lock(&ctlr->miilock);
-	csr32w(ctlr, Mcr, MDIread|(phyadd<<21)|(regadd<<16));
-	mcr = 0;
-	for(timo = 64; timo; timo--){
-		mcr = csr32r(ctlr, Mcr);
-		if(mcr & MDIready)
-			break;
-		microdelay(1);
-	}
-	unlock(&ctlr->miilock);
-
-	if(mcr & MDIready)
-		return mcr & 0xFFFF;
-
-	return -1;
-}
-
-static int
-miiw(Ctlr* ctlr, int phyadd, int regadd, int data)
-{
-	int mcr, timo;
-
-	lock(&ctlr->miilock);
-	csr32w(ctlr, Mcr, MDIwrite|(phyadd<<21)|(regadd<<16)|(data & 0xFFFF));
-	mcr = 0;
-	for(timo = 64; timo; timo--){
-		mcr = csr32r(ctlr, Mcr);
-		if(mcr & MDIready)
-			break;
-		microdelay(1);
-	}
-	unlock(&ctlr->miilock);
-
-	if(mcr & MDIready)
-		return 0;
-
-	return -1;
-}
-
-static int
-hy93c46r(Ctlr* ctlr, int r)
-{
-	int data, i, op, size;
-
-	/*
-	 * Hyundai HY93C46 or equivalent serial EEPROM.
-	 * This sequence for reading a 16-bit register 'r'
-	 * in the EEPROM is taken straight from Section
-	 * 3.3.4.2 of the Intel 82557 User's Guide.
-	 */
-reread:
-	csr16w(ctlr, Ecr, EEcs);
-	op = EEstart|EEread;
-	for(i = 2; i >= 0; i--){
-		data = (((op>>i) & 0x01)<<2)|EEcs;
-		csr16w(ctlr, Ecr, data);
-		csr16w(ctlr, Ecr, data|EEsk);
-		microdelay(1);
-		csr16w(ctlr, Ecr, data);
-		microdelay(1);
-	}
-
-	/*
-	 * First time through must work out the EEPROM size.
-	 */
-	if((size = ctlr->eepromsz) == 0)
-		size = 8;
-
-	for(size = size-1; size >= 0; size--){
-		data = (((r>>size) & 0x01)<<2)|EEcs;
-		csr16w(ctlr, Ecr, data);
-		csr16w(ctlr, Ecr, data|EEsk);
-		delay(1);
-		csr16w(ctlr, Ecr, data);
-		microdelay(1);
-		if(!(csr16r(ctlr, Ecr) & EEdo))
-			break;
-	}
-
-	data = 0;
-	for(i = 15; i >= 0; i--){
-		csr16w(ctlr, Ecr, EEcs|EEsk);
-		microdelay(1);
-		if(csr16r(ctlr, Ecr) & EEdo)
-			data |= (1<<i);
-		csr16w(ctlr, Ecr, EEcs);
-		microdelay(1);
-	}
-
-	csr16w(ctlr, Ecr, 0);
-
-	if(ctlr->eepromsz == 0){
-		ctlr->eepromsz = 8-size;
-		ctlr->eeprom = malloc((1<<ctlr->eepromsz)*sizeof(ushort));
-		goto reread;
-	}
-
-	return data;
-}
-
-static void
-i82557pci(void)
-{
-	Pcidev *p;
-	Ctlr *ctlr;
-	int nop, port;
-
-	p = nil;
-	nop = 0;
-	while(p = pcimatch(p, 0x8086, 0)){
-		switch(p->did){
-		default:
-			continue;
-		case 0x1031:		/* Intel 82562EM */
-		case 0x1050:		/* Intel 82562EZ */
-		case 0x1039:		/* Intel 82801BD PRO/100 VE */
-		case 0x103A:		/* Intel 82562 PRO/100 VE */
-		case 0x103D:		/* Intel 82562 PRO/100 VE */
-		case 0x1064:		/* Intel 82562 PRO/100 VE */
-		case 0x2449:		/* Intel 82562ET */
-			nop = 1;
-			/*FALLTHROUGH*/
-		case 0x1209:		/* Intel 82559ER */
-		case 0x1229:		/* Intel 8255[789] */
-		case 0x1030:		/* Intel 82559 InBusiness 10/100  */
-			break;
-		}
-#ifndef FS
-		if(pcigetpms(p) > 0){
-			int i;
-
-			pcisetpms(p, 0);
-	
-			for(i = 0; i < 6; i++)
-				pcicfgw32(p, PciBAR0+i*4, p->mem[i].bar);
-			pcicfgw8(p, PciINTL, p->intl);
-			pcicfgw8(p, PciLTR, p->ltr);
-			pcicfgw8(p, PciCLS, p->cls);
-			pcicfgw16(p, PciPCR, p->pcr);
-		}
-#endif
-		/*
-		 * bar[0] is the memory-mapped register address (4KB),
-		 * bar[1] is the I/O port register address (32 bytes) and
-		 * bar[2] is for the flash ROM (1MB).
-		 */
-		port = p->mem[1].bar & ~0x01;
-		if(ioalloc(port, p->mem[1].size, 0, "i82557") < 0){
-			print("i82557: port %#ux in use\n", port);
-			continue;
-		}
-
-		ctlr = malloc(sizeof(Ctlr));
-		ctlr->port = port;
-		ctlr->pcidev = p;
-		ctlr->nop = nop;
-
-		if(ctlrhead != nil)
-			ctlrtail->next = ctlr;
-		else
-			ctlrhead = ctlr;
-		ctlrtail = ctlr;
-
-		pcisetbme(p);
-	}
-}
-
-static char* mediatable[9] = {
-	"10BASE-T",				/* TP */
-	"10BASE-2",				/* BNC */
-	"10BASE-5",				/* AUI */
-	"100BASE-TX",
-	"10BASE-TFD",
-	"100BASE-TXFD",
-	"100BASE-T4",
-	"100BASE-FX",
-	"100BASE-FXFD",
-};
-
-static int
-scanphy(Ctlr* ctlr)
-{
-	int i, oui, x;
-
-	for(i = 0; i < 32; i++){
-		if((oui = miir(ctlr, i, 2)) == -1 || oui == 0 || oui == 0xFFFF)
-			continue;
-		oui <<= 6;
-		x = miir(ctlr, i, 3);
-		oui |= x>>10;
-		//print("phy%d: oui %#ux reg1 %#ux\n", i, oui, miir(ctlr, i, 1));
-
-		ctlr->eeprom[6] = i;
-		if(oui == 0xAA00)
-			ctlr->eeprom[6] |= 0x07<<8;
-		else if(oui == 0x80017){
-			if(x & 0x01)
-				ctlr->eeprom[6] |= 0x0A<<8;
-			else
-				ctlr->eeprom[6] |= 0x04<<8;
-		}
-		return i;
-	}
-	return -1;
-}
-
-static void
-shutdown(Ether* ether)
-{
-	Ctlr *ctlr = ether->ctlr;
-
-print("ether82557 shutting down\n");
-	csr32w(ctlr, Port, 0);
-	delay(1);
-	csr8w(ctlr, Interrupt, InterruptM);
-}
-
-
-int
-etheri82557reset(Ether* ether)
-{
-	int anar, anlpar, bmcr, bmsr, i, k, medium, phyaddr, x;
-	unsigned short sum;
-	uchar ea[Eaddrlen];
-	Ctlr *ctlr;
-
-	if(ctlrhead == nil)
-		i82557pci();
-
-	/*
-	 * Any adapter matches if no ether->port is supplied,
-	 * otherwise the ports must match.
-	 */
-	for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
-		if(ctlr->active)
-			continue;
-		if(ether->port == 0 || ether->port == ctlr->port){
-			ctlr->active = 1;
-			break;
-		}
-	}
-	if(ctlr == nil)
-		return -1;
-
-	/*
-	 * Initialise the Ctlr structure.
-	 * Perform a software reset after which should ensure busmastering
-	 * is still enabled. The EtherExpress PRO/100B appears to leave
-	 * the PCI configuration alone (see the 'To do' list above) so punt
-	 * for now.
-	 * Load the RUB and CUB registers for linear addressing (0).
-	 */
-	ether->ctlr = ctlr;
-	ether->port = ctlr->port;
-	ether->irq = ctlr->pcidev->intl;
-	ether->tbdf = ctlr->pcidev->tbdf;
-
-	ilock(&ctlr->rlock);
-	csr32w(ctlr, Port, 0);
-	delay(1);
-	csr8w(ctlr, Interrupt, InterruptM);
-	iunlock(&ctlr->rlock);
-
-	command(ctlr, LoadRUB, 0);
-	command(ctlr, LoadCUB, 0);
-	command(ctlr, LoadDCA, PADDR(ctlr->dump));
-
-	/*
-	 * Initialise the receive frame, transmit ring and configuration areas.
-	 */
-	ctlr->ncb = Ncb;
-	ctlrinit(ctlr);
-
-	/*
-	 * Read the EEPROM.
-	 * Do a dummy read first to get the size
-	 * and allocate ctlr->eeprom.
-	 */
-	hy93c46r(ctlr, 0);
-	sum = 0;
-	for(i = 0; i < (1<<ctlr->eepromsz); i++){
-		x = hy93c46r(ctlr, i);
-		ctlr->eeprom[i] = x;
-		sum += x;
-	}
-	if(sum != 0xBABA)
-		print("#l%d: EEPROM checksum - %#4.4ux\n", ether->ctlrno, sum);
-
-	/*
-	 * Eeprom[6] indicates whether there is a PHY and whether
-	 * it's not 10Mb-only, in which case use the given PHY address
-	 * to set any PHY specific options and determine the speed.
-	 * Unfortunately, sometimes the EEPROM is blank except for
-	 * the ether address and checksum; in this case look at the
-	 * controller type and if it's am 82558 or 82559 it has an
-	 * embedded PHY so scan for that.
-	 * If no PHY, assume 82503 (serial) operation.
-	 */
-	if((ctlr->eeprom[6] & 0x1F00) && !(ctlr->eeprom[6] & 0x8000))
-		phyaddr = ctlr->eeprom[6] & 0x00FF;
-	else
-	switch(ctlr->pcidev->rid){
-	case 0x01:			/* 82557 A-step */
-	case 0x02:			/* 82557 B-step */
-	case 0x03:			/* 82557 C-step */
-	default:
-		phyaddr = -1;
-		break;
-	case 0x04:			/* 82558 A-step */
-	case 0x05:			/* 82558 B-step */
-	case 0x06:			/* 82559 A-step */
-	case 0x07:			/* 82559 B-step */
-	case 0x08:			/* 82559 C-step */
-	case 0x09:			/* 82559ER A-step */
-		phyaddr = scanphy(ctlr);
-		break;
-	}
-	if(phyaddr >= 0){
-		/*
-		 * Resolve the highest common ability of the two
-		 * link partners. In descending order:
-		 *	0x0100		100BASE-TX Full Duplex
-		 *	0x0200		100BASE-T4
-		 *	0x0080		100BASE-TX
-		 *	0x0040		10BASE-T Full Duplex
-		 *	0x0020		10BASE-T
-		 */
-		anar = miir(ctlr, phyaddr, 0x04);
-		anlpar = miir(ctlr, phyaddr, 0x05) & 0x03E0;
-		anar &= anlpar;
-		bmcr = 0;
-		if(anar & 0x380)
-			bmcr = 0x2000;
-		if(anar & 0x0140)
-			bmcr |= 0x0100;
-
-		switch((ctlr->eeprom[6]>>8) & 0x001F){
-
-		case 0x04:				/* DP83840 */
-		case 0x0A:				/* DP83840A */
-			/*
-			 * The DP83840[A] requires some tweaking for
-			 * reliable operation.
-			 * The manual says bit 10 should be unconditionally
-			 * set although it supposedly only affects full-duplex
-			 * operation (an & 0x0140).
-			 */
-			x = miir(ctlr, phyaddr, 0x17) & ~0x0520;
-			x |= 0x0420;
-			for(i = 0; i < ether->nopt; i++){
-				if(cistrcmp(ether->opt[i], "congestioncontrol"))
-					continue;
-				x |= 0x0100;
-				break;
-			}
-			miiw(ctlr, phyaddr, 0x17, x);
-
-			/*
-			 * If the link partner can't autonegotiate, determine
-			 * the speed from elsewhere.
-			 */
-			if(anlpar == 0){
-				miir(ctlr, phyaddr, 0x01);
-				bmsr = miir(ctlr, phyaddr, 0x01);
-				x = miir(ctlr, phyaddr, 0x19);
-				if((bmsr & 0x0004) && !(x & 0x0040))
-					bmcr = 0x2000;
-			}
-			break;
-
-		case 0x07:				/* Intel 82555 */
-			/*
-			 * Auto-negotiation may fail if the other end is
-			 * a DP83840A and the cable is short.
-			 */
-			miir(ctlr, phyaddr, 0x01);
-			bmsr = miir(ctlr, phyaddr, 0x01);
-			if((miir(ctlr, phyaddr, 0) & 0x1000) && !(bmsr & 0x0020)){
-				miiw(ctlr, phyaddr, 0x1A, 0x2010);
-				x = miir(ctlr, phyaddr, 0);
-				miiw(ctlr, phyaddr, 0, 0x0200|x);
-				for(i = 0; i < 3000; i++){
-					delay(1);
-					if(miir(ctlr, phyaddr, 0x01) & 0x0020)
-						break;
-				}
-				miiw(ctlr, phyaddr, 0x1A, 0x2000);
-					
-				anar = miir(ctlr, phyaddr, 0x04);
-				anlpar = miir(ctlr, phyaddr, 0x05) & 0x03E0;
-				anar &= anlpar;
-				bmcr = 0;
-				if(anar & 0x380)
-					bmcr = 0x2000;
-				if(anar & 0x0140)
-					bmcr |= 0x0100;
-			}
-			break;
-		}
-
-		/*
-		 * Force speed and duplex if no auto-negotiation.
-		 */
-		if(anlpar == 0){
-			medium = -1;
-			for(i = 0; i < ether->nopt; i++){
-				for(k = 0; k < nelem(mediatable); k++){
-					if(cistrcmp(mediatable[k], ether->opt[i]))
-						continue;
-					medium = k;
-					break;
-				}
-		
-				switch(medium){
-				default:
-					break;
-
-				case 0x00:			/* 10BASE-T */
-				case 0x01:			/* 10BASE-2 */
-				case 0x02:			/* 10BASE-5 */
-					bmcr &= ~(0x2000|0x0100);
-					ctlr->configdata[19] &= ~0x40;
-					break;
-
-				case 0x03:			/* 100BASE-TX */
-				case 0x06:			/* 100BASE-T4 */
-				case 0x07:			/* 100BASE-FX */
-					ctlr->configdata[19] &= ~0x40;
-					bmcr |= 0x2000;
-					break;
-
-				case 0x04:			/* 10BASE-TFD */
-					bmcr = (bmcr & ~0x2000)|0x0100;
-					ctlr->configdata[19] |= 0x40;
-					break;
-
-				case 0x05:			/* 100BASE-TXFD */
-				case 0x08:			/* 100BASE-FXFD */
-					bmcr |= 0x2000|0x0100;
-					ctlr->configdata[19] |= 0x40;
-					break;
-				}
-			}
-			if(medium != -1)
-				miiw(ctlr, phyaddr, 0x00, bmcr);
-		}
-
-		if(bmcr & 0x2000)
-			ether->mbps = 100;
-
-		ctlr->configdata[8] = 1;
-		ctlr->configdata[15] &= ~0x80;
-	}
-	else{
-		ctlr->configdata[8] = 0;
-		ctlr->configdata[15] |= 0x80;
-	}
-
-	/*
-	 * Workaround for some broken HUB chips when connected at 10Mb/s
-	 * half-duplex.
-	 * This is a band-aid, but as there's no dynamic auto-negotiation
-	 * code at the moment, only deactivate the workaround code in txstart
-	 * if the link is 100Mb/s.
-	 */
-	if(ether->mbps != 10)
-		ctlr->nop = 0;
-
-	/*
-	 * Load the chip configuration and start it off.
-	 */
-#ifndef FS
-	if(ether->oq == 0)
-		ether->oq = qopen(256*1024, Qmsg, 0, 0);
-#endif
-	configure(ether, 0);
-	command(ctlr, CUstart, PADDR(&ctlr->cbr->status));
-
-	/*
-	 * Check if the adapter's station address is to be overridden.
-	 * If not, read it from the EEPROM and set in ether->ea prior to loading
-	 * the station address with the Individual Address Setup command.
-	 */
-	memset(ea, 0, Eaddrlen);
-	if(memcmp(ea, ether->ea, Eaddrlen) == 0){
-		for(i = 0; i < Eaddrlen/2; i++){
-			x = ctlr->eeprom[i];
-			ether->ea[2*i] = x;
-			ether->ea[2*i+1] = x>>8;
-		}
-	}
-
-	ilock(&ctlr->cblock);
-	ctlr->action = CbIAS;
-	txstart(ether);
-	iunlock(&ctlr->cblock);
-
-	/*
-	 * Linkage to the generic ethernet driver.
-	 */
-	ether->attach = attach;
-	ether->transmit = transmit;
-	ether->interrupt = interrupt;
-#ifndef FS
-	ether->ifstat = ifstat;
-
-	ether->arg = ether;
-	ether->promiscuous = promiscuous;
-	ether->shutdown = shutdown;
-	ether->multicast = multicast;
-#endif
-	return 0;
-}
-
-#ifndef FS
-void
-ether82557bothlink(void)
-{
-	addethercard("i82557",  etheri82557reset);
-}
-#endif

+ 0 - 1112
sys/src/fs/pc/ether82563.c

@@ -1,1112 +0,0 @@
-/*
- * Intel 82563 Gigabit Ethernet Controller
- */
-#include "all.h"
-#include "io.h"
-#include "../ip/ip.h"
-#include "etherif.h"
-#include "portfns.h"
-#include "mem.h"
-
-extern ulong upamalloc(ulong, int, int);
-
-#define PCIWADDR(x)	PADDR(x)+0
-#define	ROUND(s, sz)	(((s)+((sz)-1)) & ~((sz)-1))
-
-/*
- * these are in the order they appear in the manual, not numeric order.
- * It was too hard to find them in the book. Ref 21489, rev 2.6
- */
-
-enum {
-	/* General */
-
-	Ctrl		= 0x00000000,	/* Device Control */
-	Status		= 0x00000008,	/* Device Status */
-	Eec		= 0x00000010,	/* EEPROM/Flash Control/Data */
-	Eerd		= 0x00000014,	/* EEPROM Read */
-	Ctrlext		= 0x00000018,	/* Extended Device Control */
-	Fla		= 0x0000001c,	/* Flash Access */
-	Mdic		= 0x00000020,	/* MDI Control */
-	Seresctl	= 0x00000024,	/* Serdes ana */
-	Fcal		= 0x00000028,	/* Flow Control Address Low */
-	Fcah		= 0x0000002C,	/* Flow Control Address High */
-	Fct		= 0x00000030,	/* Flow Control Type */
-	Kumctrlsta	= 0x00000034,	/* Kumeran Control and Status Register */
-	Vet		= 0x00000038,	/* VLAN EtherType */
-	Fcttv		= 0x00000170,	/* Flow Control Transmit Timer Value */
-	Txcw		= 0x00000178,	/* Transmit Configuration Word */
-	Rxcw		= 0x00000180,	/* Receive Configuration Word */
-	Ledctl		= 0x00000E00,	/* LED control */
-	Pba		= 0x00001000,	/* Packet Buffer Allocation */
-
-	/* Interrupt */
-
-	Icr		= 0x000000C0,	/* Interrupt Cause Read */
-	Ics		= 0x000000C8,	/* Interrupt Cause csr32w */
-	Ims		= 0x000000D0,	/* Interrupt Mask csr32w/Read */
-	Imc		= 0x000000D8,	/* Interrupt mask Clear */
-	Iam		= 0x000000E0,	/* Interrupt acknowledge Auto Mask */
-
-	/* Receive */
-
-	Rctl		= 0x00000100,	/* Control */
-	Ert		= 0x00002008,	/* Early Receive Threshold (573[EVL] only) */
-	Fcrtl		= 0x00002160,	/* Flow Control Rx Threshold Low */
-	Fcrth		= 0x00002168,	/* Flow Control Rx Threshold High */
-	Psrctl		= 0x00002170,	/* Packet Split Receive Control */
-	Rdbal		= 0x00002800,	/* Rdesc Base Address Low Queue 0 */
-	Rdbah		= 0x00002804,	/* Rdesc Base Address High Queue 0 */
-	Rdlen		= 0x00002808,	/* Descriptor Length Queue 0 */
-	Rdh		= 0x00002810,	/* Descriptor Head Queue 0 */
-	Rdt		= 0x00002818,	/* Descriptor Tail Queue 0 */
-	Rdtr		= 0x00002820,	/* Descriptor Timer Ring */
-	Rxdctl		= 0x00002828,	/* Descriptor Control */
-	Radv		= 0x0000282C,	/* Interrupt Absolute Delay Timer */
-	Rdbal1		= 0x00002900,	/* Rdesc Base Address Low Queue 1 */
-	Rdbah1		= 0x00002804,	/* Rdesc Base Address High Queue 1 */
-	Rdlen1		= 0x00002908,	/* Descriptor Length Queue 1 */
-	Rdh1		= 0x00002910,	/* Descriptor Head Queue 1 */
-	Rdt1		= 0x00002918,	/* Descriptor Tail Queue 1 */
-	Rxdctl1		= 0x00002928,	/* Descriptor Control Queue 1 */
-	Rsrpd		= 0x00002c00,	/* Small Packet Detect */
-	Raid		= 0x00002c08,	/* ACK interrupt delay */
-	Cpuvec		= 0x00002c10,	/* CPU Vector */
-	Rxcsum		= 0x00005000,	/* Checksum Control */
-	Rfctl		= 0x00005008,	/* Filter Control */
-	Mta		= 0x00005200,	/* Multicast Table Array */
-	Ral		= 0x00005400,	/* Address Low */
-	Rah		= 0x00005404,	/* Address High */
-	Vfta		= 0x00005600,	/* VLAN Filter Table Array */
-	Mrqc		= 0x00005818,	/* Multiple Receive Queues Command */
-	Rssim		= 0x00005864,	/* RSS Interrupt Mask */
-	Rssir		= 0x00005868,	/* RSS Interrupt Request */
-	Reta		= 0x00005c00,	/* Redirection Table */
-	Rssrk		= 0x00005c80,	/* RSS Random Key */
-
-	/* Transmit */
-
-	Tctl		= 0x00000400,	/* Control */
-	Tipg		= 0x00000410,	/* IPG */
-	Tdbal		= 0x00003800,	/* Tdesc Base Address Low */
-	Tdbah		= 0x00003804,	/* Tdesc Base Address High */
-	Tdlen		= 0x00003808,	/* Descriptor Length */
-	Tdh		= 0x00003810,	/* Descriptor Head */
-	Tdt		= 0x00003818,	/* Descriptor Tail */
-	Tidv		= 0x00003820,	/* Interrupt Delay Value */
-	Txdctl		= 0x00003828,	/* Descriptor Control */
-	Tadv		= 0x0000382C,	/* Interrupt Absolute Delay Timer */
-	Tarc0		= 0x00003840,	/* Arbitration Counter Queue 0 */
-	Tdbal1		= 0x00003900,	/* Descriptor Base Low Queue 1 */
-	Tdbah1		= 0x00003904,	/* Descriptor Base High Queue 1 */
-	Tdlen1		= 0x00003908,	/* Descriptor Length Queue 1 */
-	Tdh1		= 0x00003910,	/* Descriptor Head Queue 1 */
-	Tdt1		= 0x00003918,	/* Descriptor Tail Queue 1 */
-	Txdctl1		= 0x00003928,	/* Descriptor Control 1 */
-	Tarc1		= 0x00003940,	/* Arbitration Counter Queue 1 */
-
-	/* Statistics */
-
-	Statistics	= 0x00004000,	/* Start of Statistics Area */
-	Gorcl		= 0x88/4,	/* Good Octets Received Count */
-	Gotcl		= 0x90/4,	/* Good Octets Transmitted Count */
-	Torl		= 0xC0/4,	/* Total Octets Received */
-	Totl		= 0xC8/4,	/* Total Octets Transmitted */
-	Nstatistics	= 64,
-
-};
-
-enum {					/* Ctrl */
-	GIOmd		= (1<<2),	/* BIO master disable */
-	Lrst		= (1<<3),	/* link reset */
-	Slu		= (1<<6),	/* csr32w Link Up */
-	SspeedMASK	= (3<<8),	/* Speed Selection */
-	SspeedSHIFT	= 8,
-	Sspeed10	= 0x00000000,	/* 10Mb/s */
-	Sspeed100	= 0x00000100,	/* 100Mb/s */
-	Sspeed1000	= 0x00000200,	/* 1000Mb/s */
-	Frcspd		= (1<<11),	/* Force Speed */
-	Frcdplx		= (1<<12),	/* Force Duplex */
-	SwdpinsloMASK	= 0x003C0000,	/* Software Defined Pins - lo nibble */
-	SwdpinsloSHIFT	= 18,
-	SwdpioloMASK	= 0x03C00000,	/* Software Defined Pins - I or O */
-	SwdpioloSHIFT	= 22,
-	Devrst		= (1<<26),	/* Device Reset */
-	Rfce		= (1<<27),	/* Receive Flow Control Enable */
-	Tfce		= (1<<28),	/* Transmit Flow Control Enable */
-	Vme		= (1<<30),	/* VLAN Mode Enable */
-	Phy_rst		= (1<<31),	/* Phy Reset */
-};
-
-enum {					/* Status */
-	Lu		= (1<<1),	/* Link Up */
-	Lanid		= (3<<2),	/* mask for Lan ID.
-	Txoff		= (1<<4),	/* Transmission Paused */
-	Tbimode		= (1<<5),	/* TBI Mode Indication */
-	SpeedMASK	= 0x000000C0,
-	Speed10		= 0x00000000,	/* 10Mb/s */
-	Speed100	= 0x00000040,	/* 100Mb/s */
-	Speed1000	= 0x00000080,	/* 1000Mb/s */
-	Phyra		= (1<<10),	/* PHY Reset Asserted */
-	GIOme		= (1<<19),	/* GIO Master Enable Status */
-};
-
-enum {					/* Ctrl and Status */
-	Fd		= 0x00000001,	/* Full-Duplex */
-	AsdvMASK	= 0x00000300,
-	Asdv10		= 0x00000000,	/* 10Mb/s */
-	Asdv100		= 0x00000100,	/* 100Mb/s */
-	Asdv1000	= 0x00000200,	/* 1000Mb/s */
-};
-
-enum {					/* Eec */
-	Sk		= (1<<0),	/* Clock input to the EEPROM */
-	Cs		= (1<<1),	/* Chip Select */
-	Di		= (1<<2),	/* Data Input to the EEPROM */
-	Do		= (1<<3),	/* Data Output from the EEPROM */
-	Areq		= (1<<6),	/* EEPROM Access Request */
-	Agnt		= (1<<7),	/* EEPROM Access Grant */
-};
-
-enum {					/* Eerd */
-	ee_start	= (1<<0),	/* Start Read */
-	ee_done		= (1<<1),	/* Read done */
-	ee_addr		= (0xfff8<<2),	/* Read address [15:2] */
-	ee_data		= (0xffff<<16),	/* Read Data; Data returned from eeprom/nvm */
-};
-
-enum {					/* Ctrlext */
-	Asdchk		= (1<<12),	/* ASD Check */
-	Eerst		= (1<<13),	/* EEPROM Reset */
-	Spdbyps		= (1<<15),	/* Speed Select Bypass */
-};
-
-enum {					/* EEPROM content offsets */
-	Ea		= 0x00,		/* Ethernet Address */
-	Cf		= 0x03,		/* Compatibility Field */
-	xIcw1		= 0x0A,		/* Initialization Control Word 1 */
-	Sid		= 0x0B,		/* Subsystem ID */
-	Svid		= 0x0C,		/* Subsystem Vendor ID */
-	Did		= 0x0D,		/* Device ID */
-	Vid		= 0x0E,		/* Vendor ID */
-	Icw2		= 0x0F,		/* Initialization Control Word 2 */
-};
-
-enum {					/* Mdic */
-	MDIdMASK	= 0x0000FFFF,	/* Data */
-	MDIdSHIFT	= 0,
-	MDIrMASK	= 0x001F0000,	/* PHY Register Address */
-	MDIrSHIFT	= 16,
-	MDIpMASK	= 0x03E00000,	/* PHY Address */
-	MDIpSHIFT	= 21,
-	MDIwop		= 0x04000000,	/* Write Operation */
-	MDIrop		= 0x08000000,	/* Read Operation */
-	MDIready	= 0x10000000,	/* End of Transaction */
-	MDIie		= 0x20000000,	/* Interrupt Enable */
-	MDIe		= 0x40000000,	/* Error */
-};
-
-enum {					/* Icr, Ics, Ims, Imc */
-	Txdw		= 0x00000001,	/* Transmit Descriptor Written Back */
-	Txqe		= 0x00000002,	/* Transmit Queue Empty */
-	Lsc		= 0x00000004,	/* Link Status Change */
-	Rxseq		= 0x00000008,	/* Receive Sequence Error */
-	Rxdmt0		= 0x00000010,	/* Rdesc Minimum Threshold Reached */
-	Rxo		= 0x00000040,	/* Receiver Overrun */
-	Rxt0		= 0x00000080,	/* Receiver Timer Interrupt */
-	Mdac		= 0x00000200,	/* MDIO Access Completed */
-	Rxcfg		= 0x00000400,	/* Receiving /C/ ordered sets */
-	Gpi0		= 0x00000800,	/* General Purpose Interrupts */
-	Gpi1		= 0x00001000,
-	Gpi2		= 0x00002000,
-	Gpi3		= 0x00004000,
-};
-
-enum {					/* Txcw */
-	TxcwFd		= 0x00000020,	/* Full Duplex */
-	TxcwHd		= 0x00000040,	/* Half Duplex */
-	TxcwPauseMASK	= 0x00000180,	/* Pause */
-	TxcwPauseSHIFT	= 7,
-	TxcwPs		= (1<<TxcwPauseSHIFT),	/* Pause Supported */
-	TxcwAs		= (2<<TxcwPauseSHIFT),	/* Asymmetric FC desired */
-	TxcwRfiMASK	= 0x00003000,	/* Remote Fault Indication */
-	TxcwRfiSHIFT	= 12,
-	TxcwNpr		= 0x00008000,	/* Next Page Request */
-	TxcwConfig	= 0x40000000,	/* Transmit COnfig Control */
-	TxcwAne		= 0x80000000,	/* Auto-Negotiation Enable */
-};
-
-enum {					/* Rctl */
-	Rrst		= 0x00000001,	/* Receiver Software Reset */
-	Ren		= 0x00000002,	/* Receiver Enable */
-	Sbp		= 0x00000004,	/* Store Bad Packets */
-	Upe		= 0x00000008,	/* Unicast Promiscuous Enable */
-	Mpe		= 0x00000010,	/* Multicast Promiscuous Enable */
-	Lpe		= 0x00000020,	/* Long Packet Reception Enable */
-	LbmMASK		= 0x000000C0,	/* Loopback Mode */
-	LbmOFF		= 0x00000000,	/* No Loopback */
-	LbmTBI		= 0x00000040,	/* TBI Loopback */
-	LbmMII		= 0x00000080,	/* GMII/MII Loopback */
-	LbmXCVR		= 0x000000C0,	/* Transceiver Loopback */
-	RdtmsMASK	= 0x00000300,	/* Rdesc Minimum Threshold Size */
-	RdtmsHALF	= 0x00000000,	/* Threshold is 1/2 Rdlen */
-	RdtmsQUARTER	= 0x00000100,	/* Threshold is 1/4 Rdlen */
-	RdtmsEIGHTH	= 0x00000200,	/* Threshold is 1/8 Rdlen */
-	MoMASK		= 0x00003000,	/* Multicast Offset */
-	Bam		= 0x00008000,	/* Broadcast Accept Mode */
-	BsizeMASK	= 0x00030000,	/* Receive Buffer Size */
-	Bsize8192	= 0x00020000, 	/* Bsex = 1 */
-	Bsize2048	= 0x00000000,
-	Bsize1024	= 0x00010000,
-	Bsize512	= 0x00020000,
-	Bsize256	= 0x00030000,
-	Vfe		= 0x00040000,	/* VLAN Filter Enable */
-	Cfien		= 0x00080000,	/* Canonical Form Indicator Enable */
-	Cfi		= 0x00100000,	/* Canonical Form Indicator value */
-	Dpf		= 0x00400000,	/* Discard Pause Frames */
-	Pmcf		= 0x00800000,	/* Pass MAC Control Frames */
-	Bsex		= 0x02000000,	/* Buffer Size Extension */
-	Secrc		= 0x04000000,	/* Strip CRC from incoming packet */
-};
-
-enum {					/* Tctl */
-	Trst		= 0x00000001,	/* Transmitter Software Reset */
-	Ten		= 0x00000002,	/* Transmit Enable */
-	Psp		= 0x00000008,	/* Pad Short Packets */
-	CtMASK		= 0x00000FF0,	/* Collision Threshold */
-	CtSHIFT		= 4,
-	ColdMASK	= 0x003FF000,	/* Collision Distance */
-	ColdSHIFT	= 12,
-	Swxoff		= 0x00400000,	/* Sofware XOFF Transmission */
-	Pbe		= 0x00800000,	/* Packet Burst Enable */
-	Rtlc		= 0x01000000,	/* Re-transmit on Late Collision */
-	Nrtu		= 0x02000000,	/* No Re-transmit on Underrrun */
-};
-
-enum {					/* [RT]xdctl */
-	PthreshMASK	= 0x0000003F,	/* Prefetch Threshold */
-	PthreshSHIFT	= 0,
-	HthreshMASK	= 0x00003F00,	/* Host Threshold */
-	HthreshSHIFT	= 8,
-	WthreshMASK	= 0x003F0000,	/* Writebacj Threshold */
-	WthreshSHIFT	= 16,
-	Gran		= 0x01000000,	/* Granularity */
-};
-
-enum {					/* Rxcsum */
-	PcssMASK	= 0x000000FF,	/* Packet Checksum Start */
-	PcssSHIFT	= 0,
-	Ipofl		= 0x00000100,	/* IP Checksum Off-load Enable */
-	Tuofl		= 0x00000200,	/* TCP/UDP Checksum Off-load Enable */
-};
-
-enum {					/* Receive Delay Timer Ring */
-	DelayMASK	= 0x0000FFFF,	/* delay timer in 1.024nS increments */
-	DelaySHIFT	= 0,
-	Fpd		= 0x80000000,	/* Flush partial Descriptor Block */
-};
-
-typedef struct Rd {			/* Receive Descriptor */
-	uint	addr[2];
-	ushort	length;
-	ushort	checksum;
-	uchar	status;
-	uchar	errors;
-	ushort	special;
-} Rd;
-
-enum {					/* Rd status */
-	Rdd		= 0x01,		/* Descriptor Done */
-	Reop		= 0x02,		/* End of Packet */
-	Ixsm		= 0x04,		/* Ignore Checksum Indication */
-	Vp		= 0x08,		/* Packet is 802.1Q (matched VET) */
-	Tcpcs		= 0x20,		/* TCP Checksum Calculated on Packet */
-	Ipcs		= 0x40,		/* IP Checksum Calculated on Packet */
-	Pif		= 0x80,		/* Passed in-exact filter */
-};
-
-enum {					/* Rd errors */
-	Ce		= 0x01,		/* CRC Error or Alignment Error */
-	Se		= 0x02,		/* Symbol Error */
-	Seq		= 0x04,		/* Sequence Error */
-	Cxe		= 0x10,		/* Carrier Extension Error */
-	Tcpe		= 0x20,		/* TCP/UDP Checksum Error */
-	Ipe		= 0x40,		/* IP Checksum Error */
-	Rxe		= 0x80,		/* RX Data Error */
-};
-
-typedef struct Td Td;
-struct Td {			/* Transmit Descriptor */
-	uint	addr[2];	/* Data */
-	uint	control;
-	uint	status;
-};
-
-enum {					/* Tdesc control */
-	LenMASK		= 0x000FFFFF,	/* Data/Packet Length Field */
-	LenSHIFT	= 0,
-	DtypeCD		= 0x00000000,	/* Data Type 'Context Descriptor' */
-	DtypeDD		= 0x00100000,	/* Data Type 'Data Descriptor' */
-	PtypeTCP	= 0x01000000,	/* TCP/UDP Packet Type (CD) */
-	Teop		= 0x01000000,	/* End of Packet (DD) */
-	PtypeIP		= 0x02000000,	/* IP Packet Type (CD) */
-	Ifcs		= 0x02000000,	/* Insert FCS (DD) */
-	Tse		= 0x04000000,	/* TCP Segmentation Enable */
-	Rs		= 0x08000000,	/* Report Status */
-	Rps		= 0x10000000,	/* Report Status Sent */
-	Dext		= 0x20000000,	/* Descriptor Extension */
-	Vle		= 0x40000000,	/* VLAN Packet Enable */
-	Ide		= 0x80000000,	/* Interrupt Delay Enable */
-};
-
-enum {					/* Tdesc status */
-	Tdd		= 0x00000001,	/* Descriptor Done */
-	Ec		= 0x00000002,	/* Excess Collisions */
-	Lc		= 0x00000004,	/* Late Collision */
-	Tu		= 0x00000008,	/* Transmit Underrun */
-	CssMASK		= 0x0000FF00,	/* Checksum Start Field */
-	CssSHIFT	= 8,
-};
-
-enum {
-	Nrd		= 256,		/* multiple of 8 */
-	Ntd		= 64,		/* multiple of 8 */
-	Nrb		= 1024,		/* private receive buffers per Ctlr */
-	Rbsz		= ETHERMAXTU,
-};
-
-typedef struct{
-	int	port;
-	Pcidev*	pcidev;
-	int	active;
-	int	started;
-	int	id;
-	int	cls;
-	ushort	eeprom[0x40];
-
-	void*	alloc;			/* receive/transmit descriptors */
-	int	nrd;
-	int	ntd;
-	int	nrb;			/* how many this Ctlr has in the pool */
-
-	int*	nic;
-	int	im;			/* interrupt mask */
-
-	int	lrendez;
-	int	lim;
-
-	int	link;
-
-	uint	statistics[Nstatistics];
-	uint	lsleep;
-	uint	lintr;
-	uint	rsleep;
-	uint	rintr;
-	uint	txdw;
-	uint	tintr;
-	uint	ixsm;
-	uint	ipcs;
-	uint	tcpcs;
-
-	uchar	ra[Easize];		/* receive address */
-	ulong	mta[128];		/* multicast table array */
-
-	Rendez	txrendez;
-	Rendez	rxrendez;
-
-	Lock	imlock;
-	Lock	txlock;
-
-	int	rim;
-	int	rdfree;
-	Rd*	rdba;			/* receive descriptor base address */
-	Msgbuf	**rb;			/* receive buffers */
-	int	rdh;			/* receive descriptor head */
-	int	rdt;			/* receive descriptor tail */
-	int	rdtr;			/* receive delay timer ring value */
-	int	radv;			/* receive interrupt absolute delay timer */
-
-	int	tbusy;
-	int	tdfree;
-	Td*	tdba;			/* transmit descriptor base address */
-	Msgbuf	**tb;			/* transmit buffers */
-	int	tdh;			/* transmit descriptor head */
-	int	tdt;			/* transmit descriptor tail */
-
-	int	txcw;
-	int	fcrtl;
-	int	fcrth;
-
-	Queue	*reply;			/* alias of ifc->reply */
-	Filter	rate;
-	Filter	work;
-}Ctlr;
-
-enum{
-	Nether	= 8,
-};
-
-#define csr32r(c, r)	(*((c)->nic+((r)/4)))
-#define csr32w(c, r, v)	(*((c)->nic+((r)/4)) = (v))
-
-static Ctlr	ports[Nether];
-static int	nports;
-
-static Lock i82563rblock;		/* free receive Blocks */
-static Msgbuf *i82563rbpool;
-
-#ifdef notdef
-static char* statistics[Nstatistics] = {
-	"CRC Error",
-	"Alignment Error",
-	"Symbol Error",
-	"RX Error",
-	"Missed Packets",
-	"Single Collision",
-	"Excessive Collisions",
-	"Multiple Collision",
-	"Late Collisions",
-	nil,
-	"Collision",
-	"Transmit Underrun",
-	"Defer",
-	"Transmit - No CRS",
-	"Sequence Error",
-	"Carrier Extension Error",
-	"Receive Error Length",
-	nil,
-	"XON Received",
-	"XON Transmitted",
-	"XOFF Received",
-	"XOFF Transmitted",
-	"FC Received Unsupported",
-	"Packets Received (64 Bytes)",
-	"Packets Received (65-127 Bytes)",
-	"Packets Received (128-255 Bytes)",
-	"Packets Received (256-511 Bytes)",
-	"Packets Received (512-1023 Bytes)",
-	"Packets Received (1024-1522 Bytes)",
-	"Good Packets Received",
-	"Broadcast Packets Received",
-	"Multicast Packets Received",
-	"Good Packets Transmitted",
-	nil,
-	"Good Octets Received",
-	nil,
-	"Good Octets Transmitted",
-	nil,
-	nil,
-	nil,
-	"Receive No Buffers",
-	"Receive Undersize",
-	"Receive Fragment",
-	"Receive Oversize",
-	"Receive Jabber",
-	nil,
-	nil,
-	nil,
-	"Total Octets Received",
-	nil,
-	"Total Octets Transmitted",
-	nil,
-	"Total Packets Received",
-	"Total Packets Transmitted",
-	"Packets Transmitted (64 Bytes)",
-	"Packets Transmitted (65-127 Bytes)",
-	"Packets Transmitted (128-255 Bytes)",
-	"Packets Transmitted (256-511 Bytes)",
-	"Packets Transmitted (512-1023 Bytes)",
-	"Packets Transmitted (1024-1522 Bytes)",
-	"Multicast Packets Transmitted",
-	"Broadcast Packets Transmitted",
-	"TCP Segmentation Context Transmitted",
-	"TCP Segmentation Context Fail",
-};
-
-static void
-i82563ifstat(Ctlr *c)
-{
-	char *s;
-	int i, r;
-	uvlong tuvl, ruvl;
-
-	for(i = 0; i < Nstatistics; i++){
-		r = csr32r(c, Statistics+i*4);
-		if((s = statistics[i]) == nil)
-			continue;
-		switch(i){
-		case Gorcl:
-		case Gotcl:
-		case Torl:
-		case Totl:
-			ruvl = r;
-			ruvl += ((uvlong)csr32r(c, Statistics+(i+1)*4))<<32;
-			tuvl = ruvl;
-			tuvl += c->statistics[i];
-			tuvl += ((uvlong)c->statistics[i+1])<<32;
-			if(tuvl == 0)
-				continue;
-			c->statistics[i] = tuvl;
-			c->statistics[i+1] = tuvl>>32;
-			print("%s: %llud %llud\n", s, tuvl, ruvl);
-			i++;
-			break;
-
-		default:
-			c->statistics[i] += r;
-			if(c->statistics[i] == 0)
-				continue;
-			print("%s: %ud %ud\n", s, c->statistics[i], r);
-			break;
-		}
-	}
-
-	print("lintr: %ud %ud\n", c->lintr, c->lsleep);
-	print("rintr: %ud %ud\n", c->rintr, c->rsleep);
-	print("tintr: %ud %ud\n", c->tintr, c->txdw);
-	print("ixcs: %ud %ud %ud\n", c->ixsm, c->ipcs, c->tcpcs);
-	print("rdtr: %ud\n", c->rdtr);
-	print("radv: %ud\n", c->radv);
-	print("Ctrlext: %08x\n", csr32r(c, Ctrlext));
-
-	print("eeprom:");
-	for(i = 0; i < 0x40; i++){
-		if(i && ((i & 0x07) == 0))
-			print("\n       ");
-		print(" %4.4uX", c->eeprom[i]);
-	}
-}
-#endif
-
-static Msgbuf*
-i82563rballoc(void)
-{
-	Msgbuf *m;
-
-	ilock(&i82563rblock);
-	if((m = i82563rbpool) != nil){
-		i82563rbpool = m->next;
-		m->next = nil;
-	}
-	iunlock(&i82563rblock);
-	m->flags &= ~FREE;
-	m->count = 0;
-	m->data = (uchar*)PGROUND((uintptr)m->xdata);
-	return m;
-}
-
-static void
-i82563rbfree(Msgbuf *m)
-{
-	m->flags |= FREE;
-	ilock(&i82563rblock);
-	m->next = i82563rbpool;
-	i82563rbpool = m;
-	iunlock(&i82563rblock);
-}
-
-static void
-i82563im(Ctlr* c, int im)
-{
-	ilock(&c->imlock);
-	c->im |= im;
-	csr32w(c, Ims, c->im);
-	iunlock(&c->imlock);
-}
-
-static void
-i82563txinit(Ctlr* c)
-{
-	int i, r;
-	Msgbuf *m;
-
-	csr32w(c, Tctl, 0x0F<<CtSHIFT | Psp | 66<<ColdSHIFT);
-	csr32w(c, Tipg, 6<<20 | 8<<10 | 8);
-	csr32w(c, Tdbal, PCIWADDR(c->tdba));
-	csr32w(c, Tdbah, 0);
-	csr32w(c, Tdlen, c->ntd*sizeof(Td));
-	c->tdh = PREV(0, c->ntd);
-	csr32w(c, Tdh, 0);
-	c->tdt = 0;
-	csr32w(c, Tdt, 0);
-	for(i = 0; i < c->ntd; i++){
-		if((m = c->tb[i]) != nil){
-			c->tb[i] = nil;
-			mbfree(m);
-		}
-		memset(&c->tdba[i], 0, sizeof(Td));
-	}
-	c->tdfree = c->ntd;
-	csr32w(c, Tidv, 128);
-	r = csr32r(c, Txdctl);
-	r &= ~WthreshMASK;
-	r |= Gran | 4<<WthreshSHIFT;
-	csr32w(c, Tadv, 64);
-	csr32w(c, Txdctl, r);
-	r = csr32r(c, Tctl);
-	r |= Ten;
-	csr32w(c, Tctl, r);
-}
-
-static int
-ret0(void*)
-{
-	return 0;
-}
-
-static void
-i82563transmit(Ether *e)
-{
-	int tdh, tdt, ctdh;
-	Ctlr *c;
-	Msgbuf *m;
-	Td *td;
-
-	c = e->ctlr;
-	ilock(&c->txlock);
-	/*
-	 * Free any completed packets
-	 */
-	tdh = c->tdh;
-	ctdh = csr32r(c, Tdh);
-	while(NEXT(tdh, c->ntd) != ctdh){
-		if((m = c->tb[tdh]) != nil){
-			c->tb[tdh] = nil;
-			mbfree(m);
-		}
-		memset(&c->tdba[tdh], 0, sizeof(Td));
-		tdh = NEXT(tdh, c->ntd);
-	}
-	c->tdh = tdh;
-
-	/*
-	 * Try to fill the ring back up.
-	 */
-	tdt = c->tdt;
-	while(NEXT(tdt, c->ntd) != tdh){
-		if((m = etheroq(e)) == nil)
-			break;
-		td = &c->tdba[tdt];
-		td->addr[0] = PCIWADDR(m->data);
-		td->control = (m->count & LenMASK) << LenSHIFT;
-		td->control |= Ifcs | Teop | DtypeDD;
-		c->tb[tdt] = m;
-		tdt = NEXT(tdt, c->ntd);
-		c->tdt = tdt;
-		if(NEXT(tdt, c->ntd) == tdh){
-			td->control |= Rs;
-			c->txdw++;
-			i82563im(c, Txdw);
-			break;
-		}
-	}
-	csr32w(c, Tdt, tdt);
-	iunlock(&c->txlock);
-}
-
-static void
-i82563replenish(Ctlr* c)
-{
-	int rdt;
-	Msgbuf *m;
-	Rd *rd;
-
-	rdt = c->rdt;
-	while(NEXT(rdt, c->nrd) != c->rdh){
-		rd = &c->rdba[rdt];
-		if(c->rb[rdt] == nil){
-			if((m = i82563rballoc()) == nil){
-				print("no available buffers\n");
-				break;
-			}
-			c->rb[rdt] = m;
-			rd->addr[0] = PCIWADDR(m->data);
-			rd->addr[1] = 0;
-		}
-		rd->status = 0;
-		rdt = NEXT(rdt, c->nrd);
-		c->rdfree++;
-	}
-	c->rdt = rdt;
-	csr32w(c, Rdt, rdt);
-}
-
-static void
-i82563rxinit(Ctlr* c)
-{
-	int i;
-	Msgbuf *m;
-
-//	csr32w(c, Rctl, Dpf | Bsize2048 | Bam | RdtmsHALF);
-//	csr32w(c, Rctl, Lpe| Dpf | Bsize16384 | Bam | RdtmsHALF | Bsex | Secrc);
-	csr32w(c, Rctl, Lpe| Dpf | Bsize8192  | Bam | RdtmsHALF | Bsex | Secrc);
-
-	csr32w(c, Rdbal, PCIWADDR(c->rdba));
-	csr32w(c, Rdbah, 0);
-	csr32w(c, Rdlen, c->nrd*sizeof(Rd));
-	c->rdh = 0;
-	csr32w(c, Rdh, 0);
-	c->rdt = 0;
-	csr32w(c, Rdt, 0);
-	c->rdtr = 0;
-	c->radv = 0;
-	csr32w(c, Rdtr, Fpd | 0);
-	csr32w(c, Radv, 0);
-
-	for(i = 0; i < c->nrd; i++){
-		if((m = c->rb[i]) != nil){
-			c->rb[i] = nil;
-			mbfree(m);
-		}
-	}
-	i82563replenish(c);
-	csr32w(c, Radv, 64);
-//	csr32w(c, Rxdctl, 8<<WthreshSHIFT | 8<<HthreshSHIFT | 4);
-//	csr32w(c, Rxdctl, 0<<WthreshSHIFT | 0<<HthreshSHIFT | 0);
-	csr32w(c, Rxdctl, 1<<16 | 1<<24);
-
-	/*
-	 * Enable checksum offload.
-	 */
-//#define ETHERHDRSIZE 14
-//	csr32w(c, Rxcsum, Tuofl | Ipofl | ETHERHDRSIZE<<PcssSHIFT);
-}
-
-static int
-rim0(void *rim)
-{
-	return *(int*)rim != 0;
-}
-
-static void
-i82563rxproc(void)
-{
-	int r, rdh, rim;
-	Ctlr *c;
-	Ether *e;
-	Msgbuf *m;
-	Rd *rd;
-
-	e = u->arg;
-	c = e->ctlr;
-	i82563rxinit(c);
-	r = csr32r(c, Rctl);
-	r |= Ren;
-	csr32w(c, Rctl, r);
-
-	for(;;){
-		i82563im(c, Rxt0|Rxo|Rxdmt0|Rxseq);
-		c->rsleep++;
-		coherence();
-		sleep(&c->rxrendez, rim0, &c->rim);
-
-		rdh = c->rdh;
-		for(;;){
-			rd = &c->rdba[rdh];
-			rim = c->rim;
-			c->rim = 0;
-			if(!(rd->status & Rdd))
-				break;
-
-			/*
-			 * Accept eop packets with no errors.
-			 * With no errors and the Ixsm bit set,
-			 * the descriptor status Tpcs and Ipcs bits give
-			 * an indication of whether the checksums were
-			 * calculated and valid.
-			 */
-			if (m = c->rb[rdh]) {
-				if((rd->status & Reop) && rd->errors == 0){
-					m->count = rd->length;
-					m->next = nil;
-					etheriq(e, m);
-				} else
-					mbfree(m);
-				c->rb[rdh] = nil;
-			}
-			memset(rd, 0, sizeof(Rd));
-			c->rdfree--;
-			c->rdh = rdh = NEXT(rdh, c->nrd);
-			coherence();
-			if(c->rdfree < (c->nrd/4)*3 || (rim&Rxdmt0))
-				i82563replenish(c);
-		}
-	}
-}
-
-static void
-i82563attach(Ether *e)
-{
-	char name[NAMELEN];
-	Ctlr *c;
-	Msgbuf *m;
-
-	c = e->ctlr;
-	c->nrd = ROUND(Nrd, 8);
-	c->ntd = ROUND(Ntd, 8);
-	c->alloc = ialloc(c->nrd*sizeof(Rd)+c->ntd*sizeof(Td) + 255, 0);
-	c->rdba = (Rd*)ROUNDUP((ulong)c->alloc, 256);
-	c->tdba = (Td*)(c->rdba+c->nrd);
-
-	c->rb = ialloc(c->nrd*sizeof m, 0);
-	c->tb = ialloc(c->ntd*sizeof m, 0);
-
-	for(c->nrb = 0; c->nrb < Nrb; c->nrb++){
-		m = mballoc(Rbsz+BY2PG, 0, Mbeth1);
-		m->free = i82563rbfree;
-		mbfree(m);
-	}
-	snprint(name, sizeof name, "82563rx%ld", c-ports);
-	userinit(i82563rxproc, e, name);
-	i82563txinit(c);
-}
-
-static void
-i82563interrupt(Ureg*, void* v)
-{
-	int icr, im, txdw;
-	Ether *e;
-	Ctlr *c;
-
-	e = v;
-	c = e->ctlr;
-
-	ilock(&c->imlock);
-	csr32w(c, Imc, ~0);
-	im = c->im;
-	txdw = 0;
-	while(icr = csr32r(c, Icr) & c->im){
-		if(icr & Lsc){
-			im &= ~Lsc;
-			c->lim = icr & Lsc;
-			c->lintr++;
-		}
-		if(icr & (Rxt0|Rxo|Rxdmt0|Rxseq)){
-			c->rim = icr & (Rxt0|Rxo|Rxdmt0|Rxseq);
-			im &= ~(Rxt0|Rxo|Rxdmt0|Rxseq);
-			wakeup(&c->rxrendez);
-			c->rintr++;
-		}
-		if(icr & Txdw){
-			im &= ~Txdw;
-			txdw++;
-			c->tintr++;
-		}
-	}
-	c->im = im;
-	csr32w(c, Ims, im);
-	iunlock(&c->imlock);
-	if(txdw)
-		i82563transmit(e);
-}
-
-static int
-i82563detach(Ctlr* c)
-{
-	int r, timeo;
-
-	/*
-	 * Perform a device reset to get the chip back to the
-	 * power-on state, followed by an EEPROM reset to read
-	 * the defaults for some internal registers.
-	 */
-	csr32w(c, Imc, ~0);
-	csr32w(c, Rctl, 0);
-	csr32w(c, Tctl, 0);
-
-	delay(10);
-
-	csr32w(c, Ctrl, Devrst);
-	delay(1);
-	for(timeo = 0; timeo < 1000; timeo++){
-		if(!(csr32r(c, Ctrl) & Devrst))
-			break;
-		delay(1);
-	}
-	if(csr32r(c, Ctrl) & Devrst)
-		return -1;
-	r = csr32r(c, Ctrlext);
-	csr32w(c, Ctrlext, r | Eerst);
-	delay(1);
-	for(timeo = 0; timeo < 1000; timeo++){
-		if(!(csr32r(c, Ctrlext) & Eerst))
-			break;
-		delay(1);
-	}
-	if(csr32r(c, Ctrlext) & Eerst)
-		return -1;
-
-	csr32w(c, Imc, ~0);
-	delay(1);
-	for(timeo = 0; timeo < 1000; timeo++){
-		if(!csr32r(c, Icr))
-			break;
-		delay(1);
-	}
-	if(csr32r(c, Icr))
-		return -1;
-
-	return 0;
-}
-
-static ushort
-eeread(Ctlr* c, int adr)
-{
-	csr32w(c, Eerd, ee_start | adr<<2);
-	while ((csr32r(c, Eerd) & ee_done) == 0)
-		;
-	return csr32r(c, Eerd) >> 16;
-}
-
-static int
-eeload(Ctlr* c)
-{
-	int data, adr;
-	ushort sum;
-
-	sum = 0;
-	for (adr = 0; adr < 0x40; adr++) {
-		data = eeread(c, adr);
-		c->eeprom[adr] = data;
-		sum += data;
-	}
-	return sum;
-}
-
-static uchar*
-etheradd(uchar *u, uint n)
-{
-	int i;
-	uint j;
-
-	for(i = 5; n != 0 && i >= 0; i--){
-		j = n + u[i];
-		u[i] = j;
-		n = j >> 8;
-	}
-	return u;
-}
-
-typedef struct {
-	uchar	ea[Easize];
-	int	n;
-} Basetab;
-
-static Basetab btab[Nether];
-static int nbase;
-
-int
-nthether(uchar *ea)
-{
-	int i;
-
-	for(i = 0; i < nelem(btab); i++)
-		if(btab[i].n == 0 || memcmp(btab[i].ea, ea, Easize) == 0) {
-			memmove(btab[i].ea, ea, Easize);
-			return btab[i].n++;
-		}
-	return -1;
-}
-
-static int
-reset(Ctlr *c)
-{
-	int i, r;
-
-	if(i82563detach(c))
-		return -1;
-	r = eeload(c);
-	if (r != 0 && r != 0xbaba){
-		print("i82563: bad EEPROM checksum - 0x%4.4ux\n", r);
-		return -1;
-	}
-
-	for(i = Ea; i < Easize/2; i++){
-		c->ra[2*i]   = c->eeprom[i];
-		c->ra[2*i+1] = c->eeprom[i] >> 8;
-	}
-	etheradd(c->ra, nthether(c->ra));
-	r = c->ra[3]<<24 | c->ra[2]<<16 | c->ra[1]<<8 | c->ra[0];
-	csr32w(c, Ral, r);
-	r = 0x80000000 | c->ra[5]<<8 | c->ra[4];
-	csr32w(c, Rah, r);
-	for(i = 1; i < 16; i++){
-		csr32w(c, Ral+i*8, 0);
-		csr32w(c, Rah+i*8, 0);
-	}
-	memset(c->mta, 0, sizeof c->mta);
-	for(i = 0; i < 128; i++)
-		csr32w(c, Mta+i*4, 0);
-	csr32w(c, Fcal, 0x00C28001);
-	csr32w(c, Fcah, 0x00000100);
-	csr32w(c, Fct,  0x00008808);
-	csr32w(c, Fcttv, 0x00000100);
-	csr32w(c, Fcrtl, c->fcrtl);
-	csr32w(c, Fcrth, c->fcrth);
-	return 0;
-}
-
-static void
-i82563init(Ether *)
-{
-	Ctlr *c;
-	Pcidev *p;
-
-	print("i82563init\n");
-	p = 0;
-	while(nports < nelem(ports) && (p = pcimatch(p, 0x8086, 0x1096))){
-		c = ports + nports;
-		memset(c, 0, sizeof *c);
-		c->pcidev = p;
-		c->id = p->did<<16 | p->vid;
-
-		c->port = p->mem[0].bar & ~0xf;
-		c->nic = (int*)upamalloc(c->port, p->mem[0].size, 0);
-		c->cls = pcicfgr8(p, PciCLS) << 2;
-		switch(c->cls){
-		default:
-			print("i82563: unexpected CLS - %d\n", c->cls);
-		case 0x08<<2:
-		case 0x10<<2:
-			break;
-		case 0x00<<2:
-		case 0xFF<<2:
-			print("i82563: unusable CLS\n");
-			continue;
-		}
-		if(reset(c))
-			continue;
-		pcisetbme(p);
-		print("82563 %d irq %d Ea %E\n", nports, p->intl,
-			ports[nports].ra);
-		nports++;
-	}
-}
-
-int
-i82563reset(Ether *e)
-{
-	int i;
-	static int once;
-
-	if(once++ == 0)
-		i82563init(e);
-	for(i = 0; i < nports; i++)
-		if (!ports[i].active &&
-		    (e->port == 0 || e->port == ports[i].port))
-			break;
-	if(i == nports)
-		return -1;
-	ports[i].active = 1;
-	e->ctlr = ports+i;
-	e->port = ports[i].port;
-	e->irq =  ports[i].pcidev->intl;
-	e->tbdf = ports[i].pcidev->tbdf;
-	e->mbps = 1000;
-	memmove(e->ea, ports[i].ra, Easize);
-	e->attach = i82563attach;
-	e->transmit = i82563transmit;
-	e->interrupt = i82563interrupt;
-
-	return 0;
-}

+ 0 - 1136
sys/src/fs/pc/ether83815.c

@@ -1,1136 +0,0 @@
-/*
- * National Semiconductor DP83815
- *
- * Supports only internal PHY and has been tested on:
- *	Netgear FA311TX (using Netgear DS108 10/100 hub)
- *	SiS 900 (works under light load only)
- * To do:
- *	check Ethernet address;
- *	test autonegotiation on 10 Mbit, and 100 Mbit full duplex;
- *	external PHY via MII (should be common code for MII);
- *	thresholds;
- *	ring sizing;
- *	physical link changes/disconnect;
- *	push initialisation back to attach.
- *
- * C H Forsyth, forsyth@vitanuova.com, 18th June 2001.
- */
-
-#ifdef FS
-#include "all.h"
-#include "io.h"
-#include "mem.h"
-#include "../ip/ip.h"
-#else				/* FS */
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "io.h"
-#include "../port/error.h"
-#include "../port/netif.h"
-#endif				/* FS */
-#include "etherif.h"
-#include "compat.h"
-
-#define DEBUG		(0)
-#define debug		if(DEBUG)print
-
-enum {
-	Nrde		= 64,
-	Ntde		= 64,
-};
-
-#define Rbsz		ROUNDUP(sizeof(Etherpkt)+4, 4)
-
-typedef struct Des {
-	ulong	next;
-	int	cmdsts;
-	ulong	addr;
-	Block*	bp;
-} Des;
-
-enum {	/* cmdsts */
-	Own	= 1<<31,	/* set by data producer to hand to consumer */
-	More	= 1<<30,	/* more of packet in next descriptor */
-	Intr	= 1<<29,	/* interrupt when device is done with it */
-	Supcrc	= 1<<28,	/* suppress crc on transmit */
-	Inccrc	= 1<<28,	/* crc included on receive (always) */
-	Ok	= 1<<27,	/* packet ok */
-	Size	= 0xFFF,	/* packet size in bytes */
-
-	/* transmit */
-	Txa	= 1<<26,	/* transmission aborted */
-	Tfu	= 1<<25,	/* transmit fifo underrun */
-	Crs	= 1<<24,	/* carrier sense lost */
-	Td	= 1<<23,	/* transmission deferred */
-	Ed	= 1<<22,	/* excessive deferral */
-	Owc	= 1<<21,	/* out of window collision */
-	Ec	= 1<<20,	/* excessive collisions */
-	/* 19-16 collision count */
-
-	/* receive */
-	Rxa	= 1<<26,	/* receive aborted (same as Rxo) */
-	Rxo	= 1<<25,	/* receive overrun */
-	Dest	= 3<<23,	/* destination class */
-	  Drej=	0<<23,		/* packet was rejected */
-	  Duni=	1<<23,		/* unicast */
-	  Dmulti=	2<<23,		/* multicast */
-	  Dbroad=	3<<23,		/* broadcast */
-	Long = 1<<22,		/* too long packet received */
-	Runt =  1<<21,		/* packet less than 64 bytes */
-	Ise =	1<<20,		/* invalid symbol */
-	Crce =	1<<19,		/* invalid crc */
-	Fae =	1<<18,		/* frame alignment error */
-	Lbp =	1<<17,		/* loopback packet */
-	Col =	1<<16,		/* collision during receive */
-};
-
-enum {				/* PCI vendor & device IDs */
-	Nat83815	= (0x0020<<16)|0x100B,
-	SiS = 	0x1039,
-	SiS900 =	(0x0900<<16)|SiS,
-	SiS7016 =	(0x7016<<16)|SiS,
-
-	SiS630bridge	= 0x0008,
-
-	/* SiS 900 PCI revision codes */
-	SiSrev630s =	0x81,
-	SiSrev630e =	0x82,
-	SiSrev630ea1 =	0x83,
-
-	SiSeenodeaddr =	8,		/* short addr of SiS eeprom mac addr */
-	SiS630eenodeaddr =	9,	/* likewise for the 630 */
-	Nseenodeaddr =	6,		/* " for NS eeprom */
-};
-
-typedef struct Ctlr Ctlr;
-typedef struct Ctlr {
-	int	port;
-	Pcidev*	pcidev;
-	Ctlr*	next;
-	int	active;
-	int	id;			/* (pcidev->did<<16)|pcidev->vid */
-
-	ushort	srom[0xB+1];
-	uchar	sromea[Eaddrlen];	/* MAC address */
-
-	uchar	fd;			/* option or auto negotiation */
-
-	int	mbps;
-
-	Lock	lock;
-
-	Des*	rdr;			/* receive descriptor ring */
-	int	nrdr;			/* size of rdr */
-	int	rdrx;			/* index into rdr */
-
-	Lock	tlock;
-	Des*	tdr;			/* transmit descriptor ring */
-	int	ntdr;			/* size of tdr */
-	int	tdrh;			/* host index into tdr */
-	int	tdri;			/* interface index into tdr */
-	int	ntq;			/* descriptors active */
-	int	ntqmax;
-
-	ulong	rxa;			/* receive statistics */
-	ulong	rxo;
-	ulong	rlong;
-	ulong	runt;
-	ulong	ise;
-	ulong	crce;
-	ulong	fae;
-	ulong	lbp;
-	ulong	col;
-	ulong	rxsovr;
-	ulong	rxorn;
-
-	ulong	txa;			/* transmit statistics */
-	ulong	tfu;
-	ulong	crs;
-	ulong	td;
-	ulong	ed;
-	ulong	owc;
-	ulong	ec;
-	ulong	txurn;
-
-	ulong	dperr;			/* system errors */
-	ulong	rmabt;
-	ulong	rtabt;
-	ulong	sserr;
-	ulong	rxsover;
-} Ctlr;
-
-static Ctlr* ctlrhead;
-static Ctlr* ctlrtail;
-
-enum {
-	/* registers (could memory map) */
-	Rcr=	0x00,		/* command register */
-	  Rst=		1<<8,
-	  Rxr=		1<<5,	/* receiver reset */
-	  Txr=		1<<4,	/* transmitter reset */
-	  Rxd=		1<<3,	/* receiver disable */
-	  Rxe=		1<<2,	/* receiver enable */
-	  Txd=		1<<1,	/* transmitter disable */
-	  Txe=		1<<0,	/* transmitter enable */
-	Rcfg=	0x04,		/* configuration */
-	  Lnksts=	1<<31,	/* link good */
-	  Speed100=	1<<30,	/* 100 Mb/s link */
-	  Fdup=		1<<29,	/* full duplex */
-	  Pol=		1<<28,	/* polarity reversal (10baseT) */
-	  Aneg_dn=	1<<27,	/* autonegotiation done */
-	  Pint_acen=	1<<17,	/* PHY interrupt auto clear enable */
-	  Pause_adv=	1<<16,	/* advertise pause during auto neg */
-	  Paneg_ena=	1<<13,	/* auto negotiation enable */
-	  Paneg_all=	7<<13,	/* auto negotiation enable 10/100 half & full */
-	  Ext_phy=	1<<12,	/* enable MII for external PHY */
-	  Phy_rst=	1<<10,	/* reset internal PHY */
-	  Phy_dis=	1<<9,	/* disable internal PHY (eg, low power) */
-	  Req_alg=	1<<7,	/* PCI bus request: set means less aggressive */
-	  Sb=		1<<6,	/* single slot back-off not random */
-	  Pow=		1<<5,	/* out of window timer selection */
-	  Exd=		1<<4,	/* disable excessive deferral timer */
-	  Pesel=	1<<3,	/* parity error algorithm selection */
-	  Brom_dis=	1<<2,	/* disable boot rom interface */
-	  Bem=		1<<0,	/* big-endian mode */
-	Rmear=	0x08,		/* eeprom access */
-	  Mdc=		1<<6,	/* MII mangement check */
-	  Mddir=	1<<5,	/* MII management direction */
-	  Mdio=		1<<4,	/* MII mangement data */
-	  Eesel=	1<<3,	/* EEPROM chip select */
-	  Eeclk=	1<<2,	/* EEPROM clock */
-	  Eedo=		1<<1,	/* EEPROM data out (from chip) */
-	  Eedi=		1<<0,	/* EEPROM data in (to chip) */
-	Rptscr=	0x0C,		/* pci test control */
-	Risr=	0x10,		/* interrupt status */
-	  Txrcmp=	1<<25,	/* transmit reset complete */
-	  Rxrcmp=	1<<24,	/* receiver reset complete */
-	  Dperr=	1<<23,	/* detected parity error */
-	  Sserr=	1<<22,	/* signalled system error */
-	  Rmabt=	1<<21,	/* received master abort */
-	  Rtabt=	1<<20,	/* received target abort */
-	  Rxsovr=	1<<16,	/* RX status FIFO overrun */
-	  Hiberr=	1<<15,	/* high bits error set (OR of 25-16) */
-	  Phy=		1<<14,	/* PHY interrupt */
-	  Pme=		1<<13,	/* power management event (wake online) */
-	  Swi=		1<<12,	/* software interrupt */
-	  Mib=		1<<11,	/* MIB service */
-	  Txurn=	1<<10,	/* TX underrun */
-	  Txidle=	1<<9,	/* TX idle */
-	  Txerr=	1<<8,	/* TX packet error */
-	  Txdesc=	1<<7,	/* TX descriptor (with Intr bit done) */
-	  Txok=		1<<6,	/* TX ok */
-	  Rxorn=	1<<5,	/* RX overrun */
-	  Rxidle=	1<<4,	/* RX idle */
-	  Rxearly=	1<<3,	/* RX early threshold */
-	  Rxerr=	1<<2,	/* RX packet error */
-	  Rxdesc=	1<<1,	/* RX descriptor (with Intr bit done) */
-	  Rxok=		1<<0,	/* RX ok */
-	Rimr=	0x14,		/* interrupt mask */
-	Rier=	0x18,		/* interrupt enable */
-	  Ie=		1<<0,	/* interrupt enable */
-	Rtxdp=	0x20,		/* transmit descriptor pointer */
-	Rtxcfg=	0x24,		/* transmit configuration */
-	  Csi=		1<<31,	/* carrier sense ignore (needed for full duplex) */
-	  Hbi=		1<<30,	/* heartbeat ignore (needed for full duplex) */
-	  Atp=		1<<28,	/* automatic padding of runt packets */
-	  Mxdma=	7<<20,	/* maximum dma transfer field */
-	  Mxdma32=	4<<20,	/* 4x32-bit words (32 bytes) */
-	  Mxdma64=	5<<20,	/* 8x32-bit words (64 bytes) */
-	  Flth=		0x3F<<8,/* Tx fill threshold, units of 32 bytes (must be > Mxdma) */
-	  Drth=		0x3F<<0,/* Tx drain threshold (units of 32 bytes) */
-	  Flth128=	4<<8,	/* fill at 128 bytes */
-	/* seems to be the same on SiS 900; maybe use larger value @ 100Mb/s */
-	  Drth512=	16<<0,	/* drain at 512 bytes */
-	Rrxdp=	0x30,		/* receive descriptor pointer */
-	Rrxcfg=	0x34,		/* receive configuration */
-	  Atx=		1<<28,	/* accept transmit packets (needed for full duplex) */
-	  Rdrth=	0x1F<<1,/* Rx drain threshold (units of 32 bytes) */
-	  Rdrth64=	2<<1,	/* drain at 64 bytes */
-	Rccsr=	0x3C,		/* CLKRUN control/status */
-	  Pmests=	1<<15,	/* PME status */
-	Rwcsr=	0x40,		/* wake on lan control/status */
-	Rpcr=	0x44,		/* pause control/status */
-	/* TODO: different on SiS, but does it matter? Rfen - Aau are same. */
-	Rrfcr=	0x48,		/* receive filter/match control */
-	  Rfen=		1<<31,	/* receive filter enable */
-	  Aab=		1<<30,	/* accept all broadcast */
-	  Aam=		1<<29,	/* accept all multicast */
-	  Aau=		1<<28,	/* accept all unicast */
-	  Apm=		1<<27,	/* accept on perfect match */
-	  Apat=		0xF<<23,/* accept on pattern match */
-	  Aarp=		1<<22,	/* accept ARP */
-	  Mhen=		1<<21,	/* multicast hash enable */
-	  Uhen=		1<<20,	/* unicast hash enable */
-	  Ulm=		1<<19,	/* U/L bit mask */
-				/* bits 0-9 are rfaddr */
-	Rrfdr=	0x4C,		/* receive filter/match data */
-	Rbrar=	0x50,		/* boot rom address */
-	Rbrdr=	0x54,		/* boot rom data */
-	Rsrr=	0x58,		/* silicon revision */
-	Rmibc=	0x5C,		/* MIB control */
-				/* 60-78 MIB data */
-
-	/* PHY registers */
-	Rbmcr=	0x80,		/* basic mode configuration */
-	  Reset=	1<<15,
-	  Sel100=	1<<13,	/* select 100Mb/sec if no auto neg */
-	  Anena=	1<<12,	/* auto negotiation enable */
-	  Anrestart=	1<<9,	/* restart auto negotiation */
-	  Selfdx=	1<<8,	/* select full duplex if no auto neg */
-	Rbmsr=	0x84,		/* basic mode status */
-	  Ancomp=	1<<5,	/* autonegotiation complete */
-	Rphyidr1= 0x88,
-	Rphyidr2= 0x8C,
-	Ranar=	0x90,		/* autonegotiation advertisement */
-	Ranlpar= 0x94,		/* autonegotiation link partner ability */
-	Raner=	0x98,		/* autonegotiation expansion */
-	Rannptr= 0x9C,		/* autonegotiation next page TX */
-	Rphysts= 0xC0,		/* PHY status */
-	Rmicr=	0xC4,		/* MII control */
-	  Inten=	1<<1,	/* PHY interrupt enable */
-	Rmisr=	0xC8,		/* MII status */
-	Rfcscr=	0xD0,		/* false carrier sense counter */
-	Rrecr=	0xD4,		/* receive error counter */
-	Rpcsr=	0xD8,		/* 100Mb config/status */
-	Rphycr=	0xE4,		/* PHY control */
-	Rtbscr=	0xE8,		/* 10BaseT status/control */
-};
-
-/*
- * eeprom addresses
- * 	7 to 9 (16 bit words): mac address, shifted and reversed
- */
-
-#define csr32r(c, r)	(inl((c)->port+(r)))
-#define csr32w(c, r, l)	(outl((c)->port+(r), (ulong)(l)))
-#define csr16r(c, r)	(ins((c)->port+(r)))
-#define csr16w(c, r, l)	(outs((c)->port+(r), (ulong)(l)))
-
-static void
-dumpcregs(Ctlr *ctlr)
-{
-	int i;
-
-	for(i=0; i<=0x5C; i+=4)
-		print("%2.2ux %8.8lux\n", i, csr32r(ctlr, i));
-}
-
-static void
-promiscuous(void* arg, int on)
-{
-	Ctlr *ctlr;
-	ulong w;
-
-	ctlr = ((Ether*)arg)->ctlr;
-	ilock(&ctlr->lock);
-	w = csr32r(ctlr, Rrfcr);
-	if(on != ((w&Aau)!=0)){
-		csr32w(ctlr, Rrfcr, w & ~Rfen);
-		csr32w(ctlr, Rrfcr, Rfen | (w ^ Aau));
-	}
-	iunlock(&ctlr->lock);
-}
-
-static void
-attach(Ether* ether)
-{
-	Ctlr *ctlr;
-
-	ctlr = ether->ctlr;
-	ilock(&ctlr->lock);
-	if(0)
-		dumpcregs(ctlr);
-	csr32w(ctlr, Rcr, Rxe);
-	iunlock(&ctlr->lock);
-}
-
-#ifndef FS
-static long
-ifstat(Ether* ether, void* a, long n, ulong offset)
-{
-	Ctlr *ctlr;
-	char *buf, *p;
-	int i, l, len;
-
-	ctlr = ether->ctlr;
-
-	ether->crcs = ctlr->crce;
-	ether->frames = ctlr->runt+ctlr->ise+ctlr->rlong+ctlr->fae;
-	ether->buffs = ctlr->rxorn+ctlr->tfu;
-	ether->overflows = ctlr->rxsovr;
-
-	if(n == 0)
-		return 0;
-
-	p = malloc(READSTR);
-	l = snprint(p, READSTR, "Rxa: %lud\n", ctlr->rxa);
-	l += snprint(p+l, READSTR-l, "Rxo: %lud\n", ctlr->rxo);
-	l += snprint(p+l, READSTR-l, "Rlong: %lud\n", ctlr->rlong);
-	l += snprint(p+l, READSTR-l, "Runt: %lud\n", ctlr->runt);
-	l += snprint(p+l, READSTR-l, "Ise: %lud\n", ctlr->ise);
-	l += snprint(p+l, READSTR-l, "Fae: %lud\n", ctlr->fae);
-	l += snprint(p+l, READSTR-l, "Lbp: %lud\n", ctlr->lbp);
-	l += snprint(p+l, READSTR-l, "Tfu: %lud\n", ctlr->tfu);
-	l += snprint(p+l, READSTR-l, "Txa: %lud\n", ctlr->txa);
-	l += snprint(p+l, READSTR-l, "CRC Error: %lud\n", ctlr->crce);
-	l += snprint(p+l, READSTR-l, "Collision Seen: %lud\n", ctlr->col);
-	l += snprint(p+l, READSTR-l, "Frame Too Long: %lud\n", ctlr->rlong);
-	l += snprint(p+l, READSTR-l, "Runt Frame: %lud\n", ctlr->runt);
-	l += snprint(p+l, READSTR-l, "Rx Underflow Error: %lud\n", ctlr->rxorn);
-	l += snprint(p+l, READSTR-l, "Tx Underrun: %lud\n", ctlr->txurn);
-	l += snprint(p+l, READSTR-l, "Excessive Collisions: %lud\n", ctlr->ec);
-	l += snprint(p+l, READSTR-l, "Late Collision: %lud\n", ctlr->owc);
-	l += snprint(p+l, READSTR-l, "Loss of Carrier: %lud\n", ctlr->crs);
-	l += snprint(p+l, READSTR-l, "Parity: %lud\n", ctlr->dperr);
-	l += snprint(p+l, READSTR-l, "Aborts: %lud\n", ctlr->rmabt+ctlr->rtabt);
-	l += snprint(p+l, READSTR-l, "RX Status overrun: %lud\n", ctlr->rxsover);
-	snprint(p+l, READSTR-l, "ntqmax: %d\n", ctlr->ntqmax);
-	ctlr->ntqmax = 0;
-	buf = a;
-	len = readstr(offset, buf, n, p);
-	if(offset > l)
-		offset -= l;
-	else
-		offset = 0;
-	buf += len;
-	n -= len;
-
-	l = snprint(p, READSTR, "srom:");
-	for(i = 0; i < nelem(ctlr->srom); i++){
-		if(i && ((i & 0x0F) == 0))
-			l += snprint(p+l, READSTR-l, "\n     ");
-		l += snprint(p+l, READSTR-l, " %4.4uX", ctlr->srom[i]);
-	}
-
-	snprint(p+l, READSTR-l, "\n");
-	len += readstr(offset, buf, n, p);
-	free(p);
-
-	return len;
-}
-#endif
-
-static void
-txstart(Ether* ether)
-{
-	Ctlr *ctlr;
-	Block *bp;
-	Des *des;
-	int started;
-
-	ctlr = ether->ctlr;
-	started = 0;
-	while(ctlr->ntq < ctlr->ntdr-1){
-		bp = etheroq(ether);
-		if(bp == nil)
-			break;
-		des = &ctlr->tdr[ctlr->tdrh];
-		des->bp = bp;
-		des->addr = PADDR(bp->rp);
-		ctlr->ntq++;
-		coherence();
-		des->cmdsts = Own | BLEN(bp);
-		ctlr->tdrh = NEXT(ctlr->tdrh, ctlr->ntdr);
-		started = 1;
-	}
-	if(started){
-		coherence();
-		csr32w(ctlr, Rcr, Txe);	/* prompt */
-	}
-
-	if(ctlr->ntq > ctlr->ntqmax)
-		ctlr->ntqmax = ctlr->ntq;
-}
-
-static void
-transmit(Ether* ether)
-{
-	Ctlr *ctlr;
-
-	ctlr = ether->ctlr;
-	ilock(&ctlr->tlock);
-	txstart(ether);
-	iunlock(&ctlr->tlock);
-}
-
-static void
-txrxcfg(Ctlr *ctlr, int txdrth)
-{
-	ulong rx, tx;
-
-	rx = csr32r(ctlr, Rrxcfg);
-	tx = csr32r(ctlr, Rtxcfg);
-	if(ctlr->fd){
-		rx |= Atx;
-		tx |= Csi | Hbi;
-	}else{
-		rx &= ~Atx;
-		tx &= ~(Csi | Hbi);
-	}
-	tx &= ~(Mxdma|Drth|Flth);
-	tx |= Mxdma64 | Flth128 | txdrth;
-	csr32w(ctlr, Rtxcfg, tx);
-	rx &= ~(Mxdma|Rdrth);
-	rx |= Mxdma64 | Rdrth64;
-	csr32w(ctlr, Rrxcfg, rx);
-}
-
-static void
-interrupt(Ureg*, void* arg)
-{
-	Ctlr *ctlr;
-	Ether *ether;
-	int len, status, cmdsts;
-	Des *des;
-	Block *bp;
-
-	ether = arg;
-	ctlr = ether->ctlr;
-
-	while((status = csr32r(ctlr, Risr)) != 0){
-
-		status &= ~(Pme|Mib);
-
-		if(status & Hiberr){
-			if(status & Rxsovr)
-				ctlr->rxsover++;
-			if(status & Sserr)
-				ctlr->sserr++;
-			if(status & Dperr)
-				ctlr->dperr++;
-			if(status & Rmabt)
-				ctlr->rmabt++;
-			if(status & Rtabt)
-				ctlr->rtabt++;
-			status &= ~(Hiberr|Txrcmp|Rxrcmp|Rxsovr|Dperr|Sserr|Rmabt|Rtabt);
-		}
-
-		/*
-		 * Received packets.
-		 */
-		if(status & (Rxdesc|Rxok|Rxerr|Rxearly|Rxorn)){
-			des = &ctlr->rdr[ctlr->rdrx];
-			while((cmdsts = des->cmdsts) & Own){
-				if((cmdsts&Ok) == 0){
-					if(cmdsts & Rxa)
-						ctlr->rxa++;
-					if(cmdsts & Rxo)
-						ctlr->rxo++;
-					if(cmdsts & Long)
-						ctlr->rlong++;
-					if(cmdsts & Runt)
-						ctlr->runt++;
-					if(cmdsts & Ise)
-						ctlr->ise++;
-					if(cmdsts & Crce)
-						ctlr->crce++;
-					if(cmdsts & Fae)
-						ctlr->fae++;
-					if(cmdsts & Lbp)
-						ctlr->lbp++;
-					if(cmdsts & Col)
-						ctlr->col++;
-				}
-				else if(bp = iallocb(Rbsz)){
-					len = (cmdsts&Size)-4;
-					if(len <= 0){
-						debug("ns83815: packet len %d <=0\n", len);
-						freeb(des->bp);
-					}else{
-						SETWPCNT(des->bp, len);
-						ETHERIQ(ether, des->bp, 1);
-					}
-					des->bp = bp;
-					des->addr = PADDR(bp->rp);
-					coherence();
-				}else{
-					debug("ns83815: interrupt: iallocb for input buffer failed\n");
-					des->bp->next = 0;
-				}
-
-				des->cmdsts = Rbsz;
-				coherence();
-
-				ctlr->rdrx = NEXT(ctlr->rdrx, ctlr->nrdr);
-				des = &ctlr->rdr[ctlr->rdrx];
-			}
-			status &= ~(Rxdesc|Rxok|Rxerr|Rxearly|Rxorn);
-		}
-
-		/*
-		 * Check the transmit side:
-		 *	check for Transmit Underflow and Adjust
-		 *	the threshold upwards;
-		 *	free any transmitted buffers and try to
-		 *	top-up the ring.
-		 */
-		if(status & Txurn){
-			ctlr->txurn++;
-			ilock(&ctlr->lock);
-			/* change threshold */
-			iunlock(&ctlr->lock);
-			status &= ~(Txurn);
-		}
-
-		ilock(&ctlr->tlock);
-		while(ctlr->ntq){
-			des = &ctlr->tdr[ctlr->tdri];
-			cmdsts = des->cmdsts;
-			if(cmdsts & Own)
-				break;
-
-			if((cmdsts & Ok) == 0){
-				if(cmdsts & Txa)
-					ctlr->txa++;
-				if(cmdsts & Tfu)
-					ctlr->tfu++;
-				if(cmdsts & Td)
-					ctlr->td++;
-				if(cmdsts & Ed)
-					ctlr->ed++;
-				if(cmdsts & Owc)
-					ctlr->owc++;
-				if(cmdsts & Ec)
-					ctlr->ec++;
-#ifndef FS
-				ether->oerrs++;
-#endif
-			}
-
-			freeb(des->bp);
-			des->bp = nil;
-			des->cmdsts = 0;
-
-			ctlr->ntq--;
-			ctlr->tdri = NEXT(ctlr->tdri, ctlr->ntdr);
-		}
-		txstart(ether);
-		iunlock(&ctlr->tlock);
-
-		status &= ~(Txurn|Txidle|Txerr|Txdesc|Txok);
-
-		/*
-		 * Anything left not catered for?
-		 */
-		if(status)
-			print("#l%d: status %8.8uX\n", ether->ctlrno, status);
-	}
-}
-
-static void
-ctlrinit(Ether* ether)
-{
-	Ctlr *ctlr;
-	Des *des, *last;
-
-	ctlr = ether->ctlr;
-
-	/*
-	 * Allocate suitable aligned descriptors
-	 * for the transmit and receive rings;
-	 * initialise the receive ring;
-	 * initialise the transmit ring;
-	 * unmask interrupts and start the transmit side.
-	 */
-	des = xspanalloc((ctlr->nrdr+ctlr->ntdr)*sizeof(Des), 32, 0);
-	if(des == nil) {
-		print("ns83815: ctlrinit: iallocb of descs. failed\n");
-		return;
-	}
-	ctlr->tdr = des;
-	ctlr->rdr = des+ctlr->ntdr;
-
-	last = nil;
-	for(des = ctlr->rdr; des < &ctlr->rdr[ctlr->nrdr]; des++){
-		des->bp = iallocb(Rbsz);
-		if(des->bp == nil)
-			error(Enomem);
-		des->cmdsts = Rbsz;
-		des->addr = PADDR(des->bp->rp);
-		if(last != nil)
-			last->next = PADDR(des);
-		last = des;
-	}
-	ctlr->rdr[ctlr->nrdr-1].next = PADDR(ctlr->rdr);
-	ctlr->rdrx = 0;
-	csr32w(ctlr, Rrxdp, PADDR(ctlr->rdr));
-
-	last = nil;
-	for(des = ctlr->tdr; des < &ctlr->tdr[ctlr->ntdr]; des++){
-		des->cmdsts = 0;
-		des->bp = nil;
-		des->addr = ~0;
-		if(last != nil)
-			last->next = PADDR(des);
-		last = des;
-	}
-	ctlr->tdr[ctlr->ntdr-1].next = PADDR(ctlr->tdr);
-	ctlr->tdrh = 0;
-	ctlr->tdri = 0;
-	csr32w(ctlr, Rtxdp, PADDR(ctlr->tdr));
-
-	txrxcfg(ctlr, Drth512);
-
-	csr32w(ctlr, Rimr, Dperr|Sserr|Rmabt|Rtabt|Rxsovr|Hiberr|Txurn|Txerr|Txdesc|Txok|Rxorn|Rxerr|Rxdesc|Rxok);	/* Phy|Pme|Mib */
-	csr32r(ctlr, Risr);	/* clear status */
-	csr32w(ctlr, Rier, Ie);
-err:
-	;
-}
-
-static void
-eeclk(Ctlr *ctlr, int clk)
-{
-	csr32w(ctlr, Rmear, Eesel | clk);
-	microdelay(2);
-}
-
-static void
-eeidle(Ctlr *ctlr)
-{
-	int i;
-
-	eeclk(ctlr, 0);
-	eeclk(ctlr, Eeclk);
-	for(i=0; i<25; i++){
-		eeclk(ctlr, 0);
-		eeclk(ctlr, Eeclk);
-	}
-	eeclk(ctlr, 0);
-	csr32w(ctlr, Rmear, 0);
-	microdelay(2);
-}
-
-static int
-eegetw(Ctlr *ctlr, int a)
-{
-	int d, i, w, v;
-
-	eeidle(ctlr);
-	eeclk(ctlr, 0);
-	eeclk(ctlr, Eeclk);
-	d = 0x180 | a;
-	for(i=0x400; i; i>>=1){
-		v = (d & i) ? Eedi : 0;
-		eeclk(ctlr, v);
-		eeclk(ctlr, Eeclk|v);
-	}
-	eeclk(ctlr, 0);
-
-	w = 0;
-	for(i=0x8000; i; i >>= 1){
-		eeclk(ctlr, Eeclk);
-		if(csr32r(ctlr, Rmear) & Eedo)
-			w |= i;
-		microdelay(2);
-		eeclk(ctlr, 0);
-	}
-	eeidle(ctlr);
-	return w;
-}
-
-static void
-resetctlr(Ctlr *ctlr)
-{
-	int i;
-
-	csr32w(ctlr, Rcr, Rst);
-	for(i=0;; i++){
-		if(i > 100)
-			panic("ns83815: soft reset did not complete");
-		microdelay(250);
-		if((csr32r(ctlr, Rcr) & Rst) == 0)
-			break;
-		delay(1);
-	}
-}
-
-static void
-shutdown(Ether* ether)
-{
-	Ctlr *ctlr = ether->ctlr;
-
-print("ether83815 shutting down\n");
-	csr32w(ctlr, Rcr, Rxd|Txd);	/* disable transceiver */
-	resetctlr(ctlr);
-}
-
-static void
-softreset(Ctlr* ctlr, int resetphys)
-{
-	int i, w;
-
-	/*
-	 * Soft-reset the controller
-	 */
-	resetctlr(ctlr);
-	csr32w(ctlr, Rccsr, Pmests);
-	csr32w(ctlr, Rccsr, 0);
-	csr32w(ctlr, Rcfg, csr32r(ctlr, Rcfg) | Pint_acen);
-
-	if(resetphys){
-		/*
-		 * Soft-reset the PHY
-		 */
-		csr32w(ctlr, Rbmcr, Reset);
-		for(i=0;; i++){
-			if(i > 100)
-				panic("ns83815: PHY soft reset time out");
-			if((csr32r(ctlr, Rbmcr) & Reset) == 0)
-				break;
-			delay(1);
-		}
-	}
-
-	/*
-	 * Initialisation values, in sequence (see 4.4 Recommended Registers Configuration)
-	 */
-	csr16w(ctlr, 0xCC, 0x0001);	/* PGSEL */
-	csr16w(ctlr, 0xE4, 0x189C);	/* PMCCSR */
-	csr16w(ctlr, 0xFC, 0x0000);	/* TSTDAT */
-	csr16w(ctlr, 0xF4, 0x5040);	/* DSPCFG */
-	csr16w(ctlr, 0xF8, 0x008C);	/* SDCFG */
-
-	/*
-	 * Auto negotiate
-	 */
-	w = csr16r(ctlr, Rbmsr);	/* clear latched bits */
-	debug("anar: %4.4ux\n", csr16r(ctlr, Ranar));
-	csr16w(ctlr, Rbmcr, Anena);
-	if(csr16r(ctlr, Ranar) == 0 || (csr32r(ctlr, Rcfg) & Aneg_dn) == 0){
-		csr16w(ctlr, Rbmcr, Anena|Anrestart);
-		for(i=0;; i++){
-			if(i > 6000){
-				print("ns83815: auto neg timed out\n");
-				break;
-			}
-			if((w = csr16r(ctlr, Rbmsr)) & Ancomp)
-				break;
-			delay(1);
-		}
-		debug("%d ms\n", i);
-		w &= 0xFFFF;
-		debug("bmsr: %4.4ux\n", w);
-	}
-	USED(w);
-	debug("anar: %4.4ux\n", csr16r(ctlr, Ranar));
-	debug("anlpar: %4.4ux\n", csr16r(ctlr, Ranlpar));
-	debug("aner: %4.4ux\n", csr16r(ctlr, Raner));
-	debug("physts: %4.4ux\n", csr16r(ctlr, Rphysts));
-	debug("tbscr: %4.4ux\n", csr16r(ctlr, Rtbscr));
-}
-
-static int
-media(Ether* ether)
-{
-	Ctlr* ctlr;
-	ulong cfg;
-
-	ctlr = ether->ctlr;
-	cfg = csr32r(ctlr, Rcfg);
-	ctlr->fd = (cfg & Fdup) != 0;
-	if(cfg & Speed100)
-		return 100;
-	if((cfg & Lnksts) == 0)
-		return 100;	/* no link: use 100 to ensure larger queues */
-	return 10;
-}
-
-static char* mediatable[9] = {
-	"10BASE-T",				/* TP */
-	"10BASE-2",				/* BNC */
-	"10BASE-5",				/* AUI */
-	"100BASE-TX",
-	"10BASE-TFD",
-	"100BASE-TXFD",
-	"100BASE-T4",
-	"100BASE-FX",
-	"100BASE-FXFD",
-};
-
-static int
-is630(ulong id, Pcidev *p)
-{
-	if(id == SiS900)
-		switch (p->rid) {
-		case SiSrev630s:
-		case SiSrev630e:
-	  	case SiSrev630ea1:
-			return 1;
-		}
-	return 0;
-}
-
-enum {
-	MagicReg = 0x48,
-	MagicRegSz = 1,
-	Magicrden = 0x40,	/* read enable, apparently */
-	Paddr=		0x70,	/* address port */
-	Pdata=		0x71,	/* data port */
-	Pcinetctlr = 2,
-};
-
-/* rcmos() originally from LANL's SiS 900 driver's rcmos() */
-static int
-sisrdcmos(Ctlr *ctlr)
-{
-	int i;
-	unsigned reg;
-	ulong port;
-	Pcidev *p;
-
-	debug("ns83815: SiS 630 rev. %ux reading mac address from cmos\n", ctlr->pcidev->rid);
-	p = pcimatch(nil, SiS, SiS630bridge);
-	if(p == nil) {
-		print("ns83815: no SiS 630 rev. %ux bridge for mac addr\n",
-			ctlr->pcidev->rid);
-		return 0;
-	}
-	port = p->mem[0].bar & ~0x01;
-	debug("ns83815: SiS 630 rev. %ux reading mac addr from cmos via bridge at port 0x%lux\n", ctlr->pcidev->rid, port);
-
-	reg = pcicfgr8(p, MagicReg);
-	pcicfgw8(p, MagicReg, reg|Magicrden);
-
-	for (i = 0; i < Eaddrlen; i++) {
-		outb(port+Paddr, SiS630eenodeaddr + i);
-		ctlr->sromea[i] = inb(port+Pdata);
-	}
-
-	pcicfgw8(p, MagicReg, reg & ~Magicrden);
-	return 1;
-}
-
-/*
- * If this is a SiS 630E chipset with an embedded SiS 900 controller,
- * we have to read the MAC address from the APC CMOS RAM. - sez freebsd.
- * However, CMOS *is* NVRAM normally.  See devrtc.c:440, memory.c:88.
- */
-static void
-sissrom(Ctlr *ctlr)
-{
-	union {
-		uchar	eaddr[Eaddrlen];
-		ushort	alignment;
-	} ee;
-	int i, off = SiSeenodeaddr, cnt = sizeof ee.eaddr / sizeof(short);
-	ushort *shp = (ushort *)ee.eaddr;
-
-	if(!is630(ctlr->id, ctlr->pcidev) || !sisrdcmos(ctlr)) {
-		for (i = 0; i < cnt; i++)
-			*shp++ = eegetw(ctlr, off++);
-		memmove(ctlr->sromea, ee.eaddr, sizeof ctlr->sromea);
-	}
-}
-
-static void
-nssrom(Ctlr* ctlr)
-{
-	int i, j;
-
-	for(i = 0; i < nelem(ctlr->srom); i++)
-		ctlr->srom[i] = eegetw(ctlr, i);
-
-	/*
-	 * the MAC address is reversed, straddling word boundaries
-	 */
-	j = Nseenodeaddr*16 + 15;
-	for(i=0; i<48; i++){
-		ctlr->sromea[i>>3] |= ((ctlr->srom[j>>4] >> (15-(j&0xF))) & 1) << (i&7);
-		j++;
-	}
-}
-
-static void
-srom(Ctlr* ctlr)
-{
-	memset(ctlr->sromea, 0, sizeof(ctlr->sromea));
-	switch (ctlr->id) {
-	case SiS900:
-	case SiS7016:
-		sissrom(ctlr);
-		break;
-	case Nat83815:
-		nssrom(ctlr);
-		break;
-	default:
-		print("ns83815: srom: unknown id 0x%ux\n", ctlr->id);
-		break;
-	}
-}
-
-static void
-scanpci83815(void)
-{
-	Ctlr *ctlr;
-	Pcidev *p;
-	ulong id;
-
-	p = nil;
-	while(p = pcimatch(p, 0, 0)){
-		/* ccru is a short in the FS kernel, thus the cast to uchar */
-		if (p->ccrb != Pcinetctlr || (uchar)p->ccru != 0)
-			continue;		/* not a nic */
-		id = (p->did<<16)|p->vid;
-		switch(id){
-		default:
-			continue;
-		case Nat83815:
-		case SiS900:
-			break;
-		}
-
-		/*
-		 * bar[0] is the I/O port register address and
-		 * bar[1] is the memory-mapped register address.
-		 */
-		ctlr = mallocz(sizeof(Ctlr), 1);
-		ctlr->port = p->mem[0].bar & ~0x01;
-		ctlr->pcidev = p;
-		ctlr->id = id;
-
-		if(ioalloc(ctlr->port, p->mem[0].size, 0, "ns83815") < 0){
-			print("ns83815: port 0x%uX in use\n", ctlr->port);
-			free(ctlr);
-			continue;
-		}
-
-		softreset(ctlr, 0);
-		srom(ctlr);
-
-		if(ctlrhead != nil)
-			ctlrtail->next = ctlr;
-		else
-			ctlrhead = ctlr;
-		ctlrtail = ctlr;
-	}
-}
-
-/* multicast already on, don't need to do anything */
-static void
-multicast(void*, uchar*, int)
-{
-}
-
-int
-dp83815reset(Ether* ether)
-{
-	Ctlr *ctlr;
-	int i, x;
-	ulong ctladdr;
-	uchar ea[Eaddrlen];
-	static int scandone;
-
-	if(scandone == 0){
-		scanpci83815();
-		scandone = 1;
-	}
-
-	/*
-	 * Any adapter matches if no ether->port is supplied,
-	 * otherwise the ports must match.
-	 */
-	for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
-		if(ctlr->active)
-			continue;
-		if(ether->port == 0 || ether->port == ctlr->port){
-			ctlr->active = 1;
-			break;
-		}
-	}
-	if(ctlr == nil)
-		return -1;
-
-	ether->ctlr = ctlr;
-	ether->port = ctlr->port;
-	ether->irq = ctlr->pcidev->intl;
-	ether->tbdf = ctlr->pcidev->tbdf;
-
-	/*
-	 * Check if the adapter's station address is to be overridden.
-	 * If not, read it from the EEPROM and set in ether->ea prior to
-	 * loading the station address in the hardware.
-	 */
-	memset(ea, 0, Eaddrlen);
-	if(memcmp(ea, ether->ea, Eaddrlen) == 0)
-		memmove(ether->ea, ctlr->sromea, Eaddrlen);
-	for(i=0; i<Eaddrlen; i+=2){
-		x = ether->ea[i] | (ether->ea[i+1]<<8);
-		ctladdr = (ctlr->id == Nat83815? i: i<<15);
-		csr32w(ctlr, Rrfcr, ctladdr);
-		csr32w(ctlr, Rrfdr, x);
-	}
-	csr32w(ctlr, Rrfcr, Rfen|Apm|Aab|Aam);
-
-	ether->mbps = media(ether);
-
-	/*
-	 * Look for a medium override in case there's no autonegotiation
-	 * the autonegotiation fails.
-	 */
-
-	for(i = 0; i < ether->nopt; i++){
-		if(cistrcmp(ether->opt[i], "FD") == 0){
-			ctlr->fd = 1;
-			continue;
-		}
-		for(x = 0; x < nelem(mediatable); x++){
-			debug("compare <%s> <%s>\n", mediatable[x],
-				ether->opt[i]);
-			if(cistrcmp(mediatable[x], ether->opt[i]) == 0){
-				if(x != 4 && x >= 3)
-					ether->mbps = 100;
-				else
-					ether->mbps = 10;
-				switch(x){
-				default:
-					ctlr->fd = 0;
-					break;
-
-				case 0x04:		/* 10BASE-TFD */
-				case 0x05:		/* 100BASE-TXFD */
-				case 0x08:		/* 100BASE-FXFD */
-					ctlr->fd = 1;
-					break;
-				}
-				break;
-			}
-		}
-	}
-
-	/*
-	 * Initialise descriptor rings, ethernet address.
-	 */
-	ctlr->nrdr = Nrde;
-	ctlr->ntdr = Ntde;
-	pcisetbme(ctlr->pcidev);
-	ctlrinit(ether);
-
-	/*
-	 * Linkage to the generic ethernet driver.
-	 */
-	ether->attach = attach;
-	ether->transmit = transmit;
-	ether->interrupt = interrupt;
-#ifndef FS
-	ether->ifstat = ifstat;
-
-	ether->arg = ether;
-	ether->promiscuous = promiscuous;
-	ether->multicast = multicast;
-	ether->shutdown = shutdown;
-#endif
-	debug("ns83815: dp83815reset: done\n");
-	return 0;
-}
-
-#ifndef FS
-void
-ether83815link(void)
-{
-	addethercard("83815",  dp83815reset);
-}
-#endif

+ 0 - 1363
sys/src/fs/pc/ether83815.mii.c

@@ -1,1363 +0,0 @@
-/*
- * National Semiconductor DP83815
- *
- * Supports only internal PHY and has been tested on:
- *	Netgear FA311TX (using Netgear DS108 10/100 hub, and using switches)
- *	SiS 900 within SiS 630 (works under light load only)
- * To do:
- *	check Ethernet address;
- *	test autonegotiation on 10 Mbit, and 100 Mbit full duplex;
- *	thresholds;
- *	ring sizing;
- *	push initialisation back to attach.
- *
- * C H Forsyth, forsyth@vitanuova.com, 18th June 2001.
- * made to drive the SiS 900, including using common MII/PHY code,
- *	by Geoff Collyer, March 2003.
- */
-
-#ifdef FS
-#include "all.h"
-#include "io.h"
-#include "mem.h"
-#include "../ip/ip.h"
-#else				/* FS */
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "io.h"
-#include "../port/error.h"
-#include "../port/netif.h"
-#endif				/* FS */
-
-#include "etherif.h"
-#include "ethermii.h"
-
-#include "compat.h"
-
-enum {
-	Debug		= 0,
-	Nrde		= 64,
-	Ntde		= 64,
-	Rbsz		= ROUNDUP(sizeof(Etherpkt)+4, 4),
-};
-
-#define debug		if(Debug)print
-
-typedef struct Des {
-	ulong	next;
-	int	cmdsts;
-	ulong	addr;
-	Block*	bp;
-} Des;
-
-enum {	/* cmdsts */
-	Own		= 1<<31,	/* set by data producer to hand to consumer */
-	More	= 1<<30,	/* more of packet in next descriptor */
-	Intr		= 1<<29,	/* interrupt when device is done with it */
-	Supcrc	= 1<<28,	/* suppress crc on transmit */
-	Inccrc	= 1<<28,	/* crc included on receive (always) */
-	Ok		= 1<<27,	/* packet ok */
-	Size		= 0xFFF,	/* packet size in bytes */
-
-	/* transmit */
-	Txa	= 1<<26,	/* transmission aborted */
-	Tfu	= 1<<25,	/* transmit fifo underrun */
-	Crs	= 1<<24,	/* carrier sense lost */
-	Td	= 1<<23,	/* transmission deferred */
-	Ed	= 1<<22,	/* excessive deferral */
-	Owc	= 1<<21,	/* out of window collision */
-	Ec	= 1<<20,	/* excessive collisions */
-	/* 19-16 collision count */
-
-	/* receive */
-	Rxa	= 1<<26,	/* receive aborted (same as Rxo) */
-	Rxo	= 1<<25,	/* receive overrun */
-	Dest	= 3<<23,	/* destination class */
-	  Drej=	0<<23,		/* packet was rejected */
-	  Duni=	1<<23,		/* unicast */
-	  Dmulti=	2<<23,		/* multicast */
-	  Dbroad=	3<<23,		/* broadcast */
-	Long = 1<<22,	/* too long packet received */
-	Runt =  1<<21,	/* packet less than 64 bytes */
-	Ise =	1<<20,	/* invalid symbol */
-	Crce =	1<<19,	/* invalid crc */
-	Fae =	1<<18,	/* frame alignment error */
-	Lbp =	1<<17,	/* loopback packet */
-	Col =	1<<16,	/* collision during receive */
-};
-
-enum {
-	// PCI vendor & device IDs
-	NatSemi		= 0x100B,
-	Nat83815	=   (0x20<<16)|NatSemi,
-	SiS		= 0x1039,
-	SiS900		=  (0x900<<16)|SiS,
-	SiS7016		= (0x7016<<16)|SiS,
-	SiS630bridge	= 0x0008,
-
-	// SiS 900 PCI revision codes
-	SiSrev630s =	0x81,
-	SiSrev630e =	0x82,
-	SiSrev630ea1 =	0x83,
-
-	SiSeenodeaddr = 8,		// short addr of SiS eeprom mac addr
-	SiS630eenodeaddr = 9,		// likewise for the 630
-	Nseenodeaddr = 6,		// " for NS eeprom
-};
-
-typedef struct Ctlr Ctlr;
-typedef struct Ctlr {
-	int	port;
-	Pcidev*	pcidev;
-	Ctlr*	next;
-	int	active;
-	int	id;			/* (pcidev->did<<16)|pcidev->vid */
-
-	ushort	srom[0xB+1];
-	uchar	sromea[Eaddrlen];			/* MAC address */
-
-	uchar	fd;			/* option or auto negotiation */
-
-	int	mbps;
-
-	Lock	lock;
-	Mii*	mii;
-
-	Des*	rdr;			/* receive descriptor ring */
-	int	nrdr;			/* size of rdr */
-	int	rdrx;			/* index into rdr */
-
-	Lock	tlock;
-	Des*	tdr;			/* transmit descriptor ring */
-	int	ntdr;			/* size of tdr */
-	int	tdrh;			/* host index into tdr */
-	int	tdri;			/* interface index into tdr */
-	int	ntq;			/* descriptors active */
-	int	ntqmax;
-
-	ulong	rxa;			/* receive statistics */
-	ulong	rxo;
-	ulong	rlong;
-	ulong	runt;
-	ulong	ise;
-	ulong	crce;
-	ulong	fae;
-	ulong	lbp;
-	ulong	col;
-	ulong	rxsovr;
-	ulong	rxorn;
-
-	ulong	txa;			/* transmit statistics */
-	ulong	tfu;
-	ulong	crs;
-	ulong	td;
-	ulong	ed;
-	ulong	owc;
-	ulong	ec;
-	ulong	txurn;
-
-	ulong	dperr;		/* system errors */
-	ulong	rmabt;
-	ulong	rtabt;
-	ulong	sserr;
-	ulong	rxsover;
-} Ctlr;
-
-static Ctlr* ctlrhead;
-static Ctlr* ctlrtail;
-
-enum {
-	/* registers (could memory map) */
-	Rcr=		0x00,	/* command register */
-	  Rst=		1<<8,
-	  Rxr=		1<<5,	/* receiver reset */
-	  Txr=		1<<4,	/* transmitter reset */
-	  Rxd=		1<<3,	/* receiver disable */
-	  Rxe=		1<<2,	/* receiver enable */
-	  Txd=		1<<1,	/* transmitter disable */
-	  Txe=		1<<0,	/* transmitter enable */
-	Rcfg=	0x04,	/* configuration */
-	  Lnksts=		1<<31,	/* link good */
-	  Speed100=	1<<30,	/* 100 Mb/s link */
-	  Fdup=		1<<29,	/* full duplex */
-	  Pol=		1<<28,	/* polarity reversal (10baseT) */
-	  Aneg_dn=	1<<27,	/* autonegotiation done */
-	  Pint_acen=	1<<17,	/* PHY interrupt auto clear enable */
-	  Pause_adv=	1<<16,	/* advertise pause during auto neg */
-	  Paneg_ena=	1<<13,	/* auto negotiation enable */
-	  Paneg_all=	7<<13,	/* auto negotiation enable 10/100 half & full */
-	  Ext_phy=	1<<12,	/* enable MII for external PHY */
-	  Phy_rst=		1<<10,	/* reset internal PHY */
-	  Phy_dis=		1<<9,	/* disable internal PHY (eg, low power) */
-	  Req_alg=	1<<7,	/* PCI bus request: set means less aggressive */
-	  Sb=			1<<6,	/* single slot back-off not random */
-	  Pow=		1<<5,	/* out of window timer selection */
-	  Exd=		1<<4,	/* disable excessive deferral timer */
-	  Pesel=		1<<3,	/* parity error algorithm selection */
-	  Brom_dis=	1<<2,	/* disable boot rom interface */
-	  Bem=		1<<0,	/* big-endian mode */
-	Rmear=	0x08,	/* eeprom access */
-	  Mdc=		1<<6,	/* MII mangement check */
-	  Mddir=		1<<5,	/* MII management direction */
-	  Mdio=		1<<4,	/* MII mangement data */
-	  Eesel=		1<<3,	/* EEPROM chip select */
-	  Eeclk=		1<<2,	/* EEPROM clock */
-	  Eedo=		1<<1,	/* EEPROM data out (from chip) */
-	  Eedi=		1<<0,	/* EEPROM data in (to chip) */
-	Rptscr=	0x0C,	/* pci test control */
-	Risr=		0x10,	/* interrupt status */
-	  Txrcmp=	1<<25,	/* transmit reset complete */
-	  Rxrcmp=	1<<24,	/* receiver reset complete */
-	  Dperr=		1<<23,	/* detected parity error */
-	  Sserr=		1<<22,	/* signalled system error */
-	  Rmabt=		1<<21,	/* received master abort */
-	  Rtabt=		1<<20,	/* received target abort */
-	  Rxsovr=		1<<16,	/* RX status FIFO overrun */
-	  Hiberr=		1<<15,	/* high bits error set (OR of 25-16) */
-	  Phy=		1<<14,	/* PHY interrupt */
-	  Pme=		1<<13,	/* power management event (wake online) */
-	  Swi=		1<<12,	/* software interrupt */
-	  Mib=		1<<11,	/* MIB service */
-	  Txurn=		1<<10,	/* TX underrun */
-	  Txidle=		1<<9,	/* TX idle */
-	  Txerr=		1<<8,	/* TX packet error */
-	  Txdesc=		1<<7,	/* TX descriptor (with Intr bit done) */
-	  Txok=		1<<6,	/* TX ok */
-	  Rxorn=		1<<5,	/* RX overrun */
-	  Rxidle=		1<<4,	/* RX idle */
-	  Rxearly=		1<<3,	/* RX early threshold */
-	  Rxerr=		1<<2,	/* RX packet error */
-	  Rxdesc=		1<<1,	/* RX descriptor (with Intr bit done) */
-	  Rxok=		1<<0,	/* RX ok */
-	Rimr=	0x14,	/* interrupt mask */
-	Rier=	0x18,	/* interrupt enable */
-	  Ie=			1<<0,	/* interrupt enable */
-	Rtxdp=	0x20,	/* transmit descriptor pointer */
-	Rtxcfg=	0x24,	/* transmit configuration */
-	  Csi=		1<<31,	/* carrier sense ignore (needed for full duplex) */
-	  Hbi=		1<<30,	/* heartbeat ignore (needed for full duplex) */
-	  Atp=		1<<28,	/* automatic padding of runt packets */
-	  Mxdma=		7<<20,	/* maximum dma transfer field */
-	  Mxdma32=	4<<20,	/* 4x32-bit words (32 bytes) */
-	  Mxdma64=	5<<20,	/* 8x32-bit words (64 bytes) */
-	  Flth=		0x3F<<8,	/* Tx fill threshold, units of 32 bytes (must be > Mxdma) */
-	  Drth=		0x3F<<0,	/* Tx drain threshold (units of 32 bytes) */
-	  Flth128=		4<<8,	/* fill at 128 bytes */
-	// seems to be the same on SiS 900; maybe use larger value @ 100Mb/s
-	  Drth512=	16<<0,	/* drain at 512 bytes */
-	Rrxdp=	0x30,	/* receive descriptor pointer */
-	Rrxcfg=	0x34,	/* receive configuration */
-	  Atx=		1<<28,	/* accept transmit packets (needed for full duplex) */
-	  Rdrth=		0x1F<<1,	/* Rx drain threshold (units of 32 bytes) */
-	  Rdrth64=	2<<1,	/* drain at 64 bytes */
-	Rccsr=	0x3C,	/* CLKRUN control/status */
-	  Pmests=		1<<15,	/* PME status */
-	Rwcsr=	0x40,	/* wake on lan control/status */
-	Rpcr=	0x44,	/* pause control/status */
-	// TODO: different on SiS, but does it matter?
-	Rrfcr=	0x48,	/* receive filter/match control */
-	  Rfen=		1<<31,	/* receive filter enable */
-	  Aab=		1<<30,	/* accept all broadcast */
-	  Aam=		1<<29,	/* accept all multicast */
-	  Aau=		1<<28,	/* accept all unicast */
-	  Apm=		1<<27,	/* accept on perfect match */
-	  Apat=		0xF<<23,	/* accept on pattern match */
-	  Aarp=		1<<22,	/* accept ARP */
-	  Mhen=		1<<21,	/* multicast hash enable */
-	  Uhen=		1<<20,	/* unicast hash enable */
-	  Ulm=		1<<19,	/* U/L bit mask */
-						/* bits 0-9 are rfaddr */
-	Rrfdr=	0x4C,	/* receive filter/match data */
-	Rbrar=	0x50,	/* boot rom address */
-	Rbrdr=	0x54,	/* boot rom data */
-	Rsrr=	0x58,	/* silicon revision */
-	Rmibc=	0x5C,	/* MIB control */
-					/* 60-78 MIB data */
-
-	/* PHY registers */
-	Rbmcr=	0x80,	/* basic mode configuration */
-	  Reset=		1<<15,
-	  Sel100=		1<<13,	/* select 100Mb/sec if no auto neg */
-	  Anena=		1<<12,	/* auto negotiation enable */
-	  Anrestart=	1<<9,	/* restart auto negotiation */
-	  Selfdx=		1<<8,	/* select full duplex if no auto neg */
-	Rbmsr=	0x84,	/* basic mode status */
-	  Ancomp=	1<<5,	/* autonegotiation complete */
-	Rphyidr1= 0x88,
-	Rphyidr2= 0x8C,
-	Ranar=	0x90,	/* autonegotiation advertisement */
-	Ranlpar=	0x94,	/* autonegotiation link partner ability */
-	Raner=	0x98,	/* autonegotiation expansion */
-	Rannptr=	0x9C,	/* autonegotiation next page TX */
-	Rphysts=	0xC0,	/* PHY status */
-	Rmicr=	0xC4,	/* MII control */
-	  Inten=		1<<1,	/* PHY interrupt enable */
-	Rmisr=	0xC8,	/* MII status */
-	Rfcscr=	0xD0,	/* false carrier sense counter */
-	Rrecr=	0xD4,	/* receive error counter */
-	Rpcsr=	0xD8,	/* 100Mb config/status */
-	Rphycr=	0xE4,	/* PHY control */
-	Rtbscr=	0xE8,	/* 10BaseT status/control */
-};
-
-/*
- * eeprom addresses
- * 	7 to 9 (16 bit words): mac address, shifted and reversed
- */
-
-#define csr32r(c, r)	(inl((c)->port+(r)))
-#define csr32w(c, r, l)	(outl((c)->port+(r), (ulong)(l)))
-#define csr16r(c, r)	(ins((c)->port+(r)))
-#define csr16w(c, r, l)	(outs((c)->port+(r), (ulong)(l)))
-
-static void
-dumpcregs(Ctlr *ctlr)
-{
-	int i;
-
-	for(i=0; i<=0x5C; i+=4)
-		print("%2.2ux %8.8lux\n", i, csr32r(ctlr, i));
-}
-
-// TODO: finish this
-static void
-promiscuous(void* arg, int on)
-{
-	Ctlr *ctlr;
-	ulong w;
-
-	ctlr = ((Ether*)arg)->ctlr;
-	ilock(&ctlr->lock);
-	w = csr32r(ctlr, Rrfcr);
-	if(on != ((w&Aau)!=0)){
-		csr32w(ctlr, Rrfcr, w & ~Rfen);
-		csr32w(ctlr, Rrfcr, Rfen | (w ^ Aau));
-	}
-	iunlock(&ctlr->lock);
-}
-
-static void
-attach(Ether* ether)
-{
-	Ctlr *ctlr;
-
-	ctlr = ether->ctlr;
-	ilock(&ctlr->lock);
-	if(0)
-		dumpcregs(ctlr);
-	csr32w(ctlr, Rcr, Rxe);
-	iunlock(&ctlr->lock);
-}
-
-#ifndef FS
-static long
-ifstat(Ether* ether, void* a, long n, ulong offset)
-{
-	Ctlr *ctlr;
-	char *buf, *p;
-	int i, l, len;
-
-	ctlr = ether->ctlr;
-
-	ether->crcs = ctlr->crce;
-	ether->frames = ctlr->runt+ctlr->ise+ctlr->rlong+ctlr->fae;
-	ether->buffs = ctlr->rxorn+ctlr->tfu;
-	ether->overflows = ctlr->rxsovr;
-
-	if(n == 0)
-		return 0;
-
-	p = malloc(READSTR);
-	l = snprint(p, READSTR, "Rxa: %lud\n", ctlr->rxa);
-	l += snprint(p+l, READSTR-l, "Rxo: %lud\n", ctlr->rxo);
-	l += snprint(p+l, READSTR-l, "Rlong: %lud\n", ctlr->rlong);
-	l += snprint(p+l, READSTR-l, "Runt: %lud\n", ctlr->runt);
-	l += snprint(p+l, READSTR-l, "Ise: %lud\n", ctlr->ise);
-	l += snprint(p+l, READSTR-l, "Fae: %lud\n", ctlr->fae);
-	l += snprint(p+l, READSTR-l, "Lbp: %lud\n", ctlr->lbp);
-	l += snprint(p+l, READSTR-l, "Tfu: %lud\n", ctlr->tfu);
-	l += snprint(p+l, READSTR-l, "Txa: %lud\n", ctlr->txa);
-	l += snprint(p+l, READSTR-l, "CRC Error: %lud\n", ctlr->crce);
-	l += snprint(p+l, READSTR-l, "Collision Seen: %lud\n", ctlr->col);
-	l += snprint(p+l, READSTR-l, "Frame Too Long: %lud\n", ctlr->rlong);
-	l += snprint(p+l, READSTR-l, "Runt Frame: %lud\n", ctlr->runt);
-	l += snprint(p+l, READSTR-l, "Rx Underflow Error: %lud\n", ctlr->rxorn);
-	l += snprint(p+l, READSTR-l, "Tx Underrun: %lud\n", ctlr->txurn);
-	l += snprint(p+l, READSTR-l, "Excessive Collisions: %lud\n", ctlr->ec);
-	l += snprint(p+l, READSTR-l, "Late Collision: %lud\n", ctlr->owc);
-	l += snprint(p+l, READSTR-l, "Loss of Carrier: %lud\n", ctlr->crs);
-	l += snprint(p+l, READSTR-l, "Parity: %lud\n", ctlr->dperr);
-	l += snprint(p+l, READSTR-l, "Aborts: %lud\n", ctlr->rmabt+ctlr->rtabt);
-	l += snprint(p+l, READSTR-l, "RX Status overrun: %lud\n", ctlr->rxsover);
-	snprint(p+l, READSTR-l, "ntqmax: %d\n", ctlr->ntqmax);
-	ctlr->ntqmax = 0;
-	buf = a;
-	len = readstr(offset, buf, n, p);
-	if(offset > l)
-		offset -= l;
-	else
-		offset = 0;
-	buf += len;
-	n -= len;
-
-	l = snprint(p, READSTR, "srom:");
-	for(i = 0; i < nelem(ctlr->srom); i++){
-		if(i && ((i & 0x0F) == 0))
-			l += snprint(p+l, READSTR-l, "\n     ");
-		l += snprint(p+l, READSTR-l, " %4.4uX", ctlr->srom[i]);
-	}
-
-	snprint(p+l, READSTR-l, "\n");
-	len += readstr(offset, buf, n, p);
-	free(p);
-
-	return len;
-}
-#endif
-
-/* always called under ilock(&ether->ctlr->tlock) */
-static void
-txstart(Ether* ether)
-{
-	Ctlr *ctlr;
-	Block *bp;
-	Des *des;
-	int started;
-
-	ctlr = ether->ctlr;
-	started = 0;
-	while(ctlr->ntq < ctlr->ntdr-1){
-		bp = etheroq(ether);
-		if(bp == nil)
-			break;
-		des = &ctlr->tdr[ctlr->tdrh];
-		des->bp = bp;
-		des->addr = PADDR(bp->rp);
-		// debug("ns83815: txstart: des->addr %lux\n", des->addr);
-		ctlr->ntq++;
-		coherence();
-		des->cmdsts = Own | BLEN(bp);
-		// debug("ns83815: txstart: des->cmdsts %ux\n", des->cmdsts);
-		ctlr->tdrh = NEXT(ctlr->tdrh, ctlr->ntdr);
-		started = 1;
-	}
-	if(started){
-		coherence();
-		csr32w(ctlr, Rcr, Txe);	/* prompt */
-	}
-
-	if(ctlr->ntq > ctlr->ntqmax)
-		ctlr->ntqmax = ctlr->ntq;
-}
-
-static void
-transmit(Ether* ether)
-{
-	Ctlr *ctlr;
-
-	ctlr = ether->ctlr;
-	ilock(&ctlr->tlock);
-	txstart(ether);
-	iunlock(&ctlr->tlock);
-}
-
-// TODO: finish this; set speed too
-static void
-txrxcfg(Ctlr *ctlr, int txdrth)
-{
-	ulong rx, tx;
-
-	rx = csr32r(ctlr, Rrxcfg);
-	tx = csr32r(ctlr, Rtxcfg);
-	if(ctlr->fd){
-		rx |= Atx;
-		tx |= Csi | Hbi;
-	}else{
-		rx &= ~Atx;
-		tx &= ~(Csi | Hbi);
-	}
-	tx &= ~(Mxdma|Drth|Flth);
-	tx |= Mxdma64 | Flth128 | txdrth;
-	csr32w(ctlr, Rtxcfg, tx);
-	rx &= ~(Mxdma|Rdrth);
-	rx |= Mxdma64 | Rdrth64;
-	csr32w(ctlr, Rrxcfg, rx);
-}
-
-static void
-interrupt(Ureg*, void* arg)
-{
-	Ctlr *ctlr;
-	Ether *ether;
-	int len, status, cmdsts, iter = 0;
-	Des *des;
-	Block *bp;
-
-	ether = arg;
-	ctlr = ether->ctlr;
-	while((status = csr32r(ctlr, Risr)) != 0){
-		if (iter++ >= 100)
-			print("ns83815: interrupt: >= 100 iterations\n");
-		status &= ~(Pme|Mib);
-		if(status & Hiberr){
-			if(status & Rxsovr)
-				ctlr->rxsover++;
-			if(status & Sserr)
-				ctlr->sserr++;
-			if(status & Dperr)
-				ctlr->dperr++;
-			if(status & Rmabt)
-				ctlr->rmabt++;
-			if(status & Rtabt)
-				ctlr->rtabt++;
-			status &= ~(Hiberr|Txrcmp|Rxrcmp|Rxsovr|Dperr|Sserr|Rmabt|Rtabt);
-		}
-
-		/*
-		 * Received packets.
-		 */
-		if(status & (Rxdesc|Rxok|Rxerr|Rxearly|Rxorn)){
-			des = &ctlr->rdr[ctlr->rdrx];
-			while((cmdsts = des->cmdsts) & Own){
-				if((cmdsts&Ok) == 0){
-					if(cmdsts & Rxa)
-						ctlr->rxa++;
-					if(cmdsts & Rxo)
-						ctlr->rxo++;
-					if(cmdsts & Long)
-						ctlr->rlong++;
-					if(cmdsts & Runt)
-						ctlr->runt++;
-					if(cmdsts & Ise)
-						ctlr->ise++;
-					if(cmdsts & Crce)
-						ctlr->crce++;
-					if(cmdsts & Fae)
-						ctlr->fae++;
-					if(cmdsts & Lbp)
-						ctlr->lbp++;
-					if(cmdsts & Col)
-						ctlr->col++;
-				}
-				else if(bp = iallocb(Rbsz)){
-					len = (cmdsts&Size)-4;
-					if (len <= 0) {
-						print(
-				"ns83815: interrupt: packet len %d <= 0\n",
-							len);
-						freeb(des->bp);	/* toss it */
-					} else {
-						SETWPCNT(des->bp, len);
-						ETHERIQ(ether, des->bp, 1);
-					}
-					/* replace just-queued/freed packet */
-					des->bp = bp;
-					des->addr = PADDR(bp->rp);
-//					debug(
-//		"ns83815: interrupt: packet into input q, new des->addr %lux\n",
-//						des->addr);
-					coherence();
-				} else {
-					print(
-		"ns83815: interrupt: iallocb for input buffer failed\n");
-					/*
-					 * prevent accidents & ignore this
-					 * packet.  it will be overwritten.
-					 */
-					des->bp->next = 0;
-				}
-
-				des->cmdsts = Rbsz;
-				coherence();
-
-				ctlr->rdrx = NEXT(ctlr->rdrx, ctlr->nrdr);
-				des = &ctlr->rdr[ctlr->rdrx];
-			}
-			status &= ~(Rxdesc|Rxok|Rxerr|Rxearly|Rxorn);
-		}
-
-		/*
-		 * Check the transmit side:
-		 *	check for Transmit Underflow and Adjust
-		 *	the threshold upwards;
-		 *	free any transmitted buffers and try to
-		 *	top-up the ring.
-		 */
-		if(status & Txurn){
-			ctlr->txurn++;
-			ilock(&ctlr->lock);
-			/* change threshold */
-			iunlock(&ctlr->lock);
-			status &= ~(Txurn);
-		}
-
-		ilock(&ctlr->tlock);
-		while(ctlr->ntq > 0){
-			des = &ctlr->tdr[ctlr->tdri];
-			cmdsts = des->cmdsts;
-			if(cmdsts & Own)
-				break;
-
-			if((cmdsts & Ok) == 0){
-				if(cmdsts & Txa)
-					ctlr->txa++;
-				if(cmdsts & Tfu)
-					ctlr->tfu++;
-				if(cmdsts & Td)
-					ctlr->td++;
-				if(cmdsts & Ed)
-					ctlr->ed++;
-				if(cmdsts & Owc)
-					ctlr->owc++;
-				if(cmdsts & Ec)
-					ctlr->ec++;
-#ifndef FS
-				ether->oerrs++;
-#endif
-			}
-
-//			debug("ns83815: interrupt: done output for des->addr %lux\n",
-//				des->addr);
-			if (des->bp == nil)
-				panic("83815 interrupt: nil des->bp");
-			freeb(des->bp);
-			des->bp = nil;
-			des->cmdsts = 0;
-
-			ctlr->ntq--;
-			ctlr->tdri = NEXT(ctlr->tdri, ctlr->ntdr);
-		}
-		txstart(ether);
-		iunlock(&ctlr->tlock);
-
-		if((status & Phy) && ctlr->mii != nil){
-			ctlr->mii->mir(ctlr->mii, 1, Bmsr);
-			print("phy: cfg %8.8lux bmsr %4.4ux\n",
-				csr32r(ctlr, Rcfg),
-				ctlr->mii->mir(ctlr->mii, 1, Bmsr));
-			/* TODO: set speed too; can't do it yet */
-			txrxcfg(ctlr, Drth512);	/* set duplicity */
-			status &= ~Phy;
-		}
-
-		status &= ~(Txurn|Txidle|Txerr|Txdesc|Txok);
-
-		/*
-		 * Anything left not catered for?
-		 */
-		if(status)
-			print("#l%d: status %8.8ux\n", ether->ctlrno, status);
-	}
-}
-
-static void
-ctlrinit(Ether* ether)
-{
-	Ctlr *ctlr;
-	Des *des, *last;
-
-	ctlr = ether->ctlr;
-
-	/*
-	 * Allocate and initialise the receive ring;
-	 * allocate and initialise the transmit ring;
-	 * unmask interrupts and start the transmit side
-	 */
-	ctlr->rdr = malloc(ctlr->nrdr*sizeof(Des));
-	if(ctlr->rdr == nil) {
-		print("ns83815: ctlrinit: iallocb of rcv. descs. failed\n");
-		return;
-	}
-	last = nil;
-	for(des = ctlr->rdr; des < &ctlr->rdr[ctlr->nrdr]; des++){
-		des->bp = iallocb(Rbsz);
-		if (des->bp == nil) {
-			print("ns83815: ctlrinit: iallocb(%d) failed\n", Rbsz);
-			return;
-		}
-		des->cmdsts = Rbsz;
-		des->addr = PADDR(des->bp->rp);
-		if(last != nil)
-			last->next = PADDR(des);
-		last = des;
-	}
-	ctlr->rdr[ctlr->nrdr-1].next = PADDR(ctlr->rdr);
-	ctlr->rdrx = 0;
-	csr32w(ctlr, Rrxdp, PADDR(ctlr->rdr));
-
-	ctlr->tdr = xspanalloc(ctlr->ntdr*sizeof(Des), 8*sizeof(ulong), 0);
-	last = nil;
-	for(des = ctlr->tdr; des < &ctlr->tdr[ctlr->ntdr]; des++){
-		des->cmdsts = 0;
-		des->bp = nil;
-		des->addr = ~0;
-		if(last != nil)
-			last->next = PADDR(des);
-		last = des;
-	}
-	ctlr->tdr[ctlr->ntdr-1].next = PADDR(ctlr->tdr);
-	ctlr->tdrh = 0;
-	ctlr->tdri = 0;
-	csr32w(ctlr, Rtxdp, PADDR(ctlr->tdr));
-
-	txrxcfg(ctlr, Drth512);
-
-// TODO: finish this
-// MII
-	csr32w(ctlr, Rimr, Dperr|Sserr|Rmabt|Rtabt|Rxsovr|Hiberr|Txurn|Txerr|
-		Txdesc|Txok|Rxorn|Rxerr|Rxdesc|Rxok);	/* Phy|Pme|Mib */
-	csr32r(ctlr, Risr);	/* clear status */
-	csr32w(ctlr, Rier, Ie);
-	debug("ns83815: ctlrinit: set Ie, done\n");
-}
-
-/*
- * EEPROM
- */
-
-static void
-eeclk(Ctlr *ctlr, int clk)
-{
-	csr32w(ctlr, Rmear, Eesel | clk);
-	microdelay(2);
-}
-
-static void
-eeidle(Ctlr *ctlr)
-{
-	int i;
-
-	eeclk(ctlr, 0);
-	eeclk(ctlr, Eeclk);
-	for(i=0; i<25; i++){
-		eeclk(ctlr, 0);
-		eeclk(ctlr, Eeclk);
-	}
-	eeclk(ctlr, 0);
-	csr32w(ctlr, Rmear, 0);
-	microdelay(2);
-}
-
-static int
-eegetw(Ctlr *ctlr, int a)
-{
-	int d, i, w;
-
-	eeidle(ctlr);
-	eeclk(ctlr, 0);
-	eeclk(ctlr, Eeclk);
-	d = 0x180 | a;			// read EEPROM at address `a'
-	for(i=0x400; i; i>>=1){
-		if(d & i)
-			csr32w(ctlr, Rmear, Eesel|Eedi);
-		else
-			csr32w(ctlr, Rmear, Eesel);
-		eeclk(ctlr, Eeclk);
-		eeclk(ctlr, 0);
-		microdelay(2);
-	}
-	w = 0;
-	for(i=0x8000; i; i >>= 1){
-		eeclk(ctlr, Eeclk);
-		if(csr32r(ctlr, Rmear) & Eedo)
-			w |= i;
-		microdelay(2);
-		eeclk(ctlr, 0);
-	}
-	eeidle(ctlr);
-	return w;
-}
-
-
-static void
-softreset(Ctlr* ctlr, int resetphys)
-{
-	int i, w;
-
-	/*
-	 * Soft-reset the controller
-	 */
-	csr32w(ctlr, Rcr, Rst);
-	for(i=0;; i++){
-		if(i > 100)
-			panic("ns83815: soft reset did not complete");
-		microdelay(250);
-		if((csr32r(ctlr, Rcr) & Rst) == 0)
-			break;
-		delay(1);
-	}
-
-	csr32w(ctlr, Rccsr, Pmests);
-	csr32w(ctlr, Rccsr, 0);
-	csr32w(ctlr, Rcfg, csr32r(ctlr, Rcfg) | Pint_acen);
-// MII
-// TODO: finish this
-	if(resetphys){
-		/*
-		 * Soft-reset the PHY
-		 */
-		csr32w(ctlr, Rbmcr, Reset);
-		for(i=0;; i++){
-			if(i > 100)
-				panic("ns83815: PHY soft reset time out");
-			if((csr32r(ctlr, Rbmcr) & Reset) == 0)
-				break;
-			delay(1);
-		}
-	}
-
-	/*
-	 * Initialisation values, in sequence (see 4.4 Recommended Registers Configuration)
-	 */
-	csr16w(ctlr, 0xCC, 0x0001);	/* PGSEL */
-	csr16w(ctlr, 0xE4, 0x189C);	/* PMCCSR */
-	csr16w(ctlr, 0xFC, 0x0000);	/* TSTDAT */
-	csr16w(ctlr, 0xF4, 0x5040);	/* DSPCFG */
-	csr16w(ctlr, 0xF8, 0x008C);	/* SDCFG */
-
-	/*
-	 * Auto negotiate
-	 */
-	w = csr16r(ctlr, Rbmsr);	/* clear latched bits */
-	debug("anar: %4.4ux\n", csr16r(ctlr, Ranar));
-	csr16w(ctlr, Rbmcr, Anena);
-	if(csr16r(ctlr, Ranar) == 0 || (csr32r(ctlr, Rcfg) & Aneg_dn) == 0){
-		csr16w(ctlr, Rbmcr, Anena|Anrestart);
-		/* TODO: this times out on the SiS900. why? */
-// TODO: finish this
-		for(i=0;; i++){
-			if(i > 6000){
-				print("ns83815: speed auto neg. timed out\n");
-				break;
-			}
-			if((w = csr16r(ctlr, Rbmsr)) & Ancomp)
-				break;
-			delay(1);
-		}
-		debug("%d ms\n", i);
-		w &= 0xFFFF;
-		debug("bmsr: %4.4ux\n", w);
-		USED(w);
-	}
-	debug("anar: %4.4ux\n", csr16r(ctlr, Ranar));
-	debug("anlpar: %4.4ux\n", csr16r(ctlr, Ranlpar));
-	debug("aner: %4.4ux\n", csr16r(ctlr, Raner));
-	debug("physts: %4.4ux\n", csr16r(ctlr, Rphysts));
-	debug("tbscr: %4.4ux\n", csr16r(ctlr, Rtbscr));
-}
-
-/*
- * MII/PHY
- */
-
-// TODO: finish this
-static int
-mdior(Ctlr* ctlr, int n)
-{
-	int data, i, mear, r;
-
-//	mear = csr32r(ctlr, Mear);
-//	r = ~(Mdc|Mddir) & mear;
-	data = 0;
-	for(i = n-1; i >= 0; i--){
-//		if(csr32r(ctlr, Mear) & Mdio)
-			data |= (1<<i);
-//		csr32w(ctlr, Mear, Mdc|r);
-//		csr32w(ctlr, Mear, r);
-	}
-//	csr32w(ctlr, Mear, mear);
-	return data;
-}
-
-// TODO: finish this
-static void
-mdiow(Ctlr* ctlr, int bits, int n)
-{
-	int i, mear, r;
-
-//	mear = csr32r(ctlr, Mear);
-//	r = Mddir|(~Mdc & mear);
-	for(i = n-1; i >= 0; i--){
-//		if(bits & (1<<i))
-//			r |= Mdio;
-//		else
-//			r &= ~Mdio;
-//		csr32w(ctlr, Mear, r);
-//		csr32w(ctlr, Mear, Mdc|r);
-	}
-//	csr32w(ctlr, Mear, mear);
-}
-
-static int
-ns83815miimir(Mii* mii, int pa, int ra)
-{
-	int data;
-	Ctlr *ctlr;
-
-	ctlr = mii->ctlr;
-
-	/*
-	 * MII Management Interface Read.
-	 *
-	 * Preamble;
-	 * ST+OP+PA+RA;
-	 * LT + 16 data bits.
-	 */
-	mdiow(ctlr, 0xFFFFFFFF, 32);
-	mdiow(ctlr, 0x1800|(pa<<5)|ra, 14);
-	data = mdior(ctlr, 18);
-
-	if(data & 0x10000)
-		return -1;
-
-	return data & 0xFFFF;
-}
-
-static int
-ns83815miimiw(Mii* mii, int pa, int ra, int data)
-{
-	Ctlr *ctlr;
-
-	ctlr = mii->ctlr;
-
-	/*
-	 * MII Management Interface Write.
-	 *
-	 * Preamble;
-	 * ST+OP+PA+RA+LT + 16 data bits;
-	 * Z.
-	 */
-	mdiow(ctlr, 0xFFFFFFFF, 32);
-	data &= 0xFFFF;
-	data |= (0x05<<(5+5+2+16))|(pa<<(5+2+16))|(ra<<(2+16))|(0x02<<16);
-	mdiow(ctlr, data, 32);
-	return data & 0xFFFF;	/* TODO: what's the caller expect here? */
-}
-
-// TODO: finish this
-static int
-sismiimir(Mii* mii, int pa, int ra)
-{
-	int data;
-	Ctlr *ctlr;
-
-	ctlr = mii->ctlr;
-
-	/*
-	 * MII Management Interface Read.
-	 *
-	 * Preamble;
-	 * ST+OP+PA+RA;
-	 * LT + 16 data bits.
-	 */
-	mdiow(ctlr, 0xFFFFFFFF, 32);
-	mdiow(ctlr, 0x1800|(pa<<5)|ra, 14);
-	data = mdior(ctlr, 18);
-
-	if(data & 0x10000)
-		return -1;
-
-	return data & 0xFFFF;
-}
-
-// TODO: finish this
-static int
-sismiimiw(Mii* mii, int pa, int ra, int data)
-{
-	Ctlr *ctlr;
-
-	ctlr = mii->ctlr;
-
-	/*
-	 * MII Management Interface Write.
-	 *
-	 * Preamble;
-	 * ST+OP+PA+RA+LT + 16 data bits;
-	 * Z.
-	 */
-	mdiow(ctlr, 0xFFFFFFFF, 32);
-	data &= 0xFFFF;
-	data |= (0x05<<(5+5+2+16))|(pa<<(5+2+16))|(ra<<(2+16))|(0x02<<16);
-	mdiow(ctlr, data, 32);
-	return data & 0xFFFF;	/* TODO: what's the caller expect here? */
-}
-
-// MII
-// TODO: finish this
-static int
-media(Ether* ether)
-{
-	Ctlr* ctlr;
-	ulong cfg;
-
-	ctlr = ether->ctlr;
-	cfg = csr32r(ctlr, Rcfg);
-
-	if(waserror()){
-err:
-		if(ctlr->mii != nil){
-			free(ctlr->mii);
-			ctlr->mii = nil;
-		}
-#ifdef FS
-		return 10;
-#else
-		nexterror();
-#endif
-	}
-
-	switch (ctlr->id) {
-	case SiS900:
-	case SiS7016:
-		if (1){
-			if((ctlr->mii = malloc(sizeof(Mii))) == nil)
-				error(Enomem);
-			ctlr->mii->ctlr = ctlr;
-			ctlr->mii->mir = sismiimir;
-			ctlr->mii->miw = sismiimiw;
-			if(mii(ctlr->mii, ~0) == 0)
-				error("no PHY");
-			// ctlr->cfg |= Dupstsien|Lnkstsien|Spdstsien;
-			// ctlr->imr |= Phy;
-		}
-		break;
-	case Nat83815:
-		if (1){
-			if((ctlr->mii = malloc(sizeof(Mii))) == nil)
-				error(Enomem);
-			ctlr->mii->ctlr = ctlr;
-			ctlr->mii->mir = ns83815miimir;
-			ctlr->mii->miw = ns83815miimiw;
-			if(mii(ctlr->mii, ~0) == 0)
-				error("no PHY");
-			// ctlr->cfg |= Dupstsien|Lnkstsien|Spdstsien;
-			// ctlr->imr |= Phy;
-		}
-		break;
-	}
-
-	ctlr->fd = (cfg & Fdup) != 0;
-	if(cfg & Speed100)
-		return 100;
-	if((cfg & Lnksts) == 0)
-		return 100;	/* no link: use 100 to ensure larger queues */
-	return 10;
-}
-
-
-static char* mediatable[9] = {
-	"10BASE-T",				/* TP */
-	"10BASE-2",				/* BNC */
-	"10BASE-5",				/* AUI */
-	"100BASE-TX",
-	"10BASE-TFD",
-	"100BASE-TXFD",
-	"100BASE-T4",
-	"100BASE-FX",
-	"100BASE-FXFD",
-};
-
-enum {
-	MagicReg = 0x48,
-	MagicRegSz = 1,
-	Magicrden = 0x40,	/* read enable, apparently */
-	Paddr=		0x70,	/* address port */
-	Pdata=		0x71,	/* data port */
-};
-
-/* rcmos() originally from LANL's SiS 900 driver's rcmos() */
-static int
-sisrdcmos(Ctlr *ctlr)
-{
-	int i;
-	unsigned reg;
-	ulong port;
-	Pcidev *p;
-
-	p = pcimatch(nil, SiS, SiS630bridge);
-	if (p == nil) {
-		print("ns83815: no SiS 630 rev. %ux bridge for mac addr\n",
-			ctlr->pcidev->rid);
-		return 0;
-	}
-	port = p->mem[0].bar & ~0x01;
-	print(
-"ns83815: SiS 630 rev. %ux reading mac addr from cmos via bridge at port 0x%lux\n",
-		ctlr->pcidev->rid, port);
-
-	reg = pcicfgr8(p, MagicReg);
-	pcicfgw8(p, MagicReg, reg|Magicrden);
-
-	for (i = 0; i < Eaddrlen; i++) {
-		outb(port+Paddr, SiS630eenodeaddr + i);
-		ctlr->sromea[i] = inb(port+Pdata);
-	}
-
-	pcicfgw8(p, MagicReg, reg & ~Magicrden);
-	return 1;
-}
-
-static int
-is630(ulong id, Pcidev *p)
-{
-	if (id == SiS900)
-		switch (p->rid) {
-		case SiSrev630s:
-		case SiSrev630e:
-	  	case SiSrev630ea1:
-			return 1;
-		}
-	return 0;
-}
-
-/*
- * If this is a SiS 630E chipset with an embedded SiS 900 controller,
- * we have to read the MAC address from the APC CMOS RAM. - sez freebsd.
- * However, CMOS *is* NVRAM normally.  See devrtc.c:440, memory.c:88.
- */
-static void
-sissrom(Ctlr *ctlr)
-{
-	union {
-		uchar	eaddr[Eaddrlen];
-		ushort	alignment;
-	} ee;
-	int i, off = SiSeenodeaddr, cnt = sizeof ee.eaddr / sizeof(short);
-	ushort *shp = (ushort *)ee.eaddr;
-
-	if (!is630(ctlr->id, ctlr->pcidev) || !sisrdcmos(ctlr)) {
-		print("ns83815: reading SiS mac address from eeprom\n");
-		for (i = 0; i < cnt; i++)
-			*shp++ = eegetw(ctlr, off++);
-		memmove(ctlr->sromea, ee.eaddr, sizeof ctlr->sromea);
-	}
-}
-
-static void
-nssrom(Ctlr *ctlr)
-{
-	int i, j;
-
-	debug("ns83815: fa311: reading mac address from eeprom & swizzling\n");
-	for(i = 0; i < nelem(ctlr->srom); i++)
-		ctlr->srom[i] = eegetw(ctlr, i);
-
-	/*
-	 * the MAC address is reversed, straddling word boundaries
-	 */
-	j = Nseenodeaddr*16 + 15;		// bit offset to read
-	for (i=0; i<48; i++, j++)
-		ctlr->sromea[i>>3] |=
-			((ctlr->srom[j>>4] >> (15-(j&0xF))) & 1) << (i&7);
-}
-
-static void
-srom(Ctlr* ctlr)
-{
-	memset(ctlr->sromea, 0, sizeof(ctlr->sromea));
-	switch (ctlr->id) {
-	case SiS900:
-	case SiS7016:
-		sissrom(ctlr);
-		break;
-	case Nat83815:
-		nssrom(ctlr);
-		break;
-	default:
-		print("ns83815: srom: unknown id 0x%ux\n", ctlr->id);
-		break;
-	}
-}
-
-// from pci.c
-enum {
-	Pcinetctlr = 0x02,		/* network controller */
-//	PciCCRp	= 0x09,			/* programming interface class code */
-//	PciCCRu	= 0x0A,			/* sub-class code */
-//	PciCCRb	= 0x0B,			/* base class code */
-};
-
-static void
-scanpci83815(void)
-{
-	typedef struct {
-		ulong	bar;		/* base address */
-		int	size;
-	} Bar;
-	int port;
-	ulong id;
-	Bar *portbarp;
-	Ctlr *ctlr;
-	Pcidev *p = nil;
-
-	while(p = pcimatch(p, 0, 0)){
-		/* ccru is a short in the FS kernel, thus the cast to uchar */
-		if (p->ccrb != Pcinetctlr || (uchar)p->ccru != 0)
-			continue;		// not a nic
-		id = (p->did<<16)|p->vid;
-		// print("ns83815: id 0x%lux on pci bus\n", id);
-		switch(id){
-		case Nat83815:
-			print("ns83815: FA31[12] found\n");
-			break;
-		case SiS900:
-			print("ns83815: SiS900");
-			if (is630(id, p))
-				print(" (within SiS630)");
-			print(" found\n");
-			break;
-		case SiS7016:
-			print("ns83815: SiS7016 found\n");
-			break;
-		default:
-			continue;		// unrecognised
-		}
-		portbarp = &p->mem[0];
-		port = portbarp->bar & ~1;
-
-		/*
-		 * bar[0] is the I/O port register address and
-		 * bar[1] is the memory-mapped register address.
-		 */
-		ctlr = mallocz(sizeof(Ctlr), 1);
-		ctlr->port = port;
-		ctlr->pcidev = p;
-		ctlr->id = id;
-
-		if(ioalloc(ctlr->port, portbarp->size, 0, "ns83815") < 0){
-			print("ns83815: port 0x%ux in use\n", ctlr->port);
-			free(ctlr);
-			continue;
-		}
-
-		softreset(ctlr, 0);
-		srom(ctlr);
-
-		if(ctlrhead != nil)
-			ctlrtail->next = ctlr;
-		else
-			ctlrhead = ctlr;
-		ctlrtail = ctlr;
-	}
-}
-
-int
-dp83815reset(Ether* ether)
-{
-	Ctlr *ctlr;
-	int i, x;
-	ulong ctladdr;
-	uchar ea[Eaddrlen];
-	static int scandone;
-
-	if(scandone == 0){
-		scanpci83815();
-		scandone = 1;
-	}
-
-	/*
-	 * Any adapter matches if no ether->port is supplied,
-	 * otherwise the ports must match.
-	 */
-	for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
-		if(ctlr->active)
-			continue;
-		if(ether->port == 0 || ether->port == ctlr->port){
-			ctlr->active = 1;
-			break;
-		}
-	}
-	if(ctlr == nil)
-		return -1;
-
-	ether->ctlr = ctlr;
-	ether->port = ctlr->port;
-	ether->irq = ctlr->pcidev->intl;
-	ether->tbdf = ctlr->pcidev->tbdf;
-
-	/*
-	 * Check if the adapter's station address is to be overridden.
-	 * If not, read it from the EEPROM and set in ether->ea prior to
-	 * loading the station address in the hardware.
-	 */
-	memset(ea, 0, Eaddrlen);
-	if(memcmp(ea, ether->ea, Eaddrlen) == 0)
-		memmove(ether->ea, ctlr->sromea, Eaddrlen);
-	print("ns83815: setting mac addr\n");		/* DEBUG */
-	for(i=0; i<Eaddrlen; i+=2){
-		x = ether->ea[i] | (ether->ea[i+1]<<8);
-		ctladdr = (ctlr->id == Nat83815? i: i<<15);
-		csr32w(ctlr, Rrfcr, ctladdr);
-		csr32w(ctlr, Rrfdr, x);
-	}
-	csr32w(ctlr, Rrfcr, Rfen|Apm|Aab|Aam);
-
-	ether->mbps = media(ether);
-
-	/*
-	 * Look for a medium override in case there's no autonegotiation
-	 * or the autonegotiation fails.
-	 */
-
-	for(i = 0; i < ether->nopt; i++){
-		if(cistrcmp(ether->opt[i], "FD") == 0){
-			ctlr->fd = 1;
-			continue;
-		}
-		for(x = 0; x < nelem(mediatable); x++){
-			debug("compare <%s> <%s>\n", mediatable[x],
-				ether->opt[i]);
-			if(cistrcmp(mediatable[x], ether->opt[i]) == 0){
-				if(x != 4 && x >= 3)
-					ether->mbps = 100;
-				else
-					ether->mbps = 10;
-				switch(x){
-				default:
-					ctlr->fd = 0;
-					break;
-
-				case 0x04:		/* 10BASE-TFD */
-				case 0x05:		/* 100BASE-TXFD */
-				case 0x08:		/* 100BASE-FXFD */
-					ctlr->fd = 1;
-					break;
-				}
-				break;
-			}
-		}
-	}
-
-	/*
-	 * Initialise descriptor rings, ethernet address.
-	 */
-	ctlr->nrdr = Nrde;
-	ctlr->ntdr = Ntde;
-	pcisetbme(ctlr->pcidev);
-	ctlrinit(ether);
-
-	/*
-	 * Linkage to the generic ethernet driver.
-	 */
-	ether->attach = attach;
-	ether->transmit = transmit;
-	ether->interrupt = interrupt;
-#ifndef FS
-	ether->ifstat = ifstat;
-	ether->arg = ether;
-	ether->promiscuous = promiscuous;
-#endif
-	debug("ns83815: dp83815reset: done\n");
-	return 0;
-}
-
-#ifndef FS
-void
-ether83815link(void)
-{
-	addethercard("83815",  dp83815reset);
-}
-#endif

+ 0 - 4
sys/src/fs/pc/etherdat.h

@@ -1,4 +0,0 @@
-#include "all.h"
-#include "io.h"
-#include "mem.h"
-#include "../ip/ip.h"

Some files were not shown because too many files changed in this diff