rtl8366_smi.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095
  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. #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS
  18. #include <linux/debugfs.h>
  19. #endif
  20. #include "rtl8366_smi.h"
  21. #define RTL8366_SMI_ACK_RETRY_COUNT 5
  22. #define RTL8366_SMI_CLK_DELAY 10 /* nsec */
  23. static inline void rtl8366_smi_clk_delay(struct rtl8366_smi *smi)
  24. {
  25. ndelay(RTL8366_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. return -EIO;
  119. } while (1);
  120. return 0;
  121. }
  122. static int rtl8366_smi_write_byte(struct rtl8366_smi *smi, u8 data)
  123. {
  124. rtl8366_smi_write_bits(smi, data, 8);
  125. return rtl8366_smi_wait_for_ack(smi);
  126. }
  127. static int rtl8366_smi_read_byte0(struct rtl8366_smi *smi, u8 *data)
  128. {
  129. u32 t;
  130. /* read data */
  131. rtl8366_smi_read_bits(smi, 8, &t);
  132. *data = (t & 0xff);
  133. /* send an ACK */
  134. rtl8366_smi_write_bits(smi, 0x00, 1);
  135. return 0;
  136. }
  137. static int rtl8366_smi_read_byte1(struct rtl8366_smi *smi, u8 *data)
  138. {
  139. u32 t;
  140. /* read data */
  141. rtl8366_smi_read_bits(smi, 8, &t);
  142. *data = (t & 0xff);
  143. /* send an ACK */
  144. rtl8366_smi_write_bits(smi, 0x01, 1);
  145. return 0;
  146. }
  147. int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data)
  148. {
  149. unsigned long flags;
  150. u8 lo = 0;
  151. u8 hi = 0;
  152. int ret;
  153. spin_lock_irqsave(&smi->lock, flags);
  154. rtl8366_smi_start(smi);
  155. /* send READ command */
  156. ret = rtl8366_smi_write_byte(smi, 0x0a << 4 | 0x04 << 1 | 0x01);
  157. if (ret)
  158. goto out;
  159. /* set ADDR[7:0] */
  160. ret = rtl8366_smi_write_byte(smi, addr & 0xff);
  161. if (ret)
  162. goto out;
  163. /* set ADDR[15:8] */
  164. ret = rtl8366_smi_write_byte(smi, addr >> 8);
  165. if (ret)
  166. goto out;
  167. /* read DATA[7:0] */
  168. rtl8366_smi_read_byte0(smi, &lo);
  169. /* read DATA[15:8] */
  170. rtl8366_smi_read_byte1(smi, &hi);
  171. *data = ((u32) lo) | (((u32) hi) << 8);
  172. ret = 0;
  173. out:
  174. rtl8366_smi_stop(smi);
  175. spin_unlock_irqrestore(&smi->lock, flags);
  176. return ret;
  177. }
  178. EXPORT_SYMBOL_GPL(rtl8366_smi_read_reg);
  179. int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
  180. {
  181. unsigned long flags;
  182. int ret;
  183. spin_lock_irqsave(&smi->lock, flags);
  184. rtl8366_smi_start(smi);
  185. /* send WRITE command */
  186. ret = rtl8366_smi_write_byte(smi, 0x0a << 4 | 0x04 << 1 | 0x00);
  187. if (ret)
  188. goto out;
  189. /* set ADDR[7:0] */
  190. ret = rtl8366_smi_write_byte(smi, addr & 0xff);
  191. if (ret)
  192. goto out;
  193. /* set ADDR[15:8] */
  194. ret = rtl8366_smi_write_byte(smi, addr >> 8);
  195. if (ret)
  196. goto out;
  197. /* write DATA[7:0] */
  198. ret = rtl8366_smi_write_byte(smi, data & 0xff);
  199. if (ret)
  200. goto out;
  201. /* write DATA[15:8] */
  202. ret = rtl8366_smi_write_byte(smi, data >> 8);
  203. if (ret)
  204. goto out;
  205. ret = 0;
  206. out:
  207. rtl8366_smi_stop(smi);
  208. spin_unlock_irqrestore(&smi->lock, flags);
  209. return ret;
  210. }
  211. EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg);
  212. int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data)
  213. {
  214. u32 t;
  215. int err;
  216. err = rtl8366_smi_read_reg(smi, addr, &t);
  217. if (err)
  218. return err;
  219. err = rtl8366_smi_write_reg(smi, addr, (t & ~mask) | data);
  220. return err;
  221. }
  222. EXPORT_SYMBOL_GPL(rtl8366_smi_rmwr);
  223. static int rtl8366_mc_is_used(struct rtl8366_smi *smi, int mc_index, int *used)
  224. {
  225. int err;
  226. int i;
  227. *used = 0;
  228. for (i = 0; i < smi->num_ports; i++) {
  229. int index = 0;
  230. err = smi->ops->get_mc_index(smi, i, &index);
  231. if (err)
  232. return err;
  233. if (mc_index == index) {
  234. *used = 1;
  235. break;
  236. }
  237. }
  238. return 0;
  239. }
  240. static int rtl8366_set_vlan(struct rtl8366_smi *smi, int vid, u32 member,
  241. u32 untag, u32 fid)
  242. {
  243. struct rtl8366_vlan_4k vlan4k;
  244. int err;
  245. int i;
  246. /* Update the 4K table */
  247. err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
  248. if (err)
  249. return err;
  250. vlan4k.member = member;
  251. vlan4k.untag = untag;
  252. vlan4k.fid = fid;
  253. err = smi->ops->set_vlan_4k(smi, &vlan4k);
  254. if (err)
  255. return err;
  256. /* Try to find an existing MC entry for this VID */
  257. for (i = 0; i < smi->num_vlan_mc; i++) {
  258. struct rtl8366_vlan_mc vlanmc;
  259. err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
  260. if (err)
  261. return err;
  262. if (vid == vlanmc.vid) {
  263. /* update the MC entry */
  264. vlanmc.member = member;
  265. vlanmc.untag = untag;
  266. vlanmc.fid = fid;
  267. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  268. break;
  269. }
  270. }
  271. return err;
  272. }
  273. static int rtl8366_get_pvid(struct rtl8366_smi *smi, int port, int *val)
  274. {
  275. struct rtl8366_vlan_mc vlanmc;
  276. int err;
  277. int index;
  278. err = smi->ops->get_mc_index(smi, port, &index);
  279. if (err)
  280. return err;
  281. err = smi->ops->get_vlan_mc(smi, index, &vlanmc);
  282. if (err)
  283. return err;
  284. *val = vlanmc.vid;
  285. return 0;
  286. }
  287. static int rtl8366_set_pvid(struct rtl8366_smi *smi, unsigned port,
  288. unsigned vid)
  289. {
  290. struct rtl8366_vlan_mc vlanmc;
  291. struct rtl8366_vlan_4k vlan4k;
  292. int err;
  293. int i;
  294. /* Try to find an existing MC entry for this VID */
  295. for (i = 0; i < smi->num_vlan_mc; i++) {
  296. err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
  297. if (err)
  298. return err;
  299. if (vid == vlanmc.vid) {
  300. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  301. if (err)
  302. return err;
  303. err = smi->ops->set_mc_index(smi, port, i);
  304. return err;
  305. }
  306. }
  307. /* We have no MC entry for this VID, try to find an empty one */
  308. for (i = 0; i < smi->num_vlan_mc; i++) {
  309. err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
  310. if (err)
  311. return err;
  312. if (vlanmc.vid == 0 && vlanmc.member == 0) {
  313. /* Update the entry from the 4K table */
  314. err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
  315. if (err)
  316. return err;
  317. vlanmc.vid = vid;
  318. vlanmc.member = vlan4k.member;
  319. vlanmc.untag = vlan4k.untag;
  320. vlanmc.fid = vlan4k.fid;
  321. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  322. if (err)
  323. return err;
  324. err = smi->ops->set_mc_index(smi, port, i);
  325. return err;
  326. }
  327. }
  328. /* MC table is full, try to find an unused entry and replace it */
  329. for (i = 0; i < smi->num_vlan_mc; i++) {
  330. int used;
  331. err = rtl8366_mc_is_used(smi, i, &used);
  332. if (err)
  333. return err;
  334. if (!used) {
  335. /* Update the entry from the 4K table */
  336. err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
  337. if (err)
  338. return err;
  339. vlanmc.vid = vid;
  340. vlanmc.member = vlan4k.member;
  341. vlanmc.untag = vlan4k.untag;
  342. vlanmc.fid = vlan4k.fid;
  343. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  344. if (err)
  345. return err;
  346. err = smi->ops->set_mc_index(smi, port, i);
  347. return err;
  348. }
  349. }
  350. dev_err(smi->parent,
  351. "all VLAN member configurations are in use\n");
  352. return -ENOSPC;
  353. }
  354. static int rtl8366_enable_vlan(struct rtl8366_smi *smi, int enable)
  355. {
  356. int err;
  357. err = smi->ops->enable_vlan(smi, enable);
  358. if (err)
  359. return err;
  360. smi->vlan_enabled = enable;
  361. if (!enable) {
  362. smi->vlan4k_enabled = 0;
  363. err = smi->ops->enable_vlan4k(smi, enable);
  364. }
  365. return err;
  366. }
  367. static int rtl8366_enable_vlan4k(struct rtl8366_smi *smi, int enable)
  368. {
  369. int err;
  370. if (enable) {
  371. err = smi->ops->enable_vlan(smi, enable);
  372. if (err)
  373. return err;
  374. smi->vlan_enabled = enable;
  375. }
  376. err = smi->ops->enable_vlan4k(smi, enable);
  377. if (err)
  378. return err;
  379. smi->vlan4k_enabled = enable;
  380. return 0;
  381. }
  382. int rtl8366_reset_vlan(struct rtl8366_smi *smi)
  383. {
  384. struct rtl8366_vlan_mc vlanmc;
  385. int err;
  386. int i;
  387. rtl8366_enable_vlan(smi, 0);
  388. rtl8366_enable_vlan4k(smi, 0);
  389. /* clear VLAN member configurations */
  390. vlanmc.vid = 0;
  391. vlanmc.priority = 0;
  392. vlanmc.member = 0;
  393. vlanmc.untag = 0;
  394. vlanmc.fid = 0;
  395. for (i = 0; i < smi->num_vlan_mc; i++) {
  396. err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
  397. if (err)
  398. return err;
  399. }
  400. for (i = 0; i < smi->num_ports; i++) {
  401. if (i == smi->cpu_port)
  402. continue;
  403. err = rtl8366_set_vlan(smi, (i + 1),
  404. (1 << i) | (1 << smi->cpu_port),
  405. (1 << i) | (1 << smi->cpu_port),
  406. 0);
  407. if (err)
  408. return err;
  409. err = rtl8366_set_pvid(smi, i, (i + 1));
  410. if (err)
  411. return err;
  412. }
  413. return 0;
  414. }
  415. EXPORT_SYMBOL_GPL(rtl8366_reset_vlan);
  416. #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS
  417. int rtl8366_debugfs_open(struct inode *inode, struct file *file)
  418. {
  419. file->private_data = inode->i_private;
  420. return 0;
  421. }
  422. EXPORT_SYMBOL_GPL(rtl8366_debugfs_open);
  423. static ssize_t rtl8366_read_debugfs_vlan_mc(struct file *file,
  424. char __user *user_buf,
  425. size_t count, loff_t *ppos)
  426. {
  427. struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
  428. int i, len = 0;
  429. char *buf = smi->buf;
  430. len += snprintf(buf + len, sizeof(smi->buf) - len,
  431. "%2s %6s %4s %6s %6s %3s\n",
  432. "id", "vid","prio", "member", "untag", "fid");
  433. for (i = 0; i < smi->num_vlan_mc; ++i) {
  434. struct rtl8366_vlan_mc vlanmc;
  435. smi->ops->get_vlan_mc(smi, i, &vlanmc);
  436. len += snprintf(buf + len, sizeof(smi->buf) - len,
  437. "%2d %6d %4d 0x%04x 0x%04x %3d\n",
  438. i, vlanmc.vid, vlanmc.priority,
  439. vlanmc.member, vlanmc.untag, vlanmc.fid);
  440. }
  441. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  442. }
  443. static ssize_t rtl8366_read_debugfs_pvid(struct file *file,
  444. char __user *user_buf,
  445. size_t count, loff_t *ppos)
  446. {
  447. struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
  448. char *buf = smi->buf;
  449. int len = 0;
  450. int i;
  451. len += snprintf(buf + len, sizeof(smi->buf) - len, "%4s %4s\n",
  452. "port", "pvid");
  453. for (i = 0; i < smi->num_ports; i++) {
  454. int pvid;
  455. int err;
  456. err = rtl8366_get_pvid(smi, i, &pvid);
  457. if (err)
  458. len += snprintf(buf + len, sizeof(smi->buf) - len,
  459. "%4d error\n", i);
  460. else
  461. len += snprintf(buf + len, sizeof(smi->buf) - len,
  462. "%4d %4d\n", i, pvid);
  463. }
  464. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  465. }
  466. static ssize_t rtl8366_read_debugfs_reg(struct file *file,
  467. char __user *user_buf,
  468. size_t count, loff_t *ppos)
  469. {
  470. struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
  471. u32 t, reg = smi->dbg_reg;
  472. int err, len = 0;
  473. char *buf = smi->buf;
  474. memset(buf, '\0', sizeof(smi->buf));
  475. err = rtl8366_smi_read_reg(smi, reg, &t);
  476. if (err) {
  477. len += snprintf(buf, sizeof(smi->buf),
  478. "Read failed (reg: 0x%04x)\n", reg);
  479. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  480. }
  481. len += snprintf(buf, sizeof(smi->buf), "reg = 0x%04x, val = 0x%04x\n",
  482. reg, t);
  483. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  484. }
  485. static ssize_t rtl8366_write_debugfs_reg(struct file *file,
  486. const char __user *user_buf,
  487. size_t count, loff_t *ppos)
  488. {
  489. struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
  490. unsigned long data;
  491. u32 reg = smi->dbg_reg;
  492. int err;
  493. size_t len;
  494. char *buf = smi->buf;
  495. len = min(count, sizeof(smi->buf) - 1);
  496. if (copy_from_user(buf, user_buf, len)) {
  497. dev_err(smi->parent, "copy from user failed\n");
  498. return -EFAULT;
  499. }
  500. buf[len] = '\0';
  501. if (len > 0 && buf[len - 1] == '\n')
  502. buf[len - 1] = '\0';
  503. if (strict_strtoul(buf, 16, &data)) {
  504. dev_err(smi->parent, "Invalid reg value %s\n", buf);
  505. } else {
  506. err = rtl8366_smi_write_reg(smi, reg, data);
  507. if (err) {
  508. dev_err(smi->parent,
  509. "writing reg 0x%04x val 0x%04lx failed\n",
  510. reg, data);
  511. }
  512. }
  513. return count;
  514. }
  515. static ssize_t rtl8366_read_debugfs_mibs(struct file *file,
  516. char __user *user_buf,
  517. size_t count, loff_t *ppos)
  518. {
  519. struct rtl8366_smi *smi = file->private_data;
  520. int i, j, len = 0;
  521. char *buf = smi->buf;
  522. len += snprintf(buf + len, sizeof(smi->buf) - len, "%-36s",
  523. "Counter");
  524. for (i = 0; i < smi->num_ports; i++) {
  525. char port_buf[10];
  526. snprintf(port_buf, sizeof(port_buf), "Port %d", i);
  527. len += snprintf(buf + len, sizeof(smi->buf) - len, " %12s",
  528. port_buf);
  529. }
  530. len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
  531. for (i = 0; i < smi->num_mib_counters; i++) {
  532. len += snprintf(buf + len, sizeof(smi->buf) - len, "%-36s ",
  533. smi->mib_counters[i].name);
  534. for (j = 0; j < smi->num_ports; j++) {
  535. unsigned long long counter = 0;
  536. if (!smi->ops->get_mib_counter(smi, i, j, &counter))
  537. len += snprintf(buf + len,
  538. sizeof(smi->buf) - len,
  539. "%12llu ", counter);
  540. else
  541. len += snprintf(buf + len,
  542. sizeof(smi->buf) - len,
  543. "%12s ", "error");
  544. }
  545. len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
  546. }
  547. return simple_read_from_buffer(user_buf, count, ppos, buf, len);
  548. }
  549. static const struct file_operations fops_rtl8366_regs = {
  550. .read = rtl8366_read_debugfs_reg,
  551. .write = rtl8366_write_debugfs_reg,
  552. .open = rtl8366_debugfs_open,
  553. .owner = THIS_MODULE
  554. };
  555. static const struct file_operations fops_rtl8366_vlan_mc = {
  556. .read = rtl8366_read_debugfs_vlan_mc,
  557. .open = rtl8366_debugfs_open,
  558. .owner = THIS_MODULE
  559. };
  560. static const struct file_operations fops_rtl8366_pvid = {
  561. .read = rtl8366_read_debugfs_pvid,
  562. .open = rtl8366_debugfs_open,
  563. .owner = THIS_MODULE
  564. };
  565. static const struct file_operations fops_rtl8366_mibs = {
  566. .read = rtl8366_read_debugfs_mibs,
  567. .open = rtl8366_debugfs_open,
  568. .owner = THIS_MODULE
  569. };
  570. static void rtl8366_debugfs_init(struct rtl8366_smi *smi)
  571. {
  572. struct dentry *node;
  573. struct dentry *root;
  574. if (!smi->debugfs_root)
  575. smi->debugfs_root = debugfs_create_dir(dev_name(smi->parent),
  576. NULL);
  577. if (!smi->debugfs_root) {
  578. dev_err(smi->parent, "Unable to create debugfs dir\n");
  579. return;
  580. }
  581. root = smi->debugfs_root;
  582. node = debugfs_create_x16("reg", S_IRUGO | S_IWUSR, root,
  583. &smi->dbg_reg);
  584. if (!node) {
  585. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  586. "reg");
  587. return;
  588. }
  589. node = debugfs_create_file("val", S_IRUGO | S_IWUSR, root, smi,
  590. &fops_rtl8366_regs);
  591. if (!node) {
  592. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  593. "val");
  594. return;
  595. }
  596. node = debugfs_create_file("vlan_mc", S_IRUSR, root, smi,
  597. &fops_rtl8366_vlan_mc);
  598. if (!node) {
  599. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  600. "vlan_mc");
  601. return;
  602. }
  603. node = debugfs_create_file("pvid", S_IRUSR, root, smi,
  604. &fops_rtl8366_pvid);
  605. if (!node) {
  606. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  607. "pvid");
  608. return;
  609. }
  610. node = debugfs_create_file("mibs", S_IRUSR, smi->debugfs_root, smi,
  611. &fops_rtl8366_mibs);
  612. if (!node)
  613. dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
  614. "mibs");
  615. }
  616. static void rtl8366_debugfs_remove(struct rtl8366_smi *smi)
  617. {
  618. if (smi->debugfs_root) {
  619. debugfs_remove_recursive(smi->debugfs_root);
  620. smi->debugfs_root = NULL;
  621. }
  622. }
  623. #else
  624. static inline void rtl8366_debugfs_init(struct rtl8366_smi *smi) {}
  625. static inline void rtl8366_debugfs_remove(struct rtl8366_smi *smi) {}
  626. #endif /* CONFIG_RTL8366S_PHY_DEBUG_FS */
  627. static int rtl8366_smi_mii_init(struct rtl8366_smi *smi)
  628. {
  629. int ret;
  630. int i;
  631. smi->mii_bus = mdiobus_alloc();
  632. if (smi->mii_bus == NULL) {
  633. ret = -ENOMEM;
  634. goto err;
  635. }
  636. smi->mii_bus->priv = (void *) smi;
  637. smi->mii_bus->name = dev_name(smi->parent);
  638. smi->mii_bus->read = smi->ops->mii_read;
  639. smi->mii_bus->write = smi->ops->mii_write;
  640. snprintf(smi->mii_bus->id, MII_BUS_ID_SIZE, "%s",
  641. dev_name(smi->parent));
  642. smi->mii_bus->parent = smi->parent;
  643. smi->mii_bus->phy_mask = ~(0x1f);
  644. smi->mii_bus->irq = smi->mii_irq;
  645. for (i = 0; i < PHY_MAX_ADDR; i++)
  646. smi->mii_irq[i] = PHY_POLL;
  647. ret = mdiobus_register(smi->mii_bus);
  648. if (ret)
  649. goto err_free;
  650. return 0;
  651. err_free:
  652. mdiobus_free(smi->mii_bus);
  653. err:
  654. return ret;
  655. }
  656. static void rtl8366_smi_mii_cleanup(struct rtl8366_smi *smi)
  657. {
  658. mdiobus_unregister(smi->mii_bus);
  659. mdiobus_free(smi->mii_bus);
  660. }
  661. int rtl8366_sw_get_port_pvid(struct switch_dev *dev, int port, int *val)
  662. {
  663. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  664. return rtl8366_get_pvid(smi, port, val);
  665. }
  666. EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_pvid);
  667. int rtl8366_sw_set_port_pvid(struct switch_dev *dev, int port, int val)
  668. {
  669. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  670. return rtl8366_set_pvid(smi, port, val);
  671. }
  672. EXPORT_SYMBOL_GPL(rtl8366_sw_set_port_pvid);
  673. int rtl8366_sw_get_port_mib(struct switch_dev *dev,
  674. const struct switch_attr *attr,
  675. struct switch_val *val)
  676. {
  677. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  678. int i, len = 0;
  679. unsigned long long counter = 0;
  680. char *buf = smi->buf;
  681. if (val->port_vlan >= smi->num_ports)
  682. return -EINVAL;
  683. len += snprintf(buf + len, sizeof(smi->buf) - len,
  684. "Port %d MIB counters\n",
  685. val->port_vlan);
  686. for (i = 0; i < smi->num_mib_counters; ++i) {
  687. len += snprintf(buf + len, sizeof(smi->buf) - len,
  688. "%-36s: ", smi->mib_counters[i].name);
  689. if (!smi->ops->get_mib_counter(smi, i, val->port_vlan,
  690. &counter))
  691. len += snprintf(buf + len, sizeof(smi->buf) - len,
  692. "%llu\n", counter);
  693. else
  694. len += snprintf(buf + len, sizeof(smi->buf) - len,
  695. "%s\n", "error");
  696. }
  697. val->value.s = buf;
  698. val->len = len;
  699. return 0;
  700. }
  701. EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_mib);
  702. int rtl8366_sw_get_vlan_info(struct switch_dev *dev,
  703. const struct switch_attr *attr,
  704. struct switch_val *val)
  705. {
  706. int i;
  707. u32 len = 0;
  708. struct rtl8366_vlan_4k vlan4k;
  709. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  710. char *buf = smi->buf;
  711. int err;
  712. if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
  713. return -EINVAL;
  714. memset(buf, '\0', sizeof(smi->buf));
  715. err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
  716. if (err)
  717. return err;
  718. len += snprintf(buf + len, sizeof(smi->buf) - len,
  719. "VLAN %d: Ports: '", vlan4k.vid);
  720. for (i = 0; i < smi->num_ports; i++) {
  721. if (!(vlan4k.member & (1 << i)))
  722. continue;
  723. len += snprintf(buf + len, sizeof(smi->buf) - len, "%d%s", i,
  724. (vlan4k.untag & (1 << i)) ? "" : "t");
  725. }
  726. len += snprintf(buf + len, sizeof(smi->buf) - len,
  727. "', members=%04x, untag=%04x, fid=%u",
  728. vlan4k.member, vlan4k.untag, vlan4k.fid);
  729. val->value.s = buf;
  730. val->len = len;
  731. return 0;
  732. }
  733. EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_info);
  734. int rtl8366_sw_get_vlan_ports(struct switch_dev *dev, struct switch_val *val)
  735. {
  736. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  737. struct switch_port *port;
  738. struct rtl8366_vlan_4k vlan4k;
  739. int i;
  740. if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
  741. return -EINVAL;
  742. smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
  743. port = &val->value.ports[0];
  744. val->len = 0;
  745. for (i = 0; i < smi->num_ports; i++) {
  746. if (!(vlan4k.member & BIT(i)))
  747. continue;
  748. port->id = i;
  749. port->flags = (vlan4k.untag & BIT(i)) ?
  750. 0 : BIT(SWITCH_PORT_FLAG_TAGGED);
  751. val->len++;
  752. port++;
  753. }
  754. return 0;
  755. }
  756. EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_ports);
  757. int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
  758. {
  759. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  760. struct switch_port *port;
  761. u32 member = 0;
  762. u32 untag = 0;
  763. int err;
  764. int i;
  765. if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
  766. return -EINVAL;
  767. port = &val->value.ports[0];
  768. for (i = 0; i < val->len; i++, port++) {
  769. member |= BIT(port->id);
  770. if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED)))
  771. untag |= BIT(port->id);
  772. /*
  773. * To ensure that we have a valid MC entry for this VLAN,
  774. * initialize the port VLAN ID here.
  775. */
  776. err = rtl8366_set_pvid(smi, port->id, val->port_vlan);
  777. if (err < 0)
  778. return err;
  779. }
  780. return rtl8366_set_vlan(smi, val->port_vlan, member, untag, 0);
  781. }
  782. EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_ports);
  783. int rtl8366_sw_get_vlan_enable(struct switch_dev *dev,
  784. const struct switch_attr *attr,
  785. struct switch_val *val)
  786. {
  787. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  788. if (attr->ofs > 2)
  789. return -EINVAL;
  790. if (attr->ofs == 1)
  791. val->value.i = smi->vlan_enabled;
  792. else
  793. val->value.i = smi->vlan4k_enabled;
  794. return 0;
  795. }
  796. EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_enable);
  797. int rtl8366_sw_set_vlan_enable(struct switch_dev *dev,
  798. const struct switch_attr *attr,
  799. struct switch_val *val)
  800. {
  801. struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
  802. int err;
  803. if (attr->ofs > 2)
  804. return -EINVAL;
  805. if (attr->ofs == 1)
  806. err = rtl8366_enable_vlan(smi, val->value.i);
  807. else
  808. err = rtl8366_enable_vlan4k(smi, val->value.i);
  809. return err;
  810. }
  811. EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_enable);
  812. struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent)
  813. {
  814. struct rtl8366_smi *smi;
  815. BUG_ON(!parent);
  816. smi = kzalloc(sizeof(*smi), GFP_KERNEL);
  817. if (!smi) {
  818. dev_err(parent, "no memory for private data\n");
  819. return NULL;
  820. }
  821. smi->parent = parent;
  822. return smi;
  823. }
  824. EXPORT_SYMBOL_GPL(rtl8366_smi_alloc);
  825. int rtl8366_smi_init(struct rtl8366_smi *smi)
  826. {
  827. int err;
  828. if (!smi->ops)
  829. return -EINVAL;
  830. err = gpio_request(smi->gpio_sda, dev_name(smi->parent));
  831. if (err) {
  832. dev_err(smi->parent, "gpio_request failed for %u, err=%d\n",
  833. smi->gpio_sda, err);
  834. goto err_out;
  835. }
  836. err = gpio_request(smi->gpio_sck, dev_name(smi->parent));
  837. if (err) {
  838. dev_err(smi->parent, "gpio_request failed for %u, err=%d\n",
  839. smi->gpio_sck, err);
  840. goto err_free_sda;
  841. }
  842. spin_lock_init(&smi->lock);
  843. dev_info(smi->parent, "using GPIO pins %u (SDA) and %u (SCK)\n",
  844. smi->gpio_sda, smi->gpio_sck);
  845. err = smi->ops->detect(smi);
  846. if (err) {
  847. dev_err(smi->parent, "chip detection failed, err=%d\n", err);
  848. goto err_free_sck;
  849. }
  850. err = smi->ops->setup(smi);
  851. if (err) {
  852. dev_err(smi->parent, "chip setup failed, err=%d\n", err);
  853. goto err_free_sck;
  854. }
  855. err = rtl8366_smi_mii_init(smi);
  856. if (err)
  857. goto err_free_sck;
  858. rtl8366_debugfs_init(smi);
  859. return 0;
  860. err_free_sck:
  861. gpio_free(smi->gpio_sck);
  862. err_free_sda:
  863. gpio_free(smi->gpio_sda);
  864. err_out:
  865. return err;
  866. }
  867. EXPORT_SYMBOL_GPL(rtl8366_smi_init);
  868. void rtl8366_smi_cleanup(struct rtl8366_smi *smi)
  869. {
  870. rtl8366_debugfs_remove(smi);
  871. rtl8366_smi_mii_cleanup(smi);
  872. gpio_free(smi->gpio_sck);
  873. gpio_free(smi->gpio_sda);
  874. }
  875. EXPORT_SYMBOL_GPL(rtl8366_smi_cleanup);
  876. MODULE_DESCRIPTION("Realtek RTL8366 SMI interface driver");
  877. MODULE_AUTHOR("Gabor Juhos <[email protected]>");
  878. MODULE_LICENSE("GPL v2");