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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603
  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. if (tp->hw_status->status & SD_STATUS_LINK_CHG) {
  797. DBGC(tp->dev,"link_changed\n");
  798. tp->hw_status->status &= ~SD_STATUS_LINK_CHG;
  799. tg3_setup_phy(tp, 0);
  800. }
  801. }
  802. static void tg3_aux_stat_to_speed_duplex(struct tg3 *tp, u32 val, u16 *speed, u8 *duplex)
  803. { DBGP("%s\n", __func__);
  804. switch (val & MII_TG3_AUX_STAT_SPDMASK) {
  805. case MII_TG3_AUX_STAT_10HALF:
  806. *speed = SPEED_10;
  807. *duplex = DUPLEX_HALF;
  808. break;
  809. case MII_TG3_AUX_STAT_10FULL:
  810. *speed = SPEED_10;
  811. *duplex = DUPLEX_FULL;
  812. break;
  813. case MII_TG3_AUX_STAT_100HALF:
  814. *speed = SPEED_100;
  815. *duplex = DUPLEX_HALF;
  816. break;
  817. case MII_TG3_AUX_STAT_100FULL:
  818. *speed = SPEED_100;
  819. *duplex = DUPLEX_FULL;
  820. break;
  821. case MII_TG3_AUX_STAT_1000HALF:
  822. *speed = SPEED_1000;
  823. *duplex = DUPLEX_HALF;
  824. break;
  825. case MII_TG3_AUX_STAT_1000FULL:
  826. *speed = SPEED_1000;
  827. *duplex = DUPLEX_FULL;
  828. break;
  829. default:
  830. if (tp->phy_flags & TG3_PHYFLG_IS_FET) {
  831. *speed = (val & MII_TG3_AUX_STAT_100) ? SPEED_100 :
  832. SPEED_10;
  833. *duplex = (val & MII_TG3_AUX_STAT_FULL) ? DUPLEX_FULL :
  834. DUPLEX_HALF;
  835. break;
  836. }
  837. *speed = SPEED_INVALID;
  838. *duplex = DUPLEX_INVALID;
  839. break;
  840. }
  841. }
  842. static int tg3_adv_1000T_flowctrl_ok(struct tg3 *tp, u32 *lcladv, u32 *rmtadv)
  843. { DBGP("%s\n", __func__);
  844. u32 curadv, reqadv;
  845. if (tg3_readphy(tp, MII_ADVERTISE, lcladv))
  846. return 1;
  847. curadv = *lcladv & (ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);
  848. reqadv = tg3_advert_flowctrl_1000T(tp->link_config.flowctrl);
  849. if (tp->link_config.active_duplex == DUPLEX_FULL) {
  850. if (curadv != reqadv)
  851. return 0;
  852. if (tg3_flag(tp, PAUSE_AUTONEG))
  853. tg3_readphy(tp, MII_LPA, rmtadv);
  854. } else {
  855. /* Reprogram the advertisement register, even if it
  856. * does not affect the current link. If the link
  857. * gets renegotiated in the future, we can save an
  858. * additional renegotiation cycle by advertising
  859. * it correctly in the first place.
  860. */
  861. if (curadv != reqadv) {
  862. *lcladv &= ~(ADVERTISE_PAUSE_CAP |
  863. ADVERTISE_PAUSE_ASYM);
  864. tg3_writephy(tp, MII_ADVERTISE, *lcladv | reqadv);
  865. }
  866. }
  867. return 1;
  868. }
  869. static u8 tg3_resolve_flowctrl_1000X(u16 lcladv, u16 rmtadv)
  870. { DBGP("%s\n", __func__);
  871. u8 cap = 0;
  872. if (lcladv & ADVERTISE_1000XPAUSE) {
  873. if (lcladv & ADVERTISE_1000XPSE_ASYM) {
  874. if (rmtadv & LPA_1000XPAUSE)
  875. cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
  876. else if (rmtadv & LPA_1000XPAUSE_ASYM)
  877. cap = FLOW_CTRL_RX;
  878. } else {
  879. if (rmtadv & LPA_1000XPAUSE)
  880. cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
  881. }
  882. } else if (lcladv & ADVERTISE_1000XPSE_ASYM) {
  883. if ((rmtadv & LPA_1000XPAUSE) && (rmtadv & LPA_1000XPAUSE_ASYM))
  884. cap = FLOW_CTRL_TX;
  885. }
  886. return cap;
  887. }
  888. static void tg3_setup_flow_control(struct tg3 *tp, u32 lcladv, u32 rmtadv)
  889. { DBGP("%s\n", __func__);
  890. u8 flowctrl = 0;
  891. u32 old_rx_mode = tp->rx_mode;
  892. u32 old_tx_mode = tp->tx_mode;
  893. if (tg3_flag(tp, PAUSE_AUTONEG)) {
  894. if (tp->phy_flags & TG3_PHYFLG_ANY_SERDES)
  895. flowctrl = tg3_resolve_flowctrl_1000X(lcladv, rmtadv);
  896. else
  897. flowctrl = mii_resolve_flowctrl_fdx(lcladv, rmtadv);
  898. } else
  899. flowctrl = tp->link_config.flowctrl;
  900. tp->link_config.active_flowctrl = flowctrl;
  901. if (flowctrl & FLOW_CTRL_RX)
  902. tp->rx_mode |= RX_MODE_FLOW_CTRL_ENABLE;
  903. else
  904. tp->rx_mode &= ~RX_MODE_FLOW_CTRL_ENABLE;
  905. if (old_rx_mode != tp->rx_mode)
  906. tw32_f(MAC_RX_MODE, tp->rx_mode);
  907. if (flowctrl & FLOW_CTRL_TX)
  908. tp->tx_mode |= TX_MODE_FLOW_CTRL_ENABLE;
  909. else
  910. tp->tx_mode &= ~TX_MODE_FLOW_CTRL_ENABLE;
  911. if (old_tx_mode != tp->tx_mode)
  912. tw32_f(MAC_TX_MODE, tp->tx_mode);
  913. }
  914. static void tg3_phy_copper_begin(struct tg3 *tp)
  915. { DBGP("%s\n", __func__);
  916. u32 new_adv;
  917. if (tp->link_config.speed == SPEED_INVALID) {
  918. if (tp->phy_flags & TG3_PHYFLG_10_100_ONLY)
  919. tp->link_config.advertising &=
  920. ~(ADVERTISED_1000baseT_Half |
  921. ADVERTISED_1000baseT_Full);
  922. tg3_phy_autoneg_cfg(tp, tp->link_config.advertising,
  923. tp->link_config.flowctrl);
  924. } else {
  925. /* Asking for a specific link mode. */
  926. if (tp->link_config.speed == SPEED_1000) {
  927. if (tp->link_config.duplex == DUPLEX_FULL)
  928. new_adv = ADVERTISED_1000baseT_Full;
  929. else
  930. new_adv = ADVERTISED_1000baseT_Half;
  931. } else if (tp->link_config.speed == SPEED_100) {
  932. if (tp->link_config.duplex == DUPLEX_FULL)
  933. new_adv = ADVERTISED_100baseT_Full;
  934. else
  935. new_adv = ADVERTISED_100baseT_Half;
  936. } else {
  937. if (tp->link_config.duplex == DUPLEX_FULL)
  938. new_adv = ADVERTISED_10baseT_Full;
  939. else
  940. new_adv = ADVERTISED_10baseT_Half;
  941. }
  942. tg3_phy_autoneg_cfg(tp, new_adv,
  943. tp->link_config.flowctrl);
  944. }
  945. tg3_writephy(tp, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
  946. }
  947. static int tg3_5700_link_polarity(struct tg3 *tp, u32 speed)
  948. { DBGP("%s\n", __func__);
  949. if (tp->led_ctrl == LED_CTRL_MODE_PHY_2)
  950. return 1;
  951. else if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411) {
  952. if (speed != SPEED_10)
  953. return 1;
  954. } else if (speed == SPEED_10)
  955. return 1;
  956. return 0;
  957. }
  958. #if 1
  959. static void tg3_ump_link_report(struct tg3 *tp)
  960. { DBGP("%s\n", __func__);
  961. u32 reg;
  962. u32 val;
  963. if (!tg3_flag(tp, 5780_CLASS) || !tg3_flag(tp, ENABLE_ASF))
  964. return;
  965. tg3_wait_for_event_ack(tp);
  966. tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_LINK_UPDATE);
  967. tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 14);
  968. val = 0;
  969. if (!tg3_readphy(tp, MII_BMCR, &reg))
  970. val = reg << 16;
  971. if (!tg3_readphy(tp, MII_BMSR, &reg))
  972. val |= (reg & 0xffff);
  973. tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, val);
  974. val = 0;
  975. if (!tg3_readphy(tp, MII_ADVERTISE, &reg))
  976. val = reg << 16;
  977. if (!tg3_readphy(tp, MII_LPA, &reg))
  978. val |= (reg & 0xffff);
  979. tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 4, val);
  980. val = 0;
  981. if (!(tp->phy_flags & TG3_PHYFLG_MII_SERDES)) {
  982. if (!tg3_readphy(tp, MII_CTRL1000, &reg))
  983. val = reg << 16;
  984. if (!tg3_readphy(tp, MII_STAT1000, &reg))
  985. val |= (reg & 0xffff);
  986. }
  987. tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 8, val);
  988. if (!tg3_readphy(tp, MII_PHYADDR, &reg))
  989. val = reg << 16;
  990. else
  991. val = 0;
  992. tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 12, val);
  993. tg3_generate_fw_event(tp);
  994. }
  995. /* NOTE: Debugging only code */
  996. static void tg3_link_report(struct tg3 *tp)
  997. { DBGP("%s\n", __func__);
  998. if (!netdev_link_ok(tp->dev)) {
  999. DBGC(tp->dev, "Link is down\n");
  1000. tg3_ump_link_report(tp);
  1001. } else {
  1002. DBGC(tp->dev, "Link is up at %d Mbps, %s duplex\n",
  1003. (tp->link_config.active_speed == SPEED_1000 ?
  1004. 1000 :
  1005. (tp->link_config.active_speed == SPEED_100 ?
  1006. 100 : 10)),
  1007. (tp->link_config.active_duplex == DUPLEX_FULL ?
  1008. "full" : "half"));
  1009. DBGC(tp->dev, "Flow control is %s for TX and %s for RX\n",
  1010. (tp->link_config.active_flowctrl & FLOW_CTRL_TX) ?
  1011. "on" : "off",
  1012. (tp->link_config.active_flowctrl & FLOW_CTRL_RX) ?
  1013. "on" : "off");
  1014. if (tp->phy_flags & TG3_PHYFLG_EEE_CAP)
  1015. DBGC(tp->dev, "EEE is %s\n",
  1016. tp->setlpicnt ? "enabled" : "disabled");
  1017. tg3_ump_link_report(tp);
  1018. }
  1019. }
  1020. #endif
  1021. static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
  1022. { DBGP("%s\n", __func__);
  1023. int current_link_up;
  1024. u32 bmsr, val;
  1025. u32 lcl_adv, rmt_adv;
  1026. u16 current_speed;
  1027. u8 current_duplex;
  1028. int i, err;
  1029. tw32(MAC_EVENT, 0);
  1030. tw32_f(MAC_STATUS,
  1031. (MAC_STATUS_SYNC_CHANGED |
  1032. MAC_STATUS_CFG_CHANGED |
  1033. MAC_STATUS_MI_COMPLETION |
  1034. MAC_STATUS_LNKSTATE_CHANGED));
  1035. udelay(40);
  1036. if ((tp->mi_mode & MAC_MI_MODE_AUTO_POLL) != 0) {
  1037. tw32_f(MAC_MI_MODE,
  1038. (tp->mi_mode & ~MAC_MI_MODE_AUTO_POLL));
  1039. udelay(80);
  1040. }
  1041. tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_PWRCTL, 0);
  1042. /* Some third-party PHYs need to be reset on link going
  1043. * down.
  1044. */
  1045. if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
  1046. GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
  1047. GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) &&
  1048. netdev_link_ok(tp->dev)) {
  1049. tg3_readphy(tp, MII_BMSR, &bmsr);
  1050. if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
  1051. !(bmsr & BMSR_LSTATUS))
  1052. force_reset = 1;
  1053. }
  1054. if (force_reset)
  1055. tg3_phy_reset(tp);
  1056. if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
  1057. tg3_readphy(tp, MII_BMSR, &bmsr);
  1058. if (tg3_readphy(tp, MII_BMSR, &bmsr) ||
  1059. !tg3_flag(tp, INIT_COMPLETE))
  1060. bmsr = 0;
  1061. if (!(bmsr & BMSR_LSTATUS)) {
  1062. err = tg3_init_5401phy_dsp(tp);
  1063. if (err)
  1064. return err;
  1065. tg3_readphy(tp, MII_BMSR, &bmsr);
  1066. for (i = 0; i < 1000; i++) {
  1067. udelay(10);
  1068. if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
  1069. (bmsr & BMSR_LSTATUS)) {
  1070. udelay(40);
  1071. break;
  1072. }
  1073. }
  1074. if ((tp->phy_id & TG3_PHY_ID_REV_MASK) ==
  1075. TG3_PHY_REV_BCM5401_B0 &&
  1076. !(bmsr & BMSR_LSTATUS) &&
  1077. tp->link_config.active_speed == SPEED_1000) {
  1078. err = tg3_phy_reset(tp);
  1079. if (!err)
  1080. err = tg3_init_5401phy_dsp(tp);
  1081. if (err)
  1082. return err;
  1083. }
  1084. }
  1085. } else if (tp->pci_chip_rev_id == CHIPREV_ID_5701_A0 ||
  1086. tp->pci_chip_rev_id == CHIPREV_ID_5701_B0) {
  1087. /* 5701 {A0,B0} CRC bug workaround */
  1088. tg3_writephy(tp, 0x15, 0x0a75);
  1089. tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68);
  1090. tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8d68);
  1091. tg3_writephy(tp, MII_TG3_MISC_SHDW, 0x8c68);
  1092. }
  1093. /* Clear pending interrupts... */
  1094. tg3_readphy(tp, MII_TG3_ISTAT, &val);
  1095. tg3_readphy(tp, MII_TG3_ISTAT, &val);
  1096. if (tp->phy_flags & TG3_PHYFLG_USE_MI_INTERRUPT)
  1097. tg3_writephy(tp, MII_TG3_IMASK, ~MII_TG3_INT_LINKCHG);
  1098. else if (!(tp->phy_flags & TG3_PHYFLG_IS_FET))
  1099. tg3_writephy(tp, MII_TG3_IMASK, ~0);
  1100. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
  1101. GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
  1102. if (tp->led_ctrl == LED_CTRL_MODE_PHY_1)
  1103. tg3_writephy(tp, MII_TG3_EXT_CTRL,
  1104. MII_TG3_EXT_CTRL_LNK3_LED_MODE);
  1105. else
  1106. tg3_writephy(tp, MII_TG3_EXT_CTRL, 0);
  1107. }
  1108. current_link_up = 0;
  1109. current_speed = SPEED_INVALID;
  1110. current_duplex = DUPLEX_INVALID;
  1111. if (tp->phy_flags & TG3_PHYFLG_CAPACITIVE_COUPLING) {
  1112. err = tg3_phy_auxctl_read(tp,
  1113. MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
  1114. &val);
  1115. if (!err && !(val & (1 << 10))) {
  1116. tg3_phy_auxctl_write(tp,
  1117. MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
  1118. val | (1 << 10));
  1119. goto relink;
  1120. }
  1121. }
  1122. bmsr = 0;
  1123. for (i = 0; i < 100; i++) {
  1124. tg3_readphy(tp, MII_BMSR, &bmsr);
  1125. if (!tg3_readphy(tp, MII_BMSR, &bmsr) &&
  1126. (bmsr & BMSR_LSTATUS))
  1127. break;
  1128. udelay(40);
  1129. }
  1130. if (bmsr & BMSR_LSTATUS) {
  1131. u32 aux_stat, bmcr;
  1132. tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat);
  1133. for (i = 0; i < 2000; i++) {
  1134. udelay(10);
  1135. if (!tg3_readphy(tp, MII_TG3_AUX_STAT, &aux_stat) &&
  1136. aux_stat)
  1137. break;
  1138. }
  1139. tg3_aux_stat_to_speed_duplex(tp, aux_stat,
  1140. &current_speed,
  1141. &current_duplex);
  1142. bmcr = 0;
  1143. for (i = 0; i < 200; i++) {
  1144. tg3_readphy(tp, MII_BMCR, &bmcr);
  1145. if (tg3_readphy(tp, MII_BMCR, &bmcr))
  1146. continue;
  1147. if (bmcr && bmcr != 0x7fff)
  1148. break;
  1149. udelay(10);
  1150. }
  1151. lcl_adv = 0;
  1152. rmt_adv = 0;
  1153. tp->link_config.active_speed = current_speed;
  1154. tp->link_config.active_duplex = current_duplex;
  1155. if ((bmcr & BMCR_ANENABLE) &&
  1156. tg3_copper_is_advertising_all(tp,
  1157. tp->link_config.advertising)) {
  1158. if (tg3_adv_1000T_flowctrl_ok(tp, &lcl_adv,
  1159. &rmt_adv)) {
  1160. current_link_up = 1;
  1161. }
  1162. }
  1163. if (current_link_up == 1 &&
  1164. tp->link_config.active_duplex == DUPLEX_FULL)
  1165. tg3_setup_flow_control(tp, lcl_adv, rmt_adv);
  1166. }
  1167. relink:
  1168. if (current_link_up == 0) {
  1169. tg3_phy_copper_begin(tp);
  1170. tg3_readphy(tp, MII_BMSR, &bmsr);
  1171. if ((!tg3_readphy(tp, MII_BMSR, &bmsr) && (bmsr & BMSR_LSTATUS)) ||
  1172. (tp->mac_mode & MAC_MODE_PORT_INT_LPBACK))
  1173. current_link_up = 1;
  1174. }
  1175. tp->mac_mode &= ~MAC_MODE_PORT_MODE_MASK;
  1176. if (current_link_up == 1) {
  1177. if (tp->link_config.active_speed == SPEED_100 ||
  1178. tp->link_config.active_speed == SPEED_10)
  1179. tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
  1180. else
  1181. tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
  1182. } else if (tp->phy_flags & TG3_PHYFLG_IS_FET)
  1183. tp->mac_mode |= MAC_MODE_PORT_MODE_MII;
  1184. else
  1185. tp->mac_mode |= MAC_MODE_PORT_MODE_GMII;
  1186. tp->mac_mode &= ~MAC_MODE_HALF_DUPLEX;
  1187. if (tp->link_config.active_duplex == DUPLEX_HALF)
  1188. tp->mac_mode |= MAC_MODE_HALF_DUPLEX;
  1189. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700) {
  1190. if (current_link_up == 1 &&
  1191. tg3_5700_link_polarity(tp, tp->link_config.active_speed))
  1192. tp->mac_mode |= MAC_MODE_LINK_POLARITY;
  1193. else
  1194. tp->mac_mode &= ~MAC_MODE_LINK_POLARITY;
  1195. }
  1196. /* ??? Without this setting Netgear GA302T PHY does not
  1197. * ??? send/receive packets...
  1198. */
  1199. if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5411 &&
  1200. tp->pci_chip_rev_id == CHIPREV_ID_5700_ALTIMA) {
  1201. tp->mi_mode |= MAC_MI_MODE_AUTO_POLL;
  1202. tw32_f(MAC_MI_MODE, tp->mi_mode);
  1203. udelay(80);
  1204. }
  1205. tw32_f(MAC_MODE, tp->mac_mode);
  1206. udelay(40);
  1207. /* Enabled attention when the link has changed state. */
  1208. tw32_f(MAC_EVENT, MAC_EVENT_LNKSTATE_CHANGED);
  1209. udelay(40);
  1210. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 &&
  1211. current_link_up == 1 &&
  1212. tp->link_config.active_speed == SPEED_1000 &&
  1213. (tg3_flag(tp, PCIX_MODE) || tg3_flag(tp, PCI_HIGH_SPEED))) {
  1214. udelay(120);
  1215. /* NOTE: this freezes for mdc? */
  1216. tw32_f(MAC_STATUS,
  1217. (MAC_STATUS_SYNC_CHANGED |
  1218. MAC_STATUS_CFG_CHANGED));
  1219. udelay(40);
  1220. tg3_write_mem(tp,
  1221. NIC_SRAM_FIRMWARE_MBOX,
  1222. NIC_SRAM_FIRMWARE_MBOX_MAGIC2);
  1223. }
  1224. /* Prevent send BD corruption. */
  1225. if (tg3_flag(tp, CLKREQ_BUG)) {
  1226. u16 oldlnkctl, newlnkctl;
  1227. pci_read_config_word(tp->pdev,
  1228. tp->pcie_cap + PCI_EXP_LNKCTL,
  1229. &oldlnkctl);
  1230. if (tp->link_config.active_speed == SPEED_100 ||
  1231. tp->link_config.active_speed == SPEED_10)
  1232. newlnkctl = oldlnkctl & ~PCI_EXP_LNKCTL_CLKREQ_EN;
  1233. else
  1234. newlnkctl = oldlnkctl | PCI_EXP_LNKCTL_CLKREQ_EN;
  1235. if (newlnkctl != oldlnkctl)
  1236. pci_write_config_word(tp->pdev,
  1237. tp->pcie_cap + PCI_EXP_LNKCTL,
  1238. newlnkctl);
  1239. }
  1240. if (current_link_up != netdev_link_ok(tp->dev)) {
  1241. if (current_link_up)
  1242. netdev_link_up(tp->dev);
  1243. else
  1244. netdev_link_down(tp->dev);
  1245. tg3_link_report(tp);
  1246. }
  1247. return 0;
  1248. }
  1249. int tg3_setup_phy(struct tg3 *tp, int force_reset)
  1250. { DBGP("%s\n", __func__);
  1251. u32 val;
  1252. int err;
  1253. #if 0
  1254. if (tp->phy_flags & TG3_PHYFLG_PHY_SERDES)
  1255. err = tg3_setup_fiber_phy(tp, force_reset);
  1256. else if (tp->phy_flags & TG3_PHYFLG_MII_SERDES)
  1257. err = tg3_setup_fiber_mii_phy(tp, force_reset);
  1258. else
  1259. #endif
  1260. /* FIXME: add only copper phy variants for now */
  1261. err = tg3_setup_copper_phy(tp, force_reset);
  1262. val = (2 << TX_LENGTHS_IPG_CRS_SHIFT) |
  1263. (6 << TX_LENGTHS_IPG_SHIFT);
  1264. if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720)
  1265. val |= tr32(MAC_TX_LENGTHS) &
  1266. (TX_LENGTHS_JMB_FRM_LEN_MSK |
  1267. TX_LENGTHS_CNT_DWN_VAL_MSK);
  1268. if (tp->link_config.active_speed == SPEED_1000 &&
  1269. tp->link_config.active_duplex == DUPLEX_HALF)
  1270. tw32(MAC_TX_LENGTHS, val |
  1271. (0xff << TX_LENGTHS_SLOT_TIME_SHIFT));
  1272. else
  1273. tw32(MAC_TX_LENGTHS, val |
  1274. (32 << TX_LENGTHS_SLOT_TIME_SHIFT));
  1275. if (!tg3_flag(tp, 5705_PLUS)) {
  1276. if (netdev_link_ok(tp->dev)) {
  1277. tw32(HOSTCC_STAT_COAL_TICKS, DEFAULT_STAT_COAL_TICKS);
  1278. } else {
  1279. tw32(HOSTCC_STAT_COAL_TICKS, 0);
  1280. }
  1281. }
  1282. val = tr32(PCIE_PWR_MGMT_THRESH);
  1283. if (!netdev_link_ok(tp->dev))
  1284. val = (val & ~PCIE_PWR_MGMT_L1_THRESH_MSK);
  1285. else
  1286. val |= PCIE_PWR_MGMT_L1_THRESH_MSK;
  1287. tw32(PCIE_PWR_MGMT_THRESH, val);
  1288. return err;
  1289. }