ether82563.c 28 KB

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