mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (67 commits)
cxgb4vf: recover from failure in cxgb4vf_open()
netfilter: ebtables: make broute table work again
netfilter: fix race in conntrack between dump_table and destroy
ah: reload pointers to skb data after calling skb_cow_data()
ah: update maximum truncated ICV length
xfrm: check trunc_len in XFRMA_ALG_AUTH_TRUNC
ehea: Increase the skb array usage
net/fec: remove config FEC2 as it's used nowhere
pcnet_cs: add new_id
tcp: disallow bind() to reuse addr/port
net/r8169: Update the function of parsing firmware
net: ppp: use {get,put}_unaligned_be{16,32}
CAIF: Fix IPv6 support in receive path for GPRS/3G
arp: allow to invalidate specific ARP entries
net_sched: factorize qdisc stats handling
mlx4: Call alloc_etherdev to allocate RX and TX queues
net: Add alloc_netdev_mqs function
caif: don't set connection request param size before copying data
cxgb4vf: fix mailbox data/control coherency domain race
qlcnic: change module parameter permissions
...
This commit is contained in:
commit
4162cf6497
109 files changed
+2905
-1871
No files matched your search
@@ -167,6 +167,7 @@ rx_ccid = 2
|
||||
seq_window = 100
|
||||
The initial sequence window (sec. 7.5.2) of the sender. This influences
|
||||
the local ackno validity and the remote seqno validity windows (7.5.1).
|
||||
Values in the range Wmin = 32 (RFC 4340, 7.5.2) up to 2^32-1 can be set.
|
||||
|
||||
tx_qlen = 5
|
||||
The size of the transmit buffer in packets. A value of 0 corresponds
|
||||
|
||||
@@ -1926,8 +1926,9 @@ static int __devinit ucode_init (loader_block * lb, amb_dev * dev) {
|
||||
const struct firmware *fw;
|
||||
unsigned long start_address;
|
||||
const struct ihex_binrec *rec;
|
||||
const char *errmsg = 0;
|
||||
int res;
|
||||
|
||||
|
||||
res = request_ihex_firmware(&fw, "atmsar11.fw", &dev->pci_dev->dev);
|
||||
if (res) {
|
||||
PRINTK (KERN_ERR, "Cannot load microcode data");
|
||||
@@ -1937,8 +1938,8 @@ static int __devinit ucode_init (loader_block * lb, amb_dev * dev) {
|
||||
/* First record contains just the start address */
|
||||
rec = (const struct ihex_binrec *)fw->data;
|
||||
if (be16_to_cpu(rec->len) != sizeof(__be32) || be32_to_cpu(rec->addr)) {
|
||||
PRINTK (KERN_ERR, "Bad microcode data (no start record)");
|
||||
return -EINVAL;
|
||||
errmsg = "no start record";
|
||||
goto fail;
|
||||
}
|
||||
start_address = be32_to_cpup((__be32 *)rec->data);
|
||||
|
||||
@@ -1950,12 +1951,12 @@ static int __devinit ucode_init (loader_block * lb, amb_dev * dev) {
|
||||
PRINTD (DBG_LOAD, "starting region (%x, %u)", be32_to_cpu(rec->addr),
|
||||
be16_to_cpu(rec->len));
|
||||
if (be16_to_cpu(rec->len) > 4 * MAX_TRANSFER_DATA) {
|
||||
PRINTK (KERN_ERR, "Bad microcode data (record too long)");
|
||||
return -EINVAL;
|
||||
errmsg = "record too long";
|
||||
goto fail;
|
||||
}
|
||||
if (be16_to_cpu(rec->len) & 3) {
|
||||
PRINTK (KERN_ERR, "Bad microcode data (odd number of bytes)");
|
||||
return -EINVAL;
|
||||
errmsg = "odd number of bytes";
|
||||
goto fail;
|
||||
}
|
||||
res = loader_write(lb, dev, rec);
|
||||
if (res)
|
||||
@@ -1970,6 +1971,10 @@ static int __devinit ucode_init (loader_block * lb, amb_dev * dev) {
|
||||
res = loader_start(lb, dev, start_address);
|
||||
|
||||
return res;
|
||||
fail:
|
||||
release_firmware(fw);
|
||||
PRINTK(KERN_ERR, "Bad microcode data (%s)", errmsg);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/********** give adapter parameters **********/
|
||||
|
||||
+1
-8
@@ -1944,19 +1944,12 @@ config 68360_ENET
|
||||
config FEC
|
||||
bool "FEC ethernet controller (of ColdFire and some i.MX CPUs)"
|
||||
depends on M523x || M527x || M5272 || M528x || M520x || M532x || \
|
||||
MACH_MX27 || ARCH_MX35 || ARCH_MX25 || ARCH_MX5
|
||||
MACH_MX27 || ARCH_MX35 || ARCH_MX25 || ARCH_MX5 || SOC_IMX28
|
||||
select PHYLIB
|
||||
help
|
||||
Say Y here if you want to use the built-in 10/100 Fast ethernet
|
||||
controller on some Motorola ColdFire and Freescale i.MX processors.
|
||||
|
||||
config FEC2
|
||||
bool "Second FEC ethernet controller (on some ColdFire CPUs)"
|
||||
depends on FEC
|
||||
help
|
||||
Say Y here if you want to use the second built-in 10/100 Fast
|
||||
ethernet controller on some Motorola ColdFire processors.
|
||||
|
||||
config FEC_MPC52xx
|
||||
tristate "MPC52xx FEC driver"
|
||||
depends on PPC_MPC52xx && PPC_BESTCOMM
|
||||
|
||||
+37
-37
@@ -8,6 +8,11 @@
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#define DRV_VERSION "1.1"
|
||||
#define DRV_DESC "Blackfin on-chip Ethernet MAC driver"
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -41,12 +46,7 @@
|
||||
|
||||
#include "bfin_mac.h"
|
||||
|
||||
#define DRV_NAME "bfin_mac"
|
||||
#define DRV_VERSION "1.1"
|
||||
#define DRV_AUTHOR "Bryan Wu, Luke Yang"
|
||||
#define DRV_DESC "Blackfin on-chip Ethernet MAC driver"
|
||||
|
||||
MODULE_AUTHOR(DRV_AUTHOR);
|
||||
MODULE_AUTHOR("Bryan Wu, Luke Yang");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION(DRV_DESC);
|
||||
MODULE_ALIAS("platform:bfin_mac");
|
||||
@@ -189,8 +189,7 @@ static int desc_list_init(void)
|
||||
/* allocate a new skb for next time receive */
|
||||
new_skb = dev_alloc_skb(PKT_BUF_SZ + NET_IP_ALIGN);
|
||||
if (!new_skb) {
|
||||
printk(KERN_NOTICE DRV_NAME
|
||||
": init: low on mem - packet dropped\n");
|
||||
pr_notice("init: low on mem - packet dropped\n");
|
||||
goto init_error;
|
||||
}
|
||||
skb_reserve(new_skb, NET_IP_ALIGN);
|
||||
@@ -240,7 +239,7 @@ static int desc_list_init(void)
|
||||
|
||||
init_error:
|
||||
desc_list_free();
|
||||
printk(KERN_ERR DRV_NAME ": kmalloc failed\n");
|
||||
pr_err("kmalloc failed\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -259,8 +258,7 @@ static int bfin_mdio_poll(void)
|
||||
while ((bfin_read_EMAC_STAADD()) & STABUSY) {
|
||||
udelay(1);
|
||||
if (timeout_cnt-- < 0) {
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": wait MDC/MDIO transaction to complete timeout\n");
|
||||
pr_err("wait MDC/MDIO transaction to complete timeout\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
}
|
||||
@@ -350,9 +348,9 @@ static void bfin_mac_adjust_link(struct net_device *dev)
|
||||
opmode &= ~RMII_10;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_WARNING
|
||||
"%s: Ack! Speed (%d) is not 10/100!\n",
|
||||
DRV_NAME, phydev->speed);
|
||||
netdev_warn(dev,
|
||||
"Ack! Speed (%d) is not 10/100!\n",
|
||||
phydev->speed);
|
||||
break;
|
||||
}
|
||||
bfin_write_EMAC_OPMODE(opmode);
|
||||
@@ -417,14 +415,13 @@ static int mii_probe(struct net_device *dev, int phy_mode)
|
||||
|
||||
/* now we are supposed to have a proper phydev, to attach to... */
|
||||
if (!phydev) {
|
||||
printk(KERN_INFO "%s: Don't found any phy device at all\n",
|
||||
dev->name);
|
||||
netdev_err(dev, "no phy device found\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (phy_mode != PHY_INTERFACE_MODE_RMII &&
|
||||
phy_mode != PHY_INTERFACE_MODE_MII) {
|
||||
printk(KERN_INFO "%s: Invalid phy interface mode\n", dev->name);
|
||||
netdev_err(dev, "invalid phy interface mode\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -432,7 +429,7 @@ static int mii_probe(struct net_device *dev, int phy_mode)
|
||||
0, phy_mode);
|
||||
|
||||
if (IS_ERR(phydev)) {
|
||||
printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
|
||||
netdev_err(dev, "could not attach PHY\n");
|
||||
return PTR_ERR(phydev);
|
||||
}
|
||||
|
||||
@@ -453,11 +450,10 @@ static int mii_probe(struct net_device *dev, int phy_mode)
|
||||
lp->old_duplex = -1;
|
||||
lp->phydev = phydev;
|
||||
|
||||
printk(KERN_INFO "%s: attached PHY driver [%s] "
|
||||
"(mii_bus:phy_addr=%s, irq=%d, mdc_clk=%dHz(mdc_div=%d)"
|
||||
"@sclk=%dMHz)\n",
|
||||
DRV_NAME, phydev->drv->name, dev_name(&phydev->dev), phydev->irq,
|
||||
MDC_CLK, mdc_div, sclk/1000000);
|
||||
pr_info("attached PHY driver [%s] "
|
||||
"(mii_bus:phy_addr=%s, irq=%d, mdc_clk=%dHz(mdc_div=%d)@sclk=%dMHz)\n",
|
||||
phydev->drv->name, dev_name(&phydev->dev), phydev->irq,
|
||||
MDC_CLK, mdc_div, sclk/1000000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -502,7 +498,7 @@ bfin_mac_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||
static void bfin_mac_ethtool_getdrvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
strcpy(info->driver, DRV_NAME);
|
||||
strcpy(info->driver, KBUILD_MODNAME);
|
||||
strcpy(info->version, DRV_VERSION);
|
||||
strcpy(info->fw_version, "N/A");
|
||||
strcpy(info->bus_info, dev_name(&dev->dev));
|
||||
@@ -562,7 +558,7 @@ static const struct ethtool_ops bfin_mac_ethtool_ops = {
|
||||
};
|
||||
|
||||
/**************************************************************************/
|
||||
void setup_system_regs(struct net_device *dev)
|
||||
static void setup_system_regs(struct net_device *dev)
|
||||
{
|
||||
struct bfin_mac_local *lp = netdev_priv(dev);
|
||||
int i;
|
||||
@@ -592,6 +588,10 @@ void setup_system_regs(struct net_device *dev)
|
||||
|
||||
bfin_write_EMAC_MMC_CTL(RSTC | CROLL);
|
||||
|
||||
/* Set vlan regs to let 1522 bytes long packets pass through */
|
||||
bfin_write_EMAC_VLAN1(lp->vlan1_mask);
|
||||
bfin_write_EMAC_VLAN2(lp->vlan2_mask);
|
||||
|
||||
/* Initialize the TX DMA channel registers */
|
||||
bfin_write_DMA2_X_COUNT(0);
|
||||
bfin_write_DMA2_X_MODIFY(4);
|
||||
@@ -827,8 +827,7 @@ static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb)
|
||||
while ((!(bfin_read_EMAC_PTP_ISTAT() & TXTL)) && (--timeout_cnt))
|
||||
udelay(1);
|
||||
if (timeout_cnt == 0)
|
||||
printk(KERN_ERR DRV_NAME
|
||||
": fails to timestamp the TX packet\n");
|
||||
netdev_err(netdev, "timestamp the TX packet failed\n");
|
||||
else {
|
||||
struct skb_shared_hwtstamps shhwtstamps;
|
||||
u64 ns;
|
||||
@@ -1083,8 +1082,7 @@ static void bfin_mac_rx(struct net_device *dev)
|
||||
* we which case we simply drop the packet
|
||||
*/
|
||||
if (current_rx_ptr->status.status_word & RX_ERROR_MASK) {
|
||||
printk(KERN_NOTICE DRV_NAME
|
||||
": rx: receive error - packet dropped\n");
|
||||
netdev_notice(dev, "rx: receive error - packet dropped\n");
|
||||
dev->stats.rx_dropped++;
|
||||
goto out;
|
||||
}
|
||||
@@ -1094,8 +1092,7 @@ static void bfin_mac_rx(struct net_device *dev)
|
||||
|
||||
new_skb = dev_alloc_skb(PKT_BUF_SZ + NET_IP_ALIGN);
|
||||
if (!new_skb) {
|
||||
printk(KERN_NOTICE DRV_NAME
|
||||
": rx: low on mem - packet dropped\n");
|
||||
netdev_notice(dev, "rx: low on mem - packet dropped\n");
|
||||
dev->stats.rx_dropped++;
|
||||
goto out;
|
||||
}
|
||||
@@ -1213,7 +1210,7 @@ static int bfin_mac_enable(struct phy_device *phydev)
|
||||
int ret;
|
||||
u32 opmode;
|
||||
|
||||
pr_debug("%s: %s\n", DRV_NAME, __func__);
|
||||
pr_debug("%s\n", __func__);
|
||||
|
||||
/* Set RX DMA */
|
||||
bfin_write_DMA1_NEXT_DESC_PTR(&(rx_list_head->desc_a));
|
||||
@@ -1323,7 +1320,7 @@ static void bfin_mac_set_multicast_list(struct net_device *dev)
|
||||
u32 sysctl;
|
||||
|
||||
if (dev->flags & IFF_PROMISC) {
|
||||
printk(KERN_INFO "%s: set to promisc mode\n", dev->name);
|
||||
netdev_info(dev, "set promisc mode\n");
|
||||
sysctl = bfin_read_EMAC_OPMODE();
|
||||
sysctl |= PR;
|
||||
bfin_write_EMAC_OPMODE(sysctl);
|
||||
@@ -1393,7 +1390,7 @@ static int bfin_mac_open(struct net_device *dev)
|
||||
* address using ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx
|
||||
*/
|
||||
if (!is_valid_ether_addr(dev->dev_addr)) {
|
||||
printk(KERN_WARNING DRV_NAME ": no valid ethernet hw addr\n");
|
||||
netdev_warn(dev, "no valid ethernet hw addr\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1527,6 +1524,9 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
|
||||
goto out_err_mii_probe;
|
||||
}
|
||||
|
||||
lp->vlan1_mask = ETH_P_8021Q | mii_bus_data->vlan1_mask;
|
||||
lp->vlan2_mask = ETH_P_8021Q | mii_bus_data->vlan2_mask;
|
||||
|
||||
/* Fill in the fields of the device structure with ethernet values. */
|
||||
ether_setup(ndev);
|
||||
|
||||
@@ -1558,7 +1558,7 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
|
||||
bfin_mac_hwtstamp_init(ndev);
|
||||
|
||||
/* now, print out the card info, in a short format.. */
|
||||
dev_info(&pdev->dev, "%s, Version %s\n", DRV_DESC, DRV_VERSION);
|
||||
netdev_info(ndev, "%s, Version %s\n", DRV_DESC, DRV_VERSION);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1650,7 +1650,7 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev)
|
||||
* so set the GPIO pins to Ethernet mode
|
||||
*/
|
||||
pin_req = mii_bus_pd->mac_peripherals;
|
||||
rc = peripheral_request_list(pin_req, DRV_NAME);
|
||||
rc = peripheral_request_list(pin_req, KBUILD_MODNAME);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "Requesting peripherals failed!\n");
|
||||
return rc;
|
||||
@@ -1739,7 +1739,7 @@ static struct platform_driver bfin_mac_driver = {
|
||||
.resume = bfin_mac_resume,
|
||||
.suspend = bfin_mac_suspend,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.name = KBUILD_MODNAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
+10
-1
@@ -17,7 +17,14 @@
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/bfin_mac.h>
|
||||
|
||||
/*
|
||||
* Disable hardware checksum for bug #5600 if writeback cache is
|
||||
* enabled. Otherwize, corrupted RX packet will be sent up stack
|
||||
* without error mark.
|
||||
*/
|
||||
#ifndef CONFIG_BFIN_EXTMEM_WRITEBACK
|
||||
#define BFIN_MAC_CSUM_OFFLOAD
|
||||
#endif
|
||||
|
||||
#define TX_RECLAIM_JIFFIES (HZ / 5)
|
||||
|
||||
@@ -68,7 +75,6 @@ struct bfin_mac_local {
|
||||
*/
|
||||
struct net_device_stats stats;
|
||||
|
||||
unsigned char Mac[6]; /* MAC address of the board */
|
||||
spinlock_t lock;
|
||||
|
||||
int wol; /* Wake On Lan */
|
||||
@@ -76,6 +82,9 @@ struct bfin_mac_local {
|
||||
struct timer_list tx_reclaim_timer;
|
||||
struct net_device *ndev;
|
||||
|
||||
/* Data for EMAC_VLAN1 regs */
|
||||
u16 vlan1_mask, vlan2_mask;
|
||||
|
||||
/* MII and PHY stuffs */
|
||||
int old_link; /* used by bf537_adjust_link */
|
||||
int old_speed;
|
||||
|
||||
@@ -636,6 +636,7 @@ struct bnx2x_common {
|
||||
|
||||
#define CHIP_METAL(bp) (bp->common.chip_id & 0x00000ff0)
|
||||
#define CHIP_BOND_ID(bp) (bp->common.chip_id & 0x0000000f)
|
||||
#define CHIP_PARITY_ENABLED(bp) (CHIP_IS_E1(bp) || CHIP_IS_E1H(bp))
|
||||
|
||||
int flash_size;
|
||||
#define NVRAM_1MB_SIZE 0x20000 /* 1M bit in bytes */
|
||||
|
||||
+570
-420
File diff suppressed because it is too large.
Load diff
@@ -24,6 +24,7 @@
|
||||
#include "bnx2x.h"
|
||||
#include "bnx2x_cmn.h"
|
||||
#include "bnx2x_dump.h"
|
||||
#include "bnx2x_init.h"
|
||||
|
||||
/* Note: in the format strings below %s is replaced by the queue-name which is
|
||||
* either its index or 'fcoe' for the fcoe queue. Make sure the format string
|
||||
@@ -472,7 +473,7 @@ static int bnx2x_get_regs_len(struct net_device *dev)
|
||||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
int regdump_len = 0;
|
||||
int i;
|
||||
int i, j, k;
|
||||
|
||||
if (CHIP_IS_E1(bp)) {
|
||||
for (i = 0; i < REGS_COUNT; i++)
|
||||
@@ -502,6 +503,15 @@ static int bnx2x_get_regs_len(struct net_device *dev)
|
||||
if (IS_E2_ONLINE(wreg_addrs_e2[i].info))
|
||||
regdump_len += wreg_addrs_e2[i].size *
|
||||
(1 + wreg_addrs_e2[i].read_regs_count);
|
||||
|
||||
for (i = 0; i < PAGE_MODE_VALUES_E2; i++)
|
||||
for (j = 0; j < PAGE_WRITE_REGS_E2; j++) {
|
||||
for (k = 0; k < PAGE_READ_REGS_E2; k++)
|
||||
if (IS_E2_ONLINE(page_read_regs_e2[k].
|
||||
info))
|
||||
regdump_len +=
|
||||
page_read_regs_e2[k].size;
|
||||
}
|
||||
}
|
||||
regdump_len *= 4;
|
||||
regdump_len += sizeof(struct dump_hdr);
|
||||
@@ -539,6 +549,12 @@ static void bnx2x_get_regs(struct net_device *dev,
|
||||
if (!netif_running(bp->dev))
|
||||
return;
|
||||
|
||||
/* Disable parity attentions as long as following dump may
|
||||
* cause false alarms by reading never written registers. We
|
||||
* will re-enable parity attentions right after the dump.
|
||||
*/
|
||||
bnx2x_disable_blocks_parity(bp);
|
||||
|
||||
dump_hdr.hdr_size = (sizeof(struct dump_hdr) / 4) - 1;
|
||||
dump_hdr.dump_sign = dump_sign_all;
|
||||
dump_hdr.xstorm_waitp = REG_RD(bp, XSTORM_WAITP_ADDR);
|
||||
@@ -580,6 +596,10 @@ static void bnx2x_get_regs(struct net_device *dev,
|
||||
|
||||
bnx2x_read_pages_regs_e2(bp, p);
|
||||
}
|
||||
/* Re-enable parity attentions */
|
||||
bnx2x_clear_blocks_parity(bp);
|
||||
if (CHIP_PARITY_ENABLED(bp))
|
||||
bnx2x_enable_blocks_parity(bp);
|
||||
}
|
||||
|
||||
#define PHY_FW_VER_LEN 20
|
||||
|
||||
@@ -192,5 +192,225 @@ struct src_ent {
|
||||
u64 next;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Parity configuration
|
||||
****************************************************************************/
|
||||
#define BLOCK_PRTY_INFO(block, en_mask, m1, m1h, m2) \
|
||||
{ \
|
||||
block##_REG_##block##_PRTY_MASK, \
|
||||
block##_REG_##block##_PRTY_STS_CLR, \
|
||||
en_mask, {m1, m1h, m2}, #block \
|
||||
}
|
||||
|
||||
#define BLOCK_PRTY_INFO_0(block, en_mask, m1, m1h, m2) \
|
||||
{ \
|
||||
block##_REG_##block##_PRTY_MASK_0, \
|
||||
block##_REG_##block##_PRTY_STS_CLR_0, \
|
||||
en_mask, {m1, m1h, m2}, #block"_0" \
|
||||
}
|
||||
|
||||
#define BLOCK_PRTY_INFO_1(block, en_mask, m1, m1h, m2) \
|
||||
{ \
|
||||
block##_REG_##block##_PRTY_MASK_1, \
|
||||
block##_REG_##block##_PRTY_STS_CLR_1, \
|
||||
en_mask, {m1, m1h, m2}, #block"_1" \
|
||||
}
|
||||
|
||||
static const struct {
|
||||
u32 mask_addr;
|
||||
u32 sts_clr_addr;
|
||||
u32 en_mask; /* Mask to enable parity attentions */
|
||||
struct {
|
||||
u32 e1; /* 57710 */
|
||||
u32 e1h; /* 57711 */
|
||||
u32 e2; /* 57712 */
|
||||
} reg_mask; /* Register mask (all valid bits) */
|
||||
char name[7]; /* Block's longest name is 6 characters long
|
||||
* (name + suffix)
|
||||
*/
|
||||
} bnx2x_blocks_parity_data[] = {
|
||||
/* bit 19 masked */
|
||||
/* REG_WR(bp, PXP_REG_PXP_PRTY_MASK, 0x80000); */
|
||||
/* bit 5,18,20-31 */
|
||||
/* REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_0, 0xfff40020); */
|
||||
/* bit 5 */
|
||||
/* REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_1, 0x20); */
|
||||
/* REG_WR(bp, HC_REG_HC_PRTY_MASK, 0x0); */
|
||||
/* REG_WR(bp, MISC_REG_MISC_PRTY_MASK, 0x0); */
|
||||
|
||||
/* Block IGU, MISC, PXP and PXP2 parity errors as long as we don't
|
||||
* want to handle "system kill" flow at the moment.
|
||||
*/
|
||||
BLOCK_PRTY_INFO(PXP, 0x3ffffff, 0x3ffffff, 0x3ffffff, 0x3ffffff),
|
||||
BLOCK_PRTY_INFO_0(PXP2, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff),
|
||||
BLOCK_PRTY_INFO_1(PXP2, 0x7ff, 0x7f, 0x7f, 0x7ff),
|
||||
BLOCK_PRTY_INFO(HC, 0x7, 0x7, 0x7, 0),
|
||||
BLOCK_PRTY_INFO(IGU, 0x7ff, 0, 0, 0x7ff),
|
||||
BLOCK_PRTY_INFO(MISC, 0x1, 0x1, 0x1, 0x1),
|
||||
BLOCK_PRTY_INFO(QM, 0, 0x1ff, 0xfff, 0xfff),
|
||||
BLOCK_PRTY_INFO(DORQ, 0, 0x3, 0x3, 0x3),
|
||||
{GRCBASE_UPB + PB_REG_PB_PRTY_MASK,
|
||||
GRCBASE_UPB + PB_REG_PB_PRTY_STS_CLR, 0,
|
||||
{0xf, 0xf, 0xf}, "UPB"},
|
||||
{GRCBASE_XPB + PB_REG_PB_PRTY_MASK,
|
||||
GRCBASE_XPB + PB_REG_PB_PRTY_STS_CLR, 0,
|
||||
{0xf, 0xf, 0xf}, "XPB"},
|
||||
BLOCK_PRTY_INFO(SRC, 0x4, 0x7, 0x7, 0x7),
|
||||
BLOCK_PRTY_INFO(CDU, 0, 0x1f, 0x1f, 0x1f),
|
||||
BLOCK_PRTY_INFO(CFC, 0, 0xf, 0xf, 0xf),
|
||||
BLOCK_PRTY_INFO(DBG, 0, 0x1, 0x1, 0x1),
|
||||
BLOCK_PRTY_INFO(DMAE, 0, 0xf, 0xf, 0xf),
|
||||
BLOCK_PRTY_INFO(BRB1, 0, 0xf, 0xf, 0xf),
|
||||
BLOCK_PRTY_INFO(PRS, (1<<6), 0xff, 0xff, 0xff),
|
||||
BLOCK_PRTY_INFO(TSDM, 0x18, 0x7ff, 0x7ff, 0x7ff),
|
||||
BLOCK_PRTY_INFO(CSDM, 0x8, 0x7ff, 0x7ff, 0x7ff),
|
||||
BLOCK_PRTY_INFO(USDM, 0x38, 0x7ff, 0x7ff, 0x7ff),
|
||||
BLOCK_PRTY_INFO(XSDM, 0x8, 0x7ff, 0x7ff, 0x7ff),
|
||||
BLOCK_PRTY_INFO_0(TSEM, 0, 0xffffffff, 0xffffffff, 0xffffffff),
|
||||
BLOCK_PRTY_INFO_1(TSEM, 0, 0x3, 0x1f, 0x3f),
|
||||
BLOCK_PRTY_INFO_0(USEM, 0, 0xffffffff, 0xffffffff, 0xffffffff),
|
||||
BLOCK_PRTY_INFO_1(USEM, 0, 0x3, 0x1f, 0x1f),
|
||||
BLOCK_PRTY_INFO_0(CSEM, 0, 0xffffffff, 0xffffffff, 0xffffffff),
|
||||
BLOCK_PRTY_INFO_1(CSEM, 0, 0x3, 0x1f, 0x1f),
|
||||
BLOCK_PRTY_INFO_0(XSEM, 0, 0xffffffff, 0xffffffff, 0xffffffff),
|
||||
BLOCK_PRTY_INFO_1(XSEM, 0, 0x3, 0x1f, 0x3f),
|
||||
};
|
||||
|
||||
|
||||
/* [28] MCP Latched rom_parity
|
||||
* [29] MCP Latched ump_rx_parity
|
||||
* [30] MCP Latched ump_tx_parity
|
||||
* [31] MCP Latched scpad_parity
|
||||
*/
|
||||
#define MISC_AEU_ENABLE_MCP_PRTY_BITS \
|
||||
(AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY | \
|
||||
AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY | \
|
||||
AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY | \
|
||||
AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY)
|
||||
|
||||
/* Below registers control the MCP parity attention output. When
|
||||
* MISC_AEU_ENABLE_MCP_PRTY_BITS are set - attentions are
|
||||
* enabled, when cleared - disabled.
|
||||
*/
|
||||
static const u32 mcp_attn_ctl_regs[] = {
|
||||
MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0,
|
||||
MISC_REG_AEU_ENABLE4_NIG_0,
|
||||
MISC_REG_AEU_ENABLE4_PXP_0,
|
||||
MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0,
|
||||
MISC_REG_AEU_ENABLE4_NIG_1,
|
||||
MISC_REG_AEU_ENABLE4_PXP_1
|
||||
};
|
||||
|
||||
static inline void bnx2x_set_mcp_parity(struct bnx2x *bp, u8 enable)
|
||||
{
|
||||
int i;
|
||||
u32 reg_val;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mcp_attn_ctl_regs); i++) {
|
||||
reg_val = REG_RD(bp, mcp_attn_ctl_regs[i]);
|
||||
|
||||
if (enable)
|
||||
reg_val |= MISC_AEU_ENABLE_MCP_PRTY_BITS;
|
||||
else
|
||||
reg_val &= ~MISC_AEU_ENABLE_MCP_PRTY_BITS;
|
||||
|
||||
REG_WR(bp, mcp_attn_ctl_regs[i], reg_val);
|
||||
}
|
||||
}
|
||||
|
||||
static inline u32 bnx2x_parity_reg_mask(struct bnx2x *bp, int idx)
|
||||
{
|
||||
if (CHIP_IS_E1(bp))
|
||||
return bnx2x_blocks_parity_data[idx].reg_mask.e1;
|
||||
else if (CHIP_IS_E1H(bp))
|
||||
return bnx2x_blocks_parity_data[idx].reg_mask.e1h;
|
||||
else
|
||||
return bnx2x_blocks_parity_data[idx].reg_mask.e2;
|
||||
}
|
||||
|
||||
static inline void bnx2x_disable_blocks_parity(struct bnx2x *bp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bnx2x_blocks_parity_data); i++) {
|
||||
u32 dis_mask = bnx2x_parity_reg_mask(bp, i);
|
||||
|
||||
if (dis_mask) {
|
||||
REG_WR(bp, bnx2x_blocks_parity_data[i].mask_addr,
|
||||
dis_mask);
|
||||
DP(NETIF_MSG_HW, "Setting parity mask "
|
||||
"for %s to\t\t0x%x\n",
|
||||
bnx2x_blocks_parity_data[i].name, dis_mask);
|
||||
}
|
||||
}
|
||||
|
||||
/* Disable MCP parity attentions */
|
||||
bnx2x_set_mcp_parity(bp, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the parity error status registers.
|
||||
*/
|
||||
static inline void bnx2x_clear_blocks_parity(struct bnx2x *bp)
|
||||
{
|
||||
int i;
|
||||
u32 reg_val, mcp_aeu_bits =
|
||||
AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY |
|
||||
AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY |
|
||||
AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY |
|
||||
AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY;
|
||||
|
||||
/* Clear SEM_FAST parities */
|
||||
REG_WR(bp, XSEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1);
|
||||
REG_WR(bp, TSEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1);
|
||||
REG_WR(bp, USEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1);
|
||||
REG_WR(bp, CSEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bnx2x_blocks_parity_data); i++) {
|
||||
u32 reg_mask = bnx2x_parity_reg_mask(bp, i);
|
||||
|
||||
if (reg_mask) {
|
||||
reg_val = REG_RD(bp, bnx2x_blocks_parity_data[i].
|
||||
sts_clr_addr);
|
||||
if (reg_val & reg_mask)
|
||||
DP(NETIF_MSG_HW,
|
||||
"Parity errors in %s: 0x%x\n",
|
||||
bnx2x_blocks_parity_data[i].name,
|
||||
reg_val & reg_mask);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if there were parity attentions in MCP */
|
||||
reg_val = REG_RD(bp, MISC_REG_AEU_AFTER_INVERT_4_MCP);
|
||||
if (reg_val & mcp_aeu_bits)
|
||||
DP(NETIF_MSG_HW, "Parity error in MCP: 0x%x\n",
|
||||
reg_val & mcp_aeu_bits);
|
||||
|
||||
/* Clear parity attentions in MCP:
|
||||
* [7] clears Latched rom_parity
|
||||
* [8] clears Latched ump_rx_parity
|
||||
* [9] clears Latched ump_tx_parity
|
||||
* [10] clears Latched scpad_parity (both ports)
|
||||
*/
|
||||
REG_WR(bp, MISC_REG_AEU_CLR_LATCH_SIGNAL, 0x780);
|
||||
}
|
||||
|
||||
static inline void bnx2x_enable_blocks_parity(struct bnx2x *bp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bnx2x_blocks_parity_data); i++) {
|
||||
u32 reg_mask = bnx2x_parity_reg_mask(bp, i);
|
||||
|
||||
if (reg_mask)
|
||||
REG_WR(bp, bnx2x_blocks_parity_data[i].mask_addr,
|
||||
bnx2x_blocks_parity_data[i].en_mask & reg_mask);
|
||||
}
|
||||
|
||||
/* Enable MCP parity attentions */
|
||||
bnx2x_set_mcp_parity(bp, true);
|
||||
}
|
||||
|
||||
|
||||
#endif /* BNX2X_INIT_H */
|
||||
|
||||
@@ -3152,7 +3152,6 @@ static inline void bnx2x_attn_int_deasserted3(struct bnx2x *bp, u32 attn)
|
||||
#define LOAD_COUNTER_MASK (((u32)0x1 << LOAD_COUNTER_BITS) - 1)
|
||||
#define RESET_DONE_FLAG_MASK (~LOAD_COUNTER_MASK)
|
||||
#define RESET_DONE_FLAG_SHIFT LOAD_COUNTER_BITS
|
||||
#define CHIP_PARITY_SUPPORTED(bp) (CHIP_IS_E1(bp) || CHIP_IS_E1H(bp))
|
||||
|
||||
/*
|
||||
* should be run under rtnl lock
|
||||
@@ -3527,7 +3526,7 @@ static void bnx2x_attn_int_deasserted(struct bnx2x *bp, u32 deasserted)
|
||||
try to handle this event */
|
||||
bnx2x_acquire_alr(bp);
|
||||
|
||||
if (bnx2x_chk_parity_attn(bp)) {
|
||||
if (CHIP_PARITY_ENABLED(bp) && bnx2x_chk_parity_attn(bp)) {
|
||||
bp->recovery_state = BNX2X_RECOVERY_INIT;
|
||||
bnx2x_set_reset_in_progress(bp);
|
||||
schedule_delayed_work(&bp->reset_task, 0);
|
||||
@@ -4754,7 +4753,7 @@ static int bnx2x_int_mem_test(struct bnx2x *bp)
|
||||
return 0; /* OK */
|
||||
}
|
||||
|
||||
static void enable_blocks_attention(struct bnx2x *bp)
|
||||
static void bnx2x_enable_blocks_attention(struct bnx2x *bp)
|
||||
{
|
||||
REG_WR(bp, PXP_REG_PXP_INT_MASK_0, 0);
|
||||
if (CHIP_IS_E2(bp))
|
||||
@@ -4808,53 +4807,9 @@ static void enable_blocks_attention(struct bnx2x *bp)
|
||||
REG_WR(bp, CDU_REG_CDU_INT_MASK, 0);
|
||||
REG_WR(bp, DMAE_REG_DMAE_INT_MASK, 0);
|
||||
/* REG_WR(bp, MISC_REG_MISC_INT_MASK, 0); */
|
||||
REG_WR(bp, PBF_REG_PBF_INT_MASK, 0X18); /* bit 3,4 masked */
|
||||
REG_WR(bp, PBF_REG_PBF_INT_MASK, 0x18); /* bit 3,4 masked */
|
||||
}
|
||||
|
||||
static const struct {
|
||||
u32 addr;
|
||||
u32 mask;
|
||||
} bnx2x_parity_mask[] = {
|
||||
{PXP_REG_PXP_PRTY_MASK, 0x3ffffff},
|
||||
{PXP2_REG_PXP2_PRTY_MASK_0, 0xffffffff},
|
||||
{PXP2_REG_PXP2_PRTY_MASK_1, 0x7f},
|
||||
{HC_REG_HC_PRTY_MASK, 0x7},
|
||||
{MISC_REG_MISC_PRTY_MASK, 0x1},
|
||||
{QM_REG_QM_PRTY_MASK, 0x0},
|
||||
{DORQ_REG_DORQ_PRTY_MASK, 0x0},
|
||||
{GRCBASE_UPB + PB_REG_PB_PRTY_MASK, 0x0},
|
||||
{GRCBASE_XPB + PB_REG_PB_PRTY_MASK, 0x0},
|
||||
{SRC_REG_SRC_PRTY_MASK, 0x4}, /* bit 2 */
|
||||
{CDU_REG_CDU_PRTY_MASK, 0x0},
|
||||
{CFC_REG_CFC_PRTY_MASK, 0x0},
|
||||
{DBG_REG_DBG_PRTY_MASK, 0x0},
|
||||
{DMAE_REG_DMAE_PRTY_MASK, 0x0},
|
||||
{BRB1_REG_BRB1_PRTY_MASK, 0x0},
|
||||
{PRS_REG_PRS_PRTY_MASK, (1<<6)},/* bit 6 */
|
||||
{TSDM_REG_TSDM_PRTY_MASK, 0x18}, /* bit 3,4 */
|
||||
{CSDM_REG_CSDM_PRTY_MASK, 0x8}, /* bit 3 */
|
||||
{USDM_REG_USDM_PRTY_MASK, 0x38}, /* bit 3,4,5 */
|
||||
{XSDM_REG_XSDM_PRTY_MASK, 0x8}, /* bit 3 */
|
||||
{TSEM_REG_TSEM_PRTY_MASK_0, 0x0},
|
||||
{TSEM_REG_TSEM_PRTY_MASK_1, 0x0},
|
||||
{USEM_REG_USEM_PRTY_MASK_0, 0x0},
|
||||
{USEM_REG_USEM_PRTY_MASK_1, 0x0},
|
||||
{CSEM_REG_CSEM_PRTY_MASK_0, 0x0},
|
||||
{CSEM_REG_CSEM_PRTY_MASK_1, 0x0},
|
||||
{XSEM_REG_XSEM_PRTY_MASK_0, 0x0},
|
||||
{XSEM_REG_XSEM_PRTY_MASK_1, 0x0}
|
||||
};
|
||||
|
||||
static void enable_blocks_parity(struct bnx2x *bp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bnx2x_parity_mask); i++)
|
||||
REG_WR(bp, bnx2x_parity_mask[i].addr,
|
||||
bnx2x_parity_mask[i].mask);
|
||||
}
|
||||
|
||||
|
||||
static void bnx2x_reset_common(struct bnx2x *bp)
|
||||
{
|
||||
/* reset_common */
|
||||
@@ -5350,9 +5305,9 @@ static int bnx2x_init_hw_common(struct bnx2x *bp, u32 load_code)
|
||||
/* clear PXP2 attentions */
|
||||
REG_RD(bp, PXP2_REG_PXP2_INT_STS_CLR_0);
|
||||
|
||||
enable_blocks_attention(bp);
|
||||
if (CHIP_PARITY_SUPPORTED(bp))
|
||||
enable_blocks_parity(bp);
|
||||
bnx2x_enable_blocks_attention(bp);
|
||||
if (CHIP_PARITY_ENABLED(bp))
|
||||
bnx2x_enable_blocks_parity(bp);
|
||||
|
||||
if (!BP_NOMCP(bp)) {
|
||||
/* In E2 2-PORT mode, same ext phy is used for the two paths */
|
||||
@@ -8751,13 +8706,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
|
||||
dev_err(&bp->pdev->dev, "MCP disabled, "
|
||||
"must load devices in order!\n");
|
||||
|
||||
/* Set multi queue mode */
|
||||
if ((multi_mode != ETH_RSS_MODE_DISABLED) &&
|
||||
((int_mode == INT_MODE_INTx) || (int_mode == INT_MODE_MSI))) {
|
||||
dev_err(&bp->pdev->dev, "Multi disabled since int_mode "
|
||||
"requested is not MSI-X\n");
|
||||
multi_mode = ETH_RSS_MODE_DISABLED;
|
||||
}
|
||||
bp->multi_mode = multi_mode;
|
||||
bp->int_mode = int_mode;
|
||||
|
||||
@@ -9560,9 +9508,15 @@ static void __devexit bnx2x_remove_one(struct pci_dev *pdev)
|
||||
/* Delete all NAPI objects */
|
||||
bnx2x_del_all_napi(bp);
|
||||
|
||||
/* Power on: we can't let PCI layer write to us while we are in D3 */
|
||||
bnx2x_set_power_state(bp, PCI_D0);
|
||||
|
||||
/* Disable MSI/MSI-X */
|
||||
bnx2x_disable_msi(bp);
|
||||
|
||||
/* Power off */
|
||||
bnx2x_set_power_state(bp, PCI_D3hot);
|
||||
|
||||
/* Make sure RESET task is not scheduled before continuing */
|
||||
cancel_delayed_work_sync(&bp->reset_task);
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
* WR - Write Clear (write 1 to clear the bit)
|
||||
*
|
||||
*/
|
||||
#ifndef BNX2X_REG_H
|
||||
#define BNX2X_REG_H
|
||||
|
||||
#define ATC_ATC_INT_STS_REG_ADDRESS_ERROR (0x1<<0)
|
||||
#define ATC_ATC_INT_STS_REG_ATC_GPA_MULTIPLE_HITS (0x1<<2)
|
||||
@@ -39,6 +41,8 @@
|
||||
#define BRB1_REG_BRB1_PRTY_MASK 0x60138
|
||||
/* [R 4] Parity register #0 read */
|
||||
#define BRB1_REG_BRB1_PRTY_STS 0x6012c
|
||||
/* [RC 4] Parity register #0 read clear */
|
||||
#define BRB1_REG_BRB1_PRTY_STS_CLR 0x60130
|
||||
/* [RW 10] At address BRB1_IND_FREE_LIST_PRS_CRDT initialize free head. At
|
||||
* address BRB1_IND_FREE_LIST_PRS_CRDT+1 initialize free tail. At address
|
||||
* BRB1_IND_FREE_LIST_PRS_CRDT+2 initialize parser initial credit. Warning -
|
||||
@@ -132,8 +136,12 @@
|
||||
#define CCM_REG_CCM_INT_MASK 0xd01e4
|
||||
/* [R 11] Interrupt register #0 read */
|
||||
#define CCM_REG_CCM_INT_STS 0xd01d8
|
||||
/* [RW 27] Parity mask register #0 read/write */
|
||||
#define CCM_REG_CCM_PRTY_MASK 0xd01f4
|
||||
/* [R 27] Parity register #0 read */
|
||||
#define CCM_REG_CCM_PRTY_STS 0xd01e8
|
||||
/* [RC 27] Parity register #0 read clear */
|
||||
#define CCM_REG_CCM_PRTY_STS_CLR 0xd01ec
|
||||
/* [RW 3] The size of AG context region 0 in REG-pairs. Designates the MS
|
||||
REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5).
|
||||
Is used to determine the number of the AG context REG-pairs written back;
|
||||
@@ -350,6 +358,8 @@
|
||||
#define CDU_REG_CDU_PRTY_MASK 0x10104c
|
||||
/* [R 5] Parity register #0 read */
|
||||
#define CDU_REG_CDU_PRTY_STS 0x101040
|
||||
/* [RC 5] Parity register #0 read clear */
|
||||
#define CDU_REG_CDU_PRTY_STS_CLR 0x101044
|
||||
/* [RC 32] logging of error data in case of a CDU load error:
|
||||
{expected_cid[15:0]; xpected_type[2:0]; xpected_region[2:0]; ctive_error;
|
||||
ype_error; ctual_active; ctual_compressed_context}; */
|
||||
@@ -381,6 +391,8 @@
|
||||
#define CFC_REG_CFC_PRTY_MASK 0x104118
|
||||
/* [R 4] Parity register #0 read */
|
||||
#define CFC_REG_CFC_PRTY_STS 0x10410c
|
||||
/* [RC 4] Parity register #0 read clear */
|
||||
#define CFC_REG_CFC_PRTY_STS_CLR 0x104110
|
||||
/* [RW 21] CID cam access (21:1 - Data; alid - 0) */
|
||||
#define CFC_REG_CID_CAM 0x104800
|
||||
#define CFC_REG_CONTROL0 0x104028
|
||||
@@ -466,6 +478,8 @@
|
||||
#define CSDM_REG_CSDM_PRTY_MASK 0xc22bc
|
||||
/* [R 11] Parity register #0 read */
|
||||
#define CSDM_REG_CSDM_PRTY_STS 0xc22b0
|
||||
/* [RC 11] Parity register #0 read clear */
|
||||
#define CSDM_REG_CSDM_PRTY_STS_CLR 0xc22b4
|
||||
#define CSDM_REG_ENABLE_IN1 0xc2238
|
||||
#define CSDM_REG_ENABLE_IN2 0xc223c
|
||||
#define CSDM_REG_ENABLE_OUT1 0xc2240
|
||||
@@ -556,6 +570,9 @@
|
||||
/* [R 32] Parity register #0 read */
|
||||
#define CSEM_REG_CSEM_PRTY_STS_0 0x200124
|
||||
#define CSEM_REG_CSEM_PRTY_STS_1 0x200134
|
||||
/* [RC 32] Parity register #0 read clear */
|
||||
#define CSEM_REG_CSEM_PRTY_STS_CLR_0 0x200128
|
||||
#define CSEM_REG_CSEM_PRTY_STS_CLR_1 0x200138
|
||||
#define CSEM_REG_ENABLE_IN 0x2000a4
|
||||
#define CSEM_REG_ENABLE_OUT 0x2000a8
|
||||
/* [RW 32] This address space contains all registers and memories that are
|
||||
@@ -648,6 +665,8 @@
|
||||
#define DBG_REG_DBG_PRTY_MASK 0xc0a8
|
||||
/* [R 1] Parity register #0 read */
|
||||
#define DBG_REG_DBG_PRTY_STS 0xc09c
|
||||
/* [RC 1] Parity register #0 read clear */
|
||||
#define DBG_REG_DBG_PRTY_STS_CLR 0xc0a0
|
||||
/* [RW 1] When set the DMAE will process the commands as in E1.5. 1.The
|
||||
* function that is used is always SRC-PCI; 2.VF_Valid = 0; 3.VFID=0;
|
||||
* 4.Completion function=0; 5.Error handling=0 */
|
||||
@@ -668,6 +687,8 @@
|
||||
#define DMAE_REG_DMAE_PRTY_MASK 0x102064
|
||||
/* [R 4] Parity register #0 read */
|
||||
#define DMAE_REG_DMAE_PRTY_STS 0x102058
|
||||
/* [RC 4] Parity register #0 read clear */
|
||||
#define DMAE_REG_DMAE_PRTY_STS_CLR 0x10205c
|
||||
/* [RW 1] Command 0 go. */
|
||||
#define DMAE_REG_GO_C0 0x102080
|
||||
/* [RW 1] Command 1 go. */
|
||||
@@ -734,6 +755,8 @@
|
||||
#define DORQ_REG_DORQ_PRTY_MASK 0x170190
|
||||
/* [R 2] Parity register #0 read */
|
||||
#define DORQ_REG_DORQ_PRTY_STS 0x170184
|
||||
/* [RC 2] Parity register #0 read clear */
|
||||
#define DORQ_REG_DORQ_PRTY_STS_CLR 0x170188
|
||||
/* [RW 8] The address to write the DPM CID to STORM. */
|
||||
#define DORQ_REG_DPM_CID_ADDR 0x170044
|
||||
/* [RW 5] The DPM mode CID extraction offset. */
|
||||
@@ -842,8 +865,12 @@
|
||||
/* [R 1] data availble for error memory. If this bit is clear do not red
|
||||
* from error_handling_memory. */
|
||||
#define IGU_REG_ERROR_HANDLING_DATA_VALID 0x130130
|
||||
/* [RW 11] Parity mask register #0 read/write */
|
||||
#define IGU_REG_IGU_PRTY_MASK 0x1300a8
|
||||
/* [R 11] Parity register #0 read */
|
||||
#define IGU_REG_IGU_PRTY_STS 0x13009c
|
||||
/* [RC 11] Parity register #0 read clear */
|
||||
#define IGU_REG_IGU_PRTY_STS_CLR 0x1300a0
|
||||
/* [R 4] Debug: int_handle_fsm */
|
||||
#define IGU_REG_INT_HANDLE_FSM 0x130050
|
||||
#define IGU_REG_LEADING_EDGE_LATCH 0x130134
|
||||
@@ -1501,6 +1528,8 @@
|
||||
#define MISC_REG_MISC_PRTY_MASK 0xa398
|
||||
/* [R 1] Parity register #0 read */
|
||||
#define MISC_REG_MISC_PRTY_STS 0xa38c
|
||||
/* [RC 1] Parity register #0 read clear */
|
||||
#define MISC_REG_MISC_PRTY_STS_CLR 0xa390
|
||||
#define MISC_REG_NIG_WOL_P0 0xa270
|
||||
#define MISC_REG_NIG_WOL_P1 0xa274
|
||||
/* [R 1] If set indicate that the pcie_rst_b was asserted without perst
|
||||
@@ -2082,6 +2111,10 @@
|
||||
#define PBF_REG_PBF_INT_MASK 0x1401d4
|
||||
/* [R 5] Interrupt register #0 read */
|
||||
#define PBF_REG_PBF_INT_STS 0x1401c8
|
||||
/* [RW 20] Parity mask register #0 read/write */
|
||||
#define PBF_REG_PBF_PRTY_MASK 0x1401e4
|
||||
/* [RC 20] Parity register #0 read clear */
|
||||
#define PBF_REG_PBF_PRTY_STS_CLR 0x1401dc
|
||||
#define PB_REG_CONTROL 0
|
||||
/* [RW 2] Interrupt mask register #0 read/write */
|
||||
#define PB_REG_PB_INT_MASK 0x28
|
||||
@@ -2091,6 +2124,8 @@
|
||||
#define PB_REG_PB_PRTY_MASK 0x38
|
||||
/* [R 4] Parity register #0 read */
|
||||
#define PB_REG_PB_PRTY_STS 0x2c
|
||||
/* [RC 4] Parity register #0 read clear */
|
||||
#define PB_REG_PB_PRTY_STS_CLR 0x30
|
||||
#define PGLUE_B_PGLUE_B_INT_STS_REG_ADDRESS_ERROR (0x1<<0)
|
||||
#define PGLUE_B_PGLUE_B_INT_STS_REG_CSSNOOP_FIFO_OVERFLOW (0x1<<8)
|
||||
#define PGLUE_B_PGLUE_B_INT_STS_REG_INCORRECT_RCV_BEHAVIOR (0x1<<1)
|
||||
@@ -2446,6 +2481,8 @@
|
||||
#define PRS_REG_PRS_PRTY_MASK 0x401a4
|
||||
/* [R 8] Parity register #0 read */
|
||||
#define PRS_REG_PRS_PRTY_STS 0x40198
|
||||
/* [RC 8] Parity register #0 read clear */
|
||||
#define PRS_REG_PRS_PRTY_STS_CLR 0x4019c
|
||||
/* [RW 8] Context region for pure acknowledge packets. Used in CFC load
|
||||
request message */
|
||||
#define PRS_REG_PURE_REGIONS 0x40024
|
||||
@@ -2599,6 +2636,9 @@
|
||||
/* [R 32] Parity register #0 read */
|
||||
#define PXP2_REG_PXP2_PRTY_STS_0 0x12057c
|
||||
#define PXP2_REG_PXP2_PRTY_STS_1 0x12058c
|
||||
/* [RC 32] Parity register #0 read clear */
|
||||
#define PXP2_REG_PXP2_PRTY_STS_CLR_0 0x120580
|
||||
#define PXP2_REG_PXP2_PRTY_STS_CLR_1 0x120590
|
||||
/* [R 1] Debug only: The 'almost full' indication from each fifo (gives
|
||||
indication about backpressure) */
|
||||
#define PXP2_REG_RD_ALMOST_FULL_0 0x120424
|
||||
@@ -3001,6 +3041,8 @@
|
||||
#define PXP_REG_PXP_PRTY_MASK 0x103094
|
||||
/* [R 26] Parity register #0 read */
|
||||
#define PXP_REG_PXP_PRTY_STS 0x103088
|
||||
/* [RC 27] Parity register #0 read clear */
|
||||
#define PXP_REG_PXP_PRTY_STS_CLR 0x10308c
|
||||
/* [RW 4] The activity counter initial increment value sent in the load
|
||||
request */
|
||||
#define QM_REG_ACTCTRINITVAL_0 0x168040
|
||||
@@ -3157,6 +3199,8 @@
|
||||
#define QM_REG_QM_PRTY_MASK 0x168454
|
||||
/* [R 12] Parity register #0 read */
|
||||
#define QM_REG_QM_PRTY_STS 0x168448
|
||||
/* [RC 12] Parity register #0 read clear */
|
||||
#define QM_REG_QM_PRTY_STS_CLR 0x16844c
|
||||
/* [R 32] Current queues in pipeline: Queues from 32 to 63 */
|
||||
#define QM_REG_QSTATUS_HIGH 0x16802c
|
||||
/* [R 32] Current queues in pipeline: Queues from 96 to 127 */
|
||||
@@ -3442,6 +3486,8 @@
|
||||
#define QM_REG_WRRWEIGHTS_9 0x168848
|
||||
/* [R 6] Keep the fill level of the fifo from write client 1 */
|
||||
#define QM_REG_XQM_WRC_FIFOLVL 0x168000
|
||||
/* [W 1] reset to parity interrupt */
|
||||
#define SEM_FAST_REG_PARITY_RST 0x18840
|
||||
#define SRC_REG_COUNTFREE0 0x40500
|
||||
/* [RW 1] If clr the searcher is compatible to E1 A0 - support only two
|
||||
ports. If set the searcher support 8 functions. */
|
||||
@@ -3470,6 +3516,8 @@
|
||||
#define SRC_REG_SRC_PRTY_MASK 0x404c8
|
||||
/* [R 3] Parity register #0 read */
|
||||
#define SRC_REG_SRC_PRTY_STS 0x404bc
|
||||
/* [RC 3] Parity register #0 read clear */
|
||||
#define SRC_REG_SRC_PRTY_STS_CLR 0x404c0
|
||||
/* [R 4] Used to read the value of the XX protection CAM occupancy counter. */
|
||||
#define TCM_REG_CAM_OCCUP 0x5017c
|
||||
/* [RW 1] CDU AG read Interface enable. If 0 - the request input is
|
||||
@@ -3596,8 +3644,12 @@
|
||||
#define TCM_REG_TCM_INT_MASK 0x501dc
|
||||
/* [R 11] Interrupt register #0 read */
|
||||
#define TCM_REG_TCM_INT_STS 0x501d0
|
||||
/* [RW 27] Parity mask register #0 read/write */
|
||||
#define TCM_REG_TCM_PRTY_MASK 0x501ec
|
||||
/* [R 27] Parity register #0 read */
|
||||
#define TCM_REG_TCM_PRTY_STS 0x501e0
|
||||
/* [RC 27] Parity register #0 read clear */
|
||||
#define TCM_REG_TCM_PRTY_STS_CLR 0x501e4
|
||||
/* [RW 3] The size of AG context region 0 in REG-pairs. Designates the MS
|
||||
REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5).
|
||||
Is used to determine the number of the AG context REG-pairs written back;
|
||||
@@ -3755,6 +3807,10 @@
|
||||
#define TM_REG_TM_INT_MASK 0x1640fc
|
||||
/* [R 1] Interrupt register #0 read */
|
||||
#define TM_REG_TM_INT_STS 0x1640f0
|
||||
/* [RW 7] Parity mask register #0 read/write */
|
||||
#define TM_REG_TM_PRTY_MASK 0x16410c
|
||||
/* [RC 7] Parity register #0 read clear */
|
||||
#define TM_REG_TM_PRTY_STS_CLR 0x164104
|
||||
/* [RW 8] The event id for aggregated interrupt 0 */
|
||||
#define TSDM_REG_AGG_INT_EVENT_0 0x42038
|
||||
#define TSDM_REG_AGG_INT_EVENT_1 0x4203c
|
||||
@@ -3835,6 +3891,8 @@
|
||||
#define TSDM_REG_TSDM_PRTY_MASK 0x422bc
|
||||
/* [R 11] Parity register #0 read */
|
||||
#define TSDM_REG_TSDM_PRTY_STS 0x422b0
|
||||
/* [RC 11] Parity register #0 read clear */
|
||||
#define TSDM_REG_TSDM_PRTY_STS_CLR 0x422b4
|
||||
/* [RW 5] The number of time_slots in the arbitration cycle */
|
||||
#define TSEM_REG_ARB_CYCLE_SIZE 0x180034
|
||||
/* [RW 3] The source that is associated with arbitration element 0. Source
|
||||
@@ -3914,6 +3972,9 @@
|
||||
#define TSEM_REG_SLOW_EXT_STORE_EMPTY 0x1802a0
|
||||
/* [RW 8] List of free threads . There is a bit per thread. */
|
||||
#define TSEM_REG_THREADS_LIST 0x1802e4
|
||||
/* [RC 32] Parity register #0 read clear */
|
||||
#define TSEM_REG_TSEM_PRTY_STS_CLR_0 0x180118
|
||||
#define TSEM_REG_TSEM_PRTY_STS_CLR_1 0x180128
|
||||
/* [RW 3] The arbitration scheme of time_slot 0 */
|
||||
#define TSEM_REG_TS_0_AS 0x180038
|
||||
/* [RW 3] The arbitration scheme of time_slot 10 */
|
||||
@@ -4116,6 +4177,8 @@
|
||||
#define UCM_REG_UCM_INT_STS 0xe01c8
|
||||
/* [R 27] Parity register #0 read */
|
||||
#define UCM_REG_UCM_PRTY_STS 0xe01d8
|
||||
/* [RC 27] Parity register #0 read clear */
|
||||
#define UCM_REG_UCM_PRTY_STS_CLR 0xe01dc
|
||||
/* [RW 2] The size of AG context region 0 in REG-pairs. Designates the MS
|
||||
REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5).
|
||||
Is used to determine the number of the AG context REG-pairs written back;
|
||||
@@ -4292,6 +4355,8 @@
|
||||
#define USDM_REG_USDM_PRTY_MASK 0xc42c0
|
||||
/* [R 11] Parity register #0 read */
|
||||
#define USDM_REG_USDM_PRTY_STS 0xc42b4
|
||||
/* [RC 11] Parity register #0 read clear */
|
||||
#define USDM_REG_USDM_PRTY_STS_CLR 0xc42b8
|
||||
/* [RW 5] The number of time_slots in the arbitration cycle */
|
||||
#define USEM_REG_ARB_CYCLE_SIZE 0x300034
|
||||
/* [RW 3] The source that is associated with arbitration element 0. Source
|
||||
@@ -4421,6 +4486,9 @@
|
||||
/* [R 32] Parity register #0 read */
|
||||
#define USEM_REG_USEM_PRTY_STS_0 0x300124
|
||||
#define USEM_REG_USEM_PRTY_STS_1 0x300134
|
||||
/* [RC 32] Parity register #0 read clear */
|
||||
#define USEM_REG_USEM_PRTY_STS_CLR_0 0x300128
|
||||
#define USEM_REG_USEM_PRTY_STS_CLR_1 0x300138
|
||||
/* [W 7] VF or PF ID for reset error bit. Values 0-63 reset error bit for 64
|
||||
* VF; values 64-67 reset error for 4 PF; values 68-127 are not valid. */
|
||||
#define USEM_REG_VFPF_ERR_NUM 0x300380
|
||||
@@ -4797,6 +4865,8 @@
|
||||
#define XSDM_REG_XSDM_PRTY_MASK 0x1662bc
|
||||
/* [R 11] Parity register #0 read */
|
||||
#define XSDM_REG_XSDM_PRTY_STS 0x1662b0
|
||||
/* [RC 11] Parity register #0 read clear */
|
||||
#define XSDM_REG_XSDM_PRTY_STS_CLR 0x1662b4
|
||||
/* [RW 5] The number of time_slots in the arbitration cycle */
|
||||
#define XSEM_REG_ARB_CYCLE_SIZE 0x280034
|
||||
/* [RW 3] The source that is associated with arbitration element 0. Source
|
||||
@@ -4929,6 +4999,9 @@
|
||||
/* [R 32] Parity register #0 read */
|
||||
#define XSEM_REG_XSEM_PRTY_STS_0 0x280124
|
||||
#define XSEM_REG_XSEM_PRTY_STS_1 0x280134
|
||||
/* [RC 32] Parity register #0 read clear */
|
||||
#define XSEM_REG_XSEM_PRTY_STS_CLR_0 0x280128
|
||||
#define XSEM_REG_XSEM_PRTY_STS_CLR_1 0x280138
|
||||
#define MCPR_NVM_ACCESS_ENABLE_EN (1L<<0)
|
||||
#define MCPR_NVM_ACCESS_ENABLE_WR_EN (1L<<1)
|
||||
#define MCPR_NVM_ADDR_NVM_ADDR_VALUE (0xffffffL<<0)
|
||||
@@ -6316,3 +6389,4 @@ static inline u8 calc_crc8(u32 data, u8 crc)
|
||||
}
|
||||
|
||||
|
||||
#endif /* BNX2X_REG_H */
|
||||
@@ -158,6 +158,11 @@ static void bnx2x_storm_stats_post(struct bnx2x *bp)
|
||||
|
||||
spin_lock_bh(&bp->stats_lock);
|
||||
|
||||
if (bp->stats_pending) {
|
||||
spin_unlock_bh(&bp->stats_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
ramrod_data.drv_counter = bp->stats_counter++;
|
||||
ramrod_data.collect_port = bp->port.pmf ? 1 : 0;
|
||||
for_each_eth_queue(bp, i)
|
||||
|
||||
@@ -749,13 +749,19 @@ static int cxgb4vf_open(struct net_device *dev)
|
||||
netif_set_real_num_tx_queues(dev, pi->nqsets);
|
||||
err = netif_set_real_num_rx_queues(dev, pi->nqsets);
|
||||
if (err)
|
||||
return err;
|
||||
set_bit(pi->port_id, &adapter->open_device_map);
|
||||
goto err_unwind;
|
||||
err = link_start(dev);
|
||||
if (err)
|
||||
return err;
|
||||
goto err_unwind;
|
||||
|
||||
netif_tx_start_all_queues(dev);
|
||||
set_bit(pi->port_id, &adapter->open_device_map);
|
||||
return 0;
|
||||
|
||||
err_unwind:
|
||||
if (adapter->open_device_map == 0)
|
||||
adapter_down(adapter);
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -764,13 +770,12 @@ static int cxgb4vf_open(struct net_device *dev)
|
||||
*/
|
||||
static int cxgb4vf_stop(struct net_device *dev)
|
||||
{
|
||||
int ret;
|
||||
struct port_info *pi = netdev_priv(dev);
|
||||
struct adapter *adapter = pi->adapter;
|
||||
|
||||
netif_tx_stop_all_queues(dev);
|
||||
netif_carrier_off(dev);
|
||||
ret = t4vf_enable_vi(adapter, pi->viid, false, false);
|
||||
t4vf_enable_vi(adapter, pi->viid, false, false);
|
||||
pi->link_cfg.link_ok = 0;
|
||||
|
||||
clear_bit(pi->port_id, &adapter->open_device_map);
|
||||
|
||||
@@ -147,9 +147,20 @@ int t4vf_wr_mbox_core(struct adapter *adapter, const void *cmd, int size,
|
||||
/*
|
||||
* Write the command array into the Mailbox Data register array and
|
||||
* transfer ownership of the mailbox to the firmware.
|
||||
*
|
||||
* For the VFs, the Mailbox Data "registers" are actually backed by
|
||||
* T4's "MA" interface rather than PL Registers (as is the case for
|
||||
* the PFs). Because these are in different coherency domains, the
|
||||
* write to the VF's PL-register-backed Mailbox Control can race in
|
||||
* front of the writes to the MA-backed VF Mailbox Data "registers".
|
||||
* So we need to do a read-back on at least one byte of the VF Mailbox
|
||||
* Data registers before doing the write to the VF Mailbox Control
|
||||
* register.
|
||||
*/
|
||||
for (i = 0, p = cmd; i < size; i += 8)
|
||||
t4_write_reg64(adapter, mbox_data + i, be64_to_cpu(*p++));
|
||||
t4_read_reg(adapter, mbox_data); /* flush write */
|
||||
|
||||
t4_write_reg(adapter, mbox_ctl,
|
||||
MBMSGVALID | MBOWNER(MBOX_OWNER_FW));
|
||||
t4_read_reg(adapter, mbox_ctl); /* flush write */
|
||||
|
||||
+260
-68
@@ -130,10 +130,15 @@ static s32 e1000_set_phy_type(struct e1000_hw *hw)
|
||||
if (hw->mac_type == e1000_82541 ||
|
||||
hw->mac_type == e1000_82541_rev_2 ||
|
||||
hw->mac_type == e1000_82547 ||
|
||||
hw->mac_type == e1000_82547_rev_2) {
|
||||
hw->mac_type == e1000_82547_rev_2)
|
||||
hw->phy_type = e1000_phy_igp;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case RTL8211B_PHY_ID:
|
||||
hw->phy_type = e1000_phy_8211;
|
||||
break;
|
||||
case RTL8201N_PHY_ID:
|
||||
hw->phy_type = e1000_phy_8201;
|
||||
break;
|
||||
default:
|
||||
/* Should never have loaded on this device */
|
||||
hw->phy_type = e1000_phy_undefined;
|
||||
@@ -318,6 +323,9 @@ s32 e1000_set_mac_type(struct e1000_hw *hw)
|
||||
case E1000_DEV_ID_82547GI:
|
||||
hw->mac_type = e1000_82547_rev_2;
|
||||
break;
|
||||
case E1000_DEV_ID_INTEL_CE4100_GBE:
|
||||
hw->mac_type = e1000_ce4100;
|
||||
break;
|
||||
default:
|
||||
/* Should never have loaded on this device */
|
||||
return -E1000_ERR_MAC_TYPE;
|
||||
@@ -372,6 +380,9 @@ void e1000_set_media_type(struct e1000_hw *hw)
|
||||
case e1000_82542_rev2_1:
|
||||
hw->media_type = e1000_media_type_fiber;
|
||||
break;
|
||||
case e1000_ce4100:
|
||||
hw->media_type = e1000_media_type_copper;
|
||||
break;
|
||||
default:
|
||||
status = er32(STATUS);
|
||||
if (status & E1000_STATUS_TBIMODE) {
|
||||
@@ -460,6 +471,7 @@ s32 e1000_reset_hw(struct e1000_hw *hw)
|
||||
/* Reset is performed on a shadow of the control register */
|
||||
ew32(CTRL_DUP, (ctrl | E1000_CTRL_RST));
|
||||
break;
|
||||
case e1000_ce4100:
|
||||
default:
|
||||
ew32(CTRL, (ctrl | E1000_CTRL_RST));
|
||||
break;
|
||||
@@ -951,6 +963,67 @@ static s32 e1000_setup_fiber_serdes_link(struct e1000_hw *hw)
|
||||
return E1000_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_copper_link_rtl_setup - Copper link setup for e1000_phy_rtl series.
|
||||
* @hw: Struct containing variables accessed by shared code
|
||||
*
|
||||
* Commits changes to PHY configuration by calling e1000_phy_reset().
|
||||
*/
|
||||
static s32 e1000_copper_link_rtl_setup(struct e1000_hw *hw)
|
||||
{
|
||||
s32 ret_val;
|
||||
|
||||
/* SW reset the PHY so all changes take effect */
|
||||
ret_val = e1000_phy_reset(hw);
|
||||
if (ret_val) {
|
||||
e_dbg("Error Resetting the PHY\n");
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
return E1000_SUCCESS;
|
||||
}
|
||||
|
||||
static s32 gbe_dhg_phy_setup(struct e1000_hw *hw)
|
||||
{
|
||||
s32 ret_val;
|
||||
u32 ctrl_aux;
|
||||
|
||||
switch (hw->phy_type) {
|
||||
case e1000_phy_8211:
|
||||
ret_val = e1000_copper_link_rtl_setup(hw);
|
||||
if (ret_val) {
|
||||
e_dbg("e1000_copper_link_rtl_setup failed!\n");
|
||||
return ret_val;
|
||||
}
|
||||
break;
|
||||
case e1000_phy_8201:
|
||||
/* Set RMII mode */
|
||||
ctrl_aux = er32(CTL_AUX);
|
||||
ctrl_aux |= E1000_CTL_AUX_RMII;
|
||||
ew32(CTL_AUX, ctrl_aux);
|
||||
E1000_WRITE_FLUSH();
|
||||
|
||||
/* Disable the J/K bits required for receive */
|
||||
ctrl_aux = er32(CTL_AUX);
|
||||
ctrl_aux |= 0x4;
|
||||
ctrl_aux &= ~0x2;
|
||||
ew32(CTL_AUX, ctrl_aux);
|
||||
E1000_WRITE_FLUSH();
|
||||
ret_val = e1000_copper_link_rtl_setup(hw);
|
||||
|
||||
if (ret_val) {
|
||||
e_dbg("e1000_copper_link_rtl_setup failed!\n");
|
||||
return ret_val;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
e_dbg("Error Resetting the PHY\n");
|
||||
return E1000_ERR_PHY_TYPE;
|
||||
}
|
||||
|
||||
return E1000_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_copper_link_preconfig - early configuration for copper
|
||||
* @hw: Struct containing variables accessed by shared code
|
||||
@@ -1286,6 +1359,10 @@ static s32 e1000_copper_link_autoneg(struct e1000_hw *hw)
|
||||
if (hw->autoneg_advertised == 0)
|
||||
hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT;
|
||||
|
||||
/* IFE/RTL8201N PHY only supports 10/100 */
|
||||
if (hw->phy_type == e1000_phy_8201)
|
||||
hw->autoneg_advertised &= AUTONEG_ADVERTISE_10_100_ALL;
|
||||
|
||||
e_dbg("Reconfiguring auto-neg advertisement params\n");
|
||||
ret_val = e1000_phy_setup_autoneg(hw);
|
||||
if (ret_val) {
|
||||
@@ -1341,7 +1418,7 @@ static s32 e1000_copper_link_postconfig(struct e1000_hw *hw)
|
||||
s32 ret_val;
|
||||
e_dbg("e1000_copper_link_postconfig");
|
||||
|
||||
if (hw->mac_type >= e1000_82544) {
|
||||
if ((hw->mac_type >= e1000_82544) && (hw->mac_type != e1000_ce4100)) {
|
||||
e1000_config_collision_dist(hw);
|
||||
} else {
|
||||
ret_val = e1000_config_mac_to_phy(hw);
|
||||
@@ -1395,6 +1472,12 @@ static s32 e1000_setup_copper_link(struct e1000_hw *hw)
|
||||
ret_val = e1000_copper_link_mgp_setup(hw);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
} else {
|
||||
ret_val = gbe_dhg_phy_setup(hw);
|
||||
if (ret_val) {
|
||||
e_dbg("gbe_dhg_phy_setup failed!\n");
|
||||
return ret_val;
|
||||
}
|
||||
}
|
||||
|
||||
if (hw->autoneg) {
|
||||
@@ -1461,10 +1544,11 @@ s32 e1000_phy_setup_autoneg(struct e1000_hw *hw)
|
||||
return ret_val;
|
||||
|
||||
/* Read the MII 1000Base-T Control Register (Address 9). */
|
||||
ret_val =
|
||||
e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);
|
||||
ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
else if (hw->phy_type == e1000_phy_8201)
|
||||
mii_1000t_ctrl_reg &= ~REG9_SPEED_MASK;
|
||||
|
||||
/* Need to parse both autoneg_advertised and fc and set up
|
||||
* the appropriate PHY registers. First we will parse for
|
||||
@@ -1577,9 +1661,14 @@ s32 e1000_phy_setup_autoneg(struct e1000_hw *hw)
|
||||
|
||||
e_dbg("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg);
|
||||
|
||||
ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
if (hw->phy_type == e1000_phy_8201) {
|
||||
mii_1000t_ctrl_reg = 0;
|
||||
} else {
|
||||
ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL,
|
||||
mii_1000t_ctrl_reg);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
return E1000_SUCCESS;
|
||||
}
|
||||
@@ -1860,7 +1949,7 @@ static s32 e1000_config_mac_to_phy(struct e1000_hw *hw)
|
||||
|
||||
/* 82544 or newer MAC, Auto Speed Detection takes care of
|
||||
* MAC speed/duplex configuration.*/
|
||||
if (hw->mac_type >= e1000_82544)
|
||||
if ((hw->mac_type >= e1000_82544) && (hw->mac_type != e1000_ce4100))
|
||||
return E1000_SUCCESS;
|
||||
|
||||
/* Read the Device Control Register and set the bits to Force Speed
|
||||
@@ -1870,27 +1959,49 @@ static s32 e1000_config_mac_to_phy(struct e1000_hw *hw)
|
||||
ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
|
||||
ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS);
|
||||
|
||||
/* Set up duplex in the Device Control and Transmit Control
|
||||
* registers depending on negotiated values.
|
||||
*/
|
||||
ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
switch (hw->phy_type) {
|
||||
case e1000_phy_8201:
|
||||
ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
if (phy_data & M88E1000_PSSR_DPLX)
|
||||
ctrl |= E1000_CTRL_FD;
|
||||
else
|
||||
ctrl &= ~E1000_CTRL_FD;
|
||||
if (phy_data & RTL_PHY_CTRL_FD)
|
||||
ctrl |= E1000_CTRL_FD;
|
||||
else
|
||||
ctrl &= ~E1000_CTRL_FD;
|
||||
|
||||
e1000_config_collision_dist(hw);
|
||||
if (phy_data & RTL_PHY_CTRL_SPD_100)
|
||||
ctrl |= E1000_CTRL_SPD_100;
|
||||
else
|
||||
ctrl |= E1000_CTRL_SPD_10;
|
||||
|
||||
/* Set up speed in the Device Control register depending on
|
||||
* negotiated values.
|
||||
*/
|
||||
if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS)
|
||||
ctrl |= E1000_CTRL_SPD_1000;
|
||||
else if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS)
|
||||
ctrl |= E1000_CTRL_SPD_100;
|
||||
e1000_config_collision_dist(hw);
|
||||
break;
|
||||
default:
|
||||
/* Set up duplex in the Device Control and Transmit Control
|
||||
* registers depending on negotiated values.
|
||||
*/
|
||||
ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS,
|
||||
&phy_data);
|
||||
if (ret_val)
|
||||
return ret_val;
|
||||
|
||||
if (phy_data & M88E1000_PSSR_DPLX)
|
||||
ctrl |= E1000_CTRL_FD;
|
||||
else
|
||||
ctrl &= ~E1000_CTRL_FD;
|
||||
|
||||
e1000_config_collision_dist(hw);
|
||||
|
||||
/* Set up speed in the Device Control register depending on
|
||||
* negotiated values.
|
||||
*/
|
||||
if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS)
|
||||
ctrl |= E1000_CTRL_SPD_1000;
|
||||
else if ((phy_data & M88E1000_PSSR_SPEED) ==
|
||||
M88E1000_PSSR_100MBS)
|
||||
ctrl |= E1000_CTRL_SPD_100;
|
||||
}
|
||||
|
||||
/* Write the configured values back to the Device Control Reg. */
|
||||
ew32(CTRL, ctrl);
|
||||
@@ -2401,7 +2512,8 @@ s32 e1000_check_for_link(struct e1000_hw *hw)
|
||||
* speed/duplex on the MAC to the current PHY speed/duplex
|
||||
* settings.
|
||||
*/
|
||||
if (hw->mac_type >= e1000_82544)
|
||||
if ((hw->mac_type >= e1000_82544) &&
|
||||
(hw->mac_type != e1000_ce4100))
|
||||
e1000_config_collision_dist(hw);
|
||||
else {
|
||||
ret_val = e1000_config_mac_to_phy(hw);
|
||||
@@ -2738,7 +2850,7 @@ static s32 e1000_read_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
|
||||
{
|
||||
u32 i;
|
||||
u32 mdic = 0;
|
||||
const u32 phy_addr = 1;
|
||||
const u32 phy_addr = (hw->mac_type == e1000_ce4100) ? hw->phy_addr : 1;
|
||||
|
||||
e_dbg("e1000_read_phy_reg_ex");
|
||||
|
||||
@@ -2752,28 +2864,61 @@ static s32 e1000_read_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
|
||||
* Control register. The MAC will take care of interfacing with the
|
||||
* PHY to retrieve the desired data.
|
||||
*/
|
||||
mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) |
|
||||
(phy_addr << E1000_MDIC_PHY_SHIFT) |
|
||||
(E1000_MDIC_OP_READ));
|
||||
if (hw->mac_type == e1000_ce4100) {
|
||||
mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) |
|
||||
(phy_addr << E1000_MDIC_PHY_SHIFT) |
|
||||
(INTEL_CE_GBE_MDIC_OP_READ) |
|
||||
(INTEL_CE_GBE_MDIC_GO));
|
||||
|
||||
ew32(MDIC, mdic);
|
||||
writel(mdic, E1000_MDIO_CMD);
|
||||
|
||||
/* Poll the ready bit to see if the MDI read completed */
|
||||
for (i = 0; i < 64; i++) {
|
||||
udelay(50);
|
||||
mdic = er32(MDIC);
|
||||
if (mdic & E1000_MDIC_READY)
|
||||
break;
|
||||
/* Poll the ready bit to see if the MDI read
|
||||
* completed
|
||||
*/
|
||||
for (i = 0; i < 64; i++) {
|
||||
udelay(50);
|
||||
mdic = readl(E1000_MDIO_CMD);
|
||||
if (!(mdic & INTEL_CE_GBE_MDIC_GO))
|
||||
break;
|
||||
}
|
||||
|
||||
if (mdic & INTEL_CE_GBE_MDIC_GO) {
|
||||
e_dbg("MDI Read did not complete\n");
|
||||
return -E1000_ERR_PHY;
|
||||
}
|
||||
|
||||
mdic = readl(E1000_MDIO_STS);
|
||||
if (mdic & INTEL_CE_GBE_MDIC_READ_ERROR) {
|
||||
e_dbg("MDI Read Error\n");
|
||||
return -E1000_ERR_PHY;
|
||||
}
|
||||
*phy_data = (u16) mdic;
|
||||
} else {
|
||||
mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) |
|
||||
(phy_addr << E1000_MDIC_PHY_SHIFT) |
|
||||
(E1000_MDIC_OP_READ));
|
||||
|
||||
ew32(MDIC, mdic);
|
||||
|
||||
/* Poll the ready bit to see if the MDI read
|
||||
* completed
|
||||
*/
|
||||
for (i = 0; i < 64; i++) {
|
||||
udelay(50);
|
||||
mdic = er32(MDIC);
|
||||
if (mdic & E1000_MDIC_READY)
|
||||
break;
|
||||
}
|
||||
if (!(mdic & E1000_MDIC_READY)) {
|
||||
e_dbg("MDI Read did not complete\n");
|
||||
return -E1000_ERR_PHY;
|
||||
}
|
||||
if (mdic & E1000_MDIC_ERROR) {
|
||||
e_dbg("MDI Error\n");
|
||||
return -E1000_ERR_PHY;
|
||||
}
|
||||
*phy_data = (u16) mdic;
|
||||
}
|
||||
if (!(mdic & E1000_MDIC_READY)) {
|
||||
e_dbg("MDI Read did not complete\n");
|
||||
return -E1000_ERR_PHY;
|
||||
}
|
||||
if (mdic & E1000_MDIC_ERROR) {
|
||||
e_dbg("MDI Error\n");
|
||||
return -E1000_ERR_PHY;
|
||||
}
|
||||
*phy_data = (u16) mdic;
|
||||
} else {
|
||||
/* We must first send a preamble through the MDIO pin to signal the
|
||||
* beginning of an MII instruction. This is done by sending 32
|
||||
@@ -2840,7 +2985,7 @@ static s32 e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
|
||||
{
|
||||
u32 i;
|
||||
u32 mdic = 0;
|
||||
const u32 phy_addr = 1;
|
||||
const u32 phy_addr = (hw->mac_type == e1000_ce4100) ? hw->phy_addr : 1;
|
||||
|
||||
e_dbg("e1000_write_phy_reg_ex");
|
||||
|
||||
@@ -2850,27 +2995,54 @@ static s32 e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr,
|
||||
}
|
||||
|
||||
if (hw->mac_type > e1000_82543) {
|
||||
/* Set up Op-code, Phy Address, register address, and data intended
|
||||
* for the PHY register in the MDI Control register. The MAC will take
|
||||
* care of interfacing with the PHY to send the desired data.
|
||||
/* Set up Op-code, Phy Address, register address, and data
|
||||
* intended for the PHY register in the MDI Control register.
|
||||
* The MAC will take care of interfacing with the PHY to send
|
||||
* the desired data.
|
||||
*/
|
||||
mdic = (((u32) phy_data) |
|
||||
(reg_addr << E1000_MDIC_REG_SHIFT) |
|
||||
(phy_addr << E1000_MDIC_PHY_SHIFT) |
|
||||
(E1000_MDIC_OP_WRITE));
|
||||
if (hw->mac_type == e1000_ce4100) {
|
||||
mdic = (((u32) phy_data) |
|
||||
(reg_addr << E1000_MDIC_REG_SHIFT) |
|
||||
(phy_addr << E1000_MDIC_PHY_SHIFT) |
|
||||
(INTEL_CE_GBE_MDIC_OP_WRITE) |
|
||||
(INTEL_CE_GBE_MDIC_GO));
|
||||
|
||||
ew32(MDIC, mdic);
|
||||
writel(mdic, E1000_MDIO_CMD);
|
||||
|
||||
/* Poll the ready bit to see if the MDI read completed */
|
||||
for (i = 0; i < 641; i++) {
|
||||
udelay(5);
|
||||
mdic = er32(MDIC);
|
||||
if (mdic & E1000_MDIC_READY)
|
||||
break;
|
||||
}
|
||||
if (!(mdic & E1000_MDIC_READY)) {
|
||||
e_dbg("MDI Write did not complete\n");
|
||||
return -E1000_ERR_PHY;
|
||||
/* Poll the ready bit to see if the MDI read
|
||||
* completed
|
||||
*/
|
||||
for (i = 0; i < 640; i++) {
|
||||
udelay(5);
|
||||
mdic = readl(E1000_MDIO_CMD);
|
||||
if (!(mdic & INTEL_CE_GBE_MDIC_GO))
|
||||
break;
|
||||
}
|
||||
if (mdic & INTEL_CE_GBE_MDIC_GO) {
|
||||
e_dbg("MDI Write did not complete\n");
|
||||
return -E1000_ERR_PHY;
|
||||
}
|
||||
} else {
|
||||
mdic = (((u32) phy_data) |
|
||||
(reg_addr << E1000_MDIC_REG_SHIFT) |
|
||||
(phy_addr << E1000_MDIC_PHY_SHIFT) |
|
||||
(E1000_MDIC_OP_WRITE));
|
||||
|
||||
ew32(MDIC, mdic);
|
||||
|
||||
/* Poll the ready bit to see if the MDI read
|
||||
* completed
|
||||
*/
|
||||
for (i = 0; i < 641; i++) {
|
||||
udelay(5);
|
||||
mdic = er32(MDIC);
|
||||
if (mdic & E1000_MDIC_READY)
|
||||
break;
|
||||
}
|
||||
if (!(mdic & E1000_MDIC_READY)) {
|
||||
e_dbg("MDI Write did not complete\n");
|
||||
return -E1000_ERR_PHY;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* We'll need to use the SW defined pins to shift the write command
|
||||
@@ -3048,6 +3220,11 @@ static s32 e1000_detect_gig_phy(struct e1000_hw *hw)
|
||||
if (hw->phy_id == M88E1011_I_PHY_ID)
|
||||
match = true;
|
||||
break;
|
||||
case e1000_ce4100:
|
||||
if ((hw->phy_id == RTL8211B_PHY_ID) ||
|
||||
(hw->phy_id == RTL8201N_PHY_ID))
|
||||
match = true;
|
||||
break;
|
||||
case e1000_82541:
|
||||
case e1000_82541_rev_2:
|
||||
case e1000_82547:
|
||||
@@ -3291,6 +3468,9 @@ s32 e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info)
|
||||
|
||||
if (hw->phy_type == e1000_phy_igp)
|
||||
return e1000_phy_igp_get_info(hw, phy_info);
|
||||
else if ((hw->phy_type == e1000_phy_8211) ||
|
||||
(hw->phy_type == e1000_phy_8201))
|
||||
return E1000_SUCCESS;
|
||||
else
|
||||
return e1000_phy_m88_get_info(hw, phy_info);
|
||||
}
|
||||
@@ -3742,6 +3922,12 @@ static s32 e1000_do_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words,
|
||||
|
||||
e_dbg("e1000_read_eeprom");
|
||||
|
||||
if (hw->mac_type == e1000_ce4100) {
|
||||
GBE_CONFIG_FLASH_READ(GBE_CONFIG_BASE_VIRT, offset, words,
|
||||
data);
|
||||
return E1000_SUCCESS;
|
||||
}
|
||||
|
||||
/* If eeprom is not yet detected, do so now */
|
||||
if (eeprom->word_size == 0)
|
||||
e1000_init_eeprom_params(hw);
|
||||
@@ -3904,6 +4090,12 @@ static s32 e1000_do_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words,
|
||||
|
||||
e_dbg("e1000_write_eeprom");
|
||||
|
||||
if (hw->mac_type == e1000_ce4100) {
|
||||
GBE_CONFIG_FLASH_WRITE(GBE_CONFIG_BASE_VIRT, offset, words,
|
||||
data);
|
||||
return E1000_SUCCESS;
|
||||
}
|
||||
|
||||
/* If eeprom is not yet detected, do so now */
|
||||
if (eeprom->word_size == 0)
|
||||
e1000_init_eeprom_params(hw);
|
||||
|
||||
@@ -52,6 +52,7 @@ typedef enum {
|
||||
e1000_82545,
|
||||
e1000_82545_rev_3,
|
||||
e1000_82546,
|
||||
e1000_ce4100,
|
||||
e1000_82546_rev_3,
|
||||
e1000_82541,
|
||||
e1000_82541_rev_2,
|
||||
@@ -209,9 +210,11 @@ typedef enum {
|
||||
} e1000_1000t_rx_status;
|
||||
|
||||
typedef enum {
|
||||
e1000_phy_m88 = 0,
|
||||
e1000_phy_igp,
|
||||
e1000_phy_undefined = 0xFF
|
||||
e1000_phy_m88 = 0,
|
||||
e1000_phy_igp,
|
||||
e1000_phy_8211,
|
||||
e1000_phy_8201,
|
||||
e1000_phy_undefined = 0xFF
|
||||
} e1000_phy_type;
|
||||
|
||||
typedef enum {
|
||||
@@ -442,6 +445,7 @@ void e1000_io_write(struct e1000_hw *hw, unsigned long port, u32 value);
|
||||
#define E1000_DEV_ID_82547EI 0x1019
|
||||
#define E1000_DEV_ID_82547EI_MOBILE 0x101A
|
||||
#define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5
|
||||
#define E1000_DEV_ID_INTEL_CE4100_GBE 0x2E6E
|
||||
|
||||
#define NODE_ADDRESS_SIZE 6
|
||||
#define ETH_LENGTH_OF_ADDRESS 6
|
||||
@@ -808,6 +812,16 @@ struct e1000_ffvt_entry {
|
||||
#define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */
|
||||
#define E1000_FLA 0x0001C /* Flash Access - RW */
|
||||
#define E1000_MDIC 0x00020 /* MDI Control - RW */
|
||||
|
||||
extern void __iomem *ce4100_gbe_mdio_base_virt;
|
||||
#define INTEL_CE_GBE_MDIO_RCOMP_BASE (ce4100_gbe_mdio_base_virt)
|
||||
#define E1000_MDIO_STS (INTEL_CE_GBE_MDIO_RCOMP_BASE + 0)
|
||||
#define E1000_MDIO_CMD (INTEL_CE_GBE_MDIO_RCOMP_BASE + 4)
|
||||
#define E1000_MDIO_DRV (INTEL_CE_GBE_MDIO_RCOMP_BASE + 8)
|
||||
#define E1000_MDC_CMD (INTEL_CE_GBE_MDIO_RCOMP_BASE + 0xC)
|
||||
#define E1000_RCOMP_CTL (INTEL_CE_GBE_MDIO_RCOMP_BASE + 0x20)
|
||||
#define E1000_RCOMP_STS (INTEL_CE_GBE_MDIO_RCOMP_BASE + 0x24)
|
||||
|
||||
#define E1000_SCTL 0x00024 /* SerDes Control - RW */
|
||||
#define E1000_FEXTNVM 0x00028 /* Future Extended NVM register */
|
||||
#define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */
|
||||
@@ -820,6 +834,34 @@ struct e1000_ffvt_entry {
|
||||
#define E1000_IMS 0x000D0 /* Interrupt Mask Set - RW */
|
||||
#define E1000_IMC 0x000D8 /* Interrupt Mask Clear - WO */
|
||||
#define E1000_IAM 0x000E0 /* Interrupt Acknowledge Auto Mask */
|
||||
|
||||
/* Auxiliary Control Register. This register is CE4100 specific,
|
||||
* RMII/RGMII function is switched by this register - RW
|
||||
* Following are bits definitions of the Auxiliary Control Register
|
||||
*/
|
||||
#define E1000_CTL_AUX 0x000E0
|
||||
#define E1000_CTL_AUX_END_SEL_SHIFT 10
|
||||
#define E1000_CTL_AUX_ENDIANESS_SHIFT 8
|
||||
#define E1000_CTL_AUX_RGMII_RMII_SHIFT 0
|
||||
|
||||
/* descriptor and packet transfer use CTL_AUX.ENDIANESS */
|
||||
#define E1000_CTL_AUX_DES_PKT (0x0 << E1000_CTL_AUX_END_SEL_SHIFT)
|
||||
/* descriptor use CTL_AUX.ENDIANESS, packet use default */
|
||||
#define E1000_CTL_AUX_DES (0x1 << E1000_CTL_AUX_END_SEL_SHIFT)
|
||||
/* descriptor use default, packet use CTL_AUX.ENDIANESS */
|
||||
#define E1000_CTL_AUX_PKT (0x2 << E1000_CTL_AUX_END_SEL_SHIFT)
|
||||
/* all use CTL_AUX.ENDIANESS */
|
||||
#define E1000_CTL_AUX_ALL (0x3 << E1000_CTL_AUX_END_SEL_SHIFT)
|
||||
|
||||
#define E1000_CTL_AUX_RGMII (0x0 << E1000_CTL_AUX_RGMII_RMII_SHIFT)
|
||||
#define E1000_CTL_AUX_RMII (0x1 << E1000_CTL_AUX_RGMII_RMII_SHIFT)
|
||||
|
||||
/* LW little endian, Byte big endian */
|
||||
#define E1000_CTL_AUX_LWLE_BBE (0x0 << E1000_CTL_AUX_ENDIANESS_SHIFT)
|
||||
#define E1000_CTL_AUX_LWLE_BLE (0x1 << E1000_CTL_AUX_ENDIANESS_SHIFT)
|
||||
#define E1000_CTL_AUX_LWBE_BBE (0x2 << E1000_CTL_AUX_ENDIANESS_SHIFT)
|
||||
#define E1000_CTL_AUX_LWBE_BLE (0x3 << E1000_CTL_AUX_ENDIANESS_SHIFT)
|
||||
|
||||
#define E1000_RCTL 0x00100 /* RX Control - RW */
|
||||
#define E1000_RDTR1 0x02820 /* RX Delay Timer (1) - RW */
|
||||
#define E1000_RDBAL1 0x02900 /* RX Descriptor Base Address Low (1) - RW */
|
||||
@@ -1011,6 +1053,7 @@ struct e1000_ffvt_entry {
|
||||
* in more current versions of the 8254x. Despite the difference in location,
|
||||
* the registers function in the same manner.
|
||||
*/
|
||||
#define E1000_82542_CTL_AUX E1000_CTL_AUX
|
||||
#define E1000_82542_CTRL E1000_CTRL
|
||||
#define E1000_82542_CTRL_DUP E1000_CTRL_DUP
|
||||
#define E1000_82542_STATUS E1000_STATUS
|
||||
@@ -1571,6 +1614,11 @@ struct e1000_hw {
|
||||
#define E1000_MDIC_INT_EN 0x20000000
|
||||
#define E1000_MDIC_ERROR 0x40000000
|
||||
|
||||
#define INTEL_CE_GBE_MDIC_OP_WRITE 0x04000000
|
||||
#define INTEL_CE_GBE_MDIC_OP_READ 0x00000000
|
||||
#define INTEL_CE_GBE_MDIC_GO 0x80000000
|
||||
#define INTEL_CE_GBE_MDIC_READ_ERROR 0x80000000
|
||||
|
||||
#define E1000_KUMCTRLSTA_MASK 0x0000FFFF
|
||||
#define E1000_KUMCTRLSTA_OFFSET 0x001F0000
|
||||
#define E1000_KUMCTRLSTA_OFFSET_SHIFT 16
|
||||
@@ -2871,6 +2919,11 @@ struct e1000_host_command_info {
|
||||
#define M88E1111_I_PHY_ID 0x01410CC0
|
||||
#define L1LXT971A_PHY_ID 0x001378E0
|
||||
|
||||
#define RTL8211B_PHY_ID 0x001CC910
|
||||
#define RTL8201N_PHY_ID 0x8200
|
||||
#define RTL_PHY_CTRL_FD 0x0100 /* Full duplex.0=half; 1=full */
|
||||
#define RTL_PHY_CTRL_SPD_100 0x200000 /* Force 100Mb */
|
||||
|
||||
/* Bits...
|
||||
* 15-5: page
|
||||
* 4-0: register offset
|
||||
|
||||
@@ -28,6 +28,12 @@
|
||||
|
||||
#include "e1000.h"
|
||||
#include <net/ip6_checksum.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
/* Intel Media SOC GbE MDIO physical base address */
|
||||
static unsigned long ce4100_gbe_mdio_base_phy;
|
||||
/* Intel Media SOC GbE MDIO virtual base address */
|
||||
void __iomem *ce4100_gbe_mdio_base_virt;
|
||||
|
||||
char e1000_driver_name[] = "e1000";
|
||||
static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
|
||||
@@ -79,6 +85,7 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x108A),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x1099),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x10B5),
|
||||
INTEL_E1000_ETHERNET_DEVICE(0x2E6E),
|
||||
/* required last entry */
|
||||
{0,}
|
||||
};
|
||||
@@ -459,6 +466,7 @@ static void e1000_power_down_phy(struct e1000_adapter *adapter)
|
||||
case e1000_82545:
|
||||
case e1000_82545_rev_3:
|
||||
case e1000_82546:
|
||||
case e1000_ce4100:
|
||||
case e1000_82546_rev_3:
|
||||
case e1000_82541:
|
||||
case e1000_82541_rev_2:
|
||||
@@ -573,6 +581,7 @@ void e1000_reset(struct e1000_adapter *adapter)
|
||||
case e1000_82545:
|
||||
case e1000_82545_rev_3:
|
||||
case e1000_82546:
|
||||
case e1000_ce4100:
|
||||
case e1000_82546_rev_3:
|
||||
pba = E1000_PBA_48K;
|
||||
break;
|
||||
@@ -894,6 +903,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
||||
static int global_quad_port_a = 0; /* global ksp3 port a indication */
|
||||
int i, err, pci_using_dac;
|
||||
u16 eeprom_data = 0;
|
||||
u16 tmp = 0;
|
||||
u16 eeprom_apme_mask = E1000_EEPROM_APME;
|
||||
int bars, need_ioport;
|
||||
|
||||
@@ -996,6 +1006,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
||||
goto err_sw_init;
|
||||
|
||||
err = -EIO;
|
||||
if (hw->mac_type == e1000_ce4100) {
|
||||
ce4100_gbe_mdio_base_phy = pci_resource_start(pdev, BAR_1);
|
||||
ce4100_gbe_mdio_base_virt = ioremap(ce4100_gbe_mdio_base_phy,
|
||||
pci_resource_len(pdev, BAR_1));
|
||||
|
||||
if (!ce4100_gbe_mdio_base_virt)
|
||||
goto err_mdio_ioremap;
|
||||
}
|
||||
|
||||
if (hw->mac_type >= e1000_82543) {
|
||||
netdev->features = NETIF_F_SG |
|
||||
@@ -1135,6 +1153,20 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
||||
adapter->wol = adapter->eeprom_wol;
|
||||
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
||||
|
||||
/* Auto detect PHY address */
|
||||
if (hw->mac_type == e1000_ce4100) {
|
||||
for (i = 0; i < 32; i++) {
|
||||
hw->phy_addr = i;
|
||||
e1000_read_phy_reg(hw, PHY_ID2, &tmp);
|
||||
if (tmp == 0 || tmp == 0xFF) {
|
||||
if (i == 31)
|
||||
goto err_eeprom;
|
||||
continue;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* reset the hardware with the new settings */
|
||||
e1000_reset(adapter);
|
||||
|
||||
@@ -1171,6 +1203,8 @@ err_eeprom:
|
||||
kfree(adapter->rx_ring);
|
||||
err_dma:
|
||||
err_sw_init:
|
||||
err_mdio_ioremap:
|
||||
iounmap(ce4100_gbe_mdio_base_virt);
|
||||
iounmap(hw->hw_addr);
|
||||
err_ioremap:
|
||||
free_netdev(netdev);
|
||||
@@ -1409,6 +1443,7 @@ static bool e1000_check_64k_bound(struct e1000_adapter *adapter, void *start,
|
||||
/* First rev 82545 and 82546 need to not allow any memory
|
||||
* write location to cross 64k boundary due to errata 23 */
|
||||
if (hw->mac_type == e1000_82545 ||
|
||||
hw->mac_type == e1000_ce4100 ||
|
||||
hw->mac_type == e1000_82546) {
|
||||
return ((begin ^ (end - 1)) >> 16) != 0 ? false : true;
|
||||
}
|
||||
|
||||
@@ -34,12 +34,21 @@
|
||||
#ifndef _E1000_OSDEP_H_
|
||||
#define _E1000_OSDEP_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#define CONFIG_RAM_BASE 0x60000
|
||||
#define GBE_CONFIG_OFFSET 0x0
|
||||
|
||||
#define GBE_CONFIG_RAM_BASE \
|
||||
((unsigned int)(CONFIG_RAM_BASE + GBE_CONFIG_OFFSET))
|
||||
|
||||
#define GBE_CONFIG_BASE_VIRT phys_to_virt(GBE_CONFIG_RAM_BASE)
|
||||
|
||||
#define GBE_CONFIG_FLASH_WRITE(base, offset, count, data) \
|
||||
(iowrite16_rep(base + offset, data, count))
|
||||
|
||||
#define GBE_CONFIG_FLASH_READ(base, offset, count, data) \
|
||||
(ioread16_rep(base + (offset << 1), data, count))
|
||||
|
||||
#define er32(reg) \
|
||||
(readl(hw->hw_addr + ((hw->mac_type >= e1000_82543) \
|
||||
|
||||
@@ -78,6 +78,8 @@ static void e1000_power_down_phy_copper_82571(struct e1000_hw *hw);
|
||||
static void e1000_put_hw_semaphore_82573(struct e1000_hw *hw);
|
||||
static s32 e1000_get_hw_semaphore_82574(struct e1000_hw *hw);
|
||||
static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw);
|
||||
static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active);
|
||||
static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active);
|
||||
|
||||
/**
|
||||
* e1000_init_phy_params_82571 - Init PHY func ptrs.
|
||||
@@ -113,6 +115,8 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw)
|
||||
phy->type = e1000_phy_bm;
|
||||
phy->ops.acquire = e1000_get_hw_semaphore_82574;
|
||||
phy->ops.release = e1000_put_hw_semaphore_82574;
|
||||
phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82574;
|
||||
phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_82574;
|
||||
break;
|
||||
default:
|
||||
return -E1000_ERR_PHY;
|
||||
@@ -121,29 +125,36 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw)
|
||||
|
||||
/* This can only be done after all function pointers are setup. */
|
||||
ret_val = e1000_get_phy_id_82571(hw);
|
||||
if (ret_val) {
|
||||
e_dbg("Error getting PHY ID\n");
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/* Verify phy id */
|
||||
switch (hw->mac.type) {
|
||||
case e1000_82571:
|
||||
case e1000_82572:
|
||||
if (phy->id != IGP01E1000_I_PHY_ID)
|
||||
return -E1000_ERR_PHY;
|
||||
ret_val = -E1000_ERR_PHY;
|
||||
break;
|
||||
case e1000_82573:
|
||||
if (phy->id != M88E1111_I_PHY_ID)
|
||||
return -E1000_ERR_PHY;
|
||||
ret_val = -E1000_ERR_PHY;
|
||||
break;
|
||||
case e1000_82574:
|
||||
case e1000_82583:
|
||||
if (phy->id != BME1000_E_PHY_ID_R2)
|
||||
return -E1000_ERR_PHY;
|
||||
ret_val = -E1000_ERR_PHY;
|
||||
break;
|
||||
default:
|
||||
return -E1000_ERR_PHY;
|
||||
ret_val = -E1000_ERR_PHY;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (ret_val)
|
||||
e_dbg("PHY ID unknown: type = 0x%08x\n", phy->id);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -648,6 +659,58 @@ static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw)
|
||||
mutex_unlock(&swflag_mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_set_d0_lplu_state_82574 - Set Low Power Linkup D0 state
|
||||
* @hw: pointer to the HW structure
|
||||
* @active: true to enable LPLU, false to disable
|
||||
*
|
||||
* Sets the LPLU D0 state according to the active flag.
|
||||
* LPLU will not be activated unless the
|
||||
* device autonegotiation advertisement meets standards of
|
||||
* either 10 or 10/100 or 10/100/1000 at all duplexes.
|
||||
* This is a function pointer entry point only called by
|
||||
* PHY setup routines.
|
||||
**/
|
||||
static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active)
|
||||
{
|
||||
u16 data = er32(POEMB);
|
||||
|
||||
if (active)
|
||||
data |= E1000_PHY_CTRL_D0A_LPLU;
|
||||
else
|
||||
data &= ~E1000_PHY_CTRL_D0A_LPLU;
|
||||
|
||||
ew32(POEMB, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_set_d3_lplu_state_82574 - Sets low power link up state for D3
|
||||
* @hw: pointer to the HW structure
|
||||
* @active: boolean used to enable/disable lplu
|
||||
*
|
||||
* The low power link up (lplu) state is set to the power management level D3
|
||||
* when active is true, else clear lplu for D3. LPLU
|
||||
* is used during Dx states where the power conservation is most important.
|
||||
* During driver activity, SmartSpeed should be enabled so performance is
|
||||
* maintained.
|
||||
**/
|
||||
static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active)
|
||||
{
|
||||
u16 data = er32(POEMB);
|
||||
|
||||
if (!active) {
|
||||
data &= ~E1000_PHY_CTRL_NOND0A_LPLU;
|
||||
} else if ((hw->phy.autoneg_advertised == E1000_ALL_SPEED_DUPLEX) ||
|
||||
(hw->phy.autoneg_advertised == E1000_ALL_NOT_GIG) ||
|
||||
(hw->phy.autoneg_advertised == E1000_ALL_10_SPEED)) {
|
||||
data |= E1000_PHY_CTRL_NOND0A_LPLU;
|
||||
}
|
||||
|
||||
ew32(POEMB, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_acquire_nvm_82571 - Request for access to the EEPROM
|
||||
* @hw: pointer to the HW structure
|
||||
@@ -956,7 +1019,7 @@ static s32 e1000_set_d0_lplu_state_82571(struct e1000_hw *hw, bool active)
|
||||
**/
|
||||
static s32 e1000_reset_hw_82571(struct e1000_hw *hw)
|
||||
{
|
||||
u32 ctrl, ctrl_ext, icr;
|
||||
u32 ctrl, ctrl_ext;
|
||||
s32 ret_val;
|
||||
|
||||
/*
|
||||
@@ -1040,7 +1103,7 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw)
|
||||
|
||||
/* Clear any pending interrupt events. */
|
||||
ew32(IMC, 0xffffffff);
|
||||
icr = er32(ICR);
|
||||
er32(ICR);
|
||||
|
||||
if (hw->mac.type == e1000_82571) {
|
||||
/* Install any alternate MAC address into RAR0 */
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci-aspm.h>
|
||||
#include <linux/crc32.h>
|
||||
|
||||
#include "hw.h"
|
||||
|
||||
@@ -496,6 +497,8 @@ extern void e1000e_free_tx_resources(struct e1000_adapter *adapter);
|
||||
extern void e1000e_update_stats(struct e1000_adapter *adapter);
|
||||
extern void e1000e_set_interrupt_capability(struct e1000_adapter *adapter);
|
||||
extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter);
|
||||
extern void e1000e_get_hw_control(struct e1000_adapter *adapter);
|
||||
extern void e1000e_release_hw_control(struct e1000_adapter *adapter);
|
||||
extern void e1000e_disable_aspm(struct pci_dev *pdev, u16 state);
|
||||
|
||||
extern unsigned int copybreak;
|
||||
|
||||
Loaded 20 of 109 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user