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.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696
  1. /* bnx2.c: Broadcom NX2 network driver.
  2. *
  3. * Copyright (c) 2004, 2005, 2006 Broadcom Corporation
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation.
  8. *
  9. * Written by: Michael Chan (mchan@broadcom.com)
  10. *
  11. * Etherboot port by Ryan Jackson (rjackson@lnxi.com), based on driver
  12. * version 1.4.40 from linux 2.6.17
  13. */
  14. #include "etherboot.h"
  15. #include "nic.h"
  16. #include <errno.h>
  17. #include <gpxe/pci.h>
  18. #include <gpxe/ethernet.h>
  19. #include "timer.h"
  20. #include "string.h"
  21. #include "bnx2.h"
  22. #include "bnx2_fw.h"
  23. #if 0
  24. /* Dummy defines for error handling */
  25. #define EBUSY 1
  26. #define ENODEV 2
  27. #define EINVAL 3
  28. #define ENOMEM 4
  29. #define EIO 5
  30. #endif
  31. /* The bnx2 seems to be picky about the alignment of the receive buffers
  32. * and possibly the status block.
  33. */
  34. static struct bss {
  35. struct tx_bd tx_desc_ring[TX_DESC_CNT];
  36. struct rx_bd rx_desc_ring[RX_DESC_CNT];
  37. unsigned char rx_buf[RX_BUF_CNT][RX_BUF_SIZE];
  38. struct status_block status_blk;
  39. struct statistics_block stats_blk;
  40. } bnx2_bss;
  41. static struct bnx2 bnx2;
  42. static struct flash_spec flash_table[] =
  43. {
  44. /* Slow EEPROM */
  45. {0x00000000, 0x40830380, 0x009f0081, 0xa184a053, 0xaf000400,
  46. 1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
  47. SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
  48. "EEPROM - slow"},
  49. /* Expansion entry 0001 */
  50. {0x08000002, 0x4b808201, 0x00050081, 0x03840253, 0xaf020406,
  51. 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
  52. SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
  53. "Entry 0001"},
  54. /* Saifun SA25F010 (non-buffered flash) */
  55. /* strap, cfg1, & write1 need updates */
  56. {0x04000001, 0x47808201, 0x00050081, 0x03840253, 0xaf020406,
  57. 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
  58. SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*2,
  59. "Non-buffered flash (128kB)"},
  60. /* Saifun SA25F020 (non-buffered flash) */
  61. /* strap, cfg1, & write1 need updates */
  62. {0x0c000003, 0x4f808201, 0x00050081, 0x03840253, 0xaf020406,
  63. 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
  64. SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*4,
  65. "Non-buffered flash (256kB)"},
  66. /* Expansion entry 0100 */
  67. {0x11000000, 0x53808201, 0x00050081, 0x03840253, 0xaf020406,
  68. 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
  69. SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
  70. "Entry 0100"},
  71. /* Entry 0101: ST M45PE10 (non-buffered flash, TetonII B0) */
  72. {0x19000002, 0x5b808201, 0x000500db, 0x03840253, 0xaf020406,
  73. 0, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
  74. ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*2,
  75. "Entry 0101: ST M45PE10 (128kB non-bufferred)"},
  76. /* Entry 0110: ST M45PE20 (non-buffered flash)*/
  77. {0x15000001, 0x57808201, 0x000500db, 0x03840253, 0xaf020406,
  78. 0, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE,
  79. ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*4,
  80. "Entry 0110: ST M45PE20 (256kB non-bufferred)"},
  81. /* Saifun SA25F005 (non-buffered flash) */
  82. /* strap, cfg1, & write1 need updates */
  83. {0x1d000003, 0x5f808201, 0x00050081, 0x03840253, 0xaf020406,
  84. 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
  85. SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE,
  86. "Non-buffered flash (64kB)"},
  87. /* Fast EEPROM */
  88. {0x22000000, 0x62808380, 0x009f0081, 0xa184a053, 0xaf000400,
  89. 1, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE,
  90. SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE,
  91. "EEPROM - fast"},
  92. /* Expansion entry 1001 */
  93. {0x2a000002, 0x6b808201, 0x00050081, 0x03840253, 0xaf020406,
  94. 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
  95. SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
  96. "Entry 1001"},
  97. /* Expansion entry 1010 */
  98. {0x26000001, 0x67808201, 0x00050081, 0x03840253, 0xaf020406,
  99. 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
  100. SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
  101. "Entry 1010"},
  102. /* ATMEL AT45DB011B (buffered flash) */
  103. {0x2e000003, 0x6e808273, 0x00570081, 0x68848353, 0xaf000400,
  104. 1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
  105. BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE,
  106. "Buffered flash (128kB)"},
  107. /* Expansion entry 1100 */
  108. {0x33000000, 0x73808201, 0x00050081, 0x03840253, 0xaf020406,
  109. 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
  110. SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
  111. "Entry 1100"},
  112. /* Expansion entry 1101 */
  113. {0x3b000002, 0x7b808201, 0x00050081, 0x03840253, 0xaf020406,
  114. 0, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE,
  115. SAIFUN_FLASH_BYTE_ADDR_MASK, 0,
  116. "Entry 1101"},
  117. /* Ateml Expansion entry 1110 */
  118. {0x37000001, 0x76808273, 0x00570081, 0x68848353, 0xaf000400,
  119. 1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
  120. BUFFERED_FLASH_BYTE_ADDR_MASK, 0,
  121. "Entry 1110 (Atmel)"},
  122. /* ATMEL AT45DB021B (buffered flash) */
  123. {0x3f000003, 0x7e808273, 0x00570081, 0x68848353, 0xaf000400,
  124. 1, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE,
  125. BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE*2,
  126. "Buffered flash (256kB)"},
  127. };
  128. static u32
  129. bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset)
  130. {
  131. REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
  132. return (REG_RD(bp, BNX2_PCICFG_REG_WINDOW));
  133. }
  134. static void
  135. bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val)
  136. {
  137. REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset);
  138. REG_WR(bp, BNX2_PCICFG_REG_WINDOW, val);
  139. }
  140. static void
  141. bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val)
  142. {
  143. offset += cid_addr;
  144. REG_WR(bp, BNX2_CTX_DATA_ADR, offset);
  145. REG_WR(bp, BNX2_CTX_DATA, val);
  146. }
  147. static int
  148. bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val)
  149. {
  150. u32 val1;
  151. int i, ret;
  152. if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
  153. val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
  154. val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
  155. REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
  156. REG_RD(bp, BNX2_EMAC_MDIO_MODE);
  157. udelay(40);
  158. }
  159. val1 = (bp->phy_addr << 21) | (reg << 16) |
  160. BNX2_EMAC_MDIO_COMM_COMMAND_READ | BNX2_EMAC_MDIO_COMM_DISEXT |
  161. BNX2_EMAC_MDIO_COMM_START_BUSY;
  162. REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
  163. for (i = 0; i < 50; i++) {
  164. udelay(10);
  165. val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
  166. if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
  167. udelay(5);
  168. val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
  169. val1 &= BNX2_EMAC_MDIO_COMM_DATA;
  170. break;
  171. }
  172. }
  173. if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY) {
  174. *val = 0x0;
  175. ret = -EBUSY;
  176. }
  177. else {
  178. *val = val1;
  179. ret = 0;
  180. }
  181. if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
  182. val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
  183. val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
  184. REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
  185. REG_RD(bp, BNX2_EMAC_MDIO_MODE);
  186. udelay(40);
  187. }
  188. return ret;
  189. }
  190. static int
  191. bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val)
  192. {
  193. u32 val1;
  194. int i, ret;
  195. if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
  196. val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
  197. val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL;
  198. REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
  199. REG_RD(bp, BNX2_EMAC_MDIO_MODE);
  200. udelay(40);
  201. }
  202. val1 = (bp->phy_addr << 21) | (reg << 16) | val |
  203. BNX2_EMAC_MDIO_COMM_COMMAND_WRITE |
  204. BNX2_EMAC_MDIO_COMM_START_BUSY | BNX2_EMAC_MDIO_COMM_DISEXT;
  205. REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1);
  206. for (i = 0; i < 50; i++) {
  207. udelay(10);
  208. val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM);
  209. if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) {
  210. udelay(5);
  211. break;
  212. }
  213. }
  214. if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)
  215. ret = -EBUSY;
  216. else
  217. ret = 0;
  218. if (bp->phy_flags & PHY_INT_MODE_AUTO_POLLING_FLAG) {
  219. val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE);
  220. val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL;
  221. REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1);
  222. REG_RD(bp, BNX2_EMAC_MDIO_MODE);
  223. udelay(40);
  224. }
  225. return ret;
  226. }
  227. static void
  228. bnx2_disable_int(struct bnx2 *bp)
  229. {
  230. REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
  231. BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
  232. REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD);
  233. }
  234. static int
  235. bnx2_alloc_mem(struct bnx2 *bp)
  236. {
  237. bp->tx_desc_ring = bnx2_bss.tx_desc_ring;
  238. bp->tx_desc_mapping = virt_to_bus(bp->tx_desc_ring);
  239. bp->rx_desc_ring = bnx2_bss.rx_desc_ring;
  240. memset(bp->rx_desc_ring, 0, sizeof(struct rx_bd) * RX_DESC_CNT);
  241. bp->rx_desc_mapping = virt_to_bus(bp->rx_desc_ring);
  242. memset(&bnx2_bss.status_blk, 0, sizeof(struct status_block));
  243. bp->status_blk = &bnx2_bss.status_blk;
  244. bp->status_blk_mapping = virt_to_bus(&bnx2_bss.status_blk);
  245. bp->stats_blk = &bnx2_bss.stats_blk;
  246. memset(&bnx2_bss.stats_blk, 0, sizeof(struct statistics_block));
  247. bp->stats_blk_mapping = virt_to_bus(&bnx2_bss.stats_blk);
  248. return 0;
  249. }
  250. static void
  251. bnx2_report_fw_link(struct bnx2 *bp)
  252. {
  253. u32 fw_link_status = 0;
  254. if (bp->link_up) {
  255. u32 bmsr;
  256. switch (bp->line_speed) {
  257. case SPEED_10:
  258. if (bp->duplex == DUPLEX_HALF)
  259. fw_link_status = BNX2_LINK_STATUS_10HALF;
  260. else
  261. fw_link_status = BNX2_LINK_STATUS_10FULL;
  262. break;
  263. case SPEED_100:
  264. if (bp->duplex == DUPLEX_HALF)
  265. fw_link_status = BNX2_LINK_STATUS_100HALF;
  266. else
  267. fw_link_status = BNX2_LINK_STATUS_100FULL;
  268. break;
  269. case SPEED_1000:
  270. if (bp->duplex == DUPLEX_HALF)
  271. fw_link_status = BNX2_LINK_STATUS_1000HALF;
  272. else
  273. fw_link_status = BNX2_LINK_STATUS_1000FULL;
  274. break;
  275. case SPEED_2500:
  276. if (bp->duplex == DUPLEX_HALF)
  277. fw_link_status = BNX2_LINK_STATUS_2500HALF;
  278. else
  279. fw_link_status = BNX2_LINK_STATUS_2500FULL;
  280. break;
  281. }
  282. fw_link_status |= BNX2_LINK_STATUS_LINK_UP;
  283. if (bp->autoneg) {
  284. fw_link_status |= BNX2_LINK_STATUS_AN_ENABLED;
  285. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  286. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  287. if (!(bmsr & BMSR_ANEGCOMPLETE) ||
  288. bp->phy_flags & PHY_PARALLEL_DETECT_FLAG)
  289. fw_link_status |= BNX2_LINK_STATUS_PARALLEL_DET;
  290. else
  291. fw_link_status |= BNX2_LINK_STATUS_AN_COMPLETE;
  292. }
  293. }
  294. else
  295. fw_link_status = BNX2_LINK_STATUS_LINK_DOWN;
  296. REG_WR_IND(bp, bp->shmem_base + BNX2_LINK_STATUS, fw_link_status);
  297. }
  298. static void
  299. bnx2_report_link(struct bnx2 *bp)
  300. {
  301. if (bp->link_up) {
  302. printf("NIC Link is Up, ");
  303. printf("%d Mbps ", bp->line_speed);
  304. if (bp->duplex == DUPLEX_FULL)
  305. printf("full duplex");
  306. else
  307. printf("half duplex");
  308. if (bp->flow_ctrl) {
  309. if (bp->flow_ctrl & FLOW_CTRL_RX) {
  310. printf(", receive ");
  311. if (bp->flow_ctrl & FLOW_CTRL_TX)
  312. printf("& transmit ");
  313. }
  314. else {
  315. printf(", transmit ");
  316. }
  317. printf("flow control ON");
  318. }
  319. printf("\n");
  320. }
  321. else {
  322. printf("NIC Link is Down\n");
  323. }
  324. bnx2_report_fw_link(bp);
  325. }
  326. static void
  327. bnx2_resolve_flow_ctrl(struct bnx2 *bp)
  328. {
  329. u32 local_adv, remote_adv;
  330. bp->flow_ctrl = 0;
  331. if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) !=
  332. (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) {
  333. if (bp->duplex == DUPLEX_FULL) {
  334. bp->flow_ctrl = bp->req_flow_ctrl;
  335. }
  336. return;
  337. }
  338. if (bp->duplex != DUPLEX_FULL) {
  339. return;
  340. }
  341. if ((bp->phy_flags & PHY_SERDES_FLAG) &&
  342. (CHIP_NUM(bp) == CHIP_NUM_5708)) {
  343. u32 val;
  344. bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
  345. if (val & BCM5708S_1000X_STAT1_TX_PAUSE)
  346. bp->flow_ctrl |= FLOW_CTRL_TX;
  347. if (val & BCM5708S_1000X_STAT1_RX_PAUSE)
  348. bp->flow_ctrl |= FLOW_CTRL_RX;
  349. return;
  350. }
  351. bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
  352. bnx2_read_phy(bp, MII_LPA, &remote_adv);
  353. if (bp->phy_flags & PHY_SERDES_FLAG) {
  354. u32 new_local_adv = 0;
  355. u32 new_remote_adv = 0;
  356. if (local_adv & ADVERTISE_1000XPAUSE)
  357. new_local_adv |= ADVERTISE_PAUSE_CAP;
  358. if (local_adv & ADVERTISE_1000XPSE_ASYM)
  359. new_local_adv |= ADVERTISE_PAUSE_ASYM;
  360. if (remote_adv & ADVERTISE_1000XPAUSE)
  361. new_remote_adv |= ADVERTISE_PAUSE_CAP;
  362. if (remote_adv & ADVERTISE_1000XPSE_ASYM)
  363. new_remote_adv |= ADVERTISE_PAUSE_ASYM;
  364. local_adv = new_local_adv;
  365. remote_adv = new_remote_adv;
  366. }
  367. /* See Table 28B-3 of 802.3ab-1999 spec. */
  368. if (local_adv & ADVERTISE_PAUSE_CAP) {
  369. if(local_adv & ADVERTISE_PAUSE_ASYM) {
  370. if (remote_adv & ADVERTISE_PAUSE_CAP) {
  371. bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
  372. }
  373. else if (remote_adv & ADVERTISE_PAUSE_ASYM) {
  374. bp->flow_ctrl = FLOW_CTRL_RX;
  375. }
  376. }
  377. else {
  378. if (remote_adv & ADVERTISE_PAUSE_CAP) {
  379. bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
  380. }
  381. }
  382. }
  383. else if (local_adv & ADVERTISE_PAUSE_ASYM) {
  384. if ((remote_adv & ADVERTISE_PAUSE_CAP) &&
  385. (remote_adv & ADVERTISE_PAUSE_ASYM)) {
  386. bp->flow_ctrl = FLOW_CTRL_TX;
  387. }
  388. }
  389. }
  390. static int
  391. bnx2_5708s_linkup(struct bnx2 *bp)
  392. {
  393. u32 val;
  394. bp->link_up = 1;
  395. bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val);
  396. switch (val & BCM5708S_1000X_STAT1_SPEED_MASK) {
  397. case BCM5708S_1000X_STAT1_SPEED_10:
  398. bp->line_speed = SPEED_10;
  399. break;
  400. case BCM5708S_1000X_STAT1_SPEED_100:
  401. bp->line_speed = SPEED_100;
  402. break;
  403. case BCM5708S_1000X_STAT1_SPEED_1G:
  404. bp->line_speed = SPEED_1000;
  405. break;
  406. case BCM5708S_1000X_STAT1_SPEED_2G5:
  407. bp->line_speed = SPEED_2500;
  408. break;
  409. }
  410. if (val & BCM5708S_1000X_STAT1_FD)
  411. bp->duplex = DUPLEX_FULL;
  412. else
  413. bp->duplex = DUPLEX_HALF;
  414. return 0;
  415. }
  416. static int
  417. bnx2_5706s_linkup(struct bnx2 *bp)
  418. {
  419. u32 bmcr, local_adv, remote_adv, common;
  420. bp->link_up = 1;
  421. bp->line_speed = SPEED_1000;
  422. bnx2_read_phy(bp, MII_BMCR, &bmcr);
  423. if (bmcr & BMCR_FULLDPLX) {
  424. bp->duplex = DUPLEX_FULL;
  425. }
  426. else {
  427. bp->duplex = DUPLEX_HALF;
  428. }
  429. if (!(bmcr & BMCR_ANENABLE)) {
  430. return 0;
  431. }
  432. bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
  433. bnx2_read_phy(bp, MII_LPA, &remote_adv);
  434. common = local_adv & remote_adv;
  435. if (common & (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL)) {
  436. if (common & ADVERTISE_1000XFULL) {
  437. bp->duplex = DUPLEX_FULL;
  438. }
  439. else {
  440. bp->duplex = DUPLEX_HALF;
  441. }
  442. }
  443. return 0;
  444. }
  445. static int
  446. bnx2_copper_linkup(struct bnx2 *bp)
  447. {
  448. u32 bmcr;
  449. bnx2_read_phy(bp, MII_BMCR, &bmcr);
  450. if (bmcr & BMCR_ANENABLE) {
  451. u32 local_adv, remote_adv, common;
  452. bnx2_read_phy(bp, MII_CTRL1000, &local_adv);
  453. bnx2_read_phy(bp, MII_STAT1000, &remote_adv);
  454. common = local_adv & (remote_adv >> 2);
  455. if (common & ADVERTISE_1000FULL) {
  456. bp->line_speed = SPEED_1000;
  457. bp->duplex = DUPLEX_FULL;
  458. }
  459. else if (common & ADVERTISE_1000HALF) {
  460. bp->line_speed = SPEED_1000;
  461. bp->duplex = DUPLEX_HALF;
  462. }
  463. else {
  464. bnx2_read_phy(bp, MII_ADVERTISE, &local_adv);
  465. bnx2_read_phy(bp, MII_LPA, &remote_adv);
  466. common = local_adv & remote_adv;
  467. if (common & ADVERTISE_100FULL) {
  468. bp->line_speed = SPEED_100;
  469. bp->duplex = DUPLEX_FULL;
  470. }
  471. else if (common & ADVERTISE_100HALF) {
  472. bp->line_speed = SPEED_100;
  473. bp->duplex = DUPLEX_HALF;
  474. }
  475. else if (common & ADVERTISE_10FULL) {
  476. bp->line_speed = SPEED_10;
  477. bp->duplex = DUPLEX_FULL;
  478. }
  479. else if (common & ADVERTISE_10HALF) {
  480. bp->line_speed = SPEED_10;
  481. bp->duplex = DUPLEX_HALF;
  482. }
  483. else {
  484. bp->line_speed = 0;
  485. bp->link_up = 0;
  486. }
  487. }
  488. }
  489. else {
  490. if (bmcr & BMCR_SPEED100) {
  491. bp->line_speed = SPEED_100;
  492. }
  493. else {
  494. bp->line_speed = SPEED_10;
  495. }
  496. if (bmcr & BMCR_FULLDPLX) {
  497. bp->duplex = DUPLEX_FULL;
  498. }
  499. else {
  500. bp->duplex = DUPLEX_HALF;
  501. }
  502. }
  503. return 0;
  504. }
  505. static int
  506. bnx2_set_mac_link(struct bnx2 *bp)
  507. {
  508. u32 val;
  509. REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620);
  510. if (bp->link_up && (bp->line_speed == SPEED_1000) &&
  511. (bp->duplex == DUPLEX_HALF)) {
  512. REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff);
  513. }
  514. /* Configure the EMAC mode register. */
  515. val = REG_RD(bp, BNX2_EMAC_MODE);
  516. val &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX |
  517. BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK |
  518. BNX2_EMAC_MODE_25G);
  519. if (bp->link_up) {
  520. switch (bp->line_speed) {
  521. case SPEED_10:
  522. if (CHIP_NUM(bp) == CHIP_NUM_5708) {
  523. val |= BNX2_EMAC_MODE_PORT_MII_10;
  524. break;
  525. }
  526. /* fall through */
  527. case SPEED_100:
  528. val |= BNX2_EMAC_MODE_PORT_MII;
  529. break;
  530. case SPEED_2500:
  531. val |= BNX2_EMAC_MODE_25G;
  532. /* fall through */
  533. case SPEED_1000:
  534. val |= BNX2_EMAC_MODE_PORT_GMII;
  535. break;
  536. }
  537. }
  538. else {
  539. val |= BNX2_EMAC_MODE_PORT_GMII;
  540. }
  541. /* Set the MAC to operate in the appropriate duplex mode. */
  542. if (bp->duplex == DUPLEX_HALF)
  543. val |= BNX2_EMAC_MODE_HALF_DUPLEX;
  544. REG_WR(bp, BNX2_EMAC_MODE, val);
  545. /* Enable/disable rx PAUSE. */
  546. bp->rx_mode &= ~BNX2_EMAC_RX_MODE_FLOW_EN;
  547. if (bp->flow_ctrl & FLOW_CTRL_RX)
  548. bp->rx_mode |= BNX2_EMAC_RX_MODE_FLOW_EN;
  549. REG_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode);
  550. /* Enable/disable tx PAUSE. */
  551. val = REG_RD(bp, BNX2_EMAC_TX_MODE);
  552. val &= ~BNX2_EMAC_TX_MODE_FLOW_EN;
  553. if (bp->flow_ctrl & FLOW_CTRL_TX)
  554. val |= BNX2_EMAC_TX_MODE_FLOW_EN;
  555. REG_WR(bp, BNX2_EMAC_TX_MODE, val);
  556. /* Acknowledge the interrupt. */
  557. REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);
  558. return 0;
  559. }
  560. static int
  561. bnx2_set_link(struct bnx2 *bp)
  562. {
  563. u32 bmsr;
  564. u8 link_up;
  565. if (bp->loopback == MAC_LOOPBACK) {
  566. bp->link_up = 1;
  567. return 0;
  568. }
  569. link_up = bp->link_up;
  570. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  571. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  572. if ((bp->phy_flags & PHY_SERDES_FLAG) &&
  573. (CHIP_NUM(bp) == CHIP_NUM_5706)) {
  574. u32 val;
  575. val = REG_RD(bp, BNX2_EMAC_STATUS);
  576. if (val & BNX2_EMAC_STATUS_LINK)
  577. bmsr |= BMSR_LSTATUS;
  578. else
  579. bmsr &= ~BMSR_LSTATUS;
  580. }
  581. if (bmsr & BMSR_LSTATUS) {
  582. bp->link_up = 1;
  583. if (bp->phy_flags & PHY_SERDES_FLAG) {
  584. if (CHIP_NUM(bp) == CHIP_NUM_5706)
  585. bnx2_5706s_linkup(bp);
  586. else if (CHIP_NUM(bp) == CHIP_NUM_5708)
  587. bnx2_5708s_linkup(bp);
  588. }
  589. else {
  590. bnx2_copper_linkup(bp);
  591. }
  592. bnx2_resolve_flow_ctrl(bp);
  593. }
  594. else {
  595. if ((bp->phy_flags & PHY_SERDES_FLAG) &&
  596. (bp->autoneg & AUTONEG_SPEED)) {
  597. u32 bmcr;
  598. bnx2_read_phy(bp, MII_BMCR, &bmcr);
  599. if (!(bmcr & BMCR_ANENABLE)) {
  600. bnx2_write_phy(bp, MII_BMCR, bmcr |
  601. BMCR_ANENABLE);
  602. }
  603. }
  604. bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
  605. bp->link_up = 0;
  606. }
  607. if (bp->link_up != link_up) {
  608. bnx2_report_link(bp);
  609. }
  610. bnx2_set_mac_link(bp);
  611. return 0;
  612. }
  613. static int
  614. bnx2_reset_phy(struct bnx2 *bp)
  615. {
  616. int i;
  617. u32 reg;
  618. bnx2_write_phy(bp, MII_BMCR, BMCR_RESET);
  619. #define PHY_RESET_MAX_WAIT 100
  620. for (i = 0; i < PHY_RESET_MAX_WAIT; i++) {
  621. udelay(10);
  622. bnx2_read_phy(bp, MII_BMCR, &reg);
  623. if (!(reg & BMCR_RESET)) {
  624. udelay(20);
  625. break;
  626. }
  627. }
  628. if (i == PHY_RESET_MAX_WAIT) {
  629. return -EBUSY;
  630. }
  631. return 0;
  632. }
  633. static u32
  634. bnx2_phy_get_pause_adv(struct bnx2 *bp)
  635. {
  636. u32 adv = 0;
  637. if ((bp->req_flow_ctrl & (FLOW_CTRL_RX | FLOW_CTRL_TX)) ==
  638. (FLOW_CTRL_RX | FLOW_CTRL_TX)) {
  639. if (bp->phy_flags & PHY_SERDES_FLAG) {
  640. adv = ADVERTISE_1000XPAUSE;
  641. }
  642. else {
  643. adv = ADVERTISE_PAUSE_CAP;
  644. }
  645. }
  646. else if (bp->req_flow_ctrl & FLOW_CTRL_TX) {
  647. if (bp->phy_flags & PHY_SERDES_FLAG) {
  648. adv = ADVERTISE_1000XPSE_ASYM;
  649. }
  650. else {
  651. adv = ADVERTISE_PAUSE_ASYM;
  652. }
  653. }
  654. else if (bp->req_flow_ctrl & FLOW_CTRL_RX) {
  655. if (bp->phy_flags & PHY_SERDES_FLAG) {
  656. adv = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM;
  657. }
  658. else {
  659. adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
  660. }
  661. }
  662. return adv;
  663. }
  664. static int
  665. bnx2_setup_serdes_phy(struct bnx2 *bp)
  666. {
  667. u32 adv, bmcr, up1;
  668. u32 new_adv = 0;
  669. if (!(bp->autoneg & AUTONEG_SPEED)) {
  670. u32 new_bmcr;
  671. int force_link_down = 0;
  672. if (CHIP_NUM(bp) == CHIP_NUM_5708) {
  673. bnx2_read_phy(bp, BCM5708S_UP1, &up1);
  674. if (up1 & BCM5708S_UP1_2G5) {
  675. up1 &= ~BCM5708S_UP1_2G5;
  676. bnx2_write_phy(bp, BCM5708S_UP1, up1);
  677. force_link_down = 1;
  678. }
  679. }
  680. bnx2_read_phy(bp, MII_ADVERTISE, &adv);
  681. adv &= ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF);
  682. bnx2_read_phy(bp, MII_BMCR, &bmcr);
  683. new_bmcr = bmcr & ~BMCR_ANENABLE;
  684. new_bmcr |= BMCR_SPEED1000;
  685. if (bp->req_duplex == DUPLEX_FULL) {
  686. adv |= ADVERTISE_1000XFULL;
  687. new_bmcr |= BMCR_FULLDPLX;
  688. }
  689. else {
  690. adv |= ADVERTISE_1000XHALF;
  691. new_bmcr &= ~BMCR_FULLDPLX;
  692. }
  693. if ((new_bmcr != bmcr) || (force_link_down)) {
  694. /* Force a link down visible on the other side */
  695. if (bp->link_up) {
  696. bnx2_write_phy(bp, MII_ADVERTISE, adv &
  697. ~(ADVERTISE_1000XFULL |
  698. ADVERTISE_1000XHALF));
  699. bnx2_write_phy(bp, MII_BMCR, bmcr |
  700. BMCR_ANRESTART | BMCR_ANENABLE);
  701. bp->link_up = 0;
  702. bnx2_write_phy(bp, MII_BMCR, new_bmcr);
  703. }
  704. bnx2_write_phy(bp, MII_ADVERTISE, adv);
  705. bnx2_write_phy(bp, MII_BMCR, new_bmcr);
  706. }
  707. return 0;
  708. }
  709. if (bp->phy_flags & PHY_2_5G_CAPABLE_FLAG) {
  710. bnx2_read_phy(bp, BCM5708S_UP1, &up1);
  711. up1 |= BCM5708S_UP1_2G5;
  712. bnx2_write_phy(bp, BCM5708S_UP1, up1);
  713. }
  714. if (bp->advertising & ADVERTISED_1000baseT_Full)
  715. new_adv |= ADVERTISE_1000XFULL;
  716. new_adv |= bnx2_phy_get_pause_adv(bp);
  717. bnx2_read_phy(bp, MII_ADVERTISE, &adv);
  718. bnx2_read_phy(bp, MII_BMCR, &bmcr);
  719. bp->serdes_an_pending = 0;
  720. if ((adv != new_adv) || ((bmcr & BMCR_ANENABLE) == 0)) {
  721. /* Force a link down visible on the other side */
  722. if (bp->link_up) {
  723. int i;
  724. bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
  725. for (i = 0; i < 110; i++) {
  726. udelay(100);
  727. }
  728. }
  729. bnx2_write_phy(bp, MII_ADVERTISE, new_adv);
  730. bnx2_write_phy(bp, MII_BMCR, bmcr | BMCR_ANRESTART |
  731. BMCR_ANENABLE);
  732. #if 0
  733. if (CHIP_NUM(bp) == CHIP_NUM_5706) {
  734. /* Speed up link-up time when the link partner
  735. * does not autonegotiate which is very common
  736. * in blade servers. Some blade servers use
  737. * IPMI for kerboard input and it's important
  738. * to minimize link disruptions. Autoneg. involves
  739. * exchanging base pages plus 3 next pages and
  740. * normally completes in about 120 msec.
  741. */
  742. bp->current_interval = SERDES_AN_TIMEOUT;
  743. bp->serdes_an_pending = 1;
  744. mod_timer(&bp->timer, jiffies + bp->current_interval);
  745. }
  746. #endif
  747. }
  748. return 0;
  749. }
  750. #define ETHTOOL_ALL_FIBRE_SPEED \
  751. (ADVERTISED_1000baseT_Full)
  752. #define ETHTOOL_ALL_COPPER_SPEED \
  753. (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | \
  754. ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | \
  755. ADVERTISED_1000baseT_Full)
  756. #define PHY_ALL_10_100_SPEED (ADVERTISE_10HALF | ADVERTISE_10FULL | \
  757. ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_CSMA)
  758. #define PHY_ALL_1000_SPEED (ADVERTISE_1000HALF | ADVERTISE_1000FULL)
  759. static int
  760. bnx2_setup_copper_phy(struct bnx2 *bp)
  761. {
  762. u32 bmcr;
  763. u32 new_bmcr;
  764. bnx2_read_phy(bp, MII_BMCR, &bmcr);
  765. if (bp->autoneg & AUTONEG_SPEED) {
  766. u32 adv_reg, adv1000_reg;
  767. u32 new_adv_reg = 0;
  768. u32 new_adv1000_reg = 0;
  769. bnx2_read_phy(bp, MII_ADVERTISE, &adv_reg);
  770. adv_reg &= (PHY_ALL_10_100_SPEED | ADVERTISE_PAUSE_CAP |
  771. ADVERTISE_PAUSE_ASYM);
  772. bnx2_read_phy(bp, MII_CTRL1000, &adv1000_reg);
  773. adv1000_reg &= PHY_ALL_1000_SPEED;
  774. if (bp->advertising & ADVERTISED_10baseT_Half)
  775. new_adv_reg |= ADVERTISE_10HALF;
  776. if (bp->advertising & ADVERTISED_10baseT_Full)
  777. new_adv_reg |= ADVERTISE_10FULL;
  778. if (bp->advertising & ADVERTISED_100baseT_Half)
  779. new_adv_reg |= ADVERTISE_100HALF;
  780. if (bp->advertising & ADVERTISED_100baseT_Full)
  781. new_adv_reg |= ADVERTISE_100FULL;
  782. if (bp->advertising & ADVERTISED_1000baseT_Full)
  783. new_adv1000_reg |= ADVERTISE_1000FULL;
  784. new_adv_reg |= ADVERTISE_CSMA;
  785. new_adv_reg |= bnx2_phy_get_pause_adv(bp);
  786. if ((adv1000_reg != new_adv1000_reg) ||
  787. (adv_reg != new_adv_reg) ||
  788. ((bmcr & BMCR_ANENABLE) == 0)) {
  789. bnx2_write_phy(bp, MII_ADVERTISE, new_adv_reg);
  790. bnx2_write_phy(bp, MII_CTRL1000, new_adv1000_reg);
  791. bnx2_write_phy(bp, MII_BMCR, BMCR_ANRESTART |
  792. BMCR_ANENABLE);
  793. }
  794. else if (bp->link_up) {
  795. /* Flow ctrl may have changed from auto to forced */
  796. /* or vice-versa. */
  797. bnx2_resolve_flow_ctrl(bp);
  798. bnx2_set_mac_link(bp);
  799. }
  800. return 0;
  801. }
  802. new_bmcr = 0;
  803. if (bp->req_line_speed == SPEED_100) {
  804. new_bmcr |= BMCR_SPEED100;
  805. }
  806. if (bp->req_duplex == DUPLEX_FULL) {
  807. new_bmcr |= BMCR_FULLDPLX;
  808. }
  809. if (new_bmcr != bmcr) {
  810. u32 bmsr;
  811. int i = 0;
  812. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  813. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  814. if (bmsr & BMSR_LSTATUS) {
  815. /* Force link down */
  816. bnx2_write_phy(bp, MII_BMCR, BMCR_LOOPBACK);
  817. do {
  818. udelay(100);
  819. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  820. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  821. i++;
  822. } while ((bmsr & BMSR_LSTATUS) && (i < 620));
  823. }
  824. bnx2_write_phy(bp, MII_BMCR, new_bmcr);
  825. /* Normally, the new speed is setup after the link has
  826. * gone down and up again. In some cases, link will not go
  827. * down so we need to set up the new speed here.
  828. */
  829. if (bmsr & BMSR_LSTATUS) {
  830. bp->line_speed = bp->req_line_speed;
  831. bp->duplex = bp->req_duplex;
  832. bnx2_resolve_flow_ctrl(bp);
  833. bnx2_set_mac_link(bp);
  834. }
  835. }
  836. return 0;
  837. }
  838. static int
  839. bnx2_setup_phy(struct bnx2 *bp)
  840. {
  841. if (bp->loopback == MAC_LOOPBACK)
  842. return 0;
  843. if (bp->phy_flags & PHY_SERDES_FLAG) {
  844. return (bnx2_setup_serdes_phy(bp));
  845. }
  846. else {
  847. return (bnx2_setup_copper_phy(bp));
  848. }
  849. }
  850. static int
  851. bnx2_init_5708s_phy(struct bnx2 *bp)
  852. {
  853. u32 val;
  854. bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG3);
  855. bnx2_write_phy(bp, BCM5708S_DIG_3_0, BCM5708S_DIG_3_0_USE_IEEE);
  856. bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
  857. bnx2_read_phy(bp, BCM5708S_1000X_CTL1, &val);
  858. val |= BCM5708S_1000X_CTL1_FIBER_MODE | BCM5708S_1000X_CTL1_AUTODET_EN;
  859. bnx2_write_phy(bp, BCM5708S_1000X_CTL1, val);
  860. bnx2_read_phy(bp, BCM5708S_1000X_CTL2, &val);
  861. val |= BCM5708S_1000X_CTL2_PLLEL_DET_EN;
  862. bnx2_write_phy(bp, BCM5708S_1000X_CTL2, val);
  863. if (bp->phy_flags & PHY_2_5G_CAPABLE_FLAG) {
  864. bnx2_read_phy(bp, BCM5708S_UP1, &val);
  865. val |= BCM5708S_UP1_2G5;
  866. bnx2_write_phy(bp, BCM5708S_UP1, val);
  867. }
  868. if ((CHIP_ID(bp) == CHIP_ID_5708_A0) ||
  869. (CHIP_ID(bp) == CHIP_ID_5708_B0) ||
  870. (CHIP_ID(bp) == CHIP_ID_5708_B1)) {
  871. /* increase tx signal amplitude */
  872. bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
  873. BCM5708S_BLK_ADDR_TX_MISC);
  874. bnx2_read_phy(bp, BCM5708S_TX_ACTL1, &val);
  875. val &= ~BCM5708S_TX_ACTL1_DRIVER_VCM;
  876. bnx2_write_phy(bp, BCM5708S_TX_ACTL1, val);
  877. bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG);
  878. }
  879. val = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG) &
  880. BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK;
  881. if (val) {
  882. u32 is_backplane;
  883. is_backplane = REG_RD_IND(bp, bp->shmem_base +
  884. BNX2_SHARED_HW_CFG_CONFIG);
  885. if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) {
  886. bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
  887. BCM5708S_BLK_ADDR_TX_MISC);
  888. bnx2_write_phy(bp, BCM5708S_TX_ACTL3, val);
  889. bnx2_write_phy(bp, BCM5708S_BLK_ADDR,
  890. BCM5708S_BLK_ADDR_DIG);
  891. }
  892. }
  893. return 0;
  894. }
  895. static int
  896. bnx2_init_5706s_phy(struct bnx2 *bp)
  897. {
  898. u32 val;
  899. bp->phy_flags &= ~PHY_PARALLEL_DETECT_FLAG;
  900. if (CHIP_NUM(bp) == CHIP_NUM_5706) {
  901. REG_WR(bp, BNX2_MISC_UNUSED0, 0x300);
  902. }
  903. bnx2_write_phy(bp, 0x18, 0x7);
  904. bnx2_read_phy(bp, 0x18, &val);
  905. bnx2_write_phy(bp, 0x18, val & ~0x4007);
  906. bnx2_write_phy(bp, 0x1c, 0x6c00);
  907. bnx2_read_phy(bp, 0x1c, &val);
  908. bnx2_write_phy(bp, 0x1c, (val & 0x3fd) | 0xec00);
  909. return 0;
  910. }
  911. static int
  912. bnx2_init_copper_phy(struct bnx2 *bp)
  913. {
  914. u32 val;
  915. bp->phy_flags |= PHY_CRC_FIX_FLAG;
  916. if (bp->phy_flags & PHY_CRC_FIX_FLAG) {
  917. bnx2_write_phy(bp, 0x18, 0x0c00);
  918. bnx2_write_phy(bp, 0x17, 0x000a);
  919. bnx2_write_phy(bp, 0x15, 0x310b);
  920. bnx2_write_phy(bp, 0x17, 0x201f);
  921. bnx2_write_phy(bp, 0x15, 0x9506);
  922. bnx2_write_phy(bp, 0x17, 0x401f);
  923. bnx2_write_phy(bp, 0x15, 0x14e2);
  924. bnx2_write_phy(bp, 0x18, 0x0400);
  925. }
  926. bnx2_write_phy(bp, 0x18, 0x7);
  927. bnx2_read_phy(bp, 0x18, &val);
  928. bnx2_write_phy(bp, 0x18, val & ~0x4007);
  929. bnx2_read_phy(bp, 0x10, &val);
  930. bnx2_write_phy(bp, 0x10, val & ~0x1);
  931. /* ethernet@wirespeed */
  932. bnx2_write_phy(bp, 0x18, 0x7007);
  933. bnx2_read_phy(bp, 0x18, &val);
  934. bnx2_write_phy(bp, 0x18, val | (1 << 15) | (1 << 4));
  935. return 0;
  936. }
  937. static int
  938. bnx2_init_phy(struct bnx2 *bp)
  939. {
  940. u32 val;
  941. int rc = 0;
  942. bp->phy_flags &= ~PHY_INT_MODE_MASK_FLAG;
  943. bp->phy_flags |= PHY_INT_MODE_LINK_READY_FLAG;
  944. REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
  945. bnx2_reset_phy(bp);
  946. bnx2_read_phy(bp, MII_PHYSID1, &val);
  947. bp->phy_id = val << 16;
  948. bnx2_read_phy(bp, MII_PHYSID2, &val);
  949. bp->phy_id |= val & 0xffff;
  950. if (bp->phy_flags & PHY_SERDES_FLAG) {
  951. if (CHIP_NUM(bp) == CHIP_NUM_5706)
  952. rc = bnx2_init_5706s_phy(bp);
  953. else if (CHIP_NUM(bp) == CHIP_NUM_5708)
  954. rc = bnx2_init_5708s_phy(bp);
  955. }
  956. else {
  957. rc = bnx2_init_copper_phy(bp);
  958. }
  959. bnx2_setup_phy(bp);
  960. return rc;
  961. }
  962. static int
  963. bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int silent)
  964. {
  965. int i;
  966. u32 val;
  967. bp->fw_wr_seq++;
  968. msg_data |= bp->fw_wr_seq;
  969. REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data);
  970. /* wait for an acknowledgement. */
  971. for (i = 0; i < (FW_ACK_TIME_OUT_MS / 50); i++) {
  972. mdelay(50);
  973. val = REG_RD_IND(bp, bp->shmem_base + BNX2_FW_MB);
  974. if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ))
  975. break;
  976. }
  977. if ((msg_data & BNX2_DRV_MSG_DATA) == BNX2_DRV_MSG_DATA_WAIT0)
  978. return 0;
  979. /* If we timed out, inform the firmware that this is the case. */
  980. if ((val & BNX2_FW_MSG_ACK) != (msg_data & BNX2_DRV_MSG_SEQ)) {
  981. if (!silent)
  982. printf("fw sync timeout, reset code = %x\n", (unsigned int) msg_data);
  983. msg_data &= ~BNX2_DRV_MSG_CODE;
  984. msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT;
  985. REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data);
  986. return -EBUSY;
  987. }
  988. if ((val & BNX2_FW_MSG_STATUS_MASK) != BNX2_FW_MSG_STATUS_OK)
  989. return -EIO;
  990. return 0;
  991. }
  992. static void
  993. bnx2_init_context(struct bnx2 *bp)
  994. {
  995. u32 vcid;
  996. vcid = 96;
  997. while (vcid) {
  998. u32 vcid_addr, pcid_addr, offset;
  999. vcid--;
  1000. if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
  1001. u32 new_vcid;
  1002. vcid_addr = GET_PCID_ADDR(vcid);
  1003. if (vcid & 0x8) {
  1004. new_vcid = 0x60 + (vcid & 0xf0) + (vcid & 0x7);
  1005. }
  1006. else {
  1007. new_vcid = vcid;
  1008. }
  1009. pcid_addr = GET_PCID_ADDR(new_vcid);
  1010. }
  1011. else {
  1012. vcid_addr = GET_CID_ADDR(vcid);
  1013. pcid_addr = vcid_addr;
  1014. }
  1015. REG_WR(bp, BNX2_CTX_VIRT_ADDR, 0x00);
  1016. REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
  1017. /* Zero out the context. */
  1018. for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) {
  1019. CTX_WR(bp, 0x00, offset, 0);
  1020. }
  1021. REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr);
  1022. REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr);
  1023. }
  1024. }
  1025. static int
  1026. bnx2_alloc_bad_rbuf(struct bnx2 *bp)
  1027. {
  1028. u16 good_mbuf[512];
  1029. u32 good_mbuf_cnt;
  1030. u32 val;
  1031. REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
  1032. BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE);
  1033. good_mbuf_cnt = 0;
  1034. /* Allocate a bunch of mbufs and save the good ones in an array. */
  1035. val = REG_RD_IND(bp, BNX2_RBUF_STATUS1);
  1036. while (val & BNX2_RBUF_STATUS1_FREE_COUNT) {
  1037. REG_WR_IND(bp, BNX2_RBUF_COMMAND, BNX2_RBUF_COMMAND_ALLOC_REQ);
  1038. val = REG_RD_IND(bp, BNX2_RBUF_FW_BUF_ALLOC);
  1039. val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE;
  1040. /* The addresses with Bit 9 set are bad memory blocks. */
  1041. if (!(val & (1 << 9))) {
  1042. good_mbuf[good_mbuf_cnt] = (u16) val;
  1043. good_mbuf_cnt++;
  1044. }
  1045. val = REG_RD_IND(bp, BNX2_RBUF_STATUS1);
  1046. }
  1047. /* Free the good ones back to the mbuf pool thus discarding
  1048. * all the bad ones. */
  1049. while (good_mbuf_cnt) {
  1050. good_mbuf_cnt--;
  1051. val = good_mbuf[good_mbuf_cnt];
  1052. val = (val << 9) | val | 1;
  1053. REG_WR_IND(bp, BNX2_RBUF_FW_BUF_FREE, val);
  1054. }
  1055. return 0;
  1056. }
  1057. static void
  1058. bnx2_set_mac_addr(struct bnx2 *bp)
  1059. {
  1060. u32 val;
  1061. u8 *mac_addr = bp->nic->node_addr;
  1062. val = (mac_addr[0] << 8) | mac_addr[1];
  1063. REG_WR(bp, BNX2_EMAC_MAC_MATCH0, val);
  1064. val = (mac_addr[2] << 24) | (mac_addr[3] << 16) |
  1065. (mac_addr[4] << 8) | mac_addr[5];
  1066. REG_WR(bp, BNX2_EMAC_MAC_MATCH1, val);
  1067. }
  1068. static void
  1069. bnx2_set_rx_mode(struct nic *nic __unused)
  1070. {
  1071. struct bnx2 *bp = &bnx2;
  1072. u32 rx_mode, sort_mode;
  1073. int i;
  1074. rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
  1075. BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG);
  1076. sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN;
  1077. if (!(bp->flags & ASF_ENABLE_FLAG)) {
  1078. rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
  1079. }
  1080. /* Accept all multicasts */
  1081. for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) {
  1082. REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4),
  1083. 0xffffffff);
  1084. }
  1085. sort_mode |= BNX2_RPM_SORT_USER0_MC_EN;
  1086. if (rx_mode != bp->rx_mode) {
  1087. bp->rx_mode = rx_mode;
  1088. REG_WR(bp, BNX2_EMAC_RX_MODE, rx_mode);
  1089. }
  1090. REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0);
  1091. REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode);
  1092. REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA);
  1093. }
  1094. static void
  1095. load_rv2p_fw(struct bnx2 *bp, u32 *rv2p_code, u32 rv2p_code_len, u32 rv2p_proc)
  1096. {
  1097. unsigned int i;
  1098. u32 val;
  1099. for (i = 0; i < rv2p_code_len; i += 8) {
  1100. REG_WR(bp, BNX2_RV2P_INSTR_HIGH, *rv2p_code);
  1101. rv2p_code++;
  1102. REG_WR(bp, BNX2_RV2P_INSTR_LOW, *rv2p_code);
  1103. rv2p_code++;
  1104. if (rv2p_proc == RV2P_PROC1) {
  1105. val = (i / 8) | BNX2_RV2P_PROC1_ADDR_CMD_RDWR;
  1106. REG_WR(bp, BNX2_RV2P_PROC1_ADDR_CMD, val);
  1107. }
  1108. else {
  1109. val = (i / 8) | BNX2_RV2P_PROC2_ADDR_CMD_RDWR;
  1110. REG_WR(bp, BNX2_RV2P_PROC2_ADDR_CMD, val);
  1111. }
  1112. }
  1113. /* Reset the processor, un-stall is done later. */
  1114. if (rv2p_proc == RV2P_PROC1) {
  1115. REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET);
  1116. }
  1117. else {
  1118. REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET);
  1119. }
  1120. }
  1121. static void
  1122. load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw)
  1123. {
  1124. u32 offset;
  1125. u32 val;
  1126. /* Halt the CPU. */
  1127. val = REG_RD_IND(bp, cpu_reg->mode);
  1128. val |= cpu_reg->mode_value_halt;
  1129. REG_WR_IND(bp, cpu_reg->mode, val);
  1130. REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear);
  1131. /* Load the Text area. */
  1132. offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base);
  1133. if (fw->text) {
  1134. unsigned int j;
  1135. for (j = 0; j < (fw->text_len / 4); j++, offset += 4) {
  1136. REG_WR_IND(bp, offset, fw->text[j]);
  1137. }
  1138. }
  1139. /* Load the Data area. */
  1140. offset = cpu_reg->spad_base + (fw->data_addr - cpu_reg->mips_view_base);
  1141. if (fw->data) {
  1142. unsigned int j;
  1143. for (j = 0; j < (fw->data_len / 4); j++, offset += 4) {
  1144. REG_WR_IND(bp, offset, fw->data[j]);
  1145. }
  1146. }
  1147. /* Load the SBSS area. */
  1148. offset = cpu_reg->spad_base + (fw->sbss_addr - cpu_reg->mips_view_base);
  1149. if (fw->sbss) {
  1150. unsigned int j;
  1151. for (j = 0; j < (fw->sbss_len / 4); j++, offset += 4) {
  1152. REG_WR_IND(bp, offset, fw->sbss[j]);
  1153. }
  1154. }
  1155. /* Load the BSS area. */
  1156. offset = cpu_reg->spad_base + (fw->bss_addr - cpu_reg->mips_view_base);
  1157. if (fw->bss) {
  1158. unsigned int j;
  1159. for (j = 0; j < (fw->bss_len/4); j++, offset += 4) {
  1160. REG_WR_IND(bp, offset, fw->bss[j]);
  1161. }
  1162. }
  1163. /* Load the Read-Only area. */
  1164. offset = cpu_reg->spad_base +
  1165. (fw->rodata_addr - cpu_reg->mips_view_base);
  1166. if (fw->rodata) {
  1167. unsigned int j;
  1168. for (j = 0; j < (fw->rodata_len / 4); j++, offset += 4) {
  1169. REG_WR_IND(bp, offset, fw->rodata[j]);
  1170. }
  1171. }
  1172. /* Clear the pre-fetch instruction. */
  1173. REG_WR_IND(bp, cpu_reg->inst, 0);
  1174. REG_WR_IND(bp, cpu_reg->pc, fw->start_addr);
  1175. /* Start the CPU. */
  1176. val = REG_RD_IND(bp, cpu_reg->mode);
  1177. val &= ~cpu_reg->mode_value_halt;
  1178. REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear);
  1179. REG_WR_IND(bp, cpu_reg->mode, val);
  1180. }
  1181. static void
  1182. bnx2_init_cpus(struct bnx2 *bp)
  1183. {
  1184. struct cpu_reg cpu_reg;
  1185. struct fw_info fw;
  1186. /* Unfortunately, it looks like we need to load the firmware
  1187. * before the card will work properly. That means this driver
  1188. * will be huge by Etherboot standards (approx. 50K compressed).
  1189. */
  1190. /* Initialize the RV2P processor. */
  1191. load_rv2p_fw(bp, bnx2_rv2p_proc1, sizeof(bnx2_rv2p_proc1), RV2P_PROC1);
  1192. load_rv2p_fw(bp, bnx2_rv2p_proc2, sizeof(bnx2_rv2p_proc2), RV2P_PROC2);
  1193. /* Initialize the RX Processor. */
  1194. cpu_reg.mode = BNX2_RXP_CPU_MODE;
  1195. cpu_reg.mode_value_halt = BNX2_RXP_CPU_MODE_SOFT_HALT;
  1196. cpu_reg.mode_value_sstep = BNX2_RXP_CPU_MODE_STEP_ENA;
  1197. cpu_reg.state = BNX2_RXP_CPU_STATE;
  1198. cpu_reg.state_value_clear = 0xffffff;
  1199. cpu_reg.gpr0 = BNX2_RXP_CPU_REG_FILE;
  1200. cpu_reg.evmask = BNX2_RXP_CPU_EVENT_MASK;
  1201. cpu_reg.pc = BNX2_RXP_CPU_PROGRAM_COUNTER;
  1202. cpu_reg.inst = BNX2_RXP_CPU_INSTRUCTION;
  1203. cpu_reg.bp = BNX2_RXP_CPU_HW_BREAKPOINT;
  1204. cpu_reg.spad_base = BNX2_RXP_SCRATCH;
  1205. cpu_reg.mips_view_base = 0x8000000;
  1206. fw.ver_major = bnx2_RXP_b06FwReleaseMajor;
  1207. fw.ver_minor = bnx2_RXP_b06FwReleaseMinor;
  1208. fw.ver_fix = bnx2_RXP_b06FwReleaseFix;
  1209. fw.start_addr = bnx2_RXP_b06FwStartAddr;
  1210. fw.text_addr = bnx2_RXP_b06FwTextAddr;
  1211. fw.text_len = bnx2_RXP_b06FwTextLen;
  1212. fw.text_index = 0;
  1213. fw.text = bnx2_RXP_b06FwText;
  1214. fw.data_addr = bnx2_RXP_b06FwDataAddr;
  1215. fw.data_len = bnx2_RXP_b06FwDataLen;
  1216. fw.data_index = 0;
  1217. fw.data = bnx2_RXP_b06FwData;
  1218. fw.sbss_addr = bnx2_RXP_b06FwSbssAddr;
  1219. fw.sbss_len = bnx2_RXP_b06FwSbssLen;
  1220. fw.sbss_index = 0;
  1221. fw.sbss = bnx2_RXP_b06FwSbss;
  1222. fw.bss_addr = bnx2_RXP_b06FwBssAddr;
  1223. fw.bss_len = bnx2_RXP_b06FwBssLen;
  1224. fw.bss_index = 0;
  1225. fw.bss = bnx2_RXP_b06FwBss;
  1226. fw.rodata_addr = bnx2_RXP_b06FwRodataAddr;
  1227. fw.rodata_len = bnx2_RXP_b06FwRodataLen;
  1228. fw.rodata_index = 0;
  1229. fw.rodata = bnx2_RXP_b06FwRodata;
  1230. load_cpu_fw(bp, &cpu_reg, &fw);
  1231. /* Initialize the TX Processor. */
  1232. cpu_reg.mode = BNX2_TXP_CPU_MODE;
  1233. cpu_reg.mode_value_halt = BNX2_TXP_CPU_MODE_SOFT_HALT;
  1234. cpu_reg.mode_value_sstep = BNX2_TXP_CPU_MODE_STEP_ENA;
  1235. cpu_reg.state = BNX2_TXP_CPU_STATE;
  1236. cpu_reg.state_value_clear = 0xffffff;
  1237. cpu_reg.gpr0 = BNX2_TXP_CPU_REG_FILE;
  1238. cpu_reg.evmask = BNX2_TXP_CPU_EVENT_MASK;
  1239. cpu_reg.pc = BNX2_TXP_CPU_PROGRAM_COUNTER;
  1240. cpu_reg.inst = BNX2_TXP_CPU_INSTRUCTION;
  1241. cpu_reg.bp = BNX2_TXP_CPU_HW_BREAKPOINT;
  1242. cpu_reg.spad_base = BNX2_TXP_SCRATCH;
  1243. cpu_reg.mips_view_base = 0x8000000;
  1244. fw.ver_major = bnx2_TXP_b06FwReleaseMajor;
  1245. fw.ver_minor = bnx2_TXP_b06FwReleaseMinor;
  1246. fw.ver_fix = bnx2_TXP_b06FwReleaseFix;
  1247. fw.start_addr = bnx2_TXP_b06FwStartAddr;
  1248. fw.text_addr = bnx2_TXP_b06FwTextAddr;
  1249. fw.text_len = bnx2_TXP_b06FwTextLen;
  1250. fw.text_index = 0;
  1251. fw.text = bnx2_TXP_b06FwText;
  1252. fw.data_addr = bnx2_TXP_b06FwDataAddr;
  1253. fw.data_len = bnx2_TXP_b06FwDataLen;
  1254. fw.data_index = 0;
  1255. fw.data = bnx2_TXP_b06FwData;
  1256. fw.sbss_addr = bnx2_TXP_b06FwSbssAddr;
  1257. fw.sbss_len = bnx2_TXP_b06FwSbssLen;
  1258. fw.sbss_index = 0;
  1259. fw.sbss = bnx2_TXP_b06FwSbss;
  1260. fw.bss_addr = bnx2_TXP_b06FwBssAddr;
  1261. fw.bss_len = bnx2_TXP_b06FwBssLen;
  1262. fw.bss_index = 0;
  1263. fw.bss = bnx2_TXP_b06FwBss;
  1264. fw.rodata_addr = bnx2_TXP_b06FwRodataAddr;
  1265. fw.rodata_len = bnx2_TXP_b06FwRodataLen;
  1266. fw.rodata_index = 0;
  1267. fw.rodata = bnx2_TXP_b06FwRodata;
  1268. load_cpu_fw(bp, &cpu_reg, &fw);
  1269. /* Initialize the TX Patch-up Processor. */
  1270. cpu_reg.mode = BNX2_TPAT_CPU_MODE;
  1271. cpu_reg.mode_value_halt = BNX2_TPAT_CPU_MODE_SOFT_HALT;
  1272. cpu_reg.mode_value_sstep = BNX2_TPAT_CPU_MODE_STEP_ENA;
  1273. cpu_reg.state = BNX2_TPAT_CPU_STATE;
  1274. cpu_reg.state_value_clear = 0xffffff;
  1275. cpu_reg.gpr0 = BNX2_TPAT_CPU_REG_FILE;
  1276. cpu_reg.evmask = BNX2_TPAT_CPU_EVENT_MASK;
  1277. cpu_reg.pc = BNX2_TPAT_CPU_PROGRAM_COUNTER;
  1278. cpu_reg.inst = BNX2_TPAT_CPU_INSTRUCTION;
  1279. cpu_reg.bp = BNX2_TPAT_CPU_HW_BREAKPOINT;
  1280. cpu_reg.spad_base = BNX2_TPAT_SCRATCH;
  1281. cpu_reg.mips_view_base = 0x8000000;
  1282. fw.ver_major = bnx2_TPAT_b06FwReleaseMajor;
  1283. fw.ver_minor = bnx2_TPAT_b06FwReleaseMinor;
  1284. fw.ver_fix = bnx2_TPAT_b06FwReleaseFix;
  1285. fw.start_addr = bnx2_TPAT_b06FwStartAddr;
  1286. fw.text_addr = bnx2_TPAT_b06FwTextAddr;
  1287. fw.text_len = bnx2_TPAT_b06FwTextLen;
  1288. fw.text_index = 0;
  1289. fw.text = bnx2_TPAT_b06FwText;
  1290. fw.data_addr = bnx2_TPAT_b06FwDataAddr;
  1291. fw.data_len = bnx2_TPAT_b06FwDataLen;
  1292. fw.data_index = 0;
  1293. fw.data = bnx2_TPAT_b06FwData;
  1294. fw.sbss_addr = bnx2_TPAT_b06FwSbssAddr;
  1295. fw.sbss_len = bnx2_TPAT_b06FwSbssLen;
  1296. fw.sbss_index = 0;
  1297. fw.sbss = bnx2_TPAT_b06FwSbss;
  1298. fw.bss_addr = bnx2_TPAT_b06FwBssAddr;
  1299. fw.bss_len = bnx2_TPAT_b06FwBssLen;
  1300. fw.bss_index = 0;
  1301. fw.bss = bnx2_TPAT_b06FwBss;
  1302. fw.rodata_addr = bnx2_TPAT_b06FwRodataAddr;
  1303. fw.rodata_len = bnx2_TPAT_b06FwRodataLen;
  1304. fw.rodata_index = 0;
  1305. fw.rodata = bnx2_TPAT_b06FwRodata;
  1306. load_cpu_fw(bp, &cpu_reg, &fw);
  1307. /* Initialize the Completion Processor. */
  1308. cpu_reg.mode = BNX2_COM_CPU_MODE;
  1309. cpu_reg.mode_value_halt = BNX2_COM_CPU_MODE_SOFT_HALT;
  1310. cpu_reg.mode_value_sstep = BNX2_COM_CPU_MODE_STEP_ENA;
  1311. cpu_reg.state = BNX2_COM_CPU_STATE;
  1312. cpu_reg.state_value_clear = 0xffffff;
  1313. cpu_reg.gpr0 = BNX2_COM_CPU_REG_FILE;
  1314. cpu_reg.evmask = BNX2_COM_CPU_EVENT_MASK;
  1315. cpu_reg.pc = BNX2_COM_CPU_PROGRAM_COUNTER;
  1316. cpu_reg.inst = BNX2_COM_CPU_INSTRUCTION;
  1317. cpu_reg.bp = BNX2_COM_CPU_HW_BREAKPOINT;
  1318. cpu_reg.spad_base = BNX2_COM_SCRATCH;
  1319. cpu_reg.mips_view_base = 0x8000000;
  1320. fw.ver_major = bnx2_COM_b06FwReleaseMajor;
  1321. fw.ver_minor = bnx2_COM_b06FwReleaseMinor;
  1322. fw.ver_fix = bnx2_COM_b06FwReleaseFix;
  1323. fw.start_addr = bnx2_COM_b06FwStartAddr;
  1324. fw.text_addr = bnx2_COM_b06FwTextAddr;
  1325. fw.text_len = bnx2_COM_b06FwTextLen;
  1326. fw.text_index = 0;
  1327. fw.text = bnx2_COM_b06FwText;
  1328. fw.data_addr = bnx2_COM_b06FwDataAddr;
  1329. fw.data_len = bnx2_COM_b06FwDataLen;
  1330. fw.data_index = 0;
  1331. fw.data = bnx2_COM_b06FwData;
  1332. fw.sbss_addr = bnx2_COM_b06FwSbssAddr;
  1333. fw.sbss_len = bnx2_COM_b06FwSbssLen;
  1334. fw.sbss_index = 0;
  1335. fw.sbss = bnx2_COM_b06FwSbss;
  1336. fw.bss_addr = bnx2_COM_b06FwBssAddr;
  1337. fw.bss_len = bnx2_COM_b06FwBssLen;
  1338. fw.bss_index = 0;
  1339. fw.bss = bnx2_COM_b06FwBss;
  1340. fw.rodata_addr = bnx2_COM_b06FwRodataAddr;
  1341. fw.rodata_len = bnx2_COM_b06FwRodataLen;
  1342. fw.rodata_index = 0;
  1343. fw.rodata = bnx2_COM_b06FwRodata;
  1344. load_cpu_fw(bp, &cpu_reg, &fw);
  1345. }
  1346. static int
  1347. bnx2_set_power_state_0(struct bnx2 *bp)
  1348. {
  1349. u16 pmcsr;
  1350. u32 val;
  1351. pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmcsr);
  1352. pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL,
  1353. (pmcsr & ~PCI_PM_CTRL_STATE_MASK) |
  1354. PCI_PM_CTRL_PME_STATUS);
  1355. if (pmcsr & PCI_PM_CTRL_STATE_MASK)
  1356. /* delay required during transition out of D3hot */
  1357. mdelay(20);
  1358. val = REG_RD(bp, BNX2_EMAC_MODE);
  1359. val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD;
  1360. val &= ~BNX2_EMAC_MODE_MPKT;
  1361. REG_WR(bp, BNX2_EMAC_MODE, val);
  1362. val = REG_RD(bp, BNX2_RPM_CONFIG);
  1363. val &= ~BNX2_RPM_CONFIG_ACPI_ENA;
  1364. REG_WR(bp, BNX2_RPM_CONFIG, val);
  1365. return 0;
  1366. }
  1367. static void
  1368. bnx2_enable_nvram_access(struct bnx2 *bp)
  1369. {
  1370. u32 val;
  1371. val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
  1372. /* Enable both bits, even on read. */
  1373. REG_WR(bp, BNX2_NVM_ACCESS_ENABLE,
  1374. val | BNX2_NVM_ACCESS_ENABLE_EN | BNX2_NVM_ACCESS_ENABLE_WR_EN);
  1375. }
  1376. static void
  1377. bnx2_disable_nvram_access(struct bnx2 *bp)
  1378. {
  1379. u32 val;
  1380. val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE);
  1381. /* Disable both bits, even after read. */
  1382. REG_WR(bp, BNX2_NVM_ACCESS_ENABLE,
  1383. val & ~(BNX2_NVM_ACCESS_ENABLE_EN |
  1384. BNX2_NVM_ACCESS_ENABLE_WR_EN));
  1385. }
  1386. static int
  1387. bnx2_init_nvram(struct bnx2 *bp)
  1388. {
  1389. u32 val;
  1390. int j, entry_count, rc;
  1391. struct flash_spec *flash;
  1392. /* Determine the selected interface. */
  1393. val = REG_RD(bp, BNX2_NVM_CFG1);
  1394. entry_count = sizeof(flash_table) / sizeof(struct flash_spec);
  1395. rc = 0;
  1396. if (val & 0x40000000) {
  1397. /* Flash interface has been reconfigured */
  1398. for (j = 0, flash = &flash_table[0]; j < entry_count;
  1399. j++, flash++) {
  1400. if ((val & FLASH_BACKUP_STRAP_MASK) ==
  1401. (flash->config1 & FLASH_BACKUP_STRAP_MASK)) {
  1402. bp->flash_info = flash;
  1403. break;
  1404. }
  1405. }
  1406. }
  1407. else {
  1408. u32 mask;
  1409. /* Not yet been reconfigured */
  1410. if (val & (1 << 23))
  1411. mask = FLASH_BACKUP_STRAP_MASK;
  1412. else
  1413. mask = FLASH_STRAP_MASK;
  1414. for (j = 0, flash = &flash_table[0]; j < entry_count;
  1415. j++, flash++) {
  1416. if ((val & mask) == (flash->strapping & mask)) {
  1417. bp->flash_info = flash;
  1418. /* Enable access to flash interface */
  1419. bnx2_enable_nvram_access(bp);
  1420. /* Reconfigure the flash interface */
  1421. REG_WR(bp, BNX2_NVM_CFG1, flash->config1);
  1422. REG_WR(bp, BNX2_NVM_CFG2, flash->config2);
  1423. REG_WR(bp, BNX2_NVM_CFG3, flash->config3);
  1424. REG_WR(bp, BNX2_NVM_WRITE1, flash->write1);
  1425. /* Disable access to flash interface */
  1426. bnx2_disable_nvram_access(bp);
  1427. break;
  1428. }
  1429. }
  1430. } /* if (val & 0x40000000) */
  1431. if (j == entry_count) {
  1432. bp->flash_info = NULL;
  1433. printf("Unknown flash/EEPROM type.\n");
  1434. return -ENODEV;
  1435. }
  1436. val = REG_RD_IND(bp, bp->shmem_base + BNX2_SHARED_HW_CFG_CONFIG2);
  1437. val &= BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK;
  1438. if (val) {
  1439. bp->flash_size = val;
  1440. }
  1441. else {
  1442. bp->flash_size = bp->flash_info->total_size;
  1443. }
  1444. return rc;
  1445. }
  1446. static int
  1447. bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
  1448. {
  1449. u32 val;
  1450. int i, rc = 0;
  1451. /* Wait for the current PCI transaction to complete before
  1452. * issuing a reset. */
  1453. REG_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
  1454. BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE |
  1455. BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE |
  1456. BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE |
  1457. BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE);
  1458. val = REG_RD(bp, BNX2_MISC_ENABLE_CLR_BITS);
  1459. udelay(5);
  1460. /* Wait for the firmware to tell us it is ok to issue a reset. */
  1461. bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1);
  1462. /* Deposit a driver reset signature so the firmware knows that
  1463. * this is a soft reset. */
  1464. REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_RESET_SIGNATURE,
  1465. BNX2_DRV_RESET_SIGNATURE_MAGIC);
  1466. /* Do a dummy read to force the chip to complete all current transaction
  1467. * before we issue a reset. */
  1468. val = REG_RD(bp, BNX2_MISC_ID);
  1469. val = BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
  1470. BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
  1471. BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP;
  1472. /* Chip reset. */
  1473. REG_WR(bp, BNX2_PCICFG_MISC_CONFIG, val);
  1474. if ((CHIP_ID(bp) == CHIP_ID_5706_A0) ||
  1475. (CHIP_ID(bp) == CHIP_ID_5706_A1))
  1476. mdelay(15);
  1477. /* Reset takes approximate 30 usec */
  1478. for (i = 0; i < 10; i++) {
  1479. val = REG_RD(bp, BNX2_PCICFG_MISC_CONFIG);
  1480. if ((val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
  1481. BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0) {
  1482. break;
  1483. }
  1484. udelay(10);
  1485. }
  1486. if (val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ |
  1487. BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) {
  1488. printf("Chip reset did not complete\n");
  1489. return -EBUSY;
  1490. }
  1491. /* Make sure byte swapping is properly configured. */
  1492. val = REG_RD(bp, BNX2_PCI_SWAP_DIAG0);
  1493. if (val != 0x01020304) {
  1494. printf("Chip not in correct endian mode\n");
  1495. return -ENODEV;
  1496. }
  1497. /* Wait for the firmware to finish its initialization. */
  1498. rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT1 | reset_code, 0);
  1499. if (rc) {
  1500. return rc;
  1501. }
  1502. if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
  1503. /* Adjust the voltage regular to two steps lower. The default
  1504. * of this register is 0x0000000e. */
  1505. REG_WR(bp, BNX2_MISC_VREG_CONTROL, 0x000000fa);
  1506. /* Remove bad rbuf memory from the free pool. */
  1507. rc = bnx2_alloc_bad_rbuf(bp);
  1508. }
  1509. return rc;
  1510. }
  1511. static void
  1512. bnx2_disable(struct nic *nic __unused)
  1513. {
  1514. struct bnx2* bp = &bnx2;
  1515. if (bp->regview) {
  1516. bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_UNLOAD);
  1517. iounmap(bp->regview);
  1518. }
  1519. }
  1520. static int
  1521. bnx2_init_chip(struct bnx2 *bp)
  1522. {
  1523. u32 val;
  1524. int rc;
  1525. /* Make sure the interrupt is not active. */
  1526. REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_MASK_INT);
  1527. val = BNX2_DMA_CONFIG_DATA_BYTE_SWAP |
  1528. BNX2_DMA_CONFIG_DATA_WORD_SWAP |
  1529. #if __BYTE_ORDER == __BIG_ENDIAN
  1530. BNX2_DMA_CONFIG_CNTL_BYTE_SWAP |
  1531. #endif
  1532. BNX2_DMA_CONFIG_CNTL_WORD_SWAP |
  1533. DMA_READ_CHANS << 12 |
  1534. DMA_WRITE_CHANS << 16;
  1535. val |= (0x2 << 20) | (1 << 11);
  1536. if ((bp->flags & PCIX_FLAG) && (bp->bus_speed_mhz == 133))
  1537. val |= (1 << 23);
  1538. if ((CHIP_NUM(bp) == CHIP_NUM_5706) &&
  1539. (CHIP_ID(bp) != CHIP_ID_5706_A0) && !(bp->flags & PCIX_FLAG))
  1540. val |= BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA;
  1541. REG_WR(bp, BNX2_DMA_CONFIG, val);
  1542. if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
  1543. val = REG_RD(bp, BNX2_TDMA_CONFIG);
  1544. val |= BNX2_TDMA_CONFIG_ONE_DMA;
  1545. REG_WR(bp, BNX2_TDMA_CONFIG, val);
  1546. }
  1547. if (bp->flags & PCIX_FLAG) {
  1548. u16 val16;
  1549. pci_read_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
  1550. &val16);
  1551. pci_write_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD,
  1552. val16 & ~PCI_X_CMD_ERO);
  1553. }
  1554. REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS,
  1555. BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE |
  1556. BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE |
  1557. BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE);
  1558. /* Initialize context mapping and zero out the quick contexts. The
  1559. * context block must have already been enabled. */
  1560. bnx2_init_context(bp);
  1561. bnx2_init_nvram(bp);
  1562. bnx2_init_cpus(bp);
  1563. bnx2_set_mac_addr(bp);
  1564. val = REG_RD(bp, BNX2_MQ_CONFIG);
  1565. val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE;
  1566. val |= BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256;
  1567. REG_WR(bp, BNX2_MQ_CONFIG, val);
  1568. val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE);
  1569. REG_WR(bp, BNX2_MQ_KNL_BYP_WIND_START, val);
  1570. REG_WR(bp, BNX2_MQ_KNL_WIND_END, val);
  1571. val = (BCM_PAGE_BITS - 8) << 24;
  1572. REG_WR(bp, BNX2_RV2P_CONFIG, val);
  1573. /* Configure page size. */
  1574. val = REG_RD(bp, BNX2_TBDR_CONFIG);
  1575. val &= ~BNX2_TBDR_CONFIG_PAGE_SIZE;
  1576. val |= (BCM_PAGE_BITS - 8) << 24 | 0x40;
  1577. REG_WR(bp, BNX2_TBDR_CONFIG, val);
  1578. val = bp->mac_addr[0] +
  1579. (bp->mac_addr[1] << 8) +
  1580. (bp->mac_addr[2] << 16) +
  1581. bp->mac_addr[3] +
  1582. (bp->mac_addr[4] << 8) +
  1583. (bp->mac_addr[5] << 16);
  1584. REG_WR(bp, BNX2_EMAC_BACKOFF_SEED, val);
  1585. /* Program the MTU. Also include 4 bytes for CRC32. */
  1586. val = ETH_MAX_MTU + ETH_HLEN + 4;
  1587. if (val > (MAX_ETHERNET_PACKET_SIZE + 4))
  1588. val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA;
  1589. REG_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val);
  1590. bp->last_status_idx = 0;
  1591. bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE;
  1592. /* Set up how to generate a link change interrupt. */
  1593. REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK);
  1594. REG_WR(bp, BNX2_HC_STATUS_ADDR_L,
  1595. (u64) bp->status_blk_mapping & 0xffffffff);
  1596. REG_WR(bp, BNX2_HC_STATUS_ADDR_H, (u64) bp->status_blk_mapping >> 32);
  1597. REG_WR(bp, BNX2_HC_STATISTICS_ADDR_L,
  1598. (u64) bp->stats_blk_mapping & 0xffffffff);
  1599. REG_WR(bp, BNX2_HC_STATISTICS_ADDR_H,
  1600. (u64) bp->stats_blk_mapping >> 32);
  1601. REG_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP,
  1602. (bp->tx_quick_cons_trip_int << 16) | bp->tx_quick_cons_trip);
  1603. REG_WR(bp, BNX2_HC_RX_QUICK_CONS_TRIP,
  1604. (bp->rx_quick_cons_trip_int << 16) | bp->rx_quick_cons_trip);
  1605. REG_WR(bp, BNX2_HC_COMP_PROD_TRIP,
  1606. (bp->comp_prod_trip_int << 16) | bp->comp_prod_trip);
  1607. REG_WR(bp, BNX2_HC_TX_TICKS, (bp->tx_ticks_int << 16) | bp->tx_ticks);
  1608. REG_WR(bp, BNX2_HC_RX_TICKS, (bp->rx_ticks_int << 16) | bp->rx_ticks);
  1609. REG_WR(bp, BNX2_HC_COM_TICKS,
  1610. (bp->com_ticks_int << 16) | bp->com_ticks);
  1611. REG_WR(bp, BNX2_HC_CMD_TICKS,
  1612. (bp->cmd_ticks_int << 16) | bp->cmd_ticks);
  1613. REG_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks & 0xffff00);
  1614. REG_WR(bp, BNX2_HC_STAT_COLLECT_TICKS, 0xbb8); /* 3ms */
  1615. if (CHIP_ID(bp) == CHIP_ID_5706_A1)
  1616. REG_WR(bp, BNX2_HC_CONFIG, BNX2_HC_CONFIG_COLLECT_STATS);
  1617. else {
  1618. REG_WR(bp, BNX2_HC_CONFIG, BNX2_HC_CONFIG_RX_TMR_MODE |
  1619. BNX2_HC_CONFIG_TX_TMR_MODE |
  1620. BNX2_HC_CONFIG_COLLECT_STATS);
  1621. }
  1622. /* Clear internal stats counters. */
  1623. REG_WR(bp, BNX2_HC_COMMAND, BNX2_HC_COMMAND_CLR_STAT_NOW);
  1624. REG_WR(bp, BNX2_HC_ATTN_BITS_ENABLE, STATUS_ATTN_BITS_LINK_STATE);
  1625. if (REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_FEATURE) &
  1626. BNX2_PORT_FEATURE_ASF_ENABLED)
  1627. bp->flags |= ASF_ENABLE_FLAG;
  1628. /* Initialize the receive filter. */
  1629. bnx2_set_rx_mode(bp->nic);
  1630. rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT2 | BNX2_DRV_MSG_CODE_RESET,
  1631. 0);
  1632. REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, 0x5ffffff);
  1633. REG_RD(bp, BNX2_MISC_ENABLE_SET_BITS);
  1634. udelay(20);
  1635. bp->hc_cmd = REG_RD(bp, BNX2_HC_COMMAND);
  1636. return rc;
  1637. }
  1638. static void
  1639. bnx2_init_tx_ring(struct bnx2 *bp)
  1640. {
  1641. struct tx_bd *txbd;
  1642. u32 val;
  1643. txbd = &bp->tx_desc_ring[MAX_TX_DESC_CNT];
  1644. /* Etherboot lives below 4GB, so hi is always 0 */
  1645. txbd->tx_bd_haddr_hi = 0;
  1646. txbd->tx_bd_haddr_lo = bp->tx_desc_mapping;
  1647. bp->tx_prod = 0;
  1648. bp->tx_cons = 0;
  1649. bp->hw_tx_cons = 0;
  1650. bp->tx_prod_bseq = 0;
  1651. val = BNX2_L2CTX_TYPE_TYPE_L2;
  1652. val |= BNX2_L2CTX_TYPE_SIZE_L2;
  1653. CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TYPE, val);
  1654. val = BNX2_L2CTX_CMD_TYPE_TYPE_L2;
  1655. val |= 8 << 16;
  1656. CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_CMD_TYPE, val);
  1657. /* Etherboot lives below 4GB, so hi is always 0 */
  1658. CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TBDR_BHADDR_HI, 0);
  1659. val = (u64) bp->tx_desc_mapping & 0xffffffff;
  1660. CTX_WR(bp, GET_CID_ADDR(TX_CID), BNX2_L2CTX_TBDR_BHADDR_LO, val);
  1661. }
  1662. static void
  1663. bnx2_init_rx_ring(struct bnx2 *bp)
  1664. {
  1665. struct rx_bd *rxbd;
  1666. unsigned int i;
  1667. u16 prod, ring_prod;
  1668. u32 val;
  1669. bp->rx_buf_use_size = RX_BUF_USE_SIZE;
  1670. bp->rx_buf_size = RX_BUF_SIZE;
  1671. ring_prod = prod = bp->rx_prod = 0;
  1672. bp->rx_cons = 0;
  1673. bp->hw_rx_cons = 0;
  1674. bp->rx_prod_bseq = 0;
  1675. memset(bnx2_bss.rx_buf, 0, sizeof(bnx2_bss.rx_buf));
  1676. rxbd = &bp->rx_desc_ring[0];
  1677. for (i = 0; i < MAX_RX_DESC_CNT; i++, rxbd++) {
  1678. rxbd->rx_bd_len = bp->rx_buf_use_size;
  1679. rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END;
  1680. }
  1681. rxbd->rx_bd_haddr_hi = 0;
  1682. rxbd->rx_bd_haddr_lo = (u64) bp->rx_desc_mapping & 0xffffffff;
  1683. val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE;
  1684. val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2;
  1685. val |= 0x02 << 8;
  1686. CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_CTX_TYPE, val);
  1687. /* Etherboot doesn't use memory above 4GB, so this is always 0 */
  1688. CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_HI, 0);
  1689. val = bp->rx_desc_mapping & 0xffffffff;
  1690. CTX_WR(bp, GET_CID_ADDR(RX_CID), BNX2_L2CTX_NX_BDHADDR_LO, val);
  1691. for (i = 0; (int) i < bp->rx_ring_size; i++) {
  1692. rxbd = &bp->rx_desc_ring[RX_RING_IDX(ring_prod)];
  1693. rxbd->rx_bd_haddr_hi = 0;
  1694. rxbd->rx_bd_haddr_lo = virt_to_bus(&bnx2_bss.rx_buf[ring_prod][0]);
  1695. bp->rx_prod_bseq += bp->rx_buf_use_size;
  1696. prod = NEXT_RX_BD(prod);
  1697. ring_prod = RX_RING_IDX(prod);
  1698. }
  1699. bp->rx_prod = prod;
  1700. REG_WR16(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BDIDX, bp->rx_prod);
  1701. REG_WR(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BSEQ, bp->rx_prod_bseq);
  1702. }
  1703. static int
  1704. bnx2_reset_nic(struct bnx2 *bp, u32 reset_code)
  1705. {
  1706. int rc;
  1707. rc = bnx2_reset_chip(bp, reset_code);
  1708. if (rc) {
  1709. return rc;
  1710. }
  1711. bnx2_init_chip(bp);
  1712. bnx2_init_tx_ring(bp);
  1713. bnx2_init_rx_ring(bp);
  1714. return 0;
  1715. }
  1716. static int
  1717. bnx2_init_nic(struct bnx2 *bp)
  1718. {
  1719. int rc;
  1720. if ((rc = bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET)) != 0)
  1721. return rc;
  1722. bnx2_init_phy(bp);
  1723. bnx2_set_link(bp);
  1724. return 0;
  1725. }
  1726. static int
  1727. bnx2_init_board(struct pci_device *pdev, struct nic *nic)
  1728. {
  1729. unsigned long bnx2reg_base, bnx2reg_len;
  1730. struct bnx2 *bp = &bnx2;
  1731. int rc;
  1732. u32 reg;
  1733. bp->flags = 0;
  1734. bp->phy_flags = 0;
  1735. /* enable device (incl. PCI PM wakeup), and bus-mastering */
  1736. adjust_pci_device(pdev);
  1737. nic->ioaddr = pdev->ioaddr & ~3;
  1738. nic->irqno = 0;
  1739. rc = 0;
  1740. bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM);
  1741. if (bp->pm_cap == 0) {
  1742. printf("Cannot find power management capability, aborting.\n");
  1743. rc = -EIO;
  1744. goto err_out_disable;
  1745. }
  1746. bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX);
  1747. if (bp->pcix_cap == 0) {
  1748. printf("Cannot find PCIX capability, aborting.\n");
  1749. rc = -EIO;
  1750. goto err_out_disable;
  1751. }
  1752. bp->pdev = pdev;
  1753. bp->nic = nic;
  1754. bnx2reg_base = pci_bar_start(pdev, PCI_BASE_ADDRESS_0);
  1755. bnx2reg_len = MB_GET_CID_ADDR(17);
  1756. bp->regview = ioremap(bnx2reg_base, bnx2reg_len);
  1757. if (!bp->regview) {
  1758. printf("Cannot map register space, aborting.\n");
  1759. rc = -EIO;
  1760. goto err_out_disable;
  1761. }
  1762. /* Configure byte swap and enable write to the reg_window registers.
  1763. * Rely on CPU to do target byte swapping on big endian systems
  1764. * The chip's target access swapping will not swap all accesses
  1765. */
  1766. pci_write_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG,
  1767. BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA |
  1768. BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP);
  1769. bnx2_set_power_state_0(bp);
  1770. bp->chip_id = REG_RD(bp, BNX2_MISC_ID);
  1771. /* Get bus information. */
  1772. reg = REG_RD(bp, BNX2_PCICFG_MISC_STATUS);
  1773. if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) {
  1774. u32 clkreg;
  1775. bp->flags |= PCIX_FLAG;
  1776. clkreg = REG_RD(bp, BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS);
  1777. clkreg &= BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET;
  1778. switch (clkreg) {
  1779. case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ:
  1780. bp->bus_speed_mhz = 133;
  1781. break;
  1782. case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ:
  1783. bp->bus_speed_mhz = 100;
  1784. break;
  1785. case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ:
  1786. case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ:
  1787. bp->bus_speed_mhz = 66;
  1788. break;
  1789. case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ:
  1790. case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ:
  1791. bp->bus_speed_mhz = 50;
  1792. break;
  1793. case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW:
  1794. case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ:
  1795. case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ:
  1796. bp->bus_speed_mhz = 33;
  1797. break;
  1798. }
  1799. }
  1800. else {
  1801. if (reg & BNX2_PCICFG_MISC_STATUS_M66EN)
  1802. bp->bus_speed_mhz = 66;
  1803. else
  1804. bp->bus_speed_mhz = 33;
  1805. }
  1806. if (reg & BNX2_PCICFG_MISC_STATUS_32BIT_DET)
  1807. bp->flags |= PCI_32BIT_FLAG;
  1808. /* 5706A0 may falsely detect SERR and PERR. */
  1809. if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
  1810. reg = REG_RD(bp, PCI_COMMAND);
  1811. reg &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
  1812. REG_WR(bp, PCI_COMMAND, reg);
  1813. }
  1814. else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) &&
  1815. !(bp->flags & PCIX_FLAG)) {
  1816. printf("5706 A1 can only be used in a PCIX bus, aborting.\n");
  1817. goto err_out_disable;
  1818. }
  1819. bnx2_init_nvram(bp);
  1820. reg = REG_RD_IND(bp, BNX2_SHM_HDR_SIGNATURE);
  1821. if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) ==
  1822. BNX2_SHM_HDR_SIGNATURE_SIG)
  1823. bp->shmem_base = REG_RD_IND(bp, BNX2_SHM_HDR_ADDR_0);
  1824. else
  1825. bp->shmem_base = HOST_VIEW_SHMEM_BASE;
  1826. /* Get the permanent MAC address. First we need to make sure the
  1827. * firmware is actually running.
  1828. */
  1829. reg = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_SIGNATURE);
  1830. if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) !=
  1831. BNX2_DEV_INFO_SIGNATURE_MAGIC) {
  1832. printf("Firmware not running, aborting.\n");
  1833. rc = -ENODEV;
  1834. goto err_out_disable;
  1835. }
  1836. bp->fw_ver = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_BC_REV);
  1837. reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_UPPER);
  1838. bp->mac_addr[0] = (u8) (reg >> 8);
  1839. bp->mac_addr[1] = (u8) reg;
  1840. reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_LOWER);
  1841. bp->mac_addr[2] = (u8) (reg >> 24);
  1842. bp->mac_addr[3] = (u8) (reg >> 16);
  1843. bp->mac_addr[4] = (u8) (reg >> 8);
  1844. bp->mac_addr[5] = (u8) reg;
  1845. bp->tx_ring_size = MAX_TX_DESC_CNT;
  1846. bp->rx_ring_size = RX_BUF_CNT;
  1847. bp->rx_max_ring_idx = MAX_RX_DESC_CNT;
  1848. bp->rx_offset = RX_OFFSET;
  1849. bp->tx_quick_cons_trip_int = 20;
  1850. bp->tx_quick_cons_trip = 20;
  1851. bp->tx_ticks_int = 80;
  1852. bp->tx_ticks = 80;
  1853. bp->rx_quick_cons_trip_int = 6;
  1854. bp->rx_quick_cons_trip = 6;
  1855. bp->rx_ticks_int = 18;
  1856. bp->rx_ticks = 18;
  1857. bp->stats_ticks = 1000000 & 0xffff00;
  1858. bp->phy_addr = 1;
  1859. /* No need for WOL support in Etherboot */
  1860. bp->flags |= NO_WOL_FLAG;
  1861. /* Disable WOL support if we are running on a SERDES chip. */
  1862. if (CHIP_BOND_ID(bp) & CHIP_BOND_ID_SERDES_BIT) {
  1863. bp->phy_flags |= PHY_SERDES_FLAG;
  1864. if (CHIP_NUM(bp) == CHIP_NUM_5708) {
  1865. bp->phy_addr = 2;
  1866. reg = REG_RD_IND(bp, bp->shmem_base +
  1867. BNX2_SHARED_HW_CFG_CONFIG);
  1868. if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G)
  1869. bp->phy_flags |= PHY_2_5G_CAPABLE_FLAG;
  1870. }
  1871. }
  1872. if (CHIP_ID(bp) == CHIP_ID_5706_A0) {
  1873. bp->tx_quick_cons_trip_int =
  1874. bp->tx_quick_cons_trip;
  1875. bp->tx_ticks_int = bp->tx_ticks;
  1876. bp->rx_quick_cons_trip_int =
  1877. bp->rx_quick_cons_trip;
  1878. bp->rx_ticks_int = bp->rx_ticks;
  1879. bp->comp_prod_trip_int = bp->comp_prod_trip;
  1880. bp->com_ticks_int = bp->com_ticks;
  1881. bp->cmd_ticks_int = bp->cmd_ticks;
  1882. }
  1883. bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL;
  1884. bp->req_line_speed = 0;
  1885. if (bp->phy_flags & PHY_SERDES_FLAG) {
  1886. bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg;
  1887. reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG);
  1888. reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK;
  1889. if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) {
  1890. bp->autoneg = 0;
  1891. bp->req_line_speed = bp->line_speed = SPEED_1000;
  1892. bp->req_duplex = DUPLEX_FULL;
  1893. }
  1894. }
  1895. else {
  1896. bp->advertising = ETHTOOL_ALL_COPPER_SPEED | ADVERTISED_Autoneg;
  1897. }
  1898. bp->req_flow_ctrl = FLOW_CTRL_RX | FLOW_CTRL_TX;
  1899. /* Disable driver heartbeat checking */
  1900. REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_PULSE_MB,
  1901. BNX2_DRV_MSG_DATA_PULSE_CODE_ALWAYS_ALIVE);
  1902. REG_RD_IND(bp, bp->shmem_base + BNX2_DRV_PULSE_MB);
  1903. return 0;
  1904. err_out_disable:
  1905. bnx2_disable(nic);
  1906. return rc;
  1907. }
  1908. static void
  1909. bnx2_transmit(struct nic *nic, const char *dst_addr,
  1910. unsigned int type, unsigned int size, const char *packet)
  1911. {
  1912. /* Sometimes the nic will be behind by a frame. Using two transmit
  1913. * buffers prevents us from timing out in that case.
  1914. */
  1915. static struct eth_frame {
  1916. uint8_t dst_addr[ETH_ALEN];
  1917. uint8_t src_addr[ETH_ALEN];
  1918. uint16_t type;
  1919. uint8_t data [ETH_FRAME_LEN - ETH_HLEN];
  1920. } frame[2];
  1921. static int frame_idx = 0;
  1922. /* send the packet to destination */
  1923. struct tx_bd *txbd;
  1924. struct bnx2 *bp = &bnx2;
  1925. u16 prod, ring_prod;
  1926. u16 hw_cons;
  1927. int i = 0;
  1928. prod = bp->tx_prod;
  1929. ring_prod = TX_RING_IDX(prod);
  1930. hw_cons = bp->status_blk->status_tx_quick_consumer_index0;
  1931. if ((hw_cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT) {
  1932. hw_cons++;
  1933. }
  1934. while((hw_cons != prod) && (hw_cons != (PREV_TX_BD(prod)))) {
  1935. mdelay(10); /* give the nic a chance */
  1936. //poll_interruptions();
  1937. if (++i > 500) { /* timeout 5s for transmit */
  1938. printf("transmit timed out\n");
  1939. bnx2_disable(bp->nic);
  1940. bnx2_init_board(bp->pdev, bp->nic);
  1941. return;
  1942. }
  1943. }
  1944. if (i != 0) {
  1945. printf("#");
  1946. }
  1947. /* Copy the packet to the our local buffer */
  1948. memcpy(&frame[frame_idx].dst_addr, dst_addr, ETH_ALEN);
  1949. memcpy(&frame[frame_idx].src_addr, nic->node_addr, ETH_ALEN);
  1950. frame[frame_idx].type = htons(type);
  1951. memset(&frame[frame_idx].data, 0, sizeof(frame[frame_idx].data));
  1952. memcpy(&frame[frame_idx].data, packet, size);
  1953. /* Setup the ring buffer entry to transmit */
  1954. txbd = &bp->tx_desc_ring[ring_prod];
  1955. txbd->tx_bd_haddr_hi = 0; /* Etherboot runs under 4GB */
  1956. txbd->tx_bd_haddr_lo = virt_to_bus(&frame[frame_idx]);
  1957. txbd->tx_bd_mss_nbytes = (size + ETH_HLEN);
  1958. txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_START | TX_BD_FLAGS_END;
  1959. /* Advance to the next entry */
  1960. prod = NEXT_TX_BD(prod);
  1961. frame_idx ^= 1;
  1962. bp->tx_prod_bseq += (size + ETH_HLEN);
  1963. REG_WR16(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BIDX, prod);
  1964. REG_WR(bp, MB_TX_CID_ADDR + BNX2_L2CTX_TX_HOST_BSEQ, bp->tx_prod_bseq);
  1965. wmb();
  1966. bp->tx_prod = prod;
  1967. }
  1968. static int
  1969. bnx2_poll_link(struct bnx2 *bp)
  1970. {
  1971. u32 new_link_state, old_link_state, emac_status;
  1972. new_link_state = bp->status_blk->status_attn_bits &
  1973. STATUS_ATTN_BITS_LINK_STATE;
  1974. old_link_state = bp->status_blk->status_attn_bits_ack &
  1975. STATUS_ATTN_BITS_LINK_STATE;
  1976. if (!new_link_state && !old_link_state) {
  1977. /* For some reason the card doesn't always update the link
  1978. * status bits properly. Kick the stupid thing and try again.
  1979. */
  1980. u32 bmsr;
  1981. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  1982. bnx2_read_phy(bp, MII_BMSR, &bmsr);
  1983. if ((bp->phy_flags & PHY_SERDES_FLAG) &&
  1984. (CHIP_NUM(bp) == CHIP_NUM_5706)) {
  1985. REG_RD(bp, BNX2_EMAC_STATUS);
  1986. }
  1987. new_link_state = bp->status_blk->status_attn_bits &
  1988. STATUS_ATTN_BITS_LINK_STATE;
  1989. old_link_state = bp->status_blk->status_attn_bits_ack &
  1990. STATUS_ATTN_BITS_LINK_STATE;
  1991. /* Okay, for some reason the above doesn't work with some
  1992. * switches (like HP ProCurve). If the above doesn't work,
  1993. * check the MAC directly to see if we have a link. Perhaps we
  1994. * should always check the MAC instead probing the MII.
  1995. */
  1996. if (!new_link_state && !old_link_state) {
  1997. emac_status = REG_RD(bp, BNX2_EMAC_STATUS);
  1998. if (emac_status & BNX2_EMAC_STATUS_LINK_CHANGE) {
  1999. /* Acknowledge the link change */
  2000. REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE);
  2001. } else if (emac_status & BNX2_EMAC_STATUS_LINK) {
  2002. new_link_state = !old_link_state;
  2003. }
  2004. }
  2005. }
  2006. if (new_link_state != old_link_state) {
  2007. if (new_link_state) {
  2008. REG_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD,
  2009. STATUS_ATTN_BITS_LINK_STATE);
  2010. }
  2011. else {
  2012. REG_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD,
  2013. STATUS_ATTN_BITS_LINK_STATE);
  2014. }
  2015. bnx2_set_link(bp);
  2016. /* This is needed to take care of transient status
  2017. * during link changes.
  2018. */
  2019. REG_WR(bp, BNX2_HC_COMMAND,
  2020. bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
  2021. REG_RD(bp, BNX2_HC_COMMAND);
  2022. }
  2023. return bp->link_up;
  2024. }
  2025. static int
  2026. bnx2_poll(struct nic* nic, int retrieve)
  2027. {
  2028. struct bnx2 *bp = &bnx2;
  2029. struct rx_bd *cons_bd, *prod_bd;
  2030. u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod;
  2031. struct l2_fhdr *rx_hdr;
  2032. int result = 0;
  2033. unsigned int len;
  2034. unsigned char *data;
  2035. u32 status;
  2036. #if 0
  2037. if ((bp->status_blk->status_idx == bp->last_status_idx) &&
  2038. (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) &
  2039. BNX2_PCICFG_MISC_STATUS_INTA_VALUE)) {
  2040. bp->last_status_idx = bp->status_blk->status_idx;
  2041. REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
  2042. BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
  2043. BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
  2044. bp->last_status_idx);
  2045. return 0;
  2046. }
  2047. #endif
  2048. if ((bp->status_blk->status_rx_quick_consumer_index0 != bp->rx_cons) && !retrieve)
  2049. return 1;
  2050. if (bp->status_blk->status_rx_quick_consumer_index0 != bp->rx_cons) {
  2051. hw_cons = bp->hw_rx_cons = bp->status_blk->status_rx_quick_consumer_index0;
  2052. if ((hw_cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT) {
  2053. hw_cons++;
  2054. }
  2055. sw_cons = bp->rx_cons;
  2056. sw_prod = bp->rx_prod;
  2057. rmb();
  2058. if (sw_cons != hw_cons) {
  2059. sw_ring_cons = RX_RING_IDX(sw_cons);
  2060. sw_ring_prod = RX_RING_IDX(sw_prod);
  2061. data = bus_to_virt(bp->rx_desc_ring[sw_ring_cons].rx_bd_haddr_lo);
  2062. rx_hdr = (struct l2_fhdr *)data;
  2063. len = rx_hdr->l2_fhdr_pkt_len - 4;
  2064. if ((len > (ETH_MAX_MTU + ETH_HLEN)) ||
  2065. ((status = rx_hdr->l2_fhdr_status) &
  2066. (L2_FHDR_ERRORS_BAD_CRC |
  2067. L2_FHDR_ERRORS_PHY_DECODE |
  2068. L2_FHDR_ERRORS_ALIGNMENT |
  2069. L2_FHDR_ERRORS_TOO_SHORT |
  2070. L2_FHDR_ERRORS_GIANT_FRAME))) {
  2071. result = 0;
  2072. }
  2073. else
  2074. {
  2075. nic->packetlen = len;
  2076. memcpy(nic->packet, data + bp->rx_offset, len);
  2077. result = 1;
  2078. }
  2079. /* Reuse the buffer */
  2080. bp->rx_prod_bseq += bp->rx_buf_use_size;
  2081. if (sw_cons != sw_prod) {
  2082. cons_bd = &bp->rx_desc_ring[sw_ring_cons];
  2083. prod_bd = &bp->rx_desc_ring[sw_ring_prod];
  2084. prod_bd->rx_bd_haddr_hi = 0; /* Etherboot runs under 4GB */
  2085. prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo;
  2086. }
  2087. sw_cons = NEXT_RX_BD(sw_cons);
  2088. sw_prod = NEXT_RX_BD(sw_prod);
  2089. }
  2090. bp->rx_cons = sw_cons;
  2091. bp->rx_prod = sw_prod;
  2092. REG_WR16(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BDIDX, bp->rx_prod);
  2093. REG_WR(bp, MB_RX_CID_ADDR + BNX2_L2CTX_HOST_BSEQ, bp->rx_prod_bseq);
  2094. wmb();
  2095. }
  2096. bnx2_poll_link(bp);
  2097. #if 0
  2098. bp->last_status_idx = bp->status_blk->status_idx;
  2099. rmb();
  2100. REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD,
  2101. BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID |
  2102. BNX2_PCICFG_INT_ACK_CMD_MASK_INT |
  2103. bp->last_status_idx);
  2104. REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT);
  2105. #endif
  2106. return result;
  2107. }
  2108. static void
  2109. bnx2_irq(struct nic *nic __unused, irq_action_t action __unused)
  2110. {
  2111. switch ( action ) {
  2112. case DISABLE: break;
  2113. case ENABLE: break;
  2114. case FORCE: break;
  2115. }
  2116. }
  2117. static struct nic_operations bnx2_operations = {
  2118. .connect = dummy_connect,
  2119. .poll = bnx2_poll,
  2120. .transmit = bnx2_transmit,
  2121. .irq = bnx2_irq,
  2122. };
  2123. static int
  2124. bnx2_probe(struct nic *nic, struct pci_device *pdev)
  2125. {
  2126. struct bnx2 *bp = &bnx2;
  2127. int i, rc;
  2128. if (pdev == 0)
  2129. return 0;
  2130. memset(bp, 0, sizeof(*bp));
  2131. rc = bnx2_init_board(pdev, nic);
  2132. if (rc < 0) {
  2133. return 0;
  2134. }
  2135. /*
  2136. nic->disable = bnx2_disable;
  2137. nic->transmit = bnx2_transmit;
  2138. nic->poll = bnx2_poll;
  2139. nic->irq = bnx2_irq;
  2140. */
  2141. nic->nic_op = &bnx2_operations;
  2142. memcpy(nic->node_addr, bp->mac_addr, ETH_ALEN);
  2143. printf("Ethernet addr: %s\n", eth_ntoa( nic->node_addr ) );
  2144. printf("Broadcom NetXtreme II (%c%d) PCI%s %s %dMHz\n",
  2145. (int) ((CHIP_ID(bp) & 0xf000) >> 12) + 'A',
  2146. (int) ((CHIP_ID(bp) & 0x0ff0) >> 4),
  2147. ((bp->flags & PCIX_FLAG) ? "-X" : ""),
  2148. ((bp->flags & PCI_32BIT_FLAG) ? "32-bit" : "64-bit"),
  2149. bp->bus_speed_mhz);
  2150. bnx2_set_power_state_0(bp);
  2151. bnx2_disable_int(bp);
  2152. bnx2_alloc_mem(bp);
  2153. rc = bnx2_init_nic(bp);
  2154. if (rc) {
  2155. return 0;
  2156. }
  2157. bnx2_poll_link(bp);
  2158. for(i = 0; !bp->link_up && (i < VALID_LINK_TIMEOUT*100); i++) {
  2159. mdelay(1);
  2160. bnx2_poll_link(bp);
  2161. }
  2162. #if 1
  2163. if (!bp->link_up){
  2164. printf("Valid link not established\n");
  2165. goto err_out_disable;
  2166. }
  2167. #endif
  2168. return 1;
  2169. err_out_disable:
  2170. bnx2_disable(nic);
  2171. return 0;
  2172. }
  2173. static struct pci_device_id bnx2_nics[] = {
  2174. PCI_ROM(0x14e4, 0x164a, "bnx2-5706", "Broadcom NetXtreme II BCM5706"),
  2175. PCI_ROM(0x14e4, 0x164c, "bnx2-5708", "Broadcom NetXtreme II BCM5708"),
  2176. PCI_ROM(0x14e4, 0x16aa, "bnx2-5706S", "Broadcom NetXtreme II BCM5706S"),
  2177. PCI_ROM(0x14e4, 0x16ac, "bnx2-5708S", "Broadcom NetXtreme II BCM5708S"),
  2178. };
  2179. PCI_DRIVER ( bnx2_driver, bnx2_nics, PCI_NO_CLASS );
  2180. DRIVER ( "BNX2", nic_driver, pci_driver, bnx2_driver, bnx2_probe, bnx2_disable );
  2181. /*
  2182. static struct pci_driver bnx2_driver __pci_driver = {
  2183. .type = NIC_DRIVER,
  2184. .name = "BNX2",
  2185. .probe = bnx2_probe,
  2186. .ids = bnx2_nics,
  2187. .id_count = sizeof(bnx2_nics)/sizeof(bnx2_nics[0]),
  2188. .class = 0,
  2189. };
  2190. */