rtl8366_smi.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299
  1. /*
  2. * Realtek RTL8366 SMI interface driver
  3. *
  4. * Copyright (C) 2009-2010 Gabor Juhos <[email protected]>
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License version 2 as published
  8. * by the Free Software Foundation.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/device.h>
  13. #include <linux/delay.h>
  14. #include <linux/gpio.h>
  15. #include <linux/spinlock.h>
  16. #include <linux/skbuff.h>
  17. #include <linux/rtl8366.h>
  18. #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS
  19. #include <linux/debugfs.h>
  20. #endif
  21. #include "rtl8366_smi.h"
  22. #define RTL8366_SMI_ACK_RETRY_COUNT 5
  23. static inline void rtl8366_smi_clk_delay(struct rtl8366_smi *smi)
  24. {
  25. ndelay(smi->clk_delay);
  26. }
  27. static void rtl8366_smi_start(struct rtl8366_smi *smi)
  28. {
  29. unsigned int sda = smi->gpio_sda;
  30. unsigned int sck = smi->gpio_sck;
  31. /*
  32. * Set GPIO pins to output mode, with initial state:
  33. * SCK = 0, SDA = 1
  34. */
  35. gpio_direction_output(sck, 0);
  36. gpio_direction_output(sda, 1);
  37. rtl8366_smi_clk_delay(smi);
  38. /* CLK 1: 0 -> 1, 1 -> 0 */
  39. gpio_set_value(sck, 1);
  40. rtl8366_smi_clk_delay(smi);
  41. gpio_set_value(sck, 0);
  42. rtl8366_smi_clk_delay(smi);
  43. /* CLK 2: */
  44. gpio_set_value(sck, 1);
  45. rtl8366_smi_clk_delay(smi);
  46. gpio_set_value(sda, 0);
  47. rtl8366_smi_clk_delay(smi);
  48. gpio_set_value(sck, 0);
  49. rtl8366_smi_clk_delay(smi);
  50. gpio_set_value(sda, 1);
  51. }
  52. static void rtl8366_smi_stop(struct rtl8366_smi *smi)
  53. {
  54. unsigned int sda = smi->gpio_sda;
  55. unsigned int sck = smi->gpio_sck;
  56. rtl8366_smi_clk_delay(smi);
  57. gpio_set_value(sda, 0);
  58. gpio_set_value(sck, 1);
  59. rtl8366_smi_clk_delay(smi);
  60. gpio_set_value(sda, 1);
  61. rtl8366_smi_clk_delay(smi);
  62. gpio_set_value(sck, 1);
  63. rtl8366_smi_clk_delay(smi);
  64. gpio_set_value(sck, 0);
  65. rtl8366_smi_clk_delay(smi);
  66. gpio_set_value(sck, 1);
  67. /* add a click */
  68. rtl8366_smi_clk_delay(smi);
  69. gpio_set_value(sck, 0);
  70. rtl8366_smi_clk_delay(smi);
  71. gpio_set_value(sck, 1);
  72. /* set GPIO pins to input mode */
  73. gpio_direction_input(sda);
  74. gpio_direction_input(sck);
  75. }
  76. static void rtl8366_smi_write_bits(struct rtl8366_smi *smi, u32 data, u32 len)
  77. {
  78. unsigned int sda = smi->gpio_sda;
  79. unsigned int sck = smi->gpio_sck;
  80. for (; len > 0; len--) {
  81. rtl8366_smi_clk_delay(smi);
  82. /* prepare data */
  83. gpio_set_value(sda, !!(data & ( 1 << (len - 1))));
  84. rtl8366_smi_clk_delay(smi);
  85. /* clocking */
  86. gpio_set_value(sck, 1);
  87. rtl8366_smi_clk_delay(smi);
  88. gpio_set_value(sck, 0);
  89. }
  90. }
  91. static void rtl8366_smi_read_bits(struct rtl8366_smi *smi, u32 len, u32 *data)
  92. {
  93. unsigned int sda = smi->gpio_sda;
  94. unsigned int sck = smi->gpio_sck;
  95. gpio_direction_input(sda);
  96. for (*data = 0; len > 0; len--) {
  97. u32 u;
  98. rtl8366_smi_clk_delay(smi);
  99. /* clocking */
  100. gpio_set_value(sck, 1);
  101. rtl8366_smi_clk_delay(smi);
  102. u = !!gpio_get_value(sda);
  103. gpio_set_value(sck, 0);
  104. *data |= (u << (len - 1));
  105. }
  106. gpio_direction_output(sda, 0);
  107. }
  108. static int rtl8366_smi_wait_for_ack(struct rtl8366_smi *smi)
  109. {
  110. int retry_cnt;
  111. retry_cnt = 0;
  112. do {
  113. u32 ack;
  114. rtl8366_smi_read_bits(smi, 1, &ack);
  115. if (ack == 0)
  116. break;
  117. if (++retry_cnt > RTL8366_SMI_ACK_RETRY_COUNT) {
  118. dev_err(smi->parent, "ACK timeout\n");
  119. return -ETIMEDOUT;
  120. }
  121. } while (1);
  122. return 0;
  123. }
  124. static int rtl8366_smi_write_byte(struct rtl8366_smi *smi, u8 data)
  125. {
  126. rtl8366_smi_write_bits(smi, data, 8);
  127. return rtl8366_smi_wait_for_ack(smi);
  128. }
  129. static int rtl8366_smi_read_byte0(struct rtl8366_smi *smi, u8 *data)
  130. {
  131. u32 t;
  132. /* read data */
  133. rtl8366_smi_read_bits(smi, 8, &t);
  134. *data = (t & 0xff);
  135. /* send an ACK */
  136. rtl8366_smi_write_bits(smi, 0x00, 1);
  137. return 0;
  138. }
  139. static int rtl8366_smi_read_byte1(struct rtl8366_smi *smi, u8 *data)
  140. {
  141. u32 t;
  142. /* read data */
  143. rtl8366_smi_read_bits(smi, 8, &t);
  144. *data = (t & 0xff);
  145. /* send an ACK */
  146. rtl8366_smi_write_bits(smi, 0x01, 1);
  147. return 0;
  148. }
  149. int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data)
  150. {
  151. unsigned long flags;
  152. u8 lo = 0;
  153. u8 hi = 0;
  154. int ret;
  155. spin_lock_irqsave(&smi->lock, flags);
  156. rtl8366_smi_start(smi);
  157. /* send READ command */
  158. ret = rtl8366_smi_write_byte(smi, smi->cmd_read);
  159. if (ret)
  160. goto out;
  161. /* set ADDR[7:0] */
  162. ret = rtl8366_smi_write_byte(smi, addr & 0xff);
  163. if (ret)
  164. goto out;
  165. /* set ADDR[15:8] */
  166. ret = rtl8366_smi_write_byte(smi, addr >> 8);
  167. if (ret)
  168. goto out;
  169. /* read DATA[7:0] */
  170. rtl8366_smi_read_byte0(smi, &lo);
  171. /* read DATA[15:8] */
  172. rtl8366_smi_read_byte1(smi, &hi);
  173. *data = ((u32) lo) | (((u32) hi) << 8);
  174. ret = 0;
  175. out:
  176. rtl8366_smi_stop(smi);
  177. spin_unlock_irqrestore(&smi->lock, flags);
  178. return ret;
  179. }
  180. EXPORT_SYMBOL_GPL(rtl8366_smi_read_reg);
  181. int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
  182. {
  183. unsigned long flags;
  184. int ret;
  185. spin_lock_irqsave(&smi->lock, flags);
  186. rtl8366_smi_start(smi);
  187. /* send WRITE command */
  188. ret = rtl8366_smi_write_byte(smi, smi->cmd_write);
  189. if (ret)
  190. goto out;
  191. /* set ADDR[7:0] */
  192. ret = rtl8366_smi_write_byte(smi, addr & 0xff);
  193. if (ret)
  194. goto out;
  195. /* set ADDR[15:8] */
  196. ret = rtl8366_smi_write_byte(smi, addr >> 8);
  197. if (ret)
  198. goto out;
  199. /* write DATA[7:0] */
  200. ret = rtl8366_smi_write_byte(smi, data & 0xff);
  201. if (ret)
  202. goto out;
  203. /* write DATA[15:8] */
  204. ret = rtl8366_smi_write_byte(smi, data >> 8);
  205. if (ret)
  206. goto out;
  207. ret = 0;
  208. out:
  209. rtl8366_smi_stop(smi);
  210. spin_unlock_irqrestore(&smi->lock, flags);
  211. return ret;
  212. }
  213. EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg);
  214. int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data)
  215. {
  216. u32 t;
  217. int err;
  218. err = rtl8366_smi_read_reg(smi, addr, &t);
  219. if (err)
  220. return err;
  221. err = rtl8366_smi_write_reg(smi, addr, (t & ~mask) | data);
  222. return err;
  223. }
  224. EXPORT_SYMBOL_GPL(rtl8366_smi_rmwr);
  225. static int rtl8366_mc_is_used(struct rtl8366_smi *smi, int mc_index, int *used)
  226. {
  227. int err;
  228. int i;
  229. *used = 0;
  230. for (i = 0; i < smi->num_ports; i++) {
  231. int index = 0;
  232. err = smi->ops->get_mc_index(smi, i, &index);
  233. if (err)
  234. return err;
  235. if (mc_index == index) {
  236. *used = 1;
  237. break;
  238. }
  239. }
  240. return 0;
  241. }
  242. static int rtl8366_set_vlan(struct rtl8366_smi *smi, int vid, u32 member,
  243. u32 untag, u32 fid)
  244. {
  245. struct rtl8366_vlan_4k vlan4k;
  246. int err;
  247. int i;
  248. /* Update the 4K table */
  249. err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
  250. if (err)
  251. return err;
  252. vlan4k.member = member;
  253. vlan4k.untag = untag;
  254. vlan4k.fid = fid;
  255. err = smi->ops->set_vlan_4k(smi, &vlan4k);
  256. if (err)
  257. return err;
  258. /* Try to find an existing MC entry for this VID */
  259. for (i = 0; i < smi->num_vlan_mc; i++) {
  260. struct rtl8366_vlan_mc vlanmc;
  261. err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
  262. if (err)
  263. return err;
  264. if (vid == vlanmc.vid) {
  265. /* update the MC entry */
  266. vlanmc.member = member;
  267. vlanmc.untag = untag;
  268. vlanmc.fid = fid;
  269. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  270. break;
  271. }
  272. }
  273. return err;
  274. }
  275. static int rtl8366_get_pvid(struct rtl8366_smi *smi, int port, int *val)
  276. {
  277. struct rtl8366_vlan_mc vlanmc;
  278. int err;
  279. int index;
  280. err = smi->ops->get_mc_index(smi, port, &index);
  281. if (err)
  282. return err;
  283. err = smi->ops->get_vlan_mc(smi, index, &vlanmc);
  284. if (err)
  285. return err;
  286. *val = vlanmc.vid;
  287. return 0;
  288. }
  289. static int rtl8366_set_pvid(struct rtl8366_smi *smi, unsigned port,
  290. unsigned vid)
  291. {
  292. struct rtl8366_vlan_mc vlanmc;
  293. struct rtl8366_vlan_4k vlan4k;
  294. int err;
  295. int i;
  296. /* Try to find an existing MC entry for this VID */
  297. for (i = 0; i < smi->num_vlan_mc; i++) {
  298. err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
  299. if (err)
  300. return err;
  301. if (vid == vlanmc.vid) {
  302. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  303. if (err)
  304. return err;
  305. err = smi->ops->set_mc_index(smi, port, i);
  306. return err;
  307. }
  308. }
  309. /* We have no MC entry for this VID, try to find an empty one */
  310. for (i = 0; i < smi->num_vlan_mc; i++) {
  311. err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
  312. if (err)
  313. return err;
  314. if (vlanmc.vid == 0 && vlanmc.member == 0) {
  315. /* Update the entry from the 4K table */
  316. err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
  317. if (err)
  318. return err;
  319. vlanmc.vid = vid;
  320. vlanmc.member = vlan4k.member;
  321. vlanmc.untag = vlan4k.untag;
  322. vlanmc.fid = vlan4k.fid;
  323. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  324. if (err)
  325. return err;
  326. err = smi->ops->set_mc_index(smi, port, i);
  327. return err;
  328. }
  329. }
  330. /* MC table is full, try to find an unused entry and replace it */
  331. for (i = 0; i < smi->num_vlan_mc; i++) {
  332. int used;
  333. err = rtl8366_mc_is_used(smi, i, &used);
  334. if (err)
  335. return err;
  336. if (!used) {
  337. /* Update the entry from the 4K table */
  338. err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
  339. if (err)
  340. return err;
  341. vlanmc.vid = vid;
  342. vlanmc.member = vlan4k.member;
  343. vlanmc.untag = vlan4k.untag;
  344. vlanmc.fid = vlan4k.fid;
  345. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  346. if (err)
  347. return err;
  348. err = smi->ops->set_mc_index(smi, port, i);
  349. return err;
  350. }
  351. }
  352. dev_err(smi->parent,
  353. "all VLAN member configurations are in use\n");
  354. return -ENOSPC;
  355. }
  356. int rtl8366_enable_vlan(struct rtl8366_smi *smi, int enable)
  357. {
  358. int err;
  359. err = smi->ops->enable_vlan(smi, enable);
  360. if (err)
  361. return err;
  362. smi->vlan_enabled = enable;
  363. if (!enable) {
  364. smi->vlan4k_enabled = 0;
  365. err = smi->ops->enable_vlan4k(smi, enable);
  366. }
  367. return err;
  368. }
  369. EXPORT_SYMBOL_GPL(rtl8366_enable_vlan);
  370. static int rtl8366_enable_vlan4k(struct rtl8366_smi *smi, int enable)
  371. {
  372. int err;
  373. if (enable) {
  374. err = smi->ops->enable_vlan(smi, enable);
  375. if (err)
  376. return err;
  377. smi->vlan_enabled = enable;
  378. }
  379. err = smi->ops->enable_vlan4k(smi, enable);
  380. if (err)
  381. return err;
  382. smi->vlan4k_enabled = enable;
  383. return 0;
  384. }
  385. int rtl8366_enable_all_ports(struct rtl8366_smi *smi, int enable)
  386. {
  387. int port;
  388. int err;
  389. for (port = 0; port < smi->num_ports; port++) {
  390. err = smi->ops->enable_port(smi, port, enable);
  391. if (err)
  392. return err;
  393. }
  394. return 0;
  395. }
  396. EXPORT_SYMBOL_GPL(rtl8366_enable_all_ports);
  397. int rtl8366_reset_vlan(struct rtl8366_smi *smi)
  398. {
  399. struct rtl8366_vlan_mc vlanmc;
  400. int err;
  401. int i;
  402. rtl8366_enable_vlan(smi, 0);
  403. rtl8366_enable_vlan4k(smi, 0);
  404. /* clear VLAN member configurations */
  405. vlanmc.vid = 0;
  406. vlanmc.priority = 0;
  407. vlanmc.member = 0;
  408. vlanmc.untag = 0;
  409. vlanmc.fid = 0;
  410. for (i = 0; i < smi->num_vlan_mc; i++) {
  411. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  412. if (err)
  413. return err;
  414. }
  415. return 0;
  416. }
  417. EXPORT_SYMBOL_GPL(rtl8366_reset_vlan);
  418. static int rtl8366_init_vlan(struct rtl8366_smi *smi)
  419. {
  420. int port;
  421. int err;
  422. err = rtl8366_reset_vlan(smi);
  423. if (err)
  424. return err;
  425. for (port = 0; port < smi->num_ports; port++) {
  426. u32 mask;
  427. if (port == smi->cpu_port)
  428. mask = (1 << smi->num_ports) - 1;
  429. else
  430. mask = (1 << port) | (1 << smi->cpu_port);
  431. err = rtl8366_set_vlan(smi, (port + 1), mask, mask, 0);
  432. if (err)
  433. return err;
  434. err = rtl8366_set_pvid(smi, port, (port + 1));
  435. if (err)
  436. return err;
  437. }
  438. return rtl8366_enable_vlan(smi, 1);
  439. }
  440. #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS
  441. int rtl8366_debugfs_open(struct inode *inode, struct file *file)
  442. {
  443. file->private_data = inode->i_private;
  444. return 0;
  445. }
  446. EXPORT_SYMBOL_GPL(rtl8366_debugfs_open);
  447. static ssize_t rtl8366_read_debugfs_vlan_mc(struct file *file,
  448. char __user *user_buf,
  449. size_t count, loff_t *ppos)
  450. {
  451. struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
  452. int i, len = 0;
  453. char *buf = smi->buf;
  454. len += snprintf(buf + len, sizeof(smi->buf) - len,
  455. "%2s %6s %4s %6s %6s %3s\n",
  456. "id", "vid","prio", "member", "untag", "fid");
  457. for (i = 0; i < smi->num_vlan_mc; ++i) {
  458. struct rtl8366_vlan_mc vlanmc;
  459. smi->ops->get_vlan_mc(smi, i, &vlanmc);
  460. len += snprintf(buf + len, sizeof(smi->buf) - len,
  461. "%2d %6d %4d 0x%04x 0x%04x %3d\n",
  462. i, vlanmc.vid, vlanmc.priority,
  463. vlanmc.member, vlanmc.untag, vlanmc.fid);
  464. }
  465. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  466. }
  467. #define RTL8366_VLAN4K_PAGE_SIZE 64
  468. #define RTL8366_VLAN4K_NUM_PAGES (4096 / RTL8366_VLAN4K_PAGE_SIZE)
  469. static ssize_t rtl8366_read_debugfs_vlan_4k(struct file *file,
  470. char __user *user_buf,
  471. size_t count, loff_t *ppos)
  472. {
  473. struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
  474. int i, len = 0;
  475. int offset;
  476. char *buf = smi->buf;
  477. if (smi->dbg_vlan_4k_page >= RTL8366_VLAN4K_NUM_PAGES) {
  478. len += snprintf(buf + len, sizeof(smi->buf) - len,
  479. "invalid page: %u\n", smi->dbg_vlan_4k_page);
  480. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  481. }
  482. len += snprintf(buf + len, sizeof(smi->buf) - len,
  483. "%4s %6s %6s %3s\n",
  484. "vid", "member", "untag", "fid");
  485. offset = RTL8366_VLAN4K_PAGE_SIZE * smi->dbg_vlan_4k_page;
  486. for (i = 0; i < RTL8366_VLAN4K_PAGE_SIZE; i++) {
  487. struct rtl8366_vlan_4k vlan4k;
  488. smi->ops->get_vlan_4k(smi, offset + i, &vlan4k);
  489. len += snprintf(buf + len, sizeof(smi->buf) - len,
  490. "%4d 0x%04x 0x%04x %3d\n",
  491. vlan4k.vid, vlan4k.member,
  492. vlan4k.untag, vlan4k.fid);
  493. }
  494. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  495. }
  496. static ssize_t rtl8366_read_debugfs_pvid(struct file *file,
  497. char __user *user_buf,
  498. size_t count, loff_t *ppos)
  499. {
  500. struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
  501. char *buf = smi->buf;
  502. int len = 0;
  503. int i;
  504. len += snprintf(buf + len, sizeof(smi->buf) - len, "%4s %4s\n",
  505. "port", "pvid");
  506. for (i = 0; i < smi->num_ports; i++) {
  507. int pvid;
  508. int err;
  509. err = rtl8366_get_pvid(smi, i, &pvid);
  510. if (err)
  511. len += snprintf(buf + len, sizeof(smi->buf) - len,
  512. "%4d error\n", i);
  513. else
  514. len += snprintf(buf + len, sizeof(smi->buf) - len,
  515. "%4d %4d\n", i, pvid);
  516. }
  517. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  518. }
  519. static ssize_t rtl8366_read_debugfs_reg(struct file *file,
  520. char __user *user_buf,
  521. size_t count, loff_t *ppos)
  522. {
  523. struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
  524. u32 t, reg = smi->dbg_reg;
  525. int err, len = 0;
  526. char *buf = smi->buf;
  527. memset(buf, '\0', sizeof(smi->buf));
  528. err = rtl8366_smi_read_reg(smi, reg, &t);
  529. if (err) {
  530. len += snprintf(buf, sizeof(smi->buf),
  531. "Read failed (reg: 0x%04x)\n", reg);
  532. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  533. }
  534. len += snprintf(buf, sizeof(smi->buf), "reg = 0x%04x, val = 0x%04x\n",
  535. reg, t);
  536. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  537. }
  538. static ssize_t rtl8366_write_debugfs_reg(struct file *file,
  539. const char __user *user_buf,
  540. size_t count, loff_t *ppos)
  541. {
  542. struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
  543. unsigned long data;
  544. u32 reg = smi->dbg_reg;
  545. int err;
  546. size_t len;
  547. char *buf = smi->buf;
  548. len = min(count, sizeof(smi->buf) - 1);
  549. if (copy_from_user(buf, user_buf, len)) {
  550. dev_err(smi->parent, "copy from user failed\n");
  551. return -EFAULT;
  552. }
  553. buf[len] = '\0';
  554. if (len > 0 && buf[len - 1] == '\n')
  555. buf[len - 1] = '\0';
  556. if (strict_strtoul(buf, 16, &data)) {
  557. dev_err(smi->parent, "Invalid reg value %s\n", buf);
  558. } else {
  559. err = rtl8366_smi_write_reg(smi, reg, data);
  560. if (err) {
  561. dev_err(smi->parent,
  562. "writing reg 0x%04x val 0x%04lx failed\n",
  563. reg, data);
  564. }
  565. }
  566. return count;
  567. }
  568. static ssize_t rtl8366_read_debugfs_mibs(struct file *file,
  569. char __user *user_buf,
  570. size_t count, loff_t *ppos)
  571. {
  572. struct rtl8366_smi *smi = file->private_data;
  573. int i, j, len = 0;
  574. char *buf = smi->buf;
  575. len += snprintf(buf + len, sizeof(smi->buf) - len, "%-36s",
  576. "Counter");
  577. for (i = 0; i < smi->num_ports; i++) {
  578. char port_buf[10];
  579. snprintf(port_buf, sizeof(port_buf), "Port %d", i);
  580. len += snprintf(buf + len, sizeof(smi->buf) - len, " %12s",
  581. port_buf);
  582. }
  583. len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
  584. for (i = 0; i < smi->num_mib_counters; i++) {
  585. len += snprintf(buf + len, sizeof(smi->buf) - len, "%-36s ",
  586. smi->mib_counters[i].name);
  587. for (j = 0; j < smi->num_ports; j++) {
  588. unsigned long long counter = 0;
  589. if (!smi->ops->get_mib_counter(smi, i, j, &counter))
  590. len += snprintf(buf + len,
  591. sizeof(smi->buf) - len,
  592. "%12llu ", counter);
  593. else
  594. len += snprintf(buf + len,
  595. sizeof(smi->buf) - len,
  596. "%12s ", "error");
  597. }
  598. len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
  599. }
  600. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  601. }
  602. static const struct file_operations fops_rtl8366_regs = {
  603. .read = rtl8366_read_debugfs_reg,
  604. .write = rtl8366_write_debugfs_reg,
  605. .open = rtl8366_debugfs_open,
  606. .owner = THIS_MODULE
  607. };
  608. static const struct file_operations fops_rtl8366_vlan_mc = {
  609. .read = rtl8366_read_debugfs_vlan_mc,
  610. .open = rtl8366_debugfs_open,
  611. .owner = THIS_MODULE
  612. };
  613. static const struct file_operations fops_rtl8366_vlan_4k = {
  614. .read = rtl8366_read_debugfs_vlan_4k,
  615. .open = rtl8366_debugfs_open,
  616. .owner = THIS_MODULE
  617. };
  618. static const struct file_operations fops_rtl8366_pvid = {
  619. .read = rtl8366_read_debugfs_pvid,
  620. .open = rtl8366_debugfs_open,
  621. .owner = THIS_MODULE
  622. };
  623. static const struct file_operations fops_rtl8366_mibs = {
  624. .read = rtl8366_read_debugfs_mibs,
  625. .open = rtl8366_debugfs_open,
  626. .owner = THIS_MODULE
  627. };
  628. static void rtl8366_debugfs_init(struct rtl8366_smi *smi)
  629. {
  630. struct dentry *node;
  631. struct dentry *root;
  632. if (!smi->debugfs_root)
  633. smi->debugfs_root = debugfs_create_dir(dev_name(smi->parent),
  634. NULL);
  635. if (!smi->debugfs_root) {
  636. dev_err(smi->parent, "Unable to create debugfs dir\n");
  637. return;
  638. }
  639. root = smi->debugfs_root;
  640. node = debugfs_create_x16("reg", S_IRUGO | S_IWUSR, root,
  641. &smi->dbg_reg);
  642. if (!node) {
  643. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  644. "reg");
  645. return;
  646. }
  647. node = debugfs_create_file("val", S_IRUGO | S_IWUSR, root, smi,
  648. &fops_rtl8366_regs);
  649. if (!node) {
  650. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  651. "val");
  652. return;
  653. }
  654. node = debugfs_create_file("vlan_mc", S_IRUSR, root, smi,
  655. &fops_rtl8366_vlan_mc);
  656. if (!node) {
  657. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  658. "vlan_mc");
  659. return;
  660. }
  661. node = debugfs_create_u8("vlan_4k_page", S_IRUGO | S_IWUSR, root,
  662. &smi->dbg_vlan_4k_page);
  663. if (!node) {
  664. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  665. "vlan_4k_page");
  666. return;
  667. }
  668. node = debugfs_create_file("vlan_4k", S_IRUSR, root, smi,
  669. &fops_rtl8366_vlan_4k);
  670. if (!node) {
  671. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  672. "vlan_4k");
  673. return;
  674. }
  675. node = debugfs_create_file("pvid", S_IRUSR, root, smi,
  676. &fops_rtl8366_pvid);
  677. if (!node) {
  678. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  679. "pvid");
  680. return;
  681. }
  682. node = debugfs_create_file("mibs", S_IRUSR, smi->debugfs_root, smi,
  683. &fops_rtl8366_mibs);
  684. if (!node)
  685. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  686. "mibs");
  687. }
  688. static void rtl8366_debugfs_remove(struct rtl8366_smi *smi)
  689. {
  690. if (smi->debugfs_root) {
  691. debugfs_remove_recursive(smi->debugfs_root);
  692. smi->debugfs_root = NULL;
  693. }
  694. }
  695. #else
  696. static inline void rtl8366_debugfs_init(struct rtl8366_smi *smi) {}
  697. static inline void rtl8366_debugfs_remove(struct rtl8366_smi *smi) {}
  698. #endif /* CONFIG_RTL8366S_PHY_DEBUG_FS */
  699. static int rtl8366_smi_mii_init(struct rtl8366_smi *smi)
  700. {
  701. int ret;
  702. int i;
  703. smi->mii_bus = mdiobus_alloc();
  704. if (smi->mii_bus == NULL) {
  705. ret = -ENOMEM;
  706. goto err;
  707. }
  708. smi->mii_bus->priv = (void *) smi;
  709. smi->mii_bus->name = dev_name(smi->parent);
  710. smi->mii_bus->read = smi->ops->mii_read;
  711. smi->mii_bus->write = smi->ops->mii_write;
  712. snprintf(smi->mii_bus->id, MII_BUS_ID_SIZE, "%s",
  713. dev_name(smi->parent));
  714. smi->mii_bus->parent = smi->parent;
  715. smi->mii_bus->phy_mask = ~(0x1f);
  716. smi->mii_bus->irq = smi->mii_irq;
  717. for (i = 0; i < PHY_MAX_ADDR; i++)
  718. smi->mii_irq[i] = PHY_POLL;
  719. ret = mdiobus_register(smi->mii_bus);
  720. if (ret)
  721. goto err_free;
  722. return 0;
  723. err_free:
  724. mdiobus_free(smi->mii_bus);
  725. err:
  726. return ret;
  727. }
  728. static void rtl8366_smi_mii_cleanup(struct rtl8366_smi *smi)
  729. {
  730. mdiobus_unregister(smi->mii_bus);
  731. mdiobus_free(smi->mii_bus);
  732. }
  733. int rtl8366_sw_get_port_pvid(struct switch_dev *dev, int port, int *val)
  734. {
  735. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  736. return rtl8366_get_pvid(smi, port, val);
  737. }
  738. EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_pvid);
  739. int rtl8366_sw_set_port_pvid(struct switch_dev *dev, int port, int val)
  740. {
  741. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  742. return rtl8366_set_pvid(smi, port, val);
  743. }
  744. EXPORT_SYMBOL_GPL(rtl8366_sw_set_port_pvid);
  745. int rtl8366_sw_get_port_mib(struct switch_dev *dev,
  746. const struct switch_attr *attr,
  747. struct switch_val *val)
  748. {
  749. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  750. int i, len = 0;
  751. unsigned long long counter = 0;
  752. char *buf = smi->buf;
  753. if (val->port_vlan >= smi->num_ports)
  754. return -EINVAL;
  755. len += snprintf(buf + len, sizeof(smi->buf) - len,
  756. "Port %d MIB counters\n",
  757. val->port_vlan);
  758. for (i = 0; i < smi->num_mib_counters; ++i) {
  759. len += snprintf(buf + len, sizeof(smi->buf) - len,
  760. "%-36s: ", smi->mib_counters[i].name);
  761. if (!smi->ops->get_mib_counter(smi, i, val->port_vlan,
  762. &counter))
  763. len += snprintf(buf + len, sizeof(smi->buf) - len,
  764. "%llu\n", counter);
  765. else
  766. len += snprintf(buf + len, sizeof(smi->buf) - len,
  767. "%s\n", "error");
  768. }
  769. val->value.s = buf;
  770. val->len = len;
  771. return 0;
  772. }
  773. EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_mib);
  774. int rtl8366_sw_get_vlan_info(struct switch_dev *dev,
  775. const struct switch_attr *attr,
  776. struct switch_val *val)
  777. {
  778. int i;
  779. u32 len = 0;
  780. struct rtl8366_vlan_4k vlan4k;
  781. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  782. char *buf = smi->buf;
  783. int err;
  784. if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
  785. return -EINVAL;
  786. memset(buf, '\0', sizeof(smi->buf));
  787. err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
  788. if (err)
  789. return err;
  790. len += snprintf(buf + len, sizeof(smi->buf) - len,
  791. "VLAN %d: Ports: '", vlan4k.vid);
  792. for (i = 0; i < smi->num_ports; i++) {
  793. if (!(vlan4k.member & (1 << i)))
  794. continue;
  795. len += snprintf(buf + len, sizeof(smi->buf) - len, "%d%s", i,
  796. (vlan4k.untag & (1 << i)) ? "" : "t");
  797. }
  798. len += snprintf(buf + len, sizeof(smi->buf) - len,
  799. "', members=%04x, untag=%04x, fid=%u",
  800. vlan4k.member, vlan4k.untag, vlan4k.fid);
  801. val->value.s = buf;
  802. val->len = len;
  803. return 0;
  804. }
  805. EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_info);
  806. int rtl8366_sw_get_vlan_ports(struct switch_dev *dev, struct switch_val *val)
  807. {
  808. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  809. struct switch_port *port;
  810. struct rtl8366_vlan_4k vlan4k;
  811. int i;
  812. if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
  813. return -EINVAL;
  814. smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
  815. port = &val->value.ports[0];
  816. val->len = 0;
  817. for (i = 0; i < smi->num_ports; i++) {
  818. if (!(vlan4k.member & BIT(i)))
  819. continue;
  820. port->id = i;
  821. port->flags = (vlan4k.untag & BIT(i)) ?
  822. 0 : BIT(SWITCH_PORT_FLAG_TAGGED);
  823. val->len++;
  824. port++;
  825. }
  826. return 0;
  827. }
  828. EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_ports);
  829. int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
  830. {
  831. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  832. struct switch_port *port;
  833. u32 member = 0;
  834. u32 untag = 0;
  835. int err;
  836. int i;
  837. if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
  838. return -EINVAL;
  839. port = &val->value.ports[0];
  840. for (i = 0; i < val->len; i++, port++) {
  841. member |= BIT(port->id);
  842. if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED)))
  843. untag |= BIT(port->id);
  844. /*
  845. * To ensure that we have a valid MC entry for this VLAN,
  846. * initialize the port VLAN ID here.
  847. */
  848. err = rtl8366_set_pvid(smi, port->id, val->port_vlan);
  849. if (err < 0)
  850. return err;
  851. }
  852. return rtl8366_set_vlan(smi, val->port_vlan, member, untag, 0);
  853. }
  854. EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_ports);
  855. int rtl8366_sw_get_vlan_fid(struct switch_dev *dev,
  856. const struct switch_attr *attr,
  857. struct switch_val *val)
  858. {
  859. struct rtl8366_vlan_4k vlan4k;
  860. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  861. int err;
  862. if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
  863. return -EINVAL;
  864. err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
  865. if (err)
  866. return err;
  867. val->value.i = vlan4k.fid;
  868. return 0;
  869. }
  870. EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_fid);
  871. int rtl8366_sw_set_vlan_fid(struct switch_dev *dev,
  872. const struct switch_attr *attr,
  873. struct switch_val *val)
  874. {
  875. struct rtl8366_vlan_4k vlan4k;
  876. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  877. int err;
  878. if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
  879. return -EINVAL;
  880. if (val->value.i < 0 || val->value.i > attr->max)
  881. return -EINVAL;
  882. err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
  883. if (err)
  884. return err;
  885. return rtl8366_set_vlan(smi, val->port_vlan,
  886. vlan4k.member,
  887. vlan4k.untag,
  888. val->value.i);
  889. }
  890. EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_fid);
  891. int rtl8366_sw_get_vlan_enable(struct switch_dev *dev,
  892. const struct switch_attr *attr,
  893. struct switch_val *val)
  894. {
  895. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  896. if (attr->ofs > 2)
  897. return -EINVAL;
  898. if (attr->ofs == 1)
  899. val->value.i = smi->vlan_enabled;
  900. else
  901. val->value.i = smi->vlan4k_enabled;
  902. return 0;
  903. }
  904. EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_enable);
  905. int rtl8366_sw_set_vlan_enable(struct switch_dev *dev,
  906. const struct switch_attr *attr,
  907. struct switch_val *val)
  908. {
  909. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  910. int err;
  911. if (attr->ofs > 2)
  912. return -EINVAL;
  913. if (attr->ofs == 1)
  914. err = rtl8366_enable_vlan(smi, val->value.i);
  915. else
  916. err = rtl8366_enable_vlan4k(smi, val->value.i);
  917. return err;
  918. }
  919. EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_enable);
  920. struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent)
  921. {
  922. struct rtl8366_smi *smi;
  923. BUG_ON(!parent);
  924. smi = kzalloc(sizeof(*smi), GFP_KERNEL);
  925. if (!smi) {
  926. dev_err(parent, "no memory for private data\n");
  927. return NULL;
  928. }
  929. smi->parent = parent;
  930. return smi;
  931. }
  932. EXPORT_SYMBOL_GPL(rtl8366_smi_alloc);
  933. static int __rtl8366_smi_init(struct rtl8366_smi *smi, const char *name)
  934. {
  935. int err;
  936. err = gpio_request(smi->gpio_sda, name);
  937. if (err) {
  938. printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n",
  939. smi->gpio_sda, err);
  940. goto err_out;
  941. }
  942. err = gpio_request(smi->gpio_sck, name);
  943. if (err) {
  944. printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n",
  945. smi->gpio_sck, err);
  946. goto err_free_sda;
  947. }
  948. spin_lock_init(&smi->lock);
  949. return 0;
  950. err_free_sda:
  951. gpio_free(smi->gpio_sda);
  952. err_out:
  953. return err;
  954. }
  955. static void __rtl8366_smi_cleanup(struct rtl8366_smi *smi)
  956. {
  957. gpio_free(smi->gpio_sck);
  958. gpio_free(smi->gpio_sda);
  959. }
  960. enum rtl8366_type rtl8366_smi_detect(struct rtl8366_platform_data *pdata)
  961. {
  962. static struct rtl8366_smi smi;
  963. enum rtl8366_type type = RTL8366_TYPE_UNKNOWN;
  964. u32 reg = 0;
  965. memset(&smi, 0, sizeof(smi));
  966. smi.gpio_sda = pdata->gpio_sda;
  967. smi.gpio_sck = pdata->gpio_sck;
  968. if (__rtl8366_smi_init(&smi, "rtl8366"))
  969. goto out;
  970. if (rtl8366_smi_read_reg(&smi, 0x5c, &reg))
  971. goto cleanup;
  972. switch(reg) {
  973. case 0x6027:
  974. printk("Found an RTL8366S switch\n");
  975. type = RTL8366_TYPE_S;
  976. break;
  977. case 0x5937:
  978. printk("Found an RTL8366RB switch\n");
  979. type = RTL8366_TYPE_RB;
  980. break;
  981. default:
  982. printk("Found an Unknown RTL8366 switch (id=0x%04x)\n", reg);
  983. break;
  984. }
  985. cleanup:
  986. __rtl8366_smi_cleanup(&smi);
  987. out:
  988. return type;
  989. }
  990. int rtl8366_smi_init(struct rtl8366_smi *smi)
  991. {
  992. int err;
  993. if (!smi->ops)
  994. return -EINVAL;
  995. err = __rtl8366_smi_init(smi, dev_name(smi->parent));
  996. if (err)
  997. goto err_out;
  998. spin_lock_init(&smi->lock);
  999. dev_info(smi->parent, "using GPIO pins %u (SDA) and %u (SCK)\n",
  1000. smi->gpio_sda, smi->gpio_sck);
  1001. err = smi->ops->detect(smi);
  1002. if (err) {
  1003. dev_err(smi->parent, "chip detection failed, err=%d\n", err);
  1004. goto err_free_sck;
  1005. }
  1006. err = smi->ops->setup(smi);
  1007. if (err) {
  1008. dev_err(smi->parent, "chip setup failed, err=%d\n", err);
  1009. goto err_free_sck;
  1010. }
  1011. err = rtl8366_init_vlan(smi);
  1012. if (err) {
  1013. dev_err(smi->parent, "VLAN initialization failed, err=%d\n",
  1014. err);
  1015. goto err_free_sck;
  1016. }
  1017. err = rtl8366_enable_all_ports(smi, 1);
  1018. if (err)
  1019. goto err_free_sck;
  1020. err = rtl8366_smi_mii_init(smi);
  1021. if (err)
  1022. goto err_free_sck;
  1023. rtl8366_debugfs_init(smi);
  1024. return 0;
  1025. err_free_sck:
  1026. __rtl8366_smi_cleanup(smi);
  1027. err_out:
  1028. return err;
  1029. }
  1030. EXPORT_SYMBOL_GPL(rtl8366_smi_init);
  1031. void rtl8366_smi_cleanup(struct rtl8366_smi *smi)
  1032. {
  1033. rtl8366_debugfs_remove(smi);
  1034. rtl8366_smi_mii_cleanup(smi);
  1035. gpio_free(smi->gpio_sck);
  1036. gpio_free(smi->gpio_sda);
  1037. }
  1038. EXPORT_SYMBOL_GPL(rtl8366_smi_cleanup);
  1039. MODULE_DESCRIPTION("Realtek RTL8366 SMI interface driver");
  1040. MODULE_AUTHOR("Gabor Juhos <[email protected]>");
  1041. MODULE_LICENSE("GPL v2");