1 /* niu.c: Neptune ethernet driver.
3 * Copyright (C) 2007, 2008 David S. Miller (davem@davemloft.net)
6 #include <linux/module.h>
7 #include <linux/init.h>
9 #include <linux/dma-mapping.h>
10 #include <linux/netdevice.h>
11 #include <linux/ethtool.h>
12 #include <linux/etherdevice.h>
13 #include <linux/platform_device.h>
14 #include <linux/delay.h>
15 #include <linux/bitops.h>
16 #include <linux/mii.h>
17 #include <linux/if_ether.h>
18 #include <linux/if_vlan.h>
21 #include <linux/ipv6.h>
22 #include <linux/log2.h>
23 #include <linux/jiffies.h>
24 #include <linux/crc32.h>
29 #include <linux/of_device.h>
34 #define DRV_MODULE_NAME "niu"
35 #define PFX DRV_MODULE_NAME ": "
36 #define DRV_MODULE_VERSION "1.0"
37 #define DRV_MODULE_RELDATE "Nov 14, 2008"
39 static char version[] __devinitdata =
40 DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
42 MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
43 MODULE_DESCRIPTION("NIU ethernet driver");
44 MODULE_LICENSE("GPL");
45 MODULE_VERSION(DRV_MODULE_VERSION);
47 #ifndef DMA_44BIT_MASK
48 #define DMA_44BIT_MASK 0x00000fffffffffffULL
52 static u64 readq(void __iomem *reg)
54 return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);
57 static void writeq(u64 val, void __iomem *reg)
59 writel(val & 0xffffffff, reg);
60 writel(val >> 32, reg + 0x4UL);
64 static struct pci_device_id niu_pci_tbl[] = {
65 {PCI_DEVICE(PCI_VENDOR_ID_SUN, 0xabcd)},
69 MODULE_DEVICE_TABLE(pci, niu_pci_tbl);
71 #define NIU_TX_TIMEOUT (5 * HZ)
73 #define nr64(reg) readq(np->regs + (reg))
74 #define nw64(reg, val) writeq((val), np->regs + (reg))
76 #define nr64_mac(reg) readq(np->mac_regs + (reg))
77 #define nw64_mac(reg, val) writeq((val), np->mac_regs + (reg))
79 #define nr64_ipp(reg) readq(np->regs + np->ipp_off + (reg))
80 #define nw64_ipp(reg, val) writeq((val), np->regs + np->ipp_off + (reg))
82 #define nr64_pcs(reg) readq(np->regs + np->pcs_off + (reg))
83 #define nw64_pcs(reg, val) writeq((val), np->regs + np->pcs_off + (reg))
85 #define nr64_xpcs(reg) readq(np->regs + np->xpcs_off + (reg))
86 #define nw64_xpcs(reg, val) writeq((val), np->regs + np->xpcs_off + (reg))
88 #define NIU_MSG_DEFAULT (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
91 static int debug = -1;
92 module_param(debug, int, 0);
93 MODULE_PARM_DESC(debug, "NIU debug level");
95 #define niudbg(TYPE, f, a...) \
96 do { if ((np)->msg_enable & NETIF_MSG_##TYPE) \
97 printk(KERN_DEBUG PFX f, ## a); \
100 #define niuinfo(TYPE, f, a...) \
101 do { if ((np)->msg_enable & NETIF_MSG_##TYPE) \
102 printk(KERN_INFO PFX f, ## a); \
105 #define niuwarn(TYPE, f, a...) \
106 do { if ((np)->msg_enable & NETIF_MSG_##TYPE) \
107 printk(KERN_WARNING PFX f, ## a); \
110 #define niu_lock_parent(np, flags) \
111 spin_lock_irqsave(&np->parent->lock, flags)
112 #define niu_unlock_parent(np, flags) \
113 spin_unlock_irqrestore(&np->parent->lock, flags)
115 static int serdes_init_10g_serdes(struct niu *np);
117 static int __niu_wait_bits_clear_mac(struct niu *np, unsigned long reg,
118 u64 bits, int limit, int delay)
120 while (--limit >= 0) {
121 u64 val = nr64_mac(reg);
132 static int __niu_set_and_wait_clear_mac(struct niu *np, unsigned long reg,
133 u64 bits, int limit, int delay,
134 const char *reg_name)
139 err = __niu_wait_bits_clear_mac(np, reg, bits, limit, delay);
141 dev_err(np->device, PFX "%s: bits (%llx) of register %s "
142 "would not clear, val[%llx]\n",
143 np->dev->name, (unsigned long long) bits, reg_name,
144 (unsigned long long) nr64_mac(reg));
148 #define niu_set_and_wait_clear_mac(NP, REG, BITS, LIMIT, DELAY, REG_NAME) \
149 ({ BUILD_BUG_ON(LIMIT <= 0 || DELAY < 0); \
150 __niu_set_and_wait_clear_mac(NP, REG, BITS, LIMIT, DELAY, REG_NAME); \
153 static int __niu_wait_bits_clear_ipp(struct niu *np, unsigned long reg,
154 u64 bits, int limit, int delay)
156 while (--limit >= 0) {
157 u64 val = nr64_ipp(reg);
168 static int __niu_set_and_wait_clear_ipp(struct niu *np, unsigned long reg,
169 u64 bits, int limit, int delay,
170 const char *reg_name)
179 err = __niu_wait_bits_clear_ipp(np, reg, bits, limit, delay);
181 dev_err(np->device, PFX "%s: bits (%llx) of register %s "
182 "would not clear, val[%llx]\n",
183 np->dev->name, (unsigned long long) bits, reg_name,
184 (unsigned long long) nr64_ipp(reg));
188 #define niu_set_and_wait_clear_ipp(NP, REG, BITS, LIMIT, DELAY, REG_NAME) \
189 ({ BUILD_BUG_ON(LIMIT <= 0 || DELAY < 0); \
190 __niu_set_and_wait_clear_ipp(NP, REG, BITS, LIMIT, DELAY, REG_NAME); \
193 static int __niu_wait_bits_clear(struct niu *np, unsigned long reg,
194 u64 bits, int limit, int delay)
196 while (--limit >= 0) {
208 #define niu_wait_bits_clear(NP, REG, BITS, LIMIT, DELAY) \
209 ({ BUILD_BUG_ON(LIMIT <= 0 || DELAY < 0); \
210 __niu_wait_bits_clear(NP, REG, BITS, LIMIT, DELAY); \
213 static int __niu_set_and_wait_clear(struct niu *np, unsigned long reg,
214 u64 bits, int limit, int delay,
215 const char *reg_name)
220 err = __niu_wait_bits_clear(np, reg, bits, limit, delay);
222 dev_err(np->device, PFX "%s: bits (%llx) of register %s "
223 "would not clear, val[%llx]\n",
224 np->dev->name, (unsigned long long) bits, reg_name,
225 (unsigned long long) nr64(reg));
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); \
234 static void niu_ldg_rearm(struct niu *np, struct niu_ldg *lp, int on)
236 u64 val = (u64) lp->timer;
239 val |= LDG_IMGMT_ARM;
241 nw64(LDG_IMGMT(lp->ldg_num), val);
244 static int niu_ldn_irq_enable(struct niu *np, int ldn, int on)
246 unsigned long mask_reg, bits;
249 if (ldn < 0 || ldn > LDN_MAX)
253 mask_reg = LD_IM0(ldn);
256 mask_reg = LD_IM1(ldn - 64);
260 val = nr64(mask_reg);
270 static int niu_enable_ldn_in_ldg(struct niu *np, struct niu_ldg *lp, int on)
272 struct niu_parent *parent = np->parent;
275 for (i = 0; i <= LDN_MAX; i++) {
278 if (parent->ldg_map[i] != lp->ldg_num)
281 err = niu_ldn_irq_enable(np, i, on);
288 static int niu_enable_interrupts(struct niu *np, int on)
292 for (i = 0; i < np->num_ldg; i++) {
293 struct niu_ldg *lp = &np->ldg[i];
296 err = niu_enable_ldn_in_ldg(np, lp, on);
300 for (i = 0; i < np->num_ldg; i++)
301 niu_ldg_rearm(np, &np->ldg[i], on);
306 static u32 phy_encode(u32 type, int port)
308 return (type << (port * 2));
311 static u32 phy_decode(u32 val, int port)
313 return (val >> (port * 2)) & PORT_TYPE_MASK;
316 static int mdio_wait(struct niu *np)
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;
332 static int mdio_read(struct niu *np, int port, int dev, int reg)
336 nw64(MIF_FRAME_OUTPUT, MDIO_ADDR_OP(port, dev, reg));
341 nw64(MIF_FRAME_OUTPUT, MDIO_READ_OP(port, dev));
342 return mdio_wait(np);
345 static int mdio_write(struct niu *np, int port, int dev, int reg, int data)
349 nw64(MIF_FRAME_OUTPUT, MDIO_ADDR_OP(port, dev, reg));
354 nw64(MIF_FRAME_OUTPUT, MDIO_WRITE_OP(port, dev, data));
362 static int mii_read(struct niu *np, int port, int reg)
364 nw64(MIF_FRAME_OUTPUT, MII_READ_OP(port, reg));
365 return mdio_wait(np);
368 static int mii_write(struct niu *np, int port, int reg, int data)
372 nw64(MIF_FRAME_OUTPUT, MII_WRITE_OP(port, reg, data));
380 static int esr2_set_tx_cfg(struct niu *np, unsigned long channel, u32 val)
384 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
385 ESR2_TI_PLL_TX_CFG_L(channel),
388 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
389 ESR2_TI_PLL_TX_CFG_H(channel),
394 static int esr2_set_rx_cfg(struct niu *np, unsigned long channel, u32 val)
398 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
399 ESR2_TI_PLL_RX_CFG_L(channel),
402 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
403 ESR2_TI_PLL_RX_CFG_H(channel),
408 /* Mode is always 10G fiber. */
409 static int serdes_init_niu_10g_fiber(struct niu *np)
411 struct niu_link_config *lp = &np->link_config;
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);
420 if (lp->loopback_mode == LOOPBACK_PHY) {
421 u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS;
423 mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
424 ESR2_TI_PLL_TEST_CFG_L, test_cfg);
426 tx_cfg |= PLL_TX_CFG_ENTEST;
427 rx_cfg |= PLL_RX_CFG_ENTEST;
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);
437 for (i = 0; i < 4; i++) {
438 int err = esr2_set_rx_cfg(np, i, rx_cfg);
446 static int serdes_init_niu_1g_serdes(struct niu *np)
448 struct niu_link_config *lp = &np->link_config;
449 u16 pll_cfg, pll_sts;
451 u64 uninitialized_var(sig), mask, val;
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);
463 rx_cfg |= PLL_RX_CFG_EQ_LP_ADAPTIVE;
465 if (lp->loopback_mode == LOOPBACK_PHY) {
466 u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS;
468 mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
469 ESR2_TI_PLL_TEST_CFG_L, test_cfg);
471 tx_cfg |= PLL_TX_CFG_ENTEST;
472 rx_cfg |= PLL_RX_CFG_ENTEST;
475 /* Initialize PLL for 1G */
476 pll_cfg = (PLL_CFG_ENPLL | PLL_CFG_MPY_8X);
478 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
479 ESR2_TI_PLL_CFG_L, pll_cfg);
481 dev_err(np->device, PFX "NIU Port %d "
482 "serdes_init_niu_1g_serdes: "
483 "mdio write to ESR2_TI_PLL_CFG_L failed", np->port);
487 pll_sts = PLL_CFG_ENPLL;
489 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
490 ESR2_TI_PLL_STS_L, pll_sts);
492 dev_err(np->device, PFX "NIU Port %d "
493 "serdes_init_niu_1g_serdes: "
494 "mdio write to ESR2_TI_PLL_STS_L failed", np->port);
500 /* Initialize all 4 lanes of the SERDES. */
501 for (i = 0; i < 4; i++) {
502 err = esr2_set_tx_cfg(np, i, tx_cfg);
507 for (i = 0; i < 4; i++) {
508 err = esr2_set_rx_cfg(np, i, rx_cfg);
515 val = (ESR_INT_SRDY0_P0 | ESR_INT_DET0_P0);
520 val = (ESR_INT_SRDY0_P1 | ESR_INT_DET0_P1);
528 while (max_retry--) {
529 sig = nr64(ESR_INT_SIGNALS);
530 if ((sig & mask) == val)
536 if ((sig & mask) != val) {
537 dev_err(np->device, PFX "Port %u signal bits [%08x] are not "
538 "[%08x]\n", np->port, (int) (sig & mask), (int) val);
545 static int serdes_init_niu_10g_serdes(struct niu *np)
547 struct niu_link_config *lp = &np->link_config;
548 u32 tx_cfg, rx_cfg, pll_cfg, pll_sts;
550 u64 uninitialized_var(sig), mask, val;
554 tx_cfg = (PLL_TX_CFG_ENTX | PLL_TX_CFG_SWING_1375MV);
555 rx_cfg = (PLL_RX_CFG_ENRX | PLL_RX_CFG_TERM_0P8VDDT |
556 PLL_RX_CFG_ALIGN_ENA | PLL_RX_CFG_LOS_LTHRESH |
557 PLL_RX_CFG_EQ_LP_ADAPTIVE);
559 if (lp->loopback_mode == LOOPBACK_PHY) {
560 u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS;
562 mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
563 ESR2_TI_PLL_TEST_CFG_L, test_cfg);
565 tx_cfg |= PLL_TX_CFG_ENTEST;
566 rx_cfg |= PLL_RX_CFG_ENTEST;
569 /* Initialize PLL for 10G */
570 pll_cfg = (PLL_CFG_ENPLL | PLL_CFG_MPY_10X);
572 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
573 ESR2_TI_PLL_CFG_L, pll_cfg & 0xffff);
575 dev_err(np->device, PFX "NIU Port %d "
576 "serdes_init_niu_10g_serdes: "
577 "mdio write to ESR2_TI_PLL_CFG_L failed", np->port);
581 pll_sts = PLL_CFG_ENPLL;
583 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
584 ESR2_TI_PLL_STS_L, pll_sts & 0xffff);
586 dev_err(np->device, PFX "NIU Port %d "
587 "serdes_init_niu_10g_serdes: "
588 "mdio write to ESR2_TI_PLL_STS_L failed", np->port);
594 /* Initialize all 4 lanes of the SERDES. */
595 for (i = 0; i < 4; i++) {
596 err = esr2_set_tx_cfg(np, i, tx_cfg);
601 for (i = 0; i < 4; i++) {
602 err = esr2_set_rx_cfg(np, i, rx_cfg);
607 /* check if serdes is ready */
611 mask = ESR_INT_SIGNALS_P0_BITS;
612 val = (ESR_INT_SRDY0_P0 |
622 mask = ESR_INT_SIGNALS_P1_BITS;
623 val = (ESR_INT_SRDY0_P1 |
636 while (max_retry--) {
637 sig = nr64(ESR_INT_SIGNALS);
638 if ((sig & mask) == val)
644 if ((sig & mask) != val) {
645 pr_info(PFX "NIU Port %u signal bits [%08x] are not "
646 "[%08x] for 10G...trying 1G\n",
647 np->port, (int) (sig & mask), (int) val);
649 /* 10G failed, try initializing at 1G */
650 err = serdes_init_niu_1g_serdes(np);
652 np->flags &= ~NIU_FLAGS_10G;
653 np->mac_xcvr = MAC_XCVR_PCS;
655 dev_err(np->device, PFX "Port %u 10G/1G SERDES "
656 "Link Failed \n", np->port);
663 static int esr_read_rxtx_ctrl(struct niu *np, unsigned long chan, u32 *val)
667 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR, ESR_RXTX_CTRL_L(chan));
669 *val = (err & 0xffff);
670 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
671 ESR_RXTX_CTRL_H(chan));
673 *val |= ((err & 0xffff) << 16);
679 static int esr_read_glue0(struct niu *np, unsigned long chan, u32 *val)
683 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
684 ESR_GLUE_CTRL0_L(chan));
686 *val = (err & 0xffff);
687 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
688 ESR_GLUE_CTRL0_H(chan));
690 *val |= ((err & 0xffff) << 16);
697 static int esr_read_reset(struct niu *np, u32 *val)
701 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
702 ESR_RXTX_RESET_CTRL_L);
704 *val = (err & 0xffff);
705 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR,
706 ESR_RXTX_RESET_CTRL_H);
708 *val |= ((err & 0xffff) << 16);
715 static int esr_write_rxtx_ctrl(struct niu *np, unsigned long chan, u32 val)
719 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
720 ESR_RXTX_CTRL_L(chan), val & 0xffff);
722 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
723 ESR_RXTX_CTRL_H(chan), (val >> 16));
727 static int esr_write_glue0(struct niu *np, unsigned long chan, u32 val)
731 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
732 ESR_GLUE_CTRL0_L(chan), val & 0xffff);
734 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
735 ESR_GLUE_CTRL0_H(chan), (val >> 16));
739 static int esr_reset(struct niu *np)
741 u32 uninitialized_var(reset);
744 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
745 ESR_RXTX_RESET_CTRL_L, 0x0000);
748 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
749 ESR_RXTX_RESET_CTRL_H, 0xffff);
754 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
755 ESR_RXTX_RESET_CTRL_L, 0xffff);
760 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR,
761 ESR_RXTX_RESET_CTRL_H, 0x0000);
766 err = esr_read_reset(np, &reset);
770 dev_err(np->device, PFX "Port %u ESR_RESET "
771 "did not clear [%08x]\n",
779 static int serdes_init_10g(struct niu *np)
781 struct niu_link_config *lp = &np->link_config;
782 unsigned long ctrl_reg, test_cfg_reg, i;
783 u64 ctrl_val, test_cfg_val, sig, mask, val;
788 ctrl_reg = ENET_SERDES_0_CTRL_CFG;
789 test_cfg_reg = ENET_SERDES_0_TEST_CFG;
792 ctrl_reg = ENET_SERDES_1_CTRL_CFG;
793 test_cfg_reg = ENET_SERDES_1_TEST_CFG;
799 ctrl_val = (ENET_SERDES_CTRL_SDET_0 |
800 ENET_SERDES_CTRL_SDET_1 |
801 ENET_SERDES_CTRL_SDET_2 |
802 ENET_SERDES_CTRL_SDET_3 |
803 (0x5 << ENET_SERDES_CTRL_EMPH_0_SHIFT) |
804 (0x5 << ENET_SERDES_CTRL_EMPH_1_SHIFT) |
805 (0x5 << ENET_SERDES_CTRL_EMPH_2_SHIFT) |
806 (0x5 << ENET_SERDES_CTRL_EMPH_3_SHIFT) |
807 (0x1 << ENET_SERDES_CTRL_LADJ_0_SHIFT) |
808 (0x1 << ENET_SERDES_CTRL_LADJ_1_SHIFT) |
809 (0x1 << ENET_SERDES_CTRL_LADJ_2_SHIFT) |
810 (0x1 << ENET_SERDES_CTRL_LADJ_3_SHIFT));
813 if (lp->loopback_mode == LOOPBACK_PHY) {
814 test_cfg_val |= ((ENET_TEST_MD_PAD_LOOPBACK <<
815 ENET_SERDES_TEST_MD_0_SHIFT) |
816 (ENET_TEST_MD_PAD_LOOPBACK <<
817 ENET_SERDES_TEST_MD_1_SHIFT) |
818 (ENET_TEST_MD_PAD_LOOPBACK <<
819 ENET_SERDES_TEST_MD_2_SHIFT) |
820 (ENET_TEST_MD_PAD_LOOPBACK <<
821 ENET_SERDES_TEST_MD_3_SHIFT));
824 nw64(ctrl_reg, ctrl_val);
825 nw64(test_cfg_reg, test_cfg_val);
827 /* Initialize all 4 lanes of the SERDES. */
828 for (i = 0; i < 4; i++) {
829 u32 rxtx_ctrl, glue0;
831 err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl);
834 err = esr_read_glue0(np, i, &glue0);
838 rxtx_ctrl &= ~(ESR_RXTX_CTRL_VMUXLO);
839 rxtx_ctrl |= (ESR_RXTX_CTRL_ENSTRETCH |
840 (2 << ESR_RXTX_CTRL_VMUXLO_SHIFT));
842 glue0 &= ~(ESR_GLUE_CTRL0_SRATE |
843 ESR_GLUE_CTRL0_THCNT |
844 ESR_GLUE_CTRL0_BLTIME);
845 glue0 |= (ESR_GLUE_CTRL0_RXLOSENAB |
846 (0xf << ESR_GLUE_CTRL0_SRATE_SHIFT) |
847 (0xff << ESR_GLUE_CTRL0_THCNT_SHIFT) |
848 (BLTIME_300_CYCLES <<
849 ESR_GLUE_CTRL0_BLTIME_SHIFT));
851 err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl);
854 err = esr_write_glue0(np, i, glue0);
863 sig = nr64(ESR_INT_SIGNALS);
866 mask = ESR_INT_SIGNALS_P0_BITS;
867 val = (ESR_INT_SRDY0_P0 |
877 mask = ESR_INT_SIGNALS_P1_BITS;
878 val = (ESR_INT_SRDY0_P1 |
891 if ((sig & mask) != val) {
892 if (np->flags & NIU_FLAGS_HOTPLUG_PHY) {
893 np->flags &= ~NIU_FLAGS_HOTPLUG_PHY_PRESENT;
896 dev_err(np->device, PFX "Port %u signal bits [%08x] are not "
897 "[%08x]\n", np->port, (int) (sig & mask), (int) val);
900 if (np->flags & NIU_FLAGS_HOTPLUG_PHY)
901 np->flags |= NIU_FLAGS_HOTPLUG_PHY_PRESENT;
905 static int serdes_init_1g(struct niu *np)
909 val = nr64(ENET_SERDES_1_PLL_CFG);
910 val &= ~ENET_SERDES_PLL_FBDIV2;
913 val |= ENET_SERDES_PLL_HRATE0;
916 val |= ENET_SERDES_PLL_HRATE1;
919 val |= ENET_SERDES_PLL_HRATE2;
922 val |= ENET_SERDES_PLL_HRATE3;
927 nw64(ENET_SERDES_1_PLL_CFG, val);
932 static int serdes_init_1g_serdes(struct niu *np)
934 struct niu_link_config *lp = &np->link_config;
935 unsigned long ctrl_reg, test_cfg_reg, pll_cfg, i;
936 u64 ctrl_val, test_cfg_val, sig, mask, val;
938 u64 reset_val, val_rd;
940 val = ENET_SERDES_PLL_HRATE0 | ENET_SERDES_PLL_HRATE1 |
941 ENET_SERDES_PLL_HRATE2 | ENET_SERDES_PLL_HRATE3 |
942 ENET_SERDES_PLL_FBDIV0;
945 reset_val = ENET_SERDES_RESET_0;
946 ctrl_reg = ENET_SERDES_0_CTRL_CFG;
947 test_cfg_reg = ENET_SERDES_0_TEST_CFG;
948 pll_cfg = ENET_SERDES_0_PLL_CFG;
951 reset_val = ENET_SERDES_RESET_1;
952 ctrl_reg = ENET_SERDES_1_CTRL_CFG;
953 test_cfg_reg = ENET_SERDES_1_TEST_CFG;
954 pll_cfg = ENET_SERDES_1_PLL_CFG;
960 ctrl_val = (ENET_SERDES_CTRL_SDET_0 |
961 ENET_SERDES_CTRL_SDET_1 |
962 ENET_SERDES_CTRL_SDET_2 |
963 ENET_SERDES_CTRL_SDET_3 |
964 (0x5 << ENET_SERDES_CTRL_EMPH_0_SHIFT) |
965 (0x5 << ENET_SERDES_CTRL_EMPH_1_SHIFT) |
966 (0x5 << ENET_SERDES_CTRL_EMPH_2_SHIFT) |
967 (0x5 << ENET_SERDES_CTRL_EMPH_3_SHIFT) |
968 (0x1 << ENET_SERDES_CTRL_LADJ_0_SHIFT) |
969 (0x1 << ENET_SERDES_CTRL_LADJ_1_SHIFT) |
970 (0x1 << ENET_SERDES_CTRL_LADJ_2_SHIFT) |
971 (0x1 << ENET_SERDES_CTRL_LADJ_3_SHIFT));
974 if (lp->loopback_mode == LOOPBACK_PHY) {
975 test_cfg_val |= ((ENET_TEST_MD_PAD_LOOPBACK <<
976 ENET_SERDES_TEST_MD_0_SHIFT) |
977 (ENET_TEST_MD_PAD_LOOPBACK <<
978 ENET_SERDES_TEST_MD_1_SHIFT) |
979 (ENET_TEST_MD_PAD_LOOPBACK <<
980 ENET_SERDES_TEST_MD_2_SHIFT) |
981 (ENET_TEST_MD_PAD_LOOPBACK <<
982 ENET_SERDES_TEST_MD_3_SHIFT));
985 nw64(ENET_SERDES_RESET, reset_val);
987 val_rd = nr64(ENET_SERDES_RESET);
988 val_rd &= ~reset_val;
990 nw64(ctrl_reg, ctrl_val);
991 nw64(test_cfg_reg, test_cfg_val);
992 nw64(ENET_SERDES_RESET, val_rd);
995 /* Initialize all 4 lanes of the SERDES. */
996 for (i = 0; i < 4; i++) {
997 u32 rxtx_ctrl, glue0;
999 err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl);
1002 err = esr_read_glue0(np, i, &glue0);
1006 rxtx_ctrl &= ~(ESR_RXTX_CTRL_VMUXLO);
1007 rxtx_ctrl |= (ESR_RXTX_CTRL_ENSTRETCH |
1008 (2 << ESR_RXTX_CTRL_VMUXLO_SHIFT));
1010 glue0 &= ~(ESR_GLUE_CTRL0_SRATE |
1011 ESR_GLUE_CTRL0_THCNT |
1012 ESR_GLUE_CTRL0_BLTIME);
1013 glue0 |= (ESR_GLUE_CTRL0_RXLOSENAB |
1014 (0xf << ESR_GLUE_CTRL0_SRATE_SHIFT) |
1015 (0xff << ESR_GLUE_CTRL0_THCNT_SHIFT) |
1016 (BLTIME_300_CYCLES <<
1017 ESR_GLUE_CTRL0_BLTIME_SHIFT));
1019 err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl);
1022 err = esr_write_glue0(np, i, glue0);
1028 sig = nr64(ESR_INT_SIGNALS);
1031 val = (ESR_INT_SRDY0_P0 | ESR_INT_DET0_P0);
1036 val = (ESR_INT_SRDY0_P1 | ESR_INT_DET0_P1);
1044 if ((sig & mask) != val) {
1045 dev_err(np->device, PFX "Port %u signal bits [%08x] are not "
1046 "[%08x]\n", np->port, (int) (sig & mask), (int) val);
1053 static int link_status_1g_serdes(struct niu *np, int *link_up_p)
1055 struct niu_link_config *lp = &np->link_config;
1059 unsigned long flags;
1063 current_speed = SPEED_INVALID;
1064 current_duplex = DUPLEX_INVALID;
1066 spin_lock_irqsave(&np->lock, flags);
1068 val = nr64_pcs(PCS_MII_STAT);
1070 if (val & PCS_MII_STAT_LINK_STATUS) {
1072 current_speed = SPEED_1000;
1073 current_duplex = DUPLEX_FULL;
1076 lp->active_speed = current_speed;
1077 lp->active_duplex = current_duplex;
1078 spin_unlock_irqrestore(&np->lock, flags);
1080 *link_up_p = link_up;
1084 static int link_status_10g_serdes(struct niu *np, int *link_up_p)
1086 unsigned long flags;
1087 struct niu_link_config *lp = &np->link_config;
1094 if (!(np->flags & NIU_FLAGS_10G))
1095 return link_status_1g_serdes(np, link_up_p);
1097 current_speed = SPEED_INVALID;
1098 current_duplex = DUPLEX_INVALID;
1099 spin_lock_irqsave(&np->lock, flags);
1101 val = nr64_xpcs(XPCS_STATUS(0));
1102 val2 = nr64_mac(XMAC_INTER2);
1103 if (val2 & 0x01000000)
1106 if ((val & 0x1000ULL) && link_ok) {
1108 current_speed = SPEED_10000;
1109 current_duplex = DUPLEX_FULL;
1111 lp->active_speed = current_speed;
1112 lp->active_duplex = current_duplex;
1113 spin_unlock_irqrestore(&np->lock, flags);
1114 *link_up_p = link_up;
1118 static int link_status_mii(struct niu *np, int *link_up_p)
1120 struct niu_link_config *lp = &np->link_config;
1122 int bmsr, advert, ctrl1000, stat1000, lpa, bmcr, estatus;
1123 int supported, advertising, active_speed, active_duplex;
1125 err = mii_read(np, np->phy_addr, MII_BMCR);
1126 if (unlikely(err < 0))
1130 err = mii_read(np, np->phy_addr, MII_BMSR);
1131 if (unlikely(err < 0))
1135 err = mii_read(np, np->phy_addr, MII_ADVERTISE);
1136 if (unlikely(err < 0))
1140 err = mii_read(np, np->phy_addr, MII_LPA);
1141 if (unlikely(err < 0))
1145 if (likely(bmsr & BMSR_ESTATEN)) {
1146 err = mii_read(np, np->phy_addr, MII_ESTATUS);
1147 if (unlikely(err < 0))
1151 err = mii_read(np, np->phy_addr, MII_CTRL1000);
1152 if (unlikely(err < 0))
1156 err = mii_read(np, np->phy_addr, MII_STAT1000);
1157 if (unlikely(err < 0))
1161 estatus = ctrl1000 = stat1000 = 0;
1164 if (bmsr & BMSR_ANEGCAPABLE)
1165 supported |= SUPPORTED_Autoneg;
1166 if (bmsr & BMSR_10HALF)
1167 supported |= SUPPORTED_10baseT_Half;
1168 if (bmsr & BMSR_10FULL)
1169 supported |= SUPPORTED_10baseT_Full;
1170 if (bmsr & BMSR_100HALF)
1171 supported |= SUPPORTED_100baseT_Half;
1172 if (bmsr & BMSR_100FULL)
1173 supported |= SUPPORTED_100baseT_Full;
1174 if (estatus & ESTATUS_1000_THALF)
1175 supported |= SUPPORTED_1000baseT_Half;
1176 if (estatus & ESTATUS_1000_TFULL)
1177 supported |= SUPPORTED_1000baseT_Full;
1178 lp->supported = supported;
1181 if (advert & ADVERTISE_10HALF)
1182 advertising |= ADVERTISED_10baseT_Half;
1183 if (advert & ADVERTISE_10FULL)
1184 advertising |= ADVERTISED_10baseT_Full;
1185 if (advert & ADVERTISE_100HALF)
1186 advertising |= ADVERTISED_100baseT_Half;
1187 if (advert & ADVERTISE_100FULL)
1188 advertising |= ADVERTISED_100baseT_Full;
1189 if (ctrl1000 & ADVERTISE_1000HALF)
1190 advertising |= ADVERTISED_1000baseT_Half;
1191 if (ctrl1000 & ADVERTISE_1000FULL)
1192 advertising |= ADVERTISED_1000baseT_Full;
1194 if (bmcr & BMCR_ANENABLE) {
1197 lp->active_autoneg = 1;
1198 advertising |= ADVERTISED_Autoneg;
1201 neg1000 = (ctrl1000 << 2) & stat1000;
1203 if (neg1000 & (LPA_1000FULL | LPA_1000HALF))
1204 active_speed = SPEED_1000;
1205 else if (neg & LPA_100)
1206 active_speed = SPEED_100;
1207 else if (neg & (LPA_10HALF | LPA_10FULL))
1208 active_speed = SPEED_10;
1210 active_speed = SPEED_INVALID;
1212 if ((neg1000 & LPA_1000FULL) || (neg & LPA_DUPLEX))
1213 active_duplex = DUPLEX_FULL;
1214 else if (active_speed != SPEED_INVALID)
1215 active_duplex = DUPLEX_HALF;
1217 active_duplex = DUPLEX_INVALID;
1219 lp->active_autoneg = 0;
1221 if ((bmcr & BMCR_SPEED1000) && !(bmcr & BMCR_SPEED100))
1222 active_speed = SPEED_1000;
1223 else if (bmcr & BMCR_SPEED100)
1224 active_speed = SPEED_100;
1226 active_speed = SPEED_10;
1228 if (bmcr & BMCR_FULLDPLX)
1229 active_duplex = DUPLEX_FULL;
1231 active_duplex = DUPLEX_HALF;
1234 lp->active_advertising = advertising;
1235 lp->active_speed = active_speed;
1236 lp->active_duplex = active_duplex;
1237 *link_up_p = !!(bmsr & BMSR_LSTATUS);
1242 static int link_status_1g_rgmii(struct niu *np, int *link_up_p)
1244 struct niu_link_config *lp = &np->link_config;
1245 u16 current_speed, bmsr;
1246 unsigned long flags;
1251 current_speed = SPEED_INVALID;
1252 current_duplex = DUPLEX_INVALID;
1254 spin_lock_irqsave(&np->lock, flags);
1258 err = mii_read(np, np->phy_addr, MII_BMSR);
1263 if (bmsr & BMSR_LSTATUS) {
1264 u16 adv, lpa, common, estat;
1266 err = mii_read(np, np->phy_addr, MII_ADVERTISE);
1271 err = mii_read(np, np->phy_addr, MII_LPA);
1278 err = mii_read(np, np->phy_addr, MII_ESTATUS);
1283 current_speed = SPEED_1000;
1284 current_duplex = DUPLEX_FULL;
1287 lp->active_speed = current_speed;
1288 lp->active_duplex = current_duplex;
1292 spin_unlock_irqrestore(&np->lock, flags);
1294 *link_up_p = link_up;
1298 static int link_status_1g(struct niu *np, int *link_up_p)
1300 struct niu_link_config *lp = &np->link_config;
1301 unsigned long flags;
1304 spin_lock_irqsave(&np->lock, flags);
1306 err = link_status_mii(np, link_up_p);
1307 lp->supported |= SUPPORTED_TP;
1308 lp->active_advertising |= ADVERTISED_TP;
1310 spin_unlock_irqrestore(&np->lock, flags);
1314 static int bcm8704_reset(struct niu *np)
1318 err = mdio_read(np, np->phy_addr,
1319 BCM8704_PHYXS_DEV_ADDR, MII_BMCR);
1323 err = mdio_write(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR,
1329 while (--limit >= 0) {
1330 err = mdio_read(np, np->phy_addr,
1331 BCM8704_PHYXS_DEV_ADDR, MII_BMCR);
1334 if (!(err & BMCR_RESET))
1338 dev_err(np->device, PFX "Port %u PHY will not reset "
1339 "(bmcr=%04x)\n", np->port, (err & 0xffff));
1345 /* When written, certain PHY registers need to be read back twice
1346 * in order for the bits to settle properly.
1348 static int bcm8704_user_dev3_readback(struct niu *np, int reg)
1350 int err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, reg);
1353 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, reg);
1359 static int bcm8706_init_user_dev3(struct niu *np)
1364 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
1365 BCM8704_USER_OPT_DIGITAL_CTRL);
1368 err &= ~USER_ODIG_CTRL_GPIOS;
1369 err |= (0x3 << USER_ODIG_CTRL_GPIOS_SHIFT);
1370 err |= USER_ODIG_CTRL_RESV2;
1371 err = mdio_write(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
1372 BCM8704_USER_OPT_DIGITAL_CTRL, err);
1381 static int bcm8704_init_user_dev3(struct niu *np)
1385 err = mdio_write(np, np->phy_addr,
1386 BCM8704_USER_DEV3_ADDR, BCM8704_USER_CONTROL,
1387 (USER_CONTROL_OPTXRST_LVL |
1388 USER_CONTROL_OPBIASFLT_LVL |
1389 USER_CONTROL_OBTMPFLT_LVL |
1390 USER_CONTROL_OPPRFLT_LVL |
1391 USER_CONTROL_OPTXFLT_LVL |
1392 USER_CONTROL_OPRXLOS_LVL |
1393 USER_CONTROL_OPRXFLT_LVL |
1394 USER_CONTROL_OPTXON_LVL |
1395 (0x3f << USER_CONTROL_RES1_SHIFT)));
1399 err = mdio_write(np, np->phy_addr,
1400 BCM8704_USER_DEV3_ADDR, BCM8704_USER_PMD_TX_CONTROL,
1401 (USER_PMD_TX_CTL_XFP_CLKEN |
1402 (1 << USER_PMD_TX_CTL_TX_DAC_TXD_SH) |
1403 (2 << USER_PMD_TX_CTL_TX_DAC_TXCK_SH) |
1404 USER_PMD_TX_CTL_TSCK_LPWREN));
1408 err = bcm8704_user_dev3_readback(np, BCM8704_USER_CONTROL);
1411 err = bcm8704_user_dev3_readback(np, BCM8704_USER_PMD_TX_CONTROL);
1415 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
1416 BCM8704_USER_OPT_DIGITAL_CTRL);
1419 err &= ~USER_ODIG_CTRL_GPIOS;
1420 err |= (0x3 << USER_ODIG_CTRL_GPIOS_SHIFT);
1421 err = mdio_write(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
1422 BCM8704_USER_OPT_DIGITAL_CTRL, err);
1431 static int mrvl88x2011_act_led(struct niu *np, int val)
1435 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
1436 MRVL88X2011_LED_8_TO_11_CTL);
1440 err &= ~MRVL88X2011_LED(MRVL88X2011_LED_ACT,MRVL88X2011_LED_CTL_MASK);
1441 err |= MRVL88X2011_LED(MRVL88X2011_LED_ACT,val);
1443 return mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
1444 MRVL88X2011_LED_8_TO_11_CTL, err);
1447 static int mrvl88x2011_led_blink_rate(struct niu *np, int rate)
1451 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
1452 MRVL88X2011_LED_BLINK_CTL);
1454 err &= ~MRVL88X2011_LED_BLKRATE_MASK;
1457 err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR,
1458 MRVL88X2011_LED_BLINK_CTL, err);
1464 static int xcvr_init_10g_mrvl88x2011(struct niu *np)
1468 /* Set LED functions */
1469 err = mrvl88x2011_led_blink_rate(np, MRVL88X2011_LED_BLKRATE_134MS);
1474 err = mrvl88x2011_act_led(np, MRVL88X2011_LED_CTL_OFF);
1478 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
1479 MRVL88X2011_GENERAL_CTL);
1483 err |= MRVL88X2011_ENA_XFPREFCLK;
1485 err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
1486 MRVL88X2011_GENERAL_CTL, err);
1490 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
1491 MRVL88X2011_PMA_PMD_CTL_1);
1495 if (np->link_config.loopback_mode == LOOPBACK_MAC)
1496 err |= MRVL88X2011_LOOPBACK;
1498 err &= ~MRVL88X2011_LOOPBACK;
1500 err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
1501 MRVL88X2011_PMA_PMD_CTL_1, err);
1506 return mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
1507 MRVL88X2011_10G_PMD_TX_DIS, MRVL88X2011_ENA_PMDTX);
1511 static int xcvr_diag_bcm870x(struct niu *np)
1513 u16 analog_stat0, tx_alarm_status;
1517 err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR,
1521 pr_info(PFX "Port %u PMA_PMD(MII_STAT1000) [%04x]\n",
1524 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, 0x20);
1527 pr_info(PFX "Port %u USER_DEV3(0x20) [%04x]\n",
1530 err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR,
1534 pr_info(PFX "Port %u PHYXS(MII_NWAYTEST) [%04x]\n",
1538 /* XXX dig this out it might not be so useful XXX */
1539 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
1540 BCM8704_USER_ANALOG_STATUS0);
1543 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
1544 BCM8704_USER_ANALOG_STATUS0);
1549 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
1550 BCM8704_USER_TX_ALARM_STATUS);
1553 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR,
1554 BCM8704_USER_TX_ALARM_STATUS);
1557 tx_alarm_status = err;
1559 if (analog_stat0 != 0x03fc) {
1560 if ((analog_stat0 == 0x43bc) && (tx_alarm_status != 0)) {
1561 pr_info(PFX "Port %u cable not connected "
1562 "or bad cable.\n", np->port);
1563 } else if (analog_stat0 == 0x639c) {
1564 pr_info(PFX "Port %u optical module is bad "
1565 "or missing.\n", np->port);
1572 static int xcvr_10g_set_lb_bcm870x(struct niu *np)
1574 struct niu_link_config *lp = &np->link_config;
1577 err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR,
1582 err &= ~BMCR_LOOPBACK;
1584 if (lp->loopback_mode == LOOPBACK_MAC)
1585 err |= BMCR_LOOPBACK;
1587 err = mdio_write(np, np->phy_addr, BCM8704_PCS_DEV_ADDR,
1595 static int xcvr_init_10g_bcm8706(struct niu *np)
1600 if ((np->flags & NIU_FLAGS_HOTPLUG_PHY) &&
1601 (np->flags & NIU_FLAGS_HOTPLUG_PHY_PRESENT) == 0)
1604 val = nr64_mac(XMAC_CONFIG);
1605 val &= ~XMAC_CONFIG_LED_POLARITY;
1606 val |= XMAC_CONFIG_FORCE_LED_ON;
1607 nw64_mac(XMAC_CONFIG, val);
1609 val = nr64(MIF_CONFIG);
1610 val |= MIF_CONFIG_INDIRECT_MODE;
1611 nw64(MIF_CONFIG, val);
1613 err = bcm8704_reset(np);
1617 err = xcvr_10g_set_lb_bcm870x(np);
1621 err = bcm8706_init_user_dev3(np);
1625 err = xcvr_diag_bcm870x(np);
1632 static int xcvr_init_10g_bcm8704(struct niu *np)
1636 err = bcm8704_reset(np);
1640 err = bcm8704_init_user_dev3(np);
1644 err = xcvr_10g_set_lb_bcm870x(np);
1648 err = xcvr_diag_bcm870x(np);
1655 static int xcvr_init_10g(struct niu *np)
1660 val = nr64_mac(XMAC_CONFIG);
1661 val &= ~XMAC_CONFIG_LED_POLARITY;
1662 val |= XMAC_CONFIG_FORCE_LED_ON;
1663 nw64_mac(XMAC_CONFIG, val);
1665 /* XXX shared resource, lock parent XXX */
1666 val = nr64(MIF_CONFIG);
1667 val |= MIF_CONFIG_INDIRECT_MODE;
1668 nw64(MIF_CONFIG, val);
1670 phy_id = phy_decode(np->parent->port_phy, np->port);
1671 phy_id = np->parent->phy_probe_info.phy_id[phy_id][np->port];
1673 /* handle different phy types */
1674 switch (phy_id & NIU_PHY_ID_MASK) {
1675 case NIU_PHY_ID_MRVL88X2011:
1676 err = xcvr_init_10g_mrvl88x2011(np);
1679 default: /* bcom 8704 */
1680 err = xcvr_init_10g_bcm8704(np);
1687 static int mii_reset(struct niu *np)
1691 err = mii_write(np, np->phy_addr, MII_BMCR, BMCR_RESET);
1696 while (--limit >= 0) {
1698 err = mii_read(np, np->phy_addr, MII_BMCR);
1701 if (!(err & BMCR_RESET))
1705 dev_err(np->device, PFX "Port %u MII would not reset, "
1706 "bmcr[%04x]\n", np->port, err);
1713 static int xcvr_init_1g_rgmii(struct niu *np)
1717 u16 bmcr, bmsr, estat;
1719 val = nr64(MIF_CONFIG);
1720 val &= ~MIF_CONFIG_INDIRECT_MODE;
1721 nw64(MIF_CONFIG, val);
1723 err = mii_reset(np);
1727 err = mii_read(np, np->phy_addr, MII_BMSR);
1733 if (bmsr & BMSR_ESTATEN) {
1734 err = mii_read(np, np->phy_addr, MII_ESTATUS);
1741 err = mii_write(np, np->phy_addr, MII_BMCR, bmcr);
1745 if (bmsr & BMSR_ESTATEN) {
1748 if (estat & ESTATUS_1000_TFULL)
1749 ctrl1000 |= ADVERTISE_1000FULL;
1750 err = mii_write(np, np->phy_addr, MII_CTRL1000, ctrl1000);
1755 bmcr = (BMCR_SPEED1000 | BMCR_FULLDPLX);
1757 err = mii_write(np, np->phy_addr, MII_BMCR, bmcr);
1761 err = mii_read(np, np->phy_addr, MII_BMCR);
1764 bmcr = mii_read(np, np->phy_addr, MII_BMCR);
1766 err = mii_read(np, np->phy_addr, MII_BMSR);
1773 static int mii_init_common(struct niu *np)
1775 struct niu_link_config *lp = &np->link_config;
1776 u16 bmcr, bmsr, adv, estat;
1779 err = mii_reset(np);
1783 err = mii_read(np, np->phy_addr, MII_BMSR);
1789 if (bmsr & BMSR_ESTATEN) {
1790 err = mii_read(np, np->phy_addr, MII_ESTATUS);
1797 err = mii_write(np, np->phy_addr, MII_BMCR, bmcr);
1801 if (lp->loopback_mode == LOOPBACK_MAC) {
1802 bmcr |= BMCR_LOOPBACK;
1803 if (lp->active_speed == SPEED_1000)
1804 bmcr |= BMCR_SPEED1000;
1805 if (lp->active_duplex == DUPLEX_FULL)
1806 bmcr |= BMCR_FULLDPLX;
1809 if (lp->loopback_mode == LOOPBACK_PHY) {
1812 aux = (BCM5464R_AUX_CTL_EXT_LB |
1813 BCM5464R_AUX_CTL_WRITE_1);
1814 err = mii_write(np, np->phy_addr, BCM5464R_AUX_CTL, aux);
1822 adv = ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP;
1823 if ((bmsr & BMSR_10HALF) &&
1824 (lp->advertising & ADVERTISED_10baseT_Half))
1825 adv |= ADVERTISE_10HALF;
1826 if ((bmsr & BMSR_10FULL) &&
1827 (lp->advertising & ADVERTISED_10baseT_Full))
1828 adv |= ADVERTISE_10FULL;
1829 if ((bmsr & BMSR_100HALF) &&
1830 (lp->advertising & ADVERTISED_100baseT_Half))
1831 adv |= ADVERTISE_100HALF;
1832 if ((bmsr & BMSR_100FULL) &&
1833 (lp->advertising & ADVERTISED_100baseT_Full))
1834 adv |= ADVERTISE_100FULL;
1835 err = mii_write(np, np->phy_addr, MII_ADVERTISE, adv);
1839 if (likely(bmsr & BMSR_ESTATEN)) {
1841 if ((estat & ESTATUS_1000_THALF) &&
1842 (lp->advertising & ADVERTISED_1000baseT_Half))
1843 ctrl1000 |= ADVERTISE_1000HALF;
1844 if ((estat & ESTATUS_1000_TFULL) &&
1845 (lp->advertising & ADVERTISED_1000baseT_Full))
1846 ctrl1000 |= ADVERTISE_1000FULL;
1847 err = mii_write(np, np->phy_addr,
1848 MII_CTRL1000, ctrl1000);
1853 bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART);
1858 if (lp->duplex == DUPLEX_FULL) {
1859 bmcr |= BMCR_FULLDPLX;
1861 } else if (lp->duplex == DUPLEX_HALF)
1866 if (lp->speed == SPEED_1000) {
1867 /* if X-full requested while not supported, or
1868 X-half requested while not supported... */
1869 if ((fulldpx && !(estat & ESTATUS_1000_TFULL)) ||
1870 (!fulldpx && !(estat & ESTATUS_1000_THALF)))
1872 bmcr |= BMCR_SPEED1000;
1873 } else if (lp->speed == SPEED_100) {
1874 if ((fulldpx && !(bmsr & BMSR_100FULL)) ||
1875 (!fulldpx && !(bmsr & BMSR_100HALF)))
1877 bmcr |= BMCR_SPEED100;
1878 } else if (lp->speed == SPEED_10) {
1879 if ((fulldpx && !(bmsr & BMSR_10FULL)) ||
1880 (!fulldpx && !(bmsr & BMSR_10HALF)))
1886 err = mii_write(np, np->phy_addr, MII_BMCR, bmcr);
1891 err = mii_read(np, np->phy_addr, MII_BMCR);
1896 err = mii_read(np, np->phy_addr, MII_BMSR);
1901 pr_info(PFX "Port %u after MII init bmcr[%04x] bmsr[%04x]\n",
1902 np->port, bmcr, bmsr);
1908 static int xcvr_init_1g(struct niu *np)
1912 /* XXX shared resource, lock parent XXX */
1913 val = nr64(MIF_CONFIG);
1914 val &= ~MIF_CONFIG_INDIRECT_MODE;
1915 nw64(MIF_CONFIG, val);
1917 return mii_init_common(np);
1920 static int niu_xcvr_init(struct niu *np)
1922 const struct niu_phy_ops *ops = np->phy_ops;
1927 err = ops->xcvr_init(np);
1932 static int niu_serdes_init(struct niu *np)
1934 const struct niu_phy_ops *ops = np->phy_ops;
1938 if (ops->serdes_init)
1939 err = ops->serdes_init(np);
1944 static void niu_init_xif(struct niu *);
1945 static void niu_handle_led(struct niu *, int status);
1947 static int niu_link_status_common(struct niu *np, int link_up)
1949 struct niu_link_config *lp = &np->link_config;
1950 struct net_device *dev = np->dev;
1951 unsigned long flags;
1953 if (!netif_carrier_ok(dev) && link_up) {
1954 niuinfo(LINK, "%s: Link is up at %s, %s duplex\n",
1956 (lp->active_speed == SPEED_10000 ?
1958 (lp->active_speed == SPEED_1000 ?
1960 (lp->active_speed == SPEED_100 ?
1961 "100Mbit/sec" : "10Mbit/sec"))),
1962 (lp->active_duplex == DUPLEX_FULL ?
1965 spin_lock_irqsave(&np->lock, flags);
1967 niu_handle_led(np, 1);
1968 spin_unlock_irqrestore(&np->lock, flags);
1970 netif_carrier_on(dev);
1971 } else if (netif_carrier_ok(dev) && !link_up) {
1972 niuwarn(LINK, "%s: Link is down\n", dev->name);
1973 spin_lock_irqsave(&np->lock, flags);
1974 niu_handle_led(np, 0);
1975 spin_unlock_irqrestore(&np->lock, flags);
1976 netif_carrier_off(dev);
1982 static int link_status_10g_mrvl(struct niu *np, int *link_up_p)
1984 int err, link_up, pma_status, pcs_status;
1988 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
1989 MRVL88X2011_10G_PMD_STATUS_2);
1993 /* Check PMA/PMD Register: 1.0001.2 == 1 */
1994 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR,
1995 MRVL88X2011_PMA_PMD_STATUS_1);
1999 pma_status = ((err & MRVL88X2011_LNK_STATUS_OK) ? 1 : 0);
2001 /* Check PMC Register : 3.0001.2 == 1: read twice */
2002 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
2003 MRVL88X2011_PMA_PMD_STATUS_1);
2007 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR,
2008 MRVL88X2011_PMA_PMD_STATUS_1);
2012 pcs_status = ((err & MRVL88X2011_LNK_STATUS_OK) ? 1 : 0);
2014 /* Check XGXS Register : 4.0018.[0-3,12] */
2015 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV4_ADDR,
2016 MRVL88X2011_10G_XGXS_LANE_STAT);
2020 if (err == (PHYXS_XGXS_LANE_STAT_ALINGED | PHYXS_XGXS_LANE_STAT_LANE3 |
2021 PHYXS_XGXS_LANE_STAT_LANE2 | PHYXS_XGXS_LANE_STAT_LANE1 |
2022 PHYXS_XGXS_LANE_STAT_LANE0 | PHYXS_XGXS_LANE_STAT_MAGIC |
2024 link_up = (pma_status && pcs_status) ? 1 : 0;
2026 np->link_config.active_speed = SPEED_10000;
2027 np->link_config.active_duplex = DUPLEX_FULL;
2030 mrvl88x2011_act_led(np, (link_up ?
2031 MRVL88X2011_LED_CTL_PCS_ACT :
2032 MRVL88X2011_LED_CTL_OFF));
2034 *link_up_p = link_up;
2038 static int link_status_10g_bcm8706(struct niu *np, int *link_up_p)
2043 err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR,
2044 BCM8704_PMD_RCV_SIGDET);
2047 if (!(err & PMD_RCV_SIGDET_GLOBAL)) {
2052 err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR,
2053 BCM8704_PCS_10G_R_STATUS);
2057 if (!(err & PCS_10G_R_STATUS_BLK_LOCK)) {
2062 err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR,
2063 BCM8704_PHYXS_XGXS_LANE_STAT);
2066 if (err != (PHYXS_XGXS_LANE_STAT_ALINGED |
2067 PHYXS_XGXS_LANE_STAT_MAGIC |
2068 PHYXS_XGXS_LANE_STAT_PATTEST |
2069 PHYXS_XGXS_LANE_STAT_LANE3 |
2070 PHYXS_XGXS_LANE_STAT_LANE2 |
2071 PHYXS_XGXS_LANE_STAT_LANE1 |
2072 PHYXS_XGXS_LANE_STAT_LANE0)) {
2074 np->link_config.active_speed = SPEED_INVALID;
2075 np->link_config.active_duplex = DUPLEX_INVALID;
2080 np->link_config.active_speed = SPEED_10000;
2081 np->link_config.active_duplex = DUPLEX_FULL;
2085 *link_up_p = link_up;
2086 if (np->flags & NIU_FLAGS_HOTPLUG_PHY)
2091 static int link_status_10g_bcom(struct niu *np, int *link_up_p)
2097 err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR,
2098 BCM8704_PMD_RCV_SIGDET);
2101 if (!(err & PMD_RCV_SIGDET_GLOBAL)) {
2106 err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR,
2107 BCM8704_PCS_10G_R_STATUS);
2110 if (!(err & PCS_10G_R_STATUS_BLK_LOCK)) {
2115 err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR,
2116 BCM8704_PHYXS_XGXS_LANE_STAT);
2120 if (err != (PHYXS_XGXS_LANE_STAT_ALINGED |
2121 PHYXS_XGXS_LANE_STAT_MAGIC |
2122 PHYXS_XGXS_LANE_STAT_LANE3 |
2123 PHYXS_XGXS_LANE_STAT_LANE2 |
2124 PHYXS_XGXS_LANE_STAT_LANE1 |
2125 PHYXS_XGXS_LANE_STAT_LANE0)) {
2131 np->link_config.active_speed = SPEED_10000;
2132 np->link_config.active_duplex = DUPLEX_FULL;
2136 *link_up_p = link_up;
2140 static int link_status_10g(struct niu *np, int *link_up_p)
2142 unsigned long flags;
2145 spin_lock_irqsave(&np->lock, flags);
2147 if (np->link_config.loopback_mode == LOOPBACK_DISABLED) {
2150 phy_id = phy_decode(np->parent->port_phy, np->port);
2151 phy_id = np->parent->phy_probe_info.phy_id[phy_id][np->port];
2153 /* handle different phy types */
2154 switch (phy_id & NIU_PHY_ID_MASK) {
2155 case NIU_PHY_ID_MRVL88X2011:
2156 err = link_status_10g_mrvl(np, link_up_p);
2159 default: /* bcom 8704 */
2160 err = link_status_10g_bcom(np, link_up_p);
2165 spin_unlock_irqrestore(&np->lock, flags);
2170 static int niu_10g_phy_present(struct niu *np)
2174 sig = nr64(ESR_INT_SIGNALS);
2177 mask = ESR_INT_SIGNALS_P0_BITS;
2178 val = (ESR_INT_SRDY0_P0 |
2181 ESR_INT_XDP_P0_CH3 |
2182 ESR_INT_XDP_P0_CH2 |
2183 ESR_INT_XDP_P0_CH1 |
2184 ESR_INT_XDP_P0_CH0);
2188 mask = ESR_INT_SIGNALS_P1_BITS;
2189 val = (ESR_INT_SRDY0_P1 |
2192 ESR_INT_XDP_P1_CH3 |
2193 ESR_INT_XDP_P1_CH2 |
2194 ESR_INT_XDP_P1_CH1 |
2195 ESR_INT_XDP_P1_CH0);
2202 if ((sig & mask) != val)
2207 static int link_status_10g_hotplug(struct niu *np, int *link_up_p)
2209 unsigned long flags;
2212 int phy_present_prev;
2214 spin_lock_irqsave(&np->lock, flags);
2216 if (np->link_config.loopback_mode == LOOPBACK_DISABLED) {
2217 phy_present_prev = (np->flags & NIU_FLAGS_HOTPLUG_PHY_PRESENT) ?
2219 phy_present = niu_10g_phy_present(np);
2220 if (phy_present != phy_present_prev) {
2223 np->flags |= NIU_FLAGS_HOTPLUG_PHY_PRESENT;
2224 if (np->phy_ops->xcvr_init)
2225 err = np->phy_ops->xcvr_init(np);
2228 np->flags &= ~NIU_FLAGS_HOTPLUG_PHY_PRESENT;
2231 np->flags &= ~NIU_FLAGS_HOTPLUG_PHY_PRESENT;
2233 niuwarn(LINK, "%s: Hotplug PHY Removed\n",
2237 if (np->flags & NIU_FLAGS_HOTPLUG_PHY_PRESENT)
2238 err = link_status_10g_bcm8706(np, link_up_p);
2241 spin_unlock_irqrestore(&np->lock, flags);
2246 static int niu_link_status(struct niu *np, int *link_up_p)
2248 const struct niu_phy_ops *ops = np->phy_ops;
2252 if (ops->link_status)
2253 err = ops->link_status(np, link_up_p);
2258 static void niu_timer(unsigned long __opaque)
2260 struct niu *np = (struct niu *) __opaque;
2264 err = niu_link_status(np, &link_up);
2266 niu_link_status_common(np, link_up);
2268 if (netif_carrier_ok(np->dev))
2272 np->timer.expires = jiffies + off;
2274 add_timer(&np->timer);
2277 static const struct niu_phy_ops phy_ops_10g_serdes = {
2278 .serdes_init = serdes_init_10g_serdes,
2279 .link_status = link_status_10g_serdes,
2282 static const struct niu_phy_ops phy_ops_10g_serdes_niu = {
2283 .serdes_init = serdes_init_niu_10g_serdes,
2284 .link_status = link_status_10g_serdes,
2287 static const struct niu_phy_ops phy_ops_1g_serdes_niu = {
2288 .serdes_init = serdes_init_niu_1g_serdes,
2289 .link_status = link_status_1g_serdes,
2292 static const struct niu_phy_ops phy_ops_1g_rgmii = {
2293 .xcvr_init = xcvr_init_1g_rgmii,
2294 .link_status = link_status_1g_rgmii,
2297 static const struct niu_phy_ops phy_ops_10g_fiber_niu = {
2298 .serdes_init = serdes_init_niu_10g_fiber,
2299 .xcvr_init = xcvr_init_10g,
2300 .link_status = link_status_10g,
2303 static const struct niu_phy_ops phy_ops_10g_fiber = {
2304 .serdes_init = serdes_init_10g,
2305 .xcvr_init = xcvr_init_10g,
2306 .link_status = link_status_10g,
2309 static const struct niu_phy_ops phy_ops_10g_fiber_hotplug = {
2310 .serdes_init = serdes_init_10g,
2311 .xcvr_init = xcvr_init_10g_bcm8706,
2312 .link_status = link_status_10g_hotplug,
2315 static const struct niu_phy_ops phy_ops_10g_copper = {
2316 .serdes_init = serdes_init_10g,
2317 .link_status = link_status_10g, /* XXX */
2320 static const struct niu_phy_ops phy_ops_1g_fiber = {
2321 .serdes_init = serdes_init_1g,
2322 .xcvr_init = xcvr_init_1g,
2323 .link_status = link_status_1g,
2326 static const struct niu_phy_ops phy_ops_1g_copper = {
2327 .xcvr_init = xcvr_init_1g,
2328 .link_status = link_status_1g,
2331 struct niu_phy_template {
2332 const struct niu_phy_ops *ops;
2336 static const struct niu_phy_template phy_template_niu_10g_fiber = {
2337 .ops = &phy_ops_10g_fiber_niu,
2338 .phy_addr_base = 16,
2341 static const struct niu_phy_template phy_template_niu_10g_serdes = {
2342 .ops = &phy_ops_10g_serdes_niu,
2346 static const struct niu_phy_template phy_template_niu_1g_serdes = {
2347 .ops = &phy_ops_1g_serdes_niu,
2351 static const struct niu_phy_template phy_template_10g_fiber = {
2352 .ops = &phy_ops_10g_fiber,
2356 static const struct niu_phy_template phy_template_10g_fiber_hotplug = {
2357 .ops = &phy_ops_10g_fiber_hotplug,
2361 static const struct niu_phy_template phy_template_10g_copper = {
2362 .ops = &phy_ops_10g_copper,
2363 .phy_addr_base = 10,
2366 static const struct niu_phy_template phy_template_1g_fiber = {
2367 .ops = &phy_ops_1g_fiber,
2371 static const struct niu_phy_template phy_template_1g_copper = {
2372 .ops = &phy_ops_1g_copper,
2376 static const struct niu_phy_template phy_template_1g_rgmii = {
2377 .ops = &phy_ops_1g_rgmii,
2381 static const struct niu_phy_template phy_template_10g_serdes = {
2382 .ops = &phy_ops_10g_serdes,
2386 static int niu_atca_port_num[4] = {
2390 static int serdes_init_10g_serdes(struct niu *np)
2392 struct niu_link_config *lp = &np->link_config;
2393 unsigned long ctrl_reg, test_cfg_reg, pll_cfg, i;
2394 u64 ctrl_val, test_cfg_val, sig, mask, val;
2399 reset_val = ENET_SERDES_RESET_0;
2400 ctrl_reg = ENET_SERDES_0_CTRL_CFG;
2401 test_cfg_reg = ENET_SERDES_0_TEST_CFG;
2402 pll_cfg = ENET_SERDES_0_PLL_CFG;
2405 reset_val = ENET_SERDES_RESET_1;
2406 ctrl_reg = ENET_SERDES_1_CTRL_CFG;
2407 test_cfg_reg = ENET_SERDES_1_TEST_CFG;
2408 pll_cfg = ENET_SERDES_1_PLL_CFG;
2414 ctrl_val = (ENET_SERDES_CTRL_SDET_0 |
2415 ENET_SERDES_CTRL_SDET_1 |
2416 ENET_SERDES_CTRL_SDET_2 |
2417 ENET_SERDES_CTRL_SDET_3 |
2418 (0x5 << ENET_SERDES_CTRL_EMPH_0_SHIFT) |
2419 (0x5 << ENET_SERDES_CTRL_EMPH_1_SHIFT) |
2420 (0x5 << ENET_SERDES_CTRL_EMPH_2_SHIFT) |
2421 (0x5 << ENET_SERDES_CTRL_EMPH_3_SHIFT) |
2422 (0x1 << ENET_SERDES_CTRL_LADJ_0_SHIFT) |
2423 (0x1 << ENET_SERDES_CTRL_LADJ_1_SHIFT) |
2424 (0x1 << ENET_SERDES_CTRL_LADJ_2_SHIFT) |
2425 (0x1 << ENET_SERDES_CTRL_LADJ_3_SHIFT));
2428 if (lp->loopback_mode == LOOPBACK_PHY) {
2429 test_cfg_val |= ((ENET_TEST_MD_PAD_LOOPBACK <<
2430 ENET_SERDES_TEST_MD_0_SHIFT) |
2431 (ENET_TEST_MD_PAD_LOOPBACK <<
2432 ENET_SERDES_TEST_MD_1_SHIFT) |
2433 (ENET_TEST_MD_PAD_LOOPBACK <<
2434 ENET_SERDES_TEST_MD_2_SHIFT) |
2435 (ENET_TEST_MD_PAD_LOOPBACK <<
2436 ENET_SERDES_TEST_MD_3_SHIFT));
2440 nw64(pll_cfg, ENET_SERDES_PLL_FBDIV2);
2441 nw64(ctrl_reg, ctrl_val);
2442 nw64(test_cfg_reg, test_cfg_val);
2444 /* Initialize all 4 lanes of the SERDES. */
2445 for (i = 0; i < 4; i++) {
2446 u32 rxtx_ctrl, glue0;
2449 err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl);
2452 err = esr_read_glue0(np, i, &glue0);
2456 rxtx_ctrl &= ~(ESR_RXTX_CTRL_VMUXLO);
2457 rxtx_ctrl |= (ESR_RXTX_CTRL_ENSTRETCH |
2458 (2 << ESR_RXTX_CTRL_VMUXLO_SHIFT));
2460 glue0 &= ~(ESR_GLUE_CTRL0_SRATE |
2461 ESR_GLUE_CTRL0_THCNT |
2462 ESR_GLUE_CTRL0_BLTIME);
2463 glue0 |= (ESR_GLUE_CTRL0_RXLOSENAB |
2464 (0xf << ESR_GLUE_CTRL0_SRATE_SHIFT) |
2465 (0xff << ESR_GLUE_CTRL0_THCNT_SHIFT) |
2466 (BLTIME_300_CYCLES <<
2467 ESR_GLUE_CTRL0_BLTIME_SHIFT));
2469 err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl);
2472 err = esr_write_glue0(np, i, glue0);
2478 sig = nr64(ESR_INT_SIGNALS);
2481 mask = ESR_INT_SIGNALS_P0_BITS;
2482 val = (ESR_INT_SRDY0_P0 |
2485 ESR_INT_XDP_P0_CH3 |
2486 ESR_INT_XDP_P0_CH2 |
2487 ESR_INT_XDP_P0_CH1 |
2488 ESR_INT_XDP_P0_CH0);
2492 mask = ESR_INT_SIGNALS_P1_BITS;
2493 val = (ESR_INT_SRDY0_P1 |
2496 ESR_INT_XDP_P1_CH3 |
2497 ESR_INT_XDP_P1_CH2 |
2498 ESR_INT_XDP_P1_CH1 |
2499 ESR_INT_XDP_P1_CH0);
2506 if ((sig & mask) != val) {
2508 err = serdes_init_1g_serdes(np);
2510 np->flags &= ~NIU_FLAGS_10G;
2511 np->mac_xcvr = MAC_XCVR_PCS;
2513 dev_err(np->device, PFX "Port %u 10G/1G SERDES Link Failed \n",
2522 static int niu_determine_phy_disposition(struct niu *np)
2524 struct niu_parent *parent = np->parent;
2525 u8 plat_type = parent->plat_type;
2526 const struct niu_phy_template *tp;
2527 u32 phy_addr_off = 0;
2529 if (plat_type == PLAT_TYPE_NIU) {
2533 NIU_FLAGS_XCVR_SERDES)) {
2534 case NIU_FLAGS_10G | NIU_FLAGS_XCVR_SERDES:
2536 tp = &phy_template_niu_10g_serdes;
2538 case NIU_FLAGS_XCVR_SERDES:
2540 tp = &phy_template_niu_1g_serdes;
2542 case NIU_FLAGS_10G | NIU_FLAGS_FIBER:
2545 tp = &phy_template_niu_10g_fiber;
2546 phy_addr_off += np->port;
2553 NIU_FLAGS_XCVR_SERDES)) {
2556 tp = &phy_template_1g_copper;
2557 if (plat_type == PLAT_TYPE_VF_P0)
2559 else if (plat_type == PLAT_TYPE_VF_P1)
2562 phy_addr_off += (np->port ^ 0x3);
2567 tp = &phy_template_10g_copper;
2570 case NIU_FLAGS_FIBER:
2572 tp = &phy_template_1g_fiber;
2575 case NIU_FLAGS_10G | NIU_FLAGS_FIBER:
2577 tp = &phy_template_10g_fiber;
2578 if (plat_type == PLAT_TYPE_VF_P0 ||
2579 plat_type == PLAT_TYPE_VF_P1)
2581 phy_addr_off += np->port;
2582 if (np->flags & NIU_FLAGS_HOTPLUG_PHY) {
2583 tp = &phy_template_10g_fiber_hotplug;
2591 case NIU_FLAGS_10G | NIU_FLAGS_XCVR_SERDES:
2592 case NIU_FLAGS_XCVR_SERDES | NIU_FLAGS_FIBER:
2593 case NIU_FLAGS_XCVR_SERDES:
2597 tp = &phy_template_10g_serdes;
2601 tp = &phy_template_1g_rgmii;
2607 phy_addr_off = niu_atca_port_num[np->port];
2615 np->phy_ops = tp->ops;
2616 np->phy_addr = tp->phy_addr_base + phy_addr_off;
2621 static int niu_init_link(struct niu *np)
2623 struct niu_parent *parent = np->parent;
2626 if (parent->plat_type == PLAT_TYPE_NIU) {
2627 err = niu_xcvr_init(np);
2632 err = niu_serdes_init(np);
2636 err = niu_xcvr_init(np);
2638 niu_link_status(np, &ignore);
2642 static void niu_set_primary_mac(struct niu *np, unsigned char *addr)
2644 u16 reg0 = addr[4] << 8 | addr[5];
2645 u16 reg1 = addr[2] << 8 | addr[3];
2646 u16 reg2 = addr[0] << 8 | addr[1];
2648 if (np->flags & NIU_FLAGS_XMAC) {
2649 nw64_mac(XMAC_ADDR0, reg0);
2650 nw64_mac(XMAC_ADDR1, reg1);
2651 nw64_mac(XMAC_ADDR2, reg2);
2653 nw64_mac(BMAC_ADDR0, reg0);
2654 nw64_mac(BMAC_ADDR1, reg1);
2655 nw64_mac(BMAC_ADDR2, reg2);
2659 static int niu_num_alt_addr(struct niu *np)
2661 if (np->flags & NIU_FLAGS_XMAC)
2662 return XMAC_NUM_ALT_ADDR;
2664 return BMAC_NUM_ALT_ADDR;
2667 static int niu_set_alt_mac(struct niu *np, int index, unsigned char *addr)
2669 u16 reg0 = addr[4] << 8 | addr[5];
2670 u16 reg1 = addr[2] << 8 | addr[3];
2671 u16 reg2 = addr[0] << 8 | addr[1];
2673 if (index >= niu_num_alt_addr(np))
2676 if (np->flags & NIU_FLAGS_XMAC) {
2677 nw64_mac(XMAC_ALT_ADDR0(index), reg0);
2678 nw64_mac(XMAC_ALT_ADDR1(index), reg1);
2679 nw64_mac(XMAC_ALT_ADDR2(index), reg2);
2681 nw64_mac(BMAC_ALT_ADDR0(index), reg0);
2682 nw64_mac(BMAC_ALT_ADDR1(index), reg1);
2683 nw64_mac(BMAC_ALT_ADDR2(index), reg2);
2689 static int niu_enable_alt_mac(struct niu *np, int index, int on)
2694 if (index >= niu_num_alt_addr(np))
2697 if (np->flags & NIU_FLAGS_XMAC) {
2698 reg = XMAC_ADDR_CMPEN;
2701 reg = BMAC_ADDR_CMPEN;
2702 mask = 1 << (index + 1);
2705 val = nr64_mac(reg);
2715 static void __set_rdc_table_num_hw(struct niu *np, unsigned long reg,
2716 int num, int mac_pref)
2718 u64 val = nr64_mac(reg);
2719 val &= ~(HOST_INFO_MACRDCTBLN | HOST_INFO_MPR);
2722 val |= HOST_INFO_MPR;
2726 static int __set_rdc_table_num(struct niu *np,
2727 int xmac_index, int bmac_index,
2728 int rdc_table_num, int mac_pref)
2732 if (rdc_table_num & ~HOST_INFO_MACRDCTBLN)
2734 if (np->flags & NIU_FLAGS_XMAC)
2735 reg = XMAC_HOST_INFO(xmac_index);
2737 reg = BMAC_HOST_INFO(bmac_index);
2738 __set_rdc_table_num_hw(np, reg, rdc_table_num, mac_pref);
2742 static int niu_set_primary_mac_rdc_table(struct niu *np, int table_num,
2745 return __set_rdc_table_num(np, 17, 0, table_num, mac_pref);
2748 static int niu_set_multicast_mac_rdc_table(struct niu *np, int table_num,
2751 return __set_rdc_table_num(np, 16, 8, table_num, mac_pref);
2754 static int niu_set_alt_mac_rdc_table(struct niu *np, int idx,
2755 int table_num, int mac_pref)
2757 if (idx >= niu_num_alt_addr(np))
2759 return __set_rdc_table_num(np, idx, idx + 1, table_num, mac_pref);
2762 static u64 vlan_entry_set_parity(u64 reg_val)
2767 port01_mask = 0x00ff;
2768 port23_mask = 0xff00;
2770 if (hweight64(reg_val & port01_mask) & 1)
2771 reg_val |= ENET_VLAN_TBL_PARITY0;
2773 reg_val &= ~ENET_VLAN_TBL_PARITY0;
2775 if (hweight64(reg_val & port23_mask) & 1)
2776 reg_val |= ENET_VLAN_TBL_PARITY1;
2778 reg_val &= ~ENET_VLAN_TBL_PARITY1;
2783 static void vlan_tbl_write(struct niu *np, unsigned long index,
2784 int port, int vpr, int rdc_table)
2786 u64 reg_val = nr64(ENET_VLAN_TBL(index));
2788 reg_val &= ~((ENET_VLAN_TBL_VPR |
2789 ENET_VLAN_TBL_VLANRDCTBLN) <<
2790 ENET_VLAN_TBL_SHIFT(port));
2792 reg_val |= (ENET_VLAN_TBL_VPR <<
2793 ENET_VLAN_TBL_SHIFT(port));
2794 reg_val |= (rdc_table << ENET_VLAN_TBL_SHIFT(port));
2796 reg_val = vlan_entry_set_parity(reg_val);
2798 nw64(ENET_VLAN_TBL(index), reg_val);
2801 static void vlan_tbl_clear(struct niu *np)
2805 for (i = 0; i < ENET_VLAN_TBL_NUM_ENTRIES; i++)
2806 nw64(ENET_VLAN_TBL(i), 0);
2809 static int tcam_wait_bit(struct niu *np, u64 bit)
2813 while (--limit > 0) {
2814 if (nr64(TCAM_CTL) & bit)
2824 static int tcam_flush(struct niu *np, int index)
2826 nw64(TCAM_KEY_0, 0x00);
2827 nw64(TCAM_KEY_MASK_0, 0xff);
2828 nw64(TCAM_CTL, (TCAM_CTL_RWC_TCAM_WRITE | index));
2830 return tcam_wait_bit(np, TCAM_CTL_STAT);
2834 static int tcam_read(struct niu *np, int index,
2835 u64 *key, u64 *mask)
2839 nw64(TCAM_CTL, (TCAM_CTL_RWC_TCAM_READ | index));
2840 err = tcam_wait_bit(np, TCAM_CTL_STAT);
2842 key[0] = nr64(TCAM_KEY_0);
2843 key[1] = nr64(TCAM_KEY_1);
2844 key[2] = nr64(TCAM_KEY_2);
2845 key[3] = nr64(TCAM_KEY_3);
2846 mask[0] = nr64(TCAM_KEY_MASK_0);
2847 mask[1] = nr64(TCAM_KEY_MASK_1);
2848 mask[2] = nr64(TCAM_KEY_MASK_2);
2849 mask[3] = nr64(TCAM_KEY_MASK_3);
2855 static int tcam_write(struct niu *np, int index,
2856 u64 *key, u64 *mask)
2858 nw64(TCAM_KEY_0, key[0]);
2859 nw64(TCAM_KEY_1, key[1]);
2860 nw64(TCAM_KEY_2, key[2]);
2861 nw64(TCAM_KEY_3, key[3]);
2862 nw64(TCAM_KEY_MASK_0, mask[0]);
2863 nw64(TCAM_KEY_MASK_1, mask[1]);
2864 nw64(TCAM_KEY_MASK_2, mask[2]);
2865 nw64(TCAM_KEY_MASK_3, mask[3]);
2866 nw64(TCAM_CTL, (TCAM_CTL_RWC_TCAM_WRITE | index));
2868 return tcam_wait_bit(np, TCAM_CTL_STAT);
2872 static int tcam_assoc_read(struct niu *np, int index, u64 *data)
2876 nw64(TCAM_CTL, (TCAM_CTL_RWC_RAM_READ | index));
2877 err = tcam_wait_bit(np, TCAM_CTL_STAT);
2879 *data = nr64(TCAM_KEY_1);
2885 static int tcam_assoc_write(struct niu *np, int index, u64 assoc_data)
2887 nw64(TCAM_KEY_1, assoc_data);
2888 nw64(TCAM_CTL, (TCAM_CTL_RWC_RAM_WRITE | index));
2890 return tcam_wait_bit(np, TCAM_CTL_STAT);
2893 static void tcam_enable(struct niu *np, int on)
2895 u64 val = nr64(FFLP_CFG_1);
2898 val &= ~FFLP_CFG_1_TCAM_DIS;
2900 val |= FFLP_CFG_1_TCAM_DIS;
2901 nw64(FFLP_CFG_1, val);
2904 static void tcam_set_lat_and_ratio(struct niu *np, u64 latency, u64 ratio)
2906 u64 val = nr64(FFLP_CFG_1);
2908 val &= ~(FFLP_CFG_1_FFLPINITDONE |
2910 FFLP_CFG_1_CAMRATIO);
2911 val |= (latency << FFLP_CFG_1_CAMLAT_SHIFT);
2912 val |= (ratio << FFLP_CFG_1_CAMRATIO_SHIFT);
2913 nw64(FFLP_CFG_1, val);
2915 val = nr64(FFLP_CFG_1);
2916 val |= FFLP_CFG_1_FFLPINITDONE;
2917 nw64(FFLP_CFG_1, val);
2920 static int tcam_user_eth_class_enable(struct niu *np, unsigned long class,
2926 if (class < CLASS_CODE_ETHERTYPE1 ||
2927 class > CLASS_CODE_ETHERTYPE2)
2930 reg = L2_CLS(class - CLASS_CODE_ETHERTYPE1);
2942 static int tcam_user_eth_class_set(struct niu *np, unsigned long class,
2948 if (class < CLASS_CODE_ETHERTYPE1 ||
2949 class > CLASS_CODE_ETHERTYPE2 ||
2950 (ether_type & ~(u64)0xffff) != 0)
2953 reg = L2_CLS(class - CLASS_CODE_ETHERTYPE1);
2955 val &= ~L2_CLS_ETYPE;
2956 val |= (ether_type << L2_CLS_ETYPE_SHIFT);
2963 static int tcam_user_ip_class_enable(struct niu *np, unsigned long class,
2969 if (class < CLASS_CODE_USER_PROG1 ||
2970 class > CLASS_CODE_USER_PROG4)
2973 reg = L3_CLS(class - CLASS_CODE_USER_PROG1);
2976 val |= L3_CLS_VALID;
2978 val &= ~L3_CLS_VALID;
2984 static int tcam_user_ip_class_set(struct niu *np, unsigned long class,
2985 int ipv6, u64 protocol_id,
2986 u64 tos_mask, u64 tos_val)
2991 if (class < CLASS_CODE_USER_PROG1 ||
2992 class > CLASS_CODE_USER_PROG4 ||
2993 (protocol_id & ~(u64)0xff) != 0 ||
2994 (tos_mask & ~(u64)0xff) != 0 ||
2995 (tos_val & ~(u64)0xff) != 0)
2998 reg = L3_CLS(class - CLASS_CODE_USER_PROG1);
3000 val &= ~(L3_CLS_IPVER | L3_CLS_PID |
3001 L3_CLS_TOSMASK | L3_CLS_TOS);
3003 val |= L3_CLS_IPVER;
3004 val |= (protocol_id << L3_CLS_PID_SHIFT);
3005 val |= (tos_mask << L3_CLS_TOSMASK_SHIFT);
3006 val |= (tos_val << L3_CLS_TOS_SHIFT);
3012 static int tcam_early_init(struct niu *np)
3018 tcam_set_lat_and_ratio(np,
3019 DEFAULT_TCAM_LATENCY,
3020 DEFAULT_TCAM_ACCESS_RATIO);
3021 for (i = CLASS_CODE_ETHERTYPE1; i <= CLASS_CODE_ETHERTYPE2; i++) {
3022 err = tcam_user_eth_class_enable(np, i, 0);
3026 for (i = CLASS_CODE_USER_PROG1; i <= CLASS_CODE_USER_PROG4; i++) {
3027 err = tcam_user_ip_class_enable(np, i, 0);
3035 static int tcam_flush_all(struct niu *np)
3039 for (i = 0; i < np->parent->tcam_num_entries; i++) {
3040 int err = tcam_flush(np, i);
3047 static u64 hash_addr_regval(unsigned long index, unsigned long num_entries)
3049 return ((u64)index | (num_entries == 1 ?
3050 HASH_TBL_ADDR_AUTOINC : 0));
3054 static int hash_read(struct niu *np, unsigned long partition,
3055 unsigned long index, unsigned long num_entries,
3058 u64 val = hash_addr_regval(index, num_entries);
3061 if (partition >= FCRAM_NUM_PARTITIONS ||
3062 index + num_entries > FCRAM_SIZE)
3065 nw64(HASH_TBL_ADDR(partition), val);
3066 for (i = 0; i < num_entries; i++)
3067 data[i] = nr64(HASH_TBL_DATA(partition));
3073 static int hash_write(struct niu *np, unsigned long partition,
3074 unsigned long index, unsigned long num_entries,
3077 u64 val = hash_addr_regval(index, num_entries);
3080 if (partition >= FCRAM_NUM_PARTITIONS ||
3081 index + (num_entries * 8) > FCRAM_SIZE)
3084 nw64(HASH_TBL_ADDR(partition), val);
3085 for (i = 0; i < num_entries; i++)
3086 nw64(HASH_TBL_DATA(partition), data[i]);
3091 static void fflp_reset(struct niu *np)
3095 nw64(FFLP_CFG_1, FFLP_CFG_1_PIO_FIO_RST);
3097 nw64(FFLP_CFG_1, 0);
3099 val = FFLP_CFG_1_FCRAMOUTDR_NORMAL | FFLP_CFG_1_FFLPINITDONE;
3100 nw64(FFLP_CFG_1, val);
3103 static void fflp_set_timings(struct niu *np)
3105 u64 val = nr64(FFLP_CFG_1);
3107 val &= ~FFLP_CFG_1_FFLPINITDONE;
3108 val |= (DEFAULT_FCRAMRATIO << FFLP_CFG_1_FCRAMRATIO_SHIFT);
3109 nw64(FFLP_CFG_1, val);
3111 val = nr64(FFLP_CFG_1);
3112 val |= FFLP_CFG_1_FFLPINITDONE;
3113 nw64(FFLP_CFG_1, val);
3115 val = nr64(FCRAM_REF_TMR);
3116 val &= ~(FCRAM_REF_TMR_MAX | FCRAM_REF_TMR_MIN);
3117 val |= (DEFAULT_FCRAM_REFRESH_MAX << FCRAM_REF_TMR_MAX_SHIFT);
3118 val |= (DEFAULT_FCRAM_REFRESH_MIN << FCRAM_REF_TMR_MIN_SHIFT);
3119 nw64(FCRAM_REF_TMR, val);
3122 static int fflp_set_partition(struct niu *np, u64 partition,
3123 u64 mask, u64 base, int enable)
3128 if (partition >= FCRAM_NUM_PARTITIONS ||
3129 (mask & ~(u64)0x1f) != 0 ||
3130 (base & ~(u64)0x1f) != 0)
3133 reg = FLW_PRT_SEL(partition);
3136 val &= ~(FLW_PRT_SEL_EXT | FLW_PRT_SEL_MASK | FLW_PRT_SEL_BASE);
3137 val |= (mask << FLW_PRT_SEL_MASK_SHIFT);
3138 val |= (base << FLW_PRT_SEL_BASE_SHIFT);
3140 val |= FLW_PRT_SEL_EXT;
3146 static int fflp_disable_all_partitions(struct niu *np)
3150 for (i = 0; i < FCRAM_NUM_PARTITIONS; i++) {
3151 int err = fflp_set_partition(np, 0, 0, 0, 0);
3158 static void fflp_llcsnap_enable(struct niu *np, int on)
3160 u64 val = nr64(FFLP_CFG_1);
3163 val |= FFLP_CFG_1_LLCSNAP;
3165 val &= ~FFLP_CFG_1_LLCSNAP;
3166 nw64(FFLP_CFG_1, val);
3169 static void fflp_errors_enable(struct niu *np, int on)
3171 u64 val = nr64(FFLP_CFG_1);
3174 val &= ~FFLP_CFG_1_ERRORDIS;
3176 val |= FFLP_CFG_1_ERRORDIS;
3177 nw64(FFLP_CFG_1, val);
3180 static int fflp_hash_clear(struct niu *np)
3182 struct fcram_hash_ipv4 ent;
3185 /* IPV4 hash entry with valid bit clear, rest is don't care. */
3186 memset(&ent, 0, sizeof(ent));
3187 ent.header = HASH_HEADER_EXT;
3189 for (i = 0; i < FCRAM_SIZE; i += sizeof(ent)) {
3190 int err = hash_write(np, 0, i, 1, (u64 *) &ent);
3197 static int fflp_early_init(struct niu *np)
3199 struct niu_parent *parent;
3200 unsigned long flags;
3203 niu_lock_parent(np, flags);
3205 parent = np->parent;
3207 if (!(parent->flags & PARENT_FLGS_CLS_HWINIT)) {
3208 niudbg(PROBE, "fflp_early_init: Initting hw on port %u\n",
3210 if (np->parent->plat_type != PLAT_TYPE_NIU) {
3212 fflp_set_timings(np);
3213 err = fflp_disable_all_partitions(np);
3215 niudbg(PROBE, "fflp_disable_all_partitions "
3216 "failed, err=%d\n", err);
3221 err = tcam_early_init(np);
3223 niudbg(PROBE, "tcam_early_init failed, err=%d\n",
3227 fflp_llcsnap_enable(np, 1);
3228 fflp_errors_enable(np, 0);
3232 err = tcam_flush_all(np);
3234 niudbg(PROBE, "tcam_flush_all failed, err=%d\n",
3238 if (np->parent->plat_type != PLAT_TYPE_NIU) {
3239 err = fflp_hash_clear(np);
3241 niudbg(PROBE, "fflp_hash_clear failed, "
3249 niudbg(PROBE, "fflp_early_init: Success\n");
3250 parent->flags |= PARENT_FLGS_CLS_HWINIT;
3253 niu_unlock_parent(np, flags);
3257 static int niu_set_flow_key(struct niu *np, unsigned long class_code, u64 key)
3259 if (class_code < CLASS_CODE_USER_PROG1 ||
3260 class_code > CLASS_CODE_SCTP_IPV6)
3263 nw64(FLOW_KEY(class_code - CLASS_CODE_USER_PROG1), key);
3267 static int niu_set_tcam_key(struct niu *np, unsigned long class_code, u64 key)
3269 if (class_code < CLASS_CODE_USER_PROG1 ||