esw_rt3050.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461
  1. /* This program is free software; you can redistribute it and/or modify
  2. * it under the terms of the GNU General Public License as published by
  3. * the Free Software Foundation; version 2 of the License
  4. *
  5. * This program is distributed in the hope that it will be useful,
  6. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  7. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  8. * GNU General Public License for more details.
  9. *
  10. * Copyright (C) 2009-2015 John Crispin <[email protected]>
  11. * Copyright (C) 2009-2015 Felix Fietkau <[email protected]>
  12. * Copyright (C) 2013-2015 Michael Lee <[email protected]>
  13. * Copyright (C) 2016 Vittorio Gambaletta <[email protected]>
  14. */
  15. #include <linux/module.h>
  16. #include <linux/kernel.h>
  17. #include <linux/platform_device.h>
  18. #include <asm/mach-ralink/ralink_regs.h>
  19. #include <linux/of_irq.h>
  20. #include <linux/switch.h>
  21. #include "mtk_eth_soc.h"
  22. /* HW limitations for this switch:
  23. * - No large frame support (PKT_MAX_LEN at most 1536)
  24. * - Can't have untagged vlan and tagged vlan on one port at the same time,
  25. * though this might be possible using the undocumented PPE.
  26. */
  27. #define RT305X_ESW_REG_ISR 0x00
  28. #define RT305X_ESW_REG_IMR 0x04
  29. #define RT305X_ESW_REG_FCT0 0x08
  30. #define RT305X_ESW_REG_PFC1 0x14
  31. #define RT305X_ESW_REG_ATS 0x24
  32. #define RT305X_ESW_REG_ATS0 0x28
  33. #define RT305X_ESW_REG_ATS1 0x2c
  34. #define RT305X_ESW_REG_ATS2 0x30
  35. #define RT305X_ESW_REG_PVIDC(_n) (0x40 + 4 * (_n))
  36. #define RT305X_ESW_REG_VLANI(_n) (0x50 + 4 * (_n))
  37. #define RT305X_ESW_REG_VMSC(_n) (0x70 + 4 * (_n))
  38. #define RT305X_ESW_REG_POA 0x80
  39. #define RT305X_ESW_REG_FPA 0x84
  40. #define RT305X_ESW_REG_SOCPC 0x8c
  41. #define RT305X_ESW_REG_POC0 0x90
  42. #define RT305X_ESW_REG_POC1 0x94
  43. #define RT305X_ESW_REG_POC2 0x98
  44. #define RT305X_ESW_REG_SGC 0x9c
  45. #define RT305X_ESW_REG_STRT 0xa0
  46. #define RT305X_ESW_REG_PCR0 0xc0
  47. #define RT305X_ESW_REG_PCR1 0xc4
  48. #define RT305X_ESW_REG_FPA2 0xc8
  49. #define RT305X_ESW_REG_FCT2 0xcc
  50. #define RT305X_ESW_REG_SGC2 0xe4
  51. #define RT305X_ESW_REG_P0LED 0xa4
  52. #define RT305X_ESW_REG_P1LED 0xa8
  53. #define RT305X_ESW_REG_P2LED 0xac
  54. #define RT305X_ESW_REG_P3LED 0xb0
  55. #define RT305X_ESW_REG_P4LED 0xb4
  56. #define RT305X_ESW_REG_PXPC(_x) (0xe8 + (4 * _x))
  57. #define RT305X_ESW_REG_P1PC 0xec
  58. #define RT305X_ESW_REG_P2PC 0xf0
  59. #define RT305X_ESW_REG_P3PC 0xf4
  60. #define RT305X_ESW_REG_P4PC 0xf8
  61. #define RT305X_ESW_REG_P5PC 0xfc
  62. #define RT305X_ESW_LED_LINK 0
  63. #define RT305X_ESW_LED_100M 1
  64. #define RT305X_ESW_LED_DUPLEX 2
  65. #define RT305X_ESW_LED_ACTIVITY 3
  66. #define RT305X_ESW_LED_COLLISION 4
  67. #define RT305X_ESW_LED_LINKACT 5
  68. #define RT305X_ESW_LED_DUPLCOLL 6
  69. #define RT305X_ESW_LED_10MACT 7
  70. #define RT305X_ESW_LED_100MACT 8
  71. /* Additional led states not in datasheet: */
  72. #define RT305X_ESW_LED_BLINK 10
  73. #define RT305X_ESW_LED_ON 12
  74. #define RT305X_ESW_LINK_S 25
  75. #define RT305X_ESW_DUPLEX_S 9
  76. #define RT305X_ESW_SPD_S 0
  77. #define RT305X_ESW_PCR0_WT_NWAY_DATA_S 16
  78. #define RT305X_ESW_PCR0_WT_PHY_CMD BIT(13)
  79. #define RT305X_ESW_PCR0_CPU_PHY_REG_S 8
  80. #define RT305X_ESW_PCR1_WT_DONE BIT(0)
  81. #define RT305X_ESW_ATS_TIMEOUT (5 * HZ)
  82. #define RT305X_ESW_PHY_TIMEOUT (5 * HZ)
  83. #define RT305X_ESW_PVIDC_PVID_M 0xfff
  84. #define RT305X_ESW_PVIDC_PVID_S 12
  85. #define RT305X_ESW_VLANI_VID_M 0xfff
  86. #define RT305X_ESW_VLANI_VID_S 12
  87. #define RT305X_ESW_VMSC_MSC_M 0xff
  88. #define RT305X_ESW_VMSC_MSC_S 8
  89. #define RT305X_ESW_SOCPC_DISUN2CPU_S 0
  90. #define RT305X_ESW_SOCPC_DISMC2CPU_S 8
  91. #define RT305X_ESW_SOCPC_DISBC2CPU_S 16
  92. #define RT305X_ESW_SOCPC_CRC_PADDING BIT(25)
  93. #define RT305X_ESW_POC0_EN_BP_S 0
  94. #define RT305X_ESW_POC0_EN_FC_S 8
  95. #define RT305X_ESW_POC0_DIS_RMC2CPU_S 16
  96. #define RT305X_ESW_POC0_DIS_PORT_M 0x7f
  97. #define RT305X_ESW_POC0_DIS_PORT_S 23
  98. #define RT305X_ESW_POC2_UNTAG_EN_M 0xff
  99. #define RT305X_ESW_POC2_UNTAG_EN_S 0
  100. #define RT305X_ESW_POC2_ENAGING_S 8
  101. #define RT305X_ESW_POC2_DIS_UC_PAUSE_S 16
  102. #define RT305X_ESW_SGC2_DOUBLE_TAG_M 0x7f
  103. #define RT305X_ESW_SGC2_DOUBLE_TAG_S 0
  104. #define RT305X_ESW_SGC2_LAN_PMAP_M 0x3f
  105. #define RT305X_ESW_SGC2_LAN_PMAP_S 24
  106. #define RT305X_ESW_PFC1_EN_VLAN_M 0xff
  107. #define RT305X_ESW_PFC1_EN_VLAN_S 16
  108. #define RT305X_ESW_PFC1_EN_TOS_S 24
  109. #define RT305X_ESW_VLAN_NONE 0xfff
  110. #define RT305X_ESW_GSC_BC_STROM_MASK 0x3
  111. #define RT305X_ESW_GSC_BC_STROM_SHIFT 4
  112. #define RT305X_ESW_GSC_LED_FREQ_MASK 0x3
  113. #define RT305X_ESW_GSC_LED_FREQ_SHIFT 23
  114. #define RT305X_ESW_POA_LINK_MASK 0x1f
  115. #define RT305X_ESW_POA_LINK_SHIFT 25
  116. #define RT305X_ESW_PORT_ST_CHG BIT(26)
  117. #define RT305X_ESW_PORT0 0
  118. #define RT305X_ESW_PORT1 1
  119. #define RT305X_ESW_PORT2 2
  120. #define RT305X_ESW_PORT3 3
  121. #define RT305X_ESW_PORT4 4
  122. #define RT305X_ESW_PORT5 5
  123. #define RT305X_ESW_PORT6 6
  124. #define RT305X_ESW_PORTS_NONE 0
  125. #define RT305X_ESW_PMAP_LLLLLL 0x3f
  126. #define RT305X_ESW_PMAP_LLLLWL 0x2f
  127. #define RT305X_ESW_PMAP_WLLLLL 0x3e
  128. #define RT305X_ESW_PORTS_INTERNAL \
  129. (BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT1) | \
  130. BIT(RT305X_ESW_PORT2) | BIT(RT305X_ESW_PORT3) | \
  131. BIT(RT305X_ESW_PORT4))
  132. #define RT305X_ESW_PORTS_NOCPU \
  133. (RT305X_ESW_PORTS_INTERNAL | BIT(RT305X_ESW_PORT5))
  134. #define RT305X_ESW_PORTS_CPU BIT(RT305X_ESW_PORT6)
  135. #define RT305X_ESW_PORTS_ALL \
  136. (RT305X_ESW_PORTS_NOCPU | RT305X_ESW_PORTS_CPU)
  137. #define RT305X_ESW_NUM_VLANS 16
  138. #define RT305X_ESW_NUM_VIDS 4096
  139. #define RT305X_ESW_NUM_PORTS 7
  140. #define RT305X_ESW_NUM_LANWAN 6
  141. #define RT305X_ESW_NUM_LEDS 5
  142. #define RT5350_ESW_REG_PXTPC(_x) (0x150 + (4 * _x))
  143. #define RT5350_EWS_REG_LED_POLARITY 0x168
  144. #define RT5350_RESET_EPHY BIT(24)
  145. enum {
  146. /* Global attributes. */
  147. RT305X_ESW_ATTR_ENABLE_VLAN,
  148. RT305X_ESW_ATTR_ALT_VLAN_DISABLE,
  149. RT305X_ESW_ATTR_BC_STATUS,
  150. RT305X_ESW_ATTR_LED_FREQ,
  151. /* Port attributes. */
  152. RT305X_ESW_ATTR_PORT_DISABLE,
  153. RT305X_ESW_ATTR_PORT_DOUBLETAG,
  154. RT305X_ESW_ATTR_PORT_UNTAG,
  155. RT305X_ESW_ATTR_PORT_LED,
  156. RT305X_ESW_ATTR_PORT_LAN,
  157. RT305X_ESW_ATTR_PORT_RECV_BAD,
  158. RT305X_ESW_ATTR_PORT_RECV_GOOD,
  159. RT5350_ESW_ATTR_PORT_TR_BAD,
  160. RT5350_ESW_ATTR_PORT_TR_GOOD,
  161. };
  162. struct esw_port {
  163. bool disable;
  164. bool doubletag;
  165. bool untag;
  166. u8 led;
  167. u16 pvid;
  168. };
  169. struct esw_vlan {
  170. u8 ports;
  171. u16 vid;
  172. };
  173. enum {
  174. RT305X_ESW_VLAN_CONFIG_NONE = 0,
  175. RT305X_ESW_VLAN_CONFIG_LLLLW,
  176. RT305X_ESW_VLAN_CONFIG_WLLLL,
  177. };
  178. struct rt305x_esw {
  179. struct device *dev;
  180. void __iomem *base;
  181. int irq;
  182. /* Protects against concurrent register r/w operations. */
  183. spinlock_t reg_rw_lock;
  184. unsigned char port_map;
  185. unsigned char port_disable;
  186. unsigned int reg_initval_fct2;
  187. unsigned int reg_initval_fpa2;
  188. unsigned int reg_led_polarity;
  189. struct switch_dev swdev;
  190. bool global_vlan_enable;
  191. bool alt_vlan_disable;
  192. int bc_storm_protect;
  193. int led_frequency;
  194. struct esw_vlan vlans[RT305X_ESW_NUM_VLANS];
  195. struct esw_port ports[RT305X_ESW_NUM_PORTS];
  196. };
  197. static inline void esw_w32(struct rt305x_esw *esw, u32 val, unsigned reg)
  198. {
  199. __raw_writel(val, esw->base + reg);
  200. }
  201. static inline u32 esw_r32(struct rt305x_esw *esw, unsigned reg)
  202. {
  203. return __raw_readl(esw->base + reg);
  204. }
  205. static inline void esw_rmw_raw(struct rt305x_esw *esw, unsigned reg,
  206. unsigned long mask, unsigned long val)
  207. {
  208. unsigned long t;
  209. t = __raw_readl(esw->base + reg) & ~mask;
  210. __raw_writel(t | val, esw->base + reg);
  211. }
  212. static void esw_rmw(struct rt305x_esw *esw, unsigned reg,
  213. unsigned long mask, unsigned long val)
  214. {
  215. unsigned long flags;
  216. spin_lock_irqsave(&esw->reg_rw_lock, flags);
  217. esw_rmw_raw(esw, reg, mask, val);
  218. spin_unlock_irqrestore(&esw->reg_rw_lock, flags);
  219. }
  220. static u32 rt305x_mii_write(struct rt305x_esw *esw, u32 phy_addr,
  221. u32 phy_register, u32 write_data)
  222. {
  223. unsigned long t_start = jiffies;
  224. int ret = 0;
  225. while (1) {
  226. if (!(esw_r32(esw, RT305X_ESW_REG_PCR1) &
  227. RT305X_ESW_PCR1_WT_DONE))
  228. break;
  229. if (time_after(jiffies, t_start + RT305X_ESW_PHY_TIMEOUT)) {
  230. ret = 1;
  231. goto out;
  232. }
  233. }
  234. write_data &= 0xffff;
  235. esw_w32(esw, (write_data << RT305X_ESW_PCR0_WT_NWAY_DATA_S) |
  236. (phy_register << RT305X_ESW_PCR0_CPU_PHY_REG_S) |
  237. (phy_addr) | RT305X_ESW_PCR0_WT_PHY_CMD,
  238. RT305X_ESW_REG_PCR0);
  239. t_start = jiffies;
  240. while (1) {
  241. if (esw_r32(esw, RT305X_ESW_REG_PCR1) &
  242. RT305X_ESW_PCR1_WT_DONE)
  243. break;
  244. if (time_after(jiffies, t_start + RT305X_ESW_PHY_TIMEOUT)) {
  245. ret = 1;
  246. break;
  247. }
  248. }
  249. out:
  250. if (ret)
  251. dev_err(esw->dev, "ramips_eth: MDIO timeout\n");
  252. return ret;
  253. }
  254. static unsigned esw_get_vlan_id(struct rt305x_esw *esw, unsigned vlan)
  255. {
  256. unsigned s;
  257. unsigned val;
  258. s = RT305X_ESW_VLANI_VID_S * (vlan % 2);
  259. val = esw_r32(esw, RT305X_ESW_REG_VLANI(vlan / 2));
  260. val = (val >> s) & RT305X_ESW_VLANI_VID_M;
  261. return val;
  262. }
  263. static void esw_set_vlan_id(struct rt305x_esw *esw, unsigned vlan, unsigned vid)
  264. {
  265. unsigned s;
  266. s = RT305X_ESW_VLANI_VID_S * (vlan % 2);
  267. esw_rmw(esw,
  268. RT305X_ESW_REG_VLANI(vlan / 2),
  269. RT305X_ESW_VLANI_VID_M << s,
  270. (vid & RT305X_ESW_VLANI_VID_M) << s);
  271. }
  272. static unsigned esw_get_pvid(struct rt305x_esw *esw, unsigned port)
  273. {
  274. unsigned s, val;
  275. s = RT305X_ESW_PVIDC_PVID_S * (port % 2);
  276. val = esw_r32(esw, RT305X_ESW_REG_PVIDC(port / 2));
  277. return (val >> s) & RT305X_ESW_PVIDC_PVID_M;
  278. }
  279. static void esw_set_pvid(struct rt305x_esw *esw, unsigned port, unsigned pvid)
  280. {
  281. unsigned s;
  282. s = RT305X_ESW_PVIDC_PVID_S * (port % 2);
  283. esw_rmw(esw,
  284. RT305X_ESW_REG_PVIDC(port / 2),
  285. RT305X_ESW_PVIDC_PVID_M << s,
  286. (pvid & RT305X_ESW_PVIDC_PVID_M) << s);
  287. }
  288. static unsigned esw_get_vmsc(struct rt305x_esw *esw, unsigned vlan)
  289. {
  290. unsigned s, val;
  291. s = RT305X_ESW_VMSC_MSC_S * (vlan % 4);
  292. val = esw_r32(esw, RT305X_ESW_REG_VMSC(vlan / 4));
  293. val = (val >> s) & RT305X_ESW_VMSC_MSC_M;
  294. return val;
  295. }
  296. static void esw_set_vmsc(struct rt305x_esw *esw, unsigned vlan, unsigned msc)
  297. {
  298. unsigned s;
  299. s = RT305X_ESW_VMSC_MSC_S * (vlan % 4);
  300. esw_rmw(esw,
  301. RT305X_ESW_REG_VMSC(vlan / 4),
  302. RT305X_ESW_VMSC_MSC_M << s,
  303. (msc & RT305X_ESW_VMSC_MSC_M) << s);
  304. }
  305. static unsigned esw_get_port_disable(struct rt305x_esw *esw)
  306. {
  307. unsigned reg;
  308. reg = esw_r32(esw, RT305X_ESW_REG_POC0);
  309. return (reg >> RT305X_ESW_POC0_DIS_PORT_S) &
  310. RT305X_ESW_POC0_DIS_PORT_M;
  311. }
  312. static void esw_set_port_disable(struct rt305x_esw *esw, unsigned disable_mask)
  313. {
  314. unsigned old_mask;
  315. unsigned enable_mask;
  316. unsigned changed;
  317. int i;
  318. old_mask = esw_get_port_disable(esw);
  319. changed = old_mask ^ disable_mask;
  320. enable_mask = old_mask & disable_mask;
  321. /* enable before writing to MII */
  322. esw_rmw(esw, RT305X_ESW_REG_POC0,
  323. (RT305X_ESW_POC0_DIS_PORT_M <<
  324. RT305X_ESW_POC0_DIS_PORT_S),
  325. enable_mask << RT305X_ESW_POC0_DIS_PORT_S);
  326. for (i = 0; i < RT305X_ESW_NUM_LEDS; i++) {
  327. if (!(changed & (1 << i)))
  328. continue;
  329. if (disable_mask & (1 << i)) {
  330. /* disable */
  331. rt305x_mii_write(esw, i, MII_BMCR,
  332. BMCR_PDOWN);
  333. } else {
  334. /* enable */
  335. rt305x_mii_write(esw, i, MII_BMCR,
  336. BMCR_FULLDPLX |
  337. BMCR_ANENABLE |
  338. BMCR_ANRESTART |
  339. BMCR_SPEED100);
  340. }
  341. }
  342. /* disable after writing to MII */
  343. esw_rmw(esw, RT305X_ESW_REG_POC0,
  344. (RT305X_ESW_POC0_DIS_PORT_M <<
  345. RT305X_ESW_POC0_DIS_PORT_S),
  346. disable_mask << RT305X_ESW_POC0_DIS_PORT_S);
  347. }
  348. static void esw_set_gsc(struct rt305x_esw *esw)
  349. {
  350. esw_rmw(esw, RT305X_ESW_REG_SGC,
  351. RT305X_ESW_GSC_BC_STROM_MASK << RT305X_ESW_GSC_BC_STROM_SHIFT,
  352. esw->bc_storm_protect << RT305X_ESW_GSC_BC_STROM_SHIFT);
  353. esw_rmw(esw, RT305X_ESW_REG_SGC,
  354. RT305X_ESW_GSC_LED_FREQ_MASK << RT305X_ESW_GSC_LED_FREQ_SHIFT,
  355. esw->led_frequency << RT305X_ESW_GSC_LED_FREQ_SHIFT);
  356. }
  357. static int esw_apply_config(struct switch_dev *dev);
  358. static void esw_hw_init(struct rt305x_esw *esw)
  359. {
  360. int i;
  361. u8 port_disable = 0;
  362. u8 port_map = RT305X_ESW_PMAP_LLLLLL;
  363. /* vodoo from original driver */
  364. esw_w32(esw, 0xC8A07850, RT305X_ESW_REG_FCT0);
  365. esw_w32(esw, 0x00000000, RT305X_ESW_REG_SGC2);
  366. /* Port priority 1 for all ports, vlan enabled. */
  367. esw_w32(esw, 0x00005555 |
  368. (RT305X_ESW_PORTS_ALL << RT305X_ESW_PFC1_EN_VLAN_S),
  369. RT305X_ESW_REG_PFC1);
  370. /* Enable all ports, Back Pressure and Flow Control */
  371. esw_w32(esw, ((RT305X_ESW_PORTS_ALL << RT305X_ESW_POC0_EN_BP_S) |
  372. (RT305X_ESW_PORTS_ALL << RT305X_ESW_POC0_EN_FC_S)),
  373. RT305X_ESW_REG_POC0);
  374. /* Enable Aging, and VLAN TAG removal */
  375. esw_w32(esw, ((RT305X_ESW_PORTS_ALL << RT305X_ESW_POC2_ENAGING_S) |
  376. (RT305X_ESW_PORTS_NOCPU << RT305X_ESW_POC2_UNTAG_EN_S)),
  377. RT305X_ESW_REG_POC2);
  378. if (esw->reg_initval_fct2)
  379. esw_w32(esw, esw->reg_initval_fct2, RT305X_ESW_REG_FCT2);
  380. else
  381. esw_w32(esw, 0x0002500c, RT305X_ESW_REG_FCT2);
  382. /* 300s aging timer, max packet len 1536, broadcast storm prevention
  383. * disabled, disable collision abort, mac xor48 hash, 10 packet back
  384. * pressure jam, GMII disable was_transmit, back pressure disabled,
  385. * 30ms led flash, unmatched IGMP as broadcast, rmc tb fault to all
  386. * ports.
  387. */
  388. esw_w32(esw, 0x0008a301, RT305X_ESW_REG_SGC);
  389. /* Setup SoC Port control register */
  390. esw_w32(esw,
  391. (RT305X_ESW_SOCPC_CRC_PADDING |
  392. (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISUN2CPU_S) |
  393. (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISMC2CPU_S) |
  394. (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISBC2CPU_S)),
  395. RT305X_ESW_REG_SOCPC);
  396. /* ext phy base addr 31, enable port 5 polling, rx/tx clock skew 1,
  397. * turbo mii off, rgmi 3.3v off
  398. * port5: disabled
  399. * port6: enabled, gige, full-duplex, rx/tx-flow-control
  400. */
  401. if (esw->reg_initval_fpa2)
  402. esw_w32(esw, esw->reg_initval_fpa2, RT305X_ESW_REG_FPA2);
  403. else
  404. esw_w32(esw, 0x3f502b28, RT305X_ESW_REG_FPA2);
  405. esw_w32(esw, 0x00000000, RT305X_ESW_REG_FPA);
  406. /* Force Link/Activity on ports */
  407. esw_w32(esw, 0x00000005, RT305X_ESW_REG_P0LED);
  408. esw_w32(esw, 0x00000005, RT305X_ESW_REG_P1LED);
  409. esw_w32(esw, 0x00000005, RT305X_ESW_REG_P2LED);
  410. esw_w32(esw, 0x00000005, RT305X_ESW_REG_P3LED);
  411. esw_w32(esw, 0x00000005, RT305X_ESW_REG_P4LED);
  412. /* Copy disabled port configuration from device tree setup */
  413. port_disable = esw->port_disable;
  414. /* Disable nonexistent ports by reading the switch config
  415. * after having enabled all possible ports above
  416. */
  417. port_disable |= esw_get_port_disable(esw);
  418. for (i = 0; i < 6; i++)
  419. esw->ports[i].disable = (port_disable & (1 << i)) != 0;
  420. if (ralink_soc == RT305X_SOC_RT3352) {
  421. /* reset EPHY */
  422. fe_reset(RT5350_RESET_EPHY);
  423. rt305x_mii_write(esw, 0, 31, 0x8000);
  424. for (i = 0; i < 5; i++) {
  425. if (esw->ports[i].disable) {
  426. rt305x_mii_write(esw, i, MII_BMCR, BMCR_PDOWN);
  427. } else {
  428. rt305x_mii_write(esw, i, MII_BMCR,
  429. BMCR_FULLDPLX |
  430. BMCR_ANENABLE |
  431. BMCR_SPEED100);
  432. }
  433. /* TX10 waveform coefficient LSB=0 disable PHY */
  434. rt305x_mii_write(esw, i, 26, 0x1601);
  435. /* TX100/TX10 AD/DA current bias */
  436. rt305x_mii_write(esw, i, 29, 0x7016);
  437. /* TX100 slew rate control */
  438. rt305x_mii_write(esw, i, 30, 0x0038);
  439. }
  440. /* select global register */
  441. rt305x_mii_write(esw, 0, 31, 0x0);
  442. /* enlarge agcsel threshold 3 and threshold 2 */
  443. rt305x_mii_write(esw, 0, 1, 0x4a40);
  444. /* enlarge agcsel threshold 5 and threshold 4 */
  445. rt305x_mii_write(esw, 0, 2, 0x6254);
  446. /* enlarge agcsel threshold */
  447. rt305x_mii_write(esw, 0, 3, 0xa17f);
  448. rt305x_mii_write(esw, 0, 12, 0x7eaa);
  449. /* longer TP_IDL tail length */
  450. rt305x_mii_write(esw, 0, 14, 0x65);
  451. /* increased squelch pulse count threshold. */
  452. rt305x_mii_write(esw, 0, 16, 0x0684);
  453. /* set TX10 signal amplitude threshold to minimum */
  454. rt305x_mii_write(esw, 0, 17, 0x0fe0);
  455. /* set squelch amplitude to higher threshold */
  456. rt305x_mii_write(esw, 0, 18, 0x40ba);
  457. /* tune TP_IDL tail and head waveform, enable power
  458. * down slew rate control
  459. */
  460. rt305x_mii_write(esw, 0, 22, 0x253f);
  461. /* set PLL/Receive bias current are calibrated */
  462. rt305x_mii_write(esw, 0, 27, 0x2fda);
  463. /* change PLL/Receive bias current to internal(RT3350) */
  464. rt305x_mii_write(esw, 0, 28, 0xc410);
  465. /* change PLL bias current to internal(RT3052_MP3) */
  466. rt305x_mii_write(esw, 0, 29, 0x598b);
  467. /* select local register */
  468. rt305x_mii_write(esw, 0, 31, 0x8000);
  469. } else if (ralink_soc == RT305X_SOC_RT5350) {
  470. /* reset EPHY */
  471. fe_reset(RT5350_RESET_EPHY);
  472. /* set the led polarity */
  473. esw_w32(esw, esw->reg_led_polarity & 0x1F,
  474. RT5350_EWS_REG_LED_POLARITY);
  475. /* local registers */
  476. rt305x_mii_write(esw, 0, 31, 0x8000);
  477. for (i = 0; i < 5; i++) {
  478. if (esw->ports[i].disable) {
  479. rt305x_mii_write(esw, i, MII_BMCR, BMCR_PDOWN);
  480. } else {
  481. rt305x_mii_write(esw, i, MII_BMCR,
  482. BMCR_FULLDPLX |
  483. BMCR_ANENABLE |
  484. BMCR_SPEED100);
  485. }
  486. /* TX10 waveform coefficient LSB=0 disable PHY */
  487. rt305x_mii_write(esw, i, 26, 0x1601);
  488. /* TX100/TX10 AD/DA current bias */
  489. rt305x_mii_write(esw, i, 29, 0x7015);
  490. /* TX100 slew rate control */
  491. rt305x_mii_write(esw, i, 30, 0x0038);
  492. }
  493. /* global registers */
  494. rt305x_mii_write(esw, 0, 31, 0x0);
  495. /* enlarge agcsel threshold 3 and threshold 2 */
  496. rt305x_mii_write(esw, 0, 1, 0x4a40);
  497. /* enlarge agcsel threshold 5 and threshold 4 */
  498. rt305x_mii_write(esw, 0, 2, 0x6254);
  499. /* enlarge agcsel threshold 6 */
  500. rt305x_mii_write(esw, 0, 3, 0xa17f);
  501. rt305x_mii_write(esw, 0, 12, 0x7eaa);
  502. /* longer TP_IDL tail length */
  503. rt305x_mii_write(esw, 0, 14, 0x65);
  504. /* increased squelch pulse count threshold. */
  505. rt305x_mii_write(esw, 0, 16, 0x0684);
  506. /* set TX10 signal amplitude threshold to minimum */
  507. rt305x_mii_write(esw, 0, 17, 0x0fe0);
  508. /* set squelch amplitude to higher threshold */
  509. rt305x_mii_write(esw, 0, 18, 0x40ba);
  510. /* tune TP_IDL tail and head waveform, enable power
  511. * down slew rate control
  512. */
  513. rt305x_mii_write(esw, 0, 22, 0x253f);
  514. /* set PLL/Receive bias current are calibrated */
  515. rt305x_mii_write(esw, 0, 27, 0x2fda);
  516. /* change PLL/Receive bias current to internal(RT3350) */
  517. rt305x_mii_write(esw, 0, 28, 0xc410);
  518. /* change PLL bias current to internal(RT3052_MP3) */
  519. rt305x_mii_write(esw, 0, 29, 0x598b);
  520. /* select local register */
  521. rt305x_mii_write(esw, 0, 31, 0x8000);
  522. } else if (ralink_soc == MT762X_SOC_MT7628AN || ralink_soc == MT762X_SOC_MT7688) {
  523. int i;
  524. /* reset EPHY */
  525. fe_reset(RT5350_RESET_EPHY);
  526. rt305x_mii_write(esw, 0, 31, 0x2000); /* change G2 page */
  527. rt305x_mii_write(esw, 0, 26, 0x0020);
  528. for (i = 0; i < 5; i++) {
  529. rt305x_mii_write(esw, i, 31, 0x8000);
  530. rt305x_mii_write(esw, i, 0, 0x3100);
  531. rt305x_mii_write(esw, i, 30, 0xa000);
  532. rt305x_mii_write(esw, i, 31, 0xa000);
  533. rt305x_mii_write(esw, i, 16, 0x0606);
  534. rt305x_mii_write(esw, i, 23, 0x0f0e);
  535. rt305x_mii_write(esw, i, 24, 0x1610);
  536. rt305x_mii_write(esw, i, 30, 0x1f15);
  537. rt305x_mii_write(esw, i, 28, 0x6111);
  538. rt305x_mii_write(esw, i, 31, 0x2000);
  539. rt305x_mii_write(esw, i, 26, 0x0000);
  540. }
  541. /* 100Base AOI setting */
  542. rt305x_mii_write(esw, 0, 31, 0x5000);
  543. rt305x_mii_write(esw, 0, 19, 0x004a);
  544. rt305x_mii_write(esw, 0, 20, 0x015a);
  545. rt305x_mii_write(esw, 0, 21, 0x00ee);
  546. rt305x_mii_write(esw, 0, 22, 0x0033);
  547. rt305x_mii_write(esw, 0, 23, 0x020a);
  548. rt305x_mii_write(esw, 0, 24, 0x0000);
  549. rt305x_mii_write(esw, 0, 25, 0x024a);
  550. rt305x_mii_write(esw, 0, 26, 0x035a);
  551. rt305x_mii_write(esw, 0, 27, 0x02ee);
  552. rt305x_mii_write(esw, 0, 28, 0x0233);
  553. rt305x_mii_write(esw, 0, 29, 0x000a);
  554. rt305x_mii_write(esw, 0, 30, 0x0000);
  555. } else {
  556. rt305x_mii_write(esw, 0, 31, 0x8000);
  557. for (i = 0; i < 5; i++) {
  558. if (esw->ports[i].disable) {
  559. rt305x_mii_write(esw, i, MII_BMCR, BMCR_PDOWN);
  560. } else {
  561. rt305x_mii_write(esw, i, MII_BMCR,
  562. BMCR_FULLDPLX |
  563. BMCR_ANENABLE |
  564. BMCR_SPEED100);
  565. }
  566. /* TX10 waveform coefficient */
  567. rt305x_mii_write(esw, i, 26, 0x1601);
  568. /* TX100/TX10 AD/DA current bias */
  569. rt305x_mii_write(esw, i, 29, 0x7058);
  570. /* TX100 slew rate control */
  571. rt305x_mii_write(esw, i, 30, 0x0018);
  572. }
  573. /* PHY IOT */
  574. /* select global register */
  575. rt305x_mii_write(esw, 0, 31, 0x0);
  576. /* tune TP_IDL tail and head waveform */
  577. rt305x_mii_write(esw, 0, 22, 0x052f);
  578. /* set TX10 signal amplitude threshold to minimum */
  579. rt305x_mii_write(esw, 0, 17, 0x0fe0);
  580. /* set squelch amplitude to higher threshold */
  581. rt305x_mii_write(esw, 0, 18, 0x40ba);
  582. /* longer TP_IDL tail length */
  583. rt305x_mii_write(esw, 0, 14, 0x65);
  584. /* select local register */
  585. rt305x_mii_write(esw, 0, 31, 0x8000);
  586. }
  587. if (esw->port_map)
  588. port_map = esw->port_map;
  589. else
  590. port_map = RT305X_ESW_PMAP_LLLLLL;
  591. /* Unused HW feature, but still nice to be consistent here...
  592. * This is also exported to userspace ('lan' attribute) so it's
  593. * conveniently usable to decide which ports go into the wan vlan by
  594. * default.
  595. */
  596. esw_rmw(esw, RT305X_ESW_REG_SGC2,
  597. RT305X_ESW_SGC2_LAN_PMAP_M << RT305X_ESW_SGC2_LAN_PMAP_S,
  598. port_map << RT305X_ESW_SGC2_LAN_PMAP_S);
  599. /* make the switch leds blink */
  600. for (i = 0; i < RT305X_ESW_NUM_LEDS; i++)
  601. esw->ports[i].led = 0x05;
  602. /* Apply the empty config. */
  603. esw_apply_config(&esw->swdev);
  604. /* Only unmask the port change interrupt */
  605. esw_w32(esw, ~RT305X_ESW_PORT_ST_CHG, RT305X_ESW_REG_IMR);
  606. }
  607. static irqreturn_t esw_interrupt(int irq, void *_esw)
  608. {
  609. struct rt305x_esw *esw = (struct rt305x_esw *)_esw;
  610. u32 status;
  611. status = esw_r32(esw, RT305X_ESW_REG_ISR);
  612. if (status & RT305X_ESW_PORT_ST_CHG) {
  613. u32 link = esw_r32(esw, RT305X_ESW_REG_POA);
  614. link >>= RT305X_ESW_POA_LINK_SHIFT;
  615. link &= RT305X_ESW_POA_LINK_MASK;
  616. dev_info(esw->dev, "link changed 0x%02X\n", link);
  617. }
  618. esw_w32(esw, status, RT305X_ESW_REG_ISR);
  619. return IRQ_HANDLED;
  620. }
  621. static int esw_apply_config(struct switch_dev *dev)
  622. {
  623. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  624. int i;
  625. u8 disable = 0;
  626. u8 doubletag = 0;
  627. u8 en_vlan = 0;
  628. u8 untag = 0;
  629. for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) {
  630. u32 vid, vmsc;
  631. if (esw->global_vlan_enable) {
  632. vid = esw->vlans[i].vid;
  633. vmsc = esw->vlans[i].ports;
  634. } else {
  635. vid = RT305X_ESW_VLAN_NONE;
  636. vmsc = RT305X_ESW_PORTS_NONE;
  637. }
  638. esw_set_vlan_id(esw, i, vid);
  639. esw_set_vmsc(esw, i, vmsc);
  640. }
  641. for (i = 0; i < RT305X_ESW_NUM_PORTS; i++) {
  642. u32 pvid;
  643. disable |= esw->ports[i].disable << i;
  644. if (esw->global_vlan_enable) {
  645. doubletag |= esw->ports[i].doubletag << i;
  646. en_vlan |= 1 << i;
  647. untag |= esw->ports[i].untag << i;
  648. pvid = esw->ports[i].pvid;
  649. } else {
  650. int x = esw->alt_vlan_disable ? 0 : 1;
  651. doubletag |= x << i;
  652. en_vlan |= x << i;
  653. untag |= x << i;
  654. pvid = 0;
  655. }
  656. esw_set_pvid(esw, i, pvid);
  657. if (i < RT305X_ESW_NUM_LEDS)
  658. esw_w32(esw, esw->ports[i].led,
  659. RT305X_ESW_REG_P0LED + 4*i);
  660. }
  661. esw_set_gsc(esw);
  662. esw_set_port_disable(esw, disable);
  663. esw_rmw(esw, RT305X_ESW_REG_SGC2,
  664. (RT305X_ESW_SGC2_DOUBLE_TAG_M <<
  665. RT305X_ESW_SGC2_DOUBLE_TAG_S),
  666. doubletag << RT305X_ESW_SGC2_DOUBLE_TAG_S);
  667. esw_rmw(esw, RT305X_ESW_REG_PFC1,
  668. RT305X_ESW_PFC1_EN_VLAN_M << RT305X_ESW_PFC1_EN_VLAN_S,
  669. en_vlan << RT305X_ESW_PFC1_EN_VLAN_S);
  670. esw_rmw(esw, RT305X_ESW_REG_POC2,
  671. RT305X_ESW_POC2_UNTAG_EN_M << RT305X_ESW_POC2_UNTAG_EN_S,
  672. untag << RT305X_ESW_POC2_UNTAG_EN_S);
  673. if (!esw->global_vlan_enable) {
  674. /*
  675. * Still need to put all ports into vlan 0 or they'll be
  676. * isolated.
  677. * NOTE: vlan 0 is special, no vlan tag is prepended
  678. */
  679. esw_set_vlan_id(esw, 0, 0);
  680. esw_set_vmsc(esw, 0, RT305X_ESW_PORTS_ALL);
  681. }
  682. return 0;
  683. }
  684. static int esw_reset_switch(struct switch_dev *dev)
  685. {
  686. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  687. esw->global_vlan_enable = 0;
  688. memset(esw->ports, 0, sizeof(esw->ports));
  689. memset(esw->vlans, 0, sizeof(esw->vlans));
  690. esw_hw_init(esw);
  691. return 0;
  692. }
  693. static int esw_get_vlan_enable(struct switch_dev *dev,
  694. const struct switch_attr *attr,
  695. struct switch_val *val)
  696. {
  697. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  698. val->value.i = esw->global_vlan_enable;
  699. return 0;
  700. }
  701. static int esw_set_vlan_enable(struct switch_dev *dev,
  702. const struct switch_attr *attr,
  703. struct switch_val *val)
  704. {
  705. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  706. esw->global_vlan_enable = val->value.i != 0;
  707. return 0;
  708. }
  709. static int esw_get_alt_vlan_disable(struct switch_dev *dev,
  710. const struct switch_attr *attr,
  711. struct switch_val *val)
  712. {
  713. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  714. val->value.i = esw->alt_vlan_disable;
  715. return 0;
  716. }
  717. static int esw_set_alt_vlan_disable(struct switch_dev *dev,
  718. const struct switch_attr *attr,
  719. struct switch_val *val)
  720. {
  721. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  722. esw->alt_vlan_disable = val->value.i != 0;
  723. return 0;
  724. }
  725. static int
  726. rt305x_esw_set_bc_status(struct switch_dev *dev,
  727. const struct switch_attr *attr,
  728. struct switch_val *val)
  729. {
  730. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  731. esw->bc_storm_protect = val->value.i & RT305X_ESW_GSC_BC_STROM_MASK;
  732. return 0;
  733. }
  734. static int
  735. rt305x_esw_get_bc_status(struct switch_dev *dev,
  736. const struct switch_attr *attr,
  737. struct switch_val *val)
  738. {
  739. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  740. val->value.i = esw->bc_storm_protect;
  741. return 0;
  742. }
  743. static int
  744. rt305x_esw_set_led_freq(struct switch_dev *dev,
  745. const struct switch_attr *attr,
  746. struct switch_val *val)
  747. {
  748. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  749. esw->led_frequency = val->value.i & RT305X_ESW_GSC_LED_FREQ_MASK;
  750. return 0;
  751. }
  752. static int
  753. rt305x_esw_get_led_freq(struct switch_dev *dev,
  754. const struct switch_attr *attr,
  755. struct switch_val *val)
  756. {
  757. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  758. val->value.i = esw->led_frequency;
  759. return 0;
  760. }
  761. static int esw_get_port_link(struct switch_dev *dev,
  762. int port,
  763. struct switch_port_link *link)
  764. {
  765. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  766. u32 speed, poa;
  767. if (port < 0 || port >= RT305X_ESW_NUM_PORTS)
  768. return -EINVAL;
  769. poa = esw_r32(esw, RT305X_ESW_REG_POA) >> port;
  770. link->link = (poa >> RT305X_ESW_LINK_S) & 1;
  771. link->duplex = (poa >> RT305X_ESW_DUPLEX_S) & 1;
  772. if (port < RT305X_ESW_NUM_LEDS) {
  773. speed = (poa >> RT305X_ESW_SPD_S) & 1;
  774. } else {
  775. if (port == RT305X_ESW_NUM_PORTS - 1)
  776. poa >>= 1;
  777. speed = (poa >> RT305X_ESW_SPD_S) & 3;
  778. }
  779. switch (speed) {
  780. case 0:
  781. link->speed = SWITCH_PORT_SPEED_10;
  782. break;
  783. case 1:
  784. link->speed = SWITCH_PORT_SPEED_100;
  785. break;
  786. case 2:
  787. case 3: /* forced gige speed can be 2 or 3 */
  788. link->speed = SWITCH_PORT_SPEED_1000;
  789. break;
  790. default:
  791. link->speed = SWITCH_PORT_SPEED_UNKNOWN;
  792. break;
  793. }
  794. return 0;
  795. }
  796. static int esw_get_port_bool(struct switch_dev *dev,
  797. const struct switch_attr *attr,
  798. struct switch_val *val)
  799. {
  800. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  801. int idx = val->port_vlan;
  802. u32 x, reg, shift;
  803. if (idx < 0 || idx >= RT305X_ESW_NUM_PORTS)
  804. return -EINVAL;
  805. switch (attr->id) {
  806. case RT305X_ESW_ATTR_PORT_DISABLE:
  807. reg = RT305X_ESW_REG_POC0;
  808. shift = RT305X_ESW_POC0_DIS_PORT_S;
  809. break;
  810. case RT305X_ESW_ATTR_PORT_DOUBLETAG:
  811. reg = RT305X_ESW_REG_SGC2;
  812. shift = RT305X_ESW_SGC2_DOUBLE_TAG_S;
  813. break;
  814. case RT305X_ESW_ATTR_PORT_UNTAG:
  815. reg = RT305X_ESW_REG_POC2;
  816. shift = RT305X_ESW_POC2_UNTAG_EN_S;
  817. break;
  818. case RT305X_ESW_ATTR_PORT_LAN:
  819. reg = RT305X_ESW_REG_SGC2;
  820. shift = RT305X_ESW_SGC2_LAN_PMAP_S;
  821. if (idx >= RT305X_ESW_NUM_LANWAN)
  822. return -EINVAL;
  823. break;
  824. default:
  825. return -EINVAL;
  826. }
  827. x = esw_r32(esw, reg);
  828. val->value.i = (x >> (idx + shift)) & 1;
  829. return 0;
  830. }
  831. static int esw_set_port_bool(struct switch_dev *dev,
  832. const struct switch_attr *attr,
  833. struct switch_val *val)
  834. {
  835. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  836. int idx = val->port_vlan;
  837. if (idx < 0 || idx >= RT305X_ESW_NUM_PORTS ||
  838. val->value.i < 0 || val->value.i > 1)
  839. return -EINVAL;
  840. switch (attr->id) {
  841. case RT305X_ESW_ATTR_PORT_DISABLE:
  842. esw->ports[idx].disable = val->value.i;
  843. break;
  844. case RT305X_ESW_ATTR_PORT_DOUBLETAG:
  845. esw->ports[idx].doubletag = val->value.i;
  846. break;
  847. case RT305X_ESW_ATTR_PORT_UNTAG:
  848. esw->ports[idx].untag = val->value.i;
  849. break;
  850. default:
  851. return -EINVAL;
  852. }
  853. return 0;
  854. }
  855. static int esw_get_port_recv_badgood(struct switch_dev *dev,
  856. const struct switch_attr *attr,
  857. struct switch_val *val)
  858. {
  859. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  860. int idx = val->port_vlan;
  861. int shift = attr->id == RT305X_ESW_ATTR_PORT_RECV_GOOD ? 0 : 16;
  862. u32 reg;
  863. if (idx < 0 || idx >= RT305X_ESW_NUM_LANWAN)
  864. return -EINVAL;
  865. reg = esw_r32(esw, RT305X_ESW_REG_PXPC(idx));
  866. val->value.i = (reg >> shift) & 0xffff;
  867. return 0;
  868. }
  869. static int
  870. esw_get_port_tr_badgood(struct switch_dev *dev,
  871. const struct switch_attr *attr,
  872. struct switch_val *val)
  873. {
  874. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  875. int idx = val->port_vlan;
  876. int shift = attr->id == RT5350_ESW_ATTR_PORT_TR_GOOD ? 0 : 16;
  877. u32 reg;
  878. if ((ralink_soc != RT305X_SOC_RT5350) && (ralink_soc != MT762X_SOC_MT7628AN) && (ralink_soc != MT762X_SOC_MT7688))
  879. return -EINVAL;
  880. if (idx < 0 || idx >= RT305X_ESW_NUM_LANWAN)
  881. return -EINVAL;
  882. reg = esw_r32(esw, RT5350_ESW_REG_PXTPC(idx));
  883. val->value.i = (reg >> shift) & 0xffff;
  884. return 0;
  885. }
  886. static int esw_get_port_led(struct switch_dev *dev,
  887. const struct switch_attr *attr,
  888. struct switch_val *val)
  889. {
  890. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  891. int idx = val->port_vlan;
  892. if (idx < 0 || idx >= RT305X_ESW_NUM_PORTS ||
  893. idx >= RT305X_ESW_NUM_LEDS)
  894. return -EINVAL;
  895. val->value.i = esw_r32(esw, RT305X_ESW_REG_P0LED + 4*idx);
  896. return 0;
  897. }
  898. static int esw_set_port_led(struct switch_dev *dev,
  899. const struct switch_attr *attr,
  900. struct switch_val *val)
  901. {
  902. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  903. int idx = val->port_vlan;
  904. if (idx < 0 || idx >= RT305X_ESW_NUM_LEDS)
  905. return -EINVAL;
  906. esw->ports[idx].led = val->value.i;
  907. return 0;
  908. }
  909. static int esw_get_port_pvid(struct switch_dev *dev, int port, int *val)
  910. {
  911. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  912. if (port >= RT305X_ESW_NUM_PORTS)
  913. return -EINVAL;
  914. *val = esw_get_pvid(esw, port);
  915. return 0;
  916. }
  917. static int esw_set_port_pvid(struct switch_dev *dev, int port, int val)
  918. {
  919. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  920. if (port >= RT305X_ESW_NUM_PORTS)
  921. return -EINVAL;
  922. esw->ports[port].pvid = val;
  923. return 0;
  924. }
  925. static int esw_get_vlan_ports(struct switch_dev *dev, struct switch_val *val)
  926. {
  927. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  928. u32 vmsc, poc2;
  929. int vlan_idx = -1;
  930. int i;
  931. val->len = 0;
  932. if (val->port_vlan < 0 || val->port_vlan >= RT305X_ESW_NUM_VIDS)
  933. return -EINVAL;
  934. /* valid vlan? */
  935. for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) {
  936. if (esw_get_vlan_id(esw, i) == val->port_vlan &&
  937. esw_get_vmsc(esw, i) != RT305X_ESW_PORTS_NONE) {
  938. vlan_idx = i;
  939. break;
  940. }
  941. }
  942. if (vlan_idx == -1)
  943. return -EINVAL;
  944. vmsc = esw_get_vmsc(esw, vlan_idx);
  945. poc2 = esw_r32(esw, RT305X_ESW_REG_POC2);
  946. for (i = 0; i < RT305X_ESW_NUM_PORTS; i++) {
  947. struct switch_port *p;
  948. int port_mask = 1 << i;
  949. if (!(vmsc & port_mask))
  950. continue;
  951. p = &val->value.ports[val->len++];
  952. p->id = i;
  953. if (poc2 & (port_mask << RT305X_ESW_POC2_UNTAG_EN_S))
  954. p->flags = 0;
  955. else
  956. p->flags = 1 << SWITCH_PORT_FLAG_TAGGED;
  957. }
  958. return 0;
  959. }
  960. static int esw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
  961. {
  962. struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
  963. int ports;
  964. int vlan_idx = -1;
  965. int i;
  966. if (val->port_vlan < 0 || val->port_vlan >= RT305X_ESW_NUM_VIDS ||
  967. val->len > RT305X_ESW_NUM_PORTS)
  968. return -EINVAL;
  969. /* one of the already defined vlans? */
  970. for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) {
  971. if (esw->vlans[i].vid == val->port_vlan &&
  972. esw->vlans[i].ports != RT305X_ESW_PORTS_NONE) {
  973. vlan_idx = i;
  974. break;
  975. }
  976. }
  977. /* select a free slot */
  978. for (i = 0; vlan_idx == -1 && i < RT305X_ESW_NUM_VLANS; i++) {
  979. if (esw->vlans[i].ports == RT305X_ESW_PORTS_NONE)
  980. vlan_idx = i;
  981. }
  982. /* bail if all slots are in use */
  983. if (vlan_idx == -1)
  984. return -EINVAL;
  985. ports = RT305X_ESW_PORTS_NONE;
  986. for (i = 0; i < val->len; i++) {
  987. struct switch_port *p = &val->value.ports[i];
  988. int port_mask = 1 << p->id;
  989. bool untagged = !(p->flags & (1 << SWITCH_PORT_FLAG_TAGGED));
  990. if (p->id >= RT305X_ESW_NUM_PORTS)
  991. return -EINVAL;
  992. ports |= port_mask;
  993. esw->ports[p->id].untag = untagged;
  994. }
  995. esw->vlans[vlan_idx].ports = ports;
  996. if (ports == RT305X_ESW_PORTS_NONE)
  997. esw->vlans[vlan_idx].vid = RT305X_ESW_VLAN_NONE;
  998. else
  999. esw->vlans[vlan_idx].vid = val->port_vlan;
  1000. return 0;
  1001. }
  1002. static const struct switch_attr esw_global[] = {
  1003. {
  1004. .type = SWITCH_TYPE_INT,
  1005. .name = "enable_vlan",
  1006. .description = "VLAN mode (1:enabled)",
  1007. .max = 1,
  1008. .id = RT305X_ESW_ATTR_ENABLE_VLAN,
  1009. .get = esw_get_vlan_enable,
  1010. .set = esw_set_vlan_enable,
  1011. },
  1012. {
  1013. .type = SWITCH_TYPE_INT,
  1014. .name = "alternate_vlan_disable",
  1015. .description = "Use en_vlan instead of doubletag to disable"
  1016. " VLAN mode",
  1017. .max = 1,
  1018. .id = RT305X_ESW_ATTR_ALT_VLAN_DISABLE,
  1019. .get = esw_get_alt_vlan_disable,
  1020. .set = esw_set_alt_vlan_disable,
  1021. },
  1022. {
  1023. .type = SWITCH_TYPE_INT,
  1024. .name = "bc_storm_protect",
  1025. .description = "Global broadcast storm protection (0:Disable, 1:64 blocks, 2:96 blocks, 3:128 blocks)",
  1026. .max = 3,
  1027. .id = RT305X_ESW_ATTR_BC_STATUS,
  1028. .get = rt305x_esw_get_bc_status,
  1029. .set = rt305x_esw_set_bc_status,
  1030. },
  1031. {
  1032. .type = SWITCH_TYPE_INT,
  1033. .name = "led_frequency",
  1034. .description = "LED Flash frequency (0:30mS, 1:60mS, 2:240mS, 3:480mS)",
  1035. .max = 3,
  1036. .id = RT305X_ESW_ATTR_LED_FREQ,
  1037. .get = rt305x_esw_get_led_freq,
  1038. .set = rt305x_esw_set_led_freq,
  1039. }
  1040. };
  1041. static const struct switch_attr esw_port[] = {
  1042. {
  1043. .type = SWITCH_TYPE_INT,
  1044. .name = "disable",
  1045. .description = "Port state (1:disabled)",
  1046. .max = 1,
  1047. .id = RT305X_ESW_ATTR_PORT_DISABLE,
  1048. .get = esw_get_port_bool,
  1049. .set = esw_set_port_bool,
  1050. },
  1051. {
  1052. .type = SWITCH_TYPE_INT,
  1053. .name = "doubletag",
  1054. .description = "Double tagging for incoming vlan packets "
  1055. "(1:enabled)",
  1056. .max = 1,
  1057. .id = RT305X_ESW_ATTR_PORT_DOUBLETAG,
  1058. .get = esw_get_port_bool,
  1059. .set = esw_set_port_bool,
  1060. },
  1061. {
  1062. .type = SWITCH_TYPE_INT,
  1063. .name = "untag",
  1064. .description = "Untag (1:strip outgoing vlan tag)",
  1065. .max = 1,
  1066. .id = RT305X_ESW_ATTR_PORT_UNTAG,
  1067. .get = esw_get_port_bool,
  1068. .set = esw_set_port_bool,
  1069. },
  1070. {
  1071. .type = SWITCH_TYPE_INT,
  1072. .name = "led",
  1073. .description = "LED mode (0:link, 1:100m, 2:duplex, 3:activity,"
  1074. " 4:collision, 5:linkact, 6:duplcoll, 7:10mact,"
  1075. " 8:100mact, 10:blink, 11:off, 12:on)",
  1076. .max = 15,
  1077. .id = RT305X_ESW_ATTR_PORT_LED,
  1078. .get = esw_get_port_led,
  1079. .set = esw_set_port_led,
  1080. },
  1081. {
  1082. .type = SWITCH_TYPE_INT,
  1083. .name = "lan",
  1084. .description = "HW port group (0:wan, 1:lan)",
  1085. .max = 1,
  1086. .id = RT305X_ESW_ATTR_PORT_LAN,
  1087. .get = esw_get_port_bool,
  1088. },
  1089. {
  1090. .type = SWITCH_TYPE_INT,
  1091. .name = "recv_bad",
  1092. .description = "Receive bad packet counter",
  1093. .id = RT305X_ESW_ATTR_PORT_RECV_BAD,
  1094. .get = esw_get_port_recv_badgood,
  1095. },
  1096. {
  1097. .type = SWITCH_TYPE_INT,
  1098. .name = "recv_good",
  1099. .description = "Receive good packet counter",
  1100. .id = RT305X_ESW_ATTR_PORT_RECV_GOOD,
  1101. .get = esw_get_port_recv_badgood,
  1102. },
  1103. {
  1104. .type = SWITCH_TYPE_INT,
  1105. .name = "tr_bad",
  1106. .description = "Transmit bad packet counter. rt5350 only",
  1107. .id = RT5350_ESW_ATTR_PORT_TR_BAD,
  1108. .get = esw_get_port_tr_badgood,
  1109. },
  1110. {
  1111. .type = SWITCH_TYPE_INT,
  1112. .name = "tr_good",
  1113. .description = "Transmit good packet counter. rt5350 only",
  1114. .id = RT5350_ESW_ATTR_PORT_TR_GOOD,
  1115. .get = esw_get_port_tr_badgood,
  1116. },
  1117. };
  1118. static const struct switch_attr esw_vlan[] = {
  1119. };
  1120. static const struct switch_dev_ops esw_ops = {
  1121. .attr_global = {
  1122. .attr = esw_global,
  1123. .n_attr = ARRAY_SIZE(esw_global),
  1124. },
  1125. .attr_port = {
  1126. .attr = esw_port,
  1127. .n_attr = ARRAY_SIZE(esw_port),
  1128. },
  1129. .attr_vlan = {
  1130. .attr = esw_vlan,
  1131. .n_attr = ARRAY_SIZE(esw_vlan),
  1132. },
  1133. .get_vlan_ports = esw_get_vlan_ports,
  1134. .set_vlan_ports = esw_set_vlan_ports,
  1135. .get_port_pvid = esw_get_port_pvid,
  1136. .set_port_pvid = esw_set_port_pvid,
  1137. .get_port_link = esw_get_port_link,
  1138. .apply_config = esw_apply_config,
  1139. .reset_switch = esw_reset_switch,
  1140. };
  1141. static int esw_probe(struct platform_device *pdev)
  1142. {
  1143. struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1144. struct device_node *np = pdev->dev.of_node;
  1145. const __be32 *port_map, *port_disable, *reg_init;
  1146. struct switch_dev *swdev;
  1147. struct rt305x_esw *esw;
  1148. int ret;
  1149. esw = devm_kzalloc(&pdev->dev, sizeof(*esw), GFP_KERNEL);
  1150. if (!esw)
  1151. return -ENOMEM;
  1152. esw->dev = &pdev->dev;
  1153. esw->irq = irq_of_parse_and_map(np, 0);
  1154. esw->base = devm_ioremap_resource(&pdev->dev, res);
  1155. if (IS_ERR(esw->base))
  1156. return PTR_ERR(esw->base);
  1157. port_map = of_get_property(np, "mediatek,portmap", NULL);
  1158. if (port_map)
  1159. esw->port_map = be32_to_cpu(*port_map);
  1160. port_disable = of_get_property(np, "mediatek,portdisable", NULL);
  1161. if (port_disable)
  1162. esw->port_disable = be32_to_cpu(*port_disable);
  1163. reg_init = of_get_property(np, "ralink,fct2", NULL);
  1164. if (reg_init)
  1165. esw->reg_initval_fct2 = be32_to_cpu(*reg_init);
  1166. reg_init = of_get_property(np, "ralink,fpa2", NULL);
  1167. if (reg_init)
  1168. esw->reg_initval_fpa2 = be32_to_cpu(*reg_init);
  1169. reg_init = of_get_property(np, "mediatek,led_polarity", NULL);
  1170. if (reg_init)
  1171. esw->reg_led_polarity = be32_to_cpu(*reg_init);
  1172. swdev = &esw->swdev;
  1173. swdev->of_node = pdev->dev.of_node;
  1174. swdev->name = "rt305x-esw";
  1175. swdev->alias = "rt305x";
  1176. swdev->cpu_port = RT305X_ESW_PORT6;
  1177. swdev->ports = RT305X_ESW_NUM_PORTS;
  1178. swdev->vlans = RT305X_ESW_NUM_VIDS;
  1179. swdev->ops = &esw_ops;
  1180. ret = register_switch(swdev, NULL);
  1181. if (ret < 0) {
  1182. dev_err(&pdev->dev, "register_switch failed\n");
  1183. return ret;
  1184. }
  1185. platform_set_drvdata(pdev, esw);
  1186. spin_lock_init(&esw->reg_rw_lock);
  1187. esw_hw_init(esw);
  1188. reg_init = of_get_property(np, "ralink,rgmii", NULL);
  1189. if (reg_init && be32_to_cpu(*reg_init) == 1) {
  1190. /*
  1191. * External switch connected to RGMII interface.
  1192. * Unregister the switch device after initialization.
  1193. */
  1194. dev_err(&pdev->dev, "RGMII mode, not exporting switch device.\n");
  1195. unregister_switch(&esw->swdev);
  1196. platform_set_drvdata(pdev, NULL);
  1197. return -ENODEV;
  1198. }
  1199. ret = devm_request_irq(&pdev->dev, esw->irq, esw_interrupt, 0, "esw",
  1200. esw);
  1201. if (!ret) {
  1202. esw_w32(esw, RT305X_ESW_PORT_ST_CHG, RT305X_ESW_REG_ISR);
  1203. esw_w32(esw, ~RT305X_ESW_PORT_ST_CHG, RT305X_ESW_REG_IMR);
  1204. }
  1205. return ret;
  1206. }
  1207. static int esw_remove(struct platform_device *pdev)
  1208. {
  1209. struct rt305x_esw *esw = platform_get_drvdata(pdev);
  1210. if (esw) {
  1211. esw_w32(esw, ~0, RT305X_ESW_REG_IMR);
  1212. platform_set_drvdata(pdev, NULL);
  1213. }
  1214. return 0;
  1215. }
  1216. static const struct of_device_id ralink_esw_match[] = {
  1217. { .compatible = "ralink,rt3050-esw" },
  1218. {},
  1219. };
  1220. MODULE_DEVICE_TABLE(of, ralink_esw_match);
  1221. static struct platform_driver esw_driver = {
  1222. .probe = esw_probe,
  1223. .remove = esw_remove,
  1224. .driver = {
  1225. .name = "rt3050-esw",
  1226. .owner = THIS_MODULE,
  1227. .of_match_table = ralink_esw_match,
  1228. },
  1229. };
  1230. module_platform_driver(esw_driver);
  1231. MODULE_LICENSE("GPL");
  1232. MODULE_AUTHOR("John Crispin <[email protected]>");
  1233. MODULE_DESCRIPTION("Switch driver for RT305X SoC");
  1234. MODULE_VERSION(MTK_FE_DRV_VERSION);