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.

tg3_phy.c 39KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608
  1. #include <mii.h>
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <unistd.h>
  5. #include <byteswap.h>
  6. #include <ipxe/pci.h>
  7. #include "tg3.h"
  8. static void tg3_link_report(struct tg3 *tp);
  9. void tg3_mdio_init(struct tg3 *tp)
  10. { DBGP("%s\n", __func__);
  11. if (tg3_flag(tp, 5717_PLUS)) {
  12. u32 is_serdes;
  13. tp->phy_addr = PCI_FUNC(tp->pdev->busdevfn) + 1;
  14. if (tp->pci_chip_rev_id != CHIPREV_ID_5717_A0)
  15. is_serdes = tr32(SG_DIG_STATUS) & SG_DIG_IS_SERDES;
  16. else
  17. is_serdes = tr32(TG3_CPMU_PHY_STRAP) &
  18. TG3_CPMU_PHY_STRAP_IS_SERDES;
  19. if (is_serdes)
  20. tp->phy_addr += 7;
  21. } else
  22. tp->phy_addr = TG3_PHY_MII_ADDR;
  23. }
  24. static int tg3_issue_otp_command(struct tg3 *tp, u32 cmd)
  25. { DBGP("%s\n", __func__);
  26. int i;
  27. u32 val;
  28. tw32(OTP_CTRL, cmd | OTP_CTRL_OTP_CMD_START);
  29. tw32(OTP_CTRL, cmd);
  30. /* Wait for up to 1 ms for command to execute. */
  31. for (i = 0; i < 100; i++) {
  32. val = tr32(OTP_STATUS);
  33. if (val & OTP_STATUS_CMD_DONE)
  34. break;
  35. udelay(10);
  36. }
  37. return (val & OTP_STATUS_CMD_DONE) ? 0 : -EBUSY;
  38. }
  39. /* Read the gphy configuration from the OTP region of the chip. The gphy
  40. * configuration is a 32-bit value that straddles the alignment boundary.
  41. * We do two 32-bit reads and then shift and merge the results.
  42. */
  43. u32 tg3_read_otp_phycfg(struct tg3 *tp)
  44. { DBGP("%s\n", __func__);
  45. u32 bhalf_otp, thalf_otp;
  46. tw32(OTP_MODE, OTP_MODE_OTP_THRU_GRC);
  47. if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_INIT))
  48. return 0;
  49. tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC1);
  50. if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
  51. return 0;
  52. thalf_otp = tr32(OTP_READ_DATA);
  53. tw32(OTP_ADDRESS, OTP_ADDRESS_MAGIC2);
  54. if (tg3_issue_otp_command(tp, OTP_CTRL_OTP_CMD_READ))
  55. return 0;
  56. bhalf_otp = tr32(OTP_READ_DATA);
  57. return ((thalf_otp & 0x0000ffff) << 16) | (bhalf_otp >> 16);
  58. }
  59. #define PHY_BUSY_LOOPS 5000
  60. int tg3_readphy(struct tg3 *tp, int reg, u32 *val)
  61. { DBGP("%s\n", __func__);
  62. u32 frame_val;
  63. unsigned int loops;
  64. int ret;
  65. if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
  66. tw32_f(MAC_MI_MODE,
  67. (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
  68. udelay(80);
  69. }
  70. *val = 0x0;
  71. frame_val = ((tp->phy_addr << MI_COM_PHY_ADDR_SHIFT) &
  72. MI_COM_PHY_ADDR_MASK);
  73. frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
  74. MI_COM_REG_ADDR_MASK);
  75. frame_val |= (MI_COM_CMD_READ | MI_COM_START);
  76. tw32_f(MAC_MI_COM, frame_val);
  77. loops = PHY_BUSY_LOOPS;
  78. while (loops != 0) {
  79. udelay(10);
  80. frame_val = tr32(MAC_MI_COM);
  81. if ((frame_val & MI_COM_BUSY) == 0) {
  82. udelay(5);
  83. frame_val = tr32(MAC_MI_COM);
  84. break;
  85. }
  86. loops -= 1;
  87. }
  88. ret = -EBUSY;
  89. if (loops != 0) {
  90. *val = frame_val & MI_COM_DATA_MASK;
  91. ret = 0;
  92. }
  93. if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
  94. tw32_f(MAC_MI_MODE, tp->mi_mode);
  95. udelay(80);
  96. }
  97. return ret;
  98. }
  99. struct subsys_tbl_ent {
  100. u16 subsys_vendor, subsys_devid;
  101. u32 phy_id;
  102. };
  103. static struct subsys_tbl_ent subsys_id_to_phy_id[] = {
  104. /* Broadcom boards. */
  105. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  106. TG3PCI_SUBDEVICE_ID_BROADCOM_95700A6, TG3_PHY_ID_BCM5401 },
  107. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  108. TG3PCI_SUBDEVICE_ID_BROADCOM_95701A5, TG3_PHY_ID_BCM5701 },
  109. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  110. TG3PCI_SUBDEVICE_ID_BROADCOM_95700T6, TG3_PHY_ID_BCM8002 },
  111. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  112. TG3PCI_SUBDEVICE_ID_BROADCOM_95700A9, 0 },
  113. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  114. TG3PCI_SUBDEVICE_ID_BROADCOM_95701T1, TG3_PHY_ID_BCM5701 },
  115. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  116. TG3PCI_SUBDEVICE_ID_BROADCOM_95701T8, TG3_PHY_ID_BCM5701 },
  117. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  118. TG3PCI_SUBDEVICE_ID_BROADCOM_95701A7, 0 },
  119. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  120. TG3PCI_SUBDEVICE_ID_BROADCOM_95701A10, TG3_PHY_ID_BCM5701 },
  121. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  122. TG3PCI_SUBDEVICE_ID_BROADCOM_95701A12, TG3_PHY_ID_BCM5701 },
  123. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  124. TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX1, TG3_PHY_ID_BCM5703 },
  125. { TG3PCI_SUBVENDOR_ID_BROADCOM,
  126. TG3PCI_SUBDEVICE_ID_BROADCOM_95703AX2, TG3_PHY_ID_BCM5703 },
  127. /* 3com boards. */
  128. { TG3PCI_SUBVENDOR_ID_3COM,
  129. TG3PCI_SUBDEVICE_ID_3COM_3C996T, TG3_PHY_ID_BCM5401 },
  130. { TG3PCI_SUBVENDOR_ID_3COM,
  131. TG3PCI_SUBDEVICE_ID_3COM_3C996BT, TG3_PHY_ID_BCM5701 },
  132. { TG3PCI_SUBVENDOR_ID_3COM,
  133. TG3PCI_SUBDEVICE_ID_3COM_3C996SX, 0 },
  134. { TG3PCI_SUBVENDOR_ID_3COM,
  135. TG3PCI_SUBDEVICE_ID_3COM_3C1000T, TG3_PHY_ID_BCM5701 },
  136. { TG3PCI_SUBVENDOR_ID_3COM,
  137. TG3PCI_SUBDEVICE_ID_3COM_3C940BR01, TG3_PHY_ID_BCM5701 },
  138. /* DELL boards. */
  139. { TG3PCI_SUBVENDOR_ID_DELL,
  140. TG3PCI_SUBDEVICE_ID_DELL_VIPER, TG3_PHY_ID_BCM5401 },
  141. { TG3PCI_SUBVENDOR_ID_DELL,
  142. TG3PCI_SUBDEVICE_ID_DELL_JAGUAR, TG3_PHY_ID_BCM5401 },
  143. { TG3PCI_SUBVENDOR_ID_DELL,
  144. TG3PCI_SUBDEVICE_ID_DELL_MERLOT, TG3_PHY_ID_BCM5411 },
  145. { TG3PCI_SUBVENDOR_ID_DELL,
  146. TG3PCI_SUBDEVICE_ID_DELL_SLIM_MERLOT, TG3_PHY_ID_BCM5411 },
  147. /* Compaq boards. */
  148. { TG3PCI_SUBVENDOR_ID_COMPAQ,
  149. TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE, TG3_PHY_ID_BCM5701 },
  150. { TG3PCI_SUBVENDOR_ID_COMPAQ,
  151. TG3PCI_SUBDEVICE_ID_COMPAQ_BANSHEE_2, TG3_PHY_ID_BCM5701 },
  152. { TG3PCI_SUBVENDOR_ID_COMPAQ,
  153. TG3PCI_SUBDEVICE_ID_COMPAQ_CHANGELING, 0 },
  154. { TG3PCI_SUBVENDOR_ID_COMPAQ,
  155. TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780, TG3_PHY_ID_BCM5701 },
  156. { TG3PCI_SUBVENDOR_ID_COMPAQ,
  157. TG3PCI_SUBDEVICE_ID_COMPAQ_NC7780_2, TG3_PHY_ID_BCM5701 },
  158. /* IBM boards. */
  159. { TG3PCI_SUBVENDOR_ID_IBM,
  160. TG3PCI_SUBDEVICE_ID_IBM_5703SAX2, 0 }
  161. };
  162. static struct subsys_tbl_ent *tg3_lookup_by_subsys(struct tg3 *tp)
  163. { DBGP("%s\n", __func__);
  164. int i;
  165. DBGC(tp->dev, "Matching with: %x:%x\n", tp->subsystem_vendor, tp->subsystem_device);
  166. for (i = 0; i < (int) ARRAY_SIZE(subsys_id_to_phy_id); i++) {
  167. if ((subsys_id_to_phy_id[i].subsys_vendor ==
  168. tp->subsystem_vendor) &&
  169. (subsys_id_to_phy_id[i].subsys_devid ==
  170. tp->subsystem_device))
  171. return &subsys_id_to_phy_id[i];
  172. }
  173. return NULL;
  174. }
  175. int tg3_writephy(struct tg3 *tp, int reg, u32 val)
  176. { DBGP("%s\n", __func__);
  177. u32 frame_val;
  178. unsigned int loops;
  179. int ret;
  180. if ((tp->phy_flags & TG3_PHYFLG_IS_FET) &&
  181. (reg == MII_TG3_CTRL || reg == MII_TG3_AUX_CTRL))
  182. return 0;
  183. if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
  184. tw32_f(MAC_MI_MODE,
  185. (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
  186. udelay(80);
  187. }
  188. frame_val = ((tp->phy_addr << MI_COM_PHY_ADDR_SHIFT) &
  189. MI_COM_PHY_ADDR_MASK);
  190. frame_val |= ((reg << MI_COM_REG_ADDR_SHIFT) &
  191. MI_COM_REG_ADDR_MASK);
  192. frame_val |= (val & MI_COM_DATA_MASK);
  193. frame_val |= (MI_COM_CMD_WRITE | MI_COM_START);
  194. tw32_f(MAC_MI_COM, frame_val);
  195. loops = PHY_BUSY_LOOPS;
  196. while (loops != 0) {
  197. udelay(10);
  198. frame_val = tr32(MAC_MI_COM);
  199. if ((frame_val & MI_COM_BUSY) == 0) {
  200. udelay(5);
  201. frame_val = tr32(MAC_MI_COM);
  202. break;
  203. }
  204. loops -= 1;
  205. }
  206. ret = -EBUSY;
  207. if (loops != 0)
  208. ret = 0;
  209. if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
  210. tw32_f(MAC_MI_MODE, tp->mi_mode);
  211. udelay(80);
  212. }
  213. return ret;
  214. }
  215. static int tg3_bmcr_reset(struct tg3 *tp)
  216. { DBGP("%s\n", __func__);
  217. u32 phy_control;
  218. int limit, err;
  219. /* OK, reset it, and poll the BMCR_RESET bit until it
  220. * clears or we time out.
  221. */
  222. phy_control = BMCR_RESET;
  223. err = tg3_writephy(tp, MII_BMCR, phy_control);
  224. if (err != 0)
  225. return -EBUSY;
  226. limit = 5000;
  227. while (limit--) {
  228. err = tg3_readphy(tp, MII_BMCR, &phy_control);
  229. if (err != 0)
  230. return -EBUSY;
  231. if ((phy_control & BMCR_RESET) == 0) {
  232. udelay(40);
  233. break;
  234. }
  235. udelay(10);
  236. }
  237. if (limit < 0)
  238. return -EBUSY;
  239. return 0;
  240. }
  241. static int tg3_wait_macro_done(struct tg3 *tp)
  242. { DBGP("%s\n", __func__);
  243. int limit = 100;
  244. while (limit--) {
  245. u32 tmp32;
  246. if (!tg3_readphy(tp, MII_TG3_DSP_CONTROL, &tmp32)) {
  247. if ((tmp32 & 0x1000) == 0)
  248. break;
  249. }
  250. }
  251. if (limit < 0)
  252. return -EBUSY;
  253. return 0;
  254. }
  255. static int tg3_phy_write_and_check_testpat(struct tg3 *tp, int *resetp)
  256. { DBGP("%s\n", __func__);
  257. static const u32 test_pat[4][6] = {
  258. { 0x00005555, 0x00000005, 0x00002aaa, 0x0000000a, 0x00003456, 0x00000003 },
  259. { 0x00002aaa, 0x0000000a, 0x00003333, 0x00000003, 0x0000789a, 0x00000005 },
  260. { 0x00005a5a, 0x00000005, 0x00002a6a, 0x0000000a, 0x00001bcd, 0x00000003 },
  261. { 0x00002a5a, 0x0000000a, 0x000033c3, 0x00000003, 0x00002ef1, 0x00000005 }
  262. };
  263. int chan;
  264. for (chan = 0; chan < 4; chan++) {
  265. int i;
  266. tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
  267. (chan * 0x2000) | 0x0200);
  268. tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0002);
  269. for (i = 0; i < 6; i++)
  270. tg3_writephy(tp, MII_TG3_DSP_RW_PORT,
  271. test_pat[chan][i]);
  272. tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0202);
  273. if (tg3_wait_macro_done(tp)) {
  274. *resetp = 1;
  275. return -EBUSY;
  276. }
  277. tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
  278. (chan * 0x2000) | 0x0200);
  279. tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0082);
  280. if (tg3_wait_macro_done(tp)) {
  281. *resetp = 1;
  282. return -EBUSY;
  283. }
  284. tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0802);
  285. if (tg3_wait_macro_done(tp)) {
  286. *resetp = 1;
  287. return -EBUSY;
  288. }
  289. for (i = 0; i < 6; i += 2) {
  290. u32 low, high;
  291. if (tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &low) ||
  292. tg3_readphy(tp, MII_TG3_DSP_RW_PORT, &high) ||
  293. tg3_wait_macro_done(tp)) {
  294. *resetp = 1;
  295. return -EBUSY;
  296. }
  297. low &= 0x7fff;
  298. high &= 0x000f;
  299. if (low != test_pat[chan][i] ||
  300. high != test_pat[chan][i+1]) {
  301. tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000b);
  302. tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4001);
  303. tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x4005);
  304. return -EBUSY;
  305. }
  306. }
  307. }
  308. return 0;
  309. }
  310. static int tg3_phy_reset_chanpat(struct tg3 *tp)
  311. { DBGP("%s\n", __func__);
  312. int chan;
  313. for (chan = 0; chan < 4; chan++) {
  314. int i;
  315. tg3_writephy(tp, MII_TG3_DSP_ADDRESS,
  316. (chan * 0x2000) | 0x0200);
  317. tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0002);
  318. for (i = 0; i < 6; i++)
  319. tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x000);
  320. tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0202);
  321. if (tg3_wait_macro_done(tp))
  322. return -EBUSY;
  323. }
  324. return 0;
  325. }
  326. static int tg3_phydsp_write(struct tg3 *tp, u32 reg, u32 val)
  327. { DBGP("%s\n", __func__);
  328. int err;
  329. err = tg3_writephy(tp, MII_TG3_DSP_ADDRESS, reg);
  330. if (!err)
  331. err = tg3_writephy(tp, MII_TG3_DSP_RW_PORT, val);
  332. return err;
  333. }
  334. static int tg3_phy_auxctl_write(struct tg3 *tp, int reg, u32 set)
  335. { DBGP("%s\n", __func__);
  336. if (reg == MII_TG3_AUXCTL_SHDWSEL_MISC)
  337. set |= MII_TG3_AUXCTL_MISC_WREN;
  338. return tg3_writephy(tp, MII_TG3_AUX_CTRL, set | reg);
  339. }
  340. #define TG3_PHY_AUXCTL_SMDSP_ENABLE(tp) \
  341. tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, \
  342. MII_TG3_AUXCTL_ACTL_SMDSP_ENA | \
  343. MII_TG3_AUXCTL_ACTL_TX_6DB)
  344. #define TG3_PHY_AUXCTL_SMDSP_DISABLE(tp) \
  345. tg3_phy_auxctl_write((tp), MII_TG3_AUXCTL_SHDWSEL_AUXCTL, \
  346. MII_TG3_AUXCTL_ACTL_TX_6DB);
  347. static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
  348. { DBGP("%s\n", __func__);
  349. u32 reg32, phy9_orig;
  350. int retries, do_phy_reset, err;
  351. retries = 10;
  352. do_phy_reset = 1;
  353. do {
  354. if (do_phy_reset) {
  355. err = tg3_bmcr_reset(tp);
  356. if (err)
  357. return err;
  358. do_phy_reset = 0;
  359. }
  360. /* Disable transmitter and interrupt. */
  361. if (tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32))
  362. continue;
  363. reg32 |= 0x3000;
  364. tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
  365. /* Set full-duplex, 1000 mbps. */
  366. tg3_writephy(tp, MII_BMCR,
  367. BMCR_FULLDPLX | TG3_BMCR_SPEED1000);
  368. /* Set to master mode. */
  369. if (tg3_readphy(tp, MII_TG3_CTRL, &phy9_orig))
  370. continue;
  371. tg3_writephy(tp, MII_TG3_CTRL,
  372. (MII_TG3_CTRL_AS_MASTER |
  373. MII_TG3_CTRL_ENABLE_AS_MASTER));
  374. err = TG3_PHY_AUXCTL_SMDSP_ENABLE(tp);
  375. if (err)
  376. return err;
  377. /* Block the PHY control access. */
  378. tg3_phydsp_write(tp, 0x8005, 0x0800);
  379. err = tg3_phy_write_and_check_testpat(tp, &do_phy_reset);
  380. if (!err)
  381. break;
  382. } while (--retries);
  383. err = tg3_phy_reset_chanpat(tp);
  384. if (err)
  385. return err;
  386. tg3_phydsp_write(tp, 0x8005, 0x0000);
  387. tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x8200);
  388. tg3_writephy(tp, MII_TG3_DSP_CONTROL, 0x0000);
  389. TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
  390. tg3_writephy(tp, MII_TG3_CTRL, phy9_orig);
  391. if (!tg3_readphy(tp, MII_TG3_EXT_CTRL, &reg32)) {
  392. reg32 &= ~0x3000;
  393. tg3_writephy(tp, MII_TG3_EXT_CTRL, reg32);
  394. } else if (!err)
  395. err = -EBUSY;
  396. return err;
  397. }
  398. static void tg3_phy_apply_otp(struct tg3 *tp)
  399. { DBGP("%s\n", __func__);
  400. u32 otp, phy;
  401. if (!tp->phy_otp)
  402. return;
  403. otp = tp->phy_otp;
  404. if (TG3_PHY_AUXCTL_SMDSP_ENABLE(tp))
  405. return;
  406. phy = ((otp & TG3_OTP_AGCTGT_MASK) >> TG3_OTP_AGCTGT_SHIFT);
  407. phy |= MII_TG3_DSP_TAP1_AGCTGT_DFLT;
  408. tg3_phydsp_write(tp, MII_TG3_DSP_TAP1, phy);
  409. phy = ((otp & TG3_OTP_HPFFLTR_MASK) >> TG3_OTP_HPFFLTR_SHIFT) |
  410. ((otp & TG3_OTP_HPFOVER_MASK) >> TG3_OTP_HPFOVER_SHIFT);
  411. tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH0, phy);
  412. phy = ((otp & TG3_OTP_LPFDIS_MASK) >> TG3_OTP_LPFDIS_SHIFT);
  413. phy |= MII_TG3_DSP_AADJ1CH3_ADCCKADJ;
  414. tg3_phydsp_write(tp, MII_TG3_DSP_AADJ1CH3, phy);
  415. phy = ((otp & TG3_OTP_VDAC_MASK) >> TG3_OTP_VDAC_SHIFT);
  416. tg3_phydsp_write(tp, MII_TG3_DSP_EXP75, phy);
  417. phy = ((otp & TG3_OTP_10BTAMP_MASK) >> TG3_OTP_10BTAMP_SHIFT);
  418. tg3_phydsp_write(tp, MII_TG3_DSP_EXP96, phy);
  419. phy = ((otp & TG3_OTP_ROFF_MASK) >> TG3_OTP_ROFF_SHIFT) |
  420. ((otp & TG3_OTP_RCOFF_MASK) >> TG3_OTP_RCOFF_SHIFT);
  421. tg3_phydsp_write(tp, MII_TG3_DSP_EXP97, phy);
  422. TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
  423. }
  424. static int tg3_phy_auxctl_read(struct tg3 *tp, int reg, u32 *val)
  425. { DBGP("%s\n", __func__);
  426. int err;
  427. err = tg3_writephy(tp, MII_TG3_AUX_CTRL,
  428. (reg << MII_TG3_AUXCTL_MISC_RDSEL_SHIFT) |
  429. MII_TG3_AUXCTL_SHDWSEL_MISC);
  430. if (!err)
  431. err = tg3_readphy(tp, MII_TG3_AUX_CTRL, val);
  432. return err;
  433. }
  434. static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable)
  435. { DBGP("%s\n", __func__);
  436. u32 phy;
  437. if (!tg3_flag(tp, 5705_PLUS) ||
  438. (tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
  439. return;
  440. if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
  441. u32 ephy;
  442. if (!tg3_readphy(tp, MII_TG3_FET_TEST, &ephy)) {
  443. u32 reg = MII_TG3_FET_SHDW_MISCCTRL;
  444. tg3_writephy(tp, MII_TG3_FET_TEST,
  445. ephy | MII_TG3_FET_SHADOW_EN);
  446. if (!tg3_readphy(tp, reg, &phy)) {
  447. if (enable)
  448. phy |= MII_TG3_FET_SHDW_MISCCTRL_MDIX;
  449. else
  450. phy &= ~MII_TG3_FET_SHDW_MISCCTRL_MDIX;
  451. tg3_writephy(tp, reg, phy);
  452. }
  453. tg3_writephy(tp, MII_TG3_FET_TEST, ephy);
  454. }
  455. } else {
  456. int ret;
  457. ret = tg3_phy_auxctl_read(tp,
  458. MII_TG3_AUXCTL_SHDWSEL_MISC, &phy);
  459. if (!ret) {
  460. if (enable)
  461. phy |= MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
  462. else
  463. phy &= ~MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
  464. tg3_phy_auxctl_write(tp,
  465. MII_TG3_AUXCTL_SHDWSEL_MISC, phy);
  466. }
  467. }
  468. }
  469. static void tg3_phy_set_wirespeed(struct tg3 *tp)
  470. { DBGP("%s\n", __func__);
  471. int ret;
  472. u32 val;
  473. if (tp->phy_flags & TG3_PHYFLG_NO_ETH_WIRE_SPEED)
  474. return;
  475. ret = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_MISC, &val);
  476. if (!ret)
  477. tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_MISC,
  478. val | MII_TG3_AUXCTL_MISC_WIRESPD_EN);
  479. }
  480. /* This will reset the tigon3 PHY if there is no valid
  481. * link unless the FORCE argument is non-zero.
  482. */
  483. int tg3_phy_reset(struct tg3 *tp)
  484. { DBGP("%s\n", __func__);
  485. u32 val, cpmuctrl;
  486. int err;
  487. DBGCP(&tp->pdev->dev, "%s\n", __func__);
  488. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
  489. val = tr32(GRC_MISC_CFG);
  490. tw32_f(GRC_MISC_CFG, val & ~GRC_MISC_CFG_EPHY_IDDQ);
  491. udelay(40);
  492. }
  493. err = tg3_readphy(tp, MII_BMSR, &val);
  494. err |= tg3_readphy(tp, MII_BMSR, &val);
  495. if (err != 0)
  496. return -EBUSY;
  497. netdev_link_down(tp->dev);
  498. tg3_link_report(tp);
  499. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
  500. GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
  501. GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
  502. err = tg3_phy_reset_5703_4_5(tp);
  503. if (err)
  504. return err;
  505. goto out;
  506. }
  507. cpmuctrl = 0;
  508. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 &&
  509. GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5784_AX) {
  510. cpmuctrl = tr32(TG3_CPMU_CTRL);
  511. if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY)
  512. tw32(TG3_CPMU_CTRL,
  513. cpmuctrl & ~CPMU_CTRL_GPHY_10MB_RXONLY);
  514. }
  515. err = tg3_bmcr_reset(tp);
  516. if (err)
  517. return err;
  518. if (cpmuctrl & CPMU_CTRL_GPHY_10MB_RXONLY) {
  519. val = MII_TG3_DSP_EXP8_AEDW | MII_TG3_DSP_EXP8_REJ2MHz;
  520. tg3_phydsp_write(tp, MII_TG3_DSP_EXP8, val);
  521. tw32(TG3_CPMU_CTRL, cpmuctrl);
  522. }
  523. if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX ||
  524. GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5761_AX) {
  525. val = tr32(TG3_CPMU_LSPD_1000MB_CLK);
  526. if ((val & CPMU_LSPD_1000MB_MACCLK_MASK) ==
  527. CPMU_LSPD_1000MB_MACCLK_12_5) {
  528. val &= ~CPMU_LSPD_1000MB_MACCLK_MASK;
  529. udelay(40);
  530. tw32_f(TG3_CPMU_LSPD_1000MB_CLK, val);
  531. }
  532. }
  533. if (tg3_flag(tp, 5717_PLUS) &&
  534. (tp->phy_flags & TG3_PHYFLG_MII_SERDES))
  535. return 0;
  536. tg3_phy_apply_otp(tp);
  537. out:
  538. if ((tp->phy_flags & TG3_PHYFLG_ADC_BUG) &&
  539. !TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
  540. tg3_phydsp_write(tp, 0x201f, 0x2aaa);
  541. tg3_phydsp_write(tp, 0x000a, 0x0323);
  542. TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
  543. }
  544. if (tp->phy_flags & TG3_PHYFLG_5704_A0_BUG) {
  545. tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
  546. tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
  547. }
  548. if (tp->phy_flags & TG3_PHYFLG_BER_BUG) {
  549. if (!TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
  550. tg3_phydsp_write(tp, 0x000a, 0x310b);
  551. tg3_phydsp_write(tp, 0x201f, 0x9506);
  552. tg3_phydsp_write(tp, 0x401f, 0x14e2);
  553. TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
  554. }
  555. } else if (tp->phy_flags & TG3_PHYFLG_JITTER_BUG) {
  556. if (!TG3_PHY_AUXCTL_SMDSP_ENABLE(tp)) {
  557. tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
  558. if (tp->phy_flags & TG3_PHYFLG_ADJUST_TRIM) {
  559. tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x110b);
  560. tg3_writephy(tp, MII_TG3_TEST1,
  561. MII_TG3_TEST1_TRIM_EN | 0x4);
  562. } else
  563. tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b);
  564. TG3_PHY_AUXCTL_SMDSP_DISABLE(tp);
  565. }
  566. }
  567. if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
  568. /* Cannot do read-modify-write on 5401 */
  569. tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20);
  570. }
  571. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
  572. /* adjust output voltage */
  573. tg3_writephy(tp, MII_TG3_FET_PTEST, 0x12);
  574. }
  575. tg3_phy_toggle_automdix(tp, 1);
  576. tg3_phy_set_wirespeed(tp);
  577. return 0;
  578. }
  579. static int tg3_copper_is_advertising_all(struct tg3 *tp, u32 mask)
  580. { DBGP("%s\n", __func__);
  581. u32 adv_reg, all_mask = 0;
  582. if (mask & ADVERTISED_10baseT_Half)
  583. all_mask |= ADVERTISE_10HALF;
  584. if (mask & ADVERTISED_10baseT_Full)
  585. all_mask |= ADVERTISE_10FULL;
  586. if (mask & ADVERTISED_100baseT_Half)
  587. all_mask |= ADVERTISE_100HALF;
  588. if (mask & ADVERTISED_100baseT_Full)
  589. all_mask |= ADVERTISE_100FULL;
  590. if (tg3_readphy(tp, MII_ADVERTISE, &adv_reg))
  591. return 0;
  592. if ((adv_reg & all_mask) != all_mask)
  593. return 0;
  594. if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY)) {
  595. u32 tg3_ctrl;
  596. all_mask = 0;
  597. if (mask & ADVERTISED_1000baseT_Half)
  598. all_mask |= ADVERTISE_1000HALF;
  599. if (mask & ADVERTISED_1000baseT_Full)
  600. all_mask |= ADVERTISE_1000FULL;
  601. if (tg3_readphy(tp, MII_TG3_CTRL, &tg3_ctrl))
  602. return 0;
  603. if ((tg3_ctrl & all_mask) != all_mask)
  604. return 0;
  605. }
  606. return 1;
  607. }
  608. static u16 tg3_advert_flowctrl_1000T(u8 flow_ctrl)
  609. { DBGP("%s\n", __func__);
  610. u16 miireg;
  611. if ((flow_ctrl & FLOW_CTRL_TX) && (flow_ctrl & FLOW_CTRL_RX))
  612. miireg = ADVERTISE_PAUSE_CAP;
  613. else if (flow_ctrl & FLOW_CTRL_TX)
  614. miireg = ADVERTISE_PAUSE_ASYM;
  615. else if (flow_ctrl & FLOW_CTRL_RX)
  616. miireg = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
  617. else
  618. miireg = 0;
  619. return miireg;
  620. }
  621. static int tg3_phy_autoneg_cfg(struct tg3 *tp, u32 advertise, u32 flowctrl)
  622. { DBGP("%s\n", __func__);
  623. int err = 0;
  624. u32 val __unused, new_adv;
  625. new_adv = ADVERTISE_CSMA;
  626. if (advertise & ADVERTISED_10baseT_Half)
  627. new_adv |= ADVERTISE_10HALF;
  628. if (advertise & ADVERTISED_10baseT_Full)
  629. new_adv |= ADVERTISE_10FULL;
  630. if (advertise & ADVERTISED_100baseT_Half)
  631. new_adv |= ADVERTISE_100HALF;
  632. if (advertise & ADVERTISED_100baseT_Full)
  633. new_adv |= ADVERTISE_100FULL;
  634. new_adv |= tg3_advert_flowctrl_1000T(flowctrl);
  635. err = tg3_writephy(tp, MII_ADVERTISE, new_adv);
  636. if (err)
  637. goto done;
  638. if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
  639. goto done;
  640. new_adv = 0;
  641. if (advertise & ADVERTISED_1000baseT_Half)
  642. new_adv |= MII_TG3_CTRL_ADV_1000_HALF;
  643. if (advertise & ADVERTISED_1000baseT_Full)
  644. new_adv |= MII_TG3_CTRL_ADV_1000_FULL;
  645. if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
  646. tp->pci_chip_rev_id == CHIPREV_ID_5701_B0)
  647. new_adv |= (MII_TG3_CTRL_AS_MASTER |
  648. MII_TG3_CTRL_ENABLE_AS_MASTER);
  649. err = tg3_writephy(tp, MII_TG3_CTRL, new_adv);
  650. if (err)
  651. goto done;
  652. if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP))
  653. goto done;
  654. done:
  655. return err;
  656. }
  657. static int tg3_init_5401phy_dsp(struct tg3 *tp)
  658. { DBGP("%s\n", __func__);
  659. int err;
  660. /* Turn off tap power management. */
  661. /* Set Extended packet length bit */
  662. err = tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20);
  663. err |= tg3_phydsp_write(tp, 0x0012, 0x1804);
  664. err |= tg3_phydsp_write(tp, 0x0013, 0x1204);
  665. err |= tg3_phydsp_write(tp, 0x8006, 0x0132);
  666. err |= tg3_phydsp_write(tp, 0x8006, 0x0232);
  667. err |= tg3_phydsp_write(tp, 0x201f, 0x0a20);
  668. udelay(40);
  669. return err;
  670. }
  671. #define ADVERTISED_Autoneg (1 << 6)
  672. #define ADVERTISED_Pause (1 << 13)
  673. #define ADVERTISED_TP (1 << 7)
  674. #define ADVERTISED_FIBRE (1 << 10)
  675. #define AUTONEG_ENABLE 0x01
  676. static void tg3_phy_init_link_config(struct tg3 *tp)
  677. { DBGP("%s\n", __func__);
  678. u32 adv = ADVERTISED_Autoneg |
  679. ADVERTISED_Pause;
  680. if (!(tp->phy_flags & TG3_PHYFLG_10_100_ONLY))
  681. adv |= ADVERTISED_1000baseT_Half |
  682. ADVERTISED_1000baseT_Full;
  683. if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES))
  684. adv |= ADVERTISED_100baseT_Half |
  685. ADVERTISED_100baseT_Full |
  686. ADVERTISED_10baseT_Half |
  687. ADVERTISED_10baseT_Full |
  688. ADVERTISED_TP;
  689. else
  690. adv |= ADVERTISED_FIBRE;
  691. tp->link_config.advertising = adv;
  692. tp->link_config.speed = SPEED_INVALID;
  693. tp->link_config.duplex = DUPLEX_INVALID;
  694. tp->link_config.autoneg = AUTONEG_ENABLE;
  695. tp->link_config.active_speed = SPEED_INVALID;
  696. tp->link_config.active_duplex = DUPLEX_INVALID;
  697. tp->link_config.orig_speed = SPEED_INVALID;
  698. tp->link_config.orig_duplex = DUPLEX_INVALID;
  699. tp->link_config.orig_autoneg = AUTONEG_INVALID;
  700. }
  701. int tg3_phy_probe(struct tg3 *tp)
  702. { DBGP("%s\n", __func__);
  703. u32 hw_phy_id_1, hw_phy_id_2;
  704. u32 hw_phy_id, hw_phy_id_masked;
  705. int err;
  706. /* flow control autonegotiation is default behavior */
  707. tg3_flag_set(tp, PAUSE_AUTONEG);
  708. tp->link_config.flowctrl = FLOW_CTRL_TX | FLOW_CTRL_RX;
  709. /* Reading the PHY ID register can conflict with ASF
  710. * firmware access to the PHY hardware.
  711. */
  712. err = 0;
  713. if (tg3_flag(tp, ENABLE_ASF) || tg3_flag(tp, ENABLE_APE)) {
  714. hw_phy_id = hw_phy_id_masked = TG3_PHY_ID_INVALID;
  715. } else {
  716. /* Now read the physical PHY_ID from the chip and verify
  717. * that it is sane. If it doesn't look good, we fall back
  718. * to either the hard-coded table based PHY_ID and failing
  719. * that the value found in the eeprom area.
  720. */
  721. err |= tg3_readphy(tp, MII_PHYSID1, &hw_phy_id_1);
  722. err |= tg3_readphy(tp, MII_PHYSID2, &hw_phy_id_2);
  723. hw_phy_id = (hw_phy_id_1 & 0xffff) << 10;
  724. hw_phy_id |= (hw_phy_id_2 & 0xfc00) << 16;
  725. hw_phy_id |= (hw_phy_id_2 & 0x03ff) << 0;
  726. hw_phy_id_masked = hw_phy_id & TG3_PHY_ID_MASK;
  727. }
  728. if (!err && TG3_KNOWN_PHY_ID(hw_phy_id_masked)) {
  729. tp->phy_id = hw_phy_id;
  730. if (hw_phy_id_masked == TG3_PHY_ID_BCM8002)
  731. tp->phy_flags |= TG3_PHYFLG_PHY_SERDES;
  732. else
  733. tp->phy_flags &= ~TG3_PHYFLG_PHY_SERDES;
  734. } else {
  735. if (tp->phy_id != TG3_PHY_ID_INVALID) {
  736. /* Do nothing, phy ID already set up in
  737. * tg3_get_eeprom_hw_cfg().
  738. */
  739. } else {
  740. struct subsys_tbl_ent *p;
  741. /* No eeprom signature? Try the hardcoded
  742. * subsys device table.
  743. */
  744. p = tg3_lookup_by_subsys(tp);
  745. if (!p) {
  746. DBGC(&tp->pdev->dev, "lookup by subsys failed\n");
  747. return -ENODEV;
  748. }
  749. tp->phy_id = p->phy_id;
  750. if (!tp->phy_id ||
  751. tp->phy_id == TG3_PHY_ID_BCM8002)
  752. tp->phy_flags |= TG3_PHYFLG_PHY_SERDES;
  753. }
  754. }
  755. if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) &&
  756. ((tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 &&
  757. tp->pci_chip_rev_id != CHIPREV_ID_5717_A0) ||
  758. (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765 &&
  759. tp->pci_chip_rev_id != CHIPREV_ID_57765_A0)))
  760. tp->phy_flags |= TG3_PHYFLG_EEE_CAP;
  761. tg3_phy_init_link_config(tp);
  762. if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) &&
  763. !tg3_flag(tp, ENABLE_APE) &&
  764. !tg3_flag(tp, ENABLE_ASF)) {
  765. u32 bmsr;
  766. u32 mask;
  767. tg3_readphy(tp, MII_BMSR, &bmsr);
  768. if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
  769. (bmsr & BMSR_LSTATUS))
  770. goto skip_phy_reset;
  771. err = tg3_phy_reset(tp);
  772. if (err)
  773. return err;
  774. tg3_phy_set_wirespeed(tp);
  775. mask = (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
  776. ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
  777. ADVERTISED_1000baseT_Half | ADVERTISED_1000baseT_Full);
  778. if (!tg3_copper_is_advertising_all(tp, mask)) {
  779. tg3_phy_autoneg_cfg(tp, tp->link_config.advertising,
  780. tp->link_config.flowctrl);
  781. tg3_writephy(tp, MII_BMCR,
  782. BMCR_ANENABLE | BMCR_ANRESTART);
  783. }
  784. }
  785. skip_phy_reset:
  786. if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
  787. err = tg3_init_5401phy_dsp(tp);
  788. if (err)
  789. return err;
  790. err = tg3_init_5401phy_dsp(tp);
  791. }
  792. return err;
  793. }
  794. void tg3_poll_link(struct tg3 *tp)
  795. { DBGP("%s\n", __func__);
  796. u32 mac_stat;
  797. mac_stat = tr32(MAC_STATUS);
  798. if (mac_stat & MAC_STATUS_LNKSTATE_CHANGED)
  799. tg3_setup_phy(tp, 0);
  800. }
  801. static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex)
  802. { DBGP("%s\n", __func__);
  803. switch (val & MII_TG3_AUX_STAT_SPDMASK) {
  804. case MII_TG3_AUX_STAT_10HALF:
  805. *speed = SPEED_10;
  806. *duplex = DUPLEX_HALF;
  807. break;
  808. case MII_TG3_AUX_STAT_10FULL:
  809. *speed = SPEED_10;
  810. *duplex = DUPLEX_FULL;
  811. break;
  812. case MII_TG3_AUX_STAT_100HALF:
  813. *speed = SPEED_100;
  814. *duplex = DUPLEX_HALF;
  815. break;
  816. case MII_TG3_AUX_STAT_100FULL:
  817. *speed = SPEED_100;
  818. *duplex = DUPLEX_FULL;
  819. break;
  820. case MII_TG3_AUX_STAT_1000HALF:
  821. *speed = SPEED_1000;
  822. *duplex = DUPLEX_HALF;
  823. break;
  824. case MII_TG3_AUX_STAT_1000FULL:
  825. *speed = SPEED_1000;
  826. *duplex = DUPLEX_FULL;
  827. break;
  828. default:
  829. if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
  830. *speed = (val & MII_TG3_AUX_STAT_100) ? SPEED_100 :
  831. SPEED_10;
  832. *duplex = (val & MII_TG3_AUX_STAT_FULL) ? DUPLEX_FULL :
  833. DUPLEX_HALF;
  834. break;
  835. }
  836. *speed = SPEED_INVALID;
  837. *duplex = DUPLEX_INVALID;
  838. break;
  839. }
  840. }
  841. static int tg3_adv_1000T_flowctrl_ok(struct tg3 *tp, u32 *lcladv, u32 *rmtadv)
  842. { DBGP("%s\n", __func__);
  843. u32 curadv, reqadv;
  844. if (tg3_readphy(tp, MII_ADVERTISE, lcladv))
  845. return 1;
  846. curadv = *lcladv & (ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
  847. reqadv = tg3_advert_flowctrl_1000T(tp->link_config.flowctrl);
  848. if (tp->link_config.active_duplex == DUPLEX_FULL) {
  849. if (curadv != reqadv)
  850. return 0;
  851. if (tg3_flag(tp, PAUSE_AUTONEG))
  852. tg3_readphy(tp, MII_LPA, rmtadv);
  853. } else {
  854. /* Reprogram the advertisement register, even if it
  855. * does not affect the current link. If the link
  856. * gets renegotiated in the future, we can save an
  857. * additional renegotiation cycle by advertising
  858. * it correctly in the first place.
  859. */
  860. if (curadv != reqadv) {
  861. *lcladv &= ~(ADVERTISE_PAUSE_CAP |
  862. ADVERTISE_PAUSE_ASYM);
  863. tg3_writephy(tp, MII_ADVERTISE, *lcladv | reqadv);
  864. }
  865. }
  866. return 1;
  867. }
  868. static u8 tg3_resolve_flowctrl_1000X(u16 lcladv, u16 rmtadv)
  869. { DBGP("%s\n", __func__);
  870. u8 cap = 0;
  871. if (lcladv & ADVERTISE_1000XPAUSE) {
  872. if (lcladv & ADVERTISE_1000XPSE_ASYM) {
  873. if (rmtadv & LPA_1000XPAUSE)
  874. cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
  875. else if (rmtadv & LPA_1000XPAUSE_ASYM)
  876. cap = FLOW_CTRL_RX;
  877. } else {
  878. if (rmtadv & LPA_1000XPAUSE)
  879. cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
  880. }
  881. } else if (lcladv & ADVERTISE_1000XPSE_ASYM) {
  882. if ((rmtadv & LPA_1000XPAUSE) && (rmtadv & LPA_1000XPAUSE_ASYM))
  883. cap = FLOW_CTRL_TX;
  884. }
  885. return cap;
  886. }
  887. static void tg3_setup_flow_control(struct tg3 *tp, u32 lcladv, u32 rmtadv)
  888. { DBGP("%s\n", __func__);
  889. u8 autoneg;
  890. u8 flowctrl = 0;
  891. u32 old_rx_mode = tp->rx_mode;
  892. u32 old_tx_mode = tp->tx_mode;
  893. autoneg = tp->link_config.autoneg;
  894. if (tg3_flag(tp, PAUSE_AUTONEG)) {
  895. if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)
  896. flowctrl = tg3_resolve_flowctrl_1000X(lcladv, rmtadv);
  897. else
  898. flowctrl = mii_resolve_flowctrl_fdx(lcladv, rmtadv);
  899. } else
  900. flowctrl = tp->link_config.flowctrl;
  901. tp->link_config.active_flowctrl = flowctrl;
  902. if (flowctrl & FLOW_CTRL_RX)
  903. tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE;
  904. else
  905. tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE;
  906. if (old_rx_mode != tp->rx_mode)
  907. tw32_f(MAC_RX_MODE, tp->rx_mode);
  908. if (flowctrl & FLOW_CTRL_TX)
  909. tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE;
  910. else
  911. tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE;
  912. if (old_tx_mode != tp->tx_mode)
  913. tw32_f(MAC_TX_MODE, tp->tx_mode);
  914. }
  915. static void tg3_phy_copper_begin(struct tg3 *tp)
  916. { DBGP("%s\n", __func__);
  917. u32 new_adv;
  918. if (tp->link_config.speed == SPEED_INVALID) {
  919. if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
  920. tp->link_config.advertising &=
  921. ~(ADVERTISED_1000baseT_Half |
  922. ADVERTISED_1000baseT_Full);
  923. tg3_phy_autoneg_cfg(tp, tp->link_config.advertising,
  924. tp->link_config.flowctrl);
  925. } else {
  926. /* Asking for a specific link mode. */
  927. if (tp->link_config.speed == SPEED_1000) {
  928. if (tp->link_config.duplex == DUPLEX_FULL)
  929. new_adv = ADVERTISED_1000baseT_Full;
  930. else
  931. new_adv = ADVERTISED_1000baseT_Half;
  932. } else if (tp->link_config.speed == SPEED_100) {
  933. if (tp->link_config.duplex == DUPLEX_FULL)
  934. new_adv = ADVERTISED_100baseT_Full;
  935. else
  936. new_adv = ADVERTISED_100baseT_Half;
  937. } else {
  938. if (tp->link_config.duplex == DUPLEX_FULL)
  939. new_adv = ADVERTISED_10baseT_Full;
  940. else
  941. new_adv = ADVERTISED_10baseT_Half;
  942. }
  943. tg3_phy_autoneg_cfg(tp, new_adv,
  944. tp->link_config.flowctrl);
  945. }
  946. tg3_writephy(tp, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
  947. }
  948. static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed)
  949. { DBGP("%s\n", __func__);
  950. if (tp->led_ctrl == LED_CTRL_MODE_PHY_2)
  951. return 1;
  952. else if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411) {
  953. if (speed != SPEED_10)
  954. return 1;
  955. } else if (speed == SPEED_10)
  956. return 1;
  957. return 0;
  958. }
  959. #if 1
  960. static void tg3_ump_link_report(struct tg3 *tp)
  961. { DBGP("%s\n", __func__);
  962. u32 reg;
  963. u32 val;
  964. if (!tg3_flag(tp, 5780_CLASS) || !tg3_flag(tp, ENABLE_ASF))
  965. return;
  966. tg3_wait_for_event_ack(tp);
  967. tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_LINK_UPDATE);
  968. tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 14);
  969. val = 0;
  970. if (!tg3_readphy(tp, MII_BMCR, &reg))
  971. val = reg << 16;
  972. if (!tg3_readphy(tp, MII_BMSR, &reg))
  973. val |= (reg & 0xffff);
  974. tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, val);
  975. val = 0;
  976. if (!tg3_readphy(tp, MII_ADVERTISE, &reg))
  977. val = reg << 16;
  978. if (!tg3_readphy(tp, MII_LPA, &reg))
  979. val |= (reg & 0xffff);
  980. tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 4, val);
  981. val = 0;
  982. if (!(tp->phy_flags & TG3_PHYFLG_MII_SERDES)) {
  983. if (!tg3_readphy(tp, MII_CTRL1000, &reg))
  984. val = reg << 16;
  985. if (!tg3_readphy(tp, MII_STAT1000, &reg))
  986. val |= (reg & 0xffff);
  987. }
  988. tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 8, val);
  989. if (!tg3_readphy(tp, MII_PHYADDR, &reg))
  990. val = reg << 16;
  991. else
  992. val = 0;
  993. tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 12, val);
  994. tg3_generate_fw_event(tp);
  995. }
  996. /* NOTE: Debugging only code */
  997. static void tg3_link_report(struct tg3 *tp)
  998. { DBGP("%s\n", __func__);
  999. if (!netdev_link_ok(tp->dev)) {
  1000. DBGC(tp->dev, "Link is down\n");
  1001. tg3_ump_link_report(tp);
  1002. } else {
  1003. DBGC(tp->dev, "Link is up at %d Mbps, %s duplex\n",
  1004. (tp->link_config.active_speed == SPEED_1000 ?
  1005. 1000 :
  1006. (tp->link_config.active_speed == SPEED_100 ?
  1007. 100 : 10)),
  1008. (tp->link_config.active_duplex == DUPLEX_FULL ?
  1009. "full" : "half"));
  1010. DBGC(tp->dev, "Flow control is %s for TX and %s for RX\n",
  1011. (tp->link_config.active_flowctrl & FLOW_CTRL_TX) ?
  1012. "on" : "off",
  1013. (tp->link_config.active_flowctrl & FLOW_CTRL_RX) ?
  1014. "on" : "off");
  1015. if (tp->phy_flags & TG3_PHYFLG_EEE_CAP)
  1016. DBGC(tp->dev, "EEE is %s\n",
  1017. tp->setlpicnt ? "enabled" : "disabled");
  1018. tg3_ump_link_report(tp);
  1019. }
  1020. }
  1021. #endif
  1022. static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
  1023. { DBGP("%s\n", __func__);
  1024. int current_link_up;
  1025. u32 bmsr, val;
  1026. u32 lcl_adv, rmt_adv;
  1027. u16 current_speed;
  1028. u8 current_duplex;
  1029. int i, err;
  1030. tw32(MAC_EVENT, 0);
  1031. tw32_f(MAC_STATUS,
  1032. (MAC_STATUS_SYNC_CHANGED |
  1033. MAC_STATUS_CFG_CHANGED |
  1034. MAC_STATUS_MI_COMPLETION |
  1035. MAC_STATUS_LNKSTATE_CHANGED));
  1036. udelay(40);
  1037. if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
  1038. tw32_f(MAC_MI_MODE,
  1039. (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
  1040. udelay(80);
  1041. }
  1042. tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_PWRCTL, 0);
  1043. /* Some third-party PHYs need to be reset on link going
  1044. * down.
  1045. */
  1046. if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
  1047. GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
  1048. GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
  1049. netdev_link_ok(tp->dev)) {
  1050. tg3_readphy(tp, MII_BMSR, &bmsr);
  1051. if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
  1052. !(bmsr & BMSR_LSTATUS))
  1053. force_reset = 1;
  1054. }
  1055. if (force_reset)
  1056. tg3_phy_reset(tp);
  1057. if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
  1058. tg3_readphy(tp, MII_BMSR, &bmsr);
  1059. if (tg3_readphy(tp, MII_BMSR, &bmsr) ||
  1060. !tg3_flag(tp, INIT_COMPLETE))
  1061. bmsr = 0;
  1062. if (!(bmsr & BMSR_LSTATUS)) {
  1063. err = tg3_init_5401phy_dsp(tp);
  1064. if (err)
  1065. return err;
  1066. tg3_readphy(tp, MII_BMSR, &bmsr);
  1067. for (i = 0; i < 1000; i++) {
  1068. udelay(10);
  1069. if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
  1070. (bmsr & BMSR_LSTATUS)) {
  1071. udelay(40);
  1072. break;
  1073. }
  1074. }
  1075. if ((tp->phy_id & TG3_PHY_ID_REV_MASK) ==
  1076. TG3_PHY_REV_BCM5401_B0 &&
  1077. !(bmsr & BMSR_LSTATUS) &&
  1078. tp->link_config.active_speed == SPEED_1000) {
  1079. err = tg3_phy_reset(tp);
  1080. if (!err)
  1081. err = tg3_init_5401phy_dsp(tp);
  1082. if (err)
  1083. return err;
  1084. }
  1085. }
  1086. } else if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
  1087. tp->pci_chip_rev_id == CHIPREV_ID_5701_B0) {
  1088. /* 5701 {A0,B0} CRC bug workaround */
  1089. tg3_writephy(tp, 0x15, 0x0a75);
  1090. tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68);
  1091. tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
  1092. tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68);
  1093. }
  1094. /* Clear pending interrupts... */
  1095. tg3_readphy(tp, MII_TG3_ISTAT, &val);
  1096. tg3_readphy(tp, MII_TG3_ISTAT, &val);
  1097. if (tp->phy_flags & TG3_PHYFLG_USE_MI_INTERRUPT)
  1098. tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG);
  1099. else if (!(tp->phy_flags & TG3_PHYFLG_IS_FET))
  1100. tg3_writephy(tp, MII_TG3_IMASK, ~0);
  1101. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
  1102. GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
  1103. if (tp->led_ctrl == LED_CTRL_MODE_PHY_1)
  1104. tg3_writephy(tp, MII_TG3_EXT_CTRL,
  1105. MII_TG3_EXT_CTRL_LNK3_LED_MODE);
  1106. else
  1107. tg3_writephy(tp, MII_TG3_EXT_CTRL, 0);
  1108. }
  1109. current_link_up = 0;
  1110. current_speed = SPEED_INVALID;
  1111. current_duplex = DUPLEX_INVALID;
  1112. if (tp->phy_flags & TG3_PHYFLG_CAPACITIVE_COUPLING) {
  1113. err = tg3_phy_auxctl_read(tp,
  1114. MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
  1115. &val);
  1116. if (!err && !(val & (1 << 10))) {
  1117. tg3_phy_auxctl_write(tp,
  1118. MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
  1119. val | (1 << 10));
  1120. goto relink;
  1121. }
  1122. }
  1123. bmsr = 0;
  1124. for (i = 0; i < 100; i++) {
  1125. tg3_readphy(tp, MII_BMSR, &bmsr);
  1126. if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
  1127. (bmsr & BMSR_LSTATUS))
  1128. break;
  1129. udelay(40);
  1130. }
  1131. if (bmsr & BMSR_LSTATUS) {
  1132. u32 aux_stat, bmcr;
  1133. tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
  1134. for (i = 0; i < 2000; i++) {
  1135. udelay(10);
  1136. if (!tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat) &&
  1137. aux_stat)
  1138. break;
  1139. }
  1140. tg3_aux_stat_to_speed_duplex(tp, aux_stat,
  1141. &current_speed,
  1142. &current_duplex);
  1143. bmcr = 0;
  1144. for (i = 0; i < 200; i++) {
  1145. tg3_readphy(tp, MII_BMCR, &bmcr);
  1146. if (tg3_readphy(tp, MII_BMCR, &bmcr))
  1147. continue;
  1148. if (bmcr && bmcr != 0x7fff)
  1149. break;
  1150. udelay(10);
  1151. }
  1152. lcl_adv = 0;
  1153. rmt_adv = 0;
  1154. tp->link_config.active_speed = current_speed;
  1155. tp->link_config.active_duplex = current_duplex;
  1156. if ((bmcr & BMCR_ANENABLE) &&
  1157. tg3_copper_is_advertising_all(tp,
  1158. tp->link_config.advertising)) {
  1159. if (tg3_adv_1000T_flowctrl_ok(tp, &lcl_adv,
  1160. &rmt_adv)) {
  1161. current_link_up = 1;
  1162. }
  1163. }
  1164. if (current_link_up == 1 &&
  1165. tp->link_config.active_duplex == DUPLEX_FULL)
  1166. tg3_setup_flow_control(tp, lcl_adv, rmt_adv);
  1167. }
  1168. relink:
  1169. if (current_link_up == 0) {
  1170. tg3_phy_copper_begin(tp);
  1171. tg3_readphy(tp, MII_BMSR, &bmsr);
  1172. if ((!tg3_readphy(tp, MII_BMSR, &bmsr) && (bmsr & BMSR_LSTATUS)) ||
  1173. (tp->mac_mode & MAC_MODE_PORT_INT_LPBACK))
  1174. current_link_up = 1;
  1175. }
  1176. tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK;
  1177. if (current_link_up == 1) {
  1178. if (tp->link_config.active_speed == SPEED_100 ||
  1179. tp->link_config.active_speed == SPEED_10)
  1180. tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
  1181. else
  1182. tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
  1183. } else if (tp->phy_flags & TG3_PHYFLG_IS_FET)
  1184. tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
  1185. else
  1186. tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
  1187. tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
  1188. if (tp->link_config.active_duplex == DUPLEX_HALF)
  1189. tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
  1190. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) {
  1191. if (current_link_up == 1 &&
  1192. tg3_5700_link_polarity(tp, tp->link_config.active_speed))
  1193. tp->mac_mode |= MAC_MODE_LINK_POLARITY;
  1194. else
  1195. tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
  1196. }
  1197. /* ??? Without this setting Netgear GA302T PHY does not
  1198. * ??? send/receive packets...
  1199. */
  1200. if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411 &&
  1201. tp->pci_chip_rev_id == CHIPREV_ID_5700_ALTIMA) {
  1202. tp->mi_mode |= MAC_MI_MODE_AUTO_POLL;
  1203. tw32_f(MAC_MI_MODE, tp->mi_mode);
  1204. udelay(80);
  1205. }
  1206. tw32_f(MAC_MODE, tp->mac_mode);
  1207. udelay(40);
  1208. /* We always use the link change register */
  1209. /* NOTE: this freezes for mdc? */
  1210. tw32_f(MAC_EVENT, 0);
  1211. udelay(40);
  1212. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 &&
  1213. current_link_up == 1 &&
  1214. tp->link_config.active_speed == SPEED_1000 &&
  1215. (tg3_flag(tp, PCIX_MODE) || tg3_flag(tp, PCI_HIGH_SPEED))) {
  1216. udelay(120);
  1217. /* NOTE: this freezes for mdc? */
  1218. tw32_f(MAC_STATUS,
  1219. (MAC_STATUS_SYNC_CHANGED |
  1220. MAC_STATUS_CFG_CHANGED));
  1221. udelay(40);
  1222. tg3_write_mem(tp,
  1223. NIC_SRAM_FIRMWARE_MBOX,
  1224. NIC_SRAM_FIRMWARE_MBOX_MAGIC2);
  1225. }
  1226. /* Prevent send BD corruption. */
  1227. if (tg3_flag(tp, CLKREQ_BUG)) {
  1228. u16 oldlnkctl, newlnkctl;
  1229. pci_read_config_word(tp->pdev,
  1230. tp->pcie_cap + PCI_EXP_LNKCTL,
  1231. &oldlnkctl);
  1232. if (tp->link_config.active_speed == SPEED_100 ||
  1233. tp->link_config.active_speed == SPEED_10)
  1234. newlnkctl = oldlnkctl & ~PCI_EXP_LNKCTL_CLKREQ_EN;
  1235. else
  1236. newlnkctl = oldlnkctl | PCI_EXP_LNKCTL_CLKREQ_EN;
  1237. if (newlnkctl != oldlnkctl)
  1238. pci_write_config_word(tp->pdev,
  1239. tp->pcie_cap + PCI_EXP_LNKCTL,
  1240. newlnkctl);
  1241. }
  1242. if (current_link_up != netdev_link_ok(tp->dev)) {
  1243. if (current_link_up)
  1244. netdev_link_up(tp->dev);
  1245. else
  1246. netdev_link_down(tp->dev);
  1247. tg3_link_report(tp);
  1248. }
  1249. return 0;
  1250. }
  1251. int tg3_setup_phy(struct tg3 *tp, int force_reset)
  1252. { DBGP("%s\n", __func__);
  1253. u32 val;
  1254. int err;
  1255. #if 0
  1256. if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
  1257. err = tg3_setup_fiber_phy(tp, force_reset);
  1258. else if (tp->phy_flags & TG3_PHYFLG_MII_SERDES)
  1259. err = tg3_setup_fiber_mii_phy(tp, force_reset);
  1260. else
  1261. #endif
  1262. /* FIXME: add only copper phy variants for now */
  1263. err = tg3_setup_copper_phy(tp, force_reset);
  1264. val = (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
  1265. (6 << TX_LENGTHS_IPG_SHIFT);
  1266. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
  1267. val |= tr32(MAC_TX_LENGTHS) &
  1268. (TX_LENGTHS_JMB_FRM_LEN_MSK |
  1269. TX_LENGTHS_CNT_DWN_VAL_MSK);
  1270. if (tp->link_config.active_speed == SPEED_1000 &&
  1271. tp->link_config.active_duplex == DUPLEX_HALF)
  1272. tw32(MAC_TX_LENGTHS, val |
  1273. (0xff << TX_LENGTHS_SLOT_TIME_SHIFT));
  1274. else
  1275. tw32(MAC_TX_LENGTHS, val |
  1276. (32 << TX_LENGTHS_SLOT_TIME_SHIFT));
  1277. if (!tg3_flag(tp, 5705_PLUS)) {
  1278. if (netdev_link_ok(tp->dev)) {
  1279. tw32(HOSTCC_STAT_COAL_TICKS, DEFAULT_STAT_COAL_TICKS);
  1280. } else {
  1281. tw32(HOSTCC_STAT_COAL_TICKS, 0);
  1282. }
  1283. }
  1284. val = tr32(PCIE_PWR_MGMT_THRESH);
  1285. if (!netdev_link_ok(tp->dev))
  1286. val = (val & ~PCIE_PWR_MGMT_L1_THRESH_MSK);
  1287. else
  1288. val |= PCIE_PWR_MGMT_L1_THRESH_MSK;
  1289. tw32(PCIE_PWR_MGMT_THRESH, val);
  1290. return err;
  1291. }