cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

niu.c (234919B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* niu.c: Neptune ethernet driver.
      3 *
      4 * Copyright (C) 2007, 2008 David S. Miller (davem@davemloft.net)
      5 */
      6
      7#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      8
      9#include <linux/module.h>
     10#include <linux/init.h>
     11#include <linux/interrupt.h>
     12#include <linux/pci.h>
     13#include <linux/dma-mapping.h>
     14#include <linux/netdevice.h>
     15#include <linux/ethtool.h>
     16#include <linux/etherdevice.h>
     17#include <linux/platform_device.h>
     18#include <linux/delay.h>
     19#include <linux/bitops.h>
     20#include <linux/mii.h>
     21#include <linux/if.h>
     22#include <linux/if_ether.h>
     23#include <linux/if_vlan.h>
     24#include <linux/ip.h>
     25#include <linux/in.h>
     26#include <linux/ipv6.h>
     27#include <linux/log2.h>
     28#include <linux/jiffies.h>
     29#include <linux/crc32.h>
     30#include <linux/list.h>
     31#include <linux/slab.h>
     32
     33#include <linux/io.h>
     34#include <linux/of_device.h>
     35
     36#include "niu.h"
     37
     38/* This driver wants to store a link to a "next page" within the
     39 * page struct itself by overloading the content of the "mapping"
     40 * member. This is not expected by the page API, but does currently
     41 * work. However, the randstruct plugin gets very bothered by this
     42 * case because "mapping" (struct address_space) is randomized, so
     43 * casts to/from it trigger warnings. Hide this by way of a union,
     44 * to create a typed alias of "mapping", since that's how it is
     45 * actually being used here.
     46 */
     47union niu_page {
     48	struct page page;
     49	struct {
     50		unsigned long __flags;	/* unused alias of "flags" */
     51		struct list_head __lru;	/* unused alias of "lru" */
     52		struct page *next;	/* alias of "mapping" */
     53	};
     54};
     55#define niu_next_page(p)	container_of(p, union niu_page, page)->next
     56
     57#define DRV_MODULE_NAME		"niu"
     58#define DRV_MODULE_VERSION	"1.1"
     59#define DRV_MODULE_RELDATE	"Apr 22, 2010"
     60
     61static char version[] =
     62	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
     63
     64MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
     65MODULE_DESCRIPTION("NIU ethernet driver");
     66MODULE_LICENSE("GPL");
     67MODULE_VERSION(DRV_MODULE_VERSION);
     68
     69#ifndef readq
     70static u64 readq(void __iomem *reg)
     71{
     72	return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);
     73}
     74
     75static void writeq(u64 val, void __iomem *reg)
     76{
     77	writel(val & 0xffffffff, reg);
     78	writel(val >> 32, reg + 0x4UL);
     79}
     80#endif
     81
     82static const struct pci_device_id niu_pci_tbl[] = {
     83	{PCI_DEVICE(PCI_VENDOR_ID_SUN, 0xabcd)},
     84	{}
     85};
     86
     87MODULE_DEVICE_TABLE(pci, niu_pci_tbl);
     88
     89#define NIU_TX_TIMEOUT			(5 * HZ)
     90
     91#define nr64(reg)		readq(np->regs + (reg))
     92#define nw64(reg, val)		writeq((val), np->regs + (reg))
     93
     94#define nr64_mac(reg)		readq(np->mac_regs + (reg))
     95#define nw64_mac(reg, val)	writeq((val), np->mac_regs + (reg))
     96
     97#define nr64_ipp(reg)		readq(np->regs + np->ipp_off + (reg))
     98#define nw64_ipp(reg, val)	writeq((val), np->regs + np->ipp_off + (reg))
     99
    100#define nr64_pcs(reg)		readq(np->regs + np->pcs_off + (reg))
    101#define nw64_pcs(reg, val)	writeq((val), np->regs + np->pcs_off + (reg))
    102
    103#define nr64_xpcs(reg)		readq(np->regs + np->xpcs_off + (reg))
    104#define nw64_xpcs(reg, val)	writeq((val), np->regs + np->xpcs_off + (reg))
    105
    106#define NIU_MSG_DEFAULT (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
    107
    108static int niu_debug;
    109static int debug = -1;
    110module_param(debug, int, 0);
    111MODULE_PARM_DESC(debug, "NIU debug level");
    112
    113#define niu_lock_parent(np, flags) \
    114	spin_lock_irqsave(&np->parent->lock, flags)
    115#define niu_unlock_parent(np, flags) \
    116	spin_unlock_irqrestore(&np->parent->lock, flags)
    117
    118static int serdes_init_10g_serdes(struct niu *np);
    119
    120static int __niu_wait_bits_clear_mac(struct niu *np, unsigned long reg,
    121				     u64 bits, int limit, int delay)
    122{
    123	while (--limit >= 0) {
    124		u64 val = nr64_mac(reg);
    125
    126		if (!(val & bits))
    127			break;
    128		udelay(delay);
    129	}
    130	if (limit < 0)
    131		return -ENODEV;
    132	return 0;
    133}
    134
    135static int __niu_set_and_wait_clear_mac(struct niu *np, unsigned long reg,
    136					u64 bits, int limit, int delay,
    137					const char *reg_name)
    138{
    139	int err;
    140
    141	nw64_mac(reg, bits);
    142	err = __niu_wait_bits_clear_mac(np, reg, bits, limit, delay);
    143	if (err)
    144		netdev_err(np->dev, "bits (%llx) of register %s would not clear, val[%llx]\n",
    145			   (unsigned long long)bits, reg_name,
    146			   (unsigned long long)nr64_mac(reg));
    147	return err;
    148}
    149
    150#define niu_set_and_wait_clear_mac(NP, REG, BITS, LIMIT, DELAY, REG_NAME) \
    151({	BUILD_BUG_ON(LIMIT <= 0 || DELAY < 0); \
    152	__niu_set_and_wait_clear_mac(NP, REG, BITS, LIMIT, DELAY, REG_NAME); \
    153})
    154
    155static int __niu_wait_bits_clear_ipp(struct niu *np, unsigned long reg,
    156				     u64 bits, int limit, int delay)
    157{
    158	while (--limit >= 0) {
    159		u64 val = nr64_ipp(reg);
    160
    161		if (!(val & bits))
    162			break;
    163		udelay(delay);
    164	}
    165	if (limit < 0)
    166		return -ENODEV;
    167	return 0;
    168}
    169
    170static int __niu_set_and_wait_clear_ipp(struct niu *np, unsigned long reg,
    171					u64 bits, int limit, int delay,
    172					const char *reg_name)
    173{
    174	int err;
    175	u64 val;
    176
    177	val = nr64_ipp(reg);
    178	val |= bits;
    179	nw64_ipp(reg, val);
    180
    181	err = __niu_wait_bits_clear_ipp(np, reg, bits, limit, delay);
    182	if (err)
    183		netdev_err(np->dev, "bits (%llx) of register %s would not clear, val[%llx]\n",
    184			   (unsigned long long)bits, reg_name,
    185			   (unsigned long long)nr64_ipp(reg));
    186	return err;
    187}
    188
    189#define niu_set_and_wait_clear_ipp(NP, REG, BITS, LIMIT, DELAY, REG_NAME) \
    190({	BUILD_BUG_ON(LIMIT <= 0 || DELAY < 0); \
    191	__niu_set_and_wait_clear_ipp(NP, REG, BITS, LIMIT, DELAY, REG_NAME); \
    192})
    193
    194static int __niu_wait_bits_clear(struct niu *np, unsigned long reg,
    195				 u64 bits, int limit, int delay)
    196{
    197	while (--limit >= 0) {
    198		u64 val = nr64(reg);
    199
    200		if (!(val & bits))
    201			break;
    202		udelay(delay);
    203	}
    204	if (limit < 0)
    205		return -ENODEV;
    206	return 0;
    207}
    208
    209#define niu_wait_bits_clear(NP, REG, BITS, LIMIT, DELAY) \
    210({	BUILD_BUG_ON(LIMIT <= 0 || DELAY < 0); \
    211	__niu_wait_bits_clear(NP, REG, BITS, LIMIT, DELAY); \
    212})
    213
    214static int __niu_set_and_wait_clear(struct niu *np, unsigned long reg,
    215				    u64 bits, int limit, int delay,
    216				    const char *reg_name)
    217{
    218	int err;
    219
    220	nw64(reg, bits);
    221	err = __niu_wait_bits_clear(np, reg, bits, limit, delay);
    222	if (err)
    223		netdev_err(np->dev, "bits (%llx) of register %s would not clear, val[%llx]\n",
    224			   (unsigned long long)bits, reg_name,
    225			   (unsigned long long)nr64(reg));
    226	return err;
    227}
    228
    229#define niu_set_and_wait_clear(NP, REG, BITS, LIMIT, DELAY, REG_NAME) \
    230({	BUILD_BUG_ON(LIMIT <= 0 || DELAY < 0); \
    231	__niu_set_and_wait_clear(NP, REG, BITS, LIMIT, DELAY, REG_NAME); \
    232})
    233
    234static void niu_ldg_rearm(struct niu *np, struct niu_ldg *lp, int on)
    235{
    236	u64 val = (u64) lp->timer;
    237
    238	if (on)
    239		val |= LDG_IMGMT_ARM;
    240
    241	nw64(LDG_IMGMT(lp->ldg_num), val);
    242}
    243
    244static int niu_ldn_irq_enable(struct niu *np, int ldn, int on)
    245{
    246	unsigned long mask_reg, bits;
    247	u64 val;
    248
    249	if (ldn < 0 || ldn > LDN_MAX)
    250		return -EINVAL;
    251
    252	if (ldn < 64) {
    253		mask_reg = LD_IM0(ldn);
    254		bits = LD_IM0_MASK;
    255	} else {
    256		mask_reg = LD_IM1(ldn - 64);
    257		bits = LD_IM1_MASK;
    258	}
    259
    260	val = nr64(mask_reg);
    261	if (on)
    262		val &= ~bits;
    263	else
    264		val |= bits;
    265	nw64(mask_reg, val);
    266
    267	return 0;
    268}
    269
    270static int niu_enable_ldn_in_ldg(struct niu *np, struct niu_ldg *lp, int on)
    271{
    272	struct niu_parent *parent = np->parent;
    273	int i;
    274
    275	for (i = 0; i <= LDN_MAX; i++) {
    276		int err;
    277
    278		if (parent->ldg_map[i] != lp->ldg_num)
    279			continue;
    280
    281		err = niu_ldn_irq_enable(np, i, on);
    282		if (err)
    283			return err;
    284	}
    285	return 0;
    286}
    287
    288static int niu_enable_interrupts(struct niu *np, int on)
    289{
    290	int i;
    291
    292	for (i = 0; i < np->num_ldg; i++) {
    293		struct niu_ldg *lp = &np->ldg[i];
    294		int err;
    295
    296		err = niu_enable_ldn_in_ldg(np, lp, on);
    297		if (err)
    298			return err;
    299	}
    300	for (i = 0; i < np->num_ldg; i++)
    301		niu_ldg_rearm(np, &np->ldg[i], on);
    302
    303	return 0;
    304}
    305
    306static u32 phy_encode(u32 type, int port)
    307{
    308	return type << (port * 2);
    309}
    310
    311static u32 phy_decode(u32 val, int port)
    312{
    313	return (val >> (port * 2)) & PORT_TYPE_MASK;
    314}
    315
    316static int mdio_wait(struct niu *np)
    317{
    318	int limit = 1000;
    319	u64 val;
    320
    321	while (--limit > 0) {
    322		val = nr64(MIF_FRAME_OUTPUT);
    323		if ((val >> MIF_FRAME_OUTPUT_TA_SHIFT) & 0x1)
    324			return val & MIF_FRAME_OUTPUT_DATA;
    325
    326		udelay(10);
    327	}
    328
    329	return -ENODEV;
    330}
    331
    332static int mdio_read(struct niu *np, int port, int dev, int reg)
    333{
    334	int err;
    335
    336	nw64(MIF_FRAME_OUTPUT, MDIO_ADDR_OP(port, dev, reg));
    337	err = mdio_wait(np);
    338	if (err < 0)
    339		return err;
    340
    341	nw64(MIF_FRAME_OUTPUT, MDIO_READ_OP(port, dev));
    342	return mdio_wait(np);
    343}
    344
    345static int mdio_write(struct niu *np, int port, int dev, int reg, int data)
    346{
    347	int err;
    348
    349	nw64(MIF_FRAME_OUTPUT, MDIO_ADDR_OP(port, dev, reg));
    350	err = mdio_wait(np);
    351	if (err < 0)
    352		return err;
    353
    354	nw64(MIF_FRAME_OUTPUT, MDIO_WRITE_OP(port, dev, data));
    355	err = mdio_wait(np);
    356	if (err < 0)
    357		return err;
    358
    359	return 0;
    360}
    361
    362static int mii_read(struct niu *np, int port, int reg)
    363{
    364	nw64(MIF_FRAME_OUTPUT, MII_READ_OP(port, reg));
    365	return mdio_wait(np);
    366}
    367
    368static int mii_write(struct niu *np, int port, int reg, int data)
    369{
    370	int err;
    371
    372	nw64(MIF_FRAME_OUTPUT, MII_WRITE_OP(port, reg, data));
    373	err = mdio_wait(np);
    374	if (err < 0)
    375		return err;
    376
    377	return 0;
    378}
    379
    380static int esr2_set_tx_cfg(struct niu *np, unsigned long channel, u32 val)
    381{
    382	int err;
    383
    384	err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    385			 ESR2_TI_PLL_TX_CFG_L(channel),
    386			 val & 0xffff);
    387	if (!err)
    388		err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    389				 ESR2_TI_PLL_TX_CFG_H(channel),
    390				 val >> 16);
    391	return err;
    392}
    393
    394static int esr2_set_rx_cfg(struct niu *np, unsigned long channel, u32 val)
    395{
    396	int err;
    397
    398	err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    399			 ESR2_TI_PLL_RX_CFG_L(channel),
    400			 val & 0xffff);
    401	if (!err)
    402		err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    403				 ESR2_TI_PLL_RX_CFG_H(channel),
    404				 val >> 16);
    405	return err;
    406}
    407
    408/* Mode is always 10G fiber.  */
    409static int serdes_init_niu_10g_fiber(struct niu *np)
    410{
    411	struct niu_link_config *lp = &np->link_config;
    412	u32 tx_cfg, rx_cfg;
    413	unsigned long i;
    414
    415	tx_cfg = (PLL_TX_CFG_ENTX | PLL_TX_CFG_SWING_1375MV);
    416	rx_cfg = (PLL_RX_CFG_ENRX | PLL_RX_CFG_TERM_0P8VDDT |
    417		  PLL_RX_CFG_ALIGN_ENA | PLL_RX_CFG_LOS_LTHRESH |
    418		  PLL_RX_CFG_EQ_LP_ADAPTIVE);
    419
    420	if (lp->loopback_mode == LOOPBACK_PHY) {
    421		u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS;
    422
    423		mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    424			   ESR2_TI_PLL_TEST_CFG_L, test_cfg);
    425
    426		tx_cfg |= PLL_TX_CFG_ENTEST;
    427		rx_cfg |= PLL_RX_CFG_ENTEST;
    428	}
    429
    430	/* Initialize all 4 lanes of the SERDES.  */
    431	for (i = 0; i < 4; i++) {
    432		int err = esr2_set_tx_cfg(np, i, tx_cfg);
    433		if (err)
    434			return err;
    435	}
    436
    437	for (i = 0; i < 4; i++) {
    438		int err = esr2_set_rx_cfg(np, i, rx_cfg);
    439		if (err)
    440			return err;
    441	}
    442
    443	return 0;
    444}
    445
    446static int serdes_init_niu_1g_serdes(struct niu *np)
    447{
    448	struct niu_link_config *lp = &np->link_config;
    449	u16 pll_cfg, pll_sts;
    450	int max_retry = 100;
    451	u64 sig, mask, val;
    452	u32 tx_cfg, rx_cfg;
    453	unsigned long i;
    454	int err;
    455
    456	tx_cfg = (PLL_TX_CFG_ENTX | PLL_TX_CFG_SWING_1375MV |
    457		  PLL_TX_CFG_RATE_HALF);
    458	rx_cfg = (PLL_RX_CFG_ENRX | PLL_RX_CFG_TERM_0P8VDDT |
    459		  PLL_RX_CFG_ALIGN_ENA | PLL_RX_CFG_LOS_LTHRESH |
    460		  PLL_RX_CFG_RATE_HALF);
    461
    462	if (np->port == 0)
    463		rx_cfg |= PLL_RX_CFG_EQ_LP_ADAPTIVE;
    464
    465	if (lp->loopback_mode == LOOPBACK_PHY) {
    466		u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS;
    467
    468		mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    469			   ESR2_TI_PLL_TEST_CFG_L, test_cfg);
    470
    471		tx_cfg |= PLL_TX_CFG_ENTEST;
    472		rx_cfg |= PLL_RX_CFG_ENTEST;
    473	}
    474
    475	/* Initialize PLL for 1G */
    476	pll_cfg = (PLL_CFG_ENPLL | PLL_CFG_MPY_8X);
    477
    478	err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    479			 ESR2_TI_PLL_CFG_L, pll_cfg);
    480	if (err) {
    481		netdev_err(np->dev, "NIU Port %d %s() mdio write to ESR2_TI_PLL_CFG_L failed\n",
    482			   np->port, __func__);
    483		return err;
    484	}
    485
    486	pll_sts = PLL_CFG_ENPLL;
    487
    488	err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    489			 ESR2_TI_PLL_STS_L, pll_sts);
    490	if (err) {
    491		netdev_err(np->dev, "NIU Port %d %s() mdio write to ESR2_TI_PLL_STS_L failed\n",
    492			   np->port, __func__);
    493		return err;
    494	}
    495
    496	udelay(200);
    497
    498	/* Initialize all 4 lanes of the SERDES.  */
    499	for (i = 0; i < 4; i++) {
    500		err = esr2_set_tx_cfg(np, i, tx_cfg);
    501		if (err)
    502			return err;
    503	}
    504
    505	for (i = 0; i < 4; i++) {
    506		err = esr2_set_rx_cfg(np, i, rx_cfg);
    507		if (err)
    508			return err;
    509	}
    510
    511	switch (np->port) {
    512	case 0:
    513		val = (ESR_INT_SRDY0_P0 | ESR_INT_DET0_P0);
    514		mask = val;
    515		break;
    516
    517	case 1:
    518		val = (ESR_INT_SRDY0_P1 | ESR_INT_DET0_P1);
    519		mask = val;
    520		break;
    521
    522	default:
    523		return -EINVAL;
    524	}
    525
    526	while (max_retry--) {
    527		sig = nr64(ESR_INT_SIGNALS);
    528		if ((sig & mask) == val)
    529			break;
    530
    531		mdelay(500);
    532	}
    533
    534	if ((sig & mask) != val) {
    535		netdev_err(np->dev, "Port %u signal bits [%08x] are not [%08x]\n",
    536			   np->port, (int)(sig & mask), (int)val);
    537		return -ENODEV;
    538	}
    539
    540	return 0;
    541}
    542
    543static int serdes_init_niu_10g_serdes(struct niu *np)
    544{
    545	struct niu_link_config *lp = &np->link_config;
    546	u32 tx_cfg, rx_cfg, pll_cfg, pll_sts;
    547	int max_retry = 100;
    548	u64 sig, mask, val;
    549	unsigned long i;
    550	int err;
    551
    552	tx_cfg = (PLL_TX_CFG_ENTX | PLL_TX_CFG_SWING_1375MV);
    553	rx_cfg = (PLL_RX_CFG_ENRX | PLL_RX_CFG_TERM_0P8VDDT |
    554		  PLL_RX_CFG_ALIGN_ENA | PLL_RX_CFG_LOS_LTHRESH |
    555		  PLL_RX_CFG_EQ_LP_ADAPTIVE);
    556
    557	if (lp->loopback_mode == LOOPBACK_PHY) {
    558		u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS;
    559
    560		mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    561			   ESR2_TI_PLL_TEST_CFG_L, test_cfg);
    562
    563		tx_cfg |= PLL_TX_CFG_ENTEST;
    564		rx_cfg |= PLL_RX_CFG_ENTEST;
    565	}
    566
    567	/* Initialize PLL for 10G */
    568	pll_cfg = (PLL_CFG_ENPLL | PLL_CFG_MPY_10X);
    569
    570	err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    571			 ESR2_TI_PLL_CFG_L, pll_cfg & 0xffff);
    572	if (err) {
    573		netdev_err(np->dev, "NIU Port %d %s() mdio write to ESR2_TI_PLL_CFG_L failed\n",
    574			   np->port, __func__);
    575		return err;
    576	}
    577
    578	pll_sts = PLL_CFG_ENPLL;
    579
    580	err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
    581			 ESR2_TI_PLL_STS_L, pll_sts & 0xffff);
    582	if (err) {
    583		netdev_err(np->dev, "NIU Port %d %s() mdio write to ESR2_TI_PLL_STS_L failed\n",
    584			   np->port, __func__);
    585		return err;
    586	}
    587
    588	udelay(200);
    589
    590	/* Initialize all 4 lanes of the SERDES.  */
    591	for (i = 0; i < 4; i++) {
    592		err = esr2_set_tx_cfg(np, i, tx_cfg);
    593		if (err)
    594			return err;
    595	}
    596
    597	for (i = 0; i < 4; i++) {
    598		err = esr2_set_rx_cfg(np, i, rx_cfg);
    599		if (err)
    600			return err;
    601	}
    602
    603	/* check if serdes is ready */
    604
    605	switch (np->port) {
    606	case 0:
    607		mask = ESR_INT_SIGNALS_P0_BITS;
    608		val = (ESR_INT_SRDY0_P0 |
    609		       ESR_INT_DET0_P0 |
    610		       ESR_INT_XSRDY_P0 |
    611		       ESR_INT_XDP_P0_CH3 |
    612		       ESR_INT_XDP_P0_CH2 |
    613		       ESR_INT_XDP_P0_CH1 |
    614		       ESR_INT_XDP_P0_CH0);
    615		break;
    616
    617	case 1:
    618		mask = ESR_INT_SIGNALS_P1_BITS;
    619		val = (ESR_INT_SRDY0_P1 |
    620		       ESR_INT_DET0_P1 |
    621		       ESR_INT_XSRDY_P1 |
    622		       ESR_INT_XDP_P1_CH3 |
    623		       ESR_INT_XDP_P1_CH2 |
    624		       ESR_INT_XDP_P1_CH1 |
    625		       ESR_INT_XDP_P1_CH0);
    626		break;
    627
    628	default:
    629		return -EINVAL;
    630	}
    631
    632	while (max_retry--) {
    633		sig = nr64(ESR_INT_SIGNALS);
    634		if ((sig & mask) == val)
    635			break;
    636
    637		mdelay(500);
    638	}
    639
    640	if ((sig & mask) != val) {
    641		pr_info("NIU Port %u signal bits [%08x] are not [%08x] for 10G...trying 1G\n",
    642			np->port, (int)(sig & mask), (int)val);
    643
    644		/* 10G failed, try initializing at 1G */
    645		err = serdes_init_niu_1g_serdes(np);
    646		if (!err) {
    647			np->flags &= ~NIU_FLAGS_10G;
    648			np->mac_xcvr = MAC_XCVR_PCS;
    649		}  else {
    650			netdev_err(np->dev, "Port %u 10G/1G SERDES Link Failed\n",
    651				   np->port);
    652			return -ENODEV;
    653		}
    654	}
    655	return 0;
    656}
    657
    658static int esr_read_rxtx_ctrl(struct niu *np, unsigned long chan, u32 *val)
    659{
    660	int err;
    661
    662	err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR, ESR_RXTX_CTRL_L(chan));
    663	if (err >= 0) {
    664		*val = (err & 0xffff);
    665		err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
    666				ESR_RXTX_CTRL_H(chan));
    667		if (err >= 0)
    668			*val |= ((err & 0xffff) << 16);
    669		err = 0;
    670	}
    671	return err;
    672}
    673
    674static int esr_read_glue0(struct niu *np, unsigned long chan, u32 *val)
    675{
    676	int err;
    677
    678	err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
    679			ESR_GLUE_CTRL0_L(chan));
    680	if (err >= 0) {
    681		*val = (err & 0xffff);
    682		err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
    683				ESR_GLUE_CTRL0_H(chan));
    684		if (err >= 0) {
    685			*val |= ((err & 0xffff) << 16);
    686			err = 0;
    687		}
    688	}
    689	return err;
    690}
    691
    692static int esr_read_reset(struct niu *np, u32 *val)
    693{
    694	int err;
    695
    696	err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
    697			ESR_RXTX_RESET_CTRL_L);
    698	if (err >= 0) {
    699		*val = (err & 0xffff);
    700		err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
    701				ESR_RXTX_RESET_CTRL_H);
    702		if (err >= 0) {
    703			*val |= ((err & 0xffff) << 16);
    704			err = 0;
    705		}
    706	}
    707	return err;
    708}
    709
    710static int esr_write_rxtx_ctrl(struct niu *np, unsigned long chan, u32 val)
    711{
    712	int err;
    713
    714	err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
    715			 ESR_RXTX_CTRL_L(chan), val & 0xffff);
    716	if (!err)
    717		err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
    718				 ESR_RXTX_CTRL_H(chan), (val >> 16));
    719	return err;
    720}
    721
    722static int esr_write_glue0(struct niu *np, unsigned long chan, u32 val)
    723{
    724	int err;
    725
    726	err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
    727			ESR_GLUE_CTRL0_L(chan), val & 0xffff);
    728	if (!err)
    729		err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
    730				 ESR_GLUE_CTRL0_H(chan), (val >> 16));
    731	return err;
    732}
    733
    734static int esr_reset(struct niu *np)
    735{
    736	u32 reset;
    737	int err;
    738
    739	err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
    740			 ESR_RXTX_RESET_CTRL_L, 0x0000);
    741	if (err)
    742		return err;
    743	err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
    744			 ESR_RXTX_RESET_CTRL_H, 0xffff);
    745	if (err)
    746		return err;
    747	udelay(200);
    748
    749	err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
    750			 ESR_RXTX_RESET_CTRL_L, 0xffff);
    751	if (err)
    752		return err;
    753	udelay(200);
    754
    755	err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
    756			 ESR_RXTX_RESET_CTRL_H, 0x0000);
    757	if (err)
    758		return err;
    759	udelay(200);
    760
    761	err = esr_read_reset(np, &reset);
    762	if (err)
    763		return err;
    764	if (reset != 0) {
    765		netdev_err(np->dev, "Port %u ESR_RESET did not clear [%08x]\n",
    766			   np->port, reset);
    767		return -ENODEV;
    768	}
    769
    770	return 0;
    771}
    772
    773static int serdes_init_10g(struct niu *np)
    774{
    775	struct niu_link_config *lp = &np->link_config;
    776	unsigned long ctrl_reg, test_cfg_reg, i;
    777	u64 ctrl_val, test_cfg_val, sig, mask, val;
    778	int err;
    779
    780	switch (np->port) {
    781	case 0:
    782		ctrl_reg = ENET_SERDES_0_CTRL_CFG;
    783		test_cfg_reg = ENET_SERDES_0_TEST_CFG;
    784		break;
    785	case 1:
    786		ctrl_reg = ENET_SERDES_1_CTRL_CFG;
    787		test_cfg_reg = ENET_SERDES_1_TEST_CFG;
    788		break;
    789
    790	default:
    791		return -EINVAL;
    792	}
    793	ctrl_val = (ENET_SERDES_CTRL_SDET_0 |
    794		    ENET_SERDES_CTRL_SDET_1 |
    795		    ENET_SERDES_CTRL_SDET_2 |
    796		    ENET_SERDES_CTRL_SDET_3 |
    797		    (0x5 << ENET_SERDES_CTRL_EMPH_0_SHIFT) |
    798		    (0x5 << ENET_SERDES_CTRL_EMPH_1_SHIFT) |
    799		    (0x5 << ENET_SERDES_CTRL_EMPH_2_SHIFT) |
    800		    (0x5 << ENET_SERDES_CTRL_EMPH_3_SHIFT) |
    801		    (0x1 << ENET_SERDES_CTRL_LADJ_0_SHIFT) |
    802		    (0x1 << ENET_SERDES_CTRL_LADJ_1_SHIFT) |
    803		    (0x1 << ENET_SERDES_CTRL_LADJ_2_SHIFT) |
    804		    (0x1 << ENET_SERDES_CTRL_LADJ_3_SHIFT));
    805	test_cfg_val = 0;
    806
    807	if (lp->loopback_mode == LOOPBACK_PHY) {
    808		test_cfg_val |= ((ENET_TEST_MD_PAD_LOOPBACK <<
    809				  ENET_SERDES_TEST_MD_0_SHIFT) |
    810				 (ENET_TEST_MD_PAD_LOOPBACK <<
    811				  ENET_SERDES_TEST_MD_1_SHIFT) |
    812				 (ENET_TEST_MD_PAD_LOOPBACK <<
    813				  ENET_SERDES_TEST_MD_2_SHIFT) |
    814				 (ENET_TEST_MD_PAD_LOOPBACK <<
    815				  ENET_SERDES_TEST_MD_3_SHIFT));
    816	}
    817
    818	nw64(ctrl_reg, ctrl_val);
    819	nw64(test_cfg_reg, test_cfg_val);
    820
    821	/* Initialize all 4 lanes of the SERDES.  */
    822	for (i = 0; i < 4; i++) {
    823		u32 rxtx_ctrl, glue0;
    824
    825		err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl);
    826		if (err)
    827			return err;
    828		err = esr_read_glue0(np, i, &glue0);
    829		if (err)
    830			return err;
    831
    832		rxtx_ctrl &= ~(ESR_RXTX_CTRL_VMUXLO);
    833		rxtx_ctrl |= (ESR_RXTX_CTRL_ENSTRETCH |
    834			      (2 << ESR_RXTX_CTRL_VMUXLO_SHIFT));
    835
    836		glue0 &= ~(ESR_GLUE_CTRL0_SRATE |
    837			   ESR_GLUE_CTRL0_THCNT |
    838			   ESR_GLUE_CTRL0_BLTIME);
    839		glue0 |= (ESR_GLUE_CTRL0_RXLOSENAB |
    840			  (0xf << ESR_GLUE_CTRL0_SRATE_SHIFT) |
    841			  (0xff << ESR_GLUE_CTRL0_THCNT_SHIFT) |
    842			  (BLTIME_300_CYCLES <<
    843			   ESR_GLUE_CTRL0_BLTIME_SHIFT));
    844
    845		err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl);
    846		if (err)
    847			return err;
    848		err = esr_write_glue0(np, i, glue0);
    849		if (err)
    850			return err;
    851	}
    852
    853	err = esr_reset(np);
    854	if (err)
    855		return err;
    856
    857	sig = nr64(ESR_INT_SIGNALS);
    858	switch (np->port) {
    859	case 0:
    860		mask = ESR_INT_SIGNALS_P0_BITS;
    861		val = (ESR_INT_SRDY0_P0 |
    862		       ESR_INT_DET0_P0 |
    863		       ESR_INT_XSRDY_P0 |
    864		       ESR_INT_XDP_P0_CH3 |
    865		       ESR_INT_XDP_P0_CH2 |
    866		       ESR_INT_XDP_P0_CH1 |
    867		       ESR_INT_XDP_P0_CH0);
    868		break;
    869
    870	case 1:
    871		mask = ESR_INT_SIGNALS_P1_BITS;
    872		val = (ESR_INT_SRDY0_P1 |
    873		       ESR_INT_DET0_P1 |
    874		       ESR_INT_XSRDY_P1 |
    875		       ESR_INT_XDP_P1_CH3 |
    876		       ESR_INT_XDP_P1_CH2 |
    877		       ESR_INT_XDP_P1_CH1 |
    878		       ESR_INT_XDP_P1_CH0);
    879		break;
    880
    881	default:
    882		return -EINVAL;
    883	}
    884
    885	if ((sig & mask) != val) {
    886		if (np->flags & NIU_FLAGS_HOTPLUG_PHY) {
    887			np->flags &= ~NIU_FLAGS_HOTPLUG_PHY_PRESENT;
    888			return 0;
    889		}
    890		netdev_err(np->dev, "Port %u signal bits [%08x] are not [%08x]\n",
    891			   np->port, (int)(sig & mask), (int)val);
    892		return -ENODEV;
    893	}
    894	if (np->flags & NIU_FLAGS_HOTPLUG_PHY)
    895		np->flags |= NIU_FLAGS_HOTPLUG_PHY_PRESENT;
    896	return 0;
    897}
    898
    899static int serdes_init_1g(struct niu *np)
    900{
    901	u64 val;
    902
    903	val = nr64(ENET_SERDES_1_PLL_CFG);
    904	val &= ~ENET_SERDES_PLL_FBDIV2;
    905	switch (np->port) {
    906	case 0:
    907		val |= ENET_SERDES_PLL_HRATE0;
    908		break;
    909	case 1:
    910		val |= ENET_SERDES_PLL_HRATE1;
    911		break;
    912	case 2:
    913		val |= ENET_SERDES_PLL_HRATE2;
    914		break;
    915	case 3:
    916		val |= ENET_SERDES_PLL_HRATE3;
    917		break;
    918	default:
    919		return -EINVAL;
    920	}
    921	nw64(ENET_SERDES_1_PLL_CFG, val);
    922
    923	return 0;
    924}
    925
    926static int serdes_init_1g_serdes(struct niu *np)
    927{
    928	struct niu_link_config *lp = &np->link_config;
    929	unsigned long ctrl_reg, test_cfg_reg, pll_cfg, i;
    930	u64 ctrl_val, test_cfg_val, sig, mask, val;
    931	int err;
    932	u64 reset_val, val_rd;
    933
    934	val = ENET_SERDES_PLL_HRATE0 | ENET_SERDES_PLL_HRATE1 |
    935		ENET_SERDES_PLL_HRATE2 | ENET_SERDES_PLL_HRATE3 |
    936		ENET_SERDES_PLL_FBDIV0;
    937	switch (np->port) {
    938	case 0:
    939		reset_val =  ENET_SERDES_RESET_0;
    940		ctrl_reg = ENET_SERDES_0_CTRL_CFG;
    941		test_cfg_reg = ENET_SERDES_0_TEST_CFG;
    942		pll_cfg = ENET_SERDES_0_PLL_CFG;
    943		break;
    944	case 1:
    945		reset_val =  ENET_SERDES_RESET_1;
    946		ctrl_reg = ENET_SERDES_1_CTRL_CFG;
    947		test_cfg_reg = ENET_SERDES_1_TEST_CFG;
    948		pll_cfg = ENET_SERDES_1_PLL_CFG;
    949		break;
    950
    951	default:
    952		return -EINVAL;
    953	}
    954	ctrl_val = (ENET_SERDES_CTRL_SDET_0 |
    955		    ENET_SERDES_CTRL_SDET_1 |
    956		    ENET_SERDES_CTRL_SDET_2 |
    957		    ENET_SERDES_CTRL_SDET_3 |
    958		    (0x5 << ENET_SERDES_CTRL_EMPH_0_SHIFT) |
    959		    (0x5 << ENET_SERDES_CTRL_EMPH_1_SHIFT) |
    960		    (0x5 << ENET_SERDES_CTRL_EMPH_2_SHIFT) |
    961		    (0x5 << ENET_SERDES_CTRL_EMPH_3_SHIFT) |
    962		    (0x1 << ENET_SERDES_CTRL_LADJ_0_SHIFT) |
    963		    (0x1 << ENET_SERDES_CTRL_LADJ_1_SHIFT) |
    964		    (0x1 << ENET_SERDES_CTRL_LADJ_2_SHIFT) |
    965		    (0x1 << ENET_SERDES_CTRL_LADJ_3_SHIFT));
    966	test_cfg_val = 0;
    967
    968	if (lp->loopback_mode == LOOPBACK_PHY) {
    969		test_cfg_val |= ((ENET_TEST_MD_PAD_LOOPBACK <<
    970				  ENET_SERDES_TEST_MD_0_SHIFT) |
    971				 (ENET_TEST_MD_PAD_LOOPBACK <<
    972				  ENET_SERDES_TEST_MD_1_SHIFT) |
    973				 (ENET_TEST_MD_PAD_LOOPBACK <<
    974				  ENET_SERDES_TEST_MD_2_SHIFT) |
    975				 (ENET_TEST_MD_PAD_LOOPBACK <<
    976				  ENET_SERDES_TEST_MD_3_SHIFT));
    977	}
    978
    979	nw64(ENET_SERDES_RESET, reset_val);
    980	mdelay(20);
    981	val_rd = nr64(ENET_SERDES_RESET);
    982	val_rd &= ~reset_val;
    983	nw64(pll_cfg, val);
    984	nw64(ctrl_reg, ctrl_val);
    985	nw64(test_cfg_reg, test_cfg_val);
    986	nw64(ENET_SERDES_RESET, val_rd);
    987	mdelay(2000);
    988
    989	/* Initialize all 4 lanes of the SERDES.  */
    990	for (i = 0; i < 4; i++) {
    991		u32 rxtx_ctrl, glue0;
    992
    993		err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl);
    994		if (err)
    995			return err;
    996		err = esr_read_glue0(np, i, &glue0);
    997		if (err)
    998			return err;
    999
   1000		rxtx_ctrl &= ~(ESR_RXTX_CTRL_VMUXLO);
   1001		rxtx_ctrl |= (ESR_RXTX_CTRL_ENSTRETCH |
   1002			      (2 << ESR_RXTX_CTRL_VMUXLO_SHIFT));
   1003
   1004		glue0 &= ~(ESR_GLUE_CTRL0_SRATE |
   1005			   ESR_GLUE_CTRL0_THCNT |
   1006			   ESR_GLUE_CTRL0_BLTIME);
   1007		glue0 |= (ESR_GLUE_CTRL0_RXLOSENAB |
   1008			  (0xf << ESR_GLUE_CTRL0_SRATE_SHIFT) |
   1009			  (0xff << ESR_GLUE_CTRL0_THCNT_SHIFT) |
   1010			  (BLTIME_300_CYCLES <<
   1011			   ESR_GLUE_CTRL0_BLTIME_SHIFT));
   1012
   1013		err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl);
   1014		if (err)
   1015			return err;
   1016		err = esr_write_glue0(np, i, glue0);
   1017		if (err)
   1018			return err;
   1019	}
   1020
   1021
   1022	sig = nr64(ESR_INT_SIGNALS);
   1023	switch (np->port) {
   1024	case 0:
   1025		val = (ESR_INT_SRDY0_P0 | ESR_INT_DET0_P0);
   1026		mask = val;
   1027		break;
   1028
   1029	case 1:
   1030		val = (ESR_INT_SRDY0_P1 | ESR_INT_DET0_P1);
   1031		mask = val;
   1032		break;
   1033
   1034	default:
   1035		return -EINVAL;
   1036	}
   1037
   1038	if ((sig & mask) != val) {
   1039		netdev_err(np->dev, "Port %u signal bits [%08x] are not [%08x]\n",
   1040			   np->port, (int)(sig & mask), (int)val);
   1041		return -ENODEV;
   1042	}
   1043
   1044	return 0;
   1045}
   1046
   1047static int link_status_1g_serdes(struct niu *np, int *link_up_p)
   1048{
   1049	struct niu_link_config *lp = &np->link_config;
   1050	int link_up;
   1051	u64 val;
   1052	u16 current_speed;
   1053	unsigned long flags;
   1054	u8 current_duplex;
   1055
   1056	link_up = 0;
   1057	current_speed = SPEED_INVALID;
   1058	current_duplex = DUPLEX_INVALID;
   1059
   1060	spin_lock_irqsave(&np->lock, flags);
   1061
   1062	val = nr64_pcs(PCS_MII_STAT);
   1063
   1064	if (val & PCS_MII_STAT_LINK_STATUS) {
   1065		link_up = 1;
   1066		current_speed = SPEED_1000;
   1067		current_duplex = DUPLEX_FULL;
   1068	}
   1069
   1070	lp->active_speed = current_speed;
   1071	lp->active_duplex = current_duplex;
   1072	spin_unlock_irqrestore(&np->lock, flags);
   1073
   1074	*link_up_p = link_up;
   1075	return 0;
   1076}
   1077
   1078static int link_status_10g_serdes(struct niu *np, int *link_up_p)
   1079{
   1080	unsigned long flags;
   1081	struct niu_link_config *lp = &np->link_config;
   1082	int link_up = 0;
   1083	int link_ok = 1;
   1084	u64 val, val2;
   1085	u16 current_speed;
   1086	u8 current_duplex;
   1087
   1088	if (!(np->flags & NIU_FLAGS_10G))
   1089		return link_status_1g_serdes(np, link_up_p);
   1090
   1091	current_speed = SPEED_INVALID;
   1092	current_duplex = DUPLEX_INVALID;
   1093	spin_lock_irqsave(&np->lock, flags);
   1094
   1095	val = nr64_xpcs(XPCS_STATUS(0));
   1096	val2 = nr64_mac(XMAC_INTER2);
   1097	if (val2 & 0x01000000)
   1098		link_ok = 0;
   1099
   1100	if ((val & 0x1000ULL) && link_ok) {
   1101		link_up = 1;
   1102		current_speed = SPEED_10000;
   1103		current_duplex = DUPLEX_FULL;
   1104	}
   1105	lp->active_speed = current_speed;
   1106	lp->active_duplex = current_duplex;
   1107	spin_unlock_irqrestore(&np->lock, flags);
   1108	*link_up_p = link_up;
   1109	return 0;
   1110}
   1111
   1112static int link_status_mii(struct niu *np, int *link_up_p)
   1113{
   1114	struct niu_link_config *lp = &np->link_config;
   1115	int err;
   1116	int bmsr, advert, ctrl1000, stat1000, lpa, bmcr, estatus;
   1117	int supported, advertising, active_speed, active_duplex;
   1118
   1119	err = mii_read(np, np->phy_addr, MII_BMCR);
   1120	if (unlikely(err < 0))
   1121		return err;
   1122	bmcr = err;
   1123
   1124	err = mii_read(np, np->phy_addr, MII_BMSR);
   1125	if (unlikely(err < 0))
   1126		return err;
   1127	bmsr = err;
   1128
   1129	err = mii_read(np, np->phy_addr, MII_ADVERTISE);
   1130	if (unlikely(err < 0))
   1131		return err;
   1132	advert = err;
   1133
   1134	err = mii_read(np, np->phy_addr, MII_LPA);
   1135	if (unlikely(err < 0))
   1136		return err;
   1137	lpa = err;
   1138
   1139	if (likely(bmsr & BMSR_ESTATEN)) {
   1140		err = mii_read(np, np->phy_addr, MII_ESTATUS);
   1141		if (unlikely(err < 0))
   1142			return err;
   1143		estatus = err;
   1144
   1145		err = mii_read(np, np->phy_addr, MII_CTRL1000);
   1146		if (unlikely(err < 0))
   1147			return err;
   1148		ctrl1000 = err;
   1149
   1150		err = mii_read(np, np->phy_addr, MII_STAT1000);
   1151		if (unlikely(err < 0))
   1152			return err;
   1153		stat1000 = err;
   1154	} else
   1155		estatus = ctrl1000 = stat1000 = 0;
   1156
   1157	supported = 0;
   1158	if (bmsr & BMSR_ANEGCAPABLE)
   1159		supported |= SUPPORTED_Autoneg;
   1160	if (bmsr & BMSR_10HALF)
   1161		supported |= SUPPORTED_10baseT_Half;
   1162	if (bmsr & BMSR_10FULL)
   1163		supported |= SUPPORTED_10baseT_Full;
   1164	if (bmsr & BMSR_100HALF)
   1165		supported |= SUPPORTED_100baseT_Half;
   1166	if (bmsr & BMSR_100FULL)
   1167		supported |= SUPPORTED_100baseT_Full;
   1168	if (estatus & ESTATUS_1000_THALF)
   1169		supported |= SUPPORTED_1000baseT_Half;
   1170	if (estatus & ESTATUS_1000_TFULL)
   1171		supported |= SUPPORTED_1000baseT_Full;
   1172	lp->supported = supported;
   1173
   1174	advertising = mii_adv_to_ethtool_adv_t(advert);
   1175	advertising |= mii_ctrl1000_to_ethtool_adv_t(ctrl1000);
   1176
   1177	if (bmcr & BMCR_ANENABLE) {
   1178		int neg, neg1000;
   1179
   1180		lp->active_autoneg = 1;
   1181		advertising |= ADVERTISED_Autoneg;
   1182
   1183		neg = advert & lpa;
   1184		neg1000 = (ctrl1000 << 2) & stat1000;
   1185
   1186		if (neg1000 & (LPA_1000FULL | LPA_1000HALF))
   1187			active_speed = SPEED_1000;
   1188		else if (neg & LPA_100)
   1189			active_speed = SPEED_100;
   1190		else if (neg & (LPA_10HALF | LPA_10FULL))
   1191			active_speed = SPEED_10;
   1192		else
   1193			active_speed = SPEED_INVALID;
   1194
   1195		if ((neg1000 & LPA_1000FULL) || (neg & LPA_DUPLEX))
   1196			active_duplex = DUPLEX_FULL;
   1197		else if (active_speed != SPEED_INVALID)
   1198			active_duplex = DUPLEX_HALF;
   1199		else
   1200			active_duplex = DUPLEX_INVALID;
   1201	} else {
   1202		lp->active_autoneg = 0;
   1203
   1204		if ((bmcr & BMCR_SPEED1000) && !(bmcr & BMCR_SPEED100))
   1205			active_speed = SPEED_1000;
   1206		else if (bmcr & BMCR_SPEED100)
   1207			active_speed = SPEED_100;
   1208		else
   1209			active_speed = SPEED_10;
   1210
   1211		if (bmcr & BMCR_FULLDPLX)
   1212			active_duplex = DUPLEX_FULL;
   1213		else
   1214			active_duplex = DUPLEX_HALF;
   1215	}
   1216
   1217	lp->active_advertising = advertising;
   1218	lp->active_speed = active_speed;
   1219	lp->active_duplex = active_duplex;
   1220	*link_up_p = !!(bmsr & BMSR_LSTATUS);
   1221
   1222	return 0;
   1223}
   1224
   1225static int link_status_1g_rgmii(struct niu *np, int *link_up_p)
   1226{
   1227	struct niu_link_config *lp = &np->link_config;
   1228	u16 current_speed, bmsr;
   1229	unsigned long flags;
   1230	u8 current_duplex;
   1231	int err, link_up;
   1232
   1233	link_up = 0;
   1234	current_speed = SPEED_INVALID;
   1235	current_duplex = DUPLEX_INVALID;
   1236
   1237	spin_lock_irqsave(&np->lock, flags);
   1238
   1239	err = mii_read(np, np->phy_addr, MII_BMSR);
   1240	if (err < 0)
   1241		goto out;
   1242
   1243	bmsr = err;
   1244	if (bmsr & BMSR_LSTATUS) {
   1245		link_up = 1;
   1246		current_speed = SPEED_1000;
   1247		current_duplex = DUPLEX_FULL;
   1248	}
   1249	lp->active_speed = current_speed;
   1250	lp->active_duplex = current_duplex;
   1251	err = 0;
   1252
   1253out:
   1254	spin_unlock_irqrestore(&np->lock, flags);
   1255
   1256	*link_up_p = link_up;
   1257	return err;
   1258}
   1259
   1260static int link_status_1g(struct niu *np, int *link_up_p)
   1261{
   1262	struct niu_link_config *lp = &np->link_config;
   1263	unsigned long flags;
   1264	int err;
   1265
   1266	spin_lock_irqsave(&np->lock, flags);
   1267
   1268	err = link_status_mii(np, link_up_p);
   1269	lp->supported |= SUPPORTED_TP;
   1270	lp->active_advertising |= ADVERTISED_TP;
   1271
   1272	spin_unlock_irqrestore(&np->lock, flags);
   1273	return err;
   1274}
   1275
   1276static int bcm8704_reset(struct niu *np)
   1277{
   1278	int err, limit;
   1279
   1280	err = mdio_read(np, np->phy_addr,
   1281			BCM8704_PHYXS_DEV_ADDR, MII_BMCR);
   1282	if (err < 0 || err == 0xffff)
   1283		return err;
   1284	err |= BMCR_RESET;
   1285	err = mdio_write(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR,
   1286			 MII_BMCR, err);
   1287	if (err)
   1288		return err;
   1289
   1290	limit = 1000;
   1291	while (--limit >= 0) {
   1292		err = mdio_read(np, np->phy_addr,
   1293				BCM8704_PHYXS_DEV_ADDR, MII_BMCR);
   1294		if (err < 0)
   1295			return err;
   1296		if (!(err & BMCR_RESET))
   1297			break;
   1298	}
   1299	if (limit < 0) {
   1300		netdev_err(np->dev, "Port %u PHY will not reset (bmcr=%04x)\n",
   1301			   np->port, (err & 0xffff));
   1302		return -ENODEV;
   1303	}
   1304	return 0;
   1305}
   1306
   1307/* When written, certain PHY registers need to be read back twice
   1308 * in order for the bits to settle properly.
   1309 */
   1310static int bcm8704_user_dev3_readback(struct niu *np, int reg)
   1311{
   1312	int err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, reg);
   1313	if (err < 0)
   1314		return err;
   1315	err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, reg);
   1316	if (err < 0)
   1317		return err;
   1318	return 0;
   1319}
   1320
   1321static int bcm8706_init_user_dev3(struct niu *np)
   1322{
   1323	int err;
   1324
   1325
   1326	err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
   1327			BCM8704_USER_OPT_DIGITAL_CTRL);
   1328	if (err < 0)
   1329		return err;
   1330	err &= ~USER_ODIG_CTRL_GPIOS;
   1331	err |= (0x3 << USER_ODIG_CTRL_GPIOS_SHIFT);
   1332	err |=  USER_ODIG_CTRL_RESV2;
   1333	err = mdio_write(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
   1334			 BCM8704_USER_OPT_DIGITAL_CTRL, err);
   1335	if (err)
   1336		return err;
   1337
   1338	mdelay(1000);
   1339
   1340	return 0;
   1341}
   1342
   1343static int bcm8704_init_user_dev3(struct niu *np)
   1344{
   1345	int err;
   1346
   1347	err = mdio_write(np, np->phy_addr,
   1348			 BCM8704_USER_DEV3_ADDR, BCM8704_USER_CONTROL,
   1349			 (USER_CONTROL_OPTXRST_LVL |
   1350			  USER_CONTROL_OPBIASFLT_LVL |
   1351			  USER_CONTROL_OBTMPFLT_LVL |
   1352			  USER_CONTROL_OPPRFLT_LVL |
   1353			  USER_CONTROL_OPTXFLT_LVL |
   1354			  USER_CONTROL_OPRXLOS_LVL |
   1355			  USER_CONTROL_OPRXFLT_LVL |
   1356			  USER_CONTROL_OPTXON_LVL |
   1357			  (0x3f << USER_CONTROL_RES1_SHIFT)));
   1358	if (err)
   1359		return err;
   1360
   1361	err = mdio_write(np, np->phy_addr,
   1362			 BCM8704_USER_DEV3_ADDR, BCM8704_USER_PMD_TX_CONTROL,
   1363			 (USER_PMD_TX_CTL_XFP_CLKEN |
   1364			  (1 << USER_PMD_TX_CTL_TX_DAC_TXD_SH) |
   1365			  (2 << USER_PMD_TX_CTL_TX_DAC_TXCK_SH) |
   1366			  USER_PMD_TX_CTL_TSCK_LPWREN));
   1367	if (err)
   1368		return err;
   1369
   1370	err = bcm8704_user_dev3_readback(np, BCM8704_USER_CONTROL);
   1371	if (err)
   1372		return err;
   1373	err = bcm8704_user_dev3_readback(np, BCM8704_USER_PMD_TX_CONTROL);
   1374	if (err)
   1375		return err;
   1376
   1377	err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
   1378			BCM8704_USER_OPT_DIGITAL_CTRL);
   1379	if (err < 0)
   1380		return err;
   1381	err &= ~USER_ODIG_CTRL_GPIOS;
   1382	err |= (0x3 << USER_ODIG_CTRL_GPIOS_SHIFT);
   1383	err = mdio_write(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
   1384			 BCM8704_USER_OPT_DIGITAL_CTRL, err);
   1385	if (err)
   1386		return err;
   1387
   1388	mdelay(1000);
   1389
   1390	return 0;
   1391}
   1392
   1393static int mrvl88x2011_act_led(struct niu *np, int val)
   1394{
   1395	int	err;
   1396
   1397	err  = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
   1398		MRVL88X2011_LED_8_TO_11_CTL);
   1399	if (err < 0)
   1400		return err;
   1401
   1402	err &= ~MRVL88X2011_LED(MRVL88X2011_LED_ACT,MRVL88X2011_LED_CTL_MASK);
   1403	err |=  MRVL88X2011_LED(MRVL88X2011_LED_ACT,val);
   1404
   1405	return mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
   1406			  MRVL88X2011_LED_8_TO_11_CTL, err);
   1407}
   1408
   1409static int mrvl88x2011_led_blink_rate(struct niu *np, int rate)
   1410{
   1411	int	err;
   1412
   1413	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
   1414			MRVL88X2011_LED_BLINK_CTL);
   1415	if (err >= 0) {
   1416		err &= ~MRVL88X2011_LED_BLKRATE_MASK;
   1417		err |= (rate << 4);
   1418
   1419		err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
   1420				 MRVL88X2011_LED_BLINK_CTL, err);
   1421	}
   1422
   1423	return err;
   1424}
   1425
   1426static int xcvr_init_10g_mrvl88x2011(struct niu *np)
   1427{
   1428	int	err;
   1429
   1430	/* Set LED functions */
   1431	err = mrvl88x2011_led_blink_rate(np, MRVL88X2011_LED_BLKRATE_134MS);
   1432	if (err)
   1433		return err;
   1434
   1435	/* led activity */
   1436	err = mrvl88x2011_act_led(np, MRVL88X2011_LED_CTL_OFF);
   1437	if (err)
   1438		return err;
   1439
   1440	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
   1441			MRVL88X2011_GENERAL_CTL);
   1442	if (err < 0)
   1443		return err;
   1444
   1445	err |= MRVL88X2011_ENA_XFPREFCLK;
   1446
   1447	err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
   1448			 MRVL88X2011_GENERAL_CTL, err);
   1449	if (err < 0)
   1450		return err;
   1451
   1452	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
   1453			MRVL88X2011_PMA_PMD_CTL_1);
   1454	if (err < 0)
   1455		return err;
   1456
   1457	if (np->link_config.loopback_mode == LOOPBACK_MAC)
   1458		err |= MRVL88X2011_LOOPBACK;
   1459	else
   1460		err &= ~MRVL88X2011_LOOPBACK;
   1461
   1462	err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
   1463			 MRVL88X2011_PMA_PMD_CTL_1, err);
   1464	if (err < 0)
   1465		return err;
   1466
   1467	/* Enable PMD  */
   1468	return mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
   1469			  MRVL88X2011_10G_PMD_TX_DIS, MRVL88X2011_ENA_PMDTX);
   1470}
   1471
   1472
   1473static int xcvr_diag_bcm870x(struct niu *np)
   1474{
   1475	u16 analog_stat0, tx_alarm_status;
   1476	int err = 0;
   1477
   1478#if 1
   1479	err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR,
   1480			MII_STAT1000);
   1481	if (err < 0)
   1482		return err;
   1483	pr_info("Port %u PMA_PMD(MII_STAT1000) [%04x]\n", np->port, err);
   1484
   1485	err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, 0x20);
   1486	if (err < 0)
   1487		return err;
   1488	pr_info("Port %u USER_DEV3(0x20) [%04x]\n", np->port, err);
   1489
   1490	err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR,
   1491			MII_NWAYTEST);
   1492	if (err < 0)
   1493		return err;
   1494	pr_info("Port %u PHYXS(MII_NWAYTEST) [%04x]\n", np->port, err);
   1495#endif
   1496
   1497	/* XXX dig this out it might not be so useful XXX */
   1498	err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
   1499			BCM8704_USER_ANALOG_STATUS0);
   1500	if (err < 0)
   1501		return err;
   1502	err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
   1503			BCM8704_USER_ANALOG_STATUS0);
   1504	if (err < 0)
   1505		return err;
   1506	analog_stat0 = err;
   1507
   1508	err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
   1509			BCM8704_USER_TX_ALARM_STATUS);
   1510	if (err < 0)
   1511		return err;
   1512	err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
   1513			BCM8704_USER_TX_ALARM_STATUS);
   1514	if (err < 0)
   1515		return err;
   1516	tx_alarm_status = err;
   1517
   1518	if (analog_stat0 != 0x03fc) {
   1519		if ((analog_stat0 == 0x43bc) && (tx_alarm_status != 0)) {
   1520			pr_info("Port %u cable not connected or bad cable\n",
   1521				np->port);
   1522		} else if (analog_stat0 == 0x639c) {
   1523			pr_info("Port %u optical module is bad or missing\n",
   1524				np->port);
   1525		}
   1526	}
   1527
   1528	return 0;
   1529}
   1530
   1531static int xcvr_10g_set_lb_bcm870x(struct niu *np)
   1532{
   1533	struct niu_link_config *lp = &np->link_config;
   1534	int err;
   1535
   1536	err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR,
   1537			MII_BMCR);
   1538	if (err < 0)
   1539		return err;
   1540
   1541	err &= ~BMCR_LOOPBACK;
   1542
   1543	if (lp->loopback_mode == LOOPBACK_MAC)
   1544		err |= BMCR_LOOPBACK;
   1545
   1546	err = mdio_write(np, np->phy_addr, BCM8704_PCS_DEV_ADDR,
   1547			 MII_BMCR, err);
   1548	if (err)
   1549		return err;
   1550
   1551	return 0;
   1552}
   1553
   1554static int xcvr_init_10g_bcm8706(struct niu *np)
   1555{
   1556	int err = 0;
   1557	u64 val;
   1558
   1559	if ((np->flags & NIU_FLAGS_HOTPLUG_PHY) &&
   1560	    (np->flags & NIU_FLAGS_HOTPLUG_PHY_PRESENT) == 0)
   1561			return err;
   1562
   1563	val = nr64_mac(XMAC_CONFIG);
   1564	val &= ~XMAC_CONFIG_LED_POLARITY;
   1565	val |= XMAC_CONFIG_FORCE_LED_ON;
   1566	nw64_mac(XMAC_CONFIG, val);
   1567
   1568	val = nr64(MIF_CONFIG);
   1569	val |= MIF_CONFIG_INDIRECT_MODE;
   1570	nw64(MIF_CONFIG, val);
   1571
   1572	err = bcm8704_reset(np);
   1573	if (err)
   1574		return err;
   1575
   1576	err = xcvr_10g_set_lb_bcm870x(np);
   1577	if (err)
   1578		return err;
   1579
   1580	err = bcm8706_init_user_dev3(np);
   1581	if (err)
   1582		return err;
   1583
   1584	err = xcvr_diag_bcm870x(np);
   1585	if (err)
   1586		return err;
   1587
   1588	return 0;
   1589}
   1590
   1591static int xcvr_init_10g_bcm8704(struct niu *np)
   1592{
   1593	int err;
   1594
   1595	err = bcm8704_reset(np);
   1596	if (err)
   1597		return err;
   1598
   1599	err = bcm8704_init_user_dev3(np);
   1600	if (err)
   1601		return err;
   1602
   1603	err = xcvr_10g_set_lb_bcm870x(np);
   1604	if (err)
   1605		return err;
   1606
   1607	err =  xcvr_diag_bcm870x(np);
   1608	if (err)
   1609		return err;
   1610
   1611	return 0;
   1612}
   1613
   1614static int xcvr_init_10g(struct niu *np)
   1615{
   1616	int phy_id, err;
   1617	u64 val;
   1618
   1619	val = nr64_mac(XMAC_CONFIG);
   1620	val &= ~XMAC_CONFIG_LED_POLARITY;
   1621	val |= XMAC_CONFIG_FORCE_LED_ON;
   1622	nw64_mac(XMAC_CONFIG, val);
   1623
   1624	/* XXX shared resource, lock parent XXX */
   1625	val = nr64(MIF_CONFIG);
   1626	val |= MIF_CONFIG_INDIRECT_MODE;
   1627	nw64(MIF_CONFIG, val);
   1628
   1629	phy_id = phy_decode(np->parent->port_phy, np->port);
   1630	phy_id = np->parent->phy_probe_info.phy_id[phy_id][np->port];
   1631
   1632	/* handle different phy types */
   1633	switch (phy_id & NIU_PHY_ID_MASK) {
   1634	case NIU_PHY_ID_MRVL88X2011:
   1635		err = xcvr_init_10g_mrvl88x2011(np);
   1636		break;
   1637
   1638	default: /* bcom 8704 */
   1639		err = xcvr_init_10g_bcm8704(np);
   1640		break;
   1641	}
   1642
   1643	return err;
   1644}
   1645
   1646static int mii_reset(struct niu *np)
   1647{
   1648	int limit, err;
   1649
   1650	err = mii_write(np, np->phy_addr, MII_BMCR, BMCR_RESET);
   1651	if (err)
   1652		return err;
   1653
   1654	limit = 1000;
   1655	while (--limit >= 0) {
   1656		udelay(500);
   1657		err = mii_read(np, np->phy_addr, MII_BMCR);
   1658		if (err < 0)
   1659			return err;
   1660		if (!(err & BMCR_RESET))
   1661			break;
   1662	}
   1663	if (limit < 0) {
   1664		netdev_err(np->dev, "Port %u MII would not reset, bmcr[%04x]\n",
   1665			   np->port, err);
   1666		return -ENODEV;
   1667	}
   1668
   1669	return 0;
   1670}
   1671
   1672static int xcvr_init_1g_rgmii(struct niu *np)
   1673{
   1674	int err;
   1675	u64 val;
   1676	u16 bmcr, bmsr, estat;
   1677
   1678	val = nr64(MIF_CONFIG);
   1679	val &= ~MIF_CONFIG_INDIRECT_MODE;
   1680	nw64(MIF_CONFIG, val);
   1681
   1682	err = mii_reset(np);
   1683	if (err)
   1684		return err;
   1685
   1686	err = mii_read(np, np->phy_addr, MII_BMSR);
   1687	if (err < 0)
   1688		return err;
   1689	bmsr = err;
   1690
   1691	estat = 0;
   1692	if (bmsr & BMSR_ESTATEN) {
   1693		err = mii_read(np, np->phy_addr, MII_ESTATUS);
   1694		if (err < 0)
   1695			return err;
   1696		estat = err;
   1697	}
   1698
   1699	bmcr = 0;
   1700	err = mii_write(np, np->phy_addr, MII_BMCR, bmcr);
   1701	if (err)
   1702		return err;
   1703
   1704	if (bmsr & BMSR_ESTATEN) {
   1705		u16 ctrl1000 = 0;
   1706
   1707		if (estat & ESTATUS_1000_TFULL)
   1708			ctrl1000 |= ADVERTISE_1000FULL;
   1709		err = mii_write(np, np->phy_addr, MII_CTRL1000, ctrl1000);
   1710		if (err)
   1711			return err;
   1712	}
   1713
   1714	bmcr = (BMCR_SPEED1000 | BMCR_FULLDPLX);
   1715
   1716	err = mii_write(np, np->phy_addr, MII_BMCR, bmcr);
   1717	if (err)
   1718		return err;
   1719
   1720	err = mii_read(np, np->phy_addr, MII_BMCR);
   1721	if (err < 0)
   1722		return err;
   1723	bmcr = mii_read(np, np->phy_addr, MII_BMCR);
   1724
   1725	err = mii_read(np, np->phy_addr, MII_BMSR);
   1726	if (err < 0)
   1727		return err;
   1728
   1729	return 0;
   1730}
   1731
   1732static int mii_init_common(struct niu *np)
   1733{
   1734	struct niu_link_config *lp = &np->link_config;
   1735	u16 bmcr, bmsr, adv, estat;
   1736	int err;
   1737
   1738	err = mii_reset(np);
   1739	if (err)
   1740		return err;
   1741
   1742	err = mii_read(np, np->phy_addr, MII_BMSR);
   1743	if (err < 0)
   1744		return err;
   1745	bmsr = err;
   1746
   1747	estat = 0;
   1748	if (bmsr & BMSR_ESTATEN) {
   1749		err = mii_read(np, np->phy_addr, MII_ESTATUS);
   1750		if (err < 0)
   1751			return err;
   1752		estat = err;
   1753	}
   1754
   1755	bmcr = 0;
   1756	err = mii_write(np, np->phy_addr, MII_BMCR, bmcr);
   1757	if (err)
   1758		return err;
   1759
   1760	if (lp->loopback_mode == LOOPBACK_MAC) {
   1761		bmcr |= BMCR_LOOPBACK;
   1762		if (lp->active_speed == SPEED_1000)
   1763			bmcr |= BMCR_SPEED1000;
   1764		if (lp->active_duplex == DUPLEX_FULL)
   1765			bmcr |= BMCR_FULLDPLX;
   1766	}
   1767
   1768	if (lp->loopback_mode == LOOPBACK_PHY) {
   1769		u16 aux;
   1770
   1771		aux = (BCM5464R_AUX_CTL_EXT_LB |
   1772		       BCM5464R_AUX_CTL_WRITE_1);
   1773		err = mii_write(np, np->phy_addr, BCM5464R_AUX_CTL, aux);
   1774		if (err)
   1775			return err;
   1776	}
   1777
   1778	if (lp->autoneg) {
   1779		u16 ctrl1000;
   1780
   1781		adv = ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP;
   1782		if ((bmsr & BMSR_10HALF) &&
   1783			(lp->advertising & ADVERTISED_10baseT_Half))
   1784			adv |= ADVERTISE_10HALF;
   1785		if ((bmsr & BMSR_10FULL) &&
   1786			(lp->advertising & ADVERTISED_10baseT_Full))
   1787			adv |= ADVERTISE_10FULL;
   1788		if ((bmsr & BMSR_100HALF) &&
   1789			(lp->advertising & ADVERTISED_100baseT_Half))
   1790			adv |= ADVERTISE_100HALF;
   1791		if ((bmsr & BMSR_100FULL) &&
   1792			(lp->advertising & ADVERTISED_100baseT_Full))
   1793			adv |= ADVERTISE_100FULL;
   1794		err = mii_write(np, np->phy_addr, MII_ADVERTISE, adv);
   1795		if (err)
   1796			return err;
   1797
   1798		if (likely(bmsr & BMSR_ESTATEN)) {
   1799			ctrl1000 = 0;
   1800			if ((estat & ESTATUS_1000_THALF) &&
   1801				(lp->advertising & ADVERTISED_1000baseT_Half))
   1802				ctrl1000 |= ADVERTISE_1000HALF;
   1803			if ((estat & ESTATUS_1000_TFULL) &&
   1804				(lp->advertising & ADVERTISED_1000baseT_Full))
   1805				ctrl1000 |= ADVERTISE_1000FULL;
   1806			err = mii_write(np, np->phy_addr,
   1807					MII_CTRL1000, ctrl1000);
   1808			if (err)
   1809				return err;
   1810		}
   1811
   1812		bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART);
   1813	} else {
   1814		/* !lp->autoneg */
   1815		int fulldpx;
   1816
   1817		if (lp->duplex == DUPLEX_FULL) {
   1818			bmcr |= BMCR_FULLDPLX;
   1819			fulldpx = 1;
   1820		} else if (lp->duplex == DUPLEX_HALF)
   1821			fulldpx = 0;
   1822		else
   1823			return -EINVAL;
   1824
   1825		if (lp->speed == SPEED_1000) {
   1826			/* if X-full requested while not supported, or
   1827			   X-half requested while not supported... */
   1828			if ((fulldpx && !(estat & ESTATUS_1000_TFULL)) ||
   1829				(!fulldpx && !(estat & ESTATUS_1000_THALF)))
   1830				return -EINVAL;
   1831			bmcr |= BMCR_SPEED1000;
   1832		} else if (lp->speed == SPEED_100) {
   1833			if ((fulldpx && !(bmsr & BMSR_100FULL)) ||
   1834				(!fulldpx && !(bmsr & BMSR_100HALF)))
   1835				return -EINVAL;
   1836			bmcr |= BMCR_SPEED100;
   1837		} else if (lp->speed == SPEED_10) {
   1838			if ((fulldpx && !(bmsr & BMSR_10FULL)) ||
   1839				(!fulldpx && !(bmsr & BMSR_10HALF)))
   1840				return -EINVAL;
   1841		} else
   1842			return -EINVAL;
   1843	}
   1844
   1845	err = mii_write(np, np->phy_addr, MII_BMCR, bmcr);
   1846	if (err)
   1847		return err;
   1848
   1849#if 0
   1850	err = mii_read(np, np->phy_addr, MII_BMCR);
   1851	if (err < 0)
   1852		return err;
   1853	bmcr = err;
   1854
   1855	err = mii_read(np, np->phy_addr, MII_BMSR);
   1856	if (err < 0)
   1857		return err;
   1858	bmsr = err;
   1859
   1860	pr_info("Port %u after MII init bmcr[%04x] bmsr[%04x]\n",
   1861		np->port, bmcr, bmsr);
   1862#endif
   1863
   1864	return 0;
   1865}
   1866
   1867static int xcvr_init_1g(struct niu *np)
   1868{
   1869	u64 val;
   1870
   1871	/* XXX shared resource, lock parent XXX */
   1872	val = nr64(MIF_CONFIG);
   1873	val &= ~MIF_CONFIG_INDIRECT_MODE;
   1874	nw64(MIF_CONFIG, val);
   1875
   1876	return mii_init_common(np);
   1877}
   1878
   1879static int niu_xcvr_init(struct niu *np)
   1880{
   1881	const struct niu_phy_ops *ops = np->phy_ops;
   1882	int err;
   1883
   1884	err = 0;
   1885	if (ops->xcvr_init)
   1886		err = ops->xcvr_init(np);
   1887
   1888	return err;
   1889}
   1890
   1891static int niu_serdes_init(struct niu *np)
   1892{
   1893	const struct niu_phy_ops *ops = np->phy_ops;
   1894	int err;
   1895
   1896	err = 0;
   1897	if (ops->serdes_init)
   1898		err = ops->serdes_init(np);
   1899
   1900	return err;
   1901}
   1902
   1903static void niu_init_xif(struct niu *);
   1904static void niu_handle_led(struct niu *, int status);
   1905
   1906static int niu_link_status_common(struct niu *np, int link_up)
   1907{
   1908	struct niu_link_config *lp = &np->link_config;
   1909	struct net_device *dev = np->dev;
   1910	unsigned long flags;
   1911
   1912	if (!netif_carrier_ok(dev) && link_up) {
   1913		netif_info(np, link, dev, "Link is up at %s, %s duplex\n",
   1914			   lp->active_speed == SPEED_10000 ? "10Gb/sec" :
   1915			   lp->active_speed == SPEED_1000 ? "1Gb/sec" :
   1916			   lp->active_speed == SPEED_100 ? "100Mbit/sec" :
   1917			   "10Mbit/sec",
   1918			   lp->active_duplex == DUPLEX_FULL ? "full" : "half");
   1919
   1920		spin_lock_irqsave(&np->lock, flags);
   1921		niu_init_xif(np);
   1922		niu_handle_led(np, 1);
   1923		spin_unlock_irqrestore(&np->lock, flags);
   1924
   1925		netif_carrier_on(dev);
   1926	} else if (netif_carrier_ok(dev) && !link_up) {
   1927		netif_warn(np, link, dev, "Link is down\n");
   1928		spin_lock_irqsave(&np->lock, flags);
   1929		niu_handle_led(np, 0);
   1930		spin_unlock_irqrestore(&np->lock, flags);
   1931		netif_carrier_off(dev);
   1932	}
   1933
   1934	return 0;
   1935}
   1936
   1937static int link_status_10g_mrvl(struct niu *np, int *link_up_p)
   1938{
   1939	int err, link_up, pma_status, pcs_status;
   1940
   1941	link_up = 0;
   1942
   1943	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
   1944			MRVL88X2011_10G_PMD_STATUS_2);
   1945	if (err < 0)
   1946		goto out;
   1947
   1948	/* Check PMA/PMD Register: 1.0001.2 == 1 */
   1949	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
   1950			MRVL88X2011_PMA_PMD_STATUS_1);
   1951	if (err < 0)
   1952		goto out;
   1953
   1954	pma_status = ((err & MRVL88X2011_LNK_STATUS_OK) ? 1 : 0);
   1955
   1956        /* Check PMC Register : 3.0001.2 == 1: read twice */
   1957	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
   1958			MRVL88X2011_PMA_PMD_STATUS_1);
   1959	if (err < 0)
   1960		goto out;
   1961
   1962	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
   1963			MRVL88X2011_PMA_PMD_STATUS_1);
   1964	if (err < 0)
   1965		goto out;
   1966
   1967	pcs_status = ((err & MRVL88X2011_LNK_STATUS_OK) ? 1 : 0);
   1968
   1969        /* Check XGXS Register : 4.0018.[0-3,12] */
   1970	err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV4_ADDR,
   1971			MRVL88X2011_10G_XGXS_LANE_STAT);
   1972	if (err < 0)
   1973		goto out;
   1974
   1975	if (err == (PHYXS_XGXS_LANE_STAT_ALINGED | PHYXS_XGXS_LANE_STAT_LANE3 |
   1976		    PHYXS_XGXS_LANE_STAT_LANE2 | PHYXS_XGXS_LANE_STAT_LANE1 |
   1977		    PHYXS_XGXS_LANE_STAT_LANE0 | PHYXS_XGXS_LANE_STAT_MAGIC |
   1978		    0x800))
   1979		link_up = (pma_status && pcs_status) ? 1 : 0;
   1980
   1981	np->link_config.active_speed = SPEED_10000;
   1982	np->link_config.active_duplex = DUPLEX_FULL;
   1983	err = 0;
   1984out:
   1985	mrvl88x2011_act_led(np, (link_up ?
   1986				 MRVL88X2011_LED_CTL_PCS_ACT :
   1987				 MRVL88X2011_LED_CTL_OFF));
   1988
   1989	*link_up_p = link_up;
   1990	return err;
   1991}
   1992
   1993static int link_status_10g_bcm8706(struct niu *np, int *link_up_p)
   1994{
   1995	int err, link_up;
   1996	link_up = 0;
   1997
   1998	err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR,
   1999			BCM8704_PMD_RCV_SIGDET);
   2000	if (err < 0 || err == 0xffff)
   2001		goto out;
   2002	if (!(err & PMD_RCV_SIGDET_GLOBAL)) {
   2003		err = 0;
   2004		goto out;
   2005	}
   2006
   2007	err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR,
   2008			BCM8704_PCS_10G_R_STATUS);
   2009	if (err < 0)
   2010		goto out;
   2011
   2012	if (!(err & PCS_10G_R_STATUS_BLK_LOCK)) {
   2013		err = 0;
   2014		goto out;
   2015	}
   2016
   2017	err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR,
   2018			BCM8704_PHYXS_XGXS_LANE_STAT);
   2019	if (err < 0)
   2020		goto out;
   2021	if (err != (PHYXS_XGXS_LANE_STAT_ALINGED |
   2022		    PHYXS_XGXS_LANE_STAT_MAGIC |
   2023		    PHYXS_XGXS_LANE_STAT_PATTEST |
   2024		    PHYXS_XGXS_LANE_STAT_LANE3 |
   2025		    PHYXS_XGXS_LANE_STAT_LANE2 |
   2026		    PHYXS_XGXS_LANE_STAT_LANE1 |
   2027		    PHYXS_XGXS_LANE_STAT_LANE0)) {
   2028		err = 0;
   2029		np->link_config.active_speed = SPEED_INVALID;
   2030		np->link_config.active_duplex = DUPLEX_INVALID;
   2031		goto out;
   2032	}
   2033
   2034	link_up = 1;
   2035	np->link_config.active_speed = SPEED_10000;
   2036	np->link_config.active_duplex = DUPLEX_FULL;
   2037	err = 0;
   2038
   2039out:
   2040	*link_up_p = link_up;
   2041	return err;
   2042}
   2043
   2044static int link_status_10g_bcom(struct niu *np, int *link_up_p)
   2045{
   2046	int err, link_up;
   2047
   2048	link_up = 0;
   2049
   2050	err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR,
   2051			BCM8704_PMD_RCV_SIGDET);
   2052	if (err < 0)
   2053		goto out;
   2054	if (!(err & PMD_RCV_SIGDET_GLOBAL)) {
   2055		err = 0;
   2056		goto out;
   2057	}
   2058
   2059	err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR,
   2060			BCM8704_PCS_10G_R_STATUS);
   2061	if (err < 0)
   2062		goto out;
   2063	if (!(err & PCS_10G_R_STATUS_BLK_LOCK)) {
   2064		err = 0;
   2065		goto out;
   2066	}
   2067
   2068	err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR,
   2069			BCM8704_PHYXS_XGXS_LANE_STAT);
   2070	if (err < 0)
   2071		goto out;
   2072
   2073	if (err != (PHYXS_XGXS_LANE_STAT_ALINGED |
   2074		    PHYXS_XGXS_LANE_STAT_MAGIC |
   2075		    PHYXS_XGXS_LANE_STAT_LANE3 |
   2076		    PHYXS_XGXS_LANE_STAT_LANE2 |
   2077		    PHYXS_XGXS_LANE_STAT_LANE1 |
   2078		    PHYXS_XGXS_LANE_STAT_LANE0)) {
   2079		err = 0;
   2080		goto out;
   2081	}
   2082
   2083	link_up = 1;
   2084	np->link_config.active_speed = SPEED_10000;
   2085	np->link_config.active_duplex = DUPLEX_FULL;
   2086	err = 0;
   2087
   2088out:
   2089	*link_up_p = link_up;
   2090	return err;
   2091}
   2092
   2093static int link_status_10g(struct niu *np, int *link_up_p)
   2094{
   2095	unsigned long flags;
   2096	int err = -EINVAL;
   2097
   2098	spin_lock_irqsave(&np->lock, flags);
   2099
   2100	if (np->link_config.loopback_mode == LOOPBACK_DISABLED) {
   2101		int phy_id;
   2102
   2103		phy_id = phy_decode(np->parent->port_phy, np->port);
   2104		phy_id = np->parent->phy_probe_info.phy_id[phy_id][np->port];
   2105
   2106		/* handle different phy types */
   2107		switch (phy_id & NIU_PHY_ID_MASK) {
   2108		case NIU_PHY_ID_MRVL88X2011:
   2109			err = link_status_10g_mrvl(np, link_up_p);
   2110			break;
   2111
   2112		default: /* bcom 8704 */
   2113			err = link_status_10g_bcom(np, link_up_p);
   2114			break;
   2115		}
   2116	}
   2117
   2118	spin_unlock_irqrestore(&np->lock, flags);
   2119
   2120	return err;
   2121}
   2122
   2123static int niu_10g_phy_present(struct niu *np)
   2124{
   2125	u64 sig, mask, val;
   2126
   2127	sig = nr64(ESR_INT_SIGNALS);
   2128	switch (np->port) {
   2129	case 0:
   2130		mask = ESR_INT_SIGNALS_P0_BITS;
   2131		val = (ESR_INT_SRDY0_P0 |
   2132		       ESR_INT_DET0_P0 |
   2133		       ESR_INT_XSRDY_P0 |
   2134		       ESR_INT_XDP_P0_CH3 |
   2135		       ESR_INT_XDP_P0_CH2 |
   2136		       ESR_INT_XDP_P0_CH1 |
   2137		       ESR_INT_XDP_P0_CH0);
   2138		break;
   2139
   2140	case 1:
   2141		mask = ESR_INT_SIGNALS_P1_BITS;
   2142		val = (ESR_INT_SRDY0_P1 |
   2143		       ESR_INT_DET0_P1 |
   2144		       ESR_INT_XSRDY_P1 |
   2145		       ESR_INT_XDP_P1_CH3 |
   2146		       ESR_INT_XDP_P1_CH2 |
   2147		       ESR_INT_XDP_P1_CH1 |
   2148		       ESR_INT_XDP_P1_CH0);
   2149		break;
   2150
   2151	default:
   2152		return 0;
   2153	}
   2154
   2155	if ((sig & mask) != val)
   2156		return 0;
   2157	return 1;
   2158}
   2159
   2160static int link_status_10g_hotplug(struct niu *np, int *link_up_p)
   2161{
   2162	unsigned long flags;
   2163	int err = 0;
   2164	int phy_present;
   2165	int phy_present_prev;
   2166
   2167	spin_lock_irqsave(&np->lock, flags);
   2168
   2169	if (np->link_config.loopback_mode == LOOPBACK_DISABLED) {
   2170		phy_present_prev = (np->flags & NIU_FLAGS_HOTPLUG_PHY_PRESENT) ?
   2171			1 : 0;
   2172		phy_present = niu_10g_phy_present(np);
   2173		if (phy_present != phy_present_prev) {
   2174			/* state change */
   2175			if (phy_present) {
   2176				/* A NEM was just plugged in */
   2177				np->flags |= NIU_FLAGS_HOTPLUG_PHY_PRESENT;
   2178				if (np->phy_ops->xcvr_init)
   2179					err = np->phy_ops->xcvr_init(np);
   2180				if (err) {
   2181					err = mdio_read(np, np->phy_addr,
   2182						BCM8704_PHYXS_DEV_ADDR, MII_BMCR);
   2183					if (err == 0xffff) {
   2184						/* No mdio, back-to-back XAUI */
   2185						goto out;
   2186					}
   2187					/* debounce */
   2188					np->flags &= ~NIU_FLAGS_HOTPLUG_PHY_PRESENT;
   2189				}
   2190			} else {
   2191				np->flags &= ~NIU_FLAGS_HOTPLUG_PHY_PRESENT;
   2192				*link_up_p = 0;
   2193				netif_warn(np, link, np->dev,
   2194					   "Hotplug PHY Removed\n");
   2195			}
   2196		}
   2197out:
   2198		if (np->flags & NIU_FLAGS_HOTPLUG_PHY_PRESENT) {
   2199			err = link_status_10g_bcm8706(np, link_up_p);
   2200			if (err == 0xffff) {
   2201				/* No mdio, back-to-back XAUI: it is C10NEM */
   2202				*link_up_p = 1;
   2203				np->link_config.active_speed = SPEED_10000;
   2204				np->link_config.active_duplex = DUPLEX_FULL;
   2205			}
   2206		}
   2207	}
   2208
   2209	spin_unlock_irqrestore(&np->lock, flags);
   2210
   2211	return 0;
   2212}
   2213
   2214static int niu_link_status(struct niu *np, int *link_up_p)
   2215{
   2216	const struct niu_phy_ops *ops = np->phy_ops;
   2217	int err;
   2218
   2219	err = 0;
   2220	if (ops->link_status)
   2221		err = ops->link_status(np, link_up_p);
   2222
   2223	return err;
   2224}
   2225
   2226static void niu_timer(struct timer_list *t)
   2227{
   2228	struct niu *np = from_timer(np, t, timer);
   2229	unsigned long off;
   2230	int err, link_up;
   2231
   2232	err = niu_link_status(np, &link_up);
   2233	if (!err)
   2234		niu_link_status_common(np, link_up);
   2235
   2236	if (netif_carrier_ok(np->dev))
   2237		off = 5 * HZ;
   2238	else
   2239		off = 1 * HZ;
   2240	np->timer.expires = jiffies + off;
   2241
   2242	add_timer(&np->timer);
   2243}
   2244
   2245static const struct niu_phy_ops phy_ops_10g_serdes = {
   2246	.serdes_init		= serdes_init_10g_serdes,
   2247	.link_status		= link_status_10g_serdes,
   2248};
   2249
   2250static const struct niu_phy_ops phy_ops_10g_serdes_niu = {
   2251	.serdes_init		= serdes_init_niu_10g_serdes,
   2252	.link_status		= link_status_10g_serdes,
   2253};
   2254
   2255static const struct niu_phy_ops phy_ops_1g_serdes_niu = {
   2256	.serdes_init		= serdes_init_niu_1g_serdes,
   2257	.link_status		= link_status_1g_serdes,
   2258};
   2259
   2260static const struct niu_phy_ops phy_ops_1g_rgmii = {
   2261	.xcvr_init		= xcvr_init_1g_rgmii,
   2262	.link_status		= link_status_1g_rgmii,
   2263};
   2264
   2265static const struct niu_phy_ops phy_ops_10g_fiber_niu = {
   2266	.serdes_init		= serdes_init_niu_10g_fiber,
   2267	.xcvr_init		= xcvr_init_10g,
   2268	.link_status		= link_status_10g,
   2269};
   2270
   2271static const struct niu_phy_ops phy_ops_10g_fiber = {
   2272	.serdes_init		= serdes_init_10g,
   2273	.xcvr_init		= xcvr_init_10g,
   2274	.link_status		= link_status_10g,
   2275};
   2276
   2277static const struct niu_phy_ops phy_ops_10g_fiber_hotplug = {
   2278	.serdes_init		= serdes_init_10g,
   2279	.xcvr_init		= xcvr_init_10g_bcm8706,
   2280	.link_status		= link_status_10g_hotplug,
   2281};
   2282
   2283static const struct niu_phy_ops phy_ops_niu_10g_hotplug = {
   2284	.serdes_init		= serdes_init_niu_10g_fiber,
   2285	.xcvr_init		= xcvr_init_10g_bcm8706,
   2286	.link_status		= link_status_10g_hotplug,
   2287};
   2288
   2289static const struct niu_phy_ops phy_ops_10g_copper = {
   2290	.serdes_init		= serdes_init_10g,
   2291	.link_status		= link_status_10g, /* XXX */
   2292};
   2293
   2294static const struct niu_phy_ops phy_ops_1g_fiber = {
   2295	.serdes_init		= serdes_init_1g,
   2296	.xcvr_init		= xcvr_init_1g,
   2297	.link_status		= link_status_1g,
   2298};
   2299
   2300static const struct niu_phy_ops phy_ops_1g_copper = {
   2301	.xcvr_init		= xcvr_init_1g,
   2302	.link_status		= link_status_1g,
   2303};
   2304
   2305struct niu_phy_template {
   2306	const struct niu_phy_ops	*ops;
   2307	u32				phy_addr_base;
   2308};
   2309
   2310static const struct niu_phy_template phy_template_niu_10g_fiber = {
   2311	.ops		= &phy_ops_10g_fiber_niu,
   2312	.phy_addr_base	= 16,
   2313};
   2314
   2315static const struct niu_phy_template phy_template_niu_10g_serdes = {
   2316	.ops		= &phy_ops_10g_serdes_niu,
   2317	.phy_addr_base	= 0,
   2318};
   2319
   2320static const struct niu_phy_template phy_template_niu_1g_serdes = {
   2321	.ops		= &phy_ops_1g_serdes_niu,
   2322	.phy_addr_base	= 0,
   2323};
   2324
   2325static const struct niu_phy_template phy_template_10g_fiber = {
   2326	.ops		= &phy_ops_10g_fiber,
   2327	.phy_addr_base	= 8,
   2328};
   2329
   2330static const struct niu_phy_template phy_template_10g_fiber_hotplug = {
   2331	.ops		= &phy_ops_10g_fiber_hotplug,
   2332	.phy_addr_base	= 8,
   2333};
   2334
   2335static const struct niu_phy_template phy_template_niu_10g_hotplug = {
   2336	.ops		= &phy_ops_niu_10g_hotplug,
   2337	.phy_addr_base	= 8,
   2338};
   2339
   2340static const struct niu_phy_template phy_template_10g_copper = {
   2341	.ops		= &phy_ops_10g_copper,
   2342	.phy_addr_base	= 10,
   2343};
   2344
   2345static const struct niu_phy_template phy_template_1g_fiber = {
   2346	.ops		= &phy_ops_1g_fiber,
   2347	.phy_addr_base	= 0,
   2348};
   2349
   2350static const struct niu_phy_template phy_template_1g_copper = {
   2351	.ops		= &phy_ops_1g_copper,
   2352	.phy_addr_base	= 0,
   2353};
   2354
   2355static const struct niu_phy_template phy_template_1g_rgmii = {
   2356	.ops		= &phy_ops_1g_rgmii,
   2357	.phy_addr_base	= 0,
   2358};
   2359
   2360static const struct niu_phy_template phy_template_10g_serdes = {
   2361	.ops		= &phy_ops_10g_serdes,
   2362	.phy_addr_base	= 0,
   2363};
   2364
   2365static int niu_atca_port_num[4] = {
   2366	0, 0,  11, 10
   2367};
   2368
   2369static int serdes_init_10g_serdes(struct niu *np)
   2370{
   2371	struct niu_link_config *lp = &np->link_config;
   2372	unsigned long ctrl_reg, test_cfg_reg, pll_cfg, i;
   2373	u64 ctrl_val, test_cfg_val, sig, mask, val;
   2374
   2375	switch (np->port) {
   2376	case 0:
   2377		ctrl_reg = ENET_SERDES_0_CTRL_CFG;
   2378		test_cfg_reg = ENET_SERDES_0_TEST_CFG;
   2379		pll_cfg = ENET_SERDES_0_PLL_CFG;
   2380		break;
   2381	case 1:
   2382		ctrl_reg = ENET_SERDES_1_CTRL_CFG;
   2383		test_cfg_reg = ENET_SERDES_1_TEST_CFG;
   2384		pll_cfg = ENET_SERDES_1_PLL_CFG;
   2385		break;
   2386
   2387	default:
   2388		return -EINVAL;
   2389	}
   2390	ctrl_val = (ENET_SERDES_CTRL_SDET_0 |
   2391		    ENET_SERDES_CTRL_SDET_1 |
   2392		    ENET_SERDES_CTRL_SDET_2 |
   2393		    ENET_SERDES_CTRL_SDET_3 |
   2394		    (0x5 << ENET_SERDES_CTRL_EMPH_0_SHIFT) |
   2395		    (0x5 << ENET_SERDES_CTRL_EMPH_1_SHIFT) |
   2396		    (0x5 << ENET_SERDES_CTRL_EMPH_2_SHIFT) |
   2397		    (0x5 << ENET_SERDES_CTRL_EMPH_3_SHIFT) |
   2398		    (0x1 << ENET_SERDES_CTRL_LADJ_0_SHIFT) |
   2399		    (0x1 << ENET_SERDES_CTRL_LADJ_1_SHIFT) |
   2400		    (0x1 << ENET_SERDES_CTRL_LADJ_2_SHIFT) |
   2401		    (0x1 << ENET_SERDES_CTRL_LADJ_3_SHIFT));
   2402	test_cfg_val = 0;
   2403
   2404	if (lp->loopback_mode == LOOPBACK_PHY) {
   2405		test_cfg_val |= ((ENET_TEST_MD_PAD_LOOPBACK <<
   2406				  ENET_SERDES_TEST_MD_0_SHIFT) |
   2407				 (ENET_TEST_MD_PAD_LOOPBACK <<
   2408				  ENET_SERDES_TEST_MD_1_SHIFT) |
   2409				 (ENET_TEST_MD_PAD_LOOPBACK <<
   2410				  ENET_SERDES_TEST_MD_2_SHIFT) |
   2411				 (ENET_TEST_MD_PAD_LOOPBACK <<
   2412				  ENET_SERDES_TEST_MD_3_SHIFT));
   2413	}
   2414
   2415	esr_reset(np);
   2416	nw64(pll_cfg, ENET_SERDES_PLL_FBDIV2);
   2417	nw64(ctrl_reg, ctrl_val);
   2418	nw64(test_cfg_reg, test_cfg_val);
   2419
   2420	/* Initialize all 4 lanes of the SERDES.  */
   2421	for (i = 0; i < 4; i++) {
   2422		u32 rxtx_ctrl, glue0;
   2423		int err;
   2424
   2425		err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl);
   2426		if (err)
   2427			return err;
   2428		err = esr_read_glue0(np, i, &glue0);
   2429		if (err)
   2430			return err;
   2431
   2432		rxtx_ctrl &= ~(ESR_RXTX_CTRL_VMUXLO);
   2433		rxtx_ctrl |= (ESR_RXTX_CTRL_ENSTRETCH |
   2434			      (2 << ESR_RXTX_CTRL_VMUXLO_SHIFT));
   2435
   2436		glue0 &= ~(ESR_GLUE_CTRL0_SRATE |
   2437			   ESR_GLUE_CTRL0_THCNT |
   2438			   ESR_GLUE_CTRL0_BLTIME);
   2439		glue0 |= (ESR_GLUE_CTRL0_RXLOSENAB |
   2440			  (0xf << ESR_GLUE_CTRL0_SRATE_SHIFT) |
   2441			  (0xff << ESR_GLUE_CTRL0_THCNT_SHIFT) |
   2442			  (BLTIME_300_CYCLES <<
   2443			   ESR_GLUE_CTRL0_BLTIME_SHIFT));
   2444
   2445		err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl);
   2446		if (err)
   2447			return err;
   2448		err = esr_write_glue0(np, i, glue0);
   2449		if (err)
   2450			return err;
   2451	}
   2452
   2453
   2454	sig = nr64(ESR_INT_SIGNALS);
   2455	switch (np->port) {
   2456	case 0:
   2457		mask = ESR_INT_SIGNALS_P0_BITS;
   2458		val = (ESR_INT_SRDY0_P0 |
   2459		       ESR_INT_DET0_P0 |
   2460		       ESR_INT_XSRDY_P0 |
   2461		       ESR_INT_XDP_P0_CH3 |
   2462		       ESR_INT_XDP_P0_CH2 |
   2463		       ESR_INT_XDP_P0_CH1 |
   2464		       ESR_INT_XDP_P0_CH0);
   2465		break;
   2466
   2467	case 1:
   2468		mask = ESR_INT_SIGNALS_P1_BITS;
   2469		val = (ESR_INT_SRDY0_P1 |
   2470		       ESR_INT_DET0_P1 |
   2471		       ESR_INT_XSRDY_P1 |
   2472		       ESR_INT_XDP_P1_CH3 |
   2473		       ESR_INT_XDP_P1_CH2 |
   2474		       ESR_INT_XDP_P1_CH1 |
   2475		       ESR_INT_XDP_P1_CH0);
   2476		break;
   2477
   2478	default:
   2479		return -EINVAL;
   2480	}
   2481
   2482	if ((sig & mask) != val) {
   2483		int err;
   2484		err = serdes_init_1g_serdes(np);
   2485		if (!err) {
   2486			np->flags &= ~NIU_FLAGS_10G;
   2487			np->mac_xcvr = MAC_XCVR_PCS;
   2488		}  else {
   2489			netdev_err(np->dev, "Port %u 10G/1G SERDES Link Failed\n",
   2490				   np->port);
   2491			return -ENODEV;
   2492		}
   2493	}
   2494
   2495	return 0;
   2496}
   2497
   2498static int niu_determine_phy_disposition(struct niu *np)
   2499{
   2500	struct niu_parent *parent = np->parent;
   2501	u8 plat_type = parent->plat_type;
   2502	const struct niu_phy_template *tp;
   2503	u32 phy_addr_off = 0;
   2504
   2505	if (plat_type == PLAT_TYPE_NIU) {
   2506		switch (np->flags &
   2507			(NIU_FLAGS_10G |
   2508			 NIU_FLAGS_FIBER |
   2509			 NIU_FLAGS_XCVR_SERDES)) {
   2510		case NIU_FLAGS_10G | NIU_FLAGS_XCVR_SERDES:
   2511			/* 10G Serdes */
   2512			tp = &phy_template_niu_10g_serdes;
   2513			break;
   2514		case NIU_FLAGS_XCVR_SERDES:
   2515			/* 1G Serdes */
   2516			tp = &phy_template_niu_1g_serdes;
   2517			break;
   2518		case NIU_FLAGS_10G | NIU_FLAGS_FIBER:
   2519			/* 10G Fiber */
   2520		default:
   2521			if (np->flags & NIU_FLAGS_HOTPLUG_PHY) {
   2522				tp = &phy_template_niu_10g_hotplug;
   2523				if (np->port == 0)
   2524					phy_addr_off = 8;
   2525				if (np->port == 1)
   2526					phy_addr_off = 12;
   2527			} else {
   2528				tp = &phy_template_niu_10g_fiber;
   2529				phy_addr_off += np->port;
   2530			}
   2531			break;
   2532		}
   2533	} else {
   2534		switch (np->flags &
   2535			(NIU_FLAGS_10G |
   2536			 NIU_FLAGS_FIBER |
   2537			 NIU_FLAGS_XCVR_SERDES)) {
   2538		case 0:
   2539			/* 1G copper */
   2540			tp = &phy_template_1g_copper;
   2541			if (plat_type == PLAT_TYPE_VF_P0)
   2542				phy_addr_off = 10;
   2543			else if (plat_type == PLAT_TYPE_VF_P1)
   2544				phy_addr_off = 26;
   2545
   2546			phy_addr_off += (np->port ^ 0x3);
   2547			break;
   2548
   2549		case NIU_FLAGS_10G:
   2550			/* 10G copper */
   2551			tp = &phy_template_10g_copper;
   2552			break;
   2553
   2554		case NIU_FLAGS_FIBER:
   2555			/* 1G fiber */
   2556			tp = &phy_template_1g_fiber;
   2557			break;
   2558
   2559		case NIU_FLAGS_10G | NIU_FLAGS_FIBER:
   2560			/* 10G fiber */
   2561			tp = &phy_template_10g_fiber;
   2562			if (plat_type == PLAT_TYPE_VF_P0 ||
   2563			    plat_type == PLAT_TYPE_VF_P1)
   2564				phy_addr_off = 8;
   2565			phy_addr_off += np->port;
   2566			if (np->flags & NIU_FLAGS_HOTPLUG_PHY) {
   2567				tp = &phy_template_10g_fiber_hotplug;
   2568				if (np->port == 0)
   2569					phy_addr_off = 8;
   2570				if (np->port == 1)
   2571					phy_addr_off = 12;
   2572			}
   2573			break;
   2574
   2575		case NIU_FLAGS_10G | NIU_FLAGS_XCVR_SERDES:
   2576		case NIU_FLAGS_XCVR_SERDES | NIU_FLAGS_FIBER:
   2577		case NIU_FLAGS_XCVR_SERDES:
   2578			switch(np->port) {
   2579			case 0:
   2580			case 1:
   2581				tp = &phy_template_10g_serdes;
   2582				break;
   2583			case 2:
   2584			case 3:
   2585				tp = &phy_template_1g_rgmii;
   2586				break;
   2587			default:
   2588				return -EINVAL;
   2589			}
   2590			phy_addr_off = niu_atca_port_num[np->port];
   2591			break;
   2592
   2593		default:
   2594			return -EINVAL;
   2595		}
   2596	}
   2597
   2598	np->phy_ops = tp->ops;
   2599	np->phy_addr = tp->phy_addr_base + phy_addr_off;
   2600
   2601	return 0;
   2602}
   2603
   2604static int niu_init_link(struct niu *np)
   2605{
   2606	struct niu_parent *parent = np->parent;
   2607	int err, ignore;
   2608
   2609	if (parent->plat_type == PLAT_TYPE_NIU) {
   2610		err = niu_xcvr_init(np);
   2611		if (err)
   2612			return err;
   2613		msleep(200);
   2614	}
   2615	err = niu_serdes_init(np);
   2616	if (err && !(np->flags & NIU_FLAGS_HOTPLUG_PHY))
   2617		return err;
   2618	msleep(200);
   2619	err = niu_xcvr_init(np);
   2620	if (!err || (np->flags & NIU_FLAGS_HOTPLUG_PHY))
   2621		niu_link_status(np, &ignore);
   2622	return 0;
   2623}
   2624
   2625static void niu_set_primary_mac(struct niu *np, const unsigned char *addr)
   2626{
   2627	u16 reg0 = addr[4] << 8 | addr[5];
   2628	u16 reg1 = addr[2] << 8 | addr[3];
   2629	u16 reg2 = addr[0] << 8 | addr[1];
   2630
   2631	if (np->flags & NIU_FLAGS_XMAC) {
   2632		nw64_mac(XMAC_ADDR0, reg0);
   2633		nw64_mac(XMAC_ADDR1, reg1);
   2634		nw64_mac(XMAC_ADDR2, reg2);
   2635	} else {
   2636		nw64_mac(BMAC_ADDR0, reg0);
   2637		nw64_mac(BMAC_ADDR1, reg1);
   2638		nw64_mac(BMAC_ADDR2, reg2);
   2639	}
   2640}
   2641
   2642static int niu_num_alt_addr(struct niu *np)
   2643{
   2644	if (np->flags & NIU_FLAGS_XMAC)
   2645		return XMAC_NUM_ALT_ADDR;
   2646	else
   2647		return BMAC_NUM_ALT_ADDR;
   2648}
   2649
   2650static int niu_set_alt_mac(struct niu *np, int index, unsigned char *addr)
   2651{
   2652	u16 reg0 = addr[4] << 8 | addr[5];
   2653	u16 reg1 = addr[2] << 8 | addr[3];
   2654	u16 reg2 = addr[0] << 8 | addr[1];
   2655
   2656	if (index >= niu_num_alt_addr(np))
   2657		return -EINVAL;
   2658
   2659	if (np->flags & NIU_FLAGS_XMAC) {
   2660		nw64_mac(XMAC_ALT_ADDR0(index), reg0);
   2661		nw64_mac(XMAC_ALT_ADDR1(index), reg1);
   2662		nw64_mac(XMAC_ALT_ADDR2(index), reg2);
   2663	} else {
   2664		nw64_mac(BMAC_ALT_ADDR0(index), reg0);
   2665		nw64_mac(BMAC_ALT_ADDR1(index), reg1);
   2666		nw64_mac(BMAC_ALT_ADDR2(index), reg2);
   2667	}
   2668
   2669	return 0;
   2670}
   2671
   2672static int niu_enable_alt_mac(struct niu *np, int index, int on)
   2673{
   2674	unsigned long reg;
   2675	u64 val, mask;
   2676
   2677	if (index >= niu_num_alt_addr(np))
   2678		return -EINVAL;
   2679
   2680	if (np->flags & NIU_FLAGS_XMAC) {
   2681		reg = XMAC_ADDR_CMPEN;
   2682		mask = 1 << index;
   2683	} else {
   2684		reg = BMAC_ADDR_CMPEN;
   2685		mask = 1 << (index + 1);
   2686	}
   2687
   2688	val = nr64_mac(reg);
   2689	if (on)
   2690		val |= mask;
   2691	else
   2692		val &= ~mask;
   2693	nw64_mac(reg, val);
   2694
   2695	return 0;
   2696}
   2697
   2698static void __set_rdc_table_num_hw(struct niu *np, unsigned long reg,
   2699				   int num, int mac_pref)
   2700{
   2701	u64 val = nr64_mac(reg);
   2702	val &= ~(HOST_INFO_MACRDCTBLN | HOST_INFO_MPR);
   2703	val |= num;
   2704	if (mac_pref)
   2705		val |= HOST_INFO_MPR;
   2706	nw64_mac(reg, val);
   2707}
   2708
   2709static int __set_rdc_table_num(struct niu *np,
   2710			       int xmac_index, int bmac_index,
   2711			       int rdc_table_num, int mac_pref)
   2712{
   2713	unsigned long reg;
   2714
   2715	if (rdc_table_num & ~HOST_INFO_MACRDCTBLN)
   2716		return -EINVAL;
   2717	if (np->flags & NIU_FLAGS_XMAC)
   2718		reg = XMAC_HOST_INFO(xmac_index);
   2719	else
   2720		reg = BMAC_HOST_INFO(bmac_index);
   2721	__set_rdc_table_num_hw(np, reg, rdc_table_num, mac_pref);
   2722	return 0;
   2723}
   2724
   2725static int niu_set_primary_mac_rdc_table(struct niu *np, int table_num,
   2726					 int mac_pref)
   2727{
   2728	return __set_rdc_table_num(np, 17, 0, table_num, mac_pref);
   2729}
   2730
   2731static int niu_set_multicast_mac_rdc_table(struct niu *np, int table_num,
   2732					   int mac_pref)
   2733{
   2734	return __set_rdc_table_num(np, 16, 8, table_num, mac_pref);
   2735}
   2736
   2737static int niu_set_alt_mac_rdc_table(struct niu *np, int idx,
   2738				     int table_num, int mac_pref)
   2739{
   2740	if (idx >= niu_num_alt_addr(np))
   2741		return -EINVAL;
   2742	return __set_rdc_table_num(np, idx, idx + 1, table_num, mac_pref);
   2743}
   2744
   2745static u64 vlan_entry_set_parity(u64 reg_val)
   2746{
   2747	u64 port01_mask;
   2748	u64 port23_mask;
   2749
   2750	port01_mask = 0x00ff;
   2751	port23_mask = 0xff00;
   2752
   2753	if (hweight64(reg_val & port01_mask) & 1)
   2754		reg_val |= ENET_VLAN_TBL_PARITY0;
   2755	else
   2756		reg_val &= ~ENET_VLAN_TBL_PARITY0;
   2757
   2758	if (hweight64(reg_val & port23_mask) & 1)
   2759		reg_val |= ENET_VLAN_TBL_PARITY1;
   2760	else
   2761		reg_val &= ~ENET_VLAN_TBL_PARITY1;
   2762
   2763	return reg_val;
   2764}
   2765
   2766static void vlan_tbl_write(struct niu *np, unsigned long index,
   2767			   int port, int vpr, int rdc_table)
   2768{
   2769	u64 reg_val = nr64(ENET_VLAN_TBL(index));
   2770
   2771	reg_val &= ~((ENET_VLAN_TBL_VPR |
   2772		      ENET_VLAN_TBL_VLANRDCTBLN) <<
   2773		     ENET_VLAN_TBL_SHIFT(port));
   2774	if (vpr)
   2775		reg_val |= (ENET_VLAN_TBL_VPR <<
   2776			    ENET_VLAN_TBL_SHIFT(port));
   2777	reg_val |= (rdc_table << ENET_VLAN_TBL_SHIFT(port));
   2778
   2779	reg_val = vlan_entry_set_parity(reg_val);
   2780
   2781	nw64(ENET_VLAN_TBL(index), reg_val);
   2782}
   2783
   2784static void vlan_tbl_clear(struct niu *np)
   2785{
   2786	int i;
   2787
   2788	for (i = 0; i < ENET_VLAN_TBL_NUM_ENTRIES; i++)
   2789		nw64(ENET_VLAN_TBL(i), 0);
   2790}
   2791
   2792static int tcam_wait_bit(struct niu *np, u64 bit)
   2793{
   2794	int limit = 1000;
   2795
   2796	while (--limit > 0) {
   2797		if (nr64(TCAM_CTL) & bit)
   2798			break;
   2799		udelay(1);
   2800	}
   2801	if (limit <= 0)
   2802		return -ENODEV;
   2803
   2804	return 0;
   2805}
   2806
   2807static int tcam_flush(struct niu *np, int index)
   2808{
   2809	nw64(TCAM_KEY_0, 0x00);
   2810	nw64(TCAM_KEY_MASK_0, 0xff);
   2811	nw64(TCAM_CTL, (TCAM_CTL_RWC_TCAM_WRITE | index));
   2812
   2813	return tcam_wait_bit(np, TCAM_CTL_STAT);
   2814}
   2815
   2816#if 0
   2817static int tcam_read(struct niu *np, int index,
   2818		     u64 *key, u64 *mask)
   2819{
   2820	int err;
   2821
   2822	nw64(TCAM_CTL, (TCAM_CTL_RWC_TCAM_READ | index));
   2823	err = tcam_wait_bit(np, TCAM_CTL_STAT);
   2824	if (!err) {
   2825		key[0] = nr64(TCAM_KEY_0);
   2826		key[1] = nr64(TCAM_KEY_1);
   2827		key[2] = nr64(TCAM_KEY_2);
   2828		key[3] = nr64(TCAM_KEY_3);
   2829		mask[0] = nr64(TCAM_KEY_MASK_0);
   2830		mask[1] = nr64(TCAM_KEY_MASK_1);
   2831		mask[2] = nr64(TCAM_KEY_MASK_2);
   2832		mask[3] = nr64(TCAM_KEY_MASK_3);
   2833	}
   2834	return err;
   2835}
   2836#endif
   2837
   2838static int tcam_write(struct niu *np, int index,
   2839		      u64 *key, u64 *mask)
   2840{
   2841	nw64(TCAM_KEY_0, key[0]);
   2842	nw64(TCAM_KEY_1, key[1]);
   2843	nw64(TCAM_KEY_2, key[2]);
   2844	nw64(TCAM_KEY_3, key[3]);
   2845	nw64(TCAM_KEY_MASK_0, mask[0]);
   2846	nw64(TCAM_KEY_MASK_1, mask[1]);
   2847	nw64(TCAM_KEY_MASK_2, mask[2]);
   2848	nw64(TCAM_KEY_MASK_3, mask[3]);
   2849	nw64(TCAM_CTL, (TCAM_CTL_RWC_TCAM_WRITE | index));
   2850
   2851	return tcam_wait_bit(np, TCAM_CTL_STAT);
   2852}
   2853
   2854#if 0
   2855static int tcam_assoc_read(struct niu *np, int index, u64 *data)
   2856{
   2857	int err;
   2858
   2859	nw64(TCAM_CTL, (TCAM_CTL_RWC_RAM_READ | index));
   2860	err = tcam_wait_bit(np, TCAM_CTL_STAT);
   2861	if (!err)
   2862		*data = nr64(TCAM_KEY_1);
   2863
   2864	return err;
   2865}
   2866#endif
   2867
   2868static int tcam_assoc_write(struct niu *np, int index, u64 assoc_data)
   2869{
   2870	nw64(TCAM_KEY_1, assoc_data);
   2871	nw64(TCAM_CTL, (TCAM_CTL_RWC_RAM_WRITE | index));
   2872
   2873	return tcam_wait_bit(np, TCAM_CTL_STAT);
   2874}
   2875
   2876static void tcam_enable(struct niu *np, int on)
   2877{
   2878	u64 val = nr64(FFLP_CFG_1);
   2879
   2880	if (on)
   2881		val &= ~FFLP_CFG_1_TCAM_DIS;
   2882	else
   2883		val |= FFLP_CFG_1_TCAM_DIS;
   2884	nw64(FFLP_CFG_1, val);
   2885}
   2886
   2887static void tcam_set_lat_and_ratio(struct niu *np, u64 latency, u64 ratio)
   2888{
   2889	u64 val = nr64(FFLP_CFG_1);
   2890
   2891	val &= ~(FFLP_CFG_1_FFLPINITDONE |
   2892		 FFLP_CFG_1_CAMLAT |
   2893		 FFLP_CFG_1_CAMRATIO);
   2894	val |= (latency << FFLP_CFG_1_CAMLAT_SHIFT);
   2895	val |= (ratio << FFLP_CFG_1_CAMRATIO_SHIFT);
   2896	nw64(FFLP_CFG_1, val);
   2897
   2898	val = nr64(FFLP_CFG_1);
   2899	val |= FFLP_CFG_1_FFLPINITDONE;
   2900	nw64(FFLP_CFG_1, val);
   2901}
   2902
   2903static int tcam_user_eth_class_enable(struct niu *np, unsigned long class,
   2904				      int on)
   2905{
   2906	unsigned long reg;
   2907	u64 val;
   2908
   2909	if (class < CLASS_CODE_ETHERTYPE1 ||
   2910	    class > CLASS_CODE_ETHERTYPE2)
   2911		return -EINVAL;
   2912
   2913	reg = L2_CLS(class - CLASS_CODE_ETHERTYPE1);
   2914	val = nr64(reg);
   2915	if (on)
   2916		val |= L2_CLS_VLD;
   2917	else
   2918		val &= ~L2_CLS_VLD;
   2919	nw64(reg, val);
   2920
   2921	return 0;
   2922}
   2923
   2924#if 0
   2925static int tcam_user_eth_class_set(struct niu *np, unsigned long class,
   2926				   u64 ether_type)
   2927{
   2928	unsigned long reg;
   2929	u64 val;
   2930
   2931	if (class < CLASS_CODE_ETHERTYPE1 ||
   2932	    class > CLASS_CODE_ETHERTYPE2 ||
   2933	    (ether_type & ~(u64)0xffff) != 0)
   2934		return -EINVAL;
   2935
   2936	reg = L2_CLS(class - CLASS_CODE_ETHERTYPE1);
   2937	val = nr64(reg);
   2938	val &= ~L2_CLS_ETYPE;
   2939	val |= (ether_type << L2_CLS_ETYPE_SHIFT);
   2940	nw64(reg, val);
   2941
   2942	return 0;
   2943}
   2944#endif
   2945
   2946static int tcam_user_ip_class_enable(struct niu *np, unsigned long class,
   2947				     int on)
   2948{
   2949	unsigned long reg;
   2950	u64 val;
   2951
   2952	if (class < CLASS_CODE_USER_PROG1 ||
   2953	    class > CLASS_CODE_USER_PROG4)
   2954		return -EINVAL;
   2955
   2956	reg = L3_CLS(class - CLASS_CODE_USER_PROG1);
   2957	val = nr64(reg);
   2958	if (on)
   2959		val |= L3_CLS_VALID;
   2960	else
   2961		val &= ~L3_CLS_VALID;
   2962	nw64(reg, val);
   2963
   2964	return 0;
   2965}
   2966
   2967static int tcam_user_ip_class_set(struct niu *np, unsigned long class,
   2968				  int ipv6, u64 protocol_id,
   2969				  u64 tos_mask, u64 tos_val)
   2970{
   2971	unsigned long reg;
   2972	u64 val;
   2973
   2974	if (class < CLASS_CODE_USER_PROG1 ||
   2975	    class > CLASS_CODE_USER_PROG4 ||
   2976	    (protocol_id & ~(u64)0xff) != 0 ||
   2977	    (tos_mask & ~(u64)0xff) != 0 ||
   2978	    (tos_val & ~(u64)0xff) != 0)
   2979		return -EINVAL;
   2980
   2981	reg = L3_CLS(class - CLASS_CODE_USER_PROG1);
   2982	val = nr64(reg);
   2983	val &= ~(L3_CLS_IPVER | L3_CLS_PID |
   2984		 L3_CLS_TOSMASK | L3_CLS_TOS);
   2985	if (ipv6)
   2986		val |= L3_CLS_IPVER;
   2987	val |= (protocol_id << L3_CLS_PID_SHIFT);
   2988	val |= (tos_mask << L3_CLS_TOSMASK_SHIFT);
   2989	val |= (tos_val << L3_CLS_TOS_SHIFT);
   2990	nw64(reg, val);
   2991
   2992	return 0;
   2993}
   2994
   2995static int tcam_early_init(struct niu *np)
   2996{
   2997	unsigned long i;
   2998	int err;
   2999
   3000	tcam_enable(np, 0);
   3001	tcam_set_lat_and_ratio(np,
   3002			       DEFAULT_TCAM_LATENCY,
   3003			       DEFAULT_TCAM_ACCESS_RATIO);
   3004	for (i = CLASS_CODE_ETHERTYPE1; i <= CLASS_CODE_ETHERTYPE2; i++) {
   3005		err = tcam_user_eth_class_enable(np, i, 0);
   3006		if (err)
   3007			return err;
   3008	}
   3009	for (i = CLASS_CODE_USER_PROG1; i <= CLASS_CODE_USER_PROG4; i++) {
   3010		err = tcam_user_ip_class_enable(np, i, 0);
   3011		if (err)
   3012			return err;
   3013	}
   3014
   3015	return 0;
   3016}
   3017
   3018static int tcam_flush_all(struct niu *np)
   3019{
   3020	unsigned long i;
   3021
   3022	for (i = 0; i < np->parent->tcam_num_entries; i++) {
   3023		int err = tcam_flush(np, i);
   3024		if (err)
   3025			return err;
   3026	}
   3027	return 0;
   3028}
   3029
   3030static u64 hash_addr_regval(unsigned long index, unsigned long num_entries)
   3031{
   3032	return (u64)index | (num_entries == 1 ? HASH_TBL_ADDR_AUTOINC : 0);
   3033}
   3034
   3035#if 0
   3036static int hash_read(struct niu *np, unsigned long partition,
   3037		     unsigned long index, unsigned long num_entries,
   3038		     u64 *data)
   3039{
   3040	u64 val = hash_addr_regval(index, num_entries);
   3041	unsigned long i;
   3042
   3043	if (partition >= FCRAM_NUM_PARTITIONS ||
   3044	    index + num_entries > FCRAM_SIZE)
   3045		return -EINVAL;
   3046
   3047	nw64(HASH_TBL_ADDR(partition), val);
   3048	for (i = 0; i < num_entries; i++)
   3049		data[i] = nr64(HASH_TBL_DATA(partition));
   3050
   3051	return 0;
   3052}
   3053#endif
   3054
   3055static int hash_write(struct niu *np, unsigned long partition,
   3056		      unsigned long index, unsigned long num_entries,
   3057		      u64 *data)
   3058{
   3059	u64 val = hash_addr_regval(index, num_entries);
   3060	unsigned long i;
   3061
   3062	if (partition >= FCRAM_NUM_PARTITIONS ||
   3063	    index + (num_entries * 8) > FCRAM_SIZE)
   3064		return -EINVAL;
   3065
   3066	nw64(HASH_TBL_ADDR(partition), val);
   3067	for (i = 0; i < num_entries; i++)
   3068		nw64(HASH_TBL_DATA(partition), data[i]);
   3069
   3070	return 0;
   3071}
   3072
   3073static void fflp_reset(struct niu *np)
   3074{
   3075	u64 val;
   3076
   3077	nw64(FFLP_CFG_1, FFLP_CFG_1_PIO_FIO_RST);
   3078	udelay(10);
   3079	nw64(FFLP_CFG_1, 0);
   3080
   3081	val = FFLP_CFG_1_FCRAMOUTDR_NORMAL | FFLP_CFG_1_FFLPINITDONE;
   3082	nw64(FFLP_CFG_1, val);
   3083}
   3084
   3085static void fflp_set_timings(struct niu *np)
   3086{
   3087	u64 val = nr64(FFLP_CFG_1);
   3088
   3089	val &= ~FFLP_CFG_1_FFLPINITDONE;
   3090	val |= (DEFAULT_FCRAMRATIO << FFLP_CFG_1_FCRAMRATIO_SHIFT);
   3091	nw64(FFLP_CFG_1, val);
   3092
   3093	val = nr64(FFLP_CFG_1);
   3094	val |= FFLP_CFG_1_FFLPINITDONE;
   3095	nw64(FFLP_CFG_1, val);
   3096
   3097	val = nr64(FCRAM_REF_TMR);
   3098	val &= ~(FCRAM_REF_TMR_MAX | FCRAM_REF_TMR_MIN);
   3099	val |= (DEFAULT_FCRAM_REFRESH_MAX << FCRAM_REF_TMR_MAX_SHIFT);
   3100	val |= (DEFAULT_FCRAM_REFRESH_MIN << FCRAM_REF_TMR_MIN_SHIFT);
   3101	nw64(FCRAM_REF_TMR, val);
   3102}
   3103
   3104static int fflp_set_partition(struct niu *np, u64 partition,
   3105			      u64 mask, u64 base, int enable)
   3106{
   3107	unsigned long reg;
   3108	u64 val;
   3109
   3110	if (partition >= FCRAM_NUM_PARTITIONS ||
   3111	    (mask & ~(u64)0x1f) != 0 ||
   3112	    (base & ~(u64)0x1f) != 0)
   3113		return -EINVAL;
   3114
   3115	reg = FLW_PRT_SEL(partition);
   3116
   3117	val = nr64(reg);
   3118	val &= ~(FLW_PRT_SEL_EXT | FLW_PRT_SEL_MASK | FLW_PRT_SEL_BASE);
   3119	val |= (mask << FLW_PRT_SEL_MASK_SHIFT);
   3120	val |= (base << FLW_PRT_SEL_BASE_SHIFT);
   3121	if (enable)
   3122		val |= FLW_PRT_SEL_EXT;
   3123	nw64(reg, val);
   3124
   3125	return 0;
   3126}
   3127
   3128static int fflp_disable_all_partitions(struct niu *np)
   3129{
   3130	unsigned long i;
   3131
   3132	for (i = 0; i < FCRAM_NUM_PARTITIONS; i++) {
   3133		int err = fflp_set_partition(np, 0, 0, 0, 0);
   3134		if (err)
   3135			return err;
   3136	}
   3137	return 0;
   3138}
   3139
   3140static void fflp_llcsnap_enable(struct niu *np, int on)
   3141{
   3142	u64 val = nr64(FFLP_CFG_1);
   3143
   3144	if (on)
   3145		val |= FFLP_CFG_1_LLCSNAP;
   3146	else
   3147		val &= ~FFLP_CFG_1_LLCSNAP;
   3148	nw64(FFLP_CFG_1, val);
   3149}
   3150
   3151static void fflp_errors_enable(struct niu *np, int on)
   3152{
   3153	u64 val = nr64(FFLP_CFG_1);
   3154
   3155	if (on)
   3156		val &= ~FFLP_CFG_1_ERRORDIS;
   3157	else
   3158		val |= FFLP_CFG_1_ERRORDIS;
   3159	nw64(FFLP_CFG_1, val);
   3160}
   3161
   3162static int fflp_hash_clear(struct niu *np)
   3163{
   3164	struct fcram_hash_ipv4 ent;
   3165	unsigned long i;
   3166
   3167	/* IPV4 hash entry with valid bit clear, rest is don't care.  */
   3168	memset(&ent, 0, sizeof(ent));
   3169	ent.header = HASH_HEADER_EXT;
   3170
   3171	for (i = 0; i < FCRAM_SIZE; i += sizeof(ent)) {
   3172		int err = hash_write(np, 0, i, 1, (u64 *) &ent);
   3173		if (err)
   3174			return err;
   3175	}
   3176	return 0;
   3177}
   3178
   3179static int fflp_early_init(struct niu *np)
   3180{
   3181	struct niu_parent *parent;
   3182	unsigned long flags;
   3183	int err;
   3184
   3185	niu_lock_parent(np, flags);
   3186
   3187	parent = np->parent;
   3188	err = 0;
   3189	if (!(parent->flags & PARENT_FLGS_CLS_HWINIT)) {
   3190		if (np->parent->plat_type != PLAT_TYPE_NIU) {
   3191			fflp_reset(np);
   3192			fflp_set_timings(np);
   3193			err = fflp_disable_all_partitions(np);
   3194			if (err) {
   3195				netif_printk(np, probe, KERN_DEBUG, np->dev,
   3196					     "fflp_disable_all_partitions failed, err=%d\n",
   3197					     err);
   3198				goto out;
   3199			}
   3200		}
   3201
   3202		err = tcam_early_init(np);
   3203		if (err) {
   3204			netif_printk(np, probe, KERN_DEBUG, np->dev,
   3205				     "tcam_early_init failed, err=%d\n", err);
   3206			goto out;
   3207		}
   3208		fflp_llcsnap_enable(np, 1);
   3209		fflp_errors_enable(np, 0);
   3210		nw64(H1POLY, 0);
   3211		nw64(H2POLY, 0);
   3212
   3213		err = tcam_flush_all(np);
   3214		if (err) {
   3215			netif_printk(np, probe, KERN_DEBUG, np->dev,
   3216				     "tcam_flush_all failed, err=%d\n", err);
   3217			goto out;
   3218		}
   3219		if (np->parent->plat_type != PLAT_TYPE_NIU) {
   3220			err = fflp_hash_clear(np);
   3221			if (err) {
   3222				netif_printk(np, probe, KERN_DEBUG, np->dev,
   3223					     "fflp_hash_clear failed, err=%d\n",
   3224					     err);
   3225				goto out;
   3226			}
   3227		}
   3228
   3229		vlan_tbl_clear(np);
   3230
   3231		parent->flags |= PARENT_FLGS_CLS_HWINIT;
   3232	}
   3233out:
   3234	niu_unlock_parent(np, flags);
   3235	return err;
   3236}
   3237
   3238static int niu_set_flow_key(struct niu *np, unsigned long class_code, u64 key)
   3239{
   3240	if (class_code < CLASS_CODE_USER_PROG1 ||
   3241	    class_code > CLASS_CODE_SCTP_IPV6)
   3242		return -EINVAL;
   3243
   3244	nw64(FLOW_KEY(class_code - CLASS_CODE_USER_PROG1), key);
   3245	return 0;
   3246}
   3247
   3248static int niu_set_tcam_key(struct niu *np, unsigned long class_code, u64 key)
   3249{
   3250	if (class_code < CLASS_CODE_USER_PROG1 ||
   3251	    class_code > CLASS_CODE_SCTP_IPV6)
   3252		return -EINVAL;
   3253
   3254	nw64(TCAM_KEY(class_code - CLASS_CODE_USER_PROG1), key);
   3255	return 0;
   3256}
   3257
   3258/* Entries for the ports are interleaved in the TCAM */
   3259static u16 tcam_get_index(struct niu *np, u16 idx)
   3260{
   3261	/* One entry reserved for IP fragment rule */
   3262	if (idx >= (np->clas.tcam_sz - 1))
   3263		idx = 0;
   3264	return np->clas.tcam_top + ((idx+1) * np->parent->num_ports);
   3265}
   3266
   3267static u16 tcam_get_size(struct niu *np)
   3268{
   3269	/* One entry reserved for IP fragment rule */
   3270	return np->clas.tcam_sz - 1;
   3271}
   3272
   3273static u16 tcam_get_valid_entry_cnt(struct niu *np)
   3274{
   3275	/* One entry reserved for IP fragment rule */
   3276	return np->clas.tcam_valid_entries - 1;
   3277}
   3278
   3279static void niu_rx_skb_append(struct sk_buff *skb, struct page *page,
   3280			      u32 offset, u32 size, u32 truesize)
   3281{
   3282	skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page, offset, size);
   3283
   3284	skb->len += size;
   3285	skb->data_len += size;
   3286	skb->truesize += truesize;
   3287}
   3288
   3289static unsigned int niu_hash_rxaddr(struct rx_ring_info *rp, u64 a)
   3290{
   3291	a >>= PAGE_SHIFT;
   3292	a ^= (a >> ilog2(MAX_RBR_RING_SIZE));
   3293
   3294	return a & (MAX_RBR_RING_SIZE - 1);
   3295}
   3296
   3297static struct page *niu_find_rxpage(struct rx_ring_info *rp, u64 addr,
   3298				    struct page ***link)
   3299{
   3300	unsigned int h = niu_hash_rxaddr(rp, addr);
   3301	struct page *p, **pp;
   3302
   3303	addr &= PAGE_MASK;
   3304	pp = &rp->rxhash[h];
   3305	for (; (p = *pp) != NULL; pp = &niu_next_page(p)) {
   3306		if (p->index == addr) {
   3307			*link = pp;
   3308			goto found;
   3309		}
   3310	}
   3311	BUG();
   3312
   3313found:
   3314	return p;
   3315}
   3316
   3317static void niu_hash_page(struct rx_ring_info *rp, struct page *page, u64 base)
   3318{
   3319	unsigned int h = niu_hash_rxaddr(rp, base);
   3320
   3321	page->index = base;
   3322	niu_next_page(page) = rp->rxhash[h];
   3323	rp->rxhash[h] = page;
   3324}
   3325
   3326static int niu_rbr_add_page(struct niu *np, struct rx_ring_info *rp,
   3327			    gfp_t mask, int start_index)
   3328{
   3329	struct page *page;
   3330	u64 addr;
   3331	int i;
   3332
   3333	page = alloc_page(mask);
   3334	if (!page)
   3335		return -ENOMEM;
   3336
   3337	addr = np->ops->map_page(np->device, page, 0,
   3338				 PAGE_SIZE, DMA_FROM_DEVICE);
   3339	if (!addr) {
   3340		__free_page(page);
   3341		return -ENOMEM;
   3342	}
   3343
   3344	niu_hash_page(rp, page, addr);
   3345	if (rp->rbr_blocks_per_page > 1)
   3346		page_ref_add(page, rp->rbr_blocks_per_page - 1);
   3347
   3348	for (i = 0; i < rp->rbr_blocks_per_page; i++) {
   3349		__le32 *rbr = &rp->rbr[start_index + i];
   3350
   3351		*rbr = cpu_to_le32(addr >> RBR_DESCR_ADDR_SHIFT);
   3352		addr += rp->rbr_block_size;
   3353	}
   3354
   3355	return 0;
   3356}
   3357
   3358static void niu_rbr_refill(struct niu *np, struct rx_ring_info *rp, gfp_t mask)
   3359{
   3360	int index = rp->rbr_index;
   3361
   3362	rp->rbr_pending++;
   3363	if ((rp->rbr_pending % rp->rbr_blocks_per_page) == 0) {
   3364		int err = niu_rbr_add_page(np, rp, mask, index);
   3365
   3366		if (unlikely(err)) {
   3367			rp->rbr_pending--;
   3368			return;
   3369		}
   3370
   3371		rp->rbr_index += rp->rbr_blocks_per_page;
   3372		BUG_ON(rp->rbr_index > rp->rbr_table_size);
   3373		if (rp->rbr_index == rp->rbr_table_size)
   3374			rp->rbr_index = 0;
   3375
   3376		if (rp->rbr_pending >= rp->rbr_kick_thresh) {
   3377			nw64(RBR_KICK(rp->rx_channel), rp->rbr_pending);
   3378			rp->rbr_pending = 0;
   3379		}
   3380	}
   3381}
   3382
   3383static int niu_rx_pkt_ignore(struct niu *np, struct rx_ring_info *rp)
   3384{
   3385	unsigned int index = rp->rcr_index;
   3386	int num_rcr = 0;
   3387
   3388	rp->rx_dropped++;
   3389	while (1) {
   3390		struct page *page, **link;
   3391		u64 addr, val;
   3392		u32 rcr_size;
   3393
   3394		num_rcr++;
   3395
   3396		val = le64_to_cpup(&rp->rcr[index]);
   3397		addr = (val & RCR_ENTRY_PKT_BUF_ADDR) <<
   3398			RCR_ENTRY_PKT_BUF_ADDR_SHIFT;
   3399		page = niu_find_rxpage(rp, addr, &link);
   3400
   3401		rcr_size = rp->rbr_sizes[(val & RCR_ENTRY_PKTBUFSZ) >>
   3402					 RCR_ENTRY_PKTBUFSZ_SHIFT];
   3403		if ((page->index + PAGE_SIZE) - rcr_size == addr) {
   3404			*link = niu_next_page(page);
   3405			np->ops->unmap_page(np->device, page->index,
   3406					    PAGE_SIZE, DMA_FROM_DEVICE);
   3407			page->index = 0;
   3408			niu_next_page(page) = NULL;
   3409			__free_page(page);
   3410			rp->rbr_refill_pending++;
   3411		}
   3412
   3413		index = NEXT_RCR(rp, index);
   3414		if (!(val & RCR_ENTRY_MULTI))
   3415			break;
   3416
   3417	}
   3418	rp->rcr_index = index;
   3419
   3420	return num_rcr;
   3421}
   3422
   3423static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np,
   3424			      struct rx_ring_info *rp)
   3425{
   3426	unsigned int index = rp->rcr_index;
   3427	struct rx_pkt_hdr1 *rh;
   3428	struct sk_buff *skb;
   3429	int len, num_rcr;
   3430
   3431	skb = netdev_alloc_skb(np->dev, RX_SKB_ALLOC_SIZE);
   3432	if (unlikely(!skb))
   3433		return niu_rx_pkt_ignore(np, rp);
   3434
   3435	num_rcr = 0;
   3436	while (1) {
   3437		struct page *page, **link;
   3438		u32 rcr_size, append_size;
   3439		u64 addr, val, off;
   3440
   3441		num_rcr++;
   3442
   3443		val = le64_to_cpup(&rp->rcr[index]);
   3444
   3445		len = (val & RCR_ENTRY_L2_LEN) >>
   3446			RCR_ENTRY_L2_LEN_SHIFT;
   3447		append_size = len + ETH_HLEN + ETH_FCS_LEN;
   3448
   3449		addr = (val & RCR_ENTRY_PKT_BUF_ADDR) <<
   3450			RCR_ENTRY_PKT_BUF_ADDR_SHIFT;
   3451		page = niu_find_rxpage(rp, addr, &link);
   3452
   3453		rcr_size = rp->rbr_sizes[(val & RCR_ENTRY_PKTBUFSZ) >>
   3454					 RCR_ENTRY_PKTBUFSZ_SHIFT];
   3455
   3456		off = addr & ~PAGE_MASK;
   3457		if (num_rcr == 1) {
   3458			int ptype;
   3459
   3460			ptype = (val >> RCR_ENTRY_PKT_TYPE_SHIFT);
   3461			if ((ptype == RCR_PKT_TYPE_TCP ||
   3462			     ptype == RCR_PKT_TYPE_UDP) &&
   3463			    !(val & (RCR_ENTRY_NOPORT |
   3464				     RCR_ENTRY_ERROR)))
   3465				skb->ip_summed = CHECKSUM_UNNECESSARY;
   3466			else
   3467				skb_checksum_none_assert(skb);
   3468		} else if (!(val & RCR_ENTRY_MULTI))
   3469			append_size = append_size - skb->len;
   3470
   3471		niu_rx_skb_append(skb, page, off, append_size, rcr_size);
   3472		if ((page->index + rp->rbr_block_size) - rcr_size == addr) {
   3473			*link = niu_next_page(page);
   3474			np->ops->unmap_page(np->device, page->index,
   3475					    PAGE_SIZE, DMA_FROM_DEVICE);
   3476			page->index = 0;
   3477			niu_next_page(page) = NULL;
   3478			rp->rbr_refill_pending++;
   3479		} else
   3480			get_page(page);
   3481
   3482		index = NEXT_RCR(rp, index);
   3483		if (!(val & RCR_ENTRY_MULTI))
   3484			break;
   3485
   3486	}
   3487	rp->rcr_index = index;
   3488
   3489	len += sizeof(*rh);
   3490	len = min_t(int, len, sizeof(*rh) + VLAN_ETH_HLEN);
   3491	__pskb_pull_tail(skb, len);
   3492
   3493	rh = (struct rx_pkt_hdr1 *) skb->data;
   3494	if (np->dev->features & NETIF_F_RXHASH)
   3495		skb_set_hash(skb,
   3496			     ((u32)rh->hashval2_0 << 24 |
   3497			      (u32)rh->hashval2_1 << 16 |
   3498			      (u32)rh->hashval1_1 << 8 |
   3499			      (u32)rh->hashval1_2 << 0),
   3500			     PKT_HASH_TYPE_L3);
   3501	skb_pull(skb, sizeof(*rh));
   3502
   3503	rp->rx_packets++;
   3504	rp->rx_bytes += skb->len;
   3505
   3506	skb->protocol = eth_type_trans(skb, np->dev);
   3507	skb_record_rx_queue(skb, rp->rx_channel);
   3508	napi_gro_receive(napi, skb);
   3509
   3510	return num_rcr;
   3511}
   3512
   3513static int niu_rbr_fill(struct niu *np, struct rx_ring_info *rp, gfp_t mask)
   3514{
   3515	int blocks_per_page = rp->rbr_blocks_per_page;
   3516	int err, index = rp->rbr_index;
   3517
   3518	err = 0;
   3519	while (index < (rp->rbr_table_size - blocks_per_page)) {
   3520		err = niu_rbr_add_page(np, rp, mask, index);
   3521		if (unlikely(err))
   3522			break;
   3523
   3524		index += blocks_per_page;
   3525	}
   3526
   3527	rp->rbr_index = index;
   3528	return err;
   3529}
   3530
   3531static void niu_rbr_free(struct niu *np, struct rx_ring_info *rp)
   3532{
   3533	int i;
   3534
   3535	for (i = 0; i < MAX_RBR_RING_SIZE; i++) {
   3536		struct page *page;
   3537
   3538		page = rp->rxhash[i];
   3539		while (page) {
   3540			struct page *next = niu_next_page(page);
   3541			u64 base = page->index;
   3542
   3543			np->ops->unmap_page(np->device, base, PAGE_SIZE,
   3544					    DMA_FROM_DEVICE);
   3545			page->index = 0;
   3546			niu_next_page(page) = NULL;
   3547
   3548			__free_page(page);
   3549
   3550			page = next;
   3551		}
   3552	}
   3553
   3554	for (i = 0; i < rp->rbr_table_size; i++)
   3555		rp->rbr[i] = cpu_to_le32(0);
   3556	rp->rbr_index = 0;
   3557}
   3558
   3559static int release_tx_packet(struct niu *np, struct tx_ring_info *rp, int idx)
   3560{
   3561	struct tx_buff_info *tb = &rp->tx_buffs[idx];
   3562	struct sk_buff *skb = tb->skb;
   3563	struct tx_pkt_hdr *tp;
   3564	u64 tx_flags;
   3565	int i, len;
   3566
   3567	tp = (struct tx_pkt_hdr *) skb->data;
   3568	tx_flags = le64_to_cpup(&tp->flags);
   3569
   3570	rp->tx_packets++;
   3571	rp->tx_bytes += (((tx_flags & TXHDR_LEN) >> TXHDR_LEN_SHIFT) -
   3572			 ((tx_flags & TXHDR_PAD) / 2));
   3573
   3574	len = skb_headlen(skb);
   3575	np->ops->unmap_single(np->device, tb->mapping,
   3576			      len, DMA_TO_DEVICE);
   3577
   3578	if (le64_to_cpu(rp->descr[idx]) & TX_DESC_MARK)
   3579		rp->mark_pending--;
   3580
   3581	tb->skb = NULL;
   3582	do {
   3583		idx = NEXT_TX(rp, idx);
   3584		len -= MAX_TX_DESC_LEN;
   3585	} while (len > 0);
   3586
   3587	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
   3588		tb = &rp->tx_buffs[idx];
   3589		BUG_ON(tb->skb != NULL);
   3590		np->ops->unmap_page(np->device, tb->mapping,
   3591				    skb_frag_size(&skb_shinfo(skb)->frags[i]),
   3592				    DMA_TO_DEVICE);
   3593		idx = NEXT_TX(rp, idx);
   3594	}
   3595
   3596	dev_kfree_skb(skb);
   3597
   3598	return idx;
   3599}
   3600
   3601#define NIU_TX_WAKEUP_THRESH(rp)		((rp)->pending / 4)
   3602
   3603static void niu_tx_work(struct niu *np, struct tx_ring_info *rp)
   3604{
   3605	struct netdev_queue *txq;
   3606	u16 pkt_cnt, tmp;
   3607	int cons, index;
   3608	u64 cs;
   3609
   3610	index = (rp - np->tx_rings);
   3611	txq = netdev_get_tx_queue(np->dev, index);
   3612
   3613	cs = rp->tx_cs;
   3614	if (unlikely(!(cs & (TX_CS_MK | TX_CS_MMK))))
   3615		goto out;
   3616
   3617	tmp = pkt_cnt = (cs & TX_CS_PKT_CNT) >> TX_CS_PKT_CNT_SHIFT;
   3618	pkt_cnt = (pkt_cnt - rp->last_pkt_cnt) &
   3619		(TX_CS_PKT_CNT >> TX_CS_PKT_CNT_SHIFT);
   3620
   3621	rp->last_pkt_cnt = tmp;
   3622
   3623	cons = rp->cons;
   3624
   3625	netif_printk(np, tx_done, KERN_DEBUG, np->dev,
   3626		     "%s() pkt_cnt[%u] cons[%d]\n", __func__, pkt_cnt, cons);
   3627
   3628	while (pkt_cnt--)
   3629		cons = release_tx_packet(np, rp, cons);
   3630
   3631	rp->cons = cons;
   3632	smp_mb();
   3633
   3634out:
   3635	if (unlikely(netif_tx_queue_stopped(txq) &&
   3636		     (niu_tx_avail(rp) > NIU_TX_WAKEUP_THRESH(rp)))) {
   3637		__netif_tx_lock(txq, smp_processor_id());
   3638		if (netif_tx_queue_stopped(txq) &&
   3639		    (niu_tx_avail(rp) > NIU_TX_WAKEUP_THRESH(rp)))
   3640			netif_tx_wake_queue(txq);
   3641		__netif_tx_unlock(txq);
   3642	}
   3643}
   3644
   3645static inline void niu_sync_rx_discard_stats(struct niu *np,
   3646					     struct rx_ring_info *rp,
   3647					     const int limit)
   3648{
   3649	/* This elaborate scheme is needed for reading the RX discard
   3650	 * counters, as they are only 16-bit and can overflow quickly,
   3651	 * and because the overflow indication bit is not usable as
   3652	 * the counter value does not wrap, but remains at max value
   3653	 * 0xFFFF.
   3654	 *
   3655	 * In theory and in practice counters can be lost in between
   3656	 * reading nr64() and clearing the counter nw64().  For this
   3657	 * reason, the number of counter clearings nw64() is
   3658	 * limited/reduced though the limit parameter.
   3659	 */
   3660	int rx_channel = rp->rx_channel;
   3661	u32 misc, wred;
   3662
   3663	/* RXMISC (Receive Miscellaneous Discard Count), covers the
   3664	 * following discard events: IPP (Input Port Process),
   3665	 * FFLP/TCAM, Full RCR (Receive Completion Ring) RBR (Receive
   3666	 * Block Ring) prefetch buffer is empty.
   3667	 */
   3668	misc = nr64(RXMISC(rx_channel));
   3669	if (unlikely((misc & RXMISC_COUNT) > limit)) {
   3670		nw64(RXMISC(rx_channel), 0);
   3671		rp->rx_errors += misc & RXMISC_COUNT;
   3672
   3673		if (unlikely(misc & RXMISC_OFLOW))
   3674			dev_err(np->device, "rx-%d: Counter overflow RXMISC discard\n",
   3675				rx_channel);
   3676
   3677		netif_printk(np, rx_err, KERN_DEBUG, np->dev,
   3678			     "rx-%d: MISC drop=%u over=%u\n",
   3679			     rx_channel, misc, misc-limit);
   3680	}
   3681
   3682	/* WRED (Weighted Random Early Discard) by hardware */
   3683	wred = nr64(RED_DIS_CNT(rx_channel));
   3684	if (unlikely((wred & RED_DIS_CNT_COUNT) > limit)) {
   3685		nw64(RED_DIS_CNT(rx_channel), 0);
   3686		rp->rx_dropped += wred & RED_DIS_CNT_COUNT;
   3687
   3688		if (unlikely(wred & RED_DIS_CNT_OFLOW))
   3689			dev_err(np->device, "rx-%d: Counter overflow WRED discard\n", rx_channel);
   3690
   3691		netif_printk(np, rx_err, KERN_DEBUG, np->dev,
   3692			     "rx-%d: WRED drop=%u over=%u\n",
   3693			     rx_channel, wred, wred-limit);
   3694	}
   3695}
   3696
   3697static int niu_rx_work(struct napi_struct *napi, struct niu *np,
   3698		       struct rx_ring_info *rp, int budget)
   3699{
   3700	int qlen, rcr_done = 0, work_done = 0;
   3701	struct rxdma_mailbox *mbox = rp->mbox;
   3702	u64 stat;
   3703
   3704#if 1
   3705	stat = nr64(RX_DMA_CTL_STAT(rp->rx_channel));
   3706	qlen = nr64(RCRSTAT_A(rp->rx_channel)) & RCRSTAT_A_QLEN;
   3707#else
   3708	stat = le64_to_cpup(&mbox->rx_dma_ctl_stat);
   3709	qlen = (le64_to_cpup(&mbox->rcrstat_a) & RCRSTAT_A_QLEN);
   3710#endif
   3711	mbox->rx_dma_ctl_stat = 0;
   3712	mbox->rcrstat_a = 0;
   3713
   3714	netif_printk(np, rx_status, KERN_DEBUG, np->dev,
   3715		     "%s(chan[%d]), stat[%llx] qlen=%d\n",
   3716		     __func__, rp->rx_channel, (unsigned long long)stat, qlen);
   3717
   3718	rcr_done = work_done = 0;
   3719	qlen = min(qlen, budget);
   3720	while (work_done < qlen) {
   3721		rcr_done += niu_process_rx_pkt(napi, np, rp);
   3722		work_done++;
   3723	}
   3724
   3725	if (rp->rbr_refill_pending >= rp->rbr_kick_thresh) {
   3726		unsigned int i;
   3727
   3728		for (i = 0; i < rp->rbr_refill_pending; i++)
   3729			niu_rbr_refill(np, rp, GFP_ATOMIC);
   3730		rp->rbr_refill_pending = 0;
   3731	}
   3732
   3733	stat = (RX_DMA_CTL_STAT_MEX |
   3734		((u64)work_done << RX_DMA_CTL_STAT_PKTREAD_SHIFT) |
   3735		((u64)rcr_done << RX_DMA_CTL_STAT_PTRREAD_SHIFT));
   3736
   3737	nw64(RX_DMA_CTL_STAT(rp->rx_channel), stat);
   3738
   3739	/* Only sync discards stats when qlen indicate potential for drops */
   3740	if (qlen > 10)
   3741		niu_sync_rx_discard_stats(np, rp, 0x7FFF);
   3742
   3743	return work_done;
   3744}
   3745
   3746static int niu_poll_core(struct niu *np, struct niu_ldg *lp, int budget)
   3747{
   3748	u64 v0 = lp->v0;
   3749	u32 tx_vec = (v0 >> 32);
   3750	u32 rx_vec = (v0 & 0xffffffff);
   3751	int i, work_done = 0;
   3752
   3753	netif_printk(np, intr, KERN_DEBUG, np->dev,
   3754		     "%s() v0[%016llx]\n", __func__, (unsigned long long)v0);
   3755
   3756	for (i = 0; i < np->num_tx_rings; i++) {
   3757		struct tx_ring_info *rp = &np->tx_rings[i];
   3758		if (tx_vec & (1 << rp->tx_channel))
   3759			niu_tx_work(np, rp);
   3760		nw64(LD_IM0(LDN_TXDMA(rp->tx_channel)), 0);
   3761	}
   3762
   3763	for (i = 0; i < np->num_rx_rings; i++) {
   3764		struct rx_ring_info *rp = &np->rx_rings[i];
   3765
   3766		if (rx_vec & (1 << rp->rx_channel)) {
   3767			int this_work_done;
   3768
   3769			this_work_done = niu_rx_work(&lp->napi, np, rp,
   3770						     budget);
   3771
   3772			budget -= this_work_done;
   3773			work_done += this_work_done;
   3774		}
   3775		nw64(LD_IM0(LDN_RXDMA(rp->rx_channel)), 0);
   3776	}
   3777
   3778	return work_done;
   3779}
   3780
   3781static int niu_poll(struct napi_struct *napi, int budget)
   3782{
   3783	struct niu_ldg *lp = container_of(napi, struct niu_ldg, napi);
   3784	struct niu *np = lp->np;
   3785	int work_done;
   3786
   3787	work_done = niu_poll_core(np, lp, budget);
   3788
   3789	if (work_done < budget) {
   3790		napi_complete_done(napi, work_done);
   3791		niu_ldg_rearm(np, lp, 1);
   3792	}
   3793	return work_done;
   3794}
   3795
   3796static void niu_log_rxchan_errors(struct niu *np, struct rx_ring_info *rp,
   3797				  u64 stat)
   3798{
   3799	netdev_err(np->dev, "RX channel %u errors ( ", rp->rx_channel);
   3800
   3801	if (stat & RX_DMA_CTL_STAT_RBR_TMOUT)
   3802		pr_cont("RBR_TMOUT ");
   3803	if (stat & RX_DMA_CTL_STAT_RSP_CNT_ERR)
   3804		pr_cont("RSP_CNT ");
   3805	if (stat & RX_DMA_CTL_STAT_BYTE_EN_BUS)
   3806		pr_cont("BYTE_EN_BUS ");
   3807	if (stat & RX_DMA_CTL_STAT_RSP_DAT_ERR)
   3808		pr_cont("RSP_DAT ");
   3809	if (stat & RX_DMA_CTL_STAT_RCR_ACK_ERR)
   3810		pr_cont("RCR_ACK ");
   3811	if (stat & RX_DMA_CTL_STAT_RCR_SHA_PAR)
   3812		pr_cont("RCR_SHA_PAR ");
   3813	if (stat & RX_DMA_CTL_STAT_RBR_PRE_PAR)
   3814		pr_cont("RBR_PRE_PAR ");
   3815	if (stat & RX_DMA_CTL_STAT_CONFIG_ERR)
   3816		pr_cont("CONFIG ");
   3817	if (stat & RX_DMA_CTL_STAT_RCRINCON)
   3818		pr_cont("RCRINCON ");
   3819	if (stat & RX_DMA_CTL_STAT_RCRFULL)
   3820		pr_cont("RCRFULL ");
   3821	if (stat & RX_DMA_CTL_STAT_RBRFULL)
   3822		pr_cont("RBRFULL ");
   3823	if (stat & RX_DMA_CTL_STAT_RBRLOGPAGE)
   3824		pr_cont("RBRLOGPAGE ");
   3825	if (stat & RX_DMA_CTL_STAT_CFIGLOGPAGE)
   3826		pr_cont("CFIGLOGPAGE ");
   3827	if (stat & RX_DMA_CTL_STAT_DC_FIFO_ERR)
   3828		pr_cont("DC_FIDO ");
   3829
   3830	pr_cont(")\n");
   3831}
   3832
   3833static int niu_rx_error(struct niu *np, struct rx_ring_info *rp)
   3834{
   3835	u64 stat = nr64(RX_DMA_CTL_STAT(rp->rx_channel));
   3836	int err = 0;
   3837
   3838
   3839	if (stat & (RX_DMA_CTL_STAT_CHAN_FATAL |
   3840		    RX_DMA_CTL_STAT_PORT_FATAL))
   3841		err = -EINVAL;
   3842
   3843	if (err) {
   3844		netdev_err(np->dev, "RX channel %u error, stat[%llx]\n",
   3845			   rp->rx_channel,
   3846			   (unsigned long long) stat);
   3847
   3848		niu_log_rxchan_errors(np, rp, stat);
   3849	}
   3850
   3851	nw64(RX_DMA_CTL_STAT(rp->rx_channel),
   3852	     stat & RX_DMA_CTL_WRITE_CLEAR_ERRS);
   3853
   3854	return err;
   3855}
   3856
   3857static void niu_log_txchan_errors(struct niu *np, struct tx_ring_info *rp,
   3858				  u64 cs)
   3859{
   3860	netdev_err(np->dev, "TX channel %u errors ( ", rp->tx_channel);
   3861
   3862	if (cs & TX_CS_MBOX_ERR)
   3863		pr_cont("MBOX ");
   3864	if (cs & TX_CS_PKT_SIZE_ERR)
   3865		pr_cont("PKT_SIZE ");
   3866	if (cs & TX_CS_TX_RING_OFLOW)
   3867		pr_cont("TX_RING_OFLOW ");
   3868	if (cs & TX_CS_PREF_BUF_PAR_ERR)
   3869		pr_cont("PREF_BUF_PAR ");
   3870	if (cs & TX_CS_NACK_PREF)
   3871		pr_cont("NACK_PREF ");
   3872	if (cs & TX_CS_NACK_PKT_RD)
   3873		pr_cont("NACK_PKT_RD ");
   3874	if (cs & TX_CS_CONF_PART_ERR)
   3875		pr_cont("CONF_PART ");
   3876	if (cs & TX_CS_PKT_PRT_ERR)
   3877		pr_cont("PKT_PTR ");
   3878
   3879	pr_cont(")\n");
   3880}
   3881
   3882static int niu_tx_error(struct niu *np, struct tx_ring_info *rp)
   3883{
   3884	u64 cs, logh, logl;
   3885
   3886	cs = nr64(TX_CS(rp->tx_channel));
   3887	logh = nr64(TX_RNG_ERR_LOGH(rp->tx_channel));
   3888	logl = nr64(TX_RNG_ERR_LOGL(rp->tx_channel));
   3889
   3890	netdev_err(np->dev, "TX channel %u error, cs[%llx] logh[%llx] logl[%llx]\n",
   3891		   rp->tx_channel,
   3892		   (unsigned long long)cs,
   3893		   (unsigned long long)logh,
   3894		   (unsigned long long)logl);
   3895
   3896	niu_log_txchan_errors(np, rp, cs);
   3897
   3898	return -ENODEV;
   3899}
   3900
   3901static int niu_mif_interrupt(struct niu *np)
   3902{
   3903	u64 mif_status = nr64(MIF_STATUS);
   3904	int phy_mdint = 0;
   3905
   3906	if (np->flags & NIU_FLAGS_XMAC) {
   3907		u64 xrxmac_stat = nr64_mac(XRXMAC_STATUS);
   3908
   3909		if (xrxmac_stat & XRXMAC_STATUS_PHY_MDINT)
   3910			phy_mdint = 1;
   3911	}
   3912
   3913	netdev_err(np->dev, "MIF interrupt, stat[%llx] phy_mdint(%d)\n",
   3914		   (unsigned long long)mif_status, phy_mdint);
   3915
   3916	return -ENODEV;
   3917}
   3918
   3919static void niu_xmac_interrupt(struct niu *np)
   3920{
   3921	struct niu_xmac_stats *mp = &np->mac_stats.xmac;
   3922	u64 val;
   3923
   3924	val = nr64_mac(XTXMAC_STATUS);
   3925	if (val & XTXMAC_STATUS_FRAME_CNT_EXP)
   3926		mp->tx_frames += TXMAC_FRM_CNT_COUNT;
   3927	if (val & XTXMAC_STATUS_BYTE_CNT_EXP)
   3928		mp->tx_bytes += TXMAC_BYTE_CNT_COUNT;
   3929	if (val & XTXMAC_STATUS_TXFIFO_XFR_ERR)
   3930		mp->tx_fifo_errors++;
   3931	if (val & XTXMAC_STATUS_TXMAC_OFLOW)
   3932		mp->tx_overflow_errors++;
   3933	if (val & XTXMAC_STATUS_MAX_PSIZE_ERR)
   3934		mp->tx_max_pkt_size_errors++;
   3935	if (val & XTXMAC_STATUS_TXMAC_UFLOW)
   3936		mp->tx_underflow_errors++;
   3937
   3938	val = nr64_mac(XRXMAC_STATUS);
   3939	if (val & XRXMAC_STATUS_LCL_FLT_STATUS)
   3940		mp->rx_local_faults++;
   3941	if (val & XRXMAC_STATUS_RFLT_DET)
   3942		mp->rx_remote_faults++;
   3943	if (val & XRXMAC_STATUS_LFLT_CNT_EXP)
   3944		mp->rx_link_faults += LINK_FAULT_CNT_COUNT;
   3945	if (val & XRXMAC_STATUS_ALIGNERR_CNT_EXP)
   3946		mp->rx_align_errors += RXMAC_ALIGN_ERR_CNT_COUNT;
   3947	if (val & XRXMAC_STATUS_RXFRAG_CNT_EXP)
   3948		mp->rx_frags += RXMAC_FRAG_CNT_COUNT;
   3949	if (val & XRXMAC_STATUS_RXMULTF_CNT_EXP)
   3950		mp->rx_mcasts += RXMAC_MC_FRM_CNT_COUNT;
   3951	if (val & XRXMAC_STATUS_RXBCAST_CNT_EXP)
   3952		mp->rx_bcasts += RXMAC_BC_FRM_CNT_COUNT;
   3953	if (val & XRXMAC_STATUS_RXHIST1_CNT_EXP)
   3954		mp->rx_hist_cnt1 += RXMAC_HIST_CNT1_COUNT;
   3955	if (val & XRXMAC_STATUS_RXHIST2_CNT_EXP)
   3956		mp->rx_hist_cnt2 += RXMAC_HIST_CNT2_COUNT;
   3957	if (val & XRXMAC_STATUS_RXHIST3_CNT_EXP)
   3958		mp->rx_hist_cnt3 += RXMAC_HIST_CNT3_COUNT;
   3959	if (val & XRXMAC_STATUS_RXHIST4_CNT_EXP)
   3960		mp->rx_hist_cnt4 += RXMAC_HIST_CNT4_COUNT;
   3961	if (val & XRXMAC_STATUS_RXHIST5_CNT_EXP)
   3962		mp->rx_hist_cnt5 += RXMAC_HIST_CNT5_COUNT;
   3963	if (val & XRXMAC_STATUS_RXHIST6_CNT_EXP)
   3964		mp->rx_hist_cnt6 += RXMAC_HIST_CNT6_COUNT;
   3965	if (val & XRXMAC_STATUS_RXHIST7_CNT_EXP)
   3966		mp->rx_hist_cnt7 += RXMAC_HIST_CNT7_COUNT;
   3967	if (val & XRXMAC_STATUS_RXOCTET_CNT_EXP)
   3968		mp->rx_octets += RXMAC_BT_CNT_COUNT;
   3969	if (val & XRXMAC_STATUS_CVIOLERR_CNT_EXP)
   3970		mp->rx_code_violations += RXMAC_CD_VIO_CNT_COUNT;
   3971	if (val & XRXMAC_STATUS_LENERR_CNT_EXP)
   3972		mp->rx_len_errors += RXMAC_MPSZER_CNT_COUNT;
   3973	if (val & XRXMAC_STATUS_CRCERR_CNT_EXP)
   3974		mp->rx_crc_errors += RXMAC_CRC_ER_CNT_COUNT;
   3975	if (val & XRXMAC_STATUS_RXUFLOW)
   3976		mp->rx_underflows++;
   3977	if (val & XRXMAC_STATUS_RXOFLOW)
   3978		mp->rx_overflows++;
   3979
   3980	val = nr64_mac(XMAC_FC_STAT);
   3981	if (val & XMAC_FC_STAT_TX_MAC_NPAUSE)
   3982		mp->pause_off_state++;
   3983	if (val & XMAC_FC_STAT_TX_MAC_PAUSE)
   3984		mp->pause_on_state++;
   3985	if (val & XMAC_FC_STAT_RX_MAC_RPAUSE)
   3986		mp->pause_received++;
   3987}
   3988
   3989static void niu_bmac_interrupt(struct niu *np)
   3990{
   3991	struct niu_bmac_stats *mp = &np->mac_stats.bmac;
   3992	u64 val;
   3993
   3994	val = nr64_mac(BTXMAC_STATUS);
   3995	if (val & BTXMAC_STATUS_UNDERRUN)
   3996		mp->tx_underflow_errors++;
   3997	if (val & BTXMAC_STATUS_MAX_PKT_ERR)
   3998		mp->tx_max_pkt_size_errors++;
   3999	if (val & BTXMAC_STATUS_BYTE_CNT_EXP)
   4000		mp->tx_bytes += BTXMAC_BYTE_CNT_COUNT;
   4001	if (val & BTXMAC_STATUS_FRAME_CNT_EXP)
   4002		mp->tx_frames += BTXMAC_FRM_CNT_COUNT;
   4003
   4004	val = nr64_mac(BRXMAC_STATUS);
   4005	if (val & BRXMAC_STATUS_OVERFLOW)
   4006		mp->rx_overflows++;
   4007	if (val & BRXMAC_STATUS_FRAME_CNT_EXP)
   4008		mp->rx_frames += BRXMAC_FRAME_CNT_COUNT;
   4009	if (val & BRXMAC_STATUS_ALIGN_ERR_EXP)
   4010		mp->rx_align_errors += BRXMAC_ALIGN_ERR_CNT_COUNT;
   4011	if (val & BRXMAC_STATUS_CRC_ERR_EXP)
   4012		mp->rx_crc_errors += BRXMAC_ALIGN_ERR_CNT_COUNT;
   4013	if (val & BRXMAC_STATUS_LEN_ERR_EXP)
   4014		mp->rx_len_errors += BRXMAC_CODE_VIOL_ERR_CNT_COUNT;
   4015
   4016	val = nr64_mac(BMAC_CTRL_STATUS);
   4017	if (val & BMAC_CTRL_STATUS_NOPAUSE)
   4018		mp->pause_off_state++;
   4019	if (val & BMAC_CTRL_STATUS_PAUSE)
   4020		mp->pause_on_state++;
   4021	if (val & BMAC_CTRL_STATUS_PAUSE_RECV)
   4022		mp->pause_received++;
   4023}
   4024
   4025static int niu_mac_interrupt(struct niu *np)
   4026{
   4027	if (np->flags & NIU_FLAGS_XMAC)
   4028		niu_xmac_interrupt(np);
   4029	else
   4030		niu_bmac_interrupt(np);
   4031
   4032	return 0;
   4033}
   4034
   4035static void niu_log_device_error(struct niu *np, u64 stat)
   4036{
   4037	netdev_err(np->dev, "Core device errors ( ");
   4038
   4039	if (stat & SYS_ERR_MASK_META2)
   4040		pr_cont("META2 ");
   4041	if (stat & SYS_ERR_MASK_META1)
   4042		pr_cont("META1 ");
   4043	if (stat & SYS_ERR_MASK_PEU)
   4044		pr_cont("PEU ");
   4045	if (stat & SYS_ERR_MASK_TXC)
   4046		pr_cont("TXC ");
   4047	if (stat & SYS_ERR_MASK_RDMC)
   4048		pr_cont("RDMC ");
   4049	if (stat & SYS_ERR_MASK_TDMC)
   4050		pr_cont("TDMC ");
   4051	if (stat & SYS_ERR_MASK_ZCP)
   4052		pr_cont("ZCP ");
   4053	if (stat & SYS_ERR_MASK_FFLP)
   4054		pr_cont("FFLP ");
   4055	if (stat & SYS_ERR_MASK_IPP)
   4056		pr_cont("IPP ");
   4057	if (stat & SYS_ERR_MASK_MAC)
   4058		pr_cont("MAC ");
   4059	if (stat & SYS_ERR_MASK_SMX)
   4060		pr_cont("SMX ");
   4061
   4062	pr_cont(")\n");
   4063}
   4064
   4065static int niu_device_error(struct niu *np)
   4066{
   4067	u64 stat = nr64(SYS_ERR_STAT);
   4068
   4069	netdev_err(np->dev, "Core device error, stat[%llx]\n",
   4070		   (unsigned long long)stat);
   4071
   4072	niu_log_device_error(np, stat);
   4073
   4074	return -ENODEV;
   4075}
   4076
   4077static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp,
   4078			      u64 v0, u64 v1, u64 v2)
   4079{
   4080
   4081	int i, err = 0;
   4082
   4083	lp->v0 = v0;
   4084	lp->v1 = v1;
   4085	lp->v2 = v2;
   4086
   4087	if (v1 & 0x00000000ffffffffULL) {
   4088		u32 rx_vec = (v1 & 0xffffffff);
   4089
   4090		for (i = 0; i < np->num_rx_rings; i++) {
   4091			struct rx_ring_info *rp = &np->rx_rings[i];
   4092
   4093			if (rx_vec & (1 << rp->rx_channel)) {
   4094				int r = niu_rx_error(np, rp);
   4095				if (r) {
   4096					err = r;
   4097				} else {
   4098					if (!v0)
   4099						nw64(RX_DMA_CTL_STAT(rp->rx_channel),
   4100						     RX_DMA_CTL_STAT_MEX);
   4101				}
   4102			}
   4103		}
   4104	}
   4105	if (v1 & 0x7fffffff00000000ULL) {
   4106		u32 tx_vec = (v1 >> 32) & 0x7fffffff;
   4107
   4108		for (i = 0; i < np->num_tx_rings; i++) {
   4109			struct tx_ring_info *rp = &np->tx_rings[i];
   4110
   4111			if (tx_vec & (1 << rp->tx_channel)) {
   4112				int r = niu_tx_error(np, rp);
   4113				if (r)
   4114					err = r;
   4115			}
   4116		}
   4117	}
   4118	if ((v0 | v1) & 0x8000000000000000ULL) {
   4119		int r = niu_mif_interrupt(np);
   4120		if (r)
   4121			err = r;
   4122	}
   4123	if (v2) {
   4124		if (v2 & 0x01ef) {
   4125			int r = niu_mac_interrupt(np);
   4126			if (r)
   4127				err = r;
   4128		}
   4129		if (v2 & 0x0210) {
   4130			int r = niu_device_error(np);
   4131			if (r)
   4132				err = r;
   4133		}
   4134	}
   4135
   4136	if (err)
   4137		niu_enable_interrupts(np, 0);
   4138
   4139	return err;
   4140}
   4141
   4142static void niu_rxchan_intr(struct niu *np, struct rx_ring_info *rp,
   4143			    int ldn)
   4144{
   4145	struct rxdma_mailbox *mbox = rp->mbox;
   4146	u64 stat_write, stat = le64_to_cpup(&mbox->rx_dma_ctl_stat);
   4147
   4148	stat_write = (RX_DMA_CTL_STAT_RCRTHRES |
   4149		      RX_DMA_CTL_STAT_RCRTO);
   4150	nw64(RX_DMA_CTL_STAT(rp->rx_channel), stat_write);
   4151
   4152	netif_printk(np, intr, KERN_DEBUG, np->dev,
   4153		     "%s() stat[%llx]\n", __func__, (unsigned long long)stat);
   4154}
   4155
   4156static void niu_txchan_intr(struct niu *np, struct tx_ring_info *rp,
   4157			    int ldn)
   4158{
   4159	rp->tx_cs = nr64(TX_CS(rp->tx_channel));
   4160
   4161	netif_printk(np, intr, KERN_DEBUG, np->dev,
   4162		     "%s() cs[%llx]\n", __func__, (unsigned long long)rp->tx_cs);
   4163}
   4164
   4165static void __niu_fastpath_interrupt(struct niu *np, int ldg, u64 v0)
   4166{
   4167	struct niu_parent *parent = np->parent;
   4168	u32 rx_vec, tx_vec;
   4169	int i;
   4170
   4171	tx_vec = (v0 >> 32);
   4172	rx_vec = (v0 & 0xffffffff);
   4173
   4174	for (i = 0; i < np->num_rx_rings; i++) {
   4175		struct rx_ring_info *rp = &np->rx_rings[i];
   4176		int ldn = LDN_RXDMA(rp->rx_channel);
   4177
   4178		if (parent->ldg_map[ldn] != ldg)
   4179			continue;
   4180
   4181		nw64(LD_IM0(ldn), LD_IM0_MASK);
   4182		if (rx_vec & (1 << rp->rx_channel))
   4183			niu_rxchan_intr(np, rp, ldn);
   4184	}
   4185
   4186	for (i = 0; i < np->num_tx_rings; i++) {
   4187		struct tx_ring_info *rp = &np->tx_rings[i];
   4188		int ldn = LDN_TXDMA(rp->tx_channel);
   4189
   4190		if (parent->ldg_map[ldn] != ldg)
   4191			continue;
   4192
   4193		nw64(LD_IM0(ldn), LD_IM0_MASK);
   4194		if (tx_vec & (1 << rp->tx_channel))
   4195			niu_txchan_intr(np, rp, ldn);
   4196	}
   4197}
   4198
   4199static void niu_schedule_napi(struct niu *np, struct niu_ldg *lp,
   4200			      u64 v0, u64 v1, u64 v2)
   4201{
   4202	if (likely(napi_schedule_prep(&lp->napi))) {
   4203		lp->v0 = v0;
   4204		lp->v1 = v1;
   4205		lp->v2 = v2;
   4206		__niu_fastpath_interrupt(np, lp->ldg_num, v0);
   4207		__napi_schedule(&lp->napi);
   4208	}
   4209}
   4210
   4211static irqreturn_t niu_interrupt(int irq, void *dev_id)
   4212{
   4213	struct niu_ldg *lp = dev_id;
   4214	struct niu *np = lp->np;
   4215	int ldg = lp->ldg_num;
   4216	unsigned long flags;
   4217	u64 v0, v1, v2;
   4218
   4219	if (netif_msg_intr(np))
   4220		printk(KERN_DEBUG KBUILD_MODNAME ": " "%s() ldg[%p](%d)",
   4221		       __func__, lp, ldg);
   4222
   4223	spin_lock_irqsave(&np->lock, flags);
   4224
   4225	v0 = nr64(LDSV0(ldg));
   4226	v1 = nr64(LDSV1(ldg));
   4227	v2 = nr64(LDSV2(ldg));
   4228
   4229	if (netif_msg_intr(np))
   4230		pr_cont(" v0[%llx] v1[%llx] v2[%llx]\n",
   4231		       (unsigned long long) v0,
   4232		       (unsigned long long) v1,
   4233		       (unsigned long long) v2);
   4234
   4235	if (unlikely(!v0 && !v1 && !v2)) {
   4236		spin_unlock_irqrestore(&np->lock, flags);
   4237		return IRQ_NONE;
   4238	}
   4239
   4240	if (unlikely((v0 & ((u64)1 << LDN_MIF)) || v1 || v2)) {
   4241		int err = niu_slowpath_interrupt(np, lp, v0, v1, v2);
   4242		if (err)
   4243			goto out;
   4244	}
   4245	if (likely(v0 & ~((u64)1 << LDN_MIF)))
   4246		niu_schedule_napi(np, lp, v0, v1, v2);
   4247	else
   4248		niu_ldg_rearm(np, lp, 1);
   4249out:
   4250	spin_unlock_irqrestore(&np->lock, flags);
   4251
   4252	return IRQ_HANDLED;
   4253}
   4254
   4255static void niu_free_rx_ring_info(struct niu *np, struct rx_ring_info *rp)
   4256{
   4257	if (rp->mbox) {
   4258		np->ops->free_coherent(np->device,
   4259				       sizeof(struct rxdma_mailbox),
   4260				       rp->mbox, rp->mbox_dma);
   4261		rp->mbox = NULL;
   4262	}
   4263	if (rp->rcr) {
   4264		np->ops->free_coherent(np->device,
   4265				       MAX_RCR_RING_SIZE * sizeof(__le64),
   4266				       rp->rcr, rp->rcr_dma);
   4267		rp->rcr = NULL;
   4268		rp->rcr_table_size = 0;
   4269		rp->rcr_index = 0;
   4270	}
   4271	if (rp->rbr) {
   4272		niu_rbr_free(np, rp);
   4273
   4274		np->ops->free_coherent(np->device,
   4275				       MAX_RBR_RING_SIZE * sizeof(__le32),
   4276				       rp->rbr, rp->rbr_dma);
   4277		rp->rbr = NULL;
   4278		rp->rbr_table_size = 0;
   4279		rp->rbr_index = 0;
   4280	}
   4281	kfree(rp->rxhash);
   4282	rp->rxhash = NULL;
   4283}
   4284
   4285static void niu_free_tx_ring_info(struct niu *np, struct tx_ring_info *rp)
   4286{
   4287	if (rp->mbox) {
   4288		np->ops->free_coherent(np->device,
   4289				       sizeof(struct txdma_mailbox),
   4290				       rp->mbox, rp->mbox_dma);
   4291		rp->mbox = NULL;
   4292	}
   4293	if (rp->descr) {
   4294		int i;
   4295
   4296		for (i = 0; i < MAX_TX_RING_SIZE; i++) {
   4297			if (rp->tx_buffs[i].skb)
   4298				(void) release_tx_packet(np, rp, i);
   4299		}
   4300
   4301		np->ops->free_coherent(np->device,
   4302				       MAX_TX_RING_SIZE * sizeof(__le64),
   4303				       rp->descr, rp->descr_dma);
   4304		rp->descr = NULL;
   4305		rp->pending = 0;
   4306		rp->prod = 0;
   4307		rp->cons = 0;
   4308		rp->wrap_bit = 0;
   4309	}
   4310}
   4311
   4312static void niu_free_channels(struct niu *np)
   4313{
   4314	int i;
   4315
   4316	if (np->rx_rings) {
   4317		for (i = 0; i < np->num_rx_rings; i++) {
   4318			struct rx_ring_info *rp = &np->rx_rings[i];
   4319
   4320			niu_free_rx_ring_info(np, rp);
   4321		}
   4322		kfree(np->rx_rings);
   4323		np->rx_rings = NULL;
   4324		np->num_rx_rings = 0;
   4325	}
   4326
   4327	if (np->tx_rings) {
   4328		for (i = 0; i < np->num_tx_rings; i++) {
   4329			struct tx_ring_info *rp = &np->tx_rings[i];
   4330
   4331			niu_free_tx_ring_info(np, rp);
   4332		}
   4333		kfree(np->tx_rings);
   4334		np->tx_rings = NULL;
   4335		np->num_tx_rings = 0;
   4336	}
   4337}
   4338
   4339static int niu_alloc_rx_ring_info(struct niu *np,
   4340				  struct rx_ring_info *rp)
   4341{
   4342	BUILD_BUG_ON(sizeof(struct rxdma_mailbox) != 64);
   4343
   4344	rp->rxhash = kcalloc(MAX_RBR_RING_SIZE, sizeof(struct page *),
   4345			     GFP_KERNEL);
   4346	if (!rp->rxhash)
   4347		return -ENOMEM;
   4348
   4349	rp->mbox = np->ops->alloc_coherent(np->device,
   4350					   sizeof(struct rxdma_mailbox),
   4351					   &rp->mbox_dma, GFP_KERNEL);
   4352	if (!rp->mbox)
   4353		return -ENOMEM;
   4354	if ((unsigned long)rp->mbox & (64UL - 1)) {
   4355		netdev_err(np->dev, "Coherent alloc gives misaligned RXDMA mailbox %p\n",
   4356			   rp->mbox);
   4357		return -EINVAL;
   4358	}
   4359
   4360	rp->rcr = np->ops->alloc_coherent(np->device,
   4361					  MAX_RCR_RING_SIZE * sizeof(__le64),
   4362					  &rp->rcr_dma, GFP_KERNEL);
   4363	if (!rp->rcr)
   4364		return -ENOMEM;
   4365	if ((unsigned long)rp->rcr & (64UL - 1)) {
   4366		netdev_err(np->dev, "Coherent alloc gives misaligned RXDMA RCR table %p\n",
   4367			   rp->rcr);
   4368		return -EINVAL;
   4369	}
   4370	rp->rcr_table_size = MAX_RCR_RING_SIZE;
   4371	rp->rcr_index = 0;
   4372
   4373	rp->rbr = np->ops->alloc_coherent(np->device,
   4374					  MAX_RBR_RING_SIZE * sizeof(__le32),
   4375					  &rp->rbr_dma, GFP_KERNEL);
   4376	if (!rp->rbr)
   4377		return -ENOMEM;
   4378	if ((unsigned long)rp->rbr & (64UL - 1)) {
   4379		netdev_err(np->dev, "Coherent alloc gives misaligned RXDMA RBR table %p\n",
   4380			   rp->rbr);
   4381		return -EINVAL;
   4382	}
   4383	rp->rbr_table_size = MAX_RBR_RING_SIZE;
   4384	rp->rbr_index = 0;
   4385	rp->rbr_pending = 0;
   4386
   4387	return 0;
   4388}
   4389
   4390static void niu_set_max_burst(struct niu *np, struct tx_ring_info *rp)
   4391{
   4392	int mtu = np->dev->mtu;
   4393
   4394	/* These values are recommended by the HW designers for fair
   4395	 * utilization of DRR amongst the rings.
   4396	 */
   4397	rp->max_burst = mtu + 32;
   4398	if (rp->max_burst > 4096)
   4399		rp->max_burst = 4096;
   4400}
   4401
   4402static int niu_alloc_tx_ring_info(struct niu *np,
   4403				  struct tx_ring_info *rp)
   4404{
   4405	BUILD_BUG_ON(sizeof(struct txdma_mailbox) != 64);
   4406
   4407	rp->mbox = np->ops->alloc_coherent(np->device,
   4408					   sizeof(struct txdma_mailbox),
   4409					   &rp->mbox_dma, GFP_KERNEL);
   4410	if (!rp->mbox)
   4411		return -ENOMEM;
   4412	if ((unsigned long)rp->mbox & (64UL - 1)) {
   4413		netdev_err(np->dev, "Coherent alloc gives misaligned TXDMA mailbox %p\n",
   4414			   rp->mbox);
   4415		return -EINVAL;
   4416	}
   4417
   4418	rp->descr = np->ops->alloc_coherent(np->device,
   4419					    MAX_TX_RING_SIZE * sizeof(__le64),
   4420					    &rp->descr_dma, GFP_KERNEL);
   4421	if (!rp->descr)
   4422		return -ENOMEM;
   4423	if ((unsigned long)rp->descr & (64UL - 1)) {
   4424		netdev_err(np->dev, "Coherent alloc gives misaligned TXDMA descr table %p\n",
   4425			   rp->descr);
   4426		return -EINVAL;
   4427	}
   4428
   4429	rp->pending = MAX_TX_RING_SIZE;
   4430	rp->prod = 0;
   4431	rp->cons = 0;
   4432	rp->wrap_bit = 0;
   4433
   4434	/* XXX make these configurable... XXX */
   4435	rp->mark_freq = rp->pending / 4;
   4436
   4437	niu_set_max_burst(np, rp);
   4438
   4439	return 0;
   4440}
   4441
   4442static void niu_size_rbr(struct niu *np, struct rx_ring_info *rp)
   4443{
   4444	u16 bss;
   4445
   4446	bss = min(PAGE_SHIFT, 15);
   4447
   4448	rp->rbr_block_size = 1 << bss;
   4449	rp->rbr_blocks_per_page = 1 << (PAGE_SHIFT-bss);
   4450
   4451	rp->rbr_sizes[0] = 256;
   4452	rp->rbr_sizes[1] = 1024;
   4453	if (np->dev->mtu > ETH_DATA_LEN) {
   4454		switch (PAGE_SIZE) {
   4455		case 4 * 1024:
   4456			rp->rbr_sizes[2] = 4096;
   4457			break;
   4458
   4459		default:
   4460			rp->rbr_sizes[2] = 8192;
   4461			break;
   4462		}
   4463	} else {
   4464		rp->rbr_sizes[2] = 2048;
   4465	}
   4466	rp->rbr_sizes[3] = rp->rbr_block_size;
   4467}
   4468
   4469static int niu_alloc_channels(struct niu *np)
   4470{
   4471	struct niu_parent *parent = np->parent;
   4472	int first_rx_channel, first_tx_channel;
   4473	int num_rx_rings, num_tx_rings;
   4474	struct rx_ring_info *rx_rings;
   4475	struct tx_ring_info *tx_rings;
   4476	int i, port, err;
   4477
   4478	port = np->port;
   4479	first_rx_channel = first_tx_channel = 0;
   4480	for (i = 0; i < port; i++) {
   4481		first_rx_channel += parent->rxchan_per_port[i];
   4482		first_tx_channel += parent->txchan_per_port[i];
   4483	}
   4484
   4485	num_rx_rings = parent->rxchan_per_port[port];
   4486	num_tx_rings = parent->txchan_per_port[port];
   4487
   4488	rx_rings = kcalloc(num_rx_rings, sizeof(struct rx_ring_info),
   4489			   GFP_KERNEL);
   4490	err = -ENOMEM;
   4491	if (!rx_rings)
   4492		goto out_err;
   4493
   4494	np->num_rx_rings = num_rx_rings;
   4495	smp_wmb();
   4496	np->rx_rings = rx_rings;
   4497
   4498	netif_set_real_num_rx_queues(np->dev, num_rx_rings);
   4499
   4500	for (i = 0; i < np->num_rx_rings; i++) {
   4501		struct rx_ring_info *rp = &np->rx_rings[i];
   4502
   4503		rp->np = np;
   4504		rp->rx_channel = first_rx_channel + i;
   4505
   4506		err = niu_alloc_rx_ring_info(np, rp);
   4507		if (err)
   4508			goto out_err;
   4509
   4510		niu_size_rbr(np, rp);
   4511
   4512		/* XXX better defaults, configurable, etc... XXX */
   4513		rp->nonsyn_window = 64;
   4514		rp->nonsyn_threshold = rp->rcr_table_size - 64;
   4515		rp->syn_window = 64;
   4516		rp->syn_threshold = rp->rcr_table_size - 64;
   4517		rp->rcr_pkt_threshold = 16;
   4518		rp->rcr_timeout = 8;
   4519		rp->rbr_kick_thresh = RBR_REFILL_MIN;
   4520		if (rp->rbr_kick_thresh < rp->rbr_blocks_per_page)
   4521			rp->rbr_kick_thresh = rp->rbr_blocks_per_page;
   4522
   4523		err = niu_rbr_fill(np, rp, GFP_KERNEL);
   4524		if (err)
   4525			return err;
   4526	}
   4527
   4528	tx_rings = kcalloc(num_tx_rings, sizeof(struct tx_ring_info),
   4529			   GFP_KERNEL);
   4530	err = -ENOMEM;
   4531	if (!tx_rings)
   4532		goto out_err;
   4533
   4534	np->num_tx_rings = num_tx_rings;
   4535	smp_wmb();
   4536	np->tx_rings = tx_rings;
   4537
   4538	netif_set_real_num_tx_queues(np->dev, num_tx_rings);
   4539
   4540	for (i = 0; i < np->num_tx_rings; i++) {
   4541		struct tx_ring_info *rp = &np->tx_rings[i];
   4542
   4543		rp->np = np;
   4544		rp->tx_channel = first_tx_channel + i;
   4545
   4546		err = niu_alloc_tx_ring_info(np, rp);
   4547		if (err)
   4548			goto out_err;
   4549	}
   4550
   4551	return 0;
   4552
   4553out_err:
   4554	niu_free_channels(np);
   4555	return err;
   4556}
   4557
   4558static int niu_tx_cs_sng_poll(struct niu *np, int channel)
   4559{
   4560	int limit = 1000;
   4561
   4562	while (--limit > 0) {
   4563		u64 val = nr64(TX_CS(channel));
   4564		if (val & TX_CS_SNG_STATE)
   4565			return 0;
   4566	}
   4567	return -ENODEV;
   4568}
   4569
   4570static int niu_tx_channel_stop(struct niu *np, int channel)
   4571{
   4572	u64 val = nr64(TX_CS(channel));
   4573
   4574	val |= TX_CS_STOP_N_GO;
   4575	nw64(TX_CS(channel), val);
   4576
   4577	return niu_tx_cs_sng_poll(np, channel);
   4578}
   4579
   4580static int niu_tx_cs_reset_poll(struct niu *np, int channel)
   4581{
   4582	int limit = 1000;
   4583
   4584	while (--limit > 0) {
   4585		u64 val = nr64(TX_CS(channel));
   4586		if (!(val & TX_CS_RST))
   4587			return 0;
   4588	}
   4589	return -ENODEV;
   4590}
   4591
   4592static int niu_tx_channel_reset(struct niu *np, int channel)
   4593{
   4594	u64 val = nr64(TX_CS(channel));
   4595	int err;
   4596
   4597	val |= TX_CS_RST;
   4598	nw64(TX_CS(channel), val);
   4599
   4600	err = niu_tx_cs_reset_poll(np, channel);
   4601	if (!err)
   4602		nw64(TX_RING_KICK(channel), 0);
   4603
   4604	return err;
   4605}
   4606
   4607static int niu_tx_channel_lpage_init(struct niu *np, int channel)
   4608{
   4609	u64 val;
   4610
   4611	nw64(TX_LOG_MASK1(channel), 0);
   4612	nw64(TX_LOG_VAL1(channel), 0);
   4613	nw64(TX_LOG_MASK2(channel), 0);
   4614	nw64(TX_LOG_VAL2(channel), 0);
   4615	nw64(TX_LOG_PAGE_RELO1(channel), 0);
   4616	nw64(TX_LOG_PAGE_RELO2(channel), 0);
   4617	nw64(TX_LOG_PAGE_HDL(channel), 0);
   4618
   4619	val  = (u64)np->port << TX_LOG_PAGE_VLD_FUNC_SHIFT;
   4620	val |= (TX_LOG_PAGE_VLD_PAGE0 | TX_LOG_PAGE_VLD_PAGE1);
   4621	nw64(TX_LOG_PAGE_VLD(channel), val);
   4622
   4623	/* XXX TXDMA 32bit mode? XXX */
   4624
   4625	return 0;
   4626}
   4627
   4628static void niu_txc_enable_port(struct niu *np, int on)
   4629{
   4630	unsigned long flags;
   4631	u64 val, mask;
   4632
   4633	niu_lock_parent(np, flags);
   4634	val = nr64(TXC_CONTROL);
   4635	mask = (u64)1 << np->port;
   4636	if (on) {
   4637		val |= TXC_CONTROL_ENABLE | mask;
   4638	} else {
   4639		val &= ~mask;
   4640		if ((val & ~TXC_CONTROL_ENABLE) == 0)
   4641			val &= ~TXC_CONTROL_ENABLE;
   4642	}
   4643	nw64(TXC_CONTROL, val);
   4644	niu_unlock_parent(np, flags);
   4645}
   4646
   4647static void niu_txc_set_imask(struct niu *np, u64 imask)
   4648{
   4649	unsigned long flags;
   4650	u64 val;
   4651
   4652	niu_lock_parent(np, flags);
   4653	val = nr64(TXC_INT_MASK);
   4654	val &= ~TXC_INT_MASK_VAL(np->port);
   4655	val |= (imask << TXC_INT_MASK_VAL_SHIFT(np->port));
   4656	niu_unlock_parent(np, flags);
   4657}
   4658
   4659static void niu_txc_port_dma_enable(struct niu *np, int on)
   4660{
   4661	u64 val = 0;
   4662
   4663	if (on) {
   4664		int i;
   4665
   4666		for (i = 0; i < np->num_tx_rings; i++)
   4667			val |= (1 << np->tx_rings[i].tx_channel);
   4668	}
   4669	nw64(TXC_PORT_DMA(np->port), val);
   4670}
   4671
   4672static int niu_init_one_tx_channel(struct niu *np, struct tx_ring_info *rp)
   4673{
   4674	int err, channel = rp->tx_channel;
   4675	u64 val, ring_len;
   4676
   4677	err = niu_tx_channel_stop(np, channel);
   4678	if (err)
   4679		return err;
   4680
   4681	err = niu_tx_channel_reset(np, channel);
   4682	if (err)
   4683		return err;
   4684
   4685	err = niu_tx_channel_lpage_init(np, channel);
   4686	if (err)
   4687		return err;
   4688
   4689	nw64(TXC_DMA_MAX(channel), rp->max_burst);
   4690	nw64(TX_ENT_MSK(channel), 0);
   4691
   4692	if (rp->descr_dma & ~(TX_RNG_CFIG_STADDR_BASE |
   4693			      TX_RNG_CFIG_STADDR)) {
   4694		netdev_err(np->dev, "TX ring channel %d DMA addr (%llx) is not aligned\n",
   4695			   channel, (unsigned long long)rp->descr_dma);
   4696		return -EINVAL;
   4697	}
   4698
   4699	/* The length field in TX_RNG_CFIG is measured in 64-byte
   4700	 * blocks.  rp->pending is the number of TX descriptors in
   4701	 * our ring, 8 bytes each, thus we divide by 8 bytes more
   4702	 * to get the proper value the chip wants.
   4703	 */
   4704	ring_len = (rp->pending / 8);
   4705
   4706	val = ((ring_len << TX_RNG_CFIG_LEN_SHIFT) |
   4707	       rp->descr_dma);
   4708	nw64(TX_RNG_CFIG(channel), val);
   4709
   4710	if (((rp->mbox_dma >> 32) & ~TXDMA_MBH_MBADDR) ||
   4711	    ((u32)rp->mbox_dma & ~TXDMA_MBL_MBADDR)) {
   4712		netdev_err(np->dev, "TX ring channel %d MBOX addr (%llx) has invalid bits\n",
   4713			    channel, (unsigned long long)rp->mbox_dma);
   4714		return -EINVAL;
   4715	}
   4716	nw64(TXDMA_MBH(channel), rp->mbox_dma >> 32);
   4717	nw64(TXDMA_MBL(channel), rp->mbox_dma & TXDMA_MBL_MBADDR);
   4718
   4719	nw64(TX_CS(channel), 0);
   4720
   4721	rp->last_pkt_cnt = 0;
   4722
   4723	return 0;
   4724}
   4725
   4726static void niu_init_rdc_groups(struct niu *np)
   4727{
   4728	struct niu_rdc_tables *tp = &np->parent->rdc_group_cfg[np->port];
   4729	int i, first_table_num = tp->first_table_num;
   4730
   4731	for (i = 0; i < tp->num_tables; i++) {
   4732		struct rdc_table *tbl = &tp->tables[i];
   4733		int this_table = first_table_num + i;
   4734		int slot;
   4735
   4736		for (slot = 0; slot < NIU_RDC_TABLE_SLOTS; slot++)
   4737			nw64(RDC_TBL(this_table, slot),
   4738			     tbl->rxdma_channel[slot]);
   4739	}
   4740
   4741	nw64(DEF_RDC(np->port), np->parent->rdc_default[np->port]);
   4742}
   4743
   4744static void niu_init_drr_weight(struct niu *np)
   4745{
   4746	int type = phy_decode(np->parent->port_phy, np->port);
   4747	u64 val;
   4748
   4749	switch (type) {
   4750	case PORT_TYPE_10G:
   4751		val = PT_DRR_WEIGHT_DEFAULT_10G;
   4752		break;
   4753
   4754	case PORT_TYPE_1G:
   4755	default:
   4756		val = PT_DRR_WEIGHT_DEFAULT_1G;
   4757		break;
   4758	}
   4759	nw64(PT_DRR_WT(np->port), val);
   4760}
   4761
   4762static int niu_init_hostinfo(struct niu *np)
   4763{
   4764	struct niu_parent *parent = np->parent;
   4765	struct niu_rdc_tables *tp = &parent->rdc_group_cfg[np->port];
   4766	int i, err, num_alt = niu_num_alt_addr(np);
   4767	int first_rdc_table = tp->first_table_num;
   4768
   4769	err = niu_set_primary_mac_rdc_table(np, first_rdc_table, 1);
   4770	if (err)
   4771		return err;
   4772
   4773	err = niu_set_multicast_mac_rdc_table(np, first_rdc_table, 1);
   4774	if (err)
   4775		return err;
   4776
   4777	for (i = 0; i < num_alt; i++) {
   4778		err = niu_set_alt_mac_rdc_table(np, i, first_rdc_table, 1);
   4779		if (err)
   4780			return err;
   4781	}
   4782
   4783	return 0;
   4784}
   4785
   4786static int niu_rx_channel_reset(struct niu *np, int channel)
   4787{
   4788	return niu_set_and_wait_clear(np, RXDMA_CFIG1(channel),
   4789				      RXDMA_CFIG1_RST, 1000, 10,
   4790				      "RXDMA_CFIG1");
   4791}
   4792
   4793static int niu_rx_channel_lpage_init(struct niu *np, int channel)
   4794{
   4795	u64 val;
   4796
   4797	nw64(RX_LOG_MASK1(channel), 0);
   4798	nw64(RX_LOG_VAL1(channel), 0);
   4799	nw64(RX_LOG_MASK2(channel), 0);
   4800	nw64(RX_LOG_VAL2(channel), 0);
   4801	nw64(RX_LOG_PAGE_RELO1(channel), 0);
   4802	nw64(RX_LOG_PAGE_RELO2(channel), 0);
   4803	nw64(RX_LOG_PAGE_HDL(channel), 0);
   4804
   4805	val  = (u64)np->port << RX_LOG_PAGE_VLD_FUNC_SHIFT;
   4806	val |= (RX_LOG_PAGE_VLD_PAGE0 | RX_LOG_PAGE_VLD_PAGE1);
   4807	nw64(RX_LOG_PAGE_VLD(channel), val);
   4808
   4809	return 0;
   4810}
   4811
   4812static void niu_rx_channel_wred_init(struct niu *np, struct rx_ring_info *rp)
   4813{
   4814	u64 val;
   4815
   4816	val = (((u64)rp->nonsyn_window << RDC_RED_PARA_WIN_SHIFT) |
   4817	       ((u64)rp->nonsyn_threshold << RDC_RED_PARA_THRE_SHIFT) |
   4818	       ((u64)rp->syn_window << RDC_RED_PARA_WIN_SYN_SHIFT) |
   4819	       ((u64)rp->syn_threshold << RDC_RED_PARA_THRE_SYN_SHIFT));
   4820	nw64(RDC_RED_PARA(rp->rx_channel), val);
   4821}
   4822
   4823static int niu_compute_rbr_cfig_b(struct rx_ring_info *rp, u64 *ret)
   4824{
   4825	u64 val = 0;
   4826
   4827	*ret = 0;
   4828	switch (rp->rbr_block_size) {
   4829	case 4 * 1024:
   4830		val |= (RBR_BLKSIZE_4K << RBR_CFIG_B_BLKSIZE_SHIFT);
   4831		break;
   4832	case 8 * 1024:
   4833		val |= (RBR_BLKSIZE_8K << RBR_CFIG_B_BLKSIZE_SHIFT);
   4834		break;
   4835	case 16 * 1024:
   4836		val |= (RBR_BLKSIZE_16K << RBR_CFIG_B_BLKSIZE_SHIFT);
   4837		break;
   4838	case 32 * 1024:
   4839		val |= (RBR_BLKSIZE_32K << RBR_CFIG_B_BLKSIZE_SHIFT);
   4840		break;
   4841	default:
   4842		return -EINVAL;
   4843	}
   4844	val |= RBR_CFIG_B_VLD2;
   4845	switch (rp->rbr_sizes[2]) {
   4846	case 2 * 1024:
   4847		val |= (RBR_BUFSZ2_2K << RBR_CFIG_B_BUFSZ2_SHIFT);
   4848		break;
   4849	case 4 * 1024:
   4850		val |= (RBR_BUFSZ2_4K << RBR_CFIG_B_BUFSZ2_SHIFT);
   4851		break;
   4852	case 8 * 1024:
   4853		val |= (RBR_BUFSZ2_8K << RBR_CFIG_B_BUFSZ2_SHIFT);
   4854		break;
   4855	case 16 * 1024:
   4856		val |= (RBR_BUFSZ2_16K << RBR_CFIG_B_BUFSZ2_SHIFT);
   4857		break;
   4858
   4859	default:
   4860		return -EINVAL;
   4861	}
   4862	val |= RBR_CFIG_B_VLD1;
   4863	switch (rp->rbr_sizes[1]) {
   4864	case 1 * 1024:
   4865		val |= (RBR_BUFSZ1_1K << RBR_CFIG_B_BUFSZ1_SHIFT);
   4866		break;
   4867	case 2 * 1024:
   4868		val |= (RBR_BUFSZ1_2K << RBR_CFIG_B_BUFSZ1_SHIFT);
   4869		break;
   4870	case 4 * 1024:
   4871		val |= (RBR_BUFSZ1_4K << RBR_CFIG_B_BUFSZ1_SHIFT);
   4872		break;
   4873	case 8 * 1024:
   4874		val |= (RBR_BUFSZ1_8K << RBR_CFIG_B_BUFSZ1_SHIFT);
   4875		break;
   4876
   4877	default:
   4878		return -EINVAL;
   4879	}
   4880	val |= RBR_CFIG_B_VLD0;
   4881	switch (rp->rbr_sizes[0]) {
   4882	case 256:
   4883		val |= (RBR_BUFSZ0_256 << RBR_CFIG_B_BUFSZ0_SHIFT);
   4884		break;
   4885	case 512:
   4886		val |= (RBR_BUFSZ0_512 << RBR_CFIG_B_BUFSZ0_SHIFT);
   4887		break;
   4888	case 1 * 1024:
   4889		val |= (RBR_BUFSZ0_1K << RBR_CFIG_B_BUFSZ0_SHIFT);
   4890		break;
   4891	case 2 * 1024:
   4892		val |= (RBR_BUFSZ0_2K << RBR_CFIG_B_BUFSZ0_SHIFT);
   4893		break;
   4894
   4895	default:
   4896		return -EINVAL;
   4897	}
   4898
   4899	*ret = val;
   4900	return 0;
   4901}
   4902
   4903static int niu_enable_rx_channel(struct niu *np, int channel, int on)
   4904{
   4905	u64 val = nr64(RXDMA_CFIG1(channel));
   4906	int limit;
   4907
   4908	if (on)
   4909		val |= RXDMA_CFIG1_EN;
   4910	else
   4911		val &= ~RXDMA_CFIG1_EN;
   4912	nw64(RXDMA_CFIG1(channel), val);
   4913
   4914	limit = 1000;
   4915	while (--limit > 0) {
   4916		if (nr64(RXDMA_CFIG1(channel)) & RXDMA_CFIG1_QST)
   4917			break;
   4918		udelay(10);
   4919	}
   4920	if (limit <= 0)
   4921		return -ENODEV;
   4922	return 0;
   4923}
   4924
   4925static int niu_init_one_rx_channel(struct niu *np, struct rx_ring_info *rp)
   4926{
   4927	int err, channel = rp->rx_channel;
   4928	u64 val;
   4929
   4930	err = niu_rx_channel_reset(np, channel);
   4931	if (err)
   4932		return err;
   4933
   4934	err = niu_rx_channel_lpage_init(np, channel);
   4935	if (err)
   4936		return err;
   4937
   4938	niu_rx_channel_wred_init(np, rp);
   4939
   4940	nw64(RX_DMA_ENT_MSK(channel), RX_DMA_ENT_MSK_RBR_EMPTY);
   4941	nw64(RX_DMA_CTL_STAT(channel),
   4942	     (RX_DMA_CTL_STAT_MEX |
   4943	      RX_DMA_CTL_STAT_RCRTHRES |
   4944	      RX_DMA_CTL_STAT_RCRTO |
   4945	      RX_DMA_CTL_STAT_RBR_EMPTY));
   4946	nw64(RXDMA_CFIG1(channel), rp->mbox_dma >> 32);
   4947	nw64(RXDMA_CFIG2(channel),
   4948	     ((rp->mbox_dma & RXDMA_CFIG2_MBADDR_L) |
   4949	      RXDMA_CFIG2_FULL_HDR));
   4950	nw64(RBR_CFIG_A(channel),
   4951	     ((u64)rp->rbr_table_size << RBR_CFIG_A_LEN_SHIFT) |
   4952	     (rp->rbr_dma & (RBR_CFIG_A_STADDR_BASE | RBR_CFIG_A_STADDR)));
   4953	err = niu_compute_rbr_cfig_b(rp, &val);
   4954	if (err)
   4955		return err;
   4956	nw64(RBR_CFIG_B(channel), val);
   4957	nw64(RCRCFIG_A(channel),
   4958	     ((u64)rp->rcr_table_size << RCRCFIG_A_LEN_SHIFT) |
   4959	     (rp->rcr_dma & (RCRCFIG_A_STADDR_BASE | RCRCFIG_A_STADDR)));
   4960	nw64(RCRCFIG_B(channel),
   4961	     ((u64)rp->rcr_pkt_threshold << RCRCFIG_B_PTHRES_SHIFT) |
   4962	     RCRCFIG_B_ENTOUT |
   4963	     ((u64)rp->rcr_timeout << RCRCFIG_B_TIMEOUT_SHIFT));
   4964
   4965	err = niu_enable_rx_channel(np, channel, 1);
   4966	if (err)
   4967		return err;
   4968
   4969	nw64(RBR_KICK(channel), rp->rbr_index);
   4970
   4971	val = nr64(RX_DMA_CTL_STAT(channel));
   4972	val |= RX_DMA_CTL_STAT_RBR_EMPTY;
   4973	nw64(RX_DMA_CTL_STAT(channel), val);
   4974
   4975	return 0;
   4976}
   4977
   4978static int niu_init_rx_channels(struct niu *np)
   4979{
   4980	unsigned long flags;
   4981	u64 seed = jiffies_64;
   4982	int err, i;
   4983
   4984	niu_lock_parent(np, flags);
   4985	nw64(RX_DMA_CK_DIV, np->parent->rxdma_clock_divider);
   4986	nw64(RED_RAN_INIT, RED_RAN_INIT_OPMODE | (seed & RED_RAN_INIT_VAL));
   4987	niu_unlock_parent(np, flags);
   4988
   4989	/* XXX RXDMA 32bit mode? XXX */
   4990
   4991	niu_init_rdc_groups(np);
   4992	niu_init_drr_weight(np);
   4993
   4994	err = niu_init_hostinfo(np);
   4995	if (err)
   4996		return err;
   4997
   4998	for (i = 0; i < np->num_rx_rings; i++) {
   4999		struct rx_ring_info *rp = &np->rx_rings[i];
   5000
   5001		err = niu_init_one_rx_channel(np, rp);
   5002		if (err)
   5003			return err;
   5004	}
   5005
   5006	return 0;
   5007}
   5008
   5009static int niu_set_ip_frag_rule(struct niu *np)
   5010{
   5011	struct niu_parent *parent = np->parent;
   5012	struct niu_classifier *cp = &np->clas;
   5013	struct niu_tcam_entry *tp;
   5014	int index, err;
   5015
   5016	index = cp->tcam_top;
   5017	tp = &parent->tcam[index];
   5018
   5019	/* Note that the noport bit is the same in both ipv4 and
   5020	 * ipv6 format TCAM entries.
   5021	 */
   5022	memset(tp, 0, sizeof(*tp));
   5023	tp->key[1] = TCAM_V4KEY1_NOPORT;
   5024	tp->key_mask[1] = TCAM_V4KEY1_NOPORT;
   5025	tp->assoc_data = (TCAM_ASSOCDATA_TRES_USE_OFFSET |
   5026			  ((u64)0 << TCAM_ASSOCDATA_OFFSET_SHIFT));
   5027	err = tcam_write(np, index, tp->key, tp->key_mask);
   5028	if (err)
   5029		return err;
   5030	err = tcam_assoc_write(np, index, tp->assoc_data);
   5031	if (err)
   5032		return err;
   5033	tp->valid = 1;
   5034	cp->tcam_valid_entries++;
   5035
   5036	return 0;
   5037}
   5038
   5039static int niu_init_classifier_hw(struct niu *np)
   5040{
   5041	struct niu_parent *parent = np->parent;
   5042	struct niu_classifier *cp = &np->clas;
   5043	int i, err;
   5044
   5045	nw64(H1POLY, cp->h1_init);
   5046	nw64(H2POLY, cp->h2_init);
   5047
   5048	err = niu_init_hostinfo(np);
   5049	if (err)
   5050		return err;
   5051
   5052	for (i = 0; i < ENET_VLAN_TBL_NUM_ENTRIES; i++) {
   5053		struct niu_vlan_rdc *vp = &cp->vlan_mappings[i];
   5054
   5055		vlan_tbl_write(np, i, np->port,
   5056			       vp->vlan_pref, vp->rdc_num);
   5057	}
   5058
   5059	for (i = 0; i < cp->num_alt_mac_mappings; i++) {
   5060		struct niu_altmac_rdc *ap = &cp->alt_mac_mappings[i];
   5061
   5062		err = niu_set_alt_mac_rdc_table(np, ap->alt_mac_num,
   5063						ap->rdc_num, ap->mac_pref);
   5064		if (err)
   5065			return err;
   5066	}
   5067
   5068	for (i = CLASS_CODE_USER_PROG1; i <= CLASS_CODE_SCTP_IPV6; i++) {
   5069		int index = i - CLASS_CODE_USER_PROG1;
   5070
   5071		err = niu_set_tcam_key(np, i, parent->tcam_key[index]);
   5072		if (err)
   5073			return err;
   5074		err = niu_set_flow_key(np, i, parent->flow_key[index]);
   5075		if (err)
   5076			return err;
   5077	}
   5078
   5079	err = niu_set_ip_frag_rule(np);
   5080	if (err)
   5081		return err;
   5082
   5083	tcam_enable(np, 1);
   5084
   5085	return 0;
   5086}
   5087
   5088static int niu_zcp_write(struct niu *np, int index, u64 *data)
   5089{
   5090	nw64(ZCP_RAM_DATA0, data[0]);
   5091	nw64(ZCP_RAM_DATA1, data[1]);
   5092	nw64(ZCP_RAM_DATA2, data[2]);
   5093	nw64(ZCP_RAM_DATA3, data[3]);
   5094	nw64(ZCP_RAM_DATA4, data[4]);
   5095	nw64(ZCP_RAM_BE, ZCP_RAM_BE_VAL);
   5096	nw64(ZCP_RAM_ACC,
   5097	     (ZCP_RAM_ACC_WRITE |
   5098	      (0 << ZCP_RAM_ACC_ZFCID_SHIFT) |
   5099	      (ZCP_RAM_SEL_CFIFO(np->port) << ZCP_RAM_ACC_RAM_SEL_SHIFT)));
   5100
   5101	return niu_wait_bits_clear(np, ZCP_RAM_ACC, ZCP_RAM_ACC_BUSY,
   5102				   1000, 100);
   5103}
   5104
   5105static int niu_zcp_read(struct niu *np, int index, u64 *data)
   5106{
   5107	int err;
   5108
   5109	err = niu_wait_bits_clear(np, ZCP_RAM_ACC, ZCP_RAM_ACC_BUSY,
   5110				  1000, 100);
   5111	if (err) {
   5112		netdev_err(np->dev, "ZCP read busy won't clear, ZCP_RAM_ACC[%llx]\n",
   5113			   (unsigned long long)nr64(ZCP_RAM_ACC));
   5114		return err;
   5115	}
   5116
   5117	nw64(ZCP_RAM_ACC,
   5118	     (ZCP_RAM_ACC_READ |
   5119	      (0 << ZCP_RAM_ACC_ZFCID_SHIFT) |
   5120	      (ZCP_RAM_SEL_CFIFO(np->port) << ZCP_RAM_ACC_RAM_SEL_SHIFT)));
   5121
   5122	err = niu_wait_bits_clear(np, ZCP_RAM_ACC, ZCP_RAM_ACC_BUSY,
   5123				  1000, 100);
   5124	if (err) {
   5125		netdev_err(np->dev, "ZCP read busy2 won't clear, ZCP_RAM_ACC[%llx]\n",
   5126			   (unsigned long long)nr64(ZCP_RAM_ACC));
   5127		return err;
   5128	}
   5129
   5130	data[0] = nr64(ZCP_RAM_DATA0);
   5131	data[1] = nr64(ZCP_RAM_DATA1);
   5132	data[2] = nr64(ZCP_RAM_DATA2);
   5133	data[3] = nr64(ZCP_RAM_DATA3);
   5134	data[4] = nr64(ZCP_RAM_DATA4);
   5135
   5136	return 0;
   5137}
   5138
   5139static void niu_zcp_cfifo_reset(struct niu *np)
   5140{
   5141	u64 val = nr64(RESET_CFIFO);
   5142
   5143	val |= RESET_CFIFO_RST(np->port);
   5144	nw64(RESET_CFIFO, val);
   5145	udelay(10);
   5146
   5147	val &= ~RESET_CFIFO_RST(np->port);
   5148	nw64(RESET_CFIFO, val);
   5149}
   5150
   5151static int niu_init_zcp(struct niu *np)
   5152{
   5153	u64 data[5], rbuf[5];
   5154	int i, max, err;
   5155
   5156	if (np->parent->plat_type != PLAT_TYPE_NIU) {
   5157		if (np->port == 0 || np->port == 1)
   5158			max = ATLAS_P0_P1_CFIFO_ENTRIES;
   5159		else
   5160			max = ATLAS_P2_P3_CFIFO_ENTRIES;
   5161	} else
   5162		max = NIU_CFIFO_ENTRIES;
   5163
   5164	data[0] = 0;
   5165	data[1] = 0;
   5166	data[2] = 0;
   5167	data[3] = 0;
   5168	data[4] = 0;
   5169
   5170	for (i = 0; i < max; i++) {
   5171		err = niu_zcp_write(np, i, data);
   5172		if (err)
   5173			return err;
   5174		err = niu_zcp_read(np, i, rbuf);
   5175		if (err)
   5176			return err;
   5177	}
   5178
   5179	niu_zcp_cfifo_reset(np);
   5180	nw64(CFIFO_ECC(np->port), 0);
   5181	nw64(ZCP_INT_STAT, ZCP_INT_STAT_ALL);
   5182	(void) nr64(ZCP_INT_STAT);
   5183	nw64(ZCP_INT_MASK, ZCP_INT_MASK_ALL);
   5184
   5185	return 0;
   5186}
   5187
   5188static void niu_ipp_write(struct niu *np, int index, u64 *data)
   5189{
   5190	u64 val = nr64_ipp(IPP_CFIG);
   5191
   5192	nw64_ipp(IPP_CFIG, val | IPP_CFIG_DFIFO_PIO_W);
   5193	nw64_ipp(IPP_DFIFO_WR_PTR, index);
   5194	nw64_ipp(IPP_DFIFO_WR0, data[0]);
   5195	nw64_ipp(IPP_DFIFO_WR1, data[1]);
   5196	nw64_ipp(IPP_DFIFO_WR2, data[2]);
   5197	nw64_ipp(IPP_DFIFO_WR3, data[3]);
   5198	nw64_ipp(IPP_DFIFO_WR4, data[4]);
   5199	nw64_ipp(IPP_CFIG, val & ~IPP_CFIG_DFIFO_PIO_W);
   5200}
   5201
   5202static void niu_ipp_read(struct niu *np, int index, u64 *data)
   5203{
   5204	nw64_ipp(IPP_DFIFO_RD_PTR, index);
   5205	data[0] = nr64_ipp(IPP_DFIFO_RD0);
   5206	data[1] = nr64_ipp(IPP_DFIFO_RD1);
   5207	data[2] = nr64_ipp(IPP_DFIFO_RD2);
   5208	data[3] = nr64_ipp(IPP_DFIFO_RD3);
   5209	data[4] = nr64_ipp(IPP_DFIFO_RD4);
   5210}
   5211
   5212static int niu_ipp_reset(struct niu *np)
   5213{
   5214	return niu_set_and_wait_clear_ipp(np, IPP_CFIG, IPP_CFIG_SOFT_RST,
   5215					  1000, 100, "IPP_CFIG");
   5216}
   5217
   5218static int niu_init_ipp(struct niu *np)
   5219{
   5220	u64 data[5], rbuf[5], val;
   5221	int i, max, err;
   5222
   5223	if (np->parent->plat_type != PLAT_TYPE_NIU) {
   5224		if (np->port == 0 || np->port == 1)
   5225			max = ATLAS_P0_P1_DFIFO_ENTRIES;
   5226		else
   5227			max = ATLAS_P2_P3_DFIFO_ENTRIES;
   5228	} else
   5229		max = NIU_DFIFO_ENTRIES;
   5230
   5231	data[0] = 0;
   5232	data[1] = 0;
   5233	data[2] = 0;
   5234	data[3] = 0;
   5235	data[4] = 0;
   5236
   5237	for (i = 0; i < max; i++) {
   5238		niu_ipp_write(np, i, data);
   5239		niu_ipp_read(np, i, rbuf);
   5240	}
   5241
   5242	(void) nr64_ipp(IPP_INT_STAT);
   5243	(void) nr64_ipp(IPP_INT_STAT);
   5244
   5245	err = niu_ipp_reset(np);
   5246	if (err)
   5247		return err;
   5248
   5249	(void) nr64_ipp(IPP_PKT_DIS);
   5250	(void) nr64_ipp(IPP_BAD_CS_CNT);
   5251	(void) nr64_ipp(IPP_ECC);
   5252
   5253	(void) nr64_ipp(IPP_INT_STAT);
   5254
   5255	nw64_ipp(IPP_MSK, ~IPP_MSK_ALL);
   5256
   5257	val = nr64_ipp(IPP_CFIG);
   5258	val &= ~IPP_CFIG_IP_MAX_PKT;
   5259	val |= (IPP_CFIG_IPP_ENABLE |
   5260		IPP_CFIG_DFIFO_ECC_EN |
   5261		IPP_CFIG_DROP_BAD_CRC |
   5262		IPP_CFIG_CKSUM_EN |
   5263		(0x1ffff << IPP_CFIG_IP_MAX_PKT_SHIFT));
   5264	nw64_ipp(IPP_CFIG, val);
   5265
   5266	return 0;
   5267}
   5268
   5269static void niu_handle_led(struct niu *np, int status)
   5270{
   5271	u64 val;
   5272	val = nr64_mac(XMAC_CONFIG);
   5273
   5274	if ((np->flags & NIU_FLAGS_10G) != 0 &&
   5275	    (np->flags & NIU_FLAGS_FIBER) != 0) {
   5276		if (status) {
   5277			val |= XMAC_CONFIG_LED_POLARITY;
   5278			val &= ~XMAC_CONFIG_FORCE_LED_ON;
   5279		} else {
   5280			val |= XMAC_CONFIG_FORCE_LED_ON;
   5281			val &= ~XMAC_CONFIG_LED_POLARITY;
   5282		}
   5283	}
   5284
   5285	nw64_mac(XMAC_CONFIG, val);
   5286}
   5287
   5288static void niu_init_xif_xmac(struct niu *np)
   5289{
   5290	struct niu_link_config *lp = &np->link_config;
   5291	u64 val;
   5292
   5293	if (np->flags & NIU_FLAGS_XCVR_SERDES) {
   5294		val = nr64(MIF_CONFIG);
   5295		val |= MIF_CONFIG_ATCA_GE;
   5296		nw64(MIF_CONFIG, val);
   5297	}
   5298
   5299	val = nr64_mac(XMAC_CONFIG);
   5300	val &= ~XMAC_CONFIG_SEL_POR_CLK_SRC;
   5301
   5302	val |= XMAC_CONFIG_TX_OUTPUT_EN;
   5303
   5304	if (lp->loopback_mode == LOOPBACK_MAC) {
   5305		val &= ~XMAC_CONFIG_SEL_POR_CLK_SRC;
   5306		val |= XMAC_CONFIG_LOOPBACK;
   5307	} else {
   5308		val &= ~XMAC_CONFIG_LOOPBACK;
   5309	}
   5310
   5311	if (np->flags & NIU_FLAGS_10G) {
   5312		val &= ~XMAC_CONFIG_LFS_DISABLE;
   5313	} else {
   5314		val |= XMAC_CONFIG_LFS_DISABLE;
   5315		if (!(np->flags & NIU_FLAGS_FIBER) &&
   5316		    !(np->flags & NIU_FLAGS_XCVR_SERDES))
   5317			val |= XMAC_CONFIG_1G_PCS_BYPASS;
   5318		else
   5319			val &= ~XMAC_CONFIG_1G_PCS_BYPASS;
   5320	}
   5321
   5322	val &= ~XMAC_CONFIG_10G_XPCS_BYPASS;
   5323
   5324	if (lp->active_speed == SPEED_100)
   5325		val |= XMAC_CONFIG_SEL_CLK_25MHZ;
   5326	else
   5327		val &= ~XMAC_CONFIG_SEL_CLK_25MHZ;
   5328
   5329	nw64_mac(XMAC_CONFIG, val);
   5330
   5331	val = nr64_mac(XMAC_CONFIG);
   5332	val &= ~XMAC_CONFIG_MODE_MASK;
   5333	if (np->flags & NIU_FLAGS_10G) {
   5334		val |= XMAC_CONFIG_MODE_XGMII;
   5335	} else {
   5336		if (lp->active_speed == SPEED_1000)
   5337			val |= XMAC_CONFIG_MODE_GMII;
   5338		else
   5339			val |= XMAC_CONFIG_MODE_MII;
   5340	}
   5341
   5342	nw64_mac(XMAC_CONFIG, val);
   5343}
   5344
   5345static void niu_init_xif_bmac(struct niu *np)
   5346{
   5347	struct niu_link_config *lp = &np->link_config;
   5348	u64 val;
   5349
   5350	val = BMAC_XIF_CONFIG_TX_OUTPUT_EN;
   5351
   5352	if (lp->loopback_mode == LOOPBACK_MAC)
   5353		val |= BMAC_XIF_CONFIG_MII_LOOPBACK;
   5354	else
   5355		val &= ~BMAC_XIF_CONFIG_MII_LOOPBACK;
   5356
   5357	if (lp->active_speed == SPEED_1000)
   5358		val |= BMAC_XIF_CONFIG_GMII_MODE;
   5359	else
   5360		val &= ~BMAC_XIF_CONFIG_GMII_MODE;
   5361
   5362	val &= ~(BMAC_XIF_CONFIG_LINK_LED |
   5363		 BMAC_XIF_CONFIG_LED_POLARITY);
   5364
   5365	if (!(np->flags & NIU_FLAGS_10G) &&
   5366	    !(np->flags & NIU_FLAGS_FIBER) &&
   5367	    lp->active_speed == SPEED_100)
   5368		val |= BMAC_XIF_CONFIG_25MHZ_CLOCK;
   5369	else
   5370		val &= ~BMAC_XIF_CONFIG_25MHZ_CLOCK;
   5371
   5372	nw64_mac(BMAC_XIF_CONFIG, val);
   5373}
   5374
   5375static void niu_init_xif(struct niu *np)
   5376{
   5377	if (np->flags & NIU_FLAGS_XMAC)
   5378		niu_init_xif_xmac(np);
   5379	else
   5380		niu_init_xif_bmac(np);
   5381}
   5382
   5383static void niu_pcs_mii_reset(struct niu *np)
   5384{
   5385	int limit = 1000;
   5386	u64 val = nr64_pcs(PCS_MII_CTL);
   5387	val |= PCS_MII_CTL_RST;
   5388	nw64_pcs(PCS_MII_CTL, val);
   5389	while ((--limit >= 0) && (val & PCS_MII_CTL_RST)) {
   5390		udelay(100);
   5391		val = nr64_pcs(PCS_MII_CTL);
   5392	}
   5393}
   5394
   5395static void niu_xpcs_reset(struct niu *np)
   5396{
   5397	int limit = 1000;
   5398	u64 val = nr64_xpcs(XPCS_CONTROL1);
   5399	val |= XPCS_CONTROL1_RESET;
   5400	nw64_xpcs(XPCS_CONTROL1, val);
   5401	while ((--limit >= 0) && (val & XPCS_CONTROL1_RESET)) {
   5402		udelay(100);
   5403		val = nr64_xpcs(XPCS_CONTROL1);
   5404	}
   5405}
   5406
   5407static int niu_init_pcs(struct niu *np)
   5408{
   5409	struct niu_link_config *lp = &np->link_config;
   5410	u64 val;
   5411
   5412	switch (np->flags & (NIU_FLAGS_10G |
   5413			     NIU_FLAGS_FIBER |
   5414			     NIU_FLAGS_XCVR_SERDES)) {
   5415	case NIU_FLAGS_FIBER:
   5416		/* 1G fiber */
   5417		nw64_pcs(PCS_CONF, PCS_CONF_MASK | PCS_CONF_ENABLE);
   5418		nw64_pcs(PCS_DPATH_MODE, 0);
   5419		niu_pcs_mii_reset(np);
   5420		break;
   5421
   5422	case NIU_FLAGS_10G:
   5423	case NIU_FLAGS_10G | NIU_FLAGS_FIBER:
   5424	case NIU_FLAGS_10G | NIU_FLAGS_XCVR_SERDES:
   5425		/* 10G SERDES */
   5426		if (!(np->flags & NIU_FLAGS_XMAC))
   5427			return -EINVAL;
   5428
   5429		/* 10G copper or fiber */
   5430		val = nr64_mac(XMAC_CONFIG);
   5431		val &= ~XMAC_CONFIG_10G_XPCS_BYPASS;
   5432		nw64_mac(XMAC_CONFIG, val);
   5433
   5434		niu_xpcs_reset(np);
   5435
   5436		val = nr64_xpcs(XPCS_CONTROL1);
   5437		if (lp->loopback_mode == LOOPBACK_PHY)
   5438			val |= XPCS_CONTROL1_LOOPBACK;
   5439		else
   5440			val &= ~XPCS_CONTROL1_LOOPBACK;
   5441		nw64_xpcs(XPCS_CONTROL1, val);
   5442
   5443		nw64_xpcs(XPCS_DESKEW_ERR_CNT, 0);
   5444		(void) nr64_xpcs(XPCS_SYMERR_CNT01);
   5445		(void) nr64_xpcs(XPCS_SYMERR_CNT23);
   5446		break;
   5447
   5448
   5449	case NIU_FLAGS_XCVR_SERDES:
   5450		/* 1G SERDES */
   5451		niu_pcs_mii_reset(np);
   5452		nw64_pcs(PCS_CONF, PCS_CONF_MASK | PCS_CONF_ENABLE);
   5453		nw64_pcs(PCS_DPATH_MODE, 0);
   5454		break;
   5455
   5456	case 0:
   5457		/* 1G copper */
   5458	case NIU_FLAGS_XCVR_SERDES | NIU_FLAGS_FIBER:
   5459		/* 1G RGMII FIBER */
   5460		nw64_pcs(PCS_DPATH_MODE, PCS_DPATH_MODE_MII);
   5461		niu_pcs_mii_reset(np);
   5462		break;
   5463
   5464	default:
   5465		return -EINVAL;
   5466	}
   5467
   5468	return 0;
   5469}
   5470
   5471static int niu_reset_tx_xmac(struct niu *np)
   5472{
   5473	return niu_set_and_wait_clear_mac(np, XTXMAC_SW_RST,
   5474					  (XTXMAC_SW_RST_REG_RS |
   5475					   XTXMAC_SW_RST_SOFT_RST),
   5476					  1000, 100, "XTXMAC_SW_RST");
   5477}
   5478
   5479static int niu_reset_tx_bmac(struct niu *np)
   5480{
   5481	int limit;
   5482
   5483	nw64_mac(BTXMAC_SW_RST, BTXMAC_SW_RST_RESET);
   5484	limit = 1000;
   5485	while (--limit >= 0) {
   5486		if (!(nr64_mac(BTXMAC_SW_RST) & BTXMAC_SW_RST_RESET))
   5487			break;
   5488		udelay(100);
   5489	}
   5490	if (limit < 0) {
   5491		dev_err(np->device, "Port %u TX BMAC would not reset, BTXMAC_SW_RST[%llx]\n",
   5492			np->port,
   5493			(unsigned long long) nr64_mac(BTXMAC_SW_RST));
   5494		return -ENODEV;
   5495	}
   5496
   5497	return 0;
   5498}
   5499
   5500static int niu_reset_tx_mac(struct niu *np)
   5501{
   5502	if (np->flags & NIU_FLAGS_XMAC)
   5503		return niu_reset_tx_xmac(np);
   5504	else
   5505		return niu_reset_tx_bmac(np);
   5506}
   5507
   5508static void niu_init_tx_xmac(struct niu *np, u64 min, u64 max)
   5509{
   5510	u64 val;
   5511
   5512	val = nr64_mac(XMAC_MIN);
   5513	val &= ~(XMAC_MIN_TX_MIN_PKT_SIZE |
   5514		 XMAC_MIN_RX_MIN_PKT_SIZE);
   5515	val |= (min << XMAC_MIN_RX_MIN_PKT_SIZE_SHFT);
   5516	val |= (min << XMAC_MIN_TX_MIN_PKT_SIZE_SHFT);
   5517	nw64_mac(XMAC_MIN, val);
   5518
   5519	nw64_mac(XMAC_MAX, max);
   5520
   5521	nw64_mac(XTXMAC_STAT_MSK, ~(u64)0);
   5522
   5523	val = nr64_mac(XMAC_IPG);
   5524	if (np->flags & NIU_FLAGS_10G) {
   5525		val &= ~XMAC_IPG_IPG_XGMII;
   5526		val |= (IPG_12_15_XGMII << XMAC_IPG_IPG_XGMII_SHIFT);
   5527	} else {
   5528		val &= ~XMAC_IPG_IPG_MII_GMII;
   5529		val |= (IPG_12_MII_GMII << XMAC_IPG_IPG_MII_GMII_SHIFT);
   5530	}
   5531	nw64_mac(XMAC_IPG, val);
   5532
   5533	val = nr64_mac(XMAC_CONFIG);
   5534	val &= ~(XMAC_CONFIG_ALWAYS_NO_CRC |
   5535		 XMAC_CONFIG_STRETCH_MODE |
   5536		 XMAC_CONFIG_VAR_MIN_IPG_EN |
   5537		 XMAC_CONFIG_TX_ENABLE);
   5538	nw64_mac(XMAC_CONFIG, val);
   5539
   5540	nw64_mac(TXMAC_FRM_CNT, 0);
   5541	nw64_mac(TXMAC_BYTE_CNT, 0);
   5542}
   5543
   5544static void niu_init_tx_bmac(struct niu *np, u64 min, u64 max)
   5545{
   5546	u64 val;
   5547
   5548	nw64_mac(BMAC_MIN_FRAME, min);
   5549	nw64_mac(BMAC_MAX_FRAME, max);
   5550
   5551	nw64_mac(BTXMAC_STATUS_MASK, ~(u64)0);
   5552	nw64_mac(BMAC_CTRL_TYPE, 0x8808);
   5553	nw64_mac(BMAC_PREAMBLE_SIZE, 7);
   5554
   5555	val = nr64_mac(BTXMAC_CONFIG);
   5556	val &= ~(BTXMAC_CONFIG_FCS_DISABLE |
   5557		 BTXMAC_CONFIG_ENABLE);
   5558	nw64_mac(BTXMAC_CONFIG, val);
   5559}
   5560
   5561static void niu_init_tx_mac(struct niu *np)
   5562{
   5563	u64 min, max;
   5564
   5565	min = 64;
   5566	if (np->dev->mtu > ETH_DATA_LEN)
   5567		max = 9216;
   5568	else
   5569		max = 1522;
   5570
   5571	/* The XMAC_MIN register only accepts values for TX min which
   5572	 * have the low 3 bits cleared.
   5573	 */
   5574	BUG_ON(min & 0x7);
   5575
   5576	if (np->flags & NIU_FLAGS_XMAC)
   5577		niu_init_tx_xmac(np, min, max);
   5578	else
   5579		niu_init_tx_bmac(np, min, max);
   5580}
   5581
   5582static int niu_reset_rx_xmac(struct niu *np)
   5583{
   5584	int limit;
   5585
   5586	nw64_mac(XRXMAC_SW_RST,
   5587		 XRXMAC_SW_RST_REG_RS | XRXMAC_SW_RST_SOFT_RST);
   5588	limit = 1000;
   5589	while (--limit >= 0) {
   5590		if (!(nr64_mac(XRXMAC_SW_RST) & (XRXMAC_SW_RST_REG_RS |
   5591						 XRXMAC_SW_RST_SOFT_RST)))
   5592			break;
   5593		udelay(100);
   5594	}
   5595	if (limit < 0) {
   5596		dev_err(np->device, "Port %u RX XMAC would not reset, XRXMAC_SW_RST[%llx]\n",
   5597			np->port,
   5598			(unsigned long long) nr64_mac(XRXMAC_SW_RST));
   5599		return -ENODEV;
   5600	}
   5601
   5602	return 0;
   5603}
   5604
   5605static int niu_reset_rx_bmac(struct niu *np)
   5606{
   5607	int limit;
   5608
   5609	nw64_mac(BRXMAC_SW_RST, BRXMAC_SW_RST_RESET);
   5610	limit = 1000;
   5611	while (--limit >= 0) {
   5612		if (!(nr64_mac(BRXMAC_SW_RST) & BRXMAC_SW_RST_RESET))
   5613			break;
   5614		udelay(100);
   5615	}
   5616	if (limit < 0) {
   5617		dev_err(np->device, "Port %u RX BMAC would not reset, BRXMAC_SW_RST[%llx]\n",
   5618			np->port,
   5619			(unsigned long long) nr64_mac(BRXMAC_SW_RST));
   5620		return -ENODEV;
   5621	}
   5622
   5623	return 0;
   5624}
   5625
   5626static int niu_reset_rx_mac(struct niu *np)
   5627{
   5628	if (np->flags & NIU_FLAGS_XMAC)
   5629		return niu_reset_rx_xmac(np);
   5630	else
   5631		return niu_reset_rx_bmac(np);
   5632}
   5633
   5634static void niu_init_rx_xmac(struct niu *np)
   5635{
   5636	struct niu_parent *parent = np->parent;
   5637	struct niu_rdc_tables *tp = &parent->rdc_group_cfg[np->port];
   5638	int first_rdc_table = tp->first_table_num;
   5639	unsigned long i;
   5640	u64 val;
   5641
   5642	nw64_mac(XMAC_ADD_FILT0, 0);
   5643	nw64_mac(XMAC_ADD_FILT1, 0);
   5644	nw64_mac(XMAC_ADD_FILT2, 0);
   5645	nw64_mac(XMAC_ADD_FILT12_MASK, 0);
   5646	nw64_mac(XMAC_ADD_FILT00_MASK, 0);
   5647	for (i = 0; i < MAC_NUM_HASH; i++)
   5648		nw64_mac(XMAC_HASH_TBL(i), 0);
   5649	nw64_mac(XRXMAC_STAT_MSK, ~(u64)0);
   5650	niu_set_primary_mac_rdc_table(np, first_rdc_table, 1);
   5651	niu_set_multicast_mac_rdc_table(np, first_rdc_table, 1);
   5652
   5653	val = nr64_mac(XMAC_CONFIG);
   5654	val &= ~(XMAC_CONFIG_RX_MAC_ENABLE |
   5655		 XMAC_CONFIG_PROMISCUOUS |
   5656		 XMAC_CONFIG_PROMISC_GROUP |
   5657		 XMAC_CONFIG_ERR_CHK_DIS |
   5658		 XMAC_CONFIG_RX_CRC_CHK_DIS |
   5659		 XMAC_CONFIG_RESERVED_MULTICAST |
   5660		 XMAC_CONFIG_RX_CODEV_CHK_DIS |
   5661		 XMAC_CONFIG_ADDR_FILTER_EN |
   5662		 XMAC_CONFIG_RCV_PAUSE_ENABLE |
   5663		 XMAC_CONFIG_STRIP_CRC |
   5664		 XMAC_CONFIG_PASS_FLOW_CTRL |
   5665		 XMAC_CONFIG_MAC2IPP_PKT_CNT_EN);
   5666	val |= (XMAC_CONFIG_HASH_FILTER_EN);
   5667	nw64_mac(XMAC_CONFIG, val);
   5668
   5669	nw64_mac(RXMAC_BT_CNT, 0);
   5670	nw64_mac(RXMAC_BC_FRM_CNT, 0);
   5671	nw64_mac(RXMAC_MC_FRM_CNT, 0);
   5672	nw64_mac(RXMAC_FRAG_CNT, 0);
   5673	nw64_mac(RXMAC_HIST_CNT1, 0);
   5674	nw64_mac(RXMAC_HIST_CNT2, 0);
   5675	nw64_mac(RXMAC_HIST_CNT3, 0);
   5676	nw64_mac(RXMAC_HIST_CNT4, 0);
   5677	nw64_mac(RXMAC_HIST_CNT5, 0);
   5678	nw64_mac(RXMAC_HIST_CNT6, 0);
   5679	nw64_mac(RXMAC_HIST_CNT7, 0);
   5680	nw64_mac(RXMAC_MPSZER_CNT, 0);
   5681	nw64_mac(RXMAC_CRC_ER_CNT, 0);
   5682	nw64_mac(RXMAC_CD_VIO_CNT, 0);
   5683	nw64_mac(LINK_FAULT_CNT, 0);
   5684}
   5685
   5686static void niu_init_rx_bmac(struct niu *np)
   5687{
   5688	struct niu_parent *parent = np->parent;
   5689	struct niu_rdc_tables *tp = &parent->rdc_group_cfg[np->port];
   5690	int first_rdc_table = tp->first_table_num;
   5691	unsigned long i;
   5692	u64 val;
   5693
   5694	nw64_mac(BMAC_ADD_FILT0, 0);
   5695	nw64_mac(BMAC_ADD_FILT1, 0);
   5696	nw64_mac(BMAC_ADD_FILT2, 0);
   5697	nw64_mac(BMAC_ADD_FILT12_MASK, 0);
   5698	nw64_mac(BMAC_ADD_FILT00_MASK, 0);
   5699	for (i = 0; i < MAC_NUM_HASH; i++)
   5700		nw64_mac(BMAC_HASH_TBL(i), 0);
   5701	niu_set_primary_mac_rdc_table(np, first_rdc_table, 1);
   5702	niu_set_multicast_mac_rdc_table(np, first_rdc_table, 1);
   5703	nw64_mac(BRXMAC_STATUS_MASK, ~(u64)0);
   5704
   5705	val = nr64_mac(BRXMAC_CONFIG);
   5706	val &= ~(BRXMAC_CONFIG_ENABLE |
   5707		 BRXMAC_CONFIG_STRIP_PAD |
   5708		 BRXMAC_CONFIG_STRIP_FCS |
   5709		 BRXMAC_CONFIG_PROMISC |
   5710		 BRXMAC_CONFIG_PROMISC_GRP |
   5711		 BRXMAC_CONFIG_ADDR_FILT_EN |
   5712		 BRXMAC_CONFIG_DISCARD_DIS);
   5713	val |= (BRXMAC_CONFIG_HASH_FILT_EN);
   5714	nw64_mac(BRXMAC_CONFIG, val);
   5715
   5716	val = nr64_mac(BMAC_ADDR_CMPEN);
   5717	val |= BMAC_ADDR_CMPEN_EN0;
   5718	nw64_mac(BMAC_ADDR_CMPEN, val);
   5719}
   5720
   5721static void niu_init_rx_mac(struct niu *np)
   5722{
   5723	niu_set_primary_mac(np, np->dev->dev_addr);
   5724
   5725	if (np->flags & NIU_FLAGS_XMAC)
   5726		niu_init_rx_xmac(np);
   5727	else
   5728		niu_init_rx_bmac(np);
   5729}
   5730
   5731static void niu_enable_tx_xmac(struct niu *np, int on)
   5732{
   5733	u64 val = nr64_mac(XMAC_CONFIG);
   5734
   5735	if (on)
   5736		val |= XMAC_CONFIG_TX_ENABLE;
   5737	else
   5738		val &= ~XMAC_CONFIG_TX_ENABLE;
   5739	nw64_mac(XMAC_CONFIG, val);
   5740}
   5741
   5742static void niu_enable_tx_bmac(struct niu *np, int on)
   5743{
   5744	u64 val = nr64_mac(BTXMAC_CONFIG);
   5745
   5746	if (on)
   5747		val |= BTXMAC_CONFIG_ENABLE;
   5748	else
   5749		val &= ~BTXMAC_CONFIG_ENABLE;
   5750	nw64_mac(BTXMAC_CONFIG, val);
   5751}
   5752
   5753static void niu_enable_tx_mac(struct niu *np, int on)
   5754{
   5755	if (np->flags & NIU_FLAGS_XMAC)
   5756		niu_enable_tx_xmac(np, on);
   5757	else
   5758		niu_enable_tx_bmac(np, on);
   5759}
   5760
   5761static void niu_enable_rx_xmac(struct niu *np, int on)
   5762{
   5763	u64 val = nr64_mac(XMAC_CONFIG);
   5764
   5765	val &= ~(XMAC_CONFIG_HASH_FILTER_EN |
   5766		 XMAC_CONFIG_PROMISCUOUS);
   5767
   5768	if (np->flags & NIU_FLAGS_MCAST)
   5769		val |= XMAC_CONFIG_HASH_FILTER_EN;
   5770	if (np->flags & NIU_FLAGS_PROMISC)
   5771		val |= XMAC_CONFIG_PROMISCUOUS;
   5772
   5773	if (on)
   5774		val |= XMAC_CONFIG_RX_MAC_ENABLE;
   5775	else
   5776		val &= ~XMAC_CONFIG_RX_MAC_ENABLE;
   5777	nw64_mac(XMAC_CONFIG, val);
   5778}
   5779
   5780static void niu_enable_rx_bmac(struct niu *np, int on)
   5781{
   5782	u64 val = nr64_mac(BRXMAC_CONFIG);
   5783
   5784	val &= ~(BRXMAC_CONFIG_HASH_FILT_EN |
   5785		 BRXMAC_CONFIG_PROMISC);
   5786
   5787	if (np->flags & NIU_FLAGS_MCAST)
   5788		val |= BRXMAC_CONFIG_HASH_FILT_EN;
   5789	if (np->flags & NIU_FLAGS_PROMISC)
   5790		val |= BRXMAC_CONFIG_PROMISC;
   5791
   5792	if (on)
   5793		val |= BRXMAC_CONFIG_ENABLE;
   5794	else
   5795		val &= ~BRXMAC_CONFIG_ENABLE;
   5796	nw64_mac(BRXMAC_CONFIG, val);
   5797}
   5798
   5799static void niu_enable_rx_mac(struct niu *np, int on)
   5800{
   5801	if (np->flags & NIU_FLAGS_XMAC)
   5802		niu_enable_rx_xmac(np, on);
   5803	else
   5804		niu_enable_rx_bmac(np, on);
   5805}
   5806
   5807static int niu_init_mac(struct niu *np)
   5808{
   5809	int err;
   5810
   5811	niu_init_xif(np);
   5812	err = niu_init_pcs(np);
   5813	if (err)
   5814		return err;
   5815
   5816	err = niu_reset_tx_mac(np);
   5817	if (err)
   5818		return err;
   5819	niu_init_tx_mac(np);
   5820	err = niu_reset_rx_mac(np);
   5821	if (err)
   5822		return err;
   5823	niu_init_rx_mac(np);
   5824
   5825	/* This looks hookey but the RX MAC reset we just did will
   5826	 * undo some of the state we setup in niu_init_tx_mac() so we
   5827	 * have to call it again.  In particular, the RX MAC reset will
   5828	 * set the XMAC_MAX register back to it's default value.
   5829	 */
   5830	niu_init_tx_mac(np);
   5831	niu_enable_tx_mac(np, 1);
   5832
   5833	niu_enable_rx_mac(np, 1);
   5834
   5835	return 0;
   5836}
   5837
   5838static void niu_stop_one_tx_channel(struct niu *np, struct tx_ring_info *rp)
   5839{
   5840	(void) niu_tx_channel_stop(np, rp->tx_channel);
   5841}
   5842
   5843static void niu_stop_tx_channels(struct niu *np)
   5844{
   5845	int i;
   5846
   5847	for (i = 0; i < np->num_tx_rings; i++) {
   5848		struct tx_ring_info *rp = &np->tx_rings[i];
   5849
   5850		niu_stop_one_tx_channel(np, rp);
   5851	}
   5852}
   5853
   5854static void niu_reset_one_tx_channel(struct niu *np, struct tx_ring_info *rp)
   5855{
   5856	(void) niu_tx_channel_reset(np, rp->tx_channel);
   5857}
   5858
   5859static void niu_reset_tx_channels(struct niu *np)
   5860{
   5861	int i;
   5862
   5863	for (i = 0; i < np->num_tx_rings; i++) {
   5864		struct tx_ring_info *rp = &np->tx_rings[i];
   5865
   5866		niu_reset_one_tx_channel(np, rp);
   5867	}
   5868}
   5869
   5870static void niu_stop_one_rx_channel(struct niu *np, struct rx_ring_info *rp)
   5871{
   5872	(void) niu_enable_rx_channel(np, rp->rx_channel, 0);
   5873}
   5874
   5875static void niu_stop_rx_channels(struct niu *np)
   5876{
   5877	int i;
   5878
   5879	for (i = 0; i < np->num_rx_rings; i++) {
   5880		struct rx_ring_info *rp = &np->rx_rings[i];
   5881
   5882		niu_stop_one_rx_channel(np, rp);
   5883	}
   5884}
   5885
   5886static void niu_reset_one_rx_channel(struct niu *np, struct rx_ring_info *rp)
   5887{
   5888	int channel = rp->rx_channel;
   5889
   5890	(void) niu_rx_channel_reset(np, channel);
   5891	nw64(RX_DMA_ENT_MSK(channel), RX_DMA_ENT_MSK_ALL);
   5892	nw64(RX_DMA_CTL_STAT(channel), 0);
   5893	(void) niu_enable_rx_channel(np, channel, 0);
   5894}
   5895
   5896static void niu_reset_rx_channels(struct niu *np)
   5897{
   5898	int i;
   5899
   5900	for (i = 0; i < np->num_rx_rings; i++) {
   5901		struct rx_ring_info *rp = &np->rx_rings[i];
   5902
   5903		niu_reset_one_rx_channel(np, rp);
   5904	}
   5905}
   5906
   5907static void niu_disable_ipp(struct niu *np)
   5908{
   5909	u64 rd, wr, val;
   5910	int limit;
   5911
   5912	rd = nr64_ipp(IPP_DFIFO_RD_PTR);
   5913	wr = nr64_ipp(IPP_DFIFO_WR_PTR);
   5914	limit = 100;
   5915	while (--limit >= 0 && (rd != wr)) {
   5916		rd = nr64_ipp(IPP_DFIFO_RD_PTR);
   5917		wr = nr64_ipp(IPP_DFIFO_WR_PTR);
   5918	}
   5919	if (limit < 0 &&
   5920	    (rd != 0 && wr != 1)) {
   5921		netdev_err(np->dev, "IPP would not quiesce, rd_ptr[%llx] wr_ptr[%llx]\n",
   5922			   (unsigned long long)nr64_ipp(IPP_DFIFO_RD_PTR),
   5923			   (unsigned long long)nr64_ipp(IPP_DFIFO_WR_PTR));
   5924	}
   5925
   5926	val = nr64_ipp(IPP_CFIG);
   5927	val &= ~(IPP_CFIG_IPP_ENABLE |
   5928		 IPP_CFIG_DFIFO_ECC_EN |
   5929		 IPP_CFIG_DROP_BAD_CRC |
   5930		 IPP_CFIG_CKSUM_EN);
   5931	nw64_ipp(IPP_CFIG, val);
   5932
   5933	(void) niu_ipp_reset(np);
   5934}
   5935
   5936static int niu_init_hw(struct niu *np)
   5937{
   5938	int i, err;
   5939
   5940	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize TXC\n");
   5941	niu_txc_enable_port(np, 1);
   5942	niu_txc_port_dma_enable(np, 1);
   5943	niu_txc_set_imask(np, 0);
   5944
   5945	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize TX channels\n");
   5946	for (i = 0; i < np->num_tx_rings; i++) {
   5947		struct tx_ring_info *rp = &np->tx_rings[i];
   5948
   5949		err = niu_init_one_tx_channel(np, rp);
   5950		if (err)
   5951			return err;
   5952	}
   5953
   5954	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize RX channels\n");
   5955	err = niu_init_rx_channels(np);
   5956	if (err)
   5957		goto out_uninit_tx_channels;
   5958
   5959	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize classifier\n");
   5960	err = niu_init_classifier_hw(np);
   5961	if (err)
   5962		goto out_uninit_rx_channels;
   5963
   5964	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize ZCP\n");
   5965	err = niu_init_zcp(np);
   5966	if (err)
   5967		goto out_uninit_rx_channels;
   5968
   5969	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize IPP\n");
   5970	err = niu_init_ipp(np);
   5971	if (err)
   5972		goto out_uninit_rx_channels;
   5973
   5974	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize MAC\n");
   5975	err = niu_init_mac(np);
   5976	if (err)
   5977		goto out_uninit_ipp;
   5978
   5979	return 0;
   5980
   5981out_uninit_ipp:
   5982	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Uninit IPP\n");
   5983	niu_disable_ipp(np);
   5984
   5985out_uninit_rx_channels:
   5986	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Uninit RX channels\n");
   5987	niu_stop_rx_channels(np);
   5988	niu_reset_rx_channels(np);
   5989
   5990out_uninit_tx_channels:
   5991	netif_printk(np, ifup, KERN_DEBUG, np->dev, "Uninit TX channels\n");
   5992	niu_stop_tx_channels(np);
   5993	niu_reset_tx_channels(np);
   5994
   5995	return err;
   5996}
   5997
   5998static void niu_stop_hw(struct niu *np)
   5999{
   6000	netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Disable interrupts\n");
   6001	niu_enable_interrupts(np, 0);
   6002
   6003	netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Disable RX MAC\n");
   6004	niu_enable_rx_mac(np, 0);
   6005
   6006	netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Disable IPP\n");
   6007	niu_disable_ipp(np);
   6008
   6009	netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Stop TX channels\n");
   6010	niu_stop_tx_channels(np);
   6011
   6012	netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Stop RX channels\n");
   6013	niu_stop_rx_channels(np);
   6014
   6015	netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Reset TX channels\n");
   6016	niu_reset_tx_channels(np);
   6017
   6018	netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Reset RX channels\n");
   6019	niu_reset_rx_channels(np);
   6020}
   6021
   6022static void niu_set_irq_name(struct niu *np)
   6023{
   6024	int port = np->port;
   6025	int i, j = 1;
   6026
   6027	sprintf(np->irq_name[0], "%s:MAC", np->dev->name);
   6028
   6029	if (port == 0) {
   6030		sprintf(np->irq_name[1], "%s:MIF", np->dev->name);
   6031		sprintf(np->irq_name[2], "%s:SYSERR", np->dev->name);
   6032		j = 3;
   6033	}
   6034
   6035	for (i = 0; i < np->num_ldg - j; i++) {
   6036		if (i < np->num_rx_rings)
   6037			sprintf(np->irq_name[i+j], "%s-rx-%d",
   6038				np->dev->name, i);
   6039		else if (i < np->num_tx_rings + np->num_rx_rings)
   6040			sprintf(np->irq_name[i+j], "%s-tx-%d", np->dev->name,
   6041				i - np->num_rx_rings);
   6042	}
   6043}
   6044
   6045static int niu_request_irq(struct niu *np)
   6046{
   6047	int i, j, err;
   6048
   6049	niu_set_irq_name(np);
   6050
   6051	err = 0;
   6052	for (i = 0; i < np->num_ldg; i++) {
   6053		struct niu_ldg *lp = &np->ldg[i];
   6054
   6055		err = request_irq(lp->irq, niu_interrupt, IRQF_SHARED,
   6056				  np->irq_name[i], lp);
   6057		if (err)
   6058			goto out_free_irqs;
   6059
   6060	}
   6061
   6062	return 0;
   6063
   6064out_free_irqs:
   6065	for (j = 0; j < i; j++) {
   6066		struct niu_ldg *lp = &np->ldg[j];
   6067
   6068		free_irq(lp->irq, lp);
   6069	}
   6070	return err;
   6071}
   6072
   6073static void niu_free_irq(struct niu *np)
   6074{
   6075	int i;
   6076
   6077	for (i = 0; i < np->num_ldg; i++) {
   6078		struct niu_ldg *lp = &np->ldg[i];
   6079
   6080		free_irq(lp->irq, lp);
   6081	}
   6082}
   6083
   6084static void niu_enable_napi(struct niu *np)
   6085{
   6086	int i;
   6087
   6088	for (i = 0; i < np->num_ldg; i++)
   6089		napi_enable(&np->ldg[i].napi);
   6090}
   6091
   6092static void niu_disable_napi(struct niu *np)
   6093{
   6094	int i;
   6095
   6096	for (i = 0; i < np->num_ldg; i++)
   6097		napi_disable(&np->ldg[i].napi);
   6098}
   6099
   6100static int niu_open(struct net_device *dev)
   6101{
   6102	struct niu *np = netdev_priv(dev);
   6103	int err;
   6104
   6105	netif_carrier_off(dev);
   6106
   6107	err = niu_alloc_channels(np);
   6108	if (err)
   6109		goto out_err;
   6110
   6111	err = niu_enable_interrupts(np, 0);
   6112	if (err)
   6113		goto out_free_channels;
   6114
   6115	err = niu_request_irq(np);
   6116	if (err)
   6117		goto out_free_channels;
   6118
   6119	niu_enable_napi(np);
   6120
   6121	spin_lock_irq(&np->lock);
   6122
   6123	err = niu_init_hw(np);
   6124	if (!err) {
   6125		timer_setup(&np->timer, niu_timer, 0);
   6126		np->timer.expires = jiffies + HZ;
   6127
   6128		err = niu_enable_interrupts(np, 1);
   6129		if (err)
   6130			niu_stop_hw(np);
   6131	}
   6132
   6133	spin_unlock_irq(&np->lock);
   6134
   6135	if (err) {
   6136		niu_disable_napi(np);
   6137		goto out_free_irq;
   6138	}
   6139
   6140	netif_tx_start_all_queues(dev);
   6141
   6142	if (np->link_config.loopback_mode != LOOPBACK_DISABLED)
   6143		netif_carrier_on(dev);
   6144
   6145	add_timer(&np->timer);
   6146
   6147	return 0;
   6148
   6149out_free_irq:
   6150	niu_free_irq(np);
   6151
   6152out_free_channels:
   6153	niu_free_channels(np);
   6154
   6155out_err:
   6156	return err;
   6157}
   6158
   6159static void niu_full_shutdown(struct niu *np, struct net_device *dev)
   6160{
   6161	cancel_work_sync(&np->reset_task);
   6162
   6163	niu_disable_napi(np);
   6164	netif_tx_stop_all_queues(dev);
   6165
   6166	del_timer_sync(&np->timer);
   6167
   6168	spin_lock_irq(&np->lock);
   6169
   6170	niu_stop_hw(np);
   6171
   6172	spin_unlock_irq(&np->lock);
   6173}
   6174
   6175static int niu_close(struct net_device *dev)
   6176{
   6177	struct niu *np = netdev_priv(dev);
   6178
   6179	niu_full_shutdown(np, dev);
   6180
   6181	niu_free_irq(np);
   6182
   6183	niu_free_channels(np);
   6184
   6185	niu_handle_led(np, 0);
   6186
   6187	return 0;
   6188}
   6189
   6190static void niu_sync_xmac_stats(struct niu *np)
   6191{
   6192	struct niu_xmac_stats *mp = &np->mac_stats.xmac;
   6193
   6194	mp->tx_frames += nr64_mac(TXMAC_FRM_CNT);
   6195	mp->tx_bytes += nr64_mac(TXMAC_BYTE_CNT);
   6196
   6197	mp->rx_link_faults += nr64_mac(LINK_FAULT_CNT);
   6198	mp->rx_align_errors += nr64_mac(RXMAC_ALIGN_ERR_CNT);
   6199	mp->rx_frags += nr64_mac(RXMAC_FRAG_CNT);
   6200	mp->rx_mcasts += nr64_mac(RXMAC_MC_FRM_CNT);
   6201	mp->rx_bcasts += nr64_mac(RXMAC_BC_FRM_CNT);
   6202	mp->rx_hist_cnt1 += nr64_mac(RXMAC_HIST_CNT1);
   6203	mp->rx_hist_cnt2 += nr64_mac(RXMAC_HIST_CNT2);
   6204	mp->rx_hist_cnt3 += nr64_mac(RXMAC_HIST_CNT3);
   6205	mp->rx_hist_cnt4 += nr64_mac(RXMAC_HIST_CNT4);
   6206	mp->rx_hist_cnt5 += nr64_mac(RXMAC_HIST_CNT5);
   6207	mp->rx_hist_cnt6 += nr64_mac(RXMAC_HIST_CNT6);
   6208	mp->rx_hist_cnt7 += nr64_mac(RXMAC_HIST_CNT7);
   6209	mp->rx_octets += nr64_mac(RXMAC_BT_CNT);
   6210	mp->rx_code_violations += nr64_mac(RXMAC_CD_VIO_CNT);
   6211	mp->rx_len_errors += nr64_mac(RXMAC_MPSZER_CNT);
   6212	mp->rx_crc_errors += nr64_mac(RXMAC_CRC_ER_CNT);
   6213}
   6214
   6215static void niu_sync_bmac_stats(struct niu *np)
   6216{
   6217	struct niu_bmac_stats *mp = &np->mac_stats.bmac;
   6218
   6219	mp->tx_bytes += nr64_mac(BTXMAC_BYTE_CNT);
   6220	mp->tx_frames += nr64_mac(BTXMAC_FRM_CNT);
   6221
   6222	mp->rx_frames += nr64_mac(BRXMAC_FRAME_CNT);
   6223	mp->rx_align_errors += nr64_mac(BRXMAC_ALIGN_ERR_CNT);
   6224	mp->rx_crc_errors += nr64_mac(BRXMAC_ALIGN_ERR_CNT);
   6225	mp->rx_len_errors += nr64_mac(BRXMAC_CODE_VIOL_ERR_CNT);
   6226}
   6227
   6228static void niu_sync_mac_stats(struct niu *np)
   6229{
   6230	if (np->flags & NIU_FLAGS_XMAC)
   6231		niu_sync_xmac_stats(np);
   6232	else
   6233		niu_sync_bmac_stats(np);
   6234}
   6235
   6236static void niu_get_rx_stats(struct niu *np,
   6237			     struct rtnl_link_stats64 *stats)
   6238{
   6239	u64 pkts, dropped, errors, bytes;
   6240	struct rx_ring_info *rx_rings;
   6241	int i;
   6242
   6243	pkts = dropped = errors = bytes = 0;
   6244
   6245	rx_rings = READ_ONCE(np->rx_rings);
   6246	if (!rx_rings)
   6247		goto no_rings;
   6248
   6249	for (i = 0; i < np->num_rx_rings; i++) {
   6250		struct rx_ring_info *rp = &rx_rings[i];
   6251
   6252		niu_sync_rx_discard_stats(np, rp, 0);
   6253
   6254		pkts += rp->rx_packets;
   6255		bytes += rp->rx_bytes;
   6256		dropped += rp->rx_dropped;
   6257		errors += rp->rx_errors;
   6258	}
   6259
   6260no_rings:
   6261	stats->rx_packets = pkts;
   6262	stats->rx_bytes = bytes;
   6263	stats->rx_dropped = dropped;
   6264	stats->rx_errors = errors;
   6265}
   6266
   6267static void niu_get_tx_stats(struct niu *np,
   6268			     struct rtnl_link_stats64 *stats)
   6269{
   6270	u64 pkts, errors, bytes;
   6271	struct tx_ring_info *tx_rings;
   6272	int i;
   6273
   6274	pkts = errors = bytes = 0;
   6275
   6276	tx_rings = READ_ONCE(np->tx_rings);
   6277	if (!tx_rings)
   6278		goto no_rings;
   6279
   6280	for (i = 0; i < np->num_tx_rings; i++) {
   6281		struct tx_ring_info *rp = &tx_rings[i];
   6282
   6283		pkts += rp->tx_packets;
   6284		bytes += rp->tx_bytes;
   6285		errors += rp->tx_errors;
   6286	}
   6287
   6288no_rings:
   6289	stats->tx_packets = pkts;
   6290	stats->tx_bytes = bytes;
   6291	stats->tx_errors = errors;
   6292}
   6293
   6294static void niu_get_stats(struct net_device *dev,
   6295			  struct rtnl_link_stats64 *stats)
   6296{
   6297	struct niu *np = netdev_priv(dev);
   6298
   6299	if (netif_running(dev)) {
   6300		niu_get_rx_stats(np, stats);
   6301		niu_get_tx_stats(np, stats);
   6302	}
   6303}
   6304
   6305static void niu_load_hash_xmac(struct niu *np, u16 *hash)
   6306{
   6307	int i;
   6308
   6309	for (i = 0; i < 16; i++)
   6310		nw64_mac(XMAC_HASH_TBL(i), hash[i]);
   6311}
   6312
   6313static void niu_load_hash_bmac(struct niu *np, u16 *hash)
   6314{
   6315	int i;
   6316
   6317	for (i = 0; i < 16; i++)
   6318		nw64_mac(BMAC_HASH_TBL(i), hash[i]);
   6319}
   6320
   6321static void niu_load_hash(struct niu *np, u16 *hash)
   6322{
   6323	if (np->flags & NIU_FLAGS_XMAC)
   6324		niu_load_hash_xmac(np, hash);
   6325	else
   6326		niu_load_hash_bmac(np, hash);
   6327}
   6328
   6329static void niu_set_rx_mode(struct net_device *dev)
   6330{
   6331	struct niu *np = netdev_priv(dev);
   6332	int i, alt_cnt, err;
   6333	struct netdev_hw_addr *ha;
   6334	unsigned long flags;
   6335	u16 hash[16] = { 0, };
   6336
   6337	spin_lock_irqsave(&np->lock, flags);
   6338	niu_enable_rx_mac(np, 0);
   6339
   6340	np->flags &= ~(NIU_FLAGS_MCAST | NIU_FLAGS_PROMISC);
   6341	if (dev->flags & IFF_PROMISC)
   6342		np->flags |= NIU_FLAGS_PROMISC;
   6343	if ((dev->flags & IFF_ALLMULTI) || (!netdev_mc_empty(dev)))
   6344		np->flags |= NIU_FLAGS_MCAST;
   6345
   6346	alt_cnt = netdev_uc_count(dev);
   6347	if (alt_cnt > niu_num_alt_addr(np)) {
   6348		alt_cnt = 0;
   6349		np->flags |= NIU_FLAGS_PROMISC;
   6350	}
   6351
   6352	if (alt_cnt) {
   6353		int index = 0;
   6354
   6355		netdev_for_each_uc_addr(ha, dev) {
   6356			err = niu_set_alt_mac(np, index, ha->addr);
   6357			if (err)
   6358				netdev_warn(dev, "Error %d adding alt mac %d\n",
   6359					    err, index);
   6360			err = niu_enable_alt_mac(np, index, 1);
   6361			if (err)
   6362				netdev_warn(dev, "Error %d enabling alt mac %d\n",
   6363					    err, index);
   6364
   6365			index++;
   6366		}
   6367	} else {
   6368		int alt_start;
   6369		if (np->flags & NIU_FLAGS_XMAC)
   6370			alt_start = 0;
   6371		else
   6372			alt_start = 1;
   6373		for (i = alt_start; i < niu_num_alt_addr(np); i++) {
   6374			err = niu_enable_alt_mac(np, i, 0);
   6375			if (err)
   6376				netdev_warn(dev, "Error %d disabling alt mac %d\n",
   6377					    err, i);
   6378		}
   6379	}
   6380	if (dev->flags & IFF_ALLMULTI) {
   6381		for (i = 0; i < 16; i++)
   6382			hash[i] = 0xffff;
   6383	} else if (!netdev_mc_empty(dev)) {
   6384		netdev_for_each_mc_addr(ha, dev) {
   6385			u32 crc = ether_crc_le(ETH_ALEN, ha->addr);
   6386
   6387			crc >>= 24;
   6388			hash[crc >> 4] |= (1 << (15 - (crc & 0xf)));
   6389		}
   6390	}
   6391
   6392	if (np->flags & NIU_FLAGS_MCAST)
   6393		niu_load_hash(np, hash);
   6394
   6395	niu_enable_rx_mac(np, 1);
   6396	spin_unlock_irqrestore(&np->lock, flags);
   6397}
   6398
   6399static int niu_set_mac_addr(struct net_device *dev, void *p)
   6400{
   6401	struct niu *np = netdev_priv(dev);
   6402	struct sockaddr *addr = p;
   6403	unsigned long flags;
   6404
   6405	if (!is_valid_ether_addr(addr->sa_data))
   6406		return -EADDRNOTAVAIL;
   6407
   6408	eth_hw_addr_set(dev, addr->sa_data);
   6409
   6410	if (!netif_running(dev))
   6411		return 0;
   6412
   6413	spin_lock_irqsave(&np->lock, flags);
   6414	niu_enable_rx_mac(np, 0);
   6415	niu_set_primary_mac(np, dev->dev_addr);
   6416	niu_enable_rx_mac(np, 1);
   6417	spin_unlock_irqrestore(&np->lock, flags);
   6418
   6419	return 0;
   6420}
   6421
   6422static int niu_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
   6423{
   6424	return -EOPNOTSUPP;
   6425}
   6426
   6427static void niu_netif_stop(struct niu *np)
   6428{
   6429	netif_trans_update(np->dev);	/* prevent tx timeout */
   6430
   6431	niu_disable_napi(np);
   6432
   6433	netif_tx_disable(np->dev);
   6434}
   6435
   6436static void niu_netif_start(struct niu *np)
   6437{
   6438	/* NOTE: unconditional netif_wake_queue is only appropriate
   6439	 * so long as all callers are assured to have free tx slots
   6440	 * (such as after niu_init_hw).
   6441	 */
   6442	netif_tx_wake_all_queues(np->dev);
   6443
   6444	niu_enable_napi(np);
   6445
   6446	niu_enable_interrupts(np, 1);
   6447}
   6448
   6449static void niu_reset_buffers(struct niu *np)
   6450{
   6451	int i, j, k, err;
   6452
   6453	if (np->rx_rings) {
   6454		for (i = 0; i < np->num_rx_rings; i++) {
   6455			struct rx_ring_info *rp = &np->rx_rings[i];
   6456
   6457			for (j = 0, k = 0; j < MAX_RBR_RING_SIZE; j++) {
   6458				struct page *page;
   6459
   6460				page = rp->rxhash[j];
   6461				while (page) {
   6462					struct page *next = niu_next_page(page);
   6463					u64 base = page->index;
   6464					base = base >> RBR_DESCR_ADDR_SHIFT;
   6465					rp->rbr[k++] = cpu_to_le32(base);
   6466					page = next;
   6467				}
   6468			}
   6469			for (; k < MAX_RBR_RING_SIZE; k++) {
   6470				err = niu_rbr_add_page(np, rp, GFP_ATOMIC, k);
   6471				if (unlikely(err))
   6472					break;
   6473			}
   6474
   6475			rp->rbr_index = rp->rbr_table_size - 1;
   6476			rp->rcr_index = 0;
   6477			rp->rbr_pending = 0;
   6478			rp->rbr_refill_pending = 0;
   6479		}
   6480	}
   6481	if (np->tx_rings) {
   6482		for (i = 0; i < np->num_tx_rings; i++) {
   6483			struct tx_ring_info *rp = &np->tx_rings[i];
   6484
   6485			for (j = 0; j < MAX_TX_RING_SIZE; j++) {
   6486				if (rp->tx_buffs[j].skb)
   6487					(void) release_tx_packet(np, rp, j);
   6488			}
   6489
   6490			rp->pending = MAX_TX_RING_SIZE;
   6491			rp->prod = 0;
   6492			rp->cons = 0;
   6493			rp->wrap_bit = 0;
   6494		}
   6495	}
   6496}
   6497
   6498static void niu_reset_task(struct work_struct *work)
   6499{
   6500	struct niu *np = container_of(work, struct niu, reset_task);
   6501	unsigned long flags;
   6502	int err;
   6503
   6504	spin_lock_irqsave(&np->lock, flags);
   6505	if (!netif_running(np->dev)) {
   6506		spin_unlock_irqrestore(&np->lock, flags);
   6507		return;
   6508	}
   6509
   6510	spin_unlock_irqrestore(&np->lock, flags);
   6511
   6512	del_timer_sync(&np->timer);
   6513
   6514	niu_netif_stop(np);
   6515
   6516	spin_lock_irqsave(&np->lock, flags);
   6517
   6518	niu_stop_hw(np);
   6519
   6520	spin_unlock_irqrestore(&np->lock, flags);
   6521
   6522	niu_reset_buffers(np);
   6523
   6524	spin_lock_irqsave(&np->lock, flags);
   6525
   6526	err = niu_init_hw(np);
   6527	if (!err) {
   6528		np->timer.expires = jiffies + HZ;
   6529		add_timer(&np->timer);
   6530		niu_netif_start(np);
   6531	}
   6532
   6533	spin_unlock_irqrestore(&np->lock, flags);
   6534}
   6535
   6536static void niu_tx_timeout(struct net_device *dev, unsigned int txqueue)
   6537{
   6538	struct niu *np = netdev_priv(dev);
   6539
   6540	dev_err(np->device, "%s: Transmit timed out, resetting\n",
   6541		dev->name);
   6542
   6543	schedule_work(&np->reset_task);
   6544}
   6545
   6546static void niu_set_txd(struct tx_ring_info *rp, int index,
   6547			u64 mapping, u64 len, u64 mark,
   6548			u64 n_frags)
   6549{
   6550	__le64 *desc = &rp->descr[index];
   6551
   6552	*desc = cpu_to_le64(mark |
   6553			    (n_frags << TX_DESC_NUM_PTR_SHIFT) |
   6554			    (len << TX_DESC_TR_LEN_SHIFT) |
   6555			    (mapping & TX_DESC_SAD));
   6556}
   6557
   6558static u64 niu_compute_tx_flags(struct sk_buff *skb, struct ethhdr *ehdr,
   6559				u64 pad_bytes, u64 len)
   6560{
   6561	u16 eth_proto, eth_proto_inner;
   6562	u64 csum_bits, l3off, ihl, ret;
   6563	u8 ip_proto;
   6564	int ipv6;
   6565
   6566	eth_proto = be16_to_cpu(ehdr->h_proto);
   6567	eth_proto_inner = eth_proto;
   6568	if (eth_proto == ETH_P_8021Q) {
   6569		struct vlan_ethhdr *vp = (struct vlan_ethhdr *) ehdr;
   6570		__be16 val = vp->h_vlan_encapsulated_proto;
   6571
   6572		eth_proto_inner = be16_to_cpu(val);
   6573	}
   6574
   6575	ipv6 = ihl = 0;
   6576	switch (skb->protocol) {
   6577	case cpu_to_be16(ETH_P_IP):
   6578		ip_proto = ip_hdr(skb)->protocol;
   6579		ihl = ip_hdr(skb)->ihl;
   6580		break;
   6581	case cpu_to_be16(ETH_P_IPV6):
   6582		ip_proto = ipv6_hdr(skb)->nexthdr;
   6583		ihl = (40 >> 2);
   6584		ipv6 = 1;
   6585		break;
   6586	default:
   6587		ip_proto = ihl = 0;
   6588		break;
   6589	}
   6590
   6591	csum_bits = TXHDR_CSUM_NONE;
   6592	if (skb->ip_summed == CHECKSUM_PARTIAL) {
   6593		u64 start, stuff;
   6594
   6595		csum_bits = (ip_proto == IPPROTO_TCP ?
   6596			     TXHDR_CSUM_TCP :
   6597			     (ip_proto == IPPROTO_UDP ?
   6598			      TXHDR_CSUM_UDP : TXHDR_CSUM_SCTP));
   6599
   6600		start = skb_checksum_start_offset(skb) -
   6601			(pad_bytes + sizeof(struct tx_pkt_hdr));
   6602		stuff = start + skb->csum_offset;
   6603
   6604		csum_bits |= (start / 2) << TXHDR_L4START_SHIFT;
   6605		csum_bits |= (stuff / 2) << TXHDR_L4STUFF_SHIFT;
   6606	}
   6607
   6608	l3off = skb_network_offset(skb) -
   6609		(pad_bytes + sizeof(struct tx_pkt_hdr));
   6610
   6611	ret = (((pad_bytes / 2) << TXHDR_PAD_SHIFT) |
   6612	       (len << TXHDR_LEN_SHIFT) |
   6613	       ((l3off / 2) << TXHDR_L3START_SHIFT) |
   6614	       (ihl << TXHDR_IHL_SHIFT) |
   6615	       ((eth_proto_inner < ETH_P_802_3_MIN) ? TXHDR_LLC : 0) |
   6616	       ((eth_proto == ETH_P_8021Q) ? TXHDR_VLAN : 0) |
   6617	       (ipv6 ? TXHDR_IP_VER : 0) |
   6618	       csum_bits);
   6619
   6620	return ret;
   6621}
   6622
   6623static netdev_tx_t niu_start_xmit(struct sk_buff *skb,
   6624				  struct net_device *dev)
   6625{
   6626	struct niu *np = netdev_priv(dev);
   6627	unsigned long align, headroom;
   6628	struct netdev_queue *txq;
   6629	struct tx_ring_info *rp;
   6630	struct tx_pkt_hdr *tp;
   6631	unsigned int len, nfg;
   6632	struct ethhdr *ehdr;
   6633	int prod, i, tlen;
   6634	u64 mapping, mrk;
   6635
   6636	i = skb_get_queue_mapping(skb);
   6637	rp = &np->tx_rings[i];
   6638	txq = netdev_get_tx_queue(dev, i);
   6639
   6640	if (niu_tx_avail(rp) <= (skb_shinfo(skb)->nr_frags + 1)) {
   6641		netif_tx_stop_queue(txq);
   6642		dev_err(np->device, "%s: BUG! Tx ring full when queue awake!\n", dev->name);
   6643		rp->tx_errors++;
   6644		return NETDEV_TX_BUSY;
   6645	}
   6646
   6647	if (eth_skb_pad(skb))
   6648		goto out;
   6649
   6650	len = sizeof(struct tx_pkt_hdr) + 15;
   6651	if (skb_headroom(skb) < len) {
   6652		struct sk_buff *skb_new;
   6653
   6654		skb_new = skb_realloc_headroom(skb, len);
   6655		if (!skb_new)
   6656			goto out_drop;
   6657		kfree_skb(skb);
   6658		skb = skb_new;
   6659	} else
   6660		skb_orphan(skb);
   6661
   6662	align = ((unsigned long) skb->data & (16 - 1));
   6663	headroom = align + sizeof(struct tx_pkt_hdr);
   6664
   6665	ehdr = (struct ethhdr *) skb->data;
   6666	tp = skb_push(skb, headroom);
   6667
   6668	len = skb->len - sizeof(struct tx_pkt_hdr);
   6669	tp->flags = cpu_to_le64(niu_compute_tx_flags(skb, ehdr, align, len));
   6670	tp->resv = 0;
   6671
   6672	len = skb_headlen(skb);
   6673	mapping = np->ops->map_single(np->device, skb->data,
   6674				      len, DMA_TO_DEVICE);
   6675
   6676	prod = rp->prod;
   6677
   6678	rp->tx_buffs[prod].skb = skb;
   6679	rp->tx_buffs[prod].mapping = mapping;
   6680
   6681	mrk = TX_DESC_SOP;
   6682	if (++rp->mark_counter == rp->mark_freq) {
   6683		rp->mark_counter = 0;
   6684		mrk |= TX_DESC_MARK;
   6685		rp->mark_pending++;
   6686	}
   6687
   6688	tlen = len;
   6689	nfg = skb_shinfo(skb)->nr_frags;
   6690	while (tlen > 0) {
   6691		tlen -= MAX_TX_DESC_LEN;
   6692		nfg++;
   6693	}
   6694
   6695	while (len > 0) {
   6696		unsigned int this_len = len;
   6697
   6698		if (this_len > MAX_TX_DESC_LEN)
   6699			this_len = MAX_TX_DESC_LEN;
   6700
   6701		niu_set_txd(rp, prod, mapping, this_len, mrk, nfg);
   6702		mrk = nfg = 0;
   6703
   6704		prod = NEXT_TX(rp, prod);
   6705		mapping += this_len;
   6706		len -= this_len;
   6707	}
   6708
   6709	for (i = 0; i <  skb_shinfo(skb)->nr_frags; i++) {
   6710		const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
   6711
   6712		len = skb_frag_size(frag);
   6713		mapping = np->ops->map_page(np->device, skb_frag_page(frag),
   6714					    skb_frag_off(frag), len,
   6715					    DMA_TO_DEVICE);
   6716
   6717		rp->tx_buffs[prod].skb = NULL;
   6718		rp->tx_buffs[prod].mapping = mapping;
   6719
   6720		niu_set_txd(rp, prod, mapping, len, 0, 0);
   6721
   6722		prod = NEXT_TX(rp, prod);
   6723	}
   6724
   6725	if (prod < rp->prod)
   6726		rp->wrap_bit ^= TX_RING_KICK_WRAP;
   6727	rp->prod = prod;
   6728
   6729	nw64(TX_RING_KICK(rp->tx_channel), rp->wrap_bit | (prod << 3));
   6730
   6731	if (unlikely(niu_tx_avail(rp) <= (MAX_SKB_FRAGS + 1))) {
   6732		netif_tx_stop_queue(txq);
   6733		if (niu_tx_avail(rp) > NIU_TX_WAKEUP_THRESH(rp))
   6734			netif_tx_wake_queue(txq);
   6735	}
   6736
   6737out:
   6738	return NETDEV_TX_OK;
   6739
   6740out_drop:
   6741	rp->tx_errors++;
   6742	kfree_skb(skb);
   6743	goto out;
   6744}
   6745
   6746static int niu_change_mtu(struct net_device *dev, int new_mtu)
   6747{
   6748	struct niu *np = netdev_priv(dev);
   6749	int err, orig_jumbo, new_jumbo;
   6750
   6751	orig_jumbo = (dev->mtu > ETH_DATA_LEN);
   6752	new_jumbo = (new_mtu > ETH_DATA_LEN);
   6753
   6754	dev->mtu = new_mtu;
   6755
   6756	if (!netif_running(dev) ||
   6757	    (orig_jumbo == new_jumbo))
   6758		return 0;
   6759
   6760	niu_full_shutdown(np, dev);
   6761
   6762	niu_free_channels(np);
   6763
   6764	niu_enable_napi(np);
   6765
   6766	err = niu_alloc_channels(np);
   6767	if (err)
   6768		return err;
   6769
   6770	spin_lock_irq(&np->lock);
   6771
   6772	err = niu_init_hw(np);
   6773	if (!err) {
   6774		timer_setup(&np->timer, niu_timer, 0);
   6775		np->timer.expires = jiffies + HZ;
   6776
   6777		err = niu_enable_interrupts(np, 1);
   6778		if (err)
   6779			niu_stop_hw(np);
   6780	}
   6781
   6782	spin_unlock_irq(&np->lock);
   6783
   6784	if (!err) {
   6785		netif_tx_start_all_queues(dev);
   6786		if (np->link_config.loopback_mode != LOOPBACK_DISABLED)
   6787			netif_carrier_on(dev);
   6788
   6789		add_timer(&np->timer);
   6790	}
   6791
   6792	return err;
   6793}
   6794
   6795static void niu_get_drvinfo(struct net_device *dev,
   6796			    struct ethtool_drvinfo *info)
   6797{
   6798	struct niu *np = netdev_priv(dev);
   6799	struct niu_vpd *vpd = &np->vpd;
   6800
   6801	strlcpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver));
   6802	strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version));
   6803	snprintf(info->fw_version, sizeof(info->fw_version), "%d.%d",
   6804		vpd->fcode_major, vpd->fcode_minor);
   6805	if (np->parent->plat_type != PLAT_TYPE_NIU)
   6806		strlcpy(info->bus_info, pci_name(np->pdev),
   6807			sizeof(info->bus_info));
   6808}
   6809
   6810static int niu_get_link_ksettings(struct net_device *dev,
   6811				  struct ethtool_link_ksettings *cmd)
   6812{
   6813	struct niu *np = netdev_priv(dev);
   6814	struct niu_link_config *lp;
   6815
   6816	lp = &np->link_config;
   6817
   6818	memset(cmd, 0, sizeof(*cmd));
   6819	cmd->base.phy_address = np->phy_addr;
   6820	ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
   6821						lp->supported);
   6822	ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
   6823						lp->active_advertising);
   6824	cmd->base.autoneg = lp->active_autoneg;
   6825	cmd->base.speed = lp->active_speed;
   6826	cmd->base.duplex = lp->active_duplex;
   6827	cmd->base.port = (np->flags & NIU_FLAGS_FIBER) ? PORT_FIBRE : PORT_TP;
   6828
   6829	return 0;
   6830}
   6831
   6832static int niu_set_link_ksettings(struct net_device *dev,
   6833				  const struct ethtool_link_ksettings *cmd)
   6834{
   6835	struct niu *np = netdev_priv(dev);
   6836	struct niu_link_config *lp = &np->link_config;
   6837
   6838	ethtool_convert_link_mode_to_legacy_u32(&lp->advertising,
   6839						cmd->link_modes.advertising);
   6840	lp->speed = cmd->base.speed;
   6841	lp->duplex = cmd->base.duplex;
   6842	lp->autoneg = cmd->base.autoneg;
   6843	return niu_init_link(np);
   6844}
   6845
   6846static u32 niu_get_msglevel(struct net_device *dev)
   6847{
   6848	struct niu *np = netdev_priv(dev);
   6849	return np->msg_enable;
   6850}
   6851
   6852static void niu_set_msglevel(struct net_device *dev, u32 value)
   6853{
   6854	struct niu *np = netdev_priv(dev);
   6855	np->msg_enable = value;
   6856}
   6857
   6858static int niu_nway_reset(struct net_device *dev)
   6859{
   6860	struct niu *np = netdev_priv(dev);
   6861
   6862	if (np->link_config.autoneg)
   6863		return niu_init_link(np);
   6864
   6865	return 0;
   6866}
   6867
   6868static int niu_get_eeprom_len(struct net_device *dev)
   6869{
   6870	struct niu *np = netdev_priv(dev);
   6871
   6872	return np->eeprom_len;
   6873}
   6874
   6875static int niu_get_eeprom(struct net_device *dev,
   6876			  struct ethtool_eeprom *eeprom, u8 *data)
   6877{
   6878	struct niu *np = netdev_priv(dev);
   6879	u32 offset, len, val;
   6880
   6881	offset = eeprom->offset;
   6882	len = eeprom->len;
   6883
   6884	if (offset + len < offset)
   6885		return -EINVAL;
   6886	if (offset >= np->eeprom_len)
   6887		return -EINVAL;
   6888	if (offset + len > np->eeprom_len)
   6889		len = eeprom->len = np->eeprom_len - offset;
   6890
   6891	if (offset & 3) {
   6892		u32 b_offset, b_count;
   6893
   6894		b_offset = offset & 3;
   6895		b_count = 4 - b_offset;
   6896		if (b_count > len)
   6897			b_count = len;
   6898
   6899		val = nr64(ESPC_NCR((offset - b_offset) / 4));
   6900		memcpy(data, ((char *)&val) + b_offset, b_count);
   6901		data += b_count;
   6902		len -= b_count;
   6903		offset += b_count;
   6904	}
   6905	while (len >= 4) {
   6906		val = nr64(ESPC_NCR(offset / 4));
   6907		memcpy(data, &val, 4);
   6908		data += 4;
   6909		len -= 4;
   6910		offset += 4;
   6911	}
   6912	if (len) {
   6913		val = nr64(ESPC_NCR(offset / 4));
   6914		memcpy(data, &val, len);
   6915	}
   6916	return 0;
   6917}
   6918
   6919static void niu_ethflow_to_l3proto(int flow_type, u8 *pid)
   6920{
   6921	switch (flow_type) {
   6922	case TCP_V4_FLOW:
   6923	case TCP_V6_FLOW:
   6924		*pid = IPPROTO_TCP;
   6925		break;
   6926	case UDP_V4_FLOW:
   6927	case UDP_V6_FLOW:
   6928		*pid = IPPROTO_UDP;
   6929		break;
   6930	case SCTP_V4_FLOW:
   6931	case SCTP_V6_FLOW:
   6932		*pid = IPPROTO_SCTP;
   6933		break;
   6934	case AH_V4_FLOW:
   6935	case AH_V6_FLOW:
   6936		*pid = IPPROTO_AH;
   6937		break;
   6938	case ESP_V4_FLOW:
   6939	case ESP_V6_FLOW:
   6940		*pid = IPPROTO_ESP;
   6941		break;
   6942	default:
   6943		*pid = 0;
   6944		break;
   6945	}
   6946}
   6947
   6948static int niu_class_to_ethflow(u64 class, int *flow_type)
   6949{
   6950	switch (class) {
   6951	case CLASS_CODE_TCP_IPV4:
   6952		*flow_type = TCP_V4_FLOW;
   6953		break;
   6954	case CLASS_CODE_UDP_IPV4:
   6955		*flow_type = UDP_V4_FLOW;
   6956		break;
   6957	case CLASS_CODE_AH_ESP_IPV4:
   6958		*flow_type = AH_V4_FLOW;
   6959		break;
   6960	case CLASS_CODE_SCTP_IPV4:
   6961		*flow_type = SCTP_V4_FLOW;
   6962		break;
   6963	case CLASS_CODE_TCP_IPV6:
   6964		*flow_type = TCP_V6_FLOW;
   6965		break;
   6966	case CLASS_CODE_UDP_IPV6:
   6967		*flow_type = UDP_V6_FLOW;
   6968		break;
   6969	case CLASS_CODE_AH_ESP_IPV6:
   6970		*flow_type = AH_V6_FLOW;
   6971		break;
   6972	case CLASS_CODE_SCTP_IPV6:
   6973		*flow_type = SCTP_V6_FLOW;
   6974		break;
   6975	case CLASS_CODE_USER_PROG1:
   6976	case CLASS_CODE_USER_PROG2:
   6977	case CLASS_CODE_USER_PROG3:
   6978	case CLASS_CODE_USER_PROG4:
   6979		*flow_type = IP_USER_FLOW;
   6980		break;
   6981	default:
   6982		return -EINVAL;
   6983	}
   6984
   6985	return 0;
   6986}
   6987
   6988static int niu_ethflow_to_class(int flow_type, u64 *class)
   6989{
   6990	switch (flow_type) {
   6991	case TCP_V4_FLOW:
   6992		*class = CLASS_CODE_TCP_IPV4;
   6993		break;
   6994	case UDP_V4_FLOW:
   6995		*class = CLASS_CODE_UDP_IPV4;
   6996		break;
   6997	case AH_ESP_V4_FLOW:
   6998	case AH_V4_FLOW:
   6999	case ESP_V4_FLOW:
   7000		*class = CLASS_CODE_AH_ESP_IPV4;
   7001		break;
   7002	case SCTP_V4_FLOW:
   7003		*class = CLASS_CODE_SCTP_IPV4;
   7004		break;
   7005	case TCP_V6_FLOW:
   7006		*class = CLASS_CODE_TCP_IPV6;
   7007		break;
   7008	case UDP_V6_FLOW:
   7009		*class = CLASS_CODE_UDP_IPV6;
   7010		break;
   7011	case AH_ESP_V6_FLOW:
   7012	case AH_V6_FLOW:
   7013	case ESP_V6_FLOW:
   7014		*class = CLASS_CODE_AH_ESP_IPV6;
   7015		break;
   7016	case SCTP_V6_FLOW:
   7017		*class = CLASS_CODE_SCTP_IPV6;
   7018		break;
   7019	default:
   7020		return 0;
   7021	}
   7022
   7023	return 1;
   7024}
   7025
   7026static u64 niu_flowkey_to_ethflow(u64 flow_key)
   7027{
   7028	u64 ethflow = 0;
   7029
   7030	if (flow_key & FLOW_KEY_L2DA)
   7031		ethflow |= RXH_L2DA;
   7032	if (flow_key & FLOW_KEY_VLAN)
   7033		ethflow |= RXH_VLAN;
   7034	if (flow_key & FLOW_KEY_IPSA)
   7035		ethflow |= RXH_IP_SRC;
   7036	if (flow_key & FLOW_KEY_IPDA)
   7037		ethflow |= RXH_IP_DST;
   7038	if (flow_key & FLOW_KEY_PROTO)
   7039		ethflow |= RXH_L3_PROTO;
   7040	if (flow_key & (FLOW_KEY_L4_BYTE12 << FLOW_KEY_L4_0_SHIFT))
   7041		ethflow |= RXH_L4_B_0_1;
   7042	if (flow_key & (FLOW_KEY_L4_BYTE12 << FLOW_KEY_L4_1_SHIFT))
   7043		ethflow |= RXH_L4_B_2_3;
   7044
   7045	return ethflow;
   7046
   7047}
   7048
   7049static int niu_ethflow_to_flowkey(u64 ethflow, u64 *flow_key)
   7050{
   7051	u64 key = 0;
   7052
   7053	if (ethflow & RXH_L2DA)
   7054		key |= FLOW_KEY_L2DA;
   7055	if (ethflow & RXH_VLAN)
   7056		key |= FLOW_KEY_VLAN;
   7057	if (ethflow & RXH_IP_SRC)
   7058		key |= FLOW_KEY_IPSA;
   7059	if (ethflow & RXH_IP_DST)
   7060		key |= FLOW_KEY_IPDA;
   7061	if (ethflow & RXH_L3_PROTO)
   7062		key |= FLOW_KEY_PROTO;
   7063	if (ethflow & RXH_L4_B_0_1)
   7064		key |= (FLOW_KEY_L4_BYTE12 << FLOW_KEY_L4_0_SHIFT);
   7065	if (ethflow & RXH_L4_B_2_3)
   7066		key |= (FLOW_KEY_L4_BYTE12 << FLOW_KEY_L4_1_SHIFT);
   7067
   7068	*flow_key = key;
   7069
   7070	return 1;
   7071
   7072}
   7073
   7074static int niu_get_hash_opts(struct niu *np, struct ethtool_rxnfc *nfc)
   7075{
   7076	u64 class;
   7077
   7078	nfc->data = 0;
   7079
   7080	if (!niu_ethflow_to_class(nfc->flow_type, &class))
   7081		return -EINVAL;
   7082
   7083	if (np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] &
   7084	    TCAM_KEY_DISC)
   7085		nfc->data = RXH_DISCARD;
   7086	else
   7087		nfc->data = niu_flowkey_to_ethflow(np->parent->flow_key[class -
   7088						      CLASS_CODE_USER_PROG1]);
   7089	return 0;
   7090}
   7091
   7092static void niu_get_ip4fs_from_tcam_key(struct niu_tcam_entry *tp,
   7093					struct ethtool_rx_flow_spec *fsp)
   7094{
   7095	u32 tmp;
   7096	u16 prt;
   7097
   7098	tmp = (tp->key[3] & TCAM_V4KEY3_SADDR) >> TCAM_V4KEY3_SADDR_SHIFT;
   7099	fsp->h_u.tcp_ip4_spec.ip4src = cpu_to_be32(tmp);
   7100
   7101	tmp = (tp->key[3] & TCAM_V4KEY3_DADDR) >> TCAM_V4KEY3_DADDR_SHIFT;
   7102	fsp->h_u.tcp_ip4_spec.ip4dst = cpu_to_be32(tmp);
   7103
   7104	tmp = (tp->key_mask[3] & TCAM_V4KEY3_SADDR) >> TCAM_V4KEY3_SADDR_SHIFT;
   7105	fsp->m_u.tcp_ip4_spec.ip4src = cpu_to_be32(tmp);
   7106
   7107	tmp = (tp->key_mask[3] & TCAM_V4KEY3_DADDR) >> TCAM_V4KEY3_DADDR_SHIFT;
   7108	fsp->m_u.tcp_ip4_spec.ip4dst = cpu_to_be32(tmp);
   7109
   7110	fsp->h_u.tcp_ip4_spec.tos = (tp->key[2] & TCAM_V4KEY2_TOS) >>
   7111		TCAM_V4KEY2_TOS_SHIFT;
   7112	fsp->m_u.tcp_ip4_spec.tos = (tp->key_mask[2] & TCAM_V4KEY2_TOS) >>
   7113		TCAM_V4KEY2_TOS_SHIFT;
   7114
   7115	switch (fsp->flow_type) {
   7116	case TCP_V4_FLOW:
   7117	case UDP_V4_FLOW:
   7118	case SCTP_V4_FLOW:
   7119		prt = ((tp->key[2] & TCAM_V4KEY2_PORT_SPI) >>
   7120			TCAM_V4KEY2_PORT_SPI_SHIFT) >> 16;
   7121		fsp->h_u.tcp_ip4_spec.psrc = cpu_to_be16(prt);
   7122
   7123		prt = ((tp->key[2] & TCAM_V4KEY2_PORT_SPI) >>
   7124			TCAM_V4KEY2_PORT_SPI_SHIFT) & 0xffff;
   7125		fsp->h_u.tcp_ip4_spec.pdst = cpu_to_be16(prt);
   7126
   7127		prt = ((tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >>
   7128			TCAM_V4KEY2_PORT_SPI_SHIFT) >> 16;
   7129		fsp->m_u.tcp_ip4_spec.psrc = cpu_to_be16(prt);
   7130
   7131		prt = ((tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >>
   7132			 TCAM_V4KEY2_PORT_SPI_SHIFT) & 0xffff;
   7133		fsp->m_u.tcp_ip4_spec.pdst = cpu_to_be16(prt);
   7134		break;
   7135	case AH_V4_FLOW:
   7136	case ESP_V4_FLOW:
   7137		tmp = (tp->key[2] & TCAM_V4KEY2_PORT_SPI) >>
   7138			TCAM_V4KEY2_PORT_SPI_SHIFT;
   7139		fsp->h_u.ah_ip4_spec.spi = cpu_to_be32(tmp);
   7140
   7141		tmp = (tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >>
   7142			TCAM_V4KEY2_PORT_SPI_SHIFT;
   7143		fsp->m_u.ah_ip4_spec.spi = cpu_to_be32(tmp);
   7144		break;
   7145	case IP_USER_FLOW:
   7146		tmp = (tp->key[2] & TCAM_V4KEY2_PORT_SPI) >>
   7147			TCAM_V4KEY2_PORT_SPI_SHIFT;
   7148		fsp->h_u.usr_ip4_spec.l4_4_bytes = cpu_to_be32(tmp);
   7149
   7150		tmp = (tp->key_mask[2] & TCAM_V4KEY2_PORT_SPI) >>
   7151			TCAM_V4KEY2_PORT_SPI_SHIFT;
   7152		fsp->m_u.usr_ip4_spec.l4_4_bytes = cpu_to_be32(tmp);
   7153
   7154		fsp->h_u.usr_ip4_spec.proto =
   7155			(tp->key[2] & TCAM_V4KEY2_PROTO) >>
   7156			TCAM_V4KEY2_PROTO_SHIFT;
   7157		fsp->m_u.usr_ip4_spec.proto =
   7158			(tp->key_mask[2] & TCAM_V4KEY2_PROTO) >>
   7159			TCAM_V4KEY2_PROTO_SHIFT;
   7160
   7161		fsp->h_u.usr_ip4_spec.ip_ver = ETH_RX_NFC_IP4;
   7162		break;
   7163	default:
   7164		break;
   7165	}
   7166}
   7167
   7168static int niu_get_ethtool_tcam_entry(struct niu *np,
   7169				      struct ethtool_rxnfc *nfc)
   7170{
   7171	struct niu_parent *parent = np->parent;
   7172	struct niu_tcam_entry *tp;
   7173	struct ethtool_rx_flow_spec *fsp = &nfc->fs;
   7174	u16 idx;
   7175	u64 class;
   7176	int ret = 0;
   7177
   7178	idx = tcam_get_index(np, (u16)nfc->fs.location);
   7179
   7180	tp = &parent->tcam[idx];
   7181	if (!tp->valid) {
   7182		netdev_info(np->dev, "niu%d: entry [%d] invalid for idx[%d]\n",
   7183			    parent->index, (u16)nfc->fs.location, idx);
   7184		return -EINVAL;
   7185	}
   7186
   7187	/* fill the flow spec entry */
   7188	class = (tp->key[0] & TCAM_V4KEY0_CLASS_CODE) >>
   7189		TCAM_V4KEY0_CLASS_CODE_SHIFT;
   7190	ret = niu_class_to_ethflow(class, &fsp->flow_type);
   7191	if (ret < 0) {
   7192		netdev_info(np->dev, "niu%d: niu_class_to_ethflow failed\n",
   7193			    parent->index);
   7194		goto out;
   7195	}
   7196
   7197	if (fsp->flow_type == AH_V4_FLOW || fsp->flow_type == AH_V6_FLOW) {
   7198		u32 proto = (tp->key[2] & TCAM_V4KEY2_PROTO) >>
   7199			TCAM_V4KEY2_PROTO_SHIFT;
   7200		if (proto == IPPROTO_ESP) {
   7201			if (fsp->flow_type == AH_V4_FLOW)
   7202				fsp->flow_type = ESP_V4_FLOW;
   7203			else
   7204				fsp->flow_type = ESP_V6_FLOW;
   7205		}
   7206	}
   7207
   7208	switch (fsp->flow_type) {
   7209	case TCP_V4_FLOW:
   7210	case UDP_V4_FLOW:
   7211	case SCTP_V4_FLOW:
   7212	case AH_V4_FLOW:
   7213	case ESP_V4_FLOW:
   7214		niu_get_ip4fs_from_tcam_key(tp, fsp);
   7215		break;
   7216	case TCP_V6_FLOW:
   7217	case UDP_V6_FLOW:
   7218	case SCTP_V6_FLOW:
   7219	case AH_V6_FLOW:
   7220	case ESP_V6_FLOW:
   7221		/* Not yet implemented */
   7222		ret = -EINVAL;
   7223		break;
   7224	case IP_USER_FLOW:
   7225		niu_get_ip4fs_from_tcam_key(tp, fsp);
   7226		break;
   7227	default:
   7228		ret = -EINVAL;
   7229		break;
   7230	}
   7231
   7232	if (ret < 0)
   7233		goto out;
   7234
   7235	if (tp->assoc_data & TCAM_ASSOCDATA_DISC)
   7236		fsp->ring_cookie = RX_CLS_FLOW_DISC;
   7237	else
   7238		fsp->ring_cookie = (tp->assoc_data & TCAM_ASSOCDATA_OFFSET) >>
   7239			TCAM_ASSOCDATA_OFFSET_SHIFT;
   7240
   7241	/* put the tcam size here */
   7242	nfc->data = tcam_get_size(np);
   7243out:
   7244	return ret;
   7245}
   7246
   7247static int niu_get_ethtool_tcam_all(struct niu *np,
   7248				    struct ethtool_rxnfc *nfc,
   7249				    u32 *rule_locs)
   7250{
   7251	struct niu_parent *parent = np->parent;
   7252	struct niu_tcam_entry *tp;
   7253	int i, idx, cnt;
   7254	unsigned long flags;
   7255	int ret = 0;
   7256
   7257	/* put the tcam size here */
   7258	nfc->data = tcam_get_size(np);
   7259
   7260	niu_lock_parent(np, flags);
   7261	for (cnt = 0, i = 0; i < nfc->data; i++) {
   7262		idx = tcam_get_index(np, i);
   7263		tp = &parent->tcam[idx];
   7264		if (!tp->valid)
   7265			continue;
   7266		if (cnt == nfc->rule_cnt) {
   7267			ret = -EMSGSIZE;
   7268			break;
   7269		}
   7270		rule_locs[cnt] = i;
   7271		cnt++;
   7272	}
   7273	niu_unlock_parent(np, flags);
   7274
   7275	nfc->rule_cnt = cnt;
   7276
   7277	return ret;
   7278}
   7279
   7280static int niu_get_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
   7281		       u32 *rule_locs)
   7282{
   7283	struct niu *np = netdev_priv(dev);
   7284	int ret = 0;
   7285
   7286	switch (cmd->cmd) {
   7287	case ETHTOOL_GRXFH:
   7288		ret = niu_get_hash_opts(np, cmd);
   7289		break;
   7290	case ETHTOOL_GRXRINGS:
   7291		cmd->data = np->num_rx_rings;
   7292		break;
   7293	case ETHTOOL_GRXCLSRLCNT:
   7294		cmd->rule_cnt = tcam_get_valid_entry_cnt(np);
   7295		break;
   7296	case ETHTOOL_GRXCLSRULE:
   7297		ret = niu_get_ethtool_tcam_entry(np, cmd);
   7298		break;
   7299	case ETHTOOL_GRXCLSRLALL:
   7300		ret = niu_get_ethtool_tcam_all(np, cmd, rule_locs);
   7301		break;
   7302	default:
   7303		ret = -EINVAL;
   7304		break;
   7305	}
   7306
   7307	return ret;
   7308}
   7309
   7310static int niu_set_hash_opts(struct niu *np, struct ethtool_rxnfc *nfc)
   7311{
   7312	u64 class;
   7313	u64 flow_key = 0;
   7314	unsigned long flags;
   7315
   7316	if (!niu_ethflow_to_class(nfc->flow_type, &class))
   7317		return -EINVAL;
   7318
   7319	if (class < CLASS_CODE_USER_PROG1 ||
   7320	    class > CLASS_CODE_SCTP_IPV6)
   7321		return -EINVAL;
   7322
   7323	if (nfc->data & RXH_DISCARD) {
   7324		niu_lock_parent(np, flags);
   7325		flow_key = np->parent->tcam_key[class -
   7326					       CLASS_CODE_USER_PROG1];
   7327		flow_key |= TCAM_KEY_DISC;
   7328		nw64(TCAM_KEY(class - CLASS_CODE_USER_PROG1), flow_key);
   7329		np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] = flow_key;
   7330		niu_unlock_parent(np, flags);
   7331		return 0;
   7332	} else {
   7333		/* Discard was set before, but is not set now */
   7334		if (np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] &
   7335		    TCAM_KEY_DISC) {
   7336			niu_lock_parent(np, flags);
   7337			flow_key = np->parent->tcam_key[class -
   7338					       CLASS_CODE_USER_PROG1];
   7339			flow_key &= ~TCAM_KEY_DISC;
   7340			nw64(TCAM_KEY(class - CLASS_CODE_USER_PROG1),
   7341			     flow_key);
   7342			np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] =
   7343				flow_key;
   7344			niu_unlock_parent(np, flags);
   7345		}
   7346	}
   7347
   7348	if (!niu_ethflow_to_flowkey(nfc->data, &flow_key))
   7349		return -EINVAL;
   7350
   7351	niu_lock_parent(np, flags);
   7352	nw64(FLOW_KEY(class - CLASS_CODE_USER_PROG1), flow_key);
   7353	np->parent->flow_key[class - CLASS_CODE_USER_PROG1] = flow_key;
   7354	niu_unlock_parent(np, flags);
   7355
   7356	return 0;
   7357}
   7358
   7359static void niu_get_tcamkey_from_ip4fs(struct ethtool_rx_flow_spec *fsp,
   7360				       struct niu_tcam_entry *tp,
   7361				       int l2_rdc_tab, u64 class)
   7362{
   7363	u8 pid = 0;
   7364	u32 sip, dip, sipm, dipm, spi, spim;
   7365	u16 sport, dport, spm, dpm;
   7366
   7367	sip = be32_to_cpu(fsp->h_u.tcp_ip4_spec.ip4src);
   7368	sipm = be32_to_cpu(fsp->m_u.tcp_ip4_spec.ip4src);
   7369	dip = be32_to_cpu(fsp->h_u.tcp_ip4_spec.ip4dst);
   7370	dipm = be32_to_cpu(fsp->m_u.tcp_ip4_spec.ip4dst);
   7371
   7372	tp->key[0] = class << TCAM_V4KEY0_CLASS_CODE_SHIFT;
   7373	tp->key_mask[0] = TCAM_V4KEY0_CLASS_CODE;
   7374	tp->key[1] = (u64)l2_rdc_tab << TCAM_V4KEY1_L2RDCNUM_SHIFT;
   7375	tp->key_mask[1] = TCAM_V4KEY1_L2RDCNUM;
   7376
   7377	tp->key[3] = (u64)sip << TCAM_V4KEY3_SADDR_SHIFT;
   7378	tp->key[3] |= dip;
   7379
   7380	tp->key_mask[3] = (u64)sipm << TCAM_V4KEY3_SADDR_SHIFT;
   7381	tp->key_mask[3] |= dipm;
   7382
   7383	tp->key[2] |= ((u64)fsp->h_u.tcp_ip4_spec.tos <<
   7384		       TCAM_V4KEY2_TOS_SHIFT);
   7385	tp->key_mask[2] |= ((u64)fsp->m_u.tcp_ip4_spec.tos <<
   7386			    TCAM_V4KEY2_TOS_SHIFT);
   7387	switch (fsp->flow_type) {
   7388	case TCP_V4_FLOW:
   7389	case UDP_V4_FLOW:
   7390	case SCTP_V4_FLOW:
   7391		sport = be16_to_cpu(fsp->h_u.tcp_ip4_spec.psrc);
   7392		spm = be16_to_cpu(fsp->m_u.tcp_ip4_spec.psrc);
   7393		dport = be16_to_cpu(fsp->h_u.tcp_ip4_spec.pdst);
   7394		dpm = be16_to_cpu(fsp->m_u.tcp_ip4_spec.pdst);
   7395
   7396		tp->key[2] |= (((u64)sport << 16) | dport);
   7397		tp->key_mask[2] |= (((u64)spm << 16) | dpm);
   7398		niu_ethflow_to_l3proto(fsp->flow_type, &pid);
   7399		break;
   7400	case AH_V4_FLOW:
   7401	case ESP_V4_FLOW:
   7402		spi = be32_to_cpu(fsp->h_u.ah_ip4_spec.spi);
   7403		spim = be32_to_cpu(fsp->m_u.ah_ip4_spec.spi);
   7404
   7405		tp->key[2] |= spi;
   7406		tp->key_mask[2] |= spim;
   7407		niu_ethflow_to_l3proto(fsp->flow_type, &pid);
   7408		break;
   7409	case IP_USER_FLOW:
   7410		spi = be32_to_cpu(fsp->h_u.usr_ip4_spec.l4_4_bytes);
   7411		spim = be32_to_cpu(fsp->m_u.usr_ip4_spec.l4_4_bytes);
   7412
   7413		tp->key[2] |= spi;
   7414		tp->key_mask[2] |= spim;
   7415		pid = fsp->h_u.usr_ip4_spec.proto;
   7416		break;
   7417	default:
   7418		break;
   7419	}
   7420
   7421	tp->key[2] |= ((u64)pid << TCAM_V4KEY2_PROTO_SHIFT);
   7422	if (pid) {
   7423		tp->key_mask[2] |= TCAM_V4KEY2_PROTO;
   7424	}
   7425}
   7426
   7427static int niu_add_ethtool_tcam_entry(struct niu *np,
   7428				      struct ethtool_rxnfc *nfc)
   7429{
   7430	struct niu_parent *parent = np->parent;
   7431	struct niu_tcam_entry *tp;
   7432	struct ethtool_rx_flow_spec *fsp = &nfc->fs;
   7433	struct niu_rdc_tables *rdc_table = &parent->rdc_group_cfg[np->port];
   7434	int l2_rdc_table = rdc_table->first_table_num;
   7435	u16 idx;
   7436	u64 class;
   7437	unsigned long flags;
   7438	int err, ret;
   7439
   7440	ret = 0;
   7441
   7442	idx = nfc->fs.location;
   7443	if (idx >= tcam_get_size(np))
   7444		return -EINVAL;
   7445
   7446	if (fsp->flow_type == IP_USER_FLOW) {
   7447		int i;
   7448		int add_usr_cls = 0;
   7449		struct ethtool_usrip4_spec *uspec = &fsp->h_u.usr_ip4_spec;
   7450		struct ethtool_usrip4_spec *umask = &fsp->m_u.usr_ip4_spec;
   7451
   7452		if (uspec->ip_ver != ETH_RX_NFC_IP4)
   7453			return -EINVAL;
   7454
   7455		niu_lock_parent(np, flags);
   7456
   7457		for (i = 0; i < NIU_L3_PROG_CLS; i++) {
   7458			if (parent->l3_cls[i]) {
   7459				if (uspec->proto == parent->l3_cls_pid[i]) {
   7460					class = parent->l3_cls[i];
   7461					parent->l3_cls_refcnt[i]++;
   7462					add_usr_cls = 1;
   7463					break;
   7464				}
   7465			} else {
   7466				/* Program new user IP class */
   7467				switch (i) {
   7468				case 0:
   7469					class = CLASS_CODE_USER_PROG1;
   7470					break;
   7471				case 1:
   7472					class = CLASS_CODE_USER_PROG2;
   7473					break;
   7474				case 2:
   7475					class = CLASS_CODE_USER_PROG3;
   7476					break;
   7477				case 3:
   7478					class = CLASS_CODE_USER_PROG4;
   7479					break;
   7480				default:
   7481					class = CLASS_CODE_UNRECOG;
   7482					break;
   7483				}
   7484				ret = tcam_user_ip_class_set(np, class, 0,
   7485							     uspec->proto,
   7486							     uspec->tos,
   7487							     umask->tos);
   7488				if (ret)
   7489					goto out;
   7490
   7491				ret = tcam_user_ip_class_enable(np, class, 1);
   7492				if (ret)
   7493					goto out;
   7494				parent->l3_cls[i] = class;
   7495				parent->l3_cls_pid[i] = uspec->proto;
   7496				parent->l3_cls_refcnt[i]++;
   7497				add_usr_cls = 1;
   7498				break;
   7499			}
   7500		}
   7501		if (!add_usr_cls) {
   7502			netdev_info(np->dev, "niu%d: %s(): Could not find/insert class for pid %d\n",
   7503				    parent->index, __func__, uspec->proto);
   7504			ret = -EINVAL;
   7505			goto out;
   7506		}
   7507		niu_unlock_parent(np, flags);
   7508	} else {
   7509		if (!niu_ethflow_to_class(fsp->flow_type, &class)) {
   7510			return -EINVAL;
   7511		}
   7512	}
   7513
   7514	niu_lock_parent(np, flags);
   7515
   7516	idx = tcam_get_index(np, idx);
   7517	tp = &parent->tcam[idx];
   7518
   7519	memset(tp, 0, sizeof(*tp));
   7520
   7521	/* fill in the tcam key and mask */
   7522	switch (fsp->flow_type) {
   7523	case TCP_V4_FLOW:
   7524	case UDP_V4_FLOW:
   7525	case SCTP_V4_FLOW:
   7526	case AH_V4_FLOW:
   7527	case ESP_V4_FLOW:
   7528		niu_get_tcamkey_from_ip4fs(fsp, tp, l2_rdc_table, class);
   7529		break;
   7530	case TCP_V6_FLOW:
   7531	case UDP_V6_FLOW:
   7532	case SCTP_V6_FLOW:
   7533	case AH_V6_FLOW:
   7534	case ESP_V6_FLOW:
   7535		/* Not yet implemented */
   7536		netdev_info(np->dev, "niu%d: In %s(): flow %d for IPv6 not implemented\n",
   7537			    parent->index, __func__, fsp->flow_type);
   7538		ret = -EINVAL;
   7539		goto out;
   7540	case IP_USER_FLOW:
   7541		niu_get_tcamkey_from_ip4fs(fsp, tp, l2_rdc_table, class);
   7542		break;
   7543	default:
   7544		netdev_info(np->dev, "niu%d: In %s(): Unknown flow type %d\n",
   7545			    parent->index, __func__, fsp->flow_type);
   7546		ret = -EINVAL;
   7547		goto out;
   7548	}
   7549
   7550	/* fill in the assoc data */
   7551	if (fsp->ring_cookie == RX_CLS_FLOW_DISC) {
   7552		tp->assoc_data = TCAM_ASSOCDATA_DISC;
   7553	} else {
   7554		if (fsp->ring_cookie >= np->num_rx_rings) {
   7555			netdev_info(np->dev, "niu%d: In %s(): Invalid RX ring %lld\n",
   7556				    parent->index, __func__,
   7557				    (long long)fsp->ring_cookie);
   7558			ret = -EINVAL;
   7559			goto out;
   7560		}
   7561		tp->assoc_data = (TCAM_ASSOCDATA_TRES_USE_OFFSET |
   7562				  (fsp->ring_cookie <<
   7563				   TCAM_ASSOCDATA_OFFSET_SHIFT));
   7564	}
   7565
   7566	err = tcam_write(np, idx, tp->key, tp->key_mask);
   7567	if (err) {
   7568		ret = -EINVAL;
   7569		goto out;
   7570	}
   7571	err = tcam_assoc_write(np, idx, tp->assoc_data);
   7572	if (err) {
   7573		ret = -EINVAL;
   7574		goto out;
   7575	}
   7576
   7577	/* validate the entry */
   7578	tp->valid = 1;
   7579	np->clas.tcam_valid_entries++;
   7580out:
   7581	niu_unlock_parent(np, flags);
   7582
   7583	return ret;
   7584}
   7585
   7586static int niu_del_ethtool_tcam_entry(struct niu *np, u32 loc)
   7587{
   7588	struct niu_parent *parent = np->parent;
   7589	struct niu_tcam_entry *tp;
   7590	u16 idx;
   7591	unsigned long flags;
   7592	u64 class;
   7593	int ret = 0;
   7594
   7595	if (loc >= tcam_get_size(np))
   7596		return -EINVAL;
   7597
   7598	niu_lock_parent(np, flags);
   7599
   7600	idx = tcam_get_index(np, loc);
   7601	tp = &parent->tcam[idx];
   7602
   7603	/* if the entry is of a user defined class, then update*/
   7604	class = (tp->key[0] & TCAM_V4KEY0_CLASS_CODE) >>
   7605		TCAM_V4KEY0_CLASS_CODE_SHIFT;
   7606
   7607	if (class >= CLASS_CODE_USER_PROG1 && class <= CLASS_CODE_USER_PROG4) {
   7608		int i;
   7609		for (i = 0; i < NIU_L3_PROG_CLS; i++) {
   7610			if (parent->l3_cls[i] == class) {
   7611				parent->l3_cls_refcnt[i]--;
   7612				if (!parent->l3_cls_refcnt[i]) {
   7613					/* disable class */
   7614					ret = tcam_user_ip_class_enable(np,
   7615									class,
   7616									0);
   7617					if (ret)
   7618						goto out;
   7619					parent->l3_cls[i] = 0;
   7620					parent->l3_cls_pid[i] = 0;
   7621				}
   7622				break;
   7623			}
   7624		}
   7625		if (i == NIU_L3_PROG_CLS) {
   7626			netdev_info(np->dev, "niu%d: In %s(): Usr class 0x%llx not found\n",
   7627				    parent->index, __func__,
   7628				    (unsigned long long)class);
   7629			ret = -EINVAL;
   7630			goto out;
   7631		}
   7632	}
   7633
   7634	ret = tcam_flush(np, idx);
   7635	if (ret)
   7636		goto out;
   7637
   7638	/* invalidate the entry */
   7639	tp->valid = 0;
   7640	np->clas.tcam_valid_entries--;
   7641out:
   7642	niu_unlock_parent(np, flags);
   7643
   7644	return ret;
   7645}
   7646
   7647static int niu_set_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
   7648{
   7649	struct niu *np = netdev_priv(dev);
   7650	int ret = 0;
   7651
   7652	switch (cmd->cmd) {
   7653	case ETHTOOL_SRXFH:
   7654		ret = niu_set_hash_opts(np, cmd);
   7655		break;
   7656	case ETHTOOL_SRXCLSRLINS:
   7657		ret = niu_add_ethtool_tcam_entry(np, cmd);
   7658		break;
   7659	case ETHTOOL_SRXCLSRLDEL:
   7660		ret = niu_del_ethtool_tcam_entry(np, cmd->fs.location);
   7661		break;
   7662	default:
   7663		ret = -EINVAL;
   7664		break;
   7665	}
   7666
   7667	return ret;
   7668}
   7669
   7670static const struct {
   7671	const char string[ETH_GSTRING_LEN];
   7672} niu_xmac_stat_keys[] = {
   7673	{ "tx_frames" },
   7674	{ "tx_bytes" },
   7675	{ "tx_fifo_errors" },
   7676	{ "tx_overflow_errors" },
   7677	{ "tx_max_pkt_size_errors" },
   7678	{ "tx_underflow_errors" },
   7679	{ "rx_local_faults" },
   7680	{ "rx_remote_faults" },
   7681	{ "rx_link_faults" },
   7682	{ "rx_align_errors" },
   7683	{ "rx_frags" },
   7684	{ "rx_mcasts" },
   7685	{ "rx_bcasts" },
   7686	{ "rx_hist_cnt1" },
   7687	{ "rx_hist_cnt2" },
   7688	{ "rx_hist_cnt3" },
   7689	{ "rx_hist_cnt4" },
   7690	{ "rx_hist_cnt5" },
   7691	{ "rx_hist_cnt6" },
   7692	{ "rx_hist_cnt7" },
   7693	{ "rx_octets" },
   7694	{ "rx_code_violations" },
   7695	{ "rx_len_errors" },
   7696	{ "rx_crc_errors" },
   7697	{ "rx_underflows" },
   7698	{ "rx_overflows" },
   7699	{ "pause_off_state" },
   7700	{ "pause_on_state" },
   7701	{ "pause_received" },
   7702};
   7703
   7704#define NUM_XMAC_STAT_KEYS	ARRAY_SIZE(niu_xmac_stat_keys)
   7705
   7706static const struct {
   7707	const char string[ETH_GSTRING_LEN];
   7708} niu_bmac_stat_keys[] = {
   7709	{ "tx_underflow_errors" },
   7710	{ "tx_max_pkt_size_errors" },
   7711	{ "tx_bytes" },
   7712	{ "tx_frames" },
   7713	{ "rx_overflows" },
   7714	{ "rx_frames" },
   7715	{ "rx_align_errors" },
   7716	{ "rx_crc_errors" },
   7717	{ "rx_len_errors" },
   7718	{ "pause_off_state" },
   7719	{ "pause_on_state" },
   7720	{ "pause_received" },
   7721};
   7722
   7723#define NUM_BMAC_STAT_KEYS	ARRAY_SIZE(niu_bmac_stat_keys)
   7724
   7725static const struct {
   7726	const char string[ETH_GSTRING_LEN];
   7727} niu_rxchan_stat_keys[] = {
   7728	{ "rx_channel" },
   7729	{ "rx_packets" },
   7730	{ "rx_bytes" },
   7731	{ "rx_dropped" },
   7732	{ "rx_errors" },
   7733};
   7734
   7735#define NUM_RXCHAN_STAT_KEYS	ARRAY_SIZE(niu_rxchan_stat_keys)
   7736
   7737static const struct {
   7738	const char string[ETH_GSTRING_LEN];
   7739} niu_txchan_stat_keys[] = {
   7740	{ "tx_channel" },
   7741	{ "tx_packets" },
   7742	{ "tx_bytes" },
   7743	{ "tx_errors" },
   7744};
   7745
   7746#define NUM_TXCHAN_STAT_KEYS	ARRAY_SIZE(niu_txchan_stat_keys)
   7747
   7748static void niu_get_strings(struct net_device *dev, u32 stringset, u8 *data)
   7749{
   7750	struct niu *np = netdev_priv(dev);
   7751	int i;
   7752
   7753	if (stringset != ETH_SS_STATS)
   7754		return;
   7755
   7756	if (np->flags & NIU_FLAGS_XMAC) {
   7757		memcpy(data, niu_xmac_stat_keys,
   7758		       sizeof(niu_xmac_stat_keys));
   7759		data += sizeof(niu_xmac_stat_keys);
   7760	} else {
   7761		memcpy(data, niu_bmac_stat_keys,
   7762		       sizeof(niu_bmac_stat_keys));
   7763		data += sizeof(niu_bmac_stat_keys);
   7764	}
   7765	for (i = 0; i < np->num_rx_rings; i++) {
   7766		memcpy(data, niu_rxchan_stat_keys,
   7767		       sizeof(niu_rxchan_stat_keys));
   7768		data += sizeof(niu_rxchan_stat_keys);
   7769	}
   7770	for (i = 0; i < np->num_tx_rings; i++) {
   7771		memcpy(data, niu_txchan_stat_keys,
   7772		       sizeof(niu_txchan_stat_keys));
   7773		data += sizeof(niu_txchan_stat_keys);
   7774	}
   7775}
   7776
   7777static int niu_get_sset_count(struct net_device *dev, int stringset)
   7778{
   7779	struct niu *np = netdev_priv(dev);
   7780
   7781	if (stringset != ETH_SS_STATS)
   7782		return -EINVAL;
   7783
   7784	return (np->flags & NIU_FLAGS_XMAC ?
   7785		 NUM_XMAC_STAT_KEYS :
   7786		 NUM_BMAC_STAT_KEYS) +
   7787		(np->num_rx_rings * NUM_RXCHAN_STAT_KEYS) +
   7788		(np->num_tx_rings * NUM_TXCHAN_STAT_KEYS);
   7789}
   7790
   7791static void niu_get_ethtool_stats(struct net_device *dev,
   7792				  struct ethtool_stats *stats, u64 *data)
   7793{
   7794	struct niu *np = netdev_priv(dev);
   7795	int i;
   7796
   7797	niu_sync_mac_stats(np);
   7798	if (np->flags & NIU_FLAGS_XMAC) {
   7799		memcpy(data, &np->mac_stats.xmac,
   7800		       sizeof(struct niu_xmac_stats));
   7801		data += (sizeof(struct niu_xmac_stats) / sizeof(u64));
   7802	} else {
   7803		memcpy(data, &np->mac_stats.bmac,
   7804		       sizeof(struct niu_bmac_stats));
   7805		data += (sizeof(struct niu_bmac_stats) / sizeof(u64));
   7806	}
   7807	for (i = 0; i < np->num_rx_rings; i++) {
   7808		struct rx_ring_info *rp = &np->rx_rings[i];
   7809
   7810		niu_sync_rx_discard_stats(np, rp, 0);
   7811
   7812		data[0] = rp->rx_channel;
   7813		data[1] = rp->rx_packets;
   7814		data[2] = rp->rx_bytes;
   7815		data[3] = rp->rx_dropped;
   7816		data[4] = rp->rx_errors;
   7817		data += 5;
   7818	}
   7819	for (i = 0; i < np->num_tx_rings; i++) {
   7820		struct tx_ring_info *rp = &np->tx_rings[i];
   7821
   7822		data[0] = rp->tx_channel;
   7823		data[1] = rp->tx_packets;
   7824		data[2] = rp->tx_bytes;
   7825		data[3] = rp->tx_errors;
   7826		data += 4;
   7827	}
   7828}
   7829
   7830static u64 niu_led_state_save(struct niu *np)
   7831{
   7832	if (np->flags & NIU_FLAGS_XMAC)
   7833		return nr64_mac(XMAC_CONFIG);
   7834	else
   7835		return nr64_mac(BMAC_XIF_CONFIG);
   7836}
   7837
   7838static void niu_led_state_restore(struct niu *np, u64 val)
   7839{
   7840	if (np->flags & NIU_FLAGS_XMAC)
   7841		nw64_mac(XMAC_CONFIG, val);
   7842	else
   7843		nw64_mac(BMAC_XIF_CONFIG, val);
   7844}
   7845
   7846static void niu_force_led(struct niu *np, int on)
   7847{
   7848	u64 val, reg, bit;
   7849
   7850	if (np->flags & NIU_FLAGS_XMAC) {
   7851		reg = XMAC_CONFIG;
   7852		bit = XMAC_CONFIG_FORCE_LED_ON;
   7853	} else {
   7854		reg = BMAC_XIF_CONFIG;
   7855		bit = BMAC_XIF_CONFIG_LINK_LED;
   7856	}
   7857
   7858	val = nr64_mac(reg);
   7859	if (on)
   7860		val |= bit;
   7861	else
   7862		val &= ~bit;
   7863	nw64_mac(reg, val);
   7864}
   7865
   7866static int niu_set_phys_id(struct net_device *dev,
   7867			   enum ethtool_phys_id_state state)
   7868
   7869{
   7870	struct niu *np = netdev_priv(dev);
   7871
   7872	if (!netif_running(dev))
   7873		return -EAGAIN;
   7874
   7875	switch (state) {
   7876	case ETHTOOL_ID_ACTIVE:
   7877		np->orig_led_state = niu_led_state_save(np);
   7878		return 1;	/* cycle on/off once per second */
   7879
   7880	case ETHTOOL_ID_ON:
   7881		niu_force_led(np, 1);
   7882		break;
   7883
   7884	case ETHTOOL_ID_OFF:
   7885		niu_force_led(np, 0);
   7886		break;
   7887
   7888	case ETHTOOL_ID_INACTIVE:
   7889		niu_led_state_restore(np, np->orig_led_state);
   7890	}
   7891
   7892	return 0;
   7893}
   7894
   7895static const struct ethtool_ops niu_ethtool_ops = {
   7896	.get_drvinfo		= niu_get_drvinfo,
   7897	.get_link		= ethtool_op_get_link,
   7898	.get_msglevel		= niu_get_msglevel,
   7899	.set_msglevel		= niu_set_msglevel,
   7900	.nway_reset		= niu_nway_reset,
   7901	.get_eeprom_len		= niu_get_eeprom_len,
   7902	.get_eeprom		= niu_get_eeprom,
   7903	.get_strings		= niu_get_strings,
   7904	.get_sset_count		= niu_get_sset_count,
   7905	.get_ethtool_stats	= niu_get_ethtool_stats,
   7906	.set_phys_id		= niu_set_phys_id,
   7907	.get_rxnfc		= niu_get_nfc,
   7908	.set_rxnfc		= niu_set_nfc,
   7909	.get_link_ksettings	= niu_get_link_ksettings,
   7910	.set_link_ksettings	= niu_set_link_ksettings,
   7911};
   7912
   7913static int niu_ldg_assign_ldn(struct niu *np, struct niu_parent *parent,
   7914			      int ldg, int ldn)
   7915{
   7916	if (ldg < NIU_LDG_MIN || ldg > NIU_LDG_MAX)
   7917		return -EINVAL;
   7918	if (ldn < 0 || ldn > LDN_MAX)
   7919		return -EINVAL;
   7920
   7921	parent->ldg_map[ldn] = ldg;
   7922
   7923	if (np->parent->plat_type == PLAT_TYPE_NIU) {
   7924		/* On N2 NIU, the ldn-->ldg assignments are setup and fixed by
   7925		 * the firmware, and we're not supposed to change them.
   7926		 * Validate the mapping, because if it's wrong we probably
   7927		 * won't get any interrupts and that's painful to debug.
   7928		 */
   7929		if (nr64(LDG_NUM(ldn)) != ldg) {
   7930			dev_err(np->device, "Port %u, mismatched LDG assignment for ldn %d, should be %d is %llu\n",
   7931				np->port, ldn, ldg,
   7932				(unsigned long long) nr64(LDG_NUM(ldn)));
   7933			return -EINVAL;
   7934		}
   7935	} else
   7936		nw64(LDG_NUM(ldn), ldg);
   7937
   7938	return 0;
   7939}
   7940
   7941static int niu_set_ldg_timer_res(struct niu *np, int res)
   7942{
   7943	if (res < 0 || res > LDG_TIMER_RES_VAL)
   7944		return -EINVAL;
   7945
   7946
   7947	nw64(LDG_TIMER_RES, res);
   7948
   7949	return 0;
   7950}
   7951
   7952static int niu_set_ldg_sid(struct niu *np, int ldg, int func, int vector)
   7953{
   7954	if ((ldg < NIU_LDG_MIN || ldg > NIU_LDG_MAX) ||
   7955	    (func < 0 || func > 3) ||
   7956	    (vector < 0 || vector > 0x1f))
   7957		return -EINVAL;
   7958
   7959	nw64(SID(ldg), (func << SID_FUNC_SHIFT) | vector);
   7960
   7961	return 0;
   7962}
   7963
   7964static int niu_pci_eeprom_read(struct niu *np, u32 addr)
   7965{
   7966	u64 frame, frame_base = (ESPC_PIO_STAT_READ_START |
   7967				 (addr << ESPC_PIO_STAT_ADDR_SHIFT));
   7968	int limit;
   7969
   7970	if (addr > (ESPC_PIO_STAT_ADDR >> ESPC_PIO_STAT_ADDR_SHIFT))
   7971		return -EINVAL;
   7972
   7973	frame = frame_base;
   7974	nw64(ESPC_PIO_STAT, frame);
   7975	limit = 64;
   7976	do {
   7977		udelay(5);
   7978		frame = nr64(ESPC_PIO_STAT);
   7979		if (frame & ESPC_PIO_STAT_READ_END)
   7980			break;
   7981	} while (limit--);
   7982	if (!(frame & ESPC_PIO_STAT_READ_END)) {
   7983		dev_err(np->device, "EEPROM read timeout frame[%llx]\n",
   7984			(unsigned long long) frame);
   7985		return -ENODEV;
   7986	}
   7987
   7988	frame = frame_base;
   7989	nw64(ESPC_PIO_STAT, frame);
   7990	limit = 64;
   7991	do {
   7992		udelay(5);
   7993		frame = nr64(ESPC_PIO_STAT);
   7994		if (frame & ESPC_PIO_STAT_READ_END)
   7995			break;
   7996	} while (limit--);
   7997	if (!(frame & ESPC_PIO_STAT_READ_END)) {
   7998		dev_err(np->device, "EEPROM read timeout frame[%llx]\n",
   7999			(unsigned long long) frame);
   8000		return -ENODEV;
   8001	}
   8002
   8003	frame = nr64(ESPC_PIO_STAT);
   8004	return (frame & ESPC_PIO_STAT_DATA) >> ESPC_PIO_STAT_DATA_SHIFT;
   8005}
   8006
   8007static int niu_pci_eeprom_read16(struct niu *np, u32 off)
   8008{
   8009	int err = niu_pci_eeprom_read(np, off);
   8010	u16 val;
   8011
   8012	if (err < 0)
   8013		return err;
   8014	val = (err << 8);
   8015	err = niu_pci_eeprom_read(np, off + 1);
   8016	if (err < 0)
   8017		return err;
   8018	val |= (err & 0xff);
   8019
   8020	return val;
   8021}
   8022
   8023static int niu_pci_eeprom_read16_swp(struct niu *np, u32 off)
   8024{
   8025	int err = niu_pci_eeprom_read(np, off);
   8026	u16 val;
   8027
   8028	if (err < 0)
   8029		return err;
   8030
   8031	val = (err & 0xff);
   8032	err = niu_pci_eeprom_read(np, off + 1);
   8033	if (err < 0)
   8034		return err;
   8035
   8036	val |= (err & 0xff) << 8;
   8037
   8038	return val;
   8039}
   8040
   8041static int niu_pci_vpd_get_propname(struct niu *np, u32 off, char *namebuf,
   8042				    int namebuf_len)
   8043{
   8044	int i;
   8045
   8046	for (i = 0; i < namebuf_len; i++) {
   8047		int err = niu_pci_eeprom_read(np, off + i);
   8048		if (err < 0)
   8049			return err;
   8050		*namebuf++ = err;
   8051		if (!err)
   8052			break;
   8053	}
   8054	if (i >= namebuf_len)
   8055		return -EINVAL;
   8056
   8057	return i + 1;
   8058}
   8059
   8060static void niu_vpd_parse_version(struct niu *np)
   8061{
   8062	struct niu_vpd *vpd = &np->vpd;
   8063	int len = strlen(vpd->version) + 1;
   8064	const char *s = vpd->version;
   8065	int i;
   8066
   8067	for (i = 0; i < len - 5; i++) {
   8068		if (!strncmp(s + i, "FCode ", 6))
   8069			break;
   8070	}
   8071	if (i >= len - 5)
   8072		return;
   8073
   8074	s += i + 5;
   8075	sscanf(s, "%d.%d", &vpd->fcode_major, &vpd->fcode_minor);
   8076
   8077	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8078		     "VPD_SCAN: FCODE major(%d) minor(%d)\n",
   8079		     vpd->fcode_major, vpd->fcode_minor);
   8080	if (vpd->fcode_major > NIU_VPD_MIN_MAJOR ||
   8081	    (vpd->fcode_major == NIU_VPD_MIN_MAJOR &&
   8082	     vpd->fcode_minor >= NIU_VPD_MIN_MINOR))
   8083		np->flags |= NIU_FLAGS_VPD_VALID;
   8084}
   8085
   8086/* ESPC_PIO_EN_ENABLE must be set */
   8087static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
   8088{
   8089	unsigned int found_mask = 0;
   8090#define FOUND_MASK_MODEL	0x00000001
   8091#define FOUND_MASK_BMODEL	0x00000002
   8092#define FOUND_MASK_VERS		0x00000004
   8093#define FOUND_MASK_MAC		0x00000008
   8094#define FOUND_MASK_NMAC		0x00000010
   8095#define FOUND_MASK_PHY		0x00000020
   8096#define FOUND_MASK_ALL		0x0000003f
   8097
   8098	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8099		     "VPD_SCAN: start[%x] end[%x]\n", start, end);
   8100	while (start < end) {
   8101		int len, err, prop_len;
   8102		char namebuf[64];
   8103		u8 *prop_buf;
   8104		int max_len;
   8105
   8106		if (found_mask == FOUND_MASK_ALL) {
   8107			niu_vpd_parse_version(np);
   8108			return 1;
   8109		}
   8110
   8111		err = niu_pci_eeprom_read(np, start + 2);
   8112		if (err < 0)
   8113			return err;
   8114		len = err;
   8115		start += 3;
   8116
   8117		prop_len = niu_pci_eeprom_read(np, start + 4);
   8118		if (prop_len < 0)
   8119			return prop_len;
   8120		err = niu_pci_vpd_get_propname(np, start + 5, namebuf, 64);
   8121		if (err < 0)
   8122			return err;
   8123
   8124		prop_buf = NULL;
   8125		max_len = 0;
   8126		if (!strcmp(namebuf, "model")) {
   8127			prop_buf = np->vpd.model;
   8128			max_len = NIU_VPD_MODEL_MAX;
   8129			found_mask |= FOUND_MASK_MODEL;
   8130		} else if (!strcmp(namebuf, "board-model")) {
   8131			prop_buf = np->vpd.board_model;
   8132			max_len = NIU_VPD_BD_MODEL_MAX;
   8133			found_mask |= FOUND_MASK_BMODEL;
   8134		} else if (!strcmp(namebuf, "version")) {
   8135			prop_buf = np->vpd.version;
   8136			max_len = NIU_VPD_VERSION_MAX;
   8137			found_mask |= FOUND_MASK_VERS;
   8138		} else if (!strcmp(namebuf, "local-mac-address")) {
   8139			prop_buf = np->vpd.local_mac;
   8140			max_len = ETH_ALEN;
   8141			found_mask |= FOUND_MASK_MAC;
   8142		} else if (!strcmp(namebuf, "num-mac-addresses")) {
   8143			prop_buf = &np->vpd.mac_num;
   8144			max_len = 1;
   8145			found_mask |= FOUND_MASK_NMAC;
   8146		} else if (!strcmp(namebuf, "phy-type")) {
   8147			prop_buf = np->vpd.phy_type;
   8148			max_len = NIU_VPD_PHY_TYPE_MAX;
   8149			found_mask |= FOUND_MASK_PHY;
   8150		}
   8151
   8152		if (max_len && prop_len > max_len) {
   8153			dev_err(np->device, "Property '%s' length (%d) is too long\n", namebuf, prop_len);
   8154			return -EINVAL;
   8155		}
   8156
   8157		if (prop_buf) {
   8158			u32 off = start + 5 + err;
   8159			int i;
   8160
   8161			netif_printk(np, probe, KERN_DEBUG, np->dev,
   8162				     "VPD_SCAN: Reading in property [%s] len[%d]\n",
   8163				     namebuf, prop_len);
   8164			for (i = 0; i < prop_len; i++) {
   8165				err =  niu_pci_eeprom_read(np, off + i);
   8166				if (err < 0)
   8167					return err;
   8168				*prop_buf++ = err;
   8169			}
   8170		}
   8171
   8172		start += len;
   8173	}
   8174
   8175	return 0;
   8176}
   8177
   8178/* ESPC_PIO_EN_ENABLE must be set */
   8179static int niu_pci_vpd_fetch(struct niu *np, u32 start)
   8180{
   8181	u32 offset;
   8182	int err;
   8183
   8184	err = niu_pci_eeprom_read16_swp(np, start + 1);
   8185	if (err < 0)
   8186		return err;
   8187
   8188	offset = err + 3;
   8189
   8190	while (start + offset < ESPC_EEPROM_SIZE) {
   8191		u32 here = start + offset;
   8192		u32 end;
   8193
   8194		err = niu_pci_eeprom_read(np, here);
   8195		if (err < 0)
   8196			return err;
   8197		if (err != 0x90)
   8198			return -EINVAL;
   8199
   8200		err = niu_pci_eeprom_read16_swp(np, here + 1);
   8201		if (err < 0)
   8202			return err;
   8203
   8204		here = start + offset + 3;
   8205		end = start + offset + err;
   8206
   8207		offset += err;
   8208
   8209		err = niu_pci_vpd_scan_props(np, here, end);
   8210		if (err < 0)
   8211			return err;
   8212		/* ret == 1 is not an error */
   8213		if (err == 1)
   8214			return 0;
   8215	}
   8216	return 0;
   8217}
   8218
   8219/* ESPC_PIO_EN_ENABLE must be set */
   8220static u32 niu_pci_vpd_offset(struct niu *np)
   8221{
   8222	u32 start = 0, end = ESPC_EEPROM_SIZE, ret;
   8223	int err;
   8224
   8225	while (start < end) {
   8226		ret = start;
   8227
   8228		/* ROM header signature?  */
   8229		err = niu_pci_eeprom_read16(np, start +  0);
   8230		if (err != 0x55aa)
   8231			return 0;
   8232
   8233		/* Apply offset to PCI data structure.  */
   8234		err = niu_pci_eeprom_read16(np, start + 23);
   8235		if (err < 0)
   8236			return 0;
   8237		start += err;
   8238
   8239		/* Check for "PCIR" signature.  */
   8240		err = niu_pci_eeprom_read16(np, start +  0);
   8241		if (err != 0x5043)
   8242			return 0;
   8243		err = niu_pci_eeprom_read16(np, start +  2);
   8244		if (err != 0x4952)
   8245			return 0;
   8246
   8247		/* Check for OBP image type.  */
   8248		err = niu_pci_eeprom_read(np, start + 20);
   8249		if (err < 0)
   8250			return 0;
   8251		if (err != 0x01) {
   8252			err = niu_pci_eeprom_read(np, ret + 2);
   8253			if (err < 0)
   8254				return 0;
   8255
   8256			start = ret + (err * 512);
   8257			continue;
   8258		}
   8259
   8260		err = niu_pci_eeprom_read16_swp(np, start + 8);
   8261		if (err < 0)
   8262			return err;
   8263		ret += err;
   8264
   8265		err = niu_pci_eeprom_read(np, ret + 0);
   8266		if (err != 0x82)
   8267			return 0;
   8268
   8269		return ret;
   8270	}
   8271
   8272	return 0;
   8273}
   8274
   8275static int niu_phy_type_prop_decode(struct niu *np, const char *phy_prop)
   8276{
   8277	if (!strcmp(phy_prop, "mif")) {
   8278		/* 1G copper, MII */
   8279		np->flags &= ~(NIU_FLAGS_FIBER |
   8280			       NIU_FLAGS_10G);
   8281		np->mac_xcvr = MAC_XCVR_MII;
   8282	} else if (!strcmp(phy_prop, "xgf")) {
   8283		/* 10G fiber, XPCS */
   8284		np->flags |= (NIU_FLAGS_10G |
   8285			      NIU_FLAGS_FIBER);
   8286		np->mac_xcvr = MAC_XCVR_XPCS;
   8287	} else if (!strcmp(phy_prop, "pcs")) {
   8288		/* 1G fiber, PCS */
   8289		np->flags &= ~NIU_FLAGS_10G;
   8290		np->flags |= NIU_FLAGS_FIBER;
   8291		np->mac_xcvr = MAC_XCVR_PCS;
   8292	} else if (!strcmp(phy_prop, "xgc")) {
   8293		/* 10G copper, XPCS */
   8294		np->flags |= NIU_FLAGS_10G;
   8295		np->flags &= ~NIU_FLAGS_FIBER;
   8296		np->mac_xcvr = MAC_XCVR_XPCS;
   8297	} else if (!strcmp(phy_prop, "xgsd") || !strcmp(phy_prop, "gsd")) {
   8298		/* 10G Serdes or 1G Serdes, default to 10G */
   8299		np->flags |= NIU_FLAGS_10G;
   8300		np->flags &= ~NIU_FLAGS_FIBER;
   8301		np->flags |= NIU_FLAGS_XCVR_SERDES;
   8302		np->mac_xcvr = MAC_XCVR_XPCS;
   8303	} else {
   8304		return -EINVAL;
   8305	}
   8306	return 0;
   8307}
   8308
   8309static int niu_pci_vpd_get_nports(struct niu *np)
   8310{
   8311	int ports = 0;
   8312
   8313	if ((!strcmp(np->vpd.model, NIU_QGC_LP_MDL_STR)) ||
   8314	    (!strcmp(np->vpd.model, NIU_QGC_PEM_MDL_STR)) ||
   8315	    (!strcmp(np->vpd.model, NIU_MARAMBA_MDL_STR)) ||
   8316	    (!strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) ||
   8317	    (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR))) {
   8318		ports = 4;
   8319	} else if ((!strcmp(np->vpd.model, NIU_2XGF_LP_MDL_STR)) ||
   8320		   (!strcmp(np->vpd.model, NIU_2XGF_PEM_MDL_STR)) ||
   8321		   (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) ||
   8322		   (!strcmp(np->vpd.model, NIU_2XGF_MRVL_MDL_STR))) {
   8323		ports = 2;
   8324	}
   8325
   8326	return ports;
   8327}
   8328
   8329static void niu_pci_vpd_validate(struct niu *np)
   8330{
   8331	struct net_device *dev = np->dev;
   8332	struct niu_vpd *vpd = &np->vpd;
   8333	u8 addr[ETH_ALEN];
   8334	u8 val8;
   8335
   8336	if (!is_valid_ether_addr(&vpd->local_mac[0])) {
   8337		dev_err(np->device, "VPD MAC invalid, falling back to SPROM\n");
   8338
   8339		np->flags &= ~NIU_FLAGS_VPD_VALID;
   8340		return;
   8341	}
   8342
   8343	if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) ||
   8344	    !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) {
   8345		np->flags |= NIU_FLAGS_10G;
   8346		np->flags &= ~NIU_FLAGS_FIBER;
   8347		np->flags |= NIU_FLAGS_XCVR_SERDES;
   8348		np->mac_xcvr = MAC_XCVR_PCS;
   8349		if (np->port > 1) {
   8350			np->flags |= NIU_FLAGS_FIBER;
   8351			np->flags &= ~NIU_FLAGS_10G;
   8352		}
   8353		if (np->flags & NIU_FLAGS_10G)
   8354			np->mac_xcvr = MAC_XCVR_XPCS;
   8355	} else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) {
   8356		np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER |
   8357			      NIU_FLAGS_HOTPLUG_PHY);
   8358	} else if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) {
   8359		dev_err(np->device, "Illegal phy string [%s]\n",
   8360			np->vpd.phy_type);
   8361		dev_err(np->device, "Falling back to SPROM\n");
   8362		np->flags &= ~NIU_FLAGS_VPD_VALID;
   8363		return;
   8364	}
   8365
   8366	ether_addr_copy(addr, vpd->local_mac);
   8367
   8368	val8 = addr[5];
   8369	addr[5] += np->port;
   8370	if (addr[5] < val8)
   8371		addr[4]++;
   8372
   8373	eth_hw_addr_set(dev, addr);
   8374}
   8375
   8376static int niu_pci_probe_sprom(struct niu *np)
   8377{
   8378	struct net_device *dev = np->dev;
   8379	u8 addr[ETH_ALEN];
   8380	int len, i;
   8381	u64 val, sum;
   8382	u8 val8;
   8383
   8384	val = (nr64(ESPC_VER_IMGSZ) & ESPC_VER_IMGSZ_IMGSZ);
   8385	val >>= ESPC_VER_IMGSZ_IMGSZ_SHIFT;
   8386	len = val / 4;
   8387
   8388	np->eeprom_len = len;
   8389
   8390	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8391		     "SPROM: Image size %llu\n", (unsigned long long)val);
   8392
   8393	sum = 0;
   8394	for (i = 0; i < len; i++) {
   8395		val = nr64(ESPC_NCR(i));
   8396		sum += (val >>  0) & 0xff;
   8397		sum += (val >>  8) & 0xff;
   8398		sum += (val >> 16) & 0xff;
   8399		sum += (val >> 24) & 0xff;
   8400	}
   8401	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8402		     "SPROM: Checksum %x\n", (int)(sum & 0xff));
   8403	if ((sum & 0xff) != 0xab) {
   8404		dev_err(np->device, "Bad SPROM checksum (%x, should be 0xab)\n", (int)(sum & 0xff));
   8405		return -EINVAL;
   8406	}
   8407
   8408	val = nr64(ESPC_PHY_TYPE);
   8409	switch (np->port) {
   8410	case 0:
   8411		val8 = (val & ESPC_PHY_TYPE_PORT0) >>
   8412			ESPC_PHY_TYPE_PORT0_SHIFT;
   8413		break;
   8414	case 1:
   8415		val8 = (val & ESPC_PHY_TYPE_PORT1) >>
   8416			ESPC_PHY_TYPE_PORT1_SHIFT;
   8417		break;
   8418	case 2:
   8419		val8 = (val & ESPC_PHY_TYPE_PORT2) >>
   8420			ESPC_PHY_TYPE_PORT2_SHIFT;
   8421		break;
   8422	case 3:
   8423		val8 = (val & ESPC_PHY_TYPE_PORT3) >>
   8424			ESPC_PHY_TYPE_PORT3_SHIFT;
   8425		break;
   8426	default:
   8427		dev_err(np->device, "Bogus port number %u\n",
   8428			np->port);
   8429		return -EINVAL;
   8430	}
   8431	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8432		     "SPROM: PHY type %x\n", val8);
   8433
   8434	switch (val8) {
   8435	case ESPC_PHY_TYPE_1G_COPPER:
   8436		/* 1G copper, MII */
   8437		np->flags &= ~(NIU_FLAGS_FIBER |
   8438			       NIU_FLAGS_10G);
   8439		np->mac_xcvr = MAC_XCVR_MII;
   8440		break;
   8441
   8442	case ESPC_PHY_TYPE_1G_FIBER:
   8443		/* 1G fiber, PCS */
   8444		np->flags &= ~NIU_FLAGS_10G;
   8445		np->flags |= NIU_FLAGS_FIBER;
   8446		np->mac_xcvr = MAC_XCVR_PCS;
   8447		break;
   8448
   8449	case ESPC_PHY_TYPE_10G_COPPER:
   8450		/* 10G copper, XPCS */
   8451		np->flags |= NIU_FLAGS_10G;
   8452		np->flags &= ~NIU_FLAGS_FIBER;
   8453		np->mac_xcvr = MAC_XCVR_XPCS;
   8454		break;
   8455
   8456	case ESPC_PHY_TYPE_10G_FIBER:
   8457		/* 10G fiber, XPCS */
   8458		np->flags |= (NIU_FLAGS_10G |
   8459			      NIU_FLAGS_FIBER);
   8460		np->mac_xcvr = MAC_XCVR_XPCS;
   8461		break;
   8462
   8463	default:
   8464		dev_err(np->device, "Bogus SPROM phy type %u\n", val8);
   8465		return -EINVAL;
   8466	}
   8467
   8468	val = nr64(ESPC_MAC_ADDR0);
   8469	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8470		     "SPROM: MAC_ADDR0[%08llx]\n", (unsigned long long)val);
   8471	addr[0] = (val >>  0) & 0xff;
   8472	addr[1] = (val >>  8) & 0xff;
   8473	addr[2] = (val >> 16) & 0xff;
   8474	addr[3] = (val >> 24) & 0xff;
   8475
   8476	val = nr64(ESPC_MAC_ADDR1);
   8477	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8478		     "SPROM: MAC_ADDR1[%08llx]\n", (unsigned long long)val);
   8479	addr[4] = (val >>  0) & 0xff;
   8480	addr[5] = (val >>  8) & 0xff;
   8481
   8482	if (!is_valid_ether_addr(addr)) {
   8483		dev_err(np->device, "SPROM MAC address invalid [ %pM ]\n",
   8484			addr);
   8485		return -EINVAL;
   8486	}
   8487
   8488	val8 = addr[5];
   8489	addr[5] += np->port;
   8490	if (addr[5] < val8)
   8491		addr[4]++;
   8492
   8493	eth_hw_addr_set(dev, addr);
   8494
   8495	val = nr64(ESPC_MOD_STR_LEN);
   8496	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8497		     "SPROM: MOD_STR_LEN[%llu]\n", (unsigned long long)val);
   8498	if (val >= 8 * 4)
   8499		return -EINVAL;
   8500
   8501	for (i = 0; i < val; i += 4) {
   8502		u64 tmp = nr64(ESPC_NCR(5 + (i / 4)));
   8503
   8504		np->vpd.model[i + 3] = (tmp >>  0) & 0xff;
   8505		np->vpd.model[i + 2] = (tmp >>  8) & 0xff;
   8506		np->vpd.model[i + 1] = (tmp >> 16) & 0xff;
   8507		np->vpd.model[i + 0] = (tmp >> 24) & 0xff;
   8508	}
   8509	np->vpd.model[val] = '\0';
   8510
   8511	val = nr64(ESPC_BD_MOD_STR_LEN);
   8512	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8513		     "SPROM: BD_MOD_STR_LEN[%llu]\n", (unsigned long long)val);
   8514	if (val >= 4 * 4)
   8515		return -EINVAL;
   8516
   8517	for (i = 0; i < val; i += 4) {
   8518		u64 tmp = nr64(ESPC_NCR(14 + (i / 4)));
   8519
   8520		np->vpd.board_model[i + 3] = (tmp >>  0) & 0xff;
   8521		np->vpd.board_model[i + 2] = (tmp >>  8) & 0xff;
   8522		np->vpd.board_model[i + 1] = (tmp >> 16) & 0xff;
   8523		np->vpd.board_model[i + 0] = (tmp >> 24) & 0xff;
   8524	}
   8525	np->vpd.board_model[val] = '\0';
   8526
   8527	np->vpd.mac_num =
   8528		nr64(ESPC_NUM_PORTS_MACS) & ESPC_NUM_PORTS_MACS_VAL;
   8529	netif_printk(np, probe, KERN_DEBUG, np->dev,
   8530		     "SPROM: NUM_PORTS_MACS[%d]\n", np->vpd.mac_num);
   8531
   8532	return 0;
   8533}
   8534
   8535static int niu_get_and_validate_port(struct niu *np)
   8536{
   8537	struct niu_parent *parent = np->parent;
   8538
   8539	if (np->port <= 1)
   8540		np->flags |= NIU_FLAGS_XMAC;
   8541
   8542	if (!parent->num_ports) {
   8543		if (parent->plat_type == PLAT_TYPE_NIU) {
   8544			parent->num_ports = 2;
   8545		} else {
   8546			parent->num_ports = niu_pci_vpd_get_nports(np);
   8547			if (!parent->num_ports) {
   8548				/* Fall back to SPROM as last resort.
   8549				 * This will fail on most cards.
   8550				 */
   8551				parent->num_ports = nr64(ESPC_NUM_PORTS_MACS) &
   8552					ESPC_NUM_PORTS_MACS_VAL;
   8553
   8554				/* All of the current probing methods fail on
   8555				 * Maramba on-board parts.
   8556				 */
   8557				if (!parent->num_ports)
   8558					parent->num_ports = 4;
   8559			}
   8560		}
   8561	}
   8562
   8563	if (np->port >= parent->num_ports)
   8564		return -ENODEV;
   8565
   8566	return 0;
   8567}
   8568
   8569static int phy_record(struct niu_parent *parent, struct phy_probe_info *p,
   8570		      int dev_id_1, int dev_id_2, u8 phy_port, int type)
   8571{
   8572	u32 id = (dev_id_1 << 16) | dev_id_2;
   8573	u8 idx;
   8574
   8575	if (dev_id_1 < 0 || dev_id_2 < 0)
   8576		return 0;
   8577	if (type == PHY_TYPE_PMA_PMD || type == PHY_TYPE_PCS) {
   8578		/* Because of the NIU_PHY_ID_MASK being applied, the 8704
   8579		 * test covers the 8706 as well.
   8580		 */
   8581		if (((id & NIU_PHY_ID_MASK) != NIU_PHY_ID_BCM8704) &&
   8582		    ((id & NIU_PHY_ID_MASK) != NIU_PHY_ID_MRVL88X2011))
   8583			return 0;
   8584	} else {
   8585		if ((id & NIU_PHY_ID_MASK) != NIU_PHY_ID_BCM5464R)
   8586			return 0;
   8587	}
   8588
   8589	pr_info("niu%d: Found PHY %08x type %s at phy_port %u\n",
   8590		parent->index, id,
   8591		type == PHY_TYPE_PMA_PMD ? "PMA/PMD" :
   8592		type == PHY_TYPE_PCS ? "PCS" : "MII",
   8593		phy_port);
   8594
   8595	if (p->cur[type] >= NIU_MAX_PORTS) {
   8596		pr_err("Too many PHY ports\n");
   8597		return -EINVAL;
   8598	}
   8599	idx = p->cur[type];
   8600	p->phy_id[type][idx] = id;
   8601	p->phy_port[type][idx] = phy_port;
   8602	p->cur[type] = idx + 1;
   8603	return 0;
   8604}
   8605
   8606static int port_has_10g(struct phy_probe_info *p, int port)
   8607{
   8608	int i;
   8609
   8610	for (i = 0; i < p->cur[PHY_TYPE_PMA_PMD]; i++) {
   8611		if (p->phy_port[PHY_TYPE_PMA_PMD][i] == port)
   8612			return 1;
   8613	}
   8614	for (i = 0; i < p->cur[PHY_TYPE_PCS]; i++) {
   8615		if (p->phy_port[PHY_TYPE_PCS][i] == port)
   8616			return 1;
   8617	}
   8618
   8619	return 0;
   8620}
   8621
   8622static int count_10g_ports(struct phy_probe_info *p, int *lowest)
   8623{
   8624	int port, cnt;
   8625
   8626	cnt = 0;
   8627	*lowest = 32;
   8628	for (port = 8; port < 32; port++) {
   8629		if (port_has_10g(p, port)) {
   8630			if (!cnt)
   8631				*lowest = port;
   8632			cnt++;
   8633		}
   8634	}
   8635
   8636	return cnt;
   8637}
   8638
   8639static int count_1g_ports(struct phy_probe_info *p, int *lowest)
   8640{
   8641	*lowest = 32;
   8642	if (p->cur[PHY_TYPE_MII])
   8643		*lowest = p->phy_port[PHY_TYPE_MII][0];
   8644
   8645	return p->cur[PHY_TYPE_MII];
   8646}
   8647
   8648static void niu_n2_divide_channels(struct niu_parent *parent)
   8649{
   8650	int num_ports = parent->num_ports;
   8651	int i;
   8652
   8653	for (i = 0; i < num_ports; i++) {
   8654		parent->rxchan_per_port[i] = (16 / num_ports);
   8655		parent->txchan_per_port[i] = (16 / num_ports);
   8656
   8657		pr_info("niu%d: Port %u [%u RX chans] [%u TX chans]\n",
   8658			parent->index, i,
   8659			parent->rxchan_per_port[i],
   8660			parent->txchan_per_port[i]);
   8661	}
   8662}
   8663
   8664static void niu_divide_channels(struct niu_parent *parent,
   8665				int num_10g, int num_1g)
   8666{
   8667	int num_ports = parent->num_ports;
   8668	int rx_chans_per_10g, rx_chans_per_1g;
   8669	int tx_chans_per_10g, tx_chans_per_1g;
   8670	int i, tot_rx, tot_tx;
   8671
   8672	if (!num_10g || !num_1g) {
   8673		rx_chans_per_10g = rx_chans_per_1g =
   8674			(NIU_NUM_RXCHAN / num_ports);
   8675		tx_chans_per_10g = tx_chans_per_1g =
   8676			(NIU_NUM_TXCHAN / num_ports);
   8677	} else {
   8678		rx_chans_per_1g = NIU_NUM_RXCHAN / 8;
   8679		rx_chans_per_10g = (NIU_NUM_RXCHAN -
   8680				    (rx_chans_per_1g * num_1g)) /
   8681			num_10g;
   8682
   8683		tx_chans_per_1g = NIU_NUM_TXCHAN / 6;
   8684		tx_chans_per_10g = (NIU_NUM_TXCHAN -
   8685				    (tx_chans_per_1g * num_1g)) /
   8686			num_10g;
   8687	}
   8688
   8689	tot_rx = tot_tx = 0;
   8690	for (i = 0; i < num_ports; i++) {
   8691		int type = phy_decode(parent->port_phy, i);
   8692
   8693		if (type == PORT_TYPE_10G) {
   8694			parent->rxchan_per_port[i] = rx_chans_per_10g;
   8695			parent->txchan_per_port[i] = tx_chans_per_10g;
   8696		} else {
   8697			parent->rxchan_per_port[i] = rx_chans_per_1g;
   8698			parent->txchan_per_port[i] = tx_chans_per_1g;
   8699		}
   8700		pr_info("niu%d: Port %u [%u RX chans] [%u TX chans]\n",
   8701			parent->index, i,
   8702			parent->rxchan_per_port[i],
   8703			parent->txchan_per_port[i]);
   8704		tot_rx += parent->rxchan_per_port[i];
   8705		tot_tx += parent->txchan_per_port[i];
   8706	}
   8707
   8708	if (tot_rx > NIU_NUM_RXCHAN) {
   8709		pr_err("niu%d: Too many RX channels (%d), resetting to one per port\n",
   8710		       parent->index, tot_rx);
   8711		for (i = 0; i < num_ports; i++)
   8712			parent->rxchan_per_port[i] = 1;
   8713	}
   8714	if (tot_tx > NIU_NUM_TXCHAN) {
   8715		pr_err("niu%d: Too many TX channels (%d), resetting to one per port\n",
   8716		       parent->index, tot_tx);
   8717		for (i = 0; i < num_ports; i++)
   8718			parent->txchan_per_port[i] = 1;
   8719	}
   8720	if (tot_rx < NIU_NUM_RXCHAN || tot_tx < NIU_NUM_TXCHAN) {
   8721		pr_warn("niu%d: Driver bug, wasted channels, RX[%d] TX[%d]\n",
   8722			parent->index, tot_rx, tot_tx);
   8723	}
   8724}
   8725
   8726static void niu_divide_rdc_groups(struct niu_parent *parent,
   8727				  int num_10g, int num_1g)
   8728{
   8729	int i, num_ports = parent->num_ports;
   8730	int rdc_group, rdc_groups_per_port;
   8731	int rdc_channel_base;
   8732
   8733	rdc_group = 0;
   8734	rdc_groups_per_port = NIU_NUM_RDC_TABLES / num_ports;
   8735
   8736	rdc_channel_base = 0;
   8737
   8738	for (i = 0; i < num_ports; i++) {
   8739		struct niu_rdc_tables *tp = &parent->rdc_group_cfg[i];
   8740		int grp, num_channels = parent->rxchan_per_port[i];
   8741		int this_channel_offset;
   8742
   8743		tp->first_table_num = rdc_group;
   8744		tp->num_tables = rdc_groups_per_port;
   8745		this_channel_offset = 0;
   8746		for (grp = 0; grp < tp->num_tables; grp++) {
   8747			struct rdc_table *rt = &tp->tables[grp];
   8748			int slot;
   8749
   8750			pr_info("niu%d: Port %d RDC tbl(%d) [ ",
   8751				parent->index, i, tp->first_table_num + grp);
   8752			for (slot = 0; slot < NIU_RDC_TABLE_SLOTS; slot++) {
   8753				rt->rxdma_channel[slot] =
   8754					rdc_channel_base + this_channel_offset;
   8755
   8756				pr_cont("%d ", rt->rxdma_channel[slot]);
   8757
   8758				if (++this_channel_offset == num_channels)
   8759					this_channel_offset = 0;
   8760			}
   8761			pr_cont("]\n");
   8762		}
   8763
   8764		parent->rdc_default[i] = rdc_channel_base;
   8765
   8766		rdc_channel_base += num_channels;
   8767		rdc_group += rdc_groups_per_port;
   8768	}
   8769}
   8770
   8771static int fill_phy_probe_info(struct niu *np, struct niu_parent *parent,
   8772			       struct phy_probe_info *info)
   8773{
   8774	unsigned long flags;
   8775	int port, err;
   8776
   8777	memset(info, 0, sizeof(*info));
   8778
   8779	/* Port 0 to 7 are reserved for onboard Serdes, probe the rest.  */
   8780	niu_lock_parent(np, flags);
   8781	err = 0;
   8782	for (port = 8; port < 32; port++) {
   8783		int dev_id_1, dev_id_2;
   8784
   8785		dev_id_1 = mdio_read(np, port,
   8786				     NIU_PMA_PMD_DEV_ADDR, MII_PHYSID1);
   8787		dev_id_2 = mdio_read(np, port,
   8788				     NIU_PMA_PMD_DEV_ADDR, MII_PHYSID2);
   8789		err = phy_record(parent, info, dev_id_1, dev_id_2, port,
   8790				 PHY_TYPE_PMA_PMD);
   8791		if (err)
   8792			break;
   8793		dev_id_1 = mdio_read(np, port,
   8794				     NIU_PCS_DEV_ADDR, MII_PHYSID1);
   8795		dev_id_2 = mdio_read(np, port,
   8796				     NIU_PCS_DEV_ADDR, MII_PHYSID2);
   8797		err = phy_record(parent, info, dev_id_1, dev_id_2, port,
   8798				 PHY_TYPE_PCS);
   8799		if (err)
   8800			break;
   8801		dev_id_1 = mii_read(np, port, MII_PHYSID1);
   8802		dev_id_2 = mii_read(np, port, MII_PHYSID2);
   8803		err = phy_record(parent, info, dev_id_1, dev_id_2, port,
   8804				 PHY_TYPE_MII);
   8805		if (err)
   8806			break;
   8807	}
   8808	niu_unlock_parent(np, flags);
   8809
   8810	return err;
   8811}
   8812
   8813static int walk_phys(struct niu *np, struct niu_parent *parent)
   8814{
   8815	struct phy_probe_info *info = &parent->phy_probe_info;
   8816	int lowest_10g, lowest_1g;
   8817	int num_10g, num_1g;
   8818	u32 val;
   8819	int err;
   8820
   8821	num_10g = num_1g = 0;
   8822
   8823	if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) ||
   8824	    !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) {
   8825		num_10g = 0;
   8826		num_1g = 2;
   8827		parent->plat_type = PLAT_TYPE_ATCA_CP3220;
   8828		parent->num_ports = 4;
   8829		val = (phy_encode(PORT_TYPE_1G, 0) |
   8830		       phy_encode(PORT_TYPE_1G, 1) |
   8831		       phy_encode(PORT_TYPE_1G, 2) |
   8832		       phy_encode(PORT_TYPE_1G, 3));
   8833	} else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) {
   8834		num_10g = 2;
   8835		num_1g = 0;
   8836		parent->num_ports = 2;
   8837		val = (phy_encode(PORT_TYPE_10G, 0) |
   8838		       phy_encode(PORT_TYPE_10G, 1));
   8839	} else if ((np->flags & NIU_FLAGS_XCVR_SERDES) &&
   8840		   (parent->plat_type == PLAT_TYPE_NIU)) {
   8841		/* this is the Monza case */
   8842		if (np->flags & NIU_FLAGS_10G) {
   8843			val = (phy_encode(PORT_TYPE_10G, 0) |
   8844			       phy_encode(PORT_TYPE_10G, 1));
   8845		} else {
   8846			val = (phy_encode(PORT_TYPE_1G, 0) |
   8847			       phy_encode(PORT_TYPE_1G, 1));
   8848		}
   8849	} else {
   8850		err = fill_phy_probe_info(np, parent, info);
   8851		if (err)
   8852			return err;
   8853
   8854		num_10g = count_10g_ports(info, &lowest_10g);
   8855		num_1g = count_1g_ports(info, &lowest_1g);
   8856
   8857		switch ((num_10g << 4) | num_1g) {
   8858		case 0x24:
   8859			if (lowest_1g == 10)
   8860				parent->plat_type = PLAT_TYPE_VF_P0;
   8861			else if (lowest_1g == 26)
   8862				parent->plat_type = PLAT_TYPE_VF_P1;
   8863			else
   8864				goto unknown_vg_1g_port;
   8865
   8866			fallthrough;
   8867		case 0x22:
   8868			val = (phy_encode(PORT_TYPE_10G, 0) |
   8869			       phy_encode(PORT_TYPE_10G, 1) |
   8870			       phy_encode(PORT_TYPE_1G, 2) |
   8871			       phy_encode(PORT_TYPE_1G, 3));
   8872			break;
   8873
   8874		case 0x20:
   8875			val = (phy_encode(PORT_TYPE_10G, 0) |
   8876			       phy_encode(PORT_TYPE_10G, 1));
   8877			break;
   8878
   8879		case 0x10:
   8880			val = phy_encode(PORT_TYPE_10G, np->port);
   8881			break;
   8882
   8883		case 0x14:
   8884			if (lowest_1g == 10)
   8885				parent->plat_type = PLAT_TYPE_VF_P0;
   8886			else if (lowest_1g == 26)
   8887				parent->plat_type = PLAT_TYPE_VF_P1;
   8888			else
   8889				goto unknown_vg_1g_port;
   8890
   8891			fallthrough;
   8892		case 0x13:
   8893			if ((lowest_10g & 0x7) == 0)
   8894				val = (phy_encode(PORT_TYPE_10G, 0) |
   8895				       phy_encode(PORT_TYPE_1G, 1) |
   8896				       phy_encode(PORT_TYPE_1G, 2) |
   8897				       phy_encode(PORT_TYPE_1G, 3));
   8898			else
   8899				val = (phy_encode(PORT_TYPE_1G, 0) |
   8900				       phy_encode(PORT_TYPE_10G, 1) |
   8901				       phy_encode(PORT_TYPE_1G, 2) |
   8902				       phy_encode(PORT_TYPE_1G, 3));
   8903			break;
   8904
   8905		case 0x04:
   8906			if (lowest_1g == 10)
   8907				parent->plat_type = PLAT_TYPE_VF_P0;
   8908			else if (lowest_1g == 26)
   8909				parent->plat_type = PLAT_TYPE_VF_P1;
   8910			else
   8911				goto unknown_vg_1g_port;
   8912
   8913			val = (phy_encode(PORT_TYPE_1G, 0) |
   8914			       phy_encode(PORT_TYPE_1G, 1) |
   8915			       phy_encode(PORT_TYPE_1G, 2) |
   8916			       phy_encode(PORT_TYPE_1G, 3));
   8917			break;
   8918
   8919		default:
   8920			pr_err("Unsupported port config 10G[%d] 1G[%d]\n",
   8921			       num_10g, num_1g);
   8922			return -EINVAL;
   8923		}
   8924	}
   8925
   8926	parent->port_phy = val;
   8927
   8928	if (parent->plat_type == PLAT_TYPE_NIU)
   8929		niu_n2_divide_channels(parent);
   8930	else
   8931		niu_divide_channels(parent, num_10g, num_1g);
   8932
   8933	niu_divide_rdc_groups(parent, num_10g, num_1g);
   8934
   8935	return 0;
   8936
   8937unknown_vg_1g_port:
   8938	pr_err("Cannot identify platform type, 1gport=%d\n", lowest_1g);
   8939	return -EINVAL;
   8940}
   8941
   8942static int niu_probe_ports(struct niu *np)
   8943{
   8944	struct niu_parent *parent = np->parent;
   8945	int err, i;
   8946
   8947	if (parent->port_phy == PORT_PHY_UNKNOWN) {
   8948		err = walk_phys(np, parent);
   8949		if (err)
   8950			return err;
   8951
   8952		niu_set_ldg_timer_res(np, 2);
   8953		for (i = 0; i <= LDN_MAX; i++)
   8954			niu_ldn_irq_enable(np, i, 0);
   8955	}
   8956
   8957	if (parent->port_phy == PORT_PHY_INVALID)
   8958		return -EINVAL;
   8959
   8960	return 0;
   8961}
   8962
   8963static int niu_classifier_swstate_init(struct niu *np)
   8964{
   8965	struct niu_classifier *cp = &np->clas;
   8966
   8967	cp->tcam_top = (u16) np->port;
   8968	cp->tcam_sz = np->parent->tcam_num_entries / np->parent->num_ports;
   8969	cp->h1_init = 0xffffffff;
   8970	cp->h2_init = 0xffff;
   8971
   8972	return fflp_early_init(np);
   8973}
   8974
   8975static void niu_link_config_init(struct niu *np)
   8976{
   8977	struct niu_link_config *lp = &np->link_config;
   8978
   8979	lp->advertising = (ADVERTISED_10baseT_Half |
   8980			   ADVERTISED_10baseT_Full |
   8981			   ADVERTISED_100baseT_Half |
   8982			   ADVERTISED_100baseT_Full |
   8983			   ADVERTISED_1000baseT_Half |
   8984			   ADVERTISED_1000baseT_Full |
   8985			   ADVERTISED_10000baseT_Full |
   8986			   ADVERTISED_Autoneg);
   8987	lp->speed = lp->active_speed = SPEED_INVALID;
   8988	lp->duplex = DUPLEX_FULL;
   8989	lp->active_duplex = DUPLEX_INVALID;
   8990	lp->autoneg = 1;
   8991#if 0
   8992	lp->loopback_mode = LOOPBACK_MAC;
   8993	lp->active_speed = SPEED_10000;
   8994	lp->active_duplex = DUPLEX_FULL;
   8995#else
   8996	lp->loopback_mode = LOOPBACK_DISABLED;
   8997#endif
   8998}
   8999
   9000static int niu_init_mac_ipp_pcs_base(struct niu *np)
   9001{
   9002	switch (np->port) {
   9003	case 0:
   9004		np->mac_regs = np->regs + XMAC_PORT0_OFF;
   9005		np->ipp_off  = 0x00000;
   9006		np->pcs_off  = 0x04000;
   9007		np->xpcs_off = 0x02000;
   9008		break;
   9009
   9010	case 1:
   9011		np->mac_regs = np->regs + XMAC_PORT1_OFF;
   9012		np->ipp_off  = 0x08000;
   9013		np->pcs_off  = 0x0a000;
   9014		np->xpcs_off = 0x08000;
   9015		break;
   9016
   9017	case 2:
   9018		np->mac_regs = np->regs + BMAC_PORT2_OFF;
   9019		np->ipp_off  = 0x04000;
   9020		np->pcs_off  = 0x0e000;
   9021		np->xpcs_off = ~0UL;
   9022		break;
   9023
   9024	case 3:
   9025		np->mac_regs = np->regs + BMAC_PORT3_OFF;
   9026		np->ipp_off  = 0x0c000;
   9027		np->pcs_off  = 0x12000;
   9028		np->xpcs_off = ~0UL;
   9029		break;
   9030
   9031	default:
   9032		dev_err(np->device, "Port %u is invalid, cannot compute MAC block offset\n", np->port);
   9033		return -EINVAL;
   9034	}
   9035
   9036	return 0;
   9037}
   9038
   9039static void niu_try_msix(struct niu *np, u8 *ldg_num_map)
   9040{
   9041	struct msix_entry msi_vec[NIU_NUM_LDG];
   9042	struct niu_parent *parent = np->parent;
   9043	struct pci_dev *pdev = np->pdev;
   9044	int i, num_irqs;
   9045	u8 first_ldg;
   9046
   9047	first_ldg = (NIU_NUM_LDG / parent->num_ports) * np->port;
   9048	for (i = 0; i < (NIU_NUM_LDG / parent->num_ports); i++)
   9049		ldg_num_map[i] = first_ldg + i;
   9050
   9051	num_irqs = (parent->rxchan_per_port[np->port] +
   9052		    parent->txchan_per_port[np->port] +
   9053		    (np->port == 0 ? 3 : 1));
   9054	BUG_ON(num_irqs > (NIU_NUM_LDG / parent->num_ports));
   9055
   9056	for (i = 0; i < num_irqs; i++) {
   9057		msi_vec[i].vector = 0;
   9058		msi_vec[i].entry = i;
   9059	}
   9060
   9061	num_irqs = pci_enable_msix_range(pdev, msi_vec, 1, num_irqs);
   9062	if (num_irqs < 0) {
   9063		np->flags &= ~NIU_FLAGS_MSIX;
   9064		return;
   9065	}
   9066
   9067	np->flags |= NIU_FLAGS_MSIX;
   9068	for (i = 0; i < num_irqs; i++)
   9069		np->ldg[i].irq = msi_vec[i].vector;
   9070	np->num_ldg = num_irqs;
   9071}
   9072
   9073static int niu_n2_irq_init(struct niu *np, u8 *ldg_num_map)
   9074{
   9075#ifdef CONFIG_SPARC64
   9076	struct platform_device *op = np->op;
   9077	const u32 *int_prop;
   9078	int i;
   9079
   9080	int_prop = of_get_property(op->dev.of_node, "interrupts", NULL);
   9081	if (!int_prop)
   9082		return -ENODEV;
   9083
   9084	for (i = 0; i < op->archdata.num_irqs; i++) {
   9085		ldg_num_map[i] = int_prop[i];
   9086		np->ldg[i].irq = op->archdata.irqs[i];
   9087	}
   9088
   9089	np->num_ldg = op->archdata.num_irqs;
   9090
   9091	return 0;
   9092#else
   9093	return -EINVAL;
   9094#endif
   9095}
   9096
   9097static int niu_ldg_init(struct niu *np)
   9098{
   9099	struct niu_parent *parent = np->parent;
   9100	u8 ldg_num_map[NIU_NUM_LDG];
   9101	int first_chan, num_chan;
   9102	int i, err, ldg_rotor;
   9103	u8 port;
   9104
   9105	np->num_ldg = 1;
   9106	np->ldg[0].irq = np->dev->irq;
   9107	if (parent->plat_type == PLAT_TYPE_NIU) {
   9108		err = niu_n2_irq_init(np, ldg_num_map);
   9109		if (err)
   9110			return err;
   9111	} else
   9112		niu_try_msix(np, ldg_num_map);
   9113
   9114	port = np->port;
   9115	for (i = 0; i < np->num_ldg; i++) {
   9116		struct niu_ldg *lp = &np->ldg[i];
   9117
   9118		netif_napi_add(np->dev, &lp->napi, niu_poll, 64);
   9119
   9120		lp->np = np;
   9121		lp->ldg_num = ldg_num_map[i];
   9122		lp->timer = 2; /* XXX */
   9123
   9124		/* On N2 NIU the firmware has setup the SID mappings so they go
   9125		 * to the correct values that will route the LDG to the proper
   9126		 * interrupt in the NCU interrupt table.
   9127		 */
   9128		if (np->parent->plat_type != PLAT_TYPE_NIU) {
   9129			err = niu_set_ldg_sid(np, lp->ldg_num, port, i);
   9130			if (err)
   9131				return err;
   9132		}
   9133	}
   9134
   9135	/* We adopt the LDG assignment ordering used by the N2 NIU
   9136	 * 'interrupt' properties because that simplifies a lot of
   9137	 * things.  This ordering is:
   9138	 *
   9139	 *	MAC
   9140	 *	MIF	(if port zero)
   9141	 *	SYSERR	(if port zero)
   9142	 *	RX channels
   9143	 *	TX channels
   9144	 */
   9145
   9146	ldg_rotor = 0;
   9147
   9148	err = niu_ldg_assign_ldn(np, parent, ldg_num_map[ldg_rotor],
   9149				  LDN_MAC(port));
   9150	if (err)
   9151		return err;
   9152
   9153	ldg_rotor++;
   9154	if (ldg_rotor == np->num_ldg)
   9155		ldg_rotor = 0;
   9156
   9157	if (port == 0) {
   9158		err = niu_ldg_assign_ldn(np, parent,
   9159					 ldg_num_map[ldg_rotor],
   9160					 LDN_MIF);
   9161		if (err)
   9162			return err;
   9163
   9164		ldg_rotor++;
   9165		if (ldg_rotor == np->num_ldg)
   9166			ldg_rotor = 0;
   9167
   9168		err = niu_ldg_assign_ldn(np, parent,
   9169					 ldg_num_map[ldg_rotor],
   9170					 LDN_DEVICE_ERROR);
   9171		if (err)
   9172			return err;
   9173
   9174		ldg_rotor++;
   9175		if (ldg_rotor == np->num_ldg)
   9176			ldg_rotor = 0;
   9177
   9178	}
   9179
   9180	first_chan = 0;
   9181	for (i = 0; i < port; i++)
   9182		first_chan += parent->rxchan_per_port[i];
   9183	num_chan = parent->rxchan_per_port[port];
   9184
   9185	for (i = first_chan; i < (first_chan + num_chan); i++) {
   9186		err = niu_ldg_assign_ldn(np, parent,
   9187					 ldg_num_map[ldg_rotor],
   9188					 LDN_RXDMA(i));
   9189		if (err)
   9190			return err;
   9191		ldg_rotor++;
   9192		if (ldg_rotor == np->num_ldg)
   9193			ldg_rotor = 0;
   9194	}
   9195
   9196	first_chan = 0;
   9197	for (i = 0; i < port; i++)
   9198		first_chan += parent->txchan_per_port[i];
   9199	num_chan = parent->txchan_per_port[port];
   9200	for (i = first_chan; i < (first_chan + num_chan); i++) {
   9201		err = niu_ldg_assign_ldn(np, parent,
   9202					 ldg_num_map[ldg_rotor],
   9203					 LDN_TXDMA(i));
   9204		if (err)
   9205			return err;
   9206		ldg_rotor++;
   9207		if (ldg_rotor == np->num_ldg)
   9208			ldg_rotor = 0;
   9209	}
   9210
   9211	return 0;
   9212}
   9213
   9214static void niu_ldg_free(struct niu *np)
   9215{
   9216	if (np->flags & NIU_FLAGS_MSIX)
   9217		pci_disable_msix(np->pdev);
   9218}
   9219
   9220static int niu_get_of_props(struct niu *np)
   9221{
   9222#ifdef CONFIG_SPARC64
   9223	struct net_device *dev = np->dev;
   9224	struct device_node *dp;
   9225	const char *phy_type;
   9226	const u8 *mac_addr;
   9227	const char *model;
   9228	int prop_len;
   9229
   9230	if (np->parent->plat_type == PLAT_TYPE_NIU)
   9231		dp = np->op->dev.of_node;
   9232	else
   9233		dp = pci_device_to_OF_node(np->pdev);
   9234
   9235	phy_type = of_get_property(dp, "phy-type", NULL);
   9236	if (!phy_type) {
   9237		netdev_err(dev, "%pOF: OF node lacks phy-type property\n", dp);
   9238		return -EINVAL;
   9239	}
   9240
   9241	if (!strcmp(phy_type, "none"))
   9242		return -ENODEV;
   9243
   9244	strcpy(np->vpd.phy_type, phy_type);
   9245
   9246	if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) {
   9247		netdev_err(dev, "%pOF: Illegal phy string [%s]\n",
   9248			   dp, np->vpd.phy_type);
   9249		return -EINVAL;
   9250	}
   9251
   9252	mac_addr = of_get_property(dp, "local-mac-address", &prop_len);
   9253	if (!mac_addr) {
   9254		netdev_err(dev, "%pOF: OF node lacks local-mac-address property\n",
   9255			   dp);
   9256		return -EINVAL;
   9257	}
   9258	if (prop_len != dev->addr_len) {
   9259		netdev_err(dev, "%pOF: OF MAC address prop len (%d) is wrong\n",
   9260			   dp, prop_len);
   9261	}
   9262	eth_hw_addr_set(dev, mac_addr);
   9263	if (!is_valid_ether_addr(&dev->dev_addr[0])) {
   9264		netdev_err(dev, "%pOF: OF MAC address is invalid\n", dp);
   9265		netdev_err(dev, "%pOF: [ %pM ]\n", dp, dev->dev_addr);
   9266		return -EINVAL;
   9267	}
   9268
   9269	model = of_get_property(dp, "model", NULL);
   9270
   9271	if (model)
   9272		strcpy(np->vpd.model, model);
   9273
   9274	if (of_find_property(dp, "hot-swappable-phy", NULL)) {
   9275		np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER |
   9276			NIU_FLAGS_HOTPLUG_PHY);
   9277	}
   9278
   9279	return 0;
   9280#else
   9281	return -EINVAL;
   9282#endif
   9283}
   9284
   9285static int niu_get_invariants(struct niu *np)
   9286{
   9287	int err, have_props;
   9288	u32 offset;
   9289
   9290	err = niu_get_of_props(np);
   9291	if (err == -ENODEV)
   9292		return err;
   9293
   9294	have_props = !err;
   9295
   9296	err = niu_init_mac_ipp_pcs_base(np);
   9297	if (err)
   9298		return err;
   9299
   9300	if (have_props) {
   9301		err = niu_get_and_validate_port(np);
   9302		if (err)
   9303			return err;
   9304
   9305	} else  {
   9306		if (np->parent->plat_type == PLAT_TYPE_NIU)
   9307			return -EINVAL;
   9308
   9309		nw64(ESPC_PIO_EN, ESPC_PIO_EN_ENABLE);
   9310		offset = niu_pci_vpd_offset(np);
   9311		netif_printk(np, probe, KERN_DEBUG, np->dev,
   9312			     "%s() VPD offset [%08x]\n", __func__, offset);
   9313		if (offset) {
   9314			err = niu_pci_vpd_fetch(np, offset);
   9315			if (err < 0)
   9316				return err;
   9317		}
   9318		nw64(ESPC_PIO_EN, 0);
   9319
   9320		if (np->flags & NIU_FLAGS_VPD_VALID) {
   9321			niu_pci_vpd_validate(np);
   9322			err = niu_get_and_validate_port(np);
   9323			if (err)
   9324				return err;
   9325		}
   9326
   9327		if (!(np->flags & NIU_FLAGS_VPD_VALID)) {
   9328			err = niu_get_and_validate_port(np);
   9329			if (err)
   9330				return err;
   9331			err = niu_pci_probe_sprom(np);
   9332			if (err)
   9333				return err;
   9334		}
   9335	}
   9336
   9337	err = niu_probe_ports(np);
   9338	if (err)
   9339		return err;
   9340
   9341	niu_ldg_init(np);
   9342
   9343	niu_classifier_swstate_init(np);
   9344	niu_link_config_init(np);
   9345
   9346	err = niu_determine_phy_disposition(np);
   9347	if (!err)
   9348		err = niu_init_link(np);
   9349
   9350	return err;
   9351}
   9352
   9353static LIST_HEAD(niu_parent_list);
   9354static DEFINE_MUTEX(niu_parent_lock);
   9355static int niu_parent_index;
   9356
   9357static ssize_t show_port_phy(struct device *dev,
   9358			     struct device_attribute *attr, char *buf)
   9359{
   9360	struct platform_device *plat_dev = to_platform_device(dev);
   9361	struct niu_parent *p = dev_get_platdata(&plat_dev->dev);
   9362	u32 port_phy = p->port_phy;
   9363	char *orig_buf = buf;
   9364	int i;
   9365
   9366	if (port_phy == PORT_PHY_UNKNOWN ||
   9367	    port_phy == PORT_PHY_INVALID)
   9368		return 0;
   9369
   9370	for (i = 0; i < p->num_ports; i++) {
   9371		const char *type_str;
   9372		int type;
   9373
   9374		type = phy_decode(port_phy, i);
   9375		if (type == PORT_TYPE_10G)
   9376			type_str = "10G";
   9377		else
   9378			type_str = "1G";
   9379		buf += sprintf(buf,
   9380			       (i == 0) ? "%s" : " %s",
   9381			       type_str);
   9382	}
   9383	buf += sprintf(buf, "\n");
   9384	return buf - orig_buf;
   9385}
   9386
   9387static ssize_t show_plat_type(struct device *dev,
   9388			      struct device_attribute *attr, char *buf)
   9389{
   9390	struct platform_device *plat_dev = to_platform_device(dev);
   9391	struct niu_parent *p = dev_get_platdata(&plat_dev->dev);
   9392	const char *type_str;
   9393
   9394	switch (p->plat_type) {
   9395	case PLAT_TYPE_ATLAS:
   9396		type_str = "atlas";
   9397		break;
   9398	case PLAT_TYPE_NIU:
   9399		type_str = "niu";
   9400		break;
   9401	case PLAT_TYPE_VF_P0:
   9402		type_str = "vf_p0";
   9403		break;
   9404	case PLAT_TYPE_VF_P1:
   9405		type_str = "vf_p1";
   9406		break;
   9407	default:
   9408		type_str = "unknown";
   9409		break;
   9410	}
   9411
   9412	return sprintf(buf, "%s\n", type_str);
   9413}
   9414
   9415static ssize_t __show_chan_per_port(struct device *dev,
   9416				    struct device_attribute *attr, char *buf,
   9417				    int rx)
   9418{
   9419	struct platform_device *plat_dev = to_platform_device(dev);
   9420	struct niu_parent *p = dev_get_platdata(&plat_dev->dev);
   9421	char *orig_buf = buf;
   9422	u8 *arr;
   9423	int i;
   9424
   9425	arr = (rx ? p->rxchan_per_port : p->txchan_per_port);
   9426
   9427	for (i = 0; i < p->num_ports; i++) {
   9428		buf += sprintf(buf,
   9429			       (i == 0) ? "%d" : " %d",
   9430			       arr[i]);
   9431	}
   9432	buf += sprintf(buf, "\n");
   9433
   9434	return buf - orig_buf;
   9435}
   9436
   9437static ssize_t show_rxchan_per_port(struct device *dev,
   9438				    struct device_attribute *attr, char *buf)
   9439{
   9440	return __show_chan_per_port(dev, attr, buf, 1);
   9441}
   9442
   9443static ssize_t show_txchan_per_port(struct device *dev,
   9444				    struct device_attribute *attr, char *buf)
   9445{
   9446	return __show_chan_per_port(dev, attr, buf, 1);
   9447}
   9448
   9449static ssize_t show_num_ports(struct device *dev,
   9450			      struct device_attribute *attr, char *buf)
   9451{
   9452	struct platform_device *plat_dev = to_platform_device(dev);
   9453	struct niu_parent *p = dev_get_platdata(&plat_dev->dev);
   9454
   9455	return sprintf(buf, "%d\n", p->num_ports);
   9456}
   9457
   9458static struct device_attribute niu_parent_attributes[] = {
   9459	__ATTR(port_phy, 0444, show_port_phy, NULL),
   9460	__ATTR(plat_type, 0444, show_plat_type, NULL),
   9461	__ATTR(rxchan_per_port, 0444, show_rxchan_per_port, NULL),
   9462	__ATTR(txchan_per_port, 0444, show_txchan_per_port, NULL),
   9463	__ATTR(num_ports, 0444, show_num_ports, NULL),
   9464	{}
   9465};
   9466
   9467static struct niu_parent *niu_new_parent(struct niu *np,
   9468					 union niu_parent_id *id, u8 ptype)
   9469{
   9470	struct platform_device *plat_dev;
   9471	struct niu_parent *p;
   9472	int i;
   9473
   9474	plat_dev = platform_device_register_simple("niu-board", niu_parent_index,
   9475						   NULL, 0);
   9476	if (IS_ERR(plat_dev))
   9477		return NULL;
   9478
   9479	for (i = 0; niu_parent_attributes[i].attr.name; i++) {
   9480		int err = device_create_file(&plat_dev->dev,
   9481					     &niu_parent_attributes[i]);
   9482		if (err)
   9483			goto fail_unregister;
   9484	}
   9485
   9486	p = kzalloc(sizeof(*p), GFP_KERNEL);
   9487	if (!p)
   9488		goto fail_unregister;
   9489
   9490	p->index = niu_parent_index++;
   9491
   9492	plat_dev->dev.platform_data = p;
   9493	p->plat_dev = plat_dev;
   9494
   9495	memcpy(&p->id, id, sizeof(*id));
   9496	p->plat_type = ptype;
   9497	INIT_LIST_HEAD(&p->list);
   9498	atomic_set(&p->refcnt, 0);
   9499	list_add(&p->list, &niu_parent_list);
   9500	spin_lock_init(&p->lock);
   9501
   9502	p->rxdma_clock_divider = 7500;
   9503
   9504	p->tcam_num_entries = NIU_PCI_TCAM_ENTRIES;
   9505	if (p->plat_type == PLAT_TYPE_NIU)
   9506		p->tcam_num_entries = NIU_NONPCI_TCAM_ENTRIES;
   9507
   9508	for (i = CLASS_CODE_USER_PROG1; i <= CLASS_CODE_SCTP_IPV6; i++) {
   9509		int index = i - CLASS_CODE_USER_PROG1;
   9510
   9511		p->tcam_key[index] = TCAM_KEY_TSEL;
   9512		p->flow_key[index] = (FLOW_KEY_IPSA |
   9513				      FLOW_KEY_IPDA |
   9514				      FLOW_KEY_PROTO |
   9515				      (FLOW_KEY_L4_BYTE12 <<
   9516				       FLOW_KEY_L4_0_SHIFT) |
   9517				      (FLOW_KEY_L4_BYTE12 <<
   9518				       FLOW_KEY_L4_1_SHIFT));
   9519	}
   9520
   9521	for (i = 0; i < LDN_MAX + 1; i++)
   9522		p->ldg_map[i] = LDG_INVALID;
   9523
   9524	return p;
   9525
   9526fail_unregister:
   9527	platform_device_unregister(plat_dev);
   9528	return NULL;
   9529}
   9530
   9531static struct niu_parent *niu_get_parent(struct niu *np,
   9532					 union niu_parent_id *id, u8 ptype)
   9533{
   9534	struct niu_parent *p, *tmp;
   9535	int port = np->port;
   9536
   9537	mutex_lock(&niu_parent_lock);
   9538	p = NULL;
   9539	list_for_each_entry(tmp, &niu_parent_list, list) {
   9540		if (!memcmp(id, &tmp->id, sizeof(*id))) {
   9541			p = tmp;
   9542			break;
   9543		}
   9544	}
   9545	if (!p)
   9546		p = niu_new_parent(np, id, ptype);
   9547
   9548	if (p) {
   9549		char port_name[8];
   9550		int err;
   9551
   9552		sprintf(port_name, "port%d", port);
   9553		err = sysfs_create_link(&p->plat_dev->dev.kobj,
   9554					&np->device->kobj,
   9555					port_name);
   9556		if (!err) {
   9557			p->ports[port] = np;
   9558			atomic_inc(&p->refcnt);
   9559		}
   9560	}
   9561	mutex_unlock(&niu_parent_lock);
   9562
   9563	return p;
   9564}
   9565
   9566static void niu_put_parent(struct niu *np)
   9567{
   9568	struct niu_parent *p = np->parent;
   9569	u8 port = np->port;
   9570	char port_name[8];
   9571
   9572	BUG_ON(!p || p->ports[port] != np);
   9573
   9574	netif_printk(np, probe, KERN_DEBUG, np->dev,
   9575		     "%s() port[%u]\n", __func__, port);
   9576
   9577	sprintf(port_name, "port%d", port);
   9578
   9579	mutex_lock(&niu_parent_lock);
   9580
   9581	sysfs_remove_link(&p->plat_dev->dev.kobj, port_name);
   9582
   9583	p->ports[port] = NULL;
   9584	np->parent = NULL;
   9585
   9586	if (atomic_dec_and_test(&p->refcnt)) {
   9587		list_del(&p->list);
   9588		platform_device_unregister(p->plat_dev);
   9589	}
   9590
   9591	mutex_unlock(&niu_parent_lock);
   9592}
   9593
   9594static void *niu_pci_alloc_coherent(struct device *dev, size_t size,
   9595				    u64 *handle, gfp_t flag)
   9596{
   9597	dma_addr_t dh;
   9598	void *ret;
   9599
   9600	ret = dma_alloc_coherent(dev, size, &dh, flag);
   9601	if (ret)
   9602		*handle = dh;
   9603	return ret;
   9604}
   9605
   9606static void niu_pci_free_coherent(struct device *dev, size_t size,
   9607				  void *cpu_addr, u64 handle)
   9608{
   9609	dma_free_coherent(dev, size, cpu_addr, handle);
   9610}
   9611
   9612static u64 niu_pci_map_page(struct device *dev, struct page *page,
   9613			    unsigned long offset, size_t size,
   9614			    enum dma_data_direction direction)
   9615{
   9616	return dma_map_page(dev, page, offset, size, direction);
   9617}
   9618
   9619static void niu_pci_unmap_page(struct device *dev, u64 dma_address,
   9620			       size_t size, enum dma_data_direction direction)
   9621{
   9622	dma_unmap_page(dev, dma_address, size, direction);
   9623}
   9624
   9625static u64 niu_pci_map_single(struct device *dev, void *cpu_addr,
   9626			      size_t size,
   9627			      enum dma_data_direction direction)
   9628{
   9629	return dma_map_single(dev, cpu_addr, size, direction);
   9630}
   9631
   9632static void niu_pci_unmap_single(struct device *dev, u64 dma_address,
   9633				 size_t size,
   9634				 enum dma_data_direction direction)
   9635{
   9636	dma_unmap_single(dev, dma_address, size, direction);
   9637}
   9638
   9639static const struct niu_ops niu_pci_ops = {
   9640	.alloc_coherent	= niu_pci_alloc_coherent,
   9641	.free_coherent	= niu_pci_free_coherent,
   9642	.map_page	= niu_pci_map_page,
   9643	.unmap_page	= niu_pci_unmap_page,
   9644	.map_single	= niu_pci_map_single,
   9645	.unmap_single	= niu_pci_unmap_single,
   9646};
   9647
   9648static void niu_driver_version(void)
   9649{
   9650	static int niu_version_printed;
   9651
   9652	if (niu_version_printed++ == 0)
   9653		pr_info("%s", version);
   9654}
   9655
   9656static struct net_device *niu_alloc_and_init(struct device *gen_dev,
   9657					     struct pci_dev *pdev,
   9658					     struct platform_device *op,
   9659					     const struct niu_ops *ops, u8 port)
   9660{
   9661	struct net_device *dev;
   9662	struct niu *np;
   9663
   9664	dev = alloc_etherdev_mq(sizeof(struct niu), NIU_NUM_TXCHAN);
   9665	if (!dev)
   9666		return NULL;
   9667
   9668	SET_NETDEV_DEV(dev, gen_dev);
   9669
   9670	np = netdev_priv(dev);
   9671	np->dev = dev;
   9672	np->pdev = pdev;
   9673	np->op = op;
   9674	np->device = gen_dev;
   9675	np->ops = ops;
   9676
   9677	np->msg_enable = niu_debug;
   9678
   9679	spin_lock_init(&np->lock);
   9680	INIT_WORK(&np->reset_task, niu_reset_task);
   9681
   9682	np->port = port;
   9683
   9684	return dev;
   9685}
   9686
   9687static const struct net_device_ops niu_netdev_ops = {
   9688	.ndo_open		= niu_open,
   9689	.ndo_stop		= niu_close,
   9690	.ndo_start_xmit		= niu_start_xmit,
   9691	.ndo_get_stats64	= niu_get_stats,
   9692	.ndo_set_rx_mode	= niu_set_rx_mode,
   9693	.ndo_validate_addr	= eth_validate_addr,
   9694	.ndo_set_mac_address	= niu_set_mac_addr,
   9695	.ndo_eth_ioctl		= niu_ioctl,
   9696	.ndo_tx_timeout		= niu_tx_timeout,
   9697	.ndo_change_mtu		= niu_change_mtu,
   9698};
   9699
   9700static void niu_assign_netdev_ops(struct net_device *dev)
   9701{
   9702	dev->netdev_ops = &niu_netdev_ops;
   9703	dev->ethtool_ops = &niu_ethtool_ops;
   9704	dev->watchdog_timeo = NIU_TX_TIMEOUT;
   9705}
   9706
   9707static void niu_device_announce(struct niu *np)
   9708{
   9709	struct net_device *dev = np->dev;
   9710
   9711	pr_info("%s: NIU Ethernet %pM\n", dev->name, dev->dev_addr);
   9712
   9713	if (np->parent->plat_type == PLAT_TYPE_ATCA_CP3220) {
   9714		pr_info("%s: Port type[%s] mode[%s:%s] XCVR[%s] phy[%s]\n",
   9715				dev->name,
   9716				(np->flags & NIU_FLAGS_XMAC ? "XMAC" : "BMAC"),
   9717				(np->flags & NIU_FLAGS_10G ? "10G" : "1G"),
   9718				(np->flags & NIU_FLAGS_FIBER ? "RGMII FIBER" : "SERDES"),
   9719				(np->mac_xcvr == MAC_XCVR_MII ? "MII" :
   9720				 (np->mac_xcvr == MAC_XCVR_PCS ? "PCS" : "XPCS")),
   9721				np->vpd.phy_type);
   9722	} else {
   9723		pr_info("%s: Port type[%s] mode[%s:%s] XCVR[%s] phy[%s]\n",
   9724				dev->name,
   9725				(np->flags & NIU_FLAGS_XMAC ? "XMAC" : "BMAC"),
   9726				(np->flags & NIU_FLAGS_10G ? "10G" : "1G"),
   9727				(np->flags & NIU_FLAGS_FIBER ? "FIBER" :
   9728				 (np->flags & NIU_FLAGS_XCVR_SERDES ? "SERDES" :
   9729				  "COPPER")),
   9730				(np->mac_xcvr == MAC_XCVR_MII ? "MII" :
   9731				 (np->mac_xcvr == MAC_XCVR_PCS ? "PCS" : "XPCS")),
   9732				np->vpd.phy_type);
   9733	}
   9734}
   9735
   9736static void niu_set_basic_features(struct net_device *dev)
   9737{
   9738	dev->hw_features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_RXHASH;
   9739	dev->features |= dev->hw_features | NETIF_F_RXCSUM;
   9740}
   9741
   9742static int niu_pci_init_one(struct pci_dev *pdev,
   9743			    const struct pci_device_id *ent)
   9744{
   9745	union niu_parent_id parent_id;
   9746	struct net_device *dev;
   9747	struct niu *np;
   9748	int err;
   9749
   9750	niu_driver_version();
   9751
   9752	err = pci_enable_device(pdev);
   9753	if (err) {
   9754		dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n");
   9755		return err;
   9756	}
   9757
   9758	if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) ||
   9759	    !(pci_resource_flags(pdev, 2) & IORESOURCE_MEM)) {
   9760		dev_err(&pdev->dev, "Cannot find proper PCI device base addresses, aborting\n");
   9761		err = -ENODEV;
   9762		goto err_out_disable_pdev;
   9763	}
   9764
   9765	err = pci_request_regions(pdev, DRV_MODULE_NAME);
   9766	if (err) {
   9767		dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting\n");
   9768		goto err_out_disable_pdev;
   9769	}
   9770
   9771	if (!pci_is_pcie(pdev)) {
   9772		dev_err(&pdev->dev, "Cannot find PCI Express capability, aborting\n");
   9773		err = -ENODEV;
   9774		goto err_out_free_res;
   9775	}
   9776
   9777	dev = niu_alloc_and_init(&pdev->dev, pdev, NULL,
   9778				 &niu_pci_ops, PCI_FUNC(pdev->devfn));
   9779	if (!dev) {
   9780		err = -ENOMEM;
   9781		goto err_out_free_res;
   9782	}
   9783	np = netdev_priv(dev);
   9784
   9785	memset(&parent_id, 0, sizeof(parent_id));
   9786	parent_id.pci.domain = pci_domain_nr(pdev->bus);
   9787	parent_id.pci.bus = pdev->bus->number;
   9788	parent_id.pci.device = PCI_SLOT(pdev->devfn);
   9789
   9790	np->parent = niu_get_parent(np, &parent_id,
   9791				    PLAT_TYPE_ATLAS);
   9792	if (!np->parent) {
   9793		err = -ENOMEM;
   9794		goto err_out_free_dev;
   9795	}
   9796
   9797	pcie_capability_clear_and_set_word(pdev, PCI_EXP_DEVCTL,
   9798		PCI_EXP_DEVCTL_NOSNOOP_EN,
   9799		PCI_EXP_DEVCTL_CERE | PCI_EXP_DEVCTL_NFERE |
   9800		PCI_EXP_DEVCTL_FERE | PCI_EXP_DEVCTL_URRE |
   9801		PCI_EXP_DEVCTL_RELAX_EN);
   9802
   9803	err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44));
   9804	if (!err)
   9805		dev->features |= NETIF_F_HIGHDMA;
   9806	if (err) {
   9807		err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
   9808		if (err) {
   9809			dev_err(&pdev->dev, "No usable DMA configuration, aborting\n");
   9810			goto err_out_release_parent;
   9811		}
   9812	}
   9813
   9814	niu_set_basic_features(dev);
   9815
   9816	dev->priv_flags |= IFF_UNICAST_FLT;
   9817
   9818	np->regs = pci_ioremap_bar(pdev, 0);
   9819	if (!np->regs) {
   9820		dev_err(&pdev->dev, "Cannot map device registers, aborting\n");
   9821		err = -ENOMEM;
   9822		goto err_out_release_parent;
   9823	}
   9824
   9825	pci_set_master(pdev);
   9826	pci_save_state(pdev);
   9827
   9828	dev->irq = pdev->irq;
   9829
   9830	/* MTU range: 68 - 9216 */
   9831	dev->min_mtu = ETH_MIN_MTU;
   9832	dev->max_mtu = NIU_MAX_MTU;
   9833
   9834	niu_assign_netdev_ops(dev);
   9835
   9836	err = niu_get_invariants(np);
   9837	if (err) {
   9838		if (err != -ENODEV)
   9839			dev_err(&pdev->dev, "Problem fetching invariants of chip, aborting\n");
   9840		goto err_out_iounmap;
   9841	}
   9842
   9843	err = register_netdev(dev);
   9844	if (err) {
   9845		dev_err(&pdev->dev, "Cannot register net device, aborting\n");
   9846		goto err_out_iounmap;
   9847	}
   9848
   9849	pci_set_drvdata(pdev, dev);
   9850
   9851	niu_device_announce(np);
   9852
   9853	return 0;
   9854
   9855err_out_iounmap:
   9856	if (np->regs) {
   9857		iounmap(np->regs);
   9858		np->regs = NULL;
   9859	}
   9860
   9861err_out_release_parent:
   9862	niu_put_parent(np);
   9863
   9864err_out_free_dev:
   9865	free_netdev(dev);
   9866
   9867err_out_free_res:
   9868	pci_release_regions(pdev);
   9869
   9870err_out_disable_pdev:
   9871	pci_disable_device(pdev);
   9872
   9873	return err;
   9874}
   9875
   9876static void niu_pci_remove_one(struct pci_dev *pdev)
   9877{
   9878	struct net_device *dev = pci_get_drvdata(pdev);
   9879
   9880	if (dev) {
   9881		struct niu *np = netdev_priv(dev);
   9882
   9883		unregister_netdev(dev);
   9884		if (np->regs) {
   9885			iounmap(np->regs);
   9886			np->regs = NULL;
   9887		}
   9888
   9889		niu_ldg_free(np);
   9890
   9891		niu_put_parent(np);
   9892
   9893		free_netdev(dev);
   9894		pci_release_regions(pdev);
   9895		pci_disable_device(pdev);
   9896	}
   9897}
   9898
   9899static int __maybe_unused niu_suspend(struct device *dev_d)
   9900{
   9901	struct net_device *dev = dev_get_drvdata(dev_d);
   9902	struct niu *np = netdev_priv(dev);
   9903	unsigned long flags;
   9904
   9905	if (!netif_running(dev))
   9906		return 0;
   9907
   9908	flush_work(&np->reset_task);
   9909	niu_netif_stop(np);
   9910
   9911	del_timer_sync(&np->timer);
   9912
   9913	spin_lock_irqsave(&np->lock, flags);
   9914	niu_enable_interrupts(np, 0);
   9915	spin_unlock_irqrestore(&np->lock, flags);
   9916
   9917	netif_device_detach(dev);
   9918
   9919	spin_lock_irqsave(&np->lock, flags);
   9920	niu_stop_hw(np);
   9921	spin_unlock_irqrestore(&np->lock, flags);
   9922
   9923	return 0;
   9924}
   9925
   9926static int __maybe_unused niu_resume(struct device *dev_d)
   9927{
   9928	struct net_device *dev = dev_get_drvdata(dev_d);
   9929	struct niu *np = netdev_priv(dev);
   9930	unsigned long flags;
   9931	int err;
   9932
   9933	if (!netif_running(dev))
   9934		return 0;
   9935
   9936	netif_device_attach(dev);
   9937
   9938	spin_lock_irqsave(&np->lock, flags);
   9939
   9940	err = niu_init_hw(np);
   9941	if (!err) {
   9942		np->timer.expires = jiffies + HZ;
   9943		add_timer(&np->timer);
   9944		niu_netif_start(np);
   9945	}
   9946
   9947	spin_unlock_irqrestore(&np->lock, flags);
   9948
   9949	return err;
   9950}
   9951
   9952static SIMPLE_DEV_PM_OPS(niu_pm_ops, niu_suspend, niu_resume);
   9953
   9954static struct pci_driver niu_pci_driver = {
   9955	.name		= DRV_MODULE_NAME,
   9956	.id_table	= niu_pci_tbl,
   9957	.probe		= niu_pci_init_one,
   9958	.remove		= niu_pci_remove_one,
   9959	.driver.pm	= &niu_pm_ops,
   9960};
   9961
   9962#ifdef CONFIG_SPARC64
   9963static void *niu_phys_alloc_coherent(struct device *dev, size_t size,
   9964				     u64 *dma_addr, gfp_t flag)
   9965{
   9966	unsigned long order = get_order(size);
   9967	unsigned long page = __get_free_pages(flag, order);
   9968
   9969	if (page == 0UL)
   9970		return NULL;
   9971	memset((char *)page, 0, PAGE_SIZE << order);
   9972	*dma_addr = __pa(page);
   9973
   9974	return (void *) page;
   9975}
   9976
   9977static void niu_phys_free_coherent(struct device *dev, size_t size,
   9978				   void *cpu_addr, u64 handle)
   9979{
   9980	unsigned long order = get_order(size);
   9981
   9982	free_pages((unsigned long) cpu_addr, order);
   9983}
   9984
   9985static u64 niu_phys_map_page(struct device *dev, struct page *page,
   9986			     unsigned long offset, size_t size,
   9987			     enum dma_data_direction direction)
   9988{
   9989	return page_to_phys(page) + offset;
   9990}
   9991
   9992static void niu_phys_unmap_page(struct device *dev, u64 dma_address,
   9993				size_t size, enum dma_data_direction direction)
   9994{
   9995	/* Nothing to do.  */
   9996}
   9997
   9998static u64 niu_phys_map_single(struct device *dev, void *cpu_addr,
   9999			       size_t size,
  10000			       enum dma_data_direction direction)
  10001{
  10002	return __pa(cpu_addr);
  10003}
  10004
  10005static void niu_phys_unmap_single(struct device *dev, u64 dma_address,
  10006				  size_t size,
  10007				  enum dma_data_direction direction)
  10008{
  10009	/* Nothing to do.  */
  10010}
  10011
  10012static const struct niu_ops niu_phys_ops = {
  10013	.alloc_coherent	= niu_phys_alloc_coherent,
  10014	.free_coherent	= niu_phys_free_coherent,
  10015	.map_page	= niu_phys_map_page,
  10016	.unmap_page	= niu_phys_unmap_page,
  10017	.map_single	= niu_phys_map_single,
  10018	.unmap_single	= niu_phys_unmap_single,
  10019};
  10020
  10021static int niu_of_probe(struct platform_device *op)
  10022{
  10023	union niu_parent_id parent_id;
  10024	struct net_device *dev;
  10025	struct niu *np;
  10026	const u32 *reg;
  10027	int err;
  10028
  10029	niu_driver_version();
  10030
  10031	reg = of_get_property(op->dev.of_node, "reg", NULL);
  10032	if (!reg) {
  10033		dev_err(&op->dev, "%pOF: No 'reg' property, aborting\n",
  10034			op->dev.of_node);
  10035		return -ENODEV;
  10036	}
  10037
  10038	dev = niu_alloc_and_init(&op->dev, NULL, op,
  10039				 &niu_phys_ops, reg[0] & 0x1);
  10040	if (!dev) {
  10041		err = -ENOMEM;
  10042		goto err_out;
  10043	}
  10044	np = netdev_priv(dev);
  10045
  10046	memset(&parent_id, 0, sizeof(parent_id));
  10047	parent_id.of = of_get_parent(op->dev.of_node);
  10048
  10049	np->parent = niu_get_parent(np, &parent_id,
  10050				    PLAT_TYPE_NIU);
  10051	if (!np->parent) {
  10052		err = -ENOMEM;
  10053		goto err_out_free_dev;
  10054	}
  10055
  10056	niu_set_basic_features(dev);
  10057
  10058	np->regs = of_ioremap(&op->resource[1], 0,
  10059			      resource_size(&op->resource[1]),
  10060			      "niu regs");
  10061	if (!np->regs) {
  10062		dev_err(&op->dev, "Cannot map device registers, aborting\n");
  10063		err = -ENOMEM;
  10064		goto err_out_release_parent;
  10065	}
  10066
  10067	np->vir_regs_1 = of_ioremap(&op->resource[2], 0,
  10068				    resource_size(&op->resource[2]),
  10069				    "niu vregs-1");
  10070	if (!np->vir_regs_1) {
  10071		dev_err(&op->dev, "Cannot map device vir registers 1, aborting\n");
  10072		err = -ENOMEM;
  10073		goto err_out_iounmap;
  10074	}
  10075
  10076	np->vir_regs_2 = of_ioremap(&op->resource[3], 0,
  10077				    resource_size(&op->resource[3]),
  10078				    "niu vregs-2");
  10079	if (!np->vir_regs_2) {
  10080		dev_err(&op->dev, "Cannot map device vir registers 2, aborting\n");
  10081		err = -ENOMEM;
  10082		goto err_out_iounmap;
  10083	}
  10084
  10085	niu_assign_netdev_ops(dev);
  10086
  10087	err = niu_get_invariants(np);
  10088	if (err) {
  10089		if (err != -ENODEV)
  10090			dev_err(&op->dev, "Problem fetching invariants of chip, aborting\n");
  10091		goto err_out_iounmap;
  10092	}
  10093
  10094	err = register_netdev(dev);
  10095	if (err) {
  10096		dev_err(&op->dev, "Cannot register net device, aborting\n");
  10097		goto err_out_iounmap;
  10098	}
  10099
  10100	platform_set_drvdata(op, dev);
  10101
  10102	niu_device_announce(np);
  10103
  10104	return 0;
  10105
  10106err_out_iounmap:
  10107	if (np->vir_regs_1) {
  10108		of_iounmap(&op->resource[2], np->vir_regs_1,
  10109			   resource_size(&op->resource[2]));
  10110		np->vir_regs_1 = NULL;
  10111	}
  10112
  10113	if (np->vir_regs_2) {
  10114		of_iounmap(&op->resource[3], np->vir_regs_2,
  10115			   resource_size(&op->resource[3]));
  10116		np->vir_regs_2 = NULL;
  10117	}
  10118
  10119	if (np->regs) {
  10120		of_iounmap(&op->resource[1], np->regs,
  10121			   resource_size(&op->resource[1]));
  10122		np->regs = NULL;
  10123	}
  10124
  10125err_out_release_parent:
  10126	niu_put_parent(np);
  10127
  10128err_out_free_dev:
  10129	free_netdev(dev);
  10130
  10131err_out:
  10132	return err;
  10133}
  10134
  10135static int niu_of_remove(struct platform_device *op)
  10136{
  10137	struct net_device *dev = platform_get_drvdata(op);
  10138
  10139	if (dev) {
  10140		struct niu *np = netdev_priv(dev);
  10141
  10142		unregister_netdev(dev);
  10143
  10144		if (np->vir_regs_1) {
  10145			of_iounmap(&op->resource[2], np->vir_regs_1,
  10146				   resource_size(&op->resource[2]));
  10147			np->vir_regs_1 = NULL;
  10148		}
  10149
  10150		if (np->vir_regs_2) {
  10151			of_iounmap(&op->resource[3], np->vir_regs_2,
  10152				   resource_size(&op->resource[3]));
  10153			np->vir_regs_2 = NULL;
  10154		}
  10155
  10156		if (np->regs) {
  10157			of_iounmap(&op->resource[1], np->regs,
  10158				   resource_size(&op->resource[1]));
  10159			np->regs = NULL;
  10160		}
  10161
  10162		niu_ldg_free(np);
  10163
  10164		niu_put_parent(np);
  10165
  10166		free_netdev(dev);
  10167	}
  10168	return 0;
  10169}
  10170
  10171static const struct of_device_id niu_match[] = {
  10172	{
  10173		.name = "network",
  10174		.compatible = "SUNW,niusl",
  10175	},
  10176	{},
  10177};
  10178MODULE_DEVICE_TABLE(of, niu_match);
  10179
  10180static struct platform_driver niu_of_driver = {
  10181	.driver = {
  10182		.name = "niu",
  10183		.of_match_table = niu_match,
  10184	},
  10185	.probe		= niu_of_probe,
  10186	.remove		= niu_of_remove,
  10187};
  10188
  10189#endif /* CONFIG_SPARC64 */
  10190
  10191static int __init niu_init(void)
  10192{
  10193	int err = 0;
  10194
  10195	BUILD_BUG_ON(PAGE_SIZE < 4 * 1024);
  10196
  10197	BUILD_BUG_ON(offsetof(struct page, mapping) !=
  10198		     offsetof(union niu_page, next));
  10199
  10200	niu_debug = netif_msg_init(debug, NIU_MSG_DEFAULT);
  10201
  10202#ifdef CONFIG_SPARC64
  10203	err = platform_driver_register(&niu_of_driver);
  10204#endif
  10205
  10206	if (!err) {
  10207		err = pci_register_driver(&niu_pci_driver);
  10208#ifdef CONFIG_SPARC64
  10209		if (err)
  10210			platform_driver_unregister(&niu_of_driver);
  10211#endif
  10212	}
  10213
  10214	return err;
  10215}
  10216
  10217static void __exit niu_exit(void)
  10218{
  10219	pci_unregister_driver(&niu_pci_driver);
  10220#ifdef CONFIG_SPARC64
  10221	platform_driver_unregister(&niu_of_driver);
  10222#endif
  10223}
  10224
  10225module_init(niu_init);
  10226module_exit(niu_exit);