ether2114x.c 31 KB

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