選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

bnx2.c 67KB

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