ether82563.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005
  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. enum {
  346. Nrdesc = 128, /* multiple of 8 */
  347. Ntdesc = 128, /* multiple of 8 */
  348. };
  349. enum {
  350. i82563,
  351. i82566,
  352. i82571,
  353. i82572,
  354. i82573,
  355. };
  356. static char *tname[] = {
  357. "i82563",
  358. "i82566",
  359. "i82571",
  360. "i82572",
  361. "i82573",
  362. };
  363. #define Type tname[ctlr->type]
  364. typedef struct Ctlr Ctlr;
  365. struct Ctlr {
  366. int port;
  367. Pcidev *pcidev;
  368. Ctlr *next;
  369. int active;
  370. int cls;
  371. ushort eeprom[0x40];
  372. uchar ra[Eaddrlen]; /* receive address */
  373. int type;
  374. int* nic;
  375. Lock imlock;
  376. int im; /* interrupt mask */
  377. Lock slock;
  378. uint statistics[Nstatistics];
  379. Rdesc *rdba; /* receive descriptor base address */
  380. Block **rb; /* receive buffers */
  381. int rdh; /* receive descriptor head */
  382. int rdt; /* receive descriptor tail */
  383. Tdesc *tdba; /* transmit descriptor base address */
  384. Lock tdlock;
  385. Block **tb; /* transmit buffers */
  386. int tdh; /* transmit descriptor head */
  387. int tdt; /* transmit descriptor tail */
  388. int txcw;
  389. int fcrtl;
  390. int fcrth;
  391. /* bootstrap goo */
  392. Block *bqhead; /* transmission queue */
  393. Block *bqtail;
  394. };
  395. static Ctlr *ctlrhead;
  396. static Ctlr *ctlrtail;
  397. #define csr32r(c, r) (*((c)->nic+((r)/4)))
  398. #define csr32w(c, r, v) (*((c)->nic+((r)/4)) = (v))
  399. static void
  400. i82563im(Ctlr* ctlr, int im)
  401. {
  402. ilock(&ctlr->imlock);
  403. ctlr->im |= im;
  404. csr32w(ctlr, Ims, ctlr->im);
  405. iunlock(&ctlr->imlock);
  406. }
  407. static void
  408. i82563attach(Ether* edev)
  409. {
  410. int ctl;
  411. Ctlr *ctlr;
  412. ctlr = edev->ctlr;
  413. i82563im(ctlr, 0);
  414. ctl = csr32r(ctlr, Rctl)|Ren;
  415. csr32w(ctlr, Rctl, ctl);
  416. ctl = csr32r(ctlr, Tctl)|Ten;
  417. csr32w(ctlr, Tctl, ctl);
  418. }
  419. static void
  420. txstart(Ether *edev)
  421. {
  422. int tdh, tdt;
  423. Ctlr *ctlr = edev->ctlr;
  424. Block *bp;
  425. Tdesc *tdesc;
  426. /*
  427. * Try to fill the ring back up, moving buffers from the transmit q.
  428. */
  429. tdh = PREV(ctlr->tdh, Ntdesc);
  430. for(tdt = ctlr->tdt; tdt != tdh; tdt = NEXT(tdt, Ntdesc)){
  431. /* pull off the head of the transmission queue */
  432. if((bp = ctlr->bqhead) == nil) /* was qget(edev->oq) */
  433. break;
  434. ctlr->bqhead = bp->next;
  435. if (ctlr->bqtail == bp)
  436. ctlr->bqtail = nil;
  437. /* set up a descriptor for it */
  438. tdesc = &ctlr->tdba[tdt];
  439. tdesc->addr[0] = PCIWADDR(bp->rp);
  440. tdesc->addr[1] = 0;
  441. tdesc->control = /* Ide | */ Rs | Ifcs | Teop | BLEN(bp);
  442. ctlr->tb[tdt] = bp;
  443. }
  444. ctlr->tdt = tdt;
  445. csr32w(ctlr, Tdt, tdt);
  446. i82563im(ctlr, Txdw);
  447. }
  448. static Block *
  449. fromringbuf(Ether *ether)
  450. {
  451. RingBuf *tb = &ether->tb[ether->ti];
  452. Block *bp = allocb(tb->len);
  453. memmove(bp->wp, tb->pkt, tb->len);
  454. memmove(bp->wp+Eaddrlen, ether->ea, Eaddrlen);
  455. bp->wp += tb->len;
  456. return bp;
  457. }
  458. static void
  459. i82563transmit(Ether* edev)
  460. {
  461. Block *bp;
  462. Ctlr *ctlr;
  463. Tdesc *tdesc;
  464. RingBuf *tb;
  465. int tdh;
  466. ctlr = edev->ctlr;
  467. ilock(&ctlr->tdlock);
  468. /*
  469. * Free any completed packets
  470. * - try to get the soft tdh to catch the tdt;
  471. * - if the packet had an underrun bump the threshold
  472. * - the Tu bit doesn't seem to ever be set, perhaps
  473. * because Rs mode is used?
  474. */
  475. tdh = ctlr->tdh;
  476. for(;;){
  477. tdesc = &ctlr->tdba[tdh];
  478. if(!(tdesc->status & Tdd))
  479. break;
  480. if(ctlr->tb[tdh] != nil){
  481. freeb(ctlr->tb[tdh]);
  482. ctlr->tb[tdh] = nil;
  483. }
  484. tdesc->status = 0;
  485. tdh = NEXT(tdh, Ntdesc);
  486. }
  487. ctlr->tdh = tdh;
  488. /* copy packets from the software RingBuf to the transmission q */
  489. while((tb = &edev->tb[edev->ti])->owner == Interface){
  490. bp = fromringbuf(edev);
  491. // print("#l%d: tx %d %E %E\n", edev->ctlrno, edev->ti, bp->rp,
  492. // bp->rp+6);
  493. if(ctlr->bqhead)
  494. ctlr->bqtail->next = bp;
  495. else
  496. ctlr->bqhead = bp;
  497. ctlr->bqtail = bp;
  498. txstart(edev); /* kick transmitter */
  499. tb->owner = Host; /* give descriptor back */
  500. edev->ti = NEXT(edev->ti, edev->ntb);
  501. }
  502. iunlock(&ctlr->tdlock);
  503. }
  504. static void
  505. i82563replenish(Ctlr* ctlr)
  506. {
  507. int rdt;
  508. Block *bp;
  509. Rdesc *rdesc;
  510. rdt = ctlr->rdt;
  511. while(NEXT(rdt, Nrdesc) != ctlr->rdh){
  512. rdesc = &ctlr->rdba[rdt];
  513. if(ctlr->rb[rdt] != nil){
  514. /* nothing to do */
  515. }
  516. else if((bp = iallocb(2048)) != nil){
  517. ctlr->rb[rdt] = bp;
  518. rdesc->addr[0] = PCIWADDR(bp->rp);
  519. rdesc->addr[1] = 0;
  520. }
  521. else
  522. break;
  523. rdesc->status = 0;
  524. rdt = NEXT(rdt, Nrdesc);
  525. }
  526. ctlr->rdt = rdt;
  527. csr32w(ctlr, Rdt, rdt);
  528. }
  529. static void
  530. toringbuf(Ether *ether, Block *bp)
  531. {
  532. RingBuf *rb = &ether->rb[ether->ri];
  533. if (rb->owner == Interface) {
  534. rb->len = BLEN(bp);
  535. memmove(rb->pkt, bp->rp, rb->len);
  536. rb->owner = Host;
  537. ether->ri = NEXT(ether->ri, ether->nrb);
  538. } else if (debug)
  539. print("#l%d: toringbuf: dropping packets @ ri %d\n",
  540. ether->ctlrno, ether->ri);
  541. }
  542. static void
  543. i82563interrupt(Ureg*, void* arg)
  544. {
  545. int icr, im, rdh, txdw = 0;
  546. Block *bp;
  547. Ctlr *ctlr;
  548. Ether *edev;
  549. Rdesc *rdesc;
  550. edev = arg;
  551. ctlr = edev->ctlr;
  552. ilock(&ctlr->imlock);
  553. csr32w(ctlr, Imc, ~0);
  554. im = ctlr->im;
  555. for(icr = csr32r(ctlr, Icr); icr & ctlr->im; icr = csr32r(ctlr, Icr)){
  556. if(icr & (Rxseq|Lsc)){
  557. /* should be more here */
  558. }
  559. rdh = ctlr->rdh;
  560. for (;;) {
  561. rdesc = &ctlr->rdba[rdh];
  562. if(!(rdesc->status & Rdd))
  563. break;
  564. if ((rdesc->status & Reop) && rdesc->errors == 0) {
  565. bp = ctlr->rb[rdh];
  566. if(0 && memcmp(bp->rp, broadcast, 6) != 0)
  567. print("#l%d: rx %d %E %E %d\n",
  568. edev->ctlrno, rdh, bp->rp,
  569. bp->rp+6, rdesc->length);
  570. ctlr->rb[rdh] = nil;
  571. bp->wp += rdesc->length;
  572. toringbuf(edev, bp);
  573. freeb(bp);
  574. } else if (rdesc->status & Reop && rdesc->errors)
  575. print("%s: input packet error 0x%ux\n",
  576. Type, rdesc->errors);
  577. rdesc->status = 0;
  578. rdh = NEXT(rdh, Nrdesc);
  579. }
  580. ctlr->rdh = rdh;
  581. if(icr & Rxdmt0)
  582. i82563replenish(ctlr);
  583. if(icr & Txdw){
  584. im &= ~Txdw;
  585. txdw++;
  586. }
  587. }
  588. ctlr->im = im;
  589. csr32w(ctlr, Ims, im);
  590. iunlock(&ctlr->imlock);
  591. if(txdw)
  592. i82563transmit(edev);
  593. }
  594. static void
  595. i82563init(Ether* edev)
  596. {
  597. int csr, i, r;
  598. Ctlr *ctlr;
  599. ctlr = edev->ctlr;
  600. csr = edev->ea[3]<<24 | edev->ea[2]<<16 | edev->ea[1]<<8 | edev->ea[0];
  601. csr32w(ctlr, Ral, csr);
  602. csr = 0x80000000 | edev->ea[5]<<8 | edev->ea[4];
  603. csr32w(ctlr, Rah, csr);
  604. for (i = 1; i < 16; i++) {
  605. csr32w(ctlr, Ral+i*8, 0);
  606. csr32w(ctlr, Rah+i*8, 0);
  607. }
  608. for(i = 0; i < 128; i++)
  609. csr32w(ctlr, Mta+i*4, 0);
  610. csr32w(ctlr, Rctl, 0);
  611. ctlr->rdba = xspanalloc(Nrdesc*sizeof(Rdesc), 256, 0);
  612. csr32w(ctlr, Rdbal, PCIWADDR(ctlr->rdba));
  613. csr32w(ctlr, Rdbah, 0);
  614. csr32w(ctlr, Rdlen, Nrdesc*sizeof(Rdesc));
  615. ctlr->rdh = 0;
  616. csr32w(ctlr, Rdh, ctlr->rdh);
  617. ctlr->rdt = 0;
  618. csr32w(ctlr, Rdt, ctlr->rdt);
  619. ctlr->rb = malloc(sizeof(Block*)*Nrdesc);
  620. i82563replenish(ctlr);
  621. csr32w(ctlr, Rdtr, 0);
  622. csr32w(ctlr, Rctl, Dpf | Bsize2048 | Bam | RdtmsHALF);
  623. if(ctlr->type == i82573)
  624. csr32w(ctlr, Ert, 1024/8);
  625. if(ctlr->type == i82566)
  626. csr32w(ctlr, Pbs, 16);
  627. i82563im(ctlr, Rxt0 | Rxo | Rxdmt0 | Rxseq | Ack);
  628. csr32w(ctlr, Tctl, 0x0F<<CtSHIFT | Psp | 0x3f<<ColdSHIFT | Mulr);
  629. csr32w(ctlr, Tipg, 6<<20 | 8<<10 | 8);
  630. csr32w(ctlr, Tidv, 1);
  631. ctlr->tdba = xspanalloc(Ntdesc*sizeof(Tdesc), 256, 0);
  632. memset(ctlr->tdba, 0, Ntdesc*sizeof(Tdesc));
  633. csr32w(ctlr, Tdbal, PCIWADDR(ctlr->tdba));
  634. csr32w(ctlr, Tdbah, 0);
  635. csr32w(ctlr, Tdlen, Ntdesc*sizeof(Tdesc));
  636. ctlr->tdh = 0;
  637. csr32w(ctlr, Tdh, ctlr->tdh);
  638. ctlr->tdt = 0;
  639. csr32w(ctlr, Tdt, ctlr->tdt);
  640. ctlr->tb = malloc(sizeof(Block*)*Ntdesc);
  641. // r = 4<<WthreshSHIFT | 4<<HthreshSHIFT | 8<<PthreshSHIFT;
  642. // csr32w(ctlr, Txdctl, r);
  643. csr32w(ctlr, Rxcsum, Tuofl | Ipofl | ETHERHDRSIZE<<PcssSHIFT);
  644. r = csr32r(ctlr, Tctl);
  645. r |= Ten;
  646. csr32w(ctlr, Tctl, r);
  647. }
  648. static ushort
  649. eeread(Ctlr* ctlr, int adr)
  650. {
  651. csr32w(ctlr, Eerd, ee_start | adr << 2);
  652. while ((csr32r(ctlr, Eerd) & ee_done) == 0)
  653. ;
  654. return csr32r(ctlr, Eerd) >> 16;
  655. }
  656. static int
  657. eeload(Ctlr* ctlr)
  658. {
  659. ushort sum;
  660. int data, adr;
  661. sum = 0;
  662. for (adr = 0; adr < 0x40; adr++) {
  663. data = eeread(ctlr, adr);
  664. ctlr->eeprom[adr] = data;
  665. sum += data;
  666. }
  667. return sum;
  668. }
  669. static void
  670. detach(Ctlr *ctlr)
  671. {
  672. int r;
  673. csr32w(ctlr, Imc, ~0);
  674. csr32w(ctlr, Rctl, 0);
  675. csr32w(ctlr, Tctl, 0);
  676. delay(10);
  677. r = csr32r(ctlr, Ctrl);
  678. if(ctlr->type == i82566)
  679. r |= Phy_rst;
  680. csr32w(ctlr, Ctrl, Devrst | r);
  681. /* apparently needed on multi-GHz processors to avoid infinite loops */
  682. delay(1);
  683. while(csr32r(ctlr, Ctrl) & Devrst)
  684. ;
  685. if(1 || ctlr->type != i82563){
  686. r = csr32r(ctlr, Ctrl);
  687. csr32w(ctlr, Ctrl, Slu | r);
  688. }
  689. csr32w(ctlr, Ctrlext, Eerst | csr32r(ctlr, Ctrlext));
  690. delay(1);
  691. while(csr32r(ctlr, Ctrlext) & Eerst)
  692. ;
  693. csr32w(ctlr, Imc, ~0);
  694. delay(1);
  695. while(csr32r(ctlr, Icr))
  696. ;
  697. }
  698. static void
  699. i82563detach(Ether *edev)
  700. {
  701. detach(edev->ctlr);
  702. }
  703. static void
  704. i82563shutdown(Ether* ether)
  705. {
  706. i82563detach(ether);
  707. }
  708. static int
  709. i82563reset(Ctlr* ctlr)
  710. {
  711. int i, r;
  712. detach(ctlr);
  713. if(ctlr->type == i82566) {
  714. // r = fload(ctlr);
  715. r = 0;
  716. print("i82566 not done yet\n");
  717. } else
  718. r = eeload(ctlr);
  719. if (r != 0 && r != 0xBABA){
  720. print("%s: bad EEPROM checksum - 0x%4.4ux\n", Type, r);
  721. return -1;
  722. }
  723. for(i = Ea; i < Eaddrlen/2; i++){
  724. ctlr->ra[2*i] = ctlr->eeprom[i];
  725. ctlr->ra[2*i+1] = ctlr->eeprom[i]>>8;
  726. }
  727. r = (csr32r(ctlr, Status) & Lanid) >> 2;
  728. ctlr->ra[5] += r; /* ea ctlr[1] = ea ctlr[0]+1 */
  729. r = ctlr->ra[3]<<24 | ctlr->ra[2]<<16 | ctlr->ra[1]<<8 | ctlr->ra[0];
  730. csr32w(ctlr, Ral, r);
  731. r = 0x80000000 | ctlr->ra[5]<<8 | ctlr->ra[4];
  732. csr32w(ctlr, Rah, r);
  733. for(i = 1; i < 16; i++){
  734. csr32w(ctlr, Ral+i*8, 0);
  735. csr32w(ctlr, Rah+i*8, 0);
  736. }
  737. for(i = 0; i < 128; i++)
  738. csr32w(ctlr, Mta+i*4, 0);
  739. csr32w(ctlr, Fcal, 0x00C28001);
  740. csr32w(ctlr, Fcah, 0x00000100);
  741. csr32w(ctlr, Fct, 0x00008808);
  742. csr32w(ctlr, Fcttv, 0x00000100);
  743. csr32w(ctlr, Fcrtl, ctlr->fcrtl);
  744. csr32w(ctlr, Fcrth, ctlr->fcrth);
  745. ilock(&ctlr->imlock);
  746. csr32w(ctlr, Imc, ~0);
  747. ctlr->im = 0; /* was = Lsc, which hangs some controllers */
  748. csr32w(ctlr, Ims, ctlr->im);
  749. iunlock(&ctlr->imlock);
  750. return 0;
  751. }
  752. static void
  753. i82563pci(void)
  754. {
  755. int port, type, cls;
  756. Pcidev *p;
  757. Ctlr *ctlr;
  758. static int first = 1;
  759. if (first)
  760. first = 0;
  761. else
  762. return;
  763. p = nil;
  764. while(p = pcimatch(p, 0x8086, 0)){
  765. switch(p->did){
  766. case 0x1096:
  767. case 0x10ba:
  768. type = i82563;
  769. break;
  770. case 0x1049: /* mm */
  771. case 0x104a: /* dm */
  772. case 0x104d: /* v */
  773. type = i82566;
  774. break;
  775. case 0x10a4:
  776. case 0x105e:
  777. type = i82571;
  778. break;
  779. case 0x10b9: /* sic, 82572 */
  780. type = i82572;
  781. break;
  782. case 0x108b: /* e */
  783. case 0x108c: /* e (iamt) */
  784. case 0x109a: /* l */
  785. type = i82573;
  786. break;
  787. default:
  788. continue;
  789. }
  790. port = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0);
  791. if(port == 0){
  792. print("%s: can't map %d @ 0x%8.8lux\n", tname[type],
  793. p->mem[0].size, p->mem[0].bar);
  794. continue;
  795. }
  796. if(p->pcr & MemWrInv){
  797. cls = pcicfgr8(p, PciCLS) * 4;
  798. if(cls != CACHELINESZ)
  799. pcicfgw8(p, PciCLS, CACHELINESZ/4);
  800. }
  801. cls = pcicfgr8(p, PciCLS);
  802. switch(cls){
  803. default:
  804. print("%s: unexpected CLS - %d bytes\n",
  805. tname[type], cls*sizeof(long));
  806. break;
  807. case 0x00:
  808. case 0xFF:
  809. /* alphapc 164lx returns 0 */
  810. print("%s: unusable PciCLS: %d, using %d longs\n",
  811. tname[type], cls, CACHELINESZ/sizeof(long));
  812. cls = CACHELINESZ/sizeof(long);
  813. pcicfgw8(p, PciCLS, cls);
  814. break;
  815. case 0x08:
  816. case 0x10:
  817. break;
  818. }
  819. ctlr = malloc(sizeof(Ctlr));
  820. ctlr->port = port;
  821. ctlr->pcidev = p;
  822. ctlr->cls = cls*4;
  823. ctlr->type = type;
  824. ctlr->nic = KADDR(ctlr->port);
  825. if(i82563reset(ctlr)){
  826. free(ctlr);
  827. continue;
  828. }
  829. pcisetbme(p);
  830. if(ctlrhead != nil)
  831. ctlrtail->next = ctlr;
  832. else
  833. ctlrhead = ctlr;
  834. ctlrtail = ctlr;
  835. }
  836. }
  837. static uchar nilea[Eaddrlen];
  838. int
  839. i82563pnp(Ether* edev)
  840. {
  841. Ctlr *ctlr;
  842. if(ctlrhead == nil)
  843. i82563pci();
  844. /*
  845. * Any adapter matches if no edev->port is supplied,
  846. * otherwise the ports must match.
  847. */
  848. for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
  849. if(ctlr->active)
  850. continue;
  851. if(edev->port == 0 || edev->port == ctlr->port){
  852. ctlr->active = 1;
  853. break;
  854. }
  855. }
  856. if(ctlr == nil)
  857. return -1;
  858. edev->ctlr = ctlr;
  859. edev->port = ctlr->port;
  860. edev->irq = ctlr->pcidev->intl;
  861. edev->tbdf = ctlr->pcidev->tbdf;
  862. // edev->mbps = 1000;
  863. if(memcmp(edev->ea, nilea, Eaddrlen) == 0)
  864. memmove(edev->ea, ctlr->ra, Eaddrlen);
  865. i82563init(edev);
  866. /*
  867. * Linkage to the generic ethernet driver.
  868. */
  869. edev->attach = i82563attach;
  870. edev->transmit = i82563transmit;
  871. edev->interrupt = i82563interrupt;
  872. edev->detach = i82563detach;
  873. /*
  874. * with the current structure, there is no right place for this.
  875. * ideally, we recognize the interface, note it's down and move on.
  876. * currently either we can skip the interface or note it is down,
  877. * but not both.
  878. */
  879. if((csr32r(ctlr, Status)&Lu) == 0){
  880. print("ether#%d: 82563 (%s): link down\n", edev->ctlrno, Type);
  881. return -1;
  882. }
  883. return 0;
  884. }