esw_rt3050.c 40 KB

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