diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-11 19:32:41 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-11 19:32:41 -0500 |
| commit | 4162cf64973df51fc885825bc9ca4d055891c49f (patch) | |
| tree | f218c7bd298f4d41be94d08a314eb9fbc3fcb4ea | |
| parent | fb7b5a956992fdc53d0b9c8ea29b51b92839dc1b (diff) | |
| parent | 343a8d13aae58dec562dbb5c7d48a53e9b847871 (diff) | |
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
...
109 files changed, 2901 insertions, 1867 deletions
diff --git a/Documentation/networking/dccp.txt b/Documentation/networking/dccp.txt index b395ca6a49f2..811872b45bee 100644 --- a/Documentation/networking/dccp.txt +++ b/Documentation/networking/dccp.txt | |||
| @@ -167,6 +167,7 @@ rx_ccid = 2 | |||
| 167 | seq_window = 100 | 167 | seq_window = 100 |
| 168 | The initial sequence window (sec. 7.5.2) of the sender. This influences | 168 | The initial sequence window (sec. 7.5.2) of the sender. This influences |
| 169 | the local ackno validity and the remote seqno validity windows (7.5.1). | 169 | the local ackno validity and the remote seqno validity windows (7.5.1). |
| 170 | Values in the range Wmin = 32 (RFC 4340, 7.5.2) up to 2^32-1 can be set. | ||
| 170 | 171 | ||
| 171 | tx_qlen = 5 | 172 | tx_qlen = 5 |
| 172 | The size of the transmit buffer in packets. A value of 0 corresponds | 173 | The size of the transmit buffer in packets. A value of 0 corresponds |
diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c index ffe9b655292e..9f47e8625266 100644 --- a/drivers/atm/ambassador.c +++ b/drivers/atm/ambassador.c | |||
| @@ -1926,8 +1926,9 @@ static int __devinit ucode_init (loader_block * lb, amb_dev * dev) { | |||
| 1926 | const struct firmware *fw; | 1926 | const struct firmware *fw; |
| 1927 | unsigned long start_address; | 1927 | unsigned long start_address; |
| 1928 | const struct ihex_binrec *rec; | 1928 | const struct ihex_binrec *rec; |
| 1929 | const char *errmsg = 0; | ||
| 1929 | int res; | 1930 | int res; |
| 1930 | 1931 | ||
| 1931 | res = request_ihex_firmware(&fw, "atmsar11.fw", &dev->pci_dev->dev); | 1932 | res = request_ihex_firmware(&fw, "atmsar11.fw", &dev->pci_dev->dev); |
| 1932 | if (res) { | 1933 | if (res) { |
| 1933 | PRINTK (KERN_ERR, "Cannot load microcode data"); | 1934 | PRINTK (KERN_ERR, "Cannot load microcode data"); |
| @@ -1937,8 +1938,8 @@ static int __devinit ucode_init (loader_block * lb, amb_dev * dev) { | |||
| 1937 | /* First record contains just the start address */ | 1938 | /* First record contains just the start address */ |
| 1938 | rec = (const struct ihex_binrec *)fw->data; | 1939 | rec = (const struct ihex_binrec *)fw->data; |
| 1939 | if (be16_to_cpu(rec->len) != sizeof(__be32) || be32_to_cpu(rec->addr)) { | 1940 | if (be16_to_cpu(rec->len) != sizeof(__be32) || be32_to_cpu(rec->addr)) { |
| 1940 | PRINTK (KERN_ERR, "Bad microcode data (no start record)"); | 1941 | errmsg = "no start record"; |
| 1941 | return -EINVAL; | 1942 | goto fail; |
| 1942 | } | 1943 | } |
| 1943 | start_address = be32_to_cpup((__be32 *)rec->data); | 1944 | start_address = be32_to_cpup((__be32 *)rec->data); |
| 1944 | 1945 | ||
| @@ -1950,12 +1951,12 @@ static int __devinit ucode_init (loader_block * lb, amb_dev * dev) { | |||
| 1950 | PRINTD (DBG_LOAD, "starting region (%x, %u)", be32_to_cpu(rec->addr), | 1951 | PRINTD (DBG_LOAD, "starting region (%x, %u)", be32_to_cpu(rec->addr), |
| 1951 | be16_to_cpu(rec->len)); | 1952 | be16_to_cpu(rec->len)); |
| 1952 | if (be16_to_cpu(rec->len) > 4 * MAX_TRANSFER_DATA) { | 1953 | if (be16_to_cpu(rec->len) > 4 * MAX_TRANSFER_DATA) { |
| 1953 | PRINTK (KERN_ERR, "Bad microcode data (record too long)"); | 1954 | errmsg = "record too long"; |
| 1954 | return -EINVAL; | 1955 | goto fail; |
| 1955 | } | 1956 | } |
| 1956 | if (be16_to_cpu(rec->len) & 3) { | 1957 | if (be16_to_cpu(rec->len) & 3) { |
| 1957 | PRINTK (KERN_ERR, "Bad microcode data (odd number of bytes)"); | 1958 | errmsg = "odd number of bytes"; |
| 1958 | return -EINVAL; | 1959 | goto fail; |
| 1959 | } | 1960 | } |
| 1960 | res = loader_write(lb, dev, rec); | 1961 | res = loader_write(lb, dev, rec); |
| 1961 | if (res) | 1962 | if (res) |
| @@ -1970,6 +1971,10 @@ static int __devinit ucode_init (loader_block * lb, amb_dev * dev) { | |||
| 1970 | res = loader_start(lb, dev, start_address); | 1971 | res = loader_start(lb, dev, start_address); |
| 1971 | 1972 | ||
| 1972 | return res; | 1973 | return res; |
| 1974 | fail: | ||
| 1975 | release_firmware(fw); | ||
| 1976 | PRINTK(KERN_ERR, "Bad microcode data (%s)", errmsg); | ||
| 1977 | return -EINVAL; | ||
| 1973 | } | 1978 | } |
| 1974 | 1979 | ||
| 1975 | /********** give adapter parameters **********/ | 1980 | /********** give adapter parameters **********/ |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 3fda24a28d2f..ff652c77a0a5 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -1944,19 +1944,12 @@ config 68360_ENET | |||
| 1944 | config FEC | 1944 | config FEC |
| 1945 | bool "FEC ethernet controller (of ColdFire and some i.MX CPUs)" | 1945 | bool "FEC ethernet controller (of ColdFire and some i.MX CPUs)" |
| 1946 | depends on M523x || M527x || M5272 || M528x || M520x || M532x || \ | 1946 | depends on M523x || M527x || M5272 || M528x || M520x || M532x || \ |
| 1947 | MACH_MX27 || ARCH_MX35 || ARCH_MX25 || ARCH_MX5 | 1947 | MACH_MX27 || ARCH_MX35 || ARCH_MX25 || ARCH_MX5 || SOC_IMX28 |
| 1948 | select PHYLIB | 1948 | select PHYLIB |
| 1949 | help | 1949 | help |
| 1950 | Say Y here if you want to use the built-in 10/100 Fast ethernet | 1950 | Say Y here if you want to use the built-in 10/100 Fast ethernet |
| 1951 | controller on some Motorola ColdFire and Freescale i.MX processors. | 1951 | controller on some Motorola ColdFire and Freescale i.MX processors. |
| 1952 | 1952 | ||
| 1953 | config FEC2 | ||
| 1954 | bool "Second FEC ethernet controller (on some ColdFire CPUs)" | ||
| 1955 | depends on FEC | ||
| 1956 | help | ||
| 1957 | Say Y here if you want to use the second built-in 10/100 Fast | ||
| 1958 | ethernet controller on some Motorola ColdFire processors. | ||
| 1959 | |||
| 1960 | config FEC_MPC52xx | 1953 | config FEC_MPC52xx |
| 1961 | tristate "MPC52xx FEC driver" | 1954 | tristate "MPC52xx FEC driver" |
| 1962 | depends on PPC_MPC52xx && PPC_BESTCOMM | 1955 | depends on PPC_MPC52xx && PPC_BESTCOMM |
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c index ce1e5e9d06f6..0b9fc5173aef 100644 --- a/drivers/net/bfin_mac.c +++ b/drivers/net/bfin_mac.c | |||
| @@ -8,6 +8,11 @@ | |||
| 8 | * Licensed under the GPL-2 or later. | 8 | * Licensed under the GPL-2 or later. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #define DRV_VERSION "1.1" | ||
| 12 | #define DRV_DESC "Blackfin on-chip Ethernet MAC driver" | ||
| 13 | |||
| 14 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
| 15 | |||
| 11 | #include <linux/init.h> | 16 | #include <linux/init.h> |
| 12 | #include <linux/module.h> | 17 | #include <linux/module.h> |
| 13 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
| @@ -41,12 +46,7 @@ | |||
| 41 | 46 | ||
| 42 | #include "bfin_mac.h" | 47 | #include "bfin_mac.h" |
| 43 | 48 | ||
| 44 | #define DRV_NAME "bfin_mac" | 49 | MODULE_AUTHOR("Bryan Wu, Luke Yang"); |
| 45 | #define DRV_VERSION "1.1" | ||
| 46 | #define DRV_AUTHOR "Bryan Wu, Luke Yang" | ||
| 47 | #define DRV_DESC "Blackfin on-chip Ethernet MAC driver" | ||
| 48 | |||
| 49 | MODULE_AUTHOR(DRV_AUTHOR); | ||
| 50 | MODULE_LICENSE("GPL"); | 50 | MODULE_LICENSE("GPL"); |
| 51 | MODULE_DESCRIPTION(DRV_DESC); | 51 | MODULE_DESCRIPTION(DRV_DESC); |
| 52 | MODULE_ALIAS("platform:bfin_mac"); | 52 | MODULE_ALIAS("platform:bfin_mac"); |
| @@ -189,8 +189,7 @@ static int desc_list_init(void) | |||
| 189 | /* allocate a new skb for next time receive */ | 189 | /* allocate a new skb for next time receive */ |
| 190 | new_skb = dev_alloc_skb(PKT_BUF_SZ + NET_IP_ALIGN); | 190 | new_skb = dev_alloc_skb(PKT_BUF_SZ + NET_IP_ALIGN); |
| 191 | if (!new_skb) { | 191 | if (!new_skb) { |
| 192 | printk(KERN_NOTICE DRV_NAME | 192 | pr_notice("init: low on mem - packet dropped\n"); |
| 193 | ": init: low on mem - packet dropped\n"); | ||
| 194 | goto init_error; | 193 | goto init_error; |
| 195 | } | 194 | } |
| 196 | skb_reserve(new_skb, NET_IP_ALIGN); | 195 | skb_reserve(new_skb, NET_IP_ALIGN); |
| @@ -240,7 +239,7 @@ static int desc_list_init(void) | |||
| 240 | 239 | ||
| 241 | init_error: | 240 | init_error: |
| 242 | desc_list_free(); | 241 | desc_list_free(); |
| 243 | printk(KERN_ERR DRV_NAME ": kmalloc failed\n"); | 242 | pr_err("kmalloc failed\n"); |
| 244 | return -ENOMEM; | 243 | return -ENOMEM; |
| 245 | } | 244 | } |
| 246 | 245 | ||
| @@ -259,8 +258,7 @@ static int bfin_mdio_poll(void) | |||
| 259 | while ((bfin_read_EMAC_STAADD()) & STABUSY) { | 258 | while ((bfin_read_EMAC_STAADD()) & STABUSY) { |
| 260 | udelay(1); | 259 | udelay(1); |
| 261 | if (timeout_cnt-- < 0) { | 260 | if (timeout_cnt-- < 0) { |
| 262 | printk(KERN_ERR DRV_NAME | 261 | pr_err("wait MDC/MDIO transaction to complete timeout\n"); |
| 263 | ": wait MDC/MDIO transaction to complete timeout\n"); | ||
| 264 | return -ETIMEDOUT; | 262 | return -ETIMEDOUT; |
| 265 | } | 263 | } |
| 266 | } | 264 | } |
| @@ -350,9 +348,9 @@ static void bfin_mac_adjust_link(struct net_device *dev) | |||
| 350 | opmode &= ~RMII_10; | 348 | opmode &= ~RMII_10; |
| 351 | break; | 349 | break; |
| 352 | default: | 350 | default: |
| 353 | printk(KERN_WARNING | 351 | netdev_warn(dev, |
| 354 | "%s: Ack! Speed (%d) is not 10/100!\n", | 352 | "Ack! Speed (%d) is not 10/100!\n", |
| 355 | DRV_NAME, phydev->speed); | 353 | phydev->speed); |
| 356 | break; | 354 | break; |
| 357 | } | 355 | } |
| 358 | bfin_write_EMAC_OPMODE(opmode); | 356 | bfin_write_EMAC_OPMODE(opmode); |
| @@ -417,14 +415,13 @@ static int mii_probe(struct net_device *dev, int phy_mode) | |||
| 417 | 415 | ||
| 418 | /* now we are supposed to have a proper phydev, to attach to... */ | 416 | /* now we are supposed to have a proper phydev, to attach to... */ |
| 419 | if (!phydev) { | 417 | if (!phydev) { |
| 420 | printk(KERN_INFO "%s: Don't found any phy device at all\n", | 418 | netdev_err(dev, "no phy device found\n"); |
| 421 | dev->name); | ||
| 422 | return -ENODEV; | 419 | return -ENODEV; |
| 423 | } | 420 | } |
| 424 | 421 | ||
| 425 | if (phy_mode != PHY_INTERFACE_MODE_RMII && | 422 | if (phy_mode != PHY_INTERFACE_MODE_RMII && |
| 426 | phy_mode != PHY_INTERFACE_MODE_MII) { | 423 | phy_mode != PHY_INTERFACE_MODE_MII) { |
| 427 | printk(KERN_INFO "%s: Invalid phy interface mode\n", dev->name); | 424 | netdev_err(dev, "invalid phy interface mode\n"); |
| 428 | return -EINVAL; | 425 | return -EINVAL; |
| 429 | } | 426 | } |
| 430 | 427 | ||
| @@ -432,7 +429,7 @@ static int mii_probe(struct net_device *dev, int phy_mode) | |||
| 432 | 0, phy_mode); | 429 | 0, phy_mode); |
| 433 | 430 | ||
| 434 | if (IS_ERR(phydev)) { | 431 | if (IS_ERR(phydev)) { |
| 435 | printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); | 432 | netdev_err(dev, "could not attach PHY\n"); |
| 436 | return PTR_ERR(phydev); | 433 | return PTR_ERR(phydev); |
| 437 | } | 434 | } |
| 438 | 435 | ||
| @@ -453,11 +450,10 @@ static int mii_probe(struct net_device *dev, int phy_mode) | |||
| 453 | lp->old_duplex = -1; | 450 | lp->old_duplex = -1; |
| 454 | lp->phydev = phydev; | 451 | lp->phydev = phydev; |
| 455 | 452 | ||
| 456 | printk(KERN_INFO "%s: attached PHY driver [%s] " | 453 | pr_info("attached PHY driver [%s] " |
| 457 | "(mii_bus:phy_addr=%s, irq=%d, mdc_clk=%dHz(mdc_div=%d)" | 454 | "(mii_bus:phy_addr=%s, irq=%d, mdc_clk=%dHz(mdc_div=%d)@sclk=%dMHz)\n", |
| 458 | "@sclk=%dMHz)\n", | 455 | phydev->drv->name, dev_name(&phydev->dev), phydev->irq, |
| 459 | DRV_NAME, phydev->drv->name, dev_name(&phydev->dev), phydev->irq, | 456 | MDC_CLK, mdc_div, sclk/1000000); |
| 460 | MDC_CLK, mdc_div, sclk/1000000); | ||
| 461 | 457 | ||
| 462 | return 0; | 458 | return 0; |
| 463 | } | 459 | } |
| @@ -502,7 +498,7 @@ bfin_mac_ethtool_setsettings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
| 502 | static void bfin_mac_ethtool_getdrvinfo(struct net_device *dev, | 498 | static void bfin_mac_ethtool_getdrvinfo(struct net_device *dev, |
| 503 | struct ethtool_drvinfo *info) | 499 | struct ethtool_drvinfo *info) |
| 504 | { | 500 | { |
| 505 | strcpy(info->driver, DRV_NAME); | 501 | strcpy(info->driver, KBUILD_MODNAME); |
| 506 | strcpy(info->version, DRV_VERSION); | 502 | strcpy(info->version, DRV_VERSION); |
| 507 | strcpy(info->fw_version, "N/A"); | 503 | strcpy(info->fw_version, "N/A"); |
| 508 | strcpy(info->bus_info, dev_name(&dev->dev)); | 504 | strcpy(info->bus_info, dev_name(&dev->dev)); |
| @@ -562,7 +558,7 @@ static const struct ethtool_ops bfin_mac_ethtool_ops = { | |||
| 562 | }; | 558 | }; |
| 563 | 559 | ||
| 564 | /**************************************************************************/ | 560 | /**************************************************************************/ |
| 565 | void setup_system_regs(struct net_device *dev) | 561 | static void setup_system_regs(struct net_device *dev) |
| 566 | { | 562 | { |
| 567 | struct bfin_mac_local *lp = netdev_priv(dev); | 563 | struct bfin_mac_local *lp = netdev_priv(dev); |
| 568 | int i; | 564 | int i; |
| @@ -592,6 +588,10 @@ void setup_system_regs(struct net_device *dev) | |||
| 592 | 588 | ||
| 593 | bfin_write_EMAC_MMC_CTL(RSTC | CROLL); | 589 | bfin_write_EMAC_MMC_CTL(RSTC | CROLL); |
| 594 | 590 | ||
| 591 | /* Set vlan regs to let 1522 bytes long packets pass through */ | ||
| 592 | bfin_write_EMAC_VLAN1(lp->vlan1_mask); | ||
| 593 | bfin_write_EMAC_VLAN2(lp->vlan2_mask); | ||
| 594 | |||
| 595 | /* Initialize the TX DMA channel registers */ | 595 | /* Initialize the TX DMA channel registers */ |
| 596 | bfin_write_DMA2_X_COUNT(0); | 596 | bfin_write_DMA2_X_COUNT(0); |
| 597 | bfin_write_DMA2_X_MODIFY(4); | 597 | bfin_write_DMA2_X_MODIFY(4); |
| @@ -827,8 +827,7 @@ static void bfin_tx_hwtstamp(struct net_device *netdev, struct sk_buff *skb) | |||
| 827 | while ((!(bfin_read_EMAC_PTP_ISTAT() & TXTL)) && (--timeout_cnt)) | 827 | while ((!(bfin_read_EMAC_PTP_ISTAT() & TXTL)) && (--timeout_cnt)) |
| 828 | udelay(1); | 828 | udelay(1); |
| 829 | if (timeout_cnt == 0) | 829 | if (timeout_cnt == 0) |
| 830 | printk(KERN_ERR DRV_NAME | 830 | netdev_err(netdev, "timestamp the TX packet failed\n"); |
| 831 | ": fails to timestamp the TX packet\n"); | ||
| 832 | else { | 831 | else { |
| 833 | struct skb_shared_hwtstamps shhwtstamps; | 832 | struct skb_shared_hwtstamps shhwtstamps; |
| 834 | u64 ns; | 833 | u64 ns; |
| @@ -1083,8 +1082,7 @@ static void bfin_mac_rx(struct net_device *dev) | |||
| 1083 | * we which case we simply drop the packet | 1082 | * we which case we simply drop the packet |
| 1084 | */ | 1083 | */ |
| 1085 | if (current_rx_ptr->status.status_word & RX_ERROR_MASK) { | 1084 | if (current_rx_ptr->status.status_word & RX_ERROR_MASK) { |
| 1086 | printk(KERN_NOTICE DRV_NAME | 1085 | netdev_notice(dev, "rx: receive error - packet dropped\n"); |
| 1087 | ": rx: receive error - packet dropped\n"); | ||
| 1088 | dev->stats.rx_dropped++; | 1086 | dev->stats.rx_dropped++; |
| 1089 | goto out; | 1087 | goto out; |
| 1090 | } | 1088 | } |
| @@ -1094,8 +1092,7 @@ static void bfin_mac_rx(struct net_device *dev) | |||
| 1094 | 1092 | ||
| 1095 | new_skb = dev_alloc_skb(PKT_BUF_SZ + NET_IP_ALIGN); | 1093 | new_skb = dev_alloc_skb(PKT_BUF_SZ + NET_IP_ALIGN); |
| 1096 | if (!new_skb) { | 1094 | if (!new_skb) { |
| 1097 | printk(KERN_NOTICE DRV_NAME | 1095 | netdev_notice(dev, "rx: low on mem - packet dropped\n"); |
| 1098 | ": rx: low on mem - packet dropped\n"); | ||
| 1099 | dev->stats.rx_dropped++; | 1096 | dev->stats.rx_dropped++; |
| 1100 | goto out; | 1097 | goto out; |
| 1101 | } | 1098 | } |
| @@ -1213,7 +1210,7 @@ static int bfin_mac_enable(struct phy_device *phydev) | |||
| 1213 | int ret; | 1210 | int ret; |
| 1214 | u32 opmode; | 1211 | u32 opmode; |
| 1215 | 1212 | ||
| 1216 | pr_debug("%s: %s\n", DRV_NAME, __func__); | 1213 | pr_debug("%s\n", __func__); |
| 1217 | 1214 | ||
| 1218 | /* Set RX DMA */ | 1215 | /* Set RX DMA */ |
| 1219 | bfin_write_DMA1_NEXT_DESC_PTR(&(rx_list_head->desc_a)); | 1216 | 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) | |||
| 1323 | u32 sysctl; | 1320 | u32 sysctl; |
| 1324 | 1321 | ||
| 1325 | if (dev->flags & IFF_PROMISC) { | 1322 | if (dev->flags & IFF_PROMISC) { |
| 1326 | printk(KERN_INFO "%s: set to promisc mode\n", dev->name); | 1323 | netdev_info(dev, "set promisc mode\n"); |
| 1327 | sysctl = bfin_read_EMAC_OPMODE(); | 1324 | sysctl = bfin_read_EMAC_OPMODE(); |
| 1328 | sysctl |= PR; | 1325 | sysctl |= PR; |
| 1329 | bfin_write_EMAC_OPMODE(sysctl); | 1326 | bfin_write_EMAC_OPMODE(sysctl); |
| @@ -1393,7 +1390,7 @@ static int bfin_mac_open(struct net_device *dev) | |||
| 1393 | * address using ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx | 1390 | * address using ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx |
| 1394 | */ | 1391 | */ |
| 1395 | if (!is_valid_ether_addr(dev->dev_addr)) { | 1392 | if (!is_valid_ether_addr(dev->dev_addr)) { |
| 1396 | printk(KERN_WARNING DRV_NAME ": no valid ethernet hw addr\n"); | 1393 | netdev_warn(dev, "no valid ethernet hw addr\n"); |
| 1397 | return -EINVAL; | 1394 | return -EINVAL; |
| 1398 | } | 1395 | } |
| 1399 | 1396 | ||
| @@ -1527,6 +1524,9 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev) | |||
| 1527 | goto out_err_mii_probe; | 1524 | goto out_err_mii_probe; |
| 1528 | } | 1525 | } |
| 1529 | 1526 | ||
| 1527 | lp->vlan1_mask = ETH_P_8021Q | mii_bus_data->vlan1_mask; | ||
| 1528 | lp->vlan2_mask = ETH_P_8021Q | mii_bus_data->vlan2_mask; | ||
| 1529 | |||
| 1530 | /* Fill in the fields of the device structure with ethernet values. */ | 1530 | /* Fill in the fields of the device structure with ethernet values. */ |
| 1531 | ether_setup(ndev); | 1531 | ether_setup(ndev); |
| 1532 | 1532 | ||
| @@ -1558,7 +1558,7 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev) | |||
| 1558 | bfin_mac_hwtstamp_init(ndev); | 1558 | bfin_mac_hwtstamp_init(ndev); |
| 1559 | 1559 | ||
| 1560 | /* now, print out the card info, in a short format.. */ | 1560 | /* now, print out the card info, in a short format.. */ |
| 1561 | dev_info(&pdev->dev, "%s, Version %s\n", DRV_DESC, DRV_VERSION); | 1561 | netdev_info(ndev, "%s, Version %s\n", DRV_DESC, DRV_VERSION); |
| 1562 | 1562 | ||
| 1563 | return 0; | 1563 | return 0; |
| 1564 | 1564 | ||
| @@ -1650,7 +1650,7 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) | |||
| 1650 | * so set the GPIO pins to Ethernet mode | 1650 | * so set the GPIO pins to Ethernet mode |
| 1651 | */ | 1651 | */ |
| 1652 | pin_req = mii_bus_pd->mac_peripherals; | 1652 | pin_req = mii_bus_pd->mac_peripherals; |
| 1653 | rc = peripheral_request_list(pin_req, DRV_NAME); | 1653 | rc = peripheral_request_list(pin_req, KBUILD_MODNAME); |
| 1654 | if (rc) { | 1654 | if (rc) { |
| 1655 | dev_err(&pdev->dev, "Requesting peripherals failed!\n"); | 1655 | dev_err(&pdev->dev, "Requesting peripherals failed!\n"); |
| 1656 | return rc; | 1656 | return rc; |
| @@ -1739,7 +1739,7 @@ static struct platform_driver bfin_mac_driver = { | |||
| 1739 | .resume = bfin_mac_resume, | 1739 | .resume = bfin_mac_resume, |
| 1740 | .suspend = bfin_mac_suspend, | 1740 | .suspend = bfin_mac_suspend, |
| 1741 | .driver = { | 1741 | .driver = { |
| 1742 | .name = DRV_NAME, | 1742 | .name = KBUILD_MODNAME, |
| 1743 | .owner = THIS_MODULE, | 1743 | .owner = THIS_MODULE, |
| 1744 | }, | 1744 | }, |
| 1745 | }; | 1745 | }; |
diff --git a/drivers/net/bfin_mac.h b/drivers/net/bfin_mac.h index aed68bed2365..f8559ac9a403 100644 --- a/drivers/net/bfin_mac.h +++ b/drivers/net/bfin_mac.h | |||
| @@ -17,7 +17,14 @@ | |||
| 17 | #include <linux/etherdevice.h> | 17 | #include <linux/etherdevice.h> |
| 18 | #include <linux/bfin_mac.h> | 18 | #include <linux/bfin_mac.h> |
| 19 | 19 | ||
| 20 | /* | ||
| 21 | * Disable hardware checksum for bug #5600 if writeback cache is | ||
| 22 | * enabled. Otherwize, corrupted RX packet will be sent up stack | ||
| 23 | * without error mark. | ||
| 24 | */ | ||
| 25 | #ifndef CONFIG_BFIN_EXTMEM_WRITEBACK | ||
| 20 | #define BFIN_MAC_CSUM_OFFLOAD | 26 | #define BFIN_MAC_CSUM_OFFLOAD |
| 27 | #endif | ||
| 21 | 28 | ||
| 22 | #define TX_RECLAIM_JIFFIES (HZ / 5) | 29 | #define TX_RECLAIM_JIFFIES (HZ / 5) |
| 23 | 30 | ||
| @@ -68,7 +75,6 @@ struct bfin_mac_local { | |||
| 68 | */ | 75 | */ |
| 69 | struct net_device_stats stats; | 76 | struct net_device_stats stats; |
| 70 | 77 | ||
| 71 | unsigned char Mac[6]; /* MAC address of the board */ | ||
| 72 | spinlock_t lock; | 78 | spinlock_t lock; |
| 73 | 79 | ||
| 74 | int wol; /* Wake On Lan */ | 80 | int wol; /* Wake On Lan */ |
| @@ -76,6 +82,9 @@ struct bfin_mac_local { | |||
| 76 | struct timer_list tx_reclaim_timer; | 82 | struct timer_list tx_reclaim_timer; |
| 77 | struct net_device *ndev; | 83 | struct net_device *ndev; |
| 78 | 84 | ||
| 85 | /* Data for EMAC_VLAN1 regs */ | ||
| 86 | u16 vlan1_mask, vlan2_mask; | ||
| 87 | |||
| 79 | /* MII and PHY stuffs */ | 88 | /* MII and PHY stuffs */ |
| 80 | int old_link; /* used by bf537_adjust_link */ | 89 | int old_link; /* used by bf537_adjust_link */ |
| 81 | int old_speed; | 90 | int old_speed; |
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h index 77d6c8d6d86b..6a858a29db56 100644 --- a/drivers/net/bnx2x/bnx2x.h +++ b/drivers/net/bnx2x/bnx2x.h | |||
| @@ -636,6 +636,7 @@ struct bnx2x_common { | |||
| 636 | 636 | ||
| 637 | #define CHIP_METAL(bp) (bp->common.chip_id & 0x00000ff0) | 637 | #define CHIP_METAL(bp) (bp->common.chip_id & 0x00000ff0) |
| 638 | #define CHIP_BOND_ID(bp) (bp->common.chip_id & 0x0000000f) | 638 | #define CHIP_BOND_ID(bp) (bp->common.chip_id & 0x0000000f) |
| 639 | #define CHIP_PARITY_ENABLED(bp) (CHIP_IS_E1(bp) || CHIP_IS_E1H(bp)) | ||
| 639 | 640 | ||
| 640 | int flash_size; | 641 | int flash_size; |
| 641 | #define NVRAM_1MB_SIZE 0x20000 /* 1M bit in bytes */ | 642 | #define NVRAM_1MB_SIZE 0x20000 /* 1M bit in bytes */ |
diff --git a/drivers/net/bnx2x/bnx2x_dump.h b/drivers/net/bnx2x/bnx2x_dump.h index dc18c25ca9e5..fb3ff7c4d7ca 100644 --- a/drivers/net/bnx2x/bnx2x_dump.h +++ b/drivers/net/bnx2x/bnx2x_dump.h | |||
| @@ -1,10 +1,16 @@ | |||
| 1 | /* bnx2x_dump.h: Broadcom Everest network driver. | 1 | /* bnx2x_dump.h: Broadcom Everest network driver. |
| 2 | * | 2 | * |
| 3 | * Copyright (c) 2009 Broadcom Corporation | 3 | * Copyright (c) 2011 Broadcom Corporation |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * Unless you and Broadcom execute a separate written software license |
| 6 | * it under the terms of the GNU General Public License as published by | 6 | * agreement governing use of this software, this software is licensed to you |
| 7 | * the Free Software Foundation. | 7 | * under the terms of the GNU General Public License version 2, available |
| 8 | * at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL"). | ||
| 9 | * | ||
| 10 | * Notwithstanding the above, under no circumstances may you combine this | ||
| 11 | * software in any way with any other Broadcom software provided under a | ||
| 12 | * license other than the GPL, without Broadcom's express prior written | ||
| 13 | * consent. | ||
| 8 | */ | 14 | */ |
| 9 | 15 | ||
| 10 | 16 | ||
| @@ -17,53 +23,53 @@ | |||
| 17 | #define BNX2X_DUMP_H | 23 | #define BNX2X_DUMP_H |
| 18 | 24 | ||
| 19 | 25 | ||
| 20 | struct dump_sign { | ||
| 21 | u32 time_stamp; | ||
| 22 | u32 diag_ver; | ||
| 23 | u32 grc_dump_ver; | ||
| 24 | }; | ||
| 25 | 26 | ||
| 26 | #define TSTORM_WAITP_ADDR 0x1b8a80 | 27 | /*definitions */ |
| 27 | #define CSTORM_WAITP_ADDR 0x238a80 | 28 | #define XSTORM_WAITP_ADDR 0x2b8a80 |
| 28 | #define XSTORM_WAITP_ADDR 0x2b8a80 | 29 | #define TSTORM_WAITP_ADDR 0x1b8a80 |
| 29 | #define USTORM_WAITP_ADDR 0x338a80 | 30 | #define USTORM_WAITP_ADDR 0x338a80 |
| 30 | #define TSTORM_CAM_MODE 0x1b1440 | 31 | #define CSTORM_WAITP_ADDR 0x238a80 |
| 32 | #define TSTORM_CAM_MODE 0x1B1440 | ||
| 31 | 33 | ||
| 32 | #define RI_E1 0x1 | 34 | #define MAX_TIMER_PENDING 200 |
| 33 | #define RI_E1H 0x2 | 35 | #define TIMER_SCAN_DONT_CARE 0xFF |
| 36 | #define RI_E1 0x1 | ||
| 37 | #define RI_E1H 0x2 | ||
| 34 | #define RI_E2 0x4 | 38 | #define RI_E2 0x4 |
| 35 | #define RI_ONLINE 0x100 | 39 | #define RI_ONLINE 0x100 |
| 36 | #define RI_PATH0_DUMP 0x200 | 40 | #define RI_PATH0_DUMP 0x200 |
| 37 | #define RI_PATH1_DUMP 0x400 | 41 | #define RI_PATH1_DUMP 0x400 |
| 38 | #define RI_E1_OFFLINE (RI_E1) | 42 | #define RI_E1_OFFLINE (RI_E1) |
| 39 | #define RI_E1_ONLINE (RI_E1 | RI_ONLINE) | 43 | #define RI_E1_ONLINE (RI_E1 | RI_ONLINE) |
| 40 | #define RI_E1H_OFFLINE (RI_E1H) | 44 | #define RI_E1H_OFFLINE (RI_E1H) |
| 41 | #define RI_E1H_ONLINE (RI_E1H | RI_ONLINE) | 45 | #define RI_E1H_ONLINE (RI_E1H | RI_ONLINE) |
| 42 | #define RI_E2_OFFLINE (RI_E2) | 46 | #define RI_E2_OFFLINE (RI_E2) |
| 43 | #define RI_E2_ONLINE (RI_E2 | RI_ONLINE) | 47 | #define RI_E2_ONLINE (RI_E2 | RI_ONLINE) |
| 44 | #define RI_E1E1H_OFFLINE (RI_E1 | RI_E1H) | 48 | #define RI_E1E1H_OFFLINE (RI_E1 | RI_E1H) |
| 45 | #define RI_E1E1H_ONLINE (RI_E1 | RI_E1H | RI_ONLINE) | 49 | #define RI_E1E1H_ONLINE (RI_E1 | RI_E1H | RI_ONLINE) |
| 46 | #define RI_E1HE2_OFFLINE (RI_E2 | RI_E1H) | 50 | #define RI_E1HE2_OFFLINE (RI_E2 | RI_E1H) |
| 47 | #define RI_E1HE2_ONLINE (RI_E2 | RI_E1H | RI_ONLINE) | 51 | #define RI_E1HE2_ONLINE (RI_E2 | RI_E1H | RI_ONLINE) |
| 48 | #define RI_E1E2_OFFLINE (RI_E2 | RI_E1) | 52 | #define RI_E1E2_OFFLINE (RI_E2 | RI_E1) |
| 49 | #define RI_E1E2_ONLINE (RI_E2 | RI_E1 | RI_ONLINE) | 53 | #define RI_E1E2_ONLINE (RI_E2 | RI_E1 | RI_ONLINE) |
| 50 | #define RI_ALL_OFFLINE (RI_E1 | RI_E1H | RI_E2) | 54 | #define RI_ALL_OFFLINE (RI_E1 | RI_E1H | RI_E2) |
| 51 | #define RI_ALL_ONLINE (RI_E1 | RI_E1H | RI_E2 | RI_ONLINE) | 55 | #define RI_ALL_ONLINE (RI_E1 | RI_E1H | RI_E2 | RI_ONLINE) |
| 52 | |||
| 53 | #define MAX_TIMER_PENDING 200 | ||
| 54 | #define TIMER_SCAN_DONT_CARE 0xFF | ||
| 55 | 56 | ||
| 57 | struct dump_sign { | ||
| 58 | u32 time_stamp; | ||
| 59 | u32 diag_ver; | ||
| 60 | u32 grc_dump_ver; | ||
| 61 | }; | ||
| 56 | 62 | ||
| 57 | struct dump_hdr { | 63 | struct dump_hdr { |
| 58 | u32 hdr_size; /* in dwords, excluding this field */ | 64 | u32 hdr_size; /* in dwords, excluding this field */ |
| 59 | struct dump_sign dump_sign; | 65 | struct dump_sign dump_sign; |
| 60 | u32 xstorm_waitp; | 66 | u32 xstorm_waitp; |
| 61 | u32 tstorm_waitp; | 67 | u32 tstorm_waitp; |
| 62 | u32 ustorm_waitp; | 68 | u32 ustorm_waitp; |
| 63 | u32 cstorm_waitp; | 69 | u32 cstorm_waitp; |
| 64 | u16 info; | 70 | u16 info; |
| 65 | u8 idle_chk; | 71 | u8 idle_chk; |
| 66 | u8 reserved; | 72 | u8 reserved; |
| 67 | }; | 73 | }; |
| 68 | 74 | ||
| 69 | struct reg_addr { | 75 | struct reg_addr { |
| @@ -80,202 +86,185 @@ struct wreg_addr { | |||
| 80 | u16 info; | 86 | u16 info; |
| 81 | }; | 87 | }; |
| 82 | 88 | ||
| 83 | 89 | #define REGS_COUNT 834 | |
| 84 | #define REGS_COUNT 558 | ||
| 85 | static const struct reg_addr reg_addrs[REGS_COUNT] = { | 90 | static const struct reg_addr reg_addrs[REGS_COUNT] = { |
| 86 | { 0x2000, 341, RI_ALL_ONLINE }, { 0x2800, 103, RI_ALL_ONLINE }, | 91 | { 0x2000, 341, RI_ALL_ONLINE }, { 0x2800, 103, RI_ALL_ONLINE }, |
| 87 | { 0x3000, 287, RI_ALL_ONLINE }, { 0x3800, 331, RI_ALL_ONLINE }, | 92 | { 0x3000, 287, RI_ALL_ONLINE }, { 0x3800, 331, RI_ALL_ONLINE }, |
| 88 | { 0x8800, 6, RI_E1_ONLINE }, { 0xa000, 223, RI_ALL_ONLINE }, | 93 | { 0x8800, 6, RI_ALL_ONLINE }, { 0x8818, 1, RI_E1HE2_ONLINE }, |
| 89 | { 0xa388, 1, RI_ALL_ONLINE }, { 0xa398, 1, RI_ALL_ONLINE }, | 94 | { 0x9000, 164, RI_E2_ONLINE }, { 0x9400, 33, RI_E2_ONLINE }, |
| 90 | { 0xa39c, 7, RI_E1H_ONLINE }, { 0xa3c0, 3, RI_E1H_ONLINE }, | 95 | { 0xa000, 27, RI_ALL_ONLINE }, { 0xa06c, 1, RI_E1E1H_ONLINE }, |
| 91 | { 0xa3d0, 1, RI_E1H_ONLINE }, { 0xa3d8, 1, RI_E1H_ONLINE }, | 96 | { 0xa070, 71, RI_ALL_ONLINE }, { 0xa18c, 4, RI_E1E1H_ONLINE }, |
| 92 | { 0xa3e0, 1, RI_E1H_ONLINE }, { 0xa3e8, 1, RI_E1H_ONLINE }, | 97 | { 0xa19c, 62, RI_ALL_ONLINE }, { 0xa294, 2, RI_E1E1H_ONLINE }, |
| 93 | { 0xa3f0, 1, RI_E1H_ONLINE }, { 0xa3f8, 1, RI_E1H_ONLINE }, | 98 | { 0xa29c, 56, RI_ALL_ONLINE }, { 0xa39c, 7, RI_E1HE2_ONLINE }, |
| 94 | { 0xa400, 69, RI_ALL_ONLINE }, { 0xa518, 1, RI_ALL_ONLINE }, | 99 | { 0xa3c0, 3, RI_E1HE2_ONLINE }, { 0xa3d0, 1, RI_E1HE2_ONLINE }, |
| 95 | { 0xa520, 1, RI_ALL_ONLINE }, { 0xa528, 1, RI_ALL_ONLINE }, | 100 | { 0xa3d8, 1, RI_E1HE2_ONLINE }, { 0xa3e0, 1, RI_E1HE2_ONLINE }, |
| 96 | { 0xa530, 1, RI_ALL_ONLINE }, { 0xa538, 1, RI_ALL_ONLINE }, | 101 | { 0xa3e8, 1, RI_E1HE2_ONLINE }, { 0xa3f0, 1, RI_E1HE2_ONLINE }, |
| 97 | { 0xa540, 1, RI_ALL_ONLINE }, { 0xa548, 1, RI_ALL_ONLINE }, | 102 | { 0xa3f8, 1, RI_E1HE2_ONLINE }, { 0xa400, 43, RI_ALL_ONLINE }, |
| 98 | { 0xa550, 1, RI_ALL_ONLINE }, { 0xa558, 1, RI_ALL_ONLINE }, | 103 | { 0xa4ac, 2, RI_E1E1H_ONLINE }, { 0xa4b4, 1, RI_ALL_ONLINE }, |
| 99 | { 0xa560, 1, RI_ALL_ONLINE }, { 0xa568, 1, RI_ALL_ONLINE }, | 104 | { 0xa4b8, 2, RI_E1E1H_ONLINE }, { 0xa4c0, 3, RI_ALL_ONLINE }, |
| 100 | { 0xa570, 1, RI_ALL_ONLINE }, { 0xa580, 1, RI_ALL_ONLINE }, | 105 | { 0xa4cc, 5, RI_E1E1H_ONLINE }, { 0xa4e0, 9, RI_ALL_ONLINE }, |
| 101 | { 0xa590, 1, RI_ALL_ONLINE }, { 0xa5a0, 1, RI_ALL_ONLINE }, | 106 | { 0xa504, 1, RI_E1E1H_ONLINE }, { 0xa508, 3, RI_ALL_ONLINE }, |
| 102 | { 0xa5c0, 1, RI_ALL_ONLINE }, { 0xa5e0, 1, RI_E1H_ONLINE }, | 107 | { 0xa518, 1, RI_ALL_ONLINE }, { 0xa520, 1, RI_ALL_ONLINE }, |
| 103 | { 0xa5e8, 1, RI_E1H_ONLINE }, { 0xa5f0, 1, RI_E1H_ONLINE }, | 108 | { 0xa528, 1, RI_ALL_ONLINE }, { 0xa530, 1, RI_ALL_ONLINE }, |
| 104 | { 0xa5f8, 10, RI_E1H_ONLINE }, { 0x10000, 236, RI_ALL_ONLINE }, | 109 | { 0xa538, 1, RI_ALL_ONLINE }, { 0xa540, 1, RI_ALL_ONLINE }, |
| 105 | { 0x103bc, 1, RI_ALL_ONLINE }, { 0x103cc, 1, RI_ALL_ONLINE }, | 110 | { 0xa548, 1, RI_E1E1H_ONLINE }, { 0xa550, 1, RI_E1E1H_ONLINE }, |
| 106 | { 0x103dc, 1, RI_ALL_ONLINE }, { 0x10400, 57, RI_ALL_ONLINE }, | 111 | { 0xa558, 1, RI_E1E1H_ONLINE }, { 0xa560, 1, RI_E1E1H_ONLINE }, |
| 107 | { 0x104e8, 2, RI_ALL_ONLINE }, { 0x104f4, 2, RI_ALL_ONLINE }, | 112 | { 0xa568, 1, RI_E1E1H_ONLINE }, { 0xa570, 1, RI_ALL_ONLINE }, |
| 108 | { 0x10500, 146, RI_ALL_ONLINE }, { 0x10750, 2, RI_ALL_ONLINE }, | 113 | { 0xa580, 1, RI_ALL_ONLINE }, { 0xa590, 1, RI_ALL_ONLINE }, |
| 109 | { 0x10760, 2, RI_ALL_ONLINE }, { 0x10770, 2, RI_ALL_ONLINE }, | 114 | { 0xa5a0, 1, RI_ALL_ONLINE }, { 0xa5c0, 1, RI_ALL_ONLINE }, |
| 110 | { 0x10780, 2, RI_ALL_ONLINE }, { 0x10790, 2, RI_ALL_ONLINE }, | 115 | { 0xa5e0, 1, RI_E1HE2_ONLINE }, { 0xa5e8, 1, RI_E1HE2_ONLINE }, |
| 111 | { 0x107a0, 2, RI_ALL_ONLINE }, { 0x107b0, 2, RI_ALL_ONLINE }, | 116 | { 0xa5f0, 1, RI_E1HE2_ONLINE }, { 0xa5f8, 10, RI_E1HE2_ONLINE }, |
| 112 | { 0x107c0, 2, RI_ALL_ONLINE }, { 0x107d0, 2, RI_ALL_ONLINE }, | 117 | { 0xa620, 111, RI_E2_ONLINE }, { 0xa800, 51, RI_E2_ONLINE }, |
| 113 | { 0x107e0, 2, RI_ALL_ONLINE }, { 0x10880, 2, RI_ALL_ONLINE }, | 118 | { 0xa8d4, 4, RI_E2_ONLINE }, { 0xa8e8, 1, RI_E2_ONLINE }, |
| 114 | { 0x10900, 2, RI_ALL_ONLINE }, { 0x12000, 1, RI_ALL_ONLINE }, | 119 | { 0xa8f0, 1, RI_E2_ONLINE }, { 0x10000, 236, RI_ALL_ONLINE }, |
| 115 | { 0x14000, 1, RI_ALL_ONLINE }, { 0x16000, 26, RI_E1H_ONLINE }, | 120 | { 0x10400, 57, RI_ALL_ONLINE }, { 0x104e8, 2, RI_ALL_ONLINE }, |
| 116 | { 0x16070, 18, RI_E1H_ONLINE }, { 0x160c0, 27, RI_E1H_ONLINE }, | 121 | { 0x104f4, 2, RI_ALL_ONLINE }, { 0x10500, 146, RI_ALL_ONLINE }, |
| 117 | { 0x16140, 1, RI_E1H_ONLINE }, { 0x16160, 1, RI_E1H_ONLINE }, | 122 | { 0x10750, 2, RI_ALL_ONLINE }, { 0x10760, 2, RI_ALL_ONLINE }, |
| 118 | { 0x16180, 2, RI_E1H_ONLINE }, { 0x161c0, 2, RI_E1H_ONLINE }, | 123 | { 0x10770, 2, RI_ALL_ONLINE }, { 0x10780, 2, RI_ALL_ONLINE }, |
| 119 | { 0x16204, 5, RI_E1H_ONLINE }, { 0x18000, 1, RI_E1H_ONLINE }, | 124 | { 0x10790, 2, RI_ALL_ONLINE }, { 0x107a0, 2, RI_ALL_ONLINE }, |
| 120 | { 0x18008, 1, RI_E1H_ONLINE }, { 0x20000, 24, RI_ALL_ONLINE }, | 125 | { 0x107b0, 2, RI_ALL_ONLINE }, { 0x107c0, 2, RI_ALL_ONLINE }, |
| 121 | { 0x20060, 8, RI_ALL_ONLINE }, { 0x20080, 138, RI_ALL_ONLINE }, | 126 | { 0x107d0, 2, RI_ALL_ONLINE }, { 0x107e0, 2, RI_ALL_ONLINE }, |
| 122 | { 0x202b4, 1, RI_ALL_ONLINE }, { 0x202c4, 1, RI_ALL_ONLINE }, | 127 | { 0x10880, 2, RI_ALL_ONLINE }, { 0x10900, 2, RI_ALL_ONLINE }, |
| 123 | { 0x20400, 2, RI_ALL_ONLINE }, { 0x2040c, 8, RI_ALL_ONLINE }, | 128 | { 0x16000, 26, RI_E1HE2_ONLINE }, { 0x16070, 18, RI_E1HE2_ONLINE }, |
| 124 | { 0x2042c, 18, RI_E1H_ONLINE }, { 0x20480, 1, RI_ALL_ONLINE }, | 129 | { 0x160c0, 27, RI_E1HE2_ONLINE }, { 0x16140, 1, RI_E1HE2_ONLINE }, |
| 125 | { 0x20500, 1, RI_ALL_ONLINE }, { 0x20600, 1, RI_ALL_ONLINE }, | 130 | { 0x16160, 1, RI_E1HE2_ONLINE }, { 0x16180, 2, RI_E1HE2_ONLINE }, |
| 126 | { 0x28000, 1, RI_ALL_ONLINE }, { 0x28004, 8191, RI_ALL_OFFLINE }, | 131 | { 0x161c0, 2, RI_E1HE2_ONLINE }, { 0x16204, 5, RI_E1HE2_ONLINE }, |
| 127 | { 0x30000, 1, RI_ALL_ONLINE }, { 0x30004, 16383, RI_ALL_OFFLINE }, | 132 | { 0x18000, 1, RI_E1HE2_ONLINE }, { 0x18008, 1, RI_E1HE2_ONLINE }, |
| 128 | { 0x40000, 98, RI_ALL_ONLINE }, { 0x40194, 1, RI_ALL_ONLINE }, | 133 | { 0x18010, 35, RI_E2_ONLINE }, { 0x180a4, 2, RI_E2_ONLINE }, |
| 129 | { 0x401a4, 1, RI_ALL_ONLINE }, { 0x401a8, 11, RI_E1H_ONLINE }, | 134 | { 0x180c0, 191, RI_E2_ONLINE }, { 0x18440, 1, RI_E2_ONLINE }, |
| 130 | { 0x40200, 4, RI_ALL_ONLINE }, { 0x40400, 43, RI_ALL_ONLINE }, | 135 | { 0x18460, 1, RI_E2_ONLINE }, { 0x18480, 2, RI_E2_ONLINE }, |
| 131 | { 0x404b8, 1, RI_ALL_ONLINE }, { 0x404c8, 1, RI_ALL_ONLINE }, | 136 | { 0x184c0, 2, RI_E2_ONLINE }, { 0x18500, 15, RI_E2_ONLINE }, |
| 132 | { 0x404cc, 3, RI_E1H_ONLINE }, { 0x40500, 2, RI_ALL_ONLINE }, | 137 | { 0x20000, 24, RI_ALL_ONLINE }, { 0x20060, 8, RI_ALL_ONLINE }, |
| 138 | { 0x20080, 94, RI_ALL_ONLINE }, { 0x201f8, 1, RI_E1E1H_ONLINE }, | ||
| 139 | { 0x201fc, 1, RI_ALL_ONLINE }, { 0x20200, 1, RI_E1E1H_ONLINE }, | ||
| 140 | { 0x20204, 1, RI_ALL_ONLINE }, { 0x20208, 1, RI_E1E1H_ONLINE }, | ||
| 141 | { 0x2020c, 39, RI_ALL_ONLINE }, { 0x202c8, 1, RI_E2_ONLINE }, | ||
| 142 | { 0x202d8, 4, RI_E2_ONLINE }, { 0x20400, 2, RI_ALL_ONLINE }, | ||
| 143 | { 0x2040c, 8, RI_ALL_ONLINE }, { 0x2042c, 18, RI_E1HE2_ONLINE }, | ||
| 144 | { 0x20480, 1, RI_ALL_ONLINE }, { 0x20500, 1, RI_ALL_ONLINE }, | ||
| 145 | { 0x20600, 1, RI_ALL_ONLINE }, { 0x28000, 1, RI_ALL_ONLINE }, | ||
| 146 | { 0x28004, 8191, RI_ALL_OFFLINE }, { 0x30000, 1, RI_ALL_ONLINE }, | ||
| 147 | { 0x30004, 16383, RI_ALL_OFFLINE }, { 0x40000, 98, RI_ALL_ONLINE }, | ||
| 148 | { 0x401a8, 8, RI_E1HE2_ONLINE }, { 0x401c8, 1, RI_E1H_ONLINE }, | ||
| 149 | { 0x401cc, 2, RI_E1HE2_ONLINE }, { 0x401d4, 2, RI_E2_ONLINE }, | ||
| 150 | { 0x40200, 4, RI_ALL_ONLINE }, { 0x40220, 18, RI_E2_ONLINE }, | ||
| 151 | { 0x40400, 43, RI_ALL_ONLINE }, { 0x404cc, 3, RI_E1HE2_ONLINE }, | ||
| 152 | { 0x404e0, 1, RI_E2_ONLINE }, { 0x40500, 2, RI_ALL_ONLINE }, | ||
| 133 | { 0x40510, 2, RI_ALL_ONLINE }, { 0x40520, 2, RI_ALL_ONLINE }, | 153 | { 0x40510, 2, RI_ALL_ONLINE }, { 0x40520, 2, RI_ALL_ONLINE }, |
| 134 | { 0x40530, 2, RI_ALL_ONLINE }, { 0x40540, 2, RI_ALL_ONLINE }, | 154 | { 0x40530, 2, RI_ALL_ONLINE }, { 0x40540, 2, RI_ALL_ONLINE }, |
| 135 | { 0x42000, 164, RI_ALL_ONLINE }, { 0x4229c, 1, RI_ALL_ONLINE }, | 155 | { 0x40550, 10, RI_E2_ONLINE }, { 0x40610, 2, RI_E2_ONLINE }, |
| 136 | { 0x422ac, 1, RI_ALL_ONLINE }, { 0x422bc, 1, RI_ALL_ONLINE }, | 156 | { 0x42000, 164, RI_ALL_ONLINE }, { 0x422c0, 4, RI_E2_ONLINE }, |
| 137 | { 0x422d4, 5, RI_E1H_ONLINE }, { 0x42400, 49, RI_ALL_ONLINE }, | 157 | { 0x422d4, 5, RI_E1HE2_ONLINE }, { 0x422e8, 1, RI_E2_ONLINE }, |
| 138 | { 0x424c8, 38, RI_ALL_ONLINE }, { 0x42568, 2, RI_ALL_ONLINE }, | 158 | { 0x42400, 49, RI_ALL_ONLINE }, { 0x424c8, 38, RI_ALL_ONLINE }, |
| 139 | { 0x42800, 1, RI_ALL_ONLINE }, { 0x50000, 20, RI_ALL_ONLINE }, | 159 | { 0x42568, 2, RI_ALL_ONLINE }, { 0x42640, 5, RI_E2_ONLINE }, |
| 140 | { 0x50050, 8, RI_ALL_ONLINE }, { 0x50070, 88, RI_ALL_ONLINE }, | 160 | { 0x42800, 1, RI_ALL_ONLINE }, { 0x50000, 1, RI_ALL_ONLINE }, |
| 141 | { 0x501dc, 1, RI_ALL_ONLINE }, { 0x501ec, 1, RI_ALL_ONLINE }, | 161 | { 0x50004, 19, RI_ALL_ONLINE }, { 0x50050, 8, RI_ALL_ONLINE }, |
| 142 | { 0x501f0, 4, RI_E1H_ONLINE }, { 0x50200, 2, RI_ALL_ONLINE }, | 162 | { 0x50070, 88, RI_ALL_ONLINE }, { 0x501f0, 4, RI_E1HE2_ONLINE }, |
| 143 | { 0x5020c, 7, RI_ALL_ONLINE }, { 0x50228, 6, RI_E1H_ONLINE }, | 163 | { 0x50200, 2, RI_ALL_ONLINE }, { 0x5020c, 7, RI_ALL_ONLINE }, |
| 144 | { 0x50240, 1, RI_ALL_ONLINE }, { 0x50280, 1, RI_ALL_ONLINE }, | 164 | { 0x50228, 6, RI_E1HE2_ONLINE }, { 0x50240, 1, RI_ALL_ONLINE }, |
| 165 | { 0x50280, 1, RI_ALL_ONLINE }, { 0x50300, 1, RI_E2_ONLINE }, | ||
| 166 | { 0x5030c, 1, RI_E2_ONLINE }, { 0x50318, 1, RI_E2_ONLINE }, | ||
| 167 | { 0x5031c, 1, RI_E2_ONLINE }, { 0x50320, 2, RI_E2_ONLINE }, | ||
| 145 | { 0x52000, 1, RI_ALL_ONLINE }, { 0x54000, 1, RI_ALL_ONLINE }, | 168 | { 0x52000, 1, RI_ALL_ONLINE }, { 0x54000, 1, RI_ALL_ONLINE }, |
| 146 | { 0x54004, 3327, RI_ALL_OFFLINE }, { 0x58000, 1, RI_ALL_ONLINE }, | 169 | { 0x54004, 3327, RI_ALL_OFFLINE }, { 0x58000, 1, RI_ALL_ONLINE }, |
| 147 | { 0x58004, 8191, RI_ALL_OFFLINE }, { 0x60000, 71, RI_ALL_ONLINE }, | 170 | { 0x58004, 8191, RI_E1E1H_OFFLINE }, { 0x60000, 26, RI_ALL_ONLINE }, |
| 148 | { 0x60128, 1, RI_ALL_ONLINE }, { 0x60138, 1, RI_ALL_ONLINE }, | 171 | { 0x60068, 8, RI_E1E1H_ONLINE }, { 0x60088, 12, RI_ALL_ONLINE }, |
| 149 | { 0x6013c, 24, RI_E1H_ONLINE }, { 0x60200, 1, RI_ALL_ONLINE }, | 172 | { 0x600b8, 9, RI_E1E1H_ONLINE }, { 0x600dc, 1, RI_ALL_ONLINE }, |
| 173 | { 0x600e0, 5, RI_E1E1H_ONLINE }, { 0x600f4, 1, RI_ALL_ONLINE }, | ||
| 174 | { 0x600f8, 1, RI_E1E1H_ONLINE }, { 0x600fc, 8, RI_ALL_ONLINE }, | ||
| 175 | { 0x6013c, 24, RI_E1H_ONLINE }, { 0x6019c, 2, RI_E2_ONLINE }, | ||
| 176 | { 0x601ac, 18, RI_E2_ONLINE }, { 0x60200, 1, RI_ALL_ONLINE }, | ||
| 177 | { 0x60204, 2, RI_ALL_OFFLINE }, { 0x60210, 13, RI_E2_ONLINE }, | ||
| 150 | { 0x61000, 1, RI_ALL_ONLINE }, { 0x61004, 511, RI_ALL_OFFLINE }, | 178 | { 0x61000, 1, RI_ALL_ONLINE }, { 0x61004, 511, RI_ALL_OFFLINE }, |
| 151 | { 0x70000, 8, RI_ALL_ONLINE }, { 0x70020, 21496, RI_ALL_OFFLINE }, | 179 | { 0x70000, 8, RI_ALL_ONLINE }, { 0x70020, 8184, RI_ALL_OFFLINE }, |
| 152 | { 0x85000, 3, RI_ALL_ONLINE }, { 0x8500c, 4, RI_ALL_OFFLINE }, | 180 | { 0x85000, 3, RI_ALL_ONLINE }, { 0x8501c, 7, RI_ALL_ONLINE }, |
| 153 | { 0x8501c, 7, RI_ALL_ONLINE }, { 0x85038, 4, RI_ALL_OFFLINE }, | 181 | { 0x85048, 1, RI_ALL_ONLINE }, { 0x85200, 32, RI_ALL_ONLINE }, |
| 154 | { 0x85048, 1, RI_ALL_ONLINE }, { 0x8504c, 109, RI_ALL_OFFLINE }, | 182 | { 0xc1000, 7, RI_ALL_ONLINE }, { 0xc103c, 2, RI_E2_ONLINE }, |
| 155 | { 0x85200, 32, RI_ALL_ONLINE }, { 0x85280, 11104, RI_ALL_OFFLINE }, | 183 | { 0xc1800, 2, RI_ALL_ONLINE }, { 0xc2000, 164, RI_ALL_ONLINE }, |
| 156 | { 0xa0000, 16384, RI_ALL_ONLINE }, { 0xb0000, 16384, RI_E1H_ONLINE }, | 184 | { 0xc22c0, 5, RI_E2_ONLINE }, { 0xc22d8, 4, RI_E2_ONLINE }, |
| 157 | { 0xc1000, 7, RI_ALL_ONLINE }, { 0xc1028, 1, RI_ALL_ONLINE }, | ||
| 158 | { 0xc1038, 1, RI_ALL_ONLINE }, { 0xc1800, 2, RI_ALL_ONLINE }, | ||
| 159 | { 0xc2000, 164, RI_ALL_ONLINE }, { 0xc229c, 1, RI_ALL_ONLINE }, | ||
| 160 | { 0xc22ac, 1, RI_ALL_ONLINE }, { 0xc22bc, 1, RI_ALL_ONLINE }, | ||
| 161 | { 0xc2400, 49, RI_ALL_ONLINE }, { 0xc24c8, 38, RI_ALL_ONLINE }, | 185 | { 0xc2400, 49, RI_ALL_ONLINE }, { 0xc24c8, 38, RI_ALL_ONLINE }, |
| 162 | { 0xc2568, 2, RI_ALL_ONLINE }, { 0xc2600, 1, RI_ALL_ONLINE }, | 186 | { 0xc2568, 2, RI_ALL_ONLINE }, { 0xc2600, 1, RI_ALL_ONLINE }, |
| 163 | { 0xc4000, 165, RI_ALL_ONLINE }, { 0xc42a0, 1, RI_ALL_ONLINE }, | 187 | { 0xc4000, 165, RI_ALL_ONLINE }, { 0xc42d8, 2, RI_E2_ONLINE }, |
| 164 | { 0xc42b0, 1, RI_ALL_ONLINE }, { 0xc42c0, 1, RI_ALL_ONLINE }, | 188 | { 0xc42e0, 7, RI_E1HE2_ONLINE }, { 0xc42fc, 1, RI_E2_ONLINE }, |
| 165 | { 0xc42e0, 7, RI_E1H_ONLINE }, { 0xc4400, 51, RI_ALL_ONLINE }, | 189 | { 0xc4400, 51, RI_ALL_ONLINE }, { 0xc44d0, 38, RI_ALL_ONLINE }, |
| 166 | { 0xc44d0, 38, RI_ALL_ONLINE }, { 0xc4570, 2, RI_ALL_ONLINE }, | 190 | { 0xc4570, 2, RI_ALL_ONLINE }, { 0xc4578, 5, RI_E2_ONLINE }, |
| 167 | { 0xc4600, 1, RI_ALL_ONLINE }, { 0xd0000, 19, RI_ALL_ONLINE }, | 191 | { 0xc4600, 1, RI_ALL_ONLINE }, { 0xd0000, 19, RI_ALL_ONLINE }, |
| 168 | { 0xd004c, 8, RI_ALL_ONLINE }, { 0xd006c, 91, RI_ALL_ONLINE }, | 192 | { 0xd004c, 8, RI_ALL_ONLINE }, { 0xd006c, 91, RI_ALL_ONLINE }, |
| 169 | { 0xd01e4, 1, RI_ALL_ONLINE }, { 0xd01f4, 1, RI_ALL_ONLINE }, | 193 | { 0xd01fc, 1, RI_E2_ONLINE }, { 0xd0200, 2, RI_ALL_ONLINE }, |
| 170 | { 0xd0200, 2, RI_ALL_ONLINE }, { 0xd020c, 7, RI_ALL_ONLINE }, | 194 | { 0xd020c, 7, RI_ALL_ONLINE }, { 0xd0228, 18, RI_E1HE2_ONLINE }, |
| 171 | { 0xd0228, 18, RI_E1H_ONLINE }, { 0xd0280, 1, RI_ALL_ONLINE }, | 195 | { 0xd0280, 1, RI_ALL_ONLINE }, { 0xd0300, 1, RI_ALL_ONLINE }, |
| 172 | { 0xd0300, 1, RI_ALL_ONLINE }, { 0xd0400, 1, RI_ALL_ONLINE }, | 196 | { 0xd0400, 1, RI_ALL_ONLINE }, { 0xd4000, 1, RI_ALL_ONLINE }, |
| 173 | { 0xd4000, 1, RI_ALL_ONLINE }, { 0xd4004, 2559, RI_ALL_OFFLINE }, | 197 | { 0xd4004, 2559, RI_ALL_OFFLINE }, { 0xd8000, 1, RI_ALL_ONLINE }, |
| 174 | { 0xd8000, 1, RI_ALL_ONLINE }, { 0xd8004, 8191, RI_ALL_OFFLINE }, | 198 | { 0xd8004, 8191, RI_ALL_OFFLINE }, { 0xe0000, 21, RI_ALL_ONLINE }, |
| 175 | { 0xe0000, 21, RI_ALL_ONLINE }, { 0xe0054, 8, RI_ALL_ONLINE }, | 199 | { 0xe0054, 8, RI_ALL_ONLINE }, { 0xe0074, 49, RI_ALL_ONLINE }, |
| 176 | { 0xe0074, 85, RI_ALL_ONLINE }, { 0xe01d4, 1, RI_ALL_ONLINE }, | 200 | { 0xe0138, 1, RI_E1E1H_ONLINE }, { 0xe013c, 35, RI_ALL_ONLINE }, |
| 177 | { 0xe01e4, 1, RI_ALL_ONLINE }, { 0xe0200, 2, RI_ALL_ONLINE }, | 201 | { 0xe01f4, 2, RI_E2_ONLINE }, { 0xe0200, 2, RI_ALL_ONLINE }, |
| 178 | { 0xe020c, 8, RI_ALL_ONLINE }, { 0xe022c, 18, RI_E1H_ONLINE }, | 202 | { 0xe020c, 8, RI_ALL_ONLINE }, { 0xe022c, 18, RI_E1HE2_ONLINE }, |
| 179 | { 0xe0280, 1, RI_ALL_ONLINE }, { 0xe0300, 1, RI_ALL_ONLINE }, | 203 | { 0xe0280, 1, RI_ALL_ONLINE }, { 0xe0300, 1, RI_ALL_ONLINE }, |
| 180 | { 0xe1000, 1, RI_ALL_ONLINE }, { 0xe2000, 1, RI_ALL_ONLINE }, | 204 | { 0xe1000, 1, RI_ALL_ONLINE }, { 0xe2000, 1, RI_ALL_ONLINE }, |
| 181 | { 0xe2004, 2047, RI_ALL_OFFLINE }, { 0xf0000, 1, RI_ALL_ONLINE }, | 205 | { 0xe2004, 2047, RI_ALL_OFFLINE }, { 0xf0000, 1, RI_ALL_ONLINE }, |
| 182 | { 0xf0004, 16383, RI_ALL_OFFLINE }, { 0x101000, 12, RI_ALL_ONLINE }, | 206 | { 0xf0004, 16383, RI_ALL_OFFLINE }, { 0x101000, 12, RI_ALL_ONLINE }, |
| 183 | { 0x10103c, 1, RI_ALL_ONLINE }, { 0x10104c, 1, RI_ALL_ONLINE }, | 207 | { 0x101050, 1, RI_E1HE2_ONLINE }, { 0x101054, 3, RI_E2_ONLINE }, |
| 184 | { 0x101050, 1, RI_E1H_ONLINE }, { 0x101100, 1, RI_ALL_ONLINE }, | 208 | { 0x101100, 1, RI_ALL_ONLINE }, { 0x101800, 8, RI_ALL_ONLINE }, |
| 185 | { 0x101800, 8, RI_ALL_ONLINE }, { 0x102000, 18, RI_ALL_ONLINE }, | 209 | { 0x102000, 18, RI_ALL_ONLINE }, { 0x102068, 6, RI_E2_ONLINE }, |
| 186 | { 0x102054, 1, RI_ALL_ONLINE }, { 0x102064, 1, RI_ALL_ONLINE }, | ||
| 187 | { 0x102080, 17, RI_ALL_ONLINE }, { 0x1020c8, 8, RI_E1H_ONLINE }, | 210 | { 0x102080, 17, RI_ALL_ONLINE }, { 0x1020c8, 8, RI_E1H_ONLINE }, |
| 188 | { 0x102400, 1, RI_ALL_ONLINE }, { 0x103000, 26, RI_ALL_ONLINE }, | 211 | { 0x1020e8, 9, RI_E2_ONLINE }, { 0x102400, 1, RI_ALL_ONLINE }, |
| 189 | { 0x103074, 1, RI_ALL_ONLINE }, { 0x103084, 1, RI_ALL_ONLINE }, | 212 | { 0x103000, 26, RI_ALL_ONLINE }, { 0x103098, 5, RI_E1HE2_ONLINE }, |
| 190 | { 0x103094, 1, RI_ALL_ONLINE }, { 0x103098, 5, RI_E1H_ONLINE }, | 213 | { 0x1030ac, 10, RI_E2_ONLINE }, { 0x1030d8, 8, RI_E2_ONLINE }, |
| 214 | { 0x103400, 1, RI_E2_ONLINE }, { 0x103404, 135, RI_E2_OFFLINE }, | ||
| 191 | { 0x103800, 8, RI_ALL_ONLINE }, { 0x104000, 63, RI_ALL_ONLINE }, | 215 | { 0x103800, 8, RI_ALL_ONLINE }, { 0x104000, 63, RI_ALL_ONLINE }, |
| 192 | { 0x104108, 1, RI_ALL_ONLINE }, { 0x104118, 1, RI_ALL_ONLINE }, | 216 | { 0x10411c, 16, RI_E2_ONLINE }, { 0x104200, 17, RI_ALL_ONLINE }, |
| 193 | { 0x104200, 17, RI_ALL_ONLINE }, { 0x104400, 64, RI_ALL_ONLINE }, | 217 | { 0x104400, 64, RI_ALL_ONLINE }, { 0x104500, 192, RI_ALL_OFFLINE }, |
| 194 | { 0x104500, 192, RI_ALL_OFFLINE }, { 0x104800, 64, RI_ALL_ONLINE }, | 218 | { 0x104800, 64, RI_ALL_ONLINE }, { 0x104900, 192, RI_ALL_OFFLINE }, |
| 195 | { 0x104900, 192, RI_ALL_OFFLINE }, { 0x105000, 7, RI_ALL_ONLINE }, | 219 | { 0x105000, 256, RI_ALL_ONLINE }, { 0x105400, 768, RI_ALL_OFFLINE }, |
| 196 | { 0x10501c, 1, RI_ALL_OFFLINE }, { 0x105020, 3, RI_ALL_ONLINE }, | 220 | { 0x107000, 7, RI_E2_ONLINE }, { 0x108000, 33, RI_E1E1H_ONLINE }, |
| 197 | { 0x10502c, 1, RI_ALL_OFFLINE }, { 0x105030, 3, RI_ALL_ONLINE }, | 221 | { 0x1080ac, 5, RI_E1H_ONLINE }, { 0x108100, 5, RI_E1E1H_ONLINE }, |
| 198 | { 0x10503c, 1, RI_ALL_OFFLINE }, { 0x105040, 3, RI_ALL_ONLINE }, | 222 | { 0x108120, 5, RI_E1E1H_ONLINE }, { 0x108200, 74, RI_E1E1H_ONLINE }, |
| 199 | { 0x10504c, 1, RI_ALL_OFFLINE }, { 0x105050, 3, RI_ALL_ONLINE }, | 223 | { 0x108400, 74, RI_E1E1H_ONLINE }, { 0x108800, 152, RI_E1E1H_ONLINE }, |
| 200 | { 0x10505c, 1, RI_ALL_OFFLINE }, { 0x105060, 3, RI_ALL_ONLINE }, | 224 | { 0x110000, 111, RI_E2_ONLINE }, { 0x110200, 4, RI_E2_ONLINE }, |
| 201 | { 0x10506c, 1, RI_ALL_OFFLINE }, { 0x105070, 3, RI_ALL_ONLINE }, | 225 | { 0x120000, 2, RI_ALL_ONLINE }, { 0x120008, 4, RI_ALL_ONLINE }, |
| 202 | { 0x10507c, 1, RI_ALL_OFFLINE }, { 0x105080, 3, RI_ALL_ONLINE }, | 226 | { 0x120018, 3, RI_ALL_ONLINE }, { 0x120024, 4, RI_ALL_ONLINE }, |
| 203 | { 0x10508c, 1, RI_ALL_OFFLINE }, { 0x105090, 3, RI_ALL_ONLINE }, | 227 | { 0x120034, 3, RI_ALL_ONLINE }, { 0x120040, 4, RI_ALL_ONLINE }, |
| 204 | { 0x10509c, 1, RI_ALL_OFFLINE }, { 0x1050a0, 3, RI_ALL_ONLINE }, | 228 | { 0x120050, 3, RI_ALL_ONLINE }, { 0x12005c, 4, RI_ALL_ONLINE }, |
| 205 | { 0x1050ac, 1, RI_ALL_OFFLINE }, { 0x1050b0, 3, RI_ALL_ONLINE }, | 229 | { 0x12006c, 3, RI_ALL_ONLINE }, { 0x120078, 4, RI_ALL_ONLINE }, |
| 206 | { 0x1050bc, 1, RI_ALL_OFFLINE }, { 0x1050c0, 3, RI_ALL_ONLINE }, | 230 | { 0x120088, 3, RI_ALL_ONLINE }, { 0x120094, 4, RI_ALL_ONLINE }, |
| 207 | { 0x1050cc, 1, RI_ALL_OFFLINE }, { 0x1050d0, 3, RI_ALL_ONLINE }, | 231 | { 0x1200a4, 3, RI_ALL_ONLINE }, { 0x1200b0, 4, RI_ALL_ONLINE }, |
| 208 | { 0x1050dc, 1, RI_ALL_OFFLINE }, { 0x1050e0, 3, RI_ALL_ONLINE }, | 232 | { 0x1200c0, 3, RI_ALL_ONLINE }, { 0x1200cc, 4, RI_ALL_ONLINE }, |
| 209 | { 0x1050ec, 1, RI_ALL_OFFLINE }, { 0x1050f0, 3, RI_ALL_ONLINE }, | 233 | { 0x1200dc, 3, RI_ALL_ONLINE }, { 0x1200e8, 4, RI_ALL_ONLINE }, |
| 210 | { 0x1050fc, 1, RI_ALL_OFFLINE }, { 0x105100, 3, RI_ALL_ONLINE }, | 234 | { 0x1200f8, 3, RI_ALL_ONLINE }, { 0x120104, 4, RI_ALL_ONLINE }, |
| 211 | { 0x10510c, 1, RI_ALL_OFFLINE }, { 0x105110, 3, RI_ALL_ONLINE }, | 235 | { 0x120114, 1, RI_ALL_ONLINE }, { 0x120118, 22, RI_ALL_ONLINE }, |
| 212 | { 0x10511c, 1, RI_ALL_OFFLINE }, { 0x105120, 3, RI_ALL_ONLINE }, | 236 | { 0x120170, 2, RI_E1E1H_ONLINE }, { 0x120178, 243, RI_ALL_ONLINE }, |
| 213 | { 0x10512c, 1, RI_ALL_OFFLINE }, { 0x105130, 3, RI_ALL_ONLINE }, | 237 | { 0x120544, 4, RI_E1E1H_ONLINE }, { 0x120554, 7, RI_ALL_ONLINE }, |
| 214 | { 0x10513c, 1, RI_ALL_OFFLINE }, { 0x105140, 3, RI_ALL_ONLINE }, | 238 | { 0x12059c, 6, RI_E1HE2_ONLINE }, { 0x1205b4, 1, RI_E1HE2_ONLINE }, |
| 215 | { 0x10514c, 1, RI_ALL_OFFLINE }, { 0x105150, 3, RI_ALL_ONLINE }, | 239 | { 0x1205b8, 16, RI_E1HE2_ONLINE }, { 0x1205f8, 4, RI_E2_ONLINE }, |
| 216 | { 0x10515c, 1, RI_ALL_OFFLINE }, { 0x105160, 3, RI_ALL_ONLINE }, | 240 | { 0x120618, 1, RI_E2_ONLINE }, { 0x12061c, 20, RI_E1HE2_ONLINE }, |
| 217 | { 0x10516c, 1, RI_ALL_OFFLINE }, { 0x105170, 3, RI_ALL_ONLINE }, | 241 | { 0x12066c, 11, RI_E1HE2_ONLINE }, { 0x120698, 5, RI_E2_ONLINE }, |
| 218 | { 0x10517c, 1, RI_ALL_OFFLINE }, { 0x105180, 3, RI_ALL_ONLINE }, | 242 | { 0x1206b0, 76, RI_E2_ONLINE }, { 0x1207fc, 1, RI_E2_ONLINE }, |
| 219 | { 0x10518c, 1, RI_ALL_OFFLINE }, { 0x105190, 3, RI_ALL_ONLINE }, | 243 | { 0x120808, 66, RI_ALL_ONLINE }, { 0x120910, 7, RI_E2_ONLINE }, |
| 220 | { 0x10519c, 1, RI_ALL_OFFLINE }, { 0x1051a0, 3, RI_ALL_ONLINE }, | 244 | { 0x120930, 9, RI_E2_ONLINE }, { 0x120a00, 2, RI_ALL_ONLINE }, |
| 221 | { 0x1051ac, 1, RI_ALL_OFFLINE }, { 0x1051b0, 3, RI_ALL_ONLINE }, | 245 | { 0x122000, 2, RI_ALL_ONLINE }, { 0x122008, 2046, RI_E1_OFFLINE }, |
| 222 | { 0x1051bc, 1, RI_ALL_OFFLINE }, { 0x1051c0, 3, RI_ALL_ONLINE }, | 246 | { 0x128000, 2, RI_E1HE2_ONLINE }, { 0x128008, 6142, RI_E1HE2_OFFLINE }, |
| 223 | { 0x1051cc, 1, RI_ALL_OFFLINE }, { 0x1051d0, 3, RI_ALL_ONLINE }, | 247 | { 0x130000, 35, RI_E2_ONLINE }, { 0x130100, 29, RI_E2_ONLINE }, |
| 224 | { 0x1051dc, 1, RI_ALL_OFFLINE }, { 0x1051e0, 3, RI_ALL_ONLINE }, | 248 | { 0x130180, 1, RI_E2_ONLINE }, { 0x130200, 1, RI_E2_ONLINE }, |
| 225 | { 0x1051ec, 1, RI_ALL_OFFLINE }, { 0x1051f0, 3, RI_ALL_ONLINE }, | 249 | { 0x130280, 1, RI_E2_ONLINE }, { 0x130300, 5, RI_E2_ONLINE }, |
| 226 | { 0x1051fc, 1, RI_ALL_OFFLINE }, { 0x105200, 3, RI_ALL_ONLINE }, | 250 | { 0x130380, 1, RI_E2_ONLINE }, { 0x130400, 1, RI_E2_ONLINE }, |
| 227 | { 0x10520c, 1, RI_ALL_OFFLINE }, { 0x105210, 3, RI_ALL_ONLINE }, | 251 | { 0x130480, 5, RI_E2_ONLINE }, { 0x130800, 72, RI_E2_ONLINE }, |
| 228 | { 0x10521c, 1, RI_ALL_OFFLINE }, { 0x105220, 3, RI_ALL_ONLINE }, | 252 | { 0x131000, 136, RI_E2_ONLINE }, { 0x132000, 148, RI_E2_ONLINE }, |
| 229 | { 0x10522c, 1, RI_ALL_OFFLINE }, { 0x105230, 3, RI_ALL_ONLINE }, | 253 | { 0x134000, 544, RI_E2_ONLINE }, { 0x140000, 64, RI_ALL_ONLINE }, |
| 230 | { 0x10523c, 1, RI_ALL_OFFLINE }, { 0x105240, 3, RI_ALL_ONLINE }, | 254 | { 0x140100, 5, RI_E1E1H_ONLINE }, { 0x140114, 45, RI_ALL_ONLINE }, |
| 231 | { 0x10524c, 1, RI_ALL_OFFLINE }, { 0x105250, 3, RI_ALL_ONLINE }, | 255 | { 0x140200, 6, RI_ALL_ONLINE }, { 0x140220, 4, RI_E2_ONLINE }, |
| 232 | { 0x10525c, 1, RI_ALL_OFFLINE }, { 0x105260, 3, RI_ALL_ONLINE }, | 256 | { 0x140240, 4, RI_E2_ONLINE }, { 0x140260, 4, RI_E2_ONLINE }, |
| 233 | { 0x10526c, 1, RI_ALL_OFFLINE }, { 0x105270, 3, RI_ALL_ONLINE }, | 257 | { 0x140280, 4, RI_E2_ONLINE }, { 0x1402a0, 4, RI_E2_ONLINE }, |
| 234 | { 0x10527c, 1, RI_ALL_OFFLINE }, { 0x105280, 3, RI_ALL_ONLINE }, | 258 | { 0x1402c0, 4, RI_E2_ONLINE }, { 0x1402e0, 13, RI_E2_ONLINE }, |
| 235 | { 0x10528c, 1, RI_ALL_OFFLINE }, { 0x105290, 3, RI_ALL_ONLINE }, | 259 | { 0x144000, 4, RI_E1E1H_ONLINE }, { 0x148000, 4, RI_E1E1H_ONLINE }, |
| 236 | { 0x10529c, 1, RI_ALL_OFFLINE }, { 0x1052a0, 3, RI_ALL_ONLINE }, | 260 | { 0x14c000, 4, RI_E1E1H_ONLINE }, { 0x150000, 4, RI_E1E1H_ONLINE }, |
| 237 | { 0x1052ac, 1, RI_ALL_OFFLINE }, { 0x1052b0, 3, RI_ALL_ONLINE }, | 261 | { 0x154000, 4, RI_E1E1H_ONLINE }, { 0x158000, 4, RI_E1E1H_ONLINE }, |
| 238 | { 0x1052bc, 1, RI_ALL_OFFLINE }, { 0x1052c0, 3, RI_ALL_ONLINE }, | 262 | { 0x15c000, 2, RI_E1HE2_ONLINE }, { 0x15c008, 5, RI_E1H_ONLINE }, |
| 239 | { 0x1052cc, 1, RI_ALL_OFFLINE }, { 0x1052d0, 3, RI_ALL_ONLINE }, | 263 | { 0x15c020, 27, RI_E2_ONLINE }, { 0x15c090, 13, RI_E2_ONLINE }, |
| 240 | { 0x1052dc, 1, RI_ALL_OFFLINE }, { 0x1052e0, 3, RI_ALL_ONLINE }, | 264 | { 0x15c0c8, 34, RI_E2_ONLINE }, { 0x161000, 7, RI_ALL_ONLINE }, |
| 241 | { 0x1052ec, 1, RI_ALL_OFFLINE }, { 0x1052f0, 3, RI_ALL_ONLINE }, | 265 | { 0x16103c, 2, RI_E2_ONLINE }, { 0x161800, 2, RI_ALL_ONLINE }, |
| 242 | { 0x1052fc, 1, RI_ALL_OFFLINE }, { 0x105300, 3, RI_ALL_ONLINE }, | 266 | { 0x164000, 60, RI_ALL_ONLINE }, { 0x164110, 2, RI_E1HE2_ONLINE }, |
| 243 | { 0x10530c, 1, RI_ALL_OFFLINE }, { 0x105310, 3, RI_ALL_ONLINE }, | 267 | { 0x164118, 15, RI_E2_ONLINE }, { 0x164200, 1, RI_ALL_ONLINE }, |
| 244 | { 0x10531c, 1, RI_ALL_OFFLINE }, { 0x105320, 3, RI_ALL_ONLINE }, | ||
| 245 | { 0x10532c, 1, RI_ALL_OFFLINE }, { 0x105330, 3, RI_ALL_ONLINE }, | ||
| 246 | { 0x10533c, 1, RI_ALL_OFFLINE }, { 0x105340, 3, RI_ALL_ONLINE }, | ||
| 247 | { 0x10534c, 1, RI_ALL_OFFLINE }, { 0x105350, 3, RI_ALL_ONLINE }, | ||
| 248 | { 0x10535c, 1, RI_ALL_OFFLINE }, { 0x105360, 3, RI_ALL_ONLINE }, | ||
| 249 | { 0x10536c, 1, RI_ALL_OFFLINE }, { 0x105370, 3, RI_ALL_ONLINE }, | ||
| 250 | { 0x10537c, 1, RI_ALL_OFFLINE }, { 0x105380, 3, RI_ALL_ONLINE }, | ||
| 251 | { 0x10538c, 1, RI_ALL_OFFLINE }, { 0x105390, 3, RI_ALL_ONLINE }, | ||
| 252 | { 0x10539c, 1, RI_ALL_OFFLINE }, { 0x1053a0, 3, RI_ALL_ONLINE }, | ||
| 253 | { 0x1053ac, 1, RI_ALL_OFFLINE }, { 0x1053b0, 3, RI_ALL_ONLINE }, | ||
| 254 | { 0x1053bc, 1, RI_ALL_OFFLINE }, { 0x1053c0, 3, RI_ALL_ONLINE }, | ||
| 255 | { 0x1053cc, 1, RI_ALL_OFFLINE }, { 0x1053d0, 3, RI_ALL_ONLINE }, | ||
| 256 | { 0x1053dc, 1, RI_ALL_OFFLINE }, { 0x1053e0, 3, RI_ALL_ONLINE }, | ||
| 257 | { 0x1053ec, 1, RI_ALL_OFFLINE }, { 0x1053f0, 3, RI_ALL_ONLINE }, | ||
| 258 | { 0x1053fc, 769, RI_ALL_OFFLINE }, { 0x108000, 33, RI_ALL_ONLINE }, | ||
| 259 | { 0x108090, 1, RI_ALL_ONLINE }, { 0x1080a0, 1, RI_ALL_ONLINE }, | ||
| 260 | { 0x1080ac, 5, RI_E1H_ONLINE }, { 0x108100, 5, RI_ALL_ONLINE }, | ||
| 261 | { 0x108120, 5, RI_ALL_ONLINE }, { 0x108200, 74, RI_ALL_ONLINE }, | ||
| 262 | { 0x108400, 74, RI_ALL_ONLINE }, { 0x108800, 152, RI_ALL_ONLINE }, | ||
| 263 | { 0x109000, 1, RI_ALL_ONLINE }, { 0x120000, 347, RI_ALL_ONLINE }, | ||
| 264 | { 0x120578, 1, RI_ALL_ONLINE }, { 0x120588, 1, RI_ALL_ONLINE }, | ||
| 265 | { 0x120598, 1, RI_ALL_ONLINE }, { 0x12059c, 23, RI_E1H_ONLINE }, | ||
| 266 | { 0x120614, 1, RI_E1H_ONLINE }, { 0x12061c, 30, RI_E1H_ONLINE }, | ||
| 267 | { 0x12080c, 65, RI_ALL_ONLINE }, { 0x120a00, 2, RI_ALL_ONLINE }, | ||
| 268 | { 0x122000, 2, RI_ALL_ONLINE }, { 0x128000, 2, RI_E1H_ONLINE }, | ||
| 269 | { 0x140000, 114, RI_ALL_ONLINE }, { 0x1401d4, 1, RI_ALL_ONLINE }, | ||
| 270 | { 0x1401e4, 1, RI_ALL_ONLINE }, { 0x140200, 6, RI_ALL_ONLINE }, | ||
| 271 | { 0x144000, 4, RI_ALL_ONLINE }, { 0x148000, 4, RI_ALL_ONLINE }, | ||
| 272 | { 0x14c000, 4, RI_ALL_ONLINE }, { 0x150000, 4, RI_ALL_ONLINE }, | ||
| 273 | { 0x154000, 4, RI_ALL_ONLINE }, { 0x158000, 4, RI_ALL_ONLINE }, | ||
| 274 | { 0x15c000, 7, RI_E1H_ONLINE }, { 0x161000, 7, RI_ALL_ONLINE }, | ||
| 275 | { 0x161028, 1, RI_ALL_ONLINE }, { 0x161038, 1, RI_ALL_ONLINE }, | ||
| 276 | { 0x161800, 2, RI_ALL_ONLINE }, { 0x164000, 60, RI_ALL_ONLINE }, | ||
| 277 | { 0x1640fc, 1, RI_ALL_ONLINE }, { 0x16410c, 1, RI_ALL_ONLINE }, | ||
| 278 | { 0x164110, 2, RI_E1H_ONLINE }, { 0x164200, 1, RI_ALL_ONLINE }, | ||
| 279 | { 0x164208, 1, RI_ALL_ONLINE }, { 0x164210, 1, RI_ALL_ONLINE }, | 268 | { 0x164208, 1, RI_ALL_ONLINE }, { 0x164210, 1, RI_ALL_ONLINE }, |
| 280 | { 0x164218, 1, RI_ALL_ONLINE }, { 0x164220, 1, RI_ALL_ONLINE }, | 269 | { 0x164218, 1, RI_ALL_ONLINE }, { 0x164220, 1, RI_ALL_ONLINE }, |
| 281 | { 0x164228, 1, RI_ALL_ONLINE }, { 0x164230, 1, RI_ALL_ONLINE }, | 270 | { 0x164228, 1, RI_ALL_ONLINE }, { 0x164230, 1, RI_ALL_ONLINE }, |
| @@ -284,169 +273,298 @@ static const struct reg_addr reg_addrs[REGS_COUNT] = { | |||
| 284 | { 0x164258, 1, RI_ALL_ONLINE }, { 0x164260, 1, RI_ALL_ONLINE }, | 273 | { 0x164258, 1, RI_ALL_ONLINE }, { 0x164260, 1, RI_ALL_ONLINE }, |
| 285 | { 0x164270, 2, RI_ALL_ONLINE }, { 0x164280, 2, RI_ALL_ONLINE }, | 274 | { 0x164270, 2, RI_ALL_ONLINE }, { 0x164280, 2, RI_ALL_ONLINE }, |
| 286 | { 0x164800, 2, RI_ALL_ONLINE }, { 0x165000, 2, RI_ALL_ONLINE }, | 275 | { 0x164800, 2, RI_ALL_ONLINE }, { 0x165000, 2, RI_ALL_ONLINE }, |
| 287 | { 0x166000, 164, RI_ALL_ONLINE }, { 0x16629c, 1, RI_ALL_ONLINE }, | 276 | { 0x166000, 164, RI_ALL_ONLINE }, { 0x1662cc, 7, RI_E2_ONLINE }, |
| 288 | { 0x1662ac, 1, RI_ALL_ONLINE }, { 0x1662bc, 1, RI_ALL_ONLINE }, | ||
| 289 | { 0x166400, 49, RI_ALL_ONLINE }, { 0x1664c8, 38, RI_ALL_ONLINE }, | 277 | { 0x166400, 49, RI_ALL_ONLINE }, { 0x1664c8, 38, RI_ALL_ONLINE }, |
| 290 | { 0x166568, 2, RI_ALL_ONLINE }, { 0x166800, 1, RI_ALL_ONLINE }, | 278 | { 0x166568, 2, RI_ALL_ONLINE }, { 0x166570, 5, RI_E2_ONLINE }, |
| 291 | { 0x168000, 270, RI_ALL_ONLINE }, { 0x168444, 1, RI_ALL_ONLINE }, | 279 | { 0x166800, 1, RI_ALL_ONLINE }, { 0x168000, 137, RI_ALL_ONLINE }, |
| 292 | { 0x168454, 1, RI_ALL_ONLINE }, { 0x168800, 19, RI_ALL_ONLINE }, | 280 | { 0x168224, 2, RI_E1E1H_ONLINE }, { 0x16822c, 29, RI_ALL_ONLINE }, |
| 293 | { 0x168900, 1, RI_ALL_ONLINE }, { 0x168a00, 128, RI_ALL_ONLINE }, | 281 | { 0x1682a0, 12, RI_E1E1H_ONLINE }, { 0x1682d0, 12, RI_ALL_ONLINE }, |
| 294 | { 0x16a000, 1, RI_ALL_ONLINE }, { 0x16a004, 1535, RI_ALL_OFFLINE }, | 282 | { 0x168300, 2, RI_E1E1H_ONLINE }, { 0x168308, 68, RI_ALL_ONLINE }, |
| 295 | { 0x16c000, 1, RI_ALL_ONLINE }, { 0x16c004, 1535, RI_ALL_OFFLINE }, | 283 | { 0x168418, 2, RI_E1E1H_ONLINE }, { 0x168420, 6, RI_ALL_ONLINE }, |
| 296 | { 0x16e000, 16, RI_E1H_ONLINE }, { 0x16e100, 1, RI_E1H_ONLINE }, | 284 | { 0x168800, 19, RI_ALL_ONLINE }, { 0x168900, 1, RI_ALL_ONLINE }, |
| 297 | { 0x16e200, 2, RI_E1H_ONLINE }, { 0x16e400, 183, RI_E1H_ONLINE }, | 285 | { 0x168a00, 128, RI_ALL_ONLINE }, { 0x16a000, 1, RI_ALL_ONLINE }, |
| 298 | { 0x170000, 93, RI_ALL_ONLINE }, { 0x170180, 1, RI_ALL_ONLINE }, | 286 | { 0x16a004, 1535, RI_ALL_OFFLINE }, { 0x16c000, 1, RI_ALL_ONLINE }, |
| 299 | { 0x170190, 1, RI_ALL_ONLINE }, { 0x170200, 4, RI_ALL_ONLINE }, | 287 | { 0x16c004, 1535, RI_ALL_OFFLINE }, { 0x16e000, 16, RI_E1H_ONLINE }, |
| 300 | { 0x170214, 1, RI_ALL_ONLINE }, { 0x178000, 1, RI_ALL_ONLINE }, | 288 | { 0x16e040, 8, RI_E2_ONLINE }, { 0x16e100, 1, RI_E1H_ONLINE }, |
| 301 | { 0x180000, 61, RI_ALL_ONLINE }, { 0x180100, 1, RI_ALL_ONLINE }, | 289 | { 0x16e200, 2, RI_E1H_ONLINE }, { 0x16e400, 161, RI_E1H_ONLINE }, |
| 302 | { 0x180110, 1, RI_ALL_ONLINE }, { 0x180120, 1, RI_ALL_ONLINE }, | 290 | { 0x16e684, 2, RI_E1HE2_ONLINE }, { 0x16e68c, 12, RI_E1H_ONLINE }, |
| 303 | { 0x180130, 1, RI_ALL_ONLINE }, { 0x18013c, 2, RI_E1H_ONLINE }, | 291 | { 0x16e6bc, 4, RI_E1HE2_ONLINE }, { 0x16e6cc, 4, RI_E1H_ONLINE }, |
| 304 | { 0x180200, 58, RI_ALL_ONLINE }, { 0x180340, 4, RI_ALL_ONLINE }, | 292 | { 0x16e6e0, 12, RI_E2_ONLINE }, { 0x16e768, 17, RI_E2_ONLINE }, |
| 305 | { 0x180400, 1, RI_ALL_ONLINE }, { 0x180404, 255, RI_ALL_OFFLINE }, | 293 | { 0x170000, 24, RI_ALL_ONLINE }, { 0x170060, 4, RI_E1E1H_ONLINE }, |
| 294 | { 0x170070, 65, RI_ALL_ONLINE }, { 0x170194, 11, RI_E2_ONLINE }, | ||
| 295 | { 0x1701c4, 1, RI_E2_ONLINE }, { 0x1701cc, 7, RI_E2_ONLINE }, | ||
| 296 | { 0x1701ec, 1, RI_E2_ONLINE }, { 0x1701f4, 1, RI_E2_ONLINE }, | ||
| 297 | { 0x170200, 4, RI_ALL_ONLINE }, { 0x170214, 1, RI_ALL_ONLINE }, | ||
| 298 | { 0x170218, 77, RI_E2_ONLINE }, { 0x170400, 64, RI_E2_ONLINE }, | ||
| 299 | { 0x178000, 1, RI_ALL_ONLINE }, { 0x180000, 61, RI_ALL_ONLINE }, | ||
| 300 | { 0x18013c, 2, RI_E1HE2_ONLINE }, { 0x180200, 58, RI_ALL_ONLINE }, | ||
| 301 | { 0x180340, 4, RI_ALL_ONLINE }, { 0x180380, 1, RI_E2_ONLINE }, | ||
| 302 | { 0x180388, 1, RI_E2_ONLINE }, { 0x180390, 1, RI_E2_ONLINE }, | ||
| 303 | { 0x180398, 1, RI_E2_ONLINE }, { 0x1803a0, 5, RI_E2_ONLINE }, | ||
| 304 | { 0x180400, 1, RI_ALL_ONLINE }, { 0x180404, 255, RI_E1E1H_OFFLINE }, | ||
| 306 | { 0x181000, 4, RI_ALL_ONLINE }, { 0x181010, 1020, RI_ALL_OFFLINE }, | 305 | { 0x181000, 4, RI_ALL_ONLINE }, { 0x181010, 1020, RI_ALL_OFFLINE }, |
| 307 | { 0x1a0000, 1, RI_ALL_ONLINE }, { 0x1a0004, 1023, RI_ALL_OFFLINE }, | 306 | { 0x1a0000, 1, RI_ALL_ONLINE }, { 0x1a0004, 5631, RI_ALL_OFFLINE }, |
| 308 | { 0x1a1000, 1, RI_ALL_ONLINE }, { 0x1a1004, 4607, RI_ALL_OFFLINE }, | 307 | { 0x1a5800, 2560, RI_E1HE2_OFFLINE }, { 0x1a8000, 1, RI_ALL_ONLINE }, |
| 309 | { 0x1a5800, 2560, RI_E1H_OFFLINE }, { 0x1a8000, 64, RI_ALL_OFFLINE }, | 308 | { 0x1a8004, 8191, RI_E1HE2_OFFLINE }, { 0x1b0000, 1, RI_ALL_ONLINE }, |
| 310 | { 0x1a8100, 1984, RI_E1H_OFFLINE }, { 0x1aa000, 1, RI_E1H_ONLINE }, | 309 | { 0x1b0004, 15, RI_E1H_OFFLINE }, { 0x1b0040, 1, RI_E1HE2_ONLINE }, |
| 311 | { 0x1aa004, 6655, RI_E1H_OFFLINE }, { 0x1b1800, 128, RI_ALL_OFFLINE }, | 310 | { 0x1b0044, 239, RI_E1H_OFFLINE }, { 0x1b0400, 1, RI_ALL_ONLINE }, |
| 312 | { 0x1b1c00, 128, RI_ALL_OFFLINE }, { 0x1b2000, 1, RI_ALL_OFFLINE }, | 311 | { 0x1b0404, 255, RI_E1H_OFFLINE }, { 0x1b0800, 1, RI_ALL_ONLINE }, |
| 313 | { 0x1b2400, 64, RI_E1H_OFFLINE }, { 0x1b8200, 1, RI_ALL_ONLINE }, | 312 | { 0x1b0840, 1, RI_E1HE2_ONLINE }, { 0x1b0c00, 1, RI_ALL_ONLINE }, |
| 313 | { 0x1b1000, 1, RI_ALL_ONLINE }, { 0x1b1040, 1, RI_E1HE2_ONLINE }, | ||
| 314 | { 0x1b1400, 1, RI_ALL_ONLINE }, { 0x1b1440, 1, RI_E1HE2_ONLINE }, | ||
| 315 | { 0x1b1480, 1, RI_E1HE2_ONLINE }, { 0x1b14c0, 1, RI_E1HE2_ONLINE }, | ||
| 316 | { 0x1b1800, 128, RI_ALL_OFFLINE }, { 0x1b1c00, 128, RI_ALL_OFFLINE }, | ||
| 317 | { 0x1b2000, 1, RI_ALL_ONLINE }, { 0x1b2400, 1, RI_E1HE2_ONLINE }, | ||
| 318 | { 0x1b2404, 5631, RI_E2_OFFLINE }, { 0x1b8000, 1, RI_ALL_ONLINE }, | ||
| 319 | { 0x1b8040, 1, RI_ALL_ONLINE }, { 0x1b8080, 1, RI_ALL_ONLINE }, | ||
| 320 | { 0x1b80c0, 1, RI_ALL_ONLINE }, { 0x1b8100, 1, RI_ALL_ONLINE }, | ||
| 321 | { 0x1b8140, 1, RI_ALL_ONLINE }, { 0x1b8180, 1, RI_ALL_ONLINE }, | ||
| 322 | { 0x1b81c0, 1, RI_ALL_ONLINE }, { 0x1b8200, 1, RI_ALL_ONLINE }, | ||
| 314 | { 0x1b8240, 1, RI_ALL_ONLINE }, { 0x1b8280, 1, RI_ALL_ONLINE }, | 323 | { 0x1b8240, 1, RI_ALL_ONLINE }, { 0x1b8280, 1, RI_ALL_ONLINE }, |
| 315 | { 0x1b82c0, 1, RI_ALL_ONLINE }, { 0x1b8a00, 1, RI_ALL_ONLINE }, | 324 | { 0x1b82c0, 1, RI_ALL_ONLINE }, { 0x1b8300, 1, RI_ALL_ONLINE }, |
| 316 | { 0x1b8a80, 1, RI_ALL_ONLINE }, { 0x1c0000, 2, RI_ALL_ONLINE }, | 325 | { 0x1b8340, 1, RI_ALL_ONLINE }, { 0x1b8380, 1, RI_ALL_ONLINE }, |
| 317 | { 0x200000, 65, RI_ALL_ONLINE }, { 0x200110, 1, RI_ALL_ONLINE }, | 326 | { 0x1b83c0, 1, RI_ALL_ONLINE }, { 0x1b8400, 1, RI_ALL_ONLINE }, |
| 318 | { 0x200120, 1, RI_ALL_ONLINE }, { 0x200130, 1, RI_ALL_ONLINE }, | 327 | { 0x1b8440, 1, RI_ALL_ONLINE }, { 0x1b8480, 1, RI_ALL_ONLINE }, |
| 319 | { 0x200140, 1, RI_ALL_ONLINE }, { 0x20014c, 2, RI_E1H_ONLINE }, | 328 | { 0x1b84c0, 1, RI_ALL_ONLINE }, { 0x1b8500, 1, RI_ALL_ONLINE }, |
| 320 | { 0x200200, 58, RI_ALL_ONLINE }, { 0x200340, 4, RI_ALL_ONLINE }, | 329 | { 0x1b8540, 1, RI_ALL_ONLINE }, { 0x1b8580, 1, RI_ALL_ONLINE }, |
| 321 | { 0x200400, 1, RI_ALL_ONLINE }, { 0x200404, 255, RI_ALL_OFFLINE }, | 330 | { 0x1b85c0, 19, RI_E2_ONLINE }, { 0x1b8800, 1, RI_ALL_ONLINE }, |
| 322 | { 0x202000, 4, RI_ALL_ONLINE }, { 0x202010, 2044, RI_ALL_OFFLINE }, | 331 | { 0x1b8840, 1, RI_ALL_ONLINE }, { 0x1b8880, 1, RI_ALL_ONLINE }, |
| 323 | { 0x220000, 1, RI_ALL_ONLINE }, { 0x220004, 1023, RI_ALL_OFFLINE }, | 332 | { 0x1b88c0, 1, RI_ALL_ONLINE }, { 0x1b8900, 1, RI_ALL_ONLINE }, |
| 324 | { 0x221000, 1, RI_ALL_ONLINE }, { 0x221004, 4607, RI_ALL_OFFLINE }, | 333 | { 0x1b8940, 1, RI_ALL_ONLINE }, { 0x1b8980, 1, RI_ALL_ONLINE }, |
| 325 | { 0x225800, 1536, RI_E1H_OFFLINE }, { 0x227000, 1, RI_E1H_ONLINE }, | 334 | { 0x1b89c0, 1, RI_ALL_ONLINE }, { 0x1b8a00, 1, RI_ALL_ONLINE }, |
| 326 | { 0x227004, 1023, RI_E1H_OFFLINE }, { 0x228000, 64, RI_ALL_OFFLINE }, | 335 | { 0x1b8a40, 1, RI_ALL_ONLINE }, { 0x1b8a80, 1, RI_ALL_ONLINE }, |
| 327 | { 0x228100, 8640, RI_E1H_OFFLINE }, { 0x231800, 128, RI_ALL_OFFLINE }, | 336 | { 0x1b8ac0, 1, RI_ALL_ONLINE }, { 0x1b8b00, 1, RI_ALL_ONLINE }, |
| 328 | { 0x231c00, 128, RI_ALL_OFFLINE }, { 0x232000, 1, RI_ALL_OFFLINE }, | 337 | { 0x1b8b40, 1, RI_ALL_ONLINE }, { 0x1b8b80, 1, RI_ALL_ONLINE }, |
| 329 | { 0x232400, 64, RI_E1H_OFFLINE }, { 0x238200, 1, RI_ALL_ONLINE }, | 338 | { 0x1b8bc0, 1, RI_ALL_ONLINE }, { 0x1b8c00, 1, RI_ALL_ONLINE }, |
| 330 | { 0x238240, 1, RI_ALL_ONLINE }, { 0x238280, 1, RI_ALL_ONLINE }, | 339 | { 0x1b8c40, 1, RI_ALL_ONLINE }, { 0x1b8c80, 1, RI_ALL_ONLINE }, |
| 331 | { 0x2382c0, 1, RI_ALL_ONLINE }, { 0x238a00, 1, RI_ALL_ONLINE }, | 340 | { 0x1b8cc0, 1, RI_ALL_ONLINE }, { 0x1b8cc4, 1, RI_E2_ONLINE }, |
| 332 | { 0x238a80, 1, RI_ALL_ONLINE }, { 0x240000, 2, RI_ALL_ONLINE }, | 341 | { 0x1b8d00, 1, RI_ALL_ONLINE }, { 0x1b8d40, 1, RI_ALL_ONLINE }, |
| 333 | { 0x280000, 65, RI_ALL_ONLINE }, { 0x280110, 1, RI_ALL_ONLINE }, | 342 | { 0x1b8d80, 1, RI_ALL_ONLINE }, { 0x1b8dc0, 1, RI_ALL_ONLINE }, |
| 334 | { 0x280120, 1, RI_ALL_ONLINE }, { 0x280130, 1, RI_ALL_ONLINE }, | 343 | { 0x1b8e00, 1, RI_ALL_ONLINE }, { 0x1b8e40, 1, RI_ALL_ONLINE }, |
| 335 | { 0x280140, 1, RI_ALL_ONLINE }, { 0x28014c, 2, RI_E1H_ONLINE }, | 344 | { 0x1b8e80, 1, RI_ALL_ONLINE }, { 0x1b8e84, 1, RI_E2_ONLINE }, |
| 336 | { 0x280200, 58, RI_ALL_ONLINE }, { 0x280340, 4, RI_ALL_ONLINE }, | 345 | { 0x1b8ec0, 1, RI_E1HE2_ONLINE }, { 0x1b8f00, 1, RI_E1HE2_ONLINE }, |
| 337 | { 0x280400, 1, RI_ALL_ONLINE }, { 0x280404, 255, RI_ALL_OFFLINE }, | 346 | { 0x1b8f40, 1, RI_E1HE2_ONLINE }, { 0x1b8f80, 1, RI_E1HE2_ONLINE }, |
| 338 | { 0x282000, 4, RI_ALL_ONLINE }, { 0x282010, 2044, RI_ALL_OFFLINE }, | 347 | { 0x1b8fc0, 1, RI_E1HE2_ONLINE }, { 0x1b8fc4, 2, RI_E2_ONLINE }, |
| 339 | { 0x2a0000, 1, RI_ALL_ONLINE }, { 0x2a0004, 1023, RI_ALL_OFFLINE }, | 348 | { 0x1b8fd0, 6, RI_E2_ONLINE }, { 0x1b9000, 1, RI_E2_ONLINE }, |
| 340 | { 0x2a1000, 1, RI_ALL_ONLINE }, { 0x2a1004, 4607, RI_ALL_OFFLINE }, | 349 | { 0x1b9040, 3, RI_E2_ONLINE }, { 0x1b9400, 14, RI_E2_ONLINE }, |
| 341 | { 0x2a5800, 2560, RI_E1H_OFFLINE }, { 0x2a8000, 64, RI_ALL_OFFLINE }, | 350 | { 0x1b943c, 19, RI_E2_ONLINE }, { 0x1b9490, 10, RI_E2_ONLINE }, |
| 342 | { 0x2a8100, 960, RI_E1H_OFFLINE }, { 0x2a9000, 1, RI_E1H_ONLINE }, | 351 | { 0x1c0000, 2, RI_ALL_ONLINE }, { 0x200000, 65, RI_ALL_ONLINE }, |
| 343 | { 0x2a9004, 7679, RI_E1H_OFFLINE }, { 0x2b1800, 128, RI_ALL_OFFLINE }, | 352 | { 0x20014c, 2, RI_E1HE2_ONLINE }, { 0x200200, 58, RI_ALL_ONLINE }, |
| 344 | { 0x2b1c00, 128, RI_ALL_OFFLINE }, { 0x2b2000, 1, RI_ALL_OFFLINE }, | 353 | { 0x200340, 4, RI_ALL_ONLINE }, { 0x200380, 1, RI_E2_ONLINE }, |
| 345 | { 0x2b2400, 64, RI_E1H_OFFLINE }, { 0x2b8200, 1, RI_ALL_ONLINE }, | 354 | { 0x200388, 1, RI_E2_ONLINE }, { 0x200390, 1, RI_E2_ONLINE }, |
| 346 | { 0x2b8240, 1, RI_ALL_ONLINE }, { 0x2b8280, 1, RI_ALL_ONLINE }, | 355 | { 0x200398, 1, RI_E2_ONLINE }, { 0x2003a0, 1, RI_E2_ONLINE }, |
| 347 | { 0x2b82c0, 1, RI_ALL_ONLINE }, { 0x2b8a00, 1, RI_ALL_ONLINE }, | 356 | { 0x2003a8, 2, RI_E2_ONLINE }, { 0x200400, 1, RI_ALL_ONLINE }, |
| 348 | { 0x2b8a80, 1, RI_ALL_ONLINE }, { 0x2c0000, 2, RI_ALL_ONLINE }, | 357 | { 0x200404, 255, RI_E1E1H_OFFLINE }, { 0x202000, 4, RI_ALL_ONLINE }, |
| 349 | { 0x300000, 65, RI_ALL_ONLINE }, { 0x300110, 1, RI_ALL_ONLINE }, | 358 | { 0x202010, 2044, RI_ALL_OFFLINE }, { 0x220000, 1, RI_ALL_ONLINE }, |
| 350 | { 0x300120, 1, RI_ALL_ONLINE }, { 0x300130, 1, RI_ALL_ONLINE }, | 359 | { 0x220004, 5631, RI_ALL_OFFLINE }, { 0x225800, 2560, RI_E1HE2_OFFLINE}, |
| 351 | { 0x300140, 1, RI_ALL_ONLINE }, { 0x30014c, 2, RI_E1H_ONLINE }, | 360 | { 0x228000, 1, RI_ALL_ONLINE }, { 0x228004, 8191, RI_E1HE2_OFFLINE }, |
| 361 | { 0x230000, 1, RI_ALL_ONLINE }, { 0x230004, 15, RI_E1H_OFFLINE }, | ||
| 362 | { 0x230040, 1, RI_E1HE2_ONLINE }, { 0x230044, 239, RI_E1H_OFFLINE }, | ||
| 363 | { 0x230400, 1, RI_ALL_ONLINE }, { 0x230404, 255, RI_E1H_OFFLINE }, | ||
| 364 | { 0x230800, 1, RI_ALL_ONLINE }, { 0x230840, 1, RI_E1HE2_ONLINE }, | ||
| 365 | { 0x230c00, 1, RI_ALL_ONLINE }, { 0x231000, 1, RI_ALL_ONLINE }, | ||
| 366 | { 0x231040, 1, RI_E1HE2_ONLINE }, { 0x231400, 1, RI_ALL_ONLINE }, | ||
| 367 | { 0x231440, 1, RI_E1HE2_ONLINE }, { 0x231480, 1, RI_E1HE2_ONLINE }, | ||
| 368 | { 0x2314c0, 1, RI_E1HE2_ONLINE }, { 0x231800, 128, RI_ALL_OFFLINE }, | ||
| 369 | { 0x231c00, 128, RI_ALL_OFFLINE }, { 0x232000, 1, RI_ALL_ONLINE }, | ||
| 370 | { 0x232400, 1, RI_E1HE2_ONLINE }, { 0x232404, 5631, RI_E2_OFFLINE }, | ||
| 371 | { 0x238000, 1, RI_ALL_ONLINE }, { 0x238040, 1, RI_ALL_ONLINE }, | ||
| 372 | { 0x238080, 1, RI_ALL_ONLINE }, { 0x2380c0, 1, RI_ALL_ONLINE }, | ||
| 373 | { 0x238100, 1, RI_ALL_ONLINE }, { 0x238140, 1, RI_ALL_ONLINE }, | ||
| 374 | { 0x238180, 1, RI_ALL_ONLINE }, { 0x2381c0, 1, RI_ALL_ONLINE }, | ||
| 375 | { 0x238200, 1, RI_ALL_ONLINE }, { 0x238240, 1, RI_ALL_ONLINE }, | ||
| 376 | { 0x238280, 1, RI_ALL_ONLINE }, { 0x2382c0, 1, RI_ALL_ONLINE }, | ||
| 377 | { 0x238300, 1, RI_ALL_ONLINE }, { 0x238340, 1, RI_ALL_ONLINE }, | ||
| 378 | { 0x238380, 1, RI_ALL_ONLINE }, { 0x2383c0, 1, RI_ALL_ONLINE }, | ||
| 379 | { 0x238400, 1, RI_ALL_ONLINE }, { 0x238440, 1, RI_ALL_ONLINE }, | ||
| 380 | { 0x238480, 1, RI_ALL_ONLINE }, { 0x2384c0, 1, RI_ALL_ONLINE }, | ||
| 381 | { 0x238500, 1, RI_ALL_ONLINE }, { 0x238540, 1, RI_ALL_ONLINE }, | ||
| 382 | { 0x238580, 1, RI_ALL_ONLINE }, { 0x2385c0, 19, RI_E2_ONLINE }, | ||
| 383 | { 0x238800, 1, RI_ALL_ONLINE }, { 0x238840, 1, RI_ALL_ONLINE }, | ||
| 384 | { 0x238880, 1, RI_ALL_ONLINE }, { 0x2388c0, 1, RI_ALL_ONLINE }, | ||
| 385 | { 0x238900, 1, RI_ALL_ONLINE }, { 0x238940, 1, RI_ALL_ONLINE }, | ||
| 386 | { 0x238980, 1, RI_ALL_ONLINE }, { 0x2389c0, 1, RI_ALL_ONLINE }, | ||
| 387 | { 0x238a00, 1, RI_ALL_ONLINE }, { 0x238a40, 1, RI_ALL_ONLINE }, | ||
| 388 | { 0x238a80, 1, RI_ALL_ONLINE }, { 0x238ac0, 1, RI_ALL_ONLINE }, | ||
| 389 | { 0x238b00, 1, RI_ALL_ONLINE }, { 0x238b40, 1, RI_ALL_ONLINE }, | ||
| 390 | { 0x238b80, 1, RI_ALL_ONLINE }, { 0x238bc0, 1, RI_ALL_ONLINE }, | ||
| 391 | { 0x238c00, 1, RI_ALL_ONLINE }, { 0x238c40, 1, RI_ALL_ONLINE }, | ||
| 392 | { 0x238c80, 1, RI_ALL_ONLINE }, { 0x238cc0, 1, RI_ALL_ONLINE }, | ||
| 393 | { 0x238cc4, 1, RI_E2_ONLINE }, { 0x238d00, 1, RI_ALL_ONLINE }, | ||
| 394 | { 0x238d40, 1, RI_ALL_ONLINE }, { 0x238d80, 1, RI_ALL_ONLINE }, | ||
| 395 | { 0x238dc0, 1, RI_ALL_ONLINE }, { 0x238e00, 1, RI_ALL_ONLINE }, | ||
| 396 | { 0x238e40, 1, RI_ALL_ONLINE }, { 0x238e80, 1, RI_ALL_ONLINE }, | ||
| 397 | { 0x238e84, 1, RI_E2_ONLINE }, { 0x238ec0, 1, RI_E1HE2_ONLINE }, | ||
| 398 | { 0x238f00, 1, RI_E1HE2_ONLINE }, { 0x238f40, 1, RI_E1HE2_ONLINE }, | ||
| 399 | { 0x238f80, 1, RI_E1HE2_ONLINE }, { 0x238fc0, 1, RI_E1HE2_ONLINE }, | ||
| 400 | { 0x238fc4, 2, RI_E2_ONLINE }, { 0x238fd0, 6, RI_E2_ONLINE }, | ||
| 401 | { 0x239000, 1, RI_E2_ONLINE }, { 0x239040, 3, RI_E2_ONLINE }, | ||
| 402 | { 0x240000, 2, RI_ALL_ONLINE }, { 0x280000, 65, RI_ALL_ONLINE }, | ||
| 403 | { 0x28014c, 2, RI_E1HE2_ONLINE }, { 0x280200, 58, RI_ALL_ONLINE }, | ||
| 404 | { 0x280340, 4, RI_ALL_ONLINE }, { 0x280380, 1, RI_E2_ONLINE }, | ||
| 405 | { 0x280388, 1, RI_E2_ONLINE }, { 0x280390, 1, RI_E2_ONLINE }, | ||
| 406 | { 0x280398, 1, RI_E2_ONLINE }, { 0x2803a0, 1, RI_E2_ONLINE }, | ||
| 407 | { 0x2803a8, 2, RI_E2_ONLINE }, { 0x280400, 1, RI_ALL_ONLINE }, | ||
| 408 | { 0x280404, 255, RI_E1E1H_OFFLINE }, { 0x282000, 4, RI_ALL_ONLINE }, | ||
| 409 | { 0x282010, 2044, RI_ALL_OFFLINE }, { 0x2a0000, 1, RI_ALL_ONLINE }, | ||
| 410 | { 0x2a0004, 5631, RI_ALL_OFFLINE }, { 0x2a5800, 2560, RI_E1HE2_OFFLINE}, | ||
| 411 | { 0x2a8000, 1, RI_ALL_ONLINE }, { 0x2a8004, 8191, RI_E1HE2_OFFLINE }, | ||
| 412 | { 0x2b0000, 1, RI_ALL_ONLINE }, { 0x2b0004, 15, RI_E1H_OFFLINE }, | ||
| 413 | { 0x2b0040, 1, RI_E1HE2_ONLINE }, { 0x2b0044, 239, RI_E1H_OFFLINE }, | ||
| 414 | { 0x2b0400, 1, RI_ALL_ONLINE }, { 0x2b0404, 255, RI_E1H_OFFLINE }, | ||
| 415 | { 0x2b0800, 1, RI_ALL_ONLINE }, { 0x2b0840, 1, RI_E1HE2_ONLINE }, | ||
| 416 | { 0x2b0c00, 1, RI_ALL_ONLINE }, { 0x2b1000, 1, RI_ALL_ONLINE }, | ||
| 417 | { 0x2b1040, 1, RI_E1HE2_ONLINE }, { 0x2b1400, 1, RI_ALL_ONLINE }, | ||
| 418 | { 0x2b1440, 1, RI_E1HE2_ONLINE }, { 0x2b1480, 1, RI_E1HE2_ONLINE }, | ||
| 419 | { 0x2b14c0, 1, RI_E1HE2_ONLINE }, { 0x2b1800, 128, RI_ALL_OFFLINE }, | ||
| 420 | { 0x2b1c00, 128, RI_ALL_OFFLINE }, { 0x2b2000, 1, RI_ALL_ONLINE }, | ||
| 421 | { 0x2b2400, 1, RI_E1HE2_ONLINE }, { 0x2b2404, 5631, RI_E2_OFFLINE }, | ||
| 422 | { 0x2b8000, 1, RI_ALL_ONLINE }, { 0x2b8040, 1, RI_ALL_ONLINE }, | ||
| 423 | { 0x2b8080, 1, RI_ALL_ONLINE }, { 0x2b80c0, 1, RI_ALL_ONLINE }, | ||
| 424 | { 0x2b8100, 1, RI_ALL_ONLINE }, { 0x2b8140, 1, RI_ALL_ONLINE }, | ||
| 425 | { 0x2b8180, 1, RI_ALL_ONLINE }, { 0x2b81c0, 1, RI_ALL_ONLINE }, | ||
| 426 | { 0x2b8200, 1, RI_ALL_ONLINE }, { 0x2b8240, 1, RI_ALL_ONLINE }, | ||
| 427 | { 0x2b8280, 1, RI_ALL_ONLINE }, { 0x2b82c0, 1, RI_ALL_ONLINE }, | ||
| 428 | { 0x2b8300, 1, RI_ALL_ONLINE }, { 0x2b8340, 1, RI_ALL_ONLINE }, | ||
| 429 | { 0x2b8380, 1, RI_ALL_ONLINE }, { 0x2b83c0, 1, RI_ALL_ONLINE }, | ||
| 430 | { 0x2b8400, 1, RI_ALL_ONLINE }, { 0x2b8440, 1, RI_ALL_ONLINE }, | ||
| 431 | { 0x2b8480, 1, RI_ALL_ONLINE }, { 0x2b84c0, 1, RI_ALL_ONLINE }, | ||
| 432 | { 0x2b8500, 1, RI_ALL_ONLINE }, { 0x2b8540, 1, RI_ALL_ONLINE }, | ||
| 433 | { 0x2b8580, 1, RI_ALL_ONLINE }, { 0x2b85c0, 19, RI_E2_ONLINE }, | ||
| 434 | { 0x2b8800, 1, RI_ALL_ONLINE }, { 0x2b8840, 1, RI_ALL_ONLINE }, | ||
| 435 | { 0x2b8880, 1, RI_ALL_ONLINE }, { 0x2b88c0, 1, RI_ALL_ONLINE }, | ||
| 436 | { 0x2b8900, 1, RI_ALL_ONLINE }, { 0x2b8940, 1, RI_ALL_ONLINE }, | ||
| 437 | { 0x2b8980, 1, RI_ALL_ONLINE }, { 0x2b89c0, 1, RI_ALL_ONLINE }, | ||
| 438 | { 0x2b8a00, 1, RI_ALL_ONLINE }, { 0x2b8a40, 1, RI_ALL_ONLINE }, | ||
| 439 | { 0x2b8a80, 1, RI_ALL_ONLINE }, { 0x2b8ac0, 1, RI_ALL_ONLINE }, | ||
| 440 | { 0x2b8b00, 1, RI_ALL_ONLINE }, { 0x2b8b40, 1, RI_ALL_ONLINE }, | ||
| 441 | { 0x2b8b80, 1, RI_ALL_ONLINE }, { 0x2b8bc0, 1, RI_ALL_ONLINE }, | ||
| 442 | { 0x2b8c00, 1, RI_ALL_ONLINE }, { 0x2b8c40, 1, RI_ALL_ONLINE }, | ||
| 443 | { 0x2b8c80, 1, RI_ALL_ONLINE }, { 0x2b8cc0, 1, RI_ALL_ONLINE }, | ||
| 444 | { 0x2b8cc4, 1, RI_E2_ONLINE }, { 0x2b8d00, 1, RI_ALL_ONLINE }, | ||
| 445 | { 0x2b8d40, 1, RI_ALL_ONLINE }, { 0x2b8d80, 1, RI_ALL_ONLINE }, | ||
| 446 | { 0x2b8dc0, 1, RI_ALL_ONLINE }, { 0x2b8e00, 1, RI_ALL_ONLINE }, | ||
| 447 | { 0x2b8e40, 1, RI_ALL_ONLINE }, { 0x2b8e80, 1, RI_ALL_ONLINE }, | ||
| 448 | { 0x2b8e84, 1, RI_E2_ONLINE }, { 0x2b8ec0, 1, RI_E1HE2_ONLINE }, | ||
| 449 | { 0x2b8f00, 1, RI_E1HE2_ONLINE }, { 0x2b8f40, 1, RI_E1HE2_ONLINE }, | ||
| 450 | { 0x2b8f80, 1, RI_E1HE2_ONLINE }, { 0x2b8fc0, 1, RI_E1HE2_ONLINE }, | ||
| 451 | { 0x2b8fc4, 2, RI_E2_ONLINE }, { 0x2b8fd0, 6, RI_E2_ONLINE }, | ||
| 452 | { 0x2b9000, 1, RI_E2_ONLINE }, { 0x2b9040, 3, RI_E2_ONLINE }, | ||
| 453 | { 0x2b9400, 14, RI_E2_ONLINE }, { 0x2b943c, 19, RI_E2_ONLINE }, | ||
| 454 | { 0x2b9490, 10, RI_E2_ONLINE }, { 0x2c0000, 2, RI_ALL_ONLINE }, | ||
| 455 | { 0x300000, 65, RI_ALL_ONLINE }, { 0x30014c, 2, RI_E1HE2_ONLINE }, | ||
| 352 | { 0x300200, 58, RI_ALL_ONLINE }, { 0x300340, 4, RI_ALL_ONLINE }, | 456 | { 0x300200, 58, RI_ALL_ONLINE }, { 0x300340, 4, RI_ALL_ONLINE }, |
| 353 | { 0x300400, 1, RI_ALL_ONLINE }, { 0x300404, 255, RI_ALL_OFFLINE }, | 457 | { 0x300380, 1, RI_E2_ONLINE }, { 0x300388, 1, RI_E2_ONLINE }, |
| 458 | { 0x300390, 1, RI_E2_ONLINE }, { 0x300398, 1, RI_E2_ONLINE }, | ||
| 459 | { 0x3003a0, 1, RI_E2_ONLINE }, { 0x3003a8, 2, RI_E2_ONLINE }, | ||
| 460 | { 0x300400, 1, RI_ALL_ONLINE }, { 0x300404, 255, RI_E1E1H_OFFLINE }, | ||
| 354 | { 0x302000, 4, RI_ALL_ONLINE }, { 0x302010, 2044, RI_ALL_OFFLINE }, | 461 | { 0x302000, 4, RI_ALL_ONLINE }, { 0x302010, 2044, RI_ALL_OFFLINE }, |
| 355 | { 0x320000, 1, RI_ALL_ONLINE }, { 0x320004, 1023, RI_ALL_OFFLINE }, | 462 | { 0x320000, 1, RI_ALL_ONLINE }, { 0x320004, 5631, RI_ALL_OFFLINE }, |
| 356 | { 0x321000, 1, RI_ALL_ONLINE }, { 0x321004, 4607, RI_ALL_OFFLINE }, | 463 | { 0x325800, 2560, RI_E1HE2_OFFLINE }, { 0x328000, 1, RI_ALL_ONLINE }, |
| 357 | { 0x325800, 2560, RI_E1H_OFFLINE }, { 0x328000, 64, RI_ALL_OFFLINE }, | 464 | { 0x328004, 8191, RI_E1HE2_OFFLINE }, { 0x330000, 1, RI_ALL_ONLINE }, |
| 358 | { 0x328100, 536, RI_E1H_OFFLINE }, { 0x328960, 1, RI_E1H_ONLINE }, | 465 | { 0x330004, 15, RI_E1H_OFFLINE }, { 0x330040, 1, RI_E1HE2_ONLINE }, |
| 359 | { 0x328964, 8103, RI_E1H_OFFLINE }, { 0x331800, 128, RI_ALL_OFFLINE }, | 466 | { 0x330044, 239, RI_E1H_OFFLINE }, { 0x330400, 1, RI_ALL_ONLINE }, |
| 360 | { 0x331c00, 128, RI_ALL_OFFLINE }, { 0x332000, 1, RI_ALL_OFFLINE }, | 467 | { 0x330404, 255, RI_E1H_OFFLINE }, { 0x330800, 1, RI_ALL_ONLINE }, |
| 361 | { 0x332400, 64, RI_E1H_OFFLINE }, { 0x338200, 1, RI_ALL_ONLINE }, | 468 | { 0x330840, 1, RI_E1HE2_ONLINE }, { 0x330c00, 1, RI_ALL_ONLINE }, |
| 469 | { 0x331000, 1, RI_ALL_ONLINE }, { 0x331040, 1, RI_E1HE2_ONLINE }, | ||
| 470 | { 0x331400, 1, RI_ALL_ONLINE }, { 0x331440, 1, RI_E1HE2_ONLINE }, | ||
| 471 | { 0x331480, 1, RI_E1HE2_ONLINE }, { 0x3314c0, 1, RI_E1HE2_ONLINE }, | ||
| 472 | { 0x331800, 128, RI_ALL_OFFLINE }, { 0x331c00, 128, RI_ALL_OFFLINE }, | ||
| 473 | { 0x332000, 1, RI_ALL_ONLINE }, { 0x332400, 1, RI_E1HE2_ONLINE }, | ||
| 474 | { 0x332404, 5631, RI_E2_OFFLINE }, { 0x338000, 1, RI_ALL_ONLINE }, | ||
| 475 | { 0x338040, 1, RI_ALL_ONLINE }, { 0x338080, 1, RI_ALL_ONLINE }, | ||
| 476 | { 0x3380c0, 1, RI_ALL_ONLINE }, { 0x338100, 1, RI_ALL_ONLINE }, | ||
| 477 | { 0x338140, 1, RI_ALL_ONLINE }, { 0x338180, 1, RI_ALL_ONLINE }, | ||
| 478 | { 0x3381c0, 1, RI_ALL_ONLINE }, { 0x338200, 1, RI_ALL_ONLINE }, | ||
| 362 | { 0x338240, 1, RI_ALL_ONLINE }, { 0x338280, 1, RI_ALL_ONLINE }, | 479 | { 0x338240, 1, RI_ALL_ONLINE }, { 0x338280, 1, RI_ALL_ONLINE }, |
| 363 | { 0x3382c0, 1, RI_ALL_ONLINE }, { 0x338a00, 1, RI_ALL_ONLINE }, | 480 | { 0x3382c0, 1, RI_ALL_ONLINE }, { 0x338300, 1, RI_ALL_ONLINE }, |
| 364 | { 0x338a80, 1, RI_ALL_ONLINE }, { 0x340000, 2, RI_ALL_ONLINE } | 481 | { 0x338340, 1, RI_ALL_ONLINE }, { 0x338380, 1, RI_ALL_ONLINE }, |
| 482 | { 0x3383c0, 1, RI_ALL_ONLINE }, { 0x338400, 1, RI_ALL_ONLINE }, | ||
| 483 | { 0x338440, 1, RI_ALL_ONLINE }, { 0x338480, 1, RI_ALL_ONLINE }, | ||
| 484 | { 0x3384c0, 1, RI_ALL_ONLINE }, { 0x338500, 1, RI_ALL_ONLINE }, | ||
| 485 | { 0x338540, 1, RI_ALL_ONLINE }, { 0x338580, 1, RI_ALL_ONLINE }, | ||
| 486 | { 0x3385c0, 19, RI_E2_ONLINE }, { 0x338800, 1, RI_ALL_ONLINE }, | ||
| 487 | { 0x338840, 1, RI_ALL_ONLINE }, { 0x338880, 1, RI_ALL_ONLINE }, | ||
| 488 | { 0x3388c0, 1, RI_ALL_ONLINE }, { 0x338900, 1, RI_ALL_ONLINE }, | ||
| 489 | { 0x338940, 1, RI_ALL_ONLINE }, { 0x338980, 1, RI_ALL_ONLINE }, | ||
| 490 | { 0x3389c0, 1, RI_ALL_ONLINE }, { 0x338a00, 1, RI_ALL_ONLINE }, | ||
| 491 | { 0x338a40, 1, RI_ALL_ONLINE }, { 0x338a80, 1, RI_ALL_ONLINE }, | ||
| 492 | { 0x338ac0, 1, RI_ALL_ONLINE }, { 0x338b00, 1, RI_ALL_ONLINE }, | ||
| 493 | { 0x338b40, 1, RI_ALL_ONLINE }, { 0x338b80, 1, RI_ALL_ONLINE }, | ||
| 494 | { 0x338bc0, 1, RI_ALL_ONLINE }, { 0x338c00, 1, RI_ALL_ONLINE }, | ||
| 495 | { 0x338c40, 1, RI_ALL_ONLINE }, { 0x338c80, 1, RI_ALL_ONLINE }, | ||
| 496 | { 0x338cc0, 1, RI_ALL_ONLINE }, { 0x338cc4, 1, RI_E2_ONLINE }, | ||
| 497 | { 0x338d00, 1, RI_ALL_ONLINE }, { 0x338d40, 1, RI_ALL_ONLINE }, | ||
| 498 | { 0x338d80, 1, RI_ALL_ONLINE }, { 0x338dc0, 1, RI_ALL_ONLINE }, | ||
| 499 | { 0x338e00, 1, RI_ALL_ONLINE }, { 0x338e40, 1, RI_ALL_ONLINE }, | ||
| 500 | { 0x338e80, 1, RI_ALL_ONLINE }, { 0x338e84, 1, RI_E2_ONLINE }, | ||
| 501 | { 0x338ec0, 1, RI_E1HE2_ONLINE }, { 0x338f00, 1, RI_E1HE2_ONLINE }, | ||
| 502 | { 0x338f40, 1, RI_E1HE2_ONLINE }, { 0x338f80, 1, RI_E1HE2_ONLINE }, | ||
| 503 | { 0x338fc0, 1, RI_E1HE2_ONLINE }, { 0x338fc4, 2, RI_E2_ONLINE }, | ||
| 504 | { 0x338fd0, 6, RI_E2_ONLINE }, { 0x339000, 1, RI_E2_ONLINE }, | ||
| 505 | { 0x339040, 3, RI_E2_ONLINE }, { 0x340000, 2, RI_ALL_ONLINE }, | ||
| 365 | }; | 506 | }; |
| 366 | 507 | ||
| 367 | 508 | #define IDLE_REGS_COUNT 237 | |
| 368 | #define IDLE_REGS_COUNT 277 | ||
| 369 | static const struct reg_addr idle_addrs[IDLE_REGS_COUNT] = { | 509 | static const struct reg_addr idle_addrs[IDLE_REGS_COUNT] = { |
| 370 | { 0x2114, 1, RI_ALL_ONLINE }, { 0x2120, 1, RI_ALL_ONLINE }, | 510 | { 0x2104, 1, RI_ALL_ONLINE }, { 0x2110, 2, RI_ALL_ONLINE }, |
| 371 | { 0x212c, 4, RI_ALL_ONLINE }, { 0x2814, 1, RI_ALL_ONLINE }, | 511 | { 0x211c, 8, RI_ALL_ONLINE }, { 0x2814, 1, RI_ALL_ONLINE }, |
| 372 | { 0x281c, 2, RI_ALL_ONLINE }, { 0xa38c, 1, RI_ALL_ONLINE }, | 512 | { 0x281c, 2, RI_ALL_ONLINE }, { 0x2854, 1, RI_ALL_ONLINE }, |
| 513 | { 0x285c, 1, RI_ALL_ONLINE }, { 0x9010, 7, RI_E2_ONLINE }, | ||
| 514 | { 0x9030, 1, RI_E2_ONLINE }, { 0x9068, 16, RI_E2_ONLINE }, | ||
| 515 | { 0x9230, 2, RI_E2_ONLINE }, { 0x9244, 1, RI_E2_ONLINE }, | ||
| 516 | { 0x9298, 1, RI_E2_ONLINE }, { 0x92a8, 1, RI_E2_ONLINE }, | ||
| 517 | { 0xa38c, 1, RI_ALL_ONLINE }, { 0xa3c4, 1, RI_E1HE2_ONLINE }, | ||
| 373 | { 0xa408, 1, RI_ALL_ONLINE }, { 0xa42c, 12, RI_ALL_ONLINE }, | 518 | { 0xa408, 1, RI_ALL_ONLINE }, { 0xa42c, 12, RI_ALL_ONLINE }, |
| 374 | { 0xa600, 5, RI_E1H_ONLINE }, { 0xa618, 1, RI_E1H_ONLINE }, | 519 | { 0xa600, 5, RI_E1HE2_ONLINE }, { 0xa618, 1, RI_E1HE2_ONLINE }, |
| 375 | { 0xc09c, 1, RI_ALL_ONLINE }, { 0x103b0, 1, RI_ALL_ONLINE }, | 520 | { 0xa714, 1, RI_E2_ONLINE }, { 0xa720, 1, RI_E2_ONLINE }, |
| 376 | { 0x103c0, 1, RI_ALL_ONLINE }, { 0x103d0, 1, RI_E1H_ONLINE }, | 521 | { 0xa750, 1, RI_E2_ONLINE }, { 0xc09c, 1, RI_E1E1H_ONLINE }, |
| 377 | { 0x2021c, 11, RI_ALL_ONLINE }, { 0x202a8, 1, RI_ALL_ONLINE }, | 522 | { 0x103b0, 1, RI_ALL_ONLINE }, { 0x103c0, 1, RI_ALL_ONLINE }, |
| 378 | { 0x202b8, 1, RI_ALL_ONLINE }, { 0x20404, 1, RI_ALL_ONLINE }, | 523 | { 0x103d0, 1, RI_E1H_ONLINE }, { 0x183bc, 1, RI_E2_ONLINE }, |
| 379 | { 0x2040c, 2, RI_ALL_ONLINE }, { 0x2041c, 2, RI_ALL_ONLINE }, | 524 | { 0x183cc, 1, RI_E2_ONLINE }, { 0x2021c, 11, RI_ALL_ONLINE }, |
| 380 | { 0x40154, 14, RI_ALL_ONLINE }, { 0x40198, 1, RI_ALL_ONLINE }, | 525 | { 0x202a8, 1, RI_ALL_ONLINE }, { 0x202b8, 1, RI_ALL_ONLINE }, |
| 381 | { 0x404ac, 1, RI_ALL_ONLINE }, { 0x404bc, 1, RI_ALL_ONLINE }, | 526 | { 0x20404, 1, RI_ALL_ONLINE }, { 0x2040c, 2, RI_ALL_ONLINE }, |
| 382 | { 0x42290, 1, RI_ALL_ONLINE }, { 0x422a0, 1, RI_ALL_ONLINE }, | 527 | { 0x2041c, 2, RI_ALL_ONLINE }, { 0x40154, 14, RI_ALL_ONLINE }, |
| 383 | { 0x422b0, 1, RI_ALL_ONLINE }, { 0x42548, 1, RI_ALL_ONLINE }, | 528 | { 0x40198, 1, RI_ALL_ONLINE }, { 0x404ac, 1, RI_ALL_ONLINE }, |
| 384 | { 0x42550, 1, RI_ALL_ONLINE }, { 0x42558, 1, RI_ALL_ONLINE }, | 529 | { 0x404bc, 1, RI_ALL_ONLINE }, { 0x42290, 1, RI_ALL_ONLINE }, |
| 385 | { 0x50160, 8, RI_ALL_ONLINE }, { 0x501d0, 1, RI_ALL_ONLINE }, | 530 | { 0x422a0, 1, RI_ALL_ONLINE }, { 0x422b0, 1, RI_ALL_ONLINE }, |
| 386 | { 0x501e0, 1, RI_ALL_ONLINE }, { 0x50204, 1, RI_ALL_ONLINE }, | 531 | { 0x42548, 1, RI_ALL_ONLINE }, { 0x42550, 1, RI_ALL_ONLINE }, |
| 387 | { 0x5020c, 2, RI_ALL_ONLINE }, { 0x5021c, 1, RI_ALL_ONLINE }, | 532 | { 0x42558, 1, RI_ALL_ONLINE }, { 0x50160, 8, RI_ALL_ONLINE }, |
| 388 | { 0x60090, 1, RI_ALL_ONLINE }, { 0x6011c, 1, RI_ALL_ONLINE }, | 533 | { 0x501d0, 1, RI_ALL_ONLINE }, { 0x501e0, 1, RI_ALL_ONLINE }, |
| 389 | { 0x6012c, 1, RI_ALL_ONLINE }, { 0xc101c, 1, RI_ALL_ONLINE }, | 534 | { 0x50204, 1, RI_ALL_ONLINE }, { 0x5020c, 2, RI_ALL_ONLINE }, |
| 390 | { 0xc102c, 1, RI_ALL_ONLINE }, { 0xc2290, 1, RI_ALL_ONLINE }, | 535 | { 0x5021c, 1, RI_ALL_ONLINE }, { 0x60090, 1, RI_ALL_ONLINE }, |
| 391 | { 0xc22a0, 1, RI_ALL_ONLINE }, { 0xc22b0, 1, RI_ALL_ONLINE }, | 536 | { 0x6011c, 1, RI_ALL_ONLINE }, { 0x6012c, 1, RI_ALL_ONLINE }, |
| 392 | { 0xc2548, 1, RI_ALL_ONLINE }, { 0xc2550, 1, RI_ALL_ONLINE }, | 537 | { 0xc101c, 1, RI_ALL_ONLINE }, { 0xc102c, 1, RI_ALL_ONLINE }, |
| 393 | { 0xc2558, 1, RI_ALL_ONLINE }, { 0xc4294, 1, RI_ALL_ONLINE }, | 538 | { 0xc2290, 1, RI_ALL_ONLINE }, { 0xc22a0, 1, RI_ALL_ONLINE }, |
| 394 | { 0xc42a4, 1, RI_ALL_ONLINE }, { 0xc42b4, 1, RI_ALL_ONLINE }, | 539 | { 0xc22b0, 1, RI_ALL_ONLINE }, { 0xc2548, 1, RI_ALL_ONLINE }, |
| 395 | { 0xc4550, 1, RI_ALL_ONLINE }, { 0xc4558, 1, RI_ALL_ONLINE }, | 540 | { 0xc2550, 1, RI_ALL_ONLINE }, { 0xc2558, 1, RI_ALL_ONLINE }, |
| 396 | { 0xc4560, 1, RI_ALL_ONLINE }, { 0xd016c, 8, RI_ALL_ONLINE }, | 541 | { 0xc4294, 1, RI_ALL_ONLINE }, { 0xc42a4, 1, RI_ALL_ONLINE }, |
| 397 | { 0xd01d8, 1, RI_ALL_ONLINE }, { 0xd01e8, 1, RI_ALL_ONLINE }, | 542 | { 0xc42b4, 1, RI_ALL_ONLINE }, { 0xc4550, 1, RI_ALL_ONLINE }, |
| 398 | { 0xd0204, 1, RI_ALL_ONLINE }, { 0xd020c, 3, RI_ALL_ONLINE }, | 543 | { 0xc4558, 1, RI_ALL_ONLINE }, { 0xc4560, 1, RI_ALL_ONLINE }, |
| 399 | { 0xe0154, 8, RI_ALL_ONLINE }, { 0xe01c8, 1, RI_ALL_ONLINE }, | 544 | { 0xd016c, 8, RI_ALL_ONLINE }, { 0xd01d8, 1, RI_ALL_ONLINE }, |
| 400 | { 0xe01d8, 1, RI_ALL_ONLINE }, { 0xe0204, 1, RI_ALL_ONLINE }, | 545 | { 0xd01e8, 1, RI_ALL_ONLINE }, { 0xd0204, 1, RI_ALL_ONLINE }, |
| 401 | { 0xe020c, 2, RI_ALL_ONLINE }, { 0xe021c, 2, RI_ALL_ONLINE }, | 546 | { 0xd020c, 3, RI_ALL_ONLINE }, { 0xe0154, 8, RI_ALL_ONLINE }, |
| 402 | { 0x101014, 1, RI_ALL_ONLINE }, { 0x101030, 1, RI_ALL_ONLINE }, | 547 | { 0xe01c8, 1, RI_ALL_ONLINE }, { 0xe01d8, 1, RI_ALL_ONLINE }, |
| 403 | { 0x101040, 1, RI_ALL_ONLINE }, { 0x102058, 1, RI_ALL_ONLINE }, | 548 | { 0xe0204, 1, RI_ALL_ONLINE }, { 0xe020c, 2, RI_ALL_ONLINE }, |
| 404 | { 0x102080, 16, RI_ALL_ONLINE }, { 0x103004, 2, RI_ALL_ONLINE }, | 549 | { 0xe021c, 2, RI_ALL_ONLINE }, { 0x101014, 1, RI_ALL_ONLINE }, |
| 405 | { 0x103068, 1, RI_ALL_ONLINE }, { 0x103078, 1, RI_ALL_ONLINE }, | 550 | { 0x101030, 1, RI_ALL_ONLINE }, { 0x101040, 1, RI_ALL_ONLINE }, |
| 406 | { 0x103088, 1, RI_ALL_ONLINE }, { 0x10309c, 2, RI_E1H_ONLINE }, | 551 | { 0x102058, 1, RI_ALL_ONLINE }, { 0x102080, 16, RI_ALL_ONLINE }, |
| 552 | { 0x103004, 2, RI_ALL_ONLINE }, { 0x103068, 1, RI_ALL_ONLINE }, | ||
| 553 | { 0x103078, 1, RI_ALL_ONLINE }, { 0x103088, 1, RI_ALL_ONLINE }, | ||
| 554 | { 0x10309c, 2, RI_E1HE2_ONLINE }, { 0x1030b8, 2, RI_E2_ONLINE }, | ||
| 555 | { 0x1030cc, 1, RI_E2_ONLINE }, { 0x1030e0, 1, RI_E2_ONLINE }, | ||
| 407 | { 0x104004, 1, RI_ALL_ONLINE }, { 0x104018, 1, RI_ALL_ONLINE }, | 556 | { 0x104004, 1, RI_ALL_ONLINE }, { 0x104018, 1, RI_ALL_ONLINE }, |
| 408 | { 0x104020, 1, RI_ALL_ONLINE }, { 0x10403c, 1, RI_ALL_ONLINE }, | 557 | { 0x104020, 1, RI_ALL_ONLINE }, { 0x10403c, 1, RI_ALL_ONLINE }, |
| 409 | { 0x1040fc, 1, RI_ALL_ONLINE }, { 0x10410c, 1, RI_ALL_ONLINE }, | 558 | { 0x1040fc, 1, RI_ALL_ONLINE }, { 0x10410c, 1, RI_ALL_ONLINE }, |
| 410 | { 0x104400, 64, RI_ALL_ONLINE }, { 0x104800, 64, RI_ALL_ONLINE }, | 559 | { 0x104400, 64, RI_ALL_ONLINE }, { 0x104800, 64, RI_ALL_ONLINE }, |
| 411 | { 0x105000, 3, RI_ALL_ONLINE }, { 0x105010, 3, RI_ALL_ONLINE }, | 560 | { 0x105000, 256, RI_ALL_ONLINE }, { 0x108094, 1, RI_E1E1H_ONLINE }, |
| 412 | { 0x105020, 3, RI_ALL_ONLINE }, { 0x105030, 3, RI_ALL_ONLINE }, | 561 | { 0x1201b0, 2, RI_ALL_ONLINE }, { 0x12032c, 1, RI_ALL_ONLINE }, |
| 413 | { 0x105040, 3, RI_ALL_ONLINE }, { 0x105050, 3, RI_ALL_ONLINE }, | 562 | { 0x12036c, 3, RI_ALL_ONLINE }, { 0x120408, 2, RI_ALL_ONLINE }, |
| 414 | { 0x105060, 3, RI_ALL_ONLINE }, { 0x105070, 3, RI_ALL_ONLINE }, | 563 | { 0x120414, 15, RI_ALL_ONLINE }, { 0x120478, 2, RI_ALL_ONLINE }, |
| 415 | { 0x105080, 3, RI_ALL_ONLINE }, { 0x105090, 3, RI_ALL_ONLINE }, | 564 | { 0x12052c, 1, RI_ALL_ONLINE }, { 0x120564, 3, RI_ALL_ONLINE }, |
| 416 | { 0x1050a0, 3, RI_ALL_ONLINE }, { 0x1050b0, 3, RI_ALL_ONLINE }, | 565 | { 0x12057c, 1, RI_ALL_ONLINE }, { 0x12058c, 1, RI_ALL_ONLINE }, |
| 417 | { 0x1050c0, 3, RI_ALL_ONLINE }, { 0x1050d0, 3, RI_ALL_ONLINE }, | 566 | { 0x120608, 1, RI_E1HE2_ONLINE }, { 0x120738, 1, RI_E2_ONLINE }, |
| 418 | { 0x1050e0, 3, RI_ALL_ONLINE }, { 0x1050f0, 3, RI_ALL_ONLINE }, | 567 | { 0x120778, 2, RI_E2_ONLINE }, { 0x120808, 3, RI_ALL_ONLINE }, |
| 419 | { 0x105100, 3, RI_ALL_ONLINE }, { 0x105110, 3, RI_ALL_ONLINE }, | ||
| 420 | { 0x105120, 3, RI_ALL_ONLINE }, { 0x105130, 3, RI_ALL_ONLINE }, | ||
| 421 | { 0x105140, 3, RI_ALL_ONLINE }, { 0x105150, 3, RI_ALL_ONLINE }, | ||
| 422 | { 0x105160, 3, RI_ALL_ONLINE }, { 0x105170, 3, RI_ALL_ONLINE }, | ||
| 423 | { 0x105180, 3, RI_ALL_ONLINE }, { 0x105190, 3, RI_ALL_ONLINE }, | ||
| 424 | { 0x1051a0, 3, RI_ALL_ONLINE }, { 0x1051b0, 3, RI_ALL_ONLINE }, | ||
| 425 | { 0x1051c0, 3, RI_ALL_ONLINE }, { 0x1051d0, 3, RI_ALL_ONLINE }, | ||
| 426 | { 0x1051e0, 3, RI_ALL_ONLINE }, { 0x1051f0, 3, RI_ALL_ONLINE }, | ||
| 427 | { 0x105200, 3, RI_ALL_ONLINE }, { 0x105210, 3, RI_ALL_ONLINE }, | ||
| 428 | { 0x105220, 3, RI_ALL_ONLINE }, { 0x105230, 3, RI_ALL_ONLINE }, | ||
| 429 | { 0x105240, 3, RI_ALL_ONLINE }, { 0x105250, 3, RI_ALL_ONLINE }, | ||
| 430 | { 0x105260, 3, RI_ALL_ONLINE }, { 0x105270, 3, RI_ALL_ONLINE }, | ||
| 431 | { 0x105280, 3, RI_ALL_ONLINE }, { 0x105290, 3, RI_ALL_ONLINE }, | ||
| 432 | { 0x1052a0, 3, RI_ALL_ONLINE }, { 0x1052b0, 3, RI_ALL_ONLINE }, | ||
| 433 | { 0x1052c0, 3, RI_ALL_ONLINE }, { 0x1052d0, 3, RI_ALL_ONLINE }, | ||
| 434 | { 0x1052e0, 3, RI_ALL_ONLINE }, { 0x1052f0, 3, RI_ALL_ONLINE }, | ||
| 435 | { 0x105300, 3, RI_ALL_ONLINE }, { 0x105310, 3, RI_ALL_ONLINE }, | ||
| 436 | { 0x105320, 3, RI_ALL_ONLINE }, { 0x105330, 3, RI_ALL_ONLINE }, | ||
| 437 | { 0x105340, 3, RI_ALL_ONLINE }, { 0x105350, 3, RI_ALL_ONLINE }, | ||
| 438 | { 0x105360, 3, RI_ALL_ONLINE }, { 0x105370, 3, RI_ALL_ONLINE }, | ||
| 439 | { 0x105380, 3, RI_ALL_ONLINE }, { 0x105390, 3, RI_ALL_ONLINE }, | ||
| 440 | { 0x1053a0, 3, RI_ALL_ONLINE }, { 0x1053b0, 3, RI_ALL_ONLINE }, | ||
| 441 | { 0x1053c0, 3, RI_ALL_ONLINE }, { 0x1053d0, 3, RI_ALL_ONLINE }, | ||
| 442 | { 0x1053e0, 3, RI_ALL_ONLINE }, { 0x1053f0, 3, RI_ALL_ONLINE }, | ||
| 443 | { 0x108094, 1, RI_ALL_ONLINE }, { 0x1201b0, 2, RI_ALL_ONLINE }, | ||
| 444 | { 0x12032c, 1, RI_ALL_ONLINE }, { 0x12036c, 3, RI_ALL_ONLINE }, | ||
| 445 | { 0x120408, 2, RI_ALL_ONLINE }, { 0x120414, 15, RI_ALL_ONLINE }, | ||
| 446 | { 0x120478, 2, RI_ALL_ONLINE }, { 0x12052c, 1, RI_ALL_ONLINE }, | ||
| 447 | { 0x120564, 3, RI_ALL_ONLINE }, { 0x12057c, 1, RI_ALL_ONLINE }, | ||
| 448 | { 0x12058c, 1, RI_ALL_ONLINE }, { 0x120608, 1, RI_E1H_ONLINE }, | ||
| 449 | { 0x120808, 1, RI_E1_ONLINE }, { 0x12080c, 2, RI_ALL_ONLINE }, | ||
| 450 | { 0x120818, 1, RI_ALL_ONLINE }, { 0x120820, 1, RI_ALL_ONLINE }, | 568 | { 0x120818, 1, RI_ALL_ONLINE }, { 0x120820, 1, RI_ALL_ONLINE }, |
| 451 | { 0x120828, 1, RI_ALL_ONLINE }, { 0x120830, 1, RI_ALL_ONLINE }, | 569 | { 0x120828, 1, RI_ALL_ONLINE }, { 0x120830, 1, RI_ALL_ONLINE }, |
| 452 | { 0x120838, 1, RI_ALL_ONLINE }, { 0x120840, 1, RI_ALL_ONLINE }, | 570 | { 0x120838, 1, RI_ALL_ONLINE }, { 0x120840, 1, RI_ALL_ONLINE }, |
| @@ -462,48 +580,50 @@ static const struct reg_addr idle_addrs[IDLE_REGS_COUNT] = { | |||
| 462 | { 0x1208d8, 1, RI_ALL_ONLINE }, { 0x1208e0, 1, RI_ALL_ONLINE }, | 580 | { 0x1208d8, 1, RI_ALL_ONLINE }, { 0x1208e0, 1, RI_ALL_ONLINE }, |
| 463 | { 0x1208e8, 1, RI_ALL_ONLINE }, { 0x1208f0, 1, RI_ALL_ONLINE }, | 581 | { 0x1208e8, 1, RI_ALL_ONLINE }, { 0x1208f0, 1, RI_ALL_ONLINE }, |
| 464 | { 0x1208f8, 1, RI_ALL_ONLINE }, { 0x120900, 1, RI_ALL_ONLINE }, | 582 | { 0x1208f8, 1, RI_ALL_ONLINE }, { 0x120900, 1, RI_ALL_ONLINE }, |
| 465 | { 0x120908, 1, RI_ALL_ONLINE }, { 0x14005c, 2, RI_ALL_ONLINE }, | 583 | { 0x120908, 1, RI_ALL_ONLINE }, { 0x120940, 5, RI_E2_ONLINE }, |
| 466 | { 0x1400d0, 2, RI_ALL_ONLINE }, { 0x1400e0, 1, RI_ALL_ONLINE }, | 584 | { 0x130030, 1, RI_E2_ONLINE }, { 0x13004c, 3, RI_E2_ONLINE }, |
| 467 | { 0x1401c8, 1, RI_ALL_ONLINE }, { 0x140200, 6, RI_ALL_ONLINE }, | 585 | { 0x130064, 2, RI_E2_ONLINE }, { 0x13009c, 1, RI_E2_ONLINE }, |
| 468 | { 0x16101c, 1, RI_ALL_ONLINE }, { 0x16102c, 1, RI_ALL_ONLINE }, | 586 | { 0x130130, 1, RI_E2_ONLINE }, { 0x13016c, 1, RI_E2_ONLINE }, |
| 469 | { 0x164014, 2, RI_ALL_ONLINE }, { 0x1640f0, 1, RI_ALL_ONLINE }, | 587 | { 0x130300, 1, RI_E2_ONLINE }, { 0x130480, 1, RI_E2_ONLINE }, |
| 470 | { 0x166290, 1, RI_ALL_ONLINE }, { 0x1662a0, 1, RI_ALL_ONLINE }, | 588 | { 0x14005c, 2, RI_ALL_ONLINE }, { 0x1400d0, 2, RI_ALL_ONLINE }, |
| 471 | { 0x1662b0, 1, RI_ALL_ONLINE }, { 0x166548, 1, RI_ALL_ONLINE }, | 589 | { 0x1400e0, 1, RI_ALL_ONLINE }, { 0x1401c8, 1, RI_ALL_ONLINE }, |
| 472 | { 0x166550, 1, RI_ALL_ONLINE }, { 0x166558, 1, RI_ALL_ONLINE }, | 590 | { 0x140200, 6, RI_ALL_ONLINE }, { 0x16101c, 1, RI_ALL_ONLINE }, |
| 473 | { 0x168000, 1, RI_ALL_ONLINE }, { 0x168008, 1, RI_ALL_ONLINE }, | 591 | { 0x16102c, 1, RI_ALL_ONLINE }, { 0x164014, 2, RI_ALL_ONLINE }, |
| 474 | { 0x168010, 1, RI_ALL_ONLINE }, { 0x168018, 1, RI_ALL_ONLINE }, | 592 | { 0x1640f0, 1, RI_ALL_ONLINE }, { 0x166290, 1, RI_ALL_ONLINE }, |
| 475 | { 0x168028, 2, RI_ALL_ONLINE }, { 0x168058, 4, RI_ALL_ONLINE }, | 593 | { 0x1662a0, 1, RI_ALL_ONLINE }, { 0x1662b0, 1, RI_ALL_ONLINE }, |
| 476 | { 0x168070, 1, RI_ALL_ONLINE }, { 0x168238, 1, RI_ALL_ONLINE }, | 594 | { 0x166548, 1, RI_ALL_ONLINE }, { 0x166550, 1, RI_ALL_ONLINE }, |
| 477 | { 0x1682d0, 2, RI_ALL_ONLINE }, { 0x1682e0, 1, RI_ALL_ONLINE }, | 595 | { 0x166558, 1, RI_ALL_ONLINE }, { 0x168000, 1, RI_ALL_ONLINE }, |
| 478 | { 0x168300, 67, RI_ALL_ONLINE }, { 0x168410, 2, RI_ALL_ONLINE }, | 596 | { 0x168008, 1, RI_ALL_ONLINE }, { 0x168010, 1, RI_ALL_ONLINE }, |
| 597 | { 0x168018, 1, RI_ALL_ONLINE }, { 0x168028, 2, RI_ALL_ONLINE }, | ||
| 598 | { 0x168058, 4, RI_ALL_ONLINE }, { 0x168070, 1, RI_ALL_ONLINE }, | ||
| 599 | { 0x168238, 1, RI_ALL_ONLINE }, { 0x1682d0, 2, RI_ALL_ONLINE }, | ||
| 600 | { 0x1682e0, 1, RI_ALL_ONLINE }, { 0x168300, 2, RI_E1E1H_ONLINE }, | ||
| 601 | { 0x168308, 65, RI_ALL_ONLINE }, { 0x168410, 2, RI_ALL_ONLINE }, | ||
| 479 | { 0x168438, 1, RI_ALL_ONLINE }, { 0x168448, 1, RI_ALL_ONLINE }, | 602 | { 0x168438, 1, RI_ALL_ONLINE }, { 0x168448, 1, RI_ALL_ONLINE }, |
| 480 | { 0x168a00, 128, RI_ALL_ONLINE }, { 0x16e200, 128, RI_E1H_ONLINE }, | 603 | { 0x168a00, 128, RI_ALL_ONLINE }, { 0x16e200, 128, RI_E1H_ONLINE }, |
| 481 | { 0x16e404, 2, RI_E1H_ONLINE }, { 0x16e584, 70, RI_E1H_ONLINE }, | 604 | { 0x16e404, 2, RI_E1H_ONLINE }, { 0x16e584, 64, RI_E1H_ONLINE }, |
| 482 | { 0x1700a4, 1, RI_ALL_ONLINE }, { 0x1700ac, 2, RI_ALL_ONLINE }, | 605 | { 0x16e684, 2, RI_E1HE2_ONLINE }, { 0x16e68c, 4, RI_E1H_ONLINE }, |
| 483 | { 0x1700c0, 1, RI_ALL_ONLINE }, { 0x170174, 1, RI_ALL_ONLINE }, | 606 | { 0x16e6fc, 4, RI_E2_ONLINE }, { 0x1700a4, 1, RI_ALL_ONLINE }, |
| 484 | { 0x170184, 1, RI_ALL_ONLINE }, { 0x1800f4, 1, RI_ALL_ONLINE }, | 607 | { 0x1700ac, 2, RI_ALL_ONLINE }, { 0x1700c0, 1, RI_ALL_ONLINE }, |
| 485 | { 0x180104, 1, RI_ALL_ONLINE }, { 0x180114, 1, RI_ALL_ONLINE }, | 608 | { 0x170174, 1, RI_ALL_ONLINE }, { 0x170184, 1, RI_ALL_ONLINE }, |
| 486 | { 0x180124, 1, RI_ALL_ONLINE }, { 0x18026c, 1, RI_ALL_ONLINE }, | 609 | { 0x1800f4, 1, RI_ALL_ONLINE }, { 0x180104, 1, RI_ALL_ONLINE }, |
| 487 | { 0x1802a0, 1, RI_ALL_ONLINE }, { 0x1a1000, 1, RI_ALL_ONLINE }, | 610 | { 0x180114, 1, RI_ALL_ONLINE }, { 0x180124, 1, RI_ALL_ONLINE }, |
| 488 | { 0x1aa000, 1, RI_E1H_ONLINE }, { 0x1b8000, 1, RI_ALL_ONLINE }, | 611 | { 0x18026c, 1, RI_ALL_ONLINE }, { 0x1802a0, 1, RI_ALL_ONLINE }, |
| 489 | { 0x1b8040, 1, RI_ALL_ONLINE }, { 0x1b8080, 1, RI_ALL_ONLINE }, | 612 | { 0x1b8000, 1, RI_ALL_ONLINE }, { 0x1b8040, 1, RI_ALL_ONLINE }, |
| 490 | { 0x1b80c0, 1, RI_ALL_ONLINE }, { 0x200104, 1, RI_ALL_ONLINE }, | 613 | { 0x1b8080, 1, RI_ALL_ONLINE }, { 0x1b80c0, 1, RI_ALL_ONLINE }, |
| 491 | { 0x200114, 1, RI_ALL_ONLINE }, { 0x200124, 1, RI_ALL_ONLINE }, | 614 | { 0x200104, 1, RI_ALL_ONLINE }, { 0x200114, 1, RI_ALL_ONLINE }, |
| 492 | { 0x200134, 1, RI_ALL_ONLINE }, { 0x20026c, 1, RI_ALL_ONLINE }, | 615 | { 0x200124, 1, RI_ALL_ONLINE }, { 0x200134, 1, RI_ALL_ONLINE }, |
| 493 | { 0x2002a0, 1, RI_ALL_ONLINE }, { 0x221000, 1, RI_ALL_ONLINE }, | 616 | { 0x20026c, 1, RI_ALL_ONLINE }, { 0x2002a0, 1, RI_ALL_ONLINE }, |
| 494 | { 0x227000, 1, RI_E1H_ONLINE }, { 0x238000, 1, RI_ALL_ONLINE }, | 617 | { 0x238000, 1, RI_ALL_ONLINE }, { 0x238040, 1, RI_ALL_ONLINE }, |
| 495 | { 0x238040, 1, RI_ALL_ONLINE }, { 0x238080, 1, RI_ALL_ONLINE }, | 618 | { 0x238080, 1, RI_ALL_ONLINE }, { 0x2380c0, 1, RI_ALL_ONLINE }, |
| 496 | { 0x2380c0, 1, RI_ALL_ONLINE }, { 0x280104, 1, RI_ALL_ONLINE }, | 619 | { 0x280104, 1, RI_ALL_ONLINE }, { 0x280114, 1, RI_ALL_ONLINE }, |
| 497 | { 0x280114, 1, RI_ALL_ONLINE }, { 0x280124, 1, RI_ALL_ONLINE }, | 620 | { 0x280124, 1, RI_ALL_ONLINE }, { 0x280134, 1, RI_ALL_ONLINE }, |
| 498 | { 0x280134, 1, RI_ALL_ONLINE }, { 0x28026c, 1, RI_ALL_ONLINE }, | 621 | { 0x28026c, 1, RI_ALL_ONLINE }, { 0x2802a0, 1, RI_ALL_ONLINE }, |
| 499 | { 0x2802a0, 1, RI_ALL_ONLINE }, { 0x2a1000, 1, RI_ALL_ONLINE }, | 622 | { 0x2b8000, 1, RI_ALL_ONLINE }, { 0x2b8040, 1, RI_ALL_ONLINE }, |
| 500 | { 0x2a9000, 1, RI_E1H_ONLINE }, { 0x2b8000, 1, RI_ALL_ONLINE }, | 623 | { 0x2b8080, 1, RI_ALL_ONLINE }, { 0x300104, 1, RI_ALL_ONLINE }, |
| 501 | { 0x2b8040, 1, RI_ALL_ONLINE }, { 0x2b8080, 1, RI_ALL_ONLINE }, | ||
| 502 | { 0x2b80c0, 1, RI_ALL_ONLINE }, { 0x300104, 1, RI_ALL_ONLINE }, | ||
| 503 | { 0x300114, 1, RI_ALL_ONLINE }, { 0x300124, 1, RI_ALL_ONLINE }, | 624 | { 0x300114, 1, RI_ALL_ONLINE }, { 0x300124, 1, RI_ALL_ONLINE }, |
| 504 | { 0x300134, 1, RI_ALL_ONLINE }, { 0x30026c, 1, RI_ALL_ONLINE }, | 625 | { 0x300134, 1, RI_ALL_ONLINE }, { 0x30026c, 1, RI_ALL_ONLINE }, |
| 505 | { 0x3002a0, 1, RI_ALL_ONLINE }, { 0x321000, 1, RI_ALL_ONLINE }, | 626 | { 0x3002a0, 1, RI_ALL_ONLINE }, { 0x338000, 1, RI_ALL_ONLINE }, |
| 506 | { 0x328960, 1, RI_E1H_ONLINE }, { 0x338000, 1, RI_ALL_ONLINE }, | ||
| 507 | { 0x338040, 1, RI_ALL_ONLINE }, { 0x338080, 1, RI_ALL_ONLINE }, | 627 | { 0x338040, 1, RI_ALL_ONLINE }, { 0x338080, 1, RI_ALL_ONLINE }, |
| 508 | { 0x3380c0, 1, RI_ALL_ONLINE } | 628 | { 0x3380c0, 1, RI_ALL_ONLINE } |
| 509 | }; | 629 | }; |
| @@ -515,7 +635,6 @@ static const struct wreg_addr wreg_addrs_e1[WREGS_COUNT_E1] = { | |||
| 515 | { 0x1b0c00, 192, 1, read_reg_e1_0, RI_E1_OFFLINE } | 635 | { 0x1b0c00, 192, 1, read_reg_e1_0, RI_E1_OFFLINE } |
| 516 | }; | 636 | }; |
| 517 | 637 | ||
| 518 | |||
| 519 | #define WREGS_COUNT_E1H 1 | 638 | #define WREGS_COUNT_E1H 1 |
| 520 | static const u32 read_reg_e1h_0[] = { 0x1b1040, 0x1b1000 }; | 639 | static const u32 read_reg_e1h_0[] = { 0x1b1040, 0x1b1000 }; |
| 521 | 640 | ||
| @@ -530,22 +649,53 @@ static const struct wreg_addr wreg_addrs_e2[WREGS_COUNT_E2] = { | |||
| 530 | { 0x1b0c00, 128, 2, read_reg_e2_0, RI_E2_OFFLINE } | 649 | { 0x1b0c00, 128, 2, read_reg_e2_0, RI_E2_OFFLINE } |
| 531 | }; | 650 | }; |
| 532 | 651 | ||
| 533 | static const struct dump_sign dump_sign_all = { 0x49aa93ee, 0x40835, 0x22 }; | 652 | static const struct dump_sign dump_sign_all = { 0x4d18b0a4, 0x60010, 0x3a }; |
| 534 | |||
| 535 | 653 | ||
| 536 | #define TIMER_REGS_COUNT_E1 2 | 654 | #define TIMER_REGS_COUNT_E1 2 |
| 537 | static const u32 timer_status_regs_e1[TIMER_REGS_COUNT_E1] = | ||
| 538 | { 0x164014, 0x164018 }; | ||
| 539 | static const u32 timer_scan_regs_e1[TIMER_REGS_COUNT_E1] = | ||
| 540 | { 0x1640d0, 0x1640d4 }; | ||
| 541 | 655 | ||
| 656 | static const u32 timer_status_regs_e1[TIMER_REGS_COUNT_E1] = { | ||
| 657 | 0x164014, 0x164018 }; | ||
| 658 | static const u32 timer_scan_regs_e1[TIMER_REGS_COUNT_E1] = { | ||
| 659 | 0x1640d0, 0x1640d4 }; | ||
| 542 | 660 | ||
| 543 | #define TIMER_REGS_COUNT_E1H 2 | 661 | #define TIMER_REGS_COUNT_E1H 2 |
| 544 | static const u32 timer_status_regs_e1h[TIMER_REGS_COUNT_E1H] = | ||
| 545 | { 0x164014, 0x164018 }; | ||
| 546 | static const u32 timer_scan_regs_e1h[TIMER_REGS_COUNT_E1H] = | ||
| 547 | { 0x1640d0, 0x1640d4 }; | ||
| 548 | 662 | ||
| 663 | static const u32 timer_status_regs_e1h[TIMER_REGS_COUNT_E1H] = { | ||
| 664 | 0x164014, 0x164018 }; | ||
| 665 | static const u32 timer_scan_regs_e1h[TIMER_REGS_COUNT_E1H] = { | ||
| 666 | 0x1640d0, 0x1640d4 }; | ||
| 667 | |||
| 668 | #define TIMER_REGS_COUNT_E2 2 | ||
| 669 | |||
| 670 | static const u32 timer_status_regs_e2[TIMER_REGS_COUNT_E2] = { | ||
| 671 | 0x164014, 0x164018 }; | ||
| 672 | static const u32 timer_scan_regs_e2[TIMER_REGS_COUNT_E2] = { | ||
| 673 | 0x1640d0, 0x1640d4 }; | ||
| 674 | |||
| 675 | #define PAGE_MODE_VALUES_E1 0 | ||
| 676 | |||
| 677 | #define PAGE_READ_REGS_E1 0 | ||
| 678 | |||
| 679 | #define PAGE_WRITE_REGS_E1 0 | ||
| 680 | |||
| 681 | static const u32 page_vals_e1[] = { 0 }; | ||
| 682 | |||
| 683 | static const u32 page_write_regs_e1[] = { 0 }; | ||
| 684 | |||
| 685 | static const struct reg_addr page_read_regs_e1[] = { { 0x0, 0, RI_E1_ONLINE } }; | ||
| 686 | |||
| 687 | #define PAGE_MODE_VALUES_E1H 0 | ||
| 688 | |||
| 689 | #define PAGE_READ_REGS_E1H 0 | ||
| 690 | |||
| 691 | #define PAGE_WRITE_REGS_E1H 0 | ||
| 692 | |||
| 693 | static const u32 page_vals_e1h[] = { 0 }; | ||
| 694 | |||
| 695 | static const u32 page_write_regs_e1h[] = { 0 }; | ||
| 696 | |||
| 697 | static const struct reg_addr page_read_regs_e1h[] = { | ||
| 698 | { 0x0, 0, RI_E1H_ONLINE } }; | ||
| 549 | 699 | ||
| 550 | #define PAGE_MODE_VALUES_E2 2 | 700 | #define PAGE_MODE_VALUES_E2 2 |
| 551 | 701 | ||
diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c b/drivers/net/bnx2x/bnx2x_ethtool.c index 99c672d894ca..5b44a8b48509 100644 --- a/drivers/net/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/bnx2x/bnx2x_ethtool.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include "bnx2x.h" | 24 | #include "bnx2x.h" |
| 25 | #include "bnx2x_cmn.h" | 25 | #include "bnx2x_cmn.h" |
| 26 | #include "bnx2x_dump.h" | 26 | #include "bnx2x_dump.h" |
| 27 | #include "bnx2x_init.h" | ||
| 27 | 28 | ||
| 28 | /* Note: in the format strings below %s is replaced by the queue-name which is | 29 | /* Note: in the format strings below %s is replaced by the queue-name which is |
| 29 | * either its index or 'fcoe' for the fcoe queue. Make sure the format string | 30 | * 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) | |||
| 472 | { | 473 | { |
| 473 | struct bnx2x *bp = netdev_priv(dev); | 474 | struct bnx2x *bp = netdev_priv(dev); |
| 474 | int regdump_len = 0; | 475 | int regdump_len = 0; |
| 475 | int i; | 476 | int i, j, k; |
| 476 | 477 | ||
| 477 | if (CHIP_IS_E1(bp)) { | 478 | if (CHIP_IS_E1(bp)) { |
| 478 | for (i = 0; i < REGS_COUNT; i++) | 479 | for (i = 0; i < REGS_COUNT; i++) |
| @@ -502,6 +503,15 @@ static int bnx2x_get_regs_len(struct net_device *dev) | |||
| 502 | if (IS_E2_ONLINE(wreg_addrs_e2[i].info)) | 503 | if (IS_E2_ONLINE(wreg_addrs_e2[i].info)) |
| 503 | regdump_len += wreg_addrs_e2[i].size * | 504 | regdump_len += wreg_addrs_e2[i].size * |
| 504 | (1 + wreg_addrs_e2[i].read_regs_count); | 505 | (1 + wreg_addrs_e2[i].read_regs_count); |
| 506 | |||
| 507 | for (i = 0; i < PAGE_MODE_VALUES_E2; i++) | ||
| 508 | for (j = 0; j < PAGE_WRITE_REGS_E2; j++) { | ||
| 509 | for (k = 0; k < PAGE_READ_REGS_E2; k++) | ||
| 510 | if (IS_E2_ONLINE(page_read_regs_e2[k]. | ||
| 511 | info)) | ||
| 512 | regdump_len += | ||
| 513 | page_read_regs_e2[k].size; | ||
| 514 | } | ||
| 505 | } | 515 | } |
| 506 | regdump_len *= 4; | 516 | regdump_len *= 4; |
| 507 | regdump_len += sizeof(struct dump_hdr); | 517 | regdump_len += sizeof(struct dump_hdr); |
| @@ -539,6 +549,12 @@ static void bnx2x_get_regs(struct net_device *dev, | |||
| 539 | if (!netif_running(bp->dev)) | 549 | if (!netif_running(bp->dev)) |
| 540 | return; | 550 | return; |
| 541 | 551 | ||
| 552 | /* Disable parity attentions as long as following dump may | ||
| 553 | * cause false alarms by reading never written registers. We | ||
| 554 | * will re-enable parity attentions right after the dump. | ||
| 555 | */ | ||
| 556 | bnx2x_disable_blocks_parity(bp); | ||
| 557 | |||
| 542 | dump_hdr.hdr_size = (sizeof(struct dump_hdr) / 4) - 1; | 558 | dump_hdr.hdr_size = (sizeof(struct dump_hdr) / 4) - 1; |
| 543 | dump_hdr.dump_sign = dump_sign_all; | 559 | dump_hdr.dump_sign = dump_sign_all; |
| 544 | dump_hdr.xstorm_waitp = REG_RD(bp, XSTORM_WAITP_ADDR); | 560 | dump_hdr.xstorm_waitp = REG_RD(bp, XSTORM_WAITP_ADDR); |
| @@ -580,6 +596,10 @@ static void bnx2x_get_regs(struct net_device *dev, | |||
| 580 | 596 | ||
| 581 | bnx2x_read_pages_regs_e2(bp, p); | 597 | bnx2x_read_pages_regs_e2(bp, p); |
| 582 | } | 598 | } |
| 599 | /* Re-enable parity attentions */ | ||
| 600 | bnx2x_clear_blocks_parity(bp); | ||
| 601 | if (CHIP_PARITY_ENABLED(bp)) | ||
| 602 | bnx2x_enable_blocks_parity(bp); | ||
| 583 | } | 603 | } |
| 584 | 604 | ||
| 585 | #define PHY_FW_VER_LEN 20 | 605 | #define PHY_FW_VER_LEN 20 |
diff --git a/drivers/net/bnx2x/bnx2x_init.h b/drivers/net/bnx2x/bnx2x_init.h index a9d54874a559..5a268e9a0895 100644 --- a/drivers/net/bnx2x/bnx2x_init.h +++ b/drivers/net/bnx2x/bnx2x_init.h | |||
| @@ -192,5 +192,225 @@ struct src_ent { | |||
| 192 | u64 next; | 192 | u64 next; |
| 193 | }; | 193 | }; |
| 194 | 194 | ||
| 195 | /**************************************************************************** | ||
| 196 | * Parity configuration | ||
| 197 | ****************************************************************************/ | ||
| 198 | #define BLOCK_PRTY_INFO(block, en_mask, m1, m1h, m2) \ | ||
| 199 | { \ | ||
| 200 | block##_REG_##block##_PRTY_MASK, \ | ||
| 201 | block##_REG_##block##_PRTY_STS_CLR, \ | ||
| 202 | en_mask, {m1, m1h, m2}, #block \ | ||
| 203 | } | ||
| 204 | |||
| 205 | #define BLOCK_PRTY_INFO_0(block, en_mask, m1, m1h, m2) \ | ||
| 206 | { \ | ||
| 207 | block##_REG_##block##_PRTY_MASK_0, \ | ||
| 208 | block##_REG_##block##_PRTY_STS_CLR_0, \ | ||
| 209 | en_mask, {m1, m1h, m2}, #block"_0" \ | ||
| 210 | } | ||
| 211 | |||
| 212 | #define BLOCK_PRTY_INFO_1(block, en_mask, m1, m1h, m2) \ | ||
| 213 | { \ | ||
| 214 | block##_REG_##block##_PRTY_MASK_1, \ | ||
| 215 | block##_REG_##block##_PRTY_STS_CLR_1, \ | ||
| 216 | en_mask, {m1, m1h, m2}, #block"_1" \ | ||
| 217 | } | ||
| 218 | |||
| 219 | static const struct { | ||
| 220 | u32 mask_addr; | ||
| 221 | u32 sts_clr_addr; | ||
| 222 | u32 en_mask; /* Mask to enable parity attentions */ | ||
| 223 | struct { | ||
| 224 | u32 e1; /* 57710 */ | ||
| 225 | u32 e1h; /* 57711 */ | ||
| 226 | u32 e2; /* 57712 */ | ||
| 227 | } reg_mask; /* Register mask (all valid bits) */ | ||
| 228 | char name[7]; /* Block's longest name is 6 characters long | ||
| 229 | * (name + suffix) | ||
| 230 | */ | ||
| 231 | } bnx2x_blocks_parity_data[] = { | ||
| 232 | /* bit 19 masked */ | ||
| 233 | /* REG_WR(bp, PXP_REG_PXP_PRTY_MASK, 0x80000); */ | ||
| 234 | /* bit 5,18,20-31 */ | ||
| 235 | /* REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_0, 0xfff40020); */ | ||
| 236 | /* bit 5 */ | ||
| 237 | /* REG_WR(bp, PXP2_REG_PXP2_PRTY_MASK_1, 0x20); */ | ||
| 238 | /* REG_WR(bp, HC_REG_HC_PRTY_MASK, 0x0); */ | ||
| 239 | /* REG_WR(bp, MISC_REG_MISC_PRTY_MASK, 0x0); */ | ||
| 240 | |||
| 241 | /* Block IGU, MISC, PXP and PXP2 parity errors as long as we don't | ||
| 242 | * want to handle "system kill" flow at the moment. | ||
| 243 | */ | ||
| 244 | BLOCK_PRTY_INFO(PXP, 0x3ffffff, 0x3ffffff, 0x3ffffff, 0x3ffffff), | ||
| 245 | BLOCK_PRTY_INFO_0(PXP2, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff), | ||
| 246 | BLOCK_PRTY_INFO_1(PXP2, 0x7ff, 0x7f, 0x7f, 0x7ff), | ||
| 247 | BLOCK_PRTY_INFO(HC, 0x7, 0x7, 0x7, 0), | ||
| 248 | BLOCK_PRTY_INFO(IGU, 0x7ff, 0, 0, 0x7ff), | ||
| 249 | BLOCK_PRTY_INFO(MISC, 0x1, 0x1, 0x1, 0x1), | ||
| 250 | BLOCK_PRTY_INFO(QM, 0, 0x1ff, 0xfff, 0xfff), | ||
| 251 | BLOCK_PRTY_INFO(DORQ, 0, 0x3, 0x3, 0x3), | ||
| 252 | {GRCBASE_UPB + PB_REG_PB_PRTY_MASK, | ||
| 253 | GRCBASE_UPB + PB_REG_PB_PRTY_STS_CLR, 0, | ||
| 254 | {0xf, 0xf, 0xf}, "UPB"}, | ||
| 255 | {GRCBASE_XPB + PB_REG_PB_PRTY_MASK, | ||
| 256 | GRCBASE_XPB + PB_REG_PB_PRTY_STS_CLR, 0, | ||
| 257 | {0xf, 0xf, 0xf}, "XPB"}, | ||
| 258 | BLOCK_PRTY_INFO(SRC, 0x4, 0x7, 0x7, 0x7), | ||
| 259 | BLOCK_PRTY_INFO(CDU, 0, 0x1f, 0x1f, 0x1f), | ||
| 260 | BLOCK_PRTY_INFO(CFC, 0, 0xf, 0xf, 0xf), | ||
| 261 | BLOCK_PRTY_INFO(DBG, 0, 0x1, 0x1, 0x1), | ||
| 262 | BLOCK_PRTY_INFO(DMAE, 0, 0xf, 0xf, 0xf), | ||
| 263 | BLOCK_PRTY_INFO(BRB1, 0, 0xf, 0xf, 0xf), | ||
| 264 | BLOCK_PRTY_INFO(PRS, (1<<6), 0xff, 0xff, 0xff), | ||
| 265 | BLOCK_PRTY_INFO(TSDM, 0x18, 0x7ff, 0x7ff, 0x7ff), | ||
| 266 | BLOCK_PRTY_INFO(CSDM, 0x8, 0x7ff, 0x7ff, 0x7ff), | ||
| 267 | BLOCK_PRTY_INFO(USDM, 0x38, 0x7ff, 0x7ff, 0x7ff), | ||
| 268 | BLOCK_PRTY_INFO(XSDM, 0x8, 0x7ff, 0x7ff, 0x7ff), | ||
| 269 | BLOCK_PRTY_INFO_0(TSEM, 0, 0xffffffff, 0xffffffff, 0xffffffff), | ||
| 270 | BLOCK_PRTY_INFO_1(TSEM, 0, 0x3, 0x1f, 0x3f), | ||
| 271 | BLOCK_PRTY_INFO_0(USEM, 0, 0xffffffff, 0xffffffff, 0xffffffff), | ||
| 272 | BLOCK_PRTY_INFO_1(USEM, 0, 0x3, 0x1f, 0x1f), | ||
| 273 | BLOCK_PRTY_INFO_0(CSEM, 0, 0xffffffff, 0xffffffff, 0xffffffff), | ||
| 274 | BLOCK_PRTY_INFO_1(CSEM, 0, 0x3, 0x1f, 0x1f), | ||
| 275 | BLOCK_PRTY_INFO_0(XSEM, 0, 0xffffffff, 0xffffffff, 0xffffffff), | ||
| 276 | BLOCK_PRTY_INFO_1(XSEM, 0, 0x3, 0x1f, 0x3f), | ||
| 277 | }; | ||
| 278 | |||
| 279 | |||
| 280 | /* [28] MCP Latched rom_parity | ||
| 281 | * [29] MCP Latched ump_rx_parity | ||
| 282 | * [30] MCP Latched ump_tx_parity | ||
| 283 | * [31] MCP Latched scpad_parity | ||
| 284 | */ | ||
| 285 | #define MISC_AEU_ENABLE_MCP_PRTY_BITS \ | ||
| 286 | (AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY | \ | ||
| 287 | AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY | \ | ||
| 288 | AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY | \ | ||
| 289 | AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY) | ||
| 290 | |||
| 291 | /* Below registers control the MCP parity attention output. When | ||
| 292 | * MISC_AEU_ENABLE_MCP_PRTY_BITS are set - attentions are | ||
| 293 | * enabled, when cleared - disabled. | ||
| 294 | */ | ||
| 295 | static const u32 mcp_attn_ctl_regs[] = { | ||
| 296 | MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0, | ||
| 297 | MISC_REG_AEU_ENABLE4_NIG_0, | ||
| 298 | MISC_REG_AEU_ENABLE4_PXP_0, | ||
| 299 | MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0, | ||
| 300 | MISC_REG_AEU_ENABLE4_NIG_1, | ||
| 301 | MISC_REG_AEU_ENABLE4_PXP_1 | ||
| 302 | }; | ||
| 303 | |||
| 304 | static inline void bnx2x_set_mcp_parity(struct bnx2x *bp, u8 enable) | ||
| 305 | { | ||
| 306 | int i; | ||
| 307 | u32 reg_val; | ||
| 308 | |||
| 309 | for (i = 0; i < ARRAY_SIZE(mcp_attn_ctl_regs); i++) { | ||
| 310 | reg_val = REG_RD(bp, mcp_attn_ctl_regs[i]); | ||
| 311 | |||
| 312 | if (enable) | ||
| 313 | reg_val |= MISC_AEU_ENABLE_MCP_PRTY_BITS; | ||
| 314 | else | ||
| 315 | reg_val &= ~MISC_AEU_ENABLE_MCP_PRTY_BITS; | ||
| 316 | |||
| 317 | REG_WR(bp, mcp_attn_ctl_regs[i], reg_val); | ||
| 318 | } | ||
| 319 | } | ||
| 320 | |||
| 321 | static inline u32 bnx2x_parity_reg_mask(struct bnx2x *bp, int idx) | ||
| 322 | { | ||
| 323 | if (CHIP_IS_E1(bp)) | ||
| 324 | return bnx2x_blocks_parity_data[idx].reg_mask.e1; | ||
| 325 | else if (CHIP_IS_E1H(bp)) | ||
| 326 | return bnx2x_blocks_parity_data[idx].reg_mask.e1h; | ||
| 327 | else | ||
| 328 | return bnx2x_blocks_parity_data[idx].reg_mask.e2; | ||
| 329 | } | ||
| 330 | |||
| 331 | static inline void bnx2x_disable_blocks_parity(struct bnx2x *bp) | ||
| 332 | { | ||
| 333 | int i; | ||
| 334 | |||
| 335 | for (i = 0; i < ARRAY_SIZE(bnx2x_blocks_parity_data); i++) { | ||
| 336 | u32 dis_mask = bnx2x_parity_reg_mask(bp, i); | ||
| 337 | |||
| 338 | if (dis_mask) { | ||
| 339 | REG_WR(bp, bnx2x_blocks_parity_data[i].mask_addr, | ||
| 340 | dis_mask); | ||
| 341 | DP(NETIF_MSG_HW, "Setting parity mask " | ||
| 342 | "for %s to\t\t0x%x\n", | ||
| 343 | bnx2x_blocks_parity_data[i].name, dis_mask); | ||
| 344 | } | ||
| 345 | } | ||
| 346 | |||
| 347 | /* Disable MCP parity attentions */ | ||
| 348 | bnx2x_set_mcp_parity(bp, false); | ||
| 349 | } | ||
| 350 | |||
| 351 | /** | ||
| 352 | * Clear the parity error status registers. | ||
| 353 | */ | ||
| 354 | static inline void bnx2x_clear_blocks_parity(struct bnx2x *bp) | ||
| 355 | { | ||
| 356 | int i; | ||
| 357 | u32 reg_val, mcp_aeu_bits = | ||
| 358 | AEU_INPUTS_ATTN_BITS_MCP_LATCHED_ROM_PARITY | | ||
| 359 | AEU_INPUTS_ATTN_BITS_MCP_LATCHED_SCPAD_PARITY | | ||
| 360 | AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_RX_PARITY | | ||
| 361 | AEU_INPUTS_ATTN_BITS_MCP_LATCHED_UMP_TX_PARITY; | ||
| 362 | |||
| 363 | /* Clear SEM_FAST parities */ | ||
| 364 | REG_WR(bp, XSEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1); | ||
| 365 | REG_WR(bp, TSEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1); | ||
| 366 | REG_WR(bp, USEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1); | ||
| 367 | REG_WR(bp, CSEM_REG_FAST_MEMORY + SEM_FAST_REG_PARITY_RST, 0x1); | ||
| 368 | |||
| 369 | for (i = 0; i < ARRAY_SIZE(bnx2x_blocks_parity_data); i++) { | ||
| 370 | u32 reg_mask = bnx2x_parity_reg_mask(bp, i); | ||
| 371 | |||
| 372 | if (reg_mask) { | ||
| 373 | reg_val = REG_RD(bp, bnx2x_blocks_parity_data[i]. | ||
| 374 | sts_clr_addr); | ||
| 375 | if (reg_val & reg_mask) | ||
| 376 | DP(NETIF_MSG_HW, | ||
| 377 | "Parity errors in %s: 0x%x\n", | ||
| 378 | bnx2x_blocks_parity_data[i].name, | ||
| 379 | reg_val & reg_mask); | ||
| 380 | } | ||
| 381 | } | ||
| 382 | |||
| 383 | /* Check if there were parity attentions in MCP */ | ||
| 384 | reg_val = REG_RD(bp, MISC_REG_AEU_AFTER_INVERT_4_MCP); | ||
| 385 | if (reg_val & mcp_aeu_bits) | ||
| 386 | DP(NETIF_MSG_HW, "Parity error in MCP: 0x%x\n", | ||
| 387 | reg_val & mcp_aeu_bits); | ||
| 388 | |||
| 389 | /* Clear parity attentions in MCP: | ||
| 390 | * [7] clears Latched rom_parity | ||
| 391 | * [8] clears Latched ump_rx_parity | ||
| 392 | * [9] clears Latched ump_tx_parity | ||
| 393 | * [10] clears Latched scpad_parity (both ports) | ||
| 394 | */ | ||
| 395 | REG_WR(bp, MISC_REG_AEU_CLR_LATCH_SIGNAL, 0x780); | ||
| 396 | } | ||
| 397 | |||
| 398 | static inline void bnx2x_enable_blocks_parity(struct bnx2x *bp) | ||
| 399 | { | ||
| 400 | int i; | ||
| 401 | |||
| 402 | for (i = 0; i < ARRAY_SIZE(bnx2x_blocks_parity_data); i++) { | ||
| 403 | u32 reg_mask = bnx2x_parity_reg_mask(bp, i); | ||
| 404 | |||
| 405 | if (reg_mask) | ||
| 406 | REG_WR(bp, bnx2x_blocks_parity_data[i].mask_addr, | ||
| 407 | bnx2x_blocks_parity_data[i].en_mask & reg_mask); | ||
| 408 | } | ||
| 409 | |||
| 410 | /* Enable MCP parity attentions */ | ||
| 411 | bnx2x_set_mcp_parity(bp, true); | ||
| 412 | } | ||
| 413 | |||
| 414 | |||
| 195 | #endif /* BNX2X_INIT_H */ | 415 | #endif /* BNX2X_INIT_H */ |
| 196 | 416 | ||
diff --git a/drivers/net/bnx2x/bnx2x_main.c b/drivers/net/bnx2x/bnx2x_main.c index 489a5512a04d..84e1af4d65e1 100644 --- a/drivers/net/bnx2x/bnx2x_main.c +++ b/drivers/net/bnx2x/bnx2x_main.c | |||
| @@ -3152,7 +3152,6 @@ static inline void bnx2x_attn_int_deasserted3(struct bnx2x *bp, u32 attn) | |||
| 3152 | #define LOAD_COUNTER_MASK (((u32)0x1 << LOAD_COUNTER_BITS) - 1) | 3152 | #define LOAD_COUNTER_MASK (((u32)0x1 << LOAD_COUNTER_BITS) - 1) |
| 3153 | #define RESET_DONE_FLAG_MASK (~LOAD_COUNTER_MASK) | 3153 | #define RESET_DONE_FLAG_MASK (~LOAD_COUNTER_MASK) |
| 3154 | #define RESET_DONE_FLAG_SHIFT LOAD_COUNTER_BITS | 3154 | #define RESET_DONE_FLAG_SHIFT LOAD_COUNTER_BITS |
| 3155 | #define CHIP_PARITY_SUPPORTED(bp) (CHIP_IS_E1(bp) || CHIP_IS_E1H(bp)) | ||
| 3156 | 3155 | ||
| 3157 | /* | 3156 | /* |
| 3158 | * should be run under rtnl lock | 3157 | * should be run under rtnl lock |
| @@ -3527,7 +3526,7 @@ static void bnx2x_attn_int_deasserted(struct bnx2x *bp, u32 deasserted) | |||
| 3527 | try to handle this event */ | 3526 | try to handle this event */ |
| 3528 | bnx2x_acquire_alr(bp); | 3527 | bnx2x_acquire_alr(bp); |
| 3529 | 3528 | ||
| 3530 | if (bnx2x_chk_parity_attn(bp)) { | 3529 | if (CHIP_PARITY_ENABLED(bp) && bnx2x_chk_parity_attn(bp)) { |
| 3531 | bp->recovery_state = BNX2X_RECOVERY_INIT; | 3530 | bp->recovery_state = BNX2X_RECOVERY_INIT; |
| 3532 | bnx2x_set_reset_in_progress(bp); | 3531 | bnx2x_set_reset_in_progress(bp); |
| 3533 | schedule_delayed_work(&bp->reset_task, 0); | 3532 | schedule_delayed_work(&bp->reset_task, 0); |
| @@ -4754,7 +4753,7 @@ static int bnx2x_int_mem_test(struct bnx2x *bp) | |||
| 4754 | return 0; /* OK */ | 4753 | return 0; /* OK */ |
| 4755 | } | 4754 | } |
| 4756 | 4755 | ||
| 4757 | static void enable_blocks_attention(struct bnx2x *bp) | 4756 | static void bnx2x_enable_blocks_attention(struct bnx2x *bp) |
| 4758 | { | 4757 | { |
| 4759 | REG_WR(bp, PXP_REG_PXP_INT_MASK_0, 0); | 4758 | REG_WR(bp, PXP_REG_PXP_INT_MASK_0, 0); |
| 4760 | if (CHIP_IS_E2(bp)) | 4759 | if (CHIP_IS_E2(bp)) |
| @@ -4808,53 +4807,9 @@ static void enable_blocks_attention(struct bnx2x *bp) | |||
| 4808 | REG_WR(bp, CDU_REG_CDU_INT_MASK, 0); | 4807 | REG_WR(bp, CDU_REG_CDU_INT_MASK, 0); |
| 4809 | REG_WR(bp, DMAE_REG_DMAE_INT_MASK, 0); | 4808 | REG_WR(bp, DMAE_REG_DMAE_INT_MASK, 0); |
| 4810 | /* REG_WR(bp, MISC_REG_MISC_INT_MASK, 0); */ | 4809 | /* REG_WR(bp, MISC_REG_MISC_INT_MASK, 0); */ |
| 4811 | REG_WR(bp, PBF_REG_PBF_INT_MASK, 0X18); /* bit 3,4 masked */ | 4810 | REG_WR(bp, PBF_REG_PBF_INT_MASK, 0x18); /* bit 3,4 masked */ |
| 4812 | } | 4811 | } |
| 4813 | 4812 | ||
| 4814 | static const struct { | ||
| 4815 | u32 addr; | ||
| 4816 | u32 mask; | ||
| 4817 | } bnx2x_parity_mask[] = { | ||
| 4818 | {PXP_REG_PXP_PRTY_MASK, 0x3ffffff}, | ||
| 4819 | {PXP2_REG_PXP2_PRTY_MASK_0, 0xffffffff}, | ||
| 4820 | {PXP2_REG_PXP2_PRTY_MASK_1, 0x7f}, | ||
| 4821 | {HC_REG_HC_PRTY_MASK, 0x7}, | ||
| 4822 | {MISC_REG_MISC_PRTY_MASK, 0x1}, | ||
| 4823 | {QM_REG_QM_PRTY_MASK, 0x0}, | ||
| 4824 | {DORQ_REG_DORQ_PRTY_MASK, 0x0}, | ||
| 4825 | {GRCBASE_UPB + PB_REG_PB_PRTY_MASK, 0x0}, | ||
| 4826 | {GRCBASE_XPB + PB_REG_PB_PRTY_MASK, 0x0}, | ||
| 4827 | {SRC_REG_SRC_PRTY_MASK, 0x4}, /* bit 2 */ | ||
| 4828 | {CDU_REG_CDU_PRTY_MASK, 0x0}, | ||
| 4829 | {CFC_REG_CFC_PRTY_MASK, 0x0}, | ||
| 4830 | {DBG_REG_DBG_PRTY_MASK, 0x0}, | ||
| 4831 | {DMAE_REG_DMAE_PRTY_MASK, 0x0}, | ||
| 4832 | {BRB1_REG_BRB1_PRTY_MASK, 0x0}, | ||
| 4833 | {PRS_REG_PRS_PRTY_MASK, (1<<6)},/* bit 6 */ | ||
| 4834 | {TSDM_REG_TSDM_PRTY_MASK, 0x18}, /* bit 3,4 */ | ||
| 4835 | {CSDM_REG_CSDM_PRTY_MASK, 0x8}, /* bit 3 */ | ||
| 4836 | {USDM_REG_USDM_PRTY_MASK, 0x38}, /* bit 3,4,5 */ | ||
| 4837 | {XSDM_REG_XSDM_PRTY_MASK, 0x8}, /* bit 3 */ | ||
| 4838 | {TSEM_REG_TSEM_PRTY_MASK_0, 0x0}, | ||
| 4839 | {TSEM_REG_TSEM_PRTY_MASK_1, 0x0}, | ||
| 4840 | {USEM_REG_USEM_PRTY_MASK_0, 0x0}, | ||
| 4841 | {USEM_REG_USEM_PRTY_MASK_1, 0x0}, | ||
| 4842 | {CSEM_REG_CSEM_PRTY_MASK_0, 0x0}, | ||
| 4843 | {CSEM_REG_CSEM_PRTY_MASK_1, 0x0}, | ||
| 4844 | {XSEM_REG_XSEM_PRTY_MASK_0, 0x0}, | ||
| 4845 | {XSEM_REG_XSEM_PRTY_MASK_1, 0x0} | ||
| 4846 | }; | ||
| 4847 | |||
| 4848 | static void enable_blocks_parity(struct bnx2x *bp) | ||
| 4849 | { | ||
| 4850 | int i; | ||
| 4851 | |||
| 4852 | for (i = 0; i < ARRAY_SIZE(bnx2x_parity_mask); i++) | ||
| 4853 | REG_WR(bp, bnx2x_parity_mask[i].addr, | ||
| 4854 | bnx2x_parity_mask[i].mask); | ||
| 4855 | } | ||
| 4856 | |||
| 4857 | |||
| 4858 | static void bnx2x_reset_common(struct bnx2x *bp) | 4813 | static void bnx2x_reset_common(struct bnx2x *bp) |
| 4859 | { | 4814 | { |
| 4860 | /* reset_common */ | 4815 | /* reset_common */ |
| @@ -5350,9 +5305,9 @@ static int bnx2x_init_hw_common(struct bnx2x *bp, u32 load_code) | |||
| 5350 | /* clear PXP2 attentions */ | 5305 | /* clear PXP2 attentions */ |
| 5351 | REG_RD(bp, PXP2_REG_PXP2_INT_STS_CLR_0); | 5306 | REG_RD(bp, PXP2_REG_PXP2_INT_STS_CLR_0); |
| 5352 | 5307 | ||
| 5353 | enable_blocks_attention(bp); | 5308 | bnx2x_enable_blocks_attention(bp); |
| 5354 | if (CHIP_PARITY_SUPPORTED(bp)) | 5309 | if (CHIP_PARITY_ENABLED(bp)) |
| 5355 | enable_blocks_parity(bp); | 5310 | bnx2x_enable_blocks_parity(bp); |
| 5356 | 5311 | ||
| 5357 | if (!BP_NOMCP(bp)) { | 5312 | if (!BP_NOMCP(bp)) { |
| 5358 | /* In E2 2-PORT mode, same ext phy is used for the two paths */ | 5313 | /* 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) | |||
| 8751 | dev_err(&bp->pdev->dev, "MCP disabled, " | 8706 | dev_err(&bp->pdev->dev, "MCP disabled, " |
| 8752 | "must load devices in order!\n"); | 8707 | "must load devices in order!\n"); |
| 8753 | 8708 | ||
| 8754 | /* Set multi queue mode */ | ||
| 8755 | if ((multi_mode != ETH_RSS_MODE_DISABLED) && | ||
| 8756 | ((int_mode == INT_MODE_INTx) || (int_mode == INT_MODE_MSI))) { | ||
| 8757 | dev_err(&bp->pdev->dev, "Multi disabled since int_mode " | ||
| 8758 | "requested is not MSI-X\n"); | ||
| 8759 | multi_mode = ETH_RSS_MODE_DISABLED; | ||
| 8760 | } | ||
| 8761 | bp->multi_mode = multi_mode; | 8709 | bp->multi_mode = multi_mode; |
| 8762 | bp->int_mode = int_mode; | 8710 | bp->int_mode = int_mode; |
| 8763 | 8711 | ||
| @@ -9560,9 +9508,15 @@ static void __devexit bnx2x_remove_one(struct pci_dev *pdev) | |||
| 9560 | /* Delete all NAPI objects */ | 9508 | /* Delete all NAPI objects */ |
| 9561 | bnx2x_del_all_napi(bp); | 9509 | bnx2x_del_all_napi(bp); |
| 9562 | 9510 | ||
| 9511 | /* Power on: we can't let PCI layer write to us while we are in D3 */ | ||
| 9512 | bnx2x_set_power_state(bp, PCI_D0); | ||
| 9513 | |||
| 9563 | /* Disable MSI/MSI-X */ | 9514 | /* Disable MSI/MSI-X */ |
| 9564 | bnx2x_disable_msi(bp); | 9515 | bnx2x_disable_msi(bp); |
| 9565 | 9516 | ||
| 9517 | /* Power off */ | ||
| 9518 | bnx2x_set_power_state(bp, PCI_D3hot); | ||
| 9519 | |||
| 9566 | /* Make sure RESET task is not scheduled before continuing */ | 9520 | /* Make sure RESET task is not scheduled before continuing */ |
| 9567 | cancel_delayed_work_sync(&bp->reset_task); | 9521 | cancel_delayed_work_sync(&bp->reset_task); |
| 9568 | 9522 | ||
diff --git a/drivers/net/bnx2x/bnx2x_reg.h b/drivers/net/bnx2x/bnx2x_reg.h index bfd875b72906..38ef7ca9f21d 100644 --- a/drivers/net/bnx2x/bnx2x_reg.h +++ b/drivers/net/bnx2x/bnx2x_reg.h | |||
| @@ -18,6 +18,8 @@ | |||
| 18 | * WR - Write Clear (write 1 to clear the bit) | 18 | * WR - Write Clear (write 1 to clear the bit) |
| 19 | * | 19 | * |
| 20 | */ | 20 | */ |
| 21 | #ifndef BNX2X_REG_H | ||
| 22 | #define BNX2X_REG_H | ||
| 21 | 23 | ||
| 22 | #define ATC_ATC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) | 24 | #define ATC_ATC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) |
| 23 | #define ATC_ATC_INT_STS_REG_ATC_GPA_MULTIPLE_HITS (0x1<<2) | 25 | #define ATC_ATC_INT_STS_REG_ATC_GPA_MULTIPLE_HITS (0x1<<2) |
| @@ -39,6 +41,8 @@ | |||
| 39 | #define BRB1_REG_BRB1_PRTY_MASK 0x60138 | 41 | #define BRB1_REG_BRB1_PRTY_MASK 0x60138 |
| 40 | /* [R 4] Parity register #0 read */ | 42 | /* [R 4] Parity register #0 read */ |
| 41 | #define BRB1_REG_BRB1_PRTY_STS 0x6012c | 43 | #define BRB1_REG_BRB1_PRTY_STS 0x6012c |
| 44 | /* [RC 4] Parity register #0 read clear */ | ||
| 45 | #define BRB1_REG_BRB1_PRTY_STS_CLR 0x60130 | ||
| 42 | /* [RW 10] At address BRB1_IND_FREE_LIST_PRS_CRDT initialize free head. At | 46 | /* [RW 10] At address BRB1_IND_FREE_LIST_PRS_CRDT initialize free head. At |
| 43 | * address BRB1_IND_FREE_LIST_PRS_CRDT+1 initialize free tail. At address | 47 | * address BRB1_IND_FREE_LIST_PRS_CRDT+1 initialize free tail. At address |
| 44 | * BRB1_IND_FREE_LIST_PRS_CRDT+2 initialize parser initial credit. Warning - | 48 | * BRB1_IND_FREE_LIST_PRS_CRDT+2 initialize parser initial credit. Warning - |
| @@ -132,8 +136,12 @@ | |||
| 132 | #define CCM_REG_CCM_INT_MASK 0xd01e4 | 136 | #define CCM_REG_CCM_INT_MASK 0xd01e4 |
| 133 | /* [R 11] Interrupt register #0 read */ | 137 | /* [R 11] Interrupt register #0 read */ |
| 134 | #define CCM_REG_CCM_INT_STS 0xd01d8 | 138 | #define CCM_REG_CCM_INT_STS 0xd01d8 |
| 139 | /* [RW 27] Parity mask register #0 read/write */ | ||
| 140 | #define CCM_REG_CCM_PRTY_MASK 0xd01f4 | ||
| 135 | /* [R 27] Parity register #0 read */ | 141 | /* [R 27] Parity register #0 read */ |
| 136 | #define CCM_REG_CCM_PRTY_STS 0xd01e8 | 142 | #define CCM_REG_CCM_PRTY_STS 0xd01e8 |
| 143 | /* [RC 27] Parity register #0 read clear */ | ||
| 144 | #define CCM_REG_CCM_PRTY_STS_CLR 0xd01ec | ||
| 137 | /* [RW 3] The size of AG context region 0 in REG-pairs. Designates the MS | 145 | /* [RW 3] The size of AG context region 0 in REG-pairs. Designates the MS |
| 138 | REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). | 146 | REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). |
| 139 | Is used to determine the number of the AG context REG-pairs written back; | 147 | Is used to determine the number of the AG context REG-pairs written back; |
| @@ -350,6 +358,8 @@ | |||
| 350 | #define CDU_REG_CDU_PRTY_MASK 0x10104c | 358 | #define CDU_REG_CDU_PRTY_MASK 0x10104c |
| 351 | /* [R 5] Parity register #0 read */ | 359 | /* [R 5] Parity register #0 read */ |
| 352 | #define CDU_REG_CDU_PRTY_STS 0x101040 | 360 | #define CDU_REG_CDU_PRTY_STS 0x101040 |
| 361 | /* [RC 5] Parity register #0 read clear */ | ||
| 362 | #define CDU_REG_CDU_PRTY_STS_CLR 0x101044 | ||
| 353 | /* [RC 32] logging of error data in case of a CDU load error: | 363 | /* [RC 32] logging of error data in case of a CDU load error: |
| 354 | {expected_cid[15:0]; xpected_type[2:0]; xpected_region[2:0]; ctive_error; | 364 | {expected_cid[15:0]; xpected_type[2:0]; xpected_region[2:0]; ctive_error; |
| 355 | ype_error; ctual_active; ctual_compressed_context}; */ | 365 | ype_error; ctual_active; ctual_compressed_context}; */ |
| @@ -381,6 +391,8 @@ | |||
| 381 | #define CFC_REG_CFC_PRTY_MASK 0x104118 | 391 | #define CFC_REG_CFC_PRTY_MASK 0x104118 |
| 382 | /* [R 4] Parity register #0 read */ | 392 | /* [R 4] Parity register #0 read */ |
| 383 | #define CFC_REG_CFC_PRTY_STS 0x10410c | 393 | #define CFC_REG_CFC_PRTY_STS 0x10410c |
| 394 | /* [RC 4] Parity register #0 read clear */ | ||
| 395 | #define CFC_REG_CFC_PRTY_STS_CLR 0x104110 | ||
| 384 | /* [RW 21] CID cam access (21:1 - Data; alid - 0) */ | 396 | /* [RW 21] CID cam access (21:1 - Data; alid - 0) */ |
| 385 | #define CFC_REG_CID_CAM 0x104800 | 397 | #define CFC_REG_CID_CAM 0x104800 |
| 386 | #define CFC_REG_CONTROL0 0x104028 | 398 | #define CFC_REG_CONTROL0 0x104028 |
| @@ -466,6 +478,8 @@ | |||
| 466 | #define CSDM_REG_CSDM_PRTY_MASK 0xc22bc | 478 | #define CSDM_REG_CSDM_PRTY_MASK 0xc22bc |
| 467 | /* [R 11] Parity register #0 read */ | 479 | /* [R 11] Parity register #0 read */ |
| 468 | #define CSDM_REG_CSDM_PRTY_STS 0xc22b0 | 480 | #define CSDM_REG_CSDM_PRTY_STS 0xc22b0 |
| 481 | /* [RC 11] Parity register #0 read clear */ | ||
| 482 | #define CSDM_REG_CSDM_PRTY_STS_CLR 0xc22b4 | ||
| 469 | #define CSDM_REG_ENABLE_IN1 0xc2238 | 483 | #define CSDM_REG_ENABLE_IN1 0xc2238 |
| 470 | #define CSDM_REG_ENABLE_IN2 0xc223c | 484 | #define CSDM_REG_ENABLE_IN2 0xc223c |
| 471 | #define CSDM_REG_ENABLE_OUT1 0xc2240 | 485 | #define CSDM_REG_ENABLE_OUT1 0xc2240 |
| @@ -556,6 +570,9 @@ | |||
| 556 | /* [R 32] Parity register #0 read */ | 570 | /* [R 32] Parity register #0 read */ |
| 557 | #define CSEM_REG_CSEM_PRTY_STS_0 0x200124 | 571 | #define CSEM_REG_CSEM_PRTY_STS_0 0x200124 |
| 558 | #define CSEM_REG_CSEM_PRTY_STS_1 0x200134 | 572 | #define CSEM_REG_CSEM_PRTY_STS_1 0x200134 |
| 573 | /* [RC 32] Parity register #0 read clear */ | ||
| 574 | #define CSEM_REG_CSEM_PRTY_STS_CLR_0 0x200128 | ||
| 575 | #define CSEM_REG_CSEM_PRTY_STS_CLR_1 0x200138 | ||
| 559 | #define CSEM_REG_ENABLE_IN 0x2000a4 | 576 | #define CSEM_REG_ENABLE_IN 0x2000a4 |
| 560 | #define CSEM_REG_ENABLE_OUT 0x2000a8 | 577 | #define CSEM_REG_ENABLE_OUT 0x2000a8 |
| 561 | /* [RW 32] This address space contains all registers and memories that are | 578 | /* [RW 32] This address space contains all registers and memories that are |
| @@ -648,6 +665,8 @@ | |||
| 648 | #define DBG_REG_DBG_PRTY_MASK 0xc0a8 | 665 | #define DBG_REG_DBG_PRTY_MASK 0xc0a8 |
| 649 | /* [R 1] Parity register #0 read */ | 666 | /* [R 1] Parity register #0 read */ |
| 650 | #define DBG_REG_DBG_PRTY_STS 0xc09c | 667 | #define DBG_REG_DBG_PRTY_STS 0xc09c |
| 668 | /* [RC 1] Parity register #0 read clear */ | ||
| 669 | #define DBG_REG_DBG_PRTY_STS_CLR 0xc0a0 | ||
| 651 | /* [RW 1] When set the DMAE will process the commands as in E1.5. 1.The | 670 | /* [RW 1] When set the DMAE will process the commands as in E1.5. 1.The |
| 652 | * function that is used is always SRC-PCI; 2.VF_Valid = 0; 3.VFID=0; | 671 | * function that is used is always SRC-PCI; 2.VF_Valid = 0; 3.VFID=0; |
| 653 | * 4.Completion function=0; 5.Error handling=0 */ | 672 | * 4.Completion function=0; 5.Error handling=0 */ |
| @@ -668,6 +687,8 @@ | |||
| 668 | #define DMAE_REG_DMAE_PRTY_MASK 0x102064 | 687 | #define DMAE_REG_DMAE_PRTY_MASK 0x102064 |
| 669 | /* [R 4] Parity register #0 read */ | 688 | /* [R 4] Parity register #0 read */ |
| 670 | #define DMAE_REG_DMAE_PRTY_STS 0x102058 | 689 | #define DMAE_REG_DMAE_PRTY_STS 0x102058 |
| 690 | /* [RC 4] Parity register #0 read clear */ | ||
| 691 | #define DMAE_REG_DMAE_PRTY_STS_CLR 0x10205c | ||
| 671 | /* [RW 1] Command 0 go. */ | 692 | /* [RW 1] Command 0 go. */ |
| 672 | #define DMAE_REG_GO_C0 0x102080 | 693 | #define DMAE_REG_GO_C0 0x102080 |
| 673 | /* [RW 1] Command 1 go. */ | 694 | /* [RW 1] Command 1 go. */ |
| @@ -734,6 +755,8 @@ | |||
| 734 | #define DORQ_REG_DORQ_PRTY_MASK 0x170190 | 755 | #define DORQ_REG_DORQ_PRTY_MASK 0x170190 |
| 735 | /* [R 2] Parity register #0 read */ | 756 | /* [R 2] Parity register #0 read */ |
| 736 | #define DORQ_REG_DORQ_PRTY_STS 0x170184 | 757 | #define DORQ_REG_DORQ_PRTY_STS 0x170184 |
| 758 | /* [RC 2] Parity register #0 read clear */ | ||
| 759 | #define DORQ_REG_DORQ_PRTY_STS_CLR 0x170188 | ||
| 737 | /* [RW 8] The address to write the DPM CID to STORM. */ | 760 | /* [RW 8] The address to write the DPM CID to STORM. */ |
| 738 | #define DORQ_REG_DPM_CID_ADDR 0x170044 | 761 | #define DORQ_REG_DPM_CID_ADDR 0x170044 |
| 739 | /* [RW 5] The DPM mode CID extraction offset. */ | 762 | /* [RW 5] The DPM mode CID extraction offset. */ |
| @@ -842,8 +865,12 @@ | |||
| 842 | /* [R 1] data availble for error memory. If this bit is clear do not red | 865 | /* [R 1] data availble for error memory. If this bit is clear do not red |
| 843 | * from error_handling_memory. */ | 866 | * from error_handling_memory. */ |
| 844 | #define IGU_REG_ERROR_HANDLING_DATA_VALID 0x130130 | 867 | #define IGU_REG_ERROR_HANDLING_DATA_VALID 0x130130 |
| 868 | /* [RW 11] Parity mask register #0 read/write */ | ||
| 869 | #define IGU_REG_IGU_PRTY_MASK 0x1300a8 | ||
| 845 | /* [R 11] Parity register #0 read */ | 870 | /* [R 11] Parity register #0 read */ |
| 846 | #define IGU_REG_IGU_PRTY_STS 0x13009c | 871 | #define IGU_REG_IGU_PRTY_STS 0x13009c |
| 872 | /* [RC 11] Parity register #0 read clear */ | ||
| 873 | #define IGU_REG_IGU_PRTY_STS_CLR 0x1300a0 | ||
| 847 | /* [R 4] Debug: int_handle_fsm */ | 874 | /* [R 4] Debug: int_handle_fsm */ |
| 848 | #define IGU_REG_INT_HANDLE_FSM 0x130050 | 875 | #define IGU_REG_INT_HANDLE_FSM 0x130050 |
| 849 | #define IGU_REG_LEADING_EDGE_LATCH 0x130134 | 876 | #define IGU_REG_LEADING_EDGE_LATCH 0x130134 |
| @@ -1501,6 +1528,8 @@ | |||
| 1501 | #define MISC_REG_MISC_PRTY_MASK 0xa398 | 1528 | #define MISC_REG_MISC_PRTY_MASK 0xa398 |
| 1502 | /* [R 1] Parity register #0 read */ | 1529 | /* [R 1] Parity register #0 read */ |
| 1503 | #define MISC_REG_MISC_PRTY_STS 0xa38c | 1530 | #define MISC_REG_MISC_PRTY_STS 0xa38c |
| 1531 | /* [RC 1] Parity register #0 read clear */ | ||
| 1532 | #define MISC_REG_MISC_PRTY_STS_CLR 0xa390 | ||
| 1504 | #define MISC_REG_NIG_WOL_P0 0xa270 | 1533 | #define MISC_REG_NIG_WOL_P0 0xa270 |
| 1505 | #define MISC_REG_NIG_WOL_P1 0xa274 | 1534 | #define MISC_REG_NIG_WOL_P1 0xa274 |
| 1506 | /* [R 1] If set indicate that the pcie_rst_b was asserted without perst | 1535 | /* [R 1] If set indicate that the pcie_rst_b was asserted without perst |
| @@ -2082,6 +2111,10 @@ | |||
| 2082 | #define PBF_REG_PBF_INT_MASK 0x1401d4 | 2111 | #define PBF_REG_PBF_INT_MASK 0x1401d4 |
| 2083 | /* [R 5] Interrupt register #0 read */ | 2112 | /* [R 5] Interrupt register #0 read */ |
| 2084 | #define PBF_REG_PBF_INT_STS 0x1401c8 | 2113 | #define PBF_REG_PBF_INT_STS 0x1401c8 |
| 2114 | /* [RW 20] Parity mask register #0 read/write */ | ||
| 2115 | #define PBF_REG_PBF_PRTY_MASK 0x1401e4 | ||
| 2116 | /* [RC 20] Parity register #0 read clear */ | ||
| 2117 | #define PBF_REG_PBF_PRTY_STS_CLR 0x1401dc | ||
| 2085 | #define PB_REG_CONTROL 0 | 2118 | #define PB_REG_CONTROL 0 |
| 2086 | /* [RW 2] Interrupt mask register #0 read/write */ | 2119 | /* [RW 2] Interrupt mask register #0 read/write */ |
| 2087 | #define PB_REG_PB_INT_MASK 0x28 | 2120 | #define PB_REG_PB_INT_MASK 0x28 |
| @@ -2091,6 +2124,8 @@ | |||
| 2091 | #define PB_REG_PB_PRTY_MASK 0x38 | 2124 | #define PB_REG_PB_PRTY_MASK 0x38 |
| 2092 | /* [R 4] Parity register #0 read */ | 2125 | /* [R 4] Parity register #0 read */ |
| 2093 | #define PB_REG_PB_PRTY_STS 0x2c | 2126 | #define PB_REG_PB_PRTY_STS 0x2c |
| 2127 | /* [RC 4] Parity register #0 read clear */ | ||
| 2128 | #define PB_REG_PB_PRTY_STS_CLR 0x30 | ||
| 2094 | #define PGLUE_B_PGLUE_B_INT_STS_REG_ADDRESS_ERROR (0x1<<0) | 2129 | #define PGLUE_B_PGLUE_B_INT_STS_REG_ADDRESS_ERROR (0x1<<0) |
| 2095 | #define PGLUE_B_PGLUE_B_INT_STS_REG_CSSNOOP_FIFO_OVERFLOW (0x1<<8) | 2130 | #define PGLUE_B_PGLUE_B_INT_STS_REG_CSSNOOP_FIFO_OVERFLOW (0x1<<8) |
| 2096 | #define PGLUE_B_PGLUE_B_INT_STS_REG_INCORRECT_RCV_BEHAVIOR (0x1<<1) | 2131 | #define PGLUE_B_PGLUE_B_INT_STS_REG_INCORRECT_RCV_BEHAVIOR (0x1<<1) |
| @@ -2446,6 +2481,8 @@ | |||
| 2446 | #define PRS_REG_PRS_PRTY_MASK 0x401a4 | 2481 | #define PRS_REG_PRS_PRTY_MASK 0x401a4 |
| 2447 | /* [R 8] Parity register #0 read */ | 2482 | /* [R 8] Parity register #0 read */ |
| 2448 | #define PRS_REG_PRS_PRTY_STS 0x40198 | 2483 | #define PRS_REG_PRS_PRTY_STS 0x40198 |
| 2484 | /* [RC 8] Parity register #0 read clear */ | ||
| 2485 | #define PRS_REG_PRS_PRTY_STS_CLR 0x4019c | ||
| 2449 | /* [RW 8] Context region for pure acknowledge packets. Used in CFC load | 2486 | /* [RW 8] Context region for pure acknowledge packets. Used in CFC load |
| 2450 | request message */ | 2487 | request message */ |
| 2451 | #define PRS_REG_PURE_REGIONS 0x40024 | 2488 | #define PRS_REG_PURE_REGIONS 0x40024 |
| @@ -2599,6 +2636,9 @@ | |||
| 2599 | /* [R 32] Parity register #0 read */ | 2636 | /* [R 32] Parity register #0 read */ |
| 2600 | #define PXP2_REG_PXP2_PRTY_STS_0 0x12057c | 2637 | #define PXP2_REG_PXP2_PRTY_STS_0 0x12057c |
| 2601 | #define PXP2_REG_PXP2_PRTY_STS_1 0x12058c | 2638 | #define PXP2_REG_PXP2_PRTY_STS_1 0x12058c |
| 2639 | /* [RC 32] Parity register #0 read clear */ | ||
| 2640 | #define PXP2_REG_PXP2_PRTY_STS_CLR_0 0x120580 | ||
| 2641 | #define PXP2_REG_PXP2_PRTY_STS_CLR_1 0x120590 | ||
| 2602 | /* [R 1] Debug only: The 'almost full' indication from each fifo (gives | 2642 | /* [R 1] Debug only: The 'almost full' indication from each fifo (gives |
| 2603 | indication about backpressure) */ | 2643 | indication about backpressure) */ |
| 2604 | #define PXP2_REG_RD_ALMOST_FULL_0 0x120424 | 2644 | #define PXP2_REG_RD_ALMOST_FULL_0 0x120424 |
| @@ -3001,6 +3041,8 @@ | |||
| 3001 | #define PXP_REG_PXP_PRTY_MASK 0x103094 | 3041 | #define PXP_REG_PXP_PRTY_MASK 0x103094 |
| 3002 | /* [R 26] Parity register #0 read */ | 3042 | /* [R 26] Parity register #0 read */ |
| 3003 | #define PXP_REG_PXP_PRTY_STS 0x103088 | 3043 | #define PXP_REG_PXP_PRTY_STS 0x103088 |
| 3044 | /* [RC 27] Parity register #0 read clear */ | ||
| 3045 | #define PXP_REG_PXP_PRTY_STS_CLR 0x10308c | ||
| 3004 | /* [RW 4] The activity counter initial increment value sent in the load | 3046 | /* [RW 4] The activity counter initial increment value sent in the load |
| 3005 | request */ | 3047 | request */ |
| 3006 | #define QM_REG_ACTCTRINITVAL_0 0x168040 | 3048 | #define QM_REG_ACTCTRINITVAL_0 0x168040 |
| @@ -3157,6 +3199,8 @@ | |||
| 3157 | #define QM_REG_QM_PRTY_MASK 0x168454 | 3199 | #define QM_REG_QM_PRTY_MASK 0x168454 |
| 3158 | /* [R 12] Parity register #0 read */ | 3200 | /* [R 12] Parity register #0 read */ |
| 3159 | #define QM_REG_QM_PRTY_STS 0x168448 | 3201 | #define QM_REG_QM_PRTY_STS 0x168448 |
| 3202 | /* [RC 12] Parity register #0 read clear */ | ||
| 3203 | #define QM_REG_QM_PRTY_STS_CLR 0x16844c | ||
| 3160 | /* [R 32] Current queues in pipeline: Queues from 32 to 63 */ | 3204 | /* [R 32] Current queues in pipeline: Queues from 32 to 63 */ |
| 3161 | #define QM_REG_QSTATUS_HIGH 0x16802c | 3205 | #define QM_REG_QSTATUS_HIGH 0x16802c |
| 3162 | /* [R 32] Current queues in pipeline: Queues from 96 to 127 */ | 3206 | /* [R 32] Current queues in pipeline: Queues from 96 to 127 */ |
| @@ -3442,6 +3486,8 @@ | |||
| 3442 | #define QM_REG_WRRWEIGHTS_9 0x168848 | 3486 | #define QM_REG_WRRWEIGHTS_9 0x168848 |
| 3443 | /* [R 6] Keep the fill level of the fifo from write client 1 */ | 3487 | /* [R 6] Keep the fill level of the fifo from write client 1 */ |
| 3444 | #define QM_REG_XQM_WRC_FIFOLVL 0x168000 | 3488 | #define QM_REG_XQM_WRC_FIFOLVL 0x168000 |
| 3489 | /* [W 1] reset to parity interrupt */ | ||
| 3490 | #define SEM_FAST_REG_PARITY_RST 0x18840 | ||
| 3445 | #define SRC_REG_COUNTFREE0 0x40500 | 3491 | #define SRC_REG_COUNTFREE0 0x40500 |
| 3446 | /* [RW 1] If clr the searcher is compatible to E1 A0 - support only two | 3492 | /* [RW 1] If clr the searcher is compatible to E1 A0 - support only two |
| 3447 | ports. If set the searcher support 8 functions. */ | 3493 | ports. If set the searcher support 8 functions. */ |
| @@ -3470,6 +3516,8 @@ | |||
| 3470 | #define SRC_REG_SRC_PRTY_MASK 0x404c8 | 3516 | #define SRC_REG_SRC_PRTY_MASK 0x404c8 |
| 3471 | /* [R 3] Parity register #0 read */ | 3517 | /* [R 3] Parity register #0 read */ |
| 3472 | #define SRC_REG_SRC_PRTY_STS 0x404bc | 3518 | #define SRC_REG_SRC_PRTY_STS 0x404bc |
| 3519 | /* [RC 3] Parity register #0 read clear */ | ||
| 3520 | #define SRC_REG_SRC_PRTY_STS_CLR 0x404c0 | ||
| 3473 | /* [R 4] Used to read the value of the XX protection CAM occupancy counter. */ | 3521 | /* [R 4] Used to read the value of the XX protection CAM occupancy counter. */ |
| 3474 | #define TCM_REG_CAM_OCCUP 0x5017c | 3522 | #define TCM_REG_CAM_OCCUP 0x5017c |
| 3475 | /* [RW 1] CDU AG read Interface enable. If 0 - the request input is | 3523 | /* [RW 1] CDU AG read Interface enable. If 0 - the request input is |
| @@ -3596,8 +3644,12 @@ | |||
| 3596 | #define TCM_REG_TCM_INT_MASK 0x501dc | 3644 | #define TCM_REG_TCM_INT_MASK 0x501dc |
| 3597 | /* [R 11] Interrupt register #0 read */ | 3645 | /* [R 11] Interrupt register #0 read */ |
| 3598 | #define TCM_REG_TCM_INT_STS 0x501d0 | 3646 | #define TCM_REG_TCM_INT_STS 0x501d0 |
| 3647 | /* [RW 27] Parity mask register #0 read/write */ | ||
| 3648 | #define TCM_REG_TCM_PRTY_MASK 0x501ec | ||
| 3599 | /* [R 27] Parity register #0 read */ | 3649 | /* [R 27] Parity register #0 read */ |
| 3600 | #define TCM_REG_TCM_PRTY_STS 0x501e0 | 3650 | #define TCM_REG_TCM_PRTY_STS 0x501e0 |
| 3651 | /* [RC 27] Parity register #0 read clear */ | ||
| 3652 | #define TCM_REG_TCM_PRTY_STS_CLR 0x501e4 | ||
| 3601 | /* [RW 3] The size of AG context region 0 in REG-pairs. Designates the MS | 3653 | /* [RW 3] The size of AG context region 0 in REG-pairs. Designates the MS |
| 3602 | REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). | 3654 | REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). |
| 3603 | Is used to determine the number of the AG context REG-pairs written back; | 3655 | Is used to determine the number of the AG context REG-pairs written back; |
| @@ -3755,6 +3807,10 @@ | |||
| 3755 | #define TM_REG_TM_INT_MASK 0x1640fc | 3807 | #define TM_REG_TM_INT_MASK 0x1640fc |
| 3756 | /* [R 1] Interrupt register #0 read */ | 3808 | /* [R 1] Interrupt register #0 read */ |
| 3757 | #define TM_REG_TM_INT_STS 0x1640f0 | 3809 | #define TM_REG_TM_INT_STS 0x1640f0 |
| 3810 | /* [RW 7] Parity mask register #0 read/write */ | ||
| 3811 | #define TM_REG_TM_PRTY_MASK 0x16410c | ||
| 3812 | /* [RC 7] Parity register #0 read clear */ | ||
| 3813 | #define TM_REG_TM_PRTY_STS_CLR 0x164104 | ||
| 3758 | /* [RW 8] The event id for aggregated interrupt 0 */ | 3814 | /* [RW 8] The event id for aggregated interrupt 0 */ |
| 3759 | #define TSDM_REG_AGG_INT_EVENT_0 0x42038 | 3815 | #define TSDM_REG_AGG_INT_EVENT_0 0x42038 |
| 3760 | #define TSDM_REG_AGG_INT_EVENT_1 0x4203c | 3816 | #define TSDM_REG_AGG_INT_EVENT_1 0x4203c |
| @@ -3835,6 +3891,8 @@ | |||
| 3835 | #define TSDM_REG_TSDM_PRTY_MASK 0x422bc | 3891 | #define TSDM_REG_TSDM_PRTY_MASK 0x422bc |
| 3836 | /* [R 11] Parity register #0 read */ | 3892 | /* [R 11] Parity register #0 read */ |
| 3837 | #define TSDM_REG_TSDM_PRTY_STS 0x422b0 | 3893 | #define TSDM_REG_TSDM_PRTY_STS 0x422b0 |
| 3894 | /* [RC 11] Parity register #0 read clear */ | ||
| 3895 | #define TSDM_REG_TSDM_PRTY_STS_CLR 0x422b4 | ||
| 3838 | /* [RW 5] The number of time_slots in the arbitration cycle */ | 3896 | /* [RW 5] The number of time_slots in the arbitration cycle */ |
| 3839 | #define TSEM_REG_ARB_CYCLE_SIZE 0x180034 | 3897 | #define TSEM_REG_ARB_CYCLE_SIZE 0x180034 |
| 3840 | /* [RW 3] The source that is associated with arbitration element 0. Source | 3898 | /* [RW 3] The source that is associated with arbitration element 0. Source |
| @@ -3914,6 +3972,9 @@ | |||
| 3914 | #define TSEM_REG_SLOW_EXT_STORE_EMPTY 0x1802a0 | 3972 | #define TSEM_REG_SLOW_EXT_STORE_EMPTY 0x1802a0 |
| 3915 | /* [RW 8] List of free threads . There is a bit per thread. */ | 3973 | /* [RW 8] List of free threads . There is a bit per thread. */ |
| 3916 | #define TSEM_REG_THREADS_LIST 0x1802e4 | 3974 | #define TSEM_REG_THREADS_LIST 0x1802e4 |
| 3975 | /* [RC 32] Parity register #0 read clear */ | ||
| 3976 | #define TSEM_REG_TSEM_PRTY_STS_CLR_0 0x180118 | ||
| 3977 | #define TSEM_REG_TSEM_PRTY_STS_CLR_1 0x180128 | ||
| 3917 | /* [RW 3] The arbitration scheme of time_slot 0 */ | 3978 | /* [RW 3] The arbitration scheme of time_slot 0 */ |
| 3918 | #define TSEM_REG_TS_0_AS 0x180038 | 3979 | #define TSEM_REG_TS_0_AS 0x180038 |
| 3919 | /* [RW 3] The arbitration scheme of time_slot 10 */ | 3980 | /* [RW 3] The arbitration scheme of time_slot 10 */ |
| @@ -4116,6 +4177,8 @@ | |||
| 4116 | #define UCM_REG_UCM_INT_STS 0xe01c8 | 4177 | #define UCM_REG_UCM_INT_STS 0xe01c8 |
| 4117 | /* [R 27] Parity register #0 read */ | 4178 | /* [R 27] Parity register #0 read */ |
| 4118 | #define UCM_REG_UCM_PRTY_STS 0xe01d8 | 4179 | #define UCM_REG_UCM_PRTY_STS 0xe01d8 |
| 4180 | /* [RC 27] Parity register #0 read clear */ | ||
| 4181 | #define UCM_REG_UCM_PRTY_STS_CLR 0xe01dc | ||
| 4119 | /* [RW 2] The size of AG context region 0 in REG-pairs. Designates the MS | 4182 | /* [RW 2] The size of AG context region 0 in REG-pairs. Designates the MS |
| 4120 | REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). | 4183 | REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). |
| 4121 | Is used to determine the number of the AG context REG-pairs written back; | 4184 | Is used to determine the number of the AG context REG-pairs written back; |
| @@ -4292,6 +4355,8 @@ | |||
| 4292 | #define USDM_REG_USDM_PRTY_MASK 0xc42c0 | 4355 | #define USDM_REG_USDM_PRTY_MASK 0xc42c0 |
| 4293 | /* [R 11] Parity register #0 read */ | 4356 | /* [R 11] Parity register #0 read */ |
| 4294 | #define USDM_REG_USDM_PRTY_STS 0xc42b4 | 4357 | #define USDM_REG_USDM_PRTY_STS 0xc42b4 |
| 4358 | /* [RC 11] Parity register #0 read clear */ | ||
| 4359 | #define USDM_REG_USDM_PRTY_STS_CLR 0xc42b8 | ||
| 4295 | /* [RW 5] The number of time_slots in the arbitration cycle */ | 4360 | /* [RW 5] The number of time_slots in the arbitration cycle */ |
| 4296 | #define USEM_REG_ARB_CYCLE_SIZE 0x300034 | 4361 | #define USEM_REG_ARB_CYCLE_SIZE 0x300034 |
| 4297 | /* [RW 3] The source that is associated with arbitration element 0. Source | 4362 | /* [RW 3] The source that is associated with arbitration element 0. Source |
| @@ -4421,6 +4486,9 @@ | |||
| 4421 | /* [R 32] Parity register #0 read */ | 4486 | /* [R 32] Parity register #0 read */ |
| 4422 | #define USEM_REG_USEM_PRTY_STS_0 0x300124 | 4487 | #define USEM_REG_USEM_PRTY_STS_0 0x300124 |
| 4423 | #define USEM_REG_USEM_PRTY_STS_1 0x300134 | 4488 | #define USEM_REG_USEM_PRTY_STS_1 0x300134 |
| 4489 | /* [RC 32] Parity register #0 read clear */ | ||
| 4490 | #define USEM_REG_USEM_PRTY_STS_CLR_0 0x300128 | ||
| 4491 | #define USEM_REG_USEM_PRTY_STS_CLR_1 0x300138 | ||
| 4424 | /* [W 7] VF or PF ID for reset error bit. Values 0-63 reset error bit for 64 | 4492 | /* [W 7] VF or PF ID for reset error bit. Values 0-63 reset error bit for 64 |
| 4425 | * VF; values 64-67 reset error for 4 PF; values 68-127 are not valid. */ | 4493 | * VF; values 64-67 reset error for 4 PF; values 68-127 are not valid. */ |
| 4426 | #define USEM_REG_VFPF_ERR_NUM 0x300380 | 4494 | #define USEM_REG_VFPF_ERR_NUM 0x300380 |
| @@ -4797,6 +4865,8 @@ | |||
| 4797 | #define XSDM_REG_XSDM_PRTY_MASK 0x1662bc | 4865 | #define XSDM_REG_XSDM_PRTY_MASK 0x1662bc |
| 4798 | /* [R 11] Parity register #0 read */ | 4866 | /* [R 11] Parity register #0 read */ |
| 4799 | #define XSDM_REG_XSDM_PRTY_STS 0x1662b0 | 4867 | #define XSDM_REG_XSDM_PRTY_STS 0x1662b0 |
| 4868 | /* [RC 11] Parity register #0 read clear */ | ||
| 4869 | #define XSDM_REG_XSDM_PRTY_STS_CLR 0x1662b4 | ||
| 4800 | /* [RW 5] The number of time_slots in the arbitration cycle */ | 4870 | /* [RW 5] The number of time_slots in the arbitration cycle */ |
| 4801 | #define XSEM_REG_ARB_CYCLE_SIZE 0x280034 | 4871 | #define XSEM_REG_ARB_CYCLE_SIZE 0x280034 |
| 4802 | /* [RW 3] The source that is associated with arbitration element 0. Source | 4872 | /* [RW 3] The source that is associated with arbitration element 0. Source |
| @@ -4929,6 +4999,9 @@ | |||
| 4929 | /* [R 32] Parity register #0 read */ | 4999 | /* [R 32] Parity register #0 read */ |
| 4930 | #define XSEM_REG_XSEM_PRTY_STS_0 0x280124 | 5000 | #define XSEM_REG_XSEM_PRTY_STS_0 0x280124 |
| 4931 | #define XSEM_REG_XSEM_PRTY_STS_1 0x280134 | 5001 | #define XSEM_REG_XSEM_PRTY_STS_1 0x280134 |
| 5002 | /* [RC 32] Parity register #0 read clear */ | ||
| 5003 | #define XSEM_REG_XSEM_PRTY_STS_CLR_0 0x280128 | ||
| 5004 | #define XSEM_REG_XSEM_PRTY_STS_CLR_1 0x280138 | ||
| 4932 | #define MCPR_NVM_ACCESS_ENABLE_EN (1L<<0) | 5005 | #define MCPR_NVM_ACCESS_ENABLE_EN (1L<<0) |
| 4933 | #define MCPR_NVM_ACCESS_ENABLE_WR_EN (1L<<1) | 5006 | #define MCPR_NVM_ACCESS_ENABLE_WR_EN (1L<<1) |
| 4934 | #define MCPR_NVM_ADDR_NVM_ADDR_VALUE (0xffffffL<<0) | 5007 | #define MCPR_NVM_ADDR_NVM_ADDR_VALUE (0xffffffL<<0) |
| @@ -6316,3 +6389,4 @@ static inline u8 calc_crc8(u32 data, u8 crc) | |||
| 6316 | } | 6389 | } |
| 6317 | 6390 | ||
| 6318 | 6391 | ||
| 6392 | #endif /* BNX2X_REG_H */ | ||
diff --git a/drivers/net/bnx2x/bnx2x_stats.c b/drivers/net/bnx2x/bnx2x_stats.c index 6e4d9b144cc4..bda60d590fa8 100644 --- a/drivers/net/bnx2x/bnx2x_stats.c +++ b/drivers/net/bnx2x/bnx2x_stats.c | |||
| @@ -158,6 +158,11 @@ static void bnx2x_storm_stats_post(struct bnx2x *bp) | |||
| 158 | 158 | ||
| 159 | spin_lock_bh(&bp->stats_lock); | 159 | spin_lock_bh(&bp->stats_lock); |
| 160 | 160 | ||
| 161 | if (bp->stats_pending) { | ||
| 162 | spin_unlock_bh(&bp->stats_lock); | ||
| 163 | return; | ||
| 164 | } | ||
| 165 | |||
| 161 | ramrod_data.drv_counter = bp->stats_counter++; | 166 | ramrod_data.drv_counter = bp->stats_counter++; |
| 162 | ramrod_data.collect_port = bp->port.pmf ? 1 : 0; | 167 | ramrod_data.collect_port = bp->port.pmf ? 1 : 0; |
| 163 | for_each_eth_queue(bp, i) | 168 | for_each_eth_queue(bp, i) |
diff --git a/drivers/net/cxgb4vf/cxgb4vf_main.c b/drivers/net/cxgb4vf/cxgb4vf_main.c index 3c403f895750..56166ae2059f 100644 --- a/drivers/net/cxgb4vf/cxgb4vf_main.c +++ b/drivers/net/cxgb4vf/cxgb4vf_main.c | |||
| @@ -749,13 +749,19 @@ static int cxgb4vf_open(struct net_device *dev) | |||
| 749 | netif_set_real_num_tx_queues(dev, pi->nqsets); | 749 | netif_set_real_num_tx_queues(dev, pi->nqsets); |
| 750 | err = netif_set_real_num_rx_queues(dev, pi->nqsets); | 750 | err = netif_set_real_num_rx_queues(dev, pi->nqsets); |
| 751 | if (err) | 751 | if (err) |
| 752 | return err; | 752 | goto err_unwind; |
| 753 | set_bit(pi->port_id, &adapter->open_device_map); | ||
| 754 | err = link_start(dev); | 753 | err = link_start(dev); |
| 755 | if (err) | 754 | if (err) |
| 756 | return err; | 755 | goto err_unwind; |
| 756 | |||
| 757 | netif_tx_start_all_queues(dev); | 757 | netif_tx_start_all_queues(dev); |
| 758 | set_bit(pi->port_id, &adapter->open_device_map); | ||
| 758 | return 0; | 759 | return 0; |
| 760 | |||
| 761 | err_unwind: | ||
| 762 | if (adapter->open_device_map == 0) | ||
| 763 | adapter_down(adapter); | ||
| 764 | return err; | ||
| 759 | } | 765 | } |
| 760 | 766 | ||
| 761 | /* | 767 | /* |
| @@ -764,13 +770,12 @@ static int cxgb4vf_open(struct net_device *dev) | |||
| 764 | */ | 770 | */ |
| 765 | static int cxgb4vf_stop(struct net_device *dev) | 771 | static int cxgb4vf_stop(struct net_device *dev) |
| 766 | { | 772 | { |
| 767 | int ret; | ||
| 768 | struct port_info *pi = netdev_priv(dev); | 773 | struct port_info *pi = netdev_priv(dev); |
| 769 | struct adapter *adapter = pi->adapter; | 774 | struct adapter *adapter = pi->adapter; |
| 770 | 775 | ||
| 771 | netif_tx_stop_all_queues(dev); | 776 | netif_tx_stop_all_queues(dev); |
| 772 | netif_carrier_off(dev); | 777 | netif_carrier_off(dev); |
| 773 | ret = t4vf_enable_vi(adapter, pi->viid, false, false); | 778 | t4vf_enable_vi(adapter, pi->viid, false, false); |
| 774 | pi->link_cfg.link_ok = 0; | 779 | pi->link_cfg.link_ok = 0; |
| 775 | 780 | ||
| 776 | clear_bit(pi->port_id, &adapter->open_device_map); | 781 | clear_bit(pi->port_id, &adapter->open_device_map); |
diff --git a/drivers/net/cxgb4vf/t4vf_hw.c b/drivers/net/cxgb4vf/t4vf_hw.c index e4bec78c8e3f..0f51c80475ce 100644 --- a/drivers/net/cxgb4vf/t4vf_hw.c +++ b/drivers/net/cxgb4vf/t4vf_hw.c | |||
| @@ -147,9 +147,20 @@ int t4vf_wr_mbox_core(struct adapter *adapter, const void *cmd, int size, | |||
| 147 | /* | 147 | /* |
| 148 | * Write the command array into the Mailbox Data register array and | 148 | * Write the command array into the Mailbox Data register array and |
| 149 | * transfer ownership of the mailbox to the firmware. | 149 | * transfer ownership of the mailbox to the firmware. |
| 150 | * | ||
| 151 | * For the VFs, the Mailbox Data "registers" are actually backed by | ||
| 152 | * T4's "MA" interface rather than PL Registers (as is the case for | ||
| 153 | * the PFs). Because these are in different coherency domains, the | ||
| 154 | * write to the VF's PL-register-backed Mailbox Control can race in | ||
| 155 | * front of the writes to the MA-backed VF Mailbox Data "registers". | ||
| 156 | * So we need to do a read-back on at least one byte of the VF Mailbox | ||
| 157 | * Data registers before doing the write to the VF Mailbox Control | ||
| 158 | * register. | ||
| 150 | */ | 159 | */ |
| 151 | for (i = 0, p = cmd; i < size; i += 8) | 160 | for (i = 0, p = cmd; i < size; i += 8) |
| 152 | t4_write_reg64(adapter, mbox_data + i, be64_to_cpu(*p++)); | 161 | t4_write_reg64(adapter, mbox_data + i, be64_to_cpu(*p++)); |
| 162 | t4_read_reg(adapter, mbox_data); /* flush write */ | ||
| 163 | |||
| 153 | t4_write_reg(adapter, mbox_ctl, | 164 | t4_write_reg(adapter, mbox_ctl, |
| 154 | MBMSGVALID | MBOWNER(MBOX_OWNER_FW)); | 165 | MBMSGVALID | MBOWNER(MBOX_OWNER_FW)); |
| 155 | t4_read_reg(adapter, mbox_ctl); /* flush write */ | 166 | t4_read_reg(adapter, mbox_ctl); /* flush write */ |
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index 77d08e697b74..aed223b1b897 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c | |||
| @@ -130,10 +130,15 @@ static s32 e1000_set_phy_type(struct e1000_hw *hw) | |||
| 130 | if (hw->mac_type == e1000_82541 || | 130 | if (hw->mac_type == e1000_82541 || |
| 131 | hw->mac_type == e1000_82541_rev_2 || | 131 | hw->mac_type == e1000_82541_rev_2 || |
| 132 | hw->mac_type == e1000_82547 || | 132 | hw->mac_type == e1000_82547 || |
| 133 | hw->mac_type == e1000_82547_rev_2) { | 133 | hw->mac_type == e1000_82547_rev_2) |
| 134 | hw->phy_type = e1000_phy_igp; | 134 | hw->phy_type = e1000_phy_igp; |
| 135 | break; | 135 | break; |
| 136 | } | 136 | case RTL8211B_PHY_ID: |
| 137 | hw->phy_type = e1000_phy_8211; | ||
| 138 | break; | ||
| 139 | case RTL8201N_PHY_ID: | ||
| 140 | hw->phy_type = e1000_phy_8201; | ||
| 141 | break; | ||
| 137 | default: | 142 | default: |
| 138 | /* Should never have loaded on this device */ | 143 | /* Should never have loaded on this device */ |
| 139 | hw->phy_type = e1000_phy_undefined; | 144 | hw->phy_type = e1000_phy_undefined; |
| @@ -318,6 +323,9 @@ s32 e1000_set_mac_type(struct e1000_hw *hw) | |||
| 318 | case E1000_DEV_ID_82547GI: | 323 | case E1000_DEV_ID_82547GI: |
| 319 | hw->mac_type = e1000_82547_rev_2; | 324 | hw->mac_type = e1000_82547_rev_2; |
| 320 | break; | 325 | break; |
| 326 | case E1000_DEV_ID_INTEL_CE4100_GBE: | ||
| 327 | hw->mac_type = e1000_ce4100; | ||
| 328 | break; | ||
| 321 | default: | 329 | default: |
| 322 | /* Should never have loaded on this device */ | 330 | /* Should never have loaded on this device */ |
| 323 | return -E1000_ERR_MAC_TYPE; | 331 | return -E1000_ERR_MAC_TYPE; |
| @@ -372,6 +380,9 @@ void e1000_set_media_type(struct e1000_hw *hw) | |||
| 372 | case e1000_82542_rev2_1: | 380 | case e1000_82542_rev2_1: |
| 373 | hw->media_type = e1000_media_type_fiber; | 381 | hw->media_type = e1000_media_type_fiber; |
| 374 | break; | 382 | break; |
| 383 | case e1000_ce4100: | ||
| 384 | hw->media_type = e1000_media_type_copper; | ||
| 385 | break; | ||
| 375 | default: | 386 | default: |
| 376 | status = er32(STATUS); | 387 | status = er32(STATUS); |
| 377 | if (status & E1000_STATUS_TBIMODE) { | 388 | if (status & E1000_STATUS_TBIMODE) { |
| @@ -460,6 +471,7 @@ s32 e1000_reset_hw(struct e1000_hw *hw) | |||
| 460 | /* Reset is performed on a shadow of the control register */ | 471 | /* Reset is performed on a shadow of the control register */ |
| 461 | ew32(CTRL_DUP, (ctrl | E1000_CTRL_RST)); | 472 | ew32(CTRL_DUP, (ctrl | E1000_CTRL_RST)); |
| 462 | break; | 473 | break; |
| 474 | case e1000_ce4100: | ||
| 463 | default: | 475 | default: |
| 464 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); | 476 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); |
| 465 | break; | 477 | break; |
| @@ -952,6 +964,67 @@ static s32 e1000_setup_fiber_serdes_link(struct e1000_hw *hw) | |||
| 952 | } | 964 | } |
| 953 | 965 | ||
| 954 | /** | 966 | /** |
| 967 | * e1000_copper_link_rtl_setup - Copper link setup for e1000_phy_rtl series. | ||
| 968 | * @hw: Struct containing variables accessed by shared code | ||
| 969 | * | ||
| 970 | * Commits changes to PHY configuration by calling e1000_phy_reset(). | ||
| 971 | */ | ||
| 972 | static s32 e1000_copper_link_rtl_setup(struct e1000_hw *hw) | ||
| 973 | { | ||
| 974 | s32 ret_val; | ||
| 975 | |||
| 976 | /* SW reset the PHY so all changes take effect */ | ||
| 977 | ret_val = e1000_phy_reset(hw); | ||
| 978 | if (ret_val) { | ||
| 979 | e_dbg("Error Resetting the PHY\n"); | ||
| 980 | return ret_val; | ||
| 981 | } | ||
| 982 | |||
| 983 | return E1000_SUCCESS; | ||
| 984 | } | ||
| 985 | |||
| 986 | static s32 gbe_dhg_phy_setup(struct e1000_hw *hw) | ||
| 987 | { | ||
| 988 | s32 ret_val; | ||
| 989 | u32 ctrl_aux; | ||
| 990 | |||
| 991 | switch (hw->phy_type) { | ||
| 992 | case e1000_phy_8211: | ||
| 993 | ret_val = e1000_copper_link_rtl_setup(hw); | ||
| 994 | if (ret_val) { | ||
| 995 | e_dbg("e1000_copper_link_rtl_setup failed!\n"); | ||
| 996 | return ret_val; | ||
| 997 | } | ||
| 998 | break; | ||
| 999 | case e1000_phy_8201: | ||
| 1000 | /* Set RMII mode */ | ||
| 1001 | ctrl_aux = er32(CTL_AUX); | ||
| 1002 | ctrl_aux |= E1000_CTL_AUX_RMII; | ||
| 1003 | ew32(CTL_AUX, ctrl_aux); | ||
| 1004 | E1000_WRITE_FLUSH(); | ||
| 1005 | |||
| 1006 | /* Disable the J/K bits required for receive */ | ||
| 1007 | ctrl_aux = er32(CTL_AUX); | ||
| 1008 | ctrl_aux |= 0x4; | ||
| 1009 | ctrl_aux &= ~0x2; | ||
| 1010 | ew32(CTL_AUX, ctrl_aux); | ||
| 1011 | E1000_WRITE_FLUSH(); | ||
| 1012 | ret_val = e1000_copper_link_rtl_setup(hw); | ||
| 1013 | |||
| 1014 | if (ret_val) { | ||
| 1015 | e_dbg("e1000_copper_link_rtl_setup failed!\n"); | ||
| 1016 | return ret_val; | ||
| 1017 | } | ||
| 1018 | break; | ||
| 1019 | default: | ||
| 1020 | e_dbg("Error Resetting the PHY\n"); | ||
| 1021 | return E1000_ERR_PHY_TYPE; | ||
| 1022 | } | ||
| 1023 | |||
| 1024 | return E1000_SUCCESS; | ||
| 1025 | } | ||
| 1026 | |||
| 1027 | /** | ||
| 955 | * e1000_copper_link_preconfig - early configuration for copper | 1028 | * e1000_copper_link_preconfig - early configuration for copper |
| 956 | * @hw: Struct containing variables accessed by shared code | 1029 | * @hw: Struct containing variables accessed by shared code |
| 957 | * | 1030 | * |
| @@ -1286,6 +1359,10 @@ static s32 e1000_copper_link_autoneg(struct e1000_hw *hw) | |||
| 1286 | if (hw->autoneg_advertised == 0) | 1359 | if (hw->autoneg_advertised == 0) |
| 1287 | hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT; | 1360 | hw->autoneg_advertised = AUTONEG_ADVERTISE_SPEED_DEFAULT; |
| 1288 | 1361 | ||
| 1362 | /* IFE/RTL8201N PHY only supports 10/100 */ | ||
| 1363 | if (hw->phy_type == e1000_phy_8201) | ||
| 1364 | hw->autoneg_advertised &= AUTONEG_ADVERTISE_10_100_ALL; | ||
| 1365 | |||
| 1289 | e_dbg("Reconfiguring auto-neg advertisement params\n"); | 1366 | e_dbg("Reconfiguring auto-neg advertisement params\n"); |
| 1290 | ret_val = e1000_phy_setup_autoneg(hw); | 1367 | ret_val = e1000_phy_setup_autoneg(hw); |
| 1291 | if (ret_val) { | 1368 | if (ret_val) { |
| @@ -1341,7 +1418,7 @@ static s32 e1000_copper_link_postconfig(struct e1000_hw *hw) | |||
| 1341 | s32 ret_val; | 1418 | s32 ret_val; |
| 1342 | e_dbg("e1000_copper_link_postconfig"); | 1419 | e_dbg("e1000_copper_link_postconfig"); |
| 1343 | 1420 | ||
| 1344 | if (hw->mac_type >= e1000_82544) { | 1421 | if ((hw->mac_type >= e1000_82544) && (hw->mac_type != e1000_ce4100)) { |
| 1345 | e1000_config_collision_dist(hw); | 1422 | e1000_config_collision_dist(hw); |
| 1346 | } else { | 1423 | } else { |
| 1347 | ret_val = e1000_config_mac_to_phy(hw); | 1424 | ret_val = e1000_config_mac_to_phy(hw); |
| @@ -1395,6 +1472,12 @@ static s32 e1000_setup_copper_link(struct e1000_hw *hw) | |||
| 1395 | ret_val = e1000_copper_link_mgp_setup(hw); | 1472 | ret_val = e1000_copper_link_mgp_setup(hw); |
| 1396 | if (ret_val) | 1473 | if (ret_val) |
| 1397 | return ret_val; | 1474 | return ret_val; |
| 1475 | } else { | ||
| 1476 | ret_val = gbe_dhg_phy_setup(hw); | ||
| 1477 | if (ret_val) { | ||
| 1478 | e_dbg("gbe_dhg_phy_setup failed!\n"); | ||
| 1479 | return ret_val; | ||
| 1480 | } | ||
| 1398 | } | 1481 | } |
| 1399 | 1482 | ||
| 1400 | if (hw->autoneg) { | 1483 | if (hw->autoneg) { |
| @@ -1461,10 +1544,11 @@ s32 e1000_phy_setup_autoneg(struct e1000_hw *hw) | |||
| 1461 | return ret_val; | 1544 | return ret_val; |
| 1462 | 1545 | ||
| 1463 | /* Read the MII 1000Base-T Control Register (Address 9). */ | 1546 | /* Read the MII 1000Base-T Control Register (Address 9). */ |
| 1464 | ret_val = | 1547 | ret_val = e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg); |
| 1465 | e1000_read_phy_reg(hw, PHY_1000T_CTRL, &mii_1000t_ctrl_reg); | ||
| 1466 | if (ret_val) | 1548 | if (ret_val) |
| 1467 | return ret_val; | 1549 | return ret_val; |
| 1550 | else if (hw->phy_type == e1000_phy_8201) | ||
| 1551 | mii_1000t_ctrl_reg &= ~REG9_SPEED_MASK; | ||
| 1468 | 1552 | ||
| 1469 | /* Need to parse both autoneg_advertised and fc and set up | 1553 | /* Need to parse both autoneg_advertised and fc and set up |
| 1470 | * the appropriate PHY registers. First we will parse for | 1554 | * the appropriate PHY registers. First we will parse for |
| @@ -1577,9 +1661,14 @@ s32 e1000_phy_setup_autoneg(struct e1000_hw *hw) | |||
| 1577 | 1661 | ||
| 1578 | e_dbg("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); | 1662 | e_dbg("Auto-Neg Advertising %x\n", mii_autoneg_adv_reg); |
| 1579 | 1663 | ||
| 1580 | ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, mii_1000t_ctrl_reg); | 1664 | if (hw->phy_type == e1000_phy_8201) { |
| 1581 | if (ret_val) | 1665 | mii_1000t_ctrl_reg = 0; |
| 1582 | return ret_val; | 1666 | } else { |
| 1667 | ret_val = e1000_write_phy_reg(hw, PHY_1000T_CTRL, | ||
| 1668 | mii_1000t_ctrl_reg); | ||
| 1669 | if (ret_val) | ||
| 1670 | return ret_val; | ||
| 1671 | } | ||
| 1583 | 1672 | ||
| 1584 | return E1000_SUCCESS; | 1673 | return E1000_SUCCESS; |
| 1585 | } | 1674 | } |
| @@ -1860,7 +1949,7 @@ static s32 e1000_config_mac_to_phy(struct e1000_hw *hw) | |||
| 1860 | 1949 | ||
| 1861 | /* 82544 or newer MAC, Auto Speed Detection takes care of | 1950 | /* 82544 or newer MAC, Auto Speed Detection takes care of |
| 1862 | * MAC speed/duplex configuration.*/ | 1951 | * MAC speed/duplex configuration.*/ |
| 1863 | if (hw->mac_type >= e1000_82544) | 1952 | if ((hw->mac_type >= e1000_82544) && (hw->mac_type != e1000_ce4100)) |
| 1864 | return E1000_SUCCESS; | 1953 | return E1000_SUCCESS; |
| 1865 | 1954 | ||
| 1866 | /* Read the Device Control Register and set the bits to Force Speed | 1955 | /* 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) | |||
| 1870 | ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); | 1959 | ctrl |= (E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX); |
| 1871 | ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS); | 1960 | ctrl &= ~(E1000_CTRL_SPD_SEL | E1000_CTRL_ILOS); |
| 1872 | 1961 | ||
| 1873 | /* Set up duplex in the Device Control and Transmit Control | 1962 | switch (hw->phy_type) { |
| 1874 | * registers depending on negotiated values. | 1963 | case e1000_phy_8201: |
| 1875 | */ | 1964 | ret_val = e1000_read_phy_reg(hw, PHY_CTRL, &phy_data); |
| 1876 | ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); | 1965 | if (ret_val) |
| 1877 | if (ret_val) | 1966 | return ret_val; |
| 1878 | return ret_val; | ||
| 1879 | 1967 | ||
| 1880 | if (phy_data & M88E1000_PSSR_DPLX) | 1968 | if (phy_data & RTL_PHY_CTRL_FD) |
| 1881 | ctrl |= E1000_CTRL_FD; | 1969 | ctrl |= E1000_CTRL_FD; |
| 1882 | else | 1970 | else |
| 1883 | ctrl &= ~E1000_CTRL_FD; | 1971 | ctrl &= ~E1000_CTRL_FD; |
| 1884 | 1972 | ||
| 1885 | e1000_config_collision_dist(hw); | 1973 | if (phy_data & RTL_PHY_CTRL_SPD_100) |
| 1974 | ctrl |= E1000_CTRL_SPD_100; | ||
| 1975 | else | ||
| 1976 | ctrl |= E1000_CTRL_SPD_10; | ||
| 1886 | 1977 | ||
| 1887 | /* Set up speed in the Device Control register depending on | 1978 | e1000_config_collision_dist(hw); |
| 1888 | * negotiated values. | 1979 | break; |
| 1889 | */ | 1980 | default: |
| 1890 | if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) | 1981 | /* Set up duplex in the Device Control and Transmit Control |
| 1891 | ctrl |= E1000_CTRL_SPD_1000; | 1982 | * registers depending on negotiated values. |
| 1892 | else if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_100MBS) | 1983 | */ |
| 1893 | ctrl |= E1000_CTRL_SPD_100; | 1984 | ret_val = e1000_read_phy_reg(hw, M88E1000_PHY_SPEC_STATUS, |
| 1985 | &phy_data); | ||
| 1986 | if (ret_val) | ||
| 1987 | return ret_val; | ||
| 1988 | |||
| 1989 | if (phy_data & M88E1000_PSSR_DPLX) | ||
| 1990 | ctrl |= E1000_CTRL_FD; | ||
| 1991 | else | ||
| 1992 | ctrl &= ~E1000_CTRL_FD; | ||
| 1993 | |||
| 1994 | e1000_config_collision_dist(hw); | ||
| 1995 | |||
| 1996 | /* Set up speed in the Device Control register depending on | ||
| 1997 | * negotiated values. | ||
| 1998 | */ | ||
| 1999 | if ((phy_data & M88E1000_PSSR_SPEED) == M88E1000_PSSR_1000MBS) | ||
| 2000 | ctrl |= E1000_CTRL_SPD_1000; | ||
| 2001 | else if ((phy_data & M88E1000_PSSR_SPEED) == | ||
| 2002 | M88E1000_PSSR_100MBS) | ||
| 2003 | ctrl |= E1000_CTRL_SPD_100; | ||
| 2004 | } | ||
| 1894 | 2005 | ||
| 1895 | /* Write the configured values back to the Device Control Reg. */ | 2006 | /* Write the configured values back to the Device Control Reg. */ |
| 1896 | ew32(CTRL, ctrl); | 2007 | ew32(CTRL, ctrl); |
| @@ -2401,7 +2512,8 @@ s32 e1000_check_for_link(struct e1000_hw *hw) | |||
| 2401 | * speed/duplex on the MAC to the current PHY speed/duplex | 2512 | * speed/duplex on the MAC to the current PHY speed/duplex |
| 2402 | * settings. | 2513 | * settings. |
| 2403 | */ | 2514 | */ |
| 2404 | if (hw->mac_type >= e1000_82544) | 2515 | if ((hw->mac_type >= e1000_82544) && |
| 2516 | (hw->mac_type != e1000_ce4100)) | ||
| 2405 | e1000_config_collision_dist(hw); | 2517 | e1000_config_collision_dist(hw); |
| 2406 | else { | 2518 | else { |
| 2407 | ret_val = e1000_config_mac_to_phy(hw); | 2519 | 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, | |||
| 2738 | { | 2850 | { |
| 2739 | u32 i; | 2851 | u32 i; |
| 2740 | u32 mdic = 0; | 2852 | u32 mdic = 0; |
| 2741 | const u32 phy_addr = 1; | 2853 | const u32 phy_addr = (hw->mac_type == e1000_ce4100) ? hw->phy_addr : 1; |
| 2742 | 2854 | ||
| 2743 | e_dbg("e1000_read_phy_reg_ex"); | 2855 | e_dbg("e1000_read_phy_reg_ex"); |
| 2744 | 2856 | ||
| @@ -2752,28 +2864,61 @@ static s32 e1000_read_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr, | |||
| 2752 | * Control register. The MAC will take care of interfacing with the | 2864 | * Control register. The MAC will take care of interfacing with the |
| 2753 | * PHY to retrieve the desired data. | 2865 | * PHY to retrieve the desired data. |
| 2754 | */ | 2866 | */ |
| 2755 | mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) | | 2867 | if (hw->mac_type == e1000_ce4100) { |
| 2756 | (phy_addr << E1000_MDIC_PHY_SHIFT) | | 2868 | mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) | |
| 2757 | (E1000_MDIC_OP_READ)); | 2869 | (phy_addr << E1000_MDIC_PHY_SHIFT) | |
| 2870 | (INTEL_CE_GBE_MDIC_OP_READ) | | ||
| 2871 | (INTEL_CE_GBE_MDIC_GO)); | ||
| 2758 | 2872 | ||
| 2759 | ew32(MDIC, mdic); | 2873 | writel(mdic, E1000_MDIO_CMD); |
| 2760 | 2874 | ||
| 2761 | /* Poll the ready bit to see if the MDI read completed */ | 2875 | /* Poll the ready bit to see if the MDI read |
| 2762 | for (i = 0; i < 64; i++) { | 2876 | * completed |
| 2763 | udelay(50); | 2877 | */ |
| 2764 | mdic = er32(MDIC); | 2878 | for (i = 0; i < 64; i++) { |
| 2765 | if (mdic & E1000_MDIC_READY) | 2879 | udelay(50); |
| 2766 | break; | 2880 | mdic = readl(E1000_MDIO_CMD); |
| 2767 | } | 2881 | if (!(mdic & INTEL_CE_GBE_MDIC_GO)) |
| 2768 | if (!(mdic & E1000_MDIC_READY)) { | 2882 | break; |
| 2769 | e_dbg("MDI Read did not complete\n"); | 2883 | } |
| 2770 | return -E1000_ERR_PHY; | 2884 | |
| 2771 | } | 2885 | if (mdic & INTEL_CE_GBE_MDIC_GO) { |
| 2772 | if (mdic & E1000_MDIC_ERROR) { | 2886 | e_dbg("MDI Read did not complete\n"); |
| 2773 | e_dbg("MDI Error\n"); | 2887 | return -E1000_ERR_PHY; |
| 2774 | return -E1000_ERR_PHY; | 2888 | } |
| 2889 | |||
| 2890 | mdic = readl(E1000_MDIO_STS); | ||
| 2891 | if (mdic & INTEL_CE_GBE_MDIC_READ_ERROR) { | ||
| 2892 | e_dbg("MDI Read Error\n"); | ||
| 2893 | return -E1000_ERR_PHY; | ||
| 2894 | } | ||
| 2895 | *phy_data = (u16) mdic; | ||
| 2896 | } else { | ||
| 2897 | mdic = ((reg_addr << E1000_MDIC_REG_SHIFT) | | ||
| 2898 | (phy_addr << E1000_MDIC_PHY_SHIFT) | | ||
| 2899 | (E1000_MDIC_OP_READ)); | ||
| 2900 | |||
| 2901 | ew32(MDIC, mdic); | ||
| 2902 | |||
| 2903 | /* Poll the ready bit to see if the MDI read | ||
| 2904 | * completed | ||
| 2905 | */ | ||
| 2906 | for (i = 0; i < 64; i++) { | ||
| 2907 | udelay(50); | ||
| 2908 | mdic = er32(MDIC); | ||
| 2909 | if (mdic & E1000_MDIC_READY) | ||
| 2910 | break; | ||
| 2911 | } | ||
| 2912 | if (!(mdic & E1000_MDIC_READY)) { | ||
| 2913 | e_dbg("MDI Read did not complete\n"); | ||
| 2914 | return -E1000_ERR_PHY; | ||
| 2915 | } | ||
| 2916 | if (mdic & E1000_MDIC_ERROR) { | ||
| 2917 | e_dbg("MDI Error\n"); | ||
| 2918 | return -E1000_ERR_PHY; | ||
| 2919 | } | ||
| 2920 | *phy_data = (u16) mdic; | ||
| 2775 | } | 2921 | } |
| 2776 | *phy_data = (u16) mdic; | ||
| 2777 | } else { | 2922 | } else { |
| 2778 | /* We must first send a preamble through the MDIO pin to signal the | 2923 | /* We must first send a preamble through the MDIO pin to signal the |
| 2779 | * beginning of an MII instruction. This is done by sending 32 | 2924 | * 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, | |||
| 2840 | { | 2985 | { |
| 2841 | u32 i; | 2986 | u32 i; |
| 2842 | u32 mdic = 0; | 2987 | u32 mdic = 0; |
| 2843 | const u32 phy_addr = 1; | 2988 | const u32 phy_addr = (hw->mac_type == e1000_ce4100) ? hw->phy_addr : 1; |
| 2844 | 2989 | ||
| 2845 | e_dbg("e1000_write_phy_reg_ex"); | 2990 | e_dbg("e1000_write_phy_reg_ex"); |
| 2846 | 2991 | ||
| @@ -2850,27 +2995,54 @@ static s32 e1000_write_phy_reg_ex(struct e1000_hw *hw, u32 reg_addr, | |||
| 2850 | } | 2995 | } |
| 2851 | 2996 | ||
| 2852 | if (hw->mac_type > e1000_82543) { | 2997 | if (hw->mac_type > e1000_82543) { |
| 2853 | /* Set up Op-code, Phy Address, register address, and data intended | 2998 | /* Set up Op-code, Phy Address, register address, and data |
| 2854 | * for the PHY register in the MDI Control register. The MAC will take | 2999 | * intended for the PHY register in the MDI Control register. |
| 2855 | * care of interfacing with the PHY to send the desired data. | 3000 | * The MAC will take care of interfacing with the PHY to send |
| 3001 | * the desired data. | ||
| 2856 | */ | 3002 | */ |
| 2857 | mdic = (((u32) phy_data) | | 3003 | if (hw->mac_type == e1000_ce4100) { |
| 2858 | (reg_addr << E1000_MDIC_REG_SHIFT) | | 3004 | mdic = (((u32) phy_data) | |
| 2859 | (phy_addr << E1000_MDIC_PHY_SHIFT) | | 3005 | (reg_addr << E1000_MDIC_REG_SHIFT) | |
| 2860 | (E1000_MDIC_OP_WRITE)); | 3006 | (phy_addr << E1000_MDIC_PHY_SHIFT) | |
| 3007 | (INTEL_CE_GBE_MDIC_OP_WRITE) | | ||
| 3008 | (INTEL_CE_GBE_MDIC_GO)); | ||
| 2861 | 3009 | ||
| 2862 | ew32(MDIC, mdic); | 3010 | writel(mdic, E1000_MDIO_CMD); |
| 2863 | 3011 | ||
| 2864 | /* Poll the ready bit to see if the MDI read completed */ | 3012 | /* Poll the ready bit to see if the MDI read |
| 2865 | for (i = 0; i < 641; i++) { | 3013 | * completed |
| 2866 | udelay(5); | 3014 | */ |
| 2867 | mdic = er32(MDIC); | 3015 | for (i = 0; i < 640; i++) { |
| 2868 | if (mdic & E1000_MDIC_READY) | 3016 | udelay(5); |
| 2869 | break; | 3017 | mdic = readl(E1000_MDIO_CMD); |
| 2870 | } | 3018 | if (!(mdic & INTEL_CE_GBE_MDIC_GO)) |
| 2871 | if (!(mdic & E1000_MDIC_READY)) { | 3019 | break; |
| 2872 | e_dbg("MDI Write did not complete\n"); | 3020 | } |
| 2873 | return -E1000_ERR_PHY; | 3021 | if (mdic & INTEL_CE_GBE_MDIC_GO) { |
| 3022 | e_dbg("MDI Write did not complete\n"); | ||
| 3023 | return -E1000_ERR_PHY; | ||
| 3024 | } | ||
| 3025 | } else { | ||
| 3026 | mdic = (((u32) phy_data) | | ||
| 3027 | (reg_addr << E1000_MDIC_REG_SHIFT) | | ||
| 3028 | (phy_addr << E1000_MDIC_PHY_SHIFT) | | ||
| 3029 | (E1000_MDIC_OP_WRITE)); | ||
| 3030 | |||
| 3031 | ew32(MDIC, mdic); | ||
| 3032 | |||
| 3033 | /* Poll the ready bit to see if the MDI read | ||
| 3034 | * completed | ||
| 3035 | */ | ||
| 3036 | for (i = 0; i < 641; i++) { | ||
| 3037 | udelay(5); | ||
| 3038 | mdic = er32(MDIC); | ||
| 3039 | if (mdic & E1000_MDIC_READY) | ||
| 3040 | break; | ||
| 3041 | } | ||
| 3042 | if (!(mdic & E1000_MDIC_READY)) { | ||
| 3043 | e_dbg("MDI Write did not complete\n"); | ||
| 3044 | return -E1000_ERR_PHY; | ||
| 3045 | } | ||
| 2874 | } | 3046 | } |
| 2875 | } else { | 3047 | } else { |
| 2876 | /* We'll need to use the SW defined pins to shift the write command | 3048 | /* 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) | |||
| 3048 | if (hw->phy_id == M88E1011_I_PHY_ID) | 3220 | if (hw->phy_id == M88E1011_I_PHY_ID) |
| 3049 | match = true; | 3221 | match = true; |
| 3050 | break; | 3222 | break; |
| 3223 | case e1000_ce4100: | ||
| 3224 | if ((hw->phy_id == RTL8211B_PHY_ID) || | ||
| 3225 | (hw->phy_id == RTL8201N_PHY_ID)) | ||
| 3226 | match = true; | ||
| 3227 | break; | ||
| 3051 | case e1000_82541: | 3228 | case e1000_82541: |
| 3052 | case e1000_82541_rev_2: | 3229 | case e1000_82541_rev_2: |
| 3053 | case e1000_82547: | 3230 | case e1000_82547: |
| @@ -3291,6 +3468,9 @@ s32 e1000_phy_get_info(struct e1000_hw *hw, struct e1000_phy_info *phy_info) | |||
| 3291 | 3468 | ||
| 3292 | if (hw->phy_type == e1000_phy_igp) | 3469 | if (hw->phy_type == e1000_phy_igp) |
| 3293 | return e1000_phy_igp_get_info(hw, phy_info); | 3470 | return e1000_phy_igp_get_info(hw, phy_info); |
| 3471 | else if ((hw->phy_type == e1000_phy_8211) || | ||
| 3472 | (hw->phy_type == e1000_phy_8201)) | ||
| 3473 | return E1000_SUCCESS; | ||
| 3294 | else | 3474 | else |
| 3295 | return e1000_phy_m88_get_info(hw, phy_info); | 3475 | return e1000_phy_m88_get_info(hw, phy_info); |
| 3296 | } | 3476 | } |
| @@ -3742,6 +3922,12 @@ static s32 e1000_do_read_eeprom(struct e1000_hw *hw, u16 offset, u16 words, | |||
| 3742 | 3922 | ||
| 3743 | e_dbg("e1000_read_eeprom"); | 3923 | e_dbg("e1000_read_eeprom"); |
| 3744 | 3924 | ||
| 3925 | if (hw->mac_type == e1000_ce4100) { | ||
| 3926 | GBE_CONFIG_FLASH_READ(GBE_CONFIG_BASE_VIRT, offset, words, | ||
| 3927 | data); | ||
| 3928 | return E1000_SUCCESS; | ||
| 3929 | } | ||
| 3930 | |||
| 3745 | /* If eeprom is not yet detected, do so now */ | 3931 | /* If eeprom is not yet detected, do so now */ |
| 3746 | if (eeprom->word_size == 0) | 3932 | if (eeprom->word_size == 0) |
| 3747 | e1000_init_eeprom_params(hw); | 3933 | e1000_init_eeprom_params(hw); |
| @@ -3904,6 +4090,12 @@ static s32 e1000_do_write_eeprom(struct e1000_hw *hw, u16 offset, u16 words, | |||
| 3904 | 4090 | ||
| 3905 | e_dbg("e1000_write_eeprom"); | 4091 | e_dbg("e1000_write_eeprom"); |
| 3906 | 4092 | ||
| 4093 | if (hw->mac_type == e1000_ce4100) { | ||
| 4094 | GBE_CONFIG_FLASH_WRITE(GBE_CONFIG_BASE_VIRT, offset, words, | ||
| 4095 | data); | ||
| 4096 | return E1000_SUCCESS; | ||
| 4097 | } | ||
| 4098 | |||
| 3907 | /* If eeprom is not yet detected, do so now */ | 4099 | /* If eeprom is not yet detected, do so now */ |
| 3908 | if (eeprom->word_size == 0) | 4100 | if (eeprom->word_size == 0) |
| 3909 | e1000_init_eeprom_params(hw); | 4101 | e1000_init_eeprom_params(hw); |
diff --git a/drivers/net/e1000/e1000_hw.h b/drivers/net/e1000/e1000_hw.h index ecd9f6c6bcd5..f5514a0d5be6 100644 --- a/drivers/net/e1000/e1000_hw.h +++ b/drivers/net/e1000/e1000_hw.h | |||
| @@ -52,6 +52,7 @@ typedef enum { | |||
| 52 | e1000_82545, | 52 | e1000_82545, |
| 53 | e1000_82545_rev_3, | 53 | e1000_82545_rev_3, |
| 54 | e1000_82546, | 54 | e1000_82546, |
| 55 | e1000_ce4100, | ||
| 55 | e1000_82546_rev_3, | 56 | e1000_82546_rev_3, |
| 56 | e1000_82541, | 57 | e1000_82541, |
| 57 | e1000_82541_rev_2, | 58 | e1000_82541_rev_2, |
| @@ -209,9 +210,11 @@ typedef enum { | |||
| 209 | } e1000_1000t_rx_status; | 210 | } e1000_1000t_rx_status; |
| 210 | 211 | ||
| 211 | typedef enum { | 212 | typedef enum { |
| 212 | e1000_phy_m88 = 0, | 213 | e1000_phy_m88 = 0, |
| 213 | e1000_phy_igp, | 214 | e1000_phy_igp, |
| 214 | e1000_phy_undefined = 0xFF | 215 | e1000_phy_8211, |
| 216 | e1000_phy_8201, | ||
| 217 | e1000_phy_undefined = 0xFF | ||
| 215 | } e1000_phy_type; | 218 | } e1000_phy_type; |
| 216 | 219 | ||
| 217 | typedef enum { | 220 | typedef enum { |
| @@ -442,6 +445,7 @@ void e1000_io_write(struct e1000_hw *hw, unsigned long port, u32 value); | |||
| 442 | #define E1000_DEV_ID_82547EI 0x1019 | 445 | #define E1000_DEV_ID_82547EI 0x1019 |
| 443 | #define E1000_DEV_ID_82547EI_MOBILE 0x101A | 446 | #define E1000_DEV_ID_82547EI_MOBILE 0x101A |
| 444 | #define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5 | 447 | #define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5 |
| 448 | #define E1000_DEV_ID_INTEL_CE4100_GBE 0x2E6E | ||
| 445 | 449 | ||
| 446 | #define NODE_ADDRESS_SIZE 6 | 450 | #define NODE_ADDRESS_SIZE 6 |
| 447 | #define ETH_LENGTH_OF_ADDRESS 6 | 451 | #define ETH_LENGTH_OF_ADDRESS 6 |
| @@ -808,6 +812,16 @@ struct e1000_ffvt_entry { | |||
| 808 | #define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */ | 812 | #define E1000_CTRL_EXT 0x00018 /* Extended Device Control - RW */ |
| 809 | #define E1000_FLA 0x0001C /* Flash Access - RW */ | 813 | #define E1000_FLA 0x0001C /* Flash Access - RW */ |
| 810 | #define E1000_MDIC 0x00020 /* MDI Control - RW */ | 814 | #define E1000_MDIC 0x00020 /* MDI Control - RW */ |
| 815 | |||
| 816 | extern void __iomem *ce4100_gbe_mdio_base_virt; | ||
| 817 | #define INTEL_CE_GBE_MDIO_RCOMP_BASE (ce4100_gbe_mdio_base_virt) | ||
| 818 | #define E1000_MDIO_STS (INTEL_CE_GBE_MDIO_RCOMP_BASE + 0) | ||
| 819 | #define E1000_MDIO_CMD (INTEL_CE_GBE_MDIO_RCOMP_BASE + 4) | ||
| 820 | #define E1000_MDIO_DRV (INTEL_CE_GBE_MDIO_RCOMP_BASE + 8) | ||
| 821 | #define E1000_MDC_CMD (INTEL_CE_GBE_MDIO_RCOMP_BASE + 0xC) | ||
| 822 | #define E1000_RCOMP_CTL (INTEL_CE_GBE_MDIO_RCOMP_BASE + 0x20) | ||
| 823 | #define E1000_RCOMP_STS (INTEL_CE_GBE_MDIO_RCOMP_BASE + 0x24) | ||
| 824 | |||
| 811 | #define E1000_SCTL 0x00024 /* SerDes Control - RW */ | 825 | #define E1000_SCTL 0x00024 /* SerDes Control - RW */ |
| 812 | #define E1000_FEXTNVM 0x00028 /* Future Extended NVM register */ | 826 | #define E1000_FEXTNVM 0x00028 /* Future Extended NVM register */ |
| 813 | #define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ | 827 | #define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ |
| @@ -820,6 +834,34 @@ struct e1000_ffvt_entry { | |||
| 820 | #define E1000_IMS 0x000D0 /* Interrupt Mask Set - RW */ | 834 | #define E1000_IMS 0x000D0 /* Interrupt Mask Set - RW */ |
| 821 | #define E1000_IMC 0x000D8 /* Interrupt Mask Clear - WO */ | 835 | #define E1000_IMC 0x000D8 /* Interrupt Mask Clear - WO */ |
| 822 | #define E1000_IAM 0x000E0 /* Interrupt Acknowledge Auto Mask */ | 836 | #define E1000_IAM 0x000E0 /* Interrupt Acknowledge Auto Mask */ |
| 837 | |||
| 838 | /* Auxiliary Control Register. This register is CE4100 specific, | ||
| 839 | * RMII/RGMII function is switched by this register - RW | ||
| 840 | * Following are bits definitions of the Auxiliary Control Register | ||
| 841 | */ | ||
| 842 | #define E1000_CTL_AUX 0x000E0 | ||
| 843 | #define E1000_CTL_AUX_END_SEL_SHIFT 10 | ||
| 844 | #define E1000_CTL_AUX_ENDIANESS_SHIFT 8 | ||
| 845 | #define E1000_CTL_AUX_RGMII_RMII_SHIFT 0 | ||
| 846 | |||
| 847 | /* descriptor and packet transfer use CTL_AUX.ENDIANESS */ | ||
| 848 | #define E1000_CTL_AUX_DES_PKT (0x0 << E1000_CTL_AUX_END_SEL_SHIFT) | ||
| 849 | /* descriptor use CTL_AUX.ENDIANESS, packet use default */ | ||
| 850 | #define E1000_CTL_AUX_DES (0x1 << E1000_CTL_AUX_END_SEL_SHIFT) | ||
| 851 | /* descriptor use default, packet use CTL_AUX.ENDIANESS */ | ||
| 852 | #define E1000_CTL_AUX_PKT (0x2 << E1000_CTL_AUX_END_SEL_SHIFT) | ||
| 853 | /* all use CTL_AUX.ENDIANESS */ | ||
| 854 | #define E1000_CTL_AUX_ALL (0x3 << E1000_CTL_AUX_END_SEL_SHIFT) | ||
| 855 | |||
| 856 | #define E1000_CTL_AUX_RGMII (0x0 << E1000_CTL_AUX_RGMII_RMII_SHIFT) | ||
| 857 | #define E1000_CTL_AUX_RMII (0x1 << E1000_CTL_AUX_RGMII_RMII_SHIFT) | ||
| 858 | |||
| 859 | /* LW little endian, Byte big endian */ | ||
| 860 | #define E1000_CTL_AUX_LWLE_BBE (0x0 << E1000_CTL_AUX_ENDIANESS_SHIFT) | ||
| 861 | #define E1000_CTL_AUX_LWLE_BLE (0x1 << E1000_CTL_AUX_ENDIANESS_SHIFT) | ||
| 862 | #define E1000_CTL_AUX_LWBE_BBE (0x2 << E1000_CTL_AUX_ENDIANESS_SHIFT) | ||
| 863 | #define E1000_CTL_AUX_LWBE_BLE (0x3 << E1000_CTL_AUX_ENDIANESS_SHIFT) | ||
| 864 | |||
| 823 | #define E1000_RCTL 0x00100 /* RX Control - RW */ | 865 | #define E1000_RCTL 0x00100 /* RX Control - RW */ |
| 824 | #define E1000_RDTR1 0x02820 /* RX Delay Timer (1) - RW */ | 866 | #define E1000_RDTR1 0x02820 /* RX Delay Timer (1) - RW */ |
| 825 | #define E1000_RDBAL1 0x02900 /* RX Descriptor Base Address Low (1) - RW */ | 867 | #define E1000_RDBAL1 0x02900 /* RX Descriptor Base Address Low (1) - RW */ |
| @@ -1011,6 +1053,7 @@ struct e1000_ffvt_entry { | |||
| 1011 | * in more current versions of the 8254x. Despite the difference in location, | 1053 | * in more current versions of the 8254x. Despite the difference in location, |
| 1012 | * the registers function in the same manner. | 1054 | * the registers function in the same manner. |
| 1013 | */ | 1055 | */ |
| 1056 | #define E1000_82542_CTL_AUX E1000_CTL_AUX | ||
| 1014 | #define E1000_82542_CTRL E1000_CTRL | 1057 | #define E1000_82542_CTRL E1000_CTRL |
| 1015 | #define E1000_82542_CTRL_DUP E1000_CTRL_DUP | 1058 | #define E1000_82542_CTRL_DUP E1000_CTRL_DUP |
| 1016 | #define E1000_82542_STATUS E1000_STATUS | 1059 | #define E1000_82542_STATUS E1000_STATUS |
| @@ -1571,6 +1614,11 @@ struct e1000_hw { | |||
| 1571 | #define E1000_MDIC_INT_EN 0x20000000 | 1614 | #define E1000_MDIC_INT_EN 0x20000000 |
| 1572 | #define E1000_MDIC_ERROR 0x40000000 | 1615 | #define E1000_MDIC_ERROR 0x40000000 |
| 1573 | 1616 | ||
| 1617 | #define INTEL_CE_GBE_MDIC_OP_WRITE 0x04000000 | ||
| 1618 | #define INTEL_CE_GBE_MDIC_OP_READ 0x00000000 | ||
| 1619 | #define INTEL_CE_GBE_MDIC_GO 0x80000000 | ||
| 1620 | #define INTEL_CE_GBE_MDIC_READ_ERROR 0x80000000 | ||
| 1621 | |||
| 1574 | #define E1000_KUMCTRLSTA_MASK 0x0000FFFF | 1622 | #define E1000_KUMCTRLSTA_MASK 0x0000FFFF |
| 1575 | #define E1000_KUMCTRLSTA_OFFSET 0x001F0000 | 1623 | #define E1000_KUMCTRLSTA_OFFSET 0x001F0000 |
| 1576 | #define E1000_KUMCTRLSTA_OFFSET_SHIFT 16 | 1624 | #define E1000_KUMCTRLSTA_OFFSET_SHIFT 16 |
| @@ -2871,6 +2919,11 @@ struct e1000_host_command_info { | |||
| 2871 | #define M88E1111_I_PHY_ID 0x01410CC0 | 2919 | #define M88E1111_I_PHY_ID 0x01410CC0 |
| 2872 | #define L1LXT971A_PHY_ID 0x001378E0 | 2920 | #define L1LXT971A_PHY_ID 0x001378E0 |
| 2873 | 2921 | ||
| 2922 | #define RTL8211B_PHY_ID 0x001CC910 | ||
| 2923 | #define RTL8201N_PHY_ID 0x8200 | ||
| 2924 | #define RTL_PHY_CTRL_FD 0x0100 /* Full duplex.0=half; 1=full */ | ||
| 2925 | #define RTL_PHY_CTRL_SPD_100 0x200000 /* Force 100Mb */ | ||
| 2926 | |||
| 2874 | /* Bits... | 2927 | /* Bits... |
| 2875 | * 15-5: page | 2928 | * 15-5: page |
| 2876 | * 4-0: register offset | 2929 | * 4-0: register offset |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 340e12d2e4a9..4ff88a683f61 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
| @@ -28,6 +28,12 @@ | |||
| 28 | 28 | ||
| 29 | #include "e1000.h" | 29 | #include "e1000.h" |
| 30 | #include <net/ip6_checksum.h> | 30 | #include <net/ip6_checksum.h> |
| 31 | #include <linux/io.h> | ||
| 32 | |||
| 33 | /* Intel Media SOC GbE MDIO physical base address */ | ||
| 34 | static unsigned long ce4100_gbe_mdio_base_phy; | ||
| 35 | /* Intel Media SOC GbE MDIO virtual base address */ | ||
| 36 | void __iomem *ce4100_gbe_mdio_base_virt; | ||
| 31 | 37 | ||
| 32 | char e1000_driver_name[] = "e1000"; | 38 | char e1000_driver_name[] = "e1000"; |
| 33 | static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; | 39 | static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; |
| @@ -79,6 +85,7 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = { | |||
| 79 | INTEL_E1000_ETHERNET_DEVICE(0x108A), | 85 | INTEL_E1000_ETHERNET_DEVICE(0x108A), |
| 80 | INTEL_E1000_ETHERNET_DEVICE(0x1099), | 86 | INTEL_E1000_ETHERNET_DEVICE(0x1099), |
| 81 | INTEL_E1000_ETHERNET_DEVICE(0x10B5), | 87 | INTEL_E1000_ETHERNET_DEVICE(0x10B5), |
| 88 | INTEL_E1000_ETHERNET_DEVICE(0x2E6E), | ||
| 82 | /* required last entry */ | 89 | /* required last entry */ |
| 83 | {0,} | 90 | {0,} |
| 84 | }; | 91 | }; |
| @@ -459,6 +466,7 @@ static void e1000_power_down_phy(struct e1000_adapter *adapter) | |||
| 459 | case e1000_82545: | 466 | case e1000_82545: |
| 460 | case e1000_82545_rev_3: | 467 | case e1000_82545_rev_3: |
| 461 | case e1000_82546: | 468 | case e1000_82546: |
| 469 | case e1000_ce4100: | ||
| 462 | case e1000_82546_rev_3: | 470 | case e1000_82546_rev_3: |
| 463 | case e1000_82541: | 471 | case e1000_82541: |
| 464 | case e1000_82541_rev_2: | 472 | case e1000_82541_rev_2: |
| @@ -573,6 +581,7 @@ void e1000_reset(struct e1000_adapter *adapter) | |||
| 573 | case e1000_82545: | 581 | case e1000_82545: |
| 574 | case e1000_82545_rev_3: | 582 | case e1000_82545_rev_3: |
| 575 | case e1000_82546: | 583 | case e1000_82546: |
| 584 | case e1000_ce4100: | ||
| 576 | case e1000_82546_rev_3: | 585 | case e1000_82546_rev_3: |
| 577 | pba = E1000_PBA_48K; | 586 | pba = E1000_PBA_48K; |
| 578 | break; | 587 | break; |
| @@ -894,6 +903,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 894 | static int global_quad_port_a = 0; /* global ksp3 port a indication */ | 903 | static int global_quad_port_a = 0; /* global ksp3 port a indication */ |
| 895 | int i, err, pci_using_dac; | 904 | int i, err, pci_using_dac; |
| 896 | u16 eeprom_data = 0; | 905 | u16 eeprom_data = 0; |
| 906 | u16 tmp = 0; | ||
| 897 | u16 eeprom_apme_mask = E1000_EEPROM_APME; | 907 | u16 eeprom_apme_mask = E1000_EEPROM_APME; |
| 898 | int bars, need_ioport; | 908 | int bars, need_ioport; |
| 899 | 909 | ||
| @@ -996,6 +1006,14 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 996 | goto err_sw_init; | 1006 | goto err_sw_init; |
| 997 | 1007 | ||
| 998 | err = -EIO; | 1008 | err = -EIO; |
| 1009 | if (hw->mac_type == e1000_ce4100) { | ||
| 1010 | ce4100_gbe_mdio_base_phy = pci_resource_start(pdev, BAR_1); | ||
| 1011 | ce4100_gbe_mdio_base_virt = ioremap(ce4100_gbe_mdio_base_phy, | ||
| 1012 | pci_resource_len(pdev, BAR_1)); | ||
| 1013 | |||
| 1014 | if (!ce4100_gbe_mdio_base_virt) | ||
| 1015 | goto err_mdio_ioremap; | ||
| 1016 | } | ||
| 999 | 1017 | ||
| 1000 | if (hw->mac_type >= e1000_82543) { | 1018 | if (hw->mac_type >= e1000_82543) { |
| 1001 | netdev->features = NETIF_F_SG | | 1019 | netdev->features = NETIF_F_SG | |
| @@ -1135,6 +1153,20 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 1135 | adapter->wol = adapter->eeprom_wol; | 1153 | adapter->wol = adapter->eeprom_wol; |
| 1136 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); | 1154 | device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); |
| 1137 | 1155 | ||
| 1156 | /* Auto detect PHY address */ | ||
| 1157 | if (hw->mac_type == e1000_ce4100) { | ||
| 1158 | for (i = 0; i < 32; i++) { | ||
| 1159 | hw->phy_addr = i; | ||
| 1160 | e1000_read_phy_reg(hw, PHY_ID2, &tmp); | ||
| 1161 | if (tmp == 0 || tmp == 0xFF) { | ||
| 1162 | if (i == 31) | ||
| 1163 | goto err_eeprom; | ||
| 1164 | continue; | ||
| 1165 | } else | ||
| 1166 | break; | ||
| 1167 | } | ||
| 1168 | } | ||
| 1169 | |||
| 1138 | /* reset the hardware with the new settings */ | 1170 | /* reset the hardware with the new settings */ |
| 1139 | e1000_reset(adapter); | 1171 | e1000_reset(adapter); |
| 1140 | 1172 | ||
| @@ -1171,6 +1203,8 @@ err_eeprom: | |||
| 1171 | kfree(adapter->rx_ring); | 1203 | kfree(adapter->rx_ring); |
| 1172 | err_dma: | 1204 | err_dma: |
| 1173 | err_sw_init: | 1205 | err_sw_init: |
| 1206 | err_mdio_ioremap: | ||
| 1207 | iounmap(ce4100_gbe_mdio_base_virt); | ||
| 1174 | iounmap(hw->hw_addr); | 1208 | iounmap(hw->hw_addr); |
| 1175 | err_ioremap: | 1209 | err_ioremap: |
| 1176 | free_netdev(netdev); | 1210 | free_netdev(netdev); |
| @@ -1409,6 +1443,7 @@ static bool e1000_check_64k_bound(struct e1000_adapter *adapter, void *start, | |||
| 1409 | /* First rev 82545 and 82546 need to not allow any memory | 1443 | /* First rev 82545 and 82546 need to not allow any memory |
| 1410 | * write location to cross 64k boundary due to errata 23 */ | 1444 | * write location to cross 64k boundary due to errata 23 */ |
| 1411 | if (hw->mac_type == e1000_82545 || | 1445 | if (hw->mac_type == e1000_82545 || |
| 1446 | hw->mac_type == e1000_ce4100 || | ||
| 1412 | hw->mac_type == e1000_82546) { | 1447 | hw->mac_type == e1000_82546) { |
| 1413 | return ((begin ^ (end - 1)) >> 16) != 0 ? false : true; | 1448 | return ((begin ^ (end - 1)) >> 16) != 0 ? false : true; |
| 1414 | } | 1449 | } |
diff --git a/drivers/net/e1000/e1000_osdep.h b/drivers/net/e1000/e1000_osdep.h index edd1c75aa895..55c1711f1688 100644 --- a/drivers/net/e1000/e1000_osdep.h +++ b/drivers/net/e1000/e1000_osdep.h | |||
| @@ -34,12 +34,21 @@ | |||
| 34 | #ifndef _E1000_OSDEP_H_ | 34 | #ifndef _E1000_OSDEP_H_ |
| 35 | #define _E1000_OSDEP_H_ | 35 | #define _E1000_OSDEP_H_ |
| 36 | 36 | ||
| 37 | #include <linux/types.h> | ||
| 38 | #include <linux/pci.h> | ||
| 39 | #include <linux/delay.h> | ||
| 40 | #include <asm/io.h> | 37 | #include <asm/io.h> |
| 41 | #include <linux/interrupt.h> | 38 | |
| 42 | #include <linux/sched.h> | 39 | #define CONFIG_RAM_BASE 0x60000 |
| 40 | #define GBE_CONFIG_OFFSET 0x0 | ||
| 41 | |||
| 42 | #define GBE_CONFIG_RAM_BASE \ | ||
| 43 | ((unsigned int)(CONFIG_RAM_BASE + GBE_CONFIG_OFFSET)) | ||
| 44 | |||
| 45 | #define GBE_CONFIG_BASE_VIRT phys_to_virt(GBE_CONFIG_RAM_BASE) | ||
| 46 | |||
| 47 | #define GBE_CONFIG_FLASH_WRITE(base, offset, count, data) \ | ||
| 48 | (iowrite16_rep(base + offset, data, count)) | ||
| 49 | |||
| 50 | #define GBE_CONFIG_FLASH_READ(base, offset, count, data) \ | ||
| 51 | (ioread16_rep(base + (offset << 1), data, count)) | ||
| 43 | 52 | ||
| 44 | #define er32(reg) \ | 53 | #define er32(reg) \ |
| 45 | (readl(hw->hw_addr + ((hw->mac_type >= e1000_82543) \ | 54 | (readl(hw->hw_addr + ((hw->mac_type >= e1000_82543) \ |
diff --git a/drivers/net/e1000e/82571.c b/drivers/net/e1000e/82571.c index e57e4097ef1b..cb6c7b1c1fb8 100644 --- a/drivers/net/e1000e/82571.c +++ b/drivers/net/e1000e/82571.c | |||
| @@ -78,6 +78,8 @@ static void e1000_power_down_phy_copper_82571(struct e1000_hw *hw); | |||
| 78 | static void e1000_put_hw_semaphore_82573(struct e1000_hw *hw); | 78 | static void e1000_put_hw_semaphore_82573(struct e1000_hw *hw); |
| 79 | static s32 e1000_get_hw_semaphore_82574(struct e1000_hw *hw); | 79 | static s32 e1000_get_hw_semaphore_82574(struct e1000_hw *hw); |
| 80 | static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw); | 80 | static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw); |
| 81 | static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active); | ||
| 82 | static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active); | ||
| 81 | 83 | ||
| 82 | /** | 84 | /** |
| 83 | * e1000_init_phy_params_82571 - Init PHY func ptrs. | 85 | * e1000_init_phy_params_82571 - Init PHY func ptrs. |
| @@ -113,6 +115,8 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) | |||
| 113 | phy->type = e1000_phy_bm; | 115 | phy->type = e1000_phy_bm; |
| 114 | phy->ops.acquire = e1000_get_hw_semaphore_82574; | 116 | phy->ops.acquire = e1000_get_hw_semaphore_82574; |
| 115 | phy->ops.release = e1000_put_hw_semaphore_82574; | 117 | phy->ops.release = e1000_put_hw_semaphore_82574; |
| 118 | phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_82574; | ||
| 119 | phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_82574; | ||
| 116 | break; | 120 | break; |
| 117 | default: | 121 | default: |
| 118 | return -E1000_ERR_PHY; | 122 | return -E1000_ERR_PHY; |
| @@ -121,29 +125,36 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) | |||
| 121 | 125 | ||
| 122 | /* This can only be done after all function pointers are setup. */ | 126 | /* This can only be done after all function pointers are setup. */ |
| 123 | ret_val = e1000_get_phy_id_82571(hw); | 127 | ret_val = e1000_get_phy_id_82571(hw); |
| 128 | if (ret_val) { | ||
| 129 | e_dbg("Error getting PHY ID\n"); | ||
| 130 | return ret_val; | ||
| 131 | } | ||
| 124 | 132 | ||
| 125 | /* Verify phy id */ | 133 | /* Verify phy id */ |
| 126 | switch (hw->mac.type) { | 134 | switch (hw->mac.type) { |
| 127 | case e1000_82571: | 135 | case e1000_82571: |
| 128 | case e1000_82572: | 136 | case e1000_82572: |
| 129 | if (phy->id != IGP01E1000_I_PHY_ID) | 137 | if (phy->id != IGP01E1000_I_PHY_ID) |
| 130 | return -E1000_ERR_PHY; | 138 | ret_val = -E1000_ERR_PHY; |
| 131 | break; | 139 | break; |
| 132 | case e1000_82573: | 140 | case e1000_82573: |
| 133 | if (phy->id != M88E1111_I_PHY_ID) | 141 | if (phy->id != M88E1111_I_PHY_ID) |
| 134 | return -E1000_ERR_PHY; | 142 | ret_val = -E1000_ERR_PHY; |
| 135 | break; | 143 | break; |
| 136 | case e1000_82574: | 144 | case e1000_82574: |
| 137 | case e1000_82583: | 145 | case e1000_82583: |
| 138 | if (phy->id != BME1000_E_PHY_ID_R2) | 146 | if (phy->id != BME1000_E_PHY_ID_R2) |
| 139 | return -E1000_ERR_PHY; | 147 | ret_val = -E1000_ERR_PHY; |
| 140 | break; | 148 | break; |
| 141 | default: | 149 | default: |
| 142 | return -E1000_ERR_PHY; | 150 | ret_val = -E1000_ERR_PHY; |
| 143 | break; | 151 | break; |
| 144 | } | 152 | } |
| 145 | 153 | ||
| 146 | return 0; | 154 | if (ret_val) |
| 155 | e_dbg("PHY ID unknown: type = 0x%08x\n", phy->id); | ||
| 156 | |||
| 157 | return ret_val; | ||
| 147 | } | 158 | } |
| 148 | 159 | ||
| 149 | /** | 160 | /** |
| @@ -649,6 +660,58 @@ static void e1000_put_hw_semaphore_82574(struct e1000_hw *hw) | |||
| 649 | } | 660 | } |
| 650 | 661 | ||
| 651 | /** | 662 | /** |
| 663 | * e1000_set_d0_lplu_state_82574 - Set Low Power Linkup D0 state | ||
| 664 | * @hw: pointer to the HW structure | ||
| 665 | * @active: true to enable LPLU, false to disable | ||
| 666 | * | ||
| 667 | * Sets the LPLU D0 state according to the active flag. | ||
| 668 | * LPLU will not be activated unless the | ||
| 669 | * device autonegotiation advertisement meets standards of | ||
| 670 | * either 10 or 10/100 or 10/100/1000 at all duplexes. | ||
| 671 | * This is a function pointer entry point only called by | ||
| 672 | * PHY setup routines. | ||
| 673 | **/ | ||
| 674 | static s32 e1000_set_d0_lplu_state_82574(struct e1000_hw *hw, bool active) | ||
| 675 | { | ||
| 676 | u16 data = er32(POEMB); | ||
| 677 | |||
| 678 | if (active) | ||
| 679 | data |= E1000_PHY_CTRL_D0A_LPLU; | ||
| 680 | else | ||
| 681 | data &= ~E1000_PHY_CTRL_D0A_LPLU; | ||
| 682 | |||
| 683 | ew32(POEMB, data); | ||
| 684 | return 0; | ||
| 685 | } | ||
| 686 | |||
| 687 | /** | ||
| 688 | * e1000_set_d3_lplu_state_82574 - Sets low power link up state for D3 | ||
| 689 | * @hw: pointer to the HW structure | ||
| 690 | * @active: boolean used to enable/disable lplu | ||
| 691 | * | ||
| 692 | * The low power link up (lplu) state is set to the power management level D3 | ||
| 693 | * when active is true, else clear lplu for D3. LPLU | ||
| 694 | * is used during Dx states where the power conservation is most important. | ||
| 695 | * During driver activity, SmartSpeed should be enabled so performance is | ||
| 696 | * maintained. | ||
| 697 | **/ | ||
| 698 | static s32 e1000_set_d3_lplu_state_82574(struct e1000_hw *hw, bool active) | ||
| 699 | { | ||
| 700 | u16 data = er32(POEMB); | ||
| 701 | |||
| 702 | if (!active) { | ||
| 703 | data &= ~E1000_PHY_CTRL_NOND0A_LPLU; | ||
| 704 | } else if ((hw->phy.autoneg_advertised == E1000_ALL_SPEED_DUPLEX) || | ||
| 705 | (hw->phy.autoneg_advertised == E1000_ALL_NOT_GIG) || | ||
| 706 | (hw->phy.autoneg_advertised == E1000_ALL_10_SPEED)) { | ||
| 707 | data |= E1000_PHY_CTRL_NOND0A_LPLU; | ||
| 708 | } | ||
| 709 | |||
| 710 | ew32(POEMB, data); | ||
| 711 | return 0; | ||
| 712 | } | ||
| 713 | |||
| 714 | /** | ||
| 652 | * e1000_acquire_nvm_82571 - Request for access to the EEPROM | 715 | * e1000_acquire_nvm_82571 - Request for access to the EEPROM |
| 653 | * @hw: pointer to the HW structure | 716 | * @hw: pointer to the HW structure |
| 654 | * | 717 | * |
| @@ -956,7 +1019,7 @@ static s32 e1000_set_d0_lplu_state_82571(struct e1000_hw *hw, bool active) | |||
| 956 | **/ | 1019 | **/ |
| 957 | static s32 e1000_reset_hw_82571(struct e1000_hw *hw) | 1020 | static s32 e1000_reset_hw_82571(struct e1000_hw *hw) |
| 958 | { | 1021 | { |
| 959 | u32 ctrl, ctrl_ext, icr; | 1022 | u32 ctrl, ctrl_ext; |
| 960 | s32 ret_val; | 1023 | s32 ret_val; |
| 961 | 1024 | ||
| 962 | /* | 1025 | /* |
| @@ -1040,7 +1103,7 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw) | |||
| 1040 | 1103 | ||
| 1041 | /* Clear any pending interrupt events. */ | 1104 | /* Clear any pending interrupt events. */ |
| 1042 | ew32(IMC, 0xffffffff); | 1105 | ew32(IMC, 0xffffffff); |
| 1043 | icr = er32(ICR); | 1106 | er32(ICR); |
| 1044 | 1107 | ||
| 1045 | if (hw->mac.type == e1000_82571) { | 1108 | if (hw->mac.type == e1000_82571) { |
| 1046 | /* Install any alternate MAC address into RAR0 */ | 1109 | /* Install any alternate MAC address into RAR0 */ |
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index 2c913b8e9116..5255be753746 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/netdevice.h> | 38 | #include <linux/netdevice.h> |
| 39 | #include <linux/pci.h> | 39 | #include <linux/pci.h> |
| 40 | #include <linux/pci-aspm.h> | 40 | #include <linux/pci-aspm.h> |
| 41 | #include <linux/crc32.h> | ||
| 41 | 42 | ||
| 42 | #include "hw.h" | 43 | #include "hw.h" |
| 43 | 44 | ||
| @@ -496,6 +497,8 @@ extern void e1000e_free_tx_resources(struct e1000_adapter *adapter); | |||
| 496 | extern void e1000e_update_stats(struct e1000_adapter *adapter); | 497 | extern void e1000e_update_stats(struct e1000_adapter *adapter); |
| 497 | extern void e1000e_set_interrupt_capability(struct e1000_adapter *adapter); | 498 | extern void e1000e_set_interrupt_capability(struct e1000_adapter *adapter); |
| 498 | extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); | 499 | extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); |
| 500 | extern void e1000e_get_hw_control(struct e1000_adapter *adapter); | ||
| 501 | extern void e1000e_release_hw_control(struct e1000_adapter *adapter); | ||
| 499 | extern void e1000e_disable_aspm(struct pci_dev *pdev, u16 state); | 502 | extern void e1000e_disable_aspm(struct pci_dev *pdev, u16 state); |
| 500 | 503 | ||
| 501 | extern unsigned int copybreak; | 504 | extern unsigned int copybreak; |
diff --git a/drivers/net/e1000e/es2lan.c b/drivers/net/e1000e/es2lan.c index b18c644e13d1..e45a61c8930a 100644 --- a/drivers/net/e1000e/es2lan.c +++ b/drivers/net/e1000e/es2lan.c | |||
| @@ -784,7 +784,7 @@ static s32 e1000_get_link_up_info_80003es2lan(struct e1000_hw *hw, u16 *speed, | |||
| 784 | **/ | 784 | **/ |
| 785 | static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw) | 785 | static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw) |
| 786 | { | 786 | { |
| 787 | u32 ctrl, icr; | 787 | u32 ctrl; |
| 788 | s32 ret_val; | 788 | s32 ret_val; |
| 789 | 789 | ||
| 790 | /* | 790 | /* |
| @@ -818,7 +818,7 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw) | |||
| 818 | 818 | ||
| 819 | /* Clear any pending interrupt events. */ | 819 | /* Clear any pending interrupt events. */ |
| 820 | ew32(IMC, 0xffffffff); | 820 | ew32(IMC, 0xffffffff); |
| 821 | icr = er32(ICR); | 821 | er32(ICR); |
| 822 | 822 | ||
| 823 | ret_val = e1000_check_alt_mac_addr_generic(hw); | 823 | ret_val = e1000_check_alt_mac_addr_generic(hw); |
| 824 | 824 | ||
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index affcacf6f5a9..f8ed03dab9b1 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
| @@ -624,20 +624,24 @@ static void e1000_get_drvinfo(struct net_device *netdev, | |||
| 624 | struct e1000_adapter *adapter = netdev_priv(netdev); | 624 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 625 | char firmware_version[32]; | 625 | char firmware_version[32]; |
| 626 | 626 | ||
| 627 | strncpy(drvinfo->driver, e1000e_driver_name, 32); | 627 | strncpy(drvinfo->driver, e1000e_driver_name, |
| 628 | strncpy(drvinfo->version, e1000e_driver_version, 32); | 628 | sizeof(drvinfo->driver) - 1); |
| 629 | strncpy(drvinfo->version, e1000e_driver_version, | ||
| 630 | sizeof(drvinfo->version) - 1); | ||
| 629 | 631 | ||
| 630 | /* | 632 | /* |
| 631 | * EEPROM image version # is reported as firmware version # for | 633 | * EEPROM image version # is reported as firmware version # for |
| 632 | * PCI-E controllers | 634 | * PCI-E controllers |
| 633 | */ | 635 | */ |
| 634 | sprintf(firmware_version, "%d.%d-%d", | 636 | snprintf(firmware_version, sizeof(firmware_version), "%d.%d-%d", |
| 635 | (adapter->eeprom_vers & 0xF000) >> 12, | 637 | (adapter->eeprom_vers & 0xF000) >> 12, |
| 636 | (adapter->eeprom_vers & 0x0FF0) >> 4, | 638 | (adapter->eeprom_vers & 0x0FF0) >> 4, |
| 637 | (adapter->eeprom_vers & 0x000F)); | 639 | (adapter->eeprom_vers & 0x000F)); |
| 638 | 640 | ||
| 639 | strncpy(drvinfo->fw_version, firmware_version, 32); | 641 | strncpy(drvinfo->fw_version, firmware_version, |
| 640 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); | 642 | sizeof(drvinfo->fw_version) - 1); |
| 643 | strncpy(drvinfo->bus_info, pci_name(adapter->pdev), | ||
| 644 | sizeof(drvinfo->bus_info) - 1); | ||
| 641 | drvinfo->regdump_len = e1000_get_regs_len(netdev); | 645 | drvinfo->regdump_len = e1000_get_regs_len(netdev); |
| 642 | drvinfo->eedump_len = e1000_get_eeprom_len(netdev); | 646 | drvinfo->eedump_len = e1000_get_eeprom_len(netdev); |
| 643 | } | 647 | } |
| @@ -1704,6 +1708,19 @@ static void e1000_diag_test(struct net_device *netdev, | |||
| 1704 | bool if_running = netif_running(netdev); | 1708 | bool if_running = netif_running(netdev); |
| 1705 | 1709 | ||
| 1706 | set_bit(__E1000_TESTING, &adapter->state); | 1710 | set_bit(__E1000_TESTING, &adapter->state); |
| 1711 | |||
| 1712 | if (!if_running) { | ||
| 1713 | /* Get control of and reset hardware */ | ||
| 1714 | if (adapter->flags & FLAG_HAS_AMT) | ||
| 1715 | e1000e_get_hw_control(adapter); | ||
| 1716 | |||
| 1717 | e1000e_power_up_phy(adapter); | ||
| 1718 | |||
| 1719 | adapter->hw.phy.autoneg_wait_to_complete = 1; | ||
| 1720 | e1000e_reset(adapter); | ||
| 1721 | adapter->hw.phy.autoneg_wait_to_complete = 0; | ||
| 1722 | } | ||
| 1723 | |||
| 1707 | if (eth_test->flags == ETH_TEST_FL_OFFLINE) { | 1724 | if (eth_test->flags == ETH_TEST_FL_OFFLINE) { |
| 1708 | /* Offline tests */ | 1725 | /* Offline tests */ |
| 1709 | 1726 | ||
| @@ -1717,8 +1734,6 @@ static void e1000_diag_test(struct net_device *netdev, | |||
| 1717 | if (if_running) | 1734 | if (if_running) |
| 1718 | /* indicate we're in test mode */ | 1735 | /* indicate we're in test mode */ |
| 1719 | dev_close(netdev); | 1736 | dev_close(netdev); |
| 1720 | else | ||
| 1721 | e1000e_reset(adapter); | ||
| 1722 | 1737 | ||
| 1723 | if (e1000_reg_test(adapter, &data[0])) | 1738 | if (e1000_reg_test(adapter, &data[0])) |
| 1724 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1739 | eth_test->flags |= ETH_TEST_FL_FAILED; |
| @@ -1732,8 +1747,6 @@ static void e1000_diag_test(struct net_device *netdev, | |||
| 1732 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1747 | eth_test->flags |= ETH_TEST_FL_FAILED; |
| 1733 | 1748 | ||
| 1734 | e1000e_reset(adapter); | 1749 | e1000e_reset(adapter); |
| 1735 | /* make sure the phy is powered up */ | ||
| 1736 | e1000e_power_up_phy(adapter); | ||
| 1737 | if (e1000_loopback_test(adapter, &data[3])) | 1750 | if (e1000_loopback_test(adapter, &data[3])) |
| 1738 | eth_test->flags |= ETH_TEST_FL_FAILED; | 1751 | eth_test->flags |= ETH_TEST_FL_FAILED; |
| 1739 | 1752 | ||
| @@ -1755,28 +1768,29 @@ static void e1000_diag_test(struct net_device *netdev, | |||
| 1755 | if (if_running) | 1768 | if (if_running) |
| 1756 | dev_open(netdev); | 1769 | dev_open(netdev); |
| 1757 | } else { | 1770 | } else { |
| 1758 | if (!if_running && (adapter->flags & FLAG_HAS_AMT)) { | 1771 | /* Online tests */ |
| 1759 | clear_bit(__E1000_TESTING, &adapter->state); | ||
| 1760 | dev_open(netdev); | ||
| 1761 | set_bit(__E1000_TESTING, &adapter->state); | ||
| 1762 | } | ||
| 1763 | 1772 | ||
| 1764 | e_info("online testing starting\n"); | 1773 | e_info("online testing starting\n"); |
| 1765 | /* Online tests */ | ||
| 1766 | if (e1000_link_test(adapter, &data[4])) | ||
| 1767 | eth_test->flags |= ETH_TEST_FL_FAILED; | ||
| 1768 | 1774 | ||
| 1769 | /* Online tests aren't run; pass by default */ | 1775 | /* register, eeprom, intr and loopback tests not run online */ |
| 1770 | data[0] = 0; | 1776 | data[0] = 0; |
| 1771 | data[1] = 0; | 1777 | data[1] = 0; |
| 1772 | data[2] = 0; | 1778 | data[2] = 0; |
| 1773 | data[3] = 0; | 1779 | data[3] = 0; |
| 1774 | 1780 | ||
| 1775 | if (!if_running && (adapter->flags & FLAG_HAS_AMT)) | 1781 | if (e1000_link_test(adapter, &data[4])) |
| 1776 | dev_close(netdev); | 1782 | eth_test->flags |= ETH_TEST_FL_FAILED; |
| 1777 | 1783 | ||
| 1778 | clear_bit(__E1000_TESTING, &adapter->state); | 1784 | clear_bit(__E1000_TESTING, &adapter->state); |
| 1779 | } | 1785 | } |
| 1786 | |||
| 1787 | if (!if_running) { | ||
| 1788 | e1000e_reset(adapter); | ||
| 1789 | |||
| 1790 | if (adapter->flags & FLAG_HAS_AMT) | ||
| 1791 | e1000e_release_hw_control(adapter); | ||
| 1792 | } | ||
| 1793 | |||
| 1780 | msleep_interruptible(4 * 1000); | 1794 | msleep_interruptible(4 * 1000); |
| 1781 | } | 1795 | } |
| 1782 | 1796 | ||
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h index ba302a5c2c30..e774380c7cec 100644 --- a/drivers/net/e1000e/hw.h +++ b/drivers/net/e1000e/hw.h | |||
| @@ -83,6 +83,7 @@ enum e1e_registers { | |||
| 83 | E1000_EXTCNF_CTRL = 0x00F00, /* Extended Configuration Control */ | 83 | E1000_EXTCNF_CTRL = 0x00F00, /* Extended Configuration Control */ |
| 84 | E1000_EXTCNF_SIZE = 0x00F08, /* Extended Configuration Size */ | 84 | E1000_EXTCNF_SIZE = 0x00F08, /* Extended Configuration Size */ |
| 85 | E1000_PHY_CTRL = 0x00F10, /* PHY Control Register in CSR */ | 85 | E1000_PHY_CTRL = 0x00F10, /* PHY Control Register in CSR */ |
| 86 | #define E1000_POEMB E1000_PHY_CTRL /* PHY OEM Bits */ | ||
| 86 | E1000_PBA = 0x01000, /* Packet Buffer Allocation - RW */ | 87 | E1000_PBA = 0x01000, /* Packet Buffer Allocation - RW */ |
| 87 | E1000_PBS = 0x01008, /* Packet Buffer Size */ | 88 | E1000_PBS = 0x01008, /* Packet Buffer Size */ |
| 88 | E1000_EEMNGCTL = 0x01010, /* MNG EEprom Control */ | 89 | E1000_EEMNGCTL = 0x01010, /* MNG EEprom Control */ |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index d86cc0832720..5328a2927731 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
| @@ -1395,22 +1395,6 @@ void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw) | |||
| 1395 | } | 1395 | } |
| 1396 | } | 1396 | } |
| 1397 | 1397 | ||
| 1398 | static u32 e1000_calc_rx_da_crc(u8 mac[]) | ||
| 1399 | { | ||
| 1400 | u32 poly = 0xEDB88320; /* Polynomial for 802.3 CRC calculation */ | ||
| 1401 | u32 i, j, mask, crc; | ||
| 1402 | |||
| 1403 | crc = 0xffffffff; | ||
| 1404 | for (i = 0; i < 6; i++) { | ||
| 1405 | crc = crc ^ mac[i]; | ||
| 1406 | for (j = 8; j > 0; j--) { | ||
| 1407 | mask = (crc & 1) * (-1); | ||
| 1408 | crc = (crc >> 1) ^ (poly & mask); | ||
| 1409 | } | ||
| 1410 | } | ||
| 1411 | return ~crc; | ||
| 1412 | } | ||
| 1413 | |||
| 1414 | /** | 1398 | /** |
| 1415 | * e1000_lv_jumbo_workaround_ich8lan - required for jumbo frame operation | 1399 | * e1000_lv_jumbo_workaround_ich8lan - required for jumbo frame operation |
| 1416 | * with 82579 PHY | 1400 | * with 82579 PHY |
| @@ -1453,8 +1437,7 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable) | |||
| 1453 | mac_addr[4] = (addr_high & 0xFF); | 1437 | mac_addr[4] = (addr_high & 0xFF); |
| 1454 | mac_addr[5] = ((addr_high >> 8) & 0xFF); | 1438 | mac_addr[5] = ((addr_high >> 8) & 0xFF); |
| 1455 | 1439 | ||
| 1456 | ew32(PCH_RAICC(i), | 1440 | ew32(PCH_RAICC(i), ~ether_crc_le(ETH_ALEN, mac_addr)); |
| 1457 | e1000_calc_rx_da_crc(mac_addr)); | ||
| 1458 | } | 1441 | } |
| 1459 | 1442 | ||
| 1460 | /* Write Rx addresses to the PHY */ | 1443 | /* Write Rx addresses to the PHY */ |
| @@ -2977,7 +2960,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
| 2977 | { | 2960 | { |
| 2978 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; | 2961 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; |
| 2979 | u16 reg; | 2962 | u16 reg; |
| 2980 | u32 ctrl, icr, kab; | 2963 | u32 ctrl, kab; |
| 2981 | s32 ret_val; | 2964 | s32 ret_val; |
| 2982 | 2965 | ||
| 2983 | /* | 2966 | /* |
| @@ -3067,7 +3050,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
| 3067 | ew32(CRC_OFFSET, 0x65656565); | 3050 | ew32(CRC_OFFSET, 0x65656565); |
| 3068 | 3051 | ||
| 3069 | ew32(IMC, 0xffffffff); | 3052 | ew32(IMC, 0xffffffff); |
| 3070 | icr = er32(ICR); | 3053 | er32(ICR); |
| 3071 | 3054 | ||
| 3072 | kab = er32(KABGTXD); | 3055 | kab = er32(KABGTXD); |
| 3073 | kab |= E1000_KABGTXD_BGSQLBIAS; | 3056 | kab |= E1000_KABGTXD_BGSQLBIAS; |
| @@ -3118,7 +3101,7 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw) | |||
| 3118 | * Reset the phy after disabling host wakeup to reset the Rx buffer. | 3101 | * Reset the phy after disabling host wakeup to reset the Rx buffer. |
| 3119 | */ | 3102 | */ |
| 3120 | if (hw->phy.type == e1000_phy_82578) { | 3103 | if (hw->phy.type == e1000_phy_82578) { |
| 3121 | hw->phy.ops.read_reg(hw, BM_WUC, &i); | 3104 | e1e_rphy(hw, BM_WUC, &i); |
| 3122 | ret_val = e1000_phy_hw_reset_ich8lan(hw); | 3105 | ret_val = e1000_phy_hw_reset_ich8lan(hw); |
| 3123 | if (ret_val) | 3106 | if (ret_val) |
| 3124 | return ret_val; | 3107 | return ret_val; |
| @@ -3276,9 +3259,8 @@ static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw) | |||
| 3276 | (hw->phy.type == e1000_phy_82577)) { | 3259 | (hw->phy.type == e1000_phy_82577)) { |
| 3277 | ew32(FCRTV_PCH, hw->fc.refresh_time); | 3260 | ew32(FCRTV_PCH, hw->fc.refresh_time); |
| 3278 | 3261 | ||
| 3279 | ret_val = hw->phy.ops.write_reg(hw, | 3262 | ret_val = e1e_wphy(hw, PHY_REG(BM_PORT_CTRL_PAGE, 27), |
| 3280 | PHY_REG(BM_PORT_CTRL_PAGE, 27), | 3263 | hw->fc.pause_time); |
| 3281 | hw->fc.pause_time); | ||
| 3282 | if (ret_val) | 3264 | if (ret_val) |
| 3283 | return ret_val; | 3265 | return ret_val; |
| 3284 | } | 3266 | } |
| @@ -3342,8 +3324,7 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw) | |||
| 3342 | return ret_val; | 3324 | return ret_val; |
| 3343 | break; | 3325 | break; |
| 3344 | case e1000_phy_ife: | 3326 | case e1000_phy_ife: |
| 3345 | ret_val = hw->phy.ops.read_reg(hw, IFE_PHY_MDIX_CONTROL, | 3327 | ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, ®_data); |
| 3346 | ®_data); | ||
| 3347 | if (ret_val) | 3328 | if (ret_val) |
| 3348 | return ret_val; | 3329 | return ret_val; |
| 3349 | 3330 | ||
| @@ -3361,8 +3342,7 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw) | |||
| 3361 | reg_data |= IFE_PMC_AUTO_MDIX; | 3342 | reg_data |= IFE_PMC_AUTO_MDIX; |
| 3362 | break; | 3343 | break; |
| 3363 | } | 3344 | } |
| 3364 | ret_val = hw->phy.ops.write_reg(hw, IFE_PHY_MDIX_CONTROL, | 3345 | ret_val = e1e_wphy(hw, IFE_PHY_MDIX_CONTROL, reg_data); |
| 3365 | reg_data); | ||
| 3366 | if (ret_val) | 3346 | if (ret_val) |
| 3367 | return ret_val; | 3347 | return ret_val; |
| 3368 | break; | 3348 | break; |
| @@ -3646,7 +3626,8 @@ static s32 e1000_led_off_ich8lan(struct e1000_hw *hw) | |||
| 3646 | { | 3626 | { |
| 3647 | if (hw->phy.type == e1000_phy_ife) | 3627 | if (hw->phy.type == e1000_phy_ife) |
| 3648 | return e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED, | 3628 | return e1e_wphy(hw, IFE_PHY_SPECIAL_CONTROL_LED, |
| 3649 | (IFE_PSCL_PROBE_MODE | IFE_PSCL_PROBE_LEDS_OFF)); | 3629 | (IFE_PSCL_PROBE_MODE | |
| 3630 | IFE_PSCL_PROBE_LEDS_OFF)); | ||
| 3650 | 3631 | ||
| 3651 | ew32(LEDCTL, hw->mac.ledctl_mode1); | 3632 | ew32(LEDCTL, hw->mac.ledctl_mode1); |
| 3652 | return 0; | 3633 | return 0; |
| @@ -3660,8 +3641,7 @@ static s32 e1000_led_off_ich8lan(struct e1000_hw *hw) | |||
| 3660 | **/ | 3641 | **/ |
| 3661 | static s32 e1000_setup_led_pchlan(struct e1000_hw *hw) | 3642 | static s32 e1000_setup_led_pchlan(struct e1000_hw *hw) |
| 3662 | { | 3643 | { |
| 3663 | return hw->phy.ops.write_reg(hw, HV_LED_CONFIG, | 3644 | return e1e_wphy(hw, HV_LED_CONFIG, (u16)hw->mac.ledctl_mode1); |
| 3664 | (u16)hw->mac.ledctl_mode1); | ||
| 3665 | } | 3645 | } |
| 3666 | 3646 | ||
| 3667 | /** | 3647 | /** |
| @@ -3672,8 +3652,7 @@ static s32 e1000_setup_led_pchlan(struct e1000_hw *hw) | |||
| 3672 | **/ | 3652 | **/ |
| 3673 | static s32 e1000_cleanup_led_pchlan(struct e1000_hw *hw) | 3653 | static s32 e1000_cleanup_led_pchlan(struct e1000_hw *hw) |
| 3674 | { | 3654 | { |
| 3675 | return hw->phy.ops.write_reg(hw, HV_LED_CONFIG, | 3655 | return e1e_wphy(hw, HV_LED_CONFIG, (u16)hw->mac.ledctl_default); |
| 3676 | (u16)hw->mac.ledctl_default); | ||
| 3677 | } | 3656 | } |
| 3678 | 3657 | ||
| 3679 | /** | 3658 | /** |
| @@ -3704,7 +3683,7 @@ static s32 e1000_led_on_pchlan(struct e1000_hw *hw) | |||
| 3704 | } | 3683 | } |
| 3705 | } | 3684 | } |
| 3706 | 3685 | ||
| 3707 | return hw->phy.ops.write_reg(hw, HV_LED_CONFIG, data); | 3686 | return e1e_wphy(hw, HV_LED_CONFIG, data); |
| 3708 | } | 3687 | } |
| 3709 | 3688 | ||
| 3710 | /** | 3689 | /** |
| @@ -3735,7 +3714,7 @@ static s32 e1000_led_off_pchlan(struct e1000_hw *hw) | |||
| 3735 | } | 3714 | } |
| 3736 | } | 3715 | } |
| 3737 | 3716 | ||
| 3738 | return hw->phy.ops.write_reg(hw, HV_LED_CONFIG, data); | 3717 | return e1e_wphy(hw, HV_LED_CONFIG, data); |
| 3739 | } | 3718 | } |
| 3740 | 3719 | ||
| 3741 | /** | 3720 | /** |
| @@ -3844,20 +3823,20 @@ static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw) | |||
| 3844 | if ((hw->phy.type == e1000_phy_82578) || | 3823 | if ((hw->phy.type == e1000_phy_82578) || |
| 3845 | (hw->phy.type == e1000_phy_82579) || | 3824 | (hw->phy.type == e1000_phy_82579) || |
| 3846 | (hw->phy.type == e1000_phy_82577)) { | 3825 | (hw->phy.type == e1000_phy_82577)) { |
| 3847 | hw->phy.ops.read_reg(hw, HV_SCC_UPPER, &phy_data); | 3826 | e1e_rphy(hw, HV_SCC_UPPER, &phy_data); |
| 3848 | hw->phy.ops.read_reg(hw, HV_SCC_LOWER, &phy_data); | 3827 | e1e_rphy(hw, HV_SCC_LOWER, &phy_data); |
| 3849 | hw->phy.ops.read_reg(hw, HV_ECOL_UPPER, &phy_data); | 3828 | e1e_rphy(hw, HV_ECOL_UPPER, &phy_data); |
| 3850 | hw->phy.ops.read_reg(hw, HV_ECOL_LOWER, &phy_data); | 3829 | e1e_rphy(hw, HV_ECOL_LOWER, &phy_data); |
| 3851 | hw->phy.ops.read_reg(hw, HV_MCC_UPPER, &phy_data); | 3830 | e1e_rphy(hw, HV_MCC_UPPER, &phy_data); |
| 3852 | hw->phy.ops.read_reg(hw, HV_MCC_LOWER, &phy_data); | 3831 | e1e_rphy(hw, HV_MCC_LOWER, &phy_data); |
| 3853 | hw->phy.ops.read_reg(hw, HV_LATECOL_UPPER, &phy_data); | 3832 | e1e_rphy(hw, HV_LATECOL_UPPER, &phy_data); |
| 3854 | hw->phy.ops.read_reg(hw, HV_LATECOL_LOWER, &phy_data); | 3833 | e1e_rphy(hw, HV_LATECOL_LOWER, &phy_data); |
| 3855 | hw->phy.ops.read_reg(hw, HV_COLC_UPPER, &phy_data); | 3834 | e1e_rphy(hw, HV_COLC_UPPER, &phy_data); |
| 3856 | hw->phy.ops.read_reg(hw, HV_COLC_LOWER, &phy_data); | 3835 | e1e_rphy(hw, HV_COLC_LOWER, &phy_data); |
| 3857 | hw->phy.ops.read_reg(hw, HV_DC_UPPER, &phy_data); | 3836 | e1e_rphy(hw, HV_DC_UPPER, &phy_data); |
| 3858 | hw->phy.ops.read_reg(hw, HV_DC_LOWER, &phy_data); | 3837 | e1e_rphy(hw, HV_DC_LOWER, &phy_data); |
| 3859 | hw->phy.ops.read_reg(hw, HV_TNCRS_UPPER, &phy_data); | 3838 | e1e_rphy(hw, HV_TNCRS_UPPER, &phy_data); |
| 3860 | hw->phy.ops.read_reg(hw, HV_TNCRS_LOWER, &phy_data); | 3839 | e1e_rphy(hw, HV_TNCRS_LOWER, &phy_data); |
| 3861 | } | 3840 | } |
| 3862 | } | 3841 | } |
| 3863 | 3842 | ||
diff --git a/drivers/net/e1000e/lib.c b/drivers/net/e1000e/lib.c index 7e55170a601e..ff2872153b21 100644 --- a/drivers/net/e1000e/lib.c +++ b/drivers/net/e1000e/lib.c | |||
| @@ -1135,7 +1135,8 @@ s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw) | |||
| 1135 | ret_val = e1e_rphy(hw, PHY_AUTONEG_ADV, &mii_nway_adv_reg); | 1135 | ret_val = e1e_rphy(hw, PHY_AUTONEG_ADV, &mii_nway_adv_reg); |
| 1136 | if (ret_val) | 1136 | if (ret_val) |
| 1137 | return ret_val; | 1137 | return ret_val; |
| 1138 | ret_val = e1e_rphy(hw, PHY_LP_ABILITY, &mii_nway_lp_ability_reg); | 1138 | ret_val = |
| 1139 | e1e_rphy(hw, PHY_LP_ABILITY, &mii_nway_lp_ability_reg); | ||
| 1139 | if (ret_val) | 1140 | if (ret_val) |
| 1140 | return ret_val; | 1141 | return ret_val; |
| 1141 | 1142 | ||
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index fe50242aa9e6..fa5b60452547 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -1980,15 +1980,15 @@ static void e1000_irq_enable(struct e1000_adapter *adapter) | |||
| 1980 | } | 1980 | } |
| 1981 | 1981 | ||
| 1982 | /** | 1982 | /** |
| 1983 | * e1000_get_hw_control - get control of the h/w from f/w | 1983 | * e1000e_get_hw_control - get control of the h/w from f/w |
| 1984 | * @adapter: address of board private structure | 1984 | * @adapter: address of board private structure |
| 1985 | * | 1985 | * |
| 1986 | * e1000_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit. | 1986 | * e1000e_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit. |
| 1987 | * For ASF and Pass Through versions of f/w this means that | 1987 | * For ASF and Pass Through versions of f/w this means that |
| 1988 | * the driver is loaded. For AMT version (only with 82573) | 1988 | * the driver is loaded. For AMT version (only with 82573) |
| 1989 | * of the f/w this means that the network i/f is open. | 1989 | * of the f/w this means that the network i/f is open. |
| 1990 | **/ | 1990 | **/ |
| 1991 | static void e1000_get_hw_control(struct e1000_adapter *adapter) | 1991 | void e1000e_get_hw_control(struct e1000_adapter *adapter) |
| 1992 | { | 1992 | { |
| 1993 | struct e1000_hw *hw = &adapter->hw; | 1993 | struct e1000_hw *hw = &adapter->hw; |
| 1994 | u32 ctrl_ext; | 1994 | u32 ctrl_ext; |
| @@ -2005,16 +2005,16 @@ static void e1000_get_hw_control(struct e1000_adapter *adapter) | |||
| 2005 | } | 2005 | } |
| 2006 | 2006 | ||
| 2007 | /** | 2007 | /** |
| 2008 | * e1000_release_hw_control - release control of the h/w to f/w | 2008 | * e1000e_release_hw_control - release control of the h/w to f/w |
| 2009 | * @adapter: address of board private structure | 2009 | * @adapter: address of board private structure |
| 2010 | * | 2010 | * |
| 2011 | * e1000_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit. | 2011 | * e1000e_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit. |
| 2012 | * For ASF and Pass Through versions of f/w this means that the | 2012 | * For ASF and Pass Through versions of f/w this means that the |
| 2013 | * driver is no longer loaded. For AMT version (only with 82573) i | 2013 | * driver is no longer loaded. For AMT version (only with 82573) i |
| 2014 | * of the f/w this means that the network i/f is closed. | 2014 | * of the f/w this means that the network i/f is closed. |
| 2015 | * | 2015 | * |
| 2016 | **/ | 2016 | **/ |
| 2017 | static void e1000_release_hw_control(struct e1000_adapter *adapter) | 2017 | void e1000e_release_hw_control(struct e1000_adapter *adapter) |
| 2018 | { | 2018 | { |
| 2019 | struct e1000_hw *hw = &adapter->hw; | 2019 | struct e1000_hw *hw = &adapter->hw; |
| 2020 | u32 ctrl_ext; | 2020 | u32 ctrl_ext; |
| @@ -2445,7 +2445,7 @@ static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | |||
| 2445 | E1000_MNG_DHCP_COOKIE_STATUS_VLAN) && | 2445 | E1000_MNG_DHCP_COOKIE_STATUS_VLAN) && |
| 2446 | (vid == adapter->mng_vlan_id)) { | 2446 | (vid == adapter->mng_vlan_id)) { |
| 2447 | /* release control to f/w */ | 2447 | /* release control to f/w */ |
| 2448 | e1000_release_hw_control(adapter); | 2448 | e1000e_release_hw_control(adapter); |
| 2449 | return; | 2449 | return; |
| 2450 | } | 2450 | } |
| 2451 | 2451 | ||
| @@ -2734,6 +2734,9 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) | |||
| 2734 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); | 2734 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); |
| 2735 | else | 2735 | else |
| 2736 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); | 2736 | ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); |
| 2737 | |||
| 2738 | if (ret_val) | ||
| 2739 | e_dbg("failed to enable jumbo frame workaround mode\n"); | ||
| 2737 | } | 2740 | } |
| 2738 | 2741 | ||
| 2739 | /* Program MC offset vector base */ | 2742 | /* Program MC offset vector base */ |
| @@ -3184,7 +3187,6 @@ void e1000e_reset(struct e1000_adapter *adapter) | |||
| 3184 | ew32(PBA, pba); | 3187 | ew32(PBA, pba); |
| 3185 | } | 3188 | } |
| 3186 | 3189 | ||
| 3187 | |||
| 3188 | /* | 3190 | /* |
| 3189 | * flow control settings | 3191 | * flow control settings |
| 3190 | * | 3192 | * |
| @@ -3272,7 +3274,7 @@ void e1000e_reset(struct e1000_adapter *adapter) | |||
| 3272 | * that the network interface is in control | 3274 | * that the network interface is in control |
| 3273 | */ | 3275 | */ |
| 3274 | if (adapter->flags & FLAG_HAS_AMT) | 3276 | if (adapter->flags & FLAG_HAS_AMT) |
| 3275 | e1000_get_hw_control(adapter); | 3277 | e1000e_get_hw_control(adapter); |
| 3276 | 3278 | ||
| 3277 | ew32(WUC, 0); | 3279 | ew32(WUC, 0); |
| 3278 | 3280 | ||
| @@ -3285,6 +3287,13 @@ void e1000e_reset(struct e1000_adapter *adapter) | |||
| 3285 | ew32(VET, ETH_P_8021Q); | 3287 | ew32(VET, ETH_P_8021Q); |
| 3286 | 3288 | ||
| 3287 | e1000e_reset_adaptive(hw); | 3289 | e1000e_reset_adaptive(hw); |
| 3290 | |||
| 3291 | if (!netif_running(adapter->netdev) && | ||
| 3292 | !test_bit(__E1000_TESTING, &adapter->state)) { | ||
| 3293 | e1000_power_down_phy(adapter); | ||
| 3294 | return; | ||
| 3295 | } | ||
| 3296 | |||
| 3288 | e1000_get_phy_info(hw); | 3297 | e1000_get_phy_info(hw); |
| 3289 | 3298 | ||
| 3290 | if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) && | 3299 | if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) && |
| @@ -3570,7 +3579,7 @@ static int e1000_open(struct net_device *netdev) | |||
| 3570 | * interface is now open and reset the part to a known state. | 3579 | * interface is now open and reset the part to a known state. |
| 3571 | */ | 3580 | */ |
| 3572 | if (adapter->flags & FLAG_HAS_AMT) { | 3581 | if (adapter->flags & FLAG_HAS_AMT) { |
| 3573 | e1000_get_hw_control(adapter); | 3582 | e1000e_get_hw_control(adapter); |
| 3574 | e1000e_reset(adapter); | 3583 | e1000e_reset(adapter); |
| 3575 | } | 3584 | } |
| 3576 | 3585 | ||
| @@ -3634,7 +3643,7 @@ static int e1000_open(struct net_device *netdev) | |||
| 3634 | return 0; | 3643 | return 0; |
| 3635 | 3644 | ||
| 3636 | err_req_irq: | 3645 | err_req_irq: |
| 3637 | e1000_release_hw_control(adapter); | 3646 | e1000e_release_hw_control(adapter); |
| 3638 | e1000_power_down_phy(adapter); | 3647 | e1000_power_down_phy(adapter); |
| 3639 | e1000e_free_rx_resources(adapter); | 3648 | e1000e_free_rx_resources(adapter); |
| 3640 | err_setup_rx: | 3649 | err_setup_rx: |
| @@ -3689,8 +3698,9 @@ static int e1000_close(struct net_device *netdev) | |||
| 3689 | * If AMT is enabled, let the firmware know that the network | 3698 | * If AMT is enabled, let the firmware know that the network |
| 3690 | * interface is now closed | 3699 | * interface is now closed |
| 3691 | */ | 3700 | */ |
| 3692 | if (adapter->flags & FLAG_HAS_AMT) | 3701 | if ((adapter->flags & FLAG_HAS_AMT) && |
| 3693 | e1000_release_hw_control(adapter); | 3702 | !test_bit(__E1000_TESTING, &adapter->state)) |
| 3703 | e1000e_release_hw_control(adapter); | ||
| 3694 | 3704 | ||
| 3695 | if ((adapter->flags & FLAG_HAS_ERT) || | 3705 | if ((adapter->flags & FLAG_HAS_ERT) || |
| 3696 | (adapter->hw.mac.type == e1000_pch2lan)) | 3706 | (adapter->hw.mac.type == e1000_pch2lan)) |
| @@ -5209,7 +5219,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake, | |||
| 5209 | * Release control of h/w to f/w. If f/w is AMT enabled, this | 5219 | * Release control of h/w to f/w. If f/w is AMT enabled, this |
| 5210 | * would have already happened in close and is redundant. | 5220 | * would have already happened in close and is redundant. |
| 5211 | */ | 5221 | */ |
| 5212 | e1000_release_hw_control(adapter); | 5222 | e1000e_release_hw_control(adapter); |
| 5213 | 5223 | ||
| 5214 | pci_disable_device(pdev); | 5224 | pci_disable_device(pdev); |
| 5215 | 5225 | ||
| @@ -5366,7 +5376,7 @@ static int __e1000_resume(struct pci_dev *pdev) | |||
| 5366 | * under the control of the driver. | 5376 | * under the control of the driver. |
| 5367 | */ | 5377 | */ |
| 5368 | if (!(adapter->flags & FLAG_HAS_AMT)) | 5378 | if (!(adapter->flags & FLAG_HAS_AMT)) |
| 5369 | e1000_get_hw_control(adapter); | 5379 | e1000e_get_hw_control(adapter); |
| 5370 | 5380 | ||
| 5371 | return 0; | 5381 | return 0; |
| 5372 | } | 5382 | } |
| @@ -5613,7 +5623,7 @@ static void e1000_io_resume(struct pci_dev *pdev) | |||
| 5613 | * under the control of the driver. | 5623 | * under the control of the driver. |
| 5614 | */ | 5624 | */ |
| 5615 | if (!(adapter->flags & FLAG_HAS_AMT)) | 5625 | if (!(adapter->flags & FLAG_HAS_AMT)) |
| 5616 | e1000_get_hw_control(adapter); | 5626 | e1000e_get_hw_control(adapter); |
| 5617 | 5627 | ||
| 5618 | } | 5628 | } |
| 5619 | 5629 | ||
| @@ -5636,7 +5646,7 @@ static void e1000_print_device_info(struct e1000_adapter *adapter) | |||
| 5636 | ret_val = e1000_read_pba_string_generic(hw, pba_str, | 5646 | ret_val = e1000_read_pba_string_generic(hw, pba_str, |
| 5637 | E1000_PBANUM_LENGTH); | 5647 | E1000_PBANUM_LENGTH); |
| 5638 | if (ret_val) | 5648 | if (ret_val) |
| 5639 | strcpy(pba_str, "Unknown"); | 5649 | strncpy((char *)pba_str, "Unknown", sizeof(pba_str) - 1); |
| 5640 | e_info("MAC: %d, PHY: %d, PBA No: %s\n", | 5650 | e_info("MAC: %d, PHY: %d, PBA No: %s\n", |
| 5641 | hw->mac.type, hw->phy.type, pba_str); | 5651 | hw->mac.type, hw->phy.type, pba_str); |
| 5642 | } | 5652 | } |
| @@ -5963,9 +5973,9 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 5963 | * under the control of the driver. | 5973 | * under the control of the driver. |
| 5964 | */ | 5974 | */ |
| 5965 | if (!(adapter->flags & FLAG_HAS_AMT)) | 5975 | if (!(adapter->flags & FLAG_HAS_AMT)) |
| 5966 | e1000_get_hw_control(adapter); | 5976 | e1000e_get_hw_control(adapter); |
| 5967 | 5977 | ||
| 5968 | strcpy(netdev->name, "eth%d"); | 5978 | strncpy(netdev->name, "eth%d", sizeof(netdev->name) - 1); |
| 5969 | err = register_netdev(netdev); | 5979 | err = register_netdev(netdev); |
| 5970 | if (err) | 5980 | if (err) |
| 5971 | goto err_register; | 5981 | goto err_register; |
| @@ -5982,12 +5992,11 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 5982 | 5992 | ||
| 5983 | err_register: | 5993 | err_register: |
| 5984 | if (!(adapter->flags & FLAG_HAS_AMT)) | 5994 | if (!(adapter->flags & FLAG_HAS_AMT)) |
| 5985 | e1000_release_hw_control(adapter); | 5995 | e1000e_release_hw_control(adapter); |
| 5986 | err_eeprom: | 5996 | err_eeprom: |
| 5987 | if (!e1000_check_reset_block(&adapter->hw)) | 5997 | if (!e1000_check_reset_block(&adapter->hw)) |
| 5988 | e1000_phy_hw_reset(&adapter->hw); | 5998 | e1000_phy_hw_reset(&adapter->hw); |
| 5989 | err_hw_init: | 5999 | err_hw_init: |
| 5990 | |||
| 5991 | kfree(adapter->tx_ring); | 6000 | kfree(adapter->tx_ring); |
| 5992 | kfree(adapter->rx_ring); | 6001 | kfree(adapter->rx_ring); |
| 5993 | err_sw_init: | 6002 | err_sw_init: |
| @@ -6053,7 +6062,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev) | |||
| 6053 | * Release control of h/w to f/w. If f/w is AMT enabled, this | 6062 | * Release control of h/w to f/w. If f/w is AMT enabled, this |
| 6054 | * would have already happened in close and is redundant. | 6063 | * would have already happened in close and is redundant. |
| 6055 | */ | 6064 | */ |
| 6056 | e1000_release_hw_control(adapter); | 6065 | e1000e_release_hw_control(adapter); |
| 6057 | 6066 | ||
| 6058 | e1000e_reset_interrupt_capability(adapter); | 6067 | e1000e_reset_interrupt_capability(adapter); |
| 6059 | kfree(adapter->tx_ring); | 6068 | kfree(adapter->tx_ring); |
diff --git a/drivers/net/e1000e/phy.c b/drivers/net/e1000e/phy.c index 1781efeb55e3..a640f1c369ae 100644 --- a/drivers/net/e1000e/phy.c +++ b/drivers/net/e1000e/phy.c | |||
| @@ -637,12 +637,11 @@ s32 e1000e_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data) | |||
| 637 | **/ | 637 | **/ |
| 638 | s32 e1000_copper_link_setup_82577(struct e1000_hw *hw) | 638 | s32 e1000_copper_link_setup_82577(struct e1000_hw *hw) |
| 639 | { | 639 | { |
| 640 | struct e1000_phy_info *phy = &hw->phy; | ||
| 641 | s32 ret_val; | 640 | s32 ret_val; |
| 642 | u16 phy_data; | 641 | u16 phy_data; |
| 643 | 642 | ||
| 644 | /* Enable CRS on TX. This must be set for half-duplex operation. */ | 643 | /* Enable CRS on TX. This must be set for half-duplex operation. */ |
| 645 | ret_val = phy->ops.read_reg(hw, I82577_CFG_REG, &phy_data); | 644 | ret_val = e1e_rphy(hw, I82577_CFG_REG, &phy_data); |
| 646 | if (ret_val) | 645 | if (ret_val) |
| 647 | goto out; | 646 | goto out; |
| 648 | 647 | ||
| @@ -651,7 +650,7 @@ s32 e1000_copper_link_setup_82577(struct e1000_hw *hw) | |||
| 651 | /* Enable downshift */ | 650 | /* Enable downshift */ |
| 652 | phy_data |= I82577_CFG_ENABLE_DOWNSHIFT; | 651 | phy_data |= I82577_CFG_ENABLE_DOWNSHIFT; |
| 653 | 652 | ||
| 654 | ret_val = phy->ops.write_reg(hw, I82577_CFG_REG, phy_data); | 653 | ret_val = e1e_wphy(hw, I82577_CFG_REG, phy_data); |
| 655 | 654 | ||
| 656 | out: | 655 | out: |
| 657 | return ret_val; | 656 | return ret_val; |
| @@ -774,16 +773,14 @@ s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw) | |||
| 774 | } | 773 | } |
| 775 | 774 | ||
| 776 | if (phy->type == e1000_phy_82578) { | 775 | if (phy->type == e1000_phy_82578) { |
| 777 | ret_val = phy->ops.read_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, | 776 | ret_val = e1e_rphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, &phy_data); |
| 778 | &phy_data); | ||
| 779 | if (ret_val) | 777 | if (ret_val) |
| 780 | return ret_val; | 778 | return ret_val; |
| 781 | 779 | ||
| 782 | /* 82578 PHY - set the downshift count to 1x. */ | 780 | /* 82578 PHY - set the downshift count to 1x. */ |
| 783 | phy_data |= I82578_EPSCR_DOWNSHIFT_ENABLE; | 781 | phy_data |= I82578_EPSCR_DOWNSHIFT_ENABLE; |
| 784 | phy_data &= ~I82578_EPSCR_DOWNSHIFT_COUNTER_MASK; | 782 | phy_data &= ~I82578_EPSCR_DOWNSHIFT_COUNTER_MASK; |
| 785 | ret_val = phy->ops.write_reg(hw, M88E1000_EXT_PHY_SPEC_CTRL, | 783 | ret_val = e1e_wphy(hw, M88E1000_EXT_PHY_SPEC_CTRL, phy_data); |
| 786 | phy_data); | ||
| 787 | if (ret_val) | 784 | if (ret_val) |
| 788 | return ret_val; | 785 | return ret_val; |
| 789 | } | 786 | } |
| @@ -1319,9 +1316,8 @@ s32 e1000e_phy_force_speed_duplex_m88(struct e1000_hw *hw) | |||
| 1319 | * We didn't get link. | 1316 | * We didn't get link. |
| 1320 | * Reset the DSP and cross our fingers. | 1317 | * Reset the DSP and cross our fingers. |
| 1321 | */ | 1318 | */ |
| 1322 | ret_val = e1e_wphy(hw, | 1319 | ret_val = e1e_wphy(hw, M88E1000_PHY_PAGE_SELECT, |
| 1323 | M88E1000_PHY_PAGE_SELECT, | 1320 | 0x001d); |
| 1324 | 0x001d); | ||
| 1325 | if (ret_val) | 1321 | if (ret_val) |
| 1326 | return ret_val; | 1322 | return ret_val; |
| 1327 | ret_val = e1000e_phy_reset_dsp(hw); | 1323 | ret_val = e1000e_phy_reset_dsp(hw); |
| @@ -3071,12 +3067,12 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw) | |||
| 3071 | goto out; | 3067 | goto out; |
| 3072 | 3068 | ||
| 3073 | /* Do not apply workaround if in PHY loopback bit 14 set */ | 3069 | /* Do not apply workaround if in PHY loopback bit 14 set */ |
| 3074 | hw->phy.ops.read_reg(hw, PHY_CONTROL, &data); | 3070 | e1e_rphy(hw, PHY_CONTROL, &data); |
| 3075 | if (data & PHY_CONTROL_LB) | 3071 | if (data & PHY_CONTROL_LB) |
| 3076 | goto out; | 3072 | goto out; |
| 3077 | 3073 | ||
| 3078 | /* check if link is up and at 1Gbps */ | 3074 | /* check if link is up and at 1Gbps */ |
| 3079 | ret_val = hw->phy.ops.read_reg(hw, BM_CS_STATUS, &data); | 3075 | ret_val = e1e_rphy(hw, BM_CS_STATUS, &data); |
| 3080 | if (ret_val) | 3076 | if (ret_val) |
| 3081 | goto out; | 3077 | goto out; |
| 3082 | 3078 | ||
| @@ -3092,14 +3088,12 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw) | |||
| 3092 | mdelay(200); | 3088 | mdelay(200); |
| 3093 | 3089 | ||
| 3094 | /* flush the packets in the fifo buffer */ | 3090 | /* flush the packets in the fifo buffer */ |
| 3095 | ret_val = hw->phy.ops.write_reg(hw, HV_MUX_DATA_CTRL, | 3091 | ret_val = e1e_wphy(hw, HV_MUX_DATA_CTRL, HV_MUX_DATA_CTRL_GEN_TO_MAC | |
| 3096 | HV_MUX_DATA_CTRL_GEN_TO_MAC | | 3092 | HV_MUX_DATA_CTRL_FORCE_SPEED); |
| 3097 | HV_MUX_DATA_CTRL_FORCE_SPEED); | ||
| 3098 | if (ret_val) | 3093 | if (ret_val) |
| 3099 | goto out; | 3094 | goto out; |
| 3100 | 3095 | ||
| 3101 | ret_val = hw->phy.ops.write_reg(hw, HV_MUX_DATA_CTRL, | 3096 | ret_val = e1e_wphy(hw, HV_MUX_DATA_CTRL, HV_MUX_DATA_CTRL_GEN_TO_MAC); |
| 3102 | HV_MUX_DATA_CTRL_GEN_TO_MAC); | ||
| 3103 | 3097 | ||
| 3104 | out: | 3098 | out: |
| 3105 | return ret_val; | 3099 | return ret_val; |
| @@ -3119,7 +3113,7 @@ s32 e1000_check_polarity_82577(struct e1000_hw *hw) | |||
| 3119 | s32 ret_val; | 3113 | s32 ret_val; |
| 3120 | u16 data; | 3114 | u16 data; |
| 3121 | 3115 | ||
| 3122 | ret_val = phy->ops.read_reg(hw, I82577_PHY_STATUS_2, &data); | 3116 | ret_val = e1e_rphy(hw, I82577_PHY_STATUS_2, &data); |
| 3123 | 3117 | ||
| 3124 | if (!ret_val) | 3118 | if (!ret_val) |
| 3125 | phy->cable_polarity = (data & I82577_PHY_STATUS2_REV_POLARITY) | 3119 | phy->cable_polarity = (data & I82577_PHY_STATUS2_REV_POLARITY) |
| @@ -3142,13 +3136,13 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw) | |||
| 3142 | u16 phy_data; | 3136 | u16 phy_data; |
| 3143 | bool link; | 3137 | bool link; |
| 3144 | 3138 | ||
| 3145 | ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_data); | 3139 | ret_val = e1e_rphy(hw, PHY_CONTROL, &phy_data); |
| 3146 | if (ret_val) | 3140 | if (ret_val) |
| 3147 | goto out; | 3141 | goto out; |
| 3148 | 3142 | ||
| 3149 | e1000e_phy_force_speed_duplex_setup(hw, &phy_data); | 3143 | e1000e_phy_force_speed_duplex_setup(hw, &phy_data); |
| 3150 | 3144 | ||
| 3151 | ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_data); | 3145 | ret_val = e1e_wphy(hw, PHY_CONTROL, phy_data); |
| 3152 | if (ret_val) | 3146 | if (ret_val) |
| 3153 | goto out; | 3147 | goto out; |
| 3154 | 3148 | ||
| @@ -3212,7 +3206,7 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw) | |||
| 3212 | if (ret_val) | 3206 | if (ret_val) |
| 3213 | goto out; | 3207 | goto out; |
| 3214 | 3208 | ||
| 3215 | ret_val = phy->ops.read_reg(hw, I82577_PHY_STATUS_2, &data); | 3209 | ret_val = e1e_rphy(hw, I82577_PHY_STATUS_2, &data); |
| 3216 | if (ret_val) | 3210 | if (ret_val) |
| 3217 | goto out; | 3211 | goto out; |
| 3218 | 3212 | ||
| @@ -3224,7 +3218,7 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw) | |||
| 3224 | if (ret_val) | 3218 | if (ret_val) |
| 3225 | goto out; | 3219 | goto out; |
| 3226 | 3220 | ||
| 3227 | ret_val = phy->ops.read_reg(hw, PHY_1000T_STATUS, &data); | 3221 | ret_val = e1e_rphy(hw, PHY_1000T_STATUS, &data); |
| 3228 | if (ret_val) | 3222 | if (ret_val) |
| 3229 | goto out; | 3223 | goto out; |
| 3230 | 3224 | ||
| @@ -3258,7 +3252,7 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw) | |||
| 3258 | s32 ret_val; | 3252 | s32 ret_val; |
| 3259 | u16 phy_data, length; | 3253 | u16 phy_data, length; |
| 3260 | 3254 | ||
| 3261 | ret_val = phy->ops.read_reg(hw, I82577_PHY_DIAG_STATUS, &phy_data); | 3255 | ret_val = e1e_rphy(hw, I82577_PHY_DIAG_STATUS, &phy_data); |
| 3262 | if (ret_val) | 3256 | if (ret_val) |
| 3263 | goto out; | 3257 | goto out; |
| 3264 | 3258 | ||
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index a724a2d14506..6c7257bd73fc 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
| 41 | 41 | ||
| 42 | #define DRV_NAME "ehea" | 42 | #define DRV_NAME "ehea" |
| 43 | #define DRV_VERSION "EHEA_0106" | 43 | #define DRV_VERSION "EHEA_0107" |
| 44 | 44 | ||
| 45 | /* eHEA capability flags */ | 45 | /* eHEA capability flags */ |
| 46 | #define DLPAR_PORT_ADD_REM 1 | 46 | #define DLPAR_PORT_ADD_REM 1 |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 1032b5bbe238..f75d3144b8a5 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
| @@ -437,7 +437,7 @@ static void ehea_init_fill_rq1(struct ehea_port_res *pr, int nr_rq1a) | |||
| 437 | } | 437 | } |
| 438 | } | 438 | } |
| 439 | /* Ring doorbell */ | 439 | /* Ring doorbell */ |
| 440 | ehea_update_rq1a(pr->qp, i); | 440 | ehea_update_rq1a(pr->qp, i - 1); |
| 441 | } | 441 | } |
| 442 | 442 | ||
| 443 | static int ehea_refill_rq_def(struct ehea_port_res *pr, | 443 | static int ehea_refill_rq_def(struct ehea_port_res *pr, |
| @@ -1329,9 +1329,7 @@ static int ehea_fill_port_res(struct ehea_port_res *pr) | |||
| 1329 | int ret; | 1329 | int ret; |
| 1330 | struct ehea_qp_init_attr *init_attr = &pr->qp->init_attr; | 1330 | struct ehea_qp_init_attr *init_attr = &pr->qp->init_attr; |
| 1331 | 1331 | ||
| 1332 | ehea_init_fill_rq1(pr, init_attr->act_nr_rwqes_rq1 | 1332 | ehea_init_fill_rq1(pr, pr->rq1_skba.len); |
| 1333 | - init_attr->act_nr_rwqes_rq2 | ||
| 1334 | - init_attr->act_nr_rwqes_rq3 - 1); | ||
| 1335 | 1333 | ||
| 1336 | ret = ehea_refill_rq2(pr, init_attr->act_nr_rwqes_rq2 - 1); | 1334 | ret = ehea_refill_rq2(pr, init_attr->act_nr_rwqes_rq2 - 1); |
| 1337 | 1335 | ||
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index cce32d43175f..2a71373719ae 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
| @@ -17,6 +17,8 @@ | |||
| 17 | * | 17 | * |
| 18 | * Bug fixes and cleanup by Philippe De Muyter (phdm@macqel.be) | 18 | * Bug fixes and cleanup by Philippe De Muyter (phdm@macqel.be) |
| 19 | * Copyright (c) 2004-2006 Macq Electronique SA. | 19 | * Copyright (c) 2004-2006 Macq Electronique SA. |
| 20 | * | ||
| 21 | * Copyright (C) 2010 Freescale Semiconductor, Inc. | ||
| 20 | */ | 22 | */ |
| 21 | 23 | ||
| 22 | #include <linux/module.h> | 24 | #include <linux/module.h> |
| @@ -45,29 +47,41 @@ | |||
| 45 | 47 | ||
| 46 | #include <asm/cacheflush.h> | 48 | #include <asm/cacheflush.h> |
| 47 | 49 | ||
| 48 | #ifndef CONFIG_ARCH_MXC | 50 | #ifndef CONFIG_ARM |
| 49 | #include <asm/coldfire.h> | 51 | #include <asm/coldfire.h> |
| 50 | #include <asm/mcfsim.h> | 52 | #include <asm/mcfsim.h> |
| 51 | #endif | 53 | #endif |
| 52 | 54 | ||
| 53 | #include "fec.h" | 55 | #include "fec.h" |
| 54 | 56 | ||
| 55 | #ifdef CONFIG_ARCH_MXC | 57 | #if defined(CONFIG_ARCH_MXC) || defined(CONFIG_SOC_IMX28) |
| 56 | #include <mach/hardware.h> | ||
| 57 | #define FEC_ALIGNMENT 0xf | 58 | #define FEC_ALIGNMENT 0xf |
| 58 | #else | 59 | #else |
| 59 | #define FEC_ALIGNMENT 0x3 | 60 | #define FEC_ALIGNMENT 0x3 |
| 60 | #endif | 61 | #endif |
| 61 | 62 | ||
| 62 | /* | 63 | #define DRIVER_NAME "fec" |
| 63 | * Define the fixed address of the FEC hardware. | 64 | |
| 64 | */ | 65 | /* Controller is ENET-MAC */ |
| 65 | #if defined(CONFIG_M5272) | 66 | #define FEC_QUIRK_ENET_MAC (1 << 0) |
| 67 | /* Controller needs driver to swap frame */ | ||
| 68 | #define FEC_QUIRK_SWAP_FRAME (1 << 1) | ||
| 66 | 69 | ||
| 67 | static unsigned char fec_mac_default[] = { | 70 | static struct platform_device_id fec_devtype[] = { |
| 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 71 | { |
| 72 | .name = DRIVER_NAME, | ||
| 73 | .driver_data = 0, | ||
| 74 | }, { | ||
| 75 | .name = "imx28-fec", | ||
| 76 | .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_SWAP_FRAME, | ||
| 77 | } | ||
| 69 | }; | 78 | }; |
| 70 | 79 | ||
| 80 | static unsigned char macaddr[ETH_ALEN]; | ||
| 81 | module_param_array(macaddr, byte, NULL, 0); | ||
| 82 | MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address"); | ||
| 83 | |||
| 84 | #if defined(CONFIG_M5272) | ||
| 71 | /* | 85 | /* |
| 72 | * Some hardware gets it MAC address out of local flash memory. | 86 | * Some hardware gets it MAC address out of local flash memory. |
| 73 | * if this is non-zero then assume it is the address to get MAC from. | 87 | * if this is non-zero then assume it is the address to get MAC from. |
| @@ -133,7 +147,8 @@ static unsigned char fec_mac_default[] = { | |||
| 133 | * account when setting it. | 147 | * account when setting it. |
| 134 | */ | 148 | */ |
| 135 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ | 149 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ |
| 136 | defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARCH_MXC) | 150 | defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ |
| 151 | defined(CONFIG_ARCH_MXC) || defined(CONFIG_SOC_IMX28) | ||
| 137 | #define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16) | 152 | #define OPT_FRAME_SIZE (PKT_MAXBUF_SIZE << 16) |
| 138 | #else | 153 | #else |
| 139 | #define OPT_FRAME_SIZE 0 | 154 | #define OPT_FRAME_SIZE 0 |
| @@ -186,7 +201,6 @@ struct fec_enet_private { | |||
| 186 | int mii_timeout; | 201 | int mii_timeout; |
| 187 | uint phy_speed; | 202 | uint phy_speed; |
| 188 | phy_interface_t phy_interface; | 203 | phy_interface_t phy_interface; |
| 189 | int index; | ||
| 190 | int link; | 204 | int link; |
| 191 | int full_duplex; | 205 | int full_duplex; |
| 192 | struct completion mdio_done; | 206 | struct completion mdio_done; |
| @@ -213,10 +227,23 @@ static void fec_stop(struct net_device *dev); | |||
| 213 | /* Transmitter timeout */ | 227 | /* Transmitter timeout */ |
| 214 | #define TX_TIMEOUT (2 * HZ) | 228 | #define TX_TIMEOUT (2 * HZ) |
| 215 | 229 | ||
| 230 | static void *swap_buffer(void *bufaddr, int len) | ||
| 231 | { | ||
| 232 | int i; | ||
| 233 | unsigned int *buf = bufaddr; | ||
| 234 | |||
| 235 | for (i = 0; i < (len + 3) / 4; i++, buf++) | ||
| 236 | *buf = cpu_to_be32(*buf); | ||
| 237 | |||
| 238 | return bufaddr; | ||
| 239 | } | ||
| 240 | |||
| 216 | static netdev_tx_t | 241 | static netdev_tx_t |
| 217 | fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) | 242 | fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) |
| 218 | { | 243 | { |
| 219 | struct fec_enet_private *fep = netdev_priv(dev); | 244 | struct fec_enet_private *fep = netdev_priv(dev); |
| 245 | const struct platform_device_id *id_entry = | ||
| 246 | platform_get_device_id(fep->pdev); | ||
| 220 | struct bufdesc *bdp; | 247 | struct bufdesc *bdp; |
| 221 | void *bufaddr; | 248 | void *bufaddr; |
| 222 | unsigned short status; | 249 | unsigned short status; |
| @@ -261,6 +288,14 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 261 | bufaddr = fep->tx_bounce[index]; | 288 | bufaddr = fep->tx_bounce[index]; |
| 262 | } | 289 | } |
| 263 | 290 | ||
| 291 | /* | ||
| 292 | * Some design made an incorrect assumption on endian mode of | ||
| 293 | * the system that it's running on. As the result, driver has to | ||
| 294 | * swap every frame going to and coming from the controller. | ||
| 295 | */ | ||
| 296 | if (id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) | ||
| 297 | swap_buffer(bufaddr, skb->len); | ||
| 298 | |||
| 264 | /* Save skb pointer */ | 299 | /* Save skb pointer */ |
| 265 | fep->tx_skbuff[fep->skb_cur] = skb; | 300 | fep->tx_skbuff[fep->skb_cur] = skb; |
| 266 | 301 | ||
| @@ -429,6 +464,8 @@ static void | |||
| 429 | fec_enet_rx(struct net_device *dev) | 464 | fec_enet_rx(struct net_device *dev) |
| 430 | { | 465 | { |
| 431 | struct fec_enet_private *fep = netdev_priv(dev); | 466 | struct fec_enet_private *fep = netdev_priv(dev); |
| 467 | const struct platform_device_id *id_entry = | ||
| 468 | platform_get_device_id(fep->pdev); | ||
| 432 | struct bufdesc *bdp; | 469 | struct bufdesc *bdp; |
| 433 | unsigned short status; | 470 | unsigned short status; |
| 434 | struct sk_buff *skb; | 471 | struct sk_buff *skb; |
| @@ -492,6 +529,9 @@ fec_enet_rx(struct net_device *dev) | |||
| 492 | dma_unmap_single(NULL, bdp->cbd_bufaddr, bdp->cbd_datlen, | 529 | dma_unmap_single(NULL, bdp->cbd_bufaddr, bdp->cbd_datlen, |
| 493 | DMA_FROM_DEVICE); | 530 | DMA_FROM_DEVICE); |
| 494 | 531 | ||
| 532 | if (id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) | ||
| 533 | swap_buffer(data, pkt_len); | ||
| 534 | |||
| 495 | /* This does 16 byte alignment, exactly what we need. | 535 | /* This does 16 byte alignment, exactly what we need. |
| 496 | * The packet length includes FCS, but we don't want to | 536 | * The packet length includes FCS, but we don't want to |
| 497 | * include that when passing upstream as it messes up | 537 | * include that when passing upstream as it messes up |
| @@ -538,37 +578,50 @@ rx_processing_done: | |||
| 538 | } | 578 | } |
| 539 | 579 | ||
| 540 | /* ------------------------------------------------------------------------- */ | 580 | /* ------------------------------------------------------------------------- */ |
| 541 | #ifdef CONFIG_M5272 | ||
| 542 | static void __inline__ fec_get_mac(struct net_device *dev) | 581 | static void __inline__ fec_get_mac(struct net_device *dev) |
| 543 | { | 582 | { |
| 544 | struct fec_enet_private *fep = netdev_priv(dev); | 583 | struct fec_enet_private *fep = netdev_priv(dev); |
| 584 | struct fec_platform_data *pdata = fep->pdev->dev.platform_data; | ||
| 545 | unsigned char *iap, tmpaddr[ETH_ALEN]; | 585 | unsigned char *iap, tmpaddr[ETH_ALEN]; |
| 546 | 586 | ||
| 547 | if (FEC_FLASHMAC) { | 587 | /* |
| 548 | /* | 588 | * try to get mac address in following order: |
| 549 | * Get MAC address from FLASH. | 589 | * |
| 550 | * If it is all 1's or 0's, use the default. | 590 | * 1) module parameter via kernel command line in form |
| 551 | */ | 591 | * fec.macaddr=0x00,0x04,0x9f,0x01,0x30,0xe0 |
| 552 | iap = (unsigned char *)FEC_FLASHMAC; | 592 | */ |
| 553 | if ((iap[0] == 0) && (iap[1] == 0) && (iap[2] == 0) && | 593 | iap = macaddr; |
| 554 | (iap[3] == 0) && (iap[4] == 0) && (iap[5] == 0)) | 594 | |
| 555 | iap = fec_mac_default; | 595 | /* |
| 556 | if ((iap[0] == 0xff) && (iap[1] == 0xff) && (iap[2] == 0xff) && | 596 | * 2) from flash or fuse (via platform data) |
| 557 | (iap[3] == 0xff) && (iap[4] == 0xff) && (iap[5] == 0xff)) | 597 | */ |
| 558 | iap = fec_mac_default; | 598 | if (!is_valid_ether_addr(iap)) { |
| 559 | } else { | 599 | #ifdef CONFIG_M5272 |
| 560 | *((unsigned long *) &tmpaddr[0]) = readl(fep->hwp + FEC_ADDR_LOW); | 600 | if (FEC_FLASHMAC) |
| 561 | *((unsigned short *) &tmpaddr[4]) = (readl(fep->hwp + FEC_ADDR_HIGH) >> 16); | 601 | iap = (unsigned char *)FEC_FLASHMAC; |
| 602 | #else | ||
| 603 | if (pdata) | ||
| 604 | memcpy(iap, pdata->mac, ETH_ALEN); | ||
| 605 | #endif | ||
| 606 | } | ||
| 607 | |||
| 608 | /* | ||
| 609 | * 3) FEC mac registers set by bootloader | ||
| 610 | */ | ||
| 611 | if (!is_valid_ether_addr(iap)) { | ||
| 612 | *((unsigned long *) &tmpaddr[0]) = | ||
| 613 | be32_to_cpu(readl(fep->hwp + FEC_ADDR_LOW)); | ||
| 614 | *((unsigned short *) &tmpaddr[4]) = | ||
| 615 | be16_to_cpu(readl(fep->hwp + FEC_ADDR_HIGH) >> 16); | ||
| 562 | iap = &tmpaddr[0]; | 616 | iap = &tmpaddr[0]; |
| 563 | } | 617 | } |
| 564 | 618 | ||
| 565 | memcpy(dev->dev_addr, iap, ETH_ALEN); | 619 | memcpy(dev->dev_addr, iap, ETH_ALEN); |
| 566 | 620 | ||
| 567 | /* Adjust MAC if using default MAC address */ | 621 | /* Adjust MAC if using macaddr */ |
| 568 | if (iap == fec_mac_default) | 622 | if (iap == macaddr) |
| 569 | dev->dev_addr[ETH_ALEN-1] = fec_mac_default[ETH_ALEN-1] + fep->index; | 623 | dev->dev_addr[ETH_ALEN-1] = macaddr[ETH_ALEN-1] + fep->pdev->id; |
| 570 | } | 624 | } |
| 571 | #endif | ||
| 572 | 625 | ||
| 573 | /* ------------------------------------------------------------------------- */ | 626 | /* ------------------------------------------------------------------------- */ |
| 574 | 627 | ||
| @@ -651,8 +704,8 @@ static int fec_enet_mdio_write(struct mii_bus *bus, int mii_id, int regnum, | |||
| 651 | fep->mii_timeout = 0; | 704 | fep->mii_timeout = 0; |
| 652 | init_completion(&fep->mdio_done); | 705 | init_completion(&fep->mdio_done); |
| 653 | 706 | ||
| 654 | /* start a read op */ | 707 | /* start a write op */ |
| 655 | writel(FEC_MMFR_ST | FEC_MMFR_OP_READ | | 708 | writel(FEC_MMFR_ST | FEC_MMFR_OP_WRITE | |
| 656 | FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(regnum) | | 709 | FEC_MMFR_PA(mii_id) | FEC_MMFR_RA(regnum) | |
| 657 | FEC_MMFR_TA | FEC_MMFR_DATA(value), | 710 | FEC_MMFR_TA | FEC_MMFR_DATA(value), |
| 658 | fep->hwp + FEC_MII_DATA); | 711 | fep->hwp + FEC_MII_DATA); |
| @@ -681,6 +734,7 @@ static int fec_enet_mii_probe(struct net_device *dev) | |||
| 681 | char mdio_bus_id[MII_BUS_ID_SIZE]; | 734 | char mdio_bus_id[MII_BUS_ID_SIZE]; |
| 682 | char phy_name[MII_BUS_ID_SIZE + 3]; | 735 | char phy_name[MII_BUS_ID_SIZE + 3]; |
| 683 | int phy_id; | 736 | int phy_id; |
| 737 | int dev_id = fep->pdev->id; | ||
| 684 | 738 | ||
| 685 | fep->phy_dev = NULL; | 739 | fep->phy_dev = NULL; |
| 686 | 740 | ||
| @@ -692,6 +746,8 @@ static int fec_enet_mii_probe(struct net_device *dev) | |||
| 692 | continue; | 746 | continue; |
| 693 | if (fep->mii_bus->phy_map[phy_id]->phy_id == 0) | 747 | if (fep->mii_bus->phy_map[phy_id]->phy_id == 0) |
| 694 | continue; | 748 | continue; |
| 749 | if (dev_id--) | ||
| 750 | continue; | ||
| 695 | strncpy(mdio_bus_id, fep->mii_bus->id, MII_BUS_ID_SIZE); | 751 | strncpy(mdio_bus_id, fep->mii_bus->id, MII_BUS_ID_SIZE); |
| 696 | break; | 752 | break; |
| 697 | } | 753 | } |
| @@ -729,10 +785,35 @@ static int fec_enet_mii_probe(struct net_device *dev) | |||
| 729 | 785 | ||
| 730 | static int fec_enet_mii_init(struct platform_device *pdev) | 786 | static int fec_enet_mii_init(struct platform_device *pdev) |
| 731 | { | 787 | { |
| 788 | static struct mii_bus *fec0_mii_bus; | ||
| 732 | struct net_device *dev = platform_get_drvdata(pdev); | 789 | struct net_device *dev = platform_get_drvdata(pdev); |
| 733 | struct fec_enet_private *fep = netdev_priv(dev); | 790 | struct fec_enet_private *fep = netdev_priv(dev); |
| 791 | const struct platform_device_id *id_entry = | ||
| 792 | platform_get_device_id(fep->pdev); | ||
| 734 | int err = -ENXIO, i; | 793 | int err = -ENXIO, i; |
| 735 | 794 | ||
| 795 | /* | ||
| 796 | * The dual fec interfaces are not equivalent with enet-mac. | ||
| 797 | * Here are the differences: | ||
| 798 | * | ||
| 799 | * - fec0 supports MII & RMII modes while fec1 only supports RMII | ||
| 800 | * - fec0 acts as the 1588 time master while fec1 is slave | ||
| 801 | * - external phys can only be configured by fec0 | ||
| 802 | * | ||
| 803 | * That is to say fec1 can not work independently. It only works | ||
| 804 | * when fec0 is working. The reason behind this design is that the | ||
| 805 | * second interface is added primarily for Switch mode. | ||
| 806 | * | ||
| 807 | * Because of the last point above, both phys are attached on fec0 | ||
| 808 | * mdio interface in board design, and need to be configured by | ||
| 809 | * fec0 mii_bus. | ||
| 810 | */ | ||
| 811 | if ((id_entry->driver_data & FEC_QUIRK_ENET_MAC) && pdev->id) { | ||
| 812 | /* fec1 uses fec0 mii_bus */ | ||
| 813 | fep->mii_bus = fec0_mii_bus; | ||
| 814 | return 0; | ||
| 815 | } | ||
| 816 | |||
| 736 | fep->mii_timeout = 0; | 817 | fep->mii_timeout = 0; |
| 737 | 818 | ||
| 738 | /* | 819 | /* |
| @@ -769,6 +850,10 @@ static int fec_enet_mii_init(struct platform_device *pdev) | |||
| 769 | if (mdiobus_register(fep->mii_bus)) | 850 | if (mdiobus_register(fep->mii_bus)) |
| 770 | goto err_out_free_mdio_irq; | 851 | goto err_out_free_mdio_irq; |
| 771 | 852 | ||
| 853 | /* save fec0 mii_bus */ | ||
| 854 | if (id_entry->driver_data & FEC_QUIRK_ENET_MAC) | ||
| 855 | fec0_mii_bus = fep->mii_bus; | ||
| 856 | |||
| 772 | return 0; | 857 | return 0; |
| 773 | 858 | ||
| 774 | err_out_free_mdio_irq: | 859 | err_out_free_mdio_irq: |
| @@ -1067,9 +1152,8 @@ static const struct net_device_ops fec_netdev_ops = { | |||
| 1067 | /* | 1152 | /* |
| 1068 | * XXX: We need to clean up on failure exits here. | 1153 | * XXX: We need to clean up on failure exits here. |
| 1069 | * | 1154 | * |
| 1070 | * index is only used in legacy code | ||
| 1071 | */ | 1155 | */ |
| 1072 | static int fec_enet_init(struct net_device *dev, int index) | 1156 | static int fec_enet_init(struct net_device *dev) |
| 1073 | { | 1157 | { |
| 1074 | struct fec_enet_private *fep = netdev_priv(dev); | 1158 | struct fec_enet_private *fep = netdev_priv(dev); |
| 1075 | struct bufdesc *cbd_base; | 1159 | struct bufdesc *cbd_base; |
| @@ -1086,26 +1170,11 @@ static int fec_enet_init(struct net_device *dev, int index) | |||
| 1086 | 1170 | ||
| 1087 | spin_lock_init(&fep->hw_lock); | 1171 | spin_lock_init(&fep->hw_lock); |
| 1088 | 1172 | ||
| 1089 | fep->index = index; | ||
| 1090 | fep->hwp = (void __iomem *)dev->base_addr; | 1173 | fep->hwp = (void __iomem *)dev->base_addr; |
| 1091 | fep->netdev = dev; | 1174 | fep->netdev = dev; |
| 1092 | 1175 | ||
| 1093 | /* Set the Ethernet address */ | 1176 | /* Get the Ethernet address */ |
| 1094 | #ifdef CONFIG_M5272 | ||
| 1095 | fec_get_mac(dev); | 1177 | fec_get_mac(dev); |
| 1096 | #else | ||
| 1097 | { | ||
| 1098 | unsigned long l; | ||
| 1099 | l = readl(fep->hwp + FEC_ADDR_LOW); | ||
| 1100 | dev->dev_addr[0] = (unsigned char)((l & 0xFF000000) >> 24); | ||
| 1101 | dev->dev_addr[1] = (unsigned char)((l & 0x00FF0000) >> 16); | ||
| 1102 | dev->dev_addr[2] = (unsigned char)((l & 0x0000FF00) >> 8); | ||
| 1103 | dev->dev_addr[3] = (unsigned char)((l & 0x000000FF) >> 0); | ||
| 1104 | l = readl(fep->hwp + FEC_ADDR_HIGH); | ||
| 1105 | dev->dev_addr[4] = (unsigned char)((l & 0xFF000000) >> 24); | ||
| 1106 | dev->dev_addr[5] = (unsigned char)((l & 0x00FF0000) >> 16); | ||
| 1107 | } | ||
| 1108 | #endif | ||
| 1109 | 1178 | ||
| 1110 | /* Set receive and transmit descriptor base. */ | 1179 | /* Set receive and transmit descriptor base. */ |
| 1111 | fep->rx_bd_base = cbd_base; | 1180 | fep->rx_bd_base = cbd_base; |
| @@ -1156,12 +1225,25 @@ static void | |||
| 1156 | fec_restart(struct net_device *dev, int duplex) | 1225 | fec_restart(struct net_device *dev, int duplex) |
| 1157 | { | 1226 | { |
| 1158 | struct fec_enet_private *fep = netdev_priv(dev); | 1227 | struct fec_enet_private *fep = netdev_priv(dev); |
| 1228 | const struct platform_device_id *id_entry = | ||
| 1229 | platform_get_device_id(fep->pdev); | ||
| 1159 | int i; | 1230 | int i; |
| 1231 | u32 val, temp_mac[2]; | ||
| 1160 | 1232 | ||
| 1161 | /* Whack a reset. We should wait for this. */ | 1233 | /* Whack a reset. We should wait for this. */ |
| 1162 | writel(1, fep->hwp + FEC_ECNTRL); | 1234 | writel(1, fep->hwp + FEC_ECNTRL); |
| 1163 | udelay(10); | 1235 | udelay(10); |
| 1164 | 1236 | ||
| 1237 | /* | ||
| 1238 | * enet-mac reset will reset mac address registers too, | ||
| 1239 | * so need to reconfigure it. | ||
| 1240 | */ | ||
| 1241 | if (id_entry->driver_data & FEC_QUIRK_ENET_MAC) { | ||
| 1242 | memcpy(&temp_mac, dev->dev_addr, ETH_ALEN); | ||
| 1243 | writel(cpu_to_be32(temp_mac[0]), fep->hwp + FEC_ADDR_LOW); | ||
| 1244 | writel(cpu_to_be32(temp_mac[1]), fep->hwp + FEC_ADDR_HIGH); | ||
| 1245 | } | ||
| 1246 | |||
| 1165 | /* Clear any outstanding interrupt. */ | 1247 | /* Clear any outstanding interrupt. */ |
| 1166 | writel(0xffc00000, fep->hwp + FEC_IEVENT); | 1248 | writel(0xffc00000, fep->hwp + FEC_IEVENT); |
| 1167 | 1249 | ||
| @@ -1208,20 +1290,45 @@ fec_restart(struct net_device *dev, int duplex) | |||
| 1208 | /* Set MII speed */ | 1290 | /* Set MII speed */ |
| 1209 | writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); | 1291 | writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); |
| 1210 | 1292 | ||
| 1211 | #ifdef FEC_MIIGSK_ENR | 1293 | /* |
| 1212 | if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) { | 1294 | * The phy interface and speed need to get configured |
| 1213 | /* disable the gasket and wait */ | 1295 | * differently on enet-mac. |
| 1214 | writel(0, fep->hwp + FEC_MIIGSK_ENR); | 1296 | */ |
| 1215 | while (readl(fep->hwp + FEC_MIIGSK_ENR) & 4) | 1297 | if (id_entry->driver_data & FEC_QUIRK_ENET_MAC) { |
| 1216 | udelay(1); | 1298 | val = readl(fep->hwp + FEC_R_CNTRL); |
| 1217 | 1299 | ||
| 1218 | /* configure the gasket: RMII, 50 MHz, no loopback, no echo */ | 1300 | /* MII or RMII */ |
| 1219 | writel(1, fep->hwp + FEC_MIIGSK_CFGR); | 1301 | if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) |
| 1302 | val |= (1 << 8); | ||
| 1303 | else | ||
| 1304 | val &= ~(1 << 8); | ||
| 1220 | 1305 | ||
| 1221 | /* re-enable the gasket */ | 1306 | /* 10M or 100M */ |
| 1222 | writel(2, fep->hwp + FEC_MIIGSK_ENR); | 1307 | if (fep->phy_dev && fep->phy_dev->speed == SPEED_100) |
| 1223 | } | 1308 | val &= ~(1 << 9); |
| 1309 | else | ||
| 1310 | val |= (1 << 9); | ||
| 1311 | |||
| 1312 | writel(val, fep->hwp + FEC_R_CNTRL); | ||
| 1313 | } else { | ||
| 1314 | #ifdef FEC_MIIGSK_ENR | ||
| 1315 | if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) { | ||
| 1316 | /* disable the gasket and wait */ | ||
| 1317 | writel(0, fep->hwp + FEC_MIIGSK_ENR); | ||
| 1318 | while (readl(fep->hwp + FEC_MIIGSK_ENR) & 4) | ||
| 1319 | udelay(1); | ||
| 1320 | |||
| 1321 | /* | ||
| 1322 | * configure the gasket: | ||
| 1323 | * RMII, 50 MHz, no loopback, no echo | ||
| 1324 | */ | ||
| 1325 | writel(1, fep->hwp + FEC_MIIGSK_CFGR); | ||
| 1326 | |||
| 1327 | /* re-enable the gasket */ | ||
| 1328 | writel(2, fep->hwp + FEC_MIIGSK_ENR); | ||
| 1329 | } | ||
| 1224 | #endif | 1330 | #endif |
| 1331 | } | ||
| 1225 | 1332 | ||
| 1226 | /* And last, enable the transmit and receive processing */ | 1333 | /* And last, enable the transmit and receive processing */ |
| 1227 | writel(2, fep->hwp + FEC_ECNTRL); | 1334 | writel(2, fep->hwp + FEC_ECNTRL); |
| @@ -1316,7 +1423,7 @@ fec_probe(struct platform_device *pdev) | |||
| 1316 | } | 1423 | } |
| 1317 | clk_enable(fep->clk); | 1424 | clk_enable(fep->clk); |
| 1318 | 1425 | ||
| 1319 | ret = fec_enet_init(ndev, 0); | 1426 | ret = fec_enet_init(ndev); |
| 1320 | if (ret) | 1427 | if (ret) |
| 1321 | goto failed_init; | 1428 | goto failed_init; |
| 1322 | 1429 | ||
| @@ -1380,8 +1487,10 @@ fec_suspend(struct device *dev) | |||
| 1380 | 1487 | ||
| 1381 | if (ndev) { | 1488 | if (ndev) { |
| 1382 | fep = netdev_priv(ndev); | 1489 | fep = netdev_priv(ndev); |
| 1383 | if (netif_running(ndev)) | 1490 | if (netif_running(ndev)) { |
| 1384 | fec_enet_close(ndev); | 1491 | fec_stop(ndev); |
| 1492 | netif_device_detach(ndev); | ||
| 1493 | } | ||
| 1385 | clk_disable(fep->clk); | 1494 | clk_disable(fep->clk); |
| 1386 | } | 1495 | } |
| 1387 | return 0; | 1496 | return 0; |
| @@ -1396,8 +1505,10 @@ fec_resume(struct device *dev) | |||
| 1396 | if (ndev) { | 1505 | if (ndev) { |
| 1397 | fep = netdev_priv(ndev); | 1506 | fep = netdev_priv(ndev); |
| 1398 | clk_enable(fep->clk); | 1507 | clk_enable(fep->clk); |
| 1399 | if (netif_running(ndev)) | 1508 | if (netif_running(ndev)) { |
| 1400 | fec_enet_open(ndev); | 1509 | fec_restart(ndev, fep->full_duplex); |
| 1510 | netif_device_attach(ndev); | ||
| 1511 | } | ||
| 1401 | } | 1512 | } |
| 1402 | return 0; | 1513 | return 0; |
| 1403 | } | 1514 | } |
| @@ -1414,12 +1525,13 @@ static const struct dev_pm_ops fec_pm_ops = { | |||
| 1414 | 1525 | ||
| 1415 | static struct platform_driver fec_driver = { | 1526 | static struct platform_driver fec_driver = { |
| 1416 | .driver = { | 1527 | .driver = { |
| 1417 | .name = "fec", | 1528 | .name = DRIVER_NAME, |
| 1418 | .owner = THIS_MODULE, | 1529 | .owner = THIS_MODULE, |
| 1419 | #ifdef CONFIG_PM | 1530 | #ifdef CONFIG_PM |
| 1420 | .pm = &fec_pm_ops, | 1531 | .pm = &fec_pm_ops, |
| 1421 | #endif | 1532 | #endif |
| 1422 | }, | 1533 | }, |
| 1534 | .id_table = fec_devtype, | ||
| 1423 | .probe = fec_probe, | 1535 | .probe = fec_probe, |
| 1424 | .remove = __devexit_p(fec_drv_remove), | 1536 | .remove = __devexit_p(fec_drv_remove), |
| 1425 | }; | 1537 | }; |
diff --git a/drivers/net/fec.h b/drivers/net/fec.h index 2c48b25668d5..ace318df4c8d 100644 --- a/drivers/net/fec.h +++ b/drivers/net/fec.h | |||
| @@ -14,7 +14,8 @@ | |||
| 14 | /****************************************************************************/ | 14 | /****************************************************************************/ |
| 15 | 15 | ||
| 16 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ | 16 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ |
| 17 | defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_ARCH_MXC) | 17 | defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ |
| 18 | defined(CONFIG_ARCH_MXC) || defined(CONFIG_SOC_IMX28) | ||
| 18 | /* | 19 | /* |
| 19 | * Just figures, Motorola would have to change the offsets for | 20 | * Just figures, Motorola would have to change the offsets for |
| 20 | * registers in the same peripheral device on different models | 21 | * registers in the same peripheral device on different models |
| @@ -78,7 +79,7 @@ | |||
| 78 | /* | 79 | /* |
| 79 | * Define the buffer descriptor structure. | 80 | * Define the buffer descriptor structure. |
| 80 | */ | 81 | */ |
| 81 | #ifdef CONFIG_ARCH_MXC | 82 | #if defined(CONFIG_ARCH_MXC) || defined(CONFIG_SOC_IMX28) |
| 82 | struct bufdesc { | 83 | struct bufdesc { |
| 83 | unsigned short cbd_datlen; /* Data length */ | 84 | unsigned short cbd_datlen; /* Data length */ |
| 84 | unsigned short cbd_sc; /* Control and status info */ | 85 | unsigned short cbd_sc; /* Control and status info */ |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index cd2d72d825df..af09296ef0dd 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
| @@ -3949,6 +3949,7 @@ static int nv_set_wol(struct net_device *dev, struct ethtool_wolinfo *wolinfo) | |||
| 3949 | writel(flags, base + NvRegWakeUpFlags); | 3949 | writel(flags, base + NvRegWakeUpFlags); |
| 3950 | spin_unlock_irq(&np->lock); | 3950 | spin_unlock_irq(&np->lock); |
| 3951 | } | 3951 | } |
| 3952 | device_set_wakeup_enable(&np->pci_dev->dev, np->wolenabled); | ||
| 3952 | return 0; | 3953 | return 0; |
| 3953 | } | 3954 | } |
| 3954 | 3955 | ||
| @@ -5488,14 +5489,10 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
| 5488 | /* set mac address */ | 5489 | /* set mac address */ |
| 5489 | nv_copy_mac_to_hw(dev); | 5490 | nv_copy_mac_to_hw(dev); |
| 5490 | 5491 | ||
| 5491 | /* Workaround current PCI init glitch: wakeup bits aren't | ||
| 5492 | * being set from PCI PM capability. | ||
| 5493 | */ | ||
| 5494 | device_init_wakeup(&pci_dev->dev, 1); | ||
| 5495 | |||
| 5496 | /* disable WOL */ | 5492 | /* disable WOL */ |
| 5497 | writel(0, base + NvRegWakeUpFlags); | 5493 | writel(0, base + NvRegWakeUpFlags); |
| 5498 | np->wolenabled = 0; | 5494 | np->wolenabled = 0; |
| 5495 | device_set_wakeup_enable(&pci_dev->dev, false); | ||
| 5499 | 5496 | ||
| 5500 | if (id->driver_data & DEV_HAS_POWER_CNTRL) { | 5497 | if (id->driver_data & DEV_HAS_POWER_CNTRL) { |
| 5501 | 5498 | ||
| @@ -5746,8 +5743,9 @@ static void __devexit nv_remove(struct pci_dev *pci_dev) | |||
| 5746 | } | 5743 | } |
| 5747 | 5744 | ||
| 5748 | #ifdef CONFIG_PM | 5745 | #ifdef CONFIG_PM |
| 5749 | static int nv_suspend(struct pci_dev *pdev, pm_message_t state) | 5746 | static int nv_suspend(struct device *device) |
| 5750 | { | 5747 | { |
| 5748 | struct pci_dev *pdev = to_pci_dev(device); | ||
| 5751 | struct net_device *dev = pci_get_drvdata(pdev); | 5749 | struct net_device *dev = pci_get_drvdata(pdev); |
| 5752 | struct fe_priv *np = netdev_priv(dev); | 5750 | struct fe_priv *np = netdev_priv(dev); |
| 5753 | u8 __iomem *base = get_hwbase(dev); | 5751 | u8 __iomem *base = get_hwbase(dev); |
| @@ -5763,25 +5761,17 @@ static int nv_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 5763 | for (i = 0; i <= np->register_size/sizeof(u32); i++) | 5761 | for (i = 0; i <= np->register_size/sizeof(u32); i++) |
| 5764 | np->saved_config_space[i] = readl(base + i*sizeof(u32)); | 5762 | np->saved_config_space[i] = readl(base + i*sizeof(u32)); |
| 5765 | 5763 | ||
| 5766 | pci_save_state(pdev); | ||
| 5767 | pci_enable_wake(pdev, pci_choose_state(pdev, state), np->wolenabled); | ||
| 5768 | pci_disable_device(pdev); | ||
| 5769 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | ||
| 5770 | return 0; | 5764 | return 0; |
| 5771 | } | 5765 | } |
| 5772 | 5766 | ||
| 5773 | static int nv_resume(struct pci_dev *pdev) | 5767 | static int nv_resume(struct device *device) |
| 5774 | { | 5768 | { |
| 5769 | struct pci_dev *pdev = to_pci_dev(device); | ||
| 5775 | struct net_device *dev = pci_get_drvdata(pdev); | 5770 | struct net_device *dev = pci_get_drvdata(pdev); |
| 5776 | struct fe_priv *np = netdev_priv(dev); | 5771 | struct fe_priv *np = netdev_priv(dev); |
| 5777 | u8 __iomem *base = get_hwbase(dev); | 5772 | u8 __iomem *base = get_hwbase(dev); |
| 5778 | int i, rc = 0; | 5773 | int i, rc = 0; |
| 5779 | 5774 | ||
| 5780 | pci_set_power_state(pdev, PCI_D0); | ||
| 5781 | pci_restore_state(pdev); | ||
| 5782 | /* ack any pending wake events, disable PME */ | ||
| 5783 | pci_enable_wake(pdev, PCI_D0, 0); | ||
| 5784 | |||
| 5785 | /* restore non-pci configuration space */ | 5775 | /* restore non-pci configuration space */ |
| 5786 | for (i = 0; i <= np->register_size/sizeof(u32); i++) | 5776 | for (i = 0; i <= np->register_size/sizeof(u32); i++) |
| 5787 | writel(np->saved_config_space[i], base+i*sizeof(u32)); | 5777 | writel(np->saved_config_space[i], base+i*sizeof(u32)); |
| @@ -5800,6 +5790,9 @@ static int nv_resume(struct pci_dev *pdev) | |||
| 5800 | return rc; | 5790 | return rc; |
| 5801 | } | 5791 | } |
| 5802 | 5792 | ||
| 5793 | static SIMPLE_DEV_PM_OPS(nv_pm_ops, nv_suspend, nv_resume); | ||
| 5794 | #define NV_PM_OPS (&nv_pm_ops) | ||
| 5795 | |||
| 5803 | static void nv_shutdown(struct pci_dev *pdev) | 5796 | static void nv_shutdown(struct pci_dev *pdev) |
| 5804 | { | 5797 | { |
| 5805 | struct net_device *dev = pci_get_drvdata(pdev); | 5798 | struct net_device *dev = pci_get_drvdata(pdev); |
| @@ -5822,15 +5815,13 @@ static void nv_shutdown(struct pci_dev *pdev) | |||
| 5822 | * only put the device into D3 if we really go for poweroff. | 5815 | * only put the device into D3 if we really go for poweroff. |
| 5823 | */ | 5816 | */ |
| 5824 | if (system_state == SYSTEM_POWER_OFF) { | 5817 | if (system_state == SYSTEM_POWER_OFF) { |
| 5825 | if (pci_enable_wake(pdev, PCI_D3cold, np->wolenabled)) | 5818 | pci_wake_from_d3(pdev, np->wolenabled); |
| 5826 | pci_enable_wake(pdev, PCI_D3hot, np->wolenabled); | ||
| 5827 | pci_set_power_state(pdev, PCI_D3hot); | 5819 | pci_set_power_state(pdev, PCI_D3hot); |
| 5828 | } | 5820 | } |
| 5829 | } | 5821 | } |
| 5830 | #else | 5822 | #else |
| 5831 | #define nv_suspend NULL | 5823 | #define NV_PM_OPS NULL |
| 5832 | #define nv_shutdown NULL | 5824 | #define nv_shutdown NULL |
| 5833 | #define nv_resume NULL | ||
| 5834 | #endif /* CONFIG_PM */ | 5825 | #endif /* CONFIG_PM */ |
| 5835 | 5826 | ||
| 5836 | static DEFINE_PCI_DEVICE_TABLE(pci_tbl) = { | 5827 | static DEFINE_PCI_DEVICE_TABLE(pci_tbl) = { |
| @@ -6002,9 +5993,8 @@ static struct pci_driver driver = { | |||
| 6002 | .id_table = pci_tbl, | 5993 | .id_table = pci_tbl, |
| 6003 | .probe = nv_probe, | 5994 | .probe = nv_probe, |
| 6004 | .remove = __devexit_p(nv_remove), | 5995 | .remove = __devexit_p(nv_remove), |
| 6005 | .suspend = nv_suspend, | ||
| 6006 | .resume = nv_resume, | ||
| 6007 | .shutdown = nv_shutdown, | 5996 | .shutdown = nv_shutdown, |
| 5997 | .driver.pm = NV_PM_OPS, | ||
| 6008 | }; | 5998 | }; |
| 6009 | 5999 | ||
| 6010 | static int __init init_nic(void) | 6000 | static int __init init_nic(void) |
diff --git a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c index 4e7d1d0a2340..7d9ced0738c5 100644 --- a/drivers/net/hamradio/yam.c +++ b/drivers/net/hamradio/yam.c | |||
| @@ -396,7 +396,7 @@ static unsigned char *add_mcs(unsigned char *bits, int bitrate, | |||
| 396 | while (p) { | 396 | while (p) { |
| 397 | if (p->bitrate == bitrate) { | 397 | if (p->bitrate == bitrate) { |
| 398 | memcpy(p->bits, bits, YAM_FPGA_SIZE); | 398 | memcpy(p->bits, bits, YAM_FPGA_SIZE); |
| 399 | return p->bits; | 399 | goto out; |
| 400 | } | 400 | } |
| 401 | p = p->next; | 401 | p = p->next; |
| 402 | } | 402 | } |
| @@ -411,7 +411,7 @@ static unsigned char *add_mcs(unsigned char *bits, int bitrate, | |||
| 411 | p->bitrate = bitrate; | 411 | p->bitrate = bitrate; |
| 412 | p->next = yam_data; | 412 | p->next = yam_data; |
| 413 | yam_data = p; | 413 | yam_data = p; |
| 414 | 414 | out: | |
| 415 | release_firmware(fw); | 415 | release_firmware(fw); |
| 416 | return p->bits; | 416 | return p->bits; |
| 417 | } | 417 | } |
diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index 3ae30b8cb7d6..3b8c92463617 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h | |||
| @@ -508,6 +508,8 @@ extern void ixgbe_free_rx_resources(struct ixgbe_ring *); | |||
| 508 | extern void ixgbe_free_tx_resources(struct ixgbe_ring *); | 508 | extern void ixgbe_free_tx_resources(struct ixgbe_ring *); |
| 509 | extern void ixgbe_configure_rx_ring(struct ixgbe_adapter *,struct ixgbe_ring *); | 509 | extern void ixgbe_configure_rx_ring(struct ixgbe_adapter *,struct ixgbe_ring *); |
| 510 | extern void ixgbe_configure_tx_ring(struct ixgbe_adapter *,struct ixgbe_ring *); | 510 | extern void ixgbe_configure_tx_ring(struct ixgbe_adapter *,struct ixgbe_ring *); |
| 511 | extern void ixgbe_disable_rx_queue(struct ixgbe_adapter *adapter, | ||
| 512 | struct ixgbe_ring *); | ||
| 511 | extern void ixgbe_update_stats(struct ixgbe_adapter *adapter); | 513 | extern void ixgbe_update_stats(struct ixgbe_adapter *adapter); |
| 512 | extern int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter); | 514 | extern int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter); |
| 513 | extern void ixgbe_clear_interrupt_scheme(struct ixgbe_adapter *adapter); | 515 | extern void ixgbe_clear_interrupt_scheme(struct ixgbe_adapter *adapter); |
| @@ -524,26 +526,13 @@ extern s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw); | |||
| 524 | extern s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 pballoc); | 526 | extern s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 pballoc); |
| 525 | extern s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc); | 527 | extern s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc); |
| 526 | extern s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, | 528 | extern s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, |
| 527 | struct ixgbe_atr_input *input, | 529 | union ixgbe_atr_hash_dword input, |
| 530 | union ixgbe_atr_hash_dword common, | ||
| 528 | u8 queue); | 531 | u8 queue); |
| 529 | extern s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, | 532 | extern s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, |
| 530 | struct ixgbe_atr_input *input, | 533 | union ixgbe_atr_input *input, |
| 531 | struct ixgbe_atr_input_masks *input_masks, | 534 | struct ixgbe_atr_input_masks *input_masks, |
| 532 | u16 soft_id, u8 queue); | 535 | u16 soft_id, u8 queue); |
| 533 | extern s32 ixgbe_atr_set_vlan_id_82599(struct ixgbe_atr_input *input, | ||
| 534 | u16 vlan_id); | ||
| 535 | extern s32 ixgbe_atr_set_src_ipv4_82599(struct ixgbe_atr_input *input, | ||
| 536 | u32 src_addr); | ||
| 537 | extern s32 ixgbe_atr_set_dst_ipv4_82599(struct ixgbe_atr_input *input, | ||
| 538 | u32 dst_addr); | ||
| 539 | extern s32 ixgbe_atr_set_src_port_82599(struct ixgbe_atr_input *input, | ||
| 540 | u16 src_port); | ||
| 541 | extern s32 ixgbe_atr_set_dst_port_82599(struct ixgbe_atr_input *input, | ||
| 542 | u16 dst_port); | ||
| 543 | extern s32 ixgbe_atr_set_flex_byte_82599(struct ixgbe_atr_input *input, | ||
| 544 | u16 flex_byte); | ||
| 545 | extern s32 ixgbe_atr_set_l4type_82599(struct ixgbe_atr_input *input, | ||
| 546 | u8 l4type); | ||
| 547 | extern void ixgbe_configure_rscctl(struct ixgbe_adapter *adapter, | 536 | extern void ixgbe_configure_rscctl(struct ixgbe_adapter *adapter, |
| 548 | struct ixgbe_ring *ring); | 537 | struct ixgbe_ring *ring); |
| 549 | extern void ixgbe_clear_rscctl(struct ixgbe_adapter *adapter, | 538 | extern void ixgbe_clear_rscctl(struct ixgbe_adapter *adapter, |
diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c index bfd3c227cd4a..8d316d9cd29d 100644 --- a/drivers/net/ixgbe/ixgbe_82599.c +++ b/drivers/net/ixgbe/ixgbe_82599.c | |||
| @@ -1003,7 +1003,7 @@ s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw) | |||
| 1003 | udelay(10); | 1003 | udelay(10); |
| 1004 | } | 1004 | } |
| 1005 | if (i >= IXGBE_FDIRCMD_CMD_POLL) { | 1005 | if (i >= IXGBE_FDIRCMD_CMD_POLL) { |
| 1006 | hw_dbg(hw ,"Flow Director previous command isn't complete, " | 1006 | hw_dbg(hw, "Flow Director previous command isn't complete, " |
| 1007 | "aborting table re-initialization.\n"); | 1007 | "aborting table re-initialization.\n"); |
| 1008 | return IXGBE_ERR_FDIR_REINIT_FAILED; | 1008 | return IXGBE_ERR_FDIR_REINIT_FAILED; |
| 1009 | } | 1009 | } |
| @@ -1113,13 +1113,10 @@ s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 pballoc) | |||
| 1113 | /* Move the flexible bytes to use the ethertype - shift 6 words */ | 1113 | /* Move the flexible bytes to use the ethertype - shift 6 words */ |
| 1114 | fdirctrl |= (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT); | 1114 | fdirctrl |= (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT); |
| 1115 | 1115 | ||
| 1116 | fdirctrl |= IXGBE_FDIRCTRL_REPORT_STATUS; | ||
| 1117 | 1116 | ||
| 1118 | /* Prime the keys for hashing */ | 1117 | /* Prime the keys for hashing */ |
| 1119 | IXGBE_WRITE_REG(hw, IXGBE_FDIRHKEY, | 1118 | IXGBE_WRITE_REG(hw, IXGBE_FDIRHKEY, IXGBE_ATR_BUCKET_HASH_KEY); |
| 1120 | htonl(IXGBE_ATR_BUCKET_HASH_KEY)); | 1119 | IXGBE_WRITE_REG(hw, IXGBE_FDIRSKEY, IXGBE_ATR_SIGNATURE_HASH_KEY); |
| 1121 | IXGBE_WRITE_REG(hw, IXGBE_FDIRSKEY, | ||
| 1122 | htonl(IXGBE_ATR_SIGNATURE_HASH_KEY)); | ||
| 1123 | 1120 | ||
| 1124 | /* | 1121 | /* |
| 1125 | * Poll init-done after we write the register. Estimated times: | 1122 | * Poll init-done after we write the register. Estimated times: |
| @@ -1209,10 +1206,8 @@ s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc) | |||
| 1209 | fdirctrl |= (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT); | 1206 | fdirctrl |= (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT); |
| 1210 | 1207 | ||
| 1211 | /* Prime the keys for hashing */ | 1208 | /* Prime the keys for hashing */ |
| 1212 | IXGBE_WRITE_REG(hw, IXGBE_FDIRHKEY, | 1209 | IXGBE_WRITE_REG(hw, IXGBE_FDIRHKEY, IXGBE_ATR_BUCKET_HASH_KEY); |
| 1213 | htonl(IXGBE_ATR_BUCKET_HASH_KEY)); | 1210 | IXGBE_WRITE_REG(hw, IXGBE_FDIRSKEY, IXGBE_ATR_SIGNATURE_HASH_KEY); |
| 1214 | IXGBE_WRITE_REG(hw, IXGBE_FDIRSKEY, | ||
| 1215 | htonl(IXGBE_ATR_SIGNATURE_HASH_KEY)); | ||
| 1216 | 1211 | ||
| 1217 | /* | 1212 | /* |
| 1218 | * Poll init-done after we write the register. Estimated times: | 1213 | * Poll init-done after we write the register. Estimated times: |
| @@ -1251,8 +1246,8 @@ s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc) | |||
| 1251 | * @stream: input bitstream to compute the hash on | 1246 | * @stream: input bitstream to compute the hash on |
| 1252 | * @key: 32-bit hash key | 1247 | * @key: 32-bit hash key |
| 1253 | **/ | 1248 | **/ |
| 1254 | static u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *atr_input, | 1249 | static u32 ixgbe_atr_compute_hash_82599(union ixgbe_atr_input *atr_input, |
| 1255 | u32 key) | 1250 | u32 key) |
| 1256 | { | 1251 | { |
| 1257 | /* | 1252 | /* |
| 1258 | * The algorithm is as follows: | 1253 | * The algorithm is as follows: |
| @@ -1272,410 +1267,250 @@ static u16 ixgbe_atr_compute_hash_82599(struct ixgbe_atr_input *atr_input, | |||
| 1272 | * To simplify for programming, the algorithm is implemented | 1267 | * To simplify for programming, the algorithm is implemented |
| 1273 | * in software this way: | 1268 | * in software this way: |
| 1274 | * | 1269 | * |
| 1275 | * Key[31:0], Stream[335:0] | 1270 | * key[31:0], hi_hash_dword[31:0], lo_hash_dword[31:0], hash[15:0] |
| 1271 | * | ||
| 1272 | * for (i = 0; i < 352; i+=32) | ||
| 1273 | * hi_hash_dword[31:0] ^= Stream[(i+31):i]; | ||
| 1274 | * | ||
| 1275 | * lo_hash_dword[15:0] ^= Stream[15:0]; | ||
| 1276 | * lo_hash_dword[15:0] ^= hi_hash_dword[31:16]; | ||
| 1277 | * lo_hash_dword[31:16] ^= hi_hash_dword[15:0]; | ||
| 1276 | * | 1278 | * |
| 1277 | * tmp_key[11 * 32 - 1:0] = 11{Key[31:0] = key concatenated 11 times | 1279 | * hi_hash_dword[31:0] ^= Stream[351:320]; |
| 1278 | * int_key[350:0] = tmp_key[351:1] | ||
| 1279 | * int_stream[365:0] = Stream[14:0] | Stream[335:0] | Stream[335:321] | ||
| 1280 | * | 1280 | * |
| 1281 | * hash[15:0] = 0; | 1281 | * if(key[0]) |
| 1282 | * for (i = 0; i < 351; i++) { | 1282 | * hash[15:0] ^= Stream[15:0]; |
| 1283 | * if (int_key[i]) | 1283 | * |
| 1284 | * hash ^= int_stream[(i + 15):i]; | 1284 | * for (i = 0; i < 16; i++) { |
| 1285 | * if (key[i]) | ||
| 1286 | * hash[15:0] ^= lo_hash_dword[(i+15):i]; | ||
| 1287 | * if (key[i + 16]) | ||
| 1288 | * hash[15:0] ^= hi_hash_dword[(i+15):i]; | ||
| 1285 | * } | 1289 | * } |
| 1290 | * | ||
| 1286 | */ | 1291 | */ |
| 1292 | __be32 common_hash_dword = 0; | ||
| 1293 | u32 hi_hash_dword, lo_hash_dword, flow_vm_vlan; | ||
| 1294 | u32 hash_result = 0; | ||
| 1295 | u8 i; | ||
| 1287 | 1296 | ||
| 1288 | union { | 1297 | /* record the flow_vm_vlan bits as they are a key part to the hash */ |
| 1289 | u64 fill[6]; | 1298 | flow_vm_vlan = ntohl(atr_input->dword_stream[0]); |
| 1290 | u32 key[11]; | ||
| 1291 | u8 key_stream[44]; | ||
| 1292 | } tmp_key; | ||
| 1293 | 1299 | ||
| 1294 | u8 *stream = (u8 *)atr_input; | 1300 | /* generate common hash dword */ |
| 1295 | u8 int_key[44]; /* upper-most bit unused */ | 1301 | for (i = 10; i; i -= 2) |
| 1296 | u8 hash_str[46]; /* upper-most 2 bits unused */ | 1302 | common_hash_dword ^= atr_input->dword_stream[i] ^ |
| 1297 | u16 hash_result = 0; | 1303 | atr_input->dword_stream[i - 1]; |
| 1298 | int i, j, k, h; | ||
| 1299 | 1304 | ||
| 1300 | /* | 1305 | hi_hash_dword = ntohl(common_hash_dword); |
| 1301 | * Initialize the fill member to prevent warnings | ||
| 1302 | * on some compilers | ||
| 1303 | */ | ||
| 1304 | tmp_key.fill[0] = 0; | ||
| 1305 | 1306 | ||
| 1306 | /* First load the temporary key stream */ | 1307 | /* low dword is word swapped version of common */ |
| 1307 | for (i = 0; i < 6; i++) { | 1308 | lo_hash_dword = (hi_hash_dword >> 16) | (hi_hash_dword << 16); |
| 1308 | u64 fillkey = ((u64)key << 32) | key; | ||
| 1309 | tmp_key.fill[i] = fillkey; | ||
| 1310 | } | ||
| 1311 | 1309 | ||
| 1312 | /* | 1310 | /* apply flow ID/VM pool/VLAN ID bits to hash words */ |
| 1313 | * Set the interim key for the hashing. Bit 352 is unused, so we must | 1311 | hi_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan >> 16); |
| 1314 | * shift and compensate when building the key. | ||
| 1315 | */ | ||
| 1316 | 1312 | ||
| 1317 | int_key[0] = tmp_key.key_stream[0] >> 1; | 1313 | /* Process bits 0 and 16 */ |
| 1318 | for (i = 1, j = 0; i < 44; i++) { | 1314 | if (key & 0x0001) hash_result ^= lo_hash_dword; |
| 1319 | unsigned int this_key = tmp_key.key_stream[j] << 7; | 1315 | if (key & 0x00010000) hash_result ^= hi_hash_dword; |
| 1320 | j++; | ||
| 1321 | int_key[i] = (u8)(this_key | (tmp_key.key_stream[j] >> 1)); | ||
| 1322 | } | ||
| 1323 | |||
| 1324 | /* | ||
| 1325 | * Set the interim bit string for the hashing. Bits 368 and 367 are | ||
| 1326 | * unused, so shift and compensate when building the string. | ||
| 1327 | */ | ||
| 1328 | hash_str[0] = (stream[40] & 0x7f) >> 1; | ||
| 1329 | for (i = 1, j = 40; i < 46; i++) { | ||
| 1330 | unsigned int this_str = stream[j] << 7; | ||
| 1331 | j++; | ||
| 1332 | if (j > 41) | ||
| 1333 | j = 0; | ||
| 1334 | hash_str[i] = (u8)(this_str | (stream[j] >> 1)); | ||
| 1335 | } | ||
| 1336 | 1316 | ||
| 1337 | /* | 1317 | /* |
| 1338 | * Now compute the hash. i is the index into hash_str, j is into our | 1318 | * apply flow ID/VM pool/VLAN ID bits to lo hash dword, we had to |
| 1339 | * key stream, k is counting the number of bits, and h interates within | 1319 | * delay this because bit 0 of the stream should not be processed |
| 1340 | * each byte. | 1320 | * so we do not add the vlan until after bit 0 was processed |
| 1341 | */ | 1321 | */ |
| 1342 | for (i = 45, j = 43, k = 0; k < 351 && i >= 2 && j >= 0; i--, j--) { | 1322 | lo_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan << 16); |
| 1343 | for (h = 0; h < 8 && k < 351; h++, k++) { | ||
| 1344 | if (int_key[j] & (1 << h)) { | ||
| 1345 | /* | ||
| 1346 | * Key bit is set, XOR in the current 16-bit | ||
| 1347 | * string. Example of processing: | ||
| 1348 | * h = 0, | ||
| 1349 | * tmp = (hash_str[i - 2] & 0 << 16) | | ||
| 1350 | * (hash_str[i - 1] & 0xff << 8) | | ||
| 1351 | * (hash_str[i] & 0xff >> 0) | ||
| 1352 | * So tmp = hash_str[15 + k:k], since the | ||
| 1353 | * i + 2 clause rolls off the 16-bit value | ||
| 1354 | * h = 7, | ||
| 1355 | * tmp = (hash_str[i - 2] & 0x7f << 9) | | ||
| 1356 | * (hash_str[i - 1] & 0xff << 1) | | ||
| 1357 | * (hash_str[i] & 0x80 >> 7) | ||
| 1358 | */ | ||
| 1359 | int tmp = (hash_str[i] >> h); | ||
| 1360 | tmp |= (hash_str[i - 1] << (8 - h)); | ||
| 1361 | tmp |= (int)(hash_str[i - 2] & ((1 << h) - 1)) | ||
| 1362 | << (16 - h); | ||
| 1363 | hash_result ^= (u16)tmp; | ||
| 1364 | } | ||
| 1365 | } | ||
| 1366 | } | ||
| 1367 | |||
| 1368 | return hash_result; | ||
| 1369 | } | ||
| 1370 | |||
| 1371 | /** | ||
| 1372 | * ixgbe_atr_set_vlan_id_82599 - Sets the VLAN id in the ATR input stream | ||
| 1373 | * @input: input stream to modify | ||
| 1374 | * @vlan: the VLAN id to load | ||
| 1375 | **/ | ||
| 1376 | s32 ixgbe_atr_set_vlan_id_82599(struct ixgbe_atr_input *input, u16 vlan) | ||
| 1377 | { | ||
| 1378 | input->byte_stream[IXGBE_ATR_VLAN_OFFSET + 1] = vlan >> 8; | ||
| 1379 | input->byte_stream[IXGBE_ATR_VLAN_OFFSET] = vlan & 0xff; | ||
| 1380 | |||
| 1381 | return 0; | ||
| 1382 | } | ||
| 1383 | |||
| 1384 | /** | ||
| 1385 | * ixgbe_atr_set_src_ipv4_82599 - Sets the source IPv4 address | ||
| 1386 | * @input: input stream to modify | ||
| 1387 | * @src_addr: the IP address to load | ||
| 1388 | **/ | ||
| 1389 | s32 ixgbe_atr_set_src_ipv4_82599(struct ixgbe_atr_input *input, u32 src_addr) | ||
| 1390 | { | ||
| 1391 | input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 3] = src_addr >> 24; | ||
| 1392 | input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 2] = | ||
| 1393 | (src_addr >> 16) & 0xff; | ||
| 1394 | input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 1] = | ||
| 1395 | (src_addr >> 8) & 0xff; | ||
| 1396 | input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET] = src_addr & 0xff; | ||
| 1397 | |||
| 1398 | return 0; | ||
| 1399 | } | ||
| 1400 | |||
| 1401 | /** | ||
| 1402 | * ixgbe_atr_set_dst_ipv4_82599 - Sets the destination IPv4 address | ||
| 1403 | * @input: input stream to modify | ||
| 1404 | * @dst_addr: the IP address to load | ||
| 1405 | **/ | ||
| 1406 | s32 ixgbe_atr_set_dst_ipv4_82599(struct ixgbe_atr_input *input, u32 dst_addr) | ||
| 1407 | { | ||
| 1408 | input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 3] = dst_addr >> 24; | ||
| 1409 | input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 2] = | ||
| 1410 | (dst_addr >> 16) & 0xff; | ||
| 1411 | input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 1] = | ||
| 1412 | (dst_addr >> 8) & 0xff; | ||
| 1413 | input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET] = dst_addr & 0xff; | ||
| 1414 | |||
| 1415 | return 0; | ||
| 1416 | } | ||
| 1417 | 1323 | ||
| 1418 | /** | ||
| 1419 | * ixgbe_atr_set_src_port_82599 - Sets the source port | ||
| 1420 | * @input: input stream to modify | ||
| 1421 | * @src_port: the source port to load | ||
| 1422 | **/ | ||
| 1423 | s32 ixgbe_atr_set_src_port_82599(struct ixgbe_atr_input *input, u16 src_port) | ||
| 1424 | { | ||
| 1425 | input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET + 1] = src_port >> 8; | ||
| 1426 | input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET] = src_port & 0xff; | ||
| 1427 | |||
| 1428 | return 0; | ||
| 1429 | } | ||
| 1430 | |||
| 1431 | /** | ||
| 1432 | * ixgbe_atr_set_dst_port_82599 - Sets the destination port | ||
| 1433 | * @input: input stream to modify | ||
| 1434 | * @dst_port: the destination port to load | ||
| 1435 | **/ | ||
| 1436 | s32 ixgbe_atr_set_dst_port_82599(struct ixgbe_atr_input *input, u16 dst_port) | ||
| 1437 | { | ||
| 1438 | input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET + 1] = dst_port >> 8; | ||
| 1439 | input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET] = dst_port & 0xff; | ||
| 1440 | |||
| 1441 | return 0; | ||
| 1442 | } | ||
| 1443 | |||
| 1444 | /** | ||
| 1445 | * ixgbe_atr_set_flex_byte_82599 - Sets the flexible bytes | ||
| 1446 | * @input: input stream to modify | ||
| 1447 | * @flex_bytes: the flexible bytes to load | ||
| 1448 | **/ | ||
| 1449 | s32 ixgbe_atr_set_flex_byte_82599(struct ixgbe_atr_input *input, u16 flex_byte) | ||
| 1450 | { | ||
| 1451 | input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET + 1] = flex_byte >> 8; | ||
| 1452 | input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET] = flex_byte & 0xff; | ||
| 1453 | |||
| 1454 | return 0; | ||
| 1455 | } | ||
| 1456 | |||
| 1457 | /** | ||
| 1458 | * ixgbe_atr_set_l4type_82599 - Sets the layer 4 packet type | ||
| 1459 | * @input: input stream to modify | ||
| 1460 | * @l4type: the layer 4 type value to load | ||
| 1461 | **/ | ||
| 1462 | s32 ixgbe_atr_set_l4type_82599(struct ixgbe_atr_input *input, u8 l4type) | ||
| 1463 | { | ||
| 1464 | input->byte_stream[IXGBE_ATR_L4TYPE_OFFSET] = l4type; | ||
| 1465 | |||
| 1466 | return 0; | ||
| 1467 | } | ||
| 1468 | |||
| 1469 | /** | ||
| 1470 | * ixgbe_atr_get_vlan_id_82599 - Gets the VLAN id from the ATR input stream | ||
| 1471 | * @input: input stream to search | ||
| 1472 | * @vlan: the VLAN id to load | ||
| 1473 | **/ | ||
| 1474 | static s32 ixgbe_atr_get_vlan_id_82599(struct ixgbe_atr_input *input, u16 *vlan) | ||
| 1475 | { | ||
| 1476 | *vlan = input->byte_stream[IXGBE_ATR_VLAN_OFFSET]; | ||
| 1477 | *vlan |= input->byte_stream[IXGBE_ATR_VLAN_OFFSET + 1] << 8; | ||
| 1478 | |||
| 1479 | return 0; | ||
| 1480 | } | ||
| 1481 | |||
| 1482 | /** | ||
| 1483 | * ixgbe_atr_get_src_ipv4_82599 - Gets the source IPv4 address | ||
| 1484 | * @input: input stream to search | ||
| 1485 | * @src_addr: the IP address to load | ||
| 1486 | **/ | ||
| 1487 | static s32 ixgbe_atr_get_src_ipv4_82599(struct ixgbe_atr_input *input, | ||
| 1488 | u32 *src_addr) | ||
| 1489 | { | ||
| 1490 | *src_addr = input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET]; | ||
| 1491 | *src_addr |= input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 1] << 8; | ||
| 1492 | *src_addr |= input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 2] << 16; | ||
| 1493 | *src_addr |= input->byte_stream[IXGBE_ATR_SRC_IPV4_OFFSET + 3] << 24; | ||
| 1494 | |||
| 1495 | return 0; | ||
| 1496 | } | ||
| 1497 | 1324 | ||
| 1498 | /** | 1325 | /* process the remaining 30 bits in the key 2 bits at a time */ |
| 1499 | * ixgbe_atr_get_dst_ipv4_82599 - Gets the destination IPv4 address | 1326 | for (i = 15; i; i-- ) { |
| 1500 | * @input: input stream to search | 1327 | if (key & (0x0001 << i)) hash_result ^= lo_hash_dword >> i; |
| 1501 | * @dst_addr: the IP address to load | 1328 | if (key & (0x00010000 << i)) hash_result ^= hi_hash_dword >> i; |
| 1502 | **/ | 1329 | } |
| 1503 | static s32 ixgbe_atr_get_dst_ipv4_82599(struct ixgbe_atr_input *input, | ||
| 1504 | u32 *dst_addr) | ||
| 1505 | { | ||
| 1506 | *dst_addr = input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET]; | ||
| 1507 | *dst_addr |= input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 1] << 8; | ||
| 1508 | *dst_addr |= input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 2] << 16; | ||
| 1509 | *dst_addr |= input->byte_stream[IXGBE_ATR_DST_IPV4_OFFSET + 3] << 24; | ||
| 1510 | 1330 | ||
| 1511 | return 0; | 1331 | return hash_result & IXGBE_ATR_HASH_MASK; |
| 1512 | } | 1332 | } |
| 1513 | 1333 | ||
| 1514 | /** | 1334 | /* |
| 1515 | * ixgbe_atr_get_src_ipv6_82599 - Gets the source IPv6 address | 1335 | * These defines allow us to quickly generate all of the necessary instructions |
| 1516 | * @input: input stream to search | 1336 | * in the function below by simply calling out IXGBE_COMPUTE_SIG_HASH_ITERATION |
| 1517 | * @src_addr_1: the first 4 bytes of the IP address to load | 1337 | * for values 0 through 15 |
| 1518 | * @src_addr_2: the second 4 bytes of the IP address to load | 1338 | */ |
| 1519 | * @src_addr_3: the third 4 bytes of the IP address to load | 1339 | #define IXGBE_ATR_COMMON_HASH_KEY \ |
| 1520 | * @src_addr_4: the fourth 4 bytes of the IP address to load | 1340 | (IXGBE_ATR_BUCKET_HASH_KEY & IXGBE_ATR_SIGNATURE_HASH_KEY) |
| 1521 | **/ | 1341 | #define IXGBE_COMPUTE_SIG_HASH_ITERATION(_n) \ |
| 1522 | static s32 ixgbe_atr_get_src_ipv6_82599(struct ixgbe_atr_input *input, | 1342 | do { \ |
| 1523 | u32 *src_addr_1, u32 *src_addr_2, | 1343 | u32 n = (_n); \ |
| 1524 | u32 *src_addr_3, u32 *src_addr_4) | 1344 | if (IXGBE_ATR_COMMON_HASH_KEY & (0x01 << n)) \ |
| 1525 | { | 1345 | common_hash ^= lo_hash_dword >> n; \ |
| 1526 | *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 12]; | 1346 | else if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << n)) \ |
| 1527 | *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 13] << 8; | 1347 | bucket_hash ^= lo_hash_dword >> n; \ |
| 1528 | *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 14] << 16; | 1348 | else if (IXGBE_ATR_SIGNATURE_HASH_KEY & (0x01 << n)) \ |
| 1529 | *src_addr_1 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 15] << 24; | 1349 | sig_hash ^= lo_hash_dword << (16 - n); \ |
| 1530 | 1350 | if (IXGBE_ATR_COMMON_HASH_KEY & (0x01 << (n + 16))) \ | |
| 1531 | *src_addr_2 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 8]; | 1351 | common_hash ^= hi_hash_dword >> n; \ |
| 1532 | *src_addr_2 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 9] << 8; | 1352 | else if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << (n + 16))) \ |
| 1533 | *src_addr_2 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 10] << 16; | 1353 | bucket_hash ^= hi_hash_dword >> n; \ |
| 1534 | *src_addr_2 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 11] << 24; | 1354 | else if (IXGBE_ATR_SIGNATURE_HASH_KEY & (0x01 << (n + 16))) \ |
| 1535 | 1355 | sig_hash ^= hi_hash_dword << (16 - n); \ | |
| 1536 | *src_addr_3 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 4]; | 1356 | } while (0); |
| 1537 | *src_addr_3 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 5] << 8; | ||
| 1538 | *src_addr_3 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 6] << 16; | ||
| 1539 | *src_addr_3 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 7] << 24; | ||
| 1540 | |||
| 1541 | *src_addr_4 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET]; | ||
| 1542 | *src_addr_4 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 1] << 8; | ||
| 1543 | *src_addr_4 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 2] << 16; | ||
| 1544 | *src_addr_4 = input->byte_stream[IXGBE_ATR_SRC_IPV6_OFFSET + 3] << 24; | ||
| 1545 | |||
| 1546 | return 0; | ||
| 1547 | } | ||
| 1548 | 1357 | ||
| 1549 | /** | 1358 | /** |
| 1550 | * ixgbe_atr_get_src_port_82599 - Gets the source port | 1359 | * ixgbe_atr_compute_sig_hash_82599 - Compute the signature hash |
| 1551 | * @input: input stream to modify | 1360 | * @stream: input bitstream to compute the hash on |
| 1552 | * @src_port: the source port to load | ||
| 1553 | * | 1361 | * |
| 1554 | * Even though the input is given in big-endian, the FDIRPORT registers | 1362 | * This function is almost identical to the function above but contains |
| 1555 | * expect the ports to be programmed in little-endian. Hence the need to swap | 1363 | * several optomizations such as unwinding all of the loops, letting the |
| 1556 | * endianness when retrieving the data. This can be confusing since the | 1364 | * compiler work out all of the conditional ifs since the keys are static |
| 1557 | * internal hash engine expects it to be big-endian. | 1365 | * defines, and computing two keys at once since the hashed dword stream |
| 1366 | * will be the same for both keys. | ||
| 1558 | **/ | 1367 | **/ |
| 1559 | static s32 ixgbe_atr_get_src_port_82599(struct ixgbe_atr_input *input, | 1368 | static u32 ixgbe_atr_compute_sig_hash_82599(union ixgbe_atr_hash_dword input, |
| 1560 | u16 *src_port) | 1369 | union ixgbe_atr_hash_dword common) |
| 1561 | { | 1370 | { |
| 1562 | *src_port = input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET] << 8; | 1371 | u32 hi_hash_dword, lo_hash_dword, flow_vm_vlan; |
| 1563 | *src_port |= input->byte_stream[IXGBE_ATR_SRC_PORT_OFFSET + 1]; | 1372 | u32 sig_hash = 0, bucket_hash = 0, common_hash = 0; |
| 1564 | 1373 | ||
| 1565 | return 0; | 1374 | /* record the flow_vm_vlan bits as they are a key part to the hash */ |
| 1566 | } | 1375 | flow_vm_vlan = ntohl(input.dword); |
| 1567 | 1376 | ||
| 1568 | /** | 1377 | /* generate common hash dword */ |
| 1569 | * ixgbe_atr_get_dst_port_82599 - Gets the destination port | 1378 | hi_hash_dword = ntohl(common.dword); |
| 1570 | * @input: input stream to modify | ||
| 1571 | * @dst_port: the destination port to load | ||
| 1572 | * | ||
| 1573 | * Even though the input is given in big-endian, the FDIRPORT registers | ||
| 1574 | * expect the ports to be programmed in little-endian. Hence the need to swap | ||
| 1575 | * endianness when retrieving the data. This can be confusing since the | ||
| 1576 | * internal hash engine expects it to be big-endian. | ||
| 1577 | **/ | ||
| 1578 | static s32 ixgbe_atr_get_dst_port_82599(struct ixgbe_atr_input *input, | ||
| 1579 | u16 *dst_port) | ||
| 1580 | { | ||
| 1581 | *dst_port = input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET] << 8; | ||
| 1582 | *dst_port |= input->byte_stream[IXGBE_ATR_DST_PORT_OFFSET + 1]; | ||
| 1583 | 1379 | ||
| 1584 | return 0; | 1380 | /* low dword is word swapped version of common */ |
| 1585 | } | 1381 | lo_hash_dword = (hi_hash_dword >> 16) | (hi_hash_dword << 16); |
| 1586 | 1382 | ||
| 1587 | /** | 1383 | /* apply flow ID/VM pool/VLAN ID bits to hash words */ |
| 1588 | * ixgbe_atr_get_flex_byte_82599 - Gets the flexible bytes | 1384 | hi_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan >> 16); |
| 1589 | * @input: input stream to modify | ||
| 1590 | * @flex_bytes: the flexible bytes to load | ||
| 1591 | **/ | ||
| 1592 | static s32 ixgbe_atr_get_flex_byte_82599(struct ixgbe_atr_input *input, | ||
| 1593 | u16 *flex_byte) | ||
| 1594 | { | ||
| 1595 | *flex_byte = input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET]; | ||
| 1596 | *flex_byte |= input->byte_stream[IXGBE_ATR_FLEX_BYTE_OFFSET + 1] << 8; | ||
| 1597 | 1385 | ||
| 1598 | return 0; | 1386 | /* Process bits 0 and 16 */ |
| 1599 | } | 1387 | IXGBE_COMPUTE_SIG_HASH_ITERATION(0); |
| 1600 | 1388 | ||
| 1601 | /** | 1389 | /* |
| 1602 | * ixgbe_atr_get_l4type_82599 - Gets the layer 4 packet type | 1390 | * apply flow ID/VM pool/VLAN ID bits to lo hash dword, we had to |
| 1603 | * @input: input stream to modify | 1391 | * delay this because bit 0 of the stream should not be processed |
| 1604 | * @l4type: the layer 4 type value to load | 1392 | * so we do not add the vlan until after bit 0 was processed |
| 1605 | **/ | 1393 | */ |
| 1606 | static s32 ixgbe_atr_get_l4type_82599(struct ixgbe_atr_input *input, | 1394 | lo_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan << 16); |
| 1607 | u8 *l4type) | 1395 | |
| 1608 | { | 1396 | /* Process remaining 30 bit of the key */ |
| 1609 | *l4type = input->byte_stream[IXGBE_ATR_L4TYPE_OFFSET]; | 1397 | IXGBE_COMPUTE_SIG_HASH_ITERATION(1); |
| 1398 | IXGBE_COMPUTE_SIG_HASH_ITERATION(2); | ||
| 1399 | IXGBE_COMPUTE_SIG_HASH_ITERATION(3); | ||
| 1400 | IXGBE_COMPUTE_SIG_HASH_ITERATION(4); | ||
| 1401 | IXGBE_COMPUTE_SIG_HASH_ITERATION(5); | ||
| 1402 | IXGBE_COMPUTE_SIG_HASH_ITERATION(6); | ||
| 1403 | IXGBE_COMPUTE_SIG_HASH_ITERATION(7); | ||
| 1404 | IXGBE_COMPUTE_SIG_HASH_ITERATION(8); | ||
| 1405 | IXGBE_COMPUTE_SIG_HASH_ITERATION(9); | ||
| 1406 | IXGBE_COMPUTE_SIG_HASH_ITERATION(10); | ||
| 1407 | IXGBE_COMPUTE_SIG_HASH_ITERATION(11); | ||
| 1408 | IXGBE_COMPUTE_SIG_HASH_ITERATION(12); | ||
| 1409 | IXGBE_COMPUTE_SIG_HASH_ITERATION(13); | ||
| 1410 | IXGBE_COMPUTE_SIG_HASH_ITERATION(14); | ||
| 1411 | IXGBE_COMPUTE_SIG_HASH_ITERATION(15); | ||
| 1412 | |||
| 1413 | /* combine common_hash result with signature and bucket hashes */ | ||
| 1414 | bucket_hash ^= common_hash; | ||
| 1415 | bucket_hash &= IXGBE_ATR_HASH_MASK; | ||
| 1610 | 1416 | ||
| 1611 | return 0; | 1417 | sig_hash ^= common_hash << 16; |
| 1418 | sig_hash &= IXGBE_ATR_HASH_MASK << 16; | ||
| 1419 | |||
| 1420 | /* return completed signature hash */ | ||
| 1421 | return sig_hash ^ bucket_hash; | ||
| 1612 | } | 1422 | } |
| 1613 | 1423 | ||
| 1614 | /** | 1424 | /** |
| 1615 | * ixgbe_atr_add_signature_filter_82599 - Adds a signature hash filter | 1425 | * ixgbe_atr_add_signature_filter_82599 - Adds a signature hash filter |
| 1616 | * @hw: pointer to hardware structure | 1426 | * @hw: pointer to hardware structure |
| 1617 | * @stream: input bitstream | 1427 | * @input: unique input dword |
| 1428 | * @common: compressed common input dword | ||
| 1618 | * @queue: queue index to direct traffic to | 1429 | * @queue: queue index to direct traffic to |
| 1619 | **/ | 1430 | **/ |
| 1620 | s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, | 1431 | s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, |
| 1621 | struct ixgbe_atr_input *input, | 1432 | union ixgbe_atr_hash_dword input, |
| 1433 | union ixgbe_atr_hash_dword common, | ||
| 1622 | u8 queue) | 1434 | u8 queue) |
| 1623 | { | 1435 | { |
| 1624 | u64 fdirhashcmd; | 1436 | u64 fdirhashcmd; |
| 1625 | u64 fdircmd; | 1437 | u32 fdircmd; |
| 1626 | u32 fdirhash; | ||
| 1627 | u16 bucket_hash, sig_hash; | ||
| 1628 | u8 l4type; | ||
| 1629 | |||
| 1630 | bucket_hash = ixgbe_atr_compute_hash_82599(input, | ||
| 1631 | IXGBE_ATR_BUCKET_HASH_KEY); | ||
| 1632 | |||
| 1633 | /* bucket_hash is only 15 bits */ | ||
| 1634 | bucket_hash &= IXGBE_ATR_HASH_MASK; | ||
| 1635 | |||
| 1636 | sig_hash = ixgbe_atr_compute_hash_82599(input, | ||
| 1637 | IXGBE_ATR_SIGNATURE_HASH_KEY); | ||
| 1638 | |||
| 1639 | /* Get the l4type in order to program FDIRCMD properly */ | ||
| 1640 | /* lowest 2 bits are FDIRCMD.L4TYPE, third lowest bit is FDIRCMD.IPV6 */ | ||
| 1641 | ixgbe_atr_get_l4type_82599(input, &l4type); | ||
| 1642 | 1438 | ||
| 1643 | /* | 1439 | /* |
| 1644 | * The lower 32-bits of fdirhashcmd is for FDIRHASH, the upper 32-bits | 1440 | * Get the flow_type in order to program FDIRCMD properly |
| 1645 | * is for FDIRCMD. Then do a 64-bit register write from FDIRHASH. | 1441 | * lowest 2 bits are FDIRCMD.L4TYPE, third lowest bit is FDIRCMD.IPV6 |
| 1646 | */ | 1442 | */ |
| 1647 | fdirhash = sig_hash << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT | bucket_hash; | 1443 | switch (input.formatted.flow_type) { |
| 1648 | 1444 | case IXGBE_ATR_FLOW_TYPE_TCPV4: | |
| 1649 | fdircmd = (IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE | | 1445 | case IXGBE_ATR_FLOW_TYPE_UDPV4: |
| 1650 | IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN); | 1446 | case IXGBE_ATR_FLOW_TYPE_SCTPV4: |
| 1651 | 1447 | case IXGBE_ATR_FLOW_TYPE_TCPV6: | |
| 1652 | switch (l4type & IXGBE_ATR_L4TYPE_MASK) { | 1448 | case IXGBE_ATR_FLOW_TYPE_UDPV6: |
| 1653 | case IXGBE_ATR_L4TYPE_TCP: | 1449 | case IXGBE_ATR_FLOW_TYPE_SCTPV6: |
| 1654 | fdircmd |= IXGBE_FDIRCMD_L4TYPE_TCP; | ||
| 1655 | break; | ||
| 1656 | case IXGBE_ATR_L4TYPE_UDP: | ||
| 1657 | fdircmd |= IXGBE_FDIRCMD_L4TYPE_UDP; | ||
| 1658 | break; | ||
| 1659 | case IXGBE_ATR_L4TYPE_SCTP: | ||
| 1660 | fdircmd |= IXGBE_FDIRCMD_L4TYPE_SCTP; | ||
| 1661 | break; | 1450 | break; |
| 1662 | default: | 1451 | default: |
| 1663 | hw_dbg(hw, "Error on l4type input\n"); | 1452 | hw_dbg(hw, " Error on flow type input\n"); |
| 1664 | return IXGBE_ERR_CONFIG; | 1453 | return IXGBE_ERR_CONFIG; |
| 1665 | } | 1454 | } |
| 1666 | 1455 | ||
| 1667 | if (l4type & IXGBE_ATR_L4TYPE_IPV6_MASK) | 1456 | /* configure FDIRCMD register */ |
| 1668 | fdircmd |= IXGBE_FDIRCMD_IPV6; | 1457 | fdircmd = IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE | |
| 1458 | IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN; | ||
| 1459 | fdircmd |= input.formatted.flow_type << IXGBE_FDIRCMD_FLOW_TYPE_SHIFT; | ||
| 1460 | fdircmd |= (u32)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT; | ||
| 1669 | 1461 | ||
| 1670 | fdircmd |= ((u64)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT); | 1462 | /* |
| 1671 | fdirhashcmd = ((fdircmd << 32) | fdirhash); | 1463 | * The lower 32-bits of fdirhashcmd is for FDIRHASH, the upper 32-bits |
| 1464 | * is for FDIRCMD. Then do a 64-bit register write from FDIRHASH. | ||
| 1465 | */ | ||
| 1466 | fdirhashcmd = (u64)fdircmd << 32; | ||
| 1467 | fdirhashcmd |= ixgbe_atr_compute_sig_hash_82599(input, common); | ||
| 1672 | 1468 | ||
| 1673 | IXGBE_WRITE_REG64(hw, IXGBE_FDIRHASH, fdirhashcmd); | 1469 | IXGBE_WRITE_REG64(hw, IXGBE_FDIRHASH, fdirhashcmd); |
| 1674 | 1470 | ||
| 1471 | hw_dbg(hw, "Tx Queue=%x hash=%x\n", queue, (u32)fdirhashcmd); | ||
| 1472 | |||
| 1675 | return 0; | 1473 | return 0; |
| 1676 | } | 1474 | } |
| 1677 | 1475 | ||
| 1678 | /** | 1476 | /** |
| 1477 | * ixgbe_get_fdirtcpm_82599 - generate a tcp port from atr_input_masks | ||
| 1478 | * @input_mask: mask to be bit swapped | ||
| 1479 | * | ||
| 1480 | * The source and destination port masks for flow director are bit swapped | ||
| 1481 | * in that bit 15 effects bit 0, 14 effects 1, 13, 2 etc. In order to | ||
| 1482 | * generate a correctly swapped value we need to bit swap the mask and that | ||
| 1483 | * is what is accomplished by this function. | ||
| 1484 | **/ | ||
| 1485 | static u32 ixgbe_get_fdirtcpm_82599(struct ixgbe_atr_input_masks *input_masks) | ||
| 1486 | { | ||
| 1487 | u32 mask = ntohs(input_masks->dst_port_mask); | ||
| 1488 | mask <<= IXGBE_FDIRTCPM_DPORTM_SHIFT; | ||
| 1489 | mask |= ntohs(input_masks->src_port_mask); | ||
| 1490 | mask = ((mask & 0x55555555) << 1) | ((mask & 0xAAAAAAAA) >> 1); | ||
| 1491 | mask = ((mask & 0x33333333) << 2) | ((mask & 0xCCCCCCCC) >> 2); | ||
| 1492 | mask = ((mask & 0x0F0F0F0F) << 4) | ((mask & 0xF0F0F0F0) >> 4); | ||
| 1493 | return ((mask & 0x00FF00FF) << 8) | ((mask & 0xFF00FF00) >> 8); | ||
| 1494 | } | ||
| 1495 | |||
| 1496 | /* | ||
| 1497 | * These two macros are meant to address the fact that we have registers | ||
| 1498 | * that are either all or in part big-endian. As a result on big-endian | ||
| 1499 | * systems we will end up byte swapping the value to little-endian before | ||
| 1500 | * it is byte swapped again and written to the hardware in the original | ||
| 1501 | * big-endian format. | ||
| 1502 | */ | ||
| 1503 | #define IXGBE_STORE_AS_BE32(_value) \ | ||
| 1504 | (((u32)(_value) >> 24) | (((u32)(_value) & 0x00FF0000) >> 8) | \ | ||
| 1505 | (((u32)(_value) & 0x0000FF00) << 8) | ((u32)(_value) << 24)) | ||
| 1506 | |||
| 1507 | #define IXGBE_WRITE_REG_BE32(a, reg, value) \ | ||
| 1508 | IXGBE_WRITE_REG((a), (reg), IXGBE_STORE_AS_BE32(ntohl(value))) | ||
| 1509 | |||
| 1510 | #define IXGBE_STORE_AS_BE16(_value) \ | ||
| 1511 | (((u16)(_value) >> 8) | ((u16)(_value) << 8)) | ||
| 1512 | |||
| 1513 | /** | ||
| 1679 | * ixgbe_fdir_add_perfect_filter_82599 - Adds a perfect filter | 1514 | * ixgbe_fdir_add_perfect_filter_82599 - Adds a perfect filter |
| 1680 | * @hw: pointer to hardware structure | 1515 | * @hw: pointer to hardware structure |
| 1681 | * @input: input bitstream | 1516 | * @input: input bitstream |
| @@ -1687,135 +1522,139 @@ s32 ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw, | |||
| 1687 | * hardware writes must be protected from one another. | 1522 | * hardware writes must be protected from one another. |
| 1688 | **/ | 1523 | **/ |
| 1689 | s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, | 1524 | s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw, |
| 1690 | struct ixgbe_atr_input *input, | 1525 | union ixgbe_atr_input *input, |
| 1691 | struct ixgbe_atr_input_masks *input_masks, | 1526 | struct ixgbe_atr_input_masks *input_masks, |
| 1692 | u16 soft_id, u8 queue) | 1527 | u16 soft_id, u8 queue) |
| 1693 | { | 1528 | { |
| 1694 | u32 fdircmd = 0; | ||
| 1695 | u32 fdirhash; | 1529 | u32 fdirhash; |
| 1696 | u32 src_ipv4 = 0, dst_ipv4 = 0; | 1530 | u32 fdircmd; |
| 1697 | u32 src_ipv6_1, src_ipv6_2, src_ipv6_3, src_ipv6_4; | 1531 | u32 fdirport, fdirtcpm; |
| 1698 | u16 src_port, dst_port, vlan_id, flex_bytes; | 1532 | u32 fdirvlan; |
| 1699 | u16 bucket_hash; | 1533 | /* start with VLAN, flex bytes, VM pool, and IPv6 destination masked */ |
| 1700 | u8 l4type; | 1534 | u32 fdirm = IXGBE_FDIRM_VLANID | IXGBE_FDIRM_VLANP | IXGBE_FDIRM_FLEX | |
| 1701 | u8 fdirm = 0; | 1535 | IXGBE_FDIRM_POOL | IXGBE_FDIRM_DIPv6; |
| 1702 | |||
| 1703 | /* Get our input values */ | ||
| 1704 | ixgbe_atr_get_l4type_82599(input, &l4type); | ||
| 1705 | 1536 | ||
| 1706 | /* | 1537 | /* |
| 1707 | * Check l4type formatting, and bail out before we touch the hardware | 1538 | * Check flow_type formatting, and bail out before we touch the hardware |
| 1708 | * if there's a configuration issue | 1539 | * if there's a configuration issue |
| 1709 | */ | 1540 | */ |
| 1710 | switch (l4type & IXGBE_ATR_L4TYPE_MASK) { | 1541 | switch (input->formatted.flow_type) { |
| 1711 | case IXGBE_ATR_L4TYPE_TCP: | 1542 | case IXGBE_ATR_FLOW_TYPE_IPV4: |
| 1712 | fdircmd |= IXGBE_FDIRCMD_L4TYPE_TCP; | 1543 | /* use the L4 protocol mask for raw IPv4/IPv6 traffic */ |
| 1713 | break; | 1544 | fdirm |= IXGBE_FDIRM_L4P; |
| 1714 | case IXGBE_ATR_L4TYPE_UDP: | 1545 | case IXGBE_ATR_FLOW_TYPE_SCTPV4: |
| 1715 | fdircmd |= IXGBE_FDIRCMD_L4TYPE_UDP; | 1546 | if (input_masks->dst_port_mask || input_masks->src_port_mask) { |
| 1716 | break; | 1547 | hw_dbg(hw, " Error on src/dst port mask\n"); |
| 1717 | case IXGBE_ATR_L4TYPE_SCTP: | 1548 | return IXGBE_ERR_CONFIG; |
| 1718 | fdircmd |= IXGBE_FDIRCMD_L4TYPE_SCTP; | 1549 | } |
| 1550 | case IXGBE_ATR_FLOW_TYPE_TCPV4: | ||
| 1551 | case IXGBE_ATR_FLOW_TYPE_UDPV4: | ||
| 1719 | break; | 1552 | break; |
| 1720 | default: | 1553 | default: |
| 1721 | hw_dbg(hw, "Error on l4type input\n"); | 1554 | hw_dbg(hw, " Error on flow type input\n"); |
| 1722 | return IXGBE_ERR_CONFIG; | 1555 | return IXGBE_ERR_CONFIG; |
| 1723 | } | 1556 | } |
| 1724 | 1557 | ||
| 1725 | bucket_hash = ixgbe_atr_compute_hash_82599(input, | ||
| 1726 | IXGBE_ATR_BUCKET_HASH_KEY); | ||
| 1727 | |||
| 1728 | /* bucket_hash is only 15 bits */ | ||
| 1729 | bucket_hash &= IXGBE_ATR_HASH_MASK; | ||
| 1730 | |||
| 1731 | ixgbe_atr_get_vlan_id_82599(input, &vlan_id); | ||
| 1732 | ixgbe_atr_get_src_port_82599(input, &src_port); | ||
| 1733 | ixgbe_atr_get_dst_port_82599(input, &dst_port); | ||
| 1734 | ixgbe_atr_get_flex_byte_82599(input, &flex_bytes); | ||
| 1735 | |||
| 1736 | fdirhash = soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT | bucket_hash; | ||
| 1737 | |||
| 1738 | /* Now figure out if we're IPv4 or IPv6 */ | ||
| 1739 | if (l4type & IXGBE_ATR_L4TYPE_IPV6_MASK) { | ||
| 1740 | /* IPv6 */ | ||
| 1741 | ixgbe_atr_get_src_ipv6_82599(input, &src_ipv6_1, &src_ipv6_2, | ||
| 1742 | &src_ipv6_3, &src_ipv6_4); | ||
| 1743 | |||
| 1744 | IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(0), src_ipv6_1); | ||
| 1745 | IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(1), src_ipv6_2); | ||
| 1746 | IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(2), src_ipv6_3); | ||
| 1747 | /* The last 4 bytes is the same register as IPv4 */ | ||
| 1748 | IXGBE_WRITE_REG(hw, IXGBE_FDIRIPSA, src_ipv6_4); | ||
| 1749 | |||
| 1750 | fdircmd |= IXGBE_FDIRCMD_IPV6; | ||
| 1751 | fdircmd |= IXGBE_FDIRCMD_IPv6DMATCH; | ||
| 1752 | } else { | ||
| 1753 | /* IPv4 */ | ||
| 1754 | ixgbe_atr_get_src_ipv4_82599(input, &src_ipv4); | ||
| 1755 | IXGBE_WRITE_REG(hw, IXGBE_FDIRIPSA, src_ipv4); | ||
| 1756 | } | ||
| 1757 | |||
| 1758 | ixgbe_atr_get_dst_ipv4_82599(input, &dst_ipv4); | ||
| 1759 | IXGBE_WRITE_REG(hw, IXGBE_FDIRIPDA, dst_ipv4); | ||
| 1760 | |||
| 1761 | IXGBE_WRITE_REG(hw, IXGBE_FDIRVLAN, (vlan_id | | ||
| 1762 | (flex_bytes << IXGBE_FDIRVLAN_FLEX_SHIFT))); | ||
| 1763 | IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, (src_port | | ||
| 1764 | (dst_port << IXGBE_FDIRPORT_DESTINATION_SHIFT))); | ||
| 1765 | |||
| 1766 | /* | 1558 | /* |
| 1767 | * Program the relevant mask registers. L4type cannot be | 1559 | * Program the relevant mask registers. If src/dst_port or src/dst_addr |
| 1768 | * masked out in this implementation. | 1560 | * are zero, then assume a full mask for that field. Also assume that |
| 1561 | * a VLAN of 0 is unspecified, so mask that out as well. L4type | ||
| 1562 | * cannot be masked out in this implementation. | ||
| 1769 | * | 1563 | * |
| 1770 | * This also assumes IPv4 only. IPv6 masking isn't supported at this | 1564 | * This also assumes IPv4 only. IPv6 masking isn't supported at this |
| 1771 | * point in time. | 1565 | * point in time. |
| 1772 | */ | 1566 | */ |
| 1773 | IXGBE_WRITE_REG(hw, IXGBE_FDIRSIP4M, input_masks->src_ip_mask); | 1567 | |
| 1774 | IXGBE_WRITE_REG(hw, IXGBE_FDIRDIP4M, input_masks->dst_ip_mask); | 1568 | /* Program FDIRM */ |
| 1775 | 1569 | switch (ntohs(input_masks->vlan_id_mask) & 0xEFFF) { | |
| 1776 | switch (l4type & IXGBE_ATR_L4TYPE_MASK) { | 1570 | case 0xEFFF: |
| 1777 | case IXGBE_ATR_L4TYPE_TCP: | 1571 | /* Unmask VLAN ID - bit 0 and fall through to unmask prio */ |
| 1778 | IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, input_masks->src_port_mask); | 1572 | fdirm &= ~IXGBE_FDIRM_VLANID; |
| 1779 | IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, | 1573 | case 0xE000: |
| 1780 | (IXGBE_READ_REG(hw, IXGBE_FDIRTCPM) | | 1574 | /* Unmask VLAN prio - bit 1 */ |
| 1781 | (input_masks->dst_port_mask << 16))); | 1575 | fdirm &= ~IXGBE_FDIRM_VLANP; |
| 1782 | break; | 1576 | break; |
| 1783 | case IXGBE_ATR_L4TYPE_UDP: | 1577 | case 0x0FFF: |
| 1784 | IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, input_masks->src_port_mask); | 1578 | /* Unmask VLAN ID - bit 0 */ |
| 1785 | IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, | 1579 | fdirm &= ~IXGBE_FDIRM_VLANID; |
| 1786 | (IXGBE_READ_REG(hw, IXGBE_FDIRUDPM) | | ||
| 1787 | (input_masks->src_port_mask << 16))); | ||
| 1788 | break; | 1580 | break; |
| 1789 | default: | 1581 | case 0x0000: |
| 1790 | /* this already would have failed above */ | 1582 | /* do nothing, vlans already masked */ |
| 1791 | break; | 1583 | break; |
| 1584 | default: | ||
| 1585 | hw_dbg(hw, " Error on VLAN mask\n"); | ||
| 1586 | return IXGBE_ERR_CONFIG; | ||
| 1792 | } | 1587 | } |
| 1793 | 1588 | ||
| 1794 | /* Program the last mask register, FDIRM */ | 1589 | if (input_masks->flex_mask & 0xFFFF) { |
| 1795 | if (input_masks->vlan_id_mask) | 1590 | if ((input_masks->flex_mask & 0xFFFF) != 0xFFFF) { |
| 1796 | /* Mask both VLAN and VLANP - bits 0 and 1 */ | 1591 | hw_dbg(hw, " Error on flexible byte mask\n"); |
| 1797 | fdirm |= 0x3; | 1592 | return IXGBE_ERR_CONFIG; |
| 1798 | 1593 | } | |
| 1799 | if (input_masks->data_mask) | 1594 | /* Unmask Flex Bytes - bit 4 */ |
| 1800 | /* Flex bytes need masking, so mask the whole thing - bit 4 */ | 1595 | fdirm &= ~IXGBE_FDIRM_FLEX; |
| 1801 | fdirm |= 0x10; | 1596 | } |
| 1802 | 1597 | ||
| 1803 | /* Now mask VM pool and destination IPv6 - bits 5 and 2 */ | 1598 | /* Now mask VM pool and destination IPv6 - bits 5 and 2 */ |
| 1804 | fdirm |= 0x24; | ||
| 1805 | |||
| 1806 | IXGBE_WRITE_REG(hw, IXGBE_FDIRM, fdirm); | 1599 | IXGBE_WRITE_REG(hw, IXGBE_FDIRM, fdirm); |
| 1807 | 1600 | ||
| 1808 | fdircmd |= IXGBE_FDIRCMD_CMD_ADD_FLOW; | 1601 | /* store the TCP/UDP port masks, bit reversed from port layout */ |
| 1809 | fdircmd |= IXGBE_FDIRCMD_FILTER_UPDATE; | 1602 | fdirtcpm = ixgbe_get_fdirtcpm_82599(input_masks); |
| 1810 | fdircmd |= IXGBE_FDIRCMD_LAST; | 1603 | |
| 1811 | fdircmd |= IXGBE_FDIRCMD_QUEUE_EN; | 1604 | /* write both the same so that UDP and TCP use the same mask */ |
| 1812 | fdircmd |= queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT; | 1605 | IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, ~fdirtcpm); |
| 1606 | IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, ~fdirtcpm); | ||
| 1607 | |||
| 1608 | /* store source and destination IP masks (big-enian) */ | ||
| 1609 | IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIP4M, | ||
| 1610 | ~input_masks->src_ip_mask[0]); | ||
| 1611 | IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRDIP4M, | ||
| 1612 | ~input_masks->dst_ip_mask[0]); | ||
| 1613 | |||
| 1614 | /* Apply masks to input data */ | ||
| 1615 | input->formatted.vlan_id &= input_masks->vlan_id_mask; | ||
| 1616 | input->formatted.flex_bytes &= input_masks->flex_mask; | ||
| 1617 | input->formatted.src_port &= input_masks->src_port_mask; | ||
| 1618 | input->formatted.dst_port &= input_masks->dst_port_mask; | ||
| 1619 | input->formatted.src_ip[0] &= input_masks->src_ip_mask[0]; | ||
| 1620 | input->formatted.dst_ip[0] &= input_masks->dst_ip_mask[0]; | ||
| 1621 | |||
| 1622 | /* record vlan (little-endian) and flex_bytes(big-endian) */ | ||
| 1623 | fdirvlan = | ||
| 1624 | IXGBE_STORE_AS_BE16(ntohs(input->formatted.flex_bytes)); | ||
| 1625 | fdirvlan <<= IXGBE_FDIRVLAN_FLEX_SHIFT; | ||
| 1626 | fdirvlan |= ntohs(input->formatted.vlan_id); | ||
| 1627 | IXGBE_WRITE_REG(hw, IXGBE_FDIRVLAN, fdirvlan); | ||
| 1628 | |||
| 1629 | /* record source and destination port (little-endian)*/ | ||
| 1630 | fdirport = ntohs(input->formatted.dst_port); | ||
| 1631 | fdirport <<= IXGBE_FDIRPORT_DESTINATION_SHIFT; | ||
| 1632 | fdirport |= ntohs(input->formatted.src_port); | ||
| 1633 | IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, fdirport); | ||
| 1634 | |||
| 1635 | /* record the first 32 bits of the destination address (big-endian) */ | ||
| 1636 | IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIPDA, input->formatted.dst_ip[0]); | ||
| 1637 | |||
| 1638 | /* record the source address (big-endian) */ | ||
| 1639 | IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIPSA, input->formatted.src_ip[0]); | ||
| 1640 | |||
| 1641 | /* configure FDIRCMD register */ | ||
| 1642 | fdircmd = IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE | | ||
| 1643 | IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN; | ||
| 1644 | fdircmd |= input->formatted.flow_type << IXGBE_FDIRCMD_FLOW_TYPE_SHIFT; | ||
| 1645 | fdircmd |= (u32)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT; | ||
| 1646 | |||
| 1647 | /* we only want the bucket hash so drop the upper 16 bits */ | ||
| 1648 | fdirhash = ixgbe_atr_compute_hash_82599(input, | ||
| 1649 | IXGBE_ATR_BUCKET_HASH_KEY); | ||
| 1650 | fdirhash |= soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT; | ||
| 1813 | 1651 | ||
| 1814 | IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash); | 1652 | IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash); |
| 1815 | IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, fdircmd); | 1653 | IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, fdircmd); |
| 1816 | 1654 | ||
| 1817 | return 0; | 1655 | return 0; |
| 1818 | } | 1656 | } |
| 1657 | |||
| 1819 | /** | 1658 | /** |
| 1820 | * ixgbe_read_analog_reg8_82599 - Reads 8 bit Omer analog register | 1659 | * ixgbe_read_analog_reg8_82599 - Reads 8 bit Omer analog register |
| 1821 | * @hw: pointer to hardware structure | 1660 | * @hw: pointer to hardware structure |
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index 23ff23e8b393..2002ea88ca2a 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c | |||
| @@ -1477,9 +1477,7 @@ static void ixgbe_free_desc_rings(struct ixgbe_adapter *adapter) | |||
| 1477 | reg_ctl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); | 1477 | reg_ctl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); |
| 1478 | reg_ctl &= ~IXGBE_RXCTRL_RXEN; | 1478 | reg_ctl &= ~IXGBE_RXCTRL_RXEN; |
| 1479 | IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, reg_ctl); | 1479 | IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, reg_ctl); |
| 1480 | reg_ctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rx_ring->reg_idx)); | 1480 | ixgbe_disable_rx_queue(adapter, rx_ring); |
| 1481 | reg_ctl &= ~IXGBE_RXDCTL_ENABLE; | ||
| 1482 | IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rx_ring->reg_idx), reg_ctl); | ||
| 1483 | 1481 | ||
| 1484 | /* now Tx */ | 1482 | /* now Tx */ |
| 1485 | reg_ctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(tx_ring->reg_idx)); | 1483 | reg_ctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(tx_ring->reg_idx)); |
| @@ -2279,10 +2277,11 @@ static int ixgbe_set_rx_ntuple(struct net_device *dev, | |||
| 2279 | struct ethtool_rx_ntuple *cmd) | 2277 | struct ethtool_rx_ntuple *cmd) |
| 2280 | { | 2278 | { |
| 2281 | struct ixgbe_adapter *adapter = netdev_priv(dev); | 2279 | struct ixgbe_adapter *adapter = netdev_priv(dev); |
| 2282 | struct ethtool_rx_ntuple_flow_spec fs = cmd->fs; | 2280 | struct ethtool_rx_ntuple_flow_spec *fs = &cmd->fs; |
| 2283 | struct ixgbe_atr_input input_struct; | 2281 | union ixgbe_atr_input input_struct; |
| 2284 | struct ixgbe_atr_input_masks input_masks; | 2282 | struct ixgbe_atr_input_masks input_masks; |
| 2285 | int target_queue; | 2283 | int target_queue; |
| 2284 | int err; | ||
| 2286 | 2285 | ||
| 2287 | if (adapter->hw.mac.type == ixgbe_mac_82598EB) | 2286 | if (adapter->hw.mac.type == ixgbe_mac_82598EB) |
| 2288 | return -EOPNOTSUPP; | 2287 | return -EOPNOTSUPP; |
| @@ -2291,67 +2290,122 @@ static int ixgbe_set_rx_ntuple(struct net_device *dev, | |||
| 2291 | * Don't allow programming if the action is a queue greater than | 2290 | * Don't allow programming if the action is a queue greater than |
| 2292 | * the number of online Tx queues. | 2291 | * the number of online Tx queues. |
| 2293 | */ | 2292 | */ |
| 2294 | if ((fs.action >= adapter->num_tx_queues) || | 2293 | if ((fs->action >= adapter->num_tx_queues) || |
| 2295 | (fs.action < ETHTOOL_RXNTUPLE_ACTION_DROP)) | 2294 | (fs->action < ETHTOOL_RXNTUPLE_ACTION_DROP)) |
| 2296 | return -EINVAL; | 2295 | return -EINVAL; |
| 2297 | 2296 | ||
| 2298 | memset(&input_struct, 0, sizeof(struct ixgbe_atr_input)); | 2297 | memset(&input_struct, 0, sizeof(union ixgbe_atr_input)); |
| 2299 | memset(&input_masks, 0, sizeof(struct ixgbe_atr_input_masks)); | 2298 | memset(&input_masks, 0, sizeof(struct ixgbe_atr_input_masks)); |
| 2300 | 2299 | ||
| 2301 | input_masks.src_ip_mask = fs.m_u.tcp_ip4_spec.ip4src; | 2300 | /* record flow type */ |
| 2302 | input_masks.dst_ip_mask = fs.m_u.tcp_ip4_spec.ip4dst; | 2301 | switch (fs->flow_type) { |
| 2303 | input_masks.src_port_mask = fs.m_u.tcp_ip4_spec.psrc; | 2302 | case IPV4_FLOW: |
| 2304 | input_masks.dst_port_mask = fs.m_u.tcp_ip4_spec.pdst; | 2303 | input_struct.formatted.flow_type = IXGBE_ATR_FLOW_TYPE_IPV4; |
| 2305 | input_masks.vlan_id_mask = fs.vlan_tag_mask; | 2304 | break; |
| 2306 | /* only use the lowest 2 bytes for flex bytes */ | ||
| 2307 | input_masks.data_mask = (fs.data_mask & 0xffff); | ||
| 2308 | |||
| 2309 | switch (fs.flow_type) { | ||
| 2310 | case TCP_V4_FLOW: | 2305 | case TCP_V4_FLOW: |
| 2311 | ixgbe_atr_set_l4type_82599(&input_struct, IXGBE_ATR_L4TYPE_TCP); | 2306 | input_struct.formatted.flow_type = IXGBE_ATR_FLOW_TYPE_TCPV4; |
| 2312 | break; | 2307 | break; |
| 2313 | case UDP_V4_FLOW: | 2308 | case UDP_V4_FLOW: |
| 2314 | ixgbe_atr_set_l4type_82599(&input_struct, IXGBE_ATR_L4TYPE_UDP); | 2309 | input_struct.formatted.flow_type = IXGBE_ATR_FLOW_TYPE_UDPV4; |
| 2315 | break; | 2310 | break; |
| 2316 | case SCTP_V4_FLOW: | 2311 | case SCTP_V4_FLOW: |
| 2317 | ixgbe_atr_set_l4type_82599(&input_struct, IXGBE_ATR_L4TYPE_SCTP); | 2312 | input_struct.formatted.flow_type = IXGBE_ATR_FLOW_TYPE_SCTPV4; |
| 2318 | break; | 2313 | break; |
| 2319 | default: | 2314 | default: |
| 2320 | return -1; | 2315 | return -1; |
| 2321 | } | 2316 | } |
| 2322 | 2317 | ||
| 2323 | /* Mask bits from the inputs based on user-supplied mask */ | 2318 | /* copy vlan tag minus the CFI bit */ |
| 2324 | ixgbe_atr_set_src_ipv4_82599(&input_struct, | 2319 | if ((fs->vlan_tag & 0xEFFF) || (~fs->vlan_tag_mask & 0xEFFF)) { |
| 2325 | (fs.h_u.tcp_ip4_spec.ip4src & ~fs.m_u.tcp_ip4_spec.ip4src)); | 2320 | input_struct.formatted.vlan_id = htons(fs->vlan_tag & 0xEFFF); |
| 2326 | ixgbe_atr_set_dst_ipv4_82599(&input_struct, | 2321 | if (!fs->vlan_tag_mask) { |
| 2327 | (fs.h_u.tcp_ip4_spec.ip4dst & ~fs.m_u.tcp_ip4_spec.ip4dst)); | 2322 | input_masks.vlan_id_mask = htons(0xEFFF); |
| 2328 | /* 82599 expects these to be byte-swapped for perfect filtering */ | 2323 | } else { |
| 2329 | ixgbe_atr_set_src_port_82599(&input_struct, | 2324 | switch (~fs->vlan_tag_mask & 0xEFFF) { |
| 2330 | ((ntohs(fs.h_u.tcp_ip4_spec.psrc)) & ~fs.m_u.tcp_ip4_spec.psrc)); | 2325 | /* all of these are valid vlan-mask values */ |
| 2331 | ixgbe_atr_set_dst_port_82599(&input_struct, | 2326 | case 0xEFFF: |
| 2332 | ((ntohs(fs.h_u.tcp_ip4_spec.pdst)) & ~fs.m_u.tcp_ip4_spec.pdst)); | 2327 | case 0xE000: |
| 2333 | 2328 | case 0x0FFF: | |
| 2334 | /* VLAN and Flex bytes are either completely masked or not */ | 2329 | case 0x0000: |
| 2335 | if (!fs.vlan_tag_mask) | 2330 | input_masks.vlan_id_mask = |
| 2336 | ixgbe_atr_set_vlan_id_82599(&input_struct, fs.vlan_tag); | 2331 | htons(~fs->vlan_tag_mask); |
| 2337 | 2332 | break; | |
| 2338 | if (!input_masks.data_mask) | 2333 | /* exit with error if vlan-mask is invalid */ |
| 2339 | /* make sure we only use the first 2 bytes of user data */ | 2334 | default: |
| 2340 | ixgbe_atr_set_flex_byte_82599(&input_struct, | 2335 | e_err(drv, "Partial VLAN ID or " |
| 2341 | (fs.data & 0xffff)); | 2336 | "priority mask in vlan-mask is not " |
| 2337 | "supported by hardware\n"); | ||
| 2338 | return -1; | ||
| 2339 | } | ||
| 2340 | } | ||
| 2341 | } | ||
| 2342 | |||
| 2343 | /* make sure we only use the first 2 bytes of user data */ | ||
| 2344 | if ((fs->data & 0xFFFF) || (~fs->data_mask & 0xFFFF)) { | ||
| 2345 | input_struct.formatted.flex_bytes = htons(fs->data & 0xFFFF); | ||
| 2346 | if (!(fs->data_mask & 0xFFFF)) { | ||
| 2347 | input_masks.flex_mask = 0xFFFF; | ||
| 2348 | } else if (~fs->data_mask & 0xFFFF) { | ||
| 2349 | e_err(drv, "Partial user-def-mask is not " | ||
| 2350 | "supported by hardware\n"); | ||
| 2351 | return -1; | ||
| 2352 | } | ||
| 2353 | } | ||
| 2354 | |||
| 2355 | /* | ||
| 2356 | * Copy input into formatted structures | ||
| 2357 | * | ||
| 2358 | * These assignments are based on the following logic | ||
| 2359 | * If neither input or mask are set assume value is masked out. | ||
| 2360 | * If input is set, but mask is not mask should default to accept all. | ||
| 2361 | * If input is not set, but mask is set then mask likely results in 0. | ||
| 2362 | * If input is set and mask is set then assign both. | ||
| 2363 | */ | ||
| 2364 | if (fs->h_u.tcp_ip4_spec.ip4src || ~fs->m_u.tcp_ip4_spec.ip4src) { | ||
| 2365 | input_struct.formatted.src_ip[0] = fs->h_u.tcp_ip4_spec.ip4src; | ||
| 2366 | if (!fs->m_u.tcp_ip4_spec.ip4src) | ||
| 2367 | input_masks.src_ip_mask[0] = 0xFFFFFFFF; | ||
| 2368 | else | ||
| 2369 | input_masks.src_ip_mask[0] = | ||
| 2370 | ~fs->m_u.tcp_ip4_spec.ip4src; | ||
| 2371 | } | ||
| 2372 | if (fs->h_u.tcp_ip4_spec.ip4dst || ~fs->m_u.tcp_ip4_spec.ip4dst) { | ||
| 2373 | input_struct.formatted.dst_ip[0] = fs->h_u.tcp_ip4_spec.ip4dst; | ||
| 2374 | if (!fs->m_u.tcp_ip4_spec.ip4dst) | ||
| 2375 | input_masks.dst_ip_mask[0] = 0xFFFFFFFF; | ||
| 2376 | else | ||
| 2377 | input_masks.dst_ip_mask[0] = | ||
| 2378 | ~fs->m_u.tcp_ip4_spec.ip4dst; | ||
| 2379 | } | ||
| 2380 | if (fs->h_u.tcp_ip4_spec.psrc || ~fs->m_u.tcp_ip4_spec.psrc) { | ||
| 2381 | input_struct.formatted.src_port = fs->h_u.tcp_ip4_spec.psrc; | ||
| 2382 | if (!fs->m_u.tcp_ip4_spec.psrc) | ||
| 2383 | input_masks.src_port_mask = 0xFFFF; | ||
| 2384 | else | ||
| 2385 | input_masks.src_port_mask = ~fs->m_u.tcp_ip4_spec.psrc; | ||
| 2386 | } | ||
| 2387 | if (fs->h_u.tcp_ip4_spec.pdst || ~fs->m_u.tcp_ip4_spec.pdst) { | ||
| 2388 | input_struct.formatted.dst_port = fs->h_u.tcp_ip4_spec.pdst; | ||
| 2389 | if (!fs->m_u.tcp_ip4_spec.pdst) | ||
| 2390 | input_masks.dst_port_mask = 0xFFFF; | ||
| 2391 | else | ||
| 2392 | input_masks.dst_port_mask = ~fs->m_u.tcp_ip4_spec.pdst; | ||
| 2393 | } | ||
| 2342 | 2394 | ||
| 2343 | /* determine if we need to drop or route the packet */ | 2395 | /* determine if we need to drop or route the packet */ |
| 2344 | if (fs.action == ETHTOOL_RXNTUPLE_ACTION_DROP) | 2396 | if (fs->action == ETHTOOL_RXNTUPLE_ACTION_DROP) |
| 2345 | target_queue = MAX_RX_QUEUES - 1; | 2397 | target_queue = MAX_RX_QUEUES - 1; |
| 2346 | else | 2398 | else |
| 2347 | target_queue = fs.action; | 2399 | target_queue = fs->action; |
| 2348 | 2400 | ||
| 2349 | spin_lock(&adapter->fdir_perfect_lock); | 2401 | spin_lock(&adapter->fdir_perfect_lock); |
| 2350 | ixgbe_fdir_add_perfect_filter_82599(&adapter->hw, &input_struct, | 2402 | err = ixgbe_fdir_add_perfect_filter_82599(&adapter->hw, |
| 2351 | &input_masks, 0, target_queue); | 2403 | &input_struct, |
| 2404 | &input_masks, 0, | ||
| 2405 | target_queue); | ||
| 2352 | spin_unlock(&adapter->fdir_perfect_lock); | 2406 | spin_unlock(&adapter->fdir_perfect_lock); |
| 2353 | 2407 | ||
| 2354 | return 0; | 2408 | return err ? -1 : 0; |
| 2355 | } | 2409 | } |
| 2356 | 2410 | ||
| 2357 | static const struct ethtool_ops ixgbe_ethtool_ops = { | 2411 | static const struct ethtool_ops ixgbe_ethtool_ops = { |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 38ab4f3f8197..a060610a42db 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -3024,6 +3024,36 @@ static void ixgbe_rx_desc_queue_enable(struct ixgbe_adapter *adapter, | |||
| 3024 | } | 3024 | } |
| 3025 | } | 3025 | } |
| 3026 | 3026 | ||
| 3027 | void ixgbe_disable_rx_queue(struct ixgbe_adapter *adapter, | ||
| 3028 | struct ixgbe_ring *ring) | ||
| 3029 | { | ||
| 3030 | struct ixgbe_hw *hw = &adapter->hw; | ||
| 3031 | int wait_loop = IXGBE_MAX_RX_DESC_POLL; | ||
| 3032 | u32 rxdctl; | ||
| 3033 | u8 reg_idx = ring->reg_idx; | ||
| 3034 | |||
| 3035 | rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(reg_idx)); | ||
| 3036 | rxdctl &= ~IXGBE_RXDCTL_ENABLE; | ||
| 3037 | |||
| 3038 | /* write value back with RXDCTL.ENABLE bit cleared */ | ||
| 3039 | IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(reg_idx), rxdctl); | ||
| 3040 | |||
| 3041 | if (hw->mac.type == ixgbe_mac_82598EB && | ||
| 3042 | !(IXGBE_READ_REG(hw, IXGBE_LINKS) & IXGBE_LINKS_UP)) | ||
| 3043 | return; | ||
| 3044 | |||
| 3045 | /* the hardware may take up to 100us to really disable the rx queue */ | ||
| 3046 | do { | ||
| 3047 | udelay(10); | ||
| 3048 | rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(reg_idx)); | ||
| 3049 | } while (--wait_loop && (rxdctl & IXGBE_RXDCTL_ENABLE)); | ||
| 3050 | |||
| 3051 | if (!wait_loop) { | ||
| 3052 | e_err(drv, "RXDCTL.ENABLE on Rx queue %d not cleared within " | ||
| 3053 | "the polling period\n", reg_idx); | ||
| 3054 | } | ||
| 3055 | } | ||
| 3056 | |||
| 3027 | void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter, | 3057 | void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter, |
| 3028 | struct ixgbe_ring *ring) | 3058 | struct ixgbe_ring *ring) |
| 3029 | { | 3059 | { |
| @@ -3034,9 +3064,7 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter, | |||
| 3034 | 3064 | ||
| 3035 | /* disable queue to avoid issues while updating state */ | 3065 | /* disable queue to avoid issues while updating state */ |
| 3036 | rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(reg_idx)); | 3066 | rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(reg_idx)); |
| 3037 | IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(reg_idx), | 3067 | ixgbe_disable_rx_queue(adapter, ring); |
| 3038 | rxdctl & ~IXGBE_RXDCTL_ENABLE); | ||
| 3039 | IXGBE_WRITE_FLUSH(hw); | ||
| 3040 | 3068 | ||
| 3041 | IXGBE_WRITE_REG(hw, IXGBE_RDBAL(reg_idx), (rdba & DMA_BIT_MASK(32))); | 3069 | IXGBE_WRITE_REG(hw, IXGBE_RDBAL(reg_idx), (rdba & DMA_BIT_MASK(32))); |
| 3042 | IXGBE_WRITE_REG(hw, IXGBE_RDBAH(reg_idx), (rdba >> 32)); | 3070 | IXGBE_WRITE_REG(hw, IXGBE_RDBAH(reg_idx), (rdba >> 32)); |
| @@ -4064,7 +4092,11 @@ void ixgbe_down(struct ixgbe_adapter *adapter) | |||
| 4064 | rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); | 4092 | rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); |
| 4065 | IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl & ~IXGBE_RXCTRL_RXEN); | 4093 | IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl & ~IXGBE_RXCTRL_RXEN); |
| 4066 | 4094 | ||
| 4067 | IXGBE_WRITE_FLUSH(hw); | 4095 | /* disable all enabled rx queues */ |
| 4096 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
| 4097 | /* this call also flushes the previous write */ | ||
| 4098 | ixgbe_disable_rx_queue(adapter, adapter->rx_ring[i]); | ||
| 4099 | |||
| 4068 | msleep(10); | 4100 | msleep(10); |
| 4069 | 4101 | ||
| 4070 | netif_tx_stop_all_queues(netdev); | 4102 | netif_tx_stop_all_queues(netdev); |
| @@ -4789,6 +4821,12 @@ static int ixgbe_set_interrupt_capability(struct ixgbe_adapter *adapter) | |||
| 4789 | 4821 | ||
| 4790 | adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; | 4822 | adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; |
| 4791 | adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; | 4823 | adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; |
| 4824 | if (adapter->flags & (IXGBE_FLAG_FDIR_HASH_CAPABLE | | ||
| 4825 | IXGBE_FLAG_FDIR_PERFECT_CAPABLE)) { | ||
| 4826 | e_err(probe, | ||
| 4827 | "Flow Director is not supported while multiple " | ||
| 4828 | "queues are disabled. Disabling Flow Director\n"); | ||
| 4829 | } | ||
| 4792 | adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; | 4830 | adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE; |
| 4793 | adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; | 4831 | adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE; |
| 4794 | adapter->atr_sample_rate = 0; | 4832 | adapter->atr_sample_rate = 0; |
| @@ -5094,16 +5132,11 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter) | |||
| 5094 | adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED; | 5132 | adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED; |
| 5095 | if (hw->device_id == IXGBE_DEV_ID_82599_T3_LOM) | 5133 | if (hw->device_id == IXGBE_DEV_ID_82599_T3_LOM) |
| 5096 | adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE; | 5134 | adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE; |
| 5097 | if (dev->features & NETIF_F_NTUPLE) { | 5135 | /* n-tuple support exists, always init our spinlock */ |
| 5098 | /* Flow Director perfect filter enabled */ | 5136 | spin_lock_init(&adapter->fdir_perfect_lock); |
| 5099 | adapter->flags |= IXGBE_FLAG_FDIR_PERFECT_CAPABLE; | 5137 | /* Flow Director hash filters enabled */ |
| 5100 | adapter->atr_sample_rate = 0; | 5138 | adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE; |
| 5101 | spin_lock_init(&adapter->fdir_perfect_lock); | 5139 | adapter->atr_sample_rate = 20; |
| 5102 | } else { | ||
| 5103 | /* Flow Director hash filters enabled */ | ||
| 5104 | adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE; | ||
| 5105 | adapter->atr_sample_rate = 20; | ||
| 5106 | } | ||
| 5107 | adapter->ring_feature[RING_F_FDIR].indices = | 5140 | adapter->ring_feature[RING_F_FDIR].indices = |
| 5108 | IXGBE_MAX_FDIR_INDICES; | 5141 | IXGBE_MAX_FDIR_INDICES; |
| 5109 | adapter->fdir_pballoc = 0; | 5142 | adapter->fdir_pballoc = 0; |
| @@ -6474,38 +6507,92 @@ static void ixgbe_tx_queue(struct ixgbe_ring *tx_ring, | |||
| 6474 | writel(i, tx_ring->tail); | 6507 | writel(i, tx_ring->tail); |
| 6475 | } | 6508 | } |
| 6476 | 6509 | ||
| 6477 | static void ixgbe_atr(struct ixgbe_adapter *adapter, struct sk_buff *skb, | 6510 | static void ixgbe_atr(struct ixgbe_ring *ring, struct sk_buff *skb, |
| 6478 | u8 queue, u32 tx_flags, __be16 protocol) | 6511 | u32 tx_flags, __be16 protocol) |
| 6479 | { | 6512 | { |
| 6480 | struct ixgbe_atr_input atr_input; | 6513 | struct ixgbe_q_vector *q_vector = ring->q_vector; |
| 6481 | struct iphdr *iph = ip_hdr(skb); | 6514 | union ixgbe_atr_hash_dword input = { .dword = 0 }; |
| 6482 | struct ethhdr *eth = (struct ethhdr *)skb->data; | 6515 | union ixgbe_atr_hash_dword common = { .dword = 0 }; |
| 6516 | union { | ||
| 6517 | unsigned char *network; | ||
| 6518 | struct iphdr *ipv4; | ||
| 6519 | struct ipv6hdr *ipv6; | ||
| 6520 | } hdr; | ||
| 6483 | struct tcphdr *th; | 6521 | struct tcphdr *th; |
| 6484 | u16 vlan_id; | 6522 | __be16 vlan_id; |
| 6485 | 6523 | ||
| 6486 | /* Right now, we support IPv4 w/ TCP only */ | 6524 | /* if ring doesn't have a interrupt vector, cannot perform ATR */ |
| 6487 | if (protocol != htons(ETH_P_IP) || | 6525 | if (!q_vector) |
| 6488 | iph->protocol != IPPROTO_TCP) | ||
| 6489 | return; | 6526 | return; |
| 6490 | 6527 | ||
| 6491 | memset(&atr_input, 0, sizeof(struct ixgbe_atr_input)); | 6528 | /* do nothing if sampling is disabled */ |
| 6529 | if (!ring->atr_sample_rate) | ||
| 6530 | return; | ||
| 6492 | 6531 | ||
| 6493 | vlan_id = (tx_flags & IXGBE_TX_FLAGS_VLAN_MASK) >> | 6532 | ring->atr_count++; |
| 6494 | IXGBE_TX_FLAGS_VLAN_SHIFT; | 6533 | |
| 6534 | /* snag network header to get L4 type and address */ | ||
| 6535 | hdr.network = skb_network_header(skb); | ||
| 6536 | |||
| 6537 | /* Currently only IPv4/IPv6 with TCP is supported */ | ||
| 6538 | if ((protocol != __constant_htons(ETH_P_IPV6) || | ||
| 6539 | hdr.ipv6->nexthdr != IPPROTO_TCP) && | ||
| 6540 | (protocol != __constant_htons(ETH_P_IP) || | ||
| 6541 | hdr.ipv4->protocol != IPPROTO_TCP)) | ||
| 6542 | return; | ||
| 6495 | 6543 | ||
| 6496 | th = tcp_hdr(skb); | 6544 | th = tcp_hdr(skb); |
| 6497 | 6545 | ||
| 6498 | ixgbe_atr_set_vlan_id_82599(&atr_input, vlan_id); | 6546 | /* skip this packet since the socket is closing */ |
| 6499 | ixgbe_atr_set_src_port_82599(&atr_input, th->dest); | 6547 | if (th->fin) |
| 6500 | ixgbe_atr_set_dst_port_82599(&atr_input, th->source); | 6548 | return; |
| 6501 | ixgbe_atr_set_flex_byte_82599(&atr_input, eth->h_proto); | 6549 | |
| 6502 | ixgbe_atr_set_l4type_82599(&atr_input, IXGBE_ATR_L4TYPE_TCP); | 6550 | /* sample on all syn packets or once every atr sample count */ |
| 6503 | /* src and dst are inverted, think how the receiver sees them */ | 6551 | if (!th->syn && (ring->atr_count < ring->atr_sample_rate)) |
| 6504 | ixgbe_atr_set_src_ipv4_82599(&atr_input, iph->daddr); | 6552 | return; |
| 6505 | ixgbe_atr_set_dst_ipv4_82599(&atr_input, iph->saddr); | 6553 | |
| 6554 | /* reset sample count */ | ||
| 6555 | ring->atr_count = 0; | ||
| 6556 | |||
| 6557 | vlan_id = htons(tx_flags >> IXGBE_TX_FLAGS_VLAN_SHIFT); | ||
| 6558 | |||
| 6559 | /* | ||
| 6560 | * src and dst are inverted, think how the receiver sees them | ||
| 6561 | * | ||
| 6562 | * The input is broken into two sections, a non-compressed section | ||
| 6563 | * containing vm_pool, vlan_id, and flow_type. The rest of the data | ||
| 6564 | * is XORed together and stored in the compressed dword. | ||
| 6565 | */ | ||
| 6566 | input.formatted.vlan_id = vlan_id; | ||
| 6567 | |||
| 6568 | /* | ||
| 6569 | * since src port and flex bytes occupy the same word XOR them together | ||
| 6570 | * and write the value to source port portion of compressed dword | ||
| 6571 | */ | ||
| 6572 | if (vlan_id) | ||
| 6573 | common.port.src ^= th->dest ^ __constant_htons(ETH_P_8021Q); | ||
| 6574 | else | ||
| 6575 | common.port.src ^= th->dest ^ protocol; | ||
| 6576 | common.port.dst ^= th->source; | ||
| 6577 | |||
| 6578 | if (protocol == __constant_htons(ETH_P_IP)) { | ||
| 6579 | input.formatted.flow_type = IXGBE_ATR_FLOW_TYPE_TCPV4; | ||
| 6580 | common.ip ^= hdr.ipv4->saddr ^ hdr.ipv4->daddr; | ||
| 6581 | } else { | ||
| 6582 | input.formatted.flow_type = IXGBE_ATR_FLOW_TYPE_TCPV6; | ||
| 6583 | common.ip ^= hdr.ipv6->saddr.s6_addr32[0] ^ | ||
| 6584 | hdr.ipv6->saddr.s6_addr32[1] ^ | ||
| 6585 | hdr.ipv6->saddr.s6_addr32[2] ^ | ||
| 6586 | hdr.ipv6->saddr.s6_addr32[3] ^ | ||
| 6587 | hdr.ipv6->daddr.s6_addr32[0] ^ | ||
| 6588 | hdr.ipv6->daddr.s6_addr32[1] ^ | ||
| 6589 | hdr.ipv6->daddr.s6_addr32[2] ^ | ||
| 6590 | hdr.ipv6->daddr.s6_addr32[3]; | ||
| 6591 | } | ||
| 6506 | 6592 | ||
| 6507 | /* This assumes the Rx queue and Tx queue are bound to the same CPU */ | 6593 | /* This assumes the Rx queue and Tx queue are bound to the same CPU */ |
| 6508 | ixgbe_fdir_add_signature_filter_82599(&adapter->hw, &atr_input, queue); | 6594 | ixgbe_fdir_add_signature_filter_82599(&q_vector->adapter->hw, |
| 6595 | input, common, ring->queue_index); | ||
| 6509 | } | 6596 | } |
| 6510 | 6597 | ||
| 6511 | static int __ixgbe_maybe_stop_tx(struct ixgbe_ring *tx_ring, int size) | 6598 | static int __ixgbe_maybe_stop_tx(struct ixgbe_ring *tx_ring, int size) |
| @@ -6676,16 +6763,8 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, | |||
| 6676 | count = ixgbe_tx_map(adapter, tx_ring, skb, tx_flags, first, hdr_len); | 6763 | count = ixgbe_tx_map(adapter, tx_ring, skb, tx_flags, first, hdr_len); |
| 6677 | if (count) { | 6764 | if (count) { |
| 6678 | /* add the ATR filter if ATR is on */ | 6765 | /* add the ATR filter if ATR is on */ |
| 6679 | if (tx_ring->atr_sample_rate) { | 6766 | if (test_bit(__IXGBE_TX_FDIR_INIT_DONE, &tx_ring->state)) |
| 6680 | ++tx_ring->atr_count; | 6767 | ixgbe_atr(tx_ring, skb, tx_flags, protocol); |
| 6681 | if ((tx_ring->atr_count >= tx_ring->atr_sample_rate) && | ||
| 6682 | test_bit(__IXGBE_TX_FDIR_INIT_DONE, | ||
| 6683 | &tx_ring->state)) { | ||
| 6684 | ixgbe_atr(adapter, skb, tx_ring->queue_index, | ||
| 6685 | tx_flags, protocol); | ||
| 6686 | tx_ring->atr_count = 0; | ||
| 6687 | } | ||
| 6688 | } | ||
| 6689 | txq = netdev_get_tx_queue(netdev, tx_ring->queue_index); | 6768 | txq = netdev_get_tx_queue(netdev, tx_ring->queue_index); |
| 6690 | txq->tx_bytes += skb->len; | 6769 | txq->tx_bytes += skb->len; |
| 6691 | txq->tx_packets++; | 6770 | txq->tx_packets++; |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index 446f3467d3c7..fd3358f54139 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
| @@ -1947,10 +1947,9 @@ enum ixgbe_fdir_pballoc_type { | |||
| 1947 | #define IXGBE_FDIRM_VLANID 0x00000001 | 1947 | #define IXGBE_FDIRM_VLANID 0x00000001 |
| 1948 | #define IXGBE_FDIRM_VLANP 0x00000002 | 1948 | #define IXGBE_FDIRM_VLANP 0x00000002 |
| 1949 | #define IXGBE_FDIRM_POOL 0x00000004 | 1949 | #define IXGBE_FDIRM_POOL 0x00000004 |
| 1950 | #define IXGBE_FDIRM_L3P 0x00000008 | 1950 | #define IXGBE_FDIRM_L4P 0x00000008 |
| 1951 | #define IXGBE_FDIRM_L4P 0x00000010 | 1951 | #define IXGBE_FDIRM_FLEX 0x00000010 |
| 1952 | #define IXGBE_FDIRM_FLEX 0x00000020 | 1952 | #define IXGBE_FDIRM_DIPv6 0x00000020 |
| 1953 | #define IXGBE_FDIRM_DIPv6 0x00000040 | ||
| 1954 | 1953 | ||
| 1955 | #define IXGBE_FDIRFREE_FREE_MASK 0xFFFF | 1954 | #define IXGBE_FDIRFREE_FREE_MASK 0xFFFF |
| 1956 | #define IXGBE_FDIRFREE_FREE_SHIFT 0 | 1955 | #define IXGBE_FDIRFREE_FREE_SHIFT 0 |
| @@ -1990,6 +1989,7 @@ enum ixgbe_fdir_pballoc_type { | |||
| 1990 | #define IXGBE_FDIRCMD_LAST 0x00000800 | 1989 | #define IXGBE_FDIRCMD_LAST 0x00000800 |
| 1991 | #define IXGBE_FDIRCMD_COLLISION 0x00001000 | 1990 | #define IXGBE_FDIRCMD_COLLISION 0x00001000 |
| 1992 | #define IXGBE_FDIRCMD_QUEUE_EN 0x00008000 | 1991 | #define IXGBE_FDIRCMD_QUEUE_EN 0x00008000 |
| 1992 | #define IXGBE_FDIRCMD_FLOW_TYPE_SHIFT 5 | ||
| 1993 | #define IXGBE_FDIRCMD_RX_QUEUE_SHIFT 16 | 1993 | #define IXGBE_FDIRCMD_RX_QUEUE_SHIFT 16 |
| 1994 | #define IXGBE_FDIRCMD_VT_POOL_SHIFT 24 | 1994 | #define IXGBE_FDIRCMD_VT_POOL_SHIFT 24 |
| 1995 | #define IXGBE_FDIR_INIT_DONE_POLL 10 | 1995 | #define IXGBE_FDIR_INIT_DONE_POLL 10 |
| @@ -2147,51 +2147,80 @@ typedef u32 ixgbe_physical_layer; | |||
| 2147 | #define FC_LOW_WATER(MTU) (2 * (2 * PAUSE_MTU(MTU) + PAUSE_RTT)) | 2147 | #define FC_LOW_WATER(MTU) (2 * (2 * PAUSE_MTU(MTU) + PAUSE_RTT)) |
| 2148 | 2148 | ||
| 2149 | /* Software ATR hash keys */ | 2149 | /* Software ATR hash keys */ |
| 2150 | #define IXGBE_ATR_BUCKET_HASH_KEY 0xE214AD3D | 2150 | #define IXGBE_ATR_BUCKET_HASH_KEY 0x3DAD14E2 |
| 2151 | #define IXGBE_ATR_SIGNATURE_HASH_KEY 0x14364D17 | 2151 | #define IXGBE_ATR_SIGNATURE_HASH_KEY 0x174D3614 |
| 2152 | |||
| 2153 | /* Software ATR input stream offsets and masks */ | ||
| 2154 | #define IXGBE_ATR_VLAN_OFFSET 0 | ||
| 2155 | #define IXGBE_ATR_SRC_IPV6_OFFSET 2 | ||
| 2156 | #define IXGBE_ATR_SRC_IPV4_OFFSET 14 | ||
| 2157 | #define IXGBE_ATR_DST_IPV6_OFFSET 18 | ||
| 2158 | #define IXGBE_ATR_DST_IPV4_OFFSET 30 | ||
| 2159 | #define IXGBE_ATR_SRC_PORT_OFFSET 34 | ||
| 2160 | #define IXGBE_ATR_DST_PORT_OFFSET 36 | ||
| 2161 | #define IXGBE_ATR_FLEX_BYTE_OFFSET 38 | ||
| 2162 | #define IXGBE_ATR_VM_POOL_OFFSET 40 | ||
| 2163 | #define IXGBE_ATR_L4TYPE_OFFSET 41 | ||
| 2164 | 2152 | ||
| 2153 | /* Software ATR input stream values and masks */ | ||
| 2154 | #define IXGBE_ATR_HASH_MASK 0x7fff | ||
| 2165 | #define IXGBE_ATR_L4TYPE_MASK 0x3 | 2155 | #define IXGBE_ATR_L4TYPE_MASK 0x3 |
| 2166 | #define IXGBE_ATR_L4TYPE_IPV6_MASK 0x4 | ||
| 2167 | #define IXGBE_ATR_L4TYPE_UDP 0x1 | 2156 | #define IXGBE_ATR_L4TYPE_UDP 0x1 |
| 2168 | #define IXGBE_ATR_L4TYPE_TCP 0x2 | 2157 | #define IXGBE_ATR_L4TYPE_TCP 0x2 |
| 2169 | #define IXGBE_ATR_L4TYPE_SCTP 0x3 | 2158 | #define IXGBE_ATR_L4TYPE_SCTP 0x3 |
| 2170 | #define IXGBE_ATR_HASH_MASK 0x7fff | 2159 | #define IXGBE_ATR_L4TYPE_IPV6_MASK 0x4 |
| 2160 | enum ixgbe_atr_flow_type { | ||
| 2161 | IXGBE_ATR_FLOW_TYPE_IPV4 = 0x0, | ||
| 2162 | IXGBE_ATR_FLOW_TYPE_UDPV4 = 0x1, | ||
| 2163 | IXGBE_ATR_FLOW_TYPE_TCPV4 = 0x2, | ||
| 2164 | IXGBE_ATR_FLOW_TYPE_SCTPV4 = 0x3, | ||
| 2165 | IXGBE_ATR_FLOW_TYPE_IPV6 = 0x4, | ||
| 2166 | IXGBE_ATR_FLOW_TYPE_UDPV6 = 0x5, | ||
| 2167 | IXGBE_ATR_FLOW_TYPE_TCPV6 = 0x6, | ||
| 2168 | IXGBE_ATR_FLOW_TYPE_SCTPV6 = 0x7, | ||
| 2169 | }; | ||
| 2171 | 2170 | ||
| 2172 | /* Flow Director ATR input struct. */ | 2171 | /* Flow Director ATR input struct. */ |
| 2173 | struct ixgbe_atr_input { | 2172 | union ixgbe_atr_input { |
| 2174 | /* Byte layout in order, all values with MSB first: | 2173 | /* |
| 2174 | * Byte layout in order, all values with MSB first: | ||
| 2175 | * | 2175 | * |
| 2176 | * vm_pool - 1 byte | ||
| 2177 | * flow_type - 1 byte | ||
| 2176 | * vlan_id - 2 bytes | 2178 | * vlan_id - 2 bytes |
| 2177 | * src_ip - 16 bytes | 2179 | * src_ip - 16 bytes |
| 2178 | * dst_ip - 16 bytes | 2180 | * dst_ip - 16 bytes |
| 2179 | * src_port - 2 bytes | 2181 | * src_port - 2 bytes |
| 2180 | * dst_port - 2 bytes | 2182 | * dst_port - 2 bytes |
| 2181 | * flex_bytes - 2 bytes | 2183 | * flex_bytes - 2 bytes |
| 2182 | * vm_pool - 1 byte | 2184 | * rsvd0 - 2 bytes - space reserved must be 0. |
| 2183 | * l4type - 1 byte | ||
| 2184 | */ | 2185 | */ |
| 2185 | u8 byte_stream[42]; | 2186 | struct { |
| 2187 | u8 vm_pool; | ||
| 2188 | u8 flow_type; | ||
| 2189 | __be16 vlan_id; | ||
| 2190 | __be32 dst_ip[4]; | ||
| 2191 | __be32 src_ip[4]; | ||
| 2192 | __be16 src_port; | ||
| 2193 | __be16 dst_port; | ||
| 2194 | __be16 flex_bytes; | ||
| 2195 | __be16 rsvd0; | ||
| 2196 | } formatted; | ||
| 2197 | __be32 dword_stream[11]; | ||
| 2198 | }; | ||
| 2199 | |||
| 2200 | /* Flow Director compressed ATR hash input struct */ | ||
| 2201 | union ixgbe_atr_hash_dword { | ||
| 2202 | struct { | ||
| 2203 | u8 vm_pool; | ||
| 2204 | u8 flow_type; | ||
| 2205 | __be16 vlan_id; | ||
| 2206 | } formatted; | ||
| 2207 | __be32 ip; | ||
| 2208 | struct { | ||
| 2209 | __be16 src; | ||
| 2210 | __be16 dst; | ||
| 2211 | } port; | ||
| 2212 | __be16 flex_bytes; | ||
| 2213 | __be32 dword; | ||
| 2186 | }; | 2214 | }; |
| 2187 | 2215 | ||
| 2188 | struct ixgbe_atr_input_masks { | 2216 | struct ixgbe_atr_input_masks { |
| 2189 | u32 src_ip_mask; | 2217 | __be16 rsvd0; |
| 2190 | u32 dst_ip_mask; | 2218 | __be16 vlan_id_mask; |
| 2191 | u16 src_port_mask; | 2219 | __be32 dst_ip_mask[4]; |
| 2192 | u16 dst_port_mask; | 2220 | __be32 src_ip_mask[4]; |
| 2193 | u16 vlan_id_mask; | 2221 | __be16 src_port_mask; |
| 2194 | u16 data_mask; | 2222 | __be16 dst_port_mask; |
| 2223 | __be16 flex_mask; | ||
| 2195 | }; | 2224 | }; |
| 2196 | 2225 | ||
| 2197 | enum ixgbe_eeprom_type { | 2226 | enum ixgbe_eeprom_type { |
diff --git a/drivers/net/mlx4/en_netdev.c b/drivers/net/mlx4/en_netdev.c index 6d6806b361e3..897f576b8b17 100644 --- a/drivers/net/mlx4/en_netdev.c +++ b/drivers/net/mlx4/en_netdev.c | |||
| @@ -972,7 +972,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | |||
| 972 | int i; | 972 | int i; |
| 973 | int err; | 973 | int err; |
| 974 | 974 | ||
| 975 | dev = alloc_etherdev_mq(sizeof(struct mlx4_en_priv), prof->tx_ring_num); | 975 | dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv), |
| 976 | prof->tx_ring_num, prof->rx_ring_num); | ||
| 976 | if (dev == NULL) { | 977 | if (dev == NULL) { |
| 977 | mlx4_err(mdev, "Net device allocation failed\n"); | 978 | mlx4_err(mdev, "Net device allocation failed\n"); |
| 978 | return -ENOMEM; | 979 | return -ENOMEM; |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 2c158910f7ea..e953793a33ff 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
| @@ -1536,6 +1536,7 @@ static struct pcmcia_device_id pcnet_ids[] = { | |||
| 1536 | PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722), | 1536 | PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722), |
| 1537 | PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2), | 1537 | PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2), |
| 1538 | PCMCIA_DEVICE_PROD_ID12("corega", "Ether CF-TD", 0x0a21501a, 0x6589340a), | 1538 | PCMCIA_DEVICE_PROD_ID12("corega", "Ether CF-TD", 0x0a21501a, 0x6589340a), |
| 1539 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether CF-TD LAN Card", 0x5261440f, 0x8797663b), | ||
| 1539 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd), | 1540 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd), |
| 1540 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d), | 1541 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d), |
| 1541 | PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d), | 1542 | PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d), |
diff --git a/drivers/net/ppp_async.c b/drivers/net/ppp_async.c index 78d70a6481bf..a1b82c9c67d2 100644 --- a/drivers/net/ppp_async.c +++ b/drivers/net/ppp_async.c | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <linux/init.h> | 32 | #include <linux/init.h> |
| 33 | #include <linux/jiffies.h> | 33 | #include <linux/jiffies.h> |
| 34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
| 35 | #include <asm/unaligned.h> | ||
| 35 | #include <asm/uaccess.h> | 36 | #include <asm/uaccess.h> |
| 36 | #include <asm/string.h> | 37 | #include <asm/string.h> |
| 37 | 38 | ||
| @@ -542,7 +543,7 @@ ppp_async_encode(struct asyncppp *ap) | |||
| 542 | data = ap->tpkt->data; | 543 | data = ap->tpkt->data; |
| 543 | count = ap->tpkt->len; | 544 | count = ap->tpkt->len; |
| 544 | fcs = ap->tfcs; | 545 | fcs = ap->tfcs; |
| 545 | proto = (data[0] << 8) + data[1]; | 546 | proto = get_unaligned_be16(data); |
| 546 | 547 | ||
| 547 | /* | 548 | /* |
| 548 | * LCP packets with code values between 1 (configure-reqest) | 549 | * LCP packets with code values between 1 (configure-reqest) |
| @@ -963,7 +964,7 @@ static void async_lcp_peek(struct asyncppp *ap, unsigned char *data, | |||
| 963 | code = data[0]; | 964 | code = data[0]; |
| 964 | if (code != CONFACK && code != CONFREQ) | 965 | if (code != CONFACK && code != CONFREQ) |
| 965 | return; | 966 | return; |
| 966 | dlen = (data[2] << 8) + data[3]; | 967 | dlen = get_unaligned_be16(data + 2); |
| 967 | if (len < dlen) | 968 | if (len < dlen) |
| 968 | return; /* packet got truncated or length is bogus */ | 969 | return; /* packet got truncated or length is bogus */ |
| 969 | 970 | ||
| @@ -997,15 +998,14 @@ static void async_lcp_peek(struct asyncppp *ap, unsigned char *data, | |||
| 997 | while (dlen >= 2 && dlen >= data[1] && data[1] >= 2) { | 998 | while (dlen >= 2 && dlen >= data[1] && data[1] >= 2) { |
| 998 | switch (data[0]) { | 999 | switch (data[0]) { |
| 999 | case LCP_MRU: | 1000 | case LCP_MRU: |
| 1000 | val = (data[2] << 8) + data[3]; | 1001 | val = get_unaligned_be16(data + 2); |
| 1001 | if (inbound) | 1002 | if (inbound) |
| 1002 | ap->mru = val; | 1003 | ap->mru = val; |
| 1003 | else | 1004 | else |
| 1004 | ap->chan.mtu = val; | 1005 | ap->chan.mtu = val; |
| 1005 | break; | 1006 | break; |
| 1006 | case LCP_ASYNCMAP: | 1007 | case LCP_ASYNCMAP: |
| 1007 | val = (data[2] << 24) + (data[3] << 16) | 1008 | val = get_unaligned_be32(data + 2); |
| 1008 | + (data[4] << 8) + data[5]; | ||
| 1009 | if (inbound) | 1009 | if (inbound) |
| 1010 | ap->raccm = val; | 1010 | ap->raccm = val; |
| 1011 | else | 1011 | else |
diff --git a/drivers/net/ppp_deflate.c b/drivers/net/ppp_deflate.c index 695bc83e0cfd..43583309a65d 100644 --- a/drivers/net/ppp_deflate.c +++ b/drivers/net/ppp_deflate.c | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #include <linux/ppp-comp.h> | 41 | #include <linux/ppp-comp.h> |
| 42 | 42 | ||
| 43 | #include <linux/zlib.h> | 43 | #include <linux/zlib.h> |
| 44 | #include <asm/unaligned.h> | ||
| 44 | 45 | ||
| 45 | /* | 46 | /* |
| 46 | * State for a Deflate (de)compressor. | 47 | * State for a Deflate (de)compressor. |
| @@ -232,11 +233,9 @@ static int z_compress(void *arg, unsigned char *rptr, unsigned char *obuf, | |||
| 232 | */ | 233 | */ |
| 233 | wptr[0] = PPP_ADDRESS(rptr); | 234 | wptr[0] = PPP_ADDRESS(rptr); |
| 234 | wptr[1] = PPP_CONTROL(rptr); | 235 | wptr[1] = PPP_CONTROL(rptr); |
| 235 | wptr[2] = PPP_COMP >> 8; | 236 | put_unaligned_be16(PPP_COMP, wptr + 2); |
| 236 | wptr[3] = PPP_COMP; | ||
| 237 | wptr += PPP_HDRLEN; | 237 | wptr += PPP_HDRLEN; |
| 238 | wptr[0] = state->seqno >> 8; | 238 | put_unaligned_be16(state->seqno, wptr); |
| 239 | wptr[1] = state->seqno; | ||
| 240 | wptr += DEFLATE_OVHD; | 239 | wptr += DEFLATE_OVHD; |
| 241 | olen = PPP_HDRLEN + DEFLATE_OVHD; | 240 | olen = PPP_HDRLEN + DEFLATE_OVHD; |
| 242 | state->strm.next_out = wptr; | 241 | state->strm.next_out = wptr; |
| @@ -451,7 +450,7 @@ static int z_decompress(void *arg, unsigned char *ibuf, int isize, | |||
| 451 | } | 450 | } |
| 452 | 451 | ||
| 453 | /* Check the sequence number. */ | 452 | /* Check the sequence number. */ |
| 454 | seq = (ibuf[PPP_HDRLEN] << 8) + ibuf[PPP_HDRLEN+1]; | 453 | seq = get_unaligned_be16(ibuf + PPP_HDRLEN); |
| 455 | if (seq != (state->seqno & 0xffff)) { | 454 | if (seq != (state->seqno & 0xffff)) { |
| 456 | if (state->debug) | 455 | if (state->debug) |
| 457 | printk(KERN_DEBUG "z_decompress%d: bad seq # %d, expected %d\n", | 456 | printk(KERN_DEBUG "z_decompress%d: bad seq # %d, expected %d\n", |
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index 6456484c0299..c7a6c4466978 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | #include <linux/device.h> | 46 | #include <linux/device.h> |
| 47 | #include <linux/mutex.h> | 47 | #include <linux/mutex.h> |
| 48 | #include <linux/slab.h> | 48 | #include <linux/slab.h> |
| 49 | #include <asm/unaligned.h> | ||
| 49 | #include <net/slhc_vj.h> | 50 | #include <net/slhc_vj.h> |
| 50 | #include <asm/atomic.h> | 51 | #include <asm/atomic.h> |
| 51 | 52 | ||
| @@ -210,7 +211,7 @@ struct ppp_net { | |||
| 210 | }; | 211 | }; |
| 211 | 212 | ||
| 212 | /* Get the PPP protocol number from a skb */ | 213 | /* Get the PPP protocol number from a skb */ |
| 213 | #define PPP_PROTO(skb) (((skb)->data[0] << 8) + (skb)->data[1]) | 214 | #define PPP_PROTO(skb) get_unaligned_be16((skb)->data) |
| 214 | 215 | ||
| 215 | /* We limit the length of ppp->file.rq to this (arbitrary) value */ | 216 | /* We limit the length of ppp->file.rq to this (arbitrary) value */ |
| 216 | #define PPP_MAX_RQLEN 32 | 217 | #define PPP_MAX_RQLEN 32 |
| @@ -964,8 +965,7 @@ ppp_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 964 | 965 | ||
| 965 | pp = skb_push(skb, 2); | 966 | pp = skb_push(skb, 2); |
| 966 | proto = npindex_to_proto[npi]; | 967 | proto = npindex_to_proto[npi]; |
| 967 | pp[0] = proto >> 8; | 968 | put_unaligned_be16(proto, pp); |
| 968 | pp[1] = proto; | ||
| 969 | 969 | ||
| 970 | netif_stop_queue(dev); | 970 | netif_stop_queue(dev); |
| 971 | skb_queue_tail(&ppp->file.xq, skb); | 971 | skb_queue_tail(&ppp->file.xq, skb); |
| @@ -1473,8 +1473,7 @@ static int ppp_mp_explode(struct ppp *ppp, struct sk_buff *skb) | |||
| 1473 | q = skb_put(frag, flen + hdrlen); | 1473 | q = skb_put(frag, flen + hdrlen); |
| 1474 | 1474 | ||
| 1475 | /* make the MP header */ | 1475 | /* make the MP header */ |
| 1476 | q[0] = PPP_MP >> 8; | 1476 | put_unaligned_be16(PPP_MP, q); |
| 1477 | q[1] = PPP_MP; | ||
| 1478 | if (ppp->flags & SC_MP_XSHORTSEQ) { | 1477 | if (ppp->flags & SC_MP_XSHORTSEQ) { |
| 1479 | q[2] = bits + ((ppp->nxseq >> 8) & 0xf); | 1478 | q[2] = bits + ((ppp->nxseq >> 8) & 0xf); |
| 1480 | q[3] = ppp->nxseq; | 1479 | q[3] = ppp->nxseq; |
diff --git a/drivers/net/ppp_mppe.c b/drivers/net/ppp_mppe.c index 6d1a1b80cc3e..9a1849a83e2a 100644 --- a/drivers/net/ppp_mppe.c +++ b/drivers/net/ppp_mppe.c | |||
| @@ -55,6 +55,7 @@ | |||
| 55 | #include <linux/ppp_defs.h> | 55 | #include <linux/ppp_defs.h> |
| 56 | #include <linux/ppp-comp.h> | 56 | #include <linux/ppp-comp.h> |
| 57 | #include <linux/scatterlist.h> | 57 | #include <linux/scatterlist.h> |
| 58 | #include <asm/unaligned.h> | ||
| 58 | 59 | ||
| 59 | #include "ppp_mppe.h" | 60 | #include "ppp_mppe.h" |
| 60 | 61 | ||
| @@ -395,16 +396,14 @@ mppe_compress(void *arg, unsigned char *ibuf, unsigned char *obuf, | |||
| 395 | */ | 396 | */ |
| 396 | obuf[0] = PPP_ADDRESS(ibuf); | 397 | obuf[0] = PPP_ADDRESS(ibuf); |
| 397 | obuf[1] = PPP_CONTROL(ibuf); | 398 | obuf[1] = PPP_CONTROL(ibuf); |
| 398 | obuf[2] = PPP_COMP >> 8; /* isize + MPPE_OVHD + 1 */ | 399 | put_unaligned_be16(PPP_COMP, obuf + 2); |
| 399 | obuf[3] = PPP_COMP; /* isize + MPPE_OVHD + 2 */ | ||
| 400 | obuf += PPP_HDRLEN; | 400 | obuf += PPP_HDRLEN; |
| 401 | 401 | ||
| 402 | state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE; | 402 | state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE; |
| 403 | if (state->debug >= 7) | 403 | if (state->debug >= 7) |
| 404 | printk(KERN_DEBUG "mppe_compress[%d]: ccount %d\n", state->unit, | 404 | printk(KERN_DEBUG "mppe_compress[%d]: ccount %d\n", state->unit, |
| 405 | state->ccount); | 405 | state->ccount); |
| 406 | obuf[0] = state->ccount >> 8; | 406 | put_unaligned_be16(state->ccount, obuf); |
| 407 | obuf[1] = state->ccount & 0xff; | ||
| 408 | 407 | ||
| 409 | if (!state->stateful || /* stateless mode */ | 408 | if (!state->stateful || /* stateless mode */ |
| 410 | ((state->ccount & 0xff) == 0xff) || /* "flag" packet */ | 409 | ((state->ccount & 0xff) == 0xff) || /* "flag" packet */ |
diff --git a/drivers/net/ppp_synctty.c b/drivers/net/ppp_synctty.c index 4c95ec3fb8d4..4e6b72f57de8 100644 --- a/drivers/net/ppp_synctty.c +++ b/drivers/net/ppp_synctty.c | |||
| @@ -45,6 +45,7 @@ | |||
| 45 | #include <linux/completion.h> | 45 | #include <linux/completion.h> |
| 46 | #include <linux/init.h> | 46 | #include <linux/init.h> |
| 47 | #include <linux/slab.h> | 47 | #include <linux/slab.h> |
| 48 | #include <asm/unaligned.h> | ||
| 48 | #include <asm/uaccess.h> | 49 | #include <asm/uaccess.h> |
| 49 | 50 | ||
| 50 | #define PPP_VERSION "2.4.2" | 51 | #define PPP_VERSION "2.4.2" |
| @@ -563,7 +564,7 @@ ppp_sync_txmunge(struct syncppp *ap, struct sk_buff *skb) | |||
| 563 | int islcp; | 564 | int islcp; |
| 564 | 565 | ||
| 565 | data = skb->data; | 566 | data = skb->data; |
| 566 | proto = (data[0] << 8) + data[1]; | 567 | proto = get_unaligned_be16(data); |
| 567 | 568 | ||
| 568 | /* LCP packets with codes between 1 (configure-request) | 569 | /* LCP packets with codes between 1 (configure-request) |
| 569 | * and 7 (code-reject) must be sent as though no options | 570 | * and 7 (code-reject) must be sent as though no options |
diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h index 9c2a02d204dc..44e316fd67b8 100644 --- a/drivers/net/qlcnic/qlcnic.h +++ b/drivers/net/qlcnic/qlcnic.h | |||
| @@ -34,8 +34,8 @@ | |||
| 34 | 34 | ||
| 35 | #define _QLCNIC_LINUX_MAJOR 5 | 35 | #define _QLCNIC_LINUX_MAJOR 5 |
| 36 | #define _QLCNIC_LINUX_MINOR 0 | 36 | #define _QLCNIC_LINUX_MINOR 0 |
| 37 | #define _QLCNIC_LINUX_SUBVERSION 14 | 37 | #define _QLCNIC_LINUX_SUBVERSION 15 |
| 38 | #define QLCNIC_LINUX_VERSIONID "5.0.14" | 38 | #define QLCNIC_LINUX_VERSIONID "5.0.15" |
| 39 | #define QLCNIC_DRV_IDC_VER 0x01 | 39 | #define QLCNIC_DRV_IDC_VER 0x01 |
| 40 | #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ | 40 | #define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ |
| 41 | (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) | 41 | (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) |
| @@ -289,6 +289,26 @@ struct uni_data_desc{ | |||
| 289 | u32 reserved[5]; | 289 | u32 reserved[5]; |
| 290 | }; | 290 | }; |
| 291 | 291 | ||
| 292 | /* Flash Defines and Structures */ | ||
| 293 | #define QLCNIC_FLT_LOCATION 0x3F1000 | ||
| 294 | #define QLCNIC_FW_IMAGE_REGION 0x74 | ||
| 295 | struct qlcnic_flt_header { | ||
| 296 | u16 version; | ||
| 297 | u16 len; | ||
| 298 | u16 checksum; | ||
| 299 | u16 reserved; | ||
| 300 | }; | ||
| 301 | |||
| 302 | struct qlcnic_flt_entry { | ||
| 303 | u8 region; | ||
| 304 | u8 reserved0; | ||
| 305 | u8 attrib; | ||
| 306 | u8 reserved1; | ||
| 307 | u32 size; | ||
| 308 | u32 start_addr; | ||
| 309 | u32 end_add; | ||
| 310 | }; | ||
| 311 | |||
| 292 | /* Magic number to let user know flash is programmed */ | 312 | /* Magic number to let user know flash is programmed */ |
| 293 | #define QLCNIC_BDINFO_MAGIC 0x12345678 | 313 | #define QLCNIC_BDINFO_MAGIC 0x12345678 |
| 294 | 314 | ||
diff --git a/drivers/net/qlcnic/qlcnic_ethtool.c b/drivers/net/qlcnic/qlcnic_ethtool.c index 1e7af709d395..4c14510e2a87 100644 --- a/drivers/net/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/qlcnic/qlcnic_ethtool.c | |||
| @@ -672,7 +672,7 @@ qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test, | |||
| 672 | if (data[1]) | 672 | if (data[1]) |
| 673 | eth_test->flags |= ETH_TEST_FL_FAILED; | 673 | eth_test->flags |= ETH_TEST_FL_FAILED; |
| 674 | 674 | ||
| 675 | if (eth_test->flags == ETH_TEST_FL_OFFLINE) { | 675 | if (eth_test->flags & ETH_TEST_FL_OFFLINE) { |
| 676 | data[2] = qlcnic_irq_test(dev); | 676 | data[2] = qlcnic_irq_test(dev); |
| 677 | if (data[2]) | 677 | if (data[2]) |
| 678 | eth_test->flags |= ETH_TEST_FL_FAILED; | 678 | eth_test->flags |= ETH_TEST_FL_FAILED; |
diff --git a/drivers/net/qlcnic/qlcnic_init.c b/drivers/net/qlcnic/qlcnic_init.c index 9b9c7c39d3ee..a7f1d5b7e811 100644 --- a/drivers/net/qlcnic/qlcnic_init.c +++ b/drivers/net/qlcnic/qlcnic_init.c | |||
| @@ -627,12 +627,73 @@ qlcnic_setup_idc_param(struct qlcnic_adapter *adapter) { | |||
| 627 | return 0; | 627 | return 0; |
| 628 | } | 628 | } |
| 629 | 629 | ||
| 630 | static int qlcnic_get_flt_entry(struct qlcnic_adapter *adapter, u8 region, | ||
| 631 | struct qlcnic_flt_entry *region_entry) | ||
| 632 | { | ||
| 633 | struct qlcnic_flt_header flt_hdr; | ||
| 634 | struct qlcnic_flt_entry *flt_entry; | ||
| 635 | int i = 0, ret; | ||
| 636 | u32 entry_size; | ||
| 637 | |||
| 638 | memset(region_entry, 0, sizeof(struct qlcnic_flt_entry)); | ||
| 639 | ret = qlcnic_rom_fast_read_words(adapter, QLCNIC_FLT_LOCATION, | ||
| 640 | (u8 *)&flt_hdr, | ||
| 641 | sizeof(struct qlcnic_flt_header)); | ||
| 642 | if (ret) { | ||
| 643 | dev_warn(&adapter->pdev->dev, | ||
| 644 | "error reading flash layout header\n"); | ||
| 645 | return -EIO; | ||
| 646 | } | ||
| 647 | |||
| 648 | entry_size = flt_hdr.len - sizeof(struct qlcnic_flt_header); | ||
| 649 | flt_entry = (struct qlcnic_flt_entry *)vzalloc(entry_size); | ||
| 650 | if (flt_entry == NULL) { | ||
| 651 | dev_warn(&adapter->pdev->dev, "error allocating memory\n"); | ||
| 652 | return -EIO; | ||
| 653 | } | ||
| 654 | |||
| 655 | ret = qlcnic_rom_fast_read_words(adapter, QLCNIC_FLT_LOCATION + | ||
| 656 | sizeof(struct qlcnic_flt_header), | ||
| 657 | (u8 *)flt_entry, entry_size); | ||
| 658 | if (ret) { | ||
| 659 | dev_warn(&adapter->pdev->dev, | ||
| 660 | "error reading flash layout entries\n"); | ||
| 661 | goto err_out; | ||
| 662 | } | ||
| 663 | |||
| 664 | while (i < (entry_size/sizeof(struct qlcnic_flt_entry))) { | ||
| 665 | if (flt_entry[i].region == region) | ||
| 666 | break; | ||
| 667 | i++; | ||
| 668 | } | ||
| 669 | if (i >= (entry_size/sizeof(struct qlcnic_flt_entry))) { | ||
| 670 | dev_warn(&adapter->pdev->dev, | ||
| 671 | "region=%x not found in %d regions\n", region, i); | ||
| 672 | ret = -EIO; | ||
| 673 | goto err_out; | ||
| 674 | } | ||
| 675 | memcpy(region_entry, &flt_entry[i], sizeof(struct qlcnic_flt_entry)); | ||
| 676 | |||
| 677 | err_out: | ||
| 678 | vfree(flt_entry); | ||
| 679 | return ret; | ||
| 680 | } | ||
| 681 | |||
| 630 | int | 682 | int |
| 631 | qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter) | 683 | qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter) |
| 632 | { | 684 | { |
| 685 | struct qlcnic_flt_entry fw_entry; | ||
| 633 | u32 ver = -1, min_ver; | 686 | u32 ver = -1, min_ver; |
| 687 | int ret; | ||
| 634 | 688 | ||
| 635 | qlcnic_rom_fast_read(adapter, QLCNIC_FW_VERSION_OFFSET, (int *)&ver); | 689 | ret = qlcnic_get_flt_entry(adapter, QLCNIC_FW_IMAGE_REGION, &fw_entry); |
| 690 | if (!ret) | ||
| 691 | /* 0-4:-signature, 4-8:-fw version */ | ||
| 692 | qlcnic_rom_fast_read(adapter, fw_entry.start_addr + 4, | ||
| 693 | (int *)&ver); | ||
| 694 | else | ||
| 695 | qlcnic_rom_fast_read(adapter, QLCNIC_FW_VERSION_OFFSET, | ||
| 696 | (int *)&ver); | ||
| 636 | 697 | ||
| 637 | ver = QLCNIC_DECODE_VERSION(ver); | 698 | ver = QLCNIC_DECODE_VERSION(ver); |
| 638 | min_ver = QLCNIC_MIN_FW_VERSION; | 699 | min_ver = QLCNIC_MIN_FW_VERSION; |
diff --git a/drivers/net/qlcnic/qlcnic_main.c b/drivers/net/qlcnic/qlcnic_main.c index 11e3a46c0911..37c04b4fade3 100644 --- a/drivers/net/qlcnic/qlcnic_main.c +++ b/drivers/net/qlcnic/qlcnic_main.c | |||
| @@ -31,15 +31,15 @@ static const char qlcnic_driver_string[] = "QLogic 1/10 GbE " | |||
| 31 | 31 | ||
| 32 | static struct workqueue_struct *qlcnic_wq; | 32 | static struct workqueue_struct *qlcnic_wq; |
| 33 | static int qlcnic_mac_learn; | 33 | static int qlcnic_mac_learn; |
| 34 | module_param(qlcnic_mac_learn, int, 0644); | 34 | module_param(qlcnic_mac_learn, int, 0444); |
| 35 | MODULE_PARM_DESC(qlcnic_mac_learn, "Mac Filter (0=disabled, 1=enabled)"); | 35 | MODULE_PARM_DESC(qlcnic_mac_learn, "Mac Filter (0=disabled, 1=enabled)"); |
| 36 | 36 | ||
| 37 | static int use_msi = 1; | 37 | static int use_msi = 1; |
| 38 | module_param(use_msi, int, 0644); | 38 | module_param(use_msi, int, 0444); |
| 39 | MODULE_PARM_DESC(use_msi, "MSI interrupt (0=disabled, 1=enabled"); | 39 | MODULE_PARM_DESC(use_msi, "MSI interrupt (0=disabled, 1=enabled"); |
| 40 | 40 | ||
| 41 | static int use_msi_x = 1; | 41 | static int use_msi_x = 1; |
| 42 | module_param(use_msi_x, int, 0644); | 42 | module_param(use_msi_x, int, 0444); |
| 43 | MODULE_PARM_DESC(use_msi_x, "MSI-X interrupt (0=disabled, 1=enabled"); | 43 | MODULE_PARM_DESC(use_msi_x, "MSI-X interrupt (0=disabled, 1=enabled"); |
| 44 | 44 | ||
| 45 | static int auto_fw_reset = AUTO_FW_RESET_ENABLED; | 45 | static int auto_fw_reset = AUTO_FW_RESET_ENABLED; |
| @@ -47,11 +47,11 @@ module_param(auto_fw_reset, int, 0644); | |||
| 47 | MODULE_PARM_DESC(auto_fw_reset, "Auto firmware reset (0=disabled, 1=enabled"); | 47 | MODULE_PARM_DESC(auto_fw_reset, "Auto firmware reset (0=disabled, 1=enabled"); |
| 48 | 48 | ||
| 49 | static int load_fw_file; | 49 | static int load_fw_file; |
| 50 | module_param(load_fw_file, int, 0644); | 50 | module_param(load_fw_file, int, 0444); |
| 51 | MODULE_PARM_DESC(load_fw_file, "Load firmware from (0=flash, 1=file"); | 51 | MODULE_PARM_DESC(load_fw_file, "Load firmware from (0=flash, 1=file"); |
| 52 | 52 | ||
| 53 | static int qlcnic_config_npars; | 53 | static int qlcnic_config_npars; |
| 54 | module_param(qlcnic_config_npars, int, 0644); | 54 | module_param(qlcnic_config_npars, int, 0444); |
| 55 | MODULE_PARM_DESC(qlcnic_config_npars, "Configure NPARs (0=disabled, 1=enabled"); | 55 | MODULE_PARM_DESC(qlcnic_config_npars, "Configure NPARs (0=disabled, 1=enabled"); |
| 56 | 56 | ||
| 57 | static int __devinit qlcnic_probe(struct pci_dev *pdev, | 57 | static int __devinit qlcnic_probe(struct pci_dev *pdev, |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 27a7c20f64cd..bb8645ab247c 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -1632,36 +1632,134 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw) | |||
| 1632 | { | 1632 | { |
| 1633 | __le32 *phytable = (__le32 *)fw->data; | 1633 | __le32 *phytable = (__le32 *)fw->data; |
| 1634 | struct net_device *dev = tp->dev; | 1634 | struct net_device *dev = tp->dev; |
| 1635 | size_t i; | 1635 | size_t index, fw_size = fw->size / sizeof(*phytable); |
| 1636 | u32 predata, count; | ||
| 1636 | 1637 | ||
| 1637 | if (fw->size % sizeof(*phytable)) { | 1638 | if (fw->size % sizeof(*phytable)) { |
| 1638 | netif_err(tp, probe, dev, "odd sized firmware %zd\n", fw->size); | 1639 | netif_err(tp, probe, dev, "odd sized firmware %zd\n", fw->size); |
| 1639 | return; | 1640 | return; |
| 1640 | } | 1641 | } |
| 1641 | 1642 | ||
| 1642 | for (i = 0; i < fw->size / sizeof(*phytable); i++) { | 1643 | for (index = 0; index < fw_size; index++) { |
| 1643 | u32 action = le32_to_cpu(phytable[i]); | 1644 | u32 action = le32_to_cpu(phytable[index]); |
| 1645 | u32 regno = (action & 0x0fff0000) >> 16; | ||
| 1644 | 1646 | ||
| 1645 | if (!action) | 1647 | switch(action & 0xf0000000) { |
| 1648 | case PHY_READ: | ||
| 1649 | case PHY_DATA_OR: | ||
| 1650 | case PHY_DATA_AND: | ||
| 1651 | case PHY_READ_EFUSE: | ||
| 1652 | case PHY_CLEAR_READCOUNT: | ||
| 1653 | case PHY_WRITE: | ||
| 1654 | case PHY_WRITE_PREVIOUS: | ||
| 1655 | case PHY_DELAY_MS: | ||
| 1656 | break; | ||
| 1657 | |||
| 1658 | case PHY_BJMPN: | ||
| 1659 | if (regno > index) { | ||
| 1660 | netif_err(tp, probe, tp->dev, | ||
| 1661 | "Out of range of firmware\n"); | ||
| 1662 | return; | ||
| 1663 | } | ||
| 1664 | break; | ||
| 1665 | case PHY_READCOUNT_EQ_SKIP: | ||
| 1666 | if (index + 2 >= fw_size) { | ||
| 1667 | netif_err(tp, probe, tp->dev, | ||
| 1668 | "Out of range of firmware\n"); | ||
| 1669 | return; | ||
| 1670 | } | ||
| 1671 | break; | ||
| 1672 | case PHY_COMP_EQ_SKIPN: | ||
| 1673 | case PHY_COMP_NEQ_SKIPN: | ||
| 1674 | case PHY_SKIPN: | ||
| 1675 | if (index + 1 + regno >= fw_size) { | ||
| 1676 | netif_err(tp, probe, tp->dev, | ||
| 1677 | "Out of range of firmware\n"); | ||
| 1678 | return; | ||
| 1679 | } | ||
| 1646 | break; | 1680 | break; |
| 1647 | 1681 | ||
| 1648 | if ((action & 0xf0000000) != PHY_WRITE) { | 1682 | case PHY_READ_MAC_BYTE: |
| 1649 | netif_err(tp, probe, dev, | 1683 | case PHY_WRITE_MAC_BYTE: |
| 1650 | "unknown action 0x%08x\n", action); | 1684 | case PHY_WRITE_ERI_WORD: |
| 1685 | default: | ||
| 1686 | netif_err(tp, probe, tp->dev, | ||
| 1687 | "Invalid action 0x%08x\n", action); | ||
| 1651 | return; | 1688 | return; |
| 1652 | } | 1689 | } |
| 1653 | } | 1690 | } |
| 1654 | 1691 | ||
| 1655 | while (i-- != 0) { | 1692 | predata = 0; |
| 1656 | u32 action = le32_to_cpu(*phytable); | 1693 | count = 0; |
| 1694 | |||
| 1695 | for (index = 0; index < fw_size; ) { | ||
| 1696 | u32 action = le32_to_cpu(phytable[index]); | ||
| 1657 | u32 data = action & 0x0000ffff; | 1697 | u32 data = action & 0x0000ffff; |
| 1658 | u32 reg = (action & 0x0fff0000) >> 16; | 1698 | u32 regno = (action & 0x0fff0000) >> 16; |
| 1699 | |||
| 1700 | if (!action) | ||
| 1701 | break; | ||
| 1659 | 1702 | ||
| 1660 | switch(action & 0xf0000000) { | 1703 | switch(action & 0xf0000000) { |
| 1704 | case PHY_READ: | ||
| 1705 | predata = rtl_readphy(tp, regno); | ||
| 1706 | count++; | ||
| 1707 | index++; | ||
| 1708 | break; | ||
| 1709 | case PHY_DATA_OR: | ||
| 1710 | predata |= data; | ||
| 1711 | index++; | ||
| 1712 | break; | ||
| 1713 | case PHY_DATA_AND: | ||
| 1714 | predata &= data; | ||
| 1715 | index++; | ||
| 1716 | break; | ||
| 1717 | case PHY_BJMPN: | ||
| 1718 | index -= regno; | ||
| 1719 | break; | ||
| 1720 | case PHY_READ_EFUSE: | ||
| 1721 | predata = rtl8168d_efuse_read(tp->mmio_addr, regno); | ||
| 1722 | index++; | ||
| 1723 | break; | ||
| 1724 | case PHY_CLEAR_READCOUNT: | ||
| 1725 | count = 0; | ||
| 1726 | index++; | ||
| 1727 | break; | ||
| 1661 | case PHY_WRITE: | 1728 | case PHY_WRITE: |
| 1662 | rtl_writephy(tp, reg, data); | 1729 | rtl_writephy(tp, regno, data); |
| 1663 | phytable++; | 1730 | index++; |
| 1731 | break; | ||
| 1732 | case PHY_READCOUNT_EQ_SKIP: | ||
| 1733 | if (count == data) | ||
| 1734 | index += 2; | ||
| 1735 | else | ||
| 1736 | index += 1; | ||
| 1737 | break; | ||
| 1738 | case PHY_COMP_EQ_SKIPN: | ||
| 1739 | if (predata == data) | ||
| 1740 | index += regno; | ||
| 1741 | index++; | ||
| 1664 | break; | 1742 | break; |
| 1743 | case PHY_COMP_NEQ_SKIPN: | ||
| 1744 | if (predata != data) | ||
| 1745 | index += regno; | ||
| 1746 | index++; | ||
| 1747 | break; | ||
| 1748 | case PHY_WRITE_PREVIOUS: | ||
| 1749 | rtl_writephy(tp, regno, predata); | ||
| 1750 | index++; | ||
| 1751 | break; | ||
| 1752 | case PHY_SKIPN: | ||
| 1753 | index += regno + 1; | ||
| 1754 | break; | ||
| 1755 | case PHY_DELAY_MS: | ||
| 1756 | mdelay(data); | ||
| 1757 | index++; | ||
| 1758 | break; | ||
| 1759 | |||
| 1760 | case PHY_READ_MAC_BYTE: | ||
| 1761 | case PHY_WRITE_MAC_BYTE: | ||
| 1762 | case PHY_WRITE_ERI_WORD: | ||
| 1665 | default: | 1763 | default: |
| 1666 | BUG(); | 1764 | BUG(); |
| 1667 | } | 1765 | } |
| @@ -3069,15 +3167,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 3069 | rtl8168_driver_start(tp); | 3167 | rtl8168_driver_start(tp); |
| 3070 | } | 3168 | } |
| 3071 | 3169 | ||
| 3072 | rtl8169_init_phy(dev, tp); | ||
| 3073 | |||
| 3074 | /* | ||
| 3075 | * Pretend we are using VLANs; This bypasses a nasty bug where | ||
| 3076 | * Interrupts stop flowing on high load on 8110SCd controllers. | ||
| 3077 | */ | ||
| 3078 | if (tp->mac_version == RTL_GIGA_MAC_VER_05) | ||
| 3079 | RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | RxVlan); | ||
| 3080 | |||
| 3081 | device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL); | 3170 | device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL); |
| 3082 | 3171 | ||
| 3083 | if (pci_dev_run_wake(pdev)) | 3172 | if (pci_dev_run_wake(pdev)) |
| @@ -3127,6 +3216,7 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev) | |||
| 3127 | static int rtl8169_open(struct net_device *dev) | 3216 | static int rtl8169_open(struct net_device *dev) |
| 3128 | { | 3217 | { |
| 3129 | struct rtl8169_private *tp = netdev_priv(dev); | 3218 | struct rtl8169_private *tp = netdev_priv(dev); |
| 3219 | void __iomem *ioaddr = tp->mmio_addr; | ||
| 3130 | struct pci_dev *pdev = tp->pci_dev; | 3220 | struct pci_dev *pdev = tp->pci_dev; |
| 3131 | int retval = -ENOMEM; | 3221 | int retval = -ENOMEM; |
| 3132 | 3222 | ||
| @@ -3162,6 +3252,15 @@ static int rtl8169_open(struct net_device *dev) | |||
| 3162 | 3252 | ||
| 3163 | napi_enable(&tp->napi); | 3253 | napi_enable(&tp->napi); |
| 3164 | 3254 | ||
| 3255 | rtl8169_init_phy(dev, tp); | ||
| 3256 | |||
| 3257 | /* | ||
| 3258 | * Pretend we are using VLANs; This bypasses a nasty bug where | ||
| 3259 | * Interrupts stop flowing on high load on 8110SCd controllers. | ||
| 3260 | */ | ||
| 3261 | if (tp->mac_version == RTL_GIGA_MAC_VER_05) | ||
| 3262 | RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | RxVlan); | ||
| 3263 | |||
| 3165 | rtl_pll_power_up(tp); | 3264 | rtl_pll_power_up(tp); |
| 3166 | 3265 | ||
| 3167 | rtl_hw_start(dev); | 3266 | rtl_hw_start(dev); |
| @@ -3171,7 +3270,7 @@ static int rtl8169_open(struct net_device *dev) | |||
| 3171 | tp->saved_wolopts = 0; | 3270 | tp->saved_wolopts = 0; |
| 3172 | pm_runtime_put_noidle(&pdev->dev); | 3271 | pm_runtime_put_noidle(&pdev->dev); |
| 3173 | 3272 | ||
| 3174 | rtl8169_check_link_status(dev, tp, tp->mmio_addr); | 3273 | rtl8169_check_link_status(dev, tp, ioaddr); |
| 3175 | out: | 3274 | out: |
| 3176 | return retval; | 3275 | return retval; |
| 3177 | 3276 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 39996bf3b247..7d85a38377a1 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -46,10 +46,6 @@ | |||
| 46 | 46 | ||
| 47 | #include <asm/irq.h> | 47 | #include <asm/irq.h> |
| 48 | 48 | ||
| 49 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | ||
| 50 | #define SKY2_VLAN_TAG_USED 1 | ||
| 51 | #endif | ||
| 52 | |||
| 53 | #include "sky2.h" | 49 | #include "sky2.h" |
| 54 | 50 | ||
| 55 | #define DRV_NAME "sky2" | 51 | #define DRV_NAME "sky2" |
| @@ -1326,40 +1322,35 @@ static int sky2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 1326 | return err; | 1322 | return err; |
| 1327 | } | 1323 | } |
| 1328 | 1324 | ||
| 1329 | #ifdef SKY2_VLAN_TAG_USED | 1325 | #define NETIF_F_ALL_VLAN (NETIF_F_HW_VLAN_TX|NETIF_F_HW_VLAN_RX) |
| 1330 | static void sky2_set_vlan_mode(struct sky2_hw *hw, u16 port, bool onoff) | 1326 | |
| 1327 | static void sky2_vlan_mode(struct net_device *dev) | ||
| 1331 | { | 1328 | { |
| 1332 | if (onoff) { | 1329 | struct sky2_port *sky2 = netdev_priv(dev); |
| 1330 | struct sky2_hw *hw = sky2->hw; | ||
| 1331 | u16 port = sky2->port; | ||
| 1332 | |||
| 1333 | if (dev->features & NETIF_F_HW_VLAN_RX) | ||
| 1333 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), | 1334 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), |
| 1334 | RX_VLAN_STRIP_ON); | 1335 | RX_VLAN_STRIP_ON); |
| 1335 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), | 1336 | else |
| 1336 | TX_VLAN_TAG_ON); | ||
| 1337 | } else { | ||
| 1338 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), | 1337 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), |
| 1339 | RX_VLAN_STRIP_OFF); | 1338 | RX_VLAN_STRIP_OFF); |
| 1339 | |||
| 1340 | dev->vlan_features = dev->features &~ NETIF_F_ALL_VLAN; | ||
| 1341 | if (dev->features & NETIF_F_HW_VLAN_TX) | ||
| 1342 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), | ||
| 1343 | TX_VLAN_TAG_ON); | ||
| 1344 | else { | ||
| 1340 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), | 1345 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), |
| 1341 | TX_VLAN_TAG_OFF); | 1346 | TX_VLAN_TAG_OFF); |
| 1347 | |||
| 1348 | /* Can't do transmit offload of vlan without hw vlan */ | ||
| 1349 | dev->vlan_features &= ~(NETIF_F_TSO | NETIF_F_SG | ||
| 1350 | | NETIF_F_ALL_CSUM); | ||
| 1342 | } | 1351 | } |
| 1343 | } | 1352 | } |
| 1344 | 1353 | ||
| 1345 | static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | ||
| 1346 | { | ||
| 1347 | struct sky2_port *sky2 = netdev_priv(dev); | ||
| 1348 | struct sky2_hw *hw = sky2->hw; | ||
| 1349 | u16 port = sky2->port; | ||
| 1350 | |||
| 1351 | netif_tx_lock_bh(dev); | ||
| 1352 | napi_disable(&hw->napi); | ||
| 1353 | |||
| 1354 | sky2->vlgrp = grp; | ||
| 1355 | sky2_set_vlan_mode(hw, port, grp != NULL); | ||
| 1356 | |||
| 1357 | sky2_read32(hw, B0_Y2_SP_LISR); | ||
| 1358 | napi_enable(&hw->napi); | ||
| 1359 | netif_tx_unlock_bh(dev); | ||
| 1360 | } | ||
| 1361 | #endif | ||
| 1362 | |||
| 1363 | /* Amount of required worst case padding in rx buffer */ | 1354 | /* Amount of required worst case padding in rx buffer */ |
| 1364 | static inline unsigned sky2_rx_pad(const struct sky2_hw *hw) | 1355 | static inline unsigned sky2_rx_pad(const struct sky2_hw *hw) |
| 1365 | { | 1356 | { |
| @@ -1635,9 +1626,7 @@ static void sky2_hw_up(struct sky2_port *sky2) | |||
| 1635 | sky2_prefetch_init(hw, txqaddr[port], sky2->tx_le_map, | 1626 | sky2_prefetch_init(hw, txqaddr[port], sky2->tx_le_map, |
| 1636 | sky2->tx_ring_size - 1); | 1627 | sky2->tx_ring_size - 1); |
| 1637 | 1628 | ||
| 1638 | #ifdef SKY2_VLAN_TAG_USED | 1629 | sky2_vlan_mode(sky2->netdev); |
| 1639 | sky2_set_vlan_mode(hw, port, sky2->vlgrp != NULL); | ||
| 1640 | #endif | ||
| 1641 | 1630 | ||
| 1642 | sky2_rx_start(sky2); | 1631 | sky2_rx_start(sky2); |
| 1643 | } | 1632 | } |
| @@ -1780,7 +1769,7 @@ static netdev_tx_t sky2_xmit_frame(struct sk_buff *skb, | |||
| 1780 | } | 1769 | } |
| 1781 | 1770 | ||
| 1782 | ctrl = 0; | 1771 | ctrl = 0; |
| 1783 | #ifdef SKY2_VLAN_TAG_USED | 1772 | |
| 1784 | /* Add VLAN tag, can piggyback on LRGLEN or ADDR64 */ | 1773 | /* Add VLAN tag, can piggyback on LRGLEN or ADDR64 */ |
| 1785 | if (vlan_tx_tag_present(skb)) { | 1774 | if (vlan_tx_tag_present(skb)) { |
| 1786 | if (!le) { | 1775 | if (!le) { |
| @@ -1792,7 +1781,6 @@ static netdev_tx_t sky2_xmit_frame(struct sk_buff *skb, | |||
| 1792 | le->length = cpu_to_be16(vlan_tx_tag_get(skb)); | 1781 | le->length = cpu_to_be16(vlan_tx_tag_get(skb)); |
| 1793 | ctrl |= INS_VLAN; | 1782 | ctrl |= INS_VLAN; |
| 1794 | } | 1783 | } |
| 1795 | #endif | ||
| 1796 | 1784 | ||
| 1797 | /* Handle TCP checksum offload */ | 1785 | /* Handle TCP checksum offload */ |
| 1798 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 1786 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| @@ -2432,11 +2420,8 @@ static struct sk_buff *sky2_receive(struct net_device *dev, | |||
| 2432 | struct sk_buff *skb = NULL; | 2420 | struct sk_buff *skb = NULL; |
| 2433 | u16 count = (status & GMR_FS_LEN) >> 16; | 2421 | u16 count = (status & GMR_FS_LEN) >> 16; |
| 2434 | 2422 | ||
| 2435 | #ifdef SKY2_VLAN_TAG_USED | 2423 | if (status & GMR_FS_VLAN) |
| 2436 | /* Account for vlan tag */ | 2424 | count -= VLAN_HLEN; /* Account for vlan tag */ |
| 2437 | if (sky2->vlgrp && (status & GMR_FS_VLAN)) | ||
| 2438 | count -= VLAN_HLEN; | ||
| 2439 | #endif | ||
| 2440 | 2425 | ||
| 2441 | netif_printk(sky2, rx_status, KERN_DEBUG, dev, | 2426 | netif_printk(sky2, rx_status, KERN_DEBUG, dev, |
| 2442 | "rx slot %u status 0x%x len %d\n", | 2427 | "rx slot %u status 0x%x len %d\n", |
| @@ -2504,17 +2489,9 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last) | |||
| 2504 | static inline void sky2_skb_rx(const struct sky2_port *sky2, | 2489 | static inline void sky2_skb_rx(const struct sky2_port *sky2, |
| 2505 | u32 status, struct sk_buff *skb) | 2490 | u32 status, struct sk_buff *skb) |
| 2506 | { | 2491 | { |
| 2507 | #ifdef SKY2_VLAN_TAG_USED | 2492 | if (status & GMR_FS_VLAN) |
| 2508 | u16 vlan_tag = be16_to_cpu(sky2->rx_tag); | 2493 | __vlan_hwaccel_put_tag(skb, be16_to_cpu(sky2->rx_tag)); |
| 2509 | if (sky2->vlgrp && (status & GMR_FS_VLAN)) { | 2494 | |
| 2510 | if (skb->ip_summed == CHECKSUM_NONE) | ||
| 2511 | vlan_hwaccel_receive_skb(skb, sky2->vlgrp, vlan_tag); | ||
| 2512 | else | ||
| 2513 | vlan_gro_receive(&sky2->hw->napi, sky2->vlgrp, | ||
| 2514 | vlan_tag, skb); | ||
| 2515 | return; | ||
| 2516 | } | ||
| 2517 | #endif | ||
| 2518 | if (skb->ip_summed == CHECKSUM_NONE) | 2495 | if (skb->ip_summed == CHECKSUM_NONE) |
| 2519 | netif_receive_skb(skb); | 2496 | netif_receive_skb(skb); |
| 2520 | else | 2497 | else |
| @@ -2631,7 +2608,6 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) | |||
| 2631 | goto exit_loop; | 2608 | goto exit_loop; |
| 2632 | break; | 2609 | break; |
| 2633 | 2610 | ||
| 2634 | #ifdef SKY2_VLAN_TAG_USED | ||
| 2635 | case OP_RXVLAN: | 2611 | case OP_RXVLAN: |
| 2636 | sky2->rx_tag = length; | 2612 | sky2->rx_tag = length; |
| 2637 | break; | 2613 | break; |
| @@ -2639,7 +2615,6 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) | |||
| 2639 | case OP_RXCHKSVLAN: | 2615 | case OP_RXCHKSVLAN: |
| 2640 | sky2->rx_tag = length; | 2616 | sky2->rx_tag = length; |
| 2641 | /* fall through */ | 2617 | /* fall through */ |
| 2642 | #endif | ||
| 2643 | case OP_RXCHKS: | 2618 | case OP_RXCHKS: |
| 2644 | if (likely(sky2->flags & SKY2_FLAG_RX_CHECKSUM)) | 2619 | if (likely(sky2->flags & SKY2_FLAG_RX_CHECKSUM)) |
| 2645 | sky2_rx_checksum(sky2, status); | 2620 | sky2_rx_checksum(sky2, status); |
| @@ -3042,6 +3017,10 @@ static int __devinit sky2_init(struct sky2_hw *hw) | |||
| 3042 | | SKY2_HW_NEW_LE | 3017 | | SKY2_HW_NEW_LE |
| 3043 | | SKY2_HW_AUTO_TX_SUM | 3018 | | SKY2_HW_AUTO_TX_SUM |
| 3044 | | SKY2_HW_ADV_POWER_CTL; | 3019 | | SKY2_HW_ADV_POWER_CTL; |
| 3020 | |||
| 3021 | /* The workaround for status conflicts VLAN tag detection. */ | ||
| 3022 | if (hw->chip_rev == CHIP_REV_YU_FE2_A0) | ||
| 3023 | hw->flags |= SKY2_HW_VLAN_BROKEN; | ||
| 3045 | break; | 3024 | break; |
| 3046 | 3025 | ||
| 3047 | case CHIP_ID_YUKON_SUPR: | 3026 | case CHIP_ID_YUKON_SUPR: |
| @@ -3411,18 +3390,15 @@ static u32 sky2_supported_modes(const struct sky2_hw *hw) | |||
| 3411 | u32 modes = SUPPORTED_10baseT_Half | 3390 | u32 modes = SUPPORTED_10baseT_Half |
| 3412 | | SUPPORTED_10baseT_Full | 3391 | | SUPPORTED_10baseT_Full |
| 3413 | | SUPPORTED_100baseT_Half | 3392 | | SUPPORTED_100baseT_Half |
| 3414 | | SUPPORTED_100baseT_Full | 3393 | | SUPPORTED_100baseT_Full; |
| 3415 | | SUPPORTED_Autoneg | SUPPORTED_TP; | ||
| 3416 | 3394 | ||
| 3417 | if (hw->flags & SKY2_HW_GIGABIT) | 3395 | if (hw->flags & SKY2_HW_GIGABIT) |
| 3418 | modes |= SUPPORTED_1000baseT_Half | 3396 | modes |= SUPPORTED_1000baseT_Half |
| 3419 | | SUPPORTED_1000baseT_Full; | 3397 | | SUPPORTED_1000baseT_Full; |
| 3420 | return modes; | 3398 | return modes; |
| 3421 | } else | 3399 | } else |
| 3422 | return SUPPORTED_1000baseT_Half | 3400 | return SUPPORTED_1000baseT_Half |
| 3423 | | SUPPORTED_1000baseT_Full | 3401 | | SUPPORTED_1000baseT_Full; |
| 3424 | | SUPPORTED_Autoneg | ||
| 3425 | | SUPPORTED_FIBRE; | ||
| 3426 | } | 3402 | } |
| 3427 | 3403 | ||
| 3428 | static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | 3404 | static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) |
| @@ -3436,9 +3412,11 @@ static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
| 3436 | if (sky2_is_copper(hw)) { | 3412 | if (sky2_is_copper(hw)) { |
| 3437 | ecmd->port = PORT_TP; | 3413 | ecmd->port = PORT_TP; |
| 3438 | ecmd->speed = sky2->speed; | 3414 | ecmd->speed = sky2->speed; |
| 3415 | ecmd->supported |= SUPPORTED_Autoneg | SUPPORTED_TP; | ||
| 3439 | } else { | 3416 | } else { |
| 3440 | ecmd->speed = SPEED_1000; | 3417 | ecmd->speed = SPEED_1000; |
| 3441 | ecmd->port = PORT_FIBRE; | 3418 | ecmd->port = PORT_FIBRE; |
| 3419 | ecmd->supported |= SUPPORTED_Autoneg | SUPPORTED_FIBRE; | ||
| 3442 | } | 3420 | } |
| 3443 | 3421 | ||
| 3444 | ecmd->advertising = sky2->advertising; | 3422 | ecmd->advertising = sky2->advertising; |
| @@ -3455,8 +3433,19 @@ static int sky2_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
| 3455 | u32 supported = sky2_supported_modes(hw); | 3433 | u32 supported = sky2_supported_modes(hw); |
| 3456 | 3434 | ||
| 3457 | if (ecmd->autoneg == AUTONEG_ENABLE) { | 3435 | if (ecmd->autoneg == AUTONEG_ENABLE) { |
| 3436 | if (ecmd->advertising & ~supported) | ||
| 3437 | return -EINVAL; | ||
| 3438 | |||
| 3439 | if (sky2_is_copper(hw)) | ||
| 3440 | sky2->advertising = ecmd->advertising | | ||
| 3441 | ADVERTISED_TP | | ||
| 3442 | ADVERTISED_Autoneg; | ||
| 3443 | else | ||
| 3444 | sky2->advertising = ecmd->advertising | | ||
| 3445 | ADVERTISED_FIBRE | | ||
| 3446 | ADVERTISED_Autoneg; | ||
| 3447 | |||
| 3458 | sky2->flags |= SKY2_FLAG_AUTO_SPEED; | 3448 | sky2->flags |= SKY2_FLAG_AUTO_SPEED; |
| 3459 | ecmd->advertising = supported; | ||
| 3460 | sky2->duplex = -1; | 3449 | sky2->duplex = -1; |
| 3461 | sky2->speed = -1; | 3450 | sky2->speed = -1; |
| 3462 | } else { | 3451 | } else { |
| @@ -3500,8 +3489,6 @@ static int sky2_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
| 3500 | sky2->flags &= ~SKY2_FLAG_AUTO_SPEED; | 3489 | sky2->flags &= ~SKY2_FLAG_AUTO_SPEED; |
| 3501 | } | 3490 | } |
| 3502 | 3491 | ||
| 3503 | sky2->advertising = ecmd->advertising; | ||
| 3504 | |||
| 3505 | if (netif_running(dev)) { | 3492 | if (netif_running(dev)) { |
| 3506 | sky2_phy_reinit(sky2); | 3493 | sky2_phy_reinit(sky2); |
| 3507 | sky2_set_multicast(dev); | 3494 | sky2_set_multicast(dev); |
| @@ -4229,15 +4216,28 @@ static int sky2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom | |||
| 4229 | static int sky2_set_flags(struct net_device *dev, u32 data) | 4216 | static int sky2_set_flags(struct net_device *dev, u32 data) |
| 4230 | { | 4217 | { |
| 4231 | struct sky2_port *sky2 = netdev_priv(dev); | 4218 | struct sky2_port *sky2 = netdev_priv(dev); |
| 4232 | u32 supported = | 4219 | unsigned long old_feat = dev->features; |
| 4233 | (sky2->hw->flags & SKY2_HW_RSS_BROKEN) ? 0 : ETH_FLAG_RXHASH; | 4220 | u32 supported = 0; |
| 4234 | int rc; | 4221 | int rc; |
| 4235 | 4222 | ||
| 4223 | if (!(sky2->hw->flags & SKY2_HW_RSS_BROKEN)) | ||
| 4224 | supported |= ETH_FLAG_RXHASH; | ||
| 4225 | |||
| 4226 | if (!(sky2->hw->flags & SKY2_HW_VLAN_BROKEN)) | ||
| 4227 | supported |= ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN; | ||
| 4228 | |||
| 4229 | printk(KERN_DEBUG "sky2 set_flags: supported %x data %x\n", | ||
| 4230 | supported, data); | ||
| 4231 | |||
| 4236 | rc = ethtool_op_set_flags(dev, data, supported); | 4232 | rc = ethtool_op_set_flags(dev, data, supported); |
| 4237 | if (rc) | 4233 | if (rc) |
| 4238 | return rc; | 4234 | return rc; |
| 4239 | 4235 | ||
| 4240 | rx_set_rss(dev); | 4236 | if ((old_feat ^ dev->features) & NETIF_F_RXHASH) |
| 4237 | rx_set_rss(dev); | ||
| 4238 | |||
| 4239 | if ((old_feat ^ dev->features) & NETIF_F_ALL_VLAN) | ||
| 4240 | sky2_vlan_mode(dev); | ||
| 4241 | 4241 | ||
| 4242 | return 0; | 4242 | return 0; |
| 4243 | } | 4243 | } |
| @@ -4273,6 +4273,7 @@ static const struct ethtool_ops sky2_ethtool_ops = { | |||
| 4273 | .get_sset_count = sky2_get_sset_count, | 4273 | .get_sset_count = sky2_get_sset_count, |
| 4274 | .get_ethtool_stats = sky2_get_ethtool_stats, | 4274 | .get_ethtool_stats = sky2_get_ethtool_stats, |
| 4275 | .set_flags = sky2_set_flags, | 4275 | .set_flags = sky2_set_flags, |
| 4276 | .get_flags = ethtool_op_get_flags, | ||
| 4276 | }; | 4277 | }; |
| 4277 | 4278 | ||
| 4278 | #ifdef CONFIG_SKY2_DEBUG | 4279 | #ifdef CONFIG_SKY2_DEBUG |
| @@ -4554,9 +4555,6 @@ static const struct net_device_ops sky2_netdev_ops[2] = { | |||
| 4554 | .ndo_change_mtu = sky2_change_mtu, | 4555 | .ndo_change_mtu = sky2_change_mtu, |
| 4555 | .ndo_tx_timeout = sky2_tx_timeout, | 4556 | .ndo_tx_timeout = sky2_tx_timeout, |
| 4556 | .ndo_get_stats64 = sky2_get_stats, | 4557 | .ndo_get_stats64 = sky2_get_stats, |
| 4557 | #ifdef SKY2_VLAN_TAG_USED | ||
| 4558 | .ndo_vlan_rx_register = sky2_vlan_rx_register, | ||
| 4559 | #endif | ||
| 4560 | #ifdef CONFIG_NET_POLL_CONTROLLER | 4558 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 4561 | .ndo_poll_controller = sky2_netpoll, | 4559 | .ndo_poll_controller = sky2_netpoll, |
| 4562 | #endif | 4560 | #endif |
| @@ -4572,9 +4570,6 @@ static const struct net_device_ops sky2_netdev_ops[2] = { | |||
| 4572 | .ndo_change_mtu = sky2_change_mtu, | 4570 | .ndo_change_mtu = sky2_change_mtu, |
| 4573 | .ndo_tx_timeout = sky2_tx_timeout, | 4571 | .ndo_tx_timeout = sky2_tx_timeout, |
| 4574 | .ndo_get_stats64 = sky2_get_stats, | 4572 | .ndo_get_stats64 = sky2_get_stats, |
| 4575 | #ifdef SKY2_VLAN_TAG_USED | ||
| 4576 | .ndo_vlan_rx_register = sky2_vlan_rx_register, | ||
| 4577 | #endif | ||
| 4578 | }, | 4573 | }, |
| 4579 | }; | 4574 | }; |
| 4580 | 4575 | ||
| @@ -4625,7 +4620,8 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw, | |||
| 4625 | sky2->port = port; | 4620 | sky2->port = port; |
| 4626 | 4621 | ||
| 4627 | dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG | 4622 | dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG |
| 4628 | | NETIF_F_TSO | NETIF_F_GRO; | 4623 | | NETIF_F_TSO | NETIF_F_GRO; |
| 4624 | |||
| 4629 | if (highmem) | 4625 | if (highmem) |
| 4630 | dev->features |= NETIF_F_HIGHDMA; | 4626 | dev->features |= NETIF_F_HIGHDMA; |
| 4631 | 4627 | ||
| @@ -4633,13 +4629,8 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw, | |||
| 4633 | if (!(hw->flags & SKY2_HW_RSS_BROKEN)) | 4629 | if (!(hw->flags & SKY2_HW_RSS_BROKEN)) |
| 4634 | dev->features |= NETIF_F_RXHASH; | 4630 | dev->features |= NETIF_F_RXHASH; |
| 4635 | 4631 | ||
| 4636 | #ifdef SKY2_VLAN_TAG_USED | 4632 | if (!(hw->flags & SKY2_HW_VLAN_BROKEN)) |
| 4637 | /* The workaround for FE+ status conflicts with VLAN tag detection. */ | ||
| 4638 | if (!(sky2->hw->chip_id == CHIP_ID_YUKON_FE_P && | ||
| 4639 | sky2->hw->chip_rev == CHIP_REV_YU_FE2_A0)) { | ||
| 4640 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 4633 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
| 4641 | } | ||
| 4642 | #endif | ||
| 4643 | 4634 | ||
| 4644 | /* read the mac address */ | 4635 | /* read the mac address */ |
| 4645 | memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN); | 4636 | memcpy_fromio(dev->dev_addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN); |
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 80bdc404f1ea..6861b0e8db9a 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
| @@ -2236,11 +2236,8 @@ struct sky2_port { | |||
| 2236 | u16 rx_pending; | 2236 | u16 rx_pending; |
| 2237 | u16 rx_data_size; | 2237 | u16 rx_data_size; |
| 2238 | u16 rx_nfrags; | 2238 | u16 rx_nfrags; |
| 2239 | |||
| 2240 | #ifdef SKY2_VLAN_TAG_USED | ||
| 2241 | u16 rx_tag; | 2239 | u16 rx_tag; |
| 2242 | struct vlan_group *vlgrp; | 2240 | |
| 2243 | #endif | ||
| 2244 | struct { | 2241 | struct { |
| 2245 | unsigned long last; | 2242 | unsigned long last; |
| 2246 | u32 mac_rp; | 2243 | u32 mac_rp; |
| @@ -2284,6 +2281,7 @@ struct sky2_hw { | |||
| 2284 | #define SKY2_HW_AUTO_TX_SUM 0x00000040 /* new IP decode for Tx */ | 2281 | #define SKY2_HW_AUTO_TX_SUM 0x00000040 /* new IP decode for Tx */ |
| 2285 | #define SKY2_HW_ADV_POWER_CTL 0x00000080 /* additional PHY power regs */ | 2282 | #define SKY2_HW_ADV_POWER_CTL 0x00000080 /* additional PHY power regs */ |
| 2286 | #define SKY2_HW_RSS_BROKEN 0x00000100 | 2283 | #define SKY2_HW_RSS_BROKEN 0x00000100 |
| 2284 | #define SKY2_HW_VLAN_BROKEN 0x00000200 | ||
| 2287 | 2285 | ||
| 2288 | u8 chip_id; | 2286 | u8 chip_id; |
| 2289 | u8 chip_rev; | 2287 | u8 chip_rev; |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index cdbeec9f83ea..546de5749824 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -488,7 +488,7 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 488 | 488 | ||
| 489 | if (unlikely(!netif_carrier_ok(dev) || | 489 | if (unlikely(!netif_carrier_ok(dev) || |
| 490 | (frags > 1 && !xennet_can_sg(dev)) || | 490 | (frags > 1 && !xennet_can_sg(dev)) || |
| 491 | netif_needs_gso(dev, skb))) { | 491 | netif_needs_gso(skb, netif_skb_features(skb)))) { |
| 492 | spin_unlock_irq(&np->tx_lock); | 492 | spin_unlock_irq(&np->tx_lock); |
| 493 | goto drop; | 493 | goto drop; |
| 494 | } | 494 | } |
diff --git a/include/linux/bfin_mac.h b/include/linux/bfin_mac.h index 904dec7d03a1..a69554ef8476 100644 --- a/include/linux/bfin_mac.h +++ b/include/linux/bfin_mac.h | |||
| @@ -24,6 +24,7 @@ struct bfin_mii_bus_platform_data { | |||
| 24 | const unsigned short *mac_peripherals; | 24 | const unsigned short *mac_peripherals; |
| 25 | int phy_mode; | 25 | int phy_mode; |
| 26 | unsigned int phy_mask; | 26 | unsigned int phy_mask; |
| 27 | unsigned short vlan1_mask, vlan2_mask; | ||
| 27 | }; | 28 | }; |
| 28 | 29 | ||
| 29 | #endif | 30 | #endif |
diff --git a/include/linux/etherdevice.h b/include/linux/etherdevice.h index f16a01081e15..bec8b82889bf 100644 --- a/include/linux/etherdevice.h +++ b/include/linux/etherdevice.h | |||
| @@ -48,8 +48,10 @@ extern int eth_validate_addr(struct net_device *dev); | |||
| 48 | 48 | ||
| 49 | 49 | ||
| 50 | 50 | ||
| 51 | extern struct net_device *alloc_etherdev_mq(int sizeof_priv, unsigned int queue_count); | 51 | extern struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs, |
| 52 | unsigned int rxqs); | ||
| 52 | #define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1) | 53 | #define alloc_etherdev(sizeof_priv) alloc_etherdev_mq(sizeof_priv, 1) |
| 54 | #define alloc_etherdev_mq(sizeof_priv, count) alloc_etherdev_mqs(sizeof_priv, count, count) | ||
| 53 | 55 | ||
| 54 | /** | 56 | /** |
| 55 | * is_zero_ether_addr - Determine if give Ethernet address is all zeros. | 57 | * is_zero_ether_addr - Determine if give Ethernet address is all zeros. |
diff --git a/include/linux/fec.h b/include/linux/fec.h index 5d3523d8dd0c..bcff455d1d53 100644 --- a/include/linux/fec.h +++ b/include/linux/fec.h | |||
| @@ -3,6 +3,8 @@ | |||
| 3 | * Copyright (c) 2009 Orex Computed Radiography | 3 | * Copyright (c) 2009 Orex Computed Radiography |
| 4 | * Baruch Siach <baruch@tkos.co.il> | 4 | * Baruch Siach <baruch@tkos.co.il> |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2010 Freescale Semiconductor, Inc. | ||
| 7 | * | ||
| 6 | * Header file for the FEC platform data | 8 | * Header file for the FEC platform data |
| 7 | * | 9 | * |
| 8 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| @@ -16,6 +18,7 @@ | |||
| 16 | 18 | ||
| 17 | struct fec_platform_data { | 19 | struct fec_platform_data { |
| 18 | phy_interface_t phy; | 20 | phy_interface_t phy; |
| 21 | unsigned char mac[ETH_ALEN]; | ||
| 19 | }; | 22 | }; |
| 20 | 23 | ||
| 21 | #endif | 24 | #endif |
diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h index f7e73c338c40..dd3f20139640 100644 --- a/include/linux/if_bridge.h +++ b/include/linux/if_bridge.h | |||
| @@ -103,7 +103,7 @@ struct __fdb_entry { | |||
| 103 | 103 | ||
| 104 | extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *)); | 104 | extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *)); |
| 105 | 105 | ||
| 106 | typedef int (*br_should_route_hook_t)(struct sk_buff *skb); | 106 | typedef int br_should_route_hook_t(struct sk_buff *skb); |
| 107 | extern br_should_route_hook_t __rcu *br_should_route_hook; | 107 | extern br_should_route_hook_t __rcu *br_should_route_hook; |
| 108 | 108 | ||
| 109 | #endif | 109 | #endif |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 0f6b1c965815..be4957cf6511 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -2191,11 +2191,15 @@ static inline void netif_addr_unlock_bh(struct net_device *dev) | |||
| 2191 | extern void ether_setup(struct net_device *dev); | 2191 | extern void ether_setup(struct net_device *dev); |
| 2192 | 2192 | ||
| 2193 | /* Support for loadable net-drivers */ | 2193 | /* Support for loadable net-drivers */ |
| 2194 | extern struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | 2194 | extern struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, |
| 2195 | void (*setup)(struct net_device *), | 2195 | void (*setup)(struct net_device *), |
| 2196 | unsigned int queue_count); | 2196 | unsigned int txqs, unsigned int rxqs); |
| 2197 | #define alloc_netdev(sizeof_priv, name, setup) \ | 2197 | #define alloc_netdev(sizeof_priv, name, setup) \ |
| 2198 | alloc_netdev_mq(sizeof_priv, name, setup, 1) | 2198 | alloc_netdev_mqs(sizeof_priv, name, setup, 1, 1) |
| 2199 | |||
| 2200 | #define alloc_netdev_mq(sizeof_priv, name, setup, count) \ | ||
| 2201 | alloc_netdev_mqs(sizeof_priv, name, setup, count, count) | ||
| 2202 | |||
| 2199 | extern int register_netdev(struct net_device *dev); | 2203 | extern int register_netdev(struct net_device *dev); |
| 2200 | extern void unregister_netdev(struct net_device *dev); | 2204 | extern void unregister_netdev(struct net_device *dev); |
| 2201 | 2205 | ||
| @@ -2303,7 +2307,7 @@ unsigned long netdev_fix_features(unsigned long features, const char *name); | |||
| 2303 | void netif_stacked_transfer_operstate(const struct net_device *rootdev, | 2307 | void netif_stacked_transfer_operstate(const struct net_device *rootdev, |
| 2304 | struct net_device *dev); | 2308 | struct net_device *dev); |
| 2305 | 2309 | ||
| 2306 | int netif_get_vlan_features(struct sk_buff *skb, struct net_device *dev); | 2310 | int netif_skb_features(struct sk_buff *skb); |
| 2307 | 2311 | ||
| 2308 | static inline int net_gso_ok(int features, int gso_type) | 2312 | static inline int net_gso_ok(int features, int gso_type) |
| 2309 | { | 2313 | { |
| @@ -2317,16 +2321,10 @@ static inline int skb_gso_ok(struct sk_buff *skb, int features) | |||
| 2317 | (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST)); | 2321 | (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST)); |
| 2318 | } | 2322 | } |
| 2319 | 2323 | ||
| 2320 | static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb) | 2324 | static inline int netif_needs_gso(struct sk_buff *skb, int features) |
| 2321 | { | 2325 | { |
| 2322 | if (skb_is_gso(skb)) { | 2326 | return skb_is_gso(skb) && (!skb_gso_ok(skb, features) || |
| 2323 | int features = netif_get_vlan_features(skb, dev); | 2327 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); |
| 2324 | |||
| 2325 | return (!skb_gso_ok(skb, features) || | ||
| 2326 | unlikely(skb->ip_summed != CHECKSUM_PARTIAL)); | ||
| 2327 | } | ||
| 2328 | |||
| 2329 | return 0; | ||
| 2330 | } | 2328 | } |
| 2331 | 2329 | ||
| 2332 | static inline void netif_set_gso_max_size(struct net_device *dev, | 2330 | static inline void netif_set_gso_max_size(struct net_device *dev, |
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 742bec051440..6712e713b299 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
| @@ -472,7 +472,7 @@ extern void xt_free_table_info(struct xt_table_info *info); | |||
| 472 | * necessary for reading the counters. | 472 | * necessary for reading the counters. |
| 473 | */ | 473 | */ |
| 474 | struct xt_info_lock { | 474 | struct xt_info_lock { |
| 475 | spinlock_t lock; | 475 | seqlock_t lock; |
| 476 | unsigned char readers; | 476 | unsigned char readers; |
| 477 | }; | 477 | }; |
| 478 | DECLARE_PER_CPU(struct xt_info_lock, xt_info_locks); | 478 | DECLARE_PER_CPU(struct xt_info_lock, xt_info_locks); |
| @@ -497,7 +497,7 @@ static inline void xt_info_rdlock_bh(void) | |||
| 497 | local_bh_disable(); | 497 | local_bh_disable(); |
| 498 | lock = &__get_cpu_var(xt_info_locks); | 498 | lock = &__get_cpu_var(xt_info_locks); |
| 499 | if (likely(!lock->readers++)) | 499 | if (likely(!lock->readers++)) |
| 500 | spin_lock(&lock->lock); | 500 | write_seqlock(&lock->lock); |
| 501 | } | 501 | } |
| 502 | 502 | ||
| 503 | static inline void xt_info_rdunlock_bh(void) | 503 | static inline void xt_info_rdunlock_bh(void) |
| @@ -505,7 +505,7 @@ static inline void xt_info_rdunlock_bh(void) | |||
| 505 | struct xt_info_lock *lock = &__get_cpu_var(xt_info_locks); | 505 | struct xt_info_lock *lock = &__get_cpu_var(xt_info_locks); |
| 506 | 506 | ||
| 507 | if (likely(!--lock->readers)) | 507 | if (likely(!--lock->readers)) |
| 508 | spin_unlock(&lock->lock); | 508 | write_sequnlock(&lock->lock); |
| 509 | local_bh_enable(); | 509 | local_bh_enable(); |
| 510 | } | 510 | } |
| 511 | 511 | ||
| @@ -516,12 +516,12 @@ static inline void xt_info_rdunlock_bh(void) | |||
| 516 | */ | 516 | */ |
| 517 | static inline void xt_info_wrlock(unsigned int cpu) | 517 | static inline void xt_info_wrlock(unsigned int cpu) |
| 518 | { | 518 | { |
| 519 | spin_lock(&per_cpu(xt_info_locks, cpu).lock); | 519 | write_seqlock(&per_cpu(xt_info_locks, cpu).lock); |
| 520 | } | 520 | } |
| 521 | 521 | ||
| 522 | static inline void xt_info_wrunlock(unsigned int cpu) | 522 | static inline void xt_info_wrunlock(unsigned int cpu) |
| 523 | { | 523 | { |
| 524 | spin_unlock(&per_cpu(xt_info_locks, cpu).lock); | 524 | write_sequnlock(&per_cpu(xt_info_locks, cpu).lock); |
| 525 | } | 525 | } |
| 526 | 526 | ||
| 527 | /* | 527 | /* |
diff --git a/include/net/ah.h b/include/net/ah.h index f0129f79a31a..be7798dea6f4 100644 --- a/include/net/ah.h +++ b/include/net/ah.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | #include <linux/skbuff.h> | 4 | #include <linux/skbuff.h> |
| 5 | 5 | ||
| 6 | /* This is the maximum truncated ICV length that we know of. */ | 6 | /* This is the maximum truncated ICV length that we know of. */ |
| 7 | #define MAX_AH_AUTH_LEN 12 | 7 | #define MAX_AH_AUTH_LEN 16 |
| 8 | 8 | ||
| 9 | struct crypto_ahash; | 9 | struct crypto_ahash; |
| 10 | 10 | ||
diff --git a/include/net/arp.h b/include/net/arp.h index f4cf6ce66586..91f0568a04ef 100644 --- a/include/net/arp.h +++ b/include/net/arp.h | |||
| @@ -25,5 +25,6 @@ extern struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip, | |||
| 25 | const unsigned char *src_hw, | 25 | const unsigned char *src_hw, |
| 26 | const unsigned char *target_hw); | 26 | const unsigned char *target_hw); |
| 27 | extern void arp_xmit(struct sk_buff *skb); | 27 | extern void arp_xmit(struct sk_buff *skb); |
| 28 | int arp_invalidate(struct net_device *dev, __be32 ip); | ||
| 28 | 29 | ||
| 29 | #endif /* _ARP_H */ | 30 | #endif /* _ARP_H */ |
diff --git a/include/net/phonet/phonet.h b/include/net/phonet/phonet.h index d5df797f9540..5395e09187df 100644 --- a/include/net/phonet/phonet.h +++ b/include/net/phonet/phonet.h | |||
| @@ -107,8 +107,8 @@ struct phonet_protocol { | |||
| 107 | int sock_type; | 107 | int sock_type; |
| 108 | }; | 108 | }; |
| 109 | 109 | ||
| 110 | int phonet_proto_register(int protocol, struct phonet_protocol *pp); | 110 | int phonet_proto_register(unsigned int protocol, struct phonet_protocol *pp); |
| 111 | void phonet_proto_unregister(int protocol, struct phonet_protocol *pp); | 111 | void phonet_proto_unregister(unsigned int protocol, struct phonet_protocol *pp); |
| 112 | 112 | ||
| 113 | int phonet_sysctl_init(void); | 113 | int phonet_sysctl_init(void); |
| 114 | void phonet_sysctl_exit(void); | 114 | void phonet_sysctl_exit(void); |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 0af57ebae762..e9eee99d8b1f 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
| @@ -207,7 +207,7 @@ static inline int qdisc_qlen(struct Qdisc *q) | |||
| 207 | return q->q.qlen; | 207 | return q->q.qlen; |
| 208 | } | 208 | } |
| 209 | 209 | ||
| 210 | static inline struct qdisc_skb_cb *qdisc_skb_cb(struct sk_buff *skb) | 210 | static inline struct qdisc_skb_cb *qdisc_skb_cb(const struct sk_buff *skb) |
| 211 | { | 211 | { |
| 212 | return (struct qdisc_skb_cb *)skb->cb; | 212 | return (struct qdisc_skb_cb *)skb->cb; |
| 213 | } | 213 | } |
| @@ -394,7 +394,7 @@ static inline bool qdisc_tx_is_noop(const struct net_device *dev) | |||
| 394 | return true; | 394 | return true; |
| 395 | } | 395 | } |
| 396 | 396 | ||
| 397 | static inline unsigned int qdisc_pkt_len(struct sk_buff *skb) | 397 | static inline unsigned int qdisc_pkt_len(const struct sk_buff *skb) |
| 398 | { | 398 | { |
| 399 | return qdisc_skb_cb(skb)->pkt_len; | 399 | return qdisc_skb_cb(skb)->pkt_len; |
| 400 | } | 400 | } |
| @@ -426,10 +426,18 @@ static inline int qdisc_enqueue_root(struct sk_buff *skb, struct Qdisc *sch) | |||
| 426 | return qdisc_enqueue(skb, sch) & NET_XMIT_MASK; | 426 | return qdisc_enqueue(skb, sch) & NET_XMIT_MASK; |
| 427 | } | 427 | } |
| 428 | 428 | ||
| 429 | static inline void __qdisc_update_bstats(struct Qdisc *sch, unsigned int len) | 429 | |
| 430 | static inline void bstats_update(struct gnet_stats_basic_packed *bstats, | ||
| 431 | const struct sk_buff *skb) | ||
| 432 | { | ||
| 433 | bstats->bytes += qdisc_pkt_len(skb); | ||
| 434 | bstats->packets += skb_is_gso(skb) ? skb_shinfo(skb)->gso_segs : 1; | ||
| 435 | } | ||
| 436 | |||
| 437 | static inline void qdisc_bstats_update(struct Qdisc *sch, | ||
| 438 | const struct sk_buff *skb) | ||
| 430 | { | 439 | { |
| 431 | sch->bstats.bytes += len; | 440 | bstats_update(&sch->bstats, skb); |
| 432 | sch->bstats.packets++; | ||
| 433 | } | 441 | } |
| 434 | 442 | ||
| 435 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, | 443 | static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, |
| @@ -437,7 +445,7 @@ static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch, | |||
| 437 | { | 445 | { |
| 438 | __skb_queue_tail(list, skb); | 446 | __skb_queue_tail(list, skb); |
| 439 | sch->qstats.backlog += qdisc_pkt_len(skb); | 447 | sch->qstats.backlog += qdisc_pkt_len(skb); |
| 440 | __qdisc_update_bstats(sch, qdisc_pkt_len(skb)); | 448 | qdisc_bstats_update(sch, skb); |
| 441 | 449 | ||
| 442 | return NET_XMIT_SUCCESS; | 450 | return NET_XMIT_SUCCESS; |
| 443 | } | 451 | } |
diff --git a/include/net/sock.h b/include/net/sock.h index 21a02f7e4f45..d884d268c704 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -152,14 +152,18 @@ struct sock_common { | |||
| 152 | * fields between dontcopy_begin/dontcopy_end | 152 | * fields between dontcopy_begin/dontcopy_end |
| 153 | * are not copied in sock_copy() | 153 | * are not copied in sock_copy() |
| 154 | */ | 154 | */ |
| 155 | /* private: */ | ||
| 155 | int skc_dontcopy_begin[0]; | 156 | int skc_dontcopy_begin[0]; |
| 157 | /* public: */ | ||
| 156 | union { | 158 | union { |
| 157 | struct hlist_node skc_node; | 159 | struct hlist_node skc_node; |
| 158 | struct hlist_nulls_node skc_nulls_node; | 160 | struct hlist_nulls_node skc_nulls_node; |
| 159 | }; | 161 | }; |
| 160 | int skc_tx_queue_mapping; | 162 | int skc_tx_queue_mapping; |
| 161 | atomic_t skc_refcnt; | 163 | atomic_t skc_refcnt; |
| 164 | /* private: */ | ||
| 162 | int skc_dontcopy_end[0]; | 165 | int skc_dontcopy_end[0]; |
| 166 | /* public: */ | ||
| 163 | }; | 167 | }; |
| 164 | 168 | ||
| 165 | /** | 169 | /** |
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index 1bf0cf503796..8184c031d028 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
| @@ -740,12 +740,12 @@ static int setsockopt(struct socket *sock, | |||
| 740 | if (cf_sk->sk.sk_protocol != CAIFPROTO_UTIL) | 740 | if (cf_sk->sk.sk_protocol != CAIFPROTO_UTIL) |
| 741 | return -ENOPROTOOPT; | 741 | return -ENOPROTOOPT; |
| 742 | lock_sock(&(cf_sk->sk)); | 742 | lock_sock(&(cf_sk->sk)); |
| 743 | cf_sk->conn_req.param.size = ol; | ||
| 744 | if (ol > sizeof(cf_sk->conn_req.param.data) || | 743 | if (ol > sizeof(cf_sk->conn_req.param.data) || |
| 745 | copy_from_user(&cf_sk->conn_req.param.data, ov, ol)) { | 744 | copy_from_user(&cf_sk->conn_req.param.data, ov, ol)) { |
| 746 | release_sock(&cf_sk->sk); | 745 | release_sock(&cf_sk->sk); |
| 747 | return -EINVAL; | 746 | return -EINVAL; |
| 748 | } | 747 | } |
| 748 | cf_sk->conn_req.param.size = ol; | ||
| 749 | release_sock(&cf_sk->sk); | 749 | release_sock(&cf_sk->sk); |
| 750 | return 0; | 750 | return 0; |
| 751 | 751 | ||
diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c index 84a422c98941..fa9dab372b68 100644 --- a/net/caif/chnl_net.c +++ b/net/caif/chnl_net.c | |||
| @@ -76,6 +76,8 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt) | |||
| 76 | struct chnl_net *priv = container_of(layr, struct chnl_net, chnl); | 76 | struct chnl_net *priv = container_of(layr, struct chnl_net, chnl); |
| 77 | int pktlen; | 77 | int pktlen; |
| 78 | int err = 0; | 78 | int err = 0; |
| 79 | const u8 *ip_version; | ||
| 80 | u8 buf; | ||
| 79 | 81 | ||
| 80 | priv = container_of(layr, struct chnl_net, chnl); | 82 | priv = container_of(layr, struct chnl_net, chnl); |
| 81 | 83 | ||
| @@ -90,7 +92,21 @@ static int chnl_recv_cb(struct cflayer *layr, struct cfpkt *pkt) | |||
| 90 | * send the packet to the net stack. | 92 | * send the packet to the net stack. |
| 91 | */ | 93 | */ |
| 92 | skb->dev = priv->netdev; | 94 | skb->dev = priv->netdev; |
| 93 | skb->protocol = htons(ETH_P_IP); | 95 | |
| 96 | /* check the version of IP */ | ||
| 97 | ip_version = skb_header_pointer(skb, 0, 1, &buf); | ||
| 98 | if (!ip_version) | ||
| 99 | return -EINVAL; | ||
| 100 | switch (*ip_version >> 4) { | ||
| 101 | case 4: | ||
| 102 | skb->protocol = htons(ETH_P_IP); | ||
| 103 | break; | ||
| 104 | case 6: | ||
| 105 | skb->protocol = htons(ETH_P_IPV6); | ||
| 106 | break; | ||
| 107 | default: | ||
| 108 | return -EINVAL; | ||
| 109 | } | ||
| 94 | 110 | ||
| 95 | /* If we change the header in loop mode, the checksum is corrupted. */ | 111 | /* If we change the header in loop mode, the checksum is corrupted. */ |
| 96 | if (priv->conn_req.protocol == CAIFPROTO_DATAGRAM_LOOP) | 112 | if (priv->conn_req.protocol == CAIFPROTO_DATAGRAM_LOOP) |
diff --git a/net/core/dev.c b/net/core/dev.c index a215269d2e35..a3ef808b5e36 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1732,33 +1732,6 @@ void netif_device_attach(struct net_device *dev) | |||
| 1732 | } | 1732 | } |
| 1733 | EXPORT_SYMBOL(netif_device_attach); | 1733 | EXPORT_SYMBOL(netif_device_attach); |
| 1734 | 1734 | ||
| 1735 | static bool can_checksum_protocol(unsigned long features, __be16 protocol) | ||
| 1736 | { | ||
| 1737 | return ((features & NETIF_F_NO_CSUM) || | ||
| 1738 | ((features & NETIF_F_V4_CSUM) && | ||
| 1739 | protocol == htons(ETH_P_IP)) || | ||
| 1740 | ((features & NETIF_F_V6_CSUM) && | ||
| 1741 | protocol == htons(ETH_P_IPV6)) || | ||
| 1742 | ((features & NETIF_F_FCOE_CRC) && | ||
| 1743 | protocol == htons(ETH_P_FCOE))); | ||
| 1744 | } | ||
| 1745 | |||
| 1746 | static bool dev_can_checksum(struct net_device *dev, struct sk_buff *skb) | ||
| 1747 | { | ||
| 1748 | __be16 protocol = skb->protocol; | ||
| 1749 | int features = dev->features; | ||
| 1750 | |||
| 1751 | if (vlan_tx_tag_present(skb)) { | ||
| 1752 | features &= dev->vlan_features; | ||
| 1753 | } else if (protocol == htons(ETH_P_8021Q)) { | ||
| 1754 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | ||
| 1755 | protocol = veh->h_vlan_encapsulated_proto; | ||
| 1756 | features &= dev->vlan_features; | ||
| 1757 | } | ||
| 1758 | |||
| 1759 | return can_checksum_protocol(features, protocol); | ||
| 1760 | } | ||
| 1761 | |||
| 1762 | /** | 1735 | /** |
| 1763 | * skb_dev_set -- assign a new device to a buffer | 1736 | * skb_dev_set -- assign a new device to a buffer |
| 1764 | * @skb: buffer for the new device | 1737 | * @skb: buffer for the new device |
| @@ -1971,16 +1944,14 @@ static void dev_gso_skb_destructor(struct sk_buff *skb) | |||
| 1971 | /** | 1944 | /** |
| 1972 | * dev_gso_segment - Perform emulated hardware segmentation on skb. | 1945 | * dev_gso_segment - Perform emulated hardware segmentation on skb. |
| 1973 | * @skb: buffer to segment | 1946 | * @skb: buffer to segment |
| 1947 | * @features: device features as applicable to this skb | ||
| 1974 | * | 1948 | * |
| 1975 | * This function segments the given skb and stores the list of segments | 1949 | * This function segments the given skb and stores the list of segments |
| 1976 | * in skb->next. | 1950 | * in skb->next. |
| 1977 | */ | 1951 | */ |
| 1978 | static int dev_gso_segment(struct sk_buff *skb) | 1952 | static int dev_gso_segment(struct sk_buff *skb, int features) |
| 1979 | { | 1953 | { |
| 1980 | struct net_device *dev = skb->dev; | ||
| 1981 | struct sk_buff *segs; | 1954 | struct sk_buff *segs; |
| 1982 | int features = dev->features & ~(illegal_highdma(dev, skb) ? | ||
| 1983 | NETIF_F_SG : 0); | ||
| 1984 | 1955 | ||
| 1985 | segs = skb_gso_segment(skb, features); | 1956 | segs = skb_gso_segment(skb, features); |
| 1986 | 1957 | ||
| @@ -2017,22 +1988,52 @@ static inline void skb_orphan_try(struct sk_buff *skb) | |||
| 2017 | } | 1988 | } |
| 2018 | } | 1989 | } |
| 2019 | 1990 | ||
| 2020 | int netif_get_vlan_features(struct sk_buff *skb, struct net_device *dev) | 1991 | static bool can_checksum_protocol(unsigned long features, __be16 protocol) |
| 1992 | { | ||
| 1993 | return ((features & NETIF_F_GEN_CSUM) || | ||
| 1994 | ((features & NETIF_F_V4_CSUM) && | ||
| 1995 | protocol == htons(ETH_P_IP)) || | ||
| 1996 | ((features & NETIF_F_V6_CSUM) && | ||
| 1997 | protocol == htons(ETH_P_IPV6)) || | ||
| 1998 | ((features & NETIF_F_FCOE_CRC) && | ||
| 1999 | protocol == htons(ETH_P_FCOE))); | ||
| 2000 | } | ||
| 2001 | |||
| 2002 | static int harmonize_features(struct sk_buff *skb, __be16 protocol, int features) | ||
| 2003 | { | ||
| 2004 | if (!can_checksum_protocol(protocol, features)) { | ||
| 2005 | features &= ~NETIF_F_ALL_CSUM; | ||
| 2006 | features &= ~NETIF_F_SG; | ||
| 2007 | } else if (illegal_highdma(skb->dev, skb)) { | ||
| 2008 | features &= ~NETIF_F_SG; | ||
| 2009 | } | ||
| 2010 | |||
| 2011 | return features; | ||
| 2012 | } | ||
| 2013 | |||
| 2014 | int netif_skb_features(struct sk_buff *skb) | ||
| 2021 | { | 2015 | { |
| 2022 | __be16 protocol = skb->protocol; | 2016 | __be16 protocol = skb->protocol; |
| 2017 | int features = skb->dev->features; | ||
| 2023 | 2018 | ||
| 2024 | if (protocol == htons(ETH_P_8021Q)) { | 2019 | if (protocol == htons(ETH_P_8021Q)) { |
| 2025 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | 2020 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; |
| 2026 | protocol = veh->h_vlan_encapsulated_proto; | 2021 | protocol = veh->h_vlan_encapsulated_proto; |
| 2027 | } else if (!skb->vlan_tci) | 2022 | } else if (!vlan_tx_tag_present(skb)) { |
| 2028 | return dev->features; | 2023 | return harmonize_features(skb, protocol, features); |
| 2024 | } | ||
| 2029 | 2025 | ||
| 2030 | if (protocol != htons(ETH_P_8021Q)) | 2026 | features &= skb->dev->vlan_features; |
| 2031 | return dev->features & dev->vlan_features; | 2027 | |
| 2032 | else | 2028 | if (protocol != htons(ETH_P_8021Q)) { |
| 2033 | return 0; | 2029 | return harmonize_features(skb, protocol, features); |
| 2030 | } else { | ||
| 2031 | features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | | ||
| 2032 | NETIF_F_GEN_CSUM; | ||
| 2033 | return harmonize_features(skb, protocol, features); | ||
| 2034 | } | ||
| 2034 | } | 2035 | } |
| 2035 | EXPORT_SYMBOL(netif_get_vlan_features); | 2036 | EXPORT_SYMBOL(netif_skb_features); |
| 2036 | 2037 | ||
| 2037 | /* | 2038 | /* |
| 2038 | * Returns true if either: | 2039 | * Returns true if either: |
| @@ -2042,22 +2043,13 @@ EXPORT_SYMBOL(netif_get_vlan_features); | |||
| 2042 | * support DMA from it. | 2043 | * support DMA from it. |
| 2043 | */ | 2044 | */ |
| 2044 | static inline int skb_needs_linearize(struct sk_buff *skb, | 2045 | static inline int skb_needs_linearize(struct sk_buff *skb, |
| 2045 | struct net_device *dev) | 2046 | int features) |
| 2046 | { | 2047 | { |
| 2047 | if (skb_is_nonlinear(skb)) { | 2048 | return skb_is_nonlinear(skb) && |
| 2048 | int features = dev->features; | 2049 | ((skb_has_frag_list(skb) && |
| 2049 | 2050 | !(features & NETIF_F_FRAGLIST)) || | |
| 2050 | if (vlan_tx_tag_present(skb)) | ||
| 2051 | features &= dev->vlan_features; | ||
| 2052 | |||
| 2053 | return (skb_has_frag_list(skb) && | ||
| 2054 | !(features & NETIF_F_FRAGLIST)) || | ||
| 2055 | (skb_shinfo(skb)->nr_frags && | 2051 | (skb_shinfo(skb)->nr_frags && |
| 2056 | (!(features & NETIF_F_SG) || | 2052 | !(features & NETIF_F_SG))); |
| 2057 | illegal_highdma(dev, skb))); | ||
| 2058 | } | ||
| 2059 | |||
| 2060 | return 0; | ||
| 2061 | } | 2053 | } |
| 2062 | 2054 | ||
| 2063 | int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | 2055 | int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, |
| @@ -2067,6 +2059,8 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 2067 | int rc = NETDEV_TX_OK; | 2059 | int rc = NETDEV_TX_OK; |
| 2068 | 2060 | ||
| 2069 | if (likely(!skb->next)) { | 2061 | if (likely(!skb->next)) { |
| 2062 | int features; | ||
| 2063 | |||
| 2070 | /* | 2064 | /* |
| 2071 | * If device doesnt need skb->dst, release it right now while | 2065 | * If device doesnt need skb->dst, release it right now while |
| 2072 | * its hot in this cpu cache | 2066 | * its hot in this cpu cache |
| @@ -2079,8 +2073,10 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 2079 | 2073 | ||
| 2080 | skb_orphan_try(skb); | 2074 | skb_orphan_try(skb); |
| 2081 | 2075 | ||
| 2076 | features = netif_skb_features(skb); | ||
| 2077 | |||
| 2082 | if (vlan_tx_tag_present(skb) && | 2078 | if (vlan_tx_tag_present(skb) && |
| 2083 | !(dev->features & NETIF_F_HW_VLAN_TX)) { | 2079 | !(features & NETIF_F_HW_VLAN_TX)) { |
| 2084 | skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb)); | 2080 | skb = __vlan_put_tag(skb, vlan_tx_tag_get(skb)); |
| 2085 | if (unlikely(!skb)) | 2081 | if (unlikely(!skb)) |
| 2086 | goto out; | 2082 | goto out; |
| @@ -2088,13 +2084,13 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 2088 | skb->vlan_tci = 0; | 2084 | skb->vlan_tci = 0; |
| 2089 | } | 2085 | } |
| 2090 | 2086 | ||
| 2091 | if (netif_needs_gso(dev, skb)) { | 2087 | if (netif_needs_gso(skb, features)) { |
| 2092 | if (unlikely(dev_gso_segment(skb))) | 2088 | if (unlikely(dev_gso_segment(skb, features))) |
| 2093 | goto out_kfree_skb; | 2089 | goto out_kfree_skb; |
| 2094 | if (skb->next) | 2090 | if (skb->next) |
| 2095 | goto gso; | 2091 | goto gso; |
| 2096 | } else { | 2092 | } else { |
| 2097 | if (skb_needs_linearize(skb, dev) && | 2093 | if (skb_needs_linearize(skb, features) && |
| 2098 | __skb_linearize(skb)) | 2094 | __skb_linearize(skb)) |
| 2099 | goto out_kfree_skb; | 2095 | goto out_kfree_skb; |
| 2100 | 2096 | ||
| @@ -2105,7 +2101,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 2105 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 2101 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
| 2106 | skb_set_transport_header(skb, | 2102 | skb_set_transport_header(skb, |
| 2107 | skb_checksum_start_offset(skb)); | 2103 | skb_checksum_start_offset(skb)); |
| 2108 | if (!dev_can_checksum(dev, skb) && | 2104 | if (!(features & NETIF_F_ALL_CSUM) && |
| 2109 | skb_checksum_help(skb)) | 2105 | skb_checksum_help(skb)) |
| 2110 | goto out_kfree_skb; | 2106 | goto out_kfree_skb; |
| 2111 | } | 2107 | } |
| @@ -2301,7 +2297,10 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, | |||
| 2301 | */ | 2297 | */ |
| 2302 | if (!(dev->priv_flags & IFF_XMIT_DST_RELEASE)) | 2298 | if (!(dev->priv_flags & IFF_XMIT_DST_RELEASE)) |
| 2303 | skb_dst_force(skb); | 2299 | skb_dst_force(skb); |
| 2304 | __qdisc_update_bstats(q, skb->len); | 2300 | |
| 2301 | qdisc_skb_cb(skb)->pkt_len = skb->len; | ||
| 2302 | qdisc_bstats_update(q, skb); | ||
| 2303 | |||
| 2305 | if (sch_direct_xmit(skb, q, dev, txq, root_lock)) { | 2304 | if (sch_direct_xmit(skb, q, dev, txq, root_lock)) { |
| 2306 | if (unlikely(contended)) { | 2305 | if (unlikely(contended)) { |
| 2307 | spin_unlock(&q->busylock); | 2306 | spin_unlock(&q->busylock); |
| @@ -5621,18 +5620,20 @@ struct netdev_queue *dev_ingress_queue_create(struct net_device *dev) | |||
| 5621 | } | 5620 | } |
| 5622 | 5621 | ||
| 5623 | /** | 5622 | /** |
| 5624 | * alloc_netdev_mq - allocate network device | 5623 | * alloc_netdev_mqs - allocate network device |
| 5625 | * @sizeof_priv: size of private data to allocate space for | 5624 | * @sizeof_priv: size of private data to allocate space for |
| 5626 | * @name: device name format string | 5625 | * @name: device name format string |
| 5627 | * @setup: callback to initialize device | 5626 | * @setup: callback to initialize device |
| 5628 | * @queue_count: the number of subqueues to allocate | 5627 | * @txqs: the number of TX subqueues to allocate |
| 5628 | * @rxqs: the number of RX subqueues to allocate | ||
| 5629 | * | 5629 | * |
| 5630 | * Allocates a struct net_device with private data area for driver use | 5630 | * Allocates a struct net_device with private data area for driver use |
| 5631 | * and performs basic initialization. Also allocates subquue structs | 5631 | * and performs basic initialization. Also allocates subquue structs |
| 5632 | * for each queue on the device at the end of the netdevice. | 5632 | * for each queue on the device. |
| 5633 | */ | 5633 | */ |
| 5634 | struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | 5634 | struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, |
| 5635 | void (*setup)(struct net_device *), unsigned int queue_count) | 5635 | void (*setup)(struct net_device *), |
| 5636 | unsigned int txqs, unsigned int rxqs) | ||
| 5636 | { | 5637 | { |
| 5637 | struct net_device *dev; | 5638 | struct net_device *dev; |
| 5638 | size_t alloc_size; | 5639 | size_t alloc_size; |
| @@ -5640,12 +5641,20 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | |||
| 5640 | 5641 | ||
| 5641 | BUG_ON(strlen(name) >= sizeof(dev->name)); | 5642 | BUG_ON(strlen(name) >= sizeof(dev->name)); |
| 5642 | 5643 | ||
| 5643 | if (queue_count < 1) { | 5644 | if (txqs < 1) { |
| 5644 | pr_err("alloc_netdev: Unable to allocate device " | 5645 | pr_err("alloc_netdev: Unable to allocate device " |
| 5645 | "with zero queues.\n"); | 5646 | "with zero queues.\n"); |
| 5646 | return NULL; | 5647 | return NULL; |
| 5647 | } | 5648 | } |
| 5648 | 5649 | ||
| 5650 | #ifdef CONFIG_RPS | ||
| 5651 | if (rxqs < 1) { | ||
| 5652 | pr_err("alloc_netdev: Unable to allocate device " | ||
| 5653 | "with zero RX queues.\n"); | ||
| 5654 | return NULL; | ||
| 5655 | } | ||
| 5656 | #endif | ||
| 5657 | |||
| 5649 | alloc_size = sizeof(struct net_device); | 5658 | alloc_size = sizeof(struct net_device); |
| 5650 | if (sizeof_priv) { | 5659 | if (sizeof_priv) { |
| 5651 | /* ensure 32-byte alignment of private area */ | 5660 | /* ensure 32-byte alignment of private area */ |
| @@ -5676,14 +5685,14 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | |||
| 5676 | 5685 | ||
| 5677 | dev_net_set(dev, &init_net); | 5686 | dev_net_set(dev, &init_net); |
| 5678 | 5687 | ||
| 5679 | dev->num_tx_queues = queue_count; | 5688 | dev->num_tx_queues = txqs; |
| 5680 | dev->real_num_tx_queues = queue_count; | 5689 | dev->real_num_tx_queues = txqs; |
| 5681 | if (netif_alloc_netdev_queues(dev)) | 5690 | if (netif_alloc_netdev_queues(dev)) |
| 5682 | goto free_pcpu; | 5691 | goto free_pcpu; |
| 5683 | 5692 | ||
| 5684 | #ifdef CONFIG_RPS | 5693 | #ifdef CONFIG_RPS |
| 5685 | dev->num_rx_queues = queue_count; | 5694 | dev->num_rx_queues = rxqs; |
| 5686 | dev->real_num_rx_queues = queue_count; | 5695 | dev->real_num_rx_queues = rxqs; |
| 5687 | if (netif_alloc_rx_queues(dev)) | 5696 | if (netif_alloc_rx_queues(dev)) |
| 5688 | goto free_pcpu; | 5697 | goto free_pcpu; |
| 5689 | #endif | 5698 | #endif |
| @@ -5711,7 +5720,7 @@ free_p: | |||
| 5711 | kfree(p); | 5720 | kfree(p); |
| 5712 | return NULL; | 5721 | return NULL; |
| 5713 | } | 5722 | } |
| 5714 | EXPORT_SYMBOL(alloc_netdev_mq); | 5723 | EXPORT_SYMBOL(alloc_netdev_mqs); |
| 5715 | 5724 | ||
| 5716 | /** | 5725 | /** |
| 5717 | * free_netdev - free network device | 5726 | * free_netdev - free network device |
diff --git a/net/core/filter.c b/net/core/filter.c index 2b27d4efdd48..afc58374ca96 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
| @@ -158,7 +158,7 @@ EXPORT_SYMBOL(sk_filter); | |||
| 158 | /** | 158 | /** |
| 159 | * sk_run_filter - run a filter on a socket | 159 | * sk_run_filter - run a filter on a socket |
| 160 | * @skb: buffer to run the filter on | 160 | * @skb: buffer to run the filter on |
| 161 | * @filter: filter to apply | 161 | * @fentry: filter to apply |
| 162 | * | 162 | * |
| 163 | * Decode and apply filter instructions to the skb->data. | 163 | * Decode and apply filter instructions to the skb->data. |
| 164 | * Return length to keep, 0 for none. @skb is the data we are | 164 | * Return length to keep, 0 for none. @skb is the data we are |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 750db57f3bb3..a5f7535aab5b 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -1820,7 +1820,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 1820 | if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) | 1820 | if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) |
| 1821 | return -EPERM; | 1821 | return -EPERM; |
| 1822 | 1822 | ||
| 1823 | if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { | 1823 | if (kind == 2 && (nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { |
| 1824 | struct sock *rtnl; | 1824 | struct sock *rtnl; |
| 1825 | rtnl_dumpit_func dumpit; | 1825 | rtnl_dumpit_func dumpit; |
| 1826 | 1826 | ||
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index 45087052d894..5fdb07229017 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h | |||
| @@ -426,7 +426,8 @@ static inline void dccp_update_gsr(struct sock *sk, u64 seq) | |||
| 426 | { | 426 | { |
| 427 | struct dccp_sock *dp = dccp_sk(sk); | 427 | struct dccp_sock *dp = dccp_sk(sk); |
| 428 | 428 | ||
| 429 | dp->dccps_gsr = seq; | 429 | if (after48(seq, dp->dccps_gsr)) |
| 430 | dp->dccps_gsr = seq; | ||
| 430 | /* Sequence validity window depends on remote Sequence Window (7.5.1) */ | 431 | /* Sequence validity window depends on remote Sequence Window (7.5.1) */ |
| 431 | dp->dccps_swl = SUB48(ADD48(dp->dccps_gsr, 1), dp->dccps_r_seq_win / 4); | 432 | dp->dccps_swl = SUB48(ADD48(dp->dccps_gsr, 1), dp->dccps_r_seq_win / 4); |
| 432 | /* | 433 | /* |
diff --git a/net/dccp/input.c b/net/dccp/input.c index 15af247ea007..8cde009e8b85 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c | |||
| @@ -260,7 +260,7 @@ static int dccp_check_seqno(struct sock *sk, struct sk_buff *skb) | |||
| 260 | */ | 260 | */ |
| 261 | if (time_before(now, (dp->dccps_rate_last + | 261 | if (time_before(now, (dp->dccps_rate_last + |
| 262 | sysctl_dccp_sync_ratelimit))) | 262 | sysctl_dccp_sync_ratelimit))) |
| 263 | return 0; | 263 | return -1; |
| 264 | 264 | ||
| 265 | DCCP_WARN("Step 6 failed for %s packet, " | 265 | DCCP_WARN("Step 6 failed for %s packet, " |
| 266 | "(LSWL(%llu) <= P.seqno(%llu) <= S.SWH(%llu)) and " | 266 | "(LSWL(%llu) <= P.seqno(%llu) <= S.SWH(%llu)) and " |
diff --git a/net/dccp/sysctl.c b/net/dccp/sysctl.c index 563943822e58..42348824ee31 100644 --- a/net/dccp/sysctl.c +++ b/net/dccp/sysctl.c | |||
| @@ -21,7 +21,8 @@ | |||
| 21 | /* Boundary values */ | 21 | /* Boundary values */ |
| 22 | static int zero = 0, | 22 | static int zero = 0, |
| 23 | u8_max = 0xFF; | 23 | u8_max = 0xFF; |
| 24 | static unsigned long seqw_min = 32; | 24 | static unsigned long seqw_min = DCCPF_SEQ_WMIN, |
| 25 | seqw_max = 0xFFFFFFFF; /* maximum on 32 bit */ | ||
| 25 | 26 | ||
| 26 | static struct ctl_table dccp_default_table[] = { | 27 | static struct ctl_table dccp_default_table[] = { |
| 27 | { | 28 | { |
| @@ -31,6 +32,7 @@ static struct ctl_table dccp_default_table[] = { | |||
| 31 | .mode = 0644, | 32 | .mode = 0644, |
| 32 | .proc_handler = proc_doulongvec_minmax, | 33 | .proc_handler = proc_doulongvec_minmax, |
| 33 | .extra1 = &seqw_min, /* RFC 4340, 7.5.2 */ | 34 | .extra1 = &seqw_min, /* RFC 4340, 7.5.2 */ |
| 35 | .extra2 = &seqw_max, | ||
| 34 | }, | 36 | }, |
| 35 | { | 37 | { |
| 36 | .procname = "rx_ccid", | 38 | .procname = "rx_ccid", |
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index f00ef2f1d814..f9d7ac924f15 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c | |||
| @@ -347,10 +347,11 @@ void ether_setup(struct net_device *dev) | |||
| 347 | EXPORT_SYMBOL(ether_setup); | 347 | EXPORT_SYMBOL(ether_setup); |
| 348 | 348 | ||
| 349 | /** | 349 | /** |
| 350 | * alloc_etherdev_mq - Allocates and sets up an Ethernet device | 350 | * alloc_etherdev_mqs - Allocates and sets up an Ethernet device |
| 351 | * @sizeof_priv: Size of additional driver-private structure to be allocated | 351 | * @sizeof_priv: Size of additional driver-private structure to be allocated |
| 352 | * for this Ethernet device | 352 | * for this Ethernet device |
| 353 | * @queue_count: The number of queues this device has. | 353 | * @txqs: The number of TX queues this device has. |
| 354 | * @txqs: The number of RX queues this device has. | ||
| 354 | * | 355 | * |
| 355 | * Fill in the fields of the device structure with Ethernet-generic | 356 | * Fill in the fields of the device structure with Ethernet-generic |
| 356 | * values. Basically does everything except registering the device. | 357 | * values. Basically does everything except registering the device. |
| @@ -360,11 +361,12 @@ EXPORT_SYMBOL(ether_setup); | |||
| 360 | * this private data area. | 361 | * this private data area. |
| 361 | */ | 362 | */ |
| 362 | 363 | ||
| 363 | struct net_device *alloc_etherdev_mq(int sizeof_priv, unsigned int queue_count) | 364 | struct net_device *alloc_etherdev_mqs(int sizeof_priv, unsigned int txqs, |
| 365 | unsigned int rxqs) | ||
| 364 | { | 366 | { |
| 365 | return alloc_netdev_mq(sizeof_priv, "eth%d", ether_setup, queue_count); | 367 | return alloc_netdev_mqs(sizeof_priv, "eth%d", ether_setup, txqs, rxqs); |
| 366 | } | 368 | } |
| 367 | EXPORT_SYMBOL(alloc_etherdev_mq); | 369 | EXPORT_SYMBOL(alloc_etherdev_mqs); |
| 368 | 370 | ||
| 369 | static size_t _format_mac_addr(char *buf, int buflen, | 371 | static size_t _format_mac_addr(char *buf, int buflen, |
| 370 | const unsigned char *addr, int len) | 372 | const unsigned char *addr, int len) |
diff --git a/net/ipv4/ah4.c b/net/ipv4/ah4.c index 880a5ec6dce0..86961bec70ab 100644 --- a/net/ipv4/ah4.c +++ b/net/ipv4/ah4.c | |||
| @@ -314,14 +314,15 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 314 | 314 | ||
| 315 | skb->ip_summed = CHECKSUM_NONE; | 315 | skb->ip_summed = CHECKSUM_NONE; |
| 316 | 316 | ||
| 317 | ah = (struct ip_auth_hdr *)skb->data; | ||
| 318 | iph = ip_hdr(skb); | ||
| 319 | ihl = ip_hdrlen(skb); | ||
| 320 | 317 | ||
| 321 | if ((err = skb_cow_data(skb, 0, &trailer)) < 0) | 318 | if ((err = skb_cow_data(skb, 0, &trailer)) < 0) |
| 322 | goto out; | 319 | goto out; |
| 323 | nfrags = err; | 320 | nfrags = err; |
| 324 | 321 | ||
| 322 | ah = (struct ip_auth_hdr *)skb->data; | ||
| 323 | iph = ip_hdr(skb); | ||
| 324 | ihl = ip_hdrlen(skb); | ||
| 325 | |||
| 325 | work_iph = ah_alloc_tmp(ahash, nfrags, ihl + ahp->icv_trunc_len); | 326 | work_iph = ah_alloc_tmp(ahash, nfrags, ihl + ahp->icv_trunc_len); |
| 326 | if (!work_iph) | 327 | if (!work_iph) |
| 327 | goto out; | 328 | goto out; |
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index a2fc7b961dbc..04c8b69fd426 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
| @@ -1143,6 +1143,23 @@ static int arp_req_get(struct arpreq *r, struct net_device *dev) | |||
| 1143 | return err; | 1143 | return err; |
| 1144 | } | 1144 | } |
| 1145 | 1145 | ||
| 1146 | int arp_invalidate(struct net_device *dev, __be32 ip) | ||
| 1147 | { | ||
| 1148 | struct neighbour *neigh = neigh_lookup(&arp_tbl, &ip, dev); | ||
| 1149 | int err = -ENXIO; | ||
| 1150 | |||
| 1151 | if (neigh) { | ||
| 1152 | if (neigh->nud_state & ~NUD_NOARP) | ||
| 1153 | err = neigh_update(neigh, NULL, NUD_FAILED, | ||
| 1154 | NEIGH_UPDATE_F_OVERRIDE| | ||
| 1155 | NEIGH_UPDATE_F_ADMIN); | ||
| 1156 | neigh_release(neigh); | ||
| 1157 | } | ||
| 1158 | |||
| 1159 | return err; | ||
| 1160 | } | ||
| 1161 | EXPORT_SYMBOL(arp_invalidate); | ||
| 1162 | |||
| 1146 | static int arp_req_delete_public(struct net *net, struct arpreq *r, | 1163 | static int arp_req_delete_public(struct net *net, struct arpreq *r, |
| 1147 | struct net_device *dev) | 1164 | struct net_device *dev) |
| 1148 | { | 1165 | { |
| @@ -1163,7 +1180,6 @@ static int arp_req_delete(struct net *net, struct arpreq *r, | |||
| 1163 | { | 1180 | { |
| 1164 | int err; | 1181 | int err; |
| 1165 | __be32 ip; | 1182 | __be32 ip; |
| 1166 | struct neighbour *neigh; | ||
| 1167 | 1183 | ||
| 1168 | if (r->arp_flags & ATF_PUBL) | 1184 | if (r->arp_flags & ATF_PUBL) |
| 1169 | return arp_req_delete_public(net, r, dev); | 1185 | return arp_req_delete_public(net, r, dev); |
| @@ -1181,16 +1197,7 @@ static int arp_req_delete(struct net *net, struct arpreq *r, | |||
| 1181 | if (!dev) | 1197 | if (!dev) |
| 1182 | return -EINVAL; | 1198 | return -EINVAL; |
| 1183 | } | 1199 | } |
| 1184 | err = -ENXIO; | 1200 | return arp_invalidate(dev, ip); |
| 1185 | neigh = neigh_lookup(&arp_tbl, &ip, dev); | ||
| 1186 | if (neigh) { | ||
| 1187 | if (neigh->nud_state & ~NUD_NOARP) | ||
| 1188 | err = neigh_update(neigh, NULL, NUD_FAILED, | ||
| 1189 | NEIGH_UPDATE_F_OVERRIDE| | ||
| 1190 | NEIGH_UPDATE_F_ADMIN); | ||
| 1191 | neigh_release(neigh); | ||
| 1192 | } | ||
| 1193 | return err; | ||
| 1194 | } | 1201 | } |
| 1195 | 1202 | ||
| 1196 | /* | 1203 | /* |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 25e318153f14..97e5fb765265 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
| @@ -73,7 +73,7 @@ int inet_csk_bind_conflict(const struct sock *sk, | |||
| 73 | !sk2->sk_bound_dev_if || | 73 | !sk2->sk_bound_dev_if || |
| 74 | sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) { | 74 | sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) { |
| 75 | if (!reuse || !sk2->sk_reuse || | 75 | if (!reuse || !sk2->sk_reuse || |
| 76 | sk2->sk_state == TCP_LISTEN) { | 76 | ((1 << sk2->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))) { |
| 77 | const __be32 sk2_rcv_saddr = sk_rcv_saddr(sk2); | 77 | const __be32 sk2_rcv_saddr = sk_rcv_saddr(sk2); |
| 78 | if (!sk2_rcv_saddr || !sk_rcv_saddr(sk) || | 78 | if (!sk2_rcv_saddr || !sk_rcv_saddr(sk) || |
| 79 | sk2_rcv_saddr == sk_rcv_saddr(sk)) | 79 | sk2_rcv_saddr == sk_rcv_saddr(sk)) |
| @@ -122,7 +122,8 @@ again: | |||
| 122 | (tb->num_owners < smallest_size || smallest_size == -1)) { | 122 | (tb->num_owners < smallest_size || smallest_size == -1)) { |
| 123 | smallest_size = tb->num_owners; | 123 | smallest_size = tb->num_owners; |
| 124 | smallest_rover = rover; | 124 | smallest_rover = rover; |
| 125 | if (atomic_read(&hashinfo->bsockets) > (high - low) + 1) { | 125 | if (atomic_read(&hashinfo->bsockets) > (high - low) + 1 && |
| 126 | !inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb)) { | ||
| 126 | spin_unlock(&head->lock); | 127 | spin_unlock(&head->lock); |
| 127 | snum = smallest_rover; | 128 | snum = smallest_rover; |
| 128 | goto have_snum; | 129 | goto have_snum; |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 2ada17129fce..2746c1fa6417 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
| @@ -858,7 +858,7 @@ static int inet_diag_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 858 | nlmsg_len(nlh) < hdrlen) | 858 | nlmsg_len(nlh) < hdrlen) |
| 859 | return -EINVAL; | 859 | return -EINVAL; |
| 860 | 860 | ||
| 861 | if (nlh->nlmsg_flags & NLM_F_DUMP) { | 861 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { |
| 862 | if (nlmsg_attrlen(nlh, hdrlen)) { | 862 | if (nlmsg_attrlen(nlh, hdrlen)) { |
| 863 | struct nlattr *attr; | 863 | struct nlattr *attr; |
| 864 | 864 | ||
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 3fac340a28d5..e855fffaed95 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
| @@ -710,42 +710,25 @@ static void get_counters(const struct xt_table_info *t, | |||
| 710 | struct arpt_entry *iter; | 710 | struct arpt_entry *iter; |
| 711 | unsigned int cpu; | 711 | unsigned int cpu; |
| 712 | unsigned int i; | 712 | unsigned int i; |
| 713 | unsigned int curcpu = get_cpu(); | ||
| 714 | |||
| 715 | /* Instead of clearing (by a previous call to memset()) | ||
| 716 | * the counters and using adds, we set the counters | ||
| 717 | * with data used by 'current' CPU | ||
| 718 | * | ||
| 719 | * Bottom half has to be disabled to prevent deadlock | ||
| 720 | * if new softirq were to run and call ipt_do_table | ||
| 721 | */ | ||
| 722 | local_bh_disable(); | ||
| 723 | i = 0; | ||
| 724 | xt_entry_foreach(iter, t->entries[curcpu], t->size) { | ||
| 725 | SET_COUNTER(counters[i], iter->counters.bcnt, | ||
| 726 | iter->counters.pcnt); | ||
| 727 | ++i; | ||
| 728 | } | ||
| 729 | local_bh_enable(); | ||
| 730 | /* Processing counters from other cpus, we can let bottom half enabled, | ||
| 731 | * (preemption is disabled) | ||
| 732 | */ | ||
| 733 | 713 | ||
| 734 | for_each_possible_cpu(cpu) { | 714 | for_each_possible_cpu(cpu) { |
| 735 | if (cpu == curcpu) | 715 | seqlock_t *lock = &per_cpu(xt_info_locks, cpu).lock; |
| 736 | continue; | 716 | |
| 737 | i = 0; | 717 | i = 0; |
| 738 | local_bh_disable(); | ||
| 739 | xt_info_wrlock(cpu); | ||
| 740 | xt_entry_foreach(iter, t->entries[cpu], t->size) { | 718 | xt_entry_foreach(iter, t->entries[cpu], t->size) { |
| 741 | ADD_COUNTER(counters[i], iter->counters.bcnt, | 719 | u64 bcnt, pcnt; |
| 742 | iter->counters.pcnt); | 720 | unsigned int start; |
| 721 | |||
| 722 | do { | ||
| 723 | start = read_seqbegin(lock); | ||
| 724 | bcnt = iter->counters.bcnt; | ||
| 725 | pcnt = iter->counters.pcnt; | ||
| 726 | } while (read_seqretry(lock, start)); | ||
| 727 | |||
| 728 | ADD_COUNTER(counters[i], bcnt, pcnt); | ||
| 743 | ++i; | 729 | ++i; |
| 744 | } | 730 | } |
| 745 | xt_info_wrunlock(cpu); | ||
| 746 | local_bh_enable(); | ||
| 747 | } | 731 | } |
| 748 | put_cpu(); | ||
| 749 | } | 732 | } |
| 750 | 733 | ||
| 751 | static struct xt_counters *alloc_counters(const struct xt_table *table) | 734 | static struct xt_counters *alloc_counters(const struct xt_table *table) |
| @@ -759,7 +742,7 @@ static struct xt_counters *alloc_counters(const struct xt_table *table) | |||
| 759 | * about). | 742 | * about). |
| 760 | */ | 743 | */ |
| 761 | countersize = sizeof(struct xt_counters) * private->number; | 744 | countersize = sizeof(struct xt_counters) * private->number; |
| 762 | counters = vmalloc(countersize); | 745 | counters = vzalloc(countersize); |
| 763 | 746 | ||
| 764 | if (counters == NULL) | 747 | if (counters == NULL) |
| 765 | return ERR_PTR(-ENOMEM); | 748 | return ERR_PTR(-ENOMEM); |
| @@ -1007,7 +990,7 @@ static int __do_replace(struct net *net, const char *name, | |||
| 1007 | struct arpt_entry *iter; | 990 | struct arpt_entry *iter; |
| 1008 | 991 | ||
| 1009 | ret = 0; | 992 | ret = 0; |
| 1010 | counters = vmalloc(num_counters * sizeof(struct xt_counters)); | 993 | counters = vzalloc(num_counters * sizeof(struct xt_counters)); |
| 1011 | if (!counters) { | 994 | if (!counters) { |
| 1012 | ret = -ENOMEM; | 995 | ret = -ENOMEM; |
| 1013 | goto out; | 996 | goto out; |
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index a846d633b3b6..652efea013dc 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
| @@ -884,42 +884,25 @@ get_counters(const struct xt_table_info *t, | |||
| 884 | struct ipt_entry *iter; | 884 | struct ipt_entry *iter; |
| 885 | unsigned int cpu; | 885 | unsigned int cpu; |
| 886 | unsigned int i; | 886 | unsigned int i; |
| 887 | unsigned int curcpu = get_cpu(); | ||
| 888 | |||
| 889 | /* Instead of clearing (by a previous call to memset()) | ||
| 890 | * the counters and using adds, we set the counters | ||
| 891 | * with data used by 'current' CPU. | ||
| 892 | * | ||
| 893 | * Bottom half has to be disabled to prevent deadlock | ||
| 894 | * if new softirq were to run and call ipt_do_table | ||
| 895 | */ | ||
| 896 | local_bh_disable(); | ||
| 897 | i = 0; | ||
| 898 | xt_entry_foreach(iter, t->entries[curcpu], t->size) { | ||
| 899 | SET_COUNTER(counters[i], iter->counters.bcnt, | ||
| 900 | iter->counters.pcnt); | ||
| 901 | ++i; | ||
| 902 | } | ||
| 903 | local_bh_enable(); | ||
| 904 | /* Processing counters from other cpus, we can let bottom half enabled, | ||
| 905 | * (preemption is disabled) | ||
| 906 | */ | ||
| 907 | 887 | ||
| 908 | for_each_possible_cpu(cpu) { | 888 | for_each_possible_cpu(cpu) { |
| 909 | if (cpu == curcpu) | 889 | seqlock_t *lock = &per_cpu(xt_info_locks, cpu).lock; |
| 910 | continue; | 890 | |
| 911 | i = 0; | 891 | i = 0; |
| 912 | local_bh_disable(); | ||
| 913 | xt_info_wrlock(cpu); | ||
| 914 | xt_entry_foreach(iter, t->entries[cpu], t->size) { | 892 | xt_entry_foreach(iter, t->entries[cpu], t->size) { |
| 915 | ADD_COUNTER(counters[i], iter->counters.bcnt, | 893 | u64 bcnt, pcnt; |
| 916 | iter->counters.pcnt); | 894 | unsigned int start; |
| 895 | |||
| 896 | do { | ||
| 897 | start = read_seqbegin(lock); | ||
| 898 | bcnt = iter->counters.bcnt; | ||
| 899 | pcnt = iter->counters.pcnt; | ||
| 900 | } while (read_seqretry(lock, start)); | ||
| 901 | |||
| 902 | ADD_COUNTER(counters[i], bcnt, pcnt); | ||
| 917 | ++i; /* macro does multi eval of i */ | 903 | ++i; /* macro does multi eval of i */ |
| 918 | } | 904 | } |
| 919 | xt_info_wrunlock(cpu); | ||
| 920 | local_bh_enable(); | ||
| 921 | } | 905 | } |
| 922 | put_cpu(); | ||
| 923 | } | 906 | } |
| 924 | 907 | ||
| 925 | static struct xt_counters *alloc_counters(const struct xt_table *table) | 908 | static struct xt_counters *alloc_counters(const struct xt_table *table) |
| @@ -932,7 +915,7 @@ static struct xt_counters *alloc_counters(const struct xt_table *table) | |||
| 932 | (other than comefrom, which userspace doesn't care | 915 | (other than comefrom, which userspace doesn't care |
| 933 | about). */ | 916 | about). */ |
| 934 | countersize = sizeof(struct xt_counters) * private->number; | 917 | countersize = sizeof(struct xt_counters) * private->number; |
| 935 | counters = vmalloc(countersize); | 918 | counters = vzalloc(countersize); |
| 936 | 919 | ||
| 937 | if (counters == NULL) | 920 | if (counters == NULL) |
| 938 | return ERR_PTR(-ENOMEM); | 921 | return ERR_PTR(-ENOMEM); |
| @@ -1203,7 +1186,7 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks, | |||
| 1203 | struct ipt_entry *iter; | 1186 | struct ipt_entry *iter; |
| 1204 | 1187 | ||
| 1205 | ret = 0; | 1188 | ret = 0; |
| 1206 | counters = vmalloc(num_counters * sizeof(struct xt_counters)); | 1189 | counters = vzalloc(num_counters * sizeof(struct xt_counters)); |
| 1207 | if (!counters) { | 1190 | if (!counters) { |
| 1208 | ret = -ENOMEM; | 1191 | ret = -ENOMEM; |
| 1209 | goto out; | 1192 | goto out; |
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index ee82d4ef26ce..1aba54ae53c4 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c | |||
| @@ -538,14 +538,16 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 538 | if (!pskb_may_pull(skb, ah_hlen)) | 538 | if (!pskb_may_pull(skb, ah_hlen)) |
| 539 | goto out; | 539 | goto out; |
| 540 | 540 | ||
| 541 | ip6h = ipv6_hdr(skb); | ||
| 542 | |||
| 543 | skb_push(skb, hdr_len); | ||
| 544 | 541 | ||
| 545 | if ((err = skb_cow_data(skb, 0, &trailer)) < 0) | 542 | if ((err = skb_cow_data(skb, 0, &trailer)) < 0) |
| 546 | goto out; | 543 | goto out; |
| 547 | nfrags = err; | 544 | nfrags = err; |
| 548 | 545 | ||
| 546 | ah = (struct ip_auth_hdr *)skb->data; | ||
| 547 | ip6h = ipv6_hdr(skb); | ||
| 548 | |||
| 549 | skb_push(skb, hdr_len); | ||
| 550 | |||
| 549 | work_iph = ah_alloc_tmp(ahash, nfrags, hdr_len + ahp->icv_trunc_len); | 551 | work_iph = ah_alloc_tmp(ahash, nfrags, hdr_len + ahp->icv_trunc_len); |
| 550 | if (!work_iph) | 552 | if (!work_iph) |
| 551 | goto out; | 553 | goto out; |
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index e46305d1815a..d144e629d2b4 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c | |||
| @@ -44,7 +44,7 @@ int inet6_csk_bind_conflict(const struct sock *sk, | |||
| 44 | !sk2->sk_bound_dev_if || | 44 | !sk2->sk_bound_dev_if || |
| 45 | sk->sk_bound_dev_if == sk2->sk_bound_dev_if) && | 45 | sk->sk_bound_dev_if == sk2->sk_bound_dev_if) && |
| 46 | (!sk->sk_reuse || !sk2->sk_reuse || | 46 | (!sk->sk_reuse || !sk2->sk_reuse || |
| 47 | sk2->sk_state == TCP_LISTEN) && | 47 | ((1 << sk2->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))) && |
| 48 | ipv6_rcv_saddr_equal(sk, sk2)) | 48 | ipv6_rcv_saddr_equal(sk, sk2)) |
| 49 | break; | 49 | break; |
| 50 | } | 50 | } |
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 455582384ece..7d227c644f72 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
| @@ -897,42 +897,25 @@ get_counters(const struct xt_table_info *t, | |||
| 897 | struct ip6t_entry *iter; | 897 | struct ip6t_entry *iter; |
| 898 | unsigned int cpu; | 898 | unsigned int cpu; |
| 899 | unsigned int i; | 899 | unsigned int i; |
| 900 | unsigned int curcpu = get_cpu(); | ||
| 901 | |||
| 902 | /* Instead of clearing (by a previous call to memset()) | ||
| 903 | * the counters and using adds, we set the counters | ||
| 904 | * with data used by 'current' CPU | ||
| 905 | * | ||
| 906 | * Bottom half has to be disabled to prevent deadlock | ||
| 907 | * if new softirq were to run and call ipt_do_table | ||
| 908 | */ | ||
| 909 | local_bh_disable(); | ||
| 910 | i = 0; | ||
| 911 | xt_entry_foreach(iter, t->entries[curcpu], t->size) { | ||
| 912 | SET_COUNTER(counters[i], iter->counters.bcnt, | ||
| 913 | iter->counters.pcnt); | ||
| 914 | ++i; | ||
| 915 | } | ||
| 916 | local_bh_enable(); | ||
| 917 | /* Processing counters from other cpus, we can let bottom half enabled, | ||
| 918 | * (preemption is disabled) | ||
| 919 | */ | ||
| 920 | 900 | ||
| 921 | for_each_possible_cpu(cpu) { | 901 | for_each_possible_cpu(cpu) { |
| 922 | if (cpu == curcpu) | 902 | seqlock_t *lock = &per_cpu(xt_info_locks, cpu).lock; |
| 923 | continue; | 903 | |
| 924 | i = 0; | 904 | i = 0; |
| 925 | local_bh_disable(); | ||
| 926 | xt_info_wrlock(cpu); | ||
| 927 | xt_entry_foreach(iter, t->entries[cpu], t->size) { | 905 | xt_entry_foreach(iter, t->entries[cpu], t->size) { |
| 928 | ADD_COUNTER(counters[i], iter->counters.bcnt, | 906 | u64 bcnt, pcnt; |
| 929 | iter->counters.pcnt); | 907 | unsigned int start; |
| 908 | |||
| 909 | do { | ||
| 910 | start = read_seqbegin(lock); | ||
| 911 | bcnt = iter->counters.bcnt; | ||
| 912 | pcnt = iter->counters.pcnt; | ||
| 913 | } while (read_seqretry(lock, start)); | ||
| 914 | |||
| 915 | ADD_COUNTER(counters[i], bcnt, pcnt); | ||
| 930 | ++i; | 916 | ++i; |
| 931 | } | 917 | } |
| 932 | xt_info_wrunlock(cpu); | ||
| 933 | local_bh_enable(); | ||
| 934 | } | 918 | } |
| 935 | put_cpu(); | ||
| 936 | } | 919 | } |
| 937 | 920 | ||
| 938 | static struct xt_counters *alloc_counters(const struct xt_table *table) | 921 | static struct xt_counters *alloc_counters(const struct xt_table *table) |
| @@ -945,7 +928,7 @@ static struct xt_counters *alloc_counters(const struct xt_table *table) | |||
| 945 | (other than comefrom, which userspace doesn't care | 928 | (other than comefrom, which userspace doesn't care |
| 946 | about). */ | 929 | about). */ |
| 947 | countersize = sizeof(struct xt_counters) * private->number; | 930 | countersize = sizeof(struct xt_counters) * private->number; |
| 948 | counters = vmalloc(countersize); | 931 | counters = vzalloc(countersize); |
| 949 | 932 | ||
| 950 | if (counters == NULL) | 933 | if (counters == NULL) |
| 951 | return ERR_PTR(-ENOMEM); | 934 | return ERR_PTR(-ENOMEM); |
| @@ -1216,7 +1199,7 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks, | |||
| 1216 | struct ip6t_entry *iter; | 1199 | struct ip6t_entry *iter; |
| 1217 | 1200 | ||
| 1218 | ret = 0; | 1201 | ret = 0; |
| 1219 | counters = vmalloc(num_counters * sizeof(struct xt_counters)); | 1202 | counters = vzalloc(num_counters * sizeof(struct xt_counters)); |
| 1220 | if (!counters) { | 1203 | if (!counters) { |
| 1221 | ret = -ENOMEM; | 1204 | ret = -ENOMEM; |
| 1222 | goto out; | 1205 | goto out; |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 0cdba50c0d69..5cb8d3027b18 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -645,25 +645,23 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 645 | struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh); | 645 | struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh); |
| 646 | u_int8_t l3proto = nfmsg->nfgen_family; | 646 | u_int8_t l3proto = nfmsg->nfgen_family; |
| 647 | 647 | ||
| 648 | rcu_read_lock(); | 648 | spin_lock_bh(&nf_conntrack_lock); |
| 649 | last = (struct nf_conn *)cb->args[1]; | 649 | last = (struct nf_conn *)cb->args[1]; |
| 650 | for (; cb->args[0] < net->ct.htable_size; cb->args[0]++) { | 650 | for (; cb->args[0] < net->ct.htable_size; cb->args[0]++) { |
| 651 | restart: | 651 | restart: |
| 652 | hlist_nulls_for_each_entry_rcu(h, n, &net->ct.hash[cb->args[0]], | 652 | hlist_nulls_for_each_entry(h, n, &net->ct.hash[cb->args[0]], |
| 653 | hnnode) { | 653 | hnnode) { |
| 654 | if (NF_CT_DIRECTION(h) != IP_CT_DIR_ORIGINAL) | 654 | if (NF_CT_DIRECTION(h) != IP_CT_DIR_ORIGINAL) |
| 655 | continue; | 655 | continue; |
| 656 | ct = nf_ct_tuplehash_to_ctrack(h); | 656 | ct = nf_ct_tuplehash_to_ctrack(h); |
| 657 | if (!atomic_inc_not_zero(&ct->ct_general.use)) | ||
| 658 | continue; | ||
| 659 | /* Dump entries of a given L3 protocol number. | 657 | /* Dump entries of a given L3 protocol number. |
| 660 | * If it is not specified, ie. l3proto == 0, | 658 | * If it is not specified, ie. l3proto == 0, |
| 661 | * then dump everything. */ | 659 | * then dump everything. */ |
| 662 | if (l3proto && nf_ct_l3num(ct) != l3proto) | 660 | if (l3proto && nf_ct_l3num(ct) != l3proto) |
| 663 | goto releasect; | 661 | continue; |
| 664 | if (cb->args[1]) { | 662 | if (cb->args[1]) { |
| 665 | if (ct != last) | 663 | if (ct != last) |
| 666 | goto releasect; | 664 | continue; |
| 667 | cb->args[1] = 0; | 665 | cb->args[1] = 0; |
| 668 | } | 666 | } |
| 669 | if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid, | 667 | if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid, |
| @@ -681,8 +679,6 @@ restart: | |||
| 681 | if (acct) | 679 | if (acct) |
| 682 | memset(acct, 0, sizeof(struct nf_conn_counter[IP_CT_DIR_MAX])); | 680 | memset(acct, 0, sizeof(struct nf_conn_counter[IP_CT_DIR_MAX])); |
| 683 | } | 681 | } |
| 684 | releasect: | ||
| 685 | nf_ct_put(ct); | ||
| 686 | } | 682 | } |
| 687 | if (cb->args[1]) { | 683 | if (cb->args[1]) { |
| 688 | cb->args[1] = 0; | 684 | cb->args[1] = 0; |
| @@ -690,7 +686,7 @@ releasect: | |||
| 690 | } | 686 | } |
| 691 | } | 687 | } |
| 692 | out: | 688 | out: |
| 693 | rcu_read_unlock(); | 689 | spin_unlock_bh(&nf_conntrack_lock); |
| 694 | if (last) | 690 | if (last) |
| 695 | nf_ct_put(last); | 691 | nf_ct_put(last); |
| 696 | 692 | ||
| @@ -928,7 +924,7 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb, | |||
| 928 | u16 zone; | 924 | u16 zone; |
| 929 | int err; | 925 | int err; |
| 930 | 926 | ||
| 931 | if (nlh->nlmsg_flags & NLM_F_DUMP) | 927 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) |
| 932 | return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table, | 928 | return netlink_dump_start(ctnl, skb, nlh, ctnetlink_dump_table, |
| 933 | ctnetlink_done); | 929 | ctnetlink_done); |
| 934 | 930 | ||
| @@ -1790,7 +1786,7 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb, | |||
| 1790 | u16 zone; | 1786 | u16 zone; |
| 1791 | int err; | 1787 | int err; |
| 1792 | 1788 | ||
| 1793 | if (nlh->nlmsg_flags & NLM_F_DUMP) { | 1789 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { |
| 1794 | return netlink_dump_start(ctnl, skb, nlh, | 1790 | return netlink_dump_start(ctnl, skb, nlh, |
| 1795 | ctnetlink_exp_dump_table, | 1791 | ctnetlink_exp_dump_table, |
| 1796 | ctnetlink_exp_done); | 1792 | ctnetlink_exp_done); |
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c index 80463507420e..c94237631077 100644 --- a/net/netfilter/x_tables.c +++ b/net/netfilter/x_tables.c | |||
| @@ -1325,7 +1325,8 @@ static int __init xt_init(void) | |||
| 1325 | 1325 | ||
| 1326 | for_each_possible_cpu(i) { | 1326 | for_each_possible_cpu(i) { |
| 1327 | struct xt_info_lock *lock = &per_cpu(xt_info_locks, i); | 1327 | struct xt_info_lock *lock = &per_cpu(xt_info_locks, i); |
| 1328 | spin_lock_init(&lock->lock); | 1328 | |
| 1329 | seqlock_init(&lock->lock); | ||
| 1329 | lock->readers = 0; | 1330 | lock->readers = 0; |
| 1330 | } | 1331 | } |
| 1331 | 1332 | ||
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index 1781d99145e2..f83cb370292b 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
| @@ -519,7 +519,7 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 519 | security_netlink_recv(skb, CAP_NET_ADMIN)) | 519 | security_netlink_recv(skb, CAP_NET_ADMIN)) |
| 520 | return -EPERM; | 520 | return -EPERM; |
| 521 | 521 | ||
| 522 | if (nlh->nlmsg_flags & NLM_F_DUMP) { | 522 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { |
| 523 | if (ops->dumpit == NULL) | 523 | if (ops->dumpit == NULL) |
| 524 | return -EOPNOTSUPP; | 524 | return -EOPNOTSUPP; |
| 525 | 525 | ||
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c index fd95beb72f5d..1072b2c19d31 100644 --- a/net/phonet/af_phonet.c +++ b/net/phonet/af_phonet.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | /* Transport protocol registration */ | 37 | /* Transport protocol registration */ |
| 38 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; | 38 | static struct phonet_protocol *proto_tab[PHONET_NPROTO] __read_mostly; |
| 39 | 39 | ||
| 40 | static struct phonet_protocol *phonet_proto_get(int protocol) | 40 | static struct phonet_protocol *phonet_proto_get(unsigned int protocol) |
| 41 | { | 41 | { |
| 42 | struct phonet_protocol *pp; | 42 | struct phonet_protocol *pp; |
| 43 | 43 | ||
| @@ -458,7 +458,7 @@ static struct packet_type phonet_packet_type __read_mostly = { | |||
| 458 | 458 | ||
| 459 | static DEFINE_MUTEX(proto_tab_lock); | 459 | static DEFINE_MUTEX(proto_tab_lock); |
| 460 | 460 | ||
| 461 | int __init_or_module phonet_proto_register(int protocol, | 461 | int __init_or_module phonet_proto_register(unsigned int protocol, |
| 462 | struct phonet_protocol *pp) | 462 | struct phonet_protocol *pp) |
| 463 | { | 463 | { |
| 464 | int err = 0; | 464 | int err = 0; |
| @@ -481,7 +481,7 @@ int __init_or_module phonet_proto_register(int protocol, | |||
| 481 | } | 481 | } |
| 482 | EXPORT_SYMBOL(phonet_proto_register); | 482 | EXPORT_SYMBOL(phonet_proto_register); |
| 483 | 483 | ||
| 484 | void phonet_proto_unregister(int protocol, struct phonet_protocol *pp) | 484 | void phonet_proto_unregister(unsigned int protocol, struct phonet_protocol *pp) |
| 485 | { | 485 | { |
| 486 | mutex_lock(&proto_tab_lock); | 486 | mutex_lock(&proto_tab_lock); |
| 487 | BUG_ON(proto_tab[protocol] != pp); | 487 | BUG_ON(proto_tab[protocol] != pp); |
diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c index 67dc7ce9b63a..83ddfc07e45d 100644 --- a/net/sched/act_csum.c +++ b/net/sched/act_csum.c | |||
| @@ -508,8 +508,7 @@ static int tcf_csum(struct sk_buff *skb, | |||
| 508 | 508 | ||
| 509 | spin_lock(&p->tcf_lock); | 509 | spin_lock(&p->tcf_lock); |
| 510 | p->tcf_tm.lastuse = jiffies; | 510 | p->tcf_tm.lastuse = jiffies; |
| 511 | p->tcf_bstats.bytes += qdisc_pkt_len(skb); | 511 | bstats_update(&p->tcf_bstats, skb); |
| 512 | p->tcf_bstats.packets++; | ||
| 513 | action = p->tcf_action; | 512 | action = p->tcf_action; |
| 514 | update_flags = p->update_flags; | 513 | update_flags = p->update_flags; |
| 515 | spin_unlock(&p->tcf_lock); | 514 | spin_unlock(&p->tcf_lock); |
diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c index 8daef9632255..c2a7c20e81c1 100644 --- a/net/sched/act_ipt.c +++ b/net/sched/act_ipt.c | |||
| @@ -209,8 +209,7 @@ static int tcf_ipt(struct sk_buff *skb, struct tc_action *a, | |||
| 209 | spin_lock(&ipt->tcf_lock); | 209 | spin_lock(&ipt->tcf_lock); |
| 210 | 210 | ||
| 211 | ipt->tcf_tm.lastuse = jiffies; | 211 | ipt->tcf_tm.lastuse = jiffies; |
| 212 | ipt->tcf_bstats.bytes += qdisc_pkt_len(skb); | 212 | bstats_update(&ipt->tcf_bstats, skb); |
| 213 | ipt->tcf_bstats.packets++; | ||
| 214 | 213 | ||
| 215 | /* yes, we have to worry about both in and out dev | 214 | /* yes, we have to worry about both in and out dev |
| 216 | worry later - danger - this API seems to have changed | 215 | worry later - danger - this API seems to have changed |
diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c index 0c311be92827..d765067e99db 100644 --- a/net/sched/act_mirred.c +++ b/net/sched/act_mirred.c | |||
| @@ -165,8 +165,7 @@ static int tcf_mirred(struct sk_buff *skb, struct tc_action *a, | |||
| 165 | 165 | ||
| 166 | spin_lock(&m->tcf_lock); | 166 | spin_lock(&m->tcf_lock); |
| 167 | m->tcf_tm.lastuse = jiffies; | 167 | m->tcf_tm.lastuse = jiffies; |
| 168 | m->tcf_bstats.bytes += qdisc_pkt_len(skb); | 168 | bstats_update(&m->tcf_bstats, skb); |
| 169 | m->tcf_bstats.packets++; | ||
| 170 | 169 | ||
| 171 | dev = m->tcfm_dev; | 170 | dev = m->tcfm_dev; |
| 172 | if (!dev) { | 171 | if (!dev) { |
diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c index 186eb837e600..178a4bd7b7cb 100644 --- a/net/sched/act_nat.c +++ b/net/sched/act_nat.c | |||
| @@ -125,8 +125,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a, | |||
| 125 | egress = p->flags & TCA_NAT_FLAG_EGRESS; | 125 | egress = p->flags & TCA_NAT_FLAG_EGRESS; |
| 126 | action = p->tcf_action; | 126 | action = p->tcf_action; |
| 127 | 127 | ||
| 128 | p->tcf_bstats.bytes += qdisc_pkt_len(skb); | 128 | bstats_update(&p->tcf_bstats, skb); |
| 129 | p->tcf_bstats.packets++; | ||
| 130 | 129 | ||
| 131 | spin_unlock(&p->tcf_lock); | 130 | spin_unlock(&p->tcf_lock); |
| 132 | 131 | ||
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index a0593c9640db..445bef716f77 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c | |||
| @@ -187,8 +187,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a, | |||
| 187 | bad: | 187 | bad: |
| 188 | p->tcf_qstats.overlimits++; | 188 | p->tcf_qstats.overlimits++; |
| 189 | done: | 189 | done: |
| 190 | p->tcf_bstats.bytes += qdisc_pkt_len(skb); | 190 | bstats_update(&p->tcf_bstats, skb); |
| 191 | p->tcf_bstats.packets++; | ||
| 192 | spin_unlock(&p->tcf_lock); | 191 | spin_unlock(&p->tcf_lock); |
| 193 | return p->tcf_action; | 192 | return p->tcf_action; |
| 194 | } | 193 | } |
diff --git a/net/sched/act_police.c b/net/sched/act_police.c index 7ebf7439b478..e2f08b1e2e58 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c | |||
| @@ -298,8 +298,7 @@ static int tcf_act_police(struct sk_buff *skb, struct tc_action *a, | |||
| 298 | 298 | ||
| 299 | spin_lock(&police->tcf_lock); | 299 | spin_lock(&police->tcf_lock); |
| 300 | 300 | ||
| 301 | police->tcf_bstats.bytes += qdisc_pkt_len(skb); | 301 | bstats_update(&police->tcf_bstats, skb); |
| 302 | police->tcf_bstats.packets++; | ||
| 303 | 302 | ||
| 304 | if (police->tcfp_ewma_rate && | 303 | if (police->tcfp_ewma_rate && |
| 305 | police->tcf_rate_est.bps >= police->tcfp_ewma_rate) { | 304 | police->tcf_rate_est.bps >= police->tcfp_ewma_rate) { |
diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c index 97e84f3ee775..7287cff7af3e 100644 --- a/net/sched/act_simple.c +++ b/net/sched/act_simple.c | |||
| @@ -42,8 +42,7 @@ static int tcf_simp(struct sk_buff *skb, struct tc_action *a, struct tcf_result | |||
| 42 | 42 | ||
| 43 | spin_lock(&d->tcf_lock); | 43 | spin_lock(&d->tcf_lock); |
| 44 | d->tcf_tm.lastuse = jiffies; | 44 | d->tcf_tm.lastuse = jiffies; |
| 45 | d->tcf_bstats.bytes += qdisc_pkt_len(skb); | 45 | bstats_update(&d->tcf_bstats, skb); |
| 46 | d->tcf_bstats.packets++; | ||
| 47 | 46 | ||
| 48 | /* print policy string followed by _ then packet count | 47 | /* print policy string followed by _ then packet count |
| 49 | * Example if this was the 3rd packet and the string was "hello" | 48 | * Example if this was the 3rd packet and the string was "hello" |
diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c index 66cbf4eb8855..836f5fee9e58 100644 --- a/net/sched/act_skbedit.c +++ b/net/sched/act_skbedit.c | |||
| @@ -46,8 +46,7 @@ static int tcf_skbedit(struct sk_buff *skb, struct tc_action *a, | |||
| 46 | 46 | ||
| 47 | spin_lock(&d->tcf_lock); | 47 | spin_lock(&d->tcf_lock); |
| 48 | d->tcf_tm.lastuse = jiffies; | 48 | d->tcf_tm.lastuse = jiffies; |
| 49 | d->tcf_bstats.bytes += qdisc_pkt_len(skb); | 49 | bstats_update(&d->tcf_bstats, skb); |
| 50 | d->tcf_bstats.packets++; | ||
| 51 | 50 | ||
| 52 | if (d->flags & SKBEDIT_F_PRIORITY) | 51 | if (d->flags & SKBEDIT_F_PRIORITY) |
| 53 | skb->priority = d->priority; | 52 | skb->priority = d->priority; |
diff --git a/net/sched/sch_atm.c b/net/sched/sch_atm.c index 282540778aa8..943d733409d0 100644 --- a/net/sched/sch_atm.c +++ b/net/sched/sch_atm.c | |||
| @@ -422,10 +422,8 @@ drop: __maybe_unused | |||
| 422 | } | 422 | } |
| 423 | return ret; | 423 | return ret; |
| 424 | } | 424 | } |
| 425 | sch->bstats.bytes += qdisc_pkt_len(skb); | 425 | qdisc_bstats_update(sch, skb); |
| 426 | sch->bstats.packets++; | 426 | bstats_update(&flow->bstats, skb); |
| 427 | flow->bstats.bytes += qdisc_pkt_len(skb); | ||
| 428 | flow->bstats.packets++; | ||
| 429 | /* | 427 | /* |
| 430 | * Okay, this may seem weird. We pretend we've dropped the packet if | 428 | * Okay, this may seem weird. We pretend we've dropped the packet if |
| 431 | * it goes via ATM. The reason for this is that the outer qdisc | 429 | * it goes via ATM. The reason for this is that the outer qdisc |
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index eb7631590865..c80d1c210c5d 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
| @@ -390,8 +390,7 @@ cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 390 | ret = qdisc_enqueue(skb, cl->q); | 390 | ret = qdisc_enqueue(skb, cl->q); |
| 391 | if (ret == NET_XMIT_SUCCESS) { | 391 | if (ret == NET_XMIT_SUCCESS) { |
| 392 | sch->q.qlen++; | 392 | sch->q.qlen++; |
| 393 | sch->bstats.packets++; | 393 | qdisc_bstats_update(sch, skb); |
| 394 | sch->bstats.bytes += qdisc_pkt_len(skb); | ||
| 395 | cbq_mark_toplevel(q, cl); | 394 | cbq_mark_toplevel(q, cl); |
| 396 | if (!cl->next_alive) | 395 | if (!cl->next_alive) |
| 397 | cbq_activate_class(cl); | 396 | cbq_activate_class(cl); |
| @@ -650,8 +649,7 @@ static int cbq_reshape_fail(struct sk_buff *skb, struct Qdisc *child) | |||
| 650 | ret = qdisc_enqueue(skb, cl->q); | 649 | ret = qdisc_enqueue(skb, cl->q); |
| 651 | if (ret == NET_XMIT_SUCCESS) { | 650 | if (ret == NET_XMIT_SUCCESS) { |
| 652 | sch->q.qlen++; | 651 | sch->q.qlen++; |
| 653 | sch->bstats.packets++; | 652 | qdisc_bstats_update(sch, skb); |
| 654 | sch->bstats.bytes += qdisc_pkt_len(skb); | ||
| 655 | if (!cl->next_alive) | 653 | if (!cl->next_alive) |
| 656 | cbq_activate_class(cl); | 654 | cbq_activate_class(cl); |
| 657 | return 0; | 655 | return 0; |
diff --git a/net/sched/sch_drr.c b/net/sched/sch_drr.c index aa8b5313f8cf..de55e642eafc 100644 --- a/net/sched/sch_drr.c +++ b/net/sched/sch_drr.c | |||
| @@ -351,7 +351,6 @@ static int drr_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 351 | { | 351 | { |
| 352 | struct drr_sched *q = qdisc_priv(sch); | 352 | struct drr_sched *q = qdisc_priv(sch); |
| 353 | struct drr_class *cl; | 353 | struct drr_class *cl; |
| 354 | unsigned int len; | ||
| 355 | int err; | 354 | int err; |
| 356 | 355 | ||
| 357 | cl = drr_classify(skb, sch, &err); | 356 | cl = drr_classify(skb, sch, &err); |
| @@ -362,7 +361,6 @@ static int drr_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 362 | return err; | 361 | return err; |
| 363 | } | 362 | } |
| 364 | 363 | ||
| 365 | len = qdisc_pkt_len(skb); | ||
| 366 | err = qdisc_enqueue(skb, cl->qdisc); | 364 | err = qdisc_enqueue(skb, cl->qdisc); |
| 367 | if (unlikely(err != NET_XMIT_SUCCESS)) { | 365 | if (unlikely(err != NET_XMIT_SUCCESS)) { |
| 368 | if (net_xmit_drop_count(err)) { | 366 | if (net_xmit_drop_count(err)) { |
| @@ -377,10 +375,8 @@ static int drr_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 377 | cl->deficit = cl->quantum; | 375 | cl->deficit = cl->quantum; |
| 378 | } | 376 | } |
| 379 | 377 | ||
| 380 | cl->bstats.packets++; | 378 | bstats_update(&cl->bstats, skb); |
| 381 | cl->bstats.bytes += len; | 379 | qdisc_bstats_update(sch, skb); |
| 382 | sch->bstats.packets++; | ||
| 383 | sch->bstats.bytes += len; | ||
| 384 | 380 | ||
| 385 | sch->q.qlen++; | 381 | sch->q.qlen++; |
| 386 | return err; | 382 | return err; |
diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c index 1d295d62bb5c..60f4bdd4408e 100644 --- a/net/sched/sch_dsmark.c +++ b/net/sched/sch_dsmark.c | |||
| @@ -260,8 +260,7 @@ static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 260 | return err; | 260 | return err; |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | sch->bstats.bytes += qdisc_pkt_len(skb); | 263 | qdisc_bstats_update(sch, skb); |
| 264 | sch->bstats.packets++; | ||
| 265 | sch->q.qlen++; | 264 | sch->q.qlen++; |
| 266 | 265 | ||
| 267 | return NET_XMIT_SUCCESS; | 266 | return NET_XMIT_SUCCESS; |
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index 069c62b7bb36..2e45791d4f6c 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c | |||
| @@ -1599,10 +1599,8 @@ hfsc_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 1599 | if (cl->qdisc->q.qlen == 1) | 1599 | if (cl->qdisc->q.qlen == 1) |
| 1600 | set_active(cl, qdisc_pkt_len(skb)); | 1600 | set_active(cl, qdisc_pkt_len(skb)); |
| 1601 | 1601 | ||
| 1602 | cl->bstats.packets++; | 1602 | bstats_update(&cl->bstats, skb); |
| 1603 | cl->bstats.bytes += qdisc_pkt_len(skb); | 1603 | qdisc_bstats_update(sch, skb); |
| 1604 | sch->bstats.packets++; | ||
| 1605 | sch->bstats.bytes += qdisc_pkt_len(skb); | ||
| 1606 | sch->q.qlen++; | 1604 | sch->q.qlen++; |
| 1607 | 1605 | ||
| 1608 | return NET_XMIT_SUCCESS; | 1606 | return NET_XMIT_SUCCESS; |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 01b519d6c52d..984c1b0c6836 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
| @@ -569,15 +569,12 @@ static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 569 | } | 569 | } |
| 570 | return ret; | 570 | return ret; |
| 571 | } else { | 571 | } else { |
| 572 | cl->bstats.packets += | 572 | bstats_update(&cl->bstats, skb); |
| 573 | skb_is_gso(skb)?skb_shinfo(skb)->gso_segs:1; | ||
| 574 | cl->bstats.bytes += qdisc_pkt_len(skb); | ||
| 575 | htb_activate(q, cl); | 573 | htb_activate(q, cl); |
| 576 | } | 574 | } |
| 577 | 575 | ||
| 578 | sch->q.qlen++; | 576 | sch->q.qlen++; |
| 579 | sch->bstats.packets += skb_is_gso(skb)?skb_shinfo(skb)->gso_segs:1; | 577 | qdisc_bstats_update(sch, skb); |
| 580 | sch->bstats.bytes += qdisc_pkt_len(skb); | ||
| 581 | return NET_XMIT_SUCCESS; | 578 | return NET_XMIT_SUCCESS; |
| 582 | } | 579 | } |
| 583 | 580 | ||
| @@ -648,12 +645,10 @@ static void htb_charge_class(struct htb_sched *q, struct htb_class *cl, | |||
| 648 | htb_add_to_wait_tree(q, cl, diff); | 645 | htb_add_to_wait_tree(q, cl, diff); |
| 649 | } | 646 | } |
| 650 | 647 | ||
| 651 | /* update byte stats except for leaves which are already updated */ | 648 | /* update basic stats except for leaves which are already updated */ |
| 652 | if (cl->level) { | 649 | if (cl->level) |
| 653 | cl->bstats.bytes += bytes; | 650 | bstats_update(&cl->bstats, skb); |
| 654 | cl->bstats.packets += skb_is_gso(skb)? | 651 | |
| 655 | skb_shinfo(skb)->gso_segs:1; | ||
| 656 | } | ||
| 657 | cl = cl->parent; | 652 | cl = cl->parent; |
| 658 | } | 653 | } |
| 659 | } | 654 | } |
diff --git a/net/sched/sch_ingress.c b/net/sched/sch_ingress.c index f10e34a68445..bce1665239b8 100644 --- a/net/sched/sch_ingress.c +++ b/net/sched/sch_ingress.c | |||
| @@ -63,8 +63,7 @@ static int ingress_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 63 | 63 | ||
| 64 | result = tc_classify(skb, p->filter_list, &res); | 64 | result = tc_classify(skb, p->filter_list, &res); |
| 65 | 65 | ||
| 66 | sch->bstats.packets++; | 66 | qdisc_bstats_update(sch, skb); |
| 67 | sch->bstats.bytes += qdisc_pkt_len(skb); | ||
| 68 | switch (result) { | 67 | switch (result) { |
| 69 | case TC_ACT_SHOT: | 68 | case TC_ACT_SHOT: |
| 70 | result = TC_ACT_SHOT; | 69 | result = TC_ACT_SHOT; |
diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c index 32690deab5d0..21f13da24763 100644 --- a/net/sched/sch_multiq.c +++ b/net/sched/sch_multiq.c | |||
| @@ -83,8 +83,7 @@ multiq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 83 | 83 | ||
| 84 | ret = qdisc_enqueue(skb, qdisc); | 84 | ret = qdisc_enqueue(skb, qdisc); |
| 85 | if (ret == NET_XMIT_SUCCESS) { | 85 | if (ret == NET_XMIT_SUCCESS) { |
| 86 | sch->bstats.bytes += qdisc_pkt_len(skb); | 86 | qdisc_bstats_update(sch, skb); |
| 87 | sch->bstats.packets++; | ||
| 88 | sch->q.qlen++; | 87 | sch->q.qlen++; |
| 89 | return NET_XMIT_SUCCESS; | 88 | return NET_XMIT_SUCCESS; |
| 90 | } | 89 | } |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index e5593c083a78..1c4bce863479 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
| @@ -240,8 +240,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 240 | 240 | ||
| 241 | if (likely(ret == NET_XMIT_SUCCESS)) { | 241 | if (likely(ret == NET_XMIT_SUCCESS)) { |
| 242 | sch->q.qlen++; | 242 | sch->q.qlen++; |
| 243 | sch->bstats.bytes += qdisc_pkt_len(skb); | 243 | qdisc_bstats_update(sch, skb); |
| 244 | sch->bstats.packets++; | ||
| 245 | } else if (net_xmit_drop_count(ret)) { | 244 | } else if (net_xmit_drop_count(ret)) { |
| 246 | sch->qstats.drops++; | 245 | sch->qstats.drops++; |
| 247 | } | 246 | } |
| @@ -477,8 +476,7 @@ static int tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) | |||
| 477 | __skb_queue_after(list, skb, nskb); | 476 | __skb_queue_after(list, skb, nskb); |
| 478 | 477 | ||
| 479 | sch->qstats.backlog += qdisc_pkt_len(nskb); | 478 | sch->qstats.backlog += qdisc_pkt_len(nskb); |
| 480 | sch->bstats.bytes += qdisc_pkt_len(nskb); | 479 | qdisc_bstats_update(sch, nskb); |
| 481 | sch->bstats.packets++; | ||
| 482 | 480 | ||
| 483 | return NET_XMIT_SUCCESS; | 481 | return NET_XMIT_SUCCESS; |
| 484 | } | 482 | } |
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index b1c95bce33ce..966158d49dd1 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c | |||
| @@ -84,8 +84,7 @@ prio_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 84 | 84 | ||
| 85 | ret = qdisc_enqueue(skb, qdisc); | 85 | ret = qdisc_enqueue(skb, qdisc); |
| 86 | if (ret == NET_XMIT_SUCCESS) { | 86 | if (ret == NET_XMIT_SUCCESS) { |
| 87 | sch->bstats.bytes += qdisc_pkt_len(skb); | 87 | qdisc_bstats_update(sch, skb); |
| 88 | sch->bstats.packets++; | ||
| 89 | sch->q.qlen++; | 88 | sch->q.qlen++; |
| 90 | return NET_XMIT_SUCCESS; | 89 | return NET_XMIT_SUCCESS; |
| 91 | } | 90 | } |
diff --git a/net/sched/sch_red.c b/net/sched/sch_red.c index a67ba3c5a0cc..a6009c5a2c97 100644 --- a/net/sched/sch_red.c +++ b/net/sched/sch_red.c | |||
| @@ -94,8 +94,7 @@ static int red_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
| 94 | 94 | ||
| 95 | ret = qdisc_enqueue(skb, child); | 95 | ret = qdisc_enqueue(skb, child); |
| 96 | if (likely(ret == NET_XMIT_SUCCESS)) { | 96 | if (likely(ret == NET_XMIT_SUCCESS)) { |
| 97 | sch->bstats.bytes += qdisc_pkt_len(skb); | 97 | qdisc_bstats_update(sch, skb); |
| 98 | sch->bstats.packets++; | ||
| 99 | sch->q.qlen++; | 98 | sch->q.qlen++; |
| 100 | } else if (net_xmit_drop_count(ret)) { | 99 | } else if (net_xmit_drop_count(ret)) { |
| 101 | q->stats.pdrop++; | 100 | q->stats.pdrop++; |
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index d54ac94066c2..239ec53a634d 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c | |||
| @@ -403,8 +403,7 @@ sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 403 | slot->allot = q->scaled_quantum; | 403 | slot->allot = q->scaled_quantum; |
| 404 | } | 404 | } |
| 405 | if (++sch->q.qlen <= q->limit) { | 405 | if (++sch->q.qlen <= q->limit) { |
| 406 | sch->bstats.bytes += qdisc_pkt_len(skb); | 406 | qdisc_bstats_update(sch, skb); |
| 407 | sch->bstats.packets++; | ||
| 408 | return NET_XMIT_SUCCESS; | 407 | return NET_XMIT_SUCCESS; |
| 409 | } | 408 | } |
| 410 | 409 | ||
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 641a30d64635..77565e721811 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c | |||
| @@ -134,8 +134,7 @@ static int tbf_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | sch->q.qlen++; | 136 | sch->q.qlen++; |
| 137 | sch->bstats.bytes += qdisc_pkt_len(skb); | 137 | qdisc_bstats_update(sch, skb); |
| 138 | sch->bstats.packets++; | ||
| 139 | return NET_XMIT_SUCCESS; | 138 | return NET_XMIT_SUCCESS; |
| 140 | } | 139 | } |
| 141 | 140 | ||
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c index 106479a7c94a..af9360d1f6eb 100644 --- a/net/sched/sch_teql.c +++ b/net/sched/sch_teql.c | |||
| @@ -83,8 +83,7 @@ teql_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
| 83 | 83 | ||
| 84 | if (q->q.qlen < dev->tx_queue_len) { | 84 | if (q->q.qlen < dev->tx_queue_len) { |
| 85 | __skb_queue_tail(&q->q, skb); | 85 | __skb_queue_tail(&q->q, skb); |
| 86 | sch->bstats.bytes += qdisc_pkt_len(skb); | 86 | qdisc_bstats_update(sch, skb); |
| 87 | sch->bstats.packets++; | ||
| 88 | return NET_XMIT_SUCCESS; | 87 | return NET_XMIT_SUCCESS; |
| 89 | } | 88 | } |
| 90 | 89 | ||
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 8eb889510916..d5e1e0b08890 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <net/sock.h> | 26 | #include <net/sock.h> |
| 27 | #include <net/xfrm.h> | 27 | #include <net/xfrm.h> |
| 28 | #include <net/netlink.h> | 28 | #include <net/netlink.h> |
| 29 | #include <net/ah.h> | ||
| 29 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
| 30 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 31 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| 31 | #include <linux/in6.h> | 32 | #include <linux/in6.h> |
| @@ -302,7 +303,8 @@ static int attach_auth_trunc(struct xfrm_algo_auth **algpp, u8 *props, | |||
| 302 | algo = xfrm_aalg_get_byname(ualg->alg_name, 1); | 303 | algo = xfrm_aalg_get_byname(ualg->alg_name, 1); |
| 303 | if (!algo) | 304 | if (!algo) |
| 304 | return -ENOSYS; | 305 | return -ENOSYS; |
| 305 | if (ualg->alg_trunc_len > algo->uinfo.auth.icv_fullbits) | 306 | if ((ualg->alg_trunc_len / 8) > MAX_AH_AUTH_LEN || |
| 307 | ualg->alg_trunc_len > algo->uinfo.auth.icv_fullbits) | ||
| 306 | return -EINVAL; | 308 | return -EINVAL; |
| 307 | *props = algo->desc.sadb_alg_id; | 309 | *props = algo->desc.sadb_alg_id; |
| 308 | 310 | ||
| @@ -2187,7 +2189,7 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
| 2187 | 2189 | ||
| 2188 | if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) || | 2190 | if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) || |
| 2189 | type == (XFRM_MSG_GETPOLICY - XFRM_MSG_BASE)) && | 2191 | type == (XFRM_MSG_GETPOLICY - XFRM_MSG_BASE)) && |
| 2190 | (nlh->nlmsg_flags & NLM_F_DUMP)) { | 2192 | (nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { |
| 2191 | if (link->dump == NULL) | 2193 | if (link->dump == NULL) |
| 2192 | return -EINVAL; | 2194 | return -EINVAL; |
| 2193 | 2195 | ||
