hw.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226
  1. /*
  2. * Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net>
  3. *
  4. * This file is free software: you may copy, redistribute and/or modify it
  5. * under the terms of the GNU General Public License as published by the
  6. * Free Software Foundation, either version 2 of the License, or (at your
  7. * option) any later version.
  8. *
  9. * This file is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. *
  17. * This file incorporates work covered by the following copyright and
  18. * permission notice:
  19. *
  20. * Copyright (c) 2012 Qualcomm Atheros, Inc.
  21. *
  22. * Permission to use, copy, modify, and/or distribute this software for any
  23. * purpose with or without fee is hereby granted, provided that the above
  24. * copyright notice and this permission notice appear in all copies.
  25. *
  26. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  27. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  28. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  29. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  30. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  31. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  32. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  33. */
  34. #include <linux/etherdevice.h>
  35. #include <linux/delay.h>
  36. #include <linux/pci.h>
  37. #include <linux/mdio.h>
  38. #include "reg.h"
  39. #include "hw.h"
  40. static inline bool alx_is_rev_a(u8 rev)
  41. {
  42. return rev == ALX_REV_A0 || rev == ALX_REV_A1;
  43. }
  44. static int alx_wait_mdio_idle(struct alx_hw *hw)
  45. {
  46. u32 val;
  47. int i;
  48. for (i = 0; i < ALX_MDIO_MAX_AC_TO; i++) {
  49. val = alx_read_mem32(hw, ALX_MDIO);
  50. if (!(val & ALX_MDIO_BUSY))
  51. return 0;
  52. udelay(10);
  53. }
  54. return -ETIMEDOUT;
  55. }
  56. static int alx_read_phy_core(struct alx_hw *hw, bool ext, u8 dev,
  57. u16 reg, u16 *phy_data)
  58. {
  59. u32 val, clk_sel;
  60. int err;
  61. *phy_data = 0;
  62. /* use slow clock when it's in hibernation status */
  63. clk_sel = hw->link_speed != SPEED_UNKNOWN ?
  64. ALX_MDIO_CLK_SEL_25MD4 :
  65. ALX_MDIO_CLK_SEL_25MD128;
  66. if (ext) {
  67. val = dev << ALX_MDIO_EXTN_DEVAD_SHIFT |
  68. reg << ALX_MDIO_EXTN_REG_SHIFT;
  69. alx_write_mem32(hw, ALX_MDIO_EXTN, val);
  70. val = ALX_MDIO_SPRES_PRMBL | ALX_MDIO_START |
  71. ALX_MDIO_MODE_EXT | ALX_MDIO_OP_READ |
  72. clk_sel << ALX_MDIO_CLK_SEL_SHIFT;
  73. } else {
  74. val = ALX_MDIO_SPRES_PRMBL |
  75. clk_sel << ALX_MDIO_CLK_SEL_SHIFT |
  76. reg << ALX_MDIO_REG_SHIFT |
  77. ALX_MDIO_START | ALX_MDIO_OP_READ;
  78. }
  79. alx_write_mem32(hw, ALX_MDIO, val);
  80. err = alx_wait_mdio_idle(hw);
  81. if (err)
  82. return err;
  83. val = alx_read_mem32(hw, ALX_MDIO);
  84. *phy_data = ALX_GET_FIELD(val, ALX_MDIO_DATA);
  85. return 0;
  86. }
  87. static int alx_write_phy_core(struct alx_hw *hw, bool ext, u8 dev,
  88. u16 reg, u16 phy_data)
  89. {
  90. u32 val, clk_sel;
  91. /* use slow clock when it's in hibernation status */
  92. clk_sel = hw->link_speed != SPEED_UNKNOWN ?
  93. ALX_MDIO_CLK_SEL_25MD4 :
  94. ALX_MDIO_CLK_SEL_25MD128;
  95. if (ext) {
  96. val = dev << ALX_MDIO_EXTN_DEVAD_SHIFT |
  97. reg << ALX_MDIO_EXTN_REG_SHIFT;
  98. alx_write_mem32(hw, ALX_MDIO_EXTN, val);
  99. val = ALX_MDIO_SPRES_PRMBL |
  100. clk_sel << ALX_MDIO_CLK_SEL_SHIFT |
  101. phy_data << ALX_MDIO_DATA_SHIFT |
  102. ALX_MDIO_START | ALX_MDIO_MODE_EXT;
  103. } else {
  104. val = ALX_MDIO_SPRES_PRMBL |
  105. clk_sel << ALX_MDIO_CLK_SEL_SHIFT |
  106. reg << ALX_MDIO_REG_SHIFT |
  107. phy_data << ALX_MDIO_DATA_SHIFT |
  108. ALX_MDIO_START;
  109. }
  110. alx_write_mem32(hw, ALX_MDIO, val);
  111. return alx_wait_mdio_idle(hw);
  112. }
  113. static int __alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data)
  114. {
  115. return alx_read_phy_core(hw, false, 0, reg, phy_data);
  116. }
  117. static int __alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data)
  118. {
  119. return alx_write_phy_core(hw, false, 0, reg, phy_data);
  120. }
  121. static int __alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata)
  122. {
  123. return alx_read_phy_core(hw, true, dev, reg, pdata);
  124. }
  125. static int __alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data)
  126. {
  127. return alx_write_phy_core(hw, true, dev, reg, data);
  128. }
  129. static int __alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata)
  130. {
  131. int err;
  132. err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg);
  133. if (err)
  134. return err;
  135. return __alx_read_phy_reg(hw, ALX_MII_DBG_DATA, pdata);
  136. }
  137. static int __alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data)
  138. {
  139. int err;
  140. err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg);
  141. if (err)
  142. return err;
  143. return __alx_write_phy_reg(hw, ALX_MII_DBG_DATA, data);
  144. }
  145. int alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data)
  146. {
  147. int err;
  148. spin_lock(&hw->mdio_lock);
  149. err = __alx_read_phy_reg(hw, reg, phy_data);
  150. spin_unlock(&hw->mdio_lock);
  151. return err;
  152. }
  153. int alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data)
  154. {
  155. int err;
  156. spin_lock(&hw->mdio_lock);
  157. err = __alx_write_phy_reg(hw, reg, phy_data);
  158. spin_unlock(&hw->mdio_lock);
  159. return err;
  160. }
  161. int alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata)
  162. {
  163. int err;
  164. spin_lock(&hw->mdio_lock);
  165. err = __alx_read_phy_ext(hw, dev, reg, pdata);
  166. spin_unlock(&hw->mdio_lock);
  167. return err;
  168. }
  169. int alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data)
  170. {
  171. int err;
  172. spin_lock(&hw->mdio_lock);
  173. err = __alx_write_phy_ext(hw, dev, reg, data);
  174. spin_unlock(&hw->mdio_lock);
  175. return err;
  176. }
  177. static int alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata)
  178. {
  179. int err;
  180. spin_lock(&hw->mdio_lock);
  181. err = __alx_read_phy_dbg(hw, reg, pdata);
  182. spin_unlock(&hw->mdio_lock);
  183. return err;
  184. }
  185. static int alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data)
  186. {
  187. int err;
  188. spin_lock(&hw->mdio_lock);
  189. err = __alx_write_phy_dbg(hw, reg, data);
  190. spin_unlock(&hw->mdio_lock);
  191. return err;
  192. }
  193. static u16 alx_get_phy_config(struct alx_hw *hw)
  194. {
  195. u32 val;
  196. u16 phy_val;
  197. val = alx_read_mem32(hw, ALX_PHY_CTRL);
  198. /* phy in reset */
  199. if ((val & ALX_PHY_CTRL_DSPRST_OUT) == 0)
  200. return ALX_DRV_PHY_UNKNOWN;
  201. val = alx_read_mem32(hw, ALX_DRV);
  202. val = ALX_GET_FIELD(val, ALX_DRV_PHY);
  203. if (ALX_DRV_PHY_UNKNOWN == val)
  204. return ALX_DRV_PHY_UNKNOWN;
  205. alx_read_phy_reg(hw, ALX_MII_DBG_ADDR, &phy_val);
  206. if (ALX_PHY_INITED == phy_val)
  207. return val;
  208. return ALX_DRV_PHY_UNKNOWN;
  209. }
  210. static bool alx_wait_reg(struct alx_hw *hw, u32 reg, u32 wait, u32 *val)
  211. {
  212. u32 read;
  213. int i;
  214. for (i = 0; i < ALX_SLD_MAX_TO; i++) {
  215. read = alx_read_mem32(hw, reg);
  216. if ((read & wait) == 0) {
  217. if (val)
  218. *val = read;
  219. return true;
  220. }
  221. mdelay(1);
  222. }
  223. return false;
  224. }
  225. static bool alx_read_macaddr(struct alx_hw *hw, u8 *addr)
  226. {
  227. u32 mac0, mac1;
  228. mac0 = alx_read_mem32(hw, ALX_STAD0);
  229. mac1 = alx_read_mem32(hw, ALX_STAD1);
  230. /* addr should be big-endian */
  231. *(__be32 *)(addr + 2) = cpu_to_be32(mac0);
  232. *(__be16 *)addr = cpu_to_be16(mac1);
  233. return is_valid_ether_addr(addr);
  234. }
  235. int alx_get_perm_macaddr(struct alx_hw *hw, u8 *addr)
  236. {
  237. u32 val;
  238. /* try to get it from register first */
  239. if (alx_read_macaddr(hw, addr))
  240. return 0;
  241. /* try to load from efuse */
  242. if (!alx_wait_reg(hw, ALX_SLD, ALX_SLD_STAT | ALX_SLD_START, &val))
  243. return -EIO;
  244. alx_write_mem32(hw, ALX_SLD, val | ALX_SLD_START);
  245. if (!alx_wait_reg(hw, ALX_SLD, ALX_SLD_START, NULL))
  246. return -EIO;
  247. if (alx_read_macaddr(hw, addr))
  248. return 0;
  249. /* try to load from flash/eeprom (if present) */
  250. val = alx_read_mem32(hw, ALX_EFLD);
  251. if (val & (ALX_EFLD_F_EXIST | ALX_EFLD_E_EXIST)) {
  252. if (!alx_wait_reg(hw, ALX_EFLD,
  253. ALX_EFLD_STAT | ALX_EFLD_START, &val))
  254. return -EIO;
  255. alx_write_mem32(hw, ALX_EFLD, val | ALX_EFLD_START);
  256. if (!alx_wait_reg(hw, ALX_EFLD, ALX_EFLD_START, NULL))
  257. return -EIO;
  258. if (alx_read_macaddr(hw, addr))
  259. return 0;
  260. }
  261. return -EIO;
  262. }
  263. void alx_set_macaddr(struct alx_hw *hw, const u8 *addr)
  264. {
  265. u32 val;
  266. /* for example: 00-0B-6A-F6-00-DC * STAD0=6AF600DC, STAD1=000B */
  267. val = be32_to_cpu(*(__be32 *)(addr + 2));
  268. alx_write_mem32(hw, ALX_STAD0, val);
  269. val = be16_to_cpu(*(__be16 *)addr);
  270. alx_write_mem32(hw, ALX_STAD1, val);
  271. }
  272. static void alx_enable_osc(struct alx_hw *hw)
  273. {
  274. u32 val;
  275. /* rising edge */
  276. val = alx_read_mem32(hw, ALX_MISC);
  277. alx_write_mem32(hw, ALX_MISC, val & ~ALX_MISC_INTNLOSC_OPEN);
  278. alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN);
  279. }
  280. static void alx_reset_osc(struct alx_hw *hw, u8 rev)
  281. {
  282. u32 val, val2;
  283. /* clear Internal OSC settings, switching OSC by hw itself */
  284. val = alx_read_mem32(hw, ALX_MISC3);
  285. alx_write_mem32(hw, ALX_MISC3,
  286. (val & ~ALX_MISC3_25M_BY_SW) |
  287. ALX_MISC3_25M_NOTO_INTNL);
  288. /* 25M clk from chipset may be unstable 1s after de-assert of
  289. * PERST, driver need re-calibrate before enter Sleep for WoL
  290. */
  291. val = alx_read_mem32(hw, ALX_MISC);
  292. if (rev >= ALX_REV_B0) {
  293. /* restore over current protection def-val,
  294. * this val could be reset by MAC-RST
  295. */
  296. ALX_SET_FIELD(val, ALX_MISC_PSW_OCP, ALX_MISC_PSW_OCP_DEF);
  297. /* a 0->1 change will update the internal val of osc */
  298. val &= ~ALX_MISC_INTNLOSC_OPEN;
  299. alx_write_mem32(hw, ALX_MISC, val);
  300. alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN);
  301. /* hw will automatically dis OSC after cab. */
  302. val2 = alx_read_mem32(hw, ALX_MSIC2);
  303. val2 &= ~ALX_MSIC2_CALB_START;
  304. alx_write_mem32(hw, ALX_MSIC2, val2);
  305. alx_write_mem32(hw, ALX_MSIC2, val2 | ALX_MSIC2_CALB_START);
  306. } else {
  307. val &= ~ALX_MISC_INTNLOSC_OPEN;
  308. /* disable isolate for rev A devices */
  309. if (alx_is_rev_a(rev))
  310. val &= ~ALX_MISC_ISO_EN;
  311. alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN);
  312. alx_write_mem32(hw, ALX_MISC, val);
  313. }
  314. udelay(20);
  315. }
  316. static int alx_stop_mac(struct alx_hw *hw)
  317. {
  318. u32 rxq, txq, val;
  319. u16 i;
  320. rxq = alx_read_mem32(hw, ALX_RXQ0);
  321. alx_write_mem32(hw, ALX_RXQ0, rxq & ~ALX_RXQ0_EN);
  322. txq = alx_read_mem32(hw, ALX_TXQ0);
  323. alx_write_mem32(hw, ALX_TXQ0, txq & ~ALX_TXQ0_EN);
  324. udelay(40);
  325. hw->rx_ctrl &= ~(ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN);
  326. alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
  327. for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) {
  328. val = alx_read_mem32(hw, ALX_MAC_STS);
  329. if (!(val & ALX_MAC_STS_IDLE))
  330. return 0;
  331. udelay(10);
  332. }
  333. return -ETIMEDOUT;
  334. }
  335. int alx_reset_mac(struct alx_hw *hw)
  336. {
  337. u32 val, pmctrl;
  338. int i, ret;
  339. u8 rev;
  340. bool a_cr;
  341. pmctrl = 0;
  342. rev = alx_hw_revision(hw);
  343. a_cr = alx_is_rev_a(rev) && alx_hw_with_cr(hw);
  344. /* disable all interrupts, RXQ/TXQ */
  345. alx_write_mem32(hw, ALX_MSIX_MASK, 0xFFFFFFFF);
  346. alx_write_mem32(hw, ALX_IMR, 0);
  347. alx_write_mem32(hw, ALX_ISR, ALX_ISR_DIS);
  348. ret = alx_stop_mac(hw);
  349. if (ret)
  350. return ret;
  351. /* mac reset workaroud */
  352. alx_write_mem32(hw, ALX_RFD_PIDX, 1);
  353. /* dis l0s/l1 before mac reset */
  354. if (a_cr) {
  355. pmctrl = alx_read_mem32(hw, ALX_PMCTRL);
  356. if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN))
  357. alx_write_mem32(hw, ALX_PMCTRL,
  358. pmctrl & ~(ALX_PMCTRL_L1_EN |
  359. ALX_PMCTRL_L0S_EN));
  360. }
  361. /* reset whole mac safely */
  362. val = alx_read_mem32(hw, ALX_MASTER);
  363. alx_write_mem32(hw, ALX_MASTER,
  364. val | ALX_MASTER_DMA_MAC_RST | ALX_MASTER_OOB_DIS);
  365. /* make sure it's real idle */
  366. udelay(10);
  367. for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) {
  368. val = alx_read_mem32(hw, ALX_RFD_PIDX);
  369. if (val == 0)
  370. break;
  371. udelay(10);
  372. }
  373. for (; i < ALX_DMA_MAC_RST_TO; i++) {
  374. val = alx_read_mem32(hw, ALX_MASTER);
  375. if ((val & ALX_MASTER_DMA_MAC_RST) == 0)
  376. break;
  377. udelay(10);
  378. }
  379. if (i == ALX_DMA_MAC_RST_TO)
  380. return -EIO;
  381. udelay(10);
  382. if (a_cr) {
  383. alx_write_mem32(hw, ALX_MASTER, val | ALX_MASTER_PCLKSEL_SRDS);
  384. /* restore l0s / l1 */
  385. if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN))
  386. alx_write_mem32(hw, ALX_PMCTRL, pmctrl);
  387. }
  388. alx_reset_osc(hw, rev);
  389. /* clear Internal OSC settings, switching OSC by hw itself,
  390. * disable isolate for rev A devices
  391. */
  392. val = alx_read_mem32(hw, ALX_MISC3);
  393. alx_write_mem32(hw, ALX_MISC3,
  394. (val & ~ALX_MISC3_25M_BY_SW) |
  395. ALX_MISC3_25M_NOTO_INTNL);
  396. val = alx_read_mem32(hw, ALX_MISC);
  397. val &= ~ALX_MISC_INTNLOSC_OPEN;
  398. if (alx_is_rev_a(rev))
  399. val &= ~ALX_MISC_ISO_EN;
  400. alx_write_mem32(hw, ALX_MISC, val);
  401. udelay(20);
  402. /* driver control speed/duplex, hash-alg */
  403. alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
  404. val = alx_read_mem32(hw, ALX_SERDES);
  405. alx_write_mem32(hw, ALX_SERDES,
  406. val | ALX_SERDES_MACCLK_SLWDWN |
  407. ALX_SERDES_PHYCLK_SLWDWN);
  408. return 0;
  409. }
  410. void alx_reset_phy(struct alx_hw *hw)
  411. {
  412. int i;
  413. u32 val;
  414. u16 phy_val;
  415. /* (DSP)reset PHY core */
  416. val = alx_read_mem32(hw, ALX_PHY_CTRL);
  417. val &= ~(ALX_PHY_CTRL_DSPRST_OUT | ALX_PHY_CTRL_IDDQ |
  418. ALX_PHY_CTRL_GATE_25M | ALX_PHY_CTRL_POWER_DOWN |
  419. ALX_PHY_CTRL_CLS);
  420. val |= ALX_PHY_CTRL_RST_ANALOG;
  421. val |= (ALX_PHY_CTRL_HIB_PULSE | ALX_PHY_CTRL_HIB_EN);
  422. alx_write_mem32(hw, ALX_PHY_CTRL, val);
  423. udelay(10);
  424. alx_write_mem32(hw, ALX_PHY_CTRL, val | ALX_PHY_CTRL_DSPRST_OUT);
  425. for (i = 0; i < ALX_PHY_CTRL_DSPRST_TO; i++)
  426. udelay(10);
  427. /* phy power saving & hib */
  428. alx_write_phy_dbg(hw, ALX_MIIDBG_LEGCYPS, ALX_LEGCYPS_DEF);
  429. alx_write_phy_dbg(hw, ALX_MIIDBG_SYSMODCTRL,
  430. ALX_SYSMODCTRL_IECHOADJ_DEF);
  431. alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_VDRVBIAS,
  432. ALX_VDRVBIAS_DEF);
  433. /* EEE advertisement */
  434. val = alx_read_mem32(hw, ALX_LPI_CTRL);
  435. alx_write_mem32(hw, ALX_LPI_CTRL, val & ~ALX_LPI_CTRL_EN);
  436. alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_LOCAL_EEEADV, 0);
  437. /* phy power saving */
  438. alx_write_phy_dbg(hw, ALX_MIIDBG_TST10BTCFG, ALX_TST10BTCFG_DEF);
  439. alx_write_phy_dbg(hw, ALX_MIIDBG_SRDSYSMOD, ALX_SRDSYSMOD_DEF);
  440. alx_write_phy_dbg(hw, ALX_MIIDBG_TST100BTCFG, ALX_TST100BTCFG_DEF);
  441. alx_write_phy_dbg(hw, ALX_MIIDBG_ANACTRL, ALX_ANACTRL_DEF);
  442. alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val);
  443. alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2,
  444. phy_val & ~ALX_GREENCFG2_GATE_DFSE_EN);
  445. /* rtl8139c, 120m issue */
  446. alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_NLP78,
  447. ALX_MIIEXT_NLP78_120M_DEF);
  448. alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_S3DIG10,
  449. ALX_MIIEXT_S3DIG10_DEF);
  450. if (hw->lnk_patch) {
  451. /* Turn off half amplitude */
  452. alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3,
  453. &phy_val);
  454. alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3,
  455. phy_val | ALX_CLDCTRL3_BP_CABLE1TH_DET_GT);
  456. /* Turn off Green feature */
  457. alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val);
  458. alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2,
  459. phy_val | ALX_GREENCFG2_BP_GREEN);
  460. /* Turn off half Bias */
  461. alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5,
  462. &phy_val);
  463. alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5,
  464. phy_val | ALX_CLDCTRL5_BP_VD_HLFBIAS);
  465. }
  466. /* set phy interrupt mask */
  467. alx_write_phy_reg(hw, ALX_MII_IER, ALX_IER_LINK_UP | ALX_IER_LINK_DOWN);
  468. }
  469. #define ALX_PCI_CMD (PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO)
  470. void alx_reset_pcie(struct alx_hw *hw)
  471. {
  472. u8 rev = alx_hw_revision(hw);
  473. u32 val;
  474. u16 val16;
  475. /* Workaround for PCI problem when BIOS sets MMRBC incorrectly. */
  476. pci_read_config_word(hw->pdev, PCI_COMMAND, &val16);
  477. if (!(val16 & ALX_PCI_CMD) || (val16 & PCI_COMMAND_INTX_DISABLE)) {
  478. val16 = (val16 | ALX_PCI_CMD) & ~PCI_COMMAND_INTX_DISABLE;
  479. pci_write_config_word(hw->pdev, PCI_COMMAND, val16);
  480. }
  481. /* clear WoL setting/status */
  482. val = alx_read_mem32(hw, ALX_WOL0);
  483. alx_write_mem32(hw, ALX_WOL0, 0);
  484. val = alx_read_mem32(hw, ALX_PDLL_TRNS1);
  485. alx_write_mem32(hw, ALX_PDLL_TRNS1, val & ~ALX_PDLL_TRNS1_D3PLLOFF_EN);
  486. /* mask some pcie error bits */
  487. val = alx_read_mem32(hw, ALX_UE_SVRT);
  488. val &= ~(ALX_UE_SVRT_DLPROTERR | ALX_UE_SVRT_FCPROTERR);
  489. alx_write_mem32(hw, ALX_UE_SVRT, val);
  490. /* wol 25M & pclk */
  491. val = alx_read_mem32(hw, ALX_MASTER);
  492. if (alx_is_rev_a(rev) && alx_hw_with_cr(hw)) {
  493. if ((val & ALX_MASTER_WAKEN_25M) == 0 ||
  494. (val & ALX_MASTER_PCLKSEL_SRDS) == 0)
  495. alx_write_mem32(hw, ALX_MASTER,
  496. val | ALX_MASTER_PCLKSEL_SRDS |
  497. ALX_MASTER_WAKEN_25M);
  498. } else {
  499. if ((val & ALX_MASTER_WAKEN_25M) == 0 ||
  500. (val & ALX_MASTER_PCLKSEL_SRDS) != 0)
  501. alx_write_mem32(hw, ALX_MASTER,
  502. (val & ~ALX_MASTER_PCLKSEL_SRDS) |
  503. ALX_MASTER_WAKEN_25M);
  504. }
  505. /* ASPM setting */
  506. alx_enable_aspm(hw, true, true);
  507. udelay(10);
  508. }
  509. void alx_start_mac(struct alx_hw *hw)
  510. {
  511. u32 mac, txq, rxq;
  512. rxq = alx_read_mem32(hw, ALX_RXQ0);
  513. alx_write_mem32(hw, ALX_RXQ0, rxq | ALX_RXQ0_EN);
  514. txq = alx_read_mem32(hw, ALX_TXQ0);
  515. alx_write_mem32(hw, ALX_TXQ0, txq | ALX_TXQ0_EN);
  516. mac = hw->rx_ctrl;
  517. if (hw->link_speed % 10 == DUPLEX_FULL)
  518. mac |= ALX_MAC_CTRL_FULLD;
  519. else
  520. mac &= ~ALX_MAC_CTRL_FULLD;
  521. ALX_SET_FIELD(mac, ALX_MAC_CTRL_SPEED,
  522. hw->link_speed >= SPEED_1000 ? ALX_MAC_CTRL_SPEED_1000 :
  523. ALX_MAC_CTRL_SPEED_10_100);
  524. mac |= ALX_MAC_CTRL_TX_EN | ALX_MAC_CTRL_RX_EN;
  525. hw->rx_ctrl = mac;
  526. alx_write_mem32(hw, ALX_MAC_CTRL, mac);
  527. }
  528. void alx_cfg_mac_flowcontrol(struct alx_hw *hw, u8 fc)
  529. {
  530. if (fc & ALX_FC_RX)
  531. hw->rx_ctrl |= ALX_MAC_CTRL_RXFC_EN;
  532. else
  533. hw->rx_ctrl &= ~ALX_MAC_CTRL_RXFC_EN;
  534. if (fc & ALX_FC_TX)
  535. hw->rx_ctrl |= ALX_MAC_CTRL_TXFC_EN;
  536. else
  537. hw->rx_ctrl &= ~ALX_MAC_CTRL_TXFC_EN;
  538. alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
  539. }
  540. void alx_enable_aspm(struct alx_hw *hw, bool l0s_en, bool l1_en)
  541. {
  542. u32 pmctrl;
  543. u8 rev = alx_hw_revision(hw);
  544. pmctrl = alx_read_mem32(hw, ALX_PMCTRL);
  545. ALX_SET_FIELD(pmctrl, ALX_PMCTRL_LCKDET_TIMER,
  546. ALX_PMCTRL_LCKDET_TIMER_DEF);
  547. pmctrl |= ALX_PMCTRL_RCVR_WT_1US |
  548. ALX_PMCTRL_L1_CLKSW_EN |
  549. ALX_PMCTRL_L1_SRDSRX_PWD;
  550. ALX_SET_FIELD(pmctrl, ALX_PMCTRL_L1REQ_TO, ALX_PMCTRL_L1REG_TO_DEF);
  551. ALX_SET_FIELD(pmctrl, ALX_PMCTRL_L1_TIMER, ALX_PMCTRL_L1_TIMER_16US);
  552. pmctrl &= ~(ALX_PMCTRL_L1_SRDS_EN |
  553. ALX_PMCTRL_L1_SRDSPLL_EN |
  554. ALX_PMCTRL_L1_BUFSRX_EN |
  555. ALX_PMCTRL_SADLY_EN |
  556. ALX_PMCTRL_HOTRST_WTEN|
  557. ALX_PMCTRL_L0S_EN |
  558. ALX_PMCTRL_L1_EN |
  559. ALX_PMCTRL_ASPM_FCEN |
  560. ALX_PMCTRL_TXL1_AFTER_L0S |
  561. ALX_PMCTRL_RXL1_AFTER_L0S);
  562. if (alx_is_rev_a(rev) && alx_hw_with_cr(hw))
  563. pmctrl |= ALX_PMCTRL_L1_SRDS_EN | ALX_PMCTRL_L1_SRDSPLL_EN;
  564. if (l0s_en)
  565. pmctrl |= (ALX_PMCTRL_L0S_EN | ALX_PMCTRL_ASPM_FCEN);
  566. if (l1_en)
  567. pmctrl |= (ALX_PMCTRL_L1_EN | ALX_PMCTRL_ASPM_FCEN);
  568. alx_write_mem32(hw, ALX_PMCTRL, pmctrl);
  569. }
  570. static u32 ethadv_to_hw_cfg(struct alx_hw *hw, u32 ethadv_cfg)
  571. {
  572. u32 cfg = 0;
  573. if (ethadv_cfg & ADVERTISED_Autoneg) {
  574. cfg |= ALX_DRV_PHY_AUTO;
  575. if (ethadv_cfg & ADVERTISED_10baseT_Half)
  576. cfg |= ALX_DRV_PHY_10;
  577. if (ethadv_cfg & ADVERTISED_10baseT_Full)
  578. cfg |= ALX_DRV_PHY_10 | ALX_DRV_PHY_DUPLEX;
  579. if (ethadv_cfg & ADVERTISED_100baseT_Half)
  580. cfg |= ALX_DRV_PHY_100;
  581. if (ethadv_cfg & ADVERTISED_100baseT_Full)
  582. cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX;
  583. if (ethadv_cfg & ADVERTISED_1000baseT_Half)
  584. cfg |= ALX_DRV_PHY_1000;
  585. if (ethadv_cfg & ADVERTISED_1000baseT_Full)
  586. cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX;
  587. if (ethadv_cfg & ADVERTISED_Pause)
  588. cfg |= ADVERTISE_PAUSE_CAP;
  589. if (ethadv_cfg & ADVERTISED_Asym_Pause)
  590. cfg |= ADVERTISE_PAUSE_ASYM;
  591. } else {
  592. switch (ethadv_cfg) {
  593. case ADVERTISED_10baseT_Half:
  594. cfg |= ALX_DRV_PHY_10;
  595. break;
  596. case ADVERTISED_100baseT_Half:
  597. cfg |= ALX_DRV_PHY_100;
  598. break;
  599. case ADVERTISED_10baseT_Full:
  600. cfg |= ALX_DRV_PHY_10 | ALX_DRV_PHY_DUPLEX;
  601. break;
  602. case ADVERTISED_100baseT_Full:
  603. cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX;
  604. break;
  605. }
  606. }
  607. return cfg;
  608. }
  609. int alx_setup_speed_duplex(struct alx_hw *hw, u32 ethadv, u8 flowctrl)
  610. {
  611. u16 adv, giga, cr;
  612. u32 val;
  613. int err = 0;
  614. alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, 0);
  615. val = alx_read_mem32(hw, ALX_DRV);
  616. ALX_SET_FIELD(val, ALX_DRV_PHY, 0);
  617. if (ethadv & ADVERTISED_Autoneg) {
  618. adv = ADVERTISE_CSMA;
  619. adv |= ethtool_adv_to_mii_adv_t(ethadv);
  620. if (flowctrl & ALX_FC_ANEG) {
  621. if (flowctrl & ALX_FC_RX) {
  622. adv |= ADVERTISED_Pause;
  623. if (!(flowctrl & ALX_FC_TX))
  624. adv |= ADVERTISED_Asym_Pause;
  625. } else if (flowctrl & ALX_FC_TX) {
  626. adv |= ADVERTISED_Asym_Pause;
  627. }
  628. }
  629. giga = 0;
  630. if (alx_hw_giga(hw))
  631. giga = ethtool_adv_to_mii_ctrl1000_t(ethadv);
  632. cr = BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART;
  633. if (alx_write_phy_reg(hw, MII_ADVERTISE, adv) ||
  634. alx_write_phy_reg(hw, MII_CTRL1000, giga) ||
  635. alx_write_phy_reg(hw, MII_BMCR, cr))
  636. err = -EBUSY;
  637. } else {
  638. cr = BMCR_RESET;
  639. if (ethadv == ADVERTISED_100baseT_Half ||
  640. ethadv == ADVERTISED_100baseT_Full)
  641. cr |= BMCR_SPEED100;
  642. if (ethadv == ADVERTISED_10baseT_Full ||
  643. ethadv == ADVERTISED_100baseT_Full)
  644. cr |= BMCR_FULLDPLX;
  645. err = alx_write_phy_reg(hw, MII_BMCR, cr);
  646. }
  647. if (!err) {
  648. alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, ALX_PHY_INITED);
  649. val |= ethadv_to_hw_cfg(hw, ethadv);
  650. }
  651. alx_write_mem32(hw, ALX_DRV, val);
  652. return err;
  653. }
  654. void alx_post_phy_link(struct alx_hw *hw)
  655. {
  656. u16 phy_val, len, agc;
  657. u8 revid = alx_hw_revision(hw);
  658. bool adj_th = revid == ALX_REV_B0;
  659. int speed;
  660. if (hw->link_speed == SPEED_UNKNOWN)
  661. speed = SPEED_UNKNOWN;
  662. else
  663. speed = hw->link_speed - hw->link_speed % 10;
  664. if (revid != ALX_REV_B0 && !alx_is_rev_a(revid))
  665. return;
  666. /* 1000BT/AZ, wrong cable length */
  667. if (speed != SPEED_UNKNOWN) {
  668. alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL6,
  669. &phy_val);
  670. len = ALX_GET_FIELD(phy_val, ALX_CLDCTRL6_CAB_LEN);
  671. alx_read_phy_dbg(hw, ALX_MIIDBG_AGC, &phy_val);
  672. agc = ALX_GET_FIELD(phy_val, ALX_AGC_2_VGA);
  673. if ((speed == SPEED_1000 &&
  674. (len > ALX_CLDCTRL6_CAB_LEN_SHORT1G ||
  675. (len == 0 && agc > ALX_AGC_LONG1G_LIMT))) ||
  676. (speed == SPEED_100 &&
  677. (len > ALX_CLDCTRL6_CAB_LEN_SHORT100M ||
  678. (len == 0 && agc > ALX_AGC_LONG100M_LIMT)))) {
  679. alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT,
  680. ALX_AZ_ANADECT_LONG);
  681. alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
  682. &phy_val);
  683. alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
  684. phy_val | ALX_AFE_10BT_100M_TH);
  685. } else {
  686. alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT,
  687. ALX_AZ_ANADECT_DEF);
  688. alx_read_phy_ext(hw, ALX_MIIEXT_ANEG,
  689. ALX_MIIEXT_AFE, &phy_val);
  690. alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
  691. phy_val & ~ALX_AFE_10BT_100M_TH);
  692. }
  693. /* threshold adjust */
  694. if (adj_th && hw->lnk_patch) {
  695. if (speed == SPEED_100) {
  696. alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB,
  697. ALX_MSE16DB_UP);
  698. } else if (speed == SPEED_1000) {
  699. /*
  700. * Giga link threshold, raise the tolerance of
  701. * noise 50%
  702. */
  703. alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB,
  704. &phy_val);
  705. ALX_SET_FIELD(phy_val, ALX_MSE20DB_TH,
  706. ALX_MSE20DB_TH_HI);
  707. alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB,
  708. phy_val);
  709. }
  710. }
  711. } else {
  712. alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
  713. &phy_val);
  714. alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
  715. phy_val & ~ALX_AFE_10BT_100M_TH);
  716. if (adj_th && hw->lnk_patch) {
  717. alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB,
  718. ALX_MSE16DB_DOWN);
  719. alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB, &phy_val);
  720. ALX_SET_FIELD(phy_val, ALX_MSE20DB_TH,
  721. ALX_MSE20DB_TH_DEF);
  722. alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB, phy_val);
  723. }
  724. }
  725. }
  726. /* NOTE:
  727. * 1. phy link must be established before calling this function
  728. * 2. wol option (pattern,magic,link,etc.) is configed before call it.
  729. */
  730. int alx_pre_suspend(struct alx_hw *hw, int speed)
  731. {
  732. u32 master, mac, phy, val;
  733. int err = 0;
  734. master = alx_read_mem32(hw, ALX_MASTER);
  735. master &= ~ALX_MASTER_PCLKSEL_SRDS;
  736. mac = hw->rx_ctrl;
  737. /* 10/100 half */
  738. ALX_SET_FIELD(mac, ALX_MAC_CTRL_SPEED, ALX_MAC_CTRL_SPEED_10_100);
  739. mac &= ~(ALX_MAC_CTRL_FULLD | ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN);
  740. phy = alx_read_mem32(hw, ALX_PHY_CTRL);
  741. phy &= ~(ALX_PHY_CTRL_DSPRST_OUT | ALX_PHY_CTRL_CLS);
  742. phy |= ALX_PHY_CTRL_RST_ANALOG | ALX_PHY_CTRL_HIB_PULSE |
  743. ALX_PHY_CTRL_HIB_EN;
  744. /* without any activity */
  745. if (!(hw->sleep_ctrl & ALX_SLEEP_ACTIVE)) {
  746. err = alx_write_phy_reg(hw, ALX_MII_IER, 0);
  747. if (err)
  748. return err;
  749. phy |= ALX_PHY_CTRL_IDDQ | ALX_PHY_CTRL_POWER_DOWN;
  750. } else {
  751. if (hw->sleep_ctrl & (ALX_SLEEP_WOL_MAGIC | ALX_SLEEP_CIFS))
  752. mac |= ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_BRD_EN;
  753. if (hw->sleep_ctrl & ALX_SLEEP_CIFS)
  754. mac |= ALX_MAC_CTRL_TX_EN;
  755. if (speed % 10 == DUPLEX_FULL)
  756. mac |= ALX_MAC_CTRL_FULLD;
  757. if (speed >= SPEED_1000)
  758. ALX_SET_FIELD(mac, ALX_MAC_CTRL_SPEED,
  759. ALX_MAC_CTRL_SPEED_1000);
  760. phy |= ALX_PHY_CTRL_DSPRST_OUT;
  761. err = alx_write_phy_ext(hw, ALX_MIIEXT_ANEG,
  762. ALX_MIIEXT_S3DIG10,
  763. ALX_MIIEXT_S3DIG10_SL);
  764. if (err)
  765. return err;
  766. }
  767. alx_enable_osc(hw);
  768. hw->rx_ctrl = mac;
  769. alx_write_mem32(hw, ALX_MASTER, master);
  770. alx_write_mem32(hw, ALX_MAC_CTRL, mac);
  771. alx_write_mem32(hw, ALX_PHY_CTRL, phy);
  772. /* set val of PDLL D3PLLOFF */
  773. val = alx_read_mem32(hw, ALX_PDLL_TRNS1);
  774. val |= ALX_PDLL_TRNS1_D3PLLOFF_EN;
  775. alx_write_mem32(hw, ALX_PDLL_TRNS1, val);
  776. return 0;
  777. }
  778. bool alx_phy_configured(struct alx_hw *hw)
  779. {
  780. u32 cfg, hw_cfg;
  781. cfg = ethadv_to_hw_cfg(hw, hw->adv_cfg);
  782. cfg = ALX_GET_FIELD(cfg, ALX_DRV_PHY);
  783. hw_cfg = alx_get_phy_config(hw);
  784. if (hw_cfg == ALX_DRV_PHY_UNKNOWN)
  785. return false;
  786. return cfg == hw_cfg;
  787. }
  788. int alx_get_phy_link(struct alx_hw *hw, int *speed)
  789. {
  790. struct pci_dev *pdev = hw->pdev;
  791. u16 bmsr, giga;
  792. int err;
  793. err = alx_read_phy_reg(hw, MII_BMSR, &bmsr);
  794. if (err)
  795. return err;
  796. err = alx_read_phy_reg(hw, MII_BMSR, &bmsr);
  797. if (err)
  798. return err;
  799. if (!(bmsr & BMSR_LSTATUS)) {
  800. *speed = SPEED_UNKNOWN;
  801. return 0;
  802. }
  803. /* speed/duplex result is saved in PHY Specific Status Register */
  804. err = alx_read_phy_reg(hw, ALX_MII_GIGA_PSSR, &giga);
  805. if (err)
  806. return err;
  807. if (!(giga & ALX_GIGA_PSSR_SPD_DPLX_RESOLVED))
  808. goto wrong_speed;
  809. switch (giga & ALX_GIGA_PSSR_SPEED) {
  810. case ALX_GIGA_PSSR_1000MBS:
  811. *speed = SPEED_1000;
  812. break;
  813. case ALX_GIGA_PSSR_100MBS:
  814. *speed = SPEED_100;
  815. break;
  816. case ALX_GIGA_PSSR_10MBS:
  817. *speed = SPEED_10;
  818. break;
  819. default:
  820. goto wrong_speed;
  821. }
  822. *speed += (giga & ALX_GIGA_PSSR_DPLX) ? DUPLEX_FULL : DUPLEX_HALF;
  823. return 1;
  824. wrong_speed:
  825. dev_err(&pdev->dev, "invalid PHY speed/duplex: 0x%x\n", giga);
  826. return -EINVAL;
  827. }
  828. int alx_clear_phy_intr(struct alx_hw *hw)
  829. {
  830. u16 isr;
  831. /* clear interrupt status by reading it */
  832. return alx_read_phy_reg(hw, ALX_MII_ISR, &isr);
  833. }
  834. int alx_config_wol(struct alx_hw *hw)
  835. {
  836. u32 wol = 0;
  837. int err = 0;
  838. /* turn on magic packet event */
  839. if (hw->sleep_ctrl & ALX_SLEEP_WOL_MAGIC)
  840. wol |= ALX_WOL0_MAGIC_EN | ALX_WOL0_PME_MAGIC_EN;
  841. /* turn on link up event */
  842. if (hw->sleep_ctrl & ALX_SLEEP_WOL_PHY) {
  843. wol |= ALX_WOL0_LINK_EN | ALX_WOL0_PME_LINK;
  844. /* only link up can wake up */
  845. err = alx_write_phy_reg(hw, ALX_MII_IER, ALX_IER_LINK_UP);
  846. }
  847. alx_write_mem32(hw, ALX_WOL0, wol);
  848. return err;
  849. }
  850. void alx_disable_rss(struct alx_hw *hw)
  851. {
  852. u32 ctrl = alx_read_mem32(hw, ALX_RXQ0);
  853. ctrl &= ~ALX_RXQ0_RSS_HASH_EN;
  854. alx_write_mem32(hw, ALX_RXQ0, ctrl);
  855. }
  856. void alx_configure_basic(struct alx_hw *hw)
  857. {
  858. u32 val, raw_mtu, max_payload;
  859. u16 val16;
  860. u8 chip_rev = alx_hw_revision(hw);
  861. alx_set_macaddr(hw, hw->mac_addr);
  862. alx_write_mem32(hw, ALX_CLK_GATE, ALX_CLK_GATE_ALL);
  863. /* idle timeout to switch clk_125M */
  864. if (chip_rev >= ALX_REV_B0)
  865. alx_write_mem32(hw, ALX_IDLE_DECISN_TIMER,
  866. ALX_IDLE_DECISN_TIMER_DEF);
  867. alx_write_mem32(hw, ALX_SMB_TIMER, hw->smb_timer * 500UL);
  868. val = alx_read_mem32(hw, ALX_MASTER);
  869. val |= ALX_MASTER_IRQMOD2_EN |
  870. ALX_MASTER_IRQMOD1_EN |
  871. ALX_MASTER_SYSALVTIMER_EN;
  872. alx_write_mem32(hw, ALX_MASTER, val);
  873. alx_write_mem32(hw, ALX_IRQ_MODU_TIMER,
  874. (hw->imt >> 1) << ALX_IRQ_MODU_TIMER1_SHIFT);
  875. /* intr re-trig timeout */
  876. alx_write_mem32(hw, ALX_INT_RETRIG, ALX_INT_RETRIG_TO);
  877. /* tpd threshold to trig int */
  878. alx_write_mem32(hw, ALX_TINT_TPD_THRSHLD, hw->ith_tpd);
  879. alx_write_mem32(hw, ALX_TINT_TIMER, hw->imt);
  880. raw_mtu = hw->mtu + ETH_HLEN;
  881. alx_write_mem32(hw, ALX_MTU, raw_mtu + 8);
  882. if (raw_mtu > ALX_MTU_JUMBO_TH)
  883. hw->rx_ctrl &= ~ALX_MAC_CTRL_FAST_PAUSE;
  884. if ((raw_mtu + 8) < ALX_TXQ1_JUMBO_TSO_TH)
  885. val = (raw_mtu + 8 + 7) >> 3;
  886. else
  887. val = ALX_TXQ1_JUMBO_TSO_TH >> 3;
  888. alx_write_mem32(hw, ALX_TXQ1, val | ALX_TXQ1_ERRLGPKT_DROP_EN);
  889. max_payload = pcie_get_readrq(hw->pdev) >> 8;
  890. /*
  891. * if BIOS had changed the default dma read max length,
  892. * restore it to default value
  893. */
  894. if (max_payload < ALX_DEV_CTRL_MAXRRS_MIN)
  895. pcie_set_readrq(hw->pdev, 128 << ALX_DEV_CTRL_MAXRRS_MIN);
  896. val = ALX_TXQ_TPD_BURSTPREF_DEF << ALX_TXQ0_TPD_BURSTPREF_SHIFT |
  897. ALX_TXQ0_MODE_ENHANCE | ALX_TXQ0_LSO_8023_EN |
  898. ALX_TXQ0_SUPT_IPOPT |
  899. ALX_TXQ_TXF_BURST_PREF_DEF << ALX_TXQ0_TXF_BURST_PREF_SHIFT;
  900. alx_write_mem32(hw, ALX_TXQ0, val);
  901. val = ALX_TXQ_TPD_BURSTPREF_DEF << ALX_HQTPD_Q1_NUMPREF_SHIFT |
  902. ALX_TXQ_TPD_BURSTPREF_DEF << ALX_HQTPD_Q2_NUMPREF_SHIFT |
  903. ALX_TXQ_TPD_BURSTPREF_DEF << ALX_HQTPD_Q3_NUMPREF_SHIFT |
  904. ALX_HQTPD_BURST_EN;
  905. alx_write_mem32(hw, ALX_HQTPD, val);
  906. /* rxq, flow control */
  907. val = alx_read_mem32(hw, ALX_SRAM5);
  908. val = ALX_GET_FIELD(val, ALX_SRAM_RXF_LEN) << 3;
  909. if (val > ALX_SRAM_RXF_LEN_8K) {
  910. val16 = ALX_MTU_STD_ALGN >> 3;
  911. val = (val - ALX_RXQ2_RXF_FLOW_CTRL_RSVD) >> 3;
  912. } else {
  913. val16 = ALX_MTU_STD_ALGN >> 3;
  914. val = (val - ALX_MTU_STD_ALGN) >> 3;
  915. }
  916. alx_write_mem32(hw, ALX_RXQ2,
  917. val16 << ALX_RXQ2_RXF_XOFF_THRESH_SHIFT |
  918. val << ALX_RXQ2_RXF_XON_THRESH_SHIFT);
  919. val = ALX_RXQ0_NUM_RFD_PREF_DEF << ALX_RXQ0_NUM_RFD_PREF_SHIFT |
  920. ALX_RXQ0_RSS_MODE_DIS << ALX_RXQ0_RSS_MODE_SHIFT |
  921. ALX_RXQ0_IDT_TBL_SIZE_DEF << ALX_RXQ0_IDT_TBL_SIZE_SHIFT |
  922. ALX_RXQ0_RSS_HSTYP_ALL | ALX_RXQ0_RSS_HASH_EN |
  923. ALX_RXQ0_IPV6_PARSE_EN;
  924. if (alx_hw_giga(hw))
  925. ALX_SET_FIELD(val, ALX_RXQ0_ASPM_THRESH,
  926. ALX_RXQ0_ASPM_THRESH_100M);
  927. alx_write_mem32(hw, ALX_RXQ0, val);
  928. val = alx_read_mem32(hw, ALX_DMA);
  929. val = ALX_DMA_RORDER_MODE_OUT << ALX_DMA_RORDER_MODE_SHIFT |
  930. ALX_DMA_RREQ_PRI_DATA |
  931. max_payload << ALX_DMA_RREQ_BLEN_SHIFT |
  932. ALX_DMA_WDLY_CNT_DEF << ALX_DMA_WDLY_CNT_SHIFT |
  933. ALX_DMA_RDLY_CNT_DEF << ALX_DMA_RDLY_CNT_SHIFT |
  934. (hw->dma_chnl - 1) << ALX_DMA_RCHNL_SEL_SHIFT;
  935. alx_write_mem32(hw, ALX_DMA, val);
  936. /* default multi-tx-q weights */
  937. val = ALX_WRR_PRI_RESTRICT_NONE << ALX_WRR_PRI_SHIFT |
  938. 4 << ALX_WRR_PRI0_SHIFT |
  939. 4 << ALX_WRR_PRI1_SHIFT |
  940. 4 << ALX_WRR_PRI2_SHIFT |
  941. 4 << ALX_WRR_PRI3_SHIFT;
  942. alx_write_mem32(hw, ALX_WRR, val);
  943. }
  944. static inline u32 alx_speed_to_ethadv(int speed)
  945. {
  946. switch (speed) {
  947. case SPEED_1000 + DUPLEX_FULL:
  948. return ADVERTISED_1000baseT_Full;
  949. case SPEED_100 + DUPLEX_FULL:
  950. return ADVERTISED_100baseT_Full;
  951. case SPEED_100 + DUPLEX_HALF:
  952. return ADVERTISED_10baseT_Half;
  953. case SPEED_10 + DUPLEX_FULL:
  954. return ADVERTISED_10baseT_Full;
  955. case SPEED_10 + DUPLEX_HALF:
  956. return ADVERTISED_10baseT_Half;
  957. default:
  958. return 0;
  959. }
  960. }
  961. int alx_select_powersaving_speed(struct alx_hw *hw, int *speed)
  962. {
  963. int i, err, spd;
  964. u16 lpa;
  965. err = alx_get_phy_link(hw, &spd);
  966. if (err < 0)
  967. return err;
  968. if (spd == SPEED_UNKNOWN)
  969. return 0;
  970. err = alx_read_phy_reg(hw, MII_LPA, &lpa);
  971. if (err)
  972. return err;
  973. if (!(lpa & LPA_LPACK)) {
  974. *speed = spd;
  975. return 0;
  976. }
  977. if (lpa & LPA_10FULL)
  978. *speed = SPEED_10 + DUPLEX_FULL;
  979. else if (lpa & LPA_10HALF)
  980. *speed = SPEED_10 + DUPLEX_HALF;
  981. else if (lpa & LPA_100FULL)
  982. *speed = SPEED_100 + DUPLEX_FULL;
  983. else
  984. *speed = SPEED_100 + DUPLEX_HALF;
  985. if (*speed != spd) {
  986. err = alx_write_phy_reg(hw, ALX_MII_IER, 0);
  987. if (err)
  988. return err;
  989. err = alx_setup_speed_duplex(hw,
  990. alx_speed_to_ethadv(*speed) |
  991. ADVERTISED_Autoneg,
  992. ALX_FC_ANEG | ALX_FC_RX |
  993. ALX_FC_TX);
  994. if (err)
  995. return err;
  996. /* wait for linkup */
  997. for (i = 0; i < ALX_MAX_SETUP_LNK_CYCLE; i++) {
  998. int speed2;
  999. msleep(100);
  1000. err = alx_get_phy_link(hw, &speed2);
  1001. if (err < 0)
  1002. return err;
  1003. if (speed2 != SPEED_UNKNOWN)
  1004. break;
  1005. }
  1006. if (i == ALX_MAX_SETUP_LNK_CYCLE)
  1007. return -ETIMEDOUT;
  1008. }
  1009. return 0;
  1010. }
  1011. bool alx_get_phy_info(struct alx_hw *hw)
  1012. {
  1013. u16 devs1, devs2;
  1014. if (alx_read_phy_reg(hw, MII_PHYSID1, &hw->phy_id[0]) ||
  1015. alx_read_phy_reg(hw, MII_PHYSID2, &hw->phy_id[1]))
  1016. return false;
  1017. /* since we haven't PMA/PMD status2 register, we can't
  1018. * use mdio45_probe function for prtad and mmds.
  1019. * use fixed MMD3 to get mmds.
  1020. */
  1021. if (alx_read_phy_ext(hw, 3, MDIO_DEVS1, &devs1) ||
  1022. alx_read_phy_ext(hw, 3, MDIO_DEVS2, &devs2))
  1023. return false;
  1024. hw->mdio.mmds = devs1 | devs2 << 16;
  1025. return true;
  1026. }