Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 21148
b: refs/heads/master
c: c28a4f8
h: refs/heads/master
v: v3
  • Loading branch information
James Chapman authored and Jeff Garzik committed Jan 27, 2006
1 parent 8e8b8b5 commit 0ff0b1b
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 24 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9f8dd319459bb5ab9efcc1c345bed7895cc41768
refs/heads/master: c28a4f8947f1b08996502967e348dc88363749a7
64 changes: 41 additions & 23 deletions trunk/drivers/net/mv643xx_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@
#define PHY_WAIT_MICRO_SECONDS 10

/* Static function declarations */
static int eth_port_link_is_up(unsigned int eth_port_num);
static void eth_port_uc_addr_get(struct net_device *dev,
unsigned char *MacAddr);
static void eth_port_set_multicast_list(struct net_device *);
Expand All @@ -97,8 +96,11 @@ static void eth_port_init_mac_tables(unsigned int eth_port_num);
#ifdef MV643XX_NAPI
static int mv643xx_poll(struct net_device *dev, int *budget);
#endif
static int ethernet_phy_get(unsigned int eth_port_num);
static void ethernet_phy_set(unsigned int eth_port_num, int phy_addr);
static int ethernet_phy_detect(unsigned int eth_port_num);
static int mv643xx_mdio_read(struct net_device *dev, int phy_id, int location);
static void mv643xx_mdio_write(struct net_device *dev, int phy_id, int location, int val);
static struct ethtool_ops mv643xx_ethtool_ops;

static char mv643xx_driver_name[] = "mv643xx_eth";
Expand Down Expand Up @@ -537,14 +539,17 @@ static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id,
}
/* PHY status changed */
if (eth_int_cause_ext & (BIT16 | BIT20)) {
if (eth_port_link_is_up(port_num)) {
netif_carrier_on(dev);
netif_wake_queue(dev);
/* Start TX queue */
mv643xx_eth_port_enable_tx(port_num, mp->port_tx_queue_command);
} else {
netif_carrier_off(dev);
if (mii_link_ok(&mp->mii)) {
if (!netif_carrier_ok(dev)) {
netif_carrier_on(dev);
netif_wake_queue(dev);
/* Start TX queue */
mv643xx_eth_port_enable_tx(port_num,
mp->port_tx_queue_command);
}
} else if (netif_carrier_ok(dev)) {
netif_stop_queue(dev);
netif_carrier_off(dev);
}
}

Expand Down Expand Up @@ -1434,6 +1439,14 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
}
}

/* Hook up MII support for ethtool */
mp->mii.dev = dev;
mp->mii.mdio_read = mv643xx_mdio_read;
mp->mii.mdio_write = mv643xx_mdio_write;
mp->mii.phy_id = ethernet_phy_get(port_num);
mp->mii.phy_id_mask = 0x3f;
mp->mii.reg_num_mask = 0x1f;

err = ethernet_phy_detect(port_num);
if (err) {
pr_debug("MV643xx ethernet port %d: "
Expand All @@ -1442,6 +1455,8 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
return err;
}

mp->mii.supports_gmii = mii_check_gmii_support(&mp->mii);

err = register_netdev(dev);
if (err)
goto out;
Expand Down Expand Up @@ -2416,21 +2431,6 @@ static int eth_port_autoneg_supported(unsigned int eth_port_num)
return phy_reg_data0 & 0x1000;
}

static int eth_port_link_is_up(unsigned int eth_port_num)
{
unsigned int phy_reg_data1;

eth_port_read_smi_reg(eth_port_num, 1, &phy_reg_data1);

if (eth_port_autoneg_supported(eth_port_num)) {
if (phy_reg_data1 & 0x20) /* auto-neg complete */
return 1;
} else if (phy_reg_data1 & 0x4) /* link up */
return 1;

return 0;
}

/*
* eth_port_read_smi_reg - Read PHY registers
*
Expand Down Expand Up @@ -2535,6 +2535,24 @@ static void eth_port_write_smi_reg(unsigned int eth_port_num,
spin_unlock_irqrestore(&mv643xx_eth_phy_lock, flags);
}

/*
* Wrappers for MII support library.
*/
static int mv643xx_mdio_read(struct net_device *dev, int phy_id, int location)
{
int val;
struct mv643xx_private *mp = netdev_priv(dev);

eth_port_read_smi_reg(mp->port_num, location, &val);
return val;
}

static void mv643xx_mdio_write(struct net_device *dev, int phy_id, int location, int val)
{
struct mv643xx_private *mp = netdev_priv(dev);
eth_port_write_smi_reg(mp->port_num, location, val);
}

/*
* eth_port_send - Send an Ethernet packet
*
Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/net/mv643xx_eth.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/workqueue.h>
#include <linux/mii.h>

#include <linux/mv643xx.h>

Expand Down Expand Up @@ -393,6 +394,7 @@ struct mv643xx_private {

u32 rx_int_coal;
u32 tx_int_coal;
struct mii_if_info mii;
};

/* ethernet.h API list */
Expand Down

0 comments on commit 0ff0b1b

Please sign in to comment.