b53_common.c 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724
  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. phy_interface_t mode;
  424. of_get_phy_mode(pn, &mode);
  425. if (!of_property_read_u32(fixed_link, "speed", &spd)) {
  426. switch (spd) {
  427. case 10:
  428. po |= GMII_PO_SPEED_10M;
  429. break;
  430. case 100:
  431. po |= GMII_PO_SPEED_100M;
  432. break;
  433. case 2000:
  434. if (is_imp_port(dev, port_num))
  435. po |= PORT_OVERRIDE_SPEED_2000M;
  436. else
  437. po |= GMII_PO_SPEED_2000M;
  438. fallthrough;
  439. case 1000:
  440. po |= GMII_PO_SPEED_1000M;
  441. break;
  442. }
  443. }
  444. if (of_property_read_bool(fixed_link, "full-duplex"))
  445. po |= PORT_OVERRIDE_FULL_DUPLEX;
  446. if (of_property_read_bool(fixed_link, "pause"))
  447. po |= GMII_PO_RX_FLOW;
  448. if (of_property_read_bool(fixed_link, "asym-pause"))
  449. po |= GMII_PO_TX_FLOW;
  450. if (is_imp_port(dev, port_num)) {
  451. po |= PORT_OVERRIDE_EN;
  452. if (is5325(dev) &&
  453. mode == PHY_INTERFACE_MODE_REVMII)
  454. po |= PORT_OVERRIDE_RV_MII_25;
  455. b53_write8(dev, B53_CTRL_PAGE,
  456. B53_PORT_OVERRIDE_CTRL, po);
  457. if (is5325(dev) &&
  458. mode == PHY_INTERFACE_MODE_REVMII) {
  459. b53_read8(dev, B53_CTRL_PAGE,
  460. B53_PORT_OVERRIDE_CTRL, &po);
  461. if (!(po & PORT_OVERRIDE_RV_MII_25))
  462. pr_err("Failed to enable reverse MII mode\n");
  463. return -EINVAL;
  464. }
  465. } else {
  466. po |= GMII_PO_EN;
  467. b53_write8(dev, B53_CTRL_PAGE,
  468. B53_GMII_PORT_OVERRIDE_CTRL(port_num),
  469. po);
  470. }
  471. }
  472. }
  473. return 0;
  474. }
  475. static int b53_configure_ports(struct b53_device *dev)
  476. {
  477. u8 cpu_port = dev->sw_dev.cpu_port;
  478. /* configure MII port if necessary */
  479. if (is5325(dev)) {
  480. u8 mii_port_override;
  481. b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  482. &mii_port_override);
  483. /* reverse mii needs to be enabled */
  484. if (!(mii_port_override & PORT_OVERRIDE_RV_MII_25)) {
  485. b53_write8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  486. mii_port_override | PORT_OVERRIDE_RV_MII_25);
  487. b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  488. &mii_port_override);
  489. if (!(mii_port_override & PORT_OVERRIDE_RV_MII_25)) {
  490. pr_err("Failed to enable reverse MII mode\n");
  491. return -EINVAL;
  492. }
  493. }
  494. } else if (is531x5(dev) && cpu_port == B53_CPU_PORT) {
  495. u8 mii_port_override;
  496. b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  497. &mii_port_override);
  498. b53_write8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  499. mii_port_override | PORT_OVERRIDE_EN |
  500. PORT_OVERRIDE_LINK);
  501. /* BCM47189 has another interface connected to the port 5 */
  502. if (dev->enabled_ports & BIT(5)) {
  503. u8 po_reg = B53_GMII_PORT_OVERRIDE_CTRL(5);
  504. u8 gmii_po;
  505. b53_read8(dev, B53_CTRL_PAGE, po_reg, &gmii_po);
  506. gmii_po |= GMII_PO_LINK |
  507. GMII_PO_RX_FLOW |
  508. GMII_PO_TX_FLOW |
  509. GMII_PO_EN;
  510. b53_write8(dev, B53_CTRL_PAGE, po_reg, gmii_po);
  511. }
  512. } else if (is5301x(dev)) {
  513. if (cpu_port == 8) {
  514. u8 mii_port_override;
  515. b53_read8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  516. &mii_port_override);
  517. mii_port_override |= PORT_OVERRIDE_LINK |
  518. PORT_OVERRIDE_RX_FLOW |
  519. PORT_OVERRIDE_TX_FLOW |
  520. PORT_OVERRIDE_SPEED_2000M |
  521. PORT_OVERRIDE_EN;
  522. b53_write8(dev, B53_CTRL_PAGE, B53_PORT_OVERRIDE_CTRL,
  523. mii_port_override);
  524. /* TODO: Ports 5 & 7 require some extra handling */
  525. } else {
  526. u8 po_reg = B53_GMII_PORT_OVERRIDE_CTRL(cpu_port);
  527. u8 gmii_po;
  528. b53_read8(dev, B53_CTRL_PAGE, po_reg, &gmii_po);
  529. gmii_po |= GMII_PO_LINK |
  530. GMII_PO_RX_FLOW |
  531. GMII_PO_TX_FLOW |
  532. GMII_PO_EN |
  533. GMII_PO_SPEED_2000M;
  534. b53_write8(dev, B53_CTRL_PAGE, po_reg, gmii_po);
  535. }
  536. }
  537. return 0;
  538. }
  539. static int b53_switch_reset(struct b53_device *dev)
  540. {
  541. int ret = 0;
  542. u8 mgmt;
  543. b53_switch_reset_gpio(dev);
  544. if (is539x(dev)) {
  545. b53_write8(dev, B53_CTRL_PAGE, B53_SOFTRESET, 0x83);
  546. b53_write8(dev, B53_CTRL_PAGE, B53_SOFTRESET, 0x00);
  547. }
  548. b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, &mgmt);
  549. if (!(mgmt & SM_SW_FWD_EN)) {
  550. mgmt &= ~SM_SW_FWD_MODE;
  551. mgmt |= SM_SW_FWD_EN;
  552. b53_write8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, mgmt);
  553. b53_read8(dev, B53_CTRL_PAGE, B53_SWITCH_MODE, &mgmt);
  554. if (!(mgmt & SM_SW_FWD_EN)) {
  555. pr_err("Failed to enable switch!\n");
  556. return -EINVAL;
  557. }
  558. }
  559. /* enable all ports */
  560. b53_enable_ports(dev);
  561. if (dev->dev->of_node)
  562. ret = b53_configure_ports_of(dev);
  563. else
  564. ret = b53_configure_ports(dev);
  565. if (ret)
  566. return ret;
  567. b53_enable_mib(dev);
  568. return b53_flush_arl(dev);
  569. }
  570. /*
  571. * Swconfig glue functions
  572. */
  573. static int b53_global_get_vlan_enable(struct switch_dev *dev,
  574. const struct switch_attr *attr,
  575. struct switch_val *val)
  576. {
  577. struct b53_device *priv = sw_to_b53(dev);
  578. val->value.i = priv->enable_vlan;
  579. return 0;
  580. }
  581. static int b53_global_set_vlan_enable(struct switch_dev *dev,
  582. const struct switch_attr *attr,
  583. struct switch_val *val)
  584. {
  585. struct b53_device *priv = sw_to_b53(dev);
  586. priv->enable_vlan = val->value.i;
  587. return 0;
  588. }
  589. static int b53_global_get_jumbo_enable(struct switch_dev *dev,
  590. const struct switch_attr *attr,
  591. struct switch_val *val)
  592. {
  593. struct b53_device *priv = sw_to_b53(dev);
  594. val->value.i = priv->enable_jumbo;
  595. return 0;
  596. }
  597. static int b53_global_set_jumbo_enable(struct switch_dev *dev,
  598. const struct switch_attr *attr,
  599. struct switch_val *val)
  600. {
  601. struct b53_device *priv = sw_to_b53(dev);
  602. priv->enable_jumbo = val->value.i;
  603. return 0;
  604. }
  605. static int b53_global_get_4095_enable(struct switch_dev *dev,
  606. const struct switch_attr *attr,
  607. struct switch_val *val)
  608. {
  609. struct b53_device *priv = sw_to_b53(dev);
  610. val->value.i = priv->allow_vid_4095;
  611. return 0;
  612. }
  613. static int b53_global_set_4095_enable(struct switch_dev *dev,
  614. const struct switch_attr *attr,
  615. struct switch_val *val)
  616. {
  617. struct b53_device *priv = sw_to_b53(dev);
  618. priv->allow_vid_4095 = val->value.i;
  619. return 0;
  620. }
  621. static int b53_global_get_ports(struct switch_dev *dev,
  622. const struct switch_attr *attr,
  623. struct switch_val *val)
  624. {
  625. struct b53_device *priv = sw_to_b53(dev);
  626. val->len = snprintf(priv->buf, B53_BUF_SIZE, "0x%04x",
  627. priv->enabled_ports);
  628. val->value.s = priv->buf;
  629. return 0;
  630. }
  631. static int b53_port_get_pvid(struct switch_dev *dev, int port, int *val)
  632. {
  633. struct b53_device *priv = sw_to_b53(dev);
  634. *val = priv->ports[port].pvid;
  635. return 0;
  636. }
  637. static int b53_port_set_pvid(struct switch_dev *dev, int port, int val)
  638. {
  639. struct b53_device *priv = sw_to_b53(dev);
  640. if (val > 15 && is5325(priv))
  641. return -EINVAL;
  642. if (val == 4095 && !priv->allow_vid_4095)
  643. return -EINVAL;
  644. priv->ports[port].pvid = val;
  645. return 0;
  646. }
  647. static int b53_vlan_get_ports(struct switch_dev *dev, struct switch_val *val)
  648. {
  649. struct b53_device *priv = sw_to_b53(dev);
  650. struct switch_port *port = &val->value.ports[0];
  651. struct b53_vlan *vlan = &priv->vlans[val->port_vlan];
  652. int i;
  653. val->len = 0;
  654. if (!vlan->members)
  655. return 0;
  656. for (i = 0; i < dev->ports; i++) {
  657. if (!(vlan->members & BIT(i)))
  658. continue;
  659. if (!(vlan->untag & BIT(i)))
  660. port->flags = BIT(SWITCH_PORT_FLAG_TAGGED);
  661. else
  662. port->flags = 0;
  663. port->id = i;
  664. val->len++;
  665. port++;
  666. }
  667. return 0;
  668. }
  669. static int b53_vlan_set_ports(struct switch_dev *dev, struct switch_val *val)
  670. {
  671. struct b53_device *priv = sw_to_b53(dev);
  672. struct switch_port *port;
  673. struct b53_vlan *vlan = &priv->vlans[val->port_vlan];
  674. int i;
  675. /* only BCM5325 and BCM5365 supports VID 0 */
  676. if (val->port_vlan == 0 && !is5325(priv) && !is5365(priv))
  677. return -EINVAL;
  678. /* VLAN 4095 needs special handling */
  679. if (val->port_vlan == 4095 && !priv->allow_vid_4095)
  680. return -EINVAL;
  681. port = &val->value.ports[0];
  682. vlan->members = 0;
  683. vlan->untag = 0;
  684. for (i = 0; i < val->len; i++, port++) {
  685. vlan->members |= BIT(port->id);
  686. if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED))) {
  687. vlan->untag |= BIT(port->id);
  688. priv->ports[port->id].pvid = val->port_vlan;
  689. };
  690. }
  691. /* ignore disabled ports */
  692. vlan->members &= priv->enabled_ports;
  693. vlan->untag &= priv->enabled_ports;
  694. return 0;
  695. }
  696. static int b53_port_get_link(struct switch_dev *dev, int port,
  697. struct switch_port_link *link)
  698. {
  699. struct b53_device *priv = sw_to_b53(dev);
  700. if (is_cpu_port(priv, port)) {
  701. link->link = 1;
  702. link->duplex = 1;
  703. link->speed = is5325(priv) || is5365(priv) ?
  704. SWITCH_PORT_SPEED_100 : SWITCH_PORT_SPEED_1000;
  705. link->aneg = 0;
  706. } else if (priv->enabled_ports & BIT(port)) {
  707. u32 speed;
  708. u16 lnk, duplex;
  709. b53_read16(priv, B53_STAT_PAGE, B53_LINK_STAT, &lnk);
  710. b53_read16(priv, B53_STAT_PAGE, priv->duplex_reg, &duplex);
  711. lnk = (lnk >> port) & 1;
  712. duplex = (duplex >> port) & 1;
  713. if (is5325(priv) || is5365(priv)) {
  714. u16 tmp;
  715. b53_read16(priv, B53_STAT_PAGE, B53_SPEED_STAT, &tmp);
  716. speed = SPEED_PORT_FE(tmp, port);
  717. } else {
  718. b53_read32(priv, B53_STAT_PAGE, B53_SPEED_STAT, &speed);
  719. speed = SPEED_PORT_GE(speed, port);
  720. }
  721. link->link = lnk;
  722. if (lnk) {
  723. link->duplex = duplex;
  724. switch (speed) {
  725. case SPEED_STAT_10M:
  726. link->speed = SWITCH_PORT_SPEED_10;
  727. break;
  728. case SPEED_STAT_100M:
  729. link->speed = SWITCH_PORT_SPEED_100;
  730. break;
  731. case SPEED_STAT_1000M:
  732. link->speed = SWITCH_PORT_SPEED_1000;
  733. break;
  734. }
  735. }
  736. link->aneg = 1;
  737. } else {
  738. link->link = 0;
  739. }
  740. return 0;
  741. }
  742. static int b53_port_set_link(struct switch_dev *sw_dev, int port,
  743. struct switch_port_link *link)
  744. {
  745. struct b53_device *dev = sw_to_b53(sw_dev);
  746. /*
  747. * TODO: BCM63XX requires special handling as it can have external phys
  748. * and ports might be GE or only FE
  749. */
  750. if (is63xx(dev))
  751. return -ENOTSUPP;
  752. if (port == sw_dev->cpu_port)
  753. return -EINVAL;
  754. if (!(BIT(port) & dev->enabled_ports))
  755. return -EINVAL;
  756. if (link->speed == SWITCH_PORT_SPEED_1000 &&
  757. (is5325(dev) || is5365(dev)))
  758. return -EINVAL;
  759. if (link->speed == SWITCH_PORT_SPEED_1000 && !link->duplex)
  760. return -EINVAL;
  761. return switch_generic_set_link(sw_dev, port, link);
  762. }
  763. static int b53_phy_read16(struct switch_dev *dev, int addr, u8 reg, u16 *value)
  764. {
  765. struct b53_device *priv = sw_to_b53(dev);
  766. if (priv->ops->phy_read16)
  767. return priv->ops->phy_read16(priv, addr, reg, value);
  768. return b53_read16(priv, B53_PORT_MII_PAGE(addr), reg, value);
  769. }
  770. static int b53_phy_write16(struct switch_dev *dev, int addr, u8 reg, u16 value)
  771. {
  772. struct b53_device *priv = sw_to_b53(dev);
  773. if (priv->ops->phy_write16)
  774. return priv->ops->phy_write16(priv, addr, reg, value);
  775. return b53_write16(priv, B53_PORT_MII_PAGE(addr), reg, value);
  776. }
  777. static int b53_global_reset_switch(struct switch_dev *dev)
  778. {
  779. struct b53_device *priv = sw_to_b53(dev);
  780. /* reset vlans */
  781. priv->enable_vlan = 0;
  782. priv->enable_jumbo = 0;
  783. priv->allow_vid_4095 = 0;
  784. memset(priv->vlans, 0, sizeof(*priv->vlans) * dev->vlans);
  785. memset(priv->ports, 0, sizeof(*priv->ports) * dev->ports);
  786. return b53_switch_reset(priv);
  787. }
  788. static int b53_global_apply_config(struct switch_dev *dev)
  789. {
  790. struct b53_device *priv = sw_to_b53(dev);
  791. /* disable switching */
  792. b53_set_forwarding(priv, 0);
  793. b53_apply(priv);
  794. /* enable switching */
  795. b53_set_forwarding(priv, 1);
  796. return 0;
  797. }
  798. static int b53_global_reset_mib(struct switch_dev *dev,
  799. const struct switch_attr *attr,
  800. struct switch_val *val)
  801. {
  802. struct b53_device *priv = sw_to_b53(dev);
  803. u8 gc;
  804. b53_read8(priv, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, &gc);
  805. b53_write8(priv, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc | GC_RESET_MIB);
  806. mdelay(1);
  807. b53_write8(priv, B53_MGMT_PAGE, B53_GLOBAL_CONFIG, gc & ~GC_RESET_MIB);
  808. mdelay(1);
  809. return 0;
  810. }
  811. static int b53_port_get_mib(struct switch_dev *sw_dev,
  812. const struct switch_attr *attr,
  813. struct switch_val *val)
  814. {
  815. struct b53_device *dev = sw_to_b53(sw_dev);
  816. const struct b53_mib_desc *mibs;
  817. int port = val->port_vlan;
  818. int len = 0;
  819. if (!(BIT(port) & dev->enabled_ports))
  820. return -1;
  821. if (is5365(dev)) {
  822. if (port == 5)
  823. port = 8;
  824. mibs = b53_mibs_65;
  825. } else if (is63xx(dev)) {
  826. mibs = b53_mibs_63xx;
  827. } else {
  828. mibs = b53_mibs;
  829. }
  830. dev->buf[0] = 0;
  831. for (; mibs->size > 0; mibs++) {
  832. u64 val;
  833. if (mibs->size == 8) {
  834. b53_read64(dev, B53_MIB_PAGE(port), mibs->offset, &val);
  835. } else {
  836. u32 val32;
  837. b53_read32(dev, B53_MIB_PAGE(port), mibs->offset,
  838. &val32);
  839. val = val32;
  840. }
  841. len += snprintf(dev->buf + len, B53_BUF_SIZE - len,
  842. "%-20s: %llu\n", mibs->name, val);
  843. }
  844. val->len = len;
  845. val->value.s = dev->buf;
  846. return 0;
  847. }
  848. static int b53_port_get_stats(struct switch_dev *sw_dev, int port,
  849. struct switch_port_stats *stats)
  850. {
  851. struct b53_device *dev = sw_to_b53(sw_dev);
  852. const struct b53_mib_desc *mibs;
  853. int txb_id, rxb_id;
  854. u64 rxb, txb;
  855. if (!(BIT(port) & dev->enabled_ports))
  856. return -EINVAL;
  857. txb_id = B53XX_MIB_TXB_ID;
  858. rxb_id = B53XX_MIB_RXB_ID;
  859. if (is5365(dev)) {
  860. if (port == 5)
  861. port = 8;
  862. mibs = b53_mibs_65;
  863. } else if (is63xx(dev)) {
  864. mibs = b53_mibs_63xx;
  865. txb_id = B63XX_MIB_TXB_ID;
  866. rxb_id = B63XX_MIB_RXB_ID;
  867. } else {
  868. mibs = b53_mibs;
  869. }
  870. dev->buf[0] = 0;
  871. if (mibs->size == 8) {
  872. b53_read64(dev, B53_MIB_PAGE(port), mibs[txb_id].offset, &txb);
  873. b53_read64(dev, B53_MIB_PAGE(port), mibs[rxb_id].offset, &rxb);
  874. } else {
  875. u32 val32;
  876. b53_read32(dev, B53_MIB_PAGE(port), mibs[txb_id].offset, &val32);
  877. txb = val32;
  878. b53_read32(dev, B53_MIB_PAGE(port), mibs[rxb_id].offset, &val32);
  879. rxb = val32;
  880. }
  881. stats->tx_bytes = txb;
  882. stats->rx_bytes = rxb;
  883. return 0;
  884. }
  885. static struct switch_attr b53_global_ops_25[] = {
  886. {
  887. .type = SWITCH_TYPE_INT,
  888. .name = "enable_vlan",
  889. .description = "Enable VLAN mode",
  890. .set = b53_global_set_vlan_enable,
  891. .get = b53_global_get_vlan_enable,
  892. .max = 1,
  893. },
  894. {
  895. .type = SWITCH_TYPE_STRING,
  896. .name = "ports",
  897. .description = "Available ports (as bitmask)",
  898. .get = b53_global_get_ports,
  899. },
  900. };
  901. static struct switch_attr b53_global_ops_65[] = {
  902. {
  903. .type = SWITCH_TYPE_INT,
  904. .name = "enable_vlan",
  905. .description = "Enable VLAN mode",
  906. .set = b53_global_set_vlan_enable,
  907. .get = b53_global_get_vlan_enable,
  908. .max = 1,
  909. },
  910. {
  911. .type = SWITCH_TYPE_STRING,
  912. .name = "ports",
  913. .description = "Available ports (as bitmask)",
  914. .get = b53_global_get_ports,
  915. },
  916. {
  917. .type = SWITCH_TYPE_INT,
  918. .name = "reset_mib",
  919. .description = "Reset MIB counters",
  920. .set = b53_global_reset_mib,
  921. },
  922. };
  923. static struct switch_attr b53_global_ops[] = {
  924. {
  925. .type = SWITCH_TYPE_INT,
  926. .name = "enable_vlan",
  927. .description = "Enable VLAN mode",
  928. .set = b53_global_set_vlan_enable,
  929. .get = b53_global_get_vlan_enable,
  930. .max = 1,
  931. },
  932. {
  933. .type = SWITCH_TYPE_STRING,
  934. .name = "ports",
  935. .description = "Available Ports (as bitmask)",
  936. .get = b53_global_get_ports,
  937. },
  938. {
  939. .type = SWITCH_TYPE_INT,
  940. .name = "reset_mib",
  941. .description = "Reset MIB counters",
  942. .set = b53_global_reset_mib,
  943. },
  944. {
  945. .type = SWITCH_TYPE_INT,
  946. .name = "enable_jumbo",
  947. .description = "Enable Jumbo Frames",
  948. .set = b53_global_set_jumbo_enable,
  949. .get = b53_global_get_jumbo_enable,
  950. .max = 1,
  951. },
  952. {
  953. .type = SWITCH_TYPE_INT,
  954. .name = "allow_vid_4095",
  955. .description = "Allow VID 4095",
  956. .set = b53_global_set_4095_enable,
  957. .get = b53_global_get_4095_enable,
  958. .max = 1,
  959. },
  960. };
  961. static struct switch_attr b53_port_ops[] = {
  962. {
  963. .type = SWITCH_TYPE_STRING,
  964. .name = "mib",
  965. .description = "Get port's MIB counters",
  966. .get = b53_port_get_mib,
  967. },
  968. };
  969. static struct switch_attr b53_no_ops[] = {
  970. };
  971. static const struct switch_dev_ops b53_switch_ops_25 = {
  972. .attr_global = {
  973. .attr = b53_global_ops_25,
  974. .n_attr = ARRAY_SIZE(b53_global_ops_25),
  975. },
  976. .attr_port = {
  977. .attr = b53_no_ops,
  978. .n_attr = ARRAY_SIZE(b53_no_ops),
  979. },
  980. .attr_vlan = {
  981. .attr = b53_no_ops,
  982. .n_attr = ARRAY_SIZE(b53_no_ops),
  983. },
  984. .get_vlan_ports = b53_vlan_get_ports,
  985. .set_vlan_ports = b53_vlan_set_ports,
  986. .get_port_pvid = b53_port_get_pvid,
  987. .set_port_pvid = b53_port_set_pvid,
  988. .apply_config = b53_global_apply_config,
  989. .reset_switch = b53_global_reset_switch,
  990. .get_port_link = b53_port_get_link,
  991. .set_port_link = b53_port_set_link,
  992. .get_port_stats = b53_port_get_stats,
  993. .phy_read16 = b53_phy_read16,
  994. .phy_write16 = b53_phy_write16,
  995. };
  996. static const struct switch_dev_ops b53_switch_ops_65 = {
  997. .attr_global = {
  998. .attr = b53_global_ops_65,
  999. .n_attr = ARRAY_SIZE(b53_global_ops_65),
  1000. },
  1001. .attr_port = {
  1002. .attr = b53_port_ops,
  1003. .n_attr = ARRAY_SIZE(b53_port_ops),
  1004. },
  1005. .attr_vlan = {
  1006. .attr = b53_no_ops,
  1007. .n_attr = ARRAY_SIZE(b53_no_ops),
  1008. },
  1009. .get_vlan_ports = b53_vlan_get_ports,
  1010. .set_vlan_ports = b53_vlan_set_ports,
  1011. .get_port_pvid = b53_port_get_pvid,
  1012. .set_port_pvid = b53_port_set_pvid,
  1013. .apply_config = b53_global_apply_config,
  1014. .reset_switch = b53_global_reset_switch,
  1015. .get_port_link = b53_port_get_link,
  1016. .set_port_link = b53_port_set_link,
  1017. .get_port_stats = b53_port_get_stats,
  1018. .phy_read16 = b53_phy_read16,
  1019. .phy_write16 = b53_phy_write16,
  1020. };
  1021. static const struct switch_dev_ops b53_switch_ops = {
  1022. .attr_global = {
  1023. .attr = b53_global_ops,
  1024. .n_attr = ARRAY_SIZE(b53_global_ops),
  1025. },
  1026. .attr_port = {
  1027. .attr = b53_port_ops,
  1028. .n_attr = ARRAY_SIZE(b53_port_ops),
  1029. },
  1030. .attr_vlan = {
  1031. .attr = b53_no_ops,
  1032. .n_attr = ARRAY_SIZE(b53_no_ops),
  1033. },
  1034. .get_vlan_ports = b53_vlan_get_ports,
  1035. .set_vlan_ports = b53_vlan_set_ports,
  1036. .get_port_pvid = b53_port_get_pvid,
  1037. .set_port_pvid = b53_port_set_pvid,
  1038. .apply_config = b53_global_apply_config,
  1039. .reset_switch = b53_global_reset_switch,
  1040. .get_port_link = b53_port_get_link,
  1041. .set_port_link = b53_port_set_link,
  1042. .get_port_stats = b53_port_get_stats,
  1043. .phy_read16 = b53_phy_read16,
  1044. .phy_write16 = b53_phy_write16,
  1045. };
  1046. struct b53_chip_data {
  1047. u32 chip_id;
  1048. const char *dev_name;
  1049. const char *alias;
  1050. u16 vlans;
  1051. u16 enabled_ports;
  1052. u8 cpu_port;
  1053. u8 vta_regs[3];
  1054. u8 duplex_reg;
  1055. u8 jumbo_pm_reg;
  1056. u8 jumbo_size_reg;
  1057. const struct switch_dev_ops *sw_ops;
  1058. };
  1059. #define B53_VTA_REGS \
  1060. { B53_VT_ACCESS, B53_VT_INDEX, B53_VT_ENTRY }
  1061. #define B53_VTA_REGS_9798 \
  1062. { B53_VT_ACCESS_9798, B53_VT_INDEX_9798, B53_VT_ENTRY_9798 }
  1063. #define B53_VTA_REGS_63XX \
  1064. { B53_VT_ACCESS_63XX, B53_VT_INDEX_63XX, B53_VT_ENTRY_63XX }
  1065. static const struct b53_chip_data b53_switch_chips[] = {
  1066. {
  1067. .chip_id = BCM5325_DEVICE_ID,
  1068. .dev_name = "BCM5325",
  1069. .alias = "bcm5325",
  1070. .vlans = 16,
  1071. .enabled_ports = 0x1f,
  1072. .cpu_port = B53_CPU_PORT_25,
  1073. .duplex_reg = B53_DUPLEX_STAT_FE,
  1074. .sw_ops = &b53_switch_ops_25,
  1075. },
  1076. {
  1077. .chip_id = BCM5365_DEVICE_ID,
  1078. .dev_name = "BCM5365",
  1079. .alias = "bcm5365",
  1080. .vlans = 256,
  1081. .enabled_ports = 0x1f,
  1082. .cpu_port = B53_CPU_PORT_25,
  1083. .duplex_reg = B53_DUPLEX_STAT_FE,
  1084. .sw_ops = &b53_switch_ops_65,
  1085. },
  1086. {
  1087. .chip_id = BCM5395_DEVICE_ID,
  1088. .dev_name = "BCM5395",
  1089. .alias = "bcm5395",
  1090. .vlans = 4096,
  1091. .enabled_ports = 0x1f,
  1092. .cpu_port = B53_CPU_PORT,
  1093. .vta_regs = B53_VTA_REGS,
  1094. .duplex_reg = B53_DUPLEX_STAT_GE,
  1095. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1096. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1097. .sw_ops = &b53_switch_ops,
  1098. },
  1099. {
  1100. .chip_id = BCM5397_DEVICE_ID,
  1101. .dev_name = "BCM5397",
  1102. .alias = "bcm5397",
  1103. .vlans = 4096,
  1104. .enabled_ports = 0x1f,
  1105. .cpu_port = B53_CPU_PORT,
  1106. .vta_regs = B53_VTA_REGS_9798,
  1107. .duplex_reg = B53_DUPLEX_STAT_GE,
  1108. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1109. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1110. .sw_ops = &b53_switch_ops,
  1111. },
  1112. {
  1113. .chip_id = BCM5398_DEVICE_ID,
  1114. .dev_name = "BCM5398",
  1115. .alias = "bcm5398",
  1116. .vlans = 4096,
  1117. .enabled_ports = 0x7f,
  1118. .cpu_port = B53_CPU_PORT,
  1119. .vta_regs = B53_VTA_REGS_9798,
  1120. .duplex_reg = B53_DUPLEX_STAT_GE,
  1121. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1122. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1123. .sw_ops = &b53_switch_ops,
  1124. },
  1125. {
  1126. .chip_id = BCM53115_DEVICE_ID,
  1127. .dev_name = "BCM53115",
  1128. .alias = "bcm53115",
  1129. .vlans = 4096,
  1130. .enabled_ports = 0x1f,
  1131. .vta_regs = B53_VTA_REGS,
  1132. .cpu_port = B53_CPU_PORT,
  1133. .duplex_reg = B53_DUPLEX_STAT_GE,
  1134. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1135. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1136. .sw_ops = &b53_switch_ops,
  1137. },
  1138. {
  1139. .chip_id = BCM53125_DEVICE_ID,
  1140. .dev_name = "BCM53125",
  1141. .alias = "bcm53125",
  1142. .vlans = 4096,
  1143. .enabled_ports = 0x1f,
  1144. .cpu_port = B53_CPU_PORT,
  1145. .vta_regs = B53_VTA_REGS,
  1146. .duplex_reg = B53_DUPLEX_STAT_GE,
  1147. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1148. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1149. .sw_ops = &b53_switch_ops,
  1150. },
  1151. {
  1152. .chip_id = BCM53128_DEVICE_ID,
  1153. .dev_name = "BCM53128",
  1154. .alias = "bcm53128",
  1155. .vlans = 4096,
  1156. .enabled_ports = 0x1ff,
  1157. .cpu_port = B53_CPU_PORT,
  1158. .vta_regs = B53_VTA_REGS,
  1159. .duplex_reg = B53_DUPLEX_STAT_GE,
  1160. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1161. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1162. .sw_ops = &b53_switch_ops,
  1163. },
  1164. {
  1165. .chip_id = BCM63XX_DEVICE_ID,
  1166. .dev_name = "BCM63xx",
  1167. .alias = "bcm63xx",
  1168. .vlans = 4096,
  1169. .enabled_ports = 0, /* pdata must provide them */
  1170. .cpu_port = B53_CPU_PORT,
  1171. .vta_regs = B53_VTA_REGS_63XX,
  1172. .duplex_reg = B53_DUPLEX_STAT_63XX,
  1173. .jumbo_pm_reg = B53_JUMBO_PORT_MASK_63XX,
  1174. .jumbo_size_reg = B53_JUMBO_MAX_SIZE_63XX,
  1175. .sw_ops = &b53_switch_ops,
  1176. },
  1177. {
  1178. .chip_id = BCM53010_DEVICE_ID,
  1179. .dev_name = "BCM53010",
  1180. .alias = "bcm53011",
  1181. .vlans = 4096,
  1182. .enabled_ports = 0x1f,
  1183. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1184. .vta_regs = B53_VTA_REGS,
  1185. .duplex_reg = B53_DUPLEX_STAT_GE,
  1186. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1187. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1188. .sw_ops = &b53_switch_ops,
  1189. },
  1190. {
  1191. .chip_id = BCM53011_DEVICE_ID,
  1192. .dev_name = "BCM53011",
  1193. .alias = "bcm53011",
  1194. .vlans = 4096,
  1195. .enabled_ports = 0x1bf,
  1196. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1197. .vta_regs = B53_VTA_REGS,
  1198. .duplex_reg = B53_DUPLEX_STAT_GE,
  1199. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1200. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1201. .sw_ops = &b53_switch_ops,
  1202. },
  1203. {
  1204. .chip_id = BCM53012_DEVICE_ID,
  1205. .dev_name = "BCM53012",
  1206. .alias = "bcm53011",
  1207. .vlans = 4096,
  1208. .enabled_ports = 0x1bf,
  1209. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1210. .vta_regs = B53_VTA_REGS,
  1211. .duplex_reg = B53_DUPLEX_STAT_GE,
  1212. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1213. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1214. .sw_ops = &b53_switch_ops,
  1215. },
  1216. {
  1217. .chip_id = BCM53018_DEVICE_ID,
  1218. .dev_name = "BCM53018",
  1219. .alias = "bcm53018",
  1220. .vlans = 4096,
  1221. .enabled_ports = 0x1f,
  1222. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1223. .vta_regs = B53_VTA_REGS,
  1224. .duplex_reg = B53_DUPLEX_STAT_GE,
  1225. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1226. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1227. .sw_ops = &b53_switch_ops,
  1228. },
  1229. {
  1230. .chip_id = BCM53019_DEVICE_ID,
  1231. .dev_name = "BCM53019",
  1232. .alias = "bcm53019",
  1233. .vlans = 4096,
  1234. .enabled_ports = 0x1f,
  1235. .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
  1236. .vta_regs = B53_VTA_REGS,
  1237. .duplex_reg = B53_DUPLEX_STAT_GE,
  1238. .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
  1239. .jumbo_size_reg = B53_JUMBO_MAX_SIZE,
  1240. .sw_ops = &b53_switch_ops,
  1241. },
  1242. };
  1243. static int b53_switch_init_of(struct b53_device *dev)
  1244. {
  1245. struct device_node *dn, *pn;
  1246. const char *alias;
  1247. u32 port_num;
  1248. u16 ports = 0;
  1249. dn = of_get_child_by_name(dev_of_node(dev->dev), "ports");
  1250. if (!dn)
  1251. return -EINVAL;
  1252. for_each_available_child_of_node(dn, pn) {
  1253. const char *label;
  1254. int len;
  1255. if (of_property_read_u32(pn, "reg", &port_num))
  1256. continue;
  1257. if (port_num > B53_CPU_PORT)
  1258. continue;
  1259. ports |= BIT(port_num);
  1260. label = of_get_property(pn, "label", &len);
  1261. if (label && !strcmp(label, "cpu"))
  1262. dev->sw_dev.cpu_port = port_num;
  1263. }
  1264. dev->enabled_ports = ports;
  1265. if (!of_property_read_string(dev_of_node(dev->dev), "lede,alias",
  1266. &alias))
  1267. dev->sw_dev.alias = devm_kstrdup(dev->dev, alias, GFP_KERNEL);
  1268. return 0;
  1269. }
  1270. static int b53_switch_init(struct b53_device *dev)
  1271. {
  1272. struct switch_dev *sw_dev = &dev->sw_dev;
  1273. unsigned i;
  1274. int ret;
  1275. for (i = 0; i < ARRAY_SIZE(b53_switch_chips); i++) {
  1276. const struct b53_chip_data *chip = &b53_switch_chips[i];
  1277. if (chip->chip_id == dev->chip_id) {
  1278. sw_dev->name = chip->dev_name;
  1279. if (!sw_dev->alias)
  1280. sw_dev->alias = chip->alias;
  1281. if (!dev->enabled_ports)
  1282. dev->enabled_ports = chip->enabled_ports;
  1283. dev->duplex_reg = chip->duplex_reg;
  1284. dev->vta_regs[0] = chip->vta_regs[0];
  1285. dev->vta_regs[1] = chip->vta_regs[1];
  1286. dev->vta_regs[2] = chip->vta_regs[2];
  1287. dev->jumbo_pm_reg = chip->jumbo_pm_reg;
  1288. sw_dev->ops = chip->sw_ops;
  1289. sw_dev->cpu_port = chip->cpu_port;
  1290. sw_dev->vlans = chip->vlans;
  1291. break;
  1292. }
  1293. }
  1294. if (!sw_dev->name)
  1295. return -EINVAL;
  1296. /* check which BCM5325x version we have */
  1297. if (is5325(dev)) {
  1298. u8 vc4;
  1299. b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL4_25, &vc4);
  1300. /* check reserved bits */
  1301. switch (vc4 & 3) {
  1302. case 1:
  1303. /* BCM5325E */
  1304. break;
  1305. case 3:
  1306. /* BCM5325F - do not use port 4 */
  1307. dev->enabled_ports &= ~BIT(4);
  1308. break;
  1309. default:
  1310. /* On the BCM47XX SoCs this is the supported internal switch.*/
  1311. #ifndef CONFIG_BCM47XX
  1312. /* BCM5325M */
  1313. return -EINVAL;
  1314. #else
  1315. break;
  1316. #endif
  1317. }
  1318. } else if (dev->chip_id == BCM53115_DEVICE_ID) {
  1319. u64 strap_value;
  1320. b53_read48(dev, B53_STAT_PAGE, B53_STRAP_VALUE, &strap_value);
  1321. /* use second IMP port if GMII is enabled */
  1322. if (strap_value & SV_GMII_CTRL_115)
  1323. sw_dev->cpu_port = 5;
  1324. }
  1325. if (dev_of_node(dev->dev)) {
  1326. ret = b53_switch_init_of(dev);
  1327. if (ret)
  1328. return ret;
  1329. }
  1330. dev->enabled_ports |= BIT(sw_dev->cpu_port);
  1331. sw_dev->ports = fls(dev->enabled_ports);
  1332. dev->ports = devm_kzalloc(dev->dev,
  1333. sizeof(struct b53_port) * sw_dev->ports,
  1334. GFP_KERNEL);
  1335. if (!dev->ports)
  1336. return -ENOMEM;
  1337. dev->vlans = devm_kzalloc(dev->dev,
  1338. sizeof(struct b53_vlan) * sw_dev->vlans,
  1339. GFP_KERNEL);
  1340. if (!dev->vlans)
  1341. return -ENOMEM;
  1342. dev->buf = devm_kzalloc(dev->dev, B53_BUF_SIZE, GFP_KERNEL);
  1343. if (!dev->buf)
  1344. return -ENOMEM;
  1345. dev->reset_gpio = b53_switch_get_reset_gpio(dev);
  1346. if (dev->reset_gpio >= 0) {
  1347. ret = devm_gpio_request_one(dev->dev, dev->reset_gpio,
  1348. GPIOF_OUT_INIT_HIGH, "robo_reset");
  1349. if (ret)
  1350. return ret;
  1351. }
  1352. return b53_switch_reset(dev);
  1353. }
  1354. struct b53_device *b53_swconfig_switch_alloc(struct device *base, struct b53_io_ops *ops,
  1355. void *priv)
  1356. {
  1357. struct b53_device *dev;
  1358. dev = devm_kzalloc(base, sizeof(*dev), GFP_KERNEL);
  1359. if (!dev)
  1360. return NULL;
  1361. dev->dev = base;
  1362. dev->ops = ops;
  1363. dev->priv = priv;
  1364. mutex_init(&dev->reg_mutex);
  1365. return dev;
  1366. }
  1367. EXPORT_SYMBOL(b53_swconfig_switch_alloc);
  1368. int b53_swconfig_switch_detect(struct b53_device *dev)
  1369. {
  1370. u32 id32;
  1371. u16 tmp;
  1372. u8 id8;
  1373. int ret;
  1374. ret = b53_read8(dev, B53_MGMT_PAGE, B53_DEVICE_ID, &id8);
  1375. if (ret)
  1376. return ret;
  1377. switch (id8) {
  1378. case 0:
  1379. /*
  1380. * BCM5325 and BCM5365 do not have this register so reads
  1381. * return 0. But the read operation did succeed, so assume
  1382. * this is one of them.
  1383. *
  1384. * Next check if we can write to the 5325's VTA register; for
  1385. * 5365 it is read only.
  1386. */
  1387. b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, 0xf);
  1388. b53_read16(dev, B53_VLAN_PAGE, B53_VLAN_TABLE_ACCESS_25, &tmp);
  1389. if (tmp == 0xf)
  1390. dev->chip_id = BCM5325_DEVICE_ID;
  1391. else
  1392. dev->chip_id = BCM5365_DEVICE_ID;
  1393. break;
  1394. case BCM5395_DEVICE_ID:
  1395. case BCM5397_DEVICE_ID:
  1396. case BCM5398_DEVICE_ID:
  1397. dev->chip_id = id8;
  1398. break;
  1399. default:
  1400. ret = b53_read32(dev, B53_MGMT_PAGE, B53_DEVICE_ID, &id32);
  1401. if (ret)
  1402. return ret;
  1403. switch (id32) {
  1404. case BCM53115_DEVICE_ID:
  1405. case BCM53125_DEVICE_ID:
  1406. case BCM53128_DEVICE_ID:
  1407. case BCM53010_DEVICE_ID:
  1408. case BCM53011_DEVICE_ID:
  1409. case BCM53012_DEVICE_ID:
  1410. case BCM53018_DEVICE_ID:
  1411. case BCM53019_DEVICE_ID:
  1412. dev->chip_id = id32;
  1413. break;
  1414. default:
  1415. pr_err("unsupported switch detected (BCM53%02x/BCM%x)\n",
  1416. id8, id32);
  1417. return -ENODEV;
  1418. }
  1419. }
  1420. if (dev->chip_id == BCM5325_DEVICE_ID)
  1421. return b53_read8(dev, B53_STAT_PAGE, B53_REV_ID_25,
  1422. &dev->core_rev);
  1423. else
  1424. return b53_read8(dev, B53_MGMT_PAGE, B53_REV_ID,
  1425. &dev->core_rev);
  1426. }
  1427. EXPORT_SYMBOL(b53_swconfig_switch_detect);
  1428. int b53_swconfig_switch_register(struct b53_device *dev)
  1429. {
  1430. int ret;
  1431. if (dev->pdata) {
  1432. dev->chip_id = dev->pdata->chip_id;
  1433. dev->enabled_ports = dev->pdata->enabled_ports;
  1434. dev->sw_dev.alias = dev->pdata->alias;
  1435. }
  1436. if (!dev->chip_id && b53_swconfig_switch_detect(dev))
  1437. return -EINVAL;
  1438. ret = b53_switch_init(dev);
  1439. if (ret)
  1440. return ret;
  1441. pr_info("found switch: %s, rev %i\n", dev->sw_dev.name, dev->core_rev);
  1442. return register_switch(&dev->sw_dev, NULL);
  1443. }
  1444. EXPORT_SYMBOL(b53_swconfig_switch_register);
  1445. MODULE_AUTHOR("Jonas Gorski <[email protected]>");
  1446. MODULE_DESCRIPTION("B53 switch library");
  1447. MODULE_LICENSE("Dual BSD/GPL");