ether2114x.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811
  1. /*
  2. * Digital Semiconductor DECchip 2114x PCI Fast Ethernet LAN Controller.
  3. * To do:
  4. * thresholds;
  5. * ring sizing;
  6. * handle more error conditions;
  7. * tidy setup packet mess;
  8. * push initialisation back to attach;
  9. * full SROM decoding.
  10. */
  11. #include "u.h"
  12. #include "../port/lib.h"
  13. #include "mem.h"
  14. #include "dat.h"
  15. #include "fns.h"
  16. #include "io.h"
  17. #include "../port/error.h"
  18. #include "../port/netif.h"
  19. #include "etherif.h"
  20. #define DEBUG (0)
  21. #define debug if(DEBUG)print
  22. enum {
  23. Nrde = 64,
  24. Ntde = 64,
  25. };
  26. #define Rbsz ROUNDUP(sizeof(Etherpkt)+4, 4)
  27. enum { /* CRS0 - Bus Mode */
  28. Swr = 0x00000001, /* Software Reset */
  29. Bar = 0x00000002, /* Bus Arbitration */
  30. Dsl = 0x0000007C, /* Descriptor Skip Length (field) */
  31. Ble = 0x00000080, /* Big/Little Endian */
  32. Pbl = 0x00003F00, /* Programmable Burst Length (field) */
  33. Cal = 0x0000C000, /* Cache Alignment (field) */
  34. Cal8 = 0x00004000, /* 8 longword boundary alignment */
  35. Cal16 = 0x00008000, /* 16 longword boundary alignment */
  36. Cal32 = 0x0000C000, /* 32 longword boundary alignment */
  37. Tap = 0x000E0000, /* Transmit Automatic Polling (field) */
  38. Dbo = 0x00100000, /* Descriptor Byte Ordering Mode */
  39. Rml = 0x00200000, /* Read Multiple */
  40. };
  41. enum { /* CSR[57] - Status and Interrupt Enable */
  42. Ti = 0x00000001, /* Transmit Interrupt */
  43. Tps = 0x00000002, /* Transmit Process Stopped */
  44. Tu = 0x00000004, /* Transmit buffer Unavailable */
  45. Tjt = 0x00000008, /* Transmit Jabber Timeout */
  46. Unf = 0x00000020, /* transmit UNderFlow */
  47. Ri = 0x00000040, /* Receive Interrupt */
  48. Ru = 0x00000080, /* Receive buffer Unavailable */
  49. Rps = 0x00000100, /* Receive Process Stopped */
  50. Rwt = 0x00000200, /* Receive Watchdog Timeout */
  51. Eti = 0x00000400, /* Early Transmit Interrupt */
  52. Gte = 0x00000800, /* General purpose Timer Expired */
  53. Fbe = 0x00002000, /* Fatal Bit Error */
  54. Ais = 0x00008000, /* Abnormal Interrupt Summary */
  55. Nis = 0x00010000, /* Normal Interrupt Summary */
  56. Rs = 0x000E0000, /* Receive process State (field) */
  57. Ts = 0x00700000, /* Transmit process State (field) */
  58. Eb = 0x03800000, /* Error bits */
  59. };
  60. enum { /* CSR6 - Operating Mode */
  61. Hp = 0x00000001, /* Hash/Perfect receive filtering mode */
  62. Sr = 0x00000002, /* Start/stop Receive */
  63. Ho = 0x00000004, /* Hash-Only filtering mode */
  64. Pb = 0x00000008, /* Pass Bad frames */
  65. If = 0x00000010, /* Inverse Filtering */
  66. Sb = 0x00000020, /* Start/stop Backoff counter */
  67. Pr = 0x00000040, /* Promiscuous Mode */
  68. Pm = 0x00000080, /* Pass all Multicast */
  69. Fd = 0x00000200, /* Full Duplex mode */
  70. Om = 0x00000C00, /* Operating Mode (field) */
  71. Fc = 0x00001000, /* Force Collision */
  72. St = 0x00002000, /* Start/stop Transmission Command */
  73. Tr = 0x0000C000, /* ThReshold control bits (field) */
  74. Tr128 = 0x00000000,
  75. Tr256 = 0x00004000,
  76. Tr512 = 0x00008000,
  77. Tr1024 = 0x0000C000,
  78. Ca = 0x00020000, /* CApture effect enable */
  79. Ps = 0x00040000, /* Port Select */
  80. Hbd = 0x00080000, /* HeartBeat Disable */
  81. Imm = 0x00100000, /* IMMediate mode */
  82. Sf = 0x00200000, /* Store and Forward */
  83. Ttm = 0x00400000, /* Transmit Threshold Mode */
  84. Pcs = 0x00800000, /* PCS function */
  85. Scr = 0x01000000, /* SCRambler mode */
  86. Mbo = 0x02000000, /* Must Be One */
  87. Ra = 0x40000000, /* Receive All */
  88. Sc = 0x80000000, /* Special Capture effect enable */
  89. TrMODE = Tr512, /* default transmission threshold */
  90. };
  91. enum { /* CSR9 - ROM and MII Management */
  92. Scs = 0x00000001, /* serial ROM chip select */
  93. Sclk = 0x00000002, /* serial ROM clock */
  94. Sdi = 0x00000004, /* serial ROM data in */
  95. Sdo = 0x00000008, /* serial ROM data out */
  96. Ss = 0x00000800, /* serial ROM select */
  97. Wr = 0x00002000, /* write */
  98. Rd = 0x00004000, /* read */
  99. Mdc = 0x00010000, /* MII management clock */
  100. Mdo = 0x00020000, /* MII management write data */
  101. Mii = 0x00040000, /* MII management operation mode (W) */
  102. Mdi = 0x00080000, /* MII management data in */
  103. };
  104. enum { /* CSR12 - General-Purpose Port */
  105. Gpc = 0x00000100, /* General Purpose Control */
  106. };
  107. typedef struct Des {
  108. int status;
  109. int control;
  110. ulong addr;
  111. Block* bp;
  112. } Des;
  113. enum { /* status */
  114. Of = 0x00000001, /* Rx: OverFlow */
  115. Ce = 0x00000002, /* Rx: CRC Error */
  116. Db = 0x00000004, /* Rx: Dribbling Bit */
  117. Re = 0x00000008, /* Rx: Report on MII Error */
  118. Rw = 0x00000010, /* Rx: Receive Watchdog */
  119. Ft = 0x00000020, /* Rx: Frame Type */
  120. Cs = 0x00000040, /* Rx: Collision Seen */
  121. Tl = 0x00000080, /* Rx: Frame too Long */
  122. Ls = 0x00000100, /* Rx: Last deScriptor */
  123. Fs = 0x00000200, /* Rx: First deScriptor */
  124. Mf = 0x00000400, /* Rx: Multicast Frame */
  125. Rf = 0x00000800, /* Rx: Runt Frame */
  126. Dt = 0x00003000, /* Rx: Data Type (field) */
  127. De = 0x00004000, /* Rx: Descriptor Error */
  128. Fl = 0x3FFF0000, /* Rx: Frame Length (field) */
  129. Ff = 0x40000000, /* Rx: Filtering Fail */
  130. Def = 0x00000001, /* Tx: DEFerred */
  131. Uf = 0x00000002, /* Tx: UnderFlow error */
  132. Lf = 0x00000004, /* Tx: Link Fail report */
  133. Cc = 0x00000078, /* Tx: Collision Count (field) */
  134. Hf = 0x00000080, /* Tx: Heartbeat Fail */
  135. Ec = 0x00000100, /* Tx: Excessive Collisions */
  136. Lc = 0x00000200, /* Tx: Late Collision */
  137. Nc = 0x00000400, /* Tx: No Carrier */
  138. Lo = 0x00000800, /* Tx: LOss of carrier */
  139. To = 0x00004000, /* Tx: Transmission jabber timeOut */
  140. Es = 0x00008000, /* [RT]x: Error Summary */
  141. Own = 0x80000000, /* [RT]x: OWN bit */
  142. };
  143. enum { /* control */
  144. Bs1 = 0x000007FF, /* [RT]x: Buffer 1 Size */
  145. Bs2 = 0x003FF800, /* [RT]x: Buffer 2 Size */
  146. Ch = 0x01000000, /* [RT]x: second address CHained */
  147. Er = 0x02000000, /* [RT]x: End of Ring */
  148. Ft0 = 0x00400000, /* Tx: Filtering Type 0 */
  149. Dpd = 0x00800000, /* Tx: Disabled PaDding */
  150. Ac = 0x04000000, /* Tx: Add CRC disable */
  151. Set = 0x08000000, /* Tx: SETup packet */
  152. Ft1 = 0x10000000, /* Tx: Filtering Type 1 */
  153. Fseg = 0x20000000, /* Tx: First SEGment */
  154. Lseg = 0x40000000, /* Tx: Last SEGment */
  155. Ic = 0x80000000, /* Tx: Interrupt on Completion */
  156. };
  157. enum { /* PHY registers */
  158. Bmcr = 0, /* Basic Mode Control */
  159. Bmsr = 1, /* Basic Mode Status */
  160. Phyidr1 = 2, /* PHY Identifier #1 */
  161. Phyidr2 = 3, /* PHY Identifier #2 */
  162. Anar = 4, /* Auto-Negotiation Advertisment */
  163. Anlpar = 5, /* Auto-Negotiation Link Partner Ability */
  164. Aner = 6, /* Auto-Negotiation Expansion */
  165. };
  166. enum { /* Variants */
  167. Tulip0 = (0x0009<<16)|0x1011,
  168. Tulip1 = (0x0014<<16)|0x1011,
  169. Tulip3 = (0x0019<<16)|0x1011,
  170. Pnic = (0x0002<<16)|0x11AD,
  171. Pnic2 = (0xC115<<16)|0x11AD,
  172. CentaurP = (0x0985<<16)|0x1317,
  173. };
  174. typedef struct Ctlr Ctlr;
  175. typedef struct Ctlr {
  176. int port;
  177. Pcidev* pcidev;
  178. Ctlr* next;
  179. int active;
  180. int id; /* (pcidev->did<<16)|pcidev->vid */
  181. uchar* srom;
  182. int sromsz; /* address size in bits */
  183. uchar* sromea; /* MAC address */
  184. uchar* leaf;
  185. int sct; /* selected connection type */
  186. int k; /* info block count */
  187. uchar* infoblock[16];
  188. int sctk; /* sct block index */
  189. int curk; /* current block index */
  190. uchar* type5block;
  191. int phy[32]; /* logical to physical map */
  192. int phyreset; /* reset bitmap */
  193. int curphyad;
  194. int fdx;
  195. int ttm;
  196. uchar fd; /* option */
  197. int medium; /* option */
  198. int csr6; /* CSR6 - operating mode */
  199. int mask; /* CSR[57] - interrupt mask */
  200. int mbps;
  201. Lock lock;
  202. Des* rdr; /* receive descriptor ring */
  203. int nrdr; /* size of rdr */
  204. int rdrx; /* index into rdr */
  205. Lock tlock;
  206. Des* tdr; /* transmit descriptor ring */
  207. int ntdr; /* size of tdr */
  208. int tdrh; /* host index into tdr */
  209. int tdri; /* interface index into tdr */
  210. int ntq; /* descriptors active */
  211. int ntqmax;
  212. Block* setupbp;
  213. ulong of; /* receive statistics */
  214. ulong ce;
  215. ulong cs;
  216. ulong tl;
  217. ulong rf;
  218. ulong de;
  219. ulong ru;
  220. ulong rps;
  221. ulong rwt;
  222. ulong uf; /* transmit statistics */
  223. ulong ec;
  224. ulong lc;
  225. ulong nc;
  226. ulong lo;
  227. ulong to;
  228. ulong tps;
  229. ulong tu;
  230. ulong tjt;
  231. ulong unf;
  232. } Ctlr;
  233. static Ctlr* ctlrhead;
  234. static Ctlr* ctlrtail;
  235. #define csr32r(c, r) (inl((c)->port+((r)*8)))
  236. #define csr32w(c, r, l) (outl((c)->port+((r)*8), (ulong)(l)))
  237. static void
  238. promiscuous(void* arg, int on)
  239. {
  240. Ctlr *ctlr;
  241. ctlr = ((Ether*)arg)->ctlr;
  242. ilock(&ctlr->lock);
  243. if(on)
  244. ctlr->csr6 |= Pr;
  245. else
  246. ctlr->csr6 &= ~Pr;
  247. csr32w(ctlr, 6, ctlr->csr6);
  248. iunlock(&ctlr->lock);
  249. }
  250. static void
  251. attach(Ether* ether)
  252. {
  253. Ctlr *ctlr;
  254. ctlr = ether->ctlr;
  255. ilock(&ctlr->lock);
  256. if(!(ctlr->csr6 & Sr)){
  257. ctlr->csr6 |= Sr;
  258. csr32w(ctlr, 6, ctlr->csr6);
  259. }
  260. iunlock(&ctlr->lock);
  261. }
  262. static long
  263. ifstat(Ether* ether, void* a, long n, ulong offset)
  264. {
  265. Ctlr *ctlr;
  266. char *buf, *p;
  267. int i, l, len;
  268. ctlr = ether->ctlr;
  269. ether->crcs = ctlr->ce;
  270. ether->frames = ctlr->rf+ctlr->cs;
  271. ether->buffs = ctlr->de+ctlr->tl;
  272. ether->overflows = ctlr->of;
  273. if(n == 0)
  274. return 0;
  275. p = malloc(READSTR);
  276. l = snprint(p, READSTR, "Overflow: %lud\n", ctlr->of);
  277. l += snprint(p+l, READSTR-l, "Ru: %lud\n", ctlr->ru);
  278. l += snprint(p+l, READSTR-l, "Rps: %lud\n", ctlr->rps);
  279. l += snprint(p+l, READSTR-l, "Rwt: %lud\n", ctlr->rwt);
  280. l += snprint(p+l, READSTR-l, "Tps: %lud\n", ctlr->tps);
  281. l += snprint(p+l, READSTR-l, "Tu: %lud\n", ctlr->tu);
  282. l += snprint(p+l, READSTR-l, "Tjt: %lud\n", ctlr->tjt);
  283. l += snprint(p+l, READSTR-l, "Unf: %lud\n", ctlr->unf);
  284. l += snprint(p+l, READSTR-l, "CRC Error: %lud\n", ctlr->ce);
  285. l += snprint(p+l, READSTR-l, "Collision Seen: %lud\n", ctlr->cs);
  286. l += snprint(p+l, READSTR-l, "Frame Too Long: %lud\n", ctlr->tl);
  287. l += snprint(p+l, READSTR-l, "Runt Frame: %lud\n", ctlr->rf);
  288. l += snprint(p+l, READSTR-l, "Descriptor Error: %lud\n", ctlr->de);
  289. l += snprint(p+l, READSTR-l, "Underflow Error: %lud\n", ctlr->uf);
  290. l += snprint(p+l, READSTR-l, "Excessive Collisions: %lud\n", ctlr->ec);
  291. l += snprint(p+l, READSTR-l, "Late Collision: %lud\n", ctlr->lc);
  292. l += snprint(p+l, READSTR-l, "No Carrier: %lud\n", ctlr->nc);
  293. l += snprint(p+l, READSTR-l, "Loss of Carrier: %lud\n", ctlr->lo);
  294. l += snprint(p+l, READSTR-l, "Transmit Jabber Timeout: %lud\n",
  295. ctlr->to);
  296. l += snprint(p+l, READSTR-l, "csr6: %luX %uX\n", csr32r(ctlr, 6),
  297. ctlr->csr6);
  298. snprint(p+l, READSTR-l, "ntqmax: %d\n", ctlr->ntqmax);
  299. ctlr->ntqmax = 0;
  300. buf = a;
  301. len = readstr(offset, buf, n, p);
  302. if(offset > l)
  303. offset -= l;
  304. else
  305. offset = 0;
  306. buf += len;
  307. n -= len;
  308. l = snprint(p, READSTR, "srom:");
  309. for(i = 0; i < (1<<(ctlr->sromsz)*sizeof(ushort)); i++){
  310. if(i && ((i & 0x0F) == 0))
  311. l += snprint(p+l, READSTR-l, "\n ");
  312. l += snprint(p+l, READSTR-l, " %2.2uX", ctlr->srom[i]);
  313. }
  314. snprint(p+l, READSTR-l, "\n");
  315. len += readstr(offset, buf, n, p);
  316. free(p);
  317. return len;
  318. }
  319. static void
  320. txstart(Ether* ether)
  321. {
  322. Ctlr *ctlr;
  323. Block *bp;
  324. Des *des;
  325. int control;
  326. ctlr = ether->ctlr;
  327. while(ctlr->ntq < (ctlr->ntdr-1)){
  328. if(ctlr->setupbp){
  329. bp = ctlr->setupbp;
  330. ctlr->setupbp = 0;
  331. control = Ic|Set|BLEN(bp);
  332. }
  333. else{
  334. bp = qget(ether->oq);
  335. if(bp == nil)
  336. break;
  337. control = Ic|Lseg|Fseg|BLEN(bp);
  338. }
  339. ctlr->tdr[PREV(ctlr->tdrh, ctlr->ntdr)].control &= ~Ic;
  340. des = &ctlr->tdr[ctlr->tdrh];
  341. des->bp = bp;
  342. des->addr = PCIWADDR(bp->rp);
  343. des->control |= control;
  344. ctlr->ntq++;
  345. coherence();
  346. des->status = Own;
  347. csr32w(ctlr, 1, 0);
  348. ctlr->tdrh = NEXT(ctlr->tdrh, ctlr->ntdr);
  349. }
  350. if(ctlr->ntq > ctlr->ntqmax)
  351. ctlr->ntqmax = ctlr->ntq;
  352. }
  353. static void
  354. transmit(Ether* ether)
  355. {
  356. Ctlr *ctlr;
  357. ctlr = ether->ctlr;
  358. ilock(&ctlr->tlock);
  359. txstart(ether);
  360. iunlock(&ctlr->tlock);
  361. }
  362. static void
  363. interrupt(Ureg*, void* arg)
  364. {
  365. Ctlr *ctlr;
  366. Ether *ether;
  367. int len, status;
  368. Des *des;
  369. Block *bp;
  370. ether = arg;
  371. ctlr = ether->ctlr;
  372. while((status = csr32r(ctlr, 5)) & (Nis|Ais)){
  373. /*
  374. * Acknowledge the interrupts and mask-out
  375. * the ones that are implicitly handled.
  376. */
  377. csr32w(ctlr, 5, status);
  378. status &= (ctlr->mask & ~(Nis|Ti));
  379. if(status & Ais){
  380. if(status & Tps)
  381. ctlr->tps++;
  382. if(status & Tu)
  383. ctlr->tu++;
  384. if(status & Tjt)
  385. ctlr->tjt++;
  386. if(status & Ru)
  387. ctlr->ru++;
  388. if(status & Rps)
  389. ctlr->rps++;
  390. if(status & Rwt)
  391. ctlr->rwt++;
  392. status &= ~(Ais|Rwt|Rps|Ru|Tjt|Tu|Tps);
  393. }
  394. /*
  395. * Received packets.
  396. */
  397. if(status & Ri){
  398. des = &ctlr->rdr[ctlr->rdrx];
  399. while(!(des->status & Own)){
  400. if(des->status & Es){
  401. if(des->status & Of)
  402. ctlr->of++;
  403. if(des->status & Ce)
  404. ctlr->ce++;
  405. if(des->status & Cs)
  406. ctlr->cs++;
  407. if(des->status & Tl)
  408. ctlr->tl++;
  409. if(des->status & Rf)
  410. ctlr->rf++;
  411. if(des->status & De)
  412. ctlr->de++;
  413. }
  414. else if(bp = iallocb(Rbsz)){
  415. len = ((des->status & Fl)>>16)-4;
  416. des->bp->wp = des->bp->rp+len;
  417. etheriq(ether, des->bp, 1);
  418. des->bp = bp;
  419. des->addr = PCIWADDR(bp->rp);
  420. }
  421. des->control &= Er;
  422. des->control |= Rbsz;
  423. coherence();
  424. des->status = Own;
  425. ctlr->rdrx = NEXT(ctlr->rdrx, ctlr->nrdr);
  426. des = &ctlr->rdr[ctlr->rdrx];
  427. }
  428. status &= ~Ri;
  429. }
  430. /*
  431. * Check the transmit side:
  432. * check for Transmit Underflow and Adjust
  433. * the threshold upwards;
  434. * free any transmitted buffers and try to
  435. * top-up the ring.
  436. */
  437. if(status & Unf){
  438. ctlr->unf++;
  439. ilock(&ctlr->lock);
  440. csr32w(ctlr, 6, ctlr->csr6 & ~St);
  441. switch(ctlr->csr6 & Tr){
  442. case Tr128:
  443. len = Tr256;
  444. break;
  445. case Tr256:
  446. len = Tr512;
  447. break;
  448. case Tr512:
  449. len = Tr1024;
  450. break;
  451. default:
  452. case Tr1024:
  453. len = Sf;
  454. break;
  455. }
  456. ctlr->csr6 = (ctlr->csr6 & ~Tr)|len;
  457. csr32w(ctlr, 6, ctlr->csr6);
  458. iunlock(&ctlr->lock);
  459. csr32w(ctlr, 5, Tps);
  460. status &= ~(Unf|Tps);
  461. }
  462. ilock(&ctlr->tlock);
  463. while(ctlr->ntq){
  464. des = &ctlr->tdr[ctlr->tdri];
  465. if(des->status & Own)
  466. break;
  467. if(des->status & Es){
  468. if(des->status & Uf)
  469. ctlr->uf++;
  470. if(des->status & Ec)
  471. ctlr->ec++;
  472. if(des->status & Lc)
  473. ctlr->lc++;
  474. if(des->status & Nc)
  475. ctlr->nc++;
  476. if(des->status & Lo)
  477. ctlr->lo++;
  478. if(des->status & To)
  479. ctlr->to++;
  480. ether->oerrs++;
  481. }
  482. freeb(des->bp);
  483. des->control &= Er;
  484. ctlr->ntq--;
  485. ctlr->tdri = NEXT(ctlr->tdri, ctlr->ntdr);
  486. }
  487. txstart(ether);
  488. iunlock(&ctlr->tlock);
  489. /*
  490. * Anything left not catered for?
  491. */
  492. if(status)
  493. panic("#l%d: status %8.8uX\n", ether->ctlrno, status);
  494. }
  495. }
  496. static void
  497. ctlrinit(Ether* ether)
  498. {
  499. Ctlr *ctlr;
  500. Des *des;
  501. Block *bp;
  502. int i;
  503. uchar bi[Eaddrlen*2];
  504. ctlr = ether->ctlr;
  505. /*
  506. * Allocate and initialise the receive ring;
  507. * allocate and initialise the transmit ring;
  508. * unmask interrupts and start the transmit side;
  509. * create and post a setup packet to initialise
  510. * the physical ethernet address.
  511. */
  512. ctlr->rdr = xspanalloc(ctlr->nrdr*sizeof(Des), 8*sizeof(ulong), 0);
  513. for(des = ctlr->rdr; des < &ctlr->rdr[ctlr->nrdr]; des++){
  514. des->bp = iallocb(Rbsz);
  515. if(des->bp == nil)
  516. panic("can't allocate ethernet receive ring\n");
  517. des->status = Own;
  518. des->control = Rbsz;
  519. des->addr = PCIWADDR(des->bp->rp);
  520. }
  521. ctlr->rdr[ctlr->nrdr-1].control |= Er;
  522. ctlr->rdrx = 0;
  523. csr32w(ctlr, 3, PCIWADDR(ctlr->rdr));
  524. ctlr->tdr = xspanalloc(ctlr->ntdr*sizeof(Des), 8*sizeof(ulong), 0);
  525. ctlr->tdr[ctlr->ntdr-1].control |= Er;
  526. ctlr->tdrh = 0;
  527. ctlr->tdri = 0;
  528. csr32w(ctlr, 4, PCIWADDR(ctlr->tdr));
  529. /*
  530. * Clear any bits in the Status Register (CSR5) as
  531. * the PNIC has a different reset value from a true 2114x.
  532. */
  533. ctlr->mask = Nis|Ais|Fbe|Rwt|Rps|Ru|Ri|Unf|Tjt|Tps|Ti;
  534. csr32w(ctlr, 5, ctlr->mask);
  535. csr32w(ctlr, 7, ctlr->mask);
  536. ctlr->csr6 |= St;
  537. csr32w(ctlr, 6, ctlr->csr6);
  538. for(i = 0; i < Eaddrlen/2; i++){
  539. bi[i*4] = ether->ea[i*2];
  540. bi[i*4+1] = ether->ea[i*2+1];
  541. bi[i*4+2] = ether->ea[i*2+1];
  542. bi[i*4+3] = ether->ea[i*2];
  543. }
  544. bp = iallocb(Eaddrlen*2*16);
  545. if(bp == nil)
  546. panic("can't allocate ethernet setup buffer\n");
  547. memset(bp->rp, 0xFF, sizeof(bi));
  548. for(i = sizeof(bi); i < sizeof(bi)*16; i += sizeof(bi))
  549. memmove(bp->rp+i, bi, sizeof(bi));
  550. bp->wp += sizeof(bi)*16;
  551. ctlr->setupbp = bp;
  552. ether->oq = qopen(256*1024, Qmsg, 0, 0);
  553. transmit(ether);
  554. }
  555. static void
  556. csr9w(Ctlr* ctlr, int data)
  557. {
  558. csr32w(ctlr, 9, data);
  559. microdelay(1);
  560. }
  561. static int
  562. miimdi(Ctlr* ctlr, int n)
  563. {
  564. int data, i;
  565. /*
  566. * Read n bits from the MII Management Register.
  567. */
  568. data = 0;
  569. for(i = n-1; i >= 0; i--){
  570. if(csr32r(ctlr, 9) & Mdi)
  571. data |= (1<<i);
  572. csr9w(ctlr, Mii|Mdc);
  573. csr9w(ctlr, Mii);
  574. }
  575. csr9w(ctlr, 0);
  576. return data;
  577. }
  578. static void
  579. miimdo(Ctlr* ctlr, int bits, int n)
  580. {
  581. int i, mdo;
  582. /*
  583. * Write n bits to the MII Management Register.
  584. */
  585. for(i = n-1; i >= 0; i--){
  586. if(bits & (1<<i))
  587. mdo = Mdo;
  588. else
  589. mdo = 0;
  590. csr9w(ctlr, mdo);
  591. csr9w(ctlr, mdo|Mdc);
  592. csr9w(ctlr, mdo);
  593. }
  594. }
  595. static int
  596. miir(Ctlr* ctlr, int phyad, int regad)
  597. {
  598. int data, i;
  599. if(ctlr->id == Pnic){
  600. i = 1000;
  601. csr32w(ctlr, 20, 0x60020000|(phyad<<23)|(regad<<18));
  602. do{
  603. microdelay(1);
  604. data = csr32r(ctlr, 20);
  605. }while((data & 0x80000000) && --i);
  606. if(i == 0)
  607. return -1;
  608. return data & 0xFFFF;
  609. }
  610. /*
  611. * Preamble;
  612. * ST+OP+PHYAD+REGAD;
  613. * TA + 16 data bits.
  614. */
  615. miimdo(ctlr, 0xFFFFFFFF, 32);
  616. miimdo(ctlr, 0x1800|(phyad<<5)|regad, 14);
  617. data = miimdi(ctlr, 18);
  618. if(data & 0x10000)
  619. return -1;
  620. return data & 0xFFFF;
  621. }
  622. static void
  623. miiw(Ctlr* ctlr, int phyad, int regad, int data)
  624. {
  625. /*
  626. * Preamble;
  627. * ST+OP+PHYAD+REGAD+TA + 16 data bits;
  628. * Z.
  629. */
  630. miimdo(ctlr, 0xFFFFFFFF, 32);
  631. data &= 0xFFFF;
  632. data |= (0x05<<(5+5+2+16))|(phyad<<(5+2+16))|(regad<<(2+16))|(0x02<<16);
  633. miimdo(ctlr, data, 32);
  634. csr9w(ctlr, Mdc);
  635. csr9w(ctlr, 0);
  636. }
  637. static int
  638. sromr(Ctlr* ctlr, int r)
  639. {
  640. int i, op, data, size;
  641. if(ctlr->id == Pnic){
  642. i = 1000;
  643. csr32w(ctlr, 19, 0x600|r);
  644. do{
  645. microdelay(1);
  646. data = csr32r(ctlr, 19);
  647. }while((data & 0x80000000) && --i);
  648. if(ctlr->sromsz == 0)
  649. ctlr->sromsz = 6;
  650. return csr32r(ctlr, 9) & 0xFFFF;
  651. }
  652. /*
  653. * This sequence for reading a 16-bit register 'r'
  654. * in the EEPROM is taken (pretty much) straight from Section
  655. * 7.4 of the 21140 Hardware Reference Manual.
  656. */
  657. reread:
  658. csr9w(ctlr, Rd|Ss);
  659. csr9w(ctlr, Rd|Ss|Scs);
  660. csr9w(ctlr, Rd|Ss|Sclk|Scs);
  661. csr9w(ctlr, Rd|Ss);
  662. op = 0x06;
  663. for(i = 3-1; i >= 0; i--){
  664. data = Rd|Ss|(((op>>i) & 0x01)<<2)|Scs;
  665. csr9w(ctlr, data);
  666. csr9w(ctlr, data|Sclk);
  667. csr9w(ctlr, data);
  668. }
  669. /*
  670. * First time through must work out the EEPROM size.
  671. * This doesn't seem to work on the 21041 as implemented
  672. * in Virtual PC for the Mac, so wire any 21041 to 6,
  673. * it's the only 21041 this code will ever likely see.
  674. */
  675. if((size = ctlr->sromsz) == 0){
  676. if(ctlr->id == Tulip1)
  677. ctlr->sromsz = size = 6;
  678. else
  679. size = 8;
  680. }
  681. for(size = size-1; size >= 0; size--){
  682. data = Rd|Ss|(((r>>size) & 0x01)<<2)|Scs;
  683. csr9w(ctlr, data);
  684. csr9w(ctlr, data|Sclk);
  685. csr9w(ctlr, data);
  686. microdelay(1);
  687. if(ctlr->sromsz == 0 && !(csr32r(ctlr, 9) & Sdo))
  688. break;
  689. }
  690. data = 0;
  691. for(i = 16-1; i >= 0; i--){
  692. csr9w(ctlr, Rd|Ss|Sclk|Scs);
  693. if(csr32r(ctlr, 9) & Sdo)
  694. data |= (1<<i);
  695. csr9w(ctlr, Rd|Ss|Scs);
  696. }
  697. csr9w(ctlr, 0);
  698. if(ctlr->sromsz == 0){
  699. ctlr->sromsz = 8-size;
  700. goto reread;
  701. }
  702. return data & 0xFFFF;
  703. }
  704. static void
  705. softreset(Ctlr* ctlr)
  706. {
  707. /*
  708. * Soft-reset the controller and initialise bus mode.
  709. * Delay should be >= 50 PCI cycles (2×S @ 25MHz).
  710. */
  711. csr32w(ctlr, 0, Swr);
  712. microdelay(10);
  713. csr32w(ctlr, 0, Rml|Cal16);
  714. delay(1);
  715. }
  716. static int
  717. type5block(Ctlr* ctlr, uchar* block)
  718. {
  719. int csr15, i, len;
  720. /*
  721. * Reset or GPR sequence. Reset should be once only,
  722. * before the GPR sequence.
  723. * Note 'block' is not a pointer to the block head but
  724. * a pointer to the data in the block starting at the
  725. * reset length value so type5block can be used for the
  726. * sequences contained in type 1 and type 3 blocks.
  727. * The SROM docs state the 21140 type 5 block is the
  728. * same as that for the 21143, but the two controllers
  729. * use different registers and sequence-element lengths
  730. * so the 21140 code here is a guess for a real type 5
  731. * sequence.
  732. */
  733. len = *block++;
  734. if(ctlr->id != Tulip3){
  735. for(i = 0; i < len; i++){
  736. csr32w(ctlr, 12, *block);
  737. block++;
  738. }
  739. return len;
  740. }
  741. for(i = 0; i < len; i++){
  742. csr15 = *block++<<16;
  743. csr15 |= *block++<<24;
  744. csr32w(ctlr, 15, csr15);
  745. debug("%8.8uX ", csr15);
  746. }
  747. return 2*len;
  748. }
  749. static int
  750. typephylink(Ctlr* ctlr, uchar*)
  751. {
  752. int an, bmcr, bmsr, csr6, x;
  753. /*
  754. * Fail if
  755. * auto-negotiataion enabled but not complete;
  756. * no valid link established.
  757. */
  758. bmcr = miir(ctlr, ctlr->curphyad, Bmcr);
  759. miir(ctlr, ctlr->curphyad, Bmsr);
  760. bmsr = miir(ctlr, ctlr->curphyad, Bmsr);
  761. debug("bmcr 0x%2.2uX bmsr 0x%2.2uX\n", bmcr, bmsr);
  762. if(((bmcr & 0x1000) && !(bmsr & 0x0020)) || !(bmsr & 0x0004))
  763. return 0;
  764. if(bmcr & 0x1000){
  765. an = miir(ctlr, ctlr->curphyad, Anar);
  766. an &= miir(ctlr, ctlr->curphyad, Anlpar) & 0x3E0;
  767. debug("an 0x%2.uX 0x%2.2uX 0x%2.2uX\n",
  768. miir(ctlr, ctlr->curphyad, Anar),
  769. miir(ctlr, ctlr->curphyad, Anlpar),
  770. an);
  771. if(an & 0x0100)
  772. x = 0x4000;
  773. else if(an & 0x0080)
  774. x = 0x2000;
  775. else if(an & 0x0040)
  776. x = 0x1000;
  777. else if(an & 0x0020)
  778. x = 0x0800;
  779. else
  780. x = 0;
  781. }
  782. else if((bmcr & 0x2100) == 0x2100)
  783. x = 0x4000;
  784. else if(bmcr & 0x2000){
  785. /*
  786. * If FD capable, force it if necessary.
  787. */
  788. if((bmsr & 0x4000) && ctlr->fd){
  789. miiw(ctlr, ctlr->curphyad, Bmcr, 0x2100);
  790. x = 0x4000;
  791. }
  792. else
  793. x = 0x2000;
  794. }
  795. else if(bmcr & 0x0100)
  796. x = 0x1000;
  797. else
  798. x = 0x0800;
  799. csr6 = Sc|Mbo|Hbd|Ps|Ca|TrMODE|Sb;
  800. if(ctlr->fdx & x)
  801. csr6 |= Fd;
  802. if(ctlr->ttm & x)
  803. csr6 |= Ttm;
  804. debug("csr6 0x%8.8uX 0x%8.8uX 0x%8.8luX\n",
  805. csr6, ctlr->csr6, csr32r(ctlr, 6));
  806. if(csr6 != ctlr->csr6){
  807. ctlr->csr6 = csr6;
  808. csr32w(ctlr, 6, csr6);
  809. }
  810. return 1;
  811. }
  812. static int
  813. typephymode(Ctlr* ctlr, uchar* block, int wait)
  814. {
  815. uchar *p;
  816. int len, mc, nway, phyx, timeo;
  817. if(DEBUG){
  818. int i;
  819. len = (block[0] & ~0x80)+1;
  820. for(i = 0; i < len; i++)
  821. debug("%2.2uX ", block[i]);
  822. debug("\n");
  823. }
  824. if(block[1] == 1)
  825. len = 1;
  826. else if(block[1] == 3)
  827. len = 2;
  828. else
  829. return -1;
  830. /*
  831. * Snarf the media capabilities, nway advertisment,
  832. * FDX and TTM bitmaps.
  833. */
  834. p = &block[5+len*block[3]+len*block[4+len*block[3]]];
  835. mc = *p++;
  836. mc |= *p++<<8;
  837. nway = *p++;
  838. nway |= *p++<<8;
  839. ctlr->fdx = *p++;
  840. ctlr->fdx |= *p++<<8;
  841. ctlr->ttm = *p++;
  842. ctlr->ttm |= *p<<8;
  843. debug("mc %4.4uX nway %4.4uX fdx %4.4uX ttm %4.4uX\n",
  844. mc, nway, ctlr->fdx, ctlr->ttm);
  845. USED(mc);
  846. phyx = block[2];
  847. ctlr->curphyad = ctlr->phy[phyx];
  848. ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|TrMODE|Sb;
  849. //csr32w(ctlr, 6, ctlr->csr6);
  850. if(typephylink(ctlr, block))
  851. return 0;
  852. if(!(ctlr->phyreset & (1<<phyx))){
  853. debug("reset seq: len %d: ", block[3]);
  854. if(ctlr->type5block)
  855. type5block(ctlr, &ctlr->type5block[2]);
  856. else
  857. type5block(ctlr, &block[4+len*block[3]]);
  858. debug("\n");
  859. ctlr->phyreset |= (1<<phyx);
  860. }
  861. /*
  862. * GPR sequence.
  863. */
  864. debug("gpr seq: len %d: ", block[3]);
  865. type5block(ctlr, &block[3]);
  866. debug("\n");
  867. ctlr->csr6 = 0;//Sc|Mbo|Hbd|Ps|Ca|TrMODE|Sb;
  868. //csr32w(ctlr, 6, ctlr->csr6);
  869. if(typephylink(ctlr, block))
  870. return 0;
  871. /*
  872. * Turn off auto-negotiation, set the auto-negotiation
  873. * advertisment register then start the auto-negotiation
  874. * process again.
  875. */
  876. miiw(ctlr, ctlr->curphyad, Bmcr, 0);
  877. miiw(ctlr, ctlr->curphyad, Anar, nway|1);
  878. miiw(ctlr, ctlr->curphyad, Bmcr, 0x1000);
  879. if(!wait)
  880. return 0;
  881. for(timeo = 0; timeo < 45; timeo++){
  882. if(typephylink(ctlr, block))
  883. return 0;
  884. delay(100);
  885. }
  886. return -1;
  887. }
  888. static int
  889. typesymmode(Ctlr *ctlr, uchar *block, int wait)
  890. {
  891. uint gpmode, gpdata, command;
  892. USED(wait);
  893. gpmode = block[3] | ((uint) block[4] << 8);
  894. gpdata = block[5] | ((uint) block[6] << 8);
  895. command = (block[7] | ((uint) block[8] << 8)) & 0x71;
  896. if (command & 0x8000) {
  897. print("ether2114x.c: FIXME: handle type 4 mode blocks where cmd.active_invalid != 0\n");
  898. return -1;
  899. }
  900. csr32w(ctlr, 15, gpmode);
  901. csr32w(ctlr, 15, gpdata);
  902. ctlr->csr6 = (command & 0x71) << 18;
  903. csr32w(ctlr, 6, ctlr->csr6);
  904. return 0;
  905. }
  906. static int
  907. type2mode(Ctlr* ctlr, uchar* block, int)
  908. {
  909. uchar *p;
  910. int csr6, csr13, csr14, csr15, gpc, gpd;
  911. csr6 = Sc|Mbo|Ca|TrMODE|Sb;
  912. debug("type2mode: medium 0x%2.2uX\n", block[2]);
  913. /*
  914. * Don't attempt full-duplex
  915. * unless explicitly requested.
  916. */
  917. if((block[2] & 0x3F) == 0x04){ /* 10BASE-TFD */
  918. if(!ctlr->fd)
  919. return -1;
  920. csr6 |= Fd;
  921. }
  922. /*
  923. * Operating mode programming values from the datasheet
  924. * unless media specific data is explicitly given.
  925. */
  926. p = &block[3];
  927. if(block[2] & 0x40){
  928. csr13 = (block[4]<<8)|block[3];
  929. csr14 = (block[6]<<8)|block[5];
  930. csr15 = (block[8]<<8)|block[7];
  931. p += 6;
  932. }
  933. else switch(block[2] & 0x3F){
  934. default:
  935. return -1;
  936. case 0x00: /* 10BASE-T */
  937. csr13 = 0x00000001;
  938. csr14 = 0x00007F3F;
  939. csr15 = 0x00000008;
  940. break;
  941. case 0x01: /* 10BASE-2 */
  942. csr13 = 0x00000009;
  943. csr14 = 0x00000705;
  944. csr15 = 0x00000006;
  945. break;
  946. case 0x02: /* 10BASE-5 (AUI) */
  947. csr13 = 0x00000009;
  948. csr14 = 0x00000705;
  949. csr15 = 0x0000000E;
  950. break;
  951. case 0x04: /* 10BASE-TFD */
  952. csr13 = 0x00000001;
  953. csr14 = 0x00007F3D;
  954. csr15 = 0x00000008;
  955. break;
  956. }
  957. gpc = *p++<<16;
  958. gpc |= *p++<<24;
  959. gpd = *p++<<16;
  960. gpd |= *p<<24;
  961. csr32w(ctlr, 13, 0);
  962. csr32w(ctlr, 14, csr14);
  963. csr32w(ctlr, 15, gpc|csr15);
  964. delay(10);
  965. csr32w(ctlr, 15, gpd|csr15);
  966. csr32w(ctlr, 13, csr13);
  967. ctlr->csr6 = csr6;
  968. csr32w(ctlr, 6, ctlr->csr6);
  969. debug("type2mode: csr13 %8.8uX csr14 %8.8uX csr15 %8.8uX\n",
  970. csr13, csr14, csr15);
  971. debug("type2mode: gpc %8.8uX gpd %8.8uX csr6 %8.8uX\n",
  972. gpc, gpd, csr6);
  973. return 0;
  974. }
  975. static int
  976. type0link(Ctlr* ctlr, uchar* block)
  977. {
  978. int m, polarity, sense;
  979. m = (block[3]<<8)|block[2];
  980. sense = 1<<((m & 0x000E)>>1);
  981. if(m & 0x0080)
  982. polarity = sense;
  983. else
  984. polarity = 0;
  985. return (csr32r(ctlr, 12) & sense)^polarity;
  986. }
  987. static int
  988. type0mode(Ctlr* ctlr, uchar* block, int wait)
  989. {
  990. int csr6, m, timeo;
  991. csr6 = Sc|Mbo|Hbd|Ca|TrMODE|Sb;
  992. debug("type0: medium 0x%uX, fd %d: 0x%2.2uX 0x%2.2uX 0x%2.2uX 0x%2.2uX\n",
  993. ctlr->medium, ctlr->fd, block[0], block[1], block[2], block[3]);
  994. switch(block[0]){
  995. default:
  996. break;
  997. case 0x04: /* 10BASE-TFD */
  998. case 0x05: /* 100BASE-TXFD */
  999. case 0x08: /* 100BASE-FXFD */
  1000. /*
  1001. * Don't attempt full-duplex
  1002. * unless explicitly requested.
  1003. */
  1004. if(!ctlr->fd)
  1005. return -1;
  1006. csr6 |= Fd;
  1007. break;
  1008. }
  1009. m = (block[3]<<8)|block[2];
  1010. if(m & 0x0001)
  1011. csr6 |= Ps;
  1012. if(m & 0x0010)
  1013. csr6 |= Ttm;
  1014. if(m & 0x0020)
  1015. csr6 |= Pcs;
  1016. if(m & 0x0040)
  1017. csr6 |= Scr;
  1018. csr32w(ctlr, 12, block[1]);
  1019. microdelay(10);
  1020. csr32w(ctlr, 6, csr6);
  1021. ctlr->csr6 = csr6;
  1022. if(!wait)
  1023. return 0;
  1024. for(timeo = 0; timeo < 30; timeo++){
  1025. if(type0link(ctlr, block))
  1026. return 0;
  1027. delay(100);
  1028. }
  1029. return -1;
  1030. }
  1031. static int
  1032. media21041(Ether* ether, int wait)
  1033. {
  1034. Ctlr* ctlr;
  1035. uchar *block;
  1036. int csr6, csr13, csr14, csr15, medium, timeo;
  1037. ctlr = ether->ctlr;
  1038. block = ctlr->infoblock[ctlr->curk];
  1039. debug("media21041: block[0] %2.2uX, medium %4.4uX sct %4.4uX\n",
  1040. block[0], ctlr->medium, ctlr->sct);
  1041. medium = block[0] & 0x3F;
  1042. if(ctlr->medium >= 0 && medium != ctlr->medium)
  1043. return 0;
  1044. if(ctlr->sct != 0x0800 && (ctlr->sct & 0x3F) != medium)
  1045. return 0;
  1046. csr6 = Sc|Mbo|Ca|TrMODE|Sb;
  1047. if(block[0] & 0x40){
  1048. csr13 = (block[2]<<8)|block[1];
  1049. csr14 = (block[4]<<8)|block[3];
  1050. csr15 = (block[6]<<8)|block[5];
  1051. }
  1052. else switch(medium){
  1053. default:
  1054. return -1;
  1055. case 0x00: /* 10BASE-T */
  1056. csr13 = 0xEF01;
  1057. csr14 = 0xFF3F;
  1058. csr15 = 0x0008;
  1059. break;
  1060. case 0x01: /* 10BASE-2 */
  1061. csr13 = 0xEF09;
  1062. csr14 = 0xF73D;
  1063. csr15 = 0x0006;
  1064. break;
  1065. case 0x02: /* 10BASE-5 */
  1066. csr13 = 0xEF09;
  1067. csr14 = 0xF73D;
  1068. csr15 = 0x000E;
  1069. break;
  1070. case 0x04: /* 10BASE-TFD */
  1071. csr13 = 0xEF01;
  1072. csr14 = 0xFF3D;
  1073. csr15 = 0x0008;
  1074. break;
  1075. }
  1076. csr32w(ctlr, 13, 0);
  1077. csr32w(ctlr, 14, csr14);
  1078. csr32w(ctlr, 15, csr15);
  1079. csr32w(ctlr, 13, csr13);
  1080. delay(10);
  1081. if(medium == 0x04)
  1082. csr6 |= Fd;
  1083. ctlr->csr6 = csr6;
  1084. csr32w(ctlr, 6, ctlr->csr6);
  1085. debug("media21041: csr6 %8.8uX csr13 %4.4uX csr14 %4.4uX csr15 %4.4uX\n",
  1086. csr6, csr13, csr14, csr15);
  1087. if(!wait)
  1088. return 0;
  1089. for(timeo = 0; timeo < 30; timeo++){
  1090. if(!(csr32r(ctlr, 12) & 0x0002)){
  1091. debug("media21041: ok: csr12 %4.4luX timeo %d\n",
  1092. csr32r(ctlr, 12), timeo);
  1093. return 10;
  1094. }
  1095. delay(100);
  1096. }
  1097. debug("media21041: !ok: csr12 %4.4luX\n", csr32r(ctlr, 12));
  1098. return -1;
  1099. }
  1100. static int
  1101. mediaxx(Ether* ether, int wait)
  1102. {
  1103. Ctlr* ctlr;
  1104. uchar *block;
  1105. ctlr = ether->ctlr;
  1106. block = ctlr->infoblock[ctlr->curk];
  1107. if(block[0] & 0x80){
  1108. switch(block[1]){
  1109. default:
  1110. return -1;
  1111. case 0:
  1112. if(ctlr->medium >= 0 && block[2] != ctlr->medium)
  1113. return 0;
  1114. /* need this test? */ if(ctlr->sct != 0x0800 && (ctlr->sct & 0x3F) != block[2])
  1115. return 0;
  1116. if(type0mode(ctlr, block+2, wait))
  1117. return 0;
  1118. break;
  1119. case 1:
  1120. if(typephymode(ctlr, block, wait))
  1121. return 0;
  1122. break;
  1123. case 2:
  1124. debug("type2: medium %d block[2] %d\n",
  1125. ctlr->medium, block[2]);
  1126. if(ctlr->medium >= 0 && ((block[2] & 0x3F) != ctlr->medium))
  1127. return 0;
  1128. if(type2mode(ctlr, block, wait))
  1129. return 0;
  1130. break;
  1131. case 3:
  1132. if(typephymode(ctlr, block, wait))
  1133. return 0;
  1134. break;
  1135. case 4:
  1136. debug("type4: medium %d block[2] %d\n",
  1137. ctlr->medium, block[2]);
  1138. if(ctlr->medium >= 0 && ((block[2] & 0x3F) != ctlr->medium))
  1139. return 0;
  1140. if(typesymmode(ctlr, block, wait))
  1141. return 0;
  1142. break;
  1143. }
  1144. }
  1145. else{
  1146. if(ctlr->medium >= 0 && block[0] != ctlr->medium)
  1147. return 0;
  1148. /* need this test? */if(ctlr->sct != 0x0800 && (ctlr->sct & 0x3F) != block[0])
  1149. return 0;
  1150. if(type0mode(ctlr, block, wait))
  1151. return 0;
  1152. }
  1153. if(ctlr->csr6){
  1154. if(!(ctlr->csr6 & Ps) || (ctlr->csr6 & Ttm))
  1155. return 10;
  1156. return 100;
  1157. }
  1158. return 0;
  1159. }
  1160. static int
  1161. media(Ether* ether, int wait)
  1162. {
  1163. Ctlr* ctlr;
  1164. int k, mbps;
  1165. ctlr = ether->ctlr;
  1166. for(k = 0; k < ctlr->k; k++){
  1167. switch(ctlr->id){
  1168. default:
  1169. mbps = mediaxx(ether, wait);
  1170. break;
  1171. case Tulip1: /* 21041 */
  1172. mbps = media21041(ether, wait);
  1173. break;
  1174. }
  1175. if(mbps > 0)
  1176. return mbps;
  1177. if(ctlr->curk == 0)
  1178. ctlr->curk = ctlr->k-1;
  1179. else
  1180. ctlr->curk--;
  1181. }
  1182. return 0;
  1183. }
  1184. static char* mediatable[9] = {
  1185. "10BASE-T", /* TP */
  1186. "10BASE-2", /* BNC */
  1187. "10BASE-5", /* AUI */
  1188. "100BASE-TX",
  1189. "10BASE-TFD",
  1190. "100BASE-TXFD",
  1191. "100BASE-T4",
  1192. "100BASE-FX",
  1193. "100BASE-FXFD",
  1194. };
  1195. static uchar en1207[] = { /* Accton EN1207-COMBO */
  1196. 0x00, 0x00, 0xE8, /* [0] vendor ethernet code */
  1197. 0x00, /* [3] spare */
  1198. 0x00, 0x08, /* [4] connection (LSB+MSB = 0x0800) */
  1199. 0x1F, /* [6] general purpose control */
  1200. 2, /* [7] block count */
  1201. 0x00, /* [8] media code (10BASE-TX) */
  1202. 0x0B, /* [9] general purpose port data */
  1203. 0x9E, 0x00, /* [10] command (LSB+MSB = 0x009E) */
  1204. 0x03, /* [8] media code (100BASE-TX) */
  1205. 0x1B, /* [9] general purpose port data */
  1206. 0x6D, 0x00, /* [10] command (LSB+MSB = 0x006D) */
  1207. /* There is 10BASE-2 as well, but... */
  1208. };
  1209. static uchar ana6910fx[] = { /* Adaptec (Cogent) ANA-6910FX */
  1210. 0x00, 0x00, 0x92, /* [0] vendor ethernet code */
  1211. 0x00, /* [3] spare */
  1212. 0x00, 0x08, /* [4] connection (LSB+MSB = 0x0800) */
  1213. 0x3F, /* [6] general purpose control */
  1214. 1, /* [7] block count */
  1215. 0x07, /* [8] media code (100BASE-FX) */
  1216. 0x03, /* [9] general purpose port data */
  1217. 0x2D, 0x00 /* [10] command (LSB+MSB = 0x000D) */
  1218. };
  1219. static uchar smc9332[] = { /* SMC 9332 */
  1220. 0x00, 0x00, 0xC0, /* [0] vendor ethernet code */
  1221. 0x00, /* [3] spare */
  1222. 0x00, 0x08, /* [4] connection (LSB+MSB = 0x0800) */
  1223. 0x1F, /* [6] general purpose control */
  1224. 2, /* [7] block count */
  1225. 0x00, /* [8] media code (10BASE-TX) */
  1226. 0x00, /* [9] general purpose port data */
  1227. 0x9E, 0x00, /* [10] command (LSB+MSB = 0x009E) */
  1228. 0x03, /* [8] media code (100BASE-TX) */
  1229. 0x09, /* [9] general purpose port data */
  1230. 0x6D, 0x00, /* [10] command (LSB+MSB = 0x006D) */
  1231. };
  1232. static uchar* leaf21140[] = {
  1233. en1207, /* Accton EN1207-COMBO */
  1234. ana6910fx, /* Adaptec (Cogent) ANA-6910FX */
  1235. smc9332, /* SMC 9332 */
  1236. nil,
  1237. };
  1238. /*
  1239. * Copied to ctlr->srom at offset 20.
  1240. */
  1241. static uchar leafpnic[] = {
  1242. 0x00, 0x00, 0x00, 0x00, /* MAC address */
  1243. 0x00, 0x00,
  1244. 0x00, /* controller 0 device number */
  1245. 0x1E, 0x00, /* controller 0 info leaf offset */
  1246. 0x00, /* reserved */
  1247. 0x00, 0x08, /* selected connection type */
  1248. 0x00, /* general purpose control */
  1249. 0x01, /* block count */
  1250. 0x8C, /* format indicator and count */
  1251. 0x01, /* block type */
  1252. 0x00, /* PHY number */
  1253. 0x00, /* GPR sequence length */
  1254. 0x00, /* reset sequence length */
  1255. 0x00, 0x78, /* media capabilities */
  1256. 0xE0, 0x01, /* Nway advertisment */
  1257. 0x00, 0x50, /* FDX bitmap */
  1258. 0x00, 0x18, /* TTM bitmap */
  1259. };
  1260. static int
  1261. srom(Ctlr* ctlr)
  1262. {
  1263. int i, k, oui, phy, x;
  1264. uchar *p;
  1265. /*
  1266. * This is a partial decoding of the SROM format described in
  1267. * 'Digital Semiconductor 21X4 Serial ROM Format, Version 4.05,
  1268. * 2-Mar-98'. Only the 2114[03] are handled, support for other
  1269. * controllers can be added as needed.
  1270. * Do a dummy read first to get the size and allocate ctlr->srom.
  1271. */
  1272. sromr(ctlr, 0);
  1273. if(ctlr->srom == nil)
  1274. ctlr->srom = malloc((1<<ctlr->sromsz)*sizeof(ushort));
  1275. for(i = 0; i < (1<<ctlr->sromsz); i++){
  1276. x = sromr(ctlr, i);
  1277. ctlr->srom[2*i] = x;
  1278. ctlr->srom[2*i+1] = x>>8;
  1279. }
  1280. if(DEBUG){
  1281. print("srom:");
  1282. for(i = 0; i < ((1<<ctlr->sromsz)*sizeof(ushort)); i++){
  1283. if(i && ((i & 0x0F) == 0))
  1284. print("\n ");
  1285. print(" %2.2uX", ctlr->srom[i]);
  1286. }
  1287. print("\n");
  1288. }
  1289. /*
  1290. * There are at least 2 SROM layouts:
  1291. * e.g. Digital EtherWORKS station address at offset 20;
  1292. * this complies with the 21140A SROM
  1293. * application note from Digital;
  1294. * e.g. SMC9332 station address at offset 0 followed by
  1295. * 2 additional bytes, repeated at offset
  1296. * 6; the 8 bytes are also repeated in
  1297. * reverse order at offset 8.
  1298. * To check which it is, read the SROM and check for the repeating
  1299. * patterns of the non-compliant cards; if that fails use the one at
  1300. * offset 20.
  1301. */
  1302. ctlr->sromea = ctlr->srom;
  1303. for(i = 0; i < 8; i++){
  1304. x = ctlr->srom[i];
  1305. if(x != ctlr->srom[15-i] || x != ctlr->srom[16+i]){
  1306. ctlr->sromea = &ctlr->srom[20];
  1307. break;
  1308. }
  1309. }
  1310. /*
  1311. * Fake up the SROM for the PNIC and AMDtek.
  1312. * They look like a 21140 with a PHY.
  1313. * The MAC address is byte-swapped in the orginal
  1314. * PNIC SROM data.
  1315. */
  1316. if(ctlr->id == Pnic){
  1317. memmove(&ctlr->srom[20], leafpnic, sizeof(leafpnic));
  1318. for(i = 0; i < Eaddrlen; i += 2){
  1319. ctlr->srom[20+i] = ctlr->srom[i+1];
  1320. ctlr->srom[20+i+1] = ctlr->srom[i];
  1321. }
  1322. }
  1323. if(ctlr->id == CentaurP){
  1324. memmove(&ctlr->srom[20], leafpnic, sizeof(leafpnic));
  1325. for(i = 0; i < Eaddrlen; i += 2){
  1326. ctlr->srom[20+i] = ctlr->srom[8+i];
  1327. ctlr->srom[20+i+1] = ctlr->srom[8+i+1];
  1328. }
  1329. }
  1330. /*
  1331. * Next, try to find the info leaf in the SROM for media detection.
  1332. * If it's a non-conforming card try to match the vendor ethernet code
  1333. * and point p at a fake info leaf with compact 21140 entries.
  1334. */
  1335. if(ctlr->sromea == ctlr->srom){
  1336. p = nil;
  1337. for(i = 0; leaf21140[i] != nil; i++){
  1338. if(memcmp(leaf21140[i], ctlr->sromea, 3) == 0){
  1339. p = &leaf21140[i][4];
  1340. break;
  1341. }
  1342. }
  1343. if(p == nil)
  1344. return -1;
  1345. }
  1346. else
  1347. p = &ctlr->srom[(ctlr->srom[28]<<8)|ctlr->srom[27]];
  1348. /*
  1349. * Set up the info needed for later media detection.
  1350. * For the 21140, set the general-purpose mask in CSR12.
  1351. * The info block entries are stored in order of increasing
  1352. * precedence, so detection will work backwards through the
  1353. * stored indexes into ctlr->srom.
  1354. * If an entry is found which matches the selected connection
  1355. * type, save the index. Otherwise, start at the last entry.
  1356. * If any MII entries are found (type 1 and 3 blocks), scan
  1357. * for PHYs.
  1358. */
  1359. ctlr->leaf = p;
  1360. ctlr->sct = *p++;
  1361. ctlr->sct |= *p++<<8;
  1362. if(ctlr->id != Tulip3 && ctlr->id != Tulip1){
  1363. csr32w(ctlr, 12, Gpc|*p++);
  1364. delay(200);
  1365. }
  1366. ctlr->k = *p++;
  1367. if(ctlr->k >= nelem(ctlr->infoblock))
  1368. ctlr->k = nelem(ctlr->infoblock)-1;
  1369. ctlr->sctk = ctlr->k-1;
  1370. phy = 0;
  1371. for(k = 0; k < ctlr->k; k++){
  1372. ctlr->infoblock[k] = p;
  1373. if(ctlr->id == Tulip1){
  1374. debug("type21041: 0x%2.2uX\n", p[0]);
  1375. if(ctlr->sct != 0x0800 && *p == (ctlr->sct & 0xFF))
  1376. ctlr->sctk = k;
  1377. if(*p & 0x40)
  1378. p += 7;
  1379. else
  1380. p += 1;
  1381. }
  1382. /*
  1383. * The RAMIX PMC665 has a badly-coded SROM,
  1384. * hence the test for 21143 and type 3.
  1385. */
  1386. else if((*p & 0x80) || (ctlr->id == Tulip3 && *(p+1) == 3)){
  1387. *p |= 0x80;
  1388. if(*(p+1) == 1 || *(p+1) == 3)
  1389. phy = 1;
  1390. if(*(p+1) == 5)
  1391. ctlr->type5block = p;
  1392. p += (*p & ~0x80)+1;
  1393. }
  1394. else{
  1395. debug("type0: 0x%2.2uX 0x%2.2uX 0x%2.2uX 0x%2.2uX\n",
  1396. p[0], p[1], p[2], p[3]);
  1397. if(ctlr->sct != 0x0800 && *p == (ctlr->sct & 0xFF))
  1398. ctlr->sctk = k;
  1399. p += 4;
  1400. }
  1401. }
  1402. ctlr->curk = ctlr->sctk;
  1403. debug("sct 0x%uX medium 0x%uX k %d curk %d phy %d\n",
  1404. ctlr->sct, ctlr->medium, ctlr->k, ctlr->curk, phy);
  1405. if(phy){
  1406. x = 0;
  1407. for(k = 0; k < nelem(ctlr->phy); k++){
  1408. if(ctlr->id == CentaurP && k != 1)
  1409. continue;
  1410. if((oui = miir(ctlr, k, 2)) == -1 || oui == 0)
  1411. continue;
  1412. debug("phy reg 2 %4.4uX\n", oui);
  1413. if(DEBUG){
  1414. oui = (oui & 0x3FF)<<6;
  1415. oui |= miir(ctlr, k, 3)>>10;
  1416. miir(ctlr, k, 1);
  1417. debug("phy%d: index %d oui %uX reg1 %uX\n",
  1418. x, k, oui, miir(ctlr, k, 1));
  1419. USED(oui);
  1420. }
  1421. ctlr->phy[x] = k;
  1422. }
  1423. }
  1424. ctlr->fd = 0;
  1425. ctlr->medium = -1;
  1426. return 0;
  1427. }
  1428. static void
  1429. dec2114xpci(void)
  1430. {
  1431. Ctlr *ctlr;
  1432. Pcidev *p;
  1433. int x;
  1434. p = nil;
  1435. while(p = pcimatch(p, 0, 0)){
  1436. if(p->ccrb != 0x02 || p->ccru != 0)
  1437. continue;
  1438. switch((p->did<<16)|p->vid){
  1439. default:
  1440. continue;
  1441. case Tulip3: /* 21143 */
  1442. /*
  1443. * Exit sleep mode.
  1444. */
  1445. x = pcicfgr32(p, 0x40);
  1446. x &= ~0xC0000000;
  1447. pcicfgw32(p, 0x40, x);
  1448. /*FALLTHROUGH*/
  1449. case Tulip0: /* 21140 */
  1450. case Tulip1: /* 21041 */
  1451. case Pnic: /* PNIC */
  1452. case Pnic2: /* PNIC-II */
  1453. case CentaurP: /* ADMtek */
  1454. break;
  1455. }
  1456. /*
  1457. * bar[0] is the I/O port register address and
  1458. * bar[1] is the memory-mapped register address.
  1459. */
  1460. ctlr = malloc(sizeof(Ctlr));
  1461. ctlr->port = p->mem[0].bar & ~0x01;
  1462. ctlr->pcidev = p;
  1463. ctlr->id = (p->did<<16)|p->vid;
  1464. if(ioalloc(ctlr->port, p->mem[0].size, 0, "dec2114x") < 0){
  1465. print("dec2114x: port 0x%uX in use\n", ctlr->port);
  1466. free(ctlr);
  1467. continue;
  1468. }
  1469. /*
  1470. * Some cards (e.g. ANA-6910FX) seem to need the Ps bit
  1471. * set or they don't always work right after a hardware
  1472. * reset.
  1473. */
  1474. csr32w(ctlr, 6, Mbo|Ps);
  1475. softreset(ctlr);
  1476. if(srom(ctlr)){
  1477. iofree(ctlr->port);
  1478. free(ctlr);
  1479. continue;
  1480. }
  1481. switch(ctlr->id){
  1482. default:
  1483. break;
  1484. case Pnic: /* PNIC */
  1485. /*
  1486. * Turn off the jabber timer.
  1487. */
  1488. csr32w(ctlr, 15, 0x00000001);
  1489. break;
  1490. case CentaurP:
  1491. /*
  1492. * Nice - the register offsets change from *8 to *4
  1493. * for CSR16 and up...
  1494. * CSR25/26 give the MAC address read from the SROM.
  1495. * Don't really need to use this other than as a check,
  1496. * the SROM will be read in anyway so the value there
  1497. * can be used directly.
  1498. */
  1499. debug("csr25 %8.8luX csr26 %8.8luX\n",
  1500. inl(ctlr->port+0xA4), inl(ctlr->port+0xA8));
  1501. debug("phyidr1 %4.4luX phyidr2 %4.4luX\n",
  1502. inl(ctlr->port+0xBC), inl(ctlr->port+0xC0));
  1503. break;
  1504. }
  1505. if(ctlrhead != nil)
  1506. ctlrtail->next = ctlr;
  1507. else
  1508. ctlrhead = ctlr;
  1509. ctlrtail = ctlr;
  1510. }
  1511. }
  1512. static int
  1513. reset(Ether* ether)
  1514. {
  1515. Ctlr *ctlr;
  1516. int i, x;
  1517. uchar ea[Eaddrlen];
  1518. static int scandone;
  1519. if(scandone == 0){
  1520. dec2114xpci();
  1521. scandone = 1;
  1522. }
  1523. /*
  1524. * Any adapter matches if no ether->port is supplied,
  1525. * otherwise the ports must match.
  1526. */
  1527. for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
  1528. if(ctlr->active)
  1529. continue;
  1530. if(ether->port == 0 || ether->port == ctlr->port){
  1531. ctlr->active = 1;
  1532. break;
  1533. }
  1534. }
  1535. if(ctlr == nil)
  1536. return -1;
  1537. ether->ctlr = ctlr;
  1538. ether->port = ctlr->port;
  1539. ether->irq = ctlr->pcidev->intl;
  1540. ether->tbdf = ctlr->pcidev->tbdf;
  1541. /*
  1542. * Check if the adapter's station address is to be overridden.
  1543. * If not, read it from the EEPROM and set in ether->ea prior to
  1544. * loading the station address in the hardware.
  1545. */
  1546. memset(ea, 0, Eaddrlen);
  1547. if(memcmp(ea, ether->ea, Eaddrlen) == 0)
  1548. memmove(ether->ea, ctlr->sromea, Eaddrlen);
  1549. /*
  1550. * Look for a medium override in case there's no autonegotiation
  1551. * (no MII) or the autonegotiation fails.
  1552. */
  1553. for(i = 0; i < ether->nopt; i++){
  1554. if(cistrcmp(ether->opt[i], "FD") == 0){
  1555. ctlr->fd = 1;
  1556. continue;
  1557. }
  1558. for(x = 0; x < nelem(mediatable); x++){
  1559. debug("compare <%s> <%s>\n", mediatable[x],
  1560. ether->opt[i]);
  1561. if(cistrcmp(mediatable[x], ether->opt[i]))
  1562. continue;
  1563. ctlr->medium = x;
  1564. switch(ctlr->medium){
  1565. default:
  1566. ctlr->fd = 0;
  1567. break;
  1568. case 0x04: /* 10BASE-TFD */
  1569. case 0x05: /* 100BASE-TXFD */
  1570. case 0x08: /* 100BASE-FXFD */
  1571. ctlr->fd = 1;
  1572. break;
  1573. }
  1574. break;
  1575. }
  1576. }
  1577. ether->mbps = media(ether, 1);
  1578. /*
  1579. * Initialise descriptor rings, ethernet address.
  1580. */
  1581. ctlr->nrdr = Nrde;
  1582. ctlr->ntdr = Ntde;
  1583. pcisetbme(ctlr->pcidev);
  1584. ctlrinit(ether);
  1585. /*
  1586. * Linkage to the generic ethernet driver.
  1587. */
  1588. ether->attach = attach;
  1589. ether->transmit = transmit;
  1590. ether->interrupt = interrupt;
  1591. ether->ifstat = ifstat;
  1592. ether->arg = ether;
  1593. ether->promiscuous = promiscuous;
  1594. return 0;
  1595. }
  1596. void
  1597. ether2114xlink(void)
  1598. {
  1599. addethercard("21140", reset);
  1600. addethercard("2114x", reset);
  1601. }