You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

forcedeth.c 41KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444
  1. /**************************************************************************
  2. * forcedeth.c -- Etherboot device driver for the NVIDIA nForce
  3. * media access controllers.
  4. *
  5. * Note: This driver is based on the Linux driver that was based on
  6. * a cleanroom reimplementation which was based on reverse
  7. * engineered documentation written by Carl-Daniel Hailfinger
  8. * and Andrew de Quincey. It's neither supported nor endorsed
  9. * by NVIDIA Corp. Use at your own risk.
  10. *
  11. * Written 2004 by Timothy Legge <tlegge@rogers.com>
  12. *
  13. * This program is free software; you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License as published by
  15. * the Free Software Foundation; either version 2 of the License, or
  16. * (at your option) any later version.
  17. *
  18. * This program is distributed in the hope that it will be useful,
  19. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  21. * GNU General Public License for more details.
  22. *
  23. * You should have received a copy of the GNU General Public License
  24. * along with this program; if not, write to the Free Software
  25. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  26. *
  27. * Portions of this code based on:
  28. * forcedeth: Ethernet driver for NVIDIA nForce media access controllers:
  29. *
  30. * (C) 2003 Manfred Spraul
  31. * See Linux Driver for full information
  32. *
  33. * Linux Driver Version 0.30, 25 Sep 2004
  34. * Linux Kernel 2.6.10
  35. *
  36. *
  37. * REVISION HISTORY:
  38. * ================
  39. * v1.0 01-31-2004 timlegge Initial port of Linux driver
  40. * v1.1 02-03-2004 timlegge Large Clean up, first release
  41. * v1.2 05-14-2005 timlegge Add Linux 0.22 to .030 features
  42. *
  43. * Indent Options: indent -kr -i8
  44. ***************************************************************************/
  45. FILE_LICENCE ( GPL2_OR_LATER );
  46. /* to get some global routines like printf */
  47. #include "etherboot.h"
  48. /* to get the interface to the body of the program */
  49. #include "nic.h"
  50. /* to get the PCI support functions, if this is a PCI NIC */
  51. #include <gpxe/pci.h>
  52. /* Include timer support functions */
  53. #include <gpxe/ethernet.h>
  54. #include "mii.h"
  55. #define drv_version "v1.2"
  56. #define drv_date "05-14-2005"
  57. //#define TFTM_DEBUG
  58. #ifdef TFTM_DEBUG
  59. #define dprintf(x) printf x
  60. #else
  61. #define dprintf(x)
  62. #endif
  63. #define ETH_DATA_LEN 1500
  64. /* Condensed operations for readability. */
  65. #define virt_to_le32desc(addr) cpu_to_le32(virt_to_bus(addr))
  66. #define le32desc_to_virt(addr) bus_to_virt(le32_to_cpu(addr))
  67. static unsigned long BASE;
  68. /* NIC specific static variables go here */
  69. #define PCI_DEVICE_ID_NVIDIA_NVENET_1 0x01c3
  70. #define PCI_DEVICE_ID_NVIDIA_NVENET_2 0x0066
  71. #define PCI_DEVICE_ID_NVIDIA_NVENET_4 0x0086
  72. #define PCI_DEVICE_ID_NVIDIA_NVENET_5 0x008c
  73. #define PCI_DEVICE_ID_NVIDIA_NVENET_3 0x00d6
  74. #define PCI_DEVICE_ID_NVIDIA_NVENET_7 0x00df
  75. #define PCI_DEVICE_ID_NVIDIA_NVENET_6 0x00e6
  76. #define PCI_DEVICE_ID_NVIDIA_NVENET_8 0x0056
  77. #define PCI_DEVICE_ID_NVIDIA_NVENET_9 0x0057
  78. #define PCI_DEVICE_ID_NVIDIA_NVENET_10 0x0037
  79. #define PCI_DEVICE_ID_NVIDIA_NVENET_11 0x0038
  80. #define PCI_DEVICE_ID_NVIDIA_NVENET_15 0x0373
  81. /*
  82. * Hardware access:
  83. */
  84. #define DEV_NEED_LASTPACKET1 0x0001 /* set LASTPACKET1 in tx flags */
  85. #define DEV_IRQMASK_1 0x0002 /* use NVREG_IRQMASK_WANTED_1 for irq mask */
  86. #define DEV_IRQMASK_2 0x0004 /* use NVREG_IRQMASK_WANTED_2 for irq mask */
  87. #define DEV_NEED_TIMERIRQ 0x0008 /* set the timer irq flag in the irq mask */
  88. #define DEV_NEED_LINKTIMER 0x0010 /* poll link settings. Relies on the timer irq */
  89. enum {
  90. NvRegIrqStatus = 0x000,
  91. #define NVREG_IRQSTAT_MIIEVENT 0040
  92. #define NVREG_IRQSTAT_MASK 0x1ff
  93. NvRegIrqMask = 0x004,
  94. #define NVREG_IRQ_RX_ERROR 0x0001
  95. #define NVREG_IRQ_RX 0x0002
  96. #define NVREG_IRQ_RX_NOBUF 0x0004
  97. #define NVREG_IRQ_TX_ERR 0x0008
  98. #define NVREG_IRQ_TX2 0x0010
  99. #define NVREG_IRQ_TIMER 0x0020
  100. #define NVREG_IRQ_LINK 0x0040
  101. #define NVREG_IRQ_TX1 0x0100
  102. #define NVREG_IRQMASK_WANTED_1 0x005f
  103. #define NVREG_IRQMASK_WANTED_2 0x0147
  104. #define NVREG_IRQ_UNKNOWN (~(NVREG_IRQ_RX_ERROR|NVREG_IRQ_RX|NVREG_IRQ_RX_NOBUF|NVREG_IRQ_TX_ERR|NVREG_IRQ_TX2|NVREG_IRQ_TIMER|NVREG_IRQ_LINK|NVREG_IRQ_TX1))
  105. NvRegUnknownSetupReg6 = 0x008,
  106. #define NVREG_UNKSETUP6_VAL 3
  107. /*
  108. * NVREG_POLL_DEFAULT is the interval length of the timer source on the nic
  109. * NVREG_POLL_DEFAULT=97 would result in an interval length of 1 ms
  110. */
  111. NvRegPollingInterval = 0x00c,
  112. #define NVREG_POLL_DEFAULT 970
  113. NvRegMisc1 = 0x080,
  114. #define NVREG_MISC1_HD 0x02
  115. #define NVREG_MISC1_FORCE 0x3b0f3c
  116. NvRegTransmitterControl = 0x084,
  117. #define NVREG_XMITCTL_START 0x01
  118. NvRegTransmitterStatus = 0x088,
  119. #define NVREG_XMITSTAT_BUSY 0x01
  120. NvRegPacketFilterFlags = 0x8c,
  121. #define NVREG_PFF_ALWAYS 0x7F0008
  122. #define NVREG_PFF_PROMISC 0x80
  123. #define NVREG_PFF_MYADDR 0x20
  124. NvRegOffloadConfig = 0x90,
  125. #define NVREG_OFFLOAD_HOMEPHY 0x601
  126. #define NVREG_OFFLOAD_NORMAL RX_NIC_BUFSIZE
  127. NvRegReceiverControl = 0x094,
  128. #define NVREG_RCVCTL_START 0x01
  129. NvRegReceiverStatus = 0x98,
  130. #define NVREG_RCVSTAT_BUSY 0x01
  131. NvRegRandomSeed = 0x9c,
  132. #define NVREG_RNDSEED_MASK 0x00ff
  133. #define NVREG_RNDSEED_FORCE 0x7f00
  134. #define NVREG_RNDSEED_FORCE2 0x2d00
  135. #define NVREG_RNDSEED_FORCE3 0x7400
  136. NvRegUnknownSetupReg1 = 0xA0,
  137. #define NVREG_UNKSETUP1_VAL 0x16070f
  138. NvRegUnknownSetupReg2 = 0xA4,
  139. #define NVREG_UNKSETUP2_VAL 0x16
  140. NvRegMacAddrA = 0xA8,
  141. NvRegMacAddrB = 0xAC,
  142. NvRegMulticastAddrA = 0xB0,
  143. #define NVREG_MCASTADDRA_FORCE 0x01
  144. NvRegMulticastAddrB = 0xB4,
  145. NvRegMulticastMaskA = 0xB8,
  146. NvRegMulticastMaskB = 0xBC,
  147. NvRegPhyInterface = 0xC0,
  148. #define PHY_RGMII 0x10000000
  149. NvRegTxRingPhysAddr = 0x100,
  150. NvRegRxRingPhysAddr = 0x104,
  151. NvRegRingSizes = 0x108,
  152. #define NVREG_RINGSZ_TXSHIFT 0
  153. #define NVREG_RINGSZ_RXSHIFT 16
  154. NvRegUnknownTransmitterReg = 0x10c,
  155. NvRegLinkSpeed = 0x110,
  156. #define NVREG_LINKSPEED_FORCE 0x10000
  157. #define NVREG_LINKSPEED_10 1000
  158. #define NVREG_LINKSPEED_100 100
  159. #define NVREG_LINKSPEED_1000 50
  160. NvRegUnknownSetupReg5 = 0x130,
  161. #define NVREG_UNKSETUP5_BIT31 (1<<31)
  162. NvRegUnknownSetupReg3 = 0x13c,
  163. #define NVREG_UNKSETUP3_VAL1 0x200010
  164. NvRegTxRxControl = 0x144,
  165. #define NVREG_TXRXCTL_KICK 0x0001
  166. #define NVREG_TXRXCTL_BIT1 0x0002
  167. #define NVREG_TXRXCTL_BIT2 0x0004
  168. #define NVREG_TXRXCTL_IDLE 0x0008
  169. #define NVREG_TXRXCTL_RESET 0x0010
  170. #define NVREG_TXRXCTL_RXCHECK 0x0400
  171. NvRegMIIStatus = 0x180,
  172. #define NVREG_MIISTAT_ERROR 0x0001
  173. #define NVREG_MIISTAT_LINKCHANGE 0x0008
  174. #define NVREG_MIISTAT_MASK 0x000f
  175. #define NVREG_MIISTAT_MASK2 0x000f
  176. NvRegUnknownSetupReg4 = 0x184,
  177. #define NVREG_UNKSETUP4_VAL 8
  178. NvRegAdapterControl = 0x188,
  179. #define NVREG_ADAPTCTL_START 0x02
  180. #define NVREG_ADAPTCTL_LINKUP 0x04
  181. #define NVREG_ADAPTCTL_PHYVALID 0x40000
  182. #define NVREG_ADAPTCTL_RUNNING 0x100000
  183. #define NVREG_ADAPTCTL_PHYSHIFT 24
  184. NvRegMIISpeed = 0x18c,
  185. #define NVREG_MIISPEED_BIT8 (1<<8)
  186. #define NVREG_MIIDELAY 5
  187. NvRegMIIControl = 0x190,
  188. #define NVREG_MIICTL_INUSE 0x08000
  189. #define NVREG_MIICTL_WRITE 0x00400
  190. #define NVREG_MIICTL_ADDRSHIFT 5
  191. NvRegMIIData = 0x194,
  192. NvRegWakeUpFlags = 0x200,
  193. #define NVREG_WAKEUPFLAGS_VAL 0x7770
  194. #define NVREG_WAKEUPFLAGS_BUSYSHIFT 24
  195. #define NVREG_WAKEUPFLAGS_ENABLESHIFT 16
  196. #define NVREG_WAKEUPFLAGS_D3SHIFT 12
  197. #define NVREG_WAKEUPFLAGS_D2SHIFT 8
  198. #define NVREG_WAKEUPFLAGS_D1SHIFT 4
  199. #define NVREG_WAKEUPFLAGS_D0SHIFT 0
  200. #define NVREG_WAKEUPFLAGS_ACCEPT_MAGPAT 0x01
  201. #define NVREG_WAKEUPFLAGS_ACCEPT_WAKEUPPAT 0x02
  202. #define NVREG_WAKEUPFLAGS_ACCEPT_LINKCHANGE 0x04
  203. #define NVREG_WAKEUPFLAGS_ENABLE 0x1111
  204. NvRegPatternCRC = 0x204,
  205. NvRegPatternMask = 0x208,
  206. NvRegPowerCap = 0x268,
  207. #define NVREG_POWERCAP_D3SUPP (1<<30)
  208. #define NVREG_POWERCAP_D2SUPP (1<<26)
  209. #define NVREG_POWERCAP_D1SUPP (1<<25)
  210. NvRegPowerState = 0x26c,
  211. #define NVREG_POWERSTATE_POWEREDUP 0x8000
  212. #define NVREG_POWERSTATE_VALID 0x0100
  213. #define NVREG_POWERSTATE_MASK 0x0003
  214. #define NVREG_POWERSTATE_D0 0x0000
  215. #define NVREG_POWERSTATE_D1 0x0001
  216. #define NVREG_POWERSTATE_D2 0x0002
  217. #define NVREG_POWERSTATE_D3 0x0003
  218. };
  219. #define FLAG_MASK_V1 0xffff0000
  220. #define FLAG_MASK_V2 0xffffc000
  221. #define LEN_MASK_V1 (0xffffffff ^ FLAG_MASK_V1)
  222. #define LEN_MASK_V2 (0xffffffff ^ FLAG_MASK_V2)
  223. #define NV_TX_LASTPACKET (1<<16)
  224. #define NV_TX_RETRYERROR (1<<19)
  225. #define NV_TX_LASTPACKET1 (1<<24)
  226. #define NV_TX_DEFERRED (1<<26)
  227. #define NV_TX_CARRIERLOST (1<<27)
  228. #define NV_TX_LATECOLLISION (1<<28)
  229. #define NV_TX_UNDERFLOW (1<<29)
  230. #define NV_TX_ERROR (1<<30)
  231. #define NV_TX_VALID (1<<31)
  232. #define NV_TX2_LASTPACKET (1<<29)
  233. #define NV_TX2_RETRYERROR (1<<18)
  234. #define NV_TX2_LASTPACKET1 (1<<23)
  235. #define NV_TX2_DEFERRED (1<<25)
  236. #define NV_TX2_CARRIERLOST (1<<26)
  237. #define NV_TX2_LATECOLLISION (1<<27)
  238. #define NV_TX2_UNDERFLOW (1<<28)
  239. /* error and valid are the same for both */
  240. #define NV_TX2_ERROR (1<<30)
  241. #define NV_TX2_VALID (1<<31)
  242. #define NV_RX_DESCRIPTORVALID (1<<16)
  243. #define NV_RX_MISSEDFRAME (1<<17)
  244. #define NV_RX_SUBSTRACT1 (1<<18)
  245. #define NV_RX_ERROR1 (1<<23)
  246. #define NV_RX_ERROR2 (1<<24)
  247. #define NV_RX_ERROR3 (1<<25)
  248. #define NV_RX_ERROR4 (1<<26)
  249. #define NV_RX_CRCERR (1<<27)
  250. #define NV_RX_OVERFLOW (1<<28)
  251. #define NV_RX_FRAMINGERR (1<<29)
  252. #define NV_RX_ERROR (1<<30)
  253. #define NV_RX_AVAIL (1<<31)
  254. #define NV_RX2_CHECKSUMMASK (0x1C000000)
  255. #define NV_RX2_CHECKSUMOK1 (0x10000000)
  256. #define NV_RX2_CHECKSUMOK2 (0x14000000)
  257. #define NV_RX2_CHECKSUMOK3 (0x18000000)
  258. #define NV_RX2_DESCRIPTORVALID (1<<29)
  259. #define NV_RX2_SUBSTRACT1 (1<<25)
  260. #define NV_RX2_ERROR1 (1<<18)
  261. #define NV_RX2_ERROR2 (1<<19)
  262. #define NV_RX2_ERROR3 (1<<20)
  263. #define NV_RX2_ERROR4 (1<<21)
  264. #define NV_RX2_CRCERR (1<<22)
  265. #define NV_RX2_OVERFLOW (1<<23)
  266. #define NV_RX2_FRAMINGERR (1<<24)
  267. /* error and avail are the same for both */
  268. #define NV_RX2_ERROR (1<<30)
  269. #define NV_RX2_AVAIL (1<<31)
  270. /* Miscelaneous hardware related defines: */
  271. #define NV_PCI_REGSZ 0x270
  272. /* various timeout delays: all in usec */
  273. #define NV_TXRX_RESET_DELAY 4
  274. #define NV_TXSTOP_DELAY1 10
  275. #define NV_TXSTOP_DELAY1MAX 500000
  276. #define NV_TXSTOP_DELAY2 100
  277. #define NV_RXSTOP_DELAY1 10
  278. #define NV_RXSTOP_DELAY1MAX 500000
  279. #define NV_RXSTOP_DELAY2 100
  280. #define NV_SETUP5_DELAY 5
  281. #define NV_SETUP5_DELAYMAX 50000
  282. #define NV_POWERUP_DELAY 5
  283. #define NV_POWERUP_DELAYMAX 5000
  284. #define NV_MIIBUSY_DELAY 50
  285. #define NV_MIIPHY_DELAY 10
  286. #define NV_MIIPHY_DELAYMAX 10000
  287. #define NV_WAKEUPPATTERNS 5
  288. #define NV_WAKEUPMASKENTRIES 4
  289. /* General driver defaults */
  290. #define NV_WATCHDOG_TIMEO (5*HZ)
  291. #define RX_RING 4
  292. #define TX_RING 2
  293. /*
  294. * If your nic mysteriously hangs then try to reduce the limits
  295. * to 1/0: It might be required to set NV_TX_LASTPACKET in the
  296. * last valid ring entry. But this would be impossible to
  297. * implement - probably a disassembly error.
  298. */
  299. #define TX_LIMIT_STOP 63
  300. #define TX_LIMIT_START 62
  301. /* rx/tx mac addr + type + vlan + align + slack*/
  302. #define RX_NIC_BUFSIZE (ETH_DATA_LEN + 64)
  303. /* even more slack */
  304. #define RX_ALLOC_BUFSIZE (ETH_DATA_LEN + 128)
  305. #define OOM_REFILL (1+HZ/20)
  306. #define POLL_WAIT (1+HZ/100)
  307. #define LINK_TIMEOUT (3*HZ)
  308. /*
  309. * desc_ver values:
  310. * This field has two purposes:
  311. * - Newer nics uses a different ring layout. The layout is selected by
  312. * comparing np->desc_ver with DESC_VER_xy.
  313. * - It contains bits that are forced on when writing to NvRegTxRxControl.
  314. */
  315. #define DESC_VER_1 0x0
  316. #define DESC_VER_2 (0x02100|NVREG_TXRXCTL_RXCHECK)
  317. /* PHY defines */
  318. #define PHY_OUI_MARVELL 0x5043
  319. #define PHY_OUI_CICADA 0x03f1
  320. #define PHYID1_OUI_MASK 0x03ff
  321. #define PHYID1_OUI_SHFT 6
  322. #define PHYID2_OUI_MASK 0xfc00
  323. #define PHYID2_OUI_SHFT 10
  324. #define PHY_INIT1 0x0f000
  325. #define PHY_INIT2 0x0e00
  326. #define PHY_INIT3 0x01000
  327. #define PHY_INIT4 0x0200
  328. #define PHY_INIT5 0x0004
  329. #define PHY_INIT6 0x02000
  330. #define PHY_GIGABIT 0x0100
  331. #define PHY_TIMEOUT 0x1
  332. #define PHY_ERROR 0x2
  333. #define PHY_100 0x1
  334. #define PHY_1000 0x2
  335. #define PHY_HALF 0x100
  336. /* Bit to know if MAC addr is stored in correct order */
  337. #define MAC_ADDR_CORRECT 0x01
  338. /* Big endian: should work, but is untested */
  339. struct ring_desc {
  340. u32 PacketBuffer;
  341. u32 FlagLen;
  342. };
  343. /* Define the TX and RX Descriptor and Buffers */
  344. struct {
  345. struct ring_desc tx_ring[TX_RING];
  346. unsigned char txb[TX_RING * RX_NIC_BUFSIZE];
  347. struct ring_desc rx_ring[RX_RING];
  348. unsigned char rxb[RX_RING * RX_NIC_BUFSIZE];
  349. } forcedeth_bufs __shared;
  350. #define tx_ring forcedeth_bufs.tx_ring
  351. #define rx_ring forcedeth_bufs.rx_ring
  352. #define txb forcedeth_bufs.txb
  353. #define rxb forcedeth_bufs.rxb
  354. /* Private Storage for the NIC */
  355. static struct forcedeth_private {
  356. /* General data:
  357. * Locking: spin_lock(&np->lock); */
  358. int in_shutdown;
  359. u32 linkspeed;
  360. int duplex;
  361. int phyaddr;
  362. int wolenabled;
  363. unsigned int phy_oui;
  364. u16 gigabit;
  365. /* General data: RO fields */
  366. u8 *ring_addr;
  367. u32 orig_mac[2];
  368. u32 irqmask;
  369. u32 desc_ver;
  370. /* rx specific fields.
  371. * Locking: Within irq hander or disable_irq+spin_lock(&np->lock);
  372. */
  373. unsigned int cur_rx, refill_rx;
  374. /*
  375. * tx specific fields.
  376. */
  377. unsigned int next_tx, nic_tx;
  378. u32 tx_flags;
  379. } npx;
  380. static struct forcedeth_private *np;
  381. static inline void pci_push(u8 * base)
  382. {
  383. /* force out pending posted writes */
  384. readl(base);
  385. }
  386. static inline u32 nv_descr_getlength(struct ring_desc *prd, u32 v)
  387. {
  388. return le32_to_cpu(prd->FlagLen)
  389. & ((v == DESC_VER_1) ? LEN_MASK_V1 : LEN_MASK_V2);
  390. }
  391. static int reg_delay(int offset, u32 mask,
  392. u32 target, int delay, int delaymax, const char *msg)
  393. {
  394. u8 *base = (u8 *) BASE;
  395. pci_push(base);
  396. do {
  397. udelay(delay);
  398. delaymax -= delay;
  399. if (delaymax < 0) {
  400. if (msg)
  401. printf("%s", msg);
  402. return 1;
  403. }
  404. } while ((readl(base + offset) & mask) != target);
  405. return 0;
  406. }
  407. #define MII_READ (-1)
  408. /* mii_rw: read/write a register on the PHY.
  409. *
  410. * Caller must guarantee serialization
  411. */
  412. static int mii_rw(struct nic *nic __unused, int addr, int miireg,
  413. int value)
  414. {
  415. u8 *base = (u8 *) BASE;
  416. u32 reg;
  417. int retval;
  418. writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus);
  419. reg = readl(base + NvRegMIIControl);
  420. if (reg & NVREG_MIICTL_INUSE) {
  421. writel(NVREG_MIICTL_INUSE, base + NvRegMIIControl);
  422. udelay(NV_MIIBUSY_DELAY);
  423. }
  424. reg =
  425. (addr << NVREG_MIICTL_ADDRSHIFT) | miireg;
  426. if (value != MII_READ) {
  427. writel(value, base + NvRegMIIData);
  428. reg |= NVREG_MIICTL_WRITE;
  429. }
  430. writel(reg, base + NvRegMIIControl);
  431. if (reg_delay(NvRegMIIControl, NVREG_MIICTL_INUSE, 0,
  432. NV_MIIPHY_DELAY, NV_MIIPHY_DELAYMAX, NULL)) {
  433. dprintf(("mii_rw of reg %d at PHY %d timed out.\n",
  434. miireg, addr));
  435. retval = -1;
  436. } else if (value != MII_READ) {
  437. /* it was a write operation - fewer failures are detectable */
  438. dprintf(("mii_rw wrote 0x%x to reg %d at PHY %d\n",
  439. value, miireg, addr));
  440. retval = 0;
  441. } else if (readl(base + NvRegMIIStatus) & NVREG_MIISTAT_ERROR) {
  442. dprintf(("mii_rw of reg %d at PHY %d failed.\n",
  443. miireg, addr));
  444. retval = -1;
  445. } else {
  446. retval = readl(base + NvRegMIIData);
  447. dprintf(("mii_rw read from reg %d at PHY %d: 0x%x.\n",
  448. miireg, addr, retval));
  449. }
  450. return retval;
  451. }
  452. static int phy_reset(struct nic *nic)
  453. {
  454. u32 miicontrol;
  455. unsigned int tries = 0;
  456. miicontrol = mii_rw(nic, np->phyaddr, MII_BMCR, MII_READ);
  457. miicontrol |= BMCR_RESET;
  458. if (mii_rw(nic, np->phyaddr, MII_BMCR, miicontrol)) {
  459. return -1;
  460. }
  461. /* wait for 500ms */
  462. mdelay(500);
  463. /* must wait till reset is deasserted */
  464. while (miicontrol & BMCR_RESET) {
  465. mdelay(10);
  466. miicontrol = mii_rw(nic, np->phyaddr, MII_BMCR, MII_READ);
  467. /* FIXME: 100 tries seem excessive */
  468. if (tries++ > 100)
  469. return -1;
  470. }
  471. return 0;
  472. }
  473. static int phy_init(struct nic *nic)
  474. {
  475. u8 *base = (u8 *) BASE;
  476. u32 phyinterface, phy_reserved, mii_status, mii_control,
  477. mii_control_1000, reg;
  478. /* set advertise register */
  479. reg = mii_rw(nic, np->phyaddr, MII_ADVERTISE, MII_READ);
  480. reg |=
  481. (ADVERTISE_10HALF | ADVERTISE_10FULL | ADVERTISE_100HALF |
  482. ADVERTISE_100FULL | 0x800 | 0x400);
  483. if (mii_rw(nic, np->phyaddr, MII_ADVERTISE, reg)) {
  484. printf("phy write to advertise failed.\n");
  485. return PHY_ERROR;
  486. }
  487. /* get phy interface type */
  488. phyinterface = readl(base + NvRegPhyInterface);
  489. /* see if gigabit phy */
  490. mii_status = mii_rw(nic, np->phyaddr, MII_BMSR, MII_READ);
  491. if (mii_status & PHY_GIGABIT) {
  492. np->gigabit = PHY_GIGABIT;
  493. mii_control_1000 =
  494. mii_rw(nic, np->phyaddr, MII_CTRL1000, MII_READ);
  495. mii_control_1000 &= ~ADVERTISE_1000HALF;
  496. if (phyinterface & PHY_RGMII)
  497. mii_control_1000 |= ADVERTISE_1000FULL;
  498. else
  499. mii_control_1000 &= ~ADVERTISE_1000FULL;
  500. if (mii_rw
  501. (nic, np->phyaddr, MII_CTRL1000, mii_control_1000)) {
  502. printf("phy init failed.\n");
  503. return PHY_ERROR;
  504. }
  505. } else
  506. np->gigabit = 0;
  507. /* reset the phy */
  508. if (phy_reset(nic)) {
  509. printf("phy reset failed\n");
  510. return PHY_ERROR;
  511. }
  512. /* phy vendor specific configuration */
  513. if ((np->phy_oui == PHY_OUI_CICADA) && (phyinterface & PHY_RGMII)) {
  514. phy_reserved =
  515. mii_rw(nic, np->phyaddr, MII_RESV1, MII_READ);
  516. phy_reserved &= ~(PHY_INIT1 | PHY_INIT2);
  517. phy_reserved |= (PHY_INIT3 | PHY_INIT4);
  518. if (mii_rw(nic, np->phyaddr, MII_RESV1, phy_reserved)) {
  519. printf("phy init failed.\n");
  520. return PHY_ERROR;
  521. }
  522. phy_reserved =
  523. mii_rw(nic, np->phyaddr, MII_NCONFIG, MII_READ);
  524. phy_reserved |= PHY_INIT5;
  525. if (mii_rw(nic, np->phyaddr, MII_NCONFIG, phy_reserved)) {
  526. printf("phy init failed.\n");
  527. return PHY_ERROR;
  528. }
  529. }
  530. if (np->phy_oui == PHY_OUI_CICADA) {
  531. phy_reserved =
  532. mii_rw(nic, np->phyaddr, MII_SREVISION, MII_READ);
  533. phy_reserved |= PHY_INIT6;
  534. if (mii_rw(nic, np->phyaddr, MII_SREVISION, phy_reserved)) {
  535. printf("phy init failed.\n");
  536. return PHY_ERROR;
  537. }
  538. }
  539. /* restart auto negotiation */
  540. mii_control = mii_rw(nic, np->phyaddr, MII_BMCR, MII_READ);
  541. mii_control |= (BMCR_ANRESTART | BMCR_ANENABLE);
  542. if (mii_rw(nic, np->phyaddr, MII_BMCR, mii_control)) {
  543. return PHY_ERROR;
  544. }
  545. return 0;
  546. }
  547. static void start_rx(struct nic *nic __unused)
  548. {
  549. u8 *base = (u8 *) BASE;
  550. dprintf(("start_rx\n"));
  551. /* Already running? Stop it. */
  552. if (readl(base + NvRegReceiverControl) & NVREG_RCVCTL_START) {
  553. writel(0, base + NvRegReceiverControl);
  554. pci_push(base);
  555. }
  556. writel(np->linkspeed, base + NvRegLinkSpeed);
  557. pci_push(base);
  558. writel(NVREG_RCVCTL_START, base + NvRegReceiverControl);
  559. pci_push(base);
  560. }
  561. static void stop_rx(void)
  562. {
  563. u8 *base = (u8 *) BASE;
  564. dprintf(("stop_rx\n"));
  565. writel(0, base + NvRegReceiverControl);
  566. reg_delay(NvRegReceiverStatus, NVREG_RCVSTAT_BUSY, 0,
  567. NV_RXSTOP_DELAY1, NV_RXSTOP_DELAY1MAX,
  568. "stop_rx: ReceiverStatus remained busy");
  569. udelay(NV_RXSTOP_DELAY2);
  570. writel(0, base + NvRegLinkSpeed);
  571. }
  572. static void start_tx(struct nic *nic __unused)
  573. {
  574. u8 *base = (u8 *) BASE;
  575. dprintf(("start_tx\n"));
  576. writel(NVREG_XMITCTL_START, base + NvRegTransmitterControl);
  577. pci_push(base);
  578. }
  579. static void stop_tx(void)
  580. {
  581. u8 *base = (u8 *) BASE;
  582. dprintf(("stop_tx\n"));
  583. writel(0, base + NvRegTransmitterControl);
  584. reg_delay(NvRegTransmitterStatus, NVREG_XMITSTAT_BUSY, 0,
  585. NV_TXSTOP_DELAY1, NV_TXSTOP_DELAY1MAX,
  586. "stop_tx: TransmitterStatus remained busy");
  587. udelay(NV_TXSTOP_DELAY2);
  588. writel(0, base + NvRegUnknownTransmitterReg);
  589. }
  590. static void txrx_reset(struct nic *nic __unused)
  591. {
  592. u8 *base = (u8 *) BASE;
  593. dprintf(("txrx_reset\n"));
  594. writel(NVREG_TXRXCTL_BIT2 | NVREG_TXRXCTL_RESET | np->desc_ver,
  595. base + NvRegTxRxControl);
  596. pci_push(base);
  597. udelay(NV_TXRX_RESET_DELAY);
  598. writel(NVREG_TXRXCTL_BIT2 | np->desc_ver, base + NvRegTxRxControl);
  599. pci_push(base);
  600. }
  601. /*
  602. * alloc_rx: fill rx ring entries.
  603. * Return 1 if the allocations for the skbs failed and the
  604. * rx engine is without Available descriptors
  605. */
  606. static int alloc_rx(struct nic *nic __unused)
  607. {
  608. unsigned int refill_rx = np->refill_rx;
  609. int i;
  610. //while (np->cur_rx != refill_rx) {
  611. for (i = 0; i < RX_RING; i++) {
  612. //int nr = refill_rx % RX_RING;
  613. rx_ring[i].PacketBuffer =
  614. virt_to_le32desc(&rxb[i * RX_NIC_BUFSIZE]);
  615. wmb();
  616. rx_ring[i].FlagLen =
  617. cpu_to_le32(RX_NIC_BUFSIZE | NV_RX_AVAIL);
  618. /* printf("alloc_rx: Packet %d marked as Available\n",
  619. refill_rx); */
  620. refill_rx++;
  621. }
  622. np->refill_rx = refill_rx;
  623. if (np->cur_rx - refill_rx == RX_RING)
  624. return 1;
  625. return 0;
  626. }
  627. static int update_linkspeed(struct nic *nic)
  628. {
  629. int adv, lpa;
  630. u32 newls;
  631. int newdup = np->duplex;
  632. u32 mii_status;
  633. int retval = 0;
  634. u32 control_1000, status_1000, phyreg;
  635. u8 *base = (u8 *) BASE;
  636. int i;
  637. /* BMSR_LSTATUS is latched, read it twice:
  638. * we want the current value.
  639. */
  640. mii_rw(nic, np->phyaddr, MII_BMSR, MII_READ);
  641. mii_status = mii_rw(nic, np->phyaddr, MII_BMSR, MII_READ);
  642. #if 1
  643. //yhlu
  644. for(i=0;i<30;i++) {
  645. mii_status = mii_rw(nic, np->phyaddr, MII_BMSR, MII_READ);
  646. if((mii_status & BMSR_LSTATUS) && (mii_status & BMSR_ANEGCOMPLETE)) break;
  647. mdelay(100);
  648. }
  649. #endif
  650. if (!(mii_status & BMSR_LSTATUS)) {
  651. printf
  652. ("no link detected by phy - falling back to 10HD.\n");
  653. newls = NVREG_LINKSPEED_FORCE | NVREG_LINKSPEED_10;
  654. newdup = 0;
  655. retval = 0;
  656. goto set_speed;
  657. }
  658. /* check auto negotiation is complete */
  659. if (!(mii_status & BMSR_ANEGCOMPLETE)) {
  660. /* still in autonegotiation - configure nic for 10 MBit HD and wait. */
  661. newls = NVREG_LINKSPEED_FORCE | NVREG_LINKSPEED_10;
  662. newdup = 0;
  663. retval = 0;
  664. printf("autoneg not completed - falling back to 10HD.\n");
  665. goto set_speed;
  666. }
  667. retval = 1;
  668. if (np->gigabit == PHY_GIGABIT) {
  669. control_1000 =
  670. mii_rw(nic, np->phyaddr, MII_CTRL1000, MII_READ);
  671. status_1000 =
  672. mii_rw(nic, np->phyaddr, MII_STAT1000, MII_READ);
  673. if ((control_1000 & ADVERTISE_1000FULL) &&
  674. (status_1000 & LPA_1000FULL)) {
  675. printf
  676. ("update_linkspeed: GBit ethernet detected.\n");
  677. newls =
  678. NVREG_LINKSPEED_FORCE | NVREG_LINKSPEED_1000;
  679. newdup = 1;
  680. goto set_speed;
  681. }
  682. }
  683. adv = mii_rw(nic, np->phyaddr, MII_ADVERTISE, MII_READ);
  684. lpa = mii_rw(nic, np->phyaddr, MII_LPA, MII_READ);
  685. dprintf(("update_linkspeed: PHY advertises 0x%hX, lpa 0x%hX.\n",
  686. adv, lpa));
  687. /* FIXME: handle parallel detection properly, handle gigabit ethernet */
  688. lpa = lpa & adv;
  689. if (lpa & LPA_100FULL) {
  690. newls = NVREG_LINKSPEED_FORCE | NVREG_LINKSPEED_100;
  691. newdup = 1;
  692. } else if (lpa & LPA_100HALF) {
  693. newls = NVREG_LINKSPEED_FORCE | NVREG_LINKSPEED_100;
  694. newdup = 0;
  695. } else if (lpa & LPA_10FULL) {
  696. newls = NVREG_LINKSPEED_FORCE | NVREG_LINKSPEED_10;
  697. newdup = 1;
  698. } else if (lpa & LPA_10HALF) {
  699. newls = NVREG_LINKSPEED_FORCE | NVREG_LINKSPEED_10;
  700. newdup = 0;
  701. } else {
  702. printf("bad ability %hX - falling back to 10HD.\n", lpa);
  703. newls = NVREG_LINKSPEED_FORCE | NVREG_LINKSPEED_10;
  704. newdup = 0;
  705. }
  706. set_speed:
  707. if (np->duplex == newdup && np->linkspeed == newls)
  708. return retval;
  709. dprintf(("changing link setting from %d/%s to %d/%s.\n",
  710. np->linkspeed, np->duplex ? "Full-Duplex": "Half-Duplex", newls, newdup ? "Full-Duplex": "Half-Duplex"));
  711. np->duplex = newdup;
  712. np->linkspeed = newls;
  713. if (np->gigabit == PHY_GIGABIT) {
  714. phyreg = readl(base + NvRegRandomSeed);
  715. phyreg &= ~(0x3FF00);
  716. if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_10)
  717. phyreg |= NVREG_RNDSEED_FORCE3;
  718. else if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_100)
  719. phyreg |= NVREG_RNDSEED_FORCE2;
  720. else if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_1000)
  721. phyreg |= NVREG_RNDSEED_FORCE;
  722. writel(phyreg, base + NvRegRandomSeed);
  723. }
  724. phyreg = readl(base + NvRegPhyInterface);
  725. phyreg &= ~(PHY_HALF | PHY_100 | PHY_1000);
  726. if (np->duplex == 0)
  727. phyreg |= PHY_HALF;
  728. if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_100)
  729. phyreg |= PHY_100;
  730. else if ((np->linkspeed & 0xFFF) == NVREG_LINKSPEED_1000)
  731. phyreg |= PHY_1000;
  732. writel(phyreg, base + NvRegPhyInterface);
  733. writel(NVREG_MISC1_FORCE | (np->duplex ? 0 : NVREG_MISC1_HD),
  734. base + NvRegMisc1);
  735. pci_push(base);
  736. writel(np->linkspeed, base + NvRegLinkSpeed);
  737. pci_push(base);
  738. return retval;
  739. }
  740. #if 0 /* Not used */
  741. static void nv_linkchange(struct nic *nic)
  742. {
  743. if (update_linkspeed(nic)) {
  744. // if (netif_carrier_ok(nic)) {
  745. stop_rx();
  746. //= } else {
  747. // netif_carrier_on(dev);
  748. // printk(KERN_INFO "%s: link up.\n", dev->name);
  749. // }
  750. start_rx(nic);
  751. } else {
  752. // if (netif_carrier_ok(dev)) {
  753. // netif_carrier_off(dev);
  754. // printk(KERN_INFO "%s: link down.\n", dev->name);
  755. stop_rx();
  756. // }
  757. }
  758. }
  759. #endif
  760. static int init_ring(struct nic *nic)
  761. {
  762. int i;
  763. np->next_tx = np->nic_tx = 0;
  764. for (i = 0; i < TX_RING; i++)
  765. tx_ring[i].FlagLen = 0;
  766. np->cur_rx = 0;
  767. np->refill_rx = 0;
  768. for (i = 0; i < RX_RING; i++)
  769. rx_ring[i].FlagLen = 0;
  770. return alloc_rx(nic);
  771. }
  772. static void set_multicast(struct nic *nic)
  773. {
  774. u8 *base = (u8 *) BASE;
  775. u32 addr[2];
  776. u32 mask[2];
  777. u32 pff;
  778. u32 alwaysOff[2];
  779. u32 alwaysOn[2];
  780. memset(addr, 0, sizeof(addr));
  781. memset(mask, 0, sizeof(mask));
  782. pff = NVREG_PFF_MYADDR;
  783. alwaysOn[0] = alwaysOn[1] = alwaysOff[0] = alwaysOff[1] = 0;
  784. addr[0] = alwaysOn[0];
  785. addr[1] = alwaysOn[1];
  786. mask[0] = alwaysOn[0] | alwaysOff[0];
  787. mask[1] = alwaysOn[1] | alwaysOff[1];
  788. addr[0] |= NVREG_MCASTADDRA_FORCE;
  789. pff |= NVREG_PFF_ALWAYS;
  790. stop_rx();
  791. writel(addr[0], base + NvRegMulticastAddrA);
  792. writel(addr[1], base + NvRegMulticastAddrB);
  793. writel(mask[0], base + NvRegMulticastMaskA);
  794. writel(mask[1], base + NvRegMulticastMaskB);
  795. writel(pff, base + NvRegPacketFilterFlags);
  796. start_rx(nic);
  797. }
  798. /**************************************************************************
  799. RESET - Reset the NIC to prepare for use
  800. ***************************************************************************/
  801. static int forcedeth_reset(struct nic *nic)
  802. {
  803. u8 *base = (u8 *) BASE;
  804. int ret, oom, i;
  805. ret = 0;
  806. dprintf(("forcedeth: open\n"));
  807. /* 1) erase previous misconfiguration */
  808. /* 4.1-1: stop adapter: ignored, 4.3 seems to be overkill */
  809. writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA);
  810. writel(0, base + NvRegMulticastAddrB);
  811. writel(0, base + NvRegMulticastMaskA);
  812. writel(0, base + NvRegMulticastMaskB);
  813. writel(0, base + NvRegPacketFilterFlags);
  814. writel(0, base + NvRegTransmitterControl);
  815. writel(0, base + NvRegReceiverControl);
  816. writel(0, base + NvRegAdapterControl);
  817. /* 2) initialize descriptor rings */
  818. oom = init_ring(nic);
  819. writel(0, base + NvRegLinkSpeed);
  820. writel(0, base + NvRegUnknownTransmitterReg);
  821. txrx_reset(nic);
  822. writel(0, base + NvRegUnknownSetupReg6);
  823. np->in_shutdown = 0;
  824. /* 3) set mac address */
  825. {
  826. u32 mac[2];
  827. mac[0] =
  828. (nic->node_addr[0] << 0) + (nic->node_addr[1] << 8) +
  829. (nic->node_addr[2] << 16) + (nic->node_addr[3] << 24);
  830. mac[1] =
  831. (nic->node_addr[4] << 0) + (nic->node_addr[5] << 8);
  832. writel(mac[0], base + NvRegMacAddrA);
  833. writel(mac[1], base + NvRegMacAddrB);
  834. }
  835. /* 4) give hw rings */
  836. writel((u32) virt_to_le32desc(&rx_ring[0]),
  837. base + NvRegRxRingPhysAddr);
  838. writel((u32) virt_to_le32desc(&tx_ring[0]),
  839. base + NvRegTxRingPhysAddr);
  840. writel(((RX_RING - 1) << NVREG_RINGSZ_RXSHIFT) +
  841. ((TX_RING - 1) << NVREG_RINGSZ_TXSHIFT),
  842. base + NvRegRingSizes);
  843. /* 5) continue setup */
  844. np->linkspeed = NVREG_LINKSPEED_FORCE | NVREG_LINKSPEED_10;
  845. np->duplex = 0;
  846. writel(np->linkspeed, base + NvRegLinkSpeed);
  847. writel(NVREG_UNKSETUP3_VAL1, base + NvRegUnknownSetupReg3);
  848. writel(np->desc_ver, base + NvRegTxRxControl);
  849. pci_push(base);
  850. writel(NVREG_TXRXCTL_BIT1 | np->desc_ver, base + NvRegTxRxControl);
  851. reg_delay(NvRegUnknownSetupReg5, NVREG_UNKSETUP5_BIT31,
  852. NVREG_UNKSETUP5_BIT31, NV_SETUP5_DELAY,
  853. NV_SETUP5_DELAYMAX,
  854. "open: SetupReg5, Bit 31 remained off\n");
  855. writel(0, base + NvRegUnknownSetupReg4);
  856. // writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
  857. writel(NVREG_MIISTAT_MASK2, base + NvRegMIIStatus);
  858. #if 0
  859. printf("%d-Mbs Link, %s-Duplex\n",
  860. np->linkspeed & NVREG_LINKSPEED_10 ? 10 : 100,
  861. np->duplex ? "Full" : "Half");
  862. #endif
  863. /* 6) continue setup */
  864. writel(NVREG_MISC1_FORCE | NVREG_MISC1_HD, base + NvRegMisc1);
  865. writel(readl(base + NvRegTransmitterStatus),
  866. base + NvRegTransmitterStatus);
  867. writel(NVREG_PFF_ALWAYS, base + NvRegPacketFilterFlags);
  868. writel(NVREG_OFFLOAD_NORMAL, base + NvRegOffloadConfig);
  869. writel(readl(base + NvRegReceiverStatus),
  870. base + NvRegReceiverStatus);
  871. /* Get a random number */
  872. i = random();
  873. writel(NVREG_RNDSEED_FORCE | (i & NVREG_RNDSEED_MASK),
  874. base + NvRegRandomSeed);
  875. writel(NVREG_UNKSETUP1_VAL, base + NvRegUnknownSetupReg1);
  876. writel(NVREG_UNKSETUP2_VAL, base + NvRegUnknownSetupReg2);
  877. writel(NVREG_POLL_DEFAULT, base + NvRegPollingInterval);
  878. writel(NVREG_UNKSETUP6_VAL, base + NvRegUnknownSetupReg6);
  879. writel((np->
  880. phyaddr << NVREG_ADAPTCTL_PHYSHIFT) |
  881. NVREG_ADAPTCTL_PHYVALID | NVREG_ADAPTCTL_RUNNING,
  882. base + NvRegAdapterControl);
  883. writel(NVREG_MIISPEED_BIT8 | NVREG_MIIDELAY, base + NvRegMIISpeed);
  884. writel(NVREG_UNKSETUP4_VAL, base + NvRegUnknownSetupReg4);
  885. writel(NVREG_WAKEUPFLAGS_VAL, base + NvRegWakeUpFlags);
  886. i = readl(base + NvRegPowerState);
  887. if ((i & NVREG_POWERSTATE_POWEREDUP) == 0)
  888. writel(NVREG_POWERSTATE_POWEREDUP | i,
  889. base + NvRegPowerState);
  890. pci_push(base);
  891. udelay(10);
  892. writel(readl(base + NvRegPowerState) | NVREG_POWERSTATE_VALID,
  893. base + NvRegPowerState);
  894. writel(0, base + NvRegIrqMask);
  895. pci_push(base);
  896. writel(NVREG_MIISTAT_MASK2, base + NvRegMIIStatus);
  897. writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
  898. pci_push(base);
  899. /*
  900. writel(np->irqmask, base + NvRegIrqMask);
  901. */
  902. writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA);
  903. writel(0, base + NvRegMulticastAddrB);
  904. writel(0, base + NvRegMulticastMaskA);
  905. writel(0, base + NvRegMulticastMaskB);
  906. writel(NVREG_PFF_ALWAYS | NVREG_PFF_MYADDR,
  907. base + NvRegPacketFilterFlags);
  908. set_multicast(nic);
  909. /* One manual link speed update: Interrupts are enabled, future link
  910. * speed changes cause interrupts and are handled by nv_link_irq().
  911. */
  912. {
  913. u32 miistat;
  914. miistat = readl(base + NvRegMIIStatus);
  915. writel(NVREG_MIISTAT_MASK, base + NvRegMIIStatus);
  916. dprintf(("startup: got 0x%hX.\n", miistat));
  917. }
  918. ret = update_linkspeed(nic);
  919. //start_rx(nic);
  920. start_tx(nic);
  921. if (ret) {
  922. //Start Connection netif_carrier_on(dev);
  923. } else {
  924. printf("no link during initialization.\n");
  925. }
  926. return ret;
  927. }
  928. /*
  929. * extern void hex_dump(const char *data, const unsigned int len);
  930. */
  931. /**************************************************************************
  932. POLL - Wait for a frame
  933. ***************************************************************************/
  934. static int forcedeth_poll(struct nic *nic, int retrieve)
  935. {
  936. /* return true if there's an ethernet packet ready to read */
  937. /* nic->packet should contain data on return */
  938. /* nic->packetlen should contain length of data */
  939. int len;
  940. int i;
  941. u32 Flags;
  942. i = np->cur_rx % RX_RING;
  943. Flags = le32_to_cpu(rx_ring[i].FlagLen);
  944. len = nv_descr_getlength(&rx_ring[i], np->desc_ver);
  945. if (Flags & NV_RX_AVAIL)
  946. return 0; /* still owned by hardware, */
  947. if (np->desc_ver == DESC_VER_1) {
  948. if (!(Flags & NV_RX_DESCRIPTORVALID))
  949. return 0;
  950. } else {
  951. if (!(Flags & NV_RX2_DESCRIPTORVALID))
  952. return 0;
  953. }
  954. if (!retrieve)
  955. return 1;
  956. /* got a valid packet - forward it to the network core */
  957. nic->packetlen = len;
  958. memcpy(nic->packet, rxb + (i * RX_NIC_BUFSIZE), nic->packetlen);
  959. /*
  960. * hex_dump(rxb + (i * RX_NIC_BUFSIZE), len);
  961. */
  962. wmb();
  963. np->cur_rx++;
  964. alloc_rx(nic);
  965. return 1;
  966. }
  967. /**************************************************************************
  968. TRANSMIT - Transmit a frame
  969. ***************************************************************************/
  970. static void forcedeth_transmit(struct nic *nic, const char *d, /* Destination */
  971. unsigned int t, /* Type */
  972. unsigned int s, /* size */
  973. const char *p)
  974. { /* Packet */
  975. /* send the packet to destination */
  976. u8 *ptxb;
  977. u16 nstype;
  978. u8 *base = (u8 *) BASE;
  979. int nr = np->next_tx % TX_RING;
  980. /* point to the current txb incase multiple tx_rings are used */
  981. ptxb = txb + (nr * RX_NIC_BUFSIZE);
  982. //np->tx_skbuff[nr] = ptxb;
  983. /* copy the packet to ring buffer */
  984. memcpy(ptxb, d, ETH_ALEN); /* dst */
  985. memcpy(ptxb + ETH_ALEN, nic->node_addr, ETH_ALEN); /* src */
  986. nstype = htons((u16) t); /* type */
  987. memcpy(ptxb + 2 * ETH_ALEN, (u8 *) & nstype, 2); /* type */
  988. memcpy(ptxb + ETH_HLEN, p, s);
  989. s += ETH_HLEN;
  990. while (s < ETH_ZLEN) /* pad to min length */
  991. ptxb[s++] = '\0';
  992. tx_ring[nr].PacketBuffer = (u32) virt_to_le32desc(ptxb);
  993. wmb();
  994. tx_ring[nr].FlagLen = cpu_to_le32((s - 1) | np->tx_flags);
  995. writel(NVREG_TXRXCTL_KICK | np->desc_ver, base + NvRegTxRxControl);
  996. pci_push(base);
  997. np->next_tx++;
  998. }
  999. /**************************************************************************
  1000. DISABLE - Turn off ethernet interface
  1001. ***************************************************************************/
  1002. static void forcedeth_disable ( struct nic *nic __unused ) {
  1003. /* put the card in its initial state */
  1004. /* This function serves 3 purposes.
  1005. * This disables DMA and interrupts so we don't receive
  1006. * unexpected packets or interrupts from the card after
  1007. * etherboot has finished.
  1008. * This frees resources so etherboot may use
  1009. * this driver on another interface
  1010. * This allows etherboot to reinitialize the interface
  1011. * if something is something goes wrong.
  1012. */
  1013. u8 *base = (u8 *) BASE;
  1014. np->in_shutdown = 1;
  1015. stop_tx();
  1016. stop_rx();
  1017. /* disable interrupts on the nic or we will lock up */
  1018. writel(0, base + NvRegIrqMask);
  1019. pci_push(base);
  1020. dprintf(("Irqmask is zero again\n"));
  1021. /* specia op:o write back the misordered MAC address - otherwise
  1022. * the next probe_nic would see a wrong address.
  1023. */
  1024. writel(np->orig_mac[0], base + NvRegMacAddrA);
  1025. writel(np->orig_mac[1], base + NvRegMacAddrB);
  1026. }
  1027. /**************************************************************************
  1028. IRQ - Enable, Disable, or Force interrupts
  1029. ***************************************************************************/
  1030. static void forcedeth_irq(struct nic *nic __unused,
  1031. irq_action_t action __unused)
  1032. {
  1033. switch (action) {
  1034. case DISABLE:
  1035. break;
  1036. case ENABLE:
  1037. break;
  1038. case FORCE:
  1039. break;
  1040. }
  1041. }
  1042. static struct nic_operations forcedeth_operations = {
  1043. .connect = dummy_connect,
  1044. .poll = forcedeth_poll,
  1045. .transmit = forcedeth_transmit,
  1046. .irq = forcedeth_irq,
  1047. };
  1048. /**************************************************************************
  1049. PROBE - Look for an adapter, this routine's visible to the outside
  1050. ***************************************************************************/
  1051. #define IORESOURCE_MEM 0x00000200
  1052. #define board_found 1
  1053. #define valid_link 0
  1054. static int forcedeth_probe ( struct nic *nic, struct pci_device *pci ) {
  1055. unsigned long addr;
  1056. int sz;
  1057. u8 *base;
  1058. int i;
  1059. struct pci_device_id *ids = pci->driver->ids;
  1060. int id_count = pci->driver->id_count;
  1061. unsigned int flags = 0;
  1062. if (pci->ioaddr == 0)
  1063. return 0;
  1064. printf("forcedeth.c: Found %s, vendor=0x%hX, device=0x%hX\n",
  1065. pci->driver_name, pci->vendor, pci->device);
  1066. nic->ioaddr = pci->ioaddr;
  1067. nic->irqno = 0;
  1068. /* point to private storage */
  1069. np = &npx;
  1070. adjust_pci_device(pci);
  1071. addr = pci_bar_start(pci, PCI_BASE_ADDRESS_0);
  1072. sz = pci_bar_size(pci, PCI_BASE_ADDRESS_0);
  1073. /* BASE is used throughout to address the card */
  1074. BASE = (unsigned long) ioremap(addr, sz);
  1075. if (!BASE)
  1076. return 0;
  1077. /* handle different descriptor versions */
  1078. if (pci->device == PCI_DEVICE_ID_NVIDIA_NVENET_1 ||
  1079. pci->device == PCI_DEVICE_ID_NVIDIA_NVENET_2 ||
  1080. pci->device == PCI_DEVICE_ID_NVIDIA_NVENET_3)
  1081. np->desc_ver = DESC_VER_1;
  1082. else
  1083. np->desc_ver = DESC_VER_2;
  1084. //rx_ring[0] = rx_ring;
  1085. //tx_ring[0] = tx_ring;
  1086. /* read the mac address */
  1087. base = (u8 *) BASE;
  1088. np->orig_mac[0] = readl(base + NvRegMacAddrA);
  1089. np->orig_mac[1] = readl(base + NvRegMacAddrB);
  1090. /* lookup the flags from pci_device_id */
  1091. for(i = 0; i < id_count; i++) {
  1092. if(pci->vendor == ids[i].vendor &&
  1093. pci->device == ids[i].device) {
  1094. flags = ids[i].driver_data;
  1095. break;
  1096. }
  1097. }
  1098. /* read MAC address */
  1099. if(flags & MAC_ADDR_CORRECT) {
  1100. nic->node_addr[0] = (np->orig_mac[0] >> 0) & 0xff;
  1101. nic->node_addr[1] = (np->orig_mac[0] >> 8) & 0xff;
  1102. nic->node_addr[2] = (np->orig_mac[0] >> 16) & 0xff;
  1103. nic->node_addr[3] = (np->orig_mac[0] >> 24) & 0xff;
  1104. nic->node_addr[4] = (np->orig_mac[1] >> 0) & 0xff;
  1105. nic->node_addr[5] = (np->orig_mac[1] >> 8) & 0xff;
  1106. } else {
  1107. nic->node_addr[0] = (np->orig_mac[1] >> 8) & 0xff;
  1108. nic->node_addr[1] = (np->orig_mac[1] >> 0) & 0xff;
  1109. nic->node_addr[2] = (np->orig_mac[0] >> 24) & 0xff;
  1110. nic->node_addr[3] = (np->orig_mac[0] >> 16) & 0xff;
  1111. nic->node_addr[4] = (np->orig_mac[0] >> 8) & 0xff;
  1112. nic->node_addr[5] = (np->orig_mac[0] >> 0) & 0xff;
  1113. }
  1114. #ifdef LINUX
  1115. if (!is_valid_ether_addr(dev->dev_addr)) {
  1116. /*
  1117. * Bad mac address. At least one bios sets the mac address
  1118. * to 01:23:45:67:89:ab
  1119. */
  1120. printk(KERN_ERR
  1121. "%s: Invalid Mac address detected: %02x:%02x:%02x:%02x:%02x:%02x\n",
  1122. pci_name(pci_dev), dev->dev_addr[0],
  1123. dev->dev_addr[1], dev->dev_addr[2],
  1124. dev->dev_addr[3], dev->dev_addr[4],
  1125. dev->dev_addr[5]);
  1126. printk(KERN_ERR
  1127. "Please complain to your hardware vendor. Switching to a random MAC.\n");
  1128. dev->dev_addr[0] = 0x00;
  1129. dev->dev_addr[1] = 0x00;
  1130. dev->dev_addr[2] = 0x6c;
  1131. get_random_bytes(&dev->dev_addr[3], 3);
  1132. }
  1133. #endif
  1134. DBG ( "%s: MAC Address %s\n", pci->driver_name, eth_ntoa ( nic->node_addr ) );
  1135. /* disable WOL */
  1136. writel(0, base + NvRegWakeUpFlags);
  1137. np->wolenabled = 0;
  1138. if (np->desc_ver == DESC_VER_1) {
  1139. np->tx_flags = NV_TX_LASTPACKET | NV_TX_VALID;
  1140. } else {
  1141. np->tx_flags = NV_TX2_LASTPACKET | NV_TX2_VALID;
  1142. }
  1143. switch (pci->device) {
  1144. case 0x01C3: // nforce
  1145. case 0x054C:
  1146. // DEV_IRQMASK_1|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER,
  1147. np->irqmask = NVREG_IRQMASK_WANTED_2 | NVREG_IRQ_TIMER;
  1148. // np->need_linktimer = 1;
  1149. // np->link_timeout = jiffies + LINK_TIMEOUT;
  1150. break;
  1151. case 0x0066:
  1152. /* Fall Through */
  1153. case 0x00D6:
  1154. // DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER
  1155. np->irqmask = NVREG_IRQMASK_WANTED_2;
  1156. np->irqmask |= NVREG_IRQ_TIMER;
  1157. // np->need_linktimer = 1;
  1158. // np->link_timeout = jiffies + LINK_TIMEOUT;
  1159. if (np->desc_ver == DESC_VER_1)
  1160. np->tx_flags |= NV_TX_LASTPACKET1;
  1161. else
  1162. np->tx_flags |= NV_TX2_LASTPACKET1;
  1163. break;
  1164. case 0x0373:
  1165. /* Fall Through */
  1166. case 0x0086:
  1167. /* Fall Through */
  1168. case 0x008c:
  1169. /* Fall Through */
  1170. case 0x00e6:
  1171. /* Fall Through */
  1172. case 0x00df:
  1173. /* Fall Through */
  1174. case 0x0056:
  1175. /* Fall Through */
  1176. case 0x0057:
  1177. /* Fall Through */
  1178. case 0x0037:
  1179. /* Fall Through */
  1180. case 0x0038:
  1181. //DEV_NEED_LASTPACKET1|DEV_IRQMASK_2|DEV_NEED_TIMERIRQ
  1182. np->irqmask = NVREG_IRQMASK_WANTED_2;
  1183. np->irqmask |= NVREG_IRQ_TIMER;
  1184. // np->need_linktimer = 1;
  1185. // np->link_timeout = jiffies + LINK_TIMEOUT;
  1186. if (np->desc_ver == DESC_VER_1)
  1187. np->tx_flags |= NV_TX_LASTPACKET1;
  1188. else
  1189. np->tx_flags |= NV_TX2_LASTPACKET1;
  1190. break;
  1191. default:
  1192. printf
  1193. ("Your card was undefined in this driver. Review driver_data in Linux driver and send a patch\n");
  1194. }
  1195. /* find a suitable phy */
  1196. for (i = 1; i < 32; i++) {
  1197. int id1, id2;
  1198. id1 = mii_rw(nic, i, MII_PHYSID1, MII_READ);
  1199. if (id1 < 0 || id1 == 0xffff)
  1200. continue;
  1201. id2 = mii_rw(nic, i, MII_PHYSID2, MII_READ);
  1202. if (id2 < 0 || id2 == 0xffff)
  1203. continue;
  1204. id1 = (id1 & PHYID1_OUI_MASK) << PHYID1_OUI_SHFT;
  1205. id2 = (id2 & PHYID2_OUI_MASK) >> PHYID2_OUI_SHFT;
  1206. dprintf
  1207. (("%s: open: Found PHY %hX:%hX at address %d.\n",
  1208. pci->driver_name, id1, id2, i));
  1209. np->phyaddr = i;
  1210. np->phy_oui = id1 | id2;
  1211. break;
  1212. }
  1213. if (i == 32) {
  1214. /* PHY in isolate mode? No phy attached and user wants to
  1215. * test loopback? Very odd, but can be correct.
  1216. */
  1217. printf
  1218. ("%s: open: Could not find a valid PHY.\n", pci->driver_name);
  1219. }
  1220. if (i != 32) {
  1221. /* reset it */
  1222. phy_init(nic);
  1223. }
  1224. dprintf(("%s: forcedeth.c: subsystem: %hX:%hX bound to %s\n",
  1225. pci->driver_name, pci->vendor, pci->dev_id, pci->driver_name));
  1226. if(!forcedeth_reset(nic)) return 0; // no valid link
  1227. /* point to NIC specific routines */
  1228. nic->nic_op = &forcedeth_operations;
  1229. return 1;
  1230. }
  1231. static struct pci_device_id forcedeth_nics[] = {
  1232. PCI_ROM(0x10de, 0x01C3, "nforce", "nForce NVENET_1 Ethernet Controller", 0),
  1233. PCI_ROM(0x10de, 0x0066, "nforce2", "nForce NVENET_2 Ethernet Controller", 0),
  1234. PCI_ROM(0x10de, 0x00D6, "nforce3", "nForce NVENET_3 Ethernet Controller", 0),
  1235. PCI_ROM(0x10de, 0x0086, "nforce4", "nForce NVENET_4 Ethernet Controller", 0),
  1236. PCI_ROM(0x10de, 0x008c, "nforce5", "nForce NVENET_5 Ethernet Controller", 0),
  1237. PCI_ROM(0x10de, 0x00e6, "nforce6", "nForce NVENET_6 Ethernet Controller", 0),
  1238. PCI_ROM(0x10de, 0x00df, "nforce7", "nForce NVENET_7 Ethernet Controller", 0),
  1239. PCI_ROM(0x10de, 0x0056, "nforce8", "nForce NVENET_8 Ethernet Controller", 0),
  1240. PCI_ROM(0x10de, 0x0057, "nforce9", "nForce NVENET_9 Ethernet Controller", 0),
  1241. PCI_ROM(0x10de, 0x0037, "nforce10", "nForce NVENET_10 Ethernet Controller", 0),
  1242. PCI_ROM(0x10de, 0x0038, "nforce11", "nForce NVENET_11 Ethernet Controller", 0),
  1243. PCI_ROM(0x10de, 0x0373, "nforce15", "nForce NVENET_15 Ethernet Controller", 0),
  1244. PCI_ROM(0x10de, 0x0269, "nforce16", "nForce NVENET_16 Ethernet Controller", 0),
  1245. PCI_ROM(0x10de, 0x0760, "nforce17", "nForce NVENET_17 Ethernet Controller", MAC_ADDR_CORRECT),
  1246. PCI_ROM(0x10de, 0x054c, "nforce67", "nForce NVENET_67 Ethernet Controller", MAC_ADDR_CORRECT),
  1247. };
  1248. PCI_DRIVER ( forcedeth_driver, forcedeth_nics, PCI_NO_CLASS );
  1249. DRIVER ( "forcedeth", nic_driver, pci_driver, forcedeth_driver,
  1250. forcedeth_probe, forcedeth_disable );
  1251. /*
  1252. * Local variables:
  1253. * c-basic-offset: 8
  1254. * c-indent-level: 8
  1255. * tab-width: 8
  1256. * End:
  1257. */