rtl8366rb.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167
  1. /*
  2. * Platform driver for the Realtek RTL8366S ethernet switch
  3. *
  4. * Copyright (C) 2009-2010 Gabor Juhos <[email protected]>
  5. * Copyright (C) 2010 Antti Seppälä <[email protected]>
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU General Public License version 2 as published
  9. * by the Free Software Foundation.
  10. */
  11. #include <linux/kernel.h>
  12. #include <linux/module.h>
  13. #include <linux/init.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/delay.h>
  16. #include <linux/skbuff.h>
  17. #include <linux/rtl8366rb.h>
  18. #include "rtl8366_smi.h"
  19. #define RTL8366RB_DRIVER_DESC "Realtek RTL8366RB ethernet switch driver"
  20. #define RTL8366RB_DRIVER_VER "0.2.2"
  21. #define RTL8366RB_PHY_NO_MAX 4
  22. #define RTL8366RB_PHY_PAGE_MAX 7
  23. #define RTL8366RB_PHY_ADDR_MAX 31
  24. /* Switch Global Configuration register */
  25. #define RTL8366RB_SGCR 0x0000
  26. #define RTL8366RB_SGCR_EN_BC_STORM_CTRL BIT(0)
  27. #define RTL8366RB_SGCR_MAX_LENGTH(_x) (_x << 4)
  28. #define RTL8366RB_SGCR_MAX_LENGTH_MASK RTL8366RB_SGCR_MAX_LENGTH(0x3)
  29. #define RTL8366RB_SGCR_MAX_LENGTH_1522 RTL8366RB_SGCR_MAX_LENGTH(0x0)
  30. #define RTL8366RB_SGCR_MAX_LENGTH_1536 RTL8366RB_SGCR_MAX_LENGTH(0x1)
  31. #define RTL8366RB_SGCR_MAX_LENGTH_1552 RTL8366RB_SGCR_MAX_LENGTH(0x2)
  32. #define RTL8366RB_SGCR_MAX_LENGTH_9216 RTL8366RB_SGCR_MAX_LENGTH(0x3)
  33. #define RTL8366RB_SGCR_EN_VLAN BIT(13)
  34. #define RTL8366RB_SGCR_EN_VLAN_4KTB BIT(14)
  35. /* Port Enable Control register */
  36. #define RTL8366RB_PECR 0x0001
  37. /* Switch Security Control registers */
  38. #define RTL8366RB_SSCR0 0x0002
  39. #define RTL8366RB_SSCR1 0x0003
  40. #define RTL8366RB_SSCR2 0x0004
  41. #define RTL8366RB_SSCR2_DROP_UNKNOWN_DA BIT(0)
  42. #define RTL8366RB_RESET_CTRL_REG 0x0100
  43. #define RTL8366RB_CHIP_CTRL_RESET_HW 1
  44. #define RTL8366RB_CHIP_CTRL_RESET_SW (1 << 1)
  45. #define RTL8366RB_CHIP_VERSION_CTRL_REG 0x050A
  46. #define RTL8366RB_CHIP_VERSION_MASK 0xf
  47. #define RTL8366RB_CHIP_ID_REG 0x0509
  48. #define RTL8366RB_CHIP_ID_8366 0x5937
  49. /* PHY registers control */
  50. #define RTL8366RB_PHY_ACCESS_CTRL_REG 0x8000
  51. #define RTL8366RB_PHY_ACCESS_DATA_REG 0x8002
  52. #define RTL8366RB_PHY_CTRL_READ 1
  53. #define RTL8366RB_PHY_CTRL_WRITE 0
  54. #define RTL8366RB_PHY_REG_MASK 0x1f
  55. #define RTL8366RB_PHY_PAGE_OFFSET 5
  56. #define RTL8366RB_PHY_PAGE_MASK (0xf << 5)
  57. #define RTL8366RB_PHY_NO_OFFSET 9
  58. #define RTL8366RB_PHY_NO_MASK (0x1f << 9)
  59. #define RTL8366RB_VLAN_INGRESS_CTRL2_REG 0x037f
  60. /* LED control registers */
  61. #define RTL8366RB_LED_BLINKRATE_REG 0x0430
  62. #define RTL8366RB_LED_BLINKRATE_BIT 0
  63. #define RTL8366RB_LED_BLINKRATE_MASK 0x0007
  64. #define RTL8366RB_LED_CTRL_REG 0x0431
  65. #define RTL8366RB_LED_0_1_CTRL_REG 0x0432
  66. #define RTL8366RB_LED_2_3_CTRL_REG 0x0433
  67. #define RTL8366RB_MIB_COUNT 33
  68. #define RTL8366RB_GLOBAL_MIB_COUNT 1
  69. #define RTL8366RB_MIB_COUNTER_PORT_OFFSET 0x0050
  70. #define RTL8366RB_MIB_COUNTER_BASE 0x1000
  71. #define RTL8366RB_MIB_CTRL_REG 0x13F0
  72. #define RTL8366RB_MIB_CTRL_USER_MASK 0x0FFC
  73. #define RTL8366RB_MIB_CTRL_BUSY_MASK BIT(0)
  74. #define RTL8366RB_MIB_CTRL_RESET_MASK BIT(1)
  75. #define RTL8366RB_MIB_CTRL_PORT_RESET(_p) BIT(2 + (_p))
  76. #define RTL8366RB_MIB_CTRL_GLOBAL_RESET BIT(11)
  77. #define RTL8366RB_PORT_VLAN_CTRL_BASE 0x0063
  78. #define RTL8366RB_PORT_VLAN_CTRL_REG(_p) \
  79. (RTL8366RB_PORT_VLAN_CTRL_BASE + (_p) / 4)
  80. #define RTL8366RB_PORT_VLAN_CTRL_MASK 0xf
  81. #define RTL8366RB_PORT_VLAN_CTRL_SHIFT(_p) (4 * ((_p) % 4))
  82. #define RTL8366RB_VLAN_TABLE_READ_BASE 0x018C
  83. #define RTL8366RB_VLAN_TABLE_WRITE_BASE 0x0185
  84. #define RTL8366RB_TABLE_ACCESS_CTRL_REG 0x0180
  85. #define RTL8366RB_TABLE_VLAN_READ_CTRL 0x0E01
  86. #define RTL8366RB_TABLE_VLAN_WRITE_CTRL 0x0F01
  87. #define RTL8366RB_VLAN_MC_BASE(_x) (0x0020 + (_x) * 3)
  88. #define RTL8366RB_PORT_LINK_STATUS_BASE 0x0014
  89. #define RTL8366RB_PORT_STATUS_SPEED_MASK 0x0003
  90. #define RTL8366RB_PORT_STATUS_DUPLEX_MASK 0x0004
  91. #define RTL8366RB_PORT_STATUS_LINK_MASK 0x0010
  92. #define RTL8366RB_PORT_STATUS_TXPAUSE_MASK 0x0020
  93. #define RTL8366RB_PORT_STATUS_RXPAUSE_MASK 0x0040
  94. #define RTL8366RB_PORT_STATUS_AN_MASK 0x0080
  95. #define RTL8366RB_PORT_NUM_CPU 5
  96. #define RTL8366RB_NUM_PORTS 6
  97. #define RTL8366RB_NUM_VLANS 16
  98. #define RTL8366RB_NUM_LEDGROUPS 4
  99. #define RTL8366RB_NUM_VIDS 4096
  100. #define RTL8366RB_PRIORITYMAX 7
  101. #define RTL8366RB_FIDMAX 7
  102. #define RTL8366RB_PORT_1 (1 << 0) /* In userspace port 0 */
  103. #define RTL8366RB_PORT_2 (1 << 1) /* In userspace port 1 */
  104. #define RTL8366RB_PORT_3 (1 << 2) /* In userspace port 2 */
  105. #define RTL8366RB_PORT_4 (1 << 3) /* In userspace port 3 */
  106. #define RTL8366RB_PORT_5 (1 << 4) /* In userspace port 4 */
  107. #define RTL8366RB_PORT_CPU (1 << 5) /* CPU port */
  108. #define RTL8366RB_PORT_ALL (RTL8366RB_PORT_1 | \
  109. RTL8366RB_PORT_2 | \
  110. RTL8366RB_PORT_3 | \
  111. RTL8366RB_PORT_4 | \
  112. RTL8366RB_PORT_5 | \
  113. RTL8366RB_PORT_CPU)
  114. #define RTL8366RB_PORT_ALL_BUT_CPU (RTL8366RB_PORT_1 | \
  115. RTL8366RB_PORT_2 | \
  116. RTL8366RB_PORT_3 | \
  117. RTL8366RB_PORT_4 | \
  118. RTL8366RB_PORT_5)
  119. #define RTL8366RB_PORT_ALL_EXTERNAL (RTL8366RB_PORT_1 | \
  120. RTL8366RB_PORT_2 | \
  121. RTL8366RB_PORT_3 | \
  122. RTL8366RB_PORT_4)
  123. #define RTL8366RB_PORT_ALL_INTERNAL RTL8366RB_PORT_CPU
  124. #define RTL8366RB_VLAN_VID_MASK 0xfff
  125. #define RTL8366RB_VLAN_PRIORITY_SHIFT 12
  126. #define RTL8366RB_VLAN_PRIORITY_MASK 0x7
  127. #define RTL8366RB_VLAN_UNTAG_SHIFT 8
  128. #define RTL8366RB_VLAN_UNTAG_MASK 0xff
  129. #define RTL8366RB_VLAN_MEMBER_MASK 0xff
  130. #define RTL8366RB_VLAN_FID_MASK 0x7
  131. static struct rtl8366_mib_counter rtl8366rb_mib_counters[] = {
  132. { 0, 0, 4, "IfInOctets" },
  133. { 0, 4, 4, "EtherStatsOctets" },
  134. { 0, 8, 2, "EtherStatsUnderSizePkts" },
  135. { 0, 10, 2, "EtherFragments" },
  136. { 0, 12, 2, "EtherStatsPkts64Octets" },
  137. { 0, 14, 2, "EtherStatsPkts65to127Octets" },
  138. { 0, 16, 2, "EtherStatsPkts128to255Octets" },
  139. { 0, 18, 2, "EtherStatsPkts256to511Octets" },
  140. { 0, 20, 2, "EtherStatsPkts512to1023Octets" },
  141. { 0, 22, 2, "EtherStatsPkts1024to1518Octets" },
  142. { 0, 24, 2, "EtherOversizeStats" },
  143. { 0, 26, 2, "EtherStatsJabbers" },
  144. { 0, 28, 2, "IfInUcastPkts" },
  145. { 0, 30, 2, "EtherStatsMulticastPkts" },
  146. { 0, 32, 2, "EtherStatsBroadcastPkts" },
  147. { 0, 34, 2, "EtherStatsDropEvents" },
  148. { 0, 36, 2, "Dot3StatsFCSErrors" },
  149. { 0, 38, 2, "Dot3StatsSymbolErrors" },
  150. { 0, 40, 2, "Dot3InPauseFrames" },
  151. { 0, 42, 2, "Dot3ControlInUnknownOpcodes" },
  152. { 0, 44, 4, "IfOutOctets" },
  153. { 0, 48, 2, "Dot3StatsSingleCollisionFrames" },
  154. { 0, 50, 2, "Dot3StatMultipleCollisionFrames" },
  155. { 0, 52, 2, "Dot3sDeferredTransmissions" },
  156. { 0, 54, 2, "Dot3StatsLateCollisions" },
  157. { 0, 56, 2, "EtherStatsCollisions" },
  158. { 0, 58, 2, "Dot3StatsExcessiveCollisions" },
  159. { 0, 60, 2, "Dot3OutPauseFrames" },
  160. { 0, 62, 2, "Dot1dBasePortDelayExceededDiscards" },
  161. { 0, 64, 2, "Dot1dTpPortInDiscards" },
  162. { 0, 66, 2, "IfOutUcastPkts" },
  163. { 0, 68, 2, "IfOutMulticastPkts" },
  164. { 0, 70, 2, "IfOutBroadcastPkts" },
  165. };
  166. #define REG_WR(_smi, _reg, _val) \
  167. do { \
  168. err = rtl8366_smi_write_reg(_smi, _reg, _val); \
  169. if (err) \
  170. return err; \
  171. } while (0)
  172. #define REG_RMW(_smi, _reg, _mask, _val) \
  173. do { \
  174. err = rtl8366_smi_rmwr(_smi, _reg, _mask, _val); \
  175. if (err) \
  176. return err; \
  177. } while (0)
  178. static int rtl8366rb_reset_chip(struct rtl8366_smi *smi)
  179. {
  180. int timeout = 10;
  181. u32 data;
  182. rtl8366_smi_write_reg(smi, RTL8366RB_RESET_CTRL_REG,
  183. RTL8366RB_CHIP_CTRL_RESET_HW);
  184. do {
  185. msleep(1);
  186. if (rtl8366_smi_read_reg(smi, RTL8366RB_RESET_CTRL_REG, &data))
  187. return -EIO;
  188. if (!(data & RTL8366RB_CHIP_CTRL_RESET_HW))
  189. break;
  190. } while (--timeout);
  191. if (!timeout) {
  192. printk("Timeout waiting for the switch to reset\n");
  193. return -EIO;
  194. }
  195. return 0;
  196. }
  197. static int rtl8366rb_hw_init(struct rtl8366_smi *smi)
  198. {
  199. int err;
  200. /* set maximum packet length to 1536 bytes */
  201. REG_RMW(smi, RTL8366RB_SGCR, RTL8366RB_SGCR_MAX_LENGTH_MASK,
  202. RTL8366RB_SGCR_MAX_LENGTH_1536);
  203. /* enable all ports */
  204. REG_WR(smi, RTL8366RB_PECR, 0);
  205. /* enable learning for all ports */
  206. REG_WR(smi, RTL8366RB_SSCR0, 0);
  207. /* enable auto ageing for all ports */
  208. REG_WR(smi, RTL8366RB_SSCR1, 0);
  209. /*
  210. * discard VLAN tagged packets if the port is not a member of
  211. * the VLAN with which the packets is associated.
  212. */
  213. REG_WR(smi, RTL8366RB_VLAN_INGRESS_CTRL2_REG, RTL8366RB_PORT_ALL);
  214. /* don't drop packets whose DA has not been learned */
  215. REG_RMW(smi, RTL8366RB_SSCR2, RTL8366RB_SSCR2_DROP_UNKNOWN_DA, 0);
  216. return 0;
  217. }
  218. static int rtl8366rb_read_phy_reg(struct rtl8366_smi *smi,
  219. u32 phy_no, u32 page, u32 addr, u32 *data)
  220. {
  221. u32 reg;
  222. int ret;
  223. if (phy_no > RTL8366RB_PHY_NO_MAX)
  224. return -EINVAL;
  225. if (page > RTL8366RB_PHY_PAGE_MAX)
  226. return -EINVAL;
  227. if (addr > RTL8366RB_PHY_ADDR_MAX)
  228. return -EINVAL;
  229. ret = rtl8366_smi_write_reg(smi, RTL8366RB_PHY_ACCESS_CTRL_REG,
  230. RTL8366RB_PHY_CTRL_READ);
  231. if (ret)
  232. return ret;
  233. reg = 0x8000 | (1 << (phy_no + RTL8366RB_PHY_NO_OFFSET)) |
  234. ((page << RTL8366RB_PHY_PAGE_OFFSET) & RTL8366RB_PHY_PAGE_MASK) |
  235. (addr & RTL8366RB_PHY_REG_MASK);
  236. ret = rtl8366_smi_write_reg(smi, reg, 0);
  237. if (ret)
  238. return ret;
  239. ret = rtl8366_smi_read_reg(smi, RTL8366RB_PHY_ACCESS_DATA_REG, data);
  240. if (ret)
  241. return ret;
  242. return 0;
  243. }
  244. static int rtl8366rb_write_phy_reg(struct rtl8366_smi *smi,
  245. u32 phy_no, u32 page, u32 addr, u32 data)
  246. {
  247. u32 reg;
  248. int ret;
  249. if (phy_no > RTL8366RB_PHY_NO_MAX)
  250. return -EINVAL;
  251. if (page > RTL8366RB_PHY_PAGE_MAX)
  252. return -EINVAL;
  253. if (addr > RTL8366RB_PHY_ADDR_MAX)
  254. return -EINVAL;
  255. ret = rtl8366_smi_write_reg(smi, RTL8366RB_PHY_ACCESS_CTRL_REG,
  256. RTL8366RB_PHY_CTRL_WRITE);
  257. if (ret)
  258. return ret;
  259. reg = 0x8000 | (1 << (phy_no + RTL8366RB_PHY_NO_OFFSET)) |
  260. ((page << RTL8366RB_PHY_PAGE_OFFSET) & RTL8366RB_PHY_PAGE_MASK) |
  261. (addr & RTL8366RB_PHY_REG_MASK);
  262. ret = rtl8366_smi_write_reg(smi, reg, data);
  263. if (ret)
  264. return ret;
  265. return 0;
  266. }
  267. static int rtl8366rb_get_mib_counter(struct rtl8366_smi *smi, int counter,
  268. int port, unsigned long long *val)
  269. {
  270. int i;
  271. int err;
  272. u32 addr, data;
  273. u64 mibvalue;
  274. if (port > RTL8366RB_NUM_PORTS || counter >= RTL8366RB_MIB_COUNT)
  275. return -EINVAL;
  276. addr = RTL8366RB_MIB_COUNTER_BASE +
  277. RTL8366RB_MIB_COUNTER_PORT_OFFSET * (port) +
  278. rtl8366rb_mib_counters[counter].offset;
  279. /*
  280. * Writing access counter address first
  281. * then ASIC will prepare 64bits counter wait for being retrived
  282. */
  283. data = 0; /* writing data will be discard by ASIC */
  284. err = rtl8366_smi_write_reg(smi, addr, data);
  285. if (err)
  286. return err;
  287. /* read MIB control register */
  288. err = rtl8366_smi_read_reg(smi, RTL8366RB_MIB_CTRL_REG, &data);
  289. if (err)
  290. return err;
  291. if (data & RTL8366RB_MIB_CTRL_BUSY_MASK)
  292. return -EBUSY;
  293. if (data & RTL8366RB_MIB_CTRL_RESET_MASK)
  294. return -EIO;
  295. mibvalue = 0;
  296. for (i = rtl8366rb_mib_counters[counter].length; i > 0; i--) {
  297. err = rtl8366_smi_read_reg(smi, addr + (i - 1), &data);
  298. if (err)
  299. return err;
  300. mibvalue = (mibvalue << 16) | (data & 0xFFFF);
  301. }
  302. *val = mibvalue;
  303. return 0;
  304. }
  305. static int rtl8366rb_get_vlan_4k(struct rtl8366_smi *smi, u32 vid,
  306. struct rtl8366_vlan_4k *vlan4k)
  307. {
  308. u32 data[3];
  309. int err;
  310. int i;
  311. memset(vlan4k, '\0', sizeof(struct rtl8366_vlan_4k));
  312. if (vid >= RTL8366RB_NUM_VIDS)
  313. return -EINVAL;
  314. /* write VID */
  315. err = rtl8366_smi_write_reg(smi, RTL8366RB_VLAN_TABLE_WRITE_BASE,
  316. vid & RTL8366RB_VLAN_VID_MASK);
  317. if (err)
  318. return err;
  319. /* write table access control word */
  320. err = rtl8366_smi_write_reg(smi, RTL8366RB_TABLE_ACCESS_CTRL_REG,
  321. RTL8366RB_TABLE_VLAN_READ_CTRL);
  322. if (err)
  323. return err;
  324. for (i = 0; i < 3; i++) {
  325. err = rtl8366_smi_read_reg(smi,
  326. RTL8366RB_VLAN_TABLE_READ_BASE + i,
  327. &data[i]);
  328. if (err)
  329. return err;
  330. }
  331. vlan4k->vid = vid;
  332. vlan4k->untag = (data[1] >> RTL8366RB_VLAN_UNTAG_SHIFT) &
  333. RTL8366RB_VLAN_UNTAG_MASK;
  334. vlan4k->member = data[1] & RTL8366RB_VLAN_MEMBER_MASK;
  335. vlan4k->fid = data[2] & RTL8366RB_VLAN_FID_MASK;
  336. return 0;
  337. }
  338. static int rtl8366rb_set_vlan_4k(struct rtl8366_smi *smi,
  339. const struct rtl8366_vlan_4k *vlan4k)
  340. {
  341. u32 data[3];
  342. int err;
  343. int i;
  344. if (vlan4k->vid >= RTL8366RB_NUM_VIDS ||
  345. vlan4k->member > RTL8366RB_PORT_ALL ||
  346. vlan4k->untag > RTL8366RB_PORT_ALL ||
  347. vlan4k->fid > RTL8366RB_FIDMAX)
  348. return -EINVAL;
  349. data[0] = vlan4k->vid & RTL8366RB_VLAN_VID_MASK;
  350. data[1] = (vlan4k->member & RTL8366RB_VLAN_MEMBER_MASK) |
  351. ((vlan4k->untag & RTL8366RB_VLAN_UNTAG_MASK) <<
  352. RTL8366RB_VLAN_UNTAG_SHIFT);
  353. data[2] = vlan4k->fid & RTL8366RB_VLAN_FID_MASK;
  354. for (i = 0; i < 3; i++) {
  355. err = rtl8366_smi_write_reg(smi,
  356. RTL8366RB_VLAN_TABLE_WRITE_BASE + i,
  357. data[i]);
  358. if (err)
  359. return err;
  360. }
  361. /* write table access control word */
  362. err = rtl8366_smi_write_reg(smi, RTL8366RB_TABLE_ACCESS_CTRL_REG,
  363. RTL8366RB_TABLE_VLAN_WRITE_CTRL);
  364. return err;
  365. }
  366. static int rtl8366rb_get_vlan_mc(struct rtl8366_smi *smi, u32 index,
  367. struct rtl8366_vlan_mc *vlanmc)
  368. {
  369. u32 data[3];
  370. int err;
  371. int i;
  372. memset(vlanmc, '\0', sizeof(struct rtl8366_vlan_mc));
  373. if (index >= RTL8366RB_NUM_VLANS)
  374. return -EINVAL;
  375. for (i = 0; i < 3; i++) {
  376. err = rtl8366_smi_read_reg(smi,
  377. RTL8366RB_VLAN_MC_BASE(index) + i,
  378. &data[i]);
  379. if (err)
  380. return err;
  381. }
  382. vlanmc->vid = data[0] & RTL8366RB_VLAN_VID_MASK;
  383. vlanmc->priority = (data[0] >> RTL8366RB_VLAN_PRIORITY_SHIFT) &
  384. RTL8366RB_VLAN_PRIORITY_MASK;
  385. vlanmc->untag = (data[1] >> RTL8366RB_VLAN_UNTAG_SHIFT) &
  386. RTL8366RB_VLAN_UNTAG_MASK;
  387. vlanmc->member = data[1] & RTL8366RB_VLAN_MEMBER_MASK;
  388. vlanmc->fid = data[2] & RTL8366RB_VLAN_FID_MASK;
  389. return 0;
  390. }
  391. static int rtl8366rb_set_vlan_mc(struct rtl8366_smi *smi, u32 index,
  392. const struct rtl8366_vlan_mc *vlanmc)
  393. {
  394. u32 data[3];
  395. int err;
  396. int i;
  397. if (index >= RTL8366RB_NUM_VLANS ||
  398. vlanmc->vid >= RTL8366RB_NUM_VIDS ||
  399. vlanmc->priority > RTL8366RB_PRIORITYMAX ||
  400. vlanmc->member > RTL8366RB_PORT_ALL ||
  401. vlanmc->untag > RTL8366RB_PORT_ALL ||
  402. vlanmc->fid > RTL8366RB_FIDMAX)
  403. return -EINVAL;
  404. data[0] = (vlanmc->vid & RTL8366RB_VLAN_VID_MASK) |
  405. ((vlanmc->priority & RTL8366RB_VLAN_PRIORITY_MASK) <<
  406. RTL8366RB_VLAN_PRIORITY_SHIFT);
  407. data[1] = (vlanmc->member & RTL8366RB_VLAN_MEMBER_MASK) |
  408. ((vlanmc->untag & RTL8366RB_VLAN_UNTAG_MASK) <<
  409. RTL8366RB_VLAN_UNTAG_SHIFT);
  410. data[2] = vlanmc->fid & RTL8366RB_VLAN_FID_MASK;
  411. for (i = 0; i < 3; i++) {
  412. err = rtl8366_smi_write_reg(smi,
  413. RTL8366RB_VLAN_MC_BASE(index) + i,
  414. data[i]);
  415. if (err)
  416. return err;
  417. }
  418. return 0;
  419. }
  420. static int rtl8366rb_get_mc_index(struct rtl8366_smi *smi, int port, int *val)
  421. {
  422. u32 data;
  423. int err;
  424. if (port >= RTL8366RB_NUM_PORTS)
  425. return -EINVAL;
  426. err = rtl8366_smi_read_reg(smi, RTL8366RB_PORT_VLAN_CTRL_REG(port),
  427. &data);
  428. if (err)
  429. return err;
  430. *val = (data >> RTL8366RB_PORT_VLAN_CTRL_SHIFT(port)) &
  431. RTL8366RB_PORT_VLAN_CTRL_MASK;
  432. return 0;
  433. }
  434. static int rtl8366rb_set_mc_index(struct rtl8366_smi *smi, int port, int index)
  435. {
  436. if (port >= RTL8366RB_NUM_PORTS || index >= RTL8366RB_NUM_VLANS)
  437. return -EINVAL;
  438. return rtl8366_smi_rmwr(smi, RTL8366RB_PORT_VLAN_CTRL_REG(port),
  439. RTL8366RB_PORT_VLAN_CTRL_MASK <<
  440. RTL8366RB_PORT_VLAN_CTRL_SHIFT(port),
  441. (index & RTL8366RB_PORT_VLAN_CTRL_MASK) <<
  442. RTL8366RB_PORT_VLAN_CTRL_SHIFT(port));
  443. }
  444. static int rtl8366rb_is_vlan_valid(struct rtl8366_smi *smi, unsigned vlan)
  445. {
  446. if (vlan == 0 || vlan >= RTL8366RB_NUM_VLANS)
  447. return 0;
  448. return 1;
  449. }
  450. static int rtl8366rb_vlan_set_vlan(struct rtl8366_smi *smi, int enable)
  451. {
  452. return rtl8366_smi_rmwr(smi, RTL8366RB_SGCR, RTL8366RB_SGCR_EN_VLAN,
  453. (enable) ? RTL8366RB_SGCR_EN_VLAN : 0);
  454. }
  455. static int rtl8366rb_vlan_set_4ktable(struct rtl8366_smi *smi, int enable)
  456. {
  457. return rtl8366_smi_rmwr(smi, RTL8366RB_SGCR,
  458. RTL8366RB_SGCR_EN_VLAN_4KTB,
  459. (enable) ? RTL8366RB_SGCR_EN_VLAN_4KTB : 0);
  460. }
  461. static int rtl8366rb_sw_reset_mibs(struct switch_dev *dev,
  462. const struct switch_attr *attr,
  463. struct switch_val *val)
  464. {
  465. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  466. return rtl8366_smi_rmwr(smi, RTL8366RB_MIB_CTRL_REG, 0,
  467. RTL8366RB_MIB_CTRL_GLOBAL_RESET);
  468. }
  469. static int rtl8366rb_sw_get_vlan_enable(struct switch_dev *dev,
  470. const struct switch_attr *attr,
  471. struct switch_val *val)
  472. {
  473. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  474. u32 data;
  475. if (attr->ofs == 1) {
  476. rtl8366_smi_read_reg(smi, RTL8366RB_SGCR, &data);
  477. if (data & RTL8366RB_SGCR_EN_VLAN)
  478. val->value.i = 1;
  479. else
  480. val->value.i = 0;
  481. } else if (attr->ofs == 2) {
  482. rtl8366_smi_read_reg(smi, RTL8366RB_SGCR, &data);
  483. if (data & RTL8366RB_SGCR_EN_VLAN_4KTB)
  484. val->value.i = 1;
  485. else
  486. val->value.i = 0;
  487. }
  488. return 0;
  489. }
  490. static int rtl8366rb_sw_get_blinkrate(struct switch_dev *dev,
  491. const struct switch_attr *attr,
  492. struct switch_val *val)
  493. {
  494. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  495. u32 data;
  496. rtl8366_smi_read_reg(smi, RTL8366RB_LED_BLINKRATE_REG, &data);
  497. val->value.i = (data & (RTL8366RB_LED_BLINKRATE_MASK));
  498. return 0;
  499. }
  500. static int rtl8366rb_sw_set_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. if (val->value.i >= 6)
  506. return -EINVAL;
  507. return rtl8366_smi_rmwr(smi, RTL8366RB_LED_BLINKRATE_REG,
  508. RTL8366RB_LED_BLINKRATE_MASK,
  509. val->value.i);
  510. }
  511. static int rtl8366rb_sw_set_vlan_enable(struct switch_dev *dev,
  512. const struct switch_attr *attr,
  513. struct switch_val *val)
  514. {
  515. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  516. if (attr->ofs == 1)
  517. return rtl8366rb_vlan_set_vlan(smi, val->value.i);
  518. else
  519. return rtl8366rb_vlan_set_4ktable(smi, 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, RTL8366RB_LED_BLINKRATE_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_reset_port_mibs(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. if (val->port_vlan >= RTL8366RB_NUM_PORTS)
  632. return -EINVAL;
  633. return rtl8366_smi_rmwr(smi, RTL8366RB_MIB_CTRL_REG, 0,
  634. RTL8366RB_MIB_CTRL_PORT_RESET(val->port_vlan));
  635. }
  636. static int rtl8366rb_sw_reset_switch(struct switch_dev *dev)
  637. {
  638. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  639. int err;
  640. err = rtl8366rb_reset_chip(smi);
  641. if (err)
  642. return err;
  643. err = rtl8366rb_hw_init(smi);
  644. if (err)
  645. return err;
  646. return rtl8366_reset_vlan(smi);
  647. }
  648. static struct switch_attr rtl8366rb_globals[] = {
  649. {
  650. .type = SWITCH_TYPE_INT,
  651. .name = "enable_learning",
  652. .description = "Enable learning, enable aging",
  653. .set = rtl8366rb_sw_set_learning_enable,
  654. .get = rtl8366rb_sw_get_learning_enable,
  655. .max = 1
  656. }, {
  657. .type = SWITCH_TYPE_INT,
  658. .name = "enable_vlan",
  659. .description = "Enable VLAN mode",
  660. .set = rtl8366rb_sw_set_vlan_enable,
  661. .get = rtl8366rb_sw_get_vlan_enable,
  662. .max = 1,
  663. .ofs = 1
  664. }, {
  665. .type = SWITCH_TYPE_INT,
  666. .name = "enable_vlan4k",
  667. .description = "Enable VLAN 4K mode",
  668. .set = rtl8366rb_sw_set_vlan_enable,
  669. .get = rtl8366rb_sw_get_vlan_enable,
  670. .max = 1,
  671. .ofs = 2
  672. }, {
  673. .type = SWITCH_TYPE_NOVAL,
  674. .name = "reset_mibs",
  675. .description = "Reset all MIB counters",
  676. .set = rtl8366rb_sw_reset_mibs,
  677. }, {
  678. .type = SWITCH_TYPE_INT,
  679. .name = "blinkrate",
  680. .description = "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
  681. " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
  682. .set = rtl8366rb_sw_set_blinkrate,
  683. .get = rtl8366rb_sw_get_blinkrate,
  684. .max = 5
  685. },
  686. };
  687. static struct switch_attr rtl8366rb_port[] = {
  688. {
  689. .type = SWITCH_TYPE_STRING,
  690. .name = "link",
  691. .description = "Get port link information",
  692. .max = 1,
  693. .set = NULL,
  694. .get = rtl8366rb_sw_get_port_link,
  695. }, {
  696. .type = SWITCH_TYPE_NOVAL,
  697. .name = "reset_mib",
  698. .description = "Reset single port MIB counters",
  699. .set = rtl8366rb_sw_reset_port_mibs,
  700. }, {
  701. .type = SWITCH_TYPE_STRING,
  702. .name = "mib",
  703. .description = "Get MIB counters for port",
  704. .max = 33,
  705. .set = NULL,
  706. .get = rtl8366_sw_get_port_mib,
  707. }, {
  708. .type = SWITCH_TYPE_INT,
  709. .name = "led",
  710. .description = "Get/Set port group (0 - 3) led mode (0 - 15)",
  711. .max = 15,
  712. .set = rtl8366rb_sw_set_port_led,
  713. .get = rtl8366rb_sw_get_port_led,
  714. },
  715. };
  716. static struct switch_attr rtl8366rb_vlan[] = {
  717. {
  718. .type = SWITCH_TYPE_STRING,
  719. .name = "info",
  720. .description = "Get vlan information",
  721. .max = 1,
  722. .set = NULL,
  723. .get = rtl8366_sw_get_vlan_info,
  724. },
  725. };
  726. static const struct switch_dev_ops rtl8366_ops = {
  727. .attr_global = {
  728. .attr = rtl8366rb_globals,
  729. .n_attr = ARRAY_SIZE(rtl8366rb_globals),
  730. },
  731. .attr_port = {
  732. .attr = rtl8366rb_port,
  733. .n_attr = ARRAY_SIZE(rtl8366rb_port),
  734. },
  735. .attr_vlan = {
  736. .attr = rtl8366rb_vlan,
  737. .n_attr = ARRAY_SIZE(rtl8366rb_vlan),
  738. },
  739. .get_vlan_ports = rtl8366_sw_get_vlan_ports,
  740. .set_vlan_ports = rtl8366_sw_set_vlan_ports,
  741. .get_port_pvid = rtl8366_sw_get_port_pvid,
  742. .set_port_pvid = rtl8366_sw_set_port_pvid,
  743. .reset_switch = rtl8366rb_sw_reset_switch,
  744. };
  745. static int rtl8366rb_switch_init(struct rtl8366_smi *smi)
  746. {
  747. struct switch_dev *dev = &smi->sw_dev;
  748. int err;
  749. dev->name = "RTL8366RB";
  750. dev->cpu_port = RTL8366RB_PORT_NUM_CPU;
  751. dev->ports = RTL8366RB_NUM_PORTS;
  752. dev->vlans = RTL8366RB_NUM_VLANS;
  753. dev->ops = &rtl8366_ops;
  754. dev->devname = dev_name(smi->parent);
  755. err = register_switch(dev, NULL);
  756. if (err)
  757. dev_err(smi->parent, "switch registration failed\n");
  758. return err;
  759. }
  760. static void rtl8366rb_switch_cleanup(struct rtl8366_smi *smi)
  761. {
  762. unregister_switch(&smi->sw_dev);
  763. }
  764. static int rtl8366rb_mii_read(struct mii_bus *bus, int addr, int reg)
  765. {
  766. struct rtl8366_smi *smi = bus->priv;
  767. u32 val = 0;
  768. int err;
  769. err = rtl8366rb_read_phy_reg(smi, addr, 0, reg, &val);
  770. if (err)
  771. return 0xffff;
  772. return val;
  773. }
  774. static int rtl8366rb_mii_write(struct mii_bus *bus, int addr, int reg, u16 val)
  775. {
  776. struct rtl8366_smi *smi = bus->priv;
  777. u32 t;
  778. int err;
  779. err = rtl8366rb_write_phy_reg(smi, addr, 0, reg, val);
  780. /* flush write */
  781. (void) rtl8366rb_read_phy_reg(smi, addr, 0, reg, &t);
  782. return err;
  783. }
  784. static int rtl8366rb_mii_bus_match(struct mii_bus *bus)
  785. {
  786. return (bus->read == rtl8366rb_mii_read &&
  787. bus->write == rtl8366rb_mii_write);
  788. }
  789. static int rtl8366rb_setup(struct rtl8366_smi *smi)
  790. {
  791. int ret;
  792. ret = rtl8366rb_reset_chip(smi);
  793. if (ret)
  794. return ret;
  795. ret = rtl8366rb_hw_init(smi);
  796. return ret;
  797. }
  798. static int rtl8366rb_detect(struct rtl8366_smi *smi)
  799. {
  800. u32 chip_id = 0;
  801. u32 chip_ver = 0;
  802. int ret;
  803. ret = rtl8366_smi_read_reg(smi, RTL8366RB_CHIP_ID_REG, &chip_id);
  804. if (ret) {
  805. dev_err(smi->parent, "unable to read chip id\n");
  806. return ret;
  807. }
  808. switch (chip_id) {
  809. case RTL8366RB_CHIP_ID_8366:
  810. break;
  811. default:
  812. dev_err(smi->parent, "unknown chip id (%04x)\n", chip_id);
  813. return -ENODEV;
  814. }
  815. ret = rtl8366_smi_read_reg(smi, RTL8366RB_CHIP_VERSION_CTRL_REG,
  816. &chip_ver);
  817. if (ret) {
  818. dev_err(smi->parent, "unable to read chip version\n");
  819. return ret;
  820. }
  821. dev_info(smi->parent, "RTL%04x ver. %u chip found\n",
  822. chip_id, chip_ver & RTL8366RB_CHIP_VERSION_MASK);
  823. return 0;
  824. }
  825. static struct rtl8366_smi_ops rtl8366rb_smi_ops = {
  826. .detect = rtl8366rb_detect,
  827. .setup = rtl8366rb_setup,
  828. .mii_read = rtl8366rb_mii_read,
  829. .mii_write = rtl8366rb_mii_write,
  830. .get_vlan_mc = rtl8366rb_get_vlan_mc,
  831. .set_vlan_mc = rtl8366rb_set_vlan_mc,
  832. .get_vlan_4k = rtl8366rb_get_vlan_4k,
  833. .set_vlan_4k = rtl8366rb_set_vlan_4k,
  834. .get_mc_index = rtl8366rb_get_mc_index,
  835. .set_mc_index = rtl8366rb_set_mc_index,
  836. .get_mib_counter = rtl8366rb_get_mib_counter,
  837. .is_vlan_valid = rtl8366rb_is_vlan_valid,
  838. };
  839. static int __init rtl8366rb_probe(struct platform_device *pdev)
  840. {
  841. static int rtl8366_smi_version_printed;
  842. struct rtl8366rb_platform_data *pdata;
  843. struct rtl8366_smi *smi;
  844. int err;
  845. if (!rtl8366_smi_version_printed++)
  846. printk(KERN_NOTICE RTL8366RB_DRIVER_DESC
  847. " version " RTL8366RB_DRIVER_VER"\n");
  848. pdata = pdev->dev.platform_data;
  849. if (!pdata) {
  850. dev_err(&pdev->dev, "no platform data specified\n");
  851. err = -EINVAL;
  852. goto err_out;
  853. }
  854. smi = rtl8366_smi_alloc(&pdev->dev);
  855. if (!smi) {
  856. err = -ENOMEM;
  857. goto err_out;
  858. }
  859. smi->gpio_sda = pdata->gpio_sda;
  860. smi->gpio_sck = pdata->gpio_sck;
  861. smi->ops = &rtl8366rb_smi_ops;
  862. smi->cpu_port = RTL8366RB_PORT_NUM_CPU;
  863. smi->num_ports = RTL8366RB_NUM_PORTS;
  864. smi->num_vlan_mc = RTL8366RB_NUM_VLANS;
  865. smi->mib_counters = rtl8366rb_mib_counters;
  866. smi->num_mib_counters = ARRAY_SIZE(rtl8366rb_mib_counters);
  867. err = rtl8366_smi_init(smi);
  868. if (err)
  869. goto err_free_smi;
  870. platform_set_drvdata(pdev, smi);
  871. err = rtl8366rb_switch_init(smi);
  872. if (err)
  873. goto err_clear_drvdata;
  874. return 0;
  875. err_clear_drvdata:
  876. platform_set_drvdata(pdev, NULL);
  877. rtl8366_smi_cleanup(smi);
  878. err_free_smi:
  879. kfree(smi);
  880. err_out:
  881. return err;
  882. }
  883. static int rtl8366rb_phy_config_init(struct phy_device *phydev)
  884. {
  885. if (!rtl8366rb_mii_bus_match(phydev->bus))
  886. return -EINVAL;
  887. return 0;
  888. }
  889. static int rtl8366rb_phy_config_aneg(struct phy_device *phydev)
  890. {
  891. return 0;
  892. }
  893. static struct phy_driver rtl8366rb_phy_driver = {
  894. .phy_id = 0x001cc960,
  895. .name = "Realtek RTL8366RB",
  896. .phy_id_mask = 0x1ffffff0,
  897. .features = PHY_GBIT_FEATURES,
  898. .config_aneg = rtl8366rb_phy_config_aneg,
  899. .config_init = rtl8366rb_phy_config_init,
  900. .read_status = genphy_read_status,
  901. .driver = {
  902. .owner = THIS_MODULE,
  903. },
  904. };
  905. static int __devexit rtl8366rb_remove(struct platform_device *pdev)
  906. {
  907. struct rtl8366_smi *smi = platform_get_drvdata(pdev);
  908. if (smi) {
  909. rtl8366rb_switch_cleanup(smi);
  910. platform_set_drvdata(pdev, NULL);
  911. rtl8366_smi_cleanup(smi);
  912. kfree(smi);
  913. }
  914. return 0;
  915. }
  916. static struct platform_driver rtl8366rb_driver = {
  917. .driver = {
  918. .name = RTL8366RB_DRIVER_NAME,
  919. .owner = THIS_MODULE,
  920. },
  921. .probe = rtl8366rb_probe,
  922. .remove = __devexit_p(rtl8366rb_remove),
  923. };
  924. static int __init rtl8366rb_module_init(void)
  925. {
  926. int ret;
  927. ret = platform_driver_register(&rtl8366rb_driver);
  928. if (ret)
  929. return ret;
  930. ret = phy_driver_register(&rtl8366rb_phy_driver);
  931. if (ret)
  932. goto err_platform_unregister;
  933. return 0;
  934. err_platform_unregister:
  935. platform_driver_unregister(&rtl8366rb_driver);
  936. return ret;
  937. }
  938. module_init(rtl8366rb_module_init);
  939. static void __exit rtl8366rb_module_exit(void)
  940. {
  941. phy_driver_unregister(&rtl8366rb_phy_driver);
  942. platform_driver_unregister(&rtl8366rb_driver);
  943. }
  944. module_exit(rtl8366rb_module_exit);
  945. MODULE_DESCRIPTION(RTL8366RB_DRIVER_DESC);
  946. MODULE_VERSION(RTL8366RB_DRIVER_VER);
  947. MODULE_AUTHOR("Gabor Juhos <[email protected]>");
  948. MODULE_AUTHOR("Antti Seppälä <[email protected]>");
  949. MODULE_LICENSE("GPL v2");
  950. MODULE_ALIAS("platform:" RTL8366RB_DRIVER_NAME);