ether8169.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675
  1. /*
  2. * Realtek RTL8110/8168/8169 Gigabit Ethernet Controllers.
  3. * There are some magic register values used which are not described in
  4. * any datasheet or driver but seem to be necessary.
  5. * There are slight differences between the chips in the series so some
  6. * tweaks may be needed.
  7. *
  8. * we use l1 and l2 cache ops; data must reach ram for dma.
  9. */
  10. #include "u.h"
  11. #include "../port/lib.h"
  12. #include "mem.h"
  13. #include "dat.h"
  14. #include "fns.h"
  15. #include "io.h"
  16. #include "../port/error.h"
  17. #include "../port/netif.h"
  18. #include "etherif.h"
  19. #include "ethermii.h"
  20. typedef struct Ctlr Ctlr;
  21. typedef struct D D; /* Transmit/Receive Descriptor */
  22. typedef struct Dtcc Dtcc;
  23. enum {
  24. Debug = 0, /* beware: > 1 interferes with correct operation */
  25. };
  26. enum { /* registers */
  27. Idr0 = 0x00, /* MAC address */
  28. Mar0 = 0x08, /* Multicast address */
  29. Dtccr = 0x10, /* Dump Tally Counter Command */
  30. Tnpds = 0x20, /* Transmit Normal Priority Descriptors */
  31. Thpds = 0x28, /* Transmit High Priority Descriptors */
  32. Flash = 0x30, /* Flash Memory Read/Write */
  33. Erbcr = 0x34, /* Early Receive Byte Count */
  34. Ersr = 0x36, /* Early Receive Status */
  35. Cr = 0x37, /* Command Register */
  36. Tppoll = 0x38, /* Transmit Priority Polling */
  37. Imr = 0x3C, /* Interrupt Mask */
  38. Isr = 0x3E, /* Interrupt Status */
  39. Tcr = 0x40, /* Transmit Configuration */
  40. Rcr = 0x44, /* Receive Configuration */
  41. Tctr = 0x48, /* Timer Count */
  42. Mpc = 0x4C, /* Missed Packet Counter */
  43. Cr9346 = 0x50, /* 9346 Command Register */
  44. Config0 = 0x51, /* Configuration Register 0 */
  45. Config1 = 0x52, /* Configuration Register 1 */
  46. Config2 = 0x53, /* Configuration Register 2 */
  47. Config3 = 0x54, /* Configuration Register 3 */
  48. Config4 = 0x55, /* Configuration Register 4 */
  49. Config5 = 0x56, /* Configuration Register 5 */
  50. Timerint = 0x58, /* Timer Interrupt */
  51. Mulint = 0x5C, /* Multiple Interrupt Select */
  52. Phyar = 0x60, /* PHY Access */
  53. Tbicsr0 = 0x64, /* TBI Control and Status */
  54. Tbianar = 0x68, /* TBI Auto-Negotiation Advertisment */
  55. Tbilpar = 0x6A, /* TBI Auto-Negotiation Link Partner */
  56. Phystatus = 0x6C, /* PHY Status */
  57. Rms = 0xDA, /* Receive Packet Maximum Size */
  58. Cplusc = 0xE0, /* C+ Command */
  59. Coal = 0xE2, /* Interrupt Mitigation (Coalesce) */
  60. Rdsar = 0xE4, /* Receive Descriptor Start Address */
  61. Etx = 0xEC, /* 8169: Early Tx Threshold; 32-byte units */
  62. Mtps = 0xEC, /* 8168: Maximum Transmit Packet Size */
  63. };
  64. enum { /* Dtccr */
  65. Cmd = 0x00000008, /* Command */
  66. };
  67. enum { /* Cr */
  68. Te = 0x04, /* Transmitter Enable */
  69. Re = 0x08, /* Receiver Enable */
  70. Rst = 0x10, /* Software Reset */
  71. };
  72. enum { /* Tppoll */
  73. Fswint = 0x01, /* Forced Software Interrupt */
  74. Npq = 0x40, /* Normal Priority Queue polling */
  75. Hpq = 0x80, /* High Priority Queue polling */
  76. };
  77. enum { /* Imr/Isr */
  78. Rok = 0x0001, /* Receive OK */
  79. Rer = 0x0002, /* Receive Error */
  80. Tok = 0x0004, /* Transmit OK */
  81. Ter = 0x0008, /* Transmit Error */
  82. Rdu = 0x0010, /* Receive Descriptor Unavailable */
  83. Punlc = 0x0020, /* Packet Underrun or Link Change */
  84. Fovw = 0x0040, /* Receive FIFO Overflow */
  85. Tdu = 0x0080, /* Transmit Descriptor Unavailable */
  86. Swint = 0x0100, /* Software Interrupt */
  87. Timeout = 0x4000, /* Timer */
  88. Serr = 0x8000, /* System Error */
  89. };
  90. enum { /* Tcr */
  91. MtxdmaSHIFT = 8, /* Max. DMA Burst Size */
  92. MtxdmaMASK = 0x00000700,
  93. Mtxdmaunlimited = 0x00000700,
  94. Acrc = 0x00010000, /* Append CRC (not) */
  95. Lbk0 = 0x00020000, /* Loopback Test 0 */
  96. Lbk1 = 0x00040000, /* Loopback Test 1 */
  97. Ifg2 = 0x00080000, /* Interframe Gap 2 */
  98. HwveridSHIFT = 23, /* Hardware Version ID */
  99. HwveridMASK = 0x7C800000,
  100. Macv01 = 0x00000000, /* RTL8169 */
  101. Macv02 = 0x00800000, /* RTL8169S/8110S */
  102. Macv03 = 0x04000000, /* RTL8169S/8110S */
  103. Macv04 = 0x10000000, /* RTL8169SB/8110SB */
  104. Macv05 = 0x18000000, /* RTL8169SC/8110SC */
  105. Macv07 = 0x24800000, /* RTL8102e */
  106. // Macv8103e = 0x24C00000,
  107. Macv25 = 0x28000000, /* RTL8168D */
  108. // Macv8168dp = 0x28800000,
  109. // Macv8168e = 0x2C000000,
  110. Macv11 = 0x30000000, /* RTL8168B/8111B */
  111. Macv14 = 0x30800000, /* RTL8100E */
  112. Macv13 = 0x34000000, /* RTL8101E */
  113. Macv07a = 0x34800000, /* RTL8102e */
  114. Macv12 = 0x38000000, /* RTL8169B/8111B */
  115. // Macv8168spin3 = 0x38400000,
  116. Macv15 = 0x38800000, /* RTL8100E */
  117. Macv12a = 0x3c000000, /* RTL8169C/8111C */
  118. // Macv19 = 0x3c000000, /* dup Macv12a: RTL8111c-gr */
  119. // Macv8168cspin2 = 0x3c400000,
  120. // Macv8168cp = 0x3c800000,
  121. // Macv8139 = 0x60000000,
  122. // Macv8139a = 0x70000000,
  123. // Macv8139ag = 0x70800000,
  124. // Macv8139b = 0x78000000,
  125. // Macv8130 = 0x7C000000,
  126. // Macv8139c = 0x74000000,
  127. // Macv8139d = 0x74400000,
  128. // Macv8139cplus = 0x74800000,
  129. // Macv8101 = 0x74c00000,
  130. // Macv8100 = 0x78800000,
  131. // Macv8169_8110sbl= 0x7cc00000,
  132. // Macv8169_8110sce= 0x98000000,
  133. Ifg0 = 0x01000000, /* Interframe Gap 0 */
  134. Ifg1 = 0x02000000, /* Interframe Gap 1 */
  135. };
  136. enum { /* Rcr */
  137. Aap = 0x00000001, /* Accept All Packets */
  138. Apm = 0x00000002, /* Accept Physical Match */
  139. Am = 0x00000004, /* Accept Multicast */
  140. Ab = 0x00000008, /* Accept Broadcast */
  141. Ar = 0x00000010, /* Accept Runt */
  142. Aer = 0x00000020, /* Accept Error */
  143. Sel9356 = 0x00000040, /* 9356 EEPROM used */
  144. MrxdmaSHIFT = 8, /* Max. DMA Burst Size */
  145. MrxdmaMASK = 0x00000700,
  146. Mrxdmaunlimited = 0x00000700,
  147. RxfthSHIFT = 13, /* Receive Buffer Length */
  148. RxfthMASK = 0x0000E000,
  149. Rxfth256 = 0x00008000,
  150. Rxfthnone = 0x0000E000,
  151. Rer8 = 0x00010000, /* Accept Error Packets > 8 bytes */
  152. MulERINT = 0x01000000, /* Multiple Early Interrupt Select */
  153. };
  154. enum { /* Cr9346 */
  155. Eedo = 0x01, /* */
  156. Eedi = 0x02, /* */
  157. Eesk = 0x04, /* */
  158. Eecs = 0x08, /* */
  159. Eem0 = 0x40, /* Operating Mode */
  160. Eem1 = 0x80,
  161. };
  162. enum { /* Phyar */
  163. DataMASK = 0x0000FFFF, /* 16-bit GMII/MII Register Data */
  164. DataSHIFT = 0,
  165. RegaddrMASK = 0x001F0000, /* 5-bit GMII/MII Register Address */
  166. RegaddrSHIFT = 16,
  167. Flag = 0x80000000, /* */
  168. };
  169. enum { /* Phystatus */
  170. Fd = 0x01, /* Full Duplex */
  171. Linksts = 0x02, /* Link Status */
  172. Speed10 = 0x04, /* */
  173. Speed100 = 0x08, /* */
  174. Speed1000 = 0x10, /* */
  175. Rxflow = 0x20, /* */
  176. Txflow = 0x40, /* */
  177. Entbi = 0x80, /* */
  178. };
  179. enum { /* Cplusc */
  180. Init1 = 0x0001, /* 8168 */
  181. Mulrw = 0x0008, /* PCI Multiple R/W Enable */
  182. Dac = 0x0010, /* PCI Dual Address Cycle Enable */
  183. Rxchksum = 0x0020, /* Receive Checksum Offload Enable */
  184. Rxvlan = 0x0040, /* Receive VLAN De-tagging Enable */
  185. Pktcntoff = 0x0080, /* 8168, 8101 */
  186. Endian = 0x0200, /* Endian Mode */
  187. };
  188. struct D {
  189. u32int control;
  190. u32int vlan;
  191. u32int addrlo;
  192. u32int addrhi;
  193. };
  194. enum { /* Transmit Descriptor control */
  195. TxflMASK = 0x0000FFFF, /* Transmit Frame Length */
  196. TxflSHIFT = 0,
  197. Tcps = 0x00010000, /* TCP Checksum Offload */
  198. Udpcs = 0x00020000, /* UDP Checksum Offload */
  199. Ipcs = 0x00040000, /* IP Checksum Offload */
  200. Lgsen = 0x08000000, /* TSO; WARNING: contains lark's vomit */
  201. };
  202. enum { /* Receive Descriptor control */
  203. RxflMASK = 0x00001FFF, /* Receive Frame Length */
  204. Tcpf = 0x00004000, /* TCP Checksum Failure */
  205. Udpf = 0x00008000, /* UDP Checksum Failure */
  206. Ipf = 0x00010000, /* IP Checksum Failure */
  207. Pid0 = 0x00020000, /* Protocol ID0 */
  208. Pid1 = 0x00040000, /* Protocol ID1 */
  209. Crce = 0x00080000, /* CRC Error */
  210. Runt = 0x00100000, /* Runt Packet */
  211. Res = 0x00200000, /* Receive Error Summary */
  212. Rwt = 0x00400000, /* Receive Watchdog Timer Expired */
  213. Fovf = 0x00800000, /* FIFO Overflow */
  214. Bovf = 0x01000000, /* Buffer Overflow */
  215. Bar = 0x02000000, /* Broadcast Address Received */
  216. Pam = 0x04000000, /* Physical Address Matched */
  217. Mar = 0x08000000, /* Multicast Address Received */
  218. };
  219. enum { /* General Descriptor control */
  220. Ls = 0x10000000, /* Last Segment Descriptor */
  221. Fs = 0x20000000, /* First Segment Descriptor */
  222. Eor = 0x40000000, /* End of Descriptor Ring */
  223. Own = 0x80000000, /* Ownership: belongs to hw */
  224. };
  225. /*
  226. */
  227. enum { /* Ring sizes (<= 1024) */
  228. Ntd = 1024, /* Transmit Ring */
  229. /* at 1Gb/s, it only takes 12 ms. to fill a 1024-buffer ring */
  230. Nrd = 1024, /* Receive Ring */
  231. Nrb = 4096,
  232. Mtu = ETHERMAXTU,
  233. Mps = ROUNDUP(ETHERMAXTU+4, 128),
  234. // Mps = Mtu + 8 + 14, /* if(mtu>ETHERMAXTU) */
  235. };
  236. struct Dtcc {
  237. u64int txok;
  238. u64int rxok;
  239. u64int txer;
  240. u32int rxer;
  241. u16int misspkt;
  242. u16int fae;
  243. u32int tx1col;
  244. u32int txmcol;
  245. u64int rxokph;
  246. u64int rxokbrd;
  247. u32int rxokmu;
  248. u16int txabt;
  249. u16int txundrn;
  250. };
  251. enum { /* Variants */
  252. Rtl8100e = (0x8136<<16)|0x10EC, /* RTL810[01]E: pci -e */
  253. Rtl8169c = (0x0116<<16)|0x16EC, /* RTL8169C+ (USR997902) */
  254. Rtl8169sc = (0x8167<<16)|0x10EC, /* RTL8169SC */
  255. Rtl8168b = (0x8168<<16)|0x10EC, /* RTL8168B: pci-e */
  256. Rtl8169 = (0x8169<<16)|0x10EC, /* RTL8169 */
  257. /*
  258. * trimslice is 10ec/8168 (8168b) Macv25 (8168D) but
  259. * compulab says 8111dl.
  260. * oui 0x732 (aaeon) phyno 1, macv = 0x28000000 phyv = 0x0002
  261. */
  262. };
  263. struct Ctlr {
  264. void* nic;
  265. int port;
  266. Pcidev* pcidev;
  267. Ctlr* next;
  268. Ether* ether; /* point back */
  269. int active;
  270. QLock alock; /* attach */
  271. Lock ilock; /* init */
  272. int init; /* */
  273. int pciv; /* */
  274. int macv; /* MAC version */
  275. int phyv; /* PHY version */
  276. int pcie; /* flag: pci-express device? */
  277. uvlong mchash; /* multicast hash */
  278. Mii* mii;
  279. // Lock tlock; /* transmit */
  280. Rendez trendez;
  281. D* td; /* descriptor ring */
  282. Block** tb; /* transmit buffers */
  283. int ntd;
  284. int tdh; /* head - producer index (host) */
  285. int tdt; /* tail - consumer index (NIC) */
  286. int ntdfree;
  287. int ntq;
  288. int nrb;
  289. // Lock rlock; /* receive */
  290. Rendez rrendez;
  291. D* rd; /* descriptor ring */
  292. Block** rb; /* receive buffers */
  293. int nrd;
  294. int rdh; /* head - producer index (NIC) */
  295. int rdt; /* tail - consumer index (host) */
  296. int nrdfree;
  297. Lock reglock;
  298. int tcr; /* transmit configuration register */
  299. int rcr; /* receive configuration register */
  300. int imr;
  301. int isr; /* sw copy for kprocs */
  302. QLock slock; /* statistics */
  303. Dtcc* dtcc;
  304. uint txdu;
  305. uint tcpf;
  306. uint udpf;
  307. uint ipf;
  308. uint fovf;
  309. uint ierrs;
  310. uint rer;
  311. uint rdu;
  312. uint punlc;
  313. uint fovw;
  314. uint mcast;
  315. uint frag; /* partial packets; rb was too small */
  316. };
  317. static Ctlr* rtl8169ctlrhead;
  318. static Ctlr* rtl8169ctlrtail;
  319. static Lock rblock; /* free receive Blocks */
  320. static Block* rbpool;
  321. #define csr8r(c, r) (*((uchar *) ((c)->nic)+(r)))
  322. #define csr16r(c, r) (*((u16int *)((c)->nic)+((r)/2)))
  323. #define csr32p(c, r) ((u32int *) ((c)->nic)+((r)/4))
  324. #define csr32r(c, r) (*csr32p(c, r))
  325. #define csr8w(c, r, b) (*((uchar *) ((c)->nic)+(r)) = (b), coherence())
  326. #define csr16w(c, r, w) (*((u16int *)((c)->nic)+((r)/2)) = (w), coherence())
  327. #define csr32w(c, r, v) (*csr32p(c, r) = (v), coherence())
  328. static int
  329. rtl8169miimir(Mii* mii, int pa, int ra)
  330. {
  331. uint r;
  332. int timeo;
  333. Ctlr *ctlr;
  334. if(pa != 1)
  335. return -1;
  336. ctlr = mii->ctlr;
  337. r = (ra<<16) & RegaddrMASK;
  338. csr32w(ctlr, Phyar, r);
  339. delay(1);
  340. for(timeo = 0; timeo < 2000; timeo++){
  341. if((r = csr32r(ctlr, Phyar)) & Flag)
  342. break;
  343. microdelay(100);
  344. }
  345. if(!(r & Flag))
  346. return -1;
  347. return (r & DataMASK)>>DataSHIFT;
  348. }
  349. static int
  350. rtl8169miimiw(Mii* mii, int pa, int ra, int data)
  351. {
  352. uint r;
  353. int timeo;
  354. Ctlr *ctlr;
  355. if(pa != 1)
  356. return -1;
  357. ctlr = mii->ctlr;
  358. r = Flag|((ra<<16) & RegaddrMASK)|((data<<DataSHIFT) & DataMASK);
  359. csr32w(ctlr, Phyar, r);
  360. delay(1);
  361. for(timeo = 0; timeo < 2000; timeo++){
  362. if(!((r = csr32r(ctlr, Phyar)) & Flag))
  363. break;
  364. microdelay(100);
  365. }
  366. if(r & Flag)
  367. return -1;
  368. return 0;
  369. }
  370. static int
  371. rtl8169mii(Ctlr* ctlr)
  372. {
  373. MiiPhy *phy;
  374. /*
  375. * Link management.
  376. */
  377. if((ctlr->mii = malloc(sizeof(Mii))) == nil)
  378. return -1;
  379. ctlr->mii->mir = rtl8169miimir;
  380. ctlr->mii->miw = rtl8169miimiw;
  381. ctlr->mii->ctlr = ctlr;
  382. /*
  383. * Get rev number out of Phyidr2 so can config properly.
  384. * There's probably more special stuff for Macv0[234] needed here.
  385. */
  386. ilock(&ctlr->reglock);
  387. ctlr->phyv = rtl8169miimir(ctlr->mii, 1, Phyidr2) & 0x0F;
  388. if(ctlr->macv == Macv02){
  389. csr8w(ctlr, 0x82, 1); /* magic */
  390. rtl8169miimiw(ctlr->mii, 1, 0x0B, 0x0000); /* magic */
  391. }
  392. if(mii(ctlr->mii, (1<<1)) == 0 || (phy = ctlr->mii->curphy) == nil){
  393. iunlock(&ctlr->reglock);
  394. free(ctlr->mii);
  395. ctlr->mii = nil;
  396. return -1;
  397. }
  398. print("rtl8169: oui %#ux phyno %d, macv = %#8.8ux phyv = %#4.4ux\n",
  399. phy->oui, phy->phyno, ctlr->macv, ctlr->phyv);
  400. miiane(ctlr->mii, ~0, ~0, ~0);
  401. iunlock(&ctlr->reglock);
  402. return 0;
  403. }
  404. static Block*
  405. rballoc(void)
  406. {
  407. Block *bp;
  408. ilock(&rblock);
  409. if((bp = rbpool) != nil){
  410. rbpool = bp->next;
  411. bp->next = nil;
  412. _xinc(&bp->ref); /* prevent bp from being freed */
  413. }
  414. iunlock(&rblock);
  415. return bp;
  416. }
  417. static void
  418. rbfree(Block *bp)
  419. {
  420. bp->wp = bp->rp = bp->lim - Mps;
  421. bp->flag &= ~(Bipck | Budpck | Btcpck | Bpktck);
  422. ilock(&rblock);
  423. bp->next = rbpool;
  424. rbpool = bp;
  425. iunlock(&rblock);
  426. }
  427. static void
  428. rtl8169promiscuous(void* arg, int on)
  429. {
  430. Ether *edev;
  431. Ctlr * ctlr;
  432. edev = arg;
  433. ctlr = edev->ctlr;
  434. ilock(&ctlr->ilock);
  435. ilock(&ctlr->reglock);
  436. if(on)
  437. ctlr->rcr |= Aap;
  438. else
  439. ctlr->rcr &= ~Aap;
  440. csr32w(ctlr, Rcr, ctlr->rcr);
  441. iunlock(&ctlr->reglock);
  442. iunlock(&ctlr->ilock);
  443. }
  444. enum {
  445. /* everyone else uses 0x04c11db7, but they both produce the same crc */
  446. Etherpolybe = 0x04c11db6,
  447. Bytemask = (1<<8) - 1,
  448. };
  449. static ulong
  450. ethercrcbe(uchar *addr, long len)
  451. {
  452. int i, j;
  453. ulong c, crc, carry;
  454. crc = ~0UL;
  455. for (i = 0; i < len; i++) {
  456. c = addr[i];
  457. for (j = 0; j < 8; j++) {
  458. carry = ((crc & (1UL << 31))? 1: 0) ^ (c & 1);
  459. crc <<= 1;
  460. c >>= 1;
  461. if (carry)
  462. crc = (crc ^ Etherpolybe) | carry;
  463. }
  464. }
  465. return crc;
  466. }
  467. static ulong
  468. swabl(ulong l)
  469. {
  470. return l>>24 | (l>>8) & (Bytemask<<8) |
  471. (l<<8) & (Bytemask<<16) | l<<24;
  472. }
  473. static void
  474. rtl8169multicast(void* ether, uchar *eaddr, int add)
  475. {
  476. Ether *edev;
  477. Ctlr *ctlr;
  478. if (!add)
  479. return; /* ok to keep receiving on old mcast addrs */
  480. edev = ether;
  481. ctlr = edev->ctlr;
  482. ilock(&ctlr->ilock);
  483. ilock(&ctlr->reglock);
  484. ctlr->mchash |= 1ULL << (ethercrcbe(eaddr, Eaddrlen) >> 26);
  485. ctlr->rcr |= Am;
  486. csr32w(ctlr, Rcr, ctlr->rcr);
  487. /* pci-e variants reverse the order of the hash byte registers */
  488. if (ctlr->pcie) {
  489. csr32w(ctlr, Mar0, swabl(ctlr->mchash>>32));
  490. csr32w(ctlr, Mar0+4, swabl(ctlr->mchash));
  491. } else {
  492. csr32w(ctlr, Mar0, ctlr->mchash);
  493. csr32w(ctlr, Mar0+4, ctlr->mchash>>32);
  494. }
  495. iunlock(&ctlr->reglock);
  496. iunlock(&ctlr->ilock);
  497. }
  498. static long
  499. rtl8169ifstat(Ether* edev, void* a, long n, ulong offset)
  500. {
  501. char *p;
  502. Ctlr *ctlr;
  503. Dtcc *dtcc;
  504. int i, l, r, timeo;
  505. ctlr = edev->ctlr;
  506. qlock(&ctlr->slock);
  507. p = nil;
  508. if(waserror()){
  509. qunlock(&ctlr->slock);
  510. free(p);
  511. nexterror();
  512. }
  513. /* copy hw statistics into ctlr->dtcc */
  514. dtcc = ctlr->dtcc;
  515. allcache->invse(dtcc, sizeof *dtcc);
  516. ilock(&ctlr->reglock);
  517. csr32w(ctlr, Dtccr+4, 0);
  518. csr32w(ctlr, Dtccr, PCIWADDR(dtcc)|Cmd); /* initiate dma? */
  519. for(timeo = 0; timeo < 1000; timeo++){
  520. if(!(csr32r(ctlr, Dtccr) & Cmd))
  521. break;
  522. delay(1);
  523. }
  524. iunlock(&ctlr->reglock);
  525. if(csr32r(ctlr, Dtccr) & Cmd)
  526. error(Eio);
  527. edev->oerrs = dtcc->txer;
  528. edev->crcs = dtcc->rxer;
  529. edev->frames = dtcc->fae;
  530. edev->buffs = dtcc->misspkt;
  531. edev->overflows = ctlr->txdu + ctlr->rdu;
  532. if(n == 0){
  533. qunlock(&ctlr->slock);
  534. poperror();
  535. return 0;
  536. }
  537. if((p = malloc(READSTR)) == nil)
  538. error(Enomem);
  539. l = snprint(p, READSTR, "TxOk: %llud\n", dtcc->txok);
  540. l += snprint(p+l, READSTR-l, "RxOk: %llud\n", dtcc->rxok);
  541. l += snprint(p+l, READSTR-l, "TxEr: %llud\n", dtcc->txer);
  542. l += snprint(p+l, READSTR-l, "RxEr: %ud\n", dtcc->rxer);
  543. l += snprint(p+l, READSTR-l, "MissPkt: %ud\n", dtcc->misspkt);
  544. l += snprint(p+l, READSTR-l, "FAE: %ud\n", dtcc->fae);
  545. l += snprint(p+l, READSTR-l, "Tx1Col: %ud\n", dtcc->tx1col);
  546. l += snprint(p+l, READSTR-l, "TxMCol: %ud\n", dtcc->txmcol);
  547. l += snprint(p+l, READSTR-l, "RxOkPh: %llud\n", dtcc->rxokph);
  548. l += snprint(p+l, READSTR-l, "RxOkBrd: %llud\n", dtcc->rxokbrd);
  549. l += snprint(p+l, READSTR-l, "RxOkMu: %ud\n", dtcc->rxokmu);
  550. l += snprint(p+l, READSTR-l, "TxAbt: %ud\n", dtcc->txabt);
  551. l += snprint(p+l, READSTR-l, "TxUndrn: %ud\n", dtcc->txundrn);
  552. l += snprint(p+l, READSTR-l, "txdu: %ud\n", ctlr->txdu);
  553. l += snprint(p+l, READSTR-l, "tcpf: %ud\n", ctlr->tcpf);
  554. l += snprint(p+l, READSTR-l, "udpf: %ud\n", ctlr->udpf);
  555. l += snprint(p+l, READSTR-l, "ipf: %ud\n", ctlr->ipf);
  556. l += snprint(p+l, READSTR-l, "fovf: %ud\n", ctlr->fovf);
  557. l += snprint(p+l, READSTR-l, "ierrs: %ud\n", ctlr->ierrs);
  558. l += snprint(p+l, READSTR-l, "rer: %ud\n", ctlr->rer);
  559. l += snprint(p+l, READSTR-l, "rdu: %ud\n", ctlr->rdu);
  560. l += snprint(p+l, READSTR-l, "punlc: %ud\n", ctlr->punlc);
  561. l += snprint(p+l, READSTR-l, "fovw: %ud\n", ctlr->fovw);
  562. l += snprint(p+l, READSTR-l, "tcr: %#8.8ux\n", ctlr->tcr);
  563. l += snprint(p+l, READSTR-l, "rcr: %#8.8ux\n", ctlr->rcr);
  564. l += snprint(p+l, READSTR-l, "multicast: %ud\n", ctlr->mcast);
  565. if(ctlr->mii != nil && ctlr->mii->curphy != nil){
  566. l += snprint(p+l, READSTR, "phy: ");
  567. for(i = 0; i < NMiiPhyr; i++){
  568. if(i && ((i & 0x07) == 0))
  569. l += snprint(p+l, READSTR-l, "\n ");
  570. r = miimir(ctlr->mii, i);
  571. l += snprint(p+l, READSTR-l, " %4.4ux", r);
  572. }
  573. snprint(p+l, READSTR-l, "\n");
  574. }
  575. n = readstr(offset, a, n, p);
  576. qunlock(&ctlr->slock);
  577. poperror();
  578. free(p);
  579. return n;
  580. }
  581. static void
  582. rtl8169halt(Ctlr* ctlr)
  583. {
  584. ilock(&ctlr->reglock);
  585. csr32w(ctlr, Timerint, 0);
  586. csr8w(ctlr, Cr, 0);
  587. csr16w(ctlr, Imr, 0);
  588. csr16w(ctlr, Isr, ~0);
  589. iunlock(&ctlr->reglock);
  590. }
  591. static int
  592. rtl8169reset(Ctlr* ctlr)
  593. {
  594. u32int r;
  595. int timeo;
  596. /*
  597. * Soft reset the controller.
  598. */
  599. ilock(&ctlr->reglock);
  600. csr8w(ctlr, Cr, Rst);
  601. for(r = timeo = 0; timeo < 1000; timeo++){
  602. r = csr8r(ctlr, Cr);
  603. if(!(r & Rst))
  604. break;
  605. delay(1);
  606. }
  607. iunlock(&ctlr->reglock);
  608. rtl8169halt(ctlr);
  609. if(r & Rst)
  610. return -1;
  611. return 0;
  612. }
  613. static void
  614. rtl8169shutdown(Ether *ether)
  615. {
  616. rtl8169reset(ether->ctlr);
  617. }
  618. static int
  619. rtl8169replenish(Ether *edev)
  620. {
  621. int rdt;
  622. Block *bp;
  623. Ctlr *ctlr;
  624. D *d;
  625. ctlr = edev->ctlr;
  626. if (ctlr->nrd == 0) {
  627. iprint("rtl8169replenish: not yet initialised\n");
  628. return -1;
  629. }
  630. rdt = ctlr->rdt;
  631. assert(ctlr->rb);
  632. assert(ctlr->rd);
  633. while(NEXT(rdt, ctlr->nrd) != ctlr->rdh){
  634. d = &ctlr->rd[rdt];
  635. if (d == nil)
  636. panic("rtl8169replenish: nil ctlr->rd[%d]", rdt);
  637. if (d->control & Own) { /* ctlr owns it? shouldn't happen */
  638. iprint("replenish: descriptor owned by hw\n");
  639. break;
  640. }
  641. if(ctlr->rb[rdt] == nil){
  642. bp = rballoc();
  643. if(bp == nil){
  644. iprint("rtl8169: no available buffers\n");
  645. break;
  646. }
  647. ctlr->rb[rdt] = bp;
  648. d->addrhi = 0;
  649. coherence();
  650. d->addrlo = PCIWADDR(bp->rp);
  651. coherence();
  652. } else
  653. iprint("8169: replenish: rx overrun\n");
  654. d->control = (d->control & ~RxflMASK) | Mps | Own;
  655. coherence();
  656. rdt = NEXT(rdt, ctlr->nrd);
  657. ctlr->nrdfree++;
  658. }
  659. ctlr->rdt = rdt;
  660. coherence();
  661. return 0;
  662. }
  663. static void
  664. ckrderrs(Ctlr *ctlr, Block *bp, ulong control)
  665. {
  666. if(control & Fovf)
  667. ctlr->fovf++;
  668. if(control & Mar)
  669. ctlr->mcast++;
  670. switch(control & (Pid1|Pid0)){
  671. case Pid0:
  672. if(control & Tcpf){
  673. iprint("8169: bad tcp checksum\n");
  674. ctlr->tcpf++;
  675. break;
  676. }
  677. bp->flag |= Btcpck;
  678. break;
  679. case Pid1:
  680. if(control & Udpf){
  681. iprint("8169: bad udp checksum\n");
  682. ctlr->udpf++;
  683. break;
  684. }
  685. bp->flag |= Budpck;
  686. break;
  687. case Pid1|Pid0:
  688. if(control & Ipf){
  689. iprint("8169: bad ip checksum\n");
  690. ctlr->ipf++;
  691. break;
  692. }
  693. bp->flag |= Bipck;
  694. break;
  695. }
  696. }
  697. static void
  698. badpkt(Ether *edev, int rdh, ulong control)
  699. {
  700. Ctlr *ctlr;
  701. ctlr = edev->ctlr;
  702. /* Res is only valid if Fs is set */
  703. if(control & Res)
  704. iprint("8169: rcv error; d->control %#.8lux\n", control);
  705. else if (control == 0) { /* buggered? */
  706. if (edev->link)
  707. iprint("8169: rcv: d->control==0 (wtf?)\n");
  708. } else {
  709. ctlr->frag++;
  710. iprint("8169: rcv'd frag; d->control %#.8lux\n", control);
  711. }
  712. if (ctlr->rb[rdh])
  713. freeb(ctlr->rb[rdh]);
  714. }
  715. void
  716. qpkt(Ether *edev, int rdh, ulong control)
  717. {
  718. int len;
  719. Block *bp;
  720. Ctlr *ctlr;
  721. ctlr = edev->ctlr;
  722. len = (control & RxflMASK) - 4;
  723. if ((uint)len > Mps)
  724. if (len < 0)
  725. panic("8169: received pkt non-existent");
  726. else if (len > Mps)
  727. panic("8169: received pkt too big");
  728. bp = ctlr->rb[rdh];
  729. bp->wp = bp->rp + len;
  730. bp->next = nil;
  731. allcache->invse(bp->rp, len); /* clear any stale cached packet */
  732. ckrderrs(ctlr, bp, control);
  733. etheriq(edev, bp, 1);
  734. if(Debug > 1)
  735. iprint("R%d ", len);
  736. }
  737. static int
  738. pktstoread(void* v)
  739. {
  740. Ctlr *ctlr = v;
  741. return ctlr->isr & (Fovw|Rdu|Rer|Rok) &&
  742. !(ctlr->rd[ctlr->rdh].control & Own);
  743. }
  744. static void
  745. rproc(void* arg)
  746. {
  747. int rdh;
  748. ulong control;
  749. Ctlr *ctlr;
  750. D *rd;
  751. Ether *edev;
  752. edev = arg;
  753. ctlr = edev->ctlr;
  754. for(;;){
  755. /* wait for next interrupt */
  756. ilock(&ctlr->reglock);
  757. ctlr->imr |= Fovw|Rdu|Rer|Rok;
  758. csr16w(ctlr, Imr, ctlr->imr);
  759. iunlock(&ctlr->reglock);
  760. sleep(&ctlr->rrendez, pktstoread, ctlr);
  761. /* clear saved isr bits */
  762. ilock(&ctlr->reglock);
  763. ctlr->isr &= ~(Fovw|Rdu|Rer|Rok);
  764. iunlock(&ctlr->reglock);
  765. rdh = ctlr->rdh;
  766. for (rd = &ctlr->rd[rdh]; !(rd->control & Own);
  767. rd = &ctlr->rd[rdh]){
  768. control = rd->control;
  769. if((control & (Fs|Ls|Res)) == (Fs|Ls))
  770. qpkt(edev, rdh, control);
  771. else
  772. badpkt(edev, rdh, control);
  773. ctlr->rb[rdh] = nil;
  774. coherence();
  775. rd->control &= Eor;
  776. coherence();
  777. ctlr->nrdfree--;
  778. rdh = NEXT(rdh, ctlr->nrd);
  779. if(ctlr->nrdfree < ctlr->nrd/2) {
  780. /* replenish reads ctlr->rdh */
  781. ctlr->rdh = rdh;
  782. rtl8169replenish(edev);
  783. /* if replenish called restart, rdh is reset */
  784. rdh = ctlr->rdh;
  785. }
  786. }
  787. ctlr->rdh = rdh;
  788. }
  789. }
  790. static int
  791. pktstosend(void* v)
  792. {
  793. Ether *edev = v;
  794. Ctlr *ctlr = edev->ctlr;
  795. return ctlr->isr & (Ter|Tok) &&
  796. !(ctlr->td[ctlr->tdh].control & Own) && edev->link;
  797. }
  798. static void
  799. tproc(void* arg)
  800. {
  801. int x, len;
  802. Block *bp;
  803. Ctlr *ctlr;
  804. D *d;
  805. Ether *edev;
  806. edev = arg;
  807. ctlr = edev->ctlr;
  808. for(;;){
  809. /* wait for next interrupt */
  810. ilock(&ctlr->reglock);
  811. ctlr->imr |= Ter|Tok;
  812. csr16w(ctlr, Imr, ctlr->imr);
  813. iunlock(&ctlr->reglock);
  814. sleep(&ctlr->trendez, pktstosend, edev);
  815. /* clear saved isr bits */
  816. ilock(&ctlr->reglock);
  817. ctlr->isr &= ~(Ter|Tok);
  818. iunlock(&ctlr->reglock);
  819. /* reclaim transmitted Blocks */
  820. for(x = ctlr->tdh; ctlr->ntq > 0; x = NEXT(x, ctlr->ntd)){
  821. d = &ctlr->td[x];
  822. if(d == nil || d->control & Own)
  823. break;
  824. /*
  825. * Free it up.
  826. * Need to clean the descriptor here? Not really.
  827. * Simple freeb for now (no chain and freeblist).
  828. * Use ntq count for now.
  829. */
  830. freeb(ctlr->tb[x]);
  831. ctlr->tb[x] = nil;
  832. d->control &= Eor;
  833. coherence();
  834. ctlr->ntq--;
  835. }
  836. ctlr->tdh = x;
  837. if (ctlr->ntq > 0)
  838. csr8w(ctlr, Tppoll, Npq); /* kick xmiter to keep it going */
  839. /* copy as much of my output q as possible into output ring */
  840. x = ctlr->tdt;
  841. while(ctlr->ntq < (ctlr->ntd-1)){
  842. if((bp = qget(edev->oq)) == nil)
  843. break;
  844. /* make sure the whole packet is in ram */
  845. len = BLEN(bp);
  846. allcache->wbse(bp->rp, len);
  847. d = &ctlr->td[x];
  848. assert(d);
  849. assert(!(d->control & Own));
  850. d->addrhi = 0;
  851. d->addrlo = PCIWADDR(bp->rp);
  852. ctlr->tb[x] = bp;
  853. coherence();
  854. d->control = (d->control & ~TxflMASK) |
  855. Own | Fs | Ls | len;
  856. coherence();
  857. if(Debug > 1)
  858. iprint("T%d ", len);
  859. x = NEXT(x, ctlr->ntd);
  860. ctlr->ntq++;
  861. ctlr->tdt = x;
  862. coherence();
  863. csr8w(ctlr, Tppoll, Npq); /* kick xmiter again */
  864. }
  865. if(x != ctlr->tdt){ /* added new packet(s)? */
  866. ctlr->tdt = x;
  867. coherence();
  868. csr8w(ctlr, Tppoll, Npq);
  869. }
  870. else if(ctlr->ntq >= (ctlr->ntd-1))
  871. ctlr->txdu++;
  872. }
  873. }
  874. static int
  875. rtl8169init(Ether* edev)
  876. {
  877. u32int r;
  878. Ctlr *ctlr;
  879. ushort cplusc;
  880. ctlr = edev->ctlr;
  881. ilock(&ctlr->ilock);
  882. rtl8169reset(ctlr);
  883. ilock(&ctlr->reglock);
  884. switch(ctlr->pciv){
  885. case Rtl8169sc:
  886. csr8w(ctlr, Cr, 0);
  887. break;
  888. case Rtl8168b:
  889. case Rtl8169c:
  890. /* 8168b manual says set c+ reg first, then command */
  891. csr16w(ctlr, Cplusc, 0x2000); /* magic */
  892. csr8w(ctlr, Cr, 0);
  893. break;
  894. }
  895. /*
  896. * MAC Address is not settable on some (all?) chips.
  897. * Must put chip into config register write enable mode.
  898. */
  899. csr8w(ctlr, Cr9346, Eem1|Eem0);
  900. /*
  901. * Transmitter.
  902. */
  903. memset(ctlr->td, 0, sizeof(D)*ctlr->ntd);
  904. ctlr->tdh = ctlr->tdt = 0;
  905. ctlr->ntq = 0;
  906. ctlr->td[ctlr->ntd-1].control = Eor;
  907. /*
  908. * Receiver.
  909. * Need to do something here about the multicast filter.
  910. */
  911. memset(ctlr->rd, 0, sizeof(D)*ctlr->nrd);
  912. ctlr->nrdfree = ctlr->rdh = ctlr->rdt = 0;
  913. ctlr->rd[ctlr->nrd-1].control = Eor;
  914. rtl8169replenish(edev);
  915. switch(ctlr->pciv){
  916. default:
  917. ctlr->rcr = Rxfthnone|Mrxdmaunlimited|Ab|Apm;
  918. break;
  919. case Rtl8168b:
  920. case Rtl8169c:
  921. ctlr->rcr = Rxfthnone|6<<MrxdmaSHIFT|Ab|Apm; /* DMA max 1024 */
  922. break;
  923. }
  924. /*
  925. * Setting Mulrw in Cplusc disables the Tx/Rx DMA burst
  926. * settings in Tcr/Rcr; the (1<<14) is magic.
  927. */
  928. cplusc = csr16r(ctlr, Cplusc) & ~(1<<14);
  929. switch(ctlr->pciv){
  930. case Rtl8168b:
  931. case Rtl8169c:
  932. cplusc |= Pktcntoff | Init1;
  933. break;
  934. }
  935. cplusc |= /*Rxchksum|*/Mulrw;
  936. switch(ctlr->macv){
  937. default:
  938. panic("ether8169: unknown macv %#08ux for vid %#ux did %#ux",
  939. ctlr->macv, ctlr->pcidev->vid, ctlr->pcidev->did);
  940. case Macv01:
  941. break;
  942. case Macv02:
  943. case Macv03:
  944. cplusc |= 1<<14; /* magic */
  945. break;
  946. case Macv05:
  947. /*
  948. * This is interpreted from clearly bogus code
  949. * in the manufacturer-supplied driver, it could
  950. * be wrong. Untested.
  951. */
  952. r = csr8r(ctlr, Config2) & 0x07;
  953. if(r == 0x01) /* 66MHz PCI */
  954. csr32w(ctlr, 0x7C, 0x0007FFFF); /* magic */
  955. else
  956. csr32w(ctlr, 0x7C, 0x0007FF00); /* magic */
  957. pciclrmwi(ctlr->pcidev);
  958. break;
  959. case Macv13:
  960. /*
  961. * This is interpreted from clearly bogus code
  962. * in the manufacturer-supplied driver, it could
  963. * be wrong. Untested.
  964. */
  965. pcicfgw8(ctlr->pcidev, 0x68, 0x00); /* magic */
  966. pcicfgw8(ctlr->pcidev, 0x69, 0x08); /* magic */
  967. break;
  968. case Macv04:
  969. case Macv07:
  970. case Macv07a:
  971. case Macv11:
  972. case Macv12:
  973. case Macv12a:
  974. case Macv14:
  975. case Macv15:
  976. case Macv25:
  977. break;
  978. }
  979. /*
  980. * Enable receiver/transmitter.
  981. * Need to do this first or some of the settings below
  982. * won't take.
  983. */
  984. switch(ctlr->pciv){
  985. default:
  986. csr8w(ctlr, Cr, Te|Re);
  987. csr32w(ctlr, Tcr, Ifg1|Ifg0|Mtxdmaunlimited);
  988. csr32w(ctlr, Rcr, ctlr->rcr);
  989. break;
  990. case Rtl8169sc:
  991. case Rtl8168b:
  992. break;
  993. }
  994. ctlr->mchash = 0;
  995. csr32w(ctlr, Mar0, 0);
  996. csr32w(ctlr, Mar0+4, 0);
  997. /*
  998. * Interrupts.
  999. * Disable Tdu for now, the transmit routine will tidy.
  1000. * Tdu means the NIC ran out of descriptors to send (i.e., the
  1001. * output ring is empty), so it doesn't really need to ever be on.
  1002. *
  1003. * The timer runs at the PCI(-E) clock frequency, 125MHz for PCI-E,
  1004. * presumably 66MHz for PCI. Thus the units for PCI-E controllers
  1005. * (e.g., 8168) are 8ns, and only the buggy 8168 seems to need to use
  1006. * timeouts to keep from stalling.
  1007. */
  1008. csr32w(ctlr, Tctr, 0);
  1009. /* Tok makes the whole system run faster */
  1010. ctlr->imr = Serr|Fovw|Punlc|Rdu|Ter|Tok|Rer|Rok;
  1011. switch(ctlr->pciv){
  1012. case Rtl8169sc:
  1013. case Rtl8168b:
  1014. /* alleged workaround for rx fifo overflow on 8168[bd] */
  1015. ctlr->imr &= ~Rdu;
  1016. break;
  1017. }
  1018. csr16w(ctlr, Imr, ctlr->imr);
  1019. /*
  1020. * Clear missed-packet counter;
  1021. * clear early transmit threshold value;
  1022. * set the descriptor ring base addresses;
  1023. * set the maximum receive packet size;
  1024. * no early-receive interrupts.
  1025. *
  1026. * note: the maximum rx size is a filter. the size of the buffer
  1027. * in the descriptor ring is still honored. we will toss >Mtu
  1028. * packets because they've been fragmented into multiple
  1029. * rx buffers.
  1030. */
  1031. csr32w(ctlr, Mpc, 0);
  1032. if (ctlr->pcie)
  1033. csr8w(ctlr, Mtps, Mps / 128);
  1034. else
  1035. csr8w(ctlr, Etx, 0x3f); /* max; no early transmission */
  1036. csr32w(ctlr, Tnpds+4, 0);
  1037. csr32w(ctlr, Tnpds, PCIWADDR(ctlr->td));
  1038. csr32w(ctlr, Rdsar+4, 0);
  1039. csr32w(ctlr, Rdsar, PCIWADDR(ctlr->rd));
  1040. csr16w(ctlr, Rms, 2048); /* was Mps; see above comment */
  1041. r = csr16r(ctlr, Mulint) & 0xF000; /* no early rx interrupts */
  1042. csr16w(ctlr, Mulint, r);
  1043. csr16w(ctlr, Cplusc, cplusc);
  1044. csr16w(ctlr, Coal, 0);
  1045. /*
  1046. * Set configuration.
  1047. */
  1048. switch(ctlr->pciv){
  1049. case Rtl8169sc:
  1050. csr8w(ctlr, Cr, Te|Re);
  1051. csr32w(ctlr, Tcr, Ifg1|Ifg0|Mtxdmaunlimited);
  1052. csr32w(ctlr, Rcr, ctlr->rcr);
  1053. break;
  1054. case Rtl8168b:
  1055. case Rtl8169c:
  1056. csr16w(ctlr, Cplusc, 0x2000); /* magic */
  1057. csr8w(ctlr, Cr, Te|Re);
  1058. csr32w(ctlr, Tcr, Ifg1|Ifg0|6<<MtxdmaSHIFT); /* DMA max 1024 */
  1059. csr32w(ctlr, Rcr, ctlr->rcr);
  1060. break;
  1061. }
  1062. ctlr->tcr = csr32r(ctlr, Tcr);
  1063. csr8w(ctlr, Cr9346, 0);
  1064. iunlock(&ctlr->reglock);
  1065. iunlock(&ctlr->ilock);
  1066. // rtl8169mii(ctlr);
  1067. return 0;
  1068. }
  1069. static void
  1070. rtl8169attach(Ether* edev)
  1071. {
  1072. int timeo, s, i;
  1073. char name[KNAMELEN];
  1074. Block *bp;
  1075. Ctlr *ctlr;
  1076. ctlr = edev->ctlr;
  1077. s = splhi();
  1078. qlock(&ctlr->alock);
  1079. if(ctlr->init || waserror()) {
  1080. qunlock(&ctlr->alock);
  1081. splx(s);
  1082. return;
  1083. }
  1084. ctlr->td = ucallocalign(sizeof(D)*Ntd, 256, 0);
  1085. ctlr->tb = malloc(Ntd*sizeof(Block*));
  1086. ctlr->ntd = Ntd;
  1087. ctlr->rd = ucallocalign(sizeof(D)*Nrd, 256, 0);
  1088. ctlr->rb = malloc(Nrd*sizeof(Block*));
  1089. ctlr->nrd = Nrd;
  1090. ctlr->dtcc = mallocalign(sizeof(Dtcc), 64, 0, 0);
  1091. if(waserror()){
  1092. free(ctlr->td);
  1093. free(ctlr->tb);
  1094. free(ctlr->rd);
  1095. free(ctlr->rb);
  1096. free(ctlr->dtcc);
  1097. nexterror();
  1098. }
  1099. if(ctlr->td == nil || ctlr->tb == nil || ctlr->rd == nil ||
  1100. ctlr->rb == nil || ctlr->dtcc == nil)
  1101. error(Enomem);
  1102. /* allocate private receive-buffer pool */
  1103. ctlr->nrb = Nrb;
  1104. for(i = 0; i < Nrb; i++){
  1105. if((bp = allocb(Mps)) == nil)
  1106. error(Enomem);
  1107. bp->free = rbfree;
  1108. freeb(bp);
  1109. }
  1110. rtl8169init(edev);
  1111. ctlr->init = 1;
  1112. qunlock(&ctlr->alock);
  1113. splx(s);
  1114. poperror(); /* free */
  1115. poperror(); /* qunlock */
  1116. /* signal secondary cpus that l1 ptes are stable */
  1117. l1ptstable.word = 1;
  1118. allcache->wbse(&l1ptstable, sizeof l1ptstable);
  1119. s = spllo();
  1120. /* Don't wait long for link to be ready. */
  1121. for(timeo = 0; timeo < 50 && miistatus(ctlr->mii) != 0; timeo++)
  1122. // tsleep(&up->sleep, return0, 0, 100); /* fewer miistatus msgs */
  1123. delay(100);
  1124. while (!edev->link)
  1125. tsleep(&up->sleep, return0, 0, 10);
  1126. splx(s);
  1127. snprint(name, KNAMELEN, "#l%drproc", edev->ctlrno);
  1128. kproc(name, rproc, edev);
  1129. snprint(name, KNAMELEN, "#l%dtproc", edev->ctlrno);
  1130. kproc(name, tproc, edev);
  1131. }
  1132. /* call with ctlr->reglock held */
  1133. static void
  1134. rtl8169link(Ether* edev)
  1135. {
  1136. uint r;
  1137. int limit;
  1138. Ctlr *ctlr;
  1139. ctlr = edev->ctlr;
  1140. if(!((r = csr8r(ctlr, Phystatus)) & Linksts)){
  1141. if (edev->link) {
  1142. edev->link = 0;
  1143. csr8w(ctlr, Cr, Re);
  1144. iprint("#l%d: link down\n", edev->ctlrno);
  1145. }
  1146. return;
  1147. }
  1148. if (edev->link == 0) {
  1149. edev->link = 1;
  1150. csr8w(ctlr, Cr, Te|Re);
  1151. iprint("#l%d: link up\n", edev->ctlrno);
  1152. }
  1153. limit = 256*1024;
  1154. if(r & Speed10){
  1155. edev->mbps = 10;
  1156. limit = 65*1024;
  1157. } else if(r & Speed100)
  1158. edev->mbps = 100;
  1159. else if(r & Speed1000)
  1160. edev->mbps = 1000;
  1161. if(edev->oq != nil)
  1162. qsetlimit(edev->oq, limit);
  1163. }
  1164. static void
  1165. rtl8169transmit(Ether* edev)
  1166. {
  1167. Ctlr *ctlr;
  1168. ctlr = edev->ctlr;
  1169. if (ctlr == nil || ctlr->ntd == 0) {
  1170. iprint("rtl8169transmit: not yet initialised\n");
  1171. return;
  1172. }
  1173. wakeup(&ctlr->trendez);
  1174. }
  1175. /*
  1176. * the controller has lost its mind, so reset it.
  1177. * call with ctlr->reglock held.
  1178. */
  1179. static void
  1180. restart(Ether *edev, char *why)
  1181. {
  1182. int i, s, del;
  1183. Ctlr *ctlr;
  1184. static int inrestart;
  1185. static Lock rstrtlck;
  1186. /* keep other cpus out */
  1187. s = splhi();
  1188. if (inrestart) {
  1189. splx(s);
  1190. return;
  1191. }
  1192. ilock(&rstrtlck);
  1193. ctlr = edev->ctlr;
  1194. if (ctlr == nil || !ctlr->init) {
  1195. iunlock(&rstrtlck);
  1196. splx(s);
  1197. return;
  1198. }
  1199. if (Debug)
  1200. iprint("#l%d: restart due to %s\n", edev->ctlrno, why);
  1201. inrestart = 1;
  1202. /* process any pkts in the rings */
  1203. wakeup(&ctlr->rrendez);
  1204. coherence();
  1205. rtl8169transmit(edev);
  1206. /* allow time to drain 1024-buffer ring */
  1207. for (del = 0; del < 13 && ctlr->ntq > 0; del++)
  1208. delay(1);
  1209. iunlock(&ctlr->reglock);
  1210. rtl8169reset(ctlr);
  1211. /* free any remaining unprocessed input buffers */
  1212. for (i = 0; i < ctlr->nrd; i++) {
  1213. freeb(ctlr->rb[i]);
  1214. ctlr->rb[i] = nil;
  1215. }
  1216. rtl8169init(edev);
  1217. ilock(&ctlr->reglock);
  1218. rtl8169link(edev);
  1219. rtl8169transmit(edev); /* drain any output queue */
  1220. wakeup(&ctlr->rrendez);
  1221. inrestart = 0;
  1222. iunlock(&rstrtlck);
  1223. splx(s);
  1224. }
  1225. static ulong
  1226. rcvdiag(Ether *edev, ulong isr)
  1227. {
  1228. Ctlr *ctlr;
  1229. ctlr = edev->ctlr;
  1230. if(!(isr & (Punlc|Rok)))
  1231. ctlr->ierrs++;
  1232. if(isr & Rer)
  1233. ctlr->rer++;
  1234. if(isr & Rdu)
  1235. ctlr->rdu++;
  1236. if(isr & Punlc)
  1237. ctlr->punlc++;
  1238. if(isr & Fovw)
  1239. ctlr->fovw++;
  1240. if (isr & (Fovw|Rdu|Rer)) {
  1241. if (isr & ~(Tdu|Tok|Rok)) /* harmless */
  1242. iprint("#l%d: isr %8.8#lux\n", edev->ctlrno, isr);
  1243. restart(edev, "rcv error");
  1244. isr = ~0;
  1245. }
  1246. return isr;
  1247. }
  1248. void
  1249. rtl8169interrupt(Ureg*, void* arg)
  1250. {
  1251. Ctlr *ctlr;
  1252. Ether *edev;
  1253. u32int isr;
  1254. edev = arg;
  1255. ctlr = edev->ctlr;
  1256. ilock(&ctlr->reglock);
  1257. while((isr = csr16r(ctlr, Isr)) != 0 && isr != 0xFFFF){
  1258. ctlr->isr |= isr; /* merge bits for [rt]proc */
  1259. csr16w(ctlr, Isr, isr); /* dismiss? */
  1260. if((isr & ctlr->imr) == 0)
  1261. break;
  1262. if(isr & Fovw && ctlr->pciv == Rtl8168b) {
  1263. /*
  1264. * Fovw means we got behind; relatively common on 8168.
  1265. * this is a big hammer, but it gets things going again.
  1266. */
  1267. ctlr->fovw++;
  1268. restart(edev, "rx fifo overrun");
  1269. break;
  1270. }
  1271. if(isr & (Fovw|Punlc|Rdu|Rer|Rok)) {
  1272. ctlr->imr &= ~(Fovw|Rdu|Rer|Rok);
  1273. csr16w(ctlr, Imr, ctlr->imr);
  1274. wakeup(&ctlr->rrendez);
  1275. if (isr & (Fovw|Punlc|Rdu|Rer)) {
  1276. isr = rcvdiag(edev, isr);
  1277. if (isr == ~0)
  1278. break; /* restarted */
  1279. }
  1280. isr &= ~(Fovw|Rdu|Rer|Rok);
  1281. }
  1282. if(isr & (Ter|Tok)){
  1283. ctlr->imr &= ~(Ter|Tok);
  1284. csr16w(ctlr, Imr, ctlr->imr);
  1285. wakeup(&ctlr->trendez);
  1286. if (isr & Ter)
  1287. iprint("xmit err; isr %8.8#ux\n", isr);
  1288. isr &= ~(Ter|Tok);
  1289. }
  1290. if(isr & Punlc){
  1291. rtl8169link(edev);
  1292. isr &= ~Punlc;
  1293. }
  1294. /*
  1295. * Some of the reserved bits get set sometimes...
  1296. */
  1297. if(isr & (Serr|Fovw|Punlc|Rdu|Ter|Tok|Rer|Rok))
  1298. panic("rtl8169interrupt: imr %#4.4ux isr %#4.4ux",
  1299. csr16r(ctlr, Imr), isr);
  1300. }
  1301. if (edev->link && ctlr->ntq > 0)
  1302. csr8w(ctlr, Tppoll, Npq); /* kick xmiter to keep it going */
  1303. iunlock(&ctlr->reglock);
  1304. /*
  1305. * extinguish pci-e controller interrupt source.
  1306. * should be done more cleanly.
  1307. */
  1308. if (ctlr->pcie)
  1309. pcieintrdone();
  1310. }
  1311. int
  1312. vetmacv(Ctlr *ctlr, uint *macv)
  1313. {
  1314. *macv = csr32r(ctlr, Tcr) & HwveridMASK;
  1315. switch(*macv){
  1316. default:
  1317. return -1;
  1318. case Macv01:
  1319. case Macv02:
  1320. case Macv03:
  1321. case Macv04:
  1322. case Macv05:
  1323. case Macv07:
  1324. case Macv07a:
  1325. case Macv11:
  1326. case Macv12:
  1327. case Macv12a:
  1328. case Macv13:
  1329. case Macv14:
  1330. case Macv15:
  1331. case Macv25:
  1332. break;
  1333. }
  1334. return 0;
  1335. }
  1336. static void
  1337. rtl8169pci(void)
  1338. {
  1339. Pcidev *p;
  1340. Ctlr *ctlr;
  1341. int i, pcie;
  1342. uint macv, bar;
  1343. void *mem;
  1344. p = nil;
  1345. while(p = pcimatch(p, 0, 0)){
  1346. if(p->ccrb != 0x02 || p->ccru != 0)
  1347. continue;
  1348. pcie = 0;
  1349. switch(i = ((p->did<<16)|p->vid)){
  1350. default:
  1351. continue;
  1352. case Rtl8100e: /* RTL810[01]E ? */
  1353. case Rtl8168b: /* RTL8168B */
  1354. pcie = 1;
  1355. break;
  1356. case Rtl8169c: /* RTL8169C */
  1357. case Rtl8169sc: /* RTL8169SC */
  1358. case Rtl8169: /* RTL8169 */
  1359. break;
  1360. case (0xC107<<16)|0x1259: /* Corega CG-LAPCIGT */
  1361. i = Rtl8169;
  1362. break;
  1363. }
  1364. bar = p->mem[2].bar & ~0x0F;
  1365. assert(bar != 0);
  1366. assert(!(p->mem[2].bar & Barioaddr));
  1367. if(0) iprint("rtl8169: %d-bit register accesses\n",
  1368. ((p->mem[2].bar >> Barwidthshift) & Barwidthmask) ==
  1369. Barwidth32? 32: 64);
  1370. mem = (void *)bar; /* don't need to vmap on trimslice */
  1371. if(mem == 0){
  1372. print("rtl8169: can't map %#ux\n", bar);
  1373. continue;
  1374. }
  1375. ctlr = malloc(sizeof(Ctlr));
  1376. if(ctlr == nil)
  1377. error(Enomem);
  1378. ctlr->nic = mem;
  1379. ctlr->port = bar;
  1380. ctlr->pcidev = p;
  1381. ctlr->pciv = i;
  1382. ctlr->pcie = pcie;
  1383. if(vetmacv(ctlr, &macv) == -1){
  1384. free(ctlr);
  1385. print("rtl8169: unknown mac %.4ux %.8ux\n", p->did, macv);
  1386. continue;
  1387. }
  1388. if(pcigetpms(p) > 0){
  1389. pcisetpms(p, 0);
  1390. for(i = 0; i < 6; i++)
  1391. pcicfgw32(p, PciBAR0+i*4, p->mem[i].bar);
  1392. pcicfgw8(p, PciINTL, p->intl);
  1393. pcicfgw8(p, PciLTR, p->ltr);
  1394. pcicfgw8(p, PciCLS, p->cls);
  1395. pcicfgw16(p, PciPCR, p->pcr);
  1396. }
  1397. if(rtl8169reset(ctlr)){
  1398. free(ctlr);
  1399. continue;
  1400. }
  1401. /*
  1402. * Extract the chip hardware version,
  1403. * needed to configure each properly.
  1404. */
  1405. ctlr->macv = macv;
  1406. rtl8169mii(ctlr);
  1407. pcisetbme(p);
  1408. if(rtl8169ctlrhead != nil)
  1409. rtl8169ctlrtail->next = ctlr;
  1410. else
  1411. rtl8169ctlrhead = ctlr;
  1412. rtl8169ctlrtail = ctlr;
  1413. }
  1414. }
  1415. static int
  1416. rtl8169pnp(Ether* edev)
  1417. {
  1418. u32int r;
  1419. Ctlr *ctlr;
  1420. uchar ea[Eaddrlen];
  1421. static int once;
  1422. if(once == 0){
  1423. once = 1;
  1424. rtl8169pci();
  1425. }
  1426. /*
  1427. * Any adapter matches if no edev->port is supplied,
  1428. * otherwise the ports must match.
  1429. */
  1430. for(ctlr = rtl8169ctlrhead; ctlr != nil; ctlr = ctlr->next){
  1431. if(ctlr->active)
  1432. continue;
  1433. if(edev->port == 0 || edev->port == ctlr->port){
  1434. ctlr->active = 1;
  1435. break;
  1436. }
  1437. }
  1438. if(ctlr == nil)
  1439. return -1;
  1440. edev->ctlr = ctlr;
  1441. ctlr->ether = edev;
  1442. edev->port = ctlr->port;
  1443. // edev->irq = ctlr->pcidev->intl; /* incorrect on trimslice */
  1444. edev->irq = Pcieirq; /* trimslice: non-msi pci-e intr */
  1445. edev->tbdf = ctlr->pcidev->tbdf;
  1446. edev->mbps = 1000;
  1447. edev->maxmtu = Mtu;
  1448. /*
  1449. * Check if the adapter's station address is to be overridden.
  1450. * If not, read it from the device and set in edev->ea.
  1451. */
  1452. memset(ea, 0, Eaddrlen);
  1453. if(memcmp(ea, edev->ea, Eaddrlen) == 0){
  1454. r = csr32r(ctlr, Idr0);
  1455. edev->ea[0] = r;
  1456. edev->ea[1] = r>>8;
  1457. edev->ea[2] = r>>16;
  1458. edev->ea[3] = r>>24;
  1459. r = csr32r(ctlr, Idr0+4);
  1460. edev->ea[4] = r;
  1461. edev->ea[5] = r>>8;
  1462. }
  1463. edev->attach = rtl8169attach;
  1464. edev->transmit = rtl8169transmit;
  1465. edev->interrupt = rtl8169interrupt;
  1466. edev->ifstat = rtl8169ifstat;
  1467. edev->arg = edev;
  1468. edev->promiscuous = rtl8169promiscuous;
  1469. edev->multicast = rtl8169multicast;
  1470. edev->shutdown = rtl8169shutdown;
  1471. ilock(&ctlr->reglock);
  1472. rtl8169link(edev);
  1473. iunlock(&ctlr->reglock);
  1474. return 0;
  1475. }
  1476. void
  1477. ether8169link(void)
  1478. {
  1479. addethercard("rtl8169", rtl8169pnp);
  1480. }