Lines Matching refs:np

91 #define nr64(reg)		readq(np->regs + (reg))
92 #define nw64(reg, val) writeq((val), np->regs + (reg))
94 #define nr64_mac(reg) readq(np->mac_regs + (reg))
95 #define nw64_mac(reg, val) writeq((val), np->mac_regs + (reg))
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))
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))
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))
113 #define niu_lock_parent(np, flags) \ argument
114 spin_lock_irqsave(&np->parent->lock, flags)
115 #define niu_unlock_parent(np, flags) \ argument
116 spin_unlock_irqrestore(&np->parent->lock, flags)
118 static int serdes_init_10g_serdes(struct niu *np);
120 static int __niu_wait_bits_clear_mac(struct niu *np, unsigned long reg, in __niu_wait_bits_clear_mac() argument
135 static int __niu_set_and_wait_clear_mac(struct niu *np, unsigned long reg, in __niu_set_and_wait_clear_mac() argument
142 err = __niu_wait_bits_clear_mac(np, reg, bits, limit, delay); in __niu_set_and_wait_clear_mac()
144 netdev_err(np->dev, "bits (%llx) of register %s would not clear, val[%llx]\n", in __niu_set_and_wait_clear_mac()
155 static int __niu_wait_bits_clear_ipp(struct niu *np, unsigned long reg, in __niu_wait_bits_clear_ipp() argument
170 static int __niu_set_and_wait_clear_ipp(struct niu *np, unsigned long reg, in __niu_set_and_wait_clear_ipp() argument
181 err = __niu_wait_bits_clear_ipp(np, reg, bits, limit, delay); in __niu_set_and_wait_clear_ipp()
183 netdev_err(np->dev, "bits (%llx) of register %s would not clear, val[%llx]\n", in __niu_set_and_wait_clear_ipp()
194 static int __niu_wait_bits_clear(struct niu *np, unsigned long reg, in __niu_wait_bits_clear() argument
214 static int __niu_set_and_wait_clear(struct niu *np, unsigned long reg, in __niu_set_and_wait_clear() argument
221 err = __niu_wait_bits_clear(np, reg, bits, limit, delay); in __niu_set_and_wait_clear()
223 netdev_err(np->dev, "bits (%llx) of register %s would not clear, val[%llx]\n", in __niu_set_and_wait_clear()
234 static void niu_ldg_rearm(struct niu *np, struct niu_ldg *lp, int on) in niu_ldg_rearm() argument
244 static int niu_ldn_irq_enable(struct niu *np, int ldn, int on) in niu_ldn_irq_enable() argument
270 static int niu_enable_ldn_in_ldg(struct niu *np, struct niu_ldg *lp, int on) in niu_enable_ldn_in_ldg() argument
272 struct niu_parent *parent = np->parent; in niu_enable_ldn_in_ldg()
281 err = niu_ldn_irq_enable(np, i, on); in niu_enable_ldn_in_ldg()
288 static int niu_enable_interrupts(struct niu *np, int on) in niu_enable_interrupts() argument
292 for (i = 0; i < np->num_ldg; i++) { in niu_enable_interrupts()
293 struct niu_ldg *lp = &np->ldg[i]; in niu_enable_interrupts()
296 err = niu_enable_ldn_in_ldg(np, lp, on); in niu_enable_interrupts()
300 for (i = 0; i < np->num_ldg; i++) in niu_enable_interrupts()
301 niu_ldg_rearm(np, &np->ldg[i], on); in niu_enable_interrupts()
316 static int mdio_wait(struct niu *np) in mdio_wait() argument
332 static int mdio_read(struct niu *np, int port, int dev, int reg) in mdio_read() argument
337 err = mdio_wait(np); in mdio_read()
342 return mdio_wait(np); in mdio_read()
345 static int mdio_write(struct niu *np, int port, int dev, int reg, int data) in mdio_write() argument
350 err = mdio_wait(np); in mdio_write()
355 err = mdio_wait(np); in mdio_write()
362 static int mii_read(struct niu *np, int port, int reg) in mii_read() argument
365 return mdio_wait(np); in mii_read()
368 static int mii_write(struct niu *np, int port, int reg, int data) in mii_write() argument
373 err = mdio_wait(np); in mii_write()
380 static int esr2_set_tx_cfg(struct niu *np, unsigned long channel, u32 val) in esr2_set_tx_cfg() argument
384 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in esr2_set_tx_cfg()
388 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in esr2_set_tx_cfg()
394 static int esr2_set_rx_cfg(struct niu *np, unsigned long channel, u32 val) in esr2_set_rx_cfg() argument
398 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in esr2_set_rx_cfg()
402 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in esr2_set_rx_cfg()
409 static int serdes_init_niu_10g_fiber(struct niu *np) in serdes_init_niu_10g_fiber() argument
411 struct niu_link_config *lp = &np->link_config; in serdes_init_niu_10g_fiber()
423 mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in serdes_init_niu_10g_fiber()
432 int err = esr2_set_tx_cfg(np, i, tx_cfg); in serdes_init_niu_10g_fiber()
438 int err = esr2_set_rx_cfg(np, i, rx_cfg); in serdes_init_niu_10g_fiber()
446 static int serdes_init_niu_1g_serdes(struct niu *np) in serdes_init_niu_1g_serdes() argument
448 struct niu_link_config *lp = &np->link_config; in serdes_init_niu_1g_serdes()
462 if (np->port == 0) in serdes_init_niu_1g_serdes()
468 mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in serdes_init_niu_1g_serdes()
478 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in serdes_init_niu_1g_serdes()
481 netdev_err(np->dev, "NIU Port %d %s() mdio write to ESR2_TI_PLL_CFG_L failed\n", in serdes_init_niu_1g_serdes()
482 np->port, __func__); in serdes_init_niu_1g_serdes()
488 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in serdes_init_niu_1g_serdes()
491 netdev_err(np->dev, "NIU Port %d %s() mdio write to ESR2_TI_PLL_STS_L failed\n", in serdes_init_niu_1g_serdes()
492 np->port, __func__); in serdes_init_niu_1g_serdes()
500 err = esr2_set_tx_cfg(np, i, tx_cfg); in serdes_init_niu_1g_serdes()
506 err = esr2_set_rx_cfg(np, i, rx_cfg); in serdes_init_niu_1g_serdes()
511 switch (np->port) { in serdes_init_niu_1g_serdes()
535 netdev_err(np->dev, "Port %u signal bits [%08x] are not [%08x]\n", in serdes_init_niu_1g_serdes()
536 np->port, (int)(sig & mask), (int)val); in serdes_init_niu_1g_serdes()
543 static int serdes_init_niu_10g_serdes(struct niu *np) in serdes_init_niu_10g_serdes() argument
545 struct niu_link_config *lp = &np->link_config; in serdes_init_niu_10g_serdes()
560 mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in serdes_init_niu_10g_serdes()
570 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in serdes_init_niu_10g_serdes()
573 netdev_err(np->dev, "NIU Port %d %s() mdio write to ESR2_TI_PLL_CFG_L failed\n", in serdes_init_niu_10g_serdes()
574 np->port, __func__); in serdes_init_niu_10g_serdes()
580 err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR, in serdes_init_niu_10g_serdes()
583 netdev_err(np->dev, "NIU Port %d %s() mdio write to ESR2_TI_PLL_STS_L failed\n", in serdes_init_niu_10g_serdes()
584 np->port, __func__); in serdes_init_niu_10g_serdes()
592 err = esr2_set_tx_cfg(np, i, tx_cfg); in serdes_init_niu_10g_serdes()
598 err = esr2_set_rx_cfg(np, i, rx_cfg); in serdes_init_niu_10g_serdes()
605 switch (np->port) { in serdes_init_niu_10g_serdes()
642 np->port, (int)(sig & mask), (int)val); in serdes_init_niu_10g_serdes()
645 err = serdes_init_niu_1g_serdes(np); in serdes_init_niu_10g_serdes()
647 np->flags &= ~NIU_FLAGS_10G; in serdes_init_niu_10g_serdes()
648 np->mac_xcvr = MAC_XCVR_PCS; in serdes_init_niu_10g_serdes()
650 netdev_err(np->dev, "Port %u 10G/1G SERDES Link Failed\n", in serdes_init_niu_10g_serdes()
651 np->port); in serdes_init_niu_10g_serdes()
658 static int esr_read_rxtx_ctrl(struct niu *np, unsigned long chan, u32 *val) in esr_read_rxtx_ctrl() argument
662 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR, ESR_RXTX_CTRL_L(chan)); in esr_read_rxtx_ctrl()
665 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR, in esr_read_rxtx_ctrl()
674 static int esr_read_glue0(struct niu *np, unsigned long chan, u32 *val) in esr_read_glue0() argument
678 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR, in esr_read_glue0()
682 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR, in esr_read_glue0()
692 static int esr_read_reset(struct niu *np, u32 *val) in esr_read_reset() argument
696 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR, in esr_read_reset()
700 err = mdio_read(np, np->port, NIU_ESR_DEV_ADDR, in esr_read_reset()
710 static int esr_write_rxtx_ctrl(struct niu *np, unsigned long chan, u32 val) in esr_write_rxtx_ctrl() argument
714 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR, in esr_write_rxtx_ctrl()
717 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR, in esr_write_rxtx_ctrl()
722 static int esr_write_glue0(struct niu *np, unsigned long chan, u32 val) in esr_write_glue0() argument
726 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR, in esr_write_glue0()
729 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR, in esr_write_glue0()
734 static int esr_reset(struct niu *np) in esr_reset() argument
739 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR, in esr_reset()
743 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR, in esr_reset()
749 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR, in esr_reset()
755 err = mdio_write(np, np->port, NIU_ESR_DEV_ADDR, in esr_reset()
761 err = esr_read_reset(np, &reset); in esr_reset()
765 netdev_err(np->dev, "Port %u ESR_RESET did not clear [%08x]\n", in esr_reset()
766 np->port, reset); in esr_reset()
773 static int serdes_init_10g(struct niu *np) in serdes_init_10g() argument
775 struct niu_link_config *lp = &np->link_config; in serdes_init_10g()
780 switch (np->port) { in serdes_init_10g()
825 err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl); in serdes_init_10g()
828 err = esr_read_glue0(np, i, &glue0); in serdes_init_10g()
845 err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl); in serdes_init_10g()
848 err = esr_write_glue0(np, i, glue0); in serdes_init_10g()
853 err = esr_reset(np); in serdes_init_10g()
858 switch (np->port) { in serdes_init_10g()
886 if (np->flags & NIU_FLAGS_HOTPLUG_PHY) { in serdes_init_10g()
887 np->flags &= ~NIU_FLAGS_HOTPLUG_PHY_PRESENT; in serdes_init_10g()
890 netdev_err(np->dev, "Port %u signal bits [%08x] are not [%08x]\n", in serdes_init_10g()
891 np->port, (int)(sig & mask), (int)val); in serdes_init_10g()
894 if (np->flags & NIU_FLAGS_HOTPLUG_PHY) in serdes_init_10g()
895 np->flags |= NIU_FLAGS_HOTPLUG_PHY_PRESENT; in serdes_init_10g()
899 static int serdes_init_1g(struct niu *np) in serdes_init_1g() argument
905 switch (np->port) { in serdes_init_1g()
926 static int serdes_init_1g_serdes(struct niu *np) in serdes_init_1g_serdes() argument
928 struct niu_link_config *lp = &np->link_config; in serdes_init_1g_serdes()
937 switch (np->port) { in serdes_init_1g_serdes()
993 err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl); in serdes_init_1g_serdes()
996 err = esr_read_glue0(np, i, &glue0); in serdes_init_1g_serdes()
1013 err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl); in serdes_init_1g_serdes()
1016 err = esr_write_glue0(np, i, glue0); in serdes_init_1g_serdes()
1023 switch (np->port) { in serdes_init_1g_serdes()
1039 netdev_err(np->dev, "Port %u signal bits [%08x] are not [%08x]\n", in serdes_init_1g_serdes()
1040 np->port, (int)(sig & mask), (int)val); in serdes_init_1g_serdes()
1047 static int link_status_1g_serdes(struct niu *np, int *link_up_p) in link_status_1g_serdes() argument
1049 struct niu_link_config *lp = &np->link_config; in link_status_1g_serdes()
1060 spin_lock_irqsave(&np->lock, flags); in link_status_1g_serdes()
1072 spin_unlock_irqrestore(&np->lock, flags); in link_status_1g_serdes()
1078 static int link_status_10g_serdes(struct niu *np, int *link_up_p) in link_status_10g_serdes() argument
1081 struct niu_link_config *lp = &np->link_config; in link_status_10g_serdes()
1088 if (!(np->flags & NIU_FLAGS_10G)) in link_status_10g_serdes()
1089 return link_status_1g_serdes(np, link_up_p); in link_status_10g_serdes()
1093 spin_lock_irqsave(&np->lock, flags); in link_status_10g_serdes()
1107 spin_unlock_irqrestore(&np->lock, flags); in link_status_10g_serdes()
1112 static int link_status_mii(struct niu *np, int *link_up_p) in link_status_mii() argument
1114 struct niu_link_config *lp = &np->link_config; in link_status_mii()
1119 err = mii_read(np, np->phy_addr, MII_BMCR); in link_status_mii()
1124 err = mii_read(np, np->phy_addr, MII_BMSR); in link_status_mii()
1129 err = mii_read(np, np->phy_addr, MII_ADVERTISE); in link_status_mii()
1134 err = mii_read(np, np->phy_addr, MII_LPA); in link_status_mii()
1140 err = mii_read(np, np->phy_addr, MII_ESTATUS); in link_status_mii()
1145 err = mii_read(np, np->phy_addr, MII_CTRL1000); in link_status_mii()
1150 err = mii_read(np, np->phy_addr, MII_STAT1000); in link_status_mii()
1225 static int link_status_1g_rgmii(struct niu *np, int *link_up_p) in link_status_1g_rgmii() argument
1227 struct niu_link_config *lp = &np->link_config; in link_status_1g_rgmii()
1237 spin_lock_irqsave(&np->lock, flags); in link_status_1g_rgmii()
1239 err = mii_read(np, np->phy_addr, MII_BMSR); in link_status_1g_rgmii()
1254 spin_unlock_irqrestore(&np->lock, flags); in link_status_1g_rgmii()
1260 static int link_status_1g(struct niu *np, int *link_up_p) in link_status_1g() argument
1262 struct niu_link_config *lp = &np->link_config; in link_status_1g()
1266 spin_lock_irqsave(&np->lock, flags); in link_status_1g()
1268 err = link_status_mii(np, link_up_p); in link_status_1g()
1272 spin_unlock_irqrestore(&np->lock, flags); in link_status_1g()
1276 static int bcm8704_reset(struct niu *np) in bcm8704_reset() argument
1280 err = mdio_read(np, np->phy_addr, in bcm8704_reset()
1285 err = mdio_write(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR, in bcm8704_reset()
1292 err = mdio_read(np, np->phy_addr, in bcm8704_reset()
1300 netdev_err(np->dev, "Port %u PHY will not reset (bmcr=%04x)\n", in bcm8704_reset()
1301 np->port, (err & 0xffff)); in bcm8704_reset()
1310 static int bcm8704_user_dev3_readback(struct niu *np, int reg) in bcm8704_user_dev3_readback() argument
1312 int err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, reg); in bcm8704_user_dev3_readback()
1315 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, reg); in bcm8704_user_dev3_readback()
1321 static int bcm8706_init_user_dev3(struct niu *np) in bcm8706_init_user_dev3() argument
1326 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, in bcm8706_init_user_dev3()
1333 err = mdio_write(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, in bcm8706_init_user_dev3()
1343 static int bcm8704_init_user_dev3(struct niu *np) in bcm8704_init_user_dev3() argument
1347 err = mdio_write(np, np->phy_addr, in bcm8704_init_user_dev3()
1361 err = mdio_write(np, np->phy_addr, in bcm8704_init_user_dev3()
1370 err = bcm8704_user_dev3_readback(np, BCM8704_USER_CONTROL); in bcm8704_init_user_dev3()
1373 err = bcm8704_user_dev3_readback(np, BCM8704_USER_PMD_TX_CONTROL); in bcm8704_init_user_dev3()
1377 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, in bcm8704_init_user_dev3()
1383 err = mdio_write(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, in bcm8704_init_user_dev3()
1393 static int mrvl88x2011_act_led(struct niu *np, int val) in mrvl88x2011_act_led() argument
1397 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR, in mrvl88x2011_act_led()
1405 return mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR, in mrvl88x2011_act_led()
1409 static int mrvl88x2011_led_blink_rate(struct niu *np, int rate) in mrvl88x2011_led_blink_rate() argument
1413 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR, in mrvl88x2011_led_blink_rate()
1419 err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV2_ADDR, in mrvl88x2011_led_blink_rate()
1426 static int xcvr_init_10g_mrvl88x2011(struct niu *np) in xcvr_init_10g_mrvl88x2011() argument
1431 err = mrvl88x2011_led_blink_rate(np, MRVL88X2011_LED_BLKRATE_134MS); in xcvr_init_10g_mrvl88x2011()
1436 err = mrvl88x2011_act_led(np, MRVL88X2011_LED_CTL_OFF); in xcvr_init_10g_mrvl88x2011()
1440 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR, in xcvr_init_10g_mrvl88x2011()
1447 err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR, in xcvr_init_10g_mrvl88x2011()
1452 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR, in xcvr_init_10g_mrvl88x2011()
1457 if (np->link_config.loopback_mode == LOOPBACK_MAC) in xcvr_init_10g_mrvl88x2011()
1462 err = mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR, in xcvr_init_10g_mrvl88x2011()
1468 return mdio_write(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR, in xcvr_init_10g_mrvl88x2011()
1473 static int xcvr_diag_bcm870x(struct niu *np) in xcvr_diag_bcm870x() argument
1479 err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR, in xcvr_diag_bcm870x()
1483 pr_info("Port %u PMA_PMD(MII_STAT1000) [%04x]\n", np->port, err); in xcvr_diag_bcm870x()
1485 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, 0x20); in xcvr_diag_bcm870x()
1488 pr_info("Port %u USER_DEV3(0x20) [%04x]\n", np->port, err); in xcvr_diag_bcm870x()
1490 err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR, in xcvr_diag_bcm870x()
1494 pr_info("Port %u PHYXS(MII_NWAYTEST) [%04x]\n", np->port, err); in xcvr_diag_bcm870x()
1498 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, in xcvr_diag_bcm870x()
1502 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, in xcvr_diag_bcm870x()
1508 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, in xcvr_diag_bcm870x()
1512 err = mdio_read(np, np->phy_addr, BCM8704_USER_DEV3_ADDR, in xcvr_diag_bcm870x()
1521 np->port); in xcvr_diag_bcm870x()
1524 np->port); in xcvr_diag_bcm870x()
1531 static int xcvr_10g_set_lb_bcm870x(struct niu *np) in xcvr_10g_set_lb_bcm870x() argument
1533 struct niu_link_config *lp = &np->link_config; in xcvr_10g_set_lb_bcm870x()
1536 err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR, in xcvr_10g_set_lb_bcm870x()
1546 err = mdio_write(np, np->phy_addr, BCM8704_PCS_DEV_ADDR, in xcvr_10g_set_lb_bcm870x()
1554 static int xcvr_init_10g_bcm8706(struct niu *np) in xcvr_init_10g_bcm8706() argument
1559 if ((np->flags & NIU_FLAGS_HOTPLUG_PHY) && in xcvr_init_10g_bcm8706()
1560 (np->flags & NIU_FLAGS_HOTPLUG_PHY_PRESENT) == 0) in xcvr_init_10g_bcm8706()
1572 err = bcm8704_reset(np); in xcvr_init_10g_bcm8706()
1576 err = xcvr_10g_set_lb_bcm870x(np); in xcvr_init_10g_bcm8706()
1580 err = bcm8706_init_user_dev3(np); in xcvr_init_10g_bcm8706()
1584 err = xcvr_diag_bcm870x(np); in xcvr_init_10g_bcm8706()
1591 static int xcvr_init_10g_bcm8704(struct niu *np) in xcvr_init_10g_bcm8704() argument
1595 err = bcm8704_reset(np); in xcvr_init_10g_bcm8704()
1599 err = bcm8704_init_user_dev3(np); in xcvr_init_10g_bcm8704()
1603 err = xcvr_10g_set_lb_bcm870x(np); in xcvr_init_10g_bcm8704()
1607 err = xcvr_diag_bcm870x(np); in xcvr_init_10g_bcm8704()
1614 static int xcvr_init_10g(struct niu *np) in xcvr_init_10g() argument
1629 phy_id = phy_decode(np->parent->port_phy, np->port); in xcvr_init_10g()
1630 phy_id = np->parent->phy_probe_info.phy_id[phy_id][np->port]; in xcvr_init_10g()
1635 err = xcvr_init_10g_mrvl88x2011(np); in xcvr_init_10g()
1639 err = xcvr_init_10g_bcm8704(np); in xcvr_init_10g()
1646 static int mii_reset(struct niu *np) in mii_reset() argument
1650 err = mii_write(np, np->phy_addr, MII_BMCR, BMCR_RESET); in mii_reset()
1657 err = mii_read(np, np->phy_addr, MII_BMCR); in mii_reset()
1664 netdev_err(np->dev, "Port %u MII would not reset, bmcr[%04x]\n", in mii_reset()
1665 np->port, err); in mii_reset()
1672 static int xcvr_init_1g_rgmii(struct niu *np) in xcvr_init_1g_rgmii() argument
1682 err = mii_reset(np); in xcvr_init_1g_rgmii()
1686 err = mii_read(np, np->phy_addr, MII_BMSR); in xcvr_init_1g_rgmii()
1693 err = mii_read(np, np->phy_addr, MII_ESTATUS); in xcvr_init_1g_rgmii()
1700 err = mii_write(np, np->phy_addr, MII_BMCR, bmcr); in xcvr_init_1g_rgmii()
1709 err = mii_write(np, np->phy_addr, MII_CTRL1000, ctrl1000); in xcvr_init_1g_rgmii()
1716 err = mii_write(np, np->phy_addr, MII_BMCR, bmcr); in xcvr_init_1g_rgmii()
1720 err = mii_read(np, np->phy_addr, MII_BMCR); in xcvr_init_1g_rgmii()
1723 bmcr = mii_read(np, np->phy_addr, MII_BMCR); in xcvr_init_1g_rgmii()
1725 err = mii_read(np, np->phy_addr, MII_BMSR); in xcvr_init_1g_rgmii()
1732 static int mii_init_common(struct niu *np) in mii_init_common() argument
1734 struct niu_link_config *lp = &np->link_config; in mii_init_common()
1738 err = mii_reset(np); in mii_init_common()
1742 err = mii_read(np, np->phy_addr, MII_BMSR); in mii_init_common()
1749 err = mii_read(np, np->phy_addr, MII_ESTATUS); in mii_init_common()
1756 err = mii_write(np, np->phy_addr, MII_BMCR, bmcr); in mii_init_common()
1773 err = mii_write(np, np->phy_addr, BCM5464R_AUX_CTL, aux); in mii_init_common()
1794 err = mii_write(np, np->phy_addr, MII_ADVERTISE, adv); in mii_init_common()
1806 err = mii_write(np, np->phy_addr, in mii_init_common()
1845 err = mii_write(np, np->phy_addr, MII_BMCR, bmcr); in mii_init_common()
1850 err = mii_read(np, np->phy_addr, MII_BMCR); in mii_init_common()
1855 err = mii_read(np, np->phy_addr, MII_BMSR); in mii_init_common()
1861 np->port, bmcr, bmsr); in mii_init_common()
1867 static int xcvr_init_1g(struct niu *np) in xcvr_init_1g() argument
1876 return mii_init_common(np); in xcvr_init_1g()
1879 static int niu_xcvr_init(struct niu *np) in niu_xcvr_init() argument
1881 const struct niu_phy_ops *ops = np->phy_ops; in niu_xcvr_init()
1886 err = ops->xcvr_init(np); in niu_xcvr_init()
1891 static int niu_serdes_init(struct niu *np) in niu_serdes_init() argument
1893 const struct niu_phy_ops *ops = np->phy_ops; in niu_serdes_init()
1898 err = ops->serdes_init(np); in niu_serdes_init()
1906 static int niu_link_status_common(struct niu *np, int link_up) in niu_link_status_common() argument
1908 struct niu_link_config *lp = &np->link_config; in niu_link_status_common()
1909 struct net_device *dev = np->dev; in niu_link_status_common()
1913 netif_info(np, link, dev, "Link is up at %s, %s duplex\n", in niu_link_status_common()
1920 spin_lock_irqsave(&np->lock, flags); in niu_link_status_common()
1921 niu_init_xif(np); in niu_link_status_common()
1922 niu_handle_led(np, 1); in niu_link_status_common()
1923 spin_unlock_irqrestore(&np->lock, flags); in niu_link_status_common()
1927 netif_warn(np, link, dev, "Link is down\n"); in niu_link_status_common()
1928 spin_lock_irqsave(&np->lock, flags); in niu_link_status_common()
1929 niu_handle_led(np, 0); in niu_link_status_common()
1930 spin_unlock_irqrestore(&np->lock, flags); in niu_link_status_common()
1937 static int link_status_10g_mrvl(struct niu *np, int *link_up_p) in link_status_10g_mrvl() argument
1943 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR, in link_status_10g_mrvl()
1949 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV1_ADDR, in link_status_10g_mrvl()
1957 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR, in link_status_10g_mrvl()
1962 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV3_ADDR, in link_status_10g_mrvl()
1970 err = mdio_read(np, np->phy_addr, MRVL88X2011_USER_DEV4_ADDR, in link_status_10g_mrvl()
1981 np->link_config.active_speed = SPEED_10000; in link_status_10g_mrvl()
1982 np->link_config.active_duplex = DUPLEX_FULL; in link_status_10g_mrvl()
1985 mrvl88x2011_act_led(np, (link_up ? in link_status_10g_mrvl()
1993 static int link_status_10g_bcm8706(struct niu *np, int *link_up_p) in link_status_10g_bcm8706() argument
1998 err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR, in link_status_10g_bcm8706()
2007 err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR, in link_status_10g_bcm8706()
2017 err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR, in link_status_10g_bcm8706()
2029 np->link_config.active_speed = SPEED_INVALID; in link_status_10g_bcm8706()
2030 np->link_config.active_duplex = DUPLEX_INVALID; in link_status_10g_bcm8706()
2035 np->link_config.active_speed = SPEED_10000; in link_status_10g_bcm8706()
2036 np->link_config.active_duplex = DUPLEX_FULL; in link_status_10g_bcm8706()
2044 static int link_status_10g_bcom(struct niu *np, int *link_up_p) in link_status_10g_bcom() argument
2050 err = mdio_read(np, np->phy_addr, BCM8704_PMA_PMD_DEV_ADDR, in link_status_10g_bcom()
2059 err = mdio_read(np, np->phy_addr, BCM8704_PCS_DEV_ADDR, in link_status_10g_bcom()
2068 err = mdio_read(np, np->phy_addr, BCM8704_PHYXS_DEV_ADDR, in link_status_10g_bcom()
2084 np->link_config.active_speed = SPEED_10000; in link_status_10g_bcom()
2085 np->link_config.active_duplex = DUPLEX_FULL; in link_status_10g_bcom()
2093 static int link_status_10g(struct niu *np, int *link_up_p) in link_status_10g() argument
2098 spin_lock_irqsave(&np->lock, flags); in link_status_10g()
2100 if (np->link_config.loopback_mode == LOOPBACK_DISABLED) { in link_status_10g()
2103 phy_id = phy_decode(np->parent->port_phy, np->port); in link_status_10g()
2104 phy_id = np->parent->phy_probe_info.phy_id[phy_id][np->port]; in link_status_10g()
2109 err = link_status_10g_mrvl(np, link_up_p); in link_status_10g()
2113 err = link_status_10g_bcom(np, link_up_p); in link_status_10g()
2118 spin_unlock_irqrestore(&np->lock, flags); in link_status_10g()
2123 static int niu_10g_phy_present(struct niu *np) in niu_10g_phy_present() argument
2128 switch (np->port) { in niu_10g_phy_present()
2160 static int link_status_10g_hotplug(struct niu *np, int *link_up_p) in link_status_10g_hotplug() argument
2167 spin_lock_irqsave(&np->lock, flags); in link_status_10g_hotplug()
2169 if (np->link_config.loopback_mode == LOOPBACK_DISABLED) { in link_status_10g_hotplug()
2170 phy_present_prev = (np->flags & NIU_FLAGS_HOTPLUG_PHY_PRESENT) ? in link_status_10g_hotplug()
2172 phy_present = niu_10g_phy_present(np); in link_status_10g_hotplug()
2177 np->flags |= NIU_FLAGS_HOTPLUG_PHY_PRESENT; in link_status_10g_hotplug()
2178 if (np->phy_ops->xcvr_init) in link_status_10g_hotplug()
2179 err = np->phy_ops->xcvr_init(np); in link_status_10g_hotplug()
2181 err = mdio_read(np, np->phy_addr, in link_status_10g_hotplug()
2188 np->flags &= ~NIU_FLAGS_HOTPLUG_PHY_PRESENT; in link_status_10g_hotplug()
2191 np->flags &= ~NIU_FLAGS_HOTPLUG_PHY_PRESENT; in link_status_10g_hotplug()
2193 netif_warn(np, link, np->dev, in link_status_10g_hotplug()
2198 if (np->flags & NIU_FLAGS_HOTPLUG_PHY_PRESENT) { in link_status_10g_hotplug()
2199 err = link_status_10g_bcm8706(np, link_up_p); in link_status_10g_hotplug()
2203 np->link_config.active_speed = SPEED_10000; in link_status_10g_hotplug()
2204 np->link_config.active_duplex = DUPLEX_FULL; in link_status_10g_hotplug()
2209 spin_unlock_irqrestore(&np->lock, flags); in link_status_10g_hotplug()
2214 static int niu_link_status(struct niu *np, int *link_up_p) in niu_link_status() argument
2216 const struct niu_phy_ops *ops = np->phy_ops; in niu_link_status()
2221 err = ops->link_status(np, link_up_p); in niu_link_status()
2228 struct niu *np = from_timer(np, t, timer); in niu_timer() local
2232 err = niu_link_status(np, &link_up); in niu_timer()
2234 niu_link_status_common(np, link_up); in niu_timer()
2236 if (netif_carrier_ok(np->dev)) in niu_timer()
2240 np->timer.expires = jiffies + off; in niu_timer()
2242 add_timer(&np->timer); in niu_timer()
2369 static int serdes_init_10g_serdes(struct niu *np) in serdes_init_10g_serdes() argument
2371 struct niu_link_config *lp = &np->link_config; in serdes_init_10g_serdes()
2375 switch (np->port) { in serdes_init_10g_serdes()
2415 esr_reset(np); in serdes_init_10g_serdes()
2425 err = esr_read_rxtx_ctrl(np, i, &rxtx_ctrl); in serdes_init_10g_serdes()
2428 err = esr_read_glue0(np, i, &glue0); in serdes_init_10g_serdes()
2445 err = esr_write_rxtx_ctrl(np, i, rxtx_ctrl); in serdes_init_10g_serdes()
2448 err = esr_write_glue0(np, i, glue0); in serdes_init_10g_serdes()
2455 switch (np->port) { in serdes_init_10g_serdes()
2484 err = serdes_init_1g_serdes(np); in serdes_init_10g_serdes()
2486 np->flags &= ~NIU_FLAGS_10G; in serdes_init_10g_serdes()
2487 np->mac_xcvr = MAC_XCVR_PCS; in serdes_init_10g_serdes()
2489 netdev_err(np->dev, "Port %u 10G/1G SERDES Link Failed\n", in serdes_init_10g_serdes()
2490 np->port); in serdes_init_10g_serdes()
2498 static int niu_determine_phy_disposition(struct niu *np) in niu_determine_phy_disposition() argument
2500 struct niu_parent *parent = np->parent; in niu_determine_phy_disposition()
2506 switch (np->flags & in niu_determine_phy_disposition()
2521 if (np->flags & NIU_FLAGS_HOTPLUG_PHY) { in niu_determine_phy_disposition()
2523 if (np->port == 0) in niu_determine_phy_disposition()
2525 if (np->port == 1) in niu_determine_phy_disposition()
2529 phy_addr_off += np->port; in niu_determine_phy_disposition()
2534 switch (np->flags & in niu_determine_phy_disposition()
2546 phy_addr_off += (np->port ^ 0x3); in niu_determine_phy_disposition()
2565 phy_addr_off += np->port; in niu_determine_phy_disposition()
2566 if (np->flags & NIU_FLAGS_HOTPLUG_PHY) { in niu_determine_phy_disposition()
2568 if (np->port == 0) in niu_determine_phy_disposition()
2570 if (np->port == 1) in niu_determine_phy_disposition()
2578 switch(np->port) { in niu_determine_phy_disposition()
2590 phy_addr_off = niu_atca_port_num[np->port]; in niu_determine_phy_disposition()
2598 np->phy_ops = tp->ops; in niu_determine_phy_disposition()
2599 np->phy_addr = tp->phy_addr_base + phy_addr_off; in niu_determine_phy_disposition()
2604 static int niu_init_link(struct niu *np) in niu_init_link() argument
2606 struct niu_parent *parent = np->parent; in niu_init_link()
2610 err = niu_xcvr_init(np); in niu_init_link()
2615 err = niu_serdes_init(np); in niu_init_link()
2616 if (err && !(np->flags & NIU_FLAGS_HOTPLUG_PHY)) in niu_init_link()
2619 err = niu_xcvr_init(np); in niu_init_link()
2620 if (!err || (np->flags & NIU_FLAGS_HOTPLUG_PHY)) in niu_init_link()
2621 niu_link_status(np, &ignore); in niu_init_link()
2625 static void niu_set_primary_mac(struct niu *np, const unsigned char *addr) in niu_set_primary_mac() argument
2631 if (np->flags & NIU_FLAGS_XMAC) { in niu_set_primary_mac()
2642 static int niu_num_alt_addr(struct niu *np) in niu_num_alt_addr() argument
2644 if (np->flags & NIU_FLAGS_XMAC) in niu_num_alt_addr()
2650 static int niu_set_alt_mac(struct niu *np, int index, unsigned char *addr) in niu_set_alt_mac() argument
2656 if (index >= niu_num_alt_addr(np)) in niu_set_alt_mac()
2659 if (np->flags & NIU_FLAGS_XMAC) { in niu_set_alt_mac()
2672 static int niu_enable_alt_mac(struct niu *np, int index, int on) in niu_enable_alt_mac() argument
2677 if (index >= niu_num_alt_addr(np)) in niu_enable_alt_mac()
2680 if (np->flags & NIU_FLAGS_XMAC) { in niu_enable_alt_mac()
2698 static void __set_rdc_table_num_hw(struct niu *np, unsigned long reg, in __set_rdc_table_num_hw() argument
2709 static int __set_rdc_table_num(struct niu *np, in __set_rdc_table_num() argument
2717 if (np->flags & NIU_FLAGS_XMAC) in __set_rdc_table_num()
2721 __set_rdc_table_num_hw(np, reg, rdc_table_num, mac_pref); in __set_rdc_table_num()
2725 static int niu_set_primary_mac_rdc_table(struct niu *np, int table_num, in niu_set_primary_mac_rdc_table() argument
2728 return __set_rdc_table_num(np, 17, 0, table_num, mac_pref); in niu_set_primary_mac_rdc_table()
2731 static int niu_set_multicast_mac_rdc_table(struct niu *np, int table_num, in niu_set_multicast_mac_rdc_table() argument
2734 return __set_rdc_table_num(np, 16, 8, table_num, mac_pref); in niu_set_multicast_mac_rdc_table()
2737 static int niu_set_alt_mac_rdc_table(struct niu *np, int idx, in niu_set_alt_mac_rdc_table() argument
2740 if (idx >= niu_num_alt_addr(np)) in niu_set_alt_mac_rdc_table()
2742 return __set_rdc_table_num(np, idx, idx + 1, table_num, mac_pref); in niu_set_alt_mac_rdc_table()
2766 static void vlan_tbl_write(struct niu *np, unsigned long index, in vlan_tbl_write() argument
2784 static void vlan_tbl_clear(struct niu *np) in vlan_tbl_clear() argument
2792 static int tcam_wait_bit(struct niu *np, u64 bit) in tcam_wait_bit() argument
2807 static int tcam_flush(struct niu *np, int index) in tcam_flush() argument
2813 return tcam_wait_bit(np, TCAM_CTL_STAT); in tcam_flush()
2817 static int tcam_read(struct niu *np, int index,
2823 err = tcam_wait_bit(np, TCAM_CTL_STAT);
2838 static int tcam_write(struct niu *np, int index, in tcam_write() argument
2851 return tcam_wait_bit(np, TCAM_CTL_STAT); in tcam_write()
2855 static int tcam_assoc_read(struct niu *np, int index, u64 *data)
2860 err = tcam_wait_bit(np, TCAM_CTL_STAT);
2868 static int tcam_assoc_write(struct niu *np, int index, u64 assoc_data) in tcam_assoc_write() argument
2873 return tcam_wait_bit(np, TCAM_CTL_STAT); in tcam_assoc_write()
2876 static void tcam_enable(struct niu *np, int on) in tcam_enable() argument
2887 static void tcam_set_lat_and_ratio(struct niu *np, u64 latency, u64 ratio) in tcam_set_lat_and_ratio() argument
2903 static int tcam_user_eth_class_enable(struct niu *np, unsigned long class, in tcam_user_eth_class_enable() argument
2925 static int tcam_user_eth_class_set(struct niu *np, unsigned long class,
2946 static int tcam_user_ip_class_enable(struct niu *np, unsigned long class, in tcam_user_ip_class_enable() argument
2967 static int tcam_user_ip_class_set(struct niu *np, unsigned long class, in tcam_user_ip_class_set() argument
2995 static int tcam_early_init(struct niu *np) in tcam_early_init() argument
3000 tcam_enable(np, 0); in tcam_early_init()
3001 tcam_set_lat_and_ratio(np, in tcam_early_init()
3005 err = tcam_user_eth_class_enable(np, i, 0); in tcam_early_init()
3010 err = tcam_user_ip_class_enable(np, i, 0); in tcam_early_init()
3018 static int tcam_flush_all(struct niu *np) in tcam_flush_all() argument
3022 for (i = 0; i < np->parent->tcam_num_entries; i++) { in tcam_flush_all()
3023 int err = tcam_flush(np, i); in tcam_flush_all()
3036 static int hash_read(struct niu *np, unsigned long partition,
3055 static int hash_write(struct niu *np, unsigned long partition, in hash_write() argument
3073 static void fflp_reset(struct niu *np) in fflp_reset() argument
3085 static void fflp_set_timings(struct niu *np) in fflp_set_timings() argument
3104 static int fflp_set_partition(struct niu *np, u64 partition, in fflp_set_partition() argument
3128 static int fflp_disable_all_partitions(struct niu *np) in fflp_disable_all_partitions() argument
3133 int err = fflp_set_partition(np, 0, 0, 0, 0); in fflp_disable_all_partitions()
3140 static void fflp_llcsnap_enable(struct niu *np, int on) in fflp_llcsnap_enable() argument
3151 static void fflp_errors_enable(struct niu *np, int on) in fflp_errors_enable() argument
3162 static int fflp_hash_clear(struct niu *np) in fflp_hash_clear() argument
3172 int err = hash_write(np, 0, i, 1, (u64 *) &ent); in fflp_hash_clear()
3179 static int fflp_early_init(struct niu *np) in fflp_early_init() argument
3185 niu_lock_parent(np, flags); in fflp_early_init()
3187 parent = np->parent; in fflp_early_init()
3190 if (np->parent->plat_type != PLAT_TYPE_NIU) { in fflp_early_init()
3191 fflp_reset(np); in fflp_early_init()
3192 fflp_set_timings(np); in fflp_early_init()
3193 err = fflp_disable_all_partitions(np); in fflp_early_init()
3195 netif_printk(np, probe, KERN_DEBUG, np->dev, in fflp_early_init()
3202 err = tcam_early_init(np); in fflp_early_init()
3204 netif_printk(np, probe, KERN_DEBUG, np->dev, in fflp_early_init()
3208 fflp_llcsnap_enable(np, 1); in fflp_early_init()
3209 fflp_errors_enable(np, 0); in fflp_early_init()
3213 err = tcam_flush_all(np); in fflp_early_init()
3215 netif_printk(np, probe, KERN_DEBUG, np->dev, in fflp_early_init()
3219 if (np->parent->plat_type != PLAT_TYPE_NIU) { in fflp_early_init()
3220 err = fflp_hash_clear(np); in fflp_early_init()
3222 netif_printk(np, probe, KERN_DEBUG, np->dev, in fflp_early_init()
3229 vlan_tbl_clear(np); in fflp_early_init()
3234 niu_unlock_parent(np, flags); in fflp_early_init()
3238 static int niu_set_flow_key(struct niu *np, unsigned long class_code, u64 key) in niu_set_flow_key() argument
3248 static int niu_set_tcam_key(struct niu *np, unsigned long class_code, u64 key) in niu_set_tcam_key() argument
3259 static u16 tcam_get_index(struct niu *np, u16 idx) in tcam_get_index() argument
3262 if (idx >= (np->clas.tcam_sz - 1)) in tcam_get_index()
3264 return np->clas.tcam_top + ((idx+1) * np->parent->num_ports); in tcam_get_index()
3267 static u16 tcam_get_size(struct niu *np) in tcam_get_size() argument
3270 return np->clas.tcam_sz - 1; in tcam_get_size()
3273 static u16 tcam_get_valid_entry_cnt(struct niu *np) in tcam_get_valid_entry_cnt() argument
3276 return np->clas.tcam_valid_entries - 1; in tcam_get_valid_entry_cnt()
3326 static int niu_rbr_add_page(struct niu *np, struct rx_ring_info *rp, in niu_rbr_add_page() argument
3337 addr = np->ops->map_page(np->device, page, 0, in niu_rbr_add_page()
3358 static void niu_rbr_refill(struct niu *np, struct rx_ring_info *rp, gfp_t mask) in niu_rbr_refill() argument
3364 int err = niu_rbr_add_page(np, rp, mask, index); in niu_rbr_refill()
3383 static int niu_rx_pkt_ignore(struct niu *np, struct rx_ring_info *rp) in niu_rx_pkt_ignore() argument
3405 np->ops->unmap_page(np->device, page->index, in niu_rx_pkt_ignore()
3423 static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, in niu_process_rx_pkt() argument
3431 skb = netdev_alloc_skb(np->dev, RX_SKB_ALLOC_SIZE); in niu_process_rx_pkt()
3433 return niu_rx_pkt_ignore(np, rp); in niu_process_rx_pkt()
3474 np->ops->unmap_page(np->device, page->index, in niu_process_rx_pkt()
3494 if (np->dev->features & NETIF_F_RXHASH) in niu_process_rx_pkt()
3506 skb->protocol = eth_type_trans(skb, np->dev); in niu_process_rx_pkt()
3513 static int niu_rbr_fill(struct niu *np, struct rx_ring_info *rp, gfp_t mask) in niu_rbr_fill() argument
3520 err = niu_rbr_add_page(np, rp, mask, index); in niu_rbr_fill()
3531 static void niu_rbr_free(struct niu *np, struct rx_ring_info *rp) in niu_rbr_free() argument
3543 np->ops->unmap_page(np->device, base, PAGE_SIZE, in niu_rbr_free()
3559 static int release_tx_packet(struct niu *np, struct tx_ring_info *rp, int idx) in release_tx_packet() argument
3575 np->ops->unmap_single(np->device, tb->mapping, in release_tx_packet()
3590 np->ops->unmap_page(np->device, tb->mapping, in release_tx_packet()
3603 static void niu_tx_work(struct niu *np, struct tx_ring_info *rp) in niu_tx_work() argument
3610 index = (rp - np->tx_rings); in niu_tx_work()
3611 txq = netdev_get_tx_queue(np->dev, index); in niu_tx_work()
3625 netif_printk(np, tx_done, KERN_DEBUG, np->dev, in niu_tx_work()
3629 cons = release_tx_packet(np, rp, cons); in niu_tx_work()
3645 static inline void niu_sync_rx_discard_stats(struct niu *np, in niu_sync_rx_discard_stats() argument
3674 dev_err(np->device, "rx-%d: Counter overflow RXMISC discard\n", in niu_sync_rx_discard_stats()
3677 netif_printk(np, rx_err, KERN_DEBUG, np->dev, in niu_sync_rx_discard_stats()
3689 dev_err(np->device, "rx-%d: Counter overflow WRED discard\n", rx_channel); in niu_sync_rx_discard_stats()
3691 netif_printk(np, rx_err, KERN_DEBUG, np->dev, in niu_sync_rx_discard_stats()
3697 static int niu_rx_work(struct napi_struct *napi, struct niu *np, in niu_rx_work() argument
3714 netif_printk(np, rx_status, KERN_DEBUG, np->dev, in niu_rx_work()
3721 rcr_done += niu_process_rx_pkt(napi, np, rp); in niu_rx_work()
3729 niu_rbr_refill(np, rp, GFP_ATOMIC); in niu_rx_work()
3741 niu_sync_rx_discard_stats(np, rp, 0x7FFF); in niu_rx_work()
3746 static int niu_poll_core(struct niu *np, struct niu_ldg *lp, int budget) in niu_poll_core() argument
3753 netif_printk(np, intr, KERN_DEBUG, np->dev, in niu_poll_core()
3756 for (i = 0; i < np->num_tx_rings; i++) { in niu_poll_core()
3757 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_poll_core()
3759 niu_tx_work(np, rp); in niu_poll_core()
3763 for (i = 0; i < np->num_rx_rings; i++) { in niu_poll_core()
3764 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_poll_core()
3769 this_work_done = niu_rx_work(&lp->napi, np, rp, in niu_poll_core()
3784 struct niu *np = lp->np; in niu_poll() local
3787 work_done = niu_poll_core(np, lp, budget); in niu_poll()
3791 niu_ldg_rearm(np, lp, 1); in niu_poll()
3796 static void niu_log_rxchan_errors(struct niu *np, struct rx_ring_info *rp, in niu_log_rxchan_errors() argument
3799 netdev_err(np->dev, "RX channel %u errors ( ", rp->rx_channel); in niu_log_rxchan_errors()
3833 static int niu_rx_error(struct niu *np, struct rx_ring_info *rp) in niu_rx_error() argument
3844 netdev_err(np->dev, "RX channel %u error, stat[%llx]\n", in niu_rx_error()
3848 niu_log_rxchan_errors(np, rp, stat); in niu_rx_error()
3857 static void niu_log_txchan_errors(struct niu *np, struct tx_ring_info *rp, in niu_log_txchan_errors() argument
3860 netdev_err(np->dev, "TX channel %u errors ( ", rp->tx_channel); in niu_log_txchan_errors()
3882 static int niu_tx_error(struct niu *np, struct tx_ring_info *rp) in niu_tx_error() argument
3890 netdev_err(np->dev, "TX channel %u error, cs[%llx] logh[%llx] logl[%llx]\n", in niu_tx_error()
3896 niu_log_txchan_errors(np, rp, cs); in niu_tx_error()
3901 static int niu_mif_interrupt(struct niu *np) in niu_mif_interrupt() argument
3906 if (np->flags & NIU_FLAGS_XMAC) { in niu_mif_interrupt()
3913 netdev_err(np->dev, "MIF interrupt, stat[%llx] phy_mdint(%d)\n", in niu_mif_interrupt()
3919 static void niu_xmac_interrupt(struct niu *np) in niu_xmac_interrupt() argument
3921 struct niu_xmac_stats *mp = &np->mac_stats.xmac; in niu_xmac_interrupt()
3989 static void niu_bmac_interrupt(struct niu *np) in niu_bmac_interrupt() argument
3991 struct niu_bmac_stats *mp = &np->mac_stats.bmac; in niu_bmac_interrupt()
4025 static int niu_mac_interrupt(struct niu *np) in niu_mac_interrupt() argument
4027 if (np->flags & NIU_FLAGS_XMAC) in niu_mac_interrupt()
4028 niu_xmac_interrupt(np); in niu_mac_interrupt()
4030 niu_bmac_interrupt(np); in niu_mac_interrupt()
4035 static void niu_log_device_error(struct niu *np, u64 stat) in niu_log_device_error() argument
4037 netdev_err(np->dev, "Core device errors ( "); in niu_log_device_error()
4065 static int niu_device_error(struct niu *np) in niu_device_error() argument
4069 netdev_err(np->dev, "Core device error, stat[%llx]\n", in niu_device_error()
4072 niu_log_device_error(np, stat); in niu_device_error()
4077 static int niu_slowpath_interrupt(struct niu *np, struct niu_ldg *lp, in niu_slowpath_interrupt() argument
4090 for (i = 0; i < np->num_rx_rings; i++) { in niu_slowpath_interrupt()
4091 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_slowpath_interrupt()
4094 int r = niu_rx_error(np, rp); in niu_slowpath_interrupt()
4108 for (i = 0; i < np->num_tx_rings; i++) { in niu_slowpath_interrupt()
4109 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_slowpath_interrupt()
4112 int r = niu_tx_error(np, rp); in niu_slowpath_interrupt()
4119 int r = niu_mif_interrupt(np); in niu_slowpath_interrupt()
4125 int r = niu_mac_interrupt(np); in niu_slowpath_interrupt()
4130 int r = niu_device_error(np); in niu_slowpath_interrupt()
4137 niu_enable_interrupts(np, 0); in niu_slowpath_interrupt()
4142 static void niu_rxchan_intr(struct niu *np, struct rx_ring_info *rp, in niu_rxchan_intr() argument
4152 netif_printk(np, intr, KERN_DEBUG, np->dev, in niu_rxchan_intr()
4156 static void niu_txchan_intr(struct niu *np, struct tx_ring_info *rp, in niu_txchan_intr() argument
4161 netif_printk(np, intr, KERN_DEBUG, np->dev, in niu_txchan_intr()
4165 static void __niu_fastpath_interrupt(struct niu *np, int ldg, u64 v0) in __niu_fastpath_interrupt() argument
4167 struct niu_parent *parent = np->parent; in __niu_fastpath_interrupt()
4174 for (i = 0; i < np->num_rx_rings; i++) { in __niu_fastpath_interrupt()
4175 struct rx_ring_info *rp = &np->rx_rings[i]; in __niu_fastpath_interrupt()
4183 niu_rxchan_intr(np, rp, ldn); in __niu_fastpath_interrupt()
4186 for (i = 0; i < np->num_tx_rings; i++) { in __niu_fastpath_interrupt()
4187 struct tx_ring_info *rp = &np->tx_rings[i]; in __niu_fastpath_interrupt()
4195 niu_txchan_intr(np, rp, ldn); in __niu_fastpath_interrupt()
4199 static void niu_schedule_napi(struct niu *np, struct niu_ldg *lp, in niu_schedule_napi() argument
4206 __niu_fastpath_interrupt(np, lp->ldg_num, v0); in niu_schedule_napi()
4214 struct niu *np = lp->np; in niu_interrupt() local
4219 if (netif_msg_intr(np)) in niu_interrupt()
4223 spin_lock_irqsave(&np->lock, flags); in niu_interrupt()
4229 if (netif_msg_intr(np)) in niu_interrupt()
4236 spin_unlock_irqrestore(&np->lock, flags); in niu_interrupt()
4241 int err = niu_slowpath_interrupt(np, lp, v0, v1, v2); in niu_interrupt()
4246 niu_schedule_napi(np, lp, v0, v1, v2); in niu_interrupt()
4248 niu_ldg_rearm(np, lp, 1); in niu_interrupt()
4250 spin_unlock_irqrestore(&np->lock, flags); in niu_interrupt()
4255 static void niu_free_rx_ring_info(struct niu *np, struct rx_ring_info *rp) in niu_free_rx_ring_info() argument
4258 np->ops->free_coherent(np->device, in niu_free_rx_ring_info()
4264 np->ops->free_coherent(np->device, in niu_free_rx_ring_info()
4272 niu_rbr_free(np, rp); in niu_free_rx_ring_info()
4274 np->ops->free_coherent(np->device, in niu_free_rx_ring_info()
4285 static void niu_free_tx_ring_info(struct niu *np, struct tx_ring_info *rp) in niu_free_tx_ring_info() argument
4288 np->ops->free_coherent(np->device, in niu_free_tx_ring_info()
4298 (void) release_tx_packet(np, rp, i); in niu_free_tx_ring_info()
4301 np->ops->free_coherent(np->device, in niu_free_tx_ring_info()
4312 static void niu_free_channels(struct niu *np) in niu_free_channels() argument
4316 if (np->rx_rings) { in niu_free_channels()
4317 for (i = 0; i < np->num_rx_rings; i++) { in niu_free_channels()
4318 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_free_channels()
4320 niu_free_rx_ring_info(np, rp); in niu_free_channels()
4322 kfree(np->rx_rings); in niu_free_channels()
4323 np->rx_rings = NULL; in niu_free_channels()
4324 np->num_rx_rings = 0; in niu_free_channels()
4327 if (np->tx_rings) { in niu_free_channels()
4328 for (i = 0; i < np->num_tx_rings; i++) { in niu_free_channels()
4329 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_free_channels()
4331 niu_free_tx_ring_info(np, rp); in niu_free_channels()
4333 kfree(np->tx_rings); in niu_free_channels()
4334 np->tx_rings = NULL; in niu_free_channels()
4335 np->num_tx_rings = 0; in niu_free_channels()
4339 static int niu_alloc_rx_ring_info(struct niu *np, in niu_alloc_rx_ring_info() argument
4349 rp->mbox = np->ops->alloc_coherent(np->device, in niu_alloc_rx_ring_info()
4355 netdev_err(np->dev, "Coherent alloc gives misaligned RXDMA mailbox %p\n", in niu_alloc_rx_ring_info()
4360 rp->rcr = np->ops->alloc_coherent(np->device, in niu_alloc_rx_ring_info()
4366 netdev_err(np->dev, "Coherent alloc gives misaligned RXDMA RCR table %p\n", in niu_alloc_rx_ring_info()
4373 rp->rbr = np->ops->alloc_coherent(np->device, in niu_alloc_rx_ring_info()
4379 netdev_err(np->dev, "Coherent alloc gives misaligned RXDMA RBR table %p\n", in niu_alloc_rx_ring_info()
4390 static void niu_set_max_burst(struct niu *np, struct tx_ring_info *rp) in niu_set_max_burst() argument
4392 int mtu = np->dev->mtu; in niu_set_max_burst()
4402 static int niu_alloc_tx_ring_info(struct niu *np, in niu_alloc_tx_ring_info() argument
4407 rp->mbox = np->ops->alloc_coherent(np->device, in niu_alloc_tx_ring_info()
4413 netdev_err(np->dev, "Coherent alloc gives misaligned TXDMA mailbox %p\n", in niu_alloc_tx_ring_info()
4418 rp->descr = np->ops->alloc_coherent(np->device, in niu_alloc_tx_ring_info()
4424 netdev_err(np->dev, "Coherent alloc gives misaligned TXDMA descr table %p\n", in niu_alloc_tx_ring_info()
4437 niu_set_max_burst(np, rp); in niu_alloc_tx_ring_info()
4442 static void niu_size_rbr(struct niu *np, struct rx_ring_info *rp) in niu_size_rbr() argument
4453 if (np->dev->mtu > ETH_DATA_LEN) { in niu_size_rbr()
4469 static int niu_alloc_channels(struct niu *np) in niu_alloc_channels() argument
4471 struct niu_parent *parent = np->parent; in niu_alloc_channels()
4478 port = np->port; in niu_alloc_channels()
4494 np->num_rx_rings = num_rx_rings; in niu_alloc_channels()
4496 np->rx_rings = rx_rings; in niu_alloc_channels()
4498 netif_set_real_num_rx_queues(np->dev, num_rx_rings); in niu_alloc_channels()
4500 for (i = 0; i < np->num_rx_rings; i++) { in niu_alloc_channels()
4501 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_alloc_channels()
4503 rp->np = np; in niu_alloc_channels()
4506 err = niu_alloc_rx_ring_info(np, rp); in niu_alloc_channels()
4510 niu_size_rbr(np, rp); in niu_alloc_channels()
4523 err = niu_rbr_fill(np, rp, GFP_KERNEL); in niu_alloc_channels()
4534 np->num_tx_rings = num_tx_rings; in niu_alloc_channels()
4536 np->tx_rings = tx_rings; in niu_alloc_channels()
4538 netif_set_real_num_tx_queues(np->dev, num_tx_rings); in niu_alloc_channels()
4540 for (i = 0; i < np->num_tx_rings; i++) { in niu_alloc_channels()
4541 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_alloc_channels()
4543 rp->np = np; in niu_alloc_channels()
4546 err = niu_alloc_tx_ring_info(np, rp); in niu_alloc_channels()
4554 niu_free_channels(np); in niu_alloc_channels()
4558 static int niu_tx_cs_sng_poll(struct niu *np, int channel) in niu_tx_cs_sng_poll() argument
4570 static int niu_tx_channel_stop(struct niu *np, int channel) in niu_tx_channel_stop() argument
4577 return niu_tx_cs_sng_poll(np, channel); in niu_tx_channel_stop()
4580 static int niu_tx_cs_reset_poll(struct niu *np, int channel) in niu_tx_cs_reset_poll() argument
4592 static int niu_tx_channel_reset(struct niu *np, int channel) in niu_tx_channel_reset() argument
4600 err = niu_tx_cs_reset_poll(np, channel); in niu_tx_channel_reset()
4607 static int niu_tx_channel_lpage_init(struct niu *np, int channel) in niu_tx_channel_lpage_init() argument
4619 val = (u64)np->port << TX_LOG_PAGE_VLD_FUNC_SHIFT; in niu_tx_channel_lpage_init()
4628 static void niu_txc_enable_port(struct niu *np, int on) in niu_txc_enable_port() argument
4633 niu_lock_parent(np, flags); in niu_txc_enable_port()
4635 mask = (u64)1 << np->port; in niu_txc_enable_port()
4644 niu_unlock_parent(np, flags); in niu_txc_enable_port()
4647 static void niu_txc_set_imask(struct niu *np, u64 imask) in niu_txc_set_imask() argument
4652 niu_lock_parent(np, flags); in niu_txc_set_imask()
4654 val &= ~TXC_INT_MASK_VAL(np->port); in niu_txc_set_imask()
4655 val |= (imask << TXC_INT_MASK_VAL_SHIFT(np->port)); in niu_txc_set_imask()
4656 niu_unlock_parent(np, flags); in niu_txc_set_imask()
4659 static void niu_txc_port_dma_enable(struct niu *np, int on) in niu_txc_port_dma_enable() argument
4666 for (i = 0; i < np->num_tx_rings; i++) in niu_txc_port_dma_enable()
4667 val |= (1 << np->tx_rings[i].tx_channel); in niu_txc_port_dma_enable()
4669 nw64(TXC_PORT_DMA(np->port), val); in niu_txc_port_dma_enable()
4672 static int niu_init_one_tx_channel(struct niu *np, struct tx_ring_info *rp) in niu_init_one_tx_channel() argument
4677 err = niu_tx_channel_stop(np, channel); in niu_init_one_tx_channel()
4681 err = niu_tx_channel_reset(np, channel); in niu_init_one_tx_channel()
4685 err = niu_tx_channel_lpage_init(np, channel); in niu_init_one_tx_channel()
4694 netdev_err(np->dev, "TX ring channel %d DMA addr (%llx) is not aligned\n", in niu_init_one_tx_channel()
4712 netdev_err(np->dev, "TX ring channel %d MBOX addr (%llx) has invalid bits\n", in niu_init_one_tx_channel()
4726 static void niu_init_rdc_groups(struct niu *np) in niu_init_rdc_groups() argument
4728 struct niu_rdc_tables *tp = &np->parent->rdc_group_cfg[np->port]; in niu_init_rdc_groups()
4741 nw64(DEF_RDC(np->port), np->parent->rdc_default[np->port]); in niu_init_rdc_groups()
4744 static void niu_init_drr_weight(struct niu *np) in niu_init_drr_weight() argument
4746 int type = phy_decode(np->parent->port_phy, np->port); in niu_init_drr_weight()
4759 nw64(PT_DRR_WT(np->port), val); in niu_init_drr_weight()
4762 static int niu_init_hostinfo(struct niu *np) in niu_init_hostinfo() argument
4764 struct niu_parent *parent = np->parent; in niu_init_hostinfo()
4765 struct niu_rdc_tables *tp = &parent->rdc_group_cfg[np->port]; in niu_init_hostinfo()
4766 int i, err, num_alt = niu_num_alt_addr(np); in niu_init_hostinfo()
4769 err = niu_set_primary_mac_rdc_table(np, first_rdc_table, 1); in niu_init_hostinfo()
4773 err = niu_set_multicast_mac_rdc_table(np, first_rdc_table, 1); in niu_init_hostinfo()
4778 err = niu_set_alt_mac_rdc_table(np, i, first_rdc_table, 1); in niu_init_hostinfo()
4786 static int niu_rx_channel_reset(struct niu *np, int channel) in niu_rx_channel_reset() argument
4788 return niu_set_and_wait_clear(np, RXDMA_CFIG1(channel), in niu_rx_channel_reset()
4793 static int niu_rx_channel_lpage_init(struct niu *np, int channel) in niu_rx_channel_lpage_init() argument
4805 val = (u64)np->port << RX_LOG_PAGE_VLD_FUNC_SHIFT; in niu_rx_channel_lpage_init()
4812 static void niu_rx_channel_wred_init(struct niu *np, struct rx_ring_info *rp) in niu_rx_channel_wred_init() argument
4903 static int niu_enable_rx_channel(struct niu *np, int channel, int on) in niu_enable_rx_channel() argument
4925 static int niu_init_one_rx_channel(struct niu *np, struct rx_ring_info *rp) in niu_init_one_rx_channel() argument
4930 err = niu_rx_channel_reset(np, channel); in niu_init_one_rx_channel()
4934 err = niu_rx_channel_lpage_init(np, channel); in niu_init_one_rx_channel()
4938 niu_rx_channel_wred_init(np, rp); in niu_init_one_rx_channel()
4965 err = niu_enable_rx_channel(np, channel, 1); in niu_init_one_rx_channel()
4978 static int niu_init_rx_channels(struct niu *np) in niu_init_rx_channels() argument
4984 niu_lock_parent(np, flags); in niu_init_rx_channels()
4985 nw64(RX_DMA_CK_DIV, np->parent->rxdma_clock_divider); in niu_init_rx_channels()
4987 niu_unlock_parent(np, flags); in niu_init_rx_channels()
4991 niu_init_rdc_groups(np); in niu_init_rx_channels()
4992 niu_init_drr_weight(np); in niu_init_rx_channels()
4994 err = niu_init_hostinfo(np); in niu_init_rx_channels()
4998 for (i = 0; i < np->num_rx_rings; i++) { in niu_init_rx_channels()
4999 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_init_rx_channels()
5001 err = niu_init_one_rx_channel(np, rp); in niu_init_rx_channels()
5009 static int niu_set_ip_frag_rule(struct niu *np) in niu_set_ip_frag_rule() argument
5011 struct niu_parent *parent = np->parent; in niu_set_ip_frag_rule()
5012 struct niu_classifier *cp = &np->clas; in niu_set_ip_frag_rule()
5027 err = tcam_write(np, index, tp->key, tp->key_mask); in niu_set_ip_frag_rule()
5030 err = tcam_assoc_write(np, index, tp->assoc_data); in niu_set_ip_frag_rule()
5039 static int niu_init_classifier_hw(struct niu *np) in niu_init_classifier_hw() argument
5041 struct niu_parent *parent = np->parent; in niu_init_classifier_hw()
5042 struct niu_classifier *cp = &np->clas; in niu_init_classifier_hw()
5048 err = niu_init_hostinfo(np); in niu_init_classifier_hw()
5055 vlan_tbl_write(np, i, np->port, in niu_init_classifier_hw()
5062 err = niu_set_alt_mac_rdc_table(np, ap->alt_mac_num, in niu_init_classifier_hw()
5071 err = niu_set_tcam_key(np, i, parent->tcam_key[index]); in niu_init_classifier_hw()
5074 err = niu_set_flow_key(np, i, parent->flow_key[index]); in niu_init_classifier_hw()
5079 err = niu_set_ip_frag_rule(np); in niu_init_classifier_hw()
5083 tcam_enable(np, 1); in niu_init_classifier_hw()
5088 static int niu_zcp_write(struct niu *np, int index, u64 *data) in niu_zcp_write() argument
5099 (ZCP_RAM_SEL_CFIFO(np->port) << ZCP_RAM_ACC_RAM_SEL_SHIFT))); in niu_zcp_write()
5101 return niu_wait_bits_clear(np, ZCP_RAM_ACC, ZCP_RAM_ACC_BUSY, in niu_zcp_write()
5105 static int niu_zcp_read(struct niu *np, int index, u64 *data) in niu_zcp_read() argument
5109 err = niu_wait_bits_clear(np, ZCP_RAM_ACC, ZCP_RAM_ACC_BUSY, in niu_zcp_read()
5112 netdev_err(np->dev, "ZCP read busy won't clear, ZCP_RAM_ACC[%llx]\n", in niu_zcp_read()
5120 (ZCP_RAM_SEL_CFIFO(np->port) << ZCP_RAM_ACC_RAM_SEL_SHIFT))); in niu_zcp_read()
5122 err = niu_wait_bits_clear(np, ZCP_RAM_ACC, ZCP_RAM_ACC_BUSY, in niu_zcp_read()
5125 netdev_err(np->dev, "ZCP read busy2 won't clear, ZCP_RAM_ACC[%llx]\n", in niu_zcp_read()
5139 static void niu_zcp_cfifo_reset(struct niu *np) in niu_zcp_cfifo_reset() argument
5143 val |= RESET_CFIFO_RST(np->port); in niu_zcp_cfifo_reset()
5147 val &= ~RESET_CFIFO_RST(np->port); in niu_zcp_cfifo_reset()
5151 static int niu_init_zcp(struct niu *np) in niu_init_zcp() argument
5156 if (np->parent->plat_type != PLAT_TYPE_NIU) { in niu_init_zcp()
5157 if (np->port == 0 || np->port == 1) in niu_init_zcp()
5171 err = niu_zcp_write(np, i, data); in niu_init_zcp()
5174 err = niu_zcp_read(np, i, rbuf); in niu_init_zcp()
5179 niu_zcp_cfifo_reset(np); in niu_init_zcp()
5180 nw64(CFIFO_ECC(np->port), 0); in niu_init_zcp()
5188 static void niu_ipp_write(struct niu *np, int index, u64 *data) in niu_ipp_write() argument
5202 static void niu_ipp_read(struct niu *np, int index, u64 *data) in niu_ipp_read() argument
5212 static int niu_ipp_reset(struct niu *np) in niu_ipp_reset() argument
5214 return niu_set_and_wait_clear_ipp(np, IPP_CFIG, IPP_CFIG_SOFT_RST, in niu_ipp_reset()
5218 static int niu_init_ipp(struct niu *np) in niu_init_ipp() argument
5223 if (np->parent->plat_type != PLAT_TYPE_NIU) { in niu_init_ipp()
5224 if (np->port == 0 || np->port == 1) in niu_init_ipp()
5238 niu_ipp_write(np, i, data); in niu_init_ipp()
5239 niu_ipp_read(np, i, rbuf); in niu_init_ipp()
5245 err = niu_ipp_reset(np); in niu_init_ipp()
5269 static void niu_handle_led(struct niu *np, int status) in niu_handle_led() argument
5274 if ((np->flags & NIU_FLAGS_10G) != 0 && in niu_handle_led()
5275 (np->flags & NIU_FLAGS_FIBER) != 0) { in niu_handle_led()
5288 static void niu_init_xif_xmac(struct niu *np) in niu_init_xif_xmac() argument
5290 struct niu_link_config *lp = &np->link_config; in niu_init_xif_xmac()
5293 if (np->flags & NIU_FLAGS_XCVR_SERDES) { in niu_init_xif_xmac()
5311 if (np->flags & NIU_FLAGS_10G) { in niu_init_xif_xmac()
5315 if (!(np->flags & NIU_FLAGS_FIBER) && in niu_init_xif_xmac()
5316 !(np->flags & NIU_FLAGS_XCVR_SERDES)) in niu_init_xif_xmac()
5333 if (np->flags & NIU_FLAGS_10G) { in niu_init_xif_xmac()
5345 static void niu_init_xif_bmac(struct niu *np) in niu_init_xif_bmac() argument
5347 struct niu_link_config *lp = &np->link_config; in niu_init_xif_bmac()
5365 if (!(np->flags & NIU_FLAGS_10G) && in niu_init_xif_bmac()
5366 !(np->flags & NIU_FLAGS_FIBER) && in niu_init_xif_bmac()
5375 static void niu_init_xif(struct niu *np) in niu_init_xif() argument
5377 if (np->flags & NIU_FLAGS_XMAC) in niu_init_xif()
5378 niu_init_xif_xmac(np); in niu_init_xif()
5380 niu_init_xif_bmac(np); in niu_init_xif()
5383 static void niu_pcs_mii_reset(struct niu *np) in niu_pcs_mii_reset() argument
5395 static void niu_xpcs_reset(struct niu *np) in niu_xpcs_reset() argument
5407 static int niu_init_pcs(struct niu *np) in niu_init_pcs() argument
5409 struct niu_link_config *lp = &np->link_config; in niu_init_pcs()
5412 switch (np->flags & (NIU_FLAGS_10G | in niu_init_pcs()
5419 niu_pcs_mii_reset(np); in niu_init_pcs()
5426 if (!(np->flags & NIU_FLAGS_XMAC)) in niu_init_pcs()
5434 niu_xpcs_reset(np); in niu_init_pcs()
5451 niu_pcs_mii_reset(np); in niu_init_pcs()
5461 niu_pcs_mii_reset(np); in niu_init_pcs()
5471 static int niu_reset_tx_xmac(struct niu *np) in niu_reset_tx_xmac() argument
5473 return niu_set_and_wait_clear_mac(np, XTXMAC_SW_RST, in niu_reset_tx_xmac()
5479 static int niu_reset_tx_bmac(struct niu *np) in niu_reset_tx_bmac() argument
5491 dev_err(np->device, "Port %u TX BMAC would not reset, BTXMAC_SW_RST[%llx]\n", in niu_reset_tx_bmac()
5492 np->port, in niu_reset_tx_bmac()
5500 static int niu_reset_tx_mac(struct niu *np) in niu_reset_tx_mac() argument
5502 if (np->flags & NIU_FLAGS_XMAC) in niu_reset_tx_mac()
5503 return niu_reset_tx_xmac(np); in niu_reset_tx_mac()
5505 return niu_reset_tx_bmac(np); in niu_reset_tx_mac()
5508 static void niu_init_tx_xmac(struct niu *np, u64 min, u64 max) in niu_init_tx_xmac() argument
5524 if (np->flags & NIU_FLAGS_10G) { in niu_init_tx_xmac()
5544 static void niu_init_tx_bmac(struct niu *np, u64 min, u64 max) in niu_init_tx_bmac() argument
5561 static void niu_init_tx_mac(struct niu *np) in niu_init_tx_mac() argument
5566 if (np->dev->mtu > ETH_DATA_LEN) in niu_init_tx_mac()
5576 if (np->flags & NIU_FLAGS_XMAC) in niu_init_tx_mac()
5577 niu_init_tx_xmac(np, min, max); in niu_init_tx_mac()
5579 niu_init_tx_bmac(np, min, max); in niu_init_tx_mac()
5582 static int niu_reset_rx_xmac(struct niu *np) in niu_reset_rx_xmac() argument
5596 dev_err(np->device, "Port %u RX XMAC would not reset, XRXMAC_SW_RST[%llx]\n", in niu_reset_rx_xmac()
5597 np->port, in niu_reset_rx_xmac()
5605 static int niu_reset_rx_bmac(struct niu *np) in niu_reset_rx_bmac() argument
5617 dev_err(np->device, "Port %u RX BMAC would not reset, BRXMAC_SW_RST[%llx]\n", in niu_reset_rx_bmac()
5618 np->port, in niu_reset_rx_bmac()
5626 static int niu_reset_rx_mac(struct niu *np) in niu_reset_rx_mac() argument
5628 if (np->flags & NIU_FLAGS_XMAC) in niu_reset_rx_mac()
5629 return niu_reset_rx_xmac(np); in niu_reset_rx_mac()
5631 return niu_reset_rx_bmac(np); in niu_reset_rx_mac()
5634 static void niu_init_rx_xmac(struct niu *np) in niu_init_rx_xmac() argument
5636 struct niu_parent *parent = np->parent; in niu_init_rx_xmac()
5637 struct niu_rdc_tables *tp = &parent->rdc_group_cfg[np->port]; in niu_init_rx_xmac()
5650 niu_set_primary_mac_rdc_table(np, first_rdc_table, 1); in niu_init_rx_xmac()
5651 niu_set_multicast_mac_rdc_table(np, first_rdc_table, 1); in niu_init_rx_xmac()
5686 static void niu_init_rx_bmac(struct niu *np) in niu_init_rx_bmac() argument
5688 struct niu_parent *parent = np->parent; in niu_init_rx_bmac()
5689 struct niu_rdc_tables *tp = &parent->rdc_group_cfg[np->port]; in niu_init_rx_bmac()
5701 niu_set_primary_mac_rdc_table(np, first_rdc_table, 1); in niu_init_rx_bmac()
5702 niu_set_multicast_mac_rdc_table(np, first_rdc_table, 1); in niu_init_rx_bmac()
5721 static void niu_init_rx_mac(struct niu *np) in niu_init_rx_mac() argument
5723 niu_set_primary_mac(np, np->dev->dev_addr); in niu_init_rx_mac()
5725 if (np->flags & NIU_FLAGS_XMAC) in niu_init_rx_mac()
5726 niu_init_rx_xmac(np); in niu_init_rx_mac()
5728 niu_init_rx_bmac(np); in niu_init_rx_mac()
5731 static void niu_enable_tx_xmac(struct niu *np, int on) in niu_enable_tx_xmac() argument
5742 static void niu_enable_tx_bmac(struct niu *np, int on) in niu_enable_tx_bmac() argument
5753 static void niu_enable_tx_mac(struct niu *np, int on) in niu_enable_tx_mac() argument
5755 if (np->flags & NIU_FLAGS_XMAC) in niu_enable_tx_mac()
5756 niu_enable_tx_xmac(np, on); in niu_enable_tx_mac()
5758 niu_enable_tx_bmac(np, on); in niu_enable_tx_mac()
5761 static void niu_enable_rx_xmac(struct niu *np, int on) in niu_enable_rx_xmac() argument
5768 if (np->flags & NIU_FLAGS_MCAST) in niu_enable_rx_xmac()
5770 if (np->flags & NIU_FLAGS_PROMISC) in niu_enable_rx_xmac()
5780 static void niu_enable_rx_bmac(struct niu *np, int on) in niu_enable_rx_bmac() argument
5787 if (np->flags & NIU_FLAGS_MCAST) in niu_enable_rx_bmac()
5789 if (np->flags & NIU_FLAGS_PROMISC) in niu_enable_rx_bmac()
5799 static void niu_enable_rx_mac(struct niu *np, int on) in niu_enable_rx_mac() argument
5801 if (np->flags & NIU_FLAGS_XMAC) in niu_enable_rx_mac()
5802 niu_enable_rx_xmac(np, on); in niu_enable_rx_mac()
5804 niu_enable_rx_bmac(np, on); in niu_enable_rx_mac()
5807 static int niu_init_mac(struct niu *np) in niu_init_mac() argument
5811 niu_init_xif(np); in niu_init_mac()
5812 err = niu_init_pcs(np); in niu_init_mac()
5816 err = niu_reset_tx_mac(np); in niu_init_mac()
5819 niu_init_tx_mac(np); in niu_init_mac()
5820 err = niu_reset_rx_mac(np); in niu_init_mac()
5823 niu_init_rx_mac(np); in niu_init_mac()
5830 niu_init_tx_mac(np); in niu_init_mac()
5831 niu_enable_tx_mac(np, 1); in niu_init_mac()
5833 niu_enable_rx_mac(np, 1); in niu_init_mac()
5838 static void niu_stop_one_tx_channel(struct niu *np, struct tx_ring_info *rp) in niu_stop_one_tx_channel() argument
5840 (void) niu_tx_channel_stop(np, rp->tx_channel); in niu_stop_one_tx_channel()
5843 static void niu_stop_tx_channels(struct niu *np) in niu_stop_tx_channels() argument
5847 for (i = 0; i < np->num_tx_rings; i++) { in niu_stop_tx_channels()
5848 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_stop_tx_channels()
5850 niu_stop_one_tx_channel(np, rp); in niu_stop_tx_channels()
5854 static void niu_reset_one_tx_channel(struct niu *np, struct tx_ring_info *rp) in niu_reset_one_tx_channel() argument
5856 (void) niu_tx_channel_reset(np, rp->tx_channel); in niu_reset_one_tx_channel()
5859 static void niu_reset_tx_channels(struct niu *np) in niu_reset_tx_channels() argument
5863 for (i = 0; i < np->num_tx_rings; i++) { in niu_reset_tx_channels()
5864 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_reset_tx_channels()
5866 niu_reset_one_tx_channel(np, rp); in niu_reset_tx_channels()
5870 static void niu_stop_one_rx_channel(struct niu *np, struct rx_ring_info *rp) in niu_stop_one_rx_channel() argument
5872 (void) niu_enable_rx_channel(np, rp->rx_channel, 0); in niu_stop_one_rx_channel()
5875 static void niu_stop_rx_channels(struct niu *np) in niu_stop_rx_channels() argument
5879 for (i = 0; i < np->num_rx_rings; i++) { in niu_stop_rx_channels()
5880 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_stop_rx_channels()
5882 niu_stop_one_rx_channel(np, rp); in niu_stop_rx_channels()
5886 static void niu_reset_one_rx_channel(struct niu *np, struct rx_ring_info *rp) in niu_reset_one_rx_channel() argument
5890 (void) niu_rx_channel_reset(np, channel); in niu_reset_one_rx_channel()
5893 (void) niu_enable_rx_channel(np, channel, 0); in niu_reset_one_rx_channel()
5896 static void niu_reset_rx_channels(struct niu *np) in niu_reset_rx_channels() argument
5900 for (i = 0; i < np->num_rx_rings; i++) { in niu_reset_rx_channels()
5901 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_reset_rx_channels()
5903 niu_reset_one_rx_channel(np, rp); in niu_reset_rx_channels()
5907 static void niu_disable_ipp(struct niu *np) in niu_disable_ipp() argument
5921 netdev_err(np->dev, "IPP would not quiesce, rd_ptr[%llx] wr_ptr[%llx]\n", in niu_disable_ipp()
5933 (void) niu_ipp_reset(np); in niu_disable_ipp()
5936 static int niu_init_hw(struct niu *np) in niu_init_hw() argument
5940 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize TXC\n"); in niu_init_hw()
5941 niu_txc_enable_port(np, 1); in niu_init_hw()
5942 niu_txc_port_dma_enable(np, 1); in niu_init_hw()
5943 niu_txc_set_imask(np, 0); in niu_init_hw()
5945 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize TX channels\n"); in niu_init_hw()
5946 for (i = 0; i < np->num_tx_rings; i++) { in niu_init_hw()
5947 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_init_hw()
5949 err = niu_init_one_tx_channel(np, rp); in niu_init_hw()
5954 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize RX channels\n"); in niu_init_hw()
5955 err = niu_init_rx_channels(np); in niu_init_hw()
5959 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize classifier\n"); in niu_init_hw()
5960 err = niu_init_classifier_hw(np); in niu_init_hw()
5964 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize ZCP\n"); in niu_init_hw()
5965 err = niu_init_zcp(np); in niu_init_hw()
5969 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize IPP\n"); in niu_init_hw()
5970 err = niu_init_ipp(np); in niu_init_hw()
5974 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Initialize MAC\n"); in niu_init_hw()
5975 err = niu_init_mac(np); in niu_init_hw()
5982 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Uninit IPP\n"); in niu_init_hw()
5983 niu_disable_ipp(np); in niu_init_hw()
5986 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Uninit RX channels\n"); in niu_init_hw()
5987 niu_stop_rx_channels(np); in niu_init_hw()
5988 niu_reset_rx_channels(np); in niu_init_hw()
5991 netif_printk(np, ifup, KERN_DEBUG, np->dev, "Uninit TX channels\n"); in niu_init_hw()
5992 niu_stop_tx_channels(np); in niu_init_hw()
5993 niu_reset_tx_channels(np); in niu_init_hw()
5998 static void niu_stop_hw(struct niu *np) in niu_stop_hw() argument
6000 netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Disable interrupts\n"); in niu_stop_hw()
6001 niu_enable_interrupts(np, 0); in niu_stop_hw()
6003 netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Disable RX MAC\n"); in niu_stop_hw()
6004 niu_enable_rx_mac(np, 0); in niu_stop_hw()
6006 netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Disable IPP\n"); in niu_stop_hw()
6007 niu_disable_ipp(np); in niu_stop_hw()
6009 netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Stop TX channels\n"); in niu_stop_hw()
6010 niu_stop_tx_channels(np); in niu_stop_hw()
6012 netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Stop RX channels\n"); in niu_stop_hw()
6013 niu_stop_rx_channels(np); in niu_stop_hw()
6015 netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Reset TX channels\n"); in niu_stop_hw()
6016 niu_reset_tx_channels(np); in niu_stop_hw()
6018 netif_printk(np, ifdown, KERN_DEBUG, np->dev, "Reset RX channels\n"); in niu_stop_hw()
6019 niu_reset_rx_channels(np); in niu_stop_hw()
6022 static void niu_set_irq_name(struct niu *np) in niu_set_irq_name() argument
6024 int port = np->port; in niu_set_irq_name()
6027 sprintf(np->irq_name[0], "%s:MAC", np->dev->name); in niu_set_irq_name()
6030 sprintf(np->irq_name[1], "%s:MIF", np->dev->name); in niu_set_irq_name()
6031 sprintf(np->irq_name[2], "%s:SYSERR", np->dev->name); in niu_set_irq_name()
6035 for (i = 0; i < np->num_ldg - j; i++) { in niu_set_irq_name()
6036 if (i < np->num_rx_rings) in niu_set_irq_name()
6037 sprintf(np->irq_name[i+j], "%s-rx-%d", in niu_set_irq_name()
6038 np->dev->name, i); in niu_set_irq_name()
6039 else if (i < np->num_tx_rings + np->num_rx_rings) in niu_set_irq_name()
6040 sprintf(np->irq_name[i+j], "%s-tx-%d", np->dev->name, in niu_set_irq_name()
6041 i - np->num_rx_rings); in niu_set_irq_name()
6045 static int niu_request_irq(struct niu *np) in niu_request_irq() argument
6049 niu_set_irq_name(np); in niu_request_irq()
6052 for (i = 0; i < np->num_ldg; i++) { in niu_request_irq()
6053 struct niu_ldg *lp = &np->ldg[i]; in niu_request_irq()
6056 np->irq_name[i], lp); in niu_request_irq()
6066 struct niu_ldg *lp = &np->ldg[j]; in niu_request_irq()
6073 static void niu_free_irq(struct niu *np) in niu_free_irq() argument
6077 for (i = 0; i < np->num_ldg; i++) { in niu_free_irq()
6078 struct niu_ldg *lp = &np->ldg[i]; in niu_free_irq()
6084 static void niu_enable_napi(struct niu *np) in niu_enable_napi() argument
6088 for (i = 0; i < np->num_ldg; i++) in niu_enable_napi()
6089 napi_enable(&np->ldg[i].napi); in niu_enable_napi()
6092 static void niu_disable_napi(struct niu *np) in niu_disable_napi() argument
6096 for (i = 0; i < np->num_ldg; i++) in niu_disable_napi()
6097 napi_disable(&np->ldg[i].napi); in niu_disable_napi()
6102 struct niu *np = netdev_priv(dev); in niu_open() local
6107 err = niu_alloc_channels(np); in niu_open()
6111 err = niu_enable_interrupts(np, 0); in niu_open()
6115 err = niu_request_irq(np); in niu_open()
6119 niu_enable_napi(np); in niu_open()
6121 spin_lock_irq(&np->lock); in niu_open()
6123 err = niu_init_hw(np); in niu_open()
6125 timer_setup(&np->timer, niu_timer, 0); in niu_open()
6126 np->timer.expires = jiffies + HZ; in niu_open()
6128 err = niu_enable_interrupts(np, 1); in niu_open()
6130 niu_stop_hw(np); in niu_open()
6133 spin_unlock_irq(&np->lock); in niu_open()
6136 niu_disable_napi(np); in niu_open()
6142 if (np->link_config.loopback_mode != LOOPBACK_DISABLED) in niu_open()
6145 add_timer(&np->timer); in niu_open()
6150 niu_free_irq(np); in niu_open()
6153 niu_free_channels(np); in niu_open()
6159 static void niu_full_shutdown(struct niu *np, struct net_device *dev) in niu_full_shutdown() argument
6161 cancel_work_sync(&np->reset_task); in niu_full_shutdown()
6163 niu_disable_napi(np); in niu_full_shutdown()
6166 del_timer_sync(&np->timer); in niu_full_shutdown()
6168 spin_lock_irq(&np->lock); in niu_full_shutdown()
6170 niu_stop_hw(np); in niu_full_shutdown()
6172 spin_unlock_irq(&np->lock); in niu_full_shutdown()
6177 struct niu *np = netdev_priv(dev); in niu_close() local
6179 niu_full_shutdown(np, dev); in niu_close()
6181 niu_free_irq(np); in niu_close()
6183 niu_free_channels(np); in niu_close()
6185 niu_handle_led(np, 0); in niu_close()
6190 static void niu_sync_xmac_stats(struct niu *np) in niu_sync_xmac_stats() argument
6192 struct niu_xmac_stats *mp = &np->mac_stats.xmac; in niu_sync_xmac_stats()
6215 static void niu_sync_bmac_stats(struct niu *np) in niu_sync_bmac_stats() argument
6217 struct niu_bmac_stats *mp = &np->mac_stats.bmac; in niu_sync_bmac_stats()
6228 static void niu_sync_mac_stats(struct niu *np) in niu_sync_mac_stats() argument
6230 if (np->flags & NIU_FLAGS_XMAC) in niu_sync_mac_stats()
6231 niu_sync_xmac_stats(np); in niu_sync_mac_stats()
6233 niu_sync_bmac_stats(np); in niu_sync_mac_stats()
6236 static void niu_get_rx_stats(struct niu *np, in niu_get_rx_stats() argument
6245 rx_rings = READ_ONCE(np->rx_rings); in niu_get_rx_stats()
6249 for (i = 0; i < np->num_rx_rings; i++) { in niu_get_rx_stats()
6252 niu_sync_rx_discard_stats(np, rp, 0); in niu_get_rx_stats()
6267 static void niu_get_tx_stats(struct niu *np, in niu_get_tx_stats() argument
6276 tx_rings = READ_ONCE(np->tx_rings); in niu_get_tx_stats()
6280 for (i = 0; i < np->num_tx_rings; i++) { in niu_get_tx_stats()
6297 struct niu *np = netdev_priv(dev); in niu_get_stats() local
6300 niu_get_rx_stats(np, stats); in niu_get_stats()
6301 niu_get_tx_stats(np, stats); in niu_get_stats()
6305 static void niu_load_hash_xmac(struct niu *np, u16 *hash) in niu_load_hash_xmac() argument
6313 static void niu_load_hash_bmac(struct niu *np, u16 *hash) in niu_load_hash_bmac() argument
6321 static void niu_load_hash(struct niu *np, u16 *hash) in niu_load_hash() argument
6323 if (np->flags & NIU_FLAGS_XMAC) in niu_load_hash()
6324 niu_load_hash_xmac(np, hash); in niu_load_hash()
6326 niu_load_hash_bmac(np, hash); in niu_load_hash()
6331 struct niu *np = netdev_priv(dev); in niu_set_rx_mode() local
6337 spin_lock_irqsave(&np->lock, flags); in niu_set_rx_mode()
6338 niu_enable_rx_mac(np, 0); in niu_set_rx_mode()
6340 np->flags &= ~(NIU_FLAGS_MCAST | NIU_FLAGS_PROMISC); in niu_set_rx_mode()
6342 np->flags |= NIU_FLAGS_PROMISC; in niu_set_rx_mode()
6344 np->flags |= NIU_FLAGS_MCAST; in niu_set_rx_mode()
6347 if (alt_cnt > niu_num_alt_addr(np)) { in niu_set_rx_mode()
6349 np->flags |= NIU_FLAGS_PROMISC; in niu_set_rx_mode()
6356 err = niu_set_alt_mac(np, index, ha->addr); in niu_set_rx_mode()
6360 err = niu_enable_alt_mac(np, index, 1); in niu_set_rx_mode()
6369 if (np->flags & NIU_FLAGS_XMAC) in niu_set_rx_mode()
6373 for (i = alt_start; i < niu_num_alt_addr(np); i++) { in niu_set_rx_mode()
6374 err = niu_enable_alt_mac(np, i, 0); in niu_set_rx_mode()
6392 if (np->flags & NIU_FLAGS_MCAST) in niu_set_rx_mode()
6393 niu_load_hash(np, hash); in niu_set_rx_mode()
6395 niu_enable_rx_mac(np, 1); in niu_set_rx_mode()
6396 spin_unlock_irqrestore(&np->lock, flags); in niu_set_rx_mode()
6401 struct niu *np = netdev_priv(dev); in niu_set_mac_addr() local
6413 spin_lock_irqsave(&np->lock, flags); in niu_set_mac_addr()
6414 niu_enable_rx_mac(np, 0); in niu_set_mac_addr()
6415 niu_set_primary_mac(np, dev->dev_addr); in niu_set_mac_addr()
6416 niu_enable_rx_mac(np, 1); in niu_set_mac_addr()
6417 spin_unlock_irqrestore(&np->lock, flags); in niu_set_mac_addr()
6427 static void niu_netif_stop(struct niu *np) in niu_netif_stop() argument
6429 netif_trans_update(np->dev); /* prevent tx timeout */ in niu_netif_stop()
6431 niu_disable_napi(np); in niu_netif_stop()
6433 netif_tx_disable(np->dev); in niu_netif_stop()
6436 static void niu_netif_start(struct niu *np) in niu_netif_start() argument
6442 netif_tx_wake_all_queues(np->dev); in niu_netif_start()
6444 niu_enable_napi(np); in niu_netif_start()
6446 niu_enable_interrupts(np, 1); in niu_netif_start()
6449 static void niu_reset_buffers(struct niu *np) in niu_reset_buffers() argument
6453 if (np->rx_rings) { in niu_reset_buffers()
6454 for (i = 0; i < np->num_rx_rings; i++) { in niu_reset_buffers()
6455 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_reset_buffers()
6470 err = niu_rbr_add_page(np, rp, GFP_ATOMIC, k); in niu_reset_buffers()
6481 if (np->tx_rings) { in niu_reset_buffers()
6482 for (i = 0; i < np->num_tx_rings; i++) { in niu_reset_buffers()
6483 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_reset_buffers()
6487 (void) release_tx_packet(np, rp, j); in niu_reset_buffers()
6500 struct niu *np = container_of(work, struct niu, reset_task); in niu_reset_task() local
6504 spin_lock_irqsave(&np->lock, flags); in niu_reset_task()
6505 if (!netif_running(np->dev)) { in niu_reset_task()
6506 spin_unlock_irqrestore(&np->lock, flags); in niu_reset_task()
6510 spin_unlock_irqrestore(&np->lock, flags); in niu_reset_task()
6512 del_timer_sync(&np->timer); in niu_reset_task()
6514 niu_netif_stop(np); in niu_reset_task()
6516 spin_lock_irqsave(&np->lock, flags); in niu_reset_task()
6518 niu_stop_hw(np); in niu_reset_task()
6520 spin_unlock_irqrestore(&np->lock, flags); in niu_reset_task()
6522 niu_reset_buffers(np); in niu_reset_task()
6524 spin_lock_irqsave(&np->lock, flags); in niu_reset_task()
6526 err = niu_init_hw(np); in niu_reset_task()
6528 np->timer.expires = jiffies + HZ; in niu_reset_task()
6529 add_timer(&np->timer); in niu_reset_task()
6530 niu_netif_start(np); in niu_reset_task()
6533 spin_unlock_irqrestore(&np->lock, flags); in niu_reset_task()
6538 struct niu *np = netdev_priv(dev); in niu_tx_timeout() local
6540 dev_err(np->device, "%s: Transmit timed out, resetting\n", in niu_tx_timeout()
6543 schedule_work(&np->reset_task); in niu_tx_timeout()
6626 struct niu *np = netdev_priv(dev); in niu_start_xmit() local
6637 rp = &np->tx_rings[i]; in niu_start_xmit()
6642 dev_err(np->device, "%s: BUG! Tx ring full when queue awake!\n", dev->name); in niu_start_xmit()
6673 mapping = np->ops->map_single(np->device, skb->data, in niu_start_xmit()
6713 mapping = np->ops->map_page(np->device, skb_frag_page(frag), in niu_start_xmit()
6748 struct niu *np = netdev_priv(dev); in niu_change_mtu() local
6760 niu_full_shutdown(np, dev); in niu_change_mtu()
6762 niu_free_channels(np); in niu_change_mtu()
6764 niu_enable_napi(np); in niu_change_mtu()
6766 err = niu_alloc_channels(np); in niu_change_mtu()
6770 spin_lock_irq(&np->lock); in niu_change_mtu()
6772 err = niu_init_hw(np); in niu_change_mtu()
6774 timer_setup(&np->timer, niu_timer, 0); in niu_change_mtu()
6775 np->timer.expires = jiffies + HZ; in niu_change_mtu()
6777 err = niu_enable_interrupts(np, 1); in niu_change_mtu()
6779 niu_stop_hw(np); in niu_change_mtu()
6782 spin_unlock_irq(&np->lock); in niu_change_mtu()
6786 if (np->link_config.loopback_mode != LOOPBACK_DISABLED) in niu_change_mtu()
6789 add_timer(&np->timer); in niu_change_mtu()
6798 struct niu *np = netdev_priv(dev); in niu_get_drvinfo() local
6799 struct niu_vpd *vpd = &np->vpd; in niu_get_drvinfo()
6805 if (np->parent->plat_type != PLAT_TYPE_NIU) in niu_get_drvinfo()
6806 strscpy(info->bus_info, pci_name(np->pdev), in niu_get_drvinfo()
6813 struct niu *np = netdev_priv(dev); in niu_get_link_ksettings() local
6816 lp = &np->link_config; in niu_get_link_ksettings()
6819 cmd->base.phy_address = np->phy_addr; in niu_get_link_ksettings()
6827 cmd->base.port = (np->flags & NIU_FLAGS_FIBER) ? PORT_FIBRE : PORT_TP; in niu_get_link_ksettings()
6835 struct niu *np = netdev_priv(dev); in niu_set_link_ksettings() local
6836 struct niu_link_config *lp = &np->link_config; in niu_set_link_ksettings()
6843 return niu_init_link(np); in niu_set_link_ksettings()
6848 struct niu *np = netdev_priv(dev); in niu_get_msglevel() local
6849 return np->msg_enable; in niu_get_msglevel()
6854 struct niu *np = netdev_priv(dev); in niu_set_msglevel() local
6855 np->msg_enable = value; in niu_set_msglevel()
6860 struct niu *np = netdev_priv(dev); in niu_nway_reset() local
6862 if (np->link_config.autoneg) in niu_nway_reset()
6863 return niu_init_link(np); in niu_nway_reset()
6870 struct niu *np = netdev_priv(dev); in niu_get_eeprom_len() local
6872 return np->eeprom_len; in niu_get_eeprom_len()
6878 struct niu *np = netdev_priv(dev); in niu_get_eeprom() local
6886 if (offset >= np->eeprom_len) in niu_get_eeprom()
6888 if (offset + len > np->eeprom_len) in niu_get_eeprom()
6889 len = eeprom->len = np->eeprom_len - offset; in niu_get_eeprom()
7074 static int niu_get_hash_opts(struct niu *np, struct ethtool_rxnfc *nfc) in niu_get_hash_opts() argument
7083 if (np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] & in niu_get_hash_opts()
7087 nfc->data = niu_flowkey_to_ethflow(np->parent->flow_key[class - in niu_get_hash_opts()
7168 static int niu_get_ethtool_tcam_entry(struct niu *np, in niu_get_ethtool_tcam_entry() argument
7171 struct niu_parent *parent = np->parent; in niu_get_ethtool_tcam_entry()
7178 idx = tcam_get_index(np, (u16)nfc->fs.location); in niu_get_ethtool_tcam_entry()
7182 netdev_info(np->dev, "niu%d: entry [%d] invalid for idx[%d]\n", in niu_get_ethtool_tcam_entry()
7192 netdev_info(np->dev, "niu%d: niu_class_to_ethflow failed\n", in niu_get_ethtool_tcam_entry()
7242 nfc->data = tcam_get_size(np); in niu_get_ethtool_tcam_entry()
7247 static int niu_get_ethtool_tcam_all(struct niu *np, in niu_get_ethtool_tcam_all() argument
7251 struct niu_parent *parent = np->parent; in niu_get_ethtool_tcam_all()
7258 nfc->data = tcam_get_size(np); in niu_get_ethtool_tcam_all()
7260 niu_lock_parent(np, flags); in niu_get_ethtool_tcam_all()
7262 idx = tcam_get_index(np, i); in niu_get_ethtool_tcam_all()
7273 niu_unlock_parent(np, flags); in niu_get_ethtool_tcam_all()
7283 struct niu *np = netdev_priv(dev); in niu_get_nfc() local
7288 ret = niu_get_hash_opts(np, cmd); in niu_get_nfc()
7291 cmd->data = np->num_rx_rings; in niu_get_nfc()
7294 cmd->rule_cnt = tcam_get_valid_entry_cnt(np); in niu_get_nfc()
7297 ret = niu_get_ethtool_tcam_entry(np, cmd); in niu_get_nfc()
7300 ret = niu_get_ethtool_tcam_all(np, cmd, rule_locs); in niu_get_nfc()
7310 static int niu_set_hash_opts(struct niu *np, struct ethtool_rxnfc *nfc) in niu_set_hash_opts() argument
7324 niu_lock_parent(np, flags); in niu_set_hash_opts()
7325 flow_key = np->parent->tcam_key[class - in niu_set_hash_opts()
7329 np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] = flow_key; in niu_set_hash_opts()
7330 niu_unlock_parent(np, flags); in niu_set_hash_opts()
7334 if (np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] & in niu_set_hash_opts()
7336 niu_lock_parent(np, flags); in niu_set_hash_opts()
7337 flow_key = np->parent->tcam_key[class - in niu_set_hash_opts()
7342 np->parent->tcam_key[class - CLASS_CODE_USER_PROG1] = in niu_set_hash_opts()
7344 niu_unlock_parent(np, flags); in niu_set_hash_opts()
7351 niu_lock_parent(np, flags); in niu_set_hash_opts()
7353 np->parent->flow_key[class - CLASS_CODE_USER_PROG1] = flow_key; in niu_set_hash_opts()
7354 niu_unlock_parent(np, flags); in niu_set_hash_opts()
7427 static int niu_add_ethtool_tcam_entry(struct niu *np, in niu_add_ethtool_tcam_entry() argument
7430 struct niu_parent *parent = np->parent; in niu_add_ethtool_tcam_entry()
7433 struct niu_rdc_tables *rdc_table = &parent->rdc_group_cfg[np->port]; in niu_add_ethtool_tcam_entry()
7443 if (idx >= tcam_get_size(np)) in niu_add_ethtool_tcam_entry()
7455 niu_lock_parent(np, flags); in niu_add_ethtool_tcam_entry()
7484 ret = tcam_user_ip_class_set(np, class, 0, in niu_add_ethtool_tcam_entry()
7491 ret = tcam_user_ip_class_enable(np, class, 1); in niu_add_ethtool_tcam_entry()
7502 netdev_info(np->dev, "niu%d: %s(): Could not find/insert class for pid %d\n", in niu_add_ethtool_tcam_entry()
7507 niu_unlock_parent(np, flags); in niu_add_ethtool_tcam_entry()
7514 niu_lock_parent(np, flags); in niu_add_ethtool_tcam_entry()
7516 idx = tcam_get_index(np, idx); in niu_add_ethtool_tcam_entry()
7536 netdev_info(np->dev, "niu%d: In %s(): flow %d for IPv6 not implemented\n", in niu_add_ethtool_tcam_entry()
7544 netdev_info(np->dev, "niu%d: In %s(): Unknown flow type %d\n", in niu_add_ethtool_tcam_entry()
7554 if (fsp->ring_cookie >= np->num_rx_rings) { in niu_add_ethtool_tcam_entry()
7555 netdev_info(np->dev, "niu%d: In %s(): Invalid RX ring %lld\n", in niu_add_ethtool_tcam_entry()
7566 err = tcam_write(np, idx, tp->key, tp->key_mask); in niu_add_ethtool_tcam_entry()
7571 err = tcam_assoc_write(np, idx, tp->assoc_data); in niu_add_ethtool_tcam_entry()
7579 np->clas.tcam_valid_entries++; in niu_add_ethtool_tcam_entry()
7581 niu_unlock_parent(np, flags); in niu_add_ethtool_tcam_entry()
7586 static int niu_del_ethtool_tcam_entry(struct niu *np, u32 loc) in niu_del_ethtool_tcam_entry() argument
7588 struct niu_parent *parent = np->parent; in niu_del_ethtool_tcam_entry()
7595 if (loc >= tcam_get_size(np)) in niu_del_ethtool_tcam_entry()
7598 niu_lock_parent(np, flags); in niu_del_ethtool_tcam_entry()
7600 idx = tcam_get_index(np, loc); in niu_del_ethtool_tcam_entry()
7614 ret = tcam_user_ip_class_enable(np, in niu_del_ethtool_tcam_entry()
7626 netdev_info(np->dev, "niu%d: In %s(): Usr class 0x%llx not found\n", in niu_del_ethtool_tcam_entry()
7634 ret = tcam_flush(np, idx); in niu_del_ethtool_tcam_entry()
7640 np->clas.tcam_valid_entries--; in niu_del_ethtool_tcam_entry()
7642 niu_unlock_parent(np, flags); in niu_del_ethtool_tcam_entry()
7649 struct niu *np = netdev_priv(dev); in niu_set_nfc() local
7654 ret = niu_set_hash_opts(np, cmd); in niu_set_nfc()
7657 ret = niu_add_ethtool_tcam_entry(np, cmd); in niu_set_nfc()
7660 ret = niu_del_ethtool_tcam_entry(np, cmd->fs.location); in niu_set_nfc()
7750 struct niu *np = netdev_priv(dev); in niu_get_strings() local
7756 if (np->flags & NIU_FLAGS_XMAC) { in niu_get_strings()
7765 for (i = 0; i < np->num_rx_rings; i++) { in niu_get_strings()
7770 for (i = 0; i < np->num_tx_rings; i++) { in niu_get_strings()
7779 struct niu *np = netdev_priv(dev); in niu_get_sset_count() local
7784 return (np->flags & NIU_FLAGS_XMAC ? in niu_get_sset_count()
7787 (np->num_rx_rings * NUM_RXCHAN_STAT_KEYS) + in niu_get_sset_count()
7788 (np->num_tx_rings * NUM_TXCHAN_STAT_KEYS); in niu_get_sset_count()
7794 struct niu *np = netdev_priv(dev); in niu_get_ethtool_stats() local
7797 niu_sync_mac_stats(np); in niu_get_ethtool_stats()
7798 if (np->flags & NIU_FLAGS_XMAC) { in niu_get_ethtool_stats()
7799 memcpy(data, &np->mac_stats.xmac, in niu_get_ethtool_stats()
7803 memcpy(data, &np->mac_stats.bmac, in niu_get_ethtool_stats()
7807 for (i = 0; i < np->num_rx_rings; i++) { in niu_get_ethtool_stats()
7808 struct rx_ring_info *rp = &np->rx_rings[i]; in niu_get_ethtool_stats()
7810 niu_sync_rx_discard_stats(np, rp, 0); in niu_get_ethtool_stats()
7819 for (i = 0; i < np->num_tx_rings; i++) { in niu_get_ethtool_stats()
7820 struct tx_ring_info *rp = &np->tx_rings[i]; in niu_get_ethtool_stats()
7830 static u64 niu_led_state_save(struct niu *np) in niu_led_state_save() argument
7832 if (np->flags & NIU_FLAGS_XMAC) in niu_led_state_save()
7838 static void niu_led_state_restore(struct niu *np, u64 val) in niu_led_state_restore() argument
7840 if (np->flags & NIU_FLAGS_XMAC) in niu_led_state_restore()
7846 static void niu_force_led(struct niu *np, int on) in niu_force_led() argument
7850 if (np->flags & NIU_FLAGS_XMAC) { in niu_force_led()
7870 struct niu *np = netdev_priv(dev); in niu_set_phys_id() local
7877 np->orig_led_state = niu_led_state_save(np); in niu_set_phys_id()
7881 niu_force_led(np, 1); in niu_set_phys_id()
7885 niu_force_led(np, 0); in niu_set_phys_id()
7889 niu_led_state_restore(np, np->orig_led_state); in niu_set_phys_id()
7913 static int niu_ldg_assign_ldn(struct niu *np, struct niu_parent *parent, in niu_ldg_assign_ldn() argument
7923 if (np->parent->plat_type == PLAT_TYPE_NIU) { in niu_ldg_assign_ldn()
7930 dev_err(np->device, "Port %u, mismatched LDG assignment for ldn %d, should be %d is %llu\n", in niu_ldg_assign_ldn()
7931 np->port, ldn, ldg, in niu_ldg_assign_ldn()
7941 static int niu_set_ldg_timer_res(struct niu *np, int res) in niu_set_ldg_timer_res() argument
7952 static int niu_set_ldg_sid(struct niu *np, int ldg, int func, int vector) in niu_set_ldg_sid() argument
7964 static int niu_pci_eeprom_read(struct niu *np, u32 addr) in niu_pci_eeprom_read() argument
7983 dev_err(np->device, "EEPROM read timeout frame[%llx]\n", in niu_pci_eeprom_read()
7998 dev_err(np->device, "EEPROM read timeout frame[%llx]\n", in niu_pci_eeprom_read()
8007 static int niu_pci_eeprom_read16(struct niu *np, u32 off) in niu_pci_eeprom_read16() argument
8009 int err = niu_pci_eeprom_read(np, off); in niu_pci_eeprom_read16()
8015 err = niu_pci_eeprom_read(np, off + 1); in niu_pci_eeprom_read16()
8023 static int niu_pci_eeprom_read16_swp(struct niu *np, u32 off) in niu_pci_eeprom_read16_swp() argument
8025 int err = niu_pci_eeprom_read(np, off); in niu_pci_eeprom_read16_swp()
8032 err = niu_pci_eeprom_read(np, off + 1); in niu_pci_eeprom_read16_swp()
8041 static int niu_pci_vpd_get_propname(struct niu *np, u32 off, char *namebuf, in niu_pci_vpd_get_propname() argument
8047 int err = niu_pci_eeprom_read(np, off + i); in niu_pci_vpd_get_propname()
8060 static void niu_vpd_parse_version(struct niu *np) in niu_vpd_parse_version() argument
8062 struct niu_vpd *vpd = &np->vpd; in niu_vpd_parse_version()
8077 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_vpd_parse_version()
8083 np->flags |= NIU_FLAGS_VPD_VALID; in niu_vpd_parse_version()
8087 static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end) in niu_pci_vpd_scan_props() argument
8098 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_vpd_scan_props()
8107 niu_vpd_parse_version(np); in niu_pci_vpd_scan_props()
8111 err = niu_pci_eeprom_read(np, start + 2); in niu_pci_vpd_scan_props()
8117 prop_len = niu_pci_eeprom_read(np, start + 4); in niu_pci_vpd_scan_props()
8120 err = niu_pci_vpd_get_propname(np, start + 5, namebuf, 64); in niu_pci_vpd_scan_props()
8127 prop_buf = np->vpd.model; in niu_pci_vpd_scan_props()
8131 prop_buf = np->vpd.board_model; in niu_pci_vpd_scan_props()
8135 prop_buf = np->vpd.version; in niu_pci_vpd_scan_props()
8139 prop_buf = np->vpd.local_mac; in niu_pci_vpd_scan_props()
8143 prop_buf = &np->vpd.mac_num; in niu_pci_vpd_scan_props()
8147 prop_buf = np->vpd.phy_type; in niu_pci_vpd_scan_props()
8153 dev_err(np->device, "Property '%s' length (%d) is too long\n", namebuf, prop_len); in niu_pci_vpd_scan_props()
8161 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_vpd_scan_props()
8165 err = niu_pci_eeprom_read(np, off + i); in niu_pci_vpd_scan_props()
8179 static int niu_pci_vpd_fetch(struct niu *np, u32 start) in niu_pci_vpd_fetch() argument
8184 err = niu_pci_eeprom_read16_swp(np, start + 1); in niu_pci_vpd_fetch()
8194 err = niu_pci_eeprom_read(np, here); in niu_pci_vpd_fetch()
8200 err = niu_pci_eeprom_read16_swp(np, here + 1); in niu_pci_vpd_fetch()
8209 err = niu_pci_vpd_scan_props(np, here, end); in niu_pci_vpd_fetch()
8220 static u32 niu_pci_vpd_offset(struct niu *np) in niu_pci_vpd_offset() argument
8229 err = niu_pci_eeprom_read16(np, start + 0); in niu_pci_vpd_offset()
8234 err = niu_pci_eeprom_read16(np, start + 23); in niu_pci_vpd_offset()
8240 err = niu_pci_eeprom_read16(np, start + 0); in niu_pci_vpd_offset()
8243 err = niu_pci_eeprom_read16(np, start + 2); in niu_pci_vpd_offset()
8248 err = niu_pci_eeprom_read(np, start + 20); in niu_pci_vpd_offset()
8252 err = niu_pci_eeprom_read(np, ret + 2); in niu_pci_vpd_offset()
8260 err = niu_pci_eeprom_read16_swp(np, start + 8); in niu_pci_vpd_offset()
8265 err = niu_pci_eeprom_read(np, ret + 0); in niu_pci_vpd_offset()
8275 static int niu_phy_type_prop_decode(struct niu *np, const char *phy_prop) in niu_phy_type_prop_decode() argument
8279 np->flags &= ~(NIU_FLAGS_FIBER | in niu_phy_type_prop_decode()
8281 np->mac_xcvr = MAC_XCVR_MII; in niu_phy_type_prop_decode()
8284 np->flags |= (NIU_FLAGS_10G | in niu_phy_type_prop_decode()
8286 np->mac_xcvr = MAC_XCVR_XPCS; in niu_phy_type_prop_decode()
8289 np->flags &= ~NIU_FLAGS_10G; in niu_phy_type_prop_decode()
8290 np->flags |= NIU_FLAGS_FIBER; in niu_phy_type_prop_decode()
8291 np->mac_xcvr = MAC_XCVR_PCS; in niu_phy_type_prop_decode()
8294 np->flags |= NIU_FLAGS_10G; in niu_phy_type_prop_decode()
8295 np->flags &= ~NIU_FLAGS_FIBER; in niu_phy_type_prop_decode()
8296 np->mac_xcvr = MAC_XCVR_XPCS; in niu_phy_type_prop_decode()
8299 np->flags |= NIU_FLAGS_10G; in niu_phy_type_prop_decode()
8300 np->flags &= ~NIU_FLAGS_FIBER; in niu_phy_type_prop_decode()
8301 np->flags |= NIU_FLAGS_XCVR_SERDES; in niu_phy_type_prop_decode()
8302 np->mac_xcvr = MAC_XCVR_XPCS; in niu_phy_type_prop_decode()
8309 static int niu_pci_vpd_get_nports(struct niu *np) in niu_pci_vpd_get_nports() argument
8313 if ((!strcmp(np->vpd.model, NIU_QGC_LP_MDL_STR)) || in niu_pci_vpd_get_nports()
8314 (!strcmp(np->vpd.model, NIU_QGC_PEM_MDL_STR)) || in niu_pci_vpd_get_nports()
8315 (!strcmp(np->vpd.model, NIU_MARAMBA_MDL_STR)) || in niu_pci_vpd_get_nports()
8316 (!strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) || in niu_pci_vpd_get_nports()
8317 (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR))) { in niu_pci_vpd_get_nports()
8319 } else if ((!strcmp(np->vpd.model, NIU_2XGF_LP_MDL_STR)) || in niu_pci_vpd_get_nports()
8320 (!strcmp(np->vpd.model, NIU_2XGF_PEM_MDL_STR)) || in niu_pci_vpd_get_nports()
8321 (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) || in niu_pci_vpd_get_nports()
8322 (!strcmp(np->vpd.model, NIU_2XGF_MRVL_MDL_STR))) { in niu_pci_vpd_get_nports()
8329 static void niu_pci_vpd_validate(struct niu *np) in niu_pci_vpd_validate() argument
8331 struct net_device *dev = np->dev; in niu_pci_vpd_validate()
8332 struct niu_vpd *vpd = &np->vpd; in niu_pci_vpd_validate()
8337 dev_err(np->device, "VPD MAC invalid, falling back to SPROM\n"); in niu_pci_vpd_validate()
8339 np->flags &= ~NIU_FLAGS_VPD_VALID; in niu_pci_vpd_validate()
8343 if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) || in niu_pci_vpd_validate()
8344 !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) { in niu_pci_vpd_validate()
8345 np->flags |= NIU_FLAGS_10G; in niu_pci_vpd_validate()
8346 np->flags &= ~NIU_FLAGS_FIBER; in niu_pci_vpd_validate()
8347 np->flags |= NIU_FLAGS_XCVR_SERDES; in niu_pci_vpd_validate()
8348 np->mac_xcvr = MAC_XCVR_PCS; in niu_pci_vpd_validate()
8349 if (np->port > 1) { in niu_pci_vpd_validate()
8350 np->flags |= NIU_FLAGS_FIBER; in niu_pci_vpd_validate()
8351 np->flags &= ~NIU_FLAGS_10G; in niu_pci_vpd_validate()
8353 if (np->flags & NIU_FLAGS_10G) in niu_pci_vpd_validate()
8354 np->mac_xcvr = MAC_XCVR_XPCS; in niu_pci_vpd_validate()
8355 } else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) { in niu_pci_vpd_validate()
8356 np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER | in niu_pci_vpd_validate()
8358 } else if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) { in niu_pci_vpd_validate()
8359 dev_err(np->device, "Illegal phy string [%s]\n", in niu_pci_vpd_validate()
8360 np->vpd.phy_type); in niu_pci_vpd_validate()
8361 dev_err(np->device, "Falling back to SPROM\n"); in niu_pci_vpd_validate()
8362 np->flags &= ~NIU_FLAGS_VPD_VALID; in niu_pci_vpd_validate()
8369 addr[5] += np->port; in niu_pci_vpd_validate()
8376 static int niu_pci_probe_sprom(struct niu *np) in niu_pci_probe_sprom() argument
8378 struct net_device *dev = np->dev; in niu_pci_probe_sprom()
8388 np->eeprom_len = len; in niu_pci_probe_sprom()
8390 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8401 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8404 dev_err(np->device, "Bad SPROM checksum (%x, should be 0xab)\n", (int)(sum & 0xff)); in niu_pci_probe_sprom()
8409 switch (np->port) { in niu_pci_probe_sprom()
8427 dev_err(np->device, "Bogus port number %u\n", in niu_pci_probe_sprom()
8428 np->port); in niu_pci_probe_sprom()
8431 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8437 np->flags &= ~(NIU_FLAGS_FIBER | in niu_pci_probe_sprom()
8439 np->mac_xcvr = MAC_XCVR_MII; in niu_pci_probe_sprom()
8444 np->flags &= ~NIU_FLAGS_10G; in niu_pci_probe_sprom()
8445 np->flags |= NIU_FLAGS_FIBER; in niu_pci_probe_sprom()
8446 np->mac_xcvr = MAC_XCVR_PCS; in niu_pci_probe_sprom()
8451 np->flags |= NIU_FLAGS_10G; in niu_pci_probe_sprom()
8452 np->flags &= ~NIU_FLAGS_FIBER; in niu_pci_probe_sprom()
8453 np->mac_xcvr = MAC_XCVR_XPCS; in niu_pci_probe_sprom()
8458 np->flags |= (NIU_FLAGS_10G | in niu_pci_probe_sprom()
8460 np->mac_xcvr = MAC_XCVR_XPCS; in niu_pci_probe_sprom()
8464 dev_err(np->device, "Bogus SPROM phy type %u\n", val8); in niu_pci_probe_sprom()
8469 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8477 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8483 dev_err(np->device, "SPROM MAC address invalid [ %pM ]\n", in niu_pci_probe_sprom()
8489 addr[5] += np->port; in niu_pci_probe_sprom()
8496 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8504 np->vpd.model[i + 3] = (tmp >> 0) & 0xff; in niu_pci_probe_sprom()
8505 np->vpd.model[i + 2] = (tmp >> 8) & 0xff; in niu_pci_probe_sprom()
8506 np->vpd.model[i + 1] = (tmp >> 16) & 0xff; in niu_pci_probe_sprom()
8507 np->vpd.model[i + 0] = (tmp >> 24) & 0xff; in niu_pci_probe_sprom()
8509 np->vpd.model[val] = '\0'; in niu_pci_probe_sprom()
8512 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8520 np->vpd.board_model[i + 3] = (tmp >> 0) & 0xff; in niu_pci_probe_sprom()
8521 np->vpd.board_model[i + 2] = (tmp >> 8) & 0xff; in niu_pci_probe_sprom()
8522 np->vpd.board_model[i + 1] = (tmp >> 16) & 0xff; in niu_pci_probe_sprom()
8523 np->vpd.board_model[i + 0] = (tmp >> 24) & 0xff; in niu_pci_probe_sprom()
8525 np->vpd.board_model[val] = '\0'; in niu_pci_probe_sprom()
8527 np->vpd.mac_num = in niu_pci_probe_sprom()
8529 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_pci_probe_sprom()
8530 "SPROM: NUM_PORTS_MACS[%d]\n", np->vpd.mac_num); in niu_pci_probe_sprom()
8535 static int niu_get_and_validate_port(struct niu *np) in niu_get_and_validate_port() argument
8537 struct niu_parent *parent = np->parent; in niu_get_and_validate_port()
8539 if (np->port <= 1) in niu_get_and_validate_port()
8540 np->flags |= NIU_FLAGS_XMAC; in niu_get_and_validate_port()
8546 parent->num_ports = niu_pci_vpd_get_nports(np); in niu_get_and_validate_port()
8563 if (np->port >= parent->num_ports) in niu_get_and_validate_port()
8771 static int fill_phy_probe_info(struct niu *np, struct niu_parent *parent, in fill_phy_probe_info() argument
8780 niu_lock_parent(np, flags); in fill_phy_probe_info()
8785 dev_id_1 = mdio_read(np, port, in fill_phy_probe_info()
8787 dev_id_2 = mdio_read(np, port, in fill_phy_probe_info()
8793 dev_id_1 = mdio_read(np, port, in fill_phy_probe_info()
8795 dev_id_2 = mdio_read(np, port, in fill_phy_probe_info()
8801 dev_id_1 = mii_read(np, port, MII_PHYSID1); in fill_phy_probe_info()
8802 dev_id_2 = mii_read(np, port, MII_PHYSID2); in fill_phy_probe_info()
8808 niu_unlock_parent(np, flags); in fill_phy_probe_info()
8813 static int walk_phys(struct niu *np, struct niu_parent *parent) in walk_phys() argument
8823 if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) || in walk_phys()
8824 !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) { in walk_phys()
8833 } else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) { in walk_phys()
8839 } else if ((np->flags & NIU_FLAGS_XCVR_SERDES) && in walk_phys()
8842 if (np->flags & NIU_FLAGS_10G) { in walk_phys()
8850 err = fill_phy_probe_info(np, parent, info); in walk_phys()
8880 val = phy_encode(PORT_TYPE_10G, np->port); in walk_phys()
8942 static int niu_probe_ports(struct niu *np) in niu_probe_ports() argument
8944 struct niu_parent *parent = np->parent; in niu_probe_ports()
8948 err = walk_phys(np, parent); in niu_probe_ports()
8952 niu_set_ldg_timer_res(np, 2); in niu_probe_ports()
8954 niu_ldn_irq_enable(np, i, 0); in niu_probe_ports()
8963 static int niu_classifier_swstate_init(struct niu *np) in niu_classifier_swstate_init() argument
8965 struct niu_classifier *cp = &np->clas; in niu_classifier_swstate_init()
8967 cp->tcam_top = (u16) np->port; in niu_classifier_swstate_init()
8968 cp->tcam_sz = np->parent->tcam_num_entries / np->parent->num_ports; in niu_classifier_swstate_init()
8972 return fflp_early_init(np); in niu_classifier_swstate_init()
8975 static void niu_link_config_init(struct niu *np) in niu_link_config_init() argument
8977 struct niu_link_config *lp = &np->link_config; in niu_link_config_init()
9000 static int niu_init_mac_ipp_pcs_base(struct niu *np) in niu_init_mac_ipp_pcs_base() argument
9002 switch (np->port) { in niu_init_mac_ipp_pcs_base()
9004 np->mac_regs = np->regs + XMAC_PORT0_OFF; in niu_init_mac_ipp_pcs_base()
9005 np->ipp_off = 0x00000; in niu_init_mac_ipp_pcs_base()
9006 np->pcs_off = 0x04000; in niu_init_mac_ipp_pcs_base()
9007 np->xpcs_off = 0x02000; in niu_init_mac_ipp_pcs_base()
9011 np->mac_regs = np->regs + XMAC_PORT1_OFF; in niu_init_mac_ipp_pcs_base()
9012 np->ipp_off = 0x08000; in niu_init_mac_ipp_pcs_base()
9013 np->pcs_off = 0x0a000; in niu_init_mac_ipp_pcs_base()
9014 np->xpcs_off = 0x08000; in niu_init_mac_ipp_pcs_base()
9018 np->mac_regs = np->regs + BMAC_PORT2_OFF; in niu_init_mac_ipp_pcs_base()
9019 np->ipp_off = 0x04000; in niu_init_mac_ipp_pcs_base()
9020 np->pcs_off = 0x0e000; in niu_init_mac_ipp_pcs_base()
9021 np->xpcs_off = ~0UL; in niu_init_mac_ipp_pcs_base()
9025 np->mac_regs = np->regs + BMAC_PORT3_OFF; in niu_init_mac_ipp_pcs_base()
9026 np->ipp_off = 0x0c000; in niu_init_mac_ipp_pcs_base()
9027 np->pcs_off = 0x12000; in niu_init_mac_ipp_pcs_base()
9028 np->xpcs_off = ~0UL; in niu_init_mac_ipp_pcs_base()
9032 dev_err(np->device, "Port %u is invalid, cannot compute MAC block offset\n", np->port); in niu_init_mac_ipp_pcs_base()
9039 static void niu_try_msix(struct niu *np, u8 *ldg_num_map) in niu_try_msix() argument
9042 struct niu_parent *parent = np->parent; in niu_try_msix()
9043 struct pci_dev *pdev = np->pdev; in niu_try_msix()
9047 first_ldg = (NIU_NUM_LDG / parent->num_ports) * np->port; in niu_try_msix()
9051 num_irqs = (parent->rxchan_per_port[np->port] + in niu_try_msix()
9052 parent->txchan_per_port[np->port] + in niu_try_msix()
9053 (np->port == 0 ? 3 : 1)); in niu_try_msix()
9063 np->flags &= ~NIU_FLAGS_MSIX; in niu_try_msix()
9067 np->flags |= NIU_FLAGS_MSIX; in niu_try_msix()
9069 np->ldg[i].irq = msi_vec[i].vector; in niu_try_msix()
9070 np->num_ldg = num_irqs; in niu_try_msix()
9073 static int niu_n2_irq_init(struct niu *np, u8 *ldg_num_map) in niu_n2_irq_init() argument
9076 struct platform_device *op = np->op; in niu_n2_irq_init()
9086 np->ldg[i].irq = op->archdata.irqs[i]; in niu_n2_irq_init()
9089 np->num_ldg = op->archdata.num_irqs; in niu_n2_irq_init()
9097 static int niu_ldg_init(struct niu *np) in niu_ldg_init() argument
9099 struct niu_parent *parent = np->parent; in niu_ldg_init()
9105 np->num_ldg = 1; in niu_ldg_init()
9106 np->ldg[0].irq = np->dev->irq; in niu_ldg_init()
9108 err = niu_n2_irq_init(np, ldg_num_map); in niu_ldg_init()
9112 niu_try_msix(np, ldg_num_map); in niu_ldg_init()
9114 port = np->port; in niu_ldg_init()
9115 for (i = 0; i < np->num_ldg; i++) { in niu_ldg_init()
9116 struct niu_ldg *lp = &np->ldg[i]; in niu_ldg_init()
9118 netif_napi_add(np->dev, &lp->napi, niu_poll); in niu_ldg_init()
9120 lp->np = np; in niu_ldg_init()
9128 if (np->parent->plat_type != PLAT_TYPE_NIU) { in niu_ldg_init()
9129 err = niu_set_ldg_sid(np, lp->ldg_num, port, i); in niu_ldg_init()
9148 err = niu_ldg_assign_ldn(np, parent, ldg_num_map[ldg_rotor], in niu_ldg_init()
9154 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9158 err = niu_ldg_assign_ldn(np, parent, in niu_ldg_init()
9165 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9168 err = niu_ldg_assign_ldn(np, parent, in niu_ldg_init()
9175 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9186 err = niu_ldg_assign_ldn(np, parent, in niu_ldg_init()
9192 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9201 err = niu_ldg_assign_ldn(np, parent, in niu_ldg_init()
9207 if (ldg_rotor == np->num_ldg) in niu_ldg_init()
9214 static void niu_ldg_free(struct niu *np) in niu_ldg_free() argument
9216 if (np->flags & NIU_FLAGS_MSIX) in niu_ldg_free()
9217 pci_disable_msix(np->pdev); in niu_ldg_free()
9220 static int niu_get_of_props(struct niu *np) in niu_get_of_props() argument
9223 struct net_device *dev = np->dev; in niu_get_of_props()
9230 if (np->parent->plat_type == PLAT_TYPE_NIU) in niu_get_of_props()
9231 dp = np->op->dev.of_node; in niu_get_of_props()
9233 dp = pci_device_to_OF_node(np->pdev); in niu_get_of_props()
9244 strcpy(np->vpd.phy_type, phy_type); in niu_get_of_props()
9246 if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) { in niu_get_of_props()
9248 dp, np->vpd.phy_type); in niu_get_of_props()
9272 strcpy(np->vpd.model, model); in niu_get_of_props()
9275 np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER | in niu_get_of_props()
9285 static int niu_get_invariants(struct niu *np) in niu_get_invariants() argument
9290 err = niu_get_of_props(np); in niu_get_invariants()
9296 err = niu_init_mac_ipp_pcs_base(np); in niu_get_invariants()
9301 err = niu_get_and_validate_port(np); in niu_get_invariants()
9306 if (np->parent->plat_type == PLAT_TYPE_NIU) in niu_get_invariants()
9310 offset = niu_pci_vpd_offset(np); in niu_get_invariants()
9311 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_get_invariants()
9314 err = niu_pci_vpd_fetch(np, offset); in niu_get_invariants()
9320 if (np->flags & NIU_FLAGS_VPD_VALID) { in niu_get_invariants()
9321 niu_pci_vpd_validate(np); in niu_get_invariants()
9322 err = niu_get_and_validate_port(np); in niu_get_invariants()
9327 if (!(np->flags & NIU_FLAGS_VPD_VALID)) { in niu_get_invariants()
9328 err = niu_get_and_validate_port(np); in niu_get_invariants()
9331 err = niu_pci_probe_sprom(np); in niu_get_invariants()
9337 err = niu_probe_ports(np); in niu_get_invariants()
9341 niu_ldg_init(np); in niu_get_invariants()
9343 niu_classifier_swstate_init(np); in niu_get_invariants()
9344 niu_link_config_init(np); in niu_get_invariants()
9346 err = niu_determine_phy_disposition(np); in niu_get_invariants()
9348 err = niu_init_link(np); in niu_get_invariants()
9467 static struct niu_parent *niu_new_parent(struct niu *np, in niu_new_parent() argument
9531 static struct niu_parent *niu_get_parent(struct niu *np, in niu_get_parent() argument
9535 int port = np->port; in niu_get_parent()
9546 p = niu_new_parent(np, id, ptype); in niu_get_parent()
9554 &np->device->kobj, in niu_get_parent()
9557 p->ports[port] = np; in niu_get_parent()
9566 static void niu_put_parent(struct niu *np) in niu_put_parent() argument
9568 struct niu_parent *p = np->parent; in niu_put_parent()
9569 u8 port = np->port; in niu_put_parent()
9572 BUG_ON(!p || p->ports[port] != np); in niu_put_parent()
9574 netif_printk(np, probe, KERN_DEBUG, np->dev, in niu_put_parent()
9584 np->parent = NULL; in niu_put_parent()
9662 struct niu *np; in niu_alloc_and_init() local
9670 np = netdev_priv(dev); in niu_alloc_and_init()
9671 np->dev = dev; in niu_alloc_and_init()
9672 np->pdev = pdev; in niu_alloc_and_init()
9673 np->op = op; in niu_alloc_and_init()
9674 np->device = gen_dev; in niu_alloc_and_init()
9675 np->ops = ops; in niu_alloc_and_init()
9677 np->msg_enable = niu_debug; in niu_alloc_and_init()
9679 spin_lock_init(&np->lock); in niu_alloc_and_init()
9680 INIT_WORK(&np->reset_task, niu_reset_task); in niu_alloc_and_init()
9682 np->port = port; in niu_alloc_and_init()
9707 static void niu_device_announce(struct niu *np) in niu_device_announce() argument
9709 struct net_device *dev = np->dev; in niu_device_announce()
9713 if (np->parent->plat_type == PLAT_TYPE_ATCA_CP3220) { in niu_device_announce()
9716 (np->flags & NIU_FLAGS_XMAC ? "XMAC" : "BMAC"), in niu_device_announce()
9717 (np->flags & NIU_FLAGS_10G ? "10G" : "1G"), in niu_device_announce()
9718 (np->flags & NIU_FLAGS_FIBER ? "RGMII FIBER" : "SERDES"), in niu_device_announce()
9719 (np->mac_xcvr == MAC_XCVR_MII ? "MII" : in niu_device_announce()
9720 (np->mac_xcvr == MAC_XCVR_PCS ? "PCS" : "XPCS")), in niu_device_announce()
9721 np->vpd.phy_type); in niu_device_announce()
9725 (np->flags & NIU_FLAGS_XMAC ? "XMAC" : "BMAC"), in niu_device_announce()
9726 (np->flags & NIU_FLAGS_10G ? "10G" : "1G"), in niu_device_announce()
9727 (np->flags & NIU_FLAGS_FIBER ? "FIBER" : in niu_device_announce()
9728 (np->flags & NIU_FLAGS_XCVR_SERDES ? "SERDES" : in niu_device_announce()
9730 (np->mac_xcvr == MAC_XCVR_MII ? "MII" : in niu_device_announce()
9731 (np->mac_xcvr == MAC_XCVR_PCS ? "PCS" : "XPCS")), in niu_device_announce()
9732 np->vpd.phy_type); in niu_device_announce()
9747 struct niu *np; in niu_pci_init_one() local
9783 np = netdev_priv(dev); in niu_pci_init_one()
9790 np->parent = niu_get_parent(np, &parent_id, in niu_pci_init_one()
9792 if (!np->parent) { in niu_pci_init_one()
9818 np->regs = pci_ioremap_bar(pdev, 0); in niu_pci_init_one()
9819 if (!np->regs) { in niu_pci_init_one()
9836 err = niu_get_invariants(np); in niu_pci_init_one()
9851 niu_device_announce(np); in niu_pci_init_one()
9856 if (np->regs) { in niu_pci_init_one()
9857 iounmap(np->regs); in niu_pci_init_one()
9858 np->regs = NULL; in niu_pci_init_one()
9862 niu_put_parent(np); in niu_pci_init_one()
9881 struct niu *np = netdev_priv(dev); in niu_pci_remove_one() local
9884 if (np->regs) { in niu_pci_remove_one()
9885 iounmap(np->regs); in niu_pci_remove_one()
9886 np->regs = NULL; in niu_pci_remove_one()
9889 niu_ldg_free(np); in niu_pci_remove_one()
9891 niu_put_parent(np); in niu_pci_remove_one()
9902 struct niu *np = netdev_priv(dev); in niu_suspend() local
9908 flush_work(&np->reset_task); in niu_suspend()
9909 niu_netif_stop(np); in niu_suspend()
9911 del_timer_sync(&np->timer); in niu_suspend()
9913 spin_lock_irqsave(&np->lock, flags); in niu_suspend()
9914 niu_enable_interrupts(np, 0); in niu_suspend()
9915 spin_unlock_irqrestore(&np->lock, flags); in niu_suspend()
9919 spin_lock_irqsave(&np->lock, flags); in niu_suspend()
9920 niu_stop_hw(np); in niu_suspend()
9921 spin_unlock_irqrestore(&np->lock, flags); in niu_suspend()
9929 struct niu *np = netdev_priv(dev); in niu_resume() local
9938 spin_lock_irqsave(&np->lock, flags); in niu_resume()
9940 err = niu_init_hw(np); in niu_resume()
9942 np->timer.expires = jiffies + HZ; in niu_resume()
9943 add_timer(&np->timer); in niu_resume()
9944 niu_netif_start(np); in niu_resume()
9947 spin_unlock_irqrestore(&np->lock, flags); in niu_resume()
10025 struct niu *np; in niu_of_probe() local
10044 np = netdev_priv(dev); in niu_of_probe()
10049 np->parent = niu_get_parent(np, &parent_id, in niu_of_probe()
10051 if (!np->parent) { in niu_of_probe()
10058 np->regs = of_ioremap(&op->resource[1], 0, in niu_of_probe()
10061 if (!np->regs) { in niu_of_probe()
10067 np->vir_regs_1 = of_ioremap(&op->resource[2], 0, in niu_of_probe()
10070 if (!np->vir_regs_1) { in niu_of_probe()
10076 np->vir_regs_2 = of_ioremap(&op->resource[3], 0, in niu_of_probe()
10079 if (!np->vir_regs_2) { in niu_of_probe()
10087 err = niu_get_invariants(np); in niu_of_probe()
10102 niu_device_announce(np); in niu_of_probe()
10107 if (np->vir_regs_1) { in niu_of_probe()
10108 of_iounmap(&op->resource[2], np->vir_regs_1, in niu_of_probe()
10110 np->vir_regs_1 = NULL; in niu_of_probe()
10113 if (np->vir_regs_2) { in niu_of_probe()
10114 of_iounmap(&op->resource[3], np->vir_regs_2, in niu_of_probe()
10116 np->vir_regs_2 = NULL; in niu_of_probe()
10119 if (np->regs) { in niu_of_probe()
10120 of_iounmap(&op->resource[1], np->regs, in niu_of_probe()
10122 np->regs = NULL; in niu_of_probe()
10126 niu_put_parent(np); in niu_of_probe()
10140 struct niu *np = netdev_priv(dev); in niu_of_remove() local
10144 if (np->vir_regs_1) { in niu_of_remove()
10145 of_iounmap(&op->resource[2], np->vir_regs_1, in niu_of_remove()
10147 np->vir_regs_1 = NULL; in niu_of_remove()
10150 if (np->vir_regs_2) { in niu_of_remove()
10151 of_iounmap(&op->resource[3], np->vir_regs_2, in niu_of_remove()
10153 np->vir_regs_2 = NULL; in niu_of_remove()
10156 if (np->regs) { in niu_of_remove()
10157 of_iounmap(&op->resource[1], np->regs, in niu_of_remove()
10159 np->regs = NULL; in niu_of_remove()
10162 niu_ldg_free(np); in niu_of_remove()
10164 niu_put_parent(np); in niu_of_remove()