ether2114x.c 41 KB

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