ksz8795.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Microchip KSZ8795 switch driver
  4. *
  5. * Copyright (C) 2017 Microchip Technology Inc.
  6. * Tristram Ha <[email protected]>
  7. */
  8. #include <linux/bitfield.h>
  9. #include <linux/delay.h>
  10. #include <linux/export.h>
  11. #include <linux/gpio.h>
  12. #include <linux/if_vlan.h>
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/platform_data/microchip-ksz.h>
  16. #include <linux/phy.h>
  17. #include <linux/etherdevice.h>
  18. #include <linux/if_bridge.h>
  19. #include <linux/micrel_phy.h>
  20. #include <net/dsa.h>
  21. #include <net/switchdev.h>
  22. #include <linux/phylink.h>
  23. #include "ksz_common.h"
  24. #include "ksz8795_reg.h"
  25. #include "ksz8.h"
  26. static void ksz_cfg(struct ksz_device *dev, u32 addr, u8 bits, bool set)
  27. {
  28. regmap_update_bits(dev->regmap[0], addr, bits, set ? bits : 0);
  29. }
  30. static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits,
  31. bool set)
  32. {
  33. regmap_update_bits(dev->regmap[0], PORT_CTRL_ADDR(port, offset),
  34. bits, set ? bits : 0);
  35. }
  36. static int ksz8_ind_write8(struct ksz_device *dev, u8 table, u16 addr, u8 data)
  37. {
  38. const u16 *regs;
  39. u16 ctrl_addr;
  40. int ret = 0;
  41. regs = dev->info->regs;
  42. mutex_lock(&dev->alu_mutex);
  43. ctrl_addr = IND_ACC_TABLE(table) | addr;
  44. ret = ksz_write8(dev, regs[REG_IND_BYTE], data);
  45. if (!ret)
  46. ret = ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
  47. mutex_unlock(&dev->alu_mutex);
  48. return ret;
  49. }
  50. int ksz8_reset_switch(struct ksz_device *dev)
  51. {
  52. if (ksz_is_ksz88x3(dev)) {
  53. /* reset switch */
  54. ksz_cfg(dev, KSZ8863_REG_SW_RESET,
  55. KSZ8863_GLOBAL_SOFTWARE_RESET | KSZ8863_PCS_RESET, true);
  56. ksz_cfg(dev, KSZ8863_REG_SW_RESET,
  57. KSZ8863_GLOBAL_SOFTWARE_RESET | KSZ8863_PCS_RESET, false);
  58. } else {
  59. /* reset switch */
  60. ksz_write8(dev, REG_POWER_MANAGEMENT_1,
  61. SW_SOFTWARE_POWER_DOWN << SW_POWER_MANAGEMENT_MODE_S);
  62. ksz_write8(dev, REG_POWER_MANAGEMENT_1, 0);
  63. }
  64. return 0;
  65. }
  66. static void ksz8795_set_prio_queue(struct ksz_device *dev, int port, int queue)
  67. {
  68. u8 hi, lo;
  69. /* Number of queues can only be 1, 2, or 4. */
  70. switch (queue) {
  71. case 4:
  72. case 3:
  73. queue = PORT_QUEUE_SPLIT_4;
  74. break;
  75. case 2:
  76. queue = PORT_QUEUE_SPLIT_2;
  77. break;
  78. default:
  79. queue = PORT_QUEUE_SPLIT_1;
  80. }
  81. ksz_pread8(dev, port, REG_PORT_CTRL_0, &lo);
  82. ksz_pread8(dev, port, P_DROP_TAG_CTRL, &hi);
  83. lo &= ~PORT_QUEUE_SPLIT_L;
  84. if (queue & PORT_QUEUE_SPLIT_2)
  85. lo |= PORT_QUEUE_SPLIT_L;
  86. hi &= ~PORT_QUEUE_SPLIT_H;
  87. if (queue & PORT_QUEUE_SPLIT_4)
  88. hi |= PORT_QUEUE_SPLIT_H;
  89. ksz_pwrite8(dev, port, REG_PORT_CTRL_0, lo);
  90. ksz_pwrite8(dev, port, P_DROP_TAG_CTRL, hi);
  91. /* Default is port based for egress rate limit. */
  92. if (queue != PORT_QUEUE_SPLIT_1)
  93. ksz_cfg(dev, REG_SW_CTRL_19, SW_OUT_RATE_LIMIT_QUEUE_BASED,
  94. true);
  95. }
  96. void ksz8_r_mib_cnt(struct ksz_device *dev, int port, u16 addr, u64 *cnt)
  97. {
  98. const u32 *masks;
  99. const u16 *regs;
  100. u16 ctrl_addr;
  101. u32 data;
  102. u8 check;
  103. int loop;
  104. masks = dev->info->masks;
  105. regs = dev->info->regs;
  106. ctrl_addr = addr + dev->info->reg_mib_cnt * port;
  107. ctrl_addr |= IND_ACC_TABLE(TABLE_MIB | TABLE_READ);
  108. mutex_lock(&dev->alu_mutex);
  109. ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
  110. /* It is almost guaranteed to always read the valid bit because of
  111. * slow SPI speed.
  112. */
  113. for (loop = 2; loop > 0; loop--) {
  114. ksz_read8(dev, regs[REG_IND_MIB_CHECK], &check);
  115. if (check & masks[MIB_COUNTER_VALID]) {
  116. ksz_read32(dev, regs[REG_IND_DATA_LO], &data);
  117. if (check & masks[MIB_COUNTER_OVERFLOW])
  118. *cnt += MIB_COUNTER_VALUE + 1;
  119. *cnt += data & MIB_COUNTER_VALUE;
  120. break;
  121. }
  122. }
  123. mutex_unlock(&dev->alu_mutex);
  124. }
  125. static void ksz8795_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
  126. u64 *dropped, u64 *cnt)
  127. {
  128. const u32 *masks;
  129. const u16 *regs;
  130. u16 ctrl_addr;
  131. u32 data;
  132. u8 check;
  133. int loop;
  134. masks = dev->info->masks;
  135. regs = dev->info->regs;
  136. addr -= dev->info->reg_mib_cnt;
  137. ctrl_addr = (KSZ8795_MIB_TOTAL_RX_1 - KSZ8795_MIB_TOTAL_RX_0) * port;
  138. ctrl_addr += addr + KSZ8795_MIB_TOTAL_RX_0;
  139. ctrl_addr |= IND_ACC_TABLE(TABLE_MIB | TABLE_READ);
  140. mutex_lock(&dev->alu_mutex);
  141. ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
  142. /* It is almost guaranteed to always read the valid bit because of
  143. * slow SPI speed.
  144. */
  145. for (loop = 2; loop > 0; loop--) {
  146. ksz_read8(dev, regs[REG_IND_MIB_CHECK], &check);
  147. if (check & masks[MIB_COUNTER_VALID]) {
  148. ksz_read32(dev, regs[REG_IND_DATA_LO], &data);
  149. if (addr < 2) {
  150. u64 total;
  151. total = check & MIB_TOTAL_BYTES_H;
  152. total <<= 32;
  153. *cnt += total;
  154. *cnt += data;
  155. if (check & masks[MIB_COUNTER_OVERFLOW]) {
  156. total = MIB_TOTAL_BYTES_H + 1;
  157. total <<= 32;
  158. *cnt += total;
  159. }
  160. } else {
  161. if (check & masks[MIB_COUNTER_OVERFLOW])
  162. *cnt += MIB_PACKET_DROPPED + 1;
  163. *cnt += data & MIB_PACKET_DROPPED;
  164. }
  165. break;
  166. }
  167. }
  168. mutex_unlock(&dev->alu_mutex);
  169. }
  170. static void ksz8863_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
  171. u64 *dropped, u64 *cnt)
  172. {
  173. u32 *last = (u32 *)dropped;
  174. const u16 *regs;
  175. u16 ctrl_addr;
  176. u32 data;
  177. u32 cur;
  178. regs = dev->info->regs;
  179. addr -= dev->info->reg_mib_cnt;
  180. ctrl_addr = addr ? KSZ8863_MIB_PACKET_DROPPED_TX_0 :
  181. KSZ8863_MIB_PACKET_DROPPED_RX_0;
  182. ctrl_addr += port;
  183. ctrl_addr |= IND_ACC_TABLE(TABLE_MIB | TABLE_READ);
  184. mutex_lock(&dev->alu_mutex);
  185. ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
  186. ksz_read32(dev, regs[REG_IND_DATA_LO], &data);
  187. mutex_unlock(&dev->alu_mutex);
  188. data &= MIB_PACKET_DROPPED;
  189. cur = last[addr];
  190. if (data != cur) {
  191. last[addr] = data;
  192. if (data < cur)
  193. data += MIB_PACKET_DROPPED + 1;
  194. data -= cur;
  195. *cnt += data;
  196. }
  197. }
  198. void ksz8_r_mib_pkt(struct ksz_device *dev, int port, u16 addr,
  199. u64 *dropped, u64 *cnt)
  200. {
  201. if (ksz_is_ksz88x3(dev))
  202. ksz8863_r_mib_pkt(dev, port, addr, dropped, cnt);
  203. else
  204. ksz8795_r_mib_pkt(dev, port, addr, dropped, cnt);
  205. }
  206. void ksz8_freeze_mib(struct ksz_device *dev, int port, bool freeze)
  207. {
  208. if (ksz_is_ksz88x3(dev))
  209. return;
  210. /* enable the port for flush/freeze function */
  211. if (freeze)
  212. ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), true);
  213. ksz_cfg(dev, REG_SW_CTRL_6, SW_MIB_COUNTER_FREEZE, freeze);
  214. /* disable the port after freeze is done */
  215. if (!freeze)
  216. ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), false);
  217. }
  218. void ksz8_port_init_cnt(struct ksz_device *dev, int port)
  219. {
  220. struct ksz_port_mib *mib = &dev->ports[port].mib;
  221. u64 *dropped;
  222. if (!ksz_is_ksz88x3(dev)) {
  223. /* flush all enabled port MIB counters */
  224. ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), true);
  225. ksz_cfg(dev, REG_SW_CTRL_6, SW_MIB_COUNTER_FLUSH, true);
  226. ksz_cfg(dev, REG_SW_CTRL_6, BIT(port), false);
  227. }
  228. mib->cnt_ptr = 0;
  229. /* Some ports may not have MIB counters before SWITCH_COUNTER_NUM. */
  230. while (mib->cnt_ptr < dev->info->reg_mib_cnt) {
  231. dev->dev_ops->r_mib_cnt(dev, port, mib->cnt_ptr,
  232. &mib->counters[mib->cnt_ptr]);
  233. ++mib->cnt_ptr;
  234. }
  235. /* last one in storage */
  236. dropped = &mib->counters[dev->info->mib_cnt];
  237. /* Some ports may not have MIB counters after SWITCH_COUNTER_NUM. */
  238. while (mib->cnt_ptr < dev->info->mib_cnt) {
  239. dev->dev_ops->r_mib_pkt(dev, port, mib->cnt_ptr,
  240. dropped, &mib->counters[mib->cnt_ptr]);
  241. ++mib->cnt_ptr;
  242. }
  243. }
  244. static void ksz8_r_table(struct ksz_device *dev, int table, u16 addr, u64 *data)
  245. {
  246. const u16 *regs;
  247. u16 ctrl_addr;
  248. regs = dev->info->regs;
  249. ctrl_addr = IND_ACC_TABLE(table | TABLE_READ) | addr;
  250. mutex_lock(&dev->alu_mutex);
  251. ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
  252. ksz_read64(dev, regs[REG_IND_DATA_HI], data);
  253. mutex_unlock(&dev->alu_mutex);
  254. }
  255. static void ksz8_w_table(struct ksz_device *dev, int table, u16 addr, u64 data)
  256. {
  257. const u16 *regs;
  258. u16 ctrl_addr;
  259. regs = dev->info->regs;
  260. ctrl_addr = IND_ACC_TABLE(table) | addr;
  261. mutex_lock(&dev->alu_mutex);
  262. ksz_write64(dev, regs[REG_IND_DATA_HI], data);
  263. ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
  264. mutex_unlock(&dev->alu_mutex);
  265. }
  266. static int ksz8_valid_dyn_entry(struct ksz_device *dev, u8 *data)
  267. {
  268. int timeout = 100;
  269. const u32 *masks;
  270. const u16 *regs;
  271. masks = dev->info->masks;
  272. regs = dev->info->regs;
  273. do {
  274. ksz_read8(dev, regs[REG_IND_DATA_CHECK], data);
  275. timeout--;
  276. } while ((*data & masks[DYNAMIC_MAC_TABLE_NOT_READY]) && timeout);
  277. /* Entry is not ready for accessing. */
  278. if (*data & masks[DYNAMIC_MAC_TABLE_NOT_READY]) {
  279. return -EAGAIN;
  280. /* Entry is ready for accessing. */
  281. } else {
  282. ksz_read8(dev, regs[REG_IND_DATA_8], data);
  283. /* There is no valid entry in the table. */
  284. if (*data & masks[DYNAMIC_MAC_TABLE_MAC_EMPTY])
  285. return -ENXIO;
  286. }
  287. return 0;
  288. }
  289. int ksz8_r_dyn_mac_table(struct ksz_device *dev, u16 addr, u8 *mac_addr,
  290. u8 *fid, u8 *src_port, u8 *timestamp, u16 *entries)
  291. {
  292. u32 data_hi, data_lo;
  293. const u8 *shifts;
  294. const u32 *masks;
  295. const u16 *regs;
  296. u16 ctrl_addr;
  297. u8 data;
  298. int rc;
  299. shifts = dev->info->shifts;
  300. masks = dev->info->masks;
  301. regs = dev->info->regs;
  302. ctrl_addr = IND_ACC_TABLE(TABLE_DYNAMIC_MAC | TABLE_READ) | addr;
  303. mutex_lock(&dev->alu_mutex);
  304. ksz_write16(dev, regs[REG_IND_CTRL_0], ctrl_addr);
  305. rc = ksz8_valid_dyn_entry(dev, &data);
  306. if (rc == -EAGAIN) {
  307. if (addr == 0)
  308. *entries = 0;
  309. } else if (rc == -ENXIO) {
  310. *entries = 0;
  311. /* At least one valid entry in the table. */
  312. } else {
  313. u64 buf = 0;
  314. int cnt;
  315. ksz_read64(dev, regs[REG_IND_DATA_HI], &buf);
  316. data_hi = (u32)(buf >> 32);
  317. data_lo = (u32)buf;
  318. /* Check out how many valid entry in the table. */
  319. cnt = data & masks[DYNAMIC_MAC_TABLE_ENTRIES_H];
  320. cnt <<= shifts[DYNAMIC_MAC_ENTRIES_H];
  321. cnt |= (data_hi & masks[DYNAMIC_MAC_TABLE_ENTRIES]) >>
  322. shifts[DYNAMIC_MAC_ENTRIES];
  323. *entries = cnt + 1;
  324. *fid = (data_hi & masks[DYNAMIC_MAC_TABLE_FID]) >>
  325. shifts[DYNAMIC_MAC_FID];
  326. *src_port = (data_hi & masks[DYNAMIC_MAC_TABLE_SRC_PORT]) >>
  327. shifts[DYNAMIC_MAC_SRC_PORT];
  328. *timestamp = (data_hi & masks[DYNAMIC_MAC_TABLE_TIMESTAMP]) >>
  329. shifts[DYNAMIC_MAC_TIMESTAMP];
  330. mac_addr[5] = (u8)data_lo;
  331. mac_addr[4] = (u8)(data_lo >> 8);
  332. mac_addr[3] = (u8)(data_lo >> 16);
  333. mac_addr[2] = (u8)(data_lo >> 24);
  334. mac_addr[1] = (u8)data_hi;
  335. mac_addr[0] = (u8)(data_hi >> 8);
  336. rc = 0;
  337. }
  338. mutex_unlock(&dev->alu_mutex);
  339. return rc;
  340. }
  341. static int ksz8_r_sta_mac_table(struct ksz_device *dev, u16 addr,
  342. struct alu_struct *alu, bool *valid)
  343. {
  344. u32 data_hi, data_lo;
  345. const u8 *shifts;
  346. const u32 *masks;
  347. u64 data;
  348. shifts = dev->info->shifts;
  349. masks = dev->info->masks;
  350. ksz8_r_table(dev, TABLE_STATIC_MAC, addr, &data);
  351. data_hi = data >> 32;
  352. data_lo = (u32)data;
  353. if (!(data_hi & (masks[STATIC_MAC_TABLE_VALID] |
  354. masks[STATIC_MAC_TABLE_OVERRIDE]))) {
  355. *valid = false;
  356. return 0;
  357. }
  358. alu->mac[5] = (u8)data_lo;
  359. alu->mac[4] = (u8)(data_lo >> 8);
  360. alu->mac[3] = (u8)(data_lo >> 16);
  361. alu->mac[2] = (u8)(data_lo >> 24);
  362. alu->mac[1] = (u8)data_hi;
  363. alu->mac[0] = (u8)(data_hi >> 8);
  364. alu->port_forward =
  365. (data_hi & masks[STATIC_MAC_TABLE_FWD_PORTS]) >>
  366. shifts[STATIC_MAC_FWD_PORTS];
  367. alu->is_override = (data_hi & masks[STATIC_MAC_TABLE_OVERRIDE]) ? 1 : 0;
  368. /* KSZ8795 family switches have STATIC_MAC_TABLE_USE_FID and
  369. * STATIC_MAC_TABLE_FID definitions off by 1 when doing read on the
  370. * static MAC table compared to doing write.
  371. */
  372. if (ksz_is_ksz87xx(dev))
  373. data_hi >>= 1;
  374. alu->is_static = true;
  375. alu->is_use_fid = (data_hi & masks[STATIC_MAC_TABLE_USE_FID]) ? 1 : 0;
  376. alu->fid = (data_hi & masks[STATIC_MAC_TABLE_FID]) >>
  377. shifts[STATIC_MAC_FID];
  378. *valid = true;
  379. return 0;
  380. }
  381. void ksz8_w_sta_mac_table(struct ksz_device *dev, u16 addr,
  382. struct alu_struct *alu)
  383. {
  384. u32 data_hi, data_lo;
  385. const u8 *shifts;
  386. const u32 *masks;
  387. u64 data;
  388. shifts = dev->info->shifts;
  389. masks = dev->info->masks;
  390. data_lo = ((u32)alu->mac[2] << 24) |
  391. ((u32)alu->mac[3] << 16) |
  392. ((u32)alu->mac[4] << 8) | alu->mac[5];
  393. data_hi = ((u32)alu->mac[0] << 8) | alu->mac[1];
  394. data_hi |= (u32)alu->port_forward << shifts[STATIC_MAC_FWD_PORTS];
  395. if (alu->is_override)
  396. data_hi |= masks[STATIC_MAC_TABLE_OVERRIDE];
  397. if (alu->is_use_fid) {
  398. data_hi |= masks[STATIC_MAC_TABLE_USE_FID];
  399. data_hi |= (u32)alu->fid << shifts[STATIC_MAC_FID];
  400. }
  401. if (alu->is_static)
  402. data_hi |= masks[STATIC_MAC_TABLE_VALID];
  403. else
  404. data_hi &= ~masks[STATIC_MAC_TABLE_OVERRIDE];
  405. data = (u64)data_hi << 32 | data_lo;
  406. ksz8_w_table(dev, TABLE_STATIC_MAC, addr, data);
  407. }
  408. static void ksz8_from_vlan(struct ksz_device *dev, u32 vlan, u8 *fid,
  409. u8 *member, u8 *valid)
  410. {
  411. const u8 *shifts;
  412. const u32 *masks;
  413. shifts = dev->info->shifts;
  414. masks = dev->info->masks;
  415. *fid = vlan & masks[VLAN_TABLE_FID];
  416. *member = (vlan & masks[VLAN_TABLE_MEMBERSHIP]) >>
  417. shifts[VLAN_TABLE_MEMBERSHIP_S];
  418. *valid = !!(vlan & masks[VLAN_TABLE_VALID]);
  419. }
  420. static void ksz8_to_vlan(struct ksz_device *dev, u8 fid, u8 member, u8 valid,
  421. u16 *vlan)
  422. {
  423. const u8 *shifts;
  424. const u32 *masks;
  425. shifts = dev->info->shifts;
  426. masks = dev->info->masks;
  427. *vlan = fid;
  428. *vlan |= (u16)member << shifts[VLAN_TABLE_MEMBERSHIP_S];
  429. if (valid)
  430. *vlan |= masks[VLAN_TABLE_VALID];
  431. }
  432. static void ksz8_r_vlan_entries(struct ksz_device *dev, u16 addr)
  433. {
  434. const u8 *shifts;
  435. u64 data;
  436. int i;
  437. shifts = dev->info->shifts;
  438. ksz8_r_table(dev, TABLE_VLAN, addr, &data);
  439. addr *= 4;
  440. for (i = 0; i < 4; i++) {
  441. dev->vlan_cache[addr + i].table[0] = (u16)data;
  442. data >>= shifts[VLAN_TABLE];
  443. }
  444. }
  445. static void ksz8_r_vlan_table(struct ksz_device *dev, u16 vid, u16 *vlan)
  446. {
  447. int index;
  448. u16 *data;
  449. u16 addr;
  450. u64 buf;
  451. data = (u16 *)&buf;
  452. addr = vid / 4;
  453. index = vid & 3;
  454. ksz8_r_table(dev, TABLE_VLAN, addr, &buf);
  455. *vlan = data[index];
  456. }
  457. static void ksz8_w_vlan_table(struct ksz_device *dev, u16 vid, u16 vlan)
  458. {
  459. int index;
  460. u16 *data;
  461. u16 addr;
  462. u64 buf;
  463. data = (u16 *)&buf;
  464. addr = vid / 4;
  465. index = vid & 3;
  466. ksz8_r_table(dev, TABLE_VLAN, addr, &buf);
  467. data[index] = vlan;
  468. dev->vlan_cache[vid].table[0] = vlan;
  469. ksz8_w_table(dev, TABLE_VLAN, addr, buf);
  470. }
  471. int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
  472. {
  473. u8 restart, speed, ctrl, link;
  474. int processed = true;
  475. const u16 *regs;
  476. u8 val1, val2;
  477. u16 data = 0;
  478. u8 p = phy;
  479. int ret;
  480. regs = dev->info->regs;
  481. switch (reg) {
  482. case MII_BMCR:
  483. ret = ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
  484. if (ret)
  485. return ret;
  486. ret = ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
  487. if (ret)
  488. return ret;
  489. ret = ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
  490. if (ret)
  491. return ret;
  492. if (restart & PORT_PHY_LOOPBACK)
  493. data |= BMCR_LOOPBACK;
  494. if (ctrl & PORT_FORCE_100_MBIT)
  495. data |= BMCR_SPEED100;
  496. if (ksz_is_ksz88x3(dev)) {
  497. if ((ctrl & PORT_AUTO_NEG_ENABLE))
  498. data |= BMCR_ANENABLE;
  499. } else {
  500. if (!(ctrl & PORT_AUTO_NEG_DISABLE))
  501. data |= BMCR_ANENABLE;
  502. }
  503. if (restart & PORT_POWER_DOWN)
  504. data |= BMCR_PDOWN;
  505. if (restart & PORT_AUTO_NEG_RESTART)
  506. data |= BMCR_ANRESTART;
  507. if (ctrl & PORT_FORCE_FULL_DUPLEX)
  508. data |= BMCR_FULLDPLX;
  509. if (speed & PORT_HP_MDIX)
  510. data |= KSZ886X_BMCR_HP_MDIX;
  511. if (restart & PORT_FORCE_MDIX)
  512. data |= KSZ886X_BMCR_FORCE_MDI;
  513. if (restart & PORT_AUTO_MDIX_DISABLE)
  514. data |= KSZ886X_BMCR_DISABLE_AUTO_MDIX;
  515. if (restart & PORT_TX_DISABLE)
  516. data |= KSZ886X_BMCR_DISABLE_TRANSMIT;
  517. if (restart & PORT_LED_OFF)
  518. data |= KSZ886X_BMCR_DISABLE_LED;
  519. break;
  520. case MII_BMSR:
  521. ret = ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
  522. if (ret)
  523. return ret;
  524. data = BMSR_100FULL |
  525. BMSR_100HALF |
  526. BMSR_10FULL |
  527. BMSR_10HALF |
  528. BMSR_ANEGCAPABLE;
  529. if (link & PORT_AUTO_NEG_COMPLETE)
  530. data |= BMSR_ANEGCOMPLETE;
  531. if (link & PORT_STAT_LINK_GOOD)
  532. data |= BMSR_LSTATUS;
  533. break;
  534. case MII_PHYSID1:
  535. data = KSZ8795_ID_HI;
  536. break;
  537. case MII_PHYSID2:
  538. if (ksz_is_ksz88x3(dev))
  539. data = KSZ8863_ID_LO;
  540. else
  541. data = KSZ8795_ID_LO;
  542. break;
  543. case MII_ADVERTISE:
  544. ret = ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
  545. if (ret)
  546. return ret;
  547. data = ADVERTISE_CSMA;
  548. if (ctrl & PORT_AUTO_NEG_SYM_PAUSE)
  549. data |= ADVERTISE_PAUSE_CAP;
  550. if (ctrl & PORT_AUTO_NEG_100BTX_FD)
  551. data |= ADVERTISE_100FULL;
  552. if (ctrl & PORT_AUTO_NEG_100BTX)
  553. data |= ADVERTISE_100HALF;
  554. if (ctrl & PORT_AUTO_NEG_10BT_FD)
  555. data |= ADVERTISE_10FULL;
  556. if (ctrl & PORT_AUTO_NEG_10BT)
  557. data |= ADVERTISE_10HALF;
  558. break;
  559. case MII_LPA:
  560. ret = ksz_pread8(dev, p, regs[P_REMOTE_STATUS], &link);
  561. if (ret)
  562. return ret;
  563. data = LPA_SLCT;
  564. if (link & PORT_REMOTE_SYM_PAUSE)
  565. data |= LPA_PAUSE_CAP;
  566. if (link & PORT_REMOTE_100BTX_FD)
  567. data |= LPA_100FULL;
  568. if (link & PORT_REMOTE_100BTX)
  569. data |= LPA_100HALF;
  570. if (link & PORT_REMOTE_10BT_FD)
  571. data |= LPA_10FULL;
  572. if (link & PORT_REMOTE_10BT)
  573. data |= LPA_10HALF;
  574. if (data & ~LPA_SLCT)
  575. data |= LPA_LPACK;
  576. break;
  577. case PHY_REG_LINK_MD:
  578. ret = ksz_pread8(dev, p, REG_PORT_LINK_MD_CTRL, &val1);
  579. if (ret)
  580. return ret;
  581. ret = ksz_pread8(dev, p, REG_PORT_LINK_MD_RESULT, &val2);
  582. if (ret)
  583. return ret;
  584. if (val1 & PORT_START_CABLE_DIAG)
  585. data |= PHY_START_CABLE_DIAG;
  586. if (val1 & PORT_CABLE_10M_SHORT)
  587. data |= PHY_CABLE_10M_SHORT;
  588. data |= FIELD_PREP(PHY_CABLE_DIAG_RESULT_M,
  589. FIELD_GET(PORT_CABLE_DIAG_RESULT_M, val1));
  590. data |= FIELD_PREP(PHY_CABLE_FAULT_COUNTER_M,
  591. (FIELD_GET(PORT_CABLE_FAULT_COUNTER_H, val1) << 8) |
  592. FIELD_GET(PORT_CABLE_FAULT_COUNTER_L, val2));
  593. break;
  594. case PHY_REG_PHY_CTRL:
  595. ret = ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
  596. if (ret)
  597. return ret;
  598. if (link & PORT_MDIX_STATUS)
  599. data |= KSZ886X_CTRL_MDIX_STAT;
  600. break;
  601. default:
  602. processed = false;
  603. break;
  604. }
  605. if (processed)
  606. *val = data;
  607. return 0;
  608. }
  609. int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
  610. {
  611. u8 restart, speed, ctrl, data;
  612. const u16 *regs;
  613. u8 p = phy;
  614. int ret;
  615. regs = dev->info->regs;
  616. switch (reg) {
  617. case MII_BMCR:
  618. /* Do not support PHY reset function. */
  619. if (val & BMCR_RESET)
  620. break;
  621. ret = ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
  622. if (ret)
  623. return ret;
  624. data = speed;
  625. if (val & KSZ886X_BMCR_HP_MDIX)
  626. data |= PORT_HP_MDIX;
  627. else
  628. data &= ~PORT_HP_MDIX;
  629. if (data != speed) {
  630. ret = ksz_pwrite8(dev, p, regs[P_SPEED_STATUS], data);
  631. if (ret)
  632. return ret;
  633. }
  634. ret = ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
  635. if (ret)
  636. return ret;
  637. data = ctrl;
  638. if (ksz_is_ksz88x3(dev)) {
  639. if ((val & BMCR_ANENABLE))
  640. data |= PORT_AUTO_NEG_ENABLE;
  641. else
  642. data &= ~PORT_AUTO_NEG_ENABLE;
  643. } else {
  644. if (!(val & BMCR_ANENABLE))
  645. data |= PORT_AUTO_NEG_DISABLE;
  646. else
  647. data &= ~PORT_AUTO_NEG_DISABLE;
  648. /* Fiber port does not support auto-negotiation. */
  649. if (dev->ports[p].fiber)
  650. data |= PORT_AUTO_NEG_DISABLE;
  651. }
  652. if (val & BMCR_SPEED100)
  653. data |= PORT_FORCE_100_MBIT;
  654. else
  655. data &= ~PORT_FORCE_100_MBIT;
  656. if (val & BMCR_FULLDPLX)
  657. data |= PORT_FORCE_FULL_DUPLEX;
  658. else
  659. data &= ~PORT_FORCE_FULL_DUPLEX;
  660. if (data != ctrl) {
  661. ret = ksz_pwrite8(dev, p, regs[P_FORCE_CTRL], data);
  662. if (ret)
  663. return ret;
  664. }
  665. ret = ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
  666. if (ret)
  667. return ret;
  668. data = restart;
  669. if (val & KSZ886X_BMCR_DISABLE_LED)
  670. data |= PORT_LED_OFF;
  671. else
  672. data &= ~PORT_LED_OFF;
  673. if (val & KSZ886X_BMCR_DISABLE_TRANSMIT)
  674. data |= PORT_TX_DISABLE;
  675. else
  676. data &= ~PORT_TX_DISABLE;
  677. if (val & BMCR_ANRESTART)
  678. data |= PORT_AUTO_NEG_RESTART;
  679. else
  680. data &= ~(PORT_AUTO_NEG_RESTART);
  681. if (val & BMCR_PDOWN)
  682. data |= PORT_POWER_DOWN;
  683. else
  684. data &= ~PORT_POWER_DOWN;
  685. if (val & KSZ886X_BMCR_DISABLE_AUTO_MDIX)
  686. data |= PORT_AUTO_MDIX_DISABLE;
  687. else
  688. data &= ~PORT_AUTO_MDIX_DISABLE;
  689. if (val & KSZ886X_BMCR_FORCE_MDI)
  690. data |= PORT_FORCE_MDIX;
  691. else
  692. data &= ~PORT_FORCE_MDIX;
  693. if (val & BMCR_LOOPBACK)
  694. data |= PORT_PHY_LOOPBACK;
  695. else
  696. data &= ~PORT_PHY_LOOPBACK;
  697. if (data != restart) {
  698. ret = ksz_pwrite8(dev, p, regs[P_NEG_RESTART_CTRL],
  699. data);
  700. if (ret)
  701. return ret;
  702. }
  703. break;
  704. case MII_ADVERTISE:
  705. ret = ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
  706. if (ret)
  707. return ret;
  708. data = ctrl;
  709. data &= ~(PORT_AUTO_NEG_SYM_PAUSE |
  710. PORT_AUTO_NEG_100BTX_FD |
  711. PORT_AUTO_NEG_100BTX |
  712. PORT_AUTO_NEG_10BT_FD |
  713. PORT_AUTO_NEG_10BT);
  714. if (val & ADVERTISE_PAUSE_CAP)
  715. data |= PORT_AUTO_NEG_SYM_PAUSE;
  716. if (val & ADVERTISE_100FULL)
  717. data |= PORT_AUTO_NEG_100BTX_FD;
  718. if (val & ADVERTISE_100HALF)
  719. data |= PORT_AUTO_NEG_100BTX;
  720. if (val & ADVERTISE_10FULL)
  721. data |= PORT_AUTO_NEG_10BT_FD;
  722. if (val & ADVERTISE_10HALF)
  723. data |= PORT_AUTO_NEG_10BT;
  724. if (data != ctrl) {
  725. ret = ksz_pwrite8(dev, p, regs[P_LOCAL_CTRL], data);
  726. if (ret)
  727. return ret;
  728. }
  729. break;
  730. case PHY_REG_LINK_MD:
  731. if (val & PHY_START_CABLE_DIAG)
  732. ksz_port_cfg(dev, p, REG_PORT_LINK_MD_CTRL, PORT_START_CABLE_DIAG, true);
  733. break;
  734. default:
  735. break;
  736. }
  737. return 0;
  738. }
  739. void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member)
  740. {
  741. u8 data;
  742. ksz_pread8(dev, port, P_MIRROR_CTRL, &data);
  743. data &= ~PORT_VLAN_MEMBERSHIP;
  744. data |= (member & dev->port_mask);
  745. ksz_pwrite8(dev, port, P_MIRROR_CTRL, data);
  746. }
  747. void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)
  748. {
  749. u8 learn[DSA_MAX_PORTS];
  750. int first, index, cnt;
  751. struct ksz_port *p;
  752. const u16 *regs;
  753. regs = dev->info->regs;
  754. if ((uint)port < dev->info->port_cnt) {
  755. first = port;
  756. cnt = port + 1;
  757. } else {
  758. /* Flush all ports. */
  759. first = 0;
  760. cnt = dev->info->port_cnt;
  761. }
  762. for (index = first; index < cnt; index++) {
  763. p = &dev->ports[index];
  764. if (!p->on)
  765. continue;
  766. ksz_pread8(dev, index, regs[P_STP_CTRL], &learn[index]);
  767. if (!(learn[index] & PORT_LEARN_DISABLE))
  768. ksz_pwrite8(dev, index, regs[P_STP_CTRL],
  769. learn[index] | PORT_LEARN_DISABLE);
  770. }
  771. ksz_cfg(dev, S_FLUSH_TABLE_CTRL, SW_FLUSH_DYN_MAC_TABLE, true);
  772. for (index = first; index < cnt; index++) {
  773. p = &dev->ports[index];
  774. if (!p->on)
  775. continue;
  776. if (!(learn[index] & PORT_LEARN_DISABLE))
  777. ksz_pwrite8(dev, index, regs[P_STP_CTRL], learn[index]);
  778. }
  779. }
  780. int ksz8_fdb_dump(struct ksz_device *dev, int port,
  781. dsa_fdb_dump_cb_t *cb, void *data)
  782. {
  783. int ret = 0;
  784. u16 i = 0;
  785. u16 entries = 0;
  786. u8 timestamp = 0;
  787. u8 fid;
  788. u8 src_port;
  789. u8 mac[ETH_ALEN];
  790. do {
  791. ret = ksz8_r_dyn_mac_table(dev, i, mac, &fid, &src_port,
  792. &timestamp, &entries);
  793. if (!ret && port == src_port) {
  794. ret = cb(mac, fid, false, data);
  795. if (ret)
  796. break;
  797. }
  798. i++;
  799. } while (i < entries);
  800. if (i >= entries)
  801. ret = 0;
  802. return ret;
  803. }
  804. static int ksz8_add_sta_mac(struct ksz_device *dev, int port,
  805. const unsigned char *addr, u16 vid)
  806. {
  807. struct alu_struct alu;
  808. int index, ret;
  809. int empty = 0;
  810. alu.port_forward = 0;
  811. for (index = 0; index < dev->info->num_statics; index++) {
  812. bool valid;
  813. ret = ksz8_r_sta_mac_table(dev, index, &alu, &valid);
  814. if (ret)
  815. return ret;
  816. if (!valid) {
  817. /* Remember the first empty entry. */
  818. if (!empty)
  819. empty = index + 1;
  820. continue;
  821. }
  822. if (!memcmp(alu.mac, addr, ETH_ALEN) && alu.fid == vid)
  823. break;
  824. }
  825. /* no available entry */
  826. if (index == dev->info->num_statics && !empty)
  827. return -ENOSPC;
  828. /* add entry */
  829. if (index == dev->info->num_statics) {
  830. index = empty - 1;
  831. memset(&alu, 0, sizeof(alu));
  832. memcpy(alu.mac, addr, ETH_ALEN);
  833. alu.is_static = true;
  834. }
  835. alu.port_forward |= BIT(port);
  836. if (vid) {
  837. alu.is_use_fid = true;
  838. /* Need a way to map VID to FID. */
  839. alu.fid = vid;
  840. }
  841. ksz8_w_sta_mac_table(dev, index, &alu);
  842. return 0;
  843. }
  844. static int ksz8_del_sta_mac(struct ksz_device *dev, int port,
  845. const unsigned char *addr, u16 vid)
  846. {
  847. struct alu_struct alu;
  848. int index, ret;
  849. for (index = 0; index < dev->info->num_statics; index++) {
  850. bool valid;
  851. ret = ksz8_r_sta_mac_table(dev, index, &alu, &valid);
  852. if (ret)
  853. return ret;
  854. if (!valid)
  855. continue;
  856. if (!memcmp(alu.mac, addr, ETH_ALEN) && alu.fid == vid)
  857. break;
  858. }
  859. /* no available entry */
  860. if (index == dev->info->num_statics)
  861. goto exit;
  862. /* clear port */
  863. alu.port_forward &= ~BIT(port);
  864. if (!alu.port_forward)
  865. alu.is_static = false;
  866. ksz8_w_sta_mac_table(dev, index, &alu);
  867. exit:
  868. return 0;
  869. }
  870. int ksz8_mdb_add(struct ksz_device *dev, int port,
  871. const struct switchdev_obj_port_mdb *mdb, struct dsa_db db)
  872. {
  873. return ksz8_add_sta_mac(dev, port, mdb->addr, mdb->vid);
  874. }
  875. int ksz8_mdb_del(struct ksz_device *dev, int port,
  876. const struct switchdev_obj_port_mdb *mdb, struct dsa_db db)
  877. {
  878. return ksz8_del_sta_mac(dev, port, mdb->addr, mdb->vid);
  879. }
  880. int ksz8_port_vlan_filtering(struct ksz_device *dev, int port, bool flag,
  881. struct netlink_ext_ack *extack)
  882. {
  883. if (ksz_is_ksz88x3(dev))
  884. return -ENOTSUPP;
  885. /* Discard packets with VID not enabled on the switch */
  886. ksz_cfg(dev, S_MIRROR_CTRL, SW_VLAN_ENABLE, flag);
  887. /* Discard packets with VID not enabled on the ingress port */
  888. for (port = 0; port < dev->phy_port_cnt; ++port)
  889. ksz_port_cfg(dev, port, REG_PORT_CTRL_2, PORT_INGRESS_FILTER,
  890. flag);
  891. return 0;
  892. }
  893. static void ksz8_port_enable_pvid(struct ksz_device *dev, int port, bool state)
  894. {
  895. if (ksz_is_ksz88x3(dev)) {
  896. ksz_cfg(dev, REG_SW_INSERT_SRC_PVID,
  897. 0x03 << (4 - 2 * port), state);
  898. } else {
  899. ksz_pwrite8(dev, port, REG_PORT_CTRL_12, state ? 0x0f : 0x00);
  900. }
  901. }
  902. int ksz8_port_vlan_add(struct ksz_device *dev, int port,
  903. const struct switchdev_obj_port_vlan *vlan,
  904. struct netlink_ext_ack *extack)
  905. {
  906. bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
  907. struct ksz_port *p = &dev->ports[port];
  908. u16 data, new_pvid = 0;
  909. u8 fid, member, valid;
  910. if (ksz_is_ksz88x3(dev))
  911. return -ENOTSUPP;
  912. /* If a VLAN is added with untagged flag different from the
  913. * port's Remove Tag flag, we need to change the latter.
  914. * Ignore VID 0, which is always untagged.
  915. * Ignore CPU port, which will always be tagged.
  916. */
  917. if (untagged != p->remove_tag && vlan->vid != 0 &&
  918. port != dev->cpu_port) {
  919. unsigned int vid;
  920. /* Reject attempts to add a VLAN that requires the
  921. * Remove Tag flag to be changed, unless there are no
  922. * other VLANs currently configured.
  923. */
  924. for (vid = 1; vid < dev->info->num_vlans; ++vid) {
  925. /* Skip the VID we are going to add or reconfigure */
  926. if (vid == vlan->vid)
  927. continue;
  928. ksz8_from_vlan(dev, dev->vlan_cache[vid].table[0],
  929. &fid, &member, &valid);
  930. if (valid && (member & BIT(port)))
  931. return -EINVAL;
  932. }
  933. ksz_port_cfg(dev, port, P_TAG_CTRL, PORT_REMOVE_TAG, untagged);
  934. p->remove_tag = untagged;
  935. }
  936. ksz8_r_vlan_table(dev, vlan->vid, &data);
  937. ksz8_from_vlan(dev, data, &fid, &member, &valid);
  938. /* First time to setup the VLAN entry. */
  939. if (!valid) {
  940. /* Need to find a way to map VID to FID. */
  941. fid = 1;
  942. valid = 1;
  943. }
  944. member |= BIT(port);
  945. ksz8_to_vlan(dev, fid, member, valid, &data);
  946. ksz8_w_vlan_table(dev, vlan->vid, data);
  947. /* change PVID */
  948. if (vlan->flags & BRIDGE_VLAN_INFO_PVID)
  949. new_pvid = vlan->vid;
  950. if (new_pvid) {
  951. u16 vid;
  952. ksz_pread16(dev, port, REG_PORT_CTRL_VID, &vid);
  953. vid &= ~VLAN_VID_MASK;
  954. vid |= new_pvid;
  955. ksz_pwrite16(dev, port, REG_PORT_CTRL_VID, vid);
  956. ksz8_port_enable_pvid(dev, port, true);
  957. }
  958. return 0;
  959. }
  960. int ksz8_port_vlan_del(struct ksz_device *dev, int port,
  961. const struct switchdev_obj_port_vlan *vlan)
  962. {
  963. u16 data, pvid;
  964. u8 fid, member, valid;
  965. if (ksz_is_ksz88x3(dev))
  966. return -ENOTSUPP;
  967. ksz_pread16(dev, port, REG_PORT_CTRL_VID, &pvid);
  968. pvid = pvid & 0xFFF;
  969. ksz8_r_vlan_table(dev, vlan->vid, &data);
  970. ksz8_from_vlan(dev, data, &fid, &member, &valid);
  971. member &= ~BIT(port);
  972. /* Invalidate the entry if no more member. */
  973. if (!member) {
  974. fid = 0;
  975. valid = 0;
  976. }
  977. ksz8_to_vlan(dev, fid, member, valid, &data);
  978. ksz8_w_vlan_table(dev, vlan->vid, data);
  979. if (pvid == vlan->vid)
  980. ksz8_port_enable_pvid(dev, port, false);
  981. return 0;
  982. }
  983. int ksz8_port_mirror_add(struct ksz_device *dev, int port,
  984. struct dsa_mall_mirror_tc_entry *mirror,
  985. bool ingress, struct netlink_ext_ack *extack)
  986. {
  987. if (ingress) {
  988. ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, true);
  989. dev->mirror_rx |= BIT(port);
  990. } else {
  991. ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, true);
  992. dev->mirror_tx |= BIT(port);
  993. }
  994. ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_SNIFFER, false);
  995. /* configure mirror port */
  996. if (dev->mirror_rx || dev->mirror_tx)
  997. ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL,
  998. PORT_MIRROR_SNIFFER, true);
  999. return 0;
  1000. }
  1001. void ksz8_port_mirror_del(struct ksz_device *dev, int port,
  1002. struct dsa_mall_mirror_tc_entry *mirror)
  1003. {
  1004. u8 data;
  1005. if (mirror->ingress) {
  1006. ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_RX, false);
  1007. dev->mirror_rx &= ~BIT(port);
  1008. } else {
  1009. ksz_port_cfg(dev, port, P_MIRROR_CTRL, PORT_MIRROR_TX, false);
  1010. dev->mirror_tx &= ~BIT(port);
  1011. }
  1012. ksz_pread8(dev, port, P_MIRROR_CTRL, &data);
  1013. if (!dev->mirror_rx && !dev->mirror_tx)
  1014. ksz_port_cfg(dev, mirror->to_local_port, P_MIRROR_CTRL,
  1015. PORT_MIRROR_SNIFFER, false);
  1016. }
  1017. static void ksz8795_cpu_interface_select(struct ksz_device *dev, int port)
  1018. {
  1019. struct ksz_port *p = &dev->ports[port];
  1020. if (!p->interface && dev->compat_interface) {
  1021. dev_warn(dev->dev,
  1022. "Using legacy switch \"phy-mode\" property, because it is missing on port %d node. "
  1023. "Please update your device tree.\n",
  1024. port);
  1025. p->interface = dev->compat_interface;
  1026. }
  1027. }
  1028. void ksz8_port_setup(struct ksz_device *dev, int port, bool cpu_port)
  1029. {
  1030. struct dsa_switch *ds = dev->ds;
  1031. const u32 *masks;
  1032. u8 member;
  1033. masks = dev->info->masks;
  1034. /* enable broadcast storm limit */
  1035. ksz_port_cfg(dev, port, P_BCAST_STORM_CTRL, PORT_BROADCAST_STORM, true);
  1036. if (!ksz_is_ksz88x3(dev))
  1037. ksz8795_set_prio_queue(dev, port, 4);
  1038. /* disable DiffServ priority */
  1039. ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_DIFFSERV_ENABLE, false);
  1040. /* replace priority */
  1041. ksz_port_cfg(dev, port, P_802_1P_CTRL,
  1042. masks[PORT_802_1P_REMAPPING], false);
  1043. /* enable 802.1p priority */
  1044. ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true);
  1045. if (cpu_port) {
  1046. if (!ksz_is_ksz88x3(dev))
  1047. ksz8795_cpu_interface_select(dev, port);
  1048. member = dsa_user_ports(ds);
  1049. } else {
  1050. member = BIT(dsa_upstream_port(ds, port));
  1051. }
  1052. ksz8_cfg_port_member(dev, port, member);
  1053. }
  1054. void ksz8_config_cpu_port(struct dsa_switch *ds)
  1055. {
  1056. struct ksz_device *dev = ds->priv;
  1057. struct ksz_port *p;
  1058. const u32 *masks;
  1059. const u16 *regs;
  1060. u8 remote;
  1061. int i;
  1062. masks = dev->info->masks;
  1063. regs = dev->info->regs;
  1064. /* Switch marks the maximum frame with extra byte as oversize. */
  1065. ksz_cfg(dev, REG_SW_CTRL_2, SW_LEGAL_PACKET_DISABLE, true);
  1066. ksz_cfg(dev, regs[S_TAIL_TAG_CTRL], masks[SW_TAIL_TAG_ENABLE], true);
  1067. p = &dev->ports[dev->cpu_port];
  1068. p->on = 1;
  1069. ksz8_port_setup(dev, dev->cpu_port, true);
  1070. for (i = 0; i < dev->phy_port_cnt; i++) {
  1071. p = &dev->ports[i];
  1072. ksz_port_stp_state_set(ds, i, BR_STATE_DISABLED);
  1073. /* Last port may be disabled. */
  1074. if (i == dev->phy_port_cnt)
  1075. break;
  1076. p->on = 1;
  1077. }
  1078. for (i = 0; i < dev->phy_port_cnt; i++) {
  1079. p = &dev->ports[i];
  1080. if (!p->on)
  1081. continue;
  1082. if (!ksz_is_ksz88x3(dev)) {
  1083. ksz_pread8(dev, i, regs[P_REMOTE_STATUS], &remote);
  1084. if (remote & KSZ8_PORT_FIBER_MODE)
  1085. p->fiber = 1;
  1086. }
  1087. if (p->fiber)
  1088. ksz_port_cfg(dev, i, regs[P_STP_CTRL],
  1089. PORT_FORCE_FLOW_CTRL, true);
  1090. else
  1091. ksz_port_cfg(dev, i, regs[P_STP_CTRL],
  1092. PORT_FORCE_FLOW_CTRL, false);
  1093. }
  1094. }
  1095. static int ksz8_handle_global_errata(struct dsa_switch *ds)
  1096. {
  1097. struct ksz_device *dev = ds->priv;
  1098. int ret = 0;
  1099. /* KSZ87xx Errata DS80000687C.
  1100. * Module 2: Link drops with some EEE link partners.
  1101. * An issue with the EEE next page exchange between the
  1102. * KSZ879x/KSZ877x/KSZ876x and some EEE link partners may result in
  1103. * the link dropping.
  1104. */
  1105. if (dev->info->ksz87xx_eee_link_erratum)
  1106. ret = ksz8_ind_write8(dev, TABLE_EEE, REG_IND_EEE_GLOB2_HI, 0);
  1107. return ret;
  1108. }
  1109. int ksz8_enable_stp_addr(struct ksz_device *dev)
  1110. {
  1111. struct alu_struct alu;
  1112. /* Setup STP address for STP operation. */
  1113. memset(&alu, 0, sizeof(alu));
  1114. ether_addr_copy(alu.mac, eth_stp_addr);
  1115. alu.is_static = true;
  1116. alu.is_override = true;
  1117. alu.port_forward = dev->info->cpu_ports;
  1118. ksz8_w_sta_mac_table(dev, 0, &alu);
  1119. return 0;
  1120. }
  1121. int ksz8_setup(struct dsa_switch *ds)
  1122. {
  1123. struct ksz_device *dev = ds->priv;
  1124. int i;
  1125. ksz_cfg(dev, S_REPLACE_VID_CTRL, SW_FLOW_CTRL, true);
  1126. /* Enable automatic fast aging when link changed detected. */
  1127. ksz_cfg(dev, S_LINK_AGING_CTRL, SW_LINK_AUTO_AGING, true);
  1128. /* Enable aggressive back off algorithm in half duplex mode. */
  1129. regmap_update_bits(dev->regmap[0], REG_SW_CTRL_1,
  1130. SW_AGGR_BACKOFF, SW_AGGR_BACKOFF);
  1131. /*
  1132. * Make sure unicast VLAN boundary is set as default and
  1133. * enable no excessive collision drop.
  1134. */
  1135. regmap_update_bits(dev->regmap[0], REG_SW_CTRL_2,
  1136. UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP,
  1137. UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP);
  1138. ksz_cfg(dev, S_REPLACE_VID_CTRL, SW_REPLACE_VID, false);
  1139. ksz_cfg(dev, S_MIRROR_CTRL, SW_MIRROR_RX_TX, false);
  1140. if (!ksz_is_ksz88x3(dev))
  1141. ksz_cfg(dev, REG_SW_CTRL_19, SW_INS_TAG_ENABLE, true);
  1142. for (i = 0; i < (dev->info->num_vlans / 4); i++)
  1143. ksz8_r_vlan_entries(dev, i);
  1144. return ksz8_handle_global_errata(ds);
  1145. }
  1146. void ksz8_get_caps(struct ksz_device *dev, int port,
  1147. struct phylink_config *config)
  1148. {
  1149. config->mac_capabilities = MAC_10 | MAC_100;
  1150. /* Silicon Errata Sheet (DS80000830A):
  1151. * "Port 1 does not respond to received flow control PAUSE frames"
  1152. * So, disable Pause support on "Port 1" (port == 0) for all ksz88x3
  1153. * switches.
  1154. */
  1155. if (!ksz_is_ksz88x3(dev) || port)
  1156. config->mac_capabilities |= MAC_SYM_PAUSE;
  1157. /* Asym pause is not supported on KSZ8863 and KSZ8873 */
  1158. if (!ksz_is_ksz88x3(dev))
  1159. config->mac_capabilities |= MAC_ASYM_PAUSE;
  1160. }
  1161. u32 ksz8_get_port_addr(int port, int offset)
  1162. {
  1163. return PORT_CTRL_ADDR(port, offset);
  1164. }
  1165. int ksz8_switch_init(struct ksz_device *dev)
  1166. {
  1167. dev->cpu_port = fls(dev->info->cpu_ports) - 1;
  1168. dev->phy_port_cnt = dev->info->port_cnt - 1;
  1169. dev->port_mask = (BIT(dev->phy_port_cnt) - 1) | dev->info->cpu_ports;
  1170. /* We rely on software untagging on the CPU port, so that we
  1171. * can support both tagged and untagged VLANs
  1172. */
  1173. dev->ds->untag_bridge_pvid = true;
  1174. /* VLAN filtering is partly controlled by the global VLAN
  1175. * Enable flag
  1176. */
  1177. dev->ds->vlan_filtering_is_global = true;
  1178. return 0;
  1179. }
  1180. void ksz8_switch_exit(struct ksz_device *dev)
  1181. {
  1182. ksz8_reset_switch(dev);
  1183. }
  1184. MODULE_AUTHOR("Tristram Ha <[email protected]>");
  1185. MODULE_DESCRIPTION("Microchip KSZ8795 Series Switch DSA Driver");
  1186. MODULE_LICENSE("GPL");