18199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter/***************************************************************************** 28199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 38199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * File: mv88x201x.c * 4559fb51ba7e66fe298b8355fabde1275b7def35fScott Bardone * $Revision: 1.12 $ * 5559fb51ba7e66fe298b8355fabde1275b7def35fScott Bardone * $Date: 2005/04/15 19:27:14 $ * 68199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Description: * 78199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Marvell PHY (mv88x201x) functionality. * 88199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * part of the Chelsio 10Gb Ethernet Driver. * 98199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 108199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * This program is free software; you can redistribute it and/or modify * 118199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * it under the terms of the GNU General Public License, version 2, as * 128199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * published by the Free Software Foundation. * 138199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 148199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * You should have received a copy of the GNU General Public License along * 150ab75ae81da249988bf3c7a38e0a48d4b9be1e0cJeff Kirsher * with this program; if not, see <http://www.gnu.org/licenses/>. * 168199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 178199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * 188199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * 198199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * 208199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 218199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * http://www.chelsio.com * 228199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 238199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Copyright (c) 2003 - 2005 Chelsio Communications, Inc. * 248199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * All rights reserved. * 258199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 268199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Maintainers: maintainers@chelsio.com * 278199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 288199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Authors: Dimitrios Michailidis <dm@chelsio.com> * 298199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Tina Yang <tainay@chelsio.com> * 308199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Felix Marti <felix@chelsio.com> * 318199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Scott Bardone <sbardone@chelsio.com> * 328199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Kurt Ottaway <kottaway@chelsio.com> * 338199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Frank DiMambro <frank@chelsio.com> * 348199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 358199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * History: * 368199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * * 378199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter ****************************************************************************/ 388199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 398199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter#include "cphy.h" 408199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter#include "elmer0.h" 418199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 428199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter/* 438199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * The 88x2010 Rev C. requires some link status registers * to be read 448199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * twice in order to get the right values. Future * revisions will fix 458199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * this problem and then this macro * can disappear. 468199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter */ 478199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter#define MV88x2010_LINK_STATUS_BUGS 1 488199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 498199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int led_init(struct cphy *cphy) 508199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 518199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Setup the LED registers so we can turn on/off. 528199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * Writing these bits maps control to another 538199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * register. mmd(0x1) addr(0x7) 548199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter */ 5523c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_write(cphy, MDIO_MMD_PCS, 0x8304, 0xdddd); 568199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return 0; 578199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 588199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 598199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int led_link(struct cphy *cphy, u32 do_enable) 608199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 618199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter u32 led = 0; 628199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter#define LINK_ENABLE_BIT 0x1 638199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 6423c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_CTRL2, &led); 658199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 668199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter if (do_enable & LINK_ENABLE_BIT) { 678199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter led |= LINK_ENABLE_BIT; 6823c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_write(cphy, MDIO_MMD_PMAPMD, MDIO_CTRL2, led); 698199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter } else { 708199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter led &= ~LINK_ENABLE_BIT; 7123c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_write(cphy, MDIO_MMD_PMAPMD, MDIO_CTRL2, led); 728199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter } 738199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return 0; 748199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 758199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 768199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter/* Port Reset */ 778199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int mv88x201x_reset(struct cphy *cphy, int wait) 788199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 798199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* This can be done through registers. It is not required since 808199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * a full chip reset is used. 818199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter */ 828199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return 0; 838199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 848199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 858199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int mv88x201x_interrupt_enable(struct cphy *cphy) 868199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 878199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Enable PHY LASI interrupts. */ 88aa22437e87469fdee94b5344780b4a3dbb87a154Ben Hutchings cphy_mdio_write(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_CTRL, 89aa22437e87469fdee94b5344780b4a3dbb87a154Ben Hutchings MDIO_PMA_LASI_LSALARM); 908199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 918199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Enable Marvell interrupts through Elmer0. */ 92f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger if (t1_is_asic(cphy->adapter)) { 93f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger u32 elmer; 94f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger 95f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger t1_tpi_read(cphy->adapter, A_ELMER0_INT_ENABLE, &elmer); 96f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger elmer |= ELMER0_GP_BIT6; 97f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger t1_tpi_write(cphy->adapter, A_ELMER0_INT_ENABLE, elmer); 98f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger } 998199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return 0; 1008199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 1018199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1028199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int mv88x201x_interrupt_disable(struct cphy *cphy) 1038199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 1048199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Disable PHY LASI interrupts. */ 105aa22437e87469fdee94b5344780b4a3dbb87a154Ben Hutchings cphy_mdio_write(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_CTRL, 0x0); 1068199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1078199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Disable Marvell interrupts through Elmer0. */ 108f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger if (t1_is_asic(cphy->adapter)) { 109f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger u32 elmer; 110f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger 111f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger t1_tpi_read(cphy->adapter, A_ELMER0_INT_ENABLE, &elmer); 112f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger elmer &= ~ELMER0_GP_BIT6; 113f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger t1_tpi_write(cphy->adapter, A_ELMER0_INT_ENABLE, elmer); 114f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger } 1158199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return 0; 1168199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 1178199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1188199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int mv88x201x_interrupt_clear(struct cphy *cphy) 1198199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 1208199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter u32 elmer; 1218199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter u32 val; 1228199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1238199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter#ifdef MV88x2010_LINK_STATUS_BUGS 1248199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Required to read twice before clear takes affect. */ 125aa22437e87469fdee94b5344780b4a3dbb87a154Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_RXSTAT, &val); 126aa22437e87469fdee94b5344780b4a3dbb87a154Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_TXSTAT, &val); 127aa22437e87469fdee94b5344780b4a3dbb87a154Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_STAT, &val); 1288199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1298199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Read this register after the others above it else 1308199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * the register doesn't clear correctly. 1318199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter */ 13223c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_STAT1, &val); 1338199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter#endif 1348199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1358199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Clear link status. */ 13623c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_STAT1, &val); 1378199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Clear PHY LASI interrupts. */ 138aa22437e87469fdee94b5344780b4a3dbb87a154Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_STAT, &val); 1398199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1408199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter#ifdef MV88x2010_LINK_STATUS_BUGS 1418199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Do it again. */ 142aa22437e87469fdee94b5344780b4a3dbb87a154Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_RXSTAT, &val); 143aa22437e87469fdee94b5344780b4a3dbb87a154Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_PMA_LASI_TXSTAT, &val); 1448199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter#endif 1458199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1468199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Clear Marvell interrupts through Elmer0. */ 147f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger if (t1_is_asic(cphy->adapter)) { 148f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger t1_tpi_read(cphy->adapter, A_ELMER0_INT_CAUSE, &elmer); 149f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger elmer |= ELMER0_GP_BIT6; 150f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger t1_tpi_write(cphy->adapter, A_ELMER0_INT_CAUSE, elmer); 151f1d3d38af75789f1b82969b83b69cab540609789Stephen Hemminger } 1528199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return 0; 1538199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 1548199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1558199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int mv88x201x_interrupt_handler(struct cphy *cphy) 1568199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 1578199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Clear interrupts */ 1588199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter mv88x201x_interrupt_clear(cphy); 1598199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1608199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* We have only enabled link change interrupts and so 1618199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter * cphy_cause must be a link change interrupt. 1628199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter */ 1638199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return cphy_cause_link_change; 1648199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 1658199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1668199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int mv88x201x_set_loopback(struct cphy *cphy, int on) 1678199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 1688199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return 0; 1698199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 1708199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1718199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int mv88x201x_get_link_status(struct cphy *cphy, int *link_ok, 1728199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter int *speed, int *duplex, int *fc) 1738199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 1748199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter u32 val = 0; 1758199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1768199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter if (link_ok) { 1778199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Read link status. */ 17823c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_STAT1, &val); 17923c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings val &= MDIO_STAT1_LSTATUS; 18023c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings *link_ok = (val == MDIO_STAT1_LSTATUS); 1818199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Turn on/off Link LED */ 1828199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter led_link(cphy, *link_ok); 1838199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter } 1848199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter if (speed) 1858199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter *speed = SPEED_10000; 1868199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter if (duplex) 1878199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter *duplex = DUPLEX_FULL; 1888199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter if (fc) 1898199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter *fc = PAUSE_RX | PAUSE_TX; 1908199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return 0; 1918199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 1928199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1938199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic void mv88x201x_destroy(struct cphy *cphy) 1948199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 1958199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter kfree(cphy); 1968199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 1978199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 1988199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic struct cphy_ops mv88x201x_ops = { 1998199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter .destroy = mv88x201x_destroy, 2008199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter .reset = mv88x201x_reset, 2018199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter .interrupt_enable = mv88x201x_interrupt_enable, 2028199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter .interrupt_disable = mv88x201x_interrupt_disable, 2038199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter .interrupt_clear = mv88x201x_interrupt_clear, 2048199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter .interrupt_handler = mv88x201x_interrupt_handler, 2058199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter .get_link_status = mv88x201x_get_link_status, 2068199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter .set_loopback = mv88x201x_set_loopback, 20723c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings .mmds = (MDIO_DEVS_PMAPMD | MDIO_DEVS_PCS | 20823c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings MDIO_DEVS_PHYXS | MDIO_DEVS_WIS), 2098199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter}; 2108199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 211703cebabd173a7fe533d6f21df0347b1f2a9a1e1Divy Le Raystatic struct cphy *mv88x201x_phy_create(struct net_device *dev, int phy_addr, 212459e536b1ddfd217ec8a3437a3214968a98223c7Stephen Hemminger const struct mdio_ops *mdio_ops) 2138199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 2148199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter u32 val; 2151270266cf94c0de5bd1121f15aff9af8556dee84Stephen Hemminger struct cphy *cphy = kzalloc(sizeof(*cphy), GFP_KERNEL); 2168199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 2178199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter if (!cphy) 2188199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return NULL; 2191270266cf94c0de5bd1121f15aff9af8556dee84Stephen Hemminger 220703cebabd173a7fe533d6f21df0347b1f2a9a1e1Divy Le Ray cphy_init(cphy, dev, phy_addr, &mv88x201x_ops, mdio_ops); 2218199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 2228199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Commands the PHY to enable XFP's clock. */ 22323c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PCS, 0x8300, &val); 22423c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_write(cphy, MDIO_MMD_PCS, 0x8300, val | 1); 2258199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 2268199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Clear link status. Required because of a bug in the PHY. */ 22723c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PMAPMD, MDIO_STAT2, &val); 22823c3320cb039debfb94b27e8e9bfe26dd47692c3Ben Hutchings cphy_mdio_read(cphy, MDIO_MMD_PCS, MDIO_STAT2, &val); 2298199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 2308199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Allows for Link,Ack LED turn on/off */ 2318199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter led_init(cphy); 2328199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return cphy; 2338199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 2348199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 2358199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter/* Chip Reset */ 2368199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameterstatic int mv88x201x_phy_reset(adapter_t *adapter) 2378199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter{ 2388199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter u32 val; 2398199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 2408199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter t1_tpi_read(adapter, A_ELMER0_GPO, &val); 2418199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter val &= ~4; 2428199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter t1_tpi_write(adapter, A_ELMER0_GPO, val); 2438199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter msleep(100); 2448199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 2458199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter t1_tpi_write(adapter, A_ELMER0_GPO, val | 4); 2468199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter msleep(1000); 2478199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 2488199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter /* Now lets enable the Laser. Delay 100us */ 2498199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter t1_tpi_read(adapter, A_ELMER0_GPO, &val); 2508199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter val |= 0x8000; 2518199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter t1_tpi_write(adapter, A_ELMER0_GPO, val); 2528199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter udelay(100); 2538199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter return 0; 2548199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter} 2558199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter 256459e536b1ddfd217ec8a3437a3214968a98223c7Stephen Hemmingerconst struct gphy t1_mv88x201x_ops = { 257459e536b1ddfd217ec8a3437a3214968a98223c7Stephen Hemminger .create = mv88x201x_phy_create, 258459e536b1ddfd217ec8a3437a3214968a98223c7Stephen Hemminger .reset = mv88x201x_phy_reset 2598199d3a79c224bbe5943fa08684e1f93a17881b0Christoph Lameter}; 260