qca8k.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  1. /*
  2. * Copyright (C) 2009 Felix Fietkau <nbd@nbd.name>
  3. * Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org>
  4. * Copyright (c) 2015, The Linux Foundation. All rights reserved.
  5. * Copyright (c) 2016 John Crispin <john@phrozen.org>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 and
  9. * only version 2 as published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. */
  16. #include <linux/module.h>
  17. #include <linux/phy.h>
  18. #include <linux/netdevice.h>
  19. #include <net/dsa.h>
  20. #include <linux/of_net.h>
  21. #include <linux/of_platform.h>
  22. #include <linux/if_bridge.h>
  23. #include <linux/mdio.h>
  24. #include <linux/etherdevice.h>
  25. #include "qca8k.h"
  26. #define MIB_DESC(_s, _o, _n) \
  27. { \
  28. .size = (_s), \
  29. .offset = (_o), \
  30. .name = (_n), \
  31. }
  32. static const struct qca8k_mib_desc ar8327_mib[] = {
  33. MIB_DESC(1, 0x00, "RxBroad"),
  34. MIB_DESC(1, 0x04, "RxPause"),
  35. MIB_DESC(1, 0x08, "RxMulti"),
  36. MIB_DESC(1, 0x0c, "RxFcsErr"),
  37. MIB_DESC(1, 0x10, "RxAlignErr"),
  38. MIB_DESC(1, 0x14, "RxRunt"),
  39. MIB_DESC(1, 0x18, "RxFragment"),
  40. MIB_DESC(1, 0x1c, "Rx64Byte"),
  41. MIB_DESC(1, 0x20, "Rx128Byte"),
  42. MIB_DESC(1, 0x24, "Rx256Byte"),
  43. MIB_DESC(1, 0x28, "Rx512Byte"),
  44. MIB_DESC(1, 0x2c, "Rx1024Byte"),
  45. MIB_DESC(1, 0x30, "Rx1518Byte"),
  46. MIB_DESC(1, 0x34, "RxMaxByte"),
  47. MIB_DESC(1, 0x38, "RxTooLong"),
  48. MIB_DESC(2, 0x3c, "RxGoodByte"),
  49. MIB_DESC(2, 0x44, "RxBadByte"),
  50. MIB_DESC(1, 0x4c, "RxOverFlow"),
  51. MIB_DESC(1, 0x50, "Filtered"),
  52. MIB_DESC(1, 0x54, "TxBroad"),
  53. MIB_DESC(1, 0x58, "TxPause"),
  54. MIB_DESC(1, 0x5c, "TxMulti"),
  55. MIB_DESC(1, 0x60, "TxUnderRun"),
  56. MIB_DESC(1, 0x64, "Tx64Byte"),
  57. MIB_DESC(1, 0x68, "Tx128Byte"),
  58. MIB_DESC(1, 0x6c, "Tx256Byte"),
  59. MIB_DESC(1, 0x70, "Tx512Byte"),
  60. MIB_DESC(1, 0x74, "Tx1024Byte"),
  61. MIB_DESC(1, 0x78, "Tx1518Byte"),
  62. MIB_DESC(1, 0x7c, "TxMaxByte"),
  63. MIB_DESC(1, 0x80, "TxOverSize"),
  64. MIB_DESC(2, 0x84, "TxByte"),
  65. MIB_DESC(1, 0x8c, "TxCollision"),
  66. MIB_DESC(1, 0x90, "TxAbortCol"),
  67. MIB_DESC(1, 0x94, "TxMultiCol"),
  68. MIB_DESC(1, 0x98, "TxSingleCol"),
  69. MIB_DESC(1, 0x9c, "TxExcDefer"),
  70. MIB_DESC(1, 0xa0, "TxDefer"),
  71. MIB_DESC(1, 0xa4, "TxLateCol"),
  72. };
  73. /* The 32bit switch registers are accessed indirectly. To achieve this we need
  74. * to set the page of the register. Track the last page that was set to reduce
  75. * mdio writes
  76. */
  77. static u16 qca8k_current_page = 0xffff;
  78. static void
  79. qca8k_split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page)
  80. {
  81. regaddr >>= 1;
  82. *r1 = regaddr & 0x1e;
  83. regaddr >>= 5;
  84. *r2 = regaddr & 0x7;
  85. regaddr >>= 3;
  86. *page = regaddr & 0x3ff;
  87. }
  88. static u32
  89. qca8k_mii_read32(struct mii_bus *bus, int phy_id, u32 regnum)
  90. {
  91. u32 val;
  92. int ret;
  93. ret = bus->read(bus, phy_id, regnum);
  94. if (ret >= 0) {
  95. val = ret;
  96. ret = bus->read(bus, phy_id, regnum + 1);
  97. val |= ret << 16;
  98. }
  99. if (ret < 0) {
  100. dev_err_ratelimited(&bus->dev,
  101. "failed to read qca8k 32bit register\n");
  102. return ret;
  103. }
  104. return val;
  105. }
  106. static void
  107. qca8k_mii_write32(struct mii_bus *bus, int phy_id, u32 regnum, u32 val)
  108. {
  109. u16 lo, hi;
  110. int ret;
  111. lo = val & 0xffff;
  112. hi = (u16)(val >> 16);
  113. ret = bus->write(bus, phy_id, regnum, lo);
  114. if (ret >= 0)
  115. ret = bus->write(bus, phy_id, regnum + 1, hi);
  116. if (ret < 0)
  117. dev_err_ratelimited(&bus->dev,
  118. "failed to write qca8k 32bit register\n");
  119. }
  120. static void
  121. qca8k_set_page(struct mii_bus *bus, u16 page)
  122. {
  123. if (page == qca8k_current_page)
  124. return;
  125. if (bus->write(bus, 0x18, 0, page) < 0)
  126. dev_err_ratelimited(&bus->dev,
  127. "failed to set qca8k page\n");
  128. qca8k_current_page = page;
  129. }
  130. static u32
  131. qca8k_read(struct qca8k_priv *priv, u32 reg)
  132. {
  133. u16 r1, r2, page;
  134. u32 val;
  135. qca8k_split_addr(reg, &r1, &r2, &page);
  136. mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED);
  137. qca8k_set_page(priv->bus, page);
  138. val = qca8k_mii_read32(priv->bus, 0x10 | r2, r1);
  139. mutex_unlock(&priv->bus->mdio_lock);
  140. return val;
  141. }
  142. static void
  143. qca8k_write(struct qca8k_priv *priv, u32 reg, u32 val)
  144. {
  145. u16 r1, r2, page;
  146. qca8k_split_addr(reg, &r1, &r2, &page);
  147. mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED);
  148. qca8k_set_page(priv->bus, page);
  149. qca8k_mii_write32(priv->bus, 0x10 | r2, r1, val);
  150. mutex_unlock(&priv->bus->mdio_lock);
  151. }
  152. static u32
  153. qca8k_rmw(struct qca8k_priv *priv, u32 reg, u32 mask, u32 val)
  154. {
  155. u16 r1, r2, page;
  156. u32 ret;
  157. qca8k_split_addr(reg, &r1, &r2, &page);
  158. mutex_lock_nested(&priv->bus->mdio_lock, MDIO_MUTEX_NESTED);
  159. qca8k_set_page(priv->bus, page);
  160. ret = qca8k_mii_read32(priv->bus, 0x10 | r2, r1);
  161. ret &= ~mask;
  162. ret |= val;
  163. qca8k_mii_write32(priv->bus, 0x10 | r2, r1, ret);
  164. mutex_unlock(&priv->bus->mdio_lock);
  165. return ret;
  166. }
  167. static void
  168. qca8k_reg_set(struct qca8k_priv *priv, u32 reg, u32 val)
  169. {
  170. qca8k_rmw(priv, reg, 0, val);
  171. }
  172. static void
  173. qca8k_reg_clear(struct qca8k_priv *priv, u32 reg, u32 val)
  174. {
  175. qca8k_rmw(priv, reg, val, 0);
  176. }
  177. static int
  178. qca8k_regmap_read(void *ctx, uint32_t reg, uint32_t *val)
  179. {
  180. struct qca8k_priv *priv = (struct qca8k_priv *)ctx;
  181. *val = qca8k_read(priv, reg);
  182. return 0;
  183. }
  184. static int
  185. qca8k_regmap_write(void *ctx, uint32_t reg, uint32_t val)
  186. {
  187. struct qca8k_priv *priv = (struct qca8k_priv *)ctx;
  188. qca8k_write(priv, reg, val);
  189. return 0;
  190. }
  191. static const struct regmap_range qca8k_readable_ranges[] = {
  192. regmap_reg_range(0x0000, 0x00e4), /* Global control */
  193. regmap_reg_range(0x0100, 0x0168), /* EEE control */
  194. regmap_reg_range(0x0200, 0x0270), /* Parser control */
  195. regmap_reg_range(0x0400, 0x0454), /* ACL */
  196. regmap_reg_range(0x0600, 0x0718), /* Lookup */
  197. regmap_reg_range(0x0800, 0x0b70), /* QM */
  198. regmap_reg_range(0x0c00, 0x0c80), /* PKT */
  199. regmap_reg_range(0x0e00, 0x0e98), /* L3 */
  200. regmap_reg_range(0x1000, 0x10ac), /* MIB - Port0 */
  201. regmap_reg_range(0x1100, 0x11ac), /* MIB - Port1 */
  202. regmap_reg_range(0x1200, 0x12ac), /* MIB - Port2 */
  203. regmap_reg_range(0x1300, 0x13ac), /* MIB - Port3 */
  204. regmap_reg_range(0x1400, 0x14ac), /* MIB - Port4 */
  205. regmap_reg_range(0x1500, 0x15ac), /* MIB - Port5 */
  206. regmap_reg_range(0x1600, 0x16ac), /* MIB - Port6 */
  207. };
  208. static const struct regmap_access_table qca8k_readable_table = {
  209. .yes_ranges = qca8k_readable_ranges,
  210. .n_yes_ranges = ARRAY_SIZE(qca8k_readable_ranges),
  211. };
  212. static struct regmap_config qca8k_regmap_config = {
  213. .reg_bits = 16,
  214. .val_bits = 32,
  215. .reg_stride = 4,
  216. .max_register = 0x16ac, /* end MIB - Port6 range */
  217. .reg_read = qca8k_regmap_read,
  218. .reg_write = qca8k_regmap_write,
  219. .rd_table = &qca8k_readable_table,
  220. };
  221. static int
  222. qca8k_busy_wait(struct qca8k_priv *priv, u32 reg, u32 mask)
  223. {
  224. unsigned long timeout;
  225. timeout = jiffies + msecs_to_jiffies(20);
  226. /* loop until the busy flag has cleared */
  227. do {
  228. u32 val = qca8k_read(priv, reg);
  229. int busy = val & mask;
  230. if (!busy)
  231. break;
  232. cond_resched();
  233. } while (!time_after_eq(jiffies, timeout));
  234. return time_after_eq(jiffies, timeout);
  235. }
  236. static void
  237. qca8k_fdb_read(struct qca8k_priv *priv, struct qca8k_fdb *fdb)
  238. {
  239. u32 reg[4];
  240. int i;
  241. /* load the ARL table into an array */
  242. for (i = 0; i < 4; i++)
  243. reg[i] = qca8k_read(priv, QCA8K_REG_ATU_DATA0 + (i * 4));
  244. /* vid - 83:72 */
  245. fdb->vid = (reg[2] >> QCA8K_ATU_VID_S) & QCA8K_ATU_VID_M;
  246. /* aging - 67:64 */
  247. fdb->aging = reg[2] & QCA8K_ATU_STATUS_M;
  248. /* portmask - 54:48 */
  249. fdb->port_mask = (reg[1] >> QCA8K_ATU_PORT_S) & QCA8K_ATU_PORT_M;
  250. /* mac - 47:0 */
  251. fdb->mac[0] = (reg[1] >> QCA8K_ATU_ADDR0_S) & 0xff;
  252. fdb->mac[1] = reg[1] & 0xff;
  253. fdb->mac[2] = (reg[0] >> QCA8K_ATU_ADDR2_S) & 0xff;
  254. fdb->mac[3] = (reg[0] >> QCA8K_ATU_ADDR3_S) & 0xff;
  255. fdb->mac[4] = (reg[0] >> QCA8K_ATU_ADDR4_S) & 0xff;
  256. fdb->mac[5] = reg[0] & 0xff;
  257. }
  258. static void
  259. qca8k_fdb_write(struct qca8k_priv *priv, u16 vid, u8 port_mask, const u8 *mac,
  260. u8 aging)
  261. {
  262. u32 reg[3] = { 0 };
  263. int i;
  264. /* vid - 83:72 */
  265. reg[2] = (vid & QCA8K_ATU_VID_M) << QCA8K_ATU_VID_S;
  266. /* aging - 67:64 */
  267. reg[2] |= aging & QCA8K_ATU_STATUS_M;
  268. /* portmask - 54:48 */
  269. reg[1] = (port_mask & QCA8K_ATU_PORT_M) << QCA8K_ATU_PORT_S;
  270. /* mac - 47:0 */
  271. reg[1] |= mac[0] << QCA8K_ATU_ADDR0_S;
  272. reg[1] |= mac[1];
  273. reg[0] |= mac[2] << QCA8K_ATU_ADDR2_S;
  274. reg[0] |= mac[3] << QCA8K_ATU_ADDR3_S;
  275. reg[0] |= mac[4] << QCA8K_ATU_ADDR4_S;
  276. reg[0] |= mac[5];
  277. /* load the array into the ARL table */
  278. for (i = 0; i < 3; i++)
  279. qca8k_write(priv, QCA8K_REG_ATU_DATA0 + (i * 4), reg[i]);
  280. }
  281. static int
  282. qca8k_fdb_access(struct qca8k_priv *priv, enum qca8k_fdb_cmd cmd, int port)
  283. {
  284. u32 reg;
  285. /* Set the command and FDB index */
  286. reg = QCA8K_ATU_FUNC_BUSY;
  287. reg |= cmd;
  288. if (port >= 0) {
  289. reg |= QCA8K_ATU_FUNC_PORT_EN;
  290. reg |= (port & QCA8K_ATU_FUNC_PORT_M) << QCA8K_ATU_FUNC_PORT_S;
  291. }
  292. /* Write the function register triggering the table access */
  293. qca8k_write(priv, QCA8K_REG_ATU_FUNC, reg);
  294. /* wait for completion */
  295. if (qca8k_busy_wait(priv, QCA8K_REG_ATU_FUNC, QCA8K_ATU_FUNC_BUSY))
  296. return -1;
  297. /* Check for table full violation when adding an entry */
  298. if (cmd == QCA8K_FDB_LOAD) {
  299. reg = qca8k_read(priv, QCA8K_REG_ATU_FUNC);
  300. if (reg & QCA8K_ATU_FUNC_FULL)
  301. return -1;
  302. }
  303. return 0;
  304. }
  305. static int
  306. qca8k_fdb_next(struct qca8k_priv *priv, struct qca8k_fdb *fdb, int port)
  307. {
  308. int ret;
  309. qca8k_fdb_write(priv, fdb->vid, fdb->port_mask, fdb->mac, fdb->aging);
  310. ret = qca8k_fdb_access(priv, QCA8K_FDB_NEXT, port);
  311. if (ret >= 0)
  312. qca8k_fdb_read(priv, fdb);
  313. return ret;
  314. }
  315. static int
  316. qca8k_fdb_add(struct qca8k_priv *priv, const u8 *mac, u16 port_mask,
  317. u16 vid, u8 aging)
  318. {
  319. int ret;
  320. mutex_lock(&priv->reg_mutex);
  321. qca8k_fdb_write(priv, vid, port_mask, mac, aging);
  322. ret = qca8k_fdb_access(priv, QCA8K_FDB_LOAD, -1);
  323. mutex_unlock(&priv->reg_mutex);
  324. return ret;
  325. }
  326. static int
  327. qca8k_fdb_del(struct qca8k_priv *priv, const u8 *mac, u16 port_mask, u16 vid)
  328. {
  329. int ret;
  330. mutex_lock(&priv->reg_mutex);
  331. qca8k_fdb_write(priv, vid, port_mask, mac, 0);
  332. ret = qca8k_fdb_access(priv, QCA8K_FDB_PURGE, -1);
  333. mutex_unlock(&priv->reg_mutex);
  334. return ret;
  335. }
  336. static void
  337. qca8k_fdb_flush(struct qca8k_priv *priv)
  338. {
  339. mutex_lock(&priv->reg_mutex);
  340. qca8k_fdb_access(priv, QCA8K_FDB_FLUSH, -1);
  341. mutex_unlock(&priv->reg_mutex);
  342. }
  343. static void
  344. qca8k_mib_init(struct qca8k_priv *priv)
  345. {
  346. mutex_lock(&priv->reg_mutex);
  347. qca8k_reg_set(priv, QCA8K_REG_MIB, QCA8K_MIB_FLUSH | QCA8K_MIB_BUSY);
  348. qca8k_busy_wait(priv, QCA8K_REG_MIB, QCA8K_MIB_BUSY);
  349. qca8k_reg_set(priv, QCA8K_REG_MIB, QCA8K_MIB_CPU_KEEP);
  350. qca8k_write(priv, QCA8K_REG_MODULE_EN, QCA8K_MODULE_EN_MIB);
  351. mutex_unlock(&priv->reg_mutex);
  352. }
  353. static int
  354. qca8k_set_pad_ctrl(struct qca8k_priv *priv, int port, int mode)
  355. {
  356. u32 reg;
  357. switch (port) {
  358. case 0:
  359. reg = QCA8K_REG_PORT0_PAD_CTRL;
  360. break;
  361. case 6:
  362. reg = QCA8K_REG_PORT6_PAD_CTRL;
  363. break;
  364. default:
  365. pr_err("Can't set PAD_CTRL on port %d\n", port);
  366. return -EINVAL;
  367. }
  368. /* Configure a port to be directly connected to an external
  369. * PHY or MAC.
  370. */
  371. switch (mode) {
  372. case PHY_INTERFACE_MODE_RGMII:
  373. qca8k_write(priv, reg,
  374. QCA8K_PORT_PAD_RGMII_EN |
  375. QCA8K_PORT_PAD_RGMII_TX_DELAY(3) |
  376. QCA8K_PORT_PAD_RGMII_RX_DELAY(3));
  377. /* According to the datasheet, RGMII delay is enabled through
  378. * PORT5_PAD_CTRL for all ports, rather than individual port
  379. * registers
  380. */
  381. qca8k_write(priv, QCA8K_REG_PORT5_PAD_CTRL,
  382. QCA8K_PORT_PAD_RGMII_RX_DELAY_EN);
  383. break;
  384. case PHY_INTERFACE_MODE_SGMII:
  385. qca8k_write(priv, reg, QCA8K_PORT_PAD_SGMII_EN);
  386. break;
  387. default:
  388. pr_err("xMII mode %d not supported\n", mode);
  389. return -EINVAL;
  390. }
  391. return 0;
  392. }
  393. static void
  394. qca8k_port_set_status(struct qca8k_priv *priv, int port, int enable)
  395. {
  396. u32 mask = QCA8K_PORT_STATUS_TXMAC | QCA8K_PORT_STATUS_RXMAC;
  397. /* Port 0 and 6 have no internal PHY */
  398. if ((port > 0) && (port < 6))
  399. mask |= QCA8K_PORT_STATUS_LINK_AUTO;
  400. if (enable)
  401. qca8k_reg_set(priv, QCA8K_REG_PORT_STATUS(port), mask);
  402. else
  403. qca8k_reg_clear(priv, QCA8K_REG_PORT_STATUS(port), mask);
  404. }
  405. static int
  406. qca8k_setup(struct dsa_switch *ds)
  407. {
  408. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  409. int ret, i, phy_mode = -1;
  410. u32 mask;
  411. /* Make sure that port 0 is the cpu port */
  412. if (!dsa_is_cpu_port(ds, 0)) {
  413. pr_err("port 0 is not the CPU port\n");
  414. return -EINVAL;
  415. }
  416. mutex_init(&priv->reg_mutex);
  417. /* Start by setting up the register mapping */
  418. priv->regmap = devm_regmap_init(ds->dev, NULL, priv,
  419. &qca8k_regmap_config);
  420. if (IS_ERR(priv->regmap))
  421. pr_warn("regmap initialization failed");
  422. /* Initialize CPU port pad mode (xMII type, delays...) */
  423. phy_mode = of_get_phy_mode(ds->ports[QCA8K_CPU_PORT].dn);
  424. if (phy_mode < 0) {
  425. pr_err("Can't find phy-mode for master device\n");
  426. return phy_mode;
  427. }
  428. ret = qca8k_set_pad_ctrl(priv, QCA8K_CPU_PORT, phy_mode);
  429. if (ret < 0)
  430. return ret;
  431. /* Enable CPU Port, force it to maximum bandwidth and full-duplex */
  432. mask = QCA8K_PORT_STATUS_SPEED_1000 | QCA8K_PORT_STATUS_TXFLOW |
  433. QCA8K_PORT_STATUS_RXFLOW | QCA8K_PORT_STATUS_DUPLEX;
  434. qca8k_write(priv, QCA8K_REG_PORT_STATUS(QCA8K_CPU_PORT), mask);
  435. qca8k_reg_set(priv, QCA8K_REG_GLOBAL_FW_CTRL0,
  436. QCA8K_GLOBAL_FW_CTRL0_CPU_PORT_EN);
  437. qca8k_port_set_status(priv, QCA8K_CPU_PORT, 1);
  438. priv->port_sts[QCA8K_CPU_PORT].enabled = 1;
  439. /* Enable MIB counters */
  440. qca8k_mib_init(priv);
  441. /* Enable QCA header mode on the cpu port */
  442. qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(QCA8K_CPU_PORT),
  443. QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_TX_S |
  444. QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_RX_S);
  445. /* Disable forwarding by default on all ports */
  446. for (i = 0; i < QCA8K_NUM_PORTS; i++)
  447. qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
  448. QCA8K_PORT_LOOKUP_MEMBER, 0);
  449. /* Disable MAC by default on all user ports */
  450. for (i = 1; i < QCA8K_NUM_PORTS; i++)
  451. if (dsa_is_user_port(ds, i))
  452. qca8k_port_set_status(priv, i, 0);
  453. /* Forward all unknown frames to CPU port for Linux processing */
  454. qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1,
  455. BIT(0) << QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S |
  456. BIT(0) << QCA8K_GLOBAL_FW_CTRL1_BC_DP_S |
  457. BIT(0) << QCA8K_GLOBAL_FW_CTRL1_MC_DP_S |
  458. BIT(0) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S);
  459. /* Setup connection between CPU port & user ports */
  460. for (i = 0; i < DSA_MAX_PORTS; i++) {
  461. /* CPU port gets connected to all user ports of the switch */
  462. if (dsa_is_cpu_port(ds, i)) {
  463. qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(QCA8K_CPU_PORT),
  464. QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds));
  465. }
  466. /* Invividual user ports get connected to CPU port only */
  467. if (dsa_is_user_port(ds, i)) {
  468. int shift = 16 * (i % 2);
  469. qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
  470. QCA8K_PORT_LOOKUP_MEMBER,
  471. BIT(QCA8K_CPU_PORT));
  472. /* Enable ARP Auto-learning by default */
  473. qca8k_reg_set(priv, QCA8K_PORT_LOOKUP_CTRL(i),
  474. QCA8K_PORT_LOOKUP_LEARN);
  475. /* For port based vlans to work we need to set the
  476. * default egress vid
  477. */
  478. qca8k_rmw(priv, QCA8K_EGRESS_VLAN(i),
  479. 0xffff << shift, 1 << shift);
  480. qca8k_write(priv, QCA8K_REG_PORT_VLAN_CTRL0(i),
  481. QCA8K_PORT_VLAN_CVID(1) |
  482. QCA8K_PORT_VLAN_SVID(1));
  483. }
  484. }
  485. /* Flush the FDB table */
  486. qca8k_fdb_flush(priv);
  487. return 0;
  488. }
  489. static void
  490. qca8k_adjust_link(struct dsa_switch *ds, int port, struct phy_device *phy)
  491. {
  492. struct qca8k_priv *priv = ds->priv;
  493. u32 reg;
  494. /* Force fixed-link setting for CPU port, skip others. */
  495. if (!phy_is_pseudo_fixed_link(phy))
  496. return;
  497. /* Set port speed */
  498. switch (phy->speed) {
  499. case 10:
  500. reg = QCA8K_PORT_STATUS_SPEED_10;
  501. break;
  502. case 100:
  503. reg = QCA8K_PORT_STATUS_SPEED_100;
  504. break;
  505. case 1000:
  506. reg = QCA8K_PORT_STATUS_SPEED_1000;
  507. break;
  508. default:
  509. dev_dbg(priv->dev, "port%d link speed %dMbps not supported.\n",
  510. port, phy->speed);
  511. return;
  512. }
  513. /* Set duplex mode */
  514. if (phy->duplex == DUPLEX_FULL)
  515. reg |= QCA8K_PORT_STATUS_DUPLEX;
  516. /* Force flow control */
  517. if (dsa_is_cpu_port(ds, port))
  518. reg |= QCA8K_PORT_STATUS_RXFLOW | QCA8K_PORT_STATUS_TXFLOW;
  519. /* Force link down before changing MAC options */
  520. qca8k_port_set_status(priv, port, 0);
  521. qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg);
  522. qca8k_port_set_status(priv, port, 1);
  523. }
  524. static int
  525. qca8k_phy_read(struct dsa_switch *ds, int phy, int regnum)
  526. {
  527. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  528. return mdiobus_read(priv->bus, phy, regnum);
  529. }
  530. static int
  531. qca8k_phy_write(struct dsa_switch *ds, int phy, int regnum, u16 val)
  532. {
  533. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  534. return mdiobus_write(priv->bus, phy, regnum, val);
  535. }
  536. static void
  537. qca8k_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data)
  538. {
  539. int i;
  540. if (stringset != ETH_SS_STATS)
  541. return;
  542. for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++)
  543. strncpy(data + i * ETH_GSTRING_LEN, ar8327_mib[i].name,
  544. ETH_GSTRING_LEN);
  545. }
  546. static void
  547. qca8k_get_ethtool_stats(struct dsa_switch *ds, int port,
  548. uint64_t *data)
  549. {
  550. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  551. const struct qca8k_mib_desc *mib;
  552. u32 reg, i;
  553. u64 hi;
  554. for (i = 0; i < ARRAY_SIZE(ar8327_mib); i++) {
  555. mib = &ar8327_mib[i];
  556. reg = QCA8K_PORT_MIB_COUNTER(port) + mib->offset;
  557. data[i] = qca8k_read(priv, reg);
  558. if (mib->size == 2) {
  559. hi = qca8k_read(priv, reg + 4);
  560. data[i] |= hi << 32;
  561. }
  562. }
  563. }
  564. static int
  565. qca8k_get_sset_count(struct dsa_switch *ds, int port, int sset)
  566. {
  567. if (sset != ETH_SS_STATS)
  568. return 0;
  569. return ARRAY_SIZE(ar8327_mib);
  570. }
  571. static int
  572. qca8k_set_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *eee)
  573. {
  574. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  575. u32 lpi_en = QCA8K_REG_EEE_CTRL_LPI_EN(port);
  576. u32 reg;
  577. mutex_lock(&priv->reg_mutex);
  578. reg = qca8k_read(priv, QCA8K_REG_EEE_CTRL);
  579. if (eee->eee_enabled)
  580. reg |= lpi_en;
  581. else
  582. reg &= ~lpi_en;
  583. qca8k_write(priv, QCA8K_REG_EEE_CTRL, reg);
  584. mutex_unlock(&priv->reg_mutex);
  585. return 0;
  586. }
  587. static int
  588. qca8k_get_mac_eee(struct dsa_switch *ds, int port, struct ethtool_eee *e)
  589. {
  590. /* Nothing to do on the port's MAC */
  591. return 0;
  592. }
  593. static void
  594. qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
  595. {
  596. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  597. u32 stp_state;
  598. switch (state) {
  599. case BR_STATE_DISABLED:
  600. stp_state = QCA8K_PORT_LOOKUP_STATE_DISABLED;
  601. break;
  602. case BR_STATE_BLOCKING:
  603. stp_state = QCA8K_PORT_LOOKUP_STATE_BLOCKING;
  604. break;
  605. case BR_STATE_LISTENING:
  606. stp_state = QCA8K_PORT_LOOKUP_STATE_LISTENING;
  607. break;
  608. case BR_STATE_LEARNING:
  609. stp_state = QCA8K_PORT_LOOKUP_STATE_LEARNING;
  610. break;
  611. case BR_STATE_FORWARDING:
  612. default:
  613. stp_state = QCA8K_PORT_LOOKUP_STATE_FORWARD;
  614. break;
  615. }
  616. qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
  617. QCA8K_PORT_LOOKUP_STATE_MASK, stp_state);
  618. }
  619. static int
  620. qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br)
  621. {
  622. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  623. int port_mask = BIT(QCA8K_CPU_PORT);
  624. int i;
  625. for (i = 1; i < QCA8K_NUM_PORTS; i++) {
  626. if (dsa_to_port(ds, i)->bridge_dev != br)
  627. continue;
  628. /* Add this port to the portvlan mask of the other ports
  629. * in the bridge
  630. */
  631. qca8k_reg_set(priv,
  632. QCA8K_PORT_LOOKUP_CTRL(i),
  633. BIT(port));
  634. if (i != port)
  635. port_mask |= BIT(i);
  636. }
  637. /* Add all other ports to this ports portvlan mask */
  638. qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
  639. QCA8K_PORT_LOOKUP_MEMBER, port_mask);
  640. return 0;
  641. }
  642. static void
  643. qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br)
  644. {
  645. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  646. int i;
  647. for (i = 1; i < QCA8K_NUM_PORTS; i++) {
  648. if (dsa_to_port(ds, i)->bridge_dev != br)
  649. continue;
  650. /* Remove this port to the portvlan mask of the other ports
  651. * in the bridge
  652. */
  653. qca8k_reg_clear(priv,
  654. QCA8K_PORT_LOOKUP_CTRL(i),
  655. BIT(port));
  656. }
  657. /* Set the cpu port to be the only one in the portvlan mask of
  658. * this port
  659. */
  660. qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
  661. QCA8K_PORT_LOOKUP_MEMBER, BIT(QCA8K_CPU_PORT));
  662. }
  663. static int
  664. qca8k_port_enable(struct dsa_switch *ds, int port,
  665. struct phy_device *phy)
  666. {
  667. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  668. qca8k_port_set_status(priv, port, 1);
  669. priv->port_sts[port].enabled = 1;
  670. return 0;
  671. }
  672. static void
  673. qca8k_port_disable(struct dsa_switch *ds, int port,
  674. struct phy_device *phy)
  675. {
  676. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  677. qca8k_port_set_status(priv, port, 0);
  678. priv->port_sts[port].enabled = 0;
  679. }
  680. static int
  681. qca8k_port_fdb_insert(struct qca8k_priv *priv, const u8 *addr,
  682. u16 port_mask, u16 vid)
  683. {
  684. /* Set the vid to the port vlan id if no vid is set */
  685. if (!vid)
  686. vid = 1;
  687. return qca8k_fdb_add(priv, addr, port_mask, vid,
  688. QCA8K_ATU_STATUS_STATIC);
  689. }
  690. static int
  691. qca8k_port_fdb_add(struct dsa_switch *ds, int port,
  692. const unsigned char *addr, u16 vid)
  693. {
  694. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  695. u16 port_mask = BIT(port);
  696. return qca8k_port_fdb_insert(priv, addr, port_mask, vid);
  697. }
  698. static int
  699. qca8k_port_fdb_del(struct dsa_switch *ds, int port,
  700. const unsigned char *addr, u16 vid)
  701. {
  702. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  703. u16 port_mask = BIT(port);
  704. if (!vid)
  705. vid = 1;
  706. return qca8k_fdb_del(priv, addr, port_mask, vid);
  707. }
  708. static int
  709. qca8k_port_fdb_dump(struct dsa_switch *ds, int port,
  710. dsa_fdb_dump_cb_t *cb, void *data)
  711. {
  712. struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
  713. struct qca8k_fdb _fdb = { 0 };
  714. int cnt = QCA8K_NUM_FDB_RECORDS;
  715. bool is_static;
  716. int ret = 0;
  717. mutex_lock(&priv->reg_mutex);
  718. while (cnt-- && !qca8k_fdb_next(priv, &_fdb, port)) {
  719. if (!_fdb.aging)
  720. break;
  721. is_static = (_fdb.aging == QCA8K_ATU_STATUS_STATIC);
  722. ret = cb(_fdb.mac, _fdb.vid, is_static, data);
  723. if (ret)
  724. break;
  725. }
  726. mutex_unlock(&priv->reg_mutex);
  727. return 0;
  728. }
  729. static enum dsa_tag_protocol
  730. qca8k_get_tag_protocol(struct dsa_switch *ds, int port)
  731. {
  732. return DSA_TAG_PROTO_QCA;
  733. }
  734. static const struct dsa_switch_ops qca8k_switch_ops = {
  735. .get_tag_protocol = qca8k_get_tag_protocol,
  736. .setup = qca8k_setup,
  737. .adjust_link = qca8k_adjust_link,
  738. .get_strings = qca8k_get_strings,
  739. .phy_read = qca8k_phy_read,
  740. .phy_write = qca8k_phy_write,
  741. .get_ethtool_stats = qca8k_get_ethtool_stats,
  742. .get_sset_count = qca8k_get_sset_count,
  743. .get_mac_eee = qca8k_get_mac_eee,
  744. .set_mac_eee = qca8k_set_mac_eee,
  745. .port_enable = qca8k_port_enable,
  746. .port_disable = qca8k_port_disable,
  747. .port_stp_state_set = qca8k_port_stp_state_set,
  748. .port_bridge_join = qca8k_port_bridge_join,
  749. .port_bridge_leave = qca8k_port_bridge_leave,
  750. .port_fdb_add = qca8k_port_fdb_add,
  751. .port_fdb_del = qca8k_port_fdb_del,
  752. .port_fdb_dump = qca8k_port_fdb_dump,
  753. };
  754. static int
  755. qca8k_sw_probe(struct mdio_device *mdiodev)
  756. {
  757. struct qca8k_priv *priv;
  758. u32 id;
  759. /* allocate the private data struct so that we can probe the switches
  760. * ID register
  761. */
  762. priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL);
  763. if (!priv)
  764. return -ENOMEM;
  765. priv->bus = mdiodev->bus;
  766. priv->dev = &mdiodev->dev;
  767. /* read the switches ID register */
  768. id = qca8k_read(priv, QCA8K_REG_MASK_CTRL);
  769. id >>= QCA8K_MASK_CTRL_ID_S;
  770. id &= QCA8K_MASK_CTRL_ID_M;
  771. if (id != QCA8K_ID_QCA8337)
  772. return -ENODEV;
  773. priv->ds = dsa_switch_alloc(&mdiodev->dev, DSA_MAX_PORTS);
  774. if (!priv->ds)
  775. return -ENOMEM;
  776. priv->ds->priv = priv;
  777. priv->ds->ops = &qca8k_switch_ops;
  778. mutex_init(&priv->reg_mutex);
  779. dev_set_drvdata(&mdiodev->dev, priv);
  780. return dsa_register_switch(priv->ds);
  781. }
  782. static void
  783. qca8k_sw_remove(struct mdio_device *mdiodev)
  784. {
  785. struct qca8k_priv *priv = dev_get_drvdata(&mdiodev->dev);
  786. int i;
  787. for (i = 0; i < QCA8K_NUM_PORTS; i++)
  788. qca8k_port_set_status(priv, i, 0);
  789. dsa_unregister_switch(priv->ds);
  790. }
  791. #ifdef CONFIG_PM_SLEEP
  792. static void
  793. qca8k_set_pm(struct qca8k_priv *priv, int enable)
  794. {
  795. int i;
  796. for (i = 0; i < QCA8K_NUM_PORTS; i++) {
  797. if (!priv->port_sts[i].enabled)
  798. continue;
  799. qca8k_port_set_status(priv, i, enable);
  800. }
  801. }
  802. static int qca8k_suspend(struct device *dev)
  803. {
  804. struct platform_device *pdev = to_platform_device(dev);
  805. struct qca8k_priv *priv = platform_get_drvdata(pdev);
  806. qca8k_set_pm(priv, 0);
  807. return dsa_switch_suspend(priv->ds);
  808. }
  809. static int qca8k_resume(struct device *dev)
  810. {
  811. struct platform_device *pdev = to_platform_device(dev);
  812. struct qca8k_priv *priv = platform_get_drvdata(pdev);
  813. qca8k_set_pm(priv, 1);
  814. return dsa_switch_resume(priv->ds);
  815. }
  816. #endif /* CONFIG_PM_SLEEP */
  817. static SIMPLE_DEV_PM_OPS(qca8k_pm_ops,
  818. qca8k_suspend, qca8k_resume);
  819. static const struct of_device_id qca8k_of_match[] = {
  820. { .compatible = "qca,qca8334" },
  821. { .compatible = "qca,qca8337" },
  822. { /* sentinel */ },
  823. };
  824. static struct mdio_driver qca8kmdio_driver = {
  825. .probe = qca8k_sw_probe,
  826. .remove = qca8k_sw_remove,
  827. .mdiodrv.driver = {
  828. .name = "qca8k",
  829. .of_match_table = qca8k_of_match,
  830. .pm = &qca8k_pm_ops,
  831. },
  832. };
  833. mdio_module_driver(qca8kmdio_driver);
  834. MODULE_AUTHOR("Mathieu Olivari, John Crispin <john@phrozen.org>");
  835. MODULE_DESCRIPTION("Driver for QCA8K ethernet switch family");
  836. MODULE_LICENSE("GPL v2");
  837. MODULE_ALIAS("platform:qca8k");