b53_common.c 31 KB

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