ether82563.c 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  1. /*
  2. * Bootstrap driver for
  3. * Intel 82563, 82571, 82573, 82575
  4. * GbE PCI-Express Controllers.
  5. */
  6. #include "u.h"
  7. #include "lib.h"
  8. #include "mem.h"
  9. #include "dat.h"
  10. #include "fns.h"
  11. #include "io.h"
  12. #include "etherif.h"
  13. /* compatibility with cpu kernels */
  14. #define iallocb allocb
  15. #ifndef CACHELINESZ
  16. #define CACHELINESZ 32 /* pentium & later */
  17. #endif
  18. /* from pci.c */
  19. enum
  20. { /* command register pcidev->pcr */
  21. IOen = 1<<0,
  22. MEMen = 1<<1,
  23. MASen = 1<<2,
  24. MemWrInv = 1<<4,
  25. PErrEn = 1<<6,
  26. SErrEn = 1<<8,
  27. };
  28. /*
  29. * these are in the order they appear in the manual, not numeric order.
  30. * It was too hard to find them in the book. Ref 21489, rev 2.6
  31. */
  32. enum {
  33. /* General */
  34. Ctrl = 0x00000000, /* Device Control */
  35. Status = 0x00000008, /* Device Status */
  36. Eec = 0x00000010, /* EEPROM/Flash Control/Data */
  37. Eerd = 0x00000014, /* EEPROM Read */
  38. Ctrlext = 0x00000018, /* Extended Device Control */
  39. Fla = 0x0000001c, /* Flash Access */
  40. Mdic = 0x00000020, /* MDI Control */
  41. Seresctl = 0x00000024, /* Serdes ana */
  42. Fcal = 0x00000028, /* Flow Control Address Low */
  43. Fcah = 0x0000002C, /* Flow Control Address High */
  44. Fct = 0x00000030, /* Flow Control Type */
  45. Kumctrlsta = 0x00000034, /* MAC-PHY Interface */
  46. Vet = 0x00000038, /* VLAN EtherType */
  47. Fcttv = 0x00000170, /* Flow Control Transmit Timer Value */
  48. Txcw = 0x00000178, /* Transmit Configuration Word */
  49. Rxcw = 0x00000180, /* Receive Configuration Word */
  50. Ledctl = 0x00000E00, /* LED control */
  51. Pba = 0x00001000, /* Packet Buffer Allocation */
  52. Pbs = 0x00001008, /* Packet Buffer Size */
  53. /* Interrupt */
  54. Icr = 0x000000C0, /* Interrupt Cause Read */
  55. Ics = 0x000000C8, /* Interrupt Cause Set */
  56. Ims = 0x000000D0, /* Interrupt Mask Set/Read */
  57. Imc = 0x000000D8, /* Interrupt mask Clear */
  58. Iam = 0x000000E0, /* Interrupt acknowledge Auto Mask */
  59. /* Receive */
  60. Rctl = 0x00000100, /* Receive Control */
  61. Ert = 0x00002008, /* Early Receive Threshold (573[EVL] only) */
  62. Fcrtl = 0x00002160, /* Flow Control RX Threshold Low */
  63. Fcrth = 0x00002168, /* Flow Control Rx Threshold High */
  64. Psrctl = 0x00002170, /* Packet Split Receive Control */
  65. Rdbal = 0x00002800, /* Rdesc Base Address Low Queue 0 */
  66. Rdbah = 0x00002804, /* Rdesc Base Address High Queue 0 */
  67. Rdlen = 0x00002808, /* Receive Descriptor Length Queue 0 */
  68. Rdh = 0x00002810, /* Receive Descriptor Head Queue 0 */
  69. Rdt = 0x00002818, /* Receive Descriptor Tail Queue 0 */
  70. Rdtr = 0x00002820, /* Receive Descriptor Timer Ring */
  71. Rxdctl = 0x00002828, /* Receive Descriptor Control */
  72. Radv = 0x0000282C, /* Receive Interrupt Absolute Delay Timer */
  73. Rdbal1 = 0x00002900, /* Rdesc Base Address Low Queue 1 */
  74. Rdbah1 = 0x00002804, /* Rdesc Base Address High Queue 1 */
  75. Rdlen1 = 0x00002908, /* Receive Descriptor Length Queue 1 */
  76. Rdh1 = 0x00002910, /* Receive Descriptor Head Queue 1 */
  77. Rdt1 = 0x00002918, /* Receive Descriptor Tail Queue 1 */
  78. Rxdctl1 = 0x00002928, /* Receive Descriptor Control Queue 1 */
  79. Rsrpd = 0x00002c00, /* Receive Small Packet Detect */
  80. Raid = 0x00002c08, /* Receive ACK interrupt delay */
  81. Cpuvec = 0x00002c10, /* CPU Vector */
  82. Rxcsum = 0x00005000, /* Receive Checksum Control */
  83. Rfctl = 0x00005008, /* Receive Filter Control */
  84. Mta = 0x00005200, /* Multicast Table Array */
  85. Ral = 0x00005400, /* Receive Address Low */
  86. Rah = 0x00005404, /* Receive Address High */
  87. Vfta = 0x00005600, /* VLAN Filter Table Array */
  88. Mrqc = 0x00005818, /* Multiple Receive Queues Command */
  89. Rssim = 0x00005864, /* RSS Interrupt Mask */
  90. Rssir = 0x00005868, /* RSS Interrupt Request */
  91. Reta = 0x00005c00, /* Redirection Table */
  92. Rssrk = 0x00005c80, /* RSS Random Key */
  93. /* Transmit */
  94. Tctl = 0x00000400, /* Transmit Control */
  95. Tipg = 0x00000410, /* Transmit IPG */
  96. Tdbal = 0x00003800, /* Tdesc Base Address Low */
  97. Tdbah = 0x00003804, /* Tdesc Base Address High */
  98. Tdlen = 0x00003808, /* Transmit Descriptor Length */
  99. Tdh = 0x00003810, /* Transmit Descriptor Head */
  100. Tdt = 0x00003818, /* Transmit Descriptor Tail */
  101. Tidv = 0x00003820, /* Transmit Interrupt Delay Value */
  102. Txdctl = 0x00003828, /* Transmit Descriptor Control */
  103. Tadv = 0x0000382C, /* Transmit Interrupt Absolute Delay Timer */
  104. Tarc0 = 0x00003840, /* Transmit Arbitration Counter Queue 0 */
  105. Tdbal1 = 0x00003900, /* Transmit Descriptor Base Low Queue 1 */
  106. Tdbah1 = 0x00003904, /* Transmit Descriptor Base High Queue 1 */
  107. Tdlen1 = 0x00003908, /* Transmit Descriptor Length Queue 1 */
  108. Tdh1 = 0x00003910, /* Transmit Descriptor Head Queue 1 */
  109. Tdt1 = 0x00003918, /* Transmit Descriptor Tail Queue 1 */
  110. Txdctl1 = 0x00003928, /* Transmit Descriptor Control 1 */
  111. Tarc1 = 0x00003940, /* Transmit Arbitration Counter Queue 1 */
  112. /* Statistics */
  113. Statistics = 0x00004000, /* Start of Statistics Area */
  114. Gorcl = 0x88/4, /* Good Octets Received Count */
  115. Gotcl = 0x90/4, /* Good Octets Transmitted Count */
  116. Torl = 0xC0/4, /* Total Octets Received */
  117. Totl = 0xC8/4, /* Total Octets Transmitted */
  118. Nstatistics = 64,
  119. };
  120. enum { /* Ctrl */
  121. GIOmd = 1<<2, /* BIO master disable */
  122. Lrst = 1<<3, /* link reset */
  123. Slu = 1<<6, /* Set Link Up */
  124. SspeedMASK = 3<<8, /* Speed Selection */
  125. SspeedSHIFT = 8,
  126. Sspeed10 = 0x00000000, /* 10Mb/s */
  127. Sspeed100 = 0x00000100, /* 100Mb/s */
  128. Sspeed1000 = 0x00000200, /* 1000Mb/s */
  129. Frcspd = 1<<11, /* Force Speed */
  130. Frcdplx = 1<<12, /* Force Duplex */
  131. SwdpinsloMASK = 0x003C0000, /* Software Defined Pins - lo nibble */
  132. SwdpinsloSHIFT = 18,
  133. SwdpioloMASK = 0x03C00000, /* Software Defined Pins - I or O */
  134. SwdpioloSHIFT = 22,
  135. Devrst = 1<<26, /* Device Reset */
  136. Rfce = 1<<27, /* Receive Flow Control Enable */
  137. Tfce = 1<<28, /* Transmit Flow Control Enable */
  138. Vme = 1<<30, /* VLAN Mode Enable */
  139. Phy_rst = 1<<31, /* Phy Reset */
  140. };
  141. enum { /* Status */
  142. Lu = 1<<1, /* Link Up */
  143. Lanid = 3<<2, /* mask for Lan ID. */
  144. Txoff = 1<<4, /* Transmission Paused */
  145. Tbimode = 1<<5, /* TBI Mode Indication */
  146. SpeedMASK = 0x000000C0,
  147. Speed10 = 0x00000000, /* 10Mb/s */
  148. Speed100 = 0x00000040, /* 100Mb/s */
  149. Speed1000 = 0x00000080, /* 1000Mb/s */
  150. Phyra = 1<<10, /* PHY Reset Asserted */
  151. GIOme = 1<<19, /* GIO Master Enable Status */
  152. };
  153. enum { /* Ctrl and Status */
  154. Fd = 0x00000001, /* Full-Duplex */
  155. AsdvMASK = 0x00000300,
  156. Asdv10 = 0x00000000, /* 10Mb/s */
  157. Asdv100 = 0x00000100, /* 100Mb/s */
  158. Asdv1000 = 0x00000200, /* 1000Mb/s */
  159. };
  160. enum { /* Eec */
  161. Sk = 1<<0, /* Clock input to the EEPROM */
  162. Cs = 1<<1, /* Chip Select */
  163. Di = 1<<2, /* Data Input to the EEPROM */
  164. Do = 1<<3, /* Data Output from the EEPROM */
  165. Areq = 1<<6, /* EEPROM Access Request */
  166. Agnt = 1<<7, /* EEPROM Access Grant */
  167. };
  168. enum { /* Eerd */
  169. ee_start = 1<<0, /* Start Read */
  170. ee_done = 1<<1, /* Read done */
  171. ee_addr = 0xfff8<<2, /* Read address [15:2] */
  172. ee_data = 0xffff<<16, /* Read Data; Data returned from eeprom/nvm */
  173. };
  174. enum { /* Ctrlext */
  175. Asdchk = 1<<12, /* ASD Check */
  176. Eerst = 1<<13, /* EEPROM Reset */
  177. Spdbyps = 1<<15, /* Speed Select Bypass */
  178. };
  179. enum { /* EEPROM content offsets */
  180. Ea = 0x00, /* Ethernet Address */
  181. Cf = 0x03, /* Compatibility Field */
  182. Icw1 = 0x0A, /* Initialization Control Word 1 */
  183. Sid = 0x0B, /* Subsystem ID */
  184. Svid = 0x0C, /* Subsystem Vendor ID */
  185. Did = 0x0D, /* Device ID */
  186. Vid = 0x0E, /* Vendor ID */
  187. Icw2 = 0x0F, /* Initialization Control Word 2 */
  188. };
  189. enum { /* Mdic */
  190. MDIdMASK = 0x0000FFFF, /* Data */
  191. MDIdSHIFT = 0,
  192. MDIrMASK = 0x001F0000, /* PHY Register Address */
  193. MDIrSHIFT = 16,
  194. MDIpMASK = 0x03E00000, /* PHY Address */
  195. MDIpSHIFT = 21,
  196. MDIwop = 0x04000000, /* Write Operation */
  197. MDIrop = 0x08000000, /* Read Operation */
  198. MDIready = 0x10000000, /* End of Transaction */
  199. MDIie = 0x20000000, /* Interrupt Enable */
  200. MDIe = 0x40000000, /* Error */
  201. };
  202. enum { /* Icr, Ics, Ims, Imc */
  203. Txdw = 0x00000001, /* Transmit Descriptor Written Back */
  204. Txqe = 0x00000002, /* Transmit Queue Empty */
  205. Lsc = 0x00000004, /* Link Status Change */
  206. Rxseq = 0x00000008, /* Receive Sequence Error */
  207. Rxdmt0 = 0x00000010, /* Rdesc Minimum Threshold Reached */
  208. Rxo = 0x00000040, /* Receiver Overrun */
  209. Rxt0 = 0x00000080, /* Receiver Timer Interrupt */
  210. Mdac = 0x00000200, /* MDIO Access Completed */
  211. Rxcfg = 0x00000400, /* Receiving /C/ ordered sets */
  212. Gpi0 = 0x00000800, /* General Purpose Interrupts */
  213. Gpi1 = 0x00001000,
  214. Gpi2 = 0x00002000,
  215. Gpi3 = 0x00004000,
  216. Ack = 0x00020000, /* receive ACK frame */
  217. };
  218. enum { /* Txcw */
  219. TxcwFd = 0x00000020, /* Full Duplex */
  220. TxcwHd = 0x00000040, /* Half Duplex */
  221. TxcwPauseMASK = 0x00000180, /* Pause */
  222. TxcwPauseSHIFT = 7,
  223. TxcwPs = 1<<TxcwPauseSHIFT, /* Pause Supported */
  224. TxcwAs = 2<<TxcwPauseSHIFT, /* Asymmetric FC desired */
  225. TxcwRfiMASK = 0x00003000, /* Remote Fault Indication */
  226. TxcwRfiSHIFT = 12,
  227. TxcwNpr = 0x00008000, /* Next Page Request */
  228. TxcwConfig = 0x40000000, /* Transmit Config Control */
  229. TxcwAne = 0x80000000, /* Auto-Negotiation Enable */
  230. };
  231. enum { /* Rctl */
  232. Rrst = 0x00000001, /* Receiver Software Reset */
  233. Ren = 0x00000002, /* Receiver Enable */
  234. Sbp = 0x00000004, /* Store Bad Packets */
  235. Upe = 0x00000008, /* Unicast Promiscuous Enable */
  236. Mpe = 0x00000010, /* Multicast Promiscuous Enable */
  237. Lpe = 0x00000020, /* Long Packet Reception Enable */
  238. LbmMASK = 0x000000C0, /* Loopback Mode */
  239. LbmOFF = 0x00000000, /* No Loopback */
  240. LbmTBI = 0x00000040, /* TBI Loopback */
  241. LbmMII = 0x00000080, /* GMII/MII Loopback */
  242. LbmXCVR = 0x000000C0, /* Transceiver Loopback */
  243. RdtmsMASK = 0x00000300, /* Rdesc Minimum Threshold Size */
  244. RdtmsHALF = 0x00000000, /* Threshold is 1/2 Rdlen */
  245. RdtmsQUARTER = 0x00000100, /* Threshold is 1/4 Rdlen */
  246. RdtmsEIGHTH = 0x00000200, /* Threshold is 1/8 Rdlen */
  247. MoMASK = 0x00003000, /* Multicast Offset */
  248. Bam = 0x00008000, /* Broadcast Accept Mode */
  249. BsizeMASK = 0x00030000, /* Receive Buffer Size */
  250. Bsize2048 = 0x00000000,
  251. Bsize1024 = 0x00010000,
  252. Bsize512 = 0x00020000,
  253. Bsize256 = 0x00030000,
  254. Vfe = 0x00040000, /* VLAN Filter Enable */
  255. Cfien = 0x00080000, /* Canonical Form Indicator Enable */
  256. Cfi = 0x00100000, /* Canonical Form Indicator value */
  257. Dpf = 0x00400000, /* Discard Pause Frames */
  258. Pmcf = 0x00800000, /* Pass MAC Control Frames */
  259. Bsex = 0x02000000, /* Buffer Size Extension */
  260. Secrc = 0x04000000, /* Strip CRC from incoming packet */
  261. };
  262. enum { /* Tctl */
  263. Trst = 0x00000001, /* Transmitter Software Reset */
  264. Ten = 0x00000002, /* Transmit Enable */
  265. Psp = 0x00000008, /* Pad Short Packets */
  266. Mulr = 0x10000000, /* Allow multiple concurrent requests */
  267. CtMASK = 0x00000FF0, /* Collision Threshold */
  268. CtSHIFT = 4,
  269. ColdMASK = 0x003FF000, /* Collision Distance */
  270. ColdSHIFT = 12,
  271. Swxoff = 0x00400000, /* Sofware XOFF Transmission */
  272. Pbe = 0x00800000, /* Packet Burst Enable */
  273. Rtlc = 0x01000000, /* Re-transmit on Late Collision */
  274. Nrtu = 0x02000000, /* No Re-transmit on Underrrun */
  275. };
  276. enum { /* [RT]xdctl */
  277. PthreshMASK = 0x0000003F, /* Prefetch Threshold */
  278. PthreshSHIFT = 0,
  279. HthreshMASK = 0x00003F00, /* Host Threshold */
  280. HthreshSHIFT = 8,
  281. WthreshMASK = 0x003F0000, /* Writebacj Threshold */
  282. WthreshSHIFT = 16,
  283. Gran = 0x01000000, /* Granularity */
  284. Qenable = 0x02000000, /* Queue Enable (82575eb) */
  285. };
  286. enum { /* Rxcsum */
  287. PcssMASK = 0x000000FF, /* Packet Checksum Start */
  288. PcssSHIFT = 0,
  289. Ipofl = 0x00000100, /* IP Checksum Off-load Enable */
  290. Tuofl = 0x00000200, /* TCP/UDP Checksum Off-load Enable */
  291. };
  292. typedef struct Rdesc { /* Receive Descriptor */
  293. uint addr[2];
  294. ushort length;
  295. ushort checksum;
  296. uchar status;
  297. uchar errors;
  298. ushort special;
  299. } Rdesc;
  300. enum { /* Rdesc status */
  301. Rdd = 0x01, /* Descriptor Done */
  302. Reop = 0x02, /* End of Packet */
  303. Ixsm = 0x04, /* Ignore Checksum Indication */
  304. Vp = 0x08, /* Packet is 802.1Q (matched VET) */
  305. Tcpcs = 0x20, /* TCP Checksum Calculated on Packet */
  306. Ipcs = 0x40, /* IP Checksum Calculated on Packet */
  307. Pif = 0x80, /* Passed in-exact filter */
  308. };
  309. enum { /* Rdesc errors */
  310. Ce = 0x01, /* CRC Error or Alignment Error */
  311. Se = 0x02, /* Symbol Error */
  312. Seq = 0x04, /* Sequence Error */
  313. Cxe = 0x10, /* Carrier Extension Error */
  314. Tcpe = 0x20, /* TCP/UDP Checksum Error */
  315. Ipe = 0x40, /* IP Checksum Error */
  316. Rxe = 0x80, /* RX Data Error */
  317. };
  318. typedef struct Tdesc { /* Legacy+Normal Transmit Descriptor */
  319. uint addr[2];
  320. uint control; /* varies with descriptor type */
  321. uint status; /* varies with descriptor type */
  322. } Tdesc;
  323. enum { /* Tdesc control */
  324. LenMASK = 0x000FFFFF, /* Data/Packet Length Field */
  325. LenSHIFT = 0,
  326. DtypeCD = 0x00000000, /* Data Type 'Context Descriptor' */
  327. DtypeDD = 0x00100000, /* Data Type 'Data Descriptor' */
  328. PtypeTCP = 0x01000000, /* TCP/UDP Packet Type (CD) */
  329. Teop = 0x01000000, /* End of Packet (DD) */
  330. PtypeIP = 0x02000000, /* IP Packet Type (CD) */
  331. Ifcs = 0x02000000, /* Insert FCS (DD) */
  332. Tse = 0x04000000, /* TCP Segmentation Enable */
  333. Rs = 0x08000000, /* Report Status */
  334. Rps = 0x10000000, /* Report Status Sent */
  335. Dext = 0x20000000, /* Descriptor Extension */
  336. Vle = 0x40000000, /* VLAN Packet Enable */
  337. Ide = 0x80000000, /* Interrupt Delay Enable */
  338. };
  339. enum { /* Tdesc status */
  340. Tdd = 0x00000001, /* Descriptor Done */
  341. Ec = 0x00000002, /* Excess Collisions */
  342. Lc = 0x00000004, /* Late Collision */
  343. Tu = 0x00000008, /* Transmit Underrun */
  344. CssMASK = 0x0000FF00, /* Checksum Start Field */
  345. CssSHIFT = 8,
  346. };
  347. typedef struct {
  348. ushort *reg;
  349. ulong *reg32;
  350. int sz;
  351. } Flash;
  352. enum {
  353. /* 16 and 32-bit flash registers for ich flash parts */
  354. Bfpr = 0x00/4, /* flash base 0:12; lim 16:28 */
  355. Fsts = 0x04/2, /* flash status; Hsfsts */
  356. Fctl = 0x06/2, /* flash control; Hsfctl */
  357. Faddr = 0x08/4, /* flash address to r/w */
  358. Fdata = 0x10/4, /* data @ address */
  359. /* status register */
  360. Fdone = 1<<0, /* flash cycle done */
  361. Fcerr = 1<<1, /* cycle error; write 1 to clear */
  362. Ael = 1<<2, /* direct access error log; 1 to clear */
  363. Scip = 1<<5, /* spi cycle in progress */
  364. Fvalid = 1<<14, /* flash descriptor valid */
  365. /* control register */
  366. Fgo = 1<<0, /* start cycle */
  367. Flcycle = 1<<1, /* two bits: r=0; w=2 */
  368. Fdbc = 1<<8, /* bytes to read; 5 bits */
  369. };
  370. enum {
  371. Nrdesc = 32, /* multiple of 8 */
  372. Ntdesc = 8, /* multiple of 8 */
  373. };
  374. enum {
  375. i82563,
  376. i82566,
  377. i82571,
  378. i82572,
  379. i82573,
  380. i82575,
  381. };
  382. static char *tname[] = {
  383. "i82563",
  384. "i82566",
  385. "i82571",
  386. "i82572",
  387. "i82573",
  388. "i82575",
  389. };
  390. #define Type tname[ctlr->type]
  391. typedef struct Ctlr Ctlr;
  392. struct Ctlr {
  393. int port;
  394. Pcidev *pcidev;
  395. Ctlr *next;
  396. int active;
  397. int cls;
  398. ushort eeprom[0x40];
  399. uchar ra[Eaddrlen]; /* receive address */
  400. int type;
  401. u32int* nic;
  402. Lock imlock;
  403. int im; /* interrupt mask */
  404. Lock slock;
  405. uint statistics[Nstatistics];
  406. Rdesc *rdba; /* receive descriptor base address */
  407. Block **rb; /* receive buffers */
  408. int rdh; /* receive descriptor head */
  409. int rdt; /* receive descriptor tail */
  410. Tdesc *tdba; /* transmit descriptor base address */
  411. Lock tdlock;
  412. Block **tb; /* transmit buffers */
  413. int tdh; /* transmit descriptor head */
  414. int tdt; /* transmit descriptor tail */
  415. int txcw;
  416. int fcrtl;
  417. int fcrth;
  418. /* bootstrap goo */
  419. Block *bqhead; /* transmission queue */
  420. Block *bqtail;
  421. };
  422. static Ctlr *ctlrhead;
  423. static Ctlr *ctlrtail;
  424. #define csr32r(c, r) (*((c)->nic+((r)/4)))
  425. #define csr32w(c, r, v) (*((c)->nic+((r)/4)) = (v))
  426. static void
  427. i82563im(Ctlr* ctlr, int im)
  428. {
  429. ilock(&ctlr->imlock);
  430. ctlr->im |= im;
  431. csr32w(ctlr, Ims, ctlr->im);
  432. iunlock(&ctlr->imlock);
  433. }
  434. static void
  435. i82563attach(Ether* edev)
  436. {
  437. int ctl;
  438. Ctlr *ctlr;
  439. ctlr = edev->ctlr;
  440. i82563im(ctlr, 0);
  441. ctl = csr32r(ctlr, Rctl)|Ren;
  442. csr32w(ctlr, Rctl, ctl);
  443. ctl = csr32r(ctlr, Tctl)|Ten;
  444. csr32w(ctlr, Tctl, ctl);
  445. }
  446. static void
  447. txstart(Ether *edev)
  448. {
  449. int tdh, tdt;
  450. Ctlr *ctlr = edev->ctlr;
  451. Block *bp;
  452. Tdesc *tdesc;
  453. /*
  454. * Try to fill the ring back up, moving buffers from the transmit q.
  455. */
  456. tdh = PREV(ctlr->tdh, Ntdesc);
  457. for(tdt = ctlr->tdt; tdt != tdh; tdt = NEXT(tdt, Ntdesc)){
  458. /* pull off the head of the transmission queue */
  459. if((bp = ctlr->bqhead) == nil) /* was qget(edev->oq) */
  460. break;
  461. ctlr->bqhead = bp->next;
  462. if (ctlr->bqtail == bp)
  463. ctlr->bqtail = nil;
  464. /* set up a descriptor for it */
  465. tdesc = &ctlr->tdba[tdt];
  466. tdesc->addr[0] = PCIWADDR(bp->rp);
  467. tdesc->addr[1] = 0;
  468. tdesc->control = /* Ide | */ Rs | Ifcs | Teop | BLEN(bp);
  469. ctlr->tb[tdt] = bp;
  470. }
  471. ctlr->tdt = tdt;
  472. csr32w(ctlr, Tdt, tdt);
  473. i82563im(ctlr, Txdw);
  474. }
  475. static Block *
  476. fromringbuf(Ether *ether)
  477. {
  478. RingBuf *tb = &ether->tb[ether->ti];
  479. Block *bp = allocb(tb->len);
  480. memmove(bp->wp, tb->pkt, tb->len);
  481. memmove(bp->wp+Eaddrlen, ether->ea, Eaddrlen);
  482. bp->wp += tb->len;
  483. return bp;
  484. }
  485. static void
  486. i82563transmit(Ether* edev)
  487. {
  488. Block *bp;
  489. Ctlr *ctlr;
  490. Tdesc *tdesc;
  491. RingBuf *tb;
  492. int tdh;
  493. ctlr = edev->ctlr;
  494. ilock(&ctlr->tdlock);
  495. /*
  496. * Free any completed packets
  497. * - try to get the soft tdh to catch the tdt;
  498. * - if the packet had an underrun bump the threshold
  499. * - the Tu bit doesn't seem to ever be set, perhaps
  500. * because Rs mode is used?
  501. */
  502. tdh = ctlr->tdh;
  503. for(;;){
  504. tdesc = &ctlr->tdba[tdh];
  505. if(!(tdesc->status & Tdd))
  506. break;
  507. if(ctlr->tb[tdh] != nil){
  508. freeb(ctlr->tb[tdh]);
  509. ctlr->tb[tdh] = nil;
  510. }
  511. tdesc->status = 0;
  512. tdh = NEXT(tdh, Ntdesc);
  513. }
  514. ctlr->tdh = tdh;
  515. /* copy packets from the software RingBuf to the transmission q */
  516. while((tb = &edev->tb[edev->ti])->owner == Interface){
  517. bp = fromringbuf(edev);
  518. // print("#l%d: tx %d %E %E\n", edev->ctlrno, edev->ti, bp->rp,
  519. // bp->rp+6);
  520. if(ctlr->bqhead)
  521. ctlr->bqtail->next = bp;
  522. else
  523. ctlr->bqhead = bp;
  524. ctlr->bqtail = bp;
  525. txstart(edev); /* kick transmitter */
  526. tb->owner = Host; /* give descriptor back */
  527. edev->ti = NEXT(edev->ti, edev->ntb);
  528. }
  529. iunlock(&ctlr->tdlock);
  530. }
  531. static void
  532. i82563replenish(Ctlr* ctlr)
  533. {
  534. int rdt;
  535. Block *bp;
  536. Rdesc *rdesc;
  537. rdt = ctlr->rdt;
  538. while(NEXT(rdt, Nrdesc) != ctlr->rdh){
  539. rdesc = &ctlr->rdba[rdt];
  540. if(ctlr->rb[rdt] != nil){
  541. /* nothing to do */
  542. }
  543. else if((bp = iallocb(2048)) != nil){
  544. ctlr->rb[rdt] = bp;
  545. rdesc->addr[0] = PCIWADDR(bp->rp);
  546. rdesc->addr[1] = 0;
  547. }
  548. else
  549. break;
  550. rdesc->status = 0;
  551. rdt = NEXT(rdt, Nrdesc);
  552. }
  553. ctlr->rdt = rdt;
  554. csr32w(ctlr, Rdt, rdt);
  555. }
  556. static void
  557. toringbuf(Ether *ether, Block *bp)
  558. {
  559. RingBuf *rb = &ether->rb[ether->ri];
  560. if (rb->owner == Interface) {
  561. rb->len = BLEN(bp);
  562. memmove(rb->pkt, bp->rp, rb->len);
  563. rb->owner = Host;
  564. ether->ri = NEXT(ether->ri, ether->nrb);
  565. } else if (debug)
  566. print("#l%d: toringbuf: dropping packets @ ri %d\n",
  567. ether->ctlrno, ether->ri);
  568. }
  569. static void
  570. i82563interrupt(Ureg*, void* arg)
  571. {
  572. int icr, im, rdh, txdw = 0;
  573. Block *bp;
  574. Ctlr *ctlr;
  575. Ether *edev;
  576. Rdesc *rdesc;
  577. edev = arg;
  578. ctlr = edev->ctlr;
  579. ilock(&ctlr->imlock);
  580. csr32w(ctlr, Imc, ~0);
  581. im = ctlr->im;
  582. for(icr = csr32r(ctlr, Icr); icr & ctlr->im; icr = csr32r(ctlr, Icr)){
  583. if(icr & (Rxseq|Lsc)){
  584. /* should be more here */
  585. }
  586. rdh = ctlr->rdh;
  587. for (;;) {
  588. rdesc = &ctlr->rdba[rdh];
  589. if(!(rdesc->status & Rdd))
  590. break;
  591. if ((rdesc->status & Reop) && rdesc->errors == 0) {
  592. bp = ctlr->rb[rdh];
  593. if(0 && memcmp(bp->rp, broadcast, 6) != 0)
  594. print("#l%d: rx %d %E %E %d\n",
  595. edev->ctlrno, rdh, bp->rp,
  596. bp->rp+6, rdesc->length);
  597. ctlr->rb[rdh] = nil;
  598. bp->wp += rdesc->length;
  599. toringbuf(edev, bp);
  600. freeb(bp);
  601. } else if (rdesc->status & Reop && rdesc->errors)
  602. print("%s: input packet error 0x%ux\n",
  603. Type, rdesc->errors);
  604. rdesc->status = 0;
  605. rdh = NEXT(rdh, Nrdesc);
  606. }
  607. ctlr->rdh = rdh;
  608. if(icr & Rxdmt0)
  609. i82563replenish(ctlr);
  610. if(icr & Txdw){
  611. im &= ~Txdw;
  612. txdw++;
  613. }
  614. }
  615. ctlr->im = im;
  616. csr32w(ctlr, Ims, im);
  617. iunlock(&ctlr->imlock);
  618. if(txdw)
  619. i82563transmit(edev);
  620. }
  621. static void
  622. i82563init(Ether* edev)
  623. {
  624. Ctlr *ctlr;
  625. u32int r, rctl;
  626. ctlr = edev->ctlr;
  627. rctl = Dpf | Bsize2048 | Bam | RdtmsHALF;
  628. if(ctlr->type == i82575){
  629. /*
  630. * Setting Qenable in Rxdctl does not
  631. * appear to stick unless Ren is on.
  632. */
  633. csr32w(ctlr, Rctl, Ren|rctl);
  634. r = csr32r(ctlr, Rxdctl);
  635. r |= Qenable;
  636. csr32w(ctlr, Rxdctl, r);
  637. }
  638. csr32w(ctlr, Rctl, rctl);
  639. ctlr->rdba = mallocalign(Nrdesc*sizeof(Rdesc), 128, 0, 0);
  640. csr32w(ctlr, Rdbal, PCIWADDR(ctlr->rdba));
  641. csr32w(ctlr, Rdbah, 0);
  642. csr32w(ctlr, Rdlen, Nrdesc*sizeof(Rdesc));
  643. ctlr->rdh = 0;
  644. csr32w(ctlr, Rdh, ctlr->rdh);
  645. ctlr->rdt = 0;
  646. csr32w(ctlr, Rdt, ctlr->rdt);
  647. ctlr->rb = malloc(sizeof(Block*)*Nrdesc);
  648. i82563replenish(ctlr);
  649. csr32w(ctlr, Rdtr, 0);
  650. if(ctlr->type == i82573)
  651. csr32w(ctlr, Ert, 1024/8);
  652. if(ctlr->type == i82566)
  653. csr32w(ctlr, Pbs, 16);
  654. i82563im(ctlr, Rxt0 | Rxo | Rxdmt0 | Rxseq | Ack);
  655. csr32w(ctlr, Tctl, 0x0F<<CtSHIFT | Psp | 0x3f<<ColdSHIFT | Mulr);
  656. csr32w(ctlr, Tipg, 6<<20 | 8<<10 | 8);
  657. csr32w(ctlr, Tidv, 1);
  658. ctlr->tdba = mallocalign(Ntdesc*sizeof(Tdesc), 128, 0, 0);
  659. memset(ctlr->tdba, 0, Ntdesc*sizeof(Tdesc));
  660. csr32w(ctlr, Tdbal, PCIWADDR(ctlr->tdba));
  661. csr32w(ctlr, Tdbah, 0);
  662. csr32w(ctlr, Tdlen, Ntdesc*sizeof(Tdesc));
  663. ctlr->tdh = 0;
  664. csr32w(ctlr, Tdh, ctlr->tdh);
  665. ctlr->tdt = 0;
  666. csr32w(ctlr, Tdt, ctlr->tdt);
  667. ctlr->tb = malloc(sizeof(Block*)*Ntdesc);
  668. r = csr32r(ctlr, Txdctl);
  669. r &= ~(WthreshMASK|PthreshSHIFT);
  670. r |= 4<<WthreshSHIFT | 4<<PthreshSHIFT;
  671. if(ctlr->type == i82575)
  672. r |= Qenable;
  673. csr32w(ctlr, Txdctl, r);
  674. csr32w(ctlr, Rxcsum, Tuofl | Ipofl | ETHERHDRSIZE<<PcssSHIFT);
  675. r = csr32r(ctlr, Tctl);
  676. r |= Ten;
  677. csr32w(ctlr, Tctl, r);
  678. }
  679. static ushort
  680. eeread(Ctlr* ctlr, int adr)
  681. {
  682. csr32w(ctlr, Eerd, ee_start | adr << 2);
  683. while ((csr32r(ctlr, Eerd) & ee_done) == 0)
  684. ;
  685. return csr32r(ctlr, Eerd) >> 16;
  686. }
  687. static int
  688. eeload(Ctlr* ctlr)
  689. {
  690. ushort sum;
  691. int data, adr;
  692. sum = 0;
  693. for (adr = 0; adr < 0x40; adr++) {
  694. data = eeread(ctlr, adr);
  695. ctlr->eeprom[adr] = data;
  696. sum += data;
  697. }
  698. return sum;
  699. }
  700. static void
  701. detach(Ctlr *ctlr)
  702. {
  703. int r;
  704. csr32w(ctlr, Imc, ~0);
  705. csr32w(ctlr, Rctl, 0);
  706. csr32w(ctlr, Tctl, 0);
  707. delay(10);
  708. r = csr32r(ctlr, Ctrl);
  709. if(ctlr->type == i82566)
  710. r |= Phy_rst;
  711. csr32w(ctlr, Ctrl, Devrst | r);
  712. /* apparently needed on multi-GHz processors to avoid infinite loops */
  713. delay(1);
  714. while(csr32r(ctlr, Ctrl) & Devrst)
  715. ;
  716. if(1 || ctlr->type != i82563){
  717. r = csr32r(ctlr, Ctrl);
  718. csr32w(ctlr, Ctrl, Slu | r);
  719. }
  720. csr32w(ctlr, Ctrlext, Eerst | csr32r(ctlr, Ctrlext));
  721. delay(1);
  722. while(csr32r(ctlr, Ctrlext) & Eerst)
  723. ;
  724. csr32w(ctlr, Imc, ~0);
  725. delay(1);
  726. while(csr32r(ctlr, Icr))
  727. ;
  728. }
  729. static void
  730. i82563detach(Ether *edev)
  731. {
  732. detach(edev->ctlr);
  733. }
  734. static void
  735. i82563shutdown(Ether* ether)
  736. {
  737. i82563detach(ether);
  738. }
  739. static int
  740. fcycle(Ctlr *, Flash *f)
  741. {
  742. ushort s, i;
  743. s = f->reg[Fsts];
  744. if((s&Fvalid) == 0)
  745. return -1;
  746. f->reg[Fsts] |= Fcerr | Ael;
  747. for(i = 0; i < 10; i++){
  748. if((s&Scip) == 0)
  749. return 0;
  750. delay(1);
  751. s = f->reg[Fsts];
  752. }
  753. return -1;
  754. }
  755. static int
  756. fread(Ctlr *c, Flash *f, int ladr)
  757. {
  758. ushort s;
  759. delay(1);
  760. if(fcycle(c, f) == -1)
  761. return -1;
  762. f->reg[Fsts] |= Fdone;
  763. f->reg32[Faddr] = ladr;
  764. /* setup flash control register */
  765. s = f->reg[Fctl];
  766. s &= ~(0x1f << 8);
  767. s |= (2-1) << 8; /* 2 bytes */
  768. s &= ~(2*Flcycle); /* read */
  769. f->reg[Fctl] = s | Fgo;
  770. while((f->reg[Fsts] & Fdone) == 0)
  771. ;
  772. if(f->reg[Fsts] & (Fcerr|Ael))
  773. return -1;
  774. return f->reg32[Fdata] & 0xffff;
  775. }
  776. static int
  777. fload(Ctlr *c)
  778. {
  779. ulong data, io, r, adr;
  780. ushort sum;
  781. Flash f;
  782. Pcidev *p;
  783. // io = c->pcidev->mem[1].bar & ~0x0f;
  784. // f.reg = vmap(io, c->pcidev->mem[1].size);
  785. // if(f.reg == nil)
  786. // return -1;
  787. p = c->pcidev;
  788. io = upamalloc(p->mem[1].bar & ~0x0F, p->mem[1].size, 0);
  789. if(io == 0){
  790. print("i82566: can't map flash @ 0x%8.8lux\n", p->mem[1].bar);
  791. return -1;
  792. }
  793. f.reg = KADDR(io);
  794. f.reg32 = (ulong*)f.reg;
  795. f.sz = f.reg32[Bfpr];
  796. r = f.sz & 0x1fff;
  797. if(csr32r(c, Eec) & (1<<22))
  798. ++r;
  799. r <<= 12;
  800. sum = 0;
  801. for (adr = 0; adr < 0x40; adr++) {
  802. data = fread(c, &f, r + adr*2);
  803. if(data == -1)
  804. break;
  805. c->eeprom[adr] = data;
  806. sum += data;
  807. }
  808. // vunmap(f.reg, c->pcidev->mem[1].size);
  809. return sum;
  810. }
  811. static int
  812. i82563reset(Ctlr* ctlr)
  813. {
  814. int i, r;
  815. detach(ctlr);
  816. if(ctlr->type == i82566)
  817. r = fload(ctlr);
  818. else
  819. r = eeload(ctlr);
  820. if (r != 0 && r != 0xBABA){
  821. print("%s: bad EEPROM checksum - 0x%4.4ux\n", Type, r);
  822. return -1;
  823. }
  824. for(i = Ea; i < Eaddrlen/2; i++){
  825. ctlr->ra[2*i] = ctlr->eeprom[i];
  826. ctlr->ra[2*i+1] = ctlr->eeprom[i]>>8;
  827. }
  828. r = (csr32r(ctlr, Status) & Lanid) >> 2;
  829. ctlr->ra[5] += r; /* ea ctlr[1] = ea ctlr[0]+1 */
  830. r = ctlr->ra[3]<<24 | ctlr->ra[2]<<16 | ctlr->ra[1]<<8 | ctlr->ra[0];
  831. csr32w(ctlr, Ral, r);
  832. r = 0x80000000 | ctlr->ra[5]<<8 | ctlr->ra[4];
  833. csr32w(ctlr, Rah, r);
  834. for(i = 1; i < 16; i++){
  835. csr32w(ctlr, Ral+i*8, 0);
  836. csr32w(ctlr, Rah+i*8, 0);
  837. }
  838. for(i = 0; i < 128; i++)
  839. csr32w(ctlr, Mta+i*4, 0);
  840. csr32w(ctlr, Fcal, 0x00C28001);
  841. csr32w(ctlr, Fcah, 0x00000100);
  842. csr32w(ctlr, Fct, 0x00008808);
  843. csr32w(ctlr, Fcttv, 0x00000100);
  844. csr32w(ctlr, Fcrtl, ctlr->fcrtl);
  845. csr32w(ctlr, Fcrth, ctlr->fcrth);
  846. ilock(&ctlr->imlock);
  847. csr32w(ctlr, Imc, ~0);
  848. ctlr->im = 0; /* was = Lsc, which hangs some controllers */
  849. csr32w(ctlr, Ims, ctlr->im);
  850. iunlock(&ctlr->imlock);
  851. return 0;
  852. }
  853. static void
  854. i82563pci(void)
  855. {
  856. int port, type, cls;
  857. Pcidev *p;
  858. Ctlr *ctlr;
  859. static int first = 1;
  860. if (first)
  861. first = 0;
  862. else
  863. return;
  864. p = nil;
  865. while(p = pcimatch(p, 0x8086, 0)){
  866. if(p->ccrb != 0x02 || p->ccru != 0)
  867. continue;
  868. //print("i82563pci: did %4.4#x\n", p->did);
  869. switch(p->did){
  870. case 0x1096:
  871. case 0x10ba:
  872. type = i82563;
  873. break;
  874. case 0x1049: /* mm */
  875. case 0x104a: /* dm */
  876. case 0x104d: /* v */
  877. case 0x10bd: /* dm */
  878. type = i82566;
  879. break;
  880. case 0x10a4:
  881. case 0x105e:
  882. type = i82571;
  883. break;
  884. case 0x10b9: /* sic, 82572 */
  885. type = i82572;
  886. break;
  887. case 0x108b: /* e */
  888. case 0x108c: /* e (iamt) */
  889. case 0x109a: /* l */
  890. type = i82573;
  891. break;
  892. case 0x10a7: /* 82575eb */
  893. type = i82575;
  894. break;
  895. default:
  896. continue;
  897. }
  898. port = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0);
  899. if(port == 0){
  900. print("%s: can't map %d @ 0x%8.8lux\n", tname[type],
  901. p->mem[0].size, p->mem[0].bar);
  902. continue;
  903. }
  904. if(p->pcr & MemWrInv){
  905. cls = pcicfgr8(p, PciCLS) * 4;
  906. if(cls != CACHELINESZ)
  907. pcicfgw8(p, PciCLS, CACHELINESZ/4);
  908. }
  909. cls = pcicfgr8(p, PciCLS);
  910. switch(cls){
  911. default:
  912. print("%s: unexpected CLS - %d bytes\n",
  913. tname[type], cls*sizeof(long));
  914. break;
  915. case 0x00:
  916. case 0xFF:
  917. /* alphapc 164lx returns 0 */
  918. print("%s: unusable PciCLS: %d, using %d longs\n",
  919. tname[type], cls, CACHELINESZ/sizeof(long));
  920. cls = CACHELINESZ/sizeof(long);
  921. pcicfgw8(p, PciCLS, cls);
  922. break;
  923. case 0x08:
  924. case 0x10:
  925. break;
  926. }
  927. ctlr = malloc(sizeof(Ctlr));
  928. ctlr->port = port;
  929. ctlr->pcidev = p;
  930. ctlr->cls = cls*4;
  931. ctlr->type = type;
  932. ctlr->nic = KADDR(ctlr->port);
  933. if(i82563reset(ctlr)){
  934. free(ctlr);
  935. continue;
  936. }
  937. pcisetbme(p);
  938. if(ctlrhead != nil)
  939. ctlrtail->next = ctlr;
  940. else
  941. ctlrhead = ctlr;
  942. ctlrtail = ctlr;
  943. }
  944. }
  945. static uchar nilea[Eaddrlen];
  946. int
  947. i82563pnp(Ether* edev)
  948. {
  949. Ctlr *ctlr;
  950. if(ctlrhead == nil)
  951. i82563pci();
  952. /*
  953. * Any adapter matches if no edev->port is supplied,
  954. * otherwise the ports must match.
  955. */
  956. for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
  957. if(ctlr->active)
  958. continue;
  959. if(edev->port == 0 || edev->port == ctlr->port){
  960. ctlr->active = 1;
  961. break;
  962. }
  963. }
  964. if(ctlr == nil)
  965. return -1;
  966. edev->ctlr = ctlr;
  967. edev->port = ctlr->port;
  968. edev->irq = ctlr->pcidev->intl;
  969. edev->tbdf = ctlr->pcidev->tbdf;
  970. // edev->mbps = 1000;
  971. if(memcmp(edev->ea, nilea, Eaddrlen) == 0)
  972. memmove(edev->ea, ctlr->ra, Eaddrlen);
  973. i82563init(edev);
  974. /*
  975. * Linkage to the generic ethernet driver.
  976. */
  977. edev->attach = i82563attach;
  978. edev->transmit = i82563transmit;
  979. edev->interrupt = i82563interrupt;
  980. edev->detach = i82563detach;
  981. /*
  982. * with the current structure, there is no right place for this.
  983. * ideally, we recognize the interface, note it's down and move on.
  984. * currently either we can skip the interface or note it is down,
  985. * but not both.
  986. if((csr32r(ctlr, Status)&Lu) == 0){
  987. print("ether#%d: 82563 (%s): link down\n", edev->ctlrno, Type);
  988. return -1;
  989. }
  990. */
  991. return 0;
  992. }