b53_common.c 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730
  1. /*
  2. * B53 switch driver main logic
  3. *
  4. * Copyright (C) 2011-2013 Jonas Gorski <[email protected]>
  5. *
  6. * Permission to use, copy, modify, and/or distribute this software for any
  7. * purpose with or without fee is hereby granted, provided that the above
  8. * copyright notice and this permission notice appear in all copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  11. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  12. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  13. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  14. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  15. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  16. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  19. #include <linux/delay.h>
  20. #include <linux/export.h>
  21. #include <linux/gpio.h>
  22. #include <linux/kernel.h>
  23. #include <linux/module.h>
  24. #include <linux/switch.h>
  25. #include <linux/phy.h>
  26. #include <linux/of.h>
  27. #include <linux/of_net.h>
  28. #include <linux/platform_data/b53.h>
  29. #include "b53_regs.h"
  30. #include "b53_priv.h"
  31. /* buffer size needed for displaying all MIBs with max'd values */
  32. #define B53_BUF_SIZE 1188
  33. struct b53_mib_desc {
  34. u8 size;
  35. u8 offset;
  36. const char *name;
  37. };
  38. /* BCM5365 MIB counters */
  39. static const struct b53_mib_desc b53_mibs_65[] = {
  40. { 8, 0x00, "TxOctets" },
  41. { 4, 0x08, "TxDropPkts" },
  42. { 4, 0x10, "TxBroadcastPkts" },
  43. { 4, 0x14, "TxMulticastPkts" },
  44. { 4, 0x18, "TxUnicastPkts" },
  45. { 4, 0x1c, "TxCollisions" },
  46. { 4, 0x20, "TxSingleCollision" },
  47. { 4, 0x24, "TxMultipleCollision" },
  48. { 4, 0x28, "TxDeferredTransmit" },
  49. { 4, 0x2c, "TxLateCollision" },
  50. { 4, 0x30, "TxExcessiveCollision" },
  51. { 4, 0x38, "TxPausePkts" },
  52. { 8, 0x44, "RxOctets" },
  53. { 4, 0x4c, "RxUndersizePkts" },
  54. { 4, 0x50, "RxPausePkts" },
  55. { 4, 0x54, "Pkts64Octets" },
  56. { 4, 0x58, "Pkts65to127Octets" },
  57. { 4, 0x5c, "Pkts128to255Octets" },
  58. { 4, 0x60, "Pkts256to511Octets" },
  59. { 4, 0x64, "Pkts512to1023Octets" },
  60. { 4, 0x68, "Pkts1024to1522Octets" },
  61. { 4, 0x6c, "RxOversizePkts" },
  62. { 4, 0x70, "RxJabbers" },
  63. { 4, 0x74, "RxAlignmentErrors" },
  64. { 4, 0x78, "RxFCSErrors" },
  65. { 8, 0x7c, "RxGoodOctets" },
  66. { 4, 0x84, "RxDropPkts" },
  67. { 4, 0x88, "RxUnicastPkts" },
  68. { 4, 0x8c, "RxMulticastPkts" },
  69. { 4, 0x90, "RxBroadcastPkts" },
  70. { 4, 0x94, "RxSAChanges" },
  71. { 4, 0x98, "RxFragments" },
  72. { },
  73. };
  74. #define B63XX_MIB_TXB_ID 0 /* TxOctets */
  75. #define B63XX_MIB_RXB_ID 14 /* RxOctets */
  76. /* BCM63xx MIB counters */
  77. static const struct b53_mib_desc b53_mibs_63xx[] = {
  78. { 8, 0x00, "TxOctets" },
  79. { 4, 0x08, "TxDropPkts" },
  80. { 4, 0x0c, "TxQoSPkts" },
  81. { 4, 0x10, "TxBroadcastPkts" },
  82. { 4, 0x14, "TxMulticastPkts" },
  83. { 4, 0x18, "TxUnicastPkts" },
  84. { 4, 0x1c, "TxCollisions" },
  85. { 4, 0x20, "TxSingleCollision" },
  86. { 4, 0x24, "TxMultipleCollision" },
  87. { 4, 0x28, "TxDeferredTransmit" },
  88. { 4, 0x2c, "TxLateCollision" },
  89. { 4, 0x30, "TxExcessiveCollision" },
  90. { 4, 0x38, "TxPausePkts" },
  91. { 8, 0x3c, "TxQoSOctets" },
  92. { 8, 0x44, "RxOctets" },
  93. { 4, 0x4c, "RxUndersizePkts" },
  94. { 4, 0x50, "RxPausePkts" },
  95. { 4, 0x54, "Pkts64Octets" },
  96. { 4, 0x58, "Pkts65to127Octets" },
  97. { 4, 0x5c, "Pkts128to255Octets" },
  98. { 4, 0x60, "Pkts256to511Octets" },
  99. { 4, 0x64, "Pkts512to1023Octets" },
  100. { 4, 0x68, "Pkts1024to1522Octets" },
  101. { 4, 0x6c, "RxOversizePkts" },
  102. { 4, 0x70, "RxJabbers" },
  103. { 4, 0x74, "RxAlignmentErrors" },
  104. { 4, 0x78, "RxFCSErrors" },
  105. { 8, 0x7c, "RxGoodOctets" },
  106. { 4, 0x84, "RxDropPkts" },
  107. { 4, 0x88, "RxUnicastPkts" },
  108. { 4, 0x8c, "RxMulticastPkts" },
  109. { 4, 0x90, "RxBroadcastPkts" },
  110. { 4, 0x94, "RxSAChanges" },
  111. { 4, 0x98, "RxFragments" },
  112. { 4, 0xa0, "RxSymbolErrors" },
  113. { 4, 0xa4, "RxQoSPkts" },
  114. { 8, 0xa8, "RxQoSOctets" },
  115. { 4, 0xb0, "Pkts1523to2047Octets" },
  116. { 4, 0xb4, "Pkts2048to4095Octets" },
  117. { 4, 0xb8, "Pkts4096to8191Octets" },
  118. { 4, 0xbc, "Pkts8192to9728Octets" },
  119. { 4, 0xc0, "RxDiscarded" },
  120. { }
  121. };
  122. #define B53XX_MIB_TXB_ID 0 /* TxOctets */
  123. #define B53XX_MIB_RXB_ID 12 /* RxOctets */
  124. /* MIB counters */
  125. static const struct b53_mib_desc b53_mibs[] = {
  126. { 8, 0x00, "TxOctets" },
  127. { 4, 0x08, "TxDropPkts" },
  128. { 4, 0x10, "TxBroadcastPkts" },
  129. { 4, 0x14, "TxMulticastPkts" },
  130. { 4, 0x18, "TxUnicastPkts" },
  131. { 4, 0x1c, "TxCollisions" },
  132. { 4, 0x20, "TxSingleCollision" },
  133. { 4, 0x24, "TxMultipleCollision" },
  134. { 4, 0x28, "TxDeferredTransmit" },
  135. { 4, 0x2c, "TxLateCollision" },
  136. { 4, 0x30, "TxExcessiveCollision" },
  137. { 4, 0x38, "TxPausePkts" },
  138. { 8, 0x50, "RxOctets" },
  139. { 4, 0x58, "RxUndersizePkts" },
  140. { 4, 0x5c, "RxPausePkts" },
  141. { 4, 0x60, "Pkts64Octets" },
  142. { 4, 0x64, "Pkts65to127Octets" },
  143. { 4, 0x68, "Pkts128to255Octets" },
  144. { 4, 0x6c, "Pkts256to511Octets" },
  145. { 4, 0x70, "Pkts512to1023Octets" },
  146. { 4, 0x74, "Pkts1024to1522Octets" },
  147. { 4, 0x78, "RxOversizePkts" },
  148. { 4, 0x7c, "RxJabbers" },
  149. { 4, 0x80, "RxAlignmentErrors" },
  150. { 4, 0x84, "RxFCSErrors" },
  151. { 8, 0x88, "RxGoodOctets" },
  152. { 4, 0x90, "RxDropPkts" },
  153. { 4, 0x94, "RxUnicastPkts" },
  154. { 4, 0x98, "RxMulticastPkts" },
  155. { 4, 0x9c, "RxBroadcastPkts" },
  156. { 4, 0xa0, "RxSAChanges" },
  157. { 4, 0xa4, "RxFragments" },
  158. { 4, 0xa8, "RxJumboPkts" },
  159. { 4, 0xac, "RxSymbolErrors" },
  160. { 4, 0xc0, "RxDiscarded" },
  161. { }
  162. };
  163. static int b53_do_vlan_op(struct b53_device *dev, u8 op)
  164. {
  165. unsigned int i;
  166. b53_write8(dev, B53_ARLIO_PAGE, dev->vta_regs[0], VTA_START_CMD | op);
  167. for (i = 0; i < 10; i++) {
  168. u8 vta;
  169. b53_read8(dev, B53_ARLIO_PAGE, dev->vta_regs[0], &vta);
  170. if (!(vta & VTA_START_CMD))
  171. return 0;
  172. usleep_range(100, 200);
  173. }
  174. return -EIO;
  175. }
  176. static void b53_set_vlan_entry(struct b53_device *dev, u16 vid, u16 members,
  177. u16 untag)
  178. {
  179. if (is5325(dev)) {
  180. u32 entry = 0;
  181. if (members) {
  182. entry = ((untag & VA_UNTAG_MASK_25) << VA_UNTAG_S_25) |
  183. members;
  184. if (dev->core_rev >= 3)
  185. entry |= VA_VALID_25_R4 | vid << VA_VID_HIGH_S;
  186. else
  187. entry |= VA_VALID_25;
  188. }
  189. b53_write32(dev, B53_VLAN_PAGE, B53_VLAN_WRITE_25, entry);
  190. b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, vid |
  191. VTA_RW_STATE_WR | VTA_RW_OP_EN);
  192. } else if (is5365(dev)) {
  193. u16 entry = 0;
  194. if (members)
  195. entry = ((untag & VA_UNTAG_MASK_65) << VA_UNTAG_S_65) |
  196. members | VA_VALID_65;
  197. b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_WRITE_65, entry);
  198. b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_65, vid |
  199. VTA_RW_STATE_WR | VTA_RW_OP_EN);
  200. } else {
  201. b53_write16(dev, B53_ARLIO_PAGE, dev->vta_regs[1], vid);
  202. b53_write32(dev, B53_ARLIO_PAGE, dev->vta_regs[2],
  203. (untag << VTE_UNTAG_S) | members);
  204. b53_do_vlan_op(dev, VTA_CMD_WRITE);
  205. }
  206. }
  207. void b53_set_forwarding(struct b53_device *dev, int enable)
  208. {
  209. u8 mgmt;
  210. b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, &mgmt);
  211. if (enable)
  212. mgmt |= SM_SW_FWD_EN;
  213. else
  214. mgmt &= ~SM_SW_FWD_EN;
  215. b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt);
  216. }
  217. static void b53_enable_vlan(struct b53_device *dev, int enable)
  218. {
  219. u8 mgmt, vc0, vc1, vc4 = 0, vc5;
  220. b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, &mgmt);
  221. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL0, &vc0);
  222. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL1, &vc1);
  223. if (is5325(dev) || is5365(dev)) {
  224. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL4_25, &vc4);
  225. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5_25, &vc5);
  226. } else if (is63xx(dev)) {
  227. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL4_63XX, &vc4);
  228. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5_63XX, &vc5);
  229. } else {
  230. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL4, &vc4);
  231. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5, &vc5);
  232. }
  233. mgmt &= ~SM_SW_FWD_MODE;
  234. if (enable) {
  235. vc0 |= VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID;
  236. vc1 |= VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN;
  237. vc4 &= ~VC4_ING_VID_CHECK_MASK;
  238. vc4 |= VC4_ING_VID_VIO_DROP << VC4_ING_VID_CHECK_S;
  239. vc5 |= VC5_DROP_VTABLE_MISS;
  240. if (is5325(dev))
  241. vc0 &= ~VC0_RESERVED_1;
  242. if (is5325(dev) || is5365(dev))
  243. vc1 |= VC1_RX_MCST_TAG_EN;
  244. if (!is5325(dev) && !is5365(dev)) {
  245. if (dev->allow_vid_4095)
  246. vc5 |= VC5_VID_FFF_EN;
  247. else
  248. vc5 &= ~VC5_VID_FFF_EN;
  249. }
  250. } else {
  251. vc0 &= ~(VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID);
  252. vc1 &= ~(VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN);
  253. vc4 &= ~VC4_ING_VID_CHECK_MASK;
  254. vc5 &= ~VC5_DROP_VTABLE_MISS;
  255. if (is5325(dev) || is5365(dev))
  256. vc4 |= VC4_ING_VID_VIO_FWD << VC4_ING_VID_CHECK_S;
  257. else
  258. vc4 |= VC4_ING_VID_VIO_TO_IMP << VC4_ING_VID_CHECK_S;
  259. if (is5325(dev) || is5365(dev))
  260. vc1 &= ~VC1_RX_MCST_TAG_EN;
  261. if (!is5325(dev) && !is5365(dev))
  262. vc5 &= ~VC5_VID_FFF_EN;
  263. }
  264. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL0, vc0);
  265. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL1, vc1);
  266. if (is5325(dev) || is5365(dev)) {
  267. /* enable the high 8 bit vid check on 5325 */
  268. if (is5325(dev) && enable)
  269. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL3,
  270. VC3_HIGH_8BIT_EN);
  271. else
  272. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL3, 0);
  273. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL4_25, vc4);
  274. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5_25, vc5);
  275. } else if (is63xx(dev)) {
  276. b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_CTRL3_63XX, 0);
  277. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL4_63XX, vc4);
  278. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5_63XX, vc5);
  279. } else {
  280. b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_CTRL3, 0);
  281. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL4, vc4);
  282. b53_write8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5, vc5);
  283. }
  284. b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt);
  285. }
  286. static int b53_set_jumbo(struct b53_device *dev, int enable, int allow_10_100)
  287. {
  288. u32 port_mask = 0;
  289. u16 max_size = JMS_MIN_SIZE;
  290. if (is5325(dev) || is5365(dev))
  291. return -EINVAL;
  292. if (enable) {
  293. port_mask = dev->enabled_ports;
  294. max_size = JMS_MAX_SIZE;
  295. if (allow_10_100)
  296. port_mask |= JPM_10_100_JUMBO_EN;
  297. }
  298. b53_write32(dev, B53_JUMBO_PAGE, dev->jumbo_pm_reg, port_mask);
  299. return b53_write16(dev, B53_JUMBO_PAGE, dev->jumbo_size_reg, max_size);
  300. }
  301. static int b53_flush_arl(struct b53_device *dev)
  302. {
  303. unsigned int i;
  304. b53_write8(dev, B53_CTRL_PAGE, B53_FAST_AGE_CTRL,
  305. FAST_AGE_DONE | FAST_AGE_DYNAMIC | FAST_AGE_STATIC);
  306. for (i = 0; i < 10; i++) {
  307. u8 fast_age_ctrl;
  308. b53_read8(dev, B53_CTRL_PAGE, B53_FAST_AGE_CTRL,
  309. &fast_age_ctrl);
  310. if (!(fast_age_ctrl & FAST_AGE_DONE))
  311. return 0;
  312. mdelay(1);
  313. }
  314. pr_warn("time out while flushing ARL\n");
  315. return -EINVAL;
  316. }
  317. static void b53_enable_ports(struct b53_device *dev)
  318. {
  319. unsigned i;
  320. b53_for_each_port(dev, i) {
  321. u8 port_ctrl;
  322. u16 pvlan_mask;
  323. /*
  324. * prevent leaking packets between wan and lan in unmanaged
  325. * mode through port vlans.
  326. */
  327. if (dev->enable_vlan || is_cpu_port(dev, i))
  328. pvlan_mask = 0x1ff;
  329. else if (is531x5(dev) || is5301x(dev))
  330. /* BCM53115 may use a different port as cpu port */
  331. pvlan_mask = BIT(dev->sw_dev.cpu_port);
  332. else
  333. pvlan_mask = BIT(B53_CPU_PORT);
  334. /* BCM5325 CPU port is at 8 */
  335. if ((is5325(dev) || is5365(dev)) && i == B53_CPU_PORT_25)
  336. i = B53_CPU_PORT;
  337. if (dev->chip_id == BCM5398_DEVICE_ID && (i == 6 || i == 7))
  338. /* disable unused ports 6 & 7 */
  339. port_ctrl = PORT_CTRL_RX_DISABLE | PORT_CTRL_TX_DISABLE;
  340. else if (i == B53_CPU_PORT)
  341. port_ctrl = PORT_CTRL_RX_BCST_EN |
  342. PORT_CTRL_RX_MCST_EN |
  343. PORT_CTRL_RX_UCST_EN;
  344. else
  345. port_ctrl = 0;
  346. b53_write16(dev, B53_PVLAN_PAGE, B53_PVLAN_PORT_MASK(i),
  347. pvlan_mask);
  348. /* port state is handled by bcm63xx_enet driver */
  349. if (!is63xx(dev) && !(is5301x(dev) && i == 6))
  350. b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(i),
  351. port_ctrl);
  352. }
  353. }
  354. static void b53_enable_mib(struct b53_device *dev)
  355. {
  356. u8 gc;
  357. b53_read8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, &gc);
  358. gc &= ~(GC_RESET_MIB | GC_MIB_AC_EN);
  359. b53_write8(dev, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc);
  360. }
  361. static int b53_apply(struct b53_device *dev)
  362. {
  363. int i;
  364. /* clear all vlan entries */
  365. if (is5325(dev) || is5365(dev)) {
  366. for (i = 1; i < dev->sw_dev.vlans; i++)
  367. b53_set_vlan_entry(dev, i, 0, 0);
  368. } else {
  369. b53_do_vlan_op(dev, VTA_CMD_CLEAR);
  370. }
  371. b53_enable_vlan(dev, dev->enable_vlan);
  372. /* fill VLAN table */
  373. if (dev->enable_vlan) {
  374. for (i = 0; i < dev->sw_dev.vlans; i++) {
  375. struct b53_vlan *vlan = &dev->vlans[i];
  376. if (!vlan->members)
  377. continue;
  378. b53_set_vlan_entry(dev, i, vlan->members, vlan->untag);
  379. }
  380. b53_for_each_port(dev, i)
  381. b53_write16(dev, B53_VLAN_PAGE,
  382. B53_VLAN_PORT_DEF_TAG(i),
  383. dev->ports[i].pvid);
  384. } else {
  385. b53_for_each_port(dev, i)
  386. b53_write16(dev, B53_VLAN_PAGE,
  387. B53_VLAN_PORT_DEF_TAG(i), 1);
  388. }
  389. b53_enable_ports(dev);
  390. if (!is5325(dev) && !is5365(dev))
  391. b53_set_jumbo(dev, dev->enable_jumbo, 1);
  392. return 0;
  393. }
  394. static void b53_switch_reset_gpio(struct b53_device *dev)
  395. {
  396. int gpio = dev->reset_gpio;
  397. if (gpio < 0)
  398. return;
  399. /*
  400. * Reset sequence: RESET low(50ms)->high(20ms)
  401. */
  402. gpio_set_value(gpio, 0);
  403. mdelay(50);
  404. gpio_set_value(gpio, 1);
  405. mdelay(20);
  406. dev->current_page = 0xff;
  407. }
  408. static int b53_configure_ports_of(struct b53_device *dev)
  409. {
  410. struct device_node *dn, *pn;
  411. u32 port_num;
  412. dn = of_get_child_by_name(dev_of_node(dev->dev), "ports");
  413. for_each_available_child_of_node(dn, pn) {
  414. struct device_node *fixed_link;
  415. if (of_property_read_u32(pn, "reg", &port_num))
  416. continue;
  417. if (port_num > B53_CPU_PORT)
  418. continue;
  419. fixed_link = of_get_child_by_name(pn, "fixed-link");
  420. if (fixed_link) {
  421. u32 spd;
  422. u8 po = GMII_PO_LINK;
  423. #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0)
  424. phy_interface_t mode;
  425. #else
  426. int mode = of_get_phy_mode(pn);
  427. #endif
  428. #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0)
  429. of_get_phy_mode(pn, &mode);
  430. #endif
  431. if (!of_property_read_u32(fixed_link, "speed", &spd)) {
  432. switch (spd) {
  433. case 10:
  434. po |= GMII_PO_SPEED_10M;
  435. break;
  436. case 100:
  437. po |= GMII_PO_SPEED_100M;
  438. break;
  439. case 2000:
  440. if (is_imp_port(dev, port_num))
  441. po |= PORT_OVERRIDE_SPEED_2000M;
  442. else
  443. po |= GMII_PO_SPEED_2000M;
  444. fallthrough;
  445. case 1000:
  446. po |= GMII_PO_SPEED_1000M;
  447. break;
  448. }
  449. }
  450. if (of_property_read_bool(fixed_link, "full-duplex"))
  451. po |= PORT_OVERRIDE_FULL_DUPLEX;
  452. if (of_property_read_bool(fixed_link, "pause"))
  453. po |= GMII_PO_RX_FLOW;
  454. if (of_property_read_bool(fixed_link, "asym-pause"))
  455. po |= GMII_PO_TX_FLOW;
  456. if (is_imp_port(dev, port_num)) {
  457. po |= PORT_OVERRIDE_EN;
  458. if (is5325(dev) &&
  459. mode == PHY_INTERFACE_MODE_REVMII)
  460. po |= PORT_OVERRIDE_RV_MII_25;
  461. b53_write8(dev, B53_CTRL_PAGE,
  462. B53_PORT_OVERRIDE_CTRL, po);
  463. if (is5325(dev) &&
  464. mode == PHY_INTERFACE_MODE_REVMII) {
  465. b53_read8(dev, B53_CTRL_PAGE,
  466. B53_PORT_OVERRIDE_CTRL, &po);
  467. if (!(po & PORT_OVERRIDE_RV_MII_25))
  468. pr_err("Failed to enable reverse MII mode\n");
  469. return -EINVAL;
  470. }
  471. } else {
  472. po |= GMII_PO_EN;
  473. b53_write8(dev, B53_CTRL_PAGE,
  474. B53_GMII_PORT_OVERRIDE_CTRL(port_num),
  475. po);
  476. }
  477. }
  478. }
  479. return 0;
  480. }
  481. static int b53_configure_ports(struct b53_device *dev)
  482. {
  483. u8 cpu_port = dev->sw_dev.cpu_port;
  484. /* configure MII port if necessary */
  485. if (is5325(dev)) {
  486. u8 mii_port_override;
  487. b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  488. &mii_port_override);
  489. /* reverse mii needs to be enabled */
  490. if (!(mii_port_override & PORT_OVERRIDE_RV_MII_25)) {
  491. b53_write8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  492. mii_port_override | PORT_OVERRIDE_RV_MII_25);
  493. b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  494. &mii_port_override);
  495. if (!(mii_port_override & PORT_OVERRIDE_RV_MII_25)) {
  496. pr_err("Failed to enable reverse MII mode\n");
  497. return -EINVAL;
  498. }
  499. }
  500. } else if (is531x5(dev) && cpu_port == B53_CPU_PORT) {
  501. u8 mii_port_override;
  502. b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  503. &mii_port_override);
  504. b53_write8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  505. mii_port_override | PORT_OVERRIDE_EN |
  506. PORT_OVERRIDE_LINK);
  507. /* BCM47189 has another interface connected to the port 5 */
  508. if (dev->enabled_ports & BIT(5)) {
  509. u8 po_reg = B53_GMII_PORT_OVERRIDE_CTRL(5);
  510. u8 gmii_po;
  511. b53_read8(dev, B53_CTRL_PAGE, po_reg, &gmii_po);
  512. gmii_po |= GMII_PO_LINK |
  513. GMII_PO_RX_FLOW |
  514. GMII_PO_TX_FLOW |
  515. GMII_PO_EN;
  516. b53_write8(dev, B53_CTRL_PAGE, po_reg, gmii_po);
  517. }
  518. } else if (is5301x(dev)) {
  519. if (cpu_port == 8) {
  520. u8 mii_port_override;
  521. b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  522. &mii_port_override);
  523. mii_port_override |= PORT_OVERRIDE_LINK |
  524. PORT_OVERRIDE_RX_FLOW |
  525. PORT_OVERRIDE_TX_FLOW |
  526. PORT_OVERRIDE_SPEED_2000M |
  527. PORT_OVERRIDE_EN;
  528. b53_write8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  529. mii_port_override);
  530. /* TODO: Ports 5 & 7 require some extra handling */
  531. } else {
  532. u8 po_reg = B53_GMII_PORT_OVERRIDE_CTRL(cpu_port);
  533. u8 gmii_po;
  534. b53_read8(dev, B53_CTRL_PAGE, po_reg, &gmii_po);
  535. gmii_po |= GMII_PO_LINK |
  536. GMII_PO_RX_FLOW |
  537. GMII_PO_TX_FLOW |
  538. GMII_PO_EN |
  539. GMII_PO_SPEED_2000M;
  540. b53_write8(dev, B53_CTRL_PAGE, po_reg, gmii_po);
  541. }
  542. }
  543. return 0;
  544. }
  545. static int b53_switch_reset(struct b53_device *dev)
  546. {
  547. int ret = 0;
  548. u8 mgmt;
  549. b53_switch_reset_gpio(dev);
  550. if (is539x(dev)) {
  551. b53_write8(dev, B53_CTRL_PAGE, B53_SOFTRESET, 0x83);
  552. b53_write8(dev, B53_CTRL_PAGE, B53_SOFTRESET, 0x00);
  553. }
  554. b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, &mgmt);
  555. if (!(mgmt & SM_SW_FWD_EN)) {
  556. mgmt &= ~SM_SW_FWD_MODE;
  557. mgmt |= SM_SW_FWD_EN;
  558. b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt);
  559. b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, &mgmt);
  560. if (!(mgmt & SM_SW_FWD_EN)) {
  561. pr_err("Failed to enable switch!\n");
  562. return -EINVAL;
  563. }
  564. }
  565. /* enable all ports */
  566. b53_enable_ports(dev);
  567. if (dev->dev->of_node)
  568. ret = b53_configure_ports_of(dev);
  569. else
  570. ret = b53_configure_ports(dev);
  571. if (ret)
  572. return ret;
  573. b53_enable_mib(dev);
  574. return b53_flush_arl(dev);
  575. }
  576. /*
  577. * Swconfig glue functions
  578. */
  579. static int b53_global_get_vlan_enable(struct switch_dev *dev,
  580. const struct switch_attr *attr,
  581. struct switch_val *val)
  582. {
  583. struct b53_device *priv = sw_to_b53(dev);
  584. val->value.i = priv->enable_vlan;
  585. return 0;
  586. }
  587. static int b53_global_set_vlan_enable(struct switch_dev *dev,
  588. const struct switch_attr *attr,
  589. struct switch_val *val)
  590. {
  591. struct b53_device *priv = sw_to_b53(dev);
  592. priv->enable_vlan = val->value.i;
  593. return 0;
  594. }
  595. static int b53_global_get_jumbo_enable(struct switch_dev *dev,
  596. const struct switch_attr *attr,
  597. struct switch_val *val)
  598. {
  599. struct b53_device *priv = sw_to_b53(dev);
  600. val->value.i = priv->enable_jumbo;
  601. return 0;
  602. }
  603. static int b53_global_set_jumbo_enable(struct switch_dev *dev,
  604. const struct switch_attr *attr,
  605. struct switch_val *val)
  606. {
  607. struct b53_device *priv = sw_to_b53(dev);
  608. priv->enable_jumbo = val->value.i;
  609. return 0;
  610. }
  611. static int b53_global_get_4095_enable(struct switch_dev *dev,
  612. const struct switch_attr *attr,
  613. struct switch_val *val)
  614. {
  615. struct b53_device *priv = sw_to_b53(dev);
  616. val->value.i = priv->allow_vid_4095;
  617. return 0;
  618. }
  619. static int b53_global_set_4095_enable(struct switch_dev *dev,
  620. const struct switch_attr *attr,
  621. struct switch_val *val)
  622. {
  623. struct b53_device *priv = sw_to_b53(dev);
  624. priv->allow_vid_4095 = val->value.i;
  625. return 0;
  626. }
  627. static int b53_global_get_ports(struct switch_dev *dev,
  628. const struct switch_attr *attr,
  629. struct switch_val *val)
  630. {
  631. struct b53_device *priv = sw_to_b53(dev);
  632. val->len = snprintf(priv->buf, B53_BUF_SIZE, "0x%04x",
  633. priv->enabled_ports);
  634. val->value.s = priv->buf;
  635. return 0;
  636. }
  637. static int b53_port_get_pvid(struct switch_dev *dev, int port, int *val)
  638. {
  639. struct b53_device *priv = sw_to_b53(dev);
  640. *val = priv->ports[port].pvid;
  641. return 0;
  642. }
  643. static int b53_port_set_pvid(struct switch_dev *dev, int port, int val)
  644. {
  645. struct b53_device *priv = sw_to_b53(dev);
  646. if (val > 15 && is5325(priv))
  647. return -EINVAL;
  648. if (val == 4095 && !priv->allow_vid_4095)
  649. return -EINVAL;
  650. priv->ports[port].pvid = val;
  651. return 0;
  652. }
  653. static int b53_vlan_get_ports(struct switch_dev *dev, struct switch_val *val)
  654. {
  655. struct b53_device *priv = sw_to_b53(dev);
  656. struct switch_port *port = &val->value.ports[0];
  657. struct b53_vlan *vlan = &priv->vlans[val->port_vlan];
  658. int i;
  659. val->len = 0;
  660. if (!vlan->members)
  661. return 0;
  662. for (i = 0; i < dev->ports; i++) {
  663. if (!(vlan->members & BIT(i)))
  664. continue;
  665. if (!(vlan->untag & BIT(i)))
  666. port->flags = BIT(SWITCH_PORT_FLAG_TAGGED);
  667. else
  668. port->flags = 0;
  669. port->id = i;
  670. val->len++;
  671. port++;
  672. }
  673. return 0;
  674. }
  675. static int b53_vlan_set_ports(struct switch_dev *dev, struct switch_val *val)
  676. {
  677. struct b53_device *priv = sw_to_b53(dev);
  678. struct switch_port *port;
  679. struct b53_vlan *vlan = &priv->vlans[val->port_vlan];
  680. int i;
  681. /* only BCM5325 and BCM5365 supports VID 0 */
  682. if (val->port_vlan == 0 && !is5325(priv) && !is5365(priv))
  683. return -EINVAL;
  684. /* VLAN 4095 needs special handling */
  685. if (val->port_vlan == 4095 && !priv->allow_vid_4095)
  686. return -EINVAL;
  687. port = &val->value.ports[0];
  688. vlan->members = 0;
  689. vlan->untag = 0;
  690. for (i = 0; i < val->len; i++, port++) {
  691. vlan->members |= BIT(port->id);
  692. if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED))) {
  693. vlan->untag |= BIT(port->id);
  694. priv->ports[port->id].pvid = val->port_vlan;
  695. };
  696. }
  697. /* ignore disabled ports */
  698. vlan->members &= priv->enabled_ports;
  699. vlan->untag &= priv->enabled_ports;
  700. return 0;
  701. }
  702. static int b53_port_get_link(struct switch_dev *dev, int port,
  703. struct switch_port_link *link)
  704. {
  705. struct b53_device *priv = sw_to_b53(dev);
  706. if (is_cpu_port(priv, port)) {
  707. link->link = 1;
  708. link->duplex = 1;
  709. link->speed = is5325(priv) || is5365(priv) ?
  710. SWITCH_PORT_SPEED_100 : SWITCH_PORT_SPEED_1000;
  711. link->aneg = 0;
  712. } else if (priv->enabled_ports & BIT(port)) {
  713. u32 speed;
  714. u16 lnk, duplex;
  715. b53_read16(priv, B53_STAT_PAGE, B53_LINK_STAT, &lnk);
  716. b53_read16(priv, B53_STAT_PAGE, priv->duplex_reg, &duplex);
  717. lnk = (lnk >> port) & 1;
  718. duplex = (duplex >> port) & 1;
  719. if (is5325(priv) || is5365(priv)) {
  720. u16 tmp;
  721. b53_read16(priv, B53_STAT_PAGE, B53_SPEED_STAT, &tmp);
  722. speed = SPEED_PORT_FE(tmp, port);
  723. } else {
  724. b53_read32(priv, B53_STAT_PAGE, B53_SPEED_STAT, &speed);
  725. speed = SPEED_PORT_GE(speed, port);
  726. }
  727. link->link = lnk;
  728. if (lnk) {
  729. link->duplex = duplex;
  730. switch (speed) {
  731. case SPEED_STAT_10M:
  732. link->speed = SWITCH_PORT_SPEED_10;
  733. break;
  734. case SPEED_STAT_100M:
  735. link->speed = SWITCH_PORT_SPEED_100;
  736. break;
  737. case SPEED_STAT_1000M:
  738. link->speed = SWITCH_PORT_SPEED_1000;
  739. break;
  740. }
  741. }
  742. link->aneg = 1;
  743. } else {
  744. link->link = 0;
  745. }
  746. return 0;
  747. }
  748. static int b53_port_set_link(struct switch_dev *sw_dev, int port,
  749. struct switch_port_link *link)
  750. {
  751. struct b53_device *dev = sw_to_b53(sw_dev);
  752. /*
  753. * TODO: BCM63XX requires special handling as it can have external phys
  754. * and ports might be GE or only FE
  755. */
  756. if (is63xx(dev))
  757. return -ENOTSUPP;
  758. if (port == sw_dev->cpu_port)
  759. return -EINVAL;
  760. if (!(BIT(port) & dev->enabled_ports))
  761. return -EINVAL;
  762. if (link->speed == SWITCH_PORT_SPEED_1000 &&
  763. (is5325(dev) || is5365(dev)))
  764. return -EINVAL;
  765. if (link->speed == SWITCH_PORT_SPEED_1000 && !link->duplex)
  766. return -EINVAL;
  767. return switch_generic_set_link(sw_dev, port, link);
  768. }
  769. static int b53_phy_read16(struct switch_dev *dev, int addr, u8 reg, u16 *value)
  770. {
  771. struct b53_device *priv = sw_to_b53(dev);
  772. if (priv->ops->phy_read16)
  773. return priv->ops->phy_read16(priv, addr, reg, value);
  774. return b53_read16(priv, B53_PORT_MII_PAGE(addr), reg, value);
  775. }
  776. static int b53_phy_write16(struct switch_dev *dev, int addr, u8 reg, u16 value)
  777. {
  778. struct b53_device *priv = sw_to_b53(dev);
  779. if (priv->ops->phy_write16)
  780. return priv->ops->phy_write16(priv, addr, reg, value);
  781. return b53_write16(priv, B53_PORT_MII_PAGE(addr), reg, value);
  782. }
  783. static int b53_global_reset_switch(struct switch_dev *dev)
  784. {
  785. struct b53_device *priv = sw_to_b53(dev);
  786. /* reset vlans */
  787. priv->enable_vlan = 0;
  788. priv->enable_jumbo = 0;
  789. priv->allow_vid_4095 = 0;
  790. memset(priv->vlans, 0, sizeof(*priv->vlans) * dev->vlans);
  791. memset(priv->ports, 0, sizeof(*priv->ports) * dev->ports);
  792. return b53_switch_reset(priv);
  793. }
  794. static int b53_global_apply_config(struct switch_dev *dev)
  795. {
  796. struct b53_device *priv = sw_to_b53(dev);
  797. /* disable switching */
  798. b53_set_forwarding(priv, 0);
  799. b53_apply(priv);
  800. /* enable switching */
  801. b53_set_forwarding(priv, 1);
  802. return 0;
  803. }
  804. static int b53_global_reset_mib(struct switch_dev *dev,
  805. const struct switch_attr *attr,
  806. struct switch_val *val)
  807. {
  808. struct b53_device *priv = sw_to_b53(dev);
  809. u8 gc;
  810. b53_read8(priv, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, &gc);
  811. b53_write8(priv, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc | GC_RESET_MIB);
  812. mdelay(1);
  813. b53_write8(priv, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc & ~GC_RESET_MIB);
  814. mdelay(1);
  815. return 0;
  816. }
  817. static int b53_port_get_mib(struct switch_dev *sw_dev,
  818. const struct switch_attr *attr,
  819. struct switch_val *val)
  820. {
  821. struct b53_device *dev = sw_to_b53(sw_dev);
  822. const struct b53_mib_desc *mibs;
  823. int port = val->port_vlan;
  824. int len = 0;
  825. if (!(BIT(port) & dev->enabled_ports))
  826. return -1;
  827. if (is5365(dev)) {
  828. if (port == 5)
  829. port = 8;
  830. mibs = b53_mibs_65;
  831. } else if (is63xx(dev)) {
  832. mibs = b53_mibs_63xx;
  833. } else {
  834. mibs = b53_mibs;
  835. }
  836. dev->buf[0] = 0;
  837. for (; mibs->size > 0; mibs++) {
  838. u64 val;
  839. if (mibs->size == 8) {
  840. b53_read64(dev, B53_MIB_PAGE(port), mibs->offset, &val);
  841. } else {
  842. u32 val32;
  843. b53_read32(dev, B53_MIB_PAGE(port), mibs->offset,
  844. &val32);
  845. val = val32;
  846. }
  847. len += snprintf(dev->buf + len, B53_BUF_SIZE - len,
  848. "%-20s: %llu\n", mibs->name, val);
  849. }
  850. val->len = len;
  851. val->value.s = dev->buf;
  852. return 0;
  853. }
  854. static int b53_port_get_stats(struct switch_dev *sw_dev, int port,
  855. struct switch_port_stats *stats)
  856. {
  857. struct b53_device *dev = sw_to_b53(sw_dev);
  858. const struct b53_mib_desc *mibs;
  859. int txb_id, rxb_id;
  860. u64 rxb, txb;
  861. if (!(BIT(port) & dev->enabled_ports))
  862. return -EINVAL;
  863. txb_id = B53XX_MIB_TXB_ID;
  864. rxb_id = B53XX_MIB_RXB_ID;
  865. if (is5365(dev)) {
  866. if (port == 5)
  867. port = 8;
  868. mibs = b53_mibs_65;
  869. } else if (is63xx(dev)) {
  870. mibs = b53_mibs_63xx;
  871. txb_id = B63XX_MIB_TXB_ID;
  872. rxb_id = B63XX_MIB_RXB_ID;
  873. } else {
  874. mibs = b53_mibs;
  875. }
  876. dev->buf[0] = 0;
  877. if (mibs->size == 8) {
  878. b53_read64(dev, B53_MIB_PAGE(port), mibs[txb_id].offset, &txb);
  879. b53_read64(dev, B53_MIB_PAGE(port), mibs[rxb_id].offset, &rxb);
  880. } else {
  881. u32 val32;
  882. b53_read32(dev, B53_MIB_PAGE(port), mibs[txb_id].offset, &val32);
  883. txb = val32;
  884. b53_read32(dev, B53_MIB_PAGE(port), mibs[rxb_id].offset, &val32);
  885. rxb = val32;
  886. }
  887. stats->tx_bytes = txb;
  888. stats->rx_bytes = rxb;
  889. return 0;
  890. }
  891. static struct switch_attr b53_global_ops_25[] = {
  892. {
  893. .type = SWITCH_TYPE_INT,
  894. .name = "enable_vlan",
  895. .description = "Enable VLAN mode",
  896. .set = b53_global_set_vlan_enable,
  897. .get = b53_global_get_vlan_enable,
  898. .max = 1,
  899. },
  900. {
  901. .type = SWITCH_TYPE_STRING,
  902. .name = "ports",
  903. .description = "Available ports (as bitmask)",
  904. .get = b53_global_get_ports,
  905. },
  906. };
  907. static struct switch_attr b53_global_ops_65[] = {
  908. {
  909. .type = SWITCH_TYPE_INT,
  910. .name = "enable_vlan",
  911. .description = "Enable VLAN mode",
  912. .set = b53_global_set_vlan_enable,
  913. .get = b53_global_get_vlan_enable,
  914. .max = 1,
  915. },
  916. {
  917. .type = SWITCH_TYPE_STRING,
  918. .name = "ports",
  919. .description = "Available ports (as bitmask)",
  920. .get = b53_global_get_ports,
  921. },
  922. {
  923. .type = SWITCH_TYPE_INT,
  924. .name = "reset_mib",
  925. .description = "Reset MIB counters",
  926. .set = b53_global_reset_mib,
  927. },
  928. };
  929. static struct switch_attr b53_global_ops[] = {
  930. {
  931. .type = SWITCH_TYPE_INT,
  932. .name = "enable_vlan",
  933. .description = "Enable VLAN mode",
  934. .set = b53_global_set_vlan_enable,
  935. .get = b53_global_get_vlan_enable,
  936. .max = 1,
  937. },
  938. {
  939. .type = SWITCH_TYPE_STRING,
  940. .name = "ports",
  941. .description = "Available Ports (as bitmask)",
  942. .get = b53_global_get_ports,
  943. },
  944. {
  945. .type = SWITCH_TYPE_INT,
  946. .name = "reset_mib",
  947. .description = "Reset MIB counters",
  948. .set = b53_global_reset_mib,
  949. },
  950. {
  951. .type = SWITCH_TYPE_INT,
  952. .name = "enable_jumbo",
  953. .description = "Enable Jumbo Frames",
  954. .set = b53_global_set_jumbo_enable,
  955. .get = b53_global_get_jumbo_enable,
  956. .max = 1,
  957. },
  958. {
  959. .type = SWITCH_TYPE_INT,
  960. .name = "allow_vid_4095",
  961. .description = "Allow VID 4095",
  962. .set = b53_global_set_4095_enable,
  963. .get = b53_global_get_4095_enable,
  964. .max = 1,
  965. },
  966. };
  967. static struct switch_attr b53_port_ops[] = {
  968. {
  969. .type = SWITCH_TYPE_STRING,
  970. .name = "mib",
  971. .description = "Get port's MIB counters",
  972. .get = b53_port_get_mib,
  973. },
  974. };
  975. static struct switch_attr b53_no_ops[] = {
  976. };
  977. static const struct switch_dev_ops b53_switch_ops_25 = {
  978. .attr_global = {
  979. .attr = b53_global_ops_25,
  980. .n_attr = ARRAY_SIZE(b53_global_ops_25),
  981. },
  982. .attr_port = {
  983. .attr = b53_no_ops,
  984. .n_attr = ARRAY_SIZE(b53_no_ops),
  985. },
  986. .attr_vlan = {
  987. .attr = b53_no_ops,
  988. .n_attr = ARRAY_SIZE(b53_no_ops),
  989. },
  990. .get_vlan_ports = b53_vlan_get_ports,
  991. .set_vlan_ports = b53_vlan_set_ports,
  992. .get_port_pvid = b53_port_get_pvid,
  993. .set_port_pvid = b53_port_set_pvid,
  994. .apply_config = b53_global_apply_config,
  995. .reset_switch = b53_global_reset_switch,
  996. .get_port_link = b53_port_get_link,
  997. .set_port_link = b53_port_set_link,
  998. .get_port_stats = b53_port_get_stats,
  999. .phy_read16 = b53_phy_read16,
  1000. .phy_write16 = b53_phy_write16,
  1001. };
  1002. static const struct switch_dev_ops b53_switch_ops_65 = {
  1003. .attr_global = {
  1004. .attr = b53_global_ops_65,
  1005. .n_attr = ARRAY_SIZE(b53_global_ops_65),
  1006. },
  1007. .attr_port = {
  1008. .attr = b53_port_ops,
  1009. .n_attr = ARRAY_SIZE(b53_port_ops),
  1010. },
  1011. .attr_vlan = {
  1012. .attr = b53_no_ops,
  1013. .n_attr = ARRAY_SIZE(b53_no_ops),
  1014. },
  1015. .get_vlan_ports = b53_vlan_get_ports,
  1016. .set_vlan_ports = b53_vlan_set_ports,
  1017. .get_port_pvid = b53_port_get_pvid,
  1018. .set_port_pvid = b53_port_set_pvid,
  1019. .apply_config = b53_global_apply_config,
  1020. .reset_switch = b53_global_reset_switch,
  1021. .get_port_link = b53_port_get_link,
  1022. .set_port_link = b53_port_set_link,
  1023. .get_port_stats = b53_port_get_stats,
  1024. .phy_read16 = b53_phy_read16,
  1025. .phy_write16 = b53_phy_write16,
  1026. };
  1027. static const struct switch_dev_ops b53_switch_ops = {
  1028. .attr_global = {
  1029. .attr = b53_global_ops,
  1030. .n_attr = ARRAY_SIZE(b53_global_ops),
  1031. },
  1032. .attr_port = {
  1033. .attr = b53_port_ops,
  1034. .n_attr = ARRAY_SIZE(b53_port_ops),
  1035. },
  1036. .attr_vlan = {
  1037. .attr = b53_no_ops,
  1038. .n_attr = ARRAY_SIZE(b53_no_ops),
  1039. },
  1040. .get_vlan_ports = b53_vlan_get_ports,
  1041. .set_vlan_ports = b53_vlan_set_ports,
  1042. .get_port_pvid = b53_port_get_pvid,
  1043. .set_port_pvid = b53_port_set_pvid,
  1044. .apply_config = b53_global_apply_config,
  1045. .reset_switch = b53_global_reset_switch,
  1046. .get_port_link = b53_port_get_link,
  1047. .set_port_link = b53_port_set_link,
  1048. .get_port_stats = b53_port_get_stats,
  1049. .phy_read16 = b53_phy_read16,
  1050. .phy_write16 = b53_phy_write16,
  1051. };
  1052. struct b53_chip_data {
  1053. u32 chip_id;
  1054. const char *dev_name;
  1055. const char *alias;
  1056. u16 vlans;
  1057. u16 enabled_ports;
  1058. u8 cpu_port;
  1059. u8 vta_regs[3];
  1060. u8 duplex_reg;
  1061. u8 jumbo_pm_reg;
  1062. u8 jumbo_size_reg;
  1063. const struct switch_dev_ops *sw_ops;
  1064. };
  1065. #define B53_VTA_REGS \
  1066. { B53_VT_ACCESS, B53_VT_INDEX, B53_VT_ENTRY }
  1067. #define B53_VTA_REGS_9798 \
  1068. { B53_VT_ACCESS_9798, B53_VT_INDEX_9798, B53_VT_ENTRY_9798 }
  1069. #define B53_VTA_REGS_63XX \
  1070. { B53_VT_ACCESS_63XX, B53_VT_INDEX_63XX, B53_VT_ENTRY_63XX }
  1071. static const struct b53_chip_data b53_switch_chips[] = {
  1072. {
  1073. .chip_id = BCM5325_DEVICE_ID,
  1074. .dev_name = "BCM5325",
  1075. .alias = "bcm5325",
  1076. .vlans = 16,
  1077. .enabled_ports = 0x1f,
  1078. .cpu_port = B53_CPU_PORT_25,
  1079. .duplex_reg = B53_DUPLEX_STAT_FE,
  1080. .sw_ops = &b53_switch_ops_25,
  1081. },
  1082. {
  1083. .chip_id = BCM5365_DEVICE_ID,
  1084. .dev_name = "BCM5365",
  1085. .alias = "bcm5365",
  1086. .vlans = 256,
  1087. .enabled_ports = 0x1f,
  1088. .cpu_port = B53_CPU_PORT_25,
  1089. .duplex_reg = B53_DUPLEX_STAT_FE,
  1090. .sw_ops = &b53_switch_ops_65,
  1091. },
  1092. {
  1093. .chip_id = BCM5395_DEVICE_ID,
  1094. .dev_name = "BCM5395",
  1095. .alias = "bcm5395",
  1096. .vlans = 4096,
  1097. .enabled_ports = 0x1f,
  1098. .cpu_port = B53_CPU_PORT,
  1099. .vta_regs = B53_VTA_REGS,
  1100. .duplex_reg = B53_DUPLEX_STAT_GE,
  1101. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1102. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1103. .sw_ops = &b53_switch_ops,
  1104. },
  1105. {
  1106. .chip_id = BCM5397_DEVICE_ID,
  1107. .dev_name = "BCM5397",
  1108. .alias = "bcm5397",
  1109. .vlans = 4096,
  1110. .enabled_ports = 0x1f,
  1111. .cpu_port = B53_CPU_PORT,
  1112. .vta_regs = B53_VTA_REGS_9798,
  1113. .duplex_reg = B53_DUPLEX_STAT_GE,
  1114. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1115. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1116. .sw_ops = &b53_switch_ops,
  1117. },
  1118. {
  1119. .chip_id = BCM5398_DEVICE_ID,
  1120. .dev_name = "BCM5398",
  1121. .alias = "bcm5398",
  1122. .vlans = 4096,
  1123. .enabled_ports = 0x7f,
  1124. .cpu_port = B53_CPU_PORT,
  1125. .vta_regs = B53_VTA_REGS_9798,
  1126. .duplex_reg = B53_DUPLEX_STAT_GE,
  1127. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1128. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1129. .sw_ops = &b53_switch_ops,
  1130. },
  1131. {
  1132. .chip_id = BCM53115_DEVICE_ID,
  1133. .dev_name = "BCM53115",
  1134. .alias = "bcm53115",
  1135. .vlans = 4096,
  1136. .enabled_ports = 0x1f,
  1137. .vta_regs = B53_VTA_REGS,
  1138. .cpu_port = B53_CPU_PORT,
  1139. .duplex_reg = B53_DUPLEX_STAT_GE,
  1140. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1141. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1142. .sw_ops = &b53_switch_ops,
  1143. },
  1144. {
  1145. .chip_id = BCM53125_DEVICE_ID,
  1146. .dev_name = "BCM53125",
  1147. .alias = "bcm53125",
  1148. .vlans = 4096,
  1149. .enabled_ports = 0x1f,
  1150. .cpu_port = B53_CPU_PORT,
  1151. .vta_regs = B53_VTA_REGS,
  1152. .duplex_reg = B53_DUPLEX_STAT_GE,
  1153. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1154. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1155. .sw_ops = &b53_switch_ops,
  1156. },
  1157. {
  1158. .chip_id = BCM53128_DEVICE_ID,
  1159. .dev_name = "BCM53128",
  1160. .alias = "bcm53128",
  1161. .vlans = 4096,
  1162. .enabled_ports = 0x1ff,
  1163. .cpu_port = B53_CPU_PORT,
  1164. .vta_regs = B53_VTA_REGS,
  1165. .duplex_reg = B53_DUPLEX_STAT_GE,
  1166. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1167. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1168. .sw_ops = &b53_switch_ops,
  1169. },
  1170. {
  1171. .chip_id = BCM63XX_DEVICE_ID,
  1172. .dev_name = "BCM63xx",
  1173. .alias = "bcm63xx",
  1174. .vlans = 4096,
  1175. .enabled_ports = 0, /* pdata must provide them */
  1176. .cpu_port = B53_CPU_PORT,
  1177. .vta_regs = B53_VTA_REGS_63XX,
  1178. .duplex_reg = B53_DUPLEX_STAT_63XX,
  1179. .jumbo_pm_reg = B53_JUMBO_PORT_MASK_63XX,
  1180. .jumbo_size_reg = B53_JUMBO_MAX_SIZE_63XX,
  1181. .sw_ops = &b53_switch_ops,
  1182. },
  1183. {
  1184. .chip_id = BCM53010_DEVICE_ID,
  1185. .dev_name = "BCM53010",
  1186. .alias = "bcm53011",
  1187. .vlans = 4096,
  1188. .enabled_ports = 0x1f,
  1189. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1190. .vta_regs = B53_VTA_REGS,
  1191. .duplex_reg = B53_DUPLEX_STAT_GE,
  1192. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1193. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1194. .sw_ops = &b53_switch_ops,
  1195. },
  1196. {
  1197. .chip_id = BCM53011_DEVICE_ID,
  1198. .dev_name = "BCM53011",
  1199. .alias = "bcm53011",
  1200. .vlans = 4096,
  1201. .enabled_ports = 0x1bf,
  1202. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1203. .vta_regs = B53_VTA_REGS,
  1204. .duplex_reg = B53_DUPLEX_STAT_GE,
  1205. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1206. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1207. .sw_ops = &b53_switch_ops,
  1208. },
  1209. {
  1210. .chip_id = BCM53012_DEVICE_ID,
  1211. .dev_name = "BCM53012",
  1212. .alias = "bcm53011",
  1213. .vlans = 4096,
  1214. .enabled_ports = 0x1bf,
  1215. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1216. .vta_regs = B53_VTA_REGS,
  1217. .duplex_reg = B53_DUPLEX_STAT_GE,
  1218. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1219. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1220. .sw_ops = &b53_switch_ops,
  1221. },
  1222. {
  1223. .chip_id = BCM53018_DEVICE_ID,
  1224. .dev_name = "BCM53018",
  1225. .alias = "bcm53018",
  1226. .vlans = 4096,
  1227. .enabled_ports = 0x1f,
  1228. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1229. .vta_regs = B53_VTA_REGS,
  1230. .duplex_reg = B53_DUPLEX_STAT_GE,
  1231. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1232. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1233. .sw_ops = &b53_switch_ops,
  1234. },
  1235. {
  1236. .chip_id = BCM53019_DEVICE_ID,
  1237. .dev_name = "BCM53019",
  1238. .alias = "bcm53019",
  1239. .vlans = 4096,
  1240. .enabled_ports = 0x1f,
  1241. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1242. .vta_regs = B53_VTA_REGS,
  1243. .duplex_reg = B53_DUPLEX_STAT_GE,
  1244. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1245. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1246. .sw_ops = &b53_switch_ops,
  1247. },
  1248. };
  1249. static int b53_switch_init_of(struct b53_device *dev)
  1250. {
  1251. struct device_node *dn, *pn;
  1252. const char *alias;
  1253. u32 port_num;
  1254. u16 ports = 0;
  1255. dn = of_get_child_by_name(dev_of_node(dev->dev), "ports");
  1256. if (!dn)
  1257. return -EINVAL;
  1258. for_each_available_child_of_node(dn, pn) {
  1259. const char *label;
  1260. int len;
  1261. if (of_property_read_u32(pn, "reg", &port_num))
  1262. continue;
  1263. if (port_num > B53_CPU_PORT)
  1264. continue;
  1265. ports |= BIT(port_num);
  1266. label = of_get_property(pn, "label", &len);
  1267. if (label && !strcmp(label, "cpu"))
  1268. dev->sw_dev.cpu_port = port_num;
  1269. }
  1270. dev->enabled_ports = ports;
  1271. if (!of_property_read_string(dev_of_node(dev->dev), "lede,alias",
  1272. &alias))
  1273. dev->sw_dev.alias = devm_kstrdup(dev->dev, alias, GFP_KERNEL);
  1274. return 0;
  1275. }
  1276. static int b53_switch_init(struct b53_device *dev)
  1277. {
  1278. struct switch_dev *sw_dev = &dev->sw_dev;
  1279. unsigned i;
  1280. int ret;
  1281. for (i = 0; i < ARRAY_SIZE(b53_switch_chips); i++) {
  1282. const struct b53_chip_data *chip = &b53_switch_chips[i];
  1283. if (chip->chip_id == dev->chip_id) {
  1284. sw_dev->name = chip->dev_name;
  1285. if (!sw_dev->alias)
  1286. sw_dev->alias = chip->alias;
  1287. if (!dev->enabled_ports)
  1288. dev->enabled_ports = chip->enabled_ports;
  1289. dev->duplex_reg = chip->duplex_reg;
  1290. dev->vta_regs[0] = chip->vta_regs[0];
  1291. dev->vta_regs[1] = chip->vta_regs[1];
  1292. dev->vta_regs[2] = chip->vta_regs[2];
  1293. dev->jumbo_pm_reg = chip->jumbo_pm_reg;
  1294. sw_dev->ops = chip->sw_ops;
  1295. sw_dev->cpu_port = chip->cpu_port;
  1296. sw_dev->vlans = chip->vlans;
  1297. break;
  1298. }
  1299. }
  1300. if (!sw_dev->name)
  1301. return -EINVAL;
  1302. /* check which BCM5325x version we have */
  1303. if (is5325(dev)) {
  1304. u8 vc4;
  1305. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL4_25, &vc4);
  1306. /* check reserved bits */
  1307. switch (vc4 & 3) {
  1308. case 1:
  1309. /* BCM5325E */
  1310. break;
  1311. case 3:
  1312. /* BCM5325F - do not use port 4 */
  1313. dev->enabled_ports &= ~BIT(4);
  1314. break;
  1315. default:
  1316. /* On the BCM47XX SoCs this is the supported internal switch.*/
  1317. #ifndef CONFIG_BCM47XX
  1318. /* BCM5325M */
  1319. return -EINVAL;
  1320. #else
  1321. break;
  1322. #endif
  1323. }
  1324. } else if (dev->chip_id == BCM53115_DEVICE_ID) {
  1325. u64 strap_value;
  1326. b53_read48(dev, B53_STAT_PAGE, B53_STRAP_VALUE, &strap_value);
  1327. /* use second IMP port if GMII is enabled */
  1328. if (strap_value & SV_GMII_CTRL_115)
  1329. sw_dev->cpu_port = 5;
  1330. }
  1331. if (dev_of_node(dev->dev)) {
  1332. ret = b53_switch_init_of(dev);
  1333. if (ret)
  1334. return ret;
  1335. }
  1336. dev->enabled_ports |= BIT(sw_dev->cpu_port);
  1337. sw_dev->ports = fls(dev->enabled_ports);
  1338. dev->ports = devm_kzalloc(dev->dev,
  1339. sizeof(struct b53_port) * sw_dev->ports,
  1340. GFP_KERNEL);
  1341. if (!dev->ports)
  1342. return -ENOMEM;
  1343. dev->vlans = devm_kzalloc(dev->dev,
  1344. sizeof(struct b53_vlan) * sw_dev->vlans,
  1345. GFP_KERNEL);
  1346. if (!dev->vlans)
  1347. return -ENOMEM;
  1348. dev->buf = devm_kzalloc(dev->dev, B53_BUF_SIZE, GFP_KERNEL);
  1349. if (!dev->buf)
  1350. return -ENOMEM;
  1351. dev->reset_gpio = b53_switch_get_reset_gpio(dev);
  1352. if (dev->reset_gpio >= 0) {
  1353. ret = devm_gpio_request_one(dev->dev, dev->reset_gpio,
  1354. GPIOF_OUT_INIT_HIGH, "robo_reset");
  1355. if (ret)
  1356. return ret;
  1357. }
  1358. return b53_switch_reset(dev);
  1359. }
  1360. struct b53_device *b53_switch_alloc(struct device *base, struct b53_io_ops *ops,
  1361. void *priv)
  1362. {
  1363. struct b53_device *dev;
  1364. dev = devm_kzalloc(base, sizeof(*dev), GFP_KERNEL);
  1365. if (!dev)
  1366. return NULL;
  1367. dev->dev = base;
  1368. dev->ops = ops;
  1369. dev->priv = priv;
  1370. mutex_init(&dev->reg_mutex);
  1371. return dev;
  1372. }
  1373. EXPORT_SYMBOL(b53_switch_alloc);
  1374. int b53_switch_detect(struct b53_device *dev)
  1375. {
  1376. u32 id32;
  1377. u16 tmp;
  1378. u8 id8;
  1379. int ret;
  1380. ret = b53_read8(dev, B53_MGMT_PAGE, B53_DEVICE_ID, &id8);
  1381. if (ret)
  1382. return ret;
  1383. switch (id8) {
  1384. case 0:
  1385. /*
  1386. * BCM5325 and BCM5365 do not have this register so reads
  1387. * return 0. But the read operation did succeed, so assume
  1388. * this is one of them.
  1389. *
  1390. * Next check if we can write to the 5325's VTA register; for
  1391. * 5365 it is read only.
  1392. */
  1393. b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, 0xf);
  1394. b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, &tmp);
  1395. if (tmp == 0xf)
  1396. dev->chip_id = BCM5325_DEVICE_ID;
  1397. else
  1398. dev->chip_id = BCM5365_DEVICE_ID;
  1399. break;
  1400. case BCM5395_DEVICE_ID:
  1401. case BCM5397_DEVICE_ID:
  1402. case BCM5398_DEVICE_ID:
  1403. dev->chip_id = id8;
  1404. break;
  1405. default:
  1406. ret = b53_read32(dev, B53_MGMT_PAGE, B53_DEVICE_ID, &id32);
  1407. if (ret)
  1408. return ret;
  1409. switch (id32) {
  1410. case BCM53115_DEVICE_ID:
  1411. case BCM53125_DEVICE_ID:
  1412. case BCM53128_DEVICE_ID:
  1413. case BCM53010_DEVICE_ID:
  1414. case BCM53011_DEVICE_ID:
  1415. case BCM53012_DEVICE_ID:
  1416. case BCM53018_DEVICE_ID:
  1417. case BCM53019_DEVICE_ID:
  1418. dev->chip_id = id32;
  1419. break;
  1420. default:
  1421. pr_err("unsupported switch detected (BCM53%02x/BCM%x)\n",
  1422. id8, id32);
  1423. return -ENODEV;
  1424. }
  1425. }
  1426. if (dev->chip_id == BCM5325_DEVICE_ID)
  1427. return b53_read8(dev, B53_STAT_PAGE, B53_REV_ID_25,
  1428. &dev->core_rev);
  1429. else
  1430. return b53_read8(dev, B53_MGMT_PAGE, B53_REV_ID,
  1431. &dev->core_rev);
  1432. }
  1433. EXPORT_SYMBOL(b53_switch_detect);
  1434. int b53_switch_register(struct b53_device *dev)
  1435. {
  1436. int ret;
  1437. if (dev->pdata) {
  1438. dev->chip_id = dev->pdata->chip_id;
  1439. dev->enabled_ports = dev->pdata->enabled_ports;
  1440. dev->sw_dev.alias = dev->pdata->alias;
  1441. }
  1442. if (!dev->chip_id && b53_switch_detect(dev))
  1443. return -EINVAL;
  1444. ret = b53_switch_init(dev);
  1445. if (ret)
  1446. return ret;
  1447. pr_info("found switch: %s, rev %i\n", dev->sw_dev.name, dev->core_rev);
  1448. return register_switch(&dev->sw_dev, NULL);
  1449. }
  1450. EXPORT_SYMBOL(b53_switch_register);
  1451. MODULE_AUTHOR("Jonas Gorski <[email protected]>");
  1452. MODULE_DESCRIPTION("B53 switch library");
  1453. MODULE_LICENSE("Dual BSD/GPL");