b53_common.c 36 KB

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