thunder_bgx.c 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2015 Cavium, Inc.
  4. */
  5. #include <linux/acpi.h>
  6. #include <linux/module.h>
  7. #include <linux/interrupt.h>
  8. #include <linux/pci.h>
  9. #include <linux/netdevice.h>
  10. #include <linux/etherdevice.h>
  11. #include <linux/phy.h>
  12. #include <linux/of.h>
  13. #include <linux/of_mdio.h>
  14. #include <linux/of_net.h>
  15. #include "nic_reg.h"
  16. #include "nic.h"
  17. #include "thunder_bgx.h"
  18. #define DRV_NAME "thunder_bgx"
  19. #define DRV_VERSION "1.0"
  20. /* RX_DMAC_CTL configuration */
  21. enum MCAST_MODE {
  22. MCAST_MODE_REJECT = 0x0,
  23. MCAST_MODE_ACCEPT = 0x1,
  24. MCAST_MODE_CAM_FILTER = 0x2,
  25. RSVD = 0x3
  26. };
  27. #define BCAST_ACCEPT BIT(0)
  28. #define CAM_ACCEPT BIT(3)
  29. #define MCAST_MODE_MASK 0x3
  30. #define BGX_MCAST_MODE(x) (x << 1)
  31. struct dmac_map {
  32. u64 vf_map;
  33. u64 dmac;
  34. };
  35. struct lmac {
  36. struct bgx *bgx;
  37. /* actual number of DMACs configured */
  38. u8 dmacs_cfg;
  39. /* overal number of possible DMACs could be configured per LMAC */
  40. u8 dmacs_count;
  41. struct dmac_map *dmacs; /* DMAC:VFs tracking filter array */
  42. u8 mac[ETH_ALEN];
  43. u8 lmac_type;
  44. u8 lane_to_sds;
  45. bool use_training;
  46. bool autoneg;
  47. bool link_up;
  48. int lmacid; /* ID within BGX */
  49. int lmacid_bd; /* ID on board */
  50. struct net_device *netdev;
  51. struct phy_device *phydev;
  52. unsigned int last_duplex;
  53. unsigned int last_link;
  54. unsigned int last_speed;
  55. bool is_sgmii;
  56. struct delayed_work dwork;
  57. struct workqueue_struct *check_link;
  58. };
  59. struct bgx {
  60. u8 bgx_id;
  61. struct lmac lmac[MAX_LMAC_PER_BGX];
  62. u8 lmac_count;
  63. u8 max_lmac;
  64. u8 acpi_lmac_idx;
  65. void __iomem *reg_base;
  66. struct pci_dev *pdev;
  67. bool is_dlm;
  68. bool is_rgx;
  69. };
  70. static struct bgx *bgx_vnic[MAX_BGX_THUNDER];
  71. static int lmac_count; /* Total no of LMACs in system */
  72. static int bgx_xaui_check_link(struct lmac *lmac);
  73. /* Supported devices */
  74. static const struct pci_device_id bgx_id_table[] = {
  75. { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVICE_ID_THUNDER_BGX) },
  76. { PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVICE_ID_THUNDER_RGX) },
  77. { 0, } /* end of table */
  78. };
  79. MODULE_AUTHOR("Cavium Inc");
  80. MODULE_DESCRIPTION("Cavium Thunder BGX/MAC Driver");
  81. MODULE_LICENSE("GPL v2");
  82. MODULE_VERSION(DRV_VERSION);
  83. MODULE_DEVICE_TABLE(pci, bgx_id_table);
  84. /* The Cavium ThunderX network controller can *only* be found in SoCs
  85. * containing the ThunderX ARM64 CPU implementation. All accesses to the device
  86. * registers on this platform are implicitly strongly ordered with respect
  87. * to memory accesses. So writeq_relaxed() and readq_relaxed() are safe to use
  88. * with no memory barriers in this driver. The readq()/writeq() functions add
  89. * explicit ordering operation which in this case are redundant, and only
  90. * add overhead.
  91. */
  92. /* Register read/write APIs */
  93. static u64 bgx_reg_read(struct bgx *bgx, u8 lmac, u64 offset)
  94. {
  95. void __iomem *addr = bgx->reg_base + ((u32)lmac << 20) + offset;
  96. return readq_relaxed(addr);
  97. }
  98. static void bgx_reg_write(struct bgx *bgx, u8 lmac, u64 offset, u64 val)
  99. {
  100. void __iomem *addr = bgx->reg_base + ((u32)lmac << 20) + offset;
  101. writeq_relaxed(val, addr);
  102. }
  103. static void bgx_reg_modify(struct bgx *bgx, u8 lmac, u64 offset, u64 val)
  104. {
  105. void __iomem *addr = bgx->reg_base + ((u32)lmac << 20) + offset;
  106. writeq_relaxed(val | readq_relaxed(addr), addr);
  107. }
  108. static int bgx_poll_reg(struct bgx *bgx, u8 lmac, u64 reg, u64 mask, bool zero)
  109. {
  110. int timeout = 100;
  111. u64 reg_val;
  112. while (timeout) {
  113. reg_val = bgx_reg_read(bgx, lmac, reg);
  114. if (zero && !(reg_val & mask))
  115. return 0;
  116. if (!zero && (reg_val & mask))
  117. return 0;
  118. usleep_range(1000, 2000);
  119. timeout--;
  120. }
  121. return 1;
  122. }
  123. static int max_bgx_per_node;
  124. static void set_max_bgx_per_node(struct pci_dev *pdev)
  125. {
  126. u16 sdevid;
  127. if (max_bgx_per_node)
  128. return;
  129. pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &sdevid);
  130. switch (sdevid) {
  131. case PCI_SUBSYS_DEVID_81XX_BGX:
  132. case PCI_SUBSYS_DEVID_81XX_RGX:
  133. max_bgx_per_node = MAX_BGX_PER_CN81XX;
  134. break;
  135. case PCI_SUBSYS_DEVID_83XX_BGX:
  136. max_bgx_per_node = MAX_BGX_PER_CN83XX;
  137. break;
  138. case PCI_SUBSYS_DEVID_88XX_BGX:
  139. default:
  140. max_bgx_per_node = MAX_BGX_PER_CN88XX;
  141. break;
  142. }
  143. }
  144. static struct bgx *get_bgx(int node, int bgx_idx)
  145. {
  146. int idx = (node * max_bgx_per_node) + bgx_idx;
  147. return bgx_vnic[idx];
  148. }
  149. /* Return number of BGX present in HW */
  150. unsigned bgx_get_map(int node)
  151. {
  152. int i;
  153. unsigned map = 0;
  154. for (i = 0; i < max_bgx_per_node; i++) {
  155. if (bgx_vnic[(node * max_bgx_per_node) + i])
  156. map |= (1 << i);
  157. }
  158. return map;
  159. }
  160. EXPORT_SYMBOL(bgx_get_map);
  161. /* Return number of LMAC configured for this BGX */
  162. int bgx_get_lmac_count(int node, int bgx_idx)
  163. {
  164. struct bgx *bgx;
  165. bgx = get_bgx(node, bgx_idx);
  166. if (bgx)
  167. return bgx->lmac_count;
  168. return 0;
  169. }
  170. EXPORT_SYMBOL(bgx_get_lmac_count);
  171. /* Returns the current link status of LMAC */
  172. void bgx_get_lmac_link_state(int node, int bgx_idx, int lmacid, void *status)
  173. {
  174. struct bgx_link_status *link = (struct bgx_link_status *)status;
  175. struct bgx *bgx;
  176. struct lmac *lmac;
  177. bgx = get_bgx(node, bgx_idx);
  178. if (!bgx)
  179. return;
  180. lmac = &bgx->lmac[lmacid];
  181. link->mac_type = lmac->lmac_type;
  182. link->link_up = lmac->link_up;
  183. link->duplex = lmac->last_duplex;
  184. link->speed = lmac->last_speed;
  185. }
  186. EXPORT_SYMBOL(bgx_get_lmac_link_state);
  187. const u8 *bgx_get_lmac_mac(int node, int bgx_idx, int lmacid)
  188. {
  189. struct bgx *bgx = get_bgx(node, bgx_idx);
  190. if (bgx)
  191. return bgx->lmac[lmacid].mac;
  192. return NULL;
  193. }
  194. EXPORT_SYMBOL(bgx_get_lmac_mac);
  195. void bgx_set_lmac_mac(int node, int bgx_idx, int lmacid, const u8 *mac)
  196. {
  197. struct bgx *bgx = get_bgx(node, bgx_idx);
  198. if (!bgx)
  199. return;
  200. ether_addr_copy(bgx->lmac[lmacid].mac, mac);
  201. }
  202. EXPORT_SYMBOL(bgx_set_lmac_mac);
  203. static void bgx_flush_dmac_cam_filter(struct bgx *bgx, int lmacid)
  204. {
  205. struct lmac *lmac = NULL;
  206. u8 idx = 0;
  207. lmac = &bgx->lmac[lmacid];
  208. /* reset CAM filters */
  209. for (idx = 0; idx < lmac->dmacs_count; idx++)
  210. bgx_reg_write(bgx, 0, BGX_CMR_RX_DMACX_CAM +
  211. ((lmacid * lmac->dmacs_count) + idx) *
  212. sizeof(u64), 0);
  213. }
  214. static void bgx_lmac_remove_filters(struct lmac *lmac, u8 vf_id)
  215. {
  216. int i = 0;
  217. if (!lmac)
  218. return;
  219. /* We've got reset filters request from some of attached VF, while the
  220. * others might want to keep their configuration. So in this case lets
  221. * iterate over all of configured filters and decrease number of
  222. * referencies. if some addresses get zero refs remove them from list
  223. */
  224. for (i = lmac->dmacs_cfg - 1; i >= 0; i--) {
  225. lmac->dmacs[i].vf_map &= ~BIT_ULL(vf_id);
  226. if (!lmac->dmacs[i].vf_map) {
  227. lmac->dmacs_cfg--;
  228. lmac->dmacs[i].dmac = 0;
  229. lmac->dmacs[i].vf_map = 0;
  230. }
  231. }
  232. }
  233. static int bgx_lmac_save_filter(struct lmac *lmac, u64 dmac, u8 vf_id)
  234. {
  235. u8 i = 0;
  236. if (!lmac)
  237. return -1;
  238. /* At the same time we could have several VFs 'attached' to some
  239. * particular LMAC, and each VF is represented as network interface
  240. * for kernel. So from user perspective it should be possible to
  241. * manipulate with its' (VF) receive modes. However from PF
  242. * driver perspective we need to keep track of filter configurations
  243. * for different VFs to prevent filter values dupes
  244. */
  245. for (i = 0; i < lmac->dmacs_cfg; i++) {
  246. if (lmac->dmacs[i].dmac == dmac) {
  247. lmac->dmacs[i].vf_map |= BIT_ULL(vf_id);
  248. return -1;
  249. }
  250. }
  251. if (!(lmac->dmacs_cfg < lmac->dmacs_count))
  252. return -1;
  253. /* keep it for further tracking */
  254. lmac->dmacs[lmac->dmacs_cfg].dmac = dmac;
  255. lmac->dmacs[lmac->dmacs_cfg].vf_map = BIT_ULL(vf_id);
  256. lmac->dmacs_cfg++;
  257. return 0;
  258. }
  259. static int bgx_set_dmac_cam_filter_mac(struct bgx *bgx, int lmacid,
  260. u64 cam_dmac, u8 idx)
  261. {
  262. struct lmac *lmac = NULL;
  263. u64 cfg = 0;
  264. /* skip zero addresses as meaningless */
  265. if (!cam_dmac || !bgx)
  266. return -1;
  267. lmac = &bgx->lmac[lmacid];
  268. /* configure DCAM filtering for designated LMAC */
  269. cfg = RX_DMACX_CAM_LMACID(lmacid & LMAC_ID_MASK) |
  270. RX_DMACX_CAM_EN | cam_dmac;
  271. bgx_reg_write(bgx, 0, BGX_CMR_RX_DMACX_CAM +
  272. ((lmacid * lmac->dmacs_count) + idx) * sizeof(u64), cfg);
  273. return 0;
  274. }
  275. void bgx_set_dmac_cam_filter(int node, int bgx_idx, int lmacid,
  276. u64 cam_dmac, u8 vf_id)
  277. {
  278. struct bgx *bgx = get_bgx(node, bgx_idx);
  279. struct lmac *lmac = NULL;
  280. if (!bgx)
  281. return;
  282. lmac = &bgx->lmac[lmacid];
  283. if (!cam_dmac)
  284. cam_dmac = ether_addr_to_u64(lmac->mac);
  285. /* since we might have several VFs attached to particular LMAC
  286. * and kernel could call mcast config for each of them with the
  287. * same MAC, check if requested MAC is already in filtering list and
  288. * updare/prepare list of MACs to be applied later to HW filters
  289. */
  290. bgx_lmac_save_filter(lmac, cam_dmac, vf_id);
  291. }
  292. EXPORT_SYMBOL(bgx_set_dmac_cam_filter);
  293. void bgx_set_xcast_mode(int node, int bgx_idx, int lmacid, u8 mode)
  294. {
  295. struct bgx *bgx = get_bgx(node, bgx_idx);
  296. struct lmac *lmac = NULL;
  297. u64 cfg = 0;
  298. u8 i = 0;
  299. if (!bgx)
  300. return;
  301. lmac = &bgx->lmac[lmacid];
  302. cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_RX_DMAC_CTL);
  303. if (mode & BGX_XCAST_BCAST_ACCEPT)
  304. cfg |= BCAST_ACCEPT;
  305. else
  306. cfg &= ~BCAST_ACCEPT;
  307. /* disable all MCASTs and DMAC filtering */
  308. cfg &= ~(CAM_ACCEPT | BGX_MCAST_MODE(MCAST_MODE_MASK));
  309. /* check requested bits and set filtergin mode appropriately */
  310. if (mode & (BGX_XCAST_MCAST_ACCEPT)) {
  311. cfg |= (BGX_MCAST_MODE(MCAST_MODE_ACCEPT));
  312. } else if (mode & BGX_XCAST_MCAST_FILTER) {
  313. cfg |= (BGX_MCAST_MODE(MCAST_MODE_CAM_FILTER) | CAM_ACCEPT);
  314. for (i = 0; i < lmac->dmacs_cfg; i++)
  315. bgx_set_dmac_cam_filter_mac(bgx, lmacid,
  316. lmac->dmacs[i].dmac, i);
  317. }
  318. bgx_reg_write(bgx, lmacid, BGX_CMRX_RX_DMAC_CTL, cfg);
  319. }
  320. EXPORT_SYMBOL(bgx_set_xcast_mode);
  321. void bgx_reset_xcast_mode(int node, int bgx_idx, int lmacid, u8 vf_id)
  322. {
  323. struct bgx *bgx = get_bgx(node, bgx_idx);
  324. if (!bgx)
  325. return;
  326. bgx_lmac_remove_filters(&bgx->lmac[lmacid], vf_id);
  327. bgx_flush_dmac_cam_filter(bgx, lmacid);
  328. bgx_set_xcast_mode(node, bgx_idx, lmacid,
  329. (BGX_XCAST_BCAST_ACCEPT | BGX_XCAST_MCAST_ACCEPT));
  330. }
  331. EXPORT_SYMBOL(bgx_reset_xcast_mode);
  332. void bgx_lmac_rx_tx_enable(int node, int bgx_idx, int lmacid, bool enable)
  333. {
  334. struct bgx *bgx = get_bgx(node, bgx_idx);
  335. struct lmac *lmac;
  336. u64 cfg;
  337. if (!bgx)
  338. return;
  339. lmac = &bgx->lmac[lmacid];
  340. cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG);
  341. if (enable) {
  342. cfg |= CMR_PKT_RX_EN | CMR_PKT_TX_EN;
  343. /* enable TX FIFO Underflow interrupt */
  344. bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_INT_ENA_W1S,
  345. GMI_TXX_INT_UNDFLW);
  346. } else {
  347. cfg &= ~(CMR_PKT_RX_EN | CMR_PKT_TX_EN);
  348. /* Disable TX FIFO Underflow interrupt */
  349. bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_INT_ENA_W1C,
  350. GMI_TXX_INT_UNDFLW);
  351. }
  352. bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg);
  353. if (bgx->is_rgx)
  354. xcv_setup_link(enable ? lmac->link_up : 0, lmac->last_speed);
  355. }
  356. EXPORT_SYMBOL(bgx_lmac_rx_tx_enable);
  357. /* Enables or disables timestamp insertion by BGX for Rx packets */
  358. void bgx_config_timestamping(int node, int bgx_idx, int lmacid, bool enable)
  359. {
  360. struct bgx *bgx = get_bgx(node, bgx_idx);
  361. struct lmac *lmac;
  362. u64 csr_offset, cfg;
  363. if (!bgx)
  364. return;
  365. lmac = &bgx->lmac[lmacid];
  366. if (lmac->lmac_type == BGX_MODE_SGMII ||
  367. lmac->lmac_type == BGX_MODE_QSGMII ||
  368. lmac->lmac_type == BGX_MODE_RGMII)
  369. csr_offset = BGX_GMP_GMI_RXX_FRM_CTL;
  370. else
  371. csr_offset = BGX_SMUX_RX_FRM_CTL;
  372. cfg = bgx_reg_read(bgx, lmacid, csr_offset);
  373. if (enable)
  374. cfg |= BGX_PKT_RX_PTP_EN;
  375. else
  376. cfg &= ~BGX_PKT_RX_PTP_EN;
  377. bgx_reg_write(bgx, lmacid, csr_offset, cfg);
  378. }
  379. EXPORT_SYMBOL(bgx_config_timestamping);
  380. void bgx_lmac_get_pfc(int node, int bgx_idx, int lmacid, void *pause)
  381. {
  382. struct pfc *pfc = (struct pfc *)pause;
  383. struct bgx *bgx = get_bgx(node, bgx_idx);
  384. struct lmac *lmac;
  385. u64 cfg;
  386. if (!bgx)
  387. return;
  388. lmac = &bgx->lmac[lmacid];
  389. if (lmac->is_sgmii)
  390. return;
  391. cfg = bgx_reg_read(bgx, lmacid, BGX_SMUX_CBFC_CTL);
  392. pfc->fc_rx = cfg & RX_EN;
  393. pfc->fc_tx = cfg & TX_EN;
  394. pfc->autoneg = 0;
  395. }
  396. EXPORT_SYMBOL(bgx_lmac_get_pfc);
  397. void bgx_lmac_set_pfc(int node, int bgx_idx, int lmacid, void *pause)
  398. {
  399. struct pfc *pfc = (struct pfc *)pause;
  400. struct bgx *bgx = get_bgx(node, bgx_idx);
  401. struct lmac *lmac;
  402. u64 cfg;
  403. if (!bgx)
  404. return;
  405. lmac = &bgx->lmac[lmacid];
  406. if (lmac->is_sgmii)
  407. return;
  408. cfg = bgx_reg_read(bgx, lmacid, BGX_SMUX_CBFC_CTL);
  409. cfg &= ~(RX_EN | TX_EN);
  410. cfg |= (pfc->fc_rx ? RX_EN : 0x00);
  411. cfg |= (pfc->fc_tx ? TX_EN : 0x00);
  412. bgx_reg_write(bgx, lmacid, BGX_SMUX_CBFC_CTL, cfg);
  413. }
  414. EXPORT_SYMBOL(bgx_lmac_set_pfc);
  415. static void bgx_sgmii_change_link_state(struct lmac *lmac)
  416. {
  417. struct bgx *bgx = lmac->bgx;
  418. u64 cmr_cfg;
  419. u64 port_cfg = 0;
  420. u64 misc_ctl = 0;
  421. bool tx_en, rx_en;
  422. cmr_cfg = bgx_reg_read(bgx, lmac->lmacid, BGX_CMRX_CFG);
  423. tx_en = cmr_cfg & CMR_PKT_TX_EN;
  424. rx_en = cmr_cfg & CMR_PKT_RX_EN;
  425. cmr_cfg &= ~(CMR_PKT_RX_EN | CMR_PKT_TX_EN);
  426. bgx_reg_write(bgx, lmac->lmacid, BGX_CMRX_CFG, cmr_cfg);
  427. /* Wait for BGX RX to be idle */
  428. if (bgx_poll_reg(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG,
  429. GMI_PORT_CFG_RX_IDLE, false)) {
  430. dev_err(&bgx->pdev->dev, "BGX%d LMAC%d GMI RX not idle\n",
  431. bgx->bgx_id, lmac->lmacid);
  432. return;
  433. }
  434. /* Wait for BGX TX to be idle */
  435. if (bgx_poll_reg(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG,
  436. GMI_PORT_CFG_TX_IDLE, false)) {
  437. dev_err(&bgx->pdev->dev, "BGX%d LMAC%d GMI TX not idle\n",
  438. bgx->bgx_id, lmac->lmacid);
  439. return;
  440. }
  441. port_cfg = bgx_reg_read(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG);
  442. misc_ctl = bgx_reg_read(bgx, lmac->lmacid, BGX_GMP_PCS_MISCX_CTL);
  443. if (lmac->link_up) {
  444. misc_ctl &= ~PCS_MISC_CTL_GMX_ENO;
  445. port_cfg &= ~GMI_PORT_CFG_DUPLEX;
  446. port_cfg |= (lmac->last_duplex << 2);
  447. } else {
  448. misc_ctl |= PCS_MISC_CTL_GMX_ENO;
  449. }
  450. switch (lmac->last_speed) {
  451. case 10:
  452. port_cfg &= ~GMI_PORT_CFG_SPEED; /* speed 0 */
  453. port_cfg |= GMI_PORT_CFG_SPEED_MSB; /* speed_msb 1 */
  454. port_cfg &= ~GMI_PORT_CFG_SLOT_TIME; /* slottime 0 */
  455. misc_ctl &= ~PCS_MISC_CTL_SAMP_PT_MASK;
  456. misc_ctl |= 50; /* samp_pt */
  457. bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_SLOT, 64);
  458. bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_BURST, 0);
  459. break;
  460. case 100:
  461. port_cfg &= ~GMI_PORT_CFG_SPEED; /* speed 0 */
  462. port_cfg &= ~GMI_PORT_CFG_SPEED_MSB; /* speed_msb 0 */
  463. port_cfg &= ~GMI_PORT_CFG_SLOT_TIME; /* slottime 0 */
  464. misc_ctl &= ~PCS_MISC_CTL_SAMP_PT_MASK;
  465. misc_ctl |= 5; /* samp_pt */
  466. bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_SLOT, 64);
  467. bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_BURST, 0);
  468. break;
  469. case 1000:
  470. port_cfg |= GMI_PORT_CFG_SPEED; /* speed 1 */
  471. port_cfg &= ~GMI_PORT_CFG_SPEED_MSB; /* speed_msb 0 */
  472. port_cfg |= GMI_PORT_CFG_SLOT_TIME; /* slottime 1 */
  473. misc_ctl &= ~PCS_MISC_CTL_SAMP_PT_MASK;
  474. misc_ctl |= 1; /* samp_pt */
  475. bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_SLOT, 512);
  476. if (lmac->last_duplex)
  477. bgx_reg_write(bgx, lmac->lmacid,
  478. BGX_GMP_GMI_TXX_BURST, 0);
  479. else
  480. bgx_reg_write(bgx, lmac->lmacid,
  481. BGX_GMP_GMI_TXX_BURST, 8192);
  482. break;
  483. default:
  484. break;
  485. }
  486. bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_PCS_MISCX_CTL, misc_ctl);
  487. bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG, port_cfg);
  488. /* Restore CMR config settings */
  489. cmr_cfg |= (rx_en ? CMR_PKT_RX_EN : 0) | (tx_en ? CMR_PKT_TX_EN : 0);
  490. bgx_reg_write(bgx, lmac->lmacid, BGX_CMRX_CFG, cmr_cfg);
  491. if (bgx->is_rgx && (cmr_cfg & (CMR_PKT_RX_EN | CMR_PKT_TX_EN)))
  492. xcv_setup_link(lmac->link_up, lmac->last_speed);
  493. }
  494. static void bgx_lmac_handler(struct net_device *netdev)
  495. {
  496. struct phy_device *phydev;
  497. struct lmac *lmac, **priv;
  498. int link_changed = 0;
  499. priv = netdev_priv(netdev);
  500. lmac = *priv;
  501. phydev = lmac->phydev;
  502. if (!phydev->link && lmac->last_link)
  503. link_changed = -1;
  504. if (phydev->link &&
  505. (lmac->last_duplex != phydev->duplex ||
  506. lmac->last_link != phydev->link ||
  507. lmac->last_speed != phydev->speed)) {
  508. link_changed = 1;
  509. }
  510. lmac->last_link = phydev->link;
  511. lmac->last_speed = phydev->speed;
  512. lmac->last_duplex = phydev->duplex;
  513. if (!link_changed)
  514. return;
  515. if (link_changed > 0)
  516. lmac->link_up = true;
  517. else
  518. lmac->link_up = false;
  519. if (lmac->is_sgmii)
  520. bgx_sgmii_change_link_state(lmac);
  521. else
  522. bgx_xaui_check_link(lmac);
  523. }
  524. u64 bgx_get_rx_stats(int node, int bgx_idx, int lmac, int idx)
  525. {
  526. struct bgx *bgx;
  527. bgx = get_bgx(node, bgx_idx);
  528. if (!bgx)
  529. return 0;
  530. if (idx > 8)
  531. lmac = 0;
  532. return bgx_reg_read(bgx, lmac, BGX_CMRX_RX_STAT0 + (idx * 8));
  533. }
  534. EXPORT_SYMBOL(bgx_get_rx_stats);
  535. u64 bgx_get_tx_stats(int node, int bgx_idx, int lmac, int idx)
  536. {
  537. struct bgx *bgx;
  538. bgx = get_bgx(node, bgx_idx);
  539. if (!bgx)
  540. return 0;
  541. return bgx_reg_read(bgx, lmac, BGX_CMRX_TX_STAT0 + (idx * 8));
  542. }
  543. EXPORT_SYMBOL(bgx_get_tx_stats);
  544. /* Configure BGX LMAC in internal loopback mode */
  545. void bgx_lmac_internal_loopback(int node, int bgx_idx,
  546. int lmac_idx, bool enable)
  547. {
  548. struct bgx *bgx;
  549. struct lmac *lmac;
  550. u64 cfg;
  551. bgx = get_bgx(node, bgx_idx);
  552. if (!bgx)
  553. return;
  554. lmac = &bgx->lmac[lmac_idx];
  555. if (lmac->is_sgmii) {
  556. cfg = bgx_reg_read(bgx, lmac_idx, BGX_GMP_PCS_MRX_CTL);
  557. if (enable)
  558. cfg |= PCS_MRX_CTL_LOOPBACK1;
  559. else
  560. cfg &= ~PCS_MRX_CTL_LOOPBACK1;
  561. bgx_reg_write(bgx, lmac_idx, BGX_GMP_PCS_MRX_CTL, cfg);
  562. } else {
  563. cfg = bgx_reg_read(bgx, lmac_idx, BGX_SPUX_CONTROL1);
  564. if (enable)
  565. cfg |= SPU_CTL_LOOPBACK;
  566. else
  567. cfg &= ~SPU_CTL_LOOPBACK;
  568. bgx_reg_write(bgx, lmac_idx, BGX_SPUX_CONTROL1, cfg);
  569. }
  570. }
  571. EXPORT_SYMBOL(bgx_lmac_internal_loopback);
  572. static int bgx_lmac_sgmii_init(struct bgx *bgx, struct lmac *lmac)
  573. {
  574. int lmacid = lmac->lmacid;
  575. u64 cfg;
  576. bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_THRESH, 0x30);
  577. /* max packet size */
  578. bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_RXX_JABBER, MAX_FRAME_SIZE);
  579. /* Disable frame alignment if using preamble */
  580. cfg = bgx_reg_read(bgx, lmacid, BGX_GMP_GMI_TXX_APPEND);
  581. if (cfg & 1)
  582. bgx_reg_write(bgx, lmacid, BGX_GMP_GMI_TXX_SGMII_CTL, 0);
  583. /* Enable lmac */
  584. bgx_reg_modify(bgx, lmacid, BGX_CMRX_CFG, CMR_EN);
  585. /* PCS reset */
  586. bgx_reg_modify(bgx, lmacid, BGX_GMP_PCS_MRX_CTL, PCS_MRX_CTL_RESET);
  587. if (bgx_poll_reg(bgx, lmacid, BGX_GMP_PCS_MRX_CTL,
  588. PCS_MRX_CTL_RESET, true)) {
  589. dev_err(&bgx->pdev->dev, "BGX PCS reset not completed\n");
  590. return -1;
  591. }
  592. /* power down, reset autoneg, autoneg enable */
  593. cfg = bgx_reg_read(bgx, lmacid, BGX_GMP_PCS_MRX_CTL);
  594. cfg &= ~PCS_MRX_CTL_PWR_DN;
  595. cfg |= PCS_MRX_CTL_RST_AN;
  596. if (lmac->phydev) {
  597. cfg |= PCS_MRX_CTL_AN_EN;
  598. } else {
  599. /* In scenarios where PHY driver is not present or it's a
  600. * non-standard PHY, FW sets AN_EN to inform Linux driver
  601. * to do auto-neg and link polling or not.
  602. */
  603. if (cfg & PCS_MRX_CTL_AN_EN)
  604. lmac->autoneg = true;
  605. }
  606. bgx_reg_write(bgx, lmacid, BGX_GMP_PCS_MRX_CTL, cfg);
  607. if (lmac->lmac_type == BGX_MODE_QSGMII) {
  608. /* Disable disparity check for QSGMII */
  609. cfg = bgx_reg_read(bgx, lmacid, BGX_GMP_PCS_MISCX_CTL);
  610. cfg &= ~PCS_MISC_CTL_DISP_EN;
  611. bgx_reg_write(bgx, lmacid, BGX_GMP_PCS_MISCX_CTL, cfg);
  612. return 0;
  613. }
  614. if ((lmac->lmac_type == BGX_MODE_SGMII) && lmac->phydev) {
  615. if (bgx_poll_reg(bgx, lmacid, BGX_GMP_PCS_MRX_STATUS,
  616. PCS_MRX_STATUS_AN_CPT, false)) {
  617. dev_err(&bgx->pdev->dev, "BGX AN_CPT not completed\n");
  618. return -1;
  619. }
  620. }
  621. return 0;
  622. }
  623. static int bgx_lmac_xaui_init(struct bgx *bgx, struct lmac *lmac)
  624. {
  625. u64 cfg;
  626. int lmacid = lmac->lmacid;
  627. /* Reset SPU */
  628. bgx_reg_modify(bgx, lmacid, BGX_SPUX_CONTROL1, SPU_CTL_RESET);
  629. if (bgx_poll_reg(bgx, lmacid, BGX_SPUX_CONTROL1, SPU_CTL_RESET, true)) {
  630. dev_err(&bgx->pdev->dev, "BGX SPU reset not completed\n");
  631. return -1;
  632. }
  633. /* Disable LMAC */
  634. cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG);
  635. cfg &= ~CMR_EN;
  636. bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg);
  637. bgx_reg_modify(bgx, lmacid, BGX_SPUX_CONTROL1, SPU_CTL_LOW_POWER);
  638. /* Set interleaved running disparity for RXAUI */
  639. if (lmac->lmac_type == BGX_MODE_RXAUI)
  640. bgx_reg_modify(bgx, lmacid, BGX_SPUX_MISC_CONTROL,
  641. SPU_MISC_CTL_INTLV_RDISP);
  642. /* Clear receive packet disable */
  643. cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_MISC_CONTROL);
  644. cfg &= ~SPU_MISC_CTL_RX_DIS;
  645. bgx_reg_write(bgx, lmacid, BGX_SPUX_MISC_CONTROL, cfg);
  646. /* clear all interrupts */
  647. cfg = bgx_reg_read(bgx, lmacid, BGX_SMUX_RX_INT);
  648. bgx_reg_write(bgx, lmacid, BGX_SMUX_RX_INT, cfg);
  649. cfg = bgx_reg_read(bgx, lmacid, BGX_SMUX_TX_INT);
  650. bgx_reg_write(bgx, lmacid, BGX_SMUX_TX_INT, cfg);
  651. cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_INT);
  652. bgx_reg_write(bgx, lmacid, BGX_SPUX_INT, cfg);
  653. if (lmac->use_training) {
  654. bgx_reg_write(bgx, lmacid, BGX_SPUX_BR_PMD_LP_CUP, 0x00);
  655. bgx_reg_write(bgx, lmacid, BGX_SPUX_BR_PMD_LD_CUP, 0x00);
  656. bgx_reg_write(bgx, lmacid, BGX_SPUX_BR_PMD_LD_REP, 0x00);
  657. /* training enable */
  658. bgx_reg_modify(bgx, lmacid,
  659. BGX_SPUX_BR_PMD_CRTL, SPU_PMD_CRTL_TRAIN_EN);
  660. }
  661. /* Append FCS to each packet */
  662. bgx_reg_modify(bgx, lmacid, BGX_SMUX_TX_APPEND, SMU_TX_APPEND_FCS_D);
  663. /* Disable forward error correction */
  664. cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_FEC_CONTROL);
  665. cfg &= ~SPU_FEC_CTL_FEC_EN;
  666. bgx_reg_write(bgx, lmacid, BGX_SPUX_FEC_CONTROL, cfg);
  667. /* Disable autoneg */
  668. cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_AN_CONTROL);
  669. cfg = cfg & ~(SPU_AN_CTL_AN_EN | SPU_AN_CTL_XNP_EN);
  670. bgx_reg_write(bgx, lmacid, BGX_SPUX_AN_CONTROL, cfg);
  671. cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_AN_ADV);
  672. if (lmac->lmac_type == BGX_MODE_10G_KR)
  673. cfg |= (1 << 23);
  674. else if (lmac->lmac_type == BGX_MODE_40G_KR)
  675. cfg |= (1 << 24);
  676. else
  677. cfg &= ~((1 << 23) | (1 << 24));
  678. cfg = cfg & (~((1ULL << 25) | (1ULL << 22) | (1ULL << 12)));
  679. bgx_reg_write(bgx, lmacid, BGX_SPUX_AN_ADV, cfg);
  680. cfg = bgx_reg_read(bgx, 0, BGX_SPU_DBG_CONTROL);
  681. cfg &= ~SPU_DBG_CTL_AN_ARB_LINK_CHK_EN;
  682. bgx_reg_write(bgx, 0, BGX_SPU_DBG_CONTROL, cfg);
  683. /* Enable lmac */
  684. bgx_reg_modify(bgx, lmacid, BGX_CMRX_CFG, CMR_EN);
  685. cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_CONTROL1);
  686. cfg &= ~SPU_CTL_LOW_POWER;
  687. bgx_reg_write(bgx, lmacid, BGX_SPUX_CONTROL1, cfg);
  688. cfg = bgx_reg_read(bgx, lmacid, BGX_SMUX_TX_CTL);
  689. cfg &= ~SMU_TX_CTL_UNI_EN;
  690. cfg |= SMU_TX_CTL_DIC_EN;
  691. bgx_reg_write(bgx, lmacid, BGX_SMUX_TX_CTL, cfg);
  692. /* Enable receive and transmission of pause frames */
  693. bgx_reg_write(bgx, lmacid, BGX_SMUX_CBFC_CTL, ((0xffffULL << 32) |
  694. BCK_EN | DRP_EN | TX_EN | RX_EN));
  695. /* Configure pause time and interval */
  696. bgx_reg_write(bgx, lmacid,
  697. BGX_SMUX_TX_PAUSE_PKT_TIME, DEFAULT_PAUSE_TIME);
  698. cfg = bgx_reg_read(bgx, lmacid, BGX_SMUX_TX_PAUSE_PKT_INTERVAL);
  699. cfg &= ~0xFFFFull;
  700. bgx_reg_write(bgx, lmacid, BGX_SMUX_TX_PAUSE_PKT_INTERVAL,
  701. cfg | (DEFAULT_PAUSE_TIME - 0x1000));
  702. bgx_reg_write(bgx, lmacid, BGX_SMUX_TX_PAUSE_ZERO, 0x01);
  703. /* take lmac_count into account */
  704. bgx_reg_modify(bgx, lmacid, BGX_SMUX_TX_THRESH, (0x100 - 1));
  705. /* max packet size */
  706. bgx_reg_modify(bgx, lmacid, BGX_SMUX_RX_JABBER, MAX_FRAME_SIZE);
  707. return 0;
  708. }
  709. static int bgx_xaui_check_link(struct lmac *lmac)
  710. {
  711. struct bgx *bgx = lmac->bgx;
  712. int lmacid = lmac->lmacid;
  713. int lmac_type = lmac->lmac_type;
  714. u64 cfg;
  715. if (lmac->use_training) {
  716. cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_INT);
  717. if (!(cfg & (1ull << 13))) {
  718. cfg = (1ull << 13) | (1ull << 14);
  719. bgx_reg_write(bgx, lmacid, BGX_SPUX_INT, cfg);
  720. cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_BR_PMD_CRTL);
  721. cfg |= (1ull << 0);
  722. bgx_reg_write(bgx, lmacid, BGX_SPUX_BR_PMD_CRTL, cfg);
  723. return -1;
  724. }
  725. }
  726. /* wait for PCS to come out of reset */
  727. if (bgx_poll_reg(bgx, lmacid, BGX_SPUX_CONTROL1, SPU_CTL_RESET, true)) {
  728. dev_err(&bgx->pdev->dev, "BGX SPU reset not completed\n");
  729. return -1;
  730. }
  731. if ((lmac_type == BGX_MODE_10G_KR) || (lmac_type == BGX_MODE_XFI) ||
  732. (lmac_type == BGX_MODE_40G_KR) || (lmac_type == BGX_MODE_XLAUI)) {
  733. if (bgx_poll_reg(bgx, lmacid, BGX_SPUX_BR_STATUS1,
  734. SPU_BR_STATUS_BLK_LOCK, false)) {
  735. dev_err(&bgx->pdev->dev,
  736. "SPU_BR_STATUS_BLK_LOCK not completed\n");
  737. return -1;
  738. }
  739. } else {
  740. if (bgx_poll_reg(bgx, lmacid, BGX_SPUX_BX_STATUS,
  741. SPU_BX_STATUS_RX_ALIGN, false)) {
  742. dev_err(&bgx->pdev->dev,
  743. "SPU_BX_STATUS_RX_ALIGN not completed\n");
  744. return -1;
  745. }
  746. }
  747. /* Clear rcvflt bit (latching high) and read it back */
  748. if (bgx_reg_read(bgx, lmacid, BGX_SPUX_STATUS2) & SPU_STATUS2_RCVFLT)
  749. bgx_reg_modify(bgx, lmacid,
  750. BGX_SPUX_STATUS2, SPU_STATUS2_RCVFLT);
  751. if (bgx_reg_read(bgx, lmacid, BGX_SPUX_STATUS2) & SPU_STATUS2_RCVFLT) {
  752. dev_err(&bgx->pdev->dev, "Receive fault, retry training\n");
  753. if (lmac->use_training) {
  754. cfg = bgx_reg_read(bgx, lmacid, BGX_SPUX_INT);
  755. if (!(cfg & (1ull << 13))) {
  756. cfg = (1ull << 13) | (1ull << 14);
  757. bgx_reg_write(bgx, lmacid, BGX_SPUX_INT, cfg);
  758. cfg = bgx_reg_read(bgx, lmacid,
  759. BGX_SPUX_BR_PMD_CRTL);
  760. cfg |= (1ull << 0);
  761. bgx_reg_write(bgx, lmacid,
  762. BGX_SPUX_BR_PMD_CRTL, cfg);
  763. return -1;
  764. }
  765. }
  766. return -1;
  767. }
  768. /* Wait for BGX RX to be idle */
  769. if (bgx_poll_reg(bgx, lmacid, BGX_SMUX_CTL, SMU_CTL_RX_IDLE, false)) {
  770. dev_err(&bgx->pdev->dev, "SMU RX not idle\n");
  771. return -1;
  772. }
  773. /* Wait for BGX TX to be idle */
  774. if (bgx_poll_reg(bgx, lmacid, BGX_SMUX_CTL, SMU_CTL_TX_IDLE, false)) {
  775. dev_err(&bgx->pdev->dev, "SMU TX not idle\n");
  776. return -1;
  777. }
  778. /* Check for MAC RX faults */
  779. cfg = bgx_reg_read(bgx, lmacid, BGX_SMUX_RX_CTL);
  780. /* 0 - Link is okay, 1 - Local fault, 2 - Remote fault */
  781. cfg &= SMU_RX_CTL_STATUS;
  782. if (!cfg)
  783. return 0;
  784. /* Rx local/remote fault seen.
  785. * Do lmac reinit to see if condition recovers
  786. */
  787. bgx_lmac_xaui_init(bgx, lmac);
  788. return -1;
  789. }
  790. static void bgx_poll_for_sgmii_link(struct lmac *lmac)
  791. {
  792. u64 pcs_link, an_result;
  793. u8 speed;
  794. pcs_link = bgx_reg_read(lmac->bgx, lmac->lmacid,
  795. BGX_GMP_PCS_MRX_STATUS);
  796. /*Link state bit is sticky, read it again*/
  797. if (!(pcs_link & PCS_MRX_STATUS_LINK))
  798. pcs_link = bgx_reg_read(lmac->bgx, lmac->lmacid,
  799. BGX_GMP_PCS_MRX_STATUS);
  800. if (bgx_poll_reg(lmac->bgx, lmac->lmacid, BGX_GMP_PCS_MRX_STATUS,
  801. PCS_MRX_STATUS_AN_CPT, false)) {
  802. lmac->link_up = false;
  803. lmac->last_speed = SPEED_UNKNOWN;
  804. lmac->last_duplex = DUPLEX_UNKNOWN;
  805. goto next_poll;
  806. }
  807. lmac->link_up = ((pcs_link & PCS_MRX_STATUS_LINK) != 0) ? true : false;
  808. an_result = bgx_reg_read(lmac->bgx, lmac->lmacid,
  809. BGX_GMP_PCS_ANX_AN_RESULTS);
  810. speed = (an_result >> 3) & 0x3;
  811. lmac->last_duplex = (an_result >> 1) & 0x1;
  812. switch (speed) {
  813. case 0:
  814. lmac->last_speed = SPEED_10;
  815. break;
  816. case 1:
  817. lmac->last_speed = SPEED_100;
  818. break;
  819. case 2:
  820. lmac->last_speed = SPEED_1000;
  821. break;
  822. default:
  823. lmac->link_up = false;
  824. lmac->last_speed = SPEED_UNKNOWN;
  825. lmac->last_duplex = DUPLEX_UNKNOWN;
  826. break;
  827. }
  828. next_poll:
  829. if (lmac->last_link != lmac->link_up) {
  830. if (lmac->link_up)
  831. bgx_sgmii_change_link_state(lmac);
  832. lmac->last_link = lmac->link_up;
  833. }
  834. queue_delayed_work(lmac->check_link, &lmac->dwork, HZ * 3);
  835. }
  836. static void bgx_poll_for_link(struct work_struct *work)
  837. {
  838. struct lmac *lmac;
  839. u64 spu_link, smu_link;
  840. lmac = container_of(work, struct lmac, dwork.work);
  841. if (lmac->is_sgmii) {
  842. bgx_poll_for_sgmii_link(lmac);
  843. return;
  844. }
  845. /* Receive link is latching low. Force it high and verify it */
  846. bgx_reg_modify(lmac->bgx, lmac->lmacid,
  847. BGX_SPUX_STATUS1, SPU_STATUS1_RCV_LNK);
  848. bgx_poll_reg(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1,
  849. SPU_STATUS1_RCV_LNK, false);
  850. spu_link = bgx_reg_read(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1);
  851. smu_link = bgx_reg_read(lmac->bgx, lmac->lmacid, BGX_SMUX_RX_CTL);
  852. if ((spu_link & SPU_STATUS1_RCV_LNK) &&
  853. !(smu_link & SMU_RX_CTL_STATUS)) {
  854. lmac->link_up = true;
  855. if (lmac->lmac_type == BGX_MODE_XLAUI)
  856. lmac->last_speed = SPEED_40000;
  857. else
  858. lmac->last_speed = SPEED_10000;
  859. lmac->last_duplex = DUPLEX_FULL;
  860. } else {
  861. lmac->link_up = false;
  862. lmac->last_speed = SPEED_UNKNOWN;
  863. lmac->last_duplex = DUPLEX_UNKNOWN;
  864. }
  865. if (lmac->last_link != lmac->link_up) {
  866. if (lmac->link_up) {
  867. if (bgx_xaui_check_link(lmac)) {
  868. /* Errors, clear link_up state */
  869. lmac->link_up = false;
  870. lmac->last_speed = SPEED_UNKNOWN;
  871. lmac->last_duplex = DUPLEX_UNKNOWN;
  872. }
  873. }
  874. lmac->last_link = lmac->link_up;
  875. }
  876. queue_delayed_work(lmac->check_link, &lmac->dwork, HZ * 2);
  877. }
  878. static int phy_interface_mode(u8 lmac_type)
  879. {
  880. if (lmac_type == BGX_MODE_QSGMII)
  881. return PHY_INTERFACE_MODE_QSGMII;
  882. if (lmac_type == BGX_MODE_RGMII)
  883. return PHY_INTERFACE_MODE_RGMII_RXID;
  884. return PHY_INTERFACE_MODE_SGMII;
  885. }
  886. static int bgx_lmac_enable(struct bgx *bgx, u8 lmacid)
  887. {
  888. struct lmac *lmac;
  889. u64 cfg;
  890. lmac = &bgx->lmac[lmacid];
  891. lmac->bgx = bgx;
  892. if ((lmac->lmac_type == BGX_MODE_SGMII) ||
  893. (lmac->lmac_type == BGX_MODE_QSGMII) ||
  894. (lmac->lmac_type == BGX_MODE_RGMII)) {
  895. lmac->is_sgmii = true;
  896. if (bgx_lmac_sgmii_init(bgx, lmac))
  897. return -1;
  898. } else {
  899. lmac->is_sgmii = false;
  900. if (bgx_lmac_xaui_init(bgx, lmac))
  901. return -1;
  902. }
  903. if (lmac->is_sgmii) {
  904. cfg = bgx_reg_read(bgx, lmacid, BGX_GMP_GMI_TXX_APPEND);
  905. cfg |= ((1ull << 2) | (1ull << 1)); /* FCS and PAD */
  906. bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_APPEND, cfg);
  907. bgx_reg_write(bgx, lmacid, BGX_GMP_GMI_TXX_MIN_PKT, 60 - 1);
  908. } else {
  909. cfg = bgx_reg_read(bgx, lmacid, BGX_SMUX_TX_APPEND);
  910. cfg |= ((1ull << 2) | (1ull << 1)); /* FCS and PAD */
  911. bgx_reg_modify(bgx, lmacid, BGX_SMUX_TX_APPEND, cfg);
  912. bgx_reg_write(bgx, lmacid, BGX_SMUX_TX_MIN_PKT, 60 + 4);
  913. }
  914. /* actual number of filters available to exact LMAC */
  915. lmac->dmacs_count = (RX_DMAC_COUNT / bgx->lmac_count);
  916. lmac->dmacs = kcalloc(lmac->dmacs_count, sizeof(*lmac->dmacs),
  917. GFP_KERNEL);
  918. if (!lmac->dmacs)
  919. return -ENOMEM;
  920. /* Enable lmac */
  921. bgx_reg_modify(bgx, lmacid, BGX_CMRX_CFG, CMR_EN);
  922. /* Restore default cfg, incase low level firmware changed it */
  923. bgx_reg_write(bgx, lmacid, BGX_CMRX_RX_DMAC_CTL, 0x03);
  924. if ((lmac->lmac_type != BGX_MODE_XFI) &&
  925. (lmac->lmac_type != BGX_MODE_XLAUI) &&
  926. (lmac->lmac_type != BGX_MODE_40G_KR) &&
  927. (lmac->lmac_type != BGX_MODE_10G_KR)) {
  928. if (!lmac->phydev) {
  929. if (lmac->autoneg) {
  930. bgx_reg_write(bgx, lmacid,
  931. BGX_GMP_PCS_LINKX_TIMER,
  932. PCS_LINKX_TIMER_COUNT);
  933. goto poll;
  934. } else {
  935. /* Default to below link speed and duplex */
  936. lmac->link_up = true;
  937. lmac->last_speed = SPEED_1000;
  938. lmac->last_duplex = DUPLEX_FULL;
  939. bgx_sgmii_change_link_state(lmac);
  940. return 0;
  941. }
  942. }
  943. lmac->phydev->dev_flags = 0;
  944. if (phy_connect_direct(lmac->netdev, lmac->phydev,
  945. bgx_lmac_handler,
  946. phy_interface_mode(lmac->lmac_type)))
  947. return -ENODEV;
  948. phy_start(lmac->phydev);
  949. return 0;
  950. }
  951. poll:
  952. lmac->check_link = alloc_ordered_workqueue("check_link", WQ_MEM_RECLAIM);
  953. if (!lmac->check_link)
  954. return -ENOMEM;
  955. INIT_DELAYED_WORK(&lmac->dwork, bgx_poll_for_link);
  956. queue_delayed_work(lmac->check_link, &lmac->dwork, 0);
  957. return 0;
  958. }
  959. static void bgx_lmac_disable(struct bgx *bgx, u8 lmacid)
  960. {
  961. struct lmac *lmac;
  962. u64 cfg;
  963. lmac = &bgx->lmac[lmacid];
  964. if (lmac->check_link) {
  965. /* Destroy work queue */
  966. cancel_delayed_work_sync(&lmac->dwork);
  967. destroy_workqueue(lmac->check_link);
  968. }
  969. /* Disable packet reception */
  970. cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG);
  971. cfg &= ~CMR_PKT_RX_EN;
  972. bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg);
  973. /* Give chance for Rx/Tx FIFO to get drained */
  974. bgx_poll_reg(bgx, lmacid, BGX_CMRX_RX_FIFO_LEN, (u64)0x1FFF, true);
  975. bgx_poll_reg(bgx, lmacid, BGX_CMRX_TX_FIFO_LEN, (u64)0x3FFF, true);
  976. /* Disable packet transmission */
  977. cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG);
  978. cfg &= ~CMR_PKT_TX_EN;
  979. bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg);
  980. /* Disable serdes lanes */
  981. if (!lmac->is_sgmii)
  982. bgx_reg_modify(bgx, lmacid,
  983. BGX_SPUX_CONTROL1, SPU_CTL_LOW_POWER);
  984. else
  985. bgx_reg_modify(bgx, lmacid,
  986. BGX_GMP_PCS_MRX_CTL, PCS_MRX_CTL_PWR_DN);
  987. /* Disable LMAC */
  988. cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG);
  989. cfg &= ~CMR_EN;
  990. bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg);
  991. bgx_flush_dmac_cam_filter(bgx, lmacid);
  992. kfree(lmac->dmacs);
  993. if ((lmac->lmac_type != BGX_MODE_XFI) &&
  994. (lmac->lmac_type != BGX_MODE_XLAUI) &&
  995. (lmac->lmac_type != BGX_MODE_40G_KR) &&
  996. (lmac->lmac_type != BGX_MODE_10G_KR) && lmac->phydev)
  997. phy_disconnect(lmac->phydev);
  998. lmac->phydev = NULL;
  999. }
  1000. static void bgx_init_hw(struct bgx *bgx)
  1001. {
  1002. int i;
  1003. struct lmac *lmac;
  1004. bgx_reg_modify(bgx, 0, BGX_CMR_GLOBAL_CFG, CMR_GLOBAL_CFG_FCS_STRIP);
  1005. if (bgx_reg_read(bgx, 0, BGX_CMR_BIST_STATUS))
  1006. dev_err(&bgx->pdev->dev, "BGX%d BIST failed\n", bgx->bgx_id);
  1007. /* Set lmac type and lane2serdes mapping */
  1008. for (i = 0; i < bgx->lmac_count; i++) {
  1009. lmac = &bgx->lmac[i];
  1010. bgx_reg_write(bgx, i, BGX_CMRX_CFG,
  1011. (lmac->lmac_type << 8) | lmac->lane_to_sds);
  1012. bgx->lmac[i].lmacid_bd = lmac_count;
  1013. lmac_count++;
  1014. }
  1015. bgx_reg_write(bgx, 0, BGX_CMR_TX_LMACS, bgx->lmac_count);
  1016. bgx_reg_write(bgx, 0, BGX_CMR_RX_LMACS, bgx->lmac_count);
  1017. /* Set the backpressure AND mask */
  1018. for (i = 0; i < bgx->lmac_count; i++)
  1019. bgx_reg_modify(bgx, 0, BGX_CMR_CHAN_MSK_AND,
  1020. ((1ULL << MAX_BGX_CHANS_PER_LMAC) - 1) <<
  1021. (i * MAX_BGX_CHANS_PER_LMAC));
  1022. /* Disable all MAC filtering */
  1023. for (i = 0; i < RX_DMAC_COUNT; i++)
  1024. bgx_reg_write(bgx, 0, BGX_CMR_RX_DMACX_CAM + (i * 8), 0x00);
  1025. /* Disable MAC steering (NCSI traffic) */
  1026. for (i = 0; i < RX_TRAFFIC_STEER_RULE_COUNT; i++)
  1027. bgx_reg_write(bgx, 0, BGX_CMR_RX_STEERING + (i * 8), 0x00);
  1028. }
  1029. static u8 bgx_get_lane2sds_cfg(struct bgx *bgx, struct lmac *lmac)
  1030. {
  1031. return (u8)(bgx_reg_read(bgx, lmac->lmacid, BGX_CMRX_CFG) & 0xFF);
  1032. }
  1033. static void bgx_print_qlm_mode(struct bgx *bgx, u8 lmacid)
  1034. {
  1035. struct device *dev = &bgx->pdev->dev;
  1036. struct lmac *lmac;
  1037. char str[27];
  1038. if (!bgx->is_dlm && lmacid)
  1039. return;
  1040. lmac = &bgx->lmac[lmacid];
  1041. if (!bgx->is_dlm)
  1042. sprintf(str, "BGX%d QLM mode", bgx->bgx_id);
  1043. else
  1044. sprintf(str, "BGX%d LMAC%d mode", bgx->bgx_id, lmacid);
  1045. switch (lmac->lmac_type) {
  1046. case BGX_MODE_SGMII:
  1047. dev_info(dev, "%s: SGMII\n", (char *)str);
  1048. break;
  1049. case BGX_MODE_XAUI:
  1050. dev_info(dev, "%s: XAUI\n", (char *)str);
  1051. break;
  1052. case BGX_MODE_RXAUI:
  1053. dev_info(dev, "%s: RXAUI\n", (char *)str);
  1054. break;
  1055. case BGX_MODE_XFI:
  1056. if (!lmac->use_training)
  1057. dev_info(dev, "%s: XFI\n", (char *)str);
  1058. else
  1059. dev_info(dev, "%s: 10G_KR\n", (char *)str);
  1060. break;
  1061. case BGX_MODE_XLAUI:
  1062. if (!lmac->use_training)
  1063. dev_info(dev, "%s: XLAUI\n", (char *)str);
  1064. else
  1065. dev_info(dev, "%s: 40G_KR4\n", (char *)str);
  1066. break;
  1067. case BGX_MODE_QSGMII:
  1068. dev_info(dev, "%s: QSGMII\n", (char *)str);
  1069. break;
  1070. case BGX_MODE_RGMII:
  1071. dev_info(dev, "%s: RGMII\n", (char *)str);
  1072. break;
  1073. case BGX_MODE_INVALID:
  1074. /* Nothing to do */
  1075. break;
  1076. }
  1077. }
  1078. static void lmac_set_lane2sds(struct bgx *bgx, struct lmac *lmac)
  1079. {
  1080. switch (lmac->lmac_type) {
  1081. case BGX_MODE_SGMII:
  1082. case BGX_MODE_XFI:
  1083. lmac->lane_to_sds = lmac->lmacid;
  1084. break;
  1085. case BGX_MODE_XAUI:
  1086. case BGX_MODE_XLAUI:
  1087. case BGX_MODE_RGMII:
  1088. lmac->lane_to_sds = 0xE4;
  1089. break;
  1090. case BGX_MODE_RXAUI:
  1091. lmac->lane_to_sds = (lmac->lmacid) ? 0xE : 0x4;
  1092. break;
  1093. case BGX_MODE_QSGMII:
  1094. /* There is no way to determine if DLM0/2 is QSGMII or
  1095. * DLM1/3 is configured to QSGMII as bootloader will
  1096. * configure all LMACs, so take whatever is configured
  1097. * by low level firmware.
  1098. */
  1099. lmac->lane_to_sds = bgx_get_lane2sds_cfg(bgx, lmac);
  1100. break;
  1101. default:
  1102. lmac->lane_to_sds = 0;
  1103. break;
  1104. }
  1105. }
  1106. static void lmac_set_training(struct bgx *bgx, struct lmac *lmac, int lmacid)
  1107. {
  1108. if ((lmac->lmac_type != BGX_MODE_10G_KR) &&
  1109. (lmac->lmac_type != BGX_MODE_40G_KR)) {
  1110. lmac->use_training = false;
  1111. return;
  1112. }
  1113. lmac->use_training = bgx_reg_read(bgx, lmacid, BGX_SPUX_BR_PMD_CRTL) &
  1114. SPU_PMD_CRTL_TRAIN_EN;
  1115. }
  1116. static void bgx_set_lmac_config(struct bgx *bgx, u8 idx)
  1117. {
  1118. struct lmac *lmac;
  1119. u64 cmr_cfg;
  1120. u8 lmac_type;
  1121. u8 lane_to_sds;
  1122. lmac = &bgx->lmac[idx];
  1123. if (!bgx->is_dlm || bgx->is_rgx) {
  1124. /* Read LMAC0 type to figure out QLM mode
  1125. * This is configured by low level firmware
  1126. */
  1127. cmr_cfg = bgx_reg_read(bgx, 0, BGX_CMRX_CFG);
  1128. lmac->lmac_type = (cmr_cfg >> 8) & 0x07;
  1129. if (bgx->is_rgx)
  1130. lmac->lmac_type = BGX_MODE_RGMII;
  1131. lmac_set_training(bgx, lmac, 0);
  1132. lmac_set_lane2sds(bgx, lmac);
  1133. return;
  1134. }
  1135. /* For DLMs or SLMs on 80/81/83xx so many lane configurations
  1136. * are possible and vary across boards. Also Kernel doesn't have
  1137. * any way to identify board type/info and since firmware does,
  1138. * just take lmac type and serdes lane config as is.
  1139. */
  1140. cmr_cfg = bgx_reg_read(bgx, idx, BGX_CMRX_CFG);
  1141. lmac_type = (u8)((cmr_cfg >> 8) & 0x07);
  1142. lane_to_sds = (u8)(cmr_cfg & 0xFF);
  1143. /* Check if config is reset value */
  1144. if ((lmac_type == 0) && (lane_to_sds == 0xE4))
  1145. lmac->lmac_type = BGX_MODE_INVALID;
  1146. else
  1147. lmac->lmac_type = lmac_type;
  1148. lmac->lane_to_sds = lane_to_sds;
  1149. lmac_set_training(bgx, lmac, lmac->lmacid);
  1150. }
  1151. static void bgx_get_qlm_mode(struct bgx *bgx)
  1152. {
  1153. struct lmac *lmac;
  1154. u8 idx;
  1155. /* Init all LMAC's type to invalid */
  1156. for (idx = 0; idx < bgx->max_lmac; idx++) {
  1157. lmac = &bgx->lmac[idx];
  1158. lmac->lmacid = idx;
  1159. lmac->lmac_type = BGX_MODE_INVALID;
  1160. lmac->use_training = false;
  1161. }
  1162. /* It is assumed that low level firmware sets this value */
  1163. bgx->lmac_count = bgx_reg_read(bgx, 0, BGX_CMR_RX_LMACS) & 0x7;
  1164. if (bgx->lmac_count > bgx->max_lmac)
  1165. bgx->lmac_count = bgx->max_lmac;
  1166. for (idx = 0; idx < bgx->lmac_count; idx++) {
  1167. bgx_set_lmac_config(bgx, idx);
  1168. bgx_print_qlm_mode(bgx, idx);
  1169. }
  1170. }
  1171. #ifdef CONFIG_ACPI
  1172. static int acpi_get_mac_address(struct device *dev, struct acpi_device *adev,
  1173. u8 *dst)
  1174. {
  1175. u8 mac[ETH_ALEN];
  1176. int ret;
  1177. ret = fwnode_get_mac_address(acpi_fwnode_handle(adev), mac);
  1178. if (ret) {
  1179. dev_err(dev, "MAC address invalid: %pM\n", mac);
  1180. return -EINVAL;
  1181. }
  1182. dev_info(dev, "MAC address set to: %pM\n", mac);
  1183. ether_addr_copy(dst, mac);
  1184. return 0;
  1185. }
  1186. /* Currently only sets the MAC address. */
  1187. static acpi_status bgx_acpi_register_phy(acpi_handle handle,
  1188. u32 lvl, void *context, void **rv)
  1189. {
  1190. struct bgx *bgx = context;
  1191. struct device *dev = &bgx->pdev->dev;
  1192. struct acpi_device *adev;
  1193. adev = acpi_fetch_acpi_dev(handle);
  1194. if (!adev)
  1195. goto out;
  1196. acpi_get_mac_address(dev, adev, bgx->lmac[bgx->acpi_lmac_idx].mac);
  1197. SET_NETDEV_DEV(bgx->lmac[bgx->acpi_lmac_idx].netdev, dev);
  1198. bgx->lmac[bgx->acpi_lmac_idx].lmacid = bgx->acpi_lmac_idx;
  1199. bgx->acpi_lmac_idx++; /* move to next LMAC */
  1200. out:
  1201. return AE_OK;
  1202. }
  1203. static acpi_status bgx_acpi_match_id(acpi_handle handle, u32 lvl,
  1204. void *context, void **ret_val)
  1205. {
  1206. struct acpi_buffer string = { ACPI_ALLOCATE_BUFFER, NULL };
  1207. struct bgx *bgx = context;
  1208. char bgx_sel[7];
  1209. snprintf(bgx_sel, sizeof(bgx_sel), "BGX%d", bgx->bgx_id);
  1210. if (ACPI_FAILURE(acpi_get_name(handle, ACPI_SINGLE_NAME, &string))) {
  1211. pr_warn("Invalid link device\n");
  1212. return AE_OK;
  1213. }
  1214. if (strncmp(string.pointer, bgx_sel, 4)) {
  1215. kfree(string.pointer);
  1216. return AE_OK;
  1217. }
  1218. acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
  1219. bgx_acpi_register_phy, NULL, bgx, NULL);
  1220. kfree(string.pointer);
  1221. return AE_CTRL_TERMINATE;
  1222. }
  1223. static int bgx_init_acpi_phy(struct bgx *bgx)
  1224. {
  1225. acpi_get_devices(NULL, bgx_acpi_match_id, bgx, (void **)NULL);
  1226. return 0;
  1227. }
  1228. #else
  1229. static int bgx_init_acpi_phy(struct bgx *bgx)
  1230. {
  1231. return -ENODEV;
  1232. }
  1233. #endif /* CONFIG_ACPI */
  1234. #if IS_ENABLED(CONFIG_OF_MDIO)
  1235. static int bgx_init_of_phy(struct bgx *bgx)
  1236. {
  1237. struct fwnode_handle *fwn;
  1238. struct device_node *node = NULL;
  1239. u8 lmac = 0;
  1240. device_for_each_child_node(&bgx->pdev->dev, fwn) {
  1241. struct phy_device *pd;
  1242. struct device_node *phy_np;
  1243. /* Should always be an OF node. But if it is not, we
  1244. * cannot handle it, so exit the loop.
  1245. */
  1246. node = to_of_node(fwn);
  1247. if (!node)
  1248. break;
  1249. of_get_mac_address(node, bgx->lmac[lmac].mac);
  1250. SET_NETDEV_DEV(bgx->lmac[lmac].netdev, &bgx->pdev->dev);
  1251. bgx->lmac[lmac].lmacid = lmac;
  1252. phy_np = of_parse_phandle(node, "phy-handle", 0);
  1253. /* If there is no phy or defective firmware presents
  1254. * this cortina phy, for which there is no driver
  1255. * support, ignore it.
  1256. */
  1257. if (phy_np) {
  1258. if (!of_device_is_compatible(phy_np, "cortina,cs4223-slice")) {
  1259. /* Wait until the phy drivers are available */
  1260. pd = of_phy_find_device(phy_np);
  1261. if (!pd) {
  1262. of_node_put(phy_np);
  1263. goto defer;
  1264. }
  1265. bgx->lmac[lmac].phydev = pd;
  1266. }
  1267. of_node_put(phy_np);
  1268. }
  1269. lmac++;
  1270. if (lmac == bgx->max_lmac) {
  1271. of_node_put(node);
  1272. break;
  1273. }
  1274. }
  1275. return 0;
  1276. defer:
  1277. /* We are bailing out, try not to leak device reference counts
  1278. * for phy devices we may have already found.
  1279. */
  1280. while (lmac) {
  1281. lmac--;
  1282. if (bgx->lmac[lmac].phydev) {
  1283. put_device(&bgx->lmac[lmac].phydev->mdio.dev);
  1284. bgx->lmac[lmac].phydev = NULL;
  1285. }
  1286. }
  1287. of_node_put(node);
  1288. return -EPROBE_DEFER;
  1289. }
  1290. #else
  1291. static int bgx_init_of_phy(struct bgx *bgx)
  1292. {
  1293. return -ENODEV;
  1294. }
  1295. #endif /* CONFIG_OF_MDIO */
  1296. static int bgx_init_phy(struct bgx *bgx)
  1297. {
  1298. if (!acpi_disabled)
  1299. return bgx_init_acpi_phy(bgx);
  1300. return bgx_init_of_phy(bgx);
  1301. }
  1302. static irqreturn_t bgx_intr_handler(int irq, void *data)
  1303. {
  1304. struct bgx *bgx = (struct bgx *)data;
  1305. u64 status, val;
  1306. int lmac;
  1307. for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
  1308. status = bgx_reg_read(bgx, lmac, BGX_GMP_GMI_TXX_INT);
  1309. if (status & GMI_TXX_INT_UNDFLW) {
  1310. pci_err(bgx->pdev, "BGX%d lmac%d UNDFLW\n",
  1311. bgx->bgx_id, lmac);
  1312. val = bgx_reg_read(bgx, lmac, BGX_CMRX_CFG);
  1313. val &= ~CMR_EN;
  1314. bgx_reg_write(bgx, lmac, BGX_CMRX_CFG, val);
  1315. val |= CMR_EN;
  1316. bgx_reg_write(bgx, lmac, BGX_CMRX_CFG, val);
  1317. }
  1318. /* clear interrupts */
  1319. bgx_reg_write(bgx, lmac, BGX_GMP_GMI_TXX_INT, status);
  1320. }
  1321. return IRQ_HANDLED;
  1322. }
  1323. static void bgx_register_intr(struct pci_dev *pdev)
  1324. {
  1325. struct bgx *bgx = pci_get_drvdata(pdev);
  1326. int ret;
  1327. ret = pci_alloc_irq_vectors(pdev, BGX_LMAC_VEC_OFFSET,
  1328. BGX_LMAC_VEC_OFFSET, PCI_IRQ_ALL_TYPES);
  1329. if (ret < 0) {
  1330. pci_err(pdev, "Req for #%d msix vectors failed\n",
  1331. BGX_LMAC_VEC_OFFSET);
  1332. return;
  1333. }
  1334. ret = pci_request_irq(pdev, GMPX_GMI_TX_INT, bgx_intr_handler, NULL,
  1335. bgx, "BGX%d", bgx->bgx_id);
  1336. if (ret)
  1337. pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx);
  1338. }
  1339. static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  1340. {
  1341. int err;
  1342. struct device *dev = &pdev->dev;
  1343. struct bgx *bgx = NULL;
  1344. u8 lmac;
  1345. u16 sdevid;
  1346. bgx = devm_kzalloc(dev, sizeof(*bgx), GFP_KERNEL);
  1347. if (!bgx)
  1348. return -ENOMEM;
  1349. bgx->pdev = pdev;
  1350. pci_set_drvdata(pdev, bgx);
  1351. err = pcim_enable_device(pdev);
  1352. if (err) {
  1353. pci_set_drvdata(pdev, NULL);
  1354. return dev_err_probe(dev, err, "Failed to enable PCI device\n");
  1355. }
  1356. err = pci_request_regions(pdev, DRV_NAME);
  1357. if (err) {
  1358. dev_err(dev, "PCI request regions failed 0x%x\n", err);
  1359. goto err_disable_device;
  1360. }
  1361. /* MAP configuration registers */
  1362. bgx->reg_base = pcim_iomap(pdev, PCI_CFG_REG_BAR_NUM, 0);
  1363. if (!bgx->reg_base) {
  1364. dev_err(dev, "BGX: Cannot map CSR memory space, aborting\n");
  1365. err = -ENOMEM;
  1366. goto err_release_regions;
  1367. }
  1368. set_max_bgx_per_node(pdev);
  1369. pci_read_config_word(pdev, PCI_DEVICE_ID, &sdevid);
  1370. if (sdevid != PCI_DEVICE_ID_THUNDER_RGX) {
  1371. bgx->bgx_id = (pci_resource_start(pdev,
  1372. PCI_CFG_REG_BAR_NUM) >> 24) & BGX_ID_MASK;
  1373. bgx->bgx_id += nic_get_node_id(pdev) * max_bgx_per_node;
  1374. bgx->max_lmac = MAX_LMAC_PER_BGX;
  1375. bgx_vnic[bgx->bgx_id] = bgx;
  1376. } else {
  1377. bgx->is_rgx = true;
  1378. bgx->max_lmac = 1;
  1379. bgx->bgx_id = MAX_BGX_PER_CN81XX - 1;
  1380. bgx_vnic[bgx->bgx_id] = bgx;
  1381. xcv_init_hw();
  1382. }
  1383. /* On 81xx all are DLMs and on 83xx there are 3 BGX QLMs and one
  1384. * BGX i.e BGX2 can be split across 2 DLMs.
  1385. */
  1386. pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &sdevid);
  1387. if ((sdevid == PCI_SUBSYS_DEVID_81XX_BGX) ||
  1388. ((sdevid == PCI_SUBSYS_DEVID_83XX_BGX) && (bgx->bgx_id == 2)))
  1389. bgx->is_dlm = true;
  1390. bgx_get_qlm_mode(bgx);
  1391. for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
  1392. struct lmac *lmacp, **priv;
  1393. lmacp = &bgx->lmac[lmac];
  1394. lmacp->netdev = alloc_netdev_dummy(sizeof(struct lmac *));
  1395. if (!lmacp->netdev) {
  1396. for (int i = 0; i < lmac; i++)
  1397. free_netdev(bgx->lmac[i].netdev);
  1398. err = -ENOMEM;
  1399. goto err_enable;
  1400. }
  1401. priv = netdev_priv(lmacp->netdev);
  1402. *priv = lmacp;
  1403. }
  1404. err = bgx_init_phy(bgx);
  1405. if (err)
  1406. goto err_enable;
  1407. bgx_init_hw(bgx);
  1408. bgx_register_intr(pdev);
  1409. /* Enable all LMACs */
  1410. for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
  1411. err = bgx_lmac_enable(bgx, lmac);
  1412. if (err) {
  1413. dev_err(dev, "BGX%d failed to enable lmac%d\n",
  1414. bgx->bgx_id, lmac);
  1415. while (lmac)
  1416. bgx_lmac_disable(bgx, --lmac);
  1417. goto err_enable;
  1418. }
  1419. }
  1420. return 0;
  1421. err_enable:
  1422. bgx_vnic[bgx->bgx_id] = NULL;
  1423. pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx);
  1424. err_release_regions:
  1425. pci_release_regions(pdev);
  1426. err_disable_device:
  1427. pci_disable_device(pdev);
  1428. pci_set_drvdata(pdev, NULL);
  1429. return err;
  1430. }
  1431. static void bgx_remove(struct pci_dev *pdev)
  1432. {
  1433. struct bgx *bgx = pci_get_drvdata(pdev);
  1434. u8 lmac;
  1435. /* Disable all LMACs */
  1436. for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
  1437. bgx_lmac_disable(bgx, lmac);
  1438. free_netdev(bgx->lmac[lmac].netdev);
  1439. }
  1440. pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx);
  1441. bgx_vnic[bgx->bgx_id] = NULL;
  1442. pci_release_regions(pdev);
  1443. pci_disable_device(pdev);
  1444. pci_set_drvdata(pdev, NULL);
  1445. }
  1446. static struct pci_driver bgx_driver = {
  1447. .name = DRV_NAME,
  1448. .id_table = bgx_id_table,
  1449. .probe = bgx_probe,
  1450. .remove = bgx_remove,
  1451. };
  1452. static int __init bgx_init_module(void)
  1453. {
  1454. pr_info("%s, ver %s\n", DRV_NAME, DRV_VERSION);
  1455. return pci_register_driver(&bgx_driver);
  1456. }
  1457. static void __exit bgx_cleanup_module(void)
  1458. {
  1459. pci_unregister_driver(&bgx_driver);
  1460. }
  1461. module_init(bgx_init_module);
  1462. module_exit(bgx_cleanup_module);