port.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892
  1. /*
  2. * Marvell 88E6xxx Switch Port Registers support
  3. *
  4. * Copyright (c) 2008 Marvell Semiconductor
  5. *
  6. * Copyright (c) 2016-2017 Savoir-faire Linux Inc.
  7. * Vivien Didelot <vivien.didelot@savoirfairelinux.com>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. */
  14. #include <linux/phy.h>
  15. #include "mv88e6xxx.h"
  16. #include "port.h"
  17. int mv88e6xxx_port_read(struct mv88e6xxx_chip *chip, int port, int reg,
  18. u16 *val)
  19. {
  20. int addr = chip->info->port_base_addr + port;
  21. return mv88e6xxx_read(chip, addr, reg, val);
  22. }
  23. int mv88e6xxx_port_write(struct mv88e6xxx_chip *chip, int port, int reg,
  24. u16 val)
  25. {
  26. int addr = chip->info->port_base_addr + port;
  27. return mv88e6xxx_write(chip, addr, reg, val);
  28. }
  29. /* Offset 0x01: MAC (or PCS or Physical) Control Register
  30. *
  31. * Link, Duplex and Flow Control have one force bit, one value bit.
  32. *
  33. * For port's MAC speed, ForceSpd (or SpdValue) bits 1:0 program the value.
  34. * Alternative values require the 200BASE (or AltSpeed) bit 12 set.
  35. * Newer chips need a ForcedSpd bit 13 set to consider the value.
  36. */
  37. static int mv88e6xxx_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
  38. phy_interface_t mode)
  39. {
  40. u16 reg;
  41. int err;
  42. err = mv88e6xxx_port_read(chip, port, PORT_PCS_CTRL, &reg);
  43. if (err)
  44. return err;
  45. reg &= ~(PORT_PCS_CTRL_RGMII_DELAY_RXCLK |
  46. PORT_PCS_CTRL_RGMII_DELAY_TXCLK);
  47. switch (mode) {
  48. case PHY_INTERFACE_MODE_RGMII_RXID:
  49. reg |= PORT_PCS_CTRL_RGMII_DELAY_RXCLK;
  50. break;
  51. case PHY_INTERFACE_MODE_RGMII_TXID:
  52. reg |= PORT_PCS_CTRL_RGMII_DELAY_TXCLK;
  53. break;
  54. case PHY_INTERFACE_MODE_RGMII_ID:
  55. reg |= PORT_PCS_CTRL_RGMII_DELAY_RXCLK |
  56. PORT_PCS_CTRL_RGMII_DELAY_TXCLK;
  57. break;
  58. case PHY_INTERFACE_MODE_RGMII:
  59. break;
  60. default:
  61. return 0;
  62. }
  63. err = mv88e6xxx_port_write(chip, port, PORT_PCS_CTRL, reg);
  64. if (err)
  65. return err;
  66. netdev_dbg(chip->ds->ports[port].netdev, "delay RXCLK %s, TXCLK %s\n",
  67. reg & PORT_PCS_CTRL_RGMII_DELAY_RXCLK ? "yes" : "no",
  68. reg & PORT_PCS_CTRL_RGMII_DELAY_TXCLK ? "yes" : "no");
  69. return 0;
  70. }
  71. int mv88e6352_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
  72. phy_interface_t mode)
  73. {
  74. if (port < 5)
  75. return -EOPNOTSUPP;
  76. return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
  77. }
  78. int mv88e6390_port_set_rgmii_delay(struct mv88e6xxx_chip *chip, int port,
  79. phy_interface_t mode)
  80. {
  81. if (port != 0)
  82. return -EOPNOTSUPP;
  83. return mv88e6xxx_port_set_rgmii_delay(chip, port, mode);
  84. }
  85. int mv88e6xxx_port_set_link(struct mv88e6xxx_chip *chip, int port, int link)
  86. {
  87. u16 reg;
  88. int err;
  89. err = mv88e6xxx_port_read(chip, port, PORT_PCS_CTRL, &reg);
  90. if (err)
  91. return err;
  92. reg &= ~(PORT_PCS_CTRL_FORCE_LINK | PORT_PCS_CTRL_LINK_UP);
  93. switch (link) {
  94. case LINK_FORCED_DOWN:
  95. reg |= PORT_PCS_CTRL_FORCE_LINK;
  96. break;
  97. case LINK_FORCED_UP:
  98. reg |= PORT_PCS_CTRL_FORCE_LINK | PORT_PCS_CTRL_LINK_UP;
  99. break;
  100. case LINK_UNFORCED:
  101. /* normal link detection */
  102. break;
  103. default:
  104. return -EINVAL;
  105. }
  106. err = mv88e6xxx_port_write(chip, port, PORT_PCS_CTRL, reg);
  107. if (err)
  108. return err;
  109. netdev_dbg(chip->ds->ports[port].netdev, "%s link %s\n",
  110. reg & PORT_PCS_CTRL_FORCE_LINK ? "Force" : "Unforce",
  111. reg & PORT_PCS_CTRL_LINK_UP ? "up" : "down");
  112. return 0;
  113. }
  114. int mv88e6xxx_port_set_duplex(struct mv88e6xxx_chip *chip, int port, int dup)
  115. {
  116. u16 reg;
  117. int err;
  118. err = mv88e6xxx_port_read(chip, port, PORT_PCS_CTRL, &reg);
  119. if (err)
  120. return err;
  121. reg &= ~(PORT_PCS_CTRL_FORCE_DUPLEX | PORT_PCS_CTRL_DUPLEX_FULL);
  122. switch (dup) {
  123. case DUPLEX_HALF:
  124. reg |= PORT_PCS_CTRL_FORCE_DUPLEX;
  125. break;
  126. case DUPLEX_FULL:
  127. reg |= PORT_PCS_CTRL_FORCE_DUPLEX | PORT_PCS_CTRL_DUPLEX_FULL;
  128. break;
  129. case DUPLEX_UNFORCED:
  130. /* normal duplex detection */
  131. break;
  132. default:
  133. return -EINVAL;
  134. }
  135. err = mv88e6xxx_port_write(chip, port, PORT_PCS_CTRL, reg);
  136. if (err)
  137. return err;
  138. netdev_dbg(chip->ds->ports[port].netdev, "%s %s duplex\n",
  139. reg & PORT_PCS_CTRL_FORCE_DUPLEX ? "Force" : "Unforce",
  140. reg & PORT_PCS_CTRL_DUPLEX_FULL ? "full" : "half");
  141. return 0;
  142. }
  143. static int mv88e6xxx_port_set_speed(struct mv88e6xxx_chip *chip, int port,
  144. int speed, bool alt_bit, bool force_bit)
  145. {
  146. u16 reg, ctrl;
  147. int err;
  148. switch (speed) {
  149. case 10:
  150. ctrl = PORT_PCS_CTRL_SPEED_10;
  151. break;
  152. case 100:
  153. ctrl = PORT_PCS_CTRL_SPEED_100;
  154. break;
  155. case 200:
  156. if (alt_bit)
  157. ctrl = PORT_PCS_CTRL_SPEED_100 | PORT_PCS_CTRL_ALTSPEED;
  158. else
  159. ctrl = PORT_PCS_CTRL_SPEED_200;
  160. break;
  161. case 1000:
  162. ctrl = PORT_PCS_CTRL_SPEED_1000;
  163. break;
  164. case 2500:
  165. ctrl = PORT_PCS_CTRL_SPEED_10000 | PORT_PCS_CTRL_ALTSPEED;
  166. break;
  167. case 10000:
  168. /* all bits set, fall through... */
  169. case SPEED_UNFORCED:
  170. ctrl = PORT_PCS_CTRL_SPEED_UNFORCED;
  171. break;
  172. default:
  173. return -EOPNOTSUPP;
  174. }
  175. err = mv88e6xxx_port_read(chip, port, PORT_PCS_CTRL, &reg);
  176. if (err)
  177. return err;
  178. reg &= ~PORT_PCS_CTRL_SPEED_MASK;
  179. if (alt_bit)
  180. reg &= ~PORT_PCS_CTRL_ALTSPEED;
  181. if (force_bit) {
  182. reg &= ~PORT_PCS_CTRL_FORCE_SPEED;
  183. if (speed != SPEED_UNFORCED)
  184. ctrl |= PORT_PCS_CTRL_FORCE_SPEED;
  185. }
  186. reg |= ctrl;
  187. err = mv88e6xxx_port_write(chip, port, PORT_PCS_CTRL, reg);
  188. if (err)
  189. return err;
  190. if (speed)
  191. netdev_dbg(chip->ds->ports[port].netdev,
  192. "Speed set to %d Mbps\n", speed);
  193. else
  194. netdev_dbg(chip->ds->ports[port].netdev, "Speed unforced\n");
  195. return 0;
  196. }
  197. /* Support 10, 100, 200 Mbps (e.g. 88E6065 family) */
  198. int mv88e6065_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
  199. {
  200. if (speed == SPEED_MAX)
  201. speed = 200;
  202. if (speed > 200)
  203. return -EOPNOTSUPP;
  204. /* Setting 200 Mbps on port 0 to 3 selects 100 Mbps */
  205. return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
  206. }
  207. /* Support 10, 100, 1000 Mbps (e.g. 88E6185 family) */
  208. int mv88e6185_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
  209. {
  210. if (speed == SPEED_MAX)
  211. speed = 1000;
  212. if (speed == 200 || speed > 1000)
  213. return -EOPNOTSUPP;
  214. return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
  215. }
  216. /* Support 10, 100, 200, 1000 Mbps (e.g. 88E6352 family) */
  217. int mv88e6352_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
  218. {
  219. if (speed == SPEED_MAX)
  220. speed = 1000;
  221. if (speed > 1000)
  222. return -EOPNOTSUPP;
  223. if (speed == 200 && port < 5)
  224. return -EOPNOTSUPP;
  225. return mv88e6xxx_port_set_speed(chip, port, speed, true, false);
  226. }
  227. /* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6390) */
  228. int mv88e6390_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
  229. {
  230. if (speed == SPEED_MAX)
  231. speed = port < 9 ? 1000 : 2500;
  232. if (speed > 2500)
  233. return -EOPNOTSUPP;
  234. if (speed == 200 && port != 0)
  235. return -EOPNOTSUPP;
  236. if (speed == 2500 && port < 9)
  237. return -EOPNOTSUPP;
  238. return mv88e6xxx_port_set_speed(chip, port, speed, true, true);
  239. }
  240. /* Support 10, 100, 200, 1000, 2500, 10000 Mbps (e.g. 88E6190X) */
  241. int mv88e6390x_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
  242. {
  243. if (speed == SPEED_MAX)
  244. speed = port < 9 ? 1000 : 10000;
  245. if (speed == 200 && port != 0)
  246. return -EOPNOTSUPP;
  247. if (speed >= 2500 && port < 9)
  248. return -EOPNOTSUPP;
  249. return mv88e6xxx_port_set_speed(chip, port, speed, true, true);
  250. }
  251. int mv88e6390x_port_set_cmode(struct mv88e6xxx_chip *chip, int port,
  252. phy_interface_t mode)
  253. {
  254. u16 reg;
  255. u16 cmode;
  256. int err;
  257. if (mode == PHY_INTERFACE_MODE_NA)
  258. return 0;
  259. if (port != 9 && port != 10)
  260. return -EOPNOTSUPP;
  261. switch (mode) {
  262. case PHY_INTERFACE_MODE_1000BASEX:
  263. cmode = PORT_STATUS_CMODE_1000BASE_X;
  264. break;
  265. case PHY_INTERFACE_MODE_SGMII:
  266. cmode = PORT_STATUS_CMODE_SGMII;
  267. break;
  268. case PHY_INTERFACE_MODE_2500BASEX:
  269. cmode = PORT_STATUS_CMODE_2500BASEX;
  270. break;
  271. case PHY_INTERFACE_MODE_XGMII:
  272. cmode = PORT_STATUS_CMODE_XAUI;
  273. break;
  274. case PHY_INTERFACE_MODE_RXAUI:
  275. cmode = PORT_STATUS_CMODE_RXAUI;
  276. break;
  277. default:
  278. cmode = 0;
  279. }
  280. if (cmode) {
  281. err = mv88e6xxx_port_read(chip, port, PORT_STATUS, &reg);
  282. if (err)
  283. return err;
  284. reg &= ~PORT_STATUS_CMODE_MASK;
  285. reg |= cmode;
  286. err = mv88e6xxx_port_write(chip, port, PORT_STATUS, reg);
  287. if (err)
  288. return err;
  289. }
  290. return 0;
  291. }
  292. int mv88e6xxx_port_get_cmode(struct mv88e6xxx_chip *chip, int port, u8 *cmode)
  293. {
  294. int err;
  295. u16 reg;
  296. err = mv88e6xxx_port_read(chip, port, PORT_STATUS, &reg);
  297. if (err)
  298. return err;
  299. *cmode = reg & PORT_STATUS_CMODE_MASK;
  300. return 0;
  301. }
  302. /* Offset 0x02: Pause Control
  303. *
  304. * Do not limit the period of time that this port can be paused for by
  305. * the remote end or the period of time that this port can pause the
  306. * remote end.
  307. */
  308. int mv88e6097_port_pause_config(struct mv88e6xxx_chip *chip, int port)
  309. {
  310. return mv88e6xxx_port_write(chip, port, PORT_PAUSE_CTRL, 0x0000);
  311. }
  312. int mv88e6390_port_pause_config(struct mv88e6xxx_chip *chip, int port)
  313. {
  314. int err;
  315. err = mv88e6xxx_port_write(chip, port, PORT_PAUSE_CTRL,
  316. PORT_FLOW_CTRL_LIMIT_IN | 0);
  317. if (err)
  318. return err;
  319. return mv88e6xxx_port_write(chip, port, PORT_PAUSE_CTRL,
  320. PORT_FLOW_CTRL_LIMIT_OUT | 0);
  321. }
  322. /* Offset 0x04: Port Control Register */
  323. static const char * const mv88e6xxx_port_state_names[] = {
  324. [PORT_CONTROL_STATE_DISABLED] = "Disabled",
  325. [PORT_CONTROL_STATE_BLOCKING] = "Blocking/Listening",
  326. [PORT_CONTROL_STATE_LEARNING] = "Learning",
  327. [PORT_CONTROL_STATE_FORWARDING] = "Forwarding",
  328. };
  329. int mv88e6xxx_port_set_state(struct mv88e6xxx_chip *chip, int port, u8 state)
  330. {
  331. u16 reg;
  332. int err;
  333. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
  334. if (err)
  335. return err;
  336. reg &= ~PORT_CONTROL_STATE_MASK;
  337. reg |= state;
  338. err = mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
  339. if (err)
  340. return err;
  341. netdev_dbg(chip->ds->ports[port].netdev, "PortState set to %s\n",
  342. mv88e6xxx_port_state_names[state]);
  343. return 0;
  344. }
  345. int mv88e6xxx_port_set_egress_mode(struct mv88e6xxx_chip *chip, int port,
  346. u16 mode)
  347. {
  348. int err;
  349. u16 reg;
  350. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
  351. if (err)
  352. return err;
  353. reg &= ~PORT_CONTROL_EGRESS_MASK;
  354. reg |= mode;
  355. return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
  356. }
  357. int mv88e6085_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
  358. enum mv88e6xxx_frame_mode mode)
  359. {
  360. int err;
  361. u16 reg;
  362. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
  363. if (err)
  364. return err;
  365. reg &= ~PORT_CONTROL_FRAME_MODE_DSA;
  366. switch (mode) {
  367. case MV88E6XXX_FRAME_MODE_NORMAL:
  368. reg |= PORT_CONTROL_FRAME_MODE_NORMAL;
  369. break;
  370. case MV88E6XXX_FRAME_MODE_DSA:
  371. reg |= PORT_CONTROL_FRAME_MODE_DSA;
  372. break;
  373. default:
  374. return -EINVAL;
  375. }
  376. return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
  377. }
  378. int mv88e6351_port_set_frame_mode(struct mv88e6xxx_chip *chip, int port,
  379. enum mv88e6xxx_frame_mode mode)
  380. {
  381. int err;
  382. u16 reg;
  383. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
  384. if (err)
  385. return err;
  386. reg &= ~PORT_CONTROL_FRAME_MASK;
  387. switch (mode) {
  388. case MV88E6XXX_FRAME_MODE_NORMAL:
  389. reg |= PORT_CONTROL_FRAME_MODE_NORMAL;
  390. break;
  391. case MV88E6XXX_FRAME_MODE_DSA:
  392. reg |= PORT_CONTROL_FRAME_MODE_DSA;
  393. break;
  394. case MV88E6XXX_FRAME_MODE_PROVIDER:
  395. reg |= PORT_CONTROL_FRAME_MODE_PROVIDER;
  396. break;
  397. case MV88E6XXX_FRAME_MODE_ETHERTYPE:
  398. reg |= PORT_CONTROL_FRAME_ETHER_TYPE_DSA;
  399. break;
  400. default:
  401. return -EINVAL;
  402. }
  403. return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
  404. }
  405. static int mv88e6185_port_set_forward_unknown(struct mv88e6xxx_chip *chip,
  406. int port, bool unicast)
  407. {
  408. int err;
  409. u16 reg;
  410. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
  411. if (err)
  412. return err;
  413. if (unicast)
  414. reg |= PORT_CONTROL_FORWARD_UNKNOWN;
  415. else
  416. reg &= ~PORT_CONTROL_FORWARD_UNKNOWN;
  417. return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
  418. }
  419. int mv88e6352_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
  420. bool unicast, bool multicast)
  421. {
  422. int err;
  423. u16 reg;
  424. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL, &reg);
  425. if (err)
  426. return err;
  427. reg &= ~PORT_CONTROL_EGRESS_FLOODS_MASK;
  428. if (unicast && multicast)
  429. reg |= PORT_CONTROL_EGRESS_FLOODS_ALL_UNKNOWN_DA;
  430. else if (unicast)
  431. reg |= PORT_CONTROL_EGRESS_FLOODS_NO_UNKNOWN_MC_DA;
  432. else if (multicast)
  433. reg |= PORT_CONTROL_EGRESS_FLOODS_NO_UNKNOWN_UC_DA;
  434. else
  435. reg |= PORT_CONTROL_EGRESS_FLOODS_NO_UNKNOWN_DA;
  436. return mv88e6xxx_port_write(chip, port, PORT_CONTROL, reg);
  437. }
  438. /* Offset 0x05: Port Control 1 */
  439. int mv88e6xxx_port_set_message_port(struct mv88e6xxx_chip *chip, int port,
  440. bool message_port)
  441. {
  442. u16 val;
  443. int err;
  444. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_1, &val);
  445. if (err)
  446. return err;
  447. if (message_port)
  448. val |= PORT_CONTROL_1_MESSAGE_PORT;
  449. else
  450. val &= ~PORT_CONTROL_1_MESSAGE_PORT;
  451. return mv88e6xxx_port_write(chip, port, PORT_CONTROL_1, val);
  452. }
  453. /* Offset 0x06: Port Based VLAN Map */
  454. int mv88e6xxx_port_set_vlan_map(struct mv88e6xxx_chip *chip, int port, u16 map)
  455. {
  456. const u16 mask = mv88e6xxx_port_mask(chip);
  457. u16 reg;
  458. int err;
  459. err = mv88e6xxx_port_read(chip, port, PORT_BASE_VLAN, &reg);
  460. if (err)
  461. return err;
  462. reg &= ~mask;
  463. reg |= map & mask;
  464. err = mv88e6xxx_port_write(chip, port, PORT_BASE_VLAN, reg);
  465. if (err)
  466. return err;
  467. netdev_dbg(chip->ds->ports[port].netdev, "VLANTable set to %.3x\n",
  468. map);
  469. return 0;
  470. }
  471. int mv88e6xxx_port_get_fid(struct mv88e6xxx_chip *chip, int port, u16 *fid)
  472. {
  473. const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
  474. u16 reg;
  475. int err;
  476. /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
  477. err = mv88e6xxx_port_read(chip, port, PORT_BASE_VLAN, &reg);
  478. if (err)
  479. return err;
  480. *fid = (reg & 0xf000) >> 12;
  481. /* Port's default FID upper bits are located in reg 0x05, offset 0 */
  482. if (upper_mask) {
  483. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_1, &reg);
  484. if (err)
  485. return err;
  486. *fid |= (reg & upper_mask) << 4;
  487. }
  488. return 0;
  489. }
  490. int mv88e6xxx_port_set_fid(struct mv88e6xxx_chip *chip, int port, u16 fid)
  491. {
  492. const u16 upper_mask = (mv88e6xxx_num_databases(chip) - 1) >> 4;
  493. u16 reg;
  494. int err;
  495. if (fid >= mv88e6xxx_num_databases(chip))
  496. return -EINVAL;
  497. /* Port's default FID lower 4 bits are located in reg 0x06, offset 12 */
  498. err = mv88e6xxx_port_read(chip, port, PORT_BASE_VLAN, &reg);
  499. if (err)
  500. return err;
  501. reg &= 0x0fff;
  502. reg |= (fid & 0x000f) << 12;
  503. err = mv88e6xxx_port_write(chip, port, PORT_BASE_VLAN, reg);
  504. if (err)
  505. return err;
  506. /* Port's default FID upper bits are located in reg 0x05, offset 0 */
  507. if (upper_mask) {
  508. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_1, &reg);
  509. if (err)
  510. return err;
  511. reg &= ~upper_mask;
  512. reg |= (fid >> 4) & upper_mask;
  513. err = mv88e6xxx_port_write(chip, port, PORT_CONTROL_1, reg);
  514. if (err)
  515. return err;
  516. }
  517. netdev_dbg(chip->ds->ports[port].netdev, "FID set to %u\n", fid);
  518. return 0;
  519. }
  520. /* Offset 0x07: Default Port VLAN ID & Priority */
  521. int mv88e6xxx_port_get_pvid(struct mv88e6xxx_chip *chip, int port, u16 *pvid)
  522. {
  523. u16 reg;
  524. int err;
  525. err = mv88e6xxx_port_read(chip, port, PORT_DEFAULT_VLAN, &reg);
  526. if (err)
  527. return err;
  528. *pvid = reg & PORT_DEFAULT_VLAN_MASK;
  529. return 0;
  530. }
  531. int mv88e6xxx_port_set_pvid(struct mv88e6xxx_chip *chip, int port, u16 pvid)
  532. {
  533. u16 reg;
  534. int err;
  535. err = mv88e6xxx_port_read(chip, port, PORT_DEFAULT_VLAN, &reg);
  536. if (err)
  537. return err;
  538. reg &= ~PORT_DEFAULT_VLAN_MASK;
  539. reg |= pvid & PORT_DEFAULT_VLAN_MASK;
  540. err = mv88e6xxx_port_write(chip, port, PORT_DEFAULT_VLAN, reg);
  541. if (err)
  542. return err;
  543. netdev_dbg(chip->ds->ports[port].netdev, "DefaultVID set to %u\n",
  544. pvid);
  545. return 0;
  546. }
  547. /* Offset 0x08: Port Control 2 Register */
  548. static const char * const mv88e6xxx_port_8021q_mode_names[] = {
  549. [PORT_CONTROL_2_8021Q_DISABLED] = "Disabled",
  550. [PORT_CONTROL_2_8021Q_FALLBACK] = "Fallback",
  551. [PORT_CONTROL_2_8021Q_CHECK] = "Check",
  552. [PORT_CONTROL_2_8021Q_SECURE] = "Secure",
  553. };
  554. static int mv88e6185_port_set_default_forward(struct mv88e6xxx_chip *chip,
  555. int port, bool multicast)
  556. {
  557. int err;
  558. u16 reg;
  559. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
  560. if (err)
  561. return err;
  562. if (multicast)
  563. reg |= PORT_CONTROL_2_DEFAULT_FORWARD;
  564. else
  565. reg &= ~PORT_CONTROL_2_DEFAULT_FORWARD;
  566. return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
  567. }
  568. int mv88e6185_port_set_egress_floods(struct mv88e6xxx_chip *chip, int port,
  569. bool unicast, bool multicast)
  570. {
  571. int err;
  572. err = mv88e6185_port_set_forward_unknown(chip, port, unicast);
  573. if (err)
  574. return err;
  575. return mv88e6185_port_set_default_forward(chip, port, multicast);
  576. }
  577. int mv88e6095_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port,
  578. int upstream_port)
  579. {
  580. int err;
  581. u16 reg;
  582. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
  583. if (err)
  584. return err;
  585. reg &= ~PORT_CONTROL_2_UPSTREAM_MASK;
  586. reg |= upstream_port;
  587. return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
  588. }
  589. int mv88e6xxx_port_set_8021q_mode(struct mv88e6xxx_chip *chip, int port,
  590. u16 mode)
  591. {
  592. u16 reg;
  593. int err;
  594. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
  595. if (err)
  596. return err;
  597. reg &= ~PORT_CONTROL_2_8021Q_MASK;
  598. reg |= mode & PORT_CONTROL_2_8021Q_MASK;
  599. err = mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
  600. if (err)
  601. return err;
  602. netdev_dbg(chip->ds->ports[port].netdev, "802.1QMode set to %s\n",
  603. mv88e6xxx_port_8021q_mode_names[mode]);
  604. return 0;
  605. }
  606. int mv88e6xxx_port_set_map_da(struct mv88e6xxx_chip *chip, int port)
  607. {
  608. u16 reg;
  609. int err;
  610. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
  611. if (err)
  612. return err;
  613. reg |= PORT_CONTROL_2_MAP_DA;
  614. return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
  615. }
  616. int mv88e6165_port_jumbo_config(struct mv88e6xxx_chip *chip, int port)
  617. {
  618. u16 reg;
  619. int err;
  620. err = mv88e6xxx_port_read(chip, port, PORT_CONTROL_2, &reg);
  621. if (err)
  622. return err;
  623. reg |= PORT_CONTROL_2_JUMBO_10240;
  624. return mv88e6xxx_port_write(chip, port, PORT_CONTROL_2, reg);
  625. }
  626. /* Offset 0x09: Port Rate Control */
  627. int mv88e6095_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
  628. {
  629. return mv88e6xxx_port_write(chip, port, PORT_RATE_CONTROL, 0x0000);
  630. }
  631. int mv88e6097_port_egress_rate_limiting(struct mv88e6xxx_chip *chip, int port)
  632. {
  633. return mv88e6xxx_port_write(chip, port, PORT_RATE_CONTROL, 0x0001);
  634. }
  635. /* Offset 0x0C: Port ATU Control */
  636. int mv88e6xxx_port_disable_learn_limit(struct mv88e6xxx_chip *chip, int port)
  637. {
  638. return mv88e6xxx_port_write(chip, port, PORT_ATU_CONTROL, 0);
  639. }
  640. /* Offset 0x0D: (Priority) Override Register */
  641. int mv88e6xxx_port_disable_pri_override(struct mv88e6xxx_chip *chip, int port)
  642. {
  643. return mv88e6xxx_port_write(chip, port, PORT_PRI_OVERRIDE, 0);
  644. }
  645. /* Offset 0x0f: Port Ether type */
  646. int mv88e6351_port_set_ether_type(struct mv88e6xxx_chip *chip, int port,
  647. u16 etype)
  648. {
  649. return mv88e6xxx_port_write(chip, port, PORT_ETH_TYPE, etype);
  650. }
  651. /* Offset 0x18: Port IEEE Priority Remapping Registers [0-3]
  652. * Offset 0x19: Port IEEE Priority Remapping Registers [4-7]
  653. */
  654. int mv88e6095_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
  655. {
  656. int err;
  657. /* Use a direct priority mapping for all IEEE tagged frames */
  658. err = mv88e6xxx_port_write(chip, port, PORT_TAG_REGMAP_0123, 0x3210);
  659. if (err)
  660. return err;
  661. return mv88e6xxx_port_write(chip, port, PORT_TAG_REGMAP_4567, 0x7654);
  662. }
  663. static int mv88e6xxx_port_ieeepmt_write(struct mv88e6xxx_chip *chip,
  664. int port, u16 table,
  665. u8 pointer, u16 data)
  666. {
  667. u16 reg;
  668. reg = PORT_IEEE_PRIO_MAP_TABLE_UPDATE |
  669. table |
  670. (pointer << PORT_IEEE_PRIO_MAP_TABLE_POINTER_SHIFT) |
  671. data;
  672. return mv88e6xxx_port_write(chip, port, PORT_IEEE_PRIO_MAP_TABLE, reg);
  673. }
  674. int mv88e6390_port_tag_remap(struct mv88e6xxx_chip *chip, int port)
  675. {
  676. int err, i;
  677. for (i = 0; i <= 7; i++) {
  678. err = mv88e6xxx_port_ieeepmt_write(
  679. chip, port, PORT_IEEE_PRIO_MAP_TABLE_INGRESS_PCP,
  680. i, (i | i << 4));
  681. if (err)
  682. return err;
  683. err = mv88e6xxx_port_ieeepmt_write(
  684. chip, port, PORT_IEEE_PRIO_MAP_TABLE_EGRESS_GREEN_PCP,
  685. i, i);
  686. if (err)
  687. return err;
  688. err = mv88e6xxx_port_ieeepmt_write(
  689. chip, port, PORT_IEEE_PRIO_MAP_TABLE_EGRESS_YELLOW_PCP,
  690. i, i);
  691. if (err)
  692. return err;
  693. err = mv88e6xxx_port_ieeepmt_write(
  694. chip, port, PORT_IEEE_PRIO_MAP_TABLE_EGRESS_AVB_PCP,
  695. i, i);
  696. if (err)
  697. return err;
  698. }
  699. return 0;
  700. }