lan9303-core.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. /*
  2. * Copyright (C) 2017 Pengutronix, Juergen Borleis <kernel@pengutronix.de>
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * version 2, as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. */
  14. #include <linux/kernel.h>
  15. #include <linux/module.h>
  16. #include <linux/gpio/consumer.h>
  17. #include <linux/regmap.h>
  18. #include <linux/mutex.h>
  19. #include <linux/mii.h>
  20. #include "lan9303.h"
  21. #define LAN9303_CHIP_REV 0x14
  22. # define LAN9303_CHIP_ID 0x9303
  23. #define LAN9303_IRQ_CFG 0x15
  24. # define LAN9303_IRQ_CFG_IRQ_ENABLE BIT(8)
  25. # define LAN9303_IRQ_CFG_IRQ_POL BIT(4)
  26. # define LAN9303_IRQ_CFG_IRQ_TYPE BIT(0)
  27. #define LAN9303_INT_STS 0x16
  28. # define LAN9303_INT_STS_PHY_INT2 BIT(27)
  29. # define LAN9303_INT_STS_PHY_INT1 BIT(26)
  30. #define LAN9303_INT_EN 0x17
  31. # define LAN9303_INT_EN_PHY_INT2_EN BIT(27)
  32. # define LAN9303_INT_EN_PHY_INT1_EN BIT(26)
  33. #define LAN9303_HW_CFG 0x1D
  34. # define LAN9303_HW_CFG_READY BIT(27)
  35. # define LAN9303_HW_CFG_AMDX_EN_PORT2 BIT(26)
  36. # define LAN9303_HW_CFG_AMDX_EN_PORT1 BIT(25)
  37. #define LAN9303_PMI_DATA 0x29
  38. #define LAN9303_PMI_ACCESS 0x2A
  39. # define LAN9303_PMI_ACCESS_PHY_ADDR(x) (((x) & 0x1f) << 11)
  40. # define LAN9303_PMI_ACCESS_MIIRINDA(x) (((x) & 0x1f) << 6)
  41. # define LAN9303_PMI_ACCESS_MII_BUSY BIT(0)
  42. # define LAN9303_PMI_ACCESS_MII_WRITE BIT(1)
  43. #define LAN9303_MANUAL_FC_1 0x68
  44. #define LAN9303_MANUAL_FC_2 0x69
  45. #define LAN9303_MANUAL_FC_0 0x6a
  46. #define LAN9303_SWITCH_CSR_DATA 0x6b
  47. #define LAN9303_SWITCH_CSR_CMD 0x6c
  48. #define LAN9303_SWITCH_CSR_CMD_BUSY BIT(31)
  49. #define LAN9303_SWITCH_CSR_CMD_RW BIT(30)
  50. #define LAN9303_SWITCH_CSR_CMD_LANES (BIT(19) | BIT(18) | BIT(17) | BIT(16))
  51. #define LAN9303_VIRT_PHY_BASE 0x70
  52. #define LAN9303_VIRT_SPECIAL_CTRL 0x77
  53. #define LAN9303_SW_DEV_ID 0x0000
  54. #define LAN9303_SW_RESET 0x0001
  55. #define LAN9303_SW_RESET_RESET BIT(0)
  56. #define LAN9303_SW_IMR 0x0004
  57. #define LAN9303_SW_IPR 0x0005
  58. #define LAN9303_MAC_VER_ID_0 0x0400
  59. #define LAN9303_MAC_RX_CFG_0 0x0401
  60. # define LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES BIT(1)
  61. # define LAN9303_MAC_RX_CFG_X_RX_ENABLE BIT(0)
  62. #define LAN9303_MAC_RX_UNDSZE_CNT_0 0x0410
  63. #define LAN9303_MAC_RX_64_CNT_0 0x0411
  64. #define LAN9303_MAC_RX_127_CNT_0 0x0412
  65. #define LAN9303_MAC_RX_255_CNT_0 0x413
  66. #define LAN9303_MAC_RX_511_CNT_0 0x0414
  67. #define LAN9303_MAC_RX_1023_CNT_0 0x0415
  68. #define LAN9303_MAC_RX_MAX_CNT_0 0x0416
  69. #define LAN9303_MAC_RX_OVRSZE_CNT_0 0x0417
  70. #define LAN9303_MAC_RX_PKTOK_CNT_0 0x0418
  71. #define LAN9303_MAC_RX_CRCERR_CNT_0 0x0419
  72. #define LAN9303_MAC_RX_MULCST_CNT_0 0x041a
  73. #define LAN9303_MAC_RX_BRDCST_CNT_0 0x041b
  74. #define LAN9303_MAC_RX_PAUSE_CNT_0 0x041c
  75. #define LAN9303_MAC_RX_FRAG_CNT_0 0x041d
  76. #define LAN9303_MAC_RX_JABB_CNT_0 0x041e
  77. #define LAN9303_MAC_RX_ALIGN_CNT_0 0x041f
  78. #define LAN9303_MAC_RX_PKTLEN_CNT_0 0x0420
  79. #define LAN9303_MAC_RX_GOODPKTLEN_CNT_0 0x0421
  80. #define LAN9303_MAC_RX_SYMBL_CNT_0 0x0422
  81. #define LAN9303_MAC_RX_CTLFRM_CNT_0 0x0423
  82. #define LAN9303_MAC_TX_CFG_0 0x0440
  83. # define LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT (21 << 2)
  84. # define LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE BIT(1)
  85. # define LAN9303_MAC_TX_CFG_X_TX_ENABLE BIT(0)
  86. #define LAN9303_MAC_TX_DEFER_CNT_0 0x0451
  87. #define LAN9303_MAC_TX_PAUSE_CNT_0 0x0452
  88. #define LAN9303_MAC_TX_PKTOK_CNT_0 0x0453
  89. #define LAN9303_MAC_TX_64_CNT_0 0x0454
  90. #define LAN9303_MAC_TX_127_CNT_0 0x0455
  91. #define LAN9303_MAC_TX_255_CNT_0 0x0456
  92. #define LAN9303_MAC_TX_511_CNT_0 0x0457
  93. #define LAN9303_MAC_TX_1023_CNT_0 0x0458
  94. #define LAN9303_MAC_TX_MAX_CNT_0 0x0459
  95. #define LAN9303_MAC_TX_UNDSZE_CNT_0 0x045a
  96. #define LAN9303_MAC_TX_PKTLEN_CNT_0 0x045c
  97. #define LAN9303_MAC_TX_BRDCST_CNT_0 0x045d
  98. #define LAN9303_MAC_TX_MULCST_CNT_0 0x045e
  99. #define LAN9303_MAC_TX_LATECOL_0 0x045f
  100. #define LAN9303_MAC_TX_EXCOL_CNT_0 0x0460
  101. #define LAN9303_MAC_TX_SNGLECOL_CNT_0 0x0461
  102. #define LAN9303_MAC_TX_MULTICOL_CNT_0 0x0462
  103. #define LAN9303_MAC_TX_TOTALCOL_CNT_0 0x0463
  104. #define LAN9303_MAC_VER_ID_1 0x0800
  105. #define LAN9303_MAC_RX_CFG_1 0x0801
  106. #define LAN9303_MAC_TX_CFG_1 0x0840
  107. #define LAN9303_MAC_VER_ID_2 0x0c00
  108. #define LAN9303_MAC_RX_CFG_2 0x0c01
  109. #define LAN9303_MAC_TX_CFG_2 0x0c40
  110. #define LAN9303_SWE_ALR_CMD 0x1800
  111. #define LAN9303_SWE_VLAN_CMD 0x180b
  112. # define LAN9303_SWE_VLAN_CMD_RNW BIT(5)
  113. # define LAN9303_SWE_VLAN_CMD_PVIDNVLAN BIT(4)
  114. #define LAN9303_SWE_VLAN_WR_DATA 0x180c
  115. #define LAN9303_SWE_VLAN_RD_DATA 0x180e
  116. # define LAN9303_SWE_VLAN_MEMBER_PORT2 BIT(17)
  117. # define LAN9303_SWE_VLAN_UNTAG_PORT2 BIT(16)
  118. # define LAN9303_SWE_VLAN_MEMBER_PORT1 BIT(15)
  119. # define LAN9303_SWE_VLAN_UNTAG_PORT1 BIT(14)
  120. # define LAN9303_SWE_VLAN_MEMBER_PORT0 BIT(13)
  121. # define LAN9303_SWE_VLAN_UNTAG_PORT0 BIT(12)
  122. #define LAN9303_SWE_VLAN_CMD_STS 0x1810
  123. #define LAN9303_SWE_GLB_INGRESS_CFG 0x1840
  124. #define LAN9303_SWE_PORT_STATE 0x1843
  125. # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT2 (0)
  126. # define LAN9303_SWE_PORT_STATE_LEARNING_PORT2 BIT(5)
  127. # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT2 BIT(4)
  128. # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT1 (0)
  129. # define LAN9303_SWE_PORT_STATE_LEARNING_PORT1 BIT(3)
  130. # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT1 BIT(2)
  131. # define LAN9303_SWE_PORT_STATE_FORWARDING_PORT0 (0)
  132. # define LAN9303_SWE_PORT_STATE_LEARNING_PORT0 BIT(1)
  133. # define LAN9303_SWE_PORT_STATE_BLOCKING_PORT0 BIT(0)
  134. #define LAN9303_SWE_PORT_MIRROR 0x1846
  135. # define LAN9303_SWE_PORT_MIRROR_SNIFF_ALL BIT(8)
  136. # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT2 BIT(7)
  137. # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT1 BIT(6)
  138. # define LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 BIT(5)
  139. # define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT2 BIT(4)
  140. # define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 BIT(3)
  141. # define LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT0 BIT(2)
  142. # define LAN9303_SWE_PORT_MIRROR_ENABLE_RX_MIRRORING BIT(1)
  143. # define LAN9303_SWE_PORT_MIRROR_ENABLE_TX_MIRRORING BIT(0)
  144. #define LAN9303_SWE_INGRESS_PORT_TYPE 0x1847
  145. #define LAN9303_BM_CFG 0x1c00
  146. #define LAN9303_BM_EGRSS_PORT_TYPE 0x1c0c
  147. # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT2 (BIT(17) | BIT(16))
  148. # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT1 (BIT(9) | BIT(8))
  149. # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0 (BIT(1) | BIT(0))
  150. #define LAN9303_PORT_0_OFFSET 0x400
  151. #define LAN9303_PORT_1_OFFSET 0x800
  152. #define LAN9303_PORT_2_OFFSET 0xc00
  153. /* the built-in PHYs are of type LAN911X */
  154. #define MII_LAN911X_SPECIAL_MODES 0x12
  155. #define MII_LAN911X_SPECIAL_CONTROL_STATUS 0x1f
  156. static const struct regmap_range lan9303_valid_regs[] = {
  157. regmap_reg_range(0x14, 0x17), /* misc, interrupt */
  158. regmap_reg_range(0x19, 0x19), /* endian test */
  159. regmap_reg_range(0x1d, 0x1d), /* hardware config */
  160. regmap_reg_range(0x23, 0x24), /* general purpose timer */
  161. regmap_reg_range(0x27, 0x27), /* counter */
  162. regmap_reg_range(0x29, 0x2a), /* PMI index regs */
  163. regmap_reg_range(0x68, 0x6a), /* flow control */
  164. regmap_reg_range(0x6b, 0x6c), /* switch fabric indirect regs */
  165. regmap_reg_range(0x6d, 0x6f), /* misc */
  166. regmap_reg_range(0x70, 0x77), /* virtual phy */
  167. regmap_reg_range(0x78, 0x7a), /* GPIO */
  168. regmap_reg_range(0x7c, 0x7e), /* MAC & reset */
  169. regmap_reg_range(0x80, 0xb7), /* switch fabric direct regs (wr only) */
  170. };
  171. static const struct regmap_range lan9303_reserved_ranges[] = {
  172. regmap_reg_range(0x00, 0x13),
  173. regmap_reg_range(0x18, 0x18),
  174. regmap_reg_range(0x1a, 0x1c),
  175. regmap_reg_range(0x1e, 0x22),
  176. regmap_reg_range(0x25, 0x26),
  177. regmap_reg_range(0x28, 0x28),
  178. regmap_reg_range(0x2b, 0x67),
  179. regmap_reg_range(0x7b, 0x7b),
  180. regmap_reg_range(0x7f, 0x7f),
  181. regmap_reg_range(0xb8, 0xff),
  182. };
  183. const struct regmap_access_table lan9303_register_set = {
  184. .yes_ranges = lan9303_valid_regs,
  185. .n_yes_ranges = ARRAY_SIZE(lan9303_valid_regs),
  186. .no_ranges = lan9303_reserved_ranges,
  187. .n_no_ranges = ARRAY_SIZE(lan9303_reserved_ranges),
  188. };
  189. EXPORT_SYMBOL(lan9303_register_set);
  190. static int lan9303_read(struct regmap *regmap, unsigned int offset, u32 *reg)
  191. {
  192. int ret, i;
  193. /* we can lose arbitration for the I2C case, because the device
  194. * tries to detect and read an external EEPROM after reset and acts as
  195. * a master on the shared I2C bus itself. This conflicts with our
  196. * attempts to access the device as a slave at the same moment.
  197. */
  198. for (i = 0; i < 5; i++) {
  199. ret = regmap_read(regmap, offset, reg);
  200. if (!ret)
  201. return 0;
  202. if (ret != -EAGAIN)
  203. break;
  204. msleep(500);
  205. }
  206. return -EIO;
  207. }
  208. static int lan9303_virt_phy_reg_read(struct lan9303 *chip, int regnum)
  209. {
  210. int ret;
  211. u32 val;
  212. if (regnum > MII_EXPANSION)
  213. return -EINVAL;
  214. ret = lan9303_read(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, &val);
  215. if (ret)
  216. return ret;
  217. return val & 0xffff;
  218. }
  219. static int lan9303_virt_phy_reg_write(struct lan9303 *chip, int regnum, u16 val)
  220. {
  221. if (regnum > MII_EXPANSION)
  222. return -EINVAL;
  223. return regmap_write(chip->regmap, LAN9303_VIRT_PHY_BASE + regnum, val);
  224. }
  225. static int lan9303_port_phy_reg_wait_for_completion(struct lan9303 *chip)
  226. {
  227. int ret, i;
  228. u32 reg;
  229. for (i = 0; i < 25; i++) {
  230. ret = lan9303_read(chip->regmap, LAN9303_PMI_ACCESS, &reg);
  231. if (ret) {
  232. dev_err(chip->dev,
  233. "Failed to read pmi access status: %d\n", ret);
  234. return ret;
  235. }
  236. if (!(reg & LAN9303_PMI_ACCESS_MII_BUSY))
  237. return 0;
  238. msleep(1);
  239. }
  240. return -EIO;
  241. }
  242. static int lan9303_port_phy_reg_read(struct lan9303 *chip, int addr, int regnum)
  243. {
  244. int ret;
  245. u32 val;
  246. val = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
  247. val |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
  248. mutex_lock(&chip->indirect_mutex);
  249. ret = lan9303_port_phy_reg_wait_for_completion(chip);
  250. if (ret)
  251. goto on_error;
  252. /* start the MII read cycle */
  253. ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, val);
  254. if (ret)
  255. goto on_error;
  256. ret = lan9303_port_phy_reg_wait_for_completion(chip);
  257. if (ret)
  258. goto on_error;
  259. /* read the result of this operation */
  260. ret = lan9303_read(chip->regmap, LAN9303_PMI_DATA, &val);
  261. if (ret)
  262. goto on_error;
  263. mutex_unlock(&chip->indirect_mutex);
  264. return val & 0xffff;
  265. on_error:
  266. mutex_unlock(&chip->indirect_mutex);
  267. return ret;
  268. }
  269. static int lan9303_phy_reg_write(struct lan9303 *chip, int addr, int regnum,
  270. unsigned int val)
  271. {
  272. int ret;
  273. u32 reg;
  274. reg = LAN9303_PMI_ACCESS_PHY_ADDR(addr);
  275. reg |= LAN9303_PMI_ACCESS_MIIRINDA(regnum);
  276. reg |= LAN9303_PMI_ACCESS_MII_WRITE;
  277. mutex_lock(&chip->indirect_mutex);
  278. ret = lan9303_port_phy_reg_wait_for_completion(chip);
  279. if (ret)
  280. goto on_error;
  281. /* write the data first... */
  282. ret = regmap_write(chip->regmap, LAN9303_PMI_DATA, val);
  283. if (ret)
  284. goto on_error;
  285. /* ...then start the MII write cycle */
  286. ret = regmap_write(chip->regmap, LAN9303_PMI_ACCESS, reg);
  287. on_error:
  288. mutex_unlock(&chip->indirect_mutex);
  289. return ret;
  290. }
  291. static int lan9303_switch_wait_for_completion(struct lan9303 *chip)
  292. {
  293. int ret, i;
  294. u32 reg;
  295. for (i = 0; i < 25; i++) {
  296. ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_CMD, &reg);
  297. if (ret) {
  298. dev_err(chip->dev,
  299. "Failed to read csr command status: %d\n", ret);
  300. return ret;
  301. }
  302. if (!(reg & LAN9303_SWITCH_CSR_CMD_BUSY))
  303. return 0;
  304. msleep(1);
  305. }
  306. return -EIO;
  307. }
  308. static int lan9303_write_switch_reg(struct lan9303 *chip, u16 regnum, u32 val)
  309. {
  310. u32 reg;
  311. int ret;
  312. reg = regnum;
  313. reg |= LAN9303_SWITCH_CSR_CMD_LANES;
  314. reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
  315. mutex_lock(&chip->indirect_mutex);
  316. ret = lan9303_switch_wait_for_completion(chip);
  317. if (ret)
  318. goto on_error;
  319. ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
  320. if (ret) {
  321. dev_err(chip->dev, "Failed to write csr data reg: %d\n", ret);
  322. goto on_error;
  323. }
  324. /* trigger write */
  325. ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
  326. if (ret)
  327. dev_err(chip->dev, "Failed to write csr command reg: %d\n",
  328. ret);
  329. on_error:
  330. mutex_unlock(&chip->indirect_mutex);
  331. return ret;
  332. }
  333. static int lan9303_read_switch_reg(struct lan9303 *chip, u16 regnum, u32 *val)
  334. {
  335. u32 reg;
  336. int ret;
  337. reg = regnum;
  338. reg |= LAN9303_SWITCH_CSR_CMD_LANES;
  339. reg |= LAN9303_SWITCH_CSR_CMD_RW;
  340. reg |= LAN9303_SWITCH_CSR_CMD_BUSY;
  341. mutex_lock(&chip->indirect_mutex);
  342. ret = lan9303_switch_wait_for_completion(chip);
  343. if (ret)
  344. goto on_error;
  345. /* trigger read */
  346. ret = regmap_write(chip->regmap, LAN9303_SWITCH_CSR_CMD, reg);
  347. if (ret) {
  348. dev_err(chip->dev, "Failed to write csr command reg: %d\n",
  349. ret);
  350. goto on_error;
  351. }
  352. ret = lan9303_switch_wait_for_completion(chip);
  353. if (ret)
  354. goto on_error;
  355. ret = lan9303_read(chip->regmap, LAN9303_SWITCH_CSR_DATA, val);
  356. if (ret)
  357. dev_err(chip->dev, "Failed to read csr data reg: %d\n", ret);
  358. on_error:
  359. mutex_unlock(&chip->indirect_mutex);
  360. return ret;
  361. }
  362. static int lan9303_detect_phy_setup(struct lan9303 *chip)
  363. {
  364. int reg;
  365. /* depending on the 'phy_addr_sel_strap' setting, the three phys are
  366. * using IDs 0-1-2 or IDs 1-2-3. We cannot read back the
  367. * 'phy_addr_sel_strap' setting directly, so we need a test, which
  368. * configuration is active:
  369. * Special reg 18 of phy 3 reads as 0x0000, if 'phy_addr_sel_strap' is 0
  370. * and the IDs are 0-1-2, else it contains something different from
  371. * 0x0000, which means 'phy_addr_sel_strap' is 1 and the IDs are 1-2-3.
  372. */
  373. reg = lan9303_port_phy_reg_read(chip, 3, MII_LAN911X_SPECIAL_MODES);
  374. if (reg < 0) {
  375. dev_err(chip->dev, "Failed to detect phy config: %d\n", reg);
  376. return reg;
  377. }
  378. if (reg != 0)
  379. chip->phy_addr_sel_strap = 1;
  380. else
  381. chip->phy_addr_sel_strap = 0;
  382. dev_dbg(chip->dev, "Phy setup '%s' detected\n",
  383. chip->phy_addr_sel_strap ? "1-2-3" : "0-1-2");
  384. return 0;
  385. }
  386. #define LAN9303_MAC_RX_CFG_OFFS (LAN9303_MAC_RX_CFG_0 - LAN9303_PORT_0_OFFSET)
  387. #define LAN9303_MAC_TX_CFG_OFFS (LAN9303_MAC_TX_CFG_0 - LAN9303_PORT_0_OFFSET)
  388. static int lan9303_disable_packet_processing(struct lan9303 *chip,
  389. unsigned int port)
  390. {
  391. int ret;
  392. /* disable RX, but keep register reset default values else */
  393. ret = lan9303_write_switch_reg(chip, LAN9303_MAC_RX_CFG_OFFS + port,
  394. LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES);
  395. if (ret)
  396. return ret;
  397. /* disable TX, but keep register reset default values else */
  398. return lan9303_write_switch_reg(chip, LAN9303_MAC_TX_CFG_OFFS + port,
  399. LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT |
  400. LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE);
  401. }
  402. static int lan9303_enable_packet_processing(struct lan9303 *chip,
  403. unsigned int port)
  404. {
  405. int ret;
  406. /* enable RX and keep register reset default values else */
  407. ret = lan9303_write_switch_reg(chip, LAN9303_MAC_RX_CFG_OFFS + port,
  408. LAN9303_MAC_RX_CFG_X_REJECT_MAC_TYPES |
  409. LAN9303_MAC_RX_CFG_X_RX_ENABLE);
  410. if (ret)
  411. return ret;
  412. /* enable TX and keep register reset default values else */
  413. return lan9303_write_switch_reg(chip, LAN9303_MAC_TX_CFG_OFFS + port,
  414. LAN9303_MAC_TX_CFG_X_TX_IFG_CONFIG_DEFAULT |
  415. LAN9303_MAC_TX_CFG_X_TX_PAD_ENABLE |
  416. LAN9303_MAC_TX_CFG_X_TX_ENABLE);
  417. }
  418. /* We want a special working switch:
  419. * - do not forward packets between port 1 and 2
  420. * - forward everything from port 1 to port 0
  421. * - forward everything from port 2 to port 0
  422. * - forward special tagged packets from port 0 to port 1 *or* port 2
  423. */
  424. static int lan9303_separate_ports(struct lan9303 *chip)
  425. {
  426. int ret;
  427. ret = lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_MIRROR,
  428. LAN9303_SWE_PORT_MIRROR_SNIFFER_PORT0 |
  429. LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT1 |
  430. LAN9303_SWE_PORT_MIRROR_MIRRORED_PORT2 |
  431. LAN9303_SWE_PORT_MIRROR_ENABLE_RX_MIRRORING |
  432. LAN9303_SWE_PORT_MIRROR_SNIFF_ALL);
  433. if (ret)
  434. return ret;
  435. /* enable defining the destination port via special VLAN tagging
  436. * for port 0
  437. */
  438. ret = lan9303_write_switch_reg(chip, LAN9303_SWE_INGRESS_PORT_TYPE,
  439. 0x03);
  440. if (ret)
  441. return ret;
  442. /* tag incoming packets at port 1 and 2 on their way to port 0 to be
  443. * able to discover their source port
  444. */
  445. ret = lan9303_write_switch_reg(chip, LAN9303_BM_EGRSS_PORT_TYPE,
  446. LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0);
  447. if (ret)
  448. return ret;
  449. /* prevent port 1 and 2 from forwarding packets by their own */
  450. return lan9303_write_switch_reg(chip, LAN9303_SWE_PORT_STATE,
  451. LAN9303_SWE_PORT_STATE_FORWARDING_PORT0 |
  452. LAN9303_SWE_PORT_STATE_BLOCKING_PORT1 |
  453. LAN9303_SWE_PORT_STATE_BLOCKING_PORT2);
  454. }
  455. static int lan9303_handle_reset(struct lan9303 *chip)
  456. {
  457. if (!chip->reset_gpio)
  458. return 0;
  459. if (chip->reset_duration != 0)
  460. msleep(chip->reset_duration);
  461. /* release (deassert) reset and activate the device */
  462. gpiod_set_value_cansleep(chip->reset_gpio, 0);
  463. return 0;
  464. }
  465. /* stop processing packets for all ports */
  466. static int lan9303_disable_processing(struct lan9303 *chip)
  467. {
  468. int ret;
  469. ret = lan9303_disable_packet_processing(chip, LAN9303_PORT_0_OFFSET);
  470. if (ret)
  471. return ret;
  472. ret = lan9303_disable_packet_processing(chip, LAN9303_PORT_1_OFFSET);
  473. if (ret)
  474. return ret;
  475. return lan9303_disable_packet_processing(chip, LAN9303_PORT_2_OFFSET);
  476. }
  477. static int lan9303_check_device(struct lan9303 *chip)
  478. {
  479. int ret;
  480. u32 reg;
  481. ret = lan9303_read(chip->regmap, LAN9303_CHIP_REV, &reg);
  482. if (ret) {
  483. dev_err(chip->dev, "failed to read chip revision register: %d\n",
  484. ret);
  485. if (!chip->reset_gpio) {
  486. dev_dbg(chip->dev,
  487. "hint: maybe failed due to missing reset GPIO\n");
  488. }
  489. return ret;
  490. }
  491. if ((reg >> 16) != LAN9303_CHIP_ID) {
  492. dev_err(chip->dev, "expecting LAN9303 chip, but found: %X\n",
  493. reg >> 16);
  494. return ret;
  495. }
  496. /* The default state of the LAN9303 device is to forward packets between
  497. * all ports (if not configured differently by an external EEPROM).
  498. * The initial state of a DSA device must be forwarding packets only
  499. * between the external and the internal ports and no forwarding
  500. * between the external ports. In preparation we stop packet handling
  501. * at all for now until the LAN9303 device is re-programmed accordingly.
  502. */
  503. ret = lan9303_disable_processing(chip);
  504. if (ret)
  505. dev_warn(chip->dev, "failed to disable switching %d\n", ret);
  506. dev_info(chip->dev, "Found LAN9303 rev. %u\n", reg & 0xffff);
  507. ret = lan9303_detect_phy_setup(chip);
  508. if (ret) {
  509. dev_err(chip->dev,
  510. "failed to discover phy bootstrap setup: %d\n", ret);
  511. return ret;
  512. }
  513. return 0;
  514. }
  515. /* ---------------------------- DSA -----------------------------------*/
  516. static enum dsa_tag_protocol lan9303_get_tag_protocol(struct dsa_switch *ds)
  517. {
  518. return DSA_TAG_PROTO_LAN9303;
  519. }
  520. static int lan9303_setup(struct dsa_switch *ds)
  521. {
  522. struct lan9303 *chip = ds->priv;
  523. int ret;
  524. /* Make sure that port 0 is the cpu port */
  525. if (!dsa_is_cpu_port(ds, 0)) {
  526. dev_err(chip->dev, "port 0 is not the CPU port\n");
  527. return -EINVAL;
  528. }
  529. ret = lan9303_separate_ports(chip);
  530. if (ret)
  531. dev_err(chip->dev, "failed to separate ports %d\n", ret);
  532. ret = lan9303_enable_packet_processing(chip, LAN9303_PORT_0_OFFSET);
  533. if (ret)
  534. dev_err(chip->dev, "failed to re-enable switching %d\n", ret);
  535. return 0;
  536. }
  537. struct lan9303_mib_desc {
  538. unsigned int offset; /* offset of first MAC */
  539. const char *name;
  540. };
  541. static const struct lan9303_mib_desc lan9303_mib[] = {
  542. { .offset = LAN9303_MAC_RX_BRDCST_CNT_0, .name = "RxBroad", },
  543. { .offset = LAN9303_MAC_RX_PAUSE_CNT_0, .name = "RxPause", },
  544. { .offset = LAN9303_MAC_RX_MULCST_CNT_0, .name = "RxMulti", },
  545. { .offset = LAN9303_MAC_RX_PKTOK_CNT_0, .name = "RxOk", },
  546. { .offset = LAN9303_MAC_RX_CRCERR_CNT_0, .name = "RxCrcErr", },
  547. { .offset = LAN9303_MAC_RX_ALIGN_CNT_0, .name = "RxAlignErr", },
  548. { .offset = LAN9303_MAC_RX_JABB_CNT_0, .name = "RxJabber", },
  549. { .offset = LAN9303_MAC_RX_FRAG_CNT_0, .name = "RxFragment", },
  550. { .offset = LAN9303_MAC_RX_64_CNT_0, .name = "Rx64Byte", },
  551. { .offset = LAN9303_MAC_RX_127_CNT_0, .name = "Rx128Byte", },
  552. { .offset = LAN9303_MAC_RX_255_CNT_0, .name = "Rx256Byte", },
  553. { .offset = LAN9303_MAC_RX_511_CNT_0, .name = "Rx512Byte", },
  554. { .offset = LAN9303_MAC_RX_1023_CNT_0, .name = "Rx1024Byte", },
  555. { .offset = LAN9303_MAC_RX_MAX_CNT_0, .name = "RxMaxByte", },
  556. { .offset = LAN9303_MAC_RX_PKTLEN_CNT_0, .name = "RxByteCnt", },
  557. { .offset = LAN9303_MAC_RX_SYMBL_CNT_0, .name = "RxSymbolCnt", },
  558. { .offset = LAN9303_MAC_RX_CTLFRM_CNT_0, .name = "RxCfs", },
  559. { .offset = LAN9303_MAC_RX_OVRSZE_CNT_0, .name = "RxOverFlow", },
  560. { .offset = LAN9303_MAC_TX_UNDSZE_CNT_0, .name = "TxShort", },
  561. { .offset = LAN9303_MAC_TX_BRDCST_CNT_0, .name = "TxBroad", },
  562. { .offset = LAN9303_MAC_TX_PAUSE_CNT_0, .name = "TxPause", },
  563. { .offset = LAN9303_MAC_TX_MULCST_CNT_0, .name = "TxMulti", },
  564. { .offset = LAN9303_MAC_RX_UNDSZE_CNT_0, .name = "TxUnderRun", },
  565. { .offset = LAN9303_MAC_TX_64_CNT_0, .name = "Tx64Byte", },
  566. { .offset = LAN9303_MAC_TX_127_CNT_0, .name = "Tx128Byte", },
  567. { .offset = LAN9303_MAC_TX_255_CNT_0, .name = "Tx256Byte", },
  568. { .offset = LAN9303_MAC_TX_511_CNT_0, .name = "Tx512Byte", },
  569. { .offset = LAN9303_MAC_TX_1023_CNT_0, .name = "Tx1024Byte", },
  570. { .offset = LAN9303_MAC_TX_MAX_CNT_0, .name = "TxMaxByte", },
  571. { .offset = LAN9303_MAC_TX_PKTLEN_CNT_0, .name = "TxByteCnt", },
  572. { .offset = LAN9303_MAC_TX_PKTOK_CNT_0, .name = "TxOk", },
  573. { .offset = LAN9303_MAC_TX_TOTALCOL_CNT_0, .name = "TxCollision", },
  574. { .offset = LAN9303_MAC_TX_MULTICOL_CNT_0, .name = "TxMultiCol", },
  575. { .offset = LAN9303_MAC_TX_SNGLECOL_CNT_0, .name = "TxSingleCol", },
  576. { .offset = LAN9303_MAC_TX_EXCOL_CNT_0, .name = "TxExcCol", },
  577. { .offset = LAN9303_MAC_TX_DEFER_CNT_0, .name = "TxDefer", },
  578. { .offset = LAN9303_MAC_TX_LATECOL_0, .name = "TxLateCol", },
  579. };
  580. static void lan9303_get_strings(struct dsa_switch *ds, int port, uint8_t *data)
  581. {
  582. unsigned int u;
  583. for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) {
  584. strncpy(data + u * ETH_GSTRING_LEN, lan9303_mib[u].name,
  585. ETH_GSTRING_LEN);
  586. }
  587. }
  588. static void lan9303_get_ethtool_stats(struct dsa_switch *ds, int port,
  589. uint64_t *data)
  590. {
  591. struct lan9303 *chip = ds->priv;
  592. u32 reg;
  593. unsigned int u, poff;
  594. int ret;
  595. poff = port * 0x400;
  596. for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) {
  597. ret = lan9303_read_switch_reg(chip,
  598. lan9303_mib[u].offset + poff,
  599. &reg);
  600. if (ret)
  601. dev_warn(chip->dev, "Reading status reg %u failed\n",
  602. lan9303_mib[u].offset + poff);
  603. data[u] = reg;
  604. }
  605. }
  606. static int lan9303_get_sset_count(struct dsa_switch *ds)
  607. {
  608. return ARRAY_SIZE(lan9303_mib);
  609. }
  610. static int lan9303_phy_read(struct dsa_switch *ds, int phy, int regnum)
  611. {
  612. struct lan9303 *chip = ds->priv;
  613. int phy_base = chip->phy_addr_sel_strap;
  614. if (phy == phy_base)
  615. return lan9303_virt_phy_reg_read(chip, regnum);
  616. if (phy > phy_base + 2)
  617. return -ENODEV;
  618. return lan9303_port_phy_reg_read(chip, phy, regnum);
  619. }
  620. static int lan9303_phy_write(struct dsa_switch *ds, int phy, int regnum,
  621. u16 val)
  622. {
  623. struct lan9303 *chip = ds->priv;
  624. int phy_base = chip->phy_addr_sel_strap;
  625. if (phy == phy_base)
  626. return lan9303_virt_phy_reg_write(chip, regnum, val);
  627. if (phy > phy_base + 2)
  628. return -ENODEV;
  629. return lan9303_phy_reg_write(chip, phy, regnum, val);
  630. }
  631. static int lan9303_port_enable(struct dsa_switch *ds, int port,
  632. struct phy_device *phy)
  633. {
  634. struct lan9303 *chip = ds->priv;
  635. /* enable internal packet processing */
  636. switch (port) {
  637. case 1:
  638. return lan9303_enable_packet_processing(chip,
  639. LAN9303_PORT_1_OFFSET);
  640. case 2:
  641. return lan9303_enable_packet_processing(chip,
  642. LAN9303_PORT_2_OFFSET);
  643. default:
  644. dev_dbg(chip->dev,
  645. "Error: request to power up invalid port %d\n", port);
  646. }
  647. return -ENODEV;
  648. }
  649. static void lan9303_port_disable(struct dsa_switch *ds, int port,
  650. struct phy_device *phy)
  651. {
  652. struct lan9303 *chip = ds->priv;
  653. /* disable internal packet processing */
  654. switch (port) {
  655. case 1:
  656. lan9303_disable_packet_processing(chip, LAN9303_PORT_1_OFFSET);
  657. lan9303_phy_reg_write(chip, chip->phy_addr_sel_strap + 1,
  658. MII_BMCR, BMCR_PDOWN);
  659. break;
  660. case 2:
  661. lan9303_disable_packet_processing(chip, LAN9303_PORT_2_OFFSET);
  662. lan9303_phy_reg_write(chip, chip->phy_addr_sel_strap + 2,
  663. MII_BMCR, BMCR_PDOWN);
  664. break;
  665. default:
  666. dev_dbg(chip->dev,
  667. "Error: request to power down invalid port %d\n", port);
  668. }
  669. }
  670. static struct dsa_switch_ops lan9303_switch_ops = {
  671. .get_tag_protocol = lan9303_get_tag_protocol,
  672. .setup = lan9303_setup,
  673. .get_strings = lan9303_get_strings,
  674. .phy_read = lan9303_phy_read,
  675. .phy_write = lan9303_phy_write,
  676. .get_ethtool_stats = lan9303_get_ethtool_stats,
  677. .get_sset_count = lan9303_get_sset_count,
  678. .port_enable = lan9303_port_enable,
  679. .port_disable = lan9303_port_disable,
  680. };
  681. static int lan9303_register_switch(struct lan9303 *chip)
  682. {
  683. chip->ds = dsa_switch_alloc(chip->dev, DSA_MAX_PORTS);
  684. if (!chip->ds)
  685. return -ENOMEM;
  686. chip->ds->priv = chip;
  687. chip->ds->ops = &lan9303_switch_ops;
  688. chip->ds->phys_mii_mask = chip->phy_addr_sel_strap ? 0xe : 0x7;
  689. return dsa_register_switch(chip->ds, chip->dev);
  690. }
  691. static void lan9303_probe_reset_gpio(struct lan9303 *chip,
  692. struct device_node *np)
  693. {
  694. chip->reset_gpio = devm_gpiod_get_optional(chip->dev, "reset",
  695. GPIOD_OUT_LOW);
  696. if (!chip->reset_gpio) {
  697. dev_dbg(chip->dev, "No reset GPIO defined\n");
  698. return;
  699. }
  700. chip->reset_duration = 200;
  701. if (np) {
  702. of_property_read_u32(np, "reset-duration",
  703. &chip->reset_duration);
  704. } else {
  705. dev_dbg(chip->dev, "reset duration defaults to 200 ms\n");
  706. }
  707. /* A sane reset duration should not be longer than 1s */
  708. if (chip->reset_duration > 1000)
  709. chip->reset_duration = 1000;
  710. }
  711. int lan9303_probe(struct lan9303 *chip, struct device_node *np)
  712. {
  713. int ret;
  714. mutex_init(&chip->indirect_mutex);
  715. lan9303_probe_reset_gpio(chip, np);
  716. ret = lan9303_handle_reset(chip);
  717. if (ret)
  718. return ret;
  719. ret = lan9303_check_device(chip);
  720. if (ret)
  721. return ret;
  722. ret = lan9303_register_switch(chip);
  723. if (ret) {
  724. dev_dbg(chip->dev, "Failed to register switch: %d\n", ret);
  725. return ret;
  726. }
  727. return 0;
  728. }
  729. EXPORT_SYMBOL(lan9303_probe);
  730. int lan9303_remove(struct lan9303 *chip)
  731. {
  732. int rc;
  733. rc = lan9303_disable_processing(chip);
  734. if (rc != 0)
  735. dev_warn(chip->dev, "shutting down failed\n");
  736. dsa_unregister_switch(chip->ds);
  737. /* assert reset to the whole device to prevent it from doing anything */
  738. gpiod_set_value_cansleep(chip->reset_gpio, 1);
  739. gpiod_unexport(chip->reset_gpio);
  740. return 0;
  741. }
  742. EXPORT_SYMBOL(lan9303_remove);
  743. MODULE_AUTHOR("Juergen Borleis <kernel@pengutronix.de>");
  744. MODULE_DESCRIPTION("Core driver for SMSC/Microchip LAN9303 three port ethernet switch");
  745. MODULE_LICENSE("GPL v2");