ether2114x.c 41 KB

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