b53_common.c 41 KB

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