rtl8366rb.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365
  1. /*
  2. * Platform driver for the Realtek RTL8366RB ethernet switch
  3. *
  4. * Copyright (C) 2009-2010 Gabor Juhos <[email protected]>
  5. * Copyright (C) 2010 Antti Seppälä <[email protected]>
  6. * Copyright (C) 2010 Roman Yeryomin <[email protected]>
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License version 2 as published
  10. * by the Free Software Foundation.
  11. */
  12. #include <linux/kernel.h>
  13. #include <linux/module.h>
  14. #include <linux/init.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/delay.h>
  17. #include <linux/skbuff.h>
  18. #include <linux/rtl8366rb.h>
  19. #include "rtl8366_smi.h"
  20. #define RTL8366RB_DRIVER_DESC "Realtek RTL8366RB ethernet switch driver"
  21. #define RTL8366RB_DRIVER_VER "0.2.3"
  22. #define RTL8366RB_PHY_NO_MAX 4
  23. #define RTL8366RB_PHY_PAGE_MAX 7
  24. #define RTL8366RB_PHY_ADDR_MAX 31
  25. #define RTL8366RB_PHY_WAN 4
  26. /* Switch Global Configuration register */
  27. #define RTL8366RB_SGCR 0x0000
  28. #define RTL8366RB_SGCR_EN_BC_STORM_CTRL BIT(0)
  29. #define RTL8366RB_SGCR_MAX_LENGTH(_x) (_x << 4)
  30. #define RTL8366RB_SGCR_MAX_LENGTH_MASK RTL8366RB_SGCR_MAX_LENGTH(0x3)
  31. #define RTL8366RB_SGCR_MAX_LENGTH_1522 RTL8366RB_SGCR_MAX_LENGTH(0x0)
  32. #define RTL8366RB_SGCR_MAX_LENGTH_1536 RTL8366RB_SGCR_MAX_LENGTH(0x1)
  33. #define RTL8366RB_SGCR_MAX_LENGTH_1552 RTL8366RB_SGCR_MAX_LENGTH(0x2)
  34. #define RTL8366RB_SGCR_MAX_LENGTH_9216 RTL8366RB_SGCR_MAX_LENGTH(0x3)
  35. #define RTL8366RB_SGCR_EN_VLAN BIT(13)
  36. #define RTL8366RB_SGCR_EN_VLAN_4KTB BIT(14)
  37. /* Port Enable Control register */
  38. #define RTL8366RB_PECR 0x0001
  39. /* Switch Security Control registers */
  40. #define RTL8366RB_SSCR0 0x0002
  41. #define RTL8366RB_SSCR1 0x0003
  42. #define RTL8366RB_SSCR2 0x0004
  43. #define RTL8366RB_SSCR2_DROP_UNKNOWN_DA BIT(0)
  44. #define RTL8366RB_RESET_CTRL_REG 0x0100
  45. #define RTL8366RB_CHIP_CTRL_RESET_HW 1
  46. #define RTL8366RB_CHIP_CTRL_RESET_SW (1 << 1)
  47. #define RTL8366RB_CHIP_VERSION_CTRL_REG 0x050A
  48. #define RTL8366RB_CHIP_VERSION_MASK 0xf
  49. #define RTL8366RB_CHIP_ID_REG 0x0509
  50. #define RTL8366RB_CHIP_ID_8366 0x5937
  51. /* PHY registers control */
  52. #define RTL8366RB_PHY_ACCESS_CTRL_REG 0x8000
  53. #define RTL8366RB_PHY_ACCESS_DATA_REG 0x8002
  54. #define RTL8366RB_PHY_CTRL_READ 1
  55. #define RTL8366RB_PHY_CTRL_WRITE 0
  56. #define RTL8366RB_PHY_REG_MASK 0x1f
  57. #define RTL8366RB_PHY_PAGE_OFFSET 5
  58. #define RTL8366RB_PHY_PAGE_MASK (0xf << 5)
  59. #define RTL8366RB_PHY_NO_OFFSET 9
  60. #define RTL8366RB_PHY_NO_MASK (0x1f << 9)
  61. #define RTL8366RB_VLAN_INGRESS_CTRL2_REG 0x037f
  62. /* LED control registers */
  63. #define RTL8366RB_LED_BLINKRATE_REG 0x0430
  64. #define RTL8366RB_LED_BLINKRATE_BIT 0
  65. #define RTL8366RB_LED_BLINKRATE_MASK 0x0007
  66. #define RTL8366RB_LED_CTRL_REG 0x0431
  67. #define RTL8366RB_LED_0_1_CTRL_REG 0x0432
  68. #define RTL8366RB_LED_2_3_CTRL_REG 0x0433
  69. #define RTL8366RB_MIB_COUNT 33
  70. #define RTL8366RB_GLOBAL_MIB_COUNT 1
  71. #define RTL8366RB_MIB_COUNTER_PORT_OFFSET 0x0050
  72. #define RTL8366RB_MIB_COUNTER_BASE 0x1000
  73. #define RTL8366RB_MIB_CTRL_REG 0x13F0
  74. #define RTL8366RB_MIB_CTRL_USER_MASK 0x0FFC
  75. #define RTL8366RB_MIB_CTRL_BUSY_MASK BIT(0)
  76. #define RTL8366RB_MIB_CTRL_RESET_MASK BIT(1)
  77. #define RTL8366RB_MIB_CTRL_PORT_RESET(_p) BIT(2 + (_p))
  78. #define RTL8366RB_MIB_CTRL_GLOBAL_RESET BIT(11)
  79. #define RTL8366RB_PORT_VLAN_CTRL_BASE 0x0063
  80. #define RTL8366RB_PORT_VLAN_CTRL_REG(_p) \
  81. (RTL8366RB_PORT_VLAN_CTRL_BASE + (_p) / 4)
  82. #define RTL8366RB_PORT_VLAN_CTRL_MASK 0xf
  83. #define RTL8366RB_PORT_VLAN_CTRL_SHIFT(_p) (4 * ((_p) % 4))
  84. #define RTL8366RB_VLAN_TABLE_READ_BASE 0x018C
  85. #define RTL8366RB_VLAN_TABLE_WRITE_BASE 0x0185
  86. #define RTL8366RB_TABLE_ACCESS_CTRL_REG 0x0180
  87. #define RTL8366RB_TABLE_VLAN_READ_CTRL 0x0E01
  88. #define RTL8366RB_TABLE_VLAN_WRITE_CTRL 0x0F01
  89. #define RTL8366RB_VLAN_MC_BASE(_x) (0x0020 + (_x) * 3)
  90. #define RTL8366RB_PORT_LINK_STATUS_BASE 0x0014
  91. #define RTL8366RB_PORT_STATUS_SPEED_MASK 0x0003
  92. #define RTL8366RB_PORT_STATUS_DUPLEX_MASK 0x0004
  93. #define RTL8366RB_PORT_STATUS_LINK_MASK 0x0010
  94. #define RTL8366RB_PORT_STATUS_TXPAUSE_MASK 0x0020
  95. #define RTL8366RB_PORT_STATUS_RXPAUSE_MASK 0x0040
  96. #define RTL8366RB_PORT_STATUS_AN_MASK 0x0080
  97. #define RTL8366RB_PORT_NUM_CPU 5
  98. #define RTL8366RB_NUM_PORTS 6
  99. #define RTL8366RB_NUM_VLANS 16
  100. #define RTL8366RB_NUM_LEDGROUPS 4
  101. #define RTL8366RB_NUM_VIDS 4096
  102. #define RTL8366RB_PRIORITYMAX 7
  103. #define RTL8366RB_FIDMAX 7
  104. #define RTL8366RB_PORT_1 (1 << 0) /* In userspace port 0 */
  105. #define RTL8366RB_PORT_2 (1 << 1) /* In userspace port 1 */
  106. #define RTL8366RB_PORT_3 (1 << 2) /* In userspace port 2 */
  107. #define RTL8366RB_PORT_4 (1 << 3) /* In userspace port 3 */
  108. #define RTL8366RB_PORT_5 (1 << 4) /* In userspace port 4 */
  109. #define RTL8366RB_PORT_CPU (1 << 5) /* CPU port */
  110. #define RTL8366RB_PORT_ALL (RTL8366RB_PORT_1 | \
  111. RTL8366RB_PORT_2 | \
  112. RTL8366RB_PORT_3 | \
  113. RTL8366RB_PORT_4 | \
  114. RTL8366RB_PORT_5 | \
  115. RTL8366RB_PORT_CPU)
  116. #define RTL8366RB_PORT_ALL_BUT_CPU (RTL8366RB_PORT_1 | \
  117. RTL8366RB_PORT_2 | \
  118. RTL8366RB_PORT_3 | \
  119. RTL8366RB_PORT_4 | \
  120. RTL8366RB_PORT_5)
  121. #define RTL8366RB_PORT_ALL_EXTERNAL (RTL8366RB_PORT_1 | \
  122. RTL8366RB_PORT_2 | \
  123. RTL8366RB_PORT_3 | \
  124. RTL8366RB_PORT_4)
  125. #define RTL8366RB_PORT_ALL_INTERNAL RTL8366RB_PORT_CPU
  126. #define RTL8366RB_VLAN_VID_MASK 0xfff
  127. #define RTL8366RB_VLAN_PRIORITY_SHIFT 12
  128. #define RTL8366RB_VLAN_PRIORITY_MASK 0x7
  129. #define RTL8366RB_VLAN_UNTAG_SHIFT 8
  130. #define RTL8366RB_VLAN_UNTAG_MASK 0xff
  131. #define RTL8366RB_VLAN_MEMBER_MASK 0xff
  132. #define RTL8366RB_VLAN_FID_MASK 0x7
  133. /* Port ingress bandwidth control */
  134. #define RTL8366RB_IB_BASE 0x0200
  135. #define RTL8366RB_IB_REG(pnum) (RTL8366RB_IB_BASE + pnum)
  136. #define RTL8366RB_IB_BDTH_MASK 0x3fff
  137. #define RTL8366RB_IB_PREIFG_OFFSET 14
  138. #define RTL8366RB_IB_PREIFG_MASK (1 << RTL8366RB_IB_PREIFG_OFFSET)
  139. /* Port egress bandwidth control */
  140. #define RTL8366RB_EB_BASE 0x02d1
  141. #define RTL8366RB_EB_REG(pnum) (RTL8366RB_EB_BASE + pnum)
  142. #define RTL8366RB_EB_BDTH_MASK 0x3fff
  143. #define RTL8366RB_EB_PREIFG_REG 0x02f8
  144. #define RTL8366RB_EB_PREIFG_OFFSET 9
  145. #define RTL8366RB_EB_PREIFG_MASK (1 << RTL8366RB_EB_PREIFG_OFFSET)
  146. #define RTL8366RB_BDTH_SW_MAX 1048512
  147. #define RTL8366RB_BDTH_UNIT 64
  148. #define RTL8366RB_BDTH_REG_DEFAULT 16383
  149. /* QOS */
  150. #define RTL8366RB_QOS_BIT 15
  151. #define RTL8366RB_QOS_MASK (1 << RTL8366RB_QOS_BIT)
  152. /* Include/Exclude Preamble and IFG (20 bytes). 0:Exclude, 1:Include. */
  153. #define RTL8366RB_QOS_DEFAULT_PREIFG 1
  154. static struct rtl8366_mib_counter rtl8366rb_mib_counters[] = {
  155. { 0, 0, 4, "IfInOctets" },
  156. { 0, 4, 4, "EtherStatsOctets" },
  157. { 0, 8, 2, "EtherStatsUnderSizePkts" },
  158. { 0, 10, 2, "EtherFragments" },
  159. { 0, 12, 2, "EtherStatsPkts64Octets" },
  160. { 0, 14, 2, "EtherStatsPkts65to127Octets" },
  161. { 0, 16, 2, "EtherStatsPkts128to255Octets" },
  162. { 0, 18, 2, "EtherStatsPkts256to511Octets" },
  163. { 0, 20, 2, "EtherStatsPkts512to1023Octets" },
  164. { 0, 22, 2, "EtherStatsPkts1024to1518Octets" },
  165. { 0, 24, 2, "EtherOversizeStats" },
  166. { 0, 26, 2, "EtherStatsJabbers" },
  167. { 0, 28, 2, "IfInUcastPkts" },
  168. { 0, 30, 2, "EtherStatsMulticastPkts" },
  169. { 0, 32, 2, "EtherStatsBroadcastPkts" },
  170. { 0, 34, 2, "EtherStatsDropEvents" },
  171. { 0, 36, 2, "Dot3StatsFCSErrors" },
  172. { 0, 38, 2, "Dot3StatsSymbolErrors" },
  173. { 0, 40, 2, "Dot3InPauseFrames" },
  174. { 0, 42, 2, "Dot3ControlInUnknownOpcodes" },
  175. { 0, 44, 4, "IfOutOctets" },
  176. { 0, 48, 2, "Dot3StatsSingleCollisionFrames" },
  177. { 0, 50, 2, "Dot3StatMultipleCollisionFrames" },
  178. { 0, 52, 2, "Dot3sDeferredTransmissions" },
  179. { 0, 54, 2, "Dot3StatsLateCollisions" },
  180. { 0, 56, 2, "EtherStatsCollisions" },
  181. { 0, 58, 2, "Dot3StatsExcessiveCollisions" },
  182. { 0, 60, 2, "Dot3OutPauseFrames" },
  183. { 0, 62, 2, "Dot1dBasePortDelayExceededDiscards" },
  184. { 0, 64, 2, "Dot1dTpPortInDiscards" },
  185. { 0, 66, 2, "IfOutUcastPkts" },
  186. { 0, 68, 2, "IfOutMulticastPkts" },
  187. { 0, 70, 2, "IfOutBroadcastPkts" },
  188. };
  189. #define REG_WR(_smi, _reg, _val) \
  190. do { \
  191. err = rtl8366_smi_write_reg(_smi, _reg, _val); \
  192. if (err) \
  193. return err; \
  194. } while (0)
  195. #define REG_RMW(_smi, _reg, _mask, _val) \
  196. do { \
  197. err = rtl8366_smi_rmwr(_smi, _reg, _mask, _val); \
  198. if (err) \
  199. return err; \
  200. } while (0)
  201. static int rtl8366rb_reset_chip(struct rtl8366_smi *smi)
  202. {
  203. int timeout = 10;
  204. u32 data;
  205. rtl8366_smi_write_reg(smi, RTL8366RB_RESET_CTRL_REG,
  206. RTL8366RB_CHIP_CTRL_RESET_HW);
  207. do {
  208. msleep(1);
  209. if (rtl8366_smi_read_reg(smi, RTL8366RB_RESET_CTRL_REG, &data))
  210. return -EIO;
  211. if (!(data & RTL8366RB_CHIP_CTRL_RESET_HW))
  212. break;
  213. } while (--timeout);
  214. if (!timeout) {
  215. printk("Timeout waiting for the switch to reset\n");
  216. return -EIO;
  217. }
  218. return 0;
  219. }
  220. static int rtl8366rb_hw_init(struct rtl8366_smi *smi)
  221. {
  222. int err;
  223. /* set maximum packet length to 1536 bytes */
  224. REG_RMW(smi, RTL8366RB_SGCR, RTL8366RB_SGCR_MAX_LENGTH_MASK,
  225. RTL8366RB_SGCR_MAX_LENGTH_1536);
  226. /* enable all ports */
  227. REG_WR(smi, RTL8366RB_PECR, 0);
  228. /* enable learning for all ports */
  229. REG_WR(smi, RTL8366RB_SSCR0, 0);
  230. /* enable auto ageing for all ports */
  231. REG_WR(smi, RTL8366RB_SSCR1, 0);
  232. /*
  233. * discard VLAN tagged packets if the port is not a member of
  234. * the VLAN with which the packets is associated.
  235. */
  236. REG_WR(smi, RTL8366RB_VLAN_INGRESS_CTRL2_REG, RTL8366RB_PORT_ALL);
  237. /* don't drop packets whose DA has not been learned */
  238. REG_RMW(smi, RTL8366RB_SSCR2, RTL8366RB_SSCR2_DROP_UNKNOWN_DA, 0);
  239. return 0;
  240. }
  241. static int rtl8366rb_read_phy_reg(struct rtl8366_smi *smi,
  242. u32 phy_no, u32 page, u32 addr, u32 *data)
  243. {
  244. u32 reg;
  245. int ret;
  246. if (phy_no > RTL8366RB_PHY_NO_MAX)
  247. return -EINVAL;
  248. if (page > RTL8366RB_PHY_PAGE_MAX)
  249. return -EINVAL;
  250. if (addr > RTL8366RB_PHY_ADDR_MAX)
  251. return -EINVAL;
  252. ret = rtl8366_smi_write_reg(smi, RTL8366RB_PHY_ACCESS_CTRL_REG,
  253. RTL8366RB_PHY_CTRL_READ);
  254. if (ret)
  255. return ret;
  256. reg = 0x8000 | (1 << (phy_no + RTL8366RB_PHY_NO_OFFSET)) |
  257. ((page << RTL8366RB_PHY_PAGE_OFFSET) & RTL8366RB_PHY_PAGE_MASK) |
  258. (addr & RTL8366RB_PHY_REG_MASK);
  259. ret = rtl8366_smi_write_reg(smi, reg, 0);
  260. if (ret)
  261. return ret;
  262. ret = rtl8366_smi_read_reg(smi, RTL8366RB_PHY_ACCESS_DATA_REG, data);
  263. if (ret)
  264. return ret;
  265. return 0;
  266. }
  267. static int rtl8366rb_write_phy_reg(struct rtl8366_smi *smi,
  268. u32 phy_no, u32 page, u32 addr, u32 data)
  269. {
  270. u32 reg;
  271. int ret;
  272. if (phy_no > RTL8366RB_PHY_NO_MAX)
  273. return -EINVAL;
  274. if (page > RTL8366RB_PHY_PAGE_MAX)
  275. return -EINVAL;
  276. if (addr > RTL8366RB_PHY_ADDR_MAX)
  277. return -EINVAL;
  278. ret = rtl8366_smi_write_reg(smi, RTL8366RB_PHY_ACCESS_CTRL_REG,
  279. RTL8366RB_PHY_CTRL_WRITE);
  280. if (ret)
  281. return ret;
  282. reg = 0x8000 | (1 << (phy_no + RTL8366RB_PHY_NO_OFFSET)) |
  283. ((page << RTL8366RB_PHY_PAGE_OFFSET) & RTL8366RB_PHY_PAGE_MASK) |
  284. (addr & RTL8366RB_PHY_REG_MASK);
  285. ret = rtl8366_smi_write_reg(smi, reg, data);
  286. if (ret)
  287. return ret;
  288. return 0;
  289. }
  290. static int rtl8366rb_get_mib_counter(struct rtl8366_smi *smi, int counter,
  291. int port, unsigned long long *val)
  292. {
  293. int i;
  294. int err;
  295. u32 addr, data;
  296. u64 mibvalue;
  297. if (port > RTL8366RB_NUM_PORTS || counter >= RTL8366RB_MIB_COUNT)
  298. return -EINVAL;
  299. addr = RTL8366RB_MIB_COUNTER_BASE +
  300. RTL8366RB_MIB_COUNTER_PORT_OFFSET * (port) +
  301. rtl8366rb_mib_counters[counter].offset;
  302. /*
  303. * Writing access counter address first
  304. * then ASIC will prepare 64bits counter wait for being retrived
  305. */
  306. data = 0; /* writing data will be discard by ASIC */
  307. err = rtl8366_smi_write_reg(smi, addr, data);
  308. if (err)
  309. return err;
  310. /* read MIB control register */
  311. err = rtl8366_smi_read_reg(smi, RTL8366RB_MIB_CTRL_REG, &data);
  312. if (err)
  313. return err;
  314. if (data & RTL8366RB_MIB_CTRL_BUSY_MASK)
  315. return -EBUSY;
  316. if (data & RTL8366RB_MIB_CTRL_RESET_MASK)
  317. return -EIO;
  318. mibvalue = 0;
  319. for (i = rtl8366rb_mib_counters[counter].length; i > 0; i--) {
  320. err = rtl8366_smi_read_reg(smi, addr + (i - 1), &data);
  321. if (err)
  322. return err;
  323. mibvalue = (mibvalue << 16) | (data & 0xFFFF);
  324. }
  325. *val = mibvalue;
  326. return 0;
  327. }
  328. static int rtl8366rb_get_vlan_4k(struct rtl8366_smi *smi, u32 vid,
  329. struct rtl8366_vlan_4k *vlan4k)
  330. {
  331. u32 data[3];
  332. int err;
  333. int i;
  334. memset(vlan4k, '\0', sizeof(struct rtl8366_vlan_4k));
  335. if (vid >= RTL8366RB_NUM_VIDS)
  336. return -EINVAL;
  337. /* write VID */
  338. err = rtl8366_smi_write_reg(smi, RTL8366RB_VLAN_TABLE_WRITE_BASE,
  339. vid & RTL8366RB_VLAN_VID_MASK);
  340. if (err)
  341. return err;
  342. /* write table access control word */
  343. err = rtl8366_smi_write_reg(smi, RTL8366RB_TABLE_ACCESS_CTRL_REG,
  344. RTL8366RB_TABLE_VLAN_READ_CTRL);
  345. if (err)
  346. return err;
  347. for (i = 0; i < 3; i++) {
  348. err = rtl8366_smi_read_reg(smi,
  349. RTL8366RB_VLAN_TABLE_READ_BASE + i,
  350. &data[i]);
  351. if (err)
  352. return err;
  353. }
  354. vlan4k->vid = vid;
  355. vlan4k->untag = (data[1] >> RTL8366RB_VLAN_UNTAG_SHIFT) &
  356. RTL8366RB_VLAN_UNTAG_MASK;
  357. vlan4k->member = data[1] & RTL8366RB_VLAN_MEMBER_MASK;
  358. vlan4k->fid = data[2] & RTL8366RB_VLAN_FID_MASK;
  359. return 0;
  360. }
  361. static int rtl8366rb_set_vlan_4k(struct rtl8366_smi *smi,
  362. const struct rtl8366_vlan_4k *vlan4k)
  363. {
  364. u32 data[3];
  365. int err;
  366. int i;
  367. if (vlan4k->vid >= RTL8366RB_NUM_VIDS ||
  368. vlan4k->member > RTL8366RB_VLAN_MEMBER_MASK ||
  369. vlan4k->untag > RTL8366RB_VLAN_UNTAG_MASK ||
  370. vlan4k->fid > RTL8366RB_FIDMAX)
  371. return -EINVAL;
  372. data[0] = vlan4k->vid & RTL8366RB_VLAN_VID_MASK;
  373. data[1] = (vlan4k->member & RTL8366RB_VLAN_MEMBER_MASK) |
  374. ((vlan4k->untag & RTL8366RB_VLAN_UNTAG_MASK) <<
  375. RTL8366RB_VLAN_UNTAG_SHIFT);
  376. data[2] = vlan4k->fid & RTL8366RB_VLAN_FID_MASK;
  377. for (i = 0; i < 3; i++) {
  378. err = rtl8366_smi_write_reg(smi,
  379. RTL8366RB_VLAN_TABLE_WRITE_BASE + i,
  380. data[i]);
  381. if (err)
  382. return err;
  383. }
  384. /* write table access control word */
  385. err = rtl8366_smi_write_reg(smi, RTL8366RB_TABLE_ACCESS_CTRL_REG,
  386. RTL8366RB_TABLE_VLAN_WRITE_CTRL);
  387. return err;
  388. }
  389. static int rtl8366rb_get_vlan_mc(struct rtl8366_smi *smi, u32 index,
  390. struct rtl8366_vlan_mc *vlanmc)
  391. {
  392. u32 data[3];
  393. int err;
  394. int i;
  395. memset(vlanmc, '\0', sizeof(struct rtl8366_vlan_mc));
  396. if (index >= RTL8366RB_NUM_VLANS)
  397. return -EINVAL;
  398. for (i = 0; i < 3; i++) {
  399. err = rtl8366_smi_read_reg(smi,
  400. RTL8366RB_VLAN_MC_BASE(index) + i,
  401. &data[i]);
  402. if (err)
  403. return err;
  404. }
  405. vlanmc->vid = data[0] & RTL8366RB_VLAN_VID_MASK;
  406. vlanmc->priority = (data[0] >> RTL8366RB_VLAN_PRIORITY_SHIFT) &
  407. RTL8366RB_VLAN_PRIORITY_MASK;
  408. vlanmc->untag = (data[1] >> RTL8366RB_VLAN_UNTAG_SHIFT) &
  409. RTL8366RB_VLAN_UNTAG_MASK;
  410. vlanmc->member = data[1] & RTL8366RB_VLAN_MEMBER_MASK;
  411. vlanmc->fid = data[2] & RTL8366RB_VLAN_FID_MASK;
  412. return 0;
  413. }
  414. static int rtl8366rb_set_vlan_mc(struct rtl8366_smi *smi, u32 index,
  415. const struct rtl8366_vlan_mc *vlanmc)
  416. {
  417. u32 data[3];
  418. int err;
  419. int i;
  420. if (index >= RTL8366RB_NUM_VLANS ||
  421. vlanmc->vid >= RTL8366RB_NUM_VIDS ||
  422. vlanmc->priority > RTL8366RB_PRIORITYMAX ||
  423. vlanmc->member > RTL8366RB_VLAN_MEMBER_MASK ||
  424. vlanmc->untag > RTL8366RB_VLAN_UNTAG_MASK ||
  425. vlanmc->fid > RTL8366RB_FIDMAX)
  426. return -EINVAL;
  427. data[0] = (vlanmc->vid & RTL8366RB_VLAN_VID_MASK) |
  428. ((vlanmc->priority & RTL8366RB_VLAN_PRIORITY_MASK) <<
  429. RTL8366RB_VLAN_PRIORITY_SHIFT);
  430. data[1] = (vlanmc->member & RTL8366RB_VLAN_MEMBER_MASK) |
  431. ((vlanmc->untag & RTL8366RB_VLAN_UNTAG_MASK) <<
  432. RTL8366RB_VLAN_UNTAG_SHIFT);
  433. data[2] = vlanmc->fid & RTL8366RB_VLAN_FID_MASK;
  434. for (i = 0; i < 3; i++) {
  435. err = rtl8366_smi_write_reg(smi,
  436. RTL8366RB_VLAN_MC_BASE(index) + i,
  437. data[i]);
  438. if (err)
  439. return err;
  440. }
  441. return 0;
  442. }
  443. static int rtl8366rb_get_mc_index(struct rtl8366_smi *smi, int port, int *val)
  444. {
  445. u32 data;
  446. int err;
  447. if (port >= RTL8366RB_NUM_PORTS)
  448. return -EINVAL;
  449. err = rtl8366_smi_read_reg(smi, RTL8366RB_PORT_VLAN_CTRL_REG(port),
  450. &data);
  451. if (err)
  452. return err;
  453. *val = (data >> RTL8366RB_PORT_VLAN_CTRL_SHIFT(port)) &
  454. RTL8366RB_PORT_VLAN_CTRL_MASK;
  455. return 0;
  456. }
  457. static int rtl8366rb_set_mc_index(struct rtl8366_smi *smi, int port, int index)
  458. {
  459. if (port >= RTL8366RB_NUM_PORTS || index >= RTL8366RB_NUM_VLANS)
  460. return -EINVAL;
  461. return rtl8366_smi_rmwr(smi, RTL8366RB_PORT_VLAN_CTRL_REG(port),
  462. RTL8366RB_PORT_VLAN_CTRL_MASK <<
  463. RTL8366RB_PORT_VLAN_CTRL_SHIFT(port),
  464. (index & RTL8366RB_PORT_VLAN_CTRL_MASK) <<
  465. RTL8366RB_PORT_VLAN_CTRL_SHIFT(port));
  466. }
  467. static int rtl8366rb_is_vlan_valid(struct rtl8366_smi *smi, unsigned vlan)
  468. {
  469. unsigned max = RTL8366RB_NUM_VLANS;
  470. if (smi->vlan4k_enabled)
  471. max = RTL8366RB_NUM_VIDS - 1;
  472. if (vlan == 0 || vlan >= max)
  473. return 0;
  474. return 1;
  475. }
  476. static int rtl8366rb_enable_vlan(struct rtl8366_smi *smi, int enable)
  477. {
  478. return rtl8366_smi_rmwr(smi, RTL8366RB_SGCR, RTL8366RB_SGCR_EN_VLAN,
  479. (enable) ? RTL8366RB_SGCR_EN_VLAN : 0);
  480. }
  481. static int rtl8366rb_enable_vlan4k(struct rtl8366_smi *smi, int enable)
  482. {
  483. return rtl8366_smi_rmwr(smi, RTL8366RB_SGCR,
  484. RTL8366RB_SGCR_EN_VLAN_4KTB,
  485. (enable) ? RTL8366RB_SGCR_EN_VLAN_4KTB : 0);
  486. }
  487. static int rtl8366rb_enable_port(struct rtl8366_smi *smi, int port, int enable)
  488. {
  489. return rtl8366_smi_rmwr(smi, RTL8366RB_PECR, (1 << port),
  490. (enable) ? 0 : (1 << port));
  491. }
  492. static int rtl8366rb_sw_reset_mibs(struct switch_dev *dev,
  493. const struct switch_attr *attr,
  494. struct switch_val *val)
  495. {
  496. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  497. return rtl8366_smi_rmwr(smi, RTL8366RB_MIB_CTRL_REG, 0,
  498. RTL8366RB_MIB_CTRL_GLOBAL_RESET);
  499. }
  500. static int rtl8366rb_sw_get_blinkrate(struct switch_dev *dev,
  501. const struct switch_attr *attr,
  502. struct switch_val *val)
  503. {
  504. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  505. u32 data;
  506. rtl8366_smi_read_reg(smi, RTL8366RB_LED_BLINKRATE_REG, &data);
  507. val->value.i = (data & (RTL8366RB_LED_BLINKRATE_MASK));
  508. return 0;
  509. }
  510. static int rtl8366rb_sw_set_blinkrate(struct switch_dev *dev,
  511. const struct switch_attr *attr,
  512. struct switch_val *val)
  513. {
  514. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  515. if (val->value.i >= 6)
  516. return -EINVAL;
  517. return rtl8366_smi_rmwr(smi, RTL8366RB_LED_BLINKRATE_REG,
  518. RTL8366RB_LED_BLINKRATE_MASK,
  519. val->value.i);
  520. }
  521. static int rtl8366rb_sw_get_learning_enable(struct switch_dev *dev,
  522. const struct switch_attr *attr,
  523. struct switch_val *val)
  524. {
  525. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  526. u32 data;
  527. rtl8366_smi_read_reg(smi, RTL8366RB_SSCR0, &data);
  528. val->value.i = !data;
  529. return 0;
  530. }
  531. static int rtl8366rb_sw_set_learning_enable(struct switch_dev *dev,
  532. const struct switch_attr *attr,
  533. struct switch_val *val)
  534. {
  535. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  536. u32 portmask = 0;
  537. int err = 0;
  538. if (!val->value.i)
  539. portmask = RTL8366RB_PORT_ALL;
  540. /* set learning for all ports */
  541. REG_WR(smi, RTL8366RB_SSCR0, portmask);
  542. /* set auto ageing for all ports */
  543. REG_WR(smi, RTL8366RB_SSCR1, portmask);
  544. return 0;
  545. }
  546. static const char *rtl8366rb_speed_str(unsigned speed)
  547. {
  548. switch (speed) {
  549. case 0:
  550. return "10baseT";
  551. case 1:
  552. return "100baseT";
  553. case 2:
  554. return "1000baseT";
  555. }
  556. return "unknown";
  557. }
  558. static int rtl8366rb_sw_get_port_link(struct switch_dev *dev,
  559. const struct switch_attr *attr,
  560. struct switch_val *val)
  561. {
  562. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  563. u32 len = 0, data = 0;
  564. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  565. return -EINVAL;
  566. memset(smi->buf, '\0', sizeof(smi->buf));
  567. rtl8366_smi_read_reg(smi, RTL8366RB_PORT_LINK_STATUS_BASE +
  568. (val->port_vlan / 2), &data);
  569. if (val->port_vlan % 2)
  570. data = data >> 8;
  571. if (data & RTL8366RB_PORT_STATUS_LINK_MASK) {
  572. len = snprintf(smi->buf, sizeof(smi->buf),
  573. "port:%d link:up speed:%s %s-duplex %s%s%s",
  574. val->port_vlan,
  575. rtl8366rb_speed_str(data &
  576. RTL8366RB_PORT_STATUS_SPEED_MASK),
  577. (data & RTL8366RB_PORT_STATUS_DUPLEX_MASK) ?
  578. "full" : "half",
  579. (data & RTL8366RB_PORT_STATUS_TXPAUSE_MASK) ?
  580. "tx-pause ": "",
  581. (data & RTL8366RB_PORT_STATUS_RXPAUSE_MASK) ?
  582. "rx-pause " : "",
  583. (data & RTL8366RB_PORT_STATUS_AN_MASK) ?
  584. "nway ": "");
  585. } else {
  586. len = snprintf(smi->buf, sizeof(smi->buf), "port:%d link: down",
  587. val->port_vlan);
  588. }
  589. val->value.s = smi->buf;
  590. val->len = len;
  591. return 0;
  592. }
  593. static int rtl8366rb_sw_set_port_led(struct switch_dev *dev,
  594. const struct switch_attr *attr,
  595. struct switch_val *val)
  596. {
  597. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  598. u32 data;
  599. u32 mask;
  600. u32 reg;
  601. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  602. return -EINVAL;
  603. if (val->port_vlan == RTL8366RB_PORT_NUM_CPU) {
  604. reg = RTL8366RB_LED_BLINKRATE_REG;
  605. mask = 0xF << 4;
  606. data = val->value.i << 4;
  607. } else {
  608. reg = RTL8366RB_LED_CTRL_REG;
  609. mask = 0xF << (val->port_vlan * 4),
  610. data = val->value.i << (val->port_vlan * 4);
  611. }
  612. return rtl8366_smi_rmwr(smi, reg, mask, data);
  613. }
  614. static int rtl8366rb_sw_get_port_led(struct switch_dev *dev,
  615. const struct switch_attr *attr,
  616. struct switch_val *val)
  617. {
  618. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  619. u32 data = 0;
  620. if (val->port_vlan >= RTL8366RB_NUM_LEDGROUPS)
  621. return -EINVAL;
  622. rtl8366_smi_read_reg(smi, RTL8366RB_LED_CTRL_REG, &data);
  623. val->value.i = (data >> (val->port_vlan * 4)) & 0x000F;
  624. return 0;
  625. }
  626. static int rtl8366rb_sw_set_port_disable(struct switch_dev *dev,
  627. const struct switch_attr *attr,
  628. struct switch_val *val)
  629. {
  630. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  631. u32 mask, data;
  632. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  633. return -EINVAL;
  634. mask = 1 << val->port_vlan ;
  635. if (val->value.i)
  636. data = mask;
  637. else
  638. data = 0;
  639. return rtl8366_smi_rmwr(smi, RTL8366RB_PECR, mask, data);
  640. }
  641. static int rtl8366rb_sw_get_port_disable(struct switch_dev *dev,
  642. const struct switch_attr *attr,
  643. struct switch_val *val)
  644. {
  645. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  646. u32 data;
  647. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  648. return -EINVAL;
  649. rtl8366_smi_read_reg(smi, RTL8366RB_PECR, &data);
  650. if (data & (1 << val->port_vlan))
  651. val->value.i = 1;
  652. else
  653. val->value.i = 0;
  654. return 0;
  655. }
  656. static int rtl8366rb_sw_set_port_rate_in(struct switch_dev *dev,
  657. const struct switch_attr *attr,
  658. struct switch_val *val)
  659. {
  660. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  661. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  662. return -EINVAL;
  663. if (val->value.i > 0 && val->value.i < RTL8366RB_BDTH_SW_MAX)
  664. val->value.i = (val->value.i - 1) / RTL8366RB_BDTH_UNIT;
  665. else
  666. val->value.i = RTL8366RB_BDTH_REG_DEFAULT;
  667. return rtl8366_smi_rmwr(smi, RTL8366RB_IB_REG(val->port_vlan),
  668. RTL8366RB_IB_BDTH_MASK | RTL8366RB_IB_PREIFG_MASK,
  669. val->value.i |
  670. (RTL8366RB_QOS_DEFAULT_PREIFG << RTL8366RB_IB_PREIFG_OFFSET));
  671. }
  672. static int rtl8366rb_sw_get_port_rate_in(struct switch_dev *dev,
  673. const struct switch_attr *attr,
  674. struct switch_val *val)
  675. {
  676. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  677. u32 data;
  678. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  679. return -EINVAL;
  680. rtl8366_smi_read_reg(smi, RTL8366RB_IB_REG(val->port_vlan), &data);
  681. data &= RTL8366RB_IB_BDTH_MASK;
  682. if (data < RTL8366RB_IB_BDTH_MASK)
  683. data += 1;
  684. val->value.i = (int)data * RTL8366RB_BDTH_UNIT;
  685. return 0;
  686. }
  687. static int rtl8366rb_sw_set_port_rate_out(struct switch_dev *dev,
  688. const struct switch_attr *attr,
  689. struct switch_val *val)
  690. {
  691. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  692. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  693. return -EINVAL;
  694. rtl8366_smi_rmwr(smi, RTL8366RB_EB_PREIFG_REG,
  695. RTL8366RB_EB_PREIFG_MASK,
  696. (RTL8366RB_QOS_DEFAULT_PREIFG << RTL8366RB_EB_PREIFG_OFFSET));
  697. if (val->value.i > 0 && val->value.i < RTL8366RB_BDTH_SW_MAX)
  698. val->value.i = (val->value.i - 1) / RTL8366RB_BDTH_UNIT;
  699. else
  700. val->value.i = RTL8366RB_BDTH_REG_DEFAULT;
  701. return rtl8366_smi_rmwr(smi, RTL8366RB_EB_REG(val->port_vlan),
  702. RTL8366RB_EB_BDTH_MASK, val->value.i );
  703. }
  704. static int rtl8366rb_sw_get_port_rate_out(struct switch_dev *dev,
  705. const struct switch_attr *attr,
  706. struct switch_val *val)
  707. {
  708. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  709. u32 data;
  710. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  711. return -EINVAL;
  712. rtl8366_smi_read_reg(smi, RTL8366RB_EB_REG(val->port_vlan), &data);
  713. data &= RTL8366RB_EB_BDTH_MASK;
  714. if (data < RTL8366RB_EB_BDTH_MASK)
  715. data += 1;
  716. val->value.i = (int)data * RTL8366RB_BDTH_UNIT;
  717. return 0;
  718. }
  719. static int rtl8366rb_sw_set_qos_enable(struct switch_dev *dev,
  720. const struct switch_attr *attr,
  721. struct switch_val *val)
  722. {
  723. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  724. u32 data;
  725. if (val->value.i)
  726. data = RTL8366RB_QOS_MASK;
  727. else
  728. data = 0;
  729. return rtl8366_smi_rmwr(smi, RTL8366RB_SGCR, RTL8366RB_QOS_MASK, data);
  730. }
  731. static int rtl8366rb_sw_get_qos_enable(struct switch_dev *dev,
  732. const struct switch_attr *attr,
  733. struct switch_val *val)
  734. {
  735. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  736. u32 data;
  737. rtl8366_smi_read_reg(smi, RTL8366RB_SGCR, &data);
  738. if (data & RTL8366RB_QOS_MASK)
  739. val->value.i = 1;
  740. else
  741. val->value.i = 0;
  742. return 0;
  743. }
  744. static int rtl8366rb_sw_reset_port_mibs(struct switch_dev *dev,
  745. const struct switch_attr *attr,
  746. struct switch_val *val)
  747. {
  748. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  749. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  750. return -EINVAL;
  751. return rtl8366_smi_rmwr(smi, RTL8366RB_MIB_CTRL_REG, 0,
  752. RTL8366RB_MIB_CTRL_PORT_RESET(val->port_vlan));
  753. }
  754. static int rtl8366rb_sw_reset_switch(struct switch_dev *dev)
  755. {
  756. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  757. int err;
  758. err = rtl8366rb_reset_chip(smi);
  759. if (err)
  760. return err;
  761. err = rtl8366rb_hw_init(smi);
  762. if (err)
  763. return err;
  764. return rtl8366_reset_vlan(smi);
  765. }
  766. static struct switch_attr rtl8366rb_globals[] = {
  767. {
  768. .type = SWITCH_TYPE_INT,
  769. .name = "enable_learning",
  770. .description = "Enable learning, enable aging",
  771. .set = rtl8366rb_sw_set_learning_enable,
  772. .get = rtl8366rb_sw_get_learning_enable,
  773. .max = 1
  774. }, {
  775. .type = SWITCH_TYPE_INT,
  776. .name = "enable_vlan",
  777. .description = "Enable VLAN mode",
  778. .set = rtl8366_sw_set_vlan_enable,
  779. .get = rtl8366_sw_get_vlan_enable,
  780. .max = 1,
  781. .ofs = 1
  782. }, {
  783. .type = SWITCH_TYPE_INT,
  784. .name = "enable_vlan4k",
  785. .description = "Enable VLAN 4K mode",
  786. .set = rtl8366_sw_set_vlan_enable,
  787. .get = rtl8366_sw_get_vlan_enable,
  788. .max = 1,
  789. .ofs = 2
  790. }, {
  791. .type = SWITCH_TYPE_NOVAL,
  792. .name = "reset_mibs",
  793. .description = "Reset all MIB counters",
  794. .set = rtl8366rb_sw_reset_mibs,
  795. }, {
  796. .type = SWITCH_TYPE_INT,
  797. .name = "blinkrate",
  798. .description = "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
  799. " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
  800. .set = rtl8366rb_sw_set_blinkrate,
  801. .get = rtl8366rb_sw_get_blinkrate,
  802. .max = 5
  803. }, {
  804. .type = SWITCH_TYPE_INT,
  805. .name = "enable_qos",
  806. .description = "Enable QOS",
  807. .set = rtl8366rb_sw_set_qos_enable,
  808. .get = rtl8366rb_sw_get_qos_enable,
  809. .max = 1
  810. },
  811. };
  812. static struct switch_attr rtl8366rb_port[] = {
  813. {
  814. .type = SWITCH_TYPE_STRING,
  815. .name = "link",
  816. .description = "Get port link information",
  817. .max = 1,
  818. .set = NULL,
  819. .get = rtl8366rb_sw_get_port_link,
  820. }, {
  821. .type = SWITCH_TYPE_NOVAL,
  822. .name = "reset_mib",
  823. .description = "Reset single port MIB counters",
  824. .set = rtl8366rb_sw_reset_port_mibs,
  825. }, {
  826. .type = SWITCH_TYPE_STRING,
  827. .name = "mib",
  828. .description = "Get MIB counters for port",
  829. .max = 33,
  830. .set = NULL,
  831. .get = rtl8366_sw_get_port_mib,
  832. }, {
  833. .type = SWITCH_TYPE_INT,
  834. .name = "led",
  835. .description = "Get/Set port group (0 - 3) led mode (0 - 15)",
  836. .max = 15,
  837. .set = rtl8366rb_sw_set_port_led,
  838. .get = rtl8366rb_sw_get_port_led,
  839. }, {
  840. .type = SWITCH_TYPE_INT,
  841. .name = "disable",
  842. .description = "Get/Set port state (enabled or disabled)",
  843. .max = 1,
  844. .set = rtl8366rb_sw_set_port_disable,
  845. .get = rtl8366rb_sw_get_port_disable,
  846. }, {
  847. .type = SWITCH_TYPE_INT,
  848. .name = "rate_in",
  849. .description = "Get/Set port ingress (incoming) bandwidth limit in kbps",
  850. .max = RTL8366RB_BDTH_SW_MAX,
  851. .set = rtl8366rb_sw_set_port_rate_in,
  852. .get = rtl8366rb_sw_get_port_rate_in,
  853. }, {
  854. .type = SWITCH_TYPE_INT,
  855. .name = "rate_out",
  856. .description = "Get/Set port egress (outgoing) bandwidth limit in kbps",
  857. .max = RTL8366RB_BDTH_SW_MAX,
  858. .set = rtl8366rb_sw_set_port_rate_out,
  859. .get = rtl8366rb_sw_get_port_rate_out,
  860. },
  861. };
  862. static struct switch_attr rtl8366rb_vlan[] = {
  863. {
  864. .type = SWITCH_TYPE_STRING,
  865. .name = "info",
  866. .description = "Get vlan information",
  867. .max = 1,
  868. .set = NULL,
  869. .get = rtl8366_sw_get_vlan_info,
  870. }, {
  871. .type = SWITCH_TYPE_INT,
  872. .name = "fid",
  873. .description = "Get/Set vlan FID",
  874. .max = RTL8366RB_FIDMAX,
  875. .set = rtl8366_sw_set_vlan_fid,
  876. .get = rtl8366_sw_get_vlan_fid,
  877. },
  878. };
  879. static const struct switch_dev_ops rtl8366_ops = {
  880. .attr_global = {
  881. .attr = rtl8366rb_globals,
  882. .n_attr = ARRAY_SIZE(rtl8366rb_globals),
  883. },
  884. .attr_port = {
  885. .attr = rtl8366rb_port,
  886. .n_attr = ARRAY_SIZE(rtl8366rb_port),
  887. },
  888. .attr_vlan = {
  889. .attr = rtl8366rb_vlan,
  890. .n_attr = ARRAY_SIZE(rtl8366rb_vlan),
  891. },
  892. .get_vlan_ports = rtl8366_sw_get_vlan_ports,
  893. .set_vlan_ports = rtl8366_sw_set_vlan_ports,
  894. .get_port_pvid = rtl8366_sw_get_port_pvid,
  895. .set_port_pvid = rtl8366_sw_set_port_pvid,
  896. .reset_switch = rtl8366rb_sw_reset_switch,
  897. };
  898. static int rtl8366rb_switch_init(struct rtl8366_smi *smi)
  899. {
  900. struct switch_dev *dev = &smi->sw_dev;
  901. int err;
  902. dev->name = "RTL8366RB";
  903. dev->cpu_port = RTL8366RB_PORT_NUM_CPU;
  904. dev->ports = RTL8366RB_NUM_PORTS;
  905. dev->vlans = RTL8366RB_NUM_VIDS;
  906. dev->ops = &rtl8366_ops;
  907. dev->devname = dev_name(smi->parent);
  908. err = register_switch(dev, NULL);
  909. if (err)
  910. dev_err(smi->parent, "switch registration failed\n");
  911. return err;
  912. }
  913. static void rtl8366rb_switch_cleanup(struct rtl8366_smi *smi)
  914. {
  915. unregister_switch(&smi->sw_dev);
  916. }
  917. static int rtl8366rb_mii_read(struct mii_bus *bus, int addr, int reg)
  918. {
  919. struct rtl8366_smi *smi = bus->priv;
  920. u32 val = 0;
  921. int err;
  922. err = rtl8366rb_read_phy_reg(smi, addr, 0, reg, &val);
  923. if (err)
  924. return 0xffff;
  925. return val;
  926. }
  927. static int rtl8366rb_mii_write(struct mii_bus *bus, int addr, int reg, u16 val)
  928. {
  929. struct rtl8366_smi *smi = bus->priv;
  930. u32 t;
  931. int err;
  932. err = rtl8366rb_write_phy_reg(smi, addr, 0, reg, val);
  933. /* flush write */
  934. (void) rtl8366rb_read_phy_reg(smi, addr, 0, reg, &t);
  935. return err;
  936. }
  937. static int rtl8366rb_mii_bus_match(struct mii_bus *bus)
  938. {
  939. return (bus->read == rtl8366rb_mii_read &&
  940. bus->write == rtl8366rb_mii_write);
  941. }
  942. static int rtl8366rb_setup(struct rtl8366_smi *smi)
  943. {
  944. int ret;
  945. ret = rtl8366rb_reset_chip(smi);
  946. if (ret)
  947. return ret;
  948. ret = rtl8366rb_hw_init(smi);
  949. return ret;
  950. }
  951. static int rtl8366rb_detect(struct rtl8366_smi *smi)
  952. {
  953. u32 chip_id = 0;
  954. u32 chip_ver = 0;
  955. int ret;
  956. ret = rtl8366_smi_read_reg(smi, RTL8366RB_CHIP_ID_REG, &chip_id);
  957. if (ret) {
  958. dev_err(smi->parent, "unable to read chip id\n");
  959. return ret;
  960. }
  961. switch (chip_id) {
  962. case RTL8366RB_CHIP_ID_8366:
  963. break;
  964. default:
  965. dev_err(smi->parent, "unknown chip id (%04x)\n", chip_id);
  966. return -ENODEV;
  967. }
  968. ret = rtl8366_smi_read_reg(smi, RTL8366RB_CHIP_VERSION_CTRL_REG,
  969. &chip_ver);
  970. if (ret) {
  971. dev_err(smi->parent, "unable to read chip version\n");
  972. return ret;
  973. }
  974. dev_info(smi->parent, "RTL%04x ver. %u chip found\n",
  975. chip_id, chip_ver & RTL8366RB_CHIP_VERSION_MASK);
  976. return 0;
  977. }
  978. static struct rtl8366_smi_ops rtl8366rb_smi_ops = {
  979. .detect = rtl8366rb_detect,
  980. .setup = rtl8366rb_setup,
  981. .mii_read = rtl8366rb_mii_read,
  982. .mii_write = rtl8366rb_mii_write,
  983. .get_vlan_mc = rtl8366rb_get_vlan_mc,
  984. .set_vlan_mc = rtl8366rb_set_vlan_mc,
  985. .get_vlan_4k = rtl8366rb_get_vlan_4k,
  986. .set_vlan_4k = rtl8366rb_set_vlan_4k,
  987. .get_mc_index = rtl8366rb_get_mc_index,
  988. .set_mc_index = rtl8366rb_set_mc_index,
  989. .get_mib_counter = rtl8366rb_get_mib_counter,
  990. .is_vlan_valid = rtl8366rb_is_vlan_valid,
  991. .enable_vlan = rtl8366rb_enable_vlan,
  992. .enable_vlan4k = rtl8366rb_enable_vlan4k,
  993. .enable_port = rtl8366rb_enable_port,
  994. };
  995. static int __devinit rtl8366rb_probe(struct platform_device *pdev)
  996. {
  997. static int rtl8366_smi_version_printed;
  998. struct rtl8366rb_platform_data *pdata;
  999. struct rtl8366_smi *smi;
  1000. int err;
  1001. if (!rtl8366_smi_version_printed++)
  1002. printk(KERN_NOTICE RTL8366RB_DRIVER_DESC
  1003. " version " RTL8366RB_DRIVER_VER"\n");
  1004. pdata = pdev->dev.platform_data;
  1005. if (!pdata) {
  1006. dev_err(&pdev->dev, "no platform data specified\n");
  1007. err = -EINVAL;
  1008. goto err_out;
  1009. }
  1010. smi = rtl8366_smi_alloc(&pdev->dev);
  1011. if (!smi) {
  1012. err = -ENOMEM;
  1013. goto err_out;
  1014. }
  1015. smi->gpio_sda = pdata->gpio_sda;
  1016. smi->gpio_sck = pdata->gpio_sck;
  1017. smi->ops = &rtl8366rb_smi_ops;
  1018. smi->cpu_port = RTL8366RB_PORT_NUM_CPU;
  1019. smi->num_ports = RTL8366RB_NUM_PORTS;
  1020. smi->num_vlan_mc = RTL8366RB_NUM_VLANS;
  1021. smi->mib_counters = rtl8366rb_mib_counters;
  1022. smi->num_mib_counters = ARRAY_SIZE(rtl8366rb_mib_counters);
  1023. err = rtl8366_smi_init(smi);
  1024. if (err)
  1025. goto err_free_smi;
  1026. platform_set_drvdata(pdev, smi);
  1027. err = rtl8366rb_switch_init(smi);
  1028. if (err)
  1029. goto err_clear_drvdata;
  1030. return 0;
  1031. err_clear_drvdata:
  1032. platform_set_drvdata(pdev, NULL);
  1033. rtl8366_smi_cleanup(smi);
  1034. err_free_smi:
  1035. kfree(smi);
  1036. err_out:
  1037. return err;
  1038. }
  1039. static int rtl8366rb_phy_config_init(struct phy_device *phydev)
  1040. {
  1041. if (!rtl8366rb_mii_bus_match(phydev->bus))
  1042. return -EINVAL;
  1043. return 0;
  1044. }
  1045. static int rtl8366rb_phy_config_aneg(struct phy_device *phydev)
  1046. {
  1047. /* phy 4 might be connected to a second mac, allow aneg config */
  1048. if (phydev->addr == RTL8366RB_PHY_WAN)
  1049. return genphy_config_aneg(phydev);
  1050. return 0;
  1051. }
  1052. static struct phy_driver rtl8366rb_phy_driver = {
  1053. .phy_id = 0x001cc960,
  1054. .name = "Realtek RTL8366RB",
  1055. .phy_id_mask = 0x1ffffff0,
  1056. .features = PHY_GBIT_FEATURES,
  1057. .config_aneg = rtl8366rb_phy_config_aneg,
  1058. .config_init = rtl8366rb_phy_config_init,
  1059. .read_status = genphy_read_status,
  1060. .driver = {
  1061. .owner = THIS_MODULE,
  1062. },
  1063. };
  1064. static int __devexit rtl8366rb_remove(struct platform_device *pdev)
  1065. {
  1066. struct rtl8366_smi *smi = platform_get_drvdata(pdev);
  1067. if (smi) {
  1068. rtl8366rb_switch_cleanup(smi);
  1069. platform_set_drvdata(pdev, NULL);
  1070. rtl8366_smi_cleanup(smi);
  1071. kfree(smi);
  1072. }
  1073. return 0;
  1074. }
  1075. static struct platform_driver rtl8366rb_driver = {
  1076. .driver = {
  1077. .name = RTL8366RB_DRIVER_NAME,
  1078. .owner = THIS_MODULE,
  1079. },
  1080. .probe = rtl8366rb_probe,
  1081. .remove = __devexit_p(rtl8366rb_remove),
  1082. };
  1083. static int __init rtl8366rb_module_init(void)
  1084. {
  1085. int ret;
  1086. ret = platform_driver_register(&rtl8366rb_driver);
  1087. if (ret)
  1088. return ret;
  1089. ret = phy_driver_register(&rtl8366rb_phy_driver);
  1090. if (ret)
  1091. goto err_platform_unregister;
  1092. return 0;
  1093. err_platform_unregister:
  1094. platform_driver_unregister(&rtl8366rb_driver);
  1095. return ret;
  1096. }
  1097. module_init(rtl8366rb_module_init);
  1098. static void __exit rtl8366rb_module_exit(void)
  1099. {
  1100. phy_driver_unregister(&rtl8366rb_phy_driver);
  1101. platform_driver_unregister(&rtl8366rb_driver);
  1102. }
  1103. module_exit(rtl8366rb_module_exit);
  1104. MODULE_DESCRIPTION(RTL8366RB_DRIVER_DESC);
  1105. MODULE_VERSION(RTL8366RB_DRIVER_VER);
  1106. MODULE_AUTHOR("Gabor Juhos <[email protected]>");
  1107. MODULE_AUTHOR("Antti Seppälä <[email protected]>");
  1108. MODULE_AUTHOR("Roman Yeryomin <[email protected]>");
  1109. MODULE_LICENSE("GPL v2");
  1110. MODULE_ALIAS("platform:" RTL8366RB_DRIVER_NAME);