rtl8366_smi.c 29 KB

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