b53_common.c 41 KB

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