mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus: Staging: octeon-ethernet: Assign proper MAC addresses. Staging: Octeon: Use symbolic values for irq numbers. MIPS: Octeon: Fix compile error in drivers/staging/octeon/ethernet-mdio.c
This commit is contained in:
commit
50b767d0ba
3 changed files with 43 additions and 14 deletions
|
@ -170,7 +170,7 @@ static u32 cvm_oct_get_link(struct net_device *dev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct const ethtool_ops cvm_oct_ethtool_ops = {
|
const struct ethtool_ops cvm_oct_ethtool_ops = {
|
||||||
.get_drvinfo = cvm_oct_get_drvinfo,
|
.get_drvinfo = cvm_oct_get_drvinfo,
|
||||||
.get_settings = cvm_oct_get_settings,
|
.get_settings = cvm_oct_get_settings,
|
||||||
.set_settings = cvm_oct_set_settings,
|
.set_settings = cvm_oct_set_settings,
|
||||||
|
|
|
@ -317,6 +317,6 @@ void cvm_oct_spi_uninit(struct net_device *dev)
|
||||||
cvmx_write_csr(CVMX_SPXX_INT_MSK(interface), 0);
|
cvmx_write_csr(CVMX_SPXX_INT_MSK(interface), 0);
|
||||||
cvmx_write_csr(CVMX_STXX_INT_MSK(interface), 0);
|
cvmx_write_csr(CVMX_STXX_INT_MSK(interface), 0);
|
||||||
}
|
}
|
||||||
free_irq(8 + 46, &number_spi_ports);
|
free_irq(OCTEON_IRQ_RML, &number_spi_ports);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,6 +111,16 @@ MODULE_PARM_DESC(disable_core_queueing, "\n"
|
||||||
"\tallows packets to be sent without lock contention in the packet\n"
|
"\tallows packets to be sent without lock contention in the packet\n"
|
||||||
"\tscheduler resulting in some cases in improved throughput.\n");
|
"\tscheduler resulting in some cases in improved throughput.\n");
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The offset from mac_addr_base that should be used for the next port
|
||||||
|
* that is configured. By convention, if any mgmt ports exist on the
|
||||||
|
* chip, they get the first mac addresses, The ports controlled by
|
||||||
|
* this driver are numbered sequencially following any mgmt addresses
|
||||||
|
* that may exist.
|
||||||
|
*/
|
||||||
|
static unsigned int cvm_oct_mac_addr_offset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Periodic timer to check auto negotiation
|
* Periodic timer to check auto negotiation
|
||||||
*/
|
*/
|
||||||
|
@ -474,16 +484,30 @@ static int cvm_oct_common_set_mac_address(struct net_device *dev, void *addr)
|
||||||
*/
|
*/
|
||||||
int cvm_oct_common_init(struct net_device *dev)
|
int cvm_oct_common_init(struct net_device *dev)
|
||||||
{
|
{
|
||||||
static int count;
|
|
||||||
char mac[8] = { 0x00, 0x00,
|
|
||||||
octeon_bootinfo->mac_addr_base[0],
|
|
||||||
octeon_bootinfo->mac_addr_base[1],
|
|
||||||
octeon_bootinfo->mac_addr_base[2],
|
|
||||||
octeon_bootinfo->mac_addr_base[3],
|
|
||||||
octeon_bootinfo->mac_addr_base[4],
|
|
||||||
octeon_bootinfo->mac_addr_base[5] + count
|
|
||||||
};
|
|
||||||
struct octeon_ethernet *priv = netdev_priv(dev);
|
struct octeon_ethernet *priv = netdev_priv(dev);
|
||||||
|
struct sockaddr sa;
|
||||||
|
u64 mac = ((u64)(octeon_bootinfo->mac_addr_base[0] & 0xff) << 40) |
|
||||||
|
((u64)(octeon_bootinfo->mac_addr_base[1] & 0xff) << 32) |
|
||||||
|
((u64)(octeon_bootinfo->mac_addr_base[2] & 0xff) << 24) |
|
||||||
|
((u64)(octeon_bootinfo->mac_addr_base[3] & 0xff) << 16) |
|
||||||
|
((u64)(octeon_bootinfo->mac_addr_base[4] & 0xff) << 8) |
|
||||||
|
(u64)(octeon_bootinfo->mac_addr_base[5] & 0xff);
|
||||||
|
|
||||||
|
mac += cvm_oct_mac_addr_offset;
|
||||||
|
sa.sa_data[0] = (mac >> 40) & 0xff;
|
||||||
|
sa.sa_data[1] = (mac >> 32) & 0xff;
|
||||||
|
sa.sa_data[2] = (mac >> 24) & 0xff;
|
||||||
|
sa.sa_data[3] = (mac >> 16) & 0xff;
|
||||||
|
sa.sa_data[4] = (mac >> 8) & 0xff;
|
||||||
|
sa.sa_data[5] = mac & 0xff;
|
||||||
|
|
||||||
|
if (cvm_oct_mac_addr_offset >= octeon_bootinfo->mac_addr_count)
|
||||||
|
printk(KERN_DEBUG "%s: Using MAC outside of the assigned range:"
|
||||||
|
" %02x:%02x:%02x:%02x:%02x:%02x\n", dev->name,
|
||||||
|
sa.sa_data[0] & 0xff, sa.sa_data[1] & 0xff,
|
||||||
|
sa.sa_data[2] & 0xff, sa.sa_data[3] & 0xff,
|
||||||
|
sa.sa_data[4] & 0xff, sa.sa_data[5] & 0xff);
|
||||||
|
cvm_oct_mac_addr_offset++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Force the interface to use the POW send if always_use_pow
|
* Force the interface to use the POW send if always_use_pow
|
||||||
|
@ -496,14 +520,12 @@ int cvm_oct_common_init(struct net_device *dev)
|
||||||
if (priv->queue != -1 && USE_HW_TCPUDP_CHECKSUM)
|
if (priv->queue != -1 && USE_HW_TCPUDP_CHECKSUM)
|
||||||
dev->features |= NETIF_F_IP_CSUM;
|
dev->features |= NETIF_F_IP_CSUM;
|
||||||
|
|
||||||
count++;
|
|
||||||
|
|
||||||
/* We do our own locking, Linux doesn't need to */
|
/* We do our own locking, Linux doesn't need to */
|
||||||
dev->features |= NETIF_F_LLTX;
|
dev->features |= NETIF_F_LLTX;
|
||||||
SET_ETHTOOL_OPS(dev, &cvm_oct_ethtool_ops);
|
SET_ETHTOOL_OPS(dev, &cvm_oct_ethtool_ops);
|
||||||
|
|
||||||
cvm_oct_mdio_setup_device(dev);
|
cvm_oct_mdio_setup_device(dev);
|
||||||
dev->netdev_ops->ndo_set_mac_address(dev, mac);
|
dev->netdev_ops->ndo_set_mac_address(dev, &sa);
|
||||||
dev->netdev_ops->ndo_change_mtu(dev, dev->mtu);
|
dev->netdev_ops->ndo_change_mtu(dev, dev->mtu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -620,6 +642,13 @@ static int __init cvm_oct_init_module(void)
|
||||||
|
|
||||||
pr_notice("cavium-ethernet %s\n", OCTEON_ETHERNET_VERSION);
|
pr_notice("cavium-ethernet %s\n", OCTEON_ETHERNET_VERSION);
|
||||||
|
|
||||||
|
if (OCTEON_IS_MODEL(OCTEON_CN52XX))
|
||||||
|
cvm_oct_mac_addr_offset = 2; /* First two are the mgmt ports. */
|
||||||
|
else if (OCTEON_IS_MODEL(OCTEON_CN56XX))
|
||||||
|
cvm_oct_mac_addr_offset = 1; /* First one is the mgmt port. */
|
||||||
|
else
|
||||||
|
cvm_oct_mac_addr_offset = 0;
|
||||||
|
|
||||||
cvm_oct_proc_initialize();
|
cvm_oct_proc_initialize();
|
||||||
cvm_oct_rx_initialize();
|
cvm_oct_rx_initialize();
|
||||||
cvm_oct_configure_common_hw();
|
cvm_oct_configure_common_hw();
|
||||||
|
|
Loading…
Reference in a new issue